ZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvYmFzZS5jIGIvc3RkL3BsYXllci9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5YTZlMQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvYmFzZS5jCkBAIC0wLDAgKzEsNDM1NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9iYXNlLmMgLS0gdGhlIGJhc2ljIHBsYXllciBvYmplY3QKKy8vCisvLyAkSWQ6IGJhc2UuYyA5NDY3IDIwMTYtMDItMTkgMTk6NDg6MjRaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisjaW5jbHVkZSA8cmVnZXhwLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKyNpbmNsdWRlIDxsb2dnaW5nLmg+CisjaW5jbHVkZSA8d2VybGlzdGUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJyb3JkLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW9uZXkuaD4KKworaW5oZXJpdCAiL3N0ZC9ob29rX3Byb3ZpZGVyIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3Jlc3RyaWN0aW9ucyI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9hdHRyaWJ1dGVzIjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL3B1dF9hbmRfZ2V0IjsKK2luaGVyaXQgIi9zdGQvbGl2aW5nL2Nsb3RoaW5nIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvcHJvcGVydGllcyI7Citpbmhlcml0ICIvc3RkL3BsYXllci91dGlsIjsKK2luaGVyaXQgIi9zdGQvdGhpbmcvbGFuZ3VhZ2UiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvdHJhdmVsIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2NvbWJhdCI7Citpbmhlcml0ICIvc3RkL3BsYXllci9kZXNjcmlwdGlvbiI7Citpbmhlcml0ICIvc3RkL3BsYXllci9tb3ZpbmciOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvbGlmZSI7Citpbmhlcml0ICIvc3RkL3BsYXllci9jb21tIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3ZpZXdjbWQiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvbW9uZXloYW5kbGVyIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2NvbW1hbmQiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvc2tpbGxfYXR0cmlidXRlcyI7Citpbmhlcml0ICIvc3RkL2xpdmluZy9saWdodCI7Citpbmhlcml0ICIvc3RkL3BsYXllci9za2lsbHMiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcXVlc3RzIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3BvdGlvbiI7Citpbmhlcml0ICIvc3RkL3BsYXllci9zb3VsIjsKK2luaGVyaXQgIi9zdGQvbW9yZSI7Citpbmhlcml0ICIvc3RkL3VzZXJfZmlsdGVyIjsKK2luaGVyaXQgIi9zZWN1cmUvdGVsbmV0bmVnIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2d1aWRlIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3JlcHV0YXRpb24iOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcHJvdG9jb2xzL2dtY3AiOworaW5oZXJpdCAiL3N0ZC9saXZpbmcvaGVscGVycyI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL3NraWxscy5oPgorI2luY2x1ZGUgPHBsYXllci9nbWNwLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsaXZpbmcuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8dGVybWluYWwuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8cGFnZXIuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9sZXBtYXN0ZXIuaCIKKyNpbmNsdWRlIDxldmVudHMuaD4KKworI3VuZGVmIE5BTUUgLyogREVGSU5FRCBCWSBVRFAuSDsgQkFEIE5BTUUgQ0xBU0ggOiggKi8KKyNkZWZpbmUgTkFNRSh3aG8pIGNhcGl0YWxpemUoZ2V0dWlkKHdobykpCisKK21hcHBpbmcgYXV0b2xvYWQ7ICAgICAgICAgICAvKiBhdXRvbG9hZC1tYXBwaW5nICovCitpbnQgaGNfcGxheTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhdXRvbG9hZF9yZXN0OworcHJpdmF0ZSBub3NhdmUgc3RyaW5nICAqYXV0b2xvYWRfZXJyb3I7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgcmVhbGlwOyAKKworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHBhc3N3OyAgICAgICAgLyogdGVtcG9yYXJpbHkgZm9yIHBhc3N3b3JkIGNoYW5nZSAqLworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHBhc3N3b2xkOyAgICAgLyogdGVtcG9yYXJpbHkgZm9yIHBhc3N3b3JkIGNoYW5nZSAqLworCisvLyBIQi1aYWVobGVyLiBXZW5uIDAgZXJyZWljaHQgd2lyZCwgd2lyZCAgZWluIFRlbG5ldCBUTSBQYWtldCBhbHMgS2VlcC1BbGl2ZQorLy8gYW4gZGVuIENsaWVudCBnZXNlbmRldCB1bmQgZGVyIENvdW50ZXIgd2llZGVyIGF1ZiBob2NoZ2VzZXR6dC4gCisvLyBXZW5uID09IDAsIGlzdCBkYXMgS2VlcC1BbGl2ZSBhYmdlc2NoYWx0ZXQuCitwcml2YXRlIGludCB0ZWxuZXRfdG1fY291bnRlcjsKKworbm9zYXZlIHN0cmluZyBkZWZhdWx0X2hvbWU7IC8qIFdoZXJlIHRvIG1vdmUgdXMgaWYgd2UgZG9udCBoYXZlIGEgaG9tZSBzZXQgKi8KKworbm9zYXZlIGludCBuZGVhZF9sYXN0dGltZTsKK25vc2F2ZSBtaXhlZCBuZGVhZF9sb2NhdGlvbjsKK25vc2F2ZSBzdHJpbmcgbmRlYWRfbF9maWxlbmFtZTsKK25vc2F2ZSBpbnQgbmRlYWRfY3VycmVudGx5Oworbm9zYXZlIGludCBuZGVhZF9uZXh0X2NoZWNrOworbm9zYXZlIG9iamVjdCAqaGJfb2JzOworCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgZGVmYXVsdF9wcmF5X3Jvb207CisKK25vc2F2ZSBtaXhlZCBlbnZfbmRlYWRfaW5mbzsKKworc3RhdGljIGludCBfc2V0X2ludmlzKGludCBhKTsKK3N0YXRpYyBzdHJpbmcgX3NldF90dHkoc3RyaW5nIHN0cik7CitzdGF0aWMgbWl4ZWQgX3NldF9mcmF0ZXJuaXRhc2Rvbm9hcmNobWFnb3J1bShtaXhlZCBhcmcpOworCisKK3N0YXRpYyBzdHJpbmcgYWxfdG9fdGl0bGUoaW50IGEpOworCitzdGF0aWMgdm9pZCBuZGVhZF9yZXZpdmUoKTsKKworc3RhdGljIGludCB3ZWdtZWxkdW5nKHN0cmluZyBwbGF5ZXIpOworCitpbnQgcXVpdCgpOwordm9pZCBzYXZlX21lKG1peGVkIHZhbHVlX2l0ZW1zKTsKK3ZhcmFyZ3MgaW50IHJlbW92ZShtaXhlZCBhcmcpOworbWl4ZWQgUmFjZURlZmF1bHQoc3RyaW5nIGFyZyk7CisKKy8qKiBTZXR6dCBEZWZhdWx0d2VydGUgdm9yIGRlbSBMYWRlbiBkZXMgU2F2ZWZpbGVzLgorICAgIE51ciBkaWUgV2VydGUgYmxlaWJlbiBzcGFldGVyIHVlYnJpZywgZGllIE5JQ0hUIGF1cyBkZW0gU2F2ZWZpbGUgZ2VsYWRlbgorICAgIHdlcmRlbiB1bmQgZGllc2UgaGllciBlcnNldHplbi4KKyAgICBBdXNzZXJkZW0ga2FubiBtYW4gaGllciBuaWNodCBtaXQgZGVuIFdlcnRlbiBhdXMgZGVuIFNhdmVmaWxlcyBhcmJlaXRlbi4KKyAgICBIaWVyenUgbXVzcyBtYW4gdXBkYXRlc19hZnRlcl9yZXN0b3JlKCkgdmVyd2VuZGVuLgorKi8KK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmKFF1ZXJ5UHJvcChQX0xFVkVMKSkgCisgIHsKKyAgICByZXR1cm47IC8vIGRhcmYgbnVyIEVJTk1BTCBnZW1hY2h0IHdlcmRlbgorICB9CisgIGNhbGxfb3V0KCJjaGVja0NvbnNpc3RlbmN5IiwgMCk7CisKKyAgbmRlYWRfbmV4dF9jaGVjaz1ORVRERUFEX0NIRUNLX1RJTUU7CisgIG5kZWFkX2xhc3R0aW1lPTA7CisgIG5kZWFkX2xvY2F0aW9uPTA7CisgIG5kZWFkX2xfZmlsZW5hbWU9MDsKKyAgbmRlYWRfY3VycmVudGx5PTA7CisgIG5kZWFkX25leHRfY2hlY2s9MDsKKyAgaGNfcGxheT0wOworICAKKyAgY29tbWFuZDo6Y3JlYXRlKCk7CisgIHByb3BlcnRpZXM6OmNyZWF0ZSgpOworICBkZXNjcmlwdGlvbjo6Y3JlYXRlKCk7CisgIGxpZ2h0OjpjcmVhdGUoKTsKKyAgYXR0cmlidXRlczo6Y3JlYXRlKCk7CisgIGNsb3RoaW5nOjpjcmVhdGUoKTsKKyAgY29tYmF0OjpjcmVhdGUoKTsKKyAgbGlmZTo6Y3JlYXRlKCk7CisgIGNvbW06OmNyZWF0ZSgpOworICB2aWV3Y21kOjpjcmVhdGUoKTsKKyAgcXVlc3RzOjpjcmVhdGUoKTsKKyAgcmVzdHJpY3Rpb25zOjpjcmVhdGUoKTsKKyAgbW92aW5nOjpjcmVhdGUoKTsKKyAgdHJhdmVsOjpjcmVhdGUoKTsKKyAgc2tpbGxzOjpjcmVhdGUoKTsKKyAgIAorICBTZXRQcm9wKFBfTEVWRUwsIC0xKTsKKyAgU2V0KFBfTEVWRUwsIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfR0hPU1QsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldFByb3AoUF9TQ1JFRU5TSVpFLCAtMSk7CisgIFNldChQX1NDUkVFTlNJWkUsIFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfTU9SRV9GTEFHUywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX1dFSUdIVF9QRVJDRU5ULDEwMCk7CisgIFNldFByb3AoUF9MT05HLCAwKTsKKyAgU2V0UHJvcChQX1RJVExFLCAiZGVyIGhvZmZudW5nc3ZvbGxlIEFuZmFlbmdlciIpOworICBTZXRQcm9wKFBfQUxJR04sIDApOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXQoUF9HRU5ERVIsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldFByb3AoUF9UVFksICJ2dDEwMCIpOworICBTZXQoUF9UVFksIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldFByb3AoUF9XRUlHSFQsIDc1MDAwKTsKKyAgU2V0UHJvcChQX01BWF9IUCw1MCk7CisgIFNldFByb3AoUF9NQVhfU1AsNTApOworICBTZXRQcm9wKFBfTUFYX0ZPT0QsMTAwKTsKKyAgU2V0UHJvcChQX01BWF9EUklOSywxMDApOworICBTZXRQcm9wKFBfTUFYX0FMQ09IT0wsMTAwKTsKKyAgU2V0KCBQX1dJTVBZLCAyMCwgRl9WQUxVRSk7CisKKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IGJsb3NzZW4gSGFlbmRlbiIsIDMwfSkpOworICBTZXQoUF9IQU5EUywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0UHJvcChQX01BWF9IQU5EUywgMik7CisKKyAgU2V0KFBfTUFSUklFRCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfRVhUUkFfTE9PSywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfU0hPV19FWElUUywgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfU0hPV19FWElUUywgMSk7CisgIFNldChQX1dBTlRTX1RPX0xFQVJOLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9DQU5fRkxBR1MsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1RFU1RQTEFZRVIsIFNBVkV8UFJPVEVDVEVELCBGX01PREVfQVMpOworICBTZXQoUF9BTExPV0VEX1NIQURPVywgU0FWRXxTRUNVUkVELCBGX01PREVfQVMpOworICBTZXQoUF9TRUNPTkQsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0lOVklTLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9SRUFEX05FV1MsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1NUQVJUX0hPTUUsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1BSQVlfUk9PTSwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTUFJTEFERFIsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0hPTUVQQUdFLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9JQ1EsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX01FU1NFTkdFUiwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfTE9DQVRJT04sIFNBVkUsIEZfTU9ERV9BUyk7CisKKyAgU2V0KFBfTk9fQVNDSUlfQVJULCBTQVZFLCBGX01PREVfQVMpOworCisgIFNldChQX1ZJU1VBTEJFTEwsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0NBUlJJRURfVkFMVUUsIFNBVkUsIEZfTU9ERV9BUyk7CisKKyAgU2V0KFBfUFJPTVBULCAiPiAiKTsKKyAgU2V0KFBfUFJPTVBULCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9DQUxMRURfRlJPTV9JUCwgU0FWRSwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfSU5GT1JNTUUsU0FWRXxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgU2V0KFBfV0FJVEZPUixTQVZFfFBST1RFQ1RFRCxGX01PREVfQVMpOworICBTZXQoUF9XQUlURk9SX1JFQVNPTixTQVZFfFBST1RFQ1RFRCxGX01PREVfQVMpOworICBTZXQoUF9EQUlMWV9QTEFZVElNRSxTQVZFfFBST1RFQ1RFRCxGX01PREVfQVMpOworICBTZXQoUF9ORVRERUFEX0VOViwgUFJPVEVDVEVEfE5PU0VUTUVUSE9ELCBGX01PREVfQVMpOworICAKKyAgYXV0b2xvYWQgPSAoW10pOworICBhdXRvbG9hZF9yZXN0ID0gKFtdKTsKKyAgYXV0b2xvYWRfZXJyb3IgPSAoe30pOworICBTZXRQcm9wKFBfQVJUSUNMRSwwKTsKKyAgU2V0KFBfR1VJTEQsU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9HVUlMRF9USVRMRSxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX0dVSUxEX0xFVkVMLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfR1VJTERfUkFUSU5HLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfTkVXU0tJTExTLFNBVkUsRl9NT0RFX0FTKTsKKyAgU2V0KFBfTkVFREVEX1FQLFJFUV9RUCk7CisgIFNldChQX0RFQURTLDApOworICBTZXQoUF9ERUFEUywgTk9TRVRNRVRIT0QsRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfREVBRFMsU0FWRXxQUk9URUNURUR8U0VDVVJFRCxGX01PREVfQVMpOworICBTZXQoUF9MQVNUX0xPR0lOLC0xKTsKKyAgU2V0KFBfTEFTVF9MT0dJTiwgTk9TRVRNRVRIT0QsRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfTEFTVF9MT0dJTixTQVZFfFBST1RFQ1RFRHxTRUNVUkVELEZfTU9ERV9BUyk7CisgIFNldChQX0xBU1RfTE9HT1VULC0xKTsKKyAgU2V0KFBfTEFTVF9MT0dPVVQsIE5PU0VUTUVUSE9ELEZfU0VUX01FVEhPRCk7CisgIFNldChQX0xBU1RfTE9HT1VULFNBVkV8UFJPVEVDVEVEfFNFQ1VSRUQsRl9NT0RFX0FTKTsKKyAgU2V0KFBfQ0xPQ0tNU0csU0FWRSxGX01PREVfQVMpOworICBTZXQoUF9USU1FWk9ORSxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX1NIT1dFTUFJTCxTQVZFLEZfTU9ERV9BUyk7CisgIFNldChQX0xBU1RfUVVJVCxTQVZFfFBST1RFQ1RFRHxTRUNVUkVELEZfTU9ERV9BUyk7CisKKyAgU2V0KFBfQ01TRywgMCwgRl9NT0RFKTsgLy8gdG8gY2xlYW4gb3V0IHRoZSBvbGQgY2xvbmUgbWVzc2FnZXMKKyAgU2V0KFBfRE1TRywgMCwgRl9NT0RFKTsKKyAgU2V0KFBfQ0xPTkVfTVNHLCBTQVZFLCBGX01PREUpOworICBTZXRQcm9wKFBfQ0xPTkVfTVNHLCAiemF1YmVydCBldHdhcyBoZXJ2b3IiKTsKKyAgU2V0KFBfREVTVFJVQ1RfTVNHLCBTQVZFLCBGX01PREUpOworICBTZXRQcm9wKFBfREVTVFJVQ1RfTVNHLCAidmVyc2Nod2luZGV0IGVpbmZhY2giKTsKKworICBTZXQoUF9GQU8sIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTKTsKKyAgU2V0KFBfRkFPX1BPUlRBTFMsIFNBVkUsIEZfTU9ERV9BUyk7CisKKyAgU2V0UHJvcChQX05FV0JJRV9HVUlERSwwKTsKKyAgU2V0KFBfTkVXQklFX0dVSURFLFNBVkUsRl9NT0RFX0FTKTsKKworICAvL1RPRE86IFJlbW92ZSAtIFByb3BlcnR5IGlzdCBub3QgbmVlZGVkIGFueSBtb3JlLgorICBTZXQoUF9URUxORVRfS0VFUF9BTElWRSwgUFJPVEVDVEVEfFNBVkUsIEZfTU9ERV9BRCk7CisgIFNldFByb3AoUF9URUxORVRfS0VFUF9BTElWRSwgMCk7CisKKyAgQWRkSWQoIkludGVyYWN0aXZlIik7CisKKyAgcmVhbGlwPSIiOworfQorCisvLyBBQ0hUVU5HOiBGYWxscyBoaWVyIG1hbCBzb25zdCBub2NoIHdlaXRlcmUgUmVzZXRzIGdlZXJidCB3ZXJkZW4sIG11c3MgZGFzCisvLyBoaWVyIG9yZGVudGxpY2ggZGVmaW5pZXJ0IHdlcmRlbiEKK3ZvaWQgcmVzZXQoKSB7IAorICBjb21tOjpyZXNldCgpOworICAvLyBtb21lbnRhbiBrYW5uIGRlciBSZXNldCBqZXR6dCBhYmdlc2NoYWx0ZXQgd2VyZGVuLCBkYSBlciBudXIgZGllCisgIC8vIFRNLUhpc3RvcnkgbG9lc2NodCB1bmQgZ2dmLiB2b24gTmV0ZGVhZCgpIHVuZCBEaXNjb25uZWN0KCkgcmVha3RpdmllcnQKKyAgLy8gd2lyZC4KKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKQoreworICBtb3Zpbmc6Ok5vdGlmeU1vdmUoZGVzdCxvbGRlbnYsbWV0aG9kKTsKKyAgLy8gZ2dmLiBEYXRlbiB1ZWJlciBuZXVlcyBFbnYgcGVyIEdNQ1Agc2VuZGVuLgorICBpZiAoZGVzdCAhPSBvbGRlbnYpCisgICAgR01DUF9Sb29tKCk7Cit9CisKK3N0cmluZyBGb3JzY2h1bmcoKQoreworICByZXR1cm4gTEVQTUFTVEVSLT5RdWVyeUZvcnNjaHVuZygpOworfQorCisvKiogU2V0enQgRGVmYXVsdHdlcnRlIGZ1ZXIgUmFzc2VuIC0gd2lyZCB2b24gZGVuIFNoZWxscyB1ZWJlcnNjaHJpZWJlbi4KKyovCittaXhlZCBSYWNlRGVmYXVsdChzdHJpbmcgYXJnKQoreworICBpZiAoIWFyZykKKyAgICByZXR1cm4gMDsKKyAgc3dpdGNoKGFyZykKKyAgeworICAgIGNhc2UgUF9IQU5EUyA6CisgICAgICByZXR1cm4gKHsiIG1pdCBibG9zc2VuIEhhZW5kZW4iLDMwLERUX0JMVURHRU9OfSk7CisgICAgY2FzZSBQX0JPRFkgOgorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKiBQcnVlZnQgU3BpZWxlcm9iamVrdCBhdWYgS29uc2lzdGVuei4KKyAgVWViZXJwcnVlZnQgZGFzIFNwaWVsZXJvYmpla3QgbmFjaCBrb21wbGV0dGVyIEluaXRpYWxpc2llcnVuZyAoaW0gCisgIGNhbGxvdXQpIGF1ZiBrb3JyZWt0ZSBXZXJ0ZSBlaW5pZ2VyIFByb3BzLgorKi8KK3ZvaWQgY2hlY2tDb25zaXN0ZW5jeSgpCit7IG1peGVkIGg7CisgIGludCAgIG07CisKKyAgaWYgKHBvaW50ZXJwKGg9UmFjZURlZmF1bHQoUF9IQU5EUykpICYmIHNpemVvZihoKT4xKQorICAgIG09KGludCloWzFdOworICBlbHNlCisgICAgbT0zMDsKKyAgaWYoKGg9UXVlcnkoUF9IQU5EUykpWzFdID4gbSAmJiAhSVNfTEVBUk5FUih0aGlzX29iamVjdCgpKSkgeworICAgIGxvZ19maWxlKCJpbmNvbnNpc3RlbnQiLCBzcHJpbnRmKAorICAgICAgIlslc10gJU86IEhBTkRTOiAlZFxuIiwgZHRpbWUodGltZSgpKSwgdGhpc19wbGF5ZXIoKSwgaFsxXSkpOworICAgIGhbMV0gPSBtOworICAgIFNldChQX0hBTkRTLGgpOworICB9CisKKyAgaWYgKFF1ZXJ5KFBfQk9EWSkhPShtPVJhY2VEZWZhdWx0KFBfQk9EWSkpKQorICAgICBTZXQoUF9CT0RZLG0pOworCisgIGlmICghUXVlcnkoUF9TRUNPTkRfTUFSSyxGX01PREUpKQorICAgIFNldChQX1NFQ09ORF9NQVJLLFNBVkV8UFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIGlmICghUXVlcnkoUF9UVFlfU0hPVyxGX01PREUpJlNBVkUpCisgIHsKKyAgICBTZXQoUF9UVFlfU0hPVywwLEZfVkFMVUUpOworICAgIFNldChQX1RUWV9TSE9XLFNBVkUsRl9NT0RFX0FTKTsKKyAgfQorICBpZiAoUXVlcnkoUF9UVFlfQ09MUyxGX01PREUpJlNBVkUpCisgIHsKKyAgICBTZXQoUF9UVFlfQ09MUyxTQVZFLEZfTU9ERV9BRCk7CisgICAgU2V0KFBfVFRZX1JPV1MsU0FWRSxGX01PREVfQUQpOworICAgIFNldChQX1RUWV9UWVBFLFNBVkUsRl9NT0RFX0FEKTsKKyAgfQorfQorCisvKiogQml0dGV0IGRhcyBTcGllbGVyb2JqZWt0LCBzaWNoIHp1IHplcnN0b2VyZW4uCisgIFxwYXJhbVtpbl0gc2lsZW50IEZsYWcsIG9iIG9obmUgVGV4dGF1c2dhYmVuIHplcnN0b2VydCB3ZXJkZW4gc29sbAorICBccmV0dXJuIEVyZm9sZyBkZXIgU2VsYnN0emVyc3RvZXJ1bmcKKyovCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgcmV0dXJuIG1vdmluZzo6cmVtb3ZlKHNpbGVudCk7Cit9CisKKy8qKiBTY2hhbHRldCBpbiBhbGxlbiBPYmpla3RlbiBpbSBJbnYgSEJzIGF1cy4KKyAgU2NoYWx0ZXQgaW0gSW52IGluIGFsbGVuIE9iamVrdGVuIChyZWt1cnNpdiwgZGVlcF9pbnZlbnRvcnkpCisgIGRpZSBIZWFydGJlYXRzIGF1cy4gRmFsbHMgb2JzIHVlYmVyZ2ViZW4gd2lyZCwgd2VyZGVuIGRpZXNlIE9iamVrdGUKKyAgc3RhdHQgZGVzIEludmVudGFycyBiZW51dHp0LgorICBTcGVpY2hlcnQgZGllIE9iamVrdGUsIGRpZSBlaW5lbiBIQiBoYXR0ZW4sIGluIGRlciBnbG9iLiBWYXIuIGhiX29icy4KKyAgQHBhcmFtW2luXSBvYnMgbWl4ZWQgLSBPYmpla3RlLCBpbiBkZW5lbiBkZXIgSEIgYWJnZXNjaGFsdGV0IHdlcmRlbiBzb2xsLiAKKyAgICBDb250YWluZXIgd2VyZGVuIHJla3Vyc2l2IGJlaGFuZGVsdC4KKyAgQGF0dGVudGlvbiBBY2h0dW5nISBOaWVtYWxzIHp3ZWltYWwgaGludGVyZWluYW5kZXIgcnVmZW4sIG9obmUgCisgICAgendpc2NoZW5kdXJjaCByZXN0YXJ0X2hlYXJ0X2JlYXRzKCkgZ2VydWZlbiB6dSBoYWJlbiEKKyAgQHNhIHJlc3RhcnRfaGVhcnRfYmVhdHMKKyovCit2YXJhcmdzIHN0YXRpYyB2b2lkIHN0b3BfaGVhcnRfYmVhdHMobWl4ZWQgb2JzKQoreworICBpbnQgaTsKKworICBpZiAoIW9icykKKyAgeworICAgIGhiX29icz0oe30pOworICAgIG9icz1kZWVwX2ludmVudG9yeShNRSk7CisgIH0gCisgIGZvcmVhY2gobWl4ZWQgb2I6IG9icykgeworICAgIGlmIChwb2ludGVycChvYikpCisgICAgICAgIHN0b3BfaGVhcnRfYmVhdHMob2IpOworICAgIGVsc2UgaWYgKHNldF9vYmplY3RfaGVhcnRfYmVhdChvYiwwKSkgIAorICAgICAgICBoYl9vYnMrPSh7b2J9KTsKKyAgfQorfQorCisvKiogU2NoYWx0ZXQgSEJzIGluIE9iamVrdGVuIGltIEludiB3aWVkZXIgZWluLgorICBTY2hhbHRldCBpbiBhbGxlbiBPYmpla3RlbiBpbiBoYl9vYnMgZGVuIEhlYXJ0YmVhdCBlaW4uCisgICAgSW4gaGJfb2JzIChnbG9iLiBWYXIuKSBzdGVoZW4gYWxsZSBPYmpla3RlLCBkaWUgYmVpbSBsZXR6dGVuIEF1ZnJ1ZiB2b24KKyAgICBzdG9wX2hlYXJ0X2JlYXRzKCkgZWluZW4gSEIgaGF0dGVuLgorICBAc2Egc3RvcF9oZWFydF9iZWF0cworKi8KK3N0YXRpYyB2b2lkIHJlc3RhcnRfaGVhcnRfYmVhdHMoKQoreworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAoaGJfb2JzKSkKKyAgeworICAgIGZvcmVhY2gob2JqZWN0IG9iOiBoYl9vYnMpCisgICAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2IsMSk7CisgICAgaGJfb2JzPTA7CisgIH0KK30KKworLyoqIFBydWVmdCBhdWYgYWJnZWxhdWZlbmUgU3BpZWx6ZWl0LgorICBQcnVlZnQgaW4gU3BpZWxlcm9iamVrdGVuLCBvYiBkaWUgdGFlZ2xpY2hlIE1heGltYWxzcGllbHplaXQKKyAgICBhYmdlbGF1ZmVuIGlzdC4KKyAgICBXaXJkIGltIGhlYXJ0X2JlYXQoKSBnZXJ1ZmVuLgorICBAcmV0dXJuIGludCAtIEZsYWcsIG9iIFNwaWVsemVpdCBhYmdlbGF1ZmVuIHVuZCBMb2dvdXQgZXJmb2xnZW4gc29sbAorKi8KK3N0YXRpYyBpbnQgQ2hlY2tEYWlseVBsYXl0aW1lKCkgeworICBpbnQgKnNwaWVsZGF1ZXIsZDsKKworICBpZiAoIXBvaW50ZXJwKHNwaWVsZGF1ZXI9UXVlcnkoUF9EQUlMWV9QTEFZVElNRSkpKQorICAgIHJldHVybiAwOworICAvLyAwOk1pbnV0ZW4gcHJvIFRhZywgMTpOci4gZGVzIGxldHplbiBUYWdlcywgMjpOci4gZGVzIGFuZ2VmYW5nZW5lbiBUYWdlcywKKyAgLy8gMzpsZXR6dGUgWmVpdHBydWVmdW5nLCA0OnZlcmJsZWliZW5kZSBaZWl0CisgIGQ9dGltZSgpLzg2NDAwOworICBpZiAoc3BpZWxkYXVlclsxXTw9ZCkgeyAvLyBFbmRlIGRlciB6ZWl0YmVzY2hyYWVua3RlbiBUYWdlPworICAgIFNldChQX0RBSUxZX1BMQVlUSU1FLDApOworICAgIHJldHVybiAwOworICB9IGVsc2UgaWYgKHNwaWVsZGF1ZXJbMl0hPWQpIHsgLy8gTmV1ZXIgVGFnPworICAgIHNwaWVsZGF1ZXJbNF09c3BpZWxkYXVlclswXTsKKyAgICBzcGllbGRhdWVyWzJdPWQ7CisgIH0gZWxzZSB7CisgICAgc3BpZWxkYXVlcls0XS09KHRpbWUoKS1zcGllbGRhdWVyWzNdKTsKKyAgfQorICBzcGllbGRhdWVyWzNdPXRpbWUoKTsgIC8vIExldHp0ZSBaZWl0cHJ1ZWZ1bmcKKyAgU2V0KFBfREFJTFlfUExBWVRJTUUsc3BpZWxkYXVlcik7CisgIGlmIChzcGllbGRhdWVyWzRdPDApIHsgLy8gS2VpbmUgWmVpdCBtZWhyIHVlYnJpZyBmdWVyIGhldXRlCisgICAgaWYgKCFpbnRlcmFjdGl2ZShNRSkpCisgICAgICByZXR1cm4gMTsKKyAgICB3cml0ZSgiRHUgaGFzdCBsYW5nZSBnZW51ZyBnZW11ZGRldCBmdWVyIGhldXRlLlxuIik7CisgICAgc2F5KE5hbWUoV0VSKSsiIGhhdCBmdWVyIGhldXRlIGdlbnVnIGdlbXVkZGV0LlxuIik7CisgICAgcmVtb3ZlX2ludGVyYWN0aXZlKE1FKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIEdpYnQgRXJ3YXJ0ZW1lbGR1bmcgbWl0IEdydW5kIGF1cy4KKyAgQHBhcmFtW2luXSB3aG8gICBzdHJpbmcgLSBXZXIgaXN0IGhlcmVpbmdla29tbWVuPworICBAcGFyYW1baW5dIGludmlzIGludCAtIElzdCBkZXIgU3BpZWxlciBJbnZpcz8KKyovCitzdGF0aWMgdm9pZCBTaG93X1dhaXRGb3JfUmVhc29uKHN0cmluZyB3aG8sIGludCBpbnZpcykKK3sKKyAgbWl4ZWQgbGlzdDsKKyAgc3RyaW5nIHJlYXNvbixuYW1lOworCisgIGlmIChpbnZpcykgbmFtZT0iKCIrd2hvKyIpIjsKKyAgICBlbHNlIG5hbWU9d2hvOworICBpZiAoKG1hcHBpbmdwKGxpc3Q9UXVlcnlQcm9wKFBfV0FJVEZPUl9SRUFTT04pKSkgJiYgKHJlYXNvbj1saXN0W3dob10pKQorICAgIHRlbGxfb2JqZWN0KE1FLHNwcmludGYoIlxuRHUgZXJ3YXJ0ZXN0ICVzIHdlZ2VuOlxuJXNcbiIsbmFtZSxyZWFzb24pKTsKKyAgZWxzZQorICAgIHRlbGxfb2JqZWN0KE1FLHNwcmludGYoIkR1IGVyd2FydGVzdCAlcyBhdXMga2VpbmVtIGJlc3RpbW10ZW4gR3J1bmQuXG4iLAorICAgICAgbmFtZSkpOworfQorCisvKiogR2lidCBMaXN0ZSBkZXIgRXJ3YXJ0ZXRlbiBTcGllbGVyIGFuIHRoaXNfcGxheWVyKCkgYXVzLgorKi8KK3N0YXRpYyB2b2lkIExpc3RBd2FpdGVkKCkgLy9Bbndlc2VuZGUgRXJ3YXJ0ZXRlIGF1Zmxpc3RlbgoreworICAgIHN0cmluZyAqbGlzdDsKKyAgICBtaXhlZCBtbGlzdDsKKyAgICBvYmplY3Qgb2I7CisgICAgaW50IG1hZzsKKworICAgIG1hZz1JU19MRUFSTkVSKE1FKTsKKworICAgIGxpc3Q9KHt9KTsKKyAgICBmb3JlYWNoKHN0cmluZyBlcndhcnRldCA6IFF1ZXJ5UHJvcChQX1dBSVRGT1IpKSB7CisgICAgICAgIGlmIChvYmplY3RwKG9iPWZpbmRfcGxheWVyKGxvd2VyX2Nhc2UoZXJ3YXJ0ZXQpKSkpIHsKKyAgICAgICAgICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hZykgbGlzdCs9KHsgc3ByaW50ZigiKCVzKSIsZXJ3YXJ0ZXQpIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBsaXN0Kz0oe2Vyd2FydGV0fSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpemVvZihsaXN0KSkKKyAgICAgICAgcHJpbnRmKCJBbndlc2VuZGUgRXJ3YXJ0ZXRlOiAlcy5cbiIsCisgICAgICAgICAgICBDb3VudFVwKHNvcnRfYXJyYXkobGlzdCwjJz4pKSk7CisKKyAgICBpZiAoKG1hcHBpbmdwKG1saXN0PVF1ZXJ5UHJvcChQX1dBSVRGT1JfUkVBU09OKSkpICYmIChzaXplb2YobWxpc3QpKSkKKyAgICAgICAgeworICAgICAgICAgIGZvcmVhY2goc3RyaW5nIGVyd2FydGV0IDogbWxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShvYj1maW5kX3BsYXllcihsb3dlcl9jYXNlKGVyd2FydGV0KSkpIHx8CisgICAgICAgICAgICAgICAgICAgICghbWFnICYmIG9iLT5RdWVyeVByb3AoUF9JTlZJUykpKTsKKyAgICAgICAgICAgICAgICBlbHNlIFNob3dfV2FpdEZvcl9SZWFzb24oZXJ3YXJ0ZXQsb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSk7CisgICAgICAgICAgfQorICAgICAgICB9Cit9CisvKiogVGVpbHQgZGVuIEdpbGRlbiB1bmQgYW5kZXJlbiBTcGllbGVybiBtaXQsIHdlciByZWluZ2Vrb21tZW4gaXN0LgorICBBdXNzZXJkZW0gd2lyZCBnZ2YuIFBsYXllclF1aXQoKSBpbSBFbnZpcm9ubWVudCBnZXJ1ZmVuLgorICBccGFyYW1baW5dIHJlaW4gaW50IC0gd2Fociwgd2VubiBkZXIgU3BpZWxlciBlaW5sb2dndC4KKyovCitwcm90ZWN0ZWQgdm9pZCBjYWxsX25vdGlmeV9wbGF5ZXJfY2hhbmdlKGludCByZWluKQoreworICBzdHJpbmcgd2VyID0gZ2V0dWlkKE1FKTsKKyAgLy8gZXJzdCBkaWUgR2lsZGUgaW5mb3JtaWVyZW4KKyAgc3RyaW5nIGdpbGRlID0gUXVlcnlQcm9wKFBfR1VJTEQpOworICBpZiAoc3RyaW5ncChnaWxkZSkgJiYgKGZpbmRfb2JqZWN0KCIvZ2lsZGVuLyIrZ2lsZGUpCisgICAgICAgIHx8IGZpbGVfc2l6ZSgiL2dpbGRlbi8iK2dpbGRlKyIuYyIpPjApKQorICAgIGNhdGNoKCgiL2dpbGRlbi8iK2dpbGRlKS0+bm90aWZ5X3BsYXllcl9jaGFuZ2UoTUUsIHJlaW4pOyBwdWJsaXNoKTsKKworICAvLyBkYW5uIGRpZSBhbmRlcmVuIFNwaWVsZXIKKyAgaW50IG1hZyA9IElTX0xFQVJORVIoTUUpOworICBpbnQgaW52aXMgPSBRdWVyeVByb3AoUF9JTlZJUyk7CisgIG9iamVjdCAqdSA9IHVzZXJzKCkgLSAoe01FfSk7IC8vIHNpY2ggc2VsYmVyIG5pY2h0IG1lbGRlbiAKKyAgaWYgKG1hZyAmJiBpbnZpcykgeyAgIC8vIEludmlzbWFnaWVyIG51ciBNYWdpZXJuIG1lbGRlbgorICAgIHUgPSBmaWx0ZXIodSwgZnVuY3Rpb24gaW50IChvYmplY3QgbykKKyAgICAgICAgeyByZXR1cm4gcXVlcnlfd2l6X2xldmVsKG8pID49IExFQVJORVJfTFZMOyB9CisgICAgICAgICk7CisgIH0KKyAgdS0+bm90aWZ5X3BsYXllcl9jaGFuZ2UoY2FwaXRhbGl6ZSh3ZXIpLHJlaW4saW52aXMpOworCisgIC8vIHVuZCBiZWltIEF1c2xvZ2dlbiBub2NoIGRhcyBFbnYgaW5mb3JtaWVyZW4uCisgIGlmICghcmVpbikgeworICAgIGlmKGVudmlyb25tZW50KCkpIGNhdGNoKGVudmlyb25tZW50KCktPlBsYXllclF1aXQoTUUpO3B1Ymxpc2gpOworICB9Cit9CisKKy8qKiBSdWZ0IGltIHVlYmVyZ2ViZW5lbiBPYmpla3QgZWluIGluaXQoKSBhdWYsIHNvZmVybiBub3R3ZW5kaWcuCisgIFJ1ZnQgaW4gb2IgZWluIGluaXQoKSBhdWYsIGZhbGxzIGRhcyBPYmpla3QgbmFjaCBkZW0KKyAgICBsZXR6dGVuIEF1c2xvZ2dlbiBnZXNjaGFmZmVuIHd1cmRlLgorICBccGFyYW1baW5dIG9iIG9iamVjdCAtIE9iamVrdCwgaW4gZGVtIGluaXQoKSBnZXJ1ZmVuIHdpcmQuCisgIFxwYXJhbVtpbl0gbG9nb3V0IGludCAtIExldHp0ZXIgTG9nb3V0CisgIFxyZXR1cm4gMSwgZmFsbHMgaW5pdCgpIGdlcnVmZW4gd3VyZGUuIDAgc29uc3QuCisqLworc3RhdGljIGludCBjYWxsX2luaXQoIG9iamVjdCBvYiwgaW50IGxvZ291dCApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBvYmplY3RfdGltZShvYikgPiBsb2dvdXQgKQorICAgICAgICByZXR1cm4gY2F0Y2gob2ItPmluaXQoKTsgcHVibGlzaCksIDE7CisgICAgcmV0dXJuKDApOworfQorCisvKiogSG9sdCBzZWl0IGRlbSBsZXR6dGVuIEF1c2xvZ2dlbiBhdXNnZWZhbGxlbmUgSW5pdHMgbmFjaC4KKyAgUnVmdCBpbiBkZW4gdWViZXJnZWJlbmVuIE9iamVrdGVuIGNhbGxfaW5pdCgpLCB3YXMgZWluZW4gaW5pdCgpCisgIGF1c2xvZXN0LCBmYWxscyBkYXMgT2JqZWt0IHNlaXQgZGVtIGxldHp0ZW4gQXVzbG9nZ2VuIGVyc3RlbGx0IHd1cmRlLgorICBccGFyYW1baW5dIGxvZ291dCBaZWl0cHVua3QgZGVzIGxldHp0ZW4gTG9nb3V0cworICBccGFyYW1baW5dIG9icyBBcnJheSB2b24gT2JqZWt0ZW4KKyAgXHNhIGNhbGxfaW5pdCgpCisqLworc3RhdGljIHZvaWQgaW5pdHNfbmFjaGhvbGVuKCBpbnQgbG9nb3V0LCBvYmplY3QgKm9icyApCit7CisgICAgZmlsdGVyKCBvYnMsICJjYWxsX2luaXQiLCBNRSwgbG9nb3V0ICk7Cit9CisKKy8qKiBCZWxlYnQgZWluZW4gTmV0enRvdGVuIHdpZWRlci4KKyAgV2lyZCBpbSBMb2dpbiBnZXJ1ZmVuLCB3ZW5uIGRlciBTcGllbGVyIG5ldHp0b3Qgd2FyLiBBZXF1aXZhbGVudCB6dQorICBzdGFydF9wbGF5ZXIoKQorICBAcGFyYW1baW5dIHNpbGVudCBXZW5uIEZsYWcgZ2VzZXR6dCwgd2VyZGVuIGtlaW5lIE1lbGR1bmcgYW4gZGVuIFJhdW0KKyAgYXVzZ2VnZWJlbi4KKyAgQHBhcmFtW2luXSBpcCBUZXh0dWVsbGUgUmVwcmFlc2VudGF0aW9uIGRlciBJUC1BZHJlc3NlLCB2b24gZGVyIGRlciBTcGllbGVyCisgIGtvbW10LgorICBAc2VlIHN0YXJ0X3BsYXllcigpCisqLwordmFyYXJncyB2b2lkIFJlY29ubmVjdCggaW50IHNpbGVudCApCit7CisgICAgaW50IG51bTsKKyAgICBzdHJpbmcgY2FsbGVkX2Zyb21faXA7CisgICAgb2JqZWN0ICppbnY7CisKKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICB7CisgICAgICAgIC8vIHBlcmZvcm0gdGhlIHRlbG5ldCBuZWdvdGlhdGlvbnMuIChhbGwgdGhhdCBhcmUgYXZhaWxhYmxlKQorICAgICAgICAiKiI6OnN0YXJ0dXBfdGVsbmV0X25lZ3MoKTsKKyAgICAgICAgU2V0KCBQX0xBU1RfTE9HSU4sIHRpbWUoKSApOworICAgIH0KKworICAgIGVuYWJsZV9jb21tYW5kcygpOworICAgIHNldF9saXZpbmdfbmFtZSggZ2V0dWlkKCkgKTsKKyAgICBfcmVtb3ZlX25ldGRlYWQoKTsKKyAgICBzZXRfaGVhcnRfYmVhdCgxKTsKKyAgICAvLyBIdW50dGltZXMgYWt0dWFsaXNpZXJlbiB1bmQgZ2dmLiBGZWluZGUgdmVyZ2Vzc2VuLgorICAgIHVwZGF0ZV9odW50X3RpbWVzKCh0aW1lKCktUXVlcnlQcm9wKFBfTEFTVF9MT0dPVVQpKSAvX19IRUFSVF9CRUFUX0lOVEVSVkFMX18pOworICAgIC8vIEhlYXJ0YmVhdHMgaW4gT2JqZWt0ZW4gaW0gSW52IHJlYWt0aXZlcmVuLgorICAgIHJlc3RhcnRfaGVhcnRfYmVhdHMoKTsKKyAgICAvLyBsaWZlLmMgd2lsbCBnZ2YuIHdhcyBhdWZyYWV1bWVuCisgICAgbGlmZTo6cmVjb25uZWN0KCk7CisKKyAgICBsb2dfZmlsZSggIlJFRU5URVIiLCBzcHJpbnRmKCAiJS0xMXMgJXMsICUtMTVzICglcykuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKE1FKSksIGN0aW1lKHRpbWUoKSlbNC4uMTVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcihNRSl8fCJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKE1FKXx8IlVua25vd24iICksCisgICAgICAgICAgICAgIDIwMDAwMCApOworCisgICAgaWYgKCBuZGVhZF9jdXJyZW50bHkgKQorICAgICAgICBuZGVhZF9yZXZpdmUoKTsKKworICAgIGlmICggIXNpbGVudCAmJiBpbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICBjYWxsX25vdGlmeV9wbGF5ZXJfY2hhbmdlKDEpOworCisgICAgY29tbWFuZDo6cmVjb25uZWN0KCk7CisgICAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSApCisgICAgICAgIG1vZGlmeV9wcm9tcHQoKTsKKworICAgIC8vIExvZ2luLWV2ZW50IGF1c2xvZXNlbgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTE9HSU4sIChbCisgICAgICAgICAgRV9PQkpFQ1Q6IE1FLAorICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQoTUUpLAorICAgICAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KCkgXSkgKTsKKworICAgIGNhdGNoKCBudW0gPSAic2VjdXJlL21haWxlciItPkZpbmdlck1haWwoZ2V0ZXVpZCgpKTtwdWJsaXNoICk7CisKKyAgICBpZiAoIG51bSApCisgICAgICAgIHdyaXRlKCAiRHUgaGFzdCAiICsgbnVtICsgIiBuZXVlIiArIChudW0gPT0gMSA/ICJuIEJyaWVmIiA6ICIgQnJpZWZlIikKKyAgICAgICAgICAgICAgICsgIiBpbSBQb3N0YW10IGxpZWdlbi5cbiIgKTsKKworICAgIGlmICggUXVlcnlQcm9wKFBfQVdBWSkgKQorICAgICAgICB3cml0ZSggYnJlYWtfc3RyaW5nKCAiRHUgYmlzdCBhbHMgYWJ3ZXNlbmQgZ2VrZW5uemVpY2huZXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVByb3AoUF9BV0FZKSArICIuIiwgNzggKSApOworCisgICAgY2F0Y2goIFJlZ2lzdGVyQ2hhbm5lbHMoKTsgcHVibGlzaCApOworCisgICAgaWYgKCAoY2FsbGVkX2Zyb21faXAgPSBRdWVyeShQX0NBTExFRF9GUk9NX0lQKSkgJiYKKyAgICAgICAgIHF1ZXJ5X2lwX251bWJlcihNRSkgIT0gY2FsbGVkX2Zyb21faXAgKSB7CisgICAgICAgIHN0cmluZyB0bXA7CisKKyAgICAgICAgaWYgKCBzdHJpbmdwKHRtcCA9IHF1ZXJ5X2lwX25hbWUoY2FsbGVkX2Zyb21faXApKSAmJgorICAgICAgICAgICAgIHRtcCAhPSBjYWxsZWRfZnJvbV9pcCApCisgICAgICAgICAgICB0bXAgPSAiIFsiICsgdG1wICsgIl0iOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAgPSAiIjsKKworICAgICAgICB3cml0ZSggIkRhcyBsZXR6dGUgTWFsIGthbXN0IER1IHZvbiAiICsgY2FsbGVkX2Zyb21faXAgKyB0bXAgKyAiLlxuIiApOworICAgIH0KKworICAgIFNldCggUF9DQUxMRURfRlJPTV9JUCwgcXVlcnlfaXBfbnVtYmVyKE1FKSApOworCisgICAgLy8gZmFsbHMgR2VnZW5zdGFlbmRlIG1pdCAndXBkIC1hcicgdXBnZWRhdGVkIHd1cmRlbiwgbXVlc3NlbiBkaWUKKyAgICAvLyAidmVybG9yZW4gZ2VnYW5nZW5lbiIgaW5pdCgpJ3MgbmFjaGdlaG9sdCB3ZXJkZW4KKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICYmICFJU19MRUFSTkVSKE1FKSApCisgICAgICAgIGNhbGxfb3V0KCAiaW5pdHNfbmFjaGhvbGVuIiwgMCwgUXVlcnkoUF9MQVNUX0xPR09VVCksCisgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KE1FKSApOworCisgICAgLy8gbm9jaCBuaWNodCBnZWNsb250ZSBBdXRvbG9hZGVyICJuYWNoImNsb25lbgorICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCJsb2FkX2F1dG9fb2JqZWN0cyIpICE9IC0xICkKKyAgICAgICAgLyogZG8gbm90aGluZyAqLzsKKworICAgIGlmICggc2l6ZW9mKGF1dG9sb2FkX3Jlc3QpICkKKyAgICAgICAgY2FsbF9vdXQoICJsb2FkX2F1dG9fb2JqZWN0cyIsIDAsIGF1dG9sb2FkX3Jlc3QgKTsKKworICAgIGlmIChuZGVhZF9sb2NhdGlvbikgeworICAgICAgY2F0Y2goIG5kZWFkX2xvY2F0aW9uLT5CZWNvbWVzTmV0QWxpdmUoTUUpO3B1Ymxpc2ggKTsKKyAgICAgIGludiA9IGFsbF9pbnZlbnRvcnkobmRlYWRfbG9jYXRpb24pOworICAgICAgbmRlYWRfbG9jYXRpb24gPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgICBpbnYgPSAoe30pOworCisgICAgaW52ICs9IGRlZXBfaW52ZW50b3J5KE1FKTsKKworICAgIC8vWlogZm9yZWFjaCBzdGF0dCBjYWxsX290aGVyKCksIGRhbWl0IG5lbiBidWcgaW4gQk5BIG5pY2h0IGRpZSBhbmRlcmVuCisgICAgLy9CTkEgdmVyaGluZGVydC4KKyAgICBmb3JlYWNoKG9iamVjdCBvYjogaW52KSB7CisgICAgICAgIC8vZXMgaXN0IG5pY2h0IGF1c3p1c2NobGllc3NlbiwgZGFzcyBJdGVtcyBkdXJjaCBCZWNvbWVzTmV0QWxpdmUoKQorICAgICAgICAvL2VpbmVzIGFuZGVyZW4gemVyc3RvZXJ0IHdlcmRlbi4KKyAgICAgICAgaWYgKG9iamVjdHAob2IpKQorICAgICAgICAgIGNhdGNoKCBjYWxsX290aGVyKG9iLCAiQmVjb21lc05ldEFsaXZlIiwgTUUpO3B1Ymxpc2ggKTsKKyAgICB9CisKKyAgICAvLyBFcnN0IGFuIGRpZXNlciBTdGVsbGUsIHdlaWwgZGVyIFNwaWVsZXIgdS5VLiBkdXJjaCBlaW4gQmVjb21lc05ldEFsaXZlKCkKKyAgICAvLyBub2NoIGJld2VndCB3dXJkZS4KKyAgICBpZiAoICFzaWxlbnQgJiYgZW52aXJvbm1lbnQoKSAmJiBvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSAhPSBORVRERUFEX1JPT00gKQorICAgIHsKKyAgICAgICAgaWYocXVlcnlfaGNfcGxheSgpPD0xKQorICAgICAgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLFF1ZXJ5UHJvcChQX05BTUUpICsgIiB3ZWlsdCB3aWVkZXIgdW50ZXIgZGVuIExlYmVuZGVuLlxuIiwoe01FfSkgKTsKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSxRdWVyeVByb3AoUF9OQU1FKSArICIgd2VpbHQgd2llZGVyIHVudGVyIGRlbiBWZXJzdG9yYmVuZW4uXG4iLCh7TUV9KSApOworICAgIH0KKworICAgIE5ld2JpZUludHJvTXNnKCk7CisKKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgTGlzdEF3YWl0ZWQoKTsKK30KKworLyoqIExvZ2d0IGVpbmVuIFNwaWVsZXIgYXVzIHVuZCBtYWNodCBpaG4gbmV0enRvdC4KKyAgQmV3ZWd0IGVpbmVuIFNwaWVsZXIgaW4gZGVuIE5ldHp0b3RlbnJhdW0sIGRlYWt0aXZpZXJ0IEhlYXJ0YmVhdHMgaW0KKyAgSW52ZW50YXIsIHJ1ZnQgQmVjb21lc05ldERlYWQoKSwgbG9lc3QgRXJ3YXJ0ZW1lbGR1bmdlbiBhdXMsIHRyaWdnZXJ0CisgIEF1c2xvZ2dldmVudC4KKyovCit2b2lkIE5ldERlYWQoKQoreworICBvYmplY3QgKmludjsKKyAgaW50IG51bTsKKworICBjYXRjaChSZW1vdmVDaGFubmVscygpO3B1Ymxpc2gpOworCisgIGlmKHF1ZXJ5X2hjX3BsYXkoKT4xKQorICAgIHNheSgiUGxvZXR6bGljaCB3ZWljaHQgYWxsZSBzcGlyaXR1ZWxsZSBFbmVyZ2llIGF1cyAiK1F1ZXJ5UHJvcChQX05BTUUpKyIuXG4iKTsKKyAgZWxzZQorICAgIHNheSgiUGxvZXR6bGljaCB3ZWljaHQgYWxsZXMgTGViZW4gYXVzICIrUXVlcnlQcm9wKFBfTkFNRSkrIi5cbiIpOworCisgIF9zZXRfbmV0ZGVhZCgpOworICByZW1vdmVfY2FsbF9vdXQoInF1aXQiKTsKKyAgcmVtb3ZlX2xpdmluZ19uYW1lKCk7CisgIC8vIFdpcmQgendhciBpbSBzYXZlX21lKCkgZ2VtYWNodCwgYWJlciBkaWUgWmVpdHVudGVyc2NoaWVkZSBiZWltCisgIC8vIGZpbmdlcm4gZGlyZWt0IG5hY2ggZGVtIEF1c2xvZ2dlbiBmdWVocmVuIGltbWVyIHdpZWRlciB6dSBWZXJ3aXJydW5nZW4KKyAgaWYocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgJiYgIVF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICAgIFNldChQX0xBU1RfTE9HT1VULHRpbWUoKSk7CisgIGlmIChNRSkKKyAgICBuZGVhZF9sb2NhdGlvbiA9IGVudmlyb25tZW50KCk7CisKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpKQorICAgIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoMCk7CisKKyAgLy8gTG9nb3V0LWV2ZW50IGF1c2xvZXNlbgorICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX0xPR09VVCwgKFsKKyAgICAgICAgICBFX09CSkVDVDogTUUsCisgICAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSBdKSApOworCisgIHNldF9uZXh0X3Jlc2V0KDkwMCk7CisgIC8qIEJlaSBOaWNodC1NYWdpZXItU2hlbGxzIHdpcmQgY29tbTo6cmVzZXQoKSBhdWZnZXJ1ZmVuLCBkYXMgcHJ1ZWZ0LCBvYgorICAgICBkZXIgU3BpZWxlciBpbW1lciBub2NoIG5ldHp0b3QgaXN0LCB1bmQgZmFsbHMgamEsIGRpZSB0bWhpc3QgbG9lc2NodC4KKyAgICAgRGllIE1ldGhvZGUgd2lyZCB2b24gL3N0ZC9zaGVsbHMvbWFnaWVyLmMgdWViZXJzY2hyaWViZW4sIG5ldHp0b3RlCisgICAgIE1hZ2llciAoZGllIGVpZ2VudGxpY2ggc2Nob24gYW5kZXJ3ZWl0aWcgYmVzZWl0aWd0IHdvcmRlbiBzZWluIHNvbGx0ZW4pCisgICAgIHdlcmRlbiByZW1vdmUoKWQgdW5kIGRlc3RydWN0KCllZC4gLS1BbXludGhvciAwNS4wNS4yMDA4ICovCisKKyAgaWYgKGVudmlyb25tZW50KCkpIHsKKyAgICBjYXRjaChlbnZpcm9ubWVudCgpLT5CZWNvbWVzTmV0RGVhZChNRSk7cHVibGlzaCk7CisgICAgaW52ID0gZGVlcF9pbnZlbnRvcnkoTUUpK2FsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSk7CisgIH0KKyAgZWxzZSBpbnY9ZGVlcF9pbnZlbnRvcnkoTUUpOworICBmb3JlYWNoKG9iamVjdCBvYjogaW52KSB7CisgICAgICBpZiAob2JqZWN0cChvYikpIC8vbWFuIHdlaXNzIG5pZSB3YXMgQk5EKCkgbWFjaHQuLi4KKyAgICAgICAgICBjYXRjaCggY2FsbF9vdGhlcihvYiwgIkJlY29tZXNOZXREZWFkIiwgTUUpO3B1Ymxpc2ggKTsKKyAgfQorfQorCisKKy8qKiBTZW5kZXQgZ2dmLiBUZWxuZXQgVGltaW5nIE1hcmtzIGFscyBLZWVwLUFsaXZlIFBha2V0ZSBhbiBkZW4gQ2xpZW50LgorICAqIFdpcmQgaW4gaGVhcnRfYmVhdCgpIGdlcnVmZW4uCisgICogQHJldHVybiAxLCBmYWxscyBkZXIgU3BpZWxlciBLZWVwLUFsaXZlIFBha2V0IHd1ZW5zY2h0LCBzb25zdCAwLiAKKyAgKiBAc2VlIGhlYXJ0X2JlYXQoKQorKi8KK3Byb3RlY3RlZCBpbnQgQ2hlY2tUZWxuZXRLZWVwQWxpdmUoKSB7CisgIGlmICh0ZWxuZXRfdG1fY291bnRlciA+IDApIHsKKyAgICAvLyBTcGllbGVyIGhhdCBvZmZlbmJhciBlaW4gS2VlcC1BbGl2ZSBrb25maWd1cmllcnQgLi4uCisgICAgaWYgKCEoLS10ZWxuZXRfdG1fY291bnRlcikpIHsKKyAgICAgIC8vIHVuZCBkYXMgSW50ZXJ2YWxsIGlzdCBnZXJhZGUgYWJnZWxhdWZlbi4KKyAgICAgIC8vIFByb3Agb2ZmZW5iYXIgZ2VzZXR6dCwgRkVhdHVyZSBpc3Qgd2lya2xpY2ggZ2V3dWVuc2NodCwKKyAgICAgIC8vIFRlbG5ldCBUaW1pbmcgTWFyayBzZW5kZW4gCisgICAgICBzZW5kX3RlbG5ldF90aW1pbmdfbWFyaygpOworICAgICAgLy8gYWxsZSAxMjAgSEJzICgyNDBzLCA0bWluKS4KKyAgICAgIC8vIHNvbGx0ZSBlaWdlbnRsaWNoIDI0MCAvIF9fSEVBUlRfQkVBVF9JTlRFUlZBTF9fIHNlaW4uIEFiZXIgc3BhcnQKKyAgICAgIC8vIGVpbmUgT3BlcmF0aW9uIGltIEhCLiA7LSkKKyAgICAgIHRlbG5ldF90bV9jb3VudGVyID0gMTIwOworICAgIH0KKyAgICByZXR1cm4gMTsgLy8gS2VlcC1BbGl2ZSBpc3QgZWluZ2VzY2hhbHRldAorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZGVhZF9tb3ZlX21lKCk7CisKKy8qKiBIZWFydGJlYXQgZGVzIFNwaWVsZXJvYmpla3Rlcy4KKyAgUHJ1ZWZ0IHRhZWdsaWNoZSBTcGllbHplaXQsIHNwZWljaGVydCByZWdlbG1hZXNzaWcgZGVuIFNwaWVsZXIsCisgIGJld2VndCBOZXR6dG90ZSBpbiBkZW4gTmV0enRvZGVucmF1bSwgcnVmdCBkaWUgSEJzIGF1cyBsaXZpbmcvY29tYmF0IHVuZAorICBwbGF5ZXIvbGlmZS4KKyovCitwcm90ZWN0ZWQgdm9pZCBoZWFydF9iZWF0KCkgeworICBpZiAoIU1FKQorICAgIHJldHVybjsKKyAgaWYgKG5kZWFkX2N1cnJlbnRseSkKKyAgeworICAgIGlmIChpbnRlcmFjdGl2ZShNRSkpCisgICAgeworICAgICAgbmRlYWRfcmV2aXZlKCk7CisgICAgICBuZGVhZF9sb2NhdGlvbj0wOworICAgIH0KKyAgICBlbHNlIHJldHVybjsKKyAgfQorICBlbHNlCisgICAgaWYgKCEobmRlYWRfbmV4dF9jaGVjay0tKSkKKyAgICB7CisgICAgICBuZGVhZF9uZXh0X2NoZWNrPU5FVERFQURfQ0hFQ0tfVElNRTsKKyAgICAgIGlmICghaW50ZXJhY3RpdmUoTUUpKQorICAgICAgICBpZiAobmRlYWRfbGFzdHRpbWUpCisgICAgICAgIHsKKyAgICAgICAgICBzYXZlX21lKDEpOworICAgICAgICAgIGlmIChJU19MRUFSTkVSKE1FKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBxdWl0KCk7CisgICAgICAgICAgICBpZiAoTUUpCisgICAgICAgICAgICAgIHJlbW92ZSgpOworICAgICAgICAgICAgaWYgKE1FKQorICAgICAgICAgICAgICBkZXN0cnVjdChNRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIG5kZWFkX21vdmVfbWUoKTsKKyAgICAgICAgICAvLyBadW1pbmRlc3QgYmVpIEdhZXN0ZW4gaXN0IGRhcyBPYmpla3QgamV0enQgemVyc3RvZXJ0CisgICAgICAgICAgaWYgKCFvYmplY3RwKHRoaXNfb2JqZWN0KCkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBuZGVhZF9sYXN0dGltZT0xOworICAgIH0KKyAgaWYgKE1FICYmIG5kZWFkX2xhc3R0aW1lICYmIGludGVyYWN0aXZlKE1FKSkKKyAgICBuZGVhZF9sYXN0dGltZT0wOworICBpZiAoQ2hlY2tEYWlseVBsYXl0aW1lKCkpCisgICAgcmV0dXJuOworCisgIENoZWNrVGVsbmV0S2VlcEFsaXZlKCk7CisKKyAgbGlmZTo6aGVhcnRfYmVhdCgpOworICBjb21iYXQ6OmhlYXJ0X2JlYXQoKTsKKyAgc2tpbGxzOjpoZWFydF9iZWF0KCk7Cit9CisKKy8qKiBJRC1GdW5rdGlvbiBmdWVyIFNwaWVsZXJvYmpla3RlLgorICogaWQoKSBmdWVyIFNwaWVsZXIuIEJlc29uZGVyZSBCZWhhbmRsdW5nIGZ1ZXIgRnJvZXNjaGUgdW5kIEdlaXN0ZXIsCisgKiBzb3dpZSBJbnZpcy1TdGF0dXMuCisgKiBHaWJ0IGltbWVyIDAgenVydWVjaywgd2VubiBQX0lOVklTICYmIGx2bCA8IFBfTEVWRUwKKyAqIEBwYXJhbVtpbl0gc3RyIGFuZ2VmcmFndGVyIElELVN0cmluZworICogQHBhcmFtW2luXSBsdmwgTGV2ZWwgZGVzIEFuZnJhZ2VuZGVuCisgKiBAcmV0dXJuIDEsIGZhbGxzIHN0ciBhdWYgZGVuIFNwaWVsZXIgenV0cmlmZnQsIDAgc29uc3QuCisgKi8KK3ZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIsIGludCBsdmwpCit7CisgIGlmICg6OmlkKHN0cikpCisgICAgcmV0dXJuIDE7CisgIGlmIChRdWVyeShQX0lOVklTKSAmJiBsdmwgPCBRdWVyeVByb3AoUF9MRVZFTCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkmJiBzdHIgPT0gImdlaXN0IHZvbiAiKyBsb3dlcl9jYXNlKFF1ZXJ5UHJvcChQX05BTUUpKSkKKyAgICByZXR1cm4gMTsKKyAgaWYgKFF1ZXJ5UHJvcChQX0ZST0cpICYmIHN0ciA9PSAiZnJvc2NoIikgcmV0dXJuIDE7CisgIHJldHVybigwKTsKK30KKworLyoqIFNldHp0IFNwaWVsZXJob21lcGFnZSAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBAcGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIEByZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqLworc3RhdGljIGludCBzZXRfaG9tZXBhZ2Uoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgdG1wOworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICBpZiAoIVF1ZXJ5UHJvcChQX0hPTUVQQUdFKSkKKyAgICAgIHdyaXRlKCJEdSBoYXN0IGtlaW5lIFVSTC1BZHJlc3NlIGdlc2V0enQhXG4iKTsKKyAgICBlbHNlCisgICAgICB3cml0ZSgiRGVpbmUgb2ZmaXppZWxsZSBVUkwtQWRyZXNzZSBsYXV0ZXQ6ICIgKyBRdWVyeVByb3AoUF9IT01FUEFHRSkKKyAgICAgICAgICAgICsiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiRGVpbmUgb2ZmaXppZWxsZSBVUkwtQWRyZXNzZSB3dXJkZSBnZWFlbmRlcnQuXG4iKTsKKyAgaWYgKHN0cj09ImtlaW5lIikgCisgICAgU2V0UHJvcChQX0hPTUVQQUdFLCAwKTsKKyAgZWxzZSB7CisgICAgdG1wID0gZmlsdGVyKHJlZ2V4cGxvZGUoc3RyLCAiWzxdW14+XSpbPl0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhKCh7J2V9KSwgKHsjJyE9LCAoeyMnWywgJ2UsIDB9KSwgJzwnfSkpKTsKKyAgICB3cml0ZSgiU2llIGxhdXRldCBqZXR6dDogIisoc3RyID0gaW1wbG9kZSh0bXAsICIiKSkrIlxuIik7CisgICAgU2V0UHJvcChQX0hPTUVQQUdFLCBzdHIpOworICB9CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgU3BpZWxlci1Xb2hub3J0IChTcGllbGVya29tbWFuZG8pLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNldF9sb2NhdGlvbiggc3RyaW5nIHN0ciApCit7CisgICAgbWl4ZWQgb3J0OworCisgICAgaWYgKCBzdHIgPT0gIjAiIHx8IHN0ciA9PSAibG9lc2NoZW4iICl7CisgICAgICAgIFNldCggUF9MT0NBVElPTiwgMCApOworICAgICAgICB3cml0ZSggIkR1IGxvZXNjaHQgRGVpbmUgT3J0c2FuZ2FiZS5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBzdHJpbmdwKHN0ciA9IF91bnBhcnNlZF9hcmdzKCkpICYmIHN0ciAhPSAiIiApeworICAgICAgICBTZXQoIFBfTE9DQVRJT04sIGNhcGl0YWxpemUoc3RyKSApOworICAgICAgICBwcmludGYoICJEdSBhZW5kZXJzdCBEZWluZSBPcnRzYW5nYWJlIGF1ZiBcIiVzXCIuXG4iLAorICAgICAgICAgICAgICAgIFF1ZXJ5KFBfTE9DQVRJT04pICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBzdHJpbmdwKG9ydCA9IFF1ZXJ5KFBfTE9DQVRJT04pKSApCisgICAgICAgIHByaW50ZiggIkRlaW5lIE9ydHNhbmdhYmUgbGF1dGV0IFwiJXNcIi5cbiIsIFF1ZXJ5KFBfTE9DQVRJT04pICk7CisgICAgZWxzZXsKKyAgICAgICAgU2V0KCBQX0xPQ0FUSU9OLCAwLCBGX1ZBTFVFICk7CisgICAgICAgIHdyaXRlKCAiRHUgaGFzdCBrZWluZSBPcnRzYW5nYWJlIGdlc2V0enQuXG4iICk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBJQ1EtVUlOIGRlcyBTcGllbGVycyAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqLworc3RhdGljIGludCBzZXRfaWNxKHN0cmluZyBzdHIpIHsKKyAgaW50IG51bTsKKworICBpZiAoIXN0ciB8fCBzdHI9PSIiKSB7CisgICAgaWYgKCFudW09UXVlcnlQcm9wKFBfSUNRKSkKKyAgICAgIHdyaXRlKCJEdSBoYXN0IGtlaW5lIElDUS1OdW1tZXIgZ2VzZXR6dCFcbiIpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiRGVpbmUgSUNRLU51bW1lciBsYXV0ZXQ6ICVkXG4iLG51bSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNzY2FuZihzdHIsIiVkIixudW0pIT0xIHx8ICFudW0pIHsKKyAgICB3cml0ZSgiRGVpbmUgSUNRLU51bW1lciB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgICBTZXRQcm9wKFBfSUNRLCAwKTsKKyAgfSBlbHNlIHsKKyAgICB3cml0ZSgiRGVpbmUgSUNRLU51bW1lciB3dXJkZSBnZWFlbmRlcnQuXG4iKTsKKyAgICBwcmludGYoIlNpZSBsYXV0ZXQgamV0enQ6ICVkXG4iLG51bSk7CisgICAgU2V0UHJvcChQX0lDUSwgbnVtKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IEluc3RhbnQgTWVzc2FuZ2VyIHZvbSBTcGllbGVyIChTcGllbGVya29tbWFuZG8pLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNldF9tZXNzZW5nZXIoc3RyaW5nIHN0cikgeworICBpbnQgbnVtOworICBzdHJpbmcgczsKKworICBpZiAoIXN0ciB8fCBzdHI9PSIiKSB7CisgICAgaWYgKCFzPVF1ZXJ5UHJvcChQX01FU1NFTkdFUikpCisgICAgICBpZiAoIW51bT1RdWVyeVByb3AoUF9JQ1EpKSAKKyAgICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgTWVzc2VuZ2VyLUlEIGdlc2V0enQuXG4iKTsKKyAgICAgIGVsc2UgCisgICAgICAgIHByaW50ZigiRHUgaGFzdCBrZWluZSBNZXNzZW5nZXItSUQgZ2VzZXR6dCwgYWJlciBlaW5lIElDUS1OdW1tZXI6ICVkXG4iLCBudW0pOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiRGVpbmUgTWVzc2VuZ2VyLUlEIGxhdXRldDogJXNcbiIsIHMpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSJsb2VzY2hlbiIgfHwgc3RyPT0ia2VpbmUiKSB7CisgICAgd3JpdGUoIkRlaW5lIE1lc3Nlbmdlci1JRCB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgICBTZXRQcm9wKFBfTUVTU0VOR0VSLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBzID0gX3VucGFyc2VkX2FyZ3MoKTsKKyAgICBwcmludGYoIkRlaW5lIE1lc3Nlbmdlci1JRCBsYXV0ZXQgbnVuOiAlc1xuIiwgcyk7CisgICAgU2V0UHJvcChQX01FU1NFTkdFUiwgcyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworLy8gUHJ1ZWZ0LCBvYiBkZXIgU3RyaW5nIHZlcm11dGxpY2ggZWluZSBlTWFpbC1BZHJlc3NlIGlzdC4KKy8vIGRpZXMgaXN0IG5pY2h0IG5hcnJlbnNpY2hlciwgd2lyZCBhYmVyIGRpZSBtZWlzdGVuIGVNYWlsLUFkcmVzc2VuIHp1bGFzc2VuCisvLyB1bmQgdmllbCBTY2hyb3R0IGFibGVobmVuLgorcHJpdmF0ZSBzdHJpbmcgY2hlY2tfZW1haWwoc3RyaW5nIHN0cikgeworICBpZiAoIXN0cmluZ3Aoc3RyKSkgcmV0dXJuIDA7CisgIHJldHVybiByZWdtYXRjaChsb3dlcl9jYXNlKHN0ciksCisgICAgICAiW2EtejAtOS5fJSstXStAKD86W2EtejAtOS1dK1wuKStbYS16XXsyLDR9IixSRV9QQ1JFKTsKK30KKworLyoqIFNldHp0IEVtYWlsLUFkcmVzc2UgZGVzIFNwaWVsZXJzIChTcGllbGVya29tbWFuZG8pLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICovCitzdGF0aWMgaW50IHNldF9lbWFpbChzdHJpbmcgc3RyKQoreworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICB3cml0ZSgiRGVpbmUgb2ZmaXppZWxsZSBFbWFpbC1BZHJlc3NlIGxhdXRldDogIiArIFF1ZXJ5UHJvcChQX01BSUxBRERSKQorICAgICAgICAgICsiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdHIgPSBjaGVja19lbWFpbChzdHIpOworICBpZiAoIXN0cikgeworICAgIG5vdGlmeV9mYWlsKCJEZWluZSBFaW5nYWJlIHNjaGVpbnQga2VpbmUgZ3VlbHRpZ2UgRU1haWwtQWRyZXNzZSAiCisgICAgICAgICJ6dSBzZWluLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgd3JpdGUoIkRlaW5lIEVNYWlsLUFkcmVzc2Ugd3VyZGUgZ2VhZW5kZXJ0IHp1OlxuIgorICAgICAgK3N0cisiXG4iKTsKKyAgU2V0UHJvcChQX01BSUxBRERSLCBzdHIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyAnc2VsYnN0bG9lc2NodW5nJy4KKyAgKiBHaWJ0IE1lbGR1bmcgYXVzIHVuZCBmcmFndCBuYWNoIGVpbmVyIEJlc3RhZXRpZ3VuZy4KKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKi8KK3N0YXRpYyBpbnQgc2VsZl9kZWxldGUoKQoreworICB3cml0ZSgKKyAgICAiICAgICBCIEkgUyBUICBEIFUgIEQgSSBSICBXIEkgUiBLIEwgSSBDIEggIFMgSSBDIEggRSBSID8/Pz8/Pz8/Pz8/P1xuIisKKyAgICAiV2VubiBEdSBEaWNoIHNlbGJzdGxvZXNjaGVuIHdpbGxzdCwgaXN0IERlaW4gQ2hhcmFrdGVyIFVOV0lERVJSVUZMSUNIXG4iKworICAgICJ2ZXJsb3Jlbi4gRXMgZ2lidCBLRUlORSBNb2VnbGljaGtlaXQgaWhuIHdpZWRlcnp1ZXJzY2hhZmZlbi4gU29sbHRlc3RcbiIrCisgICAgIkR1IG51ciB6ZWl0d2VpbGlnIHZvbSAiTVVETkFNRSIgd2VnYmxlaWJlbiB3b2xsZW4sIHNvIGJlbnV0emUgYml0dGVcbiIrCisgICAgImRlbiBCZWZlaGwgJ3NwaWVscGF1c2UnLlxuIisKKyAgICAiRmFsbHN0IER1IERpY2ggaW1tZXIgbm9jaCBzZWxic3Rsb2VzY2hlbiB3aWxsc3QsIGdpYiBEZWluIFBhc3N3b3JkIGVpbi4iKworICAgICJcblxuIik7CisgIGlucHV0X3RvKCJzZWxmX2RlbGV0ZTIiLElOUFVUX1BST01QVHxJTlBVVF9OT0VDSE8sICJCaXR0ZSBkYXMgUGFzc3dvcmQgYW5nZWJlbjogIik7CisgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICdzZWxic3Rsb2VzY2h1bmcnLgorICAqIEVtcGZhZW5ndCBCZXN0YWV0aWd1bmcgZGVzIFNwaWVsZXJzIHVuZCBydWZ0IExvZXNjaGZ1bmt0aW9uIGluIAorICAqIC9zZWN1cmUvbWFzdGVyIGF1Zi4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqLworaW50IHNlbGZfZGVsZXRlMihzdHJpbmcgc3RyKQoreworICBpbnQgcmV0OworICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmRlbGV0ZV9wbGF5ZXIoc3RyLCBnZXR1aWQoUEwpKTsKKyAgaWYgKCFyZXQpCisgIHsKKyAgICB3cml0ZSgiRGFzIGhhdCBuaWNodCBoaW5nZWhhdWVuIChHb3R0IHNlaSBEYW5rIC4uLi4pXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoUXVlcnlQcm9wKFBfR1VJTEQpJiZmaWxlX3NpemUoR1VJTERfRElSK1F1ZXJ5UHJvcChQX0dVSUxEKSsiLmMiKT4tMSkKKyAgICBjYXRjaChjYWxsX290aGVyKEdVSUxEX0RJUitRdWVyeVByb3AoUF9HVUlMRCksICJhdXN0cmV0ZW4iKTtwdWJsaXNoKTsKKworICBpZiAoUXVlcnlQcm9wKFBfREVBRFMpIDwgNSkgeworICAgIHdyaXRlKCJBZGlvcyEgTWFuIHNpZWh0IHNpY2guXG4iKTsKKyAgICBzYXkobmFtZShXRVIsMSkrIiBoYXQgc2ljaCBnZXJhZGUgc2VsYnN0IHplcnN0b2VydC5cbiIpOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKAorICAgICAgIlxuVG9kIGtvbW10IGF1ZiBzZWluZW0gd2Vpc3NlbiBQZmVyZCBhbmdlcml0dGVuLlxuIgorICAgICArIkVyIHN0ZWlndCBhYiwgYmF1dCBzaWNoIGRyb2hlbmQgdm9yIERpciBhdWYgdW5kIG11c3RlcnQgRGljaCBzY2hhZGVuZnJvaC5cbiIKKyAgICAgKyJcblRvZCBzYWd0OiBFTkRMSUNIISBOVU4gS0FOTiBESVIgQVVDSCBMQVJTIE5JQ0hUIE1FSFIgSEVMRkVOIVxuIgorICAgICArIlxuVG9kIGhvbHQgd2VpdCBtaXQgc2VpbmVyIFNlbnNlIGF1cy4gTWl0IGdyb3NzZW0gU2Nod3VuZyBsYWVzc3QgZXIgc2llIGF1ZlxuIgorICAgICArIkRpY2ggenVzYXVzZW4gdW5kIGRhbm4uLi5cbiIpOworICAgIHNheShuYW1lKFdFUiwxKSsiIHNjaGllZCBnZXJhZGUgZW5kZ3VlbHRpZyB2b24gdW5zLlxuIik7CisgIH0KKworICAvLyBFdmVudCBhdXNsb2VzZW4uIDstKQorICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfTElCX1BMQVlFUl9ERUxFVElPTiwgKFsKKyAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KCksCisgICAgICAgIEVfR1VJTEROQU1FOiBRdWVyeVByb3AoUF9HVUlMRCkgXSkgKTsKKworICByZW1vdmUoMSk7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgbmV1ZSB0YWVnbGljaGUgU3BpZWxkYXVlciAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqLworc3RhdGljIGludCBzcGllbGRhdWVyKHN0cmluZyBzdHIpIHsKKyAgaW50IG1pbixkYXk7CisgIHN0cmluZyBmb287CisKKyAgbm90aWZ5X2ZhaWwoIiAgc3BpZWxkYXVlciA8eD4gbWludXRlbiBmdWVyICVkIHRhZ2Vcbm9kZXJcbiIrCisgICAgICAgICAgICAgICIgIHNwaWVsZGF1ZXIgPHg+IHN0dW5kZW4gZnVlciAlZCB0YWdlXG4iKTsKKyAgaWYgKCFzdHIpCisgICAgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCIlZCBzdHVuZGUlcyBmdWVyICVkIHRhZyVzIixtaW4sZm9vLGRheSxmb28pPT00KQorICAgIG1pbio9NjA7CisgIGVsc2UgaWYgKHNzY2FuZihzdHIsIiVkIG1pbnV0ZSVzIGZ1ZXIgJWQgdGFnJXMiLG1pbixmb28sZGF5LGZvbykhPTQpCisgICAgcmV0dXJuIDA7CisgIGlmIChtaW48NSkKKyAgICBtaW49NTsKKyAgaWYgKG1pbj49MTQ0MCkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIldpdHpib2xkLlxuIiksMDsKKworICBTZXQoUF9EQUlMWV9QTEFZVElNRSwKKyAgICAgICh7bWluKjYwLHRpbWUoKS84NjQwMCtkYXksdGltZSgpLzg2NDAwLHRpbWUoKSxtaW4qNjB9KSk7CisgIC8vIDA6TWludXRlbiBwcm8gVGFnLCAxOk5yLiBkZXMgbGV0emVuIFRhZ2VzLCAyOk5yLiBkZXMgYW5nZWZhbmdlbmVuIFRhZ2VzLAorICAvLyAzOmxldHp0ZSBaZWl0cHJ1ZWZ1bmcsIDQ6dmVyYmxlaWJlbmRlIFplaXQKKyAgcHJpbnRmKCJEdSBkYXJmc3QgZGllIG5hZWNoc3RlbiAlZCBUYWcoZSkgbnVyIG5vY2hcbiIrCisgICAiJWQgTWludXRlbiBhbSBUYWcgbXVkZGVuLlxuIixkYXksbWluKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBJbnRlcnByZXRpZXJ0IEFuZ2FiZSBkZXMgU3BpZWxlcnMgZnVlciBTcGllbHBhdXNlLgorICAqIFxwYXJhbVtpbl0gYSBaZWl0YW5nYWJlIGZ1ZXIgU3BpZWxwYXVzZS4KKyAgKiBccmV0dXJuIFplaXRwdW5rdCwgRW5kZSBkZXIgU3BpZWxwYXVzZS4KKyAgKi8KK3ByaXZhdGUgaW50IEludGVycHJldFRpbWUoc3RyaW5nIGEpeworICAvLyBha3plcHRpZXJ0IGZvbGdlbmRlIEZvcm1hdGU6CisgIC8vICAgZGQubW0uamogICAgIChSdWVja2dhYmU6IDA6MDAgZGVzIGVudHNwcmVjaGVuZGVuIFRhZ2VzKQorCisgIGludCAqdHMgPSBhbGxvY2F0ZSg5KTsKKyAgaW50IGksaixrLG5yYXJnczsKKworICBpZiAoKG5yYXJncz1zc2NhbmYoYSwiJWQuJWQuJWQiLGksaixrKSk9PTMgfHwKKyAgICAgIChucmFyZ3M9c3NjYW5mKGEsIiVkLiVkLiIsaSxqKSk9PTIpIHsKKyAgICAvLyB3ZW5uIGtlaW4gamFociBhbmdlZ2ViZW4gaXN0LCBkYXMgYWt0dWVsbGUgbmVobWVuLgorICAgIGlmIChucmFyZ3MgPT0gMikKKyAgICAgICB0c1tUTV9ZRUFSXSA9IGxvY2FsdGltZSgpW1RNX1lFQVJdOworICAgIGVsc2UgeworICAgICAgIC8vIFp3ZWktWmlmZmVybi1BbmdhYmUgZGVzIEphaHJlcy4uLgorICAgICAgIGlmIChrPDEwMCkKKyAgICAgICAgICAgayArPSAyMDAwOworICAgICAgIHRzW1RNX1lFQVJdID0gazsKKyAgICB9CisgICAgdHNbVE1fTURBWV0gPSBpOworICAgIHRzW1RNX01PTl0gPSBqIC0gMTsKKworICAgIGludCB6ZWl0ID0gbWt0aW1lKHRzKTsKKworICAgIC8vIG5lZ2F0aXZlIHVuZCB2ZXJnYW5nZW5lIFplaXRlbiBwcnVlZmVuLgorICAgIGlmICh6ZWl0IDw9IHRpbWUoKSkgeworICAgICAgd3JpdGUoIkRpZXNlciBaZWl0cHVua3QgbGllZ3QgaW4gZGVyIFZlcmdhbmdlbmhlaXQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gemVpdDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIFNldHp0IG5ldWUgU3BpZWxwYXVzZSAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBGcmFndCB2b3JoZXIgbmFjaCBCZXN0YWV0aWd1bmcgZHVyY2ggZGVuIFNwaWVsZXIuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBcc2Egc3BpZWxwYXVzZTIoKQorICAqLworc3RhdGljIGludCBzcGllbHBhdXNlKHN0cmluZyBzdHIpCit7CisgIGludCBkYXlzLGVuZGV6ZWl0OworICBzdHJpbmcgZm9vOworCisgIG5vdGlmeV9mYWlsKCJzcGllbHBhdXNlIDx4PiB0YWdlICAgICAgICAgIG9kZXJcbiIrCisgICAgICAgICAgICAgICJzcGllbHBhdXNlIGJpcyB0dC5tbVsuampdXG4iKTsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBpZihzc2NhbmYoX3VucGFyc2VkX2FyZ3MoKSwiYmlzICVzIixmb28pPT0xKSB7CisgICAgZW5kZXplaXQgPSBJbnRlcnByZXRUaW1lKGZvbyk7CisgICAgaWYgKGVuZGV6ZWl0ID09IDApIAorICAgICAgICByZXR1cm4gMDsKKyAgICBkYXlzID0gKChlbmRlemVpdCAtIHRpbWUoKSkgLyA4NjQwMCkgKyAxOworICB9CisgIGVsc2UgaWYoc3NjYW5mKHN0ciwgIiVkIHRhZyVzIiwgZGF5cywgZm9vKSA9PSAyKSB7CisgICAgaWYgKGRheXMgPCAwKQorICAgICAgICBkYXlzID0gLTE7CisgICAgZWxzZQorICAgICAgICBlbmRlemVpdCA9ICh0aW1lKCkvODY0MDApICogODY0MDAgKyBkYXlzICogODY0MDA7CisgIH0KKyAgZWxzZSByZXR1cm4gMDsKKworICBpZiAoZGF5cyA+IDApCisgICAgd3JpdGUoc3RyZnRpbWUoIkR1IHdpcnN0IERpY2ggZXJzdCB3aWVkZXIgYW0gJWQuJW0uJVkgZWlubG9nZ2VuIGtvZW5uZW4hXG4iLAorICAgICAgICAgIGVuZGV6ZWl0KSk7CisgIGVsc2UgaWYgKGRheXMgPCAwKQorICAgIHdyaXRlKCAiRHUgd2lyc3QgRGljaCBhdWYgdW5iZXN0aW1tdGUgWmVpdCBuaWNodCBtZWhyIGVpbmxvZ2dlbiBrb2VubmVuLlxuIgorICAgICAgICAgICsiV2VubiBEdSB3aWVkZXIgc3BpZWxlbiB3aWxsc3QsIG11c3N0IER1IERpY2ggYW4gZWluZW4gR290dCBvZGVyXG4iCisgICAgICAgICAgKyJFcnptYWdpZXIgd2VuZGVuIChtaXQgZWluZW0gR2FzdCBvZGVyIE1haWwgdm9uIGF1c3NlbikuXG4iICk7CisgIGVsc2UgeworICAgIHdyaXRlKCAiRGllIFNwaWVscGF1c2UgaXN0IGF1ZmdlaG9iZW4uXG4iICk7CisgICAgbWFzdGVyKCktPlRCYW5pc2hOYW1lKGdldHVpZCh0aGlzX29iamVjdCgpKSwgMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoICJXZW5uIER1IGRhcyB3aXJrbGljaCB3aWxsc3QsIGdpYiBqZXR6dCAnamEnIGVpbi5cbiIgKTsKKyAgaW5wdXRfdG8oICJzcGllbHBhdXNlMiIsIElOUFVUX1BST01QVCwgIl0iLCBkYXlzKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBuZXVlIHRhZWdsaWNoZSBTcGllbGRhdWVyLCB3aXJkIHVlYmVyIHNwaWVscGF1c2UoKSBnZXJ1ZmVuLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlLCBCZXN0YWV0aWd1bmcKKyAgKiBccGFyYW1baW5dIGRheXMgRGF1ZXIgZGVyIFNwaWVscGF1c2UgKGluIFRhZ2VuKS4KKyAgKiBcc2Egc3BpZWxwYXVzZSgpCisgICovCitzdGF0aWMgdm9pZCBzcGllbHBhdXNlMihzdHJpbmcgc3RyLCBpbnQgZGF5cykKK3sKKyAgaWYgKHN0ciAmJiAoc3RyID09ICJqYSIgfHwgc3RyID09ICJKYSIgfHwgc3RyID09ICJKQSIpKSB7CisgICAgbWFzdGVyKCktPlRCYW5pc2hOYW1lKGdldHVpZCh0aGlzX29iamVjdCgpKSwgZGF5cyk7CisgICAgd3JpdGUoCisgICAgICAiT2ssIGRpZSBTcGllbHBhdXNlIHdpcmQgbWl0IGRlbSBuYWVjaHN0ZW4gQXVzbG9nZ2VuIHdpcmtzYW0uXG4iCisgICAgICsiU29sbHRlc3QgRHUgZXMgRGlyIGJpcyBkYWhpbiBub2NoIGVpbm1hbCB1ZWJlcmxlZ3QgaGFiZW4sIHNvIGthbm5zdFxuIgorICAgICArIkR1IGRlbiBWb3JnYW5nIG1pdCAnc3BpZWxwYXVzZSAwIHRhZ2UnIHdpZWRlciBydWVja2dhZW5naWcgbWFjaGVuLlxuIiApOworICAgIHJldHVybjsKKyAgfQorICB3cml0ZSgiVm9yZ2FuZyB3dXJkZSBhYmdlYnJvY2hlbi5cbiIgKTsKK30KKworLyoqIFNldHp0IG5ldWVzIFBhc3N3b3J0IChTcGllbGVya29tbWFuZG8pLgorICAqIEZyYWd0IG5hY2ggYWx0ZW0gUGFzc3dvcnQgdW5kIHJ1ZnQgY2hhbmdlX3Bhc3N3b3JkMigpLgorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIFxzYSBjaGFuZ2VfcGFzc3dvcmQyKCksIGNoYW5nZV9wYXNzd29yZDMoKSwgY2hhbmdlX3Bhc3N3b3JkNCgpCisgICovCitzdGF0aWMgaW50IGNoYW5nZV9wYXNzd29yZCgpIHsKKyAgc3RyaW5nIHZlcmI7CisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAodmVyYiE9InBhc3N3ZCImJnZlcmIhPSJwYXNzd29yZCImJnZlcmIhPSJwYXNzd29ydCIpCisgICAgcmV0dXJuIDA7CisgIGlucHV0X3RvKCJjaGFuZ2VfcGFzc3dvcmQyIixJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgIkJpdHRlIGRhcyBBTFRFIFBhc3N3b3J0IGFuZ2ViZW46ICIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IG5ldWVzIFBhc3N3b3J0IChTcGllbGVya29tbWFuZG8pLgorICAqIFBydWVmdCBhbHRlcyBQYXNzd29ydCwgZnJhZ3QgbmFjaCBuZXVlbSBQYXNzd29ydCB1bmQgcnVmdCAKKyAgKiAgIGNoYW5nZV9wYXNzd29yZDMoKS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBkZXMgYWx0ZW4gUGFzc3dvcnRlcworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIFxzYSBjaGFuZ2VfcGFzc3dvcmQoKSwgY2hhbmdlX3Bhc3N3b3JkMygpLCBjaGFuZ2VfcGFzc3dvcmQ0KCkKKyAgKi8KK3N0YXRpYyBpbnQgY2hhbmdlX3Bhc3N3b3JkMihzdHJpbmcgc3RyKSB7CisgIHdyaXRlKCJcbiIpOworICBpZiAoIXN0cikKKyAgICBzdHI9IiI7CisgIGlmIChNQVNURVItPnVwZGF0ZV9wYXNzd29yZChzdHIsc3RyKSA9PSAwKSB7CisgICAgd3JpdGUoIkZhbHNjaGVzIFBhc3N3b3J0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcGFzc3dvbGQgPSBzdHI7CisgIGlucHV0X3RvKCJjaGFuZ2VfcGFzc3dvcmQzIixJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgIkJpdHRlIGRhcyBORVVFIFBhc3N3b3J0IGVpbmdlYmVuOiAiKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBuZXVlcyBQYXNzd29ydCAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBQcnVlZnQgbmV1ZXMgUGFzc3dvcnQsIGZyYWd0IG5hY2ggQmVzdGFldGlndW5nIGRlcyBuZXVlcworICAqIFBhc3N3b3J0ZXMgdW5kIHJ1ZnQgY2hhbmdlX3Bhc3N3b3JkNCgpLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlcyBuZXVlbiBQYXNzd29ydGVzCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogXHNhIGNoYW5nZV9wYXNzd29yZCgpLCBjaGFuZ2VfcGFzc3dvcmQyKCksIGNoYW5nZV9wYXNzd29yZDQoKQorICAqLworc3RhdGljIGludCBjaGFuZ2VfcGFzc3dvcmQzKCBzdHJpbmcgc3RyICkKK3sKKyAgICB3cml0ZSggIlxuIiApOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApeworICAgICAgICB3cml0ZSggIkFiZ2Vicm9jaGVuICFcbiIgKTsKKyAgICAgICAgcGFzc3dvbGQgPSBwYXNzdyA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggcGFzc3dvbGQgPT0gc3RyICl7CisgICAgICAgIHdyaXRlKCAiRGFzIHdhciBEZWluIGFsdGVzIFBhc3N3b3J0LlxuIiApOworICAgICAgICBpbnB1dF90byggImNoYW5nZV9wYXNzd29yZDMiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAgICAgIkJpdHRlIGRhcyBORVVFIFBhc3N3b3J0IGVpbmdlYmVuICh6dW0gQWJicnVjaCBSZXR1cm4gZHJ1ZWNrZW4pOiAiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCAhTUFTVEVSLT5nb29kX3Bhc3N3b3JkKCBzdHIsIGdldHVpZChNRSkgKSApeworICAgICAgICBpbnB1dF90byggImNoYW5nZV9wYXNzd29yZDMiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAgICAgIkJpdHRlIGRhcyBORVVFIFBhc3N3b3J0IGVpbmdlYmVuOiAiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcGFzc3cgPSBzdHI7CisgICAgaW5wdXRfdG8oICJjaGFuZ2VfcGFzc3dvcmQ0IiwgSU5QVVRfTk9FQ0hPfElOUFVUX1BST01QVCwKKyAgICAgICAgIkJpdHRlIG5vY2htYWw6ICIpOworICAgIHJldHVybiAxOworfQorCisvKiogU2V0enQgbmV1ZXMgUGFzc3dvcnQgKFNwaWVsZXJrb21tYW5kbykuCisgICogUHJ1ZWZ0IG5ldWVzIFBhc3N3b3J0IHVuZCBzZXR6dCBuZXVlcyBQYXNzd29ydC4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBkZXMgbmV1ZW4gUGFzc3dvcnRlcworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIFxzYSBjaGFuZ2VfcGFzc3dvcmQoKSwgY2hhbmdlX3Bhc3N3b3JkMigpLCBjaGFuZ2VfcGFzc3dvcmQzKCkKKyAgKi8KK3N0YXRpYyBpbnQgY2hhbmdlX3Bhc3N3b3JkNCggc3RyaW5nIHN0ciApCit7CisgICAgd3JpdGUoICJcbiIgKTsKKworICAgIGlmICggIXN0ciB8fCBzdHIgIT0gcGFzc3cgKXsKKyAgICAgICAgd3JpdGUoICJEYXMgd2FyIHZlcnNjaGllZGVuISBQYXNzd29ydCBOSUNIVCBnZWFlbmRlcnQuXG4iICk7CisgICAgICAgIHBhc3N3b2xkID0gcGFzc3cgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIE1BU1RFUi0+dXBkYXRlX3Bhc3N3b3JkKCBwYXNzd29sZCwgcGFzc3cgKSApCisgICAgICAgIHdyaXRlKCAiUGFzc3dvcnQgZ2VhZW5kZXJ0LlxuIiApOworICAgIGVsc2UKKyAgICAgICAgd3JpdGUoICJIYXQgbmljaHQgZ2VrbGFwcHQhXG4iICk7CisKKyAgICBwYXNzd29sZCA9IHBhc3N3ID0gMDsKKyAgICByZXR1cm4gMTsKK30KKworCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUnVlY2ttZWxkdW5nZW4gdm9uIFNwaWVsZXJuIGFuIE1hZ2llcgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IGZlaGxlcmhpbGZlKHN0cmluZyBzdHIpIHsKKyAgd3JpdGUoIldlbGNoZSBBcnQgdm9uIEZlaGxlciBtb2VjaHRlc3QgRHUgZGVubiBtZWxkZW4/XG4iCisgICAgICAiRmVobGZ1bmt0aW9uZW4gICAgLT4gIGJ1Z1xuIgorICAgICAgIklkZWVuL0FucmVndW5nZW4gIC0+ICBpZGVlXG4iCisgICAgICAiVGlwcGZlaGxlci9UeXBvcyAgLT4gIHR5cG9cbiIKKyAgICAgICJmZWhsZW5kZSBEZXRhaWxzICAtPiAgZGV0YWlsXG4iKTsKKworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IGVpbmUgRmVobGVybWVsZHVuZyBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogRnJhZ3QgbmFjaCBkZXIgRmVobGVybWVsZHVuZyB1bmQgbGllc3Qgc2llIHZpYSBidWcyKCkgZWluLCBmYWxsIGRlcgorICAqIFNwaWVsZXIga2VpbiBBcmd1bWVudCBhbmdlYmVuIGhhdC4KKyAgKiBccGFyYW1baW5dIHN0ciBvcHRpb25hbGUgU3BpZWxlcmVpbmdhYmUgZGVyIEZlaGxlcmJlc2NocmVpYnVuZworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgYnVnMihzdHJpbmcpCisgICovCitzdGF0aWMgaW50IGJ1ZyhzdHJpbmcgc3RyKSB7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIHdyaXRlKCAiV2llIHNpZWh0IGRlciBGZWhsZXIgZGVubiBhdXM/XG4iICk7CisgICAgaW5wdXRfdG8oImJ1ZzIiLCBJTlBVVF9QUk9NUFQsICJdIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiQlVHUyIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW5lIEZlaGxlcm1lbGR1bmcgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIExpZXMgRmVobGVyYmVzY2hyZWlidW5nIGVpbiB1bmQgc3BlaWNoZXJ0IHNpZSBhYi4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBkZXIgRmVobGVyYmVzY2hyZWlidW5nLgorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgYnVnKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgYnVnMihzdHJpbmcgc3RyKSB7CisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIHdyaXRlKCJCdWcgYWJnZWJyb2NoZW4uLi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJWaWVsZW4gRGFuayBmdWVyIGRpZSBIaWxmZS5cbiIpOworICBzbWFydF9sb2coIkJVR1MiLHN0cik7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgZWluZSBUeXBvbWVsZHVuZyBhbiBNYWdpZXIgYWIgKFNwaWVsZXJrb21tYW5kbykuCisgICogRnJhZ3QgbmFjaCBkZXIgVHlwb21lbGR1bmcgdW5kIGxpZXN0IHNpZSB2aWEgdHlwbzIoKSBlaW4sIGZhbGwgZGVyCisgICogU3BpZWxlciBrZWluIEFyZ3VtZW50IGFuZ2ViZW4gaGF0LgorICAqIFxwYXJhbVtpbl0gc3RyIG9wdGlvbmFsZSBTcGllbGVyZWluZ2FiZSBkZXIgVHlwb2Jlc2NocmVpYnVuZworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgdHlwbzIoc3RyaW5nKQorICAqLworc3RhdGljIGludCB0eXBvKHN0cmluZyBzdHIpIHsKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKSB7CisgICAgd3JpdGUoICJXbyBpc3QgZGVubiBkZXIgVGlwcGZlaGxlcj9cbiIgKTsKKyAgICBpbnB1dF90bygidHlwbzIiLCBJTlBVVF9QUk9NUFQsICJdIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiVFlQTyIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW5lIEZlaGxlcm1lbGR1bmcgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIExpZXN0IGRpZSBUeXBvYmVzY2hyZWlidW5nIGVpbiB1bmQgc3BlaWNoZXJ0IHNpZS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBkZXIgVHlwb2Jlc2NocmVpYnVuZworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgdHlwbyhzdHJpbmcpCisgICovCitzdGF0aWMgaW50IHR5cG8yKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIlR5cG8gYWJnZWJyb2NoZW4uLi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHNtYXJ0X2xvZygiVFlQTyIsc3RyKTsKKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgZWluZSBJZGVlIGFuIE1hZ2llciBhYiAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBGcmFndCBuYWNoIGRlciBJZGVlIHVuZCBsaWVzdCBzaWUgdmlhIGlkZWUyKCkgZWluLCBmYWxscyBkZXIKKyAgKiBTcGllbGVyIGtlaW4gQXJndW1lbnQgYW5nZWJlbiBoYXQuCisgICogXHBhcmFtW2luXSBzdHIgb3B0aW9uYWxlIFNwaWVsZXJlaW5nYWJlIGRlciBJZGVlCisgICogXHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHNlZSBpZGVhMihzdHJpbmcpCisgICovCitzdGF0aWMgaW50IGlkZWEoc3RyaW5nIHN0cikgeworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICB3cml0ZSggIldhcyBmdWVyIGVpbmUgSWRlZSBoYXN0IER1IGRlbm4/XG4iICk7CisgICAgaW5wdXRfdG8oImlkZWEyIixJTlBVVF9QUk9NUFQsICJdIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIlZpZWxlbiBEYW5rIGZ1ZXIgZGllIEhpbGZlLlxuIik7CisgIHNtYXJ0X2xvZygiSURFQSIsc3RyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTZXR6dCBlaW5lIElkZWUgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIExpZXN0IGRpZSBJZGVlIGVpbiB1bmQgc3BlaWNoZXJ0IHNpZS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZSBkZXIgSWRlZQorICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgaWRlYShzdHJpbmcpCisgICovCitzdGF0aWMgaW50IGlkZWEyKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIklkZWUgYWJnZWJyb2NoZW4uLi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJWaWVsZW4gRGFuayBmdWVyIGRpZSBIaWxmZS5cbiIpOworICBzbWFydF9sb2coIklERUEiLHN0cik7CisgIHJldHVybiAxOworfQorCisvKiogU2V0enQgZWluIGZlaGxlbmRlcyBEZXRhaWwgYW4gTWFnaWVyIGFiIChTcGllbGVya29tbWFuZG8pLgorICAqIEZyYWd0IG5hY2ggZGVtIERldGFpbCB1bmQgbGllc3QgZXMgdmlhIGlkZWUyKCkgZWluLCBmYWxscyBkZXIKKyAgKiBTcGllbGVyIGtlaW4gQXJndW1lbnQgYW5nZWJlbiBoYXQuCisgICogXHBhcmFtW2luXSBzdHIgb3B0aW9uYWxlIFNwaWVsZXJlaW5nYWJlIGRlcyBmZWhsZW5kZW4gRGV0YWlscworICAqIFxyZXR1cm4gMSBiZWkgRXJmb2xnLCAwIHNvbnN0LgorICAqIEBzZWUgbWQyKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgbWQoc3RyaW5nIHN0cikgeworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICB3cml0ZSggIkZ1ZXIgd2VsY2hlcyBEZXRhaWwgZmVobHQgZGVubiBkaWUgQmVzY2hyZWlidW5nP1xuIiApOworICAgIGlucHV0X3RvKCJtZDIiLElOUFVUX1BST01QVCwgIl0iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiVmllbGVuIERhbmsgZnVlciBkaWUgSGlsZmUuXG4iKTsKKyAgc21hcnRfbG9nKCJERVRBSUxTIixzdHIpOworICByZXR1cm4gMTsKK30KKworLyoqIFNldHp0IGVpbiBmZWhsZW5kZXMgRGV0YWlsIGFuIE1hZ2llciBhYiAoU3BpZWxlcmtvbW1hbmRvKS4KKyAgKiBMaWVzdCBkYXMgRGV0YWlsIGVpbiB1bmQgc3BlaWNoZXJ0IGVzLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIGRlcyBmZWhsZW5kZW4gRGV0YWlscy4KKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBAc2VlIG1kKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgbWQyKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFzdHIgfHwgc3RyID09ICIiKSB7CisgICAgd3JpdGUoIkRldGFpbHMgYWJnZWJyb2NoZW4uLi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJWaWVsZW4gRGFuayBmdWVyIGRpZSBIaWxmZS5cbiIpOworICBzbWFydF9sb2coIkRFVEFJTFMiLHN0cik7CisgIHJldHVybiAxOworfQorCisvKiogTG9nZ3QgZWluZSBTcGllbGVybWVsZHVuZyBhbiBNYWdpZXIuCisgICogTG9nZ3QgZGllIFNwaWVsZXJtZWxkdW5nIGluIGRhcyBwYXNzZW5kZSBGaWxlIHVudGVyIC9sb2cvcmVwb3J0LyBvZGVyIGltCisgICogdm9tIE1hZ2llciBnZXd1ZW5zY2h0ZW4gRmlsZS4gSGllcmJlaSB3ZXJkZW4gRmVobGVyLCBJZGVlbiwgTURzIHVuZCBUeXBvcworICAqIGluIGdldHJlbm50ZSBGaWxlcyBzb3J0aWVydC4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVybWVsZHVuZworICAqIFxwYXJhbVtpbl0gbXluYW1lIEFydCBkZXIgU3BpZWxlcm1lbGR1bmcgKERFVEFJTFMsIEJVRywgVFlQTywgTUQpCisgICogQHNlZSBtZChzdHJpbmcpLCBpZGVhKHN0cmluZyksIGJ1ZyhzdHJpbmcpLCB0eXBvKHN0cmluZykKKyAgKi8KK3ZvaWQgc21hcnRfbG9nKHN0cmluZyBteW5hbWUsIHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBvYm5hbTsKKyAgb2JqZWN0IG9iajsKKworICBzdHJpbmcgKnRtcCA9IGV4cGxvZGUoc3RyLCAiOiIpOworICBpZiAoc2l6ZW9mKHRtcCkgPiAxKSB7CisgICAgb2JuYW0gPSBsb3dlcl9jYXNlKHRyaW0odG1wWzBdKSk7CisgICAgb2JqID0gcHJlc2VudChvYm5hbSwgZW52aXJvbm1lbnQoKSkgfHwgcHJlc2VudChvYm5hbSk7CisgICAgaWYgKCFvYmopIHsKKyAgICAgIG9iaiA9IGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpOworICAgIH0KKyAgICBlbHNlIC8vIG51ciBoaWVyIFRlaWwgdm9yIGRlbSA6IHdlZ3NjaG5laWRlbgorICAgICAgc3RyID0gdHJpbShpbXBsb2RlKHRtcFsxLi5dLCI6IikpOworICB9CisgIGVsc2UgeworICAgIG9iaiA9IFF1ZXJ5UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QpOworICAgIGlmICghb2JqIHx8ICFwcmVzZW50KG9iaikpCisgICAgICBvYmogPSBlbnZpcm9ubWVudCh0aGlzX2ludGVyYWN0aXZlKCkpOworICB9CisKKyAgbWFwcGluZyBlcnIgPSAoWyBGX1BST0c6ICJ1bmJla2FubnQiLAorICAgICAgICAgICBGX0xJTkU6IDAsCisgICAgICAgICAgIEZfTVNHOiBzdHIsCisgICAgICAgICAgIEZfT0JKOiBvYmoKKyAgICAgICAgIF0pOworCisgIHN0cmluZyBkZXNjPSJldHdhcyB1bmJla2FubnRlcyI7CisgIHN3aXRjaChteW5hbWUpIHsKKyAgICBjYXNlICJCVUdTIjoKKyAgICAgIGRlc2M9ImVpbmVuIEZlaGxlciI7CisgICAgICBlcnJbRl9UWVBFXT1UX1JFUE9SVEVEX0VSUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIkRFVEFJTFMiOgorICAgICAgZGVzYz0iZWluIGZlaGxlbmRlcyBEZXRhaWwiOworICAgICAgZXJyW0ZfVFlQRV09VF9SRVBPUlRFRF9NRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIklERUEiOgorICAgICAgZGVzYz0iZWluZSBJZGVlIjsKKyAgICAgIGVycltGX1RZUEVdPVRfUkVQT1JURURfSURFQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIlRZUE8iOgorICAgICAgZGVzYz0iZWluZW4gVHlwbyI7CisgICAgICBlcnJbRl9UWVBFXT1UX1JFUE9SVEVEX1RZUE87CisgICAgICBicmVhazsKKyAgfQorCisgIC8vIEVpbnRyYWd1bmcgaW4gZGllIEZlaGxlci1EQgorICBzdHJpbmcgaGFzaGtleSA9IChzdHJpbmcpRVJST1JELT5Mb2dSZXBvcnRlZEVycm9yKGVycik7CisKKyAgLy8gZ2dmLiB3aWxsIGRhcyBPYmpla3RlIG1pdCBub2NoIGlyZ2VuZHdhcyBhbmZhbmdlbi4KKyAgb2JqLT5TbWFydExvZygwLCBteW5hbWUsIHN0ciwgc3RyZnRpbWUoIiVkLiAlYiAlWSIpKTsKKworICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBicmVha19zdHJpbmcoIHNwcmludGYoCisgICAgIkR1IGhhc3QgYW4gJXMgZXJmb2xncmVpY2ggJXMgYWJnZXNldHp0LlxuIgorICAgICJEaWUgSUQgZGVyIGFiZ2VzZXR6dGVuIE1lbGR1bmcgbGF1dGV0OiAlc1xuIiwKKyAgICAob2JqLT5Jc1Jvb20oKSA/ICJkaWVzZW0gUmF1bSIgOiBvYmotPm5hbWUoV0VNLDEpKSxkZXNjLAorICAgIGhhc2hrZXl8fCJOL0EiKSw3OCxCU19MRUFWRV9NWV9MRlMpKTsKK30KKworLyoqIFNwZWljaGVydCBkZW4gU3BpZWxlciB1bmQgbG9nZ3QgaWhuIGF1cyAoU3BpZWxlcmtvbW1hbmRvICdlbmRlJykuCisgICogRGVyIFNwaWVsZXIgd2lyZCB2b2xsc3RhZW5kaWcgYXVzZ2Vsb2dndCwgZC5oLiBkYXMgU3BpZWxlcm9iamVrdAorICAqIHplcnN0b2VydC4KKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBAc2VlIGRpc2Nvbm5lY3QoKQorICAqLworaW50IHF1aXQoKQoreworICBpbnQgYXJnOworICBTZXRQcm9wKFBfTEFTVF9RVUlULHRpbWUoKSk7CisgIGNhdGNoKFJlbW92ZUNoYW5uZWxzKCk7cHVibGlzaCk7CisgIGlmKCFRdWVyeUd1ZXN0KCkpCisgIHsKKyAgICBzYXZlX21lKDApOworICAgIHRlbGxfb2JqZWN0KE1FLCJTcGVpY2hlcmUgIitRdWVyeVByb3AoUF9OQU1FKSsiLlxuIik7CisgIH0KKworICBpZiAoaW50ZXJhY3RpdmUoTUUpKQorICAgIGNhbGxfbm90aWZ5X3BsYXllcl9jaGFuZ2UoMCk7CisKKyAgcmVtb3ZlX2xpdmluZ19uYW1lKCk7CisgIC8vIEVWVF9MSUJfTE9HT1VUIHdpcmQgaW4gcmVtb3ZlKCkgZ2V0cmlnZ2VydC4KKyAgaWYoY2F0Y2gocmVtb3ZlKCk7cHVibGlzaCkpIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBXcmFwcGVyIGltIHF1aXQoKSBoZXJ1bSwgdmVyaGluZGVydCAnZW5kZScsIGZhbGxzIFNwaWVsZXIga2FlbXBmdC4KKyAgKiBccmV0dXJuIDAgb2RlciBSdWVja2dhYmV3ZXJ0IHZvbiBxdWl0KCkKKyAgKiBAc2VlIHF1aXQoKQorICAqLworc3RhdGljIGludCBuZXdfcXVpdCgpIHsKKyAgbm90aWZ5X2ZhaWwoIkR1IGJpc3QgaW4gR2VkYW5rZW4gbm9jaCBiZWkgRGVpbmVtIGxldHp0ZW4gS2FtcGYuXG4iKworICAgICAgICAgICAgICAiV2FydGUgbm9jaCBldHdhcyBiZXZvciBEdSBkYXMgU3BpZWwgdmVybGFlc3N0LFxuIisKKyAgICAgICAgICAgICAgImRhbWl0IER1IHNvIG5pY2h0IGluIFJMIHdlaXRlcm1hY2hzdC4uLlxuIik7CisgIGlmICh0aW1lKCktUXVlcnkoUF9MQVNUX0NPTUJBVF9USU1FKTwxMjAgJiYgIUlTX0xFQVJOSU5HKE1FKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHF1aXQoKTsKK30KKworLyoqIEdpYnQgZGllIEluZm9zIHVlYmVyIGRlbiBDaGFyIGFuIGRlbiBTcGllbGVyIGF1cyAoU3BpZWxlcmtvbW1hbmRvICdpbmZvJykuCisgICogXHBhcmFtW2luXSBhcmcgV2VubiBhcmc9PSJzaG9ydCIsIHdpcmQgZWluZSBLdXJ6dWViZXJzaWNodCBhdXNnZWdlYmVuLgorICAqIFxyZXR1cm4gMQorICAqIEBzZWUgc2hvcnRfc2NvcmUoKQorICAqLworc3RhdGljIGludCBzY29yZShzdHJpbmcgYXJnKSB7CisgIHN0cmluZyB0bXAsIGdlbmRlcjsKKyAgaW50IGksc3osdmFsOworICBtaXhlZCBpbmQ7CisgIG9iamVjdCAqZW5lbTEsICplbmVtMiwgKmludjsKKworICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgd3JpdGUoIkltIGV3aWdlbiBMZWJlbiBnaWJ0IGVzIGtlaW5lIFB1bmt0ZS5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaW50IHBsZXYgPSBMRVBNQVNURVItPlF1ZXJ5TGV2ZWwoKTsKKyAKKyAgc3dpdGNoKHRtcCA9IFF1ZXJ5UHJvcChQX0dFTkRFUikpIHsKKyAgY2FzZSBNQUxFOiBnZW5kZXIgPSAibWFlbm5saWNoIjsgYnJlYWs7CisgIGNhc2UgRkVNQUxFOiBnZW5kZXIgPSAid2VpYmxpY2giOyBicmVhazsKKyAgY2FzZSBORVVURVI6IGdlbmRlciA9ICJuZXV0cmFsIjsgYnJlYWs7CisgIGRlZmF1bHQ6IGdlbmRlciA9IGxvd2VyX2Nhc2UodG1wKTsKKyAgfQorCisgIGluZCA9IG1faW5kaWNlcyhRdWVyeVByb3AoUF9BVFRSSUJVVEVTKSk7CisgIHRtcCA9ICIiOworICBmb3JlYWNoKHN0cmluZyBpbmRleDogaW5kKSB7CisgICAgc3RyaW5nIGFuYW1lOworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgIGNhc2UgImludCI6IGFuYW1lID0gIkludGVsbGlnZW56IjsgYnJlYWs7CisgICAgICBjYXNlICJjb24iOiBhbmFtZSA9ICJBdXNkYXVlciI7IGJyZWFrOworICAgICAgY2FzZSAiZGV4IjogYW5hbWUgPSAiR2VzY2hpY2tsaWNoa2VpdCI7IGJyZWFrOworICAgICAgY2FzZSAic3RyIjogYW5hbWUgPSAiS3JhZnQiOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmKHN0cmluZ3AoaW5kZXgpKSBhbmFtZSA9IGNhcGl0YWxpemUoaW5kZXgpOworICAgICAgICBlbHNlIGFuYW1lID0gIlVuYmVrYW5udCI7CisgICAgfQorICAgIGFuYW1lID0gc3ByaW50ZigiJS0xOCcuJ3MgJTIuMmQiLCBhbmFtZSsiICIsIFF1ZXJ5UmVhbEF0dHJpYnV0ZShpbmRleCkpOworICAgIGlmKCh2YWwgPSBRdWVyeUF0dHJpYnV0ZU9mZnNldChpbmRleCkpKQorICAgICAgYW5hbWUgKz0gc3ByaW50ZigiICglcyVkKSIsICh2YWw+PTA/IisiOiIiKSwgdmFsKTsKKyAgICB0bXAgKz0gYW5hbWUgKyAiXG4iOworICB9CisKKyAgcHJpbnRmKCItICUtJy0nNjhzXG4iLAorICAgICAgICAgVGVhbVByZWZpeCgpK2NhcGl0YWxpemUoaW1wbG9kZShleHBsb2RlKHNob3J0KCl8fCIiLCJcbiIpLCIiKSkrIiAiKTsKKyAgaWYoYXJnIT0ic2hvcnQiKSB7CisgICAgcHJpbnRmKCJSYXNzZSAuLi4uLi4uLi4uLi4gJS0nICcxOHMgQWJlbnRldWVyIC4uLi4uLi4uICVkICVzXG4iLAorICAgICAgICAgICBRdWVyeVByb3AoUF9SQUNFKSwgUXVlcnlQcm9wKFBfUVApLAorICAgICAgICAgICAodmFsID0gUU0tPlF1ZXJ5VG90YWxRUCgpKSA9PSBRdWVyeVByb3AoUF9RUCkgPyAiIiA6ICIoIit2YWwrIikiKTsKKyAgICBwcmludGYoIkdlc2NobGVjaHQgLi4uLi4uLiAlLScgJzE4cyBHcm9lc3NlIC4uLi4uLi4uLi4gJWQgY21cbiIsCisgICAgICAgICAgIGdlbmRlciwgUXVlcnlQcm9wKFBfU0laRSkpOworICAgIHByaW50ZigiU3R1ZmUgLi4uLi4uLi4uLi4uICUtMy4zZCAlLScgJzE0cyBHZXdpY2h0IC4uLi4uLi4uLi4gJWQga2dcbiIsCisgICAgICAgICAgIFF1ZXJ5UHJvcChQX0xFVkVMKSwgKFF1ZXJ5UHJvcChQX0xFVkVMKSA8IHBsZXYgPyAiKCIrcGxldisiKSIgOiAiIiksCisgICAgICAgICAgIFF1ZXJ5UHJvcChQX1dFSUdIVCkgLyAxMDAwKTsKKyAgICBwcmludGYoIkdpbGRlIC4uLi4uLi4uLi4uLiAlLScgJzE4cyBHaWxkZW5zdHVmZSAuLi4uLi4gJWRcbiIsCisgICAgICAgICBjYXBpdGFsaXplKFF1ZXJ5UHJvcChQX0dVSUxEKSksIFF1ZXJ5UHJvcChQX0dVSUxEX0xFVkVMKSk7CisgIH0KKyAgcHJpbnRmKCJFcmZhaHJ1bmcgLi4uLi4uLi4gJS0nICcxOHMgQ2hhcmFrdGVyIC4uLi4uLi4uICUtc1xuXG4iLAorICAgICAgICAgUXVlcnlQcm9wKFBfWFApKyAiIFB1bmt0ZSIsIGFsX3RvX3RpdGxlKFF1ZXJ5UHJvcChQX0FMSUdOKSkpOworICBwcmludGYoIiUjLTc2LjJzXG5cbiIsIHRtcCk7CisgIHByaW50ZigiR2VzdW5kaGVpdCAuLi4uLi4uICUtMy4zZCAlLScgJzE0cyBHaWZ0IC4uLi4uLi4uLi4uLi4gJXNcbiIsCisgICAgICAgICBRdWVyeVByb3AoUF9IUCksCisgICAgICAgICAoUXVlcnlQcm9wKFBfSFApID09ICh2YWwgPSBRdWVyeVByb3AoUF9NQVhfSFApKSA/ICIiIDogIigiK3ZhbCsiKSIpLAorICAgICAgICAgKCh2YWwgPSBRdWVyeVByb3AoUF9QT0lTT04pKSA/CisgICAgICAgICAgKHZhbCA8IDQgPyAibGVpY2h0IiA6ICJnZWZhZWhybGljaCIpIDogImdlc3VuZCIpKTsKKyAgcHJpbnRmKCJLb256ZW50cmF0aW9uIC4uLi4gJS0zLjNkICUtJyAnMTRzIFZvcnNpY2h0IC4uLi4uLi4uLiAlc1xuIiwKKyAgICAgICAgIFF1ZXJ5UHJvcChQX1NQKSwKKyAgICAgICAgIChRdWVyeVByb3AoUF9TUCkgPT0gKHZhbCA9IFF1ZXJ5UHJvcChQX01BWF9TUCkpID8gIiIgOiAiKCIrdmFsKyIpIiksCisgICAgICAgICAoKGluZCA9IFF1ZXJ5UHJvcChQX1dJTVBZKSkgPyAiIitpbmQgOiAibXV0aWciKSk7CisgIHByaW50ZigiVG9kZXNmb2xnZW4uLi4uLi4uICUtJyAnMThzICVzXG4iLAorICAgICAgICAgKCh2YWwgPSBkZWF0aF9zdWZmZXJpbmcoKSkgPyAiIisoKHZhbCs5KS8xMCkgOiAia2VpbiBNYWx1cyIpLAorICAgICAgICAgKFF1ZXJ5UHJvcChQX1dJTVBZKSAmJiBpbmQ9UXVlcnlQcm9wKFBfV0lNUFlfRElSRUNUSU9OKSkKKyAgICAgICAgID8gc3ByaW50ZigiRmx1Y2h0cmljaHR1bmcgLi4uICVPIiwgaW5kKSA6ICIiKTsKKyAgcHJpbnRmKCIlcyIsCisgICAgICAgICAodGltZSgpLVF1ZXJ5KFBfTEFTVF9DT01CQVRfVElNRSk8MTIwICYmICFJU19MRUFSTklORyhNRSkpID8KKyAgICAgICAgICJTcGllbCB2ZXJsYXNzZW4gLi4gbmljaHQgbW9lZ2xpY2hcbiIgOiAiIgorICAgICAgICAgKTsKKworICBpZihhcmchPSJzaG9ydCIpIHsKKyAgICB3cml0ZShicmVha19zdHJpbmcoRm9yc2NodW5nKCksIDcwKSk7CisgICAgaWYoaW5kPVF1ZXJ5UHJvcChQX0FXQVkpKQorICAgICAgcHJpbnRmKCJEdSBiaXN0IG5pY2h0IGFuc3ByZWNoYmFyOiAlT1xuIixpbmQpOworICB9CisKKyAgaWYoc2l6ZW9mKGVuZW0xPSgobWl4ZWQpUXVlcnlFbmVtaWVzKCkpWzBdKSkgeworICAgIGVuZW0yPSh7fSk7CisgICAgaW52PWFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoTUUpKTsKKyAgICBmb3JlYWNoKG9iamVjdCBlbjogZW5lbTEpIHsKKyAgICAgIGlmIChtZW1iZXIoaW52LGVuKT09LTEpIC8vIElzdCB1bnNlciBGZWluZCB1bmQgaXN0IG5pY2h0IGhpZXIKKyAgICAgICAgZW5lbTIrPSh7ZW59KTsKKyAgICB9CisgICAgaWYoc2l6ZW9mKGVuZW0yKSkKKyAgICB7CisgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAgICAiRHUgdmVyZm9sZ3N0ICIgKyBDb3VudFVwKG1hcF9vYmplY3RzKGVuZW0yLCAibmFtZSIsIFdFTikpKyIuIiwKKyAgICAgICAgICAgIDc4KSk7CisgICAgfQorICB9CisgIGlmKGFyZyE9InNob3J0Iikgc2hvd19hZ2UoKTsKKyAgcHJpbnRmKCIlLSctJzcwc1xuIiwgIiIpOworICByZXR1cm4gMTsKK30KKworLyoqIEdpYnQgZWluZSBrdWVyemVyZSBJbmZvIHVlYmVyIGRlbiBDaGFyIGF1cyAoU3BpZWxlcmtvbW1hbmRvIHB1bmt0ZXxzY29yZSkuCisgICAgUnVmdCBzY29yZSgic2hvcnQiKS4KKyAgKiBccGFyYW1baW5dIGFyZyBVTlVTRUQKKyAgKiBccmV0dXJuIDEgYmVpIEVyZm9sZywgMCBzb25zdC4KKyAgKiBAc2VlIHNjb3JlKHN0cmluZyksIHZlcnlfc2hvcnRfc2NvcmUoKQorICAqLworc3RhdGljIGludCBzaG9ydF9zY29yZShzdHJpbmcgYXJnKSB7CisgIHJldHVybiBzY29yZSgic2hvcnQiKTsKK30KKworLyoqIEdpYnQgZWluZSBNaW5paW5mbyB1ZWJlciBMUCAvIEtQIGF1cyAoU3BpZWxlcmtvbW1hbmRvOiBrdXJ6aW5mbykKKyAgKiBccmV0dXJuIDEKKyAgKiBAc2VlIHNjb3JlKHN0cmluZyksIHNob3J0X3Njb3JlKHN0cmluZykKKyAgKi8KK3N0YXRpYyBpbnQgdmVyeV9zaG9ydF9zY29yZShzdHJpbmcgYXJnKSB7CisgIGludCAgICBscCxtbHAseGxwLGtwLG1rcCx4a3A7CisgIHN0cmluZyBiYXI7CisKKyAgbHA9UXVlcnlQcm9wKFBfSFApOyBtbHA9UXVlcnlQcm9wKFBfTUFYX0hQKTsKKyAga3A9UXVlcnlQcm9wKFBfU1ApOyBta3A9UXVlcnlQcm9wKFBfTUFYX1NQKTsKKyAgaWYgKG1scCkKKyAgICB4bHA9KGxwKjQwL21scCk7CisgIGlmIChta3ApCisgICAgeGtwPShrcCo0MC9ta3ApOworICBiYXI9IiAgLiAgICAuICAgIC4gICAgLiAgICAuICAgIC4gICAgLiAgICAuICAiOworICBpZiAoUXVlcnlQcm9wKFBfTk9fQVNDSUlfQVJUKSB8fCBhcmcgPT0gIi1rIikKKyAgICBwcmludGYoIkdlc3VuZGhlaXQ6ICUzLjNkICglMy4zZCksIEtvbnplbnRyYXRpb246ICUzLjNkICglMy4zZClcbiIsCisgICAgICAgICAgIGxwLCBtbHAsIGtwLCBta3ApOworICBlbHNlCisgICAgcHJpbnRmKCJHZXN1bmRoZWl0OiAgICAwIHwlJyMnNDAuNDBzfCAlMy4zZCVzXG4iKworICAgICAgICAgICAiS29uemVudHJhdGlvbjogMCB8JScjJzQwLjQwc3wgJTMuM2Qlc1xuIiwKKyAgICAgICAgICAgKHhscDwwP2JhcjpiYXJbeGxwLi5dKSxscCwobHA9PW1scD8iIjpzcHJpbnRmKCIgKCVkKSIsbWxwKSksCisgICAgICAgICAgICh4a3A8MD9iYXI6YmFyW3hrcC4uXSksa3AsKGtwPT1ta3A/IiI6c3ByaW50ZigiICglZCkiLG1rcCkpCisgICAgICAgICAgICk7CisgIHJldHVybiAxOworfQorCisvKiogR2lidCBlaW5lIE1hbnBhZ2UvSGlsZmVzZWl0ZSBhbiBkZW4gU3BpZWxlciBhdXMuCisgICAgQmVydWVja3NpY2h0aWd0IGhpZXJiZWkgZGllIFN5bm9ueW1saXN0ZSBhdXMgZGlyLy5zeW5vbnltLCB1bSBkaWUgcmljaHRpZ2UKKyAgICBNYW5wYWdlIGF1c3p1Z2ViZW4uCisgICogXHBhcmFtW2luXSBkaXIgVmVyemVpY2huaXMgZGVyIGdld3VlbnNjaHRlbiBNYW5wYWdlCisgICogXHBhcmFtW2luXSBwYWdlIE5hbWUgZGVyIGdld3VlbnNjaHRlbiBNYW5wYWdlCisgICogXHJldHVybiBTdHJpbmcgZGVyIGdld3VlbnNjaHRlbiBNYW5wYWdlCisgICovCitzdGF0aWMgc3RyaW5nIGdldG1hbnBhZ2Uoc3RyaW5nIGRpciwgc3RyaW5nIHBhZ2UpCit7CisgIHN0cmluZyB0ZXh0LCAqc3luOworICBpbnQgaTsKKworICBpZiAoZGlyWzwxXSAhPSAnLycpCisgICAgZGlyICs9ICIvIjsKKworICBpZiAoKHRleHQ9cmVhZF9maWxlKGRpcitwYWdlKSkgJiYgc2l6ZW9mKHRleHQpKQorICAgIHJldHVybiB0ZXh0OworCisgIGlmICh0ZXh0ID0gcmVhZF9maWxlKGRpcisiLnN5bm9ueW0iKSkgeworICAgIHN5biA9IHJlZ2V4cGxvZGUodGV4dCwgIihbIFx0XVsgXHRdKnxcbikiKTsKKyAgICBpZiAoKGk9bWVtYmVyKHN5biwgcGFnZSkpIT0tMSkKKyAgICAgIHJldHVybiByZWFkX2ZpbGUoZGlyK3N5bltpKzJdKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIEdpYnQgZWluZSBIaWxmZXNlaXRlIGFuIGRlbiBTcGllbGVyIGF1cyAoU3BpZWxlcmtvbW1hbmRvIGhpbGZlfG1hbikuCisgICogRGllIEhpbGZlc2VpdGUgd2lyZCBpbiBkaXYuIFZlcnplaWNobmlzc2VuIGdlc3VjaHQgKGplIG5hY2ggR2lsZGUsCisgICogTWFnaWVyLS9TcGllbGVyc3RhdHVzKS4KKyAgKiBccGFyYW1baW5dIHN0ciBOYW1lIGRlciBnZXd1ZW5zY2h0ZW4gSGlsZmVzZWl0ZS4KKyAgKiBccmV0dXJuIDEKKyAgKi8KK3N0YXRpYyBpbnQgaGVscChzdHJpbmcgc3RyKSB7CisgIHN0cmluZyB2ZXJiLCByZXN0LCB0ZXh0LCBnaWxkZTsKKyAgbWl4ZWQgZm91bmQ7CisKKyAgZm91bmQ9MDsKKyAgdGV4dCA9ICIiOworICBpZiAoc3RyKSB7CisgICAgc3RyID0gaW1wbG9kZSggZXhwbG9kZShzdHIsICIuLiIgKSwgIiIpOworCisgICAgaWYgKCBzc2NhbmYoIHN0ciwgImdpbGRlICVzICVzIiwgZ2lsZGUsIHJlc3QpPT0yKQorICAgICAgc3RyPXJlc3Q7CisgICAgZWxzZQorICAgICAgZ2lsZGU9UXVlcnlQcm9wKFBfR1VJTEQpOworICAgIGlmICghZ2lsZGUpIGdpbGRlPSJhYmVudGV1cmVyIjsKKworICAgIGlmICggc3NjYW5mKCBzdHIsICIlcyAlcyIsdmVyYixyZXN0ICk9PTIgKSBzdHIgPSB2ZXJiOworCisgICAgaWYgKChJU19MRUFSTkVSKFBMKSkgKSB7CisgICAgICBpZiAocmVzdCA9IGdldG1hbnBhZ2UoIi9kb2Mvd2l6LyIsc3RyKSkgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHJlc3QgPSBnZXRtYW5wYWdlKCIvZG9jL21jbWQvIiwgc3RyKSkgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKElTX1NFRVIoUEwpKSAvKiYmICFmb3VuZCovICkgeworICAgICAgaWYgKHJlc3QgPSBnZXRtYW5wYWdlKCIvZG9jL3NjbWQvIixzdHIpKSB7CisgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICB0ZXh0ICs9ICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdCA9IGdldG1hbnBhZ2UoIi9kb2MvZy4iK2dpbGRlKyIvIixzdHIpKSB7CisgICAgICBpZiAoZm91bmQpCisgICAgICAgIHRleHQgKz0gIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CisgICAgICBmb3VuZCA9IDE7CisgICAgICB0ZXh0ICs9IHJlc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChyZXN0ID0gZ2V0bWFucGFnZSgiL2RvYy9oZWxwLyIsc3RyKSkgeworICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgdGV4dCArPSAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICAgICAgZm91bmQgPSAxOworICAgICAgICB0ZXh0ICs9IHJlc3Q7CisgICAgICB9CisgICAgICBlbHNlIGlmIChyZXN0ID0gZ2V0bWFucGFnZSgiL2RvYy9wY21kLyIsc3RyKSkgeworICAgICAgICBpZiAoZm91bmQpCisgICAgICAgICAgdGV4dCArPSAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICAgICAgZm91bmQgPSAxOworICAgICAgICB0ZXh0ICs9IHJlc3Q7CisgICAgICB9CisgICAgICBlbHNlIGlmIChyZXN0ID0gZ2V0bWFucGFnZSgiL2RvYy9SRUdFTE4vIixzdHIpKSB7CisgICAgICAgIGlmIChmb3VuZCkKKyAgICAgICAgICB0ZXh0ICs9ICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIHRleHQgKz0gcmVzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kKQorICAgICAgdGV4dCA9ICJEYXp1IGlzdCBrZWluZSBIaWxmZSB2ZXJmdWVnYmFyLlxuIjsKKworICAgIE1vcmUodGV4dCwwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoSVNfTEVBUk5FUihQTCkpCisgICAgdGV4dCA9IHJlYWRfZmlsZSgiL2RvYy9oaWxmZS5tYWdpZXIiKTsKKyAgZWxzZSBpZiAoSVNfU0VFUihQTCkpCisgICAgdGV4dCA9IHJlYWRfZmlsZSgiL2RvYy9oaWxmZS5zZWhlciIpOworCisgIE1vcmUodGV4dCArIHJlYWRfZmlsZSgiL2RvYy9oaWxmZS5zcGllbGVyIiksIDApOworICByZXR1cm4gMTsKK30KKworLyoqIEVybWl0dGVsdCBhbmdlYmVuZSBPcHRpb25lbiBmdWVyIGRhcyBTcGllbGVya29tbWFuZG8gJ3dlcicuCisgICogXHBhcmFtW2luXSBzdHIgdm9tIFNwaWVsZXIgc3BlemlmaXppZXJ0ZXIgU3RyaW5nIHZvbiBGaWx0ZXJvcHRpb25lbjogLWssCisgICogLXYsIC1hLCAtcyAoKyBMYW5nZm9ybWVuKS4KKyAgKiBccmV0dXJuIEFycmF5IHZvbiBTcGllbGVyb3B0aW9uZW4gYWxzIHZlcm9kZXJ0ZSBJbnQtRmxhZ3MgdW5kIFJlc3QgZGVyCisgICogU3BpZWxlcmVpbmdhYmUgb2huZSBkaWUgT3B0aW9uZW4uCisgICovCitzdGF0aWMgbWl4ZWQgZmlsdGVyX3dob19vcHRpb25zKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyogb3B0LCAqYW5zOworICBpbnQgaSxsZW4scmVzOworCisgIG9wdCA9IGV4cGxvZGUoc3RyLCIgIik7IGxlbj1zaXplb2Yob3B0KTsKKyAgYW5zID0gKHt9KTsKKyAgcmVzID0gMDsKKyAgZm9yKGk9MDtpPGxlbjtpKyspCisgICAgc3dpdGNoKG9wdFtpXSl7CisgICAgICBjYXNlICItayI6CisgICAgICBjYXNlICIta3VyeiI6CisgICAgICByZXMgfD0gV0hPX1NIT1JUOyBicmVhazsKKyAgICAgIGNhc2UgIi12IjoKKyAgICAgIGNhc2UgIi12ZXJ0aWthbCI6CisgICAgICByZXMgfD0gV0hPX1ZFUlRJQ0FMOyBicmVhazsKKyAgICAgIGNhc2UgIi1hbHBoYWJldGlzY2giOgorICAgICAgY2FzZSAiLWEiOgorICAgICAgY2FzZSAiLWFscGhhIjoKKyAgICAgIHJlcyB8PSBXSE9fQUxQSEE7IGJyZWFrOworICAgICAgY2FzZSAiLXMiOgorICAgICAgY2FzZSAiLXNwaWVsZXIiOgorICAgICAgcmVzIHw9IFdIT19QTEFZRVJfVklFVzsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICh7IHJlcywgaW1wbG9kZShvcHRbaS4uXSwiICIpIH0pOworICAgIH0KKyAgcmV0dXJuICh7IHJlcywgMCB9KTsKKworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICd3ZXInLCBmcmFndCAvb2JqL3dlcmxpc3RlIGFiLgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIG1pdCBPcHRpb25lbiBmdWVyIHdlci4KKyAgKiBccmV0dXJuIDEKKyAgKi8KK3N0YXRpYyBpbnQgd2hvKHN0cmluZyBzdHIpIHsKKyAgaW50IGksc2hydDsKKyAgc3RyaW5nIHJldDsKKyAgbWl4ZWQgYW5zOworCisgIGlmICgoc3RyPV91bnBhcnNlZF9hcmdzKCkpJiZzdHJbMC4uMF0hPSItIikgeworICAgIGFucyA9IGZpbHRlcl93aG9fb3B0aW9ucyhzdHIpOworICAgIHNocnQgPSBhbnNbMF07CisgICAgc3RyID0gYW5zWzFdOworICAgIGlmICghc2hydCkgeworICAgICAgaWYgKHJldD1JTkVURC0+X3NlbmRfdWRwKHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbIFJFUVVFU1Q6ICJ3aG8iLCBTRU5ERVI6IGdldHVpZChNRSkgXSksIDEgKSkKKyAgICAgICAgd3JpdGUocmV0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3JpdGUoIkFuZnJhZ2UgYWJnZXNjaGlja3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZiAoc3RyKSBpPShtZW1iZXIoc3RyLCdvJyk+MCk7IGVsc2UgaT0wOworICBpZiAoc2l6ZW9mKHN0cik+MSAmJiBzdHJbMF0gPT0gJy0nKSBzdHIgPSBzdHJbMS4uMV07CisgIE1vcmUoaW1wbG9kZSggIi9vYmovd2VybGlzdGUiLT5RdWVyeVdob0xpc3RlKAorICAgIElTX0xFQVJORVIoTUUpICYmIFF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKSxzaHJ0LDAsc3RyLGkpLCJcbiIpLDApOworICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyAna3dlcicsIGZyYWd0IC9vYmovd2VybGlzdGUgYWIuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUgbWl0IE9wdGlvbmVuIGZ1ZXIgd2VyLgorICAqIFxyZXR1cm4gMQorICAqLworc3RhdGljIGludCBrd2hvKHN0cmluZyBzdHIpCit7CisgIGludCBzaHJ0OworICBtaXhlZCByZXM7CisKKyAgaWYoc3RyKSB7CisgICAgcmVzID0gZmlsdGVyX3dob19vcHRpb25zKHN0cik7CisgICAgc2hydCA9IHJlc1swXTsKKyAgICBzdHIgPSByZXNbMV07CisgIH0KKyAgTW9yZShpbXBsb2RlKCAiL29iai93ZXJsaXN0ZSItPlF1ZXJ5V2hvTGlzdGUoCisgICAgICBJU19MRUFSTkVSKE1FKSAmJiBRdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTiksIHNocnR8V0hPX1NIT1JUICwwLHN0ciksCisgICAgIlxuIikrIlxuXG4iLDApOworICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyAna2t3ZXInLCBnaWJ0IGVpbmUgZWluZmFjaGUgTGlzdGUgZGVyIEFud2VzZW5kZW4gYXVzLgorICAgIEZpbHRlcnQgdW5zaWNodGJhcmUgU3BpZWxlciBhdXMsIGZhbGxzIFNQaWVsZXJvYmpla3Qga2VpbiBNYWdpZXIgaXN0LgorICAqIFxwYXJhbVtpbl0gc3RyIFNwaWVsZXJlaW5nYWJlIG1pdCBPcHRpb25lbiBmdWVyIHdlci4KKyAgKiBccmV0dXJuIDEKKyAgKi8KK3N0YXRpYyB2YXJhcmdzIGludCBra3dobyhzdHJpbmcgc3RyKSB7CisgIG9iamVjdCAqb2JzOworICBzdHJpbmcgKm5hbWVuOworCisgIG9icz1maWx0ZXJfdXNlcnMoc3RyKTsKKyAgbmFtZW49KHt9KTsKKyAgaWYgKElTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpIHsKKyAgICBmb3JlYWNoKG9iamVjdCBvYjogb2JzKSB7CisgICAgICBpZiAoZW52aXJvbm1lbnQob2IpKQorICAgICAgICBuYW1lbis9KHtjYXBpdGFsaXplKGdldGV1aWQob2IpKX0pOworICAgIH0KKyAgfSAKKyAgZWxzZSB7CisgICAgZm9yZWFjaChvYmplY3Qgb2I6IG9icykgeworICAgICAgaWYgKCFvYi0+UXVlcnlQcm9wKFBfSU5WSVMpICYmIGVudmlyb25tZW50KG9iKSkKKyAgICAgICAgbmFtZW4rPSh7Y2FwaXRhbGl6ZShnZXRldWlkKG9iKSl9KTsKKyAgICB9CisgIH0KKyAgaWYgKHNpemVvZihuYW1lbikpCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKENvdW50VXAoc29ydF9hcnJheShuYW1lbiwjJz4pLCIsICIsICIsICIpKyIuIiw3NSkpOworICBlbHNlCisgICAgd3JpdGUoIktlaW5lIHBhc3NlbmRlbiBTcGllbGVyIGdlZnVuZGVuLlxuIik7CisgIAorICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyAndG9ldGUnLgorICAqIFBydWVmdCBhdWYgR2Vpc3QsIEdhc3QsIHRvdGVuIEhDLVNwaWVsZXIsIFdhZmZlL2ZyZWllIEhhbmQuIFZlcnN1Y2h0IGVpbmVuCisgICogR2VnbmVyIHp1IGZpbmRlbiB1bmQgcnVmdCBkYW5uIEtpbGwoc3RyaW5nKS4KKyAgKiBccGFyYW1baW5dIHN0ciBTcGllbGVyZWluZ2FiZQorICAqIFxyZXR1cm4gMSBvZGVyIDAsIGZhbGxzIGtlaW4gcG90ZW50aWVsbGVyIEdlZ25lciBiZWkgJ3RvZXRlIGFsbGUnIGdlZnVuZGVuCisgICogd2lyZC4KKyAgKi8KK3N0YXRpYyBpbnQga2lsbChzdHJpbmcgc3RyKSB7CisgIG9iamVjdCBlb2Isd29iOworCisgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpCisgIHsKKyAgICB3cml0ZSgiRGFzIGthbm5zdCBEdSBpbiBEZWluZW0gaW1tYXRlcmllbGxlbiBadXN0YW5kIG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIGlmKGhjX3BsYXk+MSkKKyAgeworICAgIHdyaXRlKCJEQVMgSEFTVCBEVSBISU5URVIgRElSLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIGlmIChRdWVyeUd1ZXN0KCkpCisgIHsKKyAgICB3cml0ZSgiRHUgYmlzdCBkb2NoIG51ciBHYXN0IGhpZXIuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXN0ciB8fCBzdHIgPT0gIiIpIHsKKyAgICB3cml0ZSgiV0VOIHdpbGxzdCBEdSB0b2V0ZW4/XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiggIVF1ZXJ5UHJvcChQX1dFQVBPTikgJiYgUXVlcnlQcm9wKFBfRlJFRV9IQU5EUyk9PTAgKSB7CisgICAgd3JpdGUoCisgICAgICAiRGF6dSBzb2xsdGVzdCBEdSBlaW5lIFdhZmZlIGdlenVlY2t0IG9kZXIgZWluZSBIYW5kIGZyZWkgaGFiZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdHI9bG93ZXJfY2FzZShzdHIpOworICBpZiAoc3RyPT0iYWxsZSIpIHsKKyAgICBvYmplY3QgbGl2czsKKyAgICBsaXZzPWZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KFBMKSksCisgICAgICAgIGZ1bmN0aW9uIGludCAob2JqZWN0IG9iKSB7CisgICAgICAgICAgICBpZiAobGl2aW5nKG9iKSAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikKKyAgICAgICAgICAgICAgICAgICYmICFvYi0+UXVlcnlQcm9wKFBfSU5WSVMpCisgICAgICAgICAgICAgICAgICAmJiAhb2ItPlF1ZXJ5UHJvcChQX05PX0dMT0JBTF9BVFRBQ0spCisgICAgICAgICAgICAgICAgICAmJiAhb2ItPlF1ZXJ5UHJvcChQX0ZSSUVORCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2lsbChvYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSApOworICAgIC8vIHdlbm4gR2VnbmVyIGdlZnVuZGVuLCByYXVzLCBhbnNvbnN0ZW4ga29tbXQgZGllIEZlaGxlcm1lbGR1bmcgdW50ZW4uCisgICAgaWYgKHNpemVvZihsaXZzKSkgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSB7CisgICAgaW50IGk9MTsKKyAgICB3aGlsZShvYmplY3RwKGVvYiA9IHByZXNlbnQoc3RyLGkrKyxlbnZpcm9ubWVudChQTCkpKSkgeworICAgICAgaWYgKGxpdmluZyhlb2IpICYmICFlb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBlbHNlCisgICAgICAgIGVvYj0wOworICAgIH0KKyAgfQorICBpZiAoIW9iamVjdHAoZW9iKSkgeworICAgIC8vIHBlciB3cml0ZSB1bmQgcmV0dXJuIDEgaXN0IGhpZXIgbWFsIG9rLCB3ZWlsIGRpZXMgS29tbWFuZG8gaW0gU3BpZWxlcgorICAgIC8vIGVoIHp1bGV0enQgaW4gZGVyIEtvbW1hbmRva2V0dGUgYXVzZ2VmdWVocnQgd2lyZCB1bmQgcGVyIHJldHVybiAwIGVoCisgICAgLy8ga2VpbiBhbmRlcmVzIG1laHIgenVtIFp1ZyBrb21tdC4KKyAgICB3cml0ZSgiRHUgc2llaHN0IGhpZXIga2VpbiBkZXJhcnRpZ2VzIFdlc2VuIVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoZW9iID09IFBMKSB7CisgICAgd3JpdGUoIlNlbGJzdG1vcmQgaXN0IGtlaW5lIExvZXN1bmchXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8qIEtpbGwgaGltICovCisgIEtpbGwoZW9iKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qKiBTcGllbGVya29tbWFuZG8gJ3N0b3AnLgorICAqIExvZXNjaHQgZGllIEdlZ25lcmxpc3RlLCBzb2Zlcm4gbWFuIG5pY2h0IEluRmlnaHQoKSBpc3QuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUsIHdpcmQgaWdub3JpZXJ0LgorICAqIFxyZXR1cm4gMQorICAqLworc3RhdGljIGludCBzdG9wKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpZiAoIEluRmlnaHQoKSApeworICAgICAgICB3cml0ZSggIkRhcyBnZWh0IG5pY2h0IG1pdHRlbiBpbSBLYW1wZi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCAhc3RyICl7CisgICAgICAgIFN0b3BIdW50aW5nTW9kZSgpOworICAgICAgICB3cml0ZSggIk9rLlxuIiApOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoICFTdG9wSHVudElEKHN0cikgKQorICAgICAgICB3cml0ZSggIlNvIGplbWFuZGVuIHZlcmZvbGdzdCBEdSBuaWNodCFcbiIgKTsKKworICAgIHJldHVybiAxOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvIGZ1ZXJzIGVtb3RlbiAnOicuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccGFyYW1baW5dIGdlbml0aXYgR2VuZXRpdmZsYWcKKyAgKiBccmV0dXJuIDEgb2RlciAwLCBmYWxscyBTcGllbGVyIG5pY2h0IGVtb3RlbiBrYW5uIChrZWluIENBTl9FTU9URSBGbGFnIGluCisgICogUF9DQU5fRkxBR1MpLgorICAqLworaW50IGVtb3RlKHN0cmluZyBzdHIsaW50IGdlbml0aXYpCit7CisgIHN0cmluZyAqY29tbWFuZHMsbWVzc2FnZSx2ZXJiOworICBvYmplY3QgbGl2aW5nOworICBpbnQgaSxzaXplOworCisgIGlmICghKFF1ZXJ5KFBfQ0FOX0ZMQUdTKSZDQU5fRU1PVEUpKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3ZlcmIoKVswXT09JzsnKSBnZW5pdGl2PTE7CisgIGlmIChxdWVyeV92ZXJiKClbMF09PSc6J3x8cXVlcnlfdmVyYigpWzBdPT0nOycpCisgICAgdmVyYj1xdWVyeV92ZXJiKClbMS4uXSsiICI7CisgIGVsc2UKKyAgICB2ZXJiPSIiOworICBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgY29tbWFuZHM9ZXhwbG9kZSh2ZXJiKyhzdHJ8fCIiKSwiIyIpOworICBtZXNzYWdlPWJyZWFrX3N0cmluZygoSVNfU0VFUihNRSkgPyAiIiA6ICI+IikKKyAgICAgICAgICAgICAgICAgICAgICAgK2NhcGl0YWxpemUoZ2VuaXRpdiA/IG5hbWUoV0VTU0VOKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKyIgIitjb21tYW5kc1swXSw3OCk7CisgIHNpemU9c2l6ZW9mKGNvbW1hbmRzKTsKKyAgaWYoc2l6ZT49MykKKyAgeworICAgIGxpdmluZz1maW5kX2xpdmluZyhsb3dlcl9jYXNlKGNvbW1hbmRzWzFdKSk7CisgICAgaWYoIWxpdmluZyB8fCBlbnZpcm9ubWVudChsaXZpbmcpIT1lbnZpcm9ubWVudCgpIHx8CisgICAgICAgKGxpdmluZy0+UXVlcnlQcm9wKFBfSU5WSVMpKSAmJiAhSVNfTEVBUk5FUihNRSkpCisgICAgeworICAgICAgd3JpdGUoY2FwaXRhbGl6ZShjb21tYW5kc1sxXSkrIiBzZWhlIGljaCBoaWVyIG5pY2h0IVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYobGl2aW5nIT10aGlzX29iamVjdCgpKQorICAgICAgdGVsbF9vYmplY3QobGl2aW5nLGJyZWFrX3N0cmluZygoSVNfU0VFUih0aGlzX3BsYXllcigpKSA/ICIiIDogIj4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2NhcGl0YWxpemUoZ2VuaXRpdiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLT5uYW1lKFdFU1NFTikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19wbGF5ZXIoKS0+bmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgIitjb21tYW5kc1syXSw3OCkpOworICB9CisgIGlmKHNpemU+PTQpCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKGNvbW1hbmRzWzNdLDc4KSk7CisgIGVsc2UKKyAgICB3cml0ZShtZXNzYWdlKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksbWVzc2FnZSwoe3RoaXNfb2JqZWN0KCksbGl2aW5nfSkpOworICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyBmdWVycyByZW1vdGVuICdyOicuCisgICogXHBhcmFtW2luXSBzdHIgU3BpZWxlcmVpbmdhYmUKKyAgKiBccGFyYW1baW5dIGZsYWcgR2VuZXRpdmZsYWcKKyAgKiBccmV0dXJuIDEgb2RlciAwLCBmYWxscyBTcGllbGVyIG5pY2h0IGVtb3RlbiBrYW5uIChrZWluIENBTl9SRU1PVEUgRmxhZyBpbgorICAqIFBfQ0FOX0ZMQUdTKS4KKyAgKi8KK3N0YXRpYyBpbnQgcmVtb3RlKHN0cmluZyBzdHIsIGludCBmbGFnKQoreworICBpbnQgbTsKKyAgc3RyaW5nIHRtcCwgZGVzdDsKKyAgc3RyaW5nICpleHN0cjsKKyAgb2JqZWN0IGRlc3RwbDsKKworICBpZiAoICEoUXVlcnkoUF9DQU5fRkxBR1MpICYgQ0FOX1JFTU9URSkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhKHN0cj1fdW5wYXJzZWRfYXJncygpKSB8fAorICAgICAgIHNpemVvZiggKGV4c3RyPWV4cGxvZGUoc3RyLCIgIikpIC0gKHsiIn0pICkgPD0gMSApeworICAgICAgd3JpdGUoIldhcyB3aWxsc3QgRHUgenUgd2VtIGBlbW90ZW5gP1xuIik7CisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIGRlc3QgPSBsb3dlcl9jYXNlKGV4c3RyWzBdKTsKKworICBpZiggIShkZXN0cGw9ZmluZF9wbGF5ZXIoIGRlc3QgKSApIHx8CisgICAgICAoZGVzdHBsLT5RdWVyeVByb3AoUF9JTlZJUykgJiYgIUlTX0xFQVJORVIoTUUpKSApeworICAgIHdyaXRlKCJFaW5lbiBzb2xjaGVuIFNwaWVsZXIgZ2lidCBlcyBkZXJ6ZWl0IG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB0bXAgPSBpbXBsb2RlKCBleHN0clsxLi5dLCAiICIgKTsKKworICB0bXAgPSByZWdyZXBsYWNlKCB0bXAsICIoXnxbXiNdKSMoJHxbXiNdKSIsICJcXDFhdXMgZGVyIEZlcm5lXFwyIiwgMSApOworICB0bXAgPSByZWdyZXBsYWNlKCB0bXAsICIoXnxbXlxcXl0pXFxeKCR8W15cXF5dKSIsICJcXDFpbiBkZXIgRmVybmVcXDIiLCAxICk7CisgIHRtcCA9IHJlZ3JlcGxhY2UoIHRtcCwgIiMjIiwgIiMiLCAxICk7CisgIHRtcCA9IHJlZ3JlcGxhY2UoIHRtcCwgIlxcXlxcXiIsICJeIiwgMSApOworCisgIGlmICggc3Ryc3RyKCB0bXAsICJhdXMgZGVyIEZlcm5lIiApID09IC0xCisgICAgICAgJiYgc3Ryc3RyKCB0bXAsICJpbiBkZXIgRmVybmUiICkgPT0gLTEgKQorICAgICAgdG1wICs9ICIgYXVzIGRlciBGZXJuZSI7CisKKyAgaWYgKCBRdWVyeVByb3AoUF9JTlZJUykgJiYgSVNfTEVBUk5FUihkZXN0cGwpICl7CisgICAgICBzdHIgPSAiKCIgKyBjYXBpdGFsaXplKGdldHVpZChNRSkpOworICAgICAgaWYgKCBmbGFnICkKKyAgICAgICAgICBzdHIgKz0gbWVtYmVyKCAic3h6Iiwgc3RyWzwxXSApID09IC0xID8gInMiIDogIiciOworICAgICAgc3RyICs9ICIpIjsKKyAgfQorICBlbHNlCisgICAgICBzdHIgPSAoZmxhZyA/IGNhcGl0YWxpemUobmFtZShXRVNTRU4pKSA6IGNhcGl0YWxpemUobmFtZShXRVIpKSk7CisKKyAgc3RyICs9ICIgIiArIHRtcCArIChtZW1iZXIoICIuPyEiLCB0bXBbPDFdICkgPT0gLTEgPyAiLiIgOiAiIikgKyAiXG4iOworCisgIG0gPSBkZXN0cGwtPlJlY2VpdmVNc2coc3RyLCBNVF9DT01NfE1UX0ZBUiwgTUFfRU1PVEUsMCwgTUUpOworICBzd2l0Y2gobSkKKyAgeworICAgIGNhc2UgTVNHX0RFTElWRVJFRDoKKyAgICAgIF9yZWN2KGRlc3RwbCwgY2FwaXRhbGl6ZShkZXN0cGwtPm5hbWUoKSkgKyAiLT4iICsgc3RyLCBNU0dGTEFHX1JFTU9URSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1TR19CVUZGRVJFRDoKKyAgICAgIHdyaXRlKCBjYXBpdGFsaXplKGRlc3RwbC0+bmFtZShXRVIpICsgIiBpc3QgZ2VyYWRlIGJlc2NoYWVmdGlndC5cbiIpICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1TR19JR05PUkVEOgorICAgICAgd3JpdGUoIGNhcGl0YWxpemUoZGVzdHBsLT5uYW1lKFdFUikgKyAiIGlnbm9yaWVydCBEaWNoLlxuIikgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX1ZFUkJfSUdOOgorICAgIGNhc2UgTVNHX01VRF9JR046CisgICAgICB3cml0ZSggY2FwaXRhbGl6ZShkZXN0cGwtPm5hbWUoV0VSKSArICIgaWdub3JpZXJ0IERlaW5lIE1lbGR1bmcuXG4iKSApOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHdyaXRlKCBjYXBpdGFsaXplKGRlc3RwbC0+bmFtZShXRVIpICsgIiBrYW5uIERpY2ggZ2VyYWRlIG5pY2h0ICIKKyAgICAgICAgICAgICJ3YWhybmVobWVuLlxuIikgKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyBmdWVycyBlbW90ZW4gaW0gR2VuaXRpdiAnOycuCisgICogUnVmdCBlbW90ZShzdHJpbmcsaW50KSBhdWYuCisgICovCitzdGF0aWMgaW50IGdlbW90ZShzdHJpbmcgc3RyKQoreworICByZXR1cm4gZW1vdGUoc3RyLCAxKTsKK30KKworLyoqIFNwaWVsZXJrb21tYW5kbyBmdWVycyByZW1vdGVuIGltIEdlbml0aXYgJ3I7Jy4KKyAgKiBSdWZ0IHJlbW90ZShzdHJpbmcsIGludCkgYXVmLgorICAqLworc3RhdGljIGludCBncmVtb3RlKHN0cmluZyBzdHIpCit7CisgIHJldHVybiByZW1vdGUoc3RyLCAxKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9hdXRvX29iamVjdHMobWFwcGluZyBtYXBfbGRmaWVkKTsKKworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIoKTsKK3ByaXZhdGUgdm9pZCBJbml0UGxheWVyMigpOworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIzKCk7CisKKy8qKiBHaWJ0IGVpbmUgWnVmYWxsc3phaGwgdW0gUF9BVkVSQUdFX1NJWkUgaGVydW0genVydWVjay4KKyAgKiBccmV0dXJuIFp1ZmFlbGxpZ2UgR3JvZXNzZS4KKyAgKi8KK3ByaXZhdGUgaW50IFJhbmRvbVNpemUoKQoreworICByZXR1cm4gKDEwMCtyYW5kb20oMTMpLXJhbmRvbSgxMykrcmFuZG9tKDEzKS1yYW5kb20oMTMpKSoKKyAgICAoUXVlcnlQcm9wKFBfQVZFUkFHRV9TSVpFKXx8MTcwKS8xMDA7Cit9CisKKy8qKiBTZXR6dCBiZXN0aW1tdGUgUHJvcHMgaW0gU3BpZWxlciwgZmFsbHMgZGllc2UgbmljaHQgZ2VzZXR6dCBzaW5kIG9kZXIKKyAgKiBsb2VzY2h0IG9ic29sZXRlIFByb3BzLiBSZXBhcmllcnQgYmVzdGltbXRlIERhdGVuc3RydWt0dXJlbiBpbSBTcGllbGVyLgorICAqIFdpcmQgdm9uIHN0YXJ0X3BsYXllcigpIG5hY2ggTGFkZW4gZGVzIFNhdmVmaWxlcyBnZXJ1ZmVuLgorICAqIE1vbWVudGFuIHdpcmQgei5CLiBkaWUgR3JvZXNzZSBnZXNldHp0LCBmYWxscyBzaWUgYmlzaGVyIDAgaXN0IHVuZCBkaWUKKyAgKiBTa2lsbHMgZGVzIFNwaWVsZXJzIGluaXRpYWxpc2llcnQgYnp3LiByZXBhcmllcnQgb2RlciBhdWYgZGllIGFrdHVlbGxzdGUKKyAgKiBWZXJzaW9uIGRlcyBTa2lsbHN5c3RlbXMKKyAgKiBSdWZ0IGdnZi4gSW5pdFNraWxscygpIHVuZCBGaXhTa2lsbHMoKS4KKyAgKiBAcGFyYW1baW5dIG5ld2ZsYWcgR2lidCBhbiwgb2IgZXMgZWluIG5ldWVyc3RlbGx0ZXIgU3BpZWxlciBpc3QuCisgICogQHNhIHN0YXJ0X3BsYXllcigpLCBJbml0U2tpbGxzKCksIEZpeFNraWxscygpCisgICovCitwcml2YXRlIHZvaWQgdXBkYXRlc19hZnRlcl9yZXN0b3JlKGludCBuZXdmbGFnKSB7CisgCisgIC8vIFNlaGVyIGR1ZXJmZW4gZGllIEZsdWNodHJpY2h0dW5nIHVlYmVybWl0dGVsbiBsYXNzZW4uCisgIC8vIEVpZ2VudGxpY2gga29lbm50ZSBlcyBNZXJsaW4gbWFjaGVuLiBEdW1tZXJ3ZWlzZSBnaWJ0IGVzIGphIGF1Y2ggYWx0ZQorICAvLyBTZWhlciB1bmQgZGFubiBrYW5uIGVzIGdsZWljaGUgZnVlciBhbGxlIGhpZXIgZ2VtYWNodCB3ZXJkZW4uIChPYiBkZXIKKyAgLy8gQ29kZSBqZW1hbHMgcmF1c2thbm4/KQorICAvL1RPRE86IElyZ2VuZHdhbm4gYWxsZSBTZWhlciBrb3JyaWdpZXJlbiB1bmQgQ29kZSBuYWNoIE1lcmxpbiBzY2hpZWJlbi4uLgorICBpZiAoSVNfU0VFUihNRSkpCisgICAgU2V0UHJvcChQX0NBTl9GTEFHUyxRdWVyeVByb3AoUF9DQU5fRkxBR1MpIHwgQ0FOX1JFUE9SVF9XSU1QWV9ESVIpOworCisgIC8vIGdnZi4gSW52aXMtRWlnZW5zY2hhZnQgYXVzIGRlbSBMb2dpbm9iamVrdCBhYnJ1ZmVuIChJbnZpc2xvZ2luKSwga29lbm50ZQorICAvLyBqYSBhbmRlcnMgYWxzIGF1cyBTYXZlZmlsZSBzZWluLiBHZXNldHp0ZXMgUF9JTlZJUyBhdXMgZGllc2VtIGFiZXIKKyAgLy8gYmVpYmVoYWx0ZW4uCisgIGlmIChJU19MRUFSTkVSKE1FKSAmJiAhUXVlcnlQcm9wKFBfSU5WSVMpCisvLyAgICAgICYmIGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gIi9zZWN1cmUvbG9naW4iCisgICAgICApCisgIHsKKyAgICBTZXRQcm9wKFBfSU5WSVMsIHByZXZpb3VzX29iamVjdCgpLT5xdWVyeV9pbnZpcygpKTsKKyAgICBpZiAoUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgICAgdGVsbF9vYmplY3QoTUUsICJEVSBCSVNUIFVOU0lDSFRCQVIhXG4iICk7CisgIH0KKyAgIioiOjp1cGRhdGVzX2FmdGVyX3Jlc3RvcmUobmV3ZmxhZyk7CisKKyAgYXR0cmlidXRlczo6VXBkYXRlQXR0cmlidXRlcygpOworCisgIGludCBzaXplPVF1ZXJ5KFBfU0laRSk7CisgIGlmICghc2l6ZSkgc2l6ZT1SYW5kb21TaXplKCk7CisgIHdoaWxlKHNpemU9PVF1ZXJ5UHJvcChQX0FWRVJBR0VfU0laRSkpCisgICAgc2l6ZT1SYW5kb21TaXplKCk7CisgIFNldChQX1NJWkUsc2l6ZSk7CisKKyAgLy8gUHJvcCB3aXJkIG5pY2h0IG1laHIgZ2VudXR6dC4gVE9ETzogaXJnZW5kd2FubiBlbnRmZXJuZW4uCisgIFNldChQX1NFQ09ORF9MSVNULCBTQVZFLCBGX01PREVfQUQpOworICBTZXQoUF9TRUNPTkRfTElTVCwgMCwgRl9WQUxVRSk7Cit9CisKKworLyoqIFNldHp0IGRlbiBIQy1Nb2R1cy4KKyAgKi8KK3ZhcmFyZ3Mgbm9tYXNrIHZvaWQgc2V0X2hjX3BsYXkoc3RyaW5nIHN0cixpbnQgdmFsKQoreworICAgc3RyaW5nIHN0cjE7CisKKyAgICBzdHIxID0gZXhwbG9kZSggb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCAiIyIgKVswXTsKKyAgICAKKyAgICBpZiAoIHN0cjEgIT0gIi9zZWN1cmUvbG9naW4iICYmCisgICAgICAgICBwcmV2aW91c19vYmplY3QoKSE9dGhpc19vYmplY3QoKSAmJgorICAgICAgICAgZXh0ZXJuX2NhbGwoKSAmJgorICAgICAgICAgKCFnZXRldWlkKE1FKSB8fCBnZXRldWlkKE1FKSAhPSBnZXR1aWQoTUUpIHx8CisgICAgICAgICAgY2FwaXRhbGl6ZShnZXRldWlkKE1FKSkgIT0gc3RyIHx8CisgICAgICAgICAgZ2V0ZXVpZChNRSkgIT0gZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpICl7CisgICAgICAgIHdyaXRlKCAiRElFU0VSIFZFUlNVQ0ggV0FSIElMTEVHQUwgISFcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBoY19wbGF5PXZhbDsKK30KKworLyoqIGdpYnQgZGVuIEhDLU1vZHVzIHp1cnVlY2suCisgICovCitub21hc2sgaW50IHF1ZXJ5X2hjX3BsYXkoKQoreworICByZXR1cm4gaGNfcGxheTsKK30KKworLyoqIEluaXRpYWxpc2llcnQgdW5kIGFrdGl2aWVydCBkYXMgU3BpZWxlcm9iamVrdC4KKyAgKiBLYW5uIG51ciB2b24gL3NlY3VyZS9sb2dpbiBvZGVyIC9zZWN1cmUvbWFzdGVyIGdlcnVmZW4gd2VyZGVuLgorICAqIFN0YXJ0ZXQgVGVsbmV0IE5lZ290aWF0aW9uLCBsYWVkdCBTYXZlZmlsZSwgc2V0enQgZWluaWdlIFByb3BzLiAKKyAgKiBSdWZ0IHVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZSgpLCB1bSBkaXYuIERhdGVuIHp1IGFrdHVhbGlzaWVyZW4vcmVwYXJpZXJlbi4KKyAgKiBSdWZ0IGNyZWF0ZSgpIGF1cyAvc3RkL3BsYXllci9wb3Rpb24uYy4KKyAgKiBCZWkgbmV1ZW0gU3BpZWxlciB3aXJkIGRlciBlbnRzcHJlY2hlbmRlIEV2ZW50IGF1c2dlbG9lc3QgZGllIEF0dHJpYnV0ZQorICAqIGF1ZiBkaWUgU3RhcnR3ZXJ0ZSBnZXNldHp0LgorICAqIFBydWVmdCBad2VpdGllbWFya2llcnVuZ2VuLgorICAqIFJ1ZnQgSW5pdFBsYXllcigpLgorICAqIEBwYXJhbVtpbl0gc3RyIE5hbWUgZGVzIENoYXJha3RlcnMsIGRlciBnZWxhZGVuIHdlcmRlbiBzb2xsLgorICAqIEBwYXJhbVtpbl0gaXAgdGV4dHVlbGxlIFJlcHJhZXNlbnRhdGlvbiBkZXIgSVAtQWRyZXNzZSBkZXMgU3BpZWxlcnMuCisgICogQHJldHVybiAxIGJlaSBFcmZvbGcsIDAgc29uc3QuCisgICogQHRvZG8gRGl2LiBSZXBhcmF0dXJlbi9VcGRhdGVzIG5hY2ggdXBkYXRlc19hZnRlcl9yZXN0b3JlKCkgYXVzbGFnZXJuLgorICAqLwordmFyYXJncyBub21hc2sgaW50IHN0YXJ0X3BsYXllciggc3RyaW5nIHN0ciwgc3RyaW5nIGlwICkKK3sKKyAgICBtaXhlZCBzZWNvbmQ7CisgICAgaW50IG5ld2ZsYWc7ICAvKiBjb3VsZCBwbGF5ZXIgYmUgcmVzdG9yZWQ/ICovCisgICAgc3RyaW5nIHN0cjE7CisKKyAgICBjYWxsX291dCggImRpc2Nvbm5lY3QiLCA2MDAgKTsKKworICAgIHN0cjEgPSBleHBsb2RlKCBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIjIiApWzBdOworCisgICAgaWYgKCBzdHIxICE9ICIvc2VjdXJlL2xvZ2luIiAmJgorICAgICAgICAgc3RyMSAhPSAiL3NlY3VyZS9tYXN0ZXIiICYmCisgICAgICAgICAoIWdldGV1aWQoTUUpIHx8IGdldGV1aWQoTUUpICE9IGdldHVpZChNRSkgfHwKKyAgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQoTUUpKSAhPSBzdHIgfHwKKyAgICAgICAgICBnZXRldWlkKE1FKSAhPSBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgKXsKKyAgICAgICAgd3JpdGUoICJESUVTRVIgVkVSU1VDSCBXQVIgSUxMRUdBTCAhIVxuIiApOworICAgICAgICBkZXN0cnVjdChNRSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIHRyeSB0byByZXN0b3JlIHBsYXllci4gSWYgaXQgZG9lc24ndCBleGlzdCwgc2V0IHRoZSBuZXcgZmxhZyAqLworICAgIG5ld2ZsYWcgPSAhcmVzdG9yZV9vYmplY3QoICIvIiArIFNBVkVQQVRIICsgbG93ZXJfY2FzZShzdHIpWzAuLjBdICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xvd2VyX2Nhc2Uoc3RyKSApOworCisgICAgdXBkYXRlc19hZnRlcl9yZXN0b3JlKG5ld2ZsYWcpOworCisgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICkKKyAgICB7CisgICAgICAvLyBUZWxuZXQtTmVnb3RpYXRpb25zIGR1cmNoZnVlaHJlbiwgYWJlciBudXIgZGllIGdydW5kbGVnZW5kZW4gYXVzCisgICAgICAvLyB0ZWxuZXRuZWcuIEFsbGUgYW5kZXJlbiBzb2xsdGVuIGVyc3Qgc3BhZXRlciwgbmFjaCB2b2xsc3RhZW5kaWdlcgorICAgICAgLy8gSW5pdGlhbGlzaWVydW5nIGdlbWFjaHQgd2VyZGVuLgorICAgICAgICB0ZWxuZXRuZWc6OnN0YXJ0dXBfdGVsbmV0X25lZ3MoKTsKKyAgICAgICAgbW9kaWZ5X3Byb21wdCgpOworICAgICAgICBTZXQoIFBfTEFTVF9MT0dJTiwgdGltZSgpICk7CisgICAgfQorCisgICAgU2V0KCBQX1dBTlRTX1RPX0xFQVJOLCAxICk7IC8vIDEgc29sbHRlIGRlciBkZWZhdWx0IHNlaW4gISEhCisgICAgU2V0KCBQX1dBTlRTX1RPX0xFQVJOLCBQUk9URUNURUQsIEZfTU9ERV9BUyApOworICAgIC8vIEVpbmdlZnVlZ3QgMTguMTEuOTksIGthbm4gbmFjaCBlaW5lbSBKYWhyIHdpZWRlciByYXVzOgorICAgIFNldCggUF9URVNUUExBWUVSLCBQUk9URUNURUQsIEZfTU9ERV9BUyApOworCisgICAgaWYgKCBJU19MRUFSTkVSKE1FKSApCisgICAgICAgIFNldFByb3AoIFBfQ0FOX0ZMQUdTLCBRdWVyeVByb3AoUF9DQU5fRkxBR1MpfENBTl9SRU1PVEUgKTsKKworICAgIFNldCggUF9OQU1FLCBzdHIgKTsKKyAgICBTZXQoIFBfTkFNRSwgU0VDVVJFRCwgRl9NT0RFX0FTICk7CisKKyAgICBpZiAoICFRdWVyeVByb3AoUF9ORUVERURfUVApICkKKyAgICAgICAgU2V0UHJvcCggUF9ORUVERURfUVAsIFJFUV9RUCApOworCisgICAgU2V0KCBQX05FRURFRF9RUCwgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCApOworICAgIFNldCggUF9ORUVERURfUVAsIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTICk7CisKKyAgICAvKiBhdXRvc2F2ZSB0aGUgcGxheWVyIGFmdGVyIDUwMCBoZWFydGJlYXRzICovCisgICAgdGltZV90b19zYXZlID0gYWdlICsgNTAwOworICAgIHBvdGlvbjo6Y3JlYXRlKCk7IC8qIERPIElUIEhFUkUgQUZURVIgVEhFIFJFU1RPUkUgISEgKi8KKworICAgIEFkZElkKCBnZXR1aWQoKSApOworICAgIFNldFByb3AoIFBfQUMsIDAgKTsKKyAgICBTZXRQcm9wKCBQX1dFQVBPTiwgMCApOworCisgICAgLyogU2V0IHNvbWUgdGhpbmdzIHdoaWNoIHdvbnQgYmUgc2V0IHdoZW4gYWxsIGlzIE9LICovCisgICAgU2V0UHJvcCggUF9NQVhfSFAsIChRdWVyeUF0dHJpYnV0ZShBX0NPTikgKiA4ICsgNDIgKSk7CisgICAgU2V0UHJvcCggUF9NQVhfU1AsIChRdWVyeUF0dHJpYnV0ZShBX0lOVCkgKiA4ICsgNDIgKSk7CisKKyAgICBjYXRjaCggYmIgPSAiL3NlY3VyZS9iYm1hc3RlciItPnF1ZXJ5X2JiKCkgKTsKKworICAgIC8qIElmIHRoaXMgaXMgYSBuZXcgY2hhcmFjdGVyLCB3ZSBjYWxsIHRoZSBhZHZlbnR1cmVycyBndWlsZCB0byBnZXQKKyAgICAgKiBvdXIgZmlyc3QgdGl0bGUgIQorICAgICAqLworICAgIGlmICggbmV3ZmxhZyApIHsKKyAgICAgICAgaWYgKCBRdWVyeUd1ZXN0KCkpCisgICAgICAgICAgICBTZXRQcm9wKCBQX1RJVExFLCAidWViZXJrb21tdCBkYXMgIk1VRE5BTUUiIC4uLiIgKTsKKworICAgICAgICBTZXQoIFBfTEVWRUwsIC0xICk7CisgICAgICAgIFNldFByb3AoIFBfQVRUUklCVVRFUywgKFsgQV9TVFI6MSwgQV9DT046MSwgQV9JTlQ6MSwgQV9ERVg6MSBdKSApOworICAgICAgICBTZXRQcm9wKCBQX0hQLCBRdWVyeVByb3AoUF9NQVhfSFApICk7CisKKyAgICAgICAgLy8gRXZlbnQgYXVzbG9lc2VuCisgICAgICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfUExBWUVSX0NSRUFUSU9OLCAoWworICAgICAgICAgICAgICBFX09CSkVDVDogTUUsCisgICAgICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQoTUUpIF0pICk7CisgICAgfQorICAgIAorICAgIEluaXRQbGF5ZXIoKTsKKworICAgIC8vIFBhZHJlaWMgMDEuMDIuMTk5OQorICAgIGlmICggIUlTX0xFQVJORVIoTUUpICYmIHNlY29uZCA9IFF1ZXJ5UHJvcChQX1NFQ09ORCkgKSB7CisgICAgICAgIGlmICggc3RyaW5ncChzZWNvbmQpICYmIGxvd2VyX2Nhc2Uoc2Vjb25kKVswLi4zXSA9PSAidm9uICIgKSB7CisgICAgICAgICAgICBzZWNvbmQgPSBsb3dlcl9jYXNlKHNlY29uZFs0Li5dKTsKKyAgICAgICAgICAgIFNldFByb3AoIFBfU0VDT05ELCBzZWNvbmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggIXN0cmluZ3Aoc2Vjb25kICkgfHwKKyAgICAgICAgICAgICBmaWxlX3NpemUoICIvc2F2ZS8iICsgc2Vjb25kWzAuLjBdICsgIi8iICsgc2Vjb25kICsgIi5vIiApIDw9IDAgKXsKKyAgICAgICAgICAgIGlmICggc3RyaW5ncChzZWNvbmQpICYmCisgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSggIi9zYXZlLyIgKyBsb3dlcl9jYXNlKHNlY29uZFswLi4wXSkgKyAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyX2Nhc2Uoc2Vjb25kKSArICIubyIgKSA+MCApeworICAgICAgICAgICAgICAgIFNldFByb3AoIFBfU0VDT05ELCBsb3dlcl9jYXNlKHNlY29uZCkgKTsKKyAgICAgICAgICAgICAgICBsb2dfZmlsZSggIldST05HX1NFQ09ORCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJXM6IFBfU0VDT05EID0gJU8gLT4gQXV0b21hdGlzY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia29ycmlnaWVydCxcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIG9iamVjdF9uYW1lKCksIHNlY29uZCApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqXG4qXG4qIERlaW5lIFp3ZWl0aWVtYXJraWVydW5nIGlzdCB1bmd1ZWx0aWcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdHRlIGFlbmRlcmUgZGllc2UgdW5kIHNwcmljaCBpbVxuKiBad2VpZmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpdHRlIGVpbmVuIEVyem1hZ2llciBhbi5cbipcbipcbiIgKTsKKworICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiV1JPTkdfU0VDT05EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlczogUF9TRUNPTkQgPSAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2JqZWN0X25hbWUoKSwgc2Vjb25kICkgKTsKKyAgICAgICAgICAgICAgICAvLyBlaW4gYmlzc2NoZW4gZGV1dGxpY2hlciBhdWZmb3JkZXJuLi4gUGFkcmVpYyAwOC4wNC4xOTk5CisgICAgICAgICAgICAgICAgbW92ZSggIi9kL2dlYmlyZ2Uvcm9vbS96d2FmZmxhZCIsIE1fR08gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKKy8qKiBMZXR6dGUgUGhhc2UgZGVyIFNwaWVsZXJpbml0aWFsaXNpZXJ1bmcgYmVpbSBMYWRlbiBkZXMgQ2hhcmFrdGVycy4KKyAgKiBSdWZ0IGVuYWJsZV9jb21tYW5kcygpLCBha3RpdmllcnQgZGVuIEhlYXJ0YmVhdCB1bmQgYWt0aXZpZXJ0IGRpZQorICAqIEtvbW1hbmRvcyBhdXMgZGVuIGdlZXJidGVuIGNvbW1hbmQuYywgcHV0X2FuZF9nZXQuYywgdGVhbS5jLCBzb3VsLmMsCisgICogZ3VpZGUuYywgc2V0enQgZGVuIExpdmluZyBOYW1lLgorICAqIFJlZ2lzdHJpZXJ0IFVzZVNwZWxsKCkgYWxzIENhdGNoYWxsLUtvbW1hbmRvLgorICAqIExhZXNzdCBkZW4gU3BpZWxlciBnZ2YuIGVpbmVuIExldmVsIHBlciAvc3RkL2dpbGRlIGF1ZnN0ZWlnZW4sIHJ1ZnQKKyAgKiBjYWxsX25vdGlmeV9wbGF5ZXJfY2hhbmdlKCksIGxvZXN0IExvZ2luLUV2ZW50IGF1cy4KKyAgKiBHaWJ0IFdpbGxrb21tZW5zdGV4dGUsIE5ld3MgdW5kIG5ldWUgTWFpbHMgYXVzLgorICAqIEZpbmRldCBkZW4gU3RhcnRyYXVtIHVuZCBiZXdlZ3QgZGVuIFNwaWVsZXIgZG9ydGhpbi4KKyAgKiBSdWZ0IEZpbmFsU2V0dXAoKSAoYXVzIGRlbiBSYXNzZW5zaGVsbHMpLgorICAqIEJlZ3Jlbnp0IEdlbGRtZW5nZSBpbSBTcGllbGVyICh3ZWdlbiBCYW5rendlaXRpZXMpIG5hY2ggVHJhZ2tyYWZ0IHVuZAorICAqIGVyc3RhdHRldCBHZWxkIGJlaSBSZWJvb3QuCisgICogUnVmdCBzZXRfaXNfd2l6YXJkKCkuCisgICogU3RhcnRldCBDbG9uZW4gZGVyIEF1dG9sb2FkZXIuCisgICogQHNhIEluaXRQbGF5ZXIzKCksSW5pdFBsYXllcjIoKSwgSW5pdFBsYXllcigpLCBzdGFydF9wbGF5ZXIoKS4KKyAgKi8KK3ByaXZhdGUgdm9pZCBJbml0UGxheWVyNCgpCit7CisgICAgaW50IG51bSwgc3RyLCBza2k7CisgICAgc3RyaW5nIGVyciwgY2FsbGVkX2Zyb21faXA7CisgICAgbWl4ZWQgc3RhcnRfcGxhY2U7CisgICAgb2JqZWN0IG1vbjsKKworICAgIGVuYWJsZV9jb21tYW5kcygpOworICAgIHNldF9oZWFydF9iZWF0KDEpOworICAgIGNvbW1hbmQ6OmluaXRpYWxpemUoKTsKKyAgICBhZGRfcHV0X2FuZF9nZXRfY29tbWFuZHMoKTsKKyAgICBhZGRfdGVhbV9jb21tYW5kcygpOworICAgIGFkZF9zb3VsX2NvbW1hbmRzKCk7CisgICAgYWRkX2d1aWRlX2NvbW1hbmRzKCk7CisgICAgYWRkX2FjdGlvbiggIlVzZVNwZWxsIiwgIiIsIDEgKTsKKyAgICBzZXRfbGl2aW5nX25hbWUoIGdldHVpZCgpICk7CisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoImRpc2Nvbm5lY3QiKSAhPSAtMSApCisgICAgICAgIDsKKworICAgIGlmICggUXVlcnlQcm9wKFBfTEVWRUwpID09IC0xICkKKyAgICB7CisgICAgICAgIGNhdGNoKCAiL3N0ZC9naWxkZSItPnRyeV9wbGF5ZXJfYWR2YW5jZSh0aGlzX29iamVjdCgpKSA7cHVibGlzaCApOworICAgIH0KKworICAgIGlmICggaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgY2FsbF9ub3RpZnlfcGxheWVyX2NoYW5nZSgxKTsKKworICAgIGlmICggaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgKSB7CisgICAgICAgIGNhdCggIi9ldGMvTkVXUyIgKTsKKworICAgICAgICBOZXdiaWVJbnRyb01zZygpOworCisgICAgICAgIGlmICggUXVlcnlQcm9wKFBfSU5WSVMpICYmICFJU19XSVpBUkQoTUUpICkKKyAgICAgICAgICAgIFNldFByb3AoIFBfSU5WSVMsIDAgKTsKKworICAgICAgICBjYXRjaCggbnVtID0gInNlY3VyZS9tYWlsZXIiLT5GaW5nZXJNYWlsKGdldHVpZCgpKTtwdWJsaXNoICk7CisKKyAgICAgICAgaWYgKCBudW0gKQorICAgICAgICAgICAgd3JpdGUoICJEdSBoYXN0ICIgKyBudW0gKyAiIG5ldWUiICsKKyAgICAgICAgICAgICAgICAgICAobnVtID09IDEgPyAibiBCcmllZiIgOiAiIEJyaWVmZSIpKyIgaW0gUG9zdGFtdCBsaWVnZW4uXG4iICk7CisKKyAgICAgICAgY2F0Y2goIFJlZ2lzdGVyQ2hhbm5lbHMoKTtwdWJsaXNoICk7CisKKyAgICAgICAgaWYgKCAoY2FsbGVkX2Zyb21faXAgPSBRdWVyeShQX0NBTExFRF9GUk9NX0lQKSkgJiYKKyAgICAgICAgICAgICBxdWVyeV9pcF9udW1iZXIoTUUpICE9IGNhbGxlZF9mcm9tX2lwICl7CisgICAgICAgICAgICBzdHJpbmcgdG1wOworCisgICAgICAgICAgICBpZiAoIHN0cmluZ3AodG1wID0gcXVlcnlfaXBfbmFtZShjYWxsZWRfZnJvbV9pcCkpICYmCisgICAgICAgICAgICAgICAgIHRtcCAhPSBjYWxsZWRfZnJvbV9pcCApCisgICAgICAgICAgICAgICAgdG1wID0gIiBbIiArIHRtcCArICJdIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSAiIjsKKworICAgICAgICAgICAgd3JpdGUoICJEYXMgbGV0enRlIE1hbCBrYW1zdCBEdSB2b24gIiArIGNhbGxlZF9mcm9tX2lwCisgICAgICAgICAgICAgICAgICAgKyB0bXAgKyAiLlxuIiApOworICAgICAgICB9CisKKyAgICAgICAgU2V0KCBQX0NBTExFRF9GUk9NX0lQLCBxdWVyeV9pcF9udW1iZXIoTUUpICk7CisgICAgfQorCisgICAgaWYgKCAhc3RyaW5ncChkZWZhdWx0X2hvbWUpIHx8IGRlZmF1bHRfaG9tZSA9PSAiIiApCisgICAgICAgIGRlZmF1bHRfaG9tZSA9ICIvZ2lsZGVuL2FiZW50ZXVyZXIiOworCisgICAgaWYgKCBJU19TRUVSKE1FKSAmJiAhSVNfTEVBUk5FUihNRSkgKQorICAgICAgICBjYXRjaCggc3RhcnRfcGxhY2UgPSBIQVVTVkVSV0FMVEVSLT5GaW5kZUhhdXMoZ2V0dWlkKE1FKSk7cHVibGlzaCApOworICAgIC8vIHdlbm4gZGVyIFNwaWVsZXIgbm9jaCBnYW56IGZyaXNjaCBpc3QgdW5kIG5vY2ggd2VuaWcgIFN0dWZlbnB1bmt0ZQorICAgIC8vIGdla3JpZWd0IGhhdCB1bmQgZGFzIFR1dG9yaWFsIG5vY2ggbmljaHQgZ2VtYWNodCBoYXQsIHN0YXJ0ZXQgZXIgaW0KKyAgICAvLyBUdXRvcmlhbC4KKyAgICBlbHNlIGlmIChRdWVyeVByb3AoUF9MRVApIDw9IDEyMAorICAgICAgICAgICAgICYmIFFNLT5IYXNNaW5pUXVlc3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICIvZC9hbmZhZW5nZXIvZW5ub3gvdHV0b3JpYWwvbnBjcy92ZXJrYWV1ZmVyIikgIT0gMSkKKyAgICAgICAgc3RhcnRfcGxhY2UgPSAiL3Jvb20vd2VsY29tZS8iKyBnZXR1aWQodGhpc19vYmplY3QoKSk7CisgICAgZWxzZQorICAgICAgICBzdGFydF9wbGFjZSA9IDA7CisKKyAgICBpZiAoICFzdGFydF9wbGFjZSApCisgICAgICAgIHN0YXJ0X3BsYWNlID0gUXVlcnlQcm9wKFBfU1RBUlRfSE9NRSk7CisKKyAgICBpZiggb2JqZWN0cChzdGFydF9wbGFjZSkgfHwgKHN0cmluZ3Aoc3RhcnRfcGxhY2UpICYmIHN0YXJ0X3BsYWNlICE9ICIiICkgKXsKKyAgICAgICAgaWYgKChlcnIgPSBjYXRjaChtb3ZlKCBzdGFydF9wbGFjZSwgTV9HT3xNX1NJTEVOVHxNX05PX1NIT1cgKTtwdWJsaXNoKSkgCisgICAgICAgICAgICB8fCAhZW52aXJvbm1lbnQoKSApCisgICAgICAgICAgICBlcnIgPSBjYXRjaChtb3ZlKCBkZWZhdWx0X2hvbWUsIE1fR098TV9TSUxFTlR8TV9OT19TSE9XICk7cHVibGlzaCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZXJyID0gY2F0Y2gobW92ZSggZGVmYXVsdF9ob21lLCBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPVyApO3B1Ymxpc2gpOworCisgICAgaWYgKCBlcnIgKQorICAgICAgICBjYXRjaChtb3ZlKCAiL2dpbGRlbi9hYmVudGV1cmVyIiwgTV9HT3xNX1NJTEVOVHxNX05PX1NIT1cgKTtwdWJsaXNoKTsKKworICAgIC8vIERpZSBTaGVsbCBtdXNzIEZpbmFsU2V0dXAoKSBuaWNodCBpbXBsZW1lbnRpZXJlbi4gRGFoZXIgQ2FsbG90aGVyCisgICAgY2F0Y2goIE1FLT5GaW5hbFNldHVwKCk7cHVibGlzaCApOworCisgICAgLy8gTG9naW4tZXZlbnQgYXVzbG9lc2VuCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9MT0dJTiwgKFsKKyAgICAgICAgICBFX09CSkVDVDogTUUsCisgICAgICAgICAgRV9QTE5BTUU6IGdldHVpZChNRSksCisgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQoKSBdKSApOworCisgICAgLy8gZXJzdCBqZXR6dCBHTUNQIGZyZWlnZWJlbiB1bmQgenUgdmVyaGFuZGVsbi4KKyAgICBnbWNwOjpzdGFydHVwX3RlbG5ldF9uZWdzKCk7CisKKyAgICAvLyBTY2hvbm1hbCBzaWNoZXJuLCBmYWxscyBlaW4gQnVnIChFdmFsY29zdC4uLikgZGF6d2lzY2hlbiBrb21tZW4gc29sbHRlLgorICAgIGF1dG9sb2FkX3Jlc3QgPSBhdXRvbG9hZDsKKworICAgIC8vIFVtIEdlbGQtWHRpZXMgbWl0IGlsbGVnYWwgdmllbCBHZWxkIHp1IHZlcm1laWRlbiwga29tbXQgZWluIENoZWNrOgorICAgIGlmICggIUlTX0xFQVJORVIoTUUpICYmICFRdWVyeShQX1RFU1RQTEFZRVIpICYmCisgICAgICAgICBtb24gPSBwcmVzZW50KCAiXG5nZWxkIiwgTUUgKSApeworICAgICAgICAvLyBtYXhpbWFsZSBLcmFmdCwgZGllIGRlciBTcGllbGVyIGhhZXR0ZSBoYWJlbiBrb2VubmVuCisgICAgICAgIHN0ciA9IFF1ZXJ5QXR0cmlidXRlKEFfU1RSKSArIDQ7CisgICAgICAgIGlmICggUXVlcnkoUF9GUk9HKSApCisgICAgICAgICAgICBzdHIgKz0gMzA7CisgICAgICAgIGlmICggc3RyIDwgMSApCisgICAgICAgICAgICBzdHIgPSBRdWVyeVJlYWxBdHRyaWJ1dGUoQV9TVFIpICsgNDsKKyAgICAgICAgaWYgKCBzdHIgPiAzMCApCisgICAgICAgICAgICBzdHIgPSAzMDsKKworICAgICAgICAvLyBUcmFnZXNraWxsIGJlYWNodGVuCisgICAgICAgIHNraSA9IHRvX2ludChVc2VTa2lsbCggU0tfQ0FSUlksIChbU0lfU0tJTExBUkcgOiBzdHIgXSkgKSk7CisgICAgICAgIGlmICggIWludHAoc2tpKSApCisgICAgICAgICAgICBza2kgPSAwOworCisgICAgICAgIC8vIFdpZXZpZWwga29ubnRlIGRlciBTcGllbGVyIGluc2dlc2FtdCBtYXhpbWFsIHRyYWdlbj8KKyAgICAgICAgbnVtID0gOTIwMCArIHN0ciAqIDgwMCArIHNraTsKKyAgICAgICAgaWYgKCBudW0gPCAzMDAwICkKKyAgICAgICAgICAgIG51bSA9IDMwMDA7CisKKyAgICAgICAgLy8gVmVyZG9wcGVsbiBmdWVyIGVpbmVuIGd1dGVuIENvbnRhaW5lciB1bmQgbm9jaG1hbCAyMCUgZHJhdWZzY2hsYWdlbgorICAgICAgICAvLyB6dXIgU2ljaGVyaGVpdC4gRGFzIEdhbnplIGRhbmFjaCAqNCwgdW0gZGllIG1heGltYWxlIEFuemFobCBNdWVuemVuCisgICAgICAgIC8vIHp1IGVyaGFsdGVuLgorICAgICAgICBudW0gPSAoaW50KSAobnVtICogOC44KTsKKworICAgICAgICAvLyBHZWxkLCBkYXMgenV2aWVsIGlzdCwgYXVmIGRlbiBNYXhpbWFsd2VydCBrdWVyemVuLgorICAgICAgICAvLyBadXIgU2ljaGVyaGVpdCB3aXJkIG1pdGdlbG9nZ3QuIEZhbGxzIGVpbiBTcGllbGVyIHNpY2ggKHp1IHJlY2h0KQorICAgICAgICAvLyBiZXNjaHdlcnQsIGthbm4gbWFuIGltbWVyIG5vY2ggd2llZGVyIGRpZSBTdW1tZSBrb3JyaWdpZXJlbiA7LSkKKyAgICAgICAgaWYgKCAoc3RyID0gbW9uLT5RdWVyeVByb3AoUF9BTU9VTlQpKSA+IG51bSApeworICAgICAgICAgICAgbW9uLT5TZXRQcm9wKCBQX0FNT1VOVCwgbnVtICk7CisgICAgICAgICAgICBsb2dfZmlsZSggIlpVVklFTF9HRUxEIiwgc3ByaW50ZiggIiVzOiAlcyBoYXR0ZSAlZCBNdWVuemVuIGJlaSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpY2guIEtvcnJpZ2llcnQgYXVmICVkLlxuICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKVs0Li5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKE1FKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCBudW0gKSApOworICAgICAgICB9CisgICAgfQorICAgIGludCBlbnRzY2hhZWRpZ3VuZyA9IFF1ZXJ5UHJvcChQX0NBUlJJRURfVkFMVUUpOworICAgIGlmICggZW50c2NoYWVkaWd1bmcgPiAwICkKKyAgICB7CisgICAgICAgIHdyaXRlKCAiRHUgZmluZGVzdCAiICsgZW50c2NoYWVkaWd1bmcgKworICAgICAgICAgICAgICAgIiBNdWVuemVuLCBkaWUgRHUgYmVpbSBsZXR6dGVuIE1hbCB2ZXJsb3JlbiBoYXN0LlxuIiApOworCisgICAgICAgIGlmICggTWF5QWRkV2VpZ2h0KCBlbnRzY2hhZWRpZ3VuZyAvIDQgKSApeworICAgICAgICAgICAgd3JpdGUoICJXZWlsIER1IG5pY2h0IG1laHIgc292aWVsIHRyYWdlbiBrYW5uc3QsIHNwZW5kZXN0IER1IGRlbiAiKworICAgICAgICAgICAgICAgICAgICJSZXN0IGRlciBaZW50cmFsYmFuay5cbiIgKTsKKworICAgICAgICAgICAgbnVtID0gKFF1ZXJ5UHJvcChQX01BWF9XRUlHSFQpIC0gcXVlcnlfd2VpZ2h0X2NvbnRlbnRzKCkpICogNDsKKyAgICAgICAgICAgIGVudHNjaGFlZGlndW5nID0gKG51bSA8IDApID8gMCA6IG51bTsKKyAgICAgICAgfQorCisgICAgICAgIEFkZE1vbmV5KCBlbnRzY2hhZWRpZ3VuZyApOworICAgICAgICBTZXRQcm9wKFBfQ0FSUklFRF9WQUxVRSwwKTsKKyAgICB9CisKKyAgICBpZiAoICFRdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICBzYXkoIGNhcGl0YWxpemUobmFtZShXRVIpKSArICIgYmV0cml0dCBkaWVzZSBXZWx0LlxuIiApOworICAgIGVsc2UKKyAgICAgICAgd3JpdGUoICJEVSBCSVNUIFVOU0lDSFRCQVIhXG5cbiIgKTsKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNldF9pc193aXphcmQpCisgICAgaWYgKCBJU19XSVpBUkQoZ2V0dWlkKE1FKSkgKQorICAgICAgICBzZXRfaXNfd2l6YXJkKCBNRSwgMSApOworICAgIGVsc2UKKyAgICAgICAgc2V0X2lzX3dpemFyZCggTUUsIDAgKTsKKyNlbmRpZgorICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgKQorICAgICAgICBMaXN0QXdhaXRlZCgpOworCisgICAgLy8gQXV0b2xvYWRlciB3ZXJkZW4gZ2FueiB6dW0gU2NobHVzcyBnZWNsb250LCBkYSBkYXMgYmlzIHp1bSBiaXR0ZXJlbgorICAgIC8vIChFdmFsY29zdC0pRW5kZSBnZXNjaGllaHQgdW5kIGRhbmFjaCB1LlUuIGtlaW5lIFJlY2hlbnplaXQgZnVlcgorICAgIC8vIGFuZGVyZSBBa3Rpb25lbiBtZWhyIHVlYmVyIGlzdAorICAgIGxvYWRfYXV0b19vYmplY3RzKCBhdXRvbG9hZCApOworfQorCisvKiogU2V0enQgZGllIFNwaWVsZXJpbml0aWFsaXNpZXJ1bmcgbmFjaCBzdGFydF9wbGF5ZXIoKSBmb3J0LgorICAqIFBydWVmdCBkZW4gV2VydCBkZXIgdm9tIFNwaWVsZXIgZ2V0cmFnZW5lbiBTYWNoZW4gKGZ1ZXIgRW50c2NoYWVkaWd1bmcKKyAgKiBuYWNoIFJlYm9vdCkuCisgICogU2V0enQgZGl2LiBQcm9wZXJ0aWVzIGRlcyAiU3BpZWxlcmtvZXJwZXJzIiwgZGllIGVpZ2VudGxpY2ggZ2VzcGVpY2hlcnQKKyAgKiB3ZXJkZW4sIG5hY2ggZWluZW0gUmVib290IHp1cnVlY2suCisgICogRnJhZ3QgZ2dmLiBuYWNoIGVNYWlsLUFkcmVzc2UgdW5kIHVlYmVyZ2lidCBwZXIgaW5wdXRfdG8gYW4KKyAgKiBJbml0UGxheWVyMigpLgorICAqIEBzYSBJbml0UGxheWVyMygpLEluaXRQbGF5ZXIyKCksIEluaXRQbGF5ZXIoKSwgc3RhcnRfcGxheWVyKCkuCisqLworcHJpdmF0ZSB2b2lkIEluaXRQbGF5ZXIoKQoreworICAgIHN0cmluZyBtYWlsYWRkcjsKKworICAgIC8vIHdlbm4gZXMgZWluZW4gQ3Jhc2ggZ2FiLCBzb2xsZW4gU3BpZWxlciBuaWNodCBub2NoIGV4dHJhIGJlc3RyYWZ0IHdlcmRlbgorICAgIGlmICggZmlsZV90aW1lKCAiL3NhdmUvIiArIGdldHVpZCgpWzAuLjBdICsgIi8iICsgZ2V0dWlkKCkgKyAiLm8iICkKKyAgICAgICAgIDwgbGFzdF9yZWJvb3RfdGltZSgpICl7CisgICAgICAgIFNldFByb3AoIFBfRk9PRCwgMCApOworICAgICAgICBTZXRQcm9wKCBQX0RSSU5LLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfQUxDT0hPTCwgMCApOworICAgICAgICBTZXRQcm9wKCBQX0JMSU5ELCAwICk7CisgICAgICAgIFNldFByb3AoIFBfREVBRiwgMCApOworICAgICAgICBTZXRQcm9wKCBQX1BPSVNPTiwgMCApOworICAgICAgICBTZXRQcm9wKCBQX0dIT1NULCAwICk7CisgICAgICAgIFNldFByb3AoIFBfRlJPRywgMCApOworICAgICAgICBTZXRQcm9wKCBQX0hQLCBRdWVyeVByb3AoUF9NQVhfSFApICk7CisgICAgICAgIFNldFByb3AoIFBfU1AsIFF1ZXJ5UHJvcChQX01BWF9TUCkgKTsKKyAgICB9CisKKyAgICBpZiAoIFF1ZXJ5R3Vlc3QoKSApCisgICAgICAgIFNldCggUF9NQUlMQUREUiwgIm5vbmUiICk7CisgICAgZWxzZSBpZiAoICEobWFpbGFkZHIgPSBRdWVyeShQX01BSUxBRERSKSkgfHwgbWFpbGFkZHIgPT0gIiIgKSB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiRWluZSBndWVsdGlnZSBFTWFpbC1BZHJlc3NlIGVybGVpY2h0ZXJ0IGVzIGVyaGVibGljaCwgRGlyICIKKyAgICAgICAgICAiZWluIG5ldWVzIFBhc3N3b3J0IHNldHplbiB6dSBsYXNzZW4sIGZhbGxzIER1IGVpbm1hbCBEZWluICIKKyAgICAgICAgICAiUGFzc3dvcnQgdmVyZ2lzc3QuIiw3OCkpOyAKKyAgICAgICAgaW5wdXRfdG8oICJnZXRtYWlsYWRkciIsSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgIkdpYiBiaXR0ZSBEZWluZSBFTWFpbC1BZHJlc3NlIGFuOiAiICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSW5pdFBsYXllcjIoKTsKK30KKworLyoqIGxpZXN0IGVNYWlsLUFkcmVzc2Ugdm9tIFNwaWVsZXIgZWluIHVuZCBzcGVpY2hlcnQgc2llLgorICAqIFVlYmVyZ2lidCBhbnNjaGxpZXNzZW5kIGFuIEluaXRQbGF5ZXIyKCkKKyAgKiBAcGFyYW1baW5dIG1hZGRyIFNwaWVsZXJlaW5nYWJlIGRlciBFbWFpbGFkcmVzc2UuCisgICogQHNhIEluaXRQbGF5ZXIyKCkuCisgICovCitzdGF0aWMgdm9pZCBnZXRtYWlsYWRkciggc3RyaW5nIG1hZGRyICkKK3sKKyAgICBtYWRkciA9IGNoZWNrX2VtYWlsKG1hZGRyKTsKKworICAgIGlmICggIXN0cmluZ3AobWFkZHIpKSB7CisgICAgICB3cml0ZSgiRGVpbmUgRWluZ2FiZSBzY2hlaW50IGtlaW5lIGd1ZWx0aWdlIEVNYWlsLUFkcmVzc2UgZ2V3ZXNlbiAiCisgICAgICAgICAgInp1IHNlaW4uXG4iKTsKKyAgICAgIGlucHV0X3RvKCAiZ2V0bWFpbGFkZHIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgIkdpYiBiaXR0ZSBEZWluZSBFTWFpbC1BZHJlc3NlIGFuOiAiICk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIFNldCggUF9NQUlMQUREUiwgbWFkZHIgKTsKKyAgICBJbml0UGxheWVyMigpOworfQorCisKKy8qKiBQcnVlZnQgR2VzY2hsZWNodCBkZXMgU3BpZWxlcnMgdW5kIGZyYWd0IGdnZi4gYmVpbSBTcGllbGVyIG5hY2guCisgICogVWViZXJnaWJ0IGFuIEluaXRQbGF5ZXIzKCkgb2RlciBnZXRfZ2VuZGVyKCkuCisgICogQHNhIEluaXRQbGF5ZXIzKCksIGdldF9nZW5kZXIoKS4KKyAgKi8KK3ByaXZhdGUgdm9pZCBJbml0UGxheWVyMigpCit7CisgICAgaWYoIG1lbWJlcigoeyBNQUxFLCBGRU1BTEUgfSksIFF1ZXJ5UHJvcChQX0dFTkRFUikgKSA9PSAtMSApIHsKKyAgICAgICAgaW5wdXRfdG8oICJnZXRnZW5kZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiQmlzdCBEdSBtYWVubmxpY2ggb2RlciB3ZWlibGljaDogIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbml0UGxheWVyMygpOworfQorCisvKiogTGllc3QgU3BpZWxlcmFudHdvcnQgYXVmIGRpZSBGcmFnZSBuYWNoIGRlbSBHZXNjaGxlY2h0IGRlcyBDaGFycyBlaW4uCisgICogV2lyZCBnZXJ1ZmVuIHZvbiBpbnB1dF90bygpLgorICAqIFVlYmVyZ2lidCBhbiBJbml0UGxheWVyMygpLgorICAqIEBzYSBJbml0UGxheWVyMygpLgorICAqLworc3RhdGljIHZvaWQgZ2V0Z2VuZGVyKCBzdHJpbmcgZ2VuZGVyX3N0cmluZyApCit7CisgICAgZ2VuZGVyX3N0cmluZyA9IGxvd2VyX2Nhc2UoIGdlbmRlcl9zdHJpbmcgKTsKKworICAgIGlmICggc2l6ZW9mKGdlbmRlcl9zdHJpbmcpPT0xICYmIGdlbmRlcl9zdHJpbmdbMF0gPT0gJ20nICl7CisgICAgICAgIHdyaXRlKCAiV2lsbGtvbW1lbiwgbWVpbiBIZXJyIVxuIiApOworICAgICAgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICAgIH0KKyAgICBlbHNlIGlmICggc2l6ZW9mKGdlbmRlcl9zdHJpbmcpPT0xICYmIGdlbmRlcl9zdHJpbmdbMF0gPT0gJ3cnICl7ICAgIAorICAgICAgICB3cml0ZSggIldpbGxrb21tZW4sIGduYWUnIEZyYXUhXG4iICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsgICAgCisgICAgfSAgICAKKyAgICBlbHNlIHsKKyAgICAgICAgd3JpdGUoICJXaWU/IFdhcz8gVmVyc3RlaGUgaWNoIG5pY2h0IVxuIiApOyAgICAKKyAgICAgICAgaW5wdXRfdG8oICJnZXRnZW5kZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiQmlzdCBEdSBtYWVubmxpY2ggb2RlciB3ZWlibGljaD8gKHRpcHBlIG0gb2RlciB3KTogIik7ICAgIAorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSW5pdFBsYXllcjMoKTsKK30KKworCisvKiogUHJ1ZWZ0IFRlcm1pbmFsdHlwIGRlcyBTcGllbGVycyB1bmQgZnJhZ3QgZ2dmLiBiZWltIFNwaWVsZXIgbmFjaC4KKyAgKiBVZWJlcmdpYnQgYW4gSW5pdFBsYXllcjQoKSBvZGVyIGdldHR0eSgpLgorICAqIEBzYSBJbml0UGxheWVyNCgpLCBnZXR0dHkoKS4KKyAgKi8KK3ByaXZhdGUgdm9pZCBJbml0UGxheWVyMygpCit7CisgICAgaWYgKCAhUXVlcnlQcm9wKFBfVFRZKSB8fCBRdWVyeVByb3AoUF9UVFkpID09ICJub25lIiApCisgICAgeworICAgICAgICB3cml0ZSggIldhZWhsZSBlaW5lbiBUZXJtaW5hbHR5cCAoa2FubiBzcGFldGVyIG1pdCA8c3R0eT4gZ2VhZW5kZXJ0ICIKKyAgICAgICAgICAgICAgICJ3ZXJkZW4pXG4iKTsKKyAgICAgICAgaW5wdXRfdG8oICJnZXR0dHkiLCBJTlBVVF9QUk9NUFQsICJ2dDEwMCwgYW5zaSwgZHVtYiAoU3RhbmRhcmQ6IGR1bWIpOiAiICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSW5pdFBsYXllcjQoKTsKK30KKworLyoqIExpZXN0IFNwaWVsZXJhbnR3b3J0IGF1ZiBkaWUgRnJhZ2UgbmFjaCBkZW0gVGVybWluYWx0eXAgZWluLgorICAqIFdpcmQgZ2VydWZlbiB2b24gaW5wdXRfdG8oKS4KKyAgKiBVZWJlcmdpYnQgYW4gSW5pdFBsYXllcjQoKS4KKyAgKiBAc2EgSW5pdFBsYXllcjQoKS4KKyAgKi8KK3N0YXRpYyB2b2lkIGdldHR0eSggc3RyaW5nIHR0eXN0ciApCit7CisgICAgaWYgKCAhdHR5c3RyIHx8IHR0eXN0ciA9PSAiIiApCisgICAgICAgIHR0eXN0ciA9ICJkdW1iIjsKKworICAgIHR0eXN0ciA9IGxvd2VyX2Nhc2UodHR5c3RyKTsKKworICAgIGlmICggdHR5c3RyID09ICJ2dDEwMCIgKXsKKyAgICAgICAgd3JpdGUoICJEaWVzIHNvbGx0ZSAiICsgQU5TSV9CT0xEICsgImZldHQiICsgQU5TSV9OT1JNQUwgKyAiIHNlaW4uXG4iICk7CisgICAgICAgIFNldFByb3AoIFBfVFRZLCB0dHlzdHIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpZiAoIHR0eXN0ciA9PSAiYW5zaSIgKXsKKyAgICAgICAgICAgIHdyaXRlKCAiRGllcyBzb2xsdGUgIiArIEFOU0lfUkVEICsgInJvdCIgKyBBTlNJX05PUk1BTCArCisgICAgICAgICAgICAgICAgICAgIiBzZWluLlxuIiApOworICAgICAgICAgICAgU2V0UHJvcCggUF9UVFksICJhbnNpIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB0dHlzdHIgPT0gImR1bWIiICl7CisgICAgICAgICAgICB3cml0ZSggIk9oamUsIG9lZGUhIEJlc29yZyBEaXIgZWluIGJlc3NlcmVzIFRlcm1pbmFsIVxuIiApOworICAgICAgICAgICAgU2V0UHJvcCggUF9UVFksICJkdW1iIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgd3JpdGUoICJEaWVzZXIgVGVybWluYWx0eXAgd2lyZCBuaWNodCB1bnRlcnN0dWV0enQuIE5pbW0gYml0dGUgIgorICAgICAgICAgICAgICAgICAgICJlaW5lbiBhdXM6XG52dDEwMCwgYW5zaSBvciBkdW1iIChTdGFuZGFyZCBpc3QgZHVtYikuXG4iICk7CisgICAgICAgICAgICBpbnB1dF90byggImdldHR0eSIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICAgICAidnQxMDAsIGFuc2kgb3IgZHVtYiAoU3RhbmRhcmQgaXN0IGR1bWIpOiAiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgSW5pdFBsYXllcjQoKTsKK30KKworCisvKiogTGllZmVydCBkaWUgVUlEIGRlcyBDaGFyYWt0ZXJzIHp1cnVlY2ssIGFsc28gZGVuIENoYXJha3Rlcm5hbWVuLgorICAqIEByZXR1cm4gVUlEIGRlcyBPYmpla3RzIChDaGFyYWt0ZXJuYW1lKS4KKyAgKi8KK25vbWFzayBzdHJpbmcgcXVlcnlfcmVhbF9uYW1lKCkgeworICAvKiBBQ0hUVU5HICEhIERJRVMgTEZVTiBEQVJGIE5JQ0hUIEVOVEZFUk5UIFdFUkRFTiAhISEgKi8KKyAgLyogU2llIHdpcmQgdm9tIEdhbWVkcml2ZXIgKHpCIGJlaSBGX0VEKSBhdWZnZXJ1ZmVuICEhICovCisgIC8qIEljaCBiaW4gZGEgendhciBuaWNodCBzbyB1ZWJlcnpldWd0IHZvbiwgZGFzcyBkZXIgRHJpdmVyIGRpZSBoZXV0enV0YWdlCisgICAqIG5vY2ggcnVmdCwgYWJlciBkaWUgaGFsYmUgTXVkbGliIHJ1ZnQgc2llLiA7LSkgKFplc3N0cmEsIDI3LjQuMDgpCisgICAqLworICByZXR1cm4gZ2V0dWlkKCk7Cit9CisKKy8qCisgKiB0aGUgd2l6YXJkIGNvbW1hbmQgcmV2aWV3OiBzaG93IHBsYXllciBtb3ZpbmcgbWVzc2FnZXMKKyAqLworaW50IHJldmlldygpIHsKKyAgc3RyaW5nICptc2c7CisgIHdyaXRlKHNob3J0KCkpOworICB3cml0ZSgiRGVpbmUgQmV3ZWd1bmdlbiB3ZXJkZW4gd2llIGZvbGd0IGdlbWVsZGV0OlxuIisKKyAgICAgICAgIm1vdXQ6ICAiK25hbWUoV0VSKSsiICIrKG1zZz1leHBsb2RlKFF1ZXJ5UHJvcChQX01TR09VVCksIiMiKSlbMF0KKyAgICAgICArIiA8UmljaHR1bmc+Iisoc2l6ZW9mKG1zZyk+MSA/IG1zZ1sxXSA6ICIiKSsiLlxuIisKKyAgICAgICAgIm1pbjogICAiK25hbWUoV0VSKSsiICIrUXVlcnlQcm9wKFBfTVNHSU4pKyIuXG4iKworICAgICAgICAibW1vdXQ6ICIrbmFtZShXRVIpKyIgIitRdWVyeVByb3AoUF9NTVNHT1VUKSsiLlxuIisKKyAgICAgICAgIm1taW46ICAiK25hbWUoV0VSKSsiICIrUXVlcnlQcm9wKFBfTU1TR0lOKSsiLlxuIisKKyAgICAgICAgKElTX0xFQVJORVIoTUUpID8KKyAgICAgICAgICJjbXNnOiAgIituYW1lKFdFUikrIiAiK1F1ZXJ5UHJvcChQX0NMT05FX01TRykrIi5cbiIrCisgICAgICAgICAiZG1zZzogIDxJcmdlbmRldHdhcz4gIitRdWVyeVByb3AoUF9ERVNUUlVDVF9NU0cpKyIuXG4iCisgICAgICAgICA6ICIiKSsKKyAgICAgICAgIldlbm4gRHUgamVtYW5kZW4gYW5ncmVpZnN0LCBzaWVodCBkYXMgc28gYXVzOlxuIisKKyAgICAgICAgbmFtZShXRVIpKyIgZ3JlaWZ0IERpY2giK1F1ZXJ5UHJvcChQX0hBTkRTKVswXSsiIGFuLlxuIik7CisgIHJldHVybiAxOworfQorCisvKgorICogc2V0IHBsYXllciBtb3ZpbmcgbWVzc2FnZXMKKyAqLworCitzdGF0aWMgaW50IHNldG1pbihzdHJpbmcgc3RyKQoreworICBTZXRQcm9wKFBfTVNHSU4sIF91bnBhcnNlZF9hcmdzKCl8fCJrb21tdCBhbiIpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0bW91dChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKm1zZzsKKworICBpZihzaXplb2YobXNnPWV4cGxvZGUoKF91bnBhcnNlZF9hcmdzKCl8fCJnZWh0IiksIiMiKSk+MikKKyAgeworICAgIHdyaXRlKCJEdSBkYXJmc3QgbnVyIGVpbm1hbCAnIycgZnVlciBkaWUgUmljaHR1bmcgYW5nZWJlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHNpemVvZihtc2cpPjEpCisgIHsKKyAgICBpZiAobXNnWzBdIT0iIiAmJiBtc2dbMF1bPDFdPT0nICcpIG1zZ1swXT1tc2dbMF1bMC4uPDJdOworICAgIFNldFByb3AoUF9NU0dPVVQsIG1zZ1swXSsiIyIrbXNnWzFdKTsKKyAgfQorICBlbHNlCisgICAgU2V0UHJvcChQX01TR09VVCwgX3VucGFyc2VkX2FyZ3MoKXx8ImdlaHQiKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldG1taW4oc3RyaW5nIHN0cikKK3sKKyAgU2V0UHJvcChQX01NU0dJTiwgX3VucGFyc2VkX2FyZ3MoKXx8ImVyc2NoZWludCIpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0bW1vdXQoc3RyaW5nIHN0cikKK3sKKyAgU2V0UHJvcChQX01NU0dPVVQsIF91bnBhcnNlZF9hcmdzKCl8fCJ2ZXJzY2h3aW5kZXQiKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldGNtc2coc3RyaW5nIHN0cikKK3sKKyAgU2V0UHJvcChQX0NMT05FX01TRywgX3VucGFyc2VkX2FyZ3MoKXx8InphdWJlcnQgZXR3YXMgYXVzICIKKyAgICAgICAgICArIFF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU0pICsgIiBBZXJtZWwgaGVydm9yIik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRkbXNnKHN0cmluZyBzdHIpCit7CisgIFNldFByb3AoUF9ERVNUUlVDVF9NU0csIF91bnBhcnNlZF9hcmdzKCl8fCJ3aXJkIHZvbiAiICsgbmFtZShXRVIsMSkKKyAgICAgICAgICArICIgemVyc3RhZXVidCIpOworICB3cml0ZSgiT2suXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3RpdGxlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBib251czsKKyAgCisgIGlmKCFJU19TRUVSKHRoaXNfb2JqZWN0KCkpICYmICFGQU9fSEFTX1RJVExFX0dJRlQodGhpc19vYmplY3QoKSkgKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGJvbnVzID0gIiI7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkKKyAgICBzdHIgPSAiIjsKKyAgZWxzZSBpZiggc3RyWzAuLjJdPT0iXFxiLCIgfHwgc3RyWzAuLjJdPT0iXFxiJyIgKQorICB7CisgICAgYm9udXMgPSAiXGIiOyAvLyBlaW4gYmFja3NwYWNlIGZ1ZXIgZWluIChob2NoKWtvbW1hIGlzdCBvayEgOi0pCisgICAgc3RyID0gc3RyWzIuLl07CisgIH0KKyAgaWYoc3RyPT0iMCIpICAvLyBkYW1pdCBkZXIgR2lsZGVudGl0ZWwgenVtIFZvcnNjaGVpbiBrb21tZW4ga2FubgorICAgIFNldFByb3AoUF9USVRMRSwgMCk7CisgIGVsc2UKKyAgICBTZXRQcm9wKFBfVElUTEUsIGJvbnVzK3N0cik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHRyYV9pbnB1dChzdHJpbmcgc3RyLCBzdHJpbmcgbG9vaykKK3sKKyAgaWYgKHN0cj09IioqIikKKyAgeworICAgIGlmIChsb29rPT0iIikKKyAgICAgIFNldFByb3AoUF9FWFRSQV9MT09LLDApOworICAgIGVsc2UKKyAgICAgIFNldFByb3AoUF9FWFRSQV9MT09LLGxvb2spOworICAgIHdyaXRlKCJPay5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlucHV0X3RvKCJleHRyYV9pbnB1dCIsSU5QVVRfUFJPTVBULCAiXSIgLGxvb2src3RyKyJcbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHRyYWxvb2sobWl4ZWQgc3RyKQoreworICBpZiggc3RyPT0iPyIgKQorICB7CisgICAgd3JpdGUoICJEZWluIEV4dHJhbG9vayBpc3QgOiAiK1F1ZXJ5UHJvcChQX0VYVFJBX0xPT0spICsgIlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIkJpdHRlIGdpYiBEZWluZW4gRXh0cmEtTG9vayBlaW4uIEJlZW5kZW4gbWl0ICoqOlxuIik7CisgIGlucHV0X3RvKCJleHRyYV9pbnB1dCIsSU5QVVRfUFJPTVBULCJdIiwiIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfdmFsdWUoKQoreworICBpbnQgaSwgY2FycmllZF92YWx1ZSwgdmFsdWU7CisKKyAgY2FycmllZF92YWx1ZT0wOworICBmb3JlYWNoKG9iamVjdCBvYjogZGVlcF9pbnZlbnRvcnkoTUUpKSB7CisgICAgaWYgKCFvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopKQorICAgICAgY2FycmllZF92YWx1ZSs9KCh2YWx1ZT0oaW50KW9iLT5RdWVyeVByb3AoUF9WQUxVRSkpID4gMTAwMCA/IDEwMDAgOiB2YWx1ZSk7CisgIH0KKyAgU2V0UHJvcChQX0NBUlJJRURfVkFMVUUsIGNhcnJpZWRfdmFsdWUpOworfQorCisvKiBDYWxsZWQgYnkgY29tbWFuZCAnc2F2ZScgKi8KK2ludCBzYXZlX2NoYXJhY3RlcigpIHsKKyAgc2F2ZV9tZSgxKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCit2b2lkIHNhdmVfbWUobWl4ZWQgdmFsdWVfaXRlbXMpCit7CisgIC8vIEdhZXN0ZSB3ZXJkZW4gbmljaHQgZ2VzcGVpY2hlcnQKKyAgaWYoIGdldHVpZCgpWzAuLjNdPT0iZ2FzdCIgKQorICAgIHJldHVybjsKKyAKKyAgLy8gQXV0b2xvYWRlciBpZGVudGlmaXppZXJlbiB1bmQgc3BlaWNoZXJuCisgIGF1dG9sb2FkPShbXSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBkZWVwX2ludmVudG9yeShNRSkpIHsKKyAgICBpbnQgdmFsID0gb2ItPlF1ZXJ5UHJvcCggUF9BVVRPTE9BRE9CSiApOworICAgIGlmICh2YWwgJiYgY2xvbmVwKG9iKSkKKyAgICB7CisgICAgICBzdHJpbmcgb2JuYW1lPWxvYWRfbmFtZShvYik7CisgICAgICBpZiAob2JuYW1lID09IEdFTEQpCisgICAgICAgIGF1dG9sb2FkW29ibmFtZV0gKz0gdmFsOworICAgICAgZWxzZQorICAgICAgICBhdXRvbG9hZCArPSAoW29ibmFtZTp2YWxdKTsKKyAgICB9CisgIH0KKyAgLy8gQW4gbm9jaCBuaWNodCBnZWNsb250ZSBBdXRvbG9hZGVyIGRlbmtlbiEKKyAgYXV0b2xvYWQgKz0gYXV0b2xvYWRfcmVzdDsKKyAgCisgIC8vIEltIEJlZGFyZnNmYWxsIFdlcnQgZGVzIEludmVudG9yeSBiZXN0aW1tZW4KKyAgaWYgKHZhbHVlX2l0ZW1zKQorICAgIGNhbGN1bGF0ZV92YWx1ZSgpOworICBlbHNlCisgICAgU2V0UHJvcChQX0NBUlJJRURfVkFMVUUsIDApOworCisgIC8vIExvZ291dC1aZWl0IHNwZWljaGVybgorICBpZihxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSAmJiAhUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIFNldChQX0xBU1RfTE9HT1VULHRpbWUoKSk7CisKKyAgLy8gRnVua3Rpb24genVyIEJlc3RpbW11bmcgZGVzIEdpbGRlbnJhdGluZyBhdWZydWZlbgorICBzdHJpbmcgZ2lsZGU9R1VJTERfRElSK1F1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgaWYgKGZpbmRfb2JqZWN0KGdpbGRlKSB8fCBmaWxlX3NpemUoZ2lsZGUrIi5jIik+LTEpCisgICAgY2F0Y2goY2FsbF9vdGhlcihnaWxkZSwiR3VpbGRSYXRpbmciLHRoaXNfb2JqZWN0KCkpO3B1Ymxpc2gpOworCisgIC8vIFNwZWljaGVybiBkZXMgU3BpZWxlcnMKKyAgc2F2ZV9vYmplY3QoIi8iK1NBVkVQQVRIK2dldHVpZCgpWzAuLjBdKyIvIiArIGdldHVpZCgpKTsKK30KKworc3RhdGljIHZhcmFyZ3Mgdm9pZCBsb2dfYXV0b2xvYWQoIHN0cmluZyBmaWxlLCBzdHJpbmcgcmVhc29uLCBtaXhlZCBkYXRhLCBzdHJpbmcgZXJyb3IgKQoreworICBpZiAobWVtYmVyKGF1dG9sb2FkX2Vycm9yLGZpbGUpIT0tMSkgcmV0dXJuOworICBsb2dfZmlsZShTSEVMTExPRygiTk9fQVVUT19GSUxFIiksc3ByaW50ZigiJXM6ICVzOiAlc1xucmVhc29uOiBjYW5ub3QgJXMgZmlsZVxuZGF0YTogJU9cbiVzXG4iLAorICAgICAgICAgICBjdGltZSgpWzQuLjE1XSxjYXBpdGFsaXplKGdldHVpZCgpKSxmaWxlLHJlYXNvbixkYXRhLAorICAgICAgICAgICAoZXJyb3I/IkZlaGxlcm1lbGR1bmc6ICIrZXJyb3IrIlxuIjoiIikpKTsKKyAgYXV0b2xvYWRfZXJyb3IrPSh7ZmlsZX0pOworfQorCisvLyB0aWNzLCBkaWUgZnVlciBhdXRvbG9hZGVyIHJlaWNoZW4gc29sbHRlbjoKKyNkZWZpbmUgU0FGRV9GT1JfQVVUT0xPQURFUiBfX01BWF9FVkFMX0NPU1RfXy80CisKK3ByaXZhdGUgdm9pZCBsb2FkX2F1dG9fb2JqZWN0KCBzdHJpbmcgZmlsZSwgbWl4ZWQgZGF0YSApCit7CisgICAgb2JqZWN0IG9iOworICAgIHN0cmluZyBlcnJvcjsKKyAgIAorICAgIGlmKCBnZXRfZXZhbF9jb3N0KCkgPCBTQUZFX0ZPUl9BVVRPTE9BREVSICkgcmV0dXJuOworICAgIG1fZGVsZXRlKCBhdXRvbG9hZF9yZXN0LCBmaWxlICk7CisgICAgYXV0b2xvYWRfZXJyb3ItPSh7ZmlsZX0pOworCisgICAgaWYgKCBmaWxlID09ICIvb2JqL21vbmV5IiApCisgICAgICBmaWxlID0gIi9pdGVtcy9tb25leSI7CisgICAgaWYgKCBmaWxlID09ICIvb2JqL3NlZXJjYXJkIiApCisgICAgICBmaWxlID0gIi9pdGVtcy9zZWVyY2FyZCI7CisgICAgCisgICAgb2IgPSBmaW5kX29iamVjdChmaWxlKTsKKyAgICAKKyAgICBpZiAoIW9iKQorICAgIHsKKyAgICAgICAgaWYgKGZpbGVfc2l6ZShmaWxlKyIuYyIpPDAmJgorICAgICAgICAgICBmaWxlX3NpemUoaW1wbG9kZShleHBsb2RlKGZpbGUsIi8iKVswLi48Ml0sIi8iKSsKKyAgICAgICAgICAgICAgICAgICAgICIvdmlydHVhbF9jb21waWxlci5jIik8MCkKKyAgICAgICAgeworICAgICAgICAgICBsb2dfYXV0b2xvYWQoZmlsZSwiZmluZCIsZGF0YSwwKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChlcnJvciA9IGNhdGNoKGxvYWRfb2JqZWN0KGZpbGUpOyBwdWJsaXNoKSkKKyAgICAgICAgeworICAgICAgICAgICBsb2dfYXV0b2xvYWQoZmlsZSwibG9hZCIsZGF0YSxlcnJvcik7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGVycm9yID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoZmlsZSk7IHB1Ymxpc2gpICkKKyAgICB7CisgICAgICAgIGxvZ19hdXRvbG9hZChmaWxlLCJjbG9uZSIsZGF0YSwgZXJyb3IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBlcnJvciA9IGNhdGNoKG9iLT5TZXRQcm9wKCBQX0FVVE9MT0FET0JKLCBkYXRhICk7IHB1Ymxpc2gpICkKKyAgICB7CisgICAgICAgIGxvZ19hdXRvbG9hZChmaWxlLCJTZXRQcm9wIixkYXRhLCBlcnJvcik7CisgICAgICAgIG9iLT5yZW1vdmUoMSk7CisgICAgICAgIGlmIChvYikgZGVzdHJ1Y3Qob2IpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBlcnJvciA9IGNhdGNoKG9iLT5tb3ZlKCBNRSwgTV9OT0NIRUNLICk7cHVibGlzaCkgKSB7CisgICAgICAgIGxvZ19hdXRvbG9hZChmaWxlLCJtb3ZlIixkYXRhLCBlcnJvcik7CisgICAgICAgIG9iLT5yZW1vdmUoMSk7CisgICAgICAgIGlmKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYXV0b19vYmplY3RzKCBtYXBwaW5nIG1hcF9sZGZpZWQgKQoreworICAgIGlmICggKCFtYXBwaW5ncChtYXBfbGRmaWVkKSB8fCAhc2l6ZW9mKG1hcF9sZGZpZWQpKSAmJiAhc2l6ZW9mKGF1dG9sb2FkX3Jlc3QpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWl0IE5ldHp0b3RlbiBTcGllbGVybiByZWNobmVuIG1hbmNoZSBBdXRvbG9hZGVyIG5pY2h0LiBBbHNvCisgICAgLy8gZGFzIENsb25lbiB1bnRlcmJyZWNoZW4gdW5kIGluIFJlY29ubmVjdCgpIHdpZWRlciBhbndlcmZlbi4KKyAgICBpZiAoICFpbnRlcmFjdGl2ZSgpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gS2xlaW5lciBIYWNrOiBhdXRvbG9hZF9yZXN0IGlzdCBlaW5lIGdsb2JhbGUgVmFyaWFibGUsIGRpZSBiZWltCisgICAgLy8gQ2xvbmVuIGRlciBlaW56ZWxuZW4gQXV0b2xvYWRlciBkaXJla3QgdmVyYWVuZGVydCB3aXJkLgorICAgIC8vIFNvIGxhbmdlIGRhcyBNYXBwaW5nIG5vY2ggRWludHJhZWdlIGhhdCwgbXVlc3NlbiB3aXIgbm9jaCBmZWhsZW5kZQorICAgIC8vIEF1dG9sb2FkZXIgY2xvbmVuLgorICAgIGlmICggIXNpemVvZihhdXRvbG9hZF9yZXN0KSApCisgICAgICAgIGF1dG9sb2FkX3Jlc3QgPSBtYXBfbGRmaWVkOworCisgICAgLy8gU2Nob24gaGllciBlaW5lbiBjYWxsX291dCgpIHp1bSAiTmFjaCJjbG9uZW4gdm9uIG5vY2ggbmljaHQgZ2VjbG9udGVuCisgICAgLy8gQXV0b2xvYWRlcm4gc3RhcnRlbiwgZGEgc3BhZXRlciB1LlUuIGtlaW5lIFJlY2hlbnplaXQgbWVociBkYWZ1ZXIgZGEgaXN0LgorICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCJsb2FkX2F1dG9fb2JqZWN0cyIpICE9IC0xICkKKyAgICAgICAgLyogZG8gbm90aGluZyAqLzsKKyAgICAKKyAgICAvLyBNaXQgUGFyYW1ldGVyICcwJyBhdWZydWZlbiwgZGEgZGFzIGdsb2JhbGUgTWFwcGluZyBiZW51dHp0IHdpcmQuCisgICAgLy8gVmVyem9lZ2VydW5nIDAgaW4gcmVrdXJzaXZlbiBDYWxsb3V0cyBpc3QgYmxvZWQsIGFsc28gMXMgRGVsYXkKKyAgICBjYWxsX291dCggImxvYWRfYXV0b19vYmplY3RzIiwgMiwgMCApOworICAgIAorICAgIC8vIE1pdCBjYXRjaCgpIGdlZ2VuIGRpZSBFdmFsY29zdC1GYWxsZSEKKyAgICAvLyBNaXQgQWJzaWNodCBkYXMgd2Fsa19tYXBwaW5nKCkgYXVzIGRlciAiYWx0ZW4iIFZlcnNpb24gZXJoYWx0ZW4gdW5kCisgICAgLy8gbmljaHQgZHVyY2ggZWluZSAoZWluZmFjaGVyZSkgU2NobGVpZmUgaW5rbC4gZ2V0X2V2YWxfY29zdCgpIGVyc2V0enQsCisgICAgLy8gZGEgZWluZSBTY2hsZWlmZSBnZWdlbnVlYmVyIGRlciB3YWxrX21hcHBpbmcoKS1Mb2VzdW5nIGRlbiBBdWZiYXUKKyAgICAvLyBkZXIgcHJldmlvdXNfb2JqZWN0KCktS2V0dGUgdmVyYWVuZGVybiB3dWVyZGU7IGRhcmF1ZiB0ZXN0ZW4gYWJlcgorICAgIC8vIG1hbmNoZSBPYmpla3RlLgorICAgIGNhdGNoKCB3YWxrX21hcHBpbmcoIGF1dG9sb2FkX3Jlc3QsICMnbG9hZF9hdXRvX29iamVjdC8qJyovICkgKTsKK30KKworLyoKKyAqIGFsX3RvX3RpdGxlOiBNYWtlIHRoZSBudW1lcmljIGFsaWdubWVudCB2YWx1ZSBpbnRvIGEgc3RyaW5nCisgKi8KK3N0YXRpYyBzdHJpbmcgYWxfdG9fdGl0bGUoaW50IGEpCit7CisgIGlmIChhID49IEtJTExfTkVVVFJBTF9BTElHTk1FTlQgKiAxMDApCisgICAgcmV0dXJuICJoZWlsaWciOworICBpZiAoYSA+IEtJTExfTkVVVFJBTF9BTElHTk1FTlQgKiAyMCkKKyAgICByZXR1cm4gImd1dCI7CisgIGlmIChhID4gS0lMTF9ORVVUUkFMX0FMSUdOTUVOVCAqIDQpCisgICAgcmV0dXJuICJuZXR0IjsKKyAgaWYgKGEgPiAtIEtJTExfTkVVVFJBTF9BTElHTk1FTlQgKiA0KQorICAgIHJldHVybiAibmV1dHJhbCI7CisgIGlmIChhID4gLSBLSUxMX05FVVRSQUxfQUxJR05NRU5UICogMjApCisgICAgcmV0dXJuICJmcmVjaCI7CisgIGlmIChhID4gLSBLSUxMX05FVVRSQUxfQUxJR05NRU5UICogMTAwKQorICAgIHJldHVybiAiYm9lc2UiOworICByZXR1cm4gInNhdGFuaXNjaCI7Cit9CisKK3N0YXRpYyBpbnQgdG9nZ2xlX3doaW1weV9kaXIoc3RyaW5nIHN0cikgeworICBTZXRQcm9wKFBfV0lNUFlfRElSRUNUSU9OLHN0cj1fdW5wYXJzZWRfYXJncygpfHxzdHIpOworICBpZiAoc3RyKQorICAgIHByaW50ZigiT2ssIEZsdWNodHJpY2h0dW5nICVPLlxuIixzdHIpOworICBlbHNlCisgICAgcHJpbnRmKCJPaywgYmV2b3J6dWd0ZSBGbHVjaHRyaWNodHVuZyBkZWFrdGl2aWVydC5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0b2dnbGVfd2hpbXB5KHN0cmluZyBzdHIpCit7CisgIGludCBpOworCisgIGlmKCFzdHIgfHwgc3RyPT0iIiB8fCAoc3NjYW5mKHN0ciwiJWQiLGkpPDApKQorICB7CisgICAgd3JpdGUoInZvcnNpY2h0IDxocD4sIDA8PWhwPCIrUXVlcnlQcm9wKFBfTUFYX0hQKSsiXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihpPj1RdWVyeVByb3AoUF9NQVhfSFApIHx8IGk8MCkKKyAgeworICAgIHdyaXRlKCJEZXIgV2VydCBpc3QgbmljaHQgZXJsYXVidC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCFpKSB3cml0ZSgiUHJpbnogRWlzZW5oZXJ6LU1vZHVzLlxuIik7CisgIGVsc2Ugd3JpdGUoIlZvcnNpY2h0LU1vZHVzICgiK2krIilcbiIpOworICBTZXRQcm9wKFBfV0lNUFksaSk7CisgIHJldHVybiAxOworfQorCisvKiogQmVzdGltbXQsIG9iIGRhcyBTcGllbGVyb2JqZWt0IGJlc2NoYXR0ZXQgd2VyZGVuIGRhcmYuCisgICogQmVzY2hhdHRlbiBpc3QgbnVyIGZ1ZXIgT2JqZWt0ZSBlcmxhdWJ0LCBkaWUgaW4gL3N0ZC9wbGF5ZXIvc2hhZG93cworICAqIGFiZ2VsZWd0IHNpbmQuCisgICogQXVzbmFobWU6IFRlc3RzcGllbGVyIG1pdCBnZXNldHp0ZW0gUF9BTExPV0VEX1NIQURPVworICAqIEBwYXJhbVtpbl0gb2JqIE9iamVrdCwgd2FzIGJlc2NoYXR0ZW4gbW9lY2h0ZS4KKyAgKiBAcmV0dXJuIDAsIHdlbm4gQmVzY2hhdHRlbiBlcmxhdWJ0LCAxIHNvbnN0LgorICAqLwordmFyYXJncyBub21hc2sgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KG9iamVjdCBvYmopCit7CisgIHN0cmluZyB3aGF0LCBhbGxvd2VkX3NoYWRvdzsKKyAgaW50ICAgIGR1bW15OworCisvLyAgaWYgKCBRdWVyeShQX1RFU1RQTEFZRVIpICkKKy8vICAgICAgcmV0dXJuIDA7CisgIAorICBpZiAob2JqKXsKKyAgICB3aGF0PW9iamVjdF9uYW1lKG9iaik7CisgICAgaWYgKHdoYXQgJiYgd2hhdCAhPSAiIiAmJgorICAgICAgICBzc2NhbmYod2hhdCwiL3N0ZC9wbGF5ZXIvc2hhZG93cy8lcyMlZCIsd2hhdCxkdW1teSk9PTIpCisgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAvLyBFaW5lbSBUZXN0c3BpZWxlciBrYW5uIG1hbiBQX0FMTE9XRURfU0hBRE9XIGF1ZiBlaW5lbiB6dSB0ZXN0ZW5kZW4KKyAgICAvLyBTaGFkb3cgc2V0emVuLgorICAgIGlmICggUXVlcnkoUF9URVNUUExBWUVSKSAmJiAKKyAgICAgICAgIHN0cmluZ3Aod2hhdCkgJiYgCisgICAgICAgICBzdHJpbmdwKGFsbG93ZWRfc2hhZG93PVF1ZXJ5KFBfQUxMT1dFRF9TSEFET1cpKSAmJgorICAgICAgICAgc3Ryc3RyKHdoYXQsIGFsbG93ZWRfc2hhZG93KT09MCkKKyAgICAgICAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVocnplaXQoKQoreworICB3cml0ZShkdGltZSh0aW1lKCkrUXVlcnlQcm9wKFBfVElNRVpPTkUpKjM2MDApKyIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3Byb3RlY3RlZCBzdHJpbmcgU2V0RGVmYXVsdEhvbWUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIGRlZmF1bHRfaG9tZT1zdHI7Cit9CisKK3N0cmluZyBRdWVyeURlZmF1bHRIb21lKCkKK3sKKyAgcmV0dXJuIGRlZmF1bHRfaG9tZTsKK30KKworcHJvdGVjdGVkIHN0cmluZyBTZXREZWZhdWx0UHJheVJvb20oc3RyaW5nIHN0cikKK3sKKyAgaWYoaGNfcGxheT4xKQorICB7CisgICAgZGVmYXVsdF9wcmF5X3Jvb209Ii9yb29tL25pcnZhbmEiOworICB9CisgIGVsc2UKKyAgICBkZWZhdWx0X3ByYXlfcm9vbT1zdHI7CisgIAorICByZXR1cm4gZGVmYXVsdF9wcmF5X3Jvb207Cit9CisKK3N0cmluZyBRdWVyeVByYXlSb29tKCkKK3sKKyAgaWYoaGNfcGxheT4xKQorICB7CisgICAgcmV0dXJuICIvcm9vbS9uaXJ2YW5hIjsKKyAgfSAKKyAgc3RyaW5nIHJvb20gPSBRdWVyeVByb3AoUF9QUkFZX1JPT00pOworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByZXR1cm4gcm9vbTsKKyAgZWxzZSBpZiAoZGVmYXVsdF9wcmF5X3Jvb20pCisgICAgcmV0dXJuIGRlZmF1bHRfcHJheV9yb29tOworICAvLyBob2ZmZW50bGljaCBpc3QgZGFzIHdlbmlnc3RlbnMgZ2VzZXR6dC4gCisgIHJldHVybiBkZWZhdWx0X2hvbWU7Cit9CisKK3ZvaWQgX3Jlc3RhcnRfYmVhdCgpCit7CisgIHRlbGxfb2JqZWN0KE1FLAorICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6IERlaW4gSGVyenNjaGxhZyBoYXQgd2llZGVyIGVpbmdlc2V0enQuXG4iKTsKKyAgc2V0X2hlYXJ0X2JlYXQoMSk7Cit9CisKK3N0YXRpYyBpbnQgd2VnKHN0cmluZyBzdHIpCit7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkKKyAgeworICAgIHByaW50ZigiRHUgYmlzdCBuaWNodCVzIGFscyBhYndlc2VuZCBnZWtlbm56ZWljaG5ldC5cbiIsCisgICAgICAgICAgIFF1ZXJ5UHJvcChQX0FXQVkpID8gIiBtZWhyIiA6ICIiKTsKKyAgICBTZXRQcm9wKFBfQVdBWSwgMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgd3JpdGUoIkR1IGJpc3QgamV0enQgYWxzIGFid2VzZW5kIGdla2VubnplaWNobmV0LlxuIik7CisgIFNldFByb3AoUF9BV0FZLCBzdHIpOworICByZXR1cm4gMTsKK30KKworLyogRWluIEJlZmVobCB6dW0gYW5zY2hhdWVuIGRlciBXZWdtZWxkdW5nIGFuZGVyZXIgU3BpZWxlciAqLworc3RhdGljIGludCB3ZWdtZWxkdW5nKHN0cmluZyBwbGF5ZXIpCit7CisKKyAgb2JqZWN0IHBsYXllcl9vYjsKKyAgc3RyaW5nIHdlZzsKKworICBpZiAoICFwbGF5ZXIgfHwgcGxheWVyPT0iIiB8fCAKKyAgICAgICBwbGF5ZXI9PWxvd2Vyc3RyaW5nKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX05BTUUpKSkKKyAgeworICAgIHdlZz10aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9BV0FZKTsKKyAgICB3cml0ZSAoIkR1IGJpc3QgIisod2VnPyIiOiJuaWNodCAiKSsiYWxzIGFid2VzZW5kIGdla2VubnplaWNobmV0LlxuIik7CisgICAgaWYgKHdlZykKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyh3ZWcsIDc4LCJHcnVuZDogIixCU19JTkRFTlRfT05DRSkpOworICAgIHJldHVybiAxOyAgCisgIH0KKworICAvLyBXZWxjaGVyIFNwaWVsZXIgaXN0IGdlbWVpbnQ/CisgIHBsYXllcl9vYj1maW5kX3BsYXllcihwbGF5ZXIpOworCisgIC8vIFNwaWVsZXIgbmljaHQgZGEgb2RlciBJbnZpcyB1bmQgQW5mcmFnZXIgaXMga2VpbiBNYWdpZXIKKyAgaWYgKCFwbGF5ZXJfb2IgfHwgCisgICAgICAocGxheWVyX29iLT5RdWVyeVByb3AoUF9JTlZJUykgJiYgIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpKSAKKyAgeworICAgIHdyaXRlKGNhcGl0YWxpemUocGxheWVyKSsiIGlzdCBnZXJhZGUgbmljaHQgaW0gU3BpZWwuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHdlZz1wbGF5ZXJfb2ItPlF1ZXJ5UHJvcChQX0FXQVkpOworCisgICAgICAgIC8vIHBsYXllcl9vYi0+TmFtZSgpIGdpYnQgYmVpIGludmlzLU1hZ2llcm4gIkplbWFuZCIgenVydWVjaworICB3cml0ZSAocGxheWVyX29iLT5RdWVyeVByb3AoUF9OQU1FKSsiIGlzdCAiKworICAgICAgICAgKHdlZz8iIjoibmljaHQgIikrImFscyBhYndlc2VuZCBnZWtlbm56ZWljaG5ldC5cbiIpOworCisgIGlmICh3ZWcpCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHdlZywgNzgsIkdydW5kOiAiLEJTX0lOREVOVF9PTkNFKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgdGltZWRpZmYoaW50IHRpbWUpCit7CisgIHN0cmluZyByZXQ7CisKKyAgcmV0PSIiOworICBpZih0aW1lPj04NjQwMCkgeworICAgIHJldCs9dGltZS84NjQwMCsiZCAiOworICAgIHRpbWUlPTg2NDAwOworICB9CisgIGlmKHRpbWU8MzYwMDApIHJldCs9IjAiOworICByZXQrPXRpbWUvMzYwMCsiOiI7CisgIHRpbWUlPTM2MDA7CisgIGlmKHRpbWU8NjAwKSByZXQrPSIwIjsKKyAgcmV0Kz10aW1lLzYwKyI6IjsKKyAgdGltZSU9NjA7CisgIGlmKHRpbWU8MTApIHJldCs9IjAiOworICByZXQrPXRpbWUrIiI7CisgIHJldHVybiByZXQ7Cit9CisKKworLyogRWluIEJlZmVobCB6dW0gYW5zY2hhdWVuIGRlciBJZGxlemVpdCBhbmRlcmVyIFNwaWVsZXIgKi8KK3N0YXRpYyBpbnQgaWRsZXplaXQoc3RyaW5nIHBsYXllcikKK3sKKworICBvYmplY3QgcGxheWVyX29iOworICBpbnQgaWRsZTsKKworICBpZiAoICFwbGF5ZXIgfHwgcGxheWVyPT0iIiB8fCAKKyAgICAgICBwbGF5ZXI9PWxvd2Vyc3RyaW5nKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX05BTUUpKSkKKyAgeworICAgIHdyaXRlICgiRHUgYmlzdCBzZWxiZXIgbmF0dWVybGljaCBnZXJhZGUgbmljaHQgaWRsZS5cbiIpOworICAgIHJldHVybiAxOyAgCisgIH0KKworICAvLyBXZWxjaGVyIFNwaWVsZXIgaXN0IGdlbWVpbnQ/CisgIHBsYXllcl9vYj1maW5kX3BsYXllcihwbGF5ZXIpOworCisgIC8vIFNwaWVsZXIgbmljaHQgZGEgb2RlciBJbnZpcyB1bmQgQW5mcmFnZXIgaXMga2VpbiBNYWdpZXIKKyAgaWYgKCFwbGF5ZXJfb2IgfHwgCisgICAgICAocGxheWVyX29iLT5RdWVyeVByb3AoUF9JTlZJUykgJiYgIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpKSAKKyAgeworICAgIHdyaXRlKGNhcGl0YWxpemUocGxheWVyKSsiIGlzdCBnZXJhZGUgbmljaHQgaW0gU3BpZWwuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlkbGU9cXVlcnlfaWRsZShwbGF5ZXJfb2IpOworCisgICAgICAgIC8vIHBsYXllcl9vYi0+TmFtZSgpIGdpYnQgYmVpIGludmlzLU1hZ2llcm4gIkplbWFuZCIgenVydWVjaworICB3cml0ZSAocGxheWVyX29iLT5RdWVyeVByb3AoUF9OQU1FKSsiIGlzdCAiKworICAgICAgICAgKGlkbGU+PTYwP3RpbWVkaWZmKGlkbGUpOiJuaWNodCIpKyIgcGFzc2l2LlxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKKworLyoqIEJlbGVidCBlaW5lbiBuZXR6dG90ZW4gU3BpZWxlciB3aWVkZXIuCisgICogUmVha3RpdmllcnQgSGVhcnRiZWF0cywgYmV3ZWd0IGRlbiBTcGllbGVyIHp1cnVlY2sgYW4gZGVuIE9ydCwgZGVyIGVpbQorICAqIEVpbnNjaGxhZmVuIHp1bSBBdWZ3YWNoZW4gZXJtaXR0ZWx0IHd1cmRlIChpbSBlaW5mYWNoc3RlbiBGYWxsIGRlciBSYXVtLAorICAqIHdvIG1hbiBlaW5nZXNjaGxhZmVuIGlzdCkuCisgICovCitzdGF0aWMgdm9pZCBuZGVhZF9yZXZpdmUoKQoreworICAgIHN0cmluZyBmbmFtZTsKKyAgICBpbnQgcmV0OworCisgICAgc2V0X2hlYXJ0X2JlYXQoMSk7CisgICAgbmRlYWRfbmV4dF9jaGVjayA9IE5FVERFQURfQ0hFQ0tfVElNRTsKKyAgICBuZGVhZF9jdXJyZW50bHkgPSAwOworICAgIG5kZWFkX2xhc3R0aW1lID0gMDsKKworICAgIGlmICggIW9iamVjdHAobmRlYWRfbG9jYXRpb24pICYmIAorICAgICAgICAgc3RyaW5ncChuZGVhZF9sX2ZpbGVuYW1lKSAmJiBzaXplb2YobmRlYWRfbF9maWxlbmFtZSkpIHsKKyAgICAgICAgCisgICAgICAgIGlmICggbWVtYmVyKCBuZGVhZF9sX2ZpbGVuYW1lLCAnIycgKSA9PSAtMSApeworICAgICAgICAgICAgY2F0Y2gobG9hZF9vYmplY3QoIG5kZWFkX2xfZmlsZW5hbWUpOyBwdWJsaXNoKTsKKyAgICAgICAgICAgIG5kZWFkX2xvY2F0aW9uID0gZmluZF9vYmplY3QobmRlYWRfbF9maWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZGVhZF9sb2NhdGlvbiA9IGZpbmRfb2JqZWN0KG5kZWFkX2xfZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKCAhbmRlYWRfbG9jYXRpb24gJiYgZW52X25kZWFkX2luZm8gKXsKKyAgICAgICAgICAgICAgICBmbmFtZSA9IGV4cGxvZGUoIG5kZWFkX2xfZmlsZW5hbWUsICIjIiApWzBdOworICAgICAgICAgICAgICAgIGNhdGNoKG5kZWFkX2xvY2F0aW9uID0gCisgICAgICAgICAgICAgICAgICAgIChsb2FkX29iamVjdChmbmFtZSktPlNldFByb3AoUF9ORVRERUFEX0lORk8sIGVudl9uZGVhZF9pbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2gpOworICAgICAgICAgICAgICAgIGlmICggIW9iamVjdHAobmRlYWRfbG9jYXRpb24pICl7CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKGxvYWRfb2JqZWN0KCBuZGVhZF9sb2NhdGlvbik7cHVibGlzaCk7CisgICAgICAgICAgICAgICAgICAgIG5kZWFkX2xvY2F0aW9uID0gZmluZF9vYmplY3QobmRlYWRfbG9jYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggIW9iamVjdHAobmRlYWRfbG9jYXRpb24pCisgICAgICAgIHx8IGNhdGNoKHJldCA9IG1vdmUoIG5kZWFkX2xvY2F0aW9uLCBNX0dPfE1fU0lMRU5UICk7cHVibGlzaCkgCisgICAgICAgIHx8IHJldCAhPSAxICkgeworICAgICAgICBtb3ZlKCAiZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPfE1fU0lMRU5UICk7CisgICAgICAgIG5kZWFkX2xvY2F0aW9uID0gZW52aXJvbm1lbnQoKTsKKyAgICB9CisKKyAgICAvLyAgbmRlYWRfbG9jYXRpb249MDsKKyAgICBuZGVhZF9sX2ZpbGVuYW1lID0gMDsKKyAgICBlbnZfbmRlYWRfaW5mbyA9IDA7Cit9CisKKy8qKiBCZXdlZ3QgZWluZW4gbmV0enRvdGVuIFNwaWVsZXIgaW4gZGVuIE5ldHp0b3RlbnJhdW0KKyAgKiBHZXJ1ZmVuIHZvbiBoZWFydGJlYXQoKS4KKyAgKiBaZXJzdG9lcnQgR2Flc3RlLCB2ZXJsYWVzc3QgZ2dmLiBkYXMgVGVhbSwgZXJtaXR0ZWx0LCBvYiBkZXIgU3BpZWxlciBiZWltCisgICogQXVmd2FjaGVuIGluIGRhcyBhbHRlIEVudmlyb25tZW50IGJld2VndCB3ZXJkZW4gc29sbCBvZGVyIGluIGVpbmVuIGFuZGVyZW4KKyAgKiBSYXVtLCBoaWVyenUgd2lyZCBpbSBFbnZpcm9ubWVudCBQX05FVERFQURfSU5GTyBhYmdlZnJhZ3QuCisgICogRGVha3RpdmllcnQgZGllIEtvbW1hbmRvcyBwZXIgZGlzYWJsZV9jb21tYW5kcygpLgorICAqLworc3RhdGljIHZvaWQgbmRlYWRfbW92ZV9tZSgpIHsKKyAgb2JqZWN0IHRlYW07CisgIG1peGVkIGFtZW07CisKKyAgc2V0X2hlYXJ0X2JlYXQoMCk7CisgIHN0b3BfaGVhcnRfYmVhdHMoKTsKKyAgaWYgKFF1ZXJ5R3Vlc3QoKSkgeworICAgIHF1aXQoKTsKKyAgICBpZiAoTUUpCisgICAgICByZW1vdmUoKTsKKyAgICBpZiAoTUUpCisgICAgICBkZXN0cnVjdChNRSk7CisgICAgcmV0dXJuOworICB9CisgIG5kZWFkX25leHRfY2hlY2s9TkVUREVBRF9DSEVDS19USU1FOworICBuZGVhZF9jdXJyZW50bHk9MTsKKyAgbmRlYWRfbGFzdHRpbWU9MDsKKyAgbmRlYWRfbG9jYXRpb249ZW52aXJvbm1lbnQoKTsKKyAgaWYgKG9iamVjdHAobmRlYWRfbG9jYXRpb24pKQorICAgIG5kZWFkX2xfZmlsZW5hbWU9b2JqZWN0X25hbWUobmRlYWRfbG9jYXRpb24pOworICAKKyAgaWYgKG9iamVjdHAoZW52aXJvbm1lbnQoKSkKKyAgICAgICYmIHNpemVvZihleHBsb2RlKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpLCIjIikpID4gMSkKKyAgICBlbnZfbmRlYWRfaW5mbz1lbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9ORVRERUFEX0lORk8pOworICBlbHNlCisgICAgZW52X25kZWFkX2luZm89MDsKKyAgCisgIGlmICggb2JqZWN0cCh0ZWFtPVF1ZXJ5KFBfVEVBTSkpICkKKyAgICAgIC8vIERlciBUZXN0IGF1ZiBhc3NvemlpZXJ0ZSBUZWFtbWl0Z2xpZWRlciAoPT0gRm9sZ2VOUENzKQorICAgICAgLy8gdmVyaGluZGVydCwgZGFzcyBTcGllbGVyIG5hY2ggInNjaGxhZmUgZWluIiBhdXMgZGVtCisgICAgICAvLyBUZWFtIGF1c2dldHJhZ2VuIHdlcmRlbi4gLS0gMjkuMDEuMjAwMiBUaWFtYWsKKyAgICAgIC8vICAgICAgJiYgIW9iamVjdHAoYW1lbT1RdWVyeShQX1RFQU1fQVNTT0NfTUVNQkVSUykpCisgICAgICAvLyAgICAgICYmICEocG9pbnRlcnAoYW1lbSkgJiYgc2l6ZW9mKGFtZW0pKSkKKyAgICB0ZWFtLT5SZW1vdmVNZW1iZXIoTUUpOworICAKKyAgZGlzYWJsZV9jb21tYW5kcygpOworICBtb3ZlKE5FVERFQURfUk9PTSxNX0dPfE1fTk9fQVRUQUNLfE1fTk9DSEVDSywiaW5zIFJlaWNoIGRlciBOZXR6dG90ZW4iKTsKK30KKworLyoqIElzdCBkaWVzZXIgQ2hhcmFjdGVyIGVpbiBHYXN0PworICAqIEByZXR1cm4gMSwgd2VubiBHYXN0LCAwIHNvbnN0LgorICAqLworaW50IFF1ZXJ5R3Vlc3QoKQoreworICBzdHJpbmcgZHVtbXk7CisgIHJldHVybiBzc2NhbmYoZ2V0dWlkKCksImdhc3QlZCIsZHVtbXkpOworfQorCisvKiogU3BpZWxlcmtvbW1hbmRvICdzY2hsYWZlIGVpbicuCisgICogUnVmdCByZW1vdmVfaW50ZXJhY3RpdmUoKSBiZWkgU3BpZWxlcm4sIGJlaSBNYWdpZXJuIHdpcmQgcXVpdCgpIGdlcnVmZW4sCisgICogdW0gZGFzIE1hZ2llcm9iamVrdCB6dSB6ZXJzdG9lcmVuLgorICAqIEBzYSBxdWl0KCkKKyAgKi8KK2ludCBkaXNjb25uZWN0KHN0cmluZyBzdHIpCit7IAorICBzdHJpbmcgdmVyYjsKKyAgc3RyaW5nIGRlc2MgPSBicmVha19zdHJpbmcoCisgICAgICAiXCJzY2hsYWZlIGVpblwiIGJlZW5kZXQgRGVpbmUgVmVyYmluZHVuZyBtaXQgIk1VRE5BTUUiLiBEdSBiZWhhZWx0c3QgIgorICAgICAiRGVpbmUgU2FjaGVuLlxuRmFsbHMgIk1VRE5BTUUiIGplZG9jaCBhYnN0dWVyenQgb2RlciBuZXUgZ2VzdGFydGV0ICIKKyAgICAgIndpcmQsIHdhZWhyZW5kIER1IHdlZyBiaXN0LCB2ZXJsaWVyc3QgRHUgZGllIG1laXN0ZW4gYWxsZXJkaW5ncyAiCisgICAgICIoZ2VuYXVzbywgYWxzIHdlbm4gRHUgRGVpbmUgVmVyYmluZHVuZyBtaXQgXCJlbmRlXCIgYmVlbmRldCBoYWV0dGVzdCkuICIKKyAgICAgIkluIGRpZXNlbSBGYWxsIGJla29tbXN0IER1IGRhbm4gZWluZSBrbGVpbmUgRW50c2NoYWVkaWd1bmcuIgorICAgICAsNzgsMCxCU19MRUFWRV9NWV9MRlMpOworCisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAoIXZlcmIpCisgICAgdmVyYj0iQVVUT0NBTEwiOworICBpZiAodmVyYlswLi41XT09InNjaGxhZiIgJiYgc3RyIT0iZWluIikKKyAgeworICAgIG5vdGlmeV9mYWlsKGRlc2MpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBxdWl0KCk7CisgIAorICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBkZXNjKTsKKworICBpZiAoY2xvbmVwKGVudmlyb25tZW50KCkpICYmICFlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9ORVRERUFEX0lORk8pKQorICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksYnJlYWtfc3RyaW5nKAorICAgICAgICAiXG5BQ0hUVU5HOiBXZW5uIER1IGhpZXIgbGFlbmdlcmUgWmVpdCBzY2hsYWVmc3QsICIKKyAgICAgICAgImtvbW1zdCBEdSB2ZXJtdXRsaWNoIG5pY2h0IGFuIGRpZXNlbiBPcnQgenVydWVjayEiLDc4KSk7CisKKyAgc2F5KGNhcGl0YWxpemUobmFtZShXRVIpKSsiIGhhdCBnZXJhZGUgZGllIFZlcmJpbmR1bmcgenUgIk1VRE5BTUUiIGdla2FwcHQuXG4iKTsKKyAgcmVtb3ZlX2ludGVyYWN0aXZlKE1FKTsKKyAgY2FsbF9vdXQoIydjbGVhcl90ZWxsX2hpc3RvcnksNCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZpbmdlciAoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHJldDsKKyAgbWl4ZWQgeG5hbWU7CisKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIgorICAgICAgfHwgc2l6ZW9mKGV4cGxvZGUoc3RyLCIgIiktKHsiLW4iLCItcCIsIi1zIiwiLXYiLCItYSJ9KSk+MSkKKyAgeworICAgIHdyaXRlKCJmaW5nZXIgPHNwaWVsZXJuYW1lPiBvZGVyIGZpbmdlciA8c3BpZWxlcm5hbWVAbXVkbmFtZT5cbiIrCisgICAgICAiQml0dGUgbnVyIGRlbiByZWluZW4gU3BpZWxlcm5hbWVuIHZlcndlbmRlbiwga2VpbmUgTmFtZW5zdm9yc2FldHplIG9kZXIgVGl0ZWxcbiIpOworICAgIHJldHVybiAxOworICB9CisgIHhuYW1lPWV4cGxvZGUoc3RyLCJAIik7CisgIGlmKHNpemVvZih4bmFtZSk9PTIpCisgIHsKKyAgICBpZiAoeG5hbWVbMF09PSItbiAiIHx8IHhuYW1lWzBdPT0iLXAgIiB8fCB4bmFtZVswXT09Ii1zICIpICB7CisgICAgICB3cml0ZSgiZmluZ2VyIDxzcGllbGVybmFtZT5APG11ZG5hbWU+IC0gZGVyIFNwaWVsZXJuYW1lIGZlaGx0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHJldD1JTkVURC0+X3NlbmRfdWRwKHhuYW1lWzFdLChbCisgICAgICAgICAgICAgICAgICAgUkVRVUVTVDogImZpbmdlciIsCisgICAgICAgICAgICAgICAgICAgU0VOREVSOiBnZXR1aWQoTUUpLAorICAgICAgICAgICAgICAgICAgIERBVEE6IChleHBsb2RlKHhuYW1lWzBdLCIgIiktKHsiLW4iLCItcCIsIi1zIn0pKVswXQorICAgICAgICAgICAgICAgICAgIF0pLCAxKSkKKyAgICAgICAgICAgIHdyaXRlKHJldCk7CisgICAgICAgIGVsc2UKKyAgICAgIHdyaXRlKCJBbmZyYWdlIGFiZ2VzY2hpY2t0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgIi9wL2RhZW1vbi9maW5nZXIiLT5maW5nZXJfc2luZ2xlKHN0ciwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBsYWxpZ24oc3RyaW5nIHN0ciwgaW50IHdpZCkKK3sKKyAgcmV0dXJuIChzdHIrIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIilbMC4ud2lkLTFdOworfQorCisjZGVmaW5lIE1VRFNfQkFSICJcCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCitwcml2YXRlIHZvaWQgZm9ybWF0KG1peGVkIG11ZCwgbWl4ZWQgaG9zdHMsIHN0cmluZyBvdXRwdXQpCit7CisgIG91dHB1dCArPSBsYWxpZ24oaG9zdHNbbXVkXVtIT1NUX05BTUVdLCAyMCkgKyAiICAiICsKKyAgICAgICAgKGhvc3RzW211ZF1bSE9TVF9TVEFUVVNdID8KKyAgICAgICAgICAgaG9zdHNbbXVkXVtIT1NUX1NUQVRVU10gPiAwID8KKyAgICAgICAgICAgICAiVVAgICAgICAgIiArIGN0aW1lKGhvc3RzW211ZF1bSE9TVF9TVEFUVVNdKVs0Li4xNV0gOgorICAgICAgICAgICAgICJET1dOICAgICAiICsgY3RpbWUoLWhvc3RzW211ZF1bSE9TVF9TVEFUVVNdKVs0Li4xNV0KKyAgICAgICAgIDogIlVOS05PV04gIE5ldmVyIGFjY2Vzc2VkLiIpICsgIlxuIjsKK30KKworc3RhdGljIGludCBtdWRzKCkgeworICBtYXBwaW5nIGhvc3RzOworICBpbnQgaTsKKyAgbWl4ZWQgbXVkcywgb3V0cHV0OworCisgIG91dHB1dCA9IGxhbGlnbigiTXVkbmFtZSIsIDIwKSArICIgIFN0YXR1cyAgIExhc3QgYWNjZXNzIjsKKyAgb3V0cHV0ICs9ICJcbiIgKyBNVURTX0JBUlswLi5zaXplb2Yob3V0cHV0KV0gKyAiXG4iOworICBtdWRzID0gc29ydF9hcnJheShtX2luZGljZXMoaG9zdHMgPSBJTkVURC0+cXVlcnkoImhvc3RzIikpLCMnPik7CisgIG1hcChtdWRzLCAjJ2Zvcm1hdCwgaG9zdHMsICZvdXRwdXQpOworICBNb3JlKG91dHB1dCk7CisgIHJldHVybiAxOworfQorCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBpbnQgX3NldF9sZXZlbChpbnQgaSkKK3sKKyAgaWYgKCFpbnRwKGkpKSByZXR1cm4gLTE7CisgIGlmIChpPDEpIHJldHVybiAtMTsKKyAgU2V0KFBfTEVWRUwsIGkpOworICBHTUNQX0NoYXIoIChbUF9MRVZFTDogaV0pICk7CisgIHJldHVybiBpOworfQorCitzdGF0aWMgaW50IF9zZXRfaW52aXMoaW50IGEpCit7CisgIHJldHVybiBTZXQoUF9JTlZJUywgaW50cChhKSA/IGEgOiAhUXVlcnkoUF9JTlZJUykpOworfQorCisvKiBzZXRzIHRoZSB0ZXJtaW5hbCB0eXBlICovCisvKiBub3RlOiBzdXBwb3J0IHZ0MTAwIChiL3cpLCBhbnNpIChjb2xvciksIGR1bWIgKG5vbmUpICovCitzdGF0aWMgc3RyaW5nIF9zZXRfdHR5KHN0cmluZyBzdHIpIHsKKyAgaWYoc3RyICE9ICJkdW1iIiAmJiBzdHIgIT0gInZ0MTAwIiAmJiBzdHIgIT0gImFuc2kiKQorICAgIHJldHVybiBRdWVyeShQX1RUWSk7CisgIHJldHVybiBTZXQoUF9UVFksIHN0cik7Cit9CisKK3N0YXRpYyBpbnQgc3R0eShzdHJpbmcgc3RyKQoreworICBpZihzdHIhPSJkdW1iIiYmc3RyIT0idnQxMDAiJiZzdHIhPSJhbnNpIiYmc3RyIT0icmVzZXQiKQorICB7CisgICAgd3JpdGUoIktvbW1hbmRvOiBzdHR5IGR1bWJ8dnQxMDB8YW5zaSBvZGVyIHJlc2V0XG4iKTsKKyAgfQorICBpZihzdHIgPT0gInJlc2V0IikgeworICAgICAgcHJpbnRmKCIbWzMwOzQ3bRtbMG1EaWVzZXIgVGV4dCBzb2xsdGUgbGVzYmFyIHNlaW4hXG4iKTsKKyAgICAgIHJldHVybiAxOworICB9CisKKyAgd3JpdGUoIlRUWSBzdGVodCBqZXR6dCBhdWYgIitTZXRQcm9wKFBfVFRZLHN0cikrIi5cbiIpOworICBpZihzdHIgPT0gImFuc2kiIHx8IHN0ciA9PSAidnQxMDAiKSB7CisgICAgICBwcmludGYoIlRlcm1pbmFsIFRlc3Q6XG4iKTsKKyAgICAgIHByaW50ZigiVlQxMDA6IBtbMW1mZXR0G1swbSAbWzRtdW50ZXJzdHJpY2hlbhtbMG0gIisKKyAgICAgICAgICAgICAiG1s1bWJsaW5rZW5kG1swbSAbWzdtaW52ZXJzG1swbVxuIik7CisgICAgICBpZihzdHIgPT0gImFuc2kiKSB7CisgICAgICAgICAgcHJpbnRmKCJBTlNJIEZhcmJlbiB1bmQgVlQxMDAgQXR0cmlidXRlOlxuIik7CisgICAgICAgICAgZm9yZWFjaChpbnQgZmc6IDMwIC4uIDM3KSB7CisgICAgICAgICAgICAgIGZvcmVhY2goaW50IGJnOiA0MCAuLiA0NykgeworICAgICAgICAgICAgICAgICAgcHJpbnRmKCIbWyVkOyVkbRtbMW1AG1swbSIsIGZnLCBiZyk7CisgICAgICAgICAgICAgICAgICBwcmludGYoIhtbJWQ7JWRtG1s0bUAbWzBtIiwgZmcsIGJnKTsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiG1slZDslZG0bWzVtQBtbMG0iLCBmZywgYmcpOworICAgICAgICAgICAgICAgICAgcHJpbnRmKCIbWyVkOyVkbRtbN21AG1swbSIsIGZnLCBiZyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIlNvbGx0ZSBkaWVzZXIgVGV4dCBoaWVyIG5pY2h0IHJpY2h0aWcgbGVzYmFyXG5zZWluLCIrCisgICAgICAgICAgICAgICAgICJiZW51dHplIGRhcyBLb21tYW5kbyBzdHR5IHJlc2V0IVxuIik7CisgICAgICB9CisKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHNldF9hc2NpaV9hcnQoc3RyaW5nIHN0cikKK3sKKyAgaWYgKHN0ciE9ImVpbiImJnN0ciE9ImF1cyIpCisgIHsKKyAgICAgcHJpbnRmKCJEdSBtb2VjaHRlc3QgJ0dyYWZpaycgIisoUXVlcnlQcm9wKFBfTk9fQVNDSUlfQVJUKT8iTklDSFQgIjoiIikrCisgICAgICAgICAgICAgICAgICAgICAic2VoZW4uXG4iKTsKKyAgfQorCisgIGlmIChzdHI9PSJlaW4iKSB7CisgICAgU2V0UHJvcChQX05PX0FTQ0lJX0FSVCwgMCk7CisgICAgcHJpbnRmKCJadWt1ZW5mdGlnIG1vZWNodGVzdCBEdSAnR3JhZmlrJyBzZWhlbi5cbiIpOworICB9CisKKyAgaWYgKHN0cj09ImF1cyIpIHsKKyAgICBTZXRQcm9wKFBfTk9fQVNDSUlfQVJULCAxKTsKKyAgICBwcmludGYoIlp1a3VlbmZ0aWcgbW9lY2h0ZXN0IER1IEtFSU5FICdHcmFmaWsnIG1laHIgc2VoZW4uXG4iKTsKKyAgfQorCisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBfc2V0X3NoZWxsX3ZlcnNpb24oaW50IGFyZykKK3sKKyAgaWYgKCFpbnRwKGFyZykpCisgICAgcmV0dXJuIC0xOworICBTZXQoUF9TSEVMTF9WRVJTSU9OLCh7UXVlcnlQcm9wKFBfUkFDRSksYXJnfSkpOworICByZXR1cm4gMTsKK30KKworaW50IF9xdWVyeV9zaGVsbF92ZXJzaW9uKCkKK3sgICBtaXhlZCBzdjsKKworICAgIGlmICghKHN2PVF1ZXJ5KFBfU0hFTExfVkVSU0lPTikpIHx8ICFwb2ludGVycChzdikgfHwgc2l6ZW9mKHN2KSE9MiB8fAorICAgICAgICBzdlswXSE9UXVlcnlQcm9wKFBfUkFDRSkgfHwgIWludHAoc3ZbMV0pKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN2WzFdOworfQorCisvLyBYeFh4WHhYeFh4CisKK2ludCBtb3JlKHN0cmluZyBzdHIpCit7CisgIGlmKCFzdHIpCisgIHsKKyAgICBub3RpZnlfZmFpbCgiVXNhZ2U6IG1vcmUgPGZpbGU+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZmlsZV9zaXplKHN0cikgPD0gMCkgeworICAgIG5vdGlmeV9mYWlsKHN0cisiOiBObyBzdWNoIGZpbGVcbiIpOworICAgIHJldHVybiAwOworICB9CisgIE1vcmUoc3RyLCAxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3Zpc3VhbGJlbGwoc3RyaW5nIHN0cikKK3sKKyAgaWYoIXN0cikKKyAgeworICAgIHdyaXRlKCJEZXJ6ZWl0aWdlIEVpbnN0ZWxsdW5nIGZ1ZXIgVG9uYXVzZ2FiZTogIisKKyAgICAgICAgIChRdWVyeVByb3AoUF9WSVNVQUxCRUxMKT8iQVVTIjoiRUlOIikrIi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSJlaW4iKQorICB7CisgICAgaWYoIVF1ZXJ5UHJvcChQX1ZJU1VBTEJFTEwpKQorICAgICAgd3JpdGUoIkRpZSBUb25hdXNnYWJlIHN0YW5kIHNjaG9uIGF1ZiBFSU4uXG4iKTsKKyAgICBlbHNlCisgICAgICB7CisgIFNldFByb3AoUF9WSVNVQUxCRUxMLDApOworICAgICAgICB3cml0ZSgiT0ssIFRvbmF1c2dhYmUgYXVmIEVJTiBnZXN0ZWxsdC5cbiIpOworICAgICAgfQorICB9CisgIGVsc2UKKyAgICBpZiAoc3RyPT0iYXVzIikKKyAgICB7CisgICAgICBpZihRdWVyeVByb3AoUF9WSVNVQUxCRUxMKSkKKyAgICAgICAgd3JpdGUoIkRpZSBUb25hdXNnYWJlIHN0YW5kIHNjaG9uIGF1ZiBBVVMuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIFNldFByb3AoUF9WSVNVQUxCRUxMLDEpOworICAgIHdyaXRlKCJPSywgVG9uYXVzZ2FiZSBhdWYgQVVTIGdlc3RlbGx0LlxuIik7CisgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgd3JpdGUoIlN5bnRheDogdG9uIFtlaW58YXVzXVxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldF9zY3JlZW5zaXplKHN0cmluZyBzdHIpCit7CisgIGludCBzaXplOworCisgIGlmIChzdHIgJiYgKHN0clswLi4yXSA9PSAiYWJzIiB8fCBzdHJbMC4uMl09PSJyZWwiKSkgeworICAgIHNpemUgPSBRdWVyeVByb3AoUF9NT1JFX0ZMQUdTKTsKKyAgICBpZiAoc3RyWzAuLjJdID09ICJhYnMiKSB7CisgICAgICBzaXplIHw9IEVfQUJTOworICAgICAgd3JpdGUoIkVzIHdpcmQgYmVpbSBQcm9tcHQgZGllIFplaWxlbnphaGwgZGVzIFRleHRlcyBhbmdlZ2ViZW4uXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzaXplICY9IH5FX0FCUzsKKyAgICAgIHdyaXRlKCJFcyB3aXJkIGJlaW0gUHJvbXB0IGRlciBwcm96ZW50dWFsZSBBbnRlaWwgZGVzIFRleHRlcyBhbmdlZ2ViZW4uXG4iKTsKKyAgICB9CisgICAgU2V0UHJvcChQX01PUkVfRkxBR1MsIHNpemUpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCBzdHIgJiYgKHN0cj09ImF1dG8iIHx8IHNzY2FuZiggc3RyLCAiYXV0byAlZCIsIHNpemUgKSkgKXsKKyAgICAgIGlmICggc2l6ZSA+IDAgKXsKKyAgICAgICAgICB3cml0ZSgiVW5ndWVsdGlnZXIgV2VydCEgIgorICAgICAgICAgICAgICAgICJJbiBWZXJiaW5kdW5nIG1pdCAnYXV0bycgc2luZCBudXIgbmVnYXRpdmUgV2VydGUgZXJsYXVidC5cbiIpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgfQorCisgICAgICBTZXRQcm9wKCBQX1NDUkVFTlNJWkUsIHNpemUtMSApOworCisgICAgICB3cml0ZSgiT2ssIERlaW5lIFplaWxlbnphaGwgd2lyZCBudW4gYXV0b21hdGlzY2ggZXJtaXR0ZWx0IChkZXJ6ZWl0ICIrCisgICAgICAgICAgICBRdWVyeVByb3AoUF9TQ1JFRU5TSVpFKSsiKS5cbiIrCisgICAgICAgICAgICBicmVha19zdHJpbmcoIkJpdHRlIGJlYWNodGUsIGRhc3MgZGllcyBudXIgZWlud2FuZGZyZWkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5rdGlvbmllcnQsIHdlbm4gRGVpbiBDbGllbnQgVGVsbmV0bmVnb3RpYXRpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW50ZXJzdHVldHp0IChzaWVoZSBhdWNoIFwiaGlsZmUgdGVsbmVnc1wiKS4iKSApOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKCAhc3RyIHx8IHN0cj09IiIgfHwgIXNzY2FuZiggc3RyLCAiJWQiLCBzaXplICkgfHwgc2l6ZSA8IDAgfHwgc2l6ZSA+IDEwMCl7CisgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAgICBzcHJpbnRmKCJNaXQgZGVtIEJlZmVobCAnemVpbGVuIDxncm9lc3NlPicga2FubnN0IER1IGVpbnN0ZWxsZW4sICIKKyAgICAgICAgICAgICJ3aWV2aWVsZSBaZWlsZW4gYmVpIG1laHJzZWl0aWdlbiBUZXh0ZW4gYXVmIGVpbm1hbCBhdXNnZWdlYmVuICIKKyAgICAgICAgICAgICJ3ZXJkZW4uIERpZSBhbmdlZ2ViZW5lIEdyb2Vzc2UgbXVzcyB6d2lzY2hlbiAwIHVuZCAxMDAgbGllZ2VuLiAiCisgICAgICAgICAgICAiQmVpIEdyb2Vzc2UgMCB3aXJkIGVpbmZhY2ggYWxsZXMgYXVzZ2VnZWJlbiAob2huZSBQYXVzZSkuIE1pdCAiCisgICAgICAgICAgICAiZGVyIEVpbnN0ZWxsdW5nICdhdXRvJyB3aXJkIGRpZSBHcm9lc3NlIGF1dG9tYXRpc2NoIHVlYmVyICIKKyAgICAgICAgICAgICJkaWUgVGVsbmV0bmVnb3RpYXRpb25zIGVybWl0dGVsdCAoc2llaGUgYXVjaCAnaGlsZmUgdGVsbmVncycpLiAiCisgICAgICAgICAgICAiVW0gbmFjaCBlaW5lciBTZWl0ZSBUZXh0IG5vY2ggZXR3YXMgUGxhdHogenUgaGFiZW4sIGthbm4gbWFuIHouQi4gIgorICAgICAgICAgICAgIid6ZWlsZW4gYXV0byAtMycgZWluc3RlbGxlbi5cbiIKKyAgICAgICAgICAgICJEaWUgVm9yZWluc3RlbGx1bmcgaXN0IDIwIFplaWxlbi5cbiIKKyAgICAgICAgICAgICJNaXQgJ3plaWxlbiBhYnNbb2x1dF0nIHVuZCAnemVpbGVuIHJlbFthdGl2XScga2FubnN0IER1IGZlc3QiCisgICAgICAgICAgICAibGVnZW4sIG9iIGltIFByb21wdCBiZWkgbGFuZ2VuIFRleHRlbiBkaWUgYWt0dWVsbGUgWmVpbGVubnVtbWVyICIKKyAgICAgICAgICAgICJvZGVyIGVpbmUgcHJvemVudHVhbGUgQW5nYWJlIGF1c2dlZ2ViZW4gd2lyZC5cbiIKKyAgICAgICAgICAgICJEZWluZSBha3R1ZWxsZSBFaW5zdGVsbHVuZyBpc3QgJWQlcyBaZWlsZW4gKCVzKS4iLAorICAgICAgICAgICAgUXVlcnlQcm9wKFBfU0NSRUVOU0laRSksCisgICAgICAgICAgICBRdWVyeShQX1NDUkVFTlNJWkUpIDwgMCA/ICIgJ2F1dG9tYXRpc2NoZSciIDogIiIsCisgICAgICAgICAgICBRdWVyeVByb3AoUF9NT1JFX0ZMQUdTKSAmIEVfQUJTID8gImFic29sdXQiIDogInJlbGF0aXYiKSw3OCwwLDEpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIFNldFByb3AoIFBfU0NSRUVOU0laRSwgc2l6ZSApOworCisgIHByaW50ZiggIk9rYXksIERlaW5lIFplaWxlbnphaGwgc3RlaHQgbnVuIGF1ZiAlZC5cbiIsIHNpemUgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3NjcmVlbnNpemUoKQoreworICAgIGludCBzeixyb3dzOworCisgICAgaWYgKCAoc3o9UXVlcnkoUF9TQ1JFRU5TSVpFKSkgPj0gMCApCisgICAgICAgIHJldHVybiBzejsKKworICAgIGlmICggIXJvd3M9UXVlcnlQcm9wKFBfVFRZX1JPV1MpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHJvd3MrPXN6KSA+PSA1ID8gcm93cyA6IDU7Cit9CisKK3N0YXRpYyBpbnQgcHJlc2F5KHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyPV91bnBhcnNlZF9hcmdzKCkpCisgICAgd3JpdGUoIkRlaW4gUHJlc2F5IGlzdCBqZXR6dCBnZWxvZXNjaHQuXG4iKTsKKyAgZWxzZQorICAgIHByaW50ZigiRGVpbiBQcmVzYXkgbGF1dGV0IGpldHp0OiBcIiVzXCIuXG4iLHN0cj1jYXBpdGFsaXplKHN0cikpOworICBTZXRQcm9wKFBfUFJFU0FZLHN0cik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHNldGhhbmRzKHN0cmluZyBzdHIpCit7CisgIG1peGVkICpoYW5kczsKKworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpCisgIHsKKyAgICB3cml0ZSgic2V0aGFuZHMgPG1lc3NhZ2U+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyPT0iMCIpCisgICAgICBoYW5kcz1SYWNlRGVmYXVsdChQX0hBTkRTKTsKKyAgaWYgKCFoYW5kcyB8fCAhcG9pbnRlcnAoaGFuZHMpKQorICAgICAgaGFuZHM9UXVlcnkoUF9IQU5EUyk7CisgIGhhbmRzWzBdPSIgIitzdHI7CisgIFNldChQX0hBTkRTLGhhbmRzKTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGluZm9ybShzdHJpbmcgc3RyKQoreworICBzd2l0Y2ggKHN0cikgeworICAgIGNhc2UgIm9uIjoKKyAgICBjYXNlICJlaW4iOgorICAgIGNhc2UgImFuIjoKKyAgICAgIGlmIChRdWVyeShQX0lORk9STU1FKSkKKyAgICB3cml0ZSgiRGFzIGhhdHRlc3QgRHUgc2Nob24gc28gZWluZ2VzdGVsbHQuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICB3cml0ZSgiS3VlbmZ0aWcgd2lyc3QgRHUgaW5mb3JtaWVydCwgd2VubiBqZW1hbmQgZGFzICJNVUROQU1FIiB2ZXJsYWVzc3QvYmV0cml0dC5cbiIpOworICAgIFNldChQX0lORk9STU1FLDEpOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAiYXVzIjoKKyAgICBjYXNlICJvZmYiOgorICAgICAgaWYgKCFRdWVyeShQX0lORk9STU1FKSkKKyAgICB3cml0ZSgiRGFzIGhhdHRlc3QgRHUgc2Nob24gc28gZWluZ2VzdGVsbHQuXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICB3cml0ZSgiT2suXG4iKTsKKyAgICBTZXQoUF9JTkZPUk1NRSwwKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgMDoKKyAgICAgIHdyaXRlKCJJbmZvcm0tTW9kZSBpc3QgIisoUXVlcnkoUF9JTkZPUk1NRSk/ImFuIjoiYXVzIikrImdlc2NoYWx0ZXQuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgd3JpdGUoImluZm9ybSBhbiBvZGVyIGluZm9ybSBhdXMsIGJpdHRlLlxuIik7CisgIHJldHVybiAxOworfQorCit2b2lkIGRlbGF5ZWRfd3JpdGUobWl4ZWQgKndoYXQpCit7CisgIGlmICghcG9pbnRlcnAod2hhdCl8fCFzaXplb2Yod2hhdCl8fCFwb2ludGVycCh3aGF0WzBdKSkKKyAgICByZXR1cm47CisgIHRlbGxfb2JqZWN0KE1FLHdoYXRbMF1bMF0pOworICBpZiAoc2l6ZW9mKHdoYXQpPjEmJnNpemVvZih3aGF0WzBdKT4xKQorICAgIGNhbGxfb3V0KCJkZWxheWVkX3dyaXRlIix3aGF0WzBdWzFdLHdoYXRbMS4uXSk7Cit9CisKK3ZvaWQgbm90aWZ5X3BsYXllcl9jaGFuZ2Uoc3RyaW5nIHdobywgaW50IHJlaW4sIGludCBpbnZpcykKK3sKKyAgc3RyaW5nICpsaXN0LG5hbWU7CisgIG1peGVkIG1saXN0OworCisgIGlmIChpbnZpcykgbmFtZT0iKCIrd2hvKyIpIjsKKyAgICBlbHNlIG5hbWU9d2hvOworCisgIGlmIChRdWVyeShQX0lORk9STU1FKSkKKyAgeworICAgICAgaWYgKHJlaW4pCisgICAgICAgIHRlbGxfb2JqZWN0KE1FLG5hbWUrIiBpc3QgZ2VyYWRlIGlucyAiTVVETkFNRSIgZ2Vrb21tZW4uXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsbmFtZSsiIGhhdCBnZXJhZGUgZGFzICJNVUROQU1FIiB2ZXJsYXNzZW4uXG4iKTsKKyAgfQorCisgIGlmKFF1ZXJ5KFBfV0FJVEZPUl9GTEFHUykgJiAoMHgwMSkpcmV0dXJuIDsKKworICBpZihwb2ludGVycChsaXN0PVF1ZXJ5KFBfV0FJVEZPUikpICYmIHNpemVvZihsaXN0KSAmJiBtZW1iZXIobGlzdCx3aG8pIT0tMSkKKyAgeworICAgIGlmICghUXVlcnlQcm9wKFBfVklTVUFMQkVMTCkpCisgICAgICAgIG5hbWUrPXNwcmludGYoIiVjIiw3KTsgLy8gQ2hhciBmdWVyIFBpZXBzIGFuIGRlbiBTdHJpbmcgYW5oYWVuZ2VuLgorICAgIC8vIE1vZWNodGUgZGVyIFNwaWVsZXIga2VpbmUgQVNDSUktR3JhZmlrIHNlaGVuLCB3aXJkIGRpZXNlIE1lbGR1bmcgb2huZQorICAgIC8vIExlZXJ6ZWljaGVuIGZvcm1hdGllcnQsIHNvIGRhc3Mgc2llIHZvbiBTY3JlZW5yZWFkZXJuIHZvcmdlbGVzZW4gd2lyZC4KKyAgICAvLyBBbmRlcmVuZmFsbHMgd3VlcmRlIHNpZSBlaW56ZWxuIGJ1Y2hzdGFiaWVydC4KKyAgICBpZiAoIFF1ZXJ5UHJvcChQX05PX0FTQ0lJX0FSVCkgKQorICAgIHsKKyAgICAgIGRlbGF5ZWRfd3JpdGUoICh7ICh7IHNwcmludGYoIiVzIElTVCBKRVRaVCAlc0RBICEhIVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAocmVpbj8iIjoiTklDSFQgTUVIUiAiKSkgfSkgfSkgKTsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICBkZWxheWVkX3dyaXRlKCAoeyAoeyBzcHJpbnRmKCIlcyAgIEkgUyBUICAgSiBFIFQgWiBUICAgJXNEIEEgISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgKHJlaW4/IiI6Ik4gSSBDIEggVCAgIE0gRSBIIFIgICAiKSkgfSkgfSkgKTsKKyAgICB9CisgIH0KKworICBpZiAocmVpbiAmJiAoc2l6ZW9mKG1saXN0PVF1ZXJ5UHJvcChQX1dBSVRGT1JfUkVBU09OKSkpICYmCisgICAgIChtYXBwaW5ncChtbGlzdCkpICYmIChtbGlzdFt3aG9dKSkKKyAgICAgICAgU2hvd19XYWl0Rm9yX1JlYXNvbih3aG8saW52aXMpOworfQorCitzdGF0aWMgaW50IGVyd2FydGUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpsaXN0LCpzdHIxOworICBtaXhlZCBtbGlzdDsKKyAgaW50IGk7CisKKyAgaWYgKCFtYXBwaW5ncChtbGlzdD1RdWVyeVByb3AoUF9XQUlURk9SX1JFQVNPTikpKQorICAgICBtbGlzdD0oW10pOworICBpZiAoIXBvaW50ZXJwKGxpc3Q9UXVlcnkoUF9XQUlURk9SKSkpCisgICAgIGxpc3Q9KHt9KTsKKworICBpZiAoIXN0ciB8fCBzdHI9PSItdSIpCisgIHsKKyAgICAgaWYoUXVlcnkoUF9XQUlURk9SX0ZMQUdTKSYweDAxKQorICAgICAgIHdyaXRlKCJEdSBoYXN0ICdlcndhcnRlJyB0ZW1wb3JhZXIgZGVha3RpdmllcnQuXG4iKTsKKyAgICAgd3JpdGUoIkR1IGVyd2FydGVzdCBqZXR6dCIpOworICAgICBpZiAoIXNpemVvZihsaXN0KSkKKyAgICAgICAgd3JpdGUoIiBuaWVtYW5kZW4gbWVoci5cbiIpOworICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgd3JpdGUoIjpcbiIpOworICAgICAgICBpZiAoIXN0cikgbGlzdD1zb3J0X2FycmF5KGxpc3QsIyc+KTsKKyAgICAgICAgTW9yZShicmVha19zdHJpbmcoQ291bnRVcChsaXN0KSw3OCkpOworICAgICB9CisgICAgIHJldHVybiAxOworICB9CisgIGlmKHN0cj09ImF1cyIpeworICAgIFNldChQX1dBSVRGT1JfRkxBR1MsUXVlcnkoUF9XQUlURk9SX0ZMQUdTKXwweDAxKTsKKyAgICB3cml0ZSgiRXJ3YXJ0ZSBpc3QgamV0enQgZGVha3RpdmllcnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzdHI9PSJhbiIgfHwgc3RyPT0iZWluIil7CisgICAgU2V0KFBfV0FJVEZPUl9GTEFHUyxRdWVyeShQX1dBSVRGT1JfRkxBR1MpJjB4RkUpOworICAgIHdyaXRlKCJFcndhcnRlIGlzdCBqZXR6dCBha3Rpdi5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgc3RyMT1leHBsb2RlKF91bnBhcnNlZF9hcmdzKCl8fCIiLCIgIik7CisgIGlmIChzaXplb2Yoc3RyMSk9PTEpCisgIHsKKyAgICAgaWYgKHN0cjFbMF0hPSJ3ZWdlbiIpCisgICAgIHsKKyAgICAgICAgc3RyPWNhcGl0YWxpemUobG93ZXJfY2FzZShzdHIpKTsKKyAgICAgICAgaWYgKG1lbWJlcihsaXN0LHN0cikhPS0xKQorICAgICAgICB7CisgICAgICAgICAgIFNldFByb3AoUF9XQUlURk9SX1JFQVNPTixtX2NvcHlfZGVsZXRlKG1saXN0LHN0cikpOworICAgICAgICAgICBsaXN0LT0oe3N0cn0pOworICAgICAgICAgICB3cml0ZShzdHIrIiBhdXMgZGVyIExpc3RlIGVudGZlcm50LlxuIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgIGlmIChzaXplb2YobGlzdCk+MTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgIHdyaXRlKCJEdSBlcndhcnRlc3Qgc2Nob24gZ2VudWVnZW5kIVxuIik7CisgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbGlzdCs9KHtzdHJ9KTsKKyAgICAgICAgICAgd3JpdGUoc3RyKyIgYW4gZGllIExpc3RlIGFuZ2VoYWVuZ3QuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBTZXQoUF9XQUlURk9SLGxpc3QpOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICBpZiAoc2l6ZW9mKG1saXN0KSAmJiBzaXplb2YobGlzdD1tX2luZGljZXMobWxpc3QpKSkKKyAgICAgICAgeworICAgICAgICAgICB3cml0ZSgiRHUgZXJ3YXJ0ZXN0IGF1cyBlaW5lbSBiZXN0aW1tdGVuIEdydW5kOlxuIik7CisgICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhDb3VudFVwKHNvcnRfYXJyYXkobGlzdCwjJz4pKSsiLiIsNzgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHdyaXRlKCJEdSBlcndhcnRlc3QgbmllbWFuZGVuIGF1cyBlaW5lbSBiZXN0aW1tdGVuIEdydW5kLlxuIik7CisgICAgIH0KKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgbm90aWZ5X2ZhaWwoIkZhbHNjaGUgU3ludGF4LCBzaWVoZSAnaGlsZmUgZXJ3YXJ0ZSchXG4iKTsKKyAgaWYgKHN0cjFbMV0hPSJ3ZWdlbiIpIHJldHVybiAwOworICBpZiAoc2l6ZW9mKHN0cjEpPT0yKQorICAgICBTaG93X1dhaXRGb3JfUmVhc29uKGNhcGl0YWxpemUobG93ZXJfY2FzZShzdHIxWzBdKSksMCk7CisgIGVsc2UgeworICAgICBzdHJpbmcgcz1jYXBpdGFsaXplKGxvd2VyX2Nhc2Uoc3RyMVswXSkpOworICAgICBpZiAoc2l6ZW9mKHN0cjEpPT0zICYmIChzdHIxWzJdPT0ibmljaHRzIiB8fCBzdHIxWzJdPT0ibG9lc2NoZW4iKSkKKyAgICAgICAgaWYgKCFtbGlzdFtzXSkKKyAgICAgICAgICAgd3JpdGUoIkR1IGhhc3QgIitzKyIgYXVzIGtlaW5lbSBiZXN0aW1tdGVuIEdydW5kIGVyd2FydGV0IVxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICBTZXRQcm9wKFBfV0FJVEZPUl9SRUFTT04sbV9jb3B5X2RlbGV0ZShtbGlzdCxzKSk7CisgICAgICAgICAgIHdyaXRlKCJEdSBlcndhcnRlc3QgIitzKyIgYXVzIGtlaW5lbSBiZXN0aW1tdGVuIEdydW5kIG1laHIhXG4iKTsKKyAgICAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgaWYgKElTX0FSQ0goTUUpKSBpPTgwOyBlbHNlIGlmIChJU19MRUFSTkVSKE1FKSkgaT00MDsKKyAgICAgICAgZWxzZSBpZiAoSVNfU0VFUihNRSkpIGk9MjA7IGVsc2UgaT0xMDsKKyAgICAgICAgaWYgKCFtbGlzdFtzXSAmJiBzaXplb2YobWxpc3QpPj1pKQorICAgICAgICAgICB3cml0ZSgiU29ycnksIGFiZXIgRHUgZXJ3YXJ0ZXN0IHNjaG9uIGdlbnVlZ2VuZCBMZXV0ZSFcbiIpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgU2V0UHJvcChQX1dBSVRGT1JfUkVBU09OLG1saXN0KyhbczppbXBsb2RlKHN0cjFbMi4uXSwiICIpXSkpOworICAgICAgICAgICBTaG93X1dhaXRGb3JfUmVhc29uKHMsMCk7CisgICAgICAgIH0KKyAgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVocm1lbGR1bmcoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCEoc3RyPV91bnBhcnNlZF9hcmdzKCkpKQorICB7CisgICAgc3RyPVF1ZXJ5UHJvcChQX0NMT0NLTVNHKTsKKyAgICBpZiAoIXN0cikKKyAgICB7CisgICAgICB3cml0ZSgiRHUgaGFzdCBkaWUgU3RhbmRhcmQtVWhybWVsZHVuZy5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICAgICBpZiggIXN0cmluZ3Aoc3RyKSApIHN0ciA9IHNwcmludGYoIiVPXG4iLHN0cik7CisgICAgcHJpbnRmKCJEZWluZSBVaHJtZWxkdW5nIGlzdDpcbiVzXG4iLHN0clswLi48Ml0pOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHI9PSIwIikKKyAgeworICAgIFNldFByb3AoUF9DTE9DS01TRywwKTsKKyAgICB3cml0ZSgiT2ssIER1IGhhc3QgamV0enQgd2llZGVyIGRpZSBTdGFuZGFyZC1NZWxkdW5nLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNpemVvZihleHBsb2RlKHN0ciwiJWQiKSk+MikKKyAgeworICAgIHdyaXRlKCJGZWhsZXIsIGVzIGRhcmYgbnVyIGVpbiAlZCBpbiBkZXIgTWVsZHVuZyB2b3Jrb21tZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvKiBNZWhyZXJlICUtUGFyYW1ldGVyIHZlcnVyc2FjaGVuIGRhcyBBYnNjaGFsdGVuIGRlciBVaHIgenVyIHZvbGxlbiBTdHVuZGUuCisgICAqLworICBpZiAoc2l6ZW9mKGV4cGxvZGUoc3RyLCIlIikpPjIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyOiBadXZpZWxlICUtUGFyYW1ldGVyIGluIGRlciBNZWxkdW5nLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLyogTnVyIGVpbiAlLVBhcmFtZXRlciwgYWJlciBkZXIgZmFsc2NoZTogbmljaHQgc2lubnZvbGwuICovCisgIGVsc2UKKyAgeworICAgIGludCBpID0gc3Ryc3RyKHN0ciwiJSIsMCk7CisgICAgaWYgKCBpPi0xICYmICggaT09c2l6ZW9mKHN0ciktMSB8fCBzdHJbaSsxXSE9J2QnKSkKKyAgICB7CisgICAgICB3cml0ZSgiRmVobGVyOiBGYWxzY2hlciAlLVBhcmFtZXRlciBpbiBkZXIgTWVsZHVuZy5cbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIHN0cis9IlxuIjsKKyAgU2V0UHJvcChQX0NMT0NLTVNHLHN0cik7CisgIHdyaXRlKCJPay5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB6ZWl0em9uZShzdHJpbmcgc3RyKQoreworICBpbnQgenQ7CisgIGlmKCFzdHIgfHwgc3RyPT0iIil7CisgICAgaWYoISh6dD1RdWVyeVByb3AoUF9USU1FWk9ORSkpKQorICAgICAgd3JpdGUoIkR1IGhhc3QgZGVyemVpdCBkaWUgZ2xlaWNoZSBaZWl0em9uZSB3aWUgZGFzICJNVUROQU1FIiAiKworICAgICAgICAgICAgImVpbmdlc3RlbGx0LlxuIik7CisgICAgZWxzZSBpZih6dD4wKQorICAgICAgcHJpbnRmKCJEZWluZSBaZWl0em9uZSBpc3QgYXVmICVkIFN0dW5kZW4gdm9yIChvZXN0bGljaCkgdm9uIEJlcmxpbiAiKworICAgICAgICAgICAgICJlaW5nZXN0ZWxsdC5cbiIsenQpOworICAgIGVsc2UKKyAgICAgIHByaW50ZigiRGVpbmUgWmVpdHpvbmUgaXN0IGF1ZiAlZCBTdHVuZGVuIG5hY2ggKHdlc3RsaWNoKSB2b24gIisKKyAgICAgICAgICAgICAiQmVybGluIGVpbmdlc3RlbGx0LlxuIiwtenQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKHNzY2FuZihzdHIsInV0YyAlZCIsenQpPT0xKSAgenQ9KHp0LTEpJTI0OworICBlbHNlIHp0PXRvX2ludChzdHIpJTI0OworCisgIFNldFByb3AoUF9USU1FWk9ORSx6dCk7CisKKyAgaWYoIXp0KQorICAgIHdyaXRlKCJEdSBoYXN0IGRlcnplaXQgZGllIGdsZWljaGUgWmVpdHpvbmUgd2llIGRhcyAiTVVETkFNRSIgIisKKyAgICAgICAgICAiZWluZ2VzdGVsbHQuXG4iKTsKKyAgZWxzZSBpZih6dD4wKQorICAgIHByaW50ZigiRGVpbmUgWmVpdHpvbmUgaXN0IGF1ZiAlZCBTdHVuZGVuIHZvciAob2VzdGxpY2gpIHZvbiBCZXJsaW4gIisKKyAgICAgICAgICAgImVpbmdlc3RlbGx0LlxuIix6dCk7CisgIGVsc2UKKyAgICBwcmludGYoIkRlaW5lIFplaXR6b25lIGlzdCBhdWYgJWQgU3R1bmRlbiBuYWNoICh3ZXN0bGljaCkgdm9uICIrCisgICAgICAgICAgICJCZXJsaW4gZWluZ2VzdGVsbHQuXG4iLC16dCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGVtYWlsYW56ZWlnZShzdHJpbmcgc3RyKXsKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZW1haWxhbnplaWdlIFthbGxlfGZyZXVuZGV8bmllbWFuZF1cbiIpOworICBpZighc3RyIHx8IHN0cj09IiIpeworICAgIGlmKCEoc3RyPVF1ZXJ5UHJvcChQX1NIT1dFTUFJTCkpKXN0cj0iTmllbWFuZGVtIjsKKyAgICBlbHNlIGlmKHN0cj09ImFsbGUiKXN0cj0iYWxsZW4iOworICAgIGVsc2UgaWYoc3RyPT0iZnJldW5kZSIpc3RyPSJEZWluZW4gRnJldW5kZW4iOworICAgIGVsc2UgaWYoc3RyPT0ibmllbWFuZCIpc3RyPSJuaWVtYW5kZW0iOworICAgIGVsc2V7CisgICAgICBTZXRQcm9wKFBfU0hPV0VNQUlMLDApOworICAgICAgc3RyPSJOaWVtYW5kZW0iOworICAgIH0KKyAgICB3cml0ZSgiRGVpbmUgRW1haWwgd2lyZCAiK3N0cisiIGFuZ2V6ZWlndC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYobWVtYmVyKCh7ImFsbGUiLCJmcmV1bmRlIiwibmllbWFuZCJ9KSxzdHIpPT0tMSlyZXR1cm4gMDsKKworICBTZXRQcm9wKFBfU0hPV0VNQUlMLHN0cik7CisKKyAgaWYoc3RyPT0iYWxsZSIpc3RyPSJhbGxlbiI7CisgIGVsc2UgaWYoc3RyPT0iZnJldW5kZSIpc3RyPSJEZWluZW4gRnJldW5kZW4iOworICBlbHNlIHN0cj0ibmllbWFuZGVtIjsKKyAgd3JpdGUoIkRlaW5lIEVtYWlsIHdpcmQgIitzdHIrIiBhbmdlemVpZ3QuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgemF1YmVydHJhZW5rZSgpCit7CisgIE1vcmUoIi9yb29tL29yYWtlbCItPlRpcExpc3RlKCkpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBzdGF0aWMgaW50IGFuZ3JpZmZzbWVsZHVuZyhzdHJpbmcgYXJnKSB7CisgIGlmIChhcmc9PSJlaW4iIHx8IGFyZz09ImFuIikKKyAgICBTZXRQcm9wKFBfU0hPV19BVFRBQ0tfTVNHLDEpOworICBlbHNlIGlmIChhcmc9PSJhdXMiKQorICAgIFNldFByb3AoUF9TSE9XX0FUVEFDS19NU0csMCk7CisgIGlmIChRdWVyeVByb3AoUF9TSE9XX0FUVEFDS19NU0cpKQorICAgIHdyaXRlKCJEdSBzaWVoc3Qgc2FlbXRsaWNoZSBBbmdyaWZmc21lbGR1bmdlbiB2b24gRGlyLlxuIik7CisgIGVsc2UKKyAgICB3cml0ZSgiRHUgc2llaHN0IG51ciBuZXVlIEFuZ3JpZmZzbWVsZHVuZ2VuIHZvbiBEaXIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsiemVpbGVuIiwic2V0X3NjcmVlbnNpemUiLDAsMH0pLAorICAgICAgICAgICAoeyJlbWFpbCIsInNldF9lbWFpbCIsMCwwfSksCisgICAgICAgICAgICh7InVybCIsInNldF9ob21lcGFnZSIsMCwwfSksCisgICAgICAgICAgICh7ImljcSIsInNldF9pY3EiLDAsMH0pLAorICAgICAgICAgICAoeyJtZXNzZW5nZXIiLCAic2V0X21lc3NlbmdlciIsIDAsIDB9KSwgCisgICAgICAgICAgICh7Im9ydCIsInNldF9sb2NhdGlvbiIsMCwwfSksCisgICAgICAgICAgICh7InB1bmt0ZSIsInNob3J0X3Njb3JlIiwwLDB9KSwKKyAgICAgICAgICAgKHsic2NvcmUiLCJzaG9ydF9zY29yZSIsMCwwfSksCisgICAgICAgICAgICh7ImluZm8iLCJzY29yZSIsMCwwfSksCisgICAgICAgICAgICh7Imt1cnppbmZvIiwidmVyeV9zaG9ydF9zY29yZSIsMCwwfSksCisgICAgICAgICAgICh7InF1aXQiLCJuZXdfcXVpdCIsMCwwfSksCisgICAgICAgICAgICh7ImVuZGUiLCJuZXdfcXVpdCIsMCwwfSksCisgICAgICAgICAgICh7ImRpc2Nvbm5lY3QiLCJkaXNjb25uZWN0IiwwLDB9KSwKKyAgICAgICAgICAgKHsic2NobGFmIiwiZGlzY29ubmVjdCIsMSwwfSksCisgICAgICAgICAgICh7InNwZWljaGVybiIsInNhdmVfY2hhcmFjdGVyIiwwLDB9KSwKKyAgICAgICAgICAgKHsic2F2ZSIsInNhdmVfY2hhcmFjdGVyIiwwLDB9KSwKKyAgICAgICAgICAgKHsidG9ldGUiLCJraWxsIiwwLDB9KSwKKyAgICAgICAgICAgKHsiYW5ncmlmZnNtZWxkdW5nIiwiYW5ncmlmZnNtZWxkdW5nIiwwLDB9KSwKKyAgICAgICAgICAgKHsicGFzc3ciLCJjaGFuZ2VfcGFzc3dvcmQiLDEsMH0pLAorICAgICAgICAgICAoeyJoaWxmZSIsImhlbHAiLDEsMH0pLAorICAgICAgICAgICAoeyJzZWxic3Rsb2VzY2h1bmciLCJzZWxmX2RlbGV0ZSIsMCwwfSksCisgICAgICAgICAgICh7InNwaWVscGF1c2UiLCJzcGllbHBhdXNlIiwwLDB9KSwKKyAgICAgICAgICAgKHsic3BpZWxkYXVlciIsInNwaWVsZGF1ZXIiLDAsMH0pLAorICAgICAgICAgICAoeyJpZGVlIiwiaWRlYSIsMCwwfSksCisgICAgICAgICAgICh7InR5cG8iLCJ0eXBvIiwwLDB9KSwKKyAgICAgICAgICAgKHsiYnVnIiwiYnVnIiwwLDB9KSwKKyAgICAgICAgICAgKHsiZmVobGVyIiwiZmVobGVyaGlsZmUiLDAsMH0pLAorICAgICAgICAgICAoeyJtZCIsIm1kIiwwLDB9KSwKKyAgICAgICAgICAgKHsiZGV0YWlsIiwibWQiLDAsMH0pLAorICAgICAgICAgICAoeyJ2b3JzaWNodCIsInRvZ2dsZV93aGltcHkiLDAsMH0pLAorICAgICAgICAgICAoeyJzdG9wIiwic3RvcCIsMCwwfSksCisgICAgICAgICAgICh7Imt3aG8iLCJrd2hvIiwwLDB9KSwKKyAgICAgICAgICAgKHsia3dlciIsImt3aG8iLDAsMH0pLAorICAgICAgICAgICAoeyJra3dlciIsImtrd2hvIiwwLDB9KSwKKyAgICAgICAgICAgKHsia2t3aG8iLCJra3dobyIsMCwwfSksCisgICAgICAgICAgICh7IndobyIsIndobyIsMCwwfSksCisgICAgICAgICAgICh7IndlciIsIndobyIsMCwwfSksCisgICAgICAgICAgICh7InplaXQiLCJ1aHJ6ZWl0IiwwLDB9KSwKKyAgICAgICAgICAgKHsidWhyemVpdCIsInVocnplaXQiLDAsMH0pLAorICAgICAgICAgICAoeyJ3ZWciLCJ3ZWciLDAsMH0pLAorICAgICAgICAgICAoeyJ3ZWdtZWxkdW5nIiwgIndlZ21lbGR1bmciLCAwLCAwfSksCisgICAgICAgICAgICh7ImlkbGV6ZWl0IiwgImlkbGV6ZWl0IiwgMCwgMH0pLAorICAgICAgICAgICAoeyJmaW5nZXIiLCJmaW5nZXIiLDAsMH0pLAorICAgICAgICAgICAoeyJtdWRzIiwibXVkcyIsMCwwfSksCisgICAgICAgICAgICh7ImVtb3RlIiwiZW1vdGUiLDAsMH0pLAorICAgICAgICAgICAoeyI6IiwiZW1vdGUiLDEsMH0pLAorICAgICAgICAgICAoeyI7IiwiZW1vdGUiLDEsMH0pLAorICAgICAgICAgICAoeyJyZW1vdGUiLCJyZW1vdGUiLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsicjoiLCJyZW1vdGUiLDEsMH0pLAorICAgICAgICAgICAoeyJyOyIsImdyZW1vdGUiLDEsMH0pLAorICAgICAgICAgICAoeyJ0aXRlbCIsInNldF90aXRsZSIsMCwwfSksCisgICAgICAgICAgICh7InJldmlldyIsInJldmlldyIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRtaW4iLCJzZXRtaW4iLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsic2V0bW91dCIsInNldG1vdXQiLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsic2V0bW1pbiIsInNldG1taW4iLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsic2V0bW1vdXQiLCJzZXRtbW91dCIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJzZXRoYW5kcyIsInNldGhhbmRzIiwwLFNFRVJfTFZMfSksCisgICAgICAgICAgICh7InByZXNheSIsInByZXNheSIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJleHRyYWxvb2siLCJleHRyYWxvb2siLDAsU0VFUl9MVkx9KSwKKyAgICAgICAgICAgKHsiZmx1Y2h0cmljaHR1bmciLCJ0b2dnbGVfd2hpbXB5X2RpciIsMCxTRUVSX0xWTH0pLAorICAgICAgICAgICAoeyJpbmZvcm0iLCJpbmZvcm0iLDAsMH0pLAorICAgICAgICAgICAoeyJlcndhcnRlIiwiZXJ3YXJ0ZSIsMCwwfSksCisgICAgICAgICAgICh7InN0dHkiLCJzdHR5IiwwLDB9KSwKKyAgICAgICAgICAgKHsiZ3JhZmlrIiwgInNldF9hc2NpaV9hcnQiLCAwLCAwfSksIAorICAgICAgICAgICAoeyJ1aHJtZWxkdW5nIiwidWhybWVsZHVuZyIsMCwwfSksCisgICAgICAgICAgICh7InplaXR6b25lIiwiemVpdHpvbmUiLDAsMH0pLAorICAgICAgICAgICAoeyJiZWhhbHRlIiwiYmVoYWx0ZSIsMCwwfSksCisgICAgICAgICAgICh7Inp3ZWl0aWVtYXJraWVydW5nIiwiendlaXRpZW1hcmtpZXJ1bmciLDAsMH0pLAorICAgICAgICAgICAoeyJlbWFpbGFuemVpZ2UiLCJlbWFpbGFuemVpZ2UiLDAsMH0pLAorICAgICAgICAgICAoeyJ0b3BsaXN0ZSIsInRvcGxpc3RlIiwwLDB9KSwKKyAgICAgICAgICAgKHsidG9uIiwic2V0X3Zpc3VhbGJlbGwiLDAsMH0pLAorICAgICAgICAgICAoeyJ0ZWxuZWdzIiwic2hvd190ZWxuZWdzIiwwLDB9KSwKKyAgICAgICAgICAgKHsic3BvdHRlIiwgInNwb3R0ZSIsIDAsIDB9KSwKKyAgICAgICAgICAgKHsicmVpc2UiLCJyZWlzZSIsMCwwfSksCisgICAgICAgICAgICh7InphdWJlcnRyYWVua2UiLCJ6YXViZXJ0cmFlbmtlIiwwLDB9KSwKKyAgICAgICAgICAgKHsidGVsbmV0IiwidGVsbmV0X2NtZCIsMCwwfSksCisgICAgIH0pKworICAgICBjb21tYW5kOjpfcXVlcnlfbG9jYWxjbWRzKCkrCisgICAgIHZpZXdjbWQ6Ol9xdWVyeV9sb2NhbGNtZHMoKSsKKyAgICAgY29tbTo6X3F1ZXJ5X2xvY2FsY21kcygpKworICAgICBza2lsbHM6Ol9xdWVyeV9sb2NhbGNtZHMoKSsKKyAgICAgZGVzY3JpcHRpb246Ol9xdWVyeV9sb2NhbGNtZHMoKTsKK30KKworc3RhdGljIGludCBfY2hlY2tfa2VlcChvYmplY3Qgb2IpCit7CisgIHJldHVybiAob2ItPlF1ZXJ5UHJvcChQX0tFRVBfT05fU0VMTCkpPT1nZXRldWlkKE1FKTsKK30KKworc3RhdGljIG1peGVkIF9zZXRfdGVzdHBsYXllcihtaXhlZCBhcmcpIHsKKyAgbWl4ZWQgcmVzOworICBvYmplY3Qgc2V0b2I7CisKKyAgc2V0b2I9dGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKHNldG9iKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShzZXRvYikpCisgICAgc2V0b2I9dGhpc19pbnRlcmFjdGl2ZSgpOworICBpZiAoIW9iamVjdHAoc2V0b2IpKQorICAgIHNldG9iPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoc2V0b2IgJiYgIUlTX0RFUFVUWShzZXRvYikpIHsKKyAgICBhcmc9Z2V0ZXVpZChzZXRvYik7CisgICAgaWYgKCFhcmcgfHwgYXJnPT0iTk9CT0RZIikKKyAgICAgIGFyZz1nZXR1aWQoc2V0b2IpOworICAgIGFyZz1jYXBpdGFsaXplKGFyZyk7CisgIH0KKyAgcmVzPVNldChQX1RFU1RQTEFZRVIsYXJnKTsKKyAgU2V0KFBfVEVTVFBMQVlFUixQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgcmV0dXJuIHJlczsKK30KKworaW50IHp3ZWl0aWVtYXJraWVydW5nKHN0cmluZyBhcmcpCit7CisgIGlmICghUXVlcnlQcm9wKFBfU0VDT05EKSkKKyAgICByZXR1cm4gX25vdGlmeV9mYWlsKCJBYmVyIER1IGJpc3QgZG9jaCBnYXIga2VpbiBad2VpdGkuXG4iKSwwOworICBub3RpZnlfZmFpbCgiU3ludGF4OiB6d2VpdGllbWFya2llcnVuZyBbdW5zaWNodGJhcnxzaWNodGJhcnxuYW1lXVxuIik7CisgIGlmICghYXJnKQorICAgIHJldHVybiAwOworICBzd2l0Y2ggKGFyZykKKyAgeworICAgIGNhc2UgInVuc2ljaHRiYXIiIDoKKyAgICAgIFNldFByb3AoUF9TRUNPTkRfTUFSSywtMSk7CisgICAgICB3cml0ZSgiSmV0enQgc2llaHQga2VpbiBTcGllbGVyIG1laHIsIGRhc3MgRHUgZWluIFp3ZWl0aSBiaXN0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlICJzaWNodGJhciIgOgorICAgICAgU2V0UHJvcChQX1NFQ09ORF9NQVJLLDApOworICAgICAgd3JpdGUoIkpldHp0IHNpZWh0IGtlaW4gU3BpZWxlciBtZWhyLCB3ZXNzZW4gWndlaXRpIER1IGJpc3QuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgIm5hbWUiIDoKKyAgICAgIFNldFByb3AoUF9TRUNPTkRfTUFSSywxKTsKKyAgICAgIHdyaXRlKCJKZXR6dCBrb2VubmVuIGFsbGUgc2VoZW4sIHdlc3NlbiBad2VpdGkgRHUgYmlzdC5cbiIpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCB0b3BsaXN0ZShzdHJpbmcgYXJnKQoreworICAgIGlmICghYXJnKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJEdSBoYXN0IERpY2ggZnVlciBkaWUgVG9wbGlzdGUgJXMuXG4iLAorICAgICAgICAgICAgKFF1ZXJ5UHJvcChQX05PX1RPUExJU1QpID8gImdlc3BlcnJ0IiA6ICJmcmVpZ2VnZWJlbiIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKG1lbWJlcigoeyJqIiwiamEiLCJuIiwibmVpbiJ9KSxhcmcpPT0tMSkKKyAgICAgICAgcmV0dXJuIF9ub3RpZnlfZmFpbCgiU3ludGF4OiB0b3BsaXN0ZSBbamF8bmVpbl1cbiIpLDA7CisgICAgaWYgKGFyZ1swXT09J2onKQorICAgIHsKKyAgICAgICAgU2V0UHJvcChQX05PX1RPUExJU1QsMCk7CisgICAgICAgIHdyaXRlKCJEdSBrYW5uc3QgamV0enQgKHRoZW9yZXRpc2NoKSBpbiBkZXIgVG9wbGlzdGUgYXVmdGF1Y2hlbi5cbiIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBTZXRQcm9wKFBfTk9fVE9QTElTVCwxKTsKKyAgICAgICAgd3JpdGUoIkR1IHdpcnN0IGpldHp0IG5pY2h0IGluIGRlciBUb3BsaXN0ZSBhdWZ0YXVjaGVuLlxuIik7CisgICAgfQorICAgIFNldChQX05PX1RPUExJU1QsU0FWRXxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNob3dfdGVsbmVncyhzdHJpbmcgYXJnKQoreworICAgIGlmICghYXJnKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkR1IGJla29tbXN0IEFlbmRlcnVuZ2VuIERlaW5lciBGZW5zdGVyZ3JvZXNzZSAiKworICAgICAgICAgICAgICAoUXVlcnlQcm9wKFBfVFRZX1NIT1cpPyIiOiJuaWNodCAiKSsiYW5nZXplaWd0LlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAobWVtYmVyKCh7ImVpbiIsImFuIiwiYXVzIn0pLGFyZyk9PS0xKQorICAgIHsKKyAgICAgICAgd3JpdGUoIlN5bnRheDogdGVsbmVncyBbZWlufGF1c11cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGFyZz09ImVpbiIgfHwgYXJnPT0iYW4iKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkR1IGJla29tbXN0ICIrKFF1ZXJ5UHJvcChQX1RUWV9TSE9XKT8iIjoibnVuICIpKworICAgICAgICAgICAgICAiQWVuZGVydW5nZW4gRGVpbmVyIEZlbnN0ZXJncm9lc3NlIGFuZ2V6ZWlndC5cbiIpOworICAgICAgICBTZXQoUF9UVFlfU0hPVywxKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHdyaXRlKCJEdSBiZWtvbW1zdCAiKyhRdWVyeVByb3AoUF9UVFlfU0hPVyk/Im51biAiOiIiKSsKKyAgICAgICAgICAiQWVuZGVydW5nZW4gRGVpbmVyIEZlbnN0ZXJncm9lc3NlIG5pY2h0ICIrCisgICAgICAgICAgKFF1ZXJ5UHJvcChQX1RUWV9TSE9XKT8ibWVociAiOiIiKSsiYW5nZXplaWd0LlxuIik7CisgICAgU2V0KFBfVFRZX1NIT1csMCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IHNldF9rZWVwX2FsaXZlKHN0cmluZyBzdHIpIHsKKyAgaWYgKHN0ciA9PSAiZWluIikgeworICAgIHRlbG5ldF90bV9jb3VudGVyID0gMjQwIC8gX19IRUFSVF9CRUFUX0lOVEVSVkFMX187CisgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiQW4gRGVpbmVuIENsaWVudCB3ZXJkZW4gamV0enQgYWxsZSA0IE1pbnV0ZW4gdW5zaWNodGJhcmUgRGF0ZW4gIgorICAgICAgICAiZ2VzY2hpY2t0LCB1bSB6dSB2ZXJoaW5kZXJuLCBkYXNzIERlaW5lIFZlcmJpbmR1bmcgenVtICJNVUROQU1FCisgICAgICAgICIgYmVlbmRldCB3aXJkLiIsIDc4KSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyID09ICJhdXMiKSB7CisgICAgdGVsbmV0X3RtX2NvdW50ZXIgPSAwOworICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksYnJlYWtfc3RyaW5nKAorICAgICAgICAiRHUgaGFzdCBkYXMgU2VuZGVuIHZvbiB1bnNpY2h0YmFyZW4gRGF0ZW4gKEtlZXAtQWxpdmUtUGFrZXRlKSBhbiAiCisgICAgICAgICJEZWluZW4gQ2xpZW50IGF1c2dlc2NoYWx0ZXQuIiw3OCkpOworICB9CisgIGVsc2UgeworICAgIGlmICghdGVsbmV0X3RtX2NvdW50ZXIpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBicmVha19zdHJpbmcoCisgICAgICAgICJBbiBEZWluZW4gQ2xpZW50IHdlcmRlbiBrZWluZSBLZWVwLUFsaXZlLVBha2V0ZSBnZXNjaGlja3QuIiw3OCkpOworICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIGJyZWFrX3N0cmluZygKKyAgICAgICAgIkFuIERlaW5lbiBDbGllbnQgd2VyZGVuIGFsbGUgNCBNaW51dGVuICIgCisgICAgICAgICJ1bnNpY2h0YmFyZSBEYXRlbiBnZXNjaGlja3QsIGRhbWl0IERlaW5lIFZlcmJpbmR1bmcgIgorICAgICAgICAienVtICJNVUROQU1FIiBuaWNodCBiZWVuZGV0IHdpcmQuIiw3OCkpOworICB9CisgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBwcmludF90ZWxuZXRfcnR0aW1lKCkgeworICBpbnQgcnR0ID0gUXVlcnlQcm9wKFBfVEVMTkVUX1JUVElNRSk7CisgIGlmIChydHQ+MCkKKyAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKAorICAgICAgIkRpZSBsZXR6dGUgZ2VtZXNzZW5lICdyb3VuZC10cmlwJyBaZWl0IHZvbSBNRyB6dSBEZWluZW0gQ2xpZW50ICIKKyAgICAgICJ1bmQgenVydWVjayBiZXRydWcgIiArIHJ0dCArICIgdXMuIiw3OCkpOworICBlbHNlCisgICAgdGVsbF9vYmplY3QoTUUsIGJyZWFrX3N0cmluZygKKyAgICAgICJCaXNsYW5nIHd1cmRlIGRpZSAncm91bmQtdHJpcCcgWmVpdCB2b20gTUcgenUgRGVpbmVtIENsaWVudCAiCisgICAgICAibm9jaCBuaWNodCBnZW1lc3NlbiBvZGVyIERlaW4gQ2xpZW50IHVudGVyc3R1ZXR6dCBkaWVzZXMgIgorICAgICAgIm5pY2h0LiIsNzgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCB0ZWxuZXRfY21kKHN0cmluZyBzdHIpIHsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBzdHJpbmcgKmFyZ3MgPSBleHBsb2RlKHN0ciwgIiAiKTsKKyAgc3RyaW5nIG5ld2FyZ3M7CisgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgIG5ld2FyZ3MgPSBpbXBsb2RlKGFyZ3NbMS4uXSwgIiAiKTsKKyAgZWxzZQorICAgIG5ld2FyZ3MgPSAiIjsKKworICBzd2l0Y2goYXJnc1swXSkKKyAgeworICAgIGNhc2UgImtlZXBhbGl2ZSI6CisgICAgICByZXR1cm4gc2V0X2tlZXBfYWxpdmUobmV3YXJncyk7CisgICAgY2FzZSAicnR0aW1lIjoKKyAgICAgIHJldHVybiBwcmludF90ZWxuZXRfcnR0aW1lKCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBzcG90dGUoIHN0cmluZyBzdHIgKQoreworICAgIF9ub3RpZnlfZmFpbCggIkhpZXIgaXN0IG5pY2h0cywgd2FzIER1IHZlcnNwb3R0ZW4ga29lbm50ZXN0IVxuIiApOworICAgIHJldHVybiAwOworfQorCitpbnQgYmVoYWx0ZShzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2IsKm9iczsKKyAgc3RyaW5nIHM7CisKKyAgaWYgKHN0cikKKyAgeworICAgIGlmIChzdHI9PSJhbGxlcyIpIHsKKyAgICAgIGZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkoKSwgIlNldFByb3AiLCBQX0tFRVBfT05fU0VMTCwgZ2V0dWlkKCkpOworICAgICAgd3JpdGUoIk9rIVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHN0cj09Im5pY2h0cyIpIHsKKyAgICAgIGZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkoKSwgIlNldFByb3AiLCBQX0tFRVBfT05fU0VMTCwgMCk7CisgICAgICB3cml0ZSgiT2shXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIXNpemVvZihvYnM9ZmluZF9vYnMoc3RyLFBVVF9HRVRfTk9ORSkpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBzb3dhcyBoYXN0IER1IG5pY2h0IGRhYmVpIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBvYj1vYnNbMF07CisKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0tFRVBfT05fU0VMTCk9PWdldGV1aWQoTUUpKQorICAgICAgICBvYi0+U2V0UHJvcChQX0tFRVBfT05fU0VMTCwwKTsKKyAgICBlbHNlCisgICAgICAgIG9iLT5TZXRQcm9wKFBfS0VFUF9PTl9TRUxMLGdldGV1aWQoTUUpKTsKKworICAgIC8vIGVybmV1dCBhYmZyYWdlbiwgZGEgc2ljaCBkZXIgV2VydCBuaWNodCBnZWFlbmRlcnQgaGFiZW4gbXVzcworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfS0VFUF9PTl9TRUxMKT09Z2V0ZXVpZChNRSkpCisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZyhzcHJpbnRmKCJPaywgRHUgd2lyc3QgJXMgamV0enQgYmVpICd2ZXJrYXVmZSBhbGxlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVoYWx0ZW4uXG4iLG9iLT5uYW1lKFdFTikpLDc4KSk7CisgICAgZWxzZQorICAgICAgICB3cml0ZShicmVha19zdHJpbmcoc3ByaW50ZigiT2ssIER1IHdpcnN0ICVzIGJlaW0gbmFlY2hzdGVuICd2ZXJrYXVmZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGxlcycgbWl0dmVya2F1ZmVuIVxuIixvYi0+bmFtZShXRU4pKSw3OCkpOworCisgICAgcmV0dXJuIDE7CisgIH0KKyAgcz1tYWtlX2ludmxpc3QoTUUsZmlsdGVyKGFsbF9pbnZlbnRvcnkoTUUpLCMnX2NoZWNrX2tlZXApKTsgLy8nKSk7CisgIE1vcmUocyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9xdWVyeV9sZXAoKQoreworICBpbnQgdmFsOworICB2YWwgPSBMRVBNQVNURVItPlF1ZXJ5TEVQKCk7CisgIFNldCggUF9MRVAsIHZhbCApOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgbWl4ZWQgX3NldF9mcmF0ZXJuaXRhc2Rvbm9hcmNobWFnb3J1bShtaXhlZCBhcmcpCit7CisgIGlmICghaW50cChhcmcpKSByZXR1cm4gLTE7CisKKyAgaWYgKCghcHJldmlvdXNfb2JqZWN0KDEpfHxvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoMSkpIT1GQU9fTUFTVEVSKSAmJiAKKyAgICAgICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoIWludHAoYXJnKSkgcmV0dXJuIC0xOworCisgIGxvZ19maWxlKCJmYW8vUF9GQU8iLHNwcmludGYoIiVzIC0gJXMgUF9GQU8gZ2VzZXR6dCBhdWYgJU9cbiIsCisgICAgICAgIGR0aW1lKHRpbWUoKSkscXVlcnlfcmVhbF9uYW1lKCksYXJnKSApOworICByZXR1cm4gU2V0KFBfRkFPLGFyZyk7Cit9CisKK25vbWFzayB2b2lkIHNldF9yZWFsaXAoc3RyaW5nIHN0cikKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCkgJiYgc3Ryc3RyKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiL3NlY3VyZSIpPT0wKQorICB7CisgICAgcmVhbGlwPXN0cjsKKyAgfQorfQorCitub21hc2sgc3RyaW5nIHF1ZXJ5X3JlYWxpcCgpCit7CisgIHJldHVybiByZWFsaXAgPyByZWFsaXAgOiAiIjsKK30KKworbWl4ZWQgX3F1ZXJ5X25ldGRlYWRfZW52KCkgeworICAgICAgICByZXR1cm4gbmRlYWRfbG9jYXRpb24gfHwgbmRlYWRfbF9maWxlbmFtZTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY2hhbm5lbC5jIGIvc3RkL3BsYXllci9jaGFubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY4NTEyYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvY2hhbm5lbC5jCkBAIC0wLDAgKzEsNTc5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gY2hhbm5lbC5jIC0tIGNoYW5uZWwgY2xpZW50CisvLworLy8gJElkOiBjaGFubmVsLmMgOTQwNCAyMDE1LTEyLTEzIDAwOjIxOjQ0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx1dGlsLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZ21jcC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKyNpbmNsdWRlIDxyZWdleHAuaD4KKworI2RlZmluZSBQX1NXQVBfQ0hBTk5FTFMgICJzd2FwX2NoYW5uZWxzIgorI2RlZmluZSBQX0NIQU5ORUxfU0hPUlQgICJzaG9ydF9jaGFubmVscyIKKworI2RlZmluZSBDSEFOTkVMQ01EUyAgICAgICJbI0AlJCYoKTw+YS16QS1aMC05XFwtXSIKKworI2RlZmluZSBERUZBVUxUX0NIQU5ORUxTICh7IkFiZW50ZXVlciIsICJBbmZhZW5nZXIiLCJHcmF0cyIsIlRvZCIsICJaVCJ9KQorI2RlZmluZSBERUZBVUxUX1NIT1JUQ1VUUyBcCisoWyAgICAgICAgICAgICAgICAgICAgIFwKKyAiYiI6IkFiZW50ZXVlciIsICAgICAgXAorICJhIjoiQWxsZ2VtZWluIiwgICAgICBcCisgIkIiOiJCZWlsZWlkIiwgICAgICAgIFwKKyAicSI6IkQtY2hhdCIsICAgICAgICAgXAorICJHIjoiR3JhdHMiLCAgICAgICAgICBcCisgIk0iOiJNb2VyZGVyIiwgICAgICAgIFwKKyAiaCI6IlNlaGVyIiwgICAgICAgICAgXAorICJUIjoiVG9kIiwgICAgICAgICAgICBcCitdKQorCisjZGVmaW5lIFdJWkFSRF9TSE9SVENVVFMgXAorKFsgICAgICAgICAgICAgICAgICAgICBcCisgIlAiOiJELWNvZGUiLCAgICAgICAgIFwKKyAiRCI6IkRlYnVnIiwgICAgICAgICAgXAorICJPIjoiSW50ZXJjb2RlIiwgICAgICBcCisgIkkiOiJJbnRlcm11ZCIsICAgICAgIFwKKyAibSI6Ik1hZ2llciIsICAgICAgICAgXAorXSkKKworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHNob3J0Y3V0OworcHJpdmF0ZSBub3NhdmUgaW50IGNfc3RhdHVzOworCit2b2lkIGNyZWF0ZSgpCit7CisgIFNldChQX0NIQU5ORUxTLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9DSEFOTkVMUywgREVGQVVMVF9DSEFOTkVMUyk7CisgIFNldChQX1NXQVBfQ0hBTk5FTFMsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX1NURF9DSEFOTkVMLCAiQWxsZ2VtZWluIik7CisgIFNldChQX1NURF9DSEFOTkVMLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9DSEFOTkVMX1NIT1JULCBTQVZFLCBGX01PREUpOworICBTZXQoUF9DSEFOTkVMX1NIT1JULCBERUZBVUxUX1NIT1JUQ1VUUworICAgICAgKyAoSVNfTEVBUk5FUih0aGlzX29iamVjdCgpKSA/IFdJWkFSRF9TSE9SVENVVFMgOiAoW10pKSk7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7KHsiLSIsIkNoYW5uZWxQYXJzZXIiLCAxLCAwfSksCisgICAgICAgICAgICh7ImViZW5lIiwgIkNoYW5uZWxBZG1pbiIsIDAsIDB9KSwKKyAgICAgICAgICAgKHsiZWJlbmVuIiwgIkNoYW5uZWxBZG1pbiIsIDEsIDB9KSwKKyAgICAgICAgIH0pOworfQorCittaXhlZCBSZWdpc3RlckNoYW5uZWxzKCkKK3sKKyAgbWl4ZWQgZXJyOworICBpZihleHRlcm5fY2FsbCgpICYmCisgICAgIHByZXZpb3VzX29iamVjdCgpICE9IGZpbmRfb2JqZWN0KENITUFTVEVSKSkgcmV0dXJuOworICBjX3N0YXR1cyA9IDA7CisgIHNob3J0Y3V0ID0gUXVlcnlQcm9wKFBfQ0hBTk5FTF9TSE9SVCk7CisgIFNldFByb3AoUF9DSEFOTkVMUywgbWFwKFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSB8fCAoe30pLAorCSMnbG93ZXJfY2FzZSkpOworICBlcnIgPSBmaWx0ZXIoUXVlcnlQcm9wKFBfQ0hBTk5FTFMpLAorICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCJqb2luIiwgQ0hNQVNURVIpLAorICAgICAgICAgdGhpc19vYmplY3QoKSk7CisgIGlmKFF1ZXJ5UHJvcChQX0xFVkVMKSA8IDUpIHJldHVybiBlcnI7CisgIHdoaWxlKHNpemVvZihlcnIpKSB7CisgICAgQ0hNQVNURVItPm5ldyhlcnJbMF0sIHRoaXNfb2JqZWN0KCkpOworICAgIGVyclswLi4wXSA9ICh7fSk7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworbWl4ZWQgUmVtb3ZlQ2hhbm5lbHMoKQoreworICBjbG9zdXJlIGNsOworICBtaXhlZCBlcnI9KHt9KTsKKyAgaWYoZXh0ZXJuX2NhbGwoKSAmJgorICAgICBwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChDSE1BU1RFUikpIHJldHVybjsKKyAgaWYoIWNfc3RhdHVzKSBjX3N0YXR1cyA9IDE7CisgIGVsc2UgcmV0dXJuICh7fSk7CisgIGNsPXN5bWJvbF9mdW5jdGlvbigibGVhdmUiLCBDSE1BU1RFUik7CisgIGlmIChjbG9zdXJlcChjbCkpIHsKKyAgICAgIGVyciA9IGZpbHRlcihRdWVyeVByb3AoUF9DSEFOTkVMUyksIGNsLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpIC0gZXJyKTsKKyAgfQorICByZXR1cm4gZXJyOworfQorCit2YXJhcmdzIHByaXZhdGUgc3RyaW5nIGdldE5hbWUobWl4ZWQgeCwgaW50IGZhbGwpIHsKKyAgCisgIG1peGVkIG8gPSBjbG9zdXJlcCh4KSA/IHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KHgpIDogeDsKKyAgaWYoc3RyaW5ncChvKSAmJiBzaXplb2YobykgJiYgKHggPSBmaW5kX29iamVjdChvKSkpIAorICAgIG8gPSB4OworICAKKyAgLy8gT2JqZWt0ZQorICBpZiAob2JqZWN0cChvKSkgeworICAgIC8vIE1hZ2llciBzZWhlbiB1bnNpY2h0YmFyZSBuaWNodCBudXIgYWxzICJKZW1hbmQiCisgICAgaWYgKG8tPlF1ZXJ5UHJvcChQX0lOVklTKSAmJiBJU19MRUFSTklORyh0aGlzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAiKCIrY2FwaXRhbGl6ZShnZXR1aWQobykpKyIpIjsKKyAgICAvLyBGcm9lc2NoZSBtaXQgTmFtZW4gdmVyc29yZ2VuLgorICAgIGlmIChvLT5RdWVyeVByb3AoUF9GUk9HKSkKKyAgICAgIHJldHVybiAiRnJvc2NoICIrY2FwaXRhbGl6ZShnZXR1aWQobykpOworICAgIC8vIERlZmF1bHQgKFVuc2ljaHRiYXJlIGFscyAiSmVtYW5kIiAocy4gTmFtZSgpKSkKKyAgICByZXR1cm4gby0+TmFtZShmYWxsLCAyKXx8IjxVbmJla2FubnQ+IjsKKyAgfQorICAvLyBTdHJpbmdzCisgIGVsc2UgaWYgKHN0cmluZ3AobykgJiYgc2l6ZW9mKG8pKSB7CisgICAgaWYgKG9bMF0gPT0gJy8nKSB7CisgICAgICAvLyB1bnNpY2h0YmFyZSBPYmpla3RlLi4uCisgICAgICBpbnQgcCA9IHN0cnN0cihvLCAiJCIpOworICAgICAgaWYgKHAgIT0gLTEpIHsKKwkvLyBNYWdpZXIgaW0gTWFnaWVybW9kdXMga3JpZWdlbiBkZW4gUmVhbG5hbWVuLCBhbmRlcmUgbmljaHQuCisJaWYgKElTX0xFQVJOSU5HKHRoaXNfb2JqZWN0KCkpKQorCSAgcmV0dXJuIG9bMS4ucC0xXTsKKwllbHNlCisJICByZXR1cm4gb1twKzEuLl07CisgICAgICB9CisgICAgICBlbHNlCisJLy8gZG9jaCBuaWNodCB1bnNpY2h0YmFyCisJcmV0dXJuIChmYWxsID09IFdFU1NFTiA/IG8rInMiIDogbyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIC8vIG5pY2h0IHVuc2ljaHRiYXIKKyAgICAgIHJldHVybiAoZmFsbCA9PSBXRVNTRU4gPyBvKyJzIiA6IG8pOworICB9CisgIC8vIEZhbGwtdGhyb3VnaAorICByZXR1cm4gIjxVbmJla2FubnQ+IjsKK30KKworLy8gPG5vbmludD4gdW50ZXJkcnVlY2t0IGRpZSBBVXNnYWJlIGFuIGRlbiBTcGllbGVyIHVuZCBsaWVmZXJ0IGRlbiBUZXh0CisvLyB6dXJ1ZWNrLiBXaXJkIG51ciBmdWVyIGRpZSBFYmVuZW5oaXN0b3J5IGJlbnV0enQuIAorc3RyaW5nIENoYW5uZWxNZXNzYWdlKG1peGVkKiBtc2csIGludCBub25pbnQpCit7CisgIHN0cmluZyBjaGFubmVsX21lc3NhZ2U7CisgIHN0cmluZyBjaGFubmVsPW1zZ1swXTsKKyAgb2JqZWN0IHNlbmRlcj1tc2dbMV07CisgIHN0cmluZyBtZXNzYWdlPW1zZ1syXTsKKyAgaW50IG1zZ190eXBlID0gbXNnWzNdOworCisgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgIT0gZmluZF9vYmplY3QoQ0hNQVNURVIpICYmCisgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgIT0gTUUgKQorICAgICAgcmV0dXJuIDA7CisKKyAgc3RyaW5nIHNlbmRlcl9uYW1lID0gZ2V0TmFtZShzZW5kZXIsIG1zZ190eXBlID09IE1TR19HRU1PVEUgPyBXRVNTRU4gOiBXRVIpOworICBpbnQgcHJlcGVuZF9pbmRlbnRfZmxhZz1RdWVyeVByb3AoUF9NRVNTQUdFX1BSRVBFTkQpID8gQlNfUFJFUEVORF9JTkRFTlQgOiAwOworICBzd2l0Y2gobXNnX3R5cGUpIHsKKyAgY2FzZSBNU0dfRU1QVFk6CisgICAgY2hhbm5lbF9tZXNzYWdlPSBtZXNzYWdlKyJcbiI7CisgICAgYnJlYWs7CisgIGNhc2UgTVNHX0dFTU9URToKKyAgY2FzZSBNU0dfRU1PVEU6CisgICAgY2hhbm5lbF9tZXNzYWdlID0gYnJlYWtfc3RyaW5nKHNlbmRlcl9uYW1lICsgIiAiKyBtZXNzYWdlKyJdIiwKKyAgICAgICAgICAgICAgICAgICA3OCwgc3ByaW50ZigiWyVzOiIsIGNoYW5uZWwpLAorICAgICAgICAgICAgICAgICAgIEJTX0lOREVOVF9PTkNFfHByZXBlbmRfaW5kZW50X2ZsYWcpOworICAgIGJyZWFrOworICBjYXNlIE1TR19TQVk6CisgIGRlZmF1bHQ6CisgICAgc3RyaW5nIHByZXNheT1zcHJpbnRmKCJbJXM6JXNdICIsIGNoYW5uZWwsIHNlbmRlcl9uYW1lKTsKKyAgICBjaGFubmVsX21lc3NhZ2UgPSBicmVha19zdHJpbmcobWVzc2FnZSwgbWF4KDc4LHNpemVvZihwcmVzYXkpKzEwKSwKKyAgICAgICAgICAgICAgICAgICBwcmVzYXksIHByZXBlbmRfaW5kZW50X2ZsYWcpOworICAgIGJyZWFrOworICB9CisgIGlmKG5vbmludCkKKyAgICByZXR1cm4gY2hhbm5lbF9tZXNzYWdlOworCisgIC8vIFdlbm4gR01DUCBzaWNoIHVtIFVlYmVydHJhZ3VuZyBkZXIgTmFjaHJpY2h0IGt1ZW1tZXJ0LCB3aXJkIFJlY2VpdmVNc2coKQorICAvLyBuaWNodCBtZWhyIGF1ZmdlcnVmZW4uCisgIGlmIChHTUNQX0NoYW5uZWwoY2hhbm5lbF9tZXNzYWdlLCBjaGFubmVsLCBzZW5kZXJfbmFtZSkgIT0gMSkKKyAgeworICAgIC8vIERlciBFYmVuZW5uYW1lIG11c3MgaW4gS2xlaW5idWNoc3RhYmVuIHVlYmVyZ2ViZW4gd2VyZGVuLCBkYW1pdCBkaWUKKyAgICAvLyBJZ25vcmllcmVwcnVlZnVuZyBmdW5rdGlvbmllcnQuIERpZSBpZ25vcmllcmVzdHJpbmdzIHNpbmQgbmFlbWxpY2ggYWxsZQorICAgIC8vIGtsZWluZ2VzY2hyaWViZW4uCisgICAgUmVjZWl2ZU1zZyhjaGFubmVsX21lc3NhZ2UsIAorICAgICAgICAgICAgICAgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfU1RPUkV8TVNHX0RPTlRfV1JBUCwKKyAgICAgICAgICAgICAgIE1BX0NIQU5ORUwiLiIgKyBsb3dlcl9jYXNlKGNoYW5uZWwpLCAwLCBzZW5kZXIpOworICB9CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHZvaWQgY3JlYXRlTGlzdChzdHJpbmcgbiwgbWl4ZWQgYSwgbWl4ZWQgbSwgbWl4ZWQgbCkKK3sKKyAgaW50IHBvczsgc3RyaW5nIHNoLCAqbWVtOworICBpZigocG9zID0gbWVtYmVyKG1hcChtX3ZhbHVlcyhzaG9ydGN1dCksICMnbG93ZXJfY2FzZS8qJyovKSwgbikpICE9IC0xKQorICAgIHNoID0gbV9pbmRpY2VzKHNob3J0Y3V0KVtwb3NdOworICBlbHNlIHNoID0gIiI7CisgIG1lbT1tYXAoYVtJX01FTUJFUl0sIydnZXROYW1lLyonKi8sIFdFUik7CisgIG1lbS09KHsiPE1hc3RlUj4ifSk7CisgIGwgKz0gKHsgc3ByaW50ZigiJS0xMi4xMicuJ3MgJWNbJS0xLjFzXSAlfDEyLjEyJyAncyAoJS18MycgJ2QpICUtNDIuNDJzXG4iLAorICAgICAgICAgICAgICAgICAgYVtJX05BTUVdLCAobWVtYmVyKG0sIG4pICE9IC0xID8gJyonIDogJyAnKSwgc2gsCisgICAgICAgICAgICAgICAgICBhW0lfTUFTVEVSXSA/CisgICAgICAgICAgICAgICAgICBnZXROYW1lKGFbSV9NQVNURVJdKSA6IGdldE5hbWUoYVtJX0FDQ0VTU10pLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lbSksCisgICAgICAgICAgICAoY2xvc3VyZXAoYVtJX0lORk9dKSAmJiBvYmplY3RwKHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGFbSV9JTkZPXSkpKSA/CisgICAgICAgICAgICAgICAgICBmdW5jYWxsKGFbSV9JTkZPXSkgfHwgIi0gS2VpbmUgQmVzY2hyZWlidW5nIC0iIDoKKyAgICAgICAgICAgICAgICAgIChzdHJpbmdwKGFbSV9JTkZPXSkgPyBhW0lfSU5GT10gOiAiLSBLZWluZSBCZXNjaHJlaWJ1bmcgLSIpCisgICAgICAgICkgfSk7Cit9CisKK3ByaXZhdGUgbWl4ZWQgZ2V0Q2hhbm5lbChzdHJpbmcgY2gpCit7CisgIG1peGVkIGZmOworICBpZighc2l6ZW9mKGNoKSkgY2ggPSBRdWVyeVByb3AoUF9TVERfQ0hBTk5FTCk7CisgIGlmKHNob3J0Y3V0ICYmIHNob3J0Y3V0W2NoXSkgY2ggPSBzaG9ydGN1dFtjaF07CisgIHJldHVybiBDSE1BU1RFUi0+ZmluZChjaCwgdGhpc19vYmplY3QoKSk7Cit9CisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgICAgICAgIGlmIChmdW5jYWxsKHN5bWJvbF9mdW5jdGlvbignZmluZF9wbGF5ZXIpLCJ6ZXNzdHJhIikpXAorICAgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSxcCisJICAgICAgICAgICAgICAiTURCRzogIit4KyJcbiIpCisjZW5kaWYKK2ludCBDaGFubmVsUGFyc2VyKHN0cmluZyBhcmdzKQoreworICBtaXhlZCBjaCwgY21kLCB0bXA7CisgIGludCBwb3MsIHR5cGUsIGVycjsKKyAgc3RyaW5nIHR4dDsKKyAgY21kID0gcXVlcnlfdmVyYigpOworICBhcmdzID0gX3VucGFyc2VkX2FyZ3MoKTsKKyAgbm90aWZ5X2ZhaWwoIkJlbnV0enVuZzogLTxFYmVuZT5bIF1bJ3w6fDtdPFRleHQ+XG4iCisgICAgICAgICAgICAgICIgICAgICAgICAgIC08RWJlbmU+Wyt8LXw/fCF8Kl1cbiIKKyAgICAgICAgICAgICAgIiAgICAgICAgICAgLT9cbiIpOworICBpZighY21kICYmICFhcmdzKSByZXR1cm4gMDsKKyAgaWYoIWFyZ3MpIGFyZ3MgPSAiIjsKKyAgY21kID0gY21kWzEuLl07CisgIGlmKHNpemVvZihjbWQgPSByZWdleHBsb2RlKGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4iIENIQU5ORUxDTURTICIqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFsrLV18XFwhfFxcP3xcXCopKiIpKSA+IDEpCisgIHsKKyAgICAvL3ouQi4gY21kPSAoeyIiLCJhbGxnZW1laW4iLCI6dGVzdGV0In0pCisgICAgaWYoc2l6ZW9mKGNtZFsxXSkgPiAxICYmCisgICAgICAgc3Ryc3RyKCIrLT8hKiIsIGNtZFsxXVs8MS4uPDFdKSA+IC0xKQorICAgICAgdG1wID0gY21kWzFdWzAuLjwyXTsKKyAgICBlbHNlCisgICAgICB0bXAgPSBjbWRbMV07CisgICAgaWYoY21kWzFdICE9ICI/IiAmJiBjbWRbMV0gIT0gIiEiKQorICAgICAgaWYocG9pbnRlcnAoY2ggPSBnZXRDaGFubmVsKHRtcCkpKQorICAgICAgeworICAgICAgICBub3RpZnlfZmFpbCgiRGllc2UgQW5nYWJlIHdhciBuaWNodCBlaW5kZXV0aWchICIKKyAgICAgICAgICAgICAgICAgICAgIkZvbGdlbmRlIEViZW5lbiBwYXNzZW46XG4iCisgICAgICAgICAgICAgICAgICAgICtpbXBsb2RlKGNoLCAiLCAiKSsiXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjaCkgcmV0dXJuIChub3RpZnlfZmFpbCgiRGllIEViZW5lICciK3RtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyInIGdpYnQgZXMgbmljaHQhXG4iKSwgMCk7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJDaGFuQ21kOiAlT1xuIixjbWQpKTsKKyAgICBpZiAoc2l6ZW9mKGNtZFsxXSkpIHsKKyAgICAgIHN3aXRjaChjbWRbMV1bPDFdKSB7CisgICAgY2FzZSAnKyc6CisgICAgICBzd2l0Y2goQ0hNQVNURVItPmpvaW4oY2gsIHRoaXNfb2JqZWN0KCkpKQorICAgICAgeworICAgICAgY2FzZSBFX0FDQ0VTU19ERU5JRUQ6CisgICAgICAgIG5vdGlmeV9mYWlsKCJEdSBkYXJmc3QgYW4gZGllIEViZW5lICciK2NoKyInIG5pY2h0IGhlcmFuLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgY2FzZSBFX0FMUkVBRFlfSk9JTkVEOgorICAgICAgICBub3RpZnlfZmFpbCgiRHUgaGFzdCBkaWVzZSBFYmVuZSBzY2hvbiBiZXRyZXRlbiFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgICAgd3JpdGUoIkR1IGJldHJpdHRzdCBkaWUgRWJlbmUgJyIrY2grIicuXG4iKTsKKyAgICAgIGlmKG1lbWJlcihRdWVyeVByb3AoUF9DSEFOTkVMUyksIGNoID0gbG93ZXJfY2FzZShjaCkpID09IC0xKQorICAgICAgICBTZXRQcm9wKFBfQ0hBTk5FTFMsIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSArICh7IGNoIH0pKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgJy0nOgorICAgICAgc3dpdGNoKENITUFTVEVSLT5sZWF2ZShjaCwgdGhpc19vYmplY3QoKSkpCisgICAgICB7CisgICAgICBjYXNlIEVfQUNDRVNTX0RFTklFRDoKKyAgICAgICAgd3JpdGUoIkR1IGthbm5zdCBkaWUgRWJlbmUgJyIrY2grIicgbmljaHQgdmVybGFzc2VuLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBFX05PVF9NRU1CRVI6CisgICAgICAgIHdyaXRlKCJXaWUgd2lsbHN0IER1IGVpbmUgRWJlbmUgdmVybGFzc2VuLCB3ZWxjaGUgRHUgbmljaHQgIgorICAgICAgICAgICAgICAiYmV0cmV0ZW4gaGFzdD9cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHdyaXRlKCJEdSB2ZXJsYWVzc3QgZGllIEViZW5lICciK2NoKyInLlxuIik7CisgICAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfQ0hBTk5FTFMpIC0gKHsgbG93ZXJfY2FzZShjaCksIGNoIH0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlICchJzoKKyAgICBjYXNlICc/JzoKKyAgICB7CisgICAgICBtYXBwaW5nIGw7CisgICAgICBpZihtYXBwaW5ncChsID0gQ0hNQVNURVItPmxpc3QodGhpc19vYmplY3QoKSkpKQorICAgICAgICBpZihzdHJpbmdwKGNoKSAmJiBzaXplb2YoY2gpICYmIHBvaW50ZXJwKGxbY2ggPSBsb3dlcl9jYXNlKGNoKV0pKQorICAgICAgICB7CisgICAgICAgICAgaW50IGM7IG9iamVjdCBvOyBzdHJpbmcgbjsgc3RyaW5nICptOworICAgICAgICAgIG09c29ydF9hcnJheShtYXAobFtjaF1bSV9NRU1CRVJdLCMnZ2V0TmFtZS8qJyovLCBXRVIpLCMnPi8qJyovKTsKKyAgICAgICAgICBtLT0oeyI8TWFzdGVSPiJ9KTsKKyAgICAgICAgICB3cml0ZShsW2NoXVtJX05BTUVdKyIsICIrZnVuY2FsbChsW2NoXVtJX0lORk9dKSsiLlxuIik7CisgICAgICAgICAgd3JpdGUoIkR1IHNpZWhzdCAiKygoYyA9IHNpemVvZihtKSkgPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChjID09IDEgPyAiZWluIEdlc2ljaHQiIDogYysiIEdlc2ljaHRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJuaWVtYW5kZW4iKSsiIGF1ZiBkZXIgRWJlbmUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2xbY2hdW0lfTkFNRV0rIic6XG4iKTsKKyAgICAgICAgICB3cml0ZShicmVha19zdHJpbmcoaW1wbG9kZShtLCIsICIpLCA3OCkpOworICAgICAgICAgIHdyaXRlKChsW2NoXVtJX01BU1RFUl0gPworICAgICAgICAgICAgICAgICBnZXROYW1lKGxbY2hdW0lfTUFTVEVSXSkgOiBnZXROYW1lKGxbY2hdW0lfQUNDRVNTXSwgV0VSKSkKKyAgICAgICAgICAgICAgICArIiBoYXQgZGFzIFNhZ2VuIGF1ZiBkaWVzZXIgRWJlbmUuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBtaXhlZCBsaXN0OyBsaXN0ID0gKHt9KTsKKyAgICAgICAgICBpZihjbWRbMV1bPDFdID09ICchJykKKyAgICAgICAgICAgIGwgLT0gbWttYXBwaW5nKG1faW5kaWNlcyhsKSAtIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSk7CisgICAgICAgICAgd2Fsa19tYXBwaW5nKGwsICMnY3JlYXRlTGlzdC8qJyovLCBRdWVyeVByb3AoUF9DSEFOTkVMUyksICZsaXN0KTsKKyAgICAgICAgICBsaXN0ID0gc29ydF9hcnJheShsaXN0LCAjJz4vKicqLyk7CisgICAgICAgICAgdHh0ID0gc3ByaW50ZigiJS0xMi4xMicgJ3MgIFtBXSAlfDEyJyAncyAoJS0zJyAncykgJS00Mi40MnNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZSIsICJFaWduZXIiLCAiU3AiLCAiQmVzY2hyZWlidW5nIikKKyAgICAgICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgICAgKyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAgICAgICAgICAgKyBpbXBsb2RlKGxpc3QsICIiKTsKKyAgICAgICAgICBNb3JlKHR4dCk7CisgICAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBjYXNlICcqJzoKKyAgICB7CisgICAgICBtaXhlZCBoaXN0OyBpbnQgYW1vdW50OworICAgICAgaWYoIXBvaW50ZXJwKGhpc3QgPSBDSE1BU1RFUi0+aGlzdG9yeShjaCwgdGhpc19vYmplY3QoKSkpIAorCQkgICAgICB8fCAhc2l6ZW9mKGhpc3QpKQorICAgICAgeworICAgICAgICB3cml0ZSgiRXMgaXN0IGtlaW5lIEdlc2NoaWNodGUgZnVlciAnIitjaCsiJyB2ZXJmdWVnYmFyLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgCisgICAgICAvLyhaZXNzdHJhKSBjbWQgaGF0IG9mZmVuYmFyIGltbWVyIDMgRWxlbWVudGUuLi4KKyAgICAgIC8vYmVpIC1hbGwqICh7IiIsImFsbCoiLCIifSkKKyAgICAgIC8vYmVpIC1hbGwqMTAgKHsiIiwiYWxsKiwiMTAifSkKKyAgICAgIC8vYWxzbyBpc3QgYmVpIC1hbGwqIGFtb3VudCBpbW1lciA9PSAwIHVuZCBlcyBmdW5rdGlvbmllcnQgZWhlciB6dWZhZWxsaWcuCisgICAgICAvKmlmKHNpemVvZihjbWQpID4gMikgCisgICAgICAgIGFtb3VudCA9IHRvX2ludChjbWRbMl0pOworICAgICAgZWxzZSAKKyAgICAgICAgYW1vdW50PXNpemVvZihoaXN0KTsqLworICAgICAgYW1vdW50PXRvX2ludChjbWRbMl0pOworICAgICAgaWYgKGFtb3VudCA8PSAwIHx8IGFtb3VudCA+PSBzaXplb2YoaGlzdCkpCisgICAgICAgIGFtb3VudD1zaXplb2YoaGlzdCk7CisKKyAgICAgIHR4dCA9ICJGb2xnZW5kZXMgaXN0IGF1ZiAnIitjaCsiJyBwYXNzaWVydDpcbiIKKyAgICAgICAgICArIGltcGxvZGUobWFwKGhpc3RbPGFtb3VudC4uXSwgIydDaGFubmVsTWVzc2FnZS8qJyovLCAxKSwgIiIpOworICAgICAgTW9yZSh0eHQpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICB9CisgIGlmKHNpemVvZihjbWQgPSBpbXBsb2RlKGNtZFsyLi5dLCAiIikpKQorICAgICBhcmdzID0gY21kICsgKHNpemVvZihhcmdzKSA/ICIgIiA6ICIiKSArIGFyZ3M7CisKKyAgLy8gS09udHJvbGxjaGFycyBhdXNmaWx0ZXJuLgorICBhcmdzID0gcmVncmVwbGFjZShhcmdzLCJbWzpjbnRybDpdXSIsIiIsUkVfUENSRXxSRV9HTE9CQUwpOworICBpZighc2l6ZW9mKGFyZ3MpKSByZXR1cm4gMDsKKworICAvL1dlbm4gY21kIGxlZXIgaXN0OiBNU0dfU0FZCisgIGlmICghc2l6ZW9mKGNtZCkpIHR5cGU9TVNHX1NBWTsKKyAgZWxzZSB7CisgICAgc3dpdGNoKGNtZFswXSkKKyAgICB7CisgICAgY2FzZSAnOicgOgorICAgICAgdHlwZSA9IE1TR19FTU9URTsKKyAgICAgIGFyZ3MgPSBhcmdzWzEuLl07CisgICAgICBicmVhazsKKyAgICBjYXNlICc7JyA6CisgICAgICB0eXBlID0gTVNHX0dFTU9URTsKKyAgICAgIGFyZ3MgPSBhcmdzWzEuLl07CisgICAgICBicmVhazsKKyAgICBjYXNlICdcJyc6CisgICAgICBhcmdzID0gYXJnc1sxLi5dOworICAgIGRlZmF1bHQgIDogdHlwZSA9IE1TR19TQVk7IGJyZWFrOworICAgIH0KKyAgfQorICBpZighY2ggfHwgIXNpemVvZihjaCkpIGNoID0gUXVlcnlQcm9wKFBfU1REX0NIQU5ORUwpOworICBpZigoZXJyID0gQ0hNQVNURVItPnNlbmQoY2gsIHRoaXNfb2JqZWN0KCksIGFyZ3MsIHR5cGUpKSA8IDApCisgICAgaWYoIShlcnIgPSBDSE1BU1RFUi0+am9pbihjaCwgdGhpc19vYmplY3QoKSkpKQorICAgIHsKKyAgICAgIGlmKG1lbWJlcihRdWVyeVByb3AoUF9DSEFOTkVMUyksIGNoID0gbG93ZXJfY2FzZShjaCkpID09IC0xKQorICAgICAgICBTZXRQcm9wKFBfQ0hBTk5FTFMsIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSArICh7IGNoIH0pKTsKKyAgICAgIGVyciA9IENITUFTVEVSLT5zZW5kKGNoLCB0aGlzX29iamVjdCgpLCBhcmdzLCB0eXBlKTsKKyAgICB9CisKKyAgc3dpdGNoKGVycikKKyAgeworICBjYXNlIEVfQUNDRVNTX0RFTklFRDoKKyAgICBub3RpZnlfZmFpbCgiQXVmIGRlciBFYmVuZSAnIitjaCsiJyBkYXJmc3QgRHUgbmljaHRzIHNhZ2VuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgRV9OT1RfTUVNQkVSOgorICAgIG5vdGlmeV9mYWlsKCJEdSBoYXN0IGRpZSBFYmVuZSAnIitjaCsiJyBuaWNodCBiZXRyZXRlbiFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgQ2hhbm5lbEFkbWluKHN0cmluZyBhcmdzKQoreworICBzdHJpbmcgbiwgZGVzY3IsIHNoLCBjbjsKKyAgbWl4ZWQgcGEsIHRtcDsKKyAgYXJncyA9IF91bnBhcnNlZF9hcmdzKCk7CisgIG5vdGlmeV9mYWlsKCJCZW51dHp1bmc6IGViZW5lIDxBYmt1ZXJ6dW5nPj08RWJlbmU+XG4iCisgICAgICAgICAgICAgICIgICAgICAgICAgIGViZW5lIDxBYmt1ZXJ6dW5nPj1cbiIKKyAgICAgICAgICAgICAgIiAgICAgICAgICAgZWJlbmUgYWJrdWVyenVuZ2VuIFtzdGFuZGFyZF1cbiIKKyAgICAgICAgICAgICAgIiAgICAgICAgICAgZWJlbmUgc3RhbmRhcmQgPEViZW5lPlxuIgorICAgICAgICAgICAgICAiICAgICAgICAgICBlYmVuZSBhbnxlaW58YXVzXG4iCisgICAgICAgICAgICAgICsoUXVlcnlQcm9wKFBfTEVWRUwpID49IDUgPworICAgICAgICAgICAgICAgICIgICAgICAgICAgIGViZW5lIG5ldSA8TmFtZT4gPEJlemVpY2hudW5nPlxuIgorICAgICIgICAgICAgICAgIGViZW5lIGJlc2NocmVpYnVuZyA8TmFtZT4gPEJlc2NocmVpYnVuZz5cbiIgOiAiIikKKyAgICAgICAgKyhJU19BUkNIKHRoaXNfb2JqZWN0KCkpID8KKyAgICAgICAgICAiICAgICAgICAgICBlYmVuZSBraWxsIDxOYW1lPlxuIgorCSAgIiAgICAgICAgICAgZWJlbmUgY2xlYXIgPE5hbWU+XG4iOiAiIikpOworICBpZighYXJncyB8fCAhc2l6ZW9mKGFyZ3MpKSByZXR1cm4gMDsKKyAgaWYoc3NjYW5mKGFyZ3MsICJraWxsICVzIiwgbikgJiYgSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIGlmKCEoY24gPSBDSE1BU1RFUi0+ZmluZChuLCB0aGlzX29iamVjdCgpKSkpIGNuID0gbjsKKyAgICBzd2l0Y2goQ0hNQVNURVItPnJlbW92ZShjbiwgdGhpc19vYmplY3QoKSkpCisgICAgeworICAgIGNhc2UgRV9BQ0NFU1NfREVOSUVEOgorICAgICBub3RpZnlfZmFpbCgiRGllIEViZW5lICciK2NuKyInIGxpZXMgc2ljaCBuaWNodCBlbnRmZXJuZW4hXG4iKTsKKyAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdyaXRlKCJEdSBlbnRmZXJuc3QgZGllIEViZW5lICciK2NuKyInLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3NjYW5mKGFyZ3MsICJjbGVhciAlcyIsIG4pICYmIElTX0FSQ0godGhpc19vYmplY3QoKSkpCisgIHsKKyAgICBpZighKGNuID0gQ0hNQVNURVItPmZpbmQobiwgdGhpc19vYmplY3QoKSkpKSBjbiA9IG47CisgICAgc3dpdGNoKENITUFTVEVSLT5jbGVhcl9oaXN0b3J5KGNuLCB0aGlzX29iamVjdCgpKSkKKyAgICB7CisgICAgY2FzZSBFX0FDQ0VTU19ERU5JRUQ6CisgICAgIG5vdGlmeV9mYWlsKCJEZXIgVmVybGF1ZiB6dXIgRWJlbmUgJyIrY24rIicgbGllcyBzaWNoIG5pY2h0IGVudGZlcm5lbiFcbiIpOworICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd3JpdGUoIkR1IGVudGZlcm5zdCBkZW4gVmVybGF1ZiB6dXIgRWJlbmUgJyIrY24rIicuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzc2NhbmYoYXJncywgIm5ldSAlcyAlcyIsIG4sIGRlc2NyKSA9PSAyKQorICB7CisgICAgbWl4ZWQgeDsKKyAgICBpZihRdWVyeVByb3AoUF9MRVZFTCkgPCA1KQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiTmV1ZSBFYmVuZW4genUgZXJzdGVsbGVuIGlzdCBkaXIgdmVyd2VocnQuXG4iKSwgMCk7CisgICAgaWYoIXNpemVvZihyZWdleHAoKHsgbiB9KSwgIl4iIENIQU5ORUxDTURTIENIQU5ORUxDTURTICIqIikpKQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiRGVyIE5hbWUgJyIrbisiJyBpc3QgbmljaHQga29uZm9ybSFcbiIpLCAwKTsKKyAgICBpZiAoc2l6ZW9mKG4pID4gMjAgKQorICAgICAgcmV0dXJuKG5vdGlmeV9mYWlsKCJEZXIgTmFtZSAnIituKyInIGlzdCB6dSBsYW5nLlxuIiksIDApOworICAgIHN3aXRjaCh4ID0gQ0hNQVNURVItPm5ldyhuLCB0aGlzX29iamVjdCgpLCBkZXNjcikpCisgICAgeworICAgIGNhc2UgRV9BQ0NFU1NfREVOSUVEOgorICAgICAgbm90aWZ5X2ZhaWwoIkRpZXNlIEViZW5lIGRhcmZzdCBkdSBuaWNodCBlcnNjaGFmZmVuIVxuIik7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB3cml0ZSgiRHUgZXJzY2hhZmZzdCBkaWUgRWJlbmUgJyIrbisiJy5cbiIpOworICAgICAgU2V0UHJvcChQX0NIQU5ORUxTLCBRdWVyeVByb3AoUF9DSEFOTkVMUykgKyAoeyBsb3dlcl9jYXNlKG4pIH0pKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZihzc2NhbmYoYXJncywgImJlc2NocmVpYnVuZyAlcyAlcyIsIG4sIGRlc2NyKSA9PSAyKQorICB7CisgICAgbWl4ZWQgY2g7CisgICAgY24gPSBDSE1BU1RFUi0+ZmluZChuLCB0aGlzX29iamVjdCgpKTsKKyAgICBpZighY24gfHwgcG9pbnRlcnAoY24pKQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiRGllIEViZW5lICciK24rIicgZXhpc3RpZXJ0IG5pY2h0IG9kZXIgZGllIEFuZ2FiZSAiCisgICAgICAgICJ3YXIgbmljaHQgZWluZGV1dGlnLlxuIiksIDApOworICAgIGNoID0gQ0hNQVNURVItPmxpc3QodGhpc19vYmplY3QoKSk7CisgICAgaWYoY2hbbG93ZXJfY2FzZShjbildW0lfTUFTVEVSXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiRHUgYmlzdCBuaWNodCBiZXJlY2h0aWd0IGRpZSBCZXNjaHJlaWJ1bmcgZGVyIEViZW5lIgorICAgICAgICAiICciK2NuKyInIHp1IGFlbmRlcm4uXG4iKSwgMCk7CisgICAgY2hbbG93ZXJfY2FzZShjbildW0lfSU5GT10gPSBkZXNjcjsKKyAgICB3cml0ZSgiRGllIEViZW5lICciK2NuKyInIGhhdCBhYiBzb2ZvcnQgZGllIEJlc2NocmVpYnVuZzpcbiIrZGVzY3IrIlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3NjYW5mKGFyZ3MsICIlcz0lcyIsIHNoLCBuKSA9PSAyICYmIHNpemVvZihuKSkKKyAgeworICAgIG1hcHBpbmcgc2M7CisgICAgaWYocG9pbnRlcnAodG1wID0gQ0hNQVNURVItPmZpbmQobiwgdGhpc19vYmplY3QoKSkpIHx8ICF0bXApCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJCZW51dHp1bmc6IGViZW5lIDxBYmt1ZXJ6dW5nPj08RWJlbmU+XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICsocG9pbnRlcnAodG1wKSA/IGltcGxvZGUodG1wLCAiLCAiKSArICJcbiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYmVuZSAnIituKyInIG5pY2h0IGdlZnVuZGVuIVxuIikpLCAwKTsKKyAgICBzYyA9IFF1ZXJ5UHJvcChQX0NIQU5ORUxfU0hPUlQpOworICAgIGlmKCFzYykgc2MgPSAoW10pOworICAgIHNjW3NoXSA9IHRtcDsKKyAgICBTZXRQcm9wKFBfQ0hBTk5FTF9TSE9SVCwgc2MpOworICAgIHNob3J0Y3V0ID0gUXVlcnlQcm9wKFBfQ0hBTk5FTF9TSE9SVCk7CisgICAgd3JpdGUoIiciK3NoKyInIHdpcmQgamV0enQgYWxzIEFia3Vlcnp1bmcgZnVlciAnIit0bXArIicgYW5lcmthbm50LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoc3NjYW5mKGFyZ3MsICIlcz0iLCBzaCkpCisgIHsKKyAgICBTZXRQcm9wKFBfQ0hBTk5FTF9TSE9SVCwgbV9jb3B5X2RlbGV0ZShRdWVyeVByb3AoUF9DSEFOTkVMX1NIT1JUKSB8fCAoW10pLCBzaCkpOworICAgIHNob3J0Y3V0ID0gUXVlcnlQcm9wKFBfQ0hBTk5FTF9TSE9SVCk7CisgICAgd3JpdGUoIkR1IGxvZXNjaHN0IGRpZSBBYmt1ZXJ6dW5nICciK3NoKyInLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYoYXJncyA9PSAiYW4iIHx8IGFyZ3MgPT0gImVpbiIpCisgIHsKKyAgICBtaXhlZCBleGNsOworICAgIGlmKHBvaW50ZXJwKFF1ZXJ5UHJvcChQX1NXQVBfQ0hBTk5FTFMpKSkKKyAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgUXVlcnlQcm9wKFBfU1dBUF9DSEFOTkVMUykpOworICAgIGVsc2UKKyAgICAgIFNldFByb3AoUF9DSEFOTkVMUywgbV9pbmRpY2VzKENITUFTVEVSLT5saXN0KHRoaXNfb2JqZWN0KCkpKSk7CisgICAgZXhjbCA9IFJlZ2lzdGVyQ2hhbm5lbHMoKTsKKyAgICB3cml0ZSgiRHUgc2NoYWx0ZXN0IGZvbGdlbmRlIEViZW5lbiBlaW46XG4iCisgICAgICAgICAgK2JyZWFrX3N0cmluZyhpbXBsb2RlKFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSAtIGV4Y2wsICIsICIpLCA3OCkpOworICAgIFNldFByb3AoUF9TV0FQX0NIQU5ORUxTLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihhcmdzID09ICJhdXMiKQorICB7CisgICAgU2V0UHJvcChQX1NXQVBfQ0hBTk5FTFMsIFF1ZXJ5UHJvcChQX0NIQU5ORUxTKSk7CisgICAgUmVtb3ZlQ2hhbm5lbHMoKTsKKyAgICBTZXRQcm9wKFBfQ0hBTk5FTFMsICh7fSkpOworICAgIHdyaXRlKCJEdSBzdGVsbHN0IGRpZSBFYmVuZW4gYWIuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBwYSA9IG9sZF9leHBsb2RlKGFyZ3MsICIgIik7CisgIGlmKCFzdHJzdHIoImFia3Vlcnp1bmdlbiIsIHBhWzBdKSkKKyAgeworICAgIHN0cmluZyB0eHQ7IHR4dCA9ICIiOworICAgIGlmKHNpemVvZihwYSkgPiAxICYmICFzdHJzdHIoInN0YW5kYXJkIiwgcGFbMV0pKQorICAgIHsKKyAgICAgIHdyaXRlKCJEaWUgU3RhbmRhcmQgQWJrdWVyenVuZ2VuIHdlcmRlbiBnZXNldHp0LlxuIik7CisgICAgICBTZXRQcm9wKFBfQ0hBTk5FTF9TSE9SVCwgREVGQVVMVF9TSE9SVENVVFMKKyAgICAgICAgICAgICAgKyAoSVNfTEVBUk5FUih0aGlzX29iamVjdCgpKSA/IFdJWkFSRF9TSE9SVENVVFMgOiAoW10pKSk7CisgICAgfQorICAgIHdhbGtfbWFwcGluZyhRdWVyeVByb3AoUF9DSEFOTkVMX1NIT1JUKSwKKyAgICAgICAgICAgICAgICAgbGFtYmRhKCh7J2kvKicqLywgJ2MsICdyfSksCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnKz0sICdyLyonKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydzcHJpbnRmLyonKi8sICIlNS41cyA9ICVzXG4iLCAnaSwgJ2N9KX0pKSwKKyAgICAgICAgICAgICAgICAgJnR4dCk7CisgICAgdHh0ID0gc3ByaW50ZigiRm9sZ2VuZGUgQWJrdWVyenVuZ2VuIHNpbmQgZGVmaW5pZXJ0OlxuJS03OCNzXG4iLAorICAgICAgICAgICAgICAgICAgaW1wbG9kZShzb3J0X2FycmF5KG9sZF9leHBsb2RlKHR4dCwgIlxuIiksICMnPi8qJyovKSwgIlxuIikpOworICAgIE1vcmUodHh0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZighc3Ryc3RyKCJzdGFuZGFyZCIsIHBhWzBdKSkKKyAgICBpZihzaXplb2YocGEpIDwgMikKKyAgICAgIHJldHVybiAobm90aWZ5X2ZhaWwoIkJlbnV0enVuZzogZWJlbmUgc3RhbmRhcmQgPEViZW5lPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICArKFF1ZXJ5UHJvcChQX1NURF9DSEFOTkVMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIk1vbWVudGFuIGlzdCAnIitRdWVyeVByb3AoUF9TVERfQ0hBTk5FTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIicgZWluZ2VzdGVsbHQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiRXMgaXN0IGtlaW5lIFN0YW5kYXJkZWJlbmUgZWluZ2VzdGVsbHQuXG4iKSksMCk7CisgICAgZWxzZQorICAgICAgaWYocG9pbnRlcnAodG1wID0gQ0hNQVNURVItPmZpbmQocGFbMV0sIHRoaXNfb2JqZWN0KCkpKSkKKyAgICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiRGFzIHdhciBrZWluZSBlaW5kZXV0aWdlIEFuZ2FiZSEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb2xnZW5kZSBFYmVuZW4gcGFzc2VuOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICticmVha19zdHJpbmcoaW1wbG9kZSh0bXAsICIsICIpLCA3OCkpLCAwKTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYoIXRtcCkgcmV0dXJuIChub3RpZnlfZmFpbCgiRWJlbmUgJyIrcGFbMV0rIicgbmljaHQgZ2VmdW5kZW4hXG4iKSwwKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgd3JpdGUoIiciK3RtcCsiJyBpc3QgamV0enQgZGllIFN0YW5kYXJkZWJlbmUuXG4iKTsKKyAgICAgICAgICBTZXRQcm9wKFBfU1REX0NIQU5ORUwsIHRtcCk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2NvbWJhdC5jIGIvc3RkL3BsYXllci9jb21iYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI1YTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9jb21iYXQuYwpAQCAtMCwwICsxLDIxNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9jb21iYXQuYyAtLSBjb21iYXQgc3RhdGlzdGljcworLy8KKy8vICRJZDogY29tYmF0LmMgOTAwOCAyMDE1LTAxLTA2IDE3OjIwOjE3WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvY29tYmF0IjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL3BrbG9nIjsKKworI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCisjZGVmaW5lIE1FIHRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgU1RBVE1BU1RFUiAiL3Avc2VydmljZS9yb2NodXMvZ3VpbGRzdGF0L21hc3RlciIKKworcHJpdmF0ZSBub3NhdmUgY2xvc3VyZSBtb2RfZGVmX3N0YXQ7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKnBsQXR0YWNrZWQgPSAoe30pOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGNvbWJhdDo6Y3JlYXRlKCk7CisgIC8vIFBfTk9fQVRUQUNLIGlzdCBuaWNodCBmdWVyIFNwaWVsZXIgZ2VkYWNodC4gQXVzbmFobWU6IFNwaWVsZXIgaXN0CisgIC8vIEdlaXN0LCBkYW5uIHNldHp0IGRhcyBTcGllbGVyb2JqZWt0IGFiZXIgc2VsYmVyLgorICBTZXQoUF9OT19BVFRBQ0ssIFNFQ1VSRUR8Tk9TRVRNRVRIT0QsIEZfTU9ERV9BUyk7CisgIAorICBTZXQoUF9IRUxQRVJfTlBDLCBQUk9URUNURUQsIEZfTU9ERSk7CisgIFNldFByb3AoUF9IRUxQRVJfTlBDLCAoW10pICk7Cit9CisKKy8vIE1hc2tlIGZ1ZXIgYWxsZSBtb2VnbGljaGVuIEtsYXNzZW4gdm9uIEhlbGZlci1OUEMKKyNkZWZpbmUgQ0xBU1NfTUFTSyAweDFmZmZmZmZmCisvKiogcmVnaXN0cmllcnQgZGVuIE5QQyBhbHMgSGVsZmVyIHZvbiBkaWVzZW0gU3BpZWxlci4KKyAgQHBhcmFtW2luXSBucGMgb2JqZWN0IEhlbGZlci1OUEMKKyAgQHBhcmFtW2luXSBmbGFncyBpbnQgQml0ZmVsZCB2b24gRmxhZ3MKKyAgQHJldHVybiBpbnQgMSwgZmFsbHMgZGVyIEhlbGZlci1OUEMgcmVnaXN0cmllcnQgd3VyZGUgdW5kIG5vY2ggbmljaHQKKyAgcmVnaXN0cmllcnQgd2FyLgorICBAYXR0ZW50aW9uIE51dHp0IGF1cywgZGFzcyBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKSBfa2VpbmVfIEtvcGllIGRlcworICBNYXBwaW5ncyBpbiBkZXIgUHJvcCBsaWVmZXJ0LgorICAqLworcHVibGljIGludCBSZWdpc3RlckhlbHBlck5QQyhvYmplY3QgbnBjLCBpbnQgZmxhZ3MpIHsKKyAgaWYgKCFvYmplY3RwKG5wYykpCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZiggIldyb25nIGFyZ3VtZW50IDEgaW4gUmVnaXN0ZXJIZWxwZXJOUEMoKS4gIgorICAgICAgICAgICJFeHBlY3RlZCA8b2JqZWN0PiwgZ290ICUuMTAwT1xuIiwgbnBjKSk7CisgIGlmICghaW50cChmbGFncykgfHwgZmxhZ3MgPCAxKQorICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCAiV3JvbmcgYXJndW1lbnQgMiBpbiBSZWdpc3RlckhlbHBlck5QQygpLiAiCisgICAgICAgICAgIkV4cGVjdGVkIHBvc2l0aXZlIDxpbnQ+LCBnb3QgJU9cbiIsIGZsYWdzKSk7CisgIAorICBtYXBwaW5nIGhlbHBlcnMgPSBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKTsKKyAgCisgIC8vIHNjaG9uIHJlZ2lzdHJpZXJ0ZSBzaW5kIHdpdHpsb3MuCisgIGlmIChtZW1iZXIoaGVscGVycywgbnBjKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIGF1ZiBleGtsdXNpdmUgSGVsZmVyIHBydWVmZW4uCisgIGZvcmVhY2gob2JqZWN0IGhlbHBlciwgaW50IGZsOiBoZWxwZXJzKSB7CisgICAgLy8gZmxhZ3MgaWRlbnRpc2NoPyBEYW5uIEtsYXNzZSB1bmQgRXhrbHVzaXZpdGFldCBpZGVudGlzY2gKKyAgICBpZiAoZmwgPT0gZmxhZ3MpCisgICAgICByZXR1cm4gMDsKKyAgICAvLyBvZGVyIGVpbmVyIHZvbiBiZWlkZW4gZXhrbHVzaXYgdW5kIGJlaWRlIGluIGRlciBnbGVpY2hlbiBLbGFzc2U/CisgICAgZWxzZSBpZiAoICgoZmwgJiBFWENMVVNJVkVfSEVMUEVSKSB8fCAoZmxhZ3MgJiBFWENMVVNJVkVfSEVMUEVSKSkKKyAgICAgICAgICAgICAgJiYgKChmbCAmIENMQVNTX01BU0spID09IChmbGFncyAmIENMQVNTX01BU0spKSApCisgICAgICByZXR1cm4gMDsKKyAgfQorICAvLyBzY2hlaW50IHdvaGwgb2sgenUgc2Vpbi4gUmVnaXN0cmllcmVuIHVuZCBQcm9wIGltIE5QQyBzZXR6ZW4uCisgIGhlbHBlcnMgKz0gKFsgbnBjOiBmbGFncyBdKTsKKyAgbnBjLT5TZXRQcm9wKFBfSEVMUEVSX05QQywgKHsgdGhpc19vYmplY3QoKSwgZmxhZ3MgfSkgKTsKKyAgLy8gbW9tZW50YW4gdW5ub2V0aWcsIGRhIGhlbHBlcnMga2VpbmUgS29waWUgaXN0LgorICAvLyBTZXRQcm9wKFBfSEVMUEVSX05QQywgaGVscGVycyk7CisKKyAgcmV0dXJuIDE7Cit9CisjdW5kZWYgQ0xBU1NfTUFTSworCisvKiogZGUtcmVnaXN0cmllcnQgZGVuIE5QQyBhbHMgSGVsZmVyIHZvbiBkaWVzZW0gU3BpZWxlci4KKyAgQHBhcmFtW2luXSBucGMgb2JqZWN0IEhlbGZlci1OUEMKKyAgQHJldHVybiBpbnQgMSwgZmFsbHMgZGVyIEhlbGZlci1OUEMgcmVnaXN0cmllcnQgd2FyIHVuZCBlbnRmZXJudCB3dXJkZS4KKyAgQGF0dGVudGlvbiBOdXR6dCBhdXMsIGRhc3MgUXVlcnlQcm9wKFBfSEVMUEVSX05QQykgX2tlaW5lXyBLb3BpZSBkZXMKKyAgTWFwcGluZ3MgaW4gZGVyIFByb3AgbGllZmVydC4KKyAqLworcHVibGljIGludCBVbnJlZ2lzdGVySGVscGVyTlBDKG9iamVjdCBucGMpIHsKKyAgaWYgKCFvYmplY3RwKG5wYykpCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgaW4gVW5yZWdpc3RlckhlbHBlcm5OUEMoKS4gIgorICAgICAgICAgICJFeHBlY3RlZCA8b2JqZWN0PiwgZ290ICUuMTAwT1xuIiwgbnBjKSk7CisKKyAgbWFwcGluZyBoZWxwZXJzID0gUXVlcnlQcm9wKFBfSEVMUEVSX05QQyk7CisgIGlmIChtZW1iZXIoaGVscGVycywgbnBjKSkgeworICAgIG1fZGVsZXRlKGhlbHBlcnMsIG5wYyk7CisgICAgLy8gbW9tZW50YW4gdW5ub2V0aWcsIGRhIGhlbHBlcnMga2VpbmUgS29waWUgaXN0LgorICAgIC8vIFNldFByb3AoUF9IRUxQRVJfTlBDLCBoZWxwZXJzKTsKKyAgICBucGMtPlNldFByb3AoUF9IRUxQRVJfTlBDLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqIEZlaW5kIGVpbnRyYWdlbi4KKyAgKiBUcmFlZ3Qgb2IgYWxzIEZlaW5kIGVpbi4gRGllcyBhbGxlcmRpbmdzIG51ciwgd2VubiBvYiBrZWluIFNwaWVsZXIgaXN0CisgICogb2RlciBiZWlkZSBTcGllbGVyIChkaWVzZXMgT2JqZWt0IHVuZCBvYikgaW4gZGVyIFNjaGF0dGVud2VsdCBzaW5kIG9kZXIKKyAgKiBiZWlkZSBTcGllbGVyIFRlc3RzcGllbGVyIHNpbmQuCisgICBAcGFyYW1baW5dIG9iIHBvdGVudGllbGxlciBGZWluZC4KKyAgIEByZXR1cm4gaW50IDEsIGZhbGxzIG9iIGFscyBfbmV1ZXJfIEZlaW5kIGVpbmdldHJhZ2VuIHd1cmRlLgorICAgKi8KK3B1YmxpYyBpbnQgSW5zZXJ0RW5lbXkob2JqZWN0IG9iKSB7CisgIC8vIHdlbm4gb2IgZWluIFNwaWVsZXIgaXN0IHVuZCBuaWNodCBzb3dvaGwgaWNoIGFscyBhdWNoIG9iIGluIGRlcgorICAvLyBTY2hhdHRlbndlbHQgc2luZCwgd2lyZCBvYiBuaWNodCBhbHMgRmVpbmQgZWluZ2V0cmFnZW4uCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKQorICAgICAgJiYgKHN0cnN0cihvYmplY3RfbmFtZShlbnZpcm9ubWVudChvYikpLCIvZC9zY2hhdHRlbndlbHQvIikhPTAKKyAgICAgICAgICB8fCBzdHJzdHIob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoTUUpKSwiL2Qvc2NoYXR0ZW53ZWx0LyIpIT0wKQorICAgICAgJiYgKCFRdWVyeVByb3AoUF9URVNUUExBWUVSKSB8fCAhb2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKQorICAgICApCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gOjpJbnNlcnRFbmVteShvYik7Cit9CisKKy8qKiBIYXQgZGllc2VyIFNwaWVsZXIgZGVuIFNwaWVsZXIgcGwgYW5nZWdyaWZmZW4/LgorICBAcGFyYW1baW5dIHBsIG9iamVjdCB6dSBwcnVlZmVuZGVyIFNwaWVsZXIKKyAgQHJldHVybiBpbnQgMSwgZmFsbHMgZGllc2VyIFNwaWVsZXIgcGwgYW5nZWdyaWZmZW4gaGF0LgorICBAYXR0ZW50aW9uIE5lYmVuZWZmZWt0OiBiZXJlaW5pZ3QgZGVuIGludGVybmVuIFNwZWljaGVyIHZvbiBVSURzIHZvbgorICB6ZXJzdG9lcnRlbiBTcGllbGVybiB1bmQgc29sY2hlbiwgZGllIGtlaW5lIEZlaW5kZSBtZWhyIHNpbmQuCisgICovCitwdWJsaWMgaW50IFF1ZXJ5UGxBdHRhY2tlZChvYmplY3QgcGwpIHsKKyAgb2JqZWN0IG9iOworCisgIGlmICggIW9iamVjdHAocGwpICkKKyAgICByZXR1cm4gMDsKKworICBmb3JlYWNoKHN0cmluZyBwbG5hbWU6IHBsQXR0YWNrZWQpIHsKKyAgICBpZiAoICEoIG9iPShmaW5kX3BsYXllcihwbG5hbWUpfHxmaW5kX25ldGRlYWQocGxuYW1lKSkgKQorICAgICAgICB8fCAoICFJc0VuZW15KG9iKSAmJiAhKG9iLT5Jc0VuZW15KE1FKSkgKSApCisgICAgICBwbEF0dGFja2VkIC09ICh7cGxuYW1lfSk7IC8vIGphLCBkYXMgZ2VodC4gOy0pCisgIH0KKyAgcmV0dXJuIChtZW1iZXIoIHBsQXR0YWNrZWQsIGdldHVpZChwbCkgKSA+PSAwKTsKK30KKworLyoqIGtpbGwgLSBLYW1wZiBzdGFydGVuLgorICogRnVlZ3Qgb2IgZGVyIEZlaW5kZXNsaXN0ZSBoaW56dS4KKyAqLworcHVibGljIGludCBLaWxsKG9iamVjdCBvYikgeworCisgIGlmICghb2JqZWN0cChvYikpIHJldHVybiAwOworCisgIC8vIGRpZXMgZGllbnQgbnVyIGRhenUsIGRhcyBwbEF0dGFja2VkIG1hcHBpbmcgenUgYmVyZWluaWdlbi4KKyAgLy8gVE9ETzogYmVzc2VyIG1hY2hlbi4gOy0pCisgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgIUlzRW5lbXkob2IpKSB7CisgICAgUXVlcnlQbEF0dGFja2VkKE1FKTsKKyAgICBvYi0+UXVlcnlQbEF0dGFja2VkKG9iKTsgLy8gYWt0dWFsaXNpZXJlbiAuLi4KKyAgfQorCisgIGludCByZXMgPSBjb21iYXQ6OktpbGwob2IpOworCisgIC8vIGZhbGxzIG9iIG5lbiBTcGllbGVyIGlzdCwgcHJ1ZWZlbiwgb2IgZXMgZWluIFNwaWVsZXItU3BpZWxlci1BbmdyaWZmCisgIC8vIGlzdC4KKyAgLy8gRGFiZWkgZ2dmLiBsb2dnZW4gdW5kIE1hZ2llciB2ZXJzdGFlbmRpZ2VuLgorICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgQ2hlY2tQbGF5ZXJBdHRhY2soTUUsIG9iLCAwKSkKKyAgeworICAgIGlmIChyZXMgPT0gLTQpIC8vIGZlaW5kIHd1cmRlIG5pY2h0IGVpbmdldHJhZ2VuCisgICAgICB0ZWxsX29iamVjdChNRSwgIkVpbiBnb2V0dGxpY2hlciBCZWZlaGwgaGluZGVydCBEaWNoIGFtIEthbXBmLlxuIik7CisgICAgZWxzZQorICAgICAgcGxBdHRhY2tlZCArPSAoeyBnZXR1aWQob2IpIH0pOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworcHVibGljIGludCBEZWZlbmQoaW50IGRhbSwgc3RyaW5nfHN0cmluZyogZGFtX3R5cGUsIGludHxtYXBwaW5nIHNwZWxsLCBvYmplY3QgZW5lbXkpIHsKKyAgaW50IGRlbHRhX2hwLHJlczsKKworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkKKyAgICAgICYmICFJU19MRUFSTkVSKE1FKQorICAgICAgJiYgIW9iamVjdHAoZ2V0X3R5cGVfaW5mbyhtb2RfZGVmX3N0YXQsMikpKSB7CisgICAgb2JqZWN0IG1hOworICAgIGlmICghb2JqZWN0cChtYT1maW5kX29iamVjdChTVEFUTUFTVEVSKSkpCisgICAgICByZXR1cm4gOjpEZWZlbmQoZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKKyAgICAvLyBTdGF0aXN0aWsgbnVyIGF1ZnJ1ZmVuIGZhbGxzIE1hc3RlciBnZWxhZGVuCisgICAgbW9kX2RlZl9zdGF0PXN5bWJvbF9mdW5jdGlvbigiTW9kaWZ5RGVmZW5kU3RhdCIsbWEpOworICB9CisKKyAgaWYgKGNsb3N1cmVwKG1vZF9kZWZfc3RhdCkpCisgICAgZGVsdGFfaHA9UXVlcnlQcm9wKFBfSFApOworCisgIHJlcz06OkRlZmVuZChkYW0sZGFtX3R5cGUsc3BlbGwsZW5lbXkpOworCisgIGlmIChjbG9zdXJlcChtb2RfZGVmX3N0YXQpKSB7CisgICAgZGVsdGFfaHAtPVF1ZXJ5UHJvcChQX0hQKTsKKyAgICBpZiAoZGVsdGFfaHA8MCkKKyAgICAgIGRlbHRhX2hwPTA7CisgICAgZnVuY2FsbChtb2RfZGVmX3N0YXQsCisgICAgICAgICAgICBRdWVyeVByb3AoUF9HVUlMRCksCisgICAgICAgICAgICBRdWVyeVByb3AoUF9HVUlMRF9MRVZFTCksCisgICAgICAgICAgICBkYW0tMTAqZGVsdGFfaHAsCisgICAgICAgICAgICBkYW1fdHlwZSwKKyAgICAgICAgICAgIHNwZWxsKTsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKKy8vIFNwaWVsZXIga29lbm5lbiBhbHMgR2Vpc3QgbmljaHQga+RtcGZlbgorLy8gVE9ETzogcHJ1ZWZlbiwgb2IgZGFzIFNldHplbiB1bmQgTG9lc2NoZW4gZGVyIFByb3AgaW4gc2V0X2dob3N0KCkgbmljaHQKKy8vIGF1Y2ggYXVzcmVpY2hlbiB3dWVyZGUuIEluIGRlbSBGYWxsIG11ZXNzdGUgbWFuIGFiZXIgUF9OT19BVFRBQ0sgYXVjaAorLy8gc3BlaWNoZXJuLCBkYSBQX0dIT1NUIGdlc3BlaWNoZXJ0IHdpcmQuLi4KK3N0YXRpYyBtaXhlZCBfcXVlcnlfbm9fYXR0YWNrKCkKK3sKKyAgICBpZiAoIFF1ZXJ5UHJvcChQX0dIT1NUKSApCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIFF1ZXJ5KFBfTk9fQVRUQUNLKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY29tbS5jIGIvc3RkL3BsYXllci9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxZjFkZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvY29tbS5jCkBAIC0wLDAgKzEsMTkyMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9jb21tLmMtLSBiYXNpYyBwbGF5ZXIgY29tbXVuaWN0aW9uIGNvbW1hbmRzCisvLworLy8gJElkOiBjb21tLmMgOTU3NiAyMDE2LTA2LTE4IDE1OjAwOjAxWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworCitpbmhlcml0ICIvc3RkL2xpdmluZy9jb21tIjsKK2luaGVyaXQgIi9zdGQvcGxheWVyL2NoYW5uZWwiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvY29tbV9zdHJ1Y3RzIjsKKworI2luY2x1ZGUgPGlucHV0X3RvLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL3F1ZXN0Lmg+CisjaW5jbHVkZSA8cGxheWVyL2dtY3AuaD4KKyNpbmNsdWRlIDxsaXZpbmcvZGVzY3JpcHRpb24uaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHBsYXllci9jb21tLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhbnNpLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx1ZHAuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHJlZ2V4cC5oPgorI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworI2RlZmluZSBURUxMSElTVF9ESVNBQkxFRCAgIDAKKyNkZWZpbmUgVEVMTEhJU1RfTk9fTUVTU0FHRSAxCisjZGVmaW5lIFRFTExISVNUX0VOQUJMRUQgICAgMgorI2RlZmluZSBURUxMSElTVF9MT05HTElGRSAgIDMKKworI2RlZmluZSBFQ0hPX0NPU1QgNTAKKyNkZWZpbmUgRVJXSURFUl9QQVJBTSAiLCIKKworI2RlZmluZSBaREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgICAgZWZ1bjo6dGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSwiQ29tbURCRzogIit4KyJcbiIpCisKK3ByaXZhdGUgaW50IHRlbGxfaGlzdG9yeV9lbmFibGVkID0gVEVMTEhJU1RfTk9fTUVTU0FHRTsKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgdGVsbF9oaXN0b3J5PShbXSk7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmNvbW1yZWNlaXZlcnMgPSAoe30pOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIGxhc3RfY29tbV9wYXJ0bmVyOworcHJpdmF0ZSBub3NhdmUgaW50IGxhc3RfYmVlcF90aW1lOworCisvLyBTdGF0dXNyZXBvcnRlIGFrdGl2aWVydD8gQmluYWVyZSBGbGFncyAocy4gc2V0X3JlcG9ydCgpKQorcHJpdmF0ZSBpbnQgc3RhdF9yZXBvcnRzOworLy8gaW50ZXJuZXIgQ2FjaGUgZnVlciBkaWUgTFAvS1AvR2lmdC1XZXJ0ZSBmdWVyIGRpZSBTdGF0dXNyZXBvcnQtQXVzZ2FiZW4KKy8vIEVpbnRyYWVnZSAoaW4gZGllc2VyIFJlaWhlbmZvbGdlKTogUF9IUCwgUF9TUCwgR2lmdHN0YXR1cworLy8gSW5pdGlhbGlzaWVydW5nIGVyZm9sZ3QgYmVpbSBlcnN0ZW4gUmVwb3J0IG5hY2ggTG9naW4KK3ByaXZhdGUgbm9zYXZlIG1peGVkICpyZXBvcnRfY2FjaGU7CisKKy8vIFB1ZmZlciBmdWVyIEtvYm9sZC4KK3ByaXZhdGUgbm9zYXZlIHN0cnVjdCBtc2dfYnVmZmVyX3Mga29ib2xkID0gKDxtc2dfYnVmZmVyX3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWY6IGFsbG9jYXRlKDMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAtMSwpOworI2RlZmluZSBNQVhfS09CT0xEX0xJTUlUIDI1NgorCit2YXJhcmdzIHN0cmluZyBuYW1lKGludCBjYXN1cywgaW50IGRlbW9uc3QpOworCisvL2xvY2FsIHByb3BlcnR5IHByb3RvdHlwZXMKK3N0YXRpYyBpbnQgX3F1ZXJ5X2ludGVybXVkKCk7CitwdWJsaWMgaW50IFJlbW92ZUlnbm9yZShzdHJpbmcgaWduKTsKK3B1YmxpYyBpbnQgQWRkSWdub3JlKHN0cmluZyBpZ24pOworCitwdWJsaWMgdmFyYXJncyBpbnQgUmVjZWl2ZU1zZyhzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsIHN0cmluZyBtc2dfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCBvcmlnaW4pOworCisvLyBlcnpldWd0IHNvcnRpZXJ0ZSBMaXN0ZSBhbiBLb21tdW5pa2F0aW9uc3BhcnRuZXJuCitwcml2YXRlIHN0cmluZyAqc29ydGVkX2NvbW1wYXJ0bmVycyhpbnQgcmV2ZXJzZWQpOworCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmJ1ZmZlciA9ICh7fSk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0KFBfRUFSTVVGRlMsIDApOworICBTZXQoUF9FQVJNVUZGUywgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfRUFSTVVGRlMsIFNFQ1VSRUQsIEZfTU9ERSk7CisgIFNldChQX0lOVEVSTVVELCBTQVZFLCBGX01PREUpOworICBTZXQoUF9JR05PUkUsIChbXSksIEZfVkFMVUUpOworICBTZXQoUF9JR05PUkUsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0JVRkZFUiwgU0FWRSwgRl9NT0RFKTsKKyAgU2V0KFBfTUVTU0FHRV9QUkVQRU5ELCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9NRVNTQUdFX0JFRVAsIFNBVkUsIEZfTU9ERV9BUyk7Cit9CisKK3ZvaWQgY3JlYXRlX3N1cGVyKCkKK3sKKyAgc2V0X25leHRfcmVzZXQoLTEpOworfQorCisvLyB1ZWJlcm1pdHRlbHQgZWluZSBNVF9OT1RJRklDQVRJT04gYW4gdGhpc19vYmplY3QoKSwgd2VsY2hlIG5pY2h0IGlnbm9yaWVydAorLy8gd2VyZGVuIGthbm4gdW5kIGF1Y2ggbmljaHQgZ2VzcGVpY2hlcnQgd2lyZC4KK3Byb3RlY3RlZCB2b2lkIF9ub3RpZnkoc3RyaW5nIG1zZywgc3RyaW5nIGFjdGlvbikgeworICBSZWNlaXZlTXNnKG1zZywKKyAgICAgICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfQlVGRkVSfE1TR19ET05UX0lHTk9SRXxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICBhY3Rpb24sIDAsIHRoaXNfb2JqZWN0KCkpOworfQorCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoaW50IG5ld2ZsYWcpIHsKKyAgLy8gQWx0ZXMgSWdub3JpZXJlIGxvZXNjaGVuLi4uCisgIG1peGVkIGlnbiA9IFF1ZXJ5KFBfSUdOT1JFLEZfVkFMVUUpOworICBpZiAoIW1hcHBpbmdwKGlnbikpCisgIHsKKyAgICBpZiAocG9pbnRlcnAoaWduKSkKKyAgICAgIF9ub3RpZnkoYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbmUgSWdub3JpZXJlLUVpbnN0ZWxsdW5nZW4gd3VyZGVuIHNvZWJlbiBnZWxvZXNjaHQsICIKKyAgICAgICAgIndlaWwgZXMgZWluZSBBa3R1YWxpc2llcnVuZyBkZXIgSWdub3JpZXJlZnVua3Rpb24gZ2FiLCAiCisgICAgICAgICJiZWkgZGVyIGVpbmUgS29udmVyc2lvbiBkZXIgRGF0ZW4gbGVpZGVyIG5pY2h0ICIKKyAgICAgICAgIm1vZWdsaWNoIHdhci4iLDc4KSwgMCk7CisKKyAgICBTZXQoUF9JR05PUkUsIChbXSksIEZfVkFMVUUpOworICB9Cit9CisKK3N0YXRpYyBpbnQgc2V0X3JlcG9ydChzdHJpbmcgc3RyKSB7CisgIGludCBjYW5mbGFncyA9IFF1ZXJ5UHJvcChQX0NBTl9GTEFHUyk7CisKKyAgaWYoIXN0cikKKyAgeworICAgIGlmIChzdGF0X3JlcG9ydHMpIHsKKyAgICBzdHJpbmcgKnJlcz0oe30pOworICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfSFApCisgICAgICByZXMrPSh7IkxlYmVuc3B1bmt0ZSJ9KTsKKyAgICBpZiAoc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1NQKQorICAgICAgcmVzKz0oeyJLb256ZW50cmF0aW9uc3B1bmt0ZSJ9KTsKKyAgICBpZiAoc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1BPSVNPTikKKyAgICAgIHJlcys9KHsiVmVyZ2lmdHVuZ2VuIn0pOworICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfV0lNUFkpCisgICAgICByZXMrPSh7IlZvcnNpY2h0In0pOworCisgICAgdGVsbF9vYmplY3QoTUUsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGlyIHdlcmRlbiBqZXR6dCBWZXJhZW5kZXJ1bmdlbiBEZWluZXIgIgorICAgICAgICArQ291bnRVcChyZXMpICsgIiBiZXJpY2h0ZXQuIiw3OCkpOworICAgIH0KKyAgICBlbHNlCisgICAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgIkFsbGUgU3RhdHVzcmVwb3J0cyBzaW5kIGF1c2dlc2NoYWx0ZXQuXG4iKTsKKworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYgKHN0ciA9PSAiYXVzIikgeworICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfSFAgfHwgc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1dJTVBZKSB7CisgICAgICBzdHJpbmcgcz0iIjsKKyAgICAgIGlmIChzdGF0X3JlcG9ydHMgJiBET19SRVBPUlRfSFApIHsKKyAgICAgICAgc3RyPSJlYmVuZmFsbHMgIjsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsICJEZXIgUmVwb3J0IHd1cmRlIGF1c2dlc2NoYWx0ZXQuXG4iKTsKKyAgICAgIH0KKyAgICAgIGlmICggc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1dJTVBZICkgeworICAgICAgICB0ZWxsX29iamVjdChNRSwgIkRlciBWb3JzaWNodC1SZXBvcnQgd3VyZGUgIitzKworICAgICAgICAgICJhdXNnZXNjaGFsdGV0LlxuIik7CisgICAgICB9CisgICAgICBzdGF0X3JlcG9ydHM9MDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZWxsX29iamVjdChNRSwgIkRlciBSZXBvcnQgaXN0IGJlcmVpdHMgYXVzZ2VzY2hhbHRldC5cbiIpOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChzdHIgPT0gImVpbiIpIHsKKyAgICBpZiAoIHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9IUCApIHsKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVyIFJlcG9ydCBpc3QgYmVyZWl0cyBlaW5nZXNjaGFsdGV0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdGVsbF9vYmplY3QoTUUsICJEZXIgUmVwb3J0IHd1cmRlIGVpbmdlc2NoYWx0ZXQuXG4iKTsKKyAgICBzdGF0X3JlcG9ydHMgfD0gRE9fUkVQT1JUX0hQOworICAgIGlmICghKGNhbmZsYWdzICYgQ0FOX1JFUE9SVF9TUCkpIHsKKyAgICAgIGlmIChRdWVyeVF1ZXN0KCJIaWxmIGRlbiBHbmFyZmVuIik9PTEpIHsKKyAgICAgICAgU2V0UHJvcChQX0NBTl9GTEFHUywgY2FuZmxhZ3MgfCBDQU5fUkVQT1JUX1NQKTsKKyAgICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9TUDsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJGdWVyIGRlbiBTdGF0dXNyZXBvcnQgRGVpbmVyIEtvbnplbnRyYXRpb24gbXVzc3QgRHUgamVkb2NoICIKKyAgICAgICAgICAienVuYWVjaHN0IGRpZSBRdWVzdCBcIkhpbGYgZGVuIEduYXJmZW5cIiBiZXN0ZWhlbi4iLDc4KSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9TUDsKKyAgICB9CisgICAgaWYgKCEoY2FuZmxhZ3MgJiBDQU5fUkVQT1JUX1BPSVNPTikpIHsKKyAgICAgIGlmIChRdWVyeVF1ZXN0KCJLYXR6ZW5qYW1tZXIiKT09MSkgeworICAgICAgICBTZXRQcm9wKFBfQ0FOX0ZMQUdTLCBjYW5mbGFncyB8IENBTl9SRVBPUlRfUE9JU09OKTsKKyAgICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9QT0lTT047CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiRnVlciBkZW4gU3RhdHVzcmVwb3J0IERlaW5lciBWZXJnaWZ0dW5nIG11c3N0IER1IGplZG9jaCAiCisgICAgICAgICAgInp1bmFlY2hzdCBkaWUgUXVlc3QgXCJLYXR6ZW5qYW1tZXJcIiBiZXN0ZWhlbi4iLDc4KSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9QT0lTT047CisgICAgfQorICAgIC8vIENhY2hlIGxvZXNjaGVuLCBkYW1pdCBiZWltIG5hZWNoc3RlbiBSZXBvcnQtRXZlbnQgYWxsZSBEYXRlbiBuZXUKKyAgICAvLyBlaW5nZXRyYWdlbiB3ZXJkZW4gbXVlc3Nlbi4gTXVzcyBiZWltIEVpbnNjaGFsdGVuIGRlcyBSZXBvcnRzCisgICAgLy8gcGFzc2llcmVuLCB3ZWlsIGF1Y2ggaW4gZGVyIGluYWt0aXZlbiBaZWl0IHdlaXRlcmhpbiBBZW5kZXJ1bmdlbiBpbgorICAgIC8vIHN0YXR1c19yZXBvcnQoKSBlaW5nZWhlbiwgc28gZGFzcyBkZXIgQ2FjaGUgendhciBlcnN0IGVpbm1hbCBsZWVyIGlzdCwKKyAgICAvLyBhYmVyIGJlaW0gV2llZGVyZWluc2NoYWx0ZW4gbmljaHQgbWVociB1bmd1ZWx0aWcgd2FlcmUgdW5kIHNvbWl0CisgICAgLy8gdmVyYWx0ZXRlIERhdGVuIGFuIGRlbiBTcGllbGVyIGF1c2dlZ2ViZW4gd2VyZGVuLiBJbSB1bmd1ZW5zdGlnc3RlbgorICAgIC8vIEZhbGwgd3VlcmRlIGRhcyBzb2dhciBkYXp1IGZ1ZWhyZW4sIGRhc3MgZGllIHZlcmFsdGV0ZW4gRGF0ZW4gbGFuZ2UKKyAgICAvLyBaZWl0IG5pY2h0IGFrdHVhbGlzaWVydCB3ZXJkZW4sIHdlbm4gei5CLiBQX0hQID09IFBfTUFYX0hQLCBzbyBkYXNzCisgICAgLy8ga2VpbiBQX0hQLUV2ZW50IG1laHIgZWluZ2VodC4KKyAgICByZXBvcnRfY2FjaGU9MDsKKyAgfQorICBlbHNlIGlmIChzdHIgPT0gInZvcnNpY2h0IikgeworICAgIGlmICghKGNhbmZsYWdzICYgQ0FOX1JFUE9SVF9XSU1QWSkpIHsKKyAgICAgIGlmIChRdWVyeVF1ZXN0KCJTY2hyYXQga2FubiBuaWNodCBlaW5zY2hsYWZlbiIpPT0xKSB7CisgICAgICAgIFNldFByb3AoUF9DQU5fRkxBR1MsIGNhbmZsYWdzIHwgQ0FOX1JFUE9SVF9XSU1QWSk7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVyIFZvcnNpY2h0LVJlcG9ydCB3dXJkZSBlaW5nZXNjaGFsdGV0LlxuIik7CisgICAgICAgIHN0YXRfcmVwb3J0cyB8PSBET19SRVBPUlRfV0lNUFk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdGVsbF9vYmplY3QoTUUsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiRnVlciBkZW4gU3RhdHVzcmVwb3J0IERlaW5lciBWb3JzaWNodCBtdXNzdCBEdSAiCisgICAgICAgICAgInp1bmFlY2hzdCBkaWUgUXVlc3QgXCJTY2hyYXQga2FubiBuaWNodCBlaW5zY2hsYWZlblwiICIKKyAgICAgICAgICAiYmVzdGVoZW4uIiw3OCkpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9XSU1QWTsKKyAgICB9CisgICAgLy8gZnVlciBTZWhlciBhdWNoIEJlcmljaHQgZGVyIEZsdWNodHJpY2h0dW5nIGVpbnNjaGFsdGVuLgorICAgIGlmICgoc3RhdF9yZXBvcnRzICYgRE9fUkVQT1JUX1dJTVBZKQorICAgICAgICAmJiAhKHN0YXRfcmVwb3J0cyAmIERPX1JFUE9SVF9XSU1QWV9ESVIpCisgICAgICAgICYmICgoY2FuZmxhZ3MgJiBDQU5fUkVQT1JUX1dJTVBZKSB8fCBJU19TRUVSKE1FKSkpCisgICAgeworICAgICAgc3RhdF9yZXBvcnRzIHw9IERPX1JFUE9SVF9XSU1QWV9ESVI7ICAgICAgICAKKyAgICB9CisgIH0KKyAgLy8gc2VuZGV0IGVpbm1hbGlnIGdlbmF1IGpldHp0IGRlbiBrb25maWd1cmllcnRlbiByZXBvcnQuIEthbm4genVtIHRlc3RlbgorICAvLyAodm9uIFRyaWdnZXJuKSBvZGVyIGJlaW0gTG9naW4gYmVudXR6dCB3ZXJkZW4sIHdlbm4gbWFuIGVpbmVuIGluaXRpYWxlbgorICAvLyBEYXRlbmJlc3RhbmQgZXJoYWx0ZW4gd2lsbC4KKyAgZWxzZSBpZiAoc3RyPT0ic2VuZGVuIikKKyAgeworICAgIC8vIEVzIHdpcmQgQXVzZ2FiZSB2b24gTFAgdW5kIFZvcnNpY2h0IGdldHJpZ2dlcnQsIGRhcyBzZW5kZXQgYmVpZGUKKyAgICAvLyBaZWlsZW4uCisgICAgc3RhdHVzX3JlcG9ydChET19SRVBPUlRfSFAsIFF1ZXJ5UHJvcChQX0hQKSk7CisgICAgc3RhdHVzX3JlcG9ydChET19SRVBPUlRfV0lNUFksIFF1ZXJ5UHJvcChQX1dJTVBZKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gMDsKKyAgLy8gbnVyIGFrdHVlbGxlbiBadXN0YW5kIGJlcmljaHRlbgorICBzZXRfcmVwb3J0KDApOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBzdHJpbmcgZ2V0X3BvaXNvbl9kZXNjKGludCBwKSB7CisgIHN0cmluZyByZXQ7CisgIGlmICggaW50cChwKSApIHsKKyAgICBzd2l0Y2gocCkgeworICAgICAgY2FzZSAwOiAgICByZXQ9ImtlaW5zIjsgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEuLjM6IHJldD0ibGVpY2h0IjsgICAgICBicmVhazsKKyAgICAgIGNhc2UgNC4uODogcmV0PSJnZWZhZWhybGljaCI7IGJyZWFrOworICAgICAgZGVmYXVsdDogICByZXQ9InNlaHIgZXJuc3QiOyAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKyAgZWxzZSByZXR1cm4gIihuaWNodCB2ZXJmdWVnYmFyKSI7Cit9CisKKy8vIHNwcmludGYoKS1Gb3JtYXRzdHJpbmdzIGZ1ZXIgZGllIFJlcG9ydGF1c2dhYmUuCisjZGVmaW5lIFJFUE9SVExJTkUgIkxQOiAlM2QsIEtQOiAlM3MsIEdpZnQ6ICVzLlxuIgorI2RlZmluZSBSRVBPUlRMSU5FX1dJTVBZICJWb3JzaWNodDogJWQsIEZsdWNodHJpY2h0dW5nOiAlcy5cbiIKKy8vIERlZmluZXMgenVyIEFkcmVzc2llcnVuZyBkZXIgQ2FjaGUtRWludHJhZWdlCisjZGVmaW5lIFJFUF9IUCAgICAgMAorI2RlZmluZSBSRVBfU1AgICAgIDEKKyNkZWZpbmUgUkVQX1BPSVNPTiAyCisKK3Byb3RlY3RlZCB2b2lkIHN0YXR1c19yZXBvcnQoaW50IHR5cGUsIG1peGVkIHZhbCkgeworICAvLyBXZW5uIGRlciBTcGllbGVyIEdNQ1AgaGF0IHVuZCBkYXMgc2ljaCB1bSBkaWUgSW5mb3JtYXRpb24ga3VlbW1lcnQsCisgIC8vIGVyZm9sZ3Qga2VpbmUgdGV4dHVlbGxlIEF1c2dhYmUgbWVoci4gRGFoZXIgcmV0dXJuLCB3ZW5uIEdNQ1BfQ2hhcigpCisgIC8vIGVyZm9sZyB2ZXJtZWxkZXQgaGF0LgorICBpbnQgZmxhZ3MgPSBRdWVyeVByb3AoUF9DQU5fRkxBR1MpOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIERPX1JFUE9SVF9IUDoKKyAgICAgIGlmIChHTUNQX0NoYXIoIChbIFBfSFA6IHZhbCBdKSApICkgcmV0dXJuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBET19SRVBPUlRfU1A6CisgICAgICBpZiAoIShmbGFncyAmIENBTl9SRVBPUlRfU1ApKSByZXR1cm47CisgICAgICBpZiAoR01DUF9DaGFyKCAoWyBQX1NQOiB2YWwgXSkgKSApIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE9fUkVQT1JUX1BPSVNPTjoKKyAgICAgICBpZiAoIShmbGFncyAmIENBTl9SRVBPUlRfUE9JU09OKSkgcmV0dXJuOworICAgICAgIGlmIChHTUNQX0NoYXIoIChbIFBfUE9JU09OOiB2YWwgXSkgKSApIHJldHVybjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRE9fUkVQT1JUX1dJTVBZOgorICAgICAgaWYgKCEoZmxhZ3MgJiBDQU5fUkVQT1JUX1dJTVBZKSkgcmV0dXJuOworICAgICAgaWYgKEdNQ1BfQ2hhciggKFsgUF9XSU1QWTogdmFsIF0pICkgKSByZXR1cm47CisgICAgICBicmVhazsKKyAgICBjYXNlIERPX1JFUE9SVF9XSU1QWV9ESVI6CisgICAgICBpZiAoIShmbGFncyAmIENBTl9SRVBPUlRfV0lNUFlfRElSKSkgcmV0dXJuOworICAgICAgaWYgKEdNQ1BfQ2hhciggKFsgUF9XSU1QWV9ESVJFQ1RJT046IHZhbCBdKSApICkgcmV0dXJuOworICAgICAgYnJlYWs7CisgIH0KKworICAvLyBrb252ZW50aW9uZWxsZSB0ZXh0dWVsbGUgQXVzZ2FiZSBkZXMgUmVwb3J0cyBhYiBoaWVyLgorICBpZiAoISh0eXBlICYgc3RhdF9yZXBvcnRzKSkKKyAgICByZXR1cm47CisKKyAgaWYgKCAhcmVwb3J0X2NhY2hlICkgeworICAgIHJlcG9ydF9jYWNoZSA9ICh7CisgICAgICBRdWVyeVByb3AoUF9IUCksCisgICAgICAoc3RhdF9yZXBvcnRzJkRPX1JFUE9SVF9TUCkgPyB0b19zdHJpbmcoUXVlcnlQcm9wKFBfU1ApKSA6ICIjIyMiLAorICAgICAgKHN0YXRfcmVwb3J0cyZET19SRVBPUlRfUE9JU09OKSA/CisgICAgICAgICAgZ2V0X3BvaXNvbl9kZXNjKFF1ZXJ5UHJvcChQX1BPSVNPTikpIDogIihuaWNodCB2ZXJmdWVnYmFyKSIKKyAgICB9KTsKKyAgfQorCisgIHN3aXRjaCh0eXBlKSB7CisgICAgICAvLyBMUCBiZXJpY2h0ZW46IENhY2hlIGFrdHVhbGlzaWVyZW4gdW5kIE1lbGR1bmcgYXVzZ2ViZW4uCisgICAgICBjYXNlIERPX1JFUE9SVF9IUDoKKyAgICAgICAgcmVwb3J0X2NhY2hlW1JFUF9IUF09dmFsOworICAgICAgICB0ZWxsX29iamVjdChNRSwgc3ByaW50ZihSRVBPUlRMSU5FLCByZXBvcnRfY2FjaGVbUkVQX0hQXSwKKyAgICAgICAgICByZXBvcnRfY2FjaGVbUkVQX1NQXSwgcmVwb3J0X2NhY2hlW1JFUF9QT0lTT05dKSk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gS1AgYmVyaWNodGVuOiBXZW5uIGRlciBTcGllbGVyIGRlbiBSZXBvcnQgZnJlaWdlc2NoYWx0ZXQgaGF0LAorICAgICAgLy8gd2lyZCBiZWkgQWVuZGVydW5nZW4gZ2VtZWxkZXQuIFdlbm4gbmljaHQsIGFlbmRlcnQgc2ljaCBudXIgZGVyCisgICAgICAvLyBDYWNoZS1FaW50cmFnLiBTbyB3aXJkIHZlcmhpbmRlcnQsIGRhc3MgZWluIFNwaWVsZXIgdWViZXIgS1AtCisgICAgICAvLyBWZXJhZW5kZXJ1bmdlbiBhdWNoIGRhbm4gaW5mb3JtaWVydCB3dWVyZGUsIHdlbm4gZXIgZGVuIEtQLVJlcG9ydAorICAgICAgLy8gZ2FyIG5pY2h0IGJlbnV0emVuIGtvZW5udGUuCisgICAgICBjYXNlIERPX1JFUE9SVF9TUDoKKyAgICAgICAgcmVwb3J0X2NhY2hlW1JFUF9TUF09dG9fc3RyaW5nKHZhbCk7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCBzcHJpbnRmKFJFUE9SVExJTkUsIHJlcG9ydF9jYWNoZVtSRVBfSFBdLAorICAgICAgICAgIHJlcG9ydF9jYWNoZVtSRVBfU1BdLCByZXBvcnRfY2FjaGVbUkVQX1BPSVNPTl0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBHaWZ0c3RhdHVzIGJlcmljaHRlbjogV2VubiBkZXIgR2lmdHJlcG9ydCBmcmVpZ2VzY2hhbHRldCBpc3QsCisgICAgICAvLyBDYWNoZSBha3R1YWxpc2llcmVuIHVuZCBiZXJpY2h0ZW4uIFdlbm4gbmljaHQsIGFlbmRlcnQgc2ljaCBudXIKKyAgICAgIC8vIGRlciBDYWNoZS1FaW50cmFnLiBFcmxhZXV0ZXJ1bmcgaGllcnp1IHMuby4gYmVpbSBLUC1SZXBvcnQuCisgICAgICBjYXNlIERPX1JFUE9SVF9QT0lTT046CisgICAgICAgIHJlcG9ydF9jYWNoZVtSRVBfUE9JU09OXSA9IGdldF9wb2lzb25fZGVzYyh2YWwpOworICAgICAgICB0ZWxsX29iamVjdChNRSwgc3ByaW50ZihSRVBPUlRMSU5FLCByZXBvcnRfY2FjaGVbUkVQX0hQXSwKKyAgICAgICAgICByZXBvcnRfY2FjaGVbUkVQX1NQXSwgcmVwb3J0X2NhY2hlW1JFUF9QT0lTT05dKSk7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gVm9yc2ljaHQtUmVwb3J0OiBrYW5uIG9obmUgd2VpdGVyZSBBYmZyYWdlbiBhdXNnZWdlYmVuIHdlcmRlbiwgZGEKKyAgICAgIC8vIGFsbGUgbm9ldGlnZW4gQ2hlY2tzIHNjaG9uIHp1IEJlZ2lubiBkaWVzZXIgRnVua3Rpb24gZXJsZWRpZ3Qgd3VyZGVuLgorICAgICAgLy8gTGVkaWdsaWNoIGRlciBJbmhhbHQgZGVyIE1lbGR1bmcgbXVzcyBhYmhhZW5naWcgdm9tIFNlaGVyc3RhdHVzCisgICAgICAvLyBrb25maWd1cmllcnQgd2VyZGVuLgorICAgICAgY2FzZSBET19SRVBPUlRfV0lNUFk6CisgICAgICAgIHN0cmluZyByZXM7CisgICAgICAgIGlmIChJU19TRUVSKE1FKSkgeworICAgICAgICAgIC8vIFF1ZXJ5UHJvcCgpIGF1cyBLb3N0ZW5ncnVlbmRlbiBpbSBpZigpLCBkYW1pdCBkaWUgQXVmcnVmLQorICAgICAgICAgIC8vIEhhZXVmaWdrZWl0IHp1bWluZGVzdCBlaW4gd2VuaWcgcmVkdXppZXJ0IHdpcmQuCisgICAgICAgICAgc3RyaW5nIGRpciA9IFF1ZXJ5UHJvcChQX1dJTVBZX0RJUkVDVElPTil8fCJrZWluZSI7CisgICAgICAgICAgcmVzID0gc3ByaW50ZihSRVBPUlRMSU5FX1dJTVBZLCB2YWwsIGRpcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHJlcyA9IHNwcmludGYoUkVQT1JUTElORV9XSU1QWSwgdmFsLCAiKG5pY2h0IHZlcmZ1ZWdiYXIpIik7CisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCByZXMpOworICAgICAgICBicmVhazsKKyAgICAgIC8vIEZsdWNodHJpY2h0dW5ncy1SZXBvcnQ6IHdpcmQgbnVyIGJlaSBTZWhlcm4gYXVzZ2VnZWJlbiwgZGFtaXQKKyAgICAgIC8vIG5pY2h0IGF1Y2ggU3BpZWxlciBlaW5lIFZTLS9GUi1NZWxkdW5nIGJla29tbWVuLCB3ZW5uIHouQi4gZWluZQorICAgICAgLy8gZXh0ZXJuZSBNYW5pcHVsYXRpb24gZGVyIEZsdWNodHJpY2h0dW5nIHN0YXR0ZmluZGV0LCBzaWUgYWJlciBkZW4KKyAgICAgIC8vIFJlcG9ydCBtYW5nZWxzIFNlaGVyc3RhdHVzIGdhciBuaWNodCBmcmVpZ2VzY2hhbHRldCBoYWJlbi4KKyAgICAgIGNhc2UgRE9fUkVQT1JUX1dJTVBZX0RJUjoKKyAgICAgICAgaWYgKElTX1NFRVIoTUUpKSB7CisgICAgICAgICAgaWYgKCF2YWwpIHZhbCA9ICJrZWluZSI7CisgICAgICAgICAgdGVsbF9vYmplY3QoTUUsc3ByaW50ZihSRVBPUlRMSU5FX1dJTVBZLCBRdWVyeVByb3AoUF9XSU1QWSksIHZhbCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICB9Cit9CisKKyN1bmRlZiBSRVBPUlRMSU5FCisjdW5kZWYgUkVQT1JUTElORV9XSU1QWQorI3VuZGVmIFJFUF9IUAorI3VuZGVmIFJFUF9TUAorI3VuZGVmIFJFUF9QT0lTT04KKworcHJpdmF0ZSBzdHJpbmcgcGVybXV0YXRlKHN0cmluZyBtc2cpCit7CisgIC8vIEtvbnRyb2xsemVpY2hlbiByYXVzZmlsdGVybi4gKnNldWZ6KgorICBtc2cgPSByZWdyZXBsYWNlKG1zZywiW1s6Y250cmw6XV0iLCIiLFJFX1BDUkV8UkVfR0xPQkFMKTsKKyAgb2JqZWN0IG9iPVF1ZXJ5UHJvcChQX1BFUk1fU1RSSU5HKTsKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gbXNnOworCisgIHJldHVybiAoc3RyaW5nKW9iLT5wZXJtdXRhdGVfc3RyaW5nKG1zZyl8fCIiOworfQorCisvLyBuZXVlIG5hY2hyaWNodCBhbiBkZW4gS29ib2xkIGFuaGFlbmdlbgorLy8gUnVlY2tnYWJld2VydGU6IE1TR19CVUZGRVJfRlVMTCBvZGVyIE1TR19CVUZGRVJFRAorcHJpdmF0ZSBpbnQgYWRkX3RvX2tvYm9sZChzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsIHN0cmluZyBtc2dfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0IG9yaWdpbikKK3sKKyAgLy8gTmFjaHJpY2h0IHNvbGwgaW0gS29ib2xkIGdlc3BlaWNoZXJ0IHdlcmRlbi4KKyAgLy8gS29ib2xkIHNwZWljaGVydCBSb2hkYXRlbiB1bmQgZ2lidCBzcGFldGVyIGRhcyBnYW56ZSBhdWNoIHdpZWRlciB2aWEKKyAgLy8gUmVjZWl2ZU1zZygpIGF1cyAtIGRhYmVpIHdpcmQgTVNHX0RPTlRfQlVGRkVSIHwgTVNHX0RPTlRfU1RPUkUgZ2VzZXR6LAorICAvLyBkYW1pdCBrZWluZSBlcm5ldXRlIFNwZWljaGVyIGluIEtvYm9sZCBvZGVyIEtvbW0tSGlzdG9yeSBlcmZvbGd0LgorCisgIC8vIHdlbm4gZGVyIFB1ZmZlciB6dSBrbGVpbiBpc3QsIEdyb2Vzc2UgdmVyZG9wcGVsbiwgd2VubiBub2NoIHVudGVyaGFsYgorICAvLyBkZXMgTGltaXRzLgorICBpZiAoa29ib2xkLT5pbmRleCA+PSBzaXplb2Yoa29ib2xkLT5idWYpLTEpIHsKKyAgICBpZiAoc2l6ZW9mKGtvYm9sZC0+YnVmKSA8IE1BWF9LT0JPTERfTElNSVQpCisgICAgICBrb2JvbGQtPmJ1ZiArPSBhbGxvY2F0ZShzaXplb2Yoa29ib2xkLT5idWYpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTVNHX0JVRkZFUl9GVUxMOworICB9CisgIGtvYm9sZC0+aW5kZXggPSBrb2JvbGQtPmluZGV4ICsxOworICAvLyBuZXVlIE5hY2hyaWNodCBhbiBkZW4gUHVmZmVyIGFuaGFlbmdlbi4KKyAgc3RyaW5nIHNlbmRlcm5hbWUgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9yaWdpbikgPworICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbi0+cXVlcnlfcmVhbF9uYW1lKCkgOgorICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbi0+bmFtZShXRVIpIHx8ICI8VW5iZWthbm50PiI7CisgIGtvYm9sZC0+YnVmW2tvYm9sZC0+aW5kZXhdID0gKDxtc2dfcz4gbXNnOiBtc2csCisgICAgICB0eXBlIDogbXNnX3R5cGUsIGFjdGlvbiA6IG1zZ19hY3Rpb24sIHByZWZpeCA6IG1zZ19wcmVmaXgsCisgICAgICBzZW5kZXJuYW1lIDogc2VuZGVybmFtZSk7CisgIHJldHVybiBNU0dfQlVGRkVSRUQ7Cit9CisKK3ByaXZhdGUgdm9pZCBfZmx1c2hfY2FjaGUoaW50IHZlcmJvc2UpIHsKKyAgLy8gbnVyIG1pdCBnZW51ZyBFdmFsdGlja3MgYXVzZ2ViZW4uCisgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDApIHJldHVybjsKKyAgaWYgKGtvYm9sZC0+aW5kZXggPj0gMCkKKyAgeworICAgIFJlY2VpdmVNc2coIkVpbiBrbGVpbmVyIEtvYm9sZCB0ZWlsdCBEaXIgZm9sZ2VuZGVzIG1pdDoiLAorICAgICAgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX0lHTk9SRXxNU0dfRE9OVF9CVUZGRVIsCisgICAgICAgICAgICAgICAwLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgICBpbnQgcHJlcGVuZCA9IFF1ZXJ5UHJvcChQX01FU1NBR0VfUFJFUEVORCk7CisgICAgZm9yZWFjaChpbnQgaTogMCAuLiBrb2JvbGQtPmluZGV4KSAvLyAnMCAuLicgaXN0IHdpY2h0aWchCisgICAgeworICAgICAgc3RydWN0IG1zZ19zIG1zZyA9IGtvYm9sZC0+YnVmW2ldOworICAgICAgLy8gZGllcyBpc3QgZGllbnQgZGVyIEZlaGxlcmFic2ljaGVydW5nLCBmYWxscyBlcyBuZW4gRmVobGVyICh6LkIuIFRMRSkKKyAgICAgIC8vIGluIGRlciBTY2hsZWlmZSB1bnRlbiBnYWI6IGRhbm4gaXN0IGluZGV4IG5pY2h0IGF1ZiAtMSBnZXNldHp0CisgICAgICAvLyB3b3JkZW4sIGFiZXIgZWluaWdlIE5hY2hyaWNodGVuIHNpbmQgc2Nob24gZ2Vsb2VzY2h0LgorICAgICAgaWYgKCFzdHJ1Y3RwKG1zZykpIGNvbnRpbnVlOworICAgICAgLy8gQXVzZ2FiZSB2aWEgZWZ1bjo6dGVsbF9vYmplY3QoKSwgd2VpbCBkaWUgQXJiZWl0IHZvbiBSZWNlaXZlTXNnKCkKKyAgICAgIC8vIHNjaG9uIGdldGFuIHd1cmRlLiBBbGxlcmRpbmdzIG11ZXNzZW4gd2lyIHVucyBub2NoIHVtIGRlbiBVTWJydWNoCisgICAgICAvLyBrdWVtbWVybi4KKyAgICAgIGlmICgobXNnLT50eXBlKSAmIE1TR19ET05UX1dSQVApCisgICAgICAgIG1zZy0+bXNnID0gKG1zZy0+cHJlZml4ID8gbXNnLT5wcmVmaXggOiAiIikgKyBtc2ctPm1zZzsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgaW50IGJzZmxhZ3MgPSBtc2ctPnR5cGUgJiBNU0dfQUxMX0JTX0ZMQUdTOworICAgICAgICBpZiAocHJlcGVuZCkKKyAgICAgICAgICBic2ZsYWdzIHw9IEJTX1BSRVBFTkRfSU5ERU5UOworICAgICAgICBtc2ctPm1zZyA9IGJyZWFrX3N0cmluZyhtc2ctPm1zZywgNzgsIG1zZy0+cHJlZml4LCBic2ZsYWdzKTsKKyAgICAgIH0KKyAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIG1zZy0+bXNnKTsKKyAgICAgIGtvYm9sZC0+YnVmW2ldPTA7CisgICAgfQorICAgIGtvYm9sZC0+aW5kZXg9LTE7CisgIH0KKyAgZWxzZSBpZiAodmVyYm9zZSkKKyAgeworICAgIFJlY2VpdmVNc2coIkRlciBrbGVpbmUgS29ib2xkIGhhdCBsZWlkZXIgbmljaHRzIE5ldWVzIGZ1ZXIgRGljaC4iLAorICAgICAgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX0lHTk9SRXxNU0dfRE9OVF9CVUZGRVIsCisgICAgICAgICAgICAgICAwLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgfQorfQorCit2YXJhcmdzIGludCBjbWRfa29ib2xkKHN0cmluZyBhcmcpCit7CisgIHN3aXRjaChhcmcpCisgIHsKKyAgICBjYXNlICJlaW4iOgorICAgICAgU2V0UHJvcChQX0JVRkZFUiwgMSk7CisgICAgICBwcmludGYoIkRlciBLb2JvbGQgbWVya3Qgc2ljaCBqZXR6dCBhbGxlcyFcbiIpOyBicmVhazsKKyAgICBjYXNlICJhdXMiOgorICAgICAgU2V0UHJvcChQX0JVRkZFUiwgMCk7CisgICAgICBwcmludGYoIkRlciBLb2JvbGQgd2lyZCBEaWNoIG5pY2h0IHN0b2VyZW4hXG4iKTsgYnJlYWs7CisgICAgZGVmYXVsdDogaWYoYXJnKSBwcmludGYoIkRlciBLb2JvbGQgc2FndDoga29ib2xkIGVpbiBvZGVyIGtvYm9sZCBhdXNcbiIpOworICB9CisgIF9mbHVzaF9jYWNoZSgxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgVGVzdElnbm9yZVNpbXBsZShzdHJpbmcgKmFyZykKK3sgICBzdHJpbmcgKmlnbm9yZTsKKworICAgIGlmICghcG9pbnRlcnAoYXJnKSB8fCAhbWFwcGluZ3AoaWdub3JlPVF1ZXJ5KFBfSUdOT1JFLEZfVkFMVUUpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yZWFjaChzdHJpbmcgczogYXJnKQorICAgIHsKKyAgICAgIGlmIChtZW1iZXIoaWdub3JlLHMpKQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzogZGVwcmVjYXRlZCAtIGVudGZlcm5lbiwgd2VubiBNZXNzYWdlKCkgZW50ZmVybnQgd2lyZC4KK3ByaXZhdGUgaW50IGNoZWNrX2lnbm9yZShtaXhlZCBpZ25vcmUsIHN0cmluZyB2ZXJiLCBzdHJpbmcgbmFtZSkKK3sKKyAgaWYgKGlnbm9yZSA9PSB2ZXJiKQorICAgIHJldHVybiAxOworICBpZ25vcmUgPSBleHBsb2RlKGlnbm9yZSwgIi4iKTsKKyAgcmV0dXJuICgoc2l6ZW9mKGlnbm9yZSkgPiAxKSAmJgorICAgICAobmFtZSA9PSBpZ25vcmVbMF0gJiYgbWVtYmVyKGlnbm9yZVsxLi5dLCB2ZXJiKSAhPSAtMSkpOworfQorCitwcml2YXRlIGludCBjb21tX2JlZXAoKSB7CisgIGlmIChRdWVyeVByb3AoUF9WSVNVQUxCRUxMKSkgcmV0dXJuIDA7IC8vIGtlaW4gdG9uCisgIGludCBiZWVwX2ludGVydmFsPShpbnQpUXVlcnlQcm9wKFBfTUVTU0FHRV9CRUVQKTsKKyAgaWYgKCFiZWVwX2ludGVydmFsIHx8ICgodGltZSgpLWxhc3RfYmVlcF90aW1lKSA8IGJlZXBfaW50ZXJ2YWwpKSByZXR1cm4gMDsKKyAgbGFzdF9iZWVwX3RpbWU9dGltZSgpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHZvaWQgYWRkX3RvX3RlbGxfaGlzdG9yeSggc3RyaW5nIHVpZCwgaW50IHNlbnQsIGludCByZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1lc3NhZ2UsIHN0cmluZyBpbmRlbnQsIGludCBmbGFncyApCit7CisgIC8qIHRlbGxfaGlzdG9yeSBpc3QgZWluIE1hcHBpbmcgbWl0IFVJRHMgZGVyIEdlc3ByYWVjaHNwYXJ0bmVyIGFscyBLZXkuCisgICAgIEFscyBXZXJ0IGlzdCBlaW5lIFN0cnVrdXIgdm9tIFR5cCBjaGF0X3MgZWluZ2V0cmFnZW4uCisgICAgIFN0cnVrdHVyZW4gY2hhdF9zIHVuZCBzdG9yZWRfbXNnX3Mgc2luZCBpbiAvc3RkL3BsYXllci9jb21tX3N0cnVjdHMuYworICAgICBkZWZpbmllcnQuCisgICAgIFRPRE8gZnVlciBzcGFldGVyLCBnZXJhZGUga2VpbmUgWmVpdCBmdWVyOgorICAgICBBbHMgV2VydCBpc3QgZWluIEFycmF5IHZvbiBjaGF0X3MgZW50aGFsdGVuLCB3b2JlaSBkYXMgMC4gRWxlbWVudCBkYXMKKyAgICAgamV3ZWlscyBqdWVuZ3N0ZSBHZXNwcmFlY2ggbWl0IGRpZXNlbSBHZXNwcmFlY2hzcGFydG5lciBpc3QgdW5kIGFsbGUKKyAgICAgd2VpdGVyZW4gRWxlbWVudGUgaW4gZGVyIHplaXRsaWNoZW4gUmVpaGVuZm9sZ2Uga29tbWVuIChhbHNvIGxldHp0ZXMKKyAgICAgRWxlbWVudCBpc3QgYWVsdGVzdGVzIEdlc3ByYWVjaCkuCisgICAgICovCisKKyAgLy9UT0RPOiBFbnRmZXJuZW4sIHdlbm4gZGFzIG5pY2h0IG1laHIgcGFzc2llcnQuCisgIGlmICghc3RyaW5ncCh1aWQpKQorICB7CisgICAgUmVjZWl2ZU1zZyhzcHJpbnRmKAorICAgICAgIlxuYWRkX3RvX3RlbGxfaGlzdG9yeSgpOiBnb3QgYmFkIHVpZCBhcmd1bWVudCAlTy4iCisgICAgICAic2VudDogJWQsIHJlY3Y6ICVkLCBmbGFnczogJWQsIG1zZzogJXMiLCAKKyAgICAgIHVpZCwgc2VudCwgcmVjdiwgZmxhZ3MsIG1lc3NhZ2UpLE1UX0RFQlVHfE1TR19CU19MRUFWRV9MRlMsMCwwLE1FKTsgICAgICAgICAgICAgIAorICB9CisgIAorICAvLyBsZXR6dGVuIEdlc3ByYWVjaHNwYXJ0bmVyIGZ1ZXIgZXJ3aWRlcmUuCisgIGlmICghKGZsYWdzICYgTVNHRkxBR19SRU1PVEUpKQorICAgIGxhc3RfY29tbV9wYXJ0bmVyID0gdWlkOworCisgIC8vIGlzdCBlaW4gc29ydGllcnRlcyBBcnJheSB2b24gbWF4LiBNQVhfU0FWRURfQ0hBVFMgR3JvZXNzZSwgd2VsY2hlcyBkaWUKKyAgLy8gU3BpZWxlciBlbnRoYWVsdCwgZGVuZW4gbWFuIHNjaG9uIHdhcyBtaXRnZXRlaWx0IGhhdC4gQWt0dWVsbHN0ZSBhbQorICAvLyBBbmZhbmcuCisgIGlmIChzZW50KSB7CisgICAgaWYgKCFzaXplb2YoY29tbXJlY2VpdmVycykpCisgICAgICBjb21tcmVjZWl2ZXJzID0gKHt1aWR9KTsKKyAgICBlbHNlIGlmIChjb21tcmVjZWl2ZXJzWzBdICE9IHVpZCkgeworICAgICAgLy8gbnVyIHdlbm4gZGVyIGFrdHVlbGxlIFBhcnRuZXIgbmljaHQgYW0gQW5mYW5nIHN0ZWh0LCBtdXNzIG1hbiBoaWVyIHdhcworICAgICAgLy8gdHVuLiBDb21tLVBhcnRuZXIgYW4gZGVuIEFuZmFuZyBzdGVsbGVuIHVuZCBnZ2YuIGFsdGVuIEVpbnRyYWcKKyAgICAgIC8vIGVudGZlcm5lbi4KKyAgICAgIC8vIFRPRE86IEVmZml6aWVudGVyIGdlc3RhbHRlbi4KKyAgICAgIGNvbW1yZWNlaXZlcnMgPSAoe3VpZH0pICsgKGNvbW1yZWNlaXZlcnMtKHt1aWR9KSk7CisgICAgICAvLyBnZ2YuIGt1ZXJ6ZW4uICh3ZW5uICF0ZWxsX2hpc3RvcnlfZW5hYmxlZCwgd2lyZCBlcyBnZ2YuIHVudGVuCisgICAgICAvLyBnZW1hY2h0LCBkZW5uIGRpZSBIaXN0IG11c3MgbWluLiBhbGxlIFVJRCBlbnRoYWx0ZW4sIGRpZSBhdWNoIGluCisgICAgICAvLyBjb21tcmVjZWl2ZXJzIGRyaW4gc2luZC4pCisgICAgICBpZiAoIXRlbGxfaGlzdG9yeV9lbmFibGVkICYmIHNpemVvZihjb21tcmVjZWl2ZXJzKSA+IE1BWF9TQVZFRF9DSEFUUykKKyAgICAgICAgY29tbXJlY2VpdmVycyA9IGNvbW1yZWNlaXZlcnNbMC4uTUFYX1NBVkVEX0NIQVRTXTsKKyAgICB9CisgIH0KKworICBpZiAoIXRlbGxfaGlzdG9yeV9lbmFibGVkKQorICAgIHJldHVybjsKKworICBpZiAoIWluZGVudCAmJiBtZXNzYWdlWzwxXSA9PSAxMCkKKyAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWy4uPDJdOworCisgIHN0cnVjdCBjaGF0X3MgY2hhdDsKKyAgLy8gR2VzcHJhZWNoc3BhcnRuZXIgdW5iZWthbm50PworICBpZiAoIW1lbWJlcih0ZWxsX2hpc3RvcnksIHVpZCkpIHsKKyAgICAvLyB6dXZpZWxlIEdlc3ByYWVjaGUgaW4gSGlzdD8gPj0gaXN0IEFic2ljaHQgd2VpbCBqYSBnbGVpY2ggbm9jaCBlaW5zCisgICAgLy8gZGF6dSBrb21tdC4KKyAgICBpZiAoc2l6ZW9mKHRlbGxfaGlzdG9yeSkgPj0gTUFYX1NBVkVEX0NIQVRTKSB7CisgICAgICBzdHJpbmcgZGVsdWlkOworICAgICAgaW50IHplaXQgPSBfX0lOVF9NQVhfXzsKKyAgICAgIGZvcmVhY2goc3RyaW5nIHR1aWQsIGNoYXQgOiB0ZWxsX2hpc3RvcnkpIHsKKyAgICAgICAgLy8gYWVsdGVzdGVzIEdlc3ByYWVjaCBzdWNoZW4KKyAgICAgICAgaWYgKHplaXQgPiBjaGF0LT50aW1lX2xhc3RfbXNnKSB7CisgICAgICAgICAgZGVsdWlkID0gdHVpZDsKKyAgICAgICAgICB6ZWl0ID0gY2hhdC0+dGltZV9sYXN0X21zZzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gYWVsdGVzdGVzIEdlc3ByYWVjaCByYXVzLgorICAgICAgbV9kZWxldGUodGVsbF9oaXN0b3J5LCBkZWx1aWQpOworICAgICAgaWYgKG1lbWJlcihjb21tcmVjZWl2ZXJzLGRlbHVpZCk+LTEpCisgICAgICAgIGNvbW1yZWNlaXZlcnMtPSh7ZGVsdWlkfSk7CisgICAgfQorICAgIC8vIG5ldWVzIEdlc3ByYWVjaCBhbmxlZ2VuCisgICAgY2hhdCA9ICg8Y2hhdF9zPiB1aWQ6IHVpZCwgdGltZV9maXJzdF9tc2c6IHRpbWUoKSwgCisgICAgICAgICAgICAgICB0aW1lX2xhc3RfbXNnOiB0aW1lKCksCisgICAgICAgICBzZW50Y291bnQ6IHNlbnQsIHJlY3Zjb3VudDogcmVjdiwKKyAgICAgICAgIG1zZ2J1ZjogMCwgcHRyOiAwICk7CisgICAgdGVsbF9oaXN0b3J5W3VpZF0gPSBjaGF0OworICB9CisgIGVsc2UgeworICAgIC8vIEdlc3ByYWVjaHNwYXJ0bmVyIGJla2FubnQsIGFsdGVzIEdlc3ByYWVjaCB3ZWl0ZXJiZW51dHplbgorICAgIGNoYXQgPSB0ZWxsX2hpc3RvcnlbdWlkXTsKKyAgICBjaGF0LT50aW1lX2xhc3RfbXNnID0gdGltZSgpOworICAgIGNoYXQtPnNlbnRjb3VudCArPSBzZW50OworICAgIGNoYXQtPnJlY3Zjb3VudCArPSByZWN2OworICB9CisKKyAgaWYgKHRlbGxfaGlzdG9yeV9lbmFibGVkIDwgVEVMTEhJU1RfRU5BQkxFRCkKKyAgICByZXR1cm47CisKKyAgLy8gZ2dmLiBBcnJheSBmdWVyIE1lc3NhZ2VzIGFubGVnZW4KKyAgaWYgKCFwb2ludGVycChjaGF0LT5tc2didWYpKQorICAgIGNoYXQtPm1zZ2J1ZiA9IGFsbG9jYXRlKE1BWF9TQVZFRF9NRVNTQUdFUyk7CisKKyAgLy8gTWVzc2FnZS1TdHJ1a3R1ciBlcm1pdHRlbG4gb2RlciBuZXUgYW5sZWdlbgorICBzdHJ1Y3Qgc3RvcmVkX21zZ19zIG1zZzsKKyAgaWYgKCFzdHJ1Y3RwKGNoYXQtPm1zZ2J1ZltjaGF0LT5wdHJdKSkgeworICAgIC8vIG5ldWUgU3RydWN0IGlucyBBcnJheSBzY2hyZWliZW4KKyAgICBjaGF0LT5tc2didWZbY2hhdC0+cHRyXSA9IG1zZyA9ICg8c3RvcmVkX21zZ19zPik7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gYWx0ZSBTdHJ1Y3QgdWViZXJzY2hyZWliZW4KKyAgICBtc2cgPSBjaGF0LT5tc2didWZbY2hhdC0+cHRyXTsKKyAgfQorICAvLyBJbmRleCBhdWYgbmFlY2hzdGUgTWVzc2FnZXN0cnVrdHVyIGVybWl0dGVsbgorICBjaGF0LT5wdHIgPSAoY2hhdC0+cHRyICsgMSkgJSBNQVhfU0FWRURfTUVTU0FHRVM7CisgIC8vIE1lc3NhZ2Ugc3BlaWNoZXJuCisgIG1zZy0+bXNnID0gbWVzc2FnZTsKKyAgbXNnLT5wcmVmaXggPSBpbmRlbnQ7CisgIG1zZy0+dGltZXN0YW1wID0gdGltZSgpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjbGVhcl90ZWxsX2hpc3RvcnkoKQoreworICAvKiBOYWNoIGVpbmVtICJzY2hsYWZlIGVpbiIgd2VyZGVuIGRpZSBnZXNwZWljaGVydGVuIE1pdHRlaWx1bmdlbiBnZWxvZXNjaHQsCisgICAgIHNvZmVybiBkZXIgU3BpZWxlciBuaWNodHMgYWJ3ZWljaGVuZGVzIGVpbmdlc3RlbGx0IGhhdC4gKi8KKworI2lmZGVmIFRFTExISVNUX0xPTkdMSUZFCisgIGlmICh0ZWxsX2hpc3RvcnlfZW5hYmxlZCA9PSBURUxMSElTVF9MT05HTElGRSkKKyAgICByZXR1cm47CisjZW5kaWYKKworICBmb3JlYWNoIChzdHJpbmcgdWlkLCBzdHJ1Y3QgY2hhdF9zIGNoYXQ6IHRlbGxfaGlzdG9yeSkKKyAgICBpZiAocG9pbnRlcnAoY2hhdC0+bXNnYnVmKSkgeworICAgICAgY2hhdC0+bXNnYnVmID0gMDsKKyAgICAgIGNoYXQtPnB0ciA9IDA7CisgICAgfQorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCh2b2lkKQoreworICAvKiBXaXJkIDE1IE1pbnV0ZW4gbmFjaCBkZW0gVmVybHVzdCBkZXIgVmVyYmluZHVuZyBhdWZnZXJ1ZmVuLiBGYWxscyBkZXIKKyAgICAgU3BpZWxlciBuaWNodCBpbnp3aXNjaGVuIGVpbmUgVmVyYmluZHVuZyB3aWVkZXJoZXJnZXN0ZWxsdCBoYXQsIHdlcmRlbgorICAgICB3aWUgYmVpIGVpbmVtICJzY2hsYWZlIGVpbiIgZGllIE1pdHRlaWx1bmdlbiBnZWxvZXNjaHQuICovCisKKyAgaWYgKCFpbnRlcmFjdGl2ZSgpKQorICAgIGNsZWFyX3RlbGxfaGlzdG9yeSgpOworCit9CisKKy8vIGdlcnVmZW4sIHdlbm4gemllbGdlcmljaHRldCBtaXQgamVtYW5kZW0ga29tbXVuaXppZXJ0IHdpcmQgX3VuZF8gZGFzCisvLyBFcmdlYm5pcyBkZXMgUmVjZWl2ZU1zZygpIGdlcHJ1ZWZ0IHdlcmRlbiB1bmQgZWluZSBNZWxkdW5nIGF1c2dlZ2ViZW4KKy8vIHdlcmRlbiBzb2xsLgorcHJpdmF0ZSB2b2lkIF9zZW5kKG9iamVjdCBvYiwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCkKK3sKKyAgaW50IHJlcyA9IG9iLT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIE1FKTsKKyAgc3dpdGNoKHJlcykgeworICAgIGNhc2UgTVNHX0RFTElWRVJFRDoKKyAgICAgIGJyZWFrOyAgLy8gbml4IG1hY2hlbgorICAgIGNhc2UgTVNHX0JVRkZFUkVEOgorICAgICAgUmVjZWl2ZU1zZyhvYi0+TmFtZShXRVIpICsgIiBtb2VjaHRlIGdlcmFkZSBuaWNodCBnZXN0b2VydCB3ZXJkZW4uIgorICAgICAgICAgICJEaWUgTWl0dGVpbHVuZyB3dXJkZSB2b24gZWluZW0ga2xlaW5lbiBLb2JvbGQgaW4gRW1wZmFuZyAiCisgICAgICAgICAgImdlbm9tbWVuLiBFciB3aXJkIHNpZSBzcGFldGVyIHdlaXRlcmxlaXRlbiEiLAorICAgICAgICAgIE1UX05PVElGSUNBVElPTiwgbXNnX2FjdGlvbiwgMCwgdGhpc19vYmplY3QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1TR19JR05PUkVEOgorICAgIGNhc2UgTVNHX1ZFUkJfSUdOOgorICAgIGNhc2UgTVNHX01VRF9JR046CisgICAgICBSZWNlaXZlTXNnKG9iLT5OYW1lKFdFUikgKyAiIGhvZXJ0IGdhciBuaWNodCB6dSwgd2FzIER1IHNhZ3N0LiIsCisgICAgICAgICAgIE1UX05PVElGSUNBVElPTiwgbXNnX2FjdGlvbiwgMCwgdGhpc19vYmplY3QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1TR19TRU5TRV9CTE9DSzoKKyAgICAgIFJlY2VpdmVNc2cob2ItPk5hbWUoV0VSKSArICIga2FubiBEaWNoIGxlaWRlciBuaWNodCB3YWhybmVobWVuLiIsCisgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OLCBtc2dfYWN0aW9uLCAwLCB0aGlzX29iamVjdCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTVNHX0JVRkZFUl9GVUxMOgorICAgICAgUmVjZWl2ZU1zZyhvYi0+TmFtZShXRVIpICsgIiBtb2VjaHRlIGdlcmFkZSBuaWNodCBnZXN0b2VydCB3ZXJkZW4uIgorICAgICAgICAgICJEaWUgTWl0dGVpbHVuZyBnaW5nIHZlcmxvcmVuLCBkZW5uIGRlciBLb2JvbGQga2FubiBzaWNoICIKKyAgICAgICAgICAibmljaHRzIG1laHIgbWVya2VuISIsIE1UX05PVElGSUNBVElPTiwgbXNnX2FjdGlvbiwgCisgICAgICAgICAgMCwgdGhpc19vYmplY3QoKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgUmVjZWl2ZU1zZyhvYi0+TmFtZShXRVIpICsgIiBoYXQgRGVpbmUgTmFjaHJpY2h0IGxlaWRlciBuaWNodCAiCisgICAgICAgICAgIm1pdGJla29tbWVuLiIsIE1UX05PVElGSUNBVElPTiwgbXNnX2FjdGlvbiwgMCwgdGhpc19vYmplY3QoKSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvLyBBdXNnYWJlIGFuIGRhcyBPYmpla3Qgc2VsYmVyIHVuZCBBdWZ6ZWljaG51bmcgaW4gZGVyIEtvbW1oaXN0b3J5LCBmYWxscworLy8gbm9ldGlnLiBXaXJkIGJlaSBfYXVzZ2VoZW5kZW5fIE5hY2hyaWNodGVuIGltIGVpZ2VuZW4gT2JqZWt0IGdlcnVmZW4sIGRhbWl0CisvLyBkaWUgTmFjaHJpY2h0IGdnZi4gaW4gZGVuIEtvbW1oaXN0b3J5IGVyZmFzc3Qgd2lyZC4KKy8vIFRPRE86IGVudGZlcm5lbiwgd2VubiBhbGxlcyBBdWZydWZlciBlcnNldHp0IHNpbmQgZHVyY2ggUmVjZWl2ZU1zZygpLgorcHJvdGVjdGVkIHZhcmFyZ3MgaW50IF9yZWN2KG9iamVjdCBvYiwgc3RyaW5nIG1lc3NhZ2UsIGludCBmbGFnLCBzdHJpbmcgaW5kZW50KQoreworICB3cml0ZShicmVha19zdHJpbmcobWVzc2FnZSwgNzgsIGluZGVudCwKKyAgICAgICAgUXVlcnlQcm9wKFBfTUVTU0FHRV9QUkVQRU5EKSA/IEJTX1BSRVBFTkRfSU5ERU5UIDogMCkpOworICBpZiAoKGZsYWcgJiBNU0dGTEFHX1RFTEwgfHwgZmxhZyAmIE1TR0ZMQUdfUkVNT1RFKSAmJgorICAgICAgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBpZiAoZmxhZyAmIE1TR0ZMQUdfV0hJU1BFUikKKyAgICAgIGFkZF90b190ZWxsX2hpc3RvcnkoZ2V0dWlkKG9iKSwgMSwgMCwKKyAgICAgICAgIkR1IGZsdWVzdGVyc3QgIiArIG9iLT5uYW1lKFdFTSkgKyAiIGF1cyBkZXIgRmVybmUgZXR3YXMgenUuIiwgMCwKKyAgICAgICAgZmxhZyk7CisgICAgZWxzZQorICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeShnZXR1aWQob2IpLCAxLCAwLCBtZXNzYWdlLCBpbmRlbnQsIGZsYWcpOworICB9CisgIHJldHVybiAxOworfQorCisvLyA8c2VuZGVyPiBzb2xsdGUgZWluIE9iamVrdCBzZWluLiBJbiBzZWx0ZW5lbiBGYWVsbGVuICh6LkIuCisvLyBGZWhsZXJiZWhhbmRsdW5nKSBpc3QgZXMgamVkb2NoIGF1Y2ggbWFsIGVpbiBTdHJpbmcuCit2YXJhcmdzIGludCBNZXNzYWdlKHN0cmluZyBtc2csIGludCBmbGFnLCBzdHJpbmcgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY25hbWUsIG1peGVkIHNlbmRlcikKK3sKKyAgb2JqZWN0IHRpOworICBzdHJpbmcgdmVyYiwgcmVwbHksICppZ25vcmUsIHRpbjsKKyAgaW50IGVtLCB0ZTsKKyAgbWl4ZWQgZGVhZjsKKworICAvLyBCZWkgZGVuIEthbmFlbGVuICdEZWJ1ZycgdW5kICdFbnR3aWNrbHVuZycga2FubiBtYW4gZ2V6aWVsdCBCdWdzCisgIC8vIGVpbnplbG5lciBNYWdpZXIgaWdub3JpZXJlbi4gRGF6dSB3aXJkIGRlciBLYW5hbG5hbWUgenVtICd2ZXJiJywKKyAgLy8gZGFtaXQgJ2lnbm9yaWVyZSBuYW1lLmRlYnVnJyBmdW5rdGlvbmllcnQuCisgIGlmKCBmbGFnID09IE1TR0ZMQUdfQ0hBTk5FTCApeworICAgICAgaWYoKG1zZ1sxLi41XSA9PSAiRGVidWciIHx8IG1zZ1sxLi4xMV0gPT0gIkVudHdpY2tsdW5nIgorICAgICAgICAgICAgfHwgbXNnWzEuLjldPT0iV2FybnVuZ2VuIikpCisgICAgICB7CisgICAgICAgIC8vIE1pc3NicmF1Y2ggZGVyIFZhcmlhYmxlICdpZ25vcmUnIGFscyBad2lzY2hlbnNwZWljaGVyCisgICAgICAgIGlnbm9yZSA9IHJlZ2V4cGxvZGUoIG1zZywgIjp8IHxcXF0iICk7CisgICAgICAgIHZlcmIgPSBsb3dlcl9jYXNlKGlnbm9yZVswXVsxLi5dKTsKKyAgICAgICAgdGluID0gbG93ZXJfY2FzZShpZ25vcmVbMl0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZihjbmFtZSkKKyAgICAgICAgICB2ZXJiPWxvd2VyX2Nhc2UoY25hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgdmVyYj1xdWVyeV92ZXJiKCk7CisgICAgICAgIGlmKCB0aSA9IHRoaXNfaW50ZXJhY3RpdmUoKSApCisgICAgICAgIHsKKyAgICAgICAgICB0aW4gPSBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvL2ZhbGxzIGRvY2gga2VpbiBPYmpla3QuLi4KKyAgICAgICAgICBpZiAob2JqZWN0cChzZW5kZXIpKQorICAgICAgICAgICAgdGluPWxvd2VyX2Nhc2Uoc2VuZGVyLT5uYW1lKFJBVyl8fCI8VW5iZWthbm50PiIpOworICAgICAgICB9CisgICAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYoIHRpID0gdGhpc19pbnRlcmFjdGl2ZSgpICkKKyAgICAgIHRpbiA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgIHZlcmIgPSBxdWVyeV92ZXJiKCk7CisgIH0KKworICB0ZSA9IGZsYWcgJiAoTVNHRkxBR19URUxMIHwgTVNHRkxBR19XSElTUEVSKTsKKworICAvLyBmdWVyICJlcndpZGVyZSIKKyAgaWYgKHRpICYmIChmbGFnICYgTVNHRkxBR19URUxMIHx8IGZsYWcgJiBNU0dGTEFHX1JFTU9URSkpIHsKKyAgICBpZiAoIXRpLT5RdWVyeVByb3AoUF9JTlZJUyl8fElTX0xFQVJORVIoTUUpKSB7CisgICAgICBpZiAoZmxhZyAmIE1TR0ZMQUdfV0hJU1BFUikKKyAgICAgICAgYWRkX3RvX3RlbGxfaGlzdG9yeShnZXR1aWQodGkpLCAwLCAxLAorICAgICAgICAgIGNhcGl0YWxpemUoKCgoSVNfTEVBUk5FUih0aSkgJiYgIXRpLT5RdWVyeVByb3AoUF9JTlZJUykgJiYKKyAgICAgICAgICAgICh0aS0+UXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSAmIENBTl9QUkVTQVkpKSA/CisgICAgICAgICAgICB0aS0+UXVlcnlQcm9wKFBfUFJFU0FZKSA6ICIiKSArIHRpLT5uYW1lKCkpIHx8ICIiKSArCisgICAgICAgICAgIiBmbHVlc3RlcnQgRGlyIGF1cyBkZXIgRmVybmUgZXR3YXMgenUuIiwgMCwgZmxhZywgMCk7CisgICAgICBlbHNlCisgICAgICAgIGFkZF90b190ZWxsX2hpc3RvcnkoZ2V0dWlkKHRpKSwgMCwgMSwgbXNnLCBpbmRlbnQsIGZsYWcsIDApOworICAgIH0KKyAgfQorICAvLyBIb2VydCBkZXIgU3BpZWxlciBuaWNodD8KKyAgZW0gPSAodGkgJiYKKyAgICAgICAgKHRlIHx8IGZsYWcgJiBNU0dGTEFHX1NIT1VUKSAmJgorICAgICAgICAoUXVlcnlQcm9wKFBfRUFSTVVGRlMpICYmCisgICAgICAgICAgKHF1ZXJ5X3dpel9sZXZlbCh0aSkgPCBRdWVyeVByb3AoUF9FQVJNVUZGUykpKSk7CisgIGlnbm9yZSA9IChwb2ludGVycChpZ25vcmUgPSBRdWVyeVByb3AoUF9JR05PUkUpKSA/IGlnbm9yZSA6ICh7fSkpOworCisgIC8vIFdlcmRlbiBkZXIgU2VuZGVyIG9kZXIgZGFzIFZlcmIgaWdub3JpZXJ0PworICBpZighdGkgJiYgdGluICYmIGZsYWcgPT0gTVNHRkxBR19DSEFOTkVMKQorICB7CisgICAgIGlmKChtZW1iZXIoaWdub3JlLCB0aW4pICE9IC0xKSkKKyAgICAgeworICAgICAgIHJldHVybiBNRVNTQUdFX0lHTk9SRV9ZT1U7CisgICAgIH0KKyAgICAgaWYodmVyYiAmJiAgc2l6ZW9mKGZpbHRlcihpZ25vcmUsICMnY2hlY2tfaWdub3JlLCB2ZXJiLCB0aW4pKSApCisgICAgIHsKKyAgICAgICByZXR1cm4gTUVTU0FHRV9JR05PUkVfWU9VOworICAgICB9CisgIH0KKyAgaWYgKHRpICYmIChtZW1iZXIoaWdub3JlLCBnZXR1aWQodGkpKSAhPSAtMSkpIHsKKyAgICBpZih0ZSAmJiAoSVNfTEVBUk5FUih0aSl8fCFRdWVyeVByb3AoUF9JTlZJUykpKQorICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGksIGNhcGl0YWxpemUobmFtZSgpKSsKKyAgICAgICAgICAgICAgICAgICAgICAiIGhvZXJ0IGdhciBuaWNodCB6dSwgd2FzIER1IHNhZ3N0LlxuIik7CisgICAgcmV0dXJuIE1FU1NBR0VfSUdOT1JFX1lPVTsKKyAgfQorICBpZih0aW4gJiYgdmVyYiAmJgorICAgICBzaXplb2YoZmlsdGVyKGlnbm9yZSwgIydjaGVja19pZ25vcmUvKicqLywgdmVyYiwgdGluKSkpCisgIHsKKyAgICBpZih0aSAmJiB2ZXJiWzAuLjJdICE9ICJydWYiICYmIHZlcmJbMC4uM10gIT0gIm1ydWYiICYmCisgICAgICAgdmVyYlswLi4zXSAhPSAiZWNobyIgJiYgdmVyYlswXSAhPSAnLScgJiYgIShmbGFnICYgTVNHRkxBR19DSEFOTkVMKSApCisgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aSwgbmFtZSgpKyIgd2VocnQgXCIiK3ZlcmIrIlwiIGFiLlxuIik7CisgICAgcmV0dXJuIE1FU1NBR0VfSUdOT1JFX1ZFUkI7CisgIH0KKyAgaWYgKGZsYWcgJiBNU0dGTEFHX1JURUxMKSB7CisgICAgaW50IGF0OworCisgICAgdmVyYiA9IGxvd2VyX2Nhc2Uob2xkX2V4cGxvZGUobXNnLCAiICIpWzBdWzEuLl0pOworICAgIGF0ID0gbWVtYmVyKHZlcmIsICdAJyk7CisgICAgLyogdmVyYiB3aXJkIGhpZXIgZWggbWlzc2JyYXVjaHQsIGFsc28gYXVjaCBmdWVyIGVpbiBpbnRlcm11ZC1lcndpZGVyZSovCisgICAgYWRkX3RvX3RlbGxfaGlzdG9yeSh2ZXJiLCAwLCAxLCBtc2csIGluZGVudCwgZmxhZywgMCk7CisKKyAgICBpZiAoKG1lbWJlcihpZ25vcmUsIHZlcmIpID49IDApIHx8IChtZW1iZXIoaWdub3JlLHZlcmJbMC4uYXRdKSA+PSAwKSkKKyAgICAgIHJldHVybiBNRVNTQUdFX0lHTk9SRV9ZT1U7CisgICAgZWxzZSBpZiAoYXQgPiAwICYmIG1lbWJlcihpZ25vcmUsIHZlcmJbYXQuLl0pID49IDApCisgICAgICByZXR1cm4gTUVTU0FHRV9JR05PUkVfTVVEOworICB9CisKKyAgLy8gVGF1YmhlaXQvT3JvcGF4CisgIHRlIHw9IChmbGFnICYgTVNHRkxBR19TQVkpOworCisgIGlmIChRdWVyeVByb3AoUF9ERUFGKSAmJiAoZmxhZyAmIE1TR0ZMQUdfREVBRkNISykgJiYgIShmbGFnICYgTVNHRkxBR19DSElTVCkpIHsKKyAgICBkZWFmID0gUXVlcnlQcm9wKFBfREVBRik7CisgICAgaWYgKHRlKQorICAgICAgcmVwbHkgPSBzdHJpbmdwKGRlYWYpID8KKyAgICAgICAgY2FwaXRhbGl6ZShzcHJpbnRmKGRlYWYsIG5hbWUoKSkpIDoKKyAgICAgICAgY2FwaXRhbGl6ZShuYW1lKCkpKyIgaXN0IG1vbWVudGFuIGxlaWRlciB0YXViLlxuIjsKKyAgfQorICBlbHNlIGlmIChlbSkKKyAgICByZXBseSA9IGNhcGl0YWxpemUobmFtZSgpKSsiIGhhdCBPcm9wYXggaW4gZGVuIE9ocmVuLlxuIjsKKworICBtc2cgPSBicmVha19zdHJpbmcobXNnLCA3OCwgaW5kZW50LAorICAgIChRdWVyeVByb3AoUF9NRVNTQUdFX1BSRVBFTkQpID8gQlNfUFJFUEVORF9JTkRFTlQgOiAwKSB8IEJTX0xFQVZFX01ZX0xGUyk7CisKKyAgaWYoUXVlcnlQcm9wKFBfQlVGRkVSKSAmJgorICAgICAoZGVhZiB8fAorICAgICAgcXVlcnlfZWRpdGluZyh0aGlzX29iamVjdCgpKSB8fAorICAgICAgcXVlcnlfaW5wdXRfcGVuZGluZyh0aGlzX29iamVjdCgpKSkpCisgIHsKKyAgICBkZWFmID0gTUVTU0FHRV9ERUFGOworICAgIGlmKGZsYWcgJiBNU0dGTEFHX0NBQ0hFKQorICAgIHsKKyAgICAgIGlmKCFzdHJpbmdwKHJlcGx5KSkKKyAgICAgICAgcmVwbHkgPSBuYW1lKCkrIiBtb2VjaHRlIGdlcmFkZSBuaWNodCBnZXN0b2VydCB3ZXJkZW4uXG4iOworCisgICAgICBtc2cgPSBtc2dbMC4uPDJdKyIgWyIgKyBzdHJmdGltZSgiJUg6JU0iLHRpbWUoKSkgKyAiXVxuIjsKKworICAgICAgaW50IHJlcyA9ICBhZGRfdG9fa29ib2xkKG1zZywgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RwKHNlbmRlcikgPyBzZW5kZXIgOiBNRSk7CisgICAgICBpZihyZXMgPT0gTVNHX0JVRkZFUkVEKQorICAgICAgeworCisgICAgICAgIHJlcGx5ICs9ICJEaWUgTWl0dGVpbHVuZyB3dXJkZSB2b24gZWluZW0ga2xlaW5lbiBLb2JvbGQgaW4gRW1wZmFuZyAiKworICAgICAgICAgICAgICAgICAiZ2Vub21tZW4uXG5FciB3aXJkIHNpZSBzcGFldGVyIHdlaXRlcmxlaXRlbiEiOworICAgICAgICBkZWFmID0gTUVTU0FHRV9DQUNIRTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXBseSArPSAiRGllIE1pdHRlaWx1bmcgZ2luZyB2ZXJsb3JlbiwgZGVubiAiKworICAgICAgICAgICAgICAgICAiZGVyIEtvYm9sZCBrYW5uIHNpY2ggbmljaHRzIG1laHIgbWVya2VuISI7CisgICAgICAgIGRlYWYgPSBNRVNTQUdFX0NBQ0hFX0ZVTEw7CisgICAgICB9CisgICAgICBpZih0aSAmJiAoSVNfTEVBUk5FUih0aSl8fCFRdWVyeVByb3AoUF9JTlZJUykpKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aSwgcmVwbHkrIlxuIik7CisgICAgfQorICAgIHJldHVybiBkZWFmOworICB9CisgIGVsc2UgaWYoKGRlYWYgfHwgZW0pICYmCisgICAgICAgICAgKCAoZmxhZyAmIE1TR0ZMQUdfUlRFTEwpIHx8CisgICAgICAgICAgICAodGkgJiYgKElTX0xFQVJORVIodGkpfHwhUXVlcnlQcm9wKFBfSU5WSVMpKSkpKSB7CisgICAgaWYgKHRlICYmIHRpKQorICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGksIHJlcGx5KTsKKyAgICByZXR1cm4gTUVTU0FHRV9ERUFGOworICB9CisKKyAgX2ZsdXNoX2NhY2hlKDApOworICBpZih0ZSAmJiBRdWVyeVByb3AoUF9BV0FZKSkKKyAgICBtc2cgPSBtc2dbMC4uPDJdKyIgWyIgKyBzdHJmdGltZSgiJUg6JU0iLHRpbWUoKSkgKyAiXVxuIjsKKworICBpZiAoZmxhZyAmIChNU0dGTEFHX1NBWSB8IE1TR0ZMQUdfVEVMTCkgJiYgY29tbV9iZWVwKCkpIHsKKyAgICBtc2c9TUVTU0FHRV9CRUVQK21zZzsKKyAgfQorICBlZnVuOjp0ZWxsX29iamVjdChNRSwgbXNnKTsKKyAgcmV0dXJuIE1FU1NBR0VfT0s7Cit9CisKK3N0YXRpYyBpbnQgaWdub3JpZXJlKHN0cmluZyBzdHIpCit7CisgIHN0ciA9IF91bnBhcnNlZF9hcmdzKDEpOworICBtYXBwaW5nIGlnbm9yZT1RdWVyeShQX0lHTk9SRSwgRl9WQUxVRSk7CisKKyAgaWYgKCFzdHIpCisgIHsKKyAgICBzdHJpbmcqIGlnbmFyciA9IG1faW5kaWNlcyhpZ25vcmUpOworICAgIGlmICghc2l6ZW9mKGlnbmFycikpCisgICAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRHUgaWdub3JpZXJzdCBuaWVtYW5kZW4uXG4iKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmVjZWl2ZU1zZygiRHUgaWdub3JpZXJzdDpcbiIKKyAgICAgICAgICAgICAgICAgICArIGJyZWFrX3N0cmluZyhDb3VudFVwKG1hcChzb3J0X2FycmF5KGlnbmFyciwgIyc+ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2NhcGl0YWxpemUgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSArICIuIiw3OCksCisgICAgICAgICAgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX0lHTk9SRXxNU0dfRE9OVF9TVE9SRXxNU0dfRE9OVF9XUkFQLAorICAgICAgICAgICAgICAgICAgIDAsMCx0aGlzX29iamVjdCgpKTsKKyAgICAgIHJldHVybiAxOworICB9CisgIC8vIHRyaW0gc3BhY2VzIGZyb20gYXJncyBhbmQgY29udmVydCB0byBsb3dlciBjYXNlLgorICBzdHIgPSBsb3dlcl9jYXNlKHRyaW0oc3RyLCBUUklNX0JPVEgpKTsKKworICBpZiAobWVtYmVyKGlnbm9yZSwgc3RyKSkKKyAgeworICAgIFJlbW92ZUlnbm9yZShzdHIpOworICAgIHRlbGxfb2JqZWN0KE1FLCBzcHJpbnRmKCJEdSBpZ25vcmllcnN0ICVzIG5pY2h0IG1laHIuXG4iLCBjYXBpdGFsaXplKHN0cikpKTsKKyAgfQorICBlbHNlIGlmIChzaXplb2YoaWdub3JlKT4xMDApCisgIHsKKyAgIHRlbGxfb2JqZWN0KE1FLCAiRHUgaWdub3JpZXJzdCBzY2hvbiBnZW51ZWdlbmQhXG4iKTsKKyAgfQorICBlbHNlIGlmIChBZGRJZ25vcmUoc3RyKSA9PSAxKQorICB7CisgICAgdGVsbF9vYmplY3QoTUUsCisgICAgICAgIHNwcmludGYoIkR1IGlnbm9yaWVyc3QgamV0enQgJXMuXG4iLCBjYXBpdGFsaXplKHN0cikpKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgc3ByaW50ZigiJyVzJyBrYW5uc3QgRHUgbmljaHQgaWdub3JpZXJlbi5cbiIsc3RyKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBfbXNnX2JlZXAoc3RyaW5nIHN0cikgeworICBpbnQgYmVlcF9pbnRlcnZhbDsKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDoga2xpbmdlbHRvbiA8MSBiaXMgMzYwMCBTZWt1bmRlbj4gb2RlciBrbGluZ2VsdG9uIGF1c1xuIik7CisgIGlmIChzdHJpbmdwKHN0cikpIHsKKyAgICBpZiAoc3RyPT0iYXVzIikKKyAgICAgIFNldFByb3AoUF9NRVNTQUdFX0JFRVAsMCk7CisgICAgZWxzZSBpZiAoKGJlZXBfaW50ZXJ2YWw9dG9faW50KHN0cikpID4gMCAmJiBiZWVwX2ludGVydmFsPD0zNjAwKQorICAgICAgU2V0UHJvcChQX01FU1NBR0VfQkVFUCxiZWVwX2ludGVydmFsKTsKKyAgICBlbHNlIHJldHVybiAwOworICB9CisKKyAgYmVlcF9pbnRlcnZhbD0oaW50KVF1ZXJ5UHJvcChQX01FU1NBR0VfQkVFUCk7CisgIF9ub3RpZnkoIlRvbiBiZWkgTWl0dGVpbHVuZ2VuOiAiKworICAgICAgICAoYmVlcF9pbnRlcnZhbCA/ICJhbGxlciAiK2JlZXBfaW50ZXJ2YWwrIiBTZWt1bmRlbi4iIDogImF1cy4iKSwKKyAgICAgICAgcXVlcnlfdmVyYigpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX21zZ19wcmVwZW5kKHN0cmluZyBzdHIpIHsKKyAgaW50IGJlZXBfaW50ZXJ2YWw7CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IHNlbmRlcndpZWRlcmhvbHVuZyBlaW4vYXVzXG4iKTsKKyAgaWYgKHN0cmluZ3Aoc3RyKSkgeworICAgIGlmIChzdHI9PSJhdXMiKSAgCisgICAgICBTZXRQcm9wKFBfTUVTU0FHRV9QUkVQRU5ELDEpOworICAgIGVsc2UgaWYgKHN0cj09ImVpbiIpICAKKyAgICAgIFNldFByb3AoUF9NRVNTQUdFX1BSRVBFTkQsMCk7CisgICAgZWxzZSByZXR1cm4gMDsKKyAgfQorCisgIF9ub3RpZnkoIlNlbmRlcndpZWRlcmhvbHVuZyBiZWkgTWl0dGVpbHVuZ2VuOiAiKyAKKyAgICAgICAgICAoKGludClRdWVyeVByb3AoUF9NRVNTQUdFX1BSRVBFTkQpID8gICJhdXMiIDogImVpbiIpKyIuIiwKKyAgICAgICAgICBxdWVyeV92ZXJiKCkpOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9jb21tdW5pY2F0ZShtaXhlZCBzdHIsIGludCBzaWxlbnQpCit7CisgIHN0cmluZyAgdmVyYjsKKyAgc3RyaW5nICBteW5hbWU7CisgIHN0cmluZyAgbXNnOworCisgIGlmICghc3RyIHx8IGV4dGVybl9jYWxsKCkpIHN0cj1fdW5wYXJzZWRfYXJncygpfHwiIjsKKyAgLyogc3RyPV91bnBhcnNlZF9hcmdzKCl8fCIiOyAqLworICB2ZXJiID0gcXVlcnlfdmVyYigpOworICBpZihzdHJpbmdwKHZlcmIpICYmIHZlcmJbMF0gPT0gJ1wnJykgc3RyID0gdmVyYlsxLi5dICsgIiAiICsgc3RyOworICBpZiAoc3RyPT0iInx8c3RyPT0iICJ8fCFzdHIpCisgIHsKKyAgICBfbm90aWZ5KCJXYXMgd2lsbHN0IER1IHNhZ2VuPyIsTUFfU0FZKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtc2c9cGVybXV0YXRlKHN0cik7CisKKyAgbXluYW1lPSgoKFF1ZXJ5UHJvcChQX0lOVklTKXx8IUlTX0xFQVJORVIoTUUpKXx8CisgICAgICEoUXVlcnlQcm9wKFBfQ0FOX0ZMQUdTKSZDQU5fUFJFU0FZKT8KKyAgICAiIjpRdWVyeVByb3AoUF9QUkVTQVkpKStuYW1lKCkpfHwiIjsKKworICAvLyBhbiBhbGxlcyBpbSBSYXVtIHNlbmRlbi4gKE1UX0xJU1RFTiwgd2VpbCBkaWVzIGdlc3Byb2NoZW5lIEtvbW11bmlrYXRpb24KKyAgLy8gaXN0LCBrZWluZSBNVF9DT01NKQorICBzZW5kX3Jvb20oZW52aXJvbm1lbnQoKSwgbXNnLCBNVF9MSVNURU4sIE1BX1NBWSwKKyAgICAgICAgICAgIGNhcGl0YWxpemUobXluYW1lKSsiIHNhZ3Q6ICIsICh7dGhpc19vYmplY3QoKX0pICk7CisKKyAgaWYoIXNpbGVudCkKKyAgeworICAgIFJlY2VpdmVNc2cobXNnLCBNVF9OT1RJRklDQVRJT058TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgTUFfU0FZLCAiRHUgc2Fnc3Q6ICIsIE1FKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfc2hvdXRfdG9fYWxsKG1peGVkIHN0cikKK3sKKyAgc3RyaW5nIHByZSwgbXluYW1lLCByZWFsbmFtZSwgd2l6YXJkc19tc2csIHBsYXllcnNfbXNnOworICBzdHJpbmcgd2l6YXJkX3ByZWZpeCwgcGxheWVyX3ByZWZpeDsKKyAgaW50IGNoYXJzOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkKKyAgeworICAgIF9ub3RpZnkoIldhcyB3aWxsc3QgRHUgcnVmZW4/IixNQV9TSE9VVCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgY2hhcnM9c2l6ZW9mKHN0cikvMjsKKyAgaWYgKGNoYXJzPDQpIGNoYXJzPTQ7CisgIHByZSA9ICghSVNfTEVBUk5FUihNRSkgfHwKKyAgIFF1ZXJ5UHJvcChQX0lOVklTKSB8fAorICAgIShRdWVyeVByb3AoUF9DQU5fRkxBR1MpICYgQ0FOX1BSRVNBWSkpID8gIiIgOiBRdWVyeVByb3AoUF9QUkVTQVkpOworICByZWFsbmFtZSA9IGNhcGl0YWxpemUoKHByZSArIGNhcGl0YWxpemUoZ2V0dWlkKCkpKXx8IiIpOworICBteW5hbWUgPSBjYXBpdGFsaXplKHByZSArIG5hbWUoKXx8IiIpOworICBpZiAoUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIHJlYWxuYW1lID0gIigiK3JlYWxuYW1lKyIpIjsKKworICB3aXphcmRzX21zZyA9IHBlcm11dGF0ZShzdHIpOworICB3aXphcmRfcHJlZml4ID0gbXluYW1lKyIgcnVmdDogIjsKKworICBpZihRdWVyeVByb3AoUF9GUk9HKSkgeworICAgIHBsYXllcnNfbXNnID0gIlF1YWFhaywgcXVhYWFhYWssIHF1dXV1YWFhYWFhYWFhYWFhYWFhYWFhYWFrICEhIjsKKyAgICBwbGF5ZXJfcHJlZml4ID0gbXluYW1lKyIgcXVha3Q6ICI7CisgIH0KKyAgZWxzZSB7CisgICAgcGxheWVyc19tc2cgPSB3aXphcmRzX21zZzsKKyAgICBwbGF5ZXJfcHJlZml4ID0gd2l6YXJkX3ByZWZpeDsKKyAgfQorCisgIGlmKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKQorICB7CisgICAgaWYoUXVlcnlQcm9wKFBfR0hPU1QpKSB7CisgICAgICAgIF9ub3RpZnkoIlNvIGdhbnogb2huZSBLb2VycGVyIGJla29tbXN0IER1IGtlaW5lbiBUb24gaGVyYXVzLiIsCisgICAgICAgICAgICAgICAgTUFfU0hPVVQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFF1ZXJ5UHJvcChQX1NQKSA8KGNoYXJzKzIwKSkKKyAgICB7CisgICAgICBfbm90aWZ5KCJEdSBtdXNzdCBlcnN0IHdpZWRlciBtYWdpc2NoZSBLcmFlZnRlIHNhbW1lbG4uIiwKKyAgICAgICAgICAgICAgTUFfU0hPVVQpOworICAgICAgX25vdGlmeSgiVGlwOiBCZW51dHogZG9jaCBtYWwgZGllIEViZW5lbiAoSGlsZmUgZGF6dSBtaXQgJ2hpbGZlICIKKyAgICAgICAgICAgICAgIkViZW5lbicpLiIsIE1BX1NIT1VUKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBTZXRQcm9wKFBfU1AsIFF1ZXJ5UHJvcChQX1NQKSAtIGNoYXJzIC0gMjApOworICB9CisKKyAgUmVjZWl2ZU1zZyh3aXphcmRzX21zZywgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX0lHTk9SRXxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAicnVmZSIsICJEdSBydWZzdDogIiwgTUUpOworCisgIGZvcmVhY2ggKCBvYmplY3Qgb2IgOiB1c2VycygpLSh7dGhpc19vYmplY3QoKX0pICkKKyAgICBpZiAoIElTX0xFQVJORVIob2IpICkKKyAgICAgIG9iLT5SZWNlaXZlTXNnKHdpemFyZHNfbXNnLCBNVF9MSVNURU58TVRfRkFSLCBNQV9TSE9VVCwgd2l6YXJkX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisgICAgZWxzZQorICAgICAgb2ItPlJlY2VpdmVNc2cocGxheWVyc19tc2csIE1UX0xJU1RFTnxNVF9GQVIsIE1BX1NIT1VULCBwbGF5ZXJfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpKTsKKworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgX3RlbGwoc3RyaW5nIHdobywgbWl4ZWQgbXNnKQoreworICBvYmplY3QgICAgb2I7CisgIHN0cmluZyAgICBhd2F5LG15bmFtZSxyZXQ7CisgIG1peGVkICAgICBpZ25vcmUsaXQ7CisgIHN0cmluZyAgICAqeG5hbWU7CisgIGludCAgICAgICBpLHZpc2ZsYWc7CisKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpIT1NRSkgcmV0dXJuIDE7CisgIGlmICghd2hvIHx8ICFtc2cpIHsKKyAgICBfbm90aWZ5KCJXYXMgd2lsbHN0IER1IG1pdHRlaWxlbj8iLE1BX1RFTEwpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYod2hvID09IEVSV0lERVJfUEFSQU0pCisgIHsKKyAgICBpZiAoIWxhc3RfY29tbV9wYXJ0bmVyKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiRHUgaGFzdCBhYmVyIG5vY2gga2VpbmUgTWl0dGVpbHVuZ2VuIGVyaGFsdGVuLCBhdWYgZGllICIKKyAgICAgICAgICAiRHUgd2FzIGVyd2lkZXJuXG5rb2VubnRlc3QuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3aG89bGFzdF9jb21tX3BhcnRuZXI7CisgIH0KKworICAvLyB0ZWlsZSAueCBtaXQgdGVpbHQgYmlzaGVyaWdlbiBHZXNwcmFlY2hzcGFydG5lcm4gZXR3YXMgbWl0LgorICBpZiAod2hvID09ICIuIikKKyAgIHdobyA9ICIuMSI7CisKKyAgaWYgKCBzc2NhbmYod2hvLCAiLiVkIiwgaSkgPT0gMSApIHsKKyAgICBpZihpID4gMCAmJiBpIDw9IHNpemVvZihjb21tcmVjZWl2ZXJzKSkKKyAgICAgIHdobyA9IGNvbW1yZWNlaXZlcnNbaS0xXTsKKyAgICBlbHNlIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiU28gdmllbGVuIExldXRlbiBoYXN0IER1IG5vY2ggbmljaHRzIG1pdGdldGVpbHQhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIHhuYW1lID0gZXhwbG9kZSh3aG8sICJAIik7CisKKyAgaWYgKHNpemVvZih4bmFtZSkgPT0gMikgCisgIHsKKyAgICBpZiAoIFF1ZXJ5UHJvcChQX1FQKSApCisgICAgeworICAgICAgaWYgKHJldD0oc3RyaW5nKUlORVRELT5fc2VuZF91ZHAoeG5hbWVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWyBSRVFVRVNUOiAgICJ0ZWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0lQSUVOVDogeG5hbWVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5ERVI6ICAgIGdldHVpZChNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiAgICAgbXNnIF0pLCAxKSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeShyZXQsIE1BX1RFTEwpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB3cml0ZSgiTmFjaHJpY2h0IGFiZ2VzY2hpY2t0LlxuIik7CisgICAgICAgIGFkZF90b190ZWxsX2hpc3Rvcnkod2hvLCAxLCAwLCBtc2csCisgICAgICAgICAgIkR1IHRlaWxzdCAiICsgY2FwaXRhbGl6ZSh3aG8pICsgIiBtaXQ6ICIsIE1TR0ZMQUdfVEVMTCwgMSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdyaXRlKCJEdSBoYXN0IG5pY2h0IGdlbnVnIEFiZW50ZXVlcnB1bmt0ZSwgdW0gU3BpZWxlcm4gaW4gYW5kZXJlbiBcbiIKKyAgICAgICAgIk11ZHMgZXR3YXMgbWl0dGVpbGVuIHp1IGtvZW5uZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghb2I9ZmluZF9wbGF5ZXIoaXQgPSBsb3dlcl9jYXNlKHdobykpKQorICB7CisgICAgaXQgPSBtYXRjaF9saXZpbmcoaXQsIDApOworICAgIGlmICghc3RyaW5ncChpdCkpCisgICAgICBzd2l0Y2goaXQpIHsKKyAgICAgIGNhc2UgLTE6CisgICAgICAgIF9ub3RpZnkoIkRhcyB3YXIgbmljaHQgZWluZGV1dGlnISIsTUFfVEVMTCk7CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSAtMjoKKyAgICAgICAgX25vdGlmeSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIhIixNQV9URUxMKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgb2IgPSBmaW5kX3BsYXllcihpdCkgfHwgZmluZF9saXZpbmcoaXQpOworICAgIGlmKCFvYikgeworICAgICAgX25vdGlmeSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIhIixNQV9URUxMKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCisgIGlmKFF1ZXJ5UHJvcChQX0lOVklTKSl7CisgICAgaWYoIUlTX0xFQVJORVIob2IpKQorICAgICAgbXluYW1lID0gbmFtZSgpOworICAgIGVsc2UKKyAgICAgIG15bmFtZT0iKCIrCisgICAgICAgICAgICAgKChRdWVyeVByb3AoUF9DQU5fRkxBR1MpICYgQ0FOX1BSRVNBWSk/UXVlcnlQcm9wKFBfUFJFU0FZKToiIikrCisgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoKSkgKyAiKSI7CisgIH0KKyAgZWxzZQorICAgIG15bmFtZT0oKElTX0xFQVJORVIoTUUpICYmIChRdWVyeVByb3AoUF9DQU5fRkxBR1MpICYgQ0FOX1BSRVNBWSkpID8KKyAgICAgICAgICAgICAgUXVlcnlQcm9wKFBfUFJFU0FZKToiIikgKyBuYW1lKCk7CisgIGlmIChteW5hbWUgJiYgc2l6ZW9mKG15bmFtZSkpIG15bmFtZT1jYXBpdGFsaXplKG15bmFtZSk7CisgIC8vIGVyc3RtYWwgYW4gRW1wZmFlbmdlciBzZW5kZW4KKyAgX3NlbmQob2IsIHBlcm11dGF0ZShtc2cpLCBNVF9DT01NfE1UX0ZBUiwgTUFfVEVMTCwKKyAgICAgICAgbXluYW1lICsgIiB0ZWlsdCBEaXIgbWl0OiAiKTsKKworICAvLyBkYW5uIGV2dGwuIG5vY2ggYW4gQWJzZW5kZXIgYXVzZ2ViZW4uLi4KKyAgaWYgKHZpc2ZsYWcgPSAhb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSB8fCBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKQorICAgIF9yZWN2KG9iLCBtc2csIE1TR0ZMQUdfVEVMTCwgIkR1IHRlaWxzdCAiICsgY2FwaXRhbGl6ZShpdCkgKyAiIG1pdDogIik7CisgIC8vIG9kZXIgaXJnZW5kd2FzIGFuZGVyZXMgYW4gZGVuIEFic2VuZGVyIGF1c2dlYmVuLi4uCisgIGlmICghdmlzZmxhZyAmJiBpbnRlcmFjdGl2ZShvYikpCisgICAgICBfbm90aWZ5KCJLZWluIHNvbGNoZXIgU3BpZWxlciEiLE1BX1RFTEwpOworICBlbHNlIGlmIChhd2F5ID0gKHN0cmluZylvYi0+UXVlcnlQcm9wKFBfQVdBWSkpCisgICAgICBSZWNlaXZlTXNnKCBicmVha19zdHJpbmcoIGF3YXksIDc4LCBjYXBpdGFsaXplKGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzdCBnZXJhZGUgbmljaHQgZGE6ICIsIEJTX0lOREVOVF9PTkNFICksCisgICAgICAgICAgTVRfTk9USUZJQ0FUSU9OfE1TR19ET05UX1dSQVB8TVNHX0RPTlRfSUdOT1JFLAorICAgICAgICAgIE1BX1RFTEwsIDAsIHRoaXNfb2JqZWN0KCkpOworICBlbHNlIGlmIChpbnRlcmFjdGl2ZShvYikgJiYgKGk9cXVlcnlfaWRsZShvYikpPj02MDApCisgIHsgLy9hYiAxMCBNaW5zCisgICAgICBpZiAoaTwzNjAwKQorICAgICAgICBhd2F5PXRpbWUyc3RyaW5nKCIlbSAlTSIsaSk7CisgICAgICBlbHNlCisgICAgICAgIGF3YXk9dGltZTJzdHJpbmcoIiVoICVIIHVuZCAlbSAlTSIsaSk7CisKKyAgICAgIF9ub3RpZnkoc3ByaW50ZigiJXMgaXN0IHNlaXQgJXMgdm9lbGxpZyB1bnRhZXRpZy4iLAorICAgICAgICAgICAgICBjYXBpdGFsaXplKGl0KSxhd2F5KSwKKyAgICAgICAgICAgICAgTUFfVEVMTCk7CisgICAgfQorCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF90ZWlsZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2hvLCBtZXNzYWdlOworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiAwOworICBpZiAoc3NjYW5mKHN0ciwgIiVzIG1pdCAlcyIsIHdobywgbWVzc2FnZSkgPT0gMikKKyAgICByZXR1cm4gX3RlbGwod2hvLCBtZXNzYWdlLDEpOworICByZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgX3RlaWxlX21pdF9hbGlhcyhzdHJpbmcgc3RyKQoreworICBzdHIgPSBfdW5wYXJzZWRfYXJncygpLCBUUklNX0xFRlQ7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgc3RyID0gdHJpbShzdHIsIFRSSU1fTEVGVCk7CisgIC8vIFppZWwgbXVzcyBtaW4uIDIgQnVjaHN0YWJlbiBoYWJlbiAoLjxucj4pCisgIGlmIChzaXplb2Yoc3RyKSA8IDQpIHJldHVybiAwOworICBpbnQgcG9zID0gc3Ryc3RyKHN0ciwgIiAiKTsKKyAgaWYgKHBvcyA+PSAyKQorICAgIHJldHVybiBfdGVsbChzdHJbLi5wb3MtMV0sIHN0cltwb3MrMS4uXSk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9lcnphZWhsZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgd2hvLCBtZXNzYWdlOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIDA7CisgIGlmIChzc2NhbmYoc3RyLCAiJXMgJXMiLCB3aG8sIG1lc3NhZ2UpID09IDIpCisgICAgcmV0dXJuIF90ZWxsKHdobywgbWVzc2FnZSwxKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3doaXNwZXIoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0ICAgIG9iOworICBzdHJpbmcgICAgd2hvOworICBzdHJpbmcgICAgbXNnOworICBzdHJpbmcgICAgbXluYW1lOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSB8fAorICAgICAgIChzc2NhbmYoc3RyLCAiJXMgenUgJXMiLCB3aG8sIG1zZykgIT0gMiAmJgorICAgICAgICBzc2NhbmYoc3RyLCAiJXMgJXMiLCB3aG8sIG1zZykgIT0yICkpIHsKKyAgICBfbm90aWZ5KCJXYXMgd2lsbHN0IER1IHdlbSB6dWZsdWVzdGVybj8iLE1BX1NBWSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCEob2IgPSBwcmVzZW50KHdobywgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpKSB8fCAhbGl2aW5nKG9iKSkgeworICAgIF9ub3RpZnkoY2FwaXRhbGl6ZSh3aG8pKyIgaXN0IG5pY2h0IGluIGRpZXNlbSBSYXVtLiIsTUFfU0FZKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG15bmFtZSA9IGNhcGl0YWxpemUoKCgoSVNfTEVBUk5FUihNRSkgJiYKKyAgICAgICAhUXVlcnlQcm9wKFBfSU5WSVMpICYmCisgICAgICAgKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fUFJFU0FZKSk/CisgICAgICBRdWVyeVByb3AoUF9QUkVTQVkpIDogIiIpICsgbmFtZSgpKSB8fCAiIik7CisKKyAgX3NlbmQob2IsIHBlcm11dGF0ZShtc2cpLCBNVF9MSVNURU58TVNHX0RPTlRfU1RPUkUsCisgICAgICAgIE1TR19TQVksIG15bmFtZSArICIgZmx1ZXN0ZXJ0IERpciB6dTogIik7CisgIHNlbmRfcm9vbShlbnZpcm9ubWVudCgpLAorICAgICAgICAgICAgbXluYW1lICsgIiBmbHVlc3RlcnQgIiArIG9iLT5uYW1lKFdFTSwgMSkgKyAiIGV0d2FzIHp1LiIsCisgICAgICAgICAgICBNVF9MSVNURU58TVNHX0RPTlRfU1RPUkUsIE1BX1NBWSwgMCwgKHt0aGlzX29iamVjdCgpLG9ifSkpOworCisgIF9yZWN2KG9iLCBtc2csIE1TR0ZMQUdfV0hJU1BFUiwgIkR1IGZsdWVzdGVyc3QgIiArIG9iLT5uYW1lKFdFTSkgKyAiIHp1OiAiKTsKKworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9yZW1vdGVfd2hpc3BlcihzdHJpbmcgc3RyKQoreworICAvKiBXaWUgJ3RlaWxlIG1pdCcsIG51ciBtaXQgTVNHRkxBR19XSElTUEVSLiBEYWR1cmNoIHdpcmQgZGVyIEluaGFsdCBkZXIKKyAgICAgTmFjaHJpY2h0IG5pY2h0IGluIGRlciB0ZWxsX2hpc3RvcnkgdmVyZXdpZ3QuICovCisKKyAgb2JqZWN0ICAgIG9iOworICBzdHJpbmcgICAgd2hvLCBpdDsKKyAgc3RyaW5nICAgIG1zZzsKKyAgc3RyaW5nICAgIG15bmFtZTsKKworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkgfHwKKyAgICAgICAoc3NjYW5mKHN0ciwgIiVzIHp1ICVzIiwgd2hvLCBtc2cpICE9IDIgJiYKKyAgICAgICAgc3NjYW5mKHN0ciwgIiVzICVzIiwgd2hvLCBtc2cpICE9MiApKSB7CisgICAgX25vdGlmeSgiV2FzIHdpbGxzdCBEdSB3ZW0gYXVzIGRlciBGZXJuZSB6dWZsdWVzdGVybj8iLE1BX0VNT1RFKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghb2I9ZmluZF9wbGF5ZXIoaXQgPSBsb3dlcl9jYXNlKHdobykpKQorICB7CisgICAgaXQgPSBtYXRjaF9saXZpbmcoaXQsIDApOworICAgIGlmICghc3RyaW5ncChpdCkpCisgICAgICBzd2l0Y2goaXQpeworICAgICAgY2FzZSAtMToKKyAgICAgICAgX25vdGlmeSgiRGFzIHdhciBuaWNodCBlaW5kZXV0aWchIixNQV9FTU9URSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgY2FzZSAtMjoKKyAgICAgICAgX25vdGlmeSgiS2VpbiBzb2xjaGVyIFNwaWVsZXIhIixNQV9FTU9URSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIG9iID0gZmluZF9wbGF5ZXIoaXQpOworICAgIGlmKCFvYikgb2IgPSBmaW5kX2xpdmluZyhpdCk7CisgICAgaWYoIW9iKXsKKyAgICAgIF9ub3RpZnkoIktlaW4gc29sY2hlciBTcGllbGVyISIsTUFfRU1PVEUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIGlmIChlbnZpcm9ubWVudChvYikgPT0gZW52aXJvbm1lbnQoKSkgeworICAgIF9ub3RpZnkoIldlbm4gamVtYW5kIG5lYmVuIERpciBzdGVodCwgbmltbSBmbHVlc3Rlci4iLE1BX0VNT1RFKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIG15bmFtZSA9IGNhcGl0YWxpemUoKCgoSVNfTEVBUk5FUihNRSkgJiYKKyAgICAgICAhUXVlcnlQcm9wKFBfSU5WSVMpICYmCisgICAgICAgKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fUFJFU0FZKSk/CisgICAgICBRdWVyeVByb3AoUF9QUkVTQVkpIDogIiIpICsgbmFtZSgpKSB8fCAiIik7CisKKyAgLy8gQW4gRW1wZmFlbmdlciBzZW5kZW4uCisgIF9zZW5kKG9iLCBwZXJtdXRhdGUobXNnKSwgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfU1RPUkUsIE1BX0VNT1RFLAorICAgICAgICAgbXluYW1lICsgIiBmbHVlc3RlcnQgRGlyIGF1cyBkZXIgRmVybmUgenU6ICIpOworCisgIC8vIHdlbm4gRW1wZmFlbmdlciBpbnZpcyB1bmQgd2lyIGtlaW4gTWFnaWVyICwgZ2dmLiBmYWtlZmVobGVyIGF1c2dlYmVuLgorICBpZiAob2ItPlF1ZXJ5UHJvcChQX0lOVklTKSAmJiAhSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkgeworICAgIF9ub3RpZnkoIktlaW4gc29sY2hlciBTcGllbGVyISIsTUFfRU1PVEUpOworICAgIHJldHVybiAxOworICB9CisgIC8vIHNvbnN0IGVpZ2VuZSBNZWxkdW5nIHZpYSBfcmVjdigpIGF1c2dlYmVuLgorICBlbHNlIAorICAgIF9yZWN2KG9iLCBtc2csIE1TR0ZMQUdfV0hJU1BFUiB8IE1TR0ZMQUdfUkVNT1RFLAorICAgICAgICAiRHUgZmx1ZXN0ZXJzdCAiICsgb2ItPm5hbWUoV0VNKSArICIgYXVzIGRlciBGZXJuZSB6dTogIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnZlcnNlKHN0cmluZyBhcmcpCit7CisgIF9ub3RpZnkoIk1pdCAnKionIHdpcmQgZGFzIEdlc3ByYWVjaCBiZWVuZGV0LiIsTUFfU0FZKTsKKyAgaWYgKHN0cmluZ3AoYXJnKSAmJiBzdHJzdHIoYXJnLCAiLXMiKSA9PSAwKQorICAgIGlucHV0X3RvKCJfY29udmVyc2VfbW9yZSIsIElOUFVUX1BST01QVCwgIl0iLCAxKTsKKyAgZWxzZQorICAgIGlucHV0X3RvKCJfY29udmVyc2VfbW9yZSIsIElOUFVUX1BST01QVCwgIl0iLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX2NvbnZlcnNlX21vcmUobWl4ZWQgc3RyLCBpbnQgc2lsZW50KQoreworICBpZiAoc3RyID09ICIqKiIpIHsKKyAgICBfbm90aWZ5KCJPay4iLE1BX1NBWSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZihzdHIgIT0gIiIpCisgICAgX2NvbW11bmljYXRlKHN0ciwgc2lsZW50KTsKKworICBpbnB1dF90bygiX2NvbnZlcnNlX21vcmUiLCBJTlBVVF9QUk9NUFQsICJdIiwgc2lsZW50KTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGlzX2xlYXJuZXIob2JqZWN0IG8pIHsgcmV0dXJuIElTX0xFQVJORVIobyk7IH0KKworc3RhdGljIGludCBfc2hvdXRfdG9fd2l6YXJkcyhtaXhlZCBzdHIpCit7CisgIGludCAgICAgaSwgajsKKyAgc3RyaW5nICAgIG15bmFtZTsKKyAgb2JqZWN0ICAgKnU7CisKKyAgc3RyID0gX3VucGFyc2VkX2FyZ3MoKTsKKyAgaWYgKCFzdHJ8fCFzaXplb2Yoc3RyKSkgeworICAgIF9ub3RpZnkoIldhcyB3aWxsc3QgRHUgZGVuIE1hZ2llcm4genVydWZlbj8iLE1BX1NIT1VUKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBLb250cm9sbHplaWNoZW4gcmF1c2ZpbHRlcm4uCisgIHN0ciA9IHJlZ3JlcGxhY2Uoc3RyLCJbWzpjbnRybDpdXSIsIiIsUkVfUENSRXxSRV9HTE9CQUwpOworICBteW5hbWUgPSBjYXBpdGFsaXplKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIGlmICghSVNfTEVBUk5FUih0aGlzX29iamVjdCgpKSkKKyAgICBfcmVjdigwLCBzdHIsIE1TR0ZMQUdfTUVDSE8sICJEdSB0ZWlsc3QgYWxsZW4gTWFnaWVybiBtaXQ6ICIpOworCisgIC8vIG1ydWZlIGlzdCBuaWNodCBpZ25vcmllcmJhciwgZGEgZXMgbnVyIGZ1ZXIgc2Nod2VyZSBQcm9ibGVtZSBnZWRhY2h0IGlzdC4KKyAgZmlsdGVyKHVzZXJzKCksICMnaXNfbGVhcm5lciktPlJlY2VpdmVNc2coc3RyLAorICAgICAgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfSUdOT1JFfE1TR19ET05UX1NUT1JFLAorICAgICAgTUFfU0hPVVQsIG15bmFtZSsiIGFuIGFsbGUgTWFnaWVyOiAiLCB0aGlzX29iamVjdCgpKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfZWNobyhzdHJpbmcgc3RyKSB7CisgIGlmICghSVNfU0VFUihNRSkgfHwgKCFJU19MRUFSTkVSKE1FKQorICAgICAgICAmJiAhKFF1ZXJ5UHJvcChQX0NBTl9GTEFHUykgJiBDQU5fRUNITykpKQorICAgIHJldHVybiAwOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIF9ub3RpZnkoIldhcyBtb2VjaHRlc3QgRHUgJ2VjaG9lbic/IiwgMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIUlTX0xFQVJORVIodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgeworICAgIGlmIChRdWVyeVByb3AoUF9HSE9TVCkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJPaG5lIEtvZXJwZXIgZmVobHQgRGlyIGRhenUgZGllIG5vZXRpZ2UgbWFnaXNjaGUgS3JhZnQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUXVlcnlQcm9wKFBfU1ApPEVDSE9fQ09TVCkKKyAgICB7CisgICAgICBfbm90aWZ5X2ZhaWwoIkR1IG11c3N0IGVyc3Qgd2llZGVyIG1hZ2lzY2hlIEtyYWVmdGUgc2FtbWVsbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFNldFByb3AoUF9TUCxRdWVyeVByb3AoUF9TUCktRUNIT19DT1NUKTsKKyAgICBzdHI9Ij5cYiIrc3RyOworICAgIGxvZ19maWxlKCJBUkNIL0VDSE9fU0VIRVIiLCBzcHJpbnRmKCIlcyAlczogJXNcbiIsIGR0aW1lKHRpbWUoKSksIGdldHVpZCgpLAorICAgICAgICAgICBzdHIpKTsKKyAgfQorICAvLyBBbiBkZW4gUmF1bSBzZW5kZW4uIFR5cCBpc3QgTVRfQ09NTSwgYWJlciBkYXMgRWNobyBzb2xsIHdlZGVyIGluIGRlcgorICAvLyBLb21taGlzdG9yeSBub2NoIGltIEtvYm9sZCBsYW5kZW4uCisgIHNlbmRfcm9vbShlbnZpcm9ubWVudChNRSksIHN0ciwgTVRfQ09NTXxNU0dfRE9OVF9TVE9SRXxNU0dfRE9OVF9CVUZGRVIsCisgICAgICAgICAgICBNQV9VTktOT1dOLCAwLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIERpZW50IGFscyBWZXJ0ZWlkaWd1bmcgZ2VnZW4gTGV1dGUsIGRpZSBlaGVyIHVuYmVkYWNodCByZWluc2NocmVpYmVuLCBuaWNodAorLy8gZ2VnZW4gTGV1dGUsIGRpZSBkYSBhYnNpY2h0bGljaCByZWluc2NocmVpYmVuLiBEaWUgd2VyZGVuIGdldGVlcnQKKy8vIHVuZCBnZWZlZGVydC4KK3N0YXRpYyBzdHJpbmcgKl9zZXRfaWdub3JlKG1peGVkIGFyZykKK3sKKyAgcmFpc2VfZXJyb3IoIkRpcmVrdGVzIFNldHplbiB2b24gUF9JR05PUkUgaXN0IG5pY2h0IGVybGF1YnQuICIKKyAgICAgICJCZW51dHplIEFkZElnbm9yZS9SZW1vdmVJZ25vcmUoKSFcbiIpOworfQorLy8gS29tcGF0aWJpbHRhZXQgenVtIGFsdGVuIElnbm9yZTogQXJyYXkgdm9uIEluZGljZXMgbGllZmVybi4gQWVuZGVydCBhYmVyCisvLyBuaXggZHJhbiwgZGFzcyBhbGxlIFRlc3RJZ25vcmUoKSAmIENvIGJlbnV0emVuIHNvbGxlbi4KK3N0YXRpYyBzdHJpbmcgKl9xdWVyeV9pZ25vcmUoKSB7CisgIG1peGVkIGlnbj1RdWVyeShQX0lHTk9SRSwgRl9WQUxVRSk7CisgIGlmIChtYXBwaW5ncChpZ24pKQorICAgIHJldHVybiBtX2luZGljZXMoaWduKTsKKyAgcmV0dXJuICh7fSk7Cit9CisKK3B1YmxpYyBpbnQgQWRkSWdub3JlKHN0cmluZyBpZ24pIHsKKyAgLy8gRWluaWdlIHN0cmluZ3Mgc2luZCBuaWNodCBlcmxhdWJ0LCB6LkIuIGtvbnNla3V0aXZlIC4KKyAgaWYgKCFzaXplb2YoaWduKQorICAgICAgfHwgcmVnbWF0Y2goaWduLCJbLl17Mix9IixSRV9QQ1JFKQorICAgICAgfHwgcmVnbWF0Y2goaWduLCIgIixSRV9QQ1JFKQorICAgICAgfHwgc2l6ZW9mKGV4cGxvZGUoaWduLCIuIikpPjMpCisgICAgcmV0dXJuIDA7CisKKyAgbWFwcGluZyBpZ25vcmVzPVF1ZXJ5KFBfSUdOT1JFLCBGX1ZBTFVFKTsKKyAgaWdub3Jlc1tpZ25dPXRpbWUoKTsKKyAgLy8ga2VpbiBTZXQoKSBub2V0aWcuCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IFJlbW92ZUlnbm9yZShzdHJpbmcgaWduKQoreworICBtYXBwaW5nIGlnbm9yZXM9UXVlcnkoUF9JR05PUkUsRl9WQUxVRSk7CisgIG1fZGVsZXRlKGlnbm9yZXMsaWduKTsKKyAgLy8gS2VpbiBTZXQoKSBub2V0aWcKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X2ludGVybXVkKCkKK3sKKyAgbWl4ZWQgdG1wOworICByZXR1cm4gbWVtYmVyKHBvaW50ZXJwKHRtcD1RdWVyeShQX0NIQU5ORUxTKSk/dG1wOih7fSksICJJbnRlcm11ZCIpID4gLTE7Cit9CisKKworaW50IGVyd2lkZXJlKHN0cmluZyBzdHIpCit7CisgIHN0cj1fdW5wYXJzZWRfYXJncygpOworICBpZiAoIXN0cikgcmV0dXJuIDA7CisgIHJldHVybiBfdGVsbChFUldJREVSX1BBUkFNLCBzdHIgLDEpOworfQorCitzdGF0aWMgaW50IHRtaGlzdChzdHJpbmcgc3RyKQoreworCisgIGlmIChzdHIgPT0gImF1cyIpIHsKKyAgICB0ZWxsX2hpc3RvcnlfZW5hYmxlZCA9IFRFTExISVNUX0RJU0FCTEVEOworICAgIHdyaXRlKCJPaywgZXMgd2lyZCBuaWNodHMgbWVociBnZXNwZWljaGVydC5cbiIpOworICAgIGlmIChzaXplb2YodGVsbF9oaXN0b3J5KSkgeworICAgICAgdGVsbF9oaXN0b3J5ID0gKFtdKTsKKyAgICAgIGNvbW1yZWNlaXZlcnMgPSAoe30pOworICAgICAgd3JpdGUoIkRlaW5lIE1pdHRlaWx1bmdzZ2VzY2hpY2h0ZSB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoc3RyID09ICJuYW1lbiIpIHsKKyAgICBpbnQgZmxhZzsKKyAgICB0ZWxsX2hpc3RvcnlfZW5hYmxlZCA9IFRFTExISVNUX05PX01FU1NBR0U7CisgICAgd3JpdGUoIk9rLCBkaWUgTmFtZW4genVrdWVuZnRpZ2VyIEdlc3ByYWVjaHNwYXJ0bmVyIHdlcmRlbiBnZXNwZWljaGVydC5cbiIpOworICAgIGZvcmVhY2ggKHN0cmluZyB1aWQsIHN0cnVjdCBjaGF0X3MgY2hhdDogdGVsbF9oaXN0b3J5KQorICAgICAgaWYgKHBvaW50ZXJwKGNoYXQtPm1zZ2J1ZikpIHsKKyAgICAgICAgY2hhdC0+bXNnYnVmID0gMDsKKyAgICAgICAgY2hhdC0+cHRyID0gMDsKKyAgICAgICAgZmxhZyA9IDE7CisgICAgICB9CisgICAgaWYgKGZsYWcpCisgICAgICB3cml0ZSgiRGVyIEluaGFsdCBEZWluZXIgTWl0dGVpbHVuZ2VuIHd1cmRlIGdlbG9lc2NodC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHN0ciA9PSAiZWluIiB8fCBzdHIgPT0gImFuIikgeworICAgIHRlbGxfaGlzdG9yeV9lbmFibGVkID0gVEVMTEhJU1RfRU5BQkxFRDsKKyAgICB3cml0ZSgiT2ssIHp1a3VlbmZ0aWdlIE1pdHRlaWx1bmdlbiB3ZXJkZW4gZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisjaWZkZWYgVEVMTEhJU1RfTE9OR0xJRkUKKyAgaWYgKHN0ciA9PSAibGFuZ2xlYmlnIikgeworICAgIHRlbGxfaGlzdG9yeV9lbmFibGVkID0gVEVMTEhJU1RfTE9OR0xJRkU7CisgICAgd3JpdGUoIk9rLCB6dWt1ZW5mdGlnZSBNaXR0ZWlsdW5nZW4gd2VyZGVuIGpld2VpbHMgYmlzIHp1bSBuYWVjaHN0ZW4gIgorICAgICAgICAgICJFbmRlL0NyYXNoL1xuUmVib290IGdlc3BlaWNoZXJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyNlbmRpZgorCisgIGlmIChzdHIgPT0gInN0YXR1cyIpIHsKKyAgICBzd2l0Y2ggKHRlbGxfaGlzdG9yeV9lbmFibGVkKSB7CisgICAgICBjYXNlIFRFTExISVNUX0RJU0FCTEVEOgorICAgICAgICB3cml0ZSgiRGllIE5hbWVuIERlaW5lciBHZXNwcmFlY2hzcGFydG5lciB3ZXJkZW4gbmljaHQgZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRFTExISVNUX05PX01FU1NBR0U6CisgICAgICAgIHdyaXRlKCJEaWUgTmFtZW4gRGVpbmVyIEdlc3ByYWVjaHNwYXJ0bmVyIHdlcmRlbiBnZXNwZWljaGVydC5cbiIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVEVMTEhJU1RfRU5BQkxFRDoKKyAgICAgICAgd3JpdGUoIkRlaW5lIE1pdHRlaWx1bmdlbiB3ZXJkZW4gZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVEVMTEhJU1RfTE9OR0xJRkUKKyAgICAgIGNhc2UgVEVMTEhJU1RfTE9OR0xJRkU6CisgICAgICAgIHdyaXRlKCJEZWluZSBNaXR0ZWlsdW5nZW4gd2VyZGVuIGpld2VpbHMgYmlzIHp1bSBuYWVjaHN0ZW4gRW5kZS8iCisgICAgICAgICAgICAgICJDcmFzaC9SZWJvb3Rcbmdlc3BlaWNoZXJ0LlxuIik7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKHRlbGxfaGlzdG9yeV9lbmFibGVkID09IFRFTExISVNUX0RJU0FCTEVEKSB7CisgICAgX25vdGlmeV9mYWlsKCJEZWluZSBHZXNwcmFlY2hzcGFydG5lciB3ZXJkZW4gbmljaHQgZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghc2l6ZW9mKHRlbGxfaGlzdG9yeSkpIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkR1IGhhc3Qgbm9jaCBrZWluZW0gZXR3YXMgbWl0Z2V0ZWlsdCAiCisgICAgICAgICAgICAgICAgICJ1bmQgbm9jaCBrZWluZSBNaXR0ZWlsdW5nZW4gZXJoYWx0ZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChzdHIgJiYgc2l6ZW9mKHN0cikpIHsKKworICAgIGlmICh0ZWxsX2hpc3RvcnlfZW5hYmxlZCA8IFRFTExISVNUX0VOQUJMRUQpIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiRGVyIEluaGFsdCBEZWluZXIgTWl0dGVpbHVuZ2VuIHdpcmQgbmljaHQgZ2VzcGVpY2hlcnQuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0cmluZyB1aWQ7CisgICAgaWYgKG1lbWJlcih0ZWxsX2hpc3RvcnksIHN0cikpIHsKKyAgICAgIC8vIE5hbWUgZ2V3dWVuc2NodCwgZGEgZGVyIFN0cmluZyBpbiBkZXIgSGlzdG9yeSB2b3Jrb21tdC4KKyAgICAgIHVpZCA9IHN0cjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAvLyBldnRsLiBuZSBaYWhsIGFuZ2VnZWJlbi4KKyAgICAgIGludCBpOworICAgICAgc3RyaW5nICpwYXJ0bmVycyA9IHNvcnRlZF9jb21tcGFydG5lcnMoMCk7CisgICAgICBpZiAoKGkgPSB0b19pbnQoc3RyKSAtIDEpID49IDAgJiYgaSA8IHNpemVvZihwYXJ0bmVycykpCisgICAgICAgIHVpZCA9IHBhcnRuZXJzW2ldOworICAgICAgZWxzZSB7CisgICAgICAgIG5vdGlmeV9mYWlsKCJNaXQgc28gdmllbGVuIExldXRlbiBoYXN0IER1IG5pY2h0IGdlc3Byb2NoZW4hXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorCisgICAgbWl4ZWQgKmRhdGEgPSB0ZWxsX2hpc3RvcnlbdWlkXS0+bXNnYnVmOworICAgIGlmICghZGF0YSkgeworICAgICAgX25vdGlmeV9mYWlsKAorICAgICAgICAiRGVyIEluaGFsdCBkaWVzZXIgTWl0dGVpbHVuZyBpc3QgbmljaHQgKG1laHIpIGdlc3BlaWNoZXJ0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgcHRyID0gdGVsbF9oaXN0b3J5W3VpZF0tPnB0cjsKKworICAgIE1vcmUoc3ByaW50ZigiJUBzIiwgbWFwKGRhdGFbcHRyLi5NQVhfU0FWRURfTUVTU0FHRVMtMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswLi5wdHItMV0sCisgICAgICAgICBmdW5jdGlvbiBzdHJpbmcgKHN0cnVjdCBzdG9yZWRfbXNnX3MgbXNnKSB7CisgICAgICAgICAgICAgaWYgKCFzdHJ1Y3RwKG1zZykpIHJldHVybiAiIjsKKyAgICAgICAgICAgICAgIHJldHVybiBicmVha19zdHJpbmcoIG1zZy0+bXNnICsgIiA8IgorICAgICAgICAgICAgICAgICArIHN0cmZ0aW1lKCIlSDolTTolUyIsbXNnLT50aW1lc3RhbXApICsgIj4iLCA3OCwKKyAgICAgICAgICAgICAgICAgbXNnLT5wcmVmaXggfHwgIiIsIG1zZy0+cHJlZml4ID8gQlNfTEVBVkVfTVlfTEZTIDogMCk7CisgICAgICAgICB9ICkgKSApOworICAgIHJldHVybiAxOworICB9CisKKyAgc3RyaW5nIGhpc3RvcnkgPSAiRm9sZ2VuZGUgR2VzcHJhZWNoZSBoYXN0IER1IGJlcmVpdHMgZ2VmdWVocnQ6XG4iOworICBpbnQgaTsKKyAgZm9yZWFjaCAoc3RyaW5nIHVpZCA6IHNvcnRlZF9jb21tcGFydG5lcnMoMCkgKSB7CisgICAgaW50IGo7CisgICAgc3RydWN0IGNoYXRfcyBjaGF0ID0gdGVsbF9oaXN0b3J5W3VpZF07CisgICAgaGlzdG9yeSArPSBzcHJpbnRmKCIlMmQuJS00cyAlcyAgJS0xMXMgICVkIGdlc2VuZGV0LyVkIGVtcGZhbmdlblxuIiwgKytpLAorICAgICAgKChqPW1lbWJlcihjb21tcmVjZWl2ZXJzLHVpZCkpPi0xID8gc3ByaW50ZigiLyUyZC4iLGorMSkgOiAiIiksCisgICAgICBzdHJmdGltZSgiJWEsICVlLiVtLiV5IixjaGF0LT50aW1lX2xhc3RfbXNnKSwKKyAgICAgIGNhcGl0YWxpemUoY2hhdC0+dWlkKSwgY2hhdC0+c2VudGNvdW50LCBjaGF0LT5yZWN2Y291bnQpOworICB9CisKKyAgTW9yZShoaXN0b3J5KTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICByZXR1cm4gKHsKKyAgICAoeyJrb2JvbGQiLCAiY21kX2tvYm9sZCIsMCwwfSksCisgICAgICh7InNhZyIsIl9jb21tdW5pY2F0ZSIsMCwwfSksCisgICAgICh7InNhZ2UiLCJfY29tbXVuaWNhdGUiLDAsMH0pLAorICAgICAoeyInIiwiX2NvbW11bmljYXRlIiwxLDB9KSwKKyAgICAgKHsibXJ1ZiIsIl9zaG91dF90b193aXphcmRzIiwwLDB9KSwKKyAgICAgKHsibXJ1ZmUiLCJfc2hvdXRfdG9fd2l6YXJkcyIsMCwwfSksCisgICAgICh7InJ1ZiIsIl9zaG91dF90b19hbGwiLDAsMH0pLAorICAgICAoeyJydWZlIiwiX3Nob3V0X3RvX2FsbCIsMCwwfSksCisgICAgICh7ImVyemFlaGwiLCJfZXJ6YWVobGUiLDAsMH0pLAorICAgICAoeyJlcnphZWhsZSIsIl9lcnphZWhsZSIsMCwwfSksCisgICAgICh7InRlaWwiLCJfdGVpbGUiLDAsMH0pLAorICAgICAoeyJ0ZWlsZSIsIl90ZWlsZSIsMCwwfSksCisgICAgICh7InRtIiwiX3RlaWxlX21pdF9hbGlhcyIsMCwwfSksCisgICAgICh7ImZsdWVzdGVyIiwiX3doaXNwZXIiLDAsMH0pLAorICAgICAoeyJmbHVlc3RlcmUiLCJfd2hpc3BlciIsMCwwfSksCisgICAgICh7InJmbHVlc3RlciIsIl9yZW1vdGVfd2hpc3BlciIsMCwwfSksCisgICAgICh7InJmbHVlc3RlcmUiLCJfcmVtb3RlX3doaXNwZXIiLDAsMH0pLAorICAgICAoeyJnZXNwcmFlY2giLCJfY29udmVyc2UiLDAsMH0pLAorICAgICAoeyJlY2hvIiwiX2VjaG8iLDAsMH0pLAorICAgICAoeyJpZ25vcmllciIsImlnbm9yaWVyZSIsMCwwfSksCisgICAgICh7Imlnbm9yaWVyZSIsImlnbm9yaWVyZSIsMCwwfSksCisgICAgICh7InRtaGlzdCIsInRtaGlzdCIsMCwwfSksCisgICAgICh7ImVyd2lkZXIiLCJlcndpZGVyZSIsMCwwfSksCisgICAgICh7ImVyd2lkZXJlIiwiZXJ3aWRlcmUiLDAsMH0pLAorICAgICAoeyJrbGluZ2VsdG9uIiwiX21zZ19iZWVwIiwwLDB9KSwKKyAgICAgKHsic2VuZGVyd2llZGVyaG9sdW5nIiwiX21zZ19wcmVwZW5kIiwwLDB9KSwKKyAgICAgKHsicmVwb3J0Iiwic2V0X3JlcG9ydCIsMCwwfSksCisgICAgfSkrY2hhbm5lbDo6X3F1ZXJ5X2xvY2FsY21kcygpOworfQorCitwcml2YXRlIHN0cmluZyAqc29ydGVkX2NvbW1wYXJ0bmVycyhpbnQgcmV2ZXJzZWQpIHsKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKHRlbGxfaGlzdG9yeSksCisgICAgICBmdW5jdGlvbiBpbnQgKHN0cmluZyB1aWQxLCBzdHJpbmcgdWlkMikgeworICAgICAgICAgIGlmIChyZXZlcnNlZCkKKyAgICAgICAgICAgIHJldHVybiB0ZWxsX2hpc3RvcnlbdWlkMV0tPnRpbWVfbGFzdF9tc2cgPgorICAgICAgICAgICAgICAgICAgIHRlbGxfaGlzdG9yeVt1aWQyXS0+dGltZV9sYXN0X21zZzsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdGVsbF9oaXN0b3J5W3VpZDFdLT50aW1lX2xhc3RfbXNnIDw9CisgICAgICAgICAgICAgICAgICAgdGVsbF9oaXN0b3J5W3VpZDJdLT50aW1lX2xhc3RfbXNnOworICAgICAgfSApOworfQorCisvLyBFaWdlbnRsaWNoIG51ciBpbiBNYWdpZXJvYmpla3RlbiBnZXJ1ZmVuLiBHZWhvZXJ0IGFiZXIgdGhlbWF0aXNjaCBoaWVyCisvLyBpcmdlbmR3aWUgaGluLgorc3RhdGljIHZvaWQgbW9kaWZ5X3Byb21wdCgpIHsKKyAgICBzdHJpbmcgdGV4dCA9IFF1ZXJ5KFBfUFJPTVBULCBGX1ZBTFVFKTsKKworICAgIGlmICggIXN0cmluZ3AodGV4dCkgfHwgIXNpemVvZih0ZXh0KSApCisgICAgICAgIHRleHQgPSAiPiAiOworICAgIGVsc2UgeworICAgICAgICBzdHJpbmcgcGF0aCA9IFF1ZXJ5KFBfQ1VSUkVOVERJUiwgRl9WQUxVRSk7CisgICAgICAgIGlmIChzdHJpbmdwKHBhdGgpICYmIHNpemVvZihwYXRoKSkKKyAgICAgICAgICB0ZXh0ID0gcmVncmVwbGFjZSh0ZXh0LCJcXHciLHBhdGgsMCk7IC8vIFBmYWQgZWluc2V0emVuCisgICAgfQorICAgIGNvbmZpZ3VyZV9pbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpLCBJQ19QUk9NUFQsIHRleHQpOworfQorCisvLyBQcnVlZnQgYXVmIEluZ29yaWVyZWVpbnRyYWVnZS4KKy8vIFJ1ZWNrZ2FiZTogMCAobmljaHQgaWdub3JpZXJ0KSBvZGVyIE1TR19JR05PUkVECisjaWZkZWYgX19MUENfVU5JT05TX18KK3B1YmxpYyBpbnQgVGVzdElnbm9yZShzdHJpbmd8c3RyaW5nKiBzcmNuYW1lcykKKyNlbHNlCitwdWJsaWMgaW50IFRlc3RJZ25vcmUobWl4ZWQgc3JjbmFtZXMpCisjZW5kaWYKK3sKKyAgbWFwcGluZyBpZ24gPSBRdWVyeShQX0lHTk9SRSwgRl9WQUxVRSk7CisgIGlmIChzdHJpbmdwKHNyY25hbWVzKSkKKyAgICBzcmNuYW1lcyA9ICh7c3JjbmFtZXN9KTsKKworICBmb3JlYWNoKHN0cmluZyBzcmNuYW1lOiBzcmNuYW1lcykKKyAgeworICAgIC8vIGVpbmZhY2hzdGVyIEZhbGwsIGV4YWt0ZXIgTWF0Y2gKKyAgICBpZiAobWVtYmVyKGlnbiwgc3JjbmFtZSkpCisgICAgICByZXR1cm4gTVNHX0lHTk9SRUQ7CisgICAgLy8gYW5zb25zdGVuIG11c3MgYXVmZ2V0cmVubnQgd2VyZGVuLgorICAgIGlmIChzdHJzdHIoc3JjbmFtZSwiLiIpID4gLTEpCisgICAgeworICAgICAgc3RyaW5nICpzcmNwYXJ0cz1leHBsb2RlKHNyY25hbWUsIi4iKTsKKyAgICAgIHN3aXRjaChzaXplb2Yoc3JjcGFydHMpKQorICAgICAgeworICAgICAgICAvLyBjYXNlIDAgdW5kIDEga2FubiBuaWNodCBwYXNzaWVyZW4uCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAvLyB6dSBwcnVlZmVuOiBbc2VuZGVyXS5ha3Rpb24ucXVhbGlmaXppZXJlci4KKyAgICAgICAgICAvLyBEZXIgRmFsbCwgZGFzcyBkZXIgU3BpZWxlciBkaWVzIF9nZW5hdV8gX3NvXyBpZ25vcmllcnQgaGF0LCB3aXJkCisgICAgICAgICAgLy8gb2JlbiBzY2hvbiBnZXBydWVmdC4gaW0gU3BpZWxlciBnZXBydWVmdCB3ZXJkZW4gbXVzcyBub2NoOgorICAgICAgICAgIC8vIHNwaWVsZXIsIC5ha3Rpb24sIHNwaWVsZXIuYWt0aW9uIHVuZCAuYWt0aW9uLnF1YWxpZml6aWVyZXIKKyAgICAgICAgICBpZiAoIChzaXplb2Yoc3JjcGFydHNbMF0pICYmIG1lbWJlcihpZ24sc3JjcGFydHNbMF0pKSAvLyBzcGllbGVyCisgICAgICAgICAgICAgIHx8IG1lbWJlcihpZ24sICIuIitzcmNwYXJ0c1sxXSkgICAgICAvLyAuYWt0aW9uCisgICAgICAgICAgICAgIHx8IG1lbWJlcihpZ24sIHNyY3BhcnRzWzBdKyIuIitzcmNwYXJ0c1sxXSkgLy8gW3NwaWVsZXJdLmFrdGlvbgorICAgICAgICAgICAgICB8fCBtZW1iZXIoaWduLCAiLiIrc3JjcGFydHNbMV0rIi4iK3NyY3BhcnRzWzJdKSAvLyAuYWt0LnF1YWwKKyAgICAgICAgICAgICApCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1TR19JR05PUkVEOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIC8vIHp1IHBydWVmZW46IHNwaWVsZXIuYWt0aW9uCisgICAgICAgICAgLy8gRGVyIEZhbGwsIGRhc3MgZGVyIFNwaWVsZXIgZGFzIF9nZW5hdV8gX3NvXyBlaW5nZWdlYmVuIGhhdCwgaXN0CisgICAgICAgICAgLy8gb2JlbiBzY2hvbiBnZXBydWVmdC4gSW0gU3BpZWxlciB6dSBwcnVlZmVuIGlzdCBub2NoOgorICAgICAgICAgIC8vIHNwaWVsZXIgdW5kIC5ha3Rpb24KKyAgICAgICAgICBpZiAoKHNpemVvZihzcmNwYXJ0c1swXSkgJiYgbWVtYmVyKGlnbixzcmNwYXJ0c1swXSkpCisgICAgICAgICAgICAgIHx8IG1lbWJlcihpZ24sICIuIitzcmNwYXJ0c1sxXSkpCisgICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1TR19JR05PUkVEOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gbWVociBhbHMgMyBUZWlsZS4uLgorICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIlRlc3RJZ25vcmVFeHQoKTogdG9vIG1hbnkgcXVhbGlmaWVycywgb25seSAxICIKKyAgICAgICAgICAgICAgICAiaXMgc3VwcG9ydGVkLiBHb3Q6ICVzXG4iLHNyY25hbWUpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gRGVmYXVsdDogbmljaHQgaWdub3JpZXJlbi4KKyAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX0xQQ19VTklPTlNfXworcHVibGljIGludCBUZXN0SWdub3JlRXh0KHN0cmluZ3xzdHJpbmcqIHNyY25hbWVzKQorI2Vsc2UKK3B1YmxpYyBpbnQgVGVzdElnbm9yZUV4dChtaXhlZCBzcmNuYW1lcykKKyNlbmRpZgoreworICByZXR1cm4gVGVzdElnbm9yZShzcmNuYW1lcyk7Cit9CisKKy8vIFBydWVmdCBmdWVyIFJlY2VpdmVNc2coKSBhdWYgSW5nb3JpZXJlZWludHJhZWdlLiBJZ25vcmllcnQgYWJlciBuaWNodCBhbGxlCisvLyBUeXBlbi4gCisvLyBSdWVja2dhYmU6IDAgb2RlciBNU0dfSUdOT1JFRCB8IE1TR19WRVJCX0lHTiB8IE1TR19NVURfSUdOCitwcml2YXRlIGludCBjaGVja19pZ25vcmVzKHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwgc3RyaW5nIG1zZ19hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCBvcmlnaW4pCit7CisgIC8vIEVpbmlnZSBEaW5nZSBsYXNzZW4gc2ljaCBuaWNodCBpZ25vcmllcmVuLgorICBpZiAobXNnX3R5cGUgJiAoTVRfTkVXU3xNVF9OT1RJRklDQVRJT04pKQorICAgIHJldHVybiAwOworICAvLyBhbGxlcyBhbmRlcmUgZ2VodCB6dXIgemVpdCBlcnN0bWFsLCB3ZW5uIG9yaWdpbiBiZWthbm50IFVORCBOSUNIVCBkYXMKKyAgLy8gZWlnZW5lIE9iamVrdCBpc3QuIFdhZXIgZ2dmLiBzb25zdCBkb29mLiBBdXNzZXJkZW0gbXVzcyBlcyBuYXR1ZXJsaWNoCisgIC8vIGVpbmUgaWdub3JpZXJiYXJlIG1zZ19hY3Rpb24gZ2ViZW4uCisgIGVsc2UgaWYgKHN0cmluZ3AobXNnX2FjdGlvbikgJiYgb3JpZ2luICYmIG9yaWdpbiAhPSBNRSkKKyAgeworICAgIHN0cmluZyBzcmNuYW1lID0KKyAgICAgIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9yaWdpbikgPyBvcmlnaW4tPnF1ZXJ5X3JlYWxfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3JpZ2luLT5uYW1lKFdFUikgfHwgIiIpOworICAgIG1hcHBpbmcgaWduID0gUXVlcnkoUF9JR05PUkUsIEZfVkFMVUUpOworCisgICAgaWYgKG1lbWJlcihpZ24sIHNyY25hbWUpKQorICAgICAgcmV0dXJuIE1TR19JR05PUkVEOworICAgIC8vIHZpZWxsZWljaHQgd2lyZCBpcmdlbmR3YXMgYSBsYSBuYW1lLmFrdGlvbiBpZ25vcmllcnQ/CisgICAgLy8gZGllcyBpZ25vcmllcnQgYXVjaCBzcGllbGVyLmViZW5lbi48ZWJlbmU+IChzLiBtc2dfYWN0aW9uIGJlaQorICAgIC8vIEViZW5lbm1lbGR1bmdlbikKKyAgICBpZiAobWVtYmVyKGlnbiwgc3JjbmFtZSsiLiIrbXNnX2FjdGlvbikpCisgICAgICByZXR1cm4gTVNHX1ZFUkJfSUdOOworICAgIC8vIE9kZXIgZGllIEFrdGlvbiBrb21wbGV0dD8gRGllcyBpZ25vcmllcnQgYXVjaCAuZWJlbmVuLjxlYmVuZT4sIG9id29obAorICAgIC8vIGRhcyByZWljaGxpY2ggc2lubmZyZWkgaXN0LgorICAgIGlmIChtZW1iZXIoaWduLCAiLiIrbXNnX2FjdGlvbikpCisgICAgICByZXR1cm4gTVNHX1ZFUkJfSUdOOworICAgIC8vIFNwaWVsZXIgYXVmIEViZW5lbiBpZ25vcmllcnQ/CisgICAgLy8gbXNnX2FjdGlvbiBpc3QgaGllciBuYWNoIGRpZXNlbSBNdXN0ZXI6IE1BX0NIQU5ORUwuPGViZW5lPgorICAgIGlmIChzdHJzdHIobXNnX2FjdGlvbiwgTUFfQ0hBTk5FTCkgPT0gMCkKKyAgICB7CisgICAgICAvLyBzcGllbGVyLmViZW5lbj8gKHNwaWVsZXIuZWJlbmVuLjxlYmVuZT4gb2JlbiBzY2hvbiBnZXBydWVmdCkKKyAgICAgIGlmIChtZW1iZXIoaWduLCBzcmNuYW1lICsgIi4iTUFfQ0hBTk5FTCkpCisgICAgICAgIHJldHVybiBNU0dfSUdOT1JFRDsKKyAgICAgIC8vIHNwaWVsZXIuZWJlbmVuLmViZW5lbm5hbWUgaXN0IG9iZW4gc2Nob24gYWJnZWRlY2t0LgorICAgICAgLy8gLmViZW5lbiBoYWx0ZSBpY2ggZnVlciBzaW5uZnJlaSwgbmljaHQgZ2VwcnVlZnQuCisgICAgfQorICAgIC8vIFNwaWVsZXIgYXVzIGFuZGVyZW0gbXVkPyAqc2V1ZnoqCisgICAgaWYgKHN0cnN0cihzcmNuYW1lLCJAIikgPiAtMSkKKyAgICB7CisgICAgICBzdHJpbmcgKnNyY3BhcnRzID0gZXhwbG9kZShzcmNuYW1lLCJAIik7CisgICAgICBpZiAoc2l6ZW9mKHNyY3BhcnRzKT09MikKKyAgICAgIHsKKyAgICAgICAgLy8gc3BpZWxlckA/CisgICAgICAgIGlmIChtZW1iZXIoaWduLCBzcmNwYXJ0c1swXSsiQCIpKQorICAgICAgICAgIHJldHVybiBNU0dfSUdOT1JFRDsKKyAgICAgICAgLy8gb2RlciBNdWQgcGVyIEBtdWQ/CisgICAgICAgIGlmIChtZW1iZXIoaWduLCAiQCIgKyBzcmNwYXJ0c1sxXSkpCisgICAgICAgICAgcmV0dXJuIE1TR19NVURfSUdOOworICAgICAgICAvLyBCVFc6IHNwaWVsZXJAbXVkIHd1cmRlIHNjaG9uIGdhbnogb2JlbiBlcmZhc3N0LgorICAgICAgfQorICAgIH0KKyAgfQorICAvLyBEZWZhdWx0OiBuaWNodCBpZ25vcmllcmVuLgorICByZXR1cm4gMDsKK30KKworLy8gV2lyZCBkaWUgbmFjaHJpY2h0IHdhaHJnZW5vbW1lbj8gRGllIFBydWVmdW5nIGVyZm9sZ3QgYXVmZ3J1bmQgdm9uCisvLyBtc2dfdHlwZS4gWnVyIHdpcmQgTVRfTE9PSyB1bmQgTVRfTElTVEVOIGJlcnVlY2tzaWNodGlndCAoUHJ1ZWZ1bmcgYXVmCisvLyBCTGluZGhlaXQvVGF1YmhlaXQpLgorLy8gV2ljaHRpZzogZW50aGFlbHQgbXNnX2FjdGlvbiB3ZWRlciBNVF9MT09LIG5vY2ggTVRfTElTVEVOLCB3aXJkIGRpZQorLy8gTmFjaHJpY2h0IHdhaHJnZW5vbW1lbiwgZGEgZGF2b24gYXVzZ2VnYW5nZW4gd2lyZCwgZGFzcyBzaWUgbWl0IGRlbiBiZWlkZW4KKy8vIFNpbm4gZ2FyIG5peCB6dSB0dW4gaGF0LgorLy8gUnVlY2tnYWJlOiAwIG9kZXIgTVNHX1NFTlNFX0JMT0NLCitwcml2YXRlIGludCBjaGVja19zZW5zZXMoc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3Qgb3JpZ2luKQoreworICBpbnQgc2Vuc2VzID0gbXNnX3R5cGUgJiAoTVRfTE9PS3xNVF9MSVNURU4pOworICAvLyBXZW5uIHZvbiB2b3JoZXJlaW4ga2VpbiBTaW5uIGFuZ2VzcHJvY2hlbiwgZGFubiBpc3QgZXMgZWluZSBuYWNocmljaHQsCisgIC8vIGRpZSB2b24ga2VpbmVtIGRlciBiZWlkZW4gd2Focmdlbm9tbWVuIHdpcmQgdW5kIHNvbGx0ZSBkZW1uYWNoIG5pY2h0CisgIC8vIHVudGVyZHJ1ZWNrdCB3ZXJkZW4uCisgIGlmICghc2Vuc2VzKQorICAgIHJldHVybiAwOworCisgIGlmICgoc2Vuc2VzICYgTVRfTE9PSykgJiYgQ2Fubm90U2VlKDEpKQorICAgIHNlbnNlcyAmPSB+TVRfTE9PSzsgIC8vIFNpbm4gbG9lc2NoZW4KKworICBpZiAoKHNlbnNlcyAmIE1UX0xJU1RFTikgJiYgUXVlcnlQcm9wKFBfREVBRikpCisgICAgc2Vuc2VzICY9IH5NVF9MSVNURU47CisKKyAgLy8gd2VubiBrZWluIFNpbm4gbWVociB1ZWJlciwgd2lyZCBkaWUgTmFjaHJpY2h0IG5pY2h0IHdhaHJnZW5vbW1lbi4KKyAgaWYgKCFzZW5zZXMpCisgICAgcmV0dXJuIE1TR19TRU5TRV9CTE9DSzsKKworICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IFJlY2VpdmVNc2coc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLCBzdHJpbmcgbXNnX2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoIW1zZykgcmV0dXJuIE1TR19GQUlMRUQ7CisKKyAgLy8gRmxhZ3MgdW5kIFR5cGVuIHNwYWx0ZW4KKyAgaW50IGZsYWdzID0gbXNnX3R5cGUgJiBNU0dfQUxMX0ZMQUdTOworICBpbnQgdHlwZSA9IG1zZ190eXBlICYgfmZsYWdzOworCisgIC8vIGdnZi4gZGVmYXVsdHMgZXJtaXR0ZWxuCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG1zZ19hY3Rpb24gfHw9IGNvbW1fZ3Vlc3NfYWN0aW9uKCk7CisgIHR5cGUgfHw9IGNvbW1fZ3Vlc3NfbWVzc2FnZV90eXBlKG1zZ19hY3Rpb24sIG9yaWdpbik7CisKKyAgLy8gRGVidWdtZWxkdW5nZW4gbnVyIGFuIE1hZ2llciBvZGVyIFRlc3RzcGllbGVyIG1pdCBQX1dJWl9ERUJVRworICBpZiAobXNnX3R5cGUgJiBNVF9ERUJVRykKKyAgeworICAgIGlmICghUXVlcnlQcm9wKFBfV0laX0RFQlVHKQorICAgICAgICB8fCAoIUlTX0xFQVJORVIoTUUpICYmICFRdWVyeVByb3AoUF9URVNUUExBWUVSKSkgKQorICAgIHJldHVybiBNU0dfRkFJTEVEOworICB9CisKKyAgLy8gWnVlcnN0IHdlcmRlbiBTaW5uZSB1bmQgUF9JR05PUkUgc293aWUgZ2dmLiBzb25zdGlnZSBGaWx0ZXIgZ2VwcnVlZnQuIEluCisgIC8vIGRlbSBGYWxsIGlzdCBkaXJla3QgRW5kZSwga2VpbiBLb2JvbGQsIGtlaW5lIEtvbW0tSGlzdG9yeSwga2VpbmUKKyAgLy8gV2VpdGVyYmVhcmJlaXR1bmcuCisgIC8vIGFiZXIgYmVzdGltbXRlIERpbmdlIGxhc3NlbiBzaWNoIGVpbmZhY2ggbmljaHQgaWdub3JpZXJlbi4KKyAgaWYgKCEoZmxhZ3MgJiBNU0dfRE9OVF9JR05PUkUpKQorICB7CisgICAgLy8gU2lubmUgcHJ1ZWZlbi4gKG51ciB0eXBlbiB1ZWJlcmdlYmVuLCBrZWluZSBGbGFncykKKyAgICBpbnQgcmVzPWNoZWNrX3NlbnNlcyhtc2csIHR5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CisgICAgaWYgKHJlcykgcmV0dXJuIHJlczsKKworICAgIC8vIFNwaWVsZXItZGVmaW5pZXJ0ZXMgSWdub3JpZXJlPyAobnVyIHR5cGVuIHVlYmVyZ2ViZW4sIGtlaW5lIEZsYWdzKQorICAgIHJlcz1jaGVja19pZ25vcmVzKG1zZywgdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgICBpZiAocmVzKSByZXR1cm4gcmVzOworICB9CisKKyAgLy8gRnVlciBNVF9DT01NIGdpYnQgZXMgZWluIHBhYXIgU29uZGVyZGluZ2UgenUgbWFjaGVuLgorICBpZiAoKHR5cGUgJiBNVF9DT01NKSkKKyAgeworICAgIC8vIGVyc3RtYWwgaW4gZGVyIEtvbW0tSGlzdG9yeSBhYmxlZ2VuLCB3ZW5uIGdld3VlbnNjaHQuCisgICAgaWYgKCghKGZsYWdzICYgTVNHX0RPTlRfU1RPUkUpKSkKKyAgICB7CisgICAgICBzdHJpbmcgdWlkOworICAgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob3JpZ2luKSkKKyAgICAgICAgdWlkID0gb3JpZ2luLT5xdWVyeV9yZWFsX25hbWUoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdWlkID0gb3JpZ2luLT5uYW1lKFdFUikgfHwgIjx1bmJla2FubnQ+IjsKKyAgICAgIGFkZF90b190ZWxsX2hpc3RvcnkodWlkLCAwLCAxLCBtc2csIG1zZ19wcmVmaXgsIDApOworICAgIH0KKworICAgIC8vIGdnZi4gVWhyemVpdCBiZWkgYWJ3ZXNlbmRlbiBTcGllbGVybiBhbmhhZW5nZW4sIGFiZXIgbmljaHQgYmVpCisgICAgLy8gRWJlbmVubWVsZHVuZ2VuLiAoRGllIGhhYmVuIGdnZi4gc2Nob24uKQorICAgIGlmIChzdHJpbmdwKG1zZ19hY3Rpb24pICYmIFF1ZXJ5UHJvcChQX0FXQVkpCisgICAgICAgICYmIHN0cnN0cihtc2dfYWN0aW9uLCBNQV9DSEFOTkVMKSAhPSAwKQorICAgIHsKKyAgICAgIC8vIFVocnplaXQgYW5oYWVuZ2VuLCBhYmVyIGdnZi4gbXVzcyBlaW4gXG4gYWJnZXNjaG5pdHRlbiB3ZXJkZW4uCisgICAgICBpZiAobXNnWzwxXSA9PSAnXG4nKQorICAgICAgICBtc2cgPSBtc2dbMC4uPDJdKyIgWyIgKyBzdHJmdGltZSgiJUg6JU0iLHRpbWUoKSkgKyAiXVxuIjsKKyAgICAgIGVsc2UKKyAgICAgICAgbXNnID0gbXNnICsgIiBbIiArIHN0cmZ0aW1lKCIlSDolTSIsdGltZSgpKSArICJdIjsKKyAgICB9CisgICAgLy8gS29ib2xkIGVybGF1YnQgdW5kIGdld3VlbnNjaHQ/IEtvYm9sZCBpc3QgZnVlciBkaWUKKyAgICAvLyBkaXJla3RlIEtvbW11bmlrYXRpb24gbWl0dGVscyBNVF9DT01NIHZvcmdlc2VoZW4uCisgICAgLy8gT3JvcGF4IHZvbiBNYWdpZXJuIGxlaXRldCBpbnp3aXNjaGVuIGF1Y2ggbnVyIGluIEtvYm9sZCB1bSBzdGF0dCB6dQorICAgIC8vIGlnbm9yaWVyZW4uCisgICAgLy8gZGllIGlmLUtvbnN0cnVrdGlvbiBpc3Qgc28sIHdlaWwgaWNoIGRhcyBfZmx1c2hfY2FjaGUoKSBpbSBlbHNlCisgICAgLy8gYnJhdWNoZS4KKyAgICBpZiAocXVlcnlfZWRpdGluZyh0aGlzX29iamVjdCgpKSB8fCBxdWVyeV9pbnB1dF9wZW5kaW5nKHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHx8IFF1ZXJ5UHJvcChQX0VBUk1VRkZTKSkKKyAgICB7CisgICAgICBpZiAoIShmbGFncyAmIE1TR19ET05UX0JVRkZFUikKKyAgICAgICAgICAgICYmIFF1ZXJ5UHJvcChQX0JVRkZFUikpCisgICAgICB7CisgICAgICAgIC8vIE5hY2hyaWNodCBzb2xsIGltIEtvYm9sZCBnZXNwZWljaGVydCB3ZXJkZW4uCisgICAgICAgIHJldHVybiBhZGRfdG9fa29ib2xkKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAvLyB3ZW5uIG5pY2h0IGluIEVkaXRvci9pbnB1dF90bywgbWFsIHZlcnN1Y2hlbiwgZGVuIEtvYm9sZCB6dQorICAgICAgLy8gZW50bGVlcmVuLgorICAgICAgX2ZsdXNoX2NhY2hlKDApOworICAgIH0KKworICAgIC8vIGdnZi4gUGllcHN0b24gYW5oYWVuZ2VuLiBOQUNIIEtvYm9sZGFibGFnZSwgZGllIHNvbGxlbiBlcnN0bWFsIGtlaW5lbgorICAgIC8vIFBpZXBzIGtyaWVnZW4uCisgICAgaWYgKGNvbW1fYmVlcCgpKQorICAgICAgbXNnPW1zZyArIE1FU1NBR0VfQkVFUDsKKyAgfQorCisgIC8vIEF1c2dhYmVuYWNocmljaHQgYmF1ZW4gdW5kIGFuIGRlbiBTcGllbGVyIHNlbmRlbi4KKyAgaWYgKGZsYWdzICYgTVNHX0RPTlRfV1JBUCkKKyAgICBtc2cgPSAobXNnX3ByZWZpeCA/IG1zZ19wcmVmaXggOiAiIikgKyBtc2c7CisgIGVsc2UKKyAgeworICAgIGludCBic2ZsYWdzID0gZmxhZ3MgJiBNU0dfQUxMX0JTX0ZMQUdTOworICAgIGlmIChRdWVyeVByb3AoUF9NRVNTQUdFX1BSRVBFTkQpKQorICAgICAgYnNmbGFncyB8PSBCU19QUkVQRU5EX0lOREVOVDsKKyAgICBtc2cgPSBicmVha19zdHJpbmcobXNnLCA3OCwgbXNnX3ByZWZpeCwgYnNmbGFncyk7CisgIH0KKyAgZWZ1bjo6dGVsbF9vYmplY3QoTUUsIG1zZyk7CisKKyAgcmV0dXJuIE1TR19ERUxJVkVSRUQ7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2NvbW1fc3RydWN0cy5jIGIvc3RkL3BsYXllci9jb21tX3N0cnVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI2OGViCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9jb21tX3N0cnVjdHMuYwpAQCAtMCwwICsxLDQxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbW0uYy0tIGJhc2ljIHBsYXllciBjb21tdW5pY3Rpb24gY29tbWFuZHMKKy8vCisvLyAkSWQ6IGNvbW0uYyA2OTE4IDIwMDgtMDgtMDcgMjE6MTM6MTZaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisKK3N0cnVjdCBtc2dfcyB7CisgIHN0cmluZyBtc2c7ICAgICAgIC8vIEluaGFsdCBkZXIgTmFjaHJpY2h0CisgIGludCB0eXBlOyAgICAgICAgIC8vIE1lc3NhZ2V0eXAgZnVlciBSZWNlaXZlTXNnCisgIHN0cmluZyBhY3Rpb247ICAgIC8vIE1lc3NhZ2VhY3Rpb24gZnVlciBSZWNlaXZlTXNnCisgIHN0cmluZyBwcmVmaXg7ICAgIC8vIEVpbnJ1ZWNrdW5nIGRlciBOYWNocmljaHQgYmVpIERhcnN0ZWxsdW5nIChtc2dfcHJlZml4KQorICBzdHJpbmcgc2VuZGVybmFtZTsvLyBVcnNwcnVuZyBkZXIgTmFjaHJpY2h0Cit9OworCitzdHJ1Y3Qgc3RvcmVkX21zZ19zIChtc2dfcykgeworICBpbnQgdGltZXN0YW1wOyAgICAvLyBaZWl0c3RlbXBlbCBkZXIgTmFjaHJpY2h0Cit9OworCitzdHJ1Y3QgbXNnX2J1ZmZlcl9zIHsKKyAgLy9zdHJ1Y3QgbXNnX3MgKmJ1ZjsKKyAgbWl4ZWQgKmJ1ZjsKKyAgaW50IGluZGV4OworfTsKKworc3RydWN0IGNoYXRfcyB7CisgIHN0cmluZyB1aWQ7ICAgICAgICAgICAvLyBVSUQgZGVzIEdlc3ByYWVjaHNwYXJ0bmVycworICBpbnQgdGltZV9maXJzdF9tc2c7ICAgLy8gWmVpdCBkZXIgZXJzdGVuIE5hY2hyaWNodAorICBpbnQgdGltZV9sYXN0X21zZzsgICAgLy8gWmVpdCBkZXIgbGV0emVuIE5hY2hyaWNodAorICBpbnQgc2VudGNvdW50OyAgICAgICAgLy8gQW56YWhsIGdlc2VuZGV0ZXIgTmFjaHJpY2h0ZW4KKyAgaW50IHJlY3Zjb3VudDsgICAgICAgIC8vIEFuemFobCBlbXBmYW5nZW5lciBOYWNocmljaHRlbgorICBtaXhlZCBtc2didWY7ICAgICAgICAgLy8gQXJyYXkgdm9uIG1zZ19zIChBcnQgUmluZ3B1ZmZlcikKKyAgaW50IHB0cjsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYXVmIGRpZSBuYWVjaHN0ZSB6dSB1ZWJlcnNjaHJlaWJlbmRlIG1zZ19zCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBtc2didWYKK307CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY29tbWFuZC5jIGIvc3RkL3BsYXllci9jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwNDQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvY29tbWFuZC5jCkBAIC0wLDAgKzEsMTA3NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9jb21tYW5kcy5jIC0tIGFsaWFzLCBoaXN0b3J5IGFuZCBwbGF5ZXIgY29tbWFuZCBoYW5kbGluZworLy8KKy8vICRJZDogY29tbWFuZC5jIDk1NzYgMjAxNi0wNi0xOCAxNTowMDowMVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvY29tbWFuZC5oPgorI2luY2x1ZGUgPHBsYXllci9jb21tLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxpdmluZy9tb3ZpbmcuaD4KKyNpbmNsdWRlIDxwbGF5ZXIuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bG9nZ2luZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2RlZmluZSBDQkxPRyh4KSAgICBsb2dfZmlsZShTSEVMTExPRygiRElTQUJMRUNPTU1BTkRTIikseCwyMDAwMDApCisKKyNkZWZpbmUgSElTVF9TSVpFIDQwCisjZGVmaW5lIEVQTUFTVEVSICIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIgorCitwcml2YXRlIG1hcHBpbmcgYWxpYXNlczsKK3ByaXZhdGUgc3RyaW5nICpjb21tYW5kczsKK3ByaXZhdGUgaW50IGhpc3Rfc2l6ZSwgc2hvd19wcm9jZXNzaW5nLCBoaXN0bWluOworcHJpdmF0ZSBzdHJpbmcgZGVmYXVsdF9ub3RpZnlfZmFpbDsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqaGlzdG9yeSwgKnVucGFyc2VkX2FyZ3MsIHVubW9kaWZpZWQ7Citwcml2YXRlIG5vc2F2ZSBpbnQgaGlzdF9ub3c7Citwcml2YXRlIG5vc2F2ZSBvYmplY3QgbGFzdF9jb21tYW5kX2VudjsKK3ByaXZhdGUgbm9zYXZlIGludCBjbWRzX3Blcl90aW1lLCBsYXN0X2NoZywgbWF4X2NvbW1hbmRzLCAqY21kX3R5cGVzOworLy8gRGF0ZW5zdHJ1a3R1cjogKHtTZXR6ZXIsIEFibGF1ZnplaXQsIFN0cmluZy9DbG9zdXJlfSkKK3ByaXZhdGUgbm9zYXZlIG1peGVkIGRpc2FibGVjb21tYW5kczsKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCogc3ludGF4ZGI7CisKK25vbWFzayB2b2lkIF9fc2V0X2JiKGludCBmbGFnKTsKKworc3RhdGljIHZhcmFyZ3MgaW50IF9fYXVzd2VydGVuKHN0cmluZyBzdHIsIHN0cmluZyBpbnRlcm4pOwordmFyYXJncyBpbnQgU291bENvbW0oc3RyaW5nIHN0ciwgc3RyaW5nIF92ZXJiKTsKK3ZhcmFyZ3MgbWl4ZWQgTW9yZShzdHJpbmcgc3RyLCBpbnQgZmZsYWcsIHN0cmluZyByZXR1cm50byk7CitzdGF0aWMgaW50IF9zdGFydHNfd2l0aChzdHJpbmcgc3RyLCBzdHJpbmcgc3RhcnQpOworc3RhdGljIHZvaWQgcmVhbGxvY2F0ZV9oaXN0YnVmKCk7CisKK3ByaXZhdGUgdm9pZCBBZGRIaXN0b3J5KHN0cmluZyBzdHIpCit7CisgIGlmICghc3RyaW5ncChzdHIpIHx8IHN0cj09IiIgfHwgc3RyWzBdPT0nJicgfHwgc3RyWzBdPT0nXicgfHwKKyAgICAgIHN0cj09Imhpc3QiKQorICAgIHJldHVybjsKKyAgaWYgKCFoaXN0X3NpemUpIHJldHVybjsKKyAgaWYgKCFwb2ludGVycChoaXN0b3J5KSB8fCBzaXplb2YoaGlzdG9yeSkhPWhpc3Rfc2l6ZSkKKyAgICByZWFsbG9jYXRlX2hpc3RidWYoKTsKKyAgaWYgKHNpemVvZihzdHIpPj1oaXN0bWluICYmIGhpc3RvcnlbKGhpc3Rfc2l6ZStoaXN0X25vdy0xKSVoaXN0X3NpemVdIT1zdHIpCisgICAgaGlzdG9yeVsoaGlzdF9ub3crKyklaGlzdF9zaXplXT1zdHI7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZSgpCit7CisgIGxhc3RfY2hnPTA7CisgIGhpc3RtaW49aGlzdF9ub3c9MDsKKyAgU2V0KFBfTE9DQUxDTURTLCh7fSkpOworICBTZXQoUF9MT0NBTENNRFMsUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldCgiX3N5bnRheGRiIiwgU0VDVVJFRHxTQVZFLCBGX01PREVfQVMpOworCisgIHNob3dfcHJvY2Vzc2luZz0xOworICB1bnBhcnNlZF9hcmdzPSh7MCwwLDB9KTsKKyAgaGlzdF9zaXplPUhJU1RfU0laRTsKK30KKworc3RhdGljIGludCByZXBsYWNlZGlzcGxheShzdHJpbmcgc3RyKQoreworICBpZiAoIXN0ciB8fCBzdHI9PSIiIHx8ICFzc2NhbmYoc3RyLCIlZCIsc2hvd19wcm9jZXNzaW5nKSkKKyAgICBwcmludGYoIlVuenVsYWVzc2lnZSBFaW5nYWJlIVxuJXMgMHwxfDJcbiIscXVlcnlfdmVyYigpKTsKKyAgICBwcmludGYoIkVyc2V0enVuZ3NhbnplaWdlIGF1ZiBMZXZlbCAlZC5cbkxldmVsIDA6IE5pY2h0cyBhbnplaWdlblxuIisKKyAgICAgIkxldmVsIDE6IE51ciBIaXN0b3J5LUVyc2V0enVuZ2VuIGFuemVpZ2VuXG4iKworICAgICAiTGV2ZWwgMjogSGlzdG9yeS0gdW5kIEFsaWFzLUVyc2V0enVuZ2VuIGFuemVpZ2VuXG4iLHNob3dfcHJvY2Vzc2luZyk7CisgIGlmIChzaG93X3Byb2Nlc3Npbmc+MiYmIUlTX1dJWkFSRChNRSkpIHNob3dfcHJvY2Vzc2luZz0yOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoaXN0bWluKHN0cmluZyBzdHIpCit7CisgIGludCBsZW47CisKKyAgaWYgKCFzdHJ8fCFzc2NhbmYoc3RyLCIlZCIsbGVuKXx8bGVuPDApCisgIHsKKyAgICB3cml0ZSgiQmVudXR6dW5nOiBoaXN0bWluIFpBSExcbkxlZ3QgZGllIE1pbmRlc3RsYWVuZ2UgZmVzdCwgZGllIGVpbmUgXAorQmVmZWhsc3plaWxlIGhhYmVuIG11c3MsIHVtIGluIGRlblxuSGlzdG9yeS1QdWZmZXIgenUgZ2VsYW5nZW4uIERlcnplaXQgXAorZWluZ2VzdGVsbHQgYXVmICIrKHN0cmluZyloaXN0bWluKyIgWmVpY2hlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGhpc3RtaW49bGVuOworICB3cml0ZSgiTWluZGVzdGxhZW5nZSBhdWYgIisoc3RyaW5nKWxlbisiIGVpbmdlc3RlbGx0LlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZWFsbG9jYXRlX2hpc3RidWYoKQoreworICBpbnQgaTsKKworICBoaXN0b3J5PWFsbG9jYXRlKGhpc3Rfc2l6ZSk7CisgIGhpc3Rfbm93PTA7CisgIGZvciAoaT0wO2k8aGlzdF9zaXplO2krKykKKyAgICBpZiAoIXN0cmluZ3AoaGlzdG9yeVtpXSkpCisgICAgICBoaXN0b3J5W2ldPSJcblxuIjsKK30KKworc3RhdGljIGludCBoaXN0bGVuKHN0cmluZyBzdHIpCit7CisgIGludCBkOworICBpZiAoIXN0cnx8IXNzY2FuZihzdHIsIiVkIixkKXx8ZDwwfHxkPjQwKQorICB7CisgICAgd3JpdGUoIkJlbnV0enVuZzogaGlzdGxlbiBaQUhMXG5aQUhMIG11c3Mgendpc2NoZW4gMCB1bmQgNDAgbGllZ2VuLlxuIik7CisgICAgcHJpbnRmKCJEZWluZSBIaXN0b3J5LUJ1ZmZlci1MYWVuZ2UgbGllZ3QgYmVpICVkIEJlZmVobGVuLlxuIixoaXN0X3NpemUpOworICAgIHJldHVybiAxOworICB9CisgIGhpc3Rfc2l6ZT1kOworICBwcmludGYoIkRlaW5lIEhpc3RvcnktQnVmZmVyLUxhZW5nZSBsaWVndCBqZXR6dCBiZWkgJWQgQmVmZWhsZW4uXG4iLAorICAgaGlzdF9zaXplKTsKKyAgcmVhbGxvY2F0ZV9oaXN0YnVmKCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKK3sKKyAgaWYgKCFwb2ludGVycChoaXN0b3J5KXx8c2l6ZW9mKGhpc3RvcnkpIT1oaXN0X3NpemUpCisgICAgcmVhbGxvY2F0ZV9oaXN0YnVmKCk7CisgIGFkZF9hY3Rpb24oIl9fYXVzd2VydGVuIiwiIiwxKTsKKyAgICBtYXhfY29tbWFuZHMgPSBFUE1BU1RFUi0+UXVlcnlDb21tYW5kcygpOworICAgIGNtZF90eXBlcyA9IEVQTUFTVEVSLT5RdWVyeUNtZFR5cGVzKCkgfHwgKHt9KTsKKworICAgIGlmICggIW1hcHBpbmdwKGFsaWFzZXMpICkKKyAgICAgICAgYWxpYXNlcyA9IChbXSk7CisKKyAgICBpZiAoICFwb2ludGVycChjb21tYW5kcykgKQorICAgICAgICBjb21tYW5kcyA9ICh7fSk7CisKKyAgICBpZiAoUXVlcnlQcm9wKCJfc3ludGF4ZGIiKSkKKyAgICAgICAgc3ludGF4ZGIgPSAoe2ZpbmRfb2JqZWN0KCIvc2VjdXJlL3N5bnRheGRiIil9KTsKKy8qICAgIGVsc2UgaWYgKFF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKQorICAgIHsKKyAgICAgIFNldFByb3AoIl9zeW50YXhkYiIsIDEpOworICAgICAgY2FsbF9vdXQoIydfbm90aWZ5LCAyLAorICAgICAgICAgICJcbkRhIER1IGFscyBUZXN0c3BpZWxlciBtYXJraWVydCBiaXN0LCB3dXJkZSBiZWkgRGlyICIKKyAgICAgICAgICAiZGllIFN5bnRheHNhbW1sdW5nIGVpbmdlc2NoYWx0ZXQuIER1IGthbm5zdCBkaWVzICIKKyAgICAgICAgICAid2llZGVyIGF1c3NjaGFsdGVuLiAoaGlsZmUgc3ludGF4c2FtbWx1bmcpICIKKyAgICAgICAgICAiRXMgd2FlcmUgc2Nob2VuLCB3ZW5uIER1IGVzIGJlaW0gVGVzdGVuIHZvbiAiCisgICAgICAgICAgIkdlYmlldGVuIGVpbnNjaGFsdGVzdC4iLCAwKTsKKyAgICB9Ki8KK30KKworc3RhdGljIG1peGVkIF9zZXRfZGVmYXVsdF9ub3RpZnlfZmFpbChzdHJpbmcgcykKK3sKKyAgaWYgKHN0cmluZ3AocykmJnMhPSIiKQorICB7CisgICAgaWYgKHNbPDFdIT0nXG4nKSBzKz0iXG4iOworICAgIHJldHVybiBkZWZhdWx0X25vdGlmeV9mYWlsPXM7CisgIH0KKyAgZWxzZSBpZiAoIXN8fHM9PSIiKQorICAgIHJldHVybiAoZGVmYXVsdF9ub3RpZnlfZmFpbD0wKTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9kZWZhdWx0X25vdGlmeV9mYWlsKCkKK3sKKyAgcmV0dXJuIGRlZmF1bHRfbm90aWZ5X2ZhaWw7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2Vycm9ybWVzc2FnZShzdHJpbmcgcykKK3sKKyAgaWYgKCEocz1fdW5wYXJzZWRfYXJncygpKSkKKyAgeworICAgIF9zZXRfZGVmYXVsdF9ub3RpZnlfZmFpbCgwKTsKKyAgICB3cml0ZSgiU3RhbmRhcmQtRmVobGVybWVsZHVuZyBhdWYgXCJXaWUgYml0dGU/XCIgZ2VzZXR6dC5cbiIpOworICB9IGVsc2UKKyAgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZyhzcHJpbnRmKCJTdGFuZGFyZC1GZWhsZXJtZWxkdW5nIGF1ZiAlcyBnZXNldHp0LlxuIiwKKyAgICAgICAgICAgICBzKSw3OCkpOworICAgIF9zZXRfZGVmYXVsdF9ub3RpZnlfZmFpbChzKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCByZWNvbm5lY3QoKQoreworICBpZiAoIW1hcHBpbmdwKGFsaWFzZXMpKSBhbGlhc2VzPShbXSk7CisKKyAgICBpZiAoICFwb2ludGVycChjb21tYW5kcykgKQorICAgICAgICBjb21tYW5kcyA9ICh7fSk7CisKKyAgICBtYXhfY29tbWFuZHMgPSBFUE1BU1RFUi0+UXVlcnlDb21tYW5kcygpOworICAgIGNtZF90eXBlcyA9IEVQTUFTVEVSLT5RdWVyeUNtZFR5cGVzKCkgfHwgKHt9KTsKK30KKworc3RhdGljIGludCBzaG93X2hpc3QoKQoreworICBpbnQgaTsKKyAgc3RyaW5nIGNvbW07CisKKyAgdGVsbF9vYmplY3QoIE1FLCAiRGllIEhpc3RvcnktTGlzdGUgZW50aGFlbHQgZm9sZ2VuZGUgS29tbWFuZG9zOlxuIiApOworCisgIGZvciggaSA9IDA7IGkgPCBoaXN0X3NpemU7IGkrKyApCisgICAgICBpZiAoKGNvbW09aGlzdG9yeVsoaGlzdF9ub3craSklIGhpc3Rfc2l6ZV0pIT0gIlxuXG4iKQorICAgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIiAmIisoaGlzdF9ub3craS1oaXN0X3NpemUpKyIvLSIrIChoaXN0X3NpemUtaS0xKQorICAgICAgKyJcdD0gIitjb21tKyJcbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHN0cmluZyBwcmVzZW50X2FsaWFzKG1peGVkICphbGkpCit7CisgIGludCBqLGs7CisgIHN0cmluZyBzLHMyOworCisgIGZvciAocz0iIixqPXNpemVvZihhbGkpLTE7aj49MDtqLS0pCisgICAgaWYgKGludHAoYWxpW2pdKSkKKyAgICAgIGlmICgoaz1hbGlbal0pPDApCisgIHM9IiQiKyhrPT0tMT8iIjooc3RyaW5nKS1rKSsiKiIrczsKKyAgICAgIGVsc2UKKyAgcz0iJCIrKHN0cmluZylrK3M7CisgICAgZWxzZQorICAgICAgeworICAgICAgICAgczI9aW1wbG9kZShleHBsb2RlKGFsaVtqXSwiXFwiKSwiXFxcXCIpOworICAgICAgICAgcz1pbXBsb2RlKGV4cGxvZGUoczIsIiQiKSwiXFwkIikrczsKKyAgICAgIH0KKyAgcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgQUxJRk9STUFUICh7IiAlc1x0PSAlcyIsICJhbGlhcyAlcyAlcyJ9KVtkaXNwbGF5X2FzX2FsaWFzY29tbWFuZF0KKy8vIEljaCB3ZWlzcywgZGVuIFZhcmlhYmxlbm5hbWVuIGltIGRlZmluZSB6dSBoYWJlbiBpc3QgdW5mZWluLCBhYmVyIGRhcworLy8gbWFjaHQgZXMgaW0gQ29kZSBkYW5uIGFuZ2VuZWhtIHVlYmVyc2ljaHRsaWNoLiAgLUhyVAorCitzdGF0aWMgaW50IHF1ZXJ5X2FsaWFzZXMoaW50IGRpc3BsYXlfYXNfYWxpYXNjb21tYW5kKQoreworICBpbnQgaTsKKyAgc3RyaW5nICphLCphbGk7CisKKyAgaWYoaT1zaXplb2YoYWxpPXNvcnRfYXJyYXkobV9pbmRpY2VzKGFsaWFzZXMpLCMnPCkpKSAvLycpKSkKKyAgeworICAgIGZvcihhPSh7fSksaS0tOyBpPj0wOyBpLS0pCisgICAgICAgIGErPSh7c3ByaW50ZihBTElGT1JNQVQsIGFsaVtpXSwgcHJlc2VudF9hbGlhcyggYWxpYXNlc1thbGlbaV1dICkgKSB9KTsKKyAgICBNb3JlKCJEdSBoYXN0IGZvbGdlbmRlIEFsaWFzZSBkZWZpbmllcnQ6XG4iK2ltcGxvZGUoYSwiXG4iKSk7CisgIH0KKyAgZWxzZQorICAgIHdyaXRlKCJEdSBoYXN0IGtlaW5lIEFsaWFzZSBkZWZpbmllcnQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK19zdGFydHNfd2l0aChzdHJpbmcgc3RyLCBzdHJpbmcgc3RhcnQpCit7CisgIHJldHVybiAoc2l6ZW9mKHN0YXJ0KT5zaXplb2Yoc3RyKSA/IDAKKyAgICA6IHN0clswLi5zaXplb2Yoc3RhcnQpLTFdPT1zdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgYWxpYXMoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGNvbW1hbmQ7CisgIHN0cmluZyAqdG1wLHVtLCpoaXRzOworICBpbnQgbnVtLCBsLCBwb3MsIGNvbnQ7CisgIGludCBkaXNwbGF5X2FzX2FsaWFzY29tbWFuZDsKKworICBpZiAodW5tb2RpZmllZCYmdW5tb2RpZmllZCE9IiIpCisgICAgdW09aW1wbG9kZShvbGRfZXhwbG9kZSh1bm1vZGlmaWVkLCIgIilbMS4uXSwiICIpOworICBpZiAodW09PSIiKSB1bT0wOworICBpZighKHN0cj11bXx8X3VucGFyc2VkX2FyZ3MoKSkgfHwgc3RyPT0iKiIpIHJldHVybiBxdWVyeV9hbGlhc2VzKDApOworCisgICAgaWYgKHN0cj09Ii1hIiB8fCBzdHJzdHIoc3RyLCAiLWEgIik9PTAgKSAgeworICAgIHN0cj1zdHJbMi4uXTsKKyAgICBpZiAoc3RyICYmIHN0ciE9IiIgJiYgc3RyWzBdPT0nICcpIHN0cj1zdHJbMS4uXTsKKyAgICBpZiAoIXN0ciB8fCBzdHI9PSIiIHx8IHN0cj09IioiKSByZXR1cm4gcXVlcnlfYWxpYXNlcygxKTsKKyAgICBkaXNwbGF5X2FzX2FsaWFzY29tbWFuZD0xOworICB9CisKKyAgaWYgKChwb3M9bWVtYmVyKHN0ciwnICcpKTwwKSAvLyAxIEFyZyBvbmx5CisgIHsKKyAgICBpZiAoKHRtcD1hbGlhc2VzW3N0cl0pKQorICAgICAgcHJpbnRmKEFMSUZPUk1BVCsiXG4iLHN0cixwcmVzZW50X2FsaWFzKHRtcCkpOworICAgIGVsc2UKKyAgICAgIGlmIChzdHJbPDFdPT0nKicpCisgICAgICB7CisgICAgICAgIHN0cj1zdHJbMC4uPDJdOworICAgICAgICBoaXRzPWZpbHRlcihtX2luZGljZXMoYWxpYXNlcyksICMnX3N0YXJ0c193aXRoLCBzdHIpOworICAgICAgICBpZiAoIXNpemVvZihoaXRzKSkKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigiRHUgaGFzdCBrZWluIEFsaWFzLCBkYXMgbWl0IFwiJXNcIiBhbmZhZW5ndC5cbiIsIHN0cik7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaGl0cz1zb3J0X2FycmF5KGhpdHMsICMnPik7CisgICAgICAgIGZvciAobD1zaXplb2YoaGl0cyk7IGwtLTspCisgICAgICAgICAgaGl0c1tsXT1zcHJpbnRmKEFMSUZPUk1BVCwgaGl0c1tsXSwgcHJlc2VudF9hbGlhcyhhbGlhc2VzW2hpdHNbbF1dKSk7CisgICAgICAgIE1vcmUoIkZvbGdlbmRlIEFsaWFzZSBiZWdpbm5lbiBtaXQgXCIiK3N0cisiXCI6XG4iK2ltcGxvZGUoaGl0cywiXG4iKSk7CisgICAgICB9CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJEdSBoYXN0IGtlaW4gQWxpYXMgXCIlc1wiIGRlZmluaWVydC5cbiIsc3RyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXBvcykKKyAgeworICAgIHdyaXRlKCJGZWhsZXI6IEJsYW5jIGFtIEFsaWFzLUFuZmFuZ1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKChjb21tYW5kPXN0clswLi5wb3MtMV0pPT0idW5hbGlhcyIpCisgIHsKKyAgICB3cml0ZQorICAgICAgKCJFcyBuaWNodCBtb2VnbGljaCwgZGVuIEJlZmVobCB1bmFsaWFzIHp1IHVlYmVybGFkZW4gKHdhZXIgZHVtbSA6KSlcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICgoY29tbWFuZD1zdHJbMC4ucG9zLTFdKT09IioiKQorICB7CisgICAgd3JpdGUKKyAgICAgICgiRXMgbmljaHQgbW9lZ2xpY2gsIGRlbiBCZWZlaGwgXCIqXCIgenUgdWViZXJsYWRlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgc3RyPXN0cltwb3MrMS4uXSx0bXA9KHt9KTsKKyAgd2hpbGUgKGw9c2l6ZW9mKHN0cikpIHsKKyAgICBwb3M9MCxjb250PTE7CisgICAgd2hpbGUgKGNvbnQpIHsKKyAgICAgIGlmIChwb3M8bCkgeworICAgICAgICBpZihzdHJbcG9zXT09J1xcJykgeworICAgICAgICAgIHN0cj1zdHJbMC4ucG9zLTFdK3N0cltwb3MrMS4uXTsKKyAgICAgICAgICBsLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHN0cltwb3NdPT0nJicgfHwgc3RyW3Bvc109PSckJykgeworICAgICAgICAgICAgY29udD0wOworICAgICAgICAgICAgaWYgKHBvcz4wKSB7CisgICAgICAgICAgICAgIHRtcCs9KHtzdHJbMC4ucG9zLTFdfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zPT1sLTEpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJGZWhsZXI6ICVjIGFtIFplaWxlbmVuZGVcbiIsc3RyW3Bvc10pOworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobnVtPXN0clsrK3Bvc10pPT0nKicpIHsKKyAgICAgICAgICAgICAgbnVtPTE7CisgICAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbnVtLT0nMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtPDAgfHwgbnVtPjkpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCJGZWhsZXI6IE5hY2ggJWMgbXVzcyBaaWZmZXIgb2RlciAqIGZvbGdlblxuIiwKKyAgICAgICAgICAgICAgIHN0cltwb3MtMV0pOworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RyPXN0cltwb3MrMS4uXSkhPSIiJiZzdHJbMF09PScqJykgeworICAgICAgICAgICAgICBzdHI9c3RyWzEuLl07CisgICAgICAgICAgICAgIG51bT0tbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wKz0oe251bX0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb3MrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnQ9MDsKKyAgICAgICAgaWYgKHN0ciE9IiIpIHRtcCs9KHtzdHJ9KTsKKyAgICAgICAgc3RyPSIiOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoKCFhbGlhc2VzW2NvbW1hbmRdKSAmJiAoc2l6ZW9mKGFsaWFzZXMpPjIwMDApKQorICAgIHByaW50ZigiRHUgaGFzdCBzY2hvbiBnZW51ZWdlbmQgQWxpYXNlIGRlZmluaWVydCFcbiIpOworICBlbHNlCisgIHsKKyAgICBhbGlhc2VzW2NvbW1hbmRdPXRtcDsKKyAgICBwcmludGYoIk5ldWVzIEFsaWFzOiAlc1x0PSAlc1xuIixjb21tYW5kLHByZXNlbnRfYWxpYXModG1wKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdW5hbGlhcyhzdHJpbmcgc3RyKSB7CisgIGludCBpOworICBzdHJpbmcgKmFscyx1bTsKKworICBpZiAodW5tb2RpZmllZCYmdW5tb2RpZmllZCE9IiIpCisgICAgdW09aW1wbG9kZShvbGRfZXhwbG9kZSh1bm1vZGlmaWVkLCIgIilbMS4uXSwiICIpOworICBpZiAodW09PSIiKSB1bT0wOworICBpZiAoICEoc3RyPXVtIHx8IF91bnBhcnNlZF9hcmdzKCkpKSByZXR1cm4gMDsKKyAgaWYgKHN0ciA9PSAiKi4qIiB8fCBzdHIgPT0gIioiKSB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIlZlcnN1Y2hzIG1hbCBtaXQgJ3VuYWxpYXMgLionLCB3ZW5uIER1IHdpcmtsaWNoIGFsbGUgQWxpYXMgZW50ZmVybmVuICIKKyAgICAgICJ3aWxsc3QuIiw3OCkpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghbWVtYmVyKGFsaWFzZXMsc3RyKSkgeworICAgIGFscz1yZWdleHAobV9pbmRpY2VzKGFsaWFzZXMpLCgiXiIrc3RyKyIkIikpOworICAgIGlmICghKGk9c2l6ZW9mKGFscykpKSB7CisgICAgICB3cml0ZSgiU28gZWluIEFsaWFzIGhhc3QgRHUgbmljaHQgZGVmaW5pZXJ0LlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yICgtLWk7aT49MDtpLS0pCisgICAgICBtX2RlbGV0ZShhbGlhc2VzLGFsc1tpXSk7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCgiRHUgZW50ZmVybnN0IGZvbGdlbmRlIEFsaWFzZTogIisKKyAgICAgIGltcGxvZGUoYWxzLCIgIikrIi5cbiIpLDc1KSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbV9kZWxldGUoYWxpYXNlcyxzdHIpOworICB3cml0ZSgiRHUgZW50ZmVybnN0IGRhcyBBbGlhcyBcIiIrc3RyKyJcIi5cbiIpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBzdHJpbmcgX3VucGFyc2VkX2FyZ3MoaW50IGxldmVsKQoreworICByZXR1cm4gdW5wYXJzZWRfYXJnc1tsZXZlbF07Cit9CisKKyNkZWZpbmUgQVJUSUtFTCAoeyJkYXMiLCJkZXIiLCJkaWUiLCJkZXMiLCJkZW0iLCJkZW4iLCJlaW4iLCJlaW5lIiwiZWluZXIiLFwKKyAgICAgICAgICAgICAgICAgICJlaW5lcyJ9KQorCisjZGVmaW5lIFRSRU5ORVIgKHsiaW4iLCJhdXMiLCJ1ZWJlciIsImF1ZiIsInVudGVyIiwibWl0IiwiZHVyY2giLCJmdWVyIixcCisgICAgICAgICAgICAgICAgICAidm9uIiwidm9tIiwiaW0iLCJhdWZzIiwiZWluIiwid2VnIiwienVydWVjayJ9KQorCitzdGF0aWMgc3RyaW5nIF9zaW5nbGVfc3BhY2VzKHN0cmluZyBzdHIpCit7CisgIHJldHVybiByZWdyZXBsYWNlKHN0ciwgIiAgKiIsICIgIiwgMSk7Cit9CisKK3N0YXRpYyBtaXhlZCBfcmV0dXJuX2FyZ3Moc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0LCp0Mix2ZXJiLHMyOworICBpbnQgaSxsLGosbDI7CisKKyAgdD1leHBsb2RlKHRyaW0oc3RyLFRSSU1fQk9USCksIiAiKTsKKyAgdmVyYj10WzBdOworICB0ID0gdFsxLi5dOworICBpZiAoIXNpemVvZih0KSkKKyAgeworICAgIHVucGFyc2VkX2FyZ3NbMF09dW5wYXJzZWRfYXJnc1sxXT11bnBhcnNlZF9hcmdzWzJdPTA7CisgICAgcmV0dXJuIHN0cj12ZXJiOworICB9CisgIGVsc2UKKyAgICBzdHIgPSB1bnBhcnNlZF9hcmdzWzBdID0gaW1wbG9kZSh0LCAiICIpOworCisgIHN0cj11bnBhcnNlZF9hcmdzWzFdPWxvd2VyX2Nhc2UoX3NpbmdsZV9zcGFjZXMoc3RyKSk7CisgIHQ9cmVnZXhwbG9kZShzdHIsIlxcPGltXFw+fFxcPGluc1xcPiIpOworICBmb3IgKGk9MTtpPHNpemVvZih0KTtpKz0yKSB0W2ldPSJpbiI7CisgIHQ9cmVnZXhwbG9kZShpbXBsb2RlKHQsIiIpLCJbXFwsXFwhXFw6XVtcXCxcXCFcXDpdKiIpOworICBsPXNpemVvZih0KTsKKyAgZm9yKGk9MTtpPGw7aSs9MikgdFtpXT0iIjsKKyAgdD1vbGRfZXhwbG9kZShpbXBsb2RlKHQsIiIpLCIgIiktKHsiIn0pOworICBmb3IgKGk9c2l6ZW9mKHQpLTI7aT49MDtpLS0pCisgIHsKKyAgICBpZiAobWVtYmVyKEFSVElLRUwsdFtpXSk+PTApCisgICAgICB0PXRbMC4uaS0xXSt0W2krMS4uXTsKKyAgfQorICB1bnBhcnNlZF9hcmdzWzJdPWltcGxvZGUodCwiICIpOworICB0PXJlZ2V4cGxvZGUoKHN0cj1pbXBsb2RlKHQsIiAiKSksIlswLTldWzAtOV0qXFwuIik7CisgIGlmICgobD1zaXplb2YodCkpPjIpCisgIHsKKyAgICBpPTE7CisgICAgd2hpbGUgKGk8bC0xKQorICAgIHsKKyAgICAgIHRbaV09IiAiK3RbaV1bMC4uPDJdKyIgIjsKKyAgICAgIGlmICgobDI9c2l6ZW9mKHQyPW9sZF9leHBsb2RlKHRbaSsxXSwiICIpKSk8MikKKyAgdFtpKzFdKz10W2ldOworICAgICAgZWxzZQorICAgICAgeworICBmb3IgKGo9MTtqPGwyO2orKykKKyAgeworICAgIGlmIChtZW1iZXIoVFJFTk5FUix0MltqXSk+PTApCisgICAgeworICAgICAgdDJbai0xXSs9dFtpXTsKKyAgICAgIGwyPTA7CisgICAgfQorICB9CisgIGlmICghbDIpCisgICAgdFtpKzFdPWltcGxvZGUodDIsIiAiKTsKKyAgZWxzZQorICAgIHRbaSsxXSs9dFtpXTsKKyAgICAgIH0KKyAgICAgIHRbaV09IiI7CisgICAgICBpKz0yOworICAgIH0KKyAgICBzdHI9X3NpbmdsZV9zcGFjZXModmVyYisiICIraW1wbG9kZSh0LCIgIikpOworICAgIGlmIChzdHJbPDFdPT0nICcpIHN0cj1zdHJbMC4uPDJdOworICB9IGVsc2Ugc3RyPXZlcmIrKHN0cj09IiI/IiI6IiAiK3N0cik7CisgIGlmIChzaG93X3Byb2Nlc3Npbmc+MikKKyAgICBwcmludGYoIi0+IHslc31cbiIsc3RyKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHZvaWQgZGVjYXlfYXZlcmFnZSgpCit7CisgIGlmIChhYnNvbHV0ZV9oYl9jb3VudCgpLWxhc3RfY2hnPjE0KQorICB7CisgICAgbGFzdF9jaGc9YWJzb2x1dGVfaGJfY291bnQoKS1sYXN0X2NoZzsKKyAgICBpZiAobGFzdF9jaGc+MzAwMCkKKyAgICAgIGxhc3RfY2hnPWFic29sdXRlX2hiX2NvdW50KCksY21kc19wZXJfdGltZT0wOworICAgIGVsc2UKKyAgICB7CisgICAgICB3aGlsZSAobGFzdF9jaGc+MTQpCisgIGNtZHNfcGVyX3RpbWU9Y21kc19wZXJfdGltZSo5LzEwLCBsYXN0X2NoZy09MTU7CisgICAgICBsYXN0X2NoZz1hYnNvbHV0ZV9oYl9jb3VudCgpLWxhc3RfY2hnOworICAgIH0KKyAgfQorfQorCitwcml2YXRlIHZvaWQgRGVsYXlQcmVwYXJlZFNwZWxscygpIHsKKyAgbWl4ZWQgcHM7CisKKyAgaWYgKHBvaW50ZXJwKHBzPVF1ZXJ5UHJvcChQX1BSRVBBUkVEX1NQRUxMKSkKKyAgICAgICYmIHNpemVvZihwcyk+PTEgJiYgaW50cChwc1swXSkpIHsKKyAgICBwc1swXSsrOworICAgIFNldFByb3AoUF9QUkVQQVJFRF9TUEVMTCxwcyk7CisgICAgd3JpdGUoIkRpZSBBdXNmdWVocnVuZyBEZWluZXMgdm9yYmVyZWl0ZXRlbiBTcHJ1Y2hlcyB3aXJkIHZlcnpvZWdlcnQuXG4iKTsKKyAgfSBlbHNlIGlmIChwcykgeworICAgIFNldFByb3AoUF9QUkVQQVJFRF9TUEVMTCwwKTsKKyAgfQorfQorCitzdGF0aWMgbWl4ZWQgYmI7CisjaWZuZGVmIEJCTUFTVEVSCisjZGVmaW5lIEJCTUFTVEVSICIvc2VjdXJlL2JibWFzdGVyIgorI2VuZGlmCisKKy8qKiBJbnRlcnByZXRpZXJ0IEFsaWFzZSB1bmQgSGlzdG9yeS1Lb21tYW5kb3MKKyAgRWlnZW50bGljaCBtdWVzc3RlIGhpZXIgbm9jaCBkaWUgVW13YW5kbHVuZyBkZXIgU29uZGVyemVpY2hlbgorICB2ZXJzY2hpZWRlbmVyIFplaWNoZW5zYWV0emUgbWl0IGNvbnZlcnRfY2hhcnNldCBnZW1hY2h0IHdlcmRlbiwKKyAgYWJlciBub2NoIGdpYnQgZXMga2VpbmUgTW9lZ2xpY2hrZWl0LCBkZW4gdm9tIFNwaWVsZXIgZ2VudXR6dGVuCisgIFplaWNoZW5zYXR6IHp1IGlkZW50aWZpemllcmVuLgorICBccGFyYW1baW5dIHN0ciBzdHJpbmcgLSBLb21tYW5kbyBkZXMgU3BpZWxlcnMKKyAgXHJldHVybiBpbnRlcnByZXRpZXJ0ZXMgQWxpYXMgYnp3LiBrb3JyZWt0ZXMgS29tbWFuZG8gYXVzIGRlciBIaXN0b3J5CisqLworcHJpdmF0ZSBzdHJpbmcgcGFyc2Vjb21tYW5kKHN0cmluZyBzdHIpCit7CisgIGlmIChzdHJbMF09PSdcXCcpCisgIHsKKyAgICAvLyBLb21tYW5kbyBzb2xsIG5pY2h0IGludGVycHJldGllcnQgd2VyZGVuCisgICAgcmV0dXJuIHN0clsxLi5dOworICB9CisgIGVsc2UgaWYgKHN0clswXT09JyYnKQorICB7CisgICAgLy8gS29tbWFuZG8gYXVzIGRlciBIaXN0b3J5CisgICAgc3RyaW5nIGNtZCA9IHN0clsxLi5dOworICAgIGludCBjbWRfc2l6ZSA9IHNpemVvZihjbWQpOworICAgIGludCBjbWRfZm91bmQgPSAwOworICAgIGlmIChjbWRfc2l6ZSkKKyAgICB7CisgICAgICAvLyBUZXN0IG9iICY8dGV4dD4gZXR3YXMgZmluZGV0CisgICAgICBmb3IgKGludCBpPTA7aTxoaXN0X3NpemUtMSAmJiAhY21kX2ZvdW5kO2krKykKKyAgICAgIHsKKyAgICAgICAgaW50IGlkeCA9IChoaXN0X3NpemUtaStoaXN0X25vdy0xKSVoaXN0X3NpemU7CisgICAgICAgIGlmIChoaXN0b3J5W2lkeF1bMC4uY21kX3NpemUtMV09PWNtZCkKKyAgICAgICAgeworICAgICAgICAgIHN0ciA9IGhpc3RvcnlbaWR4XTsKKyAgICAgICAgICBjbWRfZm91bmQgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChjbWRfZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc2hvd19wcm9jZXNzaW5nKQorICAgICAgICAgICAgcHJpbnRmKCJbJXNdXG4iLHN0cik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFjbWRfZm91bmQpCisgICAgeworICAgICAgLy8gVGVzdCwgb2IgJjxucj4ga2xhcHB0CisgICAgICBpbnQgbnVtbWVyOworICAgICAgaWYgKHN0cj09IiYmIikKKyAgICAgICAgc3RyID0gIiYtMCI7CisgICAgICBpZiAoc3NjYW5mKHN0ciwiJiVkIixudW1tZXIpKQorICAgICAgeworICAgICAgICBpZiAobnVtbWVyPDAgfHwgKCFudW1tZXIgJiYgc3RyWzFdPT0nLScpKQorICAgICAgICB7CisgICAgICAgICAgaWYgKG51bW1lcjwtKGhpc3Rfc2l6ZS0xKSkKKyAgICAgICAgICAgIG51bW1lcj0tMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBudW1tZXI9KGhpc3Rfbm93K251bW1lci0xK2hpc3Rfc2l6ZSklaGlzdF9zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGlmIChudW1tZXI+aGlzdF9ub3cgfHwgaGlzdF9ub3ctbnVtbWVyPmhpc3Rfc2l6ZSkKKyAgICAgICAgICAgIG51bW1lcj0tMTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBudW1tZXI9bnVtbWVyJWhpc3Rfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtbWVyPDAgCisgICAgICAgICAgICB8fCAoIChjbWQ9aGlzdG9yeVtudW1tZXJdKSA9PSJcblxuIikgKQorICAgICAgICAgIG5vdGlmeV9mYWlsKCJEZXIgQmVmZWhsIGlzdCBuaWNodCBpbiBkZXIgSGlzdG9yeSFcbiIpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdHIgPSBjbWQ7CisgICAgICAgICAgaWYgKHNob3dfcHJvY2Vzc2luZykKKyAgICAgICAgICAgIHByaW50ZigiWyVzXVxuIixzdHIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHN3aXRjaCAoc3RyKQorICB7CisgICAgY2FzZSAibiI6IHJldHVybiAibm9yZGVuIjsKKyAgICBjYXNlICJzIjogcmV0dXJuICJzdWVkZW4iOworICAgIGNhc2UgInciOiByZXR1cm4gIndlc3RlbiI7CisgICAgY2FzZSAibyI6IHJldHVybiAib3N0ZW4iOworICAgIGNhc2UgIm53IjogcmV0dXJuICJub3Jkd2VzdGVuIjsKKyAgICBjYXNlICJzdyI6IHJldHVybiAic3VlZHdlc3RlbiI7CisgICAgY2FzZSAic28iOiByZXR1cm4gInN1ZWRvc3RlbiI7CisgICAgY2FzZSAibm8iOiByZXR1cm4gIm5vcmRvc3RlbiI7CisgICAgY2FzZSAib2IiOiByZXR1cm4gIm9iZW4iOworICAgIGNhc2UgInUiOiByZXR1cm4gInVudGVuIjsKKyAgfQorICAvLyBUZXN0IGF1ZiBBbGlhcworICBzdHJpbmcgb3V0cHV0ID0gIiI7CisgIHN0cmluZyogaW5wdXQgPSBleHBsb2RlKHN0ciwiICIpOworICBpbnQgaW5wdXRfc2l6ZSA9IHNpemVvZihpbnB1dCk7CisgIG1peGVkIGFsaWFzID0gYWxpYXNlc1tpbnB1dFswXV07CisgIGlmICghYWxpYXMpCisgICAgcmV0dXJuIHN0cjsKKyAgZm9yZWFjaCAobWl4ZWQgYTphbGlhcykKKyAgeworICAgIGlmICghaW50cChhKSkKKyAgICAgIG91dHB1dCArPSBhOworICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoYSA+PSAwKQorICAgICAgeworICAgICAgICBpZiAoaW5wdXRfc2l6ZSA+IGEpCisgICAgICAgICAgb3V0cHV0ICs9IGlucHV0W2FdOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBhID0gLWE7CisgICAgICAgIGlmIChpbnB1dF9zaXplID4gYSkKKyAgICAgICAgICBvdXRwdXQgKz0gaW1wbG9kZShpbnB1dFthLi5dLCIgIik7CisgICAgICB9CisgICAgfQorICB9CisgIG91dHB1dCA9IF9zaW5nbGVfc3BhY2VzKG91dHB1dCk7CisgIHN0ciA9IHRyaW0ob3V0cHV0LFRSSU1fUklHSFQpOworICBpZiAoc2hvd19wcm9jZXNzaW5nPjEpCisgICAgcHJpbnRmKCJbJXNdXG4iLHN0cik7CisgIHJldHVybiBzdHI7Cit9CisKKy8qKiBCZWhhbmRlbHQgYWxsZSBTb25kZXJmYWVsbGUgZGVyIEVpbmdhYmUgZGVzIFNwaWVsZXJzCisgIEFsbGUgQmVmZWhsZSBkZXMgU3BpZWxlcnMsIGRpZSBuaWNodCBkdXJjaCBPYmpla3RlIGJlaGFuZGVsdAorICB3ZXJkZW4gc29sbGVuLCB3ZXJkZW4gaGllciBlcmthbm50IHVuZCBhdXNnZWZ1ZWhydC4KKyAgRGF6dSBnZWhvZXJ0IGF1Y2ggZGllIEludGVycHJldGF0aW9uIHZvbiBBbGlhc2VzIHVuZCBIaXN0b3J5LQorICBiZWZlaGxlbi4KKyAgXHBhcmFtW2luXSBzdHIgc3RyaW5nOiBLb21tYW5kbyBkZXMgU3BpZWxlcnMKKyAgXHJldHVybiBhdXN6dWZ1ZWhyZW5kZXMgS29tbWFuZG8KKyAgICBvZGVyIDAgZnVlciBlaW4gbmljaHQgaW50ZXJwcmV0aWVyYmFyZXMgS29tbWFuZG8KKyAgICBvZGVyIDEgZnVlciBlaW4gYmVyZWl0cyBkdXJjaGdlZnVlaHJ0ZXMgS29tbWFuZG8KKyovCittaXhlZCBtb2RpZnlfY29tbWFuZChzdHJpbmcgc3RyKQoreworCisgIGlmIChleHRlcm5fY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICYmCisgICAgICAocHJldmlvdXNfb2JqZWN0KCkhPXRoaXNfb2JqZWN0KCkgfHwgcHJvY2Vzc19jYWxsKCkpICkKKyAgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gTGVlcnplaWNoZW4gYW4gZGVuIEVuZGVuIGFic2NobmVpZGVuLgorICBzdHIgPSB0cmltKHN0ciwgVFJJTV9CT1RIKTsKKworICBpZiAoYmIpCisgICAgQkJNQVNURVItPkJCV3JpdGUodHJpbShzdHIsVFJJTV9SSUdIVCwiXG4iKSwgMCk7CisKKyAgZGVjYXlfYXZlcmFnZSgpOworICBjbWRzX3Blcl90aW1lKz0xMDAwMDsKKworICB1bnBhcnNlZF9hcmdzWzBdPXVucGFyc2VkX2FyZ3NbMV09dW5wYXJzZWRfYXJnc1syXT11bm1vZGlmaWVkPSIiOyAKKworICBpZiAoIXNpemVvZihzdHIpKSByZXR1cm4gIiI7CisKKyAgLy8gS29tbWFuZG8gd2lyZCBnZXBhcnN0CisgIHVubW9kaWZpZWQ9cGFyc2Vjb21tYW5kKHN0cik7CisKKyAgLy8gRW52aXJvbm1lbnQgc2Nob25tYWwgbWVya2VuLgorICBsYXN0X2NvbW1hbmRfZW52PWVudmlyb25tZW50KCk7CisKKyAgaWYgKHVubW9kaWZpZWQgPT0gIiIpCisgICAgICByZXR1cm4gIiI7CisgIC8vIEtvbW1hbmRvIGluIEhpc3RvcnkgbWVya2VuLCBhdWNoIHdlbm4gZXMgaW0gS29tbWFuZG9ibG9jayBhYmdlYnJvY2hlbgorICAvLyB3aXJkLgorICBBZGRIaXN0b3J5KHVubW9kaWZpZWQpOworCisgIC8vIHBydWVmZW4sIG9iIEtvbW1hbmRvYmxvY2sgZ2VzZXR6dCBpc3QuCisgIC8vIChGdWVyIE1hZ2llciBtaXQgbXNjaGF1IGVpbiB3aXJkIGRhcyBpZ25vcmllcnQuKQorICAvLyBCVFc6IEVzIHdpcmQgYWJzaWNodGxpY2ggbmljaHQgZGFzIEVyZ2VibmlzIGRlciBDbG9zdXJlIHp1cnVlY2tnZWdlYmVuLAorICAvLyBzb25zdCB3dWVyZGUgbWFuIGJlbGllYmlnZW4gT2JqZWt0ZW4gbmljaHQgbnVyIGRhcyBBYmJyZWNoZW4sIHNvbmRlcm4KKyAgLy8gYXVjaCBkYXMgQWVuZGVybiB2b24gS29tbWFuZG9zIGVybW9lZ2xpY2hlbi4KKyAgaWYgKGRpc2FibGVjb21tYW5kcyAmJiAhSVNfTEVBUk5JTkcoTUUpICkKKyAgeworICAgIGlmIChkaXNhYmxlY29tbWFuZHNbQl9USU1FXSA+PSB0aW1lKCkKKyAgICAgICYmIG9iamVjdHAoZGlzYWJsZWNvbW1hbmRzW0JfT0JKRUNUXSkpCisgICAgeworICAgICAgLy8gZGlzYWJsZWNvbW1hbmRzIHZhbGlkCisgICAgICAvLyBoYXJ0LWtvZGllcnRlIEF1c25hbWVsaXN0ZSBwcnVlZmVuCisgICAgICBpZiAoIG1lbWJlcigoeyJtcnVmZSIsIm1zY2hhdSIsImJ1ZyIsImlkZWUiLCJ0eXBvIiwiZGV0YWlsIn0pLAorICAgICAgICAgICAgZXhwbG9kZShzdHIsIiAiKVswXSkgPT0gLTEpCisgICAgICB7CisgICAgICAgIGlmIChjbG9zdXJlcChkaXNhYmxlY29tbWFuZHNbQl9WQUxVRV0pKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGZ1bmNhbGwoZGlzYWJsZWNvbW1hbmRzW0JfVkFMVUVdLF9yZXR1cm5fYXJncyh1bm1vZGlmaWVkKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gTm9uLXplcm8gQ2xvc3VyZS1FcmdlYm5pcywgQWJicnVjaC4gRGllIGdlcnVmZW5lIEZ1bmt0aW9uIGlzdAorICAgICAgICAgICAgLy8gZnVlciBlaW5lIGdlZWlnbmV0ZSBNZWxkdW5nIGFuIGRlbiBTcGllbGVyIHZlcmFudHdvcnRsaWNoLgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHdlbm4gVGV4dCwgZGFubiBhdWNoIHBydWVmZW4sIG9iIGRhcyBLb21tYW5kb3ZlcmIgaW4gZGVuIEF1c25haG1lbgorICAgICAgICAvLyBzdGVodC4gKHF1ZXJ5X3ZlcmIoKSBnZWh0IGxlaWRlciBoaWVyIG5vY2ggbmljaHQuKQorICAgICAgICBlbHNlIGlmIChzdHJpbmdwKGRpc2FibGVjb21tYW5kc1tCX1ZBTFVFXSkKKyAgICAgICAgICAgICAgICAgJiYgbWVtYmVyKGRpc2FibGVjb21tYW5kc1tCX0VYQ0VQVElPTlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbG9kZShzdHIsIiAiKVswXSkgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBtZWxkdW5nIGF1c2dlYmVuLi4uCisgICAgICAgICAgdGVsbF9vYmplY3QoUEwsIGRpc2FibGVjb21tYW5kc1tCX1ZBTFVFXSk7CisgICAgICAgICAgLy8gdW5kIEVuZGUuLi4KKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIGRpc2FibGVjb21tYW5kcz0wOworICB9CisKKyAgLy8gVmVyZm9sZ2VyIGRpcmVrdCBpbnMgRW52IHJlaW5ob2xlbi4KKyAgaWYgKHJlbW92ZV9jYWxsX291dCgiVGFrZUZvbGxvd2VycyIpPj0wKQorICAgIGNhdGNoKFRha2VGb2xsb3dlcnMoKTtwdWJsaXNoKTsKKworICBEZWxheVByZXBhcmVkU3BlbGxzKCk7CisKKyAgLy8gSGlzdG9yeWVpbnRyYWcga29ycmlnaWVyZW4KKyAgaWYgKHVubW9kaWZpZWRbMF09PSdeJykKKyAgeworICAgIHN0cmluZyAqb2xkbmV3LHByZSxwb3N0OworICAgIGlmIChzaXplb2Yob2xkbmV3PWV4cGxvZGUodW5tb2RpZmllZCwiXiIpKT4yKQorICAgIHsKKyAgICAgIGludCBoaXN0X2lkeCA9IChoaXN0X25vdy0xKSVoaXN0X3NpemU7CisgICAgICBzc2NhbmYoaGlzdG9yeVtoaXN0X2lkeF0sIiVzIitvbGRuZXdbMV0rIiVzIiwgcHJlLCBwb3N0KTsKKyAgICAgIHVubW9kaWZpZWQgPSBwcmUrb2xkbmV3WzJdK3Bvc3Q7CisgICAgICBpZiAoc2hvd19wcm9jZXNzaW5nKQorICAgICAgICB3cml0ZSgiWyIrdW5tb2RpZmllZCsiXVxuIik7CisgICAgICAvLyBrb3JyaWdpZXJ0ZXMgS29tbWFuZG8gbmF0dWVybGljaCBhdWNoIGluIGRpZSBIaXN0b3J5LgorICAgICAgQWRkSGlzdG9yeSh1bm1vZGlmaWVkKTsKKyAgICB9CisgIH0KKworICBpZiggYmIgKQorICAgIEJCTUFTVEVSLT5CQldyaXRlKCIgLT4gIiArIHVubW9kaWZpZWQsIDEpOworCisgIGlmIChzaG93X3Byb2Nlc3Npbmc+MSkKKyAgICBwcmludGYoIlslc11cbiIsdW5tb2RpZmllZCk7CisKKyAgbWl4ZWQgcmV0ID0gX3JldHVybl9hcmdzKHVubW9kaWZpZWQpOworCisgIC8vIHdlbm4gU3BpZWxlciBlaW5nZXdpbGxpZ3QgaGF0IHVuZCBkaWUgU3ludGF4REIgZ2VsYWRlbiBpc3QsIEJlZmVobAorICAvLyBkb3J0aGluIG1lbGRlbi4KKyAgaWYgKHN5bnRheGRiKQorICB7CisgICAgaWYgKCFvYmplY3RwKHN5bnRheGRiWzBdKSkKKyAgICAgIHN5bnRheGRiWzBdID0gZmluZF9vYmplY3QoIi9zZWN1cmUvc3ludGF4ZGIiKTsKKyAgICBpZiAoc3ludGF4ZGJbMF0pCisgICAgICBjYXRjaChzeW50YXhkYlswXS0+c3RhcnRfY21kKHVubW9kaWZpZWQpO25vbG9nKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRvX2xpc3Qoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICpjbWRsaXN0OworICBpbnQgaTsKKworICBpZiAoIVF1ZXJ5UHJvcChQX1dBTlRTX1RPX0xFQVJOKSkKKyAgICByZXR1cm4gMDsKKyAgY21kbGlzdD1vbGRfZXhwbG9kZShfdW5wYXJzZWRfYXJncygpfHwiIiwiOyIpLSh7ICIiIH0pOworICBmb3IgKGk9MDtpPHNpemVvZihjbWRsaXN0KTtpKyspCisgIHsKKyAgICBjbWRsaXN0W2ldPWltcGxvZGUob2xkX2V4cGxvZGUoY21kbGlzdFtpXSwiICIpLSh7fSksICIgIik7CisgICAgaWYgKHNob3dfcHJvY2Vzc2luZykKKyAgICAgIHdyaXRlKCJbIitjbWRsaXN0W2ldKyJdXG4iKTsKKyAgICBjb21tYW5kKGNtZGxpc3RbaV0pOworICB9CisgIHJldHVybiAxOworfQorCisvL2ZhbGxzIGRpZSBhbGlhc2xpc3RlIGthcHV0dCBpc3QgLi4uCisKK2ludCB1bmFsaWFzX2FsbCgpCit7CisgIGlmIChJU19FTERFUih0aGlzX2ludGVyYWN0aXZlKCkpKSBhbGlhc2VzPShbXSk7CisgIHJldHVybiAxOworfQorCitvYmplY3QgX3F1ZXJ5X2xhc3RfY29tbWFuZF9lbnYoKQoreworICByZXR1cm4gbGFzdF9jb21tYW5kX2VudjsKK30KKworaW50IF9xdWVyeV9zaG93X2FsaWFzX3Byb2Nlc3NpbmcoKQoreworICByZXR1cm4gc2hvd19wcm9jZXNzaW5nOworfQorCitpbnQgX3F1ZXJ5X2hpc3RtaW4oKQoreworICByZXR1cm4gaGlzdG1pbjsKK30KKwordmFyYXJncyB2b2lkIEFkZEFjdGlvbihtaXhlZCBmdW4sIG1peGVkIGNtZCwgaW50IGZsYWcsIGludCBsdmwpCit7CisgIGludCBpOworICBtaXhlZCAqY21kczsKKworICBsb2dfZmlsZSggIkFSQ0gvQUREX0FDVElPTiIsIHNwcmludGYoCisJIiVzOlxuICBUTzogJU8gVFA6ICVPIFBPOiAlT1xuICAgZnVuOiAlTyBjbWQ6ICVPIGZsYWc6ICVPIGx2bDogJU8iLAorICAgICAgICBkdGltZSh0aW1lKCkpLCB0aGlzX29iamVjdCgpLCB0aGlzX3BsYXllcigpLCBwcmV2aW91c19vYmplY3QoKSwKKwlmdW4sIGNtZCwgZmxhZywgbHZsKSk7CisKKyAgaWYgKCEoY21kcz1RdWVyeShQX0xPQ0FMQ01EUykpKSBjbWRzPSh7fSk7CisKKyAgaWYgKCFwb2ludGVycChjbWQpKSBjbWQ9KHtjbWR9KTsKKworICBmb3IgKGkgPSBzaXplb2YoY21kKS0xOyBpPj0wOyBpLS0pCisgICAgY21kcyArPSAoeyh7IGNtZFtpXSAsIGZ1biwgZmxhZywgbHZsfSl9KTsKKworICBTZXQoUF9MT0NBTENNRFMsIGNtZHMpOworfQorCitzdGF0aWMgaW50IGF1c3dlcnRlbihtaXhlZCBjbWQsIHN0cmluZyBzdHIpCit7CisgIGlmIChjbG9zdXJlcChjbWQpKQorICAgIHJldHVybiBmdW5jYWxsKGNtZCxzdHIpOworICBpZiAoc3RyaW5ncChjbWQpKQorICAgIHJldHVybiBjYWxsX290aGVyKHRoaXNfb2JqZWN0KCksY21kLHN0cik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdmFyYXJncyBpbnQgX19hdXN3ZXJ0ZW4oc3RyaW5nIHN0ciwgc3RyaW5nIGludGVybikKK3sKKyAgc3RyaW5nIHZlcmI7CisgIG1peGVkICpjbWQsIGNtZHM7CisgIGludCBpLHJldCxsdmwsbCx2bDsKKworICBpZiAoIWludGVybikKKyAgICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgZWxzZQorICAgIHZlcmI9aW50ZXJuOworICBsdmw9cXVlcnlfd2l6X2xldmVsKE1FKTsKKyAgdmw9c2l6ZW9mKHZlcmIpOworICBjbWRzPVF1ZXJ5UHJvcChQX0xPQ0FMQ01EUyk7CisKKyAgZm9yKGk9c2l6ZW9mKGNtZHMpLTE7aT49MDtpLS0pCisgIHsKKyAgICBjbWQ9Y21kc1tpXSxsPXNpemVvZihjbWRbMF0pOworICAgIGlmIChjbWRbMF09PXZlcmJbMC4ubC0xXSAmJiBjbWRbM108PWx2bCAmJiAoY21kWzJdfHx2bD09bCkgJiYKKyAgKHJldD1hdXN3ZXJ0ZW4oY21kWzFdLHN0cikpKQorICAgICAgcmV0dXJuIHJldDsKKyAgfQorICAvLyBBbiBkaWVzZXIgU3RlbGxlIGdpYnQgZXMgaGllciB1bmQgdmVybXV0bGljaCBuaXJnZW5kd28gYW5kZXJzIGV0d2FzLCB3YXMKKyAgLy8gZGllc2VzIEtvbW1hbmRvIGFscyBndWVsdGlnIGJldHJhY2h0ZXQuIFdpciBpbmZvcm1pZXJlbiBnZ2YuIGRpZQorICAvLyBTeW50YXgtREIuIChBY2h0dW5nOiB3ZW5uIGplbWFuZCBuZSBhZGRfYWN0aW9uKCkgaW0gU3BpZWxlcm9iamVrdAorICAvLyBlaW5iYXV0LCBkaWUgdm9yIGRpZXNlciBlaW5nZXRyYWdlbiB3aXJkLCBpc3QgZGllIEFubmFobWUgZ2dmLiBmYWxzY2guKQorICAvLyB3ZW5uIFNwaWVsZXIgZWluZ2V3aWxsaWd0IGhhdCB1bmQgZGllIFN5bnRheERCIGdlbGFkZW4gaXN0LCBCZWZlaGwKKyAgLy8gZG9ydGhpbiBtZWxkZW4uCisgIGlmIChzeW50YXhkYikKKyAgeworICAgIGlmICghb2JqZWN0cChzeW50YXhkYlswXSkpCisgICAgICBzeW50YXhkYlswXSA9IGZpbmRfb2JqZWN0KCIvc2VjdXJlL3N5bnRheGRiIik7CisgICAgaWYgKHN5bnRheGRiWzBdKQorICAgICAgY2F0Y2goc3ludGF4ZGJbMF0tPmNtZF91bnN1Y2Nlc3NmdWwoKTtub2xvZyk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworcHVibGljIHZvaWQgc3ludGF4X2xvZ19lcChpbnQgdHlwZSkKK3sKKyAgLy8gd2VubiBTcGllbGVyIGVpbmdld2lsbGlndCBoYXQgdW5kIGRpZSBTeW50YXhEQiBnZWxhZGVuIGlzdCwgQmVmZWhsCisgIC8vIGRvcnRoaW4gbWVsZGVuLgorICBpZiAoc3ludGF4ZGIgJiYgc3ludGF4ZGJbMF0pCisgIHsKKyAgICAgIGNhdGNoKHN5bnRheGRiWzBdLT5Mb2dFUCh0eXBlKTtub2xvZyk7CisgIH0KK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKQoreworICBtaXhlZCAqbDsKKworICBsPVF1ZXJ5KFBfTE9DQUxDTURTKTsKKyAgaWYgKCFwb2ludGVycChsKSkKKyAgICBsPSh7fSk7CisgIHJldHVybiAoeworICAgICh7ImFsaSIsImFsaWFzIiwwLDB9KSwKKyAgICAoeyJhbGlhcyIsImFsaWFzIiwwLDB9KSwKKyAgICAoeyJ1bmFsaSIsInVuYWxpYXMiLDEsMH0pLAorICAgICh7Imhpc3RtaW4iLCJoaXN0bWluIiwwLDB9KSwKKyAgICAoeyJoaXN0bGVuIiwiaGlzdGxlbiIsMCwwfSksCisgICAgKHsiaGlzdCIsInNob3dfaGlzdCIsMCwwfSksCisgICAgKHsiaGlzdG9yeSIsInNob3dfaGlzdCIsMCwwfSksCisgICAgKHsiZG8iLCJkb19saXN0IiwwLExFQVJORVJfTFZMfSksCisgICAgKHsiZXJzZXR6dW5nc2FuemVpZ2UiLCJyZXBsYWNlZGlzcGxheSIsMCwwfSksCisgICAgKHsic3ludGF4c2FtbWx1bmciLCJjb2xsZWN0X2NtZHMiLDAsMH0pLAorICAgICh7ImZlaGxlcm1lbGR1bmciLCJzZXRfZXJyb3JtZXNzYWdlIiwwLFNFRVJfTFZMfSksCisgIH0pK2w7Cit9CisKK3N0YXRpYyBpbnQgY29sbGVjdF9jbWRzKHN0cmluZyBjbWQpCit7CisgIGlmICghc3RyaW5ncChjbWQpKQorICB7CisgICAgX25vdGlmeSgiTWl0IGRpZXNlbSBCZWZlaGwga2FubnN0IER1IG1pdGhlbGZlbiwgU3ludGF4ZW4gaW0gTUcgenUgIgorICAgICAgICAgICAgInZlcmJlc3Nlcm4uIFdlbm4gRHUgZWludmVyc3RhbmRlbiBiaXN0LCBzcGVpY2hlcm4gd2lyICIKKyAgICAgICAgICAgICJhbm9ueW0gKGQuaC4gb2huZSBEZWluZW4gQ2hhcm5hbWVuKSwgd2VsY2hlIERlaW5lciBCZWZlaGxlICIKKyAgICAgICAgICAgICJlcmZvbGdyZWljaCB1bmQgbmljaHQgZXJmb2xncmVpY2ggd2FyZW4uIFVlYmxpY2hlICIKKyAgICAgICAgICAgICJLb21tdW5pa2F0aW9uc2JlZmVobGUgd2VyZGVuIGRhYmVpIG5pY2h0IGdlc3BlaWNoZXJ0LiIsCisgICAgICAgICAgICAwKTsKKyAgICBfbm90aWZ5KCJNaXQgJ3N5bnRheHNhbW1sdW5nIGphJyBrYW5uc3QgRHUgZGllIFNwZWljaGVydW5nIGVpbnNjaGFsdGVuLCAiCisgICAgICAgICAgICAibWl0ICdzeW50YXhzYW1tbHVuZyBuZWluJyBrYW5uc3QgRHUgc2llIGF1c3NjaGFsdGVuLiIsMCk7CisgICAgX25vdGlmeSgiRGVpbmUgQmVmZWhsZSB3ZXJkZW4genVyIFplaXQiCisgICAgICAgICAgICArIChRdWVyeVByb3AoIl9zeW50YXhkYiIpID8gIiAiIDogIiBOSUNIVCAiKQorICAgICAgICAgICAgKyAiZ2VzcGVpY2hlcnQuIiwgMCk7CisgIH0KKyAgZWxzZSBpZiAoY21kID09ICJqYSIpCisgIHsKKyAgICBTZXRQcm9wKCJfc3ludGF4ZGIiLCAxKTsKKyAgICBfbm90aWZ5KCJBYiBqZXR6dCB3ZXJkZW4gRGVpbmUgQmVmZWhsZSBnZXNwZWljaGVydC4gVmllbGVuIERhbmshIiwgMCk7CisgIH0KKyAgZWxzZQorICB7CisgICAgU2V0UHJvcCgiX3N5bnRheGRiIiwgMCk7CisgICAgX25vdGlmeSgiQWIgamV0enQgd2VyZGVuIERlaW5lIEJlZmVobGUgTklDSFQgZ2VzcGVpY2hlcnQuIiwgMCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBfcXVlcnlfY29tbWFuZF9hdmVyYWdlKCkKK3sKKyAgZGVjYXlfYXZlcmFnZSgpOworICByZXR1cm4gY21kc19wZXJfdGltZTsKK30KKworbm9tYXNrIHZvaWQgX19zZXRfYmIoaW50IGZsYWcpICB7CisgIGlmKCBwcmV2aW91c19vYmplY3QoKSE9ZmluZF9vYmplY3QoQkJNQVNURVIpIHx8IHByb2Nlc3NfY2FsbCgpICkKKyAgICByZXR1cm47CisgIGJiPWZsYWc7Cit9CisKKworbm9tYXNrIHB1YmxpYyB2b2lkIGNvdW50Q21kcyggaW50IHR5cGUsIHN0cmluZyBrZXkgKQoreworICAgIHN0cmluZyB0bXA7CisKKyAgICBpZiAoIHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpCisgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgIT0gdGhpc19vYmplY3QoKQorICAgICAgICAgfHwgbWVtYmVyKCBjbWRfdHlwZXMsIHR5cGUgKSA8IDAgKQorICAgICAgICByZXR1cm47CisKKyAgICB0bXAgPSBzcHJpbnRmKCAiJWRcbiVzIiwgdHlwZSwga2V5ICk7CisKKyAgICBjb21tYW5kcyAtPSAoeyB0bXAgfSk7CisgICAgY29tbWFuZHMgKz0gKHsgdG1wIH0pOworICAgIGNvbW1hbmRzID0gY29tbWFuZHNbMC4ubWF4X2NvbW1hbmRzLTFdOworfQorCisKK25vbWFzayBwdWJsaWMgc3RyaW5nICpnZXRDbWRzKCkKK3sKKyAgICBzdHJpbmcgKnRtcDsKKworICAgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgIT0gZmluZF9vYmplY3QoQkJNQVNURVIpICkKKyAgICAgICAgcmV0dXJuICh7fSk7CisKKyAgICB0bXAgPSBjb21tYW5kczsKKyAgICBjb21tYW5kcyA9ICh7fSk7CisKKyAgICByZXR1cm4gdG1wOworfQorCisvKgorICogRm9yY2UgdGhlIG1vbnN0ZXIgdG8gZG8gYSBjb21tYW5kLiBUaGUgZm9yY2VfdXMoKSBmdW5jdGlvbiBpc24ndAorICogYWx3YXlzIGdvb2QsIGJlY2F1c2UgaXQgY2hlY2tzIHRoZSBsZXZlbCBvZiB0aGUgY2FsbGVyLCBhbmQgdGhpcyBmdW5jdGlvbgorICogY2FuIGJlIGNhbGxlZCBieSBhIHJvb20uCisgKi8KK2ludCBjb21tYW5kX21lKHN0cmluZyBjbWQpCit7CisgIGlmIChJU19MRUFSTkVSKE1FKSkKKyAgeworICAgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8ICFwcmV2aW91c19vYmplY3QoKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmKCBnZXRldWlkKE1FKSE9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAgIHx8IGdldGV1aWQoTUUpIT1nZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgeworICAgICAgaWYoIHF1ZXJ5X3dpel9sZXZlbChNRSk8cXVlcnlfd2l6X2xldmVsKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgICAgdGVsbF9vYmplY3QoTUUscHJldmlvdXNfb2JqZWN0KCktPm5hbWUoKSsiIHp3aW5ndCBEaWNoIHp1OiAiCisgICAgICAgICAgICAgICAgICAgICsgY21kICsgIi5cbiIpOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICB0ZWxsX29iamVjdChNRSxwcmV2aW91c19vYmplY3QoKS0+bmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiB2ZXJzdWNodCwgRGljaCB6dSAiICsgY21kICsgIiB6dSB6d2luZ2VuLlxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbW1hbmQoY21kKTsKK30KKworCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3BfbGliX2Rpc2FibGVjb21tYW5kcygpIHsKKyAgICAvLyBhYmdlbGF1ZmVuIG9kZXIgT2JqZWt0IHplcnN0b2VydD8gV2VnIGRhbWl0LgorICAgIGlmIChwb2ludGVycChkaXNhYmxlY29tbWFuZHMpCisgICAgICAgICYmIChkaXNhYmxlY29tbWFuZHNbQl9USU1FXSA8IHRpbWUoKQorICAgICAgICAgIHx8ICFvYmplY3RwKGRpc2FibGVjb21tYW5kc1tCX09CSkVDVF0pKSApCisgICAgICAgIHJldHVybihkaXNhYmxlY29tbWFuZHMgPSAwKTsKKworICAgIC8vIHNvbnN0IEtvcGllIHp1cnVlY2sgKGNvcHkoMCkgZ2VodCkKKyAgICByZXR1cm4oY29weShkaXNhYmxlY29tbWFuZHMpKTsKK30KKworc3RhdGljIG1peGVkIF9zZXRfcF9saWJfZGlzYWJsZWNvbW1hbmRzKG1peGVkIGRhdGEpIHsKKworICAvLyBzZXR6ZW5kZXMgT2JqZWt0IGVybWl0dGVsbiwgZGEgZGllc2UgRnVua3Rpb24gbnVyIHBlciBTZXRQcm9wKCkgZ2VydWZlbgorICAvLyB3ZXJkZW4gc29sbHRlICghKSwgaXN0IGRhcyBQTygxKTsKKyAgb2JqZWN0IG9yaWdpbiA9IHByZXZpb3VzX29iamVjdCgxKTsKKyAgLy8gd2VubiBuaWNodCBleGlzdGVudCwgZGlyZWt0IGFiYnJ1Y2gKKyAgaWYgKCFvYmplY3RwKG9yaWdpbikpCisgICAgcmV0dXJuIF9xdWVyeV9wX2xpYl9kaXNhYmxlY29tbWFuZHMoKTsKKworICAvLyBQcm9wIGxvZXNjaGVuPyBFeHBsaXppdCBsb2VzY2hlbiBkYXJmIGplZGVyLCBhbGxlcmRpbmdzIG5pY2h0IGRpcmVrdAorICAvLyB1bmdlcHJ1ZWZ0IHVlYmVyc2NocmVpYmVuLgorICBpZiAoIWRhdGEpIHsKKyAgICAgIHJldHVybiAoZGlzYWJsZWNvbW1hbmRzID0gMCApOworICB9CisgIC8vIG1hbCBkaXJla3QgYnVnZ2VuIGJlaSBmYWxzY2hlbiBEYXRlbnR5cCwgZGFtaXRzIGF1ZmZhZWxsdC4KKyAgaWYgKCFwb2ludGVycChkYXRhKSB8fCBzaXplb2YoZGF0YSkgPCAyIHx8ICFpbnRwKGRhdGFbMF0pCisgICAgICB8fCAoIXN0cmluZ3AoZGF0YVsxXSkgJiYgIWNsb3N1cmVwKGRhdGFbMV0pKQorICAgICAgfHwgKHNpemVvZihkYXRhKSA+PSAzICYmICFwb2ludGVycChkYXRhWzJdKSkgKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICJXcm9uZyBkYXRhIHR5cGUgZm9yIFBfRElTQUJMRV9DT01NQU5EUy4gRXhwZWN0ZWQgQXJyYXkgd2l0aCAiCisgICAgICAgICAgICAiMiBvciAzIGVsZW1lbnRzIChpbnQsIHN0cmluZ3xjbG9zdXJlLCBbc3RyaW5nKl0pLCBnb3QgJS4yNU9cbiIsCisgICAgICAgICAgICBkYXRhKSk7CisKKyAgLy8gV2VubiBhYmdlbGF1ZmVuIG9kZXIgZ2xlaWNoZXMgT2JqZWt0IHdpZSBsZXR6dGVzIE1hbDogZWludHJhZ2VuLgorICBpZiAoIWRpc2FibGVjb21tYW5kcyB8fCAoZGlzYWJsZWNvbW1hbmRzW0JfVElNRV0gPCB0aW1lKCkKKyAgICAgICAgfHwgIW9iamVjdHAoZGlzYWJsZWNvbW1hbmRzW0JfT0JKRUNUXSkgCisgICAgICAgIHx8IGRpc2FibGVjb21tYW5kc1tCX09CSkVDVF0gPT0gb3JpZ2luKSApIHsKKyAgICAgIC8vIExvZ2dlbiBudXIsIHdlbm4gZWluZSBDbG9zdXJlIGVpbmdldHJhZ2VuIHdpcmQuIFJlZHV6aWVydCBkZW4KKyAgICAgIC8vIExvZ3Njcm9sbCB1bmQgU3RyaW5ncyBoYWJlbiBkZXV0bGljaCB3ZW5pZ2VyIE1pc3NicmF1Y2hzcG90ZW50aWFsLgorICAgICAgaWYgKGNsb3N1cmVwKGRhdGFbMV0pKSB7CisgICAgICAgIENCTE9HKHNwcmludGYoIlslc10gQ0IgZ2VzZXR6dCB2b24gJU8sIGd1ZWx0aWcgYmlzICVzLCBEYXRlbjogJU9cbiIsCisgICAgICAgIHN0cmZ0aW1lKCIlWSVtJWQtJUg6JU06JVMiKSxvcmlnaW4sCisgICAgICAgIHN0cmZ0aW1lKCIlWSVtJWQtJUg6JU06JVMiLGRhdGFbMF0pLAorICAgICAgICAoc3RyaW5ncChkYXRhWzFdKSA/IHJlZ3JlcGxhY2UoZGF0YVsxXSwiXG4iLCJcXG4iLDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGF0YVsxXSkpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzaXplb2YoZGF0YSkrMSA8PSBCX0VYQ0VQVElPTlMpCisgICAgICAgIGRpc2FibGVjb21tYW5kcyA9ICh7IG9yaWdpbiwgZGF0YVswXSwgZGF0YVsxXSwgKHt9KSB9KTsKKyAgICAgIGVsc2UKKyAgICAgICAgZGlzYWJsZWNvbW1hbmRzID0gKHsgb3JpZ2luLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdIH0pOworICAgICAgcmV0dXJuKGNvcHkoZGlzYWJsZWNvbW1hbmRzKSk7CisgIH0KKworICByZXR1cm4oX3F1ZXJ5X3BfbGliX2Rpc2FibGVjb21tYW5kcygpKTsKK30KKworc3RhdGljIG1peGVkIF9zZXRfX3N5bnRheGRiKG1peGVkIHYpCit7CisgIFNldCgiX3N5bnRheGRiIiwgdiwgRl9WQUxVRSk7CisgIGlmICh2KQorICAgICAgc3ludGF4ZGIgPSAoe2ZpbmRfb2JqZWN0KCIvc2VjdXJlL3N5bnRheGRiIil9KTsKKyAgZWxzZQorICAgICAgc3ludGF4ZGIgPSAwOworICByZXR1cm4gUXVlcnlQcm9wKCJfc3ludGF4ZGIiKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9kZXNjcmlwdGlvbi5jIGIvc3RkL3BsYXllci9kZXNjcmlwdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMDY2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2Rlc2NyaXB0aW9uLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvZGVzY3JpcHRpb24uYyAtLSBwbGF5ZXIgZGVzY3JpcHRpb24gaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGRlc2NyaXB0aW9uLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvZGVzY3JpcHRpb24iOworCisjaW5jbHVkZSA8dGhpbmcvbGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxsaXZpbmcvY2xvdGhpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci9jb21tYW5kLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldChQX05BTUUsIE5PU0VUTUVUSE9ELCBGX1NFVF9NRVRIT0QpOworICBTZXQoUF9QUkVTQVksIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1RJVExFLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9FWFRSQV9MT09LLCBTQVZFLCBGX01PREVfQVMpOworICBTZXQoUF9HRU5ERVIsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX1NJWkUsIFNBVkUsIEZfTU9ERV9BUyk7CisgIFNldChQX0lORk8sIE5PU0VUTUVUSE9ELCBGX1NFVF9NRVRIT0QpOworICAvLyBBdmF0YXItVVJJcyBzcGVpY2hlcm4uIEF1c3NlcmRlbSBoYXQgYW4gZGVuZW4ga2VpbmVyIHJ1bXp1ZnVtbWVsbi4KKyAgU2V0KFBfQVZBVEFSX1VSSSwgU0FWRXxTRUNVUkVELCBGX01PREVfQVMpOworfQorCitzdHJpbmcgX3F1ZXJ5X2luZm8oKQoreworICBzdHJpbmcgaW5mbzsKKyAgaW5mbyA9IFF1ZXJ5KFBfSU5GTyk7CisgIGlmKCFpbmZvKWluZm89PSIiOworICBpbmZvID0gKHN0cmluZylxdWVyeV93aXpfbGV2ZWwodGhpc19vYmplY3QoKSk7CisgIGlmKElTX0dPRCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtHb3R0XVxuIjsKKyAgaWYoSVNfQVJDSCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtFcnptYWdpZXJdXG4iOworICBpZihJU19FTERFUih0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtXZWlzZXJdXG4iOworICBpZihJU19MT1JEKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW1JlZ2lvbnNjaGVmXVxuIjsKKyAgaWYoSVNfU1BFQ0lBTCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtTcGVjaWFsXVxuIjsKKyAgaWYoSVNfRE9NQUlOTUVNQkVSKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW1JlZ2lvbnNtaXRhcmJlaXRlcl1cbiI7CisgIGlmKElTX1dJWkFSRCh0aGlzX29iamVjdCgpKSkKKyAgICByZXR1cm4gaW5mbysiIFtNYWdpZXJdXG4iOworICBpZihJU19MRUFSTkVSKHRoaXNfb2JqZWN0KCkpKQorICAgIHJldHVybiBpbmZvKyIgW01hZ2llcmFud2FlcnRlcl1cbiI7CisgIGluZm8gPSBRdWVyeVByb3AoUF9MRVZFTCk7CisgIGlmKElTX1NFRVIodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIGluZm8rIiBbU2VoZXJdXG4iOworICByZXR1cm4gaW5mbysiIFtTcGllbGVyXVxuIjsKK30KKworaW50IF9xdWVyeV9zaXplKCkgeworICBpZiAoUXVlcnlQcm9wKFBfRlJPRykpCisgICAgcmV0dXJuIDIwOworICByZXR1cm4gUXVlcnkoUF9TSVpFKTsKK30KKworLy8gc2hvcnQoKSAtLSBnZXQgdGhlIHNob3J0IGRlc2NyaXB0aW9uIG9mIGEgcGxheWVyCitzdHJpbmcgc2hvcnQoKQoreworICBzdHJpbmcgYW5zd2VyOworICBzdHJpbmcgdGl0bGU7CisKKyAgaWYoUXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIGlmKGludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSAmJiBJU19MRUFSTklORyhwcmV2aW91c19vYmplY3QoKSkpCisgICAgICByZXR1cm4gIigiK1F1ZXJ5UHJvcChQX05BTUUpKyIpIFxuIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKworICBpZihRdWVyeVByb3AoUF9HSE9TVCkpCisgIHsKKyAgICBpZiAoUXVlcnlQcm9wKFBfRlJPRykpCisgICAgICByZXR1cm4gIkRlciBHZWlzdCBlaW5lcyBrbGVpbmVuIEZyb3NjaGVzIG5hbWVucyAiK1F1ZXJ5UHJvcChQX05BTUUpKworICAgICAgICIuXG4iOworICAgIGVsc2UKKyAgICAgIHJldHVybiAiRGVyIEdlaXN0IHZvbiAiK1F1ZXJ5UHJvcChQX05BTUUpKyIuXG4iOworICB9CisKKyAgaWYgKFF1ZXJ5UHJvcChQX0ZST0cpKQorICAgIHJldHVybiAiRWluIGtsZWluZXIgRnJvc2NoIG5hbWVucyAiK1F1ZXJ5UHJvcChQX05BTUUpKyIuXG4iOworCisgIGFuc3dlciA9IFF1ZXJ5UHJvcChQX1BSRVNBWSkgKyBRdWVyeVByb3AoUF9OQU1FKTsKKyAgaWYgKFF1ZXJ5UHJvcChQX0FSVElDTEUpKSBhbnN3ZXI9UXVlcnlBcnRpY2xlKDAsMCkrYW5zd2VyOworICBpZigodGl0bGU9UXVlcnlQcm9wKFBfVElUTEUpKSAmJiB0aXRsZSAhPSAiIikgYW5zd2VyICs9ICIgIiArIHRpdGxlOworICBpZighaW50ZXJhY3RpdmUoTUUpKSBhbnN3ZXIgKz0gIiAobmV0enRvdCkiOworICByZXR1cm4gYW5zd2VyKyIuXG4iOworfQorCitwcml2YXRlIHN0cmluZyBhbmRsaXN0KG9iamVjdCAqYXJyKSB7CisgIHN0cmluZyAqdG1wOworICBpZighcG9pbnRlcnAoYXJyKSkgcmV0dXJuICIiOworICBpZihzaXplb2YodG1wID0gbWFwX29iamVjdHMoYXJyLCAibmFtZSIsIFdFTikpKQorICAgIHJldHVybihDb3VudFVwKHRtcCkpOworICByZXR1cm4gIiI7Cit9CisKKy8vIGdpYnQgZnVlciBuaWNodC1JbnZpcy1PYmpla3RlIGRlbiBOYW1lbiB6dXJ1ZWNrCitwcml2YXRlIHN0cmluZyBnZXRfdmlzX25hbWUob2JqZWN0IG9iKSB7CisgIGlmIChvYi0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIHJldHVybiAwOworICByZXR1cm4gKG9iLT5uYW1lKFdFTikpOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKCkKK3sKKyAgc3RyaW5nIGV4bCwgZGVzY3IsIHRtcCwgc2l6ZV9kZXNjcjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCB0cmFucywgdywgYSwgcjsKKyAgaW50IHBlcjsKKyAgc3RyaW5nIGZpbGwsIGZpbGwyOworICAvKiBmdWVyIGdyb2Vzc2VudmVyZ2xlaWNoICovCisgIHN0cmluZyBjb21wYXJlc2l6ZSwgcGVyczEsIHBlcnMyOworICBpbnQgcmVsYXRpb247CisKKyAgcGVyPTEwMDAqUXVlcnlQcm9wKFBfU0laRSkvUXVlcnlQcm9wKFBfQVZFUkFHRV9TSVpFKTsKKyAgc3dpdGNoKHBlcikKKyAgeworICAgIGNhc2UgMC4uODAwOiBzaXplX2Rlc2NyPSJ6aWVtbGljaCB3aW56aWciOyBicmVhazsKKyAgICBjYXNlIDgwMS4uODUwOiBzaXplX2Rlc2NyPSJlaGVyIHdpbnppZyI7IGJyZWFrOworICAgIGNhc2UgODUxLi45MDA6IHNpemVfZGVzY3I9InJlY2h0IGtsZWluIjsgYnJlYWs7CisgICAgY2FzZSA5MDEuLjk1MDogc2l6ZV9kZXNjcj0iZWhlciBrbGVpbiI7IGJyZWFrOworICAgIGNhc2UgOTUxLi4xMDUwOiBzaXplX2Rlc2NyPSJtaXR0ZWxncm9zcyI7IGJyZWFrOworICAgIGNhc2UgMTA1MS4uMTEwMDogc2l6ZV9kZXNjcj0icmVsYXRpdiBncm9zcyI7IGJyZWFrOworICAgIGNhc2UgMTEwMS4uMTE1MDogc2l6ZV9kZXNjcj0iemllbWxpY2ggZ3Jvc3MiOyBicmVhazsKKyAgICBjYXNlIDExNTEuLjEyMDA6IHNpemVfZGVzY3I9InNlaHIgZ3Jvc3MiOyBicmVhazsKKyAgICBkZWZhdWx0OiBzaXplX2Rlc2NyPSJyaWVzaWciOyBicmVhazsKKyAgfQorI2RlZmluZSBSYXNzZW5TdHJpbmcoKSAoKFF1ZXJ5UHJvcChQX0ZST0cpID8gImVuIEZyb3NjaCIgOlwKKyAgICAgICAoIVF1ZXJ5UHJvcChQX0dFTkRFUik/IiAiOlF1ZXJ5UHJvcChQX0dFTkRFUik9PTI/ImUgIjoiZW4gIikrXAorICAgICAgIChwb2ludGVycChRdWVyeVByb3AoUF9SQUNFU1RSSU5HKSk/XAorICAgICAgICBRdWVyeVByb3AoUF9SQUNFU1RSSU5HKVtXRU5dOlF1ZXJ5UHJvcChQX1JBQ0UpKSkpCisgIGZpbGwyPWZpbGw9MDsKKyAgaWYgKFF1ZXJ5UHJvcChQX0FWRVJBR0VfU0laRSk8MTcwKQorICB7CisgICAgaWYgKHBlcjw5NTApCisgICAgICBmaWxsPSJzZWxic3QgZnVlciBlaW4iK1Jhc3NlblN0cmluZygpKyIgIjsKKyAgICBlbHNlCisgICAgICBpZiAocGVyPjEwNTApCisgIGZpbGwyPSIsIHdlbm4gYXVjaCBudXIgZnVlciBlaW4iK1Jhc3NlblN0cmluZygpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmIChRdWVyeVByb3AoUF9BVkVSQUdFX1NJWkUpPjE3MCkKKyAgICAgIGlmIChwZXI+MTA1MCkKKyAgZmlsbD0ic29nYXIgZnVlciBlaW4iK1Jhc3NlblN0cmluZygpKyIgIjsKKyAgICAgIGVsc2UKKyAgaWYgKHBlcjw5NTApCisgICAgZmlsbDI9Iiwgd2VubiBhdWNoIG51ciBmdWVyIGVpbiIrUmFzc2VuU3RyaW5nKCk7CisgIH0KKyAgaWYgKCFmaWxsJiYhZmlsbDIpIGZpbGw9ImZ1ZXIgZWluIitSYXNzZW5TdHJpbmcoKSsiICI7CisgIGRlc2NyID0gIkRhcyBpc3QgIituYW1lKFdFUiwxKSsiLiAiK2NhcGl0YWxpemUoUXVlcnlQcm9ub3VuKCkpKyIgaXN0ICIrCisgICAgKGZpbGx8fCIiKStzaXplX2Rlc2NyKyhmaWxsMnx8IiIpKyIuXG4iOworCisgIGlmKHRoaXNfcGxheWVyKCkpIHsKKyAgICAvKiBncm9lc3NlbnZlcmdsZWljaF9hbmZhbmcgKE5FVSkgKi8KKyAgICBwZXJzMSA9IFF1ZXJ5UHJvbm91bihXRVIpOworICAgIHBlcnMyID0gUXVlcnlQcm9ub3VuKFdFTSk7CisgCisgICAgLy8gfHwgZmFsbHMgVFAga2VpbmUgR3JvZXNzZSBnZXNldHp0IGhhdC4uLiBXYXJ1bSBhdWNoIGltbWVyLi4uCisgICAgcmVsYXRpb24gPSAoUXVlcnlQcm9wKFBfU0laRSkqMTAwKSAvIAorICAgICAgICAgICAgICAgICAgKHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX1NJWkUpIHx8IDEpOworICAgIHN3aXRjaCAocmVsYXRpb24pIAorICAgICB7CisgICAgIGNhc2UgICAwIC4uICAyNSA6IGNvbXBhcmVzaXplID0gIkRhbWl0IGdpYnQgIitwZXJzMSsiIGVpbmVuIGd1dGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgRnVzc2NoZW1lbCBmdWVyIERpY2ggYWIiOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAgMjYgLi4gIDUwIDogY29tcGFyZXNpemUgPSAiRGFtaXQgcmVpY2h0ICIrcGVyczErIiBEaXIgbmljaHQgbWFsIGJpcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHp1ciBIdWVmdGUiOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAgNTEgLi4gIDc1IDogY29tcGFyZXNpemUgPSAiRGFtaXQga2FubnN0IER1ICIrcGVyczIrIiBsb2NrZXIgYXVmIGRlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEtvcGYgc3B1Y2tlbiI7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlICA3NiAuLiAgOTAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCBpc3QgIitwZXJzMSsiIGVpbmVuIEtvcGYga2xlaW5lciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFscyBEdSI7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBjYXNlICA5MSAuLiAxMTAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCBoYXQgIitwZXJzMSsiIGV0d2EgRGVpbmUgR3JvZXNzZSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAKKyAgICAgY2FzZSAxMTEgLi4gMTIwIDogY29tcGFyZXNpemUgPSAiRGFtaXQgaXN0ICIrcGVyczErIiBlaW5lbiBLb3BmIGdyb2Vzc2VyIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFscyBEdSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMTIxIC4uIDE1MCA6IGNvbXBhcmVzaXplID0gIkRhbWl0IGhvbHN0IER1IERpciBlaW5lbiBzdGVpZmVuIE5hY2tlbiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3ZW5uIER1ICIrcGVyczIrIiBpbiBkaWUgQXVnZW4gc2llaHN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAxNTEgLi4gMjAwIDogY29tcGFyZXNpemUgPSAiRGFtaXQgdmVyc3BlcnJ0ICIrcGVyczErIiBEaXIgYWJzb2x1dCIKKwkJICAgICAgICAgICAgICAgICAgICAgIiBkaWUgU2ljaHQiOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAyMDEgLi4gMzAwIDogY29tcGFyZXNpemUgPSAiRGFtaXQgd2FlcmUgamVkZXIgU2NobGFnIHZvbiBEaXIgZWluIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRpZWZzY2hsYWciOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICBkZWZhdWx0ICAgICAgICAgOiBjb21wYXJlc2l6ZSA9ICJEYW1pdCBrYW5uc3QgRHUgIitwZXJzMisiIGJlcXVlbSB6d2lzY2hlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbiBCZWluZW4gZHVyY2hsYXVmZW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICB9CisgIAorICAgICBkZXNjcis9Y29tcGFyZXNpemUrIi5cbiI7CisgICAgIC8qIGdyb2Vzc2VudmVyZ2xlaWNoX2VuZGUgKE5FVSkgKi8KKyAgIH0KKworICBpZihRdWVyeVByb3AoUF9HSE9TVCkpIHJldHVybiBkZXNjcjsKKworICB0cmFucyA9IFF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKTsgU2V0UHJvcChQX1RSQU5TUEFSRU5ULCAwKTsKKyAgZGVzY3IgKz0gOjpsb25nKCk7IFNldFByb3AoUF9UUkFOU1BBUkVOVCwgdHJhbnMpOworCisgIC8vIFdhZmZlbiwgUnVlc3R1bmdlbi9LbGVpZHVuZyB1bmQgU29uc3RpZ2VzIGVybWl0dGVsbgorICB3ID0gKHtRdWVyeVByb3AoUF9XRUFQT04pLCBRdWVyeVByb3AoUF9QQVJSWV9XRUFQT04pfSkgLSAoezB9KTsKKyAgYSA9IFF1ZXJ5UHJvcChQX0FSTU9VUlMpICsgUXVlcnlQcm9wKFBfQ0xPVEhJTkcpIC0gKHswfSk7CisgIHIgPSBhbGxfaW52ZW50b3J5KE1FKSAtIHcgLSBhOyAvL1Jlc3QgbG9naXNjaGVyd2Vpc2UKKworICAvLyByZXN0IG5vY2ggbmFjaCBzaWNoYmFya2VpdCB2b24gYXVzc2VyaGFsYiBkZXMgU1BpZWxlcnMgZmlsdGVybi4KKyAgcj1tYXAocixmdW5jdGlvbiBzdHJpbmcgKG9iamVjdCBvYikgeworCSAgaWYoc2l6ZW9mKGFsbF9pbnZlbnRvcnkob2IpKSB8fCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpIHx8IAorCSAgICAgb2ItPlF1ZXJ5UHJvcChQX0xJR0hURUQpIHx8IG9iLT5RdWVyeVByb3AoUF9TSE9XX0lOVikpCisJICAgIHJldHVybihnZXRfdmlzX25hbWUob2IpKTsKKyAgICAgICAgICByZXR1cm4oMCk7IH0gKSAtICh7MH0pOworCisgIC8vIEludmlzLU9iamVrdGUgYXVzZmlsdGVybiB1bmQgTmFtZW4gZXJtaXR0ZWxuLCBhbnNjaGxpZXNzZW5kIHNpbmQgaW4gdywgYQorICAvLyB1bmQgciBqZSBlaW4gQXJyYXkgdm9uIFN0cmluZ3MKKyAgdyA9IG1hcCh3LCAjJ2dldF92aXNfbmFtZSkgLSAoezB9KTsKKyAgYSA9IG1hcChhLCAjJ2dldF92aXNfbmFtZSkgLSAoezB9KTsKKworICByZXR1cm4gZGVzY3IgKworICAgICAgICAgKFF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKSA/CisgICAgICAgICAgYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUobmFtZShXRVIsIDEpKSsiIGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgKyhzaXplb2YoYSk/Q291bnRVcChhKToia2VpbmUgUnVlc3R1bmciKSsiIGFuIgorICAgICAgICAgICAgICAgICAgICAgICsoc2l6ZW9mKHIpPyIsICI6IiB1bmQgIikKKyAgICAgICAgICAgICAgICAgICAgICArKHNpemVvZih3KT9Db3VudFVwKHcpOiJrZWluZSBXYWZmZSIpKyIgZ2V6dWVja3QiCisgICAgICAgICAgKyhzaXplb2Yocik/IiB1bmQgdHJhZWd0ICIrQ291bnRVcChyKToiIikrIi4iLCA3OCk6ICIiKTsKK30KKworCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBtaXhlZCBfcXVlcnlfcHJlc2F5KCkKK3sKKyAgc3RyaW5nIHByZXNheTsKKyAgaWYoKHByZXNheSA9IFF1ZXJ5KFBfUFJFU0FZKSkgJiYgKHByZXNheSAhPSAiIikpIHJldHVybiBwcmVzYXkgKyAiICI7CisgIHJldHVybiAiIjsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbmFtZSgpCit7CisgIHJldHVybiBjYXBpdGFsaXplKFF1ZXJ5KFBfTkFNRSkgfHwgIk5vTmFtZSIpOworfQorLy8gKioqKgorCisvLyBMb2NhbCBjb21tYW5kcworc3RhdGljIG1peGVkIF9xdWVyeV9sb2NhbGNtZHMoKSB7CisgIHJldHVybgorICAgICh7CisgICAgICAoeyJhdmF0YXIiLCJzZXRfYXZhdGFydXJpIiwwLDB9KSwKKyAgICB9KTsKK30KKworaW50IHNldF9hdmF0YXJ1cmkoc3RyaW5nIGFyZykgeworICBhcmcgPSBfdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFhcmcgfHwgIXNpemVvZihhcmcpKSB7CisgICAgc3RyaW5nIHVyaSA9IFF1ZXJ5UHJvcChQX0FWQVRBUl9VUkkpOworICAgIGlmIChzdHJpbmdwKHVyaSkpCisgICAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgICAiQWt0dWVsbGUgQXZhdGFyLVVSSTogIiArIHVyaSArICJcbiIpOworICAgIGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRHUgaGFzdCBrZWluZSBBdmF0YXItVVJJIGVpbmdlc3RlbGx0LlxuIik7CisgIH0KKyAgZWxzZSBpZiAoYXJnID09ICJrZWluZSIpIHsKKyAgICAgIFNldFByb3AoUF9BVkFUQVJfVVJJLCAwKTsKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVpbmUgQXZhdGFyLVVSSSB3dXJkZSBnZWxvZXNjaHQuXG4iKTsKKyAgfQorICBlbHNlIGlmIChzaXplb2YoYXJnKSA+IDUxMikKKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRGVpbmUgbmV1ZSBBdmF0YXItVVJJIGlzdCB6dSBsYW5nIVxuIik7CisgIGVsc2UgeworICAgICAgU2V0UHJvcChQX0FWQVRBUl9VUkksIGFyZyk7CisgICAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICAgICAiQWt0dWVsbGUgQXZhdGFyLVVSSTogIiArIGFyZyArICJcbiIpOworICB9CisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2V4cGxvcmF0aW9uLmMgYi9zdGQvcGxheWVyL2V4cGxvcmF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExOTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvZXhwbG9yYXRpb24uYwpAQCAtMCwwICsxLDEyNSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9leHBsb3JhdGlvbi5jIC0tIGV4cGxvcmF0aW9uIHBvaW50IG1hbmFnZW1lbnQKKy8vCisvLyAkSWQ6IGV4cGxvcmF0aW9uLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvbGlmZS5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8ZXhwbG9yYXRpb24uaD4KKyNpbmNsdWRlIDxzY29yZW1hc3Rlci5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKK3ByaXZhdGUgc3RyaW5nIGdpdmVuX3Njb3JlczsKKworcHJpdmF0ZSBub3NhdmUgbWl4ZWQgZXBudW07CisKK3ZvaWQgY3JlYXRlKCkgeworICBTZXQoUF9MRVAsIFNFQ1VSRUR8U0FWRSwgRl9NT0RFX0FTKTsKKworICBnaXZlbl9zY29yZXMgPSAiIjsKK30KKworc3RyaW5nIEZvcnNjaHVuZygpCit7CisgIHJldHVybiBFUE1BU1RFUi0+UXVlcnlGb3JzY2h1bmcoKTsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfZ2l2ZW5fc2NvcmVzKCkKK3sKKyAgcmV0dXJuIGdpdmVuX3Njb3JlczsKK30KKworLy8gSGllciBrb21tZW4gRnVua3Rpb25lbiBmdWVyIGRpZSBMZXZlbHB1bmt0ZQorCisjZGVmaW5lIFhQX0ZBQyAoWzE6MTAsMjo0MCwzOjE1MCw0OjYwMCw1OjIyNTAsNjo5MDAwLDc6MzUwMDAsODoxNDAwMDAsOTo1MDAwMDBdKQorCisvLyNkZWZpbmUgREVCVUcoeCx5KSBwcmludGYoeCx5KQorI2RlZmluZSBERUJVRyh4LHkpCisKK2ludCBBZGRTY29yZShpbnQgY29udHJpYnV0b3IpCit7CisgIG1peGVkIGluZm87CisgIG9iamVjdCBwbzsKKyAgaW50IGRyaW47CisgIAorICBpZiAoIXBvaW50ZXJwKGluZm8gPSBTQ09SRU1BU1RFUi0+UXVlcnlOUENieU51bWJlcihjb250cmlidXRvcikpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoKHBvID0gcHJldmlvdXNfb2JqZWN0KCkpICYmIChvYmplY3RfbmFtZShwbykgPT0gU0NPUkVNQVNURVIpKQorICAgIHBvID0gcHJldmlvdXNfb2JqZWN0KDEpOworCisgIGlmICghcG8gfHwgb2xkX2V4cGxvZGUob2JqZWN0X25hbWUocG8pLCIjIilbMF0gIT0gaW5mb1tTQ09SRV9LRVldKQorICAgIHJldHVybiAtMjsKKworICBpZiAoIXN0cmluZ3AoZ2l2ZW5fc2NvcmVzKSkKKyAgICBnaXZlbl9zY29yZXMgPSAiICI7CisKKyAgaWYgKGNhdGNoKGRyaW4gPSB0ZXN0X2JpdChnaXZlbl9zY29yZXMsIGNvbnRyaWJ1dG9yKTtwdWJsaXNoKSkKKyAgICByZXR1cm4gLTM7CisKKyAgaWYgKCFkcmluKSB7CisgICAgZ2l2ZW5fc2NvcmVzID0gc2V0X2JpdChnaXZlbl9zY29yZXMsIGNvbnRyaWJ1dG9yKTsKKyAgICBTZXQoUF9MRVAsIFF1ZXJ5KFBfTEVQKSArIGluZm9bU0NPUkVfU0NPUkVdKTsKKyAgICBmb3JjZV9zYXZlKCk7CisgICAgcmV0dXJuIGluZm9bU0NPUkVfU0NPUkVdOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgVGVzdFNjb3JlKGludCBjb250cmlidXRvcikKK3sKKyAgaW50IHJldDsKKyAgCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwgKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBTQ09SRU1BU1RFUikpCisgICAgcmV0dXJuIDA7CisKKyAgY2F0Y2gocmV0ID0gdGVzdF9iaXQoZ2l2ZW5fc2NvcmVzLCBjb250cmlidXRvcik7cHVibGlzaCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50IFNldFNjb3JlQml0KGludCBjb250cmlidXRvcikKK3sKKyAgaW50IGRyaW47CisgIAorICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8IChvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gU0NPUkVNQVNURVIpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoY2F0Y2goZHJpbiA9IHRlc3RfYml0KGdpdmVuX3Njb3JlcywgY29udHJpYnV0b3IpO3B1Ymxpc2gpKQorICAgIHJldHVybiAtMjsKKworICBpZiAoZHJpbikgcmV0dXJuIC0zOworCisgIGdpdmVuX3Njb3JlcyA9IHNldF9iaXQoZ2l2ZW5fc2NvcmVzLCBjb250cmlidXRvcik7CisgIGZvcmNlX3NhdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDbGVhclNjb3JlQml0KGludCBjb250cmlidXRvcikKK3sKKyAgaW50IGRyaW47CisgIAorICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8IChvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gU0NPUkVNQVNURVIpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoY2F0Y2goZHJpbiA9IHRlc3RfYml0KGdpdmVuX3Njb3JlcywgY29udHJpYnV0b3IpO3B1Ymxpc2gpKQorICAgIHJldHVybiAtMjsKKworICBpZiAoIWRyaW4pIHJldHVybiAtMzsKKworICBnaXZlbl9zY29yZXMgPSBjbGVhcl9iaXQoZ2l2ZW5fc2NvcmVzLCBjb250cmlidXRvcik7CisgIGZvcmNlX3NhdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvZ3VpZGUuYyBiL3N0ZC9wbGF5ZXIvZ3VpZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjA4YjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9ndWlkZS5jCkBAIC0wLDAgKzEsMTgyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLyAKKy8vIHBsYXllci9ndWlkZS5jIC0tIG5ld2JpZSBndWlkZSBoYW5kbGluZyAKKy8vCisvLyAkSWQ6IGd1aWRlLmMgNzM5MSAyMDEwLTAxLTI1IDIyOjUyOjUxWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPHBsYXllci91c2VyX2ZpbHRlci5oPiAvLyBmdWVyIGlzX2FjdGl2ZV9ndWlkZSgpCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisKKy8qIEZ1bmt0aW9uLCBkaWUgZGllIEd1aWRlLUtvbW1hbmRvcyBha3RpdmllcnQgKi8KK3ZvaWQgYWRkX2d1aWRlX2NvbW1hbmRzKCkKK3sKKwlhZGRfYWN0aW9uKCJDaWNlcm9uZUNtZCIsImNpY2Vyb25lIik7CisJLy8gU29sbHRlIGVpZ2VudGxpY2ggYW4gZGVyc2VsYmVuIFN0ZWxsZSBtb2VnbGljaCBzZWluLgorfQorCisvKiBHaWJ0IGRpZSBNZWxkdW5nIGJlaW0gQWVuZGVybiBhdXMqLworcHJvdGVjdGVkIGludCBOZXdiaWVDaGFuZ2VNc2coKSB7CisgICAgaW50IGNpYz1RdWVyeVByb3AoUF9ORVdCSUVfR1VJREUpOworICAgIC8vIGJlZ3JlbnplbiBhdWYgMSBUYWcsIGZhbGxzIGplbWFuZCBkYSBTY2hyb3R0IHJlaW5nc2NocmllYmVuIGhhdC4KKyAgICBpZiAoY2ljID4gODY0MDApIHsKKwljaWM9ODY0MDA7CisJU2V0UHJvcChQX05FV0JJRV9HVUlERSxjaWMpOworICAgIH0KKyAgICBpZiAoY2ljPD0wKSB7CisJd3JpdGUoIkR1IGJpc3QgamV0enQga2VpbiBDaWNlcm9uZSBtZWhyLlxuIik7CisgICAgfQorICAgIGVsc2UgaWYgKGNpYyA8IDYwKSB7CisJd3JpdGUoIkR1IGJpc3QgamV0enQgZWluIENpY2Vyb25lLlxuIik7CisgICAgfQorICAgIGVsc2UgeworCXdyaXRlKGJyZWFrX3N0cmluZygKKwkgICAgIkR1IGJpc3QgamV0enQgZWluIENpY2Vyb25lLCBhbGxlcmRpbmdzIG51ciBpbiBkZW4gWmVpdGVuLCAiCisJICAgICJpbiBkZW5lbiBEdSB3ZW5pZ2VyIGFscyAiICsgY2ljLzYwCisJICAgICsgKChjaWMvNjApPDIgPyAiIE1pbnV0ZSAiOiIgTWludXRlbiAiKQorCSAgICArICJpZGxlIGJpc3QuXG4iLDc4KSk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKiBHaWJ0IGRpZSBTdGF0dXNtZWxkdW5nIGF1cyAqLworcHJvdGVjdGVkIGludCBOZXdiaWVTdGF0dXNNc2coKSB7CisgIGludCBjaWM9UXVlcnlQcm9wKFBfTkVXQklFX0dVSURFKTsKKyAgLy8gYmVncmVuemVuIGF1ZiAxIFRhZywgZmFsbHMgamVtYW5kIGRhIFNjaHJvdHQgcmVpbmdzY2hyaWViZW4gaGF0LgorICBpZiAoY2ljID4gODY0MDApIHsKKyAgICAgIGNpYz04NjQwMDsKKyAgICAgIFNldFByb3AoUF9ORVdCSUVfR1VJREUsY2ljKTsKKyAgfQorCisgIGlmIChjaWMgPD0gMCkKKyAgICB3cml0ZSAoIkR1IGJpc3Qga2VpbiBDaWNlcm9uZS5cbiIpOworICBlbHNlIGlmIChjaWMgPCA2MCkKKyAgICB3cml0ZSAoIkR1IHN0ZWhzdCBOZXVzcGllbGVybiBhbHMgQ2ljZXJvbmUgenVyIFZlcmZ1ZWd1bmcuXG4iKTsKKyAgZWxzZSB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorCSAgICAiRHUgc3RlaHN0IE5ldXNwaWVsZXJuIGFscyBDaWNlcm9uZSB6dXIgVmVyZnVlZ3VuZywgYWxsZXJkaW5ncyAiCisJICAgICJudXIgaW4gZGVuIFplaXRlbiwgaW4gZGVuZW4gRHUgd2VuaWdlciBhbHMgIiArIGNpYy82MAorCSAgICArICgoY2ljLzYwKTwyID8gIiBNaW51dGUgIjoiIE1pbnV0ZW4gIikKKwkgICAgKyAiaWRsZSBiaXN0LlxuIiw3OCkpOworICB9CisgIHJldHVybiAxOworfQorCisvKiBGdWVocnQgZGFzIGVpZ2VudGxpY2hlIEtvbW1hbmRvIGF1cyovCisKK2ludCBDaWNlcm9uZUNtZChzdHJpbmcgc3RyKQoreworCWlmIChRdWVyeVByb3AoUF9MRVZFTCk8MjApCisJeworCQl3cml0ZShicmVha19zdHJpbmcoIkR1IHNvbGx0ZXN0IGVyc3Qgbm9jaCBlaW4gd2VuaWcgIgorCQkJCQkiRXJmYWhydW5nIHNhbW1lbG4sIGJldm9yIER1IERpY2ggIgorCQkJCSAgICAgICAiYWxzIENpY2Vyb25lIHp1ciBWZXJmdWVndW5nIHN0ZWxsc3QuIiw3OCkpOworCQlyZXR1cm4gMTsKKwl9CisJLy8gSWRsZXplaXQgdWViZXJnZWJlbj8KKwlpbnQgaWRsZT10b19pbnQoc3RyKTsKKwkvLyBtYXguIGVpbmVuIFRhZyAoMTQ0MCBtaW4pIHp1bGFzc2VuLgorCWlmIChpZGxlIDwgMCkgaWRsZT0wOworCWVsc2UgaWYgKGlkbGUgPiAxNDQwKSBpZGxlPTE0NDA7CisKKwlpZiAoIXN0cikgeworCSAgICByZXR1cm4gTmV3YmllU3RhdHVzTXNnKCk7CisJfQorCWVsc2UgaWYgKHN0cj09InN0YXR1cyIpIHsKKwkgICAgcmV0dXJuIE5ld2JpZVN0YXR1c01zZygpOworCX0KKwkvLyAiZWluIiBzY2hhbHRldCBlaW5mYWNoIGdlbmVyZWxsIGVpbiwgaGllcmJlaSBzdGVodCAxIGluIGRlciBQcm9wCisJLy8gZnVlciAicGVybWFuZW50IGVpbiIuCisJZWxzZSBpZiAoc3RyPT0iZWluIikgeworCSAgICBTZXRQcm9wKFBfTkVXQklFX0dVSURFLDEpOworCSAgICByZXR1cm4gTmV3YmllQ2hhbmdlTXNnKCk7CisJfQorCS8vICJhdXMiIG9kZXIgIjAiIGRlYWt0aXZpZXJ0LgorCWVsc2UgaWYgKHN0cj09ImF1cyIpIHsKKwkgICAgU2V0UHJvcChQX05FV0JJRV9HVUlERSwwKTsKKwkgICAgcmV0dXJuIE5ld2JpZUNoYW5nZU1zZygpOworCX0KKwkvLyB3ZW5uIFphaGwgdWViZXJnZWJlbiBpc3QsIGRpZSBncm9lc3NlciAwIHVuZCBrbGVpbmVyIDE0NDAgaXN0CisJLy8gKHMuby4pLCB3aXJkIGVzIGFscyBBbnphaGwgYW4gSWRsZS1NaW51dGVuIGF1ZmdlZmFzc3QsIGFiIGRlciBtYW4KKwkvLyBhdXNnZWJsZW5kZXQgd2VyZGVuIHdpbGwuCisJZWxzZSBpZiAoaWRsZSkgeworCSAgICBTZXRQcm9wKFBfTkVXQklFX0dVSURFLCBpZGxlKjYwKTsgLy8gYWxzIFNla3VuZGVuIHNwZWljaGVybi4KKwkgICAgcmV0dXJuIE5ld2JpZUNoYW5nZU1zZygpOworCX0KKwl3cml0ZShicmVha19zdHJpbmcoCisJICAgICAgImNpY2Vyb25lIGVpbiAgLSBEdSBiaXN0IENpY2Vyb25lXG4iCisJICAgICAgImNpY2Vyb25lIGF1cyAgLSBEdSBiaXN0IGtlaW4gQ2ljZXJvbmVcbiIKKwkgICAgICAiY2ljZXJvbmUgICAgICAtIFN0YXR1cyBhbnplaWdlblxuIgorCSAgICAgICticmVha19zdHJpbmcoCisJCSJEdSBiaXN0IENpY2Vyb25lLCBhYmVyIHdlbm4gRHUgbGFlbmdlciBhbHMgPHphaGw+IE1pbnV0ZW4gIgorCQkiaWRsZSBiaXN0LCB3aXJzdCBEdSBhdXRvbWF0aXNjaCBhdXNnZWJsZW5kZXQsIGJpcyBEdSB3aWVkZXIgIgorCQkiZW5kaWRlbHQgYmlzdC4iLAorCQk3NiwiY2ljZXJvbmUgemFobCAtICIsQlNfSU5ERU5UX09OQ0UpLAorCSAgICAgIDc4LCJTeW50YXhoaWxmZToiLEJTX1BSRVBFTkRfSU5ERU5UfEJTX0xFQVZFX01ZX0xGUykpOworCisJcmV0dXJuIDE7Cit9CisKK3Byb3RlY3RlZCBzdHJpbmcgSXN0U2luZE1zZyhzdHJpbmcqIG5hbWVuKQoreworCWlmIChzaXplb2YobmFtZW4pPT0xKQorCQlyZXR1cm4gImlzdCBkYXZvbiAiK25hbWVuWzBdOworCWVsc2UKKwkJcmV0dXJuICJzaW5kIGRhdm9uICIrQ291bnRVcChuYW1lbik7Cit9CisKK3ZvaWQgTmV3YmllSW50cm9Nc2coKQoreworCW9iamVjdCogY2ljZXJvbmVzOworCXN0cmluZyogbmFtZW47CisJc3RyaW5nIHJlc3RleHQ7CisKKwkvLyBOdXIgYmlzIExldmVsIDUgd2lyZCBldHdhcyBhdXNnZWdlYmVuLgorCWlmIChRdWVyeVByb3AoUF9MRVZFTCk+NSkgcmV0dXJuOworCQorCS8vIGlzX2FjdGl2ZV9ndWlkZSgpIGlzdCBpbiAvc3RkL3VzZXJfZmlsdGVyLmMsIHdlbGNoZXMgdm9tCisJLy8gU3BpZWxlcm9iamVrdCBnZWVyYnQgd2lyZCB1bmQgZGFtaXQgenVyIFZlcmZ1ZWd1bmcgc3RlaHQuCisJY2ljZXJvbmVzPWZpbHRlcih1c2VycygpLCMnaXNfYWN0aXZlX2d1aWRlKTsKKwkvLyB1aWQgdmVyd2VuZGVuLCBkYSBzb25zdCBrbGVpbmUgU3BpZWxlciBlaW5lbiBnZXRhcm50ZW4gCisJLy8gIlJpZXNlbiIgb2RlciBhZWhubGljaGVzIGFuc3RwcmVjaGVuLgorCW5hbWVuPW1hcChjaWNlcm9uZXMsZnVuY3Rpb24gc3RyaW5nIChvYmplY3QgbykgCisJICAgIHsgcmV0dXJuKGNhcGl0YWxpemUoZ2V0ZXVpZChvKSkpOyB9ICk7CisKKwlpZiAobmFtZW4gJiYgc2l6ZW9mKG5hbWVuKT4wKQorCXsKKwkJcmVzdGV4dD0iXG5FcyBnaWJ0IGVpbmlnZSBuZXR0ZSBTcGllbGVyLCBkaWUgYmVyZWl0IHNpbmQsIERpY2ggIgorCQkJCSJhdWYgRGVpbmVuIGVyc3RlbiBTY2hyaXR0ZW4gaW0gIk1VRE5BTUUKKwkJCQkiIHp1IGJlZ2xlaXRlbi4gXG5cbkRlcnplaXQgIgorCQkJCStJc3RTaW5kTXNnKG5hbWVuKSsiIGVpbmdlbG9nZ3QuIER1IGthbm5zdCAiCisJCQkJImVpbmVuIG9kZXIgZWluZSB2b24gSWhuZW4gYW5zcHJlY2hlbiwgIgorCQkJCSJpbmRlbSBEdSB6LkIuIGVpbmZhY2ggXG4iCisJCQkJIiAgJ3RlaWxlICIrCisJCQkJbG93ZXJfY2FzZShuYW1lbltyYW5kb20oc2l6ZW9mKG5hbWVuKSldKSsKKwkJCQkiIG1pdCBIYWxsbyBpY2ggYmluIG5ldSBoaWVyLCBrYW5uc3QgRHUgIgorCQkJCSJtaXIgYml0dGUgaGVsZmVuPydcbiIKKwkJCQkiZWludGlwcHN0LiBOdXIga2VpbmUgU2NoZXUsIGRpZXNlIFNwaWVsZXIgIgorCQkJCSJoYWJlbiBzaWNoIGZyZWl3aWxsaWcgZGF6dSBiZXJlaXRlcmtsYWVydCFcbiIKKwkJCQkiXG5EdSBrYW5uc3QgRGlyIGRpZXNlIFNwaWVsZXIgamVkZXJ6ZWl0ICIKKwkJCQkibWl0ICdrd2VyIGNpY2Vyb25lcycgYW56ZWlnZW4gbGFzc2VuLlxuXG4iOworCQl3cml0ZShicmVha19zdHJpbmcocmVzdGV4dCw3OCwiKiAgIixCU19MRUFWRV9NWV9MRlMpKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gV2VpYSwga2VpbiBOZXdiaWUtR3VpZGUgZGEuIExpZWJlciBlcnN0bWFsIG5peCB0dW4sCisJCS8vIGJpcyB1bnMgd2FzIGJlc3NlcmVzIGVpbmZhZWxsdC4KKwl9CisJcmV0dXJuOworfQorCisKKworCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQW11bGV0dF9mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQW11bGV0dF9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4NTAyNgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9BbXVsZXR0X2ZlbWFsZQpAQCAtMCwwICsxLDUgQEAKKzYKKzM1Cis1CitcXy8KKz8mCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQW11bGV0dF9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0FtdWxldHRfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRlMDljCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0FtdWxldHRfbWFsZQpAQCAtMCwwICsxLDUgQEAKKzYKKzM2Cis1CitcXy8KKz8mCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvQmVzY2hyaWZ0dW5nIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0Jlc2NocmlmdHVuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmRkYzVlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0Jlc2NocmlmdHVuZwpAQCAtMCwwICsxLDI0IEBACis3CiswCiswCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fXzxIZWxtPgorPzxXYWZmZT5fX19fX19fX19fX19fXworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1w/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fPEtvZWNoZXI+CisKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fPEFtdWxldHQ+Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fXworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9cCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz88UGFuemVyPgorCis/PFJpbmc+X19fX19fX19fX19fXy8KKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fPFNjaGlsZD4KKz88SGFuZHNjaHVoZT5fX19fX19fLz8/Pz8/Pz8/Pz8vCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8vCis/PEd1ZXJ0ZWw+X19fX19fX19fX19fX19fX19fXy8KKworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XF9fX19fX19fX19fXzxVbWhhbmc+CisKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX188SG9zZT4KKworCis/Pz8/Pz8/Pz88U2NodWhlPl9fX19fX19fX19fX18KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9HdWVydGVsX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9HdWVydGVsX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VkODg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0d1ZXJ0ZWxfZmVtYWxlCkBAIC0wLDAgKzEsNCBAQAorNQorMzMKKzEwCitgPT1PPT0nCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvR3VlcnRlbF9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0d1ZXJ0ZWxfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMxNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0d1ZXJ0ZWxfbWFsZQpAQCAtMCwwICsxLDQgQEAKKzUKKzMzCisxMAorYD09PU89PT0nCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGFuZHNjaHVoX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlM2YxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGFuZHNjaHVoX2ZlbWFsZQpAQCAtMCwwICsxLDEwIEBACis0CisyMQorNworP18sLV8KKyhfXyxJCisKKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz98NworPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Py98Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9gKS8KKz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8nCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGFuZHNjaHVoX21hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGFuZHNjaHVoX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MWRkMQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IYW5kc2NodWhfbWFsZQpAQCAtMCwwICsxLDEwIEBACis0CisyMgorNworLC0tX18KKyhfXyxJCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P18/Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/fCB8Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/LyB8Cis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/YCkpCis/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/ICcgCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGVsbV9mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSGVsbV9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiYTY0NwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IZWxtX2ZlbWFsZQpAQCAtMCwwICsxLDYgQEAKKzEKKzM0CiswCissLW8tLgorPT09PUkKKz8/P1xfXApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0hlbG1fbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IZWxtX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxODhhMwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9IZWxtX21hbGUKQEAgLTAsMCArMSw2IEBACisxCiszNQorMAorLC1vLS4KKz09PT1JCis/Pz9cX1wKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSG9zZW5fZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Y2ZkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSG9zZW5fZmVtYWxlCkBAIC0wLDAgKzEsMTMgQEAKKzYKKzMyCisxMAorL2AtLS0tLSdcCit8LyAgICAgXHwKK3wgICBZICAgfAorfCAgIHwgICB8Cis/fCAgfCAgfAorPyggIHwgICkKKz98ICB8ICB8Cis/fCAgfCAgfAorP3wgIHwgIHwKKz9MXy8gXF9KCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSG9zZW5fbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Ib3Nlbl9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvSG9zZW5fbWFsZQpAQCAtMCwwICsxLDEzIEBACis2CiszMworMTAKKy9gLS0tLS0nXAorfC8gICAgIFx8Cit8ICAgWSAgIHwKK3wgICB8ICAgfAorfCAgIHwgICB8Cis8LiAgfCAgLj4KK3wgICB8ICAgfAorfCAgIHwgICB8Cit8ICAgfCAgIHwKKz9MXy8gXF9KCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvS29lY2hlcl9mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvS29lY2hlcl9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwYjFjZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9Lb2VjaGVyX2ZlbWFsZQpAQCAtMCwwICsxLDUgQEAKKzcKKzQwCiszCisiIiIKKy8vCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvS29lY2hlcl9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0tvZWNoZXJfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTBiMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L0tvZWNoZXJfbWFsZQpAQCAtMCwwICsxLDUgQEAKKzcKKzQwCiszCisiIiIKKy8vCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUmluZ19mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUmluZ19mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmOGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SaW5nX2ZlbWFsZQpAQCAtMCwwICsxLDQgQEAKKzYKKzIxCis4CitjCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUmluZ19tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1JpbmdfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzYyMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1JpbmdfbWFsZQpAQCAtMCwwICsxLDQgQEAKKzYKKzIyCis4CitjCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvUnVlc3R1bmdfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1J1ZXN0dW5nX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ5ZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1J1ZXN0dW5nX2ZlbWFsZQpAQCAtMCwwICsxLDkgQEAKKzEKKzI2Cis0Cis/Pz8/Pz9fX18/Pz9fX18KKz8/Pz8/LyggIFxfLyAgKVwKKz8/Pz8vIHxcX19fX18vfCBcCitfX18vIC8/XF8vX1xfLz9cIFwKK3xfX1wnPz8/KVxfLyg/Pz9cL3wKKz8/Pz8/Pz8vX19fX19cPz8/fHwKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SdWVzdHVuZ19tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1J1ZXN0dW5nX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU5YjY3YwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9SdWVzdHVuZ19tYWxlCkBAIC0wLDAgKzEsOSBAQAorMQorMjUKKzQKKz8/Pz8/X15fX19fPz8/X19fX15fPworPz8/PyggIFwgICBcXy8gICAvICApCis/Pz8/L1wgfFxfX18gX19fL3wgL1wKKz9fXy8gIC8/XF8gICAgIF8vP1xfID4KK0lfX19cPj8/PylcX19fLyg/Pz98IHwKKz8/Pz8/Pz8/L19fX19fX19cPz98X3wKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2hpbGRfZmVtYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaGlsZF9mZW1hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0OWVlYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2hpbGRfZmVtYWxlCkBAIC0wLDAgKzEsMTAgQEAKKzcKKzQzCis3Cis/P3xcCis/P3x8Cis/P3x8Cis9PXx8KQorPz98fAorPz98fAorPz98LwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaGlsZF9tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaGlsZF9tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjMyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NoaWxkX21hbGUKQEAgLTAsMCArMSwxMCBAQAorNworNDUKKzcKKz8/fFwKKz8/fHwKKz8/fHwKKz09fHwpCis/P3x8Cis/P3x8Cis/P3wvCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NodWhlX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2h1aGVfZmVtYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTk1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvU2NodWhlX2ZlbWFsZQpAQCAtMCwwICsxLDcgQEAKKzUKKzMyCisxOAorPz9fPz8/XworP3xffD98X3wKKz8vIEo/TCBcCisoXy8/Pz9cXykKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2h1aGVfbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9TY2h1aGVfbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMzMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1NjaHVoZV9tYWxlCkBAIC0wLDAgKzEsNyBAQAorNQorMzIKKzE4Cis/Pz9fPz8/XworPz98X3w/fF98Cis/Ly8gSj9MIFxcCisoX18vPz8/XF9fKQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1VtaGFuZ19mZW1hbGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg4NWJhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1VtaGFuZ19mZW1hbGUKQEAgLTAsMCArMSwxNyBAQAorMgorMzEKKzQKKz8/Xz8/Pz8/XworPz9WPz8/Pz9WCisKKworfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/fAorfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/fAorfD8/Pz8/Pz8/P3wKK3w/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/fAorP1w/Pz8/Pz8/LwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1VtaGFuZ19tYWxlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L1VtaGFuZ19tYWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMjVkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvVW1oYW5nX21hbGUKQEAgLTAsMCArMSwxNyBAQAorNAorMzEKKzQKKz8/P18/Pz8/P18KKz8/P1Y/Pz8/P1YKKworCit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cit8Pz8/Pz8/Pz8/Pz98Cis/XF8/Pz8/Pz8/Xy8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9heGUgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvYXhlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjdmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvYXhlCkBAIC0wLDAgKzEsMTMgQEAKKzcKKzE5CisxCis/X18/Pz8/X18KKy8vIFwoKS8gXFwKK3x8ICB8fCAgfHwKK1xcXy98fFxfLy8KKz8/Pz98fAorPz8/P3x8CisKKworPz8/P3x8Cis/Pz8/XC8KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9iYXNlX2ZlbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9iYXNlX2ZlbWFsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFlYzFhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfZmVtYWxlCkBAIC0wLDAgKzEsMjUgQEAKKzMKKzAKKzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XyAvfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHx8X18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgYCAgICcgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gfFxfLyBcXy98IFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAuLV9fXywvIC8gXCAgICAgLyBcIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGAtLS4uX18nICAgKSAgICggICBcIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gIC4gIFwgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBcIC8gIHwgIC98ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBZICAgfCAgfCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgIHwgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIHwgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICkgKCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKSAoIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEogTCBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycnICAgYGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Jhc2VfbWFsZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9iYXNlX21hbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzNjY1MwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9iYXNlX21hbGUKQEAgLTAsMCArMSwyNSBAQAorMworMAorMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XyAvfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX198IHxfX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9eICAgYCB8ICcgICBeXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICx8XF9fLyBcX18vfC4sXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgLC0tX19ffCAnLyBcICBfX18gIC8gXF9gXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICB8Xy4uX19fLicgICApL198X1woICAgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cX3xfL1wgICBcIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC5cIC8uIHwgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx8ICBZICB8bCAgLyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIHwgIHx8ICAgXHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8YCAnfGAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggIHwgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gSi4gLkwgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJycgICAgIGBgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvY2x1YiBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9jbHViCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjZlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvY2x1YgpAQCAtMCwwICsxLDEzIEBACis3CisyMQorMAorPz9fXworXy9fX1xfCitffF9ffF8KK198X198XworP1w/Py8KKz8/fHwKKz8/fHwKKworCis/PygpCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvZmVybndhZmZlIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Zlcm53YWZmZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg5N2U4Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2Zlcm53YWZmZQpAQCAtMCwwICsxLDE5IEBACis3CisyMworMAorPz8/KQorPz8vLgorPy8/LgorfD8/LgorfD8/LgorfD8/LgorST8/LgorCisKK0k/Py4KK3w/Py4KK3w/Py4KK3w/Py4KKz9cPy4KKz8/XC4KKz8/PykKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9rbmlmZSBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9rbmlmZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE0ZWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L2tuaWZlCkBAIC0wLDAgKzEsOSBAQAorNworMjMKKzQKKz8sCisofAorKHwKKy0tCisKKz9VCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvbWFnaWMgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvbWFnaWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNTk0YgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9tYWdpYwpAQCAtMCwwICsxLDEwIEBACis3CisyMAorMAorLAorPy4/Jz8/LgorPy5cfC8/LAorLT8tKy0/LQorLD8vfFw/LgorLj8sLj8/Py4KKz8/P1wvCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvbWlzYyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9taXNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjUyODEKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvbWlzYwpAQCAtMCwwICsxLDExIEBACis3CisyMworNAorL1wKK3x8Cit8fAorCisKK3x8Cit8fAorYCcKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zcGVhciBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zcGVhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWU5ZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3NwZWFyCkBAIC0wLDAgKzEsMjUgQEAKKzcKKzIzCiswCisvXAorIXwKK1wvCit8fAorfHwKK3x8Cit8fAorCisKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK2AnCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3RhZmYgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3RhZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NDZkMAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC9zdGFmZgpAQCAtMCwwICsxLDIyIEBACis3CisyMworMAorLC4KK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKKworCit8fAorfHwKK3x8Cit8fAorfHwKK3x8Cit8fAorfHwKK3x8CitgJwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3N3b3JkIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3N3b3JkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZmYyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9nZngvc3dvcmQKQEAgLTAsMCArMSwxMyBAQAorNworMjIKKzAKKz8/LAorP3x8Cis/fHwKKz98fAorP3x8Cis/fHwKK198fF8KKworCis/YCcKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC93aGlwIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvZ2Z4L3doaXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkYjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvaW52bWFzdGVyL2dmeC93aGlwCkBAIC0wLDAgKzEsMjEgQEAKKzcKKzE2CisyCis/PyAsXyAKKz8gLyAgXCAKKyAvID8/IFwKKyB8ID8/PyB8CisgfCA/Pz8gXgorIHwKKz8gXAorPz8gfCA/PyMKKz8/IC8gCis/IC8gCis/IHwgCis/IC8gCisgLyAKKyB8IAorIHwgCisgfCAKKyBcIAorPyBgIApkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvaW52bWFzdGVyLmMgYi9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmNjZGEwCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvaW52bWFzdGVyLmMKQEAgLTAsMCArMSw0NjQgQEAKKy8vIGludm1hc3Rlci5jIGJ5IE5hY2h0d2luZEBNRyBWMS4xICg1LjMuMjAwMSkKKy8vIEEgc21hbGwgbWFzdGVyIHRoYXQgcHJvdmlkZXMgYSBncmFwaGljYWwgZGlzcGxheSBvZiB0aGUgcGxheWVytHMKKy8vIGVxdWlwbWVudC4gCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGlucHV0X3RvLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgImludm1hc3Rlci5oIgorCisKK21hcHBpbmcgZGF0YTsKK2Nsb3N1cmUgYWJicmV2aWF0ZTsKKworCisvLyBpJ20gYXdhcmUgdGhpcyBjYW4gYmUgZGV0ZXJtaW5lZCB3aXRoIG1faW5kaWNlcyhWQUxJRF9BUk1PVVJfVFlQRSksCisvLyBidXQgdGhlIHBvc2l0aW9uIGluIHRoZSBhcnJheXMgaXMgaW1wb3J0YW50IGZvciB0aGUgZHJhd2luZyBvcmRlci4KKy8vIGZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzIGRyYXduIGxhc3QKK3N0YXRpYyBzdHJpbmcgKmFybW91cl90eXBlcyA9IAorKHtBVF9CRUxULAorICBBVF9TSElFTEQsCisgIEFUX0hFTE1FVCwKKyAgQVRfQk9PVCwKKyAgQVRfVFJPVVNFUlMsCisgIEFUX0FNVUxFVCwKKyAgQVRfUklORywKKyAgQVRfR0xPVkUsCisgIEFUX1FVSVZFUiwKKyAgQVRfQ0xPQUssCisgIEFUX0FSTU9VUn0pOworCitzdGF0aWMgbWFwcGluZyBjb2xvcnMgPSAKKyhbMDpBTlNJX0JMQUNLLAorICAxOkFOU0lfUkVELCAKKyAgMjpBTlNJX0dSRUVOLAorICAzOkFOU0lfWUVMTE9XLAorICA0OkFOU0lfQkxVRSwKKyAgNTpBTlNJX1BVUlBMRSwKKyAgNjpBTlNJX0NZQU4sCisgIDc6QU5TSV9XSElURSwKKyAgODoiIl0pOworICAKK3N0YXRpYyBtYXBwaW5nIGJnY29sb3JzID0gCisoWzA6QU5TSV9CR19CTEFDSywKKyAgMTpBTlNJX0JHX1JFRCwgCisgIDI6QU5TSV9CR19HUkVFTiwKKyAgMzpBTlNJX0JHX1lFTExPVywKKyAgNDpBTlNJX0JHX0JMVUUsCisgIDU6QU5TSV9CR19QVVJQTEUsCisgIDY6QU5TSV9CR19DWUFOLAorICA3OkFOU0lfQkdfV0hJVEUsCisgIDg6IiJdKTsKKyAgCisKKworc3RhdGljIHN0cmluZyBNYXBwaW5nMkNvbG9yZWRUZXh0KG1hcHBpbmcgcGljLCBvYmplY3QgcGxheWVyKTsKK3N0YXRpYyBzdHJpbmcgTWFwcGluZzJQbGFpblRleHQobWFwcGluZyBwaWMpOworc3RhdGljIHZvaWQgQWRkRGVzY3JpcHRpb24obWFwcGluZyBwaWMsIHN0cmluZyB0eXBlLCBvYmplY3QgaXRlbSk7CitzdGF0aWMgc3RyaW5nIENvbXBvc2VEZXNjKG9iamVjdCBpdGVtKTsKK3N0YXRpYyB2b2lkIENvbmZpZ3VyZUNvbG9ycyhzdHJpbmcgdGV4dCk7CisKK3ZvaWQgU2hvd0ludihvYmplY3QgcGxheWVyLCBzdHJpbmcgYXJnKTsKKworLy8gb2ssIGxldLRzIGp1c3QgcmVhZCBpbiB0aGUgZ3JhcGhpY3MuLi4KKy8vIHJlYWxseSB0YWtlcyBzb21lIHRpbWUgKH4yNTAgZXZhbCB0aWNrcykgYnV0IGlzIG9ubHkgZG9uZQorLy8gb25jZSBpbiBhbiB1cHRpbWUKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgbWFwcGluZyBwaWM7CisgIHN0cmluZyAqZmlsZXMsICpsaW5lcywgdGV4dDsKKyAgaW50IGksaixrLCBpbmRlbnR4LGluZGVudHksIGNvbG9yOworCisgIGRhdGE9KFtdKTsKKyAgCisgIERCKCJUcnlpbmcgdG8gZmlyZSB1cCBtYXN0ZXIsIHBhdGggaXMgJyIrSU5WUEFUSCsiJy4uLiIpOworICBmaWxlcz1nZXRfZGlyKElOVlBBVEgrImdmeC8qIiktKHsiLiIsICIuLiJ9KTsKKyAgREIoc3ByaW50ZigiRmlsZXMgZm91bmQgaW4gJ2dmeC8nOiBcbiVPIiwgZmlsZXMpKTsKKyAgZm9yIChpPXNpemVvZihmaWxlcyktMTtpPj0wO2ktLSkKKyAgeworICAgIERCKCJSZWFkaW5nICciK2ZpbGVzW2ldKyInIC4uLiIpOworICAgIHRleHQ9cmVhZF9maWxlKElOVlBBVEgrImdmeC8iK2ZpbGVzW2ldKTsKKyAgICBpZiAoIXN0cmluZ3AodGV4dCkpCisgICAgeworICAgICAgREIoIkZhaWxlZCB0byByZWFkIGZpbGUuIik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgbGluZXM9ZXhwbG9kZSh0ZXh0LCAiXG4iKTsKKyAgICBpZiAoc2l6ZW9mKGxpbmVzKSA8IDQpCisgICAgeworICAgICAgREIoIkZpbGUgY29ycnVwdC4iKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbmRlbnR4PXRvX2ludChsaW5lc1sxXSk7CisgICAgaW5kZW50eT10b19pbnQobGluZXNbMl0pOworICAgIGNvbG9yPXRvX2ludChsaW5lc1swXSk7CisgICAgcGljPShbXSk7CisgICAgZm9yIChqPXNpemVvZihsaW5lcyktMTtqPjI7ai0tKQorICAgIHsKKyAgICAgIGZvciAoaz1zaXplb2YobGluZXNbal0pLTE7az49MDtrLS0pCisgICAgICB7CisgICAgICAgIGlmIChsaW5lc1tqXVtrLi5rXSE9Ij8iKQorICAgICAgICAgIHBpYys9KFsoai0zK2luZGVudHkpKjgwK2sraW5kZW50eDpsaW5lc1tqXVtrLi5rXTtjb2xvcl0pOworICAgICAgfQorICAgIH0KKyAgICBkYXRhKz0oW2ZpbGVzW2ldOnBpY10pOworICAgIERCKCJGaWxlIHN1Y2Nlc3NmdWxseSByZWFkLiIpOworICB9CisgIERCKHNwcmludGYoIlR5cGVzIGNvdmVyZWQ6XG4lT1xuIiwgbV9pbmRpY2VzKGRhdGEpKSk7CisKKyAgLy8gY3JlYXRlIGNsb3N1cmUgb25seSBvbmNlIHRvIHNhdmUgdGltZQorICAvLyBuZWVkZWQgYnkgQ29tcG9zZURlc2MoKQorICAvLyB0aGUgY2xvc3VyZSBpc3Qgbm90IGFzIGNvbXBsaWNhdGVkIGFzIGl0IHNlZW1zIDspCisgIC8vIGl0IGp1c3QgY2hlY2tzIGV2ZXJ5IHdvcmQgb2YgdGhlIG5hbWUsIGlmIGl0IGRvZXMgbm90IGJlZ2luCisgIC8vIHdpdGggYSBjYXBpdGFsIGxldHRlciwgaXQgaXMgYWJicmV2aWF0ZWQKKyAgLy8gdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlIG5hbWUgbGVuZ3RoIGV4Y2VlZHMgMjAgY2hhcnMuLi4KKyAgYWJicmV2aWF0ZT1sYW1iZGEoKHsneH0pLCAKKyAgICAgICh7Iyc/LCAoeyMnPiwgKHsjJ21lbWJlciwgcXVvdGUoKHsiZGVyIiwgImRlcyJ9KSksICd4fSksIDB9KSwKKyAgICAgICAgImQuIiwKKyAgICAgICAgKHsjJz8sICh7Iyc+LCAoeyMnc2l6ZW9mLCAneH0pLCAzfSksIAorICAgICAgICAgICh7Iyc/LCAoeyMnLCwgKHsjJz0sICdhLCAoeyMnYWxsb2NhdGUsIDF9KSB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc9LCAoeyMnWywgJ2EsIDB9KSwgJ3ggfSksIAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ3NpemVvZiwgKHsjJ3JlZ2V4cCwgJ2EsICJeW2Etel0uKiJ9KSB9KSAKKyAgICAgICAgICAgICAgICAgfSksIAorICAgICAgICAgICAgKHsjJyssICh7IydbLi5dLCAneCwgMCwgMX0pLCAiLiJ9KSwKKyAgICAgICAgICAgICd4CisgICAgICAgICAgfSksIAorICAgICAgICAgICd4CisgICAgICAgIH0pCisgICAgICB9KSk7Cit9CisKKy8vIGZ1bmN0aW9uIHRoYXQgdHJpZXMgdG8gZ3Vlc3MgYSBnb29kIGl0ZW0gbmFtZSBhbmQgdXNlIGFiYnJldmF0aW9ucworLy8gd2hlcmUgcG9zc2libGUKK3N0YXRpYyBzdHJpbmcgQ29tcG9zZURlc2Mob2JqZWN0IGl0ZW0pCit7CisgIGludCBpOworICBzdHJpbmcgdGV4dCwgKmJ1ZmY7CisgIAorICB0ZXh0PXJlZ3JlcGxhY2UoaXRlbS0+UXVlcnlQcm9wKFBfU0hPUlQpCisgICAgICAgICAgICAgICAgfHxpdGVtLT5RdWVyeVByb3AoUF9OQU1FKQorICAgICAgICAgICAgICAgIHx8Ijw/PiIsCisgICAgICAgICAgICAgICAgIl4oRWluIFBhYXJ8RWlufEVpbmV8RGVyfERpZXxEYXMpICIsIiIsMCk7CisgICAgICAgICAgICAgICAgCisvLyB0cnkgdG8gc2hvcnRlbiB0aGUgbmFtZSB3aXRoIHRoZSBjbG9zdXJlCisgIGlmIChzaXplb2YodGV4dCkgPiAyMCkKKyAgICByZXR1cm4gaW1wbG9kZShtYXAoZXhwbG9kZSh0ZXh0LCAiICIpLCBhYmJyZXZpYXRlKSwgIiAiKTsKKyAgZWxzZSAgICAgIAorICAgIHJldHVybiB0ZXh0OworfQorCisvLyBjb252ZXJ0cyBhIG1hcHBpbmcgd2l0aCBjaGFyYWN0ZXJzIGFuZCBjb2xvciBpbmZvIGludG8gYQorLy8gdGV4dC4gZGF0YSBpbiB0aGUgbWFwcGluZyBpcyBzdG9yZWQgaW4gYSBvbmUtZGltZW5zaW9uYWwgCisvLyBvcmRlciB3aXRoIHRoZSBwb3NpdGlvbiBhcyBrZXkgKHlwb3MgaXMgcG9zLzgwLCB4cG9zIHBvcyU4MCkKKy8vIHRoaXMgc2V0dXAgaGFzIGEgaHVnZSBhZHZhbnRhZ2U6IGNvbWJpbmluZyBzZXZlcmFsCisvLyBncmFwaGljcyBqdXN0IHRha2VzIGEgIisiIG9wZXJhdG9yLCB0aGUgcmVzdCBpcyBoYW5kbGVkCisvLyBieSB0aGUgZ2FtZSBkcml2ZXIuIGZyZWFraW4nIGZhc3QsIG11Y2ggYmV0dGVyIHRoYW4gZG9pbmcgYW4KKy8vIGl0ZXJhdGlvbiBvdmVyIG9uZSBvciBtb3JlIGFycmF5IGluIGxwYy4KK3N0YXRpYyBzdHJpbmcgTWFwcGluZzJDb2xvcmVkVGV4dChtYXBwaW5nIHBpYywgb2JqZWN0IHBsYXllcikKK3sKKyAgc3RyaW5nIHRleHQ7CisgIG1hcHBpbmcgY29uZmlnbWFwOworICBpbnQgaSxqLGNvbG9yOworICAKKyAgY29uZmlnbWFwPWRlZmF1bHRfY29uZmlnKyhwbGF5ZXItPlF1ZXJ5UHJvcChQX0lOVk1BU1RFUl9DT05GSUcpfHwoW10pKTsKKworICB0ZXh0PSIiOworICBjb2xvcj0wOworICBmb3IgKGk9MDtpPDIyO2krKykKKyAgeworICAgIHRleHQrPWJnY29sb3JzW2NvbmZpZ21hcFs4XV07CisgICAgZm9yIChqPTA7ajw3ODtqKyspCisgICAgeyAKKyAgICAgIGlmIChwaWNbaSo4MCtqLDFdIT1jb2xvcikKKyAgICAgIHsKKyAgICAgICAgY29sb3I9cGljW2kqODAraiwxXTsKKyAgICAgICAgdGV4dCs9Y29sb3JzW2NvbmZpZ21hcFtjb2xvcl1dOworICAgICAgfQorICAgICAgdGV4dCs9cGljW2kqODAral07CisgICAgfQorICAgIHRleHQrPUFOU0lfTk9STUFMKyJcbiI7CisgICAgY29sb3I9MDsKKyAgfQorICByZXR1cm4gdGV4dDsKK30KKworc3RhdGljIHN0cmluZyBNYXBwaW5nMlBsYWluVGV4dChtYXBwaW5nIHBpYykKK3sKKyAgc3RyaW5nIHRleHQ7CisgIGludCBpLGo7CisgIAorICB0ZXh0PSIiOworCisgIGZvciAoaT0wO2k8MjI7aSsrKQorICB7CisgICAgZm9yIChqPTA7ajw3ODtqKyspCisgICAgICB0ZXh0Kz1waWNbaSo4MCtqXTsKKyAgICB0ZXh0Kz0iXG4iOworICB9CisgIHJldHVybiB0ZXh0OworfQorc3RhdGljIHZvaWQgQWRkRGVzY3JpcHRpb24obWFwcGluZyBwaWMsIHN0cmluZyB0eXBlLCBvYmplY3QgaXRlbSkKK3sKKyAgaW50IGluZGVudHgsIGluZGVudHksIGk7CisgIHN0cmluZyB0ZXh0OworCisgIHN3aXRjaCh0eXBlKQorICB7CisgICBjYXNlIEFUX0hFTE1FVDoKKyAgICAgIGluZGVudHg9NDc7CisgICAgICBpbmRlbnR5PTA7CisgICAgICB0ZXh0PXNwcmludGYoIiUtMzBzIixDb21wb3NlRGVzYyhpdGVtKVswLi4zMF0pO2JyZWFrOworICAgIGNhc2UgQVRfUVVJVkVSOgorICAgICAgaW5kZW50eD00OTsKKyAgICAgIGluZGVudHk9MjsKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0yOHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI4XSk7YnJlYWs7ICAgICAKKyAgICBjYXNlIEFUX0FNVUxFVDoKKyAgICAgIGluZGVudHg9NDk7CisgICAgICBpbmRlbnR5PTQ7ICAgICAKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0yN3MiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjI4XSk7YnJlYWs7ICAgICAKKyAgICBjYXNlIEFUX0FSTU9VUjoKKyAgICAgIGluZGVudHg9NTM7CisgICAgICBpbmRlbnR5PTc7CisgICAgICB0ZXh0PXNwcmludGYoIiUtMjRzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNV0pO2JyZWFrOyAgICAgICAgICAKKyAgICBjYXNlIEFUX1NISUVMRDoKKyAgICAgIGluZGVudHg9NTQ7CisgICAgICBpbmRlbnR5PTEwOyAgIAorICAgICAgdGV4dD1zcHJpbnRmKCIlLTIwcyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMjRdKTticmVhazsKKyAgICBjYXNlIEFUX0NMT0FLOgorICAgICAgaW5kZW50eD01MzsKKyAgICAgIGluZGVudHk9MTU7CisgICAgICB0ZXh0PXNwcmludGYoIiUtMjBzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNV0pO2JyZWFrOworICAgIGNhc2UgQVRfVFJPVVNFUlM6CisgICAgICBpbmRlbnR4PTQ5OworICAgICAgaW5kZW50eT0xNzsKKyAgICAgIHRleHQ9c3ByaW50ZigiJS0yMHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjIwXSk7YnJlYWs7ICAgICAKKyAgICBjYXNlIEFUX1JJTkc6CisgICAgICBpbmRlbnR4PTA7CisgICAgICBpbmRlbnR5PTk7CisgICAgICB0ZXh0PXNwcmludGYoIiUxNHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjE3XSk7YnJlYWs7CisgICAgY2FzZSBBVF9HTE9WRToKKyAgICAgIGluZGVudHg9MDsKKyAgICAgIGluZGVudHk9MTE7CisgICAgICB0ZXh0PXNwcmludGYoIiUxNHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjE3XSk7YnJlYWs7CisgICAgY2FzZSBBVF9CRUxUOgorICAgICAgaW5kZW50eD0xOworICAgICAgaW5kZW50eT0xMzsKKyAgICAgIHRleHQ9c3ByaW50ZigiJTE0cyIsQ29tcG9zZURlc2MoaXRlbSlbMC4uMThdKTticmVhazsgICAgIAorICAgIGNhc2UgQVRfQk9PVDoKKyAgICAgIGluZGVudHg9MTsKKyAgICAgIGluZGVudHk9MjA7CisgICAgICB0ZXh0PXNwcmludGYoIiUxOHMiLENvbXBvc2VEZXNjKGl0ZW0pWzAuLjE4XSk7YnJlYWs7CisgICAgY2FzZSAiV2FmZmUiOgorICAgICAgaW5kZW50eD0xOworICAgICAgaW5kZW50eT0xOworICAgICAgdGV4dD1zcHJpbnRmKCIlMThzIixDb21wb3NlRGVzYyhpdGVtKVswLi4yNV0pOworICAgICAgaWYgKGl0ZW0tPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSA+IDEgJiYKKyAgICAgICAgICB0aGlzX3BsYXllcigpICYmCisgICAgICAgICAgISh0aGlzX3BsYXllcigpLT5RdWVyeUFybW9yQnlUeXBlKEFUX1NISUVMRCkpKQorICAgICAgICBBZGREZXNjcmlwdGlvbihwaWMsIEFUX1NISUVMRCwgaXRlbSk7YnJlYWs7CisgICAgZGVmYXVsdDogcmV0dXJuOworICB9CisgIGZvciAoaT0wO2k8c2l6ZW9mKHRleHQpO2krKykKKyAgICBwaWMrPShbKDgwKmluZGVudHkraW5kZW50eCtpKTp0ZXh0W2kuLmldOzJdKTsKK30KKwordmFyYXJncyBzdGF0aWMgdm9pZCBDb25maWd1cmVDb2xvcnMoc3RyaW5nIHRleHQpCit7IAorICBtYXBwaW5nIGNvbmZpZywgZGlzcGxheTsKKyAgc3RyaW5nICpzdHJzOworICAKKyAgaWYgKCFvYmplY3RwKHRoaXNfcGxheWVyKCkpKSByZXR1cm47CisgIAorICBpZiAodGhpc19wbGF5ZXIoKS0+SW5GaWdodCgpKQorICB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIkltIEthbXBmPyBOYSBEdSBoYXN0IE5lcnZlbiwgZGFzIGxhc3NlbiB3aXIgZG9jaCBtYWwgbGllYmVyISAiCisgICAgICAiUHJvYmllciBlcyBkYW5hY2ggbm9jaG1hbC4uLiIsIDc4KSk7CisgICAgcmV0dXJuOworICB9CisgIAorICBpZiAoc3RyaW5ncCh0ZXh0KSkgdGV4dD1sb3dlcl9jYXNlKHRleHQpOworICAKKyAgaWYgKHRleHQ9PSJvayIpCisgIHsKKyAgICB3cml0ZSgiRmFyYmtvbmZpZ3VyYXRpb24gYmVlbmRldC5cbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vImFuc2lfY29uZmlnIiwgZGVmIGluIGludm1hc3Rlci5oCisgIGNvbmZpZz10aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9JTlZNQVNURVJfQ09ORklHKXx8KFtdKTsKKyAgZGlzcGxheT1kZWZhdWx0X2NvbmZpZytjb25maWc7CisgIAorICBpZiAoIXRleHQgfHwgdGV4dD09IiIpCisgIHsKKyAgICB3cml0ZSggCisgICAgIioqKiBGYXJia29uZmlndXJhdGlvbiBmdWVyIGRlbiBBdXNydWVzdHVuZ3NiZWZlaGwgKioqXG5cbiIKKyAgICAiIEZhcmJlOiAgICAgICAgICAgICAgICAgICAgIHdpcmQgZGFyZ2VzdGVsbHQgbWl0OlxuIgorICAgICItLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyAgICAiIEhpbnRlcmdydW5kICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs4XV0rIlxuIgorICAgICIgU2Nod2FyeiAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzBdXSsiXG4iCisgICAgIiBSb3QgICAgICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbMV1dKyJcbiIKKyAgICAiIEdydWVuICAgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVsyXV0rIlxuIgorICAgICIgR2VsYiAgICAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzNdXSsiXG4iCisgICAgIiBCbGF1ICAgICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbNF1dKyJcbiIKKyAgICAiIE1hZ2VudGEgICAgICAgICAgICAgICAgICAgICAiK0NPTE9STkFNRVNbZGlzcGxheVs1XV0rIlxuIgorICAgICIgVHVlcmtpcyAgICAgICAgICAgICAgICAgICAgICIrQ09MT1JOQU1FU1tkaXNwbGF5WzZdXSsiXG4iCisgICAgIiBXZWlzcyAgICAgICAgICAgICAgICAgICAgICAgIitDT0xPUk5BTUVTW2Rpc3BsYXlbN11dKyJcblxuIgorICAgICJGYXJiZSBhZW5kZXJuIG1pdCAnPGZhcmJlPiA8Z2V3dWVuc2NodGUgZmFyYmU+Jy5cbiIKKyAgICAiQmVpc3BpZWw6ICdnZWxiIHJvdCcuXG4iCisgICAgIkFsbGVzLCB3YXMgc3RhbmRhcmRtYWVzc2lnIGdlbGIgd2FlcmUsIHd1ZXJkZSBkYW5uIG1pdCBkZXIgQU5TSS1GYXJiZSBcbiIKKyAgICAiUm90IGRhcmdlc3RlbGx0LlxuIgorICAgICJEZXIgSGludGVyZ3J1bmQga2FubiB6dXNhZXR6bGljaCBkaWUgRmFyYmUgJ2tlaW5lJyBoYWJlbiwgYmVpIGRlciBkZXIgXG4iCisgICAgIkhpbnRlcmdydW5kIGViZW4gdWViZXJoYXVwdCBuaWNodCBnZWZhZXJidCB3aXJkLlxuIgorICAgICJCZWlzcGllbDogJ2hpbnRlcmdydW5kIGtlaW5lJy4gU2NoYWx0ZXQgZGllIEhpbnRlcmdydW5kZmFyYmUgYXVzLlxuXG4iCisgICAgIkJlZW5kZW4gbWl0ICdvaycuIFxuIgorICAgICJXaWVkZXJob2x1bmcgZGVyIEZhcmJsaXN0ZSBtaXQgPFJldHVybj4uXG4iCisgICAgIkZhcmJsaXN0ZSBhdWYgU3RhbmRhcmQgenVydWVja3NldHplbiBtaXQgJ3Jlc2V0Jy5cbiIpOworICB9CisgIGVsc2UKKyAgaWYgKHRleHQ9PSJyZXNldCIpCisgIHsKKyAgICB0aGlzX3BsYXllcigpLT5TZXQoUF9JTlZNQVNURVJfQ09ORklHLCBTQVZFLCBGX01PREVfQUQpOyAgICAKKyAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfSU5WTUFTVEVSX0NPTkZJRywgMCk7CisgICAgd3JpdGUoIkZhcmJlbiB6dXJ1ZWNrZ2VzZXR6dCFcbiIpOyAgICAKKyAgfQorICBlbHNlCisgIHsKKyAgICBpZiAoIHNpemVvZihzdHJzPWV4cGxvZGUodGV4dCwgIiAiKS0oeyIifSkpICE9MiAKKyAgICAgIHx8ICFtZW1iZXIoKENPTE9SQ09ERVMtKFsia2VpbmUiXSkpLCBzdHJzWzBdKQorICAgICAgfHwgIW1lbWJlcigoQ09MT1JDT0RFUy0oWyJoaW50ZXJncnVuZCJdKSksIHN0cnNbMV0pCisgICAgICB8fCAoKHN0cnNbMF0hPSJoaW50ZXJncnVuZCIpICYmIChzdHJzWzFdPT0ia2VpbmUiKSkgKSAKKyAgICB7CisgICAgICB3cml0ZSgiRmFsc2NoZSBFaW5nYWJlLlxuIgorICAgICAgICAgICAgIkZvcm1hdDogPGZhcmJlfGhpbnRlcmdydW5kPiA8enVnZXdpZXNlbmUgRmFyYmU+XG4iCisgICAgICAgICAgICAiQWJicmVjaGVuIG1pdCAnb2snLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoQ09MT1JDT0RFU1tzdHJzWzFdXT09ZGVmYXVsdF9jb25maWdbQ09MT1JDT0RFU1tzdHJzWzBdXV0pCisgICAgICAgIGNvbmZpZy09KFtDT0xPUkNPREVTW3N0cnNbMF1dXSk7CisgICAgICBlbHNlCisgICAgICAgIGNvbmZpZys9KFtDT0xPUkNPREVTW3N0cnNbMF1dOkNPTE9SQ09ERVNbc3Ryc1sxXV1dKTsKKyAgICAgIGlmICghc2l6ZW9mKGNvbmZpZykpCisgICAgICB7CisgICAgICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BRCk7ICAgIAorICAgICAgICB0aGlzX3BsYXllcigpLT5TZXRQcm9wKFBfSU5WTUFTVEVSX0NPTkZJRywgMCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHRoaXNfcGxheWVyKCktPlNldFByb3AoUF9JTlZNQVNURVJfQ09ORklHLCBkZWVwX2NvcHkoY29uZmlnKSk7CisgICAgICAgIHRoaXNfcGxheWVyKCktPlNldChQX0lOVk1BU1RFUl9DT05GSUcsIFNBVkUsIEZfTU9ERV9BUyk7ICAgICAgICAKKyAgICAgIH0KKyAgICAgIHdyaXRlKCJPaywgRmFyYmUgZ2V3YWVobHQhXG4iKTsKKyAgICB9CisgIH0KKyAgaW5wdXRfdG8oIkNvbmZpZ3VyZUNvbG9ycyIsIElOUFVUX1BST01QVCwgIlxuRWluZ2FiZTogIik7Cit9CisKKworc3RyaW5nKiBhcm1vdXJfb3JkZXI9KHsgCisgICAgQVRfSEVMTUVULCBBVF9BTVVMRVQsIEFUX1FVSVZFUiwgQVRfQVJNT1VSLCBBVF9DTE9BSywKKyAgQVRfR0xPVkUsIEFUX1JJTkcsIEFUX0JFTFQsCisgIEFUX1RST1VTRVJTLCBBVF9CT09ULCBBVF9TSElFTEQsIEFUX01JU0N9KTsgCisKK21hcHBpbmcgd2VhcG9uX25hbWVzPShbCisJCSAgICAgICBXVF9TUEVBUiA6ICJTcGVlciIsCisJCSAgICAgICBXVF9TV09SRCA6ICJTY2h3ZXJ0IiwKKwkJICAgICAgIFdUX1NUQUZGIDogIkthbXBmc3RhYiIsCisJCSAgICAgICBXVF9XSElQICA6ICJQZWl0c2NoZSIsCisJCSAgICAgICBXVF9DTFVCICA6ICJLZXVsZSIsCisJCSAgICAgICBXVF9LTklGRSA6ICJNZXNzZXIiLAorCQkgICAgICAgV1RfTUlTQyAgOiAiSXJnZW5kd2FzIiwKKwkJICAgICAgIFdUX01BR0lDIDogIkFydGVmYWt0IiwKKwkJICAgICAgIFdUX0FYRSAgIDogIkF4dCIsCisJICAgICAgIFdUX1JBTkdFRF9XRUFQT04gOiAiRmVybndhZmZlIgorCQkgICAgICAgXSk7CisKK3N0cmluZyBTaW1wbGVJbnYob2JqZWN0IHBsYXllcikgeworICBvYmplY3QqIGFybW91cnM9cGxheWVyLT5RdWVyeVByb3AoUF9BUk1PVVJTKTsKKyAgaW50IGNvdW50PXNpemVvZihhcm1vdXJfb3JkZXIpOworICBzdHJpbmcqIGxpc3Q9YWxsb2NhdGUoY291bnQpOworICBzdHJpbmcgcmVzdWx0PSJBdXNydWVzdHVuZ1xuIjsKKyAgaW50IGk7CisKKyAgZm9yZWFjaChvYmplY3Qgb2I6IGFybW91cnMpIHsKKyAgICBpZiAoIW9iamVjdHAob2IpKSBjb250aW51ZTsKKyAgICAgIGludCBpZHggPSBtZW1iZXIoYXJtb3VyX29yZGVyLCBvYi0+UXVlcnlQcm9wKFBfQVJNT1VSX1RZUEUpKTsJICAgICAgCisgICAgICBpZiAoaWR4Pj0wKQorICAgICAgICBsaXN0W2lkeF09b2ItPlF1ZXJ5UHJvcChQX1NIT1JUKTsKKyAgfQorCisgIC8vIEFUX01JU0MgKGxldHp0ZXMgRWxlbWVudCBpbiBsaXN0IHVuZCBhcm1vdXJfb3JkZXIpIHdlZ2xhc3Nlbi4KKyAgZm9yIChpPTA7aTxjb3VudC0xO2krKykgeworICAgIHJlc3VsdCs9c3ByaW50ZigiJS0yMHMgJS01N3NcbiIsYXJtb3VyX29yZGVyW2ldLGxpc3RbaV0gfHwgIiIpOworICB9CisKKyAgb2JqZWN0IG9iPW9iPXBsYXllci0+UXVlcnlQcm9wKFBfV0VBUE9OKTsKKyAgaWYgKG9iamVjdHAob2IpKSB7CisgICAgcmVzdWx0Kz1zcHJpbnRmKCIlLTIwcyAlLTU3c1xuIiwKKwkJICAgIChvYi0+UXVlcnlQcm9wKFBfTlJfSEFORFMpPT0xID8gIkVpbmhhbmQtIjoiWndlaWhhbmQtIikKKwkJICAgICt3ZWFwb25fbmFtZXNbb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKV0sCisJCSAgICBvYi0+UXVlcnlQcm9wKFBfU0hPUlQpKTsKKyAgfSBlbHNlIHJlc3VsdCs9IktlaW5lIFdhZmZlXG4iOworCisgIHJldHVybiByZXN1bHQ7Cit9CisvLyB0aGUgbWFpbiBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHBsYXllciBvYmplY3QuCisvLyBkZXRlcm1pbmVzIGdlbmRlciwgdGhlbiBhZGRzIGFybW9yL3dlYXBvbiBncmFwaGljcworLy8gZHluYW1pY2FsbHkuIHN0aWxsIHZlcnkgZmFzdCBkdWUgdG8gdGhlIHVzZSBvZiB0aGUgIisiIG9wZXJhdG9yLAorLy8gc2VlIGFib3ZlLgordm9pZCBTaG93SW52KG9iamVjdCBwbGF5ZXIsIHN0cmluZyBhcmcpCit7CisgIHN0cmluZyBnZW5kZXIsIHR5cGU7CisgIG1hcHBpbmcgcGljOworICBpbnQgaTsKKyAgb2JqZWN0IGl0ZW07CisKKyAgaWYgKCFvYmplY3RwKHBsYXllcil8fCFpbnRlcmFjdGl2ZShwbGF5ZXIpKSByZXR1cm47CisKKyAgLy8gc3BsaXQgYXJncy4KKyAgc3RyaW5nICphcmdzOworICBpZiAoc3RyaW5ncChhcmcpKQorICAgIGFyZ3MgPSBleHBsb2RlKGxvd2VyX2Nhc2UoYXJnKSwgIiAiKSAtICh7IiAifSk7CisgIGVsc2UKKyAgICBhcmdzID0gKHt9KTsKKworICBpZiAobWVtYmVyKGFyZ3MsICJmYXJiZW4iKSA+IC0xKSB7CisgICAgICBDb25maWd1cmVDb2xvcnMoKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtZW1iZXIoYXJncywgIi1rIikgPiAtMSB8fCBwbGF5ZXItPlF1ZXJ5UHJvcChQX05PX0FTQ0lJX0FSVCkpIHsKKyAgICB0ZWxsX29iamVjdChwbGF5ZXIsIFNpbXBsZUludihwbGF5ZXIpKTsKKyAgICByZXR1cm47CisgIH0KKworICBnZW5kZXI9cGxheWVyLT5RdWVyeVByb3AoUF9HRU5ERVIpPT1GRU1BTEU/Il9mZW1hbGUiOiJfbWFsZSI7CisgIHBpYz1kZWVwX2NvcHkoZGF0YVsiYmFzZSIrZ2VuZGVyXSk7CisgIHBpYys9ZGF0YVsiQmVzY2hyaWZ0dW5nIl07CisgIGZvciAoaT1zaXplb2YoYXJtb3VyX3R5cGVzKS0xO2k+PTA7aS0tKQorICAgIGlmIChvYmplY3RwKGl0ZW09cGxheWVyLT5RdWVyeUFybW91ckJ5VHlwZShhcm1vdXJfdHlwZXNbaV0pKSkKKyAgICB7CisgICAgICBwaWMrPWRhdGFbYXJtb3VyX3R5cGVzW2ldK2dlbmRlcl07CisgICAgICBBZGREZXNjcmlwdGlvbihwaWMsIGFybW91cl90eXBlc1tpXSwgaXRlbSk7CisgICAgfQorICBpZiAoaXRlbT1wbGF5ZXItPlF1ZXJ5UHJvcChQX1dFQVBPTikpCisgIHsKKyAgICBwaWMrPWRhdGFbKFZBTElEX1dFQVBPTl9UWVBFKHR5cGU9aXRlbS0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpKSk/CisgICAgICB0eXBlOldUX01JU0NdOworICAgIEFkZERlc2NyaXB0aW9uKHBpYywgIldhZmZlIiwgaXRlbSk7CisgIH0gICAgICAKKyAgaWYgKHBsYXllci0+UXVlcnlQcm9wKFBfVFRZKSE9ImFuc2kiKQorICAgIHBsYXllci0+TW9yZShNYXBwaW5nMlBsYWluVGV4dChwaWMpKTsKKyAgZWxzZQorICAgIHBsYXllci0+TW9yZShNYXBwaW5nMkNvbG9yZWRUZXh0KHBpYywgcGxheWVyKSk7CisgIERCKGdldGV1aWQocGxheWVyKSsiIGV2YWwgY29zdDogIisoMTAwMDAwMC1nZXRfZXZhbF9jb3N0KCkpKyIgdGlja3MuXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9pbnZtYXN0ZXIvaW52bWFzdGVyLmggYi9zdGQvcGxheWVyL2ludm1hc3Rlci9pbnZtYXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODIxYjYzCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9pbnZtYXN0ZXIvaW52bWFzdGVyLmgKQEAgLTAsMCArMSwyMSBAQAorI2RlZmluZSBJTlZQQVRIICIvc3RkL3BsYXllci9pbnZtYXN0ZXIvIgorI2RlZmluZSBEQih4KQorLyoKKyNkZWZpbmUgREIoeCkgaWYgKGZpbmRfcGxheWVyKCJyaWt1cyIpKSBcCisgICAgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJpa3VzIiksIFwKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrX3N0cmluZyh4LCA3OCwgIklOVk1BU1RFUjogIiwgMSkpOworKi8KKyNkZWZpbmUgUF9JTlZNQVNURVJfQ09ORklHICJpbnZtYXN0ZXJfY29uZmlnIgorI2RlZmluZSBDT0xPUk5BTUVTICh7IlNjaHdhcnoiLCJSb3QiLCJHcnVlbiIsIkdlbGIiLFwKKyAgICAgICAgICAgICAgICAgICAgICJCbGF1IiwiTWFnZW50YSIsIlR1ZXJraXMiLCJXZWlzcyIsIktlaW5lIn0pCisjZGVmaW5lIENPTE9SQ09ERVMgKFsic2Nod2FyeiI6MCxcCisgICAgICAgICAgICAgICAgICAgICAicm90IjoxLFwKKyAgICAgICAgICAgICAgICAgICAgICJncnVlbiI6MixcCisgICAgICAgICAgICAgICAgICAgICAiZ2VsYiI6MyxcCisgICAgICAgICAgICAgICAgICAgICAiYmxhdSI6NCxcCisgICAgICAgICAgICAgICAgICAgICAibWFnZW50YSI6NSxcCisgICAgICAgICAgICAgICAgICAgICAidHVlcmtpcyI6NixcCisgICAgICAgICAgICAgICAgICAgICAid2Vpc3MiOjcsXAorICAgICAgICAgICAgICAgICAgICAgImtlaW5lIjo4LFwKKyAgICAgICAgICAgICAgICAgICAgICJoaW50ZXJncnVuZCI6OF0pCisjZGVmaW5lIGRlZmF1bHRfY29uZmlnIChbMDowLCAxOjEsIDI6MiwgMzozLCA0OjQsIDU6NSwgNjo2LCA3OjcsIDg6MF0pCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL2xpZmUuYyBiL3N0ZC9wbGF5ZXIvbGlmZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjFmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2xpZmUuYwpAQCAtMCwwICsxLDg0MSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9saWZlLmMgLS0gcGxheWVyIGxpZmUgaGFuZGxpbmcKKy8vCisvLyAkSWQ6IGxpZmUuYyA5Mzk3IDIwMTUtMTItMTEgMjA6Mjk6MjZaIFplc3N0cmEgJAorCisvLyBEZWZpbmVzIHNvbWUgdGhpbmdzIHdoaWNoIGFyZSBkaWZmZXJlbnQgdGhhbiBpbiBsaXZpbmcuYworLy8gT25lIGV4YW1wbGUgaXMgdGhlIGhlYXJ0X2JlYXQoKS4KKworLy8gUHJvcGVydGllcworLy8gIFBfQUdFICAgICAgICAgICAtLSBBZ2UKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvbGlmZSI7CisKKyNpbmNsdWRlIDxydGxpbWl0cy5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvbGlmZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHBsYXllci9jb21tLmg+CisjaW5jbHVkZSA8cGxheWVyL2dtY3AuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxob29rLmg+CisKKyNpbmNsdWRlIDxsaXZpbmcvbGlmZS5oPgorI2luY2x1ZGUgPHBsYXllci9wa2xvZy5oPgorI2luY2x1ZGUgPHBsYXllci9jb21iYXQuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKyNpbmNsdWRlIDxsaXZpbmcvY29tYmF0Lmg+CisjaW5jbHVkZSA8YXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPGRlZnVlbC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworLy8gRGllIEZvbGdlbiBlaW5lcyBUb2RlcyB3aXJrZW4gNCBTdHVuZGVuIGxhbmcgbmFjaAorI2RlZmluZSBTVUZGRVJfVElNRSA3MjAwCisjZGVmaW5lIFBfREVBVEhfSU5GTyAiZGVhdGhfaW5mbyIKKworaW50IGFnZTsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaGVhcnQgYmVhdHMgb2YgdGhpcyBjaGFyYWN0ZXIuICovCisKK3ByaXZhdGUgaW50IHN1ZmZlcl90aW1lOworc3RhdGljIGludCB0aW1lX3RvX3NhdmU7ICAvKiB3aGVuIHRvIG5leHQgc2F2ZSBwbGF5ZXIgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBkaWVfaW5fcHJvZ3Jlc3M7IC8vIHNlbWFwaG9yZSBmdWVyIGRpZSgpLUF1ZnJ1ZmUuCisKK3N0YXRpYyBpbnQgX3NldF9wbGF5ZXJraWxscyggaW50IHZhbCApOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgIDo6Y3JlYXRlKCk7CisgICAgU2V0KFBfQUdFLCAtMSwgRl9TRVRfTUVUSE9EKTsKKyAgICBTZXQoUF9BR0UsIFBST1RFQ1RFRCwgRl9NT0RFKTsKKyAgICBTZXQoIFBfS0lMTFMsIFNBVkV8U0VDVVJFRCwgRl9NT0RFX0FTICk7CisgICAgU2V0KCBQX0dIT1NULCBTQVZFLCBGX01PREVfQVMgKTsKKyAgICBTZXQoIFBfVElNSU5HX01BUCwgU0FWRXxTRUNVUkVELCBGX01PREVfQVMgKTsKKyAgICBTZXQoIFBfTEFTVF9ERUFUSF9USU1FLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyApOworICAgIFNldCggUF9ERUFUSF9JTkZPLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyApOworICAgIFNldCggUF9ERUZVRUxfTElNSVRfRk9PRCxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgICBTZXQoIFBfREVGVUVMX0xJTUlUX0RSSU5LLFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIFNldCggUF9ERUZVRUxfVElNRV9GT09ELFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIFNldCggUF9ERUZVRUxfVElNRV9EUklOSyxQUk9URUNURUQsRl9NT0RFX0FTKTsKKyAgICBTZXQoIFBfREVGVUVMX0FNT1VOVF9GT09ELFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIFNldCggUF9ERUZVRUxfQU1PVU5UX0RSSU5LLFBST1RFQ1RFRCxGX01PREVfQVMpOworICAgIG9mZmVySG9vayhIX0hPT0tfSFAsMSk7CisgICAgb2ZmZXJIb29rKEhfSE9PS19TUCwxKTsKKyAgICAvLyBQX1RJTUlOR19NQVAgYXVmcmFldW1lbiwgYWJlciB6ZWl0dmVyem9lZ2VydCwgd2VpbCBqZXR6dCBkaWUgRGF0ZW4gbm9jaAorICAgIC8vIG5pY2h0IGF1cyBkZW0gU2F2ZWZpbGUgZ2VsYWRlbiB3dXJkZW4uCisgICAgY2FsbF9vdXQoIydleHBpcmVfdGltaW5nX21hcCwgNCk7Cit9CisKKy8vIGNhbGxlZCBmcm9tIGJhc2UuYyBpbiBSZWNvbm5lY3QoKQorcHJvdGVjdGVkIHZvaWQgcmVjb25uZWN0KCkgeworICBleHBpcmVfdGltaW5nX21hcCgpOworfQorCitzdGF0aWMgaW50IF9zZXRfcGxheWVya2lsbHMoIGludCB2YWwgKQoreworICAgIHN0cmluZyB0bXA7CisgICAgaW50IHBsYXllcmtpbGxzOworCisgICAgLy8gaXN0IGRlciBTZXR6ZXIgaW4gZWluZXIgQXJlbmEvU2NoYXR0ZW53ZWx0LiBEYW5uIG5pY2h0LiAoSmEsIEJ1ZyBpc3QsCisgICAgLy8gZGFzcyBFTXMgYXVzIFNjaGF0dGVud2VsdC9BcmVuYSBoZXJhdXMgYXVjaCBkYXMgUEstRmxhZyBuaWNodAorICAgIC8vIHp1cnVlY2tzZXR6ZW4ga29lbm5lbi4pCisgICAgaWYgKCBwcmV2aW91c19vYmplY3QoMSkgJiYgZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KDEpKSAmJgorICAgICAgICAgKHRtcCA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgxKSkpKSAmJgorICAgICAgICAgQ2hlY2tBcmVuYUZpZ2h0KHByZXZpb3VzX29iamVjdCgxKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHRtcCA9IHNwcmludGYoICIlTzogJXMgJU8gJXMiLAorICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgxKSB8fCB0aGlzX2ludGVyYWN0aXZlKCkgfHwgdGhpc19wbGF5ZXIoKSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQoTUUpLCB2YWwsIGR0aW1lKHRpbWUoKSkgKTsKKworICAgIHBsYXllcmtpbGxzID0gUXVlcnkoUF9LSUxMUyk7CisKKyAgICBpZiggaW50cCh2YWwpICYmIHZhbCA+PSAwICkKKyAgICAgICAgaWYoIHByZXZpb3VzX29iamVjdCgxKSAmJiBJU19BUkNIKGdldHVpZChwcmV2aW91c19vYmplY3QoMSkpKSAmJgorICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpICYmIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSApCisgICAgICAgICAgICBwbGF5ZXJraWxscyA9IHZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdG1wICs9ICIgSUxMRUdBTCEiOworICAgIGVsc2UKKyAgICAgICAgcGxheWVya2lsbHMrKzsKKworICAgIGlmICggIXByZXZpb3VzX29iamVjdCgxKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoMSkpIHx8CisgICAgICAgICBJU19MRUFSTkVSKHByZXZpb3VzX29iamVjdCgxKSkgKQorICAgICAgICBsb2dfZmlsZSggIlNFVF9LSUxMUyIsIHRtcCArICJcbiIgKTsKKworICAgIHJldHVybiBTZXQoIFBfS0lMTFMsIHBsYXllcmtpbGxzICk7Cit9CisKKworcHVibGljIGludCBkZWF0aF9zdWZmZXJpbmcoKQoreworICAgIGlmICggc3VmZmVyX3RpbWUgPD0gMCApCisgICAgcmV0dXJuIHN1ZmZlcl90aW1lID0gMDsKKworICAgIHJldHVybiAxICsgKDEwICogc3VmZmVyX3RpbWUpIC8gU1VGRkVSX1RJTUU7Cit9CisKKworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpCit7CisgICAgbWFwcGluZyBkaSwgbW9kczsKKworICAgICsrYWdlOyAvLyBlcnN0bWFsIGFsdGVybiA7LSkKKworICAgIDo6aGVhcnRfYmVhdCgpOworCisgICAgaWYgKCBhZ2UgPiB0aW1lX3RvX3NhdmUgKXsKKyAgICAgICAgc2F2ZV9tZSgxKTsKKyAgICAgICAgdGltZV90b19zYXZlID0gYWdlICsgNTAwOworICAgIH0KKworICAgIC8vIGFscyBnZWlzdCBoYXQgbWFuIG1pdCBkZW4gbWVpc3RlbiB3ZWx0bGljaGVuIERpbmdlbiBuaWNodCBhbGx6dXZpZWwgenUKKyAgICAvLyB0dW4uCisgICAgaWYgKCBRdWVyeVByb3AoUF9HSE9TVCkgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIHN1ZmZlcl90aW1lID4gMCApCisgICAgICAgIHN1ZmZlcl90aW1lLS07CisKKyAgICAvLyBUb2Rlc2ZvbGdlbiBudXIgYWxsZSAyMCBTZWt1bmRlbiAoMTAgSEIpIGNoZWNrZW4uCisgICAgLy8gRGFzIGlzdCBpbW1lciBub2NoIG9mdCBnZW51ZyB1bmQgc3BhcnQgUmVjaGVuemVpdC4KKyAgICBpZiAoIChhZ2UgJSAxMCkgfHwgIW1hcHBpbmdwKGRpID0gUXVlcnlQcm9wKFBfREVBVEhfSU5GTykpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgbW9kcyA9IFF1ZXJ5UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIpWyIjZGVhdGgiXTsKKyAgICBpZiAoIW1hcHBpbmdwKG1vZHMpKSByZXR1cm47CisKKyAgICBpZiAoIG1vZHNbQV9TVFJdICYmIC0tZGlbQV9TVFJdIDw9IDApIHsKKyAgICAgICAgLy8gZWluZW4gQXR0cmlidXRzcHVua3QgcmVnZW5lcmllcmVuCisgICAgICAgIGlmICggbW9kc1tBX1NUUl0gPCAtMSApIHsKKyAgICAgICAgICAgIG1vZHNbQV9TVFJdKys7CisgICAgICAgICAgICBkaVtBX1NUUl0gPSAoMTEwICsgNSAqIChkaVtBX1NUUiwgMV0gKyBtb2RzW0FfU1RSXSkpIC8gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9TVFIgKTsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBkaSwgQV9TVFIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggbW9kc1tBX0NPTl0gJiYgLS1kaVtBX0NPTl0gPD0gMCkgeworICAgICAgICAvLyBlaW5lbiBBdHRyaWJ1dHNwdW5rdCByZWdlbmVyaWVyZW4KKyAgICAgICAgaWYgKCBtb2RzW0FfQ09OXSA8IC0xICl7CisgICAgICAgICAgICBtb2RzW0FfQ09OXSsrOworICAgICAgICAgICAgZGlbQV9DT05dID0gKDExMCArIDUgKiAoZGlbQV9DT04sIDFdICsgbW9kc1tBX0NPTl0pKSAvIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9kZWxldGUoIG1vZHMsIEFfQ09OICk7CisgICAgICAgICAgICBtX2RlbGV0ZSggZGksIEFfQ09OICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIG1vZHNbQV9ERVhdICYmIC0tZGlbQV9ERVhdIDw9IDApIHsKKyAgICAgICAgLy8gZWluZW4gQXR0cmlidXRzcHVua3QgcmVnZW5lcmllcmVuCisgICAgICAgIGlmICggbW9kc1tBX0RFWF0gPCAtMSApeworICAgICAgICAgICAgbW9kc1tBX0RFWF0rKzsKKyAgICAgICAgICAgIGRpW0FfREVYXSA9ICgxMTAgKyA1ICogKGRpW0FfREVYLCAxXSArIG1vZHNbQV9ERVhdKSkgLyAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX0RFWCApOworICAgICAgICAgICAgbV9kZWxldGUoIGRpLCBBX0RFWCApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCBtb2RzW0FfSU5UXSAmJiAtLWRpW0FfSU5UXSA8PSAwKSB7CisgICAgICAgIC8vIGVpbmVuIEF0dHJpYnV0c3B1bmt0IHJlZ2VuZXJpZXJlbgorICAgICAgICBpZiAoIG1vZHNbQV9JTlRdIDwgLTEgKXsKKyAgICAgICAgICAgIG1vZHNbQV9JTlRdKys7CisgICAgICAgICAgICBkaVtBX0lOVF0gPSAoMTEwICsgNSAqIChkaVtBX0lOVCwgMV0gKyBtb2RzW0FfSU5UXSkpIC8gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9JTlQgKTsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBkaSwgQV9JTlQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggc2l6ZW9mKGRpKSAmJiBzaXplb2YobW9kcykpCisgICAgICAgIFNldFByb3AoIFBfREVBVEhfSU5GTywgZGkgKTsKKyAgICBlbHNlCisgICAgICAgIFNldFByb3AoIFBfREVBVEhfSU5GTywgMCApOworCisgICAgU2V0UHJvcCggUF9BVFRSSUJVVEVTX01PRElGSUVSLCAoeyAiI2RlYXRoIiwgbW9kcyB9KSApOworfQorCisKK3B1YmxpYyB2b2lkIGZvcmNlX3NhdmUoKSB7CisgICAgdGltZV90b19zYXZlID0gMDsKK30KKworCitub21hc2sgcHVibGljIGludCBkb19kYW1hZ2UoIGludCBkYW0sIG9iamVjdCBlbmVteSApCit7CisgICAgaW50IGhpdF9wb2ludDsKKworICAgIGlmKCBRdWVyeVByb3AoUF9HSE9TVCkgfHwgZGFtIDw9IDAgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGhpdF9wb2ludCA9IFF1ZXJ5UHJvcChQX0hQKTsKKworICAgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgJiYgZGFtID49IGhpdF9wb2ludCAmJiBJU19MRUFSTklORyhNRSkgKXsKKyAgICAgICAgdGVsbF9vYmplY3QoIE1FLCAiRGVpbmUgbWFnaXNjaGVuIEtyYWVmdGUgdmVyaGluZGVybiBEZWluZW4gVG9kLlxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoICFvYmplY3RwKGVuZW15KSApCisgICAgICAgIGVuZW15ID0gcHJldmlvdXNfb2JqZWN0KCkgfHwgdGhpc19pbnRlcmFjdGl2ZSgpIHx8IHRoaXNfcGxheWVyKCk7CisKKyAgICBoaXRfcG9pbnQgLT0gZGFtOworCisgICAgaWYoIGhpdF9wb2ludCA8IDAgKXsKKyAgICAgICAgaWYgKCAhaW50ZXJhY3RpdmUoTUUpICkKKyAgICAgICAgICAgIC8vIE5ldHp0b3RlIHN0ZXJiZW4gbmljaHQKKyAgICAgICAgICAgIGhpdF9wb2ludCA9IDEwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggb2JqZWN0cChlbmVteSkgJiYgaW50ZXJhY3RpdmUoIGVuZW15ICkgJiYgZW5lbXkgIT0gTUUgJiYKKyAgICAgICAgICAgICAgICAgIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpICYmICFJU19XSVpBUkQoTUUpICYmCisgICAgICAgICAgICAgICAgICFDaGVja0FyZW5hRmlnaHQoTUUpICkgeworICAgICAgICAgICAgICAgIGlmICggUXVlcnlQbEF0dGFja2VkKGVuZW15KSApCisgICAgICAgICAgICAgICAgICAgIGhpdF9wb2ludCA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhpdF9wb2ludCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVuZW15LT5TZXRQcm9wKCBQX0tJTExTLCAtMSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxvZ19maWxlKCAiS0lMTEVSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICVzKCVkLyVkKSB0b2V0ZXRlICVzKCVkLyVkKSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR1aWQoZW5lbXkpLCBxdWVyeV93aXpfbGV2ZWwoZW5lbXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBlbmVteS0+UXVlcnlQcm9wKFBfTEVWRUwpLCBnZXR1aWQoTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV93aXpfbGV2ZWwoTUUpLCBRdWVyeVByb3AoUF9MRVZFTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoaXRfcG9pbnQgPyAiIE5PVFdFSFI9PktFSU4gUEsiIDogIiIpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAKKyAgICAgICAgICAgICAgICBzdHJpbmcga2lsbGVybmFtZTsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0cChlbmVteSkpCisgICAgICAgICAgICAgICAgICAgIGtpbGxlcm5hbWU9c3ByaW50ZigiJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBCTFVFX05BTUUoZW5lbXkpLCBSRUFMX1VJRChlbmVteSkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAga2lsbGVybmFtZT0iPz8/ICg/Pz8pIjsgCisKKyAgICAgICAgICAgICAgICBpZiAoICFRdWVyeVByb3AoUF9URVNUUExBWUVSKSApCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9raWxsX2xvZ19lbnRyeShraWxsZXJuYW1lLCBlbmVteSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGVuZW15ICkKKyAgICAgICAgICAgICAgICBlbmVteS0+U3RvcEh1bnRGb3IoIE1FLCAxICk7CisKKyAgICAgICAgICAgIG1hcF9vYmplY3RzKCBRdWVyeUVuZW1pZXMoKVswXSwgIlN0b3BIdW50Rm9yIiwgTUUsIDEgKTsKKyAgICAgICAgICAgIFN0b3BIdW50aW5nTW9kZSgxKTsKKworICAgICAgICAgICAgU2V0KCBQX0tJTExFUiwgZW5lbXkgKTsKKyAgICAgICAgICAgIGRpZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgU2V0UHJvcCggUF9IUCwgaGl0X3BvaW50ICk7CisgICAgcmV0dXJuIGRhbTsKK30KKworCisvLyBMb2VzY2h0IGltIHN0ZXJiZW5kZW4gU3BpZWxlciBkaWUgJ2tvZXJwZXJhYmhhZW5naWdlbicgUHJvcGVydGllcworcHJpdmF0ZSB2b2lkIHJlc2V0X215X3Byb3BlcnRpZXMoKQoreworICAvLyBMb2VzY2hlbiBkZXIgUHJvcGVydGllcworICBpZiAoIFF1ZXJ5UHJvcChQX1BPSVNPTikgKQorICB7CisgICAgIC8vIERvbid0IGRpZSB0d2ljZSAnY2F1c2Ugb2YgdGhlIHNhbWUgcG9pc29uCisgICAgIFNldCggUF9QT0lTT04sIDAsIEZfU0VUX01FVEhPRCApOworICAgICBTZXQoIFBfUE9JU09OLCAwLCBGX1FVRVJZX01FVEhPRCApOworICAgICBTZXRQcm9wKCBQX1BPSVNPTiwgMCApOworICB9CisKKyAgU2V0KCBQX0ZST0csIDAsIEZfUVVFUllfTUVUSE9EICk7IAorICBTZXQoIFBfRlJPRywgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoIFBfRlJPRywgMCApOyAvLyBEYW1pdCBkaWUgQXR0cmlidXRlIGF1Y2ggc3RpbW1lbi4KKyAgU2V0KCBQX0FMQ09IT0wsIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9BTENPSE9MLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcChQX0FMQ09IT0wsIDAgKTsKKyAgU2V0KCBQX0RSSU5LLCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfRFJJTkssIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfRFJJTkssIDAgKTsKKyAgU2V0KCBQX0ZPT0QsIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9GT09ELCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcChQX0ZPT0QsIDAgKTsKKyAgU2V0KCBQX0JMSU5ELCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfQkxJTkQsIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfQkxJTkQsIDAgKTsKKyAgU2V0KCBQX0RFQUYsIDAsIEZfUVVFUllfTUVUSE9EICk7CisgIFNldCggUF9ERUFGLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcChQX0RFQUYsIDAgKTsKKyAgU2V0KCBQX01BWF9IQU5EUywgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgU2V0KCBQX01BWF9IQU5EUywgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoIFBfTUFYX0hBTkRTLCAyICk7CisgIFNldCggUF9IQU5EU19VU0VEX0JZLCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfSEFORFNfVVNFRF9CWSwgMCwgRl9TRVRfTUVUSE9EICk7CisgIFNldFByb3AoIFBfSEFORFNfVVNFRF9CWSwgKHt9KSApOworICBTZXQoIFBfUEFSQSwgMCApOworICBTZXQoIFBfTk9fUkVHRU5FUkFUSU9OLCAwLCBGX1FVRVJZX01FVEhPRCApOworICBTZXQoIFBfTk9fUkVHRU5FUkFUSU9OLCAwLCBGX1NFVF9NRVRIT0QgKTsKKyAgU2V0UHJvcChQX05PX1JFR0VORVJBVElPTiwgMCApOworICBTZXQoIFBfVE1QX01PVkVfSE9PSywgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgU2V0KCBQX1RNUF9NT1ZFX0hPT0ssIDAsIEZfU0VUX01FVEhPRCApOworICBTZXRQcm9wKFBfVE1QX01PVkVfSE9PSywgMCApOworICBTZXQoIFBfTEFTVF9ERUFUSF9USU1FICwgdGltZSgpICk7CisgIC8vIGRhbWl0IGRlciBUZWRkeSBvLmFlLiBtaXRiZWtvbW10LCBkYXNzIG1hbiBqZXR6dCB0b3QgaXN0IF06LT4KKyAgU2V0UHJvcCggUF9IUCwgMCApOworICBTZXRQcm9wKCBQX1NQLCAwICk7Cit9CisKK3ZhcmFyZ3MgcHJvdGVjdGVkIGludCBzZWNvbmRfbGlmZSggb2JqZWN0IGNvcnBzZSApCit7CisgICAgaW50IGxvc3RfZXhwLCBsZXZlbDsKKyAgICAvLyBFcyBnaWJ0IEZ1bmt0aW9uZW4sIGRpZSBzb2xsdGUgbWFuIG5pY2h0IHBlciBIYW5kIGF1ZnJ1ZmVuIGR1ZXJmZW4gOy0pCisgICAgaWYgKCBleHRlcm5fY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICE9IE1FICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoTUUpICYmIElTX0xFQVJOSU5HKE1FKSApeworICAgICAgICB0ZWxsX29iamVjdCggTUUsICJTZWkgZnJvaCwgZGFzcyBEdSB1bnN0ZXJibGljaCBiaXN0LCBzb25zdCB3YWVyZSAiCisgICAgICAgICAgICAgICAgICAgICAiZXMgZWJlbiB6dSBFbmRlIGdld2VzZW4uXG4iICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggIUlTX1NFRVIoTUUpIHx8IChsZXZlbCA9IFF1ZXJ5UHJvcChQX0xFVkVMKSkgPCAyMCApCisgICAgICAgIGxvc3RfZXhwID0gUXVlcnlQcm9wKFBfWFApIC8gMzsKKyAgICBlbHNlCisgICAgICAgIGxvc3RfZXhwID0gUXVlcnlQcm9wKFBfWFApIC8gKGxldmVsIC0gMTcpOworCisgICAgQWRkRXhwKC1sb3N0X2V4cCk7CisKKworICAgIC8vIFRvZGVzZm9sZ2VuIHNldHplbi4uLi4KKyAgICAvL1NldFByb3AoIFBfREVBVEhfSU5GTywgMSk7CisgICAgaWYgKCAhSVNfTEVBUk5JTkcoTUUpICYmICFRdWVyeVByb3AoUF9URVNUUExBWUVSKSApIHsKKworICAgICAgICBtYXBwaW5nIGF0dHIgPSBRdWVyeVByb3AoUF9BVFRSSUJVVEVTKTsKKyAgICAgICAgbWFwcGluZyBtb2RzID0gUXVlcnlQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUilbIiNkZWF0aCJdIHx8IChbXSk7CisKKyAgICAgICAgLy8gQXR0cmlidXRlIGF1ZiA3NSUgdm9tIGFrdHVlbGxlbiBXZXJ0IHNlbmtlbgorICAgICAgICBtb2RzW0FfU1RSXSA9IC1hdHRyW0FfU1RSXSArICgzICogKGF0dHJbQV9TVFJdICsgbW9kc1tBX1NUUl0pIC8gNCk7CisgICAgICAgIG1vZHNbQV9DT05dID0gLWF0dHJbQV9DT05dICsgKDMgKiAoYXR0cltBX0NPTl0gKyBtb2RzW0FfQ09OXSkgLyA0KTsKKyAgICAgICAgbW9kc1tBX0RFWF0gPSAtYXR0cltBX0RFWF0gKyAoMyAqIChhdHRyW0FfREVYXSArIG1vZHNbQV9ERVhdKSAvIDQpOworICAgICAgICBtb2RzW0FfSU5UXSA9IC1hdHRyW0FfSU5UXSArICgzICogKGF0dHJbQV9JTlRdICsgbW9kc1tBX0lOVF0pIC8gNCk7CisKKyAgICAgICAgU2V0UHJvcCggUF9BVFRSSUJVVEVTX01PRElGSUVSLCAoeyAiI2RlYXRoIiwgbW9kcyB9KSApOworCisgICAgICAgIGludCBvZmZzID0gMjIwOyAgLy8gMjIwIGhlYXJ0X2JlYXRzID09IDdtaW4yMAorICAgICAgICAvLyBEaWUgMjIwIEhCIHNpbmQgZml4LCBkYXp1IGtvbW1lbiBub2NoIDUgSEIgcHJvIHJlYWxlbSAKKyAgICAgICAgLy8gQXR0cmlidXRzcHVua3QuIEdldGVpbHQgd2lyZCBkYXMgZ2FuemUgbm9jaCBkdXJjaCAxMCwgd2VpbCBpbSBIQgorICAgICAgICAvLyBudXIgYWxsZSAxMCBIQnMgZGllIFRGIGdlY2hlY2t0IHdlcmRlbi4gRGEgd2lyZCBkYW5uIGFsbGUgMTAgSEIgZWluCisgICAgICAgIC8vIFB1bmt0IGFiZ2V6b2dlbiB1bmQgd2VubiAwIGVycmVpY2h0IGlzdCwgd2lyZCBkYXMgQXR0cmlidXQgdW0gZWlucworICAgICAgICAvLyByZWdlbmVyaWVydC4KKyAgICAgICAgU2V0UHJvcCggUF9ERUFUSF9JTkZPLCAoWyAKKyAgICAgICAgICAgIEFfU1RSOiAob2ZmcyArIDUgKiAoYXR0cltBX1NUUl0gKyBtb2RzW0FfU1RSXSkpLzEwOyBhdHRyW0FfU1RSXSwKKyAgICAgICAgICAgIEFfQ09OOiAob2ZmcyArIDUgKiAoYXR0cltBX0NPTl0gKyBtb2RzW0FfQ09OXSkpLzEwOyBhdHRyW0FfQ09OXSwKKyAgICAgICAgICAgIEFfREVYOiAob2ZmcyArIDUgKiAoYXR0cltBX0RFWF0gKyBtb2RzW0FfREVYXSkpLzEwOyBhdHRyW0FfREVYXSwKKyAgICAgICAgICAgIEFfSU5UOiAob2ZmcyArIDUgKiAoYXR0cltBX0lOVF0gKyBtb2RzW0FfSU5UXSkpLzEwOyBhdHRyW0FfSU5UXQorICAgICAgICAgICAgICAgICAgXSkgKTsKKworICAgICAgICAvLyBkaWUgc3VmZmVyX3RpbWUgd2lyZCB2aWEgZGVhdGhfc3VmZmVyaW5nKCkgdm9uCisgICAgICAgIC8vIFF1ZXJ5U2tpbGxBdHRyaWJ1dGUoKSBhYmdlZnJhZ3QgdW5kIGdlaHQgZGFubiBhbHMgTWFsdXMgaW4KKyAgICAgICAgLy8gU0FfUVVBTElUWSBtaXQgZWluLgorICAgICAgICBpZiAoIHN1ZmZlcl90aW1lIDw9IDIqU1VGRkVSX1RJTUUgKQorICAgICAgICAgICAgc3VmZmVyX3RpbWUgKz0gU1VGRkVSX1RJTUUgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdWZmZXJfdGltZSA9IDMgKiBTVUZGRVJfVElNRSAtIDE7CisgICAgfQorCisgICAgLy8gRGllIHZlcnNjaGllZGVuZW4gTm90aWZ5UGxheWVyRGVhdGgtRnVua3Rpb25lbiBrb2VubmVuIHUuVS4gc2NobGVjaHQKKyAgICAvLyBwcm9ncmFtbWllcnQgc2VpbiB1bmQgenV2aWVsIFJlY2hlbnplaXQgemllaGVuLiBEZXNoYWxiIHdlcmRlbiBzaWUgbWl0CisgICAgLy8gZWluZW0gTGltaXRzIHZvbiAxNTBrIGJ6dy4gODBrIGF1ZmdlcnVmZW4uIEF1c3NlcmRlbSB3ZXJkZW4gc2llIG51cgorICAgIC8vIGdlcnVmZW4sIHNvbGFuZ2Ugbm9jaCBtaW4uIDI1ayBUaWNrcyBkYSBzaW5kLgorICAgIGludCAqbGltaXRzPXF1ZXJ5X2xpbWl0cygpOworICAgIGxpbWl0c1tMSU1JVF9FVkFMXSA9IDE1MDAwMDsKKyAgICBsaW1pdHNbTElNSVRfQ09TVF0gPSBMSU1JVF9ERUZBVUxUOworCisgICAgbWl4ZWQga2lsbGVyID0gUXVlcnlQcm9wKFBfS0lMTEVSKTsKKyAgICBtaXhlZCBnaSA9IFF1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgICBpZiAoc3RyaW5ncChnaSkpCisgICAgICAgIGdpID0gZmluZF9vYmplY3QoIi9naWxkZW4vIitnaSk7CisgICAgLy8gamVkZXMgT2JqZWt0IG51ciBlaW5tYWwsIGFiZXIgbmljaHQgdmlhIG1faW5kaWNlcyhta21hcHBpbmcpKSB3ZWdlbgorICAgIC8vIFZlcmx1c3QgZGVyIFJlaWhlbmZvbGdlLgorICAgIG9iamVjdCAqaXRlbXMgPSAoe2tpbGxlcn0pOworICAgIGlmIChlbnZpcm9ubWVudCgpICE9IGtpbGxlcikKKyAgICAgICAgaXRlbXMgKz0gKHtlbnZpcm9ubWVudCgpfSk7CisgICAgaWYgKGdpICE9IGtpbGxlciAmJiBnaSAhPSBlbnZpcm9ubWVudCgpKQorICAgICAgICBpdGVtcyArPSAoe2dpfSk7CisgICAgZm9yZWFjaChvYmplY3QgaXRlbTogaXRlbXMpIHsKKyAgICAgICAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IGxpbWl0c1tMSU1JVF9FVkFMXSArIDIwMDAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIGZhbGxzIGVpbiBOUEQoKSBpbXBsaXppdCBhbmRlcmUgT2JqZWt0IHplcnN0b2VydCBoYXQuCisgICAgICAgIGlmIChvYmplY3RwKGl0ZW0pKSB7CisgICAgICAgICAgICBjYXRjaChsaW1pdGVkKCMnY2FsbF9vdGhlciwgbGltaXRzLCBpdGVtLCAiTm90aWZ5UGxheWVyRGVhdGgiLAorICAgICAgICAgICAgICAgICAgTUUsIGtpbGxlciwgbG9zdF9leHApO3B1Ymxpc2gpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGpldHp0IGRlbiBSZXN0LgorICAgIGxpbWl0c1tMSU1JVF9FVkFMXSA9IDgwMDAwOworICAgIGZvcmVhY2gob2JqZWN0IGl0ZW06IChlbnZpcm9ubWVudCgpID8gYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSA6ICh7fSkpCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlZXBfaW52ZW50b3J5KE1FKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAob2JqZWN0cChjb3Jwc2UpID8gZGVlcF9pbnZlbnRvcnkoY29ycHNlKSA6ICh7fSkpCisgICAgICAgICAgICAgICAgICAgICAgICAtIGl0ZW1zICkgeworICAgICAgICAvLyB3ZW5uIG5pY2h0IG1laHIgZ2VudWcgVGlja3MsIGhhYmVuIGRpZSByZXN0bGljaGVuIFBlY2ggZ2VoYWJ0LgorICAgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgbGltaXRzW0xJTUlUX0VWQUxdICsgMjAwMDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gTlBEKCkga29lbm5lbiBhbmRlcmUgT2JqZWt0IHplcnN0b2VyZW4uCisgICAgICAgIGlmIChvYmplY3RwKGl0ZW0pKSB7CisgICAgICAgICAgICBjYXRjaChsaW1pdGVkKCMnY2FsbF9vdGhlciwgbGltaXRzLCBpdGVtLCAiTm90aWZ5UGxheWVyRGVhdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUUsIGtpbGxlciwgbG9zdF9leHApO3B1Ymxpc2gpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJvcGVydGllcyB6dXJ1ZWNrc2V0emVuLCBzb2xsdGUgbmFjaCBkZW0gTm90aWZ5UGxheWVyRGVhdGgoKQorICAgIC8vIHBhc3NpZXJlbiwgd2VpbCBPYmpla3RlIHNpY2ggZGFyaW4gZXZ0bC4gZXJzdG1hbCBub2NoIGF1ZnJhZXVtZW4gdW5kCisgICAgLy8gcHJvcHMgbWFuaXB1bGllcmVuLgorICAgIHJlc2V0X215X3Byb3BlcnRpZXMoKTsKKyAgICBVcGRhdGVBdHRyaWJ1dGVzKCk7IC8vIEJlaW0gVG9kIHdlcmRlbiBEaW5nZSBlbnRmZXJudCwgQXR0cmlidXRlIHBydWVmZW4KKyAgICAKKyAgICAvLyBBdWNoIEJld2VndW5nIGVyc3QgbmFjaCBkZW4gTlBEKCksIGRhIGRpZXNlIGRlbiBTcGllbGVyIGJld2VnZW4KKyAgICAvLyBrb2VubnRlbiwgd2FzIGVpbmUgQmV3ZWd1bmcgYXVzIGRlbSBUb2Rlc3JhdW0gd2FlcmUsIHdlbm4gZGllIEJld2VndW5nCisgICAgLy8gdm9yIGRlbSBOUEQoKSBzdGF0dGZhZW5kZS4KKyAgICBTZXRQcm9wKCBQX0dIT1NULCAxICk7IC8vIG5hY2ggcmVzZXRfbXlfcHJvcGVydGllcygpICEKKyAgICBjbG9uZV9vYmplY3QoICJyb29tL2RlYXRoL2RlYXRoX21hcmsiICktPm1vdmUoIE1FLCBNX05PQ0hFQ0sgKTsgCisKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgaW50IEFkZEhwSG9vayggb2JqZWN0IG9iICkKK3sKKyAgICBvYmplY3QgKmhvb2tzOworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGhvb2tzID0gUXVlcnkoUF9IUF9IT09LUykpICl7CisgICAgICAgIFNldCggUF9IUF9IT09LUywgKHsgb2IgfSkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBtZW1iZXIoIGhvb2tzLCBvYiApID49IDAgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFNldCggUF9IUF9IT09LUywgKGhvb2tzIC0gKHswfSkpICsgKHsgb2IgfSkgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgaW50IFJlbW92ZUhwSG9vayggb2JqZWN0IG9iICkKK3sKKyAgICBvYmplY3QgKmhvb2tzOworCisgICAgaWYgKCAhcG9pbnRlcnAoaG9va3MgPSBRdWVyeShQX0hQX0hPT0tTKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFNldCggUF9IUF9IT09LUywgaG9va3MgLSAoeyBvYiwgMCB9KSApOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgX3F1ZXJ5X2FnZSgpIHsKKyAgICByZXR1cm4gU2V0KFBfQUdFLCBhZ2UsIEZfVkFMVUUpOworfQorCitzdGF0aWMgaW50IF9zZXRfaHAoIGludCBocCApCit7CisgICAgb2JqZWN0ICpob29rczsKKyAgICBpbnQgcmV0LCBpLCBvbGQ7CisKKyAgICBpZiAoIChvbGQgPSBRdWVyeShQX0hQLCBGX1ZBTFVFKSkgPT0gaHAgKQorICAgICAgICByZXR1cm4gb2xkOworCisgICAgcmV0ID0gbGlmZTo6X3NldF9ocChocCk7CisKKyAgICBpZiAoIHJldCA9PSBvbGQgKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gQ2FsbCBvbGQgaG9va3MgaW4gYWxsIG9iamVjdHMuLi4gZGVzdHJ1Y3RlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KKyAgICBpZiAocG9pbnRlcnAoaG9va3MgPSBRdWVyeShQX0hQX0hPT0tTKSkpCisgICAgICBjYWxsX290aGVyKGhvb2tzLCAiTm90aWZ5SHBDaGFuZ2UiKTsKKworICAgIC8vIENhbGwgbmV3IGhvb2tzLgorICAgIEhvb2tGbG93KEhfSE9PS19IUCxyZXQpOworCisgICAgLy8gUmVwb3J0LWF1c2dhYmUKKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9IUCwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBfc2V0X3NwKCBpbnQgc3AgKQoreworICAgIG9iamVjdCAqaG9va3M7CisgICAgaW50IHJldCwgaSwgb2xkOworCisgICAgaWYgKCAob2xkID0gUXVlcnkoUF9TUCxGX1ZBTFVFKSkgPT0gc3AgKQorICAgICAgICByZXR1cm4gb2xkOworCisgICAgcmV0ID0gbGlmZTo6X3NldF9zcChzcCk7CisKKyAgICBpZiAoIHJldCA9PSBvbGQgKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gQ2FsbCBvbGQgaG9va3MgaW4gYWxsIG9iamVjdHMuLi4gZGVzdHJ1Y3RlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KKyAgICBpZiAocG9pbnRlcnAoaG9va3MgPSBRdWVyeShQX0hQX0hPT0tTKSkpCisgICAgICBjYWxsX290aGVyKGhvb2tzLCAiTm90aWZ5SHBDaGFuZ2UiKTsKKworICAgIC8vIENhbGwgbmV3IGhvb2tzLgorICAgIEhvb2tGbG93KEhfSE9PS19TUCxyZXQpOworCisgICAgLy8gUmVwb3J0LWF1c2dhYmUKKyAgICBzdGF0dXNfcmVwb3J0KERPX1JFUE9SVF9TUCwgcmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3NldF9wb2lzb24oaW50IG4pCit7CisgIGludCBvbGQgPSBRdWVyeShQX1BPSVNPTiwgRl9WQUxVRSk7CisgIGlmIChvbGQgPT0gbiApCisgICAgICByZXR1cm4gb2xkOworICBuID0gbGlmZTo6X3NldF9wb2lzb24obik7CisgIGlmICggbiA9PSBvbGQgKQorICAgICAgcmV0dXJuIG47CisgIC8vIGdnZi4gU3RhdHVzcmVwb3J0IGF1c2dlYmVuCisgIGlmIChpbnRlcmFjdGl2ZShNRSkpCisgICAgc3RhdHVzX3JlcG9ydChET19SRVBPUlRfUE9JU09OLCBuKTsKKyAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgX3NldF9tYXhfcG9pc29uKGludCBuKQoreworICBpZiAobiA+PSAwKQorICB7CisgICAgU2V0KFBfTUFYX1BPSVNPTiwgbiwgRl9WQUxVRSk7CisgICAgaW50IG1heHA9UXVlcnlQcm9wKFBfTUFYX1BPSVNPTik7IC8vIGtvZW5udGUgbmUgUXVlcnltZXRob2RlIGRyYXVmIHNlaW4uLi4KKyAgICBpZiAoUXVlcnlQcm9wKFBfUE9JU09OKSA+IG1heHApCisgICAgICBTZXRQcm9wKFBfUE9JU09OLCBtYXhwKTsKKyAgfQorICBHTUNQX0NoYXIoIChbUF9NQVhfUE9JU09OOiBuXSkgKTsKKyAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgX3NldF9tYXhfaHAoIGludCBocCApCit7CisgIGlmIChocCA+PSAwKQorICB7CisgICAgU2V0KFBfTUFYX0hQLCBocCwgRl9WQUxVRSk7CisgICAgaW50IG1heGhwPVF1ZXJ5UHJvcChQX01BWF9IUCk7IC8vIGtvZW5udGUgbmUgUXVlcnltZXRob2RlIGRyYXVmIHNlaW4uLi4KKyAgICBpZiAoUXVlcnlQcm9wKFBfSFApID4gbWF4aHApCisgICAgICBTZXRQcm9wKFBfSFAsIG1heGhwKTsKKyAgfQorICBHTUNQX0NoYXIoIChbUF9NQVhfSFA6IGhwXSkgKTsKKyAgcmV0dXJuIGhwOworfQorCitzdGF0aWMgaW50IF9zZXRfbWF4X3NwKCBpbnQgc3AgKQoreworICBpZiAoc3AgPj0gMCkKKyAgeworICAgIFNldChQX01BWF9TUCwgc3AsIEZfVkFMVUUpOworICAgIGludCBtYXhzcD1RdWVyeVByb3AoUF9NQVhfU1ApOyAvLyBrb2VubnRlIG5lIFF1ZXJ5bWV0aG9kZSBkcmF1ZiBzZWluLi4uCisgICAgaWYgKFF1ZXJ5UHJvcChQX1NQKSA+IG1heHNwKQorICAgICAgU2V0UHJvcChQX1NQLCBtYXhzcCk7CisgIH0KKyAgR01DUF9DaGFyKCAoW1BfTUFYX1NQOiBzcF0pICk7CisgIHJldHVybiBzcDsKK30KKworc3RhdGljIGludCBfc2V0X2dob3N0KCBpbnQgZyApIHsKKyAgICBvYmplY3QgdGVhbTsKKworICAgIGlmKCFnICYmIHF1ZXJ5X2hjX3BsYXkoKT4xKQorICAgIHsKKyAgICAgIHdyaXRlKCJIQUhBSEEsIERVIEJJU1QgQVVGIEVXSUcgTUVJTi5cbiIpOworICAgICAgcmV0dXJuIFF1ZXJ5KFBfR0hPU1QpOworICAgIH0KKworICAgIGcgPSBTZXQoIFBfR0hPU1QsIGcgKTsKKworICAgIGlmICggZyAmJiBvYmplY3RwKHRlYW0gPSBRdWVyeShQX1RFQU0pKSApCisgICAgICAgIHRlYW0tPlJlbW92ZU1lbWJlcihNRSk7CisKKyAgICByZXR1cm4gZzsKK30KKworCitwdWJsaWMgaW50IHVuZGllKCkKK3sKKyAgICBtaXhlZCB4LCBkaTsKKyAgICBtYXBwaW5nIGF0dHIsIG1vZHM7CisKKyAgICBpZiAoICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwgIUlTX0FSQ0goZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwKKyAgICAgICAgIHByb2Nlc3NfY2FsbCgpICkKKyAgICAgICAgbG9nX2ZpbGUoICJVTkRJRSIsIHNwcmludGYoICIlcyAlTyAtPiAlT1xuIiwgZHRpbWUodGltZSgpKVs1Li4xNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIE1FICkgKTsKKworICAgIGlmICggeCA9IFF1ZXJ5KFBfREVBRFMpICkKKyAgICAgICAgeC0tOworCisgICAgU2V0KCBQX0RFQURTLCB4ICk7CisKKyAgICB4ID0gUXVlcnlQcm9wKFBfWFApOworCisgICAgaWYgKCAoZGkgPSBRdWVyeVByb3AoUF9MRVZFTCkpIDwgMjAgfHwgIUlTX1NFRVIoTUUpICkKKyAgICAgICAgeCA9IChpbnQpKHggKiAxLjUpOworICAgIGVsc2UKKyAgICAgICAgLy8gVW13ZWcgdWViZXIgZmxvYXQsIHdlaWwgYmVpIGhvaGVuIFhQK0xldmVsIHNvbnN0IDMyQml0IG5pY2h0CisgICAgICAgIC8vIG1laHIgYXVzcmVpY2hlbiAtPiBuZWdhdGl2ZSBYUAorICAgICAgICB4ID0gKGludCkgKCB4ICogKChmbG9hdCkgKGRpIC0gMTcpIC8gKGRpIC0gMTgpKSApOworCisgICAgU2V0KCBQX1hQLCB4ICk7CisKKyAgICBhdHRyID0gUXVlcnlQcm9wKFBfQVRUUklCVVRFUykgfHwgKFtdKTsKKyAgICBtb2RzID0gUXVlcnlQcm9wKFBfQVRUUklCVVRFU19NT0RJRklFUilbIiNkZWF0aCJdIHx8IChbXSk7CisKKyAgICBpZiAoIG1hcHBpbmdwKGRpID0gUXVlcnlQcm9wKFBfREVBVEhfSU5GTykpICl7CisgICAgICAgIC8vIEJlaW0gbmFlY2hzdGVuIGhlYXJ0X2JlYXQgY2hlY2tlbgorICAgICAgICAvLyBaZXNzdHJhOiBXaWVzbyBlaWdlbnRsaWNoPyBEaWUgTW9kaWZpZXIgd2VyZGVuIGRvY2ggZGlyZWt0IGhpZXIKKyAgICAgICAgLy8gZ2Vsb2VzY2h0LiBTbyBleHBpcmVkIG1hbiBhdWNoIGVpbmVuIFRlaWwgdm9uIG5pY2h0LXVuZGllLXRlbiBUb2RlbgorICAgICAgICAvLyB2b3J6ZWl0aWcuLi4/IE1hbCBhdXNrb21tZW50aWVydC4gMjkuMTAuMjAwNworICAgICAgICAvL2RpW0FfU1RSXSA9IDE7CisgICAgICAgIC8vZGlbQV9ERVhdID0gMTsKKyAgICAgICAgLy9kaVtBX0lOVF0gPSAxOworICAgICAgICAvL2RpW0FfQ09OXSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgIGRpID0gKFtdKTsKKyAgICAKKyAgICBtb2RzW0FfU1RSXSA9ICgoNCAqIChhdHRyW0FfU1RSXSArIG1vZHNbQV9TVFJdKSkgLyAzKSAtIGF0dHJbQV9TVFJdOworICAgIG1vZHNbQV9ERVhdID0gKCg0ICogKGF0dHJbQV9ERVhdICsgbW9kc1tBX0RFWF0pKSAvIDMpIC0gYXR0cltBX0RFWF07CisgICAgbW9kc1tBX0lOVF0gPSAoKDQgKiAoYXR0cltBX0lOVF0gKyBtb2RzW0FfSU5UXSkpIC8gMykgLSBhdHRyW0FfSU5UXTsKKyAgICBtb2RzW0FfQ09OXSA9ICgoNCAqIChhdHRyW0FfQ09OXSArIG1vZHNbQV9DT05dKSkgLyAzKSAtIGF0dHJbQV9DT05dOworCisgICAgaWYgKCBtb2RzW0FfU1RSXSA+PSAwICkgeworICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9TVFIgKTsKKyAgICAgICAgbV9kZWxldGUoIGRpLCBBX1NUUik7CisgICAgfQorICAgIGlmICggbW9kc1tBX0RFWF0gPj0gMCApIHsKKyAgICAgICAgbV9kZWxldGUoIG1vZHMsIEFfREVYICk7CisgICAgICAgIG1fZGVsZXRlKCBkaSwgQV9ERVgpOworICAgIH0KKyAgICBpZiAoIG1vZHNbQV9JTlRdID49IDAgKSB7CisgICAgICAgIG1fZGVsZXRlKCBtb2RzLCBBX0lOVCApOworICAgICAgICBtX2RlbGV0ZSggZGksIEFfSU5UKTsKKyAgICB9CisgICAgaWYgKCBtb2RzW0FfQ09OXSA+PSAwICkgeworICAgICAgICBtX2RlbGV0ZSggbW9kcywgQV9DT04gKTsKKyAgICAgICAgbV9kZWxldGUoIGRpLCBBX0NPTik7CisgICAgfQorCisgICAgU2V0UHJvcCggUF9BVFRSSUJVVEVTX01PRElGSUVSLCAoeyAiI2RlYXRoIiwgbW9kcyB9KSApOworICAgIGlmIChzaXplb2YoZGkpKQorICAgICAgU2V0UHJvcCggUF9ERUFUSF9JTkZPLCBkaSApOworICAgIGVsc2UKKyAgICAgIFNldFByb3AoIFBfREVBVEhfSU5GTywgMCk7CisKKyAgICBzdWZmZXJfdGltZSAtPSAoKFNVRkZFUl9USU1FKS0xKTsKKworICAgIGlmICggc3VmZmVyX3RpbWUgPCAwICkKKyAgICAgICAgc3VmZmVyX3RpbWUgPSAwOworCisgICAgU2V0KCBQX0dIT1NULCAwICk7CisgICAgcmV0dXJuIDE7Cit9CisKKwordmFyYXJncyBwdWJsaWMgdm9pZCBkaWUoIGludCBwb2lzb25kZWF0aCwgaW50IGV4dGVybikKK3sKKyAgICAvLyBsYWV1ZnQgc2Nob24gZWluIGRpZSgpPyBGZWhsZXIgYXVzbG9lc2VuLCBVcnNhY2hlIHJla3Vyc2l2ZXIgZGllKCkgc29sbAorICAgIC8vIGdlZnVuZGVuIHdlcmRlbi4gRElORk9fRVZBTF9OVU1CRVIgd2lyZCBpbiBqZWRlbSBUb3AtTGV2ZWwgQ2FsbCBpbQorICAgIC8vIGRyaXZlciBlcmhvZWh0LCBkLmguIGdsZWljaGUgWmFobCBzaWduYWxpc2llcnQgZWluIHJla3Vyc2l2ZXMgZGllKCkuCisKKyAgICBpZiAoZGllX2luX3Byb2dyZXNzID09IGRlYnVnX2luZm8oRElORk9fRVZBTF9OVU1CRVIpKQorICAgIHsKKyAgICAgIC8vIFRPRE86IGlzdCBkYXMgZGllX2luX3Byb2dyZXNzIGF1cyBkZW0gbGV0enRlbiBCYWNrZW5kLUN5Y2xlPworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICAgICJkaWUoKSBpbiAlTyBnZXJ1ZmVuLCBhYmVyIGRpZSgpIGxhZXVmdCBiZXJlaXRzIVxuIiwKKyAgICAgICAgICAgIHRoaXNfb2JqZWN0KCkpKTsKKyAgICB9CisgICAgZGllX2luX3Byb2dyZXNzID0gZGVidWdfaW5mbyhESU5GT19FVkFMX05VTUJFUik7CisgICAgCisgICAgLy8gRnVlciBIQy1QbGF5ZXIgaXN0cyBqZXR6dCBnZWxhdWZlbi4uLgorICAgIGlmKHF1ZXJ5X2hjX3BsYXkoKT09MSkKKyAgICB7CisgICAgICBzZXRfaGNfcGxheShjYXBpdGFsaXplKGdldGV1aWQoTUUpKSx0aW1lKCkpOworICAgICAgU2V0RGVmYXVsdEhvbWUoIi9yb29tL25pcnZhbmEiKTsKKyAgICAgIFNldERlZmF1bHRQcmF5Um9vbSgiL3Jvb20vbmlydmFuYSIpOworICAgICAgU2V0UHJvcChQX1NUQVJUX0hPTUUsIi9yb29tL25pcnZhbmEiKTsKKyAgICAgIGxvZ19maWxlKCJIQ0RFQUQiLGR0aW1lKHRpbWUoKSkrIiAiK2NhcGl0YWxpemUoZ2V0ZXVpZChNRSkpCisgICAgICAgICAgKyIgZ2VodCBpbiBkYXMgTmlydmFuYSBlaW4hXG4iKTsKKyAgICB9CisKKyAgICAvLyBXZW5uIGRhcyBkaWUoKSBkaXJla3Qgdm9uIGF1c3NlbiBnZXJ1ZmVuIHd1cmRlLCBtdXNzIFBfS0lMTEVSIGhpZXIKKyAgICAvLyBnZXNwZWljaGVydCB3ZXJkZW4uCisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIFNldFByb3AoUF9LSUxMRVIsIHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIC8vIFNpY2hlcm4gZGVyIHp1IGxvZXNjaGVuZGVuIFByb3BlcnRpZXMuIERpZXNlIFByb3BzIHdlcmRlbiBpbSBWZXJsYXVmIGRlcworICAgIC8vIFRvZGVzIHp1cnVlY2tnZXNldHp0LiBFaW5pZ2UgTWFnaWVyIHdvbGxlbiBkaWVzZSBEYXRlbiBhYmVyIHNwYWV0ZXIKKyAgICAvLyBub2NoIGhhYmVuIHVuZCBmcmFnZW4gdGVpbHdlaXNlIFBfTEFTVF9ERUFUSF9QUk9QUyBpbQorICAgIC8vIE5vdGlmeVBsYXllckRlYXRoKCkgYWIuIERhaGVyIHdpcmQgZGVyIEtyYW0gamV0enQgaGllciBzY2hvbm1hbAorICAgIC8vIGdlc2ljaGVydC4KKyAgICAvLyBCVFc6IFByb3BzIG1pdCBNYXBwaW5ncy9BcnJheXMgc29sbHRlbiBrb3BpZXJ0IHdlcmRlbi4KKyAgICBTZXRQcm9wKFBfTEFTVF9ERUFUSF9QUk9QUywgKFsKKyAgICAgIFBfUE9JU09OICAgICAgICAgIDogUXVlcnlQcm9wKFBfUE9JU09OKSwKKyAgICAgIFBfRlJPRyAgICAgICAgICAgIDogUXVlcnlQcm9wKFBfRlJPRyksCisgICAgICBQX0FMQ09IT0wgICAgICAgICA6IFF1ZXJ5UHJvcChQX0FMQ09IT0wpLAorICAgICAgUF9EUklOSyAgICAgICAgICAgOiBRdWVyeVByb3AoUF9EUklOSyksCisgICAgICBQX0ZPT0QgICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX0ZPT0QpLAorICAgICAgUF9CTElORCAgICAgICAgICAgOiBRdWVyeVByb3AoUF9CTElORCksCisgICAgICBQX0RFQUYgICAgICAgICAgICA6IFF1ZXJ5UHJvcChQX0RFQUYpLAorICAgICAgUF9NQVhfSEFORFMgICAgICAgOiBRdWVyeVByb3AoUF9NQVhfSEFORFMpLAorICAgICAgUF9QQVJBICAgICAgICAgICAgOiBRdWVyeVByb3AoUF9QQVJBKSwKKyAgICAgIFBfTk9fUkVHRU5FUkFUSU9OIDogUXVlcnlQcm9wKFBfTk9fUkVHRU5FUkFUSU9OKSwKKyAgICAgIFBfSFAgICAgICAgICAgICAgIDogUXVlcnlQcm9wKFBfSFApLAorICAgICAgUF9TUCAgICAgICAgICAgICAgOiBRdWVyeVByb3AoUF9TUCksCisgICAgICBQX0xBU1RfREVBVEhfVElNRSA6IFF1ZXJ5UHJvcChQX0xBU1RfREVBVEhfVElNRSApCisgICAgXSkgKTsKKworICAgIC8vIGNhbGwgdGhlIGluaGVyaXRlZCBkaWUoKSB3aXRoIDEwIE1pbyBUaWNrcyB3aGljaCB3aWxsIGJlIGFjY291bnRlZCBhcyAxCisgICAgLy8gVGljay4uLiA7LSkKKyAgICBpbnQgKmxpbWl0cyA9IHF1ZXJ5X2xpbWl0cygpOworICAgIGxpbWl0c1tMSU1JVF9FVkFMXSA9PSAxMDAwMDAwMDsKKyAgICBsaW1pdHNbTElNSVRfQ09TVF0gPT0gTElNSVRfVU5MSU1JVEVEOworICAgIGxpbWl0ZWQoIyc6OmRpZSwgbGltaXRzLCBwb2lzb25kZWF0aCwgKGV4dGVybl9jYWxsKCkgPyAxIDogMCkpOyAKKworICAgIC8vIG5hY2ggZGVtIFRvZCBzb2xsdGUgbWFuIGF1Y2gga2VpbmUgTFAgbWVociBoYWJlbi4KKyAgICBTZXRQcm9wKFBfSFAsIDApOworCisgICAgLy8gbmFlY2hzdGVyIFRvZCBrYW5uIGtvbW1lbi4gRGVrcmVtZW50aWVydW5nLCBkYSAwIGVpbiBndWVsdGlnZXIgV2VydAorICAgIC8vIGZ1ZXIgRElORk9fRVZBTF9OVU1CRVIgd2FlcmUuIGFicygpLCB1bSBuaWNodCAgLV9fSU5UX01BWF9fIHp1CisgICAgLy8gZGVrcmVtZW50aWVyZW4uCisgICAgZGllX2luX3Byb2dyZXNzID0gYWJzKGRpZV9pbl9wcm9ncmVzcykgLSAxOworfQorCitpbnQgZGVmdWVsX2Zvb2QoKQoreworICAgIGludCByZXQ7CisgICAgb2JqZWN0IHByZXY7CisgICAgCisgICAgcmV0PTo6ZGVmdWVsX2Zvb2QoKTsKKyAgICBwcmV2PXByZXZpb3VzX29iamVjdCgpOworICAgIGlmKCFwcmV2IHx8ICFvYmplY3RwKHByZXYpKQorICAgIHsKKyAgICAgICAgcHJldj10aGlzX29iamVjdCgpOworICAgIH0KKyAgICAKKyAgICBpZihyZXQ8PTApCisgICAgeworICAgICAgICAgICAgY2FsbF9vdGhlcihGVUVMU1RBVCwiYWRkRGVmdWVsU3RhdEVudHJ5IixwcmV2LHRoaXNfb2JqZWN0KCksMCwxLDAsMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICAgICBjYWxsX290aGVyKEZVRUxTVEFULCJhZGREZWZ1ZWxTdGF0RW50cnkiLHByZXYsdGhpc19vYmplY3QoKSwwLDAscmV0LDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZGVmdWVsX2RyaW5rKCkKK3sKKyAgICBpbnQgcmV0OworICAgIG9iamVjdCBwcmV2OworICAgIAorICAgIHJldD06OmRlZnVlbF9kcmluaygpOworICAgIHByZXY9cHJldmlvdXNfb2JqZWN0KCk7CisgICAgaWYoIXByZXYgfHwgIW9iamVjdHAocHJldikpCisgICAgeworICAgICAgICBwcmV2PXRoaXNfb2JqZWN0KCk7CisgICAgfQorICAgIAorICAgIGlmKHJldDw9MCkKKyAgICB7CisgICAgICAgICAgICBjYWxsX290aGVyKEZVRUxTVEFULCJhZGREZWZ1ZWxTdGF0RW50cnkiLHByZXYsdGhpc19vYmplY3QoKSwwLDEsMCwwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgICAgIGNhbGxfb3RoZXIoRlVFTFNUQVQsImFkZERlZnVlbFN0YXRFbnRyeSIscHJldix0aGlzX29iamVjdCgpLDAsMCxyZXQsMCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3B1YmxpYyB2b2lkIHNob3dfYWdlKCkKK3sgaW50IGksajsKKworICAgIHdyaXRlKCJBbHRlcjpcdCIpOworICAgIGkgPSBRdWVyeVByb3AoUF9BR0UpOworICAgIGlmICgoaj1pLzQzMjAwKSkKKyAgICB7CisgICAgICB3cml0ZShqICsgIiBUYWciKyhqPT0xPyIgIjoiZSAiKSk7CisgICAgICBpICU9IDQzMjAwOworICAgIH0KKyAgICBpZiAoKGo9aS8xODAwKSkKKyAgICB7CisgICAgICB3cml0ZShqICsgIiBTdHVuZGUiKyhqPT0xPyIgIjoibiAiKSk7CisgICAgICBpICU9IDE4MDA7CisgICAgfQorICAgIGlmICgoaj1pLzMwKSkKKyAgICB7CisgICAgICB3cml0ZShqICsgIiBNaW51dGUiKyhqPT0xPyIgIjoibiAiKSk7CisgICAgICBpICU9IDMwOworICAgIH0KKyAgICB3cml0ZShpKjIgKyAiIFNla3VuZGVuLlxuIik7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvbW9uZXloYW5kbGVyLmMgYi9zdGQvcGxheWVyL21vbmV5aGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTE3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL21vbmV5aGFuZGxlci5jCkBAIC0wLDAgKzEsNTYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvbW9uZXloYW5kbGVyLmMgLS0gbW9uZXkgaGFuZGxlciBmb3IgcGxheWVycworLy8gTnVyIG5vY2ggYXVzIEtvbXBhdGliaWxpdGFldHNncnVlbmRlbiB2b3JoYW5kZW4KKy8vCisvLyAkSWQ6IG1vbmV5aGFuZGxlci5jIDkwNTEgMjAxNS0wMS0xMSAyMDoyODowMFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zdGQvY29udGFpbmVyL21vbmV5aGFuZGxlciI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgPGNvbnRhaW5lci9tb25leWhhbmRsZXIuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW9uZXkuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworcHVibGljIGludCBBZGRNb25leSggaW50IGFtb3VudCApCit7CisgIG9iamVjdCBvYjsKKworICBpZiAoICFhbW91bnQgKQorICAgIHJldHVybiAxOworCisgIGludCByZXQgPSBtb25leWhhbmRsZXI6OkFkZE1vbmV5KGFtb3VudCk7CisKKyAgLy8gZ2dmLiBub2NoIGxvZ2dlbgorICBpZiAoIHJldCA9PSBNT1ZFX09LCisgICAgICAgJiYgb2JqZWN0cChvYiA9IGZpbmRfb2JqZWN0KCIvcC9kYWVtb24vbW9uZXlsb2ciKSkKKyAgICAgICAmJiBhbW91bnQgPiAwCisgICAgICAgLy8gZGllc2VzIG11c3MgbGVpZGVyIGRyaW5ibGVpYmVuLCB3ZWlsIHZpZWxlIG5pY2h0LVNwaWVsZXIgZGllc2VzCisgICAgICAgLy8gZXJiZW4KKyAgICAgICAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpCisgICAgICAgJiYgIUlTX1dJWkFSRCh0aGlzX29iamVjdCgpKQorICAgICAgICYmICFRdWVyeShQX1RFU1RQTEFZRVIpICkKKyAgICBvYi0+QWRkTW9uZXkoIHByZXZpb3VzX29iamVjdCgpLCBhbW91bnQgKTsKKworICByZXR1cm4gcmV0OworfQorCitwdWJsaWMgaW50IFF1ZXJ5TW9uZXkoKQoreworICBvYmplY3QgbW9uZXkgPSBwcmVzZW50KFNFSEVSS0FSVEVJRF9BS1RJViwgdGhpc19vYmplY3QoKSk7CisgIC8vIHp1c2FldHpsaWNoIHp1IGRlbiBhbmRlcmVuIEdlbGRxdWVsbGVuIGF1Y2ggbm9jaCBkaWUgU2VoZXJrYXJ0ZSBwcnVlZmVuLgorICBpZiAobW9uZXkpCisgICAgcmV0dXJuIG1vbmV5aGFuZGxlcjo6UXVlcnlNb25leSgpICsgbW9uZXktPlF1ZXJ5UHJvcChQX0FNT1VOVCk7CisKKyAgcmV0dXJuIG1vbmV5aGFuZGxlcjo6UXVlcnlNb25leSgpOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL21vdmluZy5jIGIvc3RkL3BsYXllci9tb3ZpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjYyZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9tb3ZpbmcuYwpAQCAtMCwwICsxLDE4MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9tb3ZpbmcuYyAtLSBwbGF5ZXIgbW92aW5nCisvLworLy8gJElkOiBtb3ZpbmcuYyA5NDM0IDIwMTYtMDEtMTIgMTI6MzQ6MDVaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICJzdGQvbGl2aW5nL21vdmluZyI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDxsaXZpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxwbGF5ZXIvdmlld2NtZC5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDxwYXRoZC5oPgorCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmNvbm5lY3Rpb25zOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICAgIFNldFByb3AoIFBfTVNHSU4sICAia29tbXQgYW4iICk7CisgICAgU2V0UHJvcCggUF9NU0dPVVQsICJnZWh0IiApOworICAgIFNldFByb3AoIFBfTU1TR0lOLCAidHJpdHQgYXVzIGVpbmVyIFNjaHdlZmVsd29sa2UiICk7CisgICAgU2V0UHJvcCggUF9NTVNHT1VULCAidmVyc2Nod2luZGV0IG1pdCBLbmFsbCB1bmQgU2Nod2VmZWxkdWZ0IiApOworICAgIFNldCggUF9NU0dJTiwgICBTQVZFLCBGX01PREUgKTsKKyAgICBTZXQoIFBfTVNHT1VULCAgU0FWRSwgRl9NT0RFICk7CisgICAgU2V0KCBQX01NU0dJTiwgIFNBVkUsIEZfTU9ERSApOworICAgIFNldCggUF9NTVNHT1VULCBTQVZFLCBGX01PREUgKTsKKyAgICBjb25uZWN0aW9ucyA9ICh7fSk7CisKKyAgICA6OmNyZWF0ZSgpOworfQorCisKK3N0YXRpYyBtaXhlZCBfdG9fcmVtb3ZlKCBvYmplY3Qgb2IgKQoreworICAgIHJldHVybiBvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopIHx8IG9iLT5RdWVyeVByb3AoUF9OT0RST1ApOworfQorCisKKy8vIGF1dG9sb2FkIGFuZCBub2Ryb3Agb2JqZWN0IG1heSBub3QgZmFsbCBpbnRvIHRoZSBlbnZpcm9ubWVudAorc3RhdGljIHZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgICAgb2JqZWN0KiBkZXN0X29iaiA9IGZpbHRlciggZGVlcF9pbnZlbnRvcnkoTUUpIC0gKHswfSksICJfdG9fcmVtb3ZlIiApOworICAgIGZpbHRlcl9vYmplY3RzKCBkZXN0X29iaiwgInJlbW92ZSIgKTsKKyAgICBmaWx0ZXIoIGRlc3Rfb2JqIC0gKHswfSksICMnZGVzdHJ1Y3QgKTsKKworICAgIGlmICggIVF1ZXJ5UHJvcChQX0lOVklTKSAmJiAhc2lsZW50ICkKKyAgICAgICAgY2F0Y2goIHNheSggbmFtZShXRVIsIDEpICsgIiB2ZXJsYWVzc3QgZGllc2UgV2VsdC5cbiIsIE1FICk7cHVibGlzaCApOworICAgIAorICAgIGlmICggTUUgJiYgIXNpbGVudCApCisgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIkJpcyBiYWxkIVxuIiApOworCisgICAgLy8gSW0gRmFsbGUgZGVzIFJlc2V0cyBpc3QgcHJldmlvdXNfb2JqZWN0KCkgPT0gTUUsIGFiZXIKKyAgICAvLyBwcmV2aW91c19vYmplY3QoMCkgPT0gMC4gQXVzc2VyZGVtIGlzdCBkZXIgQ2FsbGVyLVN0YWNrIGxlZXIuIEFsc28KKyAgICAvLyBzY2hhdWVuLCBvYiBlcyBlaW4gUE8gZ2lidCwgd2FzIG5pY2h0IGdsZWljaCBkZW0gT2JqZWt0IHNlbGJlciBpc3QsIFRJCisgICAgLy8gcHJ1ZWZlbiB1bmQgCisgICAgaWYgKCB0aGlzX2ludGVyYWN0aXZlKCkgIT0gTUUKKyAgICAgICAgJiYgb2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gTUUKKyAgICAgICAgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIKKyAgICAgICAgJiYgbWVtYmVyKG9iamVjdF9uYW1lKE1FKSwgJzonKSA+IC0xICkKKyAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyB2ZXJuaWNodGV0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksIE1FLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgLy8gTG9nb3V0LWV2ZW50IGF1c2xvZXNlbgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTE9HT1VULCAoWworCSAgICBFX09CSkVDVDogTUUsCisJICAgIEVfUExOQU1FOiBnZXR1aWQoTUUpLAorCSAgICBFX0VOVklST05NRU5UOiBlbnZpcm9ubWVudCgpIF0pICk7CisKKyAgICByZXR1cm4gOjpyZW1vdmUoKTsKK30KKworcHVibGljIHN0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgIAorICBpZiAocHJldmlvdXNfb2JqZWN0KCkgIT0gbWFzdGVyKCkKKyAgICAgIHx8IG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpID09IF9fRklMRV9fWy4uPDNdKQorICAgIHJldHVybiAwOworCisgIC8vIERhcyBaZXJzdG9lcmVuIHZvbiBTcGllbGVybiB3aXJkIGdnZi4gZ2Vsb2dndC4KKyAgaWYgKCBvYmplY3RwKGNhbGxlcikgJiYgY2FsbGVyICE9IHRoaXNfb2JqZWN0KCkKKyAgICAgICAmJiBnZXR1aWQoY2FsbGVyKSAhPSBST09USUQgKSB7CisgICAgICBsb2dfZmlsZSggIlBMQVlFUkRFU1QiLAorCQlzcHJpbnRmKCAiJXM6ICVPIFZFUk5JQ0hURVQgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisJCQkgZHRpbWUodGltZSgpKSwgdGhpc19vYmplY3QoKSwgY2FsbGVyLAorCQkJIHRoaXNfaW50ZXJhY3RpdmUoKSwgdGhpc19wbGF5ZXIoKSApICk7CisgIH0KKyAgLy8gZXJzdG1hbCBuaXggd2VpdGVyIHR1biwgZGVzdHJ1Y3QgZ2VzdGF0dGVuLgorICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIGludCBQcmV2ZW50TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworICBzdHJpbmcgaGNyb29tOworICBtaXhlZCByZXM7CisKKyAgLy8gZ2VzdG9yYmVuZSBIQy1TcGllbGVyIGR1ZXJmZW4gbmljaHQgbWVociBhdXMgZGVtIE5pcnZhbmEsIG5pY2h0IHVtZ2VoYmFyCisgIC8vIGR1cmNoIE1fTk9DSEVDSworICBpZiAoIGludGVyYWN0aXZlKE1FKSAmJiAocXVlcnlfaGNfcGxheSgpPjEpICkgeworICAgIGlmIChvYmplY3RwKGRlc3QpKQorICAgICAgaGNyb29tPW9iamVjdF9uYW1lKGRlc3QpOworICAgIGlmIChzaXplb2YoaGNyb29tKTw3IHx8IGhjcm9vbVswLi41XSE9Ii9yb29tLyIpIHsgCisgICAgICByZXR1cm4gTUVfQ0FOVF9CRV9JTlNFUlRFRDsKKyAgICB9CisgIH0KKworICAvLyBhbGxlIGFuZGVyZW4gUHJ1ZWZ1bmdlbiBzaW5kIG1pdCBNX05PQ0hFQ0sgZWdhbC4KKyAgaWYgKCAobWV0aG9kICYgTV9OT0NIRUNLKSApCisgICAgcmV0dXJuKDo6UHJldmVudE1vdmUoZGVzdCxvbGRlbnYsbWV0aG9kKSk7CisKKyAgLy8gU3BpZWxlciBkdWVyZmVuIGluIFJhZXVtZSBtaXQgZ2VzZXR6dGVtIFBfTk9fUExBWUVSUyBuaWNodCBoaW5laW4KKyAgaWYgKCBkZXN0LT5RdWVyeVByb3AoUF9OT19QTEFZRVJTKSAmJiBpbnRlcmFjdGl2ZShNRSkgJiYKKwkhKG1ldGhvZCAmIE1fTk9DSEVDSykgJiYKKyAgICAgICAgIUlTX0xFQVJORVIoTUUpICYmICghc3RyaW5ncChyZXMgPSBRdWVyeVByb3AoUF9URVNUUExBWUVSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUlTX0xFQVJORVIoIGxvd2VyX2Nhc2UocmVzKSApKSApeworICAgICAgdGVsbF9vYmplY3QoIE1FLCAiRGEgZGFyZnN0IER1IGFscyBTcGllbGVyIG5pY2h0IGhpbi5cbiIgKTsKKyAgICAgIHJldHVybiBNRV9OT1RfQUxMT1dFRDsKKyAgfQorCisgIHJldHVybiA6OlByZXZlbnRNb3ZlKGRlc3Qsb2xkZW52LG1ldGhvZCk7Cit9CisKKy8vIEZ1Y2suIEF1c25haG1zd2Vpc2Ugd2VnZW4gVkMgYnJhdWNoIGljaCBuZW4gYW5kZXJlcyBCTFVFX05BTUUKKyNkZWZpbmUgT0xEX0JMVUVfTkFNRShvYikgKGV4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF0pCisvLyBLcmFtcyBuYWNoIGRlbSBNb3ZlIG1hY2hlbiB1bmQgbmViZW5iZWkgenVtIFVlYmVyc2NocmVpYmVuLgorcHJvdGVjdGVkIHZvaWQgTm90aWZ5TW92ZShvYmplY3QgZGVzdCwgb2JqZWN0IG9sZGVudiwgaW50IG1ldGhvZCkgeworCisgIC8vIGVyc3RtYWwgZ2dmLiBSYXVtaW5oYWx0IGFuIFNwaWVsZXIgYXVzZ2ViZW4uCisgIGlmICggaW50ZXJhY3RpdmUoTUUpICYmICEobWV0aG9kICYgTV9OT19TSE9XKSApIHsKKyAgICAgIGlmICghQ2Fubm90U2VlKDEpKQorICAgICAgICAgIHRlbGxfb2JqZWN0KCBNRSwgIiIgKyBlbnZfZGVzY3IoMSkgKTsKKyAgICAgIGVsc2UgaWYgKCBRdWVyeVByb3AoUF9CUklFRikgPCAyICkKKyAgICAgICAgICB0ZWxsX29iamVjdCggTUUsICJGaW5zdGVybmlzLlxuIiApOworICB9CisKKyAgLy9kYW5uIGdlZXJidGVuIEtyYW0gbWFjaGVuCisgIDo6Tm90aWZ5TW92ZShkZXN0LG9sZGVudixtZXRob2QpOworCisgIC8vIFNjaGx1c3NlbmRsaWNoIG5vY2ggZnVlciBkZW4gUGF0aEQgYmV3ZWd1bmcgcHJvdG9rb2xsaWVyZW4uCisgIC8vIChkZXN0IG5pY2h0IGdlcHJ1ZWZ0LCBkYSBlaW4gU3BpZWxlciBuaWNodCBhdXNzZXJoYWxiIGplZGVzIEVudiBiZXdlZ3QKKyAgLy8gd2VyZGVuIGthbm4pCisgIGlmICggaW50ZXJhY3RpdmUoKSAmJiBlbnZpcm9ubWVudCgpICYmIHF1ZXJ5X3ZlcmIoKSAmJiBvYmplY3RwKG9sZGVudikpIHsKKyAgICAgIGNvbm5lY3Rpb25zICs9ICh7ICh7IE9MRF9CTFVFX05BTUUob2xkZW52KSwgT0xEX0JMVUVfTkFNRShkZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X3ZlcmIoKSArICIgIiArIChfdW5wYXJzZWRfYXJncygyKSB8fCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIGRlc3QtPlF1ZXJ5UHJvcChQX1BBUkEpIH0pIH0pOworCisgICAgICBpZiAoIHNpemVvZihjb25uZWN0aW9ucykgPiA1MAorICAgICAgICAgICAmJiBmaW5kX2NhbGxfb3V0KCJmbHVzaF9jb25uZWN0aW9ucyIpID09IC0xICkKKyAgICAgICAgICAgIGNhbGxfb3V0KCAiZmx1c2hfY29ubmVjdGlvbnMiLCAwLCBjb25uZWN0aW9ucyApOworICB9Cit9CisKK3B1YmxpYyB2b2lkIGZsdXNoX2Nvbm5lY3Rpb25zKCkgeworICAgIGNhdGNoKFBBVEhELT5hZGRfcGF0aHMoY29ubmVjdGlvbnMpO3B1Ymxpc2gpOworICAgIGNvbm5lY3Rpb25zID0gKHt9KTsKK30KKworLyoqKiBRdWVyeS1NZXRob2RlbiBmdWVyIEZyb2VzY2hlLi4uIDteKSAqKiovCitzdGF0aWMgc3RyaW5nIF9xdWVyeV9tc2dpbigpCit7CisgICAgcmV0dXJuIFF1ZXJ5UHJvcChQX0ZST0cpID8gImh1ZXBmdCBoZXJlaW4iIDogUXVlcnkoUF9NU0dJTik7Cit9CisKKworc3RhdGljIHN0cmluZyBfcXVlcnlfbXNnb3V0KCkKK3sKKyAgICByZXR1cm4gUXVlcnlQcm9wKFBfRlJPRykgPyAiaHVlcGZ0IiA6IFF1ZXJ5KFBfTVNHT1VUKTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvb2JqZWN0cy5jIGIvc3RkL3BsYXllci9vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2M2VhMwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvb2JqZWN0cy5jCkBAIC0wLDAgKzEsMjQzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL29iamVjdHMuYyAtLSBvYmplY3QgaGFuZGxpbmcgZm9yIHBsYXllcgorLy8KKy8vICRJZDogb2JqZWN0cy5jIDg2NzUgMjAxNC0wMi0xOCAyMDozOTo1NFogWmVzc3RyYSAkCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvZmlsZXN5cy5oIgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8dGhpbmcvbW92aW5nLmg+CisKK3N0YXRpYyBpbnQgdXBkYXRlX29iamVjdChzdHJpbmcgc3RyKSB7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHVwZF9maWxlOworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICBub3RpZnlfZmFpbCgiVXNhZ2U6IFVwZGF0ZSA8b2JqZWN0X3BhdGg+XG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgdXBkX2ZpbGUgPSBmaW5kX2ZpbGUoc3RyLCIuYyIpOworICBpZiAoIXVwZF9maWxlKSB1cGRfZmlsZT1maW5kX2ZpbGUoc3RyKTsKKyAgaWYgKCF1cGRfZmlsZSkgeworICAgIG5vdGlmeV9mYWlsKHN0cisiOiBObyBzdWNoIGZpbGUuXG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgb2IgPSBmaW5kX29iamVjdCh1cGRfZmlsZSk7CisgIGlmICghb2IpIHsKKyAgICBub3RpZnlfZmFpbCh1cGRfZmlsZSsiOiBObyBzdWNoIG9iamVjdC5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBkZXN0cnVjdChvYik7CisgIHdyaXRlKHVwZF9maWxlICsgIjogd2lsbCBiZSByZWxvYWRlZCBhdCBuZXh0IHJlZmVyZW5jZS5cbiIpOworICByZXR1cm4gMTsKK30KKworLyoKKyAqICJzb2Z0IiBtZWFucyB0aGF0IHRoZSBvYmplY3QgaXMgZ2l2ZW4gdGhlIGNoYW5jZSB0byBzZWxmLWRlc3RydWN0LCB0aHVzCisgKiBhbGxvd2luZyBpdCB0byBkbyBuZWNlc3NhcnkgY2xlYW51cCBsaWtlIHN1YnRyYWN0aW5nIGZyb20gdGhlIGNhcnJpZWQKKyAqIHdlaWdodCBvZiB0aGUgZW52aXJvbm1lbnQoKS4gV2UgY2FsbCByZW1vdmUoKSBpbiB0aGUgb2JqZWN0IHRvIGJlCisgKiBkZXN0cnVjdGVkLgorICovCitzdGF0aWMgaW50IHNvZnRfdXBkYXRlX29iamVjdChzdHJpbmcgc3RyKSAKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgdXBkX2ZpbGU7CisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogdXBkYXRlIDxvYmplY3RfcGF0aD5cbiIpOyByZXR1cm4gMDsKKyAgfQorICB1cGRfZmlsZSA9IGZpbmRfZmlsZShzdHIsIi5jIik7CisgIGlmICghdXBkX2ZpbGUpIHVwZF9maWxlPWZpbmRfZmlsZShzdHIpOworICBpZiAoIXVwZF9maWxlKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyKyI6IE5vIHN1Y2ggZmlsZS5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBvYiA9IGZpbmRfb2JqZWN0KHVwZF9maWxlKTsKKyAgaWYgKCFvYikgeworICAgIG5vdGlmeV9mYWlsKHVwZF9maWxlKyI6IE5vIHN1Y2ggb2JqZWN0LlxuIik7IHJldHVybiAwOworICB9CisgIGlmIChvYi0+cmVtb3ZlKCkgPT0gMCkgeworICAgIG5vdGlmeV9mYWlsKHVwZF9maWxlKyI6IGRvZXNuJ3Qgd2FudCB0byBiZSBkZXN0cnVjdGVkIVxuIik7IHJldHVybiAwOworICB9CisgIHdyaXRlKHVwZF9maWxlICsgIjogd2lsbCBiZSByZWxvYWRlZCBhdCBuZXh0IHJlZmVyZW5jZS5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IGNsb25lKHN0cmluZyBzdHIpIAoreworICBvYmplY3Qgb2I7CisgIHN0cmluZyBjbG9uZV9maWxlOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSl7CisgICAgbm90aWZ5X2ZhaWwoIlVzYWdlOiBjbG9uZSA8b2JqZWN0X3BhdGg+XG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgY2xvbmVfZmlsZSA9IGZpbmRfZmlsZShzdHIsIi5jIik7CisgIGlmICghY2xvbmVfZmlsZSkgY2xvbmVfZmlsZT1maW5kX2ZpbGUoc3RyKTsKKyAgaWYgKCFjbG9uZV9maWxlKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyKyI6IE5vIHN1Y2ggZmlsZS5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBpZiAoIShvYiA9IGNsb25lX29iamVjdChjbG9uZV9maWxlKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHN0cisiOiBGYWlsZWQgdG8gbG9hZC5cbiIpLCAwOworCisgIC8qIFNvbWUgb2JqZWN0cyBkZXN0cnVjdCB0aGVtc2VsdmVzIHJhdGhlciBmYXN0ICovCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKHN0cisiOiBEZXN0cnVjdGVkIHdoaWxzdCBjcmVhdGVkLlxuIiksIDA7CisgIAorICAvKiB0cnkgdG8gbW92ZSB0aGUgb2JqZWN0IHRvIG15IGVudmlyb25tZW50ICovCisgIGlmICgob2ItPm1vdmUodGhpc19vYmplY3QoKSxNX0dFVCk+MCkgfHwgCisgICAgICAob2ItPm1vdmUoZW52aXJvbm1lbnQoKSxNX05PQ0hFQ0spPjApKQorICB7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbChzdHIrIjogRGVzdHJ1Y3RlZCB3aGlsc3QgY3JlYXRlZC5cbiIpLCAwOworICAgIHdyaXRlKCJDbG9uZWQgIitvYmplY3RfbmFtZShvYikrIi5cbiIpOworICAgIHNheSh0aGlzX3BsYXllcigpLT5uYW1lKFdFUiwxKSArICIgIgorCQkrIHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcChQX0NMT05FX01TRykrIi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHNheSh0aGlzX3BsYXllcigpLT5uYW1lKFdFUiwxKSsiIG1hbHQgd2lsZGUgWmVpY2hlbiBpbiBkaWUgTHVmdCB1bmQgIgorICAgICAgKyJtdXJtZWx0IHZvciBzaWNoIGhpbiwgYWJlciBuaWNodHMgcGFzc2llcnQuLi5cbiIpOworICBkZXN0cnVjdChvYik7CisgIHdyaXRlKGNsb25lX2ZpbGUrIjogZmFpbGVkIHRvIG1vdmVcbiIpOworICByZXR1cm4gMTsKK30KKworLyoKKyAqICJzb2Z0IiBtZWFucyB0aGF0IHRoZSBvYmplY3QgaXMgZ2l2ZW4gdGhlIGNoYW5jZSB0byBzZWxmLWRlc3RydWN0LCB0aHVzCisgKiBhbGxvd2luZyBpdCB0byBkbyBuZWNlc3NhcnkgY2xlYW51cCBsaWtlIHN1YnRyYWN0aW5nIGZyb20gdGhlIGNhcnJpZWQKKyAqIHdlaWdodCBvZiB0aGUgZW52aXJvbm1lbnQoKS4gV2UgY2FsbCByZW1vdmUoKSBpbiB0aGUgb2JqZWN0IHRvIGJlCisgKiBkZXN0cnVjdGVkLgorICovCitzdGF0aWMgaW50IHNvZnRfZGVzdHJ1Y3Rfb2JqZWN0KHN0cmluZyBzdHIpCit7IAorICBvYmplY3Qgb2I7CisgIG9iamVjdCAqb2JzOworICBzdHJpbmcgc3RyV0VSLHN0cldFTjsKKworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogZGVzdHJ1Y3QgPG9iamVjdG5hbWU+XG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgc3RyV0VSID0gbG93ZXJfY2FzZShzdHIpOworICBvYnMgPSB0aGlzX3BsYXllcigpLT5maW5kX29icyhzdHJXRVIsUFVUX0dFVF9OT05FKTsKKyAgaWYgKCFvYnMgfHwgIXNpemVvZihvYnMpKSB7CisgICAgbm90aWZ5X2ZhaWwoIktlaW4gXCIiICsgc3RyICsgIlwiIGdlZnVuZGVuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb2I9b2JzWzBdOworICBzdHJXRVI9b2ItPm5hbWUoV0VSKTsKKyAgc3RyV0VOPW9iLT5uYW1lKFdFTik7CisgIGlmICghc3RyV0VSKQorICAgIHN0cldFUj0iamVtYW5kIjsKKyAgaWYgKCFzdHJXRU4pCisgICAgc3RyV0VOPSJqZW1hbmRlbiI7CisKKyAgaWYgKG9iLT5yZW1vdmUoKSA9PSAwKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyV0VSKyIgd2lsbCBuaWNodCAnZGVzdHJ1Y3RlZCcgd2VyZGVuIVxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoV0VSLDEpKyIgdmVyc3VjaHQgdmVyZ2VibGljaCwgIitzdHJXRU4rCisgICAgICAgICIgenUgYXRvbWlzaWVyZW4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzYXkoY2FwaXRhbGl6ZShzdHJXRVIpKyIgIit0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9ERVNUUlVDVF9NU0cpKyIuXG4iKTsKKyAgd3JpdGUoY2FwaXRhbGl6ZShzdHJXRVIpKyIgd2lyZCB2b24gZGlyIHplcnN0YWV1YnQuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVzdHJ1Y3Rfb2JqZWN0KHN0cmluZyBzdHIpCit7IAorICBvYmplY3Qgb2I7CisgIG9iamVjdCAqb2JzOworICBzdHJpbmcgc3RyV0VSLHN0cldFTjsKKworICBpZiAoIShzdHI9X3VucGFyc2VkX2FyZ3MoKSkpIHsKKyAgICBub3RpZnlfZmFpbCgiVXNhZ2U6IERlc3RydWN0IDxvYmplY3RuYW1lPlxuIik7IHJldHVybiAwOworICB9CisgIHN0cldFUiA9IGxvd2VyX2Nhc2Uoc3RyKTsKKyAgb2JzID0gdGhpc19wbGF5ZXIoKS0+ZmluZF9vYnMoc3RyV0VSLFBVVF9HRVRfTk9ORSk7CisgIGlmICghb2JzIHx8ICFzaXplb2Yob2JzKSkgeworICAgIG5vdGlmeV9mYWlsKCJLZWluIFwiIiArIHN0ciArICJcIiBnZWZ1bmRlbi5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBvYj1vYnNbMF07CisgIHN0cldFUj1vYi0+bmFtZShXRVIpOworICBzdHJXRU49b2ItPm5hbWUoV0VOKTsKKworICBzYXkoY2FwaXRhbGl6ZShzdHJXRVIpKyIgIit0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9ERVNUUlVDVF9NU0cpKyIuXG4iKTsKKyAgZGVzdHJ1Y3QoIG9iICk7CisgIHdyaXRlKGNhcGl0YWxpemUoc3RyV0VSKSsiIHdpcmQgdm9uIGRpciB6ZXJzdGFldWJ0LlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxvYWQoc3RyaW5nIHN0cikKK3sgCisgIG9iamVjdCBlbnY7CisgIHN0cmluZyBmaWxlOworICBzdHJpbmcgZXJyOworCisgIGlmICghKHN0cj1fdW5wYXJzZWRfYXJncygpKSkgeworICAgIG5vdGlmeV9mYWlsKCJVc2FnZTogbG9hZCA8b2JqZWN0X3BhdGg+XG4iKTsgcmV0dXJuIDA7CisgIH0KKyAgZmlsZSA9IGZpbmRfZmlsZShzdHIsIi5jIik7CisgIGlmICghZmlsZSkgZmlsZT1maW5kX2ZpbGUoc3RyKTsKKyAgaWYgKCFmaWxlKSB7CisgICAgbm90aWZ5X2ZhaWwoc3RyKyI6IE5vIHN1Y2ggZmlsZS5cbiIpOyByZXR1cm4gMDsKKyAgfQorICBpZiAoIGVyciA9IGNhdGNoKGxvYWRfb2JqZWN0KGZpbGUpO3B1Ymxpc2gpICkKKyAgICBwcmludGYoIkNhbm5vdCBsb2FkICVPLCBlcnIgPSAlT1xuIixmaWxlLGVycik7CisgIGVsc2Ugd3JpdGUoZmlsZSsiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXhlY19wbGF5ZXJvYihzdHJpbmcgbmFtZSkKK3sKKyAgb2JqZWN0IG9iLCAqaW52OworICBpbnQgaTsKKworICBpZiAoIUlTX0xPUkQodGhpc19vYmplY3QoKSkpIHJldHVybiAwOworICBpZiAodGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkpIHJldHVybiAwOworICBpZiAodGhpc19wbGF5ZXIoKSAhPSB0aGlzX29iamVjdCgpKSByZXR1cm4gMDsKKyAgaWYgKCEobmFtZT1fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIDA7CisgIG5hbWU9InNlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgobmFtZSxnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBpZiAoY2F0Y2gobG9hZF9vYmplY3QobmFtZSk7cHVibGlzaCkgKSAKKyAgeworICAgIHdyaXRlKCJCVUcgaW4gIituYW1lKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIG9iPWNsb25lX29iamVjdChuYW1lKTsKKyAgaWYgKCFvYikgcmV0dXJuIDA7CisgIGlmIChnZXR1aWQob2IpICE9IGdldHVpZCh0aGlzX29iamVjdCgpKSkKKyAgeworICAgIHdyaXRlKCJVSUQgY29uZmxpY3QuXG4iKTsKKyAgICBkZXN0cnVjdChvYik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbG9nX2ZpbGUoIkVYRUMiLCBnZXR1aWQodGhpc19vYmplY3QoKSkrIiAiK25hbWUrIiAiK2R0aW1lKHRpbWUoKSkpOworICBkaXNhYmxlX2NvbW1hbmRzKCk7CisgIGV4ZWMob2IsdGhpc19vYmplY3QoKSk7CisgIGlmIChpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSB8fCAhaW50ZXJhY3RpdmUob2IpKQorICB7CisgICAgZW5hYmxlX2NvbW1hbmRzKCk7CisgICAgd3JpdGUoIkZlaGxlciBpbiBleGVjXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpbnY9YWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKTsKKyAgb2ItPnN0YXJ0X3BsYXllcihjYXBpdGFsaXplKGdldHVpZCh0aGlzX29iamVjdCgpKSkpOworICByZW1vdmUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuICh7CisgICAgICAgICAgICh7ImNsb25lIiwiY2xvbmUiLDAsV0laQVJEX0xWTH0pLAorCSAgICh7ImRlc3RydWN0Iiwic29mdF9kZXN0cnVjdF9vYmplY3QiLDAsTEVBUk5FUl9MVkx9KSwKKwkgICAoeyJEZXN0cnVjdCIsImRlc3RydWN0X29iamVjdCIsMCxMRUFSTkVSX0xWTH0pLAorCSAgICh7ImxvYWQiLCJsb2FkIiwwLFdJWkFSRF9MVkx9KSwKKwkgICAoeyJ1cGRhdGUiLCJzb2Z0X3VwZGF0ZV9vYmplY3QiLDAsTEVBUk5FUl9MVkx9KSwKKwkgICAoeyJVcGRhdGUiLCJ1cGRhdGVfb2JqZWN0IiwwLExFQVJORVJfTFZMfSksCisJICAgKHsiZXhlYyIsImV4ZWNfcGxheWVyb2IiLDAsTEVBUk5FUl9MVkx9KQorCSB9KTsKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvcGtsb2cuYyBiL3N0ZC9wbGF5ZXIvcGtsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEzZWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9wa2xvZy5jCkBAIC0wLDAgKzEsMTA4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL3N0ZC9wbGF5ZXIvcGtsb2cuYworKiBGdW5rdGlvbiB6dXIgRGV0ZWt0aW9uIHVuZCBMb2dnZW4gdm9uIEFuZ3JpZmZlbiB2b24gU3BpZWxlcm4gYXVmIFNwaWVsZXIuCisqIFxhdXRob3IgWmVzc3RyYQorKiBcZGF0ZSAxMi4wOC4yMDA4CisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxjb21tYW5kcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisKKyNkZWZpbmUgUk5BTUUoeCkgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKy8qKiBJc3QgdmljdGltIGluIGVpbmVyIEFyZW5hIG9kZXIgU2NoYXR0ZW53ZWx0PworICAqLworbm9tYXNrIGludCBDaGVja0FyZW5hRmlnaHQob2JqZWN0IHZpY3RpbSkgeworICByZXR1cm4gKG9iamVjdF9uYW1lKGVudmlyb25tZW50KHZpY3RpbSkpWzAuLjE0XT09Ii9kL3NjaGF0dGVud2VsdCIpOworfQorCitub21hc2sgcHJvdGVjdGVkIGludCBDaGVja1BsYXllckF0dGFjayhvYmplY3QgYXR0YWNrZXIsIG9iamVjdCB2aWN0aW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYW5ncmlmZnNtc2cpCit7CisgIC8vIGZhbGxzIG1hbCBqZW1hbmQgbmUgQ2xvc3VyZSBhdWYgZGllc2UgRnVua3Rpb24gaW4gZGllIEZpbmdlciBiZWtvbW10IHVuZAorICAvLyBwcm90ZWN0ZWQgdW1nZWh0LgorICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkV4dGVybiBDYWxsIHRvIENoZWNrUGxheWVyQXR0YWNrIGluICVPIVxuIixNRSkpOworCisgIC8vIG51ciBTcGllbGVyIHNpbmQgaW50ZXJlc3NhbnQuCisgIGlmICggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShhdHRhY2tlcikgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh2aWN0aW0pCisgICAgICAmJiAhKCBJU19MRUFSTkVSKGF0dGFja2VyKSAmJiBJU19MRUFSTkVSKHZpY3RpbSkgKSApIHsKKyAgICBzdHJpbmcgZmlsZW1lc3NhZ2UsIHdpenNob3V0OworICAgIGludCBhcmVuYTsKKworICAgIC8vIEFyZW5hLSBvZGVyIFNjaGF0dGVud2VsdGthbXBmPworICAgIGFyZW5hPUNoZWNrQXJlbmFGaWdodChhdHRhY2tlcik7CisKKyAgICB3aXpzaG91dCA9IHNwcmludGYoIlxuKioqKiAlcyBncmVpZnQgJXMgYW4uICglcykgKioqXG4iLAorICAgICAgICBSTkFNRShhdHRhY2tlciksIFJOQU1FKHZpY3RpbSksIG9iamVjdF9uYW1lKE1FKSk7CisgICAgZmlsZW1lc3NhZ2UgPSBzcHJpbnRmKCJcblslc10gJXMgZ3JlaWZ0ICVzIGFuLiAoJXMpICVzICVzXG4iLAorICAgICAgICBzdHJmdGltZSgiJWQlbSV5LSVIOiVNOiVTIix0aW1lKCkpLCBSTkFNRShhdHRhY2tlciksCisgICAgICAgIFJOQU1FKHZpY3RpbSksIG9iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAoYXJlbmEgPyAiKEFSRU5BKSIgOiAiIiksCisgICAgICAgICh2aWN0aW0tPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpID8gIihUZXN0c3BpZWxlcikiIDogIiIpKTsKKworICAgIC8vIEFuZ3JpZmZzbXNnIHZvbSBBdWZydWZlciBhbmhhZW5nZW4uCisgICAgaWYgKHN0cmluZ3AoYW5ncmlmZnNtc2cpICYmIHNpemVvZihhbmdyaWZmc21zZykpIHsKKyAgICAgIHdpenNob3V0ICs9IGFuZ3JpZmZzbXNnOworICAgICAgZmlsZW1lc3NhZ2UgKz0gYW5ncmlmZnNtc2c7CisgICAgfQorICAgIC8vIGdnZi4gZWNodGVuIFRJIGFuaGFlbmdlbiBvZGVyIHdhcm5lbiwgZmFsbHMga2VpbmVyIGV4aXN0aWVydC4KKyAgICBpZiAoIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBhdHRhY2tlciApIHsKKyAgICAgICAgaWYgKCB0aGlzX2ludGVyYWN0aXZlKCkgKSB7CisgICAgICAgICAgd2l6c2hvdXQgKz0gIkFDSFRVTkc6IFRJID0gIiArIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAgICAgICArIlxuIjsKKyAgICAgICAgICBmaWxlbWVzc2FnZSArPSAiQUNIVFVORzogVEkgPSAiK2dldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgICAgICAgICArIlxuIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZpbGVtZXNzYWdlICs9ICIgQUNIVFVORzogS2VpbiBUSSB2b3JoYW5kZW4hXG4iOworICAgICAgICAgICAgd2l6c2hvdXQgKz0gIiBBQ0hUVU5HOiBLZWluIFRJIHZvcmhhbmRlbiFcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY2FsbGVyX3N0YWNrKCkgbWl0bG9nZ2VuIChhYmVyIG5pY2h0IE1hZ2llciB2b2xsc2Nyb2xsZW4pLgorICAgIGZpbGVtZXNzYWdlICs9ICJDYWxsZXJzdGFjazogIiArIENvdW50VXAobWFwKGNhbGxlcl9zdGFjaygxKSwKKyAgICAgICAgICBmdW5jdGlvbiBzdHJpbmcgKG9iamVjdCBwbykge3JldHVybiB0b19zdHJpbmcocG8pO30pLAorICAgICAgICAiLCAiLCAiLCAiKSArICJcbiI7CisgICAgLy8gQ29tbWFuZHN0YWNrIGFuaGFlbmdlbgorICAgIG1peGVkIGNzdGFjayA9IGNvbW1hbmRfc3RhY2soKTsKKyAgICBmaWxlbWVzc2FnZSArPSAiQ29tbWFuZHN0YWNrOiAiICsgQ291bnRVcChtYXAoY3N0YWNrLAorICAgICAgICAgIGZ1bmN0aW9uIHN0cmluZyAobWl4ZWQgYXJyKSB7CisgICAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCIoe09yaWdpbmFsLVRQOiAlTywgVFA6ICVPLCBLb21tYW5kbzogJXN9KSIsCisgICAgICAgICAgICAgICAgYXJyW0NNRF9PUklHSU5dLGFycltDTURfUExBWUVSXSxhcnJbQ01EX1RFWFRdIHx8ICIiKTsKKyAgICAgICAgICB9LCIsICIsIiwgIikpICsgIlxuIjsKKyAgICAvLyBmdWVyIE1hZ2llciBvcmlnaW5hZXJlbiBCZWZlaGwgYW5oYWVuZ2VuOgorICAgIGlmIChzaXplb2YoY3N0YWNrKSkKKyAgICAgIHdpenNob3V0ICs9IHNwcmludGYoIktvbW1hbmRvOiAlc1xuIiwKKyAgICAgICAgICBjc3RhY2tbMF1bQ01EX1RFWFRdIHx8ICI8dW5iZWthbm50PiIpOworCisgICAgd2l6c2hvdXQgKz0gIlxuIjsKKworICAgIC8vIGVyc3RtYWwgbG9nZ2VuCisgICAgaWYgKCBhcmVuYSApCisgICAgICAgIGxvZ19maWxlKCJBVFRBQ0tTX0FSRU5BIiwgZmlsZW1lc3NhZ2UpOworICAgIGVsc2UgCisgICAgICAgIGxvZ19maWxlKCJBVFRBQ0tTIiwgZmlsZW1lc3NhZ2UpOworCisgICAgLy8gZGFubiBNYWdpZXJuIGJlc2NoZWlkZ2ViZW4KKyAgICBpZiAoICFhcmVuYSAmJiAhKHZpY3RpbS0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICkgeworICAgICAgZm9yZWFjaChvYmplY3Qgd2l6OiB1c2VycygpKSB7CisgICAgICAgIGlmICggSVNfTE9SRCh3aXopIHx8IElTX0RFUFVUWSh3aXopICkKKyAgICAgICAgICB0ZWxsX29iamVjdCh3aXosIHdpenNob3V0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7IC8vIFNwaWVsZXItU3BpZWxlcmthbXBmCisgIH0KKyAgcmV0dXJuIDA7IC8vIGtlaW4gU3BpZWxlci1TcGllbGVya2FtcGYKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9wb3Rpb24uYyBiL3N0ZC9wbGF5ZXIvcG90aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkOGNhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvcG90aW9uLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvcG90aW9uLmMgLS0gcG90aW9uIGhhbmRsaW5nIGZvciBwbGF5ZXIKKy8vCisvLyAkSWQ6IHBvdGlvbi5jIDkyODAgMjAxNS0wOC0xNSAyMjoyMDozNlogQXJhdGhvcm4gJAorLy8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyL3BvdGlvbi5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxsaXZpbmcvbGlmZS5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjZGVmaW5lIFBPVElPTk1BU1RFUiAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiCisKK3N0YXRpYyBtaXhlZCAqbGlzdDsKKworbWl4ZWQgKnBvdGlvbnJvb21zOworbWl4ZWQgKmtub3duX3BvdGlvbnJvb21zOworCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3BvdGlvbnJvb21zKCk7CitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X2tub3duX3BvdGlvbnJvb21zKCk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghcG90aW9ucm9vbXMpIHBvdGlvbnJvb21zID0gUE9USU9OTUFTVEVSLT5Jbml0aWFsTGlzdCgpOworICBTZXQoUF9QT1RJT05ST09NUywgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCk7ICAvLyBubyB0YW1wZXJpbmcgYnkgbWV0aG9kcworICBTZXQoUF9QT1RJT05ST09NUywgU0VDVVJFRCwgRl9NT0RFX0FTKTsgICAgICAgICAvLyBubyB0YW1wZXJpbmcgd2l0aCBsaXN0CisKKyAgaWYgKCFrbm93bl9wb3Rpb25yb29tcykga25vd25fcG90aW9ucm9vbXMgPSAoe30pOworICBTZXQoUF9LTk9XTl9QT1RJT05ST09NUywgTk9TRVRNRVRIT0QsIEZfU0VUX01FVEhPRCk7CisgIFNldChQX0tOT1dOX1BPVElPTlJPT01TLCBTRUNVUkVELCBGX01PREVfQVMpOworfQorCitzdGF0aWMgaW50IFJlcG9ydFBvdGlvbihzdHJpbmcgcywgaW50IHBudW0pOworc3RhdGljIGludCBTZWxlY3RXaGljaChpbnQgcG51bSk7CitzdGF0aWMgaW50IGFza19xdWVzdGlvbihpbnQgcG51bSk7CitzdGF0aWMgaW50IGdldF9hbnN3ZXIoc3RyaW5nIGVyZywgaW50IHBudW0pOworc3RhdGljIGludCByYWlzZShzdHJpbmcgd2hhdCwgaW50IHBudW0pOworaW50IEFkZEtub3duUG90aW9uKGludCBucik7CitpbnQgUmVtb3ZlS25vd25Qb3Rpb24oaW50IG5yKTsKKworcHJvdGVjdGVkIHZvaWQgdXBkYXRlc19hZnRlcl9yZXN0b3JlKGludCBuZXdmbGFnKQoreworICAvLyBQX1ZJU0lURURfUE9USU9OUk9PTVMgaXN0IGxhbmcgdmVyYWx0ZXQgdW5kIHVuYmVudXR6dCwgYWJlciBiaXMgenVtCisgIC8vIDIxLjEuMjAxNSBzb2dhciBpbiBuZXVlbiBTcGllbGVybiBnZXNwZWljaGVydCB3b3JkZW4uCisgIC8vIEFlaG5saWNoIGZ1ZXIgUF9CT05VU19QT1RJT05TLiBXZWcgZGFtaXQuCisgIFNldChQX1ZJU0lURURfUE9USU9OUk9PTVMsIFNBVkV8UFJPVEVDVEVELCBGX01PREVfQUQpOworICBTZXQoUF9CT05VU19QT1RJT05TLCBTQVZFfFBST1RFQ1RFRCwgRl9NT0RFX0FEKTsKK30KKwordmFyYXJncyBpbnQgRmluZFBvdGlvbihzdHJpbmcgcykKK3sKKyAgb2JqZWN0IHBvID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIGludCBwbnVtID0gUE9USU9OTUFTVEVSLT5IYXNQb3Rpb24ocG8pOworICBpbnQgZmxhZyA9IDE7CisKKyAgaWYgKCBRdWVyeVByb3AoUF9UUkFOS19GSU5ERU4pICYmIElTX1dJWkFSRChNRSkgKQorICB7CisgICAgcmV0dXJuIFJlcG9ydFBvdGlvbihzLCBwbnVtKTsKKyAgfQorCisgIGlmICggUXVlcnlQcm9wKFBfS0lMTFMpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoICFwb3Rpb25yb29tcyB8fCAhc2l6ZW9mKHBvdGlvbnJvb21zKSB8fAorICAgICAgICEoUE9USU9OTUFTVEVSLT5Jbkxpc3QocG8sIHBvdGlvbnJvb21zLCBrbm93bl9wb3Rpb25yb29tcykpICkKKyAgICBmbGFnPTA7CisKKyAgaWYgKCBwbnVtIDwgMCB8fCAhZmxhZyApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCBxdWVyeV9pbnB1dF9wZW5kaW5nKE1FKSB8fCBxdWVyeV9lZGl0aW5nKE1FKSApCisgIHsKKyAgICB0ZWxsX29iamVjdChNRSwKKyAgICAgICJKZXR6dCBoYWV0dGVzdCBEdSBmYXN0IGVpbmVuIFphdWJlcnRyYW5rIGdlZnVuZGVuLiBEdSBzb2xsdGVzdCBkZW5cbiIKKyAgICAgICJFZGl0b3IvZGFzIE1vcmUgdmVybGFzc2VuIHVuZCBlcyBkYW5uIG5vY2ggZWlubWFsIHZlcnN1Y2hlbiFcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gSGllciBkZXIgQXVzYmF1IGRlciBaVHMgZnVlciBHZWlzdGVyLCB3b2JlaSBkYXMgbmF0dWVybGljaCBpbiBkZXIKKyAgLy8gR2Vpc3RlcnNjaGxvc3NxdWVzdCBpbW1lciBub2NoIGdlaGVuIHNvbGx0ZS4KKyAgb2JqZWN0IGVudiA9IGVudmlyb25tZW50KE1FKTsKKyAgc3RyaW5nIGZuID0gb2xkX2V4cGxvZGUob2JqZWN0X25hbWUoZW52KSwgIiMiKVswXTsKKyAgaWYgKCBRdWVyeVByb3AoUF9HSE9TVCkgJiYgZm5bMC4uMjRdICE9ICIvZC93YWxkL2JlcnRyYW0vZ3NjaGxvc3MvIiApCisgIHsKKyAgICB0ZWxsX29iamVjdChNRSwiQWxzIEdlaXN0IGVpbmVuIFphdWJlcnRyYW5rPyBIaWVyIG5pY2h0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbG9nX2ZpbGUoIkFSQ0gvUE9USU9OUyIsIHNwcmludGYoIiVzICAlcyBpbiAlc1xuIiwgZHRpbWUodGltZSgpKSwKKyAgICBjYXBpdGFsaXplKGdldHVpZCgpKSwgb2JqZWN0X25hbWUocG8pKSk7CisKKyAgcmV0dXJuIFJlcG9ydFBvdGlvbihzLCBwbnVtKTsKK30KKworc3RhdGljIGludCBSZXBvcnRQb3Rpb24oc3RyaW5nIHMsIGludCBwbnVtKQoreworICBpZiAoc3RyaW5ncChzKSAmJiBzaXplb2YocykpCisgICAgdGVsbF9vYmplY3QoTUUsIHMpOworICBlbHNlCisgICAgdGVsbF9vYmplY3QoTUUsICJEdSBmaW5kZXN0IGVpbmVuIFphdWJlcnRyYW5rLCBkZW4gRHUgc29mb3J0IHRyaW5rc3QuXG4iKTsKKworICBTZWxlY3RXaGljaChwbnVtKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBTZWxlY3RXaGljaChpbnQgcG51bSkKK3sKKyAgbGlzdD0oeyJJbnRlbGxpZ2VueiIsIktyYWZ0IiwiR2VzY2hpY2tsaWNoa2VpdCIsIkF1c2RhdWVyIn0pOworICBpZiAoUXVlcnlSZWFsQXR0cmlidXRlKEFfSU5UKT49MjApIGxpc3QtPSh7IkludGVsbGlnZW56In0pOworICBpZiAoUXVlcnlSZWFsQXR0cmlidXRlKEFfU1RSKT49MjApIGxpc3QtPSh7IktyYWZ0In0pOworICBpZiAoUXVlcnlSZWFsQXR0cmlidXRlKEFfREVYKT49MjApIGxpc3QtPSh7Ikdlc2NoaWNrbGljaGtlaXQifSk7CisgIGlmIChRdWVyeVJlYWxBdHRyaWJ1dGUoQV9DT04pPj0yMCkgbGlzdC09KHsiQXVzZGF1ZXIifSk7CisgIGlmICghc2l6ZW9mKGxpc3QpKSB7CisgICAgaGVhbF9zZWxmKDEwMDAwMDAwKTsKKyAgICB0ZWxsX29iamVjdChNRSwgIkRlciBUcmFuayBoYXQgRGljaCBnZWhlaWx0LlxuIik7CisgICAgbG9nX2ZpbGUoIkFSQ0gvUE9USU9OUyIsCisgICAgICAgc3ByaW50ZigiICAlczogSGVpbHRyYW5rIChub2NoICVkKVxuIiwKKyAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpLCBzaXplb2YocG90aW9ucm9vbXMpLTEpKTsKKworICAgIHBvdGlvbnJvb21zIC09ICh7cG51bX0pOworICAgIGtub3duX3BvdGlvbnJvb21zIC09ICh7cG51bX0pOworICAgIHNhdmVfbWUoMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCBzaXplb2YobGlzdCk9PTEgKQorICAgIHJldHVybiByYWlzZShsaXN0WzBdLCBwbnVtKTsKKyAgYXNrX3F1ZXN0aW9uKHBudW0pOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhc2tfcXVlc3Rpb24oaW50IHBudW0pCit7CisgIGludCBpOworCisgIHRlbGxfb2JqZWN0KE1FLCAiRGVpbmUgQXR0cmlidXRlIHNlaGVuIHNvIGF1czpcblxuIgorICAgICtzcHJpbnRmKCJJbnRlbGxpZ2VueiAgICAgOiAlMmQgKCUrZClcbiIsCisgICAgICAgICBRdWVyeVJlYWxBdHRyaWJ1dGUoQV9JTlQpLFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KEFfSU5UKSkKKyAgICArc3ByaW50ZigiS3JhZnQgICAgICAgICAgIDogJTJkICglK2QpXG4iLAorICAgICAgICAgUXVlcnlSZWFsQXR0cmlidXRlKEFfU1RSKSxRdWVyeUF0dHJpYnV0ZU9mZnNldChBX1NUUikpCisgICAgK3NwcmludGYoIkdlc2NoaWNrbGljaGtlaXQ6ICUyZCAoJStkKVxuIiwKKyAgICAgICAgIFF1ZXJ5UmVhbEF0dHJpYnV0ZShBX0RFWCksUXVlcnlBdHRyaWJ1dGVPZmZzZXQoQV9ERVgpKQorICAgICtzcHJpbnRmKCJBdXNkYXVlciAgICAgICAgOiAlMmQgKCUrZClcbiIsCisgICAgICAgICBRdWVyeVJlYWxBdHRyaWJ1dGUoQV9DT04pLFF1ZXJ5QXR0cmlidXRlT2Zmc2V0KEFfQ09OKSkKKyAgICApOworCisgIHRlbGxfb2JqZWN0KE1FLAorICAgICJcbldhcyBtb2VjaHRlc3QgRHUgZXJob2VoZW4/IER1IGhhc3QgZm9sZ2VuZGUgTW9lZ2xpY2hrZWl0ZW46XG4iKTsKKyAgZm9yIChpPTA7IGk8c2l6ZW9mKGxpc3QpOyBpKyspCisgICAgdGVsbF9vYmplY3QoTUUsIHNwcmludGYoIiVkKSAlc1xuIiwgaSsxLCBsaXN0W2ldKSk7CisKKyAgaW5wdXRfdG8oImdldF9hbnN3ZXIiLCBJTlBVVF9QUk9NUFQsCisgICAgc3ByaW50ZigiXG5CaXR0ZSBnaWIgamV0enQgZWluZSBaYWhsICgxLSVkKSBhbjogIiwgaSksIHBudW0pOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdldF9hbnN3ZXIoc3RyaW5nIGVyZywgaW50IHBudW0pCit7CisgIGludCBudW0gPSB0b19pbnQoZXJnKTsKKworICBpZiAoIG51bSA+IDAgJiYgbnVtIDw9IHNpemVvZihsaXN0KSApCisgICAgcmV0dXJuIHJhaXNlKGxpc3RbbnVtLTFdLCBwbnVtKTsKKworICB0ZWxsX29iamVjdChNRSwgIkRlaW5lIFdhaGwgd2FyIHVuZ3VlbHRpZy4gQml0dGUgdmVyc3VjaCdzIG5vY2htYWwhXG5cbiIpOworICByZXR1cm4gYXNrX3F1ZXN0aW9uKHBudW0pOworfQorCitzdGF0aWMgaW50IHJhaXNlKHN0cmluZyB3aGF0LCBpbnQgcG51bSkgeworICBzdHJpbmcgYXR0cjsKKworICBzd2l0Y2ggKHdoYXQpCisgIHsKKyAgICBjYXNlICJHZXNjaGlja2xpY2hrZWl0IjogYXR0cj1BX0RFWDsgYnJlYWs7CisgICAgY2FzZSAiSW50ZWxsaWdlbnoiOiAgICAgIGF0dHI9QV9JTlQ7IGJyZWFrOworICAgIGNhc2UgIktyYWZ0IjogICAgICAgICAgICBhdHRyPUFfU1RSOyBicmVhazsKKyAgICBjYXNlICJBdXNkYXVlciI6ICAgICAgICAgYXR0cj1BX0NPTjsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgIHJldHVybiAwOworICB9CisKKyAgaW50IHlldD1RdWVyeVJlYWxBdHRyaWJ1dGUoYXR0cik7CisgIFNldFJlYWxBdHRyaWJ1dGUoYXR0ciwgeWV0KzEpOworICB0ZWxsX29iamVjdChNRSwKKyAgICBzcHJpbnRmKCJEZWluZSAlcyBoYXQgc2ljaCB2b24gJWQgYXVmICVkIGVyaG9laHQuXG4iLCB3aGF0LCB5ZXQsIHlldCsxKSk7CisgIGxvZ19maWxlKCJBUkNIL1BPVElPTlMiLAorICAgICBzcHJpbnRmKCIgICVzOiAlcyAlZC0+JWQgKG5vY2ggJWQpXG4iLAorICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKCkpLCBjYXBpdGFsaXplKGF0dHIpLAorICAgICAgIHlldCwgeWV0KzEsIHNpemVvZihwb3Rpb25yb29tcyktMSkpOworCisgIC8vIFdlbm4gZGllIFByb3BlcnR5IGdlc2V0enQgaXN0LCB3aXJkIG5pY2h0IHZlcnN1Y2h0LCBkZW4gZ2VmdW5kZW5lbiBUcmFuaworICAvLyBhdXMgZGVyIFpULUxpc3RlIGRlcyBNYWdpZXJzIGF1c3p1dHJhZ2VuLiBEZXIgTmViZW5lZmZla3QsIGRhc3MKKyAgLy8gZXhpc3RpZXJlbmRlLCBhbmdlc2NobG9zc2VuZSBaVHMgYXVjaCBuaWNodCBtZWhyIGF1cyBkZXIgWlQtTGlzdGUgdm9uCisgIC8vIHRlc3RlbmRlbiBNYWdpZXJuIGF1c2dldHJhZ2VuIHdlcmRlbiwgd2lyZCBkYWJlaSBpbiBLYXVmIGdlbm9tbWVuLgorICBpZiAoICFRdWVyeVByb3AoUF9UUkFOS19GSU5ERU4pICkKKyAgeworICAgIHBvdGlvbnJvb21zICAgICAgIC09ICh7IHBudW0gfSk7CisgICAga25vd25fcG90aW9ucm9vbXMgLT0gKHsgcG51bSB9KTsKKyAgICBzYXZlX21lKDEpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgbWl4ZWQgX3F1ZXJ5X3BvdGlvbnJvb21zKCkKK3sKKyAgcmV0dXJuIGNvcHkoU2V0KFBfUE9USU9OUk9PTVMsIHBvdGlvbnJvb21zKSk7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfa25vd25fcG90aW9ucm9vbXMoKQoreworICByZXR1cm4gY29weShTZXQoUF9LTk9XTl9QT1RJT05ST09NUywga25vd25fcG90aW9ucm9vbXMpKTsKK30KKworaW50IEFkZEtub3duUG90aW9uKGludCBucikKK3sKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9ICIvcm9vbS9vcmFrZWwiKQorICAgIHJldHVybiAtMTsgLy8gS2VpbmUgQmVyZWNodGlndW5nCisKKyAgaWYgKG1lbWJlcihrbm93bl9wb3Rpb25yb29tcywgbnIpICE9IC0xKQorICAgIHJldHVybiAtMjsgLy8gTnVtbWVyIGJlcmVpdHMgZWluZ2V0cmFnZW4KKyAgZWxzZQorICB7CisgICAga25vd25fcG90aW9ucm9vbXMgKz0gKHsgbnIgfSk7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworaW50IFJlbW92ZUtub3duUG90aW9uKGludCBucikKK3sKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9ICIvcm9vbS9vcmFrZWwiKQorICAgIHJldHVybiAtMTsgLy8gS2VpbmUgQmVyZWNodGlndW5nCisKKyAgaWYgKG1lbWJlcihrbm93bl9wb3Rpb25yb29tcywgbnIpID09IC0xKQorICAgIHJldHVybiAtMjsgLy8gTnVtbWVyIG5pY2h0IGVpbmdldHJhZ2VuCisgIGVsc2UKKyAgeworICAgIGtub3duX3BvdGlvbnJvb21zIC09ICh7IG5yIH0pOworICAgIHJldHVybiAxOworICB9Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3Byb3RvY29scy9nbWNwLmMgYi9zdGQvcGxheWVyL3Byb3RvY29scy9nbWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1MWRhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvcHJvdG9jb2xzL2dtY3AuYwpAQCAtMCwwICsxLDc4NSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGdtY3AuYyAtLSBWZXJ3YWx0dW5nIHZvbiBHTUNQIGltIFNwaWVsZXJvYmpla3QKKy8vCisvLyAkSWQkCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisKKyNpbmNsdWRlIDxyZWdleHAuaD4KKyNpbmNsdWRlIDx0ZWxuZXQuaD4KKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsaXZpbmcvYXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPHBsYXllci9nbWNwLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxsaXZpbmcvZGVzY3JpcHRpb24uaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDx0bHMuaD4KKworaW5oZXJpdCAiL3NlY3VyZS90ZWxuZXRuZWctc3RydWN0cy5jIjsKKworc3RydWN0IGdtY3BfbW9kX3MgeworICBzdHJpbmcgaWQ7ICAgICAgICAvLyBOYW1lIGRlcyBHTUNQLU1vZHVscyAoei5CLiAiTUcuQ2hhciIpCisgIGludCB2ZXJzaW9uOyAgICAgIC8vIFZlcnNpb24gZGVzIGFrdGl2aWVydGVuIG1vZHVscworICBjbG9zdXJlIHNlbmRjbDsgICAvLyBIYW5kbGVyIHp1bSBTZW5kZW4gKGxmdW4tY2xvc3VyZSkKKyAgY2xvc3VyZSByZWN2Y2w7ICAgLy8gSGFuZGxlciB6dW0gRW1wZmFuZ2VuIChsZnVuYy1jbG9zdXJlKQorICBtaXhlZCBkYXRhOyAgICAgICAvLyBvcHRpb25hbCBkYXRhIG9mIHRoZSBtb2R1bGUKK307CisKK25vc2F2ZSBtYXBwaW5nIGdtY3BkYXRhOworLyogU3RydWt0dXI6CisgICBKZWRlcyBNb2R1bCBoYXQgZWluZW4gU2NobHVlc3NlbCBpbSBUb3BsZXZlbCwgd29ydW50ZXIgZ2dmLiBzZWluZSBEYXRlbgorICAgYWJnZWxlZ3Qgc2luZC4gRGllIERhdGVuIHNpbmQgZWluZSBzdHJ1Y3QgZ21jcF9tb2Rfcy4gRGVyIFNjaGx1ZXNzZWwgaXN0CisgICBkZXIgTW9kdWxuYW1lIE9ITkUgVmVyc2lvbi4KKyAgICovCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgIi9zZWN1cmUvdGVsbmV0bmVnLmgiCisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKy8vI2RlZmluZSBfX0dNQ1BfREVCVUdfXyAxCisvLyBMb3cgcHJpb3JpdHkgZGVidWcgbWVzc2FnZXMKKyNkZWZpbmUgR01DUF9ERUJVRyhwcmUsbXNnLHByaW8pIGlmIChpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ21jcGRhdGEpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR01DUF9kZWJ1ZyhwcmUsbXNnLHByaW8pOworLy8gaGlnaGVyIHByaW9yaXR5IGVycm9yIG1lc3NhZ2VzCisjZGVmaW5lIEdNQ1BFUlJPUihtc2cpIGlmIChpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICYmIGdtY3BkYXRhKSBcCisgICAgICAgICAgICAgICAgICAgICBHTUNQX2RlYnVnKCJFUlJPUiIsbXNnLDEwKTsKKworCisvLyAqKioqKioqKioqKioqKioqIEFQSSBuYWNoIEF1c3NlbiBmb2xndCBhYiBoaWVyICoqKioqKioqKioqKioqKioqKioqCisKKy8vIFdpcmQgdm9tIFNwaWVsZXJvYmpla3QgZ2VydWZlbiwgd2VubiBzaWNoIERhdGVuIGFtIENoYXJha3RlciB2ZXJhZW5kZXJ0CisvLyBoYWJlbiwgZGllIGdlc2VuZGV0IHdlcmRlbiBzb2xsdGVuLgorLy8gRGllcyBpc3QgZWlnZW50bGljaCBudXIgZWluIFdyYXBwZXIsIGRlciBkaWUgRGF0ZW4gYW4gZGVuIEhhbmRsZXIgZWluZXMKKy8vIE1vZHVscyB3ZWl0ZXJnaWJ0LCB3ZWxjaGVzIHZvbSBDbGllbnQgYWt0aXZpZXJ0IHd1cmRlLiBIaWVyenUga29tbWVuIHp1cgorLy8gWmVpdCAyIGluIEZyYWdlOiBNRy5DaGFyIChiZXZvcnp1Z3QpIHVuZCBDaGFyIChtaW5pbWFsZXIgU3VwcG9ydCkuCisvKnByb3RlY3RlZCovIGludCBHTUNQX0NoYXIobWFwcGluZyBkYXRhKSB7CisKKyAgaWYgKCFtYXBwaW5ncChnbWNwZGF0YSkpIHJldHVybiAwOworCisgIC8vIEFscyBlcnN0ZXMgc2NoYXVlbiwgb2IgZGVyIENsaWVudCBNRy5DaGFyIGFrdGl2aWVydCBoYXQuCisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhWyJNRy5jaGFyIl07CisgIGlmIChzdHJ1Y3RwKG1vZCkgJiYgY2xvc3VyZXAobW9kLT5zZW5kY2wpKQorICB7CisgICAgZnVuY2FsbChtb2QtPnNlbmRjbCwgZGF0YSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gRGFubiBub2NoIGRhcyBNb2R1bCBjaGFyIHBydWVmZW4uIERhcyBpc3QgYWJlciB6aWVtbGljaCBlaW5nZXNjaHJhZW5rdAorICAvLyB1bmQgZXMgZ2lidCBob2ZmZW50bGljaCBuaWNodCB2aWVsZSBDbGllbnRzLCBkaWUgZXMgYmVudXR6ZW4uCisgIC8vIChBYXJkd29sZi1Nb2R1bCkKKyAgbW9kID0gZ21jcGRhdGFbImNoYXIiXTsKKyAgaWYgKHN0cnVjdHAobW9kKSAmJiBjbG9zdXJlcChtb2QtPnNlbmRjbCkpCisgIHsKKyAgICBmdW5jYWxsKG1vZC0+c2VuZGNsLCBkYXRhKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLyBEYW5uIG5vY2ggZGFzIE1vZHVsIENoYXIgcHJ1ZWZlbi4gRGFzIGlzdCBhYmVyIHppZW1saWNoIGVpbmdlc2NocmFlbmt0CisgIC8vIHVuZCBlcyBnaWJ0IGhvZmZlbnRsaWNoIG5pY2h0IHZpZWxlIENsaWVudHMsIGRpZSBlcyBiZW51dHplbi4KKyAgLy8gKElSRS1Nb2R1bCkKKyAgbW9kID0gZ21jcGRhdGFbIkNoYXIiXTsKKyAgaWYgKHN0cnVjdHAobW9kKSAmJiBjbG9zdXJlcChtb2QtPnNlbmRjbCkpCisgIHsKKyAgICBmdW5jYWxsKG1vZC0+c2VuZGNsLCBkYXRhKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLypwcm90ZWN0ZWQqLyBpbnQgR01DUF9DaGFubmVsKHN0cmluZyBtc2csIHN0cmluZyBjaGFubmVsLCBzdHJpbmcgc2VuZGVyKSB7CisgIGlmICghbWFwcGluZ3AoZ21jcGRhdGEpKSByZXR1cm4gMDsKKyAgLy8gY29tbS5jaGFubmVsIE1vZHVsIGFrdGl2PworICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2QgPSBnbWNwZGF0YVsiY29tbS5jaGFubmVsIl07CisgIGlmIChzdHJ1Y3RwKG1vZCkgJiYgY2xvc3VyZXAobW9kLT5zZW5kY2wpKQorICB7CisgICAgZnVuY2FsbChtb2QtPnNlbmRjbCwgKFsiY2hhbiI6Y2hhbm5lbCwgInBsYXllciI6IHNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBtc2ddKSApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKnByb3RlY3RlZCovIGludCBHTUNQX1Jvb20oKSB7CisgIGlmICghbWFwcGluZ3AoZ21jcGRhdGEpKSByZXR1cm4gMDsKKyAgLy8gTUcucm9vbSBNb2R1bCBha3Rpdj8KKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbIk1HLnJvb20iXTsKKyAgaWYgKHN0cnVjdHAobW9kKSAmJiBjbG9zdXJlcChtb2QtPnNlbmRjbCkpCisgIHsKKyAgICBmdW5jYWxsKG1vZC0+c2VuZGNsLCAwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gKioqKioqKioqKioqKioqKiBBYiBoaWVyIGZvbGdlbiBlaGVyIGRpZSBMb3dsZXZlbC1EaW5nZSAqKioqKioqKioqKgorcHJpdmF0ZSB2b2lkIEdNQ1BfZGVidWcoc3RyaW5nIHByZSwgc3RyaW5nIG1zZywgaW50IHByaW8pIHsKKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbIkNvcmUiXTsKKyAgaWYgKG1vZCAmJiAobW9kLT5kYXRhKVsiRGVidWciXSA+PSBwcmlvKQorICAgIHRlbGxfb2JqZWN0KHRoaXNfb2JqZWN0KCksIHNwcmludGYoIkdNQ1AgJXM6ICVzXG4iLHByZSxtc2cpKTsKK30KKworcHJpdmF0ZSB2b2lkIEdNQ1Bfc2VuZChzdHJpbmcgY21kLCBtaXhlZCBkYXRhKQoreworICBHTUNQX0RFQlVHKCJHTUNQX3NlbmQiLHNwcmludGYoIiVzICVPIixjbWQsZGF0YSksIDMwKTsKKyAgc2VuZF90ZWxuZXRfbmVnX3N0cihzcHJpbnRmKCIlYyVjJXMgJXMiLCBTQiwgVEVMT1BUX0dNQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQsIGpzb25fc2VyaWFsaXplKGRhdGEpKSwgMSk7Cit9CisKK3ByaXZhdGUgdm9pZCBHTUNQX3VucmVnaXN0ZXJfbW9kdWxlKHN0cmluZyBtb2QpCit7CisgIGludCB2ZXJzaW9uOworICAvLyBXZW5uIG5pY2h0ICJtb2QgdmVyc2lvbiIgU2NoZW1hLCBpZ25vcmllcmVuCisgIGlmIChzc2NhbmYobW9kLCAiJXMgJWQiLCBtb2QsIHZlcnNpb24pICE9IDIpCisgICAgICByZXR1cm47CisKKyAgaWYgKG1vZD09IkNvcmUiKSAvLyBkYXJmIG5pY2h0IGFiZ2VzY2hhbHRldCB3ZXJkZW4uCisgICAgICByZXR1cm47CisKKyAgbV9kZWxldGUoZ21jcGRhdGEsIG1vZCk7Cit9CisKK3ByaXZhdGUgdm9pZCBHTUNQX3JlZ2lzdGVyX21vZHVsZShzdHJpbmcgbW9kbmFtZSkKK3sKKyAgaW50IHZlcnNpb247CisgIEdNQ1BfREVCVUcoInJlZ2lzdGVyX21vZHVsZSgpOiB0cnlpbmcgLi4uICIsbW9kbmFtZSwgMjApOworICAvLyBXZW5uIG5pY2h0ICJtb2QgdmVyc2lvbiIgU2NoZW1hLCBpZ25vcmllcmVuCisgIGlmIChzc2NhbmYobW9kbmFtZSwgIiVzICVkIiwgbW9kbmFtZSwgdmVyc2lvbikgIT0gMikKKyAgICAgIHJldHVybjsKKworLy8gIEdNQ1BfREVCVUcoInJlZ2lzdGVyX21vZHVsZSgpIixtb2RuYW1lICsgIiB2IiArIHZlcnNpb24pOworCisgIC8vIE1vZHVsIChnZ2YuIG1pdCBhbmRlcmVyIFZlcnNpb24pIGJlcmVpdHMgYWt0aXY/CisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhW21vZG5hbWVdOworICBpZiAoc3RydWN0cChtb2QpKSB7CisgICAgLy8gd2VubiBnbGVpY2hlciBOYW1lIHVuZCBWZXJzaW9uLCB3aXJkIG5peCBnZW1hY2h0LCBiZWkgYW5kZXJlciBWZXJzaW9uCisgICAgLy8gd2lyZCBlaW4gbmV1ZXIgSGFuZGxlciBlaW5nZXRyYWdlbiB1bmQgZGllIERhdGVuIGdlbG9lc2NodC4KKyAgICAvLyBXZW5uIG5pY2h0LWV4aXN0aWVyZW5kZSBNb2R1bC9WZXJzaW9uLUtvbWJpIGFuZ2Vmb3JkZXJ0IHdpcmQsIGlzdCBkYXMKKyAgICAvLyBNb2R1bCBoaW50ZXJoZXIgYXVzLgorICAgIGlmIChtb2QtPmlkID09IG1vZG5hbWUgJiYgbW9kLT52ZXJzaW9uID09IHZlcnNpb24pCisgICAgICByZXR1cm47CisgICAgZWxzZQorICAgICAgbV9kZWxldGUoZ21jcGRhdGEsbW9kbmFtZSk7CisgIH0KKworICAvLyBEYXMgR01DUC1Nb2R1bCBpc3QgbnVyIHZlcmZ1ZWdiYXIsIHdlbm4gZXMgenUgZGVyIEtvbWJpbmF0aW9uIGF1cyBtb2QgdW5kCisgIC8vIHZlcnNpb24gZWluZW4gSGFuZGxlciB6dW0gU2VuZGVuIGdpYnQuLi4KKyAgLy8gRGVyIEhhbmRsZXIgaXN0OiBHTUNQXzxtb2Q+X3Y8dmVyc2lvbj5fc2VuZCwgYWJlciBpbiA8bW9kPiB3ZXJkZW4gYWxsZQorICAvLyAiLiIgZHVyY2ggIl8iIGVyc2V0enQuCisgIHN0cmluZyByZXBsYWNlZG5hbWUgPSByZWdyZXBsYWNlKG1vZG5hbWUsICJcXC4iLCAiXyIsIFJFX0dMT0JBTCk7CisgIGNsb3N1cmUgc2VuZGNsID0gc3ltYm9sX2Z1bmN0aW9uKHNwcmludGYoIkdNQ1Btb2RfJXNfdiVkX3NlbmQiLAorICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkbmFtZSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgdGhpc19vYmplY3QoKSk7CisgIGlmICghc2VuZGNsKQorICAgIHJldHVybjsKKyAgLy8gRGllc2UgQ2xvc3VyZSBkYXJmIDAgc2Vpbi4gRGFubiBmaW5kZXQga2VpbmUgQmVoYW5kbHVuZyB2b24gdm9tIENsaWVudAorICAvLyBnZXNlbmRldGVuIEtvbW1hbmRvcyBzdGF0dC4gV2FzIGZ1ZXIgZGllIG1laXN0ZW4gTW9kdWxlIGF1Y2ggaW4gT3JkbnVuZworICAvLyBpc3QsIGRhIHNpZSBkZW0gQ2xpZW50IGtlaW5lIEtvbW1hbmRvcyBhbmJpZXRlbi4KKyAgY2xvc3VyZSByZWN2Y2wgPSBzeW1ib2xfZnVuY3Rpb24oc3ByaW50ZigiR01DUG1vZF8lc192JWRfcmVjdiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWRuYW1lLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpKTsKKworICBHTUNQX0RFQlVHKCJyZWdpc3Rlcl9tb2R1bGUoKSIsbW9kbmFtZSsiIGVyZm9sZ3JlaWNoIHJlZ2lzdHJpZXJ0LiIsMTApOworCisgIG1vZCA9ICg8Z21jcF9tb2Rfcz4gaWQ6IG1vZG5hbWUsIHZlcnNpb24gOiB2ZXJzaW9uLAorICAgICAgICAgc2VuZGNsIDogc2VuZGNsLCByZWN2Y2w6IHJlY3ZjbCwgZGF0YTogKFtdKSApOworICBnbWNwZGF0YVttb2RuYW1lXSA9IG1vZDsKKworICAvLyBadW0gc2NobHVzcyBub2NoIGRlbiBTZW5kZW4taGFuZGxlciBtYWwgcnVmZW4sIGRhbWl0IGRlciBtYWwgYWxsZQorICAvLyB2ZXJmdWVnYmFyZW4gZGF0ZW4gc2VuZGV0LgorICBmdW5jYWxsKG1vZC0+c2VuZGNsLCAwKTsKK30KKworLy8gSGFuZGxlciBmdWVyIGRhcyBDb3JlIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfQ29yZV92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpCit7CisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhWyJDb3JlIl07CisgIG1hcHBpbmcgZGF0YSA9IG1vZC0+ZGF0YTsKKworLyogIGlmICghbW9kKQorICB7CisgICAgR01DUEVSUk9SKCJDb21tYW5kICVzIGZvciBkaXNhYmxlZCBtb2R1bGUgaWdub3JlZC4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgKi8KKyAgR01DUF9ERUJVRygiR01DUG1vZF9Db3JlX3YxOiAiLCBjbWQsIDIwKTsKKworICBzd2l0Y2ggKGNtZCkKKyAgeworICAgIGNhc2UgIkNvcmUuSGVsbG8iOgorICAgICAgaWYgKG1hcHBpbmdwKGFyZ3MpKQorICAgICAgICBkYXRhWyJIZWxsbyJdID0gKFsiY2xpZW50IjogYXJnc1siY2xpZW50Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogYXJnc1sidmVyc2lvbiJdIF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiQ29yZS5TdXBwb3J0cy5TZXQiOgorICAgICAgaWYgKHBvaW50ZXJwKGFyZ3MpKQorICAgICAgeworICAgICAgICAvLyBBbHRlIE1vZHVsZSBhYnNjaGFsdGVuL2xvZXNjaGVuCisgICAgICAgIGZvcmVhY2goc3RyaW5nIG0gOiBkYXRhWyJTdXBwb3J0cyJdKQorICAgICAgICAgIEdNQ1BfdW5yZWdpc3Rlcl9tb2R1bGUobSk7CisgICAgICAgIGRhdGFbIlN1cHBvcnRzIl0gPSBhcmdzOworICAgICAgICAvLyBWZXJzdWNoZW4sIGRpZSBuZXVlbiBNb2R1bGUgenUgcmVnaXN0cmllcmVuCisgICAgICAgIGZvcmVhY2goc3RyaW5nIG0gOiBhcmdzKQorICAgICAgICAgIEdNQ1BfcmVnaXN0ZXJfbW9kdWxlKG0pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfQ29yZV92MTogIiwKKyAgICAgICAgICAgICAgIkRhdGEgZm9yIENvcmUuU3VwcG9ydHMuU2V0IGlzIG5vIGFycmF5IiwgNSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJDb3JlLlN1cHBvcnRzLkFkZCI6CisgICAgICBpZiAoIXBvaW50ZXJwKGRhdGFbIlN1cHBvcnRzIl0pKQorICAgICAgICBkYXRhWyJTdXBwb3J0cyJdID0gKHt9KTsKKyAgICAgIGlmIChwb2ludGVycChhcmdzKSkKKyAgICAgIHsKKyAgICAgICAgZm9yZWFjaChzdHJpbmcgbTogYXJncykKKyAgICAgICAgICBHTUNQX3JlZ2lzdGVyX21vZHVsZShtKTsKKyAgICAgICAgZGF0YVsiU3VwcG9ydHMiXSArPSBhcmdzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAiQ29yZS5TdXBwb3J0cy5SZW1vdmUiOgorICAgICAgaWYgKCFwb2ludGVycChkYXRhWyJTdXBwb3J0cyJdKSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAocG9pbnRlcnAoYXJncykpCisgICAgICB7CisgICAgICAgIGZvcmVhY2goc3RyaW5nIG06IGFyZ3MpCisgICAgICAgICAgR01DUF91bnJlZ2lzdGVyX21vZHVsZShtKTsKKyAgICAgICAgZGF0YVsiU3VwcG9ydHMiXSAtPSBhcmdzOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAiQ29yZS5TdXBwb3J0cy5LZWVwQWxpdmUiOgorICAgICAgYnJlYWs7ICAvLyB0aGlzIGlzIGlnbm9yZWQgYnkgdXMuCisgICAgY2FzZSAiQ29yZS5QaW5nIjoKKyAgICAgIGlmIChpbnRwKGFyZ3MpKQorICAgICAgICBkYXRhWyJQaW5nIl0gPSBhcmdzOworICAgICAgLy8gc2VuZCBhIHBpbmcgYmFjaworICAgICAgR01DUF9zZW5kKCJDb3JlLlBpbmciLDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiQ29yZS5EZWJ1ZyI6CisgICAgICBpZiAoaW50cChhcmdzKSAmJiBhcmdzID49IDApCisgICAgICAgIGRhdGFbIkRlYnVnIl0gPSBhcmdzOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdNQ1BFUlJPUihzcHJpbnRmKCJVbmtub3duIEdNQ1AgQ29yZSBjbWQgJXMgd2l0aCBhcmdzICVPIiwKKyAgICAgICAgICAgIGNtZCwgYXJncykpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLy8gSGFuZGxlciBmdWVyIGRhcyBDb3JlIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuLCB3ZW5uIERhdGVuIHp1IHNlbmRlbiBzaW5kLgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9Db3JlX3YxX3NlbmQobWFwcGluZyBkYXRhKQoreworICAvLyBadXIgWmVpdCBuaXgsIHNwYWV0ZXIgbWFsIENvcmUuR29vZGJ5ZS4KK30KKworCisvLyBIYW5kbGVyIGZ1ZXIgZGFzIE1HLkNoYXIgTW9kdWwKKy8vIEdlcnVmZW4gYmVpIEVtcGZhbmcgdm9uIEtvbW1hbmRvcyB2b20gQ2xpZW50LgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9NR19jaGFyX3YxX3NlbmQobWFwcGluZyBkYXRhKQoreworICBtYXBwaW5nIHNxdWV1ZSA9IG1fYWxsb2NhdGUoNSwwKTsKKyAgc3RydWN0IGdtY3BfbW9kX3MgbW9kID0gZ21jcGRhdGFbIk1HLmNoYXIiXTsKKyAgLy8gbW9kLT5kYXRhIGZ1bmdpZXJ0IGhpZXIgYXVjaCBhbHMgQ2FjaGUgZGVyIERhdGVuLiBEaWUgbXVzcyBtYW4gbmFlbWxpY2gKKyAgLy8gbGVpZGVyIGltbWVyIGFsbGUgc2VuZGVuLCBuaWNodCBudXIgZGllIGdlYWVuZGVydGVuLgorICBpZiAoIW1hcHBpbmdwKGRhdGEpKQorICB7CisgICAgLy8gQWxsZSB2ZXJmdWVnYmFyZW4gSW5mb3JtYXRpb25lbiBzZW5kZW4uLi4KKyAgICBtb2QtPmRhdGEgPSBtX2FsbG9jYXRlKDYpOworICAgIG1fYWRkKG1vZC0+ZGF0YSwgIk1HLmNoYXIuYmFzZSIsCisgICAgICAgICAgICAgIChbUF9OQU1FOiBOYW1lKFdFUiksCisgICAgICAgICAgICAgICAgUF9HVUlMRDogUXVlcnlQcm9wKFBfR1VJTEQpLAorICAgICAgICAgICAgICAgIFBfUFJFU0FZOiBRdWVyeVByb3AoUF9QUkVTQVkpLCAgLy8gVE9ETworICAgICAgICAgICAgICAgIFBfVElUTEU6IFF1ZXJ5UHJvcChQX1RJVExFKSwKKyAgICAgICAgICAgICAgICAid2l6bGV2ZWwiOiBxdWVyeV93aXpfbGV2ZWwodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgICAgUF9SQUNFOiBRdWVyeVByb3AoUF9SQUNFKV0pICk7ICAvLyBUT0RPCisgICAgbV9hZGQobW9kLT5kYXRhLCJNRy5jaGFyLnZpdGFscyIsIAorICAgICAgICAgICAgICAoW1BfSFA6IFF1ZXJ5UHJvcChQX0hQKSwKKyAgICAgICAgICAgICAgICBQX1NQOiBRdWVyeVByb3AoUF9TUCksCisgICAgICAgICAgICAgICAgUF9QT0lTT046IFF1ZXJ5UHJvcChQX1BPSVNPTikgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIk1HLmNoYXIubWF4dml0YWxzIiwKKyAgICAgICAgICAgICAgKFtQX01BWF9IUDogUXVlcnlQcm9wKFBfTUFYX0hQKSwKKyAgICAgICAgICAgICAgICBQX01BWF9TUDogUXVlcnlQcm9wKFBfTUFYX1NQKSwKKyAgICAgICAgICAgICAgICBQX01BWF9QT0lTT046IFF1ZXJ5UHJvcChQX01BWF9QT0lTT04pIF0pICk7CisgICAgbV9hZGQobW9kLT5kYXRhLCJNRy5jaGFyLmF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAoWyBBX1NUUjogUXVlcnlBdHRyaWJ1dGUoQV9TVFIpLAorICAgICAgICAgICAgICAgICBBX0lOVDogUXVlcnlBdHRyaWJ1dGUoQV9JTlQpLAorICAgICAgICAgICAgICAgICBBX0RFWDogUXVlcnlBdHRyaWJ1dGUoQV9ERVgpLAorICAgICAgICAgICAgICAgICBBX0NPTjogUXVlcnlBdHRyaWJ1dGUoQV9DT04pIF0pICk7CisgICAgbV9hZGQobW9kLT5kYXRhLCJNRy5jaGFyLmluZm8iLAorICAgICAgICAgICAgICAoW1BfTEVWRUw6IFF1ZXJ5UHJvcChQX0xFVkVMKSwKKyAgICAgICAgICAgICAgICBQX0dVSUxEX0xFVkVMOiBRdWVyeVByb3AoUF9HVUlMRF9MRVZFTCksCisgICAgICAgICAgICAgICAgUF9HVUlMRF9USVRMRTogUXVlcnlQcm9wKFBfR1VJTERfVElUTEUpIF0pICk7CisgICAgbV9hZGQobW9kLT5kYXRhLCJNRy5jaGFyLndpbXB5IiwKKyAgICAgICAgICAgICAgKFtQX1dJTVBZOiBRdWVyeVByb3AoUF9XSU1QWSksCisgICAgICAgICAgICAgICAgUF9XSU1QWV9ESVJFQ1RJT046IFF1ZXJ5UHJvcChQX1dJTVBZX0RJUkVDVElPTikgXSkgKTsKKyAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIuYmFzZSIpOworICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci52aXRhbHMiKTsKKyAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIubWF4dml0YWxzIik7CisgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLmF0dHJpYnV0ZXMiKTsKKyAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIuaW5mbyIpOworICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci53aW1weSIpOworICAgIC8vIGRpZXMgd2lyZCBkaXJla3QgZ2VzZW5kZXQsIHdlaWwgZXMgbmljaHQgZ2VzcGVpY2hlcnQgd2VyZGVuIG11c3MuICh3aXJkCisgICAgLy8gbnVyIGJlaW0gU3RhcnQgZGVzIE1vZHVscyBnZXNlbmRldCkuCisgICAgR01DUF9zZW5kKCJNRy5jaGFyLmluZm9WYXJzIiwgKFsKKyAgICAgICAgICBQX0xFVkVMOiAiU3BpZWxlcnN0dWZlIiwgUF9HVUlMRF9MRVZFTDogIkdpbGRlbnN0dWZlIiwKKyAgICAgICAgICBQX0dVSUxEX1RJVExFOiAiR2lsZGVudGl0ZWwiIF0pICk7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gbnVyIGRpZSBpbiBkYXRhIGVudGhhbHRlbmVuIHNlbmRlbi4KKyAgICAvLyBqZXR6dCBlcnN0bWFsIGFsbGVzIGF1cyBkYXRhIHNvIHNvcnRpZXJlbiwgd2llIGVzIGdlc2VuZGV0IHdlcmRlbgorICAgIC8vIG11c3MuLi4gKnNldWZ6KgorICAgIGZvcmVhY2goc3RyaW5nIGtleSwgbWl4ZWQgdmFsIDogZGF0YSkKKyAgICB7CisgICAgICBzd2l0Y2goa2V5KQorICAgICAgeworICAgICAgICBjYXNlIFBfSFA6CisgICAgICAgIGNhc2UgUF9TUDoKKyAgICAgICAgY2FzZSBQX1BPSVNPTjoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiTUcuY2hhci52aXRhbHMiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLnZpdGFscyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfTUFYX0hQOgorICAgICAgICBjYXNlIFBfTUFYX1NQOgorICAgICAgICBjYXNlIFBfTUFYX1BPSVNPTjoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiTUcuY2hhci5tYXh2aXRhbHMiXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLm1heHZpdGFscyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfTkFNRToKKyAgICAgICAgICAobW9kLT5kYXRhKVsiTUcuY2hhci5iYXNlIl0gKz0gKFtrZXk6IE5hbWUoV0VSKV0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5iYXNlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9SQUNFOgorICAgICAgICBjYXNlIFBfUFJFU0FZOgorICAgICAgICBjYXNlIFBfVElUTEU6CisgICAgICAgIGNhc2UgUF9HVUlMRDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiTUcuY2hhci5iYXNlIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci5iYXNlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQV9ERVg6CisgICAgICAgIGNhc2UgQV9TVFI6CisgICAgICAgIGNhc2UgQV9DT046CisgICAgICAgIGNhc2UgQV9JTlQ6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIk1HLmNoYXIuYXR0cmlidXRlcyJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIk1HLmNoYXIuYXR0cmlidXRlcyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfTEVWRUw6CisgICAgICAgIGNhc2UgUF9HVUlMRF9MRVZFTDoKKyAgICAgICAgY2FzZSBQX0dVSUxEX1RJVExFOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLmluZm8iXSArPSAoW2tleTogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJNRy5jaGFyLmluZm8iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1dJTVBZOgorICAgICAgICBjYXNlIFBfV0lNUFlfRElSRUNUSU9OOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJNRy5jaGFyLndpbXB5Il0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiTUcuY2hhci53aW1weSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBHTUNQX0RFQlVHKCJHTUNQbW9kX01HX2NoYXJfdjFfc2VuZCgpIiwKKyAgICAgIHNwcmludGYoIkRhdGEgcmVhZHk6ICVPLCBTZW5kcXVldWU6ICVPIixtb2QtPmRhdGEsIHNxdWV1ZSksNTApOworCisgIC8vIEpldHp0IGRpZSBzcXVldWUgc2VuZGVuLi4uCisgIGZvcmVhY2goc3RyaW5nIGtleSA6IHNxdWV1ZSkKKyAgeworICAgIEdNQ1Bfc2VuZChrZXksIChtb2QtPmRhdGEpW2tleV0pOworICB9Cit9CisKKy8vIEhhbmRsZXIgZnVlciBkYXMgTUcuQ2hhciBNb2R1bAorLy8gR2VydWZlbiBiZWkgRW1wZmFuZyB2b24gS29tbWFuZG9zIHZvbSBDbGllbnQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX01HX2NoYXJfdjFfcmVjdihzdHJpbmcgY21kLCBtaXhlZCBhcmdzKQoreworICAvLyBkaWVzZXMgTW9kdWwgYmlldGV0IGRlbSBDbGllbnQga2VpbmUgS29tbWFuZG9zIGFuLCBkYWhlciBpZ25vcmllcmVuLgorICBHTUNQX0RFQlVHKCJHTUNQbW9kX01HX0NoYXJfdjFfcmVjdiIsIkNsaWVudC1Lb21tYW5kbyBpZ25vcmllcnQ6ICIrY21kLDIwKTsKK30KKworLyoKKy8vIEhhbmRsZXIgZnVlciBkYXMgTUcuUm9vbSBNb2R1bCB2b24gR01DUAorLy8gR2VydWZlbiwgd2VubiBEYXRlbiB6dSBzZW5kZW4gc2luZC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfTUdfUm9vbV92MV9zZW5kKG1hcHBpbmcgZGF0YSkKK3sKK30KKworLy8gSGFuZGxlciBmdWVyIGRhcyBSb29tIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfTUdfUm9vbV92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpCit7CisgIC8vIGRpZXNlcyBNb2R1bCBiaWV0ZXQgZGVtIENsaWVudCBrZWluZSBLb21tYW5kb3MgYW4sIGRhaGVyIGlnbm9yaWVyZW4uCisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfTUdfUm9vbV92MV9yZWN2IiwiQ2xpZW50LUtvbW1hbmRvIGlnbm9yaWVydDogIitjbWQsMjApOworfQorKi8KKworLy8gUmVjdiBIYW5kbGVyIGZ1ZXIgZGFzIGNvbW0uY2hhbm5lbCBNb2R1bCB2b24gR01DUAorLy8gR2VydWZlbiBiZWkgRW1wZmFuZyB2b24gS29tbWFuZG9zIHZvbSBDbGllbnQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX2NvbW1fY2hhbm5lbF92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpCit7CisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfY29tbV9jaGFubmVsX3YxX3JlY3YiLAorICAgICAgIkNsaWVudC1Lb21tYW5kbyBpZ25vcmllcnQ6ICIrY21kLDIwKTsKK30KKworLy8gU2VuZCBIYW5kbGVyIGZ1ZXIgZGFzIGNvbW0uY2hhbm5lbCBNb2R1bCB2b24gR01DUAorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9jb21tX2NoYW5uZWxfdjFfc2VuZChtYXBwaW5nIGRhdGEpCit7CisgIC8vIEdhbnogc2ltcGVsOiBlaW5mYWNoIHJhdXNzZW5kZW4uLi4KKyAgLy8gQ29yZSB1ZWJlcmdpYnQgYmVpbSBFaW5zY2hhbHRlbiAwIGFscyBkYXRhLiBEaWVzZXMgbW9kdWwgbXVzcyBhYmVyIGJlaW0KKyAgLy8gRWlzbmNoYWx0ZW4gbml4IG1hY2hlbi4gQWxzbyBudXIgaWdub3JpZXJlbi4KKyAgaWYgKG1hcHBpbmdwKGRhdGEpKQorICAgIEdNQ1Bfc2VuZCgiY29tbS5jaGFubmVsIiwgZGF0YSk7Cit9CisKKy8vIFJlY3YgSGFuZGxlciBmdWVyIGRhcyBNRy5yb29tIE1vZHVsIHZvbiBHTUNQCisvLyBHZXJ1ZmVuIGJlaSBFbXBmYW5nIHZvbiBLb21tYW5kb3Mgdm9tIENsaWVudC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfTUdfcm9vbV92MV9yZWN2KHN0cmluZyBjbWQsIG1peGVkIGFyZ3MpCit7CisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfTUdfcm9vbV92MV9yZWN2IiwKKyAgICAgICJDbGllbnQtS29tbWFuZG8gaWdub3JpZXJ0OiAiK2NtZCwyMCk7Cit9CisKKy8vIFNlbmQgSGFuZGxlciBmdWVyIGRhcyBjb21tLmNoYW5uZWwgTW9kdWwgdm9uIEdNQ1AKK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfTUdfcm9vbV92MV9zZW5kKG1hcHBpbmcgZGF0YSkKK3sKKyAgLy8gQmVrb21tdCBpbW1lciAwIGFscyA8ZGF0YT4gdWViZXJnZWJlbiB1bmQgc3VjaHQgc2ljaCBkaWUgRGF0ZW4gYXVzIGRlbQorICAvLyBSYXVtIHp1c2FtbWVuLgorCisgIC8vIEJhZWguIFdhcnVtIHdpcmQgZGFzIGRlbm4gb2huZSBFbnYgZ2VydWZlbi4gOi0oCisgIGlmICghZW52aXJvbm1lbnQoKSkKKyAgICByZXR1cm47CisKKyAgLy8gQmxpbmQgZ2lidCBlcyBhdWNoIHBlciBHTUNQIG5peC4KKyAgaWYgKENhbm5vdFNlZSgxKSkKKyAgICByZXR1cm47CisKKyAgaW50IHJlc3RyID0gZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfTUFQX1JFU1RSSUNUSU9OUyk7CisKKyAgaWYgKHJlc3RyICYgTVJfTk9JTkZPKQorICAgIHJldHVybjsgLy8gZ2FyIGtlaW5lIGluZm8gc2VuZGVuLgorCisgIC8vIEFubWVya3VuZzogaW50X3Nob3J0KCkgd2FlcmUgY29vbC4gRHVtbWVyd2Vpc2UgdWViZXJ0cmFlZ3QgZGFzIGF1Y2gKKyAgLy8gc2ljaHRiYXJlIEF1c2dhbmdlIHVuZCBPYmpla3RlLiBJbnNvZmVybjogZ2VodCBuaWNodC4KKyAgZGF0YSA9IChbCisgICAgICBQX1NIT1JUOiBwcm9jZXNzX3N0cmluZyhlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9JTlRfU0hPUlQpfHwiIikrIi4iLAorICAgICAgImRvbWFpbiI6IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0RPTUFJTikgfHwgInVuYmVrYW5udCIsCisgICAgICBdKTsKKworICAvLyBzaWNodGJhcmUgQXVzZ2FlbmdlIGF1c2dlYmVuCisgIG1peGVkIGhpZGUgPSBlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9ISURFX0VYSVRTKTsKKyAgaWYgKGhpZGUgJiYgIXBvaW50ZXJwKGhpZGUpKQorICAgICAgZGF0YVsiZXhpdHMiXSA9ICh7fSk7ICAgLy8gYWxsZSB2ZXJzdGVja2VuCisgIGVsc2UKKyAgeworICAgICAgLy8gUXVlcnkoKSB2ZXJ3ZW5kZW4sIGRhbWl0IHNvd29obCBub3JtYWxlIGFscyBhdWNoIFNwZWNpYWwgRXhpdHMKKyAgICAgIC8vIGtvbW1lbi4uLiBEaWUgU3VtbWUgdm9uIGJlaWRlbiB3dWVyZGUgYXVjaCBnZWhlbiwgYWJlciBkYW5uIGhhdCBtYW4KKyAgICAgIC8vIHp3ZWkgdW5ub2V0aWdlIEZpbHRlciBpbiBkZW4gUXVlcnltZXRob2Rlbi4gSG5nbC4KKyAgICAgIG1hcHBpbmcgZXhpdHMgPSBlbnZpcm9ubWVudCgpLT5RdWVyeShQX0VYSVRTLCBGX1ZBTFVFKSB8fCAoW10pOworICAgICAgaWYgKHBvaW50ZXJwKGhpZGUpKQorICAgICAgICBkYXRhWyJleGl0cyJdID0gbV9pbmRpY2VzKGV4aXRzKSAtIGhpZGU7CisgICAgICBlbHNlCisgICAgICAgIGRhdGFbImV4aXRzIl0gPSBtX2luZGljZXMoZXhpdHMpOworICB9CisKKyAgaWYgKHJlc3RyICYgTVJfTk9VSUQpCisgICAgZGF0YVsiaWQiXSA9ICIiOworICBlbHNlCisgICAgZGF0YVsiaWQiXSA9IGhhc2goVExTX0hBU0hfTUQ1LCBvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSk7CisKKyAgR01DUF9zZW5kKCJNRy5yb29tLmluZm8iLCBkYXRhKTsKK30KKworCisvLyBIYW5kbGVyIGZ1ZXIgZGFzICJjaGFyIiBNb2R1bCB2b24gR01DUCAoTW9kdWwgdm9uIEFhcmR3b2xmKQorLy8gR2VydWZlbiwgd2VubiBEYXRlbiB6dSBzZW5kZW4gc2luZC4KK3Byb3RlY3RlZCB2b2lkIEdNQ1Btb2RfY2hhcl92MV9zZW5kKG1hcHBpbmcgZGF0YSkKK3sKKyAgbWFwcGluZyBzcXVldWUgPSBtX2FsbG9jYXRlKDQsMCk7CisgIHN0cnVjdCBnbWNwX21vZF9zIG1vZCA9IGdtY3BkYXRhWyJjaGFyIl07CisgIC8vIG1vZC0+ZGF0YSBmdW5naWVydCBoaWVyIGF1Y2ggYWxzIENhY2hlIGRlciBEYXRlbi4gRGllIG11c3MgbWFuIG5hZW1saWNoCisgIC8vIGxlaWRlciBpbW1lciBhbGxlIHNlbmRlbiwgbmljaHQgbnVyIGRpZSBnZWFlbmRlcnRlbi4KKyAgaWYgKCFtYXBwaW5ncChkYXRhKSkKKyAgeworICAgIC8vIEFsbGUgdmVyZnVlZ2JhcmVuIEluZm9ybWF0aW9uZW4gc2VuZGVuLi4uCisgICAgbW9kLT5kYXRhID0gbV9hbGxvY2F0ZSg0KTsKKyAgICBtX2FkZChtb2QtPmRhdGEsICJjaGFyLmJhc2UiLCAoWyJuYW1lIjogcXVlcnlfcmVhbF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFjZSI6IFF1ZXJ5UHJvcChQX1JBQ0UpXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsImNoYXIudml0YWxzIiwgKFsiaHAiOiBRdWVyeVByb3AoUF9IUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmEiOiBRdWVyeVByb3AoUF9TUCldKSApOworICAgIG1fYWRkKG1vZC0+ZGF0YSwiY2hhci5zdGF0cyIsIChbICJzdHIiOiBRdWVyeUF0dHJpYnV0ZShBX1NUUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCI6IFF1ZXJ5QXR0cmlidXRlKEFfSU5UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGV4IjogUXVlcnlBdHRyaWJ1dGUoQV9ERVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb24iOiBRdWVyeUF0dHJpYnV0ZShBX0NPTikgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsImNoYXIuc3RhdHVzIiwgKFsibGV2ZWwiOiBRdWVyeVByb3AoUF9MRVZFTCkgXSkgKTsKKyAgICBtX2FkZChzcXVldWUsImNoYXIuYmFzZSIpOworICAgIG1fYWRkKHNxdWV1ZSwiY2hhci52aXRhbHMiKTsKKyAgICBtX2FkZChzcXVldWUsImNoYXIuc3RhdHMiKTsKKyAgICBtX2FkZChzcXVldWUsImNoYXIuc3RhdHVzIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgLy8gbnVyIGRpZSBpbiBkYXRhIGVudGhhbHRlbmVuIHNlbmRlbi4KKyAgICAvLyBqZXR6dCBlcnN0bWFsIGFsbGVzIGF1cyBkYXRhIHNvIHNvcnRpZXJlbiwgd2llIGVzIGdlc2VuZGV0IHdlcmRlbgorICAgIC8vIG11c3MuLi4gKnNldWZ6KgorICAgIGZvcmVhY2goc3RyaW5nIGtleSwgbWl4ZWQgdmFsIDogZGF0YSkKKyAgICB7CisgICAgICBzd2l0Y2goa2V5KQorICAgICAgeworICAgICAgICBjYXNlIFBfSFA6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbImNoYXIudml0YWxzIl0gKz0gKFsiaHAiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsImNoYXIudml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9TUDoKKyAgICAgICAgICAobW9kLT5kYXRhKVsiY2hhci52aXRhbHMiXSArPSAoWyJtYW5hIjogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJjaGFyLnZpdGFscyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfTkFNRToKKyAgICAgICAgY2FzZSBQX1JBQ0U6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbImNoYXIuYmFzZSJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsImNoYXIuYmFzZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFfREVYOgorICAgICAgICBjYXNlIEFfU1RSOgorICAgICAgICBjYXNlIEFfQ09OOgorICAgICAgICBjYXNlIEFfSU5UOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJjaGFyLnN0YXRzIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5zdGF0cyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfTEVWRUw6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbImNoYXIuc3RhdHVzIl0gKz0gKFtrZXk6IHZhbF0pOworICAgICAgICAgIG1fYWRkKHNxdWV1ZSwiY2hhci5zdGF0dXMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgR01DUF9ERUJVRygiR01DUG1vZF9jaGFyX3YxX3NlbmQoKSIsCisgICAgICBzcHJpbnRmKCJEYXRhIHJlYWR5OiAlTywgU2VuZHF1ZXVlOiAlTyIsbW9kLT5kYXRhLCBzcXVldWUpLDUwKTsKKworICAvLyBKZXR6dCBkaWUgc3F1ZXVlIHNlbmRlbi4uLgorICBmb3JlYWNoKHN0cmluZyBrZXkgOiBzcXVldWUpCisgIHsKKyAgICBHTUNQX3NlbmQoa2V5LCAobW9kLT5kYXRhKVtrZXldKTsKKyAgfQorfQorCisvLyBIYW5kbGVyIGZ1ZXIgZGFzICJjaGFyIiBNb2R1bCB2b24gR01DUCAoTW9kdWwgdm9uIEFhcmR3b2xmKQorLy8gR2VydWZlbiBiZWkgRW1wZmFuZyB2b24gS29tbWFuZG9zIHZvbSBDbGllbnQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX2NoYXJfdjFfcmVjdihzdHJpbmcgY21kLCBtaXhlZCBkYXRhKQoreworICAvLyBkaWVzZXMgTW9kdWwgYmlldGV0IGRlbSBDbGllbnQga2VpbmUgS29tbWFuZG9zIGFuLCBkYWhlciBpZ25vcmllcmVuLgorICBHTUNQX0RFQlVHKCJHTUNQbW9kX2NoYXJfdjFfcmVjdiIsIkNsaWVudC1Lb21tYW5kbyBpZ25vcmllcnQ6ICIrY21kLDIwKTsKK30KKworCisvLyBIYW5kbGVyIGZ1ZXIgZGFzICJDaGFyIiBNb2R1bCB2b24gR01DUCAoTW9kdWwgdm9uIElSRSkKKy8vIEdlcnVmZW4sIHdlbm4gRGF0ZW4genUgc2VuZGVuIHNpbmQuCitwcm90ZWN0ZWQgdm9pZCBHTUNQbW9kX0NoYXJfdjFfc2VuZChtYXBwaW5nIGRhdGEpCit7CisgIG1hcHBpbmcgc3F1ZXVlID0gbV9hbGxvY2F0ZSg0LDApOworICBzdHJ1Y3QgZ21jcF9tb2RfcyBtb2QgPSBnbWNwZGF0YVsiQ2hhciJdOworICAvLyBtb2QtPmRhdGEgZnVuZ2llcnQgaGllciBhdWNoIGFscyBDYWNoZSBkZXIgRGF0ZW4uIERpZSBtdXNzIG1hbiBuYWVtbGljaAorICAvLyBsZWlkZXIgaW1tZXIgYWxsZSBzZW5kZW4sIG5pY2h0IG51ciBkaWUgZ2VhZW5kZXJ0ZW4uCisgIGlmICghbWFwcGluZ3AoZGF0YSkpCisgIHsKKyAgICAvLyBBbGxlIHZlcmZ1ZWdiYXJlbiBJbmZvcm1hdGlvbmVuIHNlbmRlbi4uLgorICAgIG1vZC0+ZGF0YSA9IG1fYWxsb2NhdGUoNCk7CisgICAgbV9hZGQobW9kLT5kYXRhLCJDaGFyLlZpdGFscyIsIChbImhwIjogUXVlcnlQcm9wKFBfSFApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcCI6IFF1ZXJ5UHJvcChQX1NQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4aHAiOiBRdWVyeVByb3AoUF9NQVhfSFApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhtcCI6IFF1ZXJ5UHJvcChQX01BWF9TUCkgXSkgKTsKKyAgICBtX2FkZChtb2QtPmRhdGEsIkNoYXIuU3RhdHVzIiwgKFsibGV2ZWwiOiBRdWVyeVByb3AoUF9MRVZFTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWxkIjogUXVlcnlQcm9wKFBfR1VJTEQpIF0pICk7CisgICAgbV9hZGQoc3F1ZXVlLCJDaGFyLlZpdGFscyIpOworICAgIG1fYWRkKHNxdWV1ZSwiQ2hhci5TdGF0dXMiKTsKKyAgICAvLyBkaWVzIHdpcmQgZGlyZWt0IGdlc2VuZGV0LCB3ZWlsIGVzIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbiBtdXNzLiAod2lyZAorICAgIC8vIG51ciBiZWltIFN0YXJ0IGRlcyBNb2R1bHMgZ2VzZW5kZXQpLgorICAgIEdNQ1Bfc2VuZCgiQ2hhci5TdGF0dXNWYXJzIiwgKFsKKyAgICAgICAgICAibGV2ZWwiOiAiU3BpZWxlcnN0dWZlIiwgImd1aWxkIjogIkdpbGRlIiBdKSApOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIG51ciBkaWUgaW4gZGF0YSBlbnRoYWx0ZW5lbiBzZW5kZW4uCisgICAgLy8gamV0enQgZXJzdG1hbCBhbGxlcyBhdXMgZGF0YSBzbyBzb3J0aWVyZW4sIHdpZSBlcyBnZXNlbmRldCB3ZXJkZW4KKyAgICAvLyBtdXNzLi4uICpzZXVmeioKKyAgICBmb3JlYWNoKHN0cmluZyBrZXksIG1peGVkIHZhbCA6IGRhdGEpCisgICAgeworICAgICAgc3dpdGNoKGtleSkKKyAgICAgIHsKKyAgICAgICAgY2FzZSBQX0hQOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJDaGFyLlZpdGFscyJdICs9IChbImhwIjogdmFsXSk7CisgICAgICAgICAgbV9hZGQoc3F1ZXVlLCJDaGFyLlZpdGFscyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfU1A6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIkNoYXIuVml0YWxzIl0gKz0gKFsibXAiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIkNoYXIuVml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9NQVhfSFA6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIkNoYXIuVml0YWxzIl0gKz0gKFsibWF4aHAiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIkNoYXIuVml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9NQVhfU1A6CisgICAgICAgICAgKG1vZC0+ZGF0YSlbIkNoYXIuVml0YWxzIl0gKz0gKFsibWF4bXAiOiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIkNoYXIuVml0YWxzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9MRVZFTDoKKyAgICAgICAgY2FzZSBQX0dVSUxEOgorICAgICAgICAgIChtb2QtPmRhdGEpWyJDaGFyLlN0YXR1cyJdICs9IChba2V5OiB2YWxdKTsKKyAgICAgICAgICBtX2FkZChzcXVldWUsIkNoYXIuU3RhdHVzIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIEdNQ1BfREVCVUcoIkdNQ1Btb2RfQ2hhcl92MV9zZW5kKCkiLAorICAgICAgc3ByaW50ZigiRGF0YSByZWFkeTogJU8sIFNlbmRxdWV1ZTogJU8iLG1vZC0+ZGF0YSwgc3F1ZXVlKSw1MCk7CisKKyAgLy8gSmV0enQgZGllIHNxdWV1ZSBzZW5kZW4uLi4KKyAgZm9yZWFjaChzdHJpbmcga2V5IDogc3F1ZXVlKQorICB7CisgICAgR01DUF9zZW5kKGtleSwgKG1vZC0+ZGF0YSlba2V5XSk7CisgIH0KK30KKworLy8gSGFuZGxlciBmdWVyIGRhcyAiY2hhciIgTW9kdWwgdm9uIEdNQ1AgKE1vZHVsIHZvbiBBYXJkd29sZikKKy8vIEdlcnVmZW4gYmVpIEVtcGZhbmcgdm9uIEtvbW1hbmRvcyB2b20gQ2xpZW50LgorcHJvdGVjdGVkIHZvaWQgR01DUG1vZF9DaGFyX3YxX3JlY3Yoc3RyaW5nIGNtZCwgbWl4ZWQgYXJncykKK3sKKyAgLy8gZGllc2VzIE1vZHVsIGJpZXRldCBkZW0gQ2xpZW50IGtlaW5lIEtvbW1hbmRvcyBhbiwgZGFoZXIgaWdub3JpZXJlbi4KKyAgR01DUF9ERUJVRygiR01DUG1vZF9DaGFyX3YxX3JlY3YiLCJDbGllbnQtS29tbWFuZG8gaWdub3JpZXJ0OiAiK2NtZCwyMCk7Cit9CisKKworLy8gSGFuZGxlciwgZGVyIHZvbiB0ZWxuZXRuZWcuYyBnZXJ1ZmVuIHdpcmQuCitwcml2YXRlIHZvaWQgX3N0ZF9yZV9oYW5kbGVyX2dtY3Aoc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm9wdGFyZ3MpCit7CisgIHN3aXRjaChhY3Rpb24pCisgIHsKKyAgICBjYXNlIExPQ0FMT046CisgICAgICAvLyBzdXBlciEKKyAgICAgIEdNQ1BfREVCVUcoInJlY3Y6IiwgIkxPQ0FMT04iLDEwKTsKKyAgICAgIGdtY3BkYXRhID0gKFtdKTsKKyAgICAgIG9wdC0+ZGF0YSA9IGdtY3BkYXRhOyAgIC8vIGRhdGVuIGF1Y2ggZG9ydCBhYmxlZ2VuLgorICAgICAgLy8gQ29yZW1vZHVsZSBpbiBkZXIgVmVyc2lvbiAxIHJlZ2lzdHJpZXJlbiAoZXMgZ2lidCBudXIgZWluZSkuCisgICAgICBHTUNQX3JlZ2lzdGVyX21vZHVsZSgiQ29yZSAxIik7CisjaWZkZWYgX19HTUNQX0RFQlVHX18KKyAgICAgIEdNQ1Btb2RfQ29yZV92MV9yZWN2KCJDb3JlLkRlYnVnIiwzMCk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DQUxPRkY6CisgICAgICAvLyBhbGxlcyBhYnNjaGFsdGVuIHVuZCBEYXRlbiBsb2VzY2hlbgorICAgICAgR01DUF9ERUJVRygicmVjdjoiLCAiTE9DQUxPRkYiLDEwKTsKKyAgICAgIG9wdC0+ZGF0YSA9IDA7CisgICAgICBnbWNwZGF0YSA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFTU9URU9OOgorICAgIGNhc2UgUkVNT1RFT0ZGOgorICAgICAgLy8gSHVjaC4gQXVmIENsaWVudHNlaXRlIGlzdCBHTUNQIGVpZ2VudGxpY2ggbmllIGFuLiBJZ25vcmllcmVuLi4uCisgICAgICBHTUNQX0RFQlVHKCJyZWN2OiIsICJIdWg/IFJFTU9URSBzdGF0ZSBjaGFuZ2VkPyIsNTApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQjoKKyAgICAgIC8vIERlciBlaWdlbnRsaWNoIGludGVyZXNzYW50ZSBGYWxsLi4uIEdNQ1AtS29tbWFuZG9zCisgICAgICBpZiAoIW1hcHBpbmdwKGdtY3BkYXRhKSkgcmV0dXJuOyAvLyBHTUNQIHdvaGwgbmljaHQgZWluZ2VzY2hhbHRldC4uLgorICAgICAgc3RyaW5nIGNtZDsKKyAgICAgIG1peGVkIGFyZ3M7CisgICAgICBzdHJpbmcgcGF5bG9hZD10b19zdHJpbmcob3B0YXJncyk7CisgICAgICBHTUNQX0RFQlVHKCJyZWN2IiwgcGF5bG9hZCwxMCk7CisgICAgICBpZiAoc3NjYW5mKHBheWxvYWQsIiVzICVzIiwgY21kLCBhcmdzKSAhPSAyKSB7CisgICAgICAgIC8vIGlzdCB2ZXJtdXRsaWNoIGVpbiBLb21tYW5kbyBvaG5lIGRhdGVuIChvZGVyIE11ZWxsKQorICAgICAgICBjbWQgPSBwYXlsb2FkOworICAgICAgICAvL2FyZ3MgPSAwOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBzdHJpbmcgZXJyPWNhdGNoKGFyZ3MgPSBqc29uX3BhcnNlKGFyZ3MpO25vbG9nKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgeworICAgICAgICAgIHByaW50ZigiXG5GZWhsZXIgYmVpbSBQYXJzZW4gZWluZXIgR01DUC1OYWNocmljaHQ6ICVzLiAiCisgICAgICAgICAgICAgICAgICJOYWNocmljaHQgd2FyOiAnJXMnXG4iCisgICAgICAgICAgICAgICAgICJCZWZlaGw6ICclcycsIEFyZ3VtZW50OiAnJXMnXG5cbiIsZXJyLHBheWxvYWQsY21kLGFyZ3N8fCIiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEdNQ1BfREVCVUcoInJlY3YiLCBzcHJpbnRmKCJDb21tYW5kOiAlcywgRGF0YTogJU8iLCBjbWQsIGFyZ3MpLDIwKTsKKworICAgICAgc3RyaW5nICpjbWRwYXJ0cyA9IGV4cGxvZGUoY21kLCAiLiIpOworICAgICAgc3RydWN0IGdtY3BfbW9kX3MgbW9kOworICAgICAgc3RyaW5nIG1vZG5hbWU7CisgICAgICAvLyB2ZXJzdWNoLCBlaW4gTW9kdWwgZnVlciBkYXMgS29tbWFuZG8genUgZmluZGVuLiBBbmZhbmdlbiBtaXQgZGVyCisgICAgICAvLyBBbm5haG1lLCBkYXNzIGJpcyB6dW0gbGV0enRlbiBQdW5rdCBkZXIgTW9kdWxuYW1lIGdlaHQgdW5kIGRhbm4KKyAgICAgIC8vIGluIGplZGVtIGNhc2UgZWluZW4gUHVua3Qga3VlcnplciB3ZXJkZW5kLgorICAgICAgc3dpdGNoKHNpemVvZihjbWRwYXJ0cykpCisgICAgICB7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICBtb2RuYW1lID0gaW1wbG9kZShjbWRwYXJ0c1swLi4yXSwiLiIpOworICAgICAgICAgIEdNQ1BfREVCVUcoInRyeWluZyBtb2RuYW1lLi4uICIsIG1vZG5hbWUsIDIwICk7CisgICAgICAgICAgaWYgKG1lbWJlcihnbWNwZGF0YSwgbW9kbmFtZSkpIHsKKyAgICAgICAgICAgIG1vZCA9IGdtY3BkYXRhW21vZG5hbWVdOworICAgICAgICAgICAgZnVuY2FsbChtb2QtPnJlY3ZjbCwgY21kLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBGYWxsLXRocm91Z2ghCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICBtb2RuYW1lID0gaW1wbG9kZShjbWRwYXJ0c1swLi4xXSwiLiIpOworICAgICAgICAgIEdNQ1BfREVCVUcoInRyeWluZyBtb2RuYW1lLi4uICIsIG1vZG5hbWUsIDIwKTsKKyAgICAgICAgICBpZiAobWVtYmVyKGdtY3BkYXRhLCBtb2RuYW1lKSkgeworICAgICAgICAgICAgbW9kID0gZ21jcGRhdGFbbW9kbmFtZV07CisgICAgICAgICAgICBmdW5jYWxsKG1vZC0+cmVjdmNsLCBjbWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEZhbGwtdGhyb3VnaCEKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIG1vZG5hbWUgPSBpbXBsb2RlKGNtZHBhcnRzWzAuLjBdLCIuIik7CisgICAgICAgICAgR01DUF9ERUJVRygidHJ5aW5nIG1vZG5hbWUuLi4gIiwgbW9kbmFtZSwgMjApOworICAgICAgICAgIGlmIChtZW1iZXIoZ21jcGRhdGEsIG1vZG5hbWUpKSB7CisgICAgICAgICAgICBtb2QgPSBnbWNwZGF0YVttb2RuYW1lXTsKKyAgICAgICAgICAgIGZ1bmNhbGwobW9kLT5yZWN2Y2wsIGNtZCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gSGllciBpc3RzIGpldHp0IG5lbiBGZWhsZXIuCisgICAgICAgICAgR01DUEVSUk9SKHNwcmludGYoIlVua25vd24gR01DUCBtb2R1bGUgZm9yIGNtZCAlcyIsY21kKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgLy8genV2aWVsZSBvZGVyIHp1d2VuaWcgLiA7LSkKKyAgICAgICAgICBHTUNQRVJST1Ioc3ByaW50ZigiSWxsZWdhbCBHTUNQIGNtZCAlcyB3aXRoIGFyZ3MgJU8iLAorICAgICAgICAgICAgICAgIGNtZCwgYXJncykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gc2JkYXRhIGJyYXVjaGVuIHdpciBlaWdlbnRsaWNoIG5pY2h0IG1laHIuCisgICAgICBvcHQtPnJlX3dpc2hlcy0+c2JkYXRhID0gMDsKKyAgICAgIGJyZWFrOworICB9IC8vIHN3aXRjaCAoYWN0aW9uKQorfQorCisvLyB3aXJkIHZvbiBiYXNlLmMgbmFjaCBLb25uZWt0aWVydW5nIGdlcnVmZW4uCisvLyBEYXJmIGFiZXIgZXJzdCBnZXJ1ZmVuIHdlcmRlbiwgd2VubiBkYXMgU3BpZWxlcm9iamVrdCBmZXJ0aWcgaW5pdGlhbGlzaWVydAorLy8gdW5kIGVpbmdlbGVzZW4gaXN0LgorcHJvdGVjdGVkIHZvaWQgc3RhcnR1cF90ZWxuZXRfbmVncygpCit7CisgIC8vIGV2dGwuIHdhciBlcyBlaW4gcmVjb25uZWN0LCBkYW5uIHN0ZWh0IGluIGdtY3Agbm9jaCBhbHRlciBrcmFtIGRyaW4uIERlcgorICAvLyBtdXNzIHdlZywga29lbm50ZSBqYSBhdWNoIHNlaW4sIGRhc3MgZGVyIENsaWVudCAoamV0enQpIGtlaW4gR01DUAorICAvLyBtZWhyCisgIC8vIHdpbGwuCisgIGdtY3BkYXRhID0gMDsKKworICAvLyBIYWNrIGJlc29uZGVyZXIgU29ydGU6IEdNQ1Agc29sbCBsb2thbCBlaW5nZXNjaGFsdGV0IHNlaW4uIEF1ZgorICAvLyBDbGllbnRzZWl0ZW4gaXN0IGVzIGxhdXQgUHJvdG9rb2xsIG5pY2h0IHZvcmdlc2VoZW4sIGRhaGVyIGR1ZXJmZW4KKyAgLy8gKHNvbGx0ZW4/KSB3aXIga2VpbiBETyBhbiBkZW4gQ2xpZW50IHNlbmRlbi4gV2lyIGJyYXVjaGVuIGFiZXIgZWluZW4KKyAgLy8gcmVtb3RlIGhhbmRsZXIsIHVtIGRpZSBXdWVuc2NoZSB2b20gQ2xpZW50IHp1IHZlcmFyYmVpdGVuLiBEYWhlciBlcnN0bWFsCisgIC8vIG51ciBkZW4gbG9jYWwgaGFuZGxlciBiaW5kZW4gKHVuZCBnbGVpY2h6ZWl0aWcgbmVnb3RpYXRpb24gYW5zdG9zc2VuKSB1bmQKKyAgLy8gZGFubiBkaXJla3QgZGFuYWNoIGRlbiByZW1vdGUgaGFuZGxlciBhdWNoIGJpbmRlbiAob2huZSBlcm5ldXRlCisgIC8vIG5lZ290aWF0aW9uIHp1IHN0YXJ0ZW4pLiBBY2hqYSB1bmQgd2lyIG5laG1lbiBkaWUgZ2xlaWNoZSBGdW5rdGlvbiBhbHMKKyAgLy8gSGFuZGxlciBmdWVyIHJlbW90ZSB1bmQgbG9rYWwuCisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX0dNQ1AsIDAsICMnX3N0ZF9yZV9oYW5kbGVyX2dtY3AsIDEpOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9HTUNQLCAjJ19zdGRfcmVfaGFuZGxlcl9nbWNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ19zdGRfcmVfaGFuZGxlcl9nbWNwLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9xdWVzdHMuYyBiL3N0ZC9wbGF5ZXIvcXVlc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlNTY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvcXVlc3RzLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvcXVlc3RzLmMgLS0gcXVlc3QgaGFuZGxlcgorLy8KKy8vICRJZDogcXVlc3RzLmMgOTE0MiAyMDE1LTAyLTA0IDIyOjE3OjI5WiBaZXNzdHJhICQKKworLy8gRGllc2VzIE1vZHVsIGVuaGFlbHQgZGllIFF1ZXN0LXNwZXppZmlzY2hlbiBUZWlsZSBkZXIgUGxheWVyb2JqZWt0ZS4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDxwbGF5ZXIvbGlmZS5oPgorI2luY2x1ZGUgPHBsYXllci9xdWVzdC5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPGxpdmluZy9saWZlLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlICIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgiCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtYWlsLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZXZlbnRzLmg+CisKK21peGVkIHF1ZXN0czsKKworaW50IFF1ZXJ5UXVlc3Qoc3RyaW5nIHF1ZXN0bmFtZSk7CisvLyBsb2NhbCBwcm9wZXJ0aWVzIHByb3RvdHlwZQorc3RhdGljIG1peGVkIF9xdWVyeV9xdWVzdHMoKTsKK3N0YXRpYyBpbnQgICBfcXVlcnlfcXVlc3Rwb2ludHMoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBTZXQoUF9RVUVTVFMsIE5PU0VUTUVUSE9ELCBGX1NFVF9NRVRIT0QpOworICBTZXQoUF9RVUVTVFMsIHF1ZXN0cyA9IChbXSksIEZfVkFMVUUpOworICBTZXQoUF9RVUVTVFMsIFNFQ1VSRUQsIEZfTU9ERSk7CisgIFNldChQX1FQLCBTQVZFLCBGX01PREUpOworICBTZXQoUF9RUCwgU0VDVVJFRCwgRl9NT0RFKTsKK30KKwordmFyYXJncyBpbnQgR2l2ZVF1ZXN0KHN0cmluZyBxdWVzdG5hbWUsIHN0cmluZyBtZXNzYWdlKSB7CisgIG1peGVkICpxdWVzdCA9IFFNLT5RdWVyeVF1ZXN0KHF1ZXN0bmFtZSk7CisKKyAgLy8gUXVlc3RuYW1lIHVuZ3VlbHRpZworICBpZiAoIXF1ZXN0fHwhcG9pbnRlcnAocXVlc3QpfHxxdWVzdD09KHt9KSkKKyAgICByZXR1cm4gR1FfS0VZX0lOVkFMSUQ7CisgIC8vIFVuYmVmdWd0ZXIgWnVncmlmZiBhdWYgZGVha3RpdmllcnRlIFF1ZXN0CisgIGlmICghcXVlc3RbNl0mJiFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgcmV0dXJuIEdRX0lTX0lOQUNUSVZFOworICAvLyBVbmJlZnVndGVyIFp1Z3JpZmYKKyAgaWYgKG1lbWJlcihxdWVzdFsyXSwgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSk9PS0xICYmCisgICAgICAhSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgIHJldHVybiBHUV9JTExFR0FMX09CSjsKKworICAvLyBHaWxkZSB3aXJkIGluIGplZGVtIEZhbGwgaW5mb3JtaWVydC4KKyAgc3RyaW5nIGd1aWxkPUdVSUxEX0RJUitRdWVyeVByb3AoUF9HVUlMRCk7CisgIGlmIChmaW5kX29iamVjdChndWlsZCkgfHwgZmlsZV9zaXplKGd1aWxkKyIuYyIpPi0xKQorICAgIGNhdGNoKCBjYWxsX290aGVyKGd1aWxkLCAiTm90aWZ5R2l2ZVF1ZXN0IiwgTUUsIHF1ZXN0bmFtZSk7cHVibGlzaCApOworCisgIC8vIFF1ZXN0IGJlcmVpdHMgZ2VzZXR6dAorICBpZiAoUXVlcnlRdWVzdChxdWVzdG5hbWUpKQorICAgIHJldHVybiBHUV9BTFJFQURZX1NFVDsKKyAgQWRkRXhwKHF1ZXN0WzFdKTsKKyAgcXVlc3RzICs9IChbIHF1ZXN0bmFtZSA6IHF1ZXN0WzBdOyB0aW1lKCkgXSk7CisgIGZvcmNlX3NhdmUoKTsKKyAgLy8gRXZlbnQgYXVzbG9lc2VuCisgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfUVVFU1RfU09MVkVELChbCisgICAgICAgICAgICAgRV9PQkpFQ1Q6IE1FLAorICAgICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQoTUUpLAorICAgICAgICAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KCksCisgICAgICAgICAgICAgRV9RVUVTVE5BTUU6IHF1ZXN0bmFtZSwKKyAgICAgICAgICAgICBFX1FQX0dSQU5URUQ6IHF1ZXN0WzBdIF0pICk7CisKKyAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZSE9IiIpIHsKKyAgICBpZiAobWVzc2FnZSE9Il9fc2lsZW50X18iKSB7CisgICAgICBtZXNzYWdlPWltcGxvZGUoZXhwbG9kZShtZXNzYWdlLCJAQG5hbWVAQCIpLAorICAgICAgICAgIGNhcGl0YWxpemUocXVlcnlfcmVhbF9uYW1lKCkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBtZXNzYWdlPSIiOworICAgIH0KKyAgfQorICBlbHNlCisgICAgbWVzc2FnZT1jYXBpdGFsaXplKHF1ZXJ5X3JlYWxfbmFtZSgpKQorICAgICAgKyIgaGF0IGdlcmFkZSBlaW4gQWJlbnRldWVyIGJlc3RhbmRlbjogIisgcXVlc3RuYW1lKyJcbiI7CisgIGlmKG1lc3NhZ2UhPSIiKQorICAgIGNhdGNoKFFNLT5DaGFubmVsKG1lc3NhZ2UpO3B1Ymxpc2gpOworICBjYXRjaChRTS0+U2VuZE1haWwocXVlc3RuYW1lLCBxdWVzdCwgTUUpO3B1Ymxpc2gpOworICByZXR1cm4gT0s7Cit9CisKK2ludCBEZWxldGVRdWVzdChzdHJpbmcgcXVlc3RuYW1lKSB7CisgIC8vIFF1ZXN0IGlzdCBuaWNodCBnZXNldHp0CisgIGlmKCFRdWVyeVF1ZXN0KHF1ZXN0bmFtZSkpCisgICAgcmV0dXJuIERRX05PVF9TRVQ7CisKKyAgbWl4ZWQgKnF1ZXN0ID0gUU0tPlF1ZXJ5UXVlc3QocXVlc3RuYW1lKTsKKyAgLy8gUXVlc3RuYW1lIHVuZ3VlbHRpZworICBpZiAoIXF1ZXN0fHwhcG9pbnRlcnAocXVlc3QpfHxxdWVzdD09KHt9KSkKKyAgICByZXR1cm4gRFFfS0VZX0lOVkFMSUQ7CisgIC8vIFVuYmVmdWd0ZXIgWnVncmlmZgorICBpZiAoIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICByZXR1cm4gRFFfSUxMRUdBTF9PQko7CisgIEFkZEV4cCgtcXVlc3RbMV0pOworICBtX2RlbGV0ZShxdWVzdHMsIHF1ZXN0bmFtZSk7CisgIGZvcmNlX3NhdmUoKTsKKyAgcmV0dXJuIE9LOworfQorCitpbnQgUXVlcnlRdWVzdChzdHJpbmcgcXVlc3RuYW1lKSB7CisgIGludCBkdW1teTsKKworICAvLyBHYWVzdGUgaGFiZW4ga2VpbmUgUXVlc3RzLgorICBpZiggc3NjYW5mKCBnZXR1aWQoKSwgImdhc3QlZCIsIGR1bW15ICkgPT0gMSApCisgICAgcmV0dXJuIFFRX0dVRVNUOworICAvLyBVZWJlcmdlYmVuZXIgUGFyYW1ldGVyICJxdWVzdG5hbWUiIHVuZ3VlbHRpZyBvZGVyIGxlZXI/CisgIGlmKCFxdWVzdG5hbWUgfHwgIXN0cmluZ3AocXVlc3RuYW1lKSB8fCBxdWVzdG5hbWUgPT0gIiIpCisgICAgcmV0dXJuIFFRX0tFWV9JTlZBTElEOworICAvLyBRdWVzdG5hbWUgaXN0IHRhdHNhZWNobGljaCBpbiBkZXIgUXVlc3RsaXN0ZSBlbnRoYWx0ZW4/IEFsbGVzIGtsYXIhCisgIGlmICggbWVtYmVyKHF1ZXN0cywgcXVlc3RuYW1lKSApCisgICAgcmV0dXJuIE9LOworICAvLyBBbnNvbnN0ZW4gd2FyIGRlciBOYW1lIHdvaGwgdW5ndWVsdGlnLgorICByZXR1cm4gUVFfS0VZX0lOVkFMSUQ7Cit9CisKK2ludCBNb2RpZnlRdWVzdFRpbWUoc3RyaW5nIHFuYW1lLCBpbnQgd2hlbikgeworICBpZiAoIHByb2Nlc3NfY2FsbCgpICkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gTnVyIEVNKyBvZGVyIGRlciBUYWdlYnVjaG1hc3RlciBkdWVyZmVuIGRpZSBXZXJ0ZSBhZW5kZXJuLgorICBpZiAoICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgJiYKKyAgICBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT0iL2Qvd2FsZC9sZXVzZWwvcXVlc3Qvb2Jqcy90YWdlYnVjaC1tYXN0ZXIiKQorICAgIHJldHVybiAtMTsKKworICAvLyBRdWVzdGxpc3RlIGlzdCB1bmVyd2FydGV0IGtlaW4gTWFwcGluZy4KKyAgaWYgKCAhbWFwcGluZ3AocXVlc3RzKSApCisgICAgcmV0dXJuIC0yOworCisgIC8vIEtlaW4gUXVlc3RuYW1lIGFuZ2VnZWJlbiwgb2RlciBTcGllbGVyIGhhdCBkaWVzZSBRdWVzdCB1ZWJlcmhhdXB0IG5pY2h0CisgIC8vIGdlbG9lc3QuCisgIGlmICggIXN0cmluZ3AocW5hbWUpIHx8ICFtZW1iZXIocXVlc3RzLCBxbmFtZSkgKQorICAgIHJldHVybiAtMzsKKworICAvLyBEZXIgVGFnZWJ1Y2htYXN0ZXIgc2V0enQgRWludHJhZWdlIGdnZi4gYXVmIDAsIHdlbm4gZXIga2VpbmUgRGF0ZW4KKyAgLy8gZmluZGV0LCB1bmQgRU0rIHdvbGxlbiBFaW50cmFlZ2UgYXVmIC0xIHNldHplbiBrb2VubmVuLCB1bSBkYXMgRWlubGVzZW4KKyAgLy8gZGVyIERhdGVuIG5vY2ggZWlubWFsIHp1IGVybW9lZ2xpY2hlbiwgZC5oLiBkaWVzZSBXZXJ0ZSBzaW5kIHp1c2FldHpsaWNoCisgIC8vIHp1IGd1ZWx0aWdlbiBaZWl0d2VydGVuIGVybGF1YnQuCisgIGlmICggIWludHAod2hlbikgfHwgd2hlbiA8IC0xIHx8IHdoZW4gPiB0aW1lKCkgKQorICAgIHJldHVybiAtNDsKKworICAvLyBOZXVlbiBXZXJ0IGVpbnRyYWdlbi4KKyAgcXVlc3RzW3FuYW1lLDFdID0gd2hlbjsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeVF1ZXN0VGltZShzdHJpbmcgcW5hbWUpIHsKKyAgcmV0dXJuIHF1ZXN0c1txbmFtZSwxXTsKK30KKworLy8gS29udmVydGllcnQgRGF0ZW5zdHJ1a3R1ciB2b24gcXVlc3RzIGluIGVpbiBNYXBwaW5nIG1pdCBmb2xnZW5kZW0gQXVmYmF1OgorLy8gcXVlc3RzID0gKFsgInF1ZXN0bmFtZSIgOiBBYmVudGV1ZXJwdW5rdGU7IFplaXRfZGVzX1F1ZXN0YWJzY2hsdXNzZXMsIF0pCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUobWl4ZWQgbmV3ZmxhZykgeworICAvLyBHYW56IGZyaXNjaGVyIFNwaWVsZXI/IERhbm4ga2VpbmUgQmVoYW5kbHVuZyBlcmZvcmRlcmxpY2guCisgIGlmICggbmV3ZmxhZyApCisgICAgcmV0dXJuOworICAvLyBXZW5uIGRpZSBRdWVzdGxpc3RlIG5vY2gga2VpbiBNYXBwaW5nIGlzdCwgS29udmVydGllcnVuZyBhbnN0b3NzZW4uCisgIGlmICggIW1hcHBpbmdwKHF1ZXN0cykgKSB7CisgICAgLy8gV2VubiBub2NoIGtlaW5lIFF1ZXN0cyBlaW5nZXRyYWdlbiBzaW5kLCBMZWVybWFwcGluZyBlaW50cmFnZW4uCisgICAgaWYgKCAhc2l6ZW9mKHF1ZXN0cykgKSB7CisgICAgICBxdWVzdHMgPSAoWzoyXSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFZvcnNpY2h0c2hhbGJlciBMZWVyZWludHJhZWdlIHJhdXN6aWVoZW4uCisgICAgcXVlc3RzIC09ICh7KHt9KX0pOworICAgIC8vIExpc3RlIGRlciBRdWVzdHplaXRlbiBhdXMgZGVtIFNwaWVsZXIgYXVzbGVzZW4uIFdlbm4gbmljaHQgdm9yaGFuZGVuLAorICAgIC8vIEFycmF5IG1pdCAtMS1FbGVtZW50ZW4gcGFzc2VuZGVyIExhZW5nZSBlcnpldWdlbi4KKyAgICAvLyAtMSBhbiBhbGxlbiBTdGVsbGVuIGVpbnRyYWdlbiwgd28gYmlzaGVyIGtlaW5lIERhdGVuIHZvcmxpZWdlbi4KKyAgICAvLyBEaWVzZSB3ZXJkZW4gZGFubiB2b20gUXVlc3R0YWdlYnVjaCBkdXJjaCBkaWUgRGF0ZW4gZXJzZXR6dC4KKyAgICBpbnQgKnF0aW1lcyA9IFF1ZXJ5UHJvcCgicXVlc3R0aW1lIil8fGFsbG9jYXRlKHNpemVvZihxdWVzdHMpLCAtMSk7CisgICAgLy8gRmFsbHMgZGllIFF1ZXN0bGlzdGUgbGFlbmdlciBpc3QgYWxzIGRpZSBaZWl0ZW5saXN0ZSwgd2lyZCBsZXR6dGVyZQorICAgIC8vIHVtIGRpZSBmZWhsZW5kZSBMYWVuZ2UgaW4gRm9ybSB2b24gLTEtZWludHJhZWdlbiBlcmdhZW56dCwgdW50ZXIgZGVyCisgICAgLy8gQW5uYWhtZSwgZGFzcyBkaWUgZmVobGVuZGVuIEVpbnRyYWVnZSBiaXNoZXIgbGVkaWdsaWNoIG5pY2h0CisgICAgLy8gZWluZ2VsZXNlbiB3dXJkZW4uIEltIHVtZ2VrZWhydGVuIEZhbGwgd2VyZGVuIGFsbGUgWmVpdGVuIHZlcndvcmZlbiwKKyAgICAvLyBkYSBkaWVzZXIgRmFsbCBlaW50cml0dCwgd2VubiBlaW5lbSBTcGllbGVyIGVpbmUgUXVlc3QgYXVzZ2V0cmFnZW4KKyAgICAvLyB3dXJkZSB1bmQgZGllIExpc3RlbiBpbiBkZXIgVmVyZ2FuZ2VuaGVpdCBuaWNodCBzeW5jaHJvbiBnZWhhbHRlbgorICAgIC8vIHd1cmRlbi4KKyAgICBpZiAoIHNpemVvZihxdGltZXMpIDwgc2l6ZW9mKHF1ZXN0cykgKSB7CisgICAgICBxdGltZXMgKz0gYWxsb2NhdGUoc2l6ZW9mKHF1ZXN0cyktc2l6ZW9mKHF0aW1lcyksIC0xKTsKKyAgICB9CisgICAgaWYgKCBzaXplb2YocXRpbWVzKSA+IHNpemVvZihxdWVzdHMpICkgeworICAgICAgcXRpbWVzID0gYWxsb2NhdGUoc2l6ZW9mKHF1ZXN0cyksIC0xKTsKKyAgICB9CisgICAgLy8gUXVlc3RkYXRlbiB1bmQgUXVlc3R6ZWl0ZW4genVzYW1tZW5wZmVyY2hlbi4gRXJnaWJ0IGZvbGcuIE1hcHBpbmc6CisgICAgLy8gdGVtcCA9IChbICh7UXVlc3RuYW1lMSwgUVAxfSkgOiBRdWVzdHplaXQsIC4uLiBdKQorICAgIG1hcHBpbmcgdGVtcCA9IG1rbWFwcGluZyhxdWVzdHMsIHF0aW1lcyk7CisgICAgcXVlc3RzID0gbV9hbGxvY2F0ZShzaXplb2YocXVlc3RzKSwyKTsKKyAgICBmb3JlYWNoKG1peGVkIHFkYXRhLCBpbnQgcXRpbWUgOiB0ZW1wKSB7CisgICAgICBxdWVzdHMgKz0gKFsgcWRhdGFbMF0gOiBxZGF0YVsxXTsgcXRpbWUgXSk7CisgICAgfQorICAgIGlmIChRdWVyeVByb3AoInF1ZXN0dGltZSIpKSB7CisgICAgICBTZXRQcm9wKCJxdWVzdHRpbWUiLDApOworICAgICAgU2V0KCJxdWVzdHRpbWUiLCBTQVZFLCBGX01PREVfQUQpOworICAgIH0KKyAgfQorfQorCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBpbnQgX3F1ZXJ5X3F1ZXN0cG9pbnRzKCkgeworICBpbnQgcXA7CisKKyAgaWYgKCAhbWFwcGluZ3AocXVlc3RzKSB8fCAhc2l6ZW9mKHF1ZXN0cykgKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjbG9zdXJlIHFxcCA9IHN5bWJvbF9mdW5jdGlvbigiUXVlcnlRdWVzdFBvaW50cyIsIFFNKTsKKyAgLy8gRGllIGFrdHVlbGwgZ3VlbHRpZ2VuIEFiZW50ZXVlcnB1bmt0ZSBhdXMgZGVtIFF1ZXN0bWFzdGVyIGhvbGVuIHVuZAorICAvLyBkaWUgUXVlc3RsaXN0ZSBkYW1pdCBha3R1YWxpc2llcmVuLiBxcCB3aXJkIGFscyBSZWZlcmVueiBtaXQgdWViZXJnZWJlbgorICAvLyBkYW1pdCBkYXMgQWRkaXRpb25zZXJnZWJuaXMgYXVjaCBuYWNoIGRlbSBEdXJjaGxhdWYgYXVzc2VyaGFsYiBkZXIKKyAgLy8gQ2xvc3VyZSB2ZXJmdWVnYmFyIGlzdC4KKyAgLy8gRmFsbHMgQWJlbnRldWVycHVua3RlIDwgMCBleGlzdGllcmVuLCB3aXJkIGRpZSBlbnRzcHJlY2hlbmRlIFF1ZXN0CisgIC8vIGF1cyBkZXIgTGlzdGUgYXVzZ2V0cmFnZW4uCisgIHdhbGtfbWFwcGluZyhxdWVzdHMsCisgICAgZnVuY3Rpb24gdm9pZCAoc3RyaW5nIHFuYW1lLCBpbnQgcXBvaW50cywgaW50IHF0aW1lLCBpbnQgc3VtKQorICAgIHsKKyAgICAgIHFwb2ludHMgPSBmdW5jYWxsKHFxcCwgcW5hbWUpOworICAgICAgaWYgKHFwb2ludHM8MCkKKyAgICAgICAgbV9kZWxldGUocXVlc3RzLHFuYW1lKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3VtICs9IHFwb2ludHM7CisgICAgfSwgJnFwKTsKKworICBTZXQoUF9RUCwgcXApOworICByZXR1cm4gcXA7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfcXVlc3RzKCkgeworICByZXR1cm4gY29weShxdWVzdHMpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9yZXB1dGF0aW9uLmMgYi9zdGQvcGxheWVyL3JlcHV0YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIzZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9yZXB1dGF0aW9uLmMKQEAgLTAsMCArMSw3MyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cmVwdXRhdGlvbi5oPgorCitwcml2YXRlIG1hcHBpbmcgcmVwdXRhdGlvbnMgPSAoWyBdKTsKKworLyoKKyAqIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gUmVwdXRhdGlvbi1JRCBpbSBSZXBtYXN0ZXIKKyAqIHZhbHVlID0gV2VydCB1bSBkZW4gZGllIFJlcHV0YXRpb24gZ2VhZW5kZXJ0IHdlcmRlbiBzb2xsLAorICogICAgICAgICBwb3NpdGl2IG9kZXIgbmVnYXRpdgorICogc2lsZW50ID0gS2VpbmUgU3RkLU1lbGR1bmcgYXVzZ2ViZW4KKyAqCisgKiBSZXR1cm46CisgKiBSRVBfUkVUX1dST05HQVJHUyA9IEZhbHNjaGUgQXJndW1lbnRlCisgKiBSRVBfUkVUX0lOQUNUSVZFID0gUmVwIGluYWt0aXYgKGthbm4gZGVyemVpdCBuaWNodCBnZWFlbmRlcnQgd2VyZGVuKQorICogUkVQX1JFVF9JTlZBTElEVUlEID0gVW56dWxhZXNzaWUgVUlECisgKiBSRVBfUkVUX0FMUkVBRFlNQVggPSBSZXAgYmVyZWl0cyBtYXhpbXVtIC8gbWluaW11bQorICogUkVQX1JFVF9JTlZBTElEUkVQID0gUmVwdXRhdGlvbiBuaWNodCB2b3JoYW5kZW4KKyAqCisgKiBSRVBfUkVUX1NVQ0NFU1MgPSBSZXB1dGF0aW9uIHd1cmRlIHZlcmFlbmRlcnQKKyAqIFJFUF9SRVRfU1VDQ0VTU0NVVCA9IFJlcHV0YXRpb24gd3VyZGUgYXVmIE1pbiAvIE1heCB2ZXJhZW5kZXJ0CisgKi8KK3B1YmxpYyB2YXJhcmdzIGludCBDaGFuZ2VSZXB1dGF0aW9uKHN0cmluZyByZXBpZCwgaW50IHZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaWxlbnQpIHsKKyAgc3RyaW5nIHVpZCwgY2hhbmdlbXNnOyBpbnQgbmV3dmFsOyBtYXBwaW5nIHJlcDsKKyAgCisgIGlmKCFpbnRwKHZhbHVlKSB8fCAhdmFsdWUgfHwgIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpKSAKKyAgICByZXR1cm4gUkVQX1JFVF9XUk9OR0FSR1M7CisgIGlmKCFtYXBwaW5ncChyZXAgPSBSRVBNQVNURVItPkdldFJlcHV0YXRpb25EYXRhKHJlcGlkKSkpCisgICAgcmV0dXJuIFJFUF9SRVRfSU5WQUxJRFJFUDsKKyAgaWYoIShyZXBbImZsYWdzIl0gJiBSRVBfRkxBR19BQ1RJVkUpKQorICAgIHJldHVybiBSRVBfUkVUX0lOQUNUSVZFOworICBpZihSRVBNQVNURVItPkNoZWNrVmFsaWRVaWQocmVwaWQsIHByZXZpb3VzX29iamVjdCgpKSA8IDEpCisgICAgcmV0dXJuIFJFUF9SRVRfSU5WQUxJRFVJRDsKKyAgaWYocmVwdXRhdGlvbnNbcmVwaWRdID49IFJFUF9NQVhJTVVNIHx8IHJlcHV0YXRpb25zW3JlcGlkXSA8PSBSRVBfTUlOSU1VTSkgCisgICAgcmV0dXJuIFJFUF9SRVRfQUxSRUFEWU1BWDsKKworICBpZihyZXB1dGF0aW9uc1tyZXBpZF0gKyB2YWx1ZSA+IFJFUF9NQVhJTVVNKSAKKyAgICBuZXd2YWwgPSByZXB1dGF0aW9uc1tyZXBpZF0gKyB2YWx1ZSAtIFJFUF9NQVhJTVVNOworICBlbHNlIGlmKHJlcHV0YXRpb25zW3JlcGlkXSAtIHZhbHVlIDwgUkVQX01JTklNVU0pCisgICAgbmV3dmFsID0gcmVwdXRhdGlvbnNbcmVwaWRdICsgdmFsdWUgKyBSRVBfTUlOSU1VTTsKKworICBpZighc2lsZW50ICYmCisgICAgIHN0cmluZ3AoY2hhbmdlbXNnID0gUkVQTUFTVEVSLT5HZXREZWZhdWx0Q2hhbmdlTXNnKHJlcGlkLCAKKyAgICAgICBuZXd2YWwgfHwgdmFsdWUpKSkKKyAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBjaGFuZ2Vtc2cpOworCisgIHJlcHV0YXRpb25zW3JlcGlkXSArPSBuZXd2YWwgfHwgdmFsdWU7CisKKyAgcmV0dXJuIG5ld3ZhbCA/IFJFUF9SRVRfU1VDQ0VTU0NVVCA6IFJFUF9SRVRfU1VDQ0VTUzsKK30KKworLyoKKyAqIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gUmVwdXRhdGlvbi1JRCBpbSBSZXBtYXN0ZXIKKyAqCisgKiBSZXR1cm46CisgKiAwID0gUmVwdXRhdGlvbiBub2NoIG5pY2h0IHZlcmFlbmRlcnQgLyBlbnRoYWx0ZW4gCisgKiAhMCA9IFJlcHV0YXRpb25zd2VydAorICovCitwdWJsaWMgaW50IEdldFJlcHV0YXRpb24oc3RyaW5nIHJlcGlkKSB7IHJldHVybiByZXB1dGF0aW9uc1tyZXBpZF07IH0KKworLyoKKyAqIFJldHVybjoKKyAqIE1hcHBpbmdrb3BpZSBhbGxlciBnZXNwZWljaGVydGVuIFJlcHV0YXRpb25zd2VydAorICovCitwdWJsaWMgbWFwcGluZyBHZXRSZXB1dGF0aW9ucygpIHsgcmV0dXJuIGNvcHkocmVwdXRhdGlvbnMpOyB9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3Jlc3RyaWN0aW9ucy5jIGIvc3RkL3BsYXllci9yZXN0cmljdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFlMTRjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9yZXN0cmljdGlvbnMuYwpAQCAtMCwwICsxLDEzMCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9yZXN0cmljdGlvbnMuYyAtLSBjb250YWluZXIgYXNwZWN0IG9mIHBsYXllcnMKKy8vCisvLyAkSWQ6IHJlc3RyaWN0aW9ucy5jIDkwMjAgMjAxNS0wMS0xMCAyMTo0OTo0MVogWmVzc3RyYSAkCisKKy8vIFRoaXMgaXMgYSBzaW1wbGUgY29udGFpbmVyIHRvIHB1dCBvYmplY3RzIGluLiBJdCBkZWZpbmVzIGFsbCBmdW5jdGlvbnMKKy8vIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgYW4gb2JqZWN0IHdoaWNoIGNhbiBiZSBmaWxsZWQgd2l0aAorLy8gb3RoZXIgdGhpbmdzLgorLy8KKy8vIEl0IHdpbGwgc3VwcG9ydCByZXN0cmljdGlvbnMgZm9yIHZvbHVtZSwgd2VpZ2h0IGV0Yy4KKy8vCisvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGRlZmluZWQ6CisvLyBQX01BWF9XRUlHSFQgLSBtYXhpbXVtIHdlaWdodCB3aGljaCBjb250YWluZXIgY2FuIGNhcnJ5CisvLyBQX1dFSUdIVF9DT05URU5UUyAtIGN1cnJlbnQgY29udGVudHMKKy8vIFBfV0VJR0hUIC0gYnVpbHRpbiBwcm9wZXJ0eTogcmVhZC0+dG90YWwgd2VpZ2h0LCB3cml0ZS0+b3duIHdlaWdodAorLy8KKy8vIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW9uIG9mIHdlaWdodAorLy8gTWF5QWRkV2VpZ2h0KHdlaWdodCkgLSBDYW4gPHdlaWdodD4gYmUgaW5zZXJ0ZWQ/CisvLyBBZGRXZWlnaHQod2VpZ2h0KSAtIEFkZCBhbiBhbW91bnQgb2YgPHdlaWdodD4KKy8vCisvLyBJTVBPUlRBTlQ6IHVuaXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGdyYW1zIChnKS4KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9jb250YWluZXIvcmVzdHJpY3Rpb25zIjsKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aG9vay5oPgorI2luY2x1ZGUgPGxpdmluZy9za2lsbHMuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKy8vTGlzdGUgdm9uIE9iamVrdGVuLCBpbiBkZW5lbiBJbnNlcnROb3RpZnkoKSBnZXJ1ZmVuIHdpcmQsIHdlbm4gZXR3YXMgaW4gZGVuCisvL1NwaWVsZXIgYmV3ZWd0IHd1cmRlLgorbm9zYXZlIG9iamVjdCAqSW5zZXJ0SG9va3M9KHt9KTsKKworLy8gbG9jYWwgcHJvcGVydGllcyBwcm90b3R5cGVzCitzdGF0aWMgaW50IF9xdWVyeV9tYXhfd2VpZ2h0KCk7CitzdGF0aWMgbWl4ZWQgX3NldF9mcm9nKG1peGVkIGFyZyk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKworICBTZXQoUF9NQVhfV0VJR0hULCBOT1NFVE1FVEhPRCwgRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfTUFYX1dFSUdIVCwgU0VDVVJFRCwgRl9NT0RFKTsKKyAgb2ZmZXJIb29rKEhfSE9PS19JTlNFUlQsIDEpOworfQorCisvLyAqKioqIGxvY2FsIHByb3BlcnR5IG1ldGhvZHMKK3N0YXRpYyBpbnQgX3F1ZXJ5X21heF93ZWlnaHQoKSB7CisgIGludCBzdHIsdmFsOworICBtaXhlZCBza2k7CisgIAorICBpZiAoUXVlcnlQcm9wKFBfR0hPU1QpICYmICFJU19XSVpBUkQoTUUpKQorICAgIHJldHVybiAwOworICBzdHI9UXVlcnlBdHRyaWJ1dGUoQV9TVFIpOworICBza2kgPSBVc2VTa2lsbChTS19DQVJSWSwgKFtTSV9TS0lMTEFSRyA6IHN0ciBdKSk7CisKKyAgaWYgKCFpbnRwKHNraSkpCisgICAgc2tpID0gMDsKKyAgCisgIGlmIChzdHI8MCkgeworICAgIHZhbD05MjAwK3N0cioxNjArKGludClza2k7CisgICAgaWYgKHZhbDwzMDAwKSB2YWw9MzAwMDsKKyAgICByZXR1cm4gdmFsOworICB9CisgIHZhbCA9IDkyMDArc3RyKjgwMCsoaW50KXNraTsKKyAgaWYgKHZhbDwzMDAwKQorICAgIHZhbCA9IDMwMDA7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBtaXhlZCBfc2V0X2Zyb2cobWl4ZWQgYXJnKSB7CisgIG1peGVkIHJlczsKKyAgCisgIHJlcz1TZXQoUF9GUk9HLGFyZyk7CisgIGlmIChyZXMpCisgICAgU2V0UHJvcChQX0FUVFJJQlVURVNfTU9ESUZJRVIsKHsiI2Zyb3NjaCIsKFtBX1NUUjotMzBdKX0pKTsKKyAgZWxzZQorICAgIFNldFByb3AoUF9BVFRSSUJVVEVTX01PRElGSUVSLCh7IiNmcm9zY2giLDAgfSkpOworICByZXR1cm4gcmVzOworfQorCitwdWJsaWMgdm9pZCBOb3RpZnlJbnNlcnQob2JqZWN0IG9iLCBvYmplY3Qgb2xkZW52KQoreworICA6Ok5vdGlmeUluc2VydChvYiwgb2xkZW52KTsKKyAgLy8gQWxsZSBMaXN0ZW5lciBpbSBuZXVlbiBIb29rc3lzdGVtIHZvbSBJbnNlcnRIb29rIGluZm9ybWllcmVuCisgIEhvb2tGbG93KEhfSE9PS19JTlNFUlQsIG9iKTsKKyAgLy8gQWxsZSBMaXN0ZW5lciBpbSBhbHRlbiBJbnNlcnRIb29rIGluZm9ybWllcmVuCisgIGlmIChzaXplb2YoSW5zZXJ0SG9va3MpKQorICB7CisgICAgZm9yZWFjaChvYmplY3QgaDogJkluc2VydEhvb2tzKQorICAgIHsKKyAgICAgIGlmIChoICYmIGVudmlyb25tZW50KGgpID09IE1FKQorICAgICAgICBoLT5JbnNlcnROb3RpZnkob2IpOworICAgICAgZWxzZQorICAgICAgICBoPTA7CisgICAgfQorICAgIEluc2VydEhvb2tzLT0oezB9KTsgLy8gZ2VudWxsdGUgRWxlbWVudGUgbG9lc2NoZW4KKyAgfQorfQorCit2b2lkIEFkZEluc2VydEhvb2sob2JqZWN0IG9iKQoreworICBpZiAobWVtYmVyKEluc2VydEhvb2tzLG9iKSE9LTEgfHwgZW52aXJvbm1lbnQob2IpIT10aGlzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgSW5zZXJ0SG9va3MrPSh7b2J9KTsKK30KKwordm9pZCBSZW1vdmVJbnNlcnRIb29rKG9iamVjdCBvYikKK3sKKyAgSW5zZXJ0SG9va3MtPSh7b2J9KTsKK30KKworb2JqZWN0ICpRdWVyeUluc2VydEhvb2tzKCkKK3sKKyAgcmV0dXJuIEluc2VydEhvb2tzOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NoYWRvd3MvYXJrX2h1bmdlcl9zaGFkb3cuYyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZDZkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvYXJrX2h1bmdlcl9zaGFkb3cuYwpAQCAtMCwwICsxLDU0IEBACisvKiBEZXIgU2hhZG93IGZ1ZXIgZGVuIEh1bmdlcmZsdWNoICovCisvKiAvZC9lYmVuZS9hcmsvd29sZi9vYmovaHVuZ2VyLmMgICovCisvKiBTaGFkb3c6IC9zdGQvcGxheWVyL3NoYWRvd3MvYXJrX2h1bmdlcl9zaGFkb3cuYyAqLworLyogT3JpZ2luYWw6IC9kL2ViZW5lL2Fyay93b2xmL29iai9odW5nZXJfb2JqLmMgKi8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworI2RlZmluZSBCUyBicmVha19zdHJpbmcKKworb2JqZWN0IHNwaWVsZXI7CisKK3ZvaWQgU2V0emVuKG9iamVjdCBzcCkKK3sKKyBpZiAoIW9iamVjdHAoc3ApIHx8ICFpbnRlcmFjdGl2ZShzcCkpIHJldHVybiBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyBzcGllbGVyPXNwOworIGlmICghc2hhZG93KHNwLDEpKSBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworaW50IF9xdWVyeV9mb29kKCkgeyByZXR1cm4gMDsgfQorCitpbnQgX3F1ZXJ5X21heF9mb29kKCkgeyByZXR1cm4gMDsgfQorCitpbnQgZWF0X2Zvb2QoaW50IHN0cmVuZ3RoLCBpbnQgdGVzdG9ubHkpCit7CisgaWYgKHN0cmVuZ3RoPT0wKSByZXR1cm4gMTsKKyBpZiAoc3RyZW5ndGg+MCkKKyB7CisgIHN0cmVuZ3RoPTA7CisgIGlmIChzcGllbGVyKQorICB7CisgICAgdGVsbF9vYmplY3Qoc3BpZWxlciwgQlMoIkR1IGhhc3QgendhciBlaW5lbiB0aWVyaXNjaGVuIEh1bmdlciwgZG9jaCBpcmdlbmR3YXMgc2FndCBEaXIsIGRhc3MgRHUgZGFzLCB3YXMgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHUgZ2VyYWRlIGVzc2VuIHdpbGxzdCwgbmljaHQgbWVociBpbiBEZWluZW4gTWFnZW4gYmVrb21tc3QuIERhcyBpc3QgemllbWxpY2ggIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VmYWVocmxpY2gsIGhvZmZlbnRsaWNoIHZlcmh1bmdlcnN0IER1IG5pY2h0ICEiLCA3OCkpOworICAgIHJldHVybiAwOworICB9CisgfQorIGVsc2UKKyB7CisgIGlmIChzcGllbGVyKQorICB7CisgICB0ZWxsX29iamVjdChzcGllbGVyLCBCUygiRGVpbiBIdW5nZXIgdmVydGllZnQgc2ljaCBzbyBudXIsIER1IGxlaWRlc3QgSG9lbGxlbnF1YWxlbi4iLCA3OCkpOworICAgc3BpZWxlci0+cmVkdWNlX2hpdF9wb2ludHMoc3RyZW5ndGgpOworICB9CisgIHJldHVybiAwOworIH0KK30KKwordm9pZCBMb2VzY2hlbigpIHsKKyAgICB1bnNoYWRvdygpOworICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL2Jsb2NrX3NoYWRvdy5jIGIvc3RkL3BsYXllci9zaGFkb3dzL2Jsb2NrX3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTQzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvYmxvY2tfc2hhZG93LmMKQEAgLTAsMCArMSw0NyBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitwcml2YXRlIG5vc2F2ZSBvYmplY3QgcGw7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYoIElTX0JMVUUoTUUpICkgcmV0dXJuOworICBzaGFkb3coIFBMLCAxKTsKKyAgcGwgPSBQTDsKK30KKworaW50CitBZGRFeHAoaW50IGVwKQoreworICBvYmplY3QgYmxvY2s7CisgIGludCBkaWZmLCBsaW07CisKKyAgYmxvY2sgPSBwcmVzZW50KCJcbiBibG9jayIsIHBsKTsKKyAgbGltID0gMzAgKyByYW5kb20oMTApOworCisgIGlmICggZXAgPiBsaW0gJiYJCQkJICAgICAgLy8gTWluZGVzdHdlcnQKKyAgICAgICBwcmV2aW91c19vYmplY3QoKSAmJgorICAgICAgICggcHJldmlvdXNfb2JqZWN0KCkgPT0gcGwgfHwJCSAgICAgIC8vIHpCLiBHaXZlUXVlc3QoKQorCSAoIGxpdmluZyhwcmV2aW91c19vYmplY3QoKSkgJiYgCSAgICAgIC8vIE9kZXIgTlBDcworCSAgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpCisJICkKKyAgICAgICApCisgICAgICkKKyAgeworICAgIGRpZmYgPSBibG9jay0+R3V0c2NocmVpYmVuKGVwLWxpbSk7CisgICAgcmV0dXJuIHBsLT5BZGRFeHAobGltK2RpZmYpOworICB9CisgIHJldHVybiBwbC0+QWRkRXhwKGVwKTsKK30KKwordm9pZAorU2VoZXJIYXRHZW51ZygpCit7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NoYWRvd3MvbW9ycGhfc2hhZG93LmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvbW9ycGhfc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjOTdjNAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYwpAQCAtMCwwICsxLDU5OCBAQAorLyogLSotIGxwYyAtKi0gKi8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIG1vcnBoLmMKKy8vCisvLyAgIChjKSBUcm95ICh0cm95QG1nLm11ZC5kZSkKKy8vICAgS29waWVyZW4sIFZlcmFlbmRlcm4gb2RlciBXZWl0ZXJnYWJlOiBuYSBrbGFyLCBpbW1lciB6dSwgamUgc2NobGltbWVyIAorLy8gICB1bSBzbyBiZXNzZXIKKy8vCisvLyAgIE9iamVrdCBlcnN0ZWxsdDogMTQuMDguMDEsIFRyb3kKKy8vCisvLyAgIERpZXNlciBzaGFkb3cgaW1wbGVtZW50aWVydCBnZW5lcmlzY2hlIFZlcndhbmRsdW5nZW4uIEltIEdlZ2Vuc2F0eiBvZGVyCisvLyAgIGluIEVyZ+RuenVuZyB6dW0gVGFybmhlbG0gc2luZCBkaWVzZSBuaWNodCBhdWYgZGllIEJlc2NocmVpYnVuZworLy8gICBiZXNjaHLkbmt0LCBzb25kZXJuIHNjaGxhZ2VuIHNpY2ggYXVjaCBpbiBhbmRlcmVuIFByb3BlcnRpZXMgbmllZGVyLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordmFyYXJncyBpbnQgcmVtb3ZlKCBpbnQgc2lsZW50ICk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIFByb3BlcnR5LUVpbnN0ZWxsdW5nZW4gamUgbmFjaCBSYXNzZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcHJpdmF0ZSBtYXBwaW5nIG1vcnBoX3Byb3BlcnRpZXM7CisKK3ByaXZhdGUgb2JqZWN0IHBsOyAvLyBkZXIgc2NoYXR0aWVydGUgU3BpZWxlcgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBzdGFydF9zaGFkb3coIFNwaWVsZXIsIFByb3BlcnRpZXMgKQorLy8KKy8vICAgU3RhcnRldCBkYXMgU2hhZG93aW5nIHZvbiBTcGllbGVyLiBQcm9wZXJ0aWVzIGlzdCBlaW4gTWFwcGluZyBtaXQKKy8vICAgZGVuIHp1IORuZGVybmRlbiBQcm9wZXJ0aWVzLiBEb3J0IG5pY2h0IHZvcmhhbmRlbmUgUHJvcGVydGllcyB3ZXJkZW4KKy8vICAgenVtIFNwaWVsZXIgZHVyY2hnZXJlaWNodC4gRXMgd2VyZGVuIGRvcnQgZW50d2VkZXIgZWluemVsbmUgV2VydGUKKy8vICAgZXJ3YXJ0ZXQgKEJlaXNwaWVsOiAoWyBQX0dFTkRFUjogTUFMRSBdKSksIGRpZSBkYW5uIGb8ciBhbGxlIFJhc3NlbgorLy8gICBnZWx0ZW4sIG9kZXIgY2xvc3VyZXMsIGRpZSBkYW5uIGF1c2dlZvxocnQgd2VyZGVuIHVudGVyINxiZXJnYWJlIGRlcgorLy8gICBTcGllbGVycmFzc2UgYWxzIFBhcmFtZXRlciBvZGVyIGFiZXIgTWFwcGluZ3MgbWl0IGRlbiBSYXNzZW5uYW1lbgorLy8gICAoQmVpc3BpZWw6IChbIFBfR0VOREVSOiAoWyAiTWVuc2NoIjogTkVVVEVSLCAiRWxmIjogRkVNQUxFLAorLy8gICAiWndlcmciOiBNQUxFLCAuLi4gXSmgXSkpLiBJc3QgZWluZSBSYXNzZSBpbiBkZW0gUmFzc2VubWFwcGluZyBuaWNodAorLy8gICB2b3JoYW5kZW4sIHNvIHdpcmQgZGFzIFByb3BlcnR5IHp1bSBTcGllbGVyIGR1cmNoZ2VyZWljaHQuIFNwZXppZWxsCisvLyAgIGJlaGFuZGVsdCB3ZXJkZW4gUF9JRFMgKHNpZWhlIF9xdWVyeV9pZHMoKSkgdW5kIFBfTkFNRSAoc2llaGUKKy8vICAgX3F1ZXJ5X25hbWUoKSkuIAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBzdGFydF9zaGFkb3coIG9iamVjdCBfcGwsIG1hcHBpbmcgcHJlc2V0ICkKK3sKKyAgaWYgKCAhY2xvbmVwKCB0aGlzX29iamVjdCgpICkgKQorICAgIHJldHVybiAxOworICBpZiAoICFfcGwgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoIF9wbCApICkKKyAgICByZXR1cm4gcmVtb3ZlKCk7CisgIHBsID0gX3BsOworICBtb3JwaF9wcm9wZXJ0aWVzID0gZGVlcF9jb3B5KCBwcmVzZXQgKTsKKyAgc2hhZG93KCBwbCwgMSApOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgc3RvcF9zaGFkb3coKQorLy8KKy8vICAgQmVlbmRldCBkYXMgU2hhZG93aW5nIHVuZCB6ZXJzdPZydCBkaWVzZXMgT2JqZWt0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHN0b3Bfc2hhZG93KCAvKiB2b2lkICovICkKK3sKKyAgaWYgKCAhY2xvbmVwKCB0aGlzX29iamVjdCgpICkgKQorICAgIHJldHVybiAwOworICB1bnNoYWRvdygpOworICByZXR1cm4gcmVtb3ZlKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9wcm9wZXJ0eSggUHJvcGVydHkgKQorLy8KKy8vICAgR2VuZXJpc2NoZSBQcm9wZXJ0eS1NYXNraWVydW5nLiBsaWVmZXJ0IGF1cyBtb3JwaF9wcm9wZXJ0aWVzIGRlbiB6dXIKKy8vICAgUmFzc2UgZGVzIFRy5GdlcnMgcGFzc2VuZGVuIEVpbnRyYWcuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbm9tYXNrIHN0YXRpYyBtaXhlZCBfcXVlcnlfcHJvcGVydHkoIHN0cmluZyBwcm9wICkKK3sKKyAgc3RyaW5nIHJhY2U7CisKKyAgLy8gUmFzc2UgaG9sZW4uCisgIGlmICggSVNfTEVBUk5FUihwbCkgKQorICAgIHJhY2UgPSAiTWFnaWVyIjsKKyAgZWxzZSAvLyBfcXVlcnlfcmFjZSgpIGlzdCBub3R3ZW5kaWcsIHVtIGNsb3N1cmVzIHp1IHVtZ2VoZW4uCisgICAgcmFjZSA9IHBsLT5fcXVlcnlfcmFjZSgpOworCisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzLCBwcm9wICkgPT0gMCApCisgICAgcmV0dXJuIHBsLT5RdWVyeSggcHJvcCApOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0gKSApCisgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSwgcmFjZSApOworICBpZiAoIG1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0gKSApCisgIHsKKyAgICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdLCByYWNlICkgPT0gMCApCisgICAgICByZXR1cm4gcGwtPlF1ZXJ5KCBwcm9wICk7CisgICAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdWyByYWNlIF0gKSApCisgICAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdWyByYWNlIF0gKTsKKworICAgIHJldHVybiBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXTsKKyAgfQorICByZXR1cm4gbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfYXJ0aWNsZSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX0FSVElDTEUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2FydGljbGUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQVJUSUNMRSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfYXZlcmFnZV9zaXplKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVZFUkFHRV9TSVpFCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9hdmVyYWdlX3NpemUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQVZFUkFHRV9TSVpFICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hdmVyYWdlX3dlaWdodCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX0FWRVJBR0VfV0VJR0hUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9hdmVyYWdlX3dlaWdodCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BVkVSQUdFX1dFSUdIVCApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfYm9keSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX0JPRFkKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2JvZHkoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfQk9EWSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfZ2VuZGVyKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfR0VOREVSCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9nZW5kZXIoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfR0VOREVSICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9oYW5kcygpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX0hBTkRTCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWl4ZWQgX3F1ZXJ5X2hhbmRzKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIF9xdWVyeV9wcm9wZXJ0eSggUF9IQU5EUyApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfaWRzKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfSURTIC0gTmljaHQtU3RhbmRhcmQsIGRhIGplIG5hY2ggVXJzcHJ1bmdzLQorLy8gICBnZXNjaGxlY2h0IGRlcyBTcGllbGVycyB6dXPkdHpsaWNoZSBpZHMgZuRsbGlnIHdlcmRlbi4gQWJsYXVmOiBFcyBnaWJ0CisvLyAgIDUgU2Nocml0dGUsIGJlaSBkZXJlbiBqZXdlaWxpZ2VtIFZlcnNhZ2VuIGRpZSBpZHMgZGVzIFNwaWVsZXJzIGR1cmNoLQorLy8gICBnZXJlaWNodCB3ZXJkZW46CisvLyAgIDEuIFBfSURTIGlzdCBpbSBwcm9wZXJ0eS1tYXBwaW5nIHZvcmhhbmRlbgorLy8gICAyLiBhKSBlcyBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXMgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycworLy8gICAgICAgICBhbmdlaORuZ3QgdW5kIHp1cvxja2dlZ2ViZW4uCisvLyAgICAgIGIpIGVzIGlzdCBlaW5lIGNsb3N1cmUuIERpZXNlIHdpcmQgYXVzZ2Vm/GhydCB1bnRlciDcYmVyZ2FiZSBkZXIKKy8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKKy8vICAgICAgICAgKGRpZXNlcyBPYmpla3RzIHVuZCBkZXMgU3BpZWxlcnMpLiBEZXIgRXJnZWJuaXN3ZXJ0IGRlciBjbG9zdXJlCisvLyAgICAgICAgIHdpcmQgZGlyZWt0IHp1cvxja2dlZ2ViZW4uCisvLyAgICAgIGMpIGVzIGlzdCBlaW4gbWFwcGluZy4gSGllciBuZWhtZW4gd2lyIG51biBkYXMg/GJsaWNoZSBSYXNzZW5uYW1lbi0KKy8vICAgICAgICAgbWFwcGluZyBhbiAtPiAzLikKKy8vICAgMy4gRvxyIGRpZSBSYXNzZSBkZXMgU3BpZWxlcnMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXIgaXN0IGVpbiBtYXBwaW5nLiBFcyB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamUgR2VzY2hsZWNodCBESUVTRVMKKy8vICAgICAgICAgT2JqZWt0cyBlaW4gRWludHJhZyB2b3JoYW5kZW4gaXN0LiAtPiA0LikKKy8vICAgNC4gRvxyIGRhcyBHZXNjaGxlY2h0IGRpZXNlcyBPYmpla3RzIHdpcmQgZWluIEVpbnRyYWcgZ2VzdWNodAorLy8gICAgICBhKSBlciBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXIgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycworLy8gICAgICAgICBhbmdlaORuZ3QgdW5kIHp1cvxja2dlZ2ViZW4uCisvLyAgICAgIGIpIGVyIGlzdCBlaW5lIGNsb3N1cmUuIERpZXNlIHdpcmQgYXVzZ2Vm/GhydCB1bnRlciDcYmVyZ2FiZSBkZXIKKy8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKKy8vICAgICAgICAgKGRpZXNlcyBPYmpla3RzIHVuZCBkZXMgU3BpZWxlcnMpLiBEZXIgRXJnZWJuaXN3ZXJ0IGRlciBjbG9zdXJlCisvLyAgICAgICAgIHdpcmQgZGlyZWt0IHp1cvxja2dlZ2ViZW4uCisvLyAgICAgIGMpIGVyIGlzdCBlaW4gbWFwcGluZy4gRXMgd2lyZCBhbmdlbm9tbWVuLCBkYXNzIGplIEdlc2NobGVjaHQgREVTCisvLyAgICAgICAgIFNwaWVsZXJzIGVpbiBFaW50cmFnIHZvcmhhbmRlbiBpc3QuIC0+IDUuKQorLy8gICA1LiBG/HIgZGFzIEdlc2NobGVjaHQgZGVzIFNwaWVsZXJzIHdpcmQgZWluIEVpbnRyYWcgZ2VzdWNodAorLy8gICAgICBhKSBlciBpc3QgZWluIHN0cmluZyBvZGVyIGVpbiBhcnJheTogZXIgd2lyZCBhbiBkaWUgaWRzIGRlcyBTcGllbGVycworLy8gICAgICAgICBhbmdlaORuZ3QgdW5kIHp1cvxja2dlZ2ViZW4uCisvLyAgICAgIGIpIGVyIGlzdCBlaW5lIGNsb3N1cmUuIERpZXNlIHdpcmQgYXVzZ2Vm/GhydCB1bnRlciDcYmVyZ2FiZSBkZXIKKy8vICAgICAgICAgU3BpZWxlci1pZHMsIGRlciBSYXNzZSBkZXMgU3BpZWxlcnMgdW5kIGRlciBHZXNjaGxlY2h0ZXIKKy8vICAgICAgICAgKGRpZXNlcyBPYmpla3RzIHVuZCBkZXMgU3BpZWxlcnMpLiBEZXIgRXJnZWJuaXN3ZXJ0IGRlciBjbG9zdXJlCisvLyAgICAgICAgIHdpcmQgZGlyZWt0IHp1cvxja2dlZ2ViZW4uCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWl4ZWQgX3F1ZXJ5X2lkcyggLyogdm9pZCAqLyApCit7CisgIHN0cmluZyByYWNlOworICBtaXhlZCBpZHM7CisgIGludCBnZW5kZXIsIHNnZW5kZXI7CisKKyAgLy8gVGVzdCAxLgorICBpZHMgPSBwbC0+UXVlcnkoIFBfSURTICk7CisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzLCBQX0lEUyApID09IDAgKQorICAgIHJldHVybiBpZHM7CisKKyAgLy8gUmFzc2UgaG9sZW4uCisgIGlmICggSVNfTEVBUk5FUihwbCkgKQorICAgIHJhY2UgPSAiTWFnaWVyIjsKKyAgZWxzZSAvLyBfcXVlcnlfcmFjZSgpIGlzdCBub3R3ZW5kaWcsIHVtIGNsb3N1cmVzIHp1IHVtZ2VoZW4uCisgICAgcmFjZSA9IHBsLT5fcXVlcnlfcmFjZSgpOworCisgIC8vIEdlc2NobGVjaHRlciBob2xlbgorICBnZW5kZXIgPSBfcXVlcnlfZ2VuZGVyKCk7CisgIHNnZW5kZXIgPSBwbC0+UXVlcnkoIFBfR0VOREVSICk7CisKKyAgLy8gVGVzdCAyLgorICAvLyBzdHJpbmc/IERhbm4gZWluZmFjaCBkZW4gbm9ybWFsZW4gaWRzIGRhenUsIGdlbmF1c28gbWl0IGFycmF5CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSB9KTsKKyAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSwgaWRzLCByYWNlLCBnZW5kZXIsIHNnZW5kZXIgKTsKKyAgLy8gZmFsbHMga2VpbiBtYXBwaW5nLCBkYW5uIHJhdXMKKyAgaWYgKCAhbWFwcGluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0gKSApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBUZXN0IDMuCisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdLCByYWNlICkgPT0gMCApCisgICAgcmV0dXJuIGlkczsKKyAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkcyArICh7IG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSB9KTsKKyAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQorICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF07CisgIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdLCBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cworICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQorICAgIHJldHVybiBpZHM7CisKKyAgLy8gVGVzdCA0LgorICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdLCBnZW5kZXIgKSA9PSAwICkKKyAgICByZXR1cm4gaWRzOworICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGlkcyArICh7IG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gfSk7CisgIGlmICggcG9pbnRlcnAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF07CisgIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0sCisJCSAgICBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cworICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzOworCisgIC8vIFRlc3QgNS4KKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF0sIHNnZW5kZXIgKSA9PSAwICkKKyAgICByZXR1cm4gaWRzOworICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0sCisJCSAgICBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworCisgIHJldHVybiBpZHM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9pc19tb3JwaGVkKCkKKy8vCisvLyAgIFByb3BlcnR5LU1ldGhvZGUgZvxyICJpc19tb3JwaGVkIgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfaXNfbW9ycGhlZCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfbWF4X2hhbmRzKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTUFYX0hBTkRTCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9tYXhfaGFuZHMoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfTUFYX0hBTkRTICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tbXNnaW4oKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NTVNHSU4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21tc2dpbiggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTU1TR0lOICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfbW1zZ291dCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01NU0dPVVQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21tc2dvdXQoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX01NU0dPVVQgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tc2dpbigpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01TR0lOCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIF9xdWVyeV9tc2dpbiggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTVNHSU4gKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tc2dvdXQoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NU0dPVVQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21zZ291dCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTVNHT1VUICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfbmFtZSgpCisvLworLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciBQX05BTUUuIExlaWRlciBpc3QgZGllIHBsYXllci1zaGVsbCBzbyBncm90dGlnLAorLy8gICBkYXNzIPxiZXJhbGwgYW5nZW5vbW1lbiB3aXJkLCBRdWVyeVByb3AoUF9OQU1FKSBsaWVmZXJlIGVpbmVuIFN0cmluZyA6LXwKKy8vICAgVm9sbHN05G5kaWdlcyBQcm9wZXJ0eSBkYWhlciB1bnRlciBfcXVlcnlfbmFtZV9mdWxsKCkuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIF9xdWVyeV9uYW1lKCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgcHJvcDsKKyAgcHJvcCA9IF9xdWVyeV9wcm9wZXJ0eSggUF9OQU1FICk7CisgIGlmICggc3RyaW5ncCggcHJvcCApICkKKyAgICByZXR1cm4gc3ByaW50ZiggcHJvcCwgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICBpZiAoIHBvaW50ZXJwKCBwcm9wICkgKQorICAgIHJldHVybiBtYXAoIHByb3AsCisJCSAgICAgIGxhbWJkYSggKHsgJ2VsLCAncyB9KSwKKwkJCSAgICAgICh7IydzcHJpbnRmLCAnZWwsICdzfSkgKSwKKwkJICAgICAgcGwtPlF1ZXJ5KCBQX05BTUUgKSApWyBXRVIgXTsKKyAgcmV0dXJuIHBsLT5RdWVyeSggUF9OQU1FICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9uYW1lX2Z1bGwoKQorLy8KKy8vICAgUHJvcGVydHktTWV0aG9kZSBm/HIgIm5hbWVfZnVsbCIuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWl4ZWQgX3F1ZXJ5X25hbWVfZnVsbCggLyogdm9pZCAqLyApCit7CisgIG1peGVkIHByb3A7CisgIHByb3AgPSBfcXVlcnlfcHJvcGVydHkoIFBfTkFNRSApOworICBpZiAoIHN0cmluZ3AoIHByb3AgKSApCisgICAgcmV0dXJuIHNwcmludGYoIHByb3AsIHBsLT5RdWVyeSggUF9OQU1FICkgKTsKKyAgaWYgKCBwb2ludGVycCggcHJvcCApICkKKyAgICByZXR1cm4gbWFwKCBwcm9wLAorCQkgICAgICBsYW1iZGEoICh7ICdlbCwgJ3MgfSksCisJCQkgICAgICAoeyMnc3ByaW50ZiwgJ2VsLCAnc30pICksCisJCSAgICAgIHBsLT5RdWVyeSggUF9OQU1FICkgKTsKKyAgcmV0dXJuIHBsLT5RdWVyeSggUF9OQU1FICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9wcmVzYXkoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9QUkVTQVkKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X3ByZXNheSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfUFJFU0FZICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfcmFjZSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1JBQ0UKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X3JhY2UoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX1JBQ0UgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9yYWNlc3RyaW5nKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfUkFDRVNUUklORworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyogX3F1ZXJ5X3JhY2VzdHJpbmcoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZyopX3F1ZXJ5X3Byb3BlcnR5KCBQX1JBQ0VTVFJJTkcgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3NpemUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9TSVpFCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9zaXplKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChpbnQpX3F1ZXJ5X3Byb3BlcnR5KCBQX1NJWkUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3RpdGxlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfVElUTEUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X3RpdGxlKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9USVRMRSApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3dlaWdodCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1dFSUdIVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfd2VpZ2h0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChpbnQpKF9xdWVyeV9wcm9wZXJ0eSggUF9XRUlHSFQgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGlkKCBUZXh0LCBMZXZlbCkKKy8vCisvLyAgIERpZSBJZGVudGlmaXppZXJ1bmcgc3Bpbm50IG1pdCBQX05BTUUtQXJyYXlzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmFyYXJncyBpbnQgaWQoIHN0cmluZyBzdHIsIGludCBsdmwgKQoreworICBzdHJpbmcgcGxuYW1lOworCisgIGlmICggcGwtPlF1ZXJ5UHJvcCggUF9HSE9TVCApICkKKyAgICBpZiAoIHN0ciA9PSAiZ2Vpc3QiICkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKCAoIHNzY2FuZiggc3RyLCAiZ2Vpc3Qgdm9uICVzIiwgcGxuYW1lICkgPT0gMSApICYmCisJICAgICAgcGwtPmlkKCBwbG5hbWUgKSApCisgICAgICByZXR1cm4gMTsKKyAgICBlbHNlIGlmICggKCBzc2NhbmYoIHN0ciwgImdlaXN0ICVzIiwgcGxuYW1lICkgPT0gMSApICYmCisJICAgICAgcGwtPmlkKCBwbG5hbWUgKSApCisgICAgICByZXR1cm4gMTsKKworICByZXR1cm4gcGwtPmlkKCBzdHIsIGx2bCApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBsb25nKCkKKy8vCisvLyAgIERpZSBMYW5nYmVzY2hyZWlidW5nIGltIFNwaWVsZXIgaGFkZXJ0IG1pdCBkZW0gR2VzY2hsZWNodCBORVVURVIuLi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2YXJhcmdzIHN0cmluZyBsb25nKCAvKiB2b2lkICovICkKK3sKKyAgc3RyaW5nIHNsb25nOworICBzbG9uZyA9IHBsLT5sb25nKCk7CisKKyAgaWYgKCBfcXVlcnlfZ2VuZGVyKCkgPT0gTkVVVEVSICkKKyAgeworICAgIHN0cmluZyAqYWxvbmc7CisgICAgaW50IGk7CisKKyAgICAvLyBhbGxlIEVyLXMgdW5kIGVyLXMgc3VjaGVuLi4uCisgICAgYWxvbmcgPSByZWdleHBsb2RlKCBzbG9uZywgIlxcPFtFZV1yXFw+IiApOworICAgIC8vIC4uLiB1bmQgZGFzIHIgZHVyY2ggZWluIHMgZXJzZXR6ZW4uCisgICAgZm9yICggaSA9IDEgOyBpIDwgc2l6ZW9mKCBhbG9uZyApIDsgaSArPSAyICkKKyAgICAgIGFsb25nWyBpIF1bIDEgXSA9ICdzJzsKKyAgICBzbG9uZyA9IGltcGxvZGUoIGFsb25nLCAiIiApOworICB9CisKKyAgcmV0dXJuIHNsb25nOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBzaG9ydCgpCisvLworLy8gICBEaWUgS3VyemJlc2NocmVpYnVuZyBpbSBTcGllbGVyIGhhdCBlaW4gUHJvYmxlbSBtaXQgUF9OQU1FLUFycmF5cworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBzaG9ydCggLyogdm9pZCAqLyApCit7CisgIG1peGVkIG5hbWVzOworICBzdHJpbmcgYW5zd2VyOworICBzdHJpbmcgdGl0bGU7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0lOVklTICkgKQorICAgIGlmICggaW50ZXJhY3RpdmUoIHByZXZpb3VzX29iamVjdCgpICkgJiYKKwkgSVNfTEVBUk5JTkcoIHByZXZpb3VzX29iamVjdCgpICkgKQorICAgICAgcmV0dXJuICIoIiArIHBsLT5RdWVyeSggUF9OQU1FICkgKyAiKSBcbiI7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChzdHJpbmcpMDsKKworICBuYW1lcyA9IF9xdWVyeV9uYW1lX2Z1bGwoKTsKKyAgaWYgKCBzdHJpbmdwKCBuYW1lcyApICkKKyAgICBuYW1lcyA9ICh7IG5hbWVzLCBuYW1lcywgbmFtZXMsIG5hbWVzIH0pOworCisgIGlmICggcGwtPlF1ZXJ5UHJvcCggUF9HSE9TVCApICkKKyAgICBhbnN3ZXIgPSAiRGVyIEdlaXN0ICIgKyBwbC0+UXVlcnlBcnRpY2xlKCBXRVNTRU4sIDAgKSArIG5hbWVzWyBXRVNTRU4gXTsKKyAgZWxzZQorICAgIGFuc3dlciA9IHBsLT5RdWVyeUFydGljbGUoIFdFUiwgMCApICsgbmFtZXNbIFdFUiBdOworICBpZiAoICggdGl0bGUgPSBwbC0+UXVlcnlQcm9wKCBQX1RJVExFICkgKSAmJgorICAgICAgICggdGl0bGUgIT0gIiIgKSApCisgICAgIGFuc3dlciArPSAiICIgKyB0aXRsZTsKKyAgaWYgKCAhaW50ZXJhY3RpdmUoIHBsICkgKQorICAgICBhbnN3ZXIgKz0gIiAobmV0enRvdCkiOworICByZXR1cm4gY2FwaXRhbGl6ZSggYW5zd2VyICkgKyAiLlxuIjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgcmVtb3ZlKCBTY2huYXV6ZSApCisvLworLy8gICBhdWZy5HVtZW4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKQoreworICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAtLSBFTkRFIC0tCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NoYWRvd3MvcG9ueS5jIGIvc3RkL3BsYXllci9zaGFkb3dzL3BvbnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDNkZThkCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3BvbnkuYwpAQCAtMCwwICsxLDU5IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKy8vIAorLy8gRGEgZGVyIFNoYWRvdyBzaWNoIG5pY2h0IGltIFBsYXllciBiZWZpbmRldCwgd2lyZCBlaW4KKy8vIFp1c2F0em9iamVrdCBiZW5vZXRpZ3QuCisvLyA3LjEwLjk3IC0gRGllIEhvb2sgc29sbHRlIGluIGRlbiBWZXJ6ZWljaG5pc3NlbiBkZXIgQmVubmllcXVlc3QKKy8vICAgICAgICAgICB6dSBmaW5kZW4gc2Vpbi4gLSBSdW1hdGEKKworI2RlZmluZSBIT09LICJkL3dhbGQva2Fzc2FuZHJhL2Jlbm5pZS9vYmovcG9ueV9ob29rIgorCitzdGF0aWMgb2JqZWN0IHBsOworCit2b2lkIGNyZWF0ZSgpCit7CisgaWYoIElTX0JMVUUoTUUpICkgcmV0dXJuOworICBzaGFkb3coIFBMLCAxKTsKKyBwbD1QTDsKKyAvL3RlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIkR1IGJlc3RlaWdzdCBkYXMgUG9ueSBzYW10IFNjaGF0dGVuLlxuIik7CisgIGNsb25lX29iamVjdCggSE9PSyApOyAvLyBTdGV1ZXJ1bmcgZGVzIHNoYWRvd3MgdWViZXIgZGllIGhvb2sKK30KKworc3RyaW5nIF9xdWVyeV90aXRsZSgpCit7IAorIGlmKCBwbC0+UXVlcnlQcm9wKFBfR0VOREVSKSA9PSBGRU1BTEUgKQorICAgICByZXR1cm4gImRpZSBQb255cmVpdGVyaW4iOworIHJldHVybiAiZGVyIFBvbnlyZWl0ZXIiOworfQorCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCkgeyByZXR1cm4gInJlaXRldCBoZXJlaW4iOyB9CitzdHJpbmcgX3F1ZXJ5X21zZ291dCgpIHsgcmV0dXJuICJyZWl0ZXQiOyB9CisKK3ZhcmFyZ3MgaW50IG1vdmUobWl4ZWQgZGVzdCwgaW50IG1ldGhvZCwgc3RyaW5nIGRpciwgc3RyaW5nIHRleHRvdXQsc3RyaW5nIHRleHRpbikKK3sKKyBpZiggIShtZXRob2QgJiBNX05PQ0hFQ0spICYmIGRlc3QtPlF1ZXJ5UHJvcChQX0lORE9PUlMpICkKKyB7CisgIHdyaXRlKCAiRGFzIFBvbnkgd2VpZ2VydCBzaWNoLCBkb3J0aGluIHp1IHRyYWJlbi5cbiIgKTsKKyAgcmV0dXJuIDE7CisgfQorIHJldHVybiBwbC0+bW92ZSggZGVzdCwgbWV0aG9kLCBkaXIsIHRleHRvdXQsIHRleHRpbiApOworfQorCitpbnQgX2ludmVudG9yeShzdHJpbmcgc3RyKQoreworIGlmKCAhZW52aXJvbm1lbnQoKSB8fCBzZXRfbGlnaHQoMCk+MCApCisgIHdyaXRlKCAiRHUgc2l0enQgYXVmIGVpbmVtIFBvbnkuXG4iICk7CisgcmV0dXJuIHBsLT5faW52ZW50b3J5KHN0cik7Cit9CisKK3ZvaWQgYWJzdGVpZ2VuKCkgeworICB1bnNoYWRvdygpOworICBkZXN0cnVjdChNRSk7Cit9CisKK2ludCBRdWVyeVJlaXRlcigpIHsgcmV0dXJuIDE7IH0KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9zaXpldGVzdC5jIGIvc3RkL3BsYXllci9zaGFkb3dzL3NpemV0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2ODkxMQotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9zaXpldGVzdC5jCkBAIC0wLDAgKzEsNTcgQEAKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNkZWZpbmUgU1BJRUxFUiAibmVmaXMiCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKwkJICAgICAgICAgICAgICAgICAgICAgICJOZWZpcyBQX1NJWkU6ICIreCsiXG4iKQorI2RlZmluZSBMT0coeCkgbG9nX2ZpbGUoInplc3N0cmEvUF9TSVpFLmxvZyIsIHgpCisKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBwbDsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCgpICkgcmV0dXJuOworICBwbCA9IGZpbmRfcGxheWVyKFNQSUVMRVIpIHx8IGZpbmRfbmV0ZGVhZChTUElFTEVSKTsKKyAgaWYgKCFvYmplY3RwKHBsKSkgeworICAgICAgREVCVUcoIlBsYXllcm9iamVrdCBuaWNodCBnZWZ1bmRlbi4iKTsKKyAgICAgIGRlc3RydWN0KE1FKTsKKyAgICAgIHJldHVybjsKKyAgfQorICBzaGFkb3coIHBsLCAxKTsKKyAgREVCVUcoc3ByaW50ZigiJU8gc2hhZG93ZWQgYnk6ICVPXG4iLCBwbCwgc2hhZG93KHBsLCAwKSkpOworfQorCitpbnQgX3NldF9zaXplKGludCBzeikgeworICBMT0coc3ByaW50ZigiWyVzXSBBZW5kZXJ1bmcgdm9uIFBfU0laRSBpbiAlTyBhdWYgJU8sXG5DYWxsZXJzdGFjazogJU9cblxuIiwKKwlzdHJmdGltZSgiJWMiLHRpbWUoKSksIHBsLCBzeiwgY2FsbGVyX3N0YWNrKCkpKTsKKyAgcmV0dXJuIHBsLT5TZXQoUF9TSVpFLCBzeiwgRl9WQUxVRSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFNldCggc3RyaW5nIG5hbWUsIG1peGVkIFZhbHVlLCBpbnQgVHlwZSwgaW50IGV4dGVybiApIHsKKyAgaWYgKG5hbWUgPT0gUF9TSVpFKSB7CisgIExPRyhzcHJpbnRmKCJbJXNdIEFlbmRlcnVuZyB2b24gUF9TSVpFIGluICVPIGF1ZiAlTyAoVHlwOiAlTykgW1NldCgpIV0iCisJIixcbkNhbGxlcnN0YWNrOiAlT1xuXG4iLAorCSAgICAgICAgc3RyZnRpbWUoIiVjIix0aW1lKCkpLCBwbCwgVmFsdWUsIFR5cGUsIGNhbGxlcl9zdGFjaygpKSk7CisgIH0KKyAgcmV0dXJuIHBsLT5TZXQobmFtZSwgVmFsdWUsIFR5cGUsIGV4dGVybik7Cit9CisKK2ludCBzdG9wKCkgeworICB1bnNoYWRvdygpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCit2b2lkIHJlc2V0KCkgeworICBpZiAoIW9iamVjdHAocGwpKSAKKyAgICBzdG9wKCk7Cit9CisKK2ludCByZW1vdmUoKSB7CisgIHN0b3AoKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy90YXJuaGVsbV9zaGFkb3cuYyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy90YXJuaGVsbV9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VhNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3Rhcm5oZWxtX3NoYWRvdy5jCkBAIC0wLDAgKzEsMTQwIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIFdFRygpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpCisKK29iamVjdCBwbGF5ZXI7CitpbnQgZ2VuZGVyOworc3RyaW5nIGRlc2M7CisKK3ZvaWQgX3Rhcm5fdHVybl9vbihvYmplY3QgcGwsc3RyaW5nIHR4dCxpbnQgZ2VuKQoreworICBpZiAoIW9iamVjdHAocGwpfHwhaW50ZXJhY3RpdmUocGwpKSByZXR1cm4gV0VHKCk7CisgIGlmICghc3RyaW5ncCh0eHQpfHx0eHQ9PSIiKSByZXR1cm4gV0VHKCk7CisgIGlmIChnZW48MHx8Z2VuPjIpIHJldHVybiBXRUcoKTsKKyAgcGxheWVyPXBsOworICBkZXNjPWNhcGl0YWxpemUodHh0KTsKKyAgZ2VuZGVyPWdlbjsKKyAgc2hhZG93KHBsLDEpOworfQorCitpbnQgc3BlY2lhbF92ZXJiKCkKK3sKKyAgc3RyaW5nIHZlcmI7CisgIAorICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgaWYgKCF2ZXJifHx2ZXJiPT0iIikgcmV0dXJuIDA7CisgIGlmICh2ZXJiWzBdPT0nLScpIHJldHVybiAxOworICBpZiAodmVyYj09InJ1ZiJ8fHZlcmI9PSJydWZlInx8dmVyYj09InRlaWxlInx8dmVyYj09InRlaWwifHx2ZXJiPT0ibXJ1ZiJ8fAorICAgICAgdmVyYj09Im1ydWZlInx8dmVyYj09ImVyemFlaGwifHx2ZXJiPT0iZXJ6YWVobGUiKSByZXR1cm4gMTsKKyAgcmV0dXJuKDApOyAvLyBub24tdm9pZCBmdW5rdGlvbiwgWmVzc3RyYQorfQorCitpbnQgX3F1ZXJ5X2dlbmRlcigpCit7CisgIHJldHVybiBnZW5kZXI7Cit9CisKK3N0cmluZyBfcXVlcnlfbmFtZSgpCit7CisgIGlmICghc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIGNhcGl0YWxpemUoZGVzYyk7CisgIHJldHVybiBwbGF5ZXItPlF1ZXJ5KFBfTkFNRSk7Cit9CisKK3N0cmluZyBfcXVlcnlfc2hvcnQoKQoreworICByZXR1cm4gY2FwaXRhbGl6ZShwbGF5ZXItPm5hbWUoKSk7Cit9CisKK3N0cmluZyBfcXVlcnlfbG9uZygpCit7CisgIHN0cmluZyBzdHI7CisKKyAgc3RyPXBsYXllci0+bmFtZSgpOworICByZXR1cm4gY2FwaXRhbGl6ZShzdHIpKyIgaXN0ICIrc3RyKyIgaXN0ICIrc3RyKyIuXG4iOworfQorCitzdHJpbmcqIF9xdWVyeV9pZHMoKQoreworICByZXR1cm4gcGxheWVyLT5RdWVyeSgiaWRzIikrKHtsb3dlcl9jYXNlKGRlc2MpfSk7Cit9CisKK3N0cmluZyBfcXVlcnlfcmFjZSgpCit7CisgIHJldHVybiBkZXNjOworfQorCit2b2lkIF90YXJuX3R1cm5fb2ZmKCkKK3sKKyAgdW5zaGFkb3coKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CisKK2ludCBfcXVlcnlfYXJ0aWNsZSgpCit7CisgIGlmICghc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybigwKTsgLy8gbm9uLXZvaWQgZnVua3Rpb24sIFplc3N0cmEKK30KKworc3RyaW5nIF9xdWVyeV9wcmVzYXkoKQoreworICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyBfcXVlcnlfdGl0bGUoKQoreworICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgRGVmZW5kKGludCBkYW0sbWl4ZWQgZGFtX3R5cGUsbWl4ZWQgc3BlbGwsb2JqZWN0IGVuZW15KQoreworICBvYmplY3QgbzsKKworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIHBsYXllci0+RGVmZW5kKGRhbSwgZGFtX3R5cGUsIHNwZWxsLCBlbmVteSk7CisgIGVsc2UKKyAgICBwcmV2aW91c19vYmplY3QoKS0+U3RvcEh1bnRGb3IocGxheWVyKTsKKyAgaWYgKChvPXByZXNlbnQoIlxudGFybmhlbG0iLHBsYXllcikpKQorICAgICAgICBvLT5Eb1Vud2VhcigpOworICBpZiAodGhpc19vYmplY3QoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CisKK2ludCBLaWxsKG9iamVjdCBvYikKK3sKKyAgb2JqZWN0IG87CisKKyAgaWYgKChvPXByZXNlbnQoIlxudGFybmhlbG0iLHBsYXllcikpKQorICAgICAgby0+RG9VbndlYXIoKTsKKyAgaWYgKHRoaXNfb2JqZWN0KCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4oMCk7IC8vIG5vbi12b2lkIGZ1bmt0aW9uLCBaZXNzdHJhCit9CisKK2ludCBJbnNlcnRFbmVteShvYmplY3Qgb2IpCit7CisgIG9iamVjdCBvOworCisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgcGxheWVyLT5JbnNlcnRFbmVteShvYik7CisgIGVsc2UKKyAgICBvYi0+U3RvcEh1bnRGb3IocGxheWVyKTsKKyAgaWYgKChvPXByZXNlbnQoIlxudGFybmhlbG0iLHBsYXllcikpKQorICAgICAgby0+RG9VbndlYXIoKTsKKyAgaWYgKHRoaXNfb2JqZWN0KCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMDsKK30KKworc3RyaW5nIHNob3J0KCkKK3sKKyAgaWYgKG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiIyIpWzBdPT0iL29iai93ZXJsaXN0ZSIpCisgICAgcmV0dXJuIGNhcGl0YWxpemUoZ2V0ZXVpZChwbGF5ZXIpKyIgdmVya2xlaWRldCBhbHMgIitwbGF5ZXItPnNob3J0KCkpOworICByZXR1cm4gcGxheWVyLT5zaG9ydCgpOworfQorCitzdHJpbmcgUXVlcnlEaXNndWlzZSgpCit7CisgIHJldHVybiBkZXNjOyAKK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy96YXViZXJzaC5jIGIvc3RkL3BsYXllci9zaGFkb3dzL3phdWJlcnNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5Y2VjYwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy96YXViZXJzaC5jCkBAIC0wLDAgKzEsMjIwIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK29iamVjdCBjYXN0ZXI7CitzdHJpbmcqaWRzLG5hbWU7CitpbnQgZ2VuZGVyLGFydGljbGUscGx1cmFsOworc3RyaW5nIGxnZGVzYzsKK3N0cmluZyBtaW4sbW91dCxtbWluLG1tb3V0OworbWl4ZWQgaGFuZHM7CisKK3ZvaWQgSW5pdGlhbGl6ZShvYmplY3QgX2Nhc3RlciwKKyAgICAgICAgICAgICAgICBzdHJpbmcqX2lkcywKKyAgICAgICAgICAgICAgICBzdHJpbmcgX25hbWUsCisgICAgICAgICAgICAgICAgaW50IF9nZW5kZXIsCisgICAgICAgICAgICAgICAgaW50IF9hcnRpY2xlLAorICAgICAgICAgICAgICAgIGludCBfcGx1cmFsKQoreyBpZighb2JqZWN0cChfY2FzdGVyKSAgICB8fAorICAgICAhaW50ZXJhY3RpdmUoX2Nhc3Rlcil8fAorICAgICAhc3RyaW5ncChfbmFtZSkgICAgICB8fAorICAgICBfbmFtZT09IiIgICAgICAgICAgICB8fAorICAgICBfZ2VuZGVyPDAgICAgICAgICAgICB8fAorICAgICBfZ2VuZGVyPjIpCisgIHsgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgcmV0dXJuOworICB9CisgIGNhc3Rlcj1fY2FzdGVyOworICBpZHM9X2lkczsKKyAgbmFtZT1fbmFtZTsKKyAgZ2VuZGVyPV9nZW5kZXI7CisgIGFydGljbGU9X2FydGljbGU7CisgIHBsdXJhbD1fcGx1cmFsOworICBsZ2Rlc2M9MDsKKyAgc2hhZG93KGNhc3RlciwxKTsKK30KKwordm9pZCBTZXRMb25nRGVzYyhzdHJpbmcgdHh0KQoreyBpZighc3RyaW5ncCh0eHQpfHx0eHQ9PSIiKQorICAgIHJldHVybjsKKyAgbGdkZXNjPXR4dDsKK30KKworc3RyaW5nKiBfcXVlcnlfaWRzKCkKK3sgcmV0dXJuIGNhc3Rlci0+UXVlcnkoUF9JRFMpK2lkczsKK30KKworLy8gbmljaHQgYWxsZSBWZXJiZW4gbWl0IHZlcmFlbmRlcnRlbSBBdXNzZWhlbgoraW50IHNwZWNpYWxfdmVyYigpCit7IHN0cmluZyB2ZXJiOworICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgaWYoIXN0cmluZ3AodmVyYil8fHZlcmI9PSIiKQorICAgIHJldHVybiAwOworICBpZih2ZXJiWzBdPT0nLScpCisgICAgcmV0dXJuIDE7CisgIGlmKG1lbWJlcigoeyJydWYiLCJydWZlIiwibXJ1ZiIsIm1ydWZlIiwKKyAgICAgICAgICAgICAgInRlaWwiLCJ0ZWlsZSIsImVyemFlaGwiLCJlcnphZWhsZSJ9KSx2ZXJiKSE9LTEpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdHJpbmcgX3F1ZXJ5X25hbWUoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIG5hbWU7CisgIHJldHVybiBjYXBpdGFsaXplKGNhc3Rlci0+UXVlcnkoUF9OQU1FKSk7Cit9CisKK3N0cmluZyBfcXVlcnlfc2hvcnQoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIGNhc3Rlci0+TmFtZSgpOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX1NIT1JUKTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sgaWYoIXNwZWNpYWxfdmVyYigpKQorICB7IHN0cmluZyBzdHI7CisgICAgaWYobGdkZXNjKQorICAgICAgcmV0dXJuIGxnZGVzYzsKKyAgICBzdHI9Y2FzdGVyLT5uYW1lKCk7CisgICAgcmV0dXJuIGJyZWFrX3N0cmluZyhjYXBpdGFsaXplKHN0cikrIiBpc3QgIitzdHIrIiBpc3QgIitzdHIrIi4iLDc4KTsKKyAgfQorICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0xPTkcpOworfQorCitpbnQgX3F1ZXJ5X2dlbmRlcigpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gZ2VuZGVyOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0dFTkRFUik7Cit9CisKK2ludCBfcXVlcnlfYXJ0aWNsZSgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gYXJ0aWNsZTsKKyAgcmV0dXJuIGNhc3Rlci0+UXVlcnkoUF9BUlRJQ0xFKTsKK30KKworaW50IF9xdWVyeV9wbHVyYWwoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIHBsdXJhbDsKKyAgcmV0dXJuIGNhc3Rlci0+UXVlcnkoUF9QTFVSQUwpOworfQorCitzdHJpbmcgX3F1ZXJ5X3JhY2UoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgICAgcmV0dXJuIG5hbWU7CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfUkFDRSk7Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKwordm9pZCBzdG9wX3NoYWRvdygpCit7IAorICByZW1vdmUoKTsKK30KKworc3RyaW5nIF9xdWVyeV9wcmVzYXkoKQoreyByZXR1cm4iIjsKK30KKworc3RyaW5nIF9xdWVyeV90aXRsZSgpCit7IHJldHVybiIiOworfQorCitzdHJpbmcgX3NldF9tc2dpbihzdHJpbmcgdmFsKQoreyByZXR1cm4gbWluPXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tc2dpbigpCit7IHJldHVybiBtaW47Cit9CisKK3N0cmluZyBfc2V0X21zZ291dChzdHJpbmcgdmFsKQoreyByZXR1cm4gbW91dD12YWw7Cit9CisKK3N0cmluZyBfcXVlcnlfbXNnb3V0KCkKK3sgcmV0dXJuIG1vdXQ7Cit9CisKK3N0cmluZyBfc2V0X21tc2dpbihzdHJpbmcgdmFsKQoreyByZXR1cm4gbW1pbj12YWw7Cit9CisKK3N0cmluZyBfcXVlcnlfbW1zZ2luKCkKK3sgcmV0dXJuIG1taW47Cit9CisKK3N0cmluZyBfc2V0X21tc2dvdXQoc3RyaW5nIHZhbCkKK3sgcmV0dXJuIG1tb3V0PXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tbXNnb3V0KCkKK3sgcmV0dXJuIG1tb3V0OworfQorCittaXhlZCBfc2V0X2hhbmRzKG1peGVkIHZhbCkKK3sgcmV0dXJuIGhhbmRzPXZhbDsKK30KKworbWl4ZWQgX3F1ZXJ5X2hhbmRzKCkKK3sgcmV0dXJuIGhhbmRzOworfQorCit2YXJhcmdzIGludCBEZWZlbmQoaW50IGRhbSxtaXhlZCBkYW1fdHlwZSxtaXhlZCBzcGVsbCxvYmplY3QgZW5lbXkpCit7IG9iamVjdCBvYjsKKyAgaWYoIWVuZW15IHx8ICAvLyBTaWx2YW5hIDI2LjEuMjAwMgorICAgICAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpJiYKKyAgICAgICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkpCisgICAgcmV0dXJuIGNhc3Rlci0+RGVmZW5kKGRhbSxkYW1fdHlwZSxzcGVsbCxlbmVteSk7CisgIGVsc2UKKyAgeyBlbmVteS0+U3RvcEh1bnRGb3IoY2FzdGVyKTsKKyAgICBjYXN0ZXItPlN0b3BIdW50Rm9yKGVuZW15KTsKKyAgfQorICBpZihvYmplY3RwKG9iPXByZXNlbnQoInphdWJlcmVyXG5zaGFkb3ciLGNhc3RlcikpKQorICAgIG9iLT5yZW1vdmUoKTsKKyAgaWYodGhpc19vYmplY3QoKSkKKyAgICByZW1vdmUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBLaWxsKG9iamVjdCBlbmVteSkKK3sgb2JqZWN0IG9iOworICBpZighcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbmVteSkpCisgICAgcmV0dXJuIGNhc3Rlci0+S2lsbChlbmVteSk7CisgIGlmKG9iamVjdHAob2I9cHJlc2VudCgiemF1YmVyZXJcbnNoYWRvdyIsY2FzdGVyKSkpCisgICAgb2ItPnJlbW92ZSgpOworICBpZih0aGlzX29iamVjdCgpKQorICAgIHJlbW92ZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBlbmVteSkKK3sgb2JqZWN0IG9iOworICBpZighcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbmVteSkpCisgICAgcmV0dXJuIGNhc3Rlci0+SW5zZXJ0RW5lbXkoZW5lbXkpOworICBlbHNlIHsKKyAgICBlbmVteS0+U3RvcEh1bnRGb3IoY2FzdGVyKTsKKyAgICBjYXN0ZXItPlN0b3BIdW50Rm9yKGVuZW15KTsKKyAgfQorICBpZihvYmplY3RwKG9iPXByZXNlbnQoInphdWJlcmVyXG5zaGFkb3ciLGNhc3RlcikpKQorICAgIG9iLT5yZW1vdmUoKTsKKyAgaWYodGhpc19vYmplY3QoKSkKKyAgICByZW1vdmUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBzaG9ydCgpCit7IGlmKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gIi9vYmovd2VybGlzdGUiKQorICAgIHJldHVybiBjYXBpdGFsaXplKGdldGV1aWQoY2FzdGVyKSkrIiB2ZXJrbGVpZGV0IGFscyAiK2Nhc3Rlci0+c2hvcnQoKTsKKyAgcmV0dXJuIGNhc3Rlci0+c2hvcnQoKTsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZygpCit7IGlmKGxnZGVzYykKKyAgICByZXR1cm4gbGdkZXNjOworICByZXR1cm4gY2FzdGVyLT5sb25nKCk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NraWxscy5jIGIvc3RkL3BsYXllci9za2lsbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNkYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9za2lsbHMuYwpAQCAtMCwwICsxLDYyMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci9za2lsbHMuYyAtLSBTcGllbGVyc2tpbGxzCisvLworLy8gJElkOiBza2lsbHMuYyA4ODA5IDIwMTQtMDUtMDggMTk6NTI6NDhaIFplc3N0cmEgJAorCisvLworLy8gMjAwMy0wMS0yMDogTnVuIFpvb2tzIEJhdXN0ZWxsZQorLy8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9saXZpbmcvc2tpbGxzIjsKKworI2luY2x1ZGUgPGNvbWJhdC5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YnJlYWtfc3RyaW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyL2Jhc2UuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvZ21jcC5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisvLyBEaWVzZXMgTWFwcGluZyBzcGVpY2hlcnQgZGllIGRlYWt0aXZpZXJ0ZW4gU2tpbGxzIGRlciBlaW56ZWxuZW4gR2lsZGVuCisvLyBEaWVzZSB3ZXJkZW4gaW4gZGVuIEdpbGRlbiB1ZWJlciBQX0dVSUxEX0RFQUNUSVZBVEVEX1NLSUxMIGdlc2V0enQuCitub3NhdmUgbWFwcGluZyBkZWFjdGl2YXRlZF9za2lsbHMgPSAoW10pOworCisvLyBGbGFnIGZ1ZXIgZGVuIEtvbXBhdGliaWxpdGFldHNtb2R1cyBkZXMgS2FtcGZzIChFbXVsYXRpb24gdm9uCisvLyAycy1BbGFybXplaXQpLiBXZW5uICE9IDAgc3BlaWNoZXJ0IGRhcyBGbGFnIGdsZWljaHplaXRpZyBkaWUgWmVpdCBkZXMKKy8vIGxldHp0ZW4gSGVhcnRiZWF0cy4gQXVmIGRpZXNlIFplaXQgd2lyZCBkZXIgU3RhcnRwdW5rdCBlaW5lcyBTcGVsbGZhdGlndWVzCisvLyBnZ2YuIHp1cnVlY2tkYXRpZXJ0LiAobWF4LiBlaW5lIFNla3VuZGUpCitpbnQgc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZTsKKworLy8gRWluIGNyZWF0ZSgpIGZ1ZXIgZGFzIE1hcHBpbmcKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgbWFwcGluZyBhY3Q7CisKKyAgOjpjcmVhdGUoKTsKKworICAvLyBXaXIgaG9sZW4gZGllIEdpbGRlbiBhdXMgZGVtIEdpbGRlbm1hc3RlciAKKyAgZm9yZWFjaChzdHJpbmcgZ3VpbGQ6CisgICAgICAoc3RyaW5nICopY2FsbF9vdGhlcihHVUlMRE1BU1RFUiwiUXVlcnlQcm9wIixQX1ZBTElEX0dVSUxEUykpCisgIHsKKyAgICBpZihjYXRjaChhY3Q9Y2FsbF9vdGhlcigiL2dpbGRlbi8iK2d1aWxkLCJRdWVyeVByb3AiLAorICAgICAgICBQX0dVSUxEX0RFQUNUSVZBVEVfU0tJTExTKTsgcHVibGlzaCApKQorICAgICAgICBsb2dfZmlsZSgiV0VBUE9OX1NLSUxMUyIsIHNwcmludGYgKCIlczogR2lsZGUgbmljaHQgbGFkYmFyOiAiCisgICAgICAgICAgICAgICsiVFA6ICVPLCBUSTogJU8sIFBPOiAlTywgR2lsZGU6ICVzXG4iLCBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICB0aGlzX3BsYXllcigpLCB0aGlzX2ludGVyYWN0aXZlKCksIHByZXZpb3VzX29iamVjdCgpLCBndWlsZCkpOworICAgIGVsc2UgaWYgKGFjdCkgLy8gd2VubiBhY3QsIGlucyBNYXBwaW5nIGF1Zm5laG1lbi4KKyAgICAgICAgZGVhY3RpdmF0ZWRfc2tpbGxzKz0oW2d1aWxkOmFjdF0pOworICB9CisgIC8vIGtlaW5lIGVjaHRlIFByb3AgbWVociwgU2F2ZS1Nb2R1cyB1bm5vZXRpZy4KKyAgU2V0KFBfTkVYVF9TUEVMTF9USU1FLFNBVkUsRl9NT0RFX0FEKTsKKworICBTZXQoUF9TS0lMTFNWRVJTSU9OLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyk7Cit9CisKKy8vIERhcyBNYXBwaW5nIGthbm4gbWFuIGF1Y2ggYWJmcmFnZW4KKworcHVibGljIG1hcHBpbmcgR2V0RGVhY3RpdmF0ZWRTa2lsbHMoKQoreworICAgIHJldHVybiBjb3B5KGRlYWN0aXZhdGVkX3NraWxscyk7Cit9CisKKy8vIEZ1bmt0aW9uLCBkaWUgc2FndCBvYiBlaW4gQU5ZLVNraWxsIGRlYWt0aXZpZXJ0IGlzdC4KK3B1YmxpYyBpbnQgaXNfZGVhY3RpdmF0ZWRfc2tpbGwoc3RyaW5nIHNuYW1lLHN0cmluZyBndWlsZCkKK3sKKyAgICAgICAgaWYgKGRlYWN0aXZhdGVkX3NraWxsc1tndWlsZF0pICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVhY3RpdmF0ZWRfc2tpbGxzW2d1aWxkXVtzbmFtZV07CisgICAgICAgIHJldHVybiAwOworfQorCisKKy8vIEZ1bmt0aW9uIGZ1ZXIgZGllIFdhZmZlbnNraWxscworLy8gdHJhZWd0IGRpZSBhbGxnLiBXYWZmZW5za2lsbHMgZWluLiBXaXJkIGdnZi4gdm9uIEZpeFNraWxscygpIGdlcnVmZW4uCisvLyAoRGFzIEVpbnRyYWdlbiBiZWRldXRldCBuaWNodCwgZGFzcyBkaWUgYWt0aXYgc2luZCEgQWJlciBiZWkgR2lsZGVud2VjaHNlbAorLy8gd2VyZGVuIHNpZSBuaWNodCBlaW5nZXRyYWdlbikuCitwcml2YXRlIHZvaWQgc2V0X3dlYXBvbl9za2lsbHMoKSB7CisKKyAgaWYgKFF1ZXJ5U2tpbGxBYmlsaXR5KEZJR0hUKFdUX1NXT1JEKSk8PTApICAgICAgICAgICAgICAgIAorICAgICAgTW9kaWZ5U2tpbGwoRklHSFQoV1RfU1dPUkQpLChbU0lfU0tJTExBQklMSVRZOjBdKSwxNTAsIkFOWSIpOyAgICAKKyAgaWYgKFF1ZXJ5U2tpbGxBYmlsaXR5KEZJR0hUKFdUX0FYRSkpPD0wKSAgICAgICAgICAgICAgICAKKyAgICAgIE1vZGlmeVNraWxsKEZJR0hUKFdUX0FYRSksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7ICAgICAgICAgIAorICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfU1BFQVIpKTw9MCkgICAgICAgIAorICAgICAgTW9kaWZ5U2tpbGwoRklHSFQoV1RfU1BFQVIpLChbU0lfU0tJTExBQklMSVRZOjBdKSwxNTAsIkFOWSIpOyAgICAgICAgICAKKyAgaWYgKFF1ZXJ5U2tpbGxBYmlsaXR5KEZJR0hUKFdUX1dISVApKTw9MCkKKyAgICAgIE1vZGlmeVNraWxsKEZJR0hUKFdUX1dISVApLChbU0lfU0tJTExBQklMSVRZOjBdKSwxNTAsIkFOWSIpOworICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfS05JRkUpKTw9MCkgICAgICAgICAgICAgICAgCisgICAgICBNb2RpZnlTa2lsbChGSUdIVChXVF9LTklGRSksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7ICAgICAgICAgIAorICBpZiAoUXVlcnlTa2lsbEFiaWxpdHkoRklHSFQoV1RfQ0xVQikpPD0wKSAgICAgICAgICAgICAgICAKKyAgICAgIE1vZGlmeVNraWxsKEZJR0hUKFdUX0NMVUIpLChbU0lfU0tJTExBQklMSVRZOjBdKSwxNTAsIkFOWSIpOyAgICAgICAgICAKKyAgaWYgKFF1ZXJ5U2tpbGxBYmlsaXR5KEZJR0hUKFdUX1NUQUZGKSk8PTApCisgICAgICBNb2RpZnlTa2lsbChGSUdIVChXVF9TVEFGRiksKFtTSV9TS0lMTEFCSUxJVFk6MF0pLDE1MCwiQU5ZIik7Cit9IAorCisvLyBpbml0aWFsaXNpZXJ0IGRpZSBTa2lsbHMgZnVlciBTcGllbGVyIChtb21lbnRhbjogYWxsZy4gV2FmZmVuc2tpbGxzIHNldHplbgorLy8gdW5kIFBfU0tJTExTX1ZFUlNJT04pCitwcm90ZWN0ZWQgdm9pZCBJbml0U2tpbGxzKCkgeworICBtYXBwaW5nIHNraTsKKyAgLy8gc2Nob25tYWwgaW5pdGlhbGlzaWVydD8KKyAgaWYgKG1hcHBpbmdwKHNraT1RdWVyeShQX05FV1NLSUxMUywgRl9WQUxVRSkpICYmIHNpemVvZihza2kpKQorICAgIHJldHVybjsKKworICAvLyBhbGxnLiBXYWZmZW5za2lsbHMgYWt0aXZpZXJlbgorICBzZXRfd2VhcG9uX3NraWxscygpOworCisgIC8vIFZlcnNpb24gc2V0emVuCisgIFNldFByb3AoUF9TS0lMTFNWRVJTSU9OLCBDVVJSRU5UX1NLSUxMX1ZFUlNJT04pOworICBTZXQoUF9TS0lMTFNWRVJTSU9OLCBTQVZFfFNFQ1VSRUQsIEZfTU9ERV9BUyk7Cit9CisKKy8vIFVwZGF0ZWQgU2tpbGxzIGF1cyBWZXJzaW9uIDAgdW5kIDEgaGVyYXVzLgorcHJpdmF0ZSB2b2lkIEZpeFNraWxsVjEoc3RyaW5nIHNraWxsbmFtZSwgbWl4ZWQgc2luZm8pIHsKKyAgLy8gYWx0ZSBTa2lsbHMgYXVmIG1hcHBpbmdzIG5vcm1pZXJlbgorICBpZiAoaW50cChzaW5mbykpIHsKKyAgICBzaW5mbyA9IChbU0lfU0tJTExBQklMSVRZOiBzaW5mbyBdKTsKKyAgfQorICAvLyBFaW5lIFJlaWhlIHZvbiBEYXRlbiB3ZXJkZW4gZ2Vsb2VzY2h0LCBkYSBkaWUgRGF0ZW4gYXVzIGRlcgorICAvLyBHaWxkZS9TcGVsbGJvb2sgZnJpc2NoIGtvbW1lbiBzb2xsdGVuIHVuZCBzaWUgbmljaHQgc3BpZWxlci1pbmRpdmlkdWVsbAorICAvLyBzaW5kOiBTSV9DTE9TVVJFICh3aXJkIG9udGhlZmx5IGtvcnJla3QgbmV1IGVyemV1Z3QpLCBTSV9TS0lMTEFSRywKKyAgLy8gU0lfTlVNQkVSX0VORU1JRVMsIFNJX05VTUJFUl9GUklFTkRTLCBTSV9ESVNUQU5DRSwgU0lfV0lEVEgsIFNJX0RFUFRILAorICAvLyBTSV9URVNURkxBRywgU0lfRU5FTVksIFNJX0ZSSUVORC4KKyAgLy8gQXVzc2VyZGVtIHNpbmQgYWxsZSBTUF8qIGltIHRvcGxldmVsIGZhbHNjaCwgZGllIG11ZXNzZW4gYSkgaW4gU0lfU1BFTEwKKyAgLy8gdW5kIHNvbGx0ZW4gYikgbmljaHQgaW0gU3BpZWxlciBnZXNwZWljaGVydCB3ZXJkZW4sIHNvbmRlcm4gdm9uCisgIC8vIEdpbGRlbi9TcGVsbGJvb2sgamV3ZWlscyBmcmlzY2gga29tbWVuLgorICAvLyBhbGwgZGllc2VzIFpldWcgbGFuZGV0ZSBpbiBhbHRlbiBTcGllbGVybiBpbSBTYXZlZmlsZS4KKyAgaWYgKG1hcHBpbmdwKHNpbmZvKSkKKyAgICBzaW5mbyAtPSAoW1NJX0NMT1NVUkUsIFNJX1NLSUxMQVJHLCBTSV9OVU1CRVJfRU5FTUlFUywgU0lfTlVNQkVSX0ZSSUVORFMsCisgICAgICAgICAgICAgU0lfRElTVEFOQ0UsIFNJX1dJRFRILCBTSV9ERVBUSCwgU0lfVEVTVEZMQUcsIFNJX0VORU1ZLAorICAgICAgICAgICAgIFNJX0ZSSUVORCwgU1BfTkFNRSwgU1BfU0hPV19EQU1BR0UsIFNQX1JFRFVDRV9BUk1PVVIsCisgICAgICAgICAgICAgU1BfUEhZU0lDQUxfQVRUQUNLLCBTUF9SRUNVUlNJVkUsIFNQX05PX0VORU1ZLAorICAgICAgICAgICAgIFNQX05PX0FDVElWRV9ERUZFTlNFLCBTUF9HTE9CQUxfQVRUQUNLIF0pOworICBlbHNlCisgIHsKKyAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLHNwcmludGYoCisgICAgICAiXG4qKioqIEFDSFRVTkcgLSBGRUhMRVIgKioqXG4iIAorICAgICAgIkRlaW5lIFNraWxscyBlbnRoYWx0ZW4gZWluZW4gZGVmZWt0ZW4gU2tpbGwgJU86XG4iCisgICAgICAiQml0dGUgbGFzcyBkaWVzIHZvbiBlaW5lbSBFcnptYWdpZXIgdWViZXJwcnVlZmVuLlxuIiwKKyAgICAgIHNraWxsbmFtZSkpOworICB9Cit9CisKKy8vIFVwZGF0ZXQgdW5kIHJlcGFyaWVydCBnZ2YuIFNraWxsbWFwcGluZ3MgaW4gU3BpZWxlcm4KK3Byb3RlY3RlZCB2b2lkIEZpeFNraWxscygpIHsKKworICAvLyBudXIgYmVpIGdlbnVnIHJlY2hlbnplaXQgbG9zbGVnZW4KKyAgaWYgKGdldF9ldmFsX2Nvc3QoKSA8IDc1MDAwMCkgeworICAgIGNhbGxfb3V0KCMnRml4U2tpbGxzLCAxKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gd2VubiBnYXIga2VpbmUgU2tpbGxzIGRhICg/KTogSW5pdFNraWxscygpIHJ1ZmVuLgorICBtYXBwaW5nIGFsbHNraWxscyA9IFF1ZXJ5KFBfTkVXU0tJTExTLCBGX1ZBTFVFKTsKKyAgaWYgKCFtYXBwaW5ncChhbGxza2lsbHMpIHx8ICFzaXplb2YoYWxsc2tpbGxzKSkgeworICAgICAgSW5pdFNraWxscygpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gRGllIEZhbGx0aHJvdWdocyBpbiBkaWVzZW0gc3dpdGNoIHNpbmQgdm9sbCBBYnNpY2h0IQorICBzd2l0Y2goUXVlcnlQcm9wKFBfU0tJTExTVkVSU0lPTikpIHsKKyAgICAvLyBiZWkgVmVyc2lvbiAwIHVuZCAxIGRhcyBnbGVpY2hlIHR1bgorICAgIGNhc2UgMDogLy8gdm9uIDAgYXVmIDEKKyAgICBjYXNlIDE6IC8vIHZvbiAxIGF1ZiAyCisgICAgICBmb3JlYWNoKHN0cmluZyBnaWxkZSwgbWFwcGluZyBza2lsbHM6IGFsbHNraWxscykgeworICAgICAgICBpZiAoIXN0cmluZ3AoZ2lsZGUpKSB7CisgICAgICAgICAgLy8gc29sbHRlIG5pY2h0IHZvcmtvbW1lbiAtIHRhdCBhYmVyLi4uICpzZXVmeioKKyAgICAgICAgICBtX2RlbGV0ZShza2lsbHMsIGdpbGRlKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB3YWxrX21hcHBpbmcoc2tpbGxzLCAjJ0ZpeFNraWxsVjEpOworICAgICAgfQorICAgICAgLy8gYWxsZy4gV2FmZmVuc2tpbGxzIGFrdGl2aWVyZW4sIGVpbmlnZSBhbHRlIFNwaWVsZXIgaGFiZW4gZGllIG5vY2gKKyAgICAgIC8vIG5pY2h0LgorICAgICAgc2V0X3dlYXBvbl9za2lsbHMoKTsKKyAgICAgIC8vIFNwZWljaGVyZmxhZyBmdWVyIGRpZSBWZXJzaW9uc3Byb3AgbXVzcyBub2NoIGdlc2V0enQgd2VyZGVuLgorICAgICAgU2V0KFBfU0tJTExTVkVSU0lPTiwgU0FWRXxTRUNVUkVELCBGX01PREVfQVMpOworICAgICAgLy8gVmVyc2lvbiBpc3QgamV0enQgMi4KKyAgICAgIFNldFByb3AoUF9TS0lMTFNWRVJTSU9OLCAyKTsKKyAgICAgIC8vIEZhbGwtdGhyb3VnaAorICAgY2FzZSAyOgorICAgICAgLy8gZ2lidCBlcyBub2NoIG5pY2h0LCBuaWNodHMgbWFjaGVuLgorICAgICAgLy9TZXRQcm9wKFBfU0tJTExTVkVSU0lPTiwgMyk7CisgICAgICAvLyBGYWxsLXRocm91Z2gsIGF1c3NlciBlcyBzaW5kIHp1d2VuaWcgVGlja3MgZGEhCisgICAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgNzUwMDAwKQorICAgICAgICBicmVhazsgCisgIH0KKyAgLy8gRmFsbHMgbm9jaCBuaWNodCBhdWYgZGVyIGFrdHVlbGxlbiBWZXJzaW9uIGFuZ2Vrb21tZW4sIG5ldWVyIGNhbGxvdXQKKyAgaWYgKFF1ZXJ5UHJvcChQX1NLSUxMU1ZFUlNJT04pIDwgQ1VSUkVOVF9TS0lMTF9WRVJTSU9OKQorICAgICAgY2FsbF9vdXQoIydGaXhTa2lsbHMsIDIpOworfQorCitwcm90ZWN0ZWQgdm9pZCB1cGRhdGVzX2FmdGVyX3Jlc3RvcmUoaW50IG5ld2ZsYWcpIHsKKyAgLy9BbGxnZW1laW5lIFdhZmZlbnNraWxscyBha3RpdmllcmVuLCB3ZW5uIG5vZXRpZworICAvLyBXaXJkIG51biB2b24gSW5pdFNraWxscyBiencuIEZpeFNraWxscyB1ZWJlcm5vbW1lbiwgZmFsbHMgbm9ldGlnLgorICBpZiAobmV3ZmxhZykgeworICAgIEluaXRTa2lsbHMoKTsKKyAgfQorICBlbHNlIGlmIChRdWVyeVByb3AoUF9TS0lMTFNWRVJTSU9OKSA8IENVUlJFTlRfU0tJTExfVkVSU0lPTikgeworICAgIC8vIEZhbGxzIG5vZXRpZywgU2tpbGxzIGZpeGVuL3VwZGF0ZW4uICpncnVtbWVsKgorICAgIEZpeFNraWxscygpOworICB9CisgIC8vIFByb3AgZ2lidCBlcyBuaWNodCBtZWhyLiBTQVZFLVN0YXR1cyBsb2VzY2hlbi4gCisgIFNldChQX0dVSUxEX1BSRVZFTlRTX1JBQ0VTS0lMTCxTQVZFLEZfTU9ERV9BRCk7Cit9CisKKy8vIFN0YW5kYXJkaXNpZXJ0ZSBOYWhrYW1wZi1GdW5rdGlvbiBmdWVyIGFsbGUgTmFoa2FtcGYtV2FmZmVuYXJ0ZW4KK3Byb3RlY3RlZCBtYXBwaW5nIFNob3J0UmFuZ2VTa2lsbChvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykgCit7IAorICBpbnQgdmFsLCB3OworICBvYmplY3QgZW5lbXk7CisgIAorICBpZiAoIW1hcHBpbmdwKHNpbmZvKSB8fCAhb2JqZWN0cChzaW5mb1tQX1dFQVBPTl0pKQorICAgIHJldHVybiAwOworCisgIHcgPSAoW1dUX0tOSUZFIDogOCwKKyAgICAgICAgV1RfU1dPUkQgOiA1LAorICAgICAgICBXVF9BWEUgICA6IDQsCisgICAgICAgIFdUX1NQRUFSIDogNiwKKyAgICAgICAgV1RfQ0xVQiAgOiAxLAorICAgICAgICBXVF9XSElQICA6IDksCisgICAgICAgIFdUX1NUQUZGIDogN10pW3NpbmZvW1BfV0VBUE9OXS0+UXVlcnlQcm9wKFBfV0VBUE9OX1RZUEUpXTsKKyAgICAgIAorCisgIHZhbCA9IHNpbmZvW1NJX1NLSUxMQUJJTElUWV0qKHNpbmZvW1BfV0VBUE9OXS0+UXVlcnlQcm9wKFBfV0MpKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodypRdWVyeUF0dHJpYnV0ZShBX0RFWCkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAtdykqUXVlcnlBdHRyaWJ1dGUoQV9TVFIpKS83MDApCisgICAgICAgIC9NQVhfQUJJTElUWTsKKworICBpZiAodmFsID4gODUpIHsKKyAgICBsb2dfZmlsZSgiV0VBUE9OX1NLSUxMUyIsIHNwcmludGYoIiVzOiBadSBob2hlciBTY2hhZGVuIHZvbjogIgorICAgICsiVE86ICVPLCBUSTogJU8sIFBPOiAlTywgdmFsOiAlZCwgQV9ERVg6ICVkLCBBX1NUUjogJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJQX1dFQVBPTjogJU8sIFBfV0M6ICVkXG4iLCBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX29iamVjdCgpLCB0aGlzX2ludGVyYWN0aXZlKCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSwgdmFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlBdHRyaWJ1dGUoQV9ERVgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeUF0dHJpYnV0ZShBX1NUUiksIHNpbmZvW1BfV0VBUE9OXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZm9bUF9XRUFQT05dLT5RdWVyeVByb3AoUF9XQykpKTsKKyAgICB2YWwgPSA4NTsKKyAgfQorCisgIC8qCisgICAgRGVyIHp1c+R0emxpY2hlIFNjaGFkZW4gZGVyIGFsbGdlbWVpbmVuIFdhZmZlbnNraWxscyBiZXJlY2huZXQKKyAgICBzaWNoIHdpZSBmb2xndDogCisKKyAgICBzaW5mb1tTSV9TS0lMTEFCSUxJVFkpKiAoUF9XQyAqICggWCApIC8gODAwKSAvIE1BWF9BQklMSVRZCisKKyAgICBEYWJlaSBiZXJ1ZWNrc2ljaHRpZ3QgWCBqZSBuYWNoIFdhZmZlbnR5cCBpbiB1bnRlcnNjaGllZGxpY2hlcgorICAgIEdld2ljaHR1bmcgZGllIFdlcnRlIGZ1ZXIgR2VzY2hpY2tsaWNoa2VpdCB1bmQgU3RhZXJrZS4gCisKKyAgICAgWCA9PSAKKworICAgICAgIE1lc3NlciAgIDogOCpBX0RFWCArIDIqQV9TVFIKKyAgICAgICBTY2h3ZXJ0ICA6IDUqQV9ERVggKyA1KkFfU1RSCisgICAgICAgQXh0ICAgICAgOiA0KkFfREVYICsgNipBX1NUUiAKKyAgICAgICBTcGVlciAgICA6IDYqQV9ERVggKyA0KkFfU1RSCisgICAgICAgS2V1bGUgICAgOiAxKkFfREVYICsgOSpBX1NUUgorICAgICAgIFBlaXRzY2hlIDogOSpBX0RFWCArIDEqQV9TVFIKKyAgKi8KKworICBzaW5mb1tTSV9TS0lMTERBTUFHRV0rPXZhbDsKKworCisgIC8qIExlcm5lbjogV2lyZCBpbW1lciBzY2h3aWVyaWdlciwgbnVyIGJlaSBqZWRlbSAyMC4gU2NobGFnIGltIFNjaG5pdHQsCisgICAqIHVuZCBudXIgZGFubiwgd2VubiBkZXIgR2VnbmVyIGF1Y2ggWFAgZ2lidC4gKi8KKyAgaWYgKHJhbmRvbShNQVhfQUJJTElUWSsxKT5zaW5mb1tTSV9TS0lMTEFCSUxJVFldICYmICFyYW5kb20oMTApKQorICB7CisgICAgICAgICBlbmVteT1zaW5mb1tTSV9FTkVNWV07CisgICAgICAgICBpZiAob2JqZWN0cChlbmVteSkgJiYgKGVuZW15LT5RdWVyeVByb3AoUF9YUCk+MCkpCisgICAgICAgICB7CisgICAgICAgICAgIG9iamVjdCBhdXNiaWxkZXI7CisgICAgICAgIC8vICAgICAgICAgbG9nX2ZpbGUoImh1bW5pL2xvZ193dXJtIiwiSGF1dDogJXMgdW5kIHp3YXIgJXMsIG1pdCB4cCAlZFxuIixnZXRldWlkKHRoaXNfb2JqZWN0KCkpLHRvX3N0cmluZyhlbmVteSksZW5lbXktPlF1ZXJ5UHJvcChQX1hQKSk7CisgICAgICAgICAgICBMZWFyblNraWxsKHNuYW1lLCByYW5kb20oNSksIDE1MCk7CisgICAgICAgIC8vIEdpYnQgZXMgZWluZW4gQXVzYmlsZGVyPworICAgICAgICBpZiAoUXVlcnlQcm9wKFBfV0VBUE9OX1RFQUNIRVIpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgYXVzYmlsZGVyPWZpbmRfcGxheWVyKFF1ZXJ5UHJvcChQX1dFQVBPTl9URUFDSEVSKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgLy8gSXN0IGRlciBBdXNiaWxkZXIgYW53ZXNlbmQ/CisgICAgICAgICAgICBpZiAocHJlc2VudChhdXNiaWxkZXIsZW52aXJvbm1lbnQoKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gQXVzYmlsZGVyIHVuZCBBenViaSBtdWVzc2VuIGRpZXNlbGJlIFdhZmZlIGhhYmVuLgorICAgICAgICAgICAgICAvL3N0cmluZyB3dF9hdXMsd3RfYXp1OworICAgICAgICAgICAgICBvYmplY3Qgd2FmX2F1cyx3YWZfYXp1OworCisgICAgICAgICAgICAgIHdhZl9henU9UXVlcnlQcm9wKFBfV0VBUE9OKTsKKyAgICAgICAgICAgICAgd2FmX2F1cz1jYWxsX290aGVyKGF1c2JpbGRlciwiUXVlcnlQcm9wIixQX1dFQVBPTik7CisKKyAgICAgICAgICAgICAgLy93dF9henU9Y2FsbF9vdGhlcih3YWZfYXp1LCJRdWVyeVByb3AiLFBfV0VBUE9OX1RZUEUpOworICAgICAgICAgICAgICAvL3d0X2F1cz1jYWxsX290aGVyKHdhZl9hdXMsIlF1ZXJ5UHJvcCIsUF9XRUFQT05fVFlQRSk7CisgICAgICAgICAgICAgIC8vaWYgKHd0X2F6dT09d3RfYXVzKQorICAgICAgICAgICAgICBpZiAob2JqZWN0cCh3YWZfYXVzKSAmJiBvYmplY3RwKHdhZl9henUpICYmCisgICAgICAgICAgICAgICAgICAoc3RyaW5nKXdhZl9hdXMtPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgPT0gKHN0cmluZyl3YWZfYXp1LT5RdWVyeVByb3AoUF9XRUFQT05fVFlQRSkpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBCb251cyB2b24gYmlzIHp1IDUgUHVua3RlbgorICAgICAgICAgICAgICAgIC8vbG9nX2ZpbGUoImh1bW5pL2xvZ19henViaSIsCisgICAgICAgICAgICAgICAgICAvLyBzcHJpbnRmKCJBenViaSAlTyB1bmQgQXVzYmlsZGVyICVPIDogV2FmZmVudHlwZW4gJXMgdW5kICVzLCBnZWxlcm50XG4iLHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgIC8vICAgYXVzYmlsZGVyLCB3dF9henUsIHd0X2F1cykpOworICAgICAgICAgICAgICAgIExlYXJuU2tpbGwoc25hbWUscmFuZG9tKDYpLDE1MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIAorICAgICBEaWUgU2Nod2llcmlna2VpdCBsaWVndCBiZWkgMTUwLCBzbyBkYXNzIAorICAgICBlaW4gTHZsLiAxIFNwaWVsZXIgbWF4aW1hbCAxNSUgU2tpbGwgCisgICAgIHVzdy4uLgorICAgICBsZXJuZW4ga2Fubi4gKEdlbmF1ZSBUYWJlbGxlIGluIC9zdGQvbGl2aW5nL3NraWxscyBiZWkgTGltaXRBYmlsaXR5KQorICAqLyAgICAgICAgIAorCisgIHJldHVybiBzaW5mbzsKK30KKworCisvLyBTdGFuZGFyZGlzaWVydGUgRmVybmthbXBmLUZ1bmt0aW9uIGZ1ZXIgYWxsZSBGZXJua2FtcGYtV2FmZmVuYXJ0ZW4KKworLy8gKioqIG5vY2ggZGVha3RpdmllcnQgKioqCisKK3Byb3RlY3RlZCBtYXBwaW5nIExvbmdSYW5nZVNraWxsKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvLCBpbnQgZGFtKSAKK3sgaW50IGFiaWwsdmFsOworCisgIGlmICghbWFwcGluZ3Aoc2luZm8pIHx8ICFkYW0gfHwgIW9iamVjdHAoc2luZm9bUF9XRUFQT05dKSB8fAorICAgICAgKHNpbmZvW1BfV0VBUE9OXS0+UXVlcnlQcm9wKFBfU0hPT1RJTkdfV0MpKTw1KQorICAgIHJldHVybiAwOworCisgIGFiaWw9c2luZm9bU0lfU0tJTExBQklMSVRZXStzaW5mb1tPRkZTRVQoU0lfU0tJTExBQklMSVRZKV07IAorICB2YWw9ZGFtKmFiaWwvTUFYX0FCSUxJVFk7CisgIHZhbD12YWwvMityYW5kb20odmFsLzIrMSk7CisgIHZhbD0odmFsKlF1ZXJ5U2tpbGxBdHRyaWJ1dGUoU0FfREFNQUdFKSkvMTAwOworICBzaW5mb1tTSV9TS0lMTERBTUFHRV0rPXZhbDsKKworICBpZiAocmFuZG9tKE1BWF9BQklMSVRZKzEpPnNpbmZvW1NJX1NLSUxMQUJJTElUWV0gJiYgcmFuZG9tKDUwKT09NDIpCisgICAgTGVhcm5Ta2lsbChzbmFtZSwgMSwgMTUwKTsKKworICByZXR1cm4gc2luZm87Cit9CisKKworCisvLyBEaWUgZWluemVsbmVuIFdhZmZlbnNraWxscyBydWZlbiBkYW5uIG51ciBkaWUgU3RhbmRhcmQtRnVua3Rpb24gYXVmLgorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9GaWdodF9heGUob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBTaG9ydFJhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbyk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X2NsdWIob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBTaG9ydFJhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbyk7Cit9CisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX0ZpZ2h0X2tuaWZlKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gU2hvcnRSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8pOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9GaWdodF9zcGVhcihvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIFNob3J0UmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvKTsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfRmlnaHRfc3dvcmQob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pIAoreworICByZXR1cm4gU2hvcnRSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8pOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9GaWdodF93aGlwKG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gU2hvcnRSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8pOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9GaWdodF9zdGFmZihvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIFNob3J0UmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvKTsKK30KKworCisKKworLy8gRGllIEZlcm53YWZmZW5za2lsbHMgc2luZCBNdW5pdGlvbnNhYmhhZW5naWcKKworLy8gKioqIG5vY2ggZGVha3RpdmllcnQgKioqCisKK3Byb3RlY3RlZCBtYXBwaW5nIFN0ZFNraWxsX1Nob290X2Fycm93KG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreworICByZXR1cm4gTG9uZ1JhbmdlU2tpbGwobWUsIHNuYW1lLCBzaW5mbywgNDApOworfQorCitwcm90ZWN0ZWQgbWFwcGluZyBTdGRTa2lsbF9TaG9vdF9ib2x0KG9iamVjdCBtZSwgc3RyaW5nIHNuYW1lLCBtYXBwaW5nIHNpbmZvKQoreyAKKyAgcmV0dXJuIExvbmdSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8sIDQwKTsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfU2hvb3RfZGFydChvYmplY3QgbWUsIHN0cmluZyBzbmFtZSwgbWFwcGluZyBzaW5mbykKK3sKKyAgcmV0dXJuIExvbmdSYW5nZVNraWxsKG1lLCBzbmFtZSwgc2luZm8sIDIwKTsKK30KKworcHJvdGVjdGVkIG1hcHBpbmcgU3RkU2tpbGxfU2hvb3Rfc3RvbmUob2JqZWN0IG1lLCBzdHJpbmcgc25hbWUsIG1hcHBpbmcgc2luZm8pCit7CisgIHJldHVybiBMb25nUmFuZ2VTa2lsbChtZSwgc25hbWUsIHNpbmZvLCA0MCk7Cit9CisKK3Byb3RlY3RlZCBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkgeworICAgIHJldHVybiAoeyAoeyJzcHJ1Y2hlcm11ZWR1bmciLCJlbmFibGVfc3BlbGxfZmF0aWd1ZV9jb21wYXQiLDAsMH0pIH0pOworfQorCisKKworLy8gKioqIEtvbXBhdGliaWxpdGFldHNtb2R1cyBmdWVyIFNwZWxsZmF0aWd1ZXMgKEVtdWxhdGlvbiAycy1BbGFybXplaXQpICoqKgorCisvKiogU3BlaWNoZXJ0IGVpbmUgU3BlbGxmYXRpZ3VlIHZvbiA8ZHVyYXRpb24+IFNla3VuZGVuIGZ1ZXIgPGtleT4uCisgKiBJc3QgaGllciBudXIgZnVlciBkZW4gU3BlbGxmYXRpZ3VlLUNvbXBhdC1tb2RlLgorICogPGtleT4gZGFyZiAwIHNlaW4gdW5kIGJlemVpY2huZXQgZGFzIGdsb2JhbGUgU3BlbGxmYXRpZ3VlLgorICogUnVlY2tnYWJld2VydDogQWJsYXVmemVpdCBkZXIgZ2VzZXR6dGVuIFNwZXJyZQorICAgICAgICAgICAgICAgICAgLTEsIHdlbm4gbm9jaCBlaW5lIG5pY2h0LWFiZ2VsYXVmZW5lIFNwZXJyZSBhdWYgZGVtIDxrZXk+IGxhZy4KKyAgICAgICAgICAgICAgICAgIDAsIHdlbm4gZHVyYXRpb24gMCBpc3QuCisgKi8KK3B1YmxpYyB2YXJhcmdzIGludCBTZXRTcGVsbEZhdGlndWUoaW50IGR1cmF0aW9uLCBzdHJpbmcga2V5KSB7CisKKyAgLy8gMCBzb2xsdGUgbmllIGVpbmUgU3BlcnJlIGJld2lya2VuLCBhdWNoIG5pY2h0IGltIGNvbXBhdCBtb2RlLgorICBpZiAoIWR1cmF0aW9uKSByZXR1cm4gMDsKKworICBpZiAoc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSkgeworICAgIC8vIFNwZWxsLUZhdGlndWVzIGF1ZiBIQnMgc3luY2hyb25pc2llcmVuICgycy1BbGFybXplaXQtRW11bGF0aW9uKS4KKyAgICAvLyBBdWZydW5kZW4gYXVmIGdhbnp6YWhsaWdlIFZpZWxmYWNoZSB2b24gX19IRUFSVF9CRUFUX0lOVEVSVkFMX18KKyAgICBpZiAoZHVyYXRpb24gJSBfX0hFQVJUX0JFQVRfSU5URVJWQUxfXykKKyAgICAgICAgKytkdXJhdGlvbjsKKworICAgIC8vIFN0YXJ0cHVua3QgZGVzIERlbGF5IHNvbGwgQmVnaW5uIGRlciBha3R1ZWxsZW4gS2FtcGZydW5kZSAoSEItWnlrbHVzKQorICAgIC8vIHNlaW4sIGdnZi4gdW0gbWF4LiBlaW5lIFNla3VuZGUgenVydWVja2RhdGllcmVuLgorICAgIC8vIChzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlIGhhdCBkaWUgWmVpdCBkZXMgbGV0enRlbiBIQi1BdWZydWZzKQorICAgIC8vIEZhbGxzIGR1cmNoIGlyZ2VuZGVpbiBQcm9ibGVtICh6LkIuIHNlaHIgaG9oZSBMYXN0KSwgZGVyIGxldHp0ZSBIQgorICAgIC8vIGxhZW5nZXIgYWxzIDFzIHp1cnVlY2tsaWVndCwgZnVua3Rpb25pZXJ0IGRhcyBuYXR1ZXJsaWNoIG5pY2h0LCBhYmVyCisgICAgLy8gYmVpIGZhdGlndWUrPXNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGUga2FubiBkZXIgU3BpZWxlciB6dXZpZWwgWmVpdAorICAgIC8vIGVpbnNwYXJlbi4KKyAgICBpZiAodGltZSgpID4gc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSkKKyAgICAgICAgLS1kdXJhdGlvbjsgIC8vMXMgenVydWVja2RhdGllcmVuCisgIH0KKworICByZXR1cm4gOjpTZXRTcGVsbEZhdGlndWUoZHVyYXRpb24sIGtleSk7Cit9CisKKy8qKiBCZWZlaGxzZnVua3Rpb24gZnVlciBTcGllbGVyIHVtIGRlbiBTcGVsbGZhdGlndWUtS29tcGF0aWJpbGl0YWV0c21vZHVzCisgKiB1bXp1c2NoYWx0ZW4uCisgKi8KK3B1YmxpYyBpbnQgZW5hYmxlX3NwZWxsX2ZhdGlndWVfY29tcGF0KHN0cmluZyBjbWQpIHsKKyAgaWYgKFF1ZXJ5UHJvcChQX0xBU1RfQ09NQkFUX1RJTUUpICsgNjAwID4gdGltZSgpKSB7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIkltIEthbXBmIG9kZXIga3VyeiBuYWNoIGVpbmVtIEthbXBmIGthbm5zdCBEdSBuaWNodCB6d2lzY2hlbiAiCisgICAgICAiYWx0ZXIgdW5kIG5ldWVyIFNwcnVjaGVybXVlZHVuZyB1bXNjaGFsdGVuLlxuIgorICAgICAgIk1vbWVudGFuIGJlbnV0enQgRHUgZGllICIKKyAgICAgICsgKHNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGUgPyAiYWx0ZSAodW5nZW5hdWVyZSkiIDogIm5ldWUgKG5vcm1hbGUpIikKKyAgICAgICsgIiBTcHJ1Y2hlcm11ZWR1bmcuIiw3OCwwLEJTX0xFQVZFX01ZX0xGUykpOworICAgIHJldHVybiAxOworICB9CisKKyAgaWYgKGNtZD09ImFsdCIpIHsKKyAgICBzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlPXRpbWUoKTsKKyAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAiQWx0ZSBTcHJ1Y2hlcm11ZWR1bmcgd3VyZGUgZWluZ2VzY2hhbHRldC4gQWxsZSBFcm11ZWR1bmdzcGF1c2VuICIKKyAgICAgICJ6d2lzY2hlbiBTcHJ1ZWNoZW4gd2VyZGVuIGF1ZiBWaWVsZmFjaGUgdm9uIDJzIGF1ZmdlcnVuZGV0IHVuZCAiCisgICAgICAiYmVnaW5uZW4gaW4gZGVyIFJlZ2VsIGFtIEFuZmFuZyBEZWluZXIgS2FtcGZydW5kZS4iKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoY21kPT0ibmV1IiB8fCBjbWQ9PSJub3JtYWwiKSB7CisgICAgc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZT0wOworICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICJOb3JtYWxlIFNwcnVjaGVybXVlZHVuZyB3dXJkZSBlaW5nZXNjaGFsdGV0LiBBbGxlIEVybXVlZHVuZ3NwYXVzZW4gIgorICAgICAgInp3aXNjaGVuIFNwcnVlY2hlbiB3ZXJkZW4gc2VrdW5kZW5nZW5hdSBiZXJlY2huZXQuIikpOworICAgIHJldHVybiAxOworICB9CisKKyAgbm90aWZ5X2ZhaWwoYnJlYWtfc3RyaW5nKAorICAgICAgIk1vZWNodGVzdCBEdSBkaWUgYWx0ZSBvZGVyIGRpZSBuZXVlIFNwcnVjaGVybXVlZHVuZz9cbiIKKyAgICAgICJNb21lbnRhbiBiZW51dHp0IER1IGRpZSAiCisgICAgICArIChzcGVsbF9mYXRpZ3VlX2NvbXBhdF9tb2RlID8gImFsdGUgKHVuZ2VuYXVlcmUpIiA6ICJuZXVlIChub3JtYWxlKSIpCisgICAgICArICIgU3BydWNoZXJtdWVkdW5nLiIsNzgsMCxCU19MRUFWRV9NWV9MRlMpKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKiBTcGVpY2hlcnQgZGllIFplaXQgZGVzIGxldHp0ZXMgSGVhcnRiZWF0cy4KKyAqLworcHJvdGVjdGVkIHZvaWQgaGVhcnRfYmVhdCgpIHsKKyAgaWYgKHNwZWxsX2ZhdGlndWVfY29tcGF0X21vZGUpCisgICAgc3BlbGxfZmF0aWd1ZV9jb21wYXRfbW9kZSA9IHRpbWUoKTsKK30KKworc3RhdGljIGludCBfc2V0X2d1aWxkX2xldmVsKGludCBudW0pCit7IHN0cmluZyBnaWxkZTsKKyAgbWFwcGluZyBsZXZlbHM7CisKKyAgaWYgKCAhKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworCisgIGlmICggIW1hcHBpbmdwKGxldmVscz1RdWVyeShQX0dVSUxEX0xFVkVMKSkgKQorICAgIGxldmVscz0oW10pOworCisgIGxldmVsc1tnaWxkZV09bnVtOworICBTZXQoUF9HVUlMRF9MRVZFTCxsZXZlbHMpOworICBHTUNQX0NoYXIoIChbUF9HVUlMRF9MRVZFTDogbnVtXSkgKTsKKworICByZXR1cm4gbnVtOworfQorCitzdGF0aWMgaW50IF9xdWVyeV9ndWlsZF9sZXZlbCgpCit7IHN0cmluZyAgZ2lsZGU7CisgIG1hcHBpbmcgbGV2ZWxzOworCisgIGlmICggIShnaWxkZT1RdWVyeVByb3AoUF9HVUlMRCkpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoICFtYXBwaW5ncChsZXZlbHM9UXVlcnkoUF9HVUlMRF9MRVZFTCkpICkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBsZXZlbHNbZ2lsZGVdOworfQorCitzdGF0aWMgc3RyaW5nIF9zZXRfZ3VpbGRfdGl0bGUoc3RyaW5nIHQpCit7IHN0cmluZyBnaWxkZTsKKyAgbWFwcGluZyB0aXRsZXM7CisKKyAgaWYgKCAhKGdpbGRlPVF1ZXJ5UHJvcChQX0dVSUxEKSkgKQorICAgIHJldHVybiAwOworCisgIGlmICggIW1hcHBpbmdwKHRpdGxlcz1RdWVyeShQX0dVSUxEX1RJVExFKSkgKQorICAgIHRpdGxlcz0oW10pOworCisgIHRpdGxlc1tnaWxkZV09dDsKKyAgU2V0KFBfR1VJTERfVElUTEUsdGl0bGVzKTsKKyAgR01DUF9DaGFyKCAoW1BfR1VJTERfVElUTEU6IHRdKSApOworICByZXR1cm4gdDsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfZ3VpbGRfdGl0bGUoKQoreyBzdHJpbmcgZ2lsZGUsdDsKKyAgb2JqZWN0IGc7CisgIG1hcHBpbmcgdGl0bGVzOworCisgIGlmICggIShnaWxkZT1RdWVyeVByb3AoUF9HVUlMRCkpICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoICFtYXBwaW5ncCh0aXRsZXM9UXVlcnkoUF9HVUlMRF9USVRMRSkpICkKKyAgICB0aXRsZXM9KFtdKTsKKworICB0PXRpdGxlc1tnaWxkZV07CisgIGlmICggIXQgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKQorICAgICAgJiYgb2JqZWN0cChnPWZpbmRfb2JqZWN0KCIvZ2lsZGVuLyIrZ2lsZGUpKSApCisgIHsKKyAgICBnLT5hZGp1c3RfdGl0bGUodGhpc19vYmplY3QoKSk7CisgICAgU2V0UHJvcChQX1RJVExFLDApOworCisgICAgaWYgKCAhbWFwcGluZ3AodGl0bGVzPVF1ZXJ5KFBfR1VJTERfVElUTEUpKSApCisgICAgICByZXR1cm4gMDsKKworICAgIHQ9dGl0bGVzW2dpbGRlXTsKKyAgfQorCisgIHJldHVybiB0OworfQorCisKK3N0YXRpYyBzdHJpbmcgX3NldF9ndWlsZChzdHJpbmcgZ2lsZGVubmFtZSkKK3sgb2JqZWN0IHByZTsKKworICBpZiAoIW9iamVjdHAocHJlPXByZXZpb3VzX29iamVjdCgpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIHByZSE9dGhpc19vYmplY3QoKSAvLyBEYXMgTGViZXdlc2VuIHNlbGJlciBkYXJmIGRpZSBHaWxkZSBzZXR6ZW4sCisgICAgICAmJiBvYmplY3RfbmFtZShwcmUpIT1HVUlMRE1BU1RFUiAgLy8gZGVyIEdpbGRlbm1hc3RlciBhdWNoCisgICAgICAmJiAoIXRoaXNfcGxheWVyKCkKKyAgICAgICAgICB8fCB0aGlzX3BsYXllcigpICE9IHRoaXNfaW50ZXJhY3RpdmUoKQorICAgICAgICAgIHx8ICFJU19BUkNIKHRoaXNfcGxheWVyKCkpCisgICAgICAgICApCisgICAgICApCisgICAgcmV0dXJuIDA7CisKKyAgU2V0KFBfR1VJTEQsZ2lsZGVubmFtZSk7CisgIEdNQ1BfQ2hhciggKFtQX0dVSUxEOiBnaWxkZW5uYW1lXSkgKTsKKyAgcmV0dXJuIGdpbGRlbm5hbWU7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X2d1aWxkKCkKK3sgc3RyaW5nIHJlczsKKworICBpZiAoICEocmVzPVF1ZXJ5KFBfR1VJTEQpKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICkKKyAgeworICAgIC8vIFNwaWVsZXIsIGRpZSBrZWluZXIgR2lsZGUgYW5nZWhvZXJlbiwgZ2Vob2VyZW4genVyIEFiZW50ZXVyZXJnaWxkZQorICAgIGlmICggIShyZXM9UXVlcnlQcm9wKFBfREVGQVVMVF9HVUlMRCkpICkKKyAgICAgIHJldHVybiBERUZBVUxUX0dVSUxEOworICAgIGVsc2UKKyAgICAgIFNldChQX0dVSUxELHJlcyk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJpbmcgX3F1ZXJ5X3RpdGxlKCkKK3sgc3RyaW5nIHRpOworCisgIGlmICggc3RyaW5ncCh0aT1RdWVyeShQX1RJVExFKSkgKQorICAgIHJldHVybiB0aTsKKworICByZXR1cm4gUXVlcnlQcm9wKFBfR1VJTERfVElUTEUpOworfQorCitzdGF0aWMgc3RyaW5nIF9zZXRfdGl0bGUoc3RyaW5nIHQpCit7CisgIFNldChQX1RJVExFLCB0LCBGX1ZBTFVFKTsKKyAgR01DUF9DaGFyKCAoW1BfVElUTEU6IHRdKSApOworICByZXR1cm4gdDsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zb3VsLmMgYi9zdGQvcGxheWVyL3NvdWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzhmMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zb3VsLmMKQEAgLTAsMCArMSwzMjE4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3NvdWwuYyAtLSBEaWUgU2VlbGUgZGVzIFNwaWVsZXJzCisvLworLy8gJElkOiBzb3VsLmMgOTUyNyAyMDE2LTAzLTEyIDExOjM3OjU0WiBBcmF0aG9ybiAkCisKKy8vIExldHp0ZSBBZW5kZXJ1bmcgdm9tIDA4LjA5Ljk1ICBXYXJnb24KKworLy8gU2V0IFRhYlN0b3AgdG8gMiBjaGFyYWN0ZXJzCisKKy8qIFZlcnNpb24gMS40MSBNRywgU2VwdGVtYmVyIDk1CisgICAtIEJlaSAiZnJhZ2UiIHVuZCAiYW50d29ydGUiIFRlc3QgYXVmIFBfUEVSTV9TVFJJTkcgZnVlciBTcHJhY2hmbHVlY2hlLgorICAgLSBidWdmaXggYmVpICJzY2h3ZWlnZSIgKG5haG0ga2VpbmUgQWR2ZXJiaWVuIGFuKQorICAgKi8KKworLyogVmVyc2lvbiAxLjQgTUcsIEF1Z3VzdCA5NQorICAgLSBIaWxmZWZ1bmt0aW9uIGVpbmdlYmF1dCwgc2llaGUgYXVjaCBzb3VsaGVscC5jCisgICAtIGVpbmlnZSBrbGVpbmVyZSBBZW5kZXJ1bmdlbiBlcnN0IGpldHp0IGR1cmNoIGVpbmUgbmV1ZSBWZXJzaW9uIGdld3VlcmRpZ3QKKyAgIC0gbmV1ZSBWZXJiZW4sIHdpZSBlaWdlbnRsaWNoIGZhc3QgaW1tZXIgOj4KKyAgIC0gdHlwb3MgdW5kIGJ1Z3MgZ2VmaXhlZCAodW5kIG5ldWUgZWluZ2ViYXV0Li4uKQorICAgLSBGdW5rdGlvbiB6dXIgQWJmcmFnZSB2b24gQWR2ZXJiaWVuIHZvbiBhdXNzZW4gZWluZ2ViYXV0IChIYWxsbywgQW50aGVhIDo+KQorICAgLSBzbyBzY2hsaW1tIGthbm4gZGFzIGRvY2ggbmljaHQgc2VpbiwgZWluZW4gVGFiU3RvcCB2b24gMiB6dSBuZWhtZW4sIGZ1ZXIKKyAgICAgZGllc2VzIGVpbmUgZmlsZSwgYWxsZXMgYW5kZXJlIHplcmxlZ3QgbWVpbmUgRm9ybWF0aWVydW5nIGltbWVyIHNvIDo8CisgICAtIGtvZW5udGV0IGlociBiaXR0ZSBtYWwgb2JlbiBkYXMgIkxldHp0ZSBBZW5kZXJ1bmciIGFlbmRlcm4sIHdlbm4gaWhyCisgICAgIGlyZ2VuZHdvIHdhcyBhZW5kZXJ0PworICAgKi8KKworLyogVmVyc2lvbiAxLjM1IE1HLCBEZXplbWJlciA5NAorICAgLSBWZXJiZW4KKyAgIC0gQWVuZGVydW5nIGRlcyBQYXJzaW5ncyBkZXIgcXVvdGVkIGFkdmVyYnMKKyAgIC0gcmtudWRkZWwgaWdub3JpZXJlbiB3aXJkIHZvbSBub3JtYWxlbiBpZ25vcmUgdWViZXJub21tZW4KKyAgICovCisKKy8qIFZlcnNpb24gMS4zMiBNRywgSnVsaSA5NAorICAgLSBlaW5pZ2UgVmVyYmVuCisgICAtIGlnbm9yaWVyZW4gZGVzIHJrbnVkZGVsCisgICAqLworCisvKiBWZXJzaW9uIDEuMzEgTUcsIE1haSA5NAorICAgLSBlaW5pZ2UgVmVyYmVuCisgICAqLworCisvKiBWZXJzaW9uIDEuMyBNRywgTWFpIDk0CisgICAtIHF1b3RlZCBhZHZlcmJzIEdFSEVOIGpldHp0CisgICAtIFBhcnNlUmVzdCAvIFBhcnNlUmVtb3RlIG5ldSBnZXNjaHJpZWJlbgorICAgKi8KKworLyogVmVyc2lvbiAxLjIxIE1HLCBBcHJpbCA5NAorICAgLSBxdW90ZWQgYWR2ZXJicworICAgKi8KKworLyogRGFua2UgYW4gQW5ndXMgZnVlciBkZW4gVGV4dCB2b24gImxpZWJlIiAqLworCisvKiBWZXJzaW9uIDEuMiBNRywgSmFudWFyIDk0CisgICAtIFVtc3RlbGx1bmcgZGVyIEZlZWxpbmdzIHZvbiB2aWVsZW4ga2xlaW5lbiBGdW5rdGlvbmVuIGF1ZiBlaW5lIGdyb3NzZSwKKyAgICAgZGFtaXQgZGVyIEZ1bmt0aW9uc292ZXJoZWFkIHdlZ2ZhZWxsdC4KKyAgIC0gbmV1ZSBBdXNnYWJlIGRlciBBZHZlcmJpZW4sIG1pdCBtb3JlIHVuZCBudXIgbm9jaCBlaW5lcyBwcm8gWmVpbGUKKyAgIC0gbWFsIHdpZWRlciBuZXVlIFZlcmJlbi4KKyAgIC0gdW5kIGRhcyBuZXVlIFN0YW5kYXJkYWR2ZXJiICJqb2ZpIiA6KQorICAgKi8KKworLyogVmVyc2lvbiAxLjEgTUcsIE5vdmVtYmVyIDkzCisgICBBZW5kZXJ1bmdlbjoKKyAgIC0gSWNoIGhhYmUgImFsbGUobikiIGVpbmdlYmF1dC4gRGllIFZlcndhbHR1bmcgc3RlaHQsIG1hbiBrYW5uIGpldHp0CisgICAgIFZlcmJlbiBkaWUgTW9lZ2xpY2hrZWl0ICJhbGxlIiBnZWJlbiAoQnNwLiAid2luayBhbGxlIikuCisgICAtIGluendpc2NoZW4gd2llZGVyIGVpbmlnZSBWZXJiZW4gbWVociwgYWJlciBtdXNzIGljaCBkYXMgbm9jaAorICAgICBlcndhZWhuZW4/CisgICAtIChIQVNTKSBSdW1hdGEgaGF0IG1laW4gc2Nob2VuZXMgU3lzdGVtIGZ1ZXIgZGllIEF1c2dhYmVzdHJpbmdzCisgICAgIHZlcmtvbXBsaXppZXJ0LiBTdGF0dCAmYSBzdGVodCBkYSBqZXR6dCB6LkIuIEBAYWR2ZXJiQEAsIHdhcyBpbgorICAgICBlaW5lciB3ZWl0ZXJlbiB1bm5vZXRpZ2VuIEZ1bmt0aW9uIHJlc3VsdGllcnRlLiBOYWphLgorICAgSGlnaGxhbmRlciByeW4gVGFoYXIKKyAgICovCisKKy8qCisgICBIYSEgSWNoIG5laG1lIGpldHp0IGRpZSBlcnN0ZSBnYW56ZSBWZXJzaW9uc251bW1lciBmdWVyIG1pY2ggaW4gQW5zcHJ1Y2ggOikKKyAgIFNvLCBoZXV0ZSBpc3QncyBnZXNjaGFmZnQgKEljaCBhdWNoLi4uKS4gSWNoIGJpbiBmZXJ0aWcgLSBpY2ggbWFjaCBudXIKKyAgIG5vY2ggbmV1ZSBWZXJiZW4gcmVpbiwgd2VubiBJZGVlbiBrb21tZW4uCisgICBHZWdlYmVuIGFuIERpZW5zdGFnLCBkZW0gMjIuIEp1bmkgMTk5MyBpbSBoZWltYXRsaWNoZW4gSG9yc3QuCisgICBIaWdobGFuZGVyIHJ5biBUYWhhci4KKyAgIFAuUy46IEtvcGllcmUgc2ljaCBkYXMgRGluZywgd2VyIHdpbGwgLSB1bnRlciBmb2xnZW5kZW4gQmVkaW5ndW5nZW46CisgICAtIERlbiBHb2V0dGVybiB2b24gTW9yZ2VuR3JhdWVuIHVuZAorICAgLSBIaWdobGFuZGVyQFRBUFBNdWQgICAgIEJlc2NoZWlkIHNhZ2VuIHVuZCBhdXNzZXJkZW0KKyAgICpzZXVmeiogbmVobXQgSGlnaGxhbmRlciBoaWVyIGluIE1vcmdlbkdyYXVlbiEhIC1IclQKKyAgIEhhISBJaHIga29lbm50IHdpZWRlciBUQVBQTXVkIG5laG1lbiA6PiAgQWJlciBzYWd0J3MgcnVoaWcgaW4gTUcuIC1IclQKKyAgIC0gZW50d2VkZXIgZGVuIGdhbnplbiBTY2h3YWxsIGhpZXIgZHJpbmxhc3NlbiBvZGVyIG1pY2ggbWl0IGVpbmVtCisgICBuZXVlbiBUZXh0IGVyd2FlaG5lbi4KKyAgIERhcyBHYW56ZSB1bnRlciBkZXIgVm9yYXVzc2V0enVuZywgZGFzcyB1ZWJlcmhhdXB0IG1hbCBqZW1hbmQgZWluZSBkZXV0c2NoZQorICAgU2VlbGUgYnJhdWNodCB1bmQgc2llIG5pY2h0IHNlbGJlciBzY2hyZWliZW4gd2lsbCA6LSkgKGVyc3BhcnRzIGV1Y2ggbGllYmVyKQorICAgSGlnaGxhbmRlciByeW4gVGFoYXIuCisKKyAgICoqQXJiZWl0OgorICAgRWluYmF1IHZvbiBBZHZlcmJpZW4sIGFuZGVyZSBSZWFrdGlvbmVuIGJlaSBHZWlzdGVybiBhbHMgIldpZSBiaXR0ZT8iLAorICAgZWluaWdlIG5ldWUgVmVyYmVuLCBlaW5pZ2UgYWx0ZSBWZXJiZW4gcmF1c2dlc2NobWlzc2VuLgorICAgV2VpbCBlcyBQcm9ibGVtZSBtaXQgZGVtIGF1dG9sb2FkaW5nIGRlciBwbGF5ZXJhZHZlcmJzIGdhYiwgd3VyZGUKKyAgIGF1c3NlcmRlbSBkaWUgc291bCB2b20gT2JqZWt0IHp1bSBpbmhlcml0ZmlsZSBmdWVyIGRpZSBwbGF5ZXJzaGVsbC4KKworICAgKipJZGVlbiAgenVtIFdlaXRlcm1hY2hlbjoKKyAgIC0gKHZlcmIpIGFsbGUsIHouQi4gdHJpdHQgYWxsZSAgIC0tIE1vZWdsaWNoa2VpdCBlaW5nZWJhdXQKKyAgIC0gR2Vpc3RlcnZlcmJlbiBtaXQgQWR2ZXJiCisKKyAgIFZlcnNpb24gMS4wIGZ1ZXIgTW9yZ2VuR3JhdWVuICAgIEhpZ2hsYW5kZXIgTWFpL0p1bmkgOTMKKyAgICovCisKKworLyogSGllciBpc3Qgc2llIG51biwgZGllIERFVVRTQ0hFIHZlcnNpb24gZGVyIHNvdWwsCisgICB2aWVsIFNwYXNzIGRhbWl0LgorICAgUG9pZXRpeCAgTWFpIDE5OTIKKyAgIFZlcnMuOiAwLjQgZnVlciBKUk11ZAorICAgUC5TLiBiaXR0ZSBtZWNrZXJ0IG5pY2h0IGRyYW4gcnVtICwgc29uZGVybiB2ZXJiZXNzZXJ0IHVuZAorICAgZXJ3ZWl0ZXJ0IHNpZS4KKworICAgT2xwcCBOb3ZlbWJlciAxOTkyCisgICBWZXJzLjogMC41IGZ1ZXIgTW9yZ2VuR3JhdWVuCisKKyAgIEhlLCBPbHBwLCBzY2hyZWlidCBtYW4gbmljaHQgZGllIG5ldWVzdGUgQWVuZGVydW5nIFVFQkVSIGRpZSBhbHRlbj8KKyAgICpncmlucyosIEhpZ2hsYW5kZXIKKyAgICovCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgcGVkYW50aWMKKworI2RlZmluZSBTT1VMSEVMUCAiL3N0ZC9wbGF5ZXIvc291bGhlbHAiCisjZGVmaW5lIExGICJcbiIKKyNkZWZpbmUgTk9UX1NFTEYgMQorI2RlZmluZSBOT1RfREVBRCAxCisKKyNkZWZpbmUgUVBQIFF1ZXJ5UG9zc1Byb25vdW4KKyNkZWZpbmUgUkVUVVJOIHJldHVybiBfbm90aWZ5X2ZhaWwKKyNkZWZpbmUgUmV0dXJuIHJldHVybiAwfHxfbm90aWZ5X2ZhaWwgIC8vIG5ldHRlciBUcmljaywgbXVzcyBpY2ggbWlyIG1lcmtlbiAtSHJUCisjZGVmaW5lIEdIT1NUQ0hFQ0soc2VsLG90aCx2aWMpIGlmIChnaG9zdCgpKSB7ICB3cml0ZShzZWwpOyBzYXkob3RoLHdob3x8TUUpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmljKSB3aG8tPk1lc3NhZ2UodmljKTsgcmV0dXJuIDE7ICB9CisjZGVmaW5lIEhFTFBDSEVDSyh4KSBpZiAoc3RyICYmIChzdHI9PSItaCIgfHwgc3RyPT0iLT8iIHx8IHN0cj09Ii9oIiBcCisgICAgICAgICB8fCBzdHI9PSIvPyIgfHwgc3RyPT0iaGlsZmUiKSlcCisgICAgICAgICAgICAgICAgICAgICAgIHsgTW9yZShTT1VMSEVMUC0+SGVscCh4KSk7IHJldHVybiAxOyB9CisKKy8vICJzY2hhdSBhbiIgYWxzIG5pY2h0LVVudGVyc3VjaHVuZy4gS2xhcHB0IGFiZXIgYW5zY2hlaW5lbmQgbmljaHQsIHdlaWwKKy8vIGljaCBuaWNodCBnZWdlbiBkZW4gR0QgYW5rb21tZS4gQWxzbyBiZXNzZXIgYXVza29tbWVudGllcnQgbGFzc2VuLgorI2lmZGVmIFNDSEFVX0FOCisjdW5kZWYgU0NIQVVfQU4KKyNlbmRpZgorCisvLyBBbnBpZXBzZW4gbWl0IFRleHQuIEltIE1vbWVudCBlcmxhdWJ0LCBiZWkgTWlzc2ZhbGxlbiBhdXNrb21tZW50aWVyZW4gdW5kCisvLyBpbiBkZXIgSGlsZmUgYXVza29tbWVudGllcmVuLgorI2lmZGVmIFdFQ0tFCisjdW5kZWYgV0VDS0UKKyNlbmRpZgorCisjZGVmaW5lIFdFQ0tFCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8cGxheWVyL2NvbW0uaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI3VuZGVmIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGNsYXNzLmg+CisKK3N0YXRpYyBvYmplY3Qgd2hvLCBvZm9vOworc3RhdGljIGludCBmb3JfYWxsLCBmbGFnLCBpZm9vOworbWFwcGluZyBwbHJfYWR2ZXJiczsKK3N0YXRpYyBzdHJpbmcgb3V0X3NlbCwgb3V0X3ZpYywgb3V0X290aCwgYWR2ZXJiLCBzZm9vOworCitwcml2YXRlIHZvaWQgUGFyc2VBZHZlcmIoc3RyaW5nICp3b3Jkcyk7Citwcml2YXRlIHN0cmluZyBjb252ZXJ0X3N0cmluZyhzdHJpbmcgc3RyKTsKK3ZhcmFyZ3MgbWl4ZWQgTW9yZShzdHJpbmcgc3RyLCBpbnQgZmZsYWcsIHN0cmluZyByZXR1cm50byk7CitzdHJpbmcgTWF0Y2hBZHZlcmIoc3RyaW5nIHN0cik7CisKK21hcHBpbmcKK1F1ZXJ5U3RkQWR2ZXJicygpICB7CisgIHJldHVybiAoWworICAgICJ1bnZlIiA6ICJ1bnZlcnNjaGFlbXQiLAorICAgICJndXRnIiA6ICJndXRnZWxhdW50IiwKKyAgICAiZ3V0bSIgOiAiZ3V0bXVldGlnIiwKKyAgICAiZnJvaCIgOiAiZnJvaCIsCisgICAgImdsdWUiIDogImdsdWVja2xpY2giLAorICAgICJ3dWV0IiA6ICJ3dWV0ZW5kIiwKKyAgICAiZnJlYyIgOiAiZnJlY2giLAorICAgICJkYWVtIiA6ICJkYWVtb25pc2NoIiwKKyAgICAiYm9lcyIgOiAiYm9lc2UiLAorICAgICJ1bmdsIiA6ICJ1bmdsdWVja2xpY2giLAorICAgICJsYW5nIiA6ICJsYW5nc2FtIiwKKyAgICAic2NobiIgOiAic2NobmVsbCIsCisgICAgImphbW0iIDogImphbW1lcm5kIiwKKyAgICAiZnJldSIgOiAiZnJldW5kbGljaCIsCisgICAgInNodWUiIDogInNjaHVlY2h0ZXJuIiwKKyAgICAiYW11ZSIgOiAiYW11ZXNpZXJ0IiwKKyAgICAiYWVyZyIgOiAiYWVyZ2VybGljaCIsCisgICAgImFuZXIiIDogImFuZXJrZW5uZW5kIiwKKyAgICAiZXJzdCIgOiAiZXJzdGF1bnQiLAorICAgICJiaXR0IiA6ICJiaXR0ZXIiLAorICAgICJicmVpIiA6ICJicmVpdCIsCisgICAgInZvcnMiIDogInZvcnNpY2h0aWciLAorICAgICJjaGFyIiA6ICJjaGFybWFudCIsCisgICAgImthbHQiIDogImthbHQiLAorICAgICJ2ZXJmIiA6ICJ2ZXJmdWVocmVyaXNjaCIsCisgICAgInp1ZnIiIDogInp1ZnJpZWRlbiIsCisgICAgInRpZWYiIDogInRpZWYiLAorICAgICJ2ZXJ6IiA6ICJ2ZXJ6d2VpZmVsdCIsCisgICAgImRyZWMiIDogImRyZWNraWciLAorICAgICJ2ZXJ0IiA6ICJ2ZXJ0cmFldW10IiwKKyAgICAidWViZSIgOiAidWViZXJ6ZXVndCIsCisgICAgImZydXMiIDogImZydXN0cmllcnQiLAorICAgICJzdHJhIiA6ICJzdHJhaGxlbmQiLAorICAgICJob2ZmIiA6ICJob2ZmbnVuZ3N2b2xsIiwKKyAgICAidW5nZSIgOiAidW5nZWR1bGRpZyIsCisgICAgInVuc2kiIDogInVuc2lubmlnZXJ3ZWlzZSIsCisgICAgInVuc2MiIDogInVuc2NodWxkaWciLAorICAgICJ1bndpIiA6ICJ1bndpc3NlbmQiLAorICAgICJpcm9uIiA6ICJpcm9uaXNjaCIsCisgICAgIndpc3MiIDogIndpc3NlbmQiLAorICAgICJnZW1hIiA6ICJnZW1hZWNobGljaCIsCisgICAgInNlaG4iIDogInNlaG5zdWVjaHRpZyIsCisgICAgImxhdXQiIDogImxhdXQiLAorICAgICJsaWViIiA6ICJsaWViZXZvbGwiLAorICAgICJmcm9lIiA6ICJmcm9laGxpY2giLAorICAgICJkYW5rIiA6ICJkYW5rYmFyIiwKKyAgICAibmF0dSIgOiAibmF0dWVybGljaCIsCisgICAgImdlZHUiIDogImdlZHVsZGlnIiwKKyAgICAicGVyZiIgOiAicGVyZmVrdCIsCisgICAgInZlcnMiIDogInZlcnNwaWVsdCIsCisgICAgImhvZWYiIDogImhvZWZsaWNoIiwKKyAgICAic3RvbCIgOiAic3RvbHoiLAorICAgICJmcmFnIiA6ICJmcmFnZW5kIiwKKyAgICAicnVwcCIgOiAicnVwcGlnIiwKKyAgICAidHJhdSIgOiAidHJhdXJpZyIsCisgICAgInZlcmEiIDogInZlcmFlY2h0bGljaCIsCisgICAgInNjaGEiIDogInNjaGFtbG9zIiwKKyAgICAiZXJucyIgOiAiZXJuc3QiLAorICAgICJzY2h1IiA6ICJzY2h1ZWNodGVybiIsCisgICAgInphZXIiIDogInphZXJ0bGljaCIsCisgICAgInNhbmYiIDogInNhbmZ0IiwKKyAgICAiZW50ZyIgOiAiZW50Z2Vpc3RlcnQiLAorICAgICJoZWltIiA6ICJoZWltdHVlY2tpc2NoIiwKKyAgICAiZ2VsYSIgOiAiZ2VsYW5nd2VpbHQiLAorICAgICJ3aWxkIiA6ICJ3aWxkIiwKKyAgICAiam9maSIgOiAid2llIEpvZiwgd2VubiBlciBtYWwgbmljaHQgaWRsZXQiLAorICBdKTsKK30KKworbWFwcGluZworUXVlcnlBZHZlcmJzKCkgeworICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICByZXR1cm4gZGVlcF9jb3B5KHBscl9hZHZlcmJzKTsKKyAgcmV0dXJuIHBscl9hZHZlcmJzOworfQorCitzdHJpbmcKK01hdGNoQWR2ZXJiKHN0cmluZyBhKSAgeworICBQYXJzZUFkdmVyYihleHBsb2RlKGEsIiAiKSk7CisgIHJldHVybiBhZHZlcmI7Cit9CisKKy8vIFZlcndhbHR1bmdzcm91dGluZW4KKworc3RhdGljIHZvaWQKK2FkZF9zb3VsX2NvbW1hbmRzKCkgIHsKKyAgaWYgKCFwbHJfYWR2ZXJicykKKyAgICBwbHJfYWR2ZXJicz0oW10pOworICBhZGRfYWN0aW9uKCJTb3VsQ29tbSIsICIiLCAxKTsKK30KKworc3RhdGljIGludAordmVyYmVuX2xpc3RlKCkgIHsKKyAgTW9yZShTT1VMSEVMUC0+SGVscCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgZ2hvc3QoKSBRdWVyeVByb3AoUF9HSE9TVCkKKyNkZWZpbmUgZnJvZygpIFF1ZXJ5UHJvcChQX0ZST0cpCisjZGVmaW5lIGNhcG5hbWUoKSBjYXBpdGFsaXplKG5hbWUoKSkKKyNkZWZpbmUgZ25hbWUoKSAoZ2hvc3QoKT8oZnJvZygpPyJEZXIgR2Vpc3QgZWluZXMgRnJvc2NoZXMiXAorCQkJICAgICAgICA6IkRlciBHZWlzdCB2b24gIitjYXBuYW1lKCkpXAorCQkgICAgICAgIDpjYXBuYW1lKCkpCisKK3ZhcmFyZ3MgcHJpdmF0ZSB2b2lkCitQYXJzZVJlc3Qoc3RyaW5nIGFyZywgbWl4ZWQgZXh0cmEpICB7CisgIHN0cmluZyB3ZXIsd2llLCp3b3JkcyxxdW90ZWE7CisgIGludCBudW0sYmlzOworICB3aG8gPSBmb3JfYWxsID0gYWR2ZXJiID0gMDsKKyAgaWYgKCFhcmcpIHJldHVybjsKKyAgaWYgKGV4dHJhKQorICAgIGlmICghcG9pbnRlcnAoZXh0cmEpKSB7CisgICAgICBpZiAoc3NjYW5mKGFyZywgZXh0cmErIiAlcyIsIHdpZSk9PTEpCisgICAgICBhcmc9d2llOworICAgIH0KKyAgICBlbHNlCisgICAgICBmb3IgKGJpcz1zaXplb2YoZXh0cmEpLG51bT0wOyBudW08YmlzOyBudW0rKykKKyAgICAgICAgaWYgKHNzY2FuZihhcmcsIGV4dHJhW251bV0rIiAlcyIsIHdpZSk9PTEpCisgICAgICAgICAgYXJnPXdpZTsKKworICBpZiAoKGJpcz1zdHJzdHIoYXJnLCAiLyIpKT49MCkKKyAgICBxdW90ZWE9YXJnW2Jpcy4uXSxhcmc9YXJnWzAuLmJpcy0xXTsKKyAgcXVvdGVhPXF1b3RlYXx8IiIsYXJnPWFyZ3x8IiI7CisKKyAgd29yZHM9ZXhwbG9kZShpbXBsb2RlKGV4cGxvZGUoYXJnLCAiLCIpLCAiIHVuZCIpLCAiICIpOworICBpZiAoIXNpemVvZih3b3JkcykpIHJldHVybjsKKyAgaWYgKHNpemVvZih3b3JkcykgJiYgKHdvcmRzWzBdPT0iYWxsZSIgfHwgd29yZHNbMF09PSJhbGxlbiIpKQorICAgIGZvcl9hbGw9MSx3ZXI9d29yZHNbMF0sd29yZHM9d29yZHNbMS4uXTsKKyAgaWYgKCFmb3JfYWxsKSAgeyAgICAgLyogbm9jaCBrZWluIE9wZmVyICovCisgICAgd2VyPW1hdGNoX2xpdmluZyhsb3dlcl9jYXNlKHdvcmRzWzBdKSk7CisgICAgaWYgKHN0cmluZ3Aod2VyKSkgd2hvPXByZXNlbnQod2VyLCBlbnZpcm9ubWVudChNRSkpOworICAgIGlmICghd2hvKSB3aG89cHJlc2VudCh3b3Jkc1swXSwgZW52aXJvbm1lbnQoTUUpKTsKKyAgICBpZiAod2hvICYmIHdoby0+UXVlcnlQcm9wKFBfSU5WSVMpKSB3aG89MDsKKyAgICB9CisgIGlmICh3aG8gJiYgc2l6ZW9mKHdvcmRzKSkKKyAgICB3b3Jkcz13b3Jkc1sxLi5dOyAgLyogT3BmZXIgZ2VmdW5kZW4gLSB3ZW5uJ3MgZWluZXMgZ2lidCAqLworICB3b3Jkcys9ZXhwbG9kZShxdW90ZWEsICIgIik7CisgIHdvcmRzLT0oeyIifSk7CisgIGlmIChzaXplb2Yod29yZHMpKSBQYXJzZUFkdmVyYih3b3Jkcyk7Cit9CisKK3ByaXZhdGUgaW50CitQYXJzZVJlbW90ZShzdHJpbmcgYXJnKSAgeworICBzdHJpbmcgd2VyLCp3b3JkczsgCisKKyAgYWR2ZXJiID0gMDsgLy8gQWR2ZXJiIHZvbSBsZXR6dGVuIE1hbCBrZWluZXNmYWxscyB3aWVkZXJ2ZXJ3ZW5kZW4uIDstKQorCisgIGlmICghc3RyaW5ncChhcmcpIHx8ICFzaXplb2YoYXJnKSkgcmV0dXJuIDA7CisgIAorICB3b3Jkcz1leHBsb2RlKGFyZywiICIpOworCisgIG1peGVkIGxpdiA9IG1hdGNoX2xpdmluZyhsb3dlcl9jYXNlKHdvcmRzWzBdKSk7CisgIGlmIChzdHJpbmdwKGxpdikpCisgICAgICB3aG89ZmluZF9wbGF5ZXIobGl2KTsKKyAgCisgIGlmICh3aG8pIHsKKyAgICAvLyBaaWVsIGlzdCBlaW4gU3BpZWxlci4KKyAgICBpZiAoIXdoby0+UXVlcnlQcm9wKFBfSU5WSVMpIHx8IElTX1dJWkFSRChNRSkpCisgICAgeworICAgICAgLy8gU3BpZWxlciBpc3QgbmljaHQgSW52aXMgb2RlciBpY2ggYmluIE1hZ2llci4KKyAgICAgIHN0cmluZyBuYW0gPSAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShNRSkgPyBnZXR1aWQoKSA6IAorCSAgICAgICAgICAgICBsb3dlcl9jYXNlKG5hbWUoUkFXKSkpOworICAgICAgaWYgKHF1ZXJ5X3ZlcmIoKVswLi41XT09InJrbnVkZCIgJiYKKwkgIHdoby0+VGVzdElnbm9yZShuYW0rIi5ya251ZGRlbCIpICkKKyAgICAgIHsKKyAgICAgICAgLy8gaWNoIG9kZXIgZGFzIEtvbW1hbmRvIHdlcmRlIGlnbm9yaWVydC4KKyAgICAgICAgd3JpdGUod2hvLT5OYW1lKFdFUikrIiBpZ25vcmllcnQgRGVpbmVuIEtudWRkZWx2ZXJzdWNoLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAvLyBTcGllbGVyIGlzdCBpbnZpcyB1bmQgaWNoIGJpbiBrZWluIE1hZ2llci4KKyAgICAgIHdobyA9IDA7CisgIH0KKyAgLy8ga2VpbiBlaW5nZWxvZ2d0ZXIgdW5kIHNpY2h0YmFyZXIgU3BpZWxlci4gVmllbGxlaWNodCBlaW4gTlBDPyAoQlRXOiBrZWluCisgIC8vIGVsc2UgaWYsIHdlaWwgaW0gaWYgZnVlciBTcGllbGVyIG9iZW4gd2hvIGdlbnVsbHQgd2VyZGVuIGthbm4gdW5kIGRhbm4KKyAgLy8gbm9jaG1hbCBuYWNoIG5lbSBOUEMgZ2VzdWNodCB3ZXJkZW4gc29sbC4pCisgIGlmICghd2hvKSB7CisgICAgd2VyID0gbWF0Y2hfbGl2aW5nKGxvd2VyX2Nhc2Uod29yZHNbMF0pKTsKKyAgICBpZihzdHJpbmdwKHdlcikpIAorICAgICAgd2hvPXByZXNlbnQod2VyLGVudmlyb25tZW50KE1FKSk7CisgICAgaWYgKCF3aG8pIHdobz1wcmVzZW50KHdvcmRzWzBdLCBlbnZpcm9ubWVudChNRSkpOworICAgIGlmICh3aG8gJiYgd2hvLT5RdWVyeVByb3AoUF9JTlZJUykpIHdobz0wOworICB9CisKKyAgaWYgKCF3aG8gfHwgc2l6ZW9mKHdvcmRzKT09MSkgcmV0dXJuIDA7CisgIHdvcmRzPXdvcmRzWzEuLl07CisgIFBhcnNlQWR2ZXJiKHdvcmRzKTsKKyAgcmV0dXJuKDApOworfQorCisvKioKKyBHaWJ0IGRlbiBwYXNzZW5kZW4gQWR2ZXJiLVRleHQgenUgZWluZW0ga2V5IHp1cnVlY2sKKyBccGFyYW0gcyBEYW5hY2ggd2lyZCBpbiBkZXIgQWR2ZXJiaWVuLUxpc3RlIGdlc3VjaHQKKyBccGFyYW0gZnV6enkgCisgXHJldHVybiBEZXIgZ2VmdW5kZW5lIEFkdmVyYmllbnRleHQgb2RlciAwCisgKi8KK3ZhcmFyZ3Mgc3RyaW5nIEdldFBsYXllckFkdmVyYiggc3RyaW5nIHMsIGludCBmdXp6eSApIHsKKyAgaW50IGksIGo7IAorICBzdHJpbmcgKnNlYXJjaF9wYXR0ZXJuLAorICAgICAgICAgKnNlYXJjaF9yZXN1bHQsIAorICAgICAgICAgIHJlc3VsdDsKKworICAvLyBFcnN0bWFsIGd1Y2tlbiwgb2IgZGVyIFN0cmluZyBkaXJla3QgZ2VmdW5kZW4gd2VyZGVuIGthbm4KKyAgLy8gZGFzIGdlaHQgYW0gc2NobmVsbHN0ZW4KKyAgcmVzdWx0ID0gUXVlcnlTdGRBZHZlcmJzKClbc10gfHwgcGxyX2FkdmVyYnNbc107CisKKyAgLy8gV2VubiBub2NoIGtlaW4gRXJnZWJuaXMgZ2VmdW5kZW4sIHVuZCBtYW4gdW5zY2hhcmYgc3VjaGVuIHdpbGwKKyAgaWYgKCBmdXp6eSAmJiAhcmVzdWx0KSB7CisKKyAgICAvLyBTdWNobXVzdGVyIGZ1ZXIgZGFzIEludGVyc2VjdCBlcnpldWdlbgorICAgIHNlYXJjaF9wYXR0ZXJuPSh7c30pOworCisgICAgaiA9IHNpemVvZihzKS0xOworICAgIGZvciAoIGk9MjsgIGkgPCBqIDtpKyspIHsKKyAgICAgIHNlYXJjaF9wYXR0ZXJuICs9ICh7c1swLi48aV19KTsKKyAgICB9CisKKyAgICAvLyBJbnRlcnNlY3Qgendpc2NoZW4gYWxsZW4gYmVrYW5udGVuIEFia3Vlcnp1bmdlbiB1bmQgU2VhcmNoLVBhdHRlcm4KKyAgICAvLyBlcnpldWdlbi4gRGllc2VzIHdpcmQgZGFubiBnbGVpY2h6ZWl0aWcgbmFjaCBMYWVuZ2Ugc29ydGllcnQKKyAgICAvLyBnZW5hdWVzdGVyIFRyZWZmZXIgPSBTdHJpbmcgbWl0IGdyb2Vzc3RlciBMYWVuZ2UKKyAgICBzZWFyY2hfcmVzdWx0ID0gc29ydF9hcnJheSgKKyAgICAgIChtX2luZGljZXMoUXVlcnlTdGRBZHZlcmJzKCkpIHwgbV9pbmRpY2VzKHBscl9hZHZlcmJzKSkmc2VhcmNoX3BhdHRlcm4sIAorICAgICAgICAgIyc+KTsKKworICAgIC8vIEFkdmVyYiB6dW0gZ2VuYXVlc3RlbiBUcmVmZmVyIHp1cnVlY2tnZWJlbgorICAgIGlmIChzaXplb2Yoc2VhcmNoX3Jlc3VsdCkpIAorICAgICAgcmVzdWx0ID0gUXVlcnlTdGRBZHZlcmJzKClbc2VhcmNoX3Jlc3VsdFswXV0gfHwgCisgICAgICAgICAgICAgICBwbHJfYWR2ZXJic1tzZWFyY2hfcmVzdWx0WzBdXTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICBQYXJzdCBkaWUgQWR2ZXJiaWVucGFyYW1ldGVyIGZ1ZXIgVmVyYmVuIHVuZCBzcGVpY2hlcnQgZGllCisgIHBhc3NlbmRlIFRleHRhdXNnYWJlIGluIGRlciBnbG9iYWxlbiBWYXJpYWJsZSAiYWR2ZXJiIgorICBccGFyYW0gd29yZHMgQXJyYXkgbWl0IGRlbiB6dSBwYXJzZW5kZW4gQWR2ZXJiaWVuLVN0cmluZ3MKKyovCitwcml2YXRlIHZvaWQKK1BhcnNlQWR2ZXJiKHN0cmluZyAqd29yZHMpICB7CisgIGludCBudW0sYW5kc2lnbixiaXM7CisgIHN0cmluZyBxYWR2LCphZHYsY250OworCisgIGFkdj0oe30pOworICBxYWR2PTA7CisKKyAgYmlzPXNpemVvZih3b3Jkcyk7CisgIC8vIFNvbmRlcmZhbGwgR2VxdW90ZXRlcyBBZHZlcmIgKGFsbGVzIG5hY2ggZGVtIFF1b3RlKSBzcGVpY2hlcm4gdW5kIGF1cyAKKyAgLy8gV29yZHMgcmF1c3NjaG5laWRlbi4KKyAgZm9yIChudW09MDsgbnVtPGJpczsgbnVtKyspCisgICAgaWYgKHdvcmRzW251bV1bMC4uMF09PSIvIikgIHsKKyAgICAgIHdvcmRzW251bV09d29yZHNbbnVtXVsxLi5dOworICAgICAgcWFkdj1pbXBsb2RlKHdvcmRzW251bS4uXSwgIiAiKTsKKyAgICAgIHdvcmRzPXdvcmRzWzAuLm51bS0xXTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvLyBFcyBrYW5uIHNlaW4sIGRhc3Mgdm9yIGRlbSBRdW90ZSBub2NoIGVpbmUgdW5kIHN0ZWh0LiBEYXMgd2lyZCBqZXR6dCBhdWNoIAorICAvLyBub2NoIGVudGZlcm50LCBtdXNzIGFiZXIgc3BhZXRlciB3aWVkZXIgZWluZ2VmdWVndCB3ZXJkZW4uCisgIGlmIChzaXplb2Yod29yZHMpICYmIHdvcmRzWzwxXT09InVuZCIpICB7CisgICAgd29yZHM9d29yZHNbMC4uPDJdOworICAgIGFuZHNpZ249MTsKKyAgfQorCisgIC8vIFdlaXRlcnN1Y2hlbj8KKyAgaWYgKGJpcz1zaXplb2Yod29yZHMpKQorICAgIGZvciAobnVtPTA7IG51bTxiaXM7IG51bSs9MikKKyAgICAgICBhZHYrPSh7R2V0UGxheWVyQWR2ZXJiKHdvcmRzW251bV0sIDEpfSk7CisgIGNudD1Db3VudFVwKGFkdi0oezB9KSk7CisKKyAgLy8gQXVzZ2FiZSB6dXNhbW1lbmJhdWVuCisgIGlmIChhbmRzaWduKQorICAgIGFkdmVyYj1Db3VudFVwKChzaXplb2YoYWR2KSA/IGFkdiA6ICh7fSkpKyhxYWR2ID8gKHtxYWR2fSkgOiAoe30pKSk7CisgIGVsc2UgaWYgKHNpemVvZihjbnQpICYmIHNpemVvZihxYWR2KSkKKyAgICBhZHZlcmIgPSBjbnQgKyAiICIgKyBxYWR2OworICBlbHNlIGlmIChzaXplb2YocWFkdikpCisgICAgYWR2ZXJiID0gcWFkdjsKKyAgZWxzZSBpZiAoc2l6ZW9mKGNudCkpCisgICAgYWR2ZXJiID0gY250OyAKKyAgaWYgKGFkdmVyYj09IiIpIGFkdmVyYj0wOworfQorCitwcml2YXRlIG1peGVkIE1peGVkT3V0KGludCBjYXN1cykgIHsKKyAgb2JqZWN0ICplbnZzLCp2aWNzOworICBzdHJpbmcgKm5hbWVzLG91dCxhdWZ6OworICBpbnQgY291bnQsbXNnOworCisgIGZvcl9hbGw9MDsKKyAgdmljcz0oe30pOworICBuYW1lcz0oe30pOworICBlbnZzPWFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSktKHt0aGlzX3BsYXllcigpfSk7CisgIGlmICghKGNvdW50PXNpemVvZihlbnZzKSkpCisgICAgUkVUVVJOKCJOaWNodHMgdW5kIG5pZW1hbmQgZGEuIFNjaGF1IERpY2ggbmFlY2hzdGVzIE1hbCBiZXNzZXIgdW0uXG4iKTsKKyAgZm9yICggOyBjb3VudC0tOyApCisgICAgaWYgKGxpdmluZyhlbnZzW2NvdW50XSkgJiYgIWVudnNbY291bnRdLT5RdWVyeVByb3AoUF9JTlZJUykpICB7CisgICAgICB2aWNzKz0oe2VudnNbY291bnRdfSk7CisgICAgICBuYW1lcys9KHtlbnZzW2NvdW50XS0+bmFtZShjYXN1cyl9KTsKKyAgICB9CisgIGlmICghc2l6ZW9mKHZpY3MpKQorICAgIFJFVFVSTigiS2VpbmVyIGRhLiBTY2hhdSBEaWNoIG5hZWNoc3RlcyBNYWwgYmVzc2VyIHVtLlxuIik7CisgIGF1Zno9Q291bnRVcChuYW1lcyk7CisgIGZvciAoY291bnQ9c2l6ZW9mKHZpY3MpOyBjb3VudC0tOykKKyAgeworICAgIG91dD1pbXBsb2RlKGV4cGxvZGUob3V0X3ZpYywgIkBAYWxsZUBAIiksYXVmeik7CisgICAgICAgIG91dCA9IHJlZ3JlcGxhY2UoIG91dCwgIlxcPCIrdmljc1tjb3VudF0tPm5hbWUoY2FzdXMpKyJcXD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHZpY3NbY291bnRdLT5RdWVyeUR1KGNhc3VzKSksIDAgKTsKKworICAgIG1zZz12aWNzW2NvdW50XS0+UmVjZWl2ZU1zZyhjb252ZXJ0X3N0cmluZyhvdXQpLE1UX0NPTU0sTUFfRU1PVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsdGhpc19vYmplY3QoKSk7CisgICAgc3dpdGNoKG1zZykKKyAgICB7CisgICAgICBjYXNlIE1TR19ERUxJVkVSRUQ6CisgICAgICBjYXNlIE1TR19CVUZGRVJFRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1TR19JR05PUkVEOgorICAgICAgY2FzZSBNU0dfVkVSQl9JR046CisgICAgICBjYXNlIE1TR19NVURfSUdOOgorICAgICAgICB3cml0ZSh2aWNzW2NvdW50XS0+TmFtZSgpKyIgaWdub3JpZXJ0IERpY2ggb2RlciBkaWVzZW4gQmVmZWhsLlxuIik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgd3JpdGUodmljc1tjb3VudF0tPk5hbWUoKSsiIGtvbm50ZSBEaWNoIGdlcmFkZSBuaWNodCBsZXNlbi5cbiIpOworICAgIH0KKyAgfQorICB3cml0ZShicmVha19zdHJpbmcoY29udmVydF9zdHJpbmcoaW1wbG9kZShleHBsb2RlKG91dF9zZWwsIkBAYWxsZUBAIiksYXVmeikKKyAgICArTEYpLCA3OCkpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBwcml2YXRlIGludAorQ2hlY2tMaWZlKGludCBub19zZWxmLGludCBub19kZWFkLCBzdHJpbmcgbm9fc2VsZl90ZXh0LCBzdHJpbmcgbm9fZGVhZF90ZXh0KSAgeworICBpZiAod2hvICYmIGxpdmluZyh3aG8pICYmIHdobyE9dGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIGlmIChub19zZWxmICYmIHdobyAmJiB3aG89PXRoaXNfcGxheWVyKCkpICB7CisgICAgaWYgKG5vX3NlbGZfdGV4dCkKKyAgICAgIHdyaXRlKG5vX3NlbGZfdGV4dCtMRik7CisgICAgZWxzZQorICAgICAgd3JpdGUoIk1hY2ggZGFzIG1pdCBhbmRlcmVuLCBuaWNodCBtaXQgRGlyIHNlbGJlci5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICh3aG8gJiYgIWxpdmluZyh3aG8pICYmIG5vX2RlYWQpICB7CisgICAgaWYgKG5vX2RlYWRfdGV4dCkKKyAgICAgIHdyaXRlKG5vX2RlYWRfdGV4dCtMRik7CisgICAgZWxzZQorICAgICAgd3JpdGUoIkRhcyBkYXJmc3QgRHUgbnVyIG1pdCBMZWJld2VzZW4uXG4iKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoIXdobykgIHsKKyAgICB3cml0ZSgiU2NoYXUgRGljaCBlcnN0IG1hbCB1bSAtIGRhcyBhbmdlZ2ViZW5lIE9iamVrdCBpc3QgbmljaHQgZGEuXG4iKTsKKyAgICByZXR1cm4gMzsKKyAgfQorICByZXR1cm4oMCk7IC8vbm9uLXZvaWQuIEZhbGwtdGhyb3VnaCwgYWxsZXMgT0suCit9CisKK3ByaXZhdGUgc3RyaW5nCitjb252ZXJ0X3N0cmluZyhzdHJpbmcgc3RyKSAgeworICAvKiBJY2ggYmluIHVuc2NodWxkaWcsIGljaCBoYXR0ZSBkYXMgdmllbCBlaW5mYWNoZXIgdW5kIHNjaG9lbmVyIDopCisgICAgIFJ1bWF0YSB3b2xsdGUgZGFzIHNvIDspICAtSHJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAbmFtZUBAIiApLCBjYXBuYW1lKCkgKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEBnbmFtZUBAIiApLCBnbmFtZSgpICk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAd2VyQEAiICksCisgICAgKHdobz9jYXBpdGFsaXplKHdoby0+bmFtZShXRVIsMil8fCIiKToiIiApKTsKKyAgc3RyID0gaW1wbG9kZSggZXhwbG9kZSggc3RyLCAiQEAgd2VuQEAiICksCisgICAgKHdobz8iICIrd2hvLT5uYW1lKFdFTiwyKToiIikpOworICBzdHIgPSBpbXBsb2RlKCBleHBsb2RlKCBzdHIsICJAQCB3ZW1AQCIgKSwKKyAgICAod2hvPyIgIit3aG8tPm5hbWUoV0VNLDIpOiIiKSk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAd2VuQEAiICksCisgICAgKHdobz93aG8tPm5hbWUoV0VOLDIpOiIiKSk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAd2VtQEAiICksCisgICAgKHdobz93aG8tPm5hbWUoV0VNLDIpOiIiKSk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAd2Vzc2VuQEAiICksCisgICAgKHdobz93aG8tPm5hbWUoV0VTU0VOLDIpOiIiKSk7CisgIHN0ciA9IGltcGxvZGUoIGV4cGxvZGUoIHN0ciwgIkBAYWR2ZXJiQEAiICksCisgICAgKGFkdmVyYj8iICIrYWR2ZXJiOiIiKSApOworICByZXR1cm4gc3RyOworfQorCitwcml2YXRlIGludAorRmVlbEl0KCkgIHsKKyAgaW50IG1zZywgZmxnOworCisgIGZsZyA9IE1TR0ZMQUdfU09VTDsKKyAgaWYgKHF1ZXJ5X3ZlcmIoKSAmJiAocXVlcnlfdmVyYigpWzAuLjNdPT0iZnJhZyIgfHwgcXVlcnlfdmVyYigpWzAuLjNdPT0iYW50dyIpKQorICAgIGZsZyB8PSBNU0dGTEFHX1NBWTsKKyAgaWYgKHF1ZXJ5X3ZlcmIoKSAmJiAocXVlcnlfdmVyYigpWzAuLjVdPT0icmtudWRkIiB8fCBxdWVyeV92ZXJiKCk9PSJyd2luayIpKQorICAgIGZsZyB8PSBNU0dGTEFHX1JFTU9URTsKKworICAvLyBOUEMgaGFiZW4ga2VpbmUgVE0tSGlzdCAoY29tbS5jKS4gTGVpZGVyIGVyYmVuIGFiZXIgZGl2LiBNYWdpZXIgZGllIFNvdWwKKyAgLy8gKHRyb3R6ZGVtIHNpZSBpbiAvc3RkL3BsYXllci8gbGllZ3QpIGluIGlocmVuIE5QQy4uLiAqZmx1Y2gqCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKSkKKyAgICBfcmVjdih3aG8sIGJyZWFrX3N0cmluZyhjb252ZXJ0X3N0cmluZyhvdXRfc2VsKSw3OCksIGZsZyk7CisgIGVsc2UKKyAgICB0ZWxsX29iamVjdChNRSwgYnJlYWtfc3RyaW5nKGNvbnZlcnRfc3RyaW5nKG91dF9zZWwpLDc4KSk7CisKKyAgaWYgKG91dF92aWMgJiYgd2hvKSAgeworICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdobykpICB7CisgICAgICBtc2c9d2hvLT5NZXNzYWdlKCBicmVha19zdHJpbmcoY29udmVydF9zdHJpbmcoIG91dF92aWMgKSw3OCksIGZsZyk7CisgICAgICBpZiAobXNnPT0tMSkKKyAgICAgICAgd3JpdGUod2hvLT5uYW1lKCkrIiBpZ25vcmllcnQgRGljaCBvZGVyIGRpZXNlbiBCZWZlaGwuXG4iKTsKKyAgICB9IGVsc2UKKyAgICAgIHRlbGxfb2JqZWN0KHdobyxicmVha19zdHJpbmcoY29udmVydF9zdHJpbmcoIG91dF92aWMgKSw3OCkpOworICB9CisgIGlmIChvdXRfb3RoKQorICBzYXkoIGJyZWFrX3N0cmluZyhjb252ZXJ0X3N0cmluZyggb3V0X290aCApLDc4KSwgKHt3aG8sdGhpc19wbGF5ZXIoKX0pICk7CisgIG91dF9zZWw9b3V0X3ZpYz1vdXRfb3RoPTA7CisgIHJldHVybiAxOworfQorCisvKioKKyAgRGllIEZ1bmt0aW9uIHN0ZWxsdCBlaW5lbiBIaWxmZXRleHQgenVyIFZlcmZ1ZWd1bmcgdW5kIGxpc3RldCBkaWUgCisgIGRlZmluaWVydGVuIEFkdmVyYmllbiBhdWYuCisgIFxwYXJhbSBtaW5lIDAgPSBhbGxlIEFkdmVyYmllbiwgCisgICAgICAgICAgICAgIDE9bnVyIHNlbGJzdCBkZWZpbmllcnRlIEFkdmVyYmllbiAKKyAgICAgICAgICAgICAgMj1udXIgZGllIHZvbSBTeXN0ZW0gYmVyZWl0Z2VzdGVsbHRlbgorICovCitwcml2YXRlIGludCB6ZWlnZV9hZHZlcmJzKGludCBtaW5lKSAgeworICBtYXBwaW5nIGFkdmVyYl9saXN0OworICBzdHJpbmcgb3V0LHM7CisKKyAgLy8gUGFyYW1ldGVyIGF1c3dlcnRlbgorICBzd2l0Y2ggKG1pbmUpeworICAgIGNhc2UgMToKKyAgICAgIGFkdmVyYl9saXN0PXBscl9hZHZlcmJzOworICAgICAgb3V0ID0gIkR1IGhhc3QgZm9sZ2VuZGUgQWR2ZXJiaWVuIGRlZmluaWVydDpcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBhZHZlcmJfbGlzdD1RdWVyeVN0ZEFkdmVyYnMoKTsKKyAgICAgIG91dCA9ICJTeXN0ZW1zZWl0aWcgc2luZCBmb2xnZW5kZSBBZHZlcmJpZW4gZGVmaW5pZXJ0OlxuIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhZHZlcmJfbGlzdD1RdWVyeVN0ZEFkdmVyYnMoKStwbHJfYWR2ZXJiczsKKyAgICAgIG91dCA9ICJGb2xnZW5kZSBBZHZlcmJpZW4gc3RlaGVuIERpciB6dXIgVmVyZnVlZ3VuZzpcbiI7CisgIH0KKworICBvdXQgKz0iICBBYmsuICAgIEFkdmVyYlxuICA9PT09PT0gID09PT09PVxuIjsKKworICBpZiAoIHNpemVvZihhZHZlcmJfbGlzdCkgPT0gMCkgCisgICAgb3V0ICs9ICIga2VpbmUuXG4iOworICBlbHNlCisgICAgLy8gVWViZXIgYWxsZSBFbGVtZW50ZSBkZXIgaW5kaXppZXMgZGVyIEFkdmVyYmllbmxpc3RlIGdlaGVuCisgICBmb3JlYWNoICggcyA6IHNvcnRfYXJyYXkobV9pbmRpY2VzKGFkdmVyYl9saXN0KSwgIyc+ICkgKSB7CisgICAgICBvdXQgKz0gYnJlYWtfc3RyaW5nKGFkdmVyYl9saXN0W3NdLDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIgICUtNnMgICIscyksQlNfSU5ERU5UX09OQ0UpOworICAgIH0KKworICBNb3JlKG91dCsiXG5XaWUgZGllc2UgQWR2ZXJiaWVuIGJlbnV0enQgd2VyZGVuIGlzdCBpbiA8aGlsZmUgYWR2ZXJiPiAiCisgICAgImJlc2NocmllYmVuLlxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3Mgc3RhdGljIGludAorU291bENvbW0oc3RyaW5nIHN0ciwgc3RyaW5nIF92ZXJiKSAgeworICBpbnQgdF9nLHRfbixmbGFnOworICBzdHJpbmcgc3RyMSxzdHIyLHN0cjMsKnRhZW56ZSx2YjsKKyAgb3V0X3NlbD1vdXRfdmljPW91dF9vdGg9d2hvPTA7CisvLyAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSE9TUUpIHJldHVybiAwOworICBpZiAoaW50ZXJhY3RpdmUoTUUpKSBzdHI9X3VucGFyc2VkX2FyZ3MoKTsgLy8gTlBDcyBoYWJlbiBkYXMgbmljaHQgOigKKyAgaWYgKHN0cj09IiIpIHN0cj0wOworICB2Yj1fdmVyYnx8cXVlcnlfdmVyYigpOworICBpZiAoc2l6ZW9mKHZiKT4xICYmIHZiWzwxXT09J2UnICYmIHZiIT0ibm9lIikgdmI9dmJbMC4uPDJdOworICBzZm9vID0gMDsKKyAgc3dpdGNoICh2YikgIHsKKyAgICAvKioqKioqKioqKioqKioqKiBBZWNoemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJhZWNoeiI6CisgICAgSEVMUENIRUNLKCJhZWNoeiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiQWVjaHplIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGFlY2h6dEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYWVjaHp0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEFuc2NobWllZ2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2htaWVnIjoKKyAgICBIRUxQQ0hFQ0soInNjaG1pZWciKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiQW4gd2VuIHdpbGxzdCBEdSBEaWNoIGFuc2NobWllZ2VuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEYXMgZ2VodCBkb2NoIG5pY2h0LiIsCisgICAgICAiTmVpbiwgZGFzIG1hY2h0IGtlaW5lbiBTcGFzcy4gTGVidCBqYSBuaWNodCBtYWwuIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHNjaG1pZWdzdCBEaWNoQEBhZHZlcmJAQCBhbkBAIHdlbkBAIGFuLiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHNjaG1pZWd0IHNpY2hAQGFkdmVyYkBAIGFuIERpY2guIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NobWllZ3Qgc2ljaEBAYWR2ZXJiQEAgYW5AQCB3ZW5AQCBhbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEFudHdvcnRlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYW50d29ydCI6CisgICAgSEVMUENIRUNLKCJhbnR3b3J0Iik7CisgICAgaWYgKCFzdHIpCisgICAgICBSZXR1cm4oIkFudHdvcnRlIFtXRU1dIFdBUz9cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgc3RyMT1jYXBpdGFsaXplKHN0cik7CisgICAgZWxzZQorICAgICAgaWYgKHNzY2FuZihzdHIsIiVzICVzIixzdHIxLHN0cjEpIT0yKQorICAgICAgICBSZXR1cm4oIkFudHdvcnRlIHdhcz9cbiIpOworICAgICAgZWxzZQorICAgICAgICBzdHIxPWNhcGl0YWxpemUoc3RyMSk7CisgICAgb3V0X3NlbD0iRHUgYW50d29ydGVzdEBAIHdlbUBAOiAiK3N0cjE7CisgICAgLyogU3ByYWNoZmx1ZWNoZSBiZXJ1ZWNrc2ljaHRpZ2VuIC1XYXJnb24sIDguIDkuIDk1ICovCisgICAgaWYgKFF1ZXJ5UHJvcChQX1BFUk1fU1RSSU5HKSkKKyAgICAgIHN0cjEgPSBjYWxsX290aGVyKFF1ZXJ5UHJvcChQX1BFUk1fU1RSSU5HKSwicGVybXV0YXRlX3N0cmluZyIsc3RyMSl8fCIiOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBhbnR3b3J0ZXQgRGlyOiAiK3N0cjE7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGFudHdvcnRldEBAIHdlbUBAOiAiK3N0cjE7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQXBwbGF1ZGllcmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJhcHBsYXVkaWVyIjoKKyAgICBIRUxQQ0hFQ0soImFwcGxhdWRpZXIiKTsKKyAgICBHSE9TVENIRUNLKCJEZWluZSBIYWVuZGUgZmFocmVuIGR1cmNoZWluYW5kZXIgZHVyY2ggLSB3YXIgd29obCBuaXguXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgYXBwbGF1ZGllcmVuLCBhYmVyICIrUVBQKEZFTUFMRSxXRVIsUExVUkFMKQorICAgICAgICArIiBIYWVuZGUgc2F1c2VuXG5kdXJjaGVpbmFuZGVyIGR1cmNoLlxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJEdSBhcHBsYXVkaWVyc3Qgdm9uIGdhbnplbSBIZXJ6ZW4uIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGdpYnQgZWluZSBSdW5kZSBBcHBsYXVzLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICAgIG91dF9zZWw9IkR1IGFwcGxhdWRpZXJzdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgYXBwbGF1ZGllcnQgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgICAgfQorICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJBcHBsYXVkaWVyZSB3ZW0gb2RlciB3aWUgb2RlciBzbyBhZWhubGljaC5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJOZWluLCBkYXMgZ2Vob2VydCBzaWNoIG5pY2h0LiIsCisgICAgICAgICJTYWNoZW4gd2lyZCBoaWVyIG5pY2h0IGFwcGxhdWRpZXJ0LCBPSz8iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIG91dF9zZWw9IkR1IGFwcGxhdWRpZXJzdEBAIHdlbUBAQEBhZHZlcmJAQC4iOworICAgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgYXBwbGF1ZGllcnQgRGlyQEBhZHZlcmJAQC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgYXBwbGF1ZGllcnRAQCB3ZW1AQEBAYWR2ZXJiQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQXJnbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImFyZ2wiOgorICAgIEhFTFBDSEVDSygiYXJnbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiQXJnbGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYXJnbHN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgZWluIHdlbmlnIHZvciBEaWNoIGhpbi4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYXJnbHQiCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGVpbiB3ZW5pZyB2b3Igc2ljaCBoaW4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQXVmYXRtZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImF0bSI6CisgICAgSEVMUENIRUNLKCJhdG0iKTsKKyAgICBpZiAoIXN0ciB8fCBzc2NhbmYoc3RyLCIlc2F1ZiIsc3RyMSkhPTEpCisgICAgICBSZXR1cm4oIkF0bWUgd2llIGF1Zj9cbiIpOworICAgIFBhcnNlUmVzdChzdHIxKTsKKyAgICBvdXRfc2VsPSJEdSBhdG1lc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIGVybGVpY2h0ZXJ0IikrIiBhdWYuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgYXRtZXQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIGVybGVpY2h0ZXJ0IikrIiBhdWYuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBCZWdydWVzc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJoYWxsbyI6CisgICAgY2FzZSAiaGkiOgorICAgIGNhc2UgImJlZ3J1ZXNzIjoKKyAgICBIRUxQQ0hFQ0soImJlZ3J1ZXNzIik7CisgICAgUGFyc2VSZW1vdGUoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSBiZWdydWVzc2VuP1xuIik7CisgICAgaWYgKHByZXNlbnQod2hvLCBlbnZpcm9ubWVudCgpKSkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGhlaXNzdCBAQHdlbkBAQEBhZHZlcmJAQCB3aWxsa29tbWVuLiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgaGVpc3N0IERpY2hAQGFkdmVyYkBAIHdpbGxrb21tZW4uIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBoZWlzc3QgQEB3ZW5AQEBAYWR2ZXJiQEAgd2lsbGtvbW1lbi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBvdXRfc2VsPSJEdSBoZWlzc3QgQEB3ZW5AQEBAYWR2ZXJiQEAgYXVzIGRlciBGZXJuZSB3aWxsa29tbWVuLiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgaGVpc3N0IERpY2hAQGFkdmVyYkBAIGF1cyBkZXIgRmVybmUgd2lsbGtvbW1lbi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBCZXRhc3RlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYmV0YXN0IjoKKyAgICBIRUxQQ0hFQ0soImJldGFzdCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJCZWdyYWJzY2hlIHdlbj9cbiIpOworICAgIG91dF9zZWw9IkR1IGdyYWJiZWxzdEBAYWR2ZXJiQEAgYW4gIit3aG8tPm5hbWUoV0VNKSsiIGhlcnVtLiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIGdyYWJiZWx0QEBhZHZlcmJAQCBhbiBEaXIgaGVydW0uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ3JhYmJlbHRAQGFkdmVyYkBAIGFuICIrd2hvLT5uYW1lKFdFTSkrIiBoZXJ1bS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJld3VuZGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiYmV3dW5kZXIiOgorICAgIEhFTFBDSEVDSygiYmV3dW5kZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiQmV3dW5kZXJlIHdlbj9cbiIpOworICAgIG91dF9zZWw9IkR1IGJld3VuZGVyc3QgQEB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgYmV3dW5kZXJ0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGJld3VuZGVydCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJpYmJlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImJpYmJlciI6CisgICAgSEVMUENIRUNLKCJiaWJiZXIiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiQWxzIEdlaXN0IGZ1ZWhsc3QgRHUga2VpbmUgS2FlbHRlLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJCaWJiZXJlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGJpYmJlcnN0QEBhZHZlcmJAQCB2b3IgS2FlbHRlLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgYmliYmVydEBAYWR2ZXJiQEAgdm9yIEthZWx0ZS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJvaHJlIE5hc2UgKioqKioqKioqKioqKioqLworICAgIGNhc2UgImJvaHIiOgorICAgIEhFTFBDSEVDSygiYm9ociIpOworICAgIFBhcnNlUmVzdChzdHIsICh7Im5hc2UiLCJpbiBkZXIgbmFzZSIsImluIG5hc2UifSkpOworICAgIGlmIChzdHIgJiYgc3RyIT0ibmFzZSIgJiYgc3RyIT0iaW4gbmFzZSIgJiYgc3RyIT0iaW4gZGVyIG5hc2UiICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkJvaHJlIHdpZSBOYXNlP1xuIik7CisgICAgb3V0X3NlbD0iRHUgYm9ocnN0QEBhZHZlcmJAQCBpbiBEZWluZXIgTmFzZS4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBib2hydEBAYWR2ZXJiQEAgaW4gZGVyIE5hc2UuICAgICBJZ2l0dCEgOikiOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEJydW1tZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJicnVtbWVsIjoKKyAgICBIRUxQQ0hFQ0soImJydW1tZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBvdXRfc2VsPSJEdSBicnVtbWVsc3QiCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAoc3RyID8gIiBrYXVtIHZlcnN0YWVuZGxpY2g6ICIrc3RyKyIuIiA6ICIuIikpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBicnVtbWVsdCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6IChzdHIgPyAiIGthdW0gdmVyc3RhZW5kbGljaDogIitzdHIrIi4iIDogIi4iKSk7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogY2xzICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJjbHMiOgorICAgIEhFTFBDSEVDSygiY2xzIik7CisgICAgd3JpdGUoIhtbMkobW0giKTsKKyAgICByZXR1cm4gMTsKKworICAgIC8qKioqKioqKioqKioqKioqIERhZXVtY2hlbmRyZWhlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZHJlaCI6CisgICAgSEVMUENIRUNLKCJkcmVoIik7CisgICAgaWYgKCFzdHIpCisgICAgICBSZXR1cm4oIkRyZWhlIHdhcz9cbiIpOworICAgIGlmKHN0cnN0cihzdHIsImRhZXVtY2hlbiIpPDAgJiYgc3Ryc3RyKHN0ciwiZGF1bWVuIik8MCkKKyAgICAgIFJldHVybigiRHJlaGUgd2FzP1xuIik7CisgICAgUGFyc2VSZXN0KHN0ciwoeyJkYWV1bWNoZW4iLCJkYXVtZW4ifSkpOworICAgIG91dF9zZWw9IkR1IGRyZWhzdEBAYWR2ZXJiQEAgRGFldW1jaGVuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGRyZWh0QEBhZHZlcmJAQCBEYWV1bWNoZW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBEYW5rZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImRhbmsiOgorICAgIEhFTFBDSEVDSygiZGFuayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJCZWkgd2VtIHdpbGxzdCBEdSBEaWNoIGJlZGFua2VuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRiwgTk9UX0RFQUQsCisgICAgICAiTGVpZGVzdCBEdSBqZXR6dCBzY2hvbiBhbiBQZXJzb2VubGlja2VpdHNzcGFsdHVuZz8gTmUsIG5lLi4uIiwKKyAgICAgICJLZWluZSBSZWFrdGlvbi4gSXN0IHdvaGwgYmVmcmllZGlnZW5kZXIsIHNpY2ggYmVpIExlYmV3ZXNlbiB6dSAiCisgICAgICAgICsiYmVkYW5rZW4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGJlZGFua3N0IERpY2hAQGFkdmVyYkBAIGJlaUBAIHdlbUBALiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIGJlZGFua3Qgc2ljaEBAYWR2ZXJiQEAgYmVpIERpci4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBiZWRhbmt0IHNpY2hAQGFkdmVyYkBAIGJlaUBAIHdlbUBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRGVua2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJkZW5rIjoKKyAgICBIRUxQQ0hFQ0soImRlbmsiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiV29taXQgd2lsbHN0IER1IGRlbm4gZGVua2VuPyBEdSBoYXN0IGtlaW5lIGdyYXVlbiBaZWxsZW4uLi5cbiIpOworLy8gICAgUGFyc2VSZXN0KHN0cik7CisgICAgc3RyMj1vbGRfZXhwbG9kZShzdHJ8fCIiLCIgIilbMF07CisgICAgaWYgKHN0cgorICAgICYmICghYWR2ZXJifHwoKFF1ZXJ5U3RkQWR2ZXJicygpW3N0cjJdfHxwbHJfYWR2ZXJic1tzdHIyXSkpIT1hZHZlcmIpKSAgeworICAgICAgb3V0X3NlbD0iRHUgZGVua3N0ICAgLiBvIE8gKCIrc3RyKyIpIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGRlbmt0ICAgLiBvIE8gKCIrc3RyKyIpIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIGRlbmt0ICAgLiBvIE8gKCIrc3RyKyIpIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgb3V0X3NlbD0iRHUgZmFlbmdzdEBAYWR2ZXJiQEAgYW4genUgZGVua2VuLlxuS2xlaW5lICIKKyAgICAgICAgKyJSYXVjaHdvZWxrY2hlbiBzdGVpZ2VuIGF1Zi4uLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBmYWVuZ3RAQGFkdmVyYkBAIGFuIHp1IGRlbmtlbi5cbktsZWluZSAiCisgICAgICAgICsiUmF1Y2h3b2Vsa2NoZW4gc3RlaWdlbiBhdWYuLi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBEZXV0ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImRldXQiOgorICAgIEhFTFBDSEVDSygiZGV1dCIpOworICAgIFBhcnNlUmVzdChzdHIsImF1ZiIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgZGV1dGVzdEBAYWR2ZXJiQEAgYXVmIEBAYWxsZUBALiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgZGV1dGV0QEBhZHZlcmJAQCBhdWYgQEBhbGxlQEAuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiQXVmIHdlbiBvZGVyIHdhcyB3aWxsc3QgRHUgZGV1dGVuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZGV1dGVzdEBAYWR2ZXJiQEAgYXVmIgorICAgICAgKyh3aG89PXRoaXNfb2JqZWN0KCk/IiBEaWNoLiIgOiAiQEAgd2VuQEAuIik7CisgICAgaWYgKHdobyAhPSB0aGlzX29iamVjdCgpKSBvdXRfdmljPSJAQGduYW1lQEAgZGV1dGV0QEBhZHZlcmJAQCBhdWYgRGljaC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBkZXV0ZXRAQGFkdmVyYkBAIGF1ZiIKKyAgICAgICsod2hvPT10aGlzX29iamVjdCgpID8gIiBzaWNoIHNlbGJlci4iOiAiQEAgd2VuQEAuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRHJ1ZWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImRydWVjayI6CisgICAgSEVMUENIRUNLKCJkcnVlY2siKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGRydWVja3N0IEBAYWxsZUBAIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB6YWVydGxpY2giKQorICAgICAgICArIiBhbiBEaWNoLiI7CisgICAgICBvdXRfdmljPSJAQGduYW1lQEAgZHJ1ZWNrdCBAQGFsbGVAQCIrCisgICAgICAgIChhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHphZXJ0bGljaCIpKyIgYW4gc2ljaC4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgfQorICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGRlbm4gZHJ1ZWNrZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhcyBtYWNodCBkb2NoIGtlaW5lbiBTcGFzcy4iLAorICAgICAgIkljaCBkcnVlY2tlIG51ciBqZW1hbmRlbiwgbmljaHQgZXR3YXMuIikpCisgICAgICAgIHJldHVybiAxOworICAgIEdIT1NUQ0hFQ0soIkR1IHdpbGxzdCAiK3doby0+bmFtZShXRU4pKyIgYW4gRGljaCBkcnVlY2tlbiAtIG51ciBoYXN0IER1ICIKKyAgICAgICAgKyJzY2hvblxud2llZGVyIG5pY2h0IGRhcmFuIGdlZGFjaHQsIGRhc3Mgc28gd2FzIGFscyBHZWlzdCBuaWNodCAiCisgICAgICAgICsiZ2VodC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU4pKyIgYW4gc2ljaCBkcnVlY2tlbiAtIGhhdCBhYmVyXG4iCisgICAgICAgICsibWFsIHdpZWRlciBuaWNodCBhbiBkaWUgTmFjaHRlaWxlIGRlcyBHZWlzdGVyZGFzZWlucyBnZWRhY2h0LlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIERpY2ggYW4gc2ljaCBkcnVlY2tlbiAtIGhhdCBhYmVyIG1hbCB3aWVkZXJcbiIKKyAgICAgICAgKyJuaWNodCBhbiBkaWUgTmFjaHRlaWxlIGRlcyBHZWlzdGVyZGFzZWlucyBnZWRhY2h0LlxuIik7CisgICAgb3V0X3NlbD0iRHUgZHJ1ZWNrc3QgQEB3ZW5AQCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgemFlcnRsaWNoIikKKyAgICAgICsiIGFuIERpY2guIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBkcnVlY2t0IERpY2giKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHphZXJ0bGljaCIpCisgICAgICArIiBhbiBzaWNoLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgZHJ1ZWNrdCBAQHdlbkBAIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB6YWVydGxpY2giKQorICAgICAgKyIgYW4gc2ljaC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEVudHNjaHVsZGlnZSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZW50c2NodWxkaWciOgorICAgIEhFTFBDSEVDSygiZW50c2NodWxkaWciKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiRW50c2NodWxkaWdlIERpY2ggd2llIG9kZXIgYmVpIHdlbT9cbiIpOworICAgIG91dF9zZWw9IkR1IGJpdHRlc3QiKyh3aG8gPyAiIEBAd2VuQEAiIDogIiIpCisgICAgICArIkBAYWR2ZXJiQEAgdW0gRW50c2NodWxkaWd1bmcuIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgYml0dGV0IERpY2hAQGFkdmVyYkBAIHVtIEVudHNjaHVsZGlndW5nLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGJpdHRldCIrKHdobyA/ICIgQEB3ZW5AQCIgOiAiIikKKyAgICAgICsiQEBhZHZlcmJAQCB1bSBFbnRzY2h1bGRpZ3VuZy4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEVyYmxlaWNoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImVyYmxlaWNoIjoKKyAgICBIRUxQQ0hFQ0soImVyYmxlaWNoIik7CisgICAgR0hPU1RDSEVDSygiSWNoIHdlaXNzIHp3YXIgbmljaHQsIHdpZSBEdSBkYXMgc2NoYWZmc3QsIGFiZXIgRHUgd2lyc3QgIgorICAgICAgICArIm5vY2ggYmxlaWNoZXIuXG4iLAorICAgICAgYnJlYWtfc3RyaW5nKCJXaWUgdW53YWhyc2NoZWlubGljaCBkYXMgYXVjaCBpc3QsIGFiZXIgIitnbmFtZSgpCisgICAgICAgICsiIHNjaGFmZnQgZXMgdGF0c2FlY2hsaWNoLCBub2NoIGJsZWljaGVyIHp1IHdlcmRlbi4iLDc4KSwgMCApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2llIHdpbGxzdCBEdSBlcmJsZWljaGVuP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZXJibGVpY2hzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBlcmJsZWljaHRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRXJyb2V0ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImVycm9ldCI6CisgICAgSEVMUENIRUNLKCJlcnJvZXQiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzY2hhZmZzdCBlcyBudXIgYmlzIHp1IGVpbmVtIGJsYXNzZW4gUm9zYSwgYWJlciBpbW1lcmhpbi5cbiIsCisgICAgICAiRGllIFdhbmdlbiBkZXMgR2Vpc3RlcyB2b24gIitjYXBuYW1lKCkrIiB3ZXJkZW4gbGVpY2h0IHJvc2EuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIWFkdmVyYiAmJiBzdHIpCisgICAgICBSZXR1cm4oIkVycm9ldGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRGVpbmUgV2FuZ2VuIGdsdWVoZW5AQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgZXJyb2V0ZXRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRXJzY2hyZWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImVyc2NocmVjayI6CisgICAgY2FzZSAiZXJzY2hyaWNrIjoKKyAgICBpZiAoIWdob3N0KCkpCisgICAgICBSZXR1cm4oIkR1IGJpc3QgenUgaGFybWxvcywgR2Vpc3QgbXVlc3N0ZSBtYW4gc2Vpbi4uLlxuIik7CisgICAgSEVMUENIRUNLKCJlcnNjaHJlY2siKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSBkZW5uIGVyc2NocmVja2VuP1xuIik7CisgICAgb3V0X3NlbD0iTWl0IGVpbmVtIGxhdXRlbiBCVUghIGVyc2NocmVja3N0IER1IEBAd2VuQEAiCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIGZ1ZXJjaHRlcmxpY2guIik7CisgICAgb3V0X3ZpYz0iQlVIISBEdSB6dWNrc3Qgdm9yIFNjaHJlY2sgenVzYW1tZW4uIE11c3MgZGllc2VyIEdlaXN0IHZvbiAiCisgICAgICArIkBAZ25hbWVAQCBEaWNoIGF1Y2hAQGFkdmVyYkBAIGVyc2NocmVja2VuLiI7CisgICAgb3V0X290aD0iQlVIISBAQGduYW1lQEAgZXJzY2hyZWNrdCBAQHdlbkBAIgorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBmdWVyY2h0ZXJsaWNoLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEZsaXBwZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImZsaXBwIjoKKyAgICBIRUxQQ0hFQ0soImZsaXBwIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJBdXNmbGlwcGVuIHdvbGxlbiB3aXIgYWxzbywgc28gc28uIFVuZCB3aWUsIHdlbm4gaWNoICIKKyAgICAgICAgKyJmcmFnZW4gZGFyZj9cbiIpOworICAgIG91dF9zZWw9IkR1IGZsaXBwc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCBhdXMuIiA6ICIgdG90YWwgYXVzLiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBmbGlwcHQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCBhdXMuIiA6ICIgdG90YWwgYXVzLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEZsdWNoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImZsdWNoIjoKKyAgICBIRUxQQ0hFQ0soImZsdWNoIik7CisgICAgR0hPU1RDSEVDSygiRHUgZmFlbmdzdCBtYW5nZWxzIFJlc29uYW56a29lcnBlciBsZWlzZSBhbiB6dSBmbHVjaGVuLlxuIiwKKyAgICAgIGduYW1lKCkrIiBmYWVuZ3QgbGVpc2UgYW4genUgZmx1Y2hlbi4gTGF1dCBrYW5uIGVyIG5pY2h0LFxuIgorICAgICAgICArIm1hbmdlbHMgTHVmdCB1bmQgUmVzb25hbnprb2VycGVyLlxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJEdSBmbHVjaHN0IGxhdXRzdGFyay4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgZmFlbmd0IGFuLCBmdWVyY2h0ZXJsaWNoIHp1IGZsdWNoZW4uIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJXaWUgd2lsbHN0IER1IGZsdWNoZW4/XG4iKTsKKyAgICAgIG91dF9zZWw9IkR1IGZsdWNoc3RAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBmbHVjaHQgYXVmIGVpbm1hbEBAYWR2ZXJiQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogRnJhZ2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJmcmFnIjoKKyAgICBIRUxQQ0hFQ0soImZyYWciKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiRnJhZ2Ugd2VuIHdhcz9cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkR1IGZhZW5nc3QgenUgZ3J1ZWJlbG4gYW4uLi4iLAorICAgICAgIkZyYWdlIGplbWFuZCwgZGVyIGxlYnQuIikpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICh3aG8pCisgICAgICBzc2NhbmYoc3RyLCIlcyAlcyIsIHN0cjEsc3RyMSk7CisgICAgZWxzZQorICAgICAgc3RyMT1zdHI7CisgICAgaWYgKCFzdHIxKQorICAgICAgUmV0dXJuKCJGcmFnZSAiK3doby0+bmFtZShXRU4pKyIgV0FTP1xuIik7CisgICAgc3RyMT1jYXBpdGFsaXplKHN0cjEpOworICAgIGlmIChzdHIxWzwxXSAhPSAnPycpCisgICAgICBzdHIxICs9ICI/IjsKKyAgICBvdXRfc2VsPSJEdSBmcmFnc3RAQCB3ZW5AQDogIitzdHIxOworICAgIC8qIFNwcmFjaGZsdWNoIGJlcnVlY2tzaWNodGlnZW4gLVdhcmdvbiwgOC4gOS4gOTUgKi8KKyAgICBpZiAob2JqZWN0cChRdWVyeVByb3AoUF9QRVJNX1NUUklORykpKQorICAgICAgc3RyMSA9IGNhbGxfb3RoZXIoUXVlcnlQcm9wKFBfUEVSTV9TVFJJTkcpLCAicGVybXV0YXRlX3N0cmluZyIsIHN0cjEpfHwiIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPShnaG9zdCgpID8gIkRlciBHZWlzdCB2b24gIiA6IC8qIElTX0xFQVJORVIoTUUpID8KKyAgICAgIFF1ZXJ5UHJvcChQX1BSRVNBWSl8fCIiIDogKi8gIiIpK2NhcG5hbWUoKSsiIGZyYWd0IERpY2g6ICIrc3RyMTsKKyAgICBvdXRfb3RoPShnaG9zdCgpID8gIkRlciBHZWlzdCB2b24gIiA6IC8qIElTX0xFQVJORVIoTUUpID8KKyAgICAgIFF1ZXJ5UHJvcChQX1BSRVNBWSl8fCIiIDogKi8gIiIpK2NhcG5hbWUoKSsiIGZyYWd0QEAgd2VuQEA6ICIrc3RyMTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBGcmV1ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImZyZXUiOgorICAgIEhFTFBDSEVDSygiZnJldSIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJGcmV1ZSBEaWNoIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1ICIrKHdobyA/ICJncmluc3QgQEB3ZW5AQCBhbiB1bmQgIiA6ICIiKQorICAgICAgKyJmcmV1c3QgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgZ3JpbnN0IERpY2ggYW4gdW5kIGZyZXV0IHNpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAICIrKHdobyA/ICJncmluc3QgQEB3ZW5AQCBhbiB1bmQgIiA6ICIiKQorICAgICAgKyJmcmV1dCBzaWNoQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEZ1cnplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiZnVyeiI6CisgICAgSEVMUENIRUNLKCJmdXJ6Iik7CisgICAgR0hPU1RDSEVDSygiRHUgbGFlc3N0IGVpbmVuIGZhaHJlbiAtIGFiZXIgZXIgcmllY2h0IG5hY2ggZ2FyIG5peC5cbiIsCisgICAgICBnbmFtZSgpKyIgbGFlc3N0IGVpbmVuIGZhaHJlbi4gTWFuIHJpZWNodCBhYmVyIG5peC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiRnVyemUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZnVyenQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBoZW1tdW5nc2xvcy4iKTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBsYWVzc3RAQGFkdmVyYkBAIGVpbmVuIFN0aW5rZWZ1cnogZmFocmVuLiI7CisgICAgb2Zvbz1jbG9uZV9vYmplY3QoIi9pdGVtcy9mdXJ6Iik7CisgICAgb2Zvby0+c2V0X2Z1cnplcih0aGlzX3BsYXllcigpKTsKKyAgICBvZm9vLT5tb3ZlKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisvLyBERUJVRyBGdXJ6IHRlc3RlbiEKKworICAgIC8qKioqKioqKioqKioqKioqIEdhZWhuZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdhZWhuIjoKKyAgICBIRUxQQ0hFQ0soImdhZWhuIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkFscyBHZWlzdCB3aXJzdCBEdSBuaWNodCBtdWVkZSAtIGFsc28gbmljaHQgZ2FlaG5lbi5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2llIHdpbGxzdCBEdSBnYWVobmVuP1xuIik7CisgICAgaWYgKCFhZHZlcmIpCisgICAgICBvdXRfc2VsPSJLYW5uc3QgRHUgYWJlciBEZWluKGVuKSBNdW5kL01hdWwvU2NobmFiZWwgd2VpdCBhdWZyZWlzc2VuISI7CisgICAgZWxzZQorICAgICAgb3V0X3NlbD0iRHUgZ2FlaG5zdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ2FlaG50QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEdsdWNrc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJnbHVja3MiOgorICAgIEhFTFBDSEVDSygiZ2x1Y2tzIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJHbHVja3NlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGdsdWNrc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB3aWUgZWluIEh1aG4uIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGdsdWNrc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB3aWUgZWluIEh1aG4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3JhdHVsaWVyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdyYXR1bGllciI6CisgICAgY2FzZSAiYmVnbHVlY2t3dWVuc2NoIjoKKyAgICBIRUxQQ0hFQ0soImdyYXR1bGllciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW0gd2lsbHN0IER1IGdyYXR1bGllcmVuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRiwgTk9UX0RFQUQsCisgICAgICAiTmEsIG1laW5zdCBEdSBuaWNodCwgZGFzcyBFaWdlbmxvYiBzdGlua3Q/IiwKKyAgICAgICJTb2xsIGljaCBkZW0gRGluZyB2aWVsbGVpY2h0IHp1bSBUb3RzZWluIGdyYXR1bGllcmVuPyBOZWUgbmVlLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBncmF0dWxpZXJzdCBAQHdlbUBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCBncmF0dWxpZXJ0IERpckBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ3JhdHVsaWVydCBAQHdlbUBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEdyaW5zZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdyaW5zIjoKKyAgICBIRUxQQ0hFQ0soImdyaW5zIik7CisgICAgR0hPU1RDSEVDSygiQWxzIER1IGdyaW5zdCwgc2llaHN0IER1IHJlZ2VscmVjaHQsIHdpZSBkaWUgYW5kZXJlbiBlaW5lICIKKyAgICAgICAgKyJHYWVuc2VoYXV0IGJla29tbWVuLlxuIiwKKyAgICAgICJEdSBiZWtvbW1zdCBlaW5lIEdhZW5zZWhhdXQsIGFscyBkZXIgR2Vpc3Qgdm9uICIrY2FwbmFtZSgpCisgICAgICAgICsiIHp1IGdyaW5zZW4gYW5mYWVuZ3QuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGdyaW5zdCBAQGFsbGVAQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIGdyaW5zdCBAQGFsbGVAQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoIXdobyAmJiAhYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiR3JpbnNlbiAtIHNjaG9lbiB1bmQgZ3V0LiBBYmVyIHdlbiBvZGVyIHdpZSAoYW4pZ3JpbnNlbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkR1IGdyaW5zdCBEaXIgd2FzLCBhYmVyIHNvLCBkYXNzIGVzIGtlaW4gYW5kZXJlciBzaWVodC4iLAorICAgICAgIk5pY2h0IG1hbCBlaW5lbiBTcGllZ2VsIGRhcmYgbWFuIGhpZXIgYW5ncmluc2VuLCBudXIgTGViZXdlc2VuISIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBncmluc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGFuIiA6ICIiKSsiLiI7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgZ3JpbnN0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgZ3JpbnN0QEAgd2VuQEBAQGFkdmVyYkBAIisod2hvID8gIiBhbiIgOiAiIikrIi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEdydWViZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJncnVlYmVsIjoKKyAgICBjYXNlICJncnVlYmwiOgorICAgIEhFTFBDSEVDSygiZ3J1ZWJlbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiR3J1ZWJsZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBncnVlYmVsc3RAQGFkdmVyYkBAIGVpbmUgV2VpbGUgdm9yIERpY2ggaGluLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGdydWViZWx0QEBhZHZlcmJAQCBlaW5lIFdlaWxlIHZvciBzaWNoIGhpbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEdydW1tZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJncnVtbWVsIjoKKyAgICBjYXNlICJncnVtbWwiOgorICAgIEhFTFBDSEVDSygiZ3J1bW1lbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiR3J1bW1sZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBncnVtbWVsc3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGdydW1tZWx0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEdydW56ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImdydW56IjoKKyAgICBIRUxQQ0hFQ0soImdydW56Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJHcnVuemUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgZ3J1bnp0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBncnVuenRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogR3Vja2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJndWNrIjoKKyAgICBIRUxQQ0hFQ0soImd1Y2siKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIWFkdmVyYikKKyAgICAgIFJldHVybigiR3Vja2Ugd2llIGF1cyBkZXIgV2Flc2NoZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGd1Y2tzdEBAYWR2ZXJiQEAgYXVzIGRlciBXYWVzY2hlLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGd1Y2t0QEBhZHZlcmJAQCBhdXMgZGVyIFdhZXNjaGUuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBKYW1tZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJqYW1tZXIiOgorICAgIEhFTFBDSEVDSygiamFtbWVyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJXaWUgd2lsbHN0IER1IGphbW1lcm4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBqYW1tZXJzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgamFtbWVydEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBIYWV0c2NoZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJoYWV0c2NoZWwiOgorICAgIGNhc2UgImhhZXRzY2hsIjoKKyAgICBIRUxQQ0hFQ0soImhhZXRzY2hlbCIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHVlYmVybGVnc3QgZXMgRGlyIGFuZGVycyAtIG1pdCBEZWluZW4gZHVyY2hsYWVzc2lnZW4gIgorICAgICAgICArIkhhZW5kZW4uLi4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgYW5zY2hlaW5lbmQgamVtYW5kIGhhZXRzY2hlbG4sIHVlYmVybGVndFxuIgorICAgICAgICArImVzIHNpY2ggbmFjaCBlaW5lbSBrdXJ6ZW4gQmxpY2sgYXVmIHNlaW5lIEhhZW5kZSBhbmRlcnMuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGhhZXRzY2hlbHN0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgaGFldHNjaGVsdCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU4pOworICAgIH0KKyAgICBpZiAoIXN0ciB8fCAhd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGhhZXRzY2hlbG4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRiwgTk9UX0RFQUQsCisgICAgICAiRGFzIHNpZWh0IHZpZWwgenUgYWxiZXJuIGF1cyAtIER1IGxhZXNzdCBlcyBibGVpYmVuLiIsCisgICAgICAiSXN0IGRhIHVlYmVyaGF1cHQgd2FzIHp1IGhhZXRzY2hlbG4/IE5laW4sIGRhIGxlYnQgZG9jaCBuaXguIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGhhZXRzY2hlbHN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAgaGFldHNjaGVsdCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGhhZXRzY2hlbHRAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBIaWNrc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJoaWNrcyI6CisgICAgSEVMUENIRUNLKCJoaWNrcyIpOworICAgIEdIT1NUQ0hFQ0soIkhvcHBsYSEgRGllc2VyIEhpY2tzZXIgemllaHQgRGljaCBnYW56IHNjaG9lbiB6dXNhbW1lbiFcbiIsCisgICAgICBnbmFtZSgpKyIgaGF0IGFuc2NoZWluZW5kIFNjaGx1Y2thdWYuXG4iCisgICAgICAgICsiVW5kIHdhcyBmdWVyIGVpbmVuISBGdWVyIGVpbmVuIE1vbWVudCB6aWVodCBlcyAiK1F1ZXJ5UHJvbm91bihXRU4pCisgICAgICAgICsiIHppZW1saWNoIHp1c2FtbWVuLlxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJIaWNrcyEiOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgbXVzcyBoaWNrc2VuLiBXYWhyc2NoZWlubGljaCB6dSB2aWVsIEFsa29ob2wuLi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmICghYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIkhpY2tzZSB3aWU/XG4iKTsKKyAgICAgIG91dF9zZWw9IkR1IGhpY2tzdEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGhpY2tzdEBAYWR2ZXJiQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogSHVlcGZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiaHVlcGYiOgorICAgIEhFTFBDSEVDSygiaHVlcGYiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzY2h3ZWJzdCBkdXJjaCBkaWUgR2VnZW5kLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzY2h3ZWJ0IGR1cmNoIGRpZSBHZWdlbmQuXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkIgTyBJIE4gRyAhISBEdSBodWVwZnN0IGluIGRlciBHZWdlbmQgaGVydW0uIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGh1ZXBmdCBpbiBkZXIgR2VnZW5kIGhlcnVtLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJIdWVwZmUgd2llIG9kZXIgdW0gd2VuIG9kZXIgd2llIG9kZXIgd2FzIG9kZXIgaGFlaD9cbiIpOworICAgICAgb3V0X3NlbD0iRHUgaHVlcGZzdEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHVtQEAgd2VuQEAiIDogIiIpKyIgaGVydW0uIjsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIGh1ZXBmdEBAYWR2ZXJiQEAgdW0gRGljaCBoZXJ1bS4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgaHVlcGZ0QEBhZHZlcmJAQCIrKHdobyA/ICIgdW1AQCB3ZW5AQCIgOiAiIikrIiBoZXJ1bS4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBIdXN0ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImh1c3QiOgorICAgIEhFTFBDSEVDSygiaHVzdCIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHZlcnN0cmV1c3QgZWluIHBhYXIgR2Vpc3RlcmJhemlsbGVuIGltIFJhdW0uXG4iLAorICAgICAgZ25hbWUoKSsiIG1hY2h0IHVmZmYsIHVmZmYgdW5kIHZlcnRlaWx0IGVpbiBwYWFyIEdlaXN0ZXItXG4iCisgICAgICAgICsiYmF6aWxsZW4gaW0gUmF1bS5cbiIsIDApOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iSHVzdCEgS2V1Y2ghIEhhbHQgZGlyIGRvY2ggd2VuaWdzdGVucyBkaWUgSGFuZCB2b3IgZGVuIE11bmQhIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGh1c3RldCBzaWNoIGZhc3QgZGllIFNlZWxlIGF1cyBkZW0gTGVpYi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiV2VubiBEdSBzY2hvbiB3YXMgaGludGVyIGh1c3RlIHRpcHBzdCwgZGFubiBiaXR0ZSB3YXMgIgorICAgICAgICAgICsidmVybnVlbmZ0aWdlcyFcbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJEaXIgc2VsYmVyIGtvZW5uZW4gbnVyIGFuZGVyZSB3YXMgaHVzdGVuLiIsCisgICAgICAgICJCaXR0ZSBodXN0ZSBudXIgTGViZXdlc2VuIHdhcy4iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIG91dF9zZWw9IkR1IGh1c3Rlc3RAQCB3ZW1AQEBAYWR2ZXJiQEAiKyh3aG8/ICIgd2FzIiA6ICIiKSsiLiI7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBodXN0ZXQgRGlyQEBhZHZlcmJAQHdhcy4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgaHVzdGV0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvPyAiIHdhcyIgOiAiIikrIi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBKdWJlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImp1YmVsIjoKKyAgICBjYXNlICJqdWJsIjoKKyAgICBIRUxQQ0hFQ0soImp1YmVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkp1YmxlIHdpZT8gT2RlciB3ZW0genU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBqdWJlbHN0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dS4iIDogIi4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAganViZWx0IERpckBAYWR2ZXJiQEAgenUuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAganViZWx0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dS4iIDogIi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLZXVjaGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrZXVjaCI6CisgICAgSEVMUENIRUNLKCJrZXVjaCIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJBbHMgR2Vpc3Qgc3RyZW5ndCBEaWNoIG5peCBhbiAtIGFsc28gd2lyZCBhdWNoIG5pY2h0ICIKKyAgICAgICAgKyJnZWtldWNodC5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiS2V1Y2hlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGtldWNoc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5zdHJlbmd1bmcuIik7CisgICAgb3V0X290aD0iQEBuYW1lQEAga2V1Y2h0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgdm9yIEFuc3RyZW5ndW5nLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtpY2hlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtpY2hlciI6CisgICAgSEVMUENIRUNLKCJraWNoZXIiKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkR1IGtpY2hlcnN0LiAoV2llIGFsYmVybiB2b24gRGlyKSI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgZ2lidCBlaW4gYWxiZXJuZXMgS2ljaGVybiB2b24gc2ljaC4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiRGFzIGhhdXQgc28gbmljaHQgaGluLCBnaWIgdmVybnVlbmZ0aWdlIFBhcmFtZXRlci5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJJbiBkaWVzZW0gRmFsbCBuaW1tIGJpdHRlIG51ciBraWNoZXIuIiwKKyAgICAgICAgIk11c3N0IHNjaG9uIGV0d2FzIExlYmVuZGVzIGFuZ2ViZW4sIG5pY2h0cyBUb3Rlcy4iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIG91dF9zZWw9IkR1IGtpY2hlcnN0QEBhZHZlcmJAQCIrKHdobyA/ICIgaGludGVyICIrd2hvLT5uYW1lKFdFU1NFTikrCisgICAgICAgICIgUnVlY2tlbi4iIDogIi4iKTsKKyAgICAgIGlmICh3aG8pICBvdXRfdmljPSJKZW1hbmQga2ljaGVydEBAYWR2ZXJiQEAgaGludGVyIGRlaW5lbSBSdWVja2VuLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAga2ljaGVydEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGhpbnRlciAiK3doby0+bmFtZShXRVNTRU4pCisgICAgICAgICsiIFJ1ZWNrZW4uIiA6ICIuIik7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtpdHplbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtpdHplbCI6CisgICAgY2FzZSAia2l0emwiOgorICAgIEhFTFBDSEVDSygia2l0emVsIik7CisgICAgR0hPU1RDSEVDSygiTWl0IERlaW5lbiBpbW1hdGVyaWVsbGVuIEZpbmdlcm4gc2NoYWZmc3QgRHUgZGFzIG5pY2h0LlxuIiwKKyAgICAgIGduYW1lKCkrIiBtdXNzIGdlcmFkZSBmZXN0c3RlbGxlbiwgZGFzcyBtYW4gbWl0XG4iCisgICAgICAgICsiaW1tYXRlcmllbGxlbiBGaW5nZXJuIG5pY2h0IGtpdHplbG4ga2Fubi5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGtpdHplbG4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEdSBiaXN0IGRvY2gga2VpbiBNYXNvY2hpc3QhIER1IGxhZXNzdCBlcyBibGVpYmVuLiIsCisgICAgICAiRGluZ2Ugc2luZCBzbyBzZWx0ZW4ga2l0emxpZy4gTGFzcyBlcyBibGVpYmVuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAobWVtYmVyKCh7ImhpZ2hsYW5kZXIiLCJob2JvIn0pLCB3aG8tPnF1ZXJ5X3JlYWxfbmFtZSgpKT4tMSkKKyAgICAgIHN3aXRjaCAod2hvLT5xdWVyeV9yZWFsX25hbWUoKSkgIHsKKyAgICAgICAgY2FzZSAiaGlnaGxhbmRlciI6IHN0cjE9InVudGVyIjsgc3RyMj0iRmVkZXJuIjsgYnJlYWs7CisgICAgICAgIGNhc2UgImhvYm8iICAgICAgOiBzdHIxPSJhbiI7ICAgIHN0cjI9Iktpbm4iOyBicmVhazsKKyAgICAgIH0KKyAgICBlbHNlIGlmICh3aG8tPlF1ZXJ5UHJvcChQX1JBQ0UpKQorICAgICAgc3dpdGNoIChsb3dlcl9jYXNlKHdoby0+UXVlcnlQcm9wKFBfUkFDRSkpKSAgeworICAgICAgICBjYXNlICJkcmFjaGUiIDogc3RyMT0idW50ZXIiO3N0cjI9IlNjaHVwcGVuIjsKKyAgICAgICAgICB0X2c9RkVNQUxFOyB0X249UExVUkFMOyBicmVhazsKKyAgICAgICAgY2FzZSAiZ3JlaWYiICA6IHN0cjE9InVudGVyIjtzdHIyPSJGZWRlcm4iOworICAgICAgICAgIHRfZz1GRU1BTEU7IHRfbj1QTFVSQUw7IGJyZWFrOworICAgICAgICBkZWZhdWx0ICAgICAgIDogc3RyMT0iYW4iOyBzdHIyPSJLaW5uIjsgdF9nPU5FVVRFUjsgdF9uPVNJTkdVTEFSOworICAgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIHN0cjE9ImFuIjsgc3RyMj0iS2lubiI7IHRfZz1ORVVURVI7IHRfbj1TSU5HVUxBUjsKKyAgICB9CisgICAgaWYgKGdldHVpZCh3aG8pPT0idHJlc3QiIHx8IGdldHVpZCh3aG8pPT0id29lbGtjaGVuIikgIHsKKyAgICAgIHN0cjE9ImFuIjsgc3RyMj0iRnVlc3NlbiI7IHRfZz1NQUxFOyB0X249UExVUkFMOworICAgIH0KKyAgICBvdXRfc2VsPSJEdSBraXR6ZWxzdEBAIHdlbkBAQEBhZHZlcmJAQCAiK3N0cjErIiAiK3doby0+UVBQKHRfZyxXRU0sdF9uKQorICAgICAgKyIgIitzdHIyKyIuXG5AQHdlckBAIHZlcnN1Y2h0LCBzaWNoIHp1IGJlaGVycnNjaGVuLCBtdXNzIGFiZXIgIgorICAgICAgKyJkb2NoIGxhY2hlbi4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGtpdHplbHQgRGljaEBAYWR2ZXJiQEAgIitzdHIxKyIgRGVpbmUiCisgICAgICArKHRfbiA/ICJuIiA6ICh0X2c9PUZFTUFMRSA/ICJyIiA6ICJtIikpKyIgIitzdHIyCisgICAgICArIi5cbkR1IHZlcnN1Y2hzdCwgRGljaCB6dSBiZWhlcnJzY2hlbiwgbXVzc3QgYWJlciBkb2NoIGxhY2hlbi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGtpdHplbHRAQCB3ZW5AQEBAYWR2ZXJiQEAgIitzdHIxKyIgIgorICAgICAgK3doby0+UVBQKHRfZyxXRU0sdF9uKSsiICIrc3RyMgorICAgICAgKyIuXG5AQHdlckBAIHZlcnN1Y2h0LCBzaWNoIHp1IGJlaGVycnNjaGVuLCBtdXNzIGFiZXIgZG9jaCBsYWNoZW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLbGF0c2NoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtsYXRzY2giOgorICAgIEhFTFBDSEVDSygia2xhdHNjaCIpOworICAgIEdIT1NUQ0hFQ0soIkRlaW5lIEhhZW5kZSBzYXVzZW4gZHVyY2hlaW5hbmRlciBkdXJjaC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCBpbiBkaWUgSGFlbmRlIGtsYXRzY2hlbiAtIGFiZXIgc2llXG4iCisgICAgICAgICsic2F1c2VuIGR1cmNoZWluYW5kZXIgZHVyY2guXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIWFkdmVyYiAmJiBzdHIpCisgICAgICBSZXR1cm4oIktsYXRzY2hlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGtsYXRzY2hzdEBAYWR2ZXJiQEAgaW4gZGllIEhhZW5kZS4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGtsYXRzY2h0QEBhZHZlcmJAQCBpbiBkaWUgSGFlbmRlLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS2xvcGZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia2xvcGYiOgorICAgIEhFTFBDSEVDSygia2xvcGYiKTsKKyAgICBpZiAoIXN0cnx8c3NjYW5mKHN0ciwiJXMgYXVmIHNjaHVsdGVyIixzZm9vKSE9MSkKKyAgICAgIGlmICghc3RyfHxzc2NhbmYoc3RyLCIlcyBhdWYgZGllIHNjaHVsdGVyIixzZm9vKSE9MSkKKyAgICAgICAgUmV0dXJuKCJLbG9wZmUgd2llIHdlbSB3aWVzbyB3YXM/XG4iKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRGFzIGdlaHQgbGVpZGVyIG5pY2h0IG1pdCBkdXJjaGxhZXNzaWdlbiBIYWVuZGVuLlxuIik7CisgICAgc3RyPXNmb287CisgICAgaWYgKHN0cj09IiIpIHN0cj0wOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJLbG9wZmUgd2VtIGF1ZiBkaWUgU2NodWx0ZXI/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBrbG9wZnN0IEBAd2VtQEBAQGFkdmVyYkBAIGF1ZiBkaWUgU2NodWx0ZXIuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBrbG9wZnQgRGlyQEBhZHZlcmJAQCBhdWYgZGllIFNjaHVsdGVyLiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAga2xvcGZ0IEBAd2VtQEBAQGFkdmVyYkBAIGF1ZiBkaWUgU2NodWx0ZXIuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLbmFiYmVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia25hYmJlciI6CisgICAgSEVMUENIRUNLKCJrbmFiYmVyIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIlNvcnJ5LCBhYmVyIGRhZnVlciBmZWhsdCBEaXIgaW0gTW9tZW50IGRlciBub2V0aWdlICIKKyAgICAgICAgKyJcIkJpc3NcIi4uLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIktuYWJiZXJlIHdlbiBhbj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUga29tbXN0IG5pY2h0IGFuIGRlaW4gZWlnZW5lcyBPaHIgcmFuLi4uIiwKKyAgICAgICJOb2UsIG5vZSwgZGFzIHNjaG1lY2t0IGJlc3RpbW10IG5pY2h0IGd1dC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUga25hYmJlcnN0QEBhZHZlcmJAQCBhbiAiK3doby0+bmFtZShXRVNTRU4pKyIgT2hyLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAga25hYmJlcnRAQGFkdmVyYkBAIGFuIERlaW5lbSBPaHIuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrbmFiYmVydEBAYWR2ZXJiQEAgYW4gIit3aG8tPm5hbWUoV0VTU0VOKSsiIE9oci4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtuaWNrc2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbmlja3MiOgorICAgIEhFTFBDSEVDSygia25pY2tzIik7CisgICAgR0hPU1RDSEVDSygiRHUga25pY2tzdCBpbiBkZXIgTWl0dGUgYWIsIGtyaWVnc3QgRGljaCBhYmVyIHNjaG5lbGwgd2llZGVyICIKKyAgICAgICAgKyJ6dXNhbW1lbi5cbiIsCisgICAgICBnbmFtZSgpKyIga25pY2socyl0IGluIGRlciBNaXR0ZSBhYiwga3JpZWd0IHNpY2ggYWJlclxuIgorICAgICAgICArInp1bSBHbHVlY2sgc2NobmVsbCB3aWVkZXIgenVzYW1tZW4uXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgeworICAgICAgb3V0X3NlbD0iRHUgbWFjaHN0IGVpbmVuIGFubXV0aWdlbiBLbmlja3MuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIG1hY2h0IGVpbmVuIGFubXV0aWdlbiBLbmlja3MuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0ciwidm9yIik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUga25pY2tzdEBAYWR2ZXJiQEAgdm9yIEBAYWxsZUBALiI7CisgICAgICAgIG91dF92aWM9IkBAbmFtZUBAIGtuaWNrc3RAQGFkdmVyYkBAIHZvciBAQGFsbGVAQC4iOworICAgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VNKTsKKyAgICAgIH0KKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiS25pY2tzZSBpcmdlbmR3aWUgb2RlciB2b3IgamVtYW5kZW0uXG4iKTsKKyAgICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgICAiV2llIHdpbGxzdCBEdSBkYXMgZGVubiBzY2hhZmZlbj8iLAorICAgICAgICAiVm9yIFNhY2hlbiB3aXJkIGhpZXIgbmljaHQgZ2Vrbmlja3N0ISIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUga25pY2tzdEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHZvciIgOiAiIikrIkBAIHdlbUBALiI7CisgICAgICBpZiAod2hvICkgb3V0X3ZpYz0iQEBuYW1lQEAga25pY2tzdEBAYWR2ZXJiQEAgdm9yIERpci4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAga25pY2tzdEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHZvciIgOiAiIikrIkBAIHdlbUBALiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtuaXJzY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia25pcnNjaCI6CisgICAgSEVMUENIRUNLKCJrbmlyc2NoIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkR1IGthbm5zdCBtaXQgbmljaHRzIGtuaXJzY2hlbiwgc28gYWxzIEdlaXN0LiBWZXJzdWNoZSBkb2NoICIKKyAgICAgICAgKyJkYWZ1ZXJcbm1hbCwgenUgcmFzc2Vsbi4uLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJLbmlyc2NoZSB3aWU/XG4iKTsKKyAgICBzd2l0Y2ggKFF1ZXJ5UHJvcChQX1JBQ0UpKSAgeworICAgICAgY2FzZSAiZ3JlaWYiICA6IHN0cjE9ImRlbSBTY2huYWJlbC4iOyBicmVhazsKKyAgICAgIGNhc2UgInNhbmR0aWdlciIgOiBzdHIxPSJkZW4gRmFuZ3phZWhuZW4uIjsgYnJlYWs7CisgICAgICBjYXNlICJkcmFjaGUiIDogc3RyMT0iZGVuIEZhbmd6YWVobmVuLiI7IGJyZWFrOworICAgICAgZGVmYXVsdCAgICAgICA6IHN0cjE9ImRlbiBaYWVobmVuLiI7CisgICAgfQorICAgIG91dF9zZWw9IkR1IGtuaXJzY2hzdEBAYWR2ZXJiQEAgbWl0ICIrc3RyMTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrbmlyc2NodEBAYWR2ZXJiQEAgbWl0ICIrc3RyMTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLbnVkZGVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia251ZGRlbCI6CisgICAgY2FzZSAia251ZGRsIjoKKyAgICBIRUxQQ0hFQ0soImtudWRkZWwiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiU29ycnksIG5pY2h0IGFscyBHZWlzdC5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUga251ZGRlbHN0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAga251ZGRlbHQgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIktudWRkbGUgd2VuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEYXMgYnJpbmd0IGRvY2ggbml4LCBsYXNzIGVzIGhhbHQuIiwKKyAgICAgICJEdSBrYW5uc3Qgc292aWVsIGljaCB3ZWlzcyBhdXNzZXIgTGViZXdlc2VuIG51ciBUZWRkeXMga251ZGRlbG4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IGtudWRkZWxzdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGtudWRkZWx0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAga251ZGRlbHRAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLbnVycmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrbnVyciI6CisgICAgSEVMUENIRUNLKCJrbnVyciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUga251cnJzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBrbnVycnQgQEBhbGxlQEBAQGFkdmVyYkBAIGFuLiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIldlbiBhbmtudXJyZW4gb2RlciB3aWUga251cnJlbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkR1IGtudXJyc3QgaW4gRGljaCBoaW5laW4uIiwKKyAgICAgICJSZWFnaWVydCBuaWNodC4gU29sbHRlc3Qgd29obCBiZXNzZXIgTGVid2VzZW4gYW5rbnVycmVuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBrbnVycnN0QEAgd2VuQEBAQGFkdmVyYkBAIisod2hvID8gIiBhbi4iIDogIi4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAga251cnJ0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGtudXJydEBAIHdlbkBAQEBhZHZlcmJAQCIrKHdobyA/ICIgYW4uIiA6ICIuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogIEtudXRzY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia251dHNjaCI6CisgICAgSEVMUENIRUNLKCJrbnV0c2NoIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkRhcyBrYW5uc3QgRHUgYWxzIEdlaXN0IGxlaWRlciBuaWNodC4gSXJnZW5kd2llIGZlaGx0IERpciAiCisgICAgICAgICsiZGF6dSBkYXMgSGVyei5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJLbnV0c2NoZSB3ZW4gYWI/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhcyBnZWh0IG5pY2h0LiIsCisgICAgICAiSWdpdHQhIExpZWJlciBuaWNodCEiKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgZ2lic3QgQEB3ZW1AQEBAYWR2ZXJiQEAgZWluZW4gUklDSFRJR0VOIEt1c3MuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBnaWJ0IERpckBAYWR2ZXJiQEAgZWluZW4gdGllZmVuIHVuZCBoaW5nZWJ1bmdzdm9sbGVuICIKKyAgICAgICsiS3Vzcy5cbkR1IHNjaHdlYnN0IGltIDcuIEhpbW1lbC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGdpYnQgQEB3ZW1AQEBAYWR2ZXJiQEAgZWluZW4gdGllZmVuIHVuZCAiCisgICAgICArImhpbmdlYnVuZ3N2b2xsZW4gS3Vzcy4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtvdHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia290eiI6CisgICAgSEVMUENIRUNLKCJrb3R6Iik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIk5lLCBkYXMgaXN0IGVpbnMgdm9uIGRlbiBTYWNoZW4sIGRpZSBhbHMgR2Vpc3QgbmljaHQgZ2VoZW4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiS290emUgd2llPyBLb3R6ZSBhdWYgd2VuP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsMCwKKyAgICAgICJJZ2l0dCwgbmVpbiBkYW5rZS4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoIXN0cikgeworICAgICAgb3V0X3NlbD0iRHUga290enQgdWViZXIgZGVpbmUgU2NodWhlLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCB2ZXJkcmVodCBkaWUgQXVnZW4gdW5kIGtvdHp0LiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIG91dF9zZWw9IkR1IGtvdHp0QEBhZHZlcmJAQCIrKHdobyA/ICIgYXVmIEBAd2VuQEAuIiA6ICIuIik7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBrb3R6dEBAYWR2ZXJiQEAgYXVmIERpY2guIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGtvdHp0QEBhZHZlcmJAQCIrKHdobyA/ICIgYXVmIEBAd2VuQEAuIiA6ICIuIik7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIEtyYXR6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImtyYXR6IjoKKyAgICBIRUxQQ0hFQ0soImtyYXR6Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHdobyAmJiAod2hvIT10aGlzX3BsYXllcigpKSkKKyAgICAgIFJldHVybigiRGFzIG1hY2ggbWFsIHNjaG9lbiBudXIgbWl0IERpciBzZWxiZXIuXG4iKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIldpZSB3aWxsc3QgRHUgRGljaCBrcmF0emVuP1xuIik7CisgICAgb3V0X3NlbD0iRHUga3JhdHp0IGRpY2hAQGFkdmVyYkBAIGFtIEtvcHAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAga3JhdHp0IHNpY2hAQGFkdmVyYkBAIGFtIEtvcHAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBLcmllY2hlICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJrcmllY2giOgorICAgIEhFTFBDSEVDSygia3JpZWNoIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgb3V0X3NlbD0iRHUga3JpZWNoc3QiKyh3aG8gPyAiIHZvciBAQHdlbUBAIiA6ICIiKSsiQEBhZHZlcmJAQCBpbSBTdGF1Yi4iOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBrcmllY2h0QEBhZHZlcmJAQCB2b3IgRGlyIGltIFN0YXViLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIGtyaWVjaHQiKyh3aG8gPyAiIHZvciBAQHdlbUBAIiA6ICIiKQorICAgICAgKyJAQGFkdmVyYkBAIGltIFN0YXViLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogS3Vlc3NlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia3Vlc3MiOgorICAgIEhFTFBDSEVDSygia3Vlc3MiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiQWxzIEdlaXN0IGthbm5zdCBEdSBsZWlkZXIgbmllbWFuZGVuIGt1ZXNzZW4uXG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2VuIHdpbGxzdCBEdSBrdWVzc2VuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJEYSBoYXN0IER1IGFiZXIgU2Nod2llcmlna2VpdGVuLi4uIER1IGdpYnN0IGVzIHNjaGxpZXNzbGljaCBhdWYuIiwKKyAgICAgICJOaXguIEFic29sdXQgbml4LiBLdWVzc2UgbGllYmVyIExlYmV3ZXNlbiAtIGRpZSByZWFnaWVyZW5cbiIKKyAgICAgICAgKyJ3ZW5pZ3N0ZW5zICh1bmQgc2VpIGVzLCBkYXNzIHNpZSBEaWNoIGZyZXNzZW4uLi4pLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBrdWVzc3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBrdWVzc3QgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBrdWVzc3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBGZWVsSXQoKTsKKyAgICBpZiAod2hvLT5RdWVyeVByb3AoUF9GUk9HKSYmUXVlcnlQcm9wKFBfTEVWRUwpPndoby0+UXVlcnlQcm9wKFBfTEVWRUwpKSB7CisgICAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSksIlBMT1BQIVxuIik7CisgICAgICB3cml0ZSgiSHVjaCEgRHUgd2lyc3QgYXVmIGVpbm1hbCBzbyBncnVlbiB1bmQga2xlaW4gdW5kIGtyaWVnc3QgYXVmXG4iCisgICAgICAgICsiZWlubWFsIGZ1cmNodGJhciBIdW5nZXIgYXVmIEZsaWVnZW4gdW5kIHNvLi4uXG4iKTsKKyAgICAgIHdoby0+TWVzc2FnZSgiQXVmIGVpbm1hbCB3aXJkIGRpZSBXZWx0IHVtIERpY2ggd2llZGVyIHNvIGtsZWluLCB3aWUgc2llXG4iCisgICAgICAgICsiIGZydWVoZXIgbWFsIHdhciAtIHVuZCB2b3IgRGlyIHNpdHp0IGVpbiBrbGVpbmVyIGdydWVuZXIgRnJvc2NoLlxuIik7CisgICAgICBzYXkod2hvLT5uYW1lKFdFUikrIiBzdGVodCBhdWYgZWlubWFsIGRhIHVuZCBzY2hhdXQgZHVtbSBhdXMgZGVyICIKKyAgICAgICAgKyJXYWVzY2hlLiBEYWZ1ZXIgZmVobHRcbmpldHp0IHNlbHRzYW1lcndlaXNlICIrY2FwbmFtZSgpCisgICAgICAgICsiLiBEaWUgR2VzYW10emFobCBhbiBrbGVpbmVuIGdydWVuZW5cbkZyb2VzY2hlbiBpbSBSYXVtIGhhdCBzaWNoICIKKyAgICAgICAgKyJqZWRvY2ggbmljaHQgZ2VhZW5kZXJ0Li4uXG4iLCh7d2hvLHRoaXNfcGxheWVyKCl9KSk7CisgICAgICB3aG8tPlNldFByb3AoUF9GUk9HLDApOworICAgICAgU2V0UHJvcChQX0ZST0csMSk7CisgICAgfQorICAgIHJldHVybiAxOworCisgICAgLyoqKioqKioqKioqKioqKiogS3VzY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImt1c2NoZWwiOgorICAgIGNhc2UgImt1c2NobCI6CisgICAgSEVMUENIRUNLKCJrdXNjaGVsIik7CisgICAgR0hPU1RDSEVDSygiRGF6dSBiaXN0IER1IGFscyBHZWlzdCB2aWVsIHp1IGthbHQgdW5kIGdhciAiCisgICAgICAgICsic2Nocm9lY2tsaWNoIGFuenVzZWhlbi5cbiIsCisgICAgICBnbmFtZSgpKyIgc2NoZWludCBBbndhbmRsdW5nZW4genUgaGFiZW4sIHNpY2ggYW4gamVtYW5kICIKKyAgICAgICAgKyJhbmt1c2NoZWxuIHp1IHdvbGxlbi5cbkVudHNldHp0IHNwcmluZ2VuIGFsbGUgenVydWVjaywgd2VpbCAiCisgICAgICAgICsiZGF6dSBpc3QgZXIgZG9jaCB6dSBrYWx0IHVuZCBzY2hyb2Vja2xpY2hcbmFuenVzZWhlbi5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJBbiB3ZW4gd2lsbHN0IER1IERpY2ggYW5rdXNjaGVsbj9cbiIpOworICAgIG91dF9zZWw9IkR1IGt1c2NoZWxzdCBEaWNoQEBhZHZlcmJAQCBhbiBAQHdlbkBAIGFuLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAga3VzY2hlbHQgc2ljaEBAYWR2ZXJiQEAgYW4gRGljaCBhbi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIGt1c2NoZWx0IHNpY2hAQGFkdmVyYkBAIGFuIEBAd2VuQEAgYW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBMYWNoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImxhY2giOgorICAgIEhFTFBDSEVDSygibGFjaCIpOworICAgIEdIT1NUQ0hFQ0soIkR1IGxhY2hzdCBtaXQgaG9obGVyIFN0aW1tZS4gRGVuIFVtc3RlaGVuZGVuIChzaW5kIGRvY2ggd2VsY2hlIgorICAgICAgICArIiBkYSwgb2Rlcj8pXG5sYWV1ZnQgZXMga2FsdCBkZW4gUnVlY2tlbiBydW50ZXIuXG4iLAorICAgICAgZ25hbWUoKSsiIGxhY2h0IG1pdCBob2hsZXIgU3RpbW1lLlxuRGlyIGxhZXVmdCBlcyBlaXNrYWx0IGRlbiBSdWVja2VuIgorICAgICAgICArIiBydW50ZXIuXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkR1IGJyaWNoc3Qgdm9yIExhY2hlbiB6dXNhbW1lbi4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgYnJpY2h0IHZvciBMYWNoZW4genVzYW1tZW4uIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgbGFjaHN0QEBhZHZlcmJAQCB1ZWJlciBAQGFsbGVAQC4iOworICAgICAgICBvdXRfdmljPSJAQG5hbWVAQCBsYWNodEBAYWR2ZXJiQEAgdWViZXIgQEBhbGxlQEAuIjsKKyAgICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgICB9CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIkxhY2hlIHdpZSwgbGFjaGUgdWViZXIgd2VuP1xuIik7CisgICAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICAgIkxhY2ggRGljaCBkb2NoIG5pY2h0IHNlbGJlciBhdXMgLSBkYXMgbWFjaGVuIHNjaG9uIGFuZGVyZS4uLiIsCisgICAgICAgICJHZWxhY2h0IHdpcmQgbnVyIHVlYmVyIExlYmV3ZXNlbiAoZGllIGtvZW5uZW4gc2ljaCBkcnVlYmVyIGFlcmdlcm4pLiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUgbGFjaHN0QEBhZHZlcmJAQCIrKHdobz8iIHVlYmVyQEAgd2VuQEAiOiIiKSsiLiI7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBsYWNodEBAYWR2ZXJiQEAgdWViZXIgRGljaC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgbGFjaHRAQGFkdmVyYkBAIisod2hvPyIgdWViZXJAQCB3ZW5AQCI6IiIpKyIuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTGFlY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImxhZWNoZWwiOgorICAgIGNhc2UgImxhZWNobCI6CisgICAgSEVMUENIRUNLKCJsYWVjaGVsIik7CisgICAgaWYgKGdob3N0KCkpIHsKKyAgICAgIHdyaXRlKCJEdSBsYWVjaGVsc3QgaW5uZXJsaWNoLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYoIXN0cikgeworICAgICAgb3V0X3NlbD0iRHUgbGFlY2hlbHN0LiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBsYWVjaGVsdC4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgICBvdXRfc2VsPSJEdSBsYWVjaGVsc3QgQEBhbGxlQEBAQGFkdmVyYkBAIGFuLiI7CisgICAgICAgIG91dF92aWM9IkBAbmFtZUBAIGxhZWNoZWx0IEBAYWxsZUBAQEBhZHZlcmJAQCBhbi4iOworICAgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICAgIH0KKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIgJiYgc3RyKQorICAgICAgICBSZXR1cm4oIldpZSBvZGVyIHdlbj9cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJNdXNzdCBzY2hvbiBqZW1hbmQgYW5kZXJzIGFubGFlY2hlbG4uIiwKKyAgICAgICAgIkJpdHRlIGVpbiBMZWJld2VzZW4gYW5sYWVjaGVsbi4iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIG91dF9zZWw9IkR1IGxhZWNoZWxzdEBAIHdlbkBAQEBhZHZlcmJAQCIrKHdobyA/ICIgYW4uIiA6ICIuIik7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBsYWVjaGVsdCBEaWNoQEBhZHZlcmJAQCBhbi4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgbGFlY2hlbHRAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGFuLiIgOiAiLiIpOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBMaWViZSAqKioqKioqKioqKioqKiovCisgICAgLyogVGhlc2UgbGluZXMgYXBwZWFyIENvdXJ0ZXN5IG9mIEFuZ3VzQE1vcmdlbkdyYXVlbi4gU28gbG9uZywgYW5kIHRoYW5rcyAqLworICAgIC8qIGZvciBhbGwgdGhlIGZpc2gsIGVycnIsIHRleHQsIEFuZ3VzIDopICovCisgICAgY2FzZSAibGllYiI6CisgICAgSEVMUENIRUNLKCJsaWViIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkF1ZiBkaWVzZSBGcmV1ZGVuIG11c3N0IER1IGFscyBHZWlzdCBsZWlkZXIgdmVyemljaHRlbi5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gaGFzdCBEdSBsaWViP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJKYSwgaWNoIHdlaXNzLCBEdSBtYWdzdCBEaWNoLCBhYmVyIGRhcyBtdXNzdCBEdSBuaWNodCB6dXIgU2NoYXUiCisgICAgICAgICsic3RlbGxlbi4iLAorICAgICAgIkR1IGVudHdpY2tlbHN0IHNlbHRzYW1lIE5laWd1bmdlbiwgZmluZGUgaWNoLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBzdHIxPSh3aG8tPlF1ZXJ5UHJvcChQX0dFTkRFUik9PUZFTUFMRSA/ICJpaHIiIDogImlobSIpOworICAgIC8qIG9sZCB2ZXJzaW9uOgorICAgICAgb3V0X3NlbD0iRHUgZmx1ZXN0ZXJzdCBAQHdlbUBAQEBhZHZlcmJAQCBsaWViZXZvbGxlIFdvcnRlIGlucyBPaHIuIjsKKyAgICAgIG91dF92aWM9Z25hbWUoKSsiIGZsdWVzdGVydCBEaXJAQGFkdmVyYkBAIGxpZWJldm9sbGUgV29ydGUgaW5zIE9oci4iOworICAgICAgb3V0X290aD1nbmFtZSgpKyIgZmx1ZXN0ZXJ0QEBhZHZlcmJAQCBzYW5mdGUgV29ydGUgenUgQEB3ZW1AQC4iOworICAgICovCisgICAgb3V0X3NlbD0iRHUgc2NobGllc3N0IGRpZSBBdWdlbiwgc2NobWllZ3N0IERpY2ggZW5nIGFuIEBAd2VuQEAgdW5kIGdpYnN0IgorICAgICAgK0xGK3N0cjErIiBlaW5lbiB6YWVydGxpY2hlbiB1bmQgbGVpZGVuc2NoYWZ0bGljaGVuIEt1c3MuXG4iCisgICAgICArIlVtIERpY2ggaGVydW0gdmVyc2lua3QgZGllIFdlbHQgdW5kIER1IGdsYXVic3QsIGF1ZiBXb2xrZW4genUgIgorICAgICAgKyJzY2h3ZWJlbi4iOworICAgIG91dF92aWM9IkBAbmFtZUBAIGRydWVja3QgRGljaCB6YWVydGxpY2ggYW4gc2ljaCB1bmQgZ2lidCBEaXJcbiIKKyAgICAgICsiZWluZW4gemFlcnRsaWNoZW4gdW5kIGxlaWRlbnNjaGFmdGxpY2hlbiBLdXNzLiBEdSBzY2hsaWVzc3QgZGllXG4iCisgICAgICArIkF1Z2VuIHVuZCB0cmFldW1zdCBlaW4gd2VuaWcuLi4uLi5EdSBzY2h3ZWJzdCBhdWYgV29sa2VuIGRpcmVrdFxuIgorICAgICAgKyJpbiBkZW4gc2llYnRlbiBIaW1tZWwuIjsKKyAgICBvdXRfb3RoPSJEdSBzY2hhdXN0IGRlemVudCB3ZWcsIGFscyBzaWNoIEBAbmFtZUBAIHVuZCAiK3doby0+bmFtZSgpCisgICAgICArIiB2ZXJsaWVidCBpbiBkaWUgQXJtZVxuc2lua2VuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTG9iZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImxvYiI6CisgICAgSEVMUENIRUNLKCJsb2IiKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiV2VuIG9kZXIgd2FzIHdpbGxzdCBEdSBsb2Jlbj9cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICh3aG89PU1FKSAgeworICAgICAgb2Zvbz1jbG9uZV9vYmplY3QoIi9pdGVtcy9mdXJ6Iik7CisgICAgICBvZm9vLT5zZXRfZnVyemVyKHRoaXNfcGxheWVyKCkpOworICAgICAgb2Zvby0+c2V0X2VpZ2VubG9iKCk7CisgICAgICBvZm9vLT5tb3ZlKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgICAgIC8vREVCVUcgRnVyeiB6dW0gRWlnZW5sb2IgcGF0Y2hlbiA6PgorICAgICAgb3V0X3NlbD0iRHUgbG9ic3QgRGljaCBzZWxiZXJAQGFkdmVyYkBALiBEaWUgRm9sZ2VuIGtlbm5zdCBEdSBqYS4uLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgbG9idCBzaWNoIHNlbGJlckBAYWR2ZXJiQEAsIG1pdCBkZW4gYmVrYW5udGVuIEZvbGdlbi4iOworICAgIH0gZWxzZSBpZiAod2hvKSB7CisgICAgICBvdXRfc2VsPSJEdSBsb2JzdCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIGxvYnQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBsb2J0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgfSBlbHNlICB7CisgICAgICBvdXRfc2VsPSJEdSBsb2JzdCAiK3N0cisiLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgbG9idCAiK3N0cisiLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIE1vcHBlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgIm1vcHBlciI6CisgICAgSEVMUENIRUNLKCJtb3BwZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIk1vcHBlcmUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgbW9wcGVyc3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIG1vcHBlcnRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogTXVzdGVybiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibXVzdGVyIjoKKyAgICBIRUxQQ0hFQ0soIm11c3RlciIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJNdXN0ZXJlIHdlbj9cbiIpOworICAgIG91dF9zZWw9IkR1IG11c3RlcnN0IEBAd2VuQEBAQGFkdmVyYkBALiI7CisgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIG11c3RlcnQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgbXVzdGVydCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIE5pY2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAiamEiOgorICAgIGNhc2UgIm5pY2siOgorICAgIEhFTFBDSEVDSygibmljayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChmb3JfYWxsKSAgeworICAgICAgb3V0X3NlbD0iRHUgbmlja3N0IEBAYWxsZUBAQEBhZHZlcmJAQCB6dS4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIG5pY2t0IEBAYWxsZUBAQEBhZHZlcmJAQCB6dS4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgfQorICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJOaWNrZSB3aWUgb2RlciB3ZW0genUgb2RlciB3ZW0gd2llIHp1P1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUgd2lsbHN0IERpciBzZWxiZXIgenVuaWNrZW4/IExpZWJlciBuaWNodCwgZGFzIHNpZWh0IHNvIGFsYmVybiBhdXMuIiwKKyAgICAgICJIbS4gTml4IHBhc3NpZXJ0LiBWb24gTGViZXdlc2VuIGJla29tbXQgbWFuIG1laXN0ZW5zIG1laHIgRmVlZGJhY2suIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IG5pY2tzdEBAIHdlbUBAQEBhZHZlcmJAQCIKKyAgICAgICsod2hvID8gIiB6dS4iIDogKGFkdmVyYiA/ICIuIiA6ICIgenVzdGltbWVuZC4iKSk7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIG5pY2t0IERpckBAYWR2ZXJiQEAgenUuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgbmlja3RAQCB3ZW1AQEBAYWR2ZXJiQEAiCisgICAgICArKHdobyA/ICIgenUuIiA6IChhZHZlcmIgPyAiLiIgOiAiIHp1c3RpbW1lbmQuIikpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIE5pZXNlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAibmllcyI6CisgICAgSEVMUENIRUNLKCJuaWVzIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkR1IGhhc3Qga2VpbmUgTmFzZSBtZWhyLCBpbiBkZXIgZXMgRGljaCBqdWNrZW4ga29lbm50ZS4uLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJOaWVzZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJIYWFhYWFhLXRzY2hpISBHZXN1bmRoZWl0ISIrKGFkdmVyYiA/ICIgRHUgbmllc3RAQGFkdmVyYkBALiIgOiAiIik7CisgICAgb3V0X290aD0iSGFhYWFhYS10c2NoaSEgQEBuYW1lQEAgbmllc3RAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogT2hyZmVpZ2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJnaWIiOgorICAgIEhFTFBDSEVDSygiZ2liIik7CisgICAgaWYgKCFzdHIpCisgICAgICBSZXR1cm4oIkdpYiB3ZW0gd2FzP1xuIik7CisgICAgaWYgKHNzY2FuZiggc3RyLCIlcyBvaHJmZWlnZSIsc3RyMSk9PTApCisgICAgICByZXR1cm4gMDsKKyAgICBQYXJzZVJlc3Qoc3RyLCAoeyJvaHJmZWlnZSIsICJlaW5lIG9ocmZlaWdlIn0pKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHZlcnBhc3N0IEBAYWxsZUBAQEBhZHZlcmJAQCBlaW5lIE9ocmZlaWdlLiI7CisgICAgICBvdXRfdmljPSJAQG5hbWVAQCB2ZXJwYXNzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgZWluZSBPaHJmZWlnZS4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTSk7CisgICAgfQorICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJHaWIgd2VtIGVpbmUgT2hyZmVpZ2U/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhenUgc2luZCBEaXIgRGVpbmUgQmFja2VuIGRvY2ggenUgc2NoYWRlLiIsCisgICAgICAiRHUgd2lyc3QgZG9jaCBuaWNodHMgc2NobGFnZW4sIHdhcyBzaWNoIG5pY2h0IHdlaHJlbiBrYW5uPyIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBHSE9TVENIRUNLKCJEZWluZSBIYW5kIHNhdXN0IG1pdCB2b2xsZXIgV3VjaHQgZHVyY2ggZGVpbiBPcGZlciBkdXJjaCEiLAorICAgICAgZ25hbWUoKSsiIHdpbGwgIit3aG8tPm5hbWUoV0VNKSsiIGVpbmUgT2hyZmVpZ2UgZ2ViZW4gLSBhYmVyIGRpZSBIYW5kXG4iCisgICAgICAgICsic2F1c3QgbWl0IHZvbGxlciBXdWNodCBkdXJjaCBkYXMgT3BmZXIgZHVyY2ghIiwgMCk7CisgICAgb3V0X3NlbD0iRHUgdmVycGFzc3QgQEB3ZW1AQEBAYWR2ZXJiQEAgZWluZSBzY2hhbGxlbmRlIE9ocmZlaWdlLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdmVycGFzc3QgRGlyQEBhZHZlcmJAQCBlaW5lIFdhdHNjaGUsIGRhc3MgRGlyIEhvZXJlbiAiCisgICAgICArInVuZCBTZWhlbiB2ZXJnZWh0LiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgdmVycGFzc3QgQEB3ZW1AQEBAYWR2ZXJiQEAgZWluZSBzY2hhbGxlbmRlIE9ocmZlaWdlLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUGZlaWZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicGZlaWYiOgorICAgIEhFTFBDSEVDSygicGZlaWYiKTsKKyAgICBHSE9TVENIRUNLKCJFcyBrb21tdCBsZWlkZXIgbnVyIChuaWNodCBtYWwgaGVpc3NlKSBMdWZ0LCBhYmVyIGtlaW4gIgorICAgICAgICArIlBmaWZmLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzcGl0enQgZGVuIE11bmQgdW5kIHB1c3RldCBhbmdlc3RyZW5ndC4gTmljaHRzIHBhc3NpZXJ0LlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0ciwgIm5hY2giKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiUGZlaWZlIHdpZT8gUGZlaWZlIHdlbSBuYWNoPyBIYWVoP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiV2FzIHdpbGxzdCBEdSBkZW5uIGRhbWl0IGF1c2RydWVja2VuPyBEYXMgZ2lidCBmdWVyIG1pY2gga2VpbmVuIFNpbm4uIiwKKyAgICAgICJJY2ggaGFiZSBrZWluZSBMdXN0IGRhenUuIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHBmZWlmc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiCisgICAgICArKHdobyA/ICIgbmFjaC4iIDogKGFkdmVyYiA/ICIuIiA6ICIgYW5lcmtlbm5lbmQuIikpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIHBmZWlmdCBEaXJAQGFkdmVyYkBAIG5hY2guIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBwZmVpZnRAQCB3ZW5AQEBAYWR2ZXJiQEAiCisgICAgICArKHdobyA/ICIgbmFjaC4iIDogKGFkdmVyYiA/ICIuIiA6IiBhbmVya2VubmVuZC4iKSk7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUGhpbG9zb3BoaWVyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInBoaWxvc29waGllciI6CisgICAgSEVMUENIRUNLKCJwaGlsb3NvcGhpZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBvdXRfc2VsPSJEdSBwaGlsb3NvcGhpZXJzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOgorICAgICAgKHN0ciA/ICIgdWViZXIgIitzdHIrIi4iIDogIi4iKSk7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHBoaWxvc29waGllcnQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDoKKyAgICAgIChzdHIgPyAiIHVlYmVyICIrc3RyKyIuIiA6ICIuIikpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIChOYXNlKSBQdXR6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInB1dHoiOgorICAgIEhFTFBDSEVDSygicHV0eiIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJOaXggZGEgenVtIFB1dHplbiwgc28gbmVidWxvZXMsIHdpZSBEdSBiaXN0LlxuIik7CisgICAgUGFyc2VSZXN0KHN0ciwgKHsibmFzZSIsICJkaWUgbmFzZSJ9KSk7CisgICAgaWYgKHN0ciAmJiBzdHIhPSJuYXNlIiAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJQdXR6ZSBEZWluZSBOYXNlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHB1dHp0IERlaW5lIE5hc2VAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgcHV0enRAQGFkdmVyYkBAICIrUVBQKEZFTUFMRSxXRU4pKyIgTmFzZS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFF1YWtlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicXVhayI6CisgICAgSEVMUENIRUNLKCJxdWFrIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJRdWFrZSB3aWU/XG4iKTsKKyAgICBzZm9vPSIiOworICAgIGZsYWc9UXVlcnlQcm9wKFBfRlJPRykmJiFnaG9zdCgpOworICAgIGZvciAodF9nPTA7IHRfZzw9cmFuZG9tKGZsYWcgPyA0IDogMik7IHRfZysrKSAgeworICAgICAgc2Zvbys9KGZsYWcgPyAiIFF1IiA6ICIga3ciKTsKKyAgICAgIGZvciAodF9uPTA7IHRfbjw9cmFuZG9tKGZsYWcgPyAxMCA6IDUpOyB0X24rKykKKyAgICAgICAgc2Zvbys9ImFBIltyYW5kb20oMSkuLnJhbmRvbSgxKV07CisgICAgICBzZm9vKz0iayI7CisgICAgfQorICAgIGlmICghZmxhZykKKyAgICAgIHNmb289bG93ZXJfY2FzZShzZm9vKTsKKyAgICBlbHNlCisgICAgICBzZm9vKz0iISI7CisgICAgb3V0X3NlbD0iRHUgcXVha3N0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogKGZsYWcgPyAiIGF1cyB2b2xsZXIgS2VobGUiCisgICAgICA6ICIgaW4gZXR3YSB3aWUgZWluIEZyb3NjaCIpKSsiOiIrc2ZvbzsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgcXVha3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAoZmxhZyA/ICIgYXVzIHZvbGxlciBLZWhsZSIKKyAgICAgIDogIiBpbiBldHdhIHdpZSBlaW4gRnJvc2NoIikpKyI6IitzZm9vOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFF1aWV0c2NoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInF1aWV0c2NoIjoKKyAgICBjYXNlICJxdWllayI6CisgICAgSEVMUENIRUNLKCJxdWllayIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiUXVpZXRzY2hlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHF1aWV0c2Noc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2ZXJnbnVlZ3QuIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHF1aWV0c2NodCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHZlcmdudWVndC4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBSYWV1c3Blcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInJhZXVzcGVyIjoKKyAgICBIRUxQQ0hFQ0soInJhZXVzcGVyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJIbT8gV2llIG1laW5lbj9cbiIpOworICAgIG91dF9zZWw9IkR1IHJhZXVzcGVyc3QgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgcmFldXNwZXJ0IHNpY2hAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogUmVpYmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJyZWliIjoKKyAgICBIRUxQQ0hFQ0soInJlaWIiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRHUgaGFzdCBuaWNodHMgenVtIFJlaWJlbiwgYWJlciBhdWNoIGdhciBuaWNodHMuXG4iKTsKKyAgICBpZiAoc3RyICYmIChzc2NhbmYoc3RyLCIlcyBkaWUgQXVnZW4iLHNmb28pPT0xIHx8IHNzY2FuZihzdHIsIiVzIEF1Z2VuIixzZm9vKT09MSkpCisgICAgICBzdHI9c2ZvbzsKKyAgICBlbHNlIGlmIChzdHIgJiYgKHNzY2FuZihzdHIsIiVzIGRpZSBIYWVuZGUiLHNmb28pPT0xCisgICAgfHxzc2NhbmYoc3RyLCIlcyBIYWVuZGUiLHNmb28pPT0xKSkgIHsKKyAgICAgIGZsYWc9MjsKKyAgICAgIHN0cj1zZm9vOworICAgIH0KKyAgICBpZiAoc3RyPT0iIikgc3RyPTA7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJSZWliZSB3aWUgZGllICIrKGZsYWc9PTIgPyAiSGFlbmRlIiA6ICJBdWdlbiIpKyI/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSByZWlic3QgRGlyIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiCisgICAgICA6IChmbGFnPT0yID8gIiB2ZXJnbnVlZ3QiIDogIiBtdWVkZSIpKSsiIGRpZSAiCisgICAgICArKGZsYWc9PTIgPyAiSGFlbmRlLiIgOiAiQXVnZW4uIik7CisgICAgb3V0X290aD0iQEBuYW1lQEAgcmVpYnQgc2ljaCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIgorICAgICAgOiAoZmxhZz09MiA/ICIgdmVyZ251ZWd0IiA6ICIgbXVlZGUiKSkrIiBkaWUgIgorICAgICAgKyhmbGFnPT0yID8gIkhhZW5kZS4iIDogIkF1Z2VuLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFJvdGZsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicm90ZmwiOgorICAgIEhFTFBDSEVDSygicm90ZmwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlJvdGZsIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHJvdGZsc3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHJvdGZsdEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBSdWVscHNlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicnVlbHBzIjoKKyAgICBIRUxQQ0hFQ0soInJ1ZWxwcyIpOworICAgIEdIT1NUQ0hFQ0soIkVpbiBsZWljaHRlciBXaW5kaGF1Y2ggZW50ZmFlaHJ0IERlaW5lbSBNdW5kLCBtZWhyIG5pY2h0LlxuIiwKKyAgICAgICJEZW0gTXVuZCBkZXMgR2Vpc3RlcyB2b24gIitjYXBuYW1lKCkKKyAgICAgICAgKyIgZW50ZmFlaHJ0IGVpbiBsZWljaHRlcyBMdWVmdGNoZW4uXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkJPT09PRUVFUlJSUlBQISAgRW50c2NodWxkaWdlIGRpY2ggZ2VmYWVsbGlnc3QhIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHJ1ZWxwc3QgdW5hbnN0YWVuZGlnLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCFhZHZlcmIpICB7CisgICAgICAgIHdyaXRlKCJSdWVscHNlIHdpZSAoc2NobGltbSBnZW51ZywgZGFzcyBEdSBEaWNoIG5pY2h0IGJlaGVycnNjaGVuICIKKyAgICAgICAgICArImthbm5zdCEpP1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgb3V0X3NlbD0iRHUgcnVlbHBzdEBAYWR2ZXJiQEAuIFNjaGFlbSBEaWNoISI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBydWVscHN0QEBhZHZlcmJAQCB1bmQgd2lyZCBuaWNodCBtYWwgcm90IGRhYmVpLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKyAgfQorCisgIHN3aXRjaCAodmIpICB7CisgICAgLyoqKioqKioqKioqKioqKiogUnVuemVsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicnVuemVsIjoKKyAgICBjYXNlICJydW56bCI6CisgICAgSEVMUENIRUNLKCJydW56ZWwiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiREFTIGdlaHQgYWxzIEdlaXN0IG51biB3aXJrbGljaCBuaWNodC5cbiIpOworICAgIFBhcnNlUmVzdChzdHIsInN0aXJuIik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJSdW56bGUgZGllIFN0aXJuIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHJ1bnplbHN0QEBhZHZlcmJAQCBkaWUgU3Rpcm4uIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBydW56ZWx0QEBhZHZlcmJAQCBkaWUgU3Rpcm4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTYWJiZXJlICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzYWJiZXIiOgorICAgIEhFTFBDSEVDSygic2FiYmVyIik7CisgICAgc2Zvbz1naG9zdCgpID8gInNjaGxlaW0iIDogInNhYmJlciI7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiICYmICF3aG8pCisgICAgICBSZXR1cm4oIlNhYmJlciB3aWUgb2RlciB3ZW4gYW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSAiK3Nmb28rInN0QEAgd2VuQEBAQGFkdmVyYkBAICIKKyAgICAgICsod2hvID8gImFuLiIgOiAiYXVmIGRlbiBCb2Rlbi4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgIitzZm9vKyJ0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAICIrc2ZvbysidEBAIHdlbkBAQEBhZHZlcmJAQCAiCisgICAgICArKHdobyA/ICJhbi4iIDogImF1ZiBkZW4gQm9kZW4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NoYWVtZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaGFlbSI6CisgICAgSEVMUENIRUNLKCJzY2hhZW0iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIgJiYgbG93ZXJfY2FzZShzdHIpIT0iZGljaCIpCisgICAgICBSZXR1cm4oIlNjaGFlbWUgRGljaCB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2hhZW1zdCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2hhZW10IHNpY2hAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisjaWZkZWYgU0NIQVVfQU4KKyAgICAvKioqKioqKioqKioqKioqKiBTY2hhdSBhbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NoYXUiOgorICAgIEhFTFBDSEVDSygic2NoYXUiKTsKKyAgICBpZiAoIXN0ciB8fCBvbGRfZXhwbG9kZShzdHIsICIgIilbc2l6ZW9mKG9sZF9leHBsb2RlKHN0ciwgIiAiKSldIT0iYW4iKQorICAgICAgcmV0dXJuIDA7CisgICAgUGFyc2VSZXN0KHN0ciwgImFuIik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIlNjaGF1IHdlbiBhbj9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaGF1c3QgQEB3ZW5AQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgc2NoYXV0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaGF1dCBAQHdlbkBAQEBhZHZlcmJAQCBhbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKiogU2NobHVjaHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobHVjaHoiOgorICAgIEhFTFBDSEVDSygic2NobHVjaHoiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaGx1Y2h6ZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2hsdWNoenQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBoZXJ6emVycmVpc3NlbmQuIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaGx1Y2h6dCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgaGVyenplcnJlaXNzZW5kLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG1vbGxlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobW9sbCI6CisgICAgSEVMUENIRUNLKCJzY2htb2xsIik7CisgICAgR0hPU1RDSEVDSygiRHUgc2Nod2Vic3QgYmVsZWlkaWd0IGluIGRpZSBFY2tlLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzY2h3ZWJ0IGJlbGVpZGlndCBpbiBkaWUgRWNrZSB1bmQgc2NobW9sbHQuXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaG1vbGxlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaG1vbGxzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBnZWh0IGluIGRpZSBFY2tlIHVuZCBzY2htb2xsdEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2htdW56ZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2htdW56ZWwiOgorICAgIGNhc2UgInNjaG11bnpsIjoKKyAgICBIRUxQQ0hFQ0soInNjaG11bnplbCIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NobXVuemxlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaG11bnplbHN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2htdW56ZWx0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG5hbHplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobmFseiI6CisgICAgSEVMUENIRUNLKCJzY2huYWx6Iik7CisgICAgUGFyc2VSZXN0KHN0ciwgKHsienVuZ2UiLCJtaXQgenVuZ2UiLCAibWl0IGRlciB6dW5nZSJ9KSk7CisgICAgb3V0X3NlbD0iRHUgc2NobmFsenRAQGFkdmVyYkBAIG1pdCBkZXIgWnVuZ2UuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NobmFsenRAQGFkdmVyYkBAIG1pdCBkZXIgWnVuZ2UuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2huYXViZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaG5hdWIiOgorICAgIEhFTFBDSEVDSygic2NobmF1YiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NobmF1YmUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NobmF1YnN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgZW50cnVlc3RldC4iKTsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NobmF1YnQiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiBlbnRydWVzdGV0LiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG5hdWZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobmF1ZiI6CisgICAgSEVMUENIRUNLKCJzY2huYXVmIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2huYXVmZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2huYXVmc3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiB2b3IgQW5zdHJlbmd1bmcuIik7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHNjaG5hdWZ0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgdm9yIEFuc3RyZW5ndW5nLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG5pcHBlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobmlwcCI6CisgICAgY2FzZSAic2NobmlwcHMiOgorICAgIEhFTFBDSEVDSygic2NobmlwcCIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNjaGFmZnN0IGVzIG5pY2h0LCB3ZWlsIGRpZSBGaW5nZXIgZHVyY2hlaW5hbmRlciBkdXJjaCAiCisgICAgICAgICsiZ2VoZW4uXG4iLAorICAgICAgZ25hbWUoKSsiIHZlcnNhZ3QgYmVpbSBTY2huaXBwZW4gLSBkaWUgRmluZ2VyXG5nZWhlbiBkdXJjaGVpbmFuZGVyICIKKyAgICAgICAgKyJkdXJjaC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NobmlwcGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0iRHUgc2NobmlwcHN0QEBhZHZlcmJAQCBtaXQgZGVpbmVuIEZpbmdlcm4uIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzY2huaXBwdEBAYWR2ZXJiQEAgbWl0IGRlbiBGaW5nZXJuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobmFyY2hlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NobmFyY2giOgorICAgIEhFTFBDSEVDSygic2NobmFyY2giKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiSWNoIGdsYXViZSwgZGEgZmVobGVuIERpciBpcmdlbmR3aWUgZGllIHBoeXNpc2NoZW4gIgorICAgICAgICArIlZvcmF1c3NldHp1bmdlbiBkYXp1LlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2huYXJjaGUgd2llP1xuIik7CisgICAgb3V0X3NlbD0oc3RyID8gIlp6enp6enp6enp6Li4uIiA6ICJEdSBzY2huYXJjaHN0QEBhZHZlcmJAQC4iKTsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzY2huYXJjaHQgIisoc3RyID8gIkBAYWR2ZXJiQEAuIiA6ICJsYXV0LiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaG5pZWZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic25pZWYiOgorICAgIGNhc2UgInNjaG5pZWYiOgorICAgIEhFTFBDSEVDSygic2NobmllZiIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNjaG5pZWZzdCBnYW56IGxlaXNlLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzY2huaWVmdCBnYW56IGxlaXNlLlxuIiwgMCk7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTY2huaWVmZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzY2huaWVmc3RAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc2NobmllZnRAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2NobnVycmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2hudXJyIjoKKyAgICBIRUxQQ0hFQ0soInNjaG51cnIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIldpZSB3aWxsc3QgRHUgc2NobnVycmVuP1xuIik7CisgICAgb3V0X3NlbD0iTU1NTUlJSUlJQUFBQUFBVVVVVVVVVVUhIER1IHNjaG51cnJzdCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgenVmcmllZGVuLiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2hudXJydCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHp1ZnJpZWRlbi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTY2hyZWllbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2NocmVpIjoKKyAgICBIRUxQQ0hFQ0soInNjaHJlaSIpOworICAgIEdIT1NUQ0hFQ0soIkFBQUFJSUlJSUlJSUlJSUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFISBKYSwgbnVyIEdlaXN0ZXIgIgorICAgICAgICArImtvZW5uZW4gc28gc2NocmVpZW4hXG4iLAorICAgICAgZ25hbWUoKSsiIHNjaHJlaXQgLSBkYXMgQmx1dCBnZWZyaWVydCBmYXN0IGluIGRlaW5lbiBBZGVyIVxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJBVVVVQUFBSEhISEhIISEhISI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBzY2hyZWl0IGxhdXQhIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgUGFyc2VSZXN0KHN0cik7CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIlNjaHJlaWVuIC0gd2llIGRlbm4/IE9kZXIgd2VuIGRlbm4gYW5zY2hyZWllbj9cbiIpOworICAgICAgb3V0X3NlbD0iRHUgc2NocmVpc3RAQCB3ZW5AQEBAYWR2ZXJiQEAiKyh3aG8gPyAiIGFuIiA6ICIiKSsiLiI7CisgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBzY2hyZWl0IERpY2hAQGFkdmVyYkBAIGFuLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBzY2hyZWl0QEAgd2VuQEBAQGFkdmVyYkBAIisod2hvPyAiIGFuIiA6ICIiKSsiLiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaHVldHRlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNjaHVldHRlbCI6CisgICAgY2FzZSAic2NodWV0dGwiOgorICAgIEhFTFBDSEVDSygic2NodWV0dGVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBzY2h1ZXR0ZWxzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgZGllIEhhZW5kZS4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHNjaHVldHRlbHQgQEBhbGxlQEBAQGFkdmVyYkBAIGRpZSBIYWVuZGUuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgIH0KKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NodWV0dGxlIHdpZT8gU2NodWV0dGxlIHdlbSBkaWUgSGFuZD9cbiIpOworICAgIGlmKCF3aG8pIHsKKyAgICAgIG91dF9zZWw9IkR1IHNjaHVldHRlbHN0IERpY2hAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2NodWV0dGVsdCBzaWNoQEBhZHZlcmJAQC4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBpZiAoQ2hlY2tMaWZlKDAsTk9UX0RFQUQsCisgICAgICAgICIiLCAiTm9lLCBkYXMgbWFjaCBpY2ggbnVyIG1pdCBMZWJld2VzZW4uIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBpZiAod2hvID09IHRoaXNfcGxheWVyKCkpICB7CisgICAgICAgIG91dF9zZWw9IkR1IGhlYnN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0cml1bXBoaWVyZW5kIikKKyAgICAgICAgICArIiBEZWluZSBIYWVuZGUgdWViZXIgZGVuIEtvcGYgdW5kIHNjaHVldHRlbHN0IHNpZS4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgaGVidCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdHJpdW1waGllcmVuZCIpCisgICAgICAgICAgKyIgZGllIEhhZW5kZSB1ZWJlciBkZW4gS29wZlxudW5kIHNjaHVldHRlbHQgc2llLiI7CisgICAgICB9CisgICAgICBlbHNlICB7CisgICAgICAgIG91dF9zZWw9IkR1IHNjaHVldHRlbHN0QEAgd2VtQEBAQGFkdmVyYkBAIGRpZSBIYWVuZGUuIjsKKyAgICAgICAgaWYgKGdob3N0KCkpIG91dF9zZWwrPSJcbk5hamEsIER1IHZlcnN1Y2hzdCBlcyB3ZW5pZ3N0ZW5zIC0gIgorICAgICAgICAgICsiaW1tZXIgZGllc2UgZHVyY2hsYWVzc2lnZW4gSGFlbmRlLi4uIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHNjaHVldHRlbHQgRGlyQEBhZHZlcmJAQCBkaWUgSGFlbmRlLiI7CisgICAgICAgIGlmIChnaG9zdCgpKSBvdXRfdmljKz0iXG5OYWphLCBEdSB2ZXJzdWNoc3QgZXMgd2VuaWdzdGVucyAtICIKKyAgICAgICAgICArImltbWVyIGRpZXNlIGR1cmNobGFlc3NpZ2VuIEhhZW5kZS4uLiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzY2h1ZXR0ZWx0QEAgd2VtQEBAQGFkdmVyYkBAIGRpZSBIYWVuZGUuIjsKKyAgICAgICAgaWYgKGdob3N0KCkpIG91dF9vdGgrPSJcbk5hamEsIER1IHZlcnN1Y2hzdCBlcyB3ZW5pZ3N0ZW5zIC0gIgorICAgICAgICAgICsiaW1tZXIgZGllc2UgZHVyY2hsYWVzc2lnZW4gSGFlbmRlLi4uIjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2Nod2VpZ2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzY2h3ZWlnIjoKKyAgICBIRUxQQ0hFQ0soInNjaHdlaWciKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlNjaHdlaWdlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaHdlaWdzdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc2Nod2VpZ3RAQGFkdmVyYkBALiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU2V1ZnplbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic2V1ZnoiOgorICAgIEhFTFBDSEVDSygic2V1ZnoiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzZXVmenQgZ2Vpc3RlcmhhZnQuXG4iLAorICAgICAgZ25hbWUoKSsiIHNldWZ6dCBnZWlzdGVyaGFmdC4gTmFqYSwgd2llIGRlbm4gc29uc3Q/XG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIWFkdmVyYiAmJiBzdHIpCisgICAgICBSZXR1cm4oIlNldWZ6ZSB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzZXVmenN0QEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHNldWZ6dEBAYWR2ZXJiQEAuIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTaW5nZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNpbmciOgorICAgIEhFTFBDSEVDSygic2luZyIpOworICAgIGlmICghc3RyKSB7CisgICAgICBvdXRfc2VsPSJPaCBzb2xlIG1pbyEiOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHNpbmd0IGlyZ2VuZHdhcyBpdGFsaWVuaXNjaGVzLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgb3V0X3NlbD0iRHUgc2luZ3N0QEBhZHZlcmJAQCIrKGFkdmVyYiA/ICIuIiA6ICIgJyIrY2FwaXRhbGl6ZShzdHIpKyInLiIpOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHNpbmd0QEBhZHZlcmJAQCIrKGFkdmVyYiA/ICIuIiA6ICIgJyIKKyAgICAgICAgK2NhcGl0YWxpemUoc3RyKSsiJy4iKTsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU25pZmZlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic25pZmYiOgorICAgIEhFTFBDSEVDSygic25pZmYiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIgJiYgIXdobykKKyAgICAgIFJldHVybigiU25pZmZlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHNuaWZmc3QiKyh3aG8gPyAiIEBAd2VuQEAiIDogIiIpCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdHJhdXJpZyIpKyh3aG8gPyAiIGFuLiIgOiAiLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCBzbmlmZnQgRGljaCIKKyAgICAgICsoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB0cmF1cmlnIikrIiBhbi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzbmlmZnQiKyh3aG8gPyAiIEBAd2VuQEAiIDogIiIpCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdHJhdXJpZyIpKyh3aG8gPyAiIGFuLiIgOiAiLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNwdWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNwdWNrIjoKKyAgICBIRUxQQ0hFQ0soInNwdWNrIik7CisgICAgR0hPU1RDSEVDSygiRHUgYnJpbmdzdCBuaWNodCBnZW51ZyBTcHVja2UgenVzYW1tZW4uXG4iLAorICAgICAgZ25hbWUoKSsiIHN0ZWxsdCBnZXJhZGUgZmVzdCwgZGFzcyBtYW4gb2huZSBTcHVja2UgbmljaHRcbiIKKyAgICAgICAgKyJzcHVja2VuIGthbm4uXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU3B1Y2tlIHdlbiB3aWUgYW4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIkhhc3QgRHUgRGljaCBzbyBzY2hsZWNodCBiZW5vbW1lbj8gTGFzcyBlcyBsaWViZXIgYmxlaWJlbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgc3B1Y2tzdEBAIHdlbkBAQEBhZHZlcmJAQCAiKyh3aG8gPyAiYW4uIiA6ICJhdWYgZGVuIEJvZGVuLiIpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAbmFtZUBAIHNwdWNrdCBEaWNoQEBhZHZlcmJAQCBhbi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHNwdWNrdEBAIHdlbkBAQEBhZHZlcmJAQCAiCisgICAgICArKHdobyA/ICJhbi4iIDogImF1ZiBkZW4gQm9kZW4uIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3RhbXBmZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0YW1wZiI6CisgICAgSEVMUENIRUNLKCJzdGFtcGYiKTsKKyAgICBQYXJzZVJlc3Qoc3RyLCAiYXVmIik7CisgICAgb3V0X3NlbD0iRHUgc3RhbXBmc3RAQGFkdmVyYkBAIG1pdCBkZW0gRnVzcyBhdWYuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3RhbXBmdEBAYWR2ZXJiQEAgbWl0IGRlbSBGdXNzIGF1Zi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0YXJyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0YXJyIjoKKyAgICBIRUxQQ0hFQ0soInN0YXJyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlN0YXJyZSB3aWUgYnp3LiB3ZW4gYW4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIldpZSB3aWxsc3QgRHUgaW4gRGVpbmUgZWlnZW5lbiBBdWdlbiBzdGFycmVuPyAiCisgICAgICAgICsiKFNwaWVnZWwgZ2VsdGVuIG5pY2h0Li4uKSIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBzdGFycnN0IisoIXN0ciA/ICIgaW5zIExlZXJlLiIgOiAod2hvID8gIkBAIHdlbkBAIiA6ICIiKQorICAgICAgKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHZlcnRyYWV1bXQiKSsod2hvID8gIiBhbi4iIDogIi4iKSk7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHN0YXJydCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdGllZiIpCisgICAgICArIiBpbiBEZWluZSBBdWdlbi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdGFycnQiKyghc3RyID8gIiBpbnMgTGVlcmUuIiA6ICh3aG8gPyAiQEAgd2VuQEAiIDogIiIpCisgICAgICArKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgdmVydHJhZXVtdCIpKyh3aG8gPyAiIGFuLiIgOiAiLiIpKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTdGF1bmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzdGF1biI6CisgICAgSEVMUENIRUNLKCJzdGF1biIpOworICAgIGlmICghc3RyKSAgeworICAgICAgb3V0X3NlbD0iRHUgYmlzdCBlcnN0YXVudC4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIGlzdCBlcnN0YXVudC4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBQYXJzZVJlc3Qoc3RyLCAidWViZXIiKTsKKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiQmxhIGJsYS4gV2VubiBEdSBuYWNoIHN0YXVuZSBub2NoIHdhcyB0aXBwc3QsIHNvbGx0ZSAiCisgICAgICAgICAgKyJkYXMgZWluXG5MZWJld2VzZW4gc2Vpbi5cbiIpOworICAgICAgaWYgKHdobyA9PSB0aGlzX3BsYXllcigpKSAgeworICAgICAgICBvdXRfc2VsPSJEdSBzdGF1bnN0QEBhZHZlcmJAQCB1ZWJlciBEaWNoIHNlbGJlci4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3RhdW50QEBhZHZlcmJAQCB1ZWJlciBzaWNoIHNlbGJlci4iOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBvdXRfc2VsPSJEdSBzdGF1bnN0QEBhZHZlcmJAQCIrKHdobyA/ICIgdWViZXIgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICAgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHN0YXVudEBAYWR2ZXJiQEAgdWViZXIgRGljaC4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3RhdW50QEBhZHZlcmJAQCIrKHdobyA/ICIgdWViZXIgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogU3RpZXJlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAic3RpZXIiOgorICAgIEhFTFBDSEVDSygic3RpZXIiKTsKKyAgICBHSE9TVENIRUNLKCJEdSBzdGllcnN0IG1pdCBob2hsZW0gQmxpY2sgaW4gZGllIEdlZ2VuZC5cbiIsCisgICAgICBnbmFtZSgpKyIgc3RpZXJ0IG1pdCBob2hsZW0gQmxpY2sgaW4gZGllIEdlZ2VuZC5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIXdobyAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJTdGllcmUgd2llIG9kZXIgd2VuIGFuP1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUga2FubnN0IERpY2ggbmljaHQgc2VsYmVyIGFuc3RpZXJlbi4iLAorICAgICAgIkJpdHRlIG51ciBMZWJld2VzZW4gYW5zdGllcmVuLiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBvdXRfc2VsPSJEdSBzdGllcnN0QEAgd2VuQEBAQGFkdmVyYkBAIgorICAgICAgKyh3aG8gPyAiIGFuLiIgOiAiIGluIGRlciBHZWdlbmQgaGVydW0uIik7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHN0aWVydCBEaWNoQEBhZHZlcmJAQCBhbi4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBzdGllcnRAQCB3ZW5AQEBAYWR2ZXJiQEAiCisgICAgICArKHdobyA/ICIgYW4uIiA6ICIgaW4gZGVyIEdlZ2VuZCBoZXJ1bS4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTdGltbWUgenUgKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0aW1tIjoKKyAgICBIRUxQQ0hFQ0soInN0aW1tIik7CisgICAgUGFyc2VSZXN0KHN0ciwgInp1Iik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlN0aW1tZSB3ZW0genU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzdGltbXN0QEAgd2VtQEBAQGFkdmVyYkBAIHp1LiI7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBnbmFtZUBAIHN0aW1tdCBEaXJAQGFkdmVyYkBAIHp1LiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHN0aW1tdEBAIHdlbUBAQEBhZHZlcmJAQCB6dS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0b2VobmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzdG9laG4iOgorICAgIEhFTFBDSEVDSygic3RvZWhuIik7CisgICAgR0hPU1RDSEVDSygiRHUgc3RvZWhuc3Qgc2NoYXVkZXJsaWNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiBzdG9laG50IHNjaGF1ZGVybGljaC4gWnVtIEdsdWVja1xuaGFzdCBEdSB6aWVtbGljaCAiCisgICAgICAgICsiZ3V0ZSBOZXJ2ZW4uXG4iLCAwKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIWFkdmVyYiAmJiBzdHIpCisgICAgICBSZXR1cm4oIldpZSB3aWxsc3QgRHUgc3RvZWhuZW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzdG9laG5zdEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzdG9laG50QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0b3NzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0b3NzIjoKKyAgICBIRUxQQ0hFQ0soInN0b3NzIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIlN0b3NzZSB3ZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIldhcyBzb2xsIGRlciBVbnNpbm4/IExhc3MgZGFzISIsCisgICAgICAiRGFzIGdpYnQgbnVyIGJlaSBMZWJld2VzZW4gU2lubi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgR0hPU1RDSEVDSygiRGVpbiBFbGxlbmJvZ2VuIHZlcnNpbmt0IGluICIrd2hvLT5uYW1lKFdFTSkrIi5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCAiK3doby0+bmFtZShXRU0pKyIgaW4gZGllIFJpcHBlbiBzdG9zc2VuLCBhYmVyICIKKyAgICAgICAgK1FQUChNQUxFLFdFUixQTFVSQUwpKyJcbkVsbGVuYm9nZW4gdmVydGVpbGVuIGtlaW5lbiBTdG9zcywgIgorICAgICAgICArInNvbmRlcm4gdmVyc2lua2VuLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIERpY2ggaW4gZGllIFJpcHBlbiBzdG9zc2VuLCBhYmVyICIrUVBQKE1BTEUsV0VSLFBMVVJBTCkKKyAgICAgICAgKyIgRWxsZW5ib2dlbiB2ZXJzaW5rZW4uXG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzdG9lc3N0QEAgd2VuQEBAQGFkdmVyYkBAIGluIGRpZSBSaXBwZW4uIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBzdG9lc3N0IERpckBAYWR2ZXJiQEAgaW4gZGllIFJpcHBlbi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHN0b2Vzc3RAQCB3ZW5AQEBAYWR2ZXJiQEAgaW4gZGllIFJpcHBlbi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0cmVpY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0cmVpY2hlbCI6CisgICAgY2FzZSAic3RyZWljaGwiOgorICAgIEhFTFBDSEVDSygic3RyZWljaGVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIlN0cmVpY2hsZSB3ZW4/XG4iKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHN0cmVpY2hlbHN0IEBAYWxsZUBAQEBhZHZlcmJAQC4iOworICAgICAgb3V0X3ZpYz0iQEBnbmFtZUBAIHN0cmVpY2hlbHQgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJMYXNzIERpY2ggdm9uIGFuZGVyZW4gc3RyZWljaGVsbi4iLAorICAgICAgIkljaCBzdHJlaWNobGUgbnVyIExlYmV3ZXNlbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgR0hPU1RDSEVDSygiRHUgd2lsbHN0ICIrd2hvLT5uYW1lKFdFTiwyKSsiIHN0cmVpY2hlbG4sIGFiZXIgRGVpbmUgIgorICAgICAgKyJIYWVuZGUga29lbm5lblxubmljaHRzIGJlcnVlaHJlbi5cbiIsCisgICAgZ25hbWUoKSsiIHdpbGwgIit3aG8tPm5hbWUoV0VOLDIpKyIgc3RyZWljaGVsbiwgYWJlciBkaWVzZVxuIgorICAgICAgKyJHZWlzdGVyaGFlbmRlIGtvZW5uZW4gaGFsdCBuaXggYmVydWVocmVuLi4uXG4iLAorICAgIGduYW1lKCkrIiB3aWxsIERpY2ggc3RyZWljaGVsbiwgc2NoZWl0ZXJ0IGFiZXIgd2llIHNvIG9mdCBhblxuIgorICAgICAgKyJkaWVzZW4gZHVtbWVuIGR1cmNobGFlc3NpZ2VuIEdlaXN0ZXJoYWVuZGVuLlxuIik7CisgICAgb3V0X3NlbD0iRHUgc3RyZWljaGVsc3QgQEB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBzdHJlaWNoZWx0IERpY2hAQGFkdmVyYkBALiI7CisgICAgb3V0X290aD0iQEBuYW1lQEAgc3RyZWljaGVsdCBAQHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFN0dXBzZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0dXBzIjoKKyAgICBIRUxQQ0hFQ0soInN0dXBzIik7CisgICAgaWYgKGdob3N0KCkpCisgICAgICBSZXR1cm4oIkRhcyBnZWh0IG5pY2h0IG9obmUgRWxsZW5ib2dlbiwuLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIlN0dXBzZSB3ZW4gYW4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSBzdHVwc3QgQEB3ZW5AQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCBzdHVwc3QgRGljaEBAYWR2ZXJiQEAgYW4uIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzdHVwc3QgQEB3ZW5AQEBAYWR2ZXJiQEAgYW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBTdHV0emVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJzdHV0eiI6CisgICAgSEVMUENIRUNLKCJzdHV0eiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU3R1dHplIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHN0dXR6dEBAYWR2ZXJiQEAuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3R1dHp0QEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFRhZXRzY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInRhZXRzY2hlbCI6CisgICAgY2FzZSAidGFldHNjaGwiOgorICAgIEhFTFBDSEVDSygidGFldHNjaGVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIlRhZXRzY2hsZSB3ZW4/XG4iKTsKKyAgICBpZiAoQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgIkRhcyBzaWVodCB6dSBkb29mIGF1cywgZGFzIG1hY2hlIGljaCBuaWNodC4iLAorICAgICAgIkljaCB0YWV0c2NobGUgbnVyIExlYmV3ZXNlbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgIEdIT1NUQ0hFQ0soIkR1IHdpbGxzdCAiK3doby0+bmFtZShXRU4pKyIgdGFldHNjaGVsbiAtIGFiZXIgRGVpbmUgIgorICAgICAgICArIkhhZW5kZSBnZWhlblxuZ2xhdHQgZHVyY2ggZGVuIEtvcGYgZHVyY2guXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgIit3aG8tPm5hbWUoV0VOKSsiIGRlbiBLb3BmIHRhZXRzY2hlbG4sIGFiZXIgIgorICAgICAgICArImRpZSBHZWlzdGVyLVxuaGFlbmRlIGdlaGVuIGdsYXR0IGR1cmNoIGRlbiBLb3BmIGR1cmNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsIERlaW5lbiBLb3BmIHRhZXRzY2hlbG4sIGFiZXIgZGllc2UgR2Vpc3RlcmhhZW5kZSAiCisgICAgICAgICsiZ2VoZW5cbmdsYXR0IGR1cmNoIERlaW5lbiBLb3BmIGR1cmNoIC0gRHUgaGFzdCBlaW4gc2VsdHNhbWVzICIKKyAgICAgICAgKyJHZWZ1ZWhsIGRhYmVpLlxuIik7CisgICAgb3V0X3NlbD0iRHUgdGFldHNjaGVsc3QgQEB3ZW1AQEBAYWR2ZXJiQEAgZGVuIEtvcGYuIjsKKyAgICBvdXRfdmljPSJAQG5hbWVAQCB0YWV0c2NoZWx0IERpckBAYWR2ZXJiQEAgZGVuIEtvcGYuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCB0YWV0c2NoZWx0IEBAd2VtQEBAQGFkdmVyYkBAIGRlbiBLb3BmLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVGFuemVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ0YW56IjoKKyAgICBIRUxQQ0hFQ0soInRhbnoiKTsKKyAgICBHSE9TVENIRUNLKCJEdSB0YW56dCBkZW4ga2xhc3Npc2NoZW4gR2Vpc3RlclRhbnogKHRtKS5cbiIsCisgICAgICBnbmFtZSgpKyIgdGFuenQgZGVuIGtsYXNzaXNjaGVuIEdlaXN0ZXJUYW56ICh0bSkuXG4iLCAwKTsKKyAgICBpZiAoIXN0cikgeworICAgICAgb3V0X3NlbD0iS29tbXN0IER1IERpciBuaWNodCBpcmdlbmR3aWUgYmxvZWQgdm9yPyBEdSB0YW56dCAiCisgICAgICAgICsiZGVuIEVudGVudGFuei4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgdGFuenQgZGVuIEVudGVudGFuei4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICB0YWVuemU9KHsiV2FsemVyIiwiUG9sa2EiLCJSdW1iYSIsIlRhbmdvIiwiQ2hhIGNoYSBjaGEiLCJGb3h0cm90dCIsCisgICAgICAgICJNYW1ibyIsIlNhbHNhIiwiU2xvd2ZveCIsIkJyZWFrZGFuY2UiLCJQb2dvIiwiTWVyZW5ndWUiLAorICAgICAgICAiUm9jayduJ1JvbGwiLCJCYWxsZXR0IiwiUmVnZW50YW56IiwiSGV4ZW50YW56In0pOworICAgICAgUGFyc2VSZXN0KHN0ciwibWl0Iik7CisgICAgICBpZiAoIXdobykKKyAgICAgICAgUmV0dXJuKCJNaXQgd2VtIHdpbGxzdCBEdSB0YW56ZW4/XG4iKTsKKyAgICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgICAiTWl0IERpciBzZWxiZXIga2FubnN0IER1IG5pY2h0IHRhbnplbi4iLAorICAgICAgICAiS2VpbmUgUmVha3Rpb24gLSB3aWxsIHdhaHJzY2hlaW5saWNoIG5pY2h0IHRhbnplbi4iKSkKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIGlmb289cmFuZG9tKHNpemVvZih0YWVuemUpKTsKKyAgICAgIG91dF9zZWw9IkR1IHRhbnp0QEBhZHZlcmJAQCBtaXQgQEB3ZW1AQCBlaW5lIFJ1bmRlICIrdGFlbnplW2lmb29dKyIuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHJlaXNzdCBEaWNoIGFuIHNpY2ggdW5kIHRhbnp0QEBhZHZlcmJAQCBlaW5lIFJ1bmRlICIKKyAgICAgICAgK3RhZW56ZVtpZm9vXSsiIG1pdCBEaXIuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaG5hcHB0IHNpY2ggQEB3ZW5AQCB1bmQgZGllIGJlaWRlbiB0YW56ZW4iCisgICAgICAgICsiQEBhZHZlcmJAQCBlaW5lIFJ1bmRlICIrdGFlbnplW2lmb29dKyIuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVHJhZXVtZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInRyYWV1bSI6CisgICAgSEVMUENIRUNLKCJ0cmFldW0iKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiVHJhZXVtZSB3b3ZvbiBvZGVyIHZvbiB3ZW0/XG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBvdXRfc2VsPSJEdSB0cmFldW1zdCIrKHdobyA/ICJAQGFkdmVyYkBAIHZvbiBAQHdlbUBALiIKKyAgICAgIDogKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiICIrc3RyKyIuIikpOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB0cmFldW10QEBhZHZlcmJAQCB2b24gRGlyLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHRyYWV1bXQiKyh3aG8gPyAiQEBhZHZlcmJAQCB2b24gQEB3ZW1AQC4iCisgICAgICA6IChhZHZlcmIgPyAiQEBhZHZlcmJAQC4iIDogIiAiK3N0cisiLiIpKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBUcmV0ZW4gKHRyaXR0KSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAidHJpdHQiOgorICAgIGNhc2UgInRyZXQiOgorICAgIEhFTFBDSEVDSygidHJpdHQiKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIEdIT1NUQ0hFQ0soIkRlaW4gRnVzcyBmYWVocnQgZHVyY2ggZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSAiCisgICAgICAgICAgKyJ1bnNpY2h0YmFyZSBTY2hpbGRrcm9ldGVcbmhpbmR1cmNoLlxuIiwKKyAgICAgICAgZ25hbWUoKSsiIHdpbGwgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZVxuIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlIHRyZXRlbiwgYWJlciAiK1FQUChNQUxFLFdFUikKKyAgICAgICAgICArIiBGdXNzIGZhZWhydCBkdXJjaCBzaWUgaGluZHVyY2guXG4iLCAwKTsKKyAgICAgIG91dF9zZWw9IkR1IHRyaXR0c3QgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZSAiCisgICAgICAgICsiU2NoaWxka3JvZXRlLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdHJpdHQgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZSAiCisgICAgICAgICsiU2NoaWxka3JvZXRlLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICAgIG91dF9zZWw9IkR1IHRyaXR0c3QgQEBhbGxlQEBAQGFkdmVyYkBALiBTb2xsdGVzdCBEdSBuaWNodCBsYW5nc2FtICIKKyAgICAgICAgICArImFuIEZsdWNodCBkZW5rZW4/IjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdHJpdHQgQEBhbGxlQEBAQGFkdmVyYkBALiBUcmF1dCBzaWNoIGdhbnogIgorICAgICAgICAgICsic2Nob2VuIHdhcyEiOworICAgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICAgIH0KKyAgICAgIGlmICghd2hvICYmICFhZHZlcmIpCisgICAgICAgIFJldHVybigiV2VubiBEdSBzY2hvbiB3YXMgbmFjaCB0cml0dCB0aXBwc3QsIGRhbm4gc2FnIG1pciwgd2VuICIKKyAgICAgICAgICArIm9kZXIgd2llIGljaCBkYXMgc29sbC5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJEdSBzY2hhZmZzdCBlcyBuaWNodCwgRGlyIHNlbGJlciBpbiBkZW4gSGludGVybiB6dSB0cmV0ZW4uIiwKKyAgICAgICAgIlRvdGUgU2FjaGVuIHRyaXR0IG1hbiBuaWNodCBhdWNoIG5vY2ghIikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBpZiAod2hvKSAgeworICAgICAgICBvdXRfc2VsPSJEdSB0cml0dHN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB0cml0dCBEaWNoQEBhZHZlcmJAQC4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdHJpdHRAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdHJpdHRzdCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgICArIlNjaGlsZGtyb2V0ZUBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHRyaXR0IGRpZSBiZXJ1ZWhtdGUgbGFuZ3Zlcmdlc3NlbmUgdW5zaWNodGJhcmUgIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlXG5AQGFkdmVyYkBALiI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFRyb2VzdGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ0cm9lc3QiOgorICAgIEhFTFBDSEVDSygidHJvZXN0Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgdHJvZXN0ZW4/XG4iKTsKKyAgICBpZiAod2hvICYmIENoZWNrTGlmZShOT1RfU0VMRixOT1RfREVBRCwKKyAgICAgICJUcm9zdCBtdXNzdCBEdSBiZWkgamVtYW5kIGFuZGVycyBzdWNoZW4uIiwKKyAgICAgICJEYXMgVGVpbCBtdXNzdCBEdSBuaWNodCB0cm9lc3RlbiwgZGFzIGZ1ZWhsdCBuaXguIikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHRyb2VzdGVzdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIG91dF92aWM9IkBAZ25hbWVAQCB0cm9lc3RldCBEaWNoQEBhZHZlcmJAQC4iOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCB0cm9lc3RldEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFVtYXJtZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInVtYXJtIjoKKyAgICBIRUxQQ0hFQ0soInVtYXJtIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgdW1hcm1lbj9cbiIpOworICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKDAsTk9UX0RFQUQsMCwiQml0dGUgdW1hcm1lIG51ciBMZWJld2VzZW4uIikpCisgICAgICByZXR1cm4gMTsKKyAgICBpZiAoZ2hvc3QoKSAmJiBDaGVja0xpZmUoTk9UX1NFTEYsMCwKKyAgICAgICJEdSBrYW5uc3QgRGljaCBhbHMgR2Vpc3QgbmljaHQgc2VsYmVyIHdhZXJtZW4uIikpCisgICAgICAgIHJldHVybiAxOworICAgIHN0cjE9d2hvLT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgICBpZihwb2ludGVycChzdHIxKSlzdHIxPShzdHJpbmcpc3RyMVswXTsgLy8gUnVtYXRhCisgICAgc3RyMj13aG8tPlF1ZXJ5UHJvbm91bihXRU4pOworICAgIEdIT1NUQ0hFQ0soIkR1IHdpbGxzdCAiK3N0cjErIiB1bWFybWVuLCBhYmVyIERlaW5lIEFybWUgZ2VoZW4gZHVyY2ggIgorICAgICAgICArc3RyMisiIGR1cmNoLlxuIiwKKyAgICAgIGduYW1lKCkrIiB3aWxsICIrc3RyMSsiIHVtYXJtZW4sIGFiZXIgIitRUFAoTUFMRSxXRVIsUExVUkFMKQorICAgICAgICArIiBBcm1lIGdlaGVuXG5kdXJjaCAiK3N0cjIrIiBoaW5kdXJjaC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCBEaWNoIHVtYXJtZW4sIGFiZXIgIitRUFAoTUFMRSxXRVIsUExVUkFMKQorICAgICAgICArIiBBcm1lIGdlaGVuIGR1cmNoIERpY2ggaGluZHVyY2guXG4iKTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IHVtYXJtc3QgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICBvdXRfdmljPSJAQG5hbWVAQCB1bWFybXQgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKHdobz09dGhpc19wbGF5ZXIoKSkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGxlZ3N0IERlaW5lIEFybWUgdW0gRGljaCB1bmQgd2Flcm1zdCBEaWNoICIKKyAgICAgICAgKyJlaW4gYmlzc2NoZW4gc2VsYmVyLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCBsZWd0ICIrUVBQKE1BTEUsV0VSLFBMVVJBTCkKKyAgICAgICAgKyIgQXJtZSB1bSBzaWNoIHVuZCB3YWVybXQgc2ljaCBlaW4gYmlzc2NoZW4gc2VsYmVyLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIG91dF9zZWw9IkR1IHVtYXJtc3RAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHVtYXJtdCBEaWNoQEBhZHZlcmJAQC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgdW1hcm10QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFZlcmZsdWNoZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInZlcmZsdWNoIjoKKyAgICBIRUxQQ0hFQ0soInZlcmZsdWNoIik7CisgICAgaWYgKCFzdHIpCisgICAgICBSZXR1cm4oIldlbiBvZGVyIHdhcyB3aWxsc3QgRHUgZGVubiB2ZXJmbHVjaGVuP1xuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pICB7CisgICAgICBvdXRfc2VsPSJEdSB2ZXJmbHVjaHN0ICIrc3RyKyIuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB2ZXJmbHVjaHQgIitzdHIrIi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBpZiAod2hvPT10aGlzX3BsYXllcigpKQorICAgICAgICBSZXR1cm4oIlNpY2ggc2VsYmVyIHZlcmZsdWNodCBtYW4gYmVzc2VyIG5pY2h0Li4uXG4iKTsKKyAgICAgIGlmICghYWR2ZXJiKSAgeworICAgICAgICBmbGFnPXNzY2FuZihzdHIsICIlcyAlcyIsIHN0cjEsc3RyMik7CisgICAgICAgIG91dF9zZWw9IkR1IHZlcmZsdWNoc3RAQCB3ZW5AQCIrKGZsYWc9PTIgPyAiICIrc3RyMiA6ICIiKSsiLiI7CisgICAgICAgIG91dF92aWM9IkBAZ25hbWVAQCB2ZXJmbHVjaHQgRGljaCIrKGZsYWc9PTI/IiAiK3N0cjIgOiAiIikrIi4iOworICAgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgdmVyZmx1Y2h0QEAgd2VuQEAiKyhmbGFnPT0yID8gIiAiK3N0cjIgOiAiIikrIi4iOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBvdXRfc2VsPSJEdSB2ZXJmbHVjaHN0QEAgd2VuQEBAQGFkdmVyYkBALiI7CisgICAgICAgIG91dF92aWM9IkBAZ25hbWVAQCB2ZXJmbHVjaHQgRGljaEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHZlcmZsdWNodEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBWZXJuZWlnZW4gLyBWZXJiZXVnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInZlcm5laWciOgorICAgIGNhc2UgInZlcmJldWciOgorICAgIEhFTFBDSEVDSygidmVybmVpZyIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHZlcm5laWdzdCBEaWNoIGVpbiBiaXNzY2hlbiBoZWZ0aWcgLSBEZWluIEtvcGYgdGF1Y2h0ICIKKyAgICAgICAgKyJrdXJ6IGluIGRlbiBCb2Rlbi5cbiIsCisgICAgICBnbmFtZSgpKyIgdmVybmVpZ3Qgc2ljaC4gRWluIGJpc3NjaGVuIGhlZnRpZyAtICIrUVBQKE1BTEUsV0VSKQorICAgICAgICArIiBLb3BmXG50YXVjaHQga3VyeiBpbiBkZW4gQm9kZW4gZWluLlxuIiwgMCk7CisgICAgaWYgKCghc3RyKSB8fCAoc3RyID09ICJkaWNoIikpIHsKKyAgICAgIG91dF9zZWw9IkR1IHZlcm5laWdzdCBEaWNoIHZvciBkZW4gQW53ZXNlbmRlbi4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgdmVybmVpZ3Qgc2ljaCBhbm11dGlnLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICAgIG91dF9zZWw9IkR1IHZlcm5laWdzdCBEaWNoQEBhZHZlcmJAQCB2b3IgQEBhbGxlQEAuIjsKKyAgICAgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdmVybmVpZ3Qgc2ljaEBAYWR2ZXJiQEAgdm9yIEBAYWxsZUBALiI7CisgICAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgICAgfQorICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJWZXJuZWlnZSBkaWNoIGlyZ2VuZHdpZSBvZGVyIHZvciBqZW1hbmRlbS5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJXaWUgd2lsbHN0IER1IGRhcyBkZW5uIHNjaGFmZmVuPyIsCisgICAgICAgICJWb3IgU2FjaGVuIHdpcmQgaGllciBuaWNodCB2ZXJuZWlndCwga2xhcj9cbiIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgb3V0X3NlbD0iRHUgdmVybmVpZ3N0IERpY2hAQGFkdmVyYkBAIisod2hvID8gIiB2b3IiIDogIiIpKyJAQCB3ZW1AQC4iOworICAgICAgaWYgKHdobyApIG91dF92aWM9IkBAbmFtZUBAIHZlcm5laWd0IHNpY2hAQGFkdmVyYkBAIHZvciBEaXIuIjsKKyAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHZlcm5laWd0IHNpY2hAQGFkdmVyYkBAIisod2hvID8gIiB2b3IiIDogIiIpCisgICAgICAgICsiQEAgd2VtQEAuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVmVybmVpbmVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJuZWluIjoKKyAgICBjYXNlICJub2UiOgorICAgIEhFTFBDSEVDSygibmVpbiIpOworICAgIEdIT1NUQ0hFQ0soIkR1IHNjaHVldHRlbHN0IERlaW5lbiBLb3BmIHNvIGhlZnRpZywgZGFzcyBlciBrdXJ6ICIKKyAgICAgICAgKyJkYXZvbnNjaHdlYnQuXG4iLAorICAgICAgZ25hbWUoKSsiIHNjaHVldHRlbHQgaGVmdGlnIGRlbiBLb3BmLlxuU28gaGVmdGlnLCBkYXNzIGRpZXNlciAiCisgICAgICAgICsia3VyeiBkYXZvbnNjaHdlYnQgdW5kIHdpZWRlciBlaW5nZWZhbmdlbiB3ZXJkZW4gbXVzcy5cbiIsIDApOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmIChzdHIgJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiU2NodWV0dGxlIHdpZSBkZW4gS29wZj9cbiIpOworICAgIG91dF9zZWw9IkR1IHNjaHVldHRlbHN0QEBhZHZlcmJAQCBkZW4gS29wZi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHNjaHVldHRlbHRAQGFkdmVyYkBAIGRlbiBLb3BmLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV2Fja2VsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid2Fja2VsIjoKKyAgICBjYXNlICJ3YWNrbCI6CisgICAgSEVMUENIRUNLKCJ3YWNrZWwiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiRGEgZ2lidCBlcyBuaWNodHMgbWVociwgd29taXQgRHUgd2Fja2VsbiBrYW5uc3QuXG4iKTsKKyAgICBpZiAoc3RyKQorICAgICAgaWYgKHN0cnN0cihzdHIsICJtaXQgIik9PTApCisgICAgICAgIHNzY2FuZihzdHIsICJtaXQgJXMiLCBzZm9vKTsKKyAgICAgIGVsc2UgaWYgKHN0cnN0cihzdHIsIm1pdCAiKT4wKSAgeworICAgICAgICBzc2NhbmYoc3RyLCAiJXMgbWl0ICVzIiwgc2Zvbywgc2Zvbyk7CisgICAgICAgIGZsYWc9MTsKKyAgICAgIH0KKyAgICBpZiAoc2Zvbz09IiIpIHNmb289MDsKKyAgICBQYXJzZVJlc3Qoc3RyLCAoc2ZvbyA/IChmbGFnID8gIiBtaXQgIiA6ICJtaXQgIikrc2ZvbyA6IDApKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIgJiYgIXNmb28pCisgICAgICBSZXR1cm4oIldhY2tsZSB3aWUgb2RlciB3b21pdD9cbiIpOworICAgIG91dF9zZWw9IkR1IHdhY2tlbHN0QEBhZHZlcmJAQCBtaXQgIisoc2ZvbyA/IHNmb28rIi4iIDogImRlbSBIaW50ZXJuLiIpOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHdhY2tlbHRAQGFkdmVyYkBAIG1pdCAiCisgICAgICArKHNmb28gPyBzZm9vKyIuIiA6IFFQUChNQUxFLFdFTSkrIiBIaW50ZXJuLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFdhZWx6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgIndhZWx6IjoKKyAgICBIRUxQQ0hFQ0soIndhZWx6Iik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJXYWVsemUgRGljaCB3aWUgYXVmIGRlbSBCb2Rlbj9cbiIpOworICAgIG91dF9zZWw9IkR1IHdhZWx6dCBEaWNoIisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAiIDogIiB2b3IgTGFjaGVuIikKKyAgICAgICsiIGF1ZiBkZW0gQm9kZW4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgd2FlbHp0IHNpY2giKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHZvciBMYWNoZW4iKQorICAgICAgKyhnaG9zdCgpID8gIiBpbSIgOiAiIGF1ZiBkZW0iKSsiIEJvZGVuLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV2FydGVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ3YXJ0IjoKKyAgICBIRUxQQ0hFQ0soIndhcnQiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIG91dF9zZWw9IkR1IHRpcHBzdCBtaXQgZGVtIEZ1c3MgYXVmIGRlbiBCb2Rlbi4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHRpcHB0IG1pdCBkZW0gRnVzcyBhdWYgZGVuIEJvZGVuLiI7CisgICAgfSBlbHNlIGlmICghd2hvICYmIGFkdmVyYikgIHsKKyAgICAgIG91dF9zZWw9IkR1IHdhcnRlc3RAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgd2FydGV0QEBhZHZlcmJAQC4iOworICAgIH0gZWxzZSAgeworICAgICAgb3V0X3NlbD0iRHUgd2FydGVzdEBAYWR2ZXJiQEAgYXVmICIrKHdobyA/ICJAQHdlbkBALiIgOiBzdHIrIi4iKTsKKyAgICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB3YXJ0ZXRAQGFkdmVyYkBAIGF1ZiBEaWNoLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgd2FydGV0QEBhZHZlcmJAQCBhdWYgIisod2hvID8gIkBAd2VuQEAuIiA6IHN0cisiLiIpOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyNpZmRlZiBXRUNLRQorICAgIC8qKioqKioqKioqKioqKioqIFdlY2tlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid2VjayI6CisgICAgSEVMUENIRUNLKCJ3ZWNrIik7CisgICAgaWYgKFBhcnNlUmVtb3RlKHN0cikpCisgICAgICByZXR1cm4gMTsKKy8vICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IHdlY2tlbj9cbiIpOworICAgIGlmIChzc2NhbmYoc3RyLCAiJXMgJXMiLCBzZm9vLCBzZm9vKT09MikKKyAgICAgIGZsYWc9MTsKKyAgICBvdXRfc2VsPSJEZWluIFdlY2tlciBrbGluZ2VsdCBiZWkgQEB3ZW1AQEBAYWR2ZXJiQEAiCisgICAgICArKGFkdmVyYiA/ICIuIiA6IChmbGFnID8gIjogIitzZm9vIDogIi4iKSk7CisgICAgb3V0X3ZpYz0iICIrbmFtZShXRVNTRU4pKyIgV2Vja2VyIGtsaW5nZWx0IGJlaSBEaXJAQGFkdmVyYkBAIgorICAgICAgKyhhZHZlcmIgPyAiLiIgOiAoZmxhZyA/ICI6ICIrc2ZvbyA6ICIuIikpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCB3aXJmdCAiK1FQUChNQUxFLCBXRU4pCisgICAgICArIiBXZWNrZXJAQGFkdmVyYkBAIG5hY2ggQEB3ZW1AQC4iOworICAgICAgICAgIGlmICghd2hvLT5RdWVyeVByb3AoUF9WSVNVQUxCRUxMKSkKKyAgICAgICAgIG91dF92aWNbMF09NzsgLy8gY2hyKDcpPT1CRUwKKyAgICAgIGVsc2Ugb3V0X3ZpYz1vdXRfdmljWzEuLl07CisgICAgcmV0dXJuIEZlZWxJdCgpOworI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKiBXZWluZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgIndlaW4iOgorICAgIEhFTFBDSEVDSygid2VpbiIpOworICAgIEdIT1NUQ0hFQ0soIkVzIHJlaWNodCBsZWlkZXIgbnVyIGZ1ZXIgZWluIHBhYXIgd2luemlnZSBOZWJlbHdvZWxrY2hlbiwgIgorICAgICAgICArIm5pY2h0IGZ1ZXIgVHJhZW5lbi5cbiIsCisgICAgICBnbmFtZSgpKyIgdmVyemllaHQgZGFzIEdlc2ljaHQgdW5kIGVpbiBwYWFyIHdpbnppZ2UgTmViZWwtXG4iCisgICAgICAgICsid29lbGtjaGVuIGVudGZlcm5lbiBzaWNoIHZvbiBzZWluZW4gXCJBdWdlblwiLlxuIiwgMCk7CisgICAgaWYgKCFzdHIpICB7CisgICAgICBvdXRfc2VsPSJXYWFhYWFoISBEdSB3ZWluc3QgYml0dGVybGljaC4iOworICAgICAgb3V0X290aD0iQEBuYW1lQEAgYnJpY2h0IGluIFRyYWVuZW4gYXVzIHVuZCB3ZWludCBiaXR0ZXJsaWNoLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKCF3aG8gJiYgIWFkdmVyYikKKyAgICAgICAgUmV0dXJuKCJXZWluZSBEaWNoIGlyZ2VuZHdpZSBiZWkgaXJnZW5kd2VtIGF1cywgYWJlciBuaWNodCBzby5cbiIpOworICAgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAgICJCZWkgc2ljaCBzZWxiZXIga2FubiBtYW4gc2ljaCBzbyBzY2hsZWNodCBhdXN3ZWluZW4uIiwKKyAgICAgICAgIkJlaSB3ZW0gd2lsbHN0IER1IERpY2ggYXVzd2VpbmVuPz8/IikpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICBpZiAod2hvKSAgeworICAgICAgICBvdXRfc2VsPSJEdSB3ZWluc3QgRGljaEBAYWR2ZXJiQEAgYmVpQEAgd2VtQEAgYXVzLiI7CisgICAgICAgIG91dF92aWM9IkBAbmFtZUBAIHdlaW50IHNpY2hAQGFkdmVyYkBAIGJlaSBEaXIgYXVzLiI7CisgICAgICAgIG91dF9vdGg9IkBAbmFtZUBAIHdlaW50IHNpY2hAQGFkdmVyYkBAIGJlaUBAIHdlbUBAIGF1cy4iOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBvdXRfc2VsPSJEdSBicmljaHN0IGluIFRyYWVuZW4gYXVzIHVuZCB3ZWluc3RAQGFkdmVyYkBALiI7CisgICAgICAgIG91dF9vdGg9IkBAbmFtZUBAIGJyaWNodCBpbiBUcmFlbmVuIGF1cyB1bmQgd2VpbnRAQGFkdmVyYkBALiI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFdpbmtlbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAid2luayI6CisgICAgSEVMUENIRUNLKCJ3aW5rIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSB3aW5rc3QgQEBhbGxlQEBAQGFkdmVyYkBAIHp1LiI7CisgICAgICBvdXRfdmljPSJAQG5hbWVAQCB3aW5rdCBAQGFsbGVAQEBAYWR2ZXJiQEAgenUuIjsKKyAgICAgIHJldHVybiBNaXhlZE91dChXRU0pOworICAgIH0KKyAgICBpZiAoIXdobyAmJiAhYWR2ZXJiICYmIHN0cikKKyAgICAgIFJldHVybigiVmllbGxlaWNodCBzb2xsdGVzdCBEdSBhdWNoIHNhZ2VuLCB3ZW0gb2RlciB3aWUgRHUgIgorICAgICAgICArIih6dSl3aW5rZW4gd2lsbHN0LlxuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsIE5PVF9ERUFELAorICAgICAgIldpbmsgRGlyIG5pY2h0IHNlbGJlciB6dS4iLAorICAgICAgIkR1IG11c3N0IHNjaG9uIGVpbmVtIExlYmV3ZXNlbiB6dXdpbmtlbi4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgb3V0X3NlbD0iRHUgd2lua3N0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dSIgOiAiIikrIi4iOworICAgIGlmICh3aG8pIG91dF92aWM9IkBAZ25hbWVAQCB3aW5rdCBEaXJAQGFkdmVyYkBAIHp1LiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHdpbmt0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dSIgOiAiIikrIi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFd1ZXJnZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInd1ZXJnIjoKKyAgICBIRUxQQ0hFQ0soInd1ZXJnIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIld1ZXJnZSB3ZW4gb2RlciB3aWU/XG4iKTsKKyAgICBpZiAoIXdobykgIHsKKyAgICAgIG91dF9zZWw9IkR1IGZhZW5nc3RAQGFkdmVyYkBAIGFuIHp1IHd1ZXJnZW4uIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCBmYWVuZ3RAQGFkdmVyYkBAIGFuIHp1IHd1ZXJnZW4uIjsKKyAgICB9IGVsc2UgaWYgKENoZWNrTGlmZShOT1RfU0VMRiwgTk9UX0RFQUQsCisgICAgICAgICAgIkR1IHd1ZXJnc3QgZWluIGJpc2NoZW4gYW4gRGlyIHJ1bS4gRGlyIHdpcmQgc2NobmVsbCBsYW5nd2VpbGlnLiIsCisJICAiV3VlcmcgbGllYmVyIGVpbiBMZWJld2VzZW4uIikpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICBvdXRfc2VsPSJEdSBzcHJpbmdzdCBAQHdlbkBAIGFuIHVuZCBmYWVuZ3N0IGFuLCAiK3doby0+UXVlcnlQcm9ub3VuKFdFTikKKyAgICAgICAgKyJAQGFkdmVyYkBAIHp1IHd1ZXJnZW4uIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCBzcHJpbmd0IERpY2ggYXVmIGVpbm1hbCBhbiB1bmQgd3Vlcmd0IERpY2hAQGFkdmVyYkBALiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgc3ByaW5ndCBhdWYgZWlubWFsIEBAd2VuQEAgYW4gdW5kIHd1ZXJndCAiCisgICAgICAgICt3aG8tPlF1ZXJ5UHJvbm91bihXRU4pKyJAQGFkdmVyYkBALiI7CisgICAgfQorICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFd1bmRlcm4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInd1bmRlciI6CisgICAgSEVMUENIRUNLKCJ3dW5kZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICF3aG8gJiYgIWFkdmVyYikKKyAgICAgIFJldHVybigiV2llIG9kZXIgdWViZXIgd2VuIHdpbGxzdCBEdSBEaWNoIHd1bmRlcm4/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSB3dW5kZXJzdCBEaWNoQEBhZHZlcmJAQCIrKHdobyA/ICIgdWViZXIgQEB3ZW5AQC4iIDogIi4iKTsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgd3VuZGVydCBzaWNoQEBhZHZlcmJAQCB1ZWJlciBEaWNoLiI7CisgICAgb3V0X290aD0iQEBnbmFtZUBAIHd1bmRlcnQgc2ljaEBAYWR2ZXJiQEAiKyh3aG8gPyAiIHVlYmVyIEBAd2VuQEAuIiA6ICIuIik7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogV3VzY2hlbG4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInd1c2NoZWwiOgorICAgIGNhc2UgInd1c2NobCI6CisgICAgSEVMUENIRUNLKCJ3dXNjaGVsIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgZGVubiB3dXNjaGVsbj9cbiIpOworICAgIGlmIChDaGVja0xpZmUoMCxOT1RfREVBRCwKKyAgICAgICIiLCAiSG1tLCBzZWhyIHRvdC4gTmUsIGxpZWJlciBuaWNodC4iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHdoby0+UXVlcnlQcm9wKFBfRlJPRykpICB7CisgICAgICB3cml0ZSgiRHUgdmVyd3VzY2hlbHN0Li4uICBhZWguLi4gaG0uIEVpbiBGcm9zY2ggaGF0IHdvaGwgbml4ICIKKyAgICAgICAgKyJ6dW0gV3VzY2hlbG4uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgIH07CisgICAgR0hPU1RDSEVDSygiRHUgd2lsbHN0ICIrd2hvLT5uYW1lKFdFTikrIiB3dXNjaGVsbiAtIGFiZXIgRGVpbmUgIgorICAgICAgICArIkhhZW5kZSBnZWhlblxuZ2xhdHQgZHVyY2ggZGVuIEtvcGYgZHVyY2guXG4iLAorICAgICAgZ25hbWUoKSsiIHdpbGwgIit3aG8tPm5hbWUoV0VOKSsiIGRlbiBLb3BmIHd1c2NoZWxuLCBhYmVyICIKKyAgICAgICAgKyJkaWUgR2Vpc3Rlci1cbmhhZW5kZSBnZWhlbiBnbGF0dCBkdXJjaCBkZW4gS29wZiBkdXJjaC5cbiIsCisgICAgICBnbmFtZSgpKyIgd2lsbCBEaWNoIHd1c2NoZWxuLCBhYmVyIGRpZXNlIEdlaXN0ZXJoYWVuZGUgIgorICAgICAgICArImdlaGVuXG5nbGF0dCBkdXJjaCBEZWluZW4gS29wZiBkdXJjaCAtIER1IGhhc3QgZWluIHNlbHRzYW1lcyAiCisgICAgICAgICsiR2VmdWVobCBkYWJlaS5cbiIpOworICAgIGlmIChtZW1iZXIoKHsiaGlnaGxhbmRlciIsImJvaW5nIiwibWllemUiLCJmcmV1bmQifSksIHdoby0+cXVlcnlfcmVhbF9uYW1lKCkpPi0xKQorICAgICAgc3dpdGNoICh3aG8tPnF1ZXJ5X3JlYWxfbmFtZSgpKSAgeworICAgICAgICBjYXNlICJoaWdobGFuZGVyIjogc3RyMT0iRmVkZXJuIjsgYnJlYWs7CisgICAgICAgIGNhc2UgImZyZXVuZCIgICAgOgorICAgICAgICBjYXNlICJtaWV6ZSIgICAgIDoKKyAgICAgICAgY2FzZSAiYm9pbmciICAgICA6IHN0cjE9IkZlbGwiOyBicmVhazsKKyAgICAgIH0KKyAgICBlbHNlIGlmICh3aG8tPmlzX2NsYXNzX21lbWJlcigoe0NMX0RSQUdPTiwgQ0xfRklTSCwgQ0xfUkVQVElMRX0pKSkKKyAgICAgIHN0cjE9IlNjaHVwcGVuIjsKKyAgICBlbHNlIGlmICh3aG8tPmlzX2NsYXNzX21lbWJlcigoe0NMX0JJUkQsICJlbHN0ZXIiLCJncmVpZiJ9KSkpCisgICAgICBzdHIxPSJGZWRlcm4iOworICAgIGVsc2UgaWYgKHdoby0+aXNfY2xhc3NfbWVtYmVyKCh7Q0xfTUFNTUFMX0xBTkQsQ0xfRkVMSU5FLCJ0aWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RlaW5iZWlzc2VyIiwia251ZGRlbGVpc2JhZXIifSkpKQorICAgICAgc3RyMT0iRmVsbCI7CisgICAgZWxzZSBzdHIxPSJIYWFyZSI7CisgICAgb3V0X3NlbD0iRHUgdmVyd3VzY2hlbHN0QEBhZHZlcmJAQCBAQHdlc3NlbkBAICIrc3RyMSsiLiI7CisgICAgb3V0X3ZpYz0iQEBuYW1lQEAgdmVyd3VzY2hlbHRAQGFkdmVyYkBAIERlaW4iCisgICAgICArKHN0cjE9PSJGZWxsIiA/ICIgIiA6ICJlICIpK3N0cjErIi4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHZlcnd1c2NoZWx0QEBhZHZlcmJAQCBAQHdlc3NlbkBAICIrc3RyMSsiLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogWml0aWVyZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInppdGllciI6CisgICAgSEVMUENIRUNLKCJ6aXRpZXIiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiWml0aWVyZSB3YXMgb2RlciB3ZW4gd29taXQ/XG4iKTsKKyAgICBzZm9vPWltcGxvZGUoZXhwbG9kZShzdHIsICIgIilbMS4uXSwgIiAiKTsKKyAgICBpZiAoc2Zvbz09IiIpIHNmb289MDsKKyAgICBpZiAod2hvKSAgeworICAgICAgb3V0X3NlbD0iRHUgeml0aWVyc3QgQEB3ZW5AQCIrKHNmb28gPyAiOiBcIiIrc2ZvbysiXCIiIDogIiIpKyIuIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCB6aXRpZXJ0IERpY2giKyhzZm9vID8gIjogXCIiK3Nmb28rIlwiIiA6ICIiKSsiLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgeml0aWVydCBAQHdlbkBAIisoc2ZvbyA/ICI6IFwiIitzZm9vKyJcIiIgOiAiIikrIi4iOworICAgIH0KKyAgICBlbHNlICB7CisgICAgICBzZm9vPWV4cGxvZGUoc3RyLCAiLyIpWzBdOworICAgICAgb3V0X3NlbD0iRHUgeml0aWVyc3RAQGFkdmVyYkBAIisoc2ZvbyA/ICI6IFwiIitzZm9vKyJcIiIgOiAiIikrIi4iOworICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHppdGllcnRAQGFkdmVyYkBAIisoc2ZvbyA/ICI6IFwiIitzZm9vKyJcIiIgOiAiIikrIi4iOworICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBaaXR0ZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ6aXR0ZXIiOgorICAgIEhFTFBDSEVDSygieml0dGVyIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhYWR2ZXJiKQorICAgICAgUmV0dXJuKCJaaXR0ZXJlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IHppdHRlcnN0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgdm9yIEFuZ3N0LiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCB6aXR0ZXJ0IisoYWR2ZXJiID8gIkBAYWR2ZXJiQEAuIiA6ICIgdm9yIEFuZ3N0LiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFNjaHVsdGVyenVja2VuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ6dWNrIiA6CisgICAgSEVMUENIRUNLKCJ6dWNrIik7CisgICAgICAgICAgaWYgKHN0cikKKyAgICAgIGlmIChzc2NhbmYoc3RyLCIlcyBtaXQgZGVuIHNjaHVsdGVybiIsc2ZvbykpCisgICAgICAgIHN0cj1zZm9vOworICAgIGVsc2UgaWYgKHNzY2FuZihzdHIsIiVzIGRlbiBzY2h1bHRlcm4iLHNmb28pKQorICAgICAgc3RyPXNmb287CisgICAgZWxzZQorICAgICAgaWYgKHNzY2FuZihzdHIsIiVzIHNjaHVsdGVybiIsc2ZvbykpCisgICAgICAgIHN0cj1zZm9vOworICAgIGlmIChzdHI9PSIiKSBzdHI9MDsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlp1Y2tlIHdpZSBtaXQgZGVuIFNjaHVsdGVybj9cbiIpOworICAgIG91dF9zZWw9IkR1IHp1Y2tzdEBAYWR2ZXJiQEAgbWl0IGRlbiBTY2h1bHRlcm4uIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgenVja3QiKyhhZHZlcmIgPyAiQEBhZHZlcmJAQCIgOiAiIHJhdGxvcyIpCisgICAgICAgICAgICArIiBtaXQgZGVuIFNjaHVsdGVybi4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFp3aW5rZXJuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJ6d2lua2VyIjoKKyAgICBIRUxQQ0hFQ0soInp3aW5rZXIiKTsKKyAgICBpZiAoZ2hvc3QoKSkKKyAgICAgIFJldHVybigiVmVyZ2lzcyBlcyAtIGRhcyBpc3QgYWxzIEdlaXN0IHZpZWwgenUgdW5hdWZmYWVsbGlnLCBhbHMgZGFzc1xuIgorICAgICAgICArImVzIGFuZGVyZSBMZXV0ZSBzZWhlbiB3dWVyZGVuLlxuIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKHN0ciAmJiAhd2hvICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlp3aW5rZXJlIHdpZT8gWndpbmtlcmUgd2VtIHp1P1xuIik7CisgICAgaWYgKHdobyAmJiBDaGVja0xpZmUoTk9UX1NFTEYsTk9UX0RFQUQsCisgICAgICAiRHUga2FubnN0IERpciBuaWNodCBzZWxiZXIgenV6d2lua2Vybi4iLAorICAgICAgIldpZXNvIHJlYWdpZXJ0IGRhcyBEaW5nIGRhIG5pY2h0IGF1ZiBEZWluIFp3aW5rZXJuPyBJc3QgZXMgZXR3YSB0b3Q/IikpCisgICAgICAgIHJldHVybiAxOworICAgIG91dF9zZWw9IkR1IHp3aW5rZXJzdEBAIHdlbUBAQEBhZHZlcmJAQCIrKHdobyA/ICIgenUuIiA6ICIuIik7CisgICAgaWYgKHdobykgb3V0X3ZpYz0iQEBuYW1lQEAgendpbmtlcnQgRGlyQEBhZHZlcmJAQCB6dS4iOworICAgIG91dF9vdGg9IkBAbmFtZUBAIHp3aW5rZXJ0QEAgd2VtQEBAQGFkdmVyYkBAIisod2hvID8gIiB6dS4iIDogIi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBadW5nZSByYXVzc3RyZWNrZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInN0cmVjayI6CisgICAgSEVMUENIRUNLKCJzdHJlY2siKTsKKyAgICBHSE9TVENIRUNLKCJTb3JyeSwgRHUgaGFzdCBrZWluZSBadW5nZSB6dW0gUmF1c3N0cmVja2VuLlxuIiwiIiwwKTsKKyAgICBpZiAoIXN0cikKKyAgICAgIFJldHVybigiU3RyZWNrZSB3YXMgd2llIHdlbSB3byB3YW5uIHdpZXNvP1xuIik7CisgICAgc3RyPWxvd2VyX2Nhc2Uoc3RyKTsKKyAgICBpZiAoc3NjYW5mKHN0ciwgIiVzIHp1bmdlIHJhdXMiLCBzdHIxKSE9MSAmJgorICAgIHNzY2FuZihzdHIsICIlcyBkaWUgenVuZ2UgcmF1cyIsIHN0cjEpIT0xKQorICAgICAgUmV0dXJuKCJTdHJlY2tlIHdhcyB3aWUgd2VtIHdvIHdhbm4gd2llc28/XG4iKTsKKyAgICBQYXJzZVJlc3Qoc3RyMSk7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSBzdHJlY2tzdCBAQGFsbGVAQEBAYWR2ZXJiQEAgZGllIFp1bmdlIHJhdXMuIjsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIHN0cmVja3QgQEBhbGxlQEBAQGFkdmVyYkBAIGRpZSBadW5nZSByYXVzLiI7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VNKTsKKyAgICB9CisgICAgb3V0X3NlbD0iRHUgc3RyZWNrc3RAQCB3ZW1AQEBAYWR2ZXJiQEAgZGllIFp1bmdlIHJhdXMuIjsKKyAgICBpZiAod2hvKSBvdXRfdmljPSJAQG5hbWVAQCBzdHJlY2t0IERpckBAYWR2ZXJiQEAgZGllIFp1bmdlIHJhdXMuIjsKKyAgICBvdXRfb3RoPSJAQG5hbWVAQCBzdHJlY2t0QEAgd2VtQEBAQGFkdmVyYkBAIGRpZSBadW5nZSByYXVzLiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLy8gU3BlemlhbHNhY2hlbiAtIEdlaXN0ZXJ2ZXJiZW4gdW5kIE1hZ2llcnZlcmJlbgorCisgICAgLyoqKioqKioqKioqKioqKiogUmFzc2VsbiAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAicmFzc2VsIjoKKyAgICBjYXNlICJyYXNzbCI6CisgICAgaWYgKCFnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEYXMgaXN0IG5pY2h0IERlaW4gRmFjaGdlYmlldCAtIER1IGJpc3QgZG9jaCBrZWluIEdlaXN0IVxuIik7CisgICAgSEVMUENIRUNLKCJyYXNzZWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIlJhc3NlbCB3aWU/XG4iKTsKKyAgICBvdXRfc2VsPSJEdSByYXNzZWxzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgZnVlcmNodGVybGljaCIpCisgICAgICArIiBtaXQgZWluZXIgcm9zdGlnZW4gUmFzc2Vsa2V0dGUsXG4iCisgICAgICArImRpZSBEdSBhdWYgZWlubWFsIGZ1ZXIgZWluZW4gTW9tZW50IGluIGRlciBIYW5kIGhhZWx0c3QuIjsKKyAgICBvdXRfb3RoPSJAQGduYW1lQEAgaG9sdCBhdWYgZWlubWFsIGVpbmUgcm9zdGlnZSBSYXNzZWxrZXR0ZSBhdXNcbiIKKyAgICAgICsiZGVtIE5pY2h0cyB1bmQgZmFlbmd0IGFuLCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBAIiA6ICIgZnVlcmNodGVybGljaCIpCisgICAgICArIiBkYW1pdCB6dSByYXNzZWxuLlxuIgorICAgICAgKyJEYW5hY2ggaXN0IGRpZSBLZXR0ZSBhdWYgZWlubWFsIHdpZWRlciB2ZXJzY2h3dW5kZW4uIjsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKioqKiBIZXVsZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgImhldWwiOgorICAgIGlmICghZ2hvc3QoKSkKKyAgICAgIFJldHVybigiTGFzcyBkYXMgbWFsIGRlbiBGYWNobGV1dGVuIChhbHNvIGRlbiBHZWlzdGVybikuXG4iKTsKKyAgICBIRUxQQ0hFQ0soImhldWwiKTsKKyAgICBQYXJzZVJlc3Qoc3RyKTsKKyAgICBpZiAoc3RyICYmICFhZHZlcmIpCisgICAgICBSZXR1cm4oIkhldWxlIHdpZT9cbiIpOworICAgIG91dF9zZWw9IkR1IGhldWxzdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHNjaGF1ZXJsaWNoLiIpOworICAgIG91dF9vdGg9IkBAZ25hbWVAQCBoZXVsdCIrKGFkdmVyYiA/ICJAQGFkdmVyYkBALiIgOiAiIHNjaGF1ZXJsaWNoLiIpOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFRyZXRlbiAodHJldGV0KSAqKioqKioqKioqKioqKiovCisgICAgY2FzZSAia2ljayI6CisgICAgaWYgKCFJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkpCisgICAgICByZXR1cm4gMDsKKyAgICBIRUxQQ0hFQ0soImtpY2siKTsKKyAgICBpZiAoIXN0cikgIHsKKyAgICAgIEdIT1NUQ0hFQ0soIkRlaW4gRnVzcyBmYWVocnQgZHVyY2ggZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSAiCisgICAgICAgICAgKyJ1bnNpY2h0YmFyZSBTY2hpbGRrcm9ldGVcbmhpbmR1cmNoLlxuIiwKKyAgICAgICAgZ25hbWUoKSsiIHdpbGwgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZVxuIgorICAgICAgICAgICsiU2NoaWxka3JvZXRlIHRyZXRlbiwgYWJlciAiK1FQUChNQUxFLFdFUikKKyAgICAgICAgICArIiBGdXNzIGZhZWhydCBkdXJjaCBzaWUgaGluZHVyY2guXG4iLCAwKTsKKyAgICAgIG91dF9zZWw9IkR1IHRyZXRlc3QgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZSAiCisgICAgICAgICsiU2NoaWxka3JvZXRlLiI7CisgICAgICBvdXRfb3RoPSJAQG5hbWVAQCB0cmV0ZXQgZGllIGJlcnVlaG10ZSBsYW5ndmVyZ2Vzc2VuZSB1bnNpY2h0YmFyZSAiCisgICAgICAgICsiU2NoaWxka3JvZXRlLiI7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIFBhcnNlUmVzdChzdHIpOworICAgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICAgIG91dF9zZWw9IkR1IHRyZXRlc3QgQEBhbGxlQEBAQGFkdmVyYkBALiI7CisgICAgICAgIG91dF92aWM9IkBAbmFtZUBAIHRyZXRldCBAQGFsbGVAQEBAYWR2ZXJiQEAuIjsKKyAgICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgICB9CisgICAgICBpZiAoIXdobyAmJiAhYWR2ZXJiKQorICAgICAgICBSZXR1cm4oIldlbm4gRHUgc2Nob24gd2FzIG5hY2gga2ljayB0aXBwc3QsIGRhbm4gc2FnIG1pciB3ZW4gIgorICAgICAgICAgICsib2RlciB3aWUgaWNoZGFzIHNvbGwuXG4iKTsKKyAgICAgIGlmICh3aG8gJiYgQ2hlY2tMaWZlKE5PVF9TRUxGLE5PVF9ERUFELAorICAgICAgICAiRHUgc2NoYWZmc3QgZXMgbmljaHQsIERpciBzZWxiZXIgaW4gZGVuIEhpbnRlcm4genUgdHJldGVuLiIsCisgICAgICAgICJUb3RlIFNhY2hlbiB0cml0dCBtYW4gbmljaHQgYXVjaCBub2NoISIpKQorICAgICAgICAgIHJldHVybiAxOworICAgICAgaWYgKHdobykgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdHJldGVzdEBAIHdlbkBAQEBhZHZlcmJAQC4iOworICAgICAgICBpZiAod2hvKSBvdXRfdmljPSJAQGduYW1lQEAgdHJldGV0IERpY2hAQGFkdmVyYkBALiI7CisgICAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB0cmV0ZXRAQCB3ZW5AQEBAYWR2ZXJiQEAuIjsKKyAgICAgIH0KKyAgICAgIGVsc2UgIHsKKyAgICAgICAgb3V0X3NlbD0iRHUgdHJldGVzdCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgICArIlNjaGlsZGtyb2V0ZUBAYWR2ZXJiQEAuIjsKKyAgICAgICAgb3V0X290aD0iQEBnbmFtZUBAIHRyZXRldCBkaWUgYmVydWVobXRlIGxhbmd2ZXJnZXNzZW5lIHVuc2ljaHRiYXJlICIKKyAgICAgICAgICArIlNjaGlsZGtyb2V0ZVxuQEBhZHZlcmJAQC4iOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvKioqKioqKioqKioqKiBOYXNzc3ByaXR6ZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInNwbGFzaCI6CisgICAgaWYgKCFJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkgJiYKKyAgICAhKElTX1NFRVIodGhpc19wbGF5ZXIoKSkgJiYgcHJlc2VudCgiU0VIRVJcbnNwcml0enBpc3RvbGUiLHRoaXNfcGxheWVyKCkpKSkKKyAgICAgIHJldHVybiAwOworICAgIEhFTFBDSEVDSygic3BsYXNoIik7CisgICAgUGFyc2VSZXN0KHN0cik7CisgICAgaWYgKGZvcl9hbGwpICB7CisgICAgICBvdXRfc2VsPSJEdSB6aWVoc3QgRGVpbmUgV2Fzc2VycGlzdG9sZSB1bmQgc3ByaXR6dCBAQGFsbGVAQEBAYWR2ZXJiQEAgIgorICAgICAgICArInBhdHNjaG5hc3MuIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCB6aWVodCAiK1FQUChGRU1BTEUsV0VOKSsiIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enRcbiIKKyAgICAgICAgKyJAQGFsbGVAQEBAYWR2ZXJiQEAgcGF0c2NobmFzcy4iOworICAgICAgcmV0dXJuIE1peGVkT3V0KFdFTik7CisgICAgfQorICAgIGlmICghd2hvKQorICAgICAgUmV0dXJuKCJXZW4gd2lsbHN0IER1IGRlbm4gbmFzc21hY2hlbj9cbiIpOworICAgIGlmICh3aG8gPT0gdGhpc19wbGF5ZXIoKSkgIHsKKyAgICAgIG91dF9zZWw9IlNhZyBtYWwsIGtvbW1zdCBEdSBEaXIgbmljaHQgZWluIGJpc3NjaGVuIGRvb2Ygdm9yP1xuIgorICAgICAgICArIkR1IHppZWhzdCBEZWluZSBXYXNzZXJwaXN0b2xlIHVuZCBzcHJpdHp0IERpY2hAQGFkdmVyYkBAIHNlbGJlciBwYXRzY2huYXNzLiI7CisgICAgICBvdXRfb3RoPSJAQGduYW1lQEAgemllaHQgIitRUFAoRkVNQUxFLFdFTikrIiBXYXNzZXJwaXN0b2xlIHVuZCBzcHJpdHp0ICIKKyAgICAgICAgKyJzaWNoQEBhZHZlcmJAQCBhdXMgdW5lcmZpbmRsaWNoZW4gR3J1ZW5kZW4gc2VsYnN0IHBhdHNjaG5hc3MuIjsKKyAgICB9CisgICAgZWxzZSAgeworICAgICAgb3V0X3NlbD0iRHUgemllaHN0IERlaW5lIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enQgQEB3ZW5AQEBAYWR2ZXJiQEAgIgorICAgICAgICArInBhdHNjaG5hc3MuIjsKKyAgICAgIG91dF92aWM9IkBAZ25hbWVAQCB6aWVodCAiK1FQUChGRU1BTEUsV0VOKSsiIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enQgIgorICAgICAgICArIkRpY2hAQGFkdmVyYkBAIHBhdHNjaG5hc3MuIjsKKyAgICAgIG91dF9vdGg9IkBAZ25hbWVAQCB6aWVodCAiK1FQUChGRU1BTEUsV0VOKSsiIFdhc3NlcnBpc3RvbGUgdW5kIHNwcml0enQgIgorICAgICAgICArIkBAd2VuQEBAQGFkdmVyYkBAIHBhdHNjaG5hc3MuIjsKKyAgICB9CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogQW5mbGFtbWVuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJmbGFtIjoKKyAgICBpZiAoIUlTX1dJWkFSRCh0aGlzX3BsYXllcigpKSAmJgorICAgICEoSVNfU0VFUih0aGlzX3BsYXllcigpKSAmJiBwcmVzZW50KCJTRUhFUlxuZmxhbW1lbndlcmZlciIsdGhpc19wbGF5ZXIoKSkpKQorICAgICAgcmV0dXJuIDA7CisgICAgSEVMUENIRUNLKCJmbGFtZSIpOworICAgIGlmIChnaG9zdCgpKQorICAgICAgUmV0dXJuKCJEdSBoYXN0IGxlaWRlciBncmFkZSBEZWluZW4gRmxhbW1lbndlcmZlciBuaWNodCBkYWJlaS5cbiIpOworICAgIFBhcnNlUmVzdChzdHIpOworICAgIGlmb289IXJhbmRvbSg3KTsKKyAgICBpZiAoZm9yX2FsbCkgIHsKKyAgICAgIG91dF9zZWw9IkR1IGhvbHN0IGF1cyBEZWluZW4gdGllZnN0ZW4gVGFzY2hlbiAob2RlciB3YXMgd2Vpc3MgZGVubiAiCisgICAgICAgICsiaWNoIHdvaGVyKSBEZWluZW5cbk1vcmdlbkdyYXVlbiBoYW5kZ2VhcmJlaXRldGVuIE1pbmktRmxhbW1lbndlcmZlciAiCisgICAgICAgICsiKHRtKSwgcmljaHRlc3QgaWhuIGF1cyB1bmQuLi5cbiIKKyAgICAgICAgKyhpZm9vID8gInNjaGF1c3QgbGVpY2h0IGZydXN0cmllcnQgYXVmIGRhcyBTdHJlaWNoaG9seiwgaW4gZGFzICIKKyAgICAgICAgICArImVyIHNpY2ggdmVyd2FuZGVsdCBoYXQuIgorICAgICAgICA6ICJmZXVlcnN0QEBhZHZlcmJAQCBlaW5lbiByaWVzaWdlbiBGZXVlcmJhbGwgYXVmIEBAYWxsZUBAIGFiLlxuIgorICAgICAgICAgICsiRXMgcmllY2h0IGF1ZiBlaW5tYWwgc28gdmVyYnJhbm50IGhpZXIuLi4iKTsKKyAgICAgIG91dF92aWM9IkBAbmFtZUBAIGhvbHQgYXVmIGVpbm1hbCBpcmdlbmR3b2hlciBlaW5lbiBNb3JnZW5HcmF1ZW4gIgorICAgICAgICArImhhbmRnZWFyYmVpdGV0ZW5cbk1pbmktRmxhbW1lbndlcmZlciAodG0pLCByaWNodGV0IGlobiBhdXMgdW5kLi4uXG4iCisgICAgICAgICsoaWZvbyA/ICJzY2hhdXQgemllbWxpY2ggZnJ1c3RyaWVydCBhdWYgZGFzIFN0cmVpY2hob2x6LCBpbiBkYXMgIgorICAgICAgICAgICsic2ljaCBkYXMgRGluZyB2ZXJ3YW5kZWx0IGhhdC4iCisgICAgICAgIDogImZldWVydEBAYWR2ZXJiQEAgZWluZW4gcmllc2lnZW4gRmV1ZXJiYWxsIGF1ZiBAQGFsbGVAQCBhYi5cbiIKKyAgICAgICAgICArIkRpciB3aXJkIHNvIHdhcm0gdW0ncyBIZXJ6Li4uIik7CisgICAgICByZXR1cm4gTWl4ZWRPdXQoV0VOKTsKKyAgICB9CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIldlbiB3aWxsc3QgRHUgZGVubiBhbmtva2Vsbj9cbiIpOworICAgIG91dF9zZWw9IkR1IGhvbHN0IGF1cyBEZWluZW4gdGllZnN0ZW4gVGFzY2hlbiAob2RlciB3YXMgd2Vpc3MgZGVubiAiCisgICAgICArImljaCB3b2hlcikgRGVpbmVuXG5Nb3JnZW5HcmF1ZW4gaGFuZGdlYXJiZWl0ZXRlbiBNaW5pLUZsYW1tZW53ZXJmZXIgIgorICAgICAgKyIodG0pLCByaWNodGVzdCBpaG4gYXVzIHVuZC4uLlxuIgorICAgICAgKyhpZm9vID8gInNjaGF1c3QgbGVpY2h0IGZydXN0cmllcnQgYXVmIGRhcyBTdHJlaWNoaG9seiwgaW4gZGFzIGVyICIKKyAgICAgICAgKyJzaWNoIHZlcndhbmRlbHQgaGF0LiIKKyAgICAgIDogImZldWVyc3RAQGFkdmVyYkBAIGVpbmVuIHJpZXNpZ2VuIEZldWVyYmFsbCBhdWYgQEB3ZW5AQCBhYi5cbiIKKyAgICAgICAgKyJFcyByaWVjaHQgYXVmIGVpbm1hbCBzbyB2ZXJicmFubnQgaGllci4uLiIpOworICAgIG91dF92aWM9IkBAbmFtZUBAIGhvbHQgYXVmIGVpbm1hbCBpcmdlbmR3b2hlciBlaW5lbiBNb3JnZW5HcmF1ZW4gIgorICAgICAgKyJoYW5kZ2VhcmJlaXRldGVuXG5NaW5pLUZsYW1tZW53ZXJmZXIgKHRtKSwgcmljaHRldCBpaG4gYXVmIERpY2ggIgorICAgICAgKyJhdXMgdW5kLi4uXG4iCisgICAgICArKGlmb28gPyAic2NoYXV0IHppZW1saWNoIGZydXN0cmllcnQgYXVmIGRhcyBTdHJlaWNoaG9seiwgaW4gZGFzICIKKyAgICAgICAgKyJzaWNoIGRhcyBEaW5nXG52ZXJ3YW5kZWx0IGhhdC4iCisgICAgICA6ICJmZXVlcnRAQGFkdmVyYkBAIGVpbmVuIHJpZXNpZ2VuIEZldWVyYmFsbCBhdWYgRGljaCBhYi5cbiIKKyAgICAgICAgKyJEaXIgd2lyZCBzbyB3YXJtIHVtcyBIZXJ6Li4uIik7CisgICAgb3V0X290aD0iQEBuYW1lQEAgaG9sdCBhdWYgZWlubWFsIGlyZ2VuZHdvaGVyIGVpbmVuIE1vcmdlbkdyYXVlbiAiCisgICAgICArImhhbmRnZWFyYmVpdGV0ZW5cbk1pbmktRmxhbW1lbndlcmZlciAodG0pLCByaWNodGV0IGlobiAiCisgICAgICArImF1ZkBAIHdlbkBAIGF1cyB1bmQuLi5cbiIKKyAgICAgICsoaWZvbyA/ICJzY2hhdXQgemllbWxpY2ggZnJ1c3RyaWVydCBhdWYgZGFzIFN0cmVpY2hob2x6LCBpbiBkYXMgIgorICAgICAgICArInNpY2ggZGFzIERpbmdcbnZlcndhbmRlbHQgaGF0LiIKKyAgICAgIDogImZldWVydEBAYWR2ZXJiQEAgZWluZW4gcmllc2lnZW4gRmV1ZXJiYWxsIGF1ZkBAIHdlbkBAIGFiLlxuRXMgIgorICAgICAgICArInJpZWNodCBhdWYgZWlubWFsIGlyZ2VuZHdpZSB2ZXJicmFubnQgaGllciAuLi4iKTsKKyAgICByZXR1cm4gRmVlbEl0KCk7CisKKyAgICAvLyBTcGVjaWFsIDI6IHJlbW90ZSB2ZXJicworCisgICAgLyoqKioqKioqKioqKioqKiogUmVtb3RlIGtudWRkZWxuICoqKioqKioqKioqKioqKi8KKyAgICBjYXNlICJya251ZGRlbCI6CisgICAgY2FzZSAicmtudWRkbCI6CisgICAgSEVMUENIRUNLKCJya251ZGRlbCIpOworICAgIGlmIChQYXJzZVJlbW90ZShzdHIpKQorICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCF3aG8pCisgICAgICBSZXR1cm4oIktudWRkbGUgd2VuP1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIkRhcyBicmluZ3QgZG9jaCBuaXgsIGxhc3MgZXMgaGFsdC4iLAorICAgICAgMCkpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChwcmVzZW50KHdobywgZW52aXJvbm1lbnQoKSkpCisgICAgICBSZXR1cm4oIldlbm4gamVtYW5kIG5lYmVuIERpciBzdGVodCwgbmltbSBrbnVkZGVsLlxuIik7CisgICAgb3V0X3NlbD0iRHUga251ZGRlbHN0IEBAd2VuQEBAQGFkdmVyYkBAIGF1cyBkZXIgRmVybmUuIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAga251ZGRlbHQgRGljaEBAYWR2ZXJiQEAgYXVzIGRlciBGZXJuZS4iOworICAgIHJldHVybiBGZWVsSXQoKTsKKworICAgIC8qKioqKioqKioqKioqKioqIFJlbW90ZSB3aW5rZW4gKioqKioqKioqKioqKioqLworICAgIGNhc2UgInJ3aW5rIjoKKyAgICBIRUxQQ0hFQ0soInJ3aW5rIik7CisgICAgaWYgKFBhcnNlUmVtb3RlKHN0cikpCisgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIXdobykKKyAgICAgIFJldHVybigiV2lua2Ugd2VtIHp1P1xuIik7CisgICAgaWYgKENoZWNrTGlmZShOT1RfU0VMRiwwLAorICAgICAgIlNlaHIgd2l0emlnLiBQYWguIiwgMCkpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChwcmVzZW50KHdobywgZW52aXJvbm1lbnQoKSkpCisgICAgICBSZXR1cm4oIldlbm4gamVtYW5kIG5lYmVuIERpciBzdGVodCwgbmltbSB3aW5rLlxuIik7CisgICAgb3V0X3NlbD0iRHUgd2lua3N0IEBAd2VtQEBAQGFkdmVyYkBAIGF1cyBkZXIgRmVybmUgenUuIjsKKyAgICBvdXRfdmljPSJAQGduYW1lQEAgd2lua3QgRGlyQEBhZHZlcmJAQCBhdXMgZGVyIEZlcm5lIHp1LiI7CisgICAgcmV0dXJuIEZlZWxJdCgpOworCisgICAgLyoqKioqKioqKioqKioqKiogVmVyYmVubGlzdGUgKioqKioqKioqKioqKioqLworICAgIGNhc2UgInZlcmIiOgorICAgIGNhc2UgInZlcmJlbiI6CisgICAgSEVMUENIRUNLKCJ2ZXJiIik7CisgICAgTW9yZShTT1VMSEVMUC0+SGVscCgpKTsKKyAgICByZXR1cm4gMTsKKworICAgIC8qKioqKioqKioqKioqKioqIEFkdmVyYmllbnZlcndhbHR1bmcgKioqKioqKioqKioqKioqLworICAgIGNhc2UgImFkdmVyYiI6CisgICAgY2FzZSAiYWR2ZXJiZW4iOgorICAgIGNhc2UgImFkdmVyYmllbiI6IHsgICAvKiBEYXMgaXN0IGRpZSByaWNodGlnZSBGb3JtLCBhYmVyIHdlciB3ZWlzcyBkYXM/ICovCisgICAgc3RyaW5nIGYxLGYyOworICAgIEhFTFBDSEVDSygiYWR2ZXJiIik7CisgICAgaWYgKCFzdHIgfHwgc3RyPT0iIyIgfHwgc3RyPT0iJCIpCisgICAgICByZXR1cm4gemVpZ2VfYWR2ZXJicygoc3RyPT0iIyIgPyAxIDogKHN0cj09IiQiID8gMiA6IDApKSk7CisgICAgaWYgKHNzY2FuZihzdHIsICIlcyAlcyIsIGYxLGYyKT09MikgIHsKKyAgICAgIGYxID0gbG93ZXJfY2FzZShmMSk7IC8vIGtsZWluZ2VzY2hyaWViZW4gc3BlaWNoZXJuLCBzcGFydCBVbXdhbmRsdW5nCisgICAgICBpZiAoZjE9PSIiKQorICAgICAgICBSZXR1cm4oIkhtLCBkYSBtdXNzIHdvaGwgZWluIExlZXJ6ZWljaGVuIHp1IHZpZWwgZ2V3ZXNlbiBzZWluLiBCaXR0ZSAiCisgICAgICAgICAgKyJub2NobWFsLFxuYWJlciBvaG5lIHp1dmllbGUgTGVlcnplaWNoZW4uXG4iKTsKKyAgICAgIGlmIChmMT09Ij8iKSAgeworICAgICAgICBmMiA9IGxvd2VyX2Nhc2UoZjIpOworICAgICAgICBzdHJpbmcgbWF0Y2g7CisgICAgICAgIGlmICgobWF0Y2g9UXVlcnlTdGRBZHZlcmJzKClbZjJdIHx8IHBscl9hZHZlcmJzW2YyXSkpCisgICAgICAgICAgd3JpdGUoIkRpZSBBYmt1ZXJ6dW5nICIrZjIrIiBnZWhvZXJ0IHp1IGRlbSBBZHZlcmI6XG4iK21hdGNoK0xGKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKCJEaWVzZSBBYmt1ZXJ6dW5nIGlzdCBiaXNoZXIgbmljaHQgZGVmaW5pZXJ0LlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgaWYgKFF1ZXJ5U3RkQWR2ZXJicygpW2YxXSkKKyAgICAgICAgUmV0dXJuKCJEaWUgU3RhbmRhcmRhYmt1ZXJ6dW5nZW4ga29lbm5lbiBuaWNodCBuZXUgZGVmaW5pZXJ0ICIKKyAgICAgICAgICArIndlcmRlbi5cbiIpOworICAgICAgaWYgKHNpemVvZihwbHJfYWR2ZXJicyk+PTEwMCkgCisgICAgICB7CisgICAgICAgIHdyaXRlKCJNZWhyIGFscyAxMDAgZWlnZW5lIEFkdmVyYmllbiBrYW5uc3QgRHUgbmljaHQgZGVmaW5pZXJlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmIChwbHJfYWR2ZXJic1tmMV0pICB7CisgICAgICAgIHBscl9hZHZlcmJzW2YxXT1mMjsKKyAgICAgICAgd3JpdGUoIk9LLCBBZHZlcmIgbWl0IGRlciBBYmt1ZXJ6dW5nIFwiIitmMSsiXCIgYXVmIFwiIitmMgorICAgICAgICAgICsiXCIgZ2VzZXR6dC5cbiIpOworICAgICAgfQorICAgICAgZWxzZSAgeworICAgICAgICBpZiAoc2l6ZW9mKGYxKSA+IDYpCisgICAgICAgICAgUmV0dXJuKCJEaWUgQWJrdWVyenVuZyBpc3QgenUgbGFuZywgYml0dGUgbmljaHQgbWVociBhbHMgIgorICAgICAgICAgICAgKyI2IFplaWNoZW4uXG4iKTsKKyAgICAgICAgcGxyX2FkdmVyYnNbZjFdPWYyOworICAgICAgICB3cml0ZSgiT0ssIG5ldWVzIEFkdmVyYiBcIiIrZjIrIlwiIG1pdCBkZXIgQWJrdWVyenVuZyBcIiIrZjErIlwiLlxuIik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgIHN0ciA9IGxvd2VyX2Nhc2Uoc3RyKTsKKyAgICAgIGlmIChRdWVyeVN0ZEFkdmVyYnMoKVtzdHJdKQorICAgICAgICBSZXR1cm4oIkRpZSBTdGFuZGFyZGFkdmVyYmVuIGtvZW5uZW4gbmljaHQgZ2Vsb2VzY2h0IHdlcmRlbi5cbiIpOworICAgICAgZWxzZSBpZiAoIXBscl9hZHZlcmJzW3N0cl0pCisgICAgICAgIFJldHVybigiRHUgaGFzdCBrZWluIEFkdmVyYiBtaXQgZGllc2VyIEFia3Vlcnp1bmcuXG4iCisgICAgICAgICAgKyJTeW50YXg6IGFkdmVyYiwgdW0gZGllIEFkdmVyYmllbiBhbnp1emVpZ2VuLFxuIgorICAgICAgICAgICsiICAgICAgICBhZHZlcmIgIywgdW0gbnVyIERlaW5lIEFkdmVyYmllbiBhbnp1emVpZ2VuLFxuIgorICAgICAgICAgICsiICAgICAgICBhZHZlcmIgJCwgdW0gbnVyIGRpZSBTdGFuZGFyZGFkdmVyYmllbiBhbnp1emVpZ2VuLFxuIgorICAgICAgICAgICsiICAgICAgICBhZHZlcmIgPyA8QWJrdWVyenVuZz4sIHVtIG5hY2h6dXNlaGVuLCBvYiA8QWJrdWVyenVuZz4gIgorICAgICAgICAgICAgKyJkZWZpbmllcnQgaXN0LFxuIgorICAgICAgICAgICsiICAgICAgICBhZHZlcmIgPEFia3Vlcnp1bmc+IDxBZHZlcmI+LCB1bSBkZXIgPEFia3Vlcnp1bmc+IGRhcyAiCisgICAgICAgICAgICArIjxBZHZlcmI+XG4iCisgICAgICAgICAgKyIgICAgICAgICAgICAgICB6dXp1b3JkbmVuLFxuIgorICAgICAgICAgICsiICAgICAgICBhZHZlcmIgPEFia3Vlcnp1bmc+LCB1bSBkYXMgQWR2ZXJiIG1pdCBkZXIgPEFia3Vlcnp1bmc+ICIKKyAgICAgICAgICAgICsienUgbG9lc2NoZW4sXG4iKTsKKyAgICAgIGVsc2UgIHsKKyAgICAgICAgd3JpdGUoIk9LLCBBZHZlcmIgXCIiK3Bscl9hZHZlcmJzW3N0cl0rIlwiIGdlbG9lc2NodC5cbiIpOworICAgICAgICBwbHJfYWR2ZXJicz1tX2NvcHlfZGVsZXRlKHBscl9hZHZlcmJzLCBzdHIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgCisgICAgfQorICB9CisgIHJldHVybigwKTsgIC8vZmFsbHRocm91Z2gKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zb3VsaGVscC5jIGIvc3RkL3BsYXllci9zb3VsaGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTQ4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NvdWxoZWxwLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBwbGF5ZXIvc291bGhlbHAuYyAtLSBIaWxmZSB6dSBkZW4gU291bGtvbW1hbmRvcworLy8KKy8vICRJZDogc291bGhlbHAuYyA3NDIzIDIwMTAtMDItMDcgMjI6NTY6MzhaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpZmRlZiBXRUNLRQorI3VuZGVmIFdFQ0tFCisjZW5kaWYKKyNkZWZpbmUgV0VDS0UKKworc3RhdGljIHN0cmluZyAqd2l6Y21kcywgKnBscmNtZHMsICpnaG9zdGNtZHM7CitzdGF0aWMgbWFwcGluZyBoZWxwOworCitwcml2YXRlIHN0cmluZyBIZWxwVmVyYihzdHJpbmcgdik7Citwcml2YXRlIHN0cmluZyogU29ydEl0KHN0cmluZyAqYXJyKTsKKworCisvKioKKyAgSW5pdGlhbGlzaWVydW5nCisqLwordm9pZCBjcmVhdGUoKSAgeworCXBscmNtZHM9KHsKKwkJInp1Y2siLCAic2NobWllZyIsICJhbnR3b3J0ZSIsICJhcHBsYXVkaWVyZSIsCisJCSJiZXRhc3RlIiwgImNscyIsICJkcmVoZSAoZGFldW1jaGVuKSIsICJkYW5rZSIsCisJCSJkcnVlY2tlIiwgImVycm9ldGUiLCAiZmxpcHBlIiwgImZyYWdlIiwKKwkJImZ1cnplIiwgImdhZWhuZSIsICJnbHVja3NlIiwgImdyaW5zZSIsCisJCSJndWNrIiwgImhhZXRzY2hlbCIsICJoaWNrc2UiLCAiaHVlcGZlIiwKKwkJImh1c3RlIiwgImtldWNoZSIsICJraWNoZXJlIiwgImtsYXRzY2hlIiwKKwkJImtuYWJiZXJlIiwgImtuaWNrc2UiLCAia25pcnNjaGUiLCAia251cnJlIiwKKwkJImtudXRzY2hlIiwgImtvdHplIiwgImt1ZXNzZSIsICJsYWNoZSIsCisJCSJsYWVjaGxlIiwgImxpZWJlIiwgIm5pY2tlIiwgIm5pZXNlIiwKKwkJImdpYiIsICJwZmVpZmUiLCAicnVlbHBzZSIsICJydW56bGUiLAorCQkic2NobW9sbGUiLCAic2NobXVuemxlIiwgInNjaG5pcHBlIiwgInNjaG5hcmNoZSIsCisJCSJzY2hudXJyZSIsICJzY2hyZWllIiwgInNjaHVldHRsZSIsICJzZXVmemUiLAorCQkic2luZ2UiLCAic25pZWZlL3NjaG5pZWZlIiwgInNwdWNrZSIsICJzdGFycmUiLAorCQkic3RhdW5lIiwgInN0aWVyZSIsICJzdG9laG5lIiwgInN0b3NzZSIsCisJCSJzdHJlaWNobGUiLCAidGFuemUiLCAidHJpdHQiLCAidHJvZXN0ZSIsCisJCSJ1bWFybWUiLCAidmVybmVpZ2UiLCAid2Fja2xlIiwgIndhZWx6ZSIsCisJCSJ3ZWluZSIsICJ3aW5rZSIsICJ6d2lua2VyZSIsICJ2ZXJiZW4iLAorCQkiYWVjaHplIiwgImVyYmxlaWNoZSIsICJmbHVjaGUiLCAidmVyZmx1Y2hlIiwKKwkJImtpdHpsZSIsICJuZWluIiwgImRldXRlIiwgLy8gInplaWdlIiwKKwkJImRlbmtlIFt0ZXh0XSIsICJrbnVkZGxlIiwgInRhZXRzY2hlbCIsICJ3dXNjaGVsIiwKKwkJInN0cmVja2UgLi4uIFtkaWVdIHp1bmdlIHJhdXMiLCAia3JhdHoiLAorCQkiZ3J1bW1lbCIsICJqdWJlbCAvIGp1YmxlIC4uLiBbenVdIiwgInd1ZXJnIiwKKwkJImdyYXR1bGllcmUgLyBiZWdsdWVja3d1ZW5zY2hlIiwgInJhZXVzcGVyIiwKKwkJImFyZ2wiLCAicm90ZmwiLCAiZ3J1bnoiLCAia3VzY2hlbCIsICJhdG1lIC4uLiBhdWYiLAorCQkiZnJldWUiLCAic25pZmYiLCAiZ3J1ZWJsZSIsICJib2hyZSAuLi4gW2luIGRlciBuYXNlXSIsCisJCSJwdXR6ZSBbbmFzZV0iLCAiYmliYmVyZSIsICJxdWlldHNjaGUvcXVpZWtlIiwgInNjaGx1Y2h6ZSIsCisJCSJzY2huYXVmZSIsICJzY2huYXViZSIsICJwaGlsb3NvcGhpZXJlIiwgInNhYmJlcmUiLAorCQkic3RpbW1lIFsuLi5dIHp1IiwgImtyaWVjaGUiLCAibXVzdGVyZSIsICJzY2hhZW1lIiwKKwkJInNjaG5hbHplIC4uLiBbenVuZ2VdIiwgInN0YW1wZmUgLi4uIFthdWZdIiwgInppdGllcmUiLCAibG9iZSIsCisJCSJxdWFrZSIsICJyZWliZSAuLi4gW2RpZV0gQXVnZW58SGFlbmRlIiwgInN0dXR6ZSIsICJzY2h3ZWlnZSIsCisJCSJrbG9wZmUiLCAid3VuZGVyZSIsICJzdHVwc2UiLCAiYnJ1bW1lbCIsICJlbnRzY2h1bGRpZ2UiLAorCQkibW9wcGVyIiwgInplaWdlIiwgInRyYWV1bWUiLCAiYmVncnVlc3NlIiwiamFtbWVyIiwKKwl9KTsKKyNpZmRlZiBXRUNLRQorCXBscmNtZHMrPSh7IndlY2tlIn0pOworI2VuZGlmCisJd2l6Y21kcz0oeworCQkia2ljayIsICJzcGxhc2giLCAiZmxhbWUiLAorCX0pOworCWdob3N0Y21kcz0oeworCQkicmFzc2VsL3Jhc3NsZSIsICJoZXVsZSIsICJlcnNjaHJlY2tlIiwKKwl9KTsKKwkvLyBBdWZiYXUgZGVzIGhlbHAtbWFwcGluZ3M6CisJLy8ga2V5ICAgIDogVmVyYiwgd2llIGVzIGluIHNvdWwuYyBpbiBDSEVDS19IRUxQIGdlc2NocmllYmVuIGlzdAorCS8vIGVudHJ5IDE6ICZuID0gWzxOYW1lPl0gICAmYSA9IFs8QWR2ZXJiPl0gICAgJnQ9WzxUZXh0Pn0KKwkvLyAgICAgICAgICAhIGRhbmFjaCBoZWlzc3Qgbm9ldGlnZSBBbmdhYmUsIGFsc28gb2huZSBbXQorCS8vIGVudHJ5IDI6ICZnID0gVmVyaGFlbHQgc2ljaCBiZWkgR2Vpc3Rlcm4gYW5kZXJzCisJLy8gICAgICAgICAgJmEgPSBNYW4ga2FubiAiYWxsZSIgYWxzIFppZWwgYW5nZWJlbgorCS8vICAgICAgICAgICZkID0gRGVmYXVsdGFkdmVyYjsgbXVzcyBhbSBFbmRlIGFuZ2VnZWJlbiB3ZXJkZW4KKwloZWxwPShbCisJCSJ6dWNrIiA6ICImYSBbW21pdCBbZGVuXV0gc2NodWx0ZXJuXSI7ICJHaWJ0IG1hbiBuaWNodCBtaW5kZXN0ZW5zICIKKwkJCSsiXCJzY2h1bHRlcm5cIiBhbiwgc28genVja3QgbWFuIHp1c2FtbWVuLiBEYXMgRGVmYXVsdGFkdmVyYiBnaWx0ICIKKwkJCSsibnVyIGZ1ZXIgZGFzIFNjaHVsdGVyenVja2VuLiZkcmF0bG9zIiwKKwkJInNjaG1pZWciIDogIiZuICZhIjsgIiIsCisJCSJhbnR3b3J0IiA6ICImbiAmdCEiOyAiIiwKKwkJImFwcGxhdWRpZXIiIDogIiZuICZhIjsgIiZnJmEiLAorCQkiYmVncnVlc3MiIDogIiZuISAmYSI7ICIiLAorCQkiYmV0YXN0IiA6ICImbiEgJmEiOyAiIiwKKwkJImJpYmJlciIgOiAiJmEiOyAiIiwKKwkJImJvaHIiIDogIiZhIFtbaW4gW2Rlcl1dIG5hc2VdIjsgIiIsCisJCSJicnVtbWVsIiA6ICImYSB8ICZ0IjsgIiIsCisJCSJjbHMiIDogIiI7ICJMb2VzY2h0IGRlbiBCaWxkc2NoaXJtIGF1ZiB2dDEwMC1rb21wYXRpYmxlbiBUZXJtaW5hbHMuIiwKKwkJImRyZWgiIDogIiZhIFtkYWV1bWNoZW4gfCBkYXVtZW5dIjsgIiIsCisJCSJkYW5rIiA6ICImbiEgJmEiOyAiIiwKKwkJImRydWVjayIgOiAiJm4hICZhIjsgIiZnJmEmZHphZXJ0bGljaCIsCisJCSJlbnRzY2h1bGRpZyIgOiAiJm4gJmEiOyAiIiwKKwkJImVycm9ldCIgOiAiJmEiOyAiJmciLAorCQkiZXJzY2hyZWNrIiA6ICImbiEgJmEiOyAiJmcmZGZ1ZXJjaHRlcmxpY2giLAorCQkiZmxpcHAiIDogIiZhIjsgIiZkdG90YWwiLAorCQkiZnJhZyIgOiAiJm4hW3xdJnQhIjsgIiIsCisJCSJmcmV1IiA6ICImbiAmYSI7ICIiLAorCQkiZnVyeiIgOiAiJmEiOyAiJmdIaW50ZXJsYWVzc3QgZWluZSBkdWZ0aWdlIEVyaW5uZXJ1bmcgaW0gUmF1bS4iLAorCQkiZ2FlaG4iIDogIiZhIjsgIiZnIiwKKwkJImdsdWNrcyIgOiAiJmEiOyAiJmR3aWUgZWluIEh1aG4iLAorCQkiZ3JhdHVsaWVyIiA6ICImbiEgJmEiOyAiIiwKKwkJImdyaW5zIiA6ICImbiAmYSI7ICImZyZhIiwKKwkJImdydWViZWwiIDogIiZhIjsgIiIsCisJCSJncnVtbWVsIiA6ICImYSI7ICIiLAorCQkiZ3VjayIgOiAiJmEiOyAiIiwKKwkJImhhZXRzY2hlbCIgOiAiJm4hICZhIjsgIiZnJmEiLAorCQkiaGlja3MiIDogIiZhIjsgIiZnIiwKKwkJImh1ZXBmIiA6ICImbiAmYSI7ICImZyIsCisJCSJodXN0IiA6ICImbiAmYSI7ICImZyIsCisJCSJqdWJlbCIgOiAiJm4gJmEiOyAiIiwKKwkJImphbW1lciIgOiAiJmEiOyAiIiwKKwkJImtldWNoIiA6ICImYSI7ICImZyZkdm9yIEFuc3RyZW5ndW5nIiwKKwkJImtpY2hlciIgOiAiJm4gJmEiOyAiIiwKKwkJImtsYXRzY2giIDogIiZhIjsgIiZnIiwKKwkJImtsb3BmIiA6ICImbiEgJmEiOyAiIiwKKwkJImtuYWJiZXIiIDogIiZuISAmYSI7ICImZyIsCisJCSJrbmlja3MiIDogIiZuICZhIjsgIiZnJmEiLAorCQkia25pcnNjaCIgOiAiJmEiOyAiJmciLAorCQkia251cnIiIDogIiZuICZhIjsgIiZhIiwKKwkJImtudXRzY2giIDogIiZuISAmYSI7ICImZyIsCisJCSJrb3R6IiA6ICImbiAmYSI7ICImZyIsCisJCSJrcmllY2giIDogIiZuICZhIjsgIiIsCisJCSJrdWVzcyIgOiAiJm4hICZhIjsgIiZnS2FubiBhdXNzZXJkZW0gYmVpIGJlc3RpbW10ZW4gR2VsZWdlbmhlaXRlbiAiCisJCQkrImdld2lzc2UgTmViZW5lZmZla3RlIGhhYmVuLiIsCisJCSJsYWNoIiA6ICImbiAmYSI7ICImZyZhIiwKKwkJImxhZWNoZWwiIDogIiZuICZhIjsgIiZnJmEiLAorCQkibGllYiIgOiAiJm4hICZhIjsgIiIsCisJCSJsb2IiIDogInsmbiEgJmF9IHwgJnQhIjsgIkthbm4gZWluZW4gTmViZW5lZmZla3QgaGFiZW4uIiwKKwkJIm1vcHBlciIgOiAiJmEiOyAiIiwKKwkJIm11c3RlciIgOiAiJm4hICZhIjsgIiIsCisJCSJuaWNrIiA6ICImbiAmYSI7ICImYSZkenVzdGltbWVuZCIsCisJCSJuaWVzIiA6ICImYSI7ICImZyIsCisJCSJnaWIiIDogIiZuISAmYSBbW2VpbmVdIG9ocmZlaWdlXSI7ICImZyZhIiwKKwkJInBmZWlmIiA6ICImbiAmYSBbbmFjaF0iOyAiJmcmZGFuZXJrZW5uZW5kIiwKKwkJInBoaWxvc29waGllciIgOiAiJmEgfCAmdCI7ICIiLAorCQkicHV0eiIgOiAiJmEgW1tkaWVdIG5hc2VdIjsgIiIsCisJCSJxdWFrIiA6ICImYSI7ICJHZWh0IGFscyBGcm9zY2ggd2VzZW50bGljaCBiZXNzZXIuIiwKKwkJInF1aWVrIiA6ICImYSI7ICImZHZlcmdudWVndCIsCisJCSJyYWV1c3BlciIgOiAiJmEiOyAiIiwKKwkJInJlaWIiIDogIiZhIFtbZGllXSBBdWdlbl0gfCBbW2RpZV0gSGFlbmRlXSI7ICJPaG5lIHdlaXRlcmUgQW5nYWJlIHJlaWJ0ICIKKwkJCSsibWFuIHNpY2ggZGllIEF1Z2VuOyZkbXVlZGUgYnp3LiB2ZXJnbnVlZ3QiLAorCQkicnVlbHBzIiA6ICImYSI7ICImZyIsCisJCSJydW56ZWwiIDogIiZhIjsgIiZnIiwKKwkJInNhYmJlciIgOiAiJm4gJmEiOyAiIiwKKwkJInNjaGFlbSIgOiAiJmEiOyAiIiwKKwkJInNjaGx1Y2h6IiA6ICImYSI7ICImZGhlcnp6ZXJyZWlzc2VuZCIsCisJCSJzY2htb2xsIiA6ICImYSI7ICImZyIsCisJCSJzY2htdW56ZWwiIDogIiZhIjsgIiIsCisJCSJzY2huYWx6IiA6ICImYSBbW21pdCBbZGVyXV0genVuZ2VdIjsgIiIsCisJCSJzY2huYXViIiA6ICImYSI7ICImZGVudHJ1ZXN0ZXQiLAorCQkic2NobmF1ZiIgOiAiJmEiOyAiJmR2b3IgQW5zdHJlbmd1bmciLAorCQkic2NobmlwcCIgOiAiJmEiOyAiJmciLAorCQkic2NobmFyY2giIDogIiZhIjsgIiZnJmRsYXV0IiwKKwkJInNjaG5pZWYiIDogIiZhIjsgIiZnIiwKKwkJInNjaG51cnIiIDogIiZhIjsgIiZkenVmcmllZGVuIiwKKwkJInNjaHJlaSIgOiAiJm4gJmEiOyAiJmciLAorCQkic2NodWV0dGVsIiA6ICImbiAmYSI7ICImZyZhSGF0IGVpbmVuIFVudGVyc2NoaWVkLCBqZSBuYWNoZGVtLCBvYiBlaW4gTmFtZSIKKwkJCSsiIGFuZ2VnZWJlbiB3dXJkZSBvZGVyIG5pY2h0LiIsCisJCSJzY2h3ZWlnIiA6ICImYSI7ICIiLAorCQkic2V1ZnoiIDogIiZhIjsgIiZnIiwKKwkJInNpbmciIDogIiZhIHwgJnQiOyAiIiwKKwkJInNuaWZmIiA6ICImbiAmYSI7ICImZHRyYXVyaWciLAorCQkic3B1Y2siIDogIiZuICZhIjsgIiZnIiwKKwkJInN0YW1wZiIgOiAiJmEiOyAiIiwKKwkJInN0YXJyIiA6ICImbiAmYSI7ICJTdGFuZGFyZGFkdmVyYiBnaWx0IGhpZXIgbnVyIGJlaSBBbmdhYmUgZWluZXMgTmFtZW5zLiIKKwkJCSsiJmR2ZXJ0cmFldW10IiwKKwkJInN0YXVuIiA6ICImbiAmYSI7ICIiLAorCQkic3RpZXIiIDogIiZuICZhIjsgIiZnIiwKKwkJInN0aW1tIiA6ICImbiAmYSI7ICIiLAorCQkic3RvZWhuIiA6ICImYSI7ICImZyIsCisJCSJzdG9zcyIgOiAiJm4hICZhIjsgIiZnIiwKKwkJInN0cmVpY2hlbCIgOiAiJm4hICZhIjsgIiZnJmEiLAorCQkic3R1cHMiIDogIiZuISAmYSI7ICIiLAorCQkic3R1dHoiIDogIiZhIjsgIiIsCisJCSJ0YW56IiA6ICImbiAmYSI7ICImZyIsCisJCSJ0cmFldW0iIDogInsmbiAmYX0gfCAmdCI7ICJFcyBrb2VubmVuIFByb2JsZW1lIGF1ZnRyZXRlbiwgd2VubiBlaW4gQWR2ZXJiIgorCQkJKyIgaW4gZnJlaWVtIFRleHQgZXJrYW5udCB3aXJkLiBUZXh0IHdpcmQgZ2VuYXUgc28gYW4gXCJ0cmFldW0ocyl0XCIgIgorCQkJKyJhbmdlaGFlbmd0LCB3aWUgZXIgYW5nZWdlYmVuIHd1cmRlLiIsCisJCSJ0cml0dCIgOiAiJm4gJmEiOyAiJmcmYSIsCisJCSJ0cm9lc3QiIDogIiZuISAmYSI7ICIiLAorCQkidW1hcm0iIDogIiZuISAmYSI7ICImZyZhIiwKKwkJInZlcm5laWciIDogIiZuICZhIjsgIiZnJmEiLAorCQkid2Fja2VsIiA6ICImYSBbbWl0ICZ0IV0iOyAiJmdNYW4ga2FubiBtaXQgYWxsZW0gbW9lZ2xpY2hlbSB3YWNrZWxuLiIsCisJCSJ3YWVseiIgOiAiJmEiOyAiJmR2b3IgTGFjaGVuIiwKKwkJIndhcnQiIDogIiZuICZhIjsgIk1hbiBrYW5uIGF1ZiBhbGxlcyBtb2VnbGljaGUgd2FydGVuICh3YXJ0ZSBhbGxlcyAiCisJCQkrIm1vZWdsaWNoZSkiLAorCQkid2VjayIgOiAiJm4geyZhIHwgJnR9IjsgIlBpZXBzdCA8TmFtZT4gYW4gdW5kIHNlbmRldCBpaG0gZ2dmLiBkZW4gVGV4dC4iLAorCQkid2VpbiIgOiAiJm4gJmEiOyAiJmciLAorCQkid2luayIgOiAiJm4gJmEiOyAiJmEiLAorCQkid3VlcmciIDogIiZuICZhIjsgIiIsCisJCSJ3dW5kZXIiIDogIiZuICZhIjsgIiIsCisJCSJ6ZWlnIiA6ICI8T2JqZWt0LUlEPiI7ICImYVplaWd0IGRhcyBPYmpla3QgKExhbmdiZXNjaHJlaWJ1bmcpLiIsCisJCSJ6aXRpZXIiIDogIiZuICZhIjsgIkhpZXIgdWViZXJuaW1tdCBkYXMgQWR2ZXJiIGdnZi4gZGllIFN0ZWxsZSBkZXMgIgorCQkJKyJ6aXRpZXJ0ZW4sIHdlbm4gZGllc2VyIG5pY2h0IGFud2VzZW5kIGlzdCAoeml0aWVyZSBKYSAvSm9mKSIsCisJCSJ6aXR0ZXIiIDogIiZhIjsgIiIsCisJCSJ6d2lua2VyIiA6ICImbiAmYSI7ICImZyIsCisJCSJhZWNoeiIgOiAiJmEiOyAiIiwKKwkJImFyZ2wiIDogIiZhIjsgIiIsCisJCSJhdG0iIDogIiZhIjsgIiZkZXJsZWljaHRlcnQiLAorCQkiYmV3dW5kZXIiIDogIiZuISAmYSI7ICIiLAorCQkiZXJibGVpY2giIDogIiZhIjsgIiZnIiwKKwkJImZsdWNoIiA6ICImYSI7ICImZyIsCisJCSJncnVueiIgOiAiJmEiOyAiIiwKKwkJImt1c2NoZWwiIDogIiZuISAmYSI7ICImZyIsCisJCSJyb3RmbCIgOiAiJmEiOyAiIiwKKwkJInZlcmZsdWNoIiA6ICJ7Jm4gJmF9IHwgJnQhIjsgIiIsCisJCSJraXR6ZWwiIDogIiZuISAmYSI7ICImZyIsCisJCSJuZWluIiA6ICImYSI7ICImZyIsCisJCSJkZXV0IiA6ICImbiEgJmEiOyAiJmEiLAorCQkiZGVuayIgOiAiJmEgfCAmdCI7ICImZyIsCisJCSJrbnVkZGVsIiA6ICImbiEgJmEiOyAiJmcmYSIsCisJCSJrcmF0eiIgOiAiJmEiOyAiIiwKKwkJInN0cmVjayIgOiAiJm4gJmEgW1tkaWVdIHp1bmdlIHJhdXMiOyAiJmciLAorCQkidGFldHNjaGVsIiA6ICImbiEgJmEiOyAiJmciLAorCQkid3VzY2hlbCIgOiAiJm4hICZhIjsgIiIsCisJCSJyYXNzZWwiIDogIiZhIjsgIiZnJmRmdWVyY2h0ZXJsaWNoIiwKKwkJImhldWwiIDogIiZhIjsgIiZnJmRzY2hhdWVybGljaCIsCisJCSJraWNrIiA6ICImbiAmYSI7ICImZyZhIiwKKwkJInNwbGFzaCIgOiAiJm4hICZhIjsgIiZhIiwKKwkJImZsYW1lIiA6ICImbiEgJmEiOyAiJmcmYSIsCisJCSJya251ZGRlbCIgOiAiJm4hICZhIjsgIk51ciBmdWVyIEZlcm5nZWJyYXVjaCBnZWRhY2h0LiIsCisJCSJyd2luayIgOiAiJm4hICZhIjsgIk51ciBmdWVyIEZlcm5nZWJyYXVjaCBnZWRhY2h0LiIsCisJCSJ2ZXJiIiA6ICIiOyAiTGlzdGV0IGFsbGUgZGVyemVpdCBtb2VnbGljaGVuIFZlcmJlbiBhdWYuIiwKKwkJImFkdmVyYiIgOiAiWyMgfCAkIHwgez8gPEFia3Vlcnp1bmc+fSB8IDxBYmt1ZXJ6dW5nPiBbPEFkdmVyYj5dXSI7CisJCQkiR2VuYXVlcmUgSGlsZmUgbWl0IFwiYWR2ZXJiID9cIiIsCisJXSk7Cit9CisKKy8qKgorICBHaWJ0IGRpZSBIaWxmZSB6dSBlaW5lbSBWZXJiIG9kZXIgZGllIFZlcmJlbnVlYmVyc2ljaHQgenVydWVjaworICBccGFyYW0gdmVyYiAgICJzdHJpbmciICBFaW4gVmVyYiBkZXNzZW4gSGlsZmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLgorICAgICAgICAgICAgICAgIDAgb2RlciAiIiBVZWJlcmJsaWNrc3NlaXRlCisgIFxyZXR1cm4gCVN0cmluZyBkZXIgYW4gZGVuIFNwaWVsZXIgYXVzZ2VnZWJlbiB3ZXJkZW4ga2Fubi4KKyovCitzdHJpbmcgSGVscChzdHJpbmcgdmVyYikgIHsKKwlzdHJpbmcgb3V0OworCWlmICh2ZXJiICYmIHZlcmIhPSIiKQorCQlyZXR1cm4gSGVscFZlcmIodmVyYik7CisJb3V0PSIiOworCW91dCs9YnJlYWtfc3RyaW5nKCJTdGFuZGFyZHZlcmJlbjpcbiIraW1wbG9kZShTb3J0SXQocGxyY21kcyksICIsICIpCisJCSsiLiIsIDc4LCAwLCAxKTsKKwlpZiAoSVNfV0laQVJEKHRoaXNfcGxheWVyKCkpKQorCQlvdXQrPSJcbiIrYnJlYWtfc3RyaW5nKCJNYWdpZXJ2ZXJiZW46XG4iK2ltcGxvZGUoU29ydEl0KHdpemNtZHMpLCAiLCAiKQorCQkJKyIuIiwgNzgsIDAsIDEpOworCWlmICh0aGlzX3BsYXllcigpLT5naG9zdCgpKQorCQlvdXQrPSJcbiIrYnJlYWtfc3RyaW5nKCJHZWlzdGVydmVyYmVuOlxuIitpbXBsb2RlKFNvcnRJdChnaG9zdGNtZHMpLCAiLCAiKQorCQkJKyIuIiwgNzgsIDAsIDEpOworCW91dCs9YnJlYWtfc3RyaW5nKCJcbkFkdmVyYmllbiBrb2VubmVuIGVudHdlZGVyIGluIGRlciBBYmt1ZXJ6dW5nIChiZWkgIgorCQkrImJlcmVpdHMgZGVmaW5pZXJ0ZW4gQWR2ZXJiaWVuKSBvZGVyIG1pdCBcIi88VGV4dD5cIiBhbmdlZ2ViZW4gd2VyZGVuLiAiCisJCSsiQmVpIGRlciB6d2VpdGVuIE1ldGhvZGUgd2lyZCA8VGV4dD4gc28sIHdpZSBlciBhbmdlZ2ViZW4gd3VyZGUsIGFuICIKKwkJKyJTdGVsbGUgZGVzIEFkdmVyYnMgZWluZ2VzZXR6dC4iLCA3OCwgMCwgMSk7CisJb3V0Kz0iXG4iK2JyZWFrX3N0cmluZygiRWluZSBrdXJ6ZSBIaWxmZSB6dSBlaW5lbSBWZXJiIGJla29tbXN0IGR1IG1pdCBlaW5lbSBkZXIgIgorICAgICAgICAgICAgICAgICsiQmVmZWhsZSBcIjxWZXJiPiAtP1wiLCBcIjxWZXJiPiAvP1wiLCBcIjxWZXJiPiAtaFwiLCBcIjxWZXJiPiAvaFwiIG9kZXIgIgorICAgICAgICAgICAgICAgICsiXCI8VmVyYj4gaGlsZmVcIi4gKERhIHdhciBqZW1hbmQgd2lya2xpY2ggZmxlaXNzaWcpLiIsIDc4KTsKKwlyZXR1cm4gb3V0KyJcbiIrYnJlYWtfc3RyaW5nKCJFaW5pZ2UgQmVmZWhsZSByZWFnaWVyZW4gYXVjaCBhdWYgbGVpY2h0ICIKKwkJKyJ1bnRlcnNjaGllZGxpY2hlIFNjaHJlaWJ3ZWlzZS4gRGllc2UgQmVmZWhsc2xpc3RlIGthbm4gc2ljaCBtaXQgRGVpbmVtICIKKwkJKyJadXN0YW5kIGFlbmRlcm4uIiwgNzgpOworfQorCisvKioKKyAgU29ydGllcnQgZWluIGFycmF5IG9mIHN0cmluZyBhbHBoYWJldGlzY2guIAorICBccGFyYW0gYXJyIERhcyB6dSBzb3J0aWVyZW5kZSBBcnJheQorICBccmV0dXJuICAgIFNvcnRpZXJ0ZSBLb3BpZSBkZXMgQXJyYXlzCisqLworcHJpdmF0ZSBzdHJpbmcqCitTb3J0SXQoc3RyaW5nICphcnIpICB7CisgIHJldHVybiBzb3J0X2FycmF5KGFyciwgCisgICAgICAgICAgIGZ1bmN0aW9uIGludCAoc3RyaW5nIHgsIHN0cmluZyB5KXsgCisgICAgICAgICAgICAgcmV0dXJuIGxvd2VyX2Nhc2UoeCkgPiBsb3dlcl9jYXNlKHkpIDsKKyAgICAgICAgICAgfSAKKyAgICAgICAgICk7Cit9CisKKyNkZWZpbmUgTk9fTU9SRV9FICh7ImNscyIsImZsaXBwIiwiZ3J1ZWJlbCIsImdydW1tZWwiLCJndWNrIiwiaGFldHNjaGVsIixcCisgICJqdWJlbCIsImxhZWNoZWwiLCJnaWIiLCJydW56ZWwiLCJzY2htdW56ZWwiLCJzY2h1ZXR0ZWwiLCJzbmlmZiIsXAorICAic3RyZWljaGVsIiwidHJpdHQiLCAid2Fja2VsIiwiYXJnbCIsInJvdGZsIiwia3VzY2hlbCIsImtpdHplbCIsImtudWRkZWwiLFwKKyAgInRhZXRzY2hlbCIsInd1c2NoZWwiLCJyYXNzZWwiLCJraWNrIiwic3BsYXNoIiwiZmxhbWUiLCJ2ZXJiIiwiYWR2ZXJiIixcCisgICJuZWluIiwiYnJ1bW1lbCIsIm1vcHBlciIsfSkKKworLyoqCisgIEdpYnQgZGllIEhpbGZlIHp1IGVpbmVtIFZlcmIgCisgIFxwYXJhbSB2ICAgICBFaW4gVmVyYiBkZXNzZW4gSGlsZmUgYW5nZXplaWd0IHdlcmRlbiBzb2xsLgorICBccmV0dXJuIAlIaWxmZSB6dW0gVmVyYiBpbiBGb3JtIGVpbmVzIFN0cmluZ3MKKyovCitwcml2YXRlIHN0cmluZworSGVscFZlcmIoc3RyaW5nIHYpICB7CisJc3RyaW5nIGgsdDsKKwlpZiAobWVtYmVyKG1faW5kaWNlcyhoZWxwKSx2KTwwKQorCQlyZXR1cm4gIkRhenUgaXN0IGtlaW5lIEhpbGZlIHZvcmhhbmRlbi5cbiI7CisJaD0iU3ludGF4OlxuKiAiK3Y7CisJaWYgKG1lbWJlcihOT19NT1JFX0UsIHYpPDApCisJCWgrPSJlIjsKKwloKz0iICI7CisJdD1oZWxwW3YsMF07CisJdD1pbXBsb2RlKGV4cGxvZGUodCwiJnQhIiksICI8VGV4dD4iKTsKKwl0PWltcGxvZGUoZXhwbG9kZSh0LCImbiEiKSwgIjxOYW1lPiIpOworCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZ0IiksICJbPFRleHQ+XSIpOworCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZuIiksICJbPE5hbWU+XSIpOworCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZhIiksICJbPEFkdmVyYj5dIik7CisJaCs9dDsKKwl0PWhlbHBbdiwxXTsKKwlpZiAodCE9IiIpICB7CisJCWgrPSJcbkJlbWVya3VuZ2VuOiI7CisJCWlmICgoZXhwbG9kZSh0LCImIikpWzBdIT0iIikKKwkJCXQ9IlxuIiticmVha19zdHJpbmcoKGV4cGxvZGUodCwiJiIpKVswXSwgNzYsICIqICIsIDEpWzAuLjwyXQorCQkJCSsiJiIraW1wbG9kZSgoZXhwbG9kZSh0LCImIikpWzEuLjwxXSwiJiIpOworCQl0PWltcGxvZGUoZXhwbG9kZSh0LCImZyIpLCAiXG4qIFZlcmhhZWx0IHNpY2ggYmVpIEdlaXN0ZXJuIGFuZGVycyAiCisJCQkrImFscyBzb25zdC4iKTsKKwkJdD1pbXBsb2RlKGV4cGxvZGUodCwiJmEiKSwgIlxuKiBCZWkgZGllc2VtIFZlcmIgZ2VodCBhbGxlKG4pIGFscyAiCisJCQkrIlppZWxhbmdhYmUuIik7CisJCWlmIChzdHJzdHIodCwiJmQiKT49MCkgIHsKKwkJCXQ9aW1wbG9kZShleHBsb2RlKHQsIiZkIiksICJcbiogU3RhbmRhcmRhZHZlcmIgaXN0ICIpOworCQkJdCs9Ii4iOworCQl9CisJfQorCXJldHVybiBicmVha19zdHJpbmcoaCt0LCA3OCwgMiwgMSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3RyYXZlbC5jIGIvc3RkL3BsYXllci90cmF2ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTA3YzBhCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci90cmF2ZWwuYwpAQCAtMCwwICsxLDUwNiBAQAorCisvKiAncmVpc2UnIGhhbmRsaW5nCisgKgorICogVWViZXJhcmJlaXRldGUgdW5kIAorICogZXJ3ZWl0ZXJ0ZSBWZXJzaW9uOiBUaWxseUBNb3JnZW5HcmF1ZW4sIDEwLjAxLjAyCisgKiBCYXNpZXJlbmQgYXVmICAgICA6IGJhc2UuY0BTaWxiZXJMYW5kLAorICogICAgICAgICAgICAgICAgICAgICBSZXZpc2lvbiAzLjU1LCBXb29keUBTaWxiZXJMYW5kLCAxMS4wNS45OQorICovICAgCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBzYXZlX3R5cGVzCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIHBlZGFudGljCisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8cGxheWVyLmg+CisjaW5jbHVkZSA8bGl2aW5nL21vdmluZy5oPgorI2luY2x1ZGUgPHRoaW5nL3Byb3BlcnRpZXMuaD4KKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxsaXZpbmcuaD4KKyNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDx0cmFuc3BvcnQuaD4KKwordm9pZCBjcmVhdGUoKXt9CisKK3ByaXZhdGUgc3RyaW5nIF90cmF2ZWxsZXIoc3RyaW5nICpzKQoreworICBzd2l0Y2ggKHNpemVvZihzKSkKKyAgeworICAgIGNhc2UgMSA6IHJldHVybiBzWzBdOworICAgIGNhc2UgMiA6IHJldHVybiBzWzBdKyIgb2RlciAiK3NbMV07CisgIH0KKyAgcmV0dXJuIGVmdW46OmltcGxvZGUoc1swLi48Ml0sIiwgIikrIiBvZGVyICIrc1s8MV07Cit9CisKK3N0YXRpYyBpbnQgcmVpc2Uoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgIHQsIHNoaXAsIGRzdHI7CisgIHN0cmluZyBtaXQsIG5hY2gsIHMxLCBzMjsKKyAgaW50ICAgIGk7CisKKyAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHJlaXNlIG1pdCA8dHJhbnNwb3J0bWl0dGVsPiBuYWNoIDx6aWVsb3J0PlxuXG4iCisgICAgICAgICAgICAgICAiV2VpdGVyZSBTeW50YXhlbiBtb2VnbGljaCwgYml0dGUgJ2hpbGZlIHJlaXNlJyBsZXNlbi5cbiIpOworCisgIHQgPSBRdWVyeVByb3AoUF9UUkFWRUxfSU5GTyk7CisgIAorICBpZiAoIXBvaW50ZXJwKHQpIHx8IChzaXplb2YodCkgPCA0KSB8fCAhb2JqZWN0cCh0WzBdKSB8fCAhb2JqZWN0cCh0WzFdKSkKKyAgeworICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywgdCA9IDApOworICB9CisvKiAqICogKiAKKyAqIFJFSVNFCisgKiAqICogKi8KKyAgaWYgKCFzdHIpCisgIHsKKyAgICBpZiAoIXQpCisgICAgeworICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgUmVpc2Vyb3V0ZSBmZXN0Z2VsZWd0LlxuIik7CisgICAgfQorICAgIGVsc2UgaWYgKHRbMF0gPT0gZW52aXJvbm1lbnQoKSkKKyAgICB7CisgICAgICBpZiAoZW52aXJvbm1lbnQoKS0+aWQoIlRyYW5zcG9ydGVyIikpCisgICAgICB7CisgICAgICAgIHdyaXRlKHNwcmludGYoIkR1IHJlaXN0IG1pdCAlcyVzLlxuIixlbnZpcm9ubWVudCgpLT5uYW1lKFdFTSwxKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzJdPyIgIit0WzNdOiIiKSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlKHNwcmludGYoIkR1IHdpcnN0IG1pdCAlcyVzIHJlaXNlbi5cbiIsdFsxXS0+bmFtZShXRU0sMSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFsyXT8iICIrdFszXToiIikpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHdyaXRlKHNwcmludGYoIkRlaW5lIGxldHp0ZSBSb3V0ZSAobWl0ICVzJXMpIGlzdCBoaWVyIG5pY2h0IHdpcmtzYW0uXG4iLAorICAgICAgICAgICAgICAgICAgICAgdFsxXS0+bmFtZShXRU0sMSksCisgICAgICAgICAgICAgICAgICAgICB0WzJdPyIgIit0WzNdOiIiKSk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgc3RyID0gbG93ZXJfY2FzZSggX3VucGFyc2VkX2FyZ3MoKSApOworLyogKiAqICogKiAqICogCisgKiBSRUlTRSBST1VURQorICogKiAqICogKiAqICovCisgIGlmIChzdHIgPT0gInJvdXRlIikKKyAgeworICAgIHN0cmluZyAqaGFyYm91cnM7CisgICAgCisgICAgaWYgKGVudmlyb25tZW50KCktPmlkKCJUcmFuc3BvcnRlciIpKQorICAgIHsKKyAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9OT19UUkFWRUxJTkcpKQorICAgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICBjYXBpdGFsaXplKGVudmlyb25tZW50KCktPm5hbWUoV0VSLDEpKSsiIGhhdCBnYXIga2VpbmUgIgorICAgICAgICAgIlJlaXNlcm91dGUuIFdvIERpY2ggZGFzIHdvaGwgaGluZnVlaHJ0PyIsNzgpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIGhhcmJvdXJzID0gZW52aXJvbm1lbnQoKS0+UXVlcnlIYXJib3VycygxKTsKKyAgICAgIAorICAgICAgaWYgKCFzaXplb2YoaGFyYm91cnMpIHx8ICFzdHJpbmdwKGhhcmJvdXJzWzBdKSkKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoIkRpZSBSZWlzZXJvdXRlICIrZW52aXJvbm1lbnQoKS0+bmFtZShXRVNTRU4sMSkrIiBpc3QgIgorICAgICAgICAgICAgICsibGVpZGVyIG5pY2h0IGJla2FubnQuXG4iKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUoZWZ1bjo6aW1wbG9kZShoYXJib3VycywiIC0gIikpKyIuIiw3OCwKKyAgICAgICAgICJSZWlzZXJvdXRlICIrZW52aXJvbm1lbnQoKS0+bmFtZShXRVNTRU4sMSkrIjogIixCU19JTkRFTlRfT05DRSkpOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9OT19UUkFWRUxJTkcpKQorICAgIHsKKyAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiSGllciBrYW5uc3QgRHUgbGVpZGVyIGtlaW5lIFJlaXNlcm91dGUgd2FlaGxlbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJXYXMgbmljaHQgaGVpc3N0LCBkYXNzIGhpZXIga2VpbiBUcmFuc3BvcnRtaXR0ZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJrZWhydC4iLDc4KSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFwb2ludGVycChzaGlwID0gVFJBVkVMRC0+SGFzVHJhbnNwb3J0ZXIoZW52aXJvbm1lbnQoKSkpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiSGllciB2ZXJrZWhydCBrZWluIFRyYW5zcG9ydG1pdHRlbC5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3JpdGUoIkhpZXIgdmVya2VocmVuIGZvbGdlbmRlIFRyYW5zcG9ydG1pdHRlbCBcbiIKKyAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxuIik7CisgICAgICAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNoaXApOyBpKyspCisgICAgeyAgICAKKyAgICAgIGlmICghc2hpcFtpXS0+UXVlcnkoUF9TSE9SVCkpIGNvbnRpbnVlOworICAgICAgCisgICAgICBoYXJib3VycyA9IHNoaXBbaV0tPlF1ZXJ5SGFyYm91cnMoMSk7CisKKyAgICAgIGlmIChzaXplb2YoaGFyYm91cnMpICYmIHN0cmluZ3AoaGFyYm91cnNbMF0pKQorICAgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoZWZ1bjo6aW1wbG9kZShoYXJib3VycywiIC0gIikrIi4iLDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpcFtpXS0+UXVlcnkoUF9TSE9SVCkrIjogIixCU19JTkRFTlRfT05DRSkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB3cml0ZShzaGlwW2ldLT5RdWVyeShQX1NIT1JUKSsiOiBSb3V0ZSB1bmJla2FubnQuXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKy8qICogKiAqICogKiAqIAorICogUkVJU0UgQVVTCisgKiBSRUlTRSBOSUNIVAorICogKiAqICogKiAqICovCisgIGlmIChtZW1iZXIoKFsiYXVzIiwibmljaHQiXSksc3RyKSkKKyAgeworICAgIGlmICghdCkKKyAgICB7CisgICAgICB3cml0ZSgiRHUgaGF0dGVzdCBrZWluZSBSZWlzZXJvdXRlIGVpbmdlc3RlbGx0LlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB3cml0ZSgiRHUgbG9lc2Noc3QgRGVpbmUgUmVpc2Vyb3V0ZS5cbiIpOworICAgIH0KKyAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sIDApOworICAgIHJldHVybiAxOworICB9CisKKyAgc3RyID0gcmVncmVwbGFjZShzdHIsIlxcPCh6dXx6dW18enVyfGluc3xhbnMpXFw+IiwibmFjaCIsMCk7CisvKiAqICogKiAqICogKiAqICoKKyAqIFJFSVNFIE1JVCBOQUNICisgKiBSRUlTRSBOQUNIIE1JVAorICogKiAqICogKiAqICogKiAqLworICBpZiAoKHNzY2FuZihzdHIsICJtaXQgJXMgbmFjaCAlcyIsIG1pdCwgbmFjaCkgPT0gMikgfHwKKyAgICAgIChzc2NhbmYoc3RyLCAibmFjaCAlcyBtaXQgJXMiLCBuYWNoLCBtaXQpID09IDIpKQorICB7CisgICAgX25vdGlmeV9mYWlsKCJIaWVyIGthbm5zdCBEdSBsZWlkZXIga2VpbmUgUmVpc2Vyb3V0ZSB3YWVobGVuLlxuIik7CisKKyAgICBpZiAoZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfTk9fVFJBVkVMSU5HKSkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFzaXplb2YobmFjaCkpCisgICAgeworICAgICAgX25vdGlmeV9mYWlsKCJTeW50YXg6IHJlaXNlIG1pdCA8dHJhbnNwb3J0bWl0dGVsPiBuYWNoIDx6aWVsb3J0PlxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAgIHJlaXNlIG5hY2ggPHppZWxvcnQ+IG1pdCA8dHJhbnNwb3J0bWl0dGVsPlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGVudmlyb25tZW50KCktPmlkKCJUcmFuc3BvcnRlciIpKQorICAgIHsKKyAgICAgIGlmIChlbnZpcm9ubWVudCgpLT5pZChtaXQpKQorICAgICAgeworICAgICAgICBjb21tYW5kKCJyZWlzZSBuYWNoICIrbmFjaCk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkJlZW5kZSBlcnN0bWFsIERlaW5lIGFrdHVlbGxlIFJlaXNlIG1pdCAiKworICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KCktPm5hbWUoV0VNLDEpKyIuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmICghcG9pbnRlcnAoc2hpcCA9IFRSQVZFTEQtPkhhc1RyYW5zcG9ydGVyKGVudmlyb25tZW50KCksIG1pdCkpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiU28gZWluIFRyYW5zcG9ydG1pdHRlbCB2ZXJrZWhydCBoaWVyIG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yIChpID0gc2l6ZW9mKHNoaXApIC0xIDsgaSA+PSAwOyBpLS0pCisgICAgICBpZiAoIXNoaXBbaV0tPkhhc1JvdXRlKG5hY2gpKQorICAgICAgeworICAgICAgICBzaGlwW2ldID0gMDsKKyAgICAgIH0KKworICAgIHNoaXAgLT0gKHswfSk7CisKKyAgICBpZiAocG9pbnRlcnAodCkgJiYgb2JqZWN0cCh0WzFdKSAmJiAobWVtYmVyKHNoaXAsdFsxXSkgIT0gLTEpKQorICAgIHsKKyAgICAgIHNoaXAgPSAoeyB0WzFdIH0pOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKHNoaXApID4gMSkKKyAgICB7CisgICAgICBpZiAob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSkgPT0gc2hpcFswXS0+SGFzUm91dGUobmFjaClbMF0pCisgICAgICB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBkYSBiaXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgd3JpdGUoIkRvcnRoaW4ga2FubnN0IER1IG1pdCAiK0NvdW50VXAobWFwX29iamVjdHMoc2hpcCwibmFtZSIsV0VNKSkKKyAgICAgICAgICAgKyJyZWlzZW4uXG4iKTsKKyAKKworICAgICAgZHN0ciA9IGZpbHRlciggZmlsdGVyX29iamVjdHMoc2hpcCwic2hvcnQiKSwgbGFtYmRhKCAoeyd4fSksCisgICAgICAgICAgICAgKHsgIyc9PSwgKHsjJ2Vudmlyb25tZW50LCAneH0pLCBlbnZpcm9ubWVudCgpIH0pICkgKTsKKworICAgICAgaWYgKHNpemVvZihkc3RyKSkKKyAgICAgIHsKKyAgICAgICAgc2hpcCA9IGRzdHJbMF07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHNoaXAgPSBzaGlwWzBdOworICAgICAgfQorCisgICAgICBkc3RyID0gc2hpcC0+SGFzUm91dGUobmFjaCk7CisKKyAgICAgIHdyaXRlKHNwcmludGYoIkR1IGVudHNjaGVpZGVzdCBEaWNoIGZ1ZXIgJXMgdW5kIHJlaXN0ICVzLlxuIiwKKyAgICAgICAgICAgIHNoaXAtPm5hbWUoV0VOLDEpLGRzdHJbMV0pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZW9mKHNoaXApIDwgMSkKKyAgICB7CisgICAgICBfbm90aWZ5X2ZhaWwoIk5hY2ggJyIrY2FwaXRhbGl6ZShuYWNoKSsiJyBrYW5uIERpY2ggZGFzIGFuZ2VnZWJlbmUgIgorICAgICAgICAgICAgICAgICAgKyJUcmFuc3BvcnRtaXR0ZWwgbGVpZGVyIG5pY2h0IGJyaW5nZW4uXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc2hpcCA9IHNoaXBbMF07CisgICAgICBkc3RyID0gc2hpcC0+SGFzUm91dGUobmFjaCk7CisKKyAgICAgIGlmIChvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSA9PSBkc3RyWzBdKQorICAgICAgeworICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGEgYmlzdCBEdSBkb2NoIGJlcmVpdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAodCAmJiBzdHJpbmdwKHRbMl0pKQorICAgICAgeworICAgICAgICBpZiAodFsyXSA9PSBkc3RyWzBdKQorICAgICAgICB7CisgICAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhcyB0dXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICB3cml0ZShzcHJpbnRmKCJPaywgRHUgcmVpc3QgbnVuIG1pdCAlcyAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICBzaGlwLT5uYW1lKFdFTSwxKSxkc3RyWzFdKSk7CisgICAgfQorICAgIGlmIChlbnZpcm9ubWVudChzaGlwKT09ZW52aXJvbm1lbnQoKSAmJiBzaGlwLT5zaG9ydCgpKQorICAgIHsKKyAgICAgIHNoaXAtPkVudGVyKHRoaXNfb2JqZWN0KCkpOworICAgIH0KKyAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sICh7IGVudmlyb25tZW50KCksIHNoaXAsIGRzdHJbMF0sIGRzdHJbMV0gfSkgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorLyogKiAqICogKiAqICoKKyAqIFJFSVNFIE5BQ0gKKyAqICogKiAqICogKiAqLworICBpZiAoc3NjYW5mKHN0ciwibmFjaCAlcyIsbmFjaCkpCisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoIkhpZXIga2FubnN0IER1IGxlaWRlciBrZWluZSBSZWlzZXJvdXRlIHdhZWhsZW4uXG4iKTsKKworICAgIGlmIChlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9OT19UUkFWRUxJTkcpKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZW52aXJvbm1lbnQoKS0+aWQoIlRyYW5zcG9ydGVyIikpCisgICAgeworICAgICAgaWYgKCFkc3RyID0gZW52aXJvbm1lbnQoKS0+SGFzUm91dGUobmFjaCkpCisgICAgICB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiRG9ydGhpbiBrYW5uIERpY2ggIitlbnZpcm9ubWVudCgpLT5uYW1lKFdFUiwxKSsKKyAgICAgICAgICAgICAgICAgICAgICIgbGVpZGVyIG5pY2h0IGJyaW5nZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpZiAodCAmJiBzdHJpbmdwKHRbMl0pKQorICAgICAgeworICAgICAgICBpZiAodFsyXSA9PSBkc3RyWzBdKQorICAgICAgICB7CisgICAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhcyB0dXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgICB3cml0ZShzcHJpbnRmKCJPaywgRHUgcmVpc3QgamV0enQgbWl0ICVzICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoKS0+bmFtZShXRU0sMSksZHN0clsxXSkpOworICAgICAgCisgICAgICBpZiAoSVNfV0laQVJEKHRoaXNfb2JqZWN0KCkpKQorICAgICAgeworICAgICAgICB3cml0ZSgiQWxzIE1hZ2llciBuaW1tc3QgRHUgbmF0dWVybGljaCBkaWUgQWJrdWVyenVuZy5cbiIpOworICAgICAgICBtb3ZlKGRzdHJbMF0sTV9OT0NIRUNLKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sKHsgZW52aXJvbm1lbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0clswXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0clsxXSB9KSApOworCisgICAgICBpZiAob2JqZWN0X25hbWUoZW52aXJvbm1lbnQoc2hpcCA9IGVudmlyb25tZW50KCkpKSA9PSBkc3RyWzBdICYmIAorICAgICAgICAgIHNoaXAtPnNob3J0KCkpCisgICAgICB7CisgICAgICAgIGVudmlyb25tZW50KCktPkxlYXZlKHRoaXNfb2JqZWN0KCkpOworCisgICAgICAgIGlmIChlbnZpcm9ubWVudCgpICE9IHNoaXApCisgICAgICAgIHsKKyAgICAgICAgICBTZXRQcm9wKFBfVFJBVkVMX0lORk8sIDApOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFwb2ludGVycChzaGlwID0gVFJBVkVMRC0+SGFzVHJhbnNwb3J0ZXIoZW52aXJvbm1lbnQoKSkpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiVm9uIGhpZXIgYXVzIGthbm5zdCBEdSBuaWNodCByZWlzZW4uXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSBzaXplb2Yoc2hpcCkgLSAxOyBpID49IDA7IGktLSkKKyAgICAgIGlmICghc2hpcFtpXS0+SGFzUm91dGUobmFjaCkpCisgICAgICB7CisgICAgICAgIHNoaXBbaV0gPSAwOworICAgICAgfQorCisgICAgc2hpcCAtPSAoeyAwIH0pOworIAorICAgIGlmIChwb2ludGVycCh0KSAmJiBvYmplY3RwKHRbMV0pICYmIChtZW1iZXIoc2hpcCx0WzFdKSAhPSAtMSkpCisgICAgeworICAgICAgc2hpcCA9ICh7IHRbMV0gfSk7CisgICAgfQorICAgIGlmIChzaXplb2Yoc2hpcCkgPiAxKQorICAgIHsKKyAgICAgIGlmIChvYmplY3RfbmFtZShlbnZpcm9ubWVudCgpKSA9PSBzaGlwWzBdLT5IYXNSb3V0ZShuYWNoKVswXSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhIGJpc3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICB3cml0ZShicmVha19zdHJpbmcoIkRhaGluIGthbm5zdCBEdSBtaXQgIgorICAgICAgICAgICArX3RyYXZlbGxlcihtYXBfb2JqZWN0cyhzaGlwLCAibmFtZSIsIFdFTSkpKyIgZ2VsYW5nZW4uIiw3OCkpOworCisgICAgICBkc3RyID0gZmlsdGVyKGZpbHRlcl9vYmplY3RzKHNoaXAsInNob3J0IiksbGFtYmRhKCAoeyd4fSksCisgICAgICAgICAgICAoeyAjJz09LCAoeyMnZW52aXJvbm1lbnQsICd4fSksIGVudmlyb25tZW50KCkgfSkgKSApOworCisgICAgICBpZiAoc2l6ZW9mKGRzdHIpKQorICAgICAgeworICAgICAgICBzaGlwID0gZHN0clswXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2hpcCA9IHNoaXBbMF07CisgICAgICB9CisKKyAgICAgIGRzdHIgPSBzaGlwLT5IYXNSb3V0ZShuYWNoKTsKKworICAgICAgd3JpdGUoc3ByaW50ZigiRHUgd2FlaGxzdCAlcyB1bmQgcmVpc3QgJXMuXG4iLHNoaXAtPm5hbWUoV0VOLDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHJbMV0pKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZW9mKHNoaXApIDwgMSkKKyAgICB7CisgICAgICBfbm90aWZ5X2ZhaWwoIk5hY2ggJyIrY2FwaXRhbGl6ZShuYWNoKSsiJyBrYW5uIERpY2ggbGVpZGVyIGtlaW5lcyBkZXIgIgorICAgICAgICAgICAgICAgICAgKyJoaWVyIHZlcmtlaHJlbmRlbiBUcmFuc3BvcnRtaXR0ZWwgYnJpbmdlbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzaGlwID0gc2hpcFswXTsKKyAgICAgIGRzdHIgPSBzaGlwLT5IYXNSb3V0ZShuYWNoKTsKKworICAgICAgaWYgKG9iamVjdF9uYW1lKGVudmlyb25tZW50KCkpID09IGRzdHJbMF0pCisgICAgICB7CisgICAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBkYSBiaXN0IER1IGphIGJlcmVpdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0ICYmIHN0cmluZ3AodFsyXSkpCisgICAgICB7CisgICAgICAgIGlmICh0WzJdID09IGRzdHJbMF0pCisgICAgICAgIHsKKyAgICAgICAgICBfbm90aWZ5X2ZhaWwoIkFiZXIgZGFzIHR1c3QgRHUgZG9jaCBiZXJlaXRzLlxuIik7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdyaXRlKHNwcmludGYoIk9rLCBEdSByZWlzdCBudW4gbWl0ICVzICVzLlxuIixzaGlwLT5uYW1lKFdFTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0clsxXSkpOworICAgIH0KKyAgICBpZiAoSVNfV0laQVJEKHRoaXNfb2JqZWN0KCkpKQorICAgIHsKKyAgICAgIHdyaXRlKCJBbHMgTWFnaWVyIG5pbW1zdCBEdSBuYXR1ZXJsaWNoIGRpZSBBYmt1ZXJ6dW5nLlxuIik7CisgICAgICBtb3ZlKGRzdHJbMF0sTV9OT0NIRUNLKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoZW52aXJvbm1lbnQoc2hpcCk9PWVudmlyb25tZW50KCkgJiYgc2hpcC0+c2hvcnQoKSkKKyAgICB7CisgICAgICBzaGlwLT5FbnRlcih0aGlzX29iamVjdCgpKTsKKyAgICB9CisgICAgU2V0UHJvcChQX1RSQVZFTF9JTkZPLCAoeyBlbnZpcm9ubWVudCgpLCBzaGlwLCBkc3RyWzBdLCBkc3RyWzFdIH0pICk7CisgICAgcmV0dXJuIDE7CisgIH0KKy8qICogKiAqICogKgorICogUkVJU0UgTUlUCisgKiAqICogKiAqICovCisgIGlmIChzc2NhbmYoc3RyLCAibWl0ICVzIiwgbWl0KSkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiSGllciBrYW5uc3QgRHUgbGVpZGVyIGtlaW5lIFJlaXNlcm91dGUgd2FlaGxlbi5cbiIpOworCisgICAgaWYgKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX05PX1RSQVZFTElORykpCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChlbnZpcm9ubWVudCgpLT5pZCgiVHJhbnNwb3J0ZXIiKSkKKyAgICB7CisgICAgICBpZiAoZW52aXJvbm1lbnQoKS0+aWQobWl0KSkKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJBYmVyIGRhcyB0dXN0IER1IGRvY2ggYmVyZWl0cy5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgX25vdGlmeV9mYWlsKCJCZWVuZGUgZXJzdG1hbCBEZWluZSBha3R1ZWxsZSBSZWlzZSBtaXQgIisKKyAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCgpLT5uYW1lKFdFTSwxKSsiLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICBpZiAodCAmJiBvYmplY3RwKHRbMV0pICYmIHRbMV0tPmlkKG1pdCkgJiYgdFswXSA9PSBlbnZpcm9ubWVudCgpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiQWJlciBkYXMgdHVzdCBEdSBkb2NoIGJlcmVpdHMuXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIXBvaW50ZXJwKHNoaXAgPSBUUkFWRUxELT5IYXNUcmFuc3BvcnRlcihlbnZpcm9ubWVudCgpLG1pdCkpKQorICAgIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiU28gZWluIFRyYW5zcG9ydG1pdHRlbCB2ZXJrZWhydCBoaWVyIG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHNpemVvZihzaGlwKSA+IDEpCisgICAgeworICAgICAgd3JpdGUoIiciK2NhcGl0YWxpemUobWl0KSsiJyBrb2VubnRlICIKKyAgICAgICAgICAgICAgICtfdHJhdmVsbGVyKG1hcF9vYmplY3RzKHNoaXAsIm5hbWUiLFdFUikpKyIgc2Vpbi5cbiIpOworCisgICAgICBkc3RyID0gZmlsdGVyKGZpbHRlcl9vYmplY3RzKHNoaXAsInNob3J0IiksbGFtYmRhKCAoeyd4fSksCisgICAgICAgICAgICAoeyAjJz09LCAoeyMnZW52aXJvbm1lbnQsICd4fSksIGVudmlyb25tZW50KCkgfSkgKSApOworCisgICAgICBpZiAoc2l6ZW9mKGRzdHIpKQorICAgICAgeworICAgICAgICBzaGlwID0gZHN0clswXTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgc2hpcCA9IHNoaXBbMF07CisgICAgICB9CisgICAgICB3cml0ZShzcHJpbnRmKCJEdSB3YWVobHN0ICVzLlxuIiwgc2hpcC0+bmFtZShXRU4sMSkpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZW9mKHNoaXApIDwgMSkKKyAgICB7CisgICAgICBub3RpZnlfZmFpbCgiU28gZWluIFRyYW5zcG9ydG1pdHRlbCB2ZXJrZWhydCBoaWVyIG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHNoaXAgPSBzaGlwWzBdOworICAgICAgd3JpdGUoc3ByaW50ZigiRHUgcmVpc3QgbnVuIG1pdCAlcy5cbiIsc2hpcC0+bmFtZShXRU0sMSkpKTsKKyAgICB9CisgICAgaWYgKGVudmlyb25tZW50KHNoaXApPT1lbnZpcm9ubWVudCgpICYmIHNoaXAtPnNob3J0KCkpCisgICAgeworICAgICAgc2hpcC0+RW50ZXIodGhpc19vYmplY3QoKSk7CisgICAgfQorICAgIGlmIChwb2ludGVycCh0KSAmJiBzdHJpbmdwKHRbMl0pICYmIHN0cmluZ3AodFszXSkgJiYKKyAgICAgICAgbWVtYmVyKHNoaXAtPlF1ZXJ5SGFyYm91cnMoKSx0WzJdKSAhPSAtMSkKKyAgICB7CisgICAgICB3cml0ZSgiRHUgYmVoYWVsdHN0IERlaW4gYmlzaGVyaWdlcyBSZWlzZXppZWwgKCIrdFszXSsiKSBiZWkuXG4iKTsKKyAgICAgIFNldFByb3AoUF9UUkFWRUxfSU5GTywgKHsgZW52aXJvbm1lbnQoKSwgc2hpcCwgdFsyXSwgdFszXSB9KSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgU2V0UHJvcChQX1RSQVZFTF9JTkZPLCAoeyBlbnZpcm9ubWVudCgpLCBzaGlwLCAwLCAwIH0pICk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3V0aWwuYyBiL3N0ZC9wbGF5ZXIvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzhmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3V0aWwuYwpAQCAtMCwwICsxLDExMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBsYXllci91dGlsLiAtLSBVdGlsaXRpZXMKKy8vCisvLyAkSWQ6IHV0aWwuYyA2MzcxIDIwMDctMDctMTcgMjI6NDY6NTBaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvdXRpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorCitwdWJsaWMgdm9pZCBTaG93UHJvcExpc3Qoc3RyaW5nICpwcm9wcykgCit7CisgIGludCBpLGo7CisKKyAgaj1zaXplb2YocHJvcHMpOworCisgIGZvciAoIGk9MDsgaTxqIDsgaSsrKSAKKyAgeworICAgIHdyaXRlKCIqIitwcm9wc1tpXSsiOiAiKTsKKyAgICBQcmV0dHlEdW1wKFF1ZXJ5UHJvcChwcm9wc1tpXSkpOworICAgIHdyaXRlKCJcbiIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFByZXR0eUR1bXAobWl4ZWQgeCkgCit7CisgIGlmIChwb2ludGVycCh4KSkgCisgIHsKKyAgICBEdW1wQXJyYXkoeCk7CisgIH0KKyAgZWxzZSBpZiAobWFwcGluZ3AoeCkpCisgIHsKKyAgICBEdW1wTWFwcGluZyh4KTsKKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHgpKSAKKyAgeworICAgIHdyaXRlICgiT0JKKCIrb2JqZWN0X25hbWUoeCkrIikiKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHgpKQorICB7CisgICAgd3JpdGUoIlwiIit4KyJcIiIpOworICB9CisgIGVsc2UKKyAgeworICAgIHdyaXRlICh4KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEdW1wQXJyYXkobWl4ZWQgKngpIAoreworICBpbnQgaSxqOworCisgIHdyaXRlICgiKHsgIik7CisgIGlmICggKGo9c2l6ZW9mKHgpKT4wICkKKyAgeworICAgIGZvciAoIGk9MCA7IGk8KGotMSkgOyBpKyspIAorICAgIHsKKyAgICAgIFByZXR0eUR1bXAoeFtpXSk7CisgICAgICB3cml0ZSgiLCAiKTsKKyAgICB9CisgICAgUHJldHR5RHVtcCh4W2ldKTsKKyAgICB3cml0ZSgiICIpOworICB9CisgIHdyaXRlICgifSkiKTsKK30KKworc3RhdGljIHZvaWQgRHVtcE1hcHBpbmcobWFwcGluZyB4KQoreworICBpbnQgICBpLCBjLCBzOworICBtaXhlZCAqaW5kOworCisgIHdyaXRlKCIoWyAiKTsKKworICBpZiAoIChjPXNpemVvZihpbmQ9bV9pbmRpY2VzKHgpKSk8MSApCisgIHsKKyAgICB3cml0ZSgiIF0pIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcz1nZXRfdHlwZV9pbmZvKHgsMSk7CisKKyAgRHVtcEtleVZhbFBhaXIoeCwgaW5kWzBdLCBzKTsKKyAgZm9yICggaT0xIDsgaTxjIDsgaSsrICkKKyAgeworICAgIHdyaXRlKCIsICIpOworICAgIER1bXBLZXlWYWxQYWlyKHgsIGluZFtpXSwgcyk7CisgIH0KKyAgd3JpdGUoIiBdKSIpOworfQorCisvLyBMYWNodCBuaWNodCB1ZWJlciBkZW4gTmFtZW4hISEgLUJvaW5nCisvLyBOZWluLCB1ZWJlciBkZW4gTmFtZW4gbGFjaGUgaWNoIG5pY2h0IC4uLiAtUGFyYWNlbHN1cworc3RhdGljIHZvaWQgRHVtcEtleVZhbFBhaXIobWFwcGluZyB4LCBtaXhlZCBrZXksIGludCBzaXplKQoreyBpbnQgaiwgdmM7CisKKyAgUHJldHR5RHVtcChrZXkpOworICB3cml0ZSgiIDogIik7CisgIFByZXR0eUR1bXAoeFtrZXksMF0pOworCisgIGZvciAoIGo9MTsgajxzaXplOyBqKyspCisgIHsKKyAgICB3cml0ZSgiOyAiKTsKKyAgICBQcmV0dHlEdW1wKHhba2V5LCBqXSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvdmlld2NtZC5jIGIvc3RkL3BsYXllci92aWV3Y21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3ZTYxOAotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvdmlld2NtZC5jCkBAIC0wLDAgKzEsNzU0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL3ZpZXdjbWQuYyAtLSBwbGF5ZXIgdmlldyBjb21tYW5kIGhhbmRsaW5nCisvLworLy8gJElkOiB2aWV3Y21kLmMgOTU0OCAyMDE2LTA0LTE3IDE5OjI4OjIyWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvbGl2aW5nL3B1dF9hbmRfZ2V0LmgiCisjaW5jbHVkZSAiL3N5cy9saXZpbmcvZGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPGNvbnRhaW5lci5oPgorI2luY2x1ZGUgPHBsYXllci5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxyb29tcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorCisjaW5jbHVkZSA8c3lzX2RlYnVnLmg+CisKK3ZhcmFyZ3MgbWl4ZWQgTW9yZShzdHJpbmcgc3RyLCBpbnQgZmZsYWcsIHN0cmluZyByZXR1cm50byk7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgU2V0KFBfQlJJRUYsIFNBVkUsIEZfTU9ERSk7CisgIFNldChQX0JMSU5ELCBTQVZFLCBGX01PREUpOworfQorCitpbnQgX3RvZ2dsZV9icmllZigpCit7CisgIGludCBicmllZjsKKworICBpZiAocXVlcnlfdmVyYigpPT0ia3VyeiIpCisgICAgYnJpZWY9MTsKKyAgZWxzZSBpZiAocXVlcnlfdmVyYigpPT0idWx0cmFrdXJ6IikKKyAgICBicmllZj0yOworICBlbHNlIGJyaWVmPTA7CisgIFNldFByb3AoUF9CUklFRiwgYnJpZWYpOworICB3cml0ZSgiRHUgYmlzdCBudW4gaW0gXCIiKworICAgICAgICAoYnJpZWY/KGJyaWVmPT0xPyJLdXJ6IjoiVWx0cmFrdXJ6Iik6IkxhbmciKSsiXCJtb2R1cy5cbiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgc29ydGludihtaXhlZCBhLCBtaXhlZCBiKSB7IHJldHVybiBhWzBdID4gYlswXTsgfQorCitwcml2YXRlIHN0cmluZyBjb2xsZWN0aW52KG1peGVkIG9iaikKK3sKKyAgaWYob2JqWzBdPT0iIikgcmV0dXJuIDA7CisgIHJldHVybiAob2JqWzJdID8gIiAiIDogIiIpCisgICAgICAgKyBvYmpbMF0KKyAgICAgICArIChvYmpbMV0gPiAxID8gIiAoIitvYmpbMV0rIikiIDogIiIpOworfQorCisjZGVmaW5lIElfQVVUT0xPQUQgICAgICAxCisjZGVmaW5lIElfS0VFUCAgICAgICAgICA0CisjZGVmaW5lIElfRk9STUFUVEVEICAgICAxNgorI2RlZmluZSBJX0FSTU9VUiAgICAgICAgNjQKKyNkZWZpbmUgSV9TT1JUICAgICAgICAgIDI1NgorI2RlZmluZSBJX1dFQVBPTiAgICAgICAgMTAyNAorI2RlZmluZSBJX0ZPUkNFX1NPUlQgICAgNDA5NgorI2RlZmluZSBJX05PX1RBQkxFICAgICAgMTYzODQKKworcHJpdmF0ZSBzdHJpbmcgZ2V0ZmxhZ3Moc3RyaW5nIGFyZywgaW50IGZsYWdzKQoreworICBpbnQgbm8sIGk7CisgIGlmKHNpemVvZihhcmcpIDwgMikgcmV0dXJuIDA7CisgIG5vID0gKGFyZ1swXSA9PSAnLScpOworCisgIGZvcihpID0gMTsgaSA8IHNpemVvZihhcmcpOyBpKyspCisgIHsKKyAgICBzd2l0Y2goYXJnW2ldKQorICAgIHsKKyAgICBjYXNlICdhJzogZmxhZ3MgfD0gSV9BVVRPTE9BRCA8PCBubzsgYnJlYWs7CisgICAgY2FzZSAnYic6IGZsYWdzIHw9IElfS0VFUCA8PCBubzsgYnJlYWs7CisgICAgY2FzZSAnZic6IGZsYWdzIHw9IElfRk9STUFUVEVEIDw8IG5vOyBicmVhazsKKyAgICBjYXNlICdyJzogZmxhZ3MgfD0gSV9BUk1PVVIgPDwgbm87IGJyZWFrOworICAgIGNhc2UgJ3MnOiBmbGFncyB8PSBJX1NPUlQgPDwgbm87IGJyZWFrOworICAgIGNhc2UgJ3cnOiBmbGFncyB8PSBJX1dFQVBPTiA8PCBubzsgYnJlYWs7CisgICAgY2FzZSAndic6IGZsYWdzIHw9IChJX0FSTU9VUiB8IElfV0VBUE9OKSA8PCAhbm87IGJyZWFrOworICAgIGNhc2UgJzEnOiBmbGFncyB8PSBJX05PX1RBQkxFOyBicmVhazsKKyAgICAgICAgLy8gRGllIE9wdGlvbiBtYWNodCBudXIgQWVyZ2VyIHVuZCBrb21tZW50aWVydCBpc3Qgc2llIGVoIG5pY2h0LgorICAgICAgICAvLyBXZXIgZGFzIGRyaW5nZW5kIGJyYXVjaHQsIHNvbGwgV2FyZ29ucyBTY2hpZWJlcHV6emxlIGJlbnV0emVuLgorICAgICAgICAvLworICAgICAgICAvLyBUaWFtYWssIDE1LjEwLjIwMDAKKyAgICAgICAgLy8gICAgY2FzZSAnUyc6IGZsYWdzIHw9IElfRk9SQ0VfU09SVCA8PCBubzsgYnJlYWs7CisgICAgZGVmYXVsdCA6IHJldHVybiBhcmdbaS4uaV07IC8vIHdpcmQgYXVzZ2VnZWJlbiBhbiBTcGllbGVyIGFscyB1bmJla2FubnQuCisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9jaGVja19rZWVwKG9iamVjdCBvYikKK3sKKyAgcmV0dXJuIChvYi0+UXVlcnlQcm9wKFBfS0VFUF9PTl9TRUxMKSk9PWdldGV1aWQoTUUpOworfQorCitpbnQgX2ludmVudG9yeShzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJncywgb3V0cHV0OworICBpbnQgYW5zaSwgaSwgZmxhZ3MsIG1pbnY7CisgIG1peGVkIGludmVudG9yeSwgd2VhcG9ucywgYXJtb3VycywgbWlzYzsKKyAgc3RyaW5nIGZvcm1hdDsKKworICBpZihDYW5ub3RTZWUoKSkgcmV0dXJuIDE7CisKKyAgaWYoKHN0ciA9IF91bnBhcnNlZF9hcmdzKCkpICYmIHN0ciE9IiIpCisgIHsKKyAgICBzdHJpbmcgZXJyb3I7CisgICAgZXJyb3IgPSAiQmVudXR6dW5nOiBpW252ZW50YXJdIFstLysxYWJmcnN2d11cbiI7CisgICAgYXJncyA9IHJlZ2V4cChyZWdleHBsb2RlKHN0ciwgIlstK11bMWFiZnJzd3ZdWzFhYmZyc3d2XSoiKSwKKyAgICAgICAgICAgICAgICAgICJbLStdWzFhYmZyc3d2XVsxYWJmcnN3dl0qIik7CisgICAgaWYoIXNpemVvZihhcmdzKSkgcmV0dXJuIChfbm90aWZ5X2ZhaWwoZXJyb3IpLCAwKTsKKyAgICBpZihzaXplb2YoYXJncyA9IG1hcChhcmdzLCAjJ2dldGZsYWdzLyonKi8sICZmbGFncykgLSAoeyAwIH0pKSkKKyAgICB7CisgICAgICBwcmludGYoIiVzOiBVbmJla2FubnRlcyBBcmd1bWVudC5cbiIrZXJyb3IsIGltcGxvZGUoYXJncywgIiwgIikpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9CisgIC8vIEZ1ZXIgU3BpZWxlciBnZWhlbiBudXIgc2ljaHRiYXJlIE9iamVrdGUgaW4gZGVuIEFsZ29yaXRobXVzCisgIGlmIChJU19MRUFSTklORyhNRSkpICAKKyAgICBpbnZlbnRvcnkgPSBhbGxfaW52ZW50b3J5KE1FKTsKKyAgZWxzZQorICAgIGludmVudG9yeSA9IGZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkoTUUpLCAic2hvcnQiKTsKKyAgCisgIGFuc2kgPSBtZW1iZXIoKHsidnQxMDAiLCAiYW5zaSJ9KSwgUXVlcnlQcm9wKFBfVFRZKSkgIT0gLTE7CisgIG1pbnYgPSAxIHwgKGZsYWdzICYgKElfRk9STUFUVEVEIHwgKElfRk9STUFUVEVEIDw8IDEpKSA/IDIgOiAwKTsKKyAgZm9ybWF0ID0gKGZsYWdzICYgSV9OT19UQUJMRSkgPyAiPSIgOiAiIyI7CisKKy8vICBpZihmbGFncyAmIChJX0ZPUkNFX1NPUlQgfCBJX0ZPUkNFX1NPUlQgPDwgMSkpCisvLyAgeworLy8gICAgY2xvc3VyZSBzZjsKKy8vICAgIHNmID0gZmxhZ3MgJiBJX0ZPUkNFX1NPUlQgPyAjJz4gOiAjJzw7CisvLyAgICBzID0gc29ydF9hcnJheShzLCBsYW1iZGEoKHsnYSwgJ2J9KSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnZnVuY2FsbCwgc2YsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ3x8LCh7IydjYWxsX290aGVyLCdhLCJzaG9ydCJ9KSwiIn0pLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7Iyd8fCwoeyMnY2FsbF9vdGhlciwnYiwic2hvcnQifSksIiJ9KX0pKSk7CisvLyAgICBtYXBfb2JqZWN0cyhzLCAibW92ZSIsIHRoaXNfb2JqZWN0KCkpOworLy8gICAgcyA9IGFsbF9pbnZlbnRvcnkoTUUpOworLy8gIH0KKworICBpZiAoZmxhZ3MgJiBJX0FVVE9MT0FEKQorICAgIGludmVudG9yeSA9IGZpbHRlcl9vYmplY3RzKGludmVudG9yeSwiUXVlcnlQcm9wIixQX0FVVE9MT0FET0JKKTsKKyAgZWxzZSBpZiAoZmxhZ3MgJiAoSV9BVVRPTE9BRCA8PCAxKSkKKyAgICBpbnZlbnRvcnkgLT0gZmlsdGVyX29iamVjdHMoaW52ZW50b3J5LCJRdWVyeVByb3AiLFBfQVVUT0xPQURPQkopOworCisgIGlmKGZsYWdzICYgSV9LRUVQKQorICAgIGludmVudG9yeSA9IGZpbHRlcihpbnZlbnRvcnksIydfY2hlY2tfa2VlcCk7CisgIGVsc2UgaWYoZmxhZ3MgJiAoSV9LRUVQIDw8IDEpKQorICAgIGludmVudG9yeSAtPSBmaWx0ZXIoaW52ZW50b3J5LCMnX2NoZWNrX2tlZXApOworCisgIGFybW91cnMgPSBmaWx0ZXJfb2JqZWN0cyhpbnZlbnRvcnksICJRdWVyeVByb3AiLCBQX0FSTU9VUl9UWVBFKTsKKyAgLy8gS2xlaWR1bmcgZGF6dSBhZGRpZXJlbiwgdm9yaGVyIGRpZSBlcmthbm50ZW4gUnVlc3R1bmdlbiBhYnppZWhlbiwgZGllCisgIC8vIG11ZXNzZW4gbmljaHQgbm9jaG1hbCBkdXJjaGl0ZXJpZXJ0IHdlcmRlbi4KKyAgYXJtb3VycyArPSBmaWx0ZXJfb2JqZWN0cyhpbnZlbnRvcnktYXJtb3VycywgIklzQ2xvdGhpbmciKTsKKyAgLy8gUnVlc3R1bmdlbiB3ZXJkZW4gaGllciBuaWNodCBhYmdlem9nZW4sIHdlaWwgZXMgS3JhbSBnaWJ0LCB3ZWxjaGUgc293b2hsCisgIC8vIFJ1ZXN0dW5nIGFscyBhdWNoIFdhZmZlIGlzdC4KKyAgd2VhcG9ucyA9IGZpbHRlcl9vYmplY3RzKGludmVudG9yeSwgIlF1ZXJ5UHJvcCIsIFBfV0VBUE9OX1RZUEUpOworICBtaXNjID0gaW52ZW50b3J5IC0gd2VhcG9ucyAtIGFybW91cnM7IC8vIHJlc3QgOy0pCisKKyAgaWYoZmxhZ3MgJiBJX1dFQVBPTikKKyAgeworICAgIGludmVudG9yeSA9IHdlYXBvbnM7IG1pc2MgPSAoe30pOworICAgIGlmKCEoZmxhZ3MgJiAoSV9BUk1PVVIpKSkgYXJtb3VycyA9ICh7fSk7CisgIH0KKyAgaWYoZmxhZ3MgJiBJX0FSTU9VUikKKyAgeworICAgICBpbnZlbnRvcnkgPSBhcm1vdXJzOyBtaXNjID0gKHt9KTsKKyAgICAgaWYoIShmbGFncyAmIElfV0VBUE9OKSkgd2VhcG9ucyA9ICh7fSk7CisgIH0KKyAgaWYoZmxhZ3MgJiAoSV9XRUFQT04gPDwgMSkpIHsgd2VhcG9ucyA9ICh7fSk7IGludmVudG9yeSA9IGFybW91cnMgKyBtaXNjOyB9CisgIGlmKGZsYWdzICYgKElfQVJNT1VSIDw8IDEpKSB7IGFybW91cnMgPSAoe30pOyBpbnZlbnRvcnkgPSB3ZWFwb25zICsgbWlzYzsgfQorCisgIG91dHB1dCA9ICIiOworICBpZihmbGFncyAmIChJX0ZPUk1BVFRFRCB8IChJX0ZPUk1BVFRFRCA8PCAxKSkpCisgIHsKKyAgICBpbnZlbnRvcnkgPSBtYWtlX2ludmxpc3QodGhpc19wbGF5ZXIoKSwgaW52ZW50b3J5LCBtaW52KTsKKyAgICBpZihmbGFncyAmIChJX1NPUlQgfCAoSV9TT1JUIDw8IDEpKSkKKyAgICBpbnZlbnRvcnkgPSBzb3J0X2FycmF5KGludmVudG9yeSwgIydzb3J0aW52LyonKi8pOworICAgIG91dHB1dCArPSBzcHJpbnRmKCIlIitmb3JtYXQrIi03OHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZShtYXAoaW52ZW50b3J5LCMnY29sbGVjdGludi8qJyovKSwiXG4iKSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYod2VhcG9ucyAmJiBzaXplb2Yod2VhcG9ucykpCisgICAgeworICAgICAgd2VhcG9ucyA9IG1ha2VfaW52bGlzdCh0aGlzX3BsYXllcigpLCB3ZWFwb25zLCBtaW52KTsKKyAgICAgIGlmKGZsYWdzICYgKElfU09SVCB8IChJX1NPUlQgPDwgMSkpKQorICAgICAgICB3ZWFwb25zID0gc29ydF9hcnJheSh3ZWFwb25zLCAjJ3NvcnRpbnYvKicqLyk7CisgICAgICBvdXRwdXQgKz0gKGFuc2k/QU5TSV9CT0xEOiIiKSArICJXYWZmZW46IiArIChhbnNpP0FOU0lfTk9STUFMOiIiKSsiXG4iCisgICAgICAgICAgICAgICsgc3ByaW50ZigiJSIrZm9ybWF0KyItNzhzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbG9kZShtYXAod2VhcG9ucywgIydjb2xsZWN0aW52LyonKi8pLCAiXG4iKSk7CisgICAgfQorICAgIGlmKGFybW91cnMgJiYgc2l6ZW9mKGFybW91cnMpKQorICAgIHsKKyAgICAgIGFybW91cnMgPSBtYWtlX2ludmxpc3QodGhpc19wbGF5ZXIoKSwgYXJtb3VycywgbWludik7CisgICAgICBpZihmbGFncyAmIChJX1NPUlQgfCAoSV9TT1JUIDw8IDEpKSkKKyAgICAgICAgYXJtb3VycyA9IHNvcnRfYXJyYXkoYXJtb3VycywgIydzb3J0aW52LyonKi8pOworICAgICAgb3V0cHV0ICs9IChhbnNpP0FOU0lfQk9MRDoiIikgCisgICAgICAgICAgICAgICsgIktsZWlkdW5nICYgUnVlc3R1bmdlbjoiICsgKGFuc2k/QU5TSV9OT1JNQUw6IiIpKyJcbiIKKyAgICAgICAgICAgICAgKyBzcHJpbnRmKCIlIitmb3JtYXQrIi03OHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKG1hcChhcm1vdXJzLCAjJ2NvbGxlY3RpbnYvKicqLyksICJcbiIpKTsKKyAgICB9CisgICAgaWYobWlzYyAmJiBzaXplb2YobWlzYykpCisgICAgeworICAgICAgbWlzYyA9IG1ha2VfaW52bGlzdCh0aGlzX3BsYXllcigpLCBtaXNjLCBtaW52KTsKKyAgICAgIGlmKGZsYWdzICYgKElfU09SVCB8IChJX1NPUlQgPDwgMSkpKQorICAgICAgICBtaXNjID0gc29ydF9hcnJheShtaXNjLCAjJ3NvcnRpbnYvKicqLyk7CisgICAgICBvdXRwdXQgKz0gKGFuc2k/QU5TSV9CT0xEOiIiKSArICJWZXJzY2hpZWRlbmVzOiIgKyAoYW5zaT9BTlNJX05PUk1BTDoiIikrIlxuIgorICAgICAgICAgICAgICArIHNwcmludGYoIiUiK2Zvcm1hdCsiLTc4c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcGxvZGUobWFwKG1pc2MsICMnY29sbGVjdGludi8qJyovKSwgIlxuIikpOworICAgIH0KKyAgfQorCisgIC8vIFNwaWVsZXJ3dW5zY2g6ICdpbnZlbnRhcicgc29sbHRlIGRvY2ggZGFzIEJlenVnc29iamVrdCBhdWYgZGVuIFNwaWVsZXIKKyAgLy8gYWVuZGVybi4KKyAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIHRoaXNfb2JqZWN0KCkpOworCisgIGlmIChvdXRwdXQ9PSIiKSAKKyAgICBvdXRwdXQgKz0gKGFuc2k/QU5TSV9CT0xEOiIiKSsiRGllIExpc3RlIGlzdCBsZWVyLiIrKGFuc2k/QU5TSV9OT1JNQUw6IiIpOworICBNb3JlKG91dHB1dCk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIG5vc2F2ZSBpbnQgZXhhX2NudDsKK3ByaXZhdGUgbm9zYXZlIGludCBleGFfdGltZTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqZXhhOworCit2YXJhcmdzIGludCBfZXhhbWluZShzdHJpbmcgc3RyLCBpbnQgbW9kZSkKK3sKKyAgb2JqZWN0IGJhc2UsICpvYmpzLCBlbnY7CisgIHN0cmluZyB3aGF0LCBkZXRhaWwsIHBhcmVudCwgb3V0LCBlcnJvcjsKKyAgaW50IGksIHNpemUsIGRvbmU7CisKKyAgaWYoQ2Fubm90U2VlKCkpIHJldHVybiAxOworCisgIF9ub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIHVudGVyc3VjaGVuP1xuIik7CisgIGlmICghc3RyKSByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKCh7ImJvZGVuIiwiZGVja2UiLCJ3YW5kIiwid2FlbmRlIn0pLG9sZF9leHBsb2RlKHN0ciwiICIpWzBdKSA9PSAtMSkgeworICAgIGV4YV9jbnQgLT0gKHRpbWUoKSAtIGV4YV90aW1lKS8yOworICAgIGV4YV90aW1lID0gdGltZSgpOworICAgIGV4YV9jbnQrKzsKKyAgICBpZiAoIWV4YSkKKyAgICAgIGV4YSA9ICh7IHN0ciB9KTsKKyAgICBlbHNlCisgICAgICBleGEgKz0gKHsgc3RyIH0pOworICAgIGlmIChleGFfY250ID4gMTApIHsKKyAgICAgIGxvZ19maWxlKCJBUkNIL0xPT0siLCAKKyAgICAgICAgICBzcHJpbnRmKCIlczogJXMgaW4gJXNcbiVAT1xuIixkdGltZSh0aW1lKCkpLGdldHVpZCh0aGlzX29iamVjdCgpKSwgCisgICAgICAgICAgICBlbnZpcm9ubWVudCgpID8gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoKSkgOiAiPz8/IixleGEpLCAxNTAwMDApOworICAgICAgZXhhX2NudCA9IDA7CisgICAgICBleGEgPSAoe30pOworICAgIH0KKyAgICBlbHNlIGlmIChleGFfY250IDwgMCkgeworICAgICAgZXhhX2NudCA9IDA7CisgICAgICBleGEgPSAoe30pOworICAgIH0KKyAgfQorICAvLyBkbyB3ZSBsb29rIGF0IGFuIG9iamVjdCBpbiBvdXIgZW52aXJvbm1lbnQgPworICBpZiAoc3NjYW5mKHN0ciwiJXMgaW4gcmF1bSIsIHdoYXQpIHx8IHNzY2FuZihzdHIsIiVzIGltIHJhdW0iLCB3aGF0KSkKKyAgICAgIGJhc2UgPSBlbnZpcm9ubWVudCgpOworICAvLyBpcyB0aGUgb2JqZWN0IGluc2lkZSBvZiBtZSAoaW52ZW50b3J5KQorICBlbHNlIGlmIChzc2NhbmYoc3RyLCIlcyBpbiBtaXIiLCB3aGF0KSB8fCBzc2NhbmYoc3RyLCIlcyBpbiBkaXIiLCB3aGF0KSkKKyAgICAgIGJhc2UgPSB0aGlzX29iamVjdCgpOworICBlbHNlIHsKKyAgICAgIHdoYXQgPSBzdHI7CisgICAgICAvLyBnZXQgdGhlIGxhc3Qgb2JqZWN0IHdlIGxvb2tlZCBhdAorICAgICAgYmFzZSA9IFF1ZXJ5UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QpOworICAgICAgCisgICAgICAvLyBpZiBhIHJlZmVyZW5jZSBvYmplY3QgZXhpc3RzLCB0ZXN0IGZvciBpdHMgZXhpc3RhbmNlIGluIHRoZSByb29tCisgICAgICAvLyBvciBpbiBvdXIgaW52ZW50b3J5CisgICAgICBpZiAob2JqZWN0cChiYXNlKSkKKyAgICAgIHsKKyAgICAgICBpZiAoYmFzZSA9PSBlbnZpcm9ubWVudCgpIHx8IGJhc2U9PXRoaXNfb2JqZWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBVbWdlYnVuZyBvZGVyIFNwaWVsZXIgc2VsYmVyIHNpbmQgYWxzIEJlenVnc29iamVrdCBpbW1lciBpbgorICAgICAgICAgIC8vIE9yZG51bmcsIG5pY2h0cyBtYWNoZW4uCisgICAgICAgIH0KKyAgICAgICAgLy8gRGFzIFJlZmVyZW56b2JqZWt0IGRhcmYgbmljaHQgdW5zaWNodGJhciBzZWluLgorICAgICAgICBlbHNlIGlmICghYmFzZS0+c2hvcnQoKSkKKyAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgZWxzZSBpZihtZW1iZXIoZGVlcF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSksIGJhc2UpICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgZm9yZWFjaChlbnYgOiBhbGxfZW52aXJvbm1lbnQoYmFzZSkpIHsKKyAgICAgICAgICAgIC8vIElzdCBlaW5lIFVtZ2VidW5nIExpdmluZyBvZGVyIGludHJhbnNwYXJlbnRlciBDb250YWluZXIgb2RlcgorICAgICAgICAgICAgLy8gdW5zaWNodGJhcj8KKyAgICAgICAgICAgIGlmIChsaXZpbmcoZW52KSB8fCAhZW52LT5RdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkKKyAgICAgICAgICAgICAgICB8fCAhZW52LT5zaG9ydCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBpbiBkZW0gRmFsbCBpc3QgZW5kZSwgYWJlciB3ZW5uIGRhcyBnZWZ1bmRlbmUgRW52IG5pY2h0CisgICAgICAgICAgICAgIC8vIGRpZXNlcyBMaXZpbmcgc2VsYmVyIG9kZXIgc2VpbiBFbnYgaXN0LCB3aXJkIGRhcworICAgICAgICAgICAgICAvLyBSZWZlcmVuem9iamVrdCB6dXNhZXR6bGljaCBnZW51bGx0LgorICAgICAgICAgICAgICBpZiAoZW52ICE9IHRoaXNfb2JqZWN0KCkgJiYgZW52ICE9IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAgICAgYmFzZSA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgYmFzZSA9IDA7IC8vIG5pY2h0IGltIFJhdW0gb2RlciBJbnZlbnRvcnkKKyAgICAgIH0KKyAgfQorCisgIC8vIHNjYW4gaW5wdXQgaWYgd2Ugd2FudCBhIHNwZWNpZmljIG9iamVjdCB0byBsb29rIGF0CisgIGlmKHNzY2FuZih3aGF0LCAiJXMgYW4gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMiB8fAorICAgICBzc2NhbmYod2hhdCwgIiVzIGFtICVzIiwgZGV0YWlsLCBwYXJlbnQpID09IDIgfHwKKyAgICAgc3NjYW5mKHdoYXQsICIlcyBpbiAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyIHx8CisgICAgIHNzY2FuZih3aGF0LCAiJXMgaW0gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMikKKyAgeworICAgIC8vIGlmIGFuIHJlZiBvYmplY3QgZXhpc3RzIGdldCBpdHMgaW52ZW50b3J5LiAoT2JlbiB3dXJkZSBzaWNoZXJnZXN0ZWxsdCwKKyAgICAvLyBkYXNzIGRhcyBSZWZlcmVuem9iamVrdCBlaW5zZWhiYXIgaXN0KQorICAgIGlmKGJhc2UpCisgICAgICBvYmpzID0gYmFzZS0+bG9jYXRlX29iamVjdHMocGFyZW50LCAxKSB8fCAoe30pOworICAgIGVsc2UgeworICAgICAgLy8gZWxzZSBnZXQgb3VyIGludiBhbmQgZW52CisgICAgICBvYmpzID0gZW52aXJvbm1lbnQoKS0+bG9jYXRlX29iamVjdHMocGFyZW50LCAxKQorICAgICAgICAgICArIGxvY2F0ZV9vYmplY3RzKHBhcmVudCwgMSk7CisgICAgfQorICAgIG9ianMgPSBmaWx0ZXJfb2JqZWN0cyhvYmpzLCAic2hvcnQiKTsgLy8gbnVyIHNpY2h0YmFyZS4uLgorICAgIGlmKHNpemVvZihvYmpzKSA+IDEpCisgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJFcyBnaWJ0IG1laHIgYWxzIGVpbmUobikgIitjYXBpdGFsaXplKHBhcmVudCkrIi5cbiIpLCAwKTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKHNpemVvZihvYmpzKSkKKyAgICAgICAgYmFzZSA9IG9ianNbMF07CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAobm90aWZ5X2ZhaWwoIkhpZXIgaXN0IGtlaW4oZSkgIitjYXBpdGFsaXplKHBhcmVudCkrIi5cbiIpLCAwKTsKKyAgICB9CisgICAgb2JqcyA9IDA7CisgIH0KKyAgZWxzZSBkZXRhaWwgPSB3aGF0OworCisgIGludCBiYXNlX3dhc19lbnYgPSAxOworICBkbyB7CisgICAgLy8gaWYgYSBiYXNlIGV4aXN0cyBnZXQgaXRzIGludmVudG9yeSwgZWxzZSBnZXQgb3VyIGludiBhbmQgZW52CisgICAgaWYgKGJhc2UpCisgICAgeworICAgICAgaWYgIChiYXNlID09IHRoaXNfb2JqZWN0KCkgfHwgYmFzZSA9PSBlbnZpcm9ubWVudCgpIHx8CisgICAgICAgICAgKGJhc2UtPlF1ZXJ5UHJvcChQX1RSQU5TUEFSRU5UKSAmJiAhbGl2aW5nKGJhc2UpKSkKKyAgICAgIHsKKyAgICAgICAgLy8gaWNoIGthbm4gaW4gYmFzZSByZWluZ3Vja2VuLi4uCisgICAgICAgIG9ianMgPSBiYXNlLT5sb2NhdGVfb2JqZWN0cyhkZXRhaWwsIDEpIHx8ICh7fSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIFJlZmVyZW56b2JqZWt0IGRhLCBhYmVyIG5pY2h0IHJlaW5ndWNrYmFyLiBiYXNlIGFiZXIgbmljaHQgbnVsbGVuLAorICAgICAgICAvLyBkZW5uIGVzIGlzdCBqYSBub2NoIGd1ZWx0aWcgZnVlciBEZXRhaWxzdWNoZW4gYW4gYmFzZS4uLgorICAgICAgICBvYmpzID0gKHt9KTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG9ianMgPSBlbnZpcm9ubWVudCgpLT5sb2NhdGVfb2JqZWN0cyhkZXRhaWwsIDEpCisgICAgICAgICAgICsgbG9jYXRlX29iamVjdHMoZGV0YWlsLCAxKTsKKyAgICAgIGJhc2UgPSBlbnZpcm9ubWVudCgpOworICAgIH0KKyAgICBvYmpzID0gZmlsdGVyX29iamVjdHMob2JqcywgInNob3J0Iik7IC8vIG51ciBzaWNodGJhcmUuLi4KKworICAgIGlmKCFzaXplb2Yob2JqcykpCisgICAgeworICAgICAgLy8gd2VubiBrZWluZSBPYmpla3RlIGdlZnVuZGVuIHd1cmRlbiwgd2lyZCBuYWNoIERldGFpbHMgZ2VzdWNodC4uLgorICAgICAgaWYoKG91dCA9IGJhc2UtPkdldERldGFpbChkZXRhaWwsIFF1ZXJ5UHJvcChQX1JFQUxfUkFDRSksU0VOU0VfVklFVykpIHx8CisgICAgICAgICAob3V0ID0gYmFzZS0+R2V0RG9vckRlc2MoZGV0YWlsKSkpCisgICAgICB7CisgICAgICAgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCBiYXNlKTsKKyAgICAgICAgcmV0dXJuICh3cml0ZShvdXQpLCAxKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gd2VubiBhdWNoIGtlaW5lIERldGFpbHMgZ2VmdW5kZW4sIGRhbm4gc2NoYXVlbiwgb2IgRW5kZSBpc3QKKyAgICAgICAgLy8gKGJhc2U9PWVudikgb2RlciB3aXIgZXZ0bC4gbm9jaCBpbSBlbnYgc3VjaGVuIGtvZW5uZW4uCisgICAgICAgIGlmIChiYXNlID09IGVudmlyb25tZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYmFzZV93YXNfZW52KSB7CisgICAgICAgICAgICAvLyBpbiBkaWVzZW0gRmFsbCB3YXIgZGFzIEVudiBkYXMgQmV6dWdzb2JqZWt0IC0gZGFoZXIgd2Vnd2VyZmVuLgorICAgICAgICAgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIDApOworICAgICAgICAgICAgX25vdGlmeV9mYWlsKCJTb3dhcyBzaWVoc3QgRHUgZGEgbmljaHQhXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfbm90aWZ5X2ZhaWwoIlNvd2FzIHNpZWhzdCBEdSBhdWNoIGRhIG5pY2h0IVxuIik7CisgICAgICAgICAgICAvLyBpbiBkaWVzZW0gRmFsbCB3YXIgbmljaHQgZGFzIEVudiBkYXMgQmV6dWdzb2JqZWt0IC0gZXMgc29sbAorICAgICAgICAgICAgLy8gYmVoYWx0ZW4gdW5kIG5pY2h0IGdlbG9lc2NodCB3ZXJkZW4uCisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGJhc2Vfd2FzX2Vudj0wOworICAgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRHUgZmluZGVzdCBhbiAiK2Jhc2UtPm5hbWUoV0VNKQorICAgICAgICAgICAgICAgICsiIGtlaW4gXCIiICsgY2FwaXRhbGl6ZShkZXRhaWwpICsgIlwiLiIKKyAgICAgICAgICAgICAgICAgIiBEZWluIEJsaWNrIHdlbmRldCBzaWNoIGRlciBVbWdlYnVuZyB6dS4iLDc4KSk7CisgICAgICAgICAgYmFzZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLy8gT2JqZWt0ZSBnZWZ1bmRlbiEKKyAgICAgIGRvbmUgPSAxOworICB9IHdoaWxlKCFkb25lKTsKKworICAvLyBFcyBtdXNzIG1pbi4gZWluIChzaWNodGJhcmVzKSBPYmpla3QgZ2ViZW4sIHNvbnN0IHdhZXJlIG1hbiBoaWVyIG5pY2h0CisgIC8vIGhpbmdla29tbWVuLgorICBvYmplY3Qgb2IgPSBvYmpzWzBdOworICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgb2IpOworICB0ZWxsX29iamVjdChNRSwgb2ItPmxvbmcobW9kZSkpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgX3NlbnNlX2V4YShzdHJpbmcgc3RyKQoreworICBvYmplY3QgYmFzZSwgKm9ianMsIGVudjsKKyAgc3RyaW5nIHdoYXQsIGRldGFpbCwgcGFyZW50LCBvdXQsIGVycm9yOworICBpbnQgc2Vuc2U7CisKKyAgaWYobWVtYmVyKCh7InJpZWNoIiwicmllY2hlIiwic2NobnVwcGVyIiwic2NobnVwcGVyZSJ9KSxxdWVyeV92ZXJiKCkpIT0tMSkKKyAgeworICAgIF9ub3RpZnlfZmFpbCgiRHUga2FubnN0IG5pY2h0cyBCZXNvbmRlcmVzIHJpZWNoZW4uXG4iKTsKKyAgICBzZW5zZSA9IFNFTlNFX1NNRUxMOworICB9CisgIGVsc2UgaWYobWVtYmVyKCh7ImxhdXNjaGUiLCJsYXVzY2giLCJob2VyIiwiaG9lcmUifSkscXVlcnlfdmVyYigpKSE9LTEpCisgIHsKKyAgICBpZihRdWVyeVByb3AoUF9ERUFGKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiRHUgYmlzdCB0YXViIVxuIiksIDA7CisKKyAgICBfbm90aWZ5X2ZhaWwoIkR1IGthbm5zdCBuaWNodHMgQmVzb25kZXJlcyBob2VyZW4uXG4iKTsKKyAgICBzZW5zZSA9IFNFTlNFX1NPVU5EOworICB9CisgIGVsc2UgaWYobWVtYmVyKCh7InRhc3RlIiwiYmVydWVocmUiLCJiZXJ1ZWhyIn0pLHF1ZXJ5X3ZlcmIoKSkhPS0xKQorICB7CisgICAgc2Vuc2UgPSBTRU5TRV9UT1VDSDsKKyAgICAvLyBlaW4gImFiIiBnYW56IGFtIEVuZGUgdm9uIHN0ciB3aXJkIGFiZ2VzY2huaXR0ZW4sIGVzIHNvbGwgc293b2hsICJ0YXN0ZQorICAgIC8vIHggYWIiIGFscyBhdWNoICJ0YXN0ZSB4IiBmdW5rdGlvbmllcmVuLgorICAgIGlmIChzdHIpIHsKKyAgICAgIF9ub3RpZnlfZmFpbCgiU293YXMga2FubnN0IER1IGhpZXIgbmljaHQgZXJ0YXN0ZW4hXG4iKTsKKyAgICAgIHN0cmluZyAqdG1wID0gZXhwbG9kZShzdHIsIiAiKTsKKyAgICAgIGlmIChzaXplb2YodG1wKSA+IDEgJiYgdG1wWzwxXSA9PSAiYWIiKQorICAgICAgICBzdHIgPSBpbXBsb2RlKHRtcFswLi48Ml0sICIgIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgIF9ub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW5uIGFidGFzdGVuP1xuIik7CisgIH0KKyAgZWxzZSBpZiAobWVtYmVyKCh7ImxpZXMiLCJsZXNlIiwibGVzIn0pLCBxdWVyeV92ZXJiKCkpID4gLTEpCisgIHsKKyAgICBfbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgbGVzZW4/XG4iKTsKKyAgICBpZiAoICFzdHIgKSAvLyBLZWluIFNFTlNFX0RFRkFVTFQgenVsYXNzZW4uCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAodGhpc19vYmplY3QoKS0+Q2Fubm90U2VlKCkpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJEdSBrYW5uc3QgbmljaHRzIHNlaGVuIVxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2Vuc2UgPSBTRU5TRV9SRUFEOworICB9CisKKyAgaWYgKCFzdHIpIHsKKyAgICBpZighZGV0YWlsID0KKyAgICAgICAgZW52aXJvbm1lbnQoKS0+R2V0RGV0YWlsKFNFTlNFX0RFRkFVTFQsUXVlcnlQcm9wKFBfUkVBTF9SQUNFKSxzZW5zZSkpCisgICAgICByZXR1cm4gMDsKKyAgICB3cml0ZShkZXRhaWwpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgaWYoc3NjYW5mKHN0ciwiYW4gJXMiLHdoYXQpPT0xKQorICAgIHN0cj13aGF0OworCisgIC8vIGRvIHdlIGxvb2sgYXQgYW4gb2JqZWN0IGluIG91ciBlbnZpcm9ubWVudCA/CisgIGlmIChzc2NhbmYoc3RyLCIlcyBpbiByYXVtIiwgd2hhdCkgfHwgc3NjYW5mKHN0ciwiJXMgaW0gcmF1bSIsIHdoYXQpKQorICAgICAgYmFzZSA9IGVudmlyb25tZW50KCk7CisgIC8vIGlzIHRoZSBvYmplY3QgaW5zaWRlIG9mIG1lIChpbnZlbnRvcnkpCisgIGVsc2UgaWYgKHNzY2FuZihzdHIsIiVzIGluIG1pciIsIHdoYXQpIHx8IHNzY2FuZihzdHIsIiVzIGluIGRpciIsIHdoYXQpKQorICAgICAgYmFzZSA9IHRoaXNfb2JqZWN0KCk7CisgIGVsc2UgeworICAgICAgd2hhdCA9IHN0cjsKKyAgICAgIC8vIGdldCB0aGUgbGFzdCBvYmplY3Qgd2UgbG9va2VkIGF0CisgICAgICBiYXNlID0gUXVlcnlQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCk7CisgICAgICAKKyAgICAgIC8vIGlmIGEgcmVmZXJlbmNlIG9iamVjdCBleGlzdHMsIHRlc3QgZm9yIGl0cyBleGlzdGFuY2UgaW4gdGhlIHJvb20KKyAgICAgIC8vIG9yIGluIG91ciBpbnZlbnRvcnkKKyAgICAgIGlmIChvYmplY3RwKGJhc2UpKQorICAgICAgeworICAgICAgICBpZiAoYmFzZSA9PSBlbnZpcm9ubWVudCgpIHx8IGJhc2U9PXRoaXNfb2JqZWN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBVbWdlYnVuZyBvZGVyIFNwaWVsZXIgc2VsYmVyIHNpbmQgYWxzIEJlenVnc29iamVrdCBpbW1lciBpbgorICAgICAgICAgIC8vIE9yZG51bmcsIG5pY2h0cyBtYWNoZW4uCisgICAgICAgIH0KKyAgICAgICAgLy8gRGFzIFJlZmVyZW56b2JqZWt0IGRhcmYgbmljaHQgdW5zaWNodGJhciBzZWluLgorICAgICAgICBlbHNlIGlmICghYmFzZS0+c2hvcnQoKSkKKyAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgZWxzZSBpZihtZW1iZXIoZGVlcF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSksIGJhc2UpICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgZm9yZWFjaChlbnYgOiBhbGxfZW52aXJvbm1lbnQoYmFzZSkpIHsKKyAgICAgICAgICAgIC8vIElzdCBlaW5lIFVtZ2VidW5nIExpdmluZyBvZGVyIGludHJhbnNwYXJlbnRlciBDb250YWluZXIgb2RlcgorICAgICAgICAgICAgLy8gdW5zaWNodGJhcj8KKyAgICAgICAgICAgIGlmIChsaXZpbmcoZW52KSB8fCAhZW52LT5RdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkKKyAgICAgICAgICAgICAgICB8fCAhZW52LT5zaG9ydCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBpbiBkZW0gRmFsbCBpc3QgZW5kZSwgYWJlciB3ZW5uIGRhcyBnZWZ1bmRlbmUgRW52IG5pY2h0CisgICAgICAgICAgICAgIC8vIGRpZXNlcyBMaXZpbmcgc2VsYmVyIG9kZXIgc2VpbiBFbnYgaXN0LCB3aXJkIGRhcworICAgICAgICAgICAgICAvLyBSZWZlcmVuem9iamVrdCB6dXNhZXR6bGljaCBnZW51bGx0LgorICAgICAgICAgICAgICBpZiAoZW52ICE9IHRoaXNfb2JqZWN0KCkgJiYgZW52ICE9IGVudmlyb25tZW50KCkpCisgICAgICAgICAgICAgICAgYmFzZSA9IDA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgYmFzZSA9IDA7IC8vIG5pY2h0IGltIFJhdW0gb2RlciBJbnZlbnRvcnkKKyAgICAgIH0KKyAgfQorCisgIC8vIHNjYW4gaW5wdXQgaWYgd2Ugd2FudCBhIHNwZWNpZmljIG9iamVjdCB0byBsb29rIGF0CisgIGlmKHNzY2FuZih3aGF0LCAiJXMgYW4gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMiB8fAorICAgICBzc2NhbmYod2hhdCwgIiVzIGFtICVzIiwgZGV0YWlsLCBwYXJlbnQpID09IDIgfHwKKyAgICAgc3NjYW5mKHdoYXQsICIlcyBpbiAlcyIsIGRldGFpbCwgcGFyZW50KSA9PSAyIHx8CisgICAgIHNzY2FuZih3aGF0LCAiJXMgaW0gJXMiLCBkZXRhaWwsIHBhcmVudCkgPT0gMikKKyAgeworICAgIC8vIGlmIGFuIHJlZiBvYmplY3QgZXhpc3RzIGdldCBpdHMgaW52ZW50b3J5LiAoT2JlbiB3dXJkZSBzaWNoZXJnZXN0ZWxsdCwKKyAgICAvLyBkYXNzIGRhcyBSZWZlcmVuem9iamVrdCBlaW5zZWhiYXIgaXN0KQorCisgICAgaWYoYmFzZSkKKyAgICAgIG9ianMgPSBiYXNlLT5sb2NhdGVfb2JqZWN0cyhwYXJlbnQsIDEpIHx8ICh7fSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIGVsc2UgZ2V0IG91ciBpbnYgYW5kIGVudgorICAgICAgb2JqcyA9IGVudmlyb25tZW50KCktPmxvY2F0ZV9vYmplY3RzKHBhcmVudCwgMSkKKyAgICAgICAgICAgKyBsb2NhdGVfb2JqZWN0cyhwYXJlbnQsIDEpOworICAgIH0KKyAgICBvYmpzID0gZmlsdGVyX29iamVjdHMob2JqcywgInNob3J0Iik7IC8vIG51ciBzaWNodGJhcmUuLi4KKyAgICBpZihzaXplb2Yob2JqcykgPiAxKQorICAgICAgcmV0dXJuIChub3RpZnlfZmFpbCgiRXMgZ2lidCBtZWhyIGFscyBlaW5lKG4pICIrY2FwaXRhbGl6ZShwYXJlbnQpKyIuXG4iKSwgMCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmKHNpemVvZihvYmpzKSkKKyAgICAgICAgICBiYXNlID0gb2Jqc1swXTsKKyAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gKG5vdGlmeV9mYWlsKCJIaWVyIGlzdCBrZWluKGUpICIrY2FwaXRhbGl6ZShwYXJlbnQpKyIuXG4iKSwgMCk7CisgICAgfQorICAgIG9ianMgPSAwOworICB9CisgIGVsc2UgZGV0YWlsID0gd2hhdDsKKworICAvLyB3aWUgYXVjaCBpbW1lciBoYWJlbiB3aXIgamV0enQgZWluIEJlenVnc29iamVrdC4KKyAgaW50IG1heHRyaWVzPTM7CisgIGRvIHsKKyAgICBpbnQgYmFzZV93YXNfZW52PTE7CisgICAgLy8gYWxzIGVyc3RlbiB3ZXJkZW4gaW4gRnJhZ2Uga29tbWVuZGUgT2JqZWt0ZSBnZXN1Y2h0LiBXZW5uIGJhc2UKKyAgICAvLyBleGlzdGllcnQgKGlkUiBudXIgaW0gZXJzdGVuIER1cmNobGF1ZiksIHdpcmQgZG9ydCBnZXN1Y2h0LCBzb25zdCBpbgorICAgIC8vIEVudiB1bmQgSW52LgorICAgIGlmIChiYXNlKQorICAgIHsKKyAgICAgIGlmICAoYmFzZSA9PSB0aGlzX29iamVjdCgpIHx8IGJhc2UgPT0gZW52aXJvbm1lbnQoKSB8fAorICAgICAgICAgIChiYXNlLT5RdWVyeVByb3AoUF9UUkFOU1BBUkVOVCkgJiYgIWxpdmluZyhiYXNlKSkpCisgICAgICB7CisgICAgICAgIC8vIGljaCBrYW5uIGluIGJhc2UgcmVpbmd1Y2tlbi4uLgorICAgICAgICBvYmpzID0gYmFzZS0+bG9jYXRlX29iamVjdHMoZGV0YWlsLCAxKSB8fCAoe30pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAvLyBSZWZlcmVuem9iamVrdCBkYSwgYWJlciBuaWNodCByZWluZ3Vja2Jhci4gYmFzZSBhYmVyIG5pY2h0IG51bGxlbiwKKyAgICAgICAgLy8gZGVubiBlcyBpc3QgamEgbm9jaCBndWVsdGlnIGZ1ZXIgRGV0YWlsc3VjaGVuIGFuIGJhc2UuLi4KKyAgICAgICAgb2JqcyA9ICh7fSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBvYmpzID0gZW52aXJvbm1lbnQoKS0+bG9jYXRlX29iamVjdHMoZGV0YWlsLCAxKQorICAgICAgICAgICArIGxvY2F0ZV9vYmplY3RzKGRldGFpbCwgMSk7CisgICAgICBiYXNlID0gZW52aXJvbm1lbnQoKTsKKyAgICB9CisgICAgb2JqcyA9IGZpbHRlcl9vYmplY3RzKG9ianMsICJzaG9ydCIpOyAvLyBudXIgc2ljaHRiYXJlLi4uCisKKyAgICBpZiAoc2l6ZW9mKG9ianMpKQorICAgIHsKKyAgICAgIC8vIE9iamVrdGUgZ2VmdW5kZW4sIG1hbCBzY2hhdWVuLCBvYiBkaWUgdGF1Z2VuIChkLmguIGZ1ZXIgZGVuIGpldy4gU2lubgorICAgICAgLy8gSW5mb3MgaGFiZW4uIFdlbm4gbmljaHQsIG11ZXNzZW4gd2lyIHdlaXRlcnN1Y2hlbi4KKyAgICAgIC8vIEFiZXIgZXJzdG1hbCBkaWUgT2JqZWt0ZSBkdXJjaGxhdWZlbi4KKyAgICAgIGZvcmVhY2gob2JqZWN0IG9iOiBvYmpzKQorICAgICAgeworICAgICAgICBpZiAoc2Vuc2UgPT0gU0VOU0VfUkVBRCkKKyAgICAgICAgeworICAgICAgICAgIC8vIEV4dHJhd3Vyc3Q6IFBfUkVBRF9NU0cgYXVjaCBub2NoIGFiZnJhZ2VuLgorICAgICAgICAgIG91dCA9IG9iLT5RdWVyeVByb3AoUF9SRUFEX01TRyk7CisgICAgICAgICAgaWYgKCFzdHJpbmdwKG91dCkpCisgICAgICAgICAgICBvdXQgPSBvYi0+R2V0RGV0YWlsKFNFTlNFX0RFRkFVTFQsUXVlcnlQcm9wKFBfUkVBTF9SQUNFKSxTRU5TRV9SRUFEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICAgIG91dD1vYi0+R2V0RGV0YWlsKFNFTlNFX0RFRkFVTFQsUXVlcnlQcm9wKFBfUkVBTF9SQUNFKSxzZW5zZSk7CisgICAgICAgIGlmIChzdHJpbmdwKG91dCkpCisgICAgICAgIHsKKyAgICAgICAgICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgb2IpOworICAgICAgICAgIHRlbGxfb2JqZWN0KE1FLCBvdXQpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gS2VpbmUgT2JqZWt0ZSBnZWZ1bmRlbiwgZGllIGluIEZyYWdlIGtvbW1lbi4gTmFjaCBEZXRhaWxzIHN1Y2hlbi4KKyAgICBpZihvdXQgPSBiYXNlLT5HZXREZXRhaWwoZGV0YWlsLCBRdWVyeVByb3AoUF9SRUFMX1JBQ0UpLHNlbnNlKSkKKyAgICB7CisgICAgICBTZXRQcm9wKFBfUkVGRVJFTkNFX09CSkVDVCwgYmFzZSk7CisgICAgICByZXR1cm4gKHdyaXRlKG91dCksIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gQXVjaCBrZWluZSBEZXRhaWxzIGdlZnVuZGVuLi4uIFdlbm4gd2lyIHVucyBub2NoIGRhcyBFbnYgYW5ndWNrZW4KKyAgICAgIC8vIGtvZW5uZW4gKHdlaWwgYmFzZSAhPSBlbnYpLCBkYW5uIG1hY2hlbiB3aXIgZGFzLCBhbnNvbnN0ZW4gaXN0CisgICAgICAvLyBqZXR6dCBoaWVyIGxlaWRlciBFbmRlLi4uCisgICAgICBpZihiYXNlID09IGVudmlyb25tZW50KCkpCisgICAgICB7CisgICAgICAgIGlmIChiYXNlX3dhc19lbnYpCisgICAgICAgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIDApOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLy8gbm9jaG1hbCBpbSBuYWVjaHN0ZW4gU2NobGVpZmVuZHVyY2hsYXVmIG9obmUgYmFzZSBwcm9iaWVyZW4uCisgICAgICAgIGJhc2UgPSAwOworICAgICAgICBiYXNlX3dhc19lbnYgPSAwOyAKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUoLS1tYXh0cmllcyk7CisKKyAgLy8gbmFjaCBkaWVzZXIgU2NobGVpZmUgc29sbHRlIG1hbiBuaWUgYW5rb21tZW4uLi4KKyAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiX3NlbnNlX2V4YSgpOiB6dXZpZWxlIFZlcnN1Y2hlLCBldHdhcyB6dSBmaW5kZW4uIikpOworCisgIHJldHVybiAwOworfQorCit2YXJhcmdzIGludCBsb29rX2ludG8oc3RyaW5nIHN0cixpbnQgbW9kZSkKK3sKKyAgb2JqZWN0ICpmb3VuZF9vYnM7CisKKyAgaWYoIENhbm5vdFNlZSgpICkgcmV0dXJuIDE7CisgIF9ub3RpZnlfZmFpbCgiV28gd2lsbHN0IER1IGRlbm4gcmVpbnNjaGF1ZW4gP1xuIik7CisgIGZvdW5kX29icz1maW5kX29icyhzdHIsUFVUX0dFVF9OT05FKTsKKyAgaWYgKCFmb3VuZF9vYnMpCisgIHsKKyAgICBpZiAoZW52aXJvbm1lbnQoKSAmJgorICAgICAgICAoZW52aXJvbm1lbnQoKS0+R2V0RGV0YWlsKHN0cixRdWVyeVByb3AoUF9SRUFMX1JBQ0UpKXx8CisgICAgICAgICBlbnZpcm9ubWVudCgpLT5HZXREb29yRGVzYyhzdHIpKSkKKyAgICAgIF9ub3RpZnlfZmFpbCgiRGEga2FubnN0IER1IHNvIG5pY2h0IHJlaW5zZWhlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBfZXhhbWluZShzdHIsIG1vZGUpOworfQorCisvKiBHZWJlIGRpZSBVbWdlYnVuZyBkZXMgYWt0aXZlbiBTcGllbGVycyB6dXJ1ZWNrLCBsYXNzZSBkYWJlaSAgKi8KKy8qIHJla3Vyc2l2IGdlc2NoYWNodGVsdGUgUmFldW1lIHp1LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogV2VubiBhbGxvd19zaG9ydCAwIGlzdCwgc28gd2lyZCBpbW1lciBkaWUgbG9uZy1kZXNjciBiZW51dHp0ICovCit2YXJhcmdzIHN0cmluZyBlbnZfZGVzY3IoaW50IGFsbG93X3Nob3J0LGludCBmbGFncywgaW50IGZvcmNlX3Nob3J0ICkKK3sKKyAgb2JqZWN0IGVudjsKKyAgaW50IGJyaWVmOworCisgIGVudiA9IGVudmlyb25tZW50KE1FKTsKKworICBpZighZW52KQorICAgIHJldHVybiAiRHUgc2Nod2Vic3QgaW0gTmljaHRzIC4uLiBEdSBzaWVoc3QgbmljaHRzLCByZWluIGdhciBuaWNodHMgLi4uXG4iOworCisgIGlmICghZm9yY2Vfc2hvcnQgJiYgKCFhbGxvd19zaG9ydCB8fCAhUXVlcnlQcm9wKFBfQlJJRUYpKSkKKyAgICAgIHJldHVybiBlbnYtPmludF9sb25nKE1FLE1FLGZsYWdzKTsKKworICBpZiAoIWZsYWdzICYmICgoYnJpZWY9UXVlcnlQcm9wKFBfQlJJRUYpKT49MikpCisgICAgICByZXR1cm4gIiI7CisKKyAgcmV0dXJuIGVudi0+aW50X3Nob3J0KE1FLE1FKTsKK30KKworaW50IF9sb29rKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBzOworICBpbnQgZmxhZzsKKworICBpZihDYW5ub3RTZWUoKSkgcmV0dXJuIDE7CisKKyAgaWYoIXN0cikKKyAgeworICAgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCAwKTsKKyAgICB3cml0ZSggZW52X2Rlc2NyKCkgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZihzdHI9PSItZiIgfHwgc3RyPT0iZ2VuYXUiKQorICB7CisgICAgU2V0UHJvcChQX1JFRkVSRU5DRV9PQkpFQ1QsIDApOworICAgIHdyaXRlKCBlbnZfZGVzY3IoMCwyKSApOworICAgIHJldHVybiAxOworICB9CisgIGlmKHN0cj09Ii1rIiB8fCBzdHI9PSJrdXJ6IikKKyAgeworICAgIFNldFByb3AoUF9SRUZFUkVOQ0VfT0JKRUNULCAwKTsKKyAgICB3cml0ZSggZW52X2Rlc2NyKDEsMiwxKSApOworICAgIHJldHVybiAxOworICB9CisgIGlmKHN0clswLi4yXT09Ii1mICIpeworICAgIGZsYWc9MjsKKyAgICBzdHI9c3RyWzMuLl07CisgIH0KKyAgZWxzZSBpZihzdHJbMC4uNV09PSJnZW5hdSAiKXsKKyAgICBmbGFnPTI7CisgICAgc3RyPXN0cls2Li5dOworICB9CisgIGVsc2UgZmxhZyA9IDA7CisgIGlmIChzc2NhbmYoc3RyLCIlcyBhbiIscykpIHN0cj1zOworICBpZiAoc3NjYW5mKHN0ciwiJXMgaW4gbWlyIixzKXx8c3NjYW5mKHN0ciwiJXMgaW4gZGlyIixzKSkgcmV0dXJuIF9leGFtaW5lKHN0cixmbGFnKTsKKyAgaWYgKHNzY2FuZihzdHIsImluICVzIixzKSkgcmV0dXJuIGxvb2tfaW50byhzLGZsYWcpOworICByZXR1cm4gX2V4YW1pbmUoc3RyLGZsYWcpOworfQorCitpbnQgX2VxdWlwbWVudChzdHJpbmcgYXJnKQoreworICBpZiAoQ2Fubm90U2VlKCkpIHJldHVybiAxOworICBjYWxsX290aGVyKCIvc3RkL3BsYXllci9pbnZtYXN0ZXIvaW52bWFzdGVyIiwgIlNob3dJbnYiLCBNRSwgYXJnKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBtaXhlZCBfcXVlcnlfbG9jYWxjbWRzKCkKK3sKKyAgcmV0dXJuCisgICAgKHsoeyJhdXNydWVzdHVuZyIsICJfZXF1aXBtZW50IiwwLDB9KSwKKyAgICAgICh7ImkiLCJfaW52ZW50b3J5IiwwLDB9KSwKKyAgICAgICh7ImludiIsIl9pbnZlbnRvcnkiLDAsMH0pLAorICAgICAgKHsiaW52ZW50dXIiLCJfaW52ZW50b3J5IiwwLDB9KSwKKyAgICAgICh7InNjaGF1IiwiX2xvb2siLDAsMH0pLAorICAgICAgKHsic2NoYXVlIiwiX2xvb2siLDAsMH0pLAorICAgICAgKHsidW50IiwiX2V4YW1pbmUiLDAsMH0pLAorICAgICAgKHsidW50ZXJzdWNoIiwiX2V4YW1pbmUiLDAsMH0pLAorICAgICAgKHsiYmV0cmFjaHQiLCJfZXhhbWluZSIsMCwwfSksCisgICAgICAoeyJ1bnRlcnN1Y2hlIiwiX2V4YW1pbmUiLDAsMH0pLAorICAgICAgKHsiYmV0cmFjaHRlIiwiX2V4YW1pbmUiLDAsMH0pLAorICAgICAgKHsiYmV0ciIsIl9leGFtaW5lIiwwLDB9KSwKKyAgICAgICh7ImxhdXNjaGUiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7ImxhdXNjaCIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsiaG9lciIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsiaG9lcmUiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7ImxpZXMiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7Imxlc2UiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7ImxlcyIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsic2NobnVwcGVyIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJzY2hudXBwZXJlIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJyaWVjaCIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsicmllY2hlIiwiX3NlbnNlX2V4YSIsMCwwfSksCisgICAgICAoeyJ0YXN0ZSIsIl9zZW5zZV9leGEiLDAsMH0pLAorICAgICAgKHsiYmVydWVocmUiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7ImJlcnVlaHIiLCJfc2Vuc2VfZXhhIiwwLDB9KSwKKyAgICAgICh7Imt1cnoiLCJfdG9nZ2xlX2JyaWVmIiwwLDB9KSwKKyAgICAgICh7ImxhbmciLCJfdG9nZ2xlX2JyaWVmIiwwLDB9KSwKKyAgICAgICh7InVsdHJha3VyeiIsIl90b2dnbGVfYnJpZWYiLDAsMH0pIAorICAgIH0pOworfQo=