ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODViMTAKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTM4IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PVwKKwlhZGRydG9uYW1lLmNcCisJYWYuY1wKKwljcGFjay5jXAorCWdtcGxzLmNcCisJb3VpLmNcCisJZ210MmxvY2FsLmNcCisJaXBwcm90by5jXAorCW5scGlkLmNcCisJbDJ2cG4uY1wKKwltYWNoZGVwLmNcCisJcGFyc2VuZnNmaC5jXAorCXByaW50LTgwMl8xMS5jXAorCXByaW50LWFwMTM5NC5jXAorCXByaW50LWFoLmNcCisJcHJpbnQtYXJjbmV0LmNcCisJcHJpbnQtYW9kdi5jXAorCXByaW50LWFycC5jXAorCXByaW50LWFzY2lpLmNcCisJcHJpbnQtYXRhbGsuY1wKKwlwcmludC1hdG0uY1wKKwlwcmludC1iZWVwLmNcCisJcHJpbnQtYmZkLmNcCisJcHJpbnQtYmdwLmNcCisJcHJpbnQtYm9vdHAuY1wKKwlwcmludC1jZHAuY1wKKwlwcmludC1jaGRsYy5jXAorCXByaW50LWNpcC5jXAorCXByaW50LWNuZnAuY1wKKwlwcmludC1kY2NwLmNcCisJcHJpbnQtZGhjcDYuY1wKKwlwcmludC1kZWNuZXQuY1wKKwlwcmludC1kb21haW4uY1wKKwlwcmludC1kdm1ycC5jXAorCXByaW50LWVuYy5jXAorCXByaW50LWVncC5jXAorCXByaW50LWVhcC5jXAorCXByaW50LWVpZ3JwLmNcCisJcHJpbnQtZXNwLmNcCisJcHJpbnQtZXRoZXIuY1wKKwlwcmludC1mZGRpLmNcCisJcHJpbnQtZnIuY1wKKwlwcmludC1mcmFnNi5jXAorCXByaW50LWdyZS5jXAorCXByaW50LWhzcnAuY1wKKwlwcmludC1pY21wLmNcCisJcHJpbnQtaWNtcDYuY1wKKwlwcmludC1pZ21wLmNcCisJcHJpbnQtaWdycC5jXAorCXByaW50LWlwLmNcCisJcHJpbnQtaXA2LmNcCisJcHJpbnQtaXA2b3B0cy5jXAorCXByaW50LWlwY29tcC5jXAorCXByaW50LWlwZmMuY1wKKwlwcmludC1pcHguY1wKKwlwcmludC1pc2FrbXAuY1wKKwlwcmludC1pc29jbG5zLmNcCisJcHJpbnQtanVuaXBlci5jXAorCXByaW50LWtyYi5jXAorCXByaW50LWwydHAuY1wKKwlwcmludC1sYW5lLmNcCisJcHJpbnQtbGRwLmNcCisJcHJpbnQtbGxjLmNcCisJcHJpbnQtbG1wLmNcCisJcHJpbnQtbHNwcGluZy5jXAorCXByaW50LWx3cmVzLmNcCisJcHJpbnQtbW9iaWxlLmNcCisJcHJpbnQtbW9iaWxpdHkuY1wKKwlwcmludC1tcGxzLmNcCisJcHJpbnQtbXNkcC5jXAorCXByaW50LW5mcy5jXAorCXByaW50LW50cC5jXAorCXByaW50LW51bGwuY1wKKwlwcmludC1vbHNyLmNcCisJcHJpbnQtb3NwZi5jXAorCXByaW50LW9zcGY2LmNcCisJcHJpbnQtcGdtLmNcCisJcHJpbnQtcGltLmNcCisJcHJpbnQtcHBwLmNcCisJcHJpbnQtcHBwb2UuY1wKKwlwcmludC1wcHRwLmNcCisJcHJpbnQtcmFkaXVzLmNcCisJcHJpbnQtcmF3LmNcCisJcHJpbnQtcmlwLmNcCisJcHJpbnQtcmlwbmcuY1wKKwlwcmludC1yc3ZwLmNcCisJcHJpbnQtcnQ2LmNcCisJcHJpbnQtcnguY1wKKwlwcmludC1zY3RwLmNcCisJcHJpbnQtc2lwLmNcCisJcHJpbnQtc2wuY1wKKwlwcmludC1zbGwuY1wKKwlwcmludC1zbG93LmNcCisJcHJpbnQtc25tcC5jXAorCXByaW50LXN0cC5jXAorCXByaW50LXN1bmF0bS5jXAorCXByaW50LXN1bnJwYy5jXAorCXByaW50LXN5bWFudGVjLmNcCisJcHJpbnQtc3lzbG9nLmNcCisJcHJpbnQtdGNwLmNcCisJcHJpbnQtdGVsbmV0LmNcCisJcHJpbnQtdGZ0cC5jXAorCXByaW50LXRpbWVkLmNcCisJcHJpbnQtdG9rZW4uY1wKKwlwcmludC11ZHAuY1wKKwlwcmludC12amMuY1wKKwlwcmludC12cnJwLmNcCisJcHJpbnQtd2IuY1wKKwlwcmludC16ZXBoeXIuY1wKKwlzZXRzaWduYWwuY1wKKwl0Y3BkdW1wLmNcCisJdXRpbC5jXAorCXZlcnNpb24uY1wKKwlwcmludC1zbWIuY1wKKwlzbWJ1dGlsLmNcCisJbWlzc2luZy9zdHJsY2F0LmNcCisJbWlzc2luZy9zdHJsY3B5LmMKKworTE9DQUxfQ0ZMQUdTOj0tTzIgLWcKK0xPQ0FMX0NGTEFHUys9LURIQVZFX0NPTkZJR19IIC1EX1VfPSJfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSIKKworTE9DQUxfQ19JTkNMVURFUys9XAorCSQoTE9DQUxfUEFUSCkvbWlzc2luZ1wKKwlleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGVcCisJZXh0ZXJuYWwvbGlicGNhcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTKz1saWJzc2wKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUys9bGlicGNhcAorCitMT0NBTF9NT0RVTEVfVEFHUzo9dGVzdHMKKworTE9DQUxfTU9EVUxFOj10Y3BkdW1wCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvQ0hBTkdFUyBiL0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyOWUzMAotLS0gL2Rldi9udWxsCisrKyBiL0NIQU5HRVMKQEAgLTAsMCArMSw4NzggQEAKKyRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL0NIQU5HRVMsdiAxLjg3LjIuMTcgMjAwNy8wOS8xMyAxMzozOTo0NCBrZW4gRXhwICQKKworTW9uLglTZXB0ZW1iZXIgMTAsIDIwMDcuICBrZW5AeGVsZXJhbmNlLmNvbS4gIFN1bW1hcnkgZm9yIDAuOS44IHRjcGR1bXAgcmVsZWFzZQorCVJld29yayBBUlAgcHJpbnRlcgorCVJld29yayBPU1BGdjMgcHJpbnRlcgorCUFkZCBzdXBwb3J0IGZvciBGcmFtZS1SZWxheSBBUlAKKwlEZWNvZGUgREhDUCBPcHRpb24gMTIxIChSRkMgMzQ0MiBDbGFzc2xlc3MgU3RhdGljIFJvdXRlKQorCURlY29kZSBESENQIE9wdGlvbiAyNDkgKE1TIENsYXNzbGVzcyBTdGF0aWMgUm91dGUpIHRoZSBzYW1lIGFzIE9wdGlvbiAxMjEKKwlUTFY6IEFkZCBzdXBwb3J0IGZvciBKdW5pcGVyIC5wY2FwIGV4dGVuc2lvbnMKKwlQcmludCBFR1AgaGVhZGVyIGluIG5ldy13b3JsZC1vcmRlciBzdHlsZQorCUNvbnZlcnRlZCBwcmludC1pc2FrbXAuYyB0byBORVRESVNTRUNUCisJTW92ZWQgQUYgc3BlY2lmaWMgc3R1ZmYgaW50byBhZi5oCisJVGVzdCBzdWJzeXN0ZW0gbm93IHRhYmxlIGRyaXZlbiwgYW5kIHNhdmVzIG91dHB1dHMgYW5kIGRpZmZzIHRvIG9uZSBwbGFjZQorICAgICAgICBSZXF1aXJlIDxuZXQvcGZ2YXIuaD4gZm9yIHBmIGRlZmluaXRpb25zIC0gYWxsb3dzIHJlYWRpbmcgb2YgcGZsb2cgZm9ybWF0dGVkIAorICAgICAgICAgbGlicGNhcCBmaWxlcyBvbiBhbiBPUyBvdGhlciB0aGFuIHdoZXJlIHRoZSBmaWxlIHdhcyBnZW5lcmF0ZWQKKworV2VkLglKdWx5IDIzLCAyMDA3LiAgbWNyQHhlbGVyYW5jZS5jb20uICBTdW1tYXJ5IGZvciAwLjkuNyB0Y3BkdW1wIHJlbGVhc2UKKworICAgIAlORlM6IFByaW50IHVuc2lnbmVkIHZhbHVlcyBhcyBzdWNoLiAKKwlSWDogcGFyc2Ugc2FmZWx5LgorCUJHUDogZml4ZXMgZm9yIElQdjYtbGVzcyBidWlsZHMuCisJODAxLjFhZzogdXNlIHN0YW5kYXJkIGNvZGVwb2ludC4KKwl1c2UgL2Rldi9icGYgb24gc3lzdGVtcyB3aXRoIHN1Y2ggYSBkZXZpY2UuCisJODAyLjExOiBwcmludCBRb1MgZGF0YSwgYXZvaWQgZGlzc2VjdCBvZiBuby1kYXRhIGZyYW1lLCBpZ25vcmUgcGFkZGluZy4KKwlzbWI6IG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmVuJ3QgZ29uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIGNhcHR1cmVkIGRhdGEuCisJc21iOiBzcXVlbGNoIGFuIHVuaW5pdGlhbGl6ZWQgY29tcGxhaW50IGZyb20gY292ZXJpdHkuCisJTkZTOiBmcm9tIE5ldEJTRDsgZG9uJ3QgaW50ZXJwcmV0IHRoZSByZXBseSBhcyBhIHBvc3NpYmxlIE5GUyByZXBseQorCQlpZiBpdCBnb3QgTVNHX0RFTklFRC4KKwlCR1A6IGRvbid0IHByaW50IFRMViB2YWx1ZXMgdGhhdCBkaWRuJ3QgZml0LCBmcm9tIHd3dy5kaWdpdC1sYWJzLm9yZy4gCisJcmV2aXNlZCBJTlNUQUxMLnR4dCBhYm91dCBsaWJwY2FwIGRlcGVuZGFuY3kuCisKK1dlZC4JQXByaWwgMjUsIDIwMDcuIGtlbkB4ZWxlcmFuY2UuY29tLiAgU3VtbWFyeSBmb3IgMy45LjYgdGNwZHVtcCByZWxlYXNlCisJVXBkYXRlIG1hbiBwYWdlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byBsaWJwY2FwCisJQ2hhbmdlcyB0byBib3RoIFRDUCBhbmQgSVAgUHJpbnRlciBPdXRwdXQKKwlGaXggYSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IGluIHRoZSA4MDIuMTEgcHJpbnRlcgorCVByaW50IGJhc2ljIGluZm8gYWJvdXQgYSBmZXcgbW9yZSBDaXNjbyBMQU4gcHJvdG9jb2xzLgorCW1ETlMgY2xlYW51cAorCUlDTVAgTVBMUyByZXdvcmsgb2YgdGhlIGV4dGVuc2lvbiBjb2RlCisJYnVnZml4OiB1c2UgdGhlIGNvcnJlY3QgY29kZXBvaW50IGZvciB0aGUgT1NQRiBzaW1wbGUgdGV4dCBhdXRoIHRva2VuCisJIGVudHJ5LCBhbmQgdXNlIHNhZmVwdXRzIHRvIHByaW50IHRoZSBwYXNzd29yZC4KKwlBZGQgc3VwcG9ydCBpbiBwZmxvZyBmb3IgYWRkaXRpb25hbCB2YWx1ZXMKKwlBZGQgc3VwcG9ydCBmb3IgT0lGIFJTVlAgRXh0ZW5zaW9ucyBVTkkgMS4wIFJldi4gMiBhbmQgYWRkaXRpb25hbCBSU1ZQIG9iamVjdHMKKwlBZGQgc3VwcG9ydCBmb3IgdGhlIE1lc3NhZ2UtaWQgTkFDSyBjLXR5cGUuCisJQWRkIHN1cHBvcnQgZm9yIDgwMi4zYWggbG9vcGJhY2sgY3RybCBtc2cKKwlBZGQgc3VwcG9ydCBmb3IgTXVsdGlwbGUtU1RQIGFzIHBlciA4MDIuMXMKKwlBZGQgc3VwcG9ydCBmb3IgcmFwaWQtU1BUIGFzIHBlciA4MDIuMXcKKwlBZGQgc3VwcG9ydCBmb3IgQ0ZNIExpbmstdHJhY2UgbXNnLCBMaW5rLXRyYWNlLVJlcGx5IG1zZywgCisJIFNlbmRlci1JRCB0bHYsIHByaXZhdGUgdGx2LCBwb3J0LCBpbnRlcmZhY2Ugc3RhdHVzCisJQWRkIHN1cHBvcnQgZm9yIHVuaWRpcmVjdGlvbmFsIGxpbmsgZGV0ZWN0aW9uIGFzIHBlcgorCSBodHRwOi8vd3d3LmlldGYub3JnL2ludGVybmV0LWRyYWZ0cy9kcmFmdC1mb3NjaGlhbm8tdWRsZC0wMi50eHQKKwlBZGQgc3VwcG9ydCBmb3IgdGhlIG9sc3IgcHJvdG9jb2wgYXMgcGVyIFJGQyAzNjI2IHBsdXMgdGhlIExRIAorCSBleHRlbnNpb25zIGZyb20gb2xzci5vcmcKKwlBZGQgc3VwcG9ydCBmb3IgdmFyaWFibGUtbGVuZ3RoIGNoZWNrc3VtIGluIERDQ1AsIGFzIHBlciBzZWN0aW9uIDkgb2YKKwkgUkZDIDQzNDAuCisJQWRkIHN1cHBvcnQgZm9yIHBlci1WTEFOIHNwYW5uaW5nIHRyZWUgYW5kIHBlci1WTEFOIHJhcGlkIHNwYW5uaW5nIHRyZWUKKwlBZGQgc3VwcG9ydCBmb3IgTXVsdGlwbGUtU1RQIGFzIHBlciA4MDIuMXMKKwlBZGQgc3VwcG9ydCBmb3IgdGhlIGNpc2NvIHByb3ByaWF0cnkgJ2R5bmFtaWMgdHJ1bmtpbmcgcHJvdG9jb2wnCisJQWRkIHN1cHBvcnQgZm9yIHRoZSBjaXNjbyBwcm9wcmlldGFyeSBWVFAgcHJvdG9jb2wKKwlVcGRhdGUgZGhjcDYgb3B0aW9ucyB0YWJsZSBhcyBwZXIgSUVURiBzdGFuZGFyZGl6YXRpb24gYWN0aXZpdGllcworCisKK1R1ZS4JU2VwdGVtYmVyIDE5LCAyMDA2LiBrZW5AeGVsZXJhbmNlLmNvbS4gU3VtbWFyeSBmb3IgMy45LjUgdGNwZHVtcCByZWxlYXNlCisJCisJRml4IGNvbXBpbGluZyBvbiBBSVggKCwgYXQgZW5kIG9mIEVOVU0pCisJVXBkYXRlZCBsaXN0IG9mIEROUyBSUiB0eXBlY29kZXMKKwlVc2UgbG9jYWwgRXRoZXJuZXQgZGVmcyBvbiBXSU4zMgorCUFkZCBzdXBwb3J0IGZvciBGcmFtZS1SZWxheSBBUlAKKwlGaXhlcyBmb3IgY29tcGlsaW5nIHVuZGVyIE1TVkMrKworCUFkZCBzdXBwb3J0IGZvciBwYXJzaW5nIEp1bmlwZXIgLnBjYXAgZmlsZXMKKwlBZGQgc3VwcG9ydCBmb3IgRlJGLjE2IE11bHRpbGluayBGcmFtZS1SZWxheSAoRExUX01GUikKKwlSZXdvcmsgdGhlIE9TUEZ2MyBwcmludGVyCisJRml4IHByaW50aW5nIGZvciA0LjRCU0QvTmV0QlNEIE5GUyBGaWxlaGFuZGxlcworCUFkZCBzdXBwb3J0IGZvciBDaXNjbyBzdHlsZSBOTFBJRCBlbmNhcHN1bGF0aW9uCisJQWRkIGNpc2NvIHByb3AuIGVpZ3JwIHJlbGF0ZWQsIGV4dGVuZGVkIGNvbW11bml0aWVzCisJQWRkIHN1cHBvcnQgZm9yIEJHUCBzaWduYWxlZCBWUExTCisJQ2xlYW51cCB0aGUgYm9vdHAgcHJpbnRlcgorCUFkZCBzdXBwb3J0IGZvciBQUFAgb3ZlciBGcmFtZS1SZWxheQorCUFkZCBzb21lIGJvdW5kcyBjaGVja2luZyB0byB0aGUgSVAgb3B0aW9ucyBjb2RlLCBhbmQgY2xlYW4gdXAgCisJIHRoZSBvcHRpb25zIG91dHB1dCBhIGJpdC4KKwlBZGQgYWRkaXRpb25hbCBtb2RwIGdyb3VwcyB0byBJU0FLTVAgcHJpbnRlcgorCUFkZCBzdXBwb3J0IGZvciBBZGRyZXNzLVdpdGhkcmF3IGFuZCBMYWJlbC1XaXRoZHJhdyBNc2dzCisJQWRkIHN1cHBvcnQgZm9yIHRoZSBCRkQgRGlzY3JpbWluYXRvciBUTFYKKwlGaXhlcyBmb3IgNjRiaXQgY29tcGlsaW5nCisJQWRkIHN1cHBvcnQgZm9yIFBJTXYyIGNoZWNrc3VtIHZlcmlmaWNhdGlvbgorCUFkZCBzdXBwb3J0IGZvciBmdXJ0aGVyIGRpc3NlY3Rpb24gb2YgdGhlIElQQ1AgQ29tcHJlc3Npb24gT3B0aW9uCisJQWRkIHN1cHBvcnQgZm9yIENpc2NvJ3MgcHJvcG9zZWQgVlFQIHByb3RvY29sCisJQWRkIGJhc2ljIHN1cHBvcnQgZm9yIGtleWVkIGF1dGhlbnRpY2F0aW9uIFRDUCBvcHRpb24KKwlMb3RzIG9mIG1pbm9yIGNvc21ldGljIGNoYW5nZXMgdG8gb3V0cHV0IHByaW50ZXJzCisKKworTW9uLiAJU2VwdGVtYmVyIDE5LCAyMDA1LiAga2VuQHhlbGVyYW5jZS5jb20uIFN1bW1hcnkgZm9yIDMuOS40IHRjcGR1bXAgcmVsZWFzZQorCURlY29kZXIgc3VwcG9ydCBmb3IgbW9yZSBKdW5pcGVyIGxpbmstbGF5ZXIgdHlwZXMKKwlGaXggYSBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93IChhbHRob3VnaCBpdCBjYW4ndCBvY2N1ciBpbgorCQlwcmFjdGljZSkuCisJRml4IHRoZSBoYW5kbGluZyBvZiB1bmtub3duIG1hbmFnZW1lbnQgZnJhbWUgdHlwZXMgaW4gdGhlIDgwMi4xMQorCQlwcmludGVyLgorCUFkZCBGUkYuMTYgc3VwcG9ydCwgZml4IHZhcmlvdXMgRnJhbWUgUmVsYXkgYnVncy4KKwlBZGQgc3VwcG9ydCBmb3IgUlNWUCBpbnRlZ3JpdHkgb2JqZWN0cywgdXBkYXRlIGZhc3QtcmVyb3V0ZQorCQlvYmplY3QgcHJpbnRlciB0byBsYXRlc3Qgc3BlYy4KKwlDbGVhbiB1cCBkb2N1bWVudGF0aW9uIG9mIHZsYW4gZmlsdGVyIGV4cHJlc3Npb24sIGRvY3VtZW50IG1wbHMKKwkJZmlsdGVyIGV4cHJlc3Npb24uCisJRG9jdW1lbnQgbmV3IHBwcG9lZCBhbmQgcHBwb2VzIGZpbHRlciBleHByZXNzaW9ucy4KKwlVcGRhdGUgZGlmZnNlcnZlci1URSBjb2RlcG9pbnRzIGFzIHBlciBSRkMgNDEyNC4KKwlTcGVsbGluZyBmaXhlcyBpbiBJQ01QdjYuCisJRG9uJ3QgcmVxdWlyZSBhbnkgZmllbGRzIG90aGVyIHRoYW4gZmxhZ3MgdG8gYmUgcHJlc2VudCBpbiBJUy1JUworCQlyZXN0YXJ0IHNpZ25hbGluZyBUTFZzLCBhbmQgb25seSBwcmludCB0aGUgc3lzdGVtIElEIGluCisJCXRob3NlIFRMVnMgYXMgc3lzdGVtIElEcywgbm90IGFzIG5vZGUgSURzLgorCVN1cHBvcnQgZm9yIERDQ1AuCisKK1R1ZS4gCUp1bHkgNSwgMjAwNS4gIGtlbkB4ZWxlcmFuY2UuY29tLiBTdW1tYXJ5IGZvciAzLjkuMyB0Y3BkdW1wIHJlbGVhc2UKKworCU9wdGlvbiB0byBjaHJvb3QoKSB3aGVuIGRyb3BwaW5nIHByaXZzCisJRml4ZXMgZm9yIGNvbXBpbGluZyBvbiBuZWFybHkgZXZlcnkgcGxhdGZvcm0sCisJCWluY2x1ZGluZyBpbXByb3ZlZCA2NGJpdCBzdXBwb3J0CisJTWFueSBuZXcgdGVzdGNhc2VzCisJU3VwcG9ydCBmb3Igc2VuZGluZyBwYWNrZXRzCisJTWFueSBjb21wbGlhdGlvbiBmaXhlcyBvbiBtb3N0IHBsYXRmb3JtcworCUZpeGVzIGZvciByZWNlbnQgdmVyc2lvbiBvZiBHQ0MgdG8gZWxpbWluYXRlIHdhcm5pbmdzCisJSW1wcm92ZWQgVW5pY29kZSBzdXBwb3J0CisKKwlEZWNvZGVycyAmIERMVCBDaGFuZ2VzLCBVcGRhdGVzIGFuZCBOZXc6CisJCUFFUyBFU1Agc3VwcG9ydAorCQlKdW5pcGVyIEFUTSwgRlJGLjE1LCBGUkYuMTYsIFBQUG9FLAorCQkJTUwtRlIsIE1MLVBJQywgTUwtUFBQLCBQTC1QUFAsIExTLVBJQworCQkJR0dTTixFUyxNT05JVE9SLFNFUlZJQ0VTCisJCUwyVlBOCisJCUF4ZW50IFJhcHRvci9TeW1hbnRlYyBGaXJld2FsbAorCQlUQ1AtTUQ1IChSRkMgMjM4NSkKKwkJRVNQLWluLVVEUCAoUkZDIDM5NDgpCisJCUFUTSBPQU0KKwkJTE1QLCBMTVAgU2VydmljZSBEaXNjb3ZlcnkKKwkJSVAgb3ZlciBGQworCQlJUCBvdmVyIElFRUUgMTM5NAorCQlCQUNuZXQgTVMvVFAKKwkJU1M3CisJCUxEUCBvdmVyIFRDUAorCQlMQUNQLCBNQVJLRVIgYXMgcGVyIDgwMi4zYWQKKwkJUEdNIChSRkMgMzIwOCkKKwkJTFNQLVBJTkcKKwkJRy43MDQxL1kuMTMwMyBHZW5lcmljIEZyYW1pbmcgUHJvY2VkdXJlCisJCUVJR1JQLUlQLCBFSUdSUC1JUFgKKwkJSUNNUDYKKwkJUmFkaW8gLSB2aWEgcmFkaW90YXAKKwkJREhDUHY2CisJCUhETEMgb3ZlciBQUFAKKworVHVlLiAgIE1hcmNoIDMwLCAyMDA0LiBtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYS4gU3VtbWFyeSBmb3IgMy44LjMgcmVsZWFzZQorCisJTm8gY2hhbmdlcyBmcm9tIDMuOC4yLiBWZXJzaW9uIGJ1bXBlZCBvbmx5IHRvIG1haW50YWluIGNvbnNpc3RlbmN5CisJd2l0aCBsaWJwY2FwIDAuOC4zLgorCitNb24uICAgTWFyY2ggMjksIDIwMDQuIG1jckBzYW5kZWxtYW4ub3R0YXdhLm9uLmNhLiBTdW1tYXJ5IGZvciAzLjguMiByZWxlYXNlCisKKwlGaXhlcyBmb3IgcHJpbnQtaXNha21wLmMgICAgICBDVkU6ICAgIENBTi0yMDA0LTAxODMsIENBTi0yMDA0LTAxODQKKwkgIAkJICAgICBodHRwOi8vd3d3LnJhcGlkNy5jb20vYWR2aXNvcmllcy9SNy0wMDE3Lmh0bWwKKwlJUC1vdmVyLUlFRUUxMzk0IHByaW50aW5nLgorCXNvbWUgTUlOR1czMiBjaGFuZ2VzLgorCXVwZGF0ZXMgZm9yIGF1dG9jb25mIDIuNQorCWZpeGVzIGZvciBwcmludC1hb2R2LmMgLSBjaGVjayBmb3IgdG9vIHNob3J0IHBhY2tldHMKKwlmb3JtYXR0aW5nIGNoYW5nZXMgdG8gcHJpbnQtYXNjaWkgZm9yIGhleCBvdXRwdXQuCisJY2hlY2sgZm9yIHRvbyBzaG9ydCBwYWNrZXRzOiBwcmludC1iZ3AuYywgcHJpbnQtYm9vdHAuYywgcHJpbnQtY2RwLmMsCisJCXByaW50LWNoZGxjLmMsIHByaW50LWRvbWFpbi5jLCBwcmludC1pY21wLmMsIHByaW50LWljbXA2LmMsCisJCXByaW50LWlwLmMsIHByaW50LWx3cmVzLmMsIHByaW50LW9zcGYuYywgcHJpbnQtcGltLmMsCisJCXByaW50LXBwcC5jLHByaW50LXBwcG9lLmMsIHByaW50LXJzdnAuYywgcHJpbnQtd2IuYworCXByaW50LWV0aGVyLmMgLSBiZXR0ZXIgaGFuZGxpbmcgb2YgdW5rbm93biB0eXBlcy4KKwlwcmludC1pc29jbG5zLmMgLSBhZGRpdGlvbmFsIGRlY29kaW5nIG9mIHR5cGVzLgorCXByaW50LWxsYy5jIC0gc3RyaW5ncyBmb3IgTExDIG5hbWVzIGFkZGVkLgorCXByaW50LXBmbG9jLmMgLSB2YXJpb3VzIGVuaGFuY2VtZW50cworCXByaW50LXJhZGl1cy5jIC0gYmV0dGVyIGRlY29kaW5nIHRvIHN0cmluZ3MuCisKK1dlZC4gICBOb3ZlbWJlciAxMiwgMjAwMy4gbWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2EuIFN1bW1hcnkgZm9yIDMuOCByZWxlYXNlCisKKwljaGFuZ2VkIHN5bnRheCBvZiAtRSBhcmd1bWVudCBzbyB0aGF0IG11bHRpcGxlIFNBcyBjYW4gYmUgZGVjcnlwdGVkCisJZml4ZXMgZm9yIERpZ2l0YWwgVW5peCBoZWFkZXJzIGFuZCBEb2N1bWVudGF0aW9uCisJX19hdHRyaWJ1dGVfXyBmaXhlcworCUNEUCBjaGFuZ2VzIGZyb20gVGVycnkgS2VubmVkeSA8dGVycnlAdG1rLmNvbT4uCisJSVB2NiBtb2JpbGl0eSB1cGRhdGVzIGZyb20gS2F6dXNoaSBTdWd5byA8c3VneW9AcGIuanAubmVjLmNvbT4KKwlGaXhlcyBmb3IgQVNOLjEgZGVjb2RlciBmb3IgMi4xMDAuMyBmb3Jtcy4KKwlBZGRlZCBhIGNvdW50IG9mIHBhY2tldHMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZCB0byBjbGFyaWZ5IG51bWJlcnMuCisJSW5jb3Jwb3JhdGVkIFdpbkRVTVAgcGF0Y2hlcyBmb3IgV2luMzIgYnVpbGRzLgorCVBQUG9FIHBheWxvYWQgbGVuZ3RoIGhlYWRlcnMuCisJRml4ZXMgZm9yIEhQIEMgY29tcGlsZXIgYnVpbGRzLgorCVVzZSBuZXcgcGNhcF9icmVha2xvb3AoKSBhbmQgcGNhcF9maW5kYWxsZGV2cygpIGlmIHdlIGNhbi4KKwlCR1Agb3V0cHV0IHNwbGl0IGludG8gbXVsdGlwbGUgbGluZXMuCisJRml4ZXMgdG8gODAyLjExIGRlY29kaW5nLgorCUZpeGVzIHRvIFBJTSBkZWNvZGVyLgorCVN1cGVySCBpcyBhIENQVSB0aGF0IGNhbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzLiBNYW55IGZpeGVzIGZvcgorCQl1bmFsaWduZWQgYWNjZXNzIHdvcmsuCisJRml4ZXMgdG8gRnJhbWUtUmVsYXkgZGVjb2RlciBmb3IgUS45MzMvOTIyIGZyYW1lcy4KKwlDbGFyaWZpZWQgd2hlbiBTb2xhcmlzIGNhbiBkbyBjYXB0dXJlcyBhcyBub24tcm9vdC4KKwlBZGRlZCB0ZXN0cy8gc3ViZGlyIGZvciBleGFtcGxlcy9yZWdyZXNzaW9uIHRlc3RzLgorCU5ldyAtVSBmbGFnLgktZmx1c2ggc3Rkb3V0IGFmdGVyIGV2ZXJ5IHBhY2tldAorCU5ldyAtQSBmbGFnCS1wcmludCBhc2NpaSBvbmx5CisJc3VwcG9ydCBmb3IgZGVjb2RpbmcgSVMtSVMgaW5zaWRlIENpc2NvIEhETEMgRnJhbWVzCisJbW9yZSB2ZXJib3NpdHkgZm9yIHRmdHAgZGVjb2RlcgorCW1ETlMgZGVjb2RlcgorCW5ldyBCRkQgZGVjb2RlcgorCWNyb3NzIGNvbXBpbGF0aW9uIHBhdGNoZXMKKwlSRkMgMzU2MSBBT0RWIHN1cHBvcnQuCisJVURQL1RDUCBwc2V1ZG8tY2hlY2tzdW0gcHJvcGVybHkgZm9yIHNvdXJjZS1yb3V0ZSBvcHRpb25zLgorCXNhbml0aXplZCBhbGwgZmlsZXMgdG8gbW9kaWZpZWQgQlNEIGxpY2Vuc2UKKwlBZGQgc3VwcG9ydCBmb3IgUkZDIDI2MjUgSVAtb3Zlci1GaWJyZSBDaGFubmVsLgorCWZpeGVzIGZvciBERUNuZXQgc3VwcG9ydC4KKwlTdXBwb3J0IFJGQyAyNjg0IGJyaWRnaW5nIG9mIEV0aGVybmV0LCA4MDIuNSBUb2tlbiBSaW5nLCBhbmQgRkRESS4KKwlSRkMgMjY4NCBlbmNhcHN1bGF0aW9uIG9mIEJQRFVzLgorCitUdWVzZGF5LCBGZWJydWFyeSAyNSwgMjAwMy4gZmVubmVyQHJlc2VhcmNoLmF0dC5jb20uICAzLjcuMiByZWxlYXNlCisKKwlGaXhlZCBpbmZpbml0ZSBsb29wIHdoZW4gcGFyc2luZyBtYWxmb3JtZWQgaXNha21wIHBhY2tldHMuCisJIChyZXBvcnRlZCBieSBpRGVmZW5zZTsgYWxyZWFkeSBmaXhlZCBpbiBDVlMpCisJRml4ZWQgaW5maW5pdGUgbG9vcCB3aGVuIHBhcnNpbmcgbWFsZm9ybWVkIEJHUCBwYWNrZXRzLgorCUZpeGVkIGJ1ZmZlciBvdmVyZmxvdyB3aXRoIGNlcnRhaW4gbWFsZm9ybWVkIE5GUyBwYWNrZXRzLgorCVByZXR0eS1wcmludCB1bnByaW50YWJsZSBuZXR3b3JrIG5hbWVzIGluIDgwMi4xMSBwcmludGVyLgorCUhhbmRsZSB0cnVuY2F0ZWQgbmJwIChhcHBsZXRhbGspIHBhY2tldHMuCisJVXBkYXRlZCBESENQdjYgcHJpbnRlciB0byBtYXRjaCBkcmFmdC1pZXRmLWRoYy1kaGNwdjYtMjIudHh0CisJUHJpbnQgSVAgcHJvdG9jb2wgbmFtZSBldmVuIGlmIHdlIGRvbid0IGhhdmUgYSBwcmludGVyIGZvciBpdC4KKwlQcmludCBJUCBwcm90b2NvbCBuYW1lIG9yIG51bWJlciBmb3IgZnJhZ21lbnRzLgorCVByaW50IHRoZSB3aG9sZSBNUExTIGxhYmVsIHN0YWNrLCBub3QganVzdCB0aGUgdG9wIGxhYmVsLgorCVByaW50IHJlcXVlc3QgaGVhZGVyIGFuZCBmaWxlIGhhbmRsZSBmb3IgTkZTIHYzIEZTSU5GTyBhbmQgUEFUSENPTkYKKwkgcmVxdWVzdHMuCisJRml4IE5GUyBwYWNrZXQgdHJ1bmNhdGlvbiBjaGVja3MuCisJSGFuZGxlICJvbGQiIERSLVByaW9yaXR5IGFuZCBCaWRpci1DYXBhYmxlIFBJTSBIRUxMTyBvcHRpb25zLgorCUhhbmRsZSB1bmtub3duIFJBRElVUyBhdHRyaWJ1dGVzIHByb3Blcmx5LgorCUZpeCBhbiBBU04uMSBwYXJzaW5nIGVycm9yIHRoYXQgd291bGQgY2F1c2UgZS5nLiB0aGUgT0lECisJIDIuMTAwLjMgdG8gYmUgbWlzcmVwcmVzZW50ZWQgYXMgNC4yMC4zIC4KKworTW9uZGF5LCBKYW51YXJ5IDIxLCAyMDAyLiBtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYS4gU3VtbWFyeSBmb3IgMy43IHJlbGVhc2UKK3NlZSBodHRwOi8vd3d3LnRjcGR1bXAub3JnL2N2cy1sb2cvMjAwMi0wMS0yMS4xMDoxNjo0OC5odG1sIGZvciBjb21taXQgbG9nLgorCWtleXdvcmQgImlweCIgYWRkZWQuCisJQmV0dGVyIE9TSS84MDIuMiBzdXBwb3J0IG9uIExpbnV4LgorCUlFRUUgODAyLjExIHN1cHBvcnQsIGZyb20gY2xlbmFoYW5AZm9ydHJlc3N0ZWNoLmNvbSwgYWNoaXJpY2FAdHRkLm5ldC4KKwlMTEMgU0FQIHN1cHBvcnQgZm9yIEZEREkvdG9rZW4gcmluZy9SRkMtMTQ4MyBzdHlsZSBBVE0KKwlCWFhQIHByb3RvY29sIHdhcyByZXBsYWNlZCBieSB0aGUgQkVFUCBwcm90b2NvbDsKKwlpbXByb3ZlbWVudHMgdG8gU05BUCBkZW11eC4KKwlDaGFuZ2VzIHRvICJhbnkiIGludGVyZmFjZSBkb2N1bWVudGF0aW9uLgorCURvY3VtZW50YXRpb24gb24gcGNhcF9zdGF0cygpIGNvdW50ZXJzLgorCUZpeCBhIG1lbW9yeSBsZWFrIGZvdW5kIGJ5IE1pa2xvcyBTemVyZWRpIC0gcGNhcF9ldGhlcl9hdG9uKCkuCisJQWRkZWQgTVBMUyBlbmNhcHN1bGF0aW9uIGRlY29kaW5nIHBlciBSRkMzMDMyLgorCUROUyBkaXNzZWN0b3IgaGFuZGxlcyBUS0VZLCBUU0lHIGFuZCBJWEZSLgorCWFkYXB0aXZlIFNMSVAgaW50ZXJmYWNlIHBhdGNoIGZyb20gSWdvciBLaHJpc3RvcGhvcm92IDxpZ29yQGF0ZG90Lm9yZz4KKwlTTUIgcHJpbnRpbmcgaGFzIG11Y2ggaW1wcm92ZWQgYm91bmRzIGNoZWNrcworCU9VSSAweDAwMDBmOCBkZWNvZGVkIGFzIGVuY2Fwc3VsYXRlZCBldGhlcm5ldCBmb3IgQ2lzY28tY3VzdG9tIGJyaWRnaW5nCisJWmVwaHlyIHN1cHBvcnQsIGZyb20gTmlja29sYWkgWmVsZG92aWNoIDxrb2x5YUBNSVQuRURVPi4KKwlTb2xhcmlzIC0gZGV2aWNlcyB3aXRoIGRpZ2l0cyBpbiB0aGVtLiBTdGVmYW4gSHVkc29uIDxodWRzb25AbWJheS5uZXQ+CisJSVBYIHNvY2tldCAweDg1YmUgaXMgZm9yIENpc2NvIEVJR1JQIG92ZXIgSVBYLgorCUltcHJvdmVtZW50cyB0byBmcmFnbWVudGVkIEVTUCBoYW5kbGluZy4KKwlTQ1RQIHN1cHBvcnQgZnJvbSBBcm1hbmRvIEwuIENhcm8gSnIuIDxhY2Fyb0BtYWlsLmVlY2lzLnVkZWwuZWR1PgorCUxpbnV4IEFSUEhEUl9BVE0gc3VwcG9ydCBmaXhlZC4KKwlBZGRlZCBhICJuZXRiZXVpIiBrZXl3b3JkLCB3aGljaCBzZWxlY3RzIE5ldEJFVUkgcGFja2V0cy4KKwlJUHY2IE5EIGltcHJvdmVtZW50cywgTW9iaWxlSVAgZGlzc2VjdG9yLCAyMjkyYmlzLTAyIGZvciBSQSBvcHRpb24uCisJSGFuZGxlIEFSUEhEUl9IRExDIGZyb20gTWFyY3VzIEZlbGlwZSBQZXJlaXJhIDxtYXJjdXNAdGFzay5jb20uYnI+LgorCUhhbmRsZSBJUFggc29ja2V0IDB4NTUzIC0+IE5ldEJJT1Mtb3Zlci1JUFggc29ja2V0LCAibndsaW5rLWRnbSIKKwlCZXR0ZXIgTGludXggbGliYzUgY29tcGF0LgorCUJJTkQ5IGx3cmVzIGRpc3NlY3RvciBhZGRlZC4KKwlNSVBTIGFuZCBTUEFSQyBnZXQgc3RyaWN0IGFsaWdubWVudCBtYWNyb3MgKGFmZmVjdHMgcHJpbnQtYmdwLmMpCisJQXBwbGUgTG9jYWxUYWxrIExJTktUWVBFXyByZXNlcnZlZC4KKwlOZXcgdGltZSBzdGFtcCBmb3JtYXRzIGRvY3VtZW50ZWQuCisJREhDUDYgdXBkYXRlZCB0byBkcmFmdC0yMi50eHQgc3BlYy4KKwlJQ01QIHR5cGVzL2NvZGVzIG5vdyBhY2NlcHQgc3ltYm9saWMgbmFtZXMuCisJQWRkIFNJR0lORk8gaGFuZGxlciBmcm9tIExCTAorCWVuY3J5cHRlZCBDSVBFIHR1bm5lbHMgaW4gSVJJWCwgZnJvbSBGcmFueiBTY2hhZWZlciA8c2NoYWVmZXJAbW9uZC5hdD4uCisJbm93IHdlIGFyZSAtV3N0cmljdC1wcm90b3R5cGUgY2xlYW4uCisJTmV0QlNEIERMVF9QUFBfRVRIRVI7IGFkYXB0ZWQgZnJvbSBNYXJ0aW4gSHVzZW1hbm4gPG1hcnRpbkBuZXRic2Qub3JnPi4KKwlQUFBvRSBkaXNzZWN0b3IgY2xlYW5lZCB1cC4KKwlTdXBwb3J0IGZvciBMb2NhbFRhbGsgaGFyZHdhcmUsIGZyb20gVW5zIExpZGVyIDx1bnNsaWRlckBtaXJhbmRhLm9yZz4uCisJSW4gZGlzc2VjdG9yLCBub3cgdGhlIGNhbGxlciBwcmludHMgdGhlIElQIGFkZHJlc3NlcyByYXRoZXIgdGhhbiBwcm90by4KKwljamNsYXJrQGFsdW0ubWl0LmVkdTogcHJpbnQgdGhlIElQIHByb3RvIGZvciBub24taW5pdGlhbCBmcmFnbWVudHMuCisJTExDIGZyYW1lcyB3aXRoIGEgRFNBUCBhbmQgTFNBUCBvZiAweGUwIGFyZSBJUFggZnJhbWVzLgorCUxpbnV4IGNvb2tlZCBmcmFtZXMgd2l0aCBhIHR5cGUgdmFsdWUgb2YgTElOVVhfU0xMX1BfODAyXzMgYXJlIElQWC4KKwljYXB0dXJlcyBvbiB0aGUgImFueSIgZGV2aWNlIHdvbid0IGJlIGRvbmUgaW4gcHJvbWlzY3VvdXMgbW9kZQorCVRva2VuIFJpbmcgc3VwcG9ydCBvbiBETFBJIC0gT25ubyB2YW4gZGVyIExpbmRlbiA8b25ub0BzaW1wbGV4Lm5sPgorCUFSQ05ldCBzdXBwb3J0LCBmcm9tIE5ldEJTRC4KKwlIU1JQIGRpc3NlY3RvciwgZnJvbSBKdWxpYW4gQ293bGV5IDxqdWxpYW5AbGF2YS5uZXQ+LgorCUhhbmRsZSAoR1JFLWVuY2Fwc3VsYXRlZCkgUFBUUAorCWFkZGVkIC1DIG9wdGlvbiB0byByb3RhdGUgc2F2ZSBmaWxlIGV2ZXJ5IG9wdGFyZyAqIDEsMDAwLDAwMCBieXRlcy4KKwlzdXBwb3J0IGZvciAidnJycCIgbmFtZSAtIE5ldEJTRCwgYnkgS2xhdXMgS2xlaW4gPGtsZWlua0BuZXRic2Qub3JnPi4KKwlQUFRQIHN1cHBvcnQsIGZyb20gTW90b25vcmkgU2hpbmRvIDxtc2hpbmRvQG1zaGluZG8ubmV0Pi4KKwlJUy1JUyBvdmVyIFBQUCBzdXBwb3J0LCBmcm9tIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgorCUNORlAgc3VwcG9ydCBmb3IgSVB2Nixmb3JtYXQuIEhhcnJ5IFJhYXltYWtlcnMgPGhhcnJ5ckBjb25uZWN0LmNvbS5hdT4uCisJRVNQIHByaW50aW5nIHVwZGF0ZWQgdG8gUkZDMjQwNi4KKwlIUC1VWCBjYW4gbm93IGhhbmRsZSBsYXJnZSBudW1iZXIgb2YgUFBBcy4KKwlNU0RQIHByaW50ZXIgYWRkZWQuCisJTDJUUCBkaXNzZWN0b3IgaW1wcm92ZW1lbnRzIGZyb20gTW90b25vcmkgU2hpbmRvLgorCitUdWVzZGF5IEphbnVhcnkgOSwgMjAwMS4gbWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2EuIFN1bW1hcnkgZm9yIDMuNiByZWxlYXNlCisJQ2xlYW5lZCB1cCBkb2N1bWVudGF0aW9uLgorCVByb21pc2MgbW9kZSBmaXhlcyBmb3IgTGludXgKKwlJUHNlYyBjaGFuZ2VzL2NsZWFudXBzLgorCUFsaWdubWVudCBmaXhlcyBmb3IgcGlja3kgYXJjaGl0ZWN0dXJlcworCisJUmVtb3ZlZCBkZXBlbmRlbmN5IG9uIG5hdGl2ZSBoZWFkZXJzIGZvciBwYWNrZXQgZGlzc2VjdG9ycy4KKwlSZW1vdmVkIExpbnV4IHNwZWNpZmljIGhlYWRlcnMgdGhhdCB3ZXJlIHNoaXBwZWQKKworCWxpYnBjYXAgY2hhbmdlcyBwcm92aWRlIGZvciBleGNoYW5naW5nIGNhcHR1cmUgZmlsZXMgYmV0d2VlbgorCSAgc3lzdGVtcy4gU2F2ZSBmaWxlcyBub3cgaGF2ZSB3ZWxsIGtub3duIFBBQ0tFVF8gdmFsdWVzIGluc3RlYWQgb2YKKwkgIGRlcGVuZGluZyB1cG9uIHN5c3RlbSBkZXBlbmRhbnQgbWFwcGluZ3Mgb2YgRExUXyogdHlwZXMuCisKKwlTdXBwb3J0IGZvciBjb21wdXRpbmcvY2hlY2tpbmcgSVAgYW5kIFVEUC9UQ1AgY2hlY2tzdW1zLgorCisJVXBkYXRlZCBhdXRvY29uZiBzdG9jayBmaWxlcy4KKworCUlQdjYgaW1wcm92ZW1lbnRzOiBkaGNwIChkcmFmdC0xNSksIG1vYmlsZS1pcDYsIHBwcCwgb3NwZjYsCisKKwlBZGRlZCBkaXNzZWN0b3Igc3VwcG9ydCBmb3I6IElTT0NMTlMsIFRva2VuIFJpbmcsIElHTVB2MywgYnh4cCwKKwkJdGltZWQsIHZycnAsIHJhZGl1cywgY2hkbGMsIGNuZnAsIGNkcCwgSUVFRTgwMi4xZCwgcmF3LUFwcGxlVGFsaworCisJQWRkZWQgZmlsdGVyaW5nIHN1cHBvcnQgZm9yOiBWTEFOcywgRVNJUywgSVNJUworCisJSW1wcm92ZW1lbnRzIHRvOiBwcmludC10ZWxuZXQsIElQVGFsaywgYm9vdHAvZGhjcCwgRUNOLCBQUFAsCisJCUwyVFAsIFBQUG9FCisKKwlIUC1VWCAxMS4wIC0tIGZpbmQgdGhlIHJpZ2h0IGRscGkgZGV2aWNlLgorCVNvbGFyaXMgOCAtIElQdjYgd29ya3MKKwlMaW51eCAtIEFkZGVkIHN1cHBvcnQgZm9yIGFuICJhbnkiIGRldmljZSB0byBjYXB0dXJlIG9uIGFsbCBpbnRlcmZhY2VzCisKKwlTZWN1cml0eSBmaXhlczogYnVmZmVyIG92ZXJydW4gYXVkaXQgZG9uZS4gU3RyY3B5IHJlcGxhY2VkIHdpdGgKKwkJc3RybGNweSwgc3ByaW50ZiByZXBsYWNlZCB3aXRoIHNucHJpbnRmLgorCUxvb2sgZm9yIGxleCBwcm9ibGVtcywgYW5kIHdhcm4gYWJvdXQgdGhlbS4KKworCit2My41IEZyaSBKYW4gMjggMTg6MDA6MDAgUFNUIDIwMDAKKworQmlsbCBGZW5uZXIgPGZlbm5lckByZXNlYXJjaC5hdHQuY29tPgorLSBzd2l0Y2ggdG8gY29uZmlnLmggZm9yIGF1dG9jb25mCistIHVuaWZ5IFJDU0lEIHN0cmluZ3MKKy0gVXBkYXRlZCBQSU12MSwgUElNdjIsIERWTVJQLCBJR01QIHBhcnNlcnMsIGFkZCBDaXNjbyBBdXRvLVJQIHBhcnNlcgorLSBSZWFsbHkgZml4IHRoZSBSSVAgcHJpbnRlcgorLSBGaXggTUFDIGFkZHJlc3MgLT4gbmFtZSB0cmFuc2xhdGlvbi4KKy0gc29tZSAtV2FsbCAtV2Zvcm1hdCBmaXhlcworLSB1cGRhdGUgbWFrZW1pYiB0byBwYXJzZSBtdWNoIG9mIFNNSXYyCistIFByaW50IFRDUCBzZXF1ZW5jZSAjIHdpdGggLXZ2IGV2ZW4gaWYgeW91IG5vcm1hbGx5IHdvdWxkbid0CistIFByaW50IGFzIG11Y2ggb2YgSVAvVENQL1VEUCBoZWFkZXJzIGFzIHBvc3NpYmxlIGV2ZW4gaWYgdHJ1bmNhdGVkLgorCitpdG9qdW5AaWlqbGFiLm5ldAorLSAtWCB3aWxsIG1ha2UgYSBhc2NpaSBkdW1wLiAgZnJvbSBuZXRic2QuCistIHRlbG5ldCBjb21tYW5kIHNlcXVlbmNlIGRlY29kZXIgKGZmIHh4IHh4KS4gIGZyb20gbmV0YnNkLgorLSBwcmludC1iZ3AuYzogaW1wcm92ZSBvcHRpb25zIHByaW50aW5nLiAgdWdseSBjb2RlIGV4aXN0cyBmb3IKKyAgdW5hbGlnbmVkIG9wdGlvbiBwYXJzaW5nIChuZWVkIHNvbWUgZml4KS4KKy0gY29uc3QgcG9pc29uaW5nIGluIFNNQiBkZWNvZGVyLgorLSAtV2FsbCAtV2Vycm9yIGNsZWFuIGNoZWNrcy4KKy0gYnJpbmcgaW4gS0FNRSBJUHY2L0lQc2VjIGRlY29kaW5nIGNvZGUuCisKK0Fzc2FyIFdlc3Rlcmx1bmQgIDxhc3NhckBzaWNzLnNlPgorLSBTTk1QdjIgYW5kIFNOTVB2MyBwcmludGVyCistIElmIGNvbXBpbGVkIHdpdGggbGlic21pLCB0Y3BkdW1wIGNhbiBsb2FkIE1JQnMgb24gdGhlIGZseSB0byBkZWNvZGUKKyAgU05NUCBwYWNrZXRzLgorLSBJbmNvcnBvcmF0ZSBORlMgcGFyc2luZyBjb2RlIGZyb20gTmV0QlNELiAgQWRkcyBzdXBwb3J0IGZvciBuZnN2My4KKy0gcG9ydGFiaWxpdHkgZml4ZXMKKy0gcGVybWl0IGJ1aWxkaW5nIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KKworS2VuIEhvcm5zdGVpbiA8a2VuaEBjbWYubnJsLm5hdnkubWlsPgorLSBicmluZyBpbiBjb2RlIGF0CisgIC9hZnMvdHJhbnNhcmMuY29tL3B1YmxpYy9hZnMtY29udHJpYi90b29scy90Y3BkdW1wIGZvciBwYXJzaW5nCisgIEFGUzMgcGFja2V0cworCitBbmRyZXcgVHJpZGdlbGwgPHRyaWRnZUBsaW51eGNhcmUuY29tPgorLSBTTUIgcHJpbnRpbmcgY29kZQorCitMb3ZlIDxsaGFAc3RhY2tlbi5rdGguc2U+CistIHByaW50LXJ4LmM6IGFkZCBjb2RlIGZvciBwcmludGluZyBNYWtlRGlyIGFuZCBTdG9yZVN0YXR1cy4gIEFsc28KKyAgY2hhbmdlIGRhdGUgZm9ybWF0IHRvIHRoZSByaWdodCBvbmUuCisKK01pY2hhZWwgQy4gUmljaGFyZHNvbiAgPG1jckBzYW5kZWxtYW4ub3R0YXdhLm9uLmNhPgorLSBDcmVhdGVkIHRjcGR1bXAub3JnIHJlcG9zaXRvcnkKKwordjMuNCBTYXQgSnVsIDI1IDEyOjQwOjU1IFBEVCAxOTk4CisKKy0gSGFyZHdpcmUgTGludXggc2xpcCBzdXBwb3J0IHNpbmNlIGl0J3MgdG9vIGhhcmQgdG8gZGV0ZWN0LgorCistIFJlZG8gY29uZmlndXJhdGlvbiBvZiAibmV0d29yayIgbGlicmFyaWVzICgtbHNvY2tldCBhbmQgLWxuc2wpIHRvCisgIGRlYWwgd2l0aCBJUklYLiBUaGFua3MgdG8gSm9obiBIYXdraW5zb24gKGpoYXdrQG1pdC5lZHUpCisKKy0gQWRkZWQgLWEgd2hpY2ggdHJpZXMgdG8gdHJhbnNsYXRlIG5ldHdvcmsgYW5kIGJyb2FkY2FzdCBhZGRyZXNzZXMgdG8KKyAgbmFtZXMuIFN1Z2dlc3RlZCBieSBSb2IgdmFuIE5pZXV3a2VyayAocm9ibkB2ZXJkaS5ldC50dWRlbGZ0Lm5sKQorCistIEFkZGVkIGEgY29uZmlndXJlIG9wdGlvbiB0byBkaXNhYmxlIGdjYy4KKworLSBBZGRlZCBhICJyYXciIHBhY2tldCBwcmludGVyLgorCistIE5vdCBoYXZpbmcgYW4gaW50ZXJmYWNlIGFkZHJlc3MgaXMgbm8gbG9uZ2VyIGZhdGFsLiBSZXF1ZXN0ZWQgYnkgSm9obgorICBIYXdraW5zb24uCisKKy0gUmV3b3JrIHNpZ25hbCBzZXR1cCB0byBhY2NvbW1vZGF0ZSBMaW51eC4KKworLSBPU1BGIHRydW5jYXRpb24gY2hlY2sgZml4LiBBbHNvIGRpc3BsYXkgdGhlIHR5cGUgb2YgT1NQRiBwYWNrZXRzCisgIHVzaW5nIE1ENSBhdXRoZW50aWNhdGlvbi4gVGhhbmtzIHRvIEJyaWFuIFdlbGxpbmd0b24KKyAgKGJ3ZWxsaW5nQHRpcy5jb20pCisKKy0gRml4IHRydW5jYXRpb24gY2hlY2sgYnVncyBpbiB0aGUgS2VyYmVyb3MgcHJpbnRlci4gUmVwb3J0ZWQgYnkgRXpyYQorICBQZWlzYWNoIChlcGVpc2FjaEBtaXQuZWR1KQorCistIERvbid0IGNhdGNoIFNJR0hVUCB3aGVuIGludm9rZWQgd2l0aCBub2h1cCgxKS4gVGhhbmtzIHRvIERhdmUgUGxvbmthCisgIChwbG9ua2FAbWZhLmNvbSkKKworLSBTcGVjaWZ5IGZ1bGwgaW5zdGFsbCB0YXJnZXQgYXMgYSB3YXkgb2YgZGV0ZWN0aW5nIGlmIGluc3RhbGwKKyAgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBUaGFua3MgdG8gRGF2ZSBQbG9ua2EuCisKKy0gQml0LXN3YXAgRkRESSBhZGRyZXNzZXMgZm9yIEJTRC9PUyB0b28uIFRoYW5rcyB0byBQYXVsIFZpeGllCisgIChwYXVsQHZpeC5jb20pCisKKy0gRml4IG9mZi1ieS1vbmUgYnVnIHdoZW4gdGVzdGluZyBzaXplIG9mIGV0aGVybmV0IHBhY2tldHMuIFRoYW5rcyB0bworICBNYXJ0eSBMZWlzbmVyIChsZWlzbmVyQHNkc3AubWMueGVyb3guY29tKQorCistIEFkZCBhIGxvY2FsIGF1dG9jb25mIG1hY3JvIHRvIGNoZWNrIGZvciByb3V0aW5lcyBpbiBsaWJyYXJpZXM7IHRoZQorICBhdXRvY29uZiB2ZXJzaW9uIGlzIGJyb2tlbiAoaXQgb25seSBwdXRzIHRoZSBsaWJyYXJ5IG5hbWUgaW4gdGhlCisgIGNhY2hlIHZhcmlhYmxlIG5hbWUpLiBUaGFua3MgdG8gSm9obiBIYXdraW5zb24uCisKKy0gQWRkIGEgbG9jYWwgYXV0b2NvbmYgbWFjcm8gdG8gY2hlY2sgZm9yIHR5cGVzOyB0aGUgYXV0b2NvbmYgdmVyc2lvbgorICBpcyBicm9rZW4gKGl0IHVzZXMgZ3JlcCBpbnN0ZWFkIG9mIGFjdHVhbGx5IGNvbXBpbGluZyBhIGNvZGUgZnJhZ21lbnQpLgorCistIE1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIG5ldyBCU0QvT1MgMi4xIFBQUCBhbmQgU0xJUCBsaW5rIGxheWVyIGhlYWRlcgorICBmb3JtYXRzLgorCistIEV4dGVuZCBPU0YgaXAgaGVhZGVyIHdvcmthcm91bmQgdG8gdmVyc2lvbnMgMSBhbmQgMi4KKworLSBGaXggc29tZSBzaWduZWQgcHJvYmxlbXMgaW4gdGhlIG5mcyBwcmludGVyLiBBcyByZXBvcnRlZCBieSBEYXZpZAorICBTYWNlcmRvdGUgKGRhdmlkc0BzaWxlbmNlLnNlY25ldC5jb20pCisKKy0gRGV0ZWN0IGdyb3VwIHdoZWVsIGFuZCB1c2UgaXQgYXMgdGhlIGRlZmF1bHQgc2luY2UgQlNEL09TJyBpbnN0YWxsCisgIGNhbid0IGhhY2sgbnVtZXJpYyBncm91cHMuIFJlcG9ydGVkIGJ5IERhdmlkIFNhY2VyZG90ZS4KKworLSBBSVggbmVlZHMgc3BlY2lhbCBsb2FkZXIgb3B0aW9ucy4gVGhhbmtzIHRvIEpvbmF0aGFuIEkuIEthbWVucworICAoamlrQGNhbS5vdi5jb20pCisKKy0gRml4ZWQgdGhlIG5mcyBwcmludGVyIHRvIHByaW50IHBvcnQgbnVtYmVycyBpbiBkZWNpbWFsLiBUaGFua3MgdG8KKyAgS2VudCBWYW5kZXIgVmVsZGVuIChncmFwaGl4QGlhc3RhdGUuZWR1KQorCistIEZpbmQgaW5zdGFsbGVkIGxpYnBjYXAgaW4gL3Vzci9sb2NhbC9saWIgd2hlbiBub3QgdXNpbmcgZ2NjLgorCistIERpc2FsbG93IG5ldHdvcmsgbWFza3Mgd2l0aCBub24tbmV0d29yayBiaXRzIHNldC4KKworLSBBdHRlbXB0IHRvIGRldGVjdCAiZWdjcyIgdmVyc2lvbnMgb2YgZ2NjLgorCistIEFkZCBtaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlcyB3aGVuIGRpc3BsYXlpbmcgYm9vdHAgc3RyaW5ncy4KKyAgUmVwb3J0ZWQgYnkgVmlldC1UcnVuZyBMdXUgKHZsdXVAcGljYXJkLm1hdGgudXdhdGVybG9vLmNhKQorCit2My4zIFNhdCBOb3YgMzAgMjA6NTY6MjcgUFNUIDE5OTYKKworLSBBZGRlZCBMaW51eCBzdXBwb3J0LgorCistIEdSRSBlbmNhcHN1bGF0ZWQgcGFja2V0IHByaW50ZXIgdGhhbmtzIHRvIEpvaG4gSGF3a2luc29uCisgIChqaGF3a0BtaXQuZWR1KQorCistIFJld3JpdGUgZ210MmxvY2FsKCkgdG8gYXZvaWQgcHJvYmxlbWF0aWMgb3MgZGVwZW5kZW5jaWVzLgorCistIFN1cHByZXNzIG5mcyB0cnVuY2F0aW9uIG1lc3NhZ2Ugb24gZXJyb3JzLgorCistIEFkZCBtaXNzaW5nIG00IHF1b3RpbmcgaW4gQUNfTEJMX1VOQUxJR05FRF9BQ0NFU1MgYXV0b2NvbmYgbWFjcm8uCisgIFJlcG9ydGVkIGJ5IEpvYWNoaW0gT3R0IChvdHRAYXJkYWxhLmhhbi5kZSkKKworLSBFbmFibGUgImlwX2hsIHZzLiBpcF92aGwiIHdvcmthcm91bmQgZm9yIE9TRjQgdG9vLgorCistIFByaW50IGFycCBoYXJkd2FyZSB0eXBlIGluIGhvc3Qgb3JkZXIuIFRoYW5rcyB0byBPbm5vIHZhbiBkZXIgTGluZGVuCisgIChvbm5vQHNpbXBsZXgubmwpCisKKy0gQXZvaWQgc29sYXJpcyBjb21waWxlciB3YXJuaW5ncy4gVGhhbmtzIHRvIEJydWNlIEJhcm5ldHQKKyAgKGJhcm5ldHRAZ3J5bW9pcmUuY3JkLmdlLmNvbSkKKworLSBGaXggcmlwIHByaW50ZXIgdG8gbm90IHByaW50IG9uZSBtb3JlIHJvdXRlIHRoYW4gaXMgYWN0dWFsbHkgaW4gdGhlCisgIHBhY2tldC4gVGhhbmtzIHRvIEplYW4tTHVjIFJpY2hpZXIgKEplYW4tTHVjLlJpY2hpZXJAaW1hZy5mcikgYW5kCisgIEJpbGwgRmVubmVyIChmZW5uZXJAcGFyYy54ZXJveC5jb20pCisKKy0gVXNlIGF1dG9jb25mIGVuZGlhbiBkZXRlY3Rpb24gc2luY2UgQllURV9PUkRFUiBpc24ndCBkZWZpbmVkIG9uIGFsbCBzeXN0ZW1zLgorCistIEZpeCBkdm1ycCBwcmludGVyIHRydW5jYXRpb24gY2hlY2tzIGFuZCBhZGQgYSBkdm1ycCBwcm9iZSBwcmludGVyLgorICBUaGFua3MgdG8gRGFubnkgSi4gTWl0emVsIChtaXR6ZWxAaXBzaWxvbi5jb20pCisKKy0gUmV3cml0ZSBvc3BmIHByaW50ZXIgdG8gaW1wcm92ZSB0cnVuY2F0aW9uIGNoZWNrcy4KKworLSBEb24ndCBwYXJzZSB0Y3Agb3B0aW9ucyBwYXN0IHRoZSBFT0wuIEFzIG5vdGVkIGJ5IERhdmlkIFNhY2VyZG90ZQorICAoZGF2aWRzQHNlY25ldC5jb20pLiBBbHNvLCBjaGVjayB0Y3Agb3B0aW9ucyB0byBtYWtlIHN1cmUgdGhleSBhcgorICBhY3R1YWxseSBpbiB0aGUgdGNwIGhlYWRlciAoaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCB0cnVuY2F0aW9uCisgIGNoZWNrcykuIEZpeCB0aGUgU0FDSyBjb2RlIHRvIHByaW50IHRoZSBOIGJsb2NrcyAoaW5zdGVhZCBvZiB0aGUKKyAgZmlyc3QgYmxvY2sgTiB0aW1lcykuCisKKy0gRG9uJ3Qgc2F5IHJlYWxseSBzbWFsbCBVRFAgcGFja2V0cyBhcmUgdHJ1bmNhdGVkIGp1c3QgYmVjYXVzZSB0aGV5CisgIGFyZW4ndCBiaWcgZW5vdWdoIHRvIGJlIGEgUlBDLiBBcyBub3RlZCBieSBEYXZpZCBTYWNlcmRvdGUuCisKK3YzLjIuMSBTdW4gSnVsIDE0IDAzOjAyOjI2IFBEVCAxOTk2CisKKy0gQWRkZWQgcmZjMTcxNiBpY21wIGNvZGVzIGFzIHN1Z2dlc3RlZCBieSBNYXJ0aW4gRnJlZHJpa3Nzb24KKyAgKG1hcnRpbkBtc3Auc2UpCisKKy0gUHJpbnQgbXR1IGZvciBpY21wIHVucmVhY2ggbmVlZCBmcmFnIHBhY2tldHMuIFRoYW5rcyB0byBKb2huCisgIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkKKworLSBEZWNvZGUgaWNtcCByb3V0ZXIgZGlzY292ZXJ5IG1lc3NhZ2VzLiBUaGFua3MgdG8gSmVmZnJleSBIb25pZworICAoamNoQGJzZGkuY29tKQorCistIEFkZGVkIGEgcHJpbnRlciBlbnRyeSBmb3IgRExUX0lFRUU4MDIgYXMgc3VnZ2VzdGVkIGJ5IFRhayBLdXNoaWRhCisgIChrdXNoaWRhQHRybC5pYm0uY28uanApCisKKy0gQ2hlY2sgaWdtcCBjaGVja3N1bSBpZiBwb3NzaWJsZS4gVGhhbmtzIHRvIEpvaG4gSGF3a2luc29uLgorCistIE1hZGUgY2hhbmdlcyBmb3IgU0lOSVguIFRoYW5rcyB0byBBbmRyZWogQm9yc2Vua293CisgIChib3JzZW5rb3cubXNrQHNuaS5kZSkKKworLSBVc2UgYXV0b2NvbmYncyBpZGVhIG9mIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGluIGluc3RhbGwgdGFyZ2V0cy4KKyAgVGhhbmtzIHRvIEpvaG4gSGF3a2luc29uLgorCistIEF2b2lkIGluZmluaXRlIGxvb3AgaW4gdGNwIG9wdGlvbnMgcHJpbnRpbmcgY29kZS4gVGhhbmtzIHRvIEplZmZyZXkKKyAgTW9ndWwgKG1vZ3VsQHBhLmRlYy5jb20pCisKKy0gQXZvaWQgdXNpbmcgLWxzb2NrZXQgaW4gSVJJWCA1LjIgYW5kIGVhcmxpZXIgc2luY2UgaXQgYnJlYWtzIHNub29wLgorICBUaGFua3MgdG8gSm9obiBIYXdraW5zb24uCisKKy0gQWRkZWQgc29tZSBtb3JlIHBhY2tldCB0cnVuY2F0aW9uIGNoZWNrcy4KKworLSBPbiBzeXN0ZW1zIHRoYXQgaGF2ZSBpdCwgdXNlIHNpZ3NldCgpIGluc3RlYWQgb2Ygc2lnbmFsKCkgc2luY2UKKyAgc2lnbmFsKCkgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gdGhlc2Ugc3lzdGVtcy4KKworLSBGaXhlZCBzb21lIG1vcmUgYWxpZ25tZW50IHByb2JsZW1zIG9uIHRoZSBhbHBoYS4KKworLSBBZGQgY29kZSB0byBtYXNzYWdlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGRvbWFpbiBhbmQgaXB4CisgIHByaW50ZXJzLiBUaGFua3MgdG8gSm9obiBIYXdraW5zb24uCisKKy0gQWRkZWQgZXhwbGljaXQgbmV0bWFzayBzdXBwb3J0LiBUaGFua3MgdG8gU3RldmUgTnVjaGlhCisgIChzdGV2ZUByZXNlYXJjaC5va25ldC5jb20pCisKKy0gQWRkICJzY2EiIGtleXdvcmQgKGZvciBERUMgY2x1c3RlciBzZXJ2aWNlcykgYXMgc3VnZ2VzdGVkIGJ5IFRlcnJ5CisgIEtlbm5lZHkgKHRlcnJ5QHNwY3Z4YS5zcGMuZWR1KQorCistIEFkZCAiYXRhbGsiIGtleXdvcmQgYXMgc3VnZ2VzdGVkIGJ5IEpvaG4gSGF3a2luc29uLgorCistIEFkZGVkIGFuIGlncnAgcHJpbnRlci4gVGhhbmtzIHRvIEZyYW5jaXMgRHVwb250CisgIChmcmFuY2lzLmR1cG9udEBpbnJpYS5mcikKKworLSBQcmludCBJUFggbmV0IG51bWJlcnMgaW4gaGV4IGEgbGEgTm92ZWxsIE5ldHdhcmUuIFRoYW5rcyB0byBUZXJyeQorICBLZW5uZWR5ICh0ZXJyeUBzcGN2eGEuc3BjLmVkdSkKKworLSBGaXhlZCBzbm1wIGV4dGVuZGVkIHRhZyBmaWVsZCBwYXJzaW5nIGJ1Zy4gVGhhbmtzIHRvIFBhc2NhbCBIZW5uZXF1aW4KKyAgKHBhc2NhbC5oZW5uZXF1aW5AaHVnby5pbnQtZXZyeS5mcikKKworLSBBZGRlZCBzb21lIEVUSEVSVFlQRXMgbWlzc2luZyBvbiBzb21lIHN5c3RlbXMuCisKKy0gQWRkZWQgdHJ1bmNhdGVkIHBhY2tldCBtYWNyb3MgYW5kIHZhcmlvdXMgY2hlY2tzLgorCistIEZpeGVkIGVuZGlhbiBwcm9ibGVtcyB3aXRoIHRoZSBERUNuZXQgcHJpbnRlci4KKworLSBVc2UgJENDIHdoZW4gY2hlY2tpbmcgZ2NjIHZlcnNpb24uIFRoYW5rcyB0byBDYXJsIExpbmRiZXJnCisgIChjYXJsX2xpbmRiZXJnQGJsYWNrc21pdGguY29tKQorCistIEZpeGVzIGZvciBBSVggKGFsdGhvdWdoIHRoaXMgc3lzdGVtIGlzIG5vdCB5ZXQgc3VwcG9ydGVkKS4gVGhhbmtzIHRvCisgIEpvaG4gSGF3a2luc29uLgorCistIEZpeCBidWdzIGluIHRoZSBhdXRvY29uZiBtaXNhbGlnbmVkIGFjY2Vzc2VzIGNvZGUgZnJhZ21lbnQuCisKKy0gSW5jbHVkZSBzeXMvcGFyYW0uaCB0byBnZXQgQllURV9PUkRFUiBpbiBhIGZldyBwbGFjZXMuIFRoYW5rcyB0bworICBQYXZsaW4gSXZhbm92IFJhZG9zbGF2b3YgKHBhdmxpbkBjcy50aXRlY2guYWMuanApCisKK3YzLjIgU3VuIEp1biAyMyAwMjoyODoxMCBQRFQgMTk5NgorCistIFByaW50IG5ldyBpY21wIHVucmVhY2hhYmxlIGNvZGVzIGFzIHN1Z2dlc3RlZCBieSBNYXJ0aW4gRnJlZHJpa3Nzb24KKyAgKG1hcnRpbkBtc3Auc2UpLiBBbHNvIHByaW50IGNvZGUgdmFsdWUgd2hlbiB1bmtub3duIGZvciBpY21wIHJlZGlyZWN0CisgIGFuZCB0aW1lIGV4Y2VlZGVkLgorCistIEZpeCBhbiBhbGlnbm1lbnQgZW5kaWFuIGJ1ZyBpbiBnZXRuYW1lKCkuIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbi4KKworLSBEZWZpbmUgIm5ldyIgZG9tYWluIHJlY29yZCB0eXBlcyBpZiBub3QgZm91bmQgaW4gYXJwYS9uYW1lc2Vydi5oLgorICBSZXN1bHRlZCBmcm9tIGEgc3VnZ2VzdGlvbiBmcm9tIEpvaG4gSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KS4gQWxzbworICBmaXhlZCBhbiBlbmRpYW4gYnVnIHdoZW4gcHJpbnRpbmcgbXggcmVjb3JkIGFuZCBhZGRlZCBzb21lIG5ldyByZWNvcmQKKyAgdHlwZXMuCisKKy0gQWRkZWQgUklQIFYyIHN1cHBvcnQuIFRoYW5rcyB0byBKZWZmcmV5IEhvbmlnIChqY2hAYnNkaS5jb20pCisKKy0gQWRkZWQgVC9UQ1Agb3B0aW9ucyBwcmludGluZy4gQXMgc3VnZ2VzdGVkIGJ5IFJpY2hhcmQgU3RldmVucworICAocnN0ZXZlbnNAbm9hby5lZHUpCisKKy0gVXNlIGF1dG9jb25mIHRvIGRldGVjdCBhcmNoaXRlY3R1cmVzIHRoYXQgY2FuJ3QgaGFuZGxlIG1pc2FsaWduZWQKKyAgYWNjZXNzZXMuCisKK3YzLjEgVGh1IEp1biAxMyAyMDo1OTozMiBQRFQgMTk5NgorCistIENoYW5nZWQgdV9pbnQzMi9pbnQzMiB0byB1X2ludDMyX3QvaW50MzJfdCB0byBiZSBjb25zaXN0ZW50IHdpdGggYnNkCisgIGFuZCBiaW5kIChhcyBzdWdnZXN0ZWQgYnkgQ2hhcmxlcyBIYW5udW0pLgorCistIFBvcnQgdG8gR05VIGF1dG9jb25mLgorCistIEFkZCBzdXBwb3J0IGZvciBwcmludGluZyBEVk1SUCBhbmQgUElNIHRyYWZmaWMgdGhhbmtzIHRvCisgIEhhdmFyZCBFaWRuZXMgKEhhdmFyZC5FaWRuZXNAcnVuaXQuc2ludGVmLm5vKS4KKworLSBGaXggQXBwbGVUYWxrLCBJUFggYW5kIERFQ25ldCBieXRlIG9yZGVyIHByb2JsZW1zIGR1ZSB0byB3cm9uZyBlbmRpYW4KKyAgZGVmaW5lIGJlaW5nIHJlZmVyZW5jZWQuIFJlcG9ydGVkIGJ5IFRlcnJ5IEtlbm5lZHkuCisKKy0gTWlub3IgZml4ZXMgdG8gdGhlIG1hbiBwYWdlIHRoYW5rcyB0byBNYXJrIEFuZHJld3MuCisKKy0gRW5kaWFuIGZpeGVzIHRvIFJUUCBhbmQgdmF0IHBhY2tldCBkdW1wZXJzLCB0aGFua3MgdG8gQnJ1Y2UgTWFoCisgIChibWFoQGNzLmJlcmtlbGV5LmVkdSkuCisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGRucyB0eXBlcywgdGhhbmtzIHRvIFJhaW5lciBPcnRoLgorCistIEZpeGVkIHRmdHBfcHJpbnQoKSB0byBwcmludCB0aGUgYmxvY2sgbnVtYmVyIGZvciBBQ0tzLgorCistIERvY3VtZW50IC1kZCBhbmQgLWRkZC4gUmVzdWx0ZWQgZnJvbSBhIGJ1ZyByZXBvcnQgZnJvbSBDaGFybGllIFNsYXRlcgorICAoY3NsYXRlckBpbWF0ZWsuY29tKS4KKworLSBDaGVjayByZXR1cm4gc3RhdHVzIGZyb20gbWFsbG9jL2NhbGxvYy9ldGMuCisKKy0gQ2hlY2sgcmV0dXJuIHN0YXR1cyBmcm9tIHBjYXBfbG9vcCgpIHNvIHdlIGNhbiBwcmludCBhbiBlcnJvciBhbmQKKyAgZXhpdCB3aXRoIGEgYmFkIHN0YXR1cyBpZiB0aGVyZSB3ZXJlIHByb2JsZW1zLgorCistIEJhaWwgaWYgaXAgb3B0aW9uIGxlbmd0aCBpcyA8PSAwLiBSZXN1bHRlZCBmcm9tIGEgYnVnIHJlcG9ydCBmcm9tCisgIERhcnJlbiBSZWVkIChkYXJyZW5yQHZpdHJ1dml1cy5hcmJsZC51bmltZWxiLmVkdS5hdSkuCisKKy0gUHJpbnQgb3V0IGEgbGl0dGxlIG1vcmUgaW5mb3JtYXRpb24gZm9yIHN1biBycGMgcGFja2V0cy4KKworLSBBZGQgc3Vwb3J0IGZvciBLZXJiZXJvcyA0IHRoYW5rcyB0byBKb2huIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkuCisKKy0gRml4ZWQgdGhlIEZpeCBFWFRSQUNUX1NIT1JUKCkgYW5kIEVYVFJBQ1RfTE9ORygpIG1hY3JvcyAod2hpY2ggd2VyZQorICB3cm9uZyBvbiBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzKS4KKworLSBGaXhlZCBhbGlnbm1lbnQgYnVnIGluIGlweF9kZWNvZGUoKS4gVGhhbmtzIHRvIE1hdHQgQ3Jhd2ZvcmQKKyAgKGNyYXdkYWRAZm5hbC5nb3YpLgorCistIEZpeCBudHBfcHJpbnQoKSB0byBub3QgcHJpbnQgZ2FyYmFnZSB3aGVuIHRoZSBzdHJhdHVtIGlzCisgICJ1bnNwZWNpZmllZC4iIFRoYW5rcyB0byBEZXVzIEV4IE1hY2hpbmEgKHJvb3RAYmVsbGUuYm9yay5jb20pLgorCistIFJld3JvdGUgdGNwIG9wdGlvbnMgcHJpbnRlciBjb2RlIHRvIGNoZWNrIGZvciB0cnVuY2F0aW9uLiBBZGRlZAorICBzZWxlY3RpdmUgYWNrbm93bGVkZ21lbnQgY2FzZS4KKworLSBGaXhlZCBhbiBlbmRpYW4gYnVnIGluIHRoZSBvc3BmIHByaW50ZXIuIFRoYW5rcyB0byBKZWZmcmV5IEMgSG9uaWcKKyAgKGpjaEBic2RpLmNvbSkKKworLSBGaXggcmlwIHByaW50ZXIgdG8gaGFuZGxlIDQuNCBCU0Qgc29ja2FkZHIgc3RydWN0IHdoaWNoIG9ubHkgdXNlcyBvbmUKKyAgb2N0ZXQgZm9yIHRoZSBzYV9mYW1pbHkgbWVtYmVyLiBUaGFua3MgdG8gWW9zaGl0YWthIFRva3VnYXdhCisgICh0b2t1QGRpdC5jby5qcCkKKworLSBEb24ndCBjaGVja3N1bSBpcCBoZWFkZXIgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgb2YgaXQuIFRoYW5rcyB0byBKb2huCisgIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkuCisKKy0gUHJpbnQgb3V0IGhvc3RuYW1lcyBpZiBwb3NzaWJsZSBpbiBlZ3AgcHJpbnRlci4gVGhhbmtzIHRvIEplZmZyZXkKKyAgSG9uaWcgKGpoY0Bic2RpLmNvbSkKKworCit2My4xYTEgV2VkIE1heSAgMyAxOToyMToxMSBQRFQgMTk5NQorCistIEluY2x1ZGUgdGltZS5oIHdoZW4gU1ZSNCBpcyBkZWZpbmVkIHRvIGF2b2lkIHByb2JsZW1zIHVuZGVyIFNvbGFyaXMKKyAgMi4zLgorCistIEZpeCBldGhlcmFkZHJfc3RyaW5nKCkgaW4gdGhlIEVUSEVSX1NFUlZJQ0UgdG8gcmV0dXJuIHRoZSBzYXZlZAorICBzdHJpbmdzLCBub3QgdGhlIGxvY2FsIGJ1ZmZlci4gVGhhbmtzIHRvIFN0ZWZhbiBQZXRyaQorICAocGV0cmlAaWJyLmNzLnR1LWJzLmRlKS4KKworLSBEZXRlY3Qgd2hlbiBwY2FwIHJhaXNlcyB0aGUgc25hcGxlbiAoZS5nLiB3aXRoIHNuaXQpLiBQcmludCBhIHdhcm5pbmcKKyAgdGhhdCB0aGUgc2VsZWN0ZWQgdmFsdWUgd2FzIG5vdCB1c2VkLiBUaGFua3MgdG8gUGFzY2FsIEhlbm5lcXVpbgorICAoUGFzY2FsLkhlbm5lcXVpbkBodWdvLmludC1ldnJ5LmZyKS4KKworLSBBZGQgYSB0cnVuY2F0ZWQgcGFja2V0IHRlc3QgdG8gcHJpbnQtbmZzLmMuIFRoYW5rcyB0byBQYXNjYWwgSGVubmVxdWluLgorCistIEJZVEVPUkRFUiAtPiBCWVRFX09SREVSIFRoYW5rcyB0byBUZXJyeSBLZW5uZWR5ICh0ZXJyeUBzcGN2eGEuc3BjLmVkdSkuCisKK3YzLjAuMyBTdW4gT2N0ICAxIDE4OjM1OjAwIEdNVCAxOTk1CisKKy0gQWx0aG91Z2ggdGhlcmUgbmV2ZXIgd2FzIGEgMy4wLjMgcmVsZWFzZSwgdGhlIGxpbnV4IGJveXMgY2xldmVybHkKKyAgInJlbGVhc2VkIiBvbmUgaW4gbGF0ZSAxOTk1LgorCit2My4wLjIgVGh1IEFwciAyMCAyMToyODoxNiBQRFQgMTk5NQorCistIENoYW5nZSBjb25maWd1cmF0aW9uIHRvIG5vdCB1c2UgZ2NjIHYyIGZsYWdzIHdpdGggZ2NjIHYxLgorCistIFJlZG8gZ210MmxvY2FsKCkgc28gdGhhdCBpdCB3b3JrcyB1bmRlciBCU0RJICh3aGljaCBzZWVtcyB0byByZXR1cm4KKyAgYW4gZW1wdHkgdGltZXpvbmUgc3RydWN0IGZyb20gZ2V0dGltZW9mZGF5KCkpLiBCYXNlZCBvbiByZXBvcnQgZnJvbQorICBUZXJyeSBLZW5uZWR5ICh0ZXJyeUBzcGN2eGEuc3BjLmVkdSkuCisKKy0gQ2hhbmdlIGNvbmZpZ3VyZSB0byByZWNvZ25pemUgSVBbMC05XSogYXMgIm1pcHMiIFNHSSBoYXJkd2FyZS4gQmFzZWQKKyAgb24gcmVwb3J0IGZyb20gTWFyayBBbmRyZXdzIChtYW5kcmV3c0BhbGlhcy5jb20pLgorCistIERvbid0IHBhc3MgY2MgZmxhZ3MgdG8gZ2NjLiBSZXN1bHRlZCBmcm9tIGEgYnVnIHJlcG9ydCBmcm9tIFJhaW5lcgorICBPcnRoIChyb0B0ZWNoZmFrLnVuaS1iaWVsZWZlbGQuZGUpLgorCistIEZpeGVkIHByaW50b3V0IG9mIGNvbm5lY3Rpb24gaWQgZm9yIHVuY29tcHJlc3NlZCB0Y3Agc2xpcCBwYWNrZXRzLgorICBSZXN1bHRlZCBmcm9tIGEgYnVnIHJlcG9ydCBmcm9tIFJpY2hhcmQgU3RldmVucyAocnN0ZXZlbnNAbm9hby5lZHUpLgorCistIEhhY2sgYXJvdW5kIGRlZmljaWVuY3kgaW4gVWx0cml4J3MgbWFrZS4KKworLSBBZGQgRVRIRVJUWVBFX1RSQUlMIGRlZmluZSB3aGljaCBpcyBtaXNzaW5nIGZyb20gaXJpeDUuCisKK3YzLjAuMSBXZWQgQXVnIDMxIDIyOjQyOjI2IFBEVCAxOTk0CisKKy0gRml4IHByb2JsZW1zIHdpdGggZ2NjMiB2cy4gbWFsbG9jKCkgYW5kIHJlYWQoKSBwcm90b3R5cGVzIHVuZGVyIFN1bk9TIDQuCisKK3YzLjAgTW9uIEp1biAyMCAxOToyMzoyNyBQRFQgMTk5NAorCistIEFkZGVkIHN1cHBvcnQgZm9yIHByaW50aW5nIHRjcCBvcHRpb24gdGltZXN0YW1wcyB0aGFua3MgdG8KKyAgTWFyayBBbmRyZXdzIChtYW5kcmV3c0BhbGlhcy5jb20pLgorCistIFJlb3JnYW5pemUgcHJvdG9jb2wgZHVtcGVycyB0byB0YWtlIGNvbnN0IHBvaW50ZXJzIHRvIHBhY2tldHMgc28gdGhleQorICBuZXZlciBjaGFuZ2UgdGhlIGNvbnRlbnRzIChpLmUuLCB0aGV5IHVzZWQgdG8gZG8gZW5kaWFuIGNvbnZlcnNpb25zCisgIGluIHBsYWNlKS4gIFByZXZpb3VzbHksIHdoZW5ldmVyIG1vcmUgdGhhbiBvbmUgcGFzcyB3YXMgdGFrZW4gb3ZlcgorICB0aGUgcGFja2V0LCB0aGUgcGFja2V0IGNvbnRlbnRzIHdvdWxkIGJlIGR1bXBlZCBpbmNvcnJlY3RseSAoaS5lLiwKKyAgdGhlIG91dHB1dCBmb3JtIC14IHdvdWxkIGJlIHdyb25nIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMgYmVjYXVzZQorICB0aGUgcHJvdG9jb2wgZHVtcGVycyB3b3VsZCBtb2RpZnkgdGhlIGRhdGEpLiAgVGhhbmtzIHRvIENoYXJsZXMgSGFubnVtCisgIChteWNyb2Z0QGdudS5haS5taXQuZWR1KSBmb3IgcmVwb3J0aW5nIHRoaXMgcHJvYmxlbS4KKworLSBBZGRlZCBzdXBwb3J0IGZvciBkZWNuZXQgcHJvdG9jb2wgZHVtcGluZyB0aGFua3MgdG8gSmVmZiBNb2d1bAorICAobW9ndWxAcGEuZGVjLmNvbSkuCisKKy0gRml4IGJ1ZyB0aGF0IGNhdXNlZCBsZW5ndGggb2YgcGFja2V0IHRvIGJlIGluY29ycmVjdGx5IHByaW50ZWQKKyAgKG9mZiBieSBldGhlciBoZWFkZXIgc2l6ZSkgZm9yIHVua25vd24gZXRoZXJuZXQgdHlwZXMgdGhhbmtzCisgIHRvIEdyZWcgTWlsbGVyIChnbWlsbGVyQGtheWFrLm1pdHJlLm9yZykuCisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgSVBYIHByb3RvY29sIGR1bXBpbmcgdGhhbmtzIHRvIEJyYWQgUGFya2VyCisgIChicmFkQGZjci5jb20pLgorCistIEFkZGVkIGNoZWNrIHRvIHZlcmlmeSBJUCBoZWFkZXIgY2hlY2tzdW0gdW5kZXIgLXYgdGhhbmtzIHRvCisgIEJyYWQgUGFya2VyIChicmFkQGZjci5jb20pLgorCistIE1vdmUgcGFja2V0IGNhcHR1cmUgY29kZSB0byBuZXcgbGlicGNhcCBsaWJyYXJ5ICh3aGljaCBpcworICBwYWNrYWdlZCBzZXBhcmF0ZWx5KS4KKworLSBQcm90b3R5cGUgZXZlcnl0aGluZyBhbmQgYXNzdW1lIGFuIGFuc2kgY29tcGlsZXIuCisKKy0gcHJpbnQtYXJwLmM6IFByaW50IGhhcmR3YXJlIGV0aGVybmV0IGFkZHJlc3NlcyBpZiB0aGV5J3JlIG5vdAorICB3aGF0IHdlIGV4cGVjdC4KKworLSBwcmludC1ib290cC5jOiBEZWNvZGUgdGhlIGNtdSB2ZW5kb3IgZmllbGQuIEFkZCBSRkMxNDk3IHRhZ3MuCisgIE1hbnkgaGVscGZ1bCBzdWdnZXN0aW9ucyBmcm9tIEdvcmRvbiBSb3NzIChnd3JAamVyaWNoby5tYy5jb20pLgorCistIHByaW50LWZkZGkuYzogSW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gSmVmZnJleSBNb2d1bAorICAobW9ndWxAcGEuZGVjLmNvbSkuCisKKy0gcHJpbnQtaWNtcC5jOiBCeXRlIHN3YXAgbmV0bWFzayBiZWZvcmUgcHJpbnRpbmcuIFRoYW5rcyB0bworICBSaWNoYXJkIFN0ZXZlbnMgKHJzdGV2ZW5zQG5vYW8uZWR1KS4gUHJpbnQgaWNtcCB0eXBlIHdoZW4gdW5rbm93bi4KKworLSBwcmludC1pcC5jOiBQcmludCB0aGUgaW5uZXIgaXAgZGF0YWdyYW0gb2YgaXAtaW4taXAgZW5jYXBzdWxhdGVkIHBhY2tldHMuCisgIEJ5IGRlZmF1bHQsIG9ubHkgdGhlIGlubmVyIHBhY2tldCBpcyBkdW1wZWQsIGFwcGVuZGVkIHdpdGggdGhlIHRva2VuCisgICIoZW5jYXApIi4gIFVuZGVyIC12LCBib3RoIHRoZSBpbm5lciBhbmQgb3V0cHV0IHBhY2tldHMgYXJlIGR1bXBlZAorICAob24gdGhlIHNhbWUgbGluZSkuICBOb3RlIHRoYXQgdGhlIGZpbHRlciBhcHBsaWVzIHRvIHRoZSBvcmlnaW5hbCBwYWNrZXQsCisgIG5vdCB0aGUgZW5jYXBzdWxhdGVkIHBhY2tldC4gIFNvIGlmIHlvdSBydW4gdGNwZHVtcCBvbiBhIG5ldCB3aXRoIGFuCisgIElQIE11bHRpY2FzdCB0dW5uZWwsIHlvdSBjYW5ub3QgZmlsdGVyIG91dCB0aGUgZGF0YWdyYW1zIHVzaW5nIHRoZQorICBjb252ZW50aW9uYWwgc3ludGF4LiAgKFlvdSBjYW4gZmlsdGVyIGF3YXkgYWxsIHRoZSBpcC1pbi1pcCB0cmFmZmljCisgIHdpdGggIm5vdCBpcCBwcm90byA0Ii4pCisKKy0gcHJpbnQtbmZzLmM6IEtlZXAgcGVuZGluZyBycGMncyBpbiBjaXJjdWxhciB0YWJsZS4gQWRkIGdlbmVyaWMKKyAgbmZzIGhlYWRlciBhbmQgcmVtb3ZlIG9zIGRlcGVuZGVuY2VzLiBUaGFua3MgdG8gSmVmZnJleSBNb2d1bC4KKworLSBwcmludC1vc3BmLmM6IEltcHJvdmVtZW50cy4gVGhhbmtzIHRvIEplZmZyZXkgTW9ndWwuCisKKy0gdGNwZHVtcC5jOiBBZGQgLVQgZmxhZyBhbGxvd3MgaW50ZXJwcmV0YXRpb24gb2YgInZhdCIsICJ3YiIsICJycGMiCisgIChzdW5ycGMpIGFuZCBydHAgcGFja2V0cy4gQWRkZWQgImluYm91bmQiIGFuZCAib3V0Ym91bmQiIGtleXdvcmRzCisgIEFkZCAmJiBhbmQgfHwgb3BlcmF0b3JzCisKK3YyLjIuMSBUdWUgSnVuIDYgMTc6NTc6MjIgUERUIDE5OTIKKworLSBGaXggYnVnIHdpdGggLWMgZmxhZy4KKwordjIuMiBGcmkgTWF5IDIyIDE3OjE5OjQxIFBEVCAxOTkyCisKKy0gc2F2ZWZpbGUuYzogUmVtb3ZlIGhhY2sgdGhhdCBzaG91bGRuJ3QgaGF2ZSBiZWVuIGV4cG9ydGVkLiBBZGQKKyAgdHJ1bmNhdGUgY2hlY2tzLgorCistIEFkZGVkIHRoZSAnaWNtcCcga2V5d29yZC4gIEZvciBleGFtcGxlLCAnaWNtcFswXSAhPSA4IGFuZCBpY21wWzBdICE9IDAnCisgIG1hdGNoZXMgbm9uLWVjaG8vcmVwbHkgSUNNUCBwYWNrZXRzLgorCistIE1hbnkgaW1wcm92ZW1lbnRzIHRvIGZpbHRlciBjb2RlIG9wdGltaXplci4KKworLSBBZGRlZCAnbXVsdGljYXN0JyBrZXl3b3JkIGFuZCBleHRlbmRlZCB0aGUgJ2Jyb2FkY2FzdCcga2V5d29yZCBjYW4gbm93IGJlCisgIHNvIHRoYXQgcHJvdG9jb2wgcXVhbGlmaWNhdGlvbnMgYXJlIGFsbG93ZWQuIEZvciBleGFtcGxlLCAiaXAgYnJvYWRjYXN0IgorICBhbmQgImV0aGVyIG11bHRpY2FzdCIgYXJlIHZhbGlkIGZpbHRlcnMuCisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgbW9uaXRvcmluZyB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChpLmUuICd0Y3BkdW1wIC1pIGxvJykuCisgIEplZmZyZXkgSG9uaWcgKGpjaEBNSVRDSEVMTC5DSVQuQ09STkVMTC5FRFUpIGNvbnRyaWJ1dGVkIHRoZSBrZXJuZWwKKyAgcGF0Y2hlcyB0byBuZXRpbmV0L2lmX2xvb3AuYy4KKworLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgVW5nZXJtYW5uLUJhc3MgRXRoZXJuZXQgb24gSUJNL1BDLVJUcyBydW5uaW5nIEFPUy4KKyAgQ29udGFjdCBKZWZmcmV5IEhvbmlnIChqY2hATUlUQ0hFTEwuQ0lULkNPUk5FTEwuRURVKSBmb3IgdGhlIGRpZmZzLgorCistIEFkZGVkIEVHUCBhbmQgT1NQRiBwcmludGVycywgdGhhbmtzIHRvIEplZmZyZXkgSG9uaWcuCisKK3YyLjEgVHVlIEphbiAyOCAxMTowMDoxNCBQU1QgMTk5MgorCistIEludGVybmFsIHJlbGVhc2UgKG5ldmVyIHB1YmxpY2FsbHkgZXhwb3J0ZWQpLgorCit2Mi4wLjEgU3VuIEphbiAyNiAyMToxMDoxMCBQRFQKKworLSBWYXJpb3VzIGJ5dGUgb3JkZXJpbmcgZml4ZXMuCisKKy0gQWRkIHRydW5jYXRpb24gY2hlY2tzLgorCistIGluZXQuYzogU3VwcG9ydCBCU0Qgc3R5bGUgU0lPQ0dJRkNPTkYuCisKKy0gbmFtZXRvYWRkci5jOiBIYW5kbGUgbXVsdGkgYWRkcmVzc2VzIGZvciBzaW5nbGUgaG9zdC4KKworLSBvcHRpbWl6ZS5jOiBSZXdyaXR0ZW4uCisKKy0gcGNhcC1icGYuYzogZG9uJ3QgY2hva2Ugd2hlbiB3ZSBnZXQgcHRyYWNlZC4gb25seSBzZXQgcHJvbWlzY3VvdXMKKyAgZm9yIGJyb2FkY2FzdCBuZXRzLgorCistIHByaW50LWF0YWwuYzogRml4IGFuIGFsaWdubWVudCBidWcgKHRoYW5rcyB0bworICBzdGFub25pa0BucHJkYy5uYXZ5Lm1pbCkgQWRkIG1pc3NpbmcgcHJpbnRmKCkgYXJndW1lbnQuCisKKy0gcHJpbnQtYm9vdHAuYzogRmlyc3QgYXR0ZW1wdCBhdCBkZWNvZGluZyB0aGUgdmVuZG9yIGJ1ZmZlci4KKworLSBwcmludC1kb21haW4uYzogRml4IHRydW5jYXRpb24gY2hlY2tzLgorCistIHByaW50LWljbXAuYzogQ2FsY3VsYXRlIGxlbmd0aCBvZiBwYWNrZXRzIGZyb20gdGhlIGlwIGhlYWRlci4KKworLSBwcmludC1pcC5jOiBQcmludCBmcmFnIGlkIGluIGRlY2ltYWwgKHNvIGl0J3MgZWFzaWVyIHRvIG1hdGNoIHVwCisgIHdpdGggbm9uLWZyYWdzKS4gQWRkIHN1cHBvcnQgZm9yIG9zcGYsIGVncCBhbmQgaWdtcC4KKworLSBwcmludC1uZnMuYzogTG90cyBvZiBjaGFuZ2VzLgorCistIHByaW50LW50cC5jOiBNYWtlIHNvbWUgdmVyYm9zZSBvdXRwdXQgZGVwZW5kIG9uIC12LgorCistIHByaW50LXNubXAuYzogTmV3IHZlcnNpb24gZnJvbSBKb2huIExvVmVyc28uCisKKy0gcHJpbnQtdGNwLmM6IFByaW50IHJmYzEwNzIgdGNwIG9wdGlvbnMuCisKKy0gdGNwZHVtcC5jOiBQcmludCAiMHgiIHByZWZpeCBmb3IgJXggZm9ybWF0cy4gQWx3YXlzIHByaW50IDYgZGlnaXRzCisgIChtaWNyb3NlY29uZHMpIHdvcnRoIG9mIHByZWNpc2lvbi4gRml4IHVpZCBidWdzLgorCistIEEgcGFja2V0IGR1bXBlciBoYXMgYmVlbiBhZGRlZCAodGhhbmtzIHRvIEplZmYgTW9ndWwgb2YgREVDV1JMKS4KKyAgV2l0aCB0aGlzIG9wdGlvbiwgeW91IGNhbiBjcmVhdGUgYW4gYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGJpbmFyeQorICB0cmFjZSBmaWxlIGluIHJlYWwgdGltZSwgd2l0aG91dCB0aGUgb3ZlcmhlYWQgb2YgdGhlIHBhY2tldCBwcmludGVyLgorICBBdCBhIGxhdGVyIHRpbWUsIHRoZSBwYWNrZXRzIGNhbiBiZSBmaWx0ZXJlZCAoYWdhaW4pIGFuZCBwcmludGVkLgorCistIEJTRCBpcyBzdXBwb3J0ZWQuICBZb3UgbXVzdCBoYXZlIEJQRiBpbiB5b3VyIGtlcm5lbC4KKyAgU2luY2UgdGhlIGZpbHRlcmluZyBpcyBub3cgZG9uZSBpbiB0aGUga2VybmVsLCBmZXdlciBwYWNrZXRzIGFyZQorICBkcm9wcGVkLiAgSW4gZmFjdCwgd2l0aCBCUEYgYW5kIHRoZSBwYWNrZXQgZHVtcGVyIG9wdGlvbiwgYSBtZWFzbHkKKyAgU3VuIDMvNTAgY2FuIGtlZXAgdXAgd2l0aCBhIGJ1c3kgbmV0d29yay4KKworLSBDb21wcmVzc2VkIFNMSVAgcGFja2V0cyBjYW4gbm93IGJlIGR1bXBlZCwgcHJvdmlkZWQgeW91IHVzZSBvdXIKKyAgU0xJUCBzb2Z0d2FyZSBhbmQgQlBGLiAgVGhlc2UgcGFja2V0cyBhcmUgZHVtcGVkIGFzIGFueSBvdGhlciBJUAorICBwYWNrZXQ7IHRoZSBjb21wcmVzc2VkIGhlYWRlcnMgYXJlIGR1bXBlZCB3aXRoIHRoZSAnLWUnIG9wdGlvbi4KKworLSBNYWNoaW5lcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcmluZyBhcmUgc3VwcG9ydGVkICh0aGFua3MgdG8KKyAgSmVmZiBNb2d1bCkuCisKKy0gVWx0cml4IDQuMCBpcyBzdXBwb3J0ZWQgKGFsc28gdGhhbmtzIHRvIEplZmYgTW9ndWwpLgorCistIElCTSBSVCBhbmQgU3RhbmZvcmQgRW5ldGZpbHRlciBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIGJ5CisgIFJheWFuIFphY2hhcmlhc3NlbiA8cmF5YW5AY2FuZXQuY2E+LiAgVGNwZHVtcCBoYXMgYmVlbiB0ZXN0ZWQgdW5kZXIKKyAgYm90aCB0aGUgdmFuaWxsYSBFbmV0ZmlsdGVyIGludGVyZmFjZSwgYW5kIHRoZSBleHRlbmRlZCBpbnRlcmZhY2UKKyAgKCNpZmRlZidkIGJ5IElCTVJUUEMpIHByZXNlbnQgaW4gdGhlIE1FUklUIHZlcnNpb24gb2YgdGhlIEVuZXRmaWx0ZXIuCisKKy0gVEZUUCBwYWNrZXRzIGFyZSBub3cgcHJpbnRlZCAocmVxdWVzdHMgb25seSkuCisKKy0gQk9PVFAgcGFja2V0cyBhcmUgbm93IHByaW50ZWQuCisKKy0gU05NUCBwYWNrZXRzIGFyZSBub3cgcHJpbnRlZC4gKHRoYW5rcyB0byBKb2huIExvVmVyc28gb2YgWHlsb2dpY3MpLgorCistIFNwYXJjIGFyY2hpdGVjdHVyZXMsIGluY2x1ZGluZyB0aGUgU3BhcmNzdGF0aW9uLTEsIGFyZSBub3cKKyAgc3VwcG9ydGVkIHRoYW5rcyB0byBTdGV2ZSBNY0Nhbm5lIGFuZCBDcmFpZyBMZXJlcy4KKworLSBTdW5PUyA0IGlzIG5vdyBzdXBwb3J0ZWQgdGhhbmtzIHRvIE1pY2t5IExpdSBvZiBDb2x1bWJpYQorICBVbml2ZXJzaXR5IChtaWNreUBjdW5peGMuY2MuY29sdW1iaWEuZWR1KS4KKworLSBJUCBvcHRpb25zIGFyZSBub3cgcHJpbnRlZC4KKworLSBSSVAgcGFja2V0cyBhcmUgbm93IHByaW50ZWQuCisKKy0gVGhlcmUncyBhIC12IGZsYWcgdGhhdCBwcmludHMgb3V0IG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUKKyAgZGVmYXVsdCAoZS5nLiwgaXQgd2lsbCBlbmFibGUgcHJpbnRpbmcgb2YgSVAgdHRsLCB0b3MgYW5kIGlkKQorICBhbmQgLXEgZmxhZyB0aGF0IHByaW50cyBvdXQgbGVzcyAoZS5nLiwgaXQgd2lsbCBkaXNhYmxlCisgIGludGVycHJldGF0aW9uIG9mIEFwcGxlVGFsay1pbi1VRFApLgorCistIFRoZSBncmFtbWFyIGhhcyB1bmRlcmdvbmUgc3Vic3RhbnRpYWwgY2hhbmdlcyAoaWYgeW91IGhhdmUgYW4KKyAgZWFybGllciB2ZXJzaW9uIG9mIHRjcGR1bXAsIHlvdSBzaG91bGQgcmUtcmVhZCB0aGUgbWFudWFsCisgIGVudHJ5KS4KKworICBUaGUgbW9zdCB1c2VmdWwgY2hhbmdlIGlzIHRoZSBhZGRpdGlvbiBvZiBhbiBleHByZXNzaW9uCisgIHN5bnRheCB0aGF0IGxldHMgeW91IGZpbHRlciBvbiBhcmJpdHJhcnkgZmllbGRzIG9yIHZhbHVlcyBpbiB0aGUKKyAgcGFja2V0LiAgRS5nLiwgImlwWzBdID4gMHg0NSIgd291bGQgcHJpbnQgb25seSBwYWNrZXRzIHdpdGggSVAKKyAgb3B0aW9ucywgInRjcFsxM10gJiAzICE9IDAiIHdvdWxkIHByaW50IG9ubHkgVENQIFNZTiBhbmQgRklOCisgIHBhY2tldHMuCisKKyAgVGhlIG1vc3QgcGFpbmZ1bCBjaGFuZ2UgaXMgdGhhdCBjb25jYXRlbmF0aW9uIG5vIGxvbmdlciBtZWFucworICAiYW5kIiAtLSBlLmcuLCB5b3UgaGF2ZSB0byBzYXkgImhvc3QgZm9vIGFuZCBwb3J0IGJhciIgaW5zdGVhZAorICBvZiAiaG9zdCBmb28gcG9ydCBiYXIiLiAgVGhlIHVwIHNpZGUgdG8gdGhpcyBkb3duIGlzIHRoYXQKKyAgcmVwZWF0ZWQgcXVhbGlmaWVycyBjYW4gYmUgb21pdHRlZCwgbWFraW5nIG1vc3QgZmlsdGVyCisgIGV4cHJlc3Npb25zIHNob3J0ZXIuICBFLmcuLCB5b3UgY2FuIG5vdyBzYXkgImlwIGhvc3QgZm9vIGFuZAorICAoYmFyIG9yIGJheikiIHRvIGxvb2sgYXQgaXAgdHJhZmZpYyBiZXR3ZWVuIGhvc3RzIGZvbyBhbmQgYmFyIG9yCisgIGJldHdlZW4gaG9zdHMgZm9vIGFuZCBiYXouICBbVGhlIG9sZCB3YXkgb2Ygc2F5aW5nIHRoaXMgd2FzICJpcAorICBob3N0IGZvbyBhbmQgKGlwIGhvc3QgYmFyIG9yIGlwIGhvc3QgYmF6KSIuXQorCit2Mi4wIFN1biBKYW4gMTMgMTI6MjA6NDAgUFNUIDE5OTEKKworLSBJbml0aWFsIHB1YmxpYyByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvQ1JFRElUUyBiL0NSRURJVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyNzg4MAotLS0gL2Rldi9udWxsCisrKyBiL0NSRURJVFMKQEAgLTAsMCArMSwxNTEgQEAKK1RoaXMgZmlsZSBsaXN0cyBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGNwZHVtcDoKKworVGhlIGN1cnJlbnQgbWFpbnRhaW5lcnM6CisJQmlsbCBGZW5uZXIJCQk8ZmVubmVyQHJlc2VhcmNoLmF0dC5jb20+CisgICAgICAgIERhdmlkIFlvdW5nICAgICAgICAgICAgICAgICAgICAgPGR5b3VuZ0Bwb2JveC5jb20+CisJRnVsdmlvIFJpc3NvCQkJPHJpc3NvQHBvbGl0by5pdD4KKwlHdXkgSGFycmlzCSAJCTxndXlAYWx1bS5taXQuZWR1PgorCUhhbm5lcyBHcmVkbGVyCQkJPGhhbm5lc0BqdW5pcGVyLm5ldD4KKwlKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8JPGl0b2p1bkBpaWpsYWIubmV0PgorCU1pY2hhZWwgUmljaGFyZHNvbgkgCTxtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYT4KKworQWRkaXRpb25hbCBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgcGF0Y2hlczoKKworICAgICAgICBBYXJvbiBDYW1wYmVsbCAgICAgICAgICAgICAgICAgIDxhYXJvbkBhcmJvci5uZXQ+CisJQWxmcmVkbyBBbmRyZXMJCQk8YWFuZHJlc0BzMjFzZWMuY29tPgorCUFsYmVydCBDaGluCQkJPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT4KKwlBbmRyZXcgQnJvd24JCQk8YXRhdGF0QGF0YXRkb3QubmV0PgorCUFuZHJldyBDaHVyY2gJCQk8YW5kcmV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlBbmRyZXcgSGludHoJCQk8YWRoaW50ekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisJQW5kcmV3IFRyaWRnZWxsCQkJPHRyaWRnZUBsaW51eGNhcmUuY29tPgorICAgICAgICBBbmR5IEhlZmZlcm5hbiAgICAgICAgICAgICAgICAgIDxhaGhAanVuaXBlci5uZXQ+CisJQXJrYWRpdXN6IE1pc2tpZXdpY3ogCQk8bWlzaWVrQHBsZC5vcmcucGw+CisJQXJtYW5kbyBMLiBDYXJvIEpyLgkJPGFjYXJvQG1haWwuZWVjaXMudWRlbC5lZHU+CisJQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCTxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4KKwlBdHN1c2hpIE9ub2UJCQk8b25vZUBuZXRic2Qub3JnPgorCUJlbiBTbWl0aHVyc3QJCQk8YmVuQHNjaWVudGlhLmRlbW9uLmNvLnVrPgorCUJyZW50IEwuIEJhdGVzCQkJPGJsYmF0ZXNAdmlneWFuLmNvbT4KKwlCcmlhbiBHaW5zYmFjaAkJCTxnaW5zYmFjaEBjcmF5LmNvbT4KKwlCcnVjZSBNLiBTaW1wc29uCQk8Ym1zQHNwYy5vcmc+CisJQ2FybGVzIEtpc2hpbW90byBCaXNiZSAgICAgICAgICA8Y2tpc2hpbW9AYWMudXBjLmVzPgorCUNoYXJsaWUgTGVuYWhhbgkJCTxjbGVuYWhhbkBmb3J0cmVzc3RlY2guY29tPgorCUNoYXJsZXMgTS4gSGFubnVtCQk8bXljcm9mdEBuZXRic2Qub3JnPgorCUNocmlzIENvZ2RvbgkJCTxjaHJpc0Bjb2dkb24ub3JnPgorCUNocmlzIEcuIERlbWV0cmlvdQkJPGNnZEBuZXRic2Qub3JnPgorCUNocmlzdGlhbiBTaWV2ZXJzCQk8Y19zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlDaHJpcyBKZXBld2F5CQkJPGplcGV3YXlAYmxhc3RlZC1oZWF0aC5jb20+CisJQ2hyaXMgTGFyc29uCQkJPGNsYXJzb25Aa2VyZ290aC5jb20+CisJQ3JhaWcgUm9kcmlndWVzCQkJPHJvZHJpZ2NAbWVkaWFvbmUubmV0PgorCUNyaXN0IEouIENsYXJrCQkJPGNqY2xhcmtAYWx1bS5taXQuZWR1PgorCURhbmllbCBIYWdlcnR5IAkJCTxoYWdAYWkubWl0LmVkdT4KKwlEYXJyZW4gUmVlZAkJCTxkYXJyZW5yQHJlZWQud2F0dGxlLmlkLmF1PgorCURhdmlkIEJpbmRlcm1hbgkJCTxkLmJpbmRlcm1hbkB2aXJnaW4ubmV0PgorCURhdmlkIFNtaXRoCQkJPGRzbWl0aEByZWRoYXQuY29tPgorCURhdmlkIFlvdW5nCQkJPGR5b3VuZ0BvamN0ZWNoLmNvbT4KKwlEb24gRWJyaWdodAkJCTxEb24uRWJyaWdodEBjb21wdXdhcmUuY29tPgorCUVkZGllIEtvaGxlcgkJCTx4ZXhkQHNvdXJjZWZvcmdlLm5ldD4KKwlGcmFuY2lzIER1cG9udAkJCTxGcmFuY2lzLkR1cG9udEBlbnN0LWJyZXRhZ25lLmZyPgorCUZyYW5jaXNjbyBNYXRpYXMgQ3VlbmNhLUFjdW5hCTxtY3VlbmNhQGdlb3JnZS5ydXRnZXJzLmVkdT4KKwlGcmFuayBWb2xmCQkJPHZvbGZAb2FzaXMuSUFFaHYubmw+CisJRnVsdmlvIFJpc3NvCQkJPHJpc3NvQHBvbGl0by5pdD4KKwlHZW9yZ2UgQmFrb3MJCQk8Z2Jha29zQGlzdHMuZGFydG1vdXRoLmVkdT4KKwlHZXJhbGQgQ29tYnMJCQk8Z2VyYWxkQGV0aGVyZWFsLmNvbT4KKwlHZXJ0IERvZXJpbmcJCQk8Z2VydEBncmVlbmllLm11Yy5kZT4KKyAgICAgICAgR3JlZyBTdGFyayAgICAgICAgICAgICAgICAgICAgICA8Z3NzdGFya0BtaXQuZWR1PgorCUdpbGJlcnQgUmFtaXJleiBKci4JCTxncmFtQHhpZXhpZS5vcmc+CisJR2lzbGUgVmFuZW0JCQk8Z2l2YUBiZ25ldHQubm8+CisgICAgICAgIEhhbm5lcyBWaWVydGVsICAgICAgICAgICAgICAgICAgPGh2aWVydGVsQGp1bmlwZXIubmV0PgorCUhhbmsgTGVpbmluZ2VyCQkJPHRjcGR1bXAtd29ya2Vyc0Bwcm9ncmVzc2l2ZS1jb21wLmNvbT4KKwlIYXJyeSBSYWF5bWFrZXJzCQk8aGFycnlyQGNvbm5lY3QuY29tLmF1PgorCUhlaW56LUFkbyBBcm5vbGRzCQk8QWRvLkFybm9sZHNAZGhtLXN5c3RlbXMuZGU+CisJSGVuZHJpayBTY2hvbHoJCQk8aGVuZHJpa0BzY2hvbHoubmV0PgorCUlhbiBNY0RvbmFsZAkJCTxpbWNkbnpsQGdtYWlsLmNvbT4KKyAgICAgICAgSmFjZWsgVG9iaWFzeiAgICAgICAgICAgICAgICAgICA8SmFjZWsuVG9iaWFzekBhdG0uY29tLnBsPgorCUpha29iIFNjaGx5dGVyCQkJPGpha29iQG9wZW5ic2Qub3JnPgorCUphbiBPcmF2ZWMJCQk8d3N4QHdzeDYubmV0PgorCUphc29uIFIuIFRob3JwZQkJCTx0aG9ycGVqQG5ldGJzZC5vcmc+CisJSmVmZmVyc29uIE9nYXRhIAkJPGpvZ2F0YUBub2RjLm5vYWEuZ292PgorCUplZmZyZXkgSHV0emVsbWFuCQk8amh1dHpAY211LmVkdT4KKwlKZXNwZXIgUGV0ZXJzb24JCQk8amVzcGVyQGVuZGFjZS5jb20+CisJSmltIEh1dGNoaW5zCQkJPGppbUBjYS5zYW5kaWEuZ292PgorICAgICAgICBKb25hdGhhbiBIZXVzc2VyICAgICAgICAgICAgICAgIDxqb25ueUBkcnVncGhpc2guY2g+CisJVGF0dXlhIEppbm1laQkJCTxqaW5tZWlAa2FtZS5uZXQ+CisJSvhyZ2VuIFRob21zZW4JCQk8anRoQGp0aC5uZXQ+IAorCUp1bGlhbiBDb3dsZXkJCQk8anVsaWFuQGxhdmEubmV0PgorCUthYXJ0aGlrIFNpdmFrdW1hcgkJPGthYXJ0aGlrQHRvcnJlbnRuZXQuY29tPgorCUthenVzaGkgU3VneW8JCQk8c3VneW9AcGIuanAubmVjLmNvbT4KKwlLZWxseSBDYXJtaWNoYWVsCQk8a2Nhcm1pY2hAaXBhcHAuY29tPgorCUtlbiBIb3Juc3RlaW4JCQk8a2VuaEBjbWYubnJsLm5hdnkubWlsPgorCUtldmluIFN0ZXZlcwkJCTxzdGV2ZXNrQHBvYm94LmNvbT4KKwlLbGF1cyBLbGVpbgkJCTxrbGVpbmtAcmV6aXByb3ppdGFldC5kZT4KKyAJS3JpcyBLZW5uYXdheQkJCTxrcmlzQGZyZWVic2Qub3JnPgorCUtyenlzenRvZiBIYWxhc2EJCTxraGNAcG0ud2F3LnBsPgorCUxhcnJ5IExpbGUJCQk8bGlsZUBzdGRpby5jb20+CisJTGVubmVydCBCdXl0ZW5oZWsgCQk8YnV5dGVuaEBnbnUub3JnPgorCUxvcmlzIERlZ2lvYW5uaQkJCTxsb3Jpc0BuZXRncm91cC1zZXJ2LnBvbGl0by5pdD4KKwlMb3ZlIEj2cm5xdWlzdC3Fc3RyYW5kCQk8bGhhQHN0YWNrZW4ua3RoLnNlPgorCU1hY2llaiBXLiBSb3p5Y2tpCQk8bWFjcm9AZHMyLnBnLmdkYS5wbD4KKwlNYW51IFBhdGhhawkJCTxtYXBhdGhha0BjaXNjby5jb20+CisJTWFyYyBBLiBMZWhtYW5uCQkJPHBjZ0Bnb29mLmNvbT4KKwlNYXJrIEVsbHpleSBUaG9tYXMJCTxtYXJrQGFja2Vycy5uZXQ+CisJTWFya28gS2lpc2tpbGEJCQk8Y2FybmlsQGNzLnR1dC5maT4KKwlNYXJrdXMgU2No9nBmbGluCQk8c2Nob2VwZmxpbkBzb3VyY2Vmb3JnZS5uZXQ+CisJTWFyc2hhbGwgUm9zZQkJCTxtcm9zZUBkYmMubXR2aWV3LmNhLnVzPgorCU1hcnRpbiBIdXNlbWFubgkJCTxtYXJ0aW5AbmV0YnNkLm9yZz4KKwlNYXggTGFpZXIJCQk8bWF4QGxvdmUycGFydHkubmV0PgorCU1pY2hhZWwgTWFkb3JlCQkJPG1tYWRvcmVAdHVyYm9saW51eC5jb20+CisJTWljaGFlbCBTaGFsYXllZmYJCTxtaWNrZXlAb3BlbmJzZC5vcmc+CisJTWljaGFlbCBTaGllbGRzCQkJPHNoaWVsZHNAbXNybC5jb20+CisJTWljaGFlbCBULiBTdG9sYXJjaHVrCQk8bXRzQG9mZi50bz4KKwlNaWNoZWxlICJteWRlY2F5IiBNYXJjaGV0dG8JPHNtYXJjaGV0dG8xQHRpbi5pdD4KKwlNb25yb2UgV2lsbGlhbXMgCQk8bW9ucm9lQHBvYm94LmNvbT4KKwlNb3Rvbm9yaSBTaGluZG8JCQk8bXNoaW5kb0Btc2hpbmRvLm5ldD4KKwlOYXRoYW4gSi4gV2lsbGlhbXMJCTxuYXRoYW53QE1JVC5FRFU+CisJTmF0aGFuaWVsIENvdXBlci1Ob2xlcwkJPE5hdGhhbmllbEBpc2kxLnRjY2lzaS5jb20+CisJTmVpbCBULiBTcHJpbmcJCQk8Ymx1ZWhhbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisJTmllbHMgUHJvdm9zCQkJPHByb3Zvc0BvcGVuYnNkLm9yZz4KKwlOaWNrb2xhaSBaZWxkb3ZpY2gJCTxrb2x5YUBNSVQuRURVPgorICAgICAgICBOaWNvbGFzIEZlcnJlcm8gICAgICAgICAgICAgICAgIDx0b29yb3BAYmFieWxvLm5ldD4KKwlOb3JpdG9zaGkgRGVtaXp1CQk8ZGVtaXp1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlPbGFmIEtpcmNoIAkJCTxva2lyQGNhbGRlcmEuZGU+CisJT25ubyB2YW4gZGVyIExpbmRlbgkJPG9ubm9Ac2ltcGxleC5ubD4KKwlQYXNjYWwgSGVubmVxdWluIAkJPHBhc2NhbC5oZW5uZXF1aW5AaW50LWV2cnkuZnI+CisJUGFzdm9ybiBCb29ubWFyawkJPGJvb25tYXJrQGp1bmlwZXIubmV0PgorCVBhdWwgTXVuZHQJCQk8bGV0aGFsQGxpbnV4LXNoLm9yZz4KKwlQYXVsIFMuIFRyYWluYQkJCTxwc3RAZnJlZWJzZC5vcmc+CisJUGF2bGluIFJhZG9zbGF2b3YJCTxwYXZsaW5AaWNpci5vcmc+CisJUGVra2EgU2F2b2xhIAkJCTxwZWtrYXNAbmV0Y29yZS5maT4JCisJUGV0ZXIgRmFsZXMJCQk8cGV0ZXJAZmFsZXMtbG9yZW56Lm5ldD4KKwlQZXRlciBKZXJlbXkJCQk8cGV0ZXIuamVyZW15QGFsY2F0ZWwuY29tLmF1PgorCQkJCQk8cGZodW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlQaGlsIFdvb2QJCQk8Y3B3QGxhbmwuZ292PgorCVJhZmFsIE1hc3prb3dza2kJCTxyem1AaWNtLmVkdS5wbD4KKwlSYXBoYWVsIFJhaW1iYXVsdAkJPHJhcGhhZWwucmFpbWJhdWx0QG5ldGFzcS5jb20+CisJUmljayBDaGVuZyAgICAgICAgICAgICAgICAgICAgICA8cmNoZW5nQGp1bmlwZXIubmV0PgorCVJpY2sgSm9uZXMJCQk8cmljay5qb25lczJAaHAuY29tPgorCVJpY2sgV2F0c29uCQkJPHdhdHNvbnJpY2tAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCVJvYiBCcmF1bgkJCTxiYnJhdW5Ac3luYWNrLm5ldD4KKwlSb2RlcmljayBTY2hlcnRsZXIJCTxyb2Rlcmlja0Bhcmdvbi5vcmc+CisJU2FtaSBGYXJpbgkJCTxzYWZhcmlAaWtpLmZpPgorCVNjb3R0IFJvc2UJCQk8c3liZXJwdW5rQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlTZWJhc3RpYW4gS3JhaG1lcgkJPGtyYWhtZXJAY3MudW5pLXBvdHNkYW0uZGU+CisJU2ViYXN0aWVuIFZpbmNlbnQJCTxzdmluY2VudEBpZGVtcy5mcj4KKwlTZXRoIFdlYnN0ZXIJCQk8c3dlYnN0ZXJAc3N0LmxsLm1pdC5lZHU+CisJU2hpbnN1a2UgU3V6dWtpCQkJPHN1ekBrYW1lLm5ldD4KKwlTdGVpbmFyIEhhdWcJCQk8c3RoYXVnQG5ldGhlbHAubm8+CisgICAgICAgIFN3YW1pbmF0aGFuIENoYW5kcmFzZWthcmFuICAgICAgPGNoYW5kZXJAanVuaXBlci5uZXQ+CisJVGFrYXNoaSBZYW1hbW90bwkJPHlhbXRAbXdkLmJpZ2xvYmUubmUuanA+CisJVGVycnkgS2VubmVkeQkJCTx0ZXJyeUB0bWsuY29tPgorCVRpbW8gS29za2lhaGRlCisJVG9ueSBMaQkJCQk8dGxpQHByb2NrZXQuY29tPgorCVVucyBMaWRlcgkJCTx1bnNsaWRlckBtaXJhbmRhLm9yZz4KKwlWaWN0b3IgT3BwbGVtYW4JCQk8b3BwbGVtYW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgorCVdlc2xleSBHcmlmZmluCQkJPHdncmlmZmluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKwlXaWxiZXJ0IGRlIEdyYWFmCQk8d2lsYmVydGRnQGhldG5ldC5ubD4KKwlZZW4gWWVuIExpbQorCVlvc2hpZnVtaSBOaXNoaWRhCisKK1RoZSBvcmlnaW5hbCBMQkwgY3JldzoKKwlTdGV2ZSBNY0Nhbm5lCisJQ3JhaWcgTGVyZXMKKwlWYW4gSmFjb2Jzb24KZGlmZiAtLWdpdCBhL0ZJTEVTIGIvRklMRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyYWZhMgotLS0gL2Rldi9udWxsCisrKyBiL0ZJTEVTCkBAIC0wLDAgKzEsMjUxIEBACitDSEFOR0VTCitDUkVESVRTCitGSUxFUworSU5TVEFMTAorTElDRU5TRQorTWFrZWZpbGUuaW4KK1JFQURNRQorUmVhZG1lLldpbjMyCitWRVJTSU9OCithY2NvbmZpZy5oCithY2xvY2FsLm00CithZGRydG9uYW1lLmMKK2FkZHJ0b25hbWUuaAorYWYuYworYWYuaAorYWguaAorYW9kdi5oCithcHBsZXRhbGsuaAorYXJjbmV0LmgKK2F0aW1lLmF3aworYXRtLmgKK2F0bXVuaTMxLmgKK2Jvb3RwLmgKK2JwZl9kdW1wLmMKK2JncC5oCitjaGRsYy5oCitjb25maWcuZ3Vlc3MKK2NvbmZpZy5oLmluCitjb25maWcuc3ViCitjb25maWd1cmUKK2NvbmZpZ3VyZS5pbgorY3BhY2suYworY3BhY2suaAorZGNjcC5oCitkZWNuZXQuaAorZGVjb2RlX3ByZWZpeC5oCitlbmMuaAorZXNwLmgKK2V0aGVyLmgKK2V0aGVydHlwZS5oCitleHRyYWN0LmgKK2ZkZGkuaAorZ21wbHMuYworZ21wbHMuaAorZ210MmxvY2FsLmMKK2dtdDJsb2NhbC5oCitpY21wNi5oCitpZWVlODAyXzExLmgKK2llZWU4MDJfMTFfcmFkaW8uaAoraWdycC5oCitpbnN0YWxsLXNoCitpbnRlcmZhY2UuaAoraXAuaAoraXA2LmgKK2lwZmMuaAoraXBwcm90by5jCitpcHByb3RvLmgKK2lwc2VjX2RvaS5oCitpcHguaAoraXNha21wLmgKK2wydHAuaAorbDJ2cG4uYworbDJ2cG4uaAorbGFuZS5oCitsYmwvb3Mtb3NmNC5oCitsYmwvb3Mtc29sYXJpczIuaAorbGJsL29zLXN1bm9zNC5oCitsYmwvb3MtdWx0cml4NC5oCitsbGMuaAorbWFjaGRlcC5jCittYWNoZGVwLmgKK21ha2VtaWIKK21pYi5oCittaXNzaW5nL2FkZHJpbmZvLmgKK21pc3NpbmcvYWRkcnNpemUuaAorbWlzc2luZy9iaXR0eXBlcy5oCittaXNzaW5nL2RsbmFtZXMuYworbWlzc2luZy9kYXRhbGlua3MuYworbWlzc2luZy9nZXRhZGRyaW5mby5jCittaXNzaW5nL2dldG5hbWVpbmZvLmMKK21pc3NpbmcvaW5ldF9hdG9uLmMKK21pc3NpbmcvaW5ldF9udG9wLmMKK21pc3NpbmcvaW5ldF9wdG9uLmMKK21pc3NpbmcvcmVzb2x2Ni5oCittaXNzaW5nL3Jlc29sdl9leHQuaAorbWlzc2luZy9zbnByaW50Zi5jCittaXNzaW5nL3NvY2tzdG9yYWdlLmgKK21pc3Npbmcvc3RyZHVwLmMKK21pc3Npbmcvc3RybGNhdC5jCittaXNzaW5nL3N0cmxjcHkuYworbWlzc2luZy9zdHJzZXAuYworbWtkZXAKK21wbHMuaAorbmFtZXNlci5oCituZXRiaW9zLmgKK25ldGRpc3NlY3QuaAorbmZzLmgKK25mc2ZoLmgKK25scGlkLmMKK25scGlkLmgKK250cC5oCitvYWtsZXkuaAorb3NwZi5oCitvc3BmNi5oCitvdWkuYworb3VpLmgKK3BhY2tldGRhdC5hd2sKK3BhcnNlbmZzZmguYworcGNhcF9kdW1wX2Z0ZWxsLmMKK3BjYXAtbWlzc2luZy5oCitwbWFwX3Byb3QuaAorcHBwLmgKK3ByaW50LTgwMl8xMS5jCitwcmludC1haC5jCitwcmludC1hb2R2LmMKK3ByaW50LWFwMTM5NC5jCitwcmludC1hcmNuZXQuYworcHJpbnQtYXJwLmMKK3ByaW50LWFzY2lpLmMKK3ByaW50LWF0YWxrLmMKK3ByaW50LWF0bS5jCitwcmludC1iZWVwLmMKK3ByaW50LWJmZC5jCitwcmludC1iZ3AuYworcHJpbnQtYm9vdHAuYworcHJpbnQtY2RwLmMKK3ByaW50LWNoZGxjLmMKK3ByaW50LWNpcC5jCitwcmludC1jbmZwLmMKK3ByaW50LWRjY3AuYworcHJpbnQtZGVjbmV0LmMKK3ByaW50LWRoY3A2LmMKK3ByaW50LWRvbWFpbi5jCitwcmludC1kdm1ycC5jCitwcmludC1lYXAuYworcHJpbnQtZWdwLmMKK3ByaW50LWVuYy5jCitwcmludC1lc3AuYworcHJpbnQtZWlncnAuYworcHJpbnQtZXRoZXIuYworcHJpbnQtZmRkaS5jCitwcmludC1mci5jCitwcmludC1mcmFnNi5jCitwcmludC1ncmUuYworcHJpbnQtaHNycC5jCitwcmludC1pY21wLmMKK3ByaW50LWljbXA2LmMKK3ByaW50LWlnbXAuYworcHJpbnQtaWdycC5jCitwcmludC1pcC5jCitwcmludC1pcDYuYworcHJpbnQtaXA2b3B0cy5jCitwcmludC1pcGNvbXAuYworcHJpbnQtaXBmYy5jCitwcmludC1pcHguYworcHJpbnQtaXNha21wLmMKK3ByaW50LWlzb2NsbnMuYworcHJpbnQtanVuaXBlci5jCitwcmludC1rcmIuYworcHJpbnQtbDJ0cC5jCitwcmludC1sYW5lLmMKK3ByaW50LWxkcC5jCitwcmludC1sbGMuYworcHJpbnQtbG1wLmMKK3ByaW50LWxzcHBpbmcuYworcHJpbnQtbHdyZXMuYworcHJpbnQtbW9iaWxlLmMKK3ByaW50LW1vYmlsaXR5LmMKK3ByaW50LW1wbHMuYworcHJpbnQtbXNkcC5jCitwcmludC1uZXRiaW9zLmMKK3ByaW50LW5mcy5jCitwcmludC1udHAuYworcHJpbnQtbnVsbC5jCitwcmludC1vbHNyLmMKK3ByaW50LW9zcGYuYworcHJpbnQtb3NwZjYuYworcHJpbnQtcGZsb2cuYworcHJpbnQtcGdtLmMKK3ByaW50LXBpbS5jCitwcmludC1wcHAuYworcHJpbnQtcHBwb2UuYworcHJpbnQtcHB0cC5jCitwcmludC1yYWRpdXMuYworcHJpbnQtcmF3LmMKK3ByaW50LXJpcC5jCitwcmludC1yaXBuZy5jCitwcmludC1yc3ZwLmMKK3ByaW50LXJ0Ni5jCitwcmludC1yeC5jCitwcmludC1zY3RwLmMKK3ByaW50LXNpcC5jCitwcmludC1zbC5jCitwcmludC1zbGwuYworcHJpbnQtc2xvdy5jCitwcmludC1zbWIuYworcHJpbnQtc25tcC5jCitwcmludC1zdHAuYworcHJpbnQtc3VuYXRtLmMKK3ByaW50LXN1bnJwYy5jCitwcmludC1zeW1hbnRlYy5jCitwcmludC1zeXNsb2cuYworcHJpbnQtdGNwLmMKK3ByaW50LXRlbG5ldC5jCitwcmludC10ZnRwLmMKK3ByaW50LXRpbWVkLmMKK3ByaW50LXRva2VuLmMKK3ByaW50LXVkcC5jCitwcmludC12amMuYworcHJpbnQtdnJycC5jCitwcmludC13Yi5jCitwcmludC16ZXBoeXIuYworcm91dGU2ZC5oCitycGNfYXV0aC5oCitycGNfbXNnLmgKK3J4LmgKK3NjdHBDb25zdGFudHMuaAorc2N0cEhlYWRlci5oCitzZW5kLWFjay5hd2sKK3NldHNpZ25hbC5jCitzZXRzaWduYWwuaAorc2xjb21wcmVzcy5oCitzbGlwLmgKK3NsbC5oCitzbWIuaAorc21idXRpbC5jCitzdGltZS5hd2sKK3N0cmNhc2VjbXAuYwordGNwLmgKK3RjcGR1bXAuMQordGNwZHVtcC5jCit0Y3BkdW1wLXN0ZGluYy5oCit0ZWxuZXQuaAordGZ0cC5oCit0aW1lZC5oCit0b2tlbi5oCit1ZHAuaAordXRpbC5jCit2ZnByaW50Zi5jCit3aW4zMi9JbmNsdWRlL0FycGEvdGZ0cC5oCit3aW4zMi9JbmNsdWRlL2Vycm5vLmgKK3dpbjMyL0luY2x1ZGUvZ2V0b3B0LmgKK3dpbjMyL0luY2x1ZGUvaW5ldHByaXZhdGUuaAord2luMzIvSW5jbHVkZS90ZWxuZXQuaAord2luMzIvSW5jbHVkZS93MzJfZnpzLmgKK3dpbjMyL0luY2x1ZGUvTmV0aW5ldC9pbl9zeXN0bS5oCit3aW4zMi9JbmNsdWRlL05ldGluZXQvaXAuaAord2luMzIvU3JjL2dldG9wdC5jCit3aW4zMi9wcmovR05VbWFrZWZpbGUKK3dpbjMyL3Byai9XaW5EdW1wLmRzcAord2luMzIvcHJqL1dpbkR1bXAuZHN3CmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU5OTdmCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDI1MiBAQAorQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9JTlNUQUxMLHYgMS42My4yLjcgMjAwNy8wOS8xNCAwMTowMzoxMiBndXkgRXhwICQgKExCTCkKKworSWYgeW91IGhhdmUgbm90IGJ1aWx0IGxpYnBjYXAsIGFuZCB5b3VyIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGxpYnBjYXAKK2luc3RhbGxlZCwgaW5zdGFsbCBsaWJwY2FwIGZpcnN0LiAgWW91ciBzeXN0ZW0gbWlnaHQgcHJvdmlkZSBhIHZlcnNpb24KK29mIGxpYnBjYXAgdGhhdCBjYW4gYmUgaW5zdGFsbGVkOyBpZiBzbywgdG8gY29tcGlsZSB0Y3BkdW1wIHlvdSBtaWdodAorbmVlZCB0byBpbnN0YWxsIGEgImRldmVsb3BlciIgdmVyc2lvbiBvZiBsaWJwY2FwIGFzIHdlbGwgYXMgdGhlCisicnVuLXRpbWUiIHZlcnNpb24uICBZb3UgY2FuIGFsc28gaW5zdGFsbCB0Y3BkdW1wLm9yZydzIHZlcnNpb24gb2YKK2xpYnBjYXA7IHNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIHRoZSBmdHAgbG9jYXRpb24uCisKK1lvdSB3aWxsIG5lZWQgYW4gQU5TSSBDIGNvbXBpbGVyIHRvIGJ1aWxkIHRjcGR1bXAuIFRoZSBjb25maWd1cmUgc2NyaXB0Cit3aWxsIGFib3J0IGlmIHlvdXIgY29tcGlsZXIgaXMgbm90IEFOU0kgY29tcGxpYW50LiBJZiB0aGlzIGhhcHBlbnMsIHVzZQordGhlIEdOVSBDIGNvbXBpbGVyLCBhdmFpbGFibGUgdmlhIGFub255bW91cyBmdHA6CisKKwlmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L2djYy8KKworQWZ0ZXIgbGlicGNhcCBoYXMgYmVlbiBidWlsdCAoZWl0aGVyIGluc3RhbGwgaXQgd2l0aCAibWFrZSBpbnN0YWxsIiBvcgorbWFrZSBzdXJlIGJvdGggdGhlIGxpYnBjYXAgYW5kIHRjcGR1bXAgc291cmNlIHRyZWVzIGFyZSBpbiB0aGUgc2FtZQorZGlyZWN0b3J5KSwgcnVuIC4vY29uZmlndXJlIChhIHNoZWxsIHNjcmlwdCkuICAiY29uZmlndXJlIiB3aWxsCitkZXRlcm1pbmUgeW91ciBzeXN0ZW0gYXR0cmlidXRlcyBhbmQgZ2VuZXJhdGUgYW4gYXBwcm9wcmlhdGUgTWFrZWZpbGUKK2Zyb20gTWFrZWZpbGUuaW4uICBOb3cgYnVpbGQgdGNwZHVtcCBieSBydW5uaW5nICJtYWtlIi4KKworSWYgZXZlcnl0aGluZyBidWlsZHMgb2ssIHN1IGFuZCB0eXBlICJtYWtlIGluc3RhbGwiLiAgVGhpcyB3aWxsIGluc3RhbGwKK3RjcGR1bXAgYW5kIHRoZSBtYW51YWwgZW50cnkuICBBbnkgdXNlciB3aWxsIGJlIGFibGUgdG8gdXNlIHRjcGR1bXAgdG8KK3JlYWQgc2F2ZWQgY2FwdHVyZXMuICBXaGV0aGVyIGEgdXNlciB3aWxsIGJlIGFibGUgdG8gY2FwdHVyZSB0cmFmZmljCitkZXBlbmRzIG9uIHRoZSBPUyBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbTsgc2VlIHRoZSB0Y3BkdW1wCittYW4gcGFnZSBmb3IgZGV0YWlscy4gIERPIE5PVCBnaXZlIHVudHJ1c3RlZCB1c2VycyB0aGUgYWJpbGl0eSB0bworY2FwdHVyZSB0cmFmZmljLiAgSWYgYSB1c2VyIGNhbiBjYXB0dXJlIHRyYWZmaWMsIGhlIG9yIHNoZSBjb3VsZCB1c2UKK3V0aWxpdGllcyBzdWNoIGFzIHRjcGR1bXAgdG8gY2FwdHVyZSBhbnkgdHJhZmZpYyBvbiB5b3VyIG5ldCwgaW5jbHVkaW5nCitwYXNzd29yZHMuCisKK05vdGUgdGhhdCBtb3N0IHN5c3RlbXMgc2hpcCB0Y3BkdW1wLCBidXQgdXN1YWxseSBhbiBvbGRlciB2ZXJzaW9uLgorUmVtZW1iZXIgdG8gcmVtb3ZlIG9yIHJlbmFtZSB0aGUgaW5zdGFsbGVkIGJpbmFyeSB3aGVuIHVwZ3JhZGluZy4KKworSWYgeW91ciBzeXN0ZW0gaXMgbm90IG9uZSB3aGljaCB3ZSBoYXZlIHRlc3RlZCB0Y3BkdW1wIG9uLCB5b3UgbWF5IGhhdmUKK3RvIG1vZGlmeSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgTWFrZWZpbGUuaW4uIFBsZWFzZSBzZW5kIHVzIHBhdGNoZXMKK2ZvciBhbnkgbW9kaWZpY2F0aW9ucyB5b3UgbmVlZCB0byBtYWtlLgorCitQbGVhc2Ugc2VlICJQTEFURk9STVMiIGZvciBub3RlcyBhYm91dCB0ZXN0ZWQgcGxhdGZvcm1zLgorCisKK0ZJTEVTCistLS0tLQorQ0hBTkdFUwkJLSBkZXNjcmlwdGlvbiBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJlbGVhc2VzCitDUkVESVRTCQktIHBlb3BsZSB0aGF0IGhhdmUgaGVscGVkIHRjcGR1bXAgYWxvbmcKK0ZJTEVTCQktIGxpc3Qgb2YgZmlsZXMgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgZGlzdHJpYnV0aW9uCitJTlNUQUxMCQktIHRoaXMgZmlsZQorTElDRU5TRQkJLSB0aGUgbGljZW5zZSB1bmRlciB3aGljaCB0Y3BkdW1wIGlzIGRpc3RyaWJ1dGVkCitNYWtlZmlsZS5pbgktIGNvbXBpbGF0aW9uIHJ1bGVzIChpbnB1dCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCkKK1JFQURNRQkJLSBkZXNjcmlwdGlvbiBvZiBkaXN0cmlidXRpb24KK1JlYWRtZS5XaW4zMgktIG5vdGVzIG9uIGJ1aWxkaW5nIHRjcGR1bXAgb24gV2luMzIgc3lzdGVtcyAod2l0aCBXaW5QY2FwKQorVkVSU0lPTgkJLSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorYWNjb25maWcuaAktIGF1dG9jb25mIGlucHV0CithY2xvY2FsLm00CS0gYXV0b2NvbmYgbWFjcm9zCithZGRydG9uYW1lLmMJLSBhZGRyZXNzIHRvIGhvc3RuYW1lIHJvdXRpbmVzCithZGRydG9uYW1lLmgJLSBhZGRyZXNzIHRvIGhvc3RuYW1lIGRlZmluaXRpb25zCithaC5oCQktIElQU0VDIEF1dGhlbnRpY2F0aW9uIEhlYWRlciBkZWZpbml0aW9ucworYW9kdi5oCQktIEFPRFYgZGVmaW5pdGlvbnMKK2FwcGxldGFsay5oCS0gQXBwbGVUYWxrIGRlZmluaXRpb25zCithcmNuZXQuaAktIEFSQ05FVCBkZWZpbml0aW9ucworYXRpbWUuYXdrCS0gVENQIGFjayBhd2sgc2NyaXB0CithdG0uaAkJLSBBVE0gdHJhZmZpYyB0eXBlIGRlZmluaXRpb25zCithdG11bmkzMS5oCS0gQVRNIFEuMjkzMSBkZWZpbml0aW9ucworYmdwLmgJCS0gQkdQIGRlY2xhcmF0aW9ucworYm9vdHAuaAkJLSBCT09UUCBkZWZpbml0aW9ucworYnBmX2R1bXAuYwktIEJQRiBwcm9ncmFtIHByaW50aW5nIHJvdXRpbmVzLCBpbiBjYXNlIGxpYnBjYXAgZG9lc24ndAorCQkgIGhhdmUgdGhlbQorY2hkbGMuaAkJLSBDaXNjbyBIRExDIGRlZmluaXRpb25zCitjcGFjay5jCQktIGZ1bmN0aW9ucyB0byBleHRyYWN0IHBhY2tlZCBkYXRhCitjcGFjay5oCQktIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgdG8gZXh0cmFjdCBwYWNrZWQgZGF0YQorY29uZmlnLmd1ZXNzCS0gYXV0b2NvbmYgc3VwcG9ydAorY29uZmlnLmguaW4JLSBhdXRvY29uZiBpbnB1dAorY29uZmlnLnN1YgktIGF1dG9jb25mIHN1cHBvcnQKK2NvbmZpZ3VyZQktIGNvbmZpZ3VyZSBzY3JpcHQgKHJ1biB0aGlzIGZpcnN0KQorY29uZmlndXJlLmluCS0gY29uZmlndXJlIHNjcmlwdCBzb3VyY2UKK2RjY3AuaAkJLSBEQ0NQIGRlZmluaXRpb25zCitkZWNuZXQuaAktIERFQ25ldCBkZWZpbml0aW9ucworZGVjb2RlX3ByZWZpeC5oCS0gRGVjbGFyYXRpb25zIG9mICJkZWNvZGVfcHJlZml4ezQsNn0oKSIKK2VuYy5oCQktIE9wZW5CU0QgSVBzZWMgZW5jYXBzdWxhdGlvbiBCUEYgbGF5ZXIgZGVmaW5pdGlvbnMKK2VzcC5oCQktIElQU0VDIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCBkZWZpbml0aW9ucworZXRoZXIuaAkJLSBFdGhlcm5ldCBkZWZpbml0aW9ucworZXRoZXJ0eXBlLmgJLSBFdGhlcm5ldCB0eXBlIHZhbHVlIGRlZmluaXRpb25zCitleHRyYWN0LmgJLSBhbGlnbm1lbnQgZGVmaW5pdGlvbnMKK2ZkZGkuaAkJLSBGaWJlciBEaXN0cmlidXRlZCBEYXRhIEludGVyZmFjZSBkZWZpbml0aW9ucworZ21wbHMuYwkJLSBHTVBMUyBkZWZpbml0aW9ucworZ21wbHMuaAkJLSBHTVBMUyBkZWNsYXJhdGlvbnMKK2dtdDJsb2NhbC5jCS0gdGltZSBjb252ZXJzaW9uIHJvdXRpbmVzCitnbXQybG9jYWwuaAktIHRpbWUgY29udmVyc2lvbiBwcm90b3R5cGVzCitpY21wNi5oCQktIElDTVB2NiBkZWZpbml0aWlvbnMKK2llZWU4MDJfMTEuaAktIElFRUUgODAyLjExIGRlZmluaXRpb25zCitpZWVlODAyXzExX3JhZGlvLmggLSByYWRpb3RhcCBoZWFkZXIgZGVmaW5pdGlvbnMKK2lncnAuaAkJLSBJbnRlcmlvciBHYXRld2F5IFJvdXRpbmcgUHJvdG9jb2wgZGVmaW5pdGlvbnMKK2luc3RhbGwtc2gJLSBCU0Qgc3R5bGUgaW5zdGFsbCBzY3JpcHQKK2ludGVyZmFjZS5oCS0gZ2xvYmFscywgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMKK2lwLmgJCS0gSVAgZGVmaW5pdGlvbnMKK2lwNi5oCQktIElQdjYgZGVmaW5pdGlvbnMKK2lwZmMuaAkJLSBJUC1vdmVyLUZpYnJlIENoYW5uZWwgZGVmaW5pdGlvbnMKK2lwcHJvdG8uYwktIElQIHByb3RvY29sIHR5cGUgdmFsdWUtdG8tbmFtZSB0YWJsZQoraXBwcm90by5oCS0gSVAgcHJvdG9jb2wgdHlwZSB2YWx1ZSBkZWZpbml0aW9ucworaXBzZWNfZG9pLmgJLSBJU0FLTVAgcGFja2V0IGRlZmluaXRpb25zIC0gUkZDMjQwNworaXB4LmgJCS0gSVBYIGRlZmluaXRpb25zCitpc2FrbXAuaAktIElTQUtNUCBwYWNrZXQgZGVmaW5pdGlvbnMgLSBSRkMyNDA4CitsMnZwbi5jCQktIEwyVlBOIGVuY2Fwc3VsYXRpb24gdmFsdWUtdG8tbmFtZSB0YWJsZQorbDJ2cG4uaAkJLSBMMlZQTiBlbmNhcHN1bGF0aW9uIGRlZmluaXRpb25zCitsMnRwLmgJCS0gTGF5ZXIgVHdvIFR1bm5lbGluZyBQcm90b2NvbCBkZWZpbml0aW9ucworbGFuZS5oCQktIEFUTSBMQU5FIGRlZmluaXRpb25zCitsYmwvb3MtKi5oCS0gT1MtZGVwZW5kZW50IGRlZmluZXMgYW5kIHByb3RvdHlwZXMKK2xsYy5oCQktIExMQyBkZWZpbml0aW9ucworbWFjaGRlcC5jCS0gbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZXMKK21hY2hkZXAuaAktIG1hY2hpbmUgZGVwZW5kZW50IGRlZmluaXRpb25zCittYWtlbWliCQktIG1pYiB0byBoZWFkZXIgc2NyaXB0CittaWIuaAkJLSBtaWIgZGVmaW5pdGlvbnMKK21pc3NpbmcvKgktIHJlcGxhY2VtZW50cyBmb3IgbWlzc2luZyBsaWJyYXJ5IGZ1bmN0aW9ucworbWtkZXAJCS0gY29uc3RydWN0IE1ha2VmaWxlIGRlcGVuZGVuY3kgbGlzdAorbXBscy5oCQktIE1QTFMgZGVmaW5pdGlvbnMKK25hbWVzZXIuaAktIEROUyBkZWZpbml0aW9ucworbmV0Ymlvcy5oCS0gTkVUQklPUyBkZWZpbml0aW9ucworbmV0ZGlzc2VjdC5oCS0gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmb3IgdGNwZHVtcC1hcy1saWJyYXJ5CisJCSAgKHVuZGVyIGRldmVsb3BtZW50KQorbmZzLmgJCS0gTmV0d29yayBGaWxlIFN5c3RlbSBWMiBkZWZpbml0aW9ucworbmZzZmguaAkJLSBOZXR3b3JrIEZpbGUgU3lzdGVtIGZpbGUgaGFuZGxlIGRlZmluaXRpb25zCitubHBpZC5jCQktIE9TSSBOTFBJRCB2YWx1ZS10by1uYW1lIHRhYmxlCitubHBpZC5oCQktIE9TSSBOTFBJRCBkZWZpbml0aW9ucworbnRwLmgJCS0gTmV0d29yayBUaW1lIFByb3RvY29sIGRlZmluaXRpb25zCitvYWtsZXkuaAktIElTQUtNUCBwYWNrZXQgZGVmaW5pdGlvbnMgLSBSRkMyNDA5Citvc3BmLmgJCS0gT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IGRlZmluaXRpb25zCitvc3BmNi5oCQktIElQdjYgT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IGRlZmluaXRpb25zCitwYWNrZXRkYXQuYXdrCS0gVENQIGNodW5rIHN1bW1hcnkgYXdrIHNjcmlwdAorcGFyc2VuZnNmaC5jCS0gTmV0d29yayBGaWxlIFN5c3RlbSBmaWxlIHBhcnNlciByb3V0aW5lcworcGNhcF9kdW1wX2Z0ZWxsLmMgLSBwY2FwX2R1bXBfZnRlbGwoKSBpbXBsZW1lbnRhdGlvbiwgaW4gY2FzZSBsaWJwY2FwCisJCWRvZXNuJ3QgaGF2ZSBpdAorcGNhcC1taXNzaW5nLmgJLSBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIHBvc3NpYmx5IG1pc3NpbmcgZnJvbSBsaWJwY2FwCitwbWFwX3Byb3QuaAktIGRlZmluaXRpb25zIGZvciBPTkMgUlBDIHBvcnRtYXBwZXIgcHJvdG9jb2wKK3BwcC5oCQktIFBvaW50IHRvIFBvaW50IFByb3RvY29sIGRlZmluaXRpb25zCitwcmludC04MDJfMTEuYwktIElFRUUgODAyLjExIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWFwMTM5NC5jCS0gQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQgcHJpbnRlciByb3V0aW5lcworcHJpbnQtYWguYwktIElQU0VDIEF1dGhlbnRpY2F0aW9uIEhlYWRlciBwcmludGVyIHJvdXRpbmVzCitwcmludC1hb2R2LmMJLSBBT0RWIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWFyY25ldC5jCS0gQVJDTkVUIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWFycC5jCS0gQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWFzY2lpLmMJLSBBU0NJSSBwYWNrZXQgZHVtcCByb3V0aW5lcworcHJpbnQtYXRhbGsuYwktIEFwcGxlVGFsayBwcmludGVyIHJvdXRpbmVzCitwcmludC1hdG0uYwktIEFUTSBwcmludGVyIHJvdXRpbmVzCitwcmludC1iZ3AuYwktIEJvcmRlciBHYXRld2F5IFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWJvb3RwLmMJLSBCT09UUCBhbmQgSVB2NCBESENQIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWJlZXAuYwktIEJFRVAgcHJpbnRlciByb3V0aW5lcworcHJpbnQtY2RwLmMJLSBDaXNjbyBEaXNjb3ZlcnkgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtY2hkbGMuYwktIENpc2NvIEhETEMgcHJpbnRlciByb3V0aW5lcworcHJpbnQtY2lwLmMJLSBDbGFzc2ljYWwtSVAgb3ZlciBBVE0gcm91dGluZXMKK3ByaW50LWNuZnAuYwktIENpc2NvIE5ldEZsb3cgcHJpbnRlciByb3V0aW5lcworcHJpbnQtZGNjcC5jCS0gRENDUCBwcmludGVyIHJvdXRpbmVzCitwcmludC1kZWNuZXQuYwktIERFQ25ldCBwcmludGVyIHJvdXRpbmVzCitwcmludC1kaGNwNi5jCS0gSVB2NiBESENQIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWRvbWFpbi5jCS0gRG9tYWluIE5hbWUgU3lzdGVtIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWR2bXJwLmMJLSBEaXN0YW5jZSBWZWN0b3IgTXVsdGljYXN0IFJvdXRpbmcgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtZWFwLmMJLSBFQVAgcHJpbnRlciByb3V0aW5lcworcHJpbnQtZW5jLmMJLSBPcGVuQlNEIElQc2VjIGVuY2Fwc3VsYXRpb24gQlBGIGxheWVyIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWVncC5jCS0gRXh0ZXJuYWwgR2F0ZXdheSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1lc3AuYwktIElQU0VDIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCBwcmludGVyIHJvdXRpbmVzCitwcmludC1ldGhlci5jCS0gRXRoZXJuZXQgcHJpbnRlciByb3V0aW5lcworcHJpbnQtZmRkaS5jCS0gRmliZXIgRGlzdHJpYnV0ZWQgRGF0YSBJbnRlcmZhY2UgcHJpbnRlciByb3V0aW5lcworcHJpbnQtZnIuYwktIEZyYW1lIFJlbGF5IHByaW50ZXIgcm91dGluZXMKK3ByaW50LWZyYWc2LmMJLSBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWdyZS5jCS0gR2VuZXJpYyBSb3V0aW5nIEVuY2Fwc3VsYXRpb24gcHJpbnRlciByb3V0aW5lcworcHJpbnQtaHNycC5jCS0gQ2lzY28gSG90IFN0YW5kYnkgUm91dGVyIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWljbXAuYwktIEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1pY21wNi5jCS0gSVB2NiBJbnRlcm5ldCBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtaWdtcC5jCS0gSW50ZXJuZXQgR3JvdXAgTWFuYWdlbWVudCBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1pZ3JwLmMJLSBJbnRlcmlvciBHYXRld2F5IFJvdXRpbmcgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtaXAuYwktIElQIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWlwNi5jCS0gSVB2NiBwcmludGVyIHJvdXRpbmVzCitwcmludC1pcDZvcHRzLmMJLSBJUHY2IGhlYWRlciBvcHRpb24gcHJpbnRlciByb3V0aW5lcworcHJpbnQtaXBjb21wLmMJLSBJUCBQYXlsb2FkIENvbXByZXNzaW9uIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWlweC5jCS0gSVBYIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWlzYWttcC5jCS0gSW50ZXJuZXQgU2VjdXJpdHkgQXNzb2NpYXRpb24gYW5kIEtleSBNYW5hZ2VtZW50IFByb3RvY29sCitwcmludC1pc29jbG5zLmMJLSBJU08gQ0xOUywgRVNJUywgYW5kIElTSVMgcHJpbnRlciByb3V0aW5lcworcHJpbnQta3JiLmMJLSBLZXJiZXJvcyBwcmludGVyIHJvdXRpbmVzCitwcmludC1sMnRwLmMJLSBMYXllciBUd28gVHVubmVsaW5nIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWxhbmUuYwktIEFUTSBMQU5FIHByaW50ZXIgcm91dGluZXMKK3ByaW50LWxsYy5jCS0gSUVFRSA4MDIuMiBMTEMgcHJpbnRlciByb3V0aW5lcworcHJpbnQtbHNwcGluZy5jCS0gTFNQUElORyBwcmludGVyIHJvdXRpbmVzCitwcmludC1sd3Jlcy5jCS0gTGlnaHR3ZWlnaHQgUmVzb2x2ZXIgcHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtbW9iaWxlLmMJLSBJUHY0IG1vYmlsaXR5IHByaW50ZXIgcm91dGluZXMKK3ByaW50LW1vYmlsaXR5LmMgLSBJUHY2IG1vYmlsaXR5IHByaW50ZXIgcm91dGluZXMKK3ByaW50LW1wbHMuYwktIE11bHRpLVByb3RvY29sIExhYmVsIFN3aXRjaGluZyBwcmludGVyIHJvdXRpbmVzCitwcmludC1tc2RwLmMJLSBNdWx0aWNhc3QgU291cmNlIERpc2NvdmVyeSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1uZXRiaW9zLmMJLSBOZXRCSU9TIGZyYW1lIHByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LW5mcy5jCS0gTmV0d29yayBGaWxlIFN5c3RlbSBwcmludGVyIHJvdXRpbmVzCitwcmludC1udHAuYwktIE5ldHdvcmsgVGltZSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1udWxsLmMJLSBCU0QgbG9vcGJhY2sgZGV2aWNlIHByaW50ZXIgcm91dGluZXMKK3ByaW50LW9zcGYuYwktIE9wZW4gU2hvcnRlc3QgUGF0aCBGaXJzdCBwcmludGVyIHJvdXRpbmVzCitwcmludC1vc3BmNi5jCS0gSVB2NiBPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgcHJpbnRlciByb3V0aW5lcworcHJpbnQtcGZsb2cuYwktIE9wZW5CU0QgcGFja2V0IGZpbHRlciBsb2cgZmlsZSBwcmludGVyIHJvdXRpbmVzCitwcmludC1wZ20uYwktIFByYWdtYXRpYyBHZW5lcmFsIE11bHRpY2FzdCBwcmludGVyIHJvdXRpbmVzCitwcmludC1waW0uYwktIFByb3RvY29sIEluZGVwZW5kZW50IE11bHRpY2FzdCBwcmludGVyIHJvdXRpbmVzCitwcmludC1wcHAuYwktIFBvaW50IHRvIFBvaW50IFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXBwcG9lLmMJLSBQUFAtb3Zlci1FdGhlcm5ldCBwcmludGVyIHJvdXRpbmVzCitwcmludC1wcHRwLmMJLSBQb2ludC10by1Qb2ludCBUdW5uZWxsaW5nIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXJhZGl1cy5jCS0gUmFkaXVzIHByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXJhdy5jCS0gUmF3IElQIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXJpcC5jCS0gUm91dGluZyBJbmZvcm1hdGlvbiBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC1yaXBuZy5jCS0gSVB2NiBSb3V0aW5nIEluZm9ybWF0aW9uIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXJzdnAuYwktIFJlc291cmNlIHJlU2VyVmF0aW9uIFByb3RvY29sIChSU1ZQKSBwcmludGVyIHJvdXRpbmVzCitwcmludC1ydDYuYwktIElQdjYgcm91dGluZyBoZWFkZXIgcHJpbnRlciByb3V0aW5lcworcHJpbnQtcnguYwktIEFGUyBSWCBwcmludGVyIHJvdXRpbmVzCitwcmludC1zY3RwLmMJLSBTdHJlYW0gQ29udHJvbCBUcmFuc21pc3Npb24gUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtc2lwLmMJLSBTSVAgcHJpbnRlciByb3V0aW5lcworcHJpbnQtc2wuYwktIENvbXByZXNzZWQgU2VyaWFsIExpbmUgSW50ZXJuZXQgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtc2xsLmMJLSBMaW51eCAiY29va2VkIiBjYXB0dXJlIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXNsb3cuYwktIElFRUUgInNsb3cgcHJvdG9jb2wiICg4MDIuM2FkKSBwcmludGVyIHJvdXRpbmVzCitwcmludC1zbWIuYwktIFNNQi9DSUZTIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXNubXAuYwktIFNpbXBsZSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcworcHJpbnQtc3RwLmMJLSBJRUVFIDgwMi4xZCBzcGFubmluZyB0cmVlIHByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXN1bmF0bS5jCS0gU3VuQVRNIERMUEkgY2FwdHVyZSBwcmludGVyIHJvdXRpbmVzCitwcmludC1zdW5ycGMuYwktIFN1biBSZW1vdGUgUHJvY2VkdXJlIENhbGwgcHJpbnRlciByb3V0aW5lcworcHJpbnQtc3ltYW50ZWMuYyAtIFN5bWFudGVjIEVudGVycHJpc2UgRmlyZXdhbGwgcHJpbnRlciByb3V0aW5lcworcHJpbnQtdGNwLmMJLSBUQ1AgcHJpbnRlciByb3V0aW5lcworcHJpbnQtdGVsbmV0LmMJLSBUZWxuZXQgb3B0aW9uIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXRmdHAuYwktIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCitwcmludC10aW1lZC5jCS0gQlNEIHRpbWUgZGFlbW9uIHByb3RvY29sIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXRva2VuLmMJLSBUb2tlbiBSaW5nIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXVkcC5jCS0gVURQIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXZqYy5jCS0gUFBQIFZhbiBKYWNvYnNvbiBjb21wcmVzc2lvbiAoUkZDMTE0NCkgcHJpbnRlciByb3V0aW5lcworcHJpbnQtdnJycC5jCS0gVmlydHVhbCBSb3V0ZXIgUmVkdW5kYW5jeSBQcm90b2NvbAorcHJpbnQtd2IuYwktIFdoaXRlIEJvYXJkIHByaW50ZXIgcm91dGluZXMKK3ByaW50LXplcGh5ci5jCS0gWmVwaHlyIHByaW50ZXIgcm91dGluZXMKK3JvdXRlNmQuaAktIHBhY2tldCBkZWZpbml0aW9uIGZvciBJUHY2IFJvdXRpbmcgSW5mb3JtYXRpb24gUHJvdG9jb2wKK3JwY19hdXRoLmgJLSBkZWZpbml0aW9ucyBmb3IgT05DIFJQQyBhdXRoZW50aWNhdGlvbgorcnBjX21zZy5oCS0gZGVmaW5pdGlvbnMgZm9yIE9OQyBSUEMgbWVzc2FnZXMKK3J4LmgJCS0gQUZTIFJYIGRlZmluaXRpb25zCitzY3RwQ29uc3RhbnRzLmgJLSBTdHJlYW0gQ29udHJvbCBUcmFuc21pc3Npb24gUHJvdG9jb2wgY29uc3RhbnQgZGVmaW5pdGlvbnMKK3NjdHBIZWFkZXIuaAktIFN0cmVhbSBDb250cm9sIFRyYW5zbWlzc2lvbiBQcm90b2NvbCBwYWNrZXQgZGVmaW5pdGlvbnMKK3NlbmQtYWNrLmF3awktIHVuaWRpcmVjdGlvbmFsIHRjcCBzZW5kL2FjayBhd2sgc2NyaXB0CitzZXRzaWduYWwuYwktIE9TLWluZGVwZW5kZW50IHNpZ25hbCByb3V0aW5lcworc2V0c2lnbmFsLmgJLSBPUy1pbmRlcGVuZGVudCBzaWduYWwgcHJvdG90eXBlcworc2xjb21wcmVzcy5oCS0gU0xJUC9QUFAgVmFuIEphY29ic29uIGNvbXByZXNzaW9uIChSRkMxMTQ0KSBkZWZpbml0aW9ucworc2xpcC5oCQktIFNMSVAgZGVmaW5pdGlvbnMKK3NsbC5oCQktIExpbnV4ICJjb29rZWQiIGNhcHR1cmUgZGVmaW5pdGlvbnMKK3NtYi5oCQktIFNNQi9DSUZTIGRlZmluaXRpb25zCitzbWJ1dGlsLmMJLSBTTUIvQ0lGUyB1dGlsaXR5IHJvdXRpbmVzCitzdGltZS5hd2sJLSBUQ1Agc2VuZCBhd2sgc2NyaXB0CitzdHJjYXNlY21wLmMJLSBtaXNzaW5nIHJvdXRpbmUKK3RjcC5oCQktIFRDUCBkZWZpbml0aW9ucwordGNwZHVtcC4xCS0gbWFudWFsIGVudHJ5Cit0Y3BkdW1wLmMJLSBtYWluIHByb2dyYW0KK3RlbG5ldC5oCS0gVGVsbmV0IGRlZmluaXRpb25zCit0ZnRwLmgJCS0gVEZUUCBkZWZpbml0aW9ucwordGltZWQuaAkJLSBCU0QgdGltZSBkYWVtb24gcHJvdG9jb2wgZGVmaW5pdGlvbnMKK3Rva2VuLmgJCS0gVG9rZW4gUmluZyBkZWZpbml0aW9ucwordWRwLmgJCS0gVURQIGRlZmluaXRpb25zCit1dGlsLmMJCS0gdXRpbGl0eSByb3V0aW5lcwordmZwcmludGYuYwktIGVtdWxhdGlvbiByb3V0aW5lCit3aW4zMgkJLSBoZWFkZXJzIGFuZCByb3V0aW5lcyBmb3IgYnVpbGRpbmcgb24gV2luMzIgc3lzdGVtcwpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSwxOSBAQAorTGljZW5zZTogQlNECisgCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKyAgCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICAgZGlzdHJpYnV0aW9uLgorICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL01PRFVMRV9MSUNFTlNFX0JTRCBiL01PRFVMRV9MSUNFTlNFX0JTRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTU9EVUxFX0xJQ0VOU0VfQlNECmRpZmYgLS1naXQgYS9NYWtlZmlsZS1kZXZlbC1hZGRzIGIvTWFrZWZpbGUtZGV2ZWwtYWRkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJhMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUtZGV2ZWwtYWRkcwpAQCAtMCwwICsxLDIyIEBACisjCisjIEF1dG8tcmVnZW5lcmF0ZSBjb25maWd1cmUgc2NyaXB0IG9yIE1ha2VmaWxlIHdoZW4gdGhpbmdzIGNoYW5nZS4KKyMgRnJvbSBhdXRvY29uZi5pbmZvIC4gIFdvcmtzIGJlc3Qgd2l0aCBHTlUgTWFrZS4KKyMKKyR7c3JjZGlyfS9jb25maWd1cmU6IGNvbmZpZ3VyZS5pbgorCWNkICR7c3JjZGlyfSAmJiBhdXRvY29uZgorCisjIGF1dG9oZWFkZXIgbWlnaHQgbm90IGNoYW5nZSBjb25maWcuaC5pbiwgc28gdG91Y2ggYSBzdGFtcCBmaWxlLgorJHtzcmNkaXJ9L2NvbmZpZy5oLmluOiAke3NyY2Rpcn0vc3RhbXAtaC5pbgorJHtzcmNkaXJ9L3N0YW1wLWguaW46IGNvbmZpZ3VyZS5pbiBhY2NvbmZpZy5oCisJY2QgJHtzcmNkaXJ9ICYmIGF1dG9oZWFkZXIKKwllY2hvIHRpbWVzdGFtcCA+ICR7c3JjZGlyfS9zdGFtcC1oLmluCisKK2NvbmZpZy5oOiBzdGFtcC1oCitzdGFtcC1oOiAke3NyY2Rpcn0vY29uZmlnLmguaW4gY29uZmlnLnN0YXR1cworCS4vY29uZmlnLnN0YXR1cworCitNYWtlZmlsZTogTWFrZWZpbGUuaW4gY29uZmlnLnN0YXR1cworCS4vY29uZmlnLnN0YXR1cworCitjb25maWcuc3RhdHVzOiAke3NyY2Rpcn0vY29uZmlndXJlCisJLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M4ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwxOTIgQEAKKyMgIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworIyAJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworIyAgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorIyAgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyMgIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyMgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyMgIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisjICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyMgIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorIyAgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyMgIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorIyAgd3JpdHRlbiBwZXJtaXNzaW9uLgorIyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorIyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvTWFrZWZpbGUuaW4sdiAxLjI5My4yLjcgMjAwNy8wOS8xMiAxOTo0ODo1MCBndXkgRXhwICQgKExCTCkKKworIworIyBWYXJpb3VzIGNvbmZpZ3VyYWJsZSBwYXRocyAocmVtZW1iZXIgdG8gZWRpdCBNYWtlZmlsZS5pbiwgbm90IE1ha2VmaWxlKQorIworCisjIFRvcCBsZXZlbCBoaWVyYXJjaHkKK3ByZWZpeCA9IEBwcmVmaXhACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKKyMgUGF0aG5hbWUgb2YgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGJpbmFyeQorc2JpbmRpciA9IEBzYmluZGlyQAorIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbWFuIHBhZ2UKK21hbmRpciA9IEBtYW5kaXJACisKKyMgVlBBVEgKK3NyY2RpciA9IEBzcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKKyMKKyMgWW91IHNob3VsZG4ndCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgYmVsb3cgaGVyZS4KKyMKKworQ0MgPSBAQ0NACitQUk9HID0gdGNwZHVtcAorQ0NPUFQgPSBAVl9DQ09QVEAKK0lOQ0xTID0gLUkuIEBWX0lOQ0xTQAorREVGUyA9IEBERUZTQCBAQ1BQRkxBR1NAIEBWX0RFRlNACisKKyMgU3RhbmRhcmQgQ0ZMQUdTCitDRkxBR1MgPSAkKENDT1BUKSAkKERFRlMpICQoSU5DTFMpCisKKyMgU3RhbmRhcmQgTERGTEFHUworTERGTEFHUyA9IEBMREZMQUdTQAorCisjIFN0YW5kYXJkIExJQlMKK0xJQlMgPSBATElCU0AKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACisKKyMgRXhwbGljaXRseSBkZWZpbmUgY29tcGlsYXRpb24gcnVsZSBzaW5jZSBTdW5PUyA0J3MgbWFrZSBkb2Vzbid0IGxpa2UgZ2NjLgorIyBBbHNvLCBnY2MgZG9lcyBub3QgcmVtb3ZlIHRoZSAubyBiZWZvcmUgZm9ya2luZyAnYXMnLCB3aGljaCBjYW4gYmUgYQorIyBwcm9ibGVtIGlmIHlvdSBkb24ndCBvd24gdGhlIGZpbGUgYnV0IGNhbiB3cml0ZSB0byB0aGUgZGlyZWN0b3J5LgorLmMubzoKKwlAcm0gLWYgJEAKKwkkKENDKSAkKENGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKKworQ1NSQyA9CWFkZHJ0b25hbWUuYyBhZi5jIGNwYWNrLmMgZ21wbHMuYyBvdWkuYyBnbXQybG9jYWwuYyBpcHByb3RvLmMgXAorICAgICAgICBubHBpZC5jIGwydnBuLmMgbWFjaGRlcC5jIHBhcnNlbmZzZmguYyBcCisJcHJpbnQtODAyXzExLmMgcHJpbnQtYXAxMzk0LmMgcHJpbnQtYWguYyBwcmludC1hcmNuZXQuYyBcCisJcHJpbnQtYW9kdi5jIHByaW50LWFycC5jIHByaW50LWFzY2lpLmMgcHJpbnQtYXRhbGsuYyBwcmludC1hdG0uYyBcCisJcHJpbnQtYmVlcC5jIHByaW50LWJmZC5jIHByaW50LWJncC5jIHByaW50LWJvb3RwLmMgcHJpbnQtY2RwLmMgXAorCXByaW50LWNoZGxjLmMgcHJpbnQtY2lwLmMgcHJpbnQtY25mcC5jIHByaW50LWRjY3AuYyBwcmludC1kZWNuZXQuYyBcCisJcHJpbnQtZG9tYWluLmMgcHJpbnQtZHZtcnAuYyBwcmludC1lbmMuYyBwcmludC1lZ3AuYyBcCisJcHJpbnQtZWFwLmMgcHJpbnQtZWlncnAuY1wKKwlwcmludC1lc3AuYyBwcmludC1ldGhlci5jIHByaW50LWZkZGkuYyBwcmludC1mci5jIFwKKwlwcmludC1ncmUuYyBwcmludC1oc3JwLmMgcHJpbnQtaWNtcC5jIHByaW50LWlnbXAuYyBcCisJcHJpbnQtaWdycC5jIHByaW50LWlwLmMgcHJpbnQtaXBjb21wLmMgcHJpbnQtaXBmYy5jIFwKKwlwcmludC1pcHguYyBwcmludC1pc2FrbXAuYyBwcmludC1pc29jbG5zLmMgcHJpbnQtanVuaXBlci5jIHByaW50LWtyYi5jIFwKKwlwcmludC1sMnRwLmMgcHJpbnQtbGFuZS5jIHByaW50LWxkcC5jIHByaW50LWxsYy5jIFwKKyAgICAgICAgcHJpbnQtbG1wLmMgcHJpbnQtbHNwcGluZy5jIFwKKwlwcmludC1sd3Jlcy5jIHByaW50LW1vYmlsZS5jIHByaW50LW1wbHMuYyBwcmludC1tc2RwLmMgXAorCXByaW50LW5mcy5jIHByaW50LW50cC5jIHByaW50LW51bGwuYyBwcmludC1vbHNyLmMgcHJpbnQtb3NwZi5jIFwKKwlwcmludC1wZ20uYyBwcmludC1waW0uYyBwcmludC1wcHAuYyBwcmludC1wcHBvZS5jIFwKKwlwcmludC1wcHRwLmMgcHJpbnQtcmFkaXVzLmMgcHJpbnQtcmF3LmMgcHJpbnQtcmlwLmMgXAorCXByaW50LXJzdnAuYyBwcmludC1yeC5jIHByaW50LXNjdHAuYyBwcmludC1zaXAuYyBwcmludC1zbC5jIHByaW50LXNsbC5jIFwKKwlwcmludC1zbG93LmMgcHJpbnQtc25tcC5jIHByaW50LXN0cC5jIHByaW50LXN1bmF0bS5jIHByaW50LXN1bnJwYy5jIFwKKwlwcmludC1zeW1hbnRlYy5jIHByaW50LXN5c2xvZy5jIHByaW50LXRjcC5jIHByaW50LXRlbG5ldC5jIHByaW50LXRmdHAuYyBcCisJcHJpbnQtdGltZWQuYyBwcmludC10b2tlbi5jIHByaW50LXVkcC5jIHByaW50LXZqYy5jIHByaW50LXZycnAuYyBcCisJcHJpbnQtd2IuYyBwcmludC16ZXBoeXIuYyBzZXRzaWduYWwuYyB0Y3BkdW1wLmMgdXRpbC5jCisKK0xPQ0FMU1JDID0gQExPQ0FMU1JDQAorR0VOU1JDID0gdmVyc2lvbi5jCitMSUJPQkpTID0gQExJQk9CSlNACisKK1NSQyA9CSQoQ1NSQykgJChHRU5TUkMpICQoTE9DQUxTUkMpCisKKyMgV2Ugd291bGQgbGlrZSB0byBzYXkgIk9CSiA9ICQoU1JDOi5jPS5vKSIgYnV0IFVsdHJpeCdzIG1ha2UgY2Fubm90CisjIGhhY2sgdGhlIGV4dHJhIGluZGlyZWN0aW9uCitPQkogPQkkKENTUkM6LmM9Lm8pICQoR0VOU1JDOi5jPS5vKSAkKExPQ0FMU1JDOi5jPS5vKSAkKExJQk9CSlMpCitIRFIgPSAgIGFkZHJ0b25hbWUuaCBhcHBsZXRhbGsuaCBib290cC5oIGNwYWNrLmggZGNjcC5oIGRlY25ldC5oIFwKKwlldGhlcnR5cGUuaCBleHRyYWN0LmggZmRkaS5oIGdtdDJsb2NhbC5oIGlncnAuaCBpbnRlcmZhY2UuaCBcCisJaXB4LmggbGxjLmggbWFjaGRlcC5oIG1pYi5oIG5mc2ZoLmggbmZzdjIuaCBudHAuaCBvc3BmLmggXAorCXNldHNpZ25hbC5oIFwKKwlnbnVjLmggaXBzZWNfZG9pLmggaXNha21wLmggbDJ0cC5oIG5hbWVzZXIuaCBcCisJbmV0Ymlvcy5oIG9ha2xleS5oIG9zcGY2LmggcGYuaCBwcHAuaCByb3V0ZTZkLmgKKworVEFHSERSID0gXAorCS91c3IvaW5jbHVkZS9hcnBhL3RmdHAuaCBcCisJL3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaCBcCisJL3Vzci9pbmNsdWRlL25ldC9zbGlwLmggXAorCS91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmggXAorCS91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggXAorCS91c3IvaW5jbHVkZS9uZXRpbmV0L2lwX2ljbXAuaCBcCisJL3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmggXAorCS91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oIFwKKwkvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3JvdXRlZC5oCisKK1RBR0ZJTEVTID0gJChTUkMpICQoSERSKSAkKFRBR0hEUikKKworQ0xFQU5GSUxFUyA9ICQoUFJPRykgJChPQkopICQoR0VOU1JDKQorCithbGw6ICQoUFJPRykKKworJChQUk9HKTogJChPQkopIEBWX1BDQVBERVBACisJQHJtIC1mICRACisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJChPQkopICQoTElCUykKKworZGF0YWxpbmtzLm86ICQoc3JjZGlyKS9taXNzaW5nL2RhdGFsaW5rcy5jCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL2RhdGFsaW5rcy5jCitkbG5hbWVzLm86ICQoc3JjZGlyKS9taXNzaW5nL2RsbmFtZXMuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9kbG5hbWVzLmMKK2dldG5hbWVpbmZvLm86ICQoc3JjZGlyKS9taXNzaW5nL2dldG5hbWVpbmZvLmMKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3NpbmcvZ2V0bmFtZWluZm8uYworZ2V0YWRkcmluZm8ubzogJChzcmNkaXIpL21pc3NpbmcvZ2V0YWRkcmluZm8uYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9nZXRhZGRyaW5mby5jCitpbmV0X3B0b24ubzogJChzcmNkaXIpL21pc3NpbmcvaW5ldF9wdG9uLmMKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3NpbmcvaW5ldF9wdG9uLmMKK2luZXRfbnRvcC5vOiAkKHNyY2RpcikvbWlzc2luZy9pbmV0X250b3AuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9pbmV0X250b3AuYworaW5ldF9hdG9uLm86ICQoc3JjZGlyKS9taXNzaW5nL2luZXRfYXRvbi5jCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL2luZXRfYXRvbi5jCitzbnByaW50Zi5vOiAkKHNyY2RpcikvbWlzc2luZy9zbnByaW50Zi5jCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL3NucHJpbnRmLmMKK3N0cmxjYXQubzogJChzcmNkaXIpL21pc3Npbmcvc3RybGNhdC5jCisJJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL3N0cmxjYXQuYworc3RybGNweS5vOiAkKHNyY2RpcikvbWlzc2luZy9zdHJsY3B5LmMKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc3RybGNweS5jCitzdHJzZXAubzogJChzcmNkaXIpL21pc3Npbmcvc3Ryc2VwLmMKKwkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc3Ryc2VwLmMKKwordmVyc2lvbi5vOiB2ZXJzaW9uLmMKKwkkKENDKSAkKENGTEFHUykgLWMgdmVyc2lvbi5jCisKK3ZlcnNpb24uYzogJChzcmNkaXIpL1ZFUlNJT04KKwlAcm0gLWYgJEAKKwlzZWQgLWUgJ3MvLiovY2hhciB2ZXJzaW9uW10gPSAiJiI7LycgJChzcmNkaXIpL1ZFUlNJT04gPiAkQAorCitpbnN0YWxsOgorCVsgLWQgJChERVNURElSKSQoc2JpbmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChzYmluZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKHNiaW5kaXIpKQorCSQoSU5TVEFMTF9QUk9HUkFNKSAkKFBST0cpICQoREVTVERJUikkKHNiaW5kaXIpLyQoUFJPRykKKwlbIC1kICQoREVTVERJUikkKG1hbmRpcikvbWFuMSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKG1hbmRpcikvbWFuMTsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuMSkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQoUFJPRykuMSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvJChQUk9HKS4xCisKK3VuaW5zdGFsbDoKKwlybSAtZiAkKERFU1RESVIpJChzYmluZGlyKS8kKFBST0cpCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4xLyQoUFJPRykuMQorCitsaW50OiAkKEdFTlNSQykKKwlsaW50IC1oYnhuICQoU1JDKSB8IFwKKwkgICAgZ3JlcCAtdiAnc3RydWN0L3VuaW9uIC4qIG5ldmVyIGRlZmluZWQnIHwgXAorCSAgICBncmVwIC12ICdwb3NzaWJsZSBwb2ludGVyIGFsaWdubWVudCBwcm9ibGVtJworCitjbGVhbjoKKwlybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbjoKKwlybSAtZiAkKENMRUFORklMRVMpIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMgXAorCSAgICBjb25maWcuaCBnbnVjLmggb3MtcHJvdG8uaCBzdGFtcC1oIHN0YW1wLWguaW4KKwordGFnczogJChUQUdGSUxFUykKKwljdGFncyAtd3RkICQoVEFHRklMRVMpCisKK3JlbGVhc2V0YXI6CisJQGN3ZD1gcHdkYCA7IGRpcj1gYmFzZW5hbWUgJCRjd2RgIDsgbmFtZT0kKFBST0cpLWBjYXQgVkVSU0lPTmAgOyBcCisJICAgbGlzdD0iIiA7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLjsgbWtkaXIgLXAgbjsgY2QgbjsgbG4gLXMgLi4vJCRkaXIgJCRuYW1lOyBcCisJICAgdGFyIC1jIC16IC1mICQkbmFtZS50YXIuZ3ogJCRuYW1lLy4gOworCitkZXBlbmQ6ICQoR0VOU1JDKQorCSR7c3JjZGlyfS9ta2RlcCAtYyAkKENDKSAkKERFRlMpICQoSU5DTFMpICQoU1JDKQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTVmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9OT1RJQ0UKQEAgLTAsMCArMSwxOSBAQAorTGljZW5zZTogQlNECisgCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKyAgCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICAgZGlzdHJpYnV0aW9uLgorICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL1BMQVRGT1JNUyBiL1BMQVRGT1JNUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTFhZWRmCi0tLSAvZGV2L251bGwKKysrIGIvUExBVEZPUk1TCkBAIC0wLDAgKzEsOSBAQAorPT0gVGVzdGVkIHBsYXRmb3JtcyA9PQorTmV0QlNEIAkJMS41L2kzODYJKG1jciAtIDIwMDIvMS8xKQkKK0RlYmlhbiBMaW51eCAod29vZHkvaTM4NikJKG1jciAtIDIwMDIvMS8xKQorCistLS0KK1JlZEhhdCBMaW51eCAJNi4xL2kzODYJKGFzc2FyKQorRnJlZUJTRAkJMi4yLjgvaTM4NgkoaXRvanVuKQorCisKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUxZDMwCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FCkBAIC0wLDAgKzEsMjM1IEBACitAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL1JFQURNRSx2IDEuNjUuMi4xIDIwMDcvMDkvMTQgMDE6MDM6MTIgZ3V5IEV4cCAkIChMQkwpCisKK1RDUERVTVAgMy45CitOb3cgbWFpbnRhaW5lZCBieSAiVGhlIFRjcGR1bXAgR3JvdXAiCitTZWUgCQl3d3cudGNwZHVtcC5vcmcKKworUGxlYXNlIHNlbmQgaW5xdWlyaWVzL2NvbW1lbnRzL3JlcG9ydHMgdG8gCXRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZworCitBbm9ueW1vdXMgQ1ZTIGlzIGF2YWlsYWJsZSB2aWE6CisJY3ZzIC1kIDpwc2VydmVyOmN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgbG9naW4KKwkocGFzc3dvcmQgImFub25jdnMiKQorCWN2cyAtZCA6cHNlcnZlcjpjdnMudGNwZHVtcC5vcmc6L3RjcGR1bXAvbWFzdGVyIGNoZWNrb3V0IHRjcGR1bXAKKworVmVyc2lvbiAzLjkgb2YgVENQRFVNUCBjYW4gYmUgcmV0cmlldmVkIHdpdGggdGhlIENWUyB0YWcgInRjcGR1bXBfM185cmVsMSI6CisJY3ZzIC1kIDpwc2VydmVyOmN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgY2hlY2tvdXQgLXIgdGNwZHVtcF8zXzlyZWwxIHRjcGR1bXAKKworUGxlYXNlIHN1Ym1pdCBwYXRjaGVzIGFnYWluc3QgdGhlIG1hc3RlciBjb3B5IHRvIHRoZSB0Y3BkdW1wIHByb2plY3Qgb24KK3NvdXJjZWZvcmdlLm5ldC4KKworZm9ybWVybHkgZnJvbSAJTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFib3JhdG9yeQorCQlOZXR3b3JrIFJlc2VhcmNoIEdyb3VwIDx0Y3BkdW1wQGVlLmxibC5nb3Y+CisJCWZ0cDovL2Z0cC5lZS5sYmwuZ292L3RjcGR1bXAudGFyLlogKDMuNCkKKworVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc291cmNlIGNvZGUgZm9yIHRjcGR1bXAsIGEgdG9vbCBmb3IgbmV0d29yaworbW9uaXRvcmluZyBhbmQgZGF0YSBhY3F1aXNpdGlvbi4gIFRoaXMgc29mdHdhcmUgd2FzIG9yaWdpbmFsbHkKK2RldmVsb3BlZCBieSB0aGUgTmV0d29yayBSZXNlYXJjaCBHcm91cCBhdCB0aGUgTGF3cmVuY2UgQmVya2VsZXkKK05hdGlvbmFsIExhYm9yYXRvcnkuICBUaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSB2aWEKK2Fub255bW91cyBmdHAgdG8gZnRwLmVlLmxibC5nb3YsIGluIHRjcGR1bXAudGFyLlouICBNb3JlIHJlY2VudAorZGV2ZWxvcG1lbnQgaXMgcGVyZm9ybWVkIGF0IHRjcGR1bXAub3JnLCBodHRwOi8vd3d3LnRjcGR1bXAub3JnLworCitUY3BkdW1wIHVzZXMgbGlicGNhcCwgYSBzeXN0ZW0taW5kZXBlbmRlbnQgaW50ZXJmYWNlIGZvciB1c2VyLWxldmVsCitwYWNrZXQgY2FwdHVyZS4gIEJlZm9yZSBidWlsZGluZyB0Y3BkdW1wLCB5b3UgbXVzdCBmaXJzdCByZXRyaWV2ZSBhbmQKK2J1aWxkIGxpYnBjYXAsIGFsc28gb3JpZ2luYWxseSBmcm9tIExCTCBhbmQgbm93IGJlaW5nIG1haW50YWluZWQgYnkKK3RjcGR1bXAub3JnOyBzZWUgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8gLgorCitPbmNlIGxpYnBjYXAgaXMgYnVpbHQgKGVpdGhlciBpbnN0YWxsIGl0IG9yIG1ha2Ugc3VyZSBpdCdzIGluCisuLi9saWJwY2FwKSwgeW91IGNhbiBidWlsZCB0Y3BkdW1wIHVzaW5nIHRoZSBwcm9jZWR1cmUgaW4gdGhlIElOU1RBTEwKK2ZpbGUuCisKK1RoZSBwcm9ncmFtIGlzIGxvb3NlbHkgYmFzZWQgb24gU01JJ3MgImV0aGVyZmluZCIgYWx0aG91Z2ggbm9uZSBvZiB0aGUKK2V0aGVyZmluZCBjb2RlIHJlbWFpbnMuICBJdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFZhbiBKYWNvYnNvbiBhcworcGFydCBvZiBhbiBvbmdvaW5nIHJlc2VhcmNoIHByb2plY3QgdG8gaW52ZXN0aWdhdGUgYW5kIGltcHJvdmUgdGNwIGFuZAoraW50ZXJuZXQgZ2F0ZXdheSBwZXJmb3JtYW5jZS4gIFRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSBvcmlnaW5hbGx5Cit0YWtlbiBmcm9tIFN1bidzIGV0aGVyZmluZCB3ZXJlIGxhdGVyIHJlLXdyaXR0ZW4gYnkgU3RldmVuIE1jQ2FubmUgb2YKK0xCTC4gIFRvIGluc3VyZSB0aGF0IHRoZXJlIHdvdWxkIGJlIG5vIHZlc3RpZ2Ugb2YgcHJvcHJpZXRhcnkgY29kZSBpbgordGNwZHVtcCwgU3RldmUgd3JvdGUgdGhlc2UgcGllY2VzIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZ2l2ZW4gYnkgdGhlCittYW51YWwgZW50cnksIHdpdGggbm8gYWNjZXNzIHRvIHRoZSBzb3VyY2Ugb2YgdGNwZHVtcCBvciBldGhlcmZpbmQuCisKK092ZXIgdGhlIHBhc3QgZmV3IHllYXJzLCB0Y3BkdW1wIGhhcyBiZWVuIHN0ZWFkaWx5IGltcHJvdmVkIGJ5IHRoZQorZXhjZWxsZW50IGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgSW50ZXJuZXQgY29tbXVuaXR5IChqdXN0IGJyb3dzZQordGhyb3VnaCB0aGUgQ0hBTkdFUyBmaWxlKS4gIFdlIGFyZSBncmF0ZWZ1bCBmb3IgYWxsIHRoZSBpbnB1dC4KKworUmljaGFyZCBTdGV2ZW5zIGdpdmVzIGFuIGV4Y2VsbGVudCB0cmVhdG1lbnQgb2YgdGhlIEludGVybmV0IHByb3RvY29scworaW4gaGlzIGJvb2sgYGBUQ1AvSVAgSWxsdXN0cmF0ZWQsIFZvbHVtZSAxJycuIElmIHlvdSB3YW50IHRvIGxlYXJuIG1vcmUKK2Fib3V0IHRjcGR1bXAgYW5kIGhvdyB0byBpbnRlcnByZXQgaXRzIG91dHB1dCwgcGljayB1cCB0aGlzIGJvb2suCisKK1NvbWUgdG9vbHMgZm9yIHZpZXdpbmcgYW5kIGFuYWx5emluZyB0Y3BkdW1wIHRyYWNlIGZpbGVzIGFyZSBhdmFpbGFibGUKK2Zyb20gdGhlIEludGVybmV0IFRyYWZmaWMgQXJjaGl2ZToKKworCWh0dHA6Ly93d3cuYWNtLm9yZy9zaWdjb21tL0lUQS8KKworQW5vdGhlciB0b29sIHRoYXQgdGNwZHVtcCB1c2VycyBtaWdodCBmaW5kIHVzZWZ1bCBpcyB0Y3BzbGljZToKKworCWZ0cDovL2Z0cC5lZS5sYmwuZ292L3RjcHNsaWNlLnRhci5aCisKK0l0IGlzIGEgcHJvZ3JhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgcG9ydGlvbnMgb2YgdGNwZHVtcCBiaW5hcnkKK3RyYWNlIGZpbGVzLiBTZWUgdGhlIGFib3ZlIGRpc3RyaWJ1dGlvbiBmb3IgZnVydGhlciBkZXRhaWxzIGFuZAorZG9jdW1lbnRhdGlvbi4KKworUHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiBzaG91bGQgYmUgc2VudAordG8gdGhlIGFkZHJlc3MgInRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZyIuICBCdWdzLCBzdXBwb3J0IHJlcXVlc3RzLAorYW5kIGZlYXR1cmUgcmVxdWVzdHMgbWF5IGFsc28gYmUgc3VibWl0dGVkIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlIGZvcgordGNwZHVtcCBhdAorCisJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90Y3BkdW1wLworCitTb3VyY2UgY29kZSBjb250cmlidXRpb25zLCBldGMuIHNob3VsZCBiZSBzZW50IHRvIHRoZSBlbWFpbCBhZGRyZXNzCisicGF0Y2hlc0B0Y3BkdW1wLm9yZyIsIG9yIHN1Ym1pdHRlZCBhcyBwYXRjaGVzIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlCitmb3IgdGNwZHVtcC4KKworQ3VycmVudCB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQgd3d3LnRjcGR1bXAub3JnLCBvciB0aGUgU291cmNlRm9yZ2UKK3NpdGUgZm9yIHRjcGR1bXAuCisKKyAtIFRoZSBUQ1BkdW1wIHRlYW0KKworb3JpZ2luYWwgdGV4dCBieTogU3RldmUgTWNDYW5uZSwgQ3JhaWcgTGVyZXMsIFZhbiBKYWNvYnNvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGRpcmVjdG9yeSBhbHNvIGNvbnRhaW5zIHNvbWUgc2hvcnQgYXdrIHByb2dyYW1zIGludGVuZGVkIGFzCitleGFtcGxlcyBvZiB3YXlzIHRvIHJlZHVjZSB0Y3BkdW1wIGRhdGEgd2hlbiB5b3UncmUgdHJhY2tpbmcKK3BhcnRpY3VsYXIgbmV0d29yayBwcm9ibGVtczoKKworc2VuZC1hY2suYXdrCisJU2ltcGxpZmllcyB0aGUgdGNwZHVtcCB0cmFjZSBmb3IgYW4gZnRwIChvciBvdGhlciB1bmlkaXJlY3Rpb25hbAorCXRjcCB0cmFuc2ZlcikuICBTaW5jZSB3ZSBhc3N1bWUgdGhhdCBvbmUgaG9zdCBvbmx5IHNlbmRzIGFuZAorCXRoZSBvdGhlciBvbmx5IGFja3MsIGFsbCBhZGRyZXNzIGluZm9ybWF0aW9uIGlzIGxlZnQgb2ZmIGFuZAorCXdlIGp1c3Qgbm90ZSBpZiB0aGUgcGFja2V0IGlzIGEgInNlbmQiIG9yIGFuICJhY2siLgorCisJVGhlcmUgaXMgb25lIG91dHB1dCBsaW5lIHBlciBsaW5lIG9mIHRoZSBvcmlnaW5hbCB0cmFjZS4KKwlGaWVsZCAxIGlzIHRoZSBwYWNrZXQgdGltZSBpbiBkZWNpbWFsIHNlY29uZHMsIHJlbGF0aXZlCisJdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb252ZXJzYXRpb24uICBGaWVsZCAyIGlzIGRlbHRhLXRpbWUKKwlmcm9tIGxhc3QgcGFja2V0LiAgRmllbGQgMyBpcyBwYWNrZXQgdHlwZS9kaXJlY3Rpb24uCisJIlNlbmQiIG1lYW5zIGRhdGEgZ29pbmcgZnJvbSBzZW5kZXIgdG8gcmVjZWl2ZXIsICJhY2siCisJbWVhbnMgYW4gYWNrIGdvaW5nIGZyb20gdGhlIHJlY2VpdmVyIHRvIHRoZSBzZW5kZXIuICBBCisJcHJlY2VkaW5nICIqIiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBhIHJldHJhbnNtaXNzaW9uLgorCUEgcHJlY2VkaW5nICItIiBpbmRpY2F0ZXMgYSBob2xlIGluIHRoZSBzZXF1ZW5jZSBzcGFjZQorCShpLmUuLCBtaXNzaW5nIHBhY2tldChzKSksIGEgIiMiIG1lYW5zIGFuIG9kZC1zaXplIChub3QgbWF4CisJc2VnIHNpemUpIHBhY2tldC4gIEZpZWxkIDQgaGFzIHRoZSBwYWNrZXQgZmxhZ3MKKwkoc2FtZSBmb3JtYXQgYXMgcmF3IHRyYWNlKS4gIEZpZWxkIDUgaXMgdGhlIHNlcXVlbmNlCisJbnVtYmVyIChzdGFydCBzZXEuIG51bSBmb3Igc2VuZGVyLCBuZXh0IGV4cGVjdGVkIHNlcSBudW1iZXIKKwlmb3IgYWNrcykuICBUaGUgbnVtYmVyIGluIHBhcmVucyBmb2xsb3dpbmcgYW4gYWNrIGlzCisJdGhlIGRlbHRhLXRpbWUgZnJvbSB0aGUgZmlyc3Qgc2VuZCBvZiB0aGUgcGFja2V0IHRvIHRoZQorCWFjay4gIEEgbnVtYmVyIGluIHBhcmVucyBmb2xsb3dpbmcgYSBzZW5kIGlzIHRoZQorCWRlbHRhLXRpbWUgZnJvbSB0aGUgZmlyc3Qgc2VuZCBvZiB0aGUgcGFja2V0IHRvIHRoZQorCWN1cnJlbnQgc2VuZCAob24gZHVwbGljYXRlIHBhY2tldHMgb25seSkuICBEdXBsaWNhdGUKKwlzZW5kcyBvciBhY2tzIGhhdmUgYSBudW1iZXIgaW4gc3F1YXJlIGJyYWNrZXRzIHNob3dpbmcKKwl0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZXMgc28gZmFyLgorCisJSGVyZSBpcyBhIHNob3J0IHNhbXBsZSBmcm9tIG5lYXIgdGhlIHN0YXJ0IG9mIGFuIGZ0cDoKKwkJMy4wMCAgICAwLjIwICAgc2VuZCAuIDUxMgorCQkzLjIwICAgIDAuMjAgICAgYWNrIC4gMTAyNCAgKDAuMjApCisJCTMuMjAgICAgMC4wMCAgIHNlbmQgUCAxMDI0CisJCTMuNDAgICAgMC4yMCAgICBhY2sgLiAxNTM2ICAoMC4yMCkKKwkJMy44MCAgICAwLjQwICogc2VuZCAuIDAgICgzLjgwKSBbMl0KKwkJMy44MiAgICAwLjAyICogIGFjayAuIDE1MzYgICgwLjYyKSBbMl0KKwlUaHJlZSBzZWNvbmRzIGludG8gdGhlIGNvbnZlcnNhdGlvbiwgYnl0ZXMgNTEyIHRocm91Z2ggMTAyMworCXdlcmUgc2VudC4gIDIwMG1zIGxhdGVyIHRoZXkgd2VyZSBhY2tlZC4gIFNob3J0bHkgdGhlcmVhZnRlcgorCWJ5dGVzIDEwMjQtMTUzNSB3ZXJlIHNlbnQgYW5kIGFnYWluIGFja2VkIGFmdGVyIDIwMG1zLgorCVRoZW4sIGZvciBubyBhcHBhcmVudCByZWFzb24sIDAtNTExIGlzIHJldHJhbnNtaXR0ZWQsIDMuOAorCXNlY29uZHMgYWZ0ZXIgaXRzIGluaXRpYWwgc2VuZCAodGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgdGhpcworCWZ0cCB3YXMgMXNlYywgKy01MDBtcykuICBTaW5jZSB0aGUgcmVjZWl2ZXIgaXMgZXhwZWN0aW5nCisJMTUzNiwgMTUzNiBpcyByZS1hY2tlZCB3aGVuIDAgYXJyaXZlcy4KKworcGFja2V0ZGF0LmF3aworCUNvbXB1dGVzIGNodW5rIHN1bW1hcnkgZGF0YSBmb3IgYW4gZnRwIChvciBzaW1pbGFyCisJdW5pZGlyZWN0aW9uYWwgdGNwIHRyYW5zZmVyKS4gW0EgImNodW5rIiByZWZlcnMgdG8KKwlhIGNodW5rIG9mIHRoZSBzZXF1ZW5jZSBzcGFjZSAtLSBlc3NlbnRpYWxseSB0aGUgcGFja2V0CisJc2VxdWVuY2UgbnVtYmVyIGRpdmlkZWQgYnkgdGhlIG1heCBzZWdtZW50IHNpemUuXQorCisJQSBzdW1tYXJ5IGxpbmUgaXMgcHJpbnRlZCBzaG93aW5nIHRoZSBudW1iZXIgb2YgY2h1bmtzLAorCXRoZSBudW1iZXIgb2YgcGFja2V0cyBpdCB0b29rIHRvIHNlbmQgdGhhdCBtYW55IGNodW5rcworCShpZiB0aGVyZSBhcmUgbm8gbG9zdCBvciBkdXBsaWNhdGVkIHBhY2tldHMsIHRoZSBudW1iZXIKKwlvZiBwYWNrZXRzIHNob3VsZCBlcXVhbCB0aGUgbnVtYmVyIG9mIGNodW5rcykgYW5kIHRoZQorCW51bWJlciBvZiBhY2tzLgorCisJRm9sbG93aW5nIHRoZSBzdW1tYXJ5IGxpbmUgaXMgb25lIGxpbmUgb2YgaW5mb3JtYXRpb24KKwlwZXIgY2h1bmsuICBUaGUgbGluZSBjb250YWlucyBlaWdodCBmaWVsZHM6CisJICAgMSAtIHRoZSBjaHVuayBudW1iZXIKKwkgICAyIC0gdGhlIHN0YXJ0IHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyBjaHVuaworCSAgIDMgLSB0aW1lIG9mIGZpcnN0IHNlbmQKKwkgICA0IC0gdGltZSBvZiBsYXN0IHNlbmQKKwkgICA1IC0gdGltZSBvZiBmaXJzdCBhY2sKKwkgICA2IC0gdGltZSBvZiBsYXN0IGFjaworCSAgIDcgLSBudW1iZXIgb2YgdGltZXMgY2h1bmsgd2FzIHNlbnQKKwkgICA4IC0gbnVtYmVyIG9mIHRpbWVzIGNodW5rIHdhcyBhY2tlZAorCShhbGwgdGltZXMgYXJlIGluIGRlY2ltYWwgc2Vjb25kcywgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0CisJb2YgdGhlIGNvbnZlcnNhdGlvbi4pCisKKwlBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZm9yCisJYW4gZnRwIHRyYWNlOgorCisJIyAxMzQgY2h1bmtzLiAgNTM2IHBhY2tldHMgc2VudC4gIDUwOCBhY2tzLgorCTEgICAgICAgMSAgICAgICAwLjAwICAgIDUuODAgICAgMC4yMCAgICAwLjIwICAgIDQgICAgICAgMQorCTIgICAgICAgNTEzICAgICAwLjI4ICAgIDYuMjAgICAgMC40MCAgICAwLjQwICAgIDQgICAgICAgMQorCTMgICAgICAgMTAyNSAgICAxLjE2ICAgIDYuMzIgICAgMS4yMCAgICAxLjIwICAgIDQgICAgICAgMQorCTQgICAgICAgMTU2MSAgICAxLjg2ICAgIDE1LjAwICAgMi4wMCAgICAyLjAwICAgIDYgICAgICAgMQorCTUgICAgICAgMjA0OSAgICAyLjE2ICAgIDE1LjQ0ICAgMi4yMCAgICAyLjIwICAgIDUgICAgICAgMQorCTYgICAgICAgMjU4NSAgICAyLjY0ICAgIDE2LjQ0ICAgMi44MCAgICAyLjgwICAgIDUgICAgICAgMQorCTcgICAgICAgMzA3MyAgICAzLjAwICAgIDE2LjY2ICAgMy4yMCAgICAzLjIwICAgIDQgICAgICAgMQorCTggICAgICAgMzYwOSAgICAzLjIwICAgIDE3LjI0ICAgMy40MCAgICA1LjgyICAgIDQgICAgICAgMTEKKwk5ICAgICAgIDQwOTcgICAgNi4wMiAgICA2LjU4ICAgIDYuMjAgICAgNi44MCAgICAyICAgICAgIDUKKworCVRoaXMgc2F5cyB0aGF0IDEzNCBjaHVua3Mgd2VyZSB0cmFuc2ZlcnJlZCAoYWJvdXQgNzBLCisJc2luY2UgdGhlIGF2ZXJhZ2UgcGFja2V0IHNpemUgd2FzIDUxMiBieXRlcykuICBJdCB0b29rCisJNTM2IHBhY2tldHMgdG8gdHJhbnNmZXIgdGhlIGRhdGEgKGkuZS4sIG9uIHRoZSBhdmVyYWdlCisJZWFjaCBjaHVuayB3YXMgdHJhbnNtaXR0ZWQgZm91ciB0aW1lcykuICBMb29raW5nIGF0LAorCXNheSwgY2h1bmsgNCwgd2Ugc2VlIGl0IHJlcHJlc2VudHMgdGhlIDUxMiBieXRlcyBvZgorCXNlcXVlbmNlIHNwYWNlIGZyb20gMTU2MSB0byAyMDQ4LiAgSXQgd2FzIGZpcnN0IHNlbnQKKwkxLjg2IHNlY29uZHMgaW50byB0aGUgY29udmVyc2F0aW9uLiAgSXQgd2FzIGxhc3QKKwlzZW50IDE1IHNlY29uZHMgaW50byB0aGUgY29udmVyc2F0aW9uIGFuZCB3YXMgc2VudAorCWEgdG90YWwgb2YgNiB0aW1lcyAoaS5lLiwgaXQgd2FzIHJldHJhbnNtaXR0ZWQgZXZlcnkKKwkyIHNlY29uZHMgb24gdGhlIGF2ZXJhZ2UpLiAgSXQgd2FzIGFja2VkIG9uY2UsIDE0MG1zCisJYWZ0ZXIgaXQgZmlyc3QgYXJyaXZlZC4KKworc3RpbWUuYXdrCithdGltZS5hd2sKKwlPdXRwdXQgb25lIGxpbmUgcGVyIHNlbmQgb3IgYWNrLCByZXNwZWN0aXZlbHksIGluIHRoZSBmb3JtCisJCTx0aW1lPiA8c2VxLiBudW1iZXI+CisJd2hlcmUgPHRpbWU+IGlzIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZQorCXRyYW5zZmVyIGFuZCA8c2VxLiBudW1iZXI+IGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgYmVpbmcgc2VudAorCW9yIGFja2VkLiAgSSB0eXBpY2FsbHkgcGxvdCB0aGlzIGRhdGEgbG9va2luZyBmb3Igc3VzcGljaW91cworCXBhdHRlcm5zLgorCisKK1RoZSBwcm9ibGVtIEkgd2FzIGxvb2tpbmcgYXQgd2FzIHRoZSBidWxrLWRhdGEtdHJhbnNmZXIKK3Rocm91Z2hwdXQgb2YgbWVkaXVtIGRlbGF5IG5ldHdvcmsgcGF0aHMgKDEtNiBzZWMuICByb3VuZCB0cmlwCit0aW1lKSB1bmRlciB0eXBpY2FsIERBUlBBIEludGVybmV0IGNvbmRpdGlvbnMuICBUaGUgdHJhY2Ugb2YgdGhlCitmdHAgdHJhbnNmZXIgb2YgYSBsYXJnZSBmaWxlIHdhcyB1c2VkIGFzIHRoZSByYXcgZGF0YSBzb3VyY2UuCitUaGUgbWV0aG9kIHdhczoKKworICAtIE9uIGEgbG9jYWwgaG9zdCAoYnV0IG5vdCB0aGUgU3VuIHJ1bm5pbmcgdGNwZHVtcCksIGNvbm5lY3QgdG8KKyAgICB0aGUgcmVtb3RlIGZ0cC4KKworICAtIE9uIHRoZSBtb25pdG9yIFN1biwgc3RhcnQgdGhlIHRyYWNlIGdvaW5nLiAgRS5nLiwKKyAgICAgIHRjcGR1bXAgaG9zdCBsb2NhbC1ob3N0IGFuZCByZW1vdGUtaG9zdCBhbmQgcG9ydCBmdHAtZGF0YSA+dHJhY2VmaWxlCisKKyAgLSBPbiBsb2NhbCwgZG8gZWl0aGVyIGEgZ2V0IG9yIHB1dCBvZiBhIGxhcmdlIGZpbGUgKH41MDBLQiksCisgICAgcHJlZmVyYWJseSB0byB0aGUgbnVsbCBkZXZpY2UgKHRvIG1pbmltaXplIGVmZmVjdHMgbGlrZQorICAgIGNsb3NpbmcgdGhlIHJlY2VpdmUgd2luZG93IHdoaWxlIHdhaXRpbmcgZm9yIGEgZGlzayB3cml0ZSkuCisKKyAgLSBXaGVuIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCBzdG9wIHRjcGR1bXAuICBVc2UgYXdrIHRvIG1ha2UgdXAKKyAgICB0d28gZmlsZXMgb2Ygc3VtbWFyeSBkYXRhIChtYXhzaXplIGlzIHRoZSBtYXhpbXVtIHBhY2tldCBzaXplLAorICAgIHRyYWNlZGF0YSBpcyB0aGUgZmlsZSBvZiB0Y3BkdW1wIHRyYWNlZGF0YSk6CisgICAgICBhd2sgLWYgc2VuZC1hY2suYXdrIHBhY2tldHNpemU9YXZnc2l6ZSB0cmFjZWRhdGEgPnNhCisgICAgICBhd2sgLWYgcGFja2V0ZGF0LmF3ayBwYWNrZXRzaXplPWF2Z3NpemUgdHJhY2VkYXRhID5wZAorCisgIC0gV2hpbGUgdGhlIHN1bW1hcnkgZGF0YSBmaWxlcyBhcmUgcHJpbnRpbmcsIHRha2UgYSBsb29rIGF0CisgICAgaG93IHRoZSB0cmFuc2ZlciBiZWhhdmVkOgorICAgICAgYXdrIC1mIHN0aW1lLmF3ayB0cmFjZWRhdGEgfCB4Z3JhcGgKKyAgICAoOTAlIG9mIHdoYXQgeW91IGxlYXJuIHNlZW1zIHRvIGhhcHBlbiBpbiB0aGlzIHN0ZXApLgorCisgIC0gRG8gYWxsIG9mIHRoZSBhYm92ZSBzdGVwcyBzZXZlcmFsIHRpbWVzLCBib3RoIGRpcmVjdGlvbnMsCisgICAgYXQgZGlmZmVyZW50IHRpbWVzIG9mIGRheSwgd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2wKKyAgICBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIG90aGVyIGVuZC4KKworICAtIFVzaW5nIG9uZSBvZiB0aGUgVW5peCBkYXRhIGFuYWx5c2lzIHBhY2thZ2VzIChpbiBteSBjYXNlLAorICAgIFMgYW5kIEdhcnkgUGVybG1hbidzIFVuaXh8U3RhdCksIHNwZW5kIGEgZmV3IG1vbnRocyBzdGFyaW5nCisgICAgYXQgdGhlIGRhdGEuCisKKyAgLSBDaGFuZ2Ugc29tZXRoaW5nIGluIHRoZSBsb2NhbCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhbmQKKyAgICByZWRvIHRoZSBzdGVwcyBhYm92ZS4KKworICAtIE9uY2UgYSB3ZWVrLCB0ZWxsIHlvdXIgZnVuZGluZyBhZ2VudCB0aGF0IHlvdSdyZSBkaXNjb3ZlcmluZworICAgIHdvbmRlcmZ1bCB0aGluZ3MgYW5kIHlvdSdsbCB3cml0ZSB1cCB0aGF0IHJlc2VhcmNoIHJlcG9ydAorICAgICJyZWFsIHNvb24gbm93Ii4KZGlmZiAtLWdpdCBhL1RPRE8gYi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzhiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9UT0RPCkBAIC0wLDAgKzEsNiBAQAorMS4gdXBkYXRlIGNyZWRpdHMKKzIuIHJldmlldyAiRklMRVMiCiszLiBzZWFyY2ggZm9yIHZlcnNpb24gaW5mbworNC4gZ2V0IFBMQVRGT1JNUyBmaWxsZWQgaW4KKzUuIHVwZGF0ZSBDSEFOR0VTIGZpbGUKKzYuIGRvIHNhbWUgZm9yIGxpYnBjYXAKZGlmZiAtLWdpdCBhL1ZFUlNJT04gYi9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2I0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9WRVJTSU9OCkBAIC0wLDAgKzEgQEAKKzMuOS44CmRpZmYgLS1naXQgYS9hY2NvbmZpZy5oIGIvYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhkNTJjCi0tLSAvZGV2L251bGwKKysrIGIvYWNjb25maWcuaApAQCAtMCwwICsxLDEzNiBAQAorLyogImdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IiBtZWFucyBETyBOT1QgTUFLRSBDSEFOR0VTIFRPIGNvbmZpZy5oLmluIC0tCisgKiBtYWtlIHRoZW0gdG8gYWNjb25maWcuaCBhbmQgcmVydW4gYXV0b2hlYWRlciAqLworQFRPUEAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNTTGVheSAwLjkuMGIgd2l0aCB0aGUgYnVnZ3kgY2FzdDEyOC4gKi8KKyN1bmRlZiBIQVZFX0JVR0dZX0NBU1QxMjgKKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgSVB2NiBzdXBwb3J0ICovCisjdW5kZWYgSU5FVDYKKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGxpYnNtaS4gKi8KKyN1bmRlZiBMSUJTTUkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NNSV9ICisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0ICovCisjdW5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUCisKKy8qIGRlZmluZSBpZiB5b3VyIHN0cnVjdCBfX3Jlc19zdGF0ZSBoYXMgdGhlIG5zb3J0IG1lbWJlciAqLworI3VuZGVmIEhBVkVfTkVXX1JFU19TVEFURQorCisvKgorICogZGVmaW5lIGlmIHN0cnVjdCBldGhlcl9oZWFkZXIuZXRoZXJfZGhvc3QgaXMgYSBzdHJ1Y3Qgd2l0aCBldGhlcl9hZGRyX29jdGV0CisgKi8KKyN1bmRlZiBFVEhFUl9IRUFERVJfSEFTX0VBCisKKy8qIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfYXJwIGNvbnRhaW5zIGFycF94c2hhICovCisjdW5kZWYgRVRIRVJfQVJQX0hBU19YCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWRkcmluZm8gZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BRERSSU5GTworCisvKiBkZWZpbmUgaWYgeW91IG5lZWQgdG8gaW5jbHVkZSBtaXNzaW5nL2FkZHJpbmZvaC5oLiAqLworI3VuZGVmIE5FRURfQUREUklORk9fSAorCisvKiBkZWZpbmUgaWZ5b3UgaGF2ZSB0aGUgaF9lcnJubyB2YXJpYWJsZS4gKi8KKyN1bmRlZiBIQVZFX0hfRVJSTk8KKworLyogZGVmaW5lIGlmIElONkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI3VuZGVmIEhBVkVfSU42QUREUlNaCisKKy8qIGRlZmluZSBpZiBJTkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI3VuZGVmIEhBVkVfSU5BRERSU1oKKworLyogZGVmaW5lIGlmIHRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzLiAqLworI3VuZGVmIEhBVkVfT1NfUFJPVE9fSAorCisvKiBkZWZpbmUgaWYgPHVuaXN0ZC5oPiBkZWZpbmVzIF9fUCgpICovCisjdW5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUKKworLyogZGVmaW5lIGlmIFJFU19VU0VfSU5FVDYgaXMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfUkVTX1VTRV9JTkVUNgorCisvKiBkZWZpbmUgaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgYm90aCBnZXRpcG5vZGVieW5hbWUoKSBhbmQgZ2V0aXBub2RlYnlhZGRyKCkgKi8KKyN1bmRlZiBVU0VfR0VUSVBOT0RFQlkKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGV0aGVyX250b2hvc3QoKSBhbmQgaXQgd29ya3MgKi8KKyN1bmRlZiBVU0VfRVRIRVJfTlRPSE9TVAorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF92ZXJzaW9uICovCisjdW5kZWYgSEFWRV9QQ0FQX1ZFUlNJT04KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGVidWcgKi8KKyN1bmRlZiBIQVZFX1BDQVBfREVCVUcKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHl5ZGVidWcgKi8KKyN1bmRlZiBIQVZFX1lZREVCVUcKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfbGlzdF9kYXRhbGlua3MoKSAqLworI3VuZGVmIEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUworCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9zZXRfZGF0YWxpbmsoKSAqLworI3VuZGVmIEhBVkVfUENBUF9TRVRfREFUQUxJTksKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSAqLworI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTAorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKSAqLworI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZHVtcF9mdGVsbCgpICovCisjdW5kZWYgSEFWRV9QQ0FQX0RVTVBfRlRFTEwKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGdldHJwY2J5bnVtYmVyKCkgKi8KKyN1bmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSCisKKy8qIGRlZmluZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwgKi8KKyN1bmRlZiBMQkxfQUxJR04KKworLyogVGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHZhbHVlIGZyb20gc2lnbmFsICg/KVhYWCAqLworI3VuZGVmIFJFVFNJR1ZBTAorCisvKiBEZWZpbmUgdGhpcyBvbiBJUklYICovCisjdW5kZWYgX0JTRF9TSUdOQUxTCisKKy8qIEZvciBIUC9VWCBBTlNJIGNvbXBpbGVyPyAqLworI3VuZGVmIF9IUFVYX1NPVVJDRQorCisvKiBBSVggaGFjay4gKi8KKyN1bmRlZiBfU1VOCisKKy8qIFdvcmthcm91bmQgZm9yIG1pc3NpbmcgNjQtYml0IGZvcm1hdHMgKi8KKyN1bmRlZiBQUklkNjQKKyN1bmRlZiBQUklvNjQKKyN1bmRlZiBQUkl4NjQKKyN1bmRlZiBQUkl1NjQKKworLyogV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIgKi8KKyN1bmRlZiBUQ1BEVU1QX0RPX1NNQgorCisvKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMworICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKKyAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQorICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucworICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCisgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRuZXRfaHRvYSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9ETkVUX0hUT0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgZG5ldF9odG9hIGRlY2xhcmF0aW9uIGluIDxuZXRkbmV0L2RuZXRkYi5oPi4gICovCisjdW5kZWYgSEFWRV9ORVRETkVUX0RORVREQl9IX0RORVRfSFRPQQorCisvKiBkZWZpbmUgaWYgc2hvdWxkIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0ICovCisjdW5kZWYgV0lUSF9VU0VSCisKKy8qIGRlZmluZSBpZiBzaG91bGQgY2hyb290IHdoZW4gZHJvcHBpbmcgcHJpdmlsZWdlcyAqLworI3VuZGVmIFdJVEhfQ0hST09UCmRpZmYgLS1naXQgYS9hY2xvY2FsLm00IGIvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjcwMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC5tNApAQCAtMCwwICsxLDEyNTYgQEAKK2RubCBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2FjbG9jYWwubTQsdiAxLjEwNi4yLjcgMjAwNS8xMS8wOCAwMzowMDo1MiBndXkgRXhwICQgKExCTCkKK2RubAorZG5sIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OAorZG5sCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorZG5sCitkbmwgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CitkbmwgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCitkbmwgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorZG5sIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCitkbmwgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworZG5sIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKK2RubCBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorZG5sIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorZG5sIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorZG5sIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCitkbmwgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCitkbmwgd3JpdHRlbiBwZXJtaXNzaW9uLgorZG5sIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK2RubCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorZG5sIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitkbmwKK2RubCBMQkwgYXV0b2NvbmYgbWFjcm9zCitkbmwKKworZG5sCitkbmwgRGV0ZXJtaW5lIHdoaWNoIGNvbXBpbGVyIHdlJ3JlIHVzaW5nIChjYyBvciBnY2MpCitkbmwgSWYgdXNpbmcgZ2NjLCBkZXRlcm1pbmUgdGhlIHZlcnNpb24gbnVtYmVyCitkbmwgSWYgdXNpbmcgY2MsIHJlcXVpcmUgdGhhdCBpdCBzdXBwb3J0IGFuc2kgcHJvdG90eXBlcworZG5sIElmIHVzaW5nIGdjYywgdXNlIC1PMiAob3RoZXJ3aXNlIHVzZSAtTykKK2RubCBJZiB1c2luZyBjYywgZXhwbGljaXRseSBzcGVjaWZ5IC91c3IvbG9jYWwvaW5jbHVkZQorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfQ19JTklUKGNvcHQsIGluY2xzKQorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCSQxIChjb3B0IHNldCkKK2RubAkkMiAoaW5jbHMgc2V0KQorZG5sCUNDCitkbmwJTERGTEFHUworZG5sCWFjX2N2X2xibF9nY2NfdmVycworZG5sCUxCTF9DRkxBR1MKK2RubAorQUNfREVGVU4oQUNfTEJMX0NfSU5JVCwKKyAgICBbQUNfUFJFUkVRKDIuMTIpCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NDXSkKKyAgICBBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9GSVhJTkNMVURFU10pCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfREVWRUxdKQorICAgIEFDX0FSR19XSVRIKGdjYywgWyAgLS13aXRob3V0LWdjYyAgICAgICAgICAgZG9uJ3QgdXNlIGdjY10pCisgICAgJDE9Ii1PIgorICAgICQyPSIiCisgICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCisJICAgICQyPSItSVwkKHNyY2RpcikiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldDsgdGhlbgorCSAgICBMQkxfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGZpCisgICAgaWYgdGVzdCAteiAiJENDIiA7IHRoZW4KKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYnNkaSopCisJCSAgICBBQ19DSEVDS19QUk9HKFNITElDQzIsIHNobGljYzIsIHllcywgbm8pCisJCSAgICBpZiB0ZXN0ICRTSExJQ0MyID0geWVzIDsgdGhlbgorCQkJICAgIENDPXNobGljYzIKKwkJCSAgICBleHBvcnQgQ0MKKwkJICAgIGZpCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkQ0MiIC1hICIkd2l0aF9nY2MiID0gbm8gOyB0aGVuCisJICAgIENDPWNjCisJICAgIGV4cG9ydCBDQworICAgIGZpCisgICAgQUNfUFJPR19DQworICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgorCSAgICBpZiB0ZXN0ICIkU0hMSUNDMiIgPSB5ZXMgOyB0aGVuCisJCSAgICBhY19jdl9sYmxfZ2NjX3ZlcnM9MgorCQkgICAgJDE9Ii1PMiIKKwkgICAgZWxzZQorCQkgICAgQUNfTVNHX0NIRUNLSU5HKGdjYyB2ZXJzaW9uKQorCQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9nY2NfdmVycywKKwkJCWFjX2N2X2xibF9nY2NfdmVycz1gJENDIC12IDI+JjEgfCBcCisJCQkgICAgc2VkIC1lICcvXmdjYyB2ZXJzaW9uIC8hZCcgXAorCQkJCS1lICdzL15nY2MgdmVyc2lvbiAvLycgXAorCQkJCS1lICdzLyAuKi8vJyAtZSAncy9eW1tbXjAtOV1dXSovLycgXAorCQkJCS1lICdzL1wuLiovLydgKQorCQkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2djY192ZXJzKQorCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgorCQkJICAgICQxPSItTzIiCisJCSAgICBmaQorCSAgICBmaQorICAgIGVsc2UKKwkgICAgQUNfTVNHX0NIRUNLSU5HKHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzKQorCSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcywKKwkJQUNfVFJZX0NPTVBJTEUoCisJCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sCisJCSAgICBbaW50IGZyb2IoaW50LCBjaGFyICopXSwKKwkJICAgIGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9eWVzLAorCQkgICAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz1ubykpCisJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMpCisJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMgPSBubyA7IHRoZW4KKwkJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJCSAgICBocHV4KikKKwkJCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEhQLVVYIGFuc2kgY29tcGlsZXIgKCRDQyAtQWEgLURfSFBVWF9TT1VSQ0UpKQorCQkJICAgIHNhdmVkY2ZsYWdzPSIkQ0ZMQUdTIgorCQkJICAgIENGTEFHUz0iLUFhIC1EX0hQVVhfU09VUkNFICRDRkxBR1MiCisJCQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19ocHV4X2NjX2FhLAorCQkJCUFDX1RSWV9DT01QSUxFKAorCQkJCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sCisJCQkJICAgIFtpbnQgZnJvYihpbnQsIGNoYXIgKildLAorCQkJCSAgICBhY19jdl9sYmxfY2NfaHB1eF9jY19hYT15ZXMsCisJCQkJICAgIGFjX2N2X2xibF9jY19ocHV4X2NjX2FhPW5vKSkKKwkJCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSkKKwkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSA9IG5vIDsgdGhlbgorCQkJCSAgICBBQ19NU0dfRVJST1Ioc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKQorCQkJICAgIGZpCisJCQkgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCisJCQkgICAgVl9DQ09QVD0iLUFhICRWX0NDT1BUIgorCQkJICAgIEFDX0RFRklORShfSFBVWF9TT1VSQ0UpCisJCQkgICAgOzsKKworCQkgICAgKikKKwkJCSAgICBBQ19NU0dfRVJST1Ioc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKQorCQkJICAgIDs7CisJCSAgICBlc2FjCisJICAgIGZpCisJICAgICQyPSIkJDIgLUkvdXNyL2xvY2FsL2luY2x1ZGUiCisJICAgIExERkxBR1M9IiRMREZMQUdTIC1ML3Vzci9sb2NhbC9saWIiCisKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgaXJpeCopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAteGFuc2kgLXNpZ25lZCAtTyIKKwkJICAgIDs7CisKKwkgICAgb3NmKikKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1zdGQxIC1PIgorCQkgICAgOzsKKworCSAgICB1bHRyaXgqKQorCQkgICAgQUNfTVNHX0NIRUNLSU5HKHRoYXQgVWx0cml4ICRDQyBoYWNrcyBjb25zdCBpbiBwcm90b3R5cGVzKQorCQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19jb25zdF9wcm90bywKKwkJCUFDX1RSWV9DT01QSUxFKAorCQkJICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwKKwkJCSAgICBbc3RydWN0IGEgeyBpbnQgYjsgfTsKKwkJCSAgICB2b2lkIGMoY29uc3Qgc3RydWN0IGEgKildLAorCQkJICAgIGFjX2N2X2xibF9jY19jb25zdF9wcm90bz15ZXMsCisJCQkgICAgYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvPW5vKSkKKwkJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9jY19jb25zdF9wcm90bykKKwkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19jb25zdF9wcm90byA9IG5vIDsgdGhlbgorCQkJICAgIEFDX0RFRklORShjb25zdCwpCisJCSAgICBmaQorCQkgICAgOzsKKwkgICAgZXNhYworICAgIGZpCitdKQorCisKKyMKKyMgVHJ5IGNvbXBpbGluZyBhIHNhbXBsZSBvZiB0aGUgdHlwZSBvZiBjb2RlIHRoYXQgYXBwZWFycyBpbgorIyBnZW5jb2RlLmMgd2l0aCAiaW5saW5lIiwgIl9faW5saW5lX18iLCBhbmQgIl9faW5saW5lIi4KKyMKKyMgQXV0b2NvbmYncyBBQ19DX0lOTElORSwgYXQgbGVhc3QgaW4gYXV0b2NvbmYgMi4xMywgaXNuJ3QgZ29vZCBlbm91Z2gsCisjIGFzIGl0IGp1c3QgdGVzdHMgd2hldGhlciBhIGZ1bmN0aW9uIHJldHVybmluZyAiaW50IiBjYW4gYmUgaW5saW5lZDsKKyMgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBIUCdzIEMgY29tcGlsZXIgY2FuIGlubGluZSB0aGF0LCBidXQgY2FuJ3QKKyMgaW5saW5lIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc3RydWN0IHBvaW50ZXIuCisjCitBQ19ERUZVTihBQ19MQkxfQ19JTkxJTkUsCisgICAgW0FDX01TR19DSEVDS0lORyhmb3IgaW5saW5lKQorICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfaW5saW5lLCBbCisJYWNfY3ZfbGJsX2lubGluZT0iIgorCWFjX2xibF9jY19pbmxpbmU9bm8KKwlmb3IgYWNfbGJsX2lubGluZSBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZQorCWRvCisJICAgIEFDX1RSWV9DT01QSUxFKAorCQlbI2RlZmluZSBpbmxpbmUgJGFjX2xibF9pbmxpbmUKKwkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICpmb28odm9pZCk7CisJCXN0cnVjdCBpbHRlc3QgeworCQkgICAgaW50IGlsdGVzdDE7CisJCSAgICBpbnQgaWx0ZXN0MjsKKwkJfTsKKworCQlzdGF0aWMgaW5saW5lIHN0cnVjdCBpbHRlc3QgKgorCQlmb28oKQorCQl7CisJCSAgICBzdGF0aWMgc3RydWN0IGlsdGVzdCB4eHg7CisKKwkJICAgIHJldHVybiAmeHh4OworCQl9XSwsYWNfbGJsX2NjX2lubGluZT15ZXMsKQorCSAgICBpZiB0ZXN0ICIkYWNfbGJsX2NjX2lubGluZSIgPSB5ZXMgOyB0aGVuCisJCWJyZWFrOworCSAgICBmaQorCWRvbmUKKwlpZiB0ZXN0ICIkYWNfbGJsX2NjX2lubGluZSIgPSB5ZXMgOyB0aGVuCisJICAgIGFjX2N2X2xibF9pbmxpbmU9JGFjX2xibF9pbmxpbmUKKwlmaV0pCisgICAgaWYgdGVzdCAhIC16ICIkYWNfY3ZfbGJsX2lubGluZSIgOyB0aGVuCisJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2lubGluZSkKKyAgICBlbHNlCisJQUNfTVNHX1JFU1VMVChubykKKyAgICBmaQorICAgIEFDX0RFRklORV9VTlFVT1RFRChpbmxpbmUsICRhY19jdl9sYmxfaW5saW5lLCBbRGVmaW5lIGFzIHRva2VuIGZvciBpbmxpbmUgaWYgaW5saW5pbmcgc3VwcG9ydGVkXSldKQorCitkbmwKK2RubCBVc2UgcGZvcGVuLmMgaWYgYXZhaWxhYmxlIGFuZCBwZm9wZW4oKSBub3QgaW4gc3RhbmRhcmQgbGlicmFyaWVzCitkbmwgUmVxdWlyZSBsaWJwY2FwCitkbmwgTG9vayBmb3IgbGlicGNhcCBpbiAuLgorZG5sIFVzZSB0aGUgaW5zdGFsbGVkIGxpYnBjYXAgaWYgdGhlcmUgaXMgbm8gbG9jYWwgdmVyc2lvbgorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfTElCUENBUChwY2FwZGVwLCBpbmNscykKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAkkMSAocGNhcGRlcCBzZXQpCitkbmwJJDIgKGluY2xzIGFwcGVuZGVkKQorZG5sCUxJQlMKK2RubAlMQkxfTElCUworZG5sCitBQ19ERUZVTihBQ19MQkxfTElCUENBUCwKKyAgICBbQUNfUkVRVUlSRShbQUNfTEJMX0xJQlJBUllfTkVUXSkKKyAgICBkbmwKKyAgICBkbmwgc2F2ZSBhIGNvcHkgYmVmb3JlIGxvY2F0aW5nIGxpYnBjYXAuYQorICAgIGRubAorICAgIExCTF9MSUJTPSIkTElCUyIKKyAgICBwZm9wZW49L3Vzci9leGFtcGxlcy9wYWNrZXRmaWx0ZXIvcGZvcGVuLmMKKyAgICBpZiB0ZXN0IC1mICRwZm9wZW4gOyB0aGVuCisJICAgIEFDX0NIRUNLX0ZVTkNTKHBmb3BlbikKKwkgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19wZm9wZW4gPSAibm8iIDsgdGhlbgorCQkgICAgQUNfTVNHX1JFU1VMVChVc2luZyAkcGZvcGVuKQorCQkgICAgTElCUz0iJExJQlMgJHBmb3BlbiIKKwkgICAgZmkKKyAgICBmaQorICAgIEFDX01TR19DSEVDS0lORyhmb3IgbG9jYWwgcGNhcCBsaWJyYXJ5KQorICAgIGxpYnBjYXA9RkFJTAorICAgIGxhc3RkaXI9RkFJTAorICAgIHBsYWNlcz1gbHMgJHNyY2Rpci8uLiB8IHNlZCAtZSAncywvJCwsJyAtZSAicyxeLCRzcmNkaXIvLi4vLCIgfCBcCisJZWdyZXAgJy9saWJwY2FwLVtbMC05XV0qLltbMC05XV0qKC5bWzAtOV1dKik/KFtbYWJdXVtbMC05XV0qKT8kJ2AKKyAgICBmb3IgZGlyIGluICRwbGFjZXMgJHNyY2Rpci8uLi9saWJwY2FwICRzcmNkaXIvbGlicGNhcCA7IGRvCisJICAgIGJhc2VkaXI9YGVjaG8gJGRpciB8IHNlZCAtZSAncy9bW2FiXV1bWzAtOV1dKiQvLydgCisJICAgIGlmIHRlc3QgJGxhc3RkaXIgPSAkYmFzZWRpciA7IHRoZW4KKwkJICAgIGRubCBza2lwIGFscGhhcyB3aGVuIGFuIGFjdHVhbCByZWxlYXNlIGlzIHByZXNlbnQKKwkJICAgIGNvbnRpbnVlOworCSAgICBmaQorCSAgICBsYXN0ZGlyPSRkaXIKKwkgICAgaWYgdGVzdCAtciAkZGlyL2xpYnBjYXAuYSA7IHRoZW4KKwkJICAgIGxpYnBjYXA9JGRpci9saWJwY2FwLmEKKwkJICAgIGQ9JGRpcgorCQkgICAgZG5sIGNvbnRpbnVlIGFuZCBzZWxlY3QgdGhlIGxhc3Qgb25lIHRoYXQgZXhpc3RzCisJICAgIGZpCisgICAgZG9uZQorICAgIGlmIHRlc3QgJGxpYnBjYXAgPSBGQUlMIDsgdGhlbgorCSAgICBBQ19NU0dfUkVTVUxUKG5vdCBmb3VuZCkKKwkgICAgQUNfQ0hFQ0tfTElCKHBjYXAsIG1haW4sIGxpYnBjYXA9Ii1scGNhcCIpCisJICAgIGlmIHRlc3QgJGxpYnBjYXAgPSBGQUlMIDsgdGhlbgorCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykKKwkgICAgZmkKKwkgICAgZG5sCisJICAgIGRubCBHb29kIG9sZCBSZWQgSGF0IExpbnV4IHB1dHMgInBjYXAuaCIgaW4KKwkgICAgZG5sICIvdXNyL2luY2x1ZGUvcGNhcCI7IGhhZCB0aGUgTEJMIGZvbGtzIGRvbmUgc28sCisJICAgIGRubCB0aGF0IHdvdWxkIGhhdmUgYmVlbiBhIGdvb2QgaWRlYSwgYnV0IGZvcgorCSAgICBkbmwgdGhlIFJlZCBIYXQgZm9sa3MgdG8gZG8gc28ganVzdCBicmVha3Mgc291cmNlCisJICAgIGRubCBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgc3lzdGVtcy4KKwkgICAgZG5sCisJICAgIGRubCBXZSB3b3JrIGFyb3VuZCB0aGlzIGJ5IGFzc3VtaW5nIHRoYXQsIGFzIHdlIGRpZG4ndAorCSAgICBkbmwgZmluZCBhIGxvY2FsIGxpYnBjYXAsIGxpYnBjYXAgaXMgaW4gL3Vzci9saWIgb3IKKwkgICAgZG5sIC91c3IvbG9jYWwvbGliIGFuZCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGhlYWRlcgorCSAgICBkbmwgZmlsZSBpcyB1bmRlciBvbmUgb2YgdGhvc2UgZGlyZWN0b3JpZXM7IGlmIHdlIGRvbid0CisJICAgIGRubCBmaW5kIGl0IGluIGVpdGhlciBvZiB0aG9zZSBkaXJlY3Rvcmllcywgd2UgY2hlY2sgdG8KKwkgICAgZG5sIHNlZSBpZiBpdCdzIGluIGEgInBjYXAiIHN1YmRpcmVjdG9yeSBvZiB0aGVtIGFuZCwKKwkgICAgZG5sIGlmIHNvLCBhZGQgdGhhdCBzdWJkaXJlY3RvcnkgdG8gdGhlICItSSIgbGlzdC4KKwkgICAgZG5sCisJICAgIEFDX01TR19DSEVDS0lORyhmb3IgZXh0cmFuZW91cyBwY2FwIGhlYWRlciBkaXJlY3RvcmllcykKKwkgICAgaWYgdGVzdCBcKCAhIC1yIC91c3IvbG9jYWwvaW5jbHVkZS9wY2FwLmggXCkgLWEgXAorCQkJXCggISAtciAvdXNyL2luY2x1ZGUvcGNhcC5oIFwpOyB0aGVuCisJCWlmIHRlc3QgLXIgL3Vzci9sb2NhbC9pbmNsdWRlL3BjYXAvcGNhcC5oOyB0aGVuCisJCSAgICBkPSIvdXNyL2xvY2FsL2luY2x1ZGUvcGNhcCIKKwkJZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9wY2FwL3BjYXAuaDsgdGhlbgorCQkgICAgZD0iL3Vzci9pbmNsdWRlL3BjYXAiCisJCWZpCisJICAgIGZpCisJICAgIGlmIHRlc3QgLXogIiRkIiA7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVChub3QgZm91bmQpCisJICAgIGVsc2UKKwkJJDI9Ii1JJGQgJCQyIgorCQlBQ19NU0dfUkVTVUxUKGZvdW5kIC0tIC1JJGQgYWRkZWQpCisJICAgIGZpCisgICAgZWxzZQorCSAgICAkMT0kbGlicGNhcAorCSAgICBwbGFjZXM9YGxzICRzcmNkaXIvLi4gfCBzZWQgLWUgJ3MsLyQsLCcgLWUgInMsXiwkc3JjZGlyLy4uLywiIHwgXAorICAgIAkgCQllZ3JlcCAnL2xpYnBjYXAtW1swLTldXSouW1swLTldXSooLltbMC05XV0qKT8oW1thYl1dW1swLTldXSopPyQnYAorCSAgICBpZiB0ZXN0IC1yICRkL3BjYXAuaDsgdGhlbgorCQkgICAgJDI9Ii1JJGQgJCQyIgorCSAgICBlbGlmIHRlc3QgLXIgJHBsYWNlcy9wY2FwLmg7IHRoZW4KKwkJICAgICQyPSItSSRwbGFjZXMgJCQyIgorCSAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihjYW5ub3QgZmluZCBwY2FwLmgsIHNlZSBJTlNUQUxMKQorIAkgICAgZmkKKwkgICAgQUNfTVNHX1JFU1VMVCgkbGlicGNhcCkKKyAgICBmaQorICAgIExJQlM9IiRsaWJwY2FwICRMSUJTIgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisgICAgYWl4KikKKwkgICAgcHNlZXhlPSIvbGliL3BzZS5leHAiCisJICAgIEFDX01TR19DSEVDS0lORyhmb3IgJHBzZWV4ZSkKKwkgICAgaWYgdGVzdCAtZiAkcHNlZXhlIDsgdGhlbgorCQkgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCisJCSAgICBMSUJTPSIkTElCUyAtSTokcHNlZXhlIgorCSAgICBmaQorCSAgICAjCisJICAgICMgV2UgbmVlZCAiLWxvZG0iIGFuZCAiLWxjZmciLCBhcyBsaWJwY2FwIHJlcXVpcmVzIHRoZW0gb24KKwkgICAgIyBBSVgsIGFuZCB3ZSBqdXN0IGJ1aWxkIGEgc3RhdGljIGxpYnBjYXAuYSBhbmQgdGh1cyBjYW4ndAorCSAgICAjIGFycmFuZ2UgdGhhdCB3aGVuIHlvdSBsaW5rIHdpdGggbGlicGNhcCB5b3UgYXV0b21hdGljYWxseQorCSAgICAjIGxpbmsgd2l0aCB0aG9zZSBsaWJyYXJpZXMuCisJICAgICMKKwkgICAgTElCUz0iJExJQlMgLWxvZG0gLWxjZmciCisJICAgIDs7CisgICAgZXNhYworCisgICAgZG5sCisgICAgZG5sIENoZWNrIGZvciAicGNhcF9saXN0X2RhdGFsaW5rcygpIiwgInBjYXBfc2V0X2RhdGFsaW5rKCkiLAorICAgIGRubCBhbmQgInBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSIsIGFuZCB1c2Ugc3Vic3RpdHV0ZSB2ZXJzaW9ucworICAgIGRubCBpZiB0aGV5J3JlIG5vdCBwcmVzZW50LgorICAgIGRubAorICAgIEFDX0NIRUNLX0ZVTkMocGNhcF9saXN0X2RhdGFsaW5rcywKKwlBQ19ERUZJTkUoSEFWRV9QQ0FQX0xJU1RfREFUQUxJTktTKSwKKwlbCisJICAgIEFDX0xJQk9CSihkYXRhbGlua3MpCisJXSkKKyAgICBBQ19DSEVDS19GVU5DKHBjYXBfc2V0X2RhdGFsaW5rLAorCUFDX0RFRklORShIQVZFX1BDQVBfU0VUX0RBVEFMSU5LKSkKKyAgICBBQ19DSEVDS19GVU5DKHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwsCisJWworCSAgICBBQ19ERUZJTkUoSEFWRV9QQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMKQorCSAgICBBQ19DSEVDS19GVU5DKHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uLAorCQlBQ19ERUZJTkUoSEFWRV9QQ0FQX0RBVEFMSU5LX1ZBTF9UT19ERVNDUklQVElPTiksCisJCVsKKwkJICAgIEFDX0xJQk9CSihkbG5hbWVzKQorCQldKQorCV0sCisJWworCSAgICBBQ19MSUJPQkooZGxuYW1lcykKKwldKQorCisgICAgZG5sCisgICAgZG5sIENoZWNrIGZvciAicGNhcF9icmVha2xvb3AoKSI7IHlvdSBjYW4ndCBzdWJzdGl0dXRlIGZvciBpdCBpZgorICAgIGRubCBpdCdzIGFic2VudCAoaXQgaGFzIGhvb2tzIGludG8gdGhlIGxpdmUgY2FwdHVyZSByb3V0aW5lcyksCisgICAgZG5sIHNvIGp1c3QgZGVmaW5lIHRoZSBIQVZFXyB2YWx1ZSBpZiBpdCdzIHRoZXJlLgorICAgIGRubAorICAgIEFDX0NIRUNLX0ZVTkNTKHBjYXBfYnJlYWtsb29wKQorCisgICAgZG5sCisgICAgZG5sIENoZWNrIGZvciAicGNhcF9kdW1wX2Z0ZWxsKCkiIGFuZCB1c2UgYSBzdWJzdGl0dXRlIHZlcnNpb24KKyAgICBkbmwgaWYgaXQncyBub3QgcHJlc2VudC4KKyAgICBBQ19DSEVDS19GVU5DKHBjYXBfZHVtcF9mdGVsbCwKKwlBQ19ERUZJTkUoSEFWRV9QQ0FQX0RVTVBfRlRFTEwpLAorCVsKKwkgICAgQUNfTElCT0JKKHBjYXBfZHVtcF9mdGVsbCkKKwldKQorXSkKKworZG5sCitkbmwgRGVmaW5lIFJFVFNJR1RZUEUgYW5kIFJFVFNJR1ZBTAorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfVFlQRV9TSUdOQUwKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlSRVRTSUdUWVBFIChkZWZpbmVkKQorZG5sCVJFVFNJR1ZBTCAoZGVmaW5lZCkKK2RubAorQUNfREVGVU4oQUNfTEJMX1RZUEVfU0lHTkFMLAorICAgIFtBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9MSUJQQ0FQXSkKKyAgICBBQ19UWVBFX1NJR05BTAorICAgIGlmIHRlc3QgIiRhY19jdl90eXBlX3NpZ25hbCIgPSB2b2lkIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoUkVUU0lHVkFMLCkKKyAgICBlbHNlCisJICAgIEFDX0RFRklORShSRVRTSUdWQUwsKDApKQorICAgIGZpCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKyAgICBpcml4KikKKwkgICAgQUNfREVGSU5FKF9CU0RfU0lHTkFMUykKKwkgICAgOzsKKworICAgICopCisJICAgIGRubCBwcmVmZXIgc2lnYWN0aW9uKCkgdG8gc2lnc2V0KCkKKwkgICAgQUNfQ0hFQ0tfRlVOQ1Moc2lnYWN0aW9uKQorCSAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NpZ2FjdGlvbiA9IG5vIDsgdGhlbgorCQkgICAgQUNfQ0hFQ0tfRlVOQ1Moc2lnc2V0KQorCSAgICBmaQorCSAgICA7OworICAgIGVzYWNdKQorCitkbmwKK2RubCBJZiB1c2luZyBnY2MsIG1ha2Ugc3VyZSB3ZSBoYXZlIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0ZJWElOQ0xVREVTCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9GSVhJTkNMVURFUywKKyAgICBbaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgIEFDX01TR19DSEVDS0lORyhmb3IgQU5TSSBpb2N0bCBkZWZpbml0aW9ucykKKwkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMsCisJCUFDX1RSWV9DT01QSUxFKAorCQkgICAgWy8qCisJCSAgICAgKiBUaGlzIGdlbmVyYXRlcyBhICJkdXBsaWNhdGUgY2FzZSB2YWx1ZSIgd2hlbiBmaXhpbmNsdWRlcworCQkgICAgICogaGFzIG5vdCBiZSBydW4uCisJCSAgICAgKi8KKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwkJaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMJCWluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIwkJaWZkZWYgSEFWRV9TWVNfSU9DQ09NX0gKKyMJCWluY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyMJCWVuZGlmXSwKKwkJICAgIFtzd2l0Y2ggKDApIHsKKwkJICAgIGNhc2UgX0lPKCdBJywgMSk6OworCQkgICAgY2FzZSBfSU8oJ0InLCAxKTo7CisJCSAgICB9XSwKKwkJICAgIGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXM9eWVzLAorCQkgICAgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcz1ubykpCisJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMpCisJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMgPSBubyA7IHRoZW4KKwkJICAgICMgRG9uJ3QgY2FjaGUgZmFpbHVyZQorCQkgICAgdW5zZXQgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcworCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBmb3IgbW9yZSBpbmZvKQorCSAgICBmaQorICAgIGZpXSkKKworZG5sCitkbmwgQ2hlY2sgZm9yIGZsZXgsIGRlZmF1bHQgdG8gbGV4CitkbmwgUmVxdWlyZSBmbGV4IDIuNCBvciBoaWdoZXIKK2RubCBDaGVjayBmb3IgYmlzb24sIGRlZmF1bHQgdG8geWFjYworZG5sIERlZmF1bHQgdG8gbGV4L3lhY2MgaWYgYm90aCBmbGV4IGFuZCBiaXNvbiBhcmUgbm90IGF2YWlsYWJsZQorZG5sIERlZmluZSB0aGUgeXkgcHJlZml4IHN0cmluZyBpZiB1c2luZyBmbGV4IGFuZCBiaXNvbgorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfTEVYX0FORF9ZQUNDKGxleCwgeWFjYywgeXlwcmVmaXgpCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJJDEgKGxleCBzZXQpCitkbmwJJDIgKHlhY2MgYXBwZW5kZWQpCitkbmwJJDMgKG9wdGlvbmFsIGZsZXggYW5kIGJpc29uIC1QIHByZWZpeCkKK2RubAorQUNfREVGVU4oQUNfTEJMX0xFWF9BTkRfWUFDQywKKyAgICBbQUNfQVJHX1dJVEgoZmxleCwgWyAgLS13aXRob3V0LWZsZXggICAgICAgICAgZG9uJ3QgdXNlIGZsZXhdKQorICAgIEFDX0FSR19XSVRIKGJpc29uLCBbICAtLXdpdGhvdXQtYmlzb24gICAgICAgICBkb24ndCB1c2UgYmlzb25dKQorICAgIGlmIHRlc3QgIiR3aXRoX2ZsZXgiID0gbm8gOyB0aGVuCisJICAgICQxPWxleAorICAgIGVsc2UKKwkgICAgQUNfQ0hFQ0tfUFJPR1MoJDEsIGZsZXgsIGxleCkKKyAgICBmaQorICAgIGlmIHRlc3QgIiQkMSIgPSBmbGV4IDsgdGhlbgorCSAgICAjIFRoZSAtViBmbGFnIHdhcyBhZGRlZCBpbiAyLjQKKwkgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBmbGV4IDIuNCBvciBoaWdoZXIpCisJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfZmxleF92MjQsCisJCWlmIGZsZXggLVYgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCQlhY19jdl9sYmxfZmxleF92MjQ9eWVzCisJCWVsc2UKKwkJCWFjX2N2X2xibF9mbGV4X3YyND1ubworCQlmaSkKKwkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2ZsZXhfdjI0KQorCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZmxleF92MjQgPSBubyA7IHRoZW4KKwkJICAgIHM9IjIuNCBvciBoaWdoZXIgcmVxdWlyZWQiCisJCSAgICBBQ19NU0dfV0FSTihpZ25vcmluZyBvYnNvbGV0ZSBmbGV4IGV4ZWN1dGFibGUgKCRzKSkKKwkJICAgICQxPWxleAorCSAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCAiJHdpdGhfYmlzb24iID0gbm8gOyB0aGVuCisJICAgICQyPXlhY2MKKyAgICBlbHNlCisJICAgIEFDX0NIRUNLX1BST0dTKCQyLCBiaXNvbiwgeWFjYykKKyAgICBmaQorICAgIGlmIHRlc3QgIiQkMiIgPSBiaXNvbiA7IHRoZW4KKwkgICAgJDI9IiQkMiAteSIKKyAgICBmaQorICAgIGlmIHRlc3QgIiQkMSIgIT0gbGV4IC1hICIkJDIiID0geWFjYyAtbyAiJCQxIiA9IGxleCAtYSAiJCQyIiAhPSB5YWNjIDsgdGhlbgorCSAgICBBQ19NU0dfV0FSTihkb24ndCBoYXZlIGJvdGggZmxleCBhbmQgYmlzb247IHJldmVydGluZyB0byBsZXgveWFjYykKKwkgICAgJDE9bGV4CisJICAgICQyPXlhY2MKKyAgICBmaQorICAgIGlmIHRlc3QgIiQkMSIgPSBmbGV4IC1hIC1uICIkMyIgOyB0aGVuCisJICAgICQxPSIkJDEgLVAkMyIKKwkgICAgJDI9IiQkMiAtcCAkMyIKKyAgICBmaV0pCisKK2RubAorZG5sIENoZWNrcyB0byBzZWUgaWYgdW5pb24gd2FpdCBpcyB1c2VkIHdpdGggV0VYSVRTVEFUVVMoKQorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfVU5JT05fV0FJVAorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCURFQ0xXQUlUU1RBVFVTIChkZWZpbmVkKQorZG5sCitBQ19ERUZVTihBQ19MQkxfVU5JT05fV0FJVCwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHVuaW9uIHdhaXQgaXMgdXNlZCkKKyAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX3VuaW9uX3dhaXQsCisJQUNfVFJZX0NPTVBJTEUoWworIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJaW5jbHVkZSA8c3lzL3dhaXQuaD5dLAorCSAgICBbaW50IHN0YXR1czsKKwkgICAgdV9pbnQgaSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJICAgIHVfaW50IGogPSB3YWl0cGlkKDAsICZzdGF0dXMsIDApO10sCisJICAgIGFjX2N2X2xibF91bmlvbl93YWl0PW5vLAorCSAgICBhY19jdl9sYmxfdW5pb25fd2FpdD15ZXMpKQorICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF91bmlvbl93YWl0KQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF91bmlvbl93YWl0ID0geWVzIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoREVDTFdBSVRTVEFUVVMsdW5pb24gd2FpdCkKKyAgICBlbHNlCisJICAgIEFDX0RFRklORShERUNMV0FJVFNUQVRVUyxpbnQpCisgICAgZmldKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIHRoZSBzb2NrYWRkciBzdHJ1Y3QgaGFzIHRoZSA0LjQgQlNEIHNhX2xlbiBtZW1iZXIKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX1NPQ0tBRERSX1NBX0xFTgorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCUhBVkVfU09DS0FERFJfU0FfTEVOIChkZWZpbmVkKQorZG5sCitBQ19ERUZVTihBQ19MQkxfU09DS0FERFJfU0FfTEVOLAorICAgIFtBQ19NU0dfQ0hFQ0tJTkcoaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyKQorICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbiwKKwlBQ19UUllfQ09NUElMRShbCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSwKKwlbdV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkciAqKTApLT5zYV9sZW4pXSwKKwlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj15ZXMsCisJYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW49bm8pKQorICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuKQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuID0geWVzIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoSEFWRV9TT0NLQUREUl9TQV9MRU4pCisgICAgZmldKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIC1SIGlzIHVzZWQKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0hBVkVfUlVOX1BBVEgKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlhY19jdl9sYmxfaGF2ZV9ydW5fcGF0aCAoeWVzIG9yIG5vKQorZG5sCitBQ19ERUZVTihBQ19MQkxfSEFWRV9SVU5fUEFUSCwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGZvciAke0NDLWNjfSAtUikKKyAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGgsCisJW2VjaG8gJ21haW4oKXt9JyA+IGNvbmZ0ZXN0LmMKKwkke0NDLWNjfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1SL2ExL2IyL2MzID5jb25mdGVzdC5vdXQgMj4mMQorCWlmIHRlc3QgISAtcyBjb25mdGVzdC5vdXQgOyB0aGVuCisJCWFjX2N2X2xibF9oYXZlX3J1bl9wYXRoPXllcworCWVsc2UKKwkJYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGg9bm8KKwlmaQorCXJtIC1mIGNvbmZ0ZXN0Kl0pCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGgpCisgICAgXSkKKworZG5sCitkbmwgQ2hlY2sgd2hldGhlciBhIGdpdmVuIGZvcm1hdCBjYW4gYmUgdXNlZCB0byBwcmludCA2NC1iaXQgaW50ZWdlcnMKK2RubAorQUNfREVGVU4oQUNfTEJMX0NIRUNLXzY0QklUX0ZPUk1BVCwKKyAgWworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAlJDF4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnNdKQorICAgIEFDX1JVTl9JRkVMU0UoCisgICAgICBbCisJQUNfTEFOR19TT1VSQ0UoCisJICBbWworIwkgICAgaWZkZWYgSEFWRV9JTlRUWVBFU19ICisJICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorIwkgICAgZW5kaWYKKyMJICAgIGlmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorICAgICAgICAgICAgI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjCSAgICBlbmRpZgorCSAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKwkgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisJICAgIG1haW4oKQorCSAgICB7CisJICAgICAgdV9pbnQ2NF90IHQgPSAxOworCSAgICAgIGNoYXIgc3RyYnVmWzE2KzFdOworCSAgICAgIHNwcmludGYoc3RyYnVmLCAiJTAxNiQxeCIsIHQgPDwgMzIpOworCSAgICAgIGlmIChzdHJjbXAoc3RyYnVmLCAiMDAwMDAwMDEwMDAwMDAwMCIpID09IDApCisJCWV4aXQoMCk7CisJICAgICAgZWxzZQorCQlleGl0KDEpOworCSAgICB9CisJICBdXSkKKyAgICAgIF0sCisgICAgICBbCisJQUNfREVGSU5FKFBSSWQ2NCwgIiQxZCIpCisJQUNfREVGSU5FKFBSSW82NCwgIiQxbyIpCisJQUNfREVGSU5FKFBSSXg2NCwgIiQxeCIpCisJQUNfREVGSU5FKFBSSXU2NCwgIiQxdSIpCisJQUNfTVNHX1JFU1VMVCh5ZXMpCisgICAgICBdLAorICAgICAgWworCUFDX01TR19SRVNVTFQobm8pCisJJDIKKyAgICAgIF0pCisgIF0pCisKK2RubAorZG5sIENoZWNrcyB0byBzZWUgaWYgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyBmYWlsCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9VTkFMSUdORURfQUNDRVNTCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJTEJMX0FMSUdOIChERUZJTkVEKQorZG5sCitBQ19ERUZVTihBQ19MQkxfVU5BTElHTkVEX0FDQ0VTUywKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsKQorICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwsCisJW2Nhc2UgIiRob3N0X2NwdSIgaW4KKworCSMKKwkjIFRoZXNlIGFyZSBDUFUgdHlwZXMgd2hlcmU6CisJIworCSMJdGhlIENQVSBmYXVsdHMgb24gYW4gdW5hbGlnbmVkIGFjY2VzcywgYnV0IGF0IGxlYXN0IHNvbWUKKwkjCU9TZXMgdGhhdCBzdXBwb3J0IHRoYXQgQ1BVIGNhdGNoIHRoZSBmYXVsdCBhbmQgc2ltdWxhdGUKKwkjCXRoZSB1bmFsaWduZWQgYWNjZXNzIChlLmcuLCBBbHBoYS97RGlnaXRhbCxUcnU2NH0gVU5JWCkgLQorCSMJdGhlIHNpbXVsYXRpb24gaXMgc2xvdywgc28gd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQ7CisJIworCSMJdGhlIENQVSwgSSBpbmZlciAoZnJvbSB0aGUgb2xkCisJIworCSMgWFhYOiBzaG91bGQgYWxzbyBjaGVjayB0aGF0IHRoZXkgZG9uJ3QgZG8gd2VpcmQgdGhpbmdzIChsaWtlIG9uIGFybSkKKwkjCisJIwljb21tZW50KSBkb2Vzbid0IGZhdWx0IG9uIHVuYWxpZ25lZCBhY2Nlc3NlcywgYnV0IGRvZXNuJ3QKKwkjCWRvIGEgbm9ybWFsIHVuYWxpZ25lZCBmZXRjaCwgZWl0aGVyIChlLmcuLCBwcmVzdW1hYmx5LCBBUk0pOworCSMKKwkjCWZvciB3aGF0ZXZlciByZWFzb24sIHRoZSB0ZXN0IHByb2dyYW0gZG9lc24ndCB3b3JrCisJIwkodGhpcyBoYXMgYmVlbiBjbGFpbWVkIHRvIGJlIHRoZSBjYXNlIGZvciBzZXZlcmFsIG9mIHRob3NlCisJIwlDUFVzIC0gSSBkb24ndCBrbm93IHdoYXQgdGhlIHByb2JsZW0gaXM7IHRoZSBwcm9ibGVtCisJIwl3YXMgcmVwb3J0ZWQgYXMgInRoZSB0ZXN0IHByb2dyYW0gZHVtcHMgY29yZSIgZm9yIFN1cGVySCwKKwkjCWJ1dCB0aGF0J3Mgd2hhdCB0aGUgdGVzdCBwcm9ncmFtIGlzICpzdXBwb3NlZCogdG8gZG8gLQorCSMJaXQgZHVtcHMgY29yZSBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyB0aGUgdGVzdAorCSMJZm9yIGFuIGVtcHR5IG91dHB1dCBmaWxlIHNob3VsZCBmaW5kIGFuIGVtcHR5IG91dHB1dAorCSMJZmlsZSBhbmQgY29uY2x1ZGUgdGhhdCB1bmFsaWduZWQgYWNjZXNzZXMgZG9uJ3Qgd29yaykuCisJIworCSMgVGhpcyBydW4tdGltZSB0ZXN0IHdvbid0IHdvcmsgaWYgeW91J3JlIGNyb3NzLWNvbXBpbGluZywgc28KKwkjIGluIG9yZGVyIHRvIHN1cHBvcnQgY3Jvc3MtY29tcGlsaW5nIGZvciBhIHBhcnRpY3VsYXIgQ1BVLAorCSMgd2UgaGF2ZSB0byB3aXJlIGluIHRoZSBsaXN0IG9mIENQVSB0eXBlcyBhbnl3YXksIGFzIGZhciBhcworCSMgSSBrbm93LCBzbyBwZXJoYXBzIHdlIHNob3VsZCBqdXN0IGhhdmUgYSBzZXQgb2YgQ1BVcyBvbgorCSMgd2hpY2ggd2Uga25vdyBpdCBkb2Vzbid0IHdvcmssIGEgc2V0IG9mIENQVXMgb24gd2hpY2ggd2UKKwkjIGtub3cgaXQgZG9lcyB3b3JrLCBhbmQgaGF2ZSB0aGUgc2NyaXB0IGp1c3QgZmFpbCBvbiBvdGhlcgorCSMgY3B1IHR5cGVzIGFuZCB1cGRhdGUgaXQgd2hlbiBzdWNoIGEgZmFpbHVyZSBvY2N1cnMuCisJIworCWFscGhhKnxhcm0qfGhwKnxtaXBzKnxzaCp8c3BhcmMqfGlhNjR8bnYxKQorCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCTs7CisKKwkqKQorCQljYXQgPmNvbmZ0ZXN0LmMgPDxFT0YKKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwkJaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMJCWluY2x1ZGUgPHN0ZGlvLmg+CisJCXVuc2lnbmVkIGNoYXIgYVtbNV1dID0geyAxLCAyLCAzLCA0LCA1IH07CisJCW1haW4oKSB7CisJCXVuc2lnbmVkIGludCBpOworCQlwaWRfdCBwaWQ7CisJCWludCBzdGF0dXM7CisJCS8qIGF2b2lkICJjb3JlIGR1bXBlZCIgbWVzc2FnZSAqLworCQlwaWQgPSBmb3JrKCk7CisJCWlmIChwaWQgPCAgMCkKKwkJCWV4aXQoMik7CisJCWlmIChwaWQgPiAwKSB7CisJCQkvKiBwYXJlbnQgKi8KKwkJCXBpZCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKwkJCWlmIChwaWQgPCAwKQorCQkJCWV4aXQoMyk7CisJCQlleGl0KCFXSUZFWElURUQoc3RhdHVzKSk7CisJCX0KKwkJLyogY2hpbGQgKi8KKwkJaSA9ICoodW5zaWduZWQgaW50ICopJmFbWzFdXTsKKwkJcHJpbnRmKCIlZFxuIiwgaSk7CisJCWV4aXQoMCk7CisJCX0KK0VPRgorCQkke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBcCisJCSAgICBjb25mdGVzdC5jICRMSUJTID4vZGV2L251bGwgMj4mMQorCQlpZiB0ZXN0ICEgLXggY29uZnRlc3QgOyB0aGVuCisJCQlkbmwgZmFpbGVkIHRvIGNvbXBpbGUgZm9yIHNvbWUgcmVhc29uCisJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCWVsc2UKKwkJCS4vY29uZnRlc3QgPmNvbmZ0ZXN0Lm91dAorCQkJaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0Lm91dCA7IHRoZW4KKwkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCQllbHNlCisJCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPW5vCisJCQlmaQorCQlmaQorCQlybSAtZiBjb25mdGVzdCogY29yZSBjb3JlLmNvbmZ0ZXN0CisJCTs7CisJZXNhY10pCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsKQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF91bmFsaWduZWRfZmFpbCA9IHllcyA7IHRoZW4KKwkgICAgQUNfREVGSU5FKExCTF9BTElHTikKKyAgICBmaV0pCisKK2RubAorZG5sIElmIHVzaW5nIGdjYyBhbmQgdGhlIGZpbGUgLmRldmVsIGV4aXN0czoKK2RubAlDb21waWxlIHdpdGggLWcgKGlmIHN1cHBvcnRlZCkgYW5kIC1XYWxsCitkbmwJSWYgdXNpbmcgZ2NjIDIgb3IgbGF0ZXIsIGRvIGV4dHJhIHByb3RvdHlwZSBjaGVja2luZyBhbmQgc29tZSBvdGhlcgorZG5sCWNoZWNrcworZG5sCUlmIGFuIG9zIHByb3RvdHlwZSBpbmNsdWRlIGV4aXN0cywgc3ltbGluayBvcy1wcm90by5oIHRvIGl0CitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9ERVZFTChjb3B0KQorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCSQxIChjb3B0IGFwcGVuZGVkKQorZG5sCUhBVkVfT1NfUFJPVE9fSCAoZGVmaW5lZCkKK2RubAlvcy1wcm90by5oIChzeW1saW5rZWQpCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9ERVZFTCwKKyAgICBbcm0gLWYgb3MtcHJvdG8uaAorICAgIGlmIHRlc3QgIiR7TEJMX0NGTEFHUytzZXR9IiA9IHNldDsgdGhlbgorCSAgICAkMT0iJCQxICR7TEJMX0NGTEFHU30iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1mIC5kZXZlbCA7IHRoZW4KKwkgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgIT0gc2V0OyB0aGVuCisJCQkgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfY2NfZyIgPSB5ZXMgOyB0aGVuCisJCQkJICAgICQxPSItZyAkJDEiCisJCQkgICAgZmkKKwkJCSAgICAkMT0iJCQxIC1XYWxsIgorCQkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9nY2NfdmVycyAtZ3QgMSA7IHRoZW4KKwkJCQkgICAgJDE9IiQkMSAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVciCisJCQkgICAgZmkKKwkJICAgIGZpCisJICAgIGVsc2UKKwkJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJCSAgICBpcml4NiopCisJCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLW4zMiIKKwkJCSAgICA7OworCisJCSAgICAqKQorCQkJICAgIDs7CisJCSAgICBlc2FjCisJICAgIGZpCisJICAgIG9zPWBlY2hvICRob3N0X29zIHwgc2VkIC1lICdzL1woW1swLTldXVtbMC05XV0qXClbW14wLTldXS4qJC9cMS8nYAorCSAgICBuYW1lPSJsYmwvb3MtJG9zLmgiCisJICAgIGlmIHRlc3QgLWYgJG5hbWUgOyB0aGVuCisJCSAgICBsbiAtcyAkbmFtZSBvcy1wcm90by5oCisJCSAgICBBQ19ERUZJTkUoSEFWRV9PU19QUk9UT19IKQorCSAgICBlbHNlCisJCSAgICBBQ19NU0dfV0FSTihjYW4ndCBmaW5kICRuYW1lKQorCSAgICBmaQorICAgIGZpXSkKKworZG5sCitkbmwgSW1wcm92ZWQgdmVyc2lvbiBvZiBBQ19DSEVDS19MSUIKK2RubAorZG5sIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0NIRUNLX0xJQihMSUJSQVJZLCBGVU5DVElPTiBbLCBBQ1RJT04tSUYtRk9VTkQgWywKK2RubAkgICAgQUNUSU9OLUlGLU5PVC1GT1VORCBbLCBPVEhFUi1MSUJSQVJJRVNdXV0pCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJTElCUworZG5sCitkbmwgWFhYIC0gIkFDX0xCTF9MSUJSQVJZX05FVCIgd2FzIHJlZG9uZSB0byB1c2UgIkFDX1NFQVJDSF9MSUJTIgorZG5sIHJhdGhlciB0aGFuICJBQ19MQkxfQ0hFQ0tfTElCIiwgc28gdGhpcyBpc24ndCB1c2VkIGFueSBtb3JlLgorZG5sIFdlIGtlZXAgaXQgYXJvdW5kIGZvciByZWZlcmVuY2UgcHVycG9zZXMgaW4gY2FzZSBpdCdzIGV2ZXIKK2RubCB1c2VmdWwgaW4gdGhlIGZ1dHVyZS4KK2RubAorCitkZWZpbmUoQUNfTEJMX0NIRUNLX0xJQiwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMiBpbiAtbCQxXSkKK2RubCBVc2UgYSBjYWNoZSB2YXJpYWJsZSBuYW1lIGNvbnRhaW5pbmcgdGhlIGxpYnJhcnksIGZ1bmN0aW9uCitkbmwgbmFtZSwgYW5kIGV4dHJhIGxpYnJhcmllcyB0byBsaW5rIHdpdGgsIGJlY2F1c2UgdGhlIHRlc3QgcmVhbGx5IGlzCitkbmwgZm9yIGxpYnJhcnkgJDEgZGVmaW5pbmcgZnVuY3Rpb24gJDIsIHdoZW4gbGlua2VkIHdpdGggcG90aW5hbAorZG5sIGxpYnJhcnkgJDUsIG5vdCBqdXN0IGZvciBsaWJyYXJ5ICQxLiAgU2VwYXJhdGUgdGVzdHMgd2l0aCB0aGUgc2FtZQorZG5sICQxIGFuZCBkaWZmZXJlbnQgJDIncyBvciAkNSdzIG1heSBoYXZlIGRpZmZlcmVudCByZXN1bHRzLgorYWNfbGliX3Zhcj1gZWNobyAkMVsnXyddJDJbJ18nXSQ1IHwgc2VkICd5JS4vKy0gJV9fcF9fJSdgCitBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2xpYl8kYWNfbGliX3ZhciwKK1thY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWwkMSAkNSAkTElCUyIKK0FDX1RSWV9MSU5LKGRubAoraWZlbHNlKFskMl0sIFttYWluXSwgLCBkbmwgQXZvaWQgY29uZmxpY3RpbmcgZGVjbCBvZiBtYWluLgorWy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCitdaWZlbHNlKEFDX0xBTkcsIENQTFVTUExVUywgWyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitdKWRubAorWy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciAkMigpOworXSksCisJICAgIFskMigpXSwKKwkgICAgZXZhbCAiYWNfY3ZfbGJsX2xpYl8kYWNfbGliX3Zhcj15ZXMiLAorCSAgICBldmFsICJhY19jdl9sYmxfbGliXyRhY19saWJfdmFyPW5vIikKK0xJQlM9IiRhY19zYXZlX0xJQlMiCitdKWRubAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGJsX2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoeWVzKQorICBpZmVsc2UoWyQzXSwgLAorW2NoYW5nZXF1b3RlKCwgKWRubAorICBhY190cl9saWI9SEFWRV9MSUJgZWNobyAkMSB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCitjaGFuZ2VxdW90ZShbLCBdKWRubAorICBBQ19ERUZJTkVfVU5RVU9URUQoJGFjX3RyX2xpYikKKyAgTElCUz0iLWwkMSAkTElCUyIKK10sIFskM10pCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitpZmVsc2UoWyQ0XSwgLCAsIFskNAorXSlkbmwKK2ZpCitdKQorCitkbmwKK2RubCBBQ19MQkxfTElCUkFSWV9ORVQKK2RubAorZG5sIFRoaXMgdGVzdCBpcyBmb3IgbmV0d29yayBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHNvY2tldCgpIGFuZAorZG5sIGdldGhvc3RieW5hbWUoKSAtaXNoIGZ1bmN0aW9ucy4gIFVuZGVyIFNvbGFyaXMsIHRob3NlIGFwcGxpY2F0aW9ucworZG5sIG5lZWQgdG8gbGluayB3aXRoICItbHNvY2tldCAtbG5zbCIuICBVbmRlciBJUklYLCB0aGV5IG5lZWQgdG8gbGluaworZG5sIHdpdGggIi1sbnNsIiBidXQgc2hvdWxkICpub3QqIGxpbmsgd2l0aCAiLWxzb2NrZXQiIGJlY2F1c2UKK2RubCBsaWJzb2NrZXQuYSBicmVha3MgYSBudW1iZXIgb2YgdGhpbmdzIChmb3IgaW5zdGFuY2U6CitkbmwgZ2V0aG9zdGJ5bmFtZSgpIHVuZGVyIElSSVggNS4yLCBhbmQgc25vb3Agc29ja2V0cyB1bmRlciBtb3N0CitkbmwgdmVyc2lvbnMgb2YgSVJJWCkuCitkbmwKK2RubCBVbmZvcnR1bmF0ZWx5LCBtYW55IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgYXJlIG5vdCBhd2FyZSBvZiB0aGlzLAorZG5sIGFuZCBtaXN0YWtlbmx5IHdyaXRlIHRlc3RzIHRoYXQgY2F1c2UgLWxzb2NrZXQgdG8gYmUgdXNlZCB1bmRlcgorZG5sIElSSVguICBJdCBpcyBhbHNvIGVhc3kgdG8gd3JpdGUgdGVzdHMgdGhhdCBjYXVzZSAtbG5zbCB0byBiZSB1c2VkCitkbmwgdW5kZXIgb3BlcmF0aW5nIHN5c3RlbXMgd2hlcmUgbmVpdGhlciBhcmUgbmVjZXNzYXJ5IChvciB1c2VmdWwpLAorZG5sIHN1Y2ggYXMgU3VuT1MgNC4xLjQsIHdoaWNoIHVzZXMgLWxuc2wgZm9yIFRMSS4KK2RubAorZG5sIFRoaXMgdGVzdCBleGlzdHMgc28gdGhhdCBldmVyeSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgZG9lcyBub3QgdGVzdAorZG5sIHRoaXMgaW4gYSBkaWZmZXJlbnQsIGFuZCBzdWJ0bHkgYnJva2VuIGZhc2hpb24uCisKK2RubCBJdCBoYXMgYmVlbiBhcmd1ZWQgdGhhdCB0aGlzIHRlc3Qgc2hvdWxkIGJlIGJyb2tlbiB1cCBpbnRvIHR3bworZG5sIHNlcGVyYXRlIHRlc3RzLCBvbmUgZm9yIHRoZSByZXNvbHZlciBsaWJyYXJpZXMsIGFuZCBvbmUgZm9yIHRoZQorZG5sIGxpYnJhcmllcyBuZWNlc3NhcnkgZm9yIHVzaW5nIFNvY2tldHMgQVBJLiBVbmZvcnR1bmF0ZWx5LCB0aGUgdHdvCitkbmwgYXJlIGNhcmVmdWxseSBpbnRlcnR3aW5lZCBhbmQgYWxsb3dpbmcgdGhlIGF1dG9jb25mIHVzZXIgdG8gdXNlCitkbmwgdGhlbSBpbmRlcGVuZGFudGx5IHBvdGVudGlhbGx5IHJlc3VsdHMgaW4gdW5mb3J0dW5hdGUgb3JkZXJpbmcKK2RubCBkZXBlbmRhbmNpZXMgLS0gYXMgc3VjaCwgc3VjaCBjb21wb25lbnQgbWFjcm9zIHdvdWxkIGhhdmUgdG8KK2RubCBjYXJlZnVsbHkgdXNlIGluZGlyZWN0aW9uIGFuZCBiZSBhd2FyZSBpZiB0aGUgb3RoZXIgY29tcG9uZW50cyB3ZXJlCitkbmwgZXhlY3V0ZWQuIFNpbmNlIG90aGVyIGF1dG9jb25mIG1hY3JvcyBkbyBub3QgZ28gdG8gdGhpcyB0cm91YmxlLAorZG5sIGFuZCBhbG1vc3Qgbm8gYXBwbGljYXRpb25zIHVzZSBzb2NrZXRzIHdpdGhvdXQgdGhlIHJlc29sdmVyLCB0aGlzCitkbmwgY29tcGxleGl0eSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQuCitkbmwKK2RubCBUaGUgY2hlY2sgZm9yIGxpYnJlc29sdiBpcyBpbiBjYXNlIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBsaW5rCitkbmwgc3RhdGljYWxseSBhbmQgaGFwcGVuIHRvIGhhdmUgYSBsaWJyZXNvbHYuYSBseWluZyBhcm91bmQgKGFuZCBubworZG5sIGxpYm5zbC5hKS4KK2RubAorQUNfREVGVU4oQUNfTEJMX0xJQlJBUllfTkVULCBbCisgICAgIyBNb3N0IG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgZ2V0aG9zdGJ5bmFtZSgpIGluIHRoZSBkZWZhdWx0IHNlYXJjaGVkCisgICAgIyBsaWJyYXJpZXMgKGkuZS4gbGliYyk6CisgICAgIyBTb21lIE9TZXMgKGVnLiBTb2xhcmlzKSBwbGFjZSBpdCBpbiBsaWJuc2wKKyAgICAjIFNvbWUgc3RyYW5nZSBPU2VzIChTSU5JWCkgaGF2ZSBpdCBpbiBsaWJzb2NrZXQ6CisgICAgQUNfU0VBUkNIX0xJQlMoZ2V0aG9zdGJ5bmFtZSwgbnNsIHNvY2tldCByZXNvbHYpCisgICAgIyBVbmZvcnR1bmF0ZWx5IGxpYnNvY2tldCBzb21ldGltZXMgZGVwZW5kcyBvbiBsaWJuc2wgYW5kCisgICAgIyBBQ19TRUFSQ0hfTElCUyBpc24ndCB1cCB0byB0aGUgdGFzayBvZiBoYW5kbGluZyBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzLgorICAgIGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPSAibm8iCisgICAgdGhlbgorCUFDX0NIRUNLX0xJQihzb2NrZXQsIGdldGhvc3RieW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIsICwgLWxuc2wpCisgICAgZmkKKyAgICBBQ19TRUFSQ0hfTElCUyhzb2NrZXQsIHNvY2tldCwgLAorCUFDX0NIRUNLX0xJQihzb2NrZXQsIHNvY2tldCwgTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiLCAsIC1sbnNsKSkKKyAgICAjIERMUEkgbmVlZHMgcHV0bXNnIHVuZGVyIEhQVVggc28gdGVzdCBmb3IgLWxzdHIgd2hpbGUgd2UncmUgYXQgaXQKKyAgICBBQ19TRUFSQ0hfTElCUyhwdXRtc2csIHN0cikKKyAgICBdKQorCitkbmwgQ29weXJpZ2h0IChjKSAxOTk5IFdJREUgUHJvamVjdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK2RubAorZG5sIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorZG5sIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworZG5sIGFyZSBtZXQ6CitkbmwgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKK2RubCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCitkbmwgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKK2RubCAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCitkbmwgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KK2RubCAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworZG5sICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorZG5sICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorZG5sIAorZG5sIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECitkbmwgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitkbmwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK2RubCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKK2RubCBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorZG5sIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitkbmwgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCitkbmwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKK2RubCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitkbmwgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorZG5sIFNVQ0ggREFNQUdFLgorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIEFGX0lORVQ2IGlzIGRlZmluZWQKK0FDX0RFRlVOKEFDX0NIRUNLX0FGX0lORVQ2LCBbCisJQUNfTVNHX0NIRUNLSU5HKGZvciBBRl9JTkVUNikKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSwKKwkJW2ludCBhID0gQUZfSU5FVDZdLAorCQkkMT15ZXMsCisJCSQxPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCQkMSkKKwkJaWYgdGVzdCAkJDEgPSB5ZXMgOyB0aGVuCisJCQlBQ19ERUZJTkUoSEFWRV9BRl9JTkVUNikKKwlmaQorXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc29ja2FkZHIgc3RydWN0IGhhcyB0aGUgNC40IEJTRCBzYV9sZW4gbWVtYmVyCitkbmwgYm9ycm93ZWQgZnJvbSBMQkwgbGlicGNhcAorQUNfREVGVU4oQUNfQ0hFQ0tfU0FfTEVOLCBbCisJQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgc2FfbGVuIG1lbWJlcikKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSwKKwkJW3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHIgKikwKS0+c2FfbGVuKV0sCisJCSQxPXllcywKKwkJJDE9bm8pKQorCUFDX01TR19SRVNVTFQoJCQxKQorCQlpZiB0ZXN0ICQkMSA9IHllcyA7IHRoZW4KKwkJCUFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NBX0xFTikKKwlmaQorXSkKKworZG5sCitkbmwgQ2hlY2tzIGZvciBwb3J0YWJsZSBwcm90b3R5cGUgZGVjbGFyYXRpb24gbWFjcm8KK0FDX0RFRlVOKEFDX0NIRUNLX1BPUlRBQkxFX1BST1RPLCAgWworCUFDX01TR19DSEVDS0lORyhmb3IgX19QKQorCUFDX0NBQ0hFX1ZBTCgkMSwKKwlBQ19UUllfQ09NUElMRShbCisjCQlpbmNsdWRlIDx1bmlzdGQuaD5dLAorCQlbaW50IGYgX19QKCgpKV0sCisJCSQxPXllcywKKwkJJDE9bm8pKQorCUFDX01TR19SRVNVTFQoJCQxKQorCWlmIHRlc3QgJCQxID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX1BPUlRBQkxFX1BST1RPVFlQRSkKKwlmaQorXSkKKworZG5sIGNoZWNrcyBmb3IgdV9pbnRYWF90CitBQ19ERUZVTihBQ19DSEVDS19CSVRUWVBFUywgWworCSQxPXllcworZG5sIGNoZWNrIGZvciB1X2ludDhfdAorCUFDX01TR19DSEVDS0lORyhmb3IgdV9pbnQ4X3QpCisJQUNfQ0FDSEVfVkFMKGFjX2N2X3VfaW50OF90LAorCUFDX1RSWV9DT01QSUxFKFsKKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPl0sCisJCVt1X2ludDhfdCBpXSwKKwkJYWNfY3ZfdV9pbnQ4X3Q9eWVzLAorCQlhY19jdl91X2ludDhfdD1ubykpCisJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdV9pbnQ4X3QpCisJaWYgdGVzdCAkYWNfY3ZfdV9pbnQ4X3QgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfVV9JTlQ4X1QpCisJZWxzZQorCQkkMT1ubworCWZpCitkbmwgY2hlY2sgZm9yIHVfaW50MTZfdAorCUFDX01TR19DSEVDS0lORyhmb3IgdV9pbnQxNl90KQorCUFDX0NBQ0hFX1ZBTChhY19jdl91X2ludDE2X3QsCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwKKwkJW3VfaW50MTZfdCBpXSwKKwkJYWNfY3ZfdV9pbnQxNl90PXllcywKKwkJYWNfY3ZfdV9pbnQxNl90PW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl91X2ludDE2X3QpCisJaWYgdGVzdCAkYWNfY3ZfdV9pbnQxNl90ID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX1VfSU5UMTZfVCkKKwllbHNlCisJCSQxPW5vCisJZmkKK2RubCBjaGVjayBmb3IgdV9pbnQzMl90CisJQUNfTVNHX0NIRUNLSU5HKGZvciB1X2ludDMyX3QpCisJQUNfQ0FDSEVfVkFMKGFjX2N2X3VfaW50MzJfdCwKKwlBQ19UUllfQ09NUElMRShbCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAorCQlbdV9pbnQzMl90IGldLAorCQlhY19jdl91X2ludDMyX3Q9eWVzLAorCQlhY19jdl91X2ludDMyX3Q9bm8pKQorCUFDX01TR19SRVNVTFQoJGFjX2N2X3VfaW50MzJfdCkKKwlpZiB0ZXN0ICRhY19jdl91X2ludDMyX3QgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfVV9JTlQzMl9UKQorCWVsc2UKKwkJJDE9bm8KKwlmaQorZG5sIGNoZWNrIGZvciB1X2ludDY0X3QKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVfaW50NjRfdCkKKwlBQ19DQUNIRV9WQUwoYWNfY3ZfdV9pbnQ2NF90LAorCUFDX1RSWV9DT01QSUxFKFsKKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPl0sCisJCVt1X2ludDY0X3QgaV0sCisJCWFjX2N2X3VfaW50NjRfdD15ZXMsCisJCWFjX2N2X3VfaW50NjRfdD1ubykpCisJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdV9pbnQ2NF90KQorCWlmIHRlc3QgJGFjX2N2X3VfaW50NjRfdCA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9VX0lOVDY0X1QpCisJZWxzZQorCQkkMT1ubworCWZpCitdKQorCitkbmwKK2RubCBDaGVja3MgZm9yIGFkZHJpbmZvIHN0cnVjdHVyZQorQUNfREVGVU4oQUNfU1RSVUNUX0FERFJJTkZPLCBbCisJQUNfTVNHX0NIRUNLSU5HKGZvciBhZGRyaW5mbykKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8bmV0ZGIuaD5dLAorCQlbc3RydWN0IGFkZHJpbmZvIGFdLAorCQkkMT15ZXMsCisJCSQxPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCQkMSkKKwlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9BRERSSU5GTykKKwllbHNlCisJCUFDX0RFRklORShORUVEX0FERFJJTkZPX0gpCisJZmkKK10pCisKK2RubAorZG5sIENoZWNrcyBmb3IgTklfTUFYU0VSVgorQUNfREVGVU4oQUNfTklfTUFYU0VSViwgWworCUFDX01TR19DSEVDS0lORyhmb3IgTklfTUFYU0VSVikKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfRUdSRVBfQ1BQKHllcywgWyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIE5JX01BWFNFUlYKK3llcworI2VuZGlmXSwKKwkJJDE9eWVzLAorCQkkMT1ubykpCisJQUNfTVNHX1JFU1VMVCgkJDEpCisJaWYgdGVzdCAkJDEgIT0geWVzOyB0aGVuCisJCUFDX0RFRklORShORUVEX0FERFJJTkZPX0gpCisJZmkKK10pCisKK2RubAorZG5sIENoZWNrcyBmb3IgTklfTkFNRVJFUUQKK0FDX0RFRlVOKEFDX05JX05BTUVSRVFELCBbCisJQUNfTVNHX0NIRUNLSU5HKGZvciBOSV9OQU1FUkVRRCkKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfRUdSRVBfQ1BQKHllcywgWyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIE5JX05PRlFETgoreWVzCisjZW5kaWZdLAorCQkkMT15ZXMsCisJCSQxPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCQkMSkKKwlpZiB0ZXN0ICQkMSAhPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKE5FRURfQUREUklORk9fSCkKKwlmaQorXSkKKworZG5sCitkbmwgQ2hlY2tzIGZvciBzb2NrYWRkcl9zdG9yYWdlIHN0cnVjdHVyZQorQUNfREVGVU4oQUNfU1RSVUNUX1NBX1NUT1JBR0UsIFsKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIHNvY2thZGRyX3N0b3JhZ2UpCisJQUNfQ0FDSEVfVkFMKCQxLAorCUFDX1RSWV9DT01QSUxFKFsKKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwkJaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0sCisJCVtzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzXSwKKwkJJDE9eWVzLAorCQkkMT1ubykpCisJQUNfTVNHX1JFU1VMVCgkJDEpCisJaWYgdGVzdCAkJDEgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfU09DS0FERFJfU1RPUkFHRSkKKwlmaQorXSkKKworZG5sCitkbmwgQ2hlY2tzIGZvciBtYWNybyBvZiBJUCBhZGRyZXNzIHNpemUKK0FDX0RFRlVOKEFDX0NIRUNLX0FERFJTWiwgWworCSQxPXllcworZG5sIGNoZWNrIGZvciBJTkFERFJTWgorCUFDX01TR19DSEVDS0lORyhmb3IgSU5BRERSU1opCisJQUNfQ0FDSEVfVkFMKGFjX2N2X2luYWRkcnN6LAorCUFDX1RSWV9DT01QSUxFKFsKKyMJCWluY2x1ZGUgPGFycGEvbmFtZXNlci5oPl0sCisJCVtpbnQgYSA9IElOQUREUlNaXSwKKwkJYWNfY3ZfaW5hZGRyc3o9eWVzLAorCQlhY19jdl9pbmFkZHJzej1ubykpCisJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaW5hZGRyc3opCisJaWYgdGVzdCAkYWNfY3ZfaW5hZGRyc3ogPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfSU5BRERSU1opCisJZWxzZQorCQkkMT1ubworCWZpCitkbmwgY2hlY2sgZm9yIElONkFERFJTWgorCUFDX01TR19DSEVDS0lORyhmb3IgSU42QUREUlNaKQorCUFDX0NBQ0hFX1ZBTChhY19jdl9pbjZhZGRyc3osCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+XSwKKwkJW2ludCBhID0gSU42QUREUlNaXSwKKwkJYWNfY3ZfaW42YWRkcnN6PXllcywKKwkJYWNfY3ZfaW42YWRkcnN6PW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9pbjZhZGRyc3opCisJaWYgdGVzdCAkYWNfY3ZfaW42YWRkcnN6ID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX0lONkFERFJTWikKKwllbHNlCisJCSQxPW5vCisJZmkKK10pCisKK2RubAorZG5sIGNoZWNrIGZvciBSRVNfVVNFX0lORVQ2CitBQ19ERUZVTihBQ19DSEVDS19SRVNfVVNFX0lORVQ2LCBbCisJQUNfTVNHX0NIRUNLSU5HKGZvciBSRVNfVVNFX0lORVQ2KQorCUFDX0NBQ0hFX1ZBTCgkMSwKKwlBQ19UUllfQ09NUElMRShbCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMJCWluY2x1ZGUgPHJlc29sdi5oPl0sCisJCVtpbnQgYSA9IFJFU19VU0VfSU5FVDZdLAorCQkkMT15ZXMsCisJCSQxPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCQkMSkKKwlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9SRVNfVVNFX0lORVQ2KQorCWZpCitdKQorCitkbmwKK2RubCBjaGVjayBmb3IgQUFBQQorQUNfREVGVU4oQUNfQ0hFQ0tfQUFBQSwgWworCUFDX01TR19DSEVDS0lORyhmb3IgQUFBQSkKKwlBQ19DQUNIRV9WQUwoJDEsCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD5dLAorCQlbaW50IGEgPSBUX0FBQUFdLAorCQkkMT15ZXMsCisJCSQxPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCQkMSkKKwlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSEFWRV9BQUFBKQorCWZpCitdKQorCitkbmwKK2RubCBjaGVjayBmb3Igc3RydWN0IHJlc19zdGF0ZV9leHQKK0FDX0RFRlVOKEFDX1NUUlVDVF9SRVNfU1RBVEVfRVhULCBbCisJQUNfTVNHX0NIRUNLSU5HKGZvciByZXNfc3RhdGVfZXh0KQorCUFDX0NBQ0hFX1ZBTCgkMSwKKwlBQ19UUllfQ09NUElMRShbCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQ2L2luNi5oPgorIwkJaW5jbHVkZSA8cmVzb2x2Lmg+XSwKKwkJW3N0cnVjdCBfX3Jlc19zdGF0ZV9leHQgZV0sCisJCSQxPXllcywKKwkJJDE9bm8pKQorCUFDX01TR19SRVNVTFQoJCQxKQorCWlmIHRlc3QgJCQxID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX1JFU19TVEFURV9FWFQpCisJZmkKK10pCisKK2RubAorZG5sIGNoZWNrIGZvciBzdHJ1Y3QgcmVzX3N0YXRlX2V4dAorQUNfREVGVU4oQUNfU1RSVUNUX1JFU19TVEFURSwgWworCUFDX01TR19DSEVDS0lORyhmb3IgbnNvcnQgaW4gcmVzX3N0YXRlKQorCUFDX0NBQ0hFX1ZBTCgkMSwKKwlBQ19UUllfQ09NUElMRShbCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQ2L2luNi5oPgorIwkJaW5jbHVkZSA8cmVzb2x2Lmg+XSwKKwkJW3N0cnVjdCBfX3Jlc19zdGF0ZSBlOyBlLm5zb3J0ID0gMF0sCisJCSQxPXllcywKKwkJJDE9bm8pKQorCUFDX01TR19SRVNVTFQoJCQxKQorCWlmIHRlc3QgJCQxID0geWVzOyB0aGVuCisJCUFDX0RFRklORShIQVZFX05FV19SRVNfU1RBVEUpCisJZmkKK10pCisKK2RubAorZG5sIGNoZWNrIGZvciBoX2Vycm5vCitBQ19ERUZVTihBQ19WQVJfSF9FUlJOTywgWworCUFDX01TR19DSEVDS0lORyhmb3IgaF9lcnJubykKKwlBQ19DQUNIRV9WQUwoYWNfY3ZfdmFyX2hfZXJybm8sCisJQUNfVFJZX0NPTVBJTEUoWworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxuZXRkYi5oPl0sCisJCVtpbnQgZm9vID0gaF9lcnJubztdLAorCQlhY19jdl92YXJfaF9lcnJubz15ZXMsCisJCWFjX2N2X3Zhcl9oX2Vycm5vPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl92YXJfaF9lcnJubykKKwlpZiB0ZXN0ICIkYWNfY3ZfdmFyX2hfZXJybm8iID0gInllcyI7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfSF9FUlJOTykKKwlmaQorXSkKKworZG5sCitkbmwgVGVzdCBmb3IgX19hdHRyaWJ1dGVfXworZG5sCisKK0FDX0RFRlVOKEFDX0NfX19BVFRSSUJVVEVfXywgWworQUNfTVNHX0NIRUNLSU5HKGZvciBfX2F0dHJpYnV0ZV9fKQorQUNfQ0FDSEVfVkFMKGFjX2N2X19fYXR0cmlidXRlX18sIFsKK0FDX0NPTVBJTEVfSUZFTFNFKAorICBBQ19MQU5HX1NPVVJDRShbWworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgdm9pZCBmb28odm9pZCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkCitmb28odm9pZCkKK3sKKyAgZXhpdCgxKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgZm9vKCk7Cit9CisgIF1dKSwKK2FjX2N2X19fYXR0cmlidXRlX189eWVzLAorYWNfY3ZfX19hdHRyaWJ1dGVfXz1ubyldKQoraWYgdGVzdCAiJGFjX2N2X19fYXR0cmlidXRlX18iID0gInllcyI7IHRoZW4KKyAgQUNfREVGSU5FKEhBVkVfX19BVFRSSUJVVEVfXywgMSwgW2RlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBfX2F0dHJpYnV0ZV9fXSkKKyAgVl9ERUZTPSIkVl9ERUZTIC1EX1VfPVwiX19hdHRyaWJ1dGVfXygodW51c2VkKSlcIiIKK2Vsc2UKKyAgVl9ERUZTPSIkVl9ERUZTIC1EX1VfPVwiXCIiCitmaQorQUNfTVNHX1JFU1VMVCgkYWNfY3ZfX19hdHRyaWJ1dGVfXykKK10pCmRpZmYgLS1naXQgYS9hZGRydG9uYW1lLmMgYi9hZGRydG9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkNjE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FkZHJ0b25hbWUuYwpAQCAtMCwwICsxLDExNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgSW50ZXJuZXQsIGV0aGVybmV0LCBwb3J0LCBhbmQgcHJvdG9jb2wgc3RyaW5nIHRvIGFkZHJlc3MKKyAqICBhbmQgYWRkcmVzcyB0byBzdHJpbmcgY29udmVyc2lvbiByb3V0aW5lcworICovCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hZGRydG9uYW1lLmMsdiAxLjEwOC4yLjkgMjAwNy8wOS8xNCAwMDoyNjoxOCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpZmRlZiBVU0VfRVRIRVJfTlRPSE9TVAorI2lmZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICitzdHJ1Y3QgbWJ1ZjsJCS8qIFNxdWVsY2ggY29tcGlsZXIgd2FybmluZ3Mgb24gc29tZSBwbGF0Zm9ybXMgZm9yICovCitzdHJ1Y3QgcnRlbnRyeTsJCS8qIGRlY2xhcmF0aW9ucyBpbiA8bmV0L2lmLmg+ICovCisjaW5jbHVkZSA8bmV0L2lmLmg+CS8qIGZvciAic3RydWN0IGlmbmV0IiBpbiAic3RydWN0IGFycGNvbSIgb24gU29sYXJpcyAqLworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNlbmRpZiAvKiBIQVZFX05FVElORVRfSUZfRVRIRVJfSCAqLworI2lmZGVmIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2VuZGlmIC8qIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUICovCisKKyNpZiAhZGVmaW5lZChIQVZFX0RFQ0xfRVRIRVJfTlRPSE9TVCkgfHwgIUhBVkVfREVDTF9FVEhFUl9OVE9IT1NUCisjaWZuZGVmIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIKK3N0cnVjdCBldGhlcl9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIGV0aGVyX2FkZHJfb2N0ZXRbNl07Cit9OworI2VuZGlmCitleHRlcm4gaW50IGV0aGVyX250b2hvc3QoY2hhciAqLCBjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqKTsKKyNlbmRpZgorCisjZW5kaWYgLyogVVNFX0VUSEVSX05UT0hPU1QgKi8KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxwY2FwLW5hbWVkYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAibGxjLmgiCisjaW5jbHVkZSAic2V0c2lnbmFsLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgIm91aS5oIgorCisjaWZuZGVmIEVUSEVSX0FERFJfTEVOCisjZGVmaW5lIEVUSEVSX0FERFJfTEVOCTYKKyNlbmRpZgorCisvKgorICogaGFzaCB0YWJsZXMgZm9yIHdoYXRldmVyLXRvLW5hbWUgdHJhbnNsYXRpb25zCisgKgorICogWFhYIHRoZXJlIGhhcyB0byBiZSBlcnJvciBjaGVja3MgYWdhaW5zdCBzdHJkdXAoMykgZmFpbHVyZQorICovCisKKyNkZWZpbmUgSEFTSE5BTUVTSVpFIDQwOTYKKyNkZWZpbmUgQlVGU0laRSAxMjgKKworc3RydWN0IGhuYW1lbWVtIHsKKwl1X2ludDMyX3QgYWRkcjsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBobmFtZW1lbSAqbnh0OworfTsKKworc3RydWN0IGhuYW1lbWVtIGhuYW1ldGFibGVbSEFTSE5BTUVTSVpFXTsKK3N0cnVjdCBobmFtZW1lbSB0cG9ydHRhYmxlW0hBU0hOQU1FU0laRV07CitzdHJ1Y3QgaG5hbWVtZW0gdXBvcnR0YWJsZVtIQVNITkFNRVNJWkVdOworc3RydWN0IGhuYW1lbWVtIGVwcm90b3RhYmxlW0hBU0hOQU1FU0laRV07CitzdHJ1Y3QgaG5hbWVtZW0gZG5hZGRydGFibGVbSEFTSE5BTUVTSVpFXTsKK3N0cnVjdCBobmFtZW1lbSBpcHhzYXB0YWJsZVtIQVNITkFNRVNJWkVdOworCisjaWYgZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChXSU4zMikKKy8qCisgKiBmYWtlIGdldGhvc3RieWFkZHIgZm9yIFdpbjJrL1hQCisgKiBnZXRob3N0YnlhZGRyKCkgcmV0dXJucyBpbmNvcnJlY3QgdmFsdWUgd2hlbiBBRl9JTkVUNiBpcyBwYXNzZWQKKyAqIHRvIDNyZCBhcmd1bWVudC4KKyAqCisgKiBoX25hbWUgaW4gc3RydWN0IGhvc3RlbnQgaXMgb25seSB2YWxpZC4KKyAqLworc3RhdGljIHN0cnVjdCBob3N0ZW50ICoKK3dpbjMyX2dldGhvc3RieWFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50IGxlbiwgaW50IHR5cGUpCit7CisJc3RhdGljIHN0cnVjdCBob3N0ZW50IGhvc3Q7CisJc3RhdGljIGNoYXIgaG9zdGJ1ZltOSV9NQVhIT1NUXTsKKwljaGFyIGhuYW1lW05JX01BWEhPU1RdOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgYWRkcjY7CisKKwlob3N0LmhfbmFtZSA9IGhvc3RidWY7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIHR5cGUpOworCQlicmVhazsKKwljYXNlIEFGX0lORVQ2OgorCQltZW1zZXQoJmFkZHI2LCAwLCBzaXplb2YoYWRkcjYpKTsKKwkJYWRkcjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJbWVtY3B5KCZhZGRyNi5zaW42X2FkZHIsIGFkZHIsIGxlbik7CisJCWlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopJmFkZHI2LCBzaXplb2YoYWRkcjYpLAorCQkgICAgaG5hbWUsIHNpemVvZihobmFtZSksIE5VTEwsIDAsIDApKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXN0cmNweShob3N0LmhfbmFtZSwgaG5hbWUpOworCQkJcmV0dXJuICZob3N0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKyNkZWZpbmUgZ2V0aG9zdGJ5YWRkciB3aW4zMl9nZXRob3N0YnlhZGRyCisjZW5kaWYgLyogSU5FVDYgJiBXSU4zMiAqLworCisjaWZkZWYgSU5FVDYKK3N0cnVjdCBoNm5hbWVtZW0geworCXN0cnVjdCBpbjZfYWRkciBhZGRyOworCWNoYXIgKm5hbWU7CisJc3RydWN0IGg2bmFtZW1lbSAqbnh0OworfTsKKworc3RydWN0IGg2bmFtZW1lbSBoNm5hbWV0YWJsZVtIQVNITkFNRVNJWkVdOworI2VuZGlmIC8qIElORVQ2ICovCisKK3N0cnVjdCBlbmFtZW1lbSB7CisJdV9zaG9ydCBlX2FkZHIwOworCXVfc2hvcnQgZV9hZGRyMTsKKwl1X3Nob3J0IGVfYWRkcjI7CisJY29uc3QgY2hhciAqZV9uYW1lOworCXVfY2hhciAqZV9uc2FwOwkJCS8qIHVzZWQgb25seSBmb3IgbnNhcHRhYmxlW10gKi8KKyNkZWZpbmUgZV9icyBlX25zYXAJCQkvKiBmb3IgYnl0ZXN0cmluZ3RhYmxlICovCisJc3RydWN0IGVuYW1lbWVtICplX254dDsKK307CisKK3N0cnVjdCBlbmFtZW1lbSBlbmFtZXRhYmxlW0hBU0hOQU1FU0laRV07CitzdHJ1Y3QgZW5hbWVtZW0gbnNhcHRhYmxlW0hBU0hOQU1FU0laRV07CitzdHJ1Y3QgZW5hbWVtZW0gYnl0ZXN0cmluZ3RhYmxlW0hBU0hOQU1FU0laRV07CisKK3N0cnVjdCBwcm90b2lkbWVtIHsKKwl1X2ludDMyX3QgcF9vdWk7CisJdV9zaG9ydCBwX3Byb3RvOworCWNvbnN0IGNoYXIgKnBfbmFtZTsKKwlzdHJ1Y3QgcHJvdG9pZG1lbSAqcF9ueHQ7Cit9OworCitzdHJ1Y3QgcHJvdG9pZG1lbSBwcm90b2lkdGFibGVbSEFTSE5BTUVTSVpFXTsKKworLyoKKyAqIEEgZmFzdGVyIHJlcGxhY2VtZW50IGZvciBpbmV0X250b2EoKS4KKyAqLworY29uc3QgY2hhciAqCitpbnRvYSh1X2ludDMyX3QgYWRkcikKK3sKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlyZWdpc3RlciB1X2ludCBieXRlOworCXJlZ2lzdGVyIGludCBuOworCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2YoIi54eHgueHh4Lnh4eC54eHgiKV07CisKKwlOVE9ITChhZGRyKTsKKwljcCA9IGJ1ZiArIHNpemVvZihidWYpOworCSotLWNwID0gJ1wwJzsKKworCW4gPSA0OworCWRvIHsKKwkJYnl0ZSA9IGFkZHIgJiAweGZmOworCQkqLS1jcCA9IGJ5dGUgJSAxMCArICcwJzsKKwkJYnl0ZSAvPSAxMDsKKwkJaWYgKGJ5dGUgPiAwKSB7CisJCQkqLS1jcCA9IGJ5dGUgJSAxMCArICcwJzsKKwkJCWJ5dGUgLz0gMTA7CisJCQlpZiAoYnl0ZSA+IDApCisJCQkJKi0tY3AgPSBieXRlICsgJzAnOworCQl9CisJCSotLWNwID0gJy4nOworCQlhZGRyID4+PSA4OworCX0gd2hpbGUgKC0tbiA+IDApOworCisJcmV0dXJuIGNwICsgMTsKK30KKworc3RhdGljIHVfaW50MzJfdCBmX25ldG1hc2s7CitzdGF0aWMgdV9pbnQzMl90IGZfbG9jYWxuZXQ7CisKKy8qCisgKiBSZXR1cm4gYSBuYW1lIGZvciB0aGUgSVAgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IGFwLiAgVGhpcyBhZGRyZXNzCisgKiBpcyBhc3N1bWVkIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqCisgKiBOT1RFOiBhcCBpcyAqTk9UKiBuZWNlc3NhcmlseSBwYXJ0IG9mIHRoZSBwYWNrZXQgZGF0YSAobm90IGV2ZW4gaWYKKyAqIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggdGhlICJpcGFkZHJfc3RyaW5nKCkiIG1hY3JvKSwgc28geW91CisgKiAqQ0FOTk9UKiB1c2UgdGhlIFRDSEVDS3syfS9UVEVTVHsyfSBtYWNyb3Mgb24gaXQuICBGdXJ0aGVybW9yZSwKKyAqIGV2ZW4gaW4gY2FzZXMgd2hlcmUgaXQgKmlzKiBwYXJ0IG9mIHRoZSBwYWNrZXQgZGF0YSwgdGhlIGNhbGxlcgorICogd291bGQgc3RpbGwgaGF2ZSB0byBjaGVjayBmb3IgYSBudWxsIHJldHVybiB2YWx1ZSwgZXZlbiBpZiBpdCdzCisgKiBqdXN0IHByaW50aW5nIHRoZSByZXR1cm4gdmFsdWUgd2l0aCAiJXMiIC0gbm90IGFsbCB2ZXJzaW9ucyBvZgorICogcHJpbnRmIHByaW50ICIobnVsbCkiIHdpdGggIiVzIiBhbmQgYSBudWxsIHBvaW50ZXIsIHNvbWUgb2YgdGhlbQorICogZG9uJ3QgY2hlY2sgZm9yIGEgbnVsbCBwb2ludGVyIGFuZCBjcmFzaCBpbiB0aGF0IGNhc2UuCisgKgorICogVGhlIGNhbGxlcnMgb2YgdGhpcyByb3V0aW5lIHNob3VsZCwgYmVmb3JlIGhhbmRpbmcgdGhpcyByb3V0aW5lCisgKiBhIHBvaW50ZXIgdG8gcGFja2V0IGRhdGEsIGJlIHN1cmUgdGhhdCB0aGUgZGF0YSBpcyBwcmVzZW50IGluCisgKiB0aGUgcGFja2V0IGJ1ZmZlci4gIFRoZXkgc2hvdWxkIHByb2JhYmx5IGRvIHRob3NlIGNoZWNrcyBhbnl3YXksCisgKiBhcyBvdGhlciBkYXRhIGF0IHRoYXQgbGF5ZXIgbWlnaHQgbm90IGJlIElQIGFkZHJlc3NlcywgYW5kIGl0CisgKiBhbHNvIG5lZWRzIHRvIGNoZWNrIHdoZXRoZXIgdGhleSdyZSBwcmVzZW50IGluIHRoZSBwYWNrZXQgYnVmZmVyLgorICovCitjb25zdCBjaGFyICoKK2dldG5hbWUoY29uc3QgdV9jaGFyICphcCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaG9zdGVudCAqaHA7CisJdV9pbnQzMl90IGFkZHI7CisJc3RhdGljIHN0cnVjdCBobmFtZW1lbSAqcDsJCS8qIHN0YXRpYyBmb3IgbG9uZ2ptcCgpICovCisKKwltZW1jcHkoJmFkZHIsIGFwLCBzaXplb2YoYWRkcikpOworCXAgPSAmaG5hbWV0YWJsZVthZGRyICYgKEhBU0hOQU1FU0laRS0xKV07CisJZm9yICg7IHAtPm54dDsgcCA9IHAtPm54dCkgeworCQlpZiAocC0+YWRkciA9PSBhZGRyKQorCQkJcmV0dXJuIChwLT5uYW1lKTsKKwl9CisJcC0+YWRkciA9IGFkZHI7CisJcC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKKworCS8qCisJICogUHJpbnQgbmFtZXMgdW5sZXNzOgorCSAqCSgxKSAtbiB3YXMgZ2l2ZW4uCisJICogICAgICAoMikgQWRkcmVzcyBpcyBmb3JlaWduIGFuZCAtZiB3YXMgZ2l2ZW4uIChJZiAtZiB3YXMgbm90CisJICoJICAgIGdpdmVuLCBmX25ldG1hc2sgYW5kIGZfbG9jYWxuZXQgYXJlIDAgYW5kIHRoZSB0ZXN0CisJICoJICAgIGV2YWx1YXRlcyB0byB0cnVlKQorCSAqLworCWlmICghbmZsYWcgJiYKKwkgICAgKGFkZHIgJiBmX25ldG1hc2spID09IGZfbG9jYWxuZXQpIHsKKwkJaHAgPSBnZXRob3N0YnlhZGRyKChjaGFyICopJmFkZHIsIDQsIEFGX0lORVQpOworCQlpZiAoaHApIHsKKwkJCWNoYXIgKmRvdHA7CisKKwkJCXAtPm5hbWUgPSBzdHJkdXAoaHAtPmhfbmFtZSk7CisJCQlpZiAoTmZsYWcpIHsKKwkJCQkvKiBSZW1vdmUgZG9tYWluIHF1YWxpZmljYXRpb25zICovCisJCQkJZG90cCA9IHN0cmNocihwLT5uYW1lLCAnLicpOworCQkJCWlmIChkb3RwKQorCQkJCQkqZG90cCA9ICdcMCc7CisJCQl9CisJCQlyZXR1cm4gKHAtPm5hbWUpOworCQl9CisJfQorCXAtPm5hbWUgPSBzdHJkdXAoaW50b2EoYWRkcikpOworCXJldHVybiAocC0+bmFtZSk7Cit9CisKKyNpZmRlZiBJTkVUNgorLyoKKyAqIFJldHVybiBhIG5hbWUgZm9yIHRoZSBJUDYgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IGFwLiAgVGhpcyBhZGRyZXNzCisgKiBpcyBhc3N1bWVkIHRvIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworY29uc3QgY2hhciAqCitnZXRuYW1lNihjb25zdCB1X2NoYXIgKmFwKQoreworCXJlZ2lzdGVyIHN0cnVjdCBob3N0ZW50ICpocDsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwlzdGF0aWMgc3RydWN0IGg2bmFtZW1lbSAqcDsJCS8qIHN0YXRpYyBmb3IgbG9uZ2ptcCgpICovCisJcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7CisJY2hhciBudG9wX2J1ZltJTkVUNl9BRERSU1RSTEVOXTsKKworCW1lbWNweSgmYWRkciwgYXAsIHNpemVvZihhZGRyKSk7CisJcCA9ICZoNm5hbWV0YWJsZVsqKHVfaW50MTZfdCAqKSZhZGRyLnM2X2FkZHJbMTRdICYgKEhBU0hOQU1FU0laRS0xKV07CisJZm9yICg7IHAtPm54dDsgcCA9IHAtPm54dCkgeworCQlpZiAobWVtY21wKCZwLT5hZGRyLCAmYWRkciwgc2l6ZW9mKGFkZHIpKSA9PSAwKQorCQkJcmV0dXJuIChwLT5uYW1lKTsKKwl9CisJcC0+YWRkciA9IGFkZHI7CisJcC0+bnh0ID0gbmV3aDZuYW1lbWVtKCk7CisKKwkvKgorCSAqIERvIG5vdCBwcmludCBuYW1lcyBpZiAtbiB3YXMgZ2l2ZW4uCisJICovCisJaWYgKCFuZmxhZykgeworCQlocCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBBRl9JTkVUNik7CisJCWlmIChocCkgeworCQkJY2hhciAqZG90cDsKKworCQkJcC0+bmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKKwkJCWlmIChOZmxhZykgeworCQkJCS8qIFJlbW92ZSBkb21haW4gcXVhbGlmaWNhdGlvbnMgKi8KKwkJCQlkb3RwID0gc3RyY2hyKHAtPm5hbWUsICcuJyk7CisJCQkJaWYgKGRvdHApCisJCQkJCSpkb3RwID0gJ1wwJzsKKwkJCX0KKwkJCXJldHVybiAocC0+bmFtZSk7CisJCX0KKwl9CisJY3AgPSBpbmV0X250b3AoQUZfSU5FVDYsICZhZGRyLCBudG9wX2J1Ziwgc2l6ZW9mKG50b3BfYnVmKSk7CisJcC0+bmFtZSA9IHN0cmR1cChjcCk7CisJcmV0dXJuIChwLT5uYW1lKTsKK30KKyNlbmRpZiAvKiBJTkVUNiAqLworCitzdGF0aWMgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKworCisvKiBGaW5kIHRoZSBoYXNoIG5vZGUgdGhhdCBjb3JyZXNwb25kcyB0aGUgZXRoZXIgYWRkcmVzcyAnZXAnICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGVuYW1lbWVtICoKK2xvb2t1cF9lbWVtKGNvbnN0IHVfY2hhciAqZXApCit7CisJcmVnaXN0ZXIgdV9pbnQgaSwgaiwgazsKKwlzdHJ1Y3QgZW5hbWVtZW0gKnRwOworCisJayA9IChlcFswXSA8PCA4KSB8IGVwWzFdOworCWogPSAoZXBbMl0gPDwgOCkgfCBlcFszXTsKKwlpID0gKGVwWzRdIDw8IDgpIHwgZXBbNV07CisKKwl0cCA9ICZlbmFtZXRhYmxlWyhpIF4gaikgJiAoSEFTSE5BTUVTSVpFLTEpXTsKKwl3aGlsZSAodHAtPmVfbnh0KQorCQlpZiAodHAtPmVfYWRkcjAgPT0gaSAmJgorCQkgICAgdHAtPmVfYWRkcjEgPT0gaiAmJgorCQkgICAgdHAtPmVfYWRkcjIgPT0gaykKKwkJCXJldHVybiB0cDsKKwkJZWxzZQorCQkJdHAgPSB0cC0+ZV9ueHQ7CisJdHAtPmVfYWRkcjAgPSBpOworCXRwLT5lX2FkZHIxID0gajsKKwl0cC0+ZV9hZGRyMiA9IGs7CisJdHAtPmVfbnh0ID0gKHN0cnVjdCBlbmFtZW1lbSAqKWNhbGxvYygxLCBzaXplb2YoKnRwKSk7CisJaWYgKHRwLT5lX254dCA9PSBOVUxMKQorCQllcnJvcigibG9va3VwX2VtZW06IGNhbGxvYyIpOworCisJcmV0dXJuIHRwOworfQorCisvKgorICogRmluZCB0aGUgaGFzaCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGJ5dGVzdHJpbmcgJ2JzJworICogd2l0aCBsZW5ndGggJ25sZW4nCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZW5hbWVtZW0gKgorbG9va3VwX2J5dGVzdHJpbmcocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicywgY29uc3QgdW5zaWduZWQgaW50IG5sZW4pCit7CisJc3RydWN0IGVuYW1lbWVtICp0cDsKKwlyZWdpc3RlciB1X2ludCBpLCBqLCBrOworCisJaWYgKG5sZW4gPj0gNikgeworCQlrID0gKGJzWzBdIDw8IDgpIHwgYnNbMV07CisJCWogPSAoYnNbMl0gPDwgOCkgfCBic1szXTsKKwkJaSA9IChic1s0XSA8PCA4KSB8IGJzWzVdOworCX0gZWxzZSBpZiAobmxlbiA+PSA0KSB7CisJCWsgPSAoYnNbMF0gPDwgOCkgfCBic1sxXTsKKwkJaiA9IChic1syXSA8PCA4KSB8IGJzWzNdOworCQlpID0gMDsKKwl9IGVsc2UKKwkJaSA9IGogPSBrID0gMDsKKworCXRwID0gJmJ5dGVzdHJpbmd0YWJsZVsoaSBeIGopICYgKEhBU0hOQU1FU0laRS0xKV07CisJd2hpbGUgKHRwLT5lX254dCkKKwkJaWYgKHRwLT5lX2FkZHIwID09IGkgJiYKKwkJICAgIHRwLT5lX2FkZHIxID09IGogJiYKKwkJICAgIHRwLT5lX2FkZHIyID09IGsgJiYKKwkJICAgIG1lbWNtcCgoY29uc3QgY2hhciAqKWJzLCAoY29uc3QgY2hhciAqKSh0cC0+ZV9icyksIG5sZW4pID09IDApCisJCQlyZXR1cm4gdHA7CisJCWVsc2UKKwkJCXRwID0gdHAtPmVfbnh0OworCisJdHAtPmVfYWRkcjAgPSBpOworCXRwLT5lX2FkZHIxID0gajsKKwl0cC0+ZV9hZGRyMiA9IGs7CisKKwl0cC0+ZV9icyA9ICh1X2NoYXIgKikgY2FsbG9jKDEsIG5sZW4gKyAxKTsKKwltZW1jcHkodHAtPmVfYnMsIGJzLCBubGVuKTsKKwl0cC0+ZV9ueHQgPSAoc3RydWN0IGVuYW1lbWVtICopY2FsbG9jKDEsIHNpemVvZigqdHApKTsKKwlpZiAodHAtPmVfbnh0ID09IE5VTEwpCisJCWVycm9yKCJsb29rdXBfYnl0ZXN0cmluZzogY2FsbG9jIik7CisKKwlyZXR1cm4gdHA7Cit9CisKKy8qIEZpbmQgdGhlIGhhc2ggbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRoZSBOU0FQICduc2FwJyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlbmFtZW1lbSAqCitsb29rdXBfbnNhcChyZWdpc3RlciBjb25zdCB1X2NoYXIgKm5zYXApCit7CisJcmVnaXN0ZXIgdV9pbnQgaSwgaiwgazsKKwl1bnNpZ25lZCBpbnQgbmxlbiA9ICpuc2FwOworCXN0cnVjdCBlbmFtZW1lbSAqdHA7CisJY29uc3QgdV9jaGFyICplbnNhcCA9IG5zYXAgKyBubGVuIC0gNjsKKworCWlmIChubGVuID4gNikgeworCQlrID0gKGVuc2FwWzBdIDw8IDgpIHwgZW5zYXBbMV07CisJCWogPSAoZW5zYXBbMl0gPDwgOCkgfCBlbnNhcFszXTsKKwkJaSA9IChlbnNhcFs0XSA8PCA4KSB8IGVuc2FwWzVdOworCX0KKwllbHNlCisJCWkgPSBqID0gayA9IDA7CisKKwl0cCA9ICZuc2FwdGFibGVbKGkgXiBqKSAmIChIQVNITkFNRVNJWkUtMSldOworCXdoaWxlICh0cC0+ZV9ueHQpCisJCWlmICh0cC0+ZV9hZGRyMCA9PSBpICYmCisJCSAgICB0cC0+ZV9hZGRyMSA9PSBqICYmCisJCSAgICB0cC0+ZV9hZGRyMiA9PSBrICYmCisJCSAgICB0cC0+ZV9uc2FwWzBdID09IG5sZW4gJiYKKwkJICAgIG1lbWNtcCgoY29uc3QgY2hhciAqKSYobnNhcFsxXSksCisJCQkoY2hhciAqKSYodHAtPmVfbnNhcFsxXSksIG5sZW4pID09IDApCisJCQlyZXR1cm4gdHA7CisJCWVsc2UKKwkJCXRwID0gdHAtPmVfbnh0OworCXRwLT5lX2FkZHIwID0gaTsKKwl0cC0+ZV9hZGRyMSA9IGo7CisJdHAtPmVfYWRkcjIgPSBrOworCXRwLT5lX25zYXAgPSAodV9jaGFyICopbWFsbG9jKG5sZW4gKyAxKTsKKwlpZiAodHAtPmVfbnNhcCA9PSBOVUxMKQorCQllcnJvcigibG9va3VwX25zYXA6IG1hbGxvYyIpOworCW1lbWNweSgoY2hhciAqKXRwLT5lX25zYXAsIChjb25zdCBjaGFyICopbnNhcCwgbmxlbiArIDEpOworCXRwLT5lX254dCA9IChzdHJ1Y3QgZW5hbWVtZW0gKiljYWxsb2MoMSwgc2l6ZW9mKCp0cCkpOworCWlmICh0cC0+ZV9ueHQgPT0gTlVMTCkKKwkJZXJyb3IoImxvb2t1cF9uc2FwOiBjYWxsb2MiKTsKKworCXJldHVybiB0cDsKK30KKworLyogRmluZCB0aGUgaGFzaCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdGhlIHByb3RvaWQgJ3BpJy4gKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHJvdG9pZG1lbSAqCitsb29rdXBfcHJvdG9pZChjb25zdCB1X2NoYXIgKnBpKQoreworCXJlZ2lzdGVyIHVfaW50IGksIGo7CisJc3RydWN0IHByb3RvaWRtZW0gKnRwOworCisJLyogNSBvY3RldHMgd29uJ3QgYmUgYWxpZ25lZCAqLworCWkgPSAoKChwaVswXSA8PCA4KSArIHBpWzFdKSA8PCA4KSArIHBpWzJdOworCWogPSAgIChwaVszXSA8PCA4KSArIHBpWzRdOworCS8qIFhYWCBzaG91bGQgYmUgZW5kaWFuLWluc2Vuc2l0aXZlLCBidXQgZG8gYmlnLWVuZGlhbiB0ZXN0aW5nICBYWFggKi8KKworCXRwID0gJnByb3RvaWR0YWJsZVsoaSBeIGopICYgKEhBU0hOQU1FU0laRS0xKV07CisJd2hpbGUgKHRwLT5wX254dCkKKwkJaWYgKHRwLT5wX291aSA9PSBpICYmIHRwLT5wX3Byb3RvID09IGopCisJCQlyZXR1cm4gdHA7CisJCWVsc2UKKwkJCXRwID0gdHAtPnBfbnh0OworCXRwLT5wX291aSA9IGk7CisJdHAtPnBfcHJvdG8gPSBqOworCXRwLT5wX254dCA9IChzdHJ1Y3QgcHJvdG9pZG1lbSAqKWNhbGxvYygxLCBzaXplb2YoKnRwKSk7CisJaWYgKHRwLT5wX254dCA9PSBOVUxMKQorCQllcnJvcigibG9va3VwX3Byb3RvaWQ6IGNhbGxvYyIpOworCisJcmV0dXJuIHRwOworfQorCitjb25zdCBjaGFyICoKK2V0aGVyYWRkcl9zdHJpbmcocmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlyZWdpc3RlciBzdHJ1Y3QgZW5hbWVtZW0gKnRwOworCWludCBvdWk7CisJY2hhciBidWZbQlVGU0laRV07CisKKwl0cCA9IGxvb2t1cF9lbWVtKGVwKTsKKwlpZiAodHAtPmVfbmFtZSkKKwkJcmV0dXJuICh0cC0+ZV9uYW1lKTsKKyNpZmRlZiBVU0VfRVRIRVJfTlRPSE9TVAorCWlmICghbmZsYWcpIHsKKwkJY2hhciBidWYyW0JVRlNJWkVdOworCisJCS8qCisJCSAqIFdlIGRvbid0IGNhc3QgaXQgdG8gImNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICoiCisJCSAqIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIGZhaWwgdG8gZGVjbGFyZSB0aGUgc2Vjb25kCisJCSAqIGFyZ3VtZW50IGFzIGEgImNvbnN0IiBwb2ludGVyLCBldmVuIHRob3VnaCB0aGV5CisJCSAqIGRvbid0IG1vZGlmeSB3aGF0IGl0IHBvaW50cyB0by4KKwkJICovCisJCWlmIChldGhlcl9udG9ob3N0KGJ1ZjIsIChzdHJ1Y3QgZXRoZXJfYWRkciAqKWVwKSA9PSAwKSB7CisJCQl0cC0+ZV9uYW1lID0gc3RyZHVwKGJ1ZjIpOworCQkJcmV0dXJuICh0cC0+ZV9uYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWNwID0gYnVmOworCW91aSA9IEVYVFJBQ1RfMjRCSVRTKGVwKTsKKwkqY3ArKyA9IGhleFsqZXAgPj4gNCBdOworCSpjcCsrID0gaGV4WyplcCsrICYgMHhmXTsKKwlmb3IgKGkgPSA1OyAtLWkgPj0gMDspIHsKKwkJKmNwKysgPSAnOic7CisJCSpjcCsrID0gaGV4WyplcCA+PiA0IF07CisJCSpjcCsrID0gaGV4WyplcCsrICYgMHhmXTsKKwl9CisKKwlpZiAoIW5mbGFnKSB7CisJCXNucHJpbnRmKGNwLCBCVUZTSVpFIC0gKDIgKyA1KjMpLCAiIChvdWkgJXMpIiwKKwkJICAgIHRvazJzdHIob3VpX3ZhbHVlcywgIlVua25vd24iLCBvdWkpKTsKKwl9IGVsc2UKKwkJKmNwID0gJ1wwJzsKKwl0cC0+ZV9uYW1lID0gc3RyZHVwKGJ1Zik7CisJcmV0dXJuICh0cC0+ZV9uYW1lKTsKK30KKworY29uc3QgY2hhciAqCitsaW5rYWRkcl9zdHJpbmcoY29uc3QgdV9jaGFyICplcCwgY29uc3QgdW5zaWduZWQgaW50IGxlbikKK3sKKwlyZWdpc3RlciB1X2ludCBpOworCXJlZ2lzdGVyIGNoYXIgKmNwOworCXJlZ2lzdGVyIHN0cnVjdCBlbmFtZW1lbSAqdHA7CisKKwlpZiAobGVuID09IEVUSEVSX0FERFJfTEVOKQkvKiBYWFggbm90IHRvdGFsbHkgY29ycmVjdC4uLiAqLworCQlyZXR1cm4gZXRoZXJhZGRyX3N0cmluZyhlcCk7CisKKwl0cCA9IGxvb2t1cF9ieXRlc3RyaW5nKGVwLCBsZW4pOworCWlmICh0cC0+ZV9uYW1lKQorCQlyZXR1cm4gKHRwLT5lX25hbWUpOworCisJdHAtPmVfbmFtZSA9IGNwID0gKGNoYXIgKiltYWxsb2MobGVuKjMpOworCWlmICh0cC0+ZV9uYW1lID09IE5VTEwpCisJCWVycm9yKCJsaW5rYWRkcl9zdHJpbmc6IG1hbGxvYyIpOworCSpjcCsrID0gaGV4WyplcCA+PiA0XTsKKwkqY3ArKyA9IGhleFsqZXArKyAmIDB4Zl07CisJZm9yIChpID0gbGVuLTE7IGkgPiAwIDsgLS1pKSB7CisJCSpjcCsrID0gJzonOworCQkqY3ArKyA9IGhleFsqZXAgPj4gNF07CisJCSpjcCsrID0gaGV4WyplcCsrICYgMHhmXTsKKwl9CisJKmNwID0gJ1wwJzsKKwlyZXR1cm4gKHRwLT5lX25hbWUpOworfQorCitjb25zdCBjaGFyICoKK2V0aGVycHJvdG9fc3RyaW5nKHVfc2hvcnQgcG9ydCkKK3sKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRwOworCXJlZ2lzdGVyIHVfaW50MzJfdCBpID0gcG9ydDsKKwljaGFyIGJ1ZltzaXplb2YoIjAwMDAiKV07CisKKwlmb3IgKHRwID0gJmVwcm90b3RhYmxlW2kgJiAoSEFTSE5BTUVTSVpFLTEpXTsgdHAtPm54dDsgdHAgPSB0cC0+bnh0KQorCQlpZiAodHAtPmFkZHIgPT0gaSkKKwkJCXJldHVybiAodHAtPm5hbWUpOworCisJdHAtPmFkZHIgPSBpOworCXRwLT5ueHQgPSBuZXdobmFtZW1lbSgpOworCisJY3AgPSBidWY7CisJTlRPSFMocG9ydCk7CisJKmNwKysgPSBoZXhbcG9ydCA+PiAxMiAmIDB4Zl07CisJKmNwKysgPSBoZXhbcG9ydCA+PiA4ICYgMHhmXTsKKwkqY3ArKyA9IGhleFtwb3J0ID4+IDQgJiAweGZdOworCSpjcCsrID0gaGV4W3BvcnQgJiAweGZdOworCSpjcCsrID0gJ1wwJzsKKwl0cC0+bmFtZSA9IHN0cmR1cChidWYpOworCXJldHVybiAodHAtPm5hbWUpOworfQorCitjb25zdCBjaGFyICoKK3Byb3RvaWRfc3RyaW5nKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcGkpCit7CisJcmVnaXN0ZXIgdV9pbnQgaSwgajsKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlyZWdpc3RlciBzdHJ1Y3QgcHJvdG9pZG1lbSAqdHA7CisJY2hhciBidWZbc2l6ZW9mKCIwMDowMDowMDowMDowMCIpXTsKKworCXRwID0gbG9va3VwX3Byb3RvaWQocGkpOworCWlmICh0cC0+cF9uYW1lKQorCQlyZXR1cm4gdHAtPnBfbmFtZTsKKworCWNwID0gYnVmOworCWlmICgoaiA9ICpwaSA+PiA0KSAhPSAwKQorCQkqY3ArKyA9IGhleFtqXTsKKwkqY3ArKyA9IGhleFsqcGkrKyAmIDB4Zl07CisJZm9yIChpID0gNDsgKGludCktLWkgPj0gMDspIHsKKwkJKmNwKysgPSAnOic7CisJCWlmICgoaiA9ICpwaSA+PiA0KSAhPSAwKQorCQkJKmNwKysgPSBoZXhbal07CisJCSpjcCsrID0gaGV4WypwaSsrICYgMHhmXTsKKwl9CisJKmNwID0gJ1wwJzsKKwl0cC0+cF9uYW1lID0gc3RyZHVwKGJ1Zik7CisJcmV0dXJuICh0cC0+cF9uYW1lKTsKK30KKworI2RlZmluZSBJU09OU0FQX01BWF9MRU5HVEggMjAKK2NvbnN0IGNoYXIgKgoraXNvbnNhcF9zdHJpbmcoY29uc3QgdV9jaGFyICpuc2FwLCByZWdpc3RlciB1X2ludCBuc2FwX2xlbmd0aCkKK3sKKwlyZWdpc3RlciB1X2ludCBuc2FwX2lkeDsKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlyZWdpc3RlciBzdHJ1Y3QgZW5hbWVtZW0gKnRwOworCisJaWYgKG5zYXBfbGVuZ3RoIDwgMSB8fCBuc2FwX2xlbmd0aCA+IElTT05TQVBfTUFYX0xFTkdUSCkKKwkJcmV0dXJuICgiaXNvbnNhcF9zdHJpbmc6IGlsbGVnYWwgbGVuZ3RoIik7CisKKwl0cCA9IGxvb2t1cF9uc2FwKG5zYXApOworCWlmICh0cC0+ZV9uYW1lKQorCQlyZXR1cm4gdHAtPmVfbmFtZTsKKworCXRwLT5lX25hbWUgPSBjcCA9IChjaGFyICopbWFsbG9jKHNpemVvZigieHgueHh4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHgiKSk7CisJaWYgKGNwID09IE5VTEwpCisJCWVycm9yKCJpc29uc2FwX3N0cmluZzogbWFsbG9jIik7CisKKwlmb3IgKG5zYXBfaWR4ID0gMDsgbnNhcF9pZHggPCBuc2FwX2xlbmd0aDsgbnNhcF9pZHgrKykgeworCQkqY3ArKyA9IGhleFsqbnNhcCA+PiA0XTsKKwkJKmNwKysgPSBoZXhbKm5zYXArKyAmIDB4Zl07CisJCWlmICgoKG5zYXBfaWR4ICYgMSkgPT0gMCkgJiYKKwkJICAgICAobnNhcF9pZHggKyAxIDwgbnNhcF9sZW5ndGgpKSB7CisJCSAgICAgCSpjcCsrID0gJy4nOworCQl9CisJfQorCSpjcCA9ICdcMCc7CisJcmV0dXJuICh0cC0+ZV9uYW1lKTsKK30KKworY29uc3QgY2hhciAqCit0Y3Bwb3J0X3N0cmluZyh1X3Nob3J0IHBvcnQpCit7CisJcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICp0cDsKKwlyZWdpc3RlciB1X2ludDMyX3QgaSA9IHBvcnQ7CisJY2hhciBidWZbc2l6ZW9mKCIwMDAwMCIpXTsKKworCWZvciAodHAgPSAmdHBvcnR0YWJsZVtpICYgKEhBU0hOQU1FU0laRS0xKV07IHRwLT5ueHQ7IHRwID0gdHAtPm54dCkKKwkJaWYgKHRwLT5hZGRyID09IGkpCisJCQlyZXR1cm4gKHRwLT5uYW1lKTsKKworCXRwLT5hZGRyID0gaTsKKwl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKKworCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldSIsIGkpOworCXRwLT5uYW1lID0gc3RyZHVwKGJ1Zik7CisJcmV0dXJuICh0cC0+bmFtZSk7Cit9CisKK2NvbnN0IGNoYXIgKgordWRwcG9ydF9zdHJpbmcocmVnaXN0ZXIgdV9zaG9ydCBwb3J0KQoreworCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdHA7CisJcmVnaXN0ZXIgdV9pbnQzMl90IGkgPSBwb3J0OworCWNoYXIgYnVmW3NpemVvZigiMDAwMDAiKV07CisKKwlmb3IgKHRwID0gJnVwb3J0dGFibGVbaSAmIChIQVNITkFNRVNJWkUtMSldOyB0cC0+bnh0OyB0cCA9IHRwLT5ueHQpCisJCWlmICh0cC0+YWRkciA9PSBpKQorCQkJcmV0dXJuICh0cC0+bmFtZSk7CisKKwl0cC0+YWRkciA9IGk7CisJdHAtPm54dCA9IG5ld2huYW1lbWVtKCk7CisKKwkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCBpKTsKKwl0cC0+bmFtZSA9IHN0cmR1cChidWYpOworCXJldHVybiAodHAtPm5hbWUpOworfQorCitjb25zdCBjaGFyICoKK2lweHNhcF9zdHJpbmcodV9zaG9ydCBwb3J0KQoreworCXJlZ2lzdGVyIGNoYXIgKmNwOworCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdHA7CisJcmVnaXN0ZXIgdV9pbnQzMl90IGkgPSBwb3J0OworCWNoYXIgYnVmW3NpemVvZigiMDAwMCIpXTsKKworCWZvciAodHAgPSAmaXB4c2FwdGFibGVbaSAmIChIQVNITkFNRVNJWkUtMSldOyB0cC0+bnh0OyB0cCA9IHRwLT5ueHQpCisJCWlmICh0cC0+YWRkciA9PSBpKQorCQkJcmV0dXJuICh0cC0+bmFtZSk7CisKKwl0cC0+YWRkciA9IGk7CisJdHAtPm54dCA9IG5ld2huYW1lbWVtKCk7CisKKwljcCA9IGJ1ZjsKKwlOVE9IUyhwb3J0KTsKKwkqY3ArKyA9IGhleFtwb3J0ID4+IDEyICYgMHhmXTsKKwkqY3ArKyA9IGhleFtwb3J0ID4+IDggJiAweGZdOworCSpjcCsrID0gaGV4W3BvcnQgPj4gNCAmIDB4Zl07CisJKmNwKysgPSBoZXhbcG9ydCAmIDB4Zl07CisJKmNwKysgPSAnXDAnOworCXRwLT5uYW1lID0gc3RyZHVwKGJ1Zik7CisJcmV0dXJuICh0cC0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbml0X3NlcnZhcnJheSh2b2lkKQoreworCXN0cnVjdCBzZXJ2ZW50ICpzdjsKKwlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRhYmxlOworCXJlZ2lzdGVyIGludCBpOworCWNoYXIgYnVmW3NpemVvZigiMDAwMDAwMDAwMCIpXTsKKworCXdoaWxlICgoc3YgPSBnZXRzZXJ2ZW50KCkpICE9IE5VTEwpIHsKKwkJaW50IHBvcnQgPSBudG9ocyhzdi0+c19wb3J0KTsKKwkJaSA9IHBvcnQgJiAoSEFTSE5BTUVTSVpFLTEpOworCQlpZiAoc3RyY21wKHN2LT5zX3Byb3RvLCAidGNwIikgPT0gMCkKKwkJCXRhYmxlID0gJnRwb3J0dGFibGVbaV07CisJCWVsc2UgaWYgKHN0cmNtcChzdi0+c19wcm90bywgInVkcCIpID09IDApCisJCQl0YWJsZSA9ICZ1cG9ydHRhYmxlW2ldOworCQllbHNlCisJCQljb250aW51ZTsKKworCQl3aGlsZSAodGFibGUtPm5hbWUpCisJCQl0YWJsZSA9IHRhYmxlLT5ueHQ7CisJCWlmIChuZmxhZykgeworCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgcG9ydCk7CisJCQl0YWJsZS0+bmFtZSA9IHN0cmR1cChidWYpOworCQl9IGVsc2UKKwkJCXRhYmxlLT5uYW1lID0gc3RyZHVwKHN2LT5zX25hbWUpOworCQl0YWJsZS0+YWRkciA9IHBvcnQ7CisJCXRhYmxlLT5ueHQgPSBuZXdobmFtZW1lbSgpOworCX0KKwllbmRzZXJ2ZW50KCk7Cit9CisKKy8qIGluIGxpYnBjYXAuYSAobmFtZXRvYWRkci5jKSAqLworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKFVTRV9TVEFUSUNfTElCUENBUCkKK19fZGVjbHNwZWMoZGxsaW1wb3J0KQorI2Vsc2UKK2V4dGVybgorI2VuZGlmCitjb25zdCBzdHJ1Y3QgZXByb3RvIHsKKwljb25zdCBjaGFyICpzOworCXVfc2hvcnQgcDsKK30gZXByb3RvX2RiW107CisKK3N0YXRpYyB2b2lkCitpbml0X2Vwcm90b2FycmF5KHZvaWQpCit7CisJcmVnaXN0ZXIgaW50IGk7CisJcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICp0YWJsZTsKKworCWZvciAoaSA9IDA7IGVwcm90b19kYltpXS5zOyBpKyspIHsKKwkJaW50IGogPSBodG9ucyhlcHJvdG9fZGJbaV0ucCkgJiAoSEFTSE5BTUVTSVpFLTEpOworCQl0YWJsZSA9ICZlcHJvdG90YWJsZVtqXTsKKwkJd2hpbGUgKHRhYmxlLT5uYW1lKQorCQkJdGFibGUgPSB0YWJsZS0+bnh0OworCQl0YWJsZS0+bmFtZSA9IGVwcm90b19kYltpXS5zOworCQl0YWJsZS0+YWRkciA9IGh0b25zKGVwcm90b19kYltpXS5wKTsKKwkJdGFibGUtPm54dCA9IG5ld2huYW1lbWVtKCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHByb3RvaWRsaXN0IHsKKwljb25zdCB1X2NoYXIgcHJvdG9pZFs1XTsKKwljb25zdCBjaGFyICpuYW1lOworfSBwcm90b2lkbGlzdFtdID0geworCXt7IDB4MDAsIDB4MDAsIDB4MGMsIDB4MDEsIDB4MDcgfSwgIkNpc2NvTUxTIiB9LAorCXt7IDB4MDAsIDB4MDAsIDB4MGMsIDB4MjAsIDB4MDAgfSwgIkNpc2NvQ0RQIiB9LAorCXt7IDB4MDAsIDB4MDAsIDB4MGMsIDB4MjAsIDB4MDEgfSwgIkNpc2NvQ0dNUCIgfSwKKwl7eyAweDAwLCAweDAwLCAweDBjLCAweDIwLCAweDAzIH0sICJDaXNjb1ZUUCIgfSwKKwl7eyAweDAwLCAweGUwLCAweDJiLCAweDAwLCAweGJiIH0sICJFeHRyZW1lRURQIiB9LAorCXt7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwgTlVMTCB9Cit9OworCisvKgorICogU05BUCBwcm90byBJRHMgd2l0aCBvcmcgY29kZSAwOjA6MCBhcmUgYWN0dWFsbHkgZW5jYXBzdWxhdGVkIEV0aGVybmV0CisgKiB0eXBlcy4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfcHJvdG9pZGFycmF5KHZvaWQpCit7CisJcmVnaXN0ZXIgaW50IGk7CisJcmVnaXN0ZXIgc3RydWN0IHByb3RvaWRtZW0gKnRwOworCXN0cnVjdCBwcm90b2lkbGlzdCAqcGw7CisJdV9jaGFyIHByb3RvaWRbNV07CisKKwlwcm90b2lkWzBdID0gMDsKKwlwcm90b2lkWzFdID0gMDsKKwlwcm90b2lkWzJdID0gMDsKKwlmb3IgKGkgPSAwOyBlcHJvdG9fZGJbaV0uczsgaSsrKSB7CisJCXVfc2hvcnQgZXR5cGUgPSBodG9ucyhlcHJvdG9fZGJbaV0ucCk7CisKKwkJbWVtY3B5KChjaGFyICopJnByb3RvaWRbM10sIChjaGFyICopJmV0eXBlLCAyKTsKKwkJdHAgPSBsb29rdXBfcHJvdG9pZChwcm90b2lkKTsKKwkJdHAtPnBfbmFtZSA9IHN0cmR1cChlcHJvdG9fZGJbaV0ucyk7CisJfQorCS8qIEhhcmR3aXJlIHNvbWUgU05BUCBwcm90byBJRCBuYW1lcyAqLworCWZvciAocGwgPSBwcm90b2lkbGlzdDsgcGwtPm5hbWUgIT0gTlVMTDsgKytwbCkgeworCQl0cCA9IGxvb2t1cF9wcm90b2lkKHBsLT5wcm90b2lkKTsKKwkJLyogRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgbmFtZSAqLworCQlpZiAodHAtPnBfbmFtZSAhPSBOVUxMKQorCQkJY29udGludWU7CisKKwkJdHAtPnBfbmFtZSA9IHBsLT5uYW1lOworCX0KK30KKworc3RhdGljIHN0cnVjdCBldGhlcmxpc3QgeworCWNvbnN0IHVfY2hhciBhZGRyWzZdOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGV0aGVybGlzdFtdID0geworCXt7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfSwgIkJyb2FkY2FzdCIgfSwKKwl7eyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sIE5VTEwgfQorfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGV0aGVycyBoYXNoIHRhYmxlLiAgV2UgdGFrZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMKKyAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgc3lzdGVtIHByb3ZpZGVzIHRoZSBldGhlcnMgbmFtZQorICogc2VydmljZS4gIElmIGl0IGRvZXMsIHdlIGp1c3Qgd2lyZSBpbiBhIGZldyBuYW1lcyBhdCBzdGFydHVwLAorICogYW5kIGV0aGVyYWRkcl9zdHJpbmcoKSBmaWxscyBpbiB0aGUgdGFibGUgb24gZGVtYW5kLiAgSWYgaXQgZG9lc24ndCwKKyAqIHRoZW4gd2Ugc3VjayBpbiB0aGUgZW50aXJlIC9ldGMvZXRoZXJzIGZpbGUgYXQgc3RhcnR1cC4gIFRoZSBpZGVhCisgKiBpcyB0aGF0IHBhcnNpbmcgdGhlIGxvY2FsIGZpbGUgd2lsbCBiZSBmYXN0LCBidXQgc3Bpbm5pbmcgdGhyb3VnaAorICogYWxsIHRoZSBldGhlcnMgZW50cmllcyB2aWEgTklTICYgbmV4dF9ldGhlcmVudCBtaWdodCBiZSB2ZXJ5IHNsb3cuCisgKgorICogWFhYIHBjYXBfbmV4dF9ldGhlcmVudCBkb2Vzbid0IGJlbG9uZyBpbiB0aGUgcGNhcCBpbnRlcmZhY2UsIGJ1dAorICogc2luY2UgdGhlIHBjYXAgbW9kdWxlIGFscmVhZHkgZG9lcyBuYW1lLXRvLWFkZHJlc3MgdHJhbnNsYXRpb24sCisgKiBpdCdzIGFscmVhZHkgZG9lcyBtb3N0IG9mIHRoZSB3b3JrIGZvciB0aGUgZXRoZXJuZXQgYWRkcmVzcy10by1uYW1lCisgKiB0cmFuc2xhdGlvbiwgc28gd2UganVzdCBwY2FwX25leHRfZXRoZXJlbnQgYXMgYSBjb252ZW5pZW5jZS4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfZXRoZXJhcnJheSh2b2lkKQoreworCXJlZ2lzdGVyIHN0cnVjdCBldGhlcmxpc3QgKmVsOworCXJlZ2lzdGVyIHN0cnVjdCBlbmFtZW1lbSAqdHA7CisjaWZkZWYgVVNFX0VUSEVSX05UT0hPU1QKKwljaGFyIG5hbWVbMjU2XTsKKyNlbHNlCisJcmVnaXN0ZXIgc3RydWN0IHBjYXBfZXRoZXJlbnQgKmVwOworCXJlZ2lzdGVyIEZJTEUgKmZwOworCisJLyogU3VjayBpbiBlbnRpcmUgZXRoZXJzIGZpbGUgKi8KKwlmcCA9IGZvcGVuKFBDQVBfRVRIRVJTX0ZJTEUsICJyIik7CisJaWYgKGZwICE9IE5VTEwpIHsKKwkJd2hpbGUgKChlcCA9IHBjYXBfbmV4dF9ldGhlcmVudChmcCkpICE9IE5VTEwpIHsKKwkJCXRwID0gbG9va3VwX2VtZW0oZXAtPmFkZHIpOworCQkJdHAtPmVfbmFtZSA9IHN0cmR1cChlcC0+bmFtZSk7CisJCX0KKwkJKHZvaWQpZmNsb3NlKGZwKTsKKwl9CisjZW5kaWYKKworCS8qIEhhcmR3aXJlIHNvbWUgZXRoZXJuZXQgbmFtZXMgKi8KKwlmb3IgKGVsID0gZXRoZXJsaXN0OyBlbC0+bmFtZSAhPSBOVUxMOyArK2VsKSB7CisJCXRwID0gbG9va3VwX2VtZW0oZWwtPmFkZHIpOworCQkvKiBEb24ndCBvdmVycmlkZSBleGlzdGluZyBuYW1lICovCisJCWlmICh0cC0+ZV9uYW1lICE9IE5VTEwpCisJCQljb250aW51ZTsKKworI2lmZGVmIFVTRV9FVEhFUl9OVE9IT1NUCisJCS8qCisJCSAqIFVzZSBZUC9OSVMgdmVyc2lvbiBvZiBuYW1lIGlmIGF2YWlsYWJsZS4KKwkJICoKKwkJICogV2UgZG9uJ3QgY2FzdCBpdCB0byAiY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKiIKKwkJICogYmVjYXVzZSBzb21lIHN5c3RlbXMgZG9uJ3QgbW9kaWZ5IHRoZSBFdGhlcm5ldAorCQkgKiBhZGRyZXNzIGJ1dCBmYWlsIHRvIGRlY2xhcmUgdGhlIHNlY29uZCBhcmd1bWVudAorCQkgKiBhcyBhICJjb25zdCIgcG9pbnRlci4KKwkJICovCisJCWlmIChldGhlcl9udG9ob3N0KG5hbWUsIChzdHJ1Y3QgZXRoZXJfYWRkciAqKWVsLT5hZGRyKSA9PSAwKSB7CisJCQl0cC0+ZV9uYW1lID0gc3RyZHVwKG5hbWUpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQl0cC0+ZV9uYW1lID0gZWwtPm5hbWU7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRvayBpcHhzYXBfZGJbXSA9IHsKKwl7IDB4MDAwMCwgIlVua25vd24iIH0sCisJeyAweDAwMDEsICJVc2VyIiB9LAorCXsgMHgwMDAyLCAiVXNlciBHcm91cCIgfSwKKwl7IDB4MDAwMywgIlByaW50UXVldWUiIH0sCisJeyAweDAwMDQsICJGaWxlU2VydmVyIiB9LAorCXsgMHgwMDA1LCAiSm9iU2VydmVyIiB9LAorCXsgMHgwMDA2LCAiR2F0ZXdheSIgfSwKKwl7IDB4MDAwNywgIlByaW50U2VydmVyIiB9LAorCXsgMHgwMDA4LCAiQXJjaGl2ZVF1ZXVlIiB9LAorCXsgMHgwMDA5LCAiQXJjaGl2ZVNlcnZlciIgfSwKKwl7IDB4MDAwYSwgIkpvYlF1ZXVlIiB9LAorCXsgMHgwMDBiLCAiQWRtaW5pc3RyYXRpb24iIH0sCisJeyAweDAwMEYsICJOb3ZlbGwgVEktUlBDIiB9LAorCXsgMHgwMDE3LCAiRGlhZ25vc3RpY3MiIH0sCisJeyAweDAwMjAsICJOZXRCSU9TIiB9LAorCXsgMHgwMDIxLCAiTkFTIFNOQSBHYXRld2F5IiB9LAorCXsgMHgwMDIzLCAiTkFDUyBBc3luY0dhdGV3YXkiIH0sCisJeyAweDAwMjQsICJSZW1vdGVCcmlkZ2UvUm91dGluZ1NlcnZpY2UiIH0sCisJeyAweDAwMjYsICJCcmlkZ2VTZXJ2ZXIiIH0sCisJeyAweDAwMjcsICJUQ1AvSVAgR2F0ZXdheSIgfSwKKwl7IDB4MDAyOCwgIlBvaW50LXRvLXBvaW50IFguMjUgQnJpZGdlU2VydmVyIiB9LAorCXsgMHgwMDI5LCAiMzI3MCBHYXRld2F5IiB9LAorCXsgMHgwMDJhLCAiQ0hJIENvcnAiIH0sCisJeyAweDAwMmMsICJQQyBDaGFsa2JvYXJkIiB9LAorCXsgMHgwMDJkLCAiVGltZVN5bmNoU2VydmVyIiB9LAorCXsgMHgwMDJlLCAiQVJDc2VydmU1LjAvUGFsaW5kcm9tZUJhY2t1cCIgfSwKKwl7IDB4MDA0NSwgIkRJMzI3MCBHYXRld2F5IiB9LAorCXsgMHgwMDQ3LCAiQWR2ZXJ0aXNpbmdQcmludFNlcnZlciIgfSwKKwl7IDB4MDA0YSwgIk5ldEJsYXplck1vZGVtcyIgfSwKKwl7IDB4MDA0YiwgIkJ0cmlldmVWQVAiIH0sCisJeyAweDAwNGMsICJOZXR3YXJlU1FMIiB9LAorCXsgMHgwMDRkLCAiWHRyZWVOZXR3b3JrIiB9LAorCXsgMHgwMDUwLCAiQnRyaWV2ZVZBUDQuMTEiIH0sCisJeyAweDAwNTIsICJRdWlja0xpbmsiIH0sCisJeyAweDAwNTMsICJQcmludFF1ZXVlVXNlciIgfSwKKwl7IDB4MDA1OCwgIk11bHRpcG9pbnQgWC4yNSBSb3V0ZXIiIH0sCisJeyAweDAwNjAsICJTVExCL05MTSIgfSwKKwl7IDB4MDA2NCwgIkFSQ3NlcnZlIiB9LAorCXsgMHgwMDY2LCAiQVJDc2VydmUzLjAiIH0sCisJeyAweDAwNzIsICJXQU4gQ29weVV0aWxpdHkiIH0sCisJeyAweDAwN2EsICJURVMtTmV0d2FyZVZNUyIgfSwKKwl7IDB4MDA5MiwgIldBVENPTSBEZWJ1Z2dlci9FbWVyYWxkVGFwZUJhY2t1cFNlcnZlciIgfSwKKwl7IDB4MDA5NSwgIkREQSBPQkdZTiIgfSwKKwl7IDB4MDA5OCwgIk5ldHdhcmVBY2Nlc3NTZXJ2ZXIiIH0sCisJeyAweDAwOWEsICJOZXR3YXJlIGZvciBWTVMgSUkvTmFtZWRQaXBlU2VydmVyIiB9LAorCXsgMHgwMDliLCAiTmV0d2FyZUFjY2Vzc1NlcnZlciIgfSwKKwl7IDB4MDA5ZSwgIlBvcnRhYmxlTmV0d2FyZVNlcnZlci9TdW5MaW5rTlZUIiB9LAorCXsgMHgwMGExLCAiUG93ZXJjaHV0ZUFQQyBVUFMiIH0sCisJeyAweDAwYWEsICJMQVdzZXJ2ZSIgfSwKKwl7IDB4MDBhYywgIkNvbXBhcUlEQSBTdGF0dXNNb25pdG9yIiB9LAorCXsgMHgwMTAwLCAiUElQRSBTVEFJTCIgfSwKKwl7IDB4MDEwMiwgIkxBTiBQcm90ZWN0QmluZGVyeSIgfSwKKwl7IDB4MDEwMywgIk9yYWNsZURhdGFCYXNlU2VydmVyIiB9LAorCXsgMHgwMTA3LCAiTmV0d2FyZTM4Ni9SU1BYIFJlbW90ZUNvbnNvbGUiIH0sCisJeyAweDAxMGYsICJOb3ZlbGxTTkEgR2F0ZXdheSIgfSwKKwl7IDB4MDExMSwgIlRlc3RTZXJ2ZXIiIH0sCisJeyAweDAxMTIsICJIUCBQcmludFNlcnZlciIgfSwKKwl7IDB4MDExNCwgIkNTQSBNVVgiIH0sCisJeyAweDAxMTUsICJDU0EgTENBIiB9LAorCXsgMHgwMTE2LCAiQ1NBIENNIiB9LAorCXsgMHgwMTE3LCAiQ1NBIFNNQSIgfSwKKwl7IDB4MDExOCwgIkNTQSBEQkEiIH0sCisJeyAweDAxMTksICJDU0EgTk1BIiB9LAorCXsgMHgwMTFhLCAiQ1NBIFNTQSIgfSwKKwl7IDB4MDExYiwgIkNTQSBTVEFUVVMiIH0sCisJeyAweDAxMWUsICJDU0EgQVBQQyIgfSwKKwl7IDB4MDEyNiwgIlNOQSBURVNUIFNTQSBQcm9maWxlIiB9LAorCXsgMHgwMTJhLCAiQ1NBIFRSQUNFIiB9LAorCXsgMHgwMTJiLCAiTmV0d2FyZVNBQSIgfSwKKwl7IDB4MDEyZSwgIklLQVJVUyBWaXJ1c1NjYW4iIH0sCisJeyAweDAxMzAsICJDb21tdW5pY2F0aW9uc0V4ZWN1dGl2ZSIgfSwKKwl7IDB4MDEzMywgIk5OUyBEb21haW5TZXJ2ZXIvTmV0d2FyZU5hbWluZ1NlcnZpY2VzRG9tYWluIiB9LAorCXsgMHgwMTM1LCAiTmV0d2FyZU5hbWluZ1NlcnZpY2VzUHJvZmlsZSIgfSwKKwl7IDB4MDEzNywgIk5ldHdhcmUzODYgUHJpbnRRdWV1ZS9OTlMgUHJpbnRRdWV1ZSIgfSwKKwl7IDB4MDE0MSwgIkxBTiBTcG9vbFNlcnZlciIgfSwKKwl7IDB4MDE1MiwgIklSTUFMQU4gR2F0ZXdheSIgfSwKKwl7IDB4MDE1NCwgIk5hbWVkUGlwZVNlcnZlciIgfSwKKwl7IDB4MDE2NiwgIk5ldFdhcmVNYW5hZ2VtZW50IiB9LAorCXsgMHgwMTY4LCAiSW50ZWwgUElDS0lUIENvbW1TZXJ2ZXIvSW50ZWwgQ0FTIFRhbGtTZXJ2ZXIiIH0sCisJeyAweDAxNzMsICJDb21wYXEiIH0sCisJeyAweDAxNzQsICJDb21wYXEgU05NUCBBZ2VudCIgfSwKKwl7IDB4MDE3NSwgIkNvbXBhcSIgfSwKKwl7IDB4MDE4MCwgIlhUcmVlU2VydmVyL1hUcmVlVG9vbHMiIH0sCisJeyAweDAxOEEsICJOQVNJIFNlcnZpY2VzQnJvYWRjYXN0U2VydmVyIiB9LAorCXsgMHgwMWIwLCAiR0FSUCBHYXRld2F5IiB9LAorCXsgMHgwMWIxLCAiQmluZnZpZXciIH0sCisJeyAweDAxYmYsICJJbnRlbExhbkRlc2tNYW5hZ2VyIiB9LAorCXsgMHgwMWNhLCAiQVhURUMiIH0sCisJeyAweDAxY2IsICJTaGl2YU5ldE1vZGVtL0UiIH0sCisJeyAweDAxY2MsICJTaGl2YUxhblJvdmVyL0UiIH0sCisJeyAweDAxY2QsICJTaGl2YUxhblJvdmVyL1QiIH0sCisJeyAweDAxY2UsICJTaGl2YVVuaXZlcnNhbCIgfSwKKwl7IDB4MDFkOCwgIkNhc3RlbGxlRkFYUHJlc3NTZXJ2ZXIiIH0sCisJeyAweDAxZGEsICJDYXN0ZWxsZUxBTlByZXNzUHJpbnRTZXJ2ZXIiIH0sCisJeyAweDAxZGMsICJDYXN0ZWxsZUZBWC9YZXJveDcwMzMgRmF4U2VydmVyL0V4Y2VsTGFuRmF4IiB9LAorCXsgMHgwMWYwLCAiTEVHQVRPIiB9LAorCXsgMHgwMWY1LCAiTEVHQVRPIiB9LAorCXsgMHgwMjMzLCAiTk1TIEFnZW50L05ldHdhcmVNYW5hZ2VtZW50QWdlbnQiIH0sCisJeyAweDAyMzcsICJOTVMgSVBYIERpc2NvdmVyeS9MQU50ZXJuUmVhZFdyaXRlQ2hhbm5lbCIgfSwKKwl7IDB4MDIzOCwgIk5NUyBJUCBEaXNjb3ZlcnkvTEFOdGVyblRyYXBBbGFybUNoYW5uZWwiIH0sCisJeyAweDAyM2EsICJMQU50ZXJuIiB9LAorCXsgMHgwMjNjLCAiTUFWRVJJQ0siIH0sCisJeyAweDAyM2YsICJOb3ZlbGxTTURSIiB9LAorCXsgMHgwMjRlLCAiTmV0d2FyZUNvbm5lY3QiIH0sCisJeyAweDAyNGYsICJOQVNJIFNlcnZlckJyb2FkY2FzdCBDaXNjbyIgfSwKKwl7IDB4MDI2YSwgIk5NUyBTZXJ2aWNlQ29uc29sZSIgfSwKKwl7IDB4MDI2YiwgIlRpbWVTeW5jaHJvbml6YXRpb25TZXJ2ZXIgTmV0d2FyZSA0LngiIH0sCisJeyAweDAyNzgsICJEaXJlY3RvcnlTZXJ2ZXIgTmV0d2FyZSA0LngiIH0sCisJeyAweDAyN2IsICJOZXR3YXJlTWFuYWdlbWVudEFnZW50IiB9LAorCXsgMHgwMjgwLCAiTm92ZWxsIEZpbGUgYW5kIFByaW50ZXIgU2hhcmluZyBTZXJ2aWNlIGZvciBQQyIgfSwKKwl7IDB4MDMwNCwgIk5vdmVsbFNBQSBHYXRld2F5IiB9LAorCXsgMHgwMzA4LCAiQ09NL1ZFUk1FRCIgfSwKKwl7IDB4MDMwYSwgIkdhbGFjdGljb21tV29ybGRncm91cFNlcnZlciIgfSwKKwl7IDB4MDMwYywgIkludGVsTmV0cG9ydDIvSFAgSmV0RGlyZWN0L0hQIFF1aWNrc2lsdmVyIiB9LAorCXsgMHgwMzIwLCAiQXR0YWNobWF0ZUdhdGV3YXkiIH0sCisJeyAweDAzMjcsICJNaWNyb3NvZnREaWFnbm9zdGlvY3MiIH0sCisJeyAweDAzMjgsICJXQVRDT00gU1FMIFNlcnZlciIgfSwKKwl7IDB4MDMzNSwgIk11bHRpVGVjaFN5c3RlbXMgTXVsdGlzeW5jaENvbW1TZXJ2ZXIiIH0sCisJeyAweDAzNDMsICJYeWxvZ2ljcyBSZW1vdGVBY2Nlc3NTZXJ2ZXIvTEFOTW9kZW0iIH0sCisJeyAweDAzNTUsICJBcmNhZGFCYWNrdXBFeGVjIiB9LAorCXsgMHgwMzU4LCAiTVNMQ0QxIiB9LAorCXsgMHgwMzYxLCAiTkVUSU5FTE8iIH0sCisJeyAweDAzN2UsICJQb3dlcmNodXRlIFVQUyBNb25pdG9yaW5nIiB9LAorCXsgMHgwMzdmLCAiVmlydVNhZmVOb3RpZnkiIH0sCisJeyAweDAzODYsICJIUCBCcmlkZ2UiIH0sCisJeyAweDAzODcsICJIUCBIdWIiIH0sCisJeyAweDAzOTQsICJOZXRXYXJlIFNBQSBHYXRld2F5IiB9LAorCXsgMHgwMzliLCAiTG90dXNOb3RlcyIgfSwKKwl7IDB4MDNiNywgIkNlcnR1c0FudGlWaXJ1cyIgfSwKKwl7IDB4MDNjNCwgIkFSQ3NlcnZlNC4wIiB9LAorCXsgMHgwM2M3LCAiTEFOc3Bvb2wzLjUiIH0sCisJeyAweDAzZDcsICJMZXhtYXJrUHJpbnRlclNlcnZlciIgfSwKKwl7IDB4MDNkOCwgIkxleG1hcmtYTEUgUHJpbnRlclNlcnZlciIgfSwKKwl7IDB4MDNkZCwgIkJhbnlhbkVOUyBOZXR3YXJlQ2xpZW50IiB9LAorCXsgMHgwM2RlLCAiR3VwdGFTZXF1ZWxCYXNlU2VydmVyL05ldFdhcmVTUUwiIH0sCisJeyAweDAzZTEsICJVbml2ZWxVbml4d2FyZSIgfSwKKwl7IDB4MDNlNCwgIlVuaXZlbFVuaXh3YXJlIiB9LAorCXsgMHgwM2ZjLCAiSW50ZWxOZXRwb3J0IiB9LAorCXsgMHgwM2ZkLCAiUHJpbnRTZXJ2ZXJRdWV1ZSIgfSwKKwl7IDB4MDQwQSwgImlwblNlcnZlciIgfSwKKwl7IDB4MDQwRCwgIkxWRVJSTUFOIiB9LAorCXsgMHgwNDBFLCAiTFZMSUMiIH0sCisJeyAweDA0MTQsICJORVQgU2lsaWNvbiAoRFBJKS9LeW9jZXJhIiB9LAorCXsgMHgwNDI5LCAiU2l0ZUxvY2tWaXJ1cyIgfSwKKwl7IDB4MDQzMiwgIlVGSEVMUFI/Pz8iIH0sCisJeyAweDA0MzMsICJTeW5vcHRpY3MyODF4QWR2YW5jZWRTTk1QQWdlbnQiIH0sCisJeyAweDA0NDQsICJNaWNyb3NvZnROVCBTTkEgU2VydmVyIiB9LAorCXsgMHgwNDQ4LCAiT3JhY2xlIiB9LAorCXsgMHgwNDRjLCAiQVJDc2VydmU1LjAxIiB9LAorCXsgMHgwNDU3LCAiQ2Fub25HUDU1IiB9LAorCXsgMHgwNDVhLCAiUU1TIFByaW50ZXJzIiB9LAorCXsgMHgwNDViLCAiRGVsbFNDU0kgQXJyYXkiIH0sCisJeyAweDA0OTEsICJOZXRCbGF6ZXJNb2RlbXMiIH0sCisJeyAweDA0YWMsICJPblRpbWVTY2hlZHVsZXIiIH0sCisJeyAweDA0YjAsICJDRC1OZXQiIH0sCisJeyAweDA1MTMsICJFbXVsZXhOUUEiIH0sCisJeyAweDA1MjAsICJTaXRlTG9ja0NoZWNrcyIgfSwKKwl7IDB4MDUyOSwgIlNpdGVMb2NrQ2hlY2tzIiB9LAorCXsgMHgwNTJkLCAiQ2l0cml4T1MyIEFwcFNlcnZlciIgfSwKKwl7IDB4MDUzNSwgIlRla3Ryb25peCIgfSwKKwl7IDB4MDUzNiwgIk1pbGFuIiB9LAorCXsgMHgwNTVkLCAiQXR0YWNobWF0ZSBTTkEgZ2F0ZXdheSIgfSwKKwl7IDB4MDU2YiwgIklCTTgyMzUgTW9kZW1TZXJ2ZXIiIH0sCisJeyAweDA1NmMsICJTaGl2YUxhblJvdmVyL0UgUExVUyIgfSwKKwl7IDB4MDU2ZCwgIlNoaXZhTGFuUm92ZXIvVCBQTFVTIiB9LAorCXsgMHgwNTgwLCAiTWNBZmVlTmV0U2hpZWxkIiB9LAorCXsgMHgwNUI4LCAiTkxNIHRvIHdvcmtzdGF0aW9uIGNvbW11bmljYXRpb24gKFJldmVsYXRpb24gU29mdHdhcmUpIiB9LAorCXsgMHgwNUJBLCAiQ29tcGF0aWJsZVN5c3RlbXNSb3V0ZXJzIiB9LAorCXsgMHgwNUJFLCAiQ2hleWVubmVIaWVyYXJjaGljYWxTdG9yYWdlTWFuYWdlciIgfSwKKwl7IDB4MDYwNiwgIkpDV2F0ZXJtYXJrSW1hZ2luZyIgfSwKKwl7IDB4MDYwYywgIkFYSVNOZXR3b3JrUHJpbnRlciIgfSwKKwl7IDB4MDYxMCwgIkFkYXB0ZWNTQ1NJTWFuYWdlbWVudCIgfSwKKwl7IDB4MDYyMSwgIklCTSBBbnRpVmlydXMiIH0sCisJeyAweDA2NDAsICJXaW5kb3dzOTUgUmVtb3RlUmVnaXN0cnlTZXJ2aWNlIiB9LAorCXsgMHgwNjRlLCAiTWljcm9zb2Z0SUlTIiB9LAorCXsgMHgwNjdiLCAiTWljcm9zb2Z0IFdpbjk1Lzk4IEZpbGUgYW5kIFByaW50IFNoYXJpbmcgZm9yIE5ldFdhcmUiIH0sCisJeyAweDA2N2MsICJNaWNyb3NvZnQgV2luOTUvOTggRmlsZSBhbmQgUHJpbnQgU2hhcmluZyBmb3IgTmV0V2FyZSIgfSwKKwl7IDB4MDc2QywgIlhlcm94IiB9LAorCXsgMHgwNzliLCAiU2hpdmFMYW5Sb3Zlci9FIDExNSIgfSwKKwl7IDB4MDc5YywgIlNoaXZhTGFuUm92ZXIvVCAxMTUiIH0sCisJeyAweDA3QjQsICJDdWJpeFdvcmxkRGVzayIgfSwKKwl7IDB4MDdjMiwgIlF1YXJ0ZXJkZWNrIElXYXJlIENvbm5lY3QgVjIueCBOTE0iIH0sCisJeyAweDA3YzEsICJRdWFydGVyZGVjayBJV2FyZSBDb25uZWN0IFYzLnggTkxNIiB9LAorCXsgMHgwODEwLCAiRUxBTiBMaWNlbnNlIFNlcnZlciBEZW1vIiB9LAorCXsgMHgwODI0LCAiU2hpdmFMYW5Sb3ZlckFjY2Vzc1N3aXRjaC9FIiB9LAorCXsgMHgwODZhLCAiSVNTQyBDb2xsZWN0b3IiIH0sCisJeyAweDA4N2YsICJJU1NDIERBUyBBZ2VudEFJWCIgfSwKKwl7IDB4MDg4MCwgIkludGVsIE5ldHBvcnQgUFJPIiB9LAorCXsgMHgwODgxLCAiSW50ZWwgTmV0cG9ydCBQUk8iIH0sCisJeyAweDBiMjksICJTaXRlTG9jayIgfSwKKwl7IDB4MGMyOSwgIlNpdGVMb2NrQXBwbGljYXRpb25zIiB9LAorCXsgMHgwYzJjLCAiTGljZW5zaW5nU2VydmVyIiB9LAorCXsgMHgyMTAxLCAiUGVyZm9ybWFuY2VUZWNobm9sb2d5SW5zdGFudEludGVybmV0IiB9LAorCXsgMHgyMzgwLCAiTEFJIFNpdGVMb2NrIiB9LAorCXsgMHgyMzhjLCAiTWVldGluZ01ha2VyIiB9LAorCXsgMHg0ODA4LCAiU2l0ZUxvY2tTZXJ2ZXIvU2l0ZUxvY2tNZXRlcmluZyIgfSwKKwl7IDB4NTU1NSwgIlNpdGVMb2NrVXNlciIgfSwKKwl7IDB4NjMxMiwgIlRhcGV3YXJlIiB9LAorCXsgMHg2ZjAwLCAiUmFiYml0R2F0ZXdheSIgfSwKKwl7IDB4NzcwMywgIk1PREVNIiB9LAorCXsgMHg4MDAyLCAiTmV0UG9ydFByaW50ZXJzIiB9LAorCXsgMHg4MDA4LCAiV29yZFBlcmZlY3ROZXR3b3JrVmVyc2lvbiIgfSwKKwl7IDB4ODVCRSwgIkNpc2NvIEVJR1JQIiB9LAorCXsgMHg4ODg4LCAiV29yZFBlcmZlY3ROZXR3b3JrVmVyc2lvbi9RdWlja05ldHdvcmtNYW5hZ2VtZW50IiB9LAorCXsgMHg5MDAwLCAiTWNBZmVlTmV0U2hpZWxkIiB9LAorCXsgMHg5NjA0LCAiQ1NBLU5UX01PTiIgfSwKKwl7IDB4YjZhOCwgIk9jZWFuSXNsZVJlYWNob3V0UmVtb3RlQ29udHJvbCIgfSwKKwl7IDB4ZjExZiwgIlNpdGVMb2NrTWV0ZXJpbmciIH0sCisJeyAweGYxZmYsICJTaXRlTG9jayIgfSwKKwl7IDB4ZjUwMywgIk1pY3Jvc29mdCBTUUwgU2VydmVyIiB9LAorCXsgMHhGOTA1LCAiSUJNIFRpbWVBbmRQbGFjZSIgfSwKKwl7IDB4ZmJmYiwgIlRvcENhbGxJSUkgRmF4U2VydmVyIiB9LAorCXsgMHhmZmZmLCAiQW55U2VydmljZS9XaWxkY2FyZCIgfSwKKwl7IDAsIChjaGFyICopMCB9Cit9OworCitzdGF0aWMgdm9pZAoraW5pdF9pcHhzYXBhcnJheSh2b2lkKQoreworCXJlZ2lzdGVyIGludCBpOworCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdGFibGU7CisKKwlmb3IgKGkgPSAwOyBpcHhzYXBfZGJbaV0ucyAhPSBOVUxMOyBpKyspIHsKKwkJaW50IGogPSBodG9ucyhpcHhzYXBfZGJbaV0udikgJiAoSEFTSE5BTUVTSVpFLTEpOworCQl0YWJsZSA9ICZpcHhzYXB0YWJsZVtqXTsKKwkJd2hpbGUgKHRhYmxlLT5uYW1lKQorCQkJdGFibGUgPSB0YWJsZS0+bnh0OworCQl0YWJsZS0+bmFtZSA9IGlweHNhcF9kYltpXS5zOworCQl0YWJsZS0+YWRkciA9IGh0b25zKGlweHNhcF9kYltpXS52KTsKKwkJdGFibGUtPm54dCA9IG5ld2huYW1lbWVtKCk7CisJfQorfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgYWRkcmVzcyB0byBuYW1lIHRyYW5zbGF0aW9uIG1hY2hpbmVyeS4gIFdlIG1hcCBhbGwKKyAqIG5vbi1sb2NhbCBJUCBhZGRyZXNzZXMgdG8gbnVtZXJpYyBhZGRyZXNzZXMgaWYgZmZsYWcgaXMgdHJ1ZSAoaS5lLiwKKyAqIHRvIHByZXZlbnQgYmxvY2tpbmcgb24gdGhlIG5hbWVzZXJ2ZXIpLiAgbG9jYWxuZXQgaXMgdGhlIElQIGFkZHJlc3MKKyAqIG9mIHRoZSBsb2NhbCBuZXR3b3JrLiAgbWFzayBpcyBpdHMgc3VibmV0IG1hc2suCisgKi8KK3ZvaWQKK2luaXRfYWRkcnRvbmFtZSh1X2ludDMyX3QgbG9jYWxuZXQsIHVfaW50MzJfdCBtYXNrKQoreworCWlmIChmZmxhZykgeworCQlmX2xvY2FsbmV0ID0gbG9jYWxuZXQ7CisJCWZfbmV0bWFzayA9IG1hc2s7CisJfQorCWlmIChuZmxhZykKKwkJLyoKKwkJICogU2ltcGxlc3Qgd2F5IHRvIHN1cHByZXNzIG5hbWVzLgorCQkgKi8KKwkJcmV0dXJuOworCisJaW5pdF9ldGhlcmFycmF5KCk7CisJaW5pdF9zZXJ2YXJyYXkoKTsKKwlpbml0X2Vwcm90b2FycmF5KCk7CisJaW5pdF9wcm90b2lkYXJyYXkoKTsKKwlpbml0X2lweHNhcGFycmF5KCk7Cit9CisKK2NvbnN0IGNoYXIgKgorZG5hZGRyX3N0cmluZyh1X3Nob3J0IGRuYWRkcikKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRwOworCisJZm9yICh0cCA9ICZkbmFkZHJ0YWJsZVtkbmFkZHIgJiAoSEFTSE5BTUVTSVpFLTEpXTsgdHAtPm54dCAhPSAwOworCSAgICAgdHAgPSB0cC0+bnh0KQorCQlpZiAodHAtPmFkZHIgPT0gZG5hZGRyKQorCQkJcmV0dXJuICh0cC0+bmFtZSk7CisKKwl0cC0+YWRkciA9IGRuYWRkcjsKKwl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKKwlpZiAobmZsYWcpCisJCXRwLT5uYW1lID0gZG5udW1fc3RyaW5nKGRuYWRkcik7CisJZWxzZQorCQl0cC0+bmFtZSA9IGRubmFtZV9zdHJpbmcoZG5hZGRyKTsKKworCXJldHVybih0cC0+bmFtZSk7Cit9CisKKy8qIFJldHVybiBhIHplcm8nZWQgaG5hbWVtZW0gc3RydWN0IGFuZCBjdXRzIGRvd24gb24gY2FsbG9jKCkgb3ZlcmhlYWQgKi8KK3N0cnVjdCBobmFtZW1lbSAqCituZXdobmFtZW1lbSh2b2lkKQoreworCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqcDsKKwlzdGF0aWMgc3RydWN0IGhuYW1lbWVtICpwdHIgPSBOVUxMOworCXN0YXRpYyB1X2ludCBudW0gPSAwOworCisJaWYgKG51bSAgPD0gMCkgeworCQludW0gPSA2NDsKKwkJcHRyID0gKHN0cnVjdCBobmFtZW1lbSAqKWNhbGxvYyhudW0sIHNpemVvZiAoKnB0cikpOworCQlpZiAocHRyID09IE5VTEwpCisJCQllcnJvcigibmV3aG5hbWVtZW06IGNhbGxvYyIpOworCX0KKwktLW51bTsKKwlwID0gcHRyKys7CisJcmV0dXJuIChwKTsKK30KKworI2lmZGVmIElORVQ2CisvKiBSZXR1cm4gYSB6ZXJvJ2VkIGg2bmFtZW1lbSBzdHJ1Y3QgYW5kIGN1dHMgZG93biBvbiBjYWxsb2MoKSBvdmVyaGVhZCAqLworc3RydWN0IGg2bmFtZW1lbSAqCituZXdoNm5hbWVtZW0odm9pZCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaDZuYW1lbWVtICpwOworCXN0YXRpYyBzdHJ1Y3QgaDZuYW1lbWVtICpwdHIgPSBOVUxMOworCXN0YXRpYyB1X2ludCBudW0gPSAwOworCisJaWYgKG51bSAgPD0gMCkgeworCQludW0gPSA2NDsKKwkJcHRyID0gKHN0cnVjdCBoNm5hbWVtZW0gKiljYWxsb2MobnVtLCBzaXplb2YgKCpwdHIpKTsKKwkJaWYgKHB0ciA9PSBOVUxMKQorCQkJZXJyb3IoIm5ld2g2bmFtZW1lbTogY2FsbG9jIik7CisJfQorCS0tbnVtOworCXAgPSBwdHIrKzsKKwlyZXR1cm4gKHApOworfQorI2VuZGlmIC8qIElORVQ2ICovCmRpZmYgLS1naXQgYS9hZGRydG9uYW1lLmggYi9hZGRydG9uYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkZWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FkZHJ0b25hbWUuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hZGRydG9uYW1lLmgsdiAxLjE4IDIwMDEvMDkvMTcgMjE6NTc6NTEgZmVubmVyIEV4cCAkIChMQkwpCisgKi8KKworLyogTmFtZSB0byBhZGRyZXNzIHRyYW5zbGF0aW9uIHJvdXRpbmVzLiAqLworCitleHRlcm4gY29uc3QgY2hhciAqbGlua2FkZHJfc3RyaW5nKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV0aGVyYWRkcl9zdHJpbmcoY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV0aGVycHJvdG9fc3RyaW5nKHVfc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnRjcHBvcnRfc3RyaW5nKHVfc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKnVkcHBvcnRfc3RyaW5nKHVfc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmdldG5hbWUoY29uc3QgdV9jaGFyICopOworI2lmZGVmIElORVQ2CitleHRlcm4gY29uc3QgY2hhciAqZ2V0bmFtZTYoY29uc3QgdV9jaGFyICopOworI2VuZGlmCitleHRlcm4gY29uc3QgY2hhciAqaW50b2EodV9pbnQzMl90KTsKKworZXh0ZXJuIHZvaWQgaW5pdF9hZGRydG9uYW1lKHVfaW50MzJfdCwgdV9pbnQzMl90KTsKK2V4dGVybiBzdHJ1Y3QgaG5hbWVtZW0gKm5ld2huYW1lbWVtKHZvaWQpOworI2lmZGVmIElORVQ2CitleHRlcm4gc3RydWN0IGg2bmFtZW1lbSAqbmV3aDZuYW1lbWVtKHZvaWQpOworI2VuZGlmCisKKyNkZWZpbmUgaXBhZGRyX3N0cmluZyhwKSBnZXRuYW1lKChjb25zdCB1X2NoYXIgKikocCkpCisjaWZkZWYgSU5FVDYKKyNkZWZpbmUgaXA2YWRkcl9zdHJpbmcocCkgZ2V0bmFtZTYoKGNvbnN0IHVfY2hhciAqKShwKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYWYuYyBiL2FmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkNjE3OAotLS0gL2Rldi9udWxsCisrKyBiL2FmLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBUQ1BEVU1QIHByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2FmLmMsdiAxLjMuMi4xIDIwMDcvMDIvMjYgMTM6MzM6MTcgaGFubmVzIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFmLmgiCisKK3N0cnVjdCB0b2sgYWZfdmFsdWVzW10gPSB7CisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQifSwKKyAgICB7IEFGTlVNX0lORVQsICAgICAgICAgICAgICJJUHY0In0sCisgICAgeyBBRk5VTV9JTkVUNiwgICAgICAgICAgICAiSVB2NiJ9LAorICAgIHsgQUZOVU1fTlNBUCwgICAgICAgICAgICAgIk5TQVAifSwKKyAgICB7IEFGTlVNX0hETEMsICAgICAgICAgICAgICJIRExDIn0sCisgICAgeyBBRk5VTV9CQk4xODIyLCAgICAgICAgICAiQkJOIDE4MjIifSwKKyAgICB7IEFGTlVNXzgwMiwgICAgICAgICAgICAgICI4MDIifSwKKyAgICB7IEFGTlVNX0UxNjMsICAgICAgICAgICAgICJFLjE2MyJ9LAorICAgIHsgQUZOVU1fRTE2NCwgICAgICAgICAgICAgIkUuMTY0In0sCisgICAgeyBBRk5VTV9GNjksICAgICAgICAgICAgICAiRi42OSJ9LAorICAgIHsgQUZOVU1fWDEyMSwgICAgICAgICAgICAgIlguMTIxIn0sCisgICAgeyBBRk5VTV9JUFgsICAgICAgICAgICAgICAiTm92ZWxsIElQWCJ9LAorICAgIHsgQUZOVU1fQVRBTEssICAgICAgICAgICAgIkFwcGxldGFsayJ9LAorICAgIHsgQUZOVU1fREVDTkVULCAgICAgICAgICAgIkRlY25ldCBJViJ9LAorICAgIHsgQUZOVU1fQkFOWUFOLCAgICAgICAgICAgIkJhbnlhbiBWaW5lcyJ9LAorICAgIHsgQUZOVU1fRTE2NE5TQVAsICAgICAgICAgIkUuMTY0IHdpdGggTlNBUCBzdWJhZGRyZXNzIn0sCisgICAgeyBBRk5VTV9MMlZQTiwgICAgICAgICAgICAiTGF5ZXItMiBWUE4ifSwKKyAgICB7IEFGTlVNX1ZQTFMsICAgICAgICAgICAgICJWUExTIn0sCisgICAgeyAwLCBOVUxMfSwKK307CisKK3N0cnVjdCB0b2sgYnNkX2FmX3ZhbHVlc1tdID0geworICAgIHsgQlNEX0FGTlVNX0lORVQsICJJUHY0IiB9LAorICAgIHsgQlNEX0FGTlVNX05TLCAiTlMiIH0sCisgICAgeyBCU0RfQUZOVU1fSVNPLCAiSVNPIiB9LAorICAgIHsgQlNEX0FGTlVNX0FQUExFVEFMSywgIkFwcGxldGFsayIgfSwKKyAgICB7IEJTRF9BRk5VTV9JUFgsICJJUFgiIH0sCisgICAgeyBCU0RfQUZOVU1fSU5FVDZfQlNELCAiSVB2NiIgfSwKKyAgICB7IEJTRF9BRk5VTV9JTkVUNl9GUkVFQlNELCAiSVB2NiIgfSwKKyAgICB7IEJTRF9BRk5VTV9JTkVUNl9EQVJXSU4sICJJUHY2IiB9LAorICAgIHsgMCwgTlVMTH0KK307CmRpZmYgLS1naXQgYS9hZi5oIGIvYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmE3NjYyCi0tLSAvZGV2L251bGwKKysrIGIvYWYuaApAQCAtMCwwICsxLDU3IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2FmLmgsdiAxLjMuMi4xIDIwMDcvMDIvMjYgMTM6MzM6MTcgaGFubmVzIEV4cCAkIChMQkwpICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgVENQRFVNUCBwcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCitleHRlcm4gc3RydWN0IHRvayBhZl92YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGJzZF9hZl92YWx1ZXNbXTsKKworLyogUkZDMTcwMCBhZGRyZXNzIGZhbWlseSBudW1iZXJzICovCisjZGVmaW5lIEFGTlVNX0lORVQJMQorI2RlZmluZSBBRk5VTV9JTkVUNgkyCisjZGVmaW5lIEFGTlVNX05TQVAJMworI2RlZmluZSBBRk5VTV9IRExDCTQKKyNkZWZpbmUgQUZOVU1fQkJOMTgyMgk1CisjZGVmaW5lIEFGTlVNXzgwMgk2CisjZGVmaW5lIEFGTlVNX0UxNjMJNworI2RlZmluZSBBRk5VTV9FMTY0CTgKKyNkZWZpbmUgQUZOVU1fRjY5CTkKKyNkZWZpbmUgQUZOVU1fWDEyMQkxMAorI2RlZmluZSBBRk5VTV9JUFgJMTEKKyNkZWZpbmUgQUZOVU1fQVRBTEsJMTIKKyNkZWZpbmUgQUZOVU1fREVDTkVUCTEzCisjZGVmaW5lIEFGTlVNX0JBTllBTgkxNAorI2RlZmluZSBBRk5VTV9FMTY0TlNBUAkxNQorI2RlZmluZSBBRk5VTV9WUExTICAgICAgMjUKKy8qIGRyYWZ0LWtvbXBlbGxhLXBwdnBuLWwydnBuICovCisjZGVmaW5lIEFGTlVNX0wyVlBOICAgICAxOTYgLyogc3RpbGwgdG8gYmUgYXBwcm92ZWQgYnkgSUFOQSAqLworCisvKgorICogQlNEIEFGXyB2YWx1ZXMuCisgKgorICogVW5mb3J0dW5hdGVseSwgdGhlIEJTRHMgZG9uJ3QgYWxsIHVzZSB0aGUgc2FtZSB2YWx1ZSBmb3IgQUZfSU5FVDYsCisgKiBzbywgYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZCBjYXB0dXJlcyBmcm9tIGFsbCBvZiB0aGUgQlNEcywKKyAqIHdlIGNoZWNrIGZvciBhbGwgb2YgdGhlbS4KKyAqLworI2RlZmluZSBCU0RfQUZOVU1fSU5FVAkJMgorI2RlZmluZSBCU0RfQUZOVU1fTlMJCTYJCS8qIFhFUk9YIE5TIHByb3RvY29scyAqLworI2RlZmluZSBCU0RfQUZOVU1fSVNPCQk3CisjZGVmaW5lIEJTRF9BRk5VTV9BUFBMRVRBTEsJMTYKKyNkZWZpbmUgQlNEX0FGTlVNX0lQWAkJMjMKKyNkZWZpbmUgQlNEX0FGTlVNX0lORVQ2X0JTRAkyNAkvKiBPcGVuQlNEIChhbmQgcHJvYmFibHkgTmV0QlNEKSwgQlNEL09TICovCisjZGVmaW5lIEJTRF9BRk5VTV9JTkVUNl9GUkVFQlNECTI4CisjZGVmaW5lIEJTRF9BRk5VTV9JTkVUNl9EQVJXSU4JMzAKZGlmZiAtLWdpdCBhL2FoLmggYi9haC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjgwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9haC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCSROZXRCU0Q6IGFoLmgsdiAxLjEyIDIwMDAvMDcvMjMgMDU6MjM6MDQgaXRvanVuIEV4cCAkCSovCisvKgkkS0FNRTogYWguaCx2IDEuMTIgMjAwMC8wNy8yMCAxNzo0MTowMSBpdG9qdW4gRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFJGQzE4MjYvMjQwMiBhdXRoZW50aWNhdGlvbiBoZWFkZXIuCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVDZfQUhfSF8KKyNkZWZpbmUgX05FVElORVQ2X0FIX0hfCisKK3N0cnVjdCBhaCB7CisJdV9pbnQ4X3QJYWhfbnh0OwkJLyogTmV4dCBIZWFkZXIgKi8KKwl1X2ludDhfdAlhaF9sZW47CQkvKiBMZW5ndGggb2YgZGF0YSwgaW4gMzJiaXQgKi8KKwl1X2ludDE2X3QJYWhfcmVzZXJ2ZTsJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKwl1X2ludDMyX3QJYWhfc3BpOwkJLyogU2VjdXJpdHkgcGFyYW1ldGVyIGluZGV4ICovCisJLyogdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhICovCit9OworCitzdHJ1Y3QgbmV3YWggeworCXVfaW50OF90CWFoX254dDsJCS8qIE5leHQgSGVhZGVyICovCisJdV9pbnQ4X3QJYWhfbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEgKyAxLCBpbiAzMmJpdCAqLworCXVfaW50MTZfdAlhaF9yZXNlcnZlOwkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCXVfaW50MzJfdAlhaF9zcGk7CQkvKiBTZWN1cml0eSBwYXJhbWV0ZXIgaW5kZXggKi8KKwl1X2ludDMyX3QJYWhfc2VxOwkJLyogU2VxdWVuY2UgbnVtYmVyIGZpZWxkICovCisJLyogdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhICovCit9OworCisjZW5kaWYgLypfTkVUSU5FVDZfQUhfSF8qLwpkaWZmIC0tZ2l0IGEvYW9kdi5oIGIvYW9kdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hb2R2LmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYW9kdi5oLHYgMS4zIDIwMDMvMDkvMTMgMDE6MzQ6NDIgZ3V5IEV4cCAkIChMQkwpICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEJydWNlIE0uIFNpbXBzb24gPGJtc0BzcGMub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQnJ1Y2UgTS4gU2ltcHNvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgQnJ1Y2UgTS4gU2ltcHNvbiBub3IgdGhlIG5hbWVzIG9mIGNvLQorICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCcnVjZSBNLiBTaW1wc29uIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBCcnVjZSBNLiBTaW1wc29uIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX0FPRFZfSF8KKyNkZWZpbmUgX0FPRFZfSF8KKworc3RydWN0IGFvZHZfcnJlcSB7CisJdV9pbnQ4X3QJcnJlcV90eXBlOwkvKiBBT0RWIG1lc3NhZ2UgdHlwZSAoMSkgKi8KKwl1X2ludDhfdAlycmVxX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCisJdV9pbnQ4X3QJcnJlcV96ZXJvMDsJLyogcmVzZXJ2ZWQsIHNldCB0byB6ZXJvICovCisJdV9pbnQ4X3QJcnJlcV9ob3BzOwkvKiBudW1iZXIgb2YgaG9wcyBmcm9tIG9yaWdpbmF0b3IgKi8KKwl1X2ludDMyX3QJcnJlcV9pZDsJLyogcmVxdWVzdCBJRCAqLworCXVfaW50MzJfdAlycmVxX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY0IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJcnJlcV9kczsJLyogZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtYmVyICovCisJdV9pbnQzMl90CXJyZXFfb2E7CS8qIG9yaWdpbmF0b3IgSVB2NCBhZGRyZXNzICovCisJdV9pbnQzMl90CXJyZXFfb3M7CS8qIG9yaWdpbmF0b3Igc2VxdWVuY2UgbnVtYmVyICovCit9OworI2lmZGVmIElORVQ2CitzdHJ1Y3QgYW9kdl9ycmVxNiB7CisJdV9pbnQ4X3QJcnJlcV90eXBlOwkvKiBBT0RWIG1lc3NhZ2UgdHlwZSAoMSkgKi8KKwl1X2ludDhfdAlycmVxX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCisJdV9pbnQ4X3QJcnJlcV96ZXJvMDsJLyogcmVzZXJ2ZWQsIHNldCB0byB6ZXJvICovCisJdV9pbnQ4X3QJcnJlcV9ob3BzOwkvKiBudW1iZXIgb2YgaG9wcyBmcm9tIG9yaWdpbmF0b3IgKi8KKwl1X2ludDMyX3QJcnJlcV9pZDsJLyogcmVxdWVzdCBJRCAqLworCXN0cnVjdCBpbjZfYWRkcglycmVxX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY2IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJcnJlcV9kczsJLyogZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtYmVyICovCisJc3RydWN0IGluNl9hZGRyCXJyZXFfb2E7CS8qIG9yaWdpbmF0b3IgSVB2NiBhZGRyZXNzICovCisJdV9pbnQzMl90CXJyZXFfb3M7CS8qIG9yaWdpbmF0b3Igc2VxdWVuY2UgbnVtYmVyICovCit9Oworc3RydWN0IGFvZHZfcnJlcTZfZHJhZnRfMDEgeworCXVfaW50OF90CXJyZXFfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDE2KSAqLworCXVfaW50OF90CXJyZXFfZmxhZ3M7CS8qIHZhcmlvdXMgZmxhZ3MgKi8KKwl1X2ludDhfdAlycmVxX3plcm8wOwkvKiByZXNlcnZlZCwgc2V0IHRvIHplcm8gKi8KKwl1X2ludDhfdAlycmVxX2hvcHM7CS8qIG51bWJlciBvZiBob3BzIGZyb20gb3JpZ2luYXRvciAqLworCXVfaW50MzJfdAlycmVxX2lkOwkvKiByZXF1ZXN0IElEICovCisJdV9pbnQzMl90CXJyZXFfZHM7CS8qIGRlc3RpbmF0aW9uIHNlcXVlbmNlIG51bWJlciAqLworCXVfaW50MzJfdAlycmVxX29zOwkvKiBvcmlnaW5hdG9yIHNlcXVlbmNlIG51bWJlciAqLworCXN0cnVjdCBpbjZfYWRkcglycmVxX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY2IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIJcnJlcV9vYTsJLyogb3JpZ2luYXRvciBJUHY2IGFkZHJlc3MgKi8KK307CisjZW5kaWYKKworI2RlZmluZQlSUkVRX0pPSU4JMHg4MAkJLyogam9pbiAocmVzZXJ2ZWQgZm9yIG11bHRpY2FzdCAqLworI2RlZmluZQlSUkVRX1JFUEFJUgkweDQwCQkvKiByZXBhaXIgKHJlc2VydmVkIGZvciBtdWx0aWNhc3QgKi8KKyNkZWZpbmUJUlJFUV9HUkFUCTB4MjAJCS8qIGdyYXR1aXRvdXMgUlJFUCAqLworI2RlZmluZQlSUkVRX0RFU1QJMHgxMAkJLyogZGVzdGluYXRpb24gb25seSAqLworI2RlZmluZQlSUkVRX1VOS05PV04JMHgwOAkJLyogdW5rbm93biBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW0gKi8KKyNkZWZpbmUJUlJFUV9GTEFHU19NQVNLCTB4RjgJCS8qIG1hc2sgZm9yIHJyZXFfZmxhZ3MgKi8KKworc3RydWN0IGFvZHZfcnJlcCB7CisJdV9pbnQ4X3QJcnJlcF90eXBlOwkvKiBBT0RWIG1lc3NhZ2UgdHlwZSAoMikgKi8KKwl1X2ludDhfdAlycmVwX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCisJdV9pbnQ4X3QJcnJlcF9wczsJLyogcHJlZml4IHNpemUgKi8KKwl1X2ludDhfdAlycmVwX2hvcHM7CS8qIG51bWJlciBvZiBob3BzIGZyb20gbyB0byBkICovCisJdV9pbnQzMl90CXJyZXBfZGE7CS8qIGRlc3RpbmF0aW9uIElQdjQgYWRkcmVzcyAqLworCXVfaW50MzJfdAlycmVwX2RzOwkvKiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1X2ludDMyX3QJcnJlcF9vYTsJLyogb3JpZ2luYXRvciBJUHY0IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJcnJlcF9saWZlOwkvKiBsaWZldGltZSBvZiB0aGlzIHJvdXRlICovCit9OworI2lmZGVmIElORVQ2CitzdHJ1Y3QgYW9kdl9ycmVwNiB7CisJdV9pbnQ4X3QJcnJlcF90eXBlOwkvKiBBT0RWIG1lc3NhZ2UgdHlwZSAoMikgKi8KKwl1X2ludDhfdAlycmVwX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCisJdV9pbnQ4X3QJcnJlcF9wczsJLyogcHJlZml4IHNpemUgKi8KKwl1X2ludDhfdAlycmVwX2hvcHM7CS8qIG51bWJlciBvZiBob3BzIGZyb20gbyB0byBkICovCisJc3RydWN0IGluNl9hZGRyCXJyZXBfZGE7CS8qIGRlc3RpbmF0aW9uIElQdjYgYWRkcmVzcyAqLworCXVfaW50MzJfdAlycmVwX2RzOwkvKiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwlzdHJ1Y3QgaW42X2FkZHIJcnJlcF9vYTsJLyogb3JpZ2luYXRvciBJUHY2IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJcnJlcF9saWZlOwkvKiBsaWZldGltZSBvZiB0aGlzIHJvdXRlICovCit9Oworc3RydWN0IGFvZHZfcnJlcDZfZHJhZnRfMDEgeworCXVfaW50OF90CXJyZXBfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDE3KSAqLworCXVfaW50OF90CXJyZXBfZmxhZ3M7CS8qIHZhcmlvdXMgZmxhZ3MgKi8KKwl1X2ludDhfdAlycmVwX3BzOwkvKiBwcmVmaXggc2l6ZSAqLworCXVfaW50OF90CXJyZXBfaG9wczsJLyogbnVtYmVyIG9mIGhvcHMgZnJvbSBvIHRvIGQgKi8KKwl1X2ludDMyX3QJcnJlcF9kczsJLyogZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtYmVyICovCisJc3RydWN0IGluNl9hZGRyCXJyZXBfZGE7CS8qIGRlc3RpbmF0aW9uIElQdjYgYWRkcmVzcyAqLworCXN0cnVjdCBpbjZfYWRkcglycmVwX29hOwkvKiBvcmlnaW5hdG9yIElQdjYgYWRkcmVzcyAqLworCXVfaW50MzJfdAlycmVwX2xpZmU7CS8qIGxpZmV0aW1lIG9mIHRoaXMgcm91dGUgKi8KK307CisjZW5kaWYKKworI2RlZmluZQlSUkVQX1JFUEFJUgkJMHg4MAkvKiByZXBhaXIgKHJlc2VydmVkIGZvciBtdWx0aWNhc3QgKi8KKyNkZWZpbmUJUlJFUF9BQ0sJCTB4NDAJLyogYWNrbm93bGVkZ2VtZW50IHJlcXVpcmVkICovCisjZGVmaW5lCVJSRVBfRkxBR1NfTUFTSwkJMHhDMAkvKiBtYXNrIGZvciBycmVwX2ZsYWdzICovCisjZGVmaW5lCVJSRVBfUFJFRklYX01BU0sJMHgxRgkvKiBtYXNrIGZvciBwcmVmaXggc2l6ZSAqLworCitzdHJ1Y3QgcmVycl91bnJlYWNoIHsKKwl1X2ludDMyX3QJdV9kYTsJLyogSVB2NCBhZGRyZXNzICovCisJdV9pbnQzMl90CXVfZHM7CS8qIHNlcXVlbmNlIG51bWJlciAqLworfTsKKyNpZmRlZiBJTkVUNgorc3RydWN0IHJlcnJfdW5yZWFjaDYgeworCXN0cnVjdCBpbjZfYWRkcgl1X2RhOwkvKiBJUHY2IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJdV9kczsJLyogc2VxdWVuY2UgbnVtYmVyICovCit9Oworc3RydWN0IHJlcnJfdW5yZWFjaDZfZHJhZnRfMDEgeworCXN0cnVjdCBpbjZfYWRkcgl1X2RhOwkvKiBJUHY2IGFkZHJlc3MgKi8KKwl1X2ludDMyX3QJdV9kczsJLyogc2VxdWVuY2UgbnVtYmVyICovCit9OworI2VuZGlmCisKK3N0cnVjdCBhb2R2X3JlcnIgeworCXVfaW50OF90CXJlcnJfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDMgb3IgMTgpICovCisJdV9pbnQ4X3QJcmVycl9mbGFnczsJLyogdmFyaW91cyBmbGFncyAqLworCXVfaW50OF90CXJlcnJfemVybzA7CS8qIHJlc2VydmVkLCBzZXQgdG8gemVybyAqLworCXVfaW50OF90CXJlcnJfZGM7CS8qIGRlc3RpbmF0aW9uIGNvdW50ICovCisJdW5pb24geworCQlzdHJ1Y3QJcmVycl91bnJlYWNoIGRlc3RbMV07CisjaWZkZWYgSU5FVDYKKwkJc3RydWN0CXJlcnJfdW5yZWFjaDYgZGVzdDZbMV07CisJCXN0cnVjdAlyZXJyX3VucmVhY2g2X2RyYWZ0XzAxIGRlc3Q2X2RyYWZ0XzAxWzFdOworI2VuZGlmCisJfSByOworfTsKKworI2RlZmluZSBSRVJSX05PREVMRVRFCQkweDgwCS8qIGRvbid0IGRlbGV0ZSB0aGUgbGluayAqLworI2RlZmluZSBSRVJSX0ZMQUdTX01BU0sJCTB4ODAJLyogbWFzayBmb3IgcmVycl9mbGFncyAqLworCitzdHJ1Y3QgYW9kdl9ycmVwX2FjayB7CisJdV9pbnQ4X3QJcmFfdHlwZTsKKwl1X2ludDhfdAlyYV96ZXJvMDsKK307CisKK3VuaW9uIGFvZHYgeworCXN0cnVjdCBhb2R2X3JyZXEgcnJlcTsKKwlzdHJ1Y3QgYW9kdl9ycmVwIHJyZXA7CisJc3RydWN0IGFvZHZfcmVyciByZXJyOworCXN0cnVjdCBhb2R2X3JyZXBfYWNrIHJyZXBfYWNrOworI2lmZGVmIElORVQ2CisJc3RydWN0IGFvZHZfcnJlcTYgcnJlcTY7CisJc3RydWN0IGFvZHZfcnJlcTZfZHJhZnRfMDEgcnJlcTZfZHJhZnRfMDE7CisJc3RydWN0IGFvZHZfcnJlcDYgcnJlcDY7CisJc3RydWN0IGFvZHZfcnJlcDZfZHJhZnRfMDEgcnJlcDZfZHJhZnRfMDE7CisjZW5kaWYKK307CisKKyNkZWZpbmUJQU9EVl9SUkVRCQkxCS8qIHJvdXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUJQU9EVl9SUkVQCQkyCS8qIHJvdXRlIHJlc3BvbnNlICovCisjZGVmaW5lCUFPRFZfUkVSUgkJMwkvKiBlcnJvciByZXBvcnQgKi8KKyNkZWZpbmUJQU9EVl9SUkVQX0FDSwkJNAkvKiByb3V0ZSByZXNwb25zZSBhY2tub3dsZWRnZW1lbnQgKi8KKworI2RlZmluZSBBT0RWX1Y2X0RSQUZUXzAxX1JSRVEJCTE2CS8qIElQdjYgcm91dGUgcmVxdWVzdCAqLworI2RlZmluZSBBT0RWX1Y2X0RSQUZUXzAxX1JSRVAJCTE3CS8qIElQdjYgcm91dGUgcmVzcG9uc2UgKi8KKyNkZWZpbmUgQU9EVl9WNl9EUkFGVF8wMV9SRVJSCQkxOAkvKiBJUHY2IGVycm9yIHJlcG9ydCAqLworI2RlZmluZSBBT0RWX1Y2X0RSQUZUXzAxX1JSRVBfQUNLCTE5CS8qIElQVjYgcm91dGUgcmVzcG9uc2UgYWNrbm93bGVkZ21lbnQgKi8KKworc3RydWN0IGFvZHZfZXh0IHsKKwl1X2ludDhfdAl0eXBlOwkJLyogZXh0ZW5zaW9uIHR5cGUgKi8KKwl1X2ludDhfdAlsZW5ndGg7CQkvKiBleHRlbnNpb24gbGVuZ3RoICovCit9OworCitzdHJ1Y3QgYW9kdl9oZWxsbyB7CisJc3RydWN0CWFvZHZfZXh0CWVoOwkJLyogZXh0ZW5zaW9uIGhlYWRlciAqLworCXVfaW50MzJfdAkJaW50ZXJ2YWw7CS8qIGV4cGVjdCBteSBuZXh0IGhlbGxvIGluCisJCQkJCQkgKiAobikgbXMgKi8KK307CisKKyNkZWZpbmUJQU9EVl9FWFRfSEVMTE8JMQorCisjZW5kaWYgLyogX0FPRFZfSF8gKi8KZGlmZiAtLWdpdCBhL2FwcGxldGFsay5oIGIvYXBwbGV0YWxrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlNjJlZgotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldGFsay5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQXBwbGVUYWxrIHByb3RvY29sIGZvcm1hdHMgKGNvdXJ0ZXN5IEJpbGwgQ3JvZnQgb2YgU3RhbmZvcmQvU1VNRVgpLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYXBwbGV0YWxrLmgsdiAxLjE2IDIwMDQvMDUvMDEgMDk6NDE6NTAgaGFubmVzIEV4cCAkIChMQkwpCisgKi8KKworc3RydWN0IExBUCB7CisJdV9pbnQ4X3QJZHN0OworCXVfaW50OF90CXNyYzsKKwl1X2ludDhfdAl0eXBlOworfTsKKyNkZWZpbmUgbGFwU2hvcnRERFAJMQkvKiBzaG9ydCBERFAgdHlwZSAqLworI2RlZmluZSBsYXBERFAJCTIJLyogRERQIHR5cGUgKi8KKyNkZWZpbmUgbGFwS0xBUAkJJ0snCS8qIEtpbmV0aWNzIEtMQVAgdHlwZSAqLworCisvKiBEYXRhZ3JhbSBEZWxpdmVyeSBQcm90b2NvbCAqLworCitzdHJ1Y3QgYXRERFAgeworCXVfaW50MTZfdAlsZW5ndGg7CisJdV9pbnQxNl90CWNoZWNrc3VtOworCXVfaW50MTZfdAlkc3ROZXQ7CisJdV9pbnQxNl90CXNyY05ldDsKKwl1X2ludDhfdAlkc3ROb2RlOworCXVfaW50OF90CXNyY05vZGU7CisJdV9pbnQ4X3QJZHN0U2t0OworCXVfaW50OF90CXNyY1NrdDsKKwl1X2ludDhfdAl0eXBlOworfTsKKworc3RydWN0IGF0U2hvcnRERFAgeworCXVfaW50MTZfdAlsZW5ndGg7CisJdV9pbnQ4X3QJZHN0U2t0OworCXVfaW50OF90CXNyY1NrdDsKKwl1X2ludDhfdAl0eXBlOworfTsKKworI2RlZmluZQlkZHBNYXhXS1MJMHg3RgorI2RlZmluZQlkZHBNYXhEYXRhCTU4NgorI2RlZmluZQlkZHBMZW5ndGhNYXNrCTB4M0ZGCisjZGVmaW5lCWRkcEhvcFNoaWZ0CTEwCisjZGVmaW5lCWRkcFNpemUJCTEzCS8qIHNpemUgb2YgRERQIGhlYWRlciAoYXZvaWQgc3RydWN0IHBhZGRpbmcpICovCisjZGVmaW5lCWRkcFNTaXplCTUKKyNkZWZpbmUJZGRwV0tTCQkxMjgJLyogYm91bmRhcnkgb2YgRERQIHdlbGwga25vd24gc29ja2V0cyAqLworI2RlZmluZQlkZHBSVE1QCQkxCS8qIFJUTVAgdHlwZSAqLworI2RlZmluZQlkZHBSVE1QcmVxdWVzdAk1CS8qIFJUTVAgcmVxdWVzdCB0eXBlICovCisjZGVmaW5lCWRkcE5CUAkJMgkvKiBOQlAgdHlwZSAqLworI2RlZmluZQlkZHBBVFAJCTMJLyogQVRQIHR5cGUgKi8KKyNkZWZpbmUJZGRwRUNITwkJNAkvKiBFQ0hPIHR5cGUgKi8KKyNkZWZpbmUJZGRwSVAJCTIyCS8qIElQIHR5cGUgKi8KKyNkZWZpbmUJZGRwQVJQCQkyMwkvKiBBUlAgdHlwZSAqLworI2RlZmluZSBkZHBFSUdSUCAgICAgICAgODggICAgICAvKiBFSUdSUCBvdmVyIEFwcGxldGFsayAqLworI2RlZmluZQlkZHBLTEFQCQkweDRiCS8qIEtpbmV0aWNzIEtMQVAgdHlwZSAqLworCisKKy8qIEFwcGxlVGFsayBUcmFuc2FjdGlvbiBQcm90b2NvbCAqLworCitzdHJ1Y3QgYXRBVFAgeworCXVfaW50OF90CWNvbnRyb2w7CisJdV9pbnQ4X3QJYml0bWFwOworCXVfaW50MTZfdAl0cmFuc0lEOworCWludDMyX3QgdXNlckRhdGE7Cit9OworCisjZGVmaW5lCWF0cFJlcUNvZGUJMHg0MAorI2RlZmluZQlhdHBSc3BDb2RlCTB4ODAKKyNkZWZpbmUJYXRwUmVsQ29kZQkweEMwCisjZGVmaW5lCWF0cFhPCQkweDIwCisjZGVmaW5lCWF0cEVPTQkJMHgxMAorI2RlZmluZQlhdHBTVFMJCTB4MDgKKyNkZWZpbmUJYXRwRmxhZ01hc2sJMHgzRgorI2RlZmluZQlhdHBDb250cm9sTWFzawkweEY4CisjZGVmaW5lCWF0cE1heE51bQk4CisjZGVmaW5lCWF0cE1heERhdGEJNTc4CisKKworLyogQXBwbGVUYWxrIEVjaG8gUHJvdG9jb2wgKi8KKworc3RydWN0IGF0RWNobyB7CisJdV9pbnQ4X3QJZWNob0Z1bmN0aW9uOworCXVfaW50OF90CSplY2hvRGF0YTsKK307CisKKyNkZWZpbmUgZWNob1NrdAkJNAkJLyogdGhlIGVjaG9lciBzb2NrZXQgKi8KKyNkZWZpbmUgZWNob1NpemUJMQkJLyogc2l6ZSBvZiBlY2hvIGhlYWRlciAqLworI2RlZmluZSBlY2hvUmVxdWVzdAkxCQkvKiBlY2hvIHJlcXVlc3QgKi8KKyNkZWZpbmUgZWNob1JlcGx5CTIJCS8qIGVjaG8gcmVxdWVzdCAqLworCisKKy8qIE5hbWUgQmluZGluZyBQcm90b2NvbCAqLworCitzdHJ1Y3QgYXROQlAgeworCXVfaW50OF90CWNvbnRyb2w7CisJdV9pbnQ4X3QJaWQ7Cit9OworCitzdHJ1Y3QgYXROQlB0dXBsZSB7CisJdV9pbnQxNl90CW5ldDsKKwl1X2ludDhfdAlub2RlOworCXVfaW50OF90CXNrdDsKKwl1X2ludDhfdAllbnVtZXJhdG9yOworfTsKKworI2RlZmluZQluYnBCclJxCQkweDEwCisjZGVmaW5lCW5icExrVXAJCTB4MjAKKyNkZWZpbmUJbmJwTGtVcFJlcGx5CTB4MzAKKworI2RlZmluZQluYnBOSVMJCTIKKyNkZWZpbmUJbmJwVHVwbGVNYXgJMTUKKworI2RlZmluZQluYnBIZWFkZXJTaXplCTIKKyNkZWZpbmUgbmJwVHVwbGVTaXplCTUKKworI2RlZmluZSBuYnBTa3QJCTIJCS8qIE5JUyAqLworCisKKy8qIFJvdXRpbmcgVGFibGUgTWFpbnQuIFByb3RvY29sICovCisKKyNkZWZpbmUJcnRtcFNrdAkJMQkvKiBudW1iZXIgb2YgUlRNUCBzb2NrZXQgKi8KKyNkZWZpbmUJcnRtcFNpemUJNAkvKiBtaW5pbXVtIHNpemUgKi8KKyNkZWZpbmUJcnRtcFR1cGxlU2l6ZQkzCisKKworLyogWm9uZSBJbmZvcm1hdGlvbiBQcm90b2NvbCAqLworCitzdHJ1Y3QgemlwSGVhZGVyIHsKKwl1X2ludDhfdAljb21tYW5kOworCXVfaW50OF90CW5ldGNvdW50OworfTsKKworI2RlZmluZQl6aXBIZWFkZXJTaXplCTIKKyNkZWZpbmUJemlwUXVlcnkJMQorI2RlZmluZQl6aXBSZXBseQkyCisjZGVmaW5lCXppcFRha2Vkb3duCTMKKyNkZWZpbmUJemlwQnJpbmd1cAk0CisjZGVmaW5lCWRkcFpJUAkJNgorI2RlZmluZQl6aXBTa3QJCTYKKyNkZWZpbmUJR2V0TXlab25lCTcKKyNkZWZpbmUJR2V0Wm9uZUxpc3QJOAorCisvKgorICogVURQIHBvcnQgcmFuZ2UgdXNlZCBmb3IgZGRwLWluLXVkcCBlbmNhcHN1bGF0aW9uIGlzIDE2NTEyLTE2NjM5CisgKiBmb3IgY2xpZW50IHNvY2tldHMgKDEyOC0yNTUpIGFuZCAyMDAtMzI3IGZvciBzZXJ2ZXIgc29ja2V0cworICogKDAtMTI3KS4gIFdlIGFsc28gdHJ5IHRvIHJlY29nbml6ZSB0aGUgcHJlLUFwcmlsIDg4IHNlcnZlcgorICogc29ja2V0IHJhbmdlIG9mIDc2OC04OTUuCisgKi8KKyNkZWZpbmUgYXRhbGtfcG9ydChwKSBcCisJKCgodW5zaWduZWQpKChwKSAtIDE2NTEyKSA8IDEyOCkgfHwgXAorCSAoKHVuc2lnbmVkKSgocCkgLSAyMDApIDwgMTI4KSB8fCBcCisJICgodW5zaWduZWQpKChwKSAtIDc2OCkgPCAxMjgpKQpkaWZmIC0tZ2l0IGEvYXJjbmV0LmggYi9hcmNuZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY0OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjbmV0LmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSWQ6IGFyY25ldC5oLHYgMS4zIDIwMDMvMDEvMjMgMDk6MDU6MzcgZ3V5IEV4cCAkIChMQkwpCisgKgorICogZnJvbTogTmV0QlNEOiBpZl9hcmMuaCx2IDEuMTMgMTk5OS8xMS8xOSAyMDo0MToxOSB0aG9ycGVqIEV4cAorICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSAyLjVNQi9zIEFyY25ldCBoZWFkZXIgb24gdGhlIEJTRHMsCisgKiBhcyBnaXZlbiB0byBpbnRlcmZhY2UgY29kZS4KKyAqLworc3RydWN0CWFyY19oZWFkZXIgeworCXVfaW50OF90ICBhcmNfc2hvc3Q7CisJdV9pbnQ4X3QgIGFyY19kaG9zdDsKKwl1X2ludDhfdCAgYXJjX3R5cGU7CisJLyoKKwkgKiBvbmx5IHByZXNlbnQgZm9yIG5ld3N0eWxlIGVuY29kaW5nIHdpdGggTEwgZnJhZ21lbnRhdGlvbi4KKwkgKiBEb24ndCB1c2Ugc2l6ZW9mKGFueXRoaW5nKSwgdXNlIEFSQ19IRFJ7LE5FV31MRU4gaW5zdGVhZC4KKwkgKi8KKwl1X2ludDhfdCAgYXJjX2ZsYWc7CisJdV9pbnQxNl90IGFyY19zZXFpZDsKKworCS8qCisJICogb25seSBwcmVzZW50IGluIGV4Y2VwdGlvbiBwYWNrZXRzIChhcmNfZmxhZyA9PSAweGZmKQorCSAqLworCXVfaW50OF90ICBhcmNfdHlwZTI7CS8qIHNhbWUgYXMgYXJjX3R5cGUgKi8KKwl1X2ludDhfdCAgYXJjX2ZsYWcyOwkvKiByZWFsIGZsYWcgdmFsdWUgKi8KKwl1X2ludDE2X3QgYXJjX3NlcWlkMjsJLyogcmVhbCBzZXFpZCB2YWx1ZSAqLworfTsKKworI2RlZmluZQlBUkNfSERSTEVOCQkzCisjZGVmaW5lCUFSQ19IRFJORVdMRU4JCTYKKyNkZWZpbmUJQVJDX0hEUk5FV0xFTl9FWEMJMTAKKworLyogUkZDIDEwNTEgKi8KKyNkZWZpbmUJQVJDVFlQRV9JUF9PTEQJCTI0MAkvKiBJUCBwcm90b2NvbCAqLworI2RlZmluZQlBUkNUWVBFX0FSUF9PTEQJCTI0MQkvKiBhZGRyZXNzIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KKworLyogUkZDIDEyMDEgKi8KKyNkZWZpbmUJQVJDVFlQRV9JUAkJMjEyCS8qIElQIHByb3RvY29sICovCisjZGVmaW5lCUFSQ1RZUEVfQVJQCQkyMTMJLyogYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sICovCisjZGVmaW5lCUFSQ1RZUEVfUkVWQVJQCQkyMTQJLyogcmV2ZXJzZSBhZGRyIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KKworI2RlZmluZQlBUkNUWVBFX0FUQUxLCQkyMjEJLyogQXBwbGV0YWxrICovCisjZGVmaW5lCUFSQ1RZUEVfQkFOSUFOCQkyNDcJLyogQmFueWFuIFZpbmVzICovCisjZGVmaW5lCUFSQ1RZUEVfSVBYCQkyNTAJLyogTm92ZWxsIElQWCAqLworCisjZGVmaW5lIEFSQ1RZUEVfSU5FVDYJCTB4YzQJLyogSVBuZyAqLworI2RlZmluZSBBUkNUWVBFX0RJQUdOT1NFCTB4ODAJLyogYXMgcGVyIEFOU0kvQVRBIDg3OC4xICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSAyLjVNQi9zIEFyY25ldCBoZWFkZXIgb24gTGludXguICBMaW51eCBoYXMKKyAqIGFuIGV4dHJhICJvZmZzZXQiIGZpZWxkIHdoZW4gZ2l2ZW4gdG8gaW50ZXJmYWNlIGNvZGUsIGFuZAorICogbmV2ZXIgcHJlc2VudHMgcGFja2V0cyB0aGF0IGxvb2sgbGlrZSBleGNlcHRpb24gZnJhbWVzLgorICovCitzdHJ1Y3QJYXJjX2xpbnV4X2hlYWRlciB7CisJdV9pbnQ4X3QgIGFyY19zaG9zdDsKKwl1X2ludDhfdCAgYXJjX2Rob3N0OworCXVfaW50MTZfdCBhcmNfb2Zmc2V0OworCXVfaW50OF90ICBhcmNfdHlwZTsKKwkvKgorCSAqIG9ubHkgcHJlc2VudCBmb3IgbmV3c3R5bGUgZW5jb2Rpbmcgd2l0aCBMTCBmcmFnbWVudGF0aW9uLgorCSAqIERvbid0IHVzZSBzaXplb2YoYW55dGhpbmcpLCB1c2UgQVJDX0xJTlVYX0hEUnssTkVXfUxFTgorCSAqIGluc3RlYWQuCisJICovCisJdV9pbnQ4X3QgIGFyY19mbGFnOworCXVfaW50MTZfdCBhcmNfc2VxaWQ7Cit9OworCisjZGVmaW5lCUFSQ19MSU5VWF9IRFJMRU4JNQorI2RlZmluZQlBUkNfTElOVVhfSERSTkVXTEVOCTgKZGlmZiAtLWdpdCBhL2F0aW1lLmF3ayBiL2F0aW1lLmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDJkZWMyCi0tLSAvZGV2L251bGwKKysrIGIvYXRpbWUuYXdrCkBAIC0wLDAgKzEsMTggQEAKKyQ2IH4gL15hY2svICYmICQ1ICF+IC9bU0ZSXS8gCXsKKwkjIGdpdmVuIGEgdGNwZHVtcCBmdHAgdHJhY2UsIG91dHB1dCBvbmUgbGluZSBmb3IgZWFjaCBhY2sKKwkjIGluIHRoZSBmb3JtCisJIyAgIDxhY2sgdGltZT4gPHNlcSBubz4KKwkjIHdoZXJlIDxhY2sgdGltZT4gaXMgdGhlIHRpbWUgcGFja2V0IHdhcyBhY2tlZCAoaW4gc2Vjb25kcyB3aXRoCisJIyB6ZXJvIGF0IHRpbWUgb2YgZmlyc3QgcGFja2V0KSBhbmQgPHNlcSBubz4gaXMgdGhlIHRjcCBzZXF1ZW5jZQorCSMgbnVtYmVyIG9mIHRoZSBhY2sgZGl2aWRlZCBieSAxMDI0IChpLmUuLCBLYnl0ZXMgYWNrZWQpLgorCSMKKwkjIGNvbnZlcnQgdGltZSB0byBzZWNvbmRzCisJbiA9IHNwbGl0ICgkMSx0LCI6IikKKwl0aW0gPSB0WzFdKjM2MDAgKyB0WzJdKjYwICsgdFszXQorCWlmICghIHR6ZXJvKSB7CisJCXR6ZXJvID0gdGltCisJCU9GUyA9ICJcdCIKKwl9CisJIyBnZXQgcGFja2V0IHNlcXVlbmNlIG51bWJlcgorCXByaW50ZiAiJTcuMmZcdCVnXG4iLCB0aW0tdHplcm8sICQ3LzEwMjQKKwl9CmRpZmYgLS1naXQgYS9hdG0uaCBiL2F0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWM1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hdG0uaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEd1eSBIYXJyaXMuCisgKiAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQorICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCisgKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRoZSBuYW1lIG9mIEd1eSBIYXJyaXMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2F0bS5oLHYgMS4xLjQuMSAyMDA1LzA2LzIwIDA3OjQ1OjA1IGhhbm5lcyBFeHAgJAorICovCisKKy8qCisgKiBUcmFmZmljIHR5cGVzIGZvciBBVE0uCisgKi8KKyNkZWZpbmUgQVRNX1VOS05PV04JMAkvKiBVbmtub3duICovCisjZGVmaW5lIEFUTV9MQU5FCTEJLyogTEFORSAqLworI2RlZmluZSBBVE1fTExDCQkyCS8qIExMQyBlbmNhcHN1bGF0aW9uICovCisKKy8qCisgKiBzb21lIE9BTSBjZWxsIGNhcHR1cmVzIChtb3N0IG5vdGFibHkgSnVuaXBlcidzKQorICogZG8gbm90IGRlbGl2ZXIgYSBoZWFkaW5nIEhFQyBieXRlCisgKi8KKyNkZWZpbmUgQVRNX09BTV9OT0hFQyAgIDAKKyNkZWZpbmUgQVRNX09BTV9IRUMgICAgIDEKZGlmZiAtLWdpdCBhL2F0bXVuaTMxLmggYi9hdG11bmkzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDg1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hdG11bmkzMS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgWWVuIFllbiBMaW0gYW5kIE5vcnRoIERha290YSBTdGF0ZSBVbml2ZXJzaXR5CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgWWVuIFllbiBMaW0gYW5kCisgICAgICAgIE5vcnRoIERha290YSBTdGF0ZSBVbml2ZXJzaXR5CisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYXRtdW5pMzEuaCx2IDEuMiAyMDAyLzA4LzA1IDA3OjQ3OjIzIGd1eSBFeHAgJCAoTEJMKQorICovCisKKy8qIEJhc2VkIG9uIFVOSTMuMSBzdGFuZGFyZCBieSBBVE0gRm9ydW0gKi8KKworLyogQVRNIHRyYWZmaWMgdHlwZXMgYmFzZWQgb24gVlBJPTAgYW5kICh0aGUgZm9sbG93aW5nIFZDSSAqLworI2RlZmluZSBQUEMJCQkweDA1CS8qIFBvaW50LXRvLXBvaW50IHNpZ25hbCBtc2cgKi8KKyNkZWZpbmUgQkNDCQkJMHgwMgkvKiBCcm9hZGNhc3Qgc2lnbmFsIG1zZyAqLworI2RlZmluZSBPQU1GNFNDCQkJMHgwMwkvKiBTZWdtZW50IE9BTSBGNCBmbG93IGNlbGwgKi8KKyNkZWZpbmUgT0FNRjRFQwkJCTB4MDQJLyogRW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsICovCisjZGVmaW5lIE1FVEFDCQkJMHgwMQkvKiBNZXRhIHNpZ25hbCBtc2cgKi8KKyNkZWZpbmUgSUxNSUMJCQkweDEwCS8qIElMTUkgbXNnICovCisKKy8qIFEuMjkzMSBzaWduYWxsaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIENBTExfUFJPQ0VFRAkJMHgwMgkvKiBjYWxsIHByb2NlZWRpbmcgKi8KKyNkZWZpbmUgQ09OTkVDVAkJCTB4MDcJLyogY29ubmVjdCAqLworI2RlZmluZSBDT05ORUNUX0FDSwkJMHgwZgkvKiBjb25uZWN0X2FjayAqLworI2RlZmluZSBTRVRVUAkJCTB4MDUJLyogc2V0dXAgKi8KKyNkZWZpbmUgUkVMRUFTRQkJCTB4NGQJLyogcmVsZWFzZSAqLworI2RlZmluZSBSRUxFQVNFX0RPTkUJCTB4NWEJLyogcmVsZWFzZV9kb25lICovCisjZGVmaW5lIFJFU1RBUlQJCQkweDQ2CS8qIHJlc3RhcnQgKi8KKyNkZWZpbmUgUkVTVEFSVF9BQ0sJCTB4NGUJLyogcmVzdGFydCBhY2sgKi8KKyNkZWZpbmUgU1RBVFVTCQkJMHg3ZAkvKiBzdGF0dXMgKi8KKyNkZWZpbmUgU1RBVFVTX0VOUQkJMHg3NQkvKiBzdGF0dXMgYWNrICovCisjZGVmaW5lIEFERF9QQVJUWQkJMHg4MAkvKiBhZGQgcGFydHkgKi8KKyNkZWZpbmUgQUREX1BBUlRZX0FDSwkJMHg4MQkvKiBhZGQgcGFydHkgYWNrICovCisjZGVmaW5lIEFERF9QQVJUWV9SRUoJCTB4ODIJLyogYWRkIHBhcnR5IHJlaiAqLworI2RlZmluZSBEUk9QX1BBUlRZCQkweDgzCS8qIGRyb3AgcGFydHkgKi8KKyNkZWZpbmUgRFJPUF9QQVJUWV9BQ0sJCTB4ODQJLyogZHJvcCBwYXJ0eSBhY2sgKi8KKworLyogSW5mb3JtYXRpb24gRWxlbWVudCBQYXJhbWV0ZXJzIGluIHRoZSBzaWduYWxsaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIENBVVNFCQkJMHgwOAkvKiBjYXVzZSAqLworI2RlZmluZSBFTkRQVF9SRUYJCTB4NTQJLyogZW5kcG9pbnQgcmVmZXJlbmNlICovCisjZGVmaW5lIEFBTF9QQVJBCQkweDU4CS8qIEFUTSBhZGFwdGF0aW9uIGxheWVyIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVFJBRkZfREVTQ1JJUAkJMHg1OQkvKiBhdG0gdHJhZmZpYyBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBDT05ORUNUX0lECQkweDVhCS8qIGNvbm5lY3Rpb24gaWRlbnRpZmllciAqLworI2RlZmluZSBRT1NfUEFSQQkJMHg1YwkvKiBxdWFsaXR5IG9mIHNlcnZpY2UgcGFyYW1ldGVycyAqLworI2RlZmluZSBCX0hJR0hFUgkJMHg1ZAkvKiBicm9hZGJhbmQgaGlnaGVyIGxheWVyIGluZm9ybWF0aW9uICovCisjZGVmaW5lIEJfQkVBUkVSCQkweDVlCS8qIGJyb2FkYmFuZCBiZWFyZXIgY2FwYWJpbGl0eSAqLworI2RlZmluZSBCX0xPV0VSCQkJMHg1ZgkvKiBicm9hZGJhbmQgbG93ZXIgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgQ0FMTElOR19QQVJUWQkJMHg2YwkvKiBjYWxsaW5nIHBhcnR5IG51bWJlciAqLworI2RlZmluZSBDQUxMRURfUEFSVFkJCTB4NzAJLyogY2FsbGVkIHBhcnR5IG5tYmVyICovCisKKyNkZWZpbmUgUTI5MzEJCQkweDA5CisKKy8qIFEuMjkzMSBzaWduYWxsaW5nIGdlbmVyYWwgbWVzc2FnZXMgZm9ybWF0ICovCisjZGVmaW5lIFBST1RPX1BPUyAgICAgICAwCS8qIG9mZnNldCBvZiBwcm90b2NvbCBkaXNjcmltaW5hdG9yICovCisjZGVmaW5lIENBTExfUkVGX1BPUyAgICAyCS8qIG9mZnNldCBvZiBjYWxsIHJlZmVyZW5jZSB2YWx1ZSAqLworI2RlZmluZSBNU0dfVFlQRV9QT1MgICAgNQkvKiBvZmZzZXQgb2YgbWVzc2FnZSB0eXBlICovCisjZGVmaW5lIE1TR19MRU5fUE9TICAgICA3CS8qIG9mZnNldCBvZiBtZXNhZ2UgbGVuZ3RoICovCisjZGVmaW5lIElFX0JFR0lOX1BPUyAgICA5CS8qIG9mZnNldCBvZiBmaXJzdCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisKKy8qIGZvcm1hdCBvZiBzaWduYWxsaW5nIG1lc3NhZ2VzICovCisjZGVmaW5lIFRZUEVfUE9TCTAKKyNkZWZpbmUgTEVOX1BPUwkJMgorI2RlZmluZSBGSUVMRF9CRUdJTl9QT1MgNApkaWZmIC0tZ2l0IGEvYmdwLmggYi9iZ3AuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNmJlM2VhCi0tLSAvZGV2L251bGwKKysrIGIvYmdwLmgKQEAgLTAsMCArMSwxNyBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9iZ3AuaCx2IDEuMyAyMDA0LzA2LzE2IDA4OjQ1OjE1IGhhbm5lcyBFeHAgJCAoTEJMKSAqLworLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKK2V4dGVybiBjaGFyICpiZ3BfdnBuX3JkX3ByaW50IChjb25zdCB1X2NoYXIgKik7CmRpZmYgLS1naXQgYS9ib290cC5oIGIvYm9vdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzYzZDBjCi0tLSAvZGV2L251bGwKKysrIGIvYm9vdHAuaApAQCAtMCwwICsxLDIzMCBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ib290cC5oLHYgMS4xNS40LjMgMjAwNy8wOC8yMSAyMjowMjowOCBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBCb290c3RyYXAgUHJvdG9jb2wgKEJPT1RQKS4gIFJGQzk1MSBhbmQgUkZDMTA0OC4KKyAqCisgKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSAiaW1wbGVtZW50YXRpb24taW5kZXBlbmRlbnQiIEJPT1RQIHByb3RvY29sCisgKiBpbmZvcm1hdGlvbiB3aGljaCBpcyBjb21tb24gdG8gYm90aCBjbGllbnQgYW5kIHNlcnZlci4KKyAqCisgKiBDb3B5cmlnaHQgMTk4OCBieSBDYXJuZWdpZSBNZWxsb24uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0CisgKiBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKKyAqIHRoZSBuYW1lIG9mIENhcm5lZ2llIE1lbGxvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4gaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZworICogYW5kIGRpc3RyaWJ1dGlvbiBpcyBieSBwZXJtaXNzaW9uIG9mIENhcm5lZ2llIE1lbGxvbiBhbmQgU3RhbmZvcmQKKyAqIFVuaXZlcnNpdHkuICBDYXJuZWdpZSBNZWxsb24gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworCisKK3N0cnVjdCBib290cCB7CisJdV9pbnQ4X3QJYnBfb3A7CQkvKiBwYWNrZXQgb3Bjb2RlIHR5cGUgKi8KKwl1X2ludDhfdAlicF9odHlwZTsJLyogaGFyZHdhcmUgYWRkciB0eXBlICovCisJdV9pbnQ4X3QJYnBfaGxlbjsJLyogaGFyZHdhcmUgYWRkciBsZW5ndGggKi8KKwl1X2ludDhfdAlicF9ob3BzOwkvKiBnYXRld2F5IGhvcHMgKi8KKwl1X2ludDMyX3QJYnBfeGlkOwkJLyogdHJhbnNhY3Rpb24gSUQgKi8KKwl1X2ludDE2X3QJYnBfc2VjczsJLyogc2Vjb25kcyBzaW5jZSBib290IGJlZ2FuICovCisJdV9pbnQxNl90CWJwX2ZsYWdzOwkvKiBmbGFncyAtIHNlZSBib290cF9mbGFnX3ZhbHVlc1tdIGluIHByaW50LWJvb3RwLmMgKi8KKwlzdHJ1Y3QgaW5fYWRkcglicF9jaWFkZHI7CS8qIGNsaWVudCBJUCBhZGRyZXNzICovCisJc3RydWN0IGluX2FkZHIJYnBfeWlhZGRyOwkvKiAneW91cicgSVAgYWRkcmVzcyAqLworCXN0cnVjdCBpbl9hZGRyCWJwX3NpYWRkcjsJLyogc2VydmVyIElQIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW5fYWRkcglicF9naWFkZHI7CS8qIGdhdGV3YXkgSVAgYWRkcmVzcyAqLworCXVfaW50OF90CWJwX2NoYWRkclsxNl07CS8qIGNsaWVudCBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9pbnQ4X3QJYnBfc25hbWVbNjRdOwkvKiBzZXJ2ZXIgaG9zdCBuYW1lICovCisJdV9pbnQ4X3QJYnBfZmlsZVsxMjhdOwkvKiBib290IGZpbGUgbmFtZSAqLworCXVfaW50OF90CWJwX3ZlbmRbNjRdOwkvKiB2ZW5kb3Itc3BlY2lmaWMgYXJlYSAqLworfTsKKworLyoKKyAqIFVEUCBwb3J0IG51bWJlcnMsIHNlcnZlciBhbmQgY2xpZW50LgorICovCisjZGVmaW5lCUlQUE9SVF9CT09UUFMJCTY3CisjZGVmaW5lCUlQUE9SVF9CT09UUEMJCTY4CisKKyNkZWZpbmUgQk9PVFBSRVBMWQkJMgorI2RlZmluZSBCT09UUFJFUVVFU1QJCTEKKworLyoKKyAqIFZlbmRvciBtYWdpYyBjb29raWUgKHZfbWFnaWMpIGZvciBDTVUKKyAqLworI2RlZmluZSBWTV9DTVUJCSJDTVUiCisKKy8qCisgKiBWZW5kb3IgbWFnaWMgY29va2llICh2X21hZ2ljKSBmb3IgUkZDMTA0OAorICovCisjZGVmaW5lIFZNX1JGQzEwNDgJeyA5OSwgMTMwLCA4MywgOTkgfQorCisMCisKKy8qCisgKiBSRkMxMDQ4IHRhZyB2YWx1ZXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgaW5mb3JtYXRpb24gaXMgYmVpbmcgc3VwcGxpZWQgaW4KKyAqIHRoZSB2ZW5kb3IgZmllbGQgb2YgdGhlIHBhY2tldC4KKyAqLworCisjZGVmaW5lIFRBR19QQUQJCQkoKHVfaW50OF90KSAgIDApCisjZGVmaW5lIFRBR19TVUJORVRfTUFTSwkJKCh1X2ludDhfdCkgICAxKQorI2RlZmluZSBUQUdfVElNRV9PRkZTRVQJCSgodV9pbnQ4X3QpICAgMikKKyNkZWZpbmUgVEFHX0dBVEVXQVkJCSgodV9pbnQ4X3QpICAgMykKKyNkZWZpbmUgVEFHX1RJTUVfU0VSVkVSCQkoKHVfaW50OF90KSAgIDQpCisjZGVmaW5lIFRBR19OQU1FX1NFUlZFUgkJKCh1X2ludDhfdCkgICA1KQorI2RlZmluZSBUQUdfRE9NQUlOX1NFUlZFUgkoKHVfaW50OF90KSAgIDYpCisjZGVmaW5lIFRBR19MT0dfU0VSVkVSCQkoKHVfaW50OF90KSAgIDcpCisjZGVmaW5lIFRBR19DT09LSUVfU0VSVkVSCSgodV9pbnQ4X3QpICAgOCkKKyNkZWZpbmUgVEFHX0xQUl9TRVJWRVIJCSgodV9pbnQ4X3QpICAgOSkKKyNkZWZpbmUgVEFHX0lNUFJFU1NfU0VSVkVSCSgodV9pbnQ4X3QpICAxMCkKKyNkZWZpbmUgVEFHX1JMUF9TRVJWRVIJCSgodV9pbnQ4X3QpICAxMSkKKyNkZWZpbmUgVEFHX0hPU1ROQU1FCQkoKHVfaW50OF90KSAgMTIpCisjZGVmaW5lIFRBR19CT09UU0laRQkJKCh1X2ludDhfdCkgIDEzKQorI2RlZmluZSBUQUdfRU5ECQkJKCh1X2ludDhfdCkgMjU1KQorLyogUkZDMTQ5NyB0YWdzICovCisjZGVmaW5lCVRBR19EVU1QUEFUSAkJKCh1X2ludDhfdCkgIDE0KQorI2RlZmluZQlUQUdfRE9NQUlOTkFNRQkJKCh1X2ludDhfdCkgIDE1KQorI2RlZmluZQlUQUdfU1dBUF9TRVJWRVIJCSgodV9pbnQ4X3QpICAxNikKKyNkZWZpbmUJVEFHX1JPT1RQQVRICQkoKHVfaW50OF90KSAgMTcpCisjZGVmaW5lCVRBR19FWFRQQVRICQkoKHVfaW50OF90KSAgMTgpCisvKiBSRkMyMTMyICovCisjZGVmaW5lCVRBR19JUF9GT1JXQVJECQkoKHVfaW50OF90KSAgMTkpCisjZGVmaW5lCVRBR19OTF9TUkNSVAkJKCh1X2ludDhfdCkgIDIwKQorI2RlZmluZQlUQUdfUEZJTFRFUlMJCSgodV9pbnQ4X3QpICAyMSkKKyNkZWZpbmUJVEFHX1JFQVNTX1NJWkUJCSgodV9pbnQ4X3QpICAyMikKKyNkZWZpbmUJVEFHX0RFRl9UVEwJCSgodV9pbnQ4X3QpICAyMykKKyNkZWZpbmUJVEFHX01UVV9USU1FT1VUCQkoKHVfaW50OF90KSAgMjQpCisjZGVmaW5lCVRBR19NVFVfVEFCTEUJCSgodV9pbnQ4X3QpICAyNSkKKyNkZWZpbmUJVEFHX0lOVF9NVFUJCSgodV9pbnQ4X3QpICAyNikKKyNkZWZpbmUJVEFHX0xPQ0FMX1NVQk5FVFMJKCh1X2ludDhfdCkgIDI3KQorI2RlZmluZQlUQUdfQlJPQURfQUREUgkJKCh1X2ludDhfdCkgIDI4KQorI2RlZmluZQlUQUdfRE9fTUFTS19ESVNDCSgodV9pbnQ4X3QpICAyOSkKKyNkZWZpbmUJVEFHX1NVUFBMWV9NQVNLCQkoKHVfaW50OF90KSAgMzApCisjZGVmaW5lCVRBR19ET19SRElTQwkJKCh1X2ludDhfdCkgIDMxKQorI2RlZmluZQlUQUdfUlRSX1NPTF9BRERSCSgodV9pbnQ4X3QpICAzMikKKyNkZWZpbmUJVEFHX1NUQVRJQ19ST1VURQkoKHVfaW50OF90KSAgMzMpCisjZGVmaW5lCVRBR19VU0VfVFJBSUxFUlMJKCh1X2ludDhfdCkgIDM0KQorI2RlZmluZQlUQUdfQVJQX1RJTUVPVVQJCSgodV9pbnQ4X3QpICAzNSkKKyNkZWZpbmUJVEFHX0VUSF9FTkNBUAkJKCh1X2ludDhfdCkgIDM2KQorI2RlZmluZQlUQUdfVENQX1RUTAkJKCh1X2ludDhfdCkgIDM3KQorI2RlZmluZQlUQUdfVENQX0tFRVBBTElWRQkoKHVfaW50OF90KSAgMzgpCisjZGVmaW5lCVRBR19LRUVQQUxJVkVfR08JKCh1X2ludDhfdCkgIDM5KQorI2RlZmluZQlUQUdfTklTX0RPTUFJTgkJKCh1X2ludDhfdCkgIDQwKQorI2RlZmluZQlUQUdfTklTX1NFUlZFUlMJCSgodV9pbnQ4X3QpICA0MSkKKyNkZWZpbmUJVEFHX05UUF9TRVJWRVJTCQkoKHVfaW50OF90KSAgNDIpCisjZGVmaW5lCVRBR19WRU5ET1JfT1BUUwkJKCh1X2ludDhfdCkgIDQzKQorI2RlZmluZQlUQUdfTkVUQklPU19OUwkJKCh1X2ludDhfdCkgIDQ0KQorI2RlZmluZQlUQUdfTkVUQklPU19ERFMJCSgodV9pbnQ4X3QpICA0NSkKKyNkZWZpbmUJVEFHX05FVEJJT1NfTk9ERQkoKHVfaW50OF90KSAgNDYpCisjZGVmaW5lCVRBR19ORVRCSU9TX1NDT1BFCSgodV9pbnQ4X3QpICA0NykKKyNkZWZpbmUJVEFHX1hXSU5fRlMJCSgodV9pbnQ4X3QpICA0OCkKKyNkZWZpbmUJVEFHX1hXSU5fRE0JCSgodV9pbnQ4X3QpICA0OSkKKyNkZWZpbmUJVEFHX05JU19QX0RPTUFJTgkoKHVfaW50OF90KSAgNjQpCisjZGVmaW5lCVRBR19OSVNfUF9TRVJWRVJTCSgodV9pbnQ4X3QpICA2NSkKKyNkZWZpbmUJVEFHX01PQklMRV9IT01FCQkoKHVfaW50OF90KSAgNjgpCisjZGVmaW5lCVRBR19TTVBUX1NFUlZFUgkJKCh1X2ludDhfdCkgIDY5KQorI2RlZmluZQlUQUdfUE9QM19TRVJWRVIJCSgodV9pbnQ4X3QpICA3MCkKKyNkZWZpbmUJVEFHX05OVFBfU0VSVkVSCQkoKHVfaW50OF90KSAgNzEpCisjZGVmaW5lCVRBR19XV1dfU0VSVkVSCQkoKHVfaW50OF90KSAgNzIpCisjZGVmaW5lCVRBR19GSU5HRVJfU0VSVkVSCSgodV9pbnQ4X3QpICA3MykKKyNkZWZpbmUJVEFHX0lSQ19TRVJWRVIJCSgodV9pbnQ4X3QpICA3NCkKKyNkZWZpbmUJVEFHX1NUUkVFVFRBTEtfU1JWUgkoKHVfaW50OF90KSAgNzUpCisjZGVmaW5lCVRBR19TVFJFRVRUQUxLX1NUREEJKCh1X2ludDhfdCkgIDc2KQorLyogREhDUCBvcHRpb25zICovCisjZGVmaW5lCVRBR19SRVFVRVNURURfSVAJKCh1X2ludDhfdCkgIDUwKQorI2RlZmluZQlUQUdfSVBfTEVBU0UJCSgodV9pbnQ4X3QpICA1MSkKKyNkZWZpbmUJVEFHX09QVF9PVkVSTE9BRAkoKHVfaW50OF90KSAgNTIpCisjZGVmaW5lCVRBR19URlRQX1NFUlZFUgkJKCh1X2ludDhfdCkgIDY2KQorI2RlZmluZQlUQUdfQk9PVEZJTEVOQU1FCSgodV9pbnQ4X3QpICA2NykKKyNkZWZpbmUJVEFHX0RIQ1BfTUVTU0FHRQkoKHVfaW50OF90KSAgNTMpCisjZGVmaW5lCVRBR19TRVJWRVJfSUQJCSgodV9pbnQ4X3QpICA1NCkKKyNkZWZpbmUJVEFHX1BBUk1fUkVRVUVTVAkoKHVfaW50OF90KSAgNTUpCisjZGVmaW5lCVRBR19NRVNTQUdFCQkoKHVfaW50OF90KSAgNTYpCisjZGVmaW5lCVRBR19NQVhfTVNHX1NJWkUJKCh1X2ludDhfdCkgIDU3KQorI2RlZmluZQlUQUdfUkVORVdBTF9USU1FCSgodV9pbnQ4X3QpICA1OCkKKyNkZWZpbmUJVEFHX1JFQklORF9USU1FCQkoKHVfaW50OF90KSAgNTkpCisjZGVmaW5lCVRBR19WRU5ET1JfQ0xBU1MJKCh1X2ludDhfdCkgIDYwKQorI2RlZmluZQlUQUdfQ0xJRU5UX0lECQkoKHVfaW50OF90KSAgNjEpCisvKiBSRkMgMjI0MSAqLworI2RlZmluZQlUQUdfTkRTX1NFUlZFUlMJCSgodV9pbnQ4X3QpICA4NSkKKyNkZWZpbmUJVEFHX05EU19UUkVFX05BTUUJKCh1X2ludDhfdCkgIDg2KQorI2RlZmluZQlUQUdfTkRTX0NPTlRFWFQJCSgodV9pbnQ4X3QpICA4NykKKy8qIFJGQyAyMjQyICovCisjZGVmaW5lCVRBR19ORFNfSVBET01BSU4JKCh1X2ludDhfdCkgIDYyKQorI2RlZmluZQlUQUdfTkRTX0lQSU5GTwkJKCh1X2ludDhfdCkgIDYzKQorLyogUkZDIDI0ODUgKi8KKyNkZWZpbmUJVEFHX09QRU5fR1JPVVBfVUFQCSgodV9pbnQ4X3QpICA5OCkKKy8qIFJGQyAyNTYzICovCisjZGVmaW5lCVRBR19ESVNBQkxFX0FVVE9DT05GCSgodV9pbnQ4X3QpIDExNikKKy8qIFJGQyAyNjEwICovCisjZGVmaW5lCVRBR19TTFBfREEJCSgodV9pbnQ4X3QpICA3OCkKKyNkZWZpbmUJVEFHX1NMUF9TQ09QRQkJKCh1X2ludDhfdCkgIDc5KQorLyogUkZDIDI5MzcgKi8KKyNkZWZpbmUJVEFHX05TX1NFQVJDSAkJKCh1X2ludDhfdCkgMTE3KQorLyogUkZDIDMwMTEgKi8KKyNkZWZpbmUJVEFHX0lQNF9TVUJORVRfU0VMRUNUCSgodV9pbnQ4X3QpIDExOCkKKy8qIFJGQyAzNDQyICovCisjZGVmaW5lIFRBR19DTEFTU0xFU1NfU1RBVElDX1JUCSgodV9pbnQ4X3QpIDEyMSkKKyNkZWZpbmUgVEFHX0NMQVNTTEVTU19TVEFfUlRfTVMJKCh1X2ludDhfdCkgMjQ5KQorLyogZnRwOi8vZnRwLmlzaS5lZHUvLi4uL2Fzc2lnbm1lbnRzL2Jvb3RwLWRoY3AtZXh0ZW5zaW9ucyAqLworI2RlZmluZQlUQUdfVVNFUl9DTEFTUwkJKCh1X2ludDhfdCkgIDc3KQorI2RlZmluZQlUQUdfU0xQX05BTUlOR19BVVRICSgodV9pbnQ4X3QpICA4MCkKKyNkZWZpbmUJVEFHX0NMSUVOVF9GUUROCQkoKHVfaW50OF90KSAgODEpCisjZGVmaW5lCVRBR19BR0VOVF9DSVJDVUlUCSgodV9pbnQ4X3QpICA4MikKKyNkZWZpbmUJVEFHX0FHRU5UX1JFTU9URQkoKHVfaW50OF90KSAgODMpCisjZGVmaW5lCVRBR19BR0VOVF9NQVNLCQkoKHVfaW50OF90KSAgODQpCisjZGVmaW5lCVRBR19UWl9TVFJJTkcJCSgodV9pbnQ4X3QpICA4OCkKKyNkZWZpbmUJVEFHX0ZRRE5fT1BUSU9OCQkoKHVfaW50OF90KSAgODkpCisjZGVmaW5lCVRBR19BVVRICQkoKHVfaW50OF90KSAgOTApCisjZGVmaW5lCVRBR19WSU5FU19TRVJWRVJTCSgodV9pbnQ4X3QpICA5MSkKKyNkZWZpbmUJVEFHX1NFUlZFUl9SQU5LCQkoKHVfaW50OF90KSAgOTIpCisjZGVmaW5lCVRBR19DTElFTlRfQVJDSAkJKCh1X2ludDhfdCkgIDkzKQorI2RlZmluZQlUQUdfQ0xJRU5UX05ESQkJKCh1X2ludDhfdCkgIDk0KQorI2RlZmluZQlUQUdfQ0xJRU5UX0dVSUQJCSgodV9pbnQ4X3QpICA5NykKKyNkZWZpbmUJVEFHX0xEQVBfVVJMCQkoKHVfaW50OF90KSAgOTUpCisjZGVmaW5lCVRBR182T1ZFUjQJCSgodV9pbnQ4X3QpICA5NikKKyNkZWZpbmUJVEFHX1BSSU5URVJfTkFNRQkoKHVfaW50OF90KSAxMDApCisjZGVmaW5lCVRBR19NREhDUF9TRVJWRVIJKCh1X2ludDhfdCkgMTAxKQorI2RlZmluZQlUQUdfSVBYX0NPTVBBVAkJKCh1X2ludDhfdCkgMTEwKQorI2RlZmluZQlUQUdfTkVUSU5GT19QQVJFTlQJKCh1X2ludDhfdCkgMTEyKQorI2RlZmluZQlUQUdfTkVUSU5GT19QQVJFTlRfVEFHCSgodV9pbnQ4X3QpIDExMykKKyNkZWZpbmUJVEFHX1VSTAkJCSgodV9pbnQ4X3QpIDExNCkKKyNkZWZpbmUJVEFHX0ZBSUxPVkVSCQkoKHVfaW50OF90KSAxMTUpCisjZGVmaW5lCVRBR19FWFRFTkRFRF9SRVFVRVNUCSgodV9pbnQ4X3QpIDEyNikKKyNkZWZpbmUJVEFHX0VYVEVOREVEX09QVElPTgkoKHVfaW50OF90KSAxMjcpCisKKworLyogREhDUCBNZXNzYWdlIHR5cGVzICh2YWx1ZXMgZm9yIFRBR19ESENQX01FU1NBR0Ugb3B0aW9uKSAqLworI2RlZmluZQkJREhDUERJU0NPVkVSCTEKKyNkZWZpbmUJCURIQ1BPRkZFUgkyCisjZGVmaW5lCQlESENQUkVRVUVTVAkzCisjZGVmaW5lCQlESENQREVDTElORQk0CisjZGVmaW5lCQlESENQQUNLCQk1CisjZGVmaW5lCQlESENQTkFLCQk2CisjZGVmaW5lCQlESENQUkVMRUFTRQk3CisjZGVmaW5lCQlESENQSU5GT1JNCTgKKworCisvKgorICogInZlbmRvciIgZGF0YSBwZXJtaXR0ZWQgZm9yIENNVSBib290cCBjbGllbnRzLgorICovCisKK3N0cnVjdCBjbXVfdmVuZCB7CisJdV9pbnQ4X3QJdl9tYWdpY1s0XTsJLyogbWFnaWMgbnVtYmVyICovCisJdV9pbnQzMl90CXZfZmxhZ3M7CS8qIGZsYWdzL29wY29kZXMsIGV0Yy4gKi8KKwlzdHJ1Y3QgaW5fYWRkcgl2X3NtYXNrOwkvKiBTdWJuZXQgbWFzayAqLworCXN0cnVjdCBpbl9hZGRyCXZfZGdhdGU7CS8qIERlZmF1bHQgZ2F0ZXdheSAqLworCXN0cnVjdCBpbl9hZGRyCXZfZG5zMSwgdl9kbnMyOyAvKiBEb21haW4gbmFtZSBzZXJ2ZXJzICovCisJc3RydWN0IGluX2FkZHIJdl9pbnMxLCB2X2luczI7IC8qIElFTi0xMTYgbmFtZSBzZXJ2ZXJzICovCisJc3RydWN0IGluX2FkZHIJdl90czEsIHZfdHMyOwkvKiBUaW1lIHNlcnZlcnMgKi8KKwl1X2ludDhfdAl2X3VudXNlZFsyNF07CS8qIGN1cnJlbnRseSB1bnVzZWQgKi8KK307CisKKworLyogdl9mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUgVkZfU01BU0sJMQkvKiBTdWJuZXQgbWFzayBmaWVsZCBjb250YWlucyB2YWxpZCBkYXRhICovCisKKy8qIFJGQyA0NzAyIERIQ1AgQ2xpZW50IEZRRE4gT3B0aW9uICovCisKKyNkZWZpbmUgQ0xJRU5UX0ZRRE5fRkxBR1NfUwkweDAxCisjZGVmaW5lIENMSUVOVF9GUUROX0ZMQUdTX08JMHgwMgorI2RlZmluZSBDTElFTlRfRlFETl9GTEFHU19FCTB4MDQKKyNkZWZpbmUgQ0xJRU5UX0ZRRE5fRkxBR1NfTgkweDA4CmRpZmYgLS1naXQgYS9icGZfZHVtcC5jIGIvYnBmX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FkNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYnBmX2R1bXAuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2JwZl9kdW1wLmMsdiAxLjE2IDIwMDMvMTEvMTYgMDk6MzY6MDggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKwordm9pZAorYnBmX2R1bXAoc3RydWN0IGJwZl9wcm9ncmFtICpwLCBpbnQgb3B0aW9uKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKKwlpbnQgaTsKKwlpbnQgbiA9IHAtPmJmX2xlbjsKKworCWluc24gPSBwLT5iZl9pbnNuczsKKwlpZiAob3B0aW9uID4gMikgeworCQlwcmludGYoIiVkXG4iLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKSB7CisJCQlwcmludGYoIiV1ICV1ICV1ICV1XG4iLCBpbnNuLT5jb2RlLAorCQkJICAgICAgIGluc24tPmp0LCBpbnNuLT5qZiwgaW5zbi0+ayk7CisJCX0KKwkJcmV0dXJuIDsKKwl9CisJaWYgKG9wdGlvbiA+IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKQorCQkJcHJpbnRmKCJ7IDB4JXgsICVkLCAlZCwgMHglMDh4IH0sXG4iLAorCQkJICAgICAgIGluc24tPmNvZGUsIGluc24tPmp0LCBpbnNuLT5qZiwgaW5zbi0+ayk7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKSB7CisjaWZkZWYgQkRFQlVHCisJCWV4dGVybiBpbnQgYmlkc1tdOworCQlwcmludGYoYmlkc1tpXSA+IDAgPyAiWyUwMmRdIiA6ICIgLS0gIiwgYmlkc1tpXSAtIDEpOworI2VuZGlmCisJCXB1dHMoYnBmX2ltYWdlKGluc24sIGkpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9jaGRsYy5oIGIvY2hkbGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI2ZTFkCi0tLSAvZGV2L251bGwKKysrIGIvY2hkbGMuaApAQCAtMCwwICsxLDI3IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2NoZGxjLmgsdiAxLjEgMjAwMC8wOS8xOCAwNToxMTo0MyBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjZGVmaW5lIENIRExDX0hEUkxFTiAJCTQKKyNkZWZpbmUgQ0hETENfVU5JQ0FTVAkJMHgwZgorI2RlZmluZSBDSERMQ19CQ0FTVAkJMHg4ZgorI2RlZmluZSBDSERMQ19UWVBFX1NMQVJQCTB4ODAzNQorI2RlZmluZSBDSERMQ19UWVBFX0NEUAkJMHgyMDAwCmRpZmYgLS1naXQgYS9jb25maWcuZ3Vlc3MgYi9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGM1YmRlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5ndWVzcwpAQCAtMCwwICsxLDE0MjkgQEAKKyMhIC9iaW4vc2gKKyMgQXR0ZW1wdCB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZS4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDAzLTEwLTE2JworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPHBlckBib3RobmVyLmNvbT4uCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCisjCisjIFRoaXMgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lIHNpbWlsYXIgdG8KKyMgY29uZmlnLnN1Yi4gIElmIGl0IHN1Y2NlZWRzLCBpdCBwcmludHMgdGhlIHN5c3RlbSBuYW1lIG9uIHN0ZG91dCwgYW5kCisjIGV4aXRzIHdpdGggMC4gIE90aGVyd2lzZSwgaXQgZXhpdHMgd2l0aCAxLgorIworIyBUaGUgcGxhbiBpcyB0aGF0IHRoaXMgY2FuIGJlIGNhbGxlZCBieSBjb25maWd1cmUgc2NyaXB0cyBpZiB5b3UKKyMgZG9uJ3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBidWlsZCBzeXN0ZW0gdHlwZS4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCAwIDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgMCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCAwIDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIgPiYyCisgICAgICAgZXhpdCAxIDs7CisgICAgKiApCisgICAgICAgYnJlYWsgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgIGV4aXQgMQorZmkKKwordHJhcCAnZXhpdCAxJyAxIDIgMTUKKworIyBDQ19GT1JfQlVJTEQgLS0gY29tcGlsZXIgdXNlZCBieSB0aGlzIHNjcmlwdC4gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgYQorIyBjb21waWxlciB0byBhaWQgaW4gc3lzdGVtIGRldGVjdGlvbiBpcyBkaXNjb3VyYWdlZCBhcyBpdCByZXF1aXJlcworIyB0ZW1wb3JhcnkgZmlsZXMgdG8gYmUgY3JlYXRlZCBhbmQsIGFzIHlvdSBjYW4gc2VlIGJlbG93LCBpdCBpcyBhCisjIGhlYWRhY2hlIHRvIGRlYWwgd2l0aCBpbiBhIHBvcnRhYmxlIGZhc2hpb24uCisKKyMgSGlzdG9yaWNhbGx5LCBgQ0NfRk9SX0JVSUxEJyB1c2VkIHRvIGJlIG5hbWVkIGBIT1NUX0NDJy4gV2Ugc3RpbGwKKyMgdXNlIGBIT1NUX0NDJyBpZiBkZWZpbmVkLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4KKworIyBQb3J0YWJsZSB0bXAgZGlyZWN0b3J5IGNyZWF0aW9uIGluc3BpcmVkIGJ5IHRoZSBBdXRvY29uZiB0ZWFtLgorCitzZXRfY2NfZm9yX2J1aWxkPScKK3RyYXAgImV4aXRjb2RlPVwkPzsgKHJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsKSAmJiBleGl0IFwkZXhpdGNvZGUiIDAgOwordHJhcCAicm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGw7IGV4aXQgMSIgMSAyIDEzIDE1IDsKKzogJHtUTVBESVI9L3RtcH0gOworIHsgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAtcSAiJFRNUERJUi9jZ1hYWFhYWCIpIDI+L2Rldi9udWxsYCAmJiB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIiA7IH0gfHwKKyB7IHRlc3QgLW4gIiRSQU5ET00iICYmIHRtcD0kVE1QRElSL2NnJCQtJFJBTkRPTSAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApIDsgfSB8fAorIHsgdG1wPSRUTVBESVIvY2ctJCQgJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSAmJiBlY2hvICJXYXJuaW5nOiBjcmVhdGluZyBpbnNlY3VyZSB0ZW1wIGRpcmVjdG9yeSIgPiYyIDsgfSB8fAorIHsgZWNobyAiJG1lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSIiA+JjIgOyBleGl0IDEgOyB9IDsKK2R1bW15PSR0bXAvZHVtbXkgOwordG1wZmlsZXM9IiRkdW1teS5jICRkdW1teS5vICRkdW1teS5yZWwgJGR1bW15IiA7CitjYXNlICRDQ19GT1JfQlVJTEQsJEhPU1RfQ0MsJENDIGluCisgLCwpICAgIGVjaG8gImludCB4OyIgPiAkZHVtbXkuYyA7CisJZm9yIGMgaW4gY2MgZ2NjIGM4OSBjOTkgOyBkbworCSAgaWYgKCRjIC1jIC1vICRkdW1teS5vICRkdW1teS5jKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJICAgICBDQ19GT1JfQlVJTEQ9IiRjIjsgYnJlYWsgOworCSAgZmkgOworCWRvbmUgOworCWlmIHRlc3QgeCIkQ0NfRk9SX0JVSUxEIiA9IHggOyB0aGVuCisJICBDQ19GT1JfQlVJTEQ9bm9fY29tcGlsZXJfZm91bmQgOworCWZpCisJOzsKKyAsLCopICAgQ0NfRk9SX0JVSUxEPSRDQyA7OworICwqLCopICBDQ19GT1JfQlVJTEQ9JEhPU1RfQ0MgOzsKK2VzYWMgOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCBfX0VMRl9fID4vZGV2L251bGwKKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCAwIDs7CisgICAgYW1pZ2E6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTY4azpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG12bWU4OGs6T3BlbkJTRDoqOiopCisJZWNobyBtODhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lcHBjOk9wZW5CU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcGVnYXNvczpPcGVuQlNEOio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBtYXg6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlYi11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuMzpPcGVuQlNEOio6KikKKwllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHdncmlzYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpPcGVuQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGFscGhhOk9TRjE6KjoqKQorCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwlmaQorCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgorCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCisJIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCisJIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWRlYy1vc2ZgZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL15bVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDAgOzsKKyAgICBBbHBoYSo6T3BlblZNUzoqOiopCisJZWNobyBhbHBoYS1ocC12bXMKKwlleGl0IDAgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICAyMTA2NDpXaW5kb3dzX05UOjUwOjMpCisJZWNobyBhbHBoYS1kZWMtd2lubnQzLjUKKwlleGl0IDAgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgMDs7CisgICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCisJZXhpdCAwIDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCAwIDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDAgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgMCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDA7OworICAgIFB5cmFtaWQqOk9TeCo6KjoqIHwgTUlTKjpPU3gqOio6KiB8IE1JUyo6U01QX0RDLU9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgMCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgMCA7OworICAgIERSUz82MDAwOlVOSVhfU1Y6NC4yKjo3KikKKwljYXNlIGAvdXNyL2Jpbi91bmFtZSAtcGAgaW4KKwkgICAgc3BhcmMpIGVjaG8gc3BhcmMtaWNsLW54NyAmJiBleGl0IDAgOzsKKwllc2FjIDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzo1Lio6KiB8IHRhZHBvbGUqOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgaTg2cGM6U3VuT1M6NS4qOiopCisJZWNobyBpMzg2LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6Nio6KikKKwkjIEFjY29yZGluZyB0byBjb25maWcuc3ViLCB0aGlzIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGNhbm9uaWNhbGl6ZQorCSMgU3VuT1M2LiAgSGFyZCB0byBndWVzcyBleGFjdGx5IHdoYXQgU3VuT1M2IHdpbGwgYmUgbGlrZSwgYnV0CisJIyBpdCdzIGxpa2VseSB0byBiZSBtb3JlIGxpa2UgU29sYXJpcyB0aGFuIFN1bk9TNC4KKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzM2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCAwIDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3VuKjoqOjQuMkJTRDoqKQorCVVOQU1FX1JFTEVBU0U9YChzZWQgMXEgL2V0Yy9tb3RkIHwgYXdrICd7cHJpbnQgc3Vic3RyKCQ1LDEsMyl9JykgMj4vZGV2L251bGxgCisJdGVzdCAieCR7VU5BTUVfUkVMRUFTRX0iID0gIngiICYmIFVOQU1FX1JFTEVBU0U9MworCWNhc2UgImAvYmluL2FyY2hgIiBpbgorCSAgICBzdW4zKQorCQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCSAgICBzdW40KQorCQllY2hvIHNwYXJjLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwllc2FjCisJZXhpdCAwIDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6Kk1pTlQ6KjoqIHwgYXRhcmkqOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCisJZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgMCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICBoYWRlcyo6Kk1pTlQ6KjoqIHwgaGFkZXMqOiptaW50Oio6KiB8ICpoYWRlcyo6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1oYWRlcy1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDAgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCAwIDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSSVNDKjpNYWNoOio6KikKKwllY2hvIG1pcHMtZGVjLW1hY2hfYnNkNC4zCisJZXhpdCAwIDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgMjAyMDpDTElYOio6KiB8IDI0MzA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyBcCisJICAmJiAkZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAorCSAgJiYgZXhpdCAwCisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDAgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCAwIDs7CisgICAgTmlnaHRfSGF3azoqOio6UG93ZXJNQVhfT1MgfCBTeW5lcmd5OlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCAwIDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgMCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjQqOlI0KikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgCWV4aXQgMCA7OworICAgIE04OCo6RG9scGhpbk9TOio6KikJIyBEb2xwaGluT1MgKFNWUjMpCisJZWNobyBtODhrLWRvbHBoaW4tc3lzdjMKKwlleGl0IDAgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgMCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBUZWs0M1swLTldWzAtOV06VVRlazoqOiopICMgVGVrdHJvbml4IDQzMDAgc3lzdGVtIHJ1bm5pbmcgVVRlayAoQlNEKQorCWVjaG8gbTY4ay10ZWt0cm9uaXgtYnNkCisJZXhpdCAwIDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgMCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDAgOzsgICAgICAgICAgICAgICMgTm90ZSB0aGF0OiBlY2hvICInYHVuYW1lIC1zYCciIGdpdmVzICdBSVggJworICAgIGkqODY6QUlYOio6KikKKwllY2hvIGkzODYtaWJtLWFpeAorCWV4aXQgMCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDAgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgJGR1bW15ICYmIGV4aXQgMAorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgMCA7OworICAgICo6QUlYOio6WzQ1XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCAwIDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDAgOzsKKyAgICBpYm1ydDo0LjRCU0Q6Knxyb21wLWlibTpCU0Q6KikKKwllY2hvIHJvbXAtaWJtLWJzZDQuNAorCWV4aXQgMCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgMCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDAgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzRdPz86NC4zYnNkOjEuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2QKKwlleGl0IDAgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgICMgYXZvaWQgZG91YmxlIGV2YWx1YXRpb24gb2YgJHNldF9jY19mb3JfYnVpbGQKKwkgICAgdGVzdCAtbiAiJENDX0ZPUl9CVUlMRCIgfHwgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtKSB8IGdyZXAgX19MUDY0X18gPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDAgOzsKKyAgICBpYTY0OkhQLVVYOio6KikKKwlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKKwllY2hvIGlhNjQtaHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCAwIDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgJGR1bW15ICYmIGV4aXQgMAorCWVjaG8gdW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIKKwlleGl0IDAgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgMCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgMCA7OworICAgICo5Pz8qOk1QRS9pWDoqOiogfCAqMzAwMCo6TVBFL2lYOio6KikKKwllY2hvIGhwcGExLjAtaHAtbXBlaXgKKwlleGl0IDAgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCAwIDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGkqODY6T1NGMToqOiopCisJaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKKwlmaQorCWV4aXQgMCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDAgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDAgOzsKKyAgICBDMio6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMyKjoqKQorCWlmIGdldHN5c2luZm8gLWYgc2NhbGFyX2FjYworCXRoZW4gZWNobyBjMzItY29udmV4LWJzZAorCWVsc2UgZWNobyBjMi1jb252ZXgtYnNkCisJZmkKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDNCo6KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgMCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCAwIDs7CisgICAgKjpVTklDT1MvbXA6KjoqKQorCWVjaG8gbnYxLWNyYXktdW5pY29zbXAke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDAgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgMCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCAwIDs7CisgICAgaSo4NjpCU0QvMzg2Oio6KiB8IGkqODY6QlNEL09TOio6KiB8ICo6QXNjZW5kXCBFbWJlZGRlZC9PUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpGcmVlQlNEOio6KikKKwkjIERldGVybWluZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGNvbXBpbGVyIHVzZXMgZ2xpYmMuCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmIF9fR0xJQkNfXyA+PSAyCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9CisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeTElCQz1gCisJIyBHTlUvS0ZyZWVCU0Qgc3lzdGVtcyBoYXZlIGEgImsiIHByZWZpeCB0byBpbmRpY2F0ZSB3ZSBhcmUgdXNpbmcKKwkjIEZyZWVCU0QncyBrZXJuZWwsIGJ1dCBub3QgdGhlIGNvbXBsZXRlIE9TLgorCWNhc2UgJHtMSUJDfSBpbiBnbnUpIGtlcm5lbF9vbmx5PSdrJyA7OyBlc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tJHtrZXJuZWxfb25seX1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCR7TElCQzorLSRMSUJDfQorCWV4aXQgMCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtY3lnd2luCisJZXhpdCAwIDs7CisgICAgaSo6TUlOR1cqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbmd3MzIKKwlleGl0IDAgOzsKKyAgICBpKjpQVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcHczMgorCWV4aXQgMCA7OworICAgIHg4NjpJbnRlcml4KjpbMzRdKikKKwllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1wuLiovLycKKwlleGl0IDAgOzsKKyAgICBbMzQ1XTg2OldpbmRvd3NfOTU6KiB8IFszNDVdODY6V2luZG93c185ODoqIHwgWzM0NV04NjpXaW5kb3dzX05UOiopCisJZWNobyBpJHtVTkFNRV9NQUNISU5FfS1wYy1ta3MKKwlleGl0IDAgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDAgOzsKKyAgICBpKjpVV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCisJZXhpdCAwIDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCAwIDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgICo6R05VOio6KikKKwkjIHRoZSBHTlUgc3lzdGVtCisJZWNobyBgZWNobyAke1VOQU1FX01BQ0hJTkV9fHNlZCAtZSAncyxbLS9dLiokLCwnYC11bmtub3duLWdudWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLC8uKiQsLCdgCisJZXhpdCAwIDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDAgOzsKKyAgICBpKjg2Ok1pbml4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKKwlleGl0IDAgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBtaXBzOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmIG1pcHMKKwkjdW5kZWYgbWlwc2VsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwc2VsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT1taXBzCisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCisJOzsKKyAgICBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgbWlwczY0CisJI3VuZGVmIG1pcHM2NGVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9bWlwczY0ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPW1pcHM2NAorCSNlbHNlCisJQ1BVPQorCSNlbmRpZgorCSNlbmRpZgorRU9GCisJZXZhbCBgJENDX0ZPUl9CVUlMRCAtRSAkZHVtbXkuYyAyPi9kZXYvbnVsbCB8IGdyZXAgXkNQVT1gCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiBlY2hvICIke0NQVX0tdW5rbm93bi1saW51eC1nbnUiICYmIGV4aXQgMAorCTs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBhbHBoYTpMaW51eDoqOiopCisJY2FzZSBgc2VkIC1uICcvXmNwdSBtb2RlbC9zL14uKjogXCguKlwpL1wxL3AnIDwgL3Byb2MvY3B1aW5mb2AgaW4KKwkgIEVWNSkgICBVTkFNRV9NQUNISU5FPWFscGhhZXY1IDs7CisJICBFVjU2KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NTYgOzsKKwkgIFBDQTU2KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIFBDQTU3KSBVTkFNRV9NQUNISU5FPWFscGhhcGNhNTYgOzsKKwkgIEVWNikgICBVTkFNRV9NQUNISU5FPWFscGhhZXY2IDs7CisJICBFVjY3KSAgVU5BTUVfTUFDSElORT1hbHBoYWV2NjcgOzsKKwkgIEVWNjgqKSBVTkFNRV9NQUNISU5FPWFscGhhZXY2OCA7OworICAgICAgICBlc2FjCisJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyAvYmluL3NoIHwgZ3JlcCBsZC5zby4xID4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDAgOzsKKyAgICBwYXJpc2M6TGludXg6KjoqIHwgaHBwYTpMaW51eDoqOiopCisJIyBMb29rIGZvciBDUFUgbGV2ZWwKKwljYXNlIGBncmVwICdeY3B1W15hLXpdKjonIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwgfCBjdXQgLWQnICcgLWYyYCBpbgorCSAgUEE3KikgZWNobyBocHBhMS4xLXVua25vd24tbGludXgtZ251IDs7CisJICBQQTgqKSBlY2hvIGhwcGEyLjAtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgICopICAgIGVjaG8gaHBwYS11bmtub3duLWxpbnV4LWdudSA7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgMCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgc2gqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDAgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCAwIDs7CisgICAgaSo4NjpMaW51eDoqOiopCisJIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KKwkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuIGNkIHRvIHRoZSByb290IGRpcmVjdG9yeSB0byBwcmV2ZW50CisJIyBwcm9ibGVtcyB3aXRoIG90aGVyIHByb2dyYW1zIG9yIGRpcmVjdG9yaWVzIGNhbGxlZCBgbGQnIGluIHRoZSBwYXRoLgorCSMgU2V0IExDX0FMTD1DIHRvIGVuc3VyZSBsZCBvdXRwdXRzIG1lc3NhZ2VzIGluIEVuZ2xpc2guCisJbGRfc3VwcG9ydGVkX3RhcmdldHM9YGNkIC87IExDX0FMTD1DIGxkIC0taGVscCAyPiYxIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgdGFyZ2V0czovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgdGFyZ2V0czogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfdGFyZ2V0cyIgaW4KKwkgIGVsZjMyLWkzODYpCisJCVRFTlRBVElWRT0iJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnUiCisJCTs7CisJICBhLm91dC1pMzg2LWxpbnV4KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiCisJCWV4aXQgMCA7OworCSAgY29mZi1pMzg2KQorCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWNvZmYiCisJCWV4aXQgMCA7OworCSAgIiIpCisJCSMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKSBvcgorCQkjIG9uZSB0aGF0IGRvZXMgbm90IGdpdmUgdXMgdXNlZnVsIC0taGVscC4KKwkJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIKKwkJZXhpdCAwIDs7CisJZXNhYworCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisJI2lmZGVmIF9fRUxGX18KKwkjIGlmZGVmIF9fR0xJQkNfXworCSMgIGlmIF9fR0xJQkNfXyA+PSAyCisJTElCQz1nbnUKKwkjICBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgIGVuZGlmCisJIyBlbHNlCisJTElCQz1nbnVsaWJjMQorCSMgZW5kaWYKKwkjZWxzZQorCSNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisJTElCQz1nbnUKKwkjZWxzZQorCUxJQkM9Z251YW91dAorCSNlbmRpZgorCSNlbmRpZgorCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeTElCQz1gCisJdGVzdCB4IiR7TElCQ30iICE9IHggJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IiAmJiBleGl0IDAKKwl0ZXN0IHgiJHtURU5UQVRJVkV9IiAhPSB4ICYmIGVjaG8gIiR7VEVOVEFUSVZFfSIgJiYgZXhpdCAwCisJOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpKjg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDAgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDAgOzsKKyAgICBpKjg2OmF0aGVvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYXRoZW9zCisJZXhpdCAwIDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LjAqOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGkqODY6KkRPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1zZG9zZGpncHAKKwlleGl0IDAgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDAgOzsKKyAgICBpKjg2Oio6NTpbNzhdKikKKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgMCA7OworICAgIGkqODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCAwIDs7CisgICAgcGM6KjoqOiopCisJIyBMZWZ0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHk6CisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCAwIDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgMCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDAgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCAwIDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDAgOzsKKyAgICBtYzY4azpVTklYOlNZU1RFTTU6My41MW0pCisJZWNobyBtNjhrLWNvbnZlcmdlbnQtc3lzdgorCWV4aXQgMCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCAwIDs7CisgICAgTTY4KjoqOlIzVls1NjddKjoqKQorCXRlc3QgLXIgL3N5c1Y2OCAmJiBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnICYmIGV4aXQgMCA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgMCA7OworICAgIFRTVU5BTUk6THlueE9TOjIuKjoqKQorCWVjaG8gc3BhcmMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuMCo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU01bQkVdUzpVTklYX1NWOio6KikKKwllY2hvIG1pcHMtZGRlLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCAwIDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgKjoqOio6RlRYKikKKwkjIEZyb20gc2VhbmZAc3dkYy5zdHJhdHVzLmNvbS4KKwllY2hvIGk4NjAtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvIGhwcGExLjEtc3RyYXR1cy12b3MKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUlszNF0wMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUiowMDA6VU5JWF9TVjoqOiopCisJaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCisJICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorICAgICAgICBleGl0IDAgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDAgOzsKKyAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1iZW9zCisJZXhpdCAwIDs7CisgICAgU1gtNDpTVVBFUi1VWDoqOiopCisJZWNobyBzeDQtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpSaGFwc29keToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RGFyd2luOio6KikKKwljYXNlIGB1bmFtZSAtcGAgaW4KKwkgICAgKjg2KSBVTkFNRV9QUk9DRVNTT1I9aTY4NiA7OworCSAgICBwb3dlcnBjKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgKjpwcm9jbnRvKjoqOiogfCAqOlFOWDpbMDEyMzQ1Njc4OV0qOiopCisJVU5BTUVfUFJPQ0VTU09SPWB1bmFtZSAtcGAKKwlpZiB0ZXN0ICIkVU5BTUVfUFJPQ0VTU09SIiA9ICJ4ODYiOyB0aGVuCisJCVVOQU1FX1BST0NFU1NPUj1pMzg2CisJCVVOQU1FX01BQ0hJTkU9cGMKKwlmaQorCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LSR7VU5BTUVfTUFDSElORX0tbnRvLXFueCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDAgOzsKKyAgICBOU1ItW0RHS0xOUFRWV1ldOk5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDAgOzsKKyAgICBCUzIwMDA6UE9TSVgqOio6KikKKwllY2hvIGJzMjAwMC1zaWVtZW5zLXN5c3YKKwlleGl0IDAgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDAgOzsKKyAgICAqOlRPUFMtMTA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMTAKKwlleGl0IDAgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDAgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgMCA7OworICAgIFhLTC0xOlRPUFMtMjA6KjoqIHwgVFlQRTU6VE9QUy0yMDoqOiopCisJZWNobyBwZHAxMC14a2wtdG9wczIwCisJZXhpdCAwIDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCAwIDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDAgOzsKKyAgICBTRUk6KjoqOlNFSVVYKQorICAgICAgICBlY2hvIG1pcHMtc2VpLXNlaXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgICo6RFJBR09ORkxZOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeCIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgJGR1bW15ICYmIGV4aXQgMAorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdCAwOyB9CisKKyMgQ29udmV4IHZlcnNpb25zIHRoYXQgcHJlZGF0ZSB1bmFtZSBjYW4gdXNlIGdldHN5c2luZm8oMSkKKworaWYgWyAteCAvdXNyL2NvbnZleC9nZXRzeXNpbmZvIF0KK3RoZW4KKyAgICBjYXNlIGBnZXRzeXNpbmZvIC1mIGNwdV90eXBlYCBpbgorICAgIGMxKikKKwllY2hvIGMxLWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgMCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMzOCopCisJZWNobyBjMzgtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDAgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICAgIGZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvY29uZmlnLworCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZy5oIGIvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiYTUzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5oCkBAIC0wLDAgKzEsMzUxIEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKy8qICJnZW5lcmF0ZWQgYXV0b21hdGljYWxseSIgbWVhbnMgRE8gTk9UIE1BS0UgQ0hBTkdFUyBUTyBjb25maWcuaC5pbiAtLQorICogbWFrZSB0aGVtIHRvIGFjY29uZmlnLmggYW5kIHJlcnVuIGF1dG9oZWFkZXIgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNTTGVheSAwLjkuMGIgd2l0aCB0aGUgYnVnZ3kgY2FzdDEyOC4gKi8KKy8qICN1bmRlZiBIQVZFX0JVR0dZX0NBU1QxMjggKi8KKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgSVB2NiBzdXBwb3J0ICovCisjZGVmaW5lIElORVQ2IDEKKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGxpYnNtaS4gKi8KKy8qICN1bmRlZiBMSUJTTUkgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAgKi8KKy8qICN1bmRlZiBIQVZFX1NNSV9IICovCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0ICovCisvKiAjdW5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUICovCisKKy8qIGRlZmluZSBpZiB5b3VyIHN0cnVjdCBfX3Jlc19zdGF0ZSBoYXMgdGhlIG5zb3J0IG1lbWJlciAqLworLyogI3VuZGVmIEhBVkVfTkVXX1JFU19TVEFURSAqLworCisvKgorICogZGVmaW5lIGlmIHN0cnVjdCBldGhlcl9oZWFkZXIuZXRoZXJfZGhvc3QgaXMgYSBzdHJ1Y3Qgd2l0aCBldGhlcl9hZGRyX29jdGV0CisgKi8KKy8qICN1bmRlZiBFVEhFUl9IRUFERVJfSEFTX0VBICovCisKKy8qIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfYXJwIGNvbnRhaW5zIGFycF94c2hhICovCisvKiAjdW5kZWYgRVRIRVJfQVJQX0hBU19YICovCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWRkcmluZm8gZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQUREUklORk8gMQorCisvKiBkZWZpbmUgaWYgeW91IG5lZWQgdG8gaW5jbHVkZSBtaXNzaW5nL2FkZHJpbmZvaC5oLiAqLworLyogI3VuZGVmIE5FRURfQUREUklORk9fSCAqLworCisvKiBkZWZpbmUgaWZ5b3UgaGF2ZSB0aGUgaF9lcnJubyB2YXJpYWJsZS4gKi8KKyNkZWZpbmUgSEFWRV9IX0VSUk5PIDEKKworLyogZGVmaW5lIGlmIElONkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI2RlZmluZSBIQVZFX0lONkFERFJTWiAxCisKKy8qIGRlZmluZSBpZiBJTkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI2RlZmluZSBIQVZFX0lOQUREUlNaIDEKKworLyogZGVmaW5lIGlmIHRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzLiAqLworLyogI3VuZGVmIEhBVkVfT1NfUFJPVE9fSCAqLworCisvKiBkZWZpbmUgaWYgPHVuaXN0ZC5oPiBkZWZpbmVzIF9fUCgpICovCisvKiAjdW5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUgKi8KKworLyogZGVmaW5lIGlmIFJFU19VU0VfSU5FVDYgaXMgZGVmaW5lZCAqLworI2RlZmluZSBIQVZFX1JFU19VU0VfSU5FVDYgMQorCisvKiBkZWZpbmUgaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLworLyogI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOICovCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLworI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgYm90aCBnZXRpcG5vZGVieW5hbWUoKSBhbmQgZ2V0aXBub2RlYnlhZGRyKCkgKi8KKy8qICN1bmRlZiBVU0VfR0VUSVBOT0RFQlkgKi8KKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGV0aGVyX250b2hvc3QoKSBhbmQgaXQgd29ya3MgKi8KKy8qICN1bmRlZiBVU0VfRVRIRVJfTlRPSE9TVCAqLworCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF92ZXJzaW9uICovCisvKiAjdW5kZWYgSEFWRV9QQ0FQX1ZFUlNJT04gKi8KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGVidWcgKi8KKy8qICN1bmRlZiBIQVZFX1BDQVBfREVCVUcgKi8KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHl5ZGVidWcgKi8KKy8qICN1bmRlZiBIQVZFX1lZREVCVUcgKi8KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfbGlzdF9kYXRhbGlua3MoKSAqLworI2RlZmluZSBIQVZFX1BDQVBfTElTVF9EQVRBTElOS1MgMQorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9zZXRfZGF0YWxpbmsoKSAqLworI2RlZmluZSBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LIDEKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSAqLworI2RlZmluZSBIQVZFX1BDQVBfREFUQUxJTktfTkFNRV9UT19WQUwgMQorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKSAqLworI2RlZmluZSBIQVZFX1BDQVBfREFUQUxJTktfVkFMX1RPX0RFU0NSSVBUSU9OIDEKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZHVtcF9mdGVsbCgpICovCisjZGVmaW5lIEhBVkVfUENBUF9EVU1QX0ZURUxMIDEKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGdldHJwY2J5bnVtYmVyKCkgKi8KKy8qICN1bmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSICovCisKKy8qIGRlZmluZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwgKi8KKyNkZWZpbmUgTEJMX0FMSUdOIDEKKworLyogVGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHZhbHVlIGZyb20gc2lnbmFsICg/KVhYWCAqLworI2RlZmluZSBSRVRTSUdWQUwgCisKKy8qIERlZmluZSB0aGlzIG9uIElSSVggKi8KKy8qICN1bmRlZiBfQlNEX1NJR05BTFMgKi8KKworLyogRm9yIEhQL1VYIEFOU0kgY29tcGlsZXI/ICovCisvKiAjdW5kZWYgX0hQVVhfU09VUkNFICovCisKKy8qIEFJWCBoYWNrLiAqLworLyogI3VuZGVmIF9TVU4gKi8KKworLyogV29ya2Fyb3VuZCBmb3IgbWlzc2luZyA2NC1iaXQgZm9ybWF0cyAqLworLyogI3VuZGVmIFBSSWQ2NCAqLworLyogI3VuZGVmIFBSSW82NCAqLworLyogI3VuZGVmIFBSSXg2NCAqLworLyogI3VuZGVmIFBSSXU2NCAqLworCisvKiBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlciAqLworI2RlZmluZSBUQ1BEVU1QX0RPX1NNQiAxCisKKy8qIExvbmcgc3Rvcnkgc2hvcnQ6IGFjbG9jYWwubTQgZGVwZW5kcyBvbiBhdXRvY29uZiAyLjEzCisgKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHdydCAiY29uc3QiOyBuZXdlciB2ZXJzaW9ucworICogaGF2ZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscyBzbyBmb3Igbm93IHdlCisgKiBwdXQgImNvbnN0IiBoZXJlLiAgVGhpcyBtYXkgY2F1c2UgZHVwbGljYXRlIGRlZmluaXRpb25zCisgKiBpbiBjb25maWcuaCBidXQgdGhhdCBzaG91bGQgYmUgT0sgc2luY2UgdGhleSdyZSB0aGUgc2FtZS4KKyAqLworLyogI3VuZGVmIGNvbnN0ICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZG5ldF9odG9hIGZ1bmN0aW9uLiAgKi8KKy8qICN1bmRlZiBIQVZFX0RORVRfSFRPQSAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gPG5ldGRuZXQvZG5ldGRiLmg+LiAgKi8KKy8qICN1bmRlZiBIQVZFX05FVERORVRfRE5FVERCX0hfRE5FVF9IVE9BICovCisKKy8qIGRlZmluZSBpZiBzaG91bGQgZHJvcCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQgKi8KKy8qICN1bmRlZiBXSVRIX1VTRVIgKi8KKworLyogZGVmaW5lIGlmIHNob3VsZCBjaHJvb3Qgd2hlbiBkcm9wcGluZyBwcml2aWxlZ2VzICovCisvKiAjdW5kZWYgV0lUSF9DSFJPT1QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQUxBUk0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJwZl9kdW1wJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9CUEZfRFVNUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfbnRvaG9zdCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjZGVmaW5lIEhBVkVfREVDTF9FVEhFUl9OVE9IT1NUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBldGhlcl9udG9ob3N0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9FVEhFUl9OVE9IT1NUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRhZGRyaW5mbycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRBRERSSU5GTyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG5hbWVpbmZvJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVE5BTUVJTkZPICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY3J5cHRvJyBsaWJyYXJ5ICgtbGNyeXB0bykuICovCisjZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBycGMnIGxpYnJhcnkgKC1scnBjKS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQlJQQyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNtaScgbGlicmFyeSAoLWxzbWkpLiAqLworLyogI3VuZGVmIEhBVkVfTElCU01JICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkbmV0L2RuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX05FVERORVRfRE5FVERCX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2V0aGVyLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05FVElORVRfRVRIRVJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9wZnZhci5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX05FVF9QRlZBUl9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8b3BlbnNzbC9ldnAuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfT1BFTlNTTF9FVlBfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9icmVha2xvb3AnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BDQVBfQlJFQUtMT09QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwY2FwX2R1bXBfZmx1c2gnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BDQVBfRFVNUF9GTFVTSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9maW5kYWxsZGV2cycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUENBUF9GSU5EQUxMREVWUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBwY2FwX2lmX3QnLiAqLworI2RlZmluZSBIQVZFX1BDQVBfSUZfVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9saWJfdmVyc2lvbicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUENBUF9MSUJfVkVSU0lPTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGZvcGVuJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1BGT1BFTiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHJwYy9ycGNlbnQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9SUENfUlBDRU5UX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsaW5lYnVmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRMSU5FQlVGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NJR0FDVElPTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnc2V0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NJR1NFVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNtaS5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NNSV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJEVVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmZ0aW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNhdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJMQ0FUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNweScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJMQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc2VwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJTRVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IGV0aGVyX2FkZHInLiAqLworLyogI3VuZGVmIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYml0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19CSVRZUEVTX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmZwcmludGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1ZGUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2c25wcmludGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1ZTTlBSSU5URiAxCisKKy8qIGRlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBfX2F0dHJpYnV0ZV9fICovCisjZGVmaW5lIEhBVkVfX19BVFRSSUJVVEVfXyAxCisKKy8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfbnRvaG9zdCcgKi8KKy8qICN1bmRlZiBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfTlRPSE9TVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX250b2hvc3QnICovCisvKiAjZGVmaW5lIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiIgorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KKyNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCisKKy8qIFRoZSBzaXplIG9mIGBjaGFyJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfQ0hBUiAxCisKKy8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0xPTkcgNAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIDgKKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfU0hPUlQgMgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCisjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCisKKy8qIERlZmluZSBhcyB0b2tlbiBmb3IgaW5saW5lIGlmIGlubGluaW5nIHN1cHBvcnRlZCAqLworI2RlZmluZSBpbmxpbmUgaW5saW5lCisKKy8qIERlZmluZSB0byBgc2hvcnQnIGlmIGludDE2X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgaW50MTZfdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgaW50MzJfdCBub3QgZGVmaW5lZC4gKi8KKy8qICN1bmRlZiBpbnQzMl90ICovCisKKy8qIERlZmluZSB0byBgbG9uZyBsb25nJyBpZiBpbnQ2NF90IG5vdCBkZWZpbmVkLiAqLworLyogI3VuZGVmIGludDY0X3QgKi8KKworLyogRGVmaW5lIHRvIGBzaWduZWQgY2hhcicgaWYgaW50OF90IG5vdCBkZWZpbmVkLiAqLworLyogI3VuZGVmIGludDhfdCAqLworCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIHNob3J0JyBpZiB1X2ludDE2X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgdV9pbnQxNl90ICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgdV9pbnQzMl90ICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgdV9pbnQ2NF90ICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgY2hhcicgaWYgdV9pbnQ4X3Qgbm90IGRlZmluZWQuICovCisvKiAjdW5kZWYgdV9pbnQ4X3QgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy5oLmluIGIvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmZmUwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5oLmluCkBAIC0wLDAgKzEsMzUwIEBACisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KKy8qICJnZW5lcmF0ZWQgYXV0b21hdGljYWxseSIgbWVhbnMgRE8gTk9UIE1BS0UgQ0hBTkdFUyBUTyBjb25maWcuaC5pbiAtLQorICogbWFrZSB0aGVtIHRvIGFjY29uZmlnLmggYW5kIHJlcnVuIGF1dG9oZWFkZXIgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNTTGVheSAwLjkuMGIgd2l0aCB0aGUgYnVnZ3kgY2FzdDEyOC4gKi8KKyN1bmRlZiBIQVZFX0JVR0dZX0NBU1QxMjgKKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgSVB2NiBzdXBwb3J0ICovCisjdW5kZWYgSU5FVDYKKworLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGxpYnNtaS4gKi8KKyN1bmRlZiBMSUJTTUkKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX1NNSV9ICisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0ICovCisjdW5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUCisKKy8qIGRlZmluZSBpZiB5b3VyIHN0cnVjdCBfX3Jlc19zdGF0ZSBoYXMgdGhlIG5zb3J0IG1lbWJlciAqLworI3VuZGVmIEhBVkVfTkVXX1JFU19TVEFURQorCisvKgorICogZGVmaW5lIGlmIHN0cnVjdCBldGhlcl9oZWFkZXIuZXRoZXJfZGhvc3QgaXMgYSBzdHJ1Y3Qgd2l0aCBldGhlcl9hZGRyX29jdGV0CisgKi8KKyN1bmRlZiBFVEhFUl9IRUFERVJfSEFTX0VBCisKKy8qIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfYXJwIGNvbnRhaW5zIGFycF94c2hhICovCisjdW5kZWYgRVRIRVJfQVJQX0hBU19YCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWRkcmluZm8gZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9BRERSSU5GTworCisvKiBkZWZpbmUgaWYgeW91IG5lZWQgdG8gaW5jbHVkZSBtaXNzaW5nL2FkZHJpbmZvaC5oLiAqLworI3VuZGVmIE5FRURfQUREUklORk9fSAorCisvKiBkZWZpbmUgaWZ5b3UgaGF2ZSB0aGUgaF9lcnJubyB2YXJpYWJsZS4gKi8KKyN1bmRlZiBIQVZFX0hfRVJSTk8KKworLyogZGVmaW5lIGlmIElONkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI3VuZGVmIEhBVkVfSU42QUREUlNaCisKKy8qIGRlZmluZSBpZiBJTkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLworI3VuZGVmIEhBVkVfSU5BRERSU1oKKworLyogZGVmaW5lIGlmIHRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzLiAqLworI3VuZGVmIEhBVkVfT1NfUFJPVE9fSAorCisvKiBkZWZpbmUgaWYgPHVuaXN0ZC5oPiBkZWZpbmVzIF9fUCgpICovCisjdW5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUKKworLyogZGVmaW5lIGlmIFJFU19VU0VfSU5FVDYgaXMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfUkVTX1VTRV9JTkVUNgorCisvKiBkZWZpbmUgaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgYm90aCBnZXRpcG5vZGVieW5hbWUoKSBhbmQgZ2V0aXBub2RlYnlhZGRyKCkgKi8KKyN1bmRlZiBVU0VfR0VUSVBOT0RFQlkKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGV0aGVyX250b2hvc3QoKSBhbmQgaXQgd29ya3MgKi8KKyN1bmRlZiBVU0VfRVRIRVJfTlRPSE9TVAorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF92ZXJzaW9uICovCisjdW5kZWYgSEFWRV9QQ0FQX1ZFUlNJT04KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGVidWcgKi8KKyN1bmRlZiBIQVZFX1BDQVBfREVCVUcKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHl5ZGVidWcgKi8KKyN1bmRlZiBIQVZFX1lZREVCVUcKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfbGlzdF9kYXRhbGlua3MoKSAqLworI3VuZGVmIEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUworCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9zZXRfZGF0YWxpbmsoKSAqLworI3VuZGVmIEhBVkVfUENBUF9TRVRfREFUQUxJTksKKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSAqLworI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTAorCisvKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKSAqLworI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04KKworLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZHVtcF9mdGVsbCgpICovCisjdW5kZWYgSEFWRV9QQ0FQX0RVTVBfRlRFTEwKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGdldHJwY2J5bnVtYmVyKCkgKi8KKyN1bmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSCisKKy8qIGRlZmluZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwgKi8KKyN1bmRlZiBMQkxfQUxJR04KKworLyogVGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHZhbHVlIGZyb20gc2lnbmFsICg/KVhYWCAqLworI3VuZGVmIFJFVFNJR1ZBTAorCisvKiBEZWZpbmUgdGhpcyBvbiBJUklYICovCisjdW5kZWYgX0JTRF9TSUdOQUxTCisKKy8qIEZvciBIUC9VWCBBTlNJIGNvbXBpbGVyPyAqLworI3VuZGVmIF9IUFVYX1NPVVJDRQorCisvKiBBSVggaGFjay4gKi8KKyN1bmRlZiBfU1VOCisKKy8qIFdvcmthcm91bmQgZm9yIG1pc3NpbmcgNjQtYml0IGZvcm1hdHMgKi8KKyN1bmRlZiBQUklkNjQKKyN1bmRlZiBQUklvNjQKKyN1bmRlZiBQUkl4NjQKKyN1bmRlZiBQUkl1NjQKKworLyogV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIgKi8KKyN1bmRlZiBUQ1BEVU1QX0RPX1NNQgorCisvKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMworICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKKyAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQorICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucworICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCisgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRuZXRfaHRvYSBmdW5jdGlvbi4gICovCisjdW5kZWYgSEFWRV9ETkVUX0hUT0EKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgZG5ldF9odG9hIGRlY2xhcmF0aW9uIGluIDxuZXRkbmV0L2RuZXRkYi5oPi4gICovCisjdW5kZWYgSEFWRV9ORVRETkVUX0RORVREQl9IX0RORVRfSFRPQQorCisvKiBkZWZpbmUgaWYgc2hvdWxkIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0ICovCisjdW5kZWYgV0lUSF9VU0VSCisKKy8qIGRlZmluZSBpZiBzaG91bGQgY2hyb290IHdoZW4gZHJvcHBpbmcgcHJpdmlsZWdlcyAqLworI3VuZGVmIFdJVEhfQ0hST09UCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWxhcm0nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQUxBUk0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBicGZfZHVtcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9CUEZfRFVNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGV0aGVyX250b2hvc3QnLCBhbmQgdG8gMCBpZiB5b3UKKyAgIGRvbid0LiAqLworI3VuZGVmIEhBVkVfREVDTF9FVEhFUl9OVE9IT1NUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXRoZXJfbnRvaG9zdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9FVEhFUl9OVE9IT1NUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0YWRkcmluZm8nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQUREUklORk8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRuYW1laW5mbycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVROQU1FSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNyeXB0bycgbGlicmFyeSAoLWxjcnlwdG8pLiAqLworI3VuZGVmIEhBVkVfTElCQ1JZUFRPCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcnBjJyBsaWJyYXJ5ICgtbHJwYykuICovCisjdW5kZWYgSEFWRV9MSUJSUEMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbWknIGxpYnJhcnkgKC1sc21pKS4gKi8KKyN1bmRlZiBIQVZFX0xJQlNNSQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01FTU9SWV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0ZG5ldC9kbmV0ZGIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRETkVUX0RORVREQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9ldGhlci5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVElORVRfRVRIRVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaWZfZXRoZXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXQvcGZ2YXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRfUEZWQVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG9wZW5zc2wvZXZwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfT1BFTlNTTF9FVlBfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBjYXBfYnJlYWtsb29wJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BDQVBfQlJFQUtMT09QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9kdW1wX2ZsdXNoJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BDQVBfRFVNUF9GTFVTSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBjYXBfZmluZGFsbGRldnMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUENBUF9GSU5EQUxMREVWUworCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgcGNhcF9pZl90Jy4gKi8KKyN1bmRlZiBIQVZFX1BDQVBfSUZfVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBjYXBfbGliX3ZlcnNpb24nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUENBUF9MSUJfVkVSU0lPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBmb3BlbicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9QRk9QRU4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxycGMvcnBjZW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUlBDX1JQQ0VOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0bGluZWJ1ZicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRVRMSU5FQlVGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnYWN0aW9uJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NJR0FDVElPTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3NldCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TSUdTRVQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzbWkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TTUlfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NOUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJEVVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJGVElNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjYXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTENBVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmxjcHknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSTENQWQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnNlcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJTRVAKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHN0cnVjdCBldGhlcl9hZGRyJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9FVEhFUl9BRERSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2JpdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQklUWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZmcHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZGUFJJTlRGCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1ZTTlBSSU5URgorCisvKiBkZWZpbmUgaWYgeW91ciBjb21waWxlciBoYXMgX19hdHRyaWJ1dGVfXyAqLworI3VuZGVmIEhBVkVfX19BVFRSSUJVVEVfXworCisvKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX250b2hvc3QnICovCisjdW5kZWYgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKKworLyogRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9pZl9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9udG9ob3N0JyAqLworI3VuZGVmIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1ZFUlNJT04KKworLyogRGVmaW5lIGFzIHRoZSByZXR1cm4gdHlwZSBvZiBzaWduYWwgaGFuZGxlcnMgKGBpbnQnIG9yIGB2b2lkJykuICovCisjdW5kZWYgUkVUU0lHVFlQRQorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfQ0hBUgorCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9JTlQKKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0xPTkcKKworLyogVGhlIHNpemUgb2YgYGxvbmcgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9OR19MT05HCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfU0hPUlQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgU1REQ19IRUFERVJTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBjYW4gc2FmZWx5IGluY2x1ZGUgYm90aCA8c3lzL3RpbWUuaD4gYW5kIDx0aW1lLmg+LiAqLworI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorCisvKiBEZWZpbmUgYXMgdG9rZW4gZm9yIGlubGluZSBpZiBpbmxpbmluZyBzdXBwb3J0ZWQgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiBpbnQxNl90CisKKy8qIERlZmluZSB0byBgaW50JyBpZiBpbnQzMl90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIGludDMyX3QKKworLyogRGVmaW5lIHRvIGBsb25nIGxvbmcnIGlmIGludDY0X3Qgbm90IGRlZmluZWQuICovCisjdW5kZWYgaW50NjRfdAorCisvKiBEZWZpbmUgdG8gYHNpZ25lZCBjaGFyJyBpZiBpbnQ4X3Qgbm90IGRlZmluZWQuICovCisjdW5kZWYgaW50OF90CisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgc2hvcnQnIGlmIHVfaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiB1X2ludDE2X3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIHVfaW50MzJfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiB1X2ludDMyX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBsb25nIGxvbmcnIGlmIHVfaW50NjRfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiB1X2ludDY0X3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBjaGFyJyBpZiB1X2ludDhfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiB1X2ludDhfdApkaWZmIC0tZ2l0IGEvY29uZmlnLnN1YiBiL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTY5ODE3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZy5zdWIKQEAgLTAsMCArMSwxNTMxIEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdC4KKyMgICBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisjICAgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDAzLTExLTAzJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIgorICAgICAgIGV4aXQgMSA7OworCisgICAgKmxvY2FsKikKKyAgICAgICAjIEZpcnN0IHBhc3MgdGhyb3VnaCBhbnkgbG9jYWwgbWFjaGluZSB0eXBlcy4KKyAgICAgICBlY2hvICQxCisgICAgICAgZXhpdCAwOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC11Y2xpYmMqIHwgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwgXAorICBrZnJlZWJzZCotZ251KiB8IGtuZXRic2QqLWdudSogfCBuZXRic2QqLWdudSogfCBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcykKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY281KQorCQlvcz0tc2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgXAorCXwgYzR4IHwgY2xpcHBlciBcCisJfCBkMTB2IHwgZDMwdiB8IGRseCB8IGRzcDE2eHggXAorCXwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IG0zMnIgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayB8IG1jb3JlIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0dnI0MTAwIHwgbWlwczY0dnI0MTAwZWwgXAorCXwgbWlwczY0dnI0MzAwIHwgbWlwczY0dnI0MzAwZWwgXAorCXwgbWlwczY0dnI1MDAwIHwgbWlwczY0dnI1MDAwZWwgXAorCXwgbWlwc2lzYTMyIHwgbWlwc2lzYTMyZWwgXAorCXwgbWlwc2lzYTMycjIgfCBtaXBzaXNhMzJyMmVsIFwKKwl8IG1pcHNpc2E2NCB8IG1pcHNpc2E2NGVsIFwKKwl8IG1pcHNpc2E2NHIyIHwgbWlwc2lzYTY0cjJlbCBcCisJfCBtaXBzaXNhNjRzYjEgfCBtaXBzaXNhNjRzYjFlbCBcCisJfCBtaXBzaXNhNjRzcjcxayB8IG1pcHNpc2E2NHNyNzFrZWwgXAorCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwl8IG1uMTAyMDAgfCBtbjEwMzAwIFwKKwl8IG1zcDQzMCBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9wZW5yaXNjIHwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjNdZSB8IHNoWzM0XWViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjdjkgfCBzcGFyY3Y5YiBcCisJfCBzdHJvbmdhcm0gXAorCXwgdGFob2UgfCB0aHVtYiB8IHRpYzR4IHwgdGljODAgfCB0cm9uIFwKKwl8IHY4NTAgfCB2ODUwZSBcCisJfCB3ZTMyayBcCisJfCB4ODYgfCB4c2NhbGUgfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIpCisJCSMgTW90b3JvbGEgNjhIQzExLzEyLgorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJb3M9LW5vbmUKKwkJOzsKKwltODgxMTAgfCBtNjgwWzEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHY3MCB8IHc2NSB8IHo4aykKKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogXAorCXwgYnMyMDAwLSogXAorCXwgY1sxMjNdKiB8IGMzMC0qIHwgW2NqdF05MC0qIHwgYzR4LSogfCBjNTR4LSogfCBjNTV4LSogfCBjNngtKiBcCisJfCBjbGlwcGVyLSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBtMzJyLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWNvcmUtKiBcCisJfCBtaXBzLSogfCBtaXBzYmUtKiB8IG1pcHNlYi0qIHwgbWlwc2VsLSogfCBtaXBzbGUtKiBcCisJfCBtaXBzMTYtKiBcCisJfCBtaXBzNjQtKiB8IG1pcHM2NGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiBcCisJfCBtaXBzNjR2cjQzMDAtKiB8IG1pcHM2NHZyNDMwMGVsLSogXAorCXwgbWlwczY0dnI1MDAwLSogfCBtaXBzNjR2cjUwMDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbXNwNDMwLSogXAorCXwgbm9uZS0qIHwgbnAxLSogfCBudjEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzg2eC0qIHwgc3BhcmNsZXQtKiB8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogXAorCXwgdHJvbi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHN0b3JteTE2LSogXAorCXwgeHRlbnNhLSogXAorCXwgeW1wLSogXAorCXwgejhrLSopCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgajkwKQorCQliYXNpY19tYWNoaW5lPWo5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzIHwgY3Jpcy0qIHwgZXRyYXgqKQorCQliYXNpY19tYWNoaW5lPWNyaXMtYXhpcworCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTg4ay1vbXJvbiopCisJCWJhc2ljX21hY2hpbmU9bTg4ay1vbXJvbgorCQk7OworCW1hZ251bSB8IG0zMjMwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlvcz0tc3lzdgorCQk7OworCW1lcmxpbikKKwkJYmFzaWNfbWFjaGluZT1uczMyay11dGVrCisJCW9zPS1zeXN2CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1taXgqKQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJb3M9LW1taXh3YXJlCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnYxKQorCQliYXNpY19tYWNoaW5lPW52MS1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCW5zci10YW5kZW0pCisJCWJhc2ljX21hY2hpbmU9bnNyLXRhbmRlbQorCQk7OworCW9wNTBuLSogfCBvcDYwYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwlvcjMyIHwgb3IzMi0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBiZCkKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy10dGkKKwkJOzsKKwlwYmIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay10dGkKKwkJOzsKKwlwYzUzMiB8IHBjNTMyLSopCisJCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZWkpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZWkKKwkJb3M9LXNlaXV4CisJCTs7CisJc2VxdWVudCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJOzsKKwlzaCkKKwkJYmFzaWNfbWFjaGluZT1zaC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdHgzOSkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOS11bmtub3duCisJCTs7CisJdHgzOWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5ZWwtdW5rbm93bgorCQk7OworCXRvYWQxKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLXhrbAorCQlvcz0tdG9wczIwCisJCTs7CisJdG93ZXIgfCB0b3dlci0zMikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgorCQk7OworCXRwZikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJb3M9LXRwZgorCQk7OworCXVkaTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAorCQlvcz0tdWRpCisJCTs7CisJdWx0cmEzKQorCQliYXNpY19tYWNoaW5lPWEyOWstbnl1CisJCW9zPS1zeW0xCisJCTs7CisJdjgxMCB8IG5lY3Y4MTApCisJCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKKwkJb3M9LW5vbmUKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorCQliYXNpY19tYWNoaW5lPWYzMDEtZnVqaXRzdQorCQk7OworCXZ4d29ya3M5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl2eHdvcmtzMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdzY1KikKKwkJYmFzaWNfbWFjaGluZT13NjUtd2RjCisJCW9zPS1ub25lCisJCTs7CisJdzg5ay0qKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQlvcz0tcHJvZWxmCisJCTs7CisJeHBzIHwgeHBzMTAwKQorCQliYXNpY19tYWNoaW5lPXhwczEwMC1ob25leXdlbGwKKwkJOzsKKwl5bXApCisJCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXo4ay0qLWNvZmYpCisJCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KKwkJb3M9LXNpbQorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwl3ODlrKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAorCQk7OworCW9wNTBuKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJb3A2MGMpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlyb21wKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJcnM2MDAwKQorCQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwl2YXgpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQk7OworCXBkcDEwKQorCQkjIHRoZXJlIGFyZSBtYW55IGNsb25lcywgc28gREVDIGlzIG5vdCBhIHNhZmUgYmV0CisJCWJhc2ljX21hY2hpbmU9cGRwMTAtdW5rbm93bgorCQk7OworCXBkcDExKQorCQliYXNpY19tYWNoaW5lPXBkcDExLWRlYworCQk7OworCXdlMzJrKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCXNoMyB8IHNoNCB8IHNoWzM0XWViIHwgc2hbMTIzNF1sZSB8IHNoWzIzXWVsZSkKKwkJYmFzaWNfbWFjaGluZT1zaC11bmtub3duCisJCTs7CisJc2g2NCkKKwkJYmFzaWNfbWFjaGluZT1zaDY0LXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjkgfCBzcGFyY3Y5YikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogXAorCSAgICAgIHwgLWx5bnhvcyogfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtdWNsaWJjKiB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotYWNvcm4pCisJCW9zPS1yaXNjaXgxLjIKKwkJOzsKKwlhcm0qLXJlYmVsKQorCQlvcz0tbGludXgKKwkJOzsKKwlhcm0qLXNlbWkpCisJCW9zPS1hb3V0CisJCTs7CisgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICBvcz0tY29mZgorICAgICAgICA7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisJKi13ZWMpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLXdpbmJvbmQpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLW9raSkKKwkJb3M9LXByb2VsZgorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCSotZ291bGQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1oaWdobGV2ZWwpCisJCW9zPS1ic2QKKwkJOzsKKwkqLWVuY29yZSkKKwkJb3M9LWJzZAorCQk7OworCSotc2dpKQorCQlvcz0taXJpeAorCQk7OworCSotc2llbWVucykKKwkJb3M9LXN5c3Y0CisJCTs7CisJKi1tYXNzY29tcCkKKwkJb3M9LXJ0dQorCQk7OworCWYzMFswMV0tZnVqaXRzdSB8IGY3MDAtZnVqaXRzdSkKKwkJb3M9LXV4cHYKKwkJOzsKKwkqLXJvbTY4aykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLSpidWcpCisJCW9zPS1jb2ZmCisJCTs7CisJKi1hcHBsZSkKKwkJb3M9LW1hY29zCisJCTs7CisJKi1hdGFyaSopCisJCW9zPS1taW50CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWJlb3MqKQorCQkJCXZlbmRvcj1iZQorCQkJCTs7CisJCQktaHB1eCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1tcGVpeCopCisJCQkJdmVuZG9yPWhwCisJCQkJOzsKKwkJCS1oaXV4KikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktdW5vcyopCisJCQkJdmVuZG9yPWNyZHMKKwkJCQk7OworCQkJLWRndXgqKQorCQkJCXZlbmRvcj1kZworCQkJCTs7CisJCQktbHVuYSopCisJCQkJdmVuZG9yPW9tcm9uCisJCQkJOzsKKwkJCS1nZW5peCopCisJCQkJdmVuZG9yPW5zCisJCQkJOzsKKwkJCS1tdnMqIHwgLW9wZW5lZCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktb3M0MDAqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXB0eCopCisJCQkJdmVuZG9yPXNlcXVlbnQKKwkJCQk7OworCQkJLXRwZiopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktdnhzaW0qIHwgLXZ4d29ya3MqIHwgLXdpbmRpc3MqKQorCQkJCXZlbmRvcj13cnMKKwkJCQk7OworCQkJLWF1eCopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS1obXMqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS1tcHcqIHwgLW1hY29zKikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKKwkJCQl2ZW5kb3I9YXRhcmkKKwkJCQk7OworCQkJLXZvcyopCisJCQkJdmVuZG9yPXN0cmF0dXMKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKK2V4aXQgMAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQ5NGRmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDE0MzUzIEBACisjISAvYmluL3NoCisjIEZyb20gY29uZmlndXJlLmluIFJldmlzaW9uOiAxLjE4OC4yLjggLgorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Citlc2FjCisKK2ZpCisKKworCisKKyMgUEFUSCBuZWVkcyBDUgorIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCithc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAorICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCisgIGNobW9kICt4IGNvbmYkJC5zaAorICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICBlbHNlCisgICAgUEFUSF9TRVBBUkFUT1I9OgorICBmaQorICBybSAtZiBjb25mJCQuc2gKK2ZpCisKKyMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgoraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Vuc2V0PXVuc2V0CitlbHNlCisgIGFzX3Vuc2V0PWZhbHNlCitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK2FzX25sPScKKycKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2Nhc2UgJDAgaW4KKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgICAgOzsKK2VzYWMKKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgoraWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorICBhc19teXNlbGY9JDAKK2ZpCitpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCisgIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CitmaQorCisjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KK2ZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKK2RvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCitkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK2ZvciBhc192YXIgaW4gXAorICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAorICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAorICBMQ19URUxFUEhPTkUgTENfVElNRQorZG8KKyAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KKyAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKKyAgZWxzZQorICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisgIGZpCitkb25lCisKKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgoraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCitlbHNlCisgIGFzX2Jhc2VuYW1lPWZhbHNlCitmaQorCisKKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KK2FzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAorJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIENEUEFUSC4KKyRhc191bnNldCBDRFBBVEgKKworCitpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCisgIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKworICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKKyhhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0IFwkMSkKK30KK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDAKK30KK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDEKK30KK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworICByZXR1cm4gMAorfQorYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisgIHJldHVybiAxCit9CisKK2V4aXRjb2RlPTAKK2lmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQorCit0ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKworKAorICBhc19saW5lbm9fMT1cJExJTkVOTworICBhc19saW5lbm9fMj1cJExJTkVOTworICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKKyAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKyIpIDI+IC9kZXYvbnVsbDsgdGhlbgorICA6CitlbHNlCisgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9CisgICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBjYXNlICRhc19kaXIgaW4KKwkgLyopCisJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKKwkgICBkb25lOzsKKyAgICAgICBlc2FjCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KKwkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKwkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBlbXVsYXRlIHNoCisgIE5VTExDTUQ9OgorICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Citlc2FjCisKK2ZpCisKKworOgorX0FTRU9GCit9OyB0aGVuCisgIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKKwkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKwkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCisgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworZXNhYworCitmaQorCisKKzoKKyhhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0ICQxKQorfQorYXNfZnVuY19zdWNjZXNzICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMAorfQorYXNfZnVuY19mYWlsdXJlICgpIHsKKyAgYXNfZnVuY19yZXR1cm4gMQorfQorYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisgIHJldHVybiAwCit9Cithc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKyAgcmV0dXJuIDEKK30KKworZXhpdGNvZGU9MAoraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCitmaQorCitpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorICBleGl0Y29kZT0xCisgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCitmaQorCitpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCisgIDoKK2Vsc2UKKyAgZXhpdGNvZGU9MQorICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KK2ZpCisKK3Rlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisKKygKKyAgYXNfbGluZW5vXzE9JExJTkVOTworICBhc19saW5lbm9fMj0kTElORU5PCisgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKworX0FTRU9GCit9OyB0aGVuCisgIGJyZWFrCitmaQorCitmaQorCisgICAgICBkb25lCisKKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisgIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCisgICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCisgICAgICAgIGRvbmUKKyAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAorICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9CitmaQorCisKKyAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KKyAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQorICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQorICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQorICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCisgICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KK2ZpCisKKworZmkKKworZmkKKworCisKKyhldmFsICJhc19mdW5jX3JldHVybiAoKSB7CisgIChleGl0IFwkMSkKK30KK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDAKK30KK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisgIGFzX2Z1bmNfcmV0dXJuIDEKK30KK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworICByZXR1cm4gMAorfQorYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisgIHJldHVybiAxCit9CisKK2V4aXRjb2RlPTAKK2lmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorZmkKKworaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KK2ZpCisKK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKyAgZXhpdGNvZGU9MQorICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorZmkKKworaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgorICA6CitlbHNlCisgIGV4aXRjb2RlPTEKKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQorCit0ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgeworICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgorICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCisgIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKKyAgZWNobyBtZXNzYWdlCit9CisKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7CisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAorICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCisgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKyAgIyBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCisgICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4KKy1uKikKKyAgY2FzZSBgZWNobyAneFxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgICopICAgRUNIT19DPSdcYyc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyCitmaQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPSdsbiAtcycKKyAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICBhc19sbl9zPSdjcCAtcCcKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKyAgICAgICAgdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbgorICAgICAgICAtKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCisKK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKKworIyBOYW1lIG9mIHRoZSBob3N0LgorIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCitQQUNLQUdFX05BTUU9CitQQUNLQUdFX1RBUk5BTUU9CitQQUNLQUdFX1ZFUlNJT049CitQQUNLQUdFX1NUUklORz0KK1BBQ0tBR0VfQlVHUkVQT1JUPQorCithY191bmlxdWVfZmlsZT0idGNwZHVtcC5jIgorIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgorYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisjaWZkZWYgU1REQ19IRUFERVJTCisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1RETElCX0gKKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyBlbmRpZgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdfSAorIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICisjICBpbmNsdWRlIDxtZW1vcnkuaD4KKyMgZW5kaWYKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIgorCithY19zdWJzdF92YXJzPSdTSEVMTAorUEFUSF9TRVBBUkFUT1IKK1BBQ0tBR0VfTkFNRQorUEFDS0FHRV9UQVJOQU1FCitQQUNLQUdFX1ZFUlNJT04KK1BBQ0tBR0VfU1RSSU5HCitQQUNLQUdFX0JVR1JFUE9SVAorZXhlY19wcmVmaXgKK3ByZWZpeAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorYmluZGlyCitzYmluZGlyCitsaWJleGVjZGlyCitkYXRhcm9vdGRpcgorZGF0YWRpcgorc3lzY29uZmRpcgorc2hhcmVkc3RhdGVkaXIKK2xvY2Fsc3RhdGVkaXIKK2luY2x1ZGVkaXIKK29sZGluY2x1ZGVkaXIKK2RvY2RpcgoraW5mb2RpcgoraHRtbGRpcgorZHZpZGlyCitwZGZkaXIKK3BzZGlyCitsaWJkaXIKK2xvY2FsZWRpcgorbWFuZGlyCitERUZTCitFQ0hPX0MKK0VDSE9fTgorRUNIT19UCitMSUJTCitidWlsZF9hbGlhcworaG9zdF9hbGlhcwordGFyZ2V0X2FsaWFzCitidWlsZAorYnVpbGRfY3B1CitidWlsZF92ZW5kb3IKK2J1aWxkX29zCitob3N0Citob3N0X2NwdQoraG9zdF92ZW5kb3IKK2hvc3Rfb3MKK1NITElDQzIKK0NDCitDRkxBR1MKK0xERkxBR1MKK0NQUEZMQUdTCithY19jdF9DQworRVhFRVhUCitPQkpFWFQKK0NQUAorR1JFUAorRUdSRVAKK0xJQk9CSlMKK1ZfQ0NPUFQKK1ZfREVGUworVl9HUk9VUAorVl9JTkNMUworVl9QQ0FQREVQCitMT0NBTFNSQworSU5TVEFMTF9QUk9HUkFNCitJTlNUQUxMX1NDUklQVAorSU5TVEFMTF9EQVRBCitMVExJQk9CSlMnCithY19zdWJzdF9maWxlcz0nJworICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKK2hvc3RfYWxpYXMKK3RhcmdldF9hbGlhcworQ0MKK0NGTEFHUworTERGTEFHUworTElCUworQ1BQRkxBR1MKK0NQUCcKKworCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCithY19pbml0X2hlbHA9CithY19pbml0X3ZlcnNpb249ZmFsc2UKKyMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCisjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCitjYWNoZV9maWxlPS9kZXYvbnVsbAorZXhlY19wcmVmaXg9Tk9ORQorbm9fY3JlYXRlPQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordmVyYm9zZT0KK3hfaW5jbHVkZXM9Tk9ORQoreF9saWJyYXJpZXM9Tk9ORQorCisjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKyMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgorIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKyMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCisjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCitiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKK3NiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCitsaWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJworZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKK2RhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jworc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKK3NoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJworbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKK2luY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJworZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFfScKK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCitodG1sZGlyPScke2RvY2Rpcn0nCitkdmlkaXI9JyR7ZG9jZGlyfScKK3BkZmRpcj0nJHtkb2NkaXJ9JworcHNkaXI9JyR7ZG9jZGlyfScKK2xpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCittYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKworYWNfcHJldj0KK2FjX2Rhc2hkYXNoPQorZm9yIGFjX29wdGlvbgorZG8KKyAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KKyAgICBhY19wcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKyAgKikJYWNfb3B0YXJnPXllcyA7OworICBlc2FjCisKKyAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KKworICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKyAgLS0pCisgICAgYWNfZGFzaGRhc2g9eWVzIDs7CisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKKyAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisgIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQorICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQorICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OworICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKKyAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKKworICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7CisKKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgYWNfcHJldj1kYXRhZGlyIDs7CisgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisgICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisgIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQorICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKKyAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAorICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKKyAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1cJGFjX29wdGFyZyA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICB3aXRoX2dhcz15ZXMgOzsKKworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGFjX2luaXRfaGVscD1sb25nIDs7CisgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKyAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7CisgIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKworICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKKyAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKyAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKyAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCisgIHwgLS1odD0qKQorICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKKyAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKKyAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKKyAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgYWNfcHJldj1pbmZvZGlyIDs7CisgIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCisgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSRhY19vcHRhcmcgOzsKKworICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQorICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OworICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKKyAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCisgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKyAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKKyAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCisgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQorICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgorICAgIHdpdGhfZnA9bm8gOzsKKworICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKKyAgICBhY19wcmV2PXByZWZpeCA7OworICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCisgICAgcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKKyAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7CisgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCisgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAorICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCisgICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7CisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQorICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworCisgIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCisgICAgYWNfcHJldj1wZGZkaXIgOzsKKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKyAgICBwZGZkaXI9JGFjX29wdGFyZyA7OworCisgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisgICAgYWNfcHJldj1wc2RpciA7OworICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCisgICAgc2lsZW50PXllcyA7OworCisgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQorICAgIGFjX3ByZXY9c2JpbmRpciA7OworICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAorICB8IC0tc2JpPSogfCAtLXNiPSopCisgICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAorICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAorICB8IC0tc2hhIHwgLS1zaCkKKyAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7CisgIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAorICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAorICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgfCAtLXNoYT0qIHwgLS1zaD0qKQorICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9JGFjX29wdGFyZyA7OworCisgIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCisgICAgYWNfcHJldj1zcmNkaXIgOzsKKyAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworCisgIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKKyAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgYWNfcHJldj1zeXNjb25mZGlyIDs7CisgIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCisgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKyAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OworCisgIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCisgICAgdmVyYm9zZT15ZXMgOzsKKworICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQorICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisKKyAgLXdpdGgtKiB8IC0td2l0aC0qKQorICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAorICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1cJGFjX29wdGFyZyA7OworCisgIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKKyAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKKyAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKKworICAtLXgpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorICAgIHdpdGhfeD15ZXMgOzsKKworICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCisgIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCisgICAgYWNfcHJldj14X2luY2x1ZGVzIDs7CisgIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCisgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKyAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKworICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKKyAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7CisgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCisgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworCisgIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgIDs7CisKKyAgKj0qKQorICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCisgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKworICAqKQorICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKKyMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KK2ZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAorCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKwkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorZG8KKyAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgIGNhc2UgJGFjX3ZhbCBpbgorICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7CisgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworICBlc2FjCisgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisgICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCithY19sc19kaT1gbHMgLWRpIC5gICYmCithY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBXb3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK3Rlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworCisjIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCitpZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgorICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorZWNobyBYIiQwIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgc3JjZGlyPSRhY19jb25mZGlyCisgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgc3JjZGlyPS4uCisgIGZpCitlbHNlCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KK2ZpCitpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKKyAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorYWNfYWJzX2NvbmZkaXI9YCgKKwljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IHsgZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwlwd2QpYAorIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KK2lmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisjIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgorIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCisjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KK2Nhc2UgJHNyY2RpciBpbgorKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Citlc2FjCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorZG9uZQorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCisgIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCisgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisgICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQorCitJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAorCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQorICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorCQkJICBbUFJFRklYXQorCitCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KK1xgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5CithbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAorZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKworRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCisKK0ZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisgIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisgIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQorICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCisgIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQorICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvUEFDS0FHRV0KKyAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKyAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCisgIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorX0FDRU9GCisKKyAgY2F0IDw8XF9BQ0VPRgorCitTeXN0ZW0gdHlwZXM6CisgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisgIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQorX0FDRU9GCitmaQorCitpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorCisgIGNhdCA8PFxfQUNFT0YKKworT3B0aW9uYWwgRmVhdHVyZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLWVuYWJsZS1zbWIgICAgICAgICAgICBlbmFibGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIgZGVmYXVsdD15ZXMKKyAgLS1kaXNhYmxlLXNtYiAgICAgICAgICAgZGlzYWJsZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlcgorICAtLWVuYWJsZS1pcHY2ICAgICAgICAgICBlbmFibGUgaXB2NiAod2l0aCBpcHY0KSBzdXBwb3J0CisgIC0tZGlzYWJsZS1pcHY2ICAgICAgICAgIGRpc2FibGUgaXB2NiBzdXBwb3J0CisKK09wdGlvbmFsIFBhY2thZ2VzOgorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXdpdGhvdXQtZ2NjICAgICAgICAgICBkb24ndCB1c2UgZ2NjCisgIC0td2l0aC11c2VyPVVTRVJOQU1FICAgIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0IHRvIFVTRVJOQU1FCisgIC0td2l0aC1jaHJvb3Q9RElSRUNUT1JZIHdoZW4gZHJvcHBpbmcgcHJpdmlsZWdlcywgY2hyb290IHRvIERJUkVDVE9SWQorICAtLXdpdGhvdXQtY3J5cHRvICAgICAgICBkaXNhYmxlIGNyeXB0byBzdXBwb3J0CisKK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKKyAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncworICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKyAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgorICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+CisgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKyAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+CisgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCisKK1VzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCitpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCisKK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorICBhY190b3BfYnVpbGRkaXJfc3ViPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLy4uLGc7cywvLCwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworICAgIGNkICIkYWNfZGlyIiB8fCB7IGFjX3N0YXR1cz0kPzsgY29udGludWU7IH0KKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KKyAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCisgICAgICBlY2hvICYmCisgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQorICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCisgICAgICBlY2hvICYmCisgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxzZQorICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2NvbmZpZ3VyZQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxCisKK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKzIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorX0FDRU9GCisgIGV4aXQKK2ZpCitjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKK1RoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCitydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorCitJdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgJCAkMCAkQAorCitfQUNFT0YKK2V4ZWMgNT4+Y29uZmlnLmxvZworeworY2F0IDw8X0FTVU5BTUUKKyMjIC0tLS0tLS0tLSAjIworIyMgUGxhdGZvcm0uICMjCisjIyAtLS0tLS0tLS0gIyMKKworaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAorCisvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisKK19BU1VOQU1FCisKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZWNobyAiUEFUSDogJGFzX2RpciIKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworfSA+JjUKKworY2F0ID4mNSA8PF9BQ0VPRgorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyBDb3JlIHRlc3RzLiAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworX0FDRU9GCisKKworIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCisjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorYWNfY29uZmlndXJlX2FyZ3MwPQorYWNfY29uZmlndXJlX2FyZ3MxPQorYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKK2ZvciBhY19wYXNzIGluIDEgMgorZG8KKyAgZm9yIGFjX2FyZworICBkbworICAgIGNhc2UgJGFjX2FyZyBpbgorICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKKyAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgICAgY29udGludWUgOzsKKyAgICAqXCcqKQorICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworICAgIGVzYWMKKyAgICBjYXNlICRhY19wYXNzIGluCisgICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKKyAgICAyKQorICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKKyAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgorCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KKyAgICAgIGVsc2UKKwljYXNlICRhY19hcmcgaW4KKwkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAorCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAorCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAorCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCisJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgorCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7CisJICAgIGVzYWMKKwkgICAgOzsKKwkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCiskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KKyRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQorCisjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCisjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQorIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCisjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KKyMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KK3RyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorICB7CisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKyAgICAgIGVzYWMgOzsKKyAgICBlc2FjCisgIGRvbmUKKyAgKHNldCkgMj4mMSB8CisgICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAorICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKyAgICAgIHNlZCAtbiBcCisJInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispCisgICAgZWNobworCisgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgZWNobworICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKKyAgICBkbworICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisgICAgICBjYXNlICRhY192YWwgaW4KKyAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworICAgICAgZXNhYworICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICBjYXQgPDxcX0FTQk9YCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCitfQVNCT1gKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworCWVzYWMKKwllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKKyAgICAgIGRvbmUgfCBzb3J0CisgICAgICBlY2hvCisgICAgZmkKKworICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgorICAgICAgY2F0IDw8XF9BU0JPWAorIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIworX0FTQk9YCisgICAgICBlY2hvCisgICAgICBjYXQgY29uZmRlZnMuaAorICAgICAgZWNobworICAgIGZpCisgICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgorICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKKyAgfSA+JjUKKyAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCisgICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgorICAgIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKK2ZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbworICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKK2RvbmUKK2FjX3NpZ25hbD0wCisKKyMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCitybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKK19BQ0VPRgorCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorX0FDRU9GCisKKworIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCisjIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICBzZXQgeCAiJENPTkZJR19TSVRFIgorZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKyAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKK2Vsc2UKKyAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAorCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorZmkKK3NoaWZ0Citmb3IgYWNfc2l0ZV9maWxlCitkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKyAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCitpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKyAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCisgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKKyAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgID4kY2FjaGVfZmlsZQorZmkKKworIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQorIyB2YWx1ZS4KK2FjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQorZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQorICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1CitlY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9CisJYWNfY2FjaGVfY29ycnVwdGVkPToKKyAgICAgIGZpOzsKKyAgZXNhYworICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorICAgIGNhc2UgJGFjX25ld192YWwgaW4KKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAgIGVzYWMKKyAgZmkKK2RvbmUKK2lmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisKKworCithY19hdXhfZGlyPQorZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KKyAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorICAgIGJyZWFrCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZmkKKworIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCisjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKyMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KK2FjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorCisKKyMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KKyRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9CitjYXNlICRhY19jdl9idWlsZCBpbgorKi0qLSopIDs7CisqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Citlc2FjCitidWlsZD0kYWNfY3ZfYnVpbGQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9idWlsZAorc2hpZnQKK2J1aWxkX2NwdT0kMQorYnVpbGRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorYnVpbGRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKK2Vsc2UKKyAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKKyAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Citlc2FjCitob3N0PSRhY19jdl9ob3N0CithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfaG9zdAorc2hpZnQKK2hvc3RfY3B1PSQxCitob3N0X3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2hvc3Rfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworCisKKworCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nY2Mgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2djYytzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSR3aXRoX2djYzsKK2ZpCisKKyAgICBWX0NDT1BUPSItTyIKKyAgICBWX0lOQ0xTPSIiCisgICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCisJICAgIFZfSU5DTFM9Ii1JXCQoc3JjZGlyKSIKKyAgICBmaQorICAgIGlmIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCisJICAgIExCTF9DRkxBR1M9IiRDRkxBR1MiCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkQ0MiIDsgdGhlbgorCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCSAgICBic2RpKikKKwkJICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2hsaWNjMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgc2hsaWNjMjsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NITElDQzIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFNITElDQzIiOyB0aGVuCisgIGFjX2N2X3Byb2dfU0hMSUNDMj0iJFNITElDQzIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfU0hMSUNDMj0ieWVzIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgdGVzdCAteiAiJGFjX2N2X3Byb2dfU0hMSUNDMiIgJiYgYWNfY3ZfcHJvZ19TSExJQ0MyPSJubyIKK2ZpCitmaQorU0hMSUNDMj0kYWNfY3ZfcHJvZ19TSExJQ0MyCitpZiB0ZXN0IC1uICIkU0hMSUNDMiI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0hMSUNDMiIgPiY1CitlY2hvICIke0VDSE9fVH0kU0hMSUNDMiIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCisJCSAgICBpZiB0ZXN0ICRTSExJQ0MyID0geWVzIDsgdGhlbgorCQkJICAgIENDPXNobGljYzIKKwkJCSAgICBleHBvcnQgQ0MKKwkJICAgIGZpCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkQ0MiIC1hICIkd2l0aF9nY2MiID0gbm8gOyB0aGVuCisJICAgIENDPWNjCisJICAgIGV4cG9ydCBDQworICAgIGZpCisgICAgYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKKyAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKK3dob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKK2NvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CitlY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQorZWxzZQorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKKworICBmaQorZmkKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKyAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworICAgICAgIGNvbnRpbnVlCisgICAgIGZpCisgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCisgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgorICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQworICBzaGlmdAorICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KKyAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgc2hpZnQKKyAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKKyAgZmkKK2ZpCitmaQorZmkKK0NDPSRhY19jdl9wcm9nX0NDCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9CitlbHNlCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJENDIjsgdGhlbgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCit3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCitjb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scword2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcworY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBDQz0kYWNfY3RfQ0MKKyAgZmkKK2ZpCisKK2ZpCisKKwordGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCitlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1CithY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCit7IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9Cit7IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCithY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9CithY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCisjCisjIExpc3Qgb2YgcG9zc2libGUgb3V0cHV0IGZpbGVzLCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4KKyMgVGhlIGFsZ29yaXRobSBpcyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikKKyMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KK2FjX2ZpbGVzPSdhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0JworIworIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCisjIGV4ZWN1dGFibGUsIHJldGFpbmluZyB0aGVpciBwZXJtaXNzaW9ucy4gIFJlbW92ZSB0aGVtIGZpcnN0IHNvIGEKKyMgc3Vic2VxdWVudCBleGVjdXRpb24gdGVzdCB3b3Jrcy4KK2FjX3JtZmlsZXM9Citmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKK2RvCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7CisgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisgIGVzYWMKK2RvbmUKK3JtIC1mICRhY19ybWZpbGVzCisKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworIyBBdXRvY29uZi4KK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCisgIGNhc2UgJGFjX2ZpbGUgaW4KKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCisJOzsKKyAgICBbYWJdLm91dCApCisJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKwkjIGNlcnRhaW5seSByaWdodC4KKwlicmVhazs7CisgICAgKi4qICkKKyAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87CisJdGhlbiA6OyBlbHNlCisJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCisJZmkKKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKwkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKwkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKwkjIGFjdHVhbGx5IHdvcmtpbmcuCisJYnJlYWs7OworICAgICogKQorCWJyZWFrOzsKKyAgZXNhYworZG9uZQordGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9CisKK2Vsc2UKKyAgYWNfZmlsZT0nJworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9CitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KK2ZpCisKK2FjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0CisKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKKyMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KK0lmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICBmaQorICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisKK3JtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKyMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCisjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKKyMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKyMgYHJtJy4KK2ZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKwkgIGJyZWFrOzsKKyAgICAqICkgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitmaQorCitybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KKworcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorRVhFRVhUPSRhY19jdl9leGVleHQKK2FjX2V4ZWV4dD0kRVhFRVhUCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisgIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7CisgICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCisgICAgICAgYnJlYWs7OworICBlc2FjCitkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KK09CSkVYVD0kYWNfY3Zfb2JqZXh0CithY19vYmpleHQ9JE9CSkVYVAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY29tcGlsZXJfZ251PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitHQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KK2FjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJQ0ZMQUdTPSIiCisgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19nPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19jY19jODk9bm8KK2FjX3NhdmVfQ0M9JENDCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCitzdHJ1Y3QgYnVmIHsgaW50IHg7IH07CitGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworc3RhdGljIGNoYXIgKmUgKHAsIGkpCisgICAgIGNoYXIgKipwOworICAgICBpbnQgaTsKK3sKKyAgcmV0dXJuIHBbaV07Cit9CitzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCit7CisgIGNoYXIgKnM7CisgIHZhX2xpc3QgdjsKKyAgdmFfc3RhcnQgKHYscCk7CisgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisgIHZhX2VuZCAodik7CisgIHJldHVybiBzOworfQorCisvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgorICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCisgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisgICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCisgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KK2ludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07CisKKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLworI2RlZmluZSBGT08oeCkgJ3gnCitpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKworaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7CitzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKK3N0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OworaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7CitpbnQgYXJnYzsKK2NoYXIgKiphcmd2OworaW50CittYWluICgpCit7CityZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKKwktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorZG8KKyAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKyAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKK2RvbmUKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0NDPSRhY19zYXZlX0NDCisKK2ZpCisjIEFDX0NBQ0hFX1ZBTAorY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KKyAgeCkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKyAgeG5vKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OworICAqKQorICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Citlc2FjCisKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgIGlmIHRlc3QgIiRTSExJQ0MyIiA9IHllcyA7IHRoZW4KKwkJICAgIGFjX2N2X2xibF9nY2NfdmVycz0yCisJCSAgICBWX0NDT1BUPSItTzIiCisJICAgIGVsc2UKKwkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdjYyB2ZXJzaW9uIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZ2NjIHZlcnNpb24uLi4gJEVDSE9fQyIgPiY2OyB9CisJCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9nY2NfdmVycytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9sYmxfZ2NjX3ZlcnM9YCRDQyAtdiAyPiYxIHwgXAorCQkJICAgIHNlZCAtZSAnL15nY2MgdmVyc2lvbiAvIWQnIFwKKwkJCQktZSAncy9eZ2NjIHZlcnNpb24gLy8nIFwKKwkJCQktZSAncy8gLiovLycgLWUgJ3MvXlteMC05XSovLycgXAorCQkJCS1lICdzL1wuLiovLydgCitmaQorCisJCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfZ2NjX3ZlcnMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9nY2NfdmVycyIgPiY2OyB9CisJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX3ZlcnMgLWd0IDEgOyB0aGVuCisJCQkgICAgVl9DQ09QVD0iLU8yIgorCQkgICAgZmkKKwkgICAgZmkKKyAgICBlbHNlCisJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCAkQ0MgaGFuZGxlcyBhbnNpIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9CisJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworaW50IGZyb2IoaW50LCBjaGFyICopCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjY7IH0KKwkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcyA9IG5vIDsgdGhlbgorCQkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkJICAgIGhwdXgqKQorCQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKS4uLiAkRUNIT19DIiA+JjY7IH0KKwkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKKwkJCSAgICBDRkxBR1M9Ii1BYSAtRF9IUFVYX1NPVVJDRSAkQ0ZMQUdTIgorCQkJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWErc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBmcm9iKGludCwgY2hhciAqKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X2xibF9jY19ocHV4X2NjX2FhPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9jY19ocHV4X2NjX2FhIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSIgPiY2OyB9CisJCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEgPSBubyA7IHRoZW4KKwkJCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQkJICAgIGZpCisJCQkgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCisJCQkgICAgVl9DQ09QVD0iLUFhICRWX0NDT1BUIgorCQkJICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIF9IUFVYX1NPVVJDRSAxCitfQUNFT0YKKworCQkJICAgIDs7CisKKwkJICAgICopCisJCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCQkJICAgIDs7CisJCSAgICBlc2FjCisJICAgIGZpCisJICAgIFZfSU5DTFM9IiRWX0lOQ0xTIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgorCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgorCisJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJICAgIGlyaXgqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLXhhbnNpIC1zaWduZWQgLU8iCisJCSAgICA7OworCisJICAgIG9zZiopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtc3RkMSAtTyIKKwkJICAgIDs7CisKKwkgICAgdWx0cml4KikKKwkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgVWx0cml4ICRDQyBoYWNrcyBjb25zdCBpbiBwcm90b3R5cGVzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCBVbHRyaXggJENDIGhhY2tzIGNvbnN0IGluIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9CisJCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9jY19jb25zdF9wcm90bytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IGEgeyBpbnQgYjsgfTsKKwkJCSAgICB2b2lkIGMoY29uc3Qgc3RydWN0IGEgKikKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfY29uc3RfcHJvdG8iID4mNjsgfQorCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvID0gbm8gOyB0aGVuCisJCQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgY29uc3QKK19BQ0VPRgorCisJCSAgICBmaQorCQkgICAgOzsKKwkgICAgZXNhYworICAgIGZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5saW5lLi4uICRFQ0hPX0MiID4mNjsgfQorICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorCisJYWNfY3ZfbGJsX2lubGluZT0iIgorCWFjX2xibF9jY19pbmxpbmU9bm8KKwlmb3IgYWNfbGJsX2lubGluZSBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZQorCWRvCisJICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2RlZmluZSBpbmxpbmUgJGFjX2xibF9pbmxpbmUKKwkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICpmb28odm9pZCk7CisJCXN0cnVjdCBpbHRlc3QgeworCQkgICAgaW50IGlsdGVzdDE7CisJCSAgICBpbnQgaWx0ZXN0MjsKKwkJfTsKKworCQlzdGF0aWMgaW5saW5lIHN0cnVjdCBpbHRlc3QgKgorCQlmb28oKQorCQl7CisJCSAgICBzdGF0aWMgc3RydWN0IGlsdGVzdCB4eHg7CisKKwkJICAgIHJldHVybiAmeHh4OworCQl9CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xibF9jY19pbmxpbmU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisJICAgIGlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KKwkJYnJlYWs7CisJICAgIGZpCisJZG9uZQorCWlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KKwkgICAgYWNfY3ZfbGJsX2lubGluZT0kYWNfbGJsX2lubGluZQorCWZpCitmaQorCisgICAgaWYgdGVzdCAhIC16ICIkYWNfY3ZfbGJsX2lubGluZSIgOyB0aGVuCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2lubGluZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2lubGluZSIgPiY2OyB9CisgICAgZWxzZQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorICAgIGZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgaW5saW5lICRhY19jdl9sYmxfaW5saW5lCitfQUNFT0YKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9fX2F0dHJpYnV0ZV9fK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQKK2Zvbyh2b2lkKQoreworICBleGl0KDEpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBmb28oKTsKK30KKworX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X19fYXR0cmlidXRlX189eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9fX2F0dHJpYnV0ZV9fPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfX19BVFRSSUJVVEVfXyAxCitfQUNFT0YKKworICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKVwiIgorZWxzZQorICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJcIiIKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjY7IH0KKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjY7IH0KKyMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCitpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgorICBDUFA9CitmaQoraWYgdGVzdCAteiAiJENQUCI7IHRoZW4KKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisJCSAgICAgU3ludGF4IGVycm9yCitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorY29udGludWUKK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisKKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuCisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgUGFzc2VzIGJvdGggdGVzdHMuCithY19wcmVwcm9jX29rPToKK2JyZWFrCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCitkb25lCisjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICBicmVhaworZmkKKworICAgIGRvbmUKKyAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCisKK2ZpCisgIENQUD0kYWNfY3ZfcHJvZ19DUFAKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9JENQUAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1CitlY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KK2FjX3ByZXByb2Nfb2s9ZmFsc2UKK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworZG8KKyAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYworICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKyAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgorICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgOgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KK2NvbnRpbnVlCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorCisgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorY29udGludWUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoraWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KKyAgOgorZWxzZQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyZXAgZ2dyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0CitpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KK3NldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisgICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAorY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCisgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisgICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisKKyAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgZG9uZQorZG9uZQorCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworZmkKKworR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKK2lmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCitmaQorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZWdyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0CitpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCitzZXQgZHVtbXkgZWdyZXA7IGFjX3Byb2dfbmFtZT0kMgoraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKyMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKyAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKK2Nhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID4iY29uZnRlc3QuaW4iCisgIHdoaWxlIDoKKyAgZG8KKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKyAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKKyAgICBlY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAorICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKworICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKyAgZG9uZQorZG9uZQorCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworZmkKKworRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgoraWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2ZpCisKK2Vsc2UKKyAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKK2ZpCisKKworICAgZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCisgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKyNlbHNlCisjIGRlZmluZSBJU0xPV0VSKGMpIFwKKwkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKKwkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCisJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQorI2VuZGlmCisKKyNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCitpbnQKK21haW4gKCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCisJfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCisgICAgICByZXR1cm4gMjsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIDoKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFNURENfSEVBREVSUyAxCitfQUNFT0YKKworZmkKKworIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KKworCisKKworCisKKworCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAorCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworCisKKworZm9yIGFjX2hlYWRlciBpbiBmY250bC5oIHJwYy9ycGNlbnQuaCBuZXRkbmV0L2RuZXRkYi5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKworICAgIDs7Citlc2FjCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworZm9yIGFjX2hlYWRlciBpbiBuZXQvcGZ2YXIuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPT0geWVzOyB0aGVuCisJTE9DQUxTUkM9InByaW50LXBmbG9nLmMgJExPQ0FMU1JDIgorZmkKKworZm9yIGFjX2hlYWRlciBpbiBuZXRpbmV0L2lmX2V0aGVyLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAhPSB5ZXM7IHRoZW4KKwkjCisJIyBUaGUgc2ltcGxlIHRlc3QgZGlkbid0IHdvcmsuCisJIyBEbyB3ZSBuZWVkIHRvIGluY2x1ZGUgPG5ldC9pZi5oPiBmaXJzdD8KKwkjIFVuc2V0IGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2ggc28gd2UgZG9uJ3QKKwkjIHRyZWF0IHRoZSBwcmV2aW91cyBmYWlsdXJlIGFzIGEgY2FjaGVkIHZhbHVlIGFuZAorCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KKwkjCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogUmVjaGVja2luZyB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmNsdWRlcyIgPiY1CitlY2hvICIkYXNfbWU6IFJlY2hlY2tpbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgaW5jbHVkZXMiID4mNjt9CisJdW5zZXQgYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaAorCitmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvaWZfZXRoZXIuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KK3N0cnVjdCBtYnVmOworc3RydWN0IHJ0ZW50cnk7CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGltZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworaW50CittYWluICgpCit7CitpZiAoKHN0cnVjdCB0bSAqKSAwKQorcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9oZWFkZXJfdGltZT1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCitfQUNFT0YKKworZmkKKworCitjYXNlICIkaG9zdF9vcyIgaW4KKworbGludXgqKQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTGludXgga2VybmVsIHZlcnNpb24uLi4gJEVDSE9fQyIgPiY2OyB9CisgCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgCQlpZiB0ZXN0ICIke2FjX2N2X2xpbnV4X3ZlcnMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfbGludXhfdmVycz11bmtub3duCitmaQorCisgCWVsc2UKKyAJCWlmIHRlc3QgIiR7YWNfY3ZfbGludXhfdmVycytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jdl9saW51eF92ZXJzPWB1bmFtZSAtciAyPiYxIHwgXAorIAkJCXNlZCAtbiAtZSAnJHMvLiogLy8nIC1lICckcy9cLi4qLy9wJ2AKK2ZpCisKKyAJZmkKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saW51eF92ZXJzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saW51eF92ZXJzIiA+JjY7IH0KKyAJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyA9IHVua25vd24gOyB0aGVuCisgCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGxpbnV4IHZlcnNpb24gd2hlbiBjcm9zcy1jb21waWxpbmciID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGRldGVybWluZSBsaW51eCB2ZXJzaW9uIHdoZW4gY3Jvc3MtY29tcGlsaW5nIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgCWZpCisJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyAtbHQgMiA7IHRoZW4KKwkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdmVyc2lvbiAyIG9yIGhpZ2hlciByZXF1aXJlZDsgc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IHZlcnNpb24gMiBvciBoaWdoZXIgcmVxdWlyZWQ7IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCWZpCisJOzsKKworKikKKwk7OworZXNhYworCisKKworZm9yIGFjX2hlYWRlciBpbiBzbWkuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisKKyAgICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzbWlJbml0IGluIC1sc21pIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNtaUluaXQgaW4gLWxzbWkuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zbWlfc21pSW5pdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHNtaSAgJExJQlMiCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBzbWlJbml0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc21pSW5pdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl9zbWlfc21pSW5pdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9zbWlfc21pSW5pdD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NtaV9zbWlJbml0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc21pX3NtaUluaXQiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX3NtaV9zbWlJbml0ID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJTTUkgMQorX0FDRU9GCisKKyAgTElCUz0iLWxzbWkgJExJQlMiCisKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfc21pX2giID0geWVzIC1hICIkYWNfY3ZfbGliX3NtaV9zbWlJbml0IiA9IHllcwordGhlbgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGlic21pIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGlic21pLi4uICRFQ0hPX0MiID4mNjsgfQorICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub3Qgd2hlbiBjcm9zcy1jb21waWxpbmciID4mNQorZWNobyAiJHtFQ0hPX1R9bm90IHdoZW4gY3Jvc3MtY29tcGlsaW5nIiA+JjY7IH0KKyAgbGlic21pPW5vCisKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisgLyogbGlic21pIGF2YWlsYWJsZSBjaGVjayAqLworI2luY2x1ZGUgPHNtaS5oPgorbWFpbigpCit7CisgIGludCBjdXJyZW50LCByZXZpc2lvbiwgYWdlLCBuOworICBjb25zdCBpbnQgcmVxdWlyZWQgPSAyOworICBpZiAoc21pSW5pdCgiIikpCisgICAgZXhpdCgxKTsKKyAgaWYgKHN0cmNtcChTTUlfTElCUkFSWV9WRVJTSU9OLCBzbWlfbGlicmFyeV92ZXJzaW9uKSkKKyAgICBleGl0KDIpOworICBuID0gc3NjYW5mKHNtaV9saWJyYXJ5X3ZlcnNpb24sICIlZDolZDolZCIsICZjdXJyZW50LCAmcmV2aXNpb24sICZhZ2UpOworICBpZiAobiAhPSAzKQorICAgIGV4aXQoMyk7CisgIGlmIChyZXF1aXJlZCA8IGN1cnJlbnQgLSBhZ2UgfHwgcmVxdWlyZWQgPiBjdXJyZW50KQorICAgIGV4aXQoNCk7CisgIGV4aXQoMCk7Cit9CisKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKyAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIExJQlNNSSAxCitfQUNFT0YKKworICBsaWJzbWk9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCisgY2FzZSAkPyBpbgorICAxKSB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIC0gc21pSW5pdCBmYWlsZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm8gLSBzbWlJbml0IGZhaWxlZCIgPiY2OyB9IDs7CisgIDIpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSBoZWFkZXIvbGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIC0gaGVhZGVyL2xpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCIgPiY2OyB9IDs7CisgIDMpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSBjYW4ndCBkZXRlcm1pbmUgbGlicmFyeSB2ZXJzaW9uIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIC0gY2FuJ3QgZGV0ZXJtaW5lIGxpYnJhcnkgdmVyc2lvbiIgPiY2OyB9IDs7CisgIDQpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSB0b28gb2xkIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIC0gdG9vIG9sZCIgPiY2OyB9IDs7CisgICopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfSA7OworICBlc2FjCisgIGxpYnNtaT1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIuLi4gJEVDSE9fQyIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc21iIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3NtYitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9zbWI7CitlbHNlCisgIGVuYWJsZXZhbD15ZXMKK2ZpCisKK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogVGhlIFNNQiBwcmludGVyIG1heSBoYXZlIGV4cGxvaXRhYmxlIGJ1ZmZlciBvdmVyZmxvd3MhISEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiBUaGUgU01CIHByaW50ZXIgbWF5IGhhdmUgZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93cyEhISIgPiYyO30KKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBUQ1BEVU1QX0RPX1NNQiAxCitfQUNFT0YKKworCUxPQ0FMU1JDPSJwcmludC1zbWIuYyBzbWJ1dGlsLmMgJExPQ0FMU1JDIgorCTs7CisqKQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwk7OworZXNhYworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdXNlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdXNlcitzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSR3aXRoX3VzZXI7CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICEgLXogIiR3aXRoX3VzZXIiIDsgdGhlbgorICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFdJVEhfVVNFUiAiJHdpdGh2YWwiCitfQUNFT0YKKworICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdG8gXCIkd2l0aHZhbFwiIiA+JjUKK2VjaG8gIiR7RUNIT19UfXRvIFwiJHdpdGh2YWxcIiIgPiY2OyB9CitlbHNlCisgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2hyb290IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jaHJvb3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgd2l0aHZhbD0kd2l0aF9jaHJvb3Q7CitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGNocm9vdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gY2hyb290Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAhIC16ICIkd2l0aF9jaHJvb3QiIDsgdGhlbgorICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFdJVEhfQ0hST09UICIkd2l0aHZhbCIKK19BQ0VPRgorCisgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB0byBcIiR3aXRodmFsXCIiID4mNQorZWNobyAiJHtFQ0hPX1R9dG8gXCIkd2l0aHZhbFwiIiA+JjY7IH0KK2Vsc2UKKyAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGlwdjYiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBpcHY2Li4uICRFQ0hPX0MiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlwdjYgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfaXB2NitzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9JGVuYWJsZV9pcHY2OyAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KK3llcykgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorICAgICAgIExPQ0FMU1JDPSJwcmludC1pcDYuYyBwcmludC1pcDZvcHRzLmMgcHJpbnQtbW9iaWxpdHkuYyBwcmludC1yaXBuZy5jIHByaW50LWljbXA2LmMgcHJpbnQtZnJhZzYuYyBwcmludC1ydDYuYyBwcmludC1vc3BmNi5jIHByaW50LWRoY3A2LmMgJExPQ0FMU1JDIgorICAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIElORVQ2IDEKK19BQ0VPRgorCisgICAgICAgaXB2Nj15ZXMKKyAgICAgICA7OworKikKKyAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgICAgICBpcHY2PW5vCisgICAgICAgOzsKKyAgZXNhYworZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisgIGlwdjY9bm8KKworZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAvKiBBRl9JTkVUNiBhdmFpbGFibGUgY2hlY2sgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CittYWluKCkKK3sKKyBpZiAoc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCkgPCAwKQorICAgZXhpdCgxKTsKKyBlbHNlCisgICBleGl0KDApOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorICBMT0NBTFNSQz0icHJpbnQtaXA2LmMgcHJpbnQtaXA2b3B0cy5jIHByaW50LW1vYmlsaXR5LmMgcHJpbnQtcmlwbmcuYyBwcmludC1pY21wNi5jIHByaW50LWZyYWc2LmMgcHJpbnQtcnQ2LmMgcHJpbnQtb3NwZjYuYyBwcmludC1kaGNwNi5jICRMT0NBTFNSQyIKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSU5FVDYgMQorX0FDRU9GCisKKyAgaXB2Nj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKKyB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgaXB2Nj1ubworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCitmaQorCisKK2lwdjZ0eXBlPXVua25vd24KK2lwdjZsaWI9bm9uZQoraXB2NnRyeWxpYmM9bm8KKworaWYgdGVzdCAiJGlwdjYiID0gInllcyI7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9CisJZm9yIGkgaW4gaW5yaWEga2FtZSBsaW51eC1nbGliYyBsaW51eC1saWJpbmV0NiB0b3NoaWJhIHY2ZCB6ZXRhOyBkbworCQljYXNlICRpIGluCisJCWlucmlhKQorCQkJCQkJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lmZGVmIElQVjZfSU5SSUFfVkVSU0lPTgoreWVzCisjZW5kaWYKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGlwdjZ0eXBlPSRpOworCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisJCQk7OworCQlrYW1lKQorCQkJCQkJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lmZGVmIF9fS0FNRV9fCit5ZXMKKyNlbmRpZgorX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgaXB2NnR5cGU9JGk7CisJCQkJaXB2NmxpYj1pbmV0NjsKKwkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOworCQkJCWlwdjZ0cnlsaWJjPXllczsKKwkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyIKK2ZpCitybSAtZiBjb25mdGVzdCoKKworCQkJOzsKKwkJbGludXgtZ2xpYmMpCisJCQkJCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMQoreWVzCisjZW5kaWYKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGlwdjZ0eXBlPSRpOworCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisJCQk7OworCQlsaW51eC1saWJpbmV0NikKKwkJCQkJCQkJCQkJCQkJCQkJCWlmIHRlc3QgLWQgL3Vzci9pbmV0NiAtbyAtZiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcDYuaDsgdGhlbgorCQkJCWlwdjZ0eXBlPSRpCisJCQkJaXB2NmxpYj1pbmV0NgorCQkJCWlwdjZsaWJkaXI9L3Vzci9pbmV0Ni9saWIKKwkJCQlpcHY2dHJ5bGliYz15ZXM7CisJCQkJQ0ZMQUdTPSItRElORVQ2IC1JL3Vzci9pbmV0Ni9pbmNsdWRlICRDRkxBR1MiCisJCQlmaQorCQkJOzsKKwkJdG9zaGliYSkKKwkJCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIF9UT1NISUJBX0lORVQ2Cit5ZXMKKyNlbmRpZgorX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgaXB2NnR5cGU9JGk7CisJCQkJaXB2NmxpYj1pbmV0NjsKKwkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOworCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCisJCQk7OworCQl2NmQpCisJCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwvdXNyL2xvY2FsL3Y2L2luY2x1ZGUvc3lzL3Y2Y29uZmlnLmg+CisjaWZkZWYgX19WNkRfXworeWVzCisjZW5kaWYKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGlwdjZ0eXBlPSRpOworCQkJCWlwdjZsaWI9djY7CisJCQkJaXB2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKKwkJCQlDRkxBR1M9Ii1JL3Vzci9sb2NhbC92Ni9pbmNsdWRlICRDRkxBR1MiCitmaQorcm0gLWYgY29uZnRlc3QqCisKKwkJCTs7CisJCXpldGEpCisJCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpZmRlZiBfWkVUQV9NSU5BTUlfSU5FVDYKK3llcworI2VuZGlmCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBpcHY2dHlwZT0kaTsKKwkJCQlpcHY2bGliPWluZXQ2OworCQkJCWlwdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7CisJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiCitmaQorcm0gLWYgY29uZnRlc3QqCisKKwkJCTs7CisJCWVzYWMKKwkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAidW5rbm93biI7IHRoZW4KKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGlwdjZ0eXBlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRpcHY2dHlwZSIgPiY2OyB9CitmaQorCitpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIiAtYSAiJGlwdjZsaWIiICE9ICJub25lIjsgdGhlbgorCWlmIHRlc3QgLWQgJGlwdjZsaWJkaXIgLWEgLWYgJGlwdjZsaWJkaXIvbGliJGlwdjZsaWIuYTsgdGhlbgorCQlMSUJTPSItTCRpcHY2bGliZGlyIC1sJGlwdjZsaWIgJExJQlMiCisJCWVjaG8gIllvdSBoYXZlICRpcHY2bGliIGxpYnJhcnksIHVzaW5nIGl0IgorCWVsc2UKKwkJaWYgdGVzdCAiJGlwdjZ0cnlsaWJjIiA9ICJ5ZXMiOyB0aGVuCisJCQllY2hvICJZb3UgZG8gbm90IGhhdmUgJGlwdjZsaWIgbGlicmFyeSwgdXNpbmcgbGliYyIKKwkJZWxzZQorCQkJZWNobyAnRmF0YWw6IG5vICRpcHY2bGliIGxpYnJhcnkgZm91bmQuICBjYW5ub3QgY29udGludWUuJworCQkJZWNobyAiWW91IG5lZWQgdG8gZmV0Y2ggbGliJGlwdjZsaWIuYSBmcm9tIGFwcHJvcHJpYXRlIgorCQkJZWNobyAnaXB2NiBraXQgYW5kIGNvbXBpbGUgYmVmb3JlaGFuZC4nCisJCQlleGl0IDEKKwkJZmkKKwlmaQorZmkKKworCitpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIjsgdGhlbgorCSMKKwkjIFhYWCAtIG9uIFRydTY0IFVOSVggNS4xLCB0aGVyZSBpcyBubyAiZ2V0YWRkcmluZm8oKSIKKwkjIGZ1bmN0aW9uIGluIGxpYmM7IHRoZXJlIGFyZSAibmdldGFkZHJpbmZvKCkiIGFuZAorCSMgIm9nZXRhZGRyaW5mbygpIiBmdW5jdGlvbnMsIGFuZCA8bmV0ZGIuaD4gI2RlZmluZXMKKwkjICJnZXRhZGRyaW5mbyIgdG8gYmUgZWl0aGVyICJuZ2V0YWRkcmluZm8iIG9yCisJIyAib2dldGFkZHJpbmZvIiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgX1NPQ0tBRERSX0xFTgorCSMgb3IgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCBhcmUgZGVmaW5lZCBvciBub3QuCisJIworCSMgU28gdGhpcyB0ZXN0IGRvZXNuJ3Qgd29yayBvbiBUcnU2NCA1LjEsIGFuZCBwb3NzaWJseQorCSMgb24gb3RoZXIgNS54IHJlbGVhc2VzLiAgVGhpcyBjYXVzZXMgdGhlIGNvbmZpZ3VyZQorCSMgc2NyaXB0IHRvIGJlY29tZSBjb25mdXNlZCwgYW5kIHJlc3VsdHMgaW4gbGlicGNhcAorCSMgYmVpbmcgdW5idWlsZGFibGUuCisJIworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0YWRkcmluZm8iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldGFkZHJpbmZvLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRhZGRyaW5mbyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldGFkZHJpbmZvICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHNvY2tldDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX2dldGFkZHJpbmZvPSRhY19yZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGFkZHJpbmZvK3NldH0iID0gc2V0OyB0aGVuCisgIGJyZWFrCitmaQorZG9uZQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfZ2V0YWRkcmluZm89bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9nZXRhZGRyaW5mbyIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRhZGRyaW5mbworaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAgCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdldGFkZHJpbmZvIGJ1ZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGdldGFkZHJpbmZvIGJ1Zy4uLiAkRUNIT19DIiA+JjY7IH0KKwlpZiB0ZXN0ICIke3RkX2N2X2J1Z2d5Z2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbz15ZXMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK21haW4oKQoreworICBpbnQgcGFzc2l2ZSwgZ2FpZXJyLCBpbmV0NCA9IDAsIGluZXQ2ID0gMDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKKyAgY2hhciBzdHJhZGRyW0lORVQ2X0FERFJTVFJMRU5dLCBzdHJwb3J0WzE2XTsKKworICBmb3IgKHBhc3NpdmUgPSAwOyBwYXNzaXZlIDw9IDE7IHBhc3NpdmUrKykgeworICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyAgICBoaW50cy5haV9mbGFncyA9IHBhc3NpdmUgPyBBSV9QQVNTSVZFIDogMDsKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICAgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisgICAgaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhOVUxMLCAiNTQzMjEiLCAmaGludHMsICZhaXRvcCkpICE9IDApIHsKKyAgICAgICh2b2lkKWdhaV9zdHJlcnJvcihnYWllcnIpOworICAgICAgZ290byBiYWQ7CisgICAgfQorICAgIGZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKyAgICAgIGlmIChhaS0+YWlfYWRkciA9PSBOVUxMIHx8CisgICAgICAgICAgYWktPmFpX2FkZHJsZW4gPT0gMCB8fAorICAgICAgICAgIGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJhZGRyLCBzaXplb2Yoc3RyYWRkciksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgeworICAgICAgICBnb3RvIGJhZDsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoYWktPmFpX2ZhbWlseSkgeworICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICBpZiAoc3RyY21wKHN0cnBvcnQsICI1NDMyMSIpICE9IDApIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFzc2l2ZSkgeworICAgICAgICAgIGlmIChzdHJjbXAoc3RyYWRkciwgIjAuMC4wLjAiKSAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHN0cmNtcChzdHJhZGRyLCAiMTI3LjAuMC4xIikgIT0gMCkgeworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZXQ0Kys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgaWYgKHN0cmNtcChzdHJwb3J0LCAiNTQzMjEiKSAhPSAwKSB7CisgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhc3NpdmUpIHsKKyAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OiIpICE9IDApIHsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OjEiKSAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5ldDYrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFGX1VOU1BFQzoKKyAgICAgICAgZ290byBiYWQ7CisgICAgICAgIGJyZWFrOworI2lmZGVmIEFGX1VOSVgKKyAgICAgIGNhc2UgQUZfVU5JWDoKKyNlbHNlCisjaWZkZWYgQUZfTE9DQUwKKyAgICAgIGNhc2UgQUZfTE9DQUw6CisjZW5kaWYKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogYW5vdGhlciBmYW1pbHkgc3VwcG9ydD8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogc3VwcG9ydGVkIGZhbWlseSBzaG91bGQgYmUgMiwgdW5zdXBwb3J0ZWQgZmFtaWx5IHNob3VsZCBiZSAwICovCisgIGlmICghKGluZXQ0ID09IDAgfHwgaW5ldDQgPT0gMikpCisgICAgZ290byBiYWQ7CisgIGlmICghKGluZXQ2ID09IDAgfHwgaW5ldDYgPT0gMikpCisgICAgZ290byBiYWQ7CisKKyAgaWYgKGFpdG9wKQorICAgIGZyZWVhZGRyaW5mbyhhaXRvcCk7CisgIGV4aXQoMCk7CisKKyBiYWQ6CisgIGlmIChhaXRvcCkKKyAgICBmcmVlYWRkcmluZm8oYWl0b3ApOworICBleGl0KDEpOworfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89bm8KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK3RkX2N2X2J1Z2d5Z2V0YWRkcmluZm89eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCisKKwlpZiB0ZXN0ICIkdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbyIgPSBubzsgdGhlbgorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGdvb2QiID4mNQorZWNobyAiJHtFQ0hPX1R9Z29vZCIgPiY2OyB9CisJZWxzZQorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGJ1Z2d5IiA+JjUKK2VjaG8gIiR7RUNIT19UfWJ1Z2d5IiA+JjY7IH0KKwlmaQorCisJaWYgdGVzdCAiJHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm8iID0gInllcyI7IHRoZW4KKwkJIworCQkjIFhYWCAtIGl0IGRvZXNuJ3QgYXBwZWFyIHRoYXQgImlwdjZ0eXBlIiBjYW4gZXZlciBiZQorCQkjIHNldCB0byAibGludXgiLiAgU2hvdWxkIHRoaXMgYmUgdGVzdGluZyBmb3IKKwkJIyAibGludXgtZ2xpYmMiLCBvciBmb3IgdGhhdCAqb3IqICJsaW51eC1saWJpbmV0NiI/CisJCSMgSWYgdGhlIGxhdHRlciwgbm90ZSB0aGF0ICJsaW51eC1saWJpbmV0NiIgaXMgYWxzbworCQkjIHRoZSB0eXBlIGdpdmVuIHRvIHNvbWUgbm9uLUxpbnV4IE9TZXMuCisJCSMKKwkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAibGludXgiOyB0aGVuCisJCQllY2hvICdGYXRhbDogWW91IG11c3QgZ2V0IHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4nCisJCQllY2hvICcgICAgICAgb3IgeW91IGNhbiBzcGVjaWZ5ICItLWRpc2FibGUtaXB2NiInLgorCQkJZXhpdCAxCisJCWVsc2UKKwkJCWVjaG8gJ1dhcm5pbmc6IGdldGFkZHJpbmZvKCkgaW1wbGVtZW50YXRpb24gb24geW91ciBzeXN0ZW0gc2VlbXMgYmUgYnVnZ3kuJworCQkJZWNobyAnICAgICAgICAgQmV0dGVyIHVwZ3JhZGUgeW91ciBzeXN0ZW0gbGlicmFyeSB0byBuZXdlc3QgdmVyc2lvbicKKwkJCWVjaG8gJyAgICAgICAgIG9mIEdOVSBDIGxpYnJhcnkgKGFrYSBnbGliYykuJworCQlmaQorCWZpCisKK2ZpCisKKworCitmb3IgYWNfZnVuYyBpbiBnZXRhZGRyaW5mbyBnZXRuYW1laW5mbworZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICRhY19mdW5jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBjYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorZG9uZQorCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gbmV0ZG5ldC9kbmV0ZGIuaCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gbmV0ZG5ldC9kbmV0ZGIuaC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7dGRfY3ZfZGVjbF9uZXRkbmV0X2RuZXRkYl9oX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxuZXRkbmV0L2RuZXRkYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJkbmV0X2h0b2EiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICB0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPXllcworZWxzZQorICB0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA+JjUKK2VjaG8gIiR7RUNIT19UfSR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA+JjY7IH0KK2lmIHRlc3QgIiR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA9IHllczsgdGhlbgorCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfTkVURE5FVF9ETkVUREJfSF9ETkVUX0hUT0EgMQorX0FDRU9GCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjaGFyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNoYXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfY2hhcitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIGNoYXIgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfY2hhcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfY2hhcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9jaGFyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2NoYXIiID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBjaGFyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfY2hhcitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBjaGFyIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBjaGFyIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgY2hhciBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGNoYXIgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPSBhY19oaT0KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGNoYXIgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX2NoYXI9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9jaGFyIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGNoYXIpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGNoYXIpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9jaGFyPTAKKyAgIGZpIDs7Citlc2FjCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgY2hhciBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl9jaGFyPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfY2hhciIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfY2hhcj0wCisgICBmaQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfY2hhciIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgorX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNob3J0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgc2hvcnQgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfc2hvcnQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX3Nob3J0PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Nob3J0IiA+JjY7IH0KKworIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKKyMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKKyMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgorIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9LTEgYWNfbWlkPS0xCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX3Nob3J0PSRhY19sbzs7CisnJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2Zfc2hvcnQ9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl9zaG9ydD1gY2F0IGNvbmZ0ZXN0LnZhbGAKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2lmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KKyAgIGVsc2UKKyAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQorCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBTSVpFT0ZfU0hPUlQgJGFjX2N2X3NpemVvZl9zaG9ydAorX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaW50IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaW50PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQiID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGludC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2ludCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbgorPyopIGFjX2N2X3NpemVvZl9pbnQ9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9pbnQ9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zaXplb2ZfaW50PWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGludCkKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfaW50PTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKK19BQ0VPRgorCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIGxvbmcgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfbG9uZz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2xvbmciID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19sbz0wIGFjX21pZD0wCisgIHdoaWxlIDo7IGRvCisgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkOyBicmVhaworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCisJCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPSRhY19taWQ7IGJyZWFrCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAorCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGRvbmUKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPSBhY19oaT0KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgord2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbworICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hpPSRhY19taWQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2RvbmUKK2Nhc2UgJGFjX2xvIGluCis/KikgYWNfY3Zfc2l6ZW9mX2xvbmc9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nPTAKKyAgIGZpIDs7Citlc2FjCitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitpbnQKK21haW4gKCkKK3sKKworICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOworICBpZiAoISBmKQorICAgIHJldHVybiAxOworICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCisgICAgeworICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7CisgICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQorCXJldHVybiAxOworICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOworICAgIH0KKyAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X3NpemVvZl9sb25nPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KKyAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZz0wCisgICBmaQorZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3JtIC1mIGNvbmZ0ZXN0LnZhbAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZworX0FDRU9GCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2xvbmdfbG9uZz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQorCisjIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgorIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cworIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCisjIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK2ludAorbWFpbiAoKQoreworc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Cit0ZXN0X2FycmF5IFswXSA9IDAKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2xvPTAgYWNfbWlkPTAKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGk9JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xvPWBleHByICRhY19taWQgKyAxYAorCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KKwkJCSAgYWNfbG89IGFjX2hpPQorCQkJICBicmVhaworCQkJZmkKKwkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBkb25lCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0tMSBhY19taWQ9LTEKKyAgd2hpbGUgOjsgZG8KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisgICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOworaW50CittYWluICgpCit7CitzdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKK3Rlc3RfYXJyYXkgWzBdID0gMAorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfbG89JGFjX21pZDsgYnJlYWsKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCisJCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgorCQkJICBhY19sbz0gYWNfaGk9CisJCQkgIGJyZWFrCisJCQlmaQorCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgZG9uZQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbG89IGFjX2hpPQorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCit3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCisgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87CitpbnQKK21haW4gKCkKK3sKK3N0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwordGVzdF9hcnJheSBbMF0gPSAwCisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oaT0kYWNfbWlkCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Citkb25lCitjYXNlICRhY19sbyBpbgorPyopIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9JGFjX2xvOzsKKycnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geWVzOyB0aGVuCisgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9CisgICBlbHNlCisgICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAorICAgZmkgOzsKK2VzYWMKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKK3N0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgoraW50CittYWluICgpCit7CisKKyAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKKyAgaWYgKCEgZikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQorICAgIHsKKyAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOworICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKKwlyZXR1cm4gMTsKKyAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKKyAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCisJcmV0dXJuIDE7CisgICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKKyAgICB9CisgIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3QudmFsYAorZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQoraWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgorICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQorICAgZWxzZQorICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKKyAgIGZpCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29uZnRlc3QudmFsCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9CisKKworCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKK19BQ0VPRgorCisKKworCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYWRkcmluZm8iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWRkcmluZm8uLi4gJEVDSE9fQyIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9hZGRyaW5mbytzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8bmV0ZGIuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IGFkZHJpbmZvIGEKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9hZGRyaW5mbz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2FkZHJpbmZvPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9hZGRyaW5mbyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfYWRkcmluZm8iID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X2FkZHJpbmZvID0geWVzOyB0aGVuCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQUREUklORk8gMQorX0FDRU9GCisKKwllbHNlCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIE5FRURfQUREUklORk9fSCAxCitfQUNFT0YKKworCWZpCisKK2lmIHRlc3QgIiRhY19jdl9hZGRyaW5mbyIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgTklfTUFYU0VSViIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBOSV9NQVhTRVJWLi4uICRFQ0hPX0MiID4mNjsgfQorCWlmIHRlc3QgIiR7YWNfY3ZfbWF4c2VyditzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIE5JX01BWFNFUlYKK3llcworI2VuZGlmCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhY19jdl9tYXhzZXJ2PXllcworZWxzZQorICBhY19jdl9tYXhzZXJ2PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tYXhzZXJ2IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9tYXhzZXJ2IiA+JjY7IH0KKwlpZiB0ZXN0ICRhY19jdl9tYXhzZXJ2ICE9IHllczsgdGhlbgorCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBORUVEX0FERFJJTkZPX0ggMQorX0FDRU9GCisKKwlmaQorCitpZiB0ZXN0ICIkYWNfY3ZfbWF4c2VydiIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgTklfTkFNRVJFUUQiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgTklfTkFNRVJFUUQuLi4gJEVDSE9fQyIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9uYW1lcmVxZCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2lmZGVmIE5JX05PRlFETgoreWVzCisjZW5kaWYKK19BQ0VPRgoraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFjX2N2X25hbWVyZXFkPXllcworZWxzZQorICBhY19jdl9uYW1lcmVxZD1ubworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXJlcWQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X25hbWVyZXFkIiA+JjY7IH0KKwlpZiB0ZXN0ICRhY19jdl9uYW1lcmVxZCAhPSB5ZXM7IHRoZW4KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgTkVFRF9BRERSSU5GT19IIDEKK19BQ0VPRgorCisJZmkKKworaWYgdGVzdCAiJGFjX2N2X25hbWVyZXFkIiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrYWRkcl9zdG9yYWdlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2thZGRyX3N0b3JhZ2UuLi4gJEVDSE9fQyIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9zYV9zdG9yYWdlK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQoreworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3NhX3N0b3JhZ2U9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9zYV9zdG9yYWdlPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zYV9zdG9yYWdlIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zYV9zdG9yYWdlIiA+JjY7IH0KKwlpZiB0ZXN0ICRhY19jdl9zYV9zdG9yYWdlID0geWVzOyB0aGVuCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfU09DS0FERFJfU1RPUkFHRSAxCitfQUNFT0YKKworCWZpCisKK2lmIHRlc3QgIiRhY19jdl9zYV9zdG9yYWdlIiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKKworCWFjX2N2X2FkZHJzej15ZXMKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSU5BRERSU1oiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgSU5BRERSU1ouLi4gJEVDSE9fQyIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9pbmFkZHJzeitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBhID0gSU5BRERSU1oKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9pbmFkZHJzej15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2luYWRkcnN6PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9pbmFkZHJzeiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfaW5hZGRyc3oiID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X2luYWRkcnN6ID0geWVzOyB0aGVuCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfSU5BRERSU1ogMQorX0FDRU9GCisKKwllbHNlCisJCWFjX2N2X2FkZHJzej1ubworCWZpCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIElONkFERFJTWiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBJTjZBRERSU1ouLi4gJEVDSE9fQyIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9pbjZhZGRyc3orc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMJCWluY2x1ZGUgPGFycGEvbmFtZXNlci5oPgoraW50CittYWluICgpCit7CitpbnQgYSA9IElONkFERFJTWgorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X2luNmFkZHJzej15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2luNmFkZHJzej1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaW42YWRkcnN6IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9pbjZhZGRyc3oiID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X2luNmFkZHJzeiA9IHllczsgdGhlbgorCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0lONkFERFJTWiAxCitfQUNFT0YKKworCWVsc2UKKwkJYWNfY3ZfYWRkcnN6PW5vCisJZmkKKworaWYgdGVzdCAiJGFjX2N2X2FkZHJzeiIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgUkVTX1VTRV9JTkVUNiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBSRVNfVVNFX0lORVQ2Li4uICRFQ0hPX0MiID4mNjsgfQorCWlmIHRlc3QgIiR7YWNfY3ZfcmVzX2luZXQ2K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMJCWluY2x1ZGUgPHJlc29sdi5oPgoraW50CittYWluICgpCit7CitpbnQgYSA9IFJFU19VU0VfSU5FVDYKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9yZXNfaW5ldDY9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9yZXNfaW5ldDY9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Jlc19pbmV0NiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX2luZXQ2IiA+JjY7IH0KKwlpZiB0ZXN0ICRhY19jdl9yZXNfaW5ldDYgPSB5ZXM7IHRoZW4KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9SRVNfVVNFX0lORVQ2IDEKK19BQ0VPRgorCisJZmkKKworaWYgdGVzdCAiJGFjX2N2X3Jlc19pbmV0NiIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVzX3N0YXRlX2V4dCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZXNfc3RhdGVfZXh0Li4uICRFQ0hPX0MiID4mNjsgfQorCWlmIHRlc3QgIiR7YWNfY3ZfcmVzX3N0YXRlX2V4dCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KKyMJCWluY2x1ZGUgPHJlc29sdi5oPgoraW50CittYWluICgpCit7CitzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0IGUKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9yZXNfc3RhdGVfZXh0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfcmVzX3N0YXRlX2V4dD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPiY2OyB9CisJaWYgdGVzdCAkYWNfY3ZfcmVzX3N0YXRlX2V4dCA9IHllczsgdGhlbgorCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1JFU19TVEFURV9FWFQgMQorX0FDRU9GCisKKwlmaQorCitpZiB0ZXN0ICIkYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbnNvcnQgaW4gcmVzX3N0YXRlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG5zb3J0IGluIHJlc19zdGF0ZS4uLiAkRUNIT19DIiA+JjY7IH0KKwlpZiB0ZXN0ICIke2FjX2N2X3Jlc19zdGF0ZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KKyMJCWluY2x1ZGUgPHJlc29sdi5oPgoraW50CittYWluICgpCit7CitzdHJ1Y3QgX19yZXNfc3RhdGUgZTsgZS5uc29ydCA9IDAKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl9yZXNfc3RhdGU9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9yZXNfc3RhdGU9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Jlc19zdGF0ZSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX3N0YXRlIiA+JjY7IH0KKwlpZiB0ZXN0ICRhY19jdl9yZXNfc3RhdGUgPSB5ZXM7IHRoZW4KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ORVdfUkVTX1NUQVRFIDEKK19BQ0VPRgorCisJZmkKKworCisKKworCisKKworCisKK2ZvciBhY19mdW5jIGluIHZmcHJpbnRmIHN0cmNhc2VjbXAgc3RybGNhdCBzdHJsY3B5IHN0cmR1cCBzdHJzZXAKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgJGFjX2Z1bmMuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTICRhY19mdW5jLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKK2RvbmUKKworCisKK2ZvciBhY19mdW5jIGluIHN0cmZ0aW1lCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJGFjX2Z1bmMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY192YXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKworZm9yIGFjX2Z1bmMgaW4gc2V0bGluZWJ1ZiBhbGFybQorZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICRhY19mdW5jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCituZWVkc25wcmludGY9bm8KKworCitmb3IgYWNfZnVuYyBpbiB2c25wcmludGYgc25wcmludGYKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgbmVlZHNucHJpbnRmPXllcworZmkKK2RvbmUKKworaWYgdGVzdCAkbmVlZHNucHJpbnRmID0geWVzOyB0aGVuCisJY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgc25wcmludGYuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIHNucHJpbnRmLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKKworCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3NpZ25hbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworaW50CittYWluICgpCit7CityZXR1cm4gKihzaWduYWwgKDAsIDApKSAoMCkgPT0gMTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX3NpZ25hbD1pbnQKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpZ25hbCIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKK19BQ0VPRgorCisKKyAgICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaWduYWwiID0gdm9pZCA7IHRoZW4KKwkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUkVUU0lHVkFMCitfQUNFT0YKKworICAgIGVsc2UKKwkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUkVUU0lHVkFMICgwKQorX0FDRU9GCisKKyAgICBmaQorICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisgICAgaXJpeCopCisJICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIF9CU0RfU0lHTkFMUyAxCitfQUNFT0YKKworCSAgICA7OworCisgICAgKikKKworZm9yIGFjX2Z1bmMgaW4gc2lnYWN0aW9uCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJGFjX2Z1bmMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY192YXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisJICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2lnYWN0aW9uID0gbm8gOyB0aGVuCisKK2ZvciBhY19mdW5jIGluIHNpZ3NldAorZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICRhY19mdW5jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworCSAgICBmaQorCSAgICA7OworICAgIGVzYWMKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbmV0X2h0b2EiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGRuZXRfaHRvYS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRuZXRfaHRvYSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRuZXRfaHRvYSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBkbmV0OyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9zZWFyY2hfZG5ldF9odG9hPSRhY19yZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X3NlYXJjaF9kbmV0X2h0b2E9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZG5ldF9odG9hIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfZG5ldF9odG9hIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2RuZXRfaHRvYQoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ETkVUX0hUT0EgMQorX0FDRU9GCisKK2ZpCisKKworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbHJwYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWluIGluIC1scnBjLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfcnBjX21haW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxycGMgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKworaW50CittYWluICgpCit7CityZXR1cm4gbWFpbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl9ycGNfbWFpbj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2xpYl9ycGNfbWFpbj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JwY19tYWluIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcnBjX21haW4iID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX3JwY19tYWluID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSUJSUEMgMQorX0FDRU9GCisKKyAgTElCUz0iLWxycGMgJExJQlMiCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0cnBjYnludW1iZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldHJwY2J5bnVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRycGNieW51bWJlciAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldHJwY2J5bnVtYmVyICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIG5zbDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX2dldHJwY2J5bnVtYmVyPSRhY19yZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldHJwY2J5bnVtYmVyK3NldH0iID0gc2V0OyB0aGVuCisgIGJyZWFrCitmaQorZG9uZQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXI9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9nZXRycGNieW51bWJlciIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRycGNieW51bWJlcgoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9HRVRSUENCWU5VTUJFUiAxCitfQUNFT0YKKworZmkKKworCisKKworICAgICMgTW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGdldGhvc3RieW5hbWUoKSBpbiB0aGUgZGVmYXVsdCBzZWFyY2hlZAorICAgICMgbGlicmFyaWVzIChpLmUuIGxpYmMpOgorICAgICMgU29tZSBPU2VzIChlZy4gU29sYXJpcykgcGxhY2UgaXQgaW4gbGlibnNsCisgICAgIyBTb21lIHN0cmFuZ2UgT1NlcyAoU0lOSVgpIGhhdmUgaXQgaW4gbGlic29ja2V0OgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0aG9zdGJ5bmFtZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0aG9zdGJ5bmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBnZXRob3N0YnluYW1lICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZ2V0aG9zdGJ5bmFtZSAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBuc2wgc29ja2V0IHJlc29sdjsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWU9JGFjX3JlcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZT1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitmaQorCisgICAgIyBVbmZvcnR1bmF0ZWx5IGxpYnNvY2tldCBzb21ldGltZXMgZGVwZW5kcyBvbiBsaWJuc2wgYW5kCisgICAgIyBBQ19TRUFSQ0hfTElCUyBpc24ndCB1cCB0byB0aGUgdGFzayBvZiBoYW5kbGluZyBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzLgorICAgIGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPSAibm8iCisgICAgdGhlbgorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUgPSB5ZXM7IHRoZW4KKyAgTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCitmaQorCisgICAgZmkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNvY2tldCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHNvY2tldDsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3Zfc2VhcmNoX3NvY2tldD0kYWNfcmVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgYnJlYWsKK2ZpCitkb25lCitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgOgorZWxzZQorICBhY19jdl9zZWFyY2hfc29ja2V0PW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY2OyB9CithY19yZXM9JGFjX2N2X3NlYXJjaF9zb2NrZXQKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuCisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2Vsc2UKKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0ID0geWVzOyB0aGVuCisgIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgorZmkKKworZmkKKworICAgICMgRExQSSBuZWVkcyBwdXRtc2cgdW5kZXIgSFBVWCBzbyB0ZXN0IGZvciAtbHN0ciB3aGlsZSB3ZSdyZSBhdCBpdAorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHV0bXNnIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdXRtc2cuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdXRtc2crc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwdXRtc2cgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBwdXRtc2cgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgc3RyOyBkbworICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKKyAgZWxzZQorICAgIGFjX3Jlcz0tbCRhY19saWIKKyAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9zZWFyY2hfcHV0bXNnPSRhY19yZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbgorICA6CitlbHNlCisgIGFjX2N2X3NlYXJjaF9wdXRtc2c9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcHV0bXNnIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfcHV0bXNnIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3B1dG1zZworaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworCisKKyAgICAgICAgICAgICAgICBMQkxfTElCUz0iJExJQlMiCisgICAgcGZvcGVuPS91c3IvZXhhbXBsZXMvcGFja2V0ZmlsdGVyL3Bmb3Blbi5jCisgICAgaWYgdGVzdCAtZiAkcGZvcGVuIDsgdGhlbgorCitmb3IgYWNfZnVuYyBpbiBwZm9wZW4KK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCitkb25lCisKKwkgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19wZm9wZW4gPSAibm8iIDsgdGhlbgorCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBVc2luZyAkcGZvcGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfVVzaW5nICRwZm9wZW4iID4mNjsgfQorCQkgICAgTElCUz0iJExJQlMgJHBmb3BlbiIKKwkgICAgZmkKKyAgICBmaQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb2NhbCBwY2FwIGxpYnJhcnkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9jYWwgcGNhcCBsaWJyYXJ5Li4uICRFQ0hPX0MiID4mNjsgfQorICAgIGxpYnBjYXA9RkFJTAorICAgIGxhc3RkaXI9RkFJTAorICAgIHBsYWNlcz1gbHMgJHNyY2Rpci8uLiB8IHNlZCAtZSAncywvJCwsJyAtZSAicyxeLCRzcmNkaXIvLi4vLCIgfCBcCisJZWdyZXAgJy9saWJwY2FwLVswLTldKi5bMC05XSooLlswLTldKik/KFthYl1bMC05XSopPyQnYAorICAgIGZvciBkaXIgaW4gJHBsYWNlcyAkc3JjZGlyLy4uL2xpYnBjYXAgJHNyY2Rpci9saWJwY2FwIDsgZG8KKwkgICAgYmFzZWRpcj1gZWNobyAkZGlyIHwgc2VkIC1lICdzL1thYl1bMC05XSokLy8nYAorCSAgICBpZiB0ZXN0ICRsYXN0ZGlyID0gJGJhc2VkaXIgOyB0aGVuCisJCSAgICAJCSAgICBjb250aW51ZTsKKwkgICAgZmkKKwkgICAgbGFzdGRpcj0kZGlyCisJICAgIGlmIHRlc3QgLXIgJGRpci9saWJwY2FwLmEgOyB0aGVuCisJCSAgICBsaWJwY2FwPSRkaXIvbGlicGNhcC5hCisJCSAgICBkPSRkaXIKKwkJICAgIAkgICAgZmkKKyAgICBkb25lCisgICAgaWYgdGVzdCAkbGlicGNhcCA9IEZBSUwgOyB0aGVuCisJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm90IGZvdW5kIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vdCBmb3VuZCIgPiY2OyB9CisJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtYWluIGluIC1scGNhcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWluIGluIC1scGNhcC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3BjYXBfbWFpbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCitMSUJTPSItbHBjYXAgICRMSUJTIgorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKworaW50CittYWluICgpCit7CityZXR1cm4gbWFpbiAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl9wY2FwX21haW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9saWJfcGNhcF9tYWluPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcGNhcF9tYWluIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcGNhcF9tYWluIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2xpYl9wY2FwX21haW4gPSB5ZXM7IHRoZW4KKyAgbGlicGNhcD0iLWxwY2FwIgorZmkKKworCSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KKwkJICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKwkgICAgZmkKKwkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGV4dHJhbmVvdXMgcGNhcCBoZWFkZXIgZGlyZWN0b3JpZXMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZXh0cmFuZW91cyBwY2FwIGhlYWRlciBkaXJlY3Rvcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KKwkgICAgaWYgdGVzdCBcKCAhIC1yIC91c3IvbG9jYWwvaW5jbHVkZS9wY2FwLmggXCkgLWEgXAorCQkJXCggISAtciAvdXNyL2luY2x1ZGUvcGNhcC5oIFwpOyB0aGVuCisJCWlmIHRlc3QgLXIgL3Vzci9sb2NhbC9pbmNsdWRlL3BjYXAvcGNhcC5oOyB0aGVuCisJCSAgICBkPSIvdXNyL2xvY2FsL2luY2x1ZGUvcGNhcCIKKwkJZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9wY2FwL3BjYXAuaDsgdGhlbgorCQkgICAgZD0iL3Vzci9pbmNsdWRlL3BjYXAiCisJCWZpCisJICAgIGZpCisJICAgIGlmIHRlc3QgLXogIiRkIiA7IHRoZW4KKwkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub3QgZm91bmQiID4mNQorZWNobyAiJHtFQ0hPX1R9bm90IGZvdW5kIiA+JjY7IH0KKwkgICAgZWxzZQorCQlWX0lOQ0xTPSItSSRkICRWX0lOQ0xTIgorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kIC0tIC1JJGQgYWRkZWQiID4mNQorZWNobyAiJHtFQ0hPX1R9Zm91bmQgLS0gLUkkZCBhZGRlZCIgPiY2OyB9CisJICAgIGZpCisgICAgZWxzZQorCSAgICBWX1BDQVBERVA9JGxpYnBjYXAKKwkgICAgcGxhY2VzPWBscyAkc3JjZGlyLy4uIHwgc2VkIC1lICdzLC8kLCwnIC1lICJzLF4sJHNyY2Rpci8uLi8sIiB8IFwKKyAgICAJIAkJZWdyZXAgJy9saWJwY2FwLVswLTldKi5bMC05XSooLlswLTldKik/KFthYl1bMC05XSopPyQnYAorCSAgICBpZiB0ZXN0IC1yICRkL3BjYXAuaDsgdGhlbgorCQkgICAgVl9JTkNMUz0iLUkkZCAkVl9JTkNMUyIKKwkgICAgZWxpZiB0ZXN0IC1yICRwbGFjZXMvcGNhcC5oOyB0aGVuCisJCSAgICBWX0lOQ0xTPSItSSRwbGFjZXMgJFZfSU5DTFMiCisJICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgcGNhcC5oIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHBjYXAuaCIgPiYyO30KKyAgIHsgKGV4aXQgc2VlIElOU1RBTEwpOyBleGl0IHNlZSBJTlNUQUxMOyB9OyB9CisgCSAgICBmaQorCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJwY2FwIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRsaWJwY2FwIiA+JjY7IH0KKyAgICBmaQorICAgIExJQlM9IiRsaWJwY2FwICRMSUJTIgorICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisgICAgYWl4KikKKwkgICAgcHNlZXhlPSIvbGliL3BzZS5leHAiCisJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkcHNlZXhlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRwc2VleGUuLi4gJEVDSE9fQyIgPiY2OyB9CisJICAgIGlmIHRlc3QgLWYgJHBzZWV4ZSA7IHRoZW4KKwkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisJCSAgICBMSUJTPSIkTElCUyAtSTokcHNlZXhlIgorCSAgICBmaQorCSAgICAjCisJICAgICMgV2UgbmVlZCAiLWxvZG0iIGFuZCAiLWxjZmciLCBhcyBsaWJwY2FwIHJlcXVpcmVzIHRoZW0gb24KKwkgICAgIyBBSVgsIGFuZCB3ZSBqdXN0IGJ1aWxkIGEgc3RhdGljIGxpYnBjYXAuYSBhbmQgdGh1cyBjYW4ndAorCSAgICAjIGFycmFuZ2UgdGhhdCB3aGVuIHlvdSBsaW5rIHdpdGggbGlicGNhcCB5b3UgYXV0b21hdGljYWxseQorCSAgICAjIGxpbmsgd2l0aCB0aG9zZSBsaWJyYXJpZXMuCisJICAgICMKKwkgICAgTElCUz0iJExJQlMgLWxvZG0gLWxjZmciCisJICAgIDs7CisgICAgZXNhYworCisgICAgICAgICAgICAgICAgICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9saXN0X2RhdGFsaW5rcyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwY2FwX2xpc3RfZGF0YWxpbmtzLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9mdW5jX3BjYXBfbGlzdF9kYXRhbGlua3Mrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgcGNhcF9saXN0X2RhdGFsaW5rcyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIHBjYXBfbGlzdF9kYXRhbGlua3MuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgcGNhcF9saXN0X2RhdGFsaW5rcyBpbm5vY3VvdXNfcGNhcF9saXN0X2RhdGFsaW5rcworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwY2FwX2xpc3RfZGF0YWxpbmtzICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmIHBjYXBfbGlzdF9kYXRhbGlua3MKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwY2FwX2xpc3RfZGF0YWxpbmtzICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfcGNhcF9saXN0X2RhdGFsaW5rcyB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BjYXBfbGlzdF9kYXRhbGlua3MKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gcGNhcF9saXN0X2RhdGFsaW5rcyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2Z1bmNfcGNhcF9saXN0X2RhdGFsaW5rcz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2Z1bmNfcGNhcF9saXN0X2RhdGFsaW5rcz1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2xpc3RfZGF0YWxpbmtzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX3BjYXBfbGlzdF9kYXRhbGlua3MiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX2xpc3RfZGF0YWxpbmtzID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUyAxCitfQUNFT0YKKworZWxzZQorCisJICAgIGNhc2UgIiAkTElCT0JKUyAiIGluCisgICoiIGRhdGFsaW5rcy4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgZGF0YWxpbmtzLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworCitmaQorCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBjYXBfc2V0X2RhdGFsaW5rIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBjYXBfc2V0X2RhdGFsaW5rLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9mdW5jX3BjYXBfc2V0X2RhdGFsaW5rK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIHBjYXBfc2V0X2RhdGFsaW5rIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcGNhcF9zZXRfZGF0YWxpbmsuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgcGNhcF9zZXRfZGF0YWxpbmsgaW5ub2N1b3VzX3BjYXBfc2V0X2RhdGFsaW5rCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBjYXBfc2V0X2RhdGFsaW5rICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmIHBjYXBfc2V0X2RhdGFsaW5rCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcGNhcF9zZXRfZGF0YWxpbmsgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl9wY2FwX3NldF9kYXRhbGluayB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BjYXBfc2V0X2RhdGFsaW5rCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHBjYXBfc2V0X2RhdGFsaW5rICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfZnVuY19wY2FwX3NldF9kYXRhbGluaz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbms9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbmsiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbmsiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX3NldF9kYXRhbGluayA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LIDEKK19BQ0VPRgorCitmaQorCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgaW5ub2N1b3VzX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgfHwgZGVmaW5lZCBfX3N0dWJfX19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWw9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWw9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCA9IHllczsgdGhlbgorCisJICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTCAxCitfQUNFT0YKKworCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiBpbm5vY3VvdXNfcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uIHx8IGRlZmluZWQgX19zdHViX19fcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04gMQorX0FDRU9GCisKK2Vsc2UKKworCQkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgZGxuYW1lcy4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgZGxuYW1lcy4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworZmkKKworCitlbHNlCisKKwkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgZGxuYW1lcy4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgZGxuYW1lcy4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKKworZmkKKworCisKK2ZvciBhY19mdW5jIGluIHBjYXBfYnJlYWtsb29wCitkbworYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJGFjX2Z1bmMKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkYWNfZnVuYyAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJGFjX2Z1bmMgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICBldmFsICIkYXNfYWNfdmFyPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWV2YWwgIiRhc19hY192YXI9bm8iCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKKyAgICAgICAgICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9kdW1wX2Z0ZWxsIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBjYXBfZHVtcF9mdGVsbC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgcGNhcF9kdW1wX2Z0ZWxsIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcGNhcF9kdW1wX2Z0ZWxsLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lIHBjYXBfZHVtcF9mdGVsbCBpbm5vY3VvdXNfcGNhcF9kdW1wX2Z0ZWxsCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBjYXBfZHVtcF9mdGVsbCAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiBwY2FwX2R1bXBfZnRlbGwKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBwY2FwX2R1bXBfZnRlbGwgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl9wY2FwX2R1bXBfZnRlbGwgfHwgZGVmaW5lZCBfX3N0dWJfX19wY2FwX2R1bXBfZnRlbGwKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gcGNhcF9kdW1wX2Z0ZWxsICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGw9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9mdW5jX3BjYXBfZHVtcF9mdGVsbD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGwiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfcGNhcF9kdW1wX2Z0ZWxsIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9kdW1wX2Z0ZWxsID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUENBUF9EVU1QX0ZURUxMIDEKK19BQ0VPRgorCitlbHNlCisKKwkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgcGNhcF9kdW1wX2Z0ZWxsLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJPQkpTPSIkTElCT0JKUyBwY2FwX2R1bXBfZnRlbGwuJGFjX29iamV4dCIKKyA7OworZXNhYworCisKK2ZpCisKKworCisjCisjIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgc28gd2UgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZQorIyBsaWJyYXJpZXMgKGUuZy4sICItbHNvY2tldCAtbG5zbCIgb24gU29sYXJpcykuCisjCisjIFdlIGRvbid0IHVzZSBBQ19SRVBMQUNFX0ZVTkNTIGJlY2F1c2UgdGhhdCB1c2VzIEFDX0NIRUNLX0ZVTkNTIHdoaWNoCisjIHVzZSBBQ19DSEVDS19GVU5DIHdoaWNoIGRvZXNuJ3QgbGV0IHVzIHNwZWNpZnkgdGhlIHJpZ2h0ICNpbmNsdWRlcworIyB0byBtYWtlIHRoaXMgd29yayBvbiBCU0QvT1MgNC54LiAgQlNEL09TIDQueCBzaGlwcyB3aXRoIHRoZSBCSU5EOAorIyByZXNvbHZlciwgYW5kIHRoZSB3YXkgaXQgZGVmaW5lcyBpbmV0X3tudG9wLHB0b259IGlzIHJhdGhlciBzdHJhbmdlOworIyBpdCBkb2VzIG5vdCBzaGlwIHdpdGggYSBsaWJjIHN5bWJvbCAiaW5ldF9udG9wKCkiLCBpdCBzaGlwcyB3aXRoCisjICJfaW5ldF9udG9wKCkiLCBhbmQgaGFzIGEgI2RlZmluZSBtYWNybyBpbiBvbmUgb2YgdGhlIHN5c3RlbSBoZWFkZXJzCisjIHRvIHJlbmFtZSBpdC4KKyMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X250b3AiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9udG9wLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KK2ludAorbWFpbiAoKQoreworY2hhciBzcmNbNF0sIGRzdFsxMjhdOworaW5ldF9udG9wKEFGX0lORVQsIHNyYywgZHN0LCBzaXplb2YoZHN0KSk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKKyAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisJY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgaW5ldF9udG9wLiRhY19vYmpleHQgIiogKSA7OworICAqKSBMSUJPQkpTPSIkTElCT0JKUyBpbmV0X250b3AuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X3B0b24iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9wdG9uLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KK2ludAorbWFpbiAoKQoreworY2hhciBzcmNbMTI4XSwgZHN0WzRdOworaW5ldF9wdG9uKEFGX0lORVQsIHNyYywgZHN0KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwljYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBpbmV0X3B0b24uJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIGluZXRfcHRvbi4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfYXRvbiIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmV0X2F0b24uLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CitpbnQKK21haW4gKCkKK3sKK2NoYXIgc3JjWzEyOF07CitzdHJ1Y3QgaW5fYWRkciBkc3Q7CitpbmV0X2F0b24oc3JjLCAmZHN0KTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwljYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBpbmV0X2F0b24uJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTIGluZXRfYXRvbi4kYWNfb2JqZXh0IgorIDs7Citlc2FjCisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCisjCisjIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgZm9yIHRoZSBzYW1lIHJlYXNvbi4KKyMKKyMgWW91IGFyZSBpbiBhIHR3aXN0eSBsaXR0bGUgbWF6ZSBvZiBVTipYZXMsIGFsbCBkaWZmZXJlbnQuCisjIFNvbWUgbWlnaHQgbm90IGhhdmUgZXRoZXJfbnRvaG9zdCgpLgorIyBTb21lIG1pZ2h0IGhhdmUgaXQsIGJ1dCBub3QgZGVjbGFyZSBpdCBpbiBhbnkgaGVhZGVyIGZpbGUuCisjIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvaWZfZXRoZXIuaD4uCisjIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvZXRoZXIuaD4KKyMgKEFuZCBzb21lIG1pZ2h0IGhhdmUgaXQgYnV0IGRvY3VtZW50IGl0IGFzIHNvbWV0aGluZyBkZWNsYXJlZCBpbgorIyA8bmV0aW5ldC9ldGhlcm5ldC5oPiwgYWx0aG91Z2ggPG5ldGluZXQvaWZfZXRoZXIuaD4gYXBwZWFycyB0byB3b3JrLikKKyMKKyMgQmVmb3JlIHlvdSBpcyBhIEMgY29tcGlsZXIuCisjCisKK2ZvciBhY19mdW5jIGluIGV0aGVyX250b2hvc3QKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYnVnZ3kgZXRoZXJfbnRvaG9zdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBidWdneSBldGhlcl9udG9ob3N0Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9idWdneV9ldGhlcl9udG9ob3N0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisKKwlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBhY19jdl9idWdneV9ldGhlcl9udG9ob3N0PSJub3Qgd2hpbGUgY3Jvc3MtY29tcGlsaW5nIgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworCQkjaW5jbHVkZSA8bmV0ZGIuaD4KKwkJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJCSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKwkJaW50CisJCW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCQl7CisJCQl1X2NoYXIgZWFbNl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwkJCWNoYXIgbmFtZVtNQVhIT1NUTkFNRUxFTl07CisKKwkJCWV0aGVyX250b2hvc3QobmFtZSwgKHN0cnVjdCBldGhlcl9hZGRyICopZWEpOworCQkJZXhpdCgwKTsKKwkJfQorCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3Q9bm8KK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKK2FjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3Q9eWVzCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIkYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdCIgPSAibm8iOyB0aGVuCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgVVNFX0VUSEVSX05UT0hPU1QgMQorX0FDRU9GCisKKyAgICBmaQorCitmaQorZG9uZQorCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19ldGhlcl9udG9ob3N0IiA9IHllcyAtYSBcCisgICAgIiRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA9ICJubyI7IHRoZW4KKwkjCisJIyBPSywgd2UgaGF2ZSBldGhlcl9udG9ob3N0KCkuICBEbyB3ZSBoYXZlIDxuZXRpbmV0L2lmX2V0aGVyLmg+PworCSMKKwlpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgPSB5ZXM7IHRoZW4KKwkJIworCQkjIFllcy4gIERvZXMgaXQgZGVjbGFyZSBldGhlcl9udG9ob3N0KCk/CisJCSMKKwkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgZXRoZXJfbnRvaG9zdAorICAodm9pZCkgZXRoZXJfbnRvaG9zdDsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0ID0geWVzOyB0aGVuCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKK19BQ0VPRgorCisKK2ZpCisKKwlmaQorCSMKKwkjIERpZCB0aGF0IHN1Y2NlZWQ/CisJIworCWlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCIgIT0geWVzOyB0aGVuCisJCSMKKwkJIyBObywgaG93IGFib3V0IDxuZXRpbmV0L2V0aGVyLmg+LCBhcyBvbiBMaW51eD8KKwkJIworCitmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvZXRoZXIuaAorZG8KK2FzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2hlYWRlcl9jb21waWxlcj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorX0FDRU9GCitpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH07IHRoZW4KKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KK2ZpCisKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorCisjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KK2Nhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKyAgeWVzOm5vOiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisKKyAgICA7OworZXNhYworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CisKK2ZpCitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHllczsgdGhlbgorCQkJIworCQkJIyBXZSBoYXZlIGl0IC0gZG9lcyBpdCBkZWNsYXJlIGV0aGVyX250b2hvc3QoKT8KKwkJCSMgVW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Qgc28gd2UgZG9uJ3QKKwkJCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCisJCQkjIHN1cHByZXNzIHRoZSBuZXh0IHRlc3QuCisJCQkjCisJCQl1bnNldCBhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdAorCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKworCitpbnQKK21haW4gKCkKK3sKKyNpZm5kZWYgZXRoZXJfbnRvaG9zdAorICAodm9pZCkgZXRoZXJfbnRvaG9zdDsKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0ID0geWVzOyB0aGVuCisKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKK19BQ0VPRgorCisKK2ZpCisKKwkJZmkKKwlmaQorCSMKKwkjIElzIGV0aGVyX250b2hvc3QoKSBkZWNsYXJlZD8KKwkjCisJaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiAhPSB5ZXM7IHRoZW4KKwkJIworCQkjIE5vLCB3ZSdsbCBoYXZlIHRvIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLgorCQkjIERvIHdlIGhhdmUgInN0cnVjdCBldGhlcl9hZGRyIj8KKwkJIworCQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IGV0aGVyX2FkZHIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IGV0aGVyX2FkZHIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorc3RydWN0IG1idWY7CitzdHJ1Y3QgcnRlbnRyeTsKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisKKwordHlwZWRlZiBzdHJ1Y3QgZXRoZXJfYWRkciBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkcj15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHI9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkciA9IHllczsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIgMQorX0FDRU9GCisKKworZmkKKworCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfRVRIRVJfTlRPSE9TVCAwCitfQUNFT0YKKworCWVsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX0VUSEVSX05UT0hPU1QgMQorX0FDRU9GCisKKwlmaQorZmkKKworCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQorCWlmIHRlc3QgIiR7YWNfY3Zfc29ja2FkZHJfaGFzX3NhX2xlbitzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHIgKikwKS0+c2FfbGVuKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3NvY2thZGRyX2hhc19zYV9sZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjY7IH0KKwkJaWYgdGVzdCAkYWNfY3Zfc29ja2FkZHJfaGFzX3NhX2xlbiA9IHllcyA7IHRoZW4KKwkJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEKK19BQ0VPRgorCisJZmkKKworaWYgdGVzdCAiJGFjX2N2X3NvY2thZGRyX2hhc19zYV9sZW4iID0gbm87IHRoZW4KKwltaXNzaW5nX2luY2x1ZGVzPXllcworZmkKKworCisKKworZm9yIGFjX2Z1bmMgaW4gcGNhcF9maW5kYWxsZGV2cyBwY2FwX2R1bXBfZmx1c2ggcGNhcF9saWJfdmVyc2lvbgorZG8KK2FzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCisgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKyNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCisKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKworI2lmZGVmIF9fU1REQ19fCisjIGluY2x1ZGUgPGxpbWl0cy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI3VuZGVmICRhY19mdW5jCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgJGFjX2Z1bmMgKCk7CisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCitjaG9rZSBtZQorI2VuZGlmCisKK2ludAorbWFpbiAoKQoreworcmV0dXJuICRhY19mdW5jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlldmFsICIkYXNfYWNfdmFyPW5vIgorZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKK2RvbmUKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX2ZpbmRhbGxkZXZzID0gInllcyIgOyB0aGVuCisgICAgc2F2ZWRjZmxhZ3M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRWX0lOQ0xTIgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwY2FwX2lmX3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9pZl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX3BjYXBfaWZfdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxwY2FwLmg+CisKK3R5cGVkZWYgcGNhcF9pZl90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX3BjYXBfaWZfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfcGNhcF9pZl90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3BjYXBfaWZfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9wY2FwX2lmX3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9wY2FwX2lmX3QgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1BDQVBfSUZfVCAxCitfQUNFT0YKKworCitmaQorCisgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCitmaQorCitpZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfbGliX3ZlcnNpb24gPSAibm8iIDsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcGNhcF92ZXJzaW9uIGlzIGRlZmluZWQgYnkgbGlicGNhcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgcGNhcF92ZXJzaW9uIGlzIGRlZmluZWQgYnkgbGlicGNhcC4uLiAkRUNIT19DIiA+JjY7IH0KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKwlleHRlcm4gY2hhciBwY2FwX3ZlcnNpb25bXTsKKworCXJldHVybiAoaW50KXBjYXBfdmVyc2lvbjsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgICBpZiB0ZXN0ICIkYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkIiA9IHllcyA7IHRoZW4KKyAgICAJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX1BDQVBfVkVSU0lPTiAxCitfQUNFT0YKKworICAgIGVsc2UKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKyAgICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcGNhcF9kZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXAiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHBjYXBfZGVidWcgaXMgZGVmaW5lZCBieSBsaWJwY2FwLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisJZXh0ZXJuIGludCBwY2FwX2RlYnVnOworCisJcmV0dXJuIHBjYXBfZGVidWc7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2xibF9jdl9wY2FwX2RlYnVnX2RlZmluZWQ9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2lmIHRlc3QgIiRhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkIiA9IHllcyA7IHRoZW4KKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfUENBUF9ERUJVRyAxCitfQUNFT0YKKworZWxzZQorCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorCSMKKwkjIE9LLCB3aGF0IGFib3V0ICJ5eWRlYnVnIj8KKwkjCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB5eWRlYnVnIGlzIGRlZmluZWQgYnkgbGlicGNhcCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgeXlkZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXAuLi4gJEVDSE9fQyIgPiY2OyB9CisJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisJCWV4dGVybiBpbnQgeXlkZWJ1ZzsKKworCQlyZXR1cm4geXlkZWJ1ZzsKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCisgICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KKyAgYWNfbGJsX2N2X3l5ZGVidWdfZGVmaW5lZD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2xibF9jdl95eWRlYnVnX2RlZmluZWQ9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorCWlmIHRlc3QgIiRhY19sYmxfY3ZfeXlkZWJ1Z19kZWZpbmVkIiA9IHllcyA7IHRoZW4KKwkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ZWURFQlVHIDEKK19BQ0VPRgorCisJZWxzZQorCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwlmaQorZmkKKworZm9yIGFjX2Z1bmMgaW4gYnBmX2R1bXAKK2RvCithc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKy8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgorICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisjZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYworCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCisgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisKKyNpZmRlZiBfX1NURENfXworIyBpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyN1bmRlZiAkYWNfZnVuYworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyICRhY19mdW5jICgpOworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYworY2hva2UgbWUKKyNlbmRpZgorCitpbnQKK21haW4gKCkKK3sKK3JldHVybiAkYWNfZnVuYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGV2YWwgIiRhc19hY192YXI9eWVzIgorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2FjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAorCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9CitpZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2Vsc2UKKyAgY2FzZSAiICRMSUJPQkpTICIgaW4KKyAgKiIgJGFjX2Z1bmMuJGFjX29iamV4dCAiKiApIDs7CisgICopIExJQk9CSlM9IiRMSUJPQkpTICRhY19mdW5jLiRhY19vYmpleHQiCisgOzsKK2VzYWMKKworZmkKK2RvbmUKKworCitWX0dST1VQPTAKK2lmIHRlc3QgLWYgL2V0Yy9ncm91cCAtYSAhIC16ICJgZ3JlcCAnXndoZWVsOicgL2V0Yy9ncm91cGAiIDsgdGhlbgorCVZfR1JPVVA9d2hlZWwKK2ZpCitjYXNlICIkaG9zdF9vcyIgaW4KKworYWl4KikKKwkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgX1NVTiAxCitfQUNFT0YKKworCTs7CisKK2lyaXgqKQorCVZfR1JPVVA9c3lzCisJOzsKKworb3NmKikKKwlWX0dST1VQPXN5c3RlbQorCTs7CisKK3NvbGFyaXMqKQorCVZfR1JPVVA9c3lzCisJOzsKK2VzYWMKKworaWYgdGVzdCAtZiAvZGV2L2JwZjAgOyB0aGVuCisJVl9HUk9VUD1icGYKK2ZpCisKKworZm9yIGFjX2hlYWRlciBpbiBzeXMvYml0eXBlcy5oCitkbworYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KK2Vsc2UKKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKworIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCRhY19oZWFkZXI+CitfQUNFT0YKK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfTsgdGhlbgorICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworICBhY19oZWFkZXJfcHJlcHJvYz1ubworZmkKKworcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisKKyMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorICB5ZXM6bm86ICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKyAgICA7OworICBubzp5ZXM6KiApCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKworICAgIDs7Citlc2FjCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCitmaQorYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCisJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KKworZmkKK2lmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ4X3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50OF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKK3R5cGVkZWYgaW50OF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDhfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaW50OF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDhfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ4X3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQ4X3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBpbnQ4X3Qgc2lnbmVkIGNoYXIKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQ4X3QiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdV9pbnQ4X3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdV9pbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKwordHlwZWRlZiB1X2ludDhfdCBhY19fdHlwZV9uZXdfOworaW50CittYWluICgpCit7CitpZiAoKGFjX190eXBlX25ld18gKikgMCkKKyAgcmV0dXJuIDA7CitpZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKKyAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfdHlwZV91X2ludDhfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfdV9pbnQ4X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQ4X3QiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdV9pbnQ4X3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV91X2ludDhfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIHVfaW50OF90IHVuc2lnbmVkIGNoYXIKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50MTZfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQxNl90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpbnQxNl90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDE2X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2ludDE2X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MTZfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW50MTZfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIGludDE2X3Qgc2hvcnQKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQxNl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVfaW50MTZfdC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV91X2ludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKwordHlwZWRlZiB1X2ludDE2X3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdV9pbnQxNl90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfdHlwZV91X2ludDE2X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQxNl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VfaW50MTZfdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl90eXBlX3VfaW50MTZfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIHVfaW50MTZfdCB1bnNpZ25lZCBzaG9ydAorX0FDRU9GCisKK2ZpCisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQzMl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludDMyX3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50MzJfdCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0Cit0eXBlZGVmIGludDMyX3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfaW50MzJfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfaW50MzJfdD1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9pbnQzMl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2ludDMyX3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0geWVzOyB0aGVuCisgIDoKK2Vsc2UKKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgaW50MzJfdCBpbnQKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQzMl90IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVfaW50MzJfdC4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV91X2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKwordHlwZWRlZiB1X2ludDMyX3QgYWNfX3R5cGVfbmV3XzsKK2ludAorbWFpbiAoKQoreworaWYgKChhY19fdHlwZV9uZXdfICopIDApCisgIHJldHVybiAwOworaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCisgIHJldHVybiAwOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3R5cGVfdV9pbnQzMl90PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfdHlwZV91X2ludDMyX3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQzMl90IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VfaW50MzJfdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl90eXBlX3VfaW50MzJfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIHVfaW50MzJfdCB1bnNpZ25lZCBpbnQKK19BQ0VPRgorCitmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskYWNfaW5jbHVkZXNfZGVmYXVsdAordHlwZWRlZiBpbnQ2NF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX2ludDY0X3Q9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl90eXBlX2ludDY0X3Q9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X3R5cGVfaW50NjRfdCA9IHllczsgdGhlbgorICA6CitlbHNlCisKK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIGludDY0X3QgbG9uZyBsb25nCitfQUNFT0YKKworZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVfaW50NjRfdCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1X2ludDY0X3QuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdV9pbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisKK3R5cGVkZWYgdV9pbnQ2NF90IGFjX190eXBlX25ld187CitpbnQKK21haW4gKCkKK3sKK2lmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQorICByZXR1cm4gMDsKK2lmIChzaXplb2YgKGFjX190eXBlX25ld18pKQorICByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19jdl90eXBlX3VfaW50NjRfdD15ZXMKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX2N2X3R5cGVfdV9pbnQ2NF90PW5vCitmaQorCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VfaW50NjRfdCIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91X2ludDY0X3QiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfdHlwZV91X2ludDY0X3QgPSB5ZXM7IHRoZW4KKyAgOgorZWxzZQorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSB1X2ludDY0X3QgdW5zaWduZWQgbG9uZyBsb25nCitfQUNFT0YKKworZmkKKworCisjCisjIFdlIGNhbid0IGp1c3QgY2hlY2sgZm9yIDxpbnR0eXBlcy5oPiAtIHNvbWUgc3lzdGVtcyBoYXZlIG9uZSB0aGF0CisjIGRvZXNuJ3QgZGVmaW5lIGFsbCB0aGUgUFJJW2RveHVdNjQgbWFjcm9zLgorIworCitmb3IgYWNfaGVhZGVyIGluIGludHR5cGVzLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKKyAgICAjCisgICAgIyBPSywgd2UgaGF2ZSBpbnR0eXBlcy5oLCBidXQgZG9lcyBpdCBkZWZpbmUgdGhvc2UgbWFjcm9zPworICAgICMKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGludHR5cGVzLmggZGVmaW5lcyB0aGUgUFJJW2RveHVdNjQgbWFjcm9zIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBpbnR0eXBlcy5oIGRlZmluZXMgdGhlIFBSSVtkb3h1XTY0IG1hY3Jvcy4uLiAkRUNIT19DIiA+JjY7IH0KKyAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKworCS8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisJICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkgICAgI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorCSAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKwkgICAgI2VuZGlmCisKKwkgICAgbWFpbigpCisJICAgIHsKKwkgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXG4iLCAodV9pbnQ2NF90KTEpOworCSAgICAgIHByaW50ZigiJSIgUFJJbzY0ICJcbiIsICh1X2ludDY0X3QpMSk7CisJICAgICAgcHJpbnRmKCIlIiBQUkl4NjQgIlxuIiwgKHVfaW50NjRfdCkxKTsKKwkgICAgICBwcmludGYoIiUiIFBSSXU2NCAiXG4iLCAodV9pbnQ2NF90KTEpOworCSAgICB9CisKKworX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorCWFjX2xibF9pbnR0eXBlc19oX2RlZmluZXNfZm9ybWF0cz15ZXMKKworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKwlhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK2Vsc2UKKworICAgICMKKyAgICAjIFdlIGRvbid0IGhhdmUgaW50dHlwZXMuaCwgc28gaXQgb2J2aW91c2x5IGNhbid0IGRlZmluZSB0aG9zZQorICAgICMgbWFjcm9zLgorICAgICMKKyAgICBhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KKworZmkKKworZG9uZQorCitpZiB0ZXN0ICIkYWNfbGJsX2ludHR5cGVzX2hfZGVmaW5lc19mb3JtYXRzIiA9IG5vOyB0aGVuCisKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICVseCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAlbHggY2FuIGJlIHVzZWQgdG8gZm9ybWF0IDY0LWJpdCBpbnRlZ2Vycy4uLiAkRUNIT19DIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisKKwkvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMJICAgIGlmZGVmIEhBVkVfSU5UVFlQRVNfSAorCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyMJICAgIGVuZGlmCisjCSAgICBpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyAgICAgICAgICAgICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorIwkgICAgZW5kaWYKKwkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisJICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworCSAgICBtYWluKCkKKwkgICAgeworCSAgICAgIHVfaW50NjRfdCB0ID0gMTsKKwkgICAgICBjaGFyIHN0cmJ1ZlsxNisxXTsKKwkgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiUwMTZseCIsIHQgPDwgMzIpOworCSAgICAgIGlmIChzdHJjbXAoc3RyYnVmLCAiMDAwMDAwMDEwMDAwMDAwMCIpID09IDApCisJCWV4aXQoMCk7CisJICAgICAgZWxzZQorCQlleGl0KDEpOworCSAgICB9CisKKworX0FDRU9GCitybSAtZiBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFJJZDY0ICJsZCIKK19BQ0VPRgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFJJbzY0ICJsbyIKK19BQ0VPRgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFJJeDY0ICJseCIKK19BQ0VPRgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFJJdTY0ICJsdSIKK19BQ0VPRgorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisKKworICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJWxseCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAlbGx4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMuLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCisJLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCSAgICBpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKwkgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+CisjCSAgICBlbmRpZgorIwkgICAgaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisgICAgICAgICAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyMJICAgIGVuZGlmCisJICAgICNpbmNsdWRlIDxzdGRpby5oPgorCSAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKwkgICAgbWFpbigpCisJICAgIHsKKwkgICAgICB1X2ludDY0X3QgdCA9IDE7CisJICAgICAgY2hhciBzdHJidWZbMTYrMV07CisJICAgICAgc3ByaW50ZihzdHJidWYsICIlMDE2bGx4IiwgdCA8PCAzMik7CisJICAgICAgaWYgKHN0cmNtcChzdHJidWYsICIwMDAwMDAwMTAwMDAwMDAwIikgPT0gMCkKKwkJZXhpdCgwKTsKKwkgICAgICBlbHNlCisJCWV4aXQoMSk7CisJICAgIH0KKworCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUklkNjQgImxsZCIKK19BQ0VPRgorCisJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgUFJJbzY0ICJsbG8iCitfQUNFT0YKKworCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBSSXg2NCAibGx4IgorX0FDRU9GCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUkl1NjQgImxsdSIKK19BQ0VPRgorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KKworZWxzZQorICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworKCBleGl0ICRhY19zdGF0dXMgKQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisKKworICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJUx4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICVMeCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzLi4uICRFQ0hPX0MiID4mNjsgfQorICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorZWxzZQorICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKworCS8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworIwkgICAgaWZkZWYgSEFWRV9JTlRUWVBFU19ICisJICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorIwkgICAgZW5kaWYKKyMJICAgIGlmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorICAgICAgICAgICAgI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjCSAgICBlbmRpZgorCSAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKwkgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisJICAgIG1haW4oKQorCSAgICB7CisJICAgICAgdV9pbnQ2NF90IHQgPSAxOworCSAgICAgIGNoYXIgc3RyYnVmWzE2KzFdOworCSAgICAgIHNwcmludGYoc3RyYnVmLCAiJTAxNkx4IiwgdCA8PCAzMik7CisJICAgICAgaWYgKHN0cmNtcChzdHJidWYsICIwMDAwMDAwMTAwMDAwMDAwIikgPT0gMCkKKwkJZXhpdCgwKTsKKwkgICAgICBlbHNlCisJCWV4aXQoMSk7CisJICAgIH0KKworCitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUklkNjQgIkxkIgorX0FDRU9GCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUklvNjQgIkxvIgorX0FDRU9GCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUkl4NjQgIkx4IgorX0FDRU9GCisKKwljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBQUkl1NjQgIkx1IgorX0FDRU9GCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorCitlbHNlCisgIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CitlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisoIGV4aXQgJGFjX3N0YXR1cyApCisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKworCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAlcXggY2FuIGJlIHVzZWQgdG8gZm9ybWF0IDY0LWJpdCBpbnRlZ2VycyIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJXF4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMuLi4gJEVDSE9fQyIgPiY2OyB9CisgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorCisJLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCSAgICBpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKwkgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+CisjCSAgICBlbmRpZgorIwkgICAgaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisgICAgICAgICAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyMJICAgIGVuZGlmCisJICAgICNpbmNsdWRlIDxzdGRpby5oPgorCSAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKwkgICAgbWFpbigpCisJICAgIHsKKwkgICAgICB1X2ludDY0X3QgdCA9IDE7CisJICAgICAgY2hhciBzdHJidWZbMTYrMV07CisJICAgICAgc3ByaW50ZihzdHJidWYsICIlMDE2cXgiLCB0IDw8IDMyKTsKKwkgICAgICBpZiAoc3RyY21wKHN0cmJ1ZiwgIjAwMDAwMDAxMDAwMDAwMDAiKSA9PSAwKQorCQlleGl0KDApOworCSAgICAgIGVsc2UKKwkJZXhpdCgxKTsKKwkgICAgfQorCisKK19BQ0VPRgorcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKworCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBSSWQ2NCAicWQiCitfQUNFT0YKKworCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBSSW82NCAicW8iCitfQUNFT0YKKworCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBSSXg2NCAicXgiCitfQUNFT0YKKworCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIFBSSXU2NCAicXUiCitfQUNFT0YKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CisKK2Vsc2UKKyAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKK2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyggZXhpdCAkYWNfc3RhdHVzICkKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQorCisJICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5laXRoZXIgJWxseCBub3IgJUx4IG5vciAlcXggd29ya2VkIG9uIGEgNjQtYml0IGludGVnZXIiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogbmVpdGhlciAlbGx4IG5vciAlTHggbm9yICVxeCB3b3JrZWQgb24gYSA2NC1iaXQgaW50ZWdlciIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworCisKKworZmkKK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCisKKworCitmaQorcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisKKworCisKK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKworCitmaQorCitybSAtZiBvcy1wcm90by5oCisgICAgaWYgdGVzdCAiJHtMQkxfQ0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCisJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUICR7TEJMX0NGTEFHU30iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1mIC5kZXZlbCA7IHRoZW4KKwkgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgIT0gc2V0OyB0aGVuCisJCQkgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfY2NfZyIgPSB5ZXMgOyB0aGVuCisJCQkJICAgIFZfQ0NPUFQ9Ii1nICRWX0NDT1BUIgorCQkJICAgIGZpCisJCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLVdhbGwiCisJCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgorCQkJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVciCisJCQkgICAgZmkKKwkJICAgIGZpCisJICAgIGVsc2UKKwkJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJCSAgICBpcml4NiopCisJCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLW4zMiIKKwkJCSAgICA7OworCisJCSAgICAqKQorCQkJICAgIDs7CisJCSAgICBlc2FjCisJICAgIGZpCisJICAgIG9zPWBlY2hvICRob3N0X29zIHwgc2VkIC1lICdzL1woWzAtOV1bMC05XSpcKVteMC05XS4qJC9cMS8nYAorCSAgICBuYW1lPSJsYmwvb3MtJG9zLmgiCisJICAgIGlmIHRlc3QgLWYgJG5hbWUgOyB0aGVuCisJCSAgICBsbiAtcyAkbmFtZSBvcy1wcm90by5oCisJCSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX09TX1BST1RPX0ggMQorX0FDRU9GCisKKwkgICAgZWxzZQorCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogY2FuJ3QgZmluZCAkbmFtZSIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbid0IGZpbmQgJG5hbWUiID4mMjt9CisJICAgIGZpCisgICAgZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQorICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkciAqKTApLT5zYV9sZW4pCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW49eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4iID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICRhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbiA9IHllcyA7IHRoZW4KKwkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TT0NLQUREUl9TQV9MRU4gMQorX0FDRU9GCisKKyAgICBmaQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB1bmFsaWduZWQgYWNjZXNzZXMgZmFpbCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsLi4uICRFQ0hPX0MiID4mNjsgfQorICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKworCSMKKwkjIFRoZXNlIGFyZSBDUFUgdHlwZXMgd2hlcmU6CisJIworCSMJdGhlIENQVSBmYXVsdHMgb24gYW4gdW5hbGlnbmVkIGFjY2VzcywgYnV0IGF0IGxlYXN0IHNvbWUKKwkjCU9TZXMgdGhhdCBzdXBwb3J0IHRoYXQgQ1BVIGNhdGNoIHRoZSBmYXVsdCBhbmQgc2ltdWxhdGUKKwkjCXRoZSB1bmFsaWduZWQgYWNjZXNzIChlLmcuLCBBbHBoYS97RGlnaXRhbCxUcnU2NH0gVU5JWCkgLQorCSMJdGhlIHNpbXVsYXRpb24gaXMgc2xvdywgc28gd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQ7CisJIworCSMJdGhlIENQVSwgSSBpbmZlciAoZnJvbSB0aGUgb2xkCisJIworCSMgWFhYOiBzaG91bGQgYWxzbyBjaGVjayB0aGF0IHRoZXkgZG9uJ3QgZG8gd2VpcmQgdGhpbmdzIChsaWtlIG9uIGFybSkKKwkjCisJIwljb21tZW50KSBkb2Vzbid0IGZhdWx0IG9uIHVuYWxpZ25lZCBhY2Nlc3NlcywgYnV0IGRvZXNuJ3QKKwkjCWRvIGEgbm9ybWFsIHVuYWxpZ25lZCBmZXRjaCwgZWl0aGVyIChlLmcuLCBwcmVzdW1hYmx5LCBBUk0pOworCSMKKwkjCWZvciB3aGF0ZXZlciByZWFzb24sIHRoZSB0ZXN0IHByb2dyYW0gZG9lc24ndCB3b3JrCisJIwkodGhpcyBoYXMgYmVlbiBjbGFpbWVkIHRvIGJlIHRoZSBjYXNlIGZvciBzZXZlcmFsIG9mIHRob3NlCisJIwlDUFVzIC0gSSBkb24ndCBrbm93IHdoYXQgdGhlIHByb2JsZW0gaXM7IHRoZSBwcm9ibGVtCisJIwl3YXMgcmVwb3J0ZWQgYXMgInRoZSB0ZXN0IHByb2dyYW0gZHVtcHMgY29yZSIgZm9yIFN1cGVySCwKKwkjCWJ1dCB0aGF0J3Mgd2hhdCB0aGUgdGVzdCBwcm9ncmFtIGlzICpzdXBwb3NlZCogdG8gZG8gLQorCSMJaXQgZHVtcHMgY29yZSBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyB0aGUgdGVzdAorCSMJZm9yIGFuIGVtcHR5IG91dHB1dCBmaWxlIHNob3VsZCBmaW5kIGFuIGVtcHR5IG91dHB1dAorCSMJZmlsZSBhbmQgY29uY2x1ZGUgdGhhdCB1bmFsaWduZWQgYWNjZXNzZXMgZG9uJ3Qgd29yaykuCisJIworCSMgVGhpcyBydW4tdGltZSB0ZXN0IHdvbid0IHdvcmsgaWYgeW91J3JlIGNyb3NzLWNvbXBpbGluZywgc28KKwkjIGluIG9yZGVyIHRvIHN1cHBvcnQgY3Jvc3MtY29tcGlsaW5nIGZvciBhIHBhcnRpY3VsYXIgQ1BVLAorCSMgd2UgaGF2ZSB0byB3aXJlIGluIHRoZSBsaXN0IG9mIENQVSB0eXBlcyBhbnl3YXksIGFzIGZhciBhcworCSMgSSBrbm93LCBzbyBwZXJoYXBzIHdlIHNob3VsZCBqdXN0IGhhdmUgYSBzZXQgb2YgQ1BVcyBvbgorCSMgd2hpY2ggd2Uga25vdyBpdCBkb2Vzbid0IHdvcmssIGEgc2V0IG9mIENQVXMgb24gd2hpY2ggd2UKKwkjIGtub3cgaXQgZG9lcyB3b3JrLCBhbmQgaGF2ZSB0aGUgc2NyaXB0IGp1c3QgZmFpbCBvbiBvdGhlcgorCSMgY3B1IHR5cGVzIGFuZCB1cGRhdGUgaXQgd2hlbiBzdWNoIGEgZmFpbHVyZSBvY2N1cnMuCisJIworCWFscGhhKnxhcm0qfGhwKnxtaXBzKnxzaCp8c3BhcmMqfGlhNjR8bnYxKQorCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCTs7CisKKwkqKQorCQljYXQgPmNvbmZ0ZXN0LmMgPDxFT0YKKyMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwkJaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyMJCWluY2x1ZGUgPHN0ZGlvLmg+CisJCXVuc2lnbmVkIGNoYXIgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OworCQltYWluKCkgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJcGlkX3QgcGlkOworCQlpbnQgc3RhdHVzOworCQkvKiBhdm9pZCAiY29yZSBkdW1wZWQiIG1lc3NhZ2UgKi8KKwkJcGlkID0gZm9yaygpOworCQlpZiAocGlkIDwgIDApCisJCQlleGl0KDIpOworCQlpZiAocGlkID4gMCkgeworCQkJLyogcGFyZW50ICovCisJCQlwaWQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CisJCQlpZiAocGlkIDwgMCkKKwkJCQlleGl0KDMpOworCQkJZXhpdCghV0lGRVhJVEVEKHN0YXR1cykpOworCQl9CisJCS8qIGNoaWxkICovCisJCWkgPSAqKHVuc2lnbmVkIGludCAqKSZhWzFdOworCQlwcmludGYoIiVkXG4iLCBpKTsKKwkJZXhpdCgwKTsKKwkJfQorRU9GCisJCSR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKKwkJICAgIGNvbmZ0ZXN0LmMgJExJQlMgPi9kZXYvbnVsbCAyPiYxCisJCWlmIHRlc3QgISAteCBjb25mdGVzdCA7IHRoZW4KKwkJCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKKwkJZWxzZQorCQkJLi9jb25mdGVzdCA+Y29uZnRlc3Qub3V0CisJCQlpZiB0ZXN0ICEgLXMgY29uZnRlc3Qub3V0IDsgdGhlbgorCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKKwkJCWVsc2UKKwkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9bm8KKwkJCWZpCisJCWZpCisJCXJtIC1mIGNvbmZ0ZXN0KiBjb3JlIGNvcmUuY29uZnRlc3QKKwkJOzsKKwllc2FjCitmaQorCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwiID4mNjsgfQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF91bmFsaWduZWRfZmFpbCA9IHllcyA7IHRoZW4KKwkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgTEJMX0FMSUdOIDEKK19BQ0VPRgorCisgICAgZmkKKworCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGhfZXJybm8iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaF9lcnJuby4uLiAkRUNIT19DIiA+JjY7IH0KKwlpZiB0ZXN0ICIke2FjX2N2X3Zhcl9oX2Vycm5vK3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPG5ldGRiLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCBmb28gPSBoX2Vycm5vOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgIGFjX2N2X3Zhcl9oX2Vycm5vPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfdmFyX2hfZXJybm89bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl9oX2Vycm5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl92YXJfaF9lcnJubyIgPiY2OyB9CisJaWYgdGVzdCAiJGFjX2N2X3Zhcl9oX2Vycm5vIiA9ICJ5ZXMiOyB0aGVuCisJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfSF9FUlJOTyAxCitfQUNFT0YKKworCWZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0byB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfY3J5cHRvK3NldH0iID0gc2V0OyB0aGVuCisgIHdpdGh2YWw9JHdpdGhfY3J5cHRvOworZWxzZQorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgU1NMZWF5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFNTTGVheS4uLiAkRUNIT19DIiA+JjY7IH0KK2FjX2N2X3NzbGVheV9wYXRoPW5vCitpbmNkaXI9bm8KKworIworIyBJZiBYcHJlZml4IGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIHVzZSB0aGF0IHZhbHVlLgorIyBYWFggLSB0aGlzIHNob3VsZCBhcmd1YWJseSBiZSBkb25lIGJ5IGhhdmluZyAtLXdpdGgtY3J5cHRvIHRha2UgYW4KKyMgb3B0aW9uYWwgYXJndW1lbnQsIGFuZCBoYXZlIHRoYXQgYXJndW1lbnQgYmUgdXNlZCB0byBzZXQgWHByZWZpeAorIyBpZiBwcmVzZW50LgorIworaWYgdGVzdCAteiAiJFhwcmVmaXgiOyB0aGVuCisJWHByZWZpeD1gZXZhbCBlY2hvICRwcmVmaXhgCitmaQorCitmb3IgZGlyIGluICRYcHJlZml4IC91c3IvJHtob3N0X2FsaWFzfSAvdXNyIC91c3IvbG9jYWwgL3Vzci9sb2NhbC9zc2wgL3Vzci9wa2c7IGRvCisJIworCSMgWFhYIC0gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIGlmIGEgZ2l2ZW4gbGlicmFyeSBpcworCSMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdGhhbiBjaGVja2luZyBlYWNoIG9mIHRoZSBwb3NzaWJsZQorCSMgc2hhcmVkIGxpYnJhcnkgc3VmZml4ZXM/CisJIworCSMgQXJlIHRoZXJlIGFueSBvdGhlciBzdWZmaXhlcyB3ZSBuZWVkIHRvIGxvb2sgZm9yPyAgRG8gd2UgaGF2ZSB0bworCSMgd29ycnkgYWJvdXQgIi5zby57dmVyc2lvbn0iPworCSMKKwkjIE9yIHNob3VsZCB3ZSBqdXN0IGxvb2sgZm9yICJsaWJjcnlwdG8uKiI/CisJIworCWlmIHRlc3QgLWQgJGRpci9saWIgLWEgXCggLWYgJGRpci9saWIvbGliY3J5cHRvLmEgLW8gXAorCQkJICAgICAgICAgIC1mICRkaXIvbGliL2xpYmNyeXB0by5zbyAtbyBcCisJCQkgICAgICAgICAgLWYgJGRpci9saWIvbGliY3J5cHRvLnNsIC1vIFwKKwkJCQkgIC1mICRkaXIvbGliL2xpYmNyeXB0by5keWxpYiBcKTsgdGhlbgorCQlhY19jdl9zc2xlYXlfcGF0aD0kZGlyCisJZmkKKwlpZiB0ZXN0IC1kICRkaXIvaW5jbHVkZS9vcGVuc3NsIC1hIC1mICRkaXIvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oOyB0aGVuCisJCWluY2Rpcj0iLUkkZGlyL2luY2x1ZGUiCisJZmkKKwlpZiB0ZXN0ICIkYWNfY3Zfc3NsZWF5X3BhdGgiICE9ICJubyIgLWEgIiRpbmNkaXIiICE9ICJubyI7IHRoZW4KKwkJYnJlYWs7CisJZWxzZQorCQlhY19jdl9zc2xlYXlfcGF0aD1ubworCQlpbmNkaXI9bm8KKwlmaQorZG9uZQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3NsZWF5X3BhdGgiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NzbGVheV9wYXRoIiA+JjY7IH0KK2lmIHRlc3QgIiRhY19jdl9zc2xlYXlfcGF0aCIgIT0gbm87IHRoZW4KKwlWX0lOQ0xTPSIkVl9JTkNMUyAkaW5jZGlyIgorCUxERkxBR1M9Ii1MJGRpci9saWIgJExERkxBR1MiCisJaWYgdGVzdCAtZiAkYWNfY3Zfc3NsZWF5X3BhdGgvbGliL2xpYlJTQWdsdWUuYTsgdGhlbgorCQlMSUJTPSIkTElCUyAtbFJTQWdsdWUiCisJZmkKKwlpZiB0ZXN0IC1mICRhY19jdl9zc2xlYXlfcGF0aC9saWIvbGlicnNhcmVmLmE7IHRoZW4KKwkJTElCUz0iJExJQlMgLWxyc2FyZWYiCisJZmkKKworeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIERFU19jYmNfZW5jcnlwdCBpbiAtbGNyeXB0byIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBERVNfY2JjX2VuY3J5cHQgaW4gLWxjcnlwdG8uLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0K3NldH0iID0gc2V0OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sY3J5cHRvICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIERFU19jYmNfZW5jcnlwdCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIERFU19jYmNfZW5jcnlwdCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisgIGFjX3N0YXR1cz0kPworICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorICBybSAtZiBjb25mdGVzdC5lcjEKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgorICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCisgIGFjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX2NyeXB0b19ERVNfY2JjX2VuY3J5cHQ9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY3J5cHRvX0RFU19jYmNfZW5jcnlwdCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9saWJfY3J5cHRvX0RFU19jYmNfZW5jcnlwdCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKK19BQ0VPRgorCisgIExJQlM9Ii1sY3J5cHRvICRMSUJTIgorCitmaQorCisKKwlDUFBGTEFHUz0iJENQUEZMQUdTICRWX0lOQ0xTIgorCitmb3IgYWNfaGVhZGVyIGluIG9wZW5zc2wvZXZwLmgKK2RvCithc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorZWxzZQorICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorCisjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8JGFjX2hlYWRlcj4KK19BQ0VPRgoraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuCisgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorCitybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisgIHllczpubzogKQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworICAgIDs7CisgIG5vOnllczoqICkKKyAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorCisgICAgOzsKK2VzYWMKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9CitpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisgIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2CitlbHNlCisgIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKK2ZpCithY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKKwkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQorCitmaQoraWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZmkKKworZmkKKworCitpZiB0ZXN0ICIkbWlzc2luZ19pbmNsdWRlcyIgPSAieWVzIjsgdGhlbgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUlcJChzcmNkaXIpL21pc3NpbmciCisJVl9JTkNMUz0iJFZfSU5DTFMgLUlcJChzcmNkaXIpL21pc3NpbmciCitmaQorCisKKworCisKKworCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbgorICAuLyB8IC4vLyB8IC9jQy8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorCSAgICBicmVhayAzCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgZG9uZQorICAgIDs7Citlc2FjCitkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKyAgZWxzZQorICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKyAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKKyAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCisgICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAorICBmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQorCisjIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCisjIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgordGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworCit0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JworCisKK2FjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCisKKworYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQtMSIKKworYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgorCitjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKyMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCisjIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgorIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisjCisjIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAorIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisjCisjIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcy4KKworX0FDRU9GCisKKyMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCisjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KKyMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKK2VjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCisgICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKyAgICAgIHNlZCAtbiBcCisJInMvJy8nXFxcXCcnL2c7CisJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCisgICAgICA7OyAjKAorICAgICopCisgICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKSB8CisgIHNlZCAnCisgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorICAgICB0IGNsZWFyCisgICAgIDpjbGVhcgorICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCisgICAgIHQgZW5kCisgICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LworICAgICA6ZW5kJyA+PmNvbmZjYWNoZQoraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KKyAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQorICBlbHNlCisgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKyAgZmkKK2ZpCitybSAtZiBjb25mY2FjaGUKKwordGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAorIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCit0ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCisKK0RFRlM9LURIQVZFX0NPTkZJR19ICisKK2FjX2xpYm9ianM9CithY19sdGxpYm9ianM9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKKyAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgorICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKyAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKworOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQorY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorIyEgJFNIRUxMCisjIEdlbmVyYXRlZCBieSAkYXNfbWUuCisjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworZGVidWc9ZmFsc2UKK2FjX2NzX3JlY2hlY2s9ZmFsc2UKK2FjX2NzX3NpbGVudD1mYWxzZQorU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCisgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworZXNhYworCitmaQorCisKKworCisjIFBBVEggbmVlZHMgQ1IKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCisjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisgIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKKyAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAorICBjaG1vZCAreCBjb25mJCQuc2gKKyAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBQQVRIX1NFUEFSQVRPUj0nOycKKyAgZWxzZQorICAgIFBBVEhfU0VQQVJBVE9SPToKKyAgZmkKKyAgcm0gLWYgY29uZiQkLnNoCitmaQorCisjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc191bnNldD11bnNldAorZWxzZQorICBhc191bnNldD1mYWxzZQorZmkKKworCisjIElGUworIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKyMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCithc19ubD0nCisnCitJRlM9IiAiIgkkYXNfbmwiCisKKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCitjYXNlICQwIGluCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhaworZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgICAgIDs7Citlc2FjCisjIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCisjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKyAgYXNfbXlzZWxmPSQwCitmaQoraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKworIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCitmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICitkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorZG9uZQorUFMxPSckICcKK1BTMj0nPiAnCitQUzQ9JysgJworCisjIE5MUyBudWlzYW5jZXMuCitmb3IgYXNfdmFyIGluIFwKKyAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKKyAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKKyAgTENfVEVMRVBIT05FIExDX1RJTUUKK2RvCisgIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCisgICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCisgIGVsc2UKKyAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorICBmaQorZG9uZQorCisjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworCisjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorZWNobyBYLyIkMCIgfAorICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXC9cKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKworIyBDRFBBVEguCiskYXNfdW5zZXQgQ0RQQVRICisKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTworICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7CisKKyAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAorICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCisgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKyAgIyBjYXNlIGF0IGxpbmUgZW5kLgorICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKyAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCisgICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCisgIHNlZCAtbiAnCisgICAgcAorICAgIC9bJF1MSU5FTk8vPQorICAnIDwkYXNfbXlzZWxmIHwKKyAgICBzZWQgJworICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKyAgICAgIHQgbGluZW5vCisgICAgICBiCisgICAgICA6bGluZW5vCisgICAgICBOCisgICAgICA6bG9vcAorICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCisgICAgICB0IGxvb3AKKyAgICAgIHMvLVxuLiovLworICAgICcgPiRhc19tZS5saW5lbm8gJiYKKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KK2Nhc2UgYGVjaG8gLW4geGAgaW4KKy1uKikKKyAgY2FzZSBgZWNobyAneFxjJ2AgaW4KKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisgICopICAgRUNIT19DPSdcYyc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisgIGFzX2V4cHI9ZXhwcgorZWxzZQorICBhc19leHByPWZhbHNlCitmaQorCitybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQoraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKK2Vsc2UKKyAgcm0gLWYgY29uZiQkLmRpcgorICBta2RpciBjb25mJCQuZGlyCitmaQorZWNobyA+Y29uZiQkLmZpbGUKK2lmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19sbl9zPSdsbiAtcycKKyAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKyAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCisgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKyAgICBhc19sbl9zPSdjcCAtcCcKK2VsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX2xuX3M9bG4KK2Vsc2UKKyAgYXNfbG5fcz0nY3AgLXAnCitmaQorcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorCitpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisgIGFzX21rZGlyX3A9OgorZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKyAgICAgICAgdGVzdCAtZCAiJDEvLiI7CisgICAgICBlbHNlCisJY2FzZSAkMSBpbgorICAgICAgICAtKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCisJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorICAgICdcJycgc2gKKyAgJworZmkKK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKyMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworCitleGVjIDY+JjEKKworIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KK2FjX2xvZz0iCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisgIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUworICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCisgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKyAgJCAkMCAkQAorCitvbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyIKKworX0FDRU9GCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCitjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgorY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCithY19jc191c2FnZT0iXAorXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCitjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisKK1VzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCisKKyAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKKyAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKKyAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKyAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisJCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCisKK0NvbmZpZ3VyYXRpb24gZmlsZXM6CiskY29uZmlnX2ZpbGVzCisKK0NvbmZpZ3VyYXRpb24gaGVhZGVyczoKKyRjb25maWdfaGVhZGVycworCitDb25maWd1cmF0aW9uIGNvbW1hbmRzOgorJGNvbmZpZ19jb21tYW5kcworCitSZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorYWNfY3NfdmVyc2lvbj0iXFwKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSwKKyAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKKworQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0CisjIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPSopCisgICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisgICAgYWNfc2hpZnQ9OgorICAgIDs7CisgICopCisgICAgYWNfb3B0aW9uPSQxCisgICAgYWNfb3B0YXJnPSQyCisgICAgYWNfc2hpZnQ9c2hpZnQKKyAgICA7OworICBlc2FjCisKKyAgY2FzZSAkYWNfb3B0aW9uIGluCisgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCisgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorICAgIGFjX2NzX3JlY2hlY2s9OiA7OworICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCisgICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisgIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCisgICAgZGVidWc9OiA7OworICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorICAgICRhY19zaGlmdAorICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisgICAgJGFjX3NoaWZ0CisgICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgorICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworICAtLWhlIHwgLS1oKQorICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCisgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCisgICAgYWNfY3Nfc2lsZW50PTogOzsKKworICAjIFRoaXMgaXMgYW4gZXJyb3IuCisgIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKworICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgorICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7CisKKyAgZXNhYworICBzaGlmdAorZG9uZQorCithY19jb25maWd1cmVfZXh0cmFfYXJncz0KKworaWYgJGFjX2NzX3NpbGVudDsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCisgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCitmaQorCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitpZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KKyAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2CisgIENPTkZJR19TSEVMTD0kU0hFTEwKKyAgZXhwb3J0IENPTkZJR19TSEVMTAorICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCitleGVjIDU+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAorIyMgUnVubmluZyAkYXNfbWUuICMjCitfQVNCT1gKKyAgZWNobyAiJGFjX2xvZyIKK30gPiY1CisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyMKKyMgSU5JVC1DT01NQU5EUworIworCisKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKworIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCitmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKK2RvCisgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKyAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OworICAgICJkZWZhdWx0LTEiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdC0xIiA7OworICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKKworICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgIGVzYWMKK2RvbmUKKworCisjIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCisjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKyMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKKyMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCitpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcworICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycworICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcworZmkKKworIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCisjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisjIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCisjIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisjIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KKyRkZWJ1ZyB8fAoreworICB0bXA9CisgIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/CisgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisnIDAKKyAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKK30KKyMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgorCit7CisgIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgorICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgorfSAgfHwKK3sKKyAgdG1wPS4vY29uZiQkLSRSQU5ET00KKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCit9IHx8Cit7CisgICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cit9CisKKyMKKyMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCisjCisKKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgorIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCitpZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgorCitfQUNFT0YKKworCisKK2FjX2RlbGltPSclIV8hIyAnCitmb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KKyAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgorU0hFTEwhJFNIRUxMJGFjX2RlbGltCitQQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KK1BBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCitQQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQorUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KK1BBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQorUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCitleGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KK3ByZWZpeCEkcHJlZml4JGFjX2RlbGltCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCitiaW5kaXIhJGJpbmRpciRhY19kZWxpbQorc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQorbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQorZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCitkYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCitzeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCitzaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KK2xvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KK2luY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KK29sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KK2RvY2RpciEkZG9jZGlyJGFjX2RlbGltCitpbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCitodG1sZGlyISRodG1sZGlyJGFjX2RlbGltCitkdmlkaXIhJGR2aWRpciRhY19kZWxpbQorcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KK3BzZGlyISRwc2RpciRhY19kZWxpbQorbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KK2xvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCittYW5kaXIhJG1hbmRpciRhY19kZWxpbQorREVGUyEkREVGUyRhY19kZWxpbQorRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KK0VDSE9fTiEkRUNIT19OJGFjX2RlbGltCitFQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQorTElCUyEkTElCUyRhY19kZWxpbQorYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCitob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCit0YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQorYnVpbGQhJGJ1aWxkJGFjX2RlbGltCitidWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQorYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KK2J1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQoraG9zdCEkaG9zdCRhY19kZWxpbQoraG9zdF9jcHUhJGhvc3RfY3B1JGFjX2RlbGltCitob3N0X3ZlbmRvciEkaG9zdF92ZW5kb3IkYWNfZGVsaW0KK2hvc3Rfb3MhJGhvc3Rfb3MkYWNfZGVsaW0KK1NITElDQzIhJFNITElDQzIkYWNfZGVsaW0KK0NDISRDQyRhY19kZWxpbQorQ0ZMQUdTISRDRkxBR1MkYWNfZGVsaW0KK0xERkxBR1MhJExERkxBR1MkYWNfZGVsaW0KK0NQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQorYWNfY3RfQ0MhJGFjX2N0X0NDJGFjX2RlbGltCitFWEVFWFQhJEVYRUVYVCRhY19kZWxpbQorT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KK0NQUCEkQ1BQJGFjX2RlbGltCitHUkVQISRHUkVQJGFjX2RlbGltCitFR1JFUCEkRUdSRVAkYWNfZGVsaW0KK0xJQk9CSlMhJExJQk9CSlMkYWNfZGVsaW0KK1ZfQ0NPUFQhJFZfQ0NPUFQkYWNfZGVsaW0KK1ZfREVGUyEkVl9ERUZTJGFjX2RlbGltCitWX0dST1VQISRWX0dST1VQJGFjX2RlbGltCitWX0lOQ0xTISRWX0lOQ0xTJGFjX2RlbGltCitWX1BDQVBERVAhJFZfUENBUERFUCRhY19kZWxpbQorTE9DQUxTUkMhJExPQ0FMU1JDJGFjX2RlbGltCitJTlNUQUxMX1BST0dSQU0hJElOU1RBTExfUFJPR1JBTSRhY19kZWxpbQorSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCitJTlNUQUxMX0RBVEEhJElOU1RBTExfREFUQSRhY19kZWxpbQorTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KK19BQ0VPRgorCisgIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gNjc7IHRoZW4KKyAgICBicmVhaworICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgIGVsc2UKKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorICBmaQorZG9uZQorCithY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKK2lmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCisgIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCisgIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKK2ZpCisKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCitjYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgorL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKK19BQ0VPRgorc2VkICcKK3MvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKK3MvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KKzpuCit0IG4KK3MvJyIkYWNfZGVsaW0iJyQvLGcvOyB0CitzLyQvXFwvOyBwCitOOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgorJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAorcm0gLWYgY29uZiQkc3Vicy5zZWQKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCis6ZW5kCitzL3wjXyEhXyN8Ly9nCitDRU9GJGFjX2VvZgorX0FDRU9GCisKKworIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCisjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworcy86KlwkKHNyY2Rpcik6Ki86Lworcy86Klwke3NyY2Rpcn06Ki86Lworcy86KkBzcmNkaXJAOiovOi8KK3MvXlwoW149XSo9WwkgXSpcKToqL1wxLworcy86KiQvLworcy9eW149XSo9WwkgXSokLy8KK30nCitmaQorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKworCitmb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUworZG8KKyAgY2FzZSAkYWNfdGFnIGluCisgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworICBlc2FjCisgIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCisgIDpbRkhMXSo6Kik7OworICA6TCogfCA6Qyo6KikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKyAgICAgIGVzYWMKKyAgICAgIGFjX2ZpbGVfaW5wdXRzPSIkYWNfZmlsZV9pbnB1dHMgJGFjX2YiCisgICAgZG9uZQorCisgICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKKyAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6CisgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKyAgICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBmcm9tICJgSUZTPToKKwkgIGVjaG8gJCogfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJ2AiIGJ5IGNvbmZpZ3VyZS4iCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisKKyAgICBjYXNlICRhY190YWcgaW4KKyAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiI7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisKKyAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8CiskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKK2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIHsgYXNfZGlyPSIkYWNfZGlyIgorICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKKyAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7CisgICAgICBlc2FjCisgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKKyRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CitlY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisgIGFjX2J1aWxkZGlyPS4KKworY2FzZSAiJGFjX2RpciIgaW4KKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKikKKyAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisKKyAgY2FzZSAkYWNfbW9kZSBpbgorICA6RikKKyAgIworICAjIENPTkZJR19GSUxFCisgICMKKworICBjYXNlICRJTlNUQUxMIGluCisgIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisgIGVzYWMKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKyMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgorYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49CisKK2Nhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7CisgIHAKKyAgcQorfQorL0BkYXRhZGlyQC9wCisvQGRvY2RpckAvcAorL0BpbmZvZGlyQC9wCisvQGxvY2FsZWRpckAvcAorL0BtYW5kaXJAL3AKKycgJGFjX2ZpbGVfaW5wdXRzYCBpbgorKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OworKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCisgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKyAgcyZAaW5mb2RpckAmJGluZm9kaXImZworICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworICBzJkBtYW5kaXJAJiRtYW5kaXImZworICAgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgorICBzZWQgIiRhY192cHN1YgorJGV4dHJhc3ViCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3MmQGNvbmZpZ3VyZV9pbnB1dEAmJGNvbmZpZ3VyZV9pbnB1dCY7dCB0CitzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKK3MmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0CitzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CitzJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0CitzJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKK3MmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKyRhY19kYXRhcm9vdGRpcl9oYWNrCisiICRhY19maWxlX2lucHV0cyB8IHNlZCAtZiAiJHRtcC9zdWJzLTEuc2VkIiA+JHRtcC9vdXQKKwordGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1CitlY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJword2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KKworICBybSAtZiAiJHRtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiR0bXAvb3V0Ijsgcm0gLWYgIiR0bXAvb3V0Ijs7CisgICopIHJtIC1mICIkYWNfZmlsZSI7IG12ICIkdG1wL291dCIgJGFjX2ZpbGU7OworICBlc2FjCisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKK19BQ0VPRgorCisjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAorIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCitybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKKyMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgorZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcworIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCisjIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCisjIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCisjIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAorIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgorYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKKyMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBQQVJBTVMgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncworIyBqdXN0IGFuIGVtcHR5IHN0cmluZy4KK2FjX2RBPSdzLF5cXChbCSAjXSpcXClbXgkgXSpcXChbCSBdKicKK2FjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKK2FjX2RDPScgJworYWNfZEQ9JyAsJworCit1bmlxIGNvbmZkZWZzLmggfAorICBzZWQgLW4gJworCXQgcnNldAorCTpyc2V0CisJcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovLworCXQgb2sKKwlkCisJOm9rCisJcy9bXFwmLF0vXFwmL2cKKwlzL15cKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvICciJGFjX2RBIidcMSciJGFjX2RCIidcMiciJHthY19kQ30iJ1wzJyIkYWNfZEQiJy9wCisJcy9eXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpLyciJGFjX2RBIidcMSciJGFjX2RCJGFjX2RDIidcMiciJGFjX2REIicvcAorICAnID4+Y29uZnRlc3QuZGVmaW5lcworCisjIFJlbW92ZSB0aGUgc3BhY2UgdGhhdCB3YXMgYXBwZW5kZWQgdG8gZWFzZSBtYXRjaGluZy4KKyMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisjIChUaGUgcmVnZXhwIGNhbiBiZSBzaG9ydCwgc2luY2UgdGhlIGxpbmUgY29udGFpbnMgZWl0aGVyICNkZWZpbmUgb3IgI3VuZGVmLikKK2VjaG8gJ3MvICQvLworcyxeWwkgI10qdS4qLC8qICYgKi8sJyA+PmNvbmZ0ZXN0LmRlZmluZXMKKworIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgorYWNfbWF4X3NlZF9saW5lcz01MAorCisjIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKKyMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKKyMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCisjIGV0IGNldGVyYS4KK2FjX2luPSckYWNfZmlsZV9pbnB1dHMnCithY19vdXQ9JyIkdG1wL291dDEiJworYWNfbnh0PSciJHRtcC9vdXQyIicKKword2hpbGUgOgorZG8KKyAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6CisgICAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKKyAgICAjIEZpcnN0LCBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBsaW5lOgorICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgorL15bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qJGFjX3dvcmRfcmVbCSBdKlwkL2IgZGVmCisvXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qJGFjX3dvcmRfcmVbKAkgXS9iIGRlZgorYgorOmRlZgorX0FDRU9GCisgIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKKyAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KKyAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAorICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCisgIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCitkb25lCitybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKKworZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCisgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKyAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgPiIkdG1wL2NvbmZpZy5oIgorICAgIGNhdCAiJGFjX3Jlc3VsdCIgPj4iJHRtcC9jb25maWcuaCIKKyAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CitlY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KKyAgICBlbHNlCisgICAgICBybSAtZiAkYWNfZmlsZQorICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICRhY19maWxlCisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIgorICAgIGNhdCAiJGFjX3Jlc3VsdCIKKyAgZmkKKyAgcm0gLWYgIiR0bXAvb3V0MTIiCisgOzsKKworICA6QykgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1CitlY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KKyA7OworICBlc2FjCisKKworICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KKyAgICAiZGVmYXVsdC0xIjpDKSBpZiB0ZXN0IC1mIC5kZXZlbDsgdGhlbgorCWVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAorCWNhdCBNYWtlZmlsZS1kZXZlbC1hZGRzID4+IE1ha2VmaWxlCisJbWFrZSBkZXBlbmQKK2ZpIDs7CisKKyAgZXNhYworZG9uZSAjIGZvciBhY190YWcKKworCit7IChleGl0IDApOyBleGl0IDA7IH0KK19BQ0VPRgorY2htb2QgK3ggJENPTkZJR19TVEFUVVMKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKKworIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCisjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCisjIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAorIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCisjIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGFjX2NzX3N1Y2Nlc3M9OgorICBhY19jb25maWdfc3RhdHVzX2FyZ3M9CisgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCisgIGV4ZWMgNT4vZGV2L251bGwKKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorICBleGVjIDU+PmNvbmZpZy5sb2cKKyAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorZmkKKworZXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwMTBlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZS5pbgpAQCAtMCwwICsxLDk5NSBAQAorZG5sIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvY29uZmlndXJlLmluLHYgMS4xODguMi44IDIwMDcvMDkvMTIgMTk6NDg6NTAgZ3V5IEV4cCAkIChMQkwpCitkbmwKK2RubCBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKK2RubAlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK2RubAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwKKworQUNfUkVWSVNJT04oJFJldmlzaW9uOiAxLjE4OC4yLjggJCkKK0FDX1BSRVJFUSgyLjUwKQorQUNfSU5JVCh0Y3BkdW1wLmMpCisKK0FDX0NBTk9OSUNBTF9IT1NUCisKK0FDX0xCTF9DX0lOSVQoVl9DQ09QVCwgVl9JTkNMUykKK0FDX0xCTF9DX0lOTElORQorQUNfQ19fX0FUVFJJQlVURV9fCitBQ19DSEVDS19IRUFERVJTKGZjbnRsLmggcnBjL3JwY2VudC5oIG5ldGRuZXQvZG5ldGRiLmgpCitBQ19DSEVDS19IRUFERVJTKG5ldC9wZnZhci5oLCAsICwgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+XSkKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0X3BmdmFyX2giID09IHllczsgdGhlbgorCUxPQ0FMU1JDPSJwcmludC1wZmxvZy5jICRMT0NBTFNSQyIKK2ZpCitBQ19DSEVDS19IRUFERVJTKG5ldGluZXQvaWZfZXRoZXIuaCwgLCAsIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0pCitpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgIT0geWVzOyB0aGVuCisJIworCSMgVGhlIHNpbXBsZSB0ZXN0IGRpZG4ndCB3b3JrLgorCSMgRG8gd2UgbmVlZCB0byBpbmNsdWRlIDxuZXQvaWYuaD4gZmlyc3Q/CisJIyBVbnNldCBhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIHNvIHdlIGRvbid0CisJIyB0cmVhdCB0aGUgcHJldmlvdXMgZmFpbHVyZSBhcyBhIGNhY2hlZCB2YWx1ZSBhbmQKKwkjIHN1cHByZXNzIHRoZSBuZXh0IHRlc3QuCisJIworCUFDX01TR19OT1RJQ0UoW1JlY2hlY2tpbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgaW5jbHVkZXNdKQorCXVuc2V0IGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2gKKwlBQ19DSEVDS19IRUFERVJTKG5ldGluZXQvaWZfZXRoZXIuaCwgLCAsIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KK3N0cnVjdCBtYnVmOworc3RydWN0IHJ0ZW50cnk7CisjaW5jbHVkZSA8bmV0L2lmLmg+XSkKK2ZpCisKK0FDX0hFQURFUl9USU1FCisKK2Nhc2UgIiRob3N0X29zIiBpbgorCitsaW51eCopCisJQUNfTVNHX0NIRUNLSU5HKExpbnV4IGtlcm5lbCB2ZXJzaW9uKQorIAlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorIAkJQUNfQ0FDSEVfVkFMKGFjX2N2X2xpbnV4X3ZlcnMsCisgCQkgICAgYWNfY3ZfbGludXhfdmVycz11bmtub3duKQorIAllbHNlCisgCQlBQ19DQUNIRV9WQUwoYWNfY3ZfbGludXhfdmVycywKKyAJCSAgICBhY19jdl9saW51eF92ZXJzPWB1bmFtZSAtciAyPiYxIHwgXAorIAkJCXNlZCAtbiAtZSAnJHMvLiogLy8nIC1lICckcy9cLi4qLy9wJ2ApCisgCWZpCisJQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGludXhfdmVycykKKyAJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyA9IHVua25vd24gOyB0aGVuCisgCQlBQ19NU0dfRVJST1IoY2Fubm90IGRldGVybWluZSBsaW51eCB2ZXJzaW9uIHdoZW4gY3Jvc3MtY29tcGlsaW5nKQorIAlmaQorCWlmIHRlc3QgJGFjX2N2X2xpbnV4X3ZlcnMgLWx0IDIgOyB0aGVuCisJCUFDX01TR19FUlJPUih2ZXJzaW9uIDIgb3IgaGlnaGVyIHJlcXVpcmVkOyBzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCisJZmkKKwk7OworCisqKQorCTs7Citlc2FjCisKKworQUNfQ0hFQ0tfSEVBREVSUyhzbWkuaCkKK0FDX0NIRUNLX0xJQihzbWksIHNtaUluaXQpCitpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3NtaV9oIiA9IHllcyAtYSAiJGFjX2N2X2xpYl9zbWlfc21pSW5pdCIgPSB5ZXMKK3RoZW4KK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbGlic21pXSkKKyAgICAgICAgQUNfVFJZX1JVTihbIC8qIGxpYnNtaSBhdmFpbGFibGUgY2hlY2sgKi8KKyNpbmNsdWRlIDxzbWkuaD4KK21haW4oKQoreworICBpbnQgY3VycmVudCwgcmV2aXNpb24sIGFnZSwgbjsKKyAgY29uc3QgaW50IHJlcXVpcmVkID0gMjsKKyAgaWYgKHNtaUluaXQoIiIpKSAKKyAgICBleGl0KDEpOworICBpZiAoc3RyY21wKFNNSV9MSUJSQVJZX1ZFUlNJT04sIHNtaV9saWJyYXJ5X3ZlcnNpb24pKQorICAgIGV4aXQoMik7CisgIG4gPSBzc2NhbmYoc21pX2xpYnJhcnlfdmVyc2lvbiwgIiVkOiVkOiVkIiwgJmN1cnJlbnQsICZyZXZpc2lvbiwgJmFnZSk7CisgIGlmIChuICE9IDMpCisgICAgZXhpdCgzKTsKKyAgaWYgKHJlcXVpcmVkIDwgY3VycmVudCAtIGFnZSB8fCByZXF1aXJlZCA+IGN1cnJlbnQpCisgICAgZXhpdCg0KTsKKyAgZXhpdCgwKTsKK30KK10sCitbIEFDX01TR19SRVNVTFQoeWVzKQorICBBQ19ERUZJTkUoTElCU01JKQorICBsaWJzbWk9eWVzXSwKK2RubCBhdXRvY29uZiBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCAkPyBjb250YWlucyB0aGUgZXhpdCB2YWx1ZS4KK2RubCByZWFsaXR5IGlzIHRoYXQgaXQgZG9lcyBub3QuICBXZSBsZWF2ZSB0aGlzIGluIGp1c3QgaW4gY2FzZQorZG5sIGF1dG9jb25mIGV2ZXIgY29tZXMgYmFjayB0byBtYXRjaCB0aGUgZG9jdW1lbnRhdGlvbi4KK1sgY2FzZSAkPyBpbgorICAxKSBBQ19NU0dfUkVTVUxUKG5vIC0gc21pSW5pdCBmYWlsZWQpIDs7CisgIDIpIEFDX01TR19SRVNVTFQobm8gLSBoZWFkZXIvbGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoKSA7OworICAzKSBBQ19NU0dfUkVTVUxUKG5vIC0gY2FuJ3QgZGV0ZXJtaW5lIGxpYnJhcnkgdmVyc2lvbikgOzsKKyAgNCkgQUNfTVNHX1JFU1VMVChubyAtIHRvbyBvbGQpIDs7CisgICopIEFDX01TR19SRVNVTFQobm8pIDs7CisgIGVzYWMKKyAgbGlic21pPW5vXSwKK1sgQUNfTVNHX1JFU1VMVChub3Qgd2hlbiBjcm9zcy1jb21waWxpbmcpCisgIGxpYnNtaT1ub10KKykKK2ZpCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgdGhlIHBvc3NpYmx5LWJ1Z2d5IFNNQiBwcmludGVyXSkKK0FDX0FSR19FTkFCTEUoc21iLAorWyAgLS1lbmFibGUtc21iICAgICAgICAgICAgZW5hYmxlIHBvc3NpYmx5LWJ1Z2d5IFNNQiBwcmludGVyIFtkZWZhdWx0PXllc10KKyAgLS1kaXNhYmxlLXNtYiAgICAgICAgICAgZGlzYWJsZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlcl0sLAorICAgZW5hYmxldmFsPXllcykKK2Nhc2UgIiRlbmFibGV2YWwiIGluCit5ZXMpCUFDX01TR19SRVNVTFQoeWVzKQorCUFDX1dBUk4oW1RoZSBTTUIgcHJpbnRlciBtYXkgaGF2ZSBleHBsb2l0YWJsZSBidWZmZXIgb3ZlcmZsb3dzISEhXSkKKwlBQ19ERUZJTkUoVENQRFVNUF9ET19TTUIpCisJTE9DQUxTUkM9InByaW50LXNtYi5jIHNtYnV0aWwuYyAkTE9DQUxTUkMiCisJOzsKKyopCUFDX01TR19SRVNVTFQobm8pCisJOzsKK2VzYWMKKworQUNfQVJHX1dJVEgodXNlciwgWyAgLS13aXRoLXVzZXI9VVNFUk5BTUUgICAgZHJvcCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQgdG8gVVNFUk5BTUVdKQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHRdKQoraWYgdGVzdCAhIC16ICIkd2l0aF91c2VyIiA7IHRoZW4KKyAgICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKFdJVEhfVVNFUiwgIiR3aXRodmFsIikKKyAgICAgICBBQ19NU0dfUkVTVUxUKHRvIFwiJHdpdGh2YWxcIikKK2Vsc2UKKyAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworQUNfQVJHX1dJVEgoY2hyb290LCBbICAtLXdpdGgtY2hyb290PURJUkVDVE9SWSB3aGVuIGRyb3BwaW5nIHByaXZpbGVnZXMsIGNocm9vdCB0byBESVJFQ1RPUlldKQorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGNocm9vdF0pCitpZiB0ZXN0ICEgLXogIiR3aXRoX2Nocm9vdCIgOyB0aGVuCisgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChXSVRIX0NIUk9PVCwgIiR3aXRodmFsIikKKyAgICAgICBBQ19NU0dfUkVTVUxUKHRvIFwiJHdpdGh2YWxcIikKK2Vsc2UKKyAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBpcHY2XSkKK0FDX0FSR19FTkFCTEUoaXB2NiwKK1sgIC0tZW5hYmxlLWlwdjYgICAgICAgICAgIGVuYWJsZSBpcHY2ICh3aXRoIGlwdjQpIHN1cHBvcnQKKyAgLS1kaXNhYmxlLWlwdjYgICAgICAgICAgZGlzYWJsZSBpcHY2IHN1cHBvcnRdLAorWyBjYXNlICIkZW5hYmxldmFsIiBpbgoreWVzKSAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgIExPQ0FMU1JDPSJwcmludC1pcDYuYyBwcmludC1pcDZvcHRzLmMgcHJpbnQtbW9iaWxpdHkuYyBwcmludC1yaXBuZy5jIHByaW50LWljbXA2LmMgcHJpbnQtZnJhZzYuYyBwcmludC1ydDYuYyBwcmludC1vc3BmNi5jIHByaW50LWRoY3A2LmMgJExPQ0FMU1JDIgorICAgICAgIEFDX0RFRklORShJTkVUNikKKyAgICAgICBpcHY2PXllcworICAgICAgIDs7CisqKQorICAgICAgIEFDX01TR19SRVNVTFQobm8pCisgICAgICAgaXB2Nj1ubworICAgICAgIDs7CisgIGVzYWMgXSwKKworICBBQ19UUllfUlVOKFsgLyogQUZfSU5FVDYgYXZhaWxhYmxlIGNoZWNrICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorbWFpbigpCit7CisgaWYgKHNvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApIDwgMCkKKyAgIGV4aXQoMSk7CisgZWxzZQorICAgZXhpdCgwKTsKK30KK10sCitbIEFDX01TR19SRVNVTFQoeWVzKQorICBMT0NBTFNSQz0icHJpbnQtaXA2LmMgcHJpbnQtaXA2b3B0cy5jIHByaW50LW1vYmlsaXR5LmMgcHJpbnQtcmlwbmcuYyBwcmludC1pY21wNi5jIHByaW50LWZyYWc2LmMgcHJpbnQtcnQ2LmMgcHJpbnQtb3NwZjYuYyBwcmludC1kaGNwNi5jICRMT0NBTFNSQyIKKyAgQUNfREVGSU5FKElORVQ2KQorICBpcHY2PXllc10sCitbIEFDX01TR19SRVNVTFQobm8pCisgIGlwdjY9bm9dLAorWyBBQ19NU0dfUkVTVUxUKG5vKQorICBpcHY2PW5vXQorKSkKKworaXB2NnR5cGU9dW5rbm93bgoraXB2NmxpYj1ub25lCitpcHY2dHJ5bGliYz1ubworCitpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIjsgdGhlbgorCUFDX01TR19DSEVDS0lORyhbaXB2NiBzdGFjayB0eXBlXSkKKwlmb3IgaSBpbiBpbnJpYSBrYW1lIGxpbnV4LWdsaWJjIGxpbnV4LWxpYmluZXQ2IHRvc2hpYmEgdjZkIHpldGE7IGRvCisJCWNhc2UgJGkgaW4KKwkJaW5yaWEpCisJCQlkbmwgaHR0cDovL3d3dy5rYW1lLm5ldC8KKwkJCUFDX0VHUkVQX0NQUCh5ZXMsCitbI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpZmRlZiBJUFY2X0lOUklBX1ZFUlNJT04KK3llcworI2VuZGlmXSwKKwkJCQlbaXB2NnR5cGU9JGk7CisJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiXSkKKwkJCTs7CisJCWthbWUpCisJCQlkbmwgaHR0cDovL3d3dy5rYW1lLm5ldC8KKwkJCUFDX0VHUkVQX0NQUCh5ZXMsCitbI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpZmRlZiBfX0tBTUVfXworeWVzCisjZW5kaWZdLAorCQkJCVtpcHY2dHlwZT0kaTsKKwkJCQlpcHY2bGliPWluZXQ2OworCQkJCWlwdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7CisJCQkJaXB2NnRyeWxpYmM9eWVzOworCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIl0pCisJCQk7OworCQlsaW51eC1nbGliYykKKwkJCWRubCBodHRwOi8vd3d3LnY2LmxpbnV4Lm9yLmpwLworCQkJQUNfRUdSRVBfQ1BQKHllcywKK1sjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID49IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEKK3llcworI2VuZGlmXSwKKwkJCQlbaXB2NnR5cGU9JGk7CisJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiXSkKKwkJCTs7CisJCWxpbnV4LWxpYmluZXQ2KQorCQkJZG5sIGh0dHA6Ly93d3cudjYubGludXgub3IuanAvCisJCQlkbmwKKwkJCWRubCBUaGlzIGFsc28gbWF0Y2hlcyBTb2xhcmlzIDggYW5kIFRydTY0IFVOSVggNS4xLAorCQkJZG5sIGFuZCBwb3NzaWJseSBvdGhlciB2ZXJzaW9ucyBvZiB0aG9zZSBPU2VzCisJCQlkbmwKKwkJCWlmIHRlc3QgLWQgL3Vzci9pbmV0NiAtbyAtZiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcDYuaDsgdGhlbgorCQkJCWlwdjZ0eXBlPSRpCisJCQkJaXB2NmxpYj1pbmV0NgorCQkJCWlwdjZsaWJkaXI9L3Vzci9pbmV0Ni9saWIKKwkJCQlpcHY2dHJ5bGliYz15ZXM7CisJCQkJQ0ZMQUdTPSItRElORVQ2IC1JL3Vzci9pbmV0Ni9pbmNsdWRlICRDRkxBR1MiCisJCQlmaQorCQkJOzsKKwkJdG9zaGliYSkKKwkJCUFDX0VHUkVQX0NQUCh5ZXMsCitbI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIF9UT1NISUJBX0lORVQ2Cit5ZXMKKyNlbmRpZl0sCisJCQkJW2lwdjZ0eXBlPSRpOworCQkJCWlwdjZsaWI9aW5ldDY7CisJCQkJaXB2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKKwkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyJdKQorCQkJOzsKKwkJdjZkKQorCQkJQUNfRUdSRVBfQ1BQKHllcywKK1sjaW5jbHVkZSA8L3Vzci9sb2NhbC92Ni9pbmNsdWRlL3N5cy92NmNvbmZpZy5oPgorI2lmZGVmIF9fVjZEX18KK3llcworI2VuZGlmXSwKKwkJCQlbaXB2NnR5cGU9JGk7CisJCQkJaXB2NmxpYj12NjsKKwkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOworCQkJCUNGTEFHUz0iLUkvdXNyL2xvY2FsL3Y2L2luY2x1ZGUgJENGTEFHUyJdKQorCQkJOzsKKwkJemV0YSkKKwkJCUFDX0VHUkVQX0NQUCh5ZXMsCitbI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmZGVmIF9aRVRBX01JTkFNSV9JTkVUNgoreWVzCisjZW5kaWZdLAorCQkJCVtpcHY2dHlwZT0kaTsKKwkJCQlpcHY2bGliPWluZXQ2OworCQkJCWlwdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7CisJCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiXSkKKwkJCTs7CisJCWVzYWMKKwkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAidW5rbm93biI7IHRoZW4KKwkJCWJyZWFrCisJCWZpCisJZG9uZQorCUFDX01TR19SRVNVTFQoJGlwdjZ0eXBlKQorZmkKKworaWYgdGVzdCAiJGlwdjYiID0gInllcyIgLWEgIiRpcHY2bGliIiAhPSAibm9uZSI7IHRoZW4KKwlpZiB0ZXN0IC1kICRpcHY2bGliZGlyIC1hIC1mICRpcHY2bGliZGlyL2xpYiRpcHY2bGliLmE7IHRoZW4KKwkJTElCUz0iLUwkaXB2NmxpYmRpciAtbCRpcHY2bGliICRMSUJTIgorCQllY2hvICJZb3UgaGF2ZSAkaXB2NmxpYiBsaWJyYXJ5LCB1c2luZyBpdCIKKwllbHNlCisJCWlmIHRlc3QgIiRpcHY2dHJ5bGliYyIgPSAieWVzIjsgdGhlbgorCQkJZWNobyAiWW91IGRvIG5vdCBoYXZlICRpcHY2bGliIGxpYnJhcnksIHVzaW5nIGxpYmMiCisJCWVsc2UKKwkJCWVjaG8gJ0ZhdGFsOiBubyAkaXB2NmxpYiBsaWJyYXJ5IGZvdW5kLiAgY2Fubm90IGNvbnRpbnVlLicKKwkJCWVjaG8gIllvdSBuZWVkIHRvIGZldGNoIGxpYiRpcHY2bGliLmEgZnJvbSBhcHByb3ByaWF0ZSIKKwkJCWVjaG8gJ2lwdjYga2l0IGFuZCBjb21waWxlIGJlZm9yZWhhbmQuJworCQkJZXhpdCAxCisJCWZpCisJZmkKK2ZpCisKKworaWYgdGVzdCAiJGlwdjYiID0gInllcyI7IHRoZW4KKwkjCisJIyBYWFggLSBvbiBUcnU2NCBVTklYIDUuMSwgdGhlcmUgaXMgbm8gImdldGFkZHJpbmZvKCkiCisJIyBmdW5jdGlvbiBpbiBsaWJjOyB0aGVyZSBhcmUgIm5nZXRhZGRyaW5mbygpIiBhbmQKKwkjICJvZ2V0YWRkcmluZm8oKSIgZnVuY3Rpb25zLCBhbmQgPG5ldGRiLmg+ICNkZWZpbmVzCisJIyAiZ2V0YWRkcmluZm8iIHRvIGJlIGVpdGhlciAibmdldGFkZHJpbmZvIiBvcgorCSMgIm9nZXRhZGRyaW5mbyIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIF9TT0NLQUREUl9MRU4KKwkjIG9yIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgYXJlIGRlZmluZWQgb3Igbm90LgorCSMKKwkjIFNvIHRoaXMgdGVzdCBkb2Vzbid0IHdvcmsgb24gVHJ1NjQgNS4xLCBhbmQgcG9zc2libHkKKwkjIG9uIG90aGVyIDUueCByZWxlYXNlcy4gIFRoaXMgY2F1c2VzIHRoZSBjb25maWd1cmUKKwkjIHNjcmlwdCB0byBiZWNvbWUgY29uZnVzZWQsIGFuZCByZXN1bHRzIGluIGxpYnBjYXAKKwkjIGJlaW5nIHVuYnVpbGRhYmxlLgorCSMKKwlBQ19TRUFSQ0hfTElCUyhnZXRhZGRyaW5mbywgc29ja2V0LCBbZG5sCisJQUNfTVNHX0NIRUNLSU5HKGdldGFkZHJpbmZvIGJ1ZykKKwlBQ19DQUNIRV9WQUwodGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbywgW0FDX1RSWV9SVU4oWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworbWFpbigpCit7CisgIGludCBwYXNzaXZlLCBnYWllcnIsIGluZXQ0ID0gMCwgaW5ldDYgPSAwOworICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaSwgKmFpdG9wOworICBjaGFyIHN0cmFkZHJbSU5FVDZfQUREUlNUUkxFTl0sIHN0cnBvcnRbMTZdOworCisgIGZvciAocGFzc2l2ZSA9IDA7IHBhc3NpdmUgPD0gMTsgcGFzc2l2ZSsrKSB7CisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICAgIGhpbnRzLmFpX2ZsYWdzID0gcGFzc2l2ZSA/IEFJX1BBU1NJVkUgOiAwOworICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgICAgaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgICBpZiAoKGdhaWVyciA9IGdldGFkZHJpbmZvKE5VTEwsICI1NDMyMSIsICZoaW50cywgJmFpdG9wKSkgIT0gMCkgeworICAgICAgKHZvaWQpZ2FpX3N0cmVycm9yKGdhaWVycik7CisgICAgICBnb3RvIGJhZDsKKyAgICB9CisgICAgZm9yIChhaSA9IGFpdG9wOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworICAgICAgaWYgKGFpLT5haV9hZGRyID09IE5VTEwgfHwKKyAgICAgICAgICBhaS0+YWlfYWRkcmxlbiA9PSAwIHx8CisgICAgICAgICAgZ2V0bmFtZWluZm8oYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmFkZHIsIHNpemVvZihzdHJhZGRyKSwgc3RycG9ydCwgc2l6ZW9mKHN0cnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKSAhPSAwKSB7CisgICAgICAgIGdvdG8gYmFkOworICAgICAgfQorICAgICAgc3dpdGNoIChhaS0+YWlfZmFtaWx5KSB7CisgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIGlmIChzdHJjbXAoc3RycG9ydCwgIjU0MzIxIikgIT0gMCkgeworICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgICAgIGlmIChwYXNzaXZlKSB7CisgICAgICAgICAgaWYgKHN0cmNtcChzdHJhZGRyLCAiMC4wLjAuMCIpICE9IDApIHsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICIxMjcuMC4wLjEiKSAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5ldDQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBpZiAoc3RyY21wKHN0cnBvcnQsICI1NDMyMSIpICE9IDApIHsKKyAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFzc2l2ZSkgeworICAgICAgICAgIGlmIChzdHJjbXAoc3RyYWRkciwgIjo6IikgIT0gMCkgeworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChzdHJjbXAoc3RyYWRkciwgIjo6MSIpICE9IDApIHsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbmV0NisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQUZfVU5TUEVDOgorICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgQUZfVU5JWAorICAgICAgY2FzZSBBRl9VTklYOgorI2Vsc2UKKyNpZmRlZiBBRl9MT0NBTAorICAgICAgY2FzZSBBRl9MT0NBTDoKKyNlbmRpZgorI2VuZGlmCisgICAgICBkZWZhdWx0OgorICAgICAgICAvKiBhbm90aGVyIGZhbWlseSBzdXBwb3J0PyAqLworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBzdXBwb3J0ZWQgZmFtaWx5IHNob3VsZCBiZSAyLCB1bnN1cHBvcnRlZCBmYW1pbHkgc2hvdWxkIGJlIDAgKi8KKyAgaWYgKCEoaW5ldDQgPT0gMCB8fCBpbmV0NCA9PSAyKSkKKyAgICBnb3RvIGJhZDsKKyAgaWYgKCEoaW5ldDYgPT0gMCB8fCBpbmV0NiA9PSAyKSkKKyAgICBnb3RvIGJhZDsKKworICBpZiAoYWl0b3ApCisgICAgZnJlZWFkZHJpbmZvKGFpdG9wKTsKKyAgZXhpdCgwKTsKKworIGJhZDoKKyAgaWYgKGFpdG9wKQorICAgIGZyZWVhZGRyaW5mbyhhaXRvcCk7CisgIGV4aXQoMSk7Cit9CitdLAorCXRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89bm8sCisJdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbz15ZXMsCisJdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbz15ZXMpXSkKKwlpZiB0ZXN0ICIkdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbyIgPSBubzsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKGdvb2QpCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKGJ1Z2d5KQorCWZpCisKKwlpZiB0ZXN0ICIkdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbyIgPSAieWVzIjsgdGhlbgorCQkjCisJCSMgWFhYIC0gaXQgZG9lc24ndCBhcHBlYXIgdGhhdCAiaXB2NnR5cGUiIGNhbiBldmVyIGJlCisJCSMgc2V0IHRvICJsaW51eCIuICBTaG91bGQgdGhpcyBiZSB0ZXN0aW5nIGZvcgorCQkjICJsaW51eC1nbGliYyIsIG9yIGZvciB0aGF0ICpvciogImxpbnV4LWxpYmluZXQ2Ij8KKwkJIyBJZiB0aGUgbGF0dGVyLCBub3RlIHRoYXQgImxpbnV4LWxpYmluZXQ2IiBpcyBhbHNvCisJCSMgdGhlIHR5cGUgZ2l2ZW4gdG8gc29tZSBub24tTGludXggT1Nlcy4KKwkJIworCQlpZiB0ZXN0ICIkaXB2NnR5cGUiICE9ICJsaW51eCI7IHRoZW4KKwkJCWVjaG8gJ0ZhdGFsOiBZb3UgbXVzdCBnZXQgd29ya2luZyBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLicKKwkJCWVjaG8gJyAgICAgICBvciB5b3UgY2FuIHNwZWNpZnkgIi0tZGlzYWJsZS1pcHY2IicuCisJCQlleGl0IDEKKwkJZWxzZQorCQkJZWNobyAnV2FybmluZzogZ2V0YWRkcmluZm8oKSBpbXBsZW1lbnRhdGlvbiBvbiB5b3VyIHN5c3RlbSBzZWVtcyBiZSBidWdneS4nCisJCQllY2hvICcgICAgICAgICBCZXR0ZXIgdXBncmFkZSB5b3VyIHN5c3RlbSBsaWJyYXJ5IHRvIG5ld2VzdCB2ZXJzaW9uJworCQkJZWNobyAnICAgICAgICAgb2YgR05VIEMgbGlicmFyeSAoYWthIGdsaWJjKS4nCisJCWZpCisJZmkKKwldKQorCUFDX1JFUExBQ0VfRlVOQ1MoZ2V0YWRkcmluZm8gZ2V0bmFtZWluZm8pCitmaQorCitBQ19DQUNIRV9DSEVDSyhbZm9yIGRuZXRfaHRvYSBkZWNsYXJhdGlvbiBpbiBuZXRkbmV0L2RuZXRkYi5oXSwKK1t0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hXSwKK1tBQ19FR1JFUF9IRUFERVIoZG5ldF9odG9hLCBuZXRkbmV0L2RuZXRkYi5oLAorCXRkX2N2X2RlY2xfbmV0ZG5ldF9kbmV0ZGJfaF9kbmV0X2h0b2E9eWVzLAorCXRkX2N2X2RlY2xfbmV0ZG5ldF9kbmV0ZGJfaF9kbmV0X2h0b2E9bm8pXSkKK2lmIHRlc3QgIiR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA9IHllczsgdGhlbgorCUFDX0RFRklORShIQVZFX05FVERORVRfRE5FVERCX0hfRE5FVF9IVE9BKQorZmkKKworZG5sCitkbmwgY2hlY2sgc2l6ZW9mIGJhc2ljIHR5cGVzLgorZG5sIFRoZXkncmUgdmVyeSBsaWtlbHkgdG8gYmUgd3JvbmcgZm9yIGNyb3NzLWNvbXBpbGluZy4KK0FDX0NIRUNLX1NJWkVPRihjaGFyLCAxKQorQUNfQ0hFQ0tfU0laRU9GKHNob3J0LCAyKQorQUNfQ0hFQ0tfU0laRU9GKGludCwgNCkKK0FDX0NIRUNLX1NJWkVPRihsb25nLCA0KQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcgbG9uZywgOCkKKworZG5sCitkbmwgQ2hlY2tzIGZvciB1X2ludFhYX3QKK2RubCBBQ19DSEVDS19CSVRUWVBFUyhhY19jdl9iaXR0eXBlcykKK2RubCBpZiB0ZXN0ICIkYWNfY3ZfYml0dHlwZXMiID0gbm87IHRoZW4KK2RubCAJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2RubCBmaQorCitkbmwKK2RubCBDaGVja3MgZm9yIGFkZHJpbmZvIHN0cnVjdHVyZQorQUNfU1RSVUNUX0FERFJJTkZPKGFjX2N2X2FkZHJpbmZvKQoraWYgdGVzdCAiJGFjX2N2X2FkZHJpbmZvIiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKK2RubAorZG5sIENoZWNrcyBmb3IgTklfTUFYU0VSVgorQUNfTklfTUFYU0VSVihhY19jdl9tYXhzZXJ2KQoraWYgdGVzdCAiJGFjX2N2X21heHNlcnYiID0gbm87IHRoZW4KKwltaXNzaW5nX2luY2x1ZGVzPXllcworZmkKKworZG5sCitkbmwgQ2hlY2tzIGZvciBOSV9OQU1FUkVRRAorQUNfTklfTkFNRVJFUUQoYWNfY3ZfbmFtZXJlcWQpCitpZiB0ZXN0ICIkYWNfY3ZfbmFtZXJlcWQiID0gbm87IHRoZW4KKwltaXNzaW5nX2luY2x1ZGVzPXllcworZmkKKworZG5sCitkbmwgQ2hlY2tzIGZvciBzb2NrYWRkcl9zdG9yYWdlIHN0cnVjdHVyZQorQUNfU1RSVUNUX1NBX1NUT1JBR0UoYWNfY3Zfc2Ffc3RvcmFnZSkKK2lmIHRlc3QgIiRhY19jdl9zYV9zdG9yYWdlIiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKK2RubAorZG5sIENoZWNrcyBmb3IgSU5bNl1BRERSU1oKK0FDX0NIRUNLX0FERFJTWihhY19jdl9hZGRyc3opCitpZiB0ZXN0ICIkYWNfY3ZfYWRkcnN6IiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKK2RubAorZG5sIENoZWNrcyBmb3IgUkVTX1VTRV9JTkVUNgorQUNfQ0hFQ0tfUkVTX1VTRV9JTkVUNihhY19jdl9yZXNfaW5ldDYpCitpZiB0ZXN0ICIkYWNfY3ZfcmVzX2luZXQ2IiA9IG5vOyB0aGVuCisJbWlzc2luZ19pbmNsdWRlcz15ZXMKK2ZpCisKK2RubAorZG5sIENoZWNrcyBmb3IgcmVzX3N0YXRlX2V4dCBzdHJ1Y3R1cmUKK0FDX1NUUlVDVF9SRVNfU1RBVEVfRVhUKGFjX2N2X3Jlc19zdGF0ZV9leHQpCitpZiB0ZXN0ICIkYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPSBubzsgdGhlbgorCW1pc3NpbmdfaW5jbHVkZXM9eWVzCitmaQorCitkbmwKK2RubCBDaGVja3MgaWYgcmVzX3N0YXRlIHN0cnVjdHVyZSBoYXMgbnNvcnQgbWVtYmVyLgorQUNfU1RSVUNUX1JFU19TVEFURShhY19jdl9yZXNfc3RhdGUpCisKKworQUNfUkVQTEFDRV9GVU5DUyh2ZnByaW50ZiBzdHJjYXNlY21wIHN0cmxjYXQgc3RybGNweSBzdHJkdXAgc3Ryc2VwKQorQUNfQ0hFQ0tfRlVOQ1Moc3RyZnRpbWUpCitBQ19DSEVDS19GVU5DUyhzZXRsaW5lYnVmIGFsYXJtKQorCituZWVkc25wcmludGY9bm8KK0FDX0NIRUNLX0ZVTkNTKHZzbnByaW50ZiBzbnByaW50ZiwsCisJW25lZWRzbnByaW50Zj15ZXNdKQoraWYgdGVzdCAkbmVlZHNucHJpbnRmID0geWVzOyB0aGVuCisJQUNfTElCT0JKKHNucHJpbnRmKQorZmkKKworQUNfTEJMX1RZUEVfU0lHTkFMCisKK0FDX1NFQVJDSF9MSUJTKGRuZXRfaHRvYSwgZG5ldCwgQUNfREVGSU5FKEhBVkVfRE5FVF9IVE9BKSkKKworQUNfQ0hFQ0tfTElCKHJwYywgbWFpbikJCWRubCBJdCdzIHVuY2xlYXIgd2h5IHdlIG1pZ2h0IG5lZWQgLWxycGMKKworZG5sIFNvbWUgcGxhdGZvcm1zIG1heSBuZWVkIC1sbnNsIGZvciBnZXRycGNieW51bWJlci4KK0FDX1NFQVJDSF9MSUJTKGdldHJwY2J5bnVtYmVyLCBuc2wsIEFDX0RFRklORShIQVZFX0dFVFJQQ0JZTlVNQkVSKSkKKworZG5sIEFDX0NIRUNLX0xJQih6LCB1bmNvbXByZXNzKQorZG5sIEFDX0NIRUNLX0hFQURFUlMoemxpYi5oKQorCitBQ19MQkxfTElCUENBUChWX1BDQVBERVAsIFZfSU5DTFMpCisKKyMKKyMgQ2hlY2sgZm9yIHRoZXNlIGFmdGVyIEFDX0xCTF9MSUJQQ0FQLCBzbyB3ZSBsaW5rIHdpdGggdGhlIGFwcHJvcHJpYXRlCisjIGxpYnJhcmllcyAoZS5nLiwgIi1sc29ja2V0IC1sbnNsIiBvbiBTb2xhcmlzKS4KKyMKKyMgV2UgZG9uJ3QgdXNlIEFDX1JFUExBQ0VfRlVOQ1MgYmVjYXVzZSB0aGF0IHVzZXMgQUNfQ0hFQ0tfRlVOQ1Mgd2hpY2gKKyMgdXNlIEFDX0NIRUNLX0ZVTkMgd2hpY2ggZG9lc24ndCBsZXQgdXMgc3BlY2lmeSB0aGUgcmlnaHQgI2luY2x1ZGVzCisjIHRvIG1ha2UgdGhpcyB3b3JrIG9uIEJTRC9PUyA0LnguICBCU0QvT1MgNC54IHNoaXBzIHdpdGggdGhlIEJJTkQ4CisjIHJlc29sdmVyLCBhbmQgdGhlIHdheSBpdCBkZWZpbmVzIGluZXRfe250b3AscHRvbn0gaXMgcmF0aGVyIHN0cmFuZ2U7CisjIGl0IGRvZXMgbm90IHNoaXAgd2l0aCBhIGxpYmMgc3ltYm9sICJpbmV0X250b3AoKSIsIGl0IHNoaXBzIHdpdGgKKyMgIl9pbmV0X250b3AoKSIsIGFuZCBoYXMgYSAjZGVmaW5lIG1hY3JvIGluIG9uZSBvZiB0aGUgc3lzdGVtIGhlYWRlcnMKKyMgdG8gcmVuYW1lIGl0LgorIworZG5sIEFDX1RSWV9DT01QSUxFKGluZXRfbnRvcCBpbmV0X3B0b24gaW5ldF9hdG9uKQorQUNfTVNHX0NIRUNLSU5HKGZvciBpbmV0X250b3ApCitBQ19UUllfTElOSyhbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+XSwgW2NoYXIgc3JjWzRdLCBkc3RbMTI4XTsKK2luZXRfbnRvcChBRl9JTkVULCBzcmMsIGRzdCwgc2l6ZW9mKGRzdCkpO10sCisJW0FDX01TR19SRVNVTFQoeWVzKV0sIFtBQ19NU0dfUkVTVUxUKG5vKQorCUFDX0xJQk9CSihpbmV0X250b3ApXSkKK0FDX01TR19DSEVDS0lORyhmb3IgaW5ldF9wdG9uKQorQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPl0sIFtjaGFyIHNyY1sxMjhdLCBkc3RbNF07CitpbmV0X3B0b24oQUZfSU5FVCwgc3JjLCBkc3QpO10sCisJW0FDX01TR19SRVNVTFQoeWVzKV0sIFtBQ19NU0dfUkVTVUxUKG5vKQorCUFDX0xJQk9CSihpbmV0X3B0b24pXSkKK0FDX01TR19DSEVDS0lORyhmb3IgaW5ldF9hdG9uKQorQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+XSwgW2NoYXIgc3JjWzEyOF07CitzdHJ1Y3QgaW5fYWRkciBkc3Q7CitpbmV0X2F0b24oc3JjLCAmZHN0KTtdLAorCVtBQ19NU0dfUkVTVUxUKHllcyldLCBbQUNfTVNHX1JFU1VMVChubykKKwlBQ19MSUJPQkooaW5ldF9hdG9uKV0pCisKKyMKKyMgQ2hlY2sgZm9yIHRoZXNlIGFmdGVyIEFDX0xCTF9MSUJQQ0FQLCBmb3IgdGhlIHNhbWUgcmVhc29uLgorIworIyBZb3UgYXJlIGluIGEgdHdpc3R5IGxpdHRsZSBtYXplIG9mIFVOKlhlcywgYWxsIGRpZmZlcmVudC4KKyMgU29tZSBtaWdodCBub3QgaGF2ZSBldGhlcl9udG9ob3N0KCkuCisjIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IG5vdCBkZWNsYXJlIGl0IGluIGFueSBoZWFkZXIgZmlsZS4KKyMgU29tZSBtaWdodCBoYXZlIGl0LCBidXQgZGVjbGFyZSBpdCBpbiA8bmV0aW5ldC9pZl9ldGhlci5oPi4KKyMgU29tZSBtaWdodCBoYXZlIGl0LCBidXQgZGVjbGFyZSBpdCBpbiA8bmV0aW5ldC9ldGhlci5oPgorIyAoQW5kIHNvbWUgbWlnaHQgaGF2ZSBpdCBidXQgZG9jdW1lbnQgaXQgYXMgc29tZXRoaW5nIGRlY2xhcmVkIGluCisjIDxuZXRpbmV0L2V0aGVybmV0Lmg+LCBhbHRob3VnaCA8bmV0aW5ldC9pZl9ldGhlci5oPiBhcHBlYXJzIHRvIHdvcmsuKQorIworIyBCZWZvcmUgeW91IGlzIGEgQyBjb21waWxlci4KKyMKK0FDX0NIRUNLX0ZVTkNTKGV0aGVyX250b2hvc3QsIFsKKyAgICBBQ19DQUNIRV9DSEVDSyhmb3IgYnVnZ3kgZXRoZXJfbnRvaG9zdCwgYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdCwgWworCUFDX1RSWV9SVU4oWworCQkjaW5jbHVkZSA8bmV0ZGIuaD4KKwkJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJCSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKwkJaW50CisJCW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCQl7CisJCQl1X2NoYXIgZWFbNl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwkJCWNoYXIgbmFtZVtNQVhIT1NUTkFNRUxFTl07CisKKwkJCWV0aGVyX250b2hvc3QobmFtZSwgKHN0cnVjdCBldGhlcl9hZGRyICopZWEpOworCQkJZXhpdCgwKTsKKwkJfQorCV0sIFthY19jdl9idWdneV9ldGhlcl9udG9ob3N0PW5vXSwKKwkgICBbYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdD15ZXNdLAorCSAgIFthY19jdl9idWdneV9ldGhlcl9udG9ob3N0PSJub3Qgd2hpbGUgY3Jvc3MtY29tcGlsaW5nIl0pXSkKKyAgICBpZiB0ZXN0ICIkYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdCIgPSAibm8iOyB0aGVuCisJQUNfREVGSU5FKFVTRV9FVEhFUl9OVE9IT1NUKQorICAgIGZpCitdKQoraWYgdGVzdCAiJGFjX2N2X2Z1bmNfZXRoZXJfbnRvaG9zdCIgPSB5ZXMgLWEgXAorICAgICIkYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdCIgPSAibm8iOyB0aGVuCisJIworCSMgT0ssIHdlIGhhdmUgZXRoZXJfbnRvaG9zdCgpLiAgRG8gd2UgaGF2ZSA8bmV0aW5ldC9pZl9ldGhlci5oPj8KKwkjCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2giID0geWVzOyB0aGVuCisJCSMKKwkJIyBZZXMuICBEb2VzIGl0IGRlY2xhcmUgZXRoZXJfbnRvaG9zdCgpPworCQkjCisJCUFDX0NIRUNLX0RFQ0woZXRoZXJfbnRvaG9zdCwKKwkJICAgIFsKKwkJCUFDX0RFRklORShORVRJTkVUX0lGX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfTlRPSE9TVCwsCisJCQkgICAgW0RlZmluZSB0byAxIGlmIG5ldGluZXQvaWZfZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfbnRvaG9zdCddKQorCQkgICAgXSwsCisJCSAgICBbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KK3N0cnVjdCBtYnVmOworc3RydWN0IHJ0ZW50cnk7CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCQkgICAgXSkKKwlmaQorCSMKKwkjIERpZCB0aGF0IHN1Y2NlZWQ/CisJIworCWlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCIgIT0geWVzOyB0aGVuCisJCSMKKwkJIyBObywgaG93IGFib3V0IDxuZXRpbmV0L2V0aGVyLmg+LCBhcyBvbiBMaW51eD8KKwkJIworCQlBQ19DSEVDS19IRUFERVJTKG5ldGluZXQvZXRoZXIuaCkKKwkJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRpbmV0X2V0aGVyX2giID0geWVzOyB0aGVuCisJCQkjCisJCQkjIFdlIGhhdmUgaXQgLSBkb2VzIGl0IGRlY2xhcmUgZXRoZXJfbnRvaG9zdCgpPworCQkJIyBVbnNldCBhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCBzbyB3ZSBkb24ndAorCQkJIyB0cmVhdCB0aGUgcHJldmlvdXMgZmFpbHVyZSBhcyBhIGNhY2hlZCB2YWx1ZSBhbmQKKwkJCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KKwkJCSMKKwkJCXVuc2V0IGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0CisJCQlBQ19DSEVDS19ERUNMKGV0aGVyX250b2hvc3QsCisJCQkgICAgWworCQkJCUFDX0RFRklORShORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfTlRPSE9TVCwsCisJCQkJICAgIFtEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX250b2hvc3QnXSkKKwkJCSAgICBdLCwKKwkJCSAgICBbCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorCQkJICAgIF0pCisJCWZpCisJZmkKKwkjCisJIyBJcyBldGhlcl9udG9ob3N0KCkgZGVjbGFyZWQ/CisJIworCWlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCIgIT0geWVzOyB0aGVuCisJCSMKKwkJIyBObywgd2UnbGwgaGF2ZSB0byBkZWNsYXJlIGl0IG91cnNlbHZlcy4KKwkJIyBEbyB3ZSBoYXZlICJzdHJ1Y3QgZXRoZXJfYWRkciI/CisJCSMKKwkJQUNfQ0hFQ0tfVFlQRVMoc3RydWN0IGV0aGVyX2FkZHIsLCwKKwkJICAgIFsKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorc3RydWN0IG1idWY7CitzdHJ1Y3QgcnRlbnRyeTsKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisJCSAgICBdKQorCQlBQ19ERUZJTkUoSEFWRV9ERUNMX0VUSEVSX05UT0hPU1QsIDAsCisJCSAgICBbRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBldGhlcl9udG9ob3N0JywgYW5kIHRvIDAgaWYgeW91Citkb24ndC5dKQorCWVsc2UKKwkJQUNfREVGSU5FKEhBVkVfREVDTF9FVEhFUl9OVE9IT1NULCAxLAorCQkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfbnRvaG9zdCcsIGFuZCB0byAwIGlmIHlvdQorZG9uJ3QuXSkKKwlmaQorZmkKKworZG5sIHBvcnRhYmlsaXR5IG1hY3JvcyBmb3IgZ2V0YWRkcmluZm8vZ2V0bmFtZWluZm8KK2RubAorZG5sIENoZWNrIGZvciBzYV9sZW4KK0FDX0NIRUNLX1NBX0xFTihhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuKQoraWYgdGVzdCAiJGFjX2N2X3NvY2thZGRyX2hhc19zYV9sZW4iID0gbm87IHRoZW4KKwltaXNzaW5nX2luY2x1ZGVzPXllcworZmkKKworQUNfQ0hFQ0tfRlVOQ1MocGNhcF9maW5kYWxsZGV2cyBwY2FwX2R1bXBfZmx1c2ggcGNhcF9saWJfdmVyc2lvbikKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9maW5kYWxsZGV2cyA9ICJ5ZXMiIDsgdGhlbgorZG5sIENoZWNrIGZvciBNYWMgT1MgWCwgd2hpY2ggbWF5IHNoaXAgcGNhcC5oIGZyb20gMC42IGJ1dCBsaWJwY2FwIG1heQorZG5sIGJlIDAuODsgdGhpcyBtZWFucyB0aGF0IGxpYiBoYXMgcGNhcF9maW5kYWxsZGV2cyBidXQgaGVhZGVyIGRvZXNuJ3QKK2RubCBoYXZlIHBjYXBfaWZfdC4KKyAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFZfSU5DTFMiCisgICAgQUNfQ0hFQ0tfVFlQRVMocGNhcF9pZl90LCAsICwgWyNpbmNsdWRlIDxwY2FwLmg+XSkKKyAgICBDRkxBR1M9IiRzYXZlZGNmbGFncyIKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9saWJfdmVyc2lvbiA9ICJubyIgOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgcGNhcF92ZXJzaW9uIGlzIGRlZmluZWQgYnkgbGlicGNhcCkKKyAgICBBQ19UUllfTElOSyhbXSwKKyAgICAgICBbCisJZXh0ZXJuIGNoYXIgcGNhcF92ZXJzaW9uW107CisKKwlyZXR1cm4gKGludClwY2FwX3ZlcnNpb247CisgICAgICAgXSwKKyAgICAgICBhY19sYmxfY3ZfcGNhcF92ZXJzaW9uX2RlZmluZWQ9eWVzLAorICAgICAgIGFjX2xibF9jdl9wY2FwX3ZlcnNpb25fZGVmaW5lZD1ubykKKyAgICBpZiB0ZXN0ICIkYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkIiA9IHllcyA7IHRoZW4KKyAgICAJQUNfTVNHX1JFU1VMVCh5ZXMpCisJQUNfREVGSU5FKEhBVkVfUENBUF9WRVJTSU9OKQorICAgIGVsc2UKKwlBQ19NU0dfUkVTVUxUKG5vKQorICAgIGZpCitmaQorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgcGNhcF9kZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXApCitBQ19UUllfTElOSyhbXSwKKyAgIFsKKwlleHRlcm4gaW50IHBjYXBfZGVidWc7CisKKwlyZXR1cm4gcGNhcF9kZWJ1ZzsKKyAgIF0sCisgICBhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkPXllcywKKyAgIGFjX2xibF9jdl9wY2FwX2RlYnVnX2RlZmluZWQ9bm8pCitpZiB0ZXN0ICIkYWNfbGJsX2N2X3BjYXBfZGVidWdfZGVmaW5lZCIgPSB5ZXMgOyB0aGVuCisJQUNfTVNHX1JFU1VMVCh5ZXMpCisJQUNfREVGSU5FKEhBVkVfUENBUF9ERUJVRykKK2Vsc2UKKwlBQ19NU0dfUkVTVUxUKG5vKQorCSMKKwkjIE9LLCB3aGF0IGFib3V0ICJ5eWRlYnVnIj8KKwkjCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgeXlkZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXApCisJQUNfVFJZX0xJTksoW10sCisJICAgWworCQlleHRlcm4gaW50IHl5ZGVidWc7CisKKwkJcmV0dXJuIHl5ZGVidWc7CisJICAgXSwKKwkgICBhY19sYmxfY3ZfeXlkZWJ1Z19kZWZpbmVkPXllcywKKwkgICBhY19sYmxfY3ZfeXlkZWJ1Z19kZWZpbmVkPW5vKQorCWlmIHRlc3QgIiRhY19sYmxfY3ZfeXlkZWJ1Z19kZWZpbmVkIiA9IHllcyA7IHRoZW4KKwkJQUNfTVNHX1JFU1VMVCh5ZXMpCisJCUFDX0RFRklORShIQVZFX1lZREVCVUcpCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCWZpCitmaQorQUNfUkVQTEFDRV9GVU5DUyhicGZfZHVtcCkJZG5sIG1vdmVkIHRvIGxpYnBjYXAgaW4gMC42CisKK1ZfR1JPVVA9MAoraWYgdGVzdCAtZiAvZXRjL2dyb3VwIC1hICEgLXogImBncmVwICded2hlZWw6JyAvZXRjL2dyb3VwYCIgOyB0aGVuCisJVl9HUk9VUD13aGVlbAorZmkKK2Nhc2UgIiRob3N0X29zIiBpbgorCithaXgqKQorCWRubCBXb3JrYXJvdW5kIHRvIGVuYWJsZSBjZXJ0YWluIGZlYXR1cmVzCisJQUNfREVGSU5FKF9TVU4pCisJOzsKKworaXJpeCopCisJVl9HUk9VUD1zeXMKKwk7OworCitvc2YqKQorCVZfR1JPVVA9c3lzdGVtCisJOzsKKworc29sYXJpcyopCisJVl9HUk9VUD1zeXMKKwk7OworZXNhYworCitpZiB0ZXN0IC1mIC9kZXYvYnBmMCA7IHRoZW4KKwlWX0dST1VQPWJwZgorZmkKKworQUNfQ0hFQ0tfSEVBREVSUyhzeXMvYml0eXBlcy5oKQorCitBQ19DSEVDS19UWVBFKFtpbnQ4X3RdLCAsCisJW0FDX0RFRklORShbaW50OF90XSwgW3NpZ25lZCBjaGFyXSwKKwlbRGVmaW5lIHRvIGBzaWduZWQgY2hhcicgaWYgaW50OF90IG5vdCBkZWZpbmVkLl0pXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50OF90XSwgLAorCVtBQ19ERUZJTkUoW3VfaW50OF90XSwgW3Vuc2lnbmVkIGNoYXJdLAorCVtEZWZpbmUgdG8gYHVuc2lnbmVkIGNoYXInIGlmIHVfaW50OF90IG5vdCBkZWZpbmVkLl0pXSwKKwlbQUNfSU5DTFVERVNfREVGQVVMVAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWZdKQorQUNfQ0hFQ0tfVFlQRShbaW50MTZfdF0sICwKKwlbQUNfREVGSU5FKFtpbnQxNl90XSwgW3Nob3J0XSwKKwlbRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC5dKV0pCitBQ19DSEVDS19UWVBFKFt1X2ludDE2X3RdLCAsCisJW0FDX0RFRklORShbdV9pbnQxNl90XSwgW3Vuc2lnbmVkIHNob3J0XSwKKwlbRGVmaW5lIHRvIGB1bnNpZ25lZCBzaG9ydCcgaWYgdV9pbnQxNl90IG5vdCBkZWZpbmVkLl0pXSwKKwlbQUNfSU5DTFVERVNfREVGQVVMVAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWZdKQorQUNfQ0hFQ0tfVFlQRShbaW50MzJfdF0sICwKKwlbQUNfREVGSU5FKFtpbnQzMl90XSwgW2ludF0sCisJW0RlZmluZSB0byBgaW50JyBpZiBpbnQzMl90IG5vdCBkZWZpbmVkLl0pXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50MzJfdF0sICwKKwlbQUNfREVGSU5FKFt1X2ludDMyX3RdLCBbdW5zaWduZWQgaW50XSwKKwlbRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIHVfaW50MzJfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW2ludDY0X3RdLCAsCisJW0FDX0RFRklORShbaW50NjRfdF0sIFtsb25nIGxvbmddLAorCVtEZWZpbmUgdG8gYGxvbmcgbG9uZycgaWYgaW50NjRfdCBub3QgZGVmaW5lZC5dKV0pCitBQ19DSEVDS19UWVBFKFt1X2ludDY0X3RdLCAsCisJW0FDX0RFRklORShbdV9pbnQ2NF90XSwgW3Vuc2lnbmVkIGxvbmcgbG9uZ10sCisJW0RlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuXSldLAorCVtBQ19JTkNMVURFU19ERUZBVUxUCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZl0pCisKKyMKKyMgV2UgY2FuJ3QganVzdCBjaGVjayBmb3IgPGludHR5cGVzLmg+IC0gc29tZSBzeXN0ZW1zIGhhdmUgb25lIHRoYXQKKyMgZG9lc24ndCBkZWZpbmUgYWxsIHRoZSBQUklbZG94dV02NCBtYWNyb3MuCisjCitBQ19DSEVDS19IRUFERVJTKGludHR5cGVzLmgsCisgIFsKKyAgICAjCisgICAgIyBPSywgd2UgaGF2ZSBpbnR0eXBlcy5oLCBidXQgZG9lcyBpdCBkZWZpbmUgdGhvc2UgbWFjcm9zPworICAgICMKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW1t3aGV0aGVyIGludHR5cGVzLmggZGVmaW5lcyB0aGUgUFJJW2RveHVdNjQgbWFjcm9zXV0pCisgICAgQUNfQ09NUElMRV9JRkVMU0UoCisgICAgICBbCisJQUNfTEFOR19TT1VSQ0UoCisJICBbWworCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisJICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkgICAgI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorCSAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKwkgICAgI2VuZGlmCisKKwkgICAgbWFpbigpCisJICAgIHsKKwkgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXG4iLCAodV9pbnQ2NF90KTEpOworCSAgICAgIHByaW50ZigiJSIgUFJJbzY0ICJcbiIsICh1X2ludDY0X3QpMSk7CisJICAgICAgcHJpbnRmKCIlIiBQUkl4NjQgIlxuIiwgKHVfaW50NjRfdCkxKTsKKwkgICAgICBwcmludGYoIiUiIFBSSXU2NCAiXG4iLCAodV9pbnQ2NF90KTEpOworCSAgICB9CisJICBdXSkKKyAgICAgIF0sCisgICAgICBbCisJQUNfTVNHX1JFU1VMVCh5ZXMpCisJYWNfbGJsX2ludHR5cGVzX2hfZGVmaW5lc19mb3JtYXRzPXllcworICAgICAgXSwKKyAgICAgIFsKKwlBQ19NU0dfUkVTVUxUKG5vKQorCWFjX2xibF9pbnR0eXBlc19oX2RlZmluZXNfZm9ybWF0cz1ubworICAgICAgXSkKKyAgXSwKKyAgWworICAgICMKKyAgICAjIFdlIGRvbid0IGhhdmUgaW50dHlwZXMuaCwgc28gaXQgb2J2aW91c2x5IGNhbid0IGRlZmluZSB0aG9zZQorICAgICMgbWFjcm9zLgorICAgICMKKyAgICBhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KKyAgXSkKK2lmIHRlc3QgIiRhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHMiID0gbm87IHRoZW4KKyAgQUNfTEJMX0NIRUNLXzY0QklUX0ZPUk1BVChsLAorICAgIFsKKyAgICAgIEFDX0xCTF9DSEVDS182NEJJVF9GT1JNQVQobGwsCisgICAgICAgIFsKKyAgICAgICAgICBBQ19MQkxfQ0hFQ0tfNjRCSVRfRk9STUFUKEwsCisJICAgIFsKKwkgICAgICBBQ19MQkxfQ0hFQ0tfNjRCSVRfRk9STUFUKHEsCisJICAgICAgICBbCisJICAgICAgICAgIEFDX01TR19FUlJPUihbbmVpdGhlciAlbGx4IG5vciAlTHggbm9yICVxeCB3b3JrZWQgb24gYSA2NC1iaXQgaW50ZWdlcl0pCisJICAgICAgICBdKQorCSAgICBdKQorCV0pCisgICAgXSkKK2ZpCisKK0FDX0xCTF9ERVZFTChWX0NDT1BUKQorCitBQ19MQkxfU09DS0FERFJfU0FfTEVOCisKK0FDX0xCTF9VTkFMSUdORURfQUNDRVNTCisKK0FDX1ZBUl9IX0VSUk5PCisKK0FDX0FSR19XSVRIKGNyeXB0bywgWyAgLS13aXRob3V0LWNyeXB0byAgICAgICAgZGlzYWJsZSBjcnlwdG8gc3VwcG9ydF0sCisJW10sIFsKK0FDX01TR19DSEVDS0lORyhmb3IgU1NMZWF5KQorYWNfY3Zfc3NsZWF5X3BhdGg9bm8KK2luY2Rpcj1ubworCisjCisjIElmIFhwcmVmaXggaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgdXNlIHRoYXQgdmFsdWUuCisjIFhYWCAtIHRoaXMgc2hvdWxkIGFyZ3VhYmx5IGJlIGRvbmUgYnkgaGF2aW5nIC0td2l0aC1jcnlwdG8gdGFrZSBhbgorIyBvcHRpb25hbCBhcmd1bWVudCwgYW5kIGhhdmUgdGhhdCBhcmd1bWVudCBiZSB1c2VkIHRvIHNldCBYcHJlZml4CisjIGlmIHByZXNlbnQuCisjCitpZiB0ZXN0IC16ICIkWHByZWZpeCI7IHRoZW4KKwlYcHJlZml4PWBldmFsIGVjaG8gJHByZWZpeGAKK2ZpCisKK2ZvciBkaXIgaW4gJFhwcmVmaXggL3Vzci8ke2hvc3RfYWxpYXN9IC91c3IgL3Vzci9sb2NhbCAvdXNyL2xvY2FsL3NzbCAvdXNyL3BrZzsgZG8KKwkjCisJIyBYWFggLSBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gY2hlY2sgaWYgYSBnaXZlbiBsaWJyYXJ5IGlzCisJIyBpbiBhIGdpdmVuIGRpcmVjdG9yeSB0aGFuIGNoZWNraW5nIGVhY2ggb2YgdGhlIHBvc3NpYmxlCisJIyBzaGFyZWQgbGlicmFyeSBzdWZmaXhlcz8KKwkjCisJIyBBcmUgdGhlcmUgYW55IG90aGVyIHN1ZmZpeGVzIHdlIG5lZWQgdG8gbG9vayBmb3I/ICBEbyB3ZSBoYXZlIHRvCisJIyB3b3JyeSBhYm91dCAiLnNvLnt2ZXJzaW9ufSI/CisJIworCSMgT3Igc2hvdWxkIHdlIGp1c3QgbG9vayBmb3IgImxpYmNyeXB0by4qIj8KKwkjCisJaWYgdGVzdCAtZCAkZGlyL2xpYiAtYSBcKCAtZiAkZGlyL2xpYi9saWJjcnlwdG8uYSAtbyBcCisJCQkgICAgICAgICAgLWYgJGRpci9saWIvbGliY3J5cHRvLnNvIC1vIFwKKwkJCSAgICAgICAgICAtZiAkZGlyL2xpYi9saWJjcnlwdG8uc2wgLW8gXAorCQkJCSAgLWYgJGRpci9saWIvbGliY3J5cHRvLmR5bGliIFwpOyB0aGVuCisJCWFjX2N2X3NzbGVheV9wYXRoPSRkaXIKKwlmaQorCWlmIHRlc3QgLWQgJGRpci9pbmNsdWRlL29wZW5zc2wgLWEgLWYgJGRpci9pbmNsdWRlL29wZW5zc2wvZGVzLmg7IHRoZW4KKwkJaW5jZGlyPSItSSRkaXIvaW5jbHVkZSIKKwlmaQorCWlmIHRlc3QgIiRhY19jdl9zc2xlYXlfcGF0aCIgIT0gIm5vIiAtYSAiJGluY2RpciIgIT0gIm5vIjsgdGhlbgorCQlicmVhazsKKwllbHNlCisJCWFjX2N2X3NzbGVheV9wYXRoPW5vCisJCWluY2Rpcj1ubworCWZpCitkb25lCitBQ19NU0dfUkVTVUxUKCRhY19jdl9zc2xlYXlfcGF0aCkKK2lmIHRlc3QgIiRhY19jdl9zc2xlYXlfcGF0aCIgIT0gbm87IHRoZW4KKwlWX0lOQ0xTPSIkVl9JTkNMUyAkaW5jZGlyIgorCUxERkxBR1M9Ii1MJGRpci9saWIgJExERkxBR1MiCisJaWYgdGVzdCAtZiAkYWNfY3Zfc3NsZWF5X3BhdGgvbGliL2xpYlJTQWdsdWUuYTsgdGhlbgorCQlMSUJTPSIkTElCUyAtbFJTQWdsdWUiCisJZmkKKwlpZiB0ZXN0IC1mICRhY19jdl9zc2xlYXlfcGF0aC9saWIvbGlicnNhcmVmLmE7IHRoZW4KKwkJTElCUz0iJExJQlMgLWxyc2FyZWYiCisJZmkKKwlBQ19DSEVDS19MSUIoY3J5cHRvLCBERVNfY2JjX2VuY3J5cHQpCisKKwlDUFBGTEFHUz0iJENQUEZMQUdTICRWX0lOQ0xTIgorCUFDX0NIRUNLX0hFQURFUlMob3BlbnNzbC9ldnAuaCkKK2ZpCitdKQorCitkbmwKK2RubCBzZXQgYWRkaXRpb25hbCBpbmNsdWRlIHBhdGggaWYgbmVjZXNzYXJ5CitpZiB0ZXN0ICIkbWlzc2luZ19pbmNsdWRlcyIgPSAieWVzIjsgdGhlbgorCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUlcJChzcmNkaXIpL21pc3NpbmciCisJVl9JTkNMUz0iJFZfSU5DTFMgLUlcJChzcmNkaXIpL21pc3NpbmciCitmaQorCitBQ19TVUJTVChWX0NDT1BUKQorQUNfU1VCU1QoVl9ERUZTKQorQUNfU1VCU1QoVl9HUk9VUCkKK0FDX1NVQlNUKFZfSU5DTFMpCitBQ19TVUJTVChWX1BDQVBERVApCitBQ19TVUJTVChMT0NBTFNSQykKKworQUNfUFJPR19JTlNUQUxMCisKK0FDX0NPTkZJR19IRUFERVIoY29uZmlnLmgpCisKK0FDX09VVFBVVF9DT01NQU5EUyhbaWYgdGVzdCAtZiAuZGV2ZWw7IHRoZW4KKwllY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKKwljYXQgTWFrZWZpbGUtZGV2ZWwtYWRkcyA+PiBNYWtlZmlsZQorCW1ha2UgZGVwZW5kCitmaV0pCitBQ19PVVRQVVQoTWFrZWZpbGUpCitleGl0IDAKZGlmZiAtLWdpdCBhL2NwYWNrLmMgYi9jcGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YzBhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9jcGFjay5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBEYXZpZCBZb3VuZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiBEYXZpZCBZb3VuZyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBEQVZJRCBZT1VORyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIERBVklECisgKiBZT1VORyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgImNwYWNrLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCitzdGF0aWMgdV9pbnQ4X3QgKgorY3BhY2tfbmV4dF9ib3VuZGFyeSh1X2ludDhfdCAqYnVmLCB1X2ludDhfdCAqcCwgc2l6ZV90IGFsaWdubWVudCkKK3sKKwlzaXplX3QgbWlzYWxpZ25tZW50ID0gKHNpemVfdCkocCAtIGJ1ZikgJSBhbGlnbm1lbnQ7CisKKwlpZiAobWlzYWxpZ25tZW50ID09IDApCisJCXJldHVybiBwOworCisJcmV0dXJuIHAgKyAoYWxpZ25tZW50IC0gbWlzYWxpZ25tZW50KTsKK30KKworLyogQWR2YW5jZSB0byB0aGUgbmV4dCB3b3Jkc2l6ZSBib3VuZGFyeS4gUmV0dXJuIE5VTEwgaWYgZmV3ZXIgdGhhbgorICogd29yZHNpemUgYnl0ZXMgcmVtYWluIGluIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIGJvdW5kYXJ5LiAgT3RoZXJ3aXNlLAorICogcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYm91bmRhcnkuCisgKi8KK3N0YXRpYyB1X2ludDhfdCAqCitjcGFja19hbGlnbl9hbmRfcmVzZXJ2ZShzdHJ1Y3QgY3BhY2tfc3RhdGUgKmNzLCBzaXplX3Qgd29yZHNpemUpCit7CisJdV9pbnQ4X3QgKm5leHQ7CisKKwkvKiBFbnN1cmUgYWxpZ25tZW50LiAqLworCW5leHQgPSBjcGFja19uZXh0X2JvdW5kYXJ5KGNzLT5jX2J1ZiwgY3MtPmNfbmV4dCwgd29yZHNpemUpOworCisJLyogVG9vIGxpdHRsZSBzcGFjZSBmb3Igd29yZHNpemUgYnl0ZXM/ICovCisJaWYgKG5leHQgLSBjcy0+Y19idWYgKyB3b3Jkc2l6ZSA+IGNzLT5jX2xlbikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbmV4dDsKK30KKworaW50CitjcGFja19pbml0KHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHVfaW50OF90ICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJbWVtc2V0KGNzLCAwLCBzaXplb2YoKmNzKSk7CisKKwljcy0+Y19idWYgPSBidWY7CisJY3MtPmNfbGVuID0gYnVmbGVuOworCWNzLT5jX25leHQgPSBjcy0+Y19idWY7CisKKwlyZXR1cm4gMDsKK30KKworLyogVW5wYWNrIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIuICovCitpbnQKK2NwYWNrX3VpbnQ2NChzdHJ1Y3QgY3BhY2tfc3RhdGUgKmNzLCB1X2ludDY0X3QgKnUpCit7CisJdV9pbnQ4X3QgKm5leHQ7CisKKwlpZiAoKG5leHQgPSBjcGFja19hbGlnbl9hbmRfcmVzZXJ2ZShjcywgc2l6ZW9mKCp1KSkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSp1ID0gRVhUUkFDVF9MRV82NEJJVFMobmV4dCk7CisKKwkvKiBNb3ZlIHBvaW50ZXIgcGFzdCB0aGUgdV9pbnQ2NF90LiAqLworCWNzLT5jX25leHQgPSBuZXh0ICsgc2l6ZW9mKCp1KTsKKwlyZXR1cm4gMDsKK30KKworLyogVW5wYWNrIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuICovCitpbnQKK2NwYWNrX3VpbnQzMihzdHJ1Y3QgY3BhY2tfc3RhdGUgKmNzLCB1X2ludDMyX3QgKnUpCit7CisJdV9pbnQ4X3QgKm5leHQ7CisKKwlpZiAoKG5leHQgPSBjcGFja19hbGlnbl9hbmRfcmVzZXJ2ZShjcywgc2l6ZW9mKCp1KSkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSp1ID0gRVhUUkFDVF9MRV8zMkJJVFMobmV4dCk7CisKKwkvKiBNb3ZlIHBvaW50ZXIgcGFzdCB0aGUgdV9pbnQzMl90LiAqLworCWNzLT5jX25leHQgPSBuZXh0ICsgc2l6ZW9mKCp1KTsKKwlyZXR1cm4gMDsKK30KKworLyogVW5wYWNrIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIuICovCitpbnQKK2NwYWNrX3VpbnQxNihzdHJ1Y3QgY3BhY2tfc3RhdGUgKmNzLCB1X2ludDE2X3QgKnUpCit7CisJdV9pbnQ4X3QgKm5leHQ7CisKKwlpZiAoKG5leHQgPSBjcGFja19hbGlnbl9hbmRfcmVzZXJ2ZShjcywgc2l6ZW9mKCp1KSkpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCSp1ID0gRVhUUkFDVF9MRV8xNkJJVFMobmV4dCk7CisKKwkvKiBNb3ZlIHBvaW50ZXIgcGFzdCB0aGUgdV9pbnQxNl90LiAqLworCWNzLT5jX25leHQgPSBuZXh0ICsgc2l6ZW9mKCp1KTsKKwlyZXR1cm4gMDsKK30KKworLyogVW5wYWNrIGFuIDgtYml0IHVuc2lnbmVkIGludGVnZXIuICovCitpbnQKK2NwYWNrX3VpbnQ4KHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHVfaW50OF90ICp1KQoreworCS8qIE5vIHNwYWNlIGxlZnQ/ICovCisJaWYgKChzaXplX3QpKGNzLT5jX25leHQgLSBjcy0+Y19idWYpID49IGNzLT5jX2xlbikKKwkJcmV0dXJuIC0xOworCisJKnUgPSAqY3MtPmNfbmV4dDsKKworCS8qIE1vdmUgcG9pbnRlciBwYXN0IHRoZSB1X2ludDhfdC4gKi8KKwljcy0+Y19uZXh0Kys7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jcGFjay5oIGIvY3BhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVkMzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY3BhY2suaApAQCAtMCwwICsxLDUxIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBEYXZpZCBZb3VuZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiBEYXZpZCBZb3VuZyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBEQVZJRCBZT1VORyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIERBVklECisgKiBZT1VORyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBfQ1BBQ0tfSAorI2RlZmluZSBfQ1BBQ0tfSAorCitzdHJ1Y3QgY3BhY2tfc3RhdGUgeworCXVfaW50OF90CQkJCQkqY19idWY7CisJdV9pbnQ4X3QJCQkJCSpjX25leHQ7CisJc2l6ZV90CQkJCQkJIGNfbGVuOworfTsKKworaW50IGNwYWNrX2luaXQoc3RydWN0IGNwYWNrX3N0YXRlICosIHVfaW50OF90ICosIHNpemVfdCk7CisKK2ludCBjcGFja191aW50OChzdHJ1Y3QgY3BhY2tfc3RhdGUgKiwgdV9pbnQ4X3QgKik7CitpbnQgY3BhY2tfdWludDE2KHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDE2X3QgKik7CitpbnQgY3BhY2tfdWludDMyKHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDMyX3QgKik7CitpbnQgY3BhY2tfdWludDY0KHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDY0X3QgKik7CisKKyNkZWZpbmUgY3BhY2tfaW50OChfX3MsIF9fcCkJY3BhY2tfdWludDgoKF9fcyksICAodV9pbnQ4X3QqKShfX3ApKQorI2RlZmluZSBjcGFja19pbnQxNihfX3MsIF9fcCkJY3BhY2tfdWludDE2KChfX3MpLCAodV9pbnQxNl90KikoX19wKSkKKyNkZWZpbmUgY3BhY2tfaW50MzIoX19zLCBfX3ApCWNwYWNrX3VpbnQzMigoX19zKSwgKHVfaW50MzJfdCopKF9fcCkpCisjZGVmaW5lIGNwYWNrX2ludDY0KF9fcywgX19wKQljcGFja191aW50NjQoKF9fcyksICh1X2ludDY0X3QqKShfX3ApKQorCisjZW5kaWYgLyogX0NQQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2RjY3AuaCBiL2RjY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvZGNjcC5oCkBAIC0wLDAgKzEsMTM5IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2RjY3AuaCx2IDEuMS4yLjQgMjAwNi8wNS8xMiAwMTo0NjoxNyBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyAyMDA0CisgKiBDb3B5cmlnaHQgKEMpIElhbiBNY0RvbmFsZCAyMDA1IDxpYW00QGNzLndhaWthdG8uYWMubno+CisgKiBDb3B5cmlnaHQgKEMpIFlvc2hpZnVtaSBOaXNoaWRhIDIwMDUKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0Y3BkdW1wIG9yIHRoZSBHTlUgR1BMIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgX19EQ0NQX0hEUl9fCisjZGVmaW5lIF9fRENDUF9IRFJfXworCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkciAtIGdlbmVyaWMgcGFydCBvZiBEQ0NQIHBhY2tldCBoZWFkZXIKKyAqCisgKiBAZGNjcGhfc3BvcnQgLSBSZWxldmFudCBwb3J0IG9uIHRoZSBlbmRwb2ludCB0aGF0IHNlbnQgdGhpcyBwYWNrZXQKKyAqIEBkY2NwaF9kcG9ydCAtIFJlbGV2YW50IHBvcnQgb24gdGhlIG90aGVyIGVuZHBvaW50CisgKiBAZGNjcGhfZG9mZiAtIERhdGEgT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBEQ0NQIGhlYWRlciwgaW4gMzItYml0IHdvcmRzCisgKiBAZGNjcGhfY2N2YWwgLSBVc2VkIGJ5IHRoZSBIQy1TZW5kZXIgQ0NJRAorICogQGRjY3BoX2NzY292IC0gUGFydHMgb2YgdGhlIHBhY2tldCB0aGF0IGFyZSBjb3ZlcmVkIGJ5IHRoZSBDaGVja3N1bSBmaWVsZAorICogQGRjY3BoX2NoZWNrc3VtIC0gSW50ZXJuZXQgY2hlY2tzdW0sIGRlcGVuZHMgb24gZGNjcGhfY3Njb3YKKyAqIEBkY2NwaF94IC0gMCA9IDI0IGJpdCBzZXF1ZW5jZSBudW1iZXIsIDEgPSA0OAorICogQGRjY3BoX3R5cGUgLSBwYWNrZXQgdHlwZSwgc2VlIERDQ1BfUEtUXyBwcmVmaXhlZCBtYWNyb3MKKyAqIEBkY2NwaF9zZXEgLSBzZXF1ZW5jZSBudW1iZXIgaGlnaCBvciBsb3cgb3JkZXIgMjQgYml0cywgZGVwZW5kcyBvbiBkY2NwaF94CisgKi8KK3N0cnVjdCBkY2NwX2hkciB7CisJdV9pbnQxNl90CWRjY3BoX3Nwb3J0LAorCQkJZGNjcGhfZHBvcnQ7CisJdV9pbnQ4X3QJZGNjcGhfZG9mZjsKKwl1X2ludDhfdAlkY2NwaF9jY3ZhbF9jc2NvdjsKKwl1X2ludDE2X3QJZGNjcGhfY2hlY2tzdW07CisJdW5pb24geworCXVfaW50OF90CWRjY3BoX3h0cjsKKwl1X2ludDMyX3QJZGNjcGhfc2VxOworCX0JCWRjY3BoX3h0cnM7Cit9OworCisjZGVmaW5lIERDQ1BIX0NDVkFMKGRoKQkoKChkaCktPmRjY3BoX2NjdmFsX2NzY292KSAmIDB4MEYpCisjZGVmaW5lIERDQ1BIX0NTQ09WKGRoKQkoKChkaCktPmRjY3BoX2NjdmFsX2NzY292ID4+IDQpICYgMHgwRikKKworI2RlZmluZSBEQ0NQSF9YKGRoKQkoKGRoKS0+ZGNjcGhfeHRycy5kY2NwaF94dHIgJiAxKQorI2RlZmluZSBEQ0NQSF9UWVBFKGRoKQkoKChkaCktPmRjY3BoX3h0cnMuZGNjcGhfeHRyID4+IDEpICYgMHhGKQorI2RlZmluZSBEQ0NQSF9TRVEoZGgpICAgKCgoZGgpLT5kY2NwaF94dHJzLmRjY3BoX3NlcSkgPj4gOCkKKworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfZXh0IC0gdGhlIGxvdyBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqCisgKiBAZGNjcGhfc2VxX2xvdyAtIGxvdyAyNCBiaXRzIG9mIGEgNDggYml0IHNlcSBwYWNrZXQKKyAqLworc3RydWN0IGRjY3BfaGRyX2V4dCB7CisJdV9pbnQzMl90CWRjY3BoX3NlcV9sb3c7Cit9OworCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IC0gQ29uZWN0aW9uIGluaXRpYXRpb24gcmVxdWVzdCBoZWFkZXIKKyAqCisgKiBAZGNjcGhfcmVxX3NlcnZpY2UgLSBTZXJ2aWNlIHRvIHdoaWNoIHRoZSBjbGllbnQgYXBwIHdhbnRzIHRvIGNvbm5lY3QKKyAqLworc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QgeworCXVfaW50MzJfdAlkY2NwaF9yZXFfc2VydmljZTsKK307CisKKy8qKgorICogc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzIC0gYWNrbm93bGVkZ21lbnQgYml0cyBjb21tb24gdG8gbW9zdCBwYWNrZXRzCisgKgorICogQGRjY3BoX3Jlc3BfYWNrX25yX2hpZ2ggLSA0OCBiaXQgYWNrIG51bWJlciBoaWdoIG9yZGVyIGJpdHMsIGNvbnRhaW5zIEdTUgorICogQGRjY3BoX3Jlc3BfYWNrX25yX2xvdyAtIDQ4IGJpdCBhY2sgbnVtYmVyIGxvdyBvcmRlciBiaXRzLCBjb250YWlucyBHU1IKKyAqLworc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzIHsKKwl1X2ludDMyX3QJZGNjcGhfcmE7CisJdV9pbnQzMl90CWRjY3BoX2Fja19ucl9sb3c7Cit9OworCisjZGVmaW5lIERDQ1BIX0FDSyhkaF9hY2spICAgKChkaF9hY2spLT5kY2NwaF9yYSA+PiA4KQorCisvKioKKyAqIHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAtIENvbmVjdGlvbiBpbml0aWF0aW9uIHJlc3BvbnNlIGhlYWRlcgorICoKKyAqIEBkY2NwaF9yZXNwX2Fja19ucl9oaWdoIC0gNDggYml0IGFjayBudW1iZXIgaGlnaCBvcmRlciBiaXRzLCBjb250YWlucyBHU1IKKyAqIEBkY2NwaF9yZXNwX2Fja19ucl9sb3cgLSA0OCBiaXQgYWNrIG51bWJlciBsb3cgb3JkZXIgYml0cywgY29udGFpbnMgR1NSCisgKiBAZGNjcGhfcmVzcF9zZXJ2aWNlIC0gRWNob2VzIHRoZSBTZXJ2aWNlIENvZGUgb24gYSByZWNlaXZlZCBEQ0NQLVJlcXVlc3QKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzcF9hY2s7CisJdV9pbnQzMl90CQkJZGNjcGhfcmVzcF9zZXJ2aWNlOworfTsKKworI2lmIDAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRjY3BfaGRyX2RhdGEgKmRjY3BfaGRyX2RhdGEoc3RydWN0IGRjY3BfaGRyICpoZHJnKQoreworCWNvbnN0IGludCBleHQgPSBEQ0NQSF9YKGhkcmcpID8gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpIDogMDsKKworCXJldHVybiAoc3RydWN0IGRjY3BfaGRyX2RhdGEgKikoKCh1X2NoYXIgKiloZHJnKSArIHNpemVvZihoZHJnKSArIGV4dCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQgLSBVbmNvbmRpdGlvbmFsbHkgc2h1dCBkb3duIGEgY29ubmVjdGlvbgorICoKKyAqIEBkY2NwaF9yZXNldF9zZXJ2aWNlIC0gRWNob2VzIHRoZSBTZXJ2aWNlIENvZGUgb24gYSByZWNlaXZlZCBEQ0NQLVJlcXVlc3QKKyAqLworc3RydWN0IGRjY3BfaGRyX3Jlc2V0IHsKKwlzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMJZGNjcGhfcmVzZXRfYWNrOworCXVfaW50OF90CQkJZGNjcGhfcmVzZXRfY29kZSwKKwkJCQkJZGNjcGhfcmVzZXRfZGF0YVszXTsKK307CisKK2VudW0gZGNjcF9wa3RfdHlwZSB7CisJRENDUF9QS1RfUkVRVUVTVCA9IDAsCisJRENDUF9QS1RfUkVTUE9OU0UsCisJRENDUF9QS1RfREFUQSwKKwlEQ0NQX1BLVF9BQ0ssCisJRENDUF9QS1RfREFUQUFDSywKKwlEQ0NQX1BLVF9DTE9TRVJFUSwKKwlEQ0NQX1BLVF9DTE9TRSwKKwlEQ0NQX1BLVF9SRVNFVCwKKwlEQ0NQX1BLVF9TWU5DLAorCURDQ1BfUEtUX1NZTkNBQ0ssCisJRENDUF9QS1RfSU5WQUxJRAorfTsKKworZW51bSBkY2NwX3Jlc2V0X2NvZGVzIHsKKwlEQ0NQX1JFU0VUX0NPREVfVU5TUEVDSUZJRUQgPSAwLAorCURDQ1BfUkVTRVRfQ09ERV9DTE9TRUQsCisJRENDUF9SRVNFVF9DT0RFX0FCT1JURUQsCisJRENDUF9SRVNFVF9DT0RFX05PX0NPTk5FQ1RJT04sCisJRENDUF9SRVNFVF9DT0RFX1BBQ0tFVF9FUlJPUiwKKwlEQ0NQX1JFU0VUX0NPREVfT1BUSU9OX0VSUk9SLAorCURDQ1BfUkVTRVRfQ09ERV9NQU5EQVRPUllfRVJST1IsCisJRENDUF9SRVNFVF9DT0RFX0NPTk5FQ1RJT05fUkVGVVNFRCwKKwlEQ0NQX1JFU0VUX0NPREVfQkFEX1NFUlZJQ0VfQ09ERSwKKwlEQ0NQX1JFU0VUX0NPREVfVE9PX0JVU1ksCisJRENDUF9SRVNFVF9DT0RFX0JBRF9JTklUX0NPT0tJRSwKKwlEQ0NQX1JFU0VUX0NPREVfQUdHUkVTU0lPTl9QRU5BTFRZLAorCV9fRENDUF9SRVNFVF9DT0RFX0xBU1QKK307CisKKyNlbmRpZiAvKiBfX0RDQ1BfSERSX18gKi8KZGlmZiAtLWdpdCBhL2RlY25ldC5oIGIvZGVjbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1YzE0NwotLS0gL2Rldi9udWxsCisrKyBiL2RlY25ldC5oCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTk0LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9kZWNuZXQuaCx2IDEuMTEgMjAwMi8xMi8xMSAwNzoxMzo1MCBndXkgRXhwICQgKExCTCkKKyAqLworCisjaWZuZGVmIFdJTjMyCit0eXBlZGVmIHVfaW50OF90IGJ5dGVbMV07CQkvKiBzaW5nbGUgYnl0ZSBmaWVsZCAqLworI2Vsc2UKKy8qCisgKiB0aGUga2V5d29yZCAnYnl0ZScgZ2VuZXJhdGVzIGNvbmZsaWN0cyBpbiBXaW5kb3dzCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBCeXRlWzFdOwkJLyogc2luZ2xlIGJ5dGUgZmllbGQgKi8KKyNkZWZpbmUgYnl0ZSBCeXRlCisjZW5kaWYgLyogV0lOMzIgKi8KK3R5cGVkZWYgdV9pbnQ4X3Qgd29yZFsyXTsJCS8qIDIgYnl0ZSBmaWVsZCAqLwordHlwZWRlZiB1X2ludDhfdCBsb25nd29yZFs0XTsJCS8qIDQgYnl0ZXMgZmllbGQgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBERUNORVQgUGhhc2UgSVYgcHJvdG9jb2wgaGVhZGVycworICovCit1bmlvbiBldGhlcmFkZHJlc3MgeworCXVfaW50OF90ICAgZG5lX2FkZHJbNl07CQkvKiBmdWxsIGV0aGVybmV0IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgeworCQl1X2ludDhfdCBkbmVfaGlvcmRbNF07CS8qIERFQ25ldCBISU9SRCBwcmVmaXggKi8KKwkJdV9pbnQ4X3QgZG5lX25vZGVhZGRyWzJdOyAvKiBERUNuZXQgbm9kZSBhZGRyZXNzICovCisJfSBkbmVfcmVtb3RlOworfTsKKwordHlwZWRlZiB1bmlvbiBldGhlcmFkZHJlc3MgZXRoZXJhZGRyOwkvKiBFdGhlcm5ldCBhZGRyZXNzICovCisKKyNkZWZpbmUgSElPUkQgMHgwMDA0MDBhYQkJLyogaGlnaCAzMi1iaXRzIG9mIGFkZHJlc3MgKHN3YXBwZWQpICovCisKKyNkZWZpbmUgQVJFQU1BU0sJMDE3NjAwMAkJLyogbWFzayBmb3IgYXJlYSBmaWVsZCAqLworI2RlZmluZQlBUkVBU0hJRlQJMTAJCS8qIGJpdC1vZmZzZXQgZm9yIGFyZWEgZmllbGQgKi8KKyNkZWZpbmUgTk9ERU1BU0sJMDE3NzcJCS8qIG1hc2sgZm9yIG5vZGUgYWRkcmVzcyBmaWVsZCAqLworCisjZGVmaW5lIEROX01BWEFEREwJMjAJCS8qIG1heCBzaXplIG9mIERFQ25ldCBhZGRyZXNzICovCitzdHJ1Y3QgZG5fbmFkZHIgeworCXVfaW50MTZfdAlhX2xlbjsJCS8qIGxlbmd0aCBvZiBhZGRyZXNzICovCisJdV9pbnQ4X3QgYV9hZGRyW0ROX01BWEFERExdOyAvKiBhZGRyZXNzIGFzIGJ5dGVzICovCit9OworCisvKgorICogRGVmaW5lIGxvbmcgYW5kIHNob3J0IGhlYWRlciBmb3JtYXRzLgorICovCitzdHJ1Y3Qgc2hvcnRoZHIKKyAgeworICAgIGJ5dGUJc2hfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIHdvcmQJc2hfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIG5vZGUgYWRkcmVzcyAqLworICAgIHdvcmQJc2hfc3JjOwkJCS8qIHNvdXJjZSBub2RlIGFkZHJlc3MgKi8KKyAgICBieXRlCXNoX3Zpc2l0czsJCS8qIHZpc2l0IGNvdW50ICovCisgIH07CisKK3N0cnVjdCBsb25naGRyCisgIHsKKyAgICBieXRlCWxnX2ZsYWdzOwkJLyogcm91dGUgZmxhZ3MgKi8KKyAgICBieXRlCWxnX2RhcmVhOwkJLyogZGVzdGluYXRpb24gYXJlYSAocmVzZXJ2ZWQpICovCisgICAgYnl0ZQlsZ19kc2FyZWE7CQkvKiBkZXN0aW5hdGlvbiBzdWJhcmVhIChyZXNlcnZlZCkgKi8KKyAgICBldGhlcmFkZHIJbGdfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGlkICovCisgICAgYnl0ZQlsZ19zYXJlYTsJCS8qIHNvdXJjZSBhcmVhIChyZXNlcnZlZCkgKi8KKyAgICBieXRlCWxnX3NzYXJlYTsJCS8qIHNvdXJjZSBzdWJhcmVhIChyZXNlcnZlZCkgKi8KKyAgICBldGhlcmFkZHIJbGdfc3JjOwkJCS8qIHNvdXJjZSBpZCAqLworICAgIGJ5dGUJbGdfbmV4dGwyOwkJLyogbmV4dCBsZXZlbCAyIHJvdXRlciAocmVzZXJ2ZWQpICovCisgICAgYnl0ZQlsZ192aXNpdHM7CQkvKiB2aXNpdCBjb3VudCAqLworICAgIGJ5dGUJbGdfc2VydmljZTsJCS8qIHNlcnZpY2UgY2xhc3MgKHJlc2VydmVkKSAqLworICAgIGJ5dGUJbGdfcHQ7CQkJLyogcHJvdG9jb2wgdHlwZSAocmVzZXJ2ZWQpICovCisgIH07CisKK3VuaW9uIHJvdXRlaGRyCisgIHsKKyAgICBzdHJ1Y3Qgc2hvcnRoZHIgcmhfc2hvcnQ7CQkvKiBzaG9ydCByb3V0ZSBoZWFkZXIgKi8KKyAgICBzdHJ1Y3QgbG9uZ2hkciByaF9sb25nOwkJLyogbG9uZyByb3V0ZSBoZWFkZXIgKi8KKyAgfTsKKworLyoKKyAqIERlZmluZSB0aGUgdmFsdWVzIG9mIHZhcmlvdXMgZmllbGRzIGluIHRoZSBwcm90b2NvbCBtZXNzYWdlcy4KKyAqCisgKiAxLiBEYXRhIHBhY2tldCBmb3JtYXRzLgorICovCisjZGVmaW5lIFJNRl9NQVNLCTcJCS8qIG1hc2sgZm9yIG1lc3NhZ2UgdHlwZSAqLworI2RlZmluZSBSTUZfU0hPUlQJMgkJLyogc2hvcnQgbWVzc2FnZSBmb3JtYXQgKi8KKyNkZWZpbmUgUk1GX0xPTkcJNgkJLyogbG9uZyBtZXNzYWdlIGZvcm1hdCAqLworI2lmbmRlZiBSTUZfUlFSCisjZGVmaW5lIFJNRl9SUVIJCTAxMAkJLyogcmVxdWVzdCByZXR1cm4gdG8gc2VuZGVyICovCisjZGVmaW5lIFJNRl9SVFMJCTAyMAkJLyogcmV0dXJuaW5nIHRvIHNlbmRlciAqLworI2RlZmluZSBSTUZfSUUJCTA0MAkJLyogaW50cmEtZXRoZXJuZXQgcGFja2V0ICovCisjZW5kaWYgLyogUk1SX1JRUiAqLworI2RlZmluZSBSTUZfRlZFUgkwMTAwCQkvKiBmdXR1cmUgdmVyc2lvbiBmbGFnICovCisjZGVmaW5lIFJNRl9QQUQJCTAyMDAJCS8qIHBhZCBmaWVsZCAqLworI2RlZmluZSBSTUZfUEFETUFTSwkwMTc3CQkvKiBwYWQgZmllbGQgbWFzayAqLworCisjZGVmaW5lIFZJU19NQVNLCTA3NwkJLyogdmlzaXQgZmllbGQgbWFzayAqLworCisvKgorICogMi4gQ29udHJvbCBwYWNrZXQgZm9ybWF0cy4KKyAqLworI2RlZmluZSBSTUZfQ1RMTUFTSwkwMTcJCS8qIG1hc2sgZm9yIG1lc3NhZ2UgdHlwZSAqLworI2RlZmluZSBSTUZfQ1RMTVNHCTAxCQkvKiBjb250cm9sIG1lc3NhZ2UgaW5kaWNhdG9yICovCisjZGVmaW5lIFJNRl9JTklUCTAxCQkvKiBpbml0aWFsaXphdGlvbiBtZXNzYWdlICovCisjZGVmaW5lIFJNRl9WRVIJCTAzCQkvKiB2ZXJpZmljYXRpb24gbWVzc2FnZSAqLworI2RlZmluZSBSTUZfVEVTVAkwNQkJLyogaGVsbG8gYW5kIHRlc3QgbWVzc2FnZSAqLworI2RlZmluZSBSTUZfTDFST1VUCTA3CQkvKiBsZXZlbCAxIHJvdXRpbmcgbWVzc2FnZSAqLworI2RlZmluZSBSTUZfTDJST1VUCTAxMQkJLyogbGV2ZWwgMiByb3V0aW5nIG1lc3NhZ2UgKi8KKyNkZWZpbmUgUk1GX1JIRUxMTwkwMTMJCS8qIHJvdXRlciBoZWxsbyBtZXNzYWdlICovCisjZGVmaW5lIFJNRl9FSEVMTE8JMDE1CQkvKiBlbmRub2RlIGhlbGxvIG1lc3NhZ2UgKi8KKworI2RlZmluZSBUSV9MMlJPVVQJMDEJCS8qIGxldmVsIDIgcm91dGVyICovCisjZGVmaW5lIFRJX0wxUk9VVAkwMgkJLyogbGV2ZWwgMSByb3V0ZXIgKi8KKyNkZWZpbmUgVElfRU5ETk9ERQkwMwkJLyogZW5kbm9kZSAqLworI2RlZmluZSBUSV9WRVJJRgkwNAkJLyogdmVyaWZpY2F0aW9uIHJlcXVpcmVkICovCisjZGVmaW5lIFRJX0JMT0NLCTAxMAkJLyogYmxvY2tpbmcgcmVxdWVzdGVkICovCisKKyNkZWZpbmUgVkVfVkVSUwkJMgkJLyogdmVyc2lvbiBudW1iZXIgKDIpICovCisjZGVmaW5lIFZFX0VDTwkJMAkJLyogRUNPIG51bWJlciAqLworI2RlZmluZSBWRV9VRUNPCQkwCQkvKiB1c2VyIEVDTyBudW1iZXIgKDApICovCisKKyNkZWZpbmUgUDNfVkVSUwkJMQkJLyogcGhhc2UgSUlJIHZlcnNpb24gbnVtYmVyICgxKSAqLworI2RlZmluZSBQM19FQ08JCTMJCS8qIEVDTyBudW1iZXIgKDMpICovCisjZGVmaW5lIFAzX1VFQ08JCTAJCS8qIHVzZXIgRUNPIG51bWJlciAoMCkgKi8KKworI2RlZmluZSBJSV9MMlJPVVQJMDEJCS8qIGxldmVsIDIgcm91dGVyICovCisjZGVmaW5lIElJX0wxUk9VVAkwMgkJLyogbGV2ZWwgMSByb3V0ZXIgKi8KKyNkZWZpbmUgSUlfRU5ETk9ERQkwMwkJLyogZW5kbm9kZSAqLworI2RlZmluZSBJSV9WRVJJRgkwNAkJLyogdmVyaWZpY2F0aW9uIHJlcXVpcmVkICovCisjZGVmaW5lIElJX05PTUNBU1QJMDQwCQkvKiBubyBtdWx0aWNhc3QgdHJhZmZpYyBhY2NlcHRlZCAqLworI2RlZmluZSBJSV9CTE9DSwkwMTAwCQkvKiBibG9ja2luZyByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgSUlfVFlQRU1BU0sJMDMJCS8qIG1hc2sgZm9yIG5vZGUgdHlwZSAqLworCisjZGVmaW5lIFRFU1REQVRBCTAyNTIJCS8qIHRlc3QgZGF0YSBieXRlcyAqLworI2RlZmluZSBURVNUTEVOCQkxCQkvKiBsZW5ndGggb2YgdHJhbnNtaXR0ZWQgdGVzdCBkYXRhICovCisKKy8qCisgKiBEZWZpbmUgY29udHJvbCBtZXNzYWdlIGZvcm1hdHMuCisgKi8KK3N0cnVjdCBpbml0bXNnSUlJCQkJLyogcGhhc2UgSUlJIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJaW5JSUlfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIHdvcmQJaW5JSUlfc3JjOwkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLworICAgIGJ5dGUJaW5JSUlfaW5mbzsJCS8qIHJvdXRpbmcgbGF5ZXIgaW5mb3JtYXRpb24gKi8KKyAgICB3b3JkCWluSUlJX2Jsa3NpemU7CQkvKiBtYXhpbXVtIGRhdGEgbGluayBibG9jayBzaXplICovCisgICAgYnl0ZQlpbklJSV92ZXJzOwkJLyogdmVyc2lvbiBudW1iZXIgKi8KKyAgICBieXRlCWluSUlJX2VjbzsJCS8qIEVDTyBudW1iZXIgKi8KKyAgICBieXRlCWluSUlJX3VlY287CQkvKiB1c2VyIEVDTyBudW1iZXIgKi8KKyAgICBieXRlCWluSUlJX3JzdmQ7CQkvKiByZXNlcnZlZCBpbWFnZSBmaWVsZCAqLworICB9OworCitzdHJ1Y3QgaW5pdG1zZwkJCQkvKiBpbml0aWFsaXphdGlvbiBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWluX2ZsYWdzOwkJLyogcm91dGUgZmxhZ3MgKi8KKyAgICB3b3JkCWluX3NyYzsJCQkvKiBzb3VyY2Ugbm9kZSBhZGRyZXNzICovCisgICAgYnl0ZQlpbl9pbmZvOwkJLyogcm91dGluZyBsYXllciBpbmZvcm1hdGlvbiAqLworICAgIHdvcmQJaW5fYmxrc2l6ZTsJCS8qIG1heGltdW0gZGF0YSBsaW5rIGJsb2NrIHNpemUgKi8KKyAgICBieXRlCWluX3ZlcnM7CQkvKiB2ZXJzaW9uIG51bWJlciAqLworICAgIGJ5dGUJaW5fZWNvOwkJCS8qIEVDTyBudW1iZXIgKi8KKyAgICBieXRlCWluX3VlY287CQkvKiB1c2VyIEVDTyBudW1iZXIgKi8KKyAgICB3b3JkCWluX2hlbGxvOwkJLyogaGVsbG8gdGltZXIgKi8KKyAgICBieXRlCWluX3JzdmQ7CQkvKiByZXNlcnZlZCBpbWFnZSBmaWVsZCAqLworICB9OworCitzdHJ1Y3QgdmVyaWZtc2cJCQkJLyogdmVyaWZpY2F0aW9uIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJdmVfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIHdvcmQJdmVfc3JjOwkJCS8qIHNvdXJjZSBub2RlIGFkZHJlc3MgKi8KKyAgICBieXRlCXZlX2ZjbnZhbDsJCS8qIGZ1bmN0aW9uIHZhbHVlIGltYWdlIGZpZWxkICovCisgIH07CisKK3N0cnVjdCB0ZXN0bXNnCQkJCS8qIGhlbGxvIGFuZCB0ZXN0IG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJdGVfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIHdvcmQJdGVfc3JjOwkJCS8qIHNvdXJjZSBub2RlIGFkZHJlc3MgKi8KKyAgICBieXRlCXRlX2RhdGE7CQkvKiB0ZXN0IGRhdGEgaW1hZ2UgZmllbGQgKi8KKyAgfTsKKworc3RydWN0IGwxcm91dAkJCQkvKiBsZXZlbCAxIHJvdXRpbmcgbWVzc2FnZSAqLworICB7CisgICAgYnl0ZQlyMV9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCisgICAgd29yZAlyMV9zcmM7CQkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLworICAgIGJ5dGUJcjFfcnN2ZDsJCS8qIHJlc2VydmVkIGZpZWxkICovCisgIH07CisKK3N0cnVjdCBsMnJvdXQJCQkJLyogbGV2ZWwgMiByb3V0aW5nIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJcjJfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIHdvcmQJcjJfc3JjOwkJCS8qIHNvdXJjZSBub2RlIGFkZHJlc3MgKi8KKyAgICBieXRlCXIyX3JzdmQ7CQkvKiByZXNlcnZlZCBmaWVsZCAqLworICB9OworCitzdHJ1Y3QgcmhlbGxvbXNnCQkJLyogcm91dGVyIGhlbGxvIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJcmhfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIGJ5dGUJcmhfdmVyczsJCS8qIHZlcnNpb24gbnVtYmVyICovCisgICAgYnl0ZQlyaF9lY287CQkJLyogRUNPIG51bWJlciAqLworICAgIGJ5dGUJcmhfdWVjbzsJCS8qIHVzZXIgRUNPIG51bWJlciAqLworICAgIGV0aGVyYWRkcglyaF9zcmM7CQkJLyogc291cmNlIGlkICovCisgICAgYnl0ZQlyaF9pbmZvOwkJLyogcm91dGluZyBsYXllciBpbmZvcm1hdGlvbiAqLworICAgIHdvcmQJcmhfYmxrc2l6ZTsJCS8qIG1heGltdW0gZGF0YSBsaW5rIGJsb2NrIHNpemUgKi8KKyAgICBieXRlCXJoX3ByaW9yaXR5OwkJLyogcm91dGVyJ3MgcHJpb3JpdHkgKi8KKyAgICBieXRlCXJoX2FyZWE7CQkvKiByZXNlcnZlZCAqLworICAgIHdvcmQJcmhfaGVsbG87CQkvKiBoZWxsbyB0aW1lciAqLworICAgIGJ5dGUJcmhfbXBkOwkJCS8qIHJlc2VydmVkICovCisgIH07CisKK3N0cnVjdCBlaGVsbG9tc2cJCQkvKiBlbmRub2RlIGhlbGxvIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJZWhfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLworICAgIGJ5dGUJZWhfdmVyczsJCS8qIHZlcnNpb24gbnVtYmVyICovCisgICAgYnl0ZQllaF9lY287CQkJLyogRUNPIG51bWJlciAqLworICAgIGJ5dGUJZWhfdWVjbzsJCS8qIHVzZXIgRUNPIG51bWJlciAqLworICAgIGV0aGVyYWRkcgllaF9zcmM7CQkJLyogc291cmNlIGlkICovCisgICAgYnl0ZQllaF9pbmZvOwkJLyogcm91dGluZyBsYXllciBpbmZvcm1hdGlvbiAqLworICAgIHdvcmQJZWhfYmxrc2l6ZTsJCS8qIG1heGltdW0gZGF0YSBsaW5rIGJsb2NrIHNpemUgKi8KKyAgICBieXRlCWVoX2FyZWE7CQkvKiBhcmVhIChyZXNlcnZlZCkgKi8KKyAgICBieXRlCWVoX3NlZWRbOF07CQkvKiB2ZXJpZmljYXRpb24gc2VlZCAqLworICAgIGV0aGVyYWRkcgllaF9yb3V0ZXI7CQkvKiBkZXNpZ25hdGVkIHJvdXRlciAqLworICAgIHdvcmQJZWhfaGVsbG87CQkvKiBoZWxsbyB0aW1lciAqLworICAgIGJ5dGUJZWhfbXBkOwkJCS8qIChyZXNlcnZlZCkgKi8KKyAgICBieXRlCWVoX2RhdGE7CQkvKiB0ZXN0IGRhdGEgaW1hZ2UgZmllbGQgKi8KKyAgfTsKKwordW5pb24gY29udHJvbG1zZworICB7CisgICAgc3RydWN0IGluaXRtc2cJY21faW5pdDsJLyogaW5pdGlhbGl6YXRpb24gbWVzc2FnZSAqLworICAgIHN0cnVjdCB2ZXJpZm1zZwljbV92ZXI7CQkvKiB2ZXJpZmljYXRpb24gbWVzc2FnZSAqLworICAgIHN0cnVjdCB0ZXN0bXNnCWNtX3Rlc3Q7CS8qIGhlbGxvIGFuZCB0ZXN0IG1lc3NhZ2UgKi8KKyAgICBzdHJ1Y3QgbDFyb3V0CWNtX2wxcm91OwkvKiBsZXZlbCAxIHJvdXRpbmcgbWVzc2FnZSAqLworICAgIHN0cnVjdCBsMnJvdXQJY21fbDJyb3V0OwkvKiBsZXZlbCAyIHJvdXRpbmcgbWVzc2FnZSAqLworICAgIHN0cnVjdCByaGVsbG9tc2cJY21fcmhlbGxvOwkvKiByb3V0ZXIgaGVsbG8gbWVzc2FnZSAqLworICAgIHN0cnVjdCBlaGVsbG9tc2cJY21fZWhlbGxvOwkvKiBlbmRub2RlIGhlbGxvIG1lc3NhZ2UgKi8KKyAgfTsKKworLyogTWFjcm9zIGZvciBkZWNvZGluZyByb3V0aW5nLWluZm8gZmllbGRzICovCisjZGVmaW5lCVJJX0NPU1QoeCkJKCh4KSYwNzc3KQorI2RlZmluZQlSSV9IT1BTKHgpCSgoKHgpPj4xMCkmMDM3KQorDAorLyoKKyAqIE5TUCBwcm90b2NvbCBmaWVsZHMgYW5kIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIE5TUF9UWVBFTUFTSyAwMTQJCS8qIG1hc2sgdG8gaXNvbGF0ZSB0eXBlIGNvZGUgKi8KKyNkZWZpbmUgTlNQX1NVQk1BU0sgMDE2MAkJLyogbWFzayB0byBpc29sYXRlIHN1YnR5cGUgY29kZSAqLworI2RlZmluZSBOU1BfU1VCU0hGVCA0CQkJLyogc2hpZnQgdG8gbW92ZSBzdWJ0eXBlIGNvZGUgKi8KKworI2RlZmluZSBNRlRfREFUQSAwCQkJLyogZGF0YSBtZXNzYWdlICovCisjZGVmaW5lIE1GVF9BQ0sgIDA0CQkJLyogYWNrbm93bGVkZ2VtZW50IG1lc3NhZ2UgKi8KKyNkZWZpbmUgTUZUX0NUTCAgMDEwCQkJLyogY29udHJvbCBtZXNzYWdlICovCisKKyNkZWZpbmUgTUZTX0lMUyAgMDIwCQkJLyogZGF0YSBvciBJL0xTIGluZGljYXRvciAqLworI2RlZmluZSBNRlNfQk9NICAwNDAJCQkvKiBiZWdpbm5pbmcgb2YgbWVzc2FnZSAoZGF0YSkgKi8KKyNkZWZpbmUgTUZTX01PTSAgMAkJCS8qIG1pZGRsZSBvZiBtZXNzYWdlIChkYXRhKSAqLworI2RlZmluZSBNRlNfRU9NICAwMTAwCQkJLyogZW5kIG9mIG1lc3NhZ2UgKGRhdGEpICovCisjZGVmaW5lIE1GU19JTlQgIDA0MAkJCS8qIGludGVycnVwdCBtZXNzYWdlICovCisKKyNkZWZpbmUgTUZTX0RBQ0sgMAkJCS8qIGRhdGEgYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lIE1GU19JQUNLIDAyMAkJCS8qIEkvTFMgYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lIE1GU19DQUNLIDA0MAkJCS8qIGNvbm5lY3QgYWNrbm93bGVkZ2VtZW50ICovCisKKyNkZWZpbmUgTUZTX05PUCAgMAkJCS8qIG5vIG9wZXJhdGlvbiAqLworI2RlZmluZSBNRlNfQ0kgICAwMjAJCQkvKiBjb25uZWN0IGluaXRpYXRlICovCisjZGVmaW5lIE1GU19DQyAgIDA0MAkJCS8qIGNvbm5lY3QgY29uZmlybSAqLworI2RlZmluZSBNRlNfREkgICAwNjAJCQkvKiBkaXNjb25uZWN0IGluaXRpYXRlICovCisjZGVmaW5lIE1GU19EQyAgIDAxMDAJCQkvKiBkaXNjb25uZWN0IGNvbmZpcm0gKi8KKyNkZWZpbmUgTUZTX1JDSSAgMDE0MAkJCS8qIHJldHJhbnNtaXR0ZWQgY29ubmVjdCBpbml0aWF0ZSAqLworCisjZGVmaW5lIFNHUV9BQ0sgIDAxMDAwMDAJCS8qIGFjayAqLworI2RlZmluZSBTR1FfTkFLICAwMTEwMDAwCQkvKiBuZWdhdGl2ZSBhY2sgKi8KKyNkZWZpbmUgU0dRX09BQ0sgMDEyMDAwMAkJLyogb3RoZXIgY2hhbm5lbCBhY2sgKi8KKyNkZWZpbmUgU0dRX09OQUsgMDEzMDAwMAkJLyogb3RoZXIgY2hhbm5lbCBuZWdhdGl2ZSBhY2sgKi8KKyNkZWZpbmUgU0dRX01BU0sgMDc3NzcJCQkvKiBtYXNrIHRvIGlzb2xhdGUgc2VxICMgKi8KKyNkZWZpbmUgU0dRX09USEVSIDAyMDAwMAkJLyogb3RoZXIgY2hhbm5lbCBxdWFsaWZpZXIgKi8KKyNkZWZpbmUgU0dRX0RFTEFZIDAxMDAwMAkJLyogYWNrIGRlbGF5IGZsYWcgKi8KKworI2RlZmluZSBTR1FfRU9NICAwMTAwMDAwCQkvKiBwc2V1ZG8gZmxhZyBmb3IgZW5kLW9mLW1lc3NhZ2UgKi8KKworI2RlZmluZSBMU01fTUFTSyAwMwkJCS8qIG1hc2sgZm9yIG1vZGlmaWVyIGZpZWxkICovCisjZGVmaW5lIExTTV9OT0NIQU5HRSAwCQkJLyogbm8gY2hhbmdlICovCisjZGVmaW5lIExTTV9ET05PVFNFTkQgMQkJCS8qIGRvIG5vdCBzZW5kIGRhdGEgKi8KKyNkZWZpbmUgTFNNX1NFTkQgMgkJCS8qIHNlbmQgZGF0YSAqLworCisjZGVmaW5lIExTSV9NQVNLIDAxNAkJCS8qIG1hc2sgZm9yIGludGVycHJldGF0aW9uIGZpZWxkICovCisjZGVmaW5lIExTSV9EQVRBIDAJCQkvKiBkYXRhIHNlZ21lbnQgb3IgbWVzc2FnZSBjb3VudCAqLworI2RlZmluZSBMU0lfSU5UUiA0CQkJLyogaW50ZXJydXB0IHJlcXVlc3QgY291bnQgKi8KKyNkZWZpbmUgTFNJX0lOVE0gMDM3NwkJCS8qIGZ1bm55IG1hcmtlciBmb3IgaW50LiBtZXNzYWdlICovCisKKyNkZWZpbmUgQ09TX01BU0sgMDE0CQkJLyogbWFzayBmb3IgZmxvdyBjb250cm9sIGZpZWxkICovCisjZGVmaW5lIENPU19OT05FIDAJCQkvKiBubyBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgQ09TX1NFR01FTlQgMDQJCQkvKiBzZWdtZW50IGZsb3cgY29udHJvbCAqLworI2RlZmluZSBDT1NfTUVTU0FHRSAwMTAJCQkvKiBtZXNzYWdlIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBDT1NfQ1JZUFRTRVIgMDIwCQkvKiBjcnlwdG9ncmFwaGljIHNlcnZpY2VzIHJlcXVlc3RlZCAqLworI2RlZmluZSBDT1NfREVGQVVMVCAxCQkJLyogZGVmYXVsdCB2YWx1ZSBmb3IgZmllbGQgKi8KKworI2RlZmluZSBDT0lfTUFTSyAzCQkJLyogbWFzayBmb3IgdmVyc2lvbiBmaWVsZCAqLworI2RlZmluZSBDT0lfMzIgMAkJCS8qIHZlcnNpb24gMy4yICovCisjZGVmaW5lIENPSV8zMSAxCQkJLyogdmVyc2lvbiAzLjEgKi8KKyNkZWZpbmUgQ09JXzQwIDIJCQkvKiB2ZXJzaW9uIDQuMCAqLworI2RlZmluZSBDT0lfNDEgMwkJCS8qIHZlcnNpb24gNC4xICovCisKKyNkZWZpbmUgTU5VX01BU0sgMTQwCQkJLyogbWFzayBmb3Igc2Vzc2lvbiBjb250cm9sIHZlcnNpb24gKi8KKyNkZWZpbmUgTU5VXzEwIDAwMAkJCQkvKiBzZXNzaW9uIFYxLjAgKi8KKyNkZWZpbmUgTU5VXzIwIDA0MAkJCQkvKiBzZXNzaW9uIFYyLjAgKi8KKyNkZWZpbmUgTU5VX0FDQ0VTUyAxCQkJLyogYWNjZXNzIGNvbnRyb2wgcHJlc2VudCAqLworI2RlZmluZSBNTlVfVVNSREFUQSAyCQkJLyogdXNlciBkYXRhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgTU5VX0lOVktQUk9YWSA0CQkJLyogaW52b2tlIHByb3h5IGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgTU5VX1VJQ1BST1hZIDgJCQkvKiB1c2UgdWljLWJhc2VkIHByb3h5ICovCisKKyNkZWZpbmUgRENfTk9SRVNPVVJDRVMgMQkJLyogbm8gcmVzb3VyY2UgcmVhc29uIGNvZGUgKi8KKyNkZWZpbmUgRENfTk9MSU5LIDQxCQkJLyogbm8gbGluayB0ZXJtaW5hdGUgcmVhc29uIGNvZGUgKi8KKyNkZWZpbmUgRENfQ09NUExFVEUgNDIJCQkvKiBkaXNjb25uZWN0IGNvbXBsZXRlIHJlYXNvbiBjb2RlICovCisKKyNkZWZpbmUgRElfTk9FUlJPUiAwCQkJLyogdXNlciBkaXNjb25uZWN0ICovCisjZGVmaW5lIERJX1NIVVQgMwkJCS8qIG5vZGUgaXMgc2h1dHRpbmcgZG93biAqLworI2RlZmluZSBESV9OT1VTRVIgNAkJCS8qIGRlc3RpbmF0aW9uIGVuZCB1c2VyIGRvZXMgbm90IGV4aXN0ICovCisjZGVmaW5lIERJX0lOVkRFU1QgNQkJCS8qIGludmFsaWQgZW5kIHVzZXIgZGVzdGluYXRpb24gKi8KKyNkZWZpbmUgRElfUkVNUkVTUkMgNgkJCS8qIGluc3VmZmljaWVudCByZW1vdGUgcmVzb3VyY2VzICovCisjZGVmaW5lIERJX1RQQSA4CQkJLyogdGhpcmQgcGFydHkgYWJvcnQgKi8KKyNkZWZpbmUgRElfUFJPVE9DT0wgNwkJCS8qIHByb3RvY29sIGVycm9yIGRpc2NvdmVyZWQgKi8KKyNkZWZpbmUgRElfQUJPUlQgOQkJCS8qIHVzZXIgYWJvcnQgKi8KKyNkZWZpbmUgRElfTE9DQUxSRVNSQyAzMgkJLyogaW5zdWZmaWNpZW50IGxvY2FsIHJlc291cmNlcyAqLworI2RlZmluZSBESV9SRU1VU0VSUkVTUkMgMzMJCS8qIGluc3VmZmljaWVudCByZW1vdGUgdXNlciByZXNvdXJjZXMgKi8KKyNkZWZpbmUgRElfQkFEQUNDRVNTIDM0CQkJLyogYmFkIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERJX0JBREFDQ05UIDM2CQkJLyogYmFkIEFDQ09VTlQgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRElfQ09OTkVDVEFCT1JUIDM4CQkvKiBjb25uZWN0IHJlcXVlc3QgY2FuY2VsbGVkICovCisjZGVmaW5lIERJX1RJTUVET1VUIDM4CQkJLyogcmVtb3RlIG5vZGUgb3IgdXNlciBjcmFzaGVkICovCisjZGVmaW5lIERJX1VOUkVBQ0hBQkxFIDM5CQkvKiBsb2NhbCB0aW1lcnMgZXhwaXJlZCBkdWUgdG8gLi4uICovCisjZGVmaW5lIERJX0JBRElNQUdFIDQzCQkJLyogYmFkIGltYWdlIGRhdGEgaW4gY29ubmVjdCAqLworI2RlZmluZSBESV9TRVJWTUlTTUFUQ0ggNTQJCS8qIGNyeXB0b2dyYXBoaWMgc2VydmljZSBtaXNtYXRjaCAqLworCisjZGVmaW5lIFVDX09CSlJFSkVDVCAwCQkJLyogb2JqZWN0IHJlamVjdGVkIGNvbm5lY3QgKi8KKyNkZWZpbmUgVUNfVVNFUkRJU0NPTk5FQ1QgMAkJLyogdXNlciBkaXNjb25uZWN0ICovCisjZGVmaW5lIFVDX1JFU09VUkNFUyAxCQkJLyogaW5zdWZmaWNpZW50IHJlc291cmNlcyAobG9jYWwgb3IgcmVtb3RlKSAqLworI2RlZmluZSBVQ19OT1NVQ0hOT0RFIDIJCQkvKiB1bnJlY29nbml6ZWQgbm9kZSBuYW1lICovCisjZGVmaW5lIFVDX1JFTU9URVNIVVQgMwkJCS8qIHJlbW90ZSBub2RlIHNodXR0aW5nIGRvd24gKi8KKyNkZWZpbmUgVUNfTk9TVUNIT0JKIDQJCQkvKiB1bnJlY29nbml6ZWQgb2JqZWN0ICovCisjZGVmaW5lIFVDX0lOVk9CSkZPUk1BVCA1CQkvKiBpbnZhbGlkIG9iamVjdCBuYW1lIGZvcm1hdCAqLworI2RlZmluZSBVQ19PQkpUT09CVVNZIDYJCQkvKiBvYmplY3QgdG9vIGJ1c3kgKi8KKyNkZWZpbmUgVUNfTkVUV09SS0FCT1JUIDgJCS8qIG5ldHdvcmsgYWJvcnQgKi8KKyNkZWZpbmUgVUNfVVNFUkFCT1JUIDkJCQkvKiB1c2VyIGFib3J0ICovCisjZGVmaW5lIFVDX0lOVk5PREVGT1JNQVQgMTAJCS8qIGludmFsaWQgbm9kZSBuYW1lIGZvcm1hdCAqLworI2RlZmluZSBVQ19MT0NBTFNIVVQgMTEJCQkvKiBsb2NhbCBub2RlIHNodXR0aW5nIGRvd24gKi8KKyNkZWZpbmUgVUNfQUNDRVNTUkVKRUNUIDM0CQkvKiBpbnZhbGlkIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFVDX05PUkVTUE9OU0UgMzgJCS8qIG5vIHJlc3BvbnNlIGZyb20gb2JqZWN0ICovCisjZGVmaW5lIFVDX1VOUkVBQ0hBQkxFIDM5CQkvKiBub2RlIHVucmVhY2hhYmxlICovCisKKy8qCisgKiBOU1AgbWVzc2FnZSBmb3JtYXRzLgorICovCitzdHJ1Y3QgbnNwaGRyCQkJCS8qIGdlbmVyYWwgbnNwIGhlYWRlciAqLworICB7CisgICAgYnl0ZQluaF9mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KKyAgICB3b3JkCW5oX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KKyAgICB3b3JkCW5oX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCisgIH07CisKK3N0cnVjdCBzZWdoZHIJCQkJLyogZGF0YSBzZWdtZW50IGhlYWRlciAqLworICB7CisgICAgYnl0ZQlzaF9mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KKyAgICB3b3JkCXNoX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KKyAgICB3b3JkCXNoX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCisgICAgd29yZAlzaF9zZXFbM107CQkvKiBzZXF1ZW5jZSBudW1iZXJzICovCisgIH07CisKK3N0cnVjdCBtaW5zZWdoZHIJCQkvKiBtaW5pbXVtIGRhdGEgc2VnbWVudCBoZWFkZXIgKi8KKyAgeworICAgIGJ5dGUJbXNfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCisgICAgd29yZAltc19kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCisgICAgd29yZAltc19zcmM7CQkJLyogc291cmNlIGxpbmsgYWRkcmVzcyAqLworICAgIHdvcmQJbXNfc2VxOwkJCS8qIHNlcXVlbmNlIG51bWJlciAqLworICB9OworCitzdHJ1Y3QgbHNtc2cJCQkJLyogbGluayBzZXJ2aWNlIG1lc3NhZ2UgKGFmdGVyIGhkcikgKi8KKyAgeworICAgIGJ5dGUJbHNfbHNmbGFnczsJCS8qIGxpbmsgc2VydmljZSBmbGFncyAqLworICAgIGJ5dGUJbHNfZmN2YWw7CQkvKiBmbG93IGNvbnRyb2wgdmFsdWUgKi8KKyAgfTsKKworc3RydWN0IGFja21zZwkJCQkvKiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZSAqLworICB7CisgICAgYnl0ZQlha19mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KKyAgICB3b3JkCWFrX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KKyAgICB3b3JkCWFrX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCisgICAgd29yZAlha19hY2tudW1bMl07CQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVycyAqLworICB9OworCitzdHJ1Y3QgbWluYWNrbXNnCQkJLyogbWluaW11bSBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZSAqLworICB7CisgICAgYnl0ZQlta19mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KKyAgICB3b3JkCW1rX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KKyAgICB3b3JkCW1rX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCisgICAgd29yZAlta19hY2tudW07CQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisgIH07CisKK3N0cnVjdCBjaWFja21zZwkJCQkvKiBjb25uZWN0IGFja25vd2xlZGdlbWVudCBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWNrX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLworICAgIHdvcmQJY2tfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLworICB9OworCitzdHJ1Y3QgY2ltc2cJCQkJLyogY29ubmVjdCBpbml0aWF0ZSBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWNpX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLworICAgIHdvcmQJY2lfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAoMCkgKi8KKyAgICB3b3JkCWNpX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCisgICAgYnl0ZQljaV9zZXJ2aWNlczsJCS8qIHJlcXVlc3RlZCBzZXJ2aWNlcyAqLworICAgIGJ5dGUJY2lfaW5mbzsJCS8qIGluZm9ybWF0aW9uICovCisgICAgd29yZAljaV9zZWdzaXplOwkJLyogbWF4aW11bSBzZWdtZW50IHNpemUgKi8KKyAgfTsKKworc3RydWN0IGNjbXNnCQkJCS8qIGNvbm5lY3QgY29uZmlybSBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWNjX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLworICAgIHdvcmQJY2NfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLworICAgIHdvcmQJY2Nfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KKyAgICBieXRlCWNjX3NlcnZpY2VzOwkJLyogcmVxdWVzdGVkIHNlcnZpY2VzICovCisgICAgYnl0ZQljY19pbmZvOwkJLyogaW5mb3JtYXRpb24gKi8KKyAgICB3b3JkCWNjX3NlZ3NpemU7CQkvKiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworICAgIGJ5dGUJY2Nfb3B0bGVuOwkJLyogb3B0aW9uYWwgZGF0YSBsZW5ndGggKi8KKyAgfTsKKworc3RydWN0IGNubXNnCQkJCS8qIGdlbmVyaWMgY29ubmVjdCBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWNuX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLworICAgIHdvcmQJY25fZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLworICAgIHdvcmQJY25fc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KKyAgICBieXRlCWNuX3NlcnZpY2VzOwkJLyogcmVxdWVzdGVkIHNlcnZpY2VzICovCisgICAgYnl0ZQljbl9pbmZvOwkJLyogaW5mb3JtYXRpb24gKi8KKyAgICB3b3JkCWNuX3NlZ3NpemU7CQkvKiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworICB9OworCitzdHJ1Y3QgZGltc2cJCQkJLyogZGlzY29ubmVjdCBpbml0aWF0ZSBtZXNzYWdlICovCisgIHsKKyAgICBieXRlCWRpX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLworICAgIHdvcmQJZGlfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLworICAgIHdvcmQJZGlfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KKyAgICB3b3JkCWRpX3JlYXNvbjsJCS8qIHJlYXNvbiBjb2RlICovCisgICAgYnl0ZQlkaV9vcHRsZW47CQkvKiBvcHRpb25hbCBkYXRhIGxlbmd0aCAqLworICB9OworCitzdHJ1Y3QgZGNtc2cJCQkJLyogZGlzY29ubmVjdCBjb25maXJtIG1lc3NhZ2UgKi8KKyAgeworICAgIGJ5dGUJZGNfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCisgICAgd29yZAlkY19kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCisgICAgd29yZAlkY19zcmM7CQkJLyogc291cmNlIGxpbmsgYWRkcmVzcyAqLworICAgIHdvcmQJZGNfcmVhc29uOwkJLyogcmVhc29uIGNvZGUgKi8KKyAgfTsKZGlmZiAtLWdpdCBhL2RlY29kZV9wcmVmaXguaCBiL2RlY29kZV9wcmVmaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM4NDcxCi0tLSAvZGV2L251bGwKKysrIGIvZGVjb2RlX3ByZWZpeC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogRXh0ZW5zaXZlbHkgbW9kaWZpZWQgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkgZm9yIG1vcmUKKyAqIGNvbXBsZXRlIEJHUCBzdXBwb3J0LgorICovCisKKyNpZm5kZWYgdGNwZHVtcF9kZWNvZGVfcHJlZml4X2gKKyNkZWZpbmUgdGNwZHVtcF9kZWNvZGVfcHJlZml4X2gKKworZXh0ZXJuIGludCBkZWNvZGVfcHJlZml4NChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKTsKKyNpZmRlZiBJTkVUNgorZXh0ZXJuIGludCBkZWNvZGVfcHJlZml4Nihjb25zdCB1X2NoYXIgKnBkLCBjaGFyICpidWYsIHVfaW50IGJ1Zmxlbik7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9lbmMuaCBiL2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NGI0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9lbmMuaApAQCAtMCwwICsxLDQ3IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2VuYy5oLHYgMS4xIDIwMDMvMDMvMDggMDg6NTU6MzMgZ3V5IEV4cCAkIChMQkwpICovCisvKiBGcm9tICRPcGVuQlNEOiBpZl9lbmMuaCx2IDEuOCAyMDAxLzA2LzI1IDA1OjE0OjAwIGFuZ2Vsb3MgRXhwICQgKi8KKy8qCisgKiBUaGUgYXV0aG9ycyBvZiB0aGlzIGNvZGUgYXJlIEpvaG4gSW9hbm5pZGlzIChqaUB0bGEub3JnKSwKKyAqIEFuZ2Vsb3MgRC4gS2Vyb215dGlzIChrZXJtaXRAY3NkLnVjaC5ncikgYW5kIAorICogTmllbHMgUHJvdm9zIChwcm92b3NAcGh5c25ldC51bmktaGFtYnVyZy5kZSkuCisgKgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIGJ5IEpvaG4gSW9hbm5pZGlzIGZvciBCU0QvT1MgaW4gQXRoZW5zLCBHcmVlY2UsIAorICogaW4gTm92ZW1iZXIgMTk5NS4KKyAqCisgKiBQb3J0ZWQgdG8gT3BlbkJTRCBhbmQgTmV0QlNELCB3aXRoIGFkZGl0aW9uYWwgdHJhbnNmb3JtcywgaW4gRGVjZW1iZXIgMTk5NiwKKyAqIGJ5IEFuZ2Vsb3MgRC4gS2Vyb215dGlzLgorICoKKyAqIEFkZGl0aW9uYWwgdHJhbnNmb3JtcyBhbmQgZmVhdHVyZXMgaW4gMTk5NyBhbmQgMTk5OCBieSBBbmdlbG9zIEQuIEtlcm9teXRpcworICogYW5kIE5pZWxzIFByb3Zvcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggYnkgSm9obiBJb2FubmlkaXMsIEFuZ2Vsb3MgRC4gS2Vyb215dGlzCisgKiBhbmQgTmllbHMgUHJvdm9zLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCBBbmdlbG9zIEQuIEtlcm9teXRpcy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIHdpdGggb3Igd2l0aG91dCBmZWUKKyAqIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgZW50aXJlIG5vdGljZSBpcyBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvZiBhbnkgc29mdHdhcmUgd2hpY2ggaXMgb3IgaW5jbHVkZXMgYSBjb3B5IG9yCisgKiBtb2RpZmljYXRpb24gb2YgdGhpcyBzb2Z0d2FyZS4gCisgKiBZb3UgbWF5IHVzZSB0aGlzIGNvZGUgdW5kZXIgdGhlIEdOVSBwdWJsaWMgbGljZW5zZSBpZiB5b3Ugc28gd2lzaC4gUGxlYXNlCisgKiBjb250cmlidXRlIGNoYW5nZXMgYmFjayB0byB0aGUgYXV0aG9ycyB1bmRlciB0aGlzIGZyZWVyIHRoYW4gR1BMIGxpY2Vuc2UKKyAqIHNvIHRoYXQgd2UgbWF5IGZ1cnRoZXIgdGhlIHVzZSBvZiBzdHJvbmcgZW5jcnlwdGlvbiB3aXRob3V0IGxpbWl0YXRpb25zIHRvCisgKiBhbGwuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRZLiBJTiBQQVJUSUNVTEFSLCBOT05FIE9GIFRIRSBBVVRIT1JTIE1BS0VTIEFOWQorICogUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgQU5ZIEtJTkQgQ09OQ0VSTklORyBUSEUKKyAqIE1FUkNIQU5UQUJJTElUWSBPRiBUSElTIFNPRlRXQVJFIE9SIElUUyBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUgorICogUFVSUE9TRS4KKyAqLworCisjZGVmaW5lIEVOQ19IRFJMRU4JMTIKKworLyogRnJvbSAkT3BlbkJTRDogbWJ1Zi5oLHYgMS41NiAyMDAyLzAxLzI1IDE1OjUwOjIzIGFydCBFeHAgJAkqLworI2RlZmluZSBNX0NPTkYJCTB4MDQwMCAgLyogcGFja2V0IHdhcyBlbmNyeXB0ZWQgKEVTUC10cmFuc3BvcnQpICovCisjZGVmaW5lIE1fQVVUSAkJMHgwODAwICAvKiBwYWNrZXQgd2FzIGF1dGhlbnRpY2F0ZWQgKEFIKSAqLworCitzdHJ1Y3QgZW5jaGRyIHsKKwl1X2ludDMyX3QgYWY7CisJdV9pbnQzMl90IHNwaTsKKwl1X2ludDMyX3QgZmxhZ3M7Cit9OwpkaWZmIC0tZ2l0IGEvZXNwLmggYi9lc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmNkYWRhCi0tLSAvZGV2L251bGwKKysrIGIvZXNwLmgKQEAgLTAsMCArMSw2OCBAQAorLyoJJE5ldEJTRDogZXNwLmgsdiAxLjEzIDIwMDAvMDkvMjYgMDg6Mzc6MzggaXRvanVuIEV4cCAkCSovCisvKgkkS0FNRTogZXNwLmgsdiAxLjE1IDIwMDAvMDkvMjAgMTg6MTU6MjIgaXRvanVuIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSRkMxODI3LzI0MDYgRW5jYXBzdWxhdGVkIFNlY3VyaXR5IFBheWxvYWQuCisgKi8KKworI2lmbmRlZiBfTkVUSU5FVDZfRVNQX0hfCisjZGVmaW5lIF9ORVRJTkVUNl9FU1BfSF8KKworc3RydWN0IGVzcCB7CisJdV9pbnQzMl90CWVzcF9zcGk7CS8qIEVTUCAqLworCS8qdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBJbml0aWFsaXphdGlvbiBWZWN0b3IgKi8KKwkvKnZhcmlhYmxlIHNpemUqLwkJLyogUGF5bG9hZCBkYXRhICovCisJLyp2YXJpYWJsZSBzaXplKi8JCS8qIHBhZGRpbmcgKi8KKwkvKjhiaXQqLwkJCS8qIHBhZCBzaXplICovCisJLyo4Yml0Ki8JCQkvKiBuZXh0IGhlYWRlciAqLworCS8qOGJpdCovCQkJLyogbmV4dCBoZWFkZXIgKi8KKwkvKnZhcmlhYmxlIHNpemUsIDMyYml0IGJvdW5kKi8JLyogQXV0aGVudGljYXRpb24gZGF0YSAobmV3IElQc2VjKSAqLworfTsKKworc3RydWN0IG5ld2VzcCB7CisJdV9pbnQzMl90CWVzcF9zcGk7CS8qIEVTUCAqLworCXVfaW50MzJfdAllc3Bfc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgKi8KKwkvKnZhcmlhYmxlIHNpemUqLwkJLyogKElWIGFuZCkgUGF5bG9hZCBkYXRhICovCisJLyp2YXJpYWJsZSBzaXplKi8JCS8qIHBhZGRpbmcgKi8KKwkvKjhiaXQqLwkJCS8qIHBhZCBzaXplICovCisJLyo4Yml0Ki8JCQkvKiBuZXh0IGhlYWRlciAqLworCS8qOGJpdCovCQkJLyogbmV4dCBoZWFkZXIgKi8KKwkvKnZhcmlhYmxlIHNpemUsIDMyYml0IGJvdW5kKi8JLyogQXV0aGVudGljYXRpb24gZGF0YSAqLworfTsKKworc3RydWN0IGVzcHRhaWwgeworCXVfaW50OF90CWVzcF9wYWRsZW47CS8qIHBhZCBsZW5ndGggKi8KKwl1X2ludDhfdAllc3Bfbnh0OwkvKiBOZXh0IGhlYWRlciAqLworCS8qdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhIChuZXcgSVBzZWMpKi8KK307CisKKyNlbmRpZiAvKl9ORVRJTkVUNl9FU1BfSF8qLwpkaWZmIC0tZ2l0IGEvZXRoZXIuaCBiL2V0aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL2V0aGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ldGhlci5oLHYgMS44IDIwMDIvMTIvMTEgMDc6MTM6NTEgZ3V5IEV4cCAkIChMQkwpICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpZl9ldGhlci5oCTguMyAoQmVya2VsZXkpIDUvMi85NQorICovCisKKyNkZWZpbmUJRVRIRVJNVFUJMTUwMAorCisvKgorICogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhbiBldGhlcm5ldCAoTUFDKSBhZGRyZXNzLgorICovCisjZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYSBERUMvSW50ZWwvWGVyb3ggb3IgODAyLjMgRXRoZXJuZXQgaGVhZGVyLgorICovCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1X2ludDhfdAlldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdV9pbnQ4X3QJZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXVfaW50MTZfdAlldGhlcl90eXBlOworfTsKKworLyoKKyAqIExlbmd0aCBvZiBhIERFQy9JbnRlbC9YZXJveCBvciA4MDIuMyBFdGhlcm5ldCBoZWFkZXI7IG5vdGUgdGhhdCBzb21lCisgKiBjb21waWxlcnMgbWF5IHBhZCAic3RydWN0IGV0aGVyX2hlYWRlciIgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLAorICogZm9yIGV4YW1wbGUsIHNvICJzaXplb2YgKHN0cnVjdCBldGhlcl9oZWFkZXIpIiBtYXkgbm90IGdpdmUgdGhlIHJpZ2h0CisgKiBhbnN3ZXIuCisgKi8KKyNkZWZpbmUgRVRIRVJfSERSTEVOCQkxNApkaWZmIC0tZ2l0IGEvZXRoZXJ0eXBlLmggYi9ldGhlcnR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRjOGUyCi0tLSAvZGV2L251bGwKKysrIGIvZXRoZXJ0eXBlLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2V0aGVydHlwZS5oLHYgMS4yNC4yLjEgMjAwNS8wNy8xMCAxNDo1MToxMCBoYW5uZXMgRXhwICQgKExCTCkKKyAqLworCisvKgorICogRXRoZXJuZXQgdHlwZXMuCisgKgorICogV2Ugd3JhcCB0aGUgZGVjbGFyYXRpb25zIHdpdGggI2lmZGVmLCBzbyB0aGF0IGlmIGEgZmlsZSBpbmNsdWRlcworICogPG5ldGluZXQvaWZfZXRoZXIuaD4sIHdoaWNoIG1heSBkZWNsYXJlIHNvbWUgb2YgdGhlc2UsIHdlIGRvbid0CisgKiBnZXQgYSBidW5jaCBvZiBjb21wbGFpbnRzIGZyb20gdGhlIEMgY29tcGlsZXIgYWJvdXQgcmVkZWZpbml0aW9ucworICogb2YgdGhlc2UgdmFsdWVzLgorICoKKyAqIFdlIGRlY2xhcmUgYWxsIG9mIHRoZW0gaGVyZSBzbyB0aGF0IG5vIGZpbGUgaGFzIHRvIGluY2x1ZGUKKyAqIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGlmIGFsbCBpdCBuZWVkcyBhcmUgRVRIRVJUWVBFXyB2YWx1ZXMuCisgKi8KKworI2lmbmRlZiBFVEhFUlRZUEVfTEVOCisjZGVmaW5lIEVUSEVSVFlQRV9MRU4gICAgICAgICAgIDIKKyNlbmRpZgorCisjaWZuZGVmIEVUSEVSVFlQRV9HUkVfSVNPCisjZGVmaW5lIEVUSEVSVFlQRV9HUkVfSVNPICAgICAgIDB4MDBGRSAgLyogbm90IHJlYWxseSBhbiBldGhlcnR5cGUgb25seSB1c2VkIGluIEdSRSAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9QVVAKKyNkZWZpbmUJRVRIRVJUWVBFX1BVUAkJMHgwMjAwCS8qIFBVUCBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUAorI2RlZmluZQlFVEhFUlRZUEVfSVAJCTB4MDgwMAkvKiBJUCBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9BUlAKKyNkZWZpbmUgRVRIRVJUWVBFX0FSUAkJMHgwODA2CS8qIEFkZHIuIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfUkVWQVJQCisjZGVmaW5lIEVUSEVSVFlQRV9SRVZBUlAJMHg4MDM1CS8qIHJldmVyc2UgQWRkci4gcmVzb2x1dGlvbiBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9OUworI2RlZmluZSBFVEhFUlRZUEVfTlMJCTB4MDYwMAorI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9TUFJJVEUKKyNkZWZpbmUJRVRIRVJUWVBFX1NQUklURQkweDA1MDAKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfVFJBSUwKKyNkZWZpbmUgRVRIRVJUWVBFX1RSQUlMCQkweDEwMDAKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfTU9QREwKKyNkZWZpbmUJRVRIRVJUWVBFX01PUERMCQkweDYwMDEKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfTU9QUkMKKyNkZWZpbmUJRVRIRVJUWVBFX01PUFJDCQkweDYwMDIKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfRE4KKyNkZWZpbmUJRVRIRVJUWVBFX0ROCQkweDYwMDMKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfTEFUCisjZGVmaW5lCUVUSEVSVFlQRV9MQVQJCTB4NjAwNAorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9TQ0EKKyNkZWZpbmUgRVRIRVJUWVBFX1NDQQkJMHg2MDA3CisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX0xBTkJSSURHRQorI2RlZmluZQlFVEhFUlRZUEVfTEFOQlJJREdFCTB4ODAzOAorI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9ERUNETlMKKyNkZWZpbmUJRVRIRVJUWVBFX0RFQ0ROUwkweDgwM2MKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfREVDRFRTCisjZGVmaW5lCUVUSEVSVFlQRV9ERUNEVFMJMHg4MDNlCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX1ZFWFAKKyNkZWZpbmUJRVRIRVJUWVBFX1ZFWFAJCTB4ODA1YgorI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9WUFJPRAorI2RlZmluZQlFVEhFUlRZUEVfVlBST0QJCTB4ODA1YworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9BVEFMSworI2RlZmluZSBFVEhFUlRZUEVfQVRBTEsJCTB4ODA5YgorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9BQVJQCisjZGVmaW5lIEVUSEVSVFlQRV9BQVJQCQkweDgwZjMKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfODAyMVEKKyNkZWZpbmUJRVRIRVJUWVBFXzgwMjFRCQkweDgxMDAKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVBYCisjZGVmaW5lIEVUSEVSVFlQRV9JUFgJCTB4ODEzNworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUFY2CisjZGVmaW5lIEVUSEVSVFlQRV9JUFY2CQkweDg2ZGQKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfUFBQCisjZGVmaW5lCUVUSEVSVFlQRV9QUFAJCTB4ODgwYgorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9TTE9XCisjZGVmaW5lCUVUSEVSVFlQRV9TTE9XCQkweDg4MDkKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfTVBMUworI2RlZmluZQlFVEhFUlRZUEVfTVBMUwkJMHg4ODQ3CisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX01QTFNfTVVMVEkKKyNkZWZpbmUJRVRIRVJUWVBFX01QTFNfTVVMVEkJMHg4ODQ4CisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX1BQUE9FRAorI2RlZmluZSBFVEhFUlRZUEVfUFBQT0VECTB4ODg2MworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9QUFBPRVMKKyNkZWZpbmUgRVRIRVJUWVBFX1BQUE9FUwkweDg4NjQKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSlVNQk8KKyNkZWZpbmUgRVRIRVJUWVBFX0pVTUJPICAgICAgICAgMHg4ODcwCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0VBUE9MCisjZGVmaW5lIEVUSEVSVFlQRV9FQVBPTCAgCTB4ODg4ZQorI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9MT09QQkFDSworI2RlZmluZQlFVEhFUlRZUEVfTE9PUEJBQ0sJMHg5MDAwCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX1ZNQU4KKyNkZWZpbmUJRVRIRVJUWVBFX1ZNQU4JICAgICAgICAweDkxMDAgLyogRXh0cmVtZSBWTUFOIFByb3RvY29sICovIAorI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9JU08KKyNkZWZpbmUJRVRIRVJUWVBFX0lTTyAgICAgICAgICAgMHhmZWZlICAvKiBub25zdGFuZGFyZCAtIHVzZWQgaW4gQ2lzY28gSERMQyBlbmNhcHN1bGF0aW9uICovCisjZW5kaWYKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0b2sgZXRoZXJ0eXBlX3ZhbHVlc1tdOwpkaWZmIC0tZ2l0IGEvZXh0cmFjdC5oIGIvZXh0cmFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGIyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRyYWN0LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2V4dHJhY3QuaCx2IDEuMjQgMjAwNS8wMS8xNSAwMjowNjo1MCBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogTWFjcm9zIHRvIGV4dHJhY3QgcG9zc2libHktdW5hbGlnbmVkIGJpZy1lbmRpYW4gaW50ZWdyYWwgdmFsdWVzLgorICovCisjaWZkZWYgTEJMX0FMSUdOCisvKgorICogVGhlIHByb2Nlc3NvciBkb2Vzbid0IG5hdGl2ZWx5IGhhbmRsZSB1bmFsaWduZWQgbG9hZHMuCisgKi8KKyNpZmRlZiBIQVZFX19fQVRUUklCVVRFX18KKy8qCisgKiBXZSBoYXZlIF9fYXR0cmlidXRlX187IHdlIGFzc3VtZSB0aGF0IG1lYW5zIHdlIGhhdmUgX19hdHRyaWJ1dGVfXygocGFja2VkKSkuCisgKiBEZWNsYXJlIHBhY2tlZCBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSB1X2ludDE2X3QgYW5kIGEgdV9pbnQzMl90LAorICogY2FzdCB0aGUgcG9pbnRlciB0byBwb2ludCB0byBvbmUgb2YgdGhvc2UsIGFuZCBmZXRjaCB0aHJvdWdoIGl0OworICogdGhlIEdDQyBtYW51YWwgZG9lc24ndCBhcHBlYXIgdG8gZXhwbGljaXRseSBzYXkgdGhhdAorICogX19hdHRyaWJ1dGVfXygocGFja2VkKSkgY2F1c2VzIHRoZSBjb21waWxlciB0byBnZW5lcmF0ZSB1bmFsaWduZWQtc2FmZQorICogY29kZSwgYnV0IGl0IGFwcHBlYXJzIHRvIGRvIHNvLgorICoKKyAqIFdlIGRvIHRoaXMgaW4gY2FzZSB0aGUgY29tcGlsZXIgY2FuIGdlbmVyYXRlLCBmb3IgdGhpcyBpbnN0cnVjdGlvbiBzZXQsCisgKiBiZXR0ZXIgY29kZSB0byBkbyBhbiB1bmFsaWduZWQgbG9hZCBhbmQgcGFzcyBzdHVmZiB0byAibnRvaHMoKSIgb3IKKyAqICJudG9obCgpIiB0aGFuIHRoZSBjb2RlIHRvIGZldGNoIHRoZSBieXRlcyBvbmUgYXQgYSB0aW1lIGFuZAorICogYXNzZW1ibGUgdGhlbS4gIChUaGF0IG1pZ2h0IG5vdCBiZSB0aGUgY2FzZSBvbiBhIGxpdHRsZS1lbmRpYW4gcGxhdGZvcm0sCisgKiB3aGVyZSAibnRvaHMoKSIgYW5kICJudG9obCgpIiBtaWdodCBub3QgYmUgZG9uZSBpbmxpbmUuKQorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQxNl90CXZhbDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdW5hbGlnbmVkX3VfaW50MTZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50MzJfdAl2YWw7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHVuYWxpZ25lZF91X2ludDMyX3Q7CisKKyNkZWZpbmUgRVhUUkFDVF8xNkJJVFMocCkgXAorCSgodV9pbnQxNl90KW50b2hzKCgoY29uc3QgdW5hbGlnbmVkX3VfaW50MTZfdCAqKShwKSktPnZhbCkpCisjZGVmaW5lIEVYVFJBQ1RfMzJCSVRTKHApIFwKKwkoKHVfaW50MzJfdCludG9obCgoKGNvbnN0IHVuYWxpZ25lZF91X2ludDMyX3QgKikocCkpLT52YWwpKQorI2RlZmluZSBFWFRSQUNUXzY0QklUUyhwKSBcCisJKCh1X2ludDY0X3QpKCgodV9pbnQ2NF90KW50b2hsKCgoY29uc3QgdW5hbGlnbmVkX3VfaW50MzJfdCAqKShwKSArIDApLT52YWwpKSA8PCAzMiB8IFwKKwkJICAgICAoKHVfaW50NjRfdCludG9obCgoKGNvbnN0IHVuYWxpZ25lZF91X2ludDMyX3QgKikocCkgKyAxKS0+dmFsKSkgPDwgMCkpCisKKyNlbHNlIC8qIEhBVkVfX19BVFRSSUJVVEVfXyAqLworLyoKKyAqIFdlIGRvbid0IGhhdmUgX19hdHRyaWJ1dGVfXywgc28gZG8gdW5hbGlnbmVkIGxvYWRzIG9mIGJpZy1lbmRpYW4KKyAqIHF1YW50aXRpZXMgdGhlIGhhcmQgd2F5IC0gZmV0Y2ggdGhlIGJ5dGVzIG9uZSBhdCBhIHRpbWUgYW5kCisgKiBhc3NlbWJsZSB0aGVtLgorICovCisjZGVmaW5lIEVYVFJBQ1RfMTZCSVRTKHApIFwKKwkoKHVfaW50MTZfdCkoKHVfaW50MTZfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApIDw8IDggfCBcCisJCSAgICAgKHVfaW50MTZfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpKSkKKyNkZWZpbmUgRVhUUkFDVF8zMkJJVFMocCkgXAorCSgodV9pbnQzMl90KSgodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMCkgPDwgMjQgfCBcCisJCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpIDw8IDE2IHwgXAorCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAyKSA8PCA4IHwgXAorCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAzKSkpCisjZGVmaW5lIEVYVFJBQ1RfNjRCSVRTKHApIFwKKwkoKHVfaW50NjRfdCkoKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApIDw8IDU2IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAxKSA8PCA0OCB8IFwKKwkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMikgPDwgNDAgfCBcCisJCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDMpIDw8IDMyIHwgXAorCSAgICAgICAgICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgNCkgPDwgMjQgfCBcCisJCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDUpIDw8IDE2IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyA2KSA8PCA4IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyA3KSkpCisjZW5kaWYgLyogSEFWRV9fX0FUVFJJQlVURV9fICovCisjZWxzZSAvKiBMQkxfQUxJR04gKi8KKy8qCisgKiBUaGUgcHJvY2Vzc29yIG5hdGl2ZWx5IGhhbmRsZXMgdW5hbGlnbmVkIGxvYWRzLCBzbyB3ZSBjYW4ganVzdAorICogY2FzdCB0aGUgcG9pbnRlciBhbmQgZmV0Y2ggdGhyb3VnaCBpdC4KKyAqLworI2RlZmluZSBFWFRSQUNUXzE2QklUUyhwKSBcCisJKCh1X2ludDE2X3QpbnRvaHMoKihjb25zdCB1X2ludDE2X3QgKikocCkpKQorI2RlZmluZSBFWFRSQUNUXzMyQklUUyhwKSBcCisJKCh1X2ludDMyX3QpbnRvaGwoKihjb25zdCB1X2ludDMyX3QgKikocCkpKQorI2RlZmluZSBFWFRSQUNUXzY0QklUUyhwKSBcCisJKCh1X2ludDY0X3QpKCgodV9pbnQ2NF90KW50b2hsKCooKGNvbnN0IHVfaW50MzJfdCAqKShwKSArIDApKSkgPDwgMzIgfCBcCisJCSAgICAgKCh1X2ludDY0X3QpbnRvaGwoKigoY29uc3QgdV9pbnQzMl90ICopKHApICsgMSkpKSA8PCAwKSkKKyNlbmRpZiAvKiBMQkxfQUxJR04gKi8KKworI2RlZmluZSBFWFRSQUNUXzI0QklUUyhwKSBcCisJKCh1X2ludDMyX3QpKCh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAwKSA8PCAxNiB8IFwKKwkJICAgICAodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMSkgPDwgOCB8IFwKKwkJICAgICAodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMikpKQorCisvKgorICogTWFjcm9zIHRvIGV4dHJhY3QgcG9zc2libHktdW5hbGlnbmVkIGxpdHRsZS1lbmRpYW4gaW50ZWdyYWwgdmFsdWVzLgorICogWFhYIC0gZG8gbG9hZHMgb24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcyB0aGF0IHN1cHBvcnQgdW5hbGlnbmVkIGxvYWRzPworICovCisjZGVmaW5lIEVYVFJBQ1RfTEVfOEJJVFMocCkgKCoocCkpCisjZGVmaW5lIEVYVFJBQ1RfTEVfMTZCSVRTKHApIFwKKwkoKHVfaW50MTZfdCkoKHVfaW50MTZfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpIDw8IDggfCBcCisJCSAgICAgKHVfaW50MTZfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApKSkKKyNkZWZpbmUgRVhUUkFDVF9MRV8zMkJJVFMocCkgXAorCSgodV9pbnQzMl90KSgodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMykgPDwgMjQgfCBcCisJCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDIpIDw8IDE2IHwgXAorCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAxKSA8PCA4IHwgXAorCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAwKSkpCisjZGVmaW5lIEVYVFJBQ1RfTEVfNjRCSVRTKHApIFwKKwkoKHVfaW50NjRfdCkoKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDcpIDw8IDU2IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyA2KSA8PCA0OCB8IFwKKwkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgNSkgPDwgNDAgfCBcCisJCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDQpIDw8IDMyIHwgXAorCSAgICAgICAgICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMykgPDwgMjQgfCBcCisJCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDIpIDw8IDE2IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAxKSA8PCA4IHwgXAorCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAwKSkpCmRpZmYgLS1naXQgYS9mZGRpLmggYi9mZGRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwYWY0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZkZGkuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9mZGRpLmgsdiAxLjExIDIwMDIvMTIvMTEgMDc6MTM6NTEgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIEJhc2VkIG9uIFVsdHJpeCBpZl9mZGRpLmgKKyAqLworCisvKgorICogVGhpcyBzdHVmZiBzaG91bGQgY29tZSBmcm9tIGEgc3lzdGVtIGhlYWRlciBmaWxlLCBidXQgdGhlcmUncyBubworICogb2J2aW91c2x5IHBvcnRhYmxlIHdheSB0byBkbyB0aGF0IGFuZCBpdCdzIG5vdCByZWFsbHkgZ29pbmcKKyAqIHRvIGNoYW5nZSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0gKGV4Y2VwdCBmb3IgdGhlIHBhZGRpbmcgYnVzaW5lc3MpLgorICovCisKK3N0cnVjdCBmZGRpX2hlYWRlciB7CisJdV9jaGFyICBmZGRpX2ZjOwkJLyogZnJhbWUgY29udHJvbCAqLworCXVfY2hhciAgZmRkaV9kaG9zdFs2XTsKKwl1X2NoYXIgIGZkZGlfc2hvc3RbNl07Cit9OworCisvKgorICogTGVuZ3RoIG9mIGFuIEZEREkgaGVhZGVyOyBub3RlIHRoYXQgc29tZSBjb21waWxlcnMgbWF5IHBhZAorICogInN0cnVjdCBmZGRpX2hlYWRlciIgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLCBmb3IgZXhhbXBsZSwgc28KKyAqICJzaXplb2YgKHN0cnVjdCBmZGRpX2hlYWRlcikiIG1heSBub3QgZ2l2ZSB0aGUgcmlnaHQKKyAqIGFuc3dlci4KKyAqLworI2RlZmluZSBGRERJX0hEUkxFTiAxMworCisvKiBVc2VmdWwgdmFsdWVzIGZvciBmZGRpX2ZjIChmcmFtZSBjb250cm9sKSBmaWVsZCAqLworCisvKgorICogRkRESSBGcmFtZSBDb250cm9sIGJpdHMKKyAqLworI2RlZmluZQlGRERJRkNfQwkJMHg4MAkJLyogQ2xhc3MgYml0ICovCisjZGVmaW5lCUZERElGQ19MCQkweDQwCQkvKiBBZGRyZXNzIGxlbmd0aCBiaXQgKi8KKyNkZWZpbmUJRkRESUZDX0YJCTB4MzAJCS8qIEZyYW1lIGZvcm1hdCBiaXRzICovCisjZGVmaW5lCUZERElGQ19aCQkweDBmCQkvKiBDb250cm9sIGJpdHMgKi8KKworLyoKKyAqIEZEREkgRnJhbWUgQ29udHJvbCB2YWx1ZXMuICg0OC1iaXQgYWRkcmVzc2luZyBvbmx5KS4KKyAqLworI2RlZmluZQlGRERJRkNfVk9JRAkJMHg0MAkJLyogVm9pZCBmcmFtZSAqLworI2RlZmluZQlGRERJRkNfTlJUCQkweDgwCQkvKiBOb25yZXN0cmljdGVkIHRva2VuICovCisjZGVmaW5lCUZERElGQ19SVAkJMHhjMAkJLyogUmVzdHJpY3RlZCB0b2tlbiAqLworI2RlZmluZQlGRERJRkNfU01UX0lORk8JCTB4NDEJCS8qIFNNVCBJbmZvICovCisjZGVmaW5lCUZERElGQ19TTVRfTlNBCQkweDRGCQkvKiBTTVQgTmV4dCBzdGF0aW9uIGFkcnMgKi8KKyNkZWZpbmUJRkRESUZDX01BQ19CRUFDT04JMHhjMgkJLyogTUFDIEJlYWNvbiBmcmFtZSAqLworI2RlZmluZQlGRERJRkNfTUFDX0NMQUlNCTB4YzMJCS8qIE1BQyBDbGFpbSBmcmFtZSAqLworI2RlZmluZQlGRERJRkNfTExDX0FTWU5DCTB4NTAJCS8qIEFzeW5jLiBMTEMgZnJhbWUgKi8KKyNkZWZpbmUJRkRESUZDX0xMQ19TWU5DCQkweGQwCQkvKiBTeW5jLiBMTEMgZnJhbWUgKi8KKyNkZWZpbmUJRkRESUZDX0lNUF9BU1lOQwkweDYwCQkvKiBJbXBsZW1lbnRvciBBc3luYy4gKi8KKyNkZWZpbmUJRkRESUZDX0lNUF9TWU5DCQkweGUwCQkvKiBJbXBsZW1lbnRvciBTeW5jaC4gKi8KKyNkZWZpbmUgRkRESUZDX1NNVAkJMHg0MAkJLyogU01UIGZyYW1lICovCisjZGVmaW5lIEZERElGQ19NQUMJCTB4YzAJCS8qIE1BQyBmcmFtZSAqLworCisjZGVmaW5lCUZERElGQ19DTEZGCQkweEYwCQkvKiBDbGFzcy9MZW5ndGgvRm9ybWF0IGJpdHMgKi8KKyNkZWZpbmUJRkRESUZDX1paWloJCTB4MEYJCS8qIENvbnRyb2wgYml0cyAqLwpkaWZmIC0tZ2l0IGEvZ21wbHMuYyBiL2dtcGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0YjlhZQotLS0gL2Rldi9udWxsCisrKyBiL2dtcGxzLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9nbXBscy5jLHYgMS41LjIuMSAyMDA1LzA1LzE5IDA2OjQ0OjAyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisvKiByZmMzNDcxICovCitzdHJ1Y3QgdG9rIGdtcGxzX2xpbmtfcHJvdF92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJFeHRyYSBUcmFmZmljIn0sCisgICAgeyAweDAyLCAiVW5wcm90ZWN0ZWQifSwKKyAgICB7IDB4MDQsICJTaGFyZWQifSwKKyAgICB7IDB4MDgsICJEZWRpY2F0ZWQgMToxIn0sCisgICAgeyAweDEwLCAiRGVkaWNhdGVkIDErMSJ9LAorICAgIHsgMHgyMCwgIkVuaGFuY2VkIn0sCisgICAgeyAweDQwLCAiUmVzZXJ2ZWQifSwKKyAgICB7IDB4ODAsICJSZXNlcnZlZCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisvKiByZmMzNDcxICovCitzdHJ1Y3QgdG9rIGdtcGxzX3N3aXRjaF9jYXBfdmFsdWVzW10gPSB7CisgICAgeyAxLAkiUGFja2V0LVN3aXRjaCBDYXBhYmxlLTEifSwKKyAgICB7IDIsCSJQYWNrZXQtU3dpdGNoIENhcGFibGUtMiJ9LAorICAgIHsgMywJIlBhY2tldC1Td2l0Y2ggQ2FwYWJsZS0zIn0sCisgICAgeyA0LAkiUGFja2V0LVN3aXRjaCBDYXBhYmxlLTQifSwKKyAgICB7IDUxLAkiTGF5ZXItMiBTd2l0Y2ggQ2FwYWJsZSJ9LAorICAgIHsgMTAwLAkiVGltZS1EaXZpc2lvbi1NdWx0aXBsZXgifSwKKyAgICB7IDE1MCwJIkxhbWJkYS1Td2l0Y2ggQ2FwYWJsZSJ9LAorICAgIHsgMjAwLAkiRmliZXItU3dpdGNoIENhcGFibGUifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworLyogcmZjMzQ3MSAqLworc3RydWN0IHRvayBnbXBsc19lbmNvZGluZ192YWx1ZXNbXSA9IHsKKyAgICB7IDEsICAgICJQYWNrZXQifSwKKyAgICB7IDIsICAgICJFdGhlcm5ldCBWMi9ESVgifSwKKyAgICB7IDMsICAgICJBTlNJL0VUU0kgUERIIn0sCisgICAgeyA0LCAgICAiUmVzZXJ2ZWQifSwKKyAgICB7IDUsICAgICJTREggSVRVLVQgRy43MDcvU09ORVQgQU5TSSBUMS4xMDUifSwKKyAgICB7IDYsICAgICJSZXNlcnZlZCJ9LAorICAgIHsgNywgICAgIkRpZ2l0YWwgV3JhcHBlciJ9LAorICAgIHsgOCwgICAgIkxhbWJkYSAocGhvdG9uaWMpIn0sCisgICAgeyA5LCAgICAiRmliZXIifSwKKyAgICB7IDEwLCAgICJSZXNlcnZlZCJ9LAorICAgIHsgMTEsICAgIkZpYmVyQ2hhbm5lbCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisvKiByZmMzNDcxICovCitzdHJ1Y3QgdG9rIGdtcGxzX3BheWxvYWRfdmFsdWVzW10gPSB7CisgICAgeyAgMCwgICAiVW5rbm93biJ9LAorICAgIHsgIDEsICAgIlJlc2VydmVkIn0sCisgICAgeyAgMiwgICAiUmVzZXJ2ZWQifSwKKyAgICB7ICAzLCAgICJSZXNlcnZlZCJ9LAorICAgIHsgIDQsICAgIlJlc2VydmVkIn0sCisgICAgeyAgNSwgICAiQXN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRTQifSwKKyAgICB7ICA2LCAgICJBc3luY2hyb25vdXMgbWFwcGluZyBvZiBEUzMvVDMifSwKKyAgICB7ICA3LCAgICJBc3luY2hyb25vdXMgbWFwcGluZyBvZiBFMyJ9LAorICAgIHsgIDgsICAgIkJpdCBzeW5jaHJvbm91cyBtYXBwaW5nIG9mIEUzIn0sCisgICAgeyAgOSwgICAiQnl0ZSBzeW5jaHJvbm91cyBtYXBwaW5nIG9mIEUzIn0sCisgICAgeyAxMCwgICAiQXN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRFMyL1QyIn0sCisgICAgeyAxMSwgICAiQml0IHN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRFMyL1QyIn0sCisgICAgeyAxMiwgICAiUmVzZXJ2ZWQifSwKKyAgICB7IDEzLCAgICJBc3luY2hyb25vdXMgbWFwcGluZyBvZiBFMSJ9LAorICAgIHsgMTQsICAgIkJ5dGUgc3luY2hyb25vdXMgbWFwcGluZyBvZiBFMSJ9LAorICAgIHsgMTUsICAgIkJ5dGUgc3luY2hyb25vdXMgbWFwcGluZyBvZiAzMSAqIERTMCJ9LAorICAgIHsgMTYsICAgIkFzeW5jaHJvbm91cyBtYXBwaW5nIG9mIERTMS9UMSJ9LAorICAgIHsgMTcsICAgIkJpdCBzeW5jaHJvbm91cyBtYXBwaW5nIG9mIERTMS9UMSJ9LAorICAgIHsgMTgsICAgIkJ5dGUgc3luY2hyb25vdXMgbWFwcGluZyBvZiBEUzEvVDEifSwKKyAgICB7IDE5LCAgICJWQy0xMSBpbiBWQy0xMiJ9LAorICAgIHsgMjAsICAgIlJlc2VydmVkIn0sCisgICAgeyAyMSwgICAiUmVzZXJ2ZWQifSwKKyAgICB7IDIyLCAgICJEUzEgU0YgQXN5bmNocm9ub3VzIn0sCisgICAgeyAyMywgICAiRFMxIEVTRiBBc3luY2hyb25vdXMifSwKKyAgICB7IDI0LCAgICJEUzMgTTIzIEFzeW5jaHJvbm91cyJ9LAorICAgIHsgMjUsICAgIkRTMyBDLUJpdCBQYXJpdHkgQXN5bmNocm9ub3VzIn0sCisgICAgeyAyNiwgICAiVlQvTE9WQyJ9LAorICAgIHsgMjcsICAgIlNUUyBTUEUvSE9WQyJ9LAorICAgIHsgMjgsICAgIlBPUyAtIE5vIFNjcmFtYmxpbmcsIDE2IGJpdCBDUkMifSwKKyAgICB7IDI5LCAgICJQT1MgLSBObyBTY3JhbWJsaW5nLCAzMiBiaXQgQ1JDIn0sCisgICAgeyAzMCwgICAiUE9TIC0gU2NyYW1ibGluZywgMTYgYml0IENSQyJ9LAorICAgIHsgMzEsICAgIlBPUyAtIFNjcmFtYmxpbmcsIDMyIGJpdCBDUkMifSwKKyAgICB7IDMyLCAgICJBVE0gbWFwcGluZyJ9LAorICAgIHsgMzMsICAgIkV0aGVybmV0IFBIWSJ9LAorICAgIHsgMzQsICAgIlNPTkVUL1NESCJ9LAorICAgIHsgMzUsICAgIlJlc2VydmVkIChTT05FVCBkZXByZWNhdGVkKSJ9LAorICAgIHsgMzYsICAgIkRpZ2l0YWwgV3JhcHBlciJ9LAorICAgIHsgMzcsICAgIkxhbWJkYSJ9LAorICAgIHsgMzgsICAgIkFOU0kvRVRTSSBQREgifSwKKyAgICB7IDM5LCAgICJSZXNlcnZlZCJ9LAorICAgIHsgNDAsICAgIkxpbmsgQWNjZXNzIFByb3RvY29sIFNESCAoWC44NSBhbmQgWC44NikifSwKKyAgICB7IDQxLCAgICJGRERJIn0sCisgICAgeyA0MiwgICAiRFFEQiAoRVRTSSBFVFMgMzAwIDIxNikifSwKKyAgICB7IDQzLCAgICJGaWJlckNoYW5uZWwtMyAoU2VydmljZXMpIn0sCisgICAgeyA0NCwgICAiSERMQyJ9LAorICAgIHsgNDUsICAgIkV0aGVybmV0IFYyL0RJWCAob25seSkifSwKKyAgICB7IDQ2LCAgICJFdGhlcm5ldCA4MDIuMyAob25seSkifSwKKy8qIGRyYWZ0LWlldGYtY2NhbXAtZ21wbHMtZzcwOS0wNC50eHQgKi8KKyAgICB7IDQ3LCAgICJHLjcwOSBPRFVqIn0sCisgICAgeyA0OCwgICAiRy43MDkgT1RVayh2KSJ9LAorICAgIHsgNDksICAgIkNCUi9DQlJhIn0sCisgICAgeyA1MCwgICAiQ0JSYiJ9LAorICAgIHsgNTEsICAgIkJTT1QifSwKKyAgICB7IDUyLCAgICJCU05UIn0sCisgICAgeyA1MywgICAiSVAvUFBQIChHRlApIn0sCisgICAgeyA1NCwgICAiRXRoZXJuZXQgTUFDIChmcmFtZWQgR0ZQKSJ9LAorICAgIHsgNTUsICAgIkV0aGVybmV0IFBIWSAodHJhbnNwYXJlbnQgR0ZQKSJ9LAorICAgIHsgNTYsICAgIkVTQ09OIn0sCisgICAgeyA1NywgICAiRklDT04ifSwKKyAgICB7IDU4LCAgICJGaWJlciBDaGFubmVsIn0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qIAorICogTGluayBUeXBlIHZhbHVlcyB1c2VkIGJ5IExNUCBTZXJ2aWNlIERpc2NvdmVyeSAoc3BlY2lmaWNhbGx5LCB0aGUgQ2xpZW50IAorICogUG9ydCBTZXJ2aWNlIEF0dHJpYnV0ZXMgT2JqZWN0KS4gU2VlIFVOSSAxLjAgc2VjdGlvbiA5LjQuMiBmb3IgZGV0YWlscy4KKyAqLworc3RydWN0IHRvayBsbXBfc2Rfc2VydmljZV9jb25maWdfY3BzYV9saW5rX3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyA1LCAiU0RIIElUVS1UIEcuNzA3In0sCisgICAgeyA2LCAiU09ORVQgQU5TSSBUMS4xMDUifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiAKKyAqIFNpZ25hbCBUeXBlIHZhbHVlcyBmb3IgU0RIIGxpbmtzIHVzZWQgYnkgTE1QIFNlcnZpY2UgRGlzY292ZXJ5IChzcGVjaWZpY2FsbHksIAorICogdGhlIENsaWVudCBQb3J0IFNlcnZpY2UgQXR0cmlidXRlcyBPYmplY3QpLiBTZWUgVU5JIDEuMCBzZWN0aW9uIDkuNC4yIGZvciAKKyAqIGRldGFpbHMuCisgKi8KK3N0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2Ffc2lnbmFsX3R5cGVfc2RoX3ZhbHVlc1tdID0geworICAgIHsgNSwgICJWQy0zIn0sCisgICAgeyA2LCAgIlZDLTQifSwKKyAgICB7IDcsICAiU1RNLTAifSwKKyAgICB7IDgsICAiU1RNLTEifSwKKyAgICB7IDksICAiU1RNLTQifSwKKyAgICB7IDEwLCAiU1RNLTE2In0sCisgICAgeyAxMSwgIlNUTS02NCJ9LAorICAgIHsgMTIsICJTVE0tMjU2In0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogCisgKiBTaWduYWwgVHlwZSB2YWx1ZXMgZm9yIFNPTkVUIGxpbmtzIHVzZWQgYnkgTE1QIFNlcnZpY2UgRGlzY292ZXJ5IChzcGVjaWZpY2FsbHksIAorICogdGhlIENsaWVudCBQb3J0IFNlcnZpY2UgQXR0cmlidXRlcyBPYmplY3QpLiBTZWUgVU5JIDEuMCBzZWN0aW9uIDkuNC4yIGZvciAKKyAqIGRldGFpbHMuCisgKi8KK3N0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2Ffc2lnbmFsX3R5cGVfc29uZXRfdmFsdWVzW10gPSB7CisgICAgeyA1LCAgIlNUUy0xIFNQRSJ9LAorICAgIHsgNiwgICJTVFMtM2MgU1BFIn0sCisgICAgeyA3LCAgIlNUUy0xIn0sCisgICAgeyA4LCAgIlNUTS0zIn0sCisgICAgeyA5LCAgIlNUTS0xMiJ9LAorICAgIHsgMTAsICJTVE0tNDgifSwKKyAgICB7IDExLCAiU1RNLTE5MiJ9LAorICAgIHsgMTIsICJTVE0tNzY4In0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZSBESUZGU0VSVl9CQ19NT0RFTF9SRE0gICAgICAgICAgIDAgICAvKiBkcmFmdC1pZXRmLXRld2ctZGlmZi10ZS1wcm90by0wNyAqLworI2RlZmluZSBESUZGU0VSVl9CQ19NT0RFTF9NQU0gICAgICAgICAgIDEgICAvKiBkcmFmdC1pZXRmLXRld2ctZGlmZi10ZS1wcm90by0wNyAqLyAKKyNkZWZpbmUgRElGRlNFUlZfQkNfTU9ERUxfRVhURF9NQU0gICAgICAyNTQgLyogZXhwZXJpbWVudGFsICovCisKK3N0cnVjdCB0b2sgZGlmZnNlcnZfdGVfYmNfdmFsdWVzW10gPSB7CisgICAgeyAgRElGRlNFUlZfQkNfTU9ERUxfUkRNLCAiUnVzc2lhbiBkb2xscyJ9LAorICAgIHsgIERJRkZTRVJWX0JDX01PREVMX01BTSwgIk1heGltdW0gYWxsb2NhdGlvbiJ9LAorICAgIHsgIERJRkZTRVJWX0JDX01PREVMX0VYVERfTUFNLCAiTWF4aW11bSBhbGxvY2F0aW9uIHdpdGggRS1MU1Agc3VwcG9ydCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OwpkaWZmIC0tZ2l0IGEvZ21wbHMuaCBiL2dtcGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzZjA1MQotLS0gL2Rldi9udWxsCisrKyBiL2dtcGxzLmgKQEAgLTAsMCArMSwyNCBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9nbXBscy5oLHYgMS4zLjIuMSAyMDA1LzA1LzE5IDA2OjQ0OjAzIGd1eSBFeHAgJCAoTEJMKSAqLworLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKK2V4dGVybiBzdHJ1Y3QgdG9rIGdtcGxzX2xpbmtfcHJvdF92YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGdtcGxzX3N3aXRjaF9jYXBfdmFsdWVzW107CitleHRlcm4gc3RydWN0IHRvayBnbXBsc19lbmNvZGluZ192YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGdtcGxzX3BheWxvYWRfdmFsdWVzW107CitleHRlcm4gc3RydWN0IHRvayBkaWZmc2Vydl90ZV9iY192YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX2xpbmtfdHlwZV92YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NkaF92YWx1ZXNbXTsKK2V4dGVybiBzdHJ1Y3QgdG9rIGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NvbmV0X3ZhbHVlc1tdOwpkaWZmIC0tZ2l0IGEvZ210MmxvY2FsLmMgYi9nbXQybG9jYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjZlODZjCi0tLSAvZGV2L251bGwKKysrIGIvZ210MmxvY2FsLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2dtdDJsb2NhbC5jLHYgMS45IDIwMDMvMTEvMTYgMDk6MzY6MDkgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImdtdDJsb2NhbC5oIgorCisvKgorICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdtdCBhbmQgbG9jYWwgdGltZSBpbiBzZWNvbmRzLgorICogVXNlIGdtdGltZSgpIGFuZCBsb2NhbHRpbWUoKSB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCisgKi8KK2ludDMyX3QKK2dtdDJsb2NhbCh0aW1lX3QgdCkKK3sKKwlyZWdpc3RlciBpbnQgZHQsIGRpcjsKKwlyZWdpc3RlciBzdHJ1Y3QgdG0gKmdtdCwgKmxvYzsKKwlzdHJ1Y3QgdG0gc2dtdDsKKworCWlmICh0ID09IDApCisJCXQgPSB0aW1lKE5VTEwpOworCWdtdCA9ICZzZ210OworCSpnbXQgPSAqZ210aW1lKCZ0KTsKKwlsb2MgPSBsb2NhbHRpbWUoJnQpOworCWR0ID0gKGxvYy0+dG1faG91ciAtIGdtdC0+dG1faG91cikgKiA2MCAqIDYwICsKKwkgICAgKGxvYy0+dG1fbWluIC0gZ210LT50bV9taW4pICogNjA7CisKKwkvKgorCSAqIElmIHRoZSB5ZWFyIG9yIGp1bGlhbiBkYXkgaXMgZGlmZmVyZW50LCB3ZSBzcGFuIDAwOjAwIEdNVAorCSAqIGFuZCBtdXN0IGFkZCBvciBzdWJ0cmFjdCBhIGRheS4gQ2hlY2sgdGhlIHllYXIgZmlyc3QgdG8KKwkgKiBhdm9pZCBwcm9ibGVtcyB3aGVuIHRoZSBqdWxpYW4gZGF5IHdyYXBzLgorCSAqLworCWRpciA9IGxvYy0+dG1feWVhciAtIGdtdC0+dG1feWVhcjsKKwlpZiAoZGlyID09IDApCisJCWRpciA9IGxvYy0+dG1feWRheSAtIGdtdC0+dG1feWRheTsKKwlkdCArPSBkaXIgKiAyNCAqIDYwICogNjA7CisKKwlyZXR1cm4gKGR0KTsKK30KZGlmZiAtLWdpdCBhL2dtdDJsb2NhbC5oIGIvZ210MmxvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMGU5NgotLS0gL2Rldi9udWxsCisrKyBiL2dtdDJsb2NhbC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2dtdDJsb2NhbC5oLHYgMS4yLjEuMSAxOTk5LzEwLzA3IDIzOjQ3OjEwIG1jciBFeHAgJCAoTEJMKQorICovCisjaWZuZGVmIGdtdDJsb2NhbF9oCisjZGVmaW5lIGdtdDJsb2NhbF9oCisKK2ludDMyX3QgZ210MmxvY2FsKHRpbWVfdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ljbXA2LmggYi9pY21wNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTUxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9pY21wNi5oCkBAIC0wLDAgKzEsNDU2IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2ljbXA2LmgsdiAxLjE2LjIuMSAyMDA1LzA5LzA1IDA5OjI5OjI4IGd1eSBFeHAgJCAoTEJMKSAqLworLyoJJE5ldEJTRDogaWNtcDYuaCx2IDEuMTMgMjAwMC8wOC8wMyAxNjozMDozNyBpdG9qdW4gRXhwICQJKi8KKy8qCSRLQU1FOiBpY21wNi5oLHYgMS4yMiAyMDAwLzA4LzAzIDE1OjI1OjE2IGppbm1laSBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpcF9pY21wLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICovCisKKyNpZm5kZWYgX05FVElORVRfSUNNUDZfSF8KKyNkZWZpbmUgX05FVElORVRfSUNNUDZfSF8KKworc3RydWN0IGljbXA2X2hkciB7CisJdV9pbnQ4X3QJaWNtcDZfdHlwZTsJLyogdHlwZSBmaWVsZCAqLworCXVfaW50OF90CWljbXA2X2NvZGU7CS8qIGNvZGUgZmllbGQgKi8KKwl1X2ludDE2X3QJaWNtcDZfY2tzdW07CS8qIGNoZWNrc3VtIGZpZWxkICovCisJdW5pb24geworCQl1X2ludDMyX3QJaWNtcDZfdW5fZGF0YTMyWzFdOyAvKiB0eXBlLXNwZWNpZmljIGZpZWxkICovCisJCXVfaW50MTZfdAlpY21wNl91bl9kYXRhMTZbMl07IC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KKwkJdV9pbnQ4X3QJaWNtcDZfdW5fZGF0YThbNF07ICAvKiB0eXBlLXNwZWNpZmljIGZpZWxkICovCisJfSBpY21wNl9kYXRhdW47Cit9OworCisjZGVmaW5lIGljbXA2X2RhdGEzMglpY21wNl9kYXRhdW4uaWNtcDZfdW5fZGF0YTMyCisjZGVmaW5lIGljbXA2X2RhdGExNglpY21wNl9kYXRhdW4uaWNtcDZfdW5fZGF0YTE2CisjZGVmaW5lIGljbXA2X2RhdGE4CWljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhOAorI2RlZmluZSBpY21wNl9wcHRyCWljbXA2X2RhdGEzMlswXQkJLyogcGFyYW1ldGVyIHByb2IgKi8KKyNkZWZpbmUgaWNtcDZfbXR1CWljbXA2X2RhdGEzMlswXQkJLyogcGFja2V0IHRvbyBiaWcgKi8KKyNkZWZpbmUgaWNtcDZfaWQJaWNtcDZfZGF0YTE2WzBdCQkvKiBlY2hvIHJlcXVlc3QvcmVwbHkgKi8KKyNkZWZpbmUgaWNtcDZfc2VxCWljbXA2X2RhdGExNlsxXQkJLyogZWNobyByZXF1ZXN0L3JlcGx5ICovCisjZGVmaW5lIGljbXA2X21heGRlbGF5CWljbXA2X2RhdGExNlswXQkJLyogbWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCAqLworCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNICQkxCS8qIGRlc3QgdW5yZWFjaGFibGUsIGNvZGVzOiAqLworI2RlZmluZSBJQ01QNl9QQUNLRVRfVE9PX0JJRwkJMgkvKiBwYWNrZXQgdG9vIGJpZyAqLworI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFREVECQkzCS8qIHRpbWUgZXhjZWVkZWQsIGNvZGU6ICovCisjZGVmaW5lIElDTVA2X1BBUkFNX1BST0IJCTQJLyogaXA2IGhlYWRlciBiYWQgKi8KKworI2RlZmluZSBJQ01QNl9FQ0hPX1JFUVVFU1QJCTEyOAkvKiBlY2hvIHNlcnZpY2UgKi8KKyNkZWZpbmUgSUNNUDZfRUNIT19SRVBMWQkJMTI5CS8qIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUgSUNNUDZfTUVNQkVSU0hJUF9RVUVSWQkJMTMwCS8qIGdyb3VwIG1lbWJlcnNoaXAgcXVlcnkgKi8KKyNkZWZpbmUgTUxENl9MSVNURU5FUl9RVUVSWQkJMTMwIAkvKiBtdWx0aWNhc3QgbGlzdGVuZXIgcXVlcnkgKi8KKyNkZWZpbmUgSUNNUDZfTUVNQkVSU0hJUF9SRVBPUlQJCTEzMQkvKiBncm91cCBtZW1iZXJzaGlwIHJlcG9ydCAqLworI2RlZmluZSBNTEQ2X0xJU1RFTkVSX1JFUE9SVAkJMTMxCS8qIG11bHRpY2FzdCBsaXN0ZW5lciByZXBvcnQgKi8KKyNkZWZpbmUgSUNNUDZfTUVNQkVSU0hJUF9SRURVQ1RJT04JMTMyCS8qIGdyb3VwIG1lbWJlcnNoaXAgdGVybWluYXRpb24gKi8KKyNkZWZpbmUgTUxENl9MSVNURU5FUl9ET05FCQkxMzIJLyogbXVsdGljYXN0IGxpc3RlbmVyIGRvbmUgKi8KKworI2RlZmluZSBORF9ST1VURVJfU09MSUNJVAkJMTMzCS8qIHJvdXRlciBzb2xpY2l0YXRpb24gKi8KKyNkZWZpbmUgTkRfUk9VVEVSX0FEVkVSVAkJMTM0CS8qIHJvdXRlciBhZHZlcnRpc2VtZW50ICovCisjZGVmaW5lIE5EX05FSUdIQk9SX1NPTElDSVQJCTEzNQkvKiBuZWlnaGJvciBzb2xpY2l0YXRpb24gKi8KKyNkZWZpbmUgTkRfTkVJR0hCT1JfQURWRVJUCQkxMzYJLyogbmVpZ2hib3IgYWR2ZXJ0aXNlbWVudCAqLworI2RlZmluZSBORF9SRURJUkVDVAkJCTEzNwkvKiByZWRpcmVjdCAqLworCisjZGVmaW5lIElDTVA2X1JPVVRFUl9SRU5VTUJFUklORwkxMzgJLyogcm91dGVyIHJlbnVtYmVyaW5nICovCisKKyNkZWZpbmUgSUNNUDZfV1JVUkVRVUVTVAkJMTM5CS8qIHdobyBhcmUgeW91IHJlcXVlc3QgKi8KKyNkZWZpbmUgSUNNUDZfV1JVUkVQTFkJCQkxNDAJLyogd2hvIGFyZSB5b3UgcmVwbHkgKi8KKyNkZWZpbmUgSUNNUDZfRlFETl9RVUVSWQkJMTM5CS8qIEZRRE4gcXVlcnkgKi8KKyNkZWZpbmUgSUNNUDZfRlFETl9SRVBMWQkJMTQwCS8qIEZRRE4gcmVwbHkgKi8KKyNkZWZpbmUgSUNNUDZfTklfUVVFUlkJCQkxMzkJLyogbm9kZSBpbmZvcm1hdGlvbiByZXF1ZXN0ICovCisjZGVmaW5lIElDTVA2X05JX1JFUExZCQkJMTQwCS8qIG5vZGUgaW5mb3JtYXRpb24gcmVwbHkgKi8KKyNkZWZpbmUgSU5EX1NPTElDSVQJCQkxNDEJLyogaW52ZXJzZSBuZWlnaGJvciBzb2xpY2l0YXRpb24gKi8KKyNkZWZpbmUgSU5EX0FEVkVSVAkJCTE0MgkvKiBpbnZlcnNlIG5laWdoYm9yIGFkdmVydGlzZW1lbnQgKi8KKworI2RlZmluZSBJQ01QNl9WMl9NRU1CRVJTSElQX1JFUE9SVAkxNDMJLyogdjIgbWVtYmVyc2hpcCByZXBvcnQgKi8KKyNkZWZpbmUgTUxEVjJfTElTVEVORVJfUkVQT1JUCQkxNDMJLyogdjIgbXVsdGljYXN0IGxpc3RlbmVyIHJlcG9ydCAqLworI2RlZmluZSBJQ01QNl9IQURJU0NPVl9SRVFVRVNUCQkxNDQKKyNkZWZpbmUgSUNNUDZfSEFESVNDT1ZfUkVQTFkJCTE0NQorI2RlZmluZSBJQ01QNl9NT0JJTEVQUkVGSVhfU09MSUNJVAkxNDYKKyNkZWZpbmUgSUNNUDZfTU9CSUxFUFJFRklYX0FEVkVSVAkxNDcKKworI2RlZmluZSBNTEQ2X01UUkFDRV9SRVNQCQkyMDAJLyogbXRyYWNlIHJlc3BvbnNlKHRvIHNlbmRlcikgKi8KKyNkZWZpbmUgTUxENl9NVFJBQ0UJCQkyMDEJLyogbXRyYWNlIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgSUNNUDZfTUFYVFlQRQkJCTIwMQorCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEUJMAkvKiBubyByb3V0ZSB0byBkZXN0aW5hdGlvbiAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTgkgCTEJLyogYWRtaW5pc3RyYXRpdmVseSBwcm9oaWJpdGVkICovCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX05PVE5FSUdIQk9SCTIJLyogbm90IGEgbmVpZ2hib3Iob2Jzb2xldGUpICovCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX0JFWU9ORFNDT1BFCTIJLyogYmV5b25kIHNjb3BlIG9mIHNvdXJjZSBhZGRyZXNzICovCisjZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX0FERFIJCTMJLyogYWRkcmVzcyB1bnJlYWNoYWJsZSAqLworI2RlZmluZSBJQ01QNl9EU1RfVU5SRUFDSF9OT1BPUlQJNAkvKiBwb3J0IHVucmVhY2hhYmxlICovCisKKyNkZWZpbmUgSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCAJMAkvKiB0dGw9PTAgaW4gdHJhbnNpdCAqLworI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFRF9SRUFTU0VNQkxZCTEJLyogdHRsPT0wIGluIHJlYXNzICovCisKKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX0hFQURFUiAJIAkwCS8qIGVycm9uZW91cyBoZWFkZXIgZmllbGQgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX05FWFRIRUFERVIJMQkvKiB1bnJlY29nbml6ZWQgbmV4dCBoZWFkZXIgKi8KKyNkZWZpbmUgSUNNUDZfUEFSQU1QUk9CX09QVElPTgkJMgkvKiB1bnJlY29nbml6ZWQgb3B0aW9uICovCisKKyNkZWZpbmUgSUNNUDZfSU5GT01TR19NQVNLCQkweDgwCS8qIGFsbCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzICovCisKKyNkZWZpbmUgSUNNUDZfTklfU1VCSl9JUFY2CTAJLyogUXVlcnkgU3ViamVjdCBpcyBhbiBJUHY2IGFkZHJlc3MgKi8KKyNkZWZpbmUgSUNNUDZfTklfU1VCSl9GUUROCTEJLyogUXVlcnkgU3ViamVjdCBpcyBhIERvbWFpbiBuYW1lICovCisjZGVmaW5lIElDTVA2X05JX1NVQkpfSVBWNAkyCS8qIFF1ZXJ5IFN1YmplY3QgaXMgYW4gSVB2NCBhZGRyZXNzICovCisKKyNkZWZpbmUgSUNNUDZfTklfU1VDQ0VTUwkwCS8qIG5vZGUgaW5mb3JtYXRpb24gc3VjY2Vzc2Z1bCByZXBseSAqLworI2RlZmluZSBJQ01QNl9OSV9SRUZVU0VECTEJLyogbm9kZSBpbmZvcm1hdGlvbiByZXF1ZXN0IGlzIHJlZnVzZWQgKi8KKyNkZWZpbmUgSUNNUDZfTklfVU5LTk9XTgkyCS8qIHVua25vd24gUXR5cGUgKi8KKworI2RlZmluZSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkdfQ09NTUFORCAgMAkvKiByciBjb21tYW5kICovCisjZGVmaW5lIElDTVA2X1JPVVRFUl9SRU5VTUJFUklOR19SRVNVTFQgICAxCS8qIHJyIHJlc3VsdCAqLworI2RlZmluZSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkdfU0VRTlVNX1JFU0VUICAgMjU1CS8qIHJyIHNlcSBudW0gcmVzZXQgKi8KKworLyogVXNlZCBpbiBrZXJuZWwgb25seSAqLworI2RlZmluZSBORF9SRURJUkVDVF9PTkxJTksJMAkvKiByZWRpcmVjdCB0byBhbiBvbi1saW5rIG5vZGUgKi8KKyNkZWZpbmUgTkRfUkVESVJFQ1RfUk9VVEVSCTEJLyogcmVkaXJlY3QgdG8gYSBiZXR0ZXIgcm91dGVyICovCisKKy8qCisgKiBNdWx0aWNhc3QgTGlzdGVuZXIgRGlzY292ZXJ5CisgKi8KK3N0cnVjdCBtbGQ2X2hkciB7CisJc3RydWN0IGljbXA2X2hkcgltbGQ2X2hkcjsKKwlzdHJ1Y3QgaW42X2FkZHIJCW1sZDZfYWRkcjsgLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUgbWxkNl90eXBlCW1sZDZfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbWxkNl9jb2RlCW1sZDZfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbWxkNl9ja3N1bQltbGQ2X2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBtbGQ2X21heGRlbGF5CW1sZDZfaGRyLmljbXA2X2RhdGExNlswXQorI2RlZmluZSBtbGQ2X3Jlc2VydmVkCW1sZDZfaGRyLmljbXA2X2RhdGExNlsxXQorCisjZGVmaW5lIE1MRF9NSU5MRU4JMjQKKyNkZWZpbmUgTUxEVjJfTUlOTEVOCTI4CisKKy8qCisgKiBOZWlnaGJvciBEaXNjb3ZlcnkKKyAqLworCitzdHJ1Y3QgbmRfcm91dGVyX3NvbGljaXQgewkvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCisJc3RydWN0IGljbXA2X2hkciAJbmRfcnNfaGRyOworCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KK307CisKKyNkZWZpbmUgbmRfcnNfdHlwZQluZF9yc19oZHIuaWNtcDZfdHlwZQorI2RlZmluZSBuZF9yc19jb2RlCW5kX3JzX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JzX2Nrc3VtCW5kX3JzX2hkci5pY21wNl9ja3N1bQorI2RlZmluZSBuZF9yc19yZXNlcnZlZAluZF9yc19oZHIuaWNtcDZfZGF0YTMyWzBdCisKK3N0cnVjdCBuZF9yb3V0ZXJfYWR2ZXJ0IHsJLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KKwlzdHJ1Y3QgaWNtcDZfaGRyCW5kX3JhX2hkcjsKKwl1X2ludDMyX3QJCW5kX3JhX3JlYWNoYWJsZTsJLyogcmVhY2hhYmxlIHRpbWUgKi8KKwl1X2ludDMyX3QJCW5kX3JhX3JldHJhbnNtaXQ7CS8qIHJldHJhbnNtaXQgdGltZXIgKi8KKwkvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisjZGVmaW5lIG5kX3JhX3R5cGUJCW5kX3JhX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX3JhX2NvZGUJCW5kX3JhX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JhX2Nrc3VtCQluZF9yYV9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcmFfY3VyaG9wbGltaXQJbmRfcmFfaGRyLmljbXA2X2RhdGE4WzBdCisjZGVmaW5lIG5kX3JhX2ZsYWdzX3Jlc2VydmVkCW5kX3JhX2hkci5pY21wNl9kYXRhOFsxXQorI2RlZmluZSBORF9SQV9GTEFHX01BTkFHRUQJMHg4MAorI2RlZmluZSBORF9SQV9GTEFHX09USEVSCTB4NDAKKyNkZWZpbmUgTkRfUkFfRkxBR19IT01FX0FHRU5UCTB4MjAKKworLyoKKyAqIFJvdXRlciBwcmVmZXJlbmNlIHZhbHVlcyBiYXNlZCBvbiBkcmFmdC1kcmF2ZXMtaXBuZ3dnLXJvdXRlci1zZWxlY3Rpb24tMDEuCisgKiBUaGVzZSBhcmUgbm9uLXN0YW5kYXJkIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIE5EX1JBX0ZMQUdfUlRQUkVGX01BU0sJMHgxOCAvKiAwMDAxMTAwMCAqLworCisjZGVmaW5lIE5EX1JBX0ZMQUdfUlRQUkVGX0hJR0gJMHgwOCAvKiAwMDAwMTAwMCAqLworI2RlZmluZSBORF9SQV9GTEFHX1JUUFJFRl9NRURJVU0JMHgwMCAvKiAwMDAwMDAwMCAqLworI2RlZmluZSBORF9SQV9GTEFHX1JUUFJFRl9MT1cJMHgxOCAvKiAwMDAxMTAwMCAqLworI2RlZmluZSBORF9SQV9GTEFHX1JUUFJFRl9SU1YJMHgxMCAvKiAwMDAxMDAwMCAqLworCisjZGVmaW5lIG5kX3JhX3JvdXRlcl9saWZldGltZQluZF9yYV9oZHIuaWNtcDZfZGF0YTE2WzFdCisKK3N0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0IHsJLyogbmVpZ2hib3Igc29saWNpdGF0aW9uICovCisJc3RydWN0IGljbXA2X2hkcgluZF9uc19oZHI7CisJc3RydWN0IGluNl9hZGRyCQluZF9uc190YXJnZXQ7CS8qdGFyZ2V0IGFkZHJlc3MgKi8KKwkvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisjZGVmaW5lIG5kX25zX3R5cGUJCW5kX25zX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX25zX2NvZGUJCW5kX25zX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX25zX2Nrc3VtCQluZF9uc19oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfbnNfcmVzZXJ2ZWQJCW5kX25zX2hkci5pY21wNl9kYXRhMzJbMF0KKworc3RydWN0IG5kX25laWdoYm9yX2FkdmVydCB7CS8qIG5laWdoYm9yIGFkdmVydGlzZW1lbnQgKi8KKwlzdHJ1Y3QgaWNtcDZfaGRyCW5kX25hX2hkcjsKKwlzdHJ1Y3QgaW42X2FkZHIJCW5kX25hX3RhcmdldDsJLyogdGFyZ2V0IGFkZHJlc3MgKi8KKwkvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisjZGVmaW5lIG5kX25hX3R5cGUJCW5kX25hX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX25hX2NvZGUJCW5kX25hX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX25hX2Nrc3VtCQluZF9uYV9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfbmFfZmxhZ3NfcmVzZXJ2ZWQJbmRfbmFfaGRyLmljbXA2X2RhdGEzMlswXQorCisjZGVmaW5lIE5EX05BX0ZMQUdfUk9VVEVSCQkweDgwMDAwMDAwCisjZGVmaW5lIE5EX05BX0ZMQUdfU09MSUNJVEVECQkweDQwMDAwMDAwCisjZGVmaW5lIE5EX05BX0ZMQUdfT1ZFUlJJREUJCTB4MjAwMDAwMDAKKworc3RydWN0IG5kX3JlZGlyZWN0IHsJCS8qIHJlZGlyZWN0ICovCisJc3RydWN0IGljbXA2X2hkcgluZF9yZF9oZHI7CisJc3RydWN0IGluNl9hZGRyCQluZF9yZF90YXJnZXQ7CS8qIHRhcmdldCBhZGRyZXNzICovCisJc3RydWN0IGluNl9hZGRyCQluZF9yZF9kc3Q7CS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwkvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisjZGVmaW5lIG5kX3JkX3R5cGUJCW5kX3JkX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX3JkX2NvZGUJCW5kX3JkX2hkci5pY21wNl9jb2RlCisjZGVmaW5lIG5kX3JkX2Nrc3VtCQluZF9yZF9oZHIuaWNtcDZfY2tzdW0KKyNkZWZpbmUgbmRfcmRfcmVzZXJ2ZWQJCW5kX3JkX2hkci5pY21wNl9kYXRhMzJbMF0KKworc3RydWN0IG5kX29wdF9oZHIgewkJLyogTmVpZ2hib3IgZGlzY292ZXJ5IG9wdGlvbiBoZWFkZXIgKi8KKwl1X2ludDhfdAluZF9vcHRfdHlwZTsKKwl1X2ludDhfdAluZF9vcHRfbGVuOworCS8qIGZvbGxvd2VkIGJ5IG9wdGlvbiBzcGVjaWZpYyBkYXRhKi8KK307CisKKyNkZWZpbmUgTkRfT1BUX1NPVVJDRV9MSU5LQUREUgkJMQorI2RlZmluZSBORF9PUFRfVEFSR0VUX0xJTktBRERSCQkyCisjZGVmaW5lIE5EX09QVF9QUkVGSVhfSU5GT1JNQVRJT04JMworI2RlZmluZSBORF9PUFRfUkVESVJFQ1RFRF9IRUFERVIJNAorI2RlZmluZSBORF9PUFRfTVRVCQkJNQorI2RlZmluZSBORF9PUFRfQURWSU5URVJWQUwJCTcKKyNkZWZpbmUgTkRfT1BUX0hPTUVBR0VOVF9JTkZPCQk4CisjZGVmaW5lIE5EX09QVF9ST1VURV9JTkZPCQk5CS8qIGRyYWZ0LWlldGYtaXBuZ3dnLXJvdXRlci1wcmVmZXJlbmNlLCBub3Qgb2ZmaWNpYWxseSBhc3NpZ25lZCB5ZXQgKi8KKworCitzdHJ1Y3QgbmRfb3B0X3ByZWZpeF9pbmZvIHsJLyogcHJlZml4IGluZm9ybWF0aW9uICovCisJdV9pbnQ4X3QJbmRfb3B0X3BpX3R5cGU7CisJdV9pbnQ4X3QJbmRfb3B0X3BpX2xlbjsKKwl1X2ludDhfdAluZF9vcHRfcGlfcHJlZml4X2xlbjsKKwl1X2ludDhfdAluZF9vcHRfcGlfZmxhZ3NfcmVzZXJ2ZWQ7CisJdV9pbnQ4X3QJbmRfb3B0X3BpX3ZhbGlkX3RpbWVbNF07CisJdV9pbnQ4X3QJbmRfb3B0X3BpX3ByZWZlcnJlZF90aW1lWzRdOworCXVfaW50OF90CW5kX29wdF9waV9yZXNlcnZlZDJbNF07CisJc3RydWN0IGluNl9hZGRyCW5kX29wdF9waV9wcmVmaXg7Cit9OworCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX09OTElOSwkJMHg4MAorI2RlZmluZSBORF9PUFRfUElfRkxBR19BVVRPCQkweDQwCisjZGVmaW5lIE5EX09QVF9QSV9GTEFHX1JPVVRFUgkJMHgyMAkvKjIyOTJiaXMqLworCitzdHJ1Y3QgbmRfb3B0X3JkX2hkciB7ICAgICAgICAgLyogcmVkaXJlY3RlZCBoZWFkZXIgKi8KKwl1X2ludDhfdAluZF9vcHRfcmhfdHlwZTsKKwl1X2ludDhfdAluZF9vcHRfcmhfbGVuOworCXVfaW50MTZfdAluZF9vcHRfcmhfcmVzZXJ2ZWQxOworCXVfaW50MzJfdAluZF9vcHRfcmhfcmVzZXJ2ZWQyOworCS8qIGZvbGxvd2VkIGJ5IElQIGhlYWRlciBhbmQgZGF0YSAqLworfTsKKworc3RydWN0IG5kX29wdF9tdHUgewkJLyogTVRVIG9wdGlvbiAqLworCXVfaW50OF90CW5kX29wdF9tdHVfdHlwZTsKKwl1X2ludDhfdAluZF9vcHRfbXR1X2xlbjsKKwl1X2ludDE2X3QJbmRfb3B0X210dV9yZXNlcnZlZDsKKwl1X2ludDMyX3QJbmRfb3B0X210dV9tdHU7Cit9OworCitzdHJ1Y3QgbmRfb3B0X2FkdmludGVydmFsIHsJLyogQWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCBvcHRpb24gKi8KKwl1X2ludDhfdAluZF9vcHRfYWR2X3R5cGU7CisJdV9pbnQ4X3QJbmRfb3B0X2Fkdl9sZW47CisJdV9pbnQxNl90CW5kX29wdF9hZHZfcmVzZXJ2ZWQ7CisJdV9pbnQzMl90CW5kX29wdF9hZHZfaW50ZXJ2YWw7Cit9OworCitzdHJ1Y3QgbmRfb3B0X2hvbWVhZ2VudF9pbmZvIHsJLyogSG9tZSBBZ2VudCBpbmZvICovCisJdV9pbnQ4X3QJbmRfb3B0X2hhaV90eXBlOworCXVfaW50OF90CW5kX29wdF9oYWlfbGVuOworCXVfaW50MTZfdAluZF9vcHRfaGFpX3Jlc2VydmVkOworCWludDE2X3QJCW5kX29wdF9oYWlfcHJlZmVyZW5jZTsKKwl1X2ludDE2X3QJbmRfb3B0X2hhaV9saWZldGltZTsKK307CisKK3N0cnVjdCBuZF9vcHRfcm91dGVfaW5mbyB7CS8qIHJvdXRlIGluZm8gKi8KKwl1X2ludDhfdAluZF9vcHRfcnRpX3R5cGU7CisJdV9pbnQ4X3QJbmRfb3B0X3J0aV9sZW47CisJdV9pbnQ4X3QJbmRfb3B0X3J0aV9wcmVmaXhsZW47CisJdV9pbnQ4X3QJbmRfb3B0X3J0aV9mbGFnczsKKwl1X2ludDMyX3QJbmRfb3B0X3J0aV9saWZldGltZTsKKwkvKiBwcmVmaXggZm9sbG93cyAqLworfTsKKworLyoKKyAqIGljbXA2IG5hbWVsb29rdXAKKyAqLworCitzdHJ1Y3QgaWNtcDZfbmFtZWxvb2t1cCB7CisJc3RydWN0IGljbXA2X2hkciAJaWNtcDZfbmxfaGRyOworCXVfaW50OF90CWljbXA2X25sX25vbmNlWzhdOworCWludDMyX3QJCWljbXA2X25sX3R0bDsKKyNpZiAwCisJdV9pbnQ4X3QJaWNtcDZfbmxfbGVuOworCXVfaW50OF90CWljbXA2X25sX25hbWVbM107CisjZW5kaWYKKwkvKiBjb3VsZCBiZSBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisvKgorICogaWNtcDYgbm9kZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgaWNtcDZfbm9kZWluZm8geworCXN0cnVjdCBpY21wNl9oZHIgaWNtcDZfbmlfaGRyOworCXVfaW50OF90IGljbXA2X25pX25vbmNlWzhdOworCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IHJlcGx5IGRhdGEgKi8KK307CisKKyNkZWZpbmUgbmlfdHlwZQkJaWNtcDZfbmlfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgbmlfY29kZQkJaWNtcDZfbmlfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgbmlfY2tzdW0JaWNtcDZfbmlfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5pX3F0eXBlCWljbXA2X25pX2hkci5pY21wNl9kYXRhMTZbMF0KKyNkZWZpbmUgbmlfZmxhZ3MJaWNtcDZfbmlfaGRyLmljbXA2X2RhdGExNlsxXQorCisjZGVmaW5lIE5JX1FUWVBFX05PT1AJCTAgLyogTk9PUCAgKi8KKyNkZWZpbmUgTklfUVRZUEVfU1VQVFlQRVMJMSAvKiBTdXBwb3J0ZWQgUXR5cGVzICovCisjZGVmaW5lIE5JX1FUWVBFX0ZRRE4JCTIgLyogRlFETiAoZHJhZnQgMDQpICovCisjZGVmaW5lIE5JX1FUWVBFX0ROU05BTUUJMiAvKiBETlMgTmFtZSAqLworI2RlZmluZSBOSV9RVFlQRV9OT0RFQUREUgkzIC8qIE5vZGUgQWRkcmVzc2VzICovCisjZGVmaW5lIE5JX1FUWVBFX0lQVjRBRERSCTQgLyogSVB2NCBBZGRyZXNzZXMgKi8KKworLyogbmV0d29yayBlbmRpYW4gKi8KKyNkZWZpbmUgTklfU1VQVFlQRV9GTEFHX0NPTVBSRVNTCSgodV9pbnQxNl90KWh0b25zKDB4MSkpCisjZGVmaW5lIE5JX0ZRRE5fRkxBR19WQUxJRFRUTAkJKCh1X2ludDE2X3QpaHRvbnMoMHgxKSkKKworLyogbmV0d29yayBlbmRpYW4gKi8KKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19UUlVOQ0FURQkoKHVfaW50MTZfdClodG9ucygweDEpKQorI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX0FMTAkJKCh1X2ludDE2X3QpaHRvbnMoMHgyKSkKKyNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19DT01QQVQJCSgodV9pbnQxNl90KWh0b25zKDB4NCkpCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfTElOS0xPQ0FMCSgodV9pbnQxNl90KWh0b25zKDB4OCkpCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfU0lURUxPQ0FMCSgodV9pbnQxNl90KWh0b25zKDB4MTApKQorI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX0dMT0JBTAkJKCh1X2ludDE2X3QpaHRvbnMoMHgyMCkpCisjZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfQU5ZQ0FTVAkoKHVfaW50MTZfdClodG9ucygweDQwKSkgLyoganVzdCBleHBlcmltZW50YWwuIG5vdCBpbiBzcGVjICovCisKK3N0cnVjdCBuaV9yZXBseV9mcWRuIHsKKwl1X2ludDMyX3QgbmlfZnFkbl90dGw7CS8qIFRUTCAqLworCXVfaW50OF90IG5pX2ZxZG5fbmFtZWxlbjsgLyogbGVuZ3RoIGluIG9jdGV0cyBvZiB0aGUgRlFETiAqLworCXVfaW50OF90IG5pX2ZxZG5fbmFtZVszXTsgLyogWFhYOiBhbGlnbm1lbnQgKi8KK307CisKKy8qCisgKiBSb3V0ZXIgUmVudW1iZXJpbmcuIGFzIHJvdXRlci1yZW51bS0wOC50eHQKKyAqLworc3RydWN0IGljbXA2X3JvdXRlcl9yZW51bSB7CS8qIHJvdXRlciByZW51bWJlcmluZyBoZWFkZXIgKi8KKwlzdHJ1Y3QgaWNtcDZfaGRyCXJyX2hkcjsKKwl1X2ludDhfdAlycl9zZWdudW07CisJdV9pbnQ4X3QJcnJfZmxhZ3M7CisJdV9pbnQxNl90CXJyX21heGRlbGF5OworCXVfaW50MzJfdAlycl9yZXNlcnZlZDsKK307CisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX1RFU1QJCTB4ODAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUkVRUkVTVUxUCTB4NDAKKyNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfRk9SQ0VBUFBMWQkweDIwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX1NQRUNTSVRFCQkweDEwCisjZGVmaW5lIElDTVA2X1JSX0ZMQUdTX1BSRVZET05FCQkweDA4CisKKyNkZWZpbmUgcnJfdHlwZQkJcnJfaGRyLmljbXA2X3R5cGUKKyNkZWZpbmUgcnJfY29kZQkJcnJfaGRyLmljbXA2X2NvZGUKKyNkZWZpbmUgcnJfY2tzdW0JcnJfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIHJyX3NlcW51bSAJcnJfaGRyLmljbXA2X2RhdGEzMlswXQorCitzdHJ1Y3QgcnJfcGNvX21hdGNoIHsJCS8qIG1hdGNoIHByZWZpeCBwYXJ0ICovCisJdV9pbnQ4X3QJcnBtX2NvZGU7CisJdV9pbnQ4X3QJcnBtX2xlbjsKKwl1X2ludDhfdAlycG1fb3JkaW5hbDsKKwl1X2ludDhfdAlycG1fbWF0Y2hsZW47CisJdV9pbnQ4X3QJcnBtX21pbmxlbjsKKwl1X2ludDhfdAlycG1fbWF4bGVuOworCXVfaW50MTZfdAlycG1fcmVzZXJ2ZWQ7CisJc3RydWN0CWluNl9hZGRyCXJwbV9wcmVmaXg7Cit9OworCisjZGVmaW5lIFJQTV9QQ09fQURECQkxCisjZGVmaW5lIFJQTV9QQ09fQ0hBTkdFCQkyCisjZGVmaW5lIFJQTV9QQ09fU0VUR0xPQkFMCTMKKyNkZWZpbmUgUlBNX1BDT19NQVgJCTQKKworc3RydWN0IHJyX3Bjb191c2UgewkJLyogdXNlIHByZWZpeCBwYXJ0ICovCisJdV9pbnQ4X3QJcnB1X3VzZWxlbjsKKwl1X2ludDhfdAlycHVfa2VlcGxlbjsKKwl1X2ludDhfdAlycHVfcmFtYXNrOworCXVfaW50OF90CXJwdV9yYWZsYWdzOworCXVfaW50MzJfdAlycHVfdmx0aW1lOworCXVfaW50MzJfdAlycHVfcGx0aW1lOworCXVfaW50MzJfdAlycHVfZmxhZ3M7CisJc3RydWN0CWluNl9hZGRyIHJwdV9wcmVmaXg7Cit9OworI2RlZmluZSBJQ01QNl9SUl9QQ09VU0VfUkFGTEFHU19PTkxJTksJMHg4MAorI2RlZmluZSBJQ01QNl9SUl9QQ09VU0VfUkFGTEFHU19BVVRPCTB4NDAKKworLyogbmV0d29yayBlbmRpYW4gKi8KKyNkZWZpbmUgSUNNUDZfUlJfUENPVVNFX0ZMQUdTX0RFQ1JWTFRJTUUgICAgICgodV9pbnQzMl90KWh0b25sKDB4ODAwMDAwMDApKQorI2RlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSAgICAgKCh1X2ludDMyX3QpaHRvbmwoMHg0MDAwMDAwMCkpCisKK3N0cnVjdCBycl9yZXN1bHQgewkJLyogcm91dGVyIHJlbnVtYmVyaW5nIHJlc3VsdCBtZXNzYWdlICovCisJdV9pbnQxNl90CXJycl9mbGFnczsKKwl1X2ludDhfdAlycnJfb3JkaW5hbDsKKwl1X2ludDhfdAlycnJfbWF0Y2hlZGxlbjsKKwl1X2ludDMyX3QJcnJyX2lmaWQ7CisJc3RydWN0CWluNl9hZGRyIHJycl9wcmVmaXg7Cit9OworLyogbmV0d29yayBlbmRpYW4gKi8KKyNkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX09PQgkJKCh1X2ludDE2X3QpaHRvbnMoMHgwMDAyKSkKKyNkZWZpbmUgSUNNUDZfUlJfUkVTVUxUX0ZMQUdTX0ZPUkJJRERFTgkJKCh1X2ludDE2X3QpaHRvbnMoMHgwMDAxKSkKKworI2VuZGlmIC8qIG5vdCBfTkVUSU5FVF9JQ01QNl9IXyAqLwpkaWZmIC0tZ2l0IGEvaWVlZTgwMl8xMS5oIGIvaWVlZTgwMl8xMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzhhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9pZWVlODAyXzExLmgKQEAgLTAsMCArMSwzMTcgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaWVlZTgwMl8xMS5oLHYgMS45LjQuMyAyMDA3LzA3LzIyIDIwOjAxOjE2IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMQorICoJRm9ydHJlc3MgVGVjaG5vbG9naWVzCisgKiAgICAgIENoYXJsaWUgTGVuYWhhbiAoIGNsZW5haGFuQGZvcnRyZXNzdGVjaC5jb20gKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKiBMZW5ndGhzIG9mIDgwMi4xMSBoZWFkZXIgY29tcG9uZW50cy4gKi8KKyNkZWZpbmUJSUVFRTgwMl8xMV9GQ19MRU4JCTIKKyNkZWZpbmUJSUVFRTgwMl8xMV9EVVJfTEVOCQkyCisjZGVmaW5lCUlFRUU4MDJfMTFfREFfTEVOCQk2CisjZGVmaW5lCUlFRUU4MDJfMTFfU0FfTEVOCQk2CisjZGVmaW5lCUlFRUU4MDJfMTFfQlNTSURfTEVOCQk2CisjZGVmaW5lCUlFRUU4MDJfMTFfUkFfTEVOCQk2CisjZGVmaW5lCUlFRUU4MDJfMTFfVEFfTEVOCQk2CisjZGVmaW5lCUlFRUU4MDJfMTFfU0VRX0xFTgkJMgorI2RlZmluZQlJRUVFODAyXzExX0lWX0xFTgkJMworI2RlZmluZQlJRUVFODAyXzExX0tJRF9MRU4JCTEKKworLyogRnJhbWUgY2hlY2sgc2VxdWVuY2UgbGVuZ3RoLiAqLworI2RlZmluZQlJRUVFODAyXzExX0ZDU19MRU4JCTQKKworLyogTGVuZ3RocyBvZiBiZWFjb24gY29tcG9uZW50cy4gKi8KKyNkZWZpbmUJSUVFRTgwMl8xMV9UU1RBTVBfTEVOCQk4CisjZGVmaW5lCUlFRUU4MDJfMTFfQkNOSU5UX0xFTgkJMgorI2RlZmluZQlJRUVFODAyXzExX0NBUElORk9fTEVOCQkyCisjZGVmaW5lCUlFRUU4MDJfMTFfTElTVEVOSU5UX0xFTgkyCisKKyNkZWZpbmUJSUVFRTgwMl8xMV9BSURfTEVOCQkyCisjZGVmaW5lCUlFRUU4MDJfMTFfU1RBVFVTX0xFTgkJMgorI2RlZmluZQlJRUVFODAyXzExX1JFQVNPTl9MRU4JCTIKKworLyogTGVuZ3RoIG9mIHByZXZpb3VzIEFQIGluIHJlYXNzb2NhdGlvbiBmcmFtZSAqLworI2RlZmluZQlJRUVFODAyXzExX0FQX0xFTgkJNgorCisjZGVmaW5lCVRfTUdNVCAweDAgIC8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUJVF9DVFJMIDB4MSAgLyogY29udHJvbCAqLworI2RlZmluZQlUX0RBVEEgMHgyIC8qIGRhdGEgKi8KKyNkZWZpbmUJVF9SRVNWIDB4MyAgLyogcmVzZXJ2ZWQgKi8KKworI2RlZmluZQlTVF9BU1NPQ19SRVFVRVNUICAgCTB4MAorI2RlZmluZQlTVF9BU1NPQ19SRVNQT05TRSAJMHgxCisjZGVmaW5lCVNUX1JFQVNTT0NfUkVRVUVTVCAgIAkweDIKKyNkZWZpbmUJU1RfUkVBU1NPQ19SRVNQT05TRSAgCTB4MworI2RlZmluZQlTVF9QUk9CRV9SRVFVRVNUICAgCTB4NAorI2RlZmluZQlTVF9QUk9CRV9SRVNQT05TRSAgIAkweDUKKy8qIFJFU0VSVkVEIAkJCTB4NiAgKi8KKy8qIFJFU0VSVkVEIAkJCTB4NyAgKi8KKyNkZWZpbmUJU1RfQkVBQ09OICAgCQkweDgKKyNkZWZpbmUJU1RfQVRJTQkJCTB4OQorI2RlZmluZQlTVF9ESVNBU1NPQwkJMHhBCisjZGVmaW5lCVNUX0FVVEgJCQkweEIKKyNkZWZpbmUJU1RfREVBVVRICQkweEMKKy8qIFJFU0VSVkVEIAkJCTB4RCAgKi8KKy8qIFJFU0VSVkVEIAkJCTB4RSAgKi8KKy8qIFJFU0VSVkVEIAkJCTB4RiAgKi8KKworCisjZGVmaW5lCUNUUkxfUFNfUE9MTAkweEEKKyNkZWZpbmUJQ1RSTF9SVFMJMHhCCisjZGVmaW5lCUNUUkxfQ1RTCTB4QworI2RlZmluZQlDVFJMX0FDSwkweEQKKyNkZWZpbmUJQ1RSTF9DRl9FTkQJMHhFCisjZGVmaW5lCUNUUkxfRU5EX0FDSwkweEYKKworI2RlZmluZQlEQVRBX0RBVEEJCQkweDAKKyNkZWZpbmUJREFUQV9EQVRBX0NGX0FDSwkJMHgxCisjZGVmaW5lCURBVEFfREFUQV9DRl9QT0xMCQkweDIKKyNkZWZpbmUJREFUQV9EQVRBX0NGX0FDS19QT0xMCQkweDMKKyNkZWZpbmUJREFUQV9OT0RBVEEJCQkweDQKKyNkZWZpbmUJREFUQV9OT0RBVEFfQ0ZfQUNLCQkweDUKKyNkZWZpbmUJREFUQV9OT0RBVEFfQ0ZfUE9MTAkJMHg2CisjZGVmaW5lCURBVEFfTk9EQVRBX0NGX0FDS19QT0xMCQkweDcKKworI2RlZmluZSBEQVRBX1FPU19EQVRBCQkJMHg4CisjZGVmaW5lIERBVEFfUU9TX0RBVEFfQ0ZfQUNLCQkweDkKKyNkZWZpbmUgREFUQV9RT1NfREFUQV9DRl9QT0xMCQkweEEKKyNkZWZpbmUgREFUQV9RT1NfREFUQV9DRl9BQ0tfUE9MTAkweEIKKyNkZWZpbmUgREFUQV9RT1NfTk9EQVRBCQkJMHhDCisjZGVmaW5lIERBVEFfUU9TX0NGX1BPTExfTk9EQVRBCQkweEUKKyNkZWZpbmUgREFUQV9RT1NfQ0ZfQUNLX1BPTExfTk9EQVRBCTB4RgorCisvKgorICogVGhlIHN1YnR5cGUgZmllbGQgb2YgYSBkYXRhIGZyYW1lIGlzLCBpbiBlZmZlY3QsIGNvbXBvc2VkIG9mIDQgZmxhZworICogYml0cyAtIENGLUFjaywgQ0YtUG9sbCwgTnVsbCAobWVhbnMgdGhlIGZyYW1lIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZQorICogYW55IGRhdGEpLCBhbmQgUW9TLgorICovCisjZGVmaW5lIERBVEFfRlJBTUVfSVNfQ0ZfQUNLKHgpCQkoKHgpICYgMHgwMSkKKyNkZWZpbmUgREFUQV9GUkFNRV9JU19DRl9QT0xMKHgpCSgoeCkgJiAweDAyKQorI2RlZmluZSBEQVRBX0ZSQU1FX0lTX05VTEwoeCkJCSgoeCkgJiAweDA0KQorI2RlZmluZSBEQVRBX0ZSQU1FX0lTX1FPUyh4KQkJKCh4KSAmIDB4MDgpCisKKy8qCisgKiBCaXRzIGluIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkLgorICovCisjZGVmaW5lCUZDX1ZFUlNJT04oZmMpCQkoKGZjKSAmIDB4MykKKyNkZWZpbmUJRkNfVFlQRShmYykJCSgoKGZjKSA+PiAyKSAmIDB4MykKKyNkZWZpbmUJRkNfU1VCVFlQRShmYykJCSgoKGZjKSA+PiA0KSAmIDB4RikKKyNkZWZpbmUJRkNfVE9fRFMoZmMpCQkoKGZjKSAmIDB4MDEwMCkKKyNkZWZpbmUJRkNfRlJPTV9EUyhmYykJCSgoZmMpICYgMHgwMjAwKQorI2RlZmluZQlGQ19NT1JFX0ZMQUcoZmMpCSgoZmMpICYgMHgwNDAwKQorI2RlZmluZQlGQ19SRVRSWShmYykJCSgoZmMpICYgMHgwODAwKQorI2RlZmluZQlGQ19QT1dFUl9NR01UKGZjKQkoKGZjKSAmIDB4MTAwMCkKKyNkZWZpbmUJRkNfTU9SRV9EQVRBKGZjKQkoKGZjKSAmIDB4MjAwMCkKKyNkZWZpbmUJRkNfV0VQKGZjKQkJKChmYykgJiAweDQwMDApCisjZGVmaW5lCUZDX09SREVSKGZjKQkJKChmYykgJiAweDgwMDApCisKK3N0cnVjdCBtZ210X2hlYWRlcl90IHsKKwl1X2ludDE2X3QJZmM7CisJdV9pbnQxNl90IAlkdXJhdGlvbjsKKwl1X2ludDhfdAlkYVs2XTsKKwl1X2ludDhfdAlzYVs2XTsKKwl1X2ludDhfdAlic3NpZFs2XTsKKwl1X2ludDE2X3QJc2VxX2N0cmw7Cit9OworCisjZGVmaW5lCU1HTVRfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rXAorCQkJIElFRUU4MDJfMTFfREFfTEVOK0lFRUU4MDJfMTFfU0FfTEVOK1wKKwkJCSBJRUVFODAyXzExX0JTU0lEX0xFTitJRUVFODAyXzExX1NFUV9MRU4pCisKKyNkZWZpbmUJQ0FQQUJJTElUWV9FU1MoY2FwKQkoKGNhcCkgJiAweDAwMDEpCisjZGVmaW5lCUNBUEFCSUxJVFlfSUJTUyhjYXApCSgoY2FwKSAmIDB4MDAwMikKKyNkZWZpbmUJQ0FQQUJJTElUWV9DRlAoY2FwKQkoKGNhcCkgJiAweDAwMDQpCisjZGVmaW5lCUNBUEFCSUxJVFlfQ0ZQX1JFUShjYXApCSgoY2FwKSAmIDB4MDAwOCkKKyNkZWZpbmUJQ0FQQUJJTElUWV9QUklWQUNZKGNhcCkJKChjYXApICYgMHgwMDEwKQorCit0eXBlZGVmIGVudW0geworCU5PVF9QUkVTRU5ULAorCVBSRVNFTlQsCisJVFJVTkNBVEVECit9IGVsZW1fc3RhdHVzX3Q7CisKK3N0cnVjdCBzc2lkX3QgeworCXVfaW50OF90CWVsZW1lbnRfaWQ7CisJdV9pbnQ4X3QJbGVuZ3RoOworCXVfY2hhcgkJc3NpZFszM107ICAvKiAzMiArIDEgZm9yIG51bGwgKi8KK307CisKK3N0cnVjdCByYXRlc190IHsKKwl1X2ludDhfdAllbGVtZW50X2lkOworCXVfaW50OF90CWxlbmd0aDsKKwl1X2ludDhfdAlyYXRlWzE2XTsKK307CisKK3N0cnVjdCBjaGFsbGVuZ2VfdCB7CisJdV9pbnQ4X3QJZWxlbWVudF9pZDsKKwl1X2ludDhfdAlsZW5ndGg7CisJdV9pbnQ4X3QJdGV4dFsyNTRdOyAvKiAxLTI1MyArIDEgZm9yIG51bGwgKi8KK307CisKK3N0cnVjdCBmaF90IHsKKwl1X2ludDhfdAllbGVtZW50X2lkOworCXVfaW50OF90CWxlbmd0aDsKKwl1X2ludDE2X3QJZHdlbGxfdGltZTsKKwl1X2ludDhfdAlob3Bfc2V0OworCXVfaW50OF90IAlob3BfcGF0dGVybjsKKwl1X2ludDhfdAlob3BfaW5kZXg7Cit9OworCitzdHJ1Y3QgZHNfdCB7CisJdV9pbnQ4X3QJZWxlbWVudF9pZDsKKwl1X2ludDhfdAlsZW5ndGg7CisJdV9pbnQ4X3QJY2hhbm5lbDsKK307CisKK3N0cnVjdCBjZl90IHsKKwl1X2ludDhfdAllbGVtZW50X2lkOworCXVfaW50OF90CWxlbmd0aDsKKwl1X2ludDhfdAljb3VudDsKKwl1X2ludDhfdAlwZXJpb2Q7CisJdV9pbnQxNl90CW1heF9kdXJhdGlvbjsKKwl1X2ludDE2X3QJZHVyX3JlbWFpbmc7Cit9OworCitzdHJ1Y3QgdGltX3QgeworCXVfaW50OF90CWVsZW1lbnRfaWQ7CisJdV9pbnQ4X3QJbGVuZ3RoOworCXVfaW50OF90CWNvdW50OworCXVfaW50OF90CXBlcmlvZDsKKwl1X2ludDhfdAliaXRtYXBfY29udHJvbDsKKwl1X2ludDhfdAliaXRtYXBbMjUxXTsKK307CisKKyNkZWZpbmUJRV9TU0lEIAkJMAorI2RlZmluZQlFX1JBVEVTIAkxCisjZGVmaW5lCUVfRkgJIAkyCisjZGVmaW5lCUVfRFMgCQkzCisjZGVmaW5lCUVfQ0YJIAk0CisjZGVmaW5lCUVfVElNCSAJNQorI2RlZmluZQlFX0lCU1MgCQk2CisvKiByZXNlcnZlZCAJCTcgKi8KKy8qIHJlc2VydmVkIAkJOCAqLworLyogcmVzZXJ2ZWQgCQk5ICovCisvKiByZXNlcnZlZCAJCTEwICovCisvKiByZXNlcnZlZCAJCTExICovCisvKiByZXNlcnZlZCAJCTEyICovCisvKiByZXNlcnZlZCAJCTEzICovCisvKiByZXNlcnZlZCAJCTE0ICovCisvKiByZXNlcnZlZCAJCTE1ICovCisvKiByZXNlcnZlZCAJCTE2ICovCisKKyNkZWZpbmUJRV9DSEFMTEVOR0UgCTE2CisvKiByZXNlcnZlZCAJCTE3ICovCisvKiByZXNlcnZlZCAJCTE4ICovCisvKiByZXNlcnZlZCAJCTE5ICovCisvKiByZXNlcnZlZCAJCTE2ICovCisvKiByZXNlcnZlZCAJCTE2ICovCisKKworc3RydWN0IG1nbXRfYm9keV90IHsKKwl1X2ludDhfdCAgIAl0aW1lc3RhbXBbSUVFRTgwMl8xMV9UU1RBTVBfTEVOXTsKKwl1X2ludDE2X3QgIAliZWFjb25faW50ZXJ2YWw7CisJdV9pbnQxNl90IAlsaXN0ZW5faW50ZXJ2YWw7CisJdV9pbnQxNl90IAlzdGF0dXNfY29kZTsKKwl1X2ludDE2X3QgCWFpZDsKKwl1X2NoYXIJCWFwW0lFRUU4MDJfMTFfQVBfTEVOXTsKKwl1X2ludDE2X3QJcmVhc29uX2NvZGU7CisJdV9pbnQxNl90CWF1dGhfYWxnOworCXVfaW50MTZfdAlhdXRoX3RyYW5zX3NlcV9udW07CisJZWxlbV9zdGF0dXNfdAljaGFsbGVuZ2Vfc3RhdHVzOworCXN0cnVjdCBjaGFsbGVuZ2VfdCAgY2hhbGxlbmdlOworCXVfaW50MTZfdAljYXBhYmlsaXR5X2luZm87CisJZWxlbV9zdGF0dXNfdAlzc2lkX3N0YXR1czsKKwlzdHJ1Y3Qgc3NpZF90CXNzaWQ7CisJZWxlbV9zdGF0dXNfdAlyYXRlc19zdGF0dXM7CisJc3RydWN0IHJhdGVzX3QgCXJhdGVzOworCWVsZW1fc3RhdHVzX3QJZHNfc3RhdHVzOworCXN0cnVjdCBkc190CWRzOworCWVsZW1fc3RhdHVzX3QJY2Zfc3RhdHVzOworCXN0cnVjdCBjZl90CWNmOworCWVsZW1fc3RhdHVzX3QJZmhfc3RhdHVzOworCXN0cnVjdCBmaF90CWZoOworCWVsZW1fc3RhdHVzX3QJdGltX3N0YXR1czsKKwlzdHJ1Y3QgdGltX3QJdGltOworfTsKKworc3RydWN0IGN0cmxfcnRzX3QgeworCXVfaW50MTZfdAlmYzsKKwl1X2ludDE2X3QJZHVyYXRpb247CisJdV9pbnQ4X3QJcmFbNl07CisJdV9pbnQ4X3QJdGFbNl07CisJdV9pbnQ4X3QJZmNzWzRdOworfTsKKworI2RlZmluZQlDVFJMX1JUU19IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCisJCQkgSUVFRTgwMl8xMV9SQV9MRU4rSUVFRTgwMl8xMV9UQV9MRU4pCisKK3N0cnVjdCBjdHJsX2N0c190IHsKKwl1X2ludDE2X3QJZmM7CisJdV9pbnQxNl90CWR1cmF0aW9uOworCXVfaW50OF90CXJhWzZdOworCXVfaW50OF90CWZjc1s0XTsKK307CisKKyNkZWZpbmUJQ1RSTF9DVFNfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rSUVFRTgwMl8xMV9SQV9MRU4pCisKK3N0cnVjdCBjdHJsX2Fja190IHsKKwl1X2ludDE2X3QJZmM7CisJdV9pbnQxNl90CWR1cmF0aW9uOworCXVfaW50OF90CXJhWzZdOworCXVfaW50OF90CWZjc1s0XTsKK307CisKKyNkZWZpbmUJQ1RSTF9BQ0tfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rSUVFRTgwMl8xMV9SQV9MRU4pCisKK3N0cnVjdCBjdHJsX3BzX3BvbGxfdCB7CisJdV9pbnQxNl90CWZjOworCXVfaW50MTZfdAlhaWQ7CisJdV9pbnQ4X3QJYnNzaWRbNl07CisJdV9pbnQ4X3QJdGFbNl07CisJdV9pbnQ4X3QJZmNzWzRdOworfTsKKworI2RlZmluZQlDVFJMX1BTX1BPTExfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0FJRF9MRU4rXAorCQkJCSBJRUVFODAyXzExX0JTU0lEX0xFTitJRUVFODAyXzExX1RBX0xFTikKKworc3RydWN0IGN0cmxfZW5kX3QgeworCXVfaW50MTZfdAlmYzsKKwl1X2ludDE2X3QJZHVyYXRpb247CisJdV9pbnQ4X3QJcmFbNl07CisJdV9pbnQ4X3QJYnNzaWRbNl07CisJdV9pbnQ4X3QJZmNzWzRdOworfTsKKworI2RlZmluZQlDVFJMX0VORF9IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCisJCQkgSUVFRTgwMl8xMV9SQV9MRU4rSUVFRTgwMl8xMV9CU1NJRF9MRU4pCisKK3N0cnVjdCBjdHJsX2VuZF9hY2tfdCB7CisJdV9pbnQxNl90CWZjOworCXVfaW50MTZfdAlkdXJhdGlvbjsKKwl1X2ludDhfdAlyYVs2XTsKKwl1X2ludDhfdAlic3NpZFs2XTsKKwl1X2ludDhfdAlmY3NbNF07Cit9OworCisjZGVmaW5lCUNUUkxfRU5EX0FDS19IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCisJCQkJIElFRUU4MDJfMTFfUkFfTEVOK0lFRUU4MDJfMTFfQlNTSURfTEVOKQorCisjZGVmaW5lCUlWX0lWKGl2KQkoKGl2KSAmIDB4RkZGRkZGKQorI2RlZmluZQlJVl9QQUQoaXYpCSgoKGl2KSA+PiAyNCkgJiAweDNGKQorI2RlZmluZQlJVl9LRVlJRChpdikJKCgoaXYpID4+IDMwKSAmIDB4MDMpCmRpZmYgLS1naXQgYS9pZWVlODAyXzExX3JhZGlvLmggYi9pZWVlODAyXzExX3JhZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQyYTM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2llZWU4MDJfMTFfcmFkaW8uaApAQCAtMCwwICsxLDIxMyBAQAorLyogJEZyZWVCU0Q6IHNyYy9zeXMvbmV0ODAyMTEvaWVlZTgwMjExX3JhZGlvdGFwLmgsdiAxLjUgMjAwNS8wMS8yMiAyMDoxMjowNSBzYW0gRXhwICQgKi8KKy8qICROZXRCU0Q6IGllZWU4MDJfMTFfcmFkaW8uaCx2IDEuMiAyMDA2LzAyLzI2IDAzOjA0OjAzIGR5b3VuZyBFeHAgJCAqLworLyogJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaWVlZTgwMl8xMV9yYWRpby5oLHYgMS4xLjIuMSAyMDA2LzA2LzEzIDIyOjI0OjQ1IGd1eSBFeHAgJCAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBEYXZpZCBZb3VuZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiBEYXZpZCBZb3VuZyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBEQVZJRCBZT1VORyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKKyAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIERBVklECisgKiBZT1VORyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQorICogT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX05FVF9JRl9JRUVFODAyMTFSQURJT1RBUF9IXworI2RlZmluZSBfTkVUX0lGX0lFRUU4MDIxMVJBRElPVEFQX0hfCisKKy8qIEEgZ2VuZXJpYyByYWRpbyBjYXB0dXJlIGZvcm1hdCBpcyBkZXNpcmFibGUuIFRoZXJlIGlzIG9uZSBmb3IKKyAqIExpbnV4LCBidXQgaXQgaXMgbmVpdGhlciByaWdpZGx5IGRlZmluZWQgKHRoZXJlIHdlcmUgbm90IGV2ZW4KKyAqIHVuaXRzIGdpdmVuIGZvciBzb21lIGZpZWxkcykgbm9yIGVhc2lseSBleHRlbnNpYmxlLgorICoKKyAqIEkgc3VnZ2VzdCB0aGUgZm9sbG93aW5nIGV4dGVuc2libGUgcmFkaW8gY2FwdHVyZSBmb3JtYXQuIEl0IGlzCisgKiBiYXNlZCBvbiBhIGJpdG1hcCBpbmRpY2F0aW5nIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudC4KKyAqCisgKiBJIGFtIHRyeWluZyB0byBkZXNjcmliZSBwcmVjaXNlbHkgd2hhdCB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lcgorICogc2hvdWxkIGV4cGVjdCBpbiB0aGUgZm9sbG93aW5nLCBhbmQgZm9yIHRoYXQgcmVhc29uIEkgdGVsbCB0aGUKKyAqIHVuaXRzIGFuZCBvcmlnaW4gb2YgZWFjaCBtZWFzdXJlbWVudCAod2hlcmUgaXQgYXBwbGllcyksIG9yIGVsc2UgSQorICogdXNlIHN1ZmZpY2llbnRseSB3ZWFzZWxseSBsYW5ndWFnZSAoImlzIGEgbW9ub3RvbmljYWxseSBub25kZWNyZWFzaW5nCisgKiBmdW5jdGlvbiBvZi4uLiIpIHRoYXQgSSBjYW5ub3Qgc2V0IGZhbHNlIGV4cGVjdGF0aW9ucyBmb3IgbGF3eWVybHkKKyAqIHJlYWRlcnMuCisgKi8KKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX0tFUk5FTCkKKyNpZm5kZWYgRExUX0lFRUU4MDJfMTFfUkFESU8KKyNkZWZpbmUJRExUX0lFRUU4MDJfMTFfUkFESU8JMTI3CS8qIDgwMi4xMSBwbHVzIFdMQU4gaGVhZGVyICovCisjZW5kaWYKKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX0tFUk5FTCkgKi8KKworLyogVGhlIHJhZGlvIGNhcHR1cmUgaGVhZGVyIHByZWNlZGVzIHRoZSA4MDIuMTEgaGVhZGVyLiAqLworc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgeworCXVfaW50OF90CWl0X3ZlcnNpb247CS8qIFZlcnNpb24gMC4gT25seSBpbmNyZWFzZXMKKwkJCQkJICogZm9yIGRyYXN0aWMgY2hhbmdlcywKKwkJCQkJICogaW50cm9kdWN0aW9uIG9mIGNvbXBhdGlibGUKKwkJCQkJICogbmV3IGZpZWxkcyBkb2VzIG5vdCBjb3VudC4KKwkJCQkJICovCisJdV9pbnQ4X3QJaXRfcGFkOworCXVfaW50MTZfdCAgICAgICBpdF9sZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSB3aG9sZQorCQkJCQkgKiBoZWFkZXIgaW4gYnl0ZXMsIGluY2x1ZGluZworCQkJCQkgKiBpdF92ZXJzaW9uLCBpdF9wYWQsCisJCQkJCSAqIGl0X2xlbiwgYW5kIGRhdGEgZmllbGRzLgorCQkJCQkgKi8KKwl1X2ludDMyX3QgICAgICAgaXRfcHJlc2VudDsgICAgIC8qIEEgYml0bWFwIHRlbGxpbmcgd2hpY2gKKwkJCQkJICogZmllbGRzIGFyZSBwcmVzZW50LiBTZXQgYml0IDMxCisJCQkJCSAqICgweDgwMDAwMDAwKSB0byBleHRlbmQgdGhlCisJCQkJCSAqIGJpdG1hcCBieSBhbm90aGVyIDMyIGJpdHMuCisJCQkJCSAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBhcmUgbWFkZQorCQkJCQkgKiBieSBzZXR0aW5nIGJpdCAzMS4KKwkJCQkJICovCit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgdHlwZSAgICAgICBVbml0cworICogLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUICAgICAgICAgICAgICB1X2ludDY0X3QgICAgICAgbWljcm9zZWNvbmRzCisgKgorICogICAgICBWYWx1ZSBpbiBtaWNyb3NlY29uZHMgb2YgdGhlIE1BQydzIDY0LWJpdCA4MDIuMTEgVGltZQorICogICAgICBTeW5jaHJvbml6YXRpb24gRnVuY3Rpb24gdGltZXIgd2hlbiB0aGUgZmlyc3QgYml0IG9mIHRoZQorICogICAgICBNUERVIGFycml2ZWQgYXQgdGhlIE1BQy4gRm9yIHJlY2VpdmVkIGZyYW1lcywgb25seS4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCAgICAgICAgICAgMiB4IHVfaW50MTZfdCAgIE1IeiwgYml0bWFwCisgKgorICogICAgICBUeC9SeCBmcmVxdWVuY3kgaW4gTUh6LCBmb2xsb3dlZCBieSBmbGFncyAoc2VlIGJlbG93KS4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfRkhTUyAgICAgICAgICAgICAgdV9pbnQxNl90ICAgICAgIHNlZSBiZWxvdworICoKKyAqICAgICAgRm9yIGZyZXF1ZW5jeS1ob3BwaW5nIHJhZGlvcywgdGhlIGhvcCBzZXQgKGZpcnN0IGJ5dGUpCisgKiAgICAgIGFuZCBwYXR0ZXJuIChzZWNvbmQgYnl0ZSkuCisgKgorICogSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgICAgICAgICAgICAgIHVfaW50OF90ICAgICAgICA1MDBrYi9zCisgKgorICogICAgICBUeC9SeCBkYXRhIHJhdGUKKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTCAgICAgaW50OF90ICAgICAgICAgIGRlY2liZWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQorICoKKyAqICAgICAgUkYgc2lnbmFsIHBvd2VyIGF0IHRoZSBhbnRlbm5hLCBkZWNpYmVsIGRpZmZlcmVuY2UgZnJvbQorICogICAgICBvbmUgbWlsbGl3YXR0LgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgICAgICBpbnQ4X3QgICAgICAgICAgZGVjaWJlbHMgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgbWlsbGl3YXR0IChkQm0pCisgKgorICogICAgICBSRiBub2lzZSBwb3dlciBhdCB0aGUgYW50ZW5uYSwgZGVjaWJlbCBkaWZmZXJlbmNlIGZyb20gb25lCisgKiAgICAgIG1pbGxpd2F0dC4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMICAgICAgdV9pbnQ4X3QgICAgICAgIGRlY2liZWwgKGRCKQorICoKKyAqICAgICAgUkYgc2lnbmFsIHBvd2VyIGF0IHRoZSBhbnRlbm5hLCBkZWNpYmVsIGRpZmZlcmVuY2UgZnJvbSBhbgorICogICAgICBhcmJpdHJhcnksIGZpeGVkIHJlZmVyZW5jZS4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0UgICAgICAgdV9pbnQ4X3QgICAgICAgIGRlY2liZWwgKGRCKQorICoKKyAqICAgICAgUkYgbm9pc2UgcG93ZXIgYXQgdGhlIGFudGVubmEsIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tIGFuCisgKiAgICAgIGFyYml0cmFyeSwgZml4ZWQgcmVmZXJlbmNlIHBvaW50LgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgICAgICB1X2ludDE2X3QgICAgICAgdW5pdGxlc3MKKyAqCisgKiAgICAgIFF1YWxpdHkgb2YgQmFya2VyIGNvZGUgbG9jay4gVW5pdGxlc3MuIE1vbm90b25pY2FsbHkKKyAqICAgICAgbm9uZGVjcmVhc2luZyB3aXRoICJiZXR0ZXIiIGxvY2sgc3RyZW5ndGguIENhbGxlZCAiU2lnbmFsCisgKiAgICAgIFF1YWxpdHkiIGluIGRhdGFzaGVldHMuICAoSXMgdGhlcmUgYSBzdGFuZGFyZCB3YXkgdG8gbWVhc3VyZQorICogICAgICB0aGlzPykKKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gICAgdV9pbnQxNl90ICAgICAgIHVuaXRsZXNzCisgKgorICogICAgICBUcmFuc21pdCBwb3dlciBleHByZXNzZWQgYXMgdW5pdGxlc3MgZGlzdGFuY2UgZnJvbSBtYXgKKyAqICAgICAgcG93ZXIgc2V0IGF0IGZhY3RvcnkgY2FsaWJyYXRpb24uICAwIGlzIG1heCBwb3dlci4KKyAqICAgICAgTW9ub3RvbmljYWxseSBub25kZWNyZWFzaW5nIHdpdGggbG93ZXIgcG93ZXIgbGV2ZWxzLgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiB1X2ludDE2X3QgICAgICAgZGVjaWJlbHMgKGRCKQorICoKKyAqICAgICAgVHJhbnNtaXQgcG93ZXIgZXhwcmVzc2VkIGFzIGRlY2liZWwgZGlzdGFuY2UgZnJvbSBtYXggcG93ZXIKKyAqICAgICAgc2V0IGF0IGZhY3RvcnkgY2FsaWJyYXRpb24uICAwIGlzIG1heCBwb3dlci4gIE1vbm90b25pY2FsbHkKKyAqICAgICAgbm9uZGVjcmVhc2luZyB3aXRoIGxvd2VyIHBvd2VyIGxldmVscy4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSICAgICAgaW50OF90ICAgICAgICAgIGRlY2liZWxzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQorICoKKyAqICAgICAgVHJhbnNtaXQgcG93ZXIgZXhwcmVzc2VkIGFzIGRCbSAoZGVjaWJlbHMgZnJvbSBhIDEgbWlsbGl3YXR0CisgKiAgICAgIHJlZmVyZW5jZSkuIFRoaXMgaXMgdGhlIGFic29sdXRlIHBvd2VyIGxldmVsIG1lYXN1cmVkIGF0CisgKiAgICAgIHRoZSBhbnRlbm5hIHBvcnQuCisgKgorICogSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTICAgICAgICAgICAgIHVfaW50OF90ICAgICAgICBiaXRtYXAKKyAqCisgKiAgICAgIFByb3BlcnRpZXMgb2YgdHJhbnNtaXR0ZWQgYW5kIHJlY2VpdmVkIGZyYW1lcy4gU2VlIGZsYWdzCisgKiAgICAgIGRlZmluZWQgYmVsb3cuCisgKgorICogSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgICAgICAgICAgIHVfaW50OF90ICAgICAgICBhbnRlbm5hIGluZGV4CisgKgorICogICAgICBVbml0bGVzcyBpbmRpY2F0aW9uIG9mIHRoZSBSeC9UeCBhbnRlbm5hIGZvciB0aGlzIHBhY2tldC4KKyAqICAgICAgVGhlIGZpcnN0IGFudGVubmEgaXMgYW50ZW5uYSAwLgorICoKKyAqIElFRUU4MDIxMV9SQURJT1RBUF9GQ1MgICAgICAgICAgIAl1X2ludDMyX3QgICAgICAgZGF0YQorICoKKyAqCUZDUyBmcm9tIGZyYW1lIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqLworZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSB7CisJSUVFRTgwMjExX1JBRElPVEFQX1RTRlQgPSAwLAorCUlFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyA9IDEsCisJSUVFRTgwMjExX1JBRElPVEFQX1JBVEUgPSAyLAorCUlFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMID0gMywKKwlJRUVFODAyMTFfUkFESU9UQVBfRkhTUyA9IDQsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgPSA1LAorCUlFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0UgPSA2LAorCUlFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFkgPSA3LAorCUlFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTiA9IDgsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OID0gOSwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSID0gMTAsCisJSUVFRTgwMjExX1JBRElPVEFQX0FOVEVOTkEgPSAxMSwKKwlJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMID0gMTIsCisJSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFID0gMTMsCisJSUVFRTgwMjExX1JBRElPVEFQX0VYVCA9IDMxCit9OworCisjaWZuZGVmIF9LRVJORUwKKy8qIENoYW5uZWwgZmxhZ3MuICovCisjZGVmaW5lCUlFRUU4MDIxMV9DSEFOX1RVUkJPCTB4MDAxMAkvKiBUdXJibyBjaGFubmVsICovCisjZGVmaW5lCUlFRUU4MDIxMV9DSEFOX0NDSwkweDAwMjAJLyogQ0NLIGNoYW5uZWwgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0NIQU5fT0ZETQkweDAwNDAJLyogT0ZETSBjaGFubmVsICovCisjZGVmaW5lCUlFRUU4MDIxMV9DSEFOXzJHSFoJMHgwMDgwCS8qIDIgR0h6IHNwZWN0cnVtIGNoYW5uZWwuICovCisjZGVmaW5lCUlFRUU4MDIxMV9DSEFOXzVHSFoJMHgwMTAwCS8qIDUgR0h6IHNwZWN0cnVtIGNoYW5uZWwgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0NIQU5fUEFTU0lWRQkweDAyMDAJLyogT25seSBwYXNzaXZlIHNjYW4gYWxsb3dlZCAqLworI2RlZmluZQlJRUVFODAyMTFfQ0hBTl9EWU4JMHgwNDAwCS8qIER5bmFtaWMgQ0NLLU9GRE0gY2hhbm5lbCAqLworI2RlZmluZQlJRUVFODAyMTFfQ0hBTl9HRlNLCTB4MDgwMAkvKiBHRlNLIGNoYW5uZWwgKEZIU1MgUEhZKSAqLworI2VuZGlmIC8qICFfS0VSTkVMICovCisKKy8qIEZvciBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBRElPVEFQX0ZfQ0ZQCTB4MDEJLyogc2VudC9yZWNlaXZlZAorCQkJCQkJICogZHVyaW5nIENGUAorCQkJCQkJICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQURJT1RBUF9GX1NIT1JUUFJFCTB4MDIJLyogc2VudC9yZWNlaXZlZAorCQkJCQkJICogd2l0aCBzaG9ydAorCQkJCQkJICogcHJlYW1ibGUKKwkJCQkJCSAqLworI2RlZmluZQlJRUVFODAyMTFfUkFESU9UQVBfRl9XRVAJMHgwNAkvKiBzZW50L3JlY2VpdmVkCisJCQkJCQkgKiB3aXRoIFdFUCBlbmNyeXB0aW9uCisJCQkJCQkgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBRElPVEFQX0ZfRlJBRwkweDA4CS8qIHNlbnQvcmVjZWl2ZWQKKwkJCQkJCSAqIHdpdGggZnJhZ21lbnRhdGlvbgorCQkJCQkJICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQURJT1RBUF9GX0ZDUwkweDEwCS8qIGZyYW1lIGluY2x1ZGVzIEZDUyAqLworI2RlZmluZQlJRUVFODAyMTFfUkFESU9UQVBfRl9EQVRBUEFECTB4MjAJLyogZnJhbWUgaGFzIHBhZGRpbmcgYmV0d2VlbgorCQkJCQkJICogODAyLjExIGhlYWRlciBhbmQgcGF5bG9hZAorCQkJCQkJICogKHRvIDMyLWJpdCBib3VuZGFyeSkKKwkJCQkJCSAqLworI2RlZmluZQlJRUVFODAyMTFfUkFESU9UQVBfRl9CQURGQ1MJMHg0MAkvKiBkb2VzIG5vdCBwYXNzIEZDUyBjaGVjayAqLworCisjZW5kaWYgLyogX05FVF9JRl9JRUVFODAyMTFSQURJT1RBUF9IXyAqLwpkaWZmIC0tZ2l0IGEvaWdycC5oIGIvaWdycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ODc2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pZ3JwLmgKQEAgLTAsMCArMSwzMyBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pZ3JwLmgsdiAxLjYgMjAwMi8xMi8xMSAwNzoxMzo1MiBndXkgRXhwICQgKExCTCkgKi8KKy8qIENpc2NvIElHUlAgZGVmaW5pdGlvbnMgKi8KKworLyogSUdSUCBIZWFkZXIgKi8KKworc3RydWN0IGlncnBoZHIgeworCXVfaW50OF90IGlnX3ZvcDsJLyogcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgLyBvcGNvZGUgKi8KKyNkZWZpbmUgSUdSUF9WKHgpCSgoKHgpICYgMHhmMCkgPj4gNCkKKyNkZWZpbmUgSUdSUF9PUCh4KQkoKHgpICYgMHgwZikKKwl1X2ludDhfdCBpZ19lZDsJCS8qIGVkaXRpb24gbnVtYmVyICovCisJdV9pbnQxNl90IGlnX2FzOwkvKiBhdXRvbm9tb3VzIHN5c3RlbSBudW1iZXIgKi8KKwl1X2ludDE2X3QgaWdfbmk7CS8qIG51bWJlciBvZiBzdWJuZXQgaW4gbG9jYWwgbmV0ICovCisJdV9pbnQxNl90IGlnX25zOwkvKiBudW1iZXIgb2YgbmV0d29ya3MgaW4gQVMgKi8KKwl1X2ludDE2X3QgaWdfbng7CS8qIG51bWJlciBvZiBuZXR3b3JrcyBvdXNpZGUgQVMgKi8KKwl1X2ludDE2X3QgaWdfc3VtOwkvKiBjaGVja3N1bSBvZiBJR1JQIGhlYWRlciAmIGRhdGEgKi8KK307CisKKyNkZWZpbmUgSUdSUF9VUERBVEUJMQorI2RlZmluZSBJR1JQX1JFUVVFU1QJMgorCisvKiBJR1JQIHJvdXRpbmcgZW50cnkgKi8KKworc3RydWN0IGlncnBydGUgeworCXVfaW50OF90IGlncl9uZXRbM107CS8qIDMgc2lnbmlmaWNhbnQgb2N0ZXRzIG9mIElQIGFkZHJlc3MgKi8KKwl1X2ludDhfdCBpZ3JfZGx5WzNdOwkvKiBkZWxheSBpbiB0ZW5zIG9mIG1pY3Jvc2Vjb25kcyAqLworCXVfaW50OF90IGlncl9id1szXTsJLyogYmFuZHdpZHRoIGluIHVuaXRzIG9mIDEga2IvcyAqLworCXVfaW50OF90IGlncl9tdHVbMl07CS8qIE1UVSBpbiBvY3RldHMgKi8KKwl1X2ludDhfdCBpZ3JfcmVsOwkvKiBwZXJjZW50IHBhY2tldHMgc3VjY2Vzc2Z1bGx5IHR4L3J4ICovCisJdV9pbnQ4X3QgaWdyX2xkOwkvKiBwZXJjZW50IG9mIGNoYW5uZWwgb2NjdXBpZWQgKi8KKwl1X2ludDhfdCBpZ3JfaGN0OwkvKiBob3AgY291bnQgKi8KK307CisKKyNkZWZpbmUgSUdSUF9SVEVfU0laRQkxNAkvKiBkb24ndCBiZWxpZXZlIHNpemVvZiAhICovCmRpZmYgLS1naXQgYS9pbnN0YWxsLXNoIGIvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYmM2NjkxCi0tLSAvZGV2L251bGwKKysrIGIvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI1MCBAQAorIyEgL2Jpbi9zaAorIworIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKyMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgorIworIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisjIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisjIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKKyMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisjIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3RyYW5zZm9ybWJhc2VuYW1lPSIiCit0cmFuc2Zvcm1fYXJnPSIiCitpbnN0Y21kPSIkbXZwcm9nIgorY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPSIiCitjaGdycGNtZD0iIgorc3RyaXBjbWQ9IiIKK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9IiIKK2RzdD0iIgorZGlyX2FyZz0iIgorCit3aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KKyAgICBjYXNlICQxIGluCisJLWMpIGluc3RjbWQ9IiRjcHByb2ciCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1kKSBkaXJfYXJnPXRydWUKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KKwkgICAgdGhlbgorCQlzcmM9JDEKKwkgICAgZWxzZQorCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKKwkJOgorCQlkc3Q9JDEKKwkgICAgZmkKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworICAgIGVzYWMKK2RvbmUKKworaWYgWyB4IiRzcmMiID0geCBdCit0aGVuCisJZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCisJZXhpdCAxCitlbHNlCisJdHJ1ZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KKwlkc3Q9JHNyYworCXNyYz0iIgorCQorCWlmIFsgLWQgJGRzdCBdOyB0aGVuCisJCWluc3RjbWQ9OgorCWVsc2UKKwkJaW5zdGNtZD1ta2RpcgorCWZpCitlbHNlCisKKyMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAorIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKKyMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorCisJaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQorCXRoZW4KKwkJdHJ1ZQorCWVsc2UKKwkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCisJCWV4aXQgMQorCWZpCisJCisJaWYgWyB4IiRkc3QiID0geCBdCisJdGhlbgorCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCisJCWV4aXQgMQorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCisjIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKKworCWlmIFsgLWQgJGRzdCBdCisJdGhlbgorCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAorCWVsc2UKKwkJdHJ1ZQorCWZpCitmaQorCisjIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKK2RzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKKworIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KKyMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAorCisjIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgoraWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCitkZWZhdWx0SUZTPScJCisnCitJRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgorCitvSUZTPSIke0lGU30iCisjIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgorSUZTPSclJworc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCitJRlM9IiR7b0lGU30iCisKK3BhdGhjb21wPScnCisKK3doaWxlIFsgJCMgLW5lIDAgXSA7IGRvCisJcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKKwlzaGlmdAorCisJaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7CisgICAgICAgIHRoZW4KKwkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCisJZWxzZQorCQl0cnVlCisJZmkKKworCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCitkb25lCitmaQorCitpZiBbIHgiJGRpcl9hcmciICE9IHggXQordGhlbgorCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKKwkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQorCWZpCisKKyMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQorCisJaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCisJZWxzZQorCQl0cnVlCisJZmkKKworIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCisKKwlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKKworCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgorCisjIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKKworIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCisjIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgorCisJaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKKwkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAorCitmaSAmJgorCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvaW50ZXJmYWNlLmggYi9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWJhODdkCi0tLSAvZGV2L251bGwKKysrIGIvaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMjAwMgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaW50ZXJmYWNlLmgsdiAxLjI0NC4yLjIxIDIwMDcvMDMvMjggMDc6NDU6NDYgaGFubmVzIEV4cCAkIChMQkwpCisgKi8KKworI2lmbmRlZiB0Y3BkdW1wX2ludGVyZmFjZV9oCisjZGVmaW5lIHRjcGR1bXBfaW50ZXJmYWNlX2gKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX19fQVRUUklCVVRFX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisKKy8qIHNucHJpbnRmIGV0IGFsICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9TTlBSSU5URikKK2ludCBzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQoraW50IHZzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJMQ0FUCitleHRlcm4gc2l6ZV90IHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgSEFWRV9TVFJMQ1BZCitleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkRVUAorZXh0ZXJuIGNoYXIgKnN0cmR1cChjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJTRVAKK2V4dGVybiBjaGFyICpzdHJzZXAoY2hhciAqKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjZGVmaW5lIFBUX1ZBVAkJMQkvKiBWaXN1YWwgQXVkaW8gVG9vbCAqLworI2RlZmluZSBQVF9XQgkJMgkvKiBkaXN0cmlidXRlZCBXaGl0ZSBCb2FyZCAqLworI2RlZmluZSBQVF9SUEMJCTMJLyogUmVtb3RlIFByb2NlZHVyZSBDYWxsICovCisjZGVmaW5lIFBUX1JUUAkJNAkvKiBSZWFsLVRpbWUgQXBwbGljYXRpb25zIHByb3RvY29sICovCisjZGVmaW5lIFBUX1JUQ1AJCTUJLyogUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBjb250cm9sIHByb3RvY29sICovCisjZGVmaW5lIFBUX1NOTVAJCTYJLyogU2ltcGxlIE5ldHdvcmsgTWFuYWdlbWVudCBQcm90b2NvbCAqLworI2RlZmluZSBQVF9DTkZQCQk3CS8qIENpc2NvIE5ldEZsb3cgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFRfVEZUUAkJOAkvKiB0cml2aWFsIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFRfQU9EVgkJOQkvKiBBZC1ob2MgT24tZGVtYW5kIERpc3RhbmNlIFZlY3RvciBQcm90b2NvbCAqLworCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpPihiKT8oYik6KGEpKQorI2VuZGlmCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKGIpPihhKT8oYik6KGEpKQorI2VuZGlmCisKKy8qCisgKiBUaGUgZGVmYXVsdCBzbmFwc2hvdCBsZW5ndGguICBUaGlzIHZhbHVlIGFsbG93cyBtb3N0IHByaW50ZXJzIHRvIHByaW50CisgKiB1c2VmdWwgaW5mb3JtYXRpb24gd2hpbGUga2VlcGluZyB0aGUgYW1vdW50IG9mIHVud2FudGVkIGRhdGEgZG93bi4KKyAqLworI2lmbmRlZiBJTkVUNgorI2RlZmluZSBERUZBVUxUX1NOQVBMRU4gNjgJLyogZXRoZXIgKyBJUHY0ICsgVENQICsgMTQgKi8KKyNlbHNlCisjZGVmaW5lIERFRkFVTFRfU05BUExFTiA5NgkvKiBldGhlciArIElQdjYgKyBUQ1AgKyAyMiAqLworI2VuZGlmCisKKyNpZm5kZWYgQklHX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOIDQzMjEKKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjZW5kaWYKKworI2RlZmluZSBFU1JDKGVwKSAoKGVwKS0+ZXRoZXJfc2hvc3QpCisjZGVmaW5lIEVEU1QoZXApICgoZXApLT5ldGhlcl9kaG9zdCkKKworI2lmbmRlZiBOVE9ITAorI2RlZmluZSBOVE9ITCh4KQkoeCkgPSBudG9obCh4KQorI2RlZmluZSBOVE9IUyh4KQkoeCkgPSBudG9ocyh4KQorI2RlZmluZSBIVE9OTCh4KQkoeCkgPSBodG9ubCh4KQorI2RlZmluZSBIVE9OUyh4KQkoeCkgPSBodG9ucyh4KQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKChhKTwoYik/KGEpOihiKSkKKyNlbmRpZgorCitleHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwkvKiB1c2VkIHRvIGdlbmVyYXRlIHNlbGYtaWRlbnRpZnlpbmcgbWVzc2FnZXMgKi8KKworZXh0ZXJuIGludDMyX3QgdGhpc3pvbmU7CS8qIHNlY29uZHMgb2Zmc2V0IGZyb20gZ210IHRvIGxvY2FsIHRpbWUgKi8KKworLyoKKyAqIFRydWUgaWYgICJsIiBieXRlcyBvZiAidmFyIiB3ZXJlIGNhcHR1cmVkLgorICoKKyAqIFRoZSAic25hcGVuZCAtIChsKSA8PSBzbmFwZW5kIiBjaGVja3MgdG8gbWFrZSBzdXJlICJsIiBpc24ndCBzbyBsYXJnZQorICogdGhhdCAic25hcGVuZCAtIChsKSIgdW5kZXJmbG93cy4KKyAqCisgKiBUaGUgY2hlY2sgaXMgZm9yIDw9IHJhdGhlciB0aGFuIDwgYmVjYXVzZSAibCIgbWlnaHQgYmUgMC4KKyAqLworI2RlZmluZSBUVEVTVDIodmFyLCBsKSAoc25hcGVuZCAtIChsKSA8PSBzbmFwZW5kICYmIFwKKwkJCShjb25zdCB1X2NoYXIgKikmKHZhcikgPD0gc25hcGVuZCAtIChsKSkKKworLyogVHJ1ZSBpZiAidmFyIiB3YXMgY2FwdHVyZWQgKi8KKyNkZWZpbmUgVFRFU1QodmFyKSBUVEVTVDIodmFyLCBzaXplb2YodmFyKSkKKworLyogQmFpbCBpZiAibCIgYnl0ZXMgb2YgInZhciIgd2VyZSBub3QgY2FwdHVyZWQgKi8KKyNkZWZpbmUgVENIRUNLMih2YXIsIGwpIGlmICghVFRFU1QyKHZhciwgbCkpIGdvdG8gdHJ1bmMKKworLyogQmFpbCBpZiAidmFyIiB3YXMgbm90IGNhcHR1cmVkICovCisjZGVmaW5lIFRDSEVDSyh2YXIpIFRDSEVDSzIodmFyLCBzaXplb2YodmFyKSkKKworZXh0ZXJuIHZvaWQgdHNfcHJpbnQoY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7CitleHRlcm4gdm9pZCByZWx0c19wcmludChpbnQpOworCitleHRlcm4gaW50IGZuX3ByaW50KGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gaW50IGZuX3ByaW50bihjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiBpbnQgZm5fcHJpbnR6cChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiBpbnQgbWFzazJwbGVuKHVfaW50MzJfdCk7CitleHRlcm4gY29uc3QgY2hhciAqdG9rMnN0cmFyeV9pbnRlcm5hbChjb25zdCBjaGFyICoqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNkZWZpbmUJdG9rMnN0cmFyeShhLGYsaSkgdG9rMnN0cmFyeV9pbnRlcm5hbChhLCBzaXplb2YoYSkvc2l6ZW9mKGFbMF0pLGYsaSkKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmRuYWRkcl9zdHJpbmcodV9zaG9ydCk7CisKK2V4dGVybiB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKQorICAgIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiB2b2lkIHdhcm5pbmcoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworZXh0ZXJuIGNoYXIgKnJlYWRfaW5maWxlKGNoYXIgKik7CitleHRlcm4gY2hhciAqY29weV9hcmd2KGNoYXIgKiopOworCitleHRlcm4gdm9pZCBzYWZlcHV0Y2hhcihpbnQpOworZXh0ZXJuIHZvaWQgc2FmZXB1dHMoY29uc3QgY2hhciAqLCBpbnQpOworCitleHRlcm4gY29uc3QgY2hhciAqaXNvbnNhcF9zdHJpbmcoY29uc3QgdV9jaGFyICosIHJlZ2lzdGVyIHVfaW50KTsKK2V4dGVybiBjb25zdCBjaGFyICpwcm90b2lkX3N0cmluZyhjb25zdCB1X2NoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqaXB4c2FwX3N0cmluZyh1X3Nob3J0KTsKK2V4dGVybiBjb25zdCBjaGFyICpkbm5hbWVfc3RyaW5nKHVfc2hvcnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmRubnVtX3N0cmluZyh1X3Nob3J0KTsKKworLyogVGhlIHByaW50ZXIgcm91dGluZXMuICovCisKKyNpbmNsdWRlIDxwY2FwLmg+CisKK2V4dGVybiBpbnQgcHJpbnRfdW5rbm93bl9kYXRhKGNvbnN0IHVfY2hhciAqLCBjb25zdCBjaGFyICosaW50KTsKK2V4dGVybiB2b2lkIGFzY2lpX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBoZXhfYW5kX2FzY2lpX3ByaW50X3dpdGhfb2Zmc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgdV9jaGFyICosCisJdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIGhleF9hbmRfYXNjaWlfcHJpbnQoY29uc3QgY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaGV4X3ByaW50X3dpdGhfb2Zmc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CitleHRlcm4gdm9pZCBoZXhfcHJpbnQoY29uc3QgY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgdGVsbmV0X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gaW50IGV0aGVyX2VuY2FwX3ByaW50KHVfc2hvcnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQsIHVfc2hvcnQgKik7CitleHRlcm4gaW50IGxsY19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50LCBjb25zdCB1X2NoYXIgKiwKKwljb25zdCB1X2NoYXIgKiwgdV9zaG9ydCAqKTsKK2V4dGVybiBpbnQgc25hcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50LCB1X3Nob3J0ICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGFhcnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGFvZHZfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgYXRhbGtfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGF0bV9wcmludCh1X2ludCwgdV9pbnQsIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB1X2ludCBhdG1faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBzdW5hdG1faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiBpbnQgb2FtX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOworZXh0ZXJuIHZvaWQgYm9vdHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGJncF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIGJlZXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGNuZnBfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGRlY25ldF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIGRlZmF1bHRfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGR2bXJwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBlZ3BfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB1X2ludCBlbmNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBwZmxvZ19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGFyY25ldF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGFyY25ldF9saW51eF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgZXRoZXJfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CitleHRlcm4gdV9pbnQgZXRoZXJfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCB0b2tlbl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB1X2ludCB0b2tlbl9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgZmRkaV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB1X2ludCBmZGRpX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQgZnJfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBtZnJfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBmcl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IG1mcl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IGllZWU4MDJfMTFfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBpZWVlODAyXzExX3JhZGlvX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLAorCWNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBhcDEzOTRfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGdyZV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaWNtcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgaWdtcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaWdycF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGlwTl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IGlwZmNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGlweF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaXNvY2xuc19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIGtyYl9wcmludChjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQgbGxhcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IGx0YWxrX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBtc2RwX3ByaW50KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbmZzcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBuZnNyZXFfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBuc19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGludCk7CitleHRlcm4gdm9pZCBudHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB1X2ludCBudWxsX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBvc3BmX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgb2xzcl9wcmludCAoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHBpbXYxX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBjaXNjb19hdXRvcnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHJzdnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGxkcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbG1wX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBsc3BwaW5nX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBlaWdycF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbW9iaWxlX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBwaW1fcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB1X2ludCBwcHBvZV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IHBwcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IHBwcF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IHBwcF9oZGxjX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQgcHBwX2JzZG9zX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQgcHBwb2VfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBwcmlzbV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgcTkzM19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIGludCB2amNfcHJpbnQocmVnaXN0ZXIgY29uc3QgY2hhciAqLCB1X3Nob3J0KTsKK2V4dGVybiB1X2ludCByYXdfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIHJpcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHVfaW50IHNsX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBsYW5lX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOworZXh0ZXJuIHVfaW50IGxhbmVfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBjaXBfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBzbF9ic2Rvc19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGNoZGxjX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQgY2hkbGNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX2F0bTFfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX2F0bTJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX21mcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGp1bmlwZXJfbWxmcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGp1bmlwZXJfbWxwcHBfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX3BwcG9lX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQganVuaXBlcl9wcHBvZV9hdG1fcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX2dnc25fcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX2VzX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQganVuaXBlcl9tb25pdG9yX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQganVuaXBlcl9zZXJ2aWNlc19wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGp1bmlwZXJfZXRoZXJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBqdW5pcGVyX3BwcF9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IGp1bmlwZXJfZnJlbGF5X3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdV9pbnQganVuaXBlcl9jaGRsY19wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHVfaW50IHNsbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgc25tcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgc3VucnBjcmVxdWVzdF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB1X2ludCBzeW1hbnRlY19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgdGNwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gdm9pZCB0ZnRwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCB0aW1lZF9wcmludChjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCB1ZHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIHdiX3ByaW50KGNvbnN0IHZvaWQgKiwgdV9pbnQpOworZXh0ZXJuIGludCBhaF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gaW50IGlwY29tcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgaW50ICopOworZXh0ZXJuIHZvaWQgcnhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIGludCwgaW50LCBpbnQsIHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIG5ldGJldWlfcHJpbnQodV9zaG9ydCwgY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gdm9pZCBpcHhfbmV0Ymlvc19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbmJ0X3RjcF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIG5idF91ZHAxMzdfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gdm9pZCBuYnRfdWRwMTM4X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIGNoYXIgKnNtYl9lcnJzdHIoaW50LCBpbnQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKm50X2VycnN0cih1X2ludDMyX3QpOworZXh0ZXJuIHZvaWQgcHJpbnRfZGF0YShjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBsMnRwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCB2cnJwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgaW50KTsKK2V4dGVybiB2b2lkIHNsb3dfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHBnbV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGNkcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIHN0cF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgcmFkaXVzX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBsd3Jlc19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgcHB0cF9wcmludChjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBkY2NwX3ByaW50KGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgc2N0cF9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIG1wbHNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIG1wbHNfbHNwX3BpbmdfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHplcGh5cl9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIGhzcnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGJmZF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIHNpcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgc3lzbG9nX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CisKKyNpZmRlZiBJTkVUNgorZXh0ZXJuIHZvaWQgaXA2X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBpcDZfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCBoYmhvcHRfcHJpbnQoY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGludCBkc3RvcHRfcHJpbnQoY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGludCBmcmFnNl9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGludCBtb2JpbGl0eV9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgaWNtcDZfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIHJpcG5nX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBydDZfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIG9zcGY2X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBkaGNwNl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworI2VuZGlmIC8qSU5FVDYqLworZXh0ZXJuIHVfc2hvcnQgaW5fY2tzdW0oY29uc3QgdV9zaG9ydCAqLCByZWdpc3RlciB1X2ludCwgaW50KTsKK2V4dGVybiB1X2ludDE2X3QgaW5fY2tzdW1fc2hvdWxkYmUodV9pbnQxNl90LCB1X2ludDE2X3QpOworCisjaWZuZGVmIEhBVkVfQlBGX0RVTVAKK3N0cnVjdCBicGZfcHJvZ3JhbTsKKworZXh0ZXJuIHZvaWQgYnBmX2R1bXAoc3RydWN0IGJwZl9wcm9ncmFtICosIGludCk7CisKKyNlbmRpZgorCisjaW5jbHVkZSAibmV0ZGlzc2VjdC5oIgorCisvKiBmb3J3YXJkIGNvbXBhdGliaWxpdHkgKi8KKworZXh0ZXJuIG5ldGRpc3NlY3Rfb3B0aW9ucyAqZ25kbzsKKworI2RlZmluZSBlZmxhZyBnbmRvLT5uZG9fZWZsYWcgCisjZGVmaW5lIGZmbGFnIGduZG8tPm5kb19mZmxhZyAKKyNkZWZpbmUgbmZsYWcgZ25kby0+bmRvX25mbGFnIAorI2RlZmluZSBOZmxhZyBnbmRvLT5uZG9fTmZsYWcgCisjZGVmaW5lIE9mbGFnIGduZG8tPm5kb19PZmxhZyAKKyNkZWZpbmUgcGZsYWcgZ25kby0+bmRvX3BmbGFnIAorI2RlZmluZSBxZmxhZyBnbmRvLT5uZG9fcWZsYWcgCisjZGVmaW5lIFJmbGFnIGduZG8tPm5kb19SZmxhZyAKKyNkZWZpbmUgc2ZsYWcgZ25kby0+bmRvX3NmbGFnIAorI2RlZmluZSBTZmxhZyBnbmRvLT5uZG9fU2ZsYWcgCisjZGVmaW5lIHRmbGFnIGduZG8tPm5kb190ZmxhZyAKKyNkZWZpbmUgVWZsYWcgZ25kby0+bmRvX1VmbGFnIAorI2RlZmluZSB1ZmxhZyBnbmRvLT5uZG9fdWZsYWcgCisjZGVmaW5lIHZmbGFnIGduZG8tPm5kb192ZmxhZyAKKyNkZWZpbmUgeGZsYWcgZ25kby0+bmRvX3hmbGFnIAorI2RlZmluZSBYZmxhZyBnbmRvLT5uZG9fWGZsYWcgCisjZGVmaW5lIENmbGFnIGduZG8tPm5kb19DZmxhZyAKKyNkZWZpbmUgQWZsYWcgZ25kby0+bmRvX0FmbGFnIAorI2RlZmluZSBzdXBwcmVzc19kZWZhdWx0X3ByaW50IGduZG8tPm5kb19zdXBwcmVzc19kZWZhdWx0X3ByaW50CisjZGVmaW5lIHBhY2tldHR5cGUgZ25kby0+bmRvX3BhY2tldHR5cGUKKyNkZWZpbmUgdGNwbWQ1c2VjcmV0IGduZG8tPm5kb190Y3BtZDVzZWNyZXQKKyNkZWZpbmUgV2ZsYWcgZ25kby0+bmRvX1dmbGFnCisjZGVmaW5lIFdmbGFnQ2hhcnMgZ25kby0+bmRvX1dmbGFnQ2hhcnMKKyNkZWZpbmUgQ2ZsYWdfY291bnQgZ25kby0+bmRvX0NmbGFnX2NvdW50CisjZGVmaW5lIHNuYXBsZW4gICAgIGduZG8tPm5kb19zbmFwbGVuCisjZGVmaW5lIHNuYXBlbmQgICAgIGduZG8tPm5kb19zbmFwZW5kCisKZGlmZiAtLWdpdCBhL2lwLmggYi9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzJhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pcC5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2lwLmgsdiAxLjExLjIuMSAyMDA3LzA5LzE0IDAxOjMwOjAyIGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXAuaAk4LjIgKEJlcmtlbGV5KSA2LzEvOTQKKyAqLworCisvKgorICogRGVmaW5pdGlvbnMgZm9yIGludGVybmV0IHByb3RvY29sIHZlcnNpb24gNC4KKyAqIFBlciBSRkMgNzkxLCBTZXB0ZW1iZXIgMTk4MS4KKyAqLworI2RlZmluZQlJUFZFUlNJT04JNAorCisvKgorICogU3RydWN0dXJlIG9mIGFuIGludGVybmV0IGhlYWRlciwgbmFrZWQgb2Ygb3B0aW9ucy4KKyAqCisgKiBXZSBkZWNsYXJlIGlwX2xlbiBhbmQgaXBfb2ZmIHRvIGJlIHNob3J0LCByYXRoZXIgdGhhbiB1X3Nob3J0CisgKiBwcmFnbWF0aWNhbGx5IHNpbmNlIG90aGVyd2lzZSB1bnNpZ25lZCBjb21wYXJpc29ucyBjYW4gcmVzdWx0CisgKiBhZ2FpbnN0IG5lZ2F0aXZlIGludGVnZXJzIHF1aXRlIGVhc2lseSwgYW5kIGZhaWwgaW4gc3VidGxlIHdheXMuCisgKi8KK3N0cnVjdCBpcCB7CisJdV9pbnQ4X3QJaXBfdmhsOwkJLyogaGVhZGVyIGxlbmd0aCwgdmVyc2lvbiAqLworI2RlZmluZSBJUF9WKGlwKQkoKChpcCktPmlwX3ZobCAmIDB4ZjApID4+IDQpCisjZGVmaW5lIElQX0hMKGlwKQkoKGlwKS0+aXBfdmhsICYgMHgwZikKKwl1X2ludDhfdAlpcF90b3M7CQkvKiB0eXBlIG9mIHNlcnZpY2UgKi8KKwl1X2ludDE2X3QJaXBfbGVuOwkJLyogdG90YWwgbGVuZ3RoICovCisJdV9pbnQxNl90CWlwX2lkOwkJLyogaWRlbnRpZmljYXRpb24gKi8KKwl1X2ludDE2X3QJaXBfb2ZmOwkJLyogZnJhZ21lbnQgb2Zmc2V0IGZpZWxkICovCisjZGVmaW5lCUlQX0RGIDB4NDAwMAkJCS8qIGRvbnQgZnJhZ21lbnQgZmxhZyAqLworI2RlZmluZQlJUF9NRiAweDIwMDAJCQkvKiBtb3JlIGZyYWdtZW50cyBmbGFnICovCisjZGVmaW5lCUlQX09GRk1BU0sgMHgxZmZmCQkvKiBtYXNrIGZvciBmcmFnbWVudGluZyBiaXRzICovCisJdV9pbnQ4X3QJaXBfdHRsOwkJLyogdGltZSB0byBsaXZlICovCisJdV9pbnQ4X3QJaXBfcDsJCS8qIHByb3RvY29sICovCisJdV9pbnQxNl90CWlwX3N1bTsJCS8qIGNoZWNrc3VtICovCisJc3RydWN0CWluX2FkZHIgaXBfc3JjLGlwX2RzdDsJLyogc291cmNlIGFuZCBkZXN0IGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUJSVBfTUFYUEFDS0VUCTY1NTM1CQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSVAgdHlwZSBvZiBzZXJ2aWNlIChpcF90b3MpCisgKi8KKyNkZWZpbmUJSVBUT1NfTE9XREVMQVkJCTB4MTAKKyNkZWZpbmUJSVBUT1NfVEhST1VHSFBVVAkweDA4CisjZGVmaW5lCUlQVE9TX1JFTElBQklMSVRZCTB4MDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBJUCBwcmVjZWRlbmNlIChhbHNvIGluIGlwX3RvcykgKGhvcGVmdWxseSB1bnVzZWQpCisgKi8KKyNkZWZpbmUJSVBUT1NfUFJFQ19ORVRDT05UUk9MCQkweGUwCisjZGVmaW5lCUlQVE9TX1BSRUNfSU5URVJORVRDT05UUk9MCTB4YzAKKyNkZWZpbmUJSVBUT1NfUFJFQ19DUklUSUNfRUNQCQkweGEwCisjZGVmaW5lCUlQVE9TX1BSRUNfRkxBU0hPVkVSUklERQkweDgwCisjZGVmaW5lCUlQVE9TX1BSRUNfRkxBU0gJCTB4NjAKKyNkZWZpbmUJSVBUT1NfUFJFQ19JTU1FRElBVEUJCTB4NDAKKyNkZWZpbmUJSVBUT1NfUFJFQ19QUklPUklUWQkJMHgyMAorI2RlZmluZQlJUFRPU19QUkVDX1JPVVRJTkUJCTB4MDAKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBvcHRpb25zLgorICovCisjZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSYweDgwKQorI2RlZmluZQlJUE9QVF9DTEFTUyhvKQkJKChvKSYweDYwKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykmMHgxZikKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9ERUJNRUFTCQkweDQwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lCUlQT1BUX0VPTAkJMAkJLyogZW5kIG9mIG9wdGlvbiBsaXN0ICovCisjZGVmaW5lCUlQT1BUX05PUAkJMQkJLyogbm8gb3BlcmF0aW9uICovCisKKyNkZWZpbmUJSVBPUFRfUlIJCTcJCS8qIHJlY29yZCBwYWNrZXQgcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfVFMJCTY4CQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSVBPUFRfUkZDMTM5MyAgICAgICAgICAgODIgICAgICAgICAgICAgIC8qIHRyYWNlcm91dGUgUkZDIDEzOTMgKi8KKyNkZWZpbmUJSVBPUFRfU0VDVVJJVFkJCTEzMAkJLyogcHJvdmlkZSBzLGMsaCx0Y2MgKi8KKyNkZWZpbmUJSVBPUFRfTFNSUgkJMTMxCQkvKiBsb29zZSBzb3VyY2Ugcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfU0FUSUQJCTEzNgkJLyogc2F0bmV0IGlkICovCisjZGVmaW5lCUlQT1BUX1NTUlIJCTEzNwkJLyogc3RyaWN0IHNvdXJjZSByb3V0ZSAqLworI2RlZmluZSBJUE9QVF9SQSAgICAgICAgICAgICAgICAxNDggICAgICAgICAgICAgLyogcm91dGVyLWFsZXJ0LCByZmMyMTEzICovCisKKy8qCisgKiBPZmZzZXRzIHRvIGZpZWxkcyBpbiBvcHRpb25zIG90aGVyIHRoYW4gRU9MIGFuZCBOT1AuCisgKi8KKyNkZWZpbmUJSVBPUFRfT1BUVkFMCQkwCQkvKiBvcHRpb24gSUQgKi8KKyNkZWZpbmUJSVBPUFRfT0xFTgkJMQkJLyogb3B0aW9uIGxlbmd0aCAqLworI2RlZmluZSBJUE9QVF9PRkZTRVQJCTIJCS8qIG9mZnNldCB3aXRoaW4gb3B0aW9uICovCisjZGVmaW5lCUlQT1BUX01JTk9GRgkJNAkJLyogbWluIHZhbHVlIG9mIGFib3ZlICovCisKKy8qCisgKiBUaW1lIHN0YW1wIG9wdGlvbiBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdAlpcF90aW1lc3RhbXAgeworCXVfaW50OF90CWlwdF9jb2RlOwkvKiBJUE9QVF9UUyAqLworCXVfaW50OF90CWlwdF9sZW47CS8qIHNpemUgb2Ygc3RydWN0dXJlICh2YXJpYWJsZSkgKi8KKwl1X2ludDhfdAlpcHRfcHRyOwkvKiBpbmRleCBvZiBjdXJyZW50IGVudHJ5ICovCisJdV9pbnQ4X3QJaXB0X29mbHdmbGc7CS8qIGZsYWdzLCBvdmVyZmxvdyBjb3VudGVyICovCisjZGVmaW5lIElQVFNfT0ZMVyhpcCkJKCgoaXB0KS0+aXB0X29mbHdmbGcgJiAweGYwKSA+PiA0KQorI2RlZmluZSBJUFRTX0ZMRyhpcCkJKChpcHQpLT5pcHRfb2Zsd2ZsZyAmIDB4MGYpCisJdW5pb24gaXB0X3RpbWVzdGFtcCB7CisJCXVfaW50MzJfdCBpcHRfdGltZVsxXTsKKwkJc3RydWN0CWlwdF90YSB7CisJCQlzdHJ1Y3QgaW5fYWRkciBpcHRfYWRkcjsKKwkJCXVfaW50MzJfdCBpcHRfdGltZTsKKwkJfSBpcHRfdGFbMV07CisJfSBpcHRfdGltZXN0YW1wOworfTsKKworLyogZmxhZyBiaXRzIGZvciBpcHRfZmxnICovCisjZGVmaW5lCUlQT1BUX1RTX1RTT05MWQkJMAkJLyogdGltZXN0YW1wcyBvbmx5ICovCisjZGVmaW5lCUlQT1BUX1RTX1RTQU5EQUREUgkxCQkvKiB0aW1lc3RhbXBzIGFuZCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJSVBPUFRfVFNfUFJFU1BFQwkzCQkvKiBzcGVjaWZpZWQgbW9kdWxlcyBvbmx5ICovCisKKy8qIGJpdHMgZm9yIHNlY3VyaXR5IChub3QgYnl0ZSBzd2FwcGVkKSAqLworI2RlZmluZQlJUE9QVF9TRUNVUl9VTkNMQVNTCTB4MDAwMAorI2RlZmluZQlJUE9QVF9TRUNVUl9DT05GSUQJMHhmMTM1CisjZGVmaW5lCUlQT1BUX1NFQ1VSX0VGVE8JMHg3ODlhCisjZGVmaW5lCUlQT1BUX1NFQ1VSX01NTU0JMHhiYzRkCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1JFU1RSCTB4YWYxMworI2RlZmluZQlJUE9QVF9TRUNVUl9TRUNSRVQJMHhkNzg4CisjZGVmaW5lCUlQT1BUX1NFQ1VSX1RPUFNFQ1JFVAkweDZiYzUKKworLyoKKyAqIEludGVybmV0IGltcGxlbWVudGF0aW9uIHBhcmFtZXRlcnMuCisgKi8KKyNkZWZpbmUJTUFYVFRMCQkyNTUJCS8qIG1heGltdW0gdGltZSB0byBsaXZlIChzZWNvbmRzKSAqLworI2RlZmluZQlJUERFRlRUTAk2NAkJLyogZGVmYXVsdCB0dGwsIGZyb20gUkZDIDEzNDAgKi8KKyNkZWZpbmUJSVBGUkFHVFRMCTYwCQkvKiB0aW1lIHRvIGxpdmUgZm9yIGZyYWdzLCBzbG93aHogKi8KKyNkZWZpbmUJSVBUVExERUMJMQkJLyogc3VidHJhY3RlZCB3aGVuIGZvcndhcmRpbmcgKi8KKworI2RlZmluZQlJUF9NU1MJCTU3NgkJLyogZGVmYXVsdCBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworCisvKiBpbiBwcmludC1pcC5jICovCitleHRlcm4gdV9pbnQzMl90IGlwX2ZpbmRkc3QoY29uc3Qgc3RydWN0IGlwICopOwpkaWZmIC0tZ2l0IGEvaXA2LmggYi9pcDYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y0NjVjCi0tLSAvZGV2L251bGwKKysrIGIvaXA2LmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaXA2LmgsdiAxLjYuNC4xIDIwMDUvMDQvMjAgMTA6MDQ6MzcgZ3V5IEV4cCAkIChMQkwpICovCisvKgkkTmV0QlNEOiBpcDYuaCx2IDEuOSAyMDAwLzA3LzEzIDA1OjM0OjIxIGl0b2p1biBFeHAgJAkqLworLyoJJEtBTUU6IGlwNi5oLHYgMS45IDIwMDAvMDcvMDIgMjE6MDE6MzIgaXRvanVuIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICovCisKKyNpZm5kZWYgX05FVElORVRfSVA2X0hfCisjZGVmaW5lIF9ORVRJTkVUX0lQNl9IXworCisvKgorICogRGVmaW5pdGlvbiBmb3IgaW50ZXJuZXQgcHJvdG9jb2wgdmVyc2lvbiA2LgorICogUkZDIDI0NjAKKyAqLworCitzdHJ1Y3QgaXA2X2hkciB7CisJdW5pb24geworCQlzdHJ1Y3QgaXA2X2hkcmN0bCB7CisJCQl1X2ludDMyX3QgaXA2X3VuMV9mbG93OwkvKiAyMCBiaXRzIG9mIGZsb3ctSUQgKi8KKwkJCXVfaW50MTZfdCBpcDZfdW4xX3BsZW47CS8qIHBheWxvYWQgbGVuZ3RoICovCisJCQl1X2ludDhfdCAgaXA2X3VuMV9ueHQ7CS8qIG5leHQgaGVhZGVyICovCisJCQl1X2ludDhfdCAgaXA2X3VuMV9obGltOwkvKiBob3AgbGltaXQgKi8KKwkJfSBpcDZfdW4xOworCQl1X2ludDhfdCBpcDZfdW4yX3ZmYzsJLyogNCBiaXRzIHZlcnNpb24sIHRvcCA0IGJpdHMgY2xhc3MgKi8KKwl9IGlwNl9jdGx1bjsKKwlzdHJ1Y3QgaW42X2FkZHIgaXA2X3NyYzsJLyogc291cmNlIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgaXA2X2RzdDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLworfTsKKworI2RlZmluZSBpcDZfdmZjCQlpcDZfY3RsdW4uaXA2X3VuMl92ZmMKKyNkZWZpbmUgaXA2X2Zsb3cJaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9mbG93CisjZGVmaW5lIGlwNl9wbGVuCWlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfcGxlbgorI2RlZmluZSBpcDZfbnh0CQlpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX254dAorI2RlZmluZSBpcDZfaGxpbQlpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KKyNkZWZpbmUgaXA2X2hvcHMJaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9obGltCisKKy8qIGluIG5ldHdvcmsgZW5kaWFuICovCisjZGVmaW5lIElQVjZfRkxPV0lORk9fTUFTSwkoKHVfaW50MzJfdClodG9ubCgweDBmZmZmZmZmKSkJLyogZmxvdyBpbmZvICgyOCBiaXRzKSAqLworI2RlZmluZSBJUFY2X0ZMT1dMQUJFTF9NQVNLCSgodV9pbnQzMl90KWh0b25sKDB4MDAwZmZmZmYpKQkvKiBmbG93IGxhYmVsICgyMCBiaXRzKSAqLworI2lmIDEKKy8qIEVDTiBiaXRzIHByb3Bvc2VkIGJ5IFNhbGx5IEZsb3lkICovCisjZGVmaW5lIElQNlRPU19DRQkJMHgwMQkvKiBjb25nZXN0aW9uIGV4cGVyaWVuY2VkICovCisjZGVmaW5lIElQNlRPU19FQ1QJCTB4MDIJLyogRUNOLWNhcGFibGUgdHJhbnNwb3J0ICovCisjZW5kaWYKKworLyoKKyAqIEV4dGVuc2lvbiBIZWFkZXJzCisgKi8KKworc3RydWN0CWlwNl9leHQgeworCXVfY2hhcglpcDZlX254dDsKKwl1X2NoYXIJaXA2ZV9sZW47Cit9OworCisvKiBIb3AtYnktSG9wIG9wdGlvbnMgaGVhZGVyICovCisvKiBYWFggc2hvdWxkIHdlIHBhZCBpdCB0byBmb3JjZSBhbGlnbm1lbnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5PyAqLworc3RydWN0IGlwNl9oYmggeworCXVfaW50OF90IGlwNmhfbnh0OwkvKiBuZXh0IGhlYWRlciAqLworCXVfaW50OF90IGlwNmhfbGVuOwkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMgKi8KKwkvKiBmb2xsb3dlZCBieSBvcHRpb25zICovCit9OworCisvKiBEZXN0aW5hdGlvbiBvcHRpb25zIGhlYWRlciAqLworLyogWFhYIHNob3VsZCB3ZSBwYWQgaXQgdG8gZm9yY2UgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeT8gKi8KK3N0cnVjdCBpcDZfZGVzdCB7CisJdV9pbnQ4X3QgaXA2ZF9ueHQ7CS8qIG5leHQgaGVhZGVyICovCisJdV9pbnQ4X3QgaXA2ZF9sZW47CS8qIGxlbmd0aCBpbiB1bml0cyBvZiA4IG9jdGV0cyAqLworCS8qIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KK307CisKKy8qIE9wdGlvbiB0eXBlcyBhbmQgcmVsYXRlZCBtYWNyb3MgKi8KKyNkZWZpbmUgSVA2T1BUX1BBRDEJCTB4MDAJLyogMDAgMCAwMDAwMCAqLworI2RlZmluZSBJUDZPUFRfUEFETgkJMHgwMQkvKiAwMCAwIDAwMDAxICovCisjZGVmaW5lIElQNk9QVF9KVU1CTwkJMHhDMgkvKiAxMSAwIDAwMDEwID0gMTk0ICovCisjZGVmaW5lIElQNk9QVF9KVU1CT19MRU4JNgorI2RlZmluZSBJUDZPUFRfUk9VVEVSX0FMRVJUCTB4MDUJLyogMDAgMCAwMDEwMSAqLworCisjZGVmaW5lIElQNk9QVF9SVEFMRVJUX0xFTgk0CisjZGVmaW5lIElQNk9QVF9SVEFMRVJUX01MRAkwCS8qIERhdGFncmFtIGNvbnRhaW5zIGFuIE1MRCBtZXNzYWdlICovCisjZGVmaW5lIElQNk9QVF9SVEFMRVJUX1JTVlAJMQkvKiBEYXRhZ3JhbSBjb250YWlucyBhbiBSU1ZQIG1lc3NhZ2UgKi8KKyNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfQUNUTkVUCTIgCS8qIGNvbnRhaW5zIGFuIEFjdGl2ZSBOZXR3b3JrcyBtc2cgKi8KKyNkZWZpbmUgSVA2T1BUX01JTkxFTgkJMgorCisjZGVmaW5lIElQNk9QVF9CSU5ESU5HX1VQREFURQkweGM2CS8qIDExIDAgMDAxMTAgKi8KKyNkZWZpbmUgSVA2T1BUX0JJTkRJTkdfQUNLCTB4MDcJLyogMDAgMCAwMDExMSAqLworI2RlZmluZSBJUDZPUFRfQklORElOR19SRVEJMHgwOAkvKiAwMCAwIDAxMDAwICovCisjZGVmaW5lIElQNk9QVF9IT01FX0FERFJFU1MJMHhjOQkvKiAxMSAwIDAxMDAxICovCisjZGVmaW5lIElQNk9QVF9FSUQJCTB4OGEJLyogMTAgMCAwMTAxMCAqLworCisjZGVmaW5lIElQNk9QVF9UWVBFKG8pCQkoKG8pICYgMHhDMCkKKyNkZWZpbmUgSVA2T1BUX1RZUEVfU0tJUAkweDAwCisjZGVmaW5lIElQNk9QVF9UWVBFX0RJU0NBUkQJMHg0MAorI2RlZmluZSBJUDZPUFRfVFlQRV9GT1JDRUlDTVAJMHg4MAorI2RlZmluZSBJUDZPUFRfVFlQRV9JQ01QCTB4QzAKKworI2RlZmluZSBJUDZPUFRfTVVUQUJMRQkJMHgyMAorCisvKiBSb3V0aW5nIGhlYWRlciAqLworc3RydWN0IGlwNl9ydGhkciB7CisJdV9pbnQ4X3QgIGlwNnJfbnh0OwkvKiBuZXh0IGhlYWRlciAqLworCXVfaW50OF90ICBpcDZyX2xlbjsJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisJdV9pbnQ4X3QgIGlwNnJfdHlwZTsJLyogcm91dGluZyB0eXBlICovCisJdV9pbnQ4X3QgIGlwNnJfc2VnbGVmdDsJLyogc2VnbWVudHMgbGVmdCAqLworCS8qIGZvbGxvd2VkIGJ5IHJvdXRpbmcgdHlwZSBzcGVjaWZpYyBkYXRhICovCit9OworCisvKiBUeXBlIDAgUm91dGluZyBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfcnRoZHIwIHsKKwl1X2ludDhfdCAgaXA2cjBfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKwl1X2ludDhfdCAgaXA2cjBfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisJdV9pbnQ4X3QgIGlwNnIwX3R5cGU7CQkvKiBhbHdheXMgemVybyAqLworCXVfaW50OF90ICBpcDZyMF9zZWdsZWZ0OwkvKiBzZWdtZW50cyBsZWZ0ICovCisJdV9pbnQ4X3QgIGlwNnIwX3Jlc2VydmVkOwkvKiByZXNlcnZlZCBmaWVsZCAqLworCXVfaW50OF90ICBpcDZyMF9zbG1hcFszXTsJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KKwlzdHJ1Y3QgaW42X2FkZHIgaXA2cjBfYWRkclsxXTsJLyogdXAgdG8gMjMgYWRkcmVzc2VzICovCit9OworCisvKiBGcmFnbWVudCBoZWFkZXIgKi8KK3N0cnVjdCBpcDZfZnJhZyB7CisJdV9pbnQ4X3QgIGlwNmZfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KKwl1X2ludDhfdCAgaXA2Zl9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZmllbGQgKi8KKwl1X2ludDE2X3QgaXA2Zl9vZmZsZzsJCS8qIG9mZnNldCwgcmVzZXJ2ZWQsIGFuZCBmbGFnICovCisJdV9pbnQzMl90IGlwNmZfaWRlbnQ7CQkvKiBpZGVudGlmaWNhdGlvbiAqLworfTsKKworI2RlZmluZSBJUDZGX09GRl9NQVNLCQkweGZmZjgJLyogbWFzayBvdXQgb2Zmc2V0IGZyb20gaXA2Zl9vZmZsZyAqLworI2RlZmluZSBJUDZGX1JFU0VSVkVEX01BU0sJMHgwMDA2CS8qIHJlc2VydmVkIGJpdHMgaW4gaXA2Zl9vZmZsZyAqLworI2RlZmluZSBJUDZGX01PUkVfRlJBRwkJMHgwMDAxCS8qIG1vcmUtZnJhZ21lbnRzIGZsYWcgKi8KKworI2VuZGlmIC8qIG5vdCBfTkVUSU5FVF9JUDZfSF8gKi8KZGlmZiAtLWdpdCBhL2lwZmMuaCBiL2lwZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyZDRhCi0tLSAvZGV2L251bGwKKysrIGIvaXBmYy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2lwZmMuaCx2IDEuNCAyMDAyLzEyLzExIDA3OjEzOjUzIGd1eSBFeHAgJCAoTEJMKQorICovCisKK3N0cnVjdCBpcGZjX2hlYWRlciB7CisJdV9jaGFyICBpcGZjX2Rob3N0WzhdOworCXVfY2hhciAgaXBmY19zaG9zdFs4XTsKK307CisKKyNkZWZpbmUgSVBGQ19IRFJMRU4gMTYKZGlmZiAtLWdpdCBhL2lwcHJvdG8uYyBiL2lwcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NmVhMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvaXBwcm90by5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pcHByb3RvLmMsdiAxLjMuMi4zIDIwMDUvMDkvMjAgMDY6MDU6MzcgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaXBwcm90by5oIgorCitzdHJ1Y3QgdG9rIGlwcHJvdG9fdmFsdWVzW10gPSB7CisgICAgeyBJUFBST1RPX0hPUE9QVFMsICJPcHRpb25zIiB9LAorICAgIHsgSVBQUk9UT19JQ01QLCAiSUNNUCIgfSwKKyAgICB7IElQUFJPVE9fSUdNUCwgIklHTVAiIH0sCisgICAgeyBJUFBST1RPX0lQVjQsICJJUElQIiB9LAorICAgIHsgSVBQUk9UT19UQ1AsICJUQ1AiIH0sCisgICAgeyBJUFBST1RPX0VHUCwgIkVHUCIgfSwKKyAgICB7IElQUFJPVE9fUElHUCwgIklHUlAiIH0sCisgICAgeyBJUFBST1RPX1VEUCwgIlVEUCIgfSwKKyAgICB7IElQUFJPVE9fRENDUCwgIkRDQ1AiIH0sCisgICAgeyBJUFBST1RPX0lQVjYsICJJUHY2IiB9LAorICAgIHsgSVBQUk9UT19ST1VUSU5HLCAiUm91dGluZyIgfSwKKyAgICB7IElQUFJPVE9fRlJBR01FTlQsICJGcmFnbWVudCIgfSwKKyAgICB7IElQUFJPVE9fUlNWUCwgIlJTVlAiIH0sCisgICAgeyBJUFBST1RPX0dSRSwgIkdSRSIgfSwKKyAgICB7IElQUFJPVE9fRVNQLCAiRVNQIiB9LAorICAgIHsgSVBQUk9UT19BSCwgIkFIIiB9LAorICAgIHsgSVBQUk9UT19NT0JJTEUsICJNb2JpbGUgSVAiIH0sCisgICAgeyBJUFBST1RPX0lDTVBWNiwgIklDTVB2NiIgfSwKKyAgICB7IElQUFJPVE9fTU9CSUxJVFlfT0xELCAiTW9iaWxlIElQIChvbGQpIiB9LAorICAgIHsgSVBQUk9UT19FSUdSUCwgIkVJR1JQIiB9LAorICAgIHsgSVBQUk9UT19PU1BGLCAiT1NQRiIgfSwKKyAgICB7IElQUFJPVE9fUElNLCAiUElNIiB9LAorICAgIHsgSVBQUk9UT19JUENPTVAsICJDb21wcmVzc2VkIElQIiB9LAorICAgIHsgSVBQUk9UT19WUlJQLCAiVlJSUCIgfSwKKyAgICB7IElQUFJPVE9fUEdNLCAiUEdNIiB9LAorICAgIHsgSVBQUk9UT19TQ1RQLCAiU0NUUCIgfSwKKyAgICB7IElQUFJPVE9fTU9CSUxJVFksICJNb2JpbGl0eSIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKwpkaWZmIC0tZ2l0IGEvaXBwcm90by5oIGIvaXBwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGY3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9pcHByb3RvLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pcHByb3RvLmgsdiAxLjQuMi4yIDIwMDUvMDkvMjAgMDY6MDU6MzcgZ3V5IEV4cCAkIChMQkwpCisgKgorICogRnJvbToKKyAqCUAoIylpbi5oCTguMyAoQmVya2VsZXkpIDEvMy85NAorICogJEZyZWVCU0Q6IHNyYy9zeXMvbmV0aW5ldC9pbi5oLHYgMS4zOC4yLjMgMTk5OS8wOC8yOSAxNjoyOTozNCBwZXRlciBFeHAgJAorICovCisKK2V4dGVybiBzdHJ1Y3QgdG9rIGlwcHJvdG9fdmFsdWVzW107CisKKyNpZm5kZWYgSVBQUk9UT19JUAorI2RlZmluZQlJUFBST1RPX0lQCQkwCQkvKiBkdW1teSBmb3IgSVAgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0hPUE9QVFMKKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCQkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucyAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fSUNNUAorI2RlZmluZQlJUFBST1RPX0lDTVAJCTEJCS8qIGNvbnRyb2wgbWVzc2FnZSBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fSUdNUAorI2RlZmluZQlJUFBST1RPX0lHTVAJCTIJCS8qIGdyb3VwIG1nbXQgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0lQVjQKKyNkZWZpbmUgSVBQUk9UT19JUFY0CQk0CisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19UQ1AKKyNkZWZpbmUJSVBQUk9UT19UQ1AJCTYJCS8qIHRjcCAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fRUdQCisjZGVmaW5lCUlQUFJPVE9fRUdQCQk4CQkvKiBleHRlcmlvciBnYXRld2F5IHByb3RvY29sICovCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19QSUdQCisjZGVmaW5lIElQUFJPVE9fUElHUAkJOQorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fVURQCisjZGVmaW5lCUlQUFJPVE9fVURQCQkxNwkJLyogdXNlciBkYXRhZ3JhbSBwcm90b2NvbCAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fRENDUAorI2RlZmluZQlJUFBST1RPX0RDQ1AJCTMzCQkvKiBkYXRhZ3JhbSBjb25nZXN0aW9uIGNvbnRyb2wgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0lQVjYKKyNkZWZpbmUgSVBQUk9UT19JUFY2CQk0MQorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fUk9VVElORworI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCTQzCQkvKiBJUHY2IHJvdXRpbmcgaGVhZGVyICovCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19GUkFHTUVOVAorI2RlZmluZSBJUFBST1RPX0ZSQUdNRU5UCTQ0CQkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyICovCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19SU1ZQCisjZGVmaW5lIElQUFJPVE9fUlNWUAkJNDYgCQkvKiByZXNvdXJjZSByZXNlcnZhdGlvbiAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fR1JFCisjZGVmaW5lCUlQUFJPVE9fR1JFCQk0NwkJLyogR2VuZXJhbCBSb3V0aW5nIEVuY2FwLiAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fRVNQCisjZGVmaW5lCUlQUFJPVE9fRVNQCQk1MAkJLyogU0lQUCBFbmNhcCBTZWMuIFBheWxvYWQgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0FICisjZGVmaW5lCUlQUFJPVE9fQUgJCTUxCQkvKiBTSVBQIEF1dGggSGVhZGVyICovCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19NT0JJTEUKKyNkZWZpbmUgSVBQUk9UT19NT0JJTEUJCTU1CisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19JQ01QVjYKKyNkZWZpbmUgSVBQUk9UT19JQ01QVjYJCTU4CQkvKiBJQ01QdjYgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX05PTkUKKyNkZWZpbmUgSVBQUk9UT19OT05FCQk1OQkJLyogSVB2NiBubyBuZXh0IGhlYWRlciAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fRFNUT1BUUworI2RlZmluZSBJUFBST1RPX0RTVE9QVFMJCTYwCQkvKiBJUHY2IGRlc3RpbmF0aW9uIG9wdGlvbnMgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX01PQklMSVRZX09MRAorLyoKKyAqIFRoZSBjdXJyZW50IFByb3RvY29sIE51bWJlcnMgbGlzdCBzYXlzIHRoYXQgdGhlIElQIHByb3RvY29sIG51bWJlciBmb3IKKyAqIG1vYmlsaXR5IGhlYWRlcnMgaXMgMTM1OyBpdCBjaXRlcyBkcmFmdC1pZXRmLW1vYmlsZWlwLWlwdjYtMjQsIGJ1dAorICogdGhhdCBkcmFmdCBkb2Vzbid0IGFjdHVhbGx5IGdpdmUgYSBudW1iZXIuCisgKgorICogSXQgYXBwZWFycyB0aGF0IDYyIHVzZWQgdG8gYmUgdXNlZCwgZXZlbiB0aG91Z2ggdGhhdCdzIGFzc2lnbmVkIHRvCisgKiBhIHByb3RvY29sIGNhbGxlZCBDRlRQOyBob3dldmVyLCB0aGUgb25seSByZWZlcmVuY2UgZm9yIENGVFAgaXMgYQorICogTmV0d29yayBNZXNzYWdlIGZyb20gQkJOIGJhY2sgaW4gMTk4Miwgc28sIGZvciBub3csIHdlIHN1cHBvcnQgNjIsCisgKiBhYXMgd2VsbCBhcyAxMzUsIGFzIGEgcHJvdG9jb2wgbnVtYmVyIGZvciBtb2JpbGl0eSBoZWFkZXJzLgorICovCisjZGVmaW5lIElQUFJPVE9fTU9CSUxJVFlfT0xECTYyCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19ORAorI2RlZmluZQlJUFBST1RPX05ECQk3NwkJLyogU3VuIG5ldCBkaXNrIHByb3RvICh0ZW1wLikgKi8KKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX0VJR1JQCisjZGVmaW5lCUlQUFJPVE9fRUlHUlAJCTg4CQkvKiBDaXNjby9HWFMgSUdSUCAqLworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fT1NQRgorI2RlZmluZSBJUFBST1RPX09TUEYJCTg5CisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19QSU0KKyNkZWZpbmUgSVBQUk9UT19QSU0JCTEwMworI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fSVBDT01QCisjZGVmaW5lIElQUFJPVE9fSVBDT01QCQkxMDgKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX1ZSUlAKKyNkZWZpbmUgSVBQUk9UT19WUlJQCQkxMTIKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX1BHTQorI2RlZmluZSBJUFBST1RPX1BHTSAgICAgICAgICAgICAxMTMKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX1NDVFAKKyNkZWZpbmUgSVBQUk9UT19TQ1RQCQkxMzIKKyNlbmRpZgorI2lmbmRlZiBJUFBST1RPX01PQklMSVRZCisjZGVmaW5lIElQUFJPVE9fTU9CSUxJVFkJMTM1CisjZW5kaWYKZGlmZiAtLWdpdCBhL2lwc2VjX2RvaS5oIGIvaXBzZWNfZG9pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkMDVlYQotLS0gL2Rldi9udWxsCisrKyBiL2lwc2VjX2RvaS5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworLyogWUlQUyBAKCMpJElkOiBpcHNlY19kb2kuaCx2IDEuNyAyMDAyLzEyLzExIDA3OjEzOjUzIGd1eSBFeHAgJCAqLworCisvKiByZWZlciB0byBSRkMgMjQwNyAqLworCisjaWYgIWRlZmluZWQoX0lQU0VDX0RPSV9IXykKKyNkZWZpbmUgX0lQU0VDX0RPSV9IXworCisjZGVmaW5lIElQU0VDX0RPSSAxCisKKy8qIDQuMiBJUFNFQyBTaXR1YXRpb24gRGVmaW5pdGlvbiAqLworI2RlZmluZSBJUFNFQ0RPSV9TSVRfSURFTlRJVFlfT05MWSAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBJUFNFQ0RPSV9TSVRfU0VDUkVDWSAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJUFNFQ0RPSV9TSVRfSU5URUdSSVRZICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKiA0LjQuMSBJUFNFQyBTZWN1cml0eSBQcm90b2NvbCBJZGVudGlmaWVycyAqLworICAvKiA0LjQuMiBJUFNFQyBJU0FLTVAgVHJhbnNmb3JtIFZhbHVlcyAqLworI2RlZmluZSBJUFNFQ0RPSV9QUk9UT19JU0FLTVAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICAgSVBTRUNET0lfS0VZX0lLRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiA0LjQuMSBJUFNFQyBTZWN1cml0eSBQcm90b2NvbCBJZGVudGlmaWVycyAqLworI2RlZmluZSBJUFNFQ0RPSV9QUk9UT19JUFNFQ19BSCAgICAgICAgICAgICAgICAgICAgICAyCisgIC8qIDQuNC4zIElQU0VDIEFIIFRyYW5zZm9ybSBWYWx1ZXMgKi8KKyNkZWZpbmUgICBJUFNFQ0RPSV9BSF9NRDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgSVBTRUNET0lfQUhfU0hBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSAgIElQU0VDRE9JX0FIX0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICBJUFNFQ0RPSV9BSF9TSEEyXzI1NiAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lICAgSVBTRUNET0lfQUhfU0hBMl8zODQgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSAgIElQU0VDRE9JX0FIX1NIQTJfNTEyICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworLyogNC40LjEgSVBTRUMgU2VjdXJpdHkgUHJvdG9jb2wgSWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgSVBTRUNET0lfUFJPVE9fSVBTRUNfRVNQICAgICAgICAgICAgICAgICAgICAgMworICAvKiA0LjQuNCBJUFNFQyBFU1AgVHJhbnNmb3JtIElkZW50aWZpZXJzICovCisjZGVmaW5lICAgSVBTRUNET0lfRVNQX0RFU19JVjY0ICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgIElQU0VDRE9JX0VTUF9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfM0RFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lICAgSVBTRUNET0lfRVNQX1JDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSAgIElQU0VDRE9JX0VTUF9JREVBICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfQ0FTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lICAgSVBTRUNET0lfRVNQX0JMT1dGSVNIICAgICAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSAgIElQU0VDRE9JX0VTUF8zSURFQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfREVTX0lWMzIgICAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lICAgSVBTRUNET0lfRVNQX1JDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSAgIElQU0VDRE9JX0VTUF9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfUklKTkRBRUwJCQkJMTIKKyNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfQUVTCQkJCTEyCisKKy8qIDQuNC4xIElQU0VDIFNlY3VyaXR5IFByb3RvY29sIElkZW50aWZpZXJzICovCisjZGVmaW5lIElQU0VDRE9JX1BST1RPX0lQQ09NUCAgICAgICAgICAgICAgICAgICAgICAgIDQKKyAgLyogNC40LjUgSVBTRUMgSVBDT01QIFRyYW5zZm9ybSBJZGVudGlmaWVycyAqLworI2RlZmluZSAgIElQU0VDRE9JX0lQQ09NUF9PVUkgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBJUFNFQ0RPSV9JUENPTVBfREVGTEFURSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lICAgSVBTRUNET0lfSVBDT01QX0xaUyAgICAgICAgICAgICAgICAgICAgICAgICAgMworCisvKiA0LjUgSVBTRUMgU2VjdXJpdHkgQXNzb2NpYXRpb24gQXR0cmlidXRlcyAqLworI2RlZmluZSBJUFNFQ0RPSV9BVFRSX1NBX0xUWVBFICAgICAgICAgICAgICAgIDEgLyogQiAqLworI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfU0FfTFRZUEVfREVGQVVMVCAgICAgICAgMQorI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfU0FfTFRZUEVfU0VDICAgICAgICAgICAgMQorI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfU0FfTFRZUEVfS0IgICAgICAgICAgICAgMgorI2RlZmluZSBJUFNFQ0RPSV9BVFRSX1NBX0xEVVIgICAgICAgICAgICAgICAgIDIgLyogViAqLworI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfU0FfTERVUl9ERUZBVUxUICAgICAgICAgMjg4MDAgLyogOCBob3VycyAqLworI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0dSUF9ERVNDICAgICAgICAgICAgICAgIDMgLyogQiAqLworI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0VOQ19NT0RFICAgICAgICAgICAgICAgIDQgLyogQiAqLworCS8qIGRlZmF1bHQgdmFsdWU6IGhvc3QgZGVwZW5kZW50ICovCisjZGVmaW5lICAgSVBTRUNET0lfQVRUUl9FTkNfTU9ERV9UVU5ORUwgICAgICAgICAxCisjZGVmaW5lICAgSVBTRUNET0lfQVRUUl9FTkNfTU9ERV9UUk5TICAgICAgICAgICAyCisjZGVmaW5lIElQU0VDRE9JX0FUVFJfQVVUSCAgICAgICAgICAgICAgICAgICAgNSAvKiBCICovCisJLyogMCBtZWFucyBub3QgdG8gdXNlIGF1dGhlbnRpY2F0aW9uLiAqLworI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfQVVUSF9ITUFDX01ENSAgICAgICAgICAgMQorI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfQVVUSF9ITUFDX1NIQTEgICAgICAgICAgMgorI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfQVVUSF9ERVNfTUFDICAgICAgICAgICAgMworI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfQVVUSF9LUERLICAgICAgICAgICAgICAgNCAvKlJGQy0xODI2KEtleS9QYWQvRGF0YS9LZXkpKi8KKwkvKgorCSAqIFdoZW4gbmVnb3RpYXRpbmcgRVNQIHdpdGhvdXQgYXV0aGVudGljYXRpb24sIHRoZSBBdXRoCisJICogQWxnb3JpdGhtIGF0dHJpYnV0ZSBNVVNUIE5PVCBiZSBpbmNsdWRlZCBpbiB0aGUgcHJvcG9zYWwuCisJICogV2hlbiBuZWdvdGlhdGluZyBFU1Agd2l0aG91dCBjb25maWRlbnRpYWxpdHksIHRoZSBBdXRoCisJICogQWxnb3JpdGhtIGF0dHJpYnV0ZSBNVVNUIGJlIGluY2x1ZGVkIGluIHRoZSBwcm9wb3NhbCBhbmQKKwkgKiB0aGUgRVNQIHRyYW5zZm9ybSBJRCBtdXN0IGJlIEVTUF9OVUxMLgorCSovCisjZGVmaW5lIElQU0VDRE9JX0FUVFJfS0VZX0xFTkdUSCAgICAgICAgICAgICAgNiAvKiBCICovCisjZGVmaW5lIElQU0VDRE9JX0FUVFJfS0VZX1JPVU5EUyAgICAgICAgICAgICAgNyAvKiBCICovCisjZGVmaW5lIElQU0VDRE9JX0FUVFJfQ09NUF9ESUNUX1NJWkUgICAgICAgICAgOCAvKiBCICovCisjZGVmaW5lIElQU0VDRE9JX0FUVFJfQ09NUF9QUklWQUxHICAgICAgICAgICAgOSAvKiBWICovCisKKy8qIDQuNi4xIFNlY3VyaXR5IEFzc29jaWF0aW9uIFBheWxvYWQgKi8KK3N0cnVjdCBpcHNlY2RvaV9zYSB7CisJc3RydWN0IGlzYWttcF9nZW4gaDsKKwl1X2ludDMyX3QgZG9pOyAvKiBEb21haW4gb2YgSW50ZXJwcmV0YXRpb24gKi8KKwl1X2ludDMyX3Qgc2l0OyAvKiBTaXR1YXRpb24gKi8KK307CisKK3N0cnVjdCBpcHNlY2RvaV9zZWNyZWN5X2ggeworCXVfaW50MTZfdCBsZW47CisJdV9pbnQxNl90IHJlc2VydmVkOworfTsKKworLyogNC42LjIuMSBJZGVudGlmaWNhdGlvbiBUeXBlIFZhbHVlcyAqLworc3RydWN0IGlwc2VjZG9pX2lkIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVfaW50OF90ICB0eXBlOwkJLyogSUQgVHlwZSAqLworCXVfaW50OF90ICBwcm90b19pZDsJLyogUHJvdG9jb2wgSUQgKi8KKwl1X2ludDE2X3QgcG9ydDsJCS8qIFBvcnQgKi8KKwkvKiBJZGVudGlmaWNhdGlvbiBEYXRhICovCit9OworCisjZGVmaW5lIElQU0VDRE9JX0lEX0lQVjRfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSVBTRUNET0lfSURfRlFETiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJUFNFQ0RPSV9JRF9VU0VSX0ZRRE4gICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIElQU0VDRE9JX0lEX0lQVjRfQUREUl9TVUJORVQgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVBTRUNET0lfSURfSVBWNl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJUFNFQ0RPSV9JRF9JUFY2X0FERFJfU1VCTkVUICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIElQU0VDRE9JX0lEX0lQVjRfQUREUl9SQU5HRSAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgSVBTRUNET0lfSURfSVBWNl9BRERSX1JBTkdFICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9ETiAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIElQU0VDRE9JX0lEX0RFUl9BU04xX0dOICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIElQU0VDRE9JX0lEX0tFWV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisKKy8qIDQuNi4zIElQU0VDIERPSSBOb3RpZnkgTWVzc2FnZSBUeXBlcyAqLworLyogTm90aWZ5IE1lc3NhZ2VzIC0gU3RhdHVzIFR5cGVzICovCisjZGVmaW5lIElQU0VDRE9JX05UWVBFX1JFU1BPTkRFUl9MSUZFVElNRSAgICAgICAgICAgICAgICAgIDI0NTc2CisjZGVmaW5lIElQU0VDRE9JX05UWVBFX1JFUExBWV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDI0NTc3CisjZGVmaW5lIElQU0VDRE9JX05UWVBFX0lOSVRJQUxfQ09OVEFDVCAgICAgICAgICAgICAgICAgICAgIDI0NTc4CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfSVBTRUNfRE9JX0hfKSAqLwpkaWZmIC0tZ2l0IGEvaXB4LmggYi9pcHguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGMxY2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvaXB4LmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIElQWCBwcm90b2NvbCBmb3JtYXRzCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pcHguaCx2IDEuOCAyMDAyLzEyLzExIDA3OjEzOjU0IGd1eSBFeHAgJAorICovCisKKy8qIHdlbGwta25vd24gc29ja2V0cyAqLworI2RlZmluZQlJUFhfU0tUX05DUAkJMHgwNDUxCisjZGVmaW5lCUlQWF9TS1RfU0FQCQkweDA0NTIKKyNkZWZpbmUJSVBYX1NLVF9SSVAJCTB4MDQ1MworI2RlZmluZQlJUFhfU0tUX05FVEJJT1MJCTB4MDQ1NQorI2RlZmluZQlJUFhfU0tUX0RJQUdOT1NUSUNTCTB4MDQ1NgorI2RlZmluZQlJUFhfU0tUX05XTElOS19ER00JMHgwNTUzCS8qIE5XTGluayBkYXRhZ3JhbSwgbWF5IGNvbnRhaW4gU01CICovCisjZGVmaW5lCUlQWF9TS1RfRUlHUlAJCTB4ODViZQkvKiBDaXNjbyBFSUdSUCBvdmVyIElQWCAqLworCisvKiBJUFggdHJhbnNwb3J0IGhlYWRlciAqLworc3RydWN0IGlweEhkciB7CisgICAgdV9pbnQxNl90CWNrc3VtOwkJLyogQ2hlY2tzdW0gKi8KKyAgICB1X2ludDE2X3QJbGVuZ3RoOwkJLyogTGVuZ3RoLCBpbiBieXRlcywgaW5jbHVkaW5nIGhlYWRlciAqLworICAgIHVfaW50OF90CXRDdGw7CQkvKiBUcmFuc3BvcnQgQ29udHJvbCAoaS5lLiBob3AgY291bnQpICovCisgICAgdV9pbnQ4X3QJcFR5cGU7CQkvKiBQYWNrZXQgVHlwZSAoaS5lLiBsZXZlbCAyIHByb3RvY29sKSAqLworICAgIHVfaW50MTZfdAlkc3ROZXRbMl07CS8qIGRlc3RpbmF0aW9uIG5ldCAqLworICAgIHVfaW50OF90CWRzdE5vZGVbNl07CS8qIGRlc3RpbmF0aW9uIG5vZGUgKi8KKyAgICB1X2ludDE2X3QJZHN0U2t0OwkJLyogZGVzdGluYXRpb24gc29ja2V0ICovCisgICAgdV9pbnQxNl90CXNyY05ldFsyXTsJLyogc291cmNlIG5ldCAqLworICAgIHVfaW50OF90CXNyY05vZGVbNl07CS8qIHNvdXJjZSBub2RlICovCisgICAgdV9pbnQxNl90CXNyY1NrdDsJCS8qIHNvdXJjZSBzb2NrZXQgKi8KK307CisKKyNkZWZpbmUgaXB4U2l6ZQkzMAorCmRpZmYgLS1naXQgYS9pc2FrbXAuaCBiL2lzYWttcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZmFjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9pc2FrbXAuaApAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKy8qIFlJUFMgQCgjKSRJZDogaXNha21wLmgsdiAxLjEwIDIwMDIvMTIvMTEgMDc6MTM6NTQgZ3V5IEV4cCAkICovCisKKy8qIHJlZmVyIHRvIFJGQyAyNDA4ICovCisKKy8qIG11c3QgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAqLworCisjaWYgIWRlZmluZWQoX0lTQUtNUF9IXykKKyNkZWZpbmUgX0lTQUtNUF9IXworCit0eXBlZGVmIHVfY2hhciBjb29raWVfdFs4XTsKK3R5cGVkZWYgdV9jaGFyIG1zZ2lkX3RbNF07CisKK3R5cGVkZWYgc3RydWN0IHsgLyogaV9jb29raWUgKyByX2Nvb2tpZSAqLworCWNvb2tpZV90IGlfY2s7CisJY29va2llX3Qgcl9jazsKK30gaXNha21wX2luZGV4OworCisjZGVmaW5lIElOSVRJQVRPUiAgICAgICAxCisjZGVmaW5lIFJFU1BPTkRFUiAgICAgICAyCisKKyNkZWZpbmUgUE9SVF9JU0FLTVAgNTAwCisKKyNkZWZpbmUgR0VORVJBVEUgIDEKKyNkZWZpbmUgVkFMSURBVEUgIDAKKworLyogUGhhc2Ugb2Ygb2FrbGV5IGRlZmluaXRpb24gKi8KKy8qCisgIDAwMDAgMDAwMCAwMDAwIDAwMDAKKyAgICAgICB8ICAgIHx8fHwgfHx8fAorICAgICAgIHwgICAgfHx8fCArKysrLS0+IG5lZ29zaWF0aW9uIG51bWJlciBpbiBwaGFzZQorICAgICAgIHwgICAgKysrKy0tLS0tLS0+IHBoYXNlIG51bWJlcgorICAgICAgICstLS0tLS0tLS0tLS0tLS0+IGV4cGlyZSA/CisgKi8KKyNkZWZpbmUgSVNBS01QX1BIMSAgICAgIDB4MDAxMAorI2RlZmluZSBJU0FLTVBfUEgyICAgICAgMHgwMDIwCisjZGVmaW5lIElTQUtNUF9FWFBJUkVEICAweDAxMDAKKworI2RlZmluZSBJU0FLTVBfTkdQXzAgICAgMHgwMDAwCisjZGVmaW5lIElTQUtNUF9OR1BfMSAgICAweDAwMDEKKyNkZWZpbmUgSVNBS01QX05HUF8yICAgIDB4MDAwMgorI2RlZmluZSBJU0FLTVBfTkdQXzMgICAgMHgwMDAzCisjZGVmaW5lIElTQUtNUF9OR1BfNCAgICAweDAwMDQKKworI2RlZmluZSBJU0FLTVBfUEgxX04gICAgKElTQUtNUF9QSDEgfCBJU0FLTVBfTkdQXzApICAvKiBpLmUuIHNwYXduICovCisjZGVmaW5lIElTQUtNUF9QSDFfMSAgICAoSVNBS01QX1BIMSB8IElTQUtNUF9OR1BfMSkKKyNkZWZpbmUgSVNBS01QX1BIMV8yICAgIChJU0FLTVBfUEgxIHwgSVNBS01QX05HUF8yKQorI2RlZmluZSBJU0FLTVBfUEgxXzMgICAgKElTQUtNUF9QSDEgfCBJU0FLTVBfTkdQXzMpCisjZGVmaW5lIElTQUtNUF9QSDJfTiAgICAoSVNBS01QX1BIMiB8IElTQUtNUF9OR1BfMCkKKyNkZWZpbmUgSVNBS01QX1BIMl8xICAgIChJU0FLTVBfUEgyIHwgSVNBS01QX05HUF8xKQorI2RlZmluZSBJU0FLTVBfUEgyXzIgICAgKElTQUtNUF9QSDIgfCBJU0FLTVBfTkdQXzIpCisjZGVmaW5lIElTQUtNUF9QSDJfMyAgICAoSVNBS01QX1BIMiB8IElTQUtNUF9OR1BfMykKKworI2RlZmluZSBJU0FLTVBfVElNRVJfREVGQVVMVCAgICAgMTAgLyogc2Vjb25kcyAqLworI2RlZmluZSBJU0FLTVBfVFJZX0RFRkFVTFQgICAgICAgIDMgLyogdGltZXMgKi8KKworLyogMy4xIElTQUtNUCBIZWFkZXIgRm9ybWF0CisgICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISAgTmV4dCBQYXlsb2FkICEgTWpWZXIgISBNblZlciAhIEV4Y2hhbmdlIFR5cGUgISAgICAgRmxhZ3MgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyovCitzdHJ1Y3QgaXNha21wIHsKKwljb29raWVfdCBpX2NrOwkJLyogSW5pdGlhdG9yIENvb2tpZSAqLworCWNvb2tpZV90IHJfY2s7CQkvKiBSZXNwb25kZXIgQ29va2llICovCisJdV9pbnQ4X3QgbnA7CQkvKiBOZXh0IFBheWxvYWQgVHlwZSAqLworCXVfaW50OF90IHZlcnM7CisjZGVmaW5lIElTQUtNUF9WRVJTX01BSk9SCTB4ZjAKKyNkZWZpbmUgSVNBS01QX1ZFUlNfTUFKT1JfU0hJRlQJNAorI2RlZmluZSBJU0FLTVBfVkVSU19NSU5PUgkweDBmCisjZGVmaW5lIElTQUtNUF9WRVJTX01JTk9SX1NISUZUCTAKKwl1X2ludDhfdCBldHlwZTsJCS8qIEV4Y2hhbmdlIFR5cGUgKi8KKwl1X2ludDhfdCBmbGFnczsJCS8qIEZsYWdzICovCisJbXNnaWRfdCBtc2dpZDsKKwl1X2ludDMyX3QgbGVuOwkJLyogTGVuZ3RoICovCit9OworCisvKiBOZXh0IFBheWxvYWQgVHlwZSAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX05PTkUgICAwIC8qIE5PTkUqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX1NBICAgICAxIC8qIFNlY3VyaXR5IEFzc29jaWF0aW9uICovCisjZGVmaW5lIElTQUtNUF9OUFRZUEVfUCAgICAgIDIgLyogUHJvcG9zYWwgKi8KKyNkZWZpbmUgSVNBS01QX05QVFlQRV9UICAgICAgMyAvKiBUcmFuc2Zvcm0gKi8KKyNkZWZpbmUgSVNBS01QX05QVFlQRV9LRSAgICAgNCAvKiBLZXkgRXhjaGFuZ2UgKi8KKyNkZWZpbmUgSVNBS01QX05QVFlQRV9JRCAgICAgNSAvKiBJZGVudGlmaWNhdGlvbiAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX0NFUlQgICA2IC8qIENlcnRpZmljYXRlICovCisjZGVmaW5lIElTQUtNUF9OUFRZUEVfQ1IgICAgIDcgLyogQ2VydGlmaWNhdGUgUmVxdWVzdCAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX0hBU0ggICA4IC8qIEhhc2ggKi8KKyNkZWZpbmUgSVNBS01QX05QVFlQRV9TSUcgICAgOSAvKiBTaWduYXR1cmUgKi8KKyNkZWZpbmUgSVNBS01QX05QVFlQRV9OT05DRSAxMCAvKiBOb25jZSAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX04gICAgIDExIC8qIE5vdGlmaWNhdGlvbiAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX0QgICAgIDEyIC8qIERlbGV0ZSAqLworI2RlZmluZSBJU0FLTVBfTlBUWVBFX1ZJRCAgIDEzIC8qIFZlbmRvciBJRCAqLworCisjZGVmaW5lIElTQUtNUF9NQUpPUl9WRVJTSU9OICAxCisjZGVmaW5lIElTQUtNUF9NSU5PUl9WRVJTSU9OICAwCisKKy8qIEV4Y2hhbmdlIFR5cGUgKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX05PTkUgICAwIC8qIE5PTkUgKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX0JBU0UgICAxIC8qIEJhc2UgKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX0lERU5UICAyIC8qIElkZW50aXR5IFByb3RlY2l0b24gKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX0FVVEggICAzIC8qIEF1dGhlbnRpY2F0aW9uIE9ubHkgKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX0FHRyAgICA0IC8qIEFnZ3Jlc3NpdmUgKi8KKyNkZWZpbmUgSVNBS01QX0VUWVBFX0lORiAgICA1IC8qIEluZm9ybWF0aW9uYWwgKi8KKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgSVNBS01QX0ZMQUdfRSAweDAxIC8qIEVuY3J5cHRpb24gQml0ICovCisjZGVmaW5lIElTQUtNUF9GTEFHX0MgMHgwMiAvKiBDb21taXQgQml0ICovCisKKy8qIDMuMiBQYXlsb2FkIEdlbmVyaWMgSGVhZGVyCisgICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgISBOZXh0IFBheWxvYWQgICEgICBSRVNFUlZFRCAgICAhICAgICAgICAgUGF5bG9hZCBMZW5ndGggICAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyovCitzdHJ1Y3QgaXNha21wX2dlbiB7CisJdV9pbnQ4X3QgIG5wOyAgICAgICAvKiBOZXh0IFBheWxvYWQgKi8KKwl1X2ludDhfdCAgcmVzZXJ2ZWQ7IC8qIFJFU0VSVkVELCB1bnVzZWQsIG11c3Qgc2V0IHRvIDAgKi8KKwl1X2ludDE2X3QgbGVuOyAgICAgIC8qIFBheWxvYWQgTGVuZ3RoICovCit9OworCisvKiAzLjMgRGF0YSBBdHRyaWJ1dGVzCisgICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgIUEhICAgICAgIEF0dHJpYnV0ZSBUeXBlICAgICAgICAhICAgIEFGPTAgIEF0dHJpYnV0ZSBMZW5ndGggICAgICEKKyAgICAgICAgIUYhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgIEFGPTEgIEF0dHJpYnV0ZSBWYWx1ZSAgICAgICEKKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgLiAgICAgICAgICAgICAgICAgICBBRj0wICBBdHRyaWJ1dGUgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgLiAgICAgICAgICAgICAgICAgICBBRj0xICBOb3QgVHJhbnNtaXR0ZWQgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyovCitzdHJ1Y3QgaXNha21wX2RhdGEgeworCXVfaW50MTZfdCB0eXBlOyAgICAgLyogZGVmaW5lZCBieSBET0ktc3BlYywgYW5kIEF0dHJpYnV0ZSBGb3JtYXQgKi8KKwl1X2ludDE2X3QgbG9ydjsgICAgIC8qIGlmIGYgZXF1YWwgMSwgQXR0cmlidXRlIExlbmd0aCAqLworCSAgICAgICAgICAgICAgICAgIC8qIGlmIGYgZXF1YWwgMCwgQXR0cmlidXRlIFZhbHVlICovCisJLyogaWYgZiBlcXVhbCAxLCBBdHRyaWJ1dGUgVmFsdWUgKi8KK307CisjZGVmaW5lIElTQUtNUF9HRU5fVExWIDB4MDAwMAorI2RlZmluZSBJU0FLTVBfR0VOX1RWICAweDgwMDAKKwkvKiBtYXNrIGZvciB0eXBlIG9mIGF0dHJpYnV0ZSBmb3JtYXQgKi8KKyNkZWZpbmUgSVNBS01QX0dFTl9NQVNLIDB4ODAwMAorCisvKiAzLjQgU2VjdXJpdHkgQXNzb2NpYXRpb24gUGF5bG9hZCAqLworCS8qIE1BWSBOT1QgYmUgdXNlZCwgYmVjYXVzZSBvZiBiZWluZyBkZWZpbmVkIGluIGlwc2VjLWRvaS4gKi8KKwkvKgorCUlmIHRoZSBjdXJyZW50IHBheWxvYWQgaXMgdGhlIGxhc3QgaW4gdGhlIG1lc3NhZ2UsCisJdGhlbiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgcGF5bG9hZCBmaWVsZCB3aWxsIGJlIDAuCisJVGhpcyBmaWVsZCBNVVNUIE5PVCBjb250YWluIHRoZQorCXZhbHVlcyBmb3IgdGhlIFByb3Bvc2FsIG9yIFRyYW5zZm9ybSBwYXlsb2FkcyBhcyB0aGV5IGFyZSBjb25zaWRlcmVkCisJcGFydCBvZiB0aGUgc2VjdXJpdHkgYXNzb2NpYXRpb24gbmVnb3RpYXRpb24uICBGb3IgZXhhbXBsZSwgdGhpcworCWZpZWxkIHdvdWxkIGNvbnRhaW4gdGhlIHZhbHVlICIxMCIgKE5vbmNlIHBheWxvYWQpIGluIHRoZSBmaXJzdAorCW1lc3NhZ2Ugb2YgYSBCYXNlIEV4Y2hhbmdlIChzZWUgU2VjdGlvbiA0LjQpIGFuZCB0aGUgdmFsdWUgIjAiIGluIHRoZQorCWZpcnN0IG1lc3NhZ2Ugb2YgYW4gSWRlbnRpdHkgUHJvdGVjdCBFeGNoYW5nZSAoc2VlIFNlY3Rpb24gNC41KS4KKwkqLworc3RydWN0IGlzYWttcF9wbF9zYSB7CisJc3RydWN0IGlzYWttcF9nZW4gaDsKKwl1X2ludDMyX3QgZG9pOyAvKiBEb21haW4gb2YgSW50ZXJwcmV0YXRpb24gKi8KKwl1X2ludDMyX3Qgc2l0OyAvKiBTaXR1YXRpb24gKi8KK307CisKKy8qIDMuNSBQcm9wb3NhbCBQYXlsb2FkICovCisJLyoKKwlUaGUgdmFsdWUgb2YgdGhlIG5leHQgcGF5bG9hZCBmaWVsZCBNVVNUIG9ubHkgY29udGFpbiB0aGUgdmFsdWUgIjIiCisJb3IgIjAiLiAgSWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgUHJvcG9zYWwgcGF5bG9hZHMgaW4gdGhlIG1lc3NhZ2UsCisJdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMi4gIElmIHRoZSBjdXJyZW50IFByb3Bvc2FsIHBheWxvYWQgaXMgdGhlCisJbGFzdCB3aXRoaW4gdGhlIHNlY3VyaXR5IGFzc29jaWF0aW9uIHByb3Bvc2FsLCB0aGVuIHRoaXMgZmllbGQgd2lsbAorCWJlIDAuCisJKi8KK3N0cnVjdCBpc2FrbXBfcGxfcCB7CisJc3RydWN0IGlzYWttcF9nZW4gaDsKKwl1X2ludDhfdCBwX25vOyAgICAgIC8qIFByb3Bvc2FsICMgKi8KKwl1X2ludDhfdCBwcm90X2lkOyAgIC8qIFByb3RvY29sICovCisJdV9pbnQ4X3Qgc3BpX3NpemU7ICAvKiBTUEkgU2l6ZSAqLworCXVfaW50OF90IG51bV90OyAgICAgLyogTnVtYmVyIG9mIFRyYW5zZm9ybXMgKi8KKwkvKiBTUEkgKi8KK307CisKKy8qIDMuNiBUcmFuc2Zvcm0gUGF5bG9hZCAqLworCS8qCisJVGhlIHZhbHVlIG9mIHRoZSBuZXh0IHBheWxvYWQgZmllbGQgTVVTVCBvbmx5IGNvbnRhaW4gdGhlIHZhbHVlICIzIgorCW9yICIwIi4gIElmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIFRyYW5zZm9ybSBwYXlsb2FkcyBpbiB0aGUgcHJvcG9zYWwsCisJdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMy4gIElmIHRoZSBjdXJyZW50IFRyYW5zZm9ybSBwYXlsb2FkIGlzIHRoZQorCWxhc3Qgd2l0aGluIHRoZSBwcm9wb3NhbCwgdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMC4KKwkqLworc3RydWN0IGlzYWttcF9wbF90IHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVfaW50OF90ICB0X25vOyAgICAgLyogVHJhbnNmb3JtICMgKi8KKwl1X2ludDhfdCAgdF9pZDsgICAgIC8qIFRyYW5zZm9ybS1JZCAqLworCXVfaW50MTZfdCByZXNlcnZlZDsgLyogUkVTRVJWRUQyICovCisJLyogU0EgQXR0cmlidXRlcyAqLworfTsKKworLyogMy43IEtleSBFeGNoYW5nZSBQYXlsb2FkICovCitzdHJ1Y3QgaXNha21wX3BsX2tlIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCS8qIEtleSBFeGNoYW5nZSBEYXRhICovCit9OworCisvKiAzLjggSWRlbnRpZmljYXRpb24gUGF5bG9hZCAqLworCS8qIE1VU1QgTk9UIHRvIGJlIHVzZWQsIGJlY2F1c2Ugb2YgYmVpbmcgZGVmaW5lZCBpbiBpcHNlYy1kb2kuICovCitzdHJ1Y3QgaXNha21wX3BsX2lkIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVuaW9uIHsKKwkJdV9pbnQ4X3QgIGlkX3R5cGU7ICAgLyogSUQgVHlwZSAqLworCQl1X2ludDMyX3QgZG9pX2RhdGE7ICAvKiBET0kgU3BlY2lmaWMgSUQgRGF0YSAqLworCX0gZDsKKwkvKiBJZGVudGlmaWNhdGlvbiBEYXRhICovCit9OworCisvKiAzLjkgQ2VydGlmaWNhdGUgUGF5bG9hZCAqLworc3RydWN0IGlzYWttcF9wbF9jZXJ0IHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVfaW50OF90IGVuY29kZTsgLyogQ2VydCBFbmNvZGluZyAqLworCWNoYXIgICBjZXJ0OyAgIC8qIENlcnRpZmljYXRlIERhdGEgKi8KKwkJLyoKKwkJVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YKKwkJY2VydGlmaWNhdGUgb3IgY2VydGlmaWNhdGUtcmVsYXRlZCBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlCisJCUNlcnRpZmljYXRlIERhdGEgZmllbGQuCisJCSovCit9OworCisvKiBDZXJ0aWZpY2F0ZSBUeXBlICovCisjZGVmaW5lIElTQUtNUF9DRVJUX05PTkUgICAwCisjZGVmaW5lIElTQUtNUF9DRVJUX1BLQ1MgICAxCisjZGVmaW5lIElTQUtNUF9DRVJUX1BHUCAgICAyCisjZGVmaW5lIElTQUtNUF9DRVJUX0ROUyAgICAzCisjZGVmaW5lIElTQUtNUF9DRVJUX1NJR04gICA0CisjZGVmaW5lIElTQUtNUF9DRVJUX0tFICAgICA1CisjZGVmaW5lIElTQUtNUF9DRVJUX0tUICAgICA2CisjZGVmaW5lIElTQUtNUF9DRVJUX0NSTCAgICA3CisjZGVmaW5lIElTQUtNUF9DRVJUX0FSTCAgICA4CisjZGVmaW5lIElTQUtNUF9DRVJUX1NQS0kgICA5CisKKy8qIDMuMTAgQ2VydGlmaWNhdGUgUmVxdWVzdCBQYXlsb2FkICovCitzdHJ1Y3QgaXNha21wX3BsX2NyIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVfaW50OF90IG51bV9jZXJ0OyAvKiAjIENlcnQuIFR5cGVzICovCisJLyoKKwlDZXJ0aWZpY2F0ZSBUeXBlcyAodmFyaWFibGUgbGVuZ3RoKQorCSAgLS0gQ29udGFpbnMgYSBsaXN0IG9mIHRoZSB0eXBlcyBvZiBjZXJ0aWZpY2F0ZXMgcmVxdWVzdGVkLAorCSAgc29ydGVkIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICBFYWNoIGluZGl2aWR1YWwgY2VydGlmaWNhdGUKKwkgIHR5cGUgaXMgMSBvY3RldC4gIFRoaXMgZmllbGQgaXMgTk9UIHJlcXVpcmVkbworCSovCisJLyogIyBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyAoMSBvY3RldCkgKi8KKwkvKiBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyAodmFyaWFibGUgbGVuZ3RoKSAqLworfTsKKworLyogMy4xMSBIYXNoIFBheWxvYWQgKi8KKwkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KK3N0cnVjdCBpc2FrbXBfcGxfaGFzaCB7CisJc3RydWN0IGlzYWttcF9nZW4gaDsKKwkvKiBIYXNoIERhdGEgKi8KK307CisKKy8qIDMuMTIgU2lnbmF0dXJlIFBheWxvYWQgKi8KKwkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KK3N0cnVjdCBpc2FrbXBfcGxfc2lnIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCS8qIFNpZ25hdHVyZSBEYXRhICovCit9OworCisvKiAzLjEzIE5vbmNlIFBheWxvYWQgKi8KKwkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KK3N0cnVjdCBpc2FrbXBfcGxfbm9uY2UgeworCXN0cnVjdCBpc2FrbXBfZ2VuIGg7CisJLyogTm9uY2UgRGF0YSAqLworfTsKKworLyogMy4xNCBOb3RpZmljYXRpb24gUGF5bG9hZCAqLworc3RydWN0IGlzYWttcF9wbF9uIHsKKwlzdHJ1Y3QgaXNha21wX2dlbiBoOworCXVfaW50MzJfdCBkb2k7ICAgICAgLyogRG9tYWluIG9mIEludGVycHJldGF0aW9uICovCisJdV9pbnQ4X3QgIHByb3RfaWQ7ICAvKiBQcm90b2NvbC1JRCAqLworCXVfaW50OF90ICBzcGlfc2l6ZTsgLyogU1BJIFNpemUgKi8KKwl1X2ludDE2X3QgdHlwZTsgICAgIC8qIE5vdGlmeSBNZXNzYWdlIFR5cGUgKi8KKwkvKiBTUEkgKi8KKwkvKiBOb3RpZmljYXRpb24gRGF0YSAqLworfTsKKworLyogMy4xNC4xIE5vdGlmeSBNZXNzYWdlIFR5cGVzICovCisvKiBOT1RJRlkgTUVTU0FHRVMgLSBFUlJPUiBUWVBFUyAqLworI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9QQVlMT0FEX1RZUEUgICAgICAgICAgIDEKKyNkZWZpbmUgSVNBS01QX05UWVBFX0RPSV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAyCisjZGVmaW5lIElTQUtNUF9OVFlQRV9TSVRVQVRJT05fTk9UX1NVUFBPUlRFRCAgICAgICAgMworI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DT09LSUUgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfTUFKT1JfVkVSU0lPTiAgICAgICAgICA1CisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX01JTk9SX1ZFUlNJT04gICAgICAgICAgNgorI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9FWENIQU5HRV9UWVBFICAgICAgICAgIDcKKyNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfRkxBR1MgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX01FU1NBR0VfSUQgICAgICAgICAgICAgOQorI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9QUk9UT0NPTF9JRCAgICAgICAgICAgIDEwCisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX1NQSSAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfVFJBTlNGT1JNX0lEICAgICAgICAgICAxMgorI2RlZmluZSBJU0FLTVBfTlRZUEVfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEICAgICAgIDEzCisjZGVmaW5lIElTQUtNUF9OVFlQRV9OT19QUk9QT1NBTF9DSE9TRU4gICAgICAgICAgICAgMTQKKyNkZWZpbmUgSVNBS01QX05UWVBFX0JBRF9QUk9QT1NBTF9TWU5UQVggICAgICAgICAgICAxNQorI2RlZmluZSBJU0FLTVBfTlRZUEVfUEFZTE9BRF9NQUxGT1JNRUQgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0tFWV9JTkZPUk1BVElPTiAgICAgICAgMTcKKyNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfSURfSU5GT1JNQVRJT04gICAgICAgICAxOAorI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DRVJUX0VOQ09ESU5HICAgICAgICAgIDE5CisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0NFUlRJRklDQVRFICAgICAgICAgICAgMjAKKyNkZWZpbmUgSVNBS01QX05UWVBFX0JBRF9DRVJUX1JFUVVFU1RfU1lOVEFYICAgICAgICAyMQorI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DRVJUX0FVVEhPUklUWSAgICAgICAgIDIyCisjZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0hBU0hfSU5GT1JNQVRJT04gICAgICAgMjMKKyNkZWZpbmUgSVNBS01QX05UWVBFX0FVVEhFTlRJQ0FUSU9OX0ZBSUxFRCAgICAgICAgICAyNAorI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9TSUdOQVRVUkUgICAgICAgICAgICAgIDI1CisjZGVmaW5lIElTQUtNUF9OVFlQRV9BRERSRVNTX05PVElGSUNBVElPTiAgICAgICAgICAgMjYKKy8qIE5PVElGWSBNRVNTQUdFUyAtIFNUQVRVUyBUWVBFUyAqLworI2RlZmluZSBJU0FLTVBfTlRZUEVfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgIDE2Mzg0CisvKiB1c2luZyBvbmx5IHRvIGxvZyAqLworI2RlZmluZSBJU0FLTVBfTE9HX1JFVFJZX0xJTUlUX1JFQUNIRUQgICAgICAgICAgIDY1NTMwCisKKy8qIDMuMTUgRGVsZXRlIFBheWxvYWQgKi8KK3N0cnVjdCBpc2FrbXBfcGxfZCB7CisJc3RydWN0IGlzYWttcF9nZW4gaDsKKwl1X2ludDMyX3QgZG9pOyAgICAgIC8qIERvbWFpbiBvZiBJbnRlcnByZXRhdGlvbiAqLworCXVfaW50OF90ICBwcm90X2lkOyAgLyogUHJvdG9jb2wtSWQgKi8KKwl1X2ludDhfdCAgc3BpX3NpemU7IC8qIFNQSSBTaXplICovCisJdV9pbnQxNl90IG51bV9zcGk7ICAvKiAjIG9mIFNQSXMgKi8KKwkvKiBTUEkoZXMpICovCit9OworCisMCitzdHJ1Y3QgaXNha21wX3BoMXRhYiB7CisJc3RydWN0IGlzYWttcF9waDEgKmhlYWQ7CisJc3RydWN0IGlzYWttcF9waDEgKnRhaWw7CisJaW50IGxlbjsKK307CisKK3N0cnVjdCBpc2FrbXBfcGgydGFiIHsKKwlzdHJ1Y3QgaXNha21wX3BoMiAqaGVhZDsKKwlzdHJ1Y3QgaXNha21wX3BoMiAqdGFpbDsKKwlpbnQgbGVuOworfTsKKworI2RlZmluZSBFWENIQU5HRV9QUk9YWSAgIDEKKyNkZWZpbmUgRVhDSEFOR0VfTVlTRUxGICAwCisKKyNkZWZpbmUgUEZTX05FRUQJMQorI2RlZmluZSBQRlNfTk9ORUVECTAKKworI2VuZGlmIC8qICFkZWZpbmVkKF9JU0FLTVBfSF8pICovCmRpZmYgLS1naXQgYS9sMnRwLmggYi9sMnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ODg4MwotLS0gL2Rldi9udWxsCisrKyBiL2wydHAuaApAQCAtMCwwICsxLDYyIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2wydHAuaCx2IDEuNSAyMDAxLzExLzA1IDEwOjAzOjI3IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogTDJUUCBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1vdG9ub3JpIFNoaW5kbyAobXNoaW5kb0Btc2hpbmRvLm5ldCkKKyAqLworCisKKyNkZWZpbmUgTDJUUF9GTEFHX1RZUEUJCTB4ODAwMAkvKiBUeXBlICgwPURhdGEsIDE9Q29udHJvbCkgKi8KKyNkZWZpbmUgTDJUUF9GTEFHX0xFTkdUSAkweDQwMDAJLyogTGVuZ3RoICovCisjZGVmaW5lIEwyVFBfRkxBR19TRVFVRU5DRQkweDA4MDAJLyogU2VxdWVuY2UgKi8KKyNkZWZpbmUgTDJUUF9GTEFHX09GRlNFVAkweDAyMDAJLyogT2Zmc2V0ICovCisjZGVmaW5lIEwyVFBfRkxBR19QUklPUklUWQkweDAxMDAJLyogUHJpb3JpdHkgKi8KKworI2RlZmluZSBMMlRQX1ZFUlNJT05fTUFTSwkweDAwMGYJLyogVmVyc2lvbiBNYXNrICovCisjZGVmaW5lIEwyVFBfVkVSU0lPTl9MMkYJMHgwMDAxCS8qIEwyRiAqLworI2RlZmluZSBMMlRQX1ZFUlNJT05fTDJUUAkweDAwMDIJLyogTDJUUCAqLworCisjZGVmaW5lIEwyVFBfQVZQX0hEUl9GTEFHX01BTkRBVE9SWQkweDgwMDAJLyogTWFuZGF0b3J5IEZsYWcgKi8KKyNkZWZpbmUgTDJUUF9BVlBfSERSX0ZMQUdfSElEREVOCTB4NDAwMAkvKiBIaWRkZW4gRmxhZyAqLworI2RlZmluZSBMMlRQX0FWUF9IRFJfTEVOX01BU0sJCTB4MDNmZgkvKiBMZW5ndGggTWFzayAqLworCisjZGVmaW5lIEwyVFBfRlJBTUlOR19DQVBfU1lOQ19NQVNLCTB4MDAwMDAwMDEJLyogU3luY2hyb25vdXMgKi8KKyNkZWZpbmUgTDJUUF9GUkFNSU5HX0NBUF9BU1lOQ19NQVNLCTB4MDAwMDAwMDIJLyogQXN5bmNocm9ub3VzICovCisKKyNkZWZpbmUgTDJUUF9GUkFNSU5HX1RZUEVfU1lOQ19NQVNLCTB4MDAwMDAwMDEJLyogU3luY2hyb25vdXMgKi8KKyNkZWZpbmUgTDJUUF9GUkFNSU5HX1RZUEVfQVNZTkNfTUFTSwkweDAwMDAwMDAyCS8qIEFzeW5jaHJvbm91cyAqLworCisjZGVmaW5lIEwyVFBfQkVBUkVSX0NBUF9ESUdJVEFMX01BU0sJMHgwMDAwMDAwMQkvKiBEaWdpdGFsICovCisjZGVmaW5lIEwyVFBfQkVBUkVSX0NBUF9BTkFMT0dfTUFTSwkweDAwMDAwMDAyCS8qIEFuYWxvZyAqLworCisjZGVmaW5lIEwyVFBfQkVBUkVSX1RZUEVfRElHSVRBTF9NQVNLCTB4MDAwMDAwMDEJLyogRGlnaXRhbCAqLworI2RlZmluZSBMMlRQX0JFQVJFUl9UWVBFX0FOQUxPR19NQVNLCTB4MDAwMDAwMDIJLyogQW5hbG9nICovCisKKy8qIEF1dGhlbiBUeXBlICovCisjZGVmaW5lIEwyVFBfQVVUSEVOX1RZUEVfUkVTRVJWRUQJMHgwMDAwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIEwyVFBfQVVUSEVOX1RZUEVfVEVYVFVBTAkweDAwMDEJLyogVGV4dHVhbCB1c2VybmFtZS9wYXNzd29yZCBleGNoYW5nZSAqLworI2RlZmluZSBMMlRQX0FVVEhFTl9UWVBFX0NIQVAJCTB4MDAwMgkvKiBQUFAgQ0hBUCAqLworI2RlZmluZSBMMlRQX0FVVEhFTl9UWVBFX1BBUAkJMHgwMDAzCS8qIFBQUCBQQVAgKi8KKyNkZWZpbmUgTDJUUF9BVVRIRU5fVFlQRV9OT19BVVRICTB4MDAwNAkvKiBObyBBdXRoZW50aWNhdGlvbiAqLworI2RlZmluZSBMMlRQX0FVVEhFTl9UWVBFX01TQ0hBUHYxCTB4MDAwNQkvKiBNU0NIQVB2MSAqLworCisjZGVmaW5lIEwyVFBfUFJPWFlfQVVUSF9JRF9NQVNLCQkweDAwZmYKKworCmRpZmYgLS1naXQgYS9sMnZwbi5jIGIvbDJ2cG4uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOThlNjlhCi0tLSAvZGV2L251bGwKKysrIGIvbDJ2cG4uYwpAQCAtMCwwICsxLDU4IEBACisvKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQorICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCisgKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAorICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAorICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbDJ2cG4uYyx2IDEuMSAyMDA0LzA2LzE1IDA5OjQyOjQwIGhhbm5lcyBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsMnZwbi5oIgorCisvKiBkcmFmdC1pZXRmLXB3ZTMtaWFuYS1hbGxvY2F0aW9uLTA0ICovCitzdHJ1Y3QgdG9rIGwydnBuX2VuY2Fwc192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDAsICJSZXNlcnZlZCJ9LAorICAgIHsgMHgwMSwgIkZyYW1lIFJlbGF5In0sCisgICAgeyAweDAyLCAiQVRNIEFBTDUgVkNDIHRyYW5zcG9ydCJ9LAorICAgIHsgMHgwMywgIkFUTSB0cmFuc3BhcmVudCBjZWxsIHRyYW5zcG9ydCJ9LCAKKyAgICB7IDB4MDQsICJFdGhlcm5ldCBWTEFOIn0sIAorICAgIHsgMHgwNSwgIkV0aGVybmV0In0sIAorICAgIHsgMHgwNiwgIkNpc2NvLUhETEMifSwgCisgICAgeyAweDA3LCAiUFBQIn0sIAorICAgIHsgMHgwOCwgIlNPTkVUL1NESCBDaXJjdWl0IEVtdWxhdGlvbiBTZXJ2aWNlIG92ZXIgTVBMUyJ9LCAKKyAgICB7IDB4MDksICJBVE0gbi10by1vbmUgVkNDIGNlbGwgdHJhbnNwb3J0In0sIAorICAgIHsgMHgwYSwgIkFUTSBuLXRvLW9uZSBWUEMgY2VsbCB0cmFuc3BvcnQifSwgCisgICAgeyAweDBiLCAiSVAgTGF5ZXIyIFRyYW5zcG9ydCJ9LCAKKyAgICB7IDB4MGMsICJBVE0gb25lLXRvLW9uZSBWQ0MgQ2VsbCBNb2RlIn0sIAorICAgIHsgMHgwZCwgIkFUTSBvbmUtdG8tb25lIFZQQyBDZWxsIE1vZGUifSwKKyAgICB7IDB4MGUsICJBVE0gQUFMNSBQRFUgVkNDIHRyYW5zcG9ydCJ9LAorICAgIHsgMHgwZiwgIkZyYW1lLVJlbGF5IFBvcnQgbW9kZSJ9LAorICAgIHsgMHgxMCwgIlNPTkVUL1NESCBDaXJjdWl0IEVtdWxhdGlvbiBvdmVyIFBhY2tldCJ9LAorICAgIHsgMHgxMSwgIlN0cnVjdHVyZS1hZ25vc3RpYyBFMSBvdmVyIFBhY2tldCJ9LAorICAgIHsgMHgxMiwgIlN0cnVjdHVyZS1hZ25vc3RpYyBUMSAoRFMxKSBvdmVyIFBhY2tldCJ9LAorICAgIHsgMHgxMywgIlN0cnVjdHVyZS1hZ25vc3RpYyBFMyBvdmVyIFBhY2tldCJ9LAorICAgIHsgMHgxNCwgIlN0cnVjdHVyZS1hZ25vc3RpYyBUMyAoRFMzKSBvdmVyIFBhY2tldCJ9LAorICAgIHsgMHgxNSwgIkNFU29QU04gYmFzaWMgbW9kZSJ9LAorICAgIHsgMHgxNiwgIlRETW9JUCBiYXNpYyBtb2RlIn0sCisgICAgeyAweDE3LCAiQ0VTb1BTTiBURE0gd2l0aCBDQVMifSwKKyAgICB7IDB4MTgsICJURE1vSVAgVERNIHdpdGggQ0FTIn0sCisgICAgeyAweDQwLCAiSVAtaW50ZXJ3b3JraW5nIn0sIAorICAgIHsgMCwgTlVMTH0KK307CmRpZmYgLS1naXQgYS9sMnZwbi5oIGIvbDJ2cG4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGViMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbDJ2cG4uaApAQCAtMCwwICsxLDE3IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2wydnBuLmgsdiAxLjEgMjAwNC8wNi8xNSAwOTo0Mjo0MSBoYW5uZXMgRXhwICQgKExCTCkgKi8KKy8qIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCitleHRlcm4gc3RydWN0IHRvayBsMnZwbl9lbmNhcHNfdmFsdWVzW107CmRpZmYgLS1naXQgYS9sYW5lLmggYi9sYW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2xhbmUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTWFya28gS2lpc2tpbGEgY2FybmlsQGNzLnR1dC5maQorICoKKyAqIFRhbXBlcmUgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5IC0gVGVsZWNvbW11bmljYXRpb25zIExhYm9yYXRvcnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcworICogcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLAorICogZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcworICogYWNrbm93bGVkZ2VkIGluIGFueSBwdWJsaWNhdGlvbnMgcmVzdWx0aW5nIGZyb20gdXNpbmcKKyAqIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBUVVQgQUxMT1dTIEZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTICJBUyBJUyIKKyAqIENPTkRJVElPTiBBTkQgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKgorICovCisKKy8qICRJZDogbGFuZS5oLHYgMS43IDIwMDIvMTIvMTEgMDc6MTM6NTQgZ3V5IEV4cCAkICovCisKKyNpZm5kZWYgRVRIRVJfQUREUl9MRU4KKyNkZWZpbmUgRVRIRVJfQUREUl9MRU4gNgorI2VuZGlmCisKK3N0cnVjdCBsZWNkYXRhaGRyXzgwMjMgeworICB1X2ludDE2X3QgbGVfaGVhZGVyOworICB1X2ludDhfdCBoX2Rlc3RbRVRIRVJfQUREUl9MRU5dOworICB1X2ludDhfdCBoX3NvdXJjZVtFVEhFUl9BRERSX0xFTl07CisgIHVfaW50MTZfdCBoX3R5cGU7Cit9OworCitzdHJ1Y3QgbGFuZV9jb250cm9saGRyIHsKKyAgdV9pbnQxNl90IGxlY19oZWFkZXI7CisgIHVfaW50OF90IGxlY19wcm90bzsKKyAgdV9pbnQ4X3QgbGVjX3ZlcnM7CisgIHVfaW50MTZfdCBsZWNfb3Bjb2RlOworfTsKZGlmZiAtLWdpdCBhL2xibC9vcy1vc2Y0LmggYi9sYmwvb3Mtb3NmNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyODY2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9sYmwvb3Mtb3NmNC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2xibC9vcy1vc2Y0LmgsdiAxLjEgMjAwMi8xMi8xMSAwNTowMzoxMyBndXkgRXhwICQgKExCTCkKKyAqLworCisvKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gRGlnaXRhbCBVTklYIDQueCAqLworaW50CXNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJdnNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwpkaWZmIC0tZ2l0IGEvbGJsL29zLXNvbGFyaXMyLmggYi9sYmwvb3Mtc29sYXJpczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQ4MWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGJsL29zLXNvbGFyaXMyLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGJsL29zLXNvbGFyaXMyLmgsdiAxLjE5IDIwMDAvMTAvMTEgMDQ6MDI6MTUgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDUgKi8KKyNpZiBkZWZpbmVkKF9TVERJT19IKSAmJiBkZWZpbmVkKEhBVkVfU0VUTElORUJVRikKK2ludAlzZXRsaW5lYnVmKEZJTEUgKik7CisjZW5kaWYKK2NoYXIgICAgKnN0cmVycm9yKGludCk7CitpbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAlzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2xibC9vcy1zdW5vczQuaCBiL2xibC9vcy1zdW5vczQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTBmMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGJsL29zLXN1bm9zNC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkwLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9sYmwvb3Mtc3Vub3M0LmgsdiAxLjMyLjEuMSAxOTk5LzEwLzA3IDIzOjQ3OjEzIG1jciBFeHAgJCAoTEJMKQorICovCisKKy8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBTdW5PUyA0ICovCisjaWZkZWYgRklMRQoraW50CV9maWxidWYoRklMRSAqKTsKK2ludAlfZmxzYnVmKHVfY2hhciwgRklMRSAqKTsKK2ludAlmY2xvc2UoRklMRSAqKTsKK2ludAlmZmx1c2goRklMRSAqKTsKK2ludAlmZ2V0YyhGSUxFICopOworaW50CWZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJZnB1dGMoaW50LCBGSUxFICopOworaW50CWZwdXRzKGNvbnN0IGNoYXIgKiwgRklMRSAqKTsKK3VfaW50CWZyZWFkKHZvaWQgKiwgdV9pbnQsIHVfaW50LCBGSUxFICopOworaW50CWZzZWVrKEZJTEUgKiwgbG9uZywgaW50KTsKK3VfaW50CWZ3cml0ZShjb25zdCB2b2lkICosIHVfaW50LCB1X2ludCwgRklMRSAqKTsKK2ludAlwY2xvc2UoRklMRSAqKTsKK3ZvaWQJcmV3aW5kKEZJTEUgKik7Cit2b2lkCXNldGJ1ZihGSUxFICosIGNoYXIgKik7CitpbnQJc2V0bGluZWJ1ZihGSUxFICopOworaW50CXVuZ2V0YyhpbnQsIEZJTEUgKik7CitpbnQJdmZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJdnByaW50Zihjb25zdCBjaGFyICosIC4uLik7CisjZW5kaWYKKworI2lmIF9fR05VQ19fIDw9IDEKK2ludAlyZWFkKGludCwgY2hhciAqLCB1X2ludCk7CitpbnQJd3JpdGUoaW50LCBjaGFyICosIHVfaW50KTsKKyNlbmRpZgorCitsb25nCWE2NGwoY29uc3QgY2hhciAqKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXNvY2thZGRyOworI2VuZGlmCitpbnQJYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKK2ludAliaW5kKGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitpbnQJYmNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgdV9pbnQpOwordm9pZAliY29weShjb25zdCB2b2lkICosIHZvaWQgKiwgdV9pbnQpOwordm9pZAliemVybyh2b2lkICosIGludCk7CitpbnQJY2hyb290KGNvbnN0IGNoYXIgKik7CitpbnQJY2xvc2UoaW50KTsKK3ZvaWQJY2xvc2Vsb2codm9pZCk7CitpbnQJY29ubmVjdChpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQpOworY2hhcgkqY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworaW50CWRhZW1vbihpbnQsIGludCk7CitpbnQJZmNobW9kKGludCwgaW50KTsKK2ludAlmY2hvd24oaW50LCBpbnQsIGludCk7Cit2b2lkCWVuZGdyZW50KHZvaWQpOwordm9pZAllbmRwd2VudCh2b2lkKTsKK3ZvaWQJZW5kc2VydmVudCh2b2lkKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CWV0aGVyX2FkZHI7CisjZW5kaWYKK3N0cnVjdAlldGhlcl9hZGRyICpldGhlcl9hdG9uKGNvbnN0IGNoYXIgKik7CitpbnQJZmxvY2soaW50LCBpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJc3RhdDsKKyNlbmRpZgoraW50CWZzdGF0KGludCwgc3RydWN0IHN0YXQgKik7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdCBzdGF0ZnM7CisjZW5kaWYKK2ludAlmc3RhdGZzKGludCwgc3RydWN0IHN0YXRmcyAqKTsKK2ludAlmc3luYyhpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QgdGltZWI7CisjZW5kaWYKK2ludAlmdGltZShzdHJ1Y3QgdGltZWIgKik7CitpbnQJZnRydW5jYXRlKGludCwgb2ZmX3QpOworaW50CWdldGR0YWJsZXNpemUodm9pZCk7Citsb25nCWdldGhvc3RpZCh2b2lkKTsKK2ludAlnZXRob3N0bmFtZShjaGFyICosIGludCk7CitpbnQJZ2V0b3B0KGludCwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKik7CitpbnQJZ2V0cGFnZXNpemUodm9pZCk7CitjaGFyCSpnZXRwYXNzKGNoYXIgKik7CitpbnQJZ2V0cGVlcm5hbWUoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50ICopOworaW50CWdldHByaW9yaXR5KGludCwgaW50KTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXJsaW1pdDsKKyNlbmRpZgoraW50CWdldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7CitpbnQJZ2V0c29ja25hbWUoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50ICopOworaW50CWdldHNvY2tvcHQoaW50LCBpbnQsIGludCwgY2hhciAqLCBpbnQgKik7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdAl0aW1ldmFsOworc3RydWN0CXRpbWV6b25lOworI2VuZGlmCitpbnQJZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqKTsKK2NoYXIJKmdldHVzZXJzaGVsbCh2b2lkKTsKK2NoYXIJKmdldHdkKGNoYXIgKik7CitpbnQJaW5pdGdyb3Vwcyhjb25zdCBjaGFyICosIGludCk7CitpbnQJaW9jdGwoaW50LCBpbnQsIGNhZGRyX3QpOworaW50CWlydXNlcm9rKHVfbG9uZywgaW50LCBjaGFyICosIGNoYXIgKik7CitpbnQJaXNhdHR5KGludCk7CitpbnQJa2lsbHBnKGludCwgaW50KTsKK2ludAlsaXN0ZW4oaW50LCBpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJdXRtcDsKKyNlbmRpZgordm9pZAlsb2dpbihzdHJ1Y3QgdXRtcCAqKTsKK2ludAlsb2dvdXQoY29uc3QgY2hhciAqKTsKK29mZl90CWxzZWVrKGludCwgb2ZmX3QsIGludCk7CitpbnQJbHN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKK2ludAlta3N0ZW1wKGNoYXIgKik7CitjaGFyCSpta3RlbXAoY2hhciAqKTsKK2ludAltdW5tYXAoY2FkZHJfdCwgaW50KTsKK3ZvaWQJb3BlbmxvZyhjb25zdCBjaGFyICosIGludCwgaW50KTsKK3ZvaWQJcGVycm9yKGNvbnN0IGNoYXIgKik7CitpbnQJcHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAlwdXRzKGNvbnN0IGNoYXIgKik7Citsb25nCXJhbmRvbSh2b2lkKTsKK2ludAlyZWFkbGluayhjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CWlvdmVjOworI2VuZGlmCitpbnQJcmVhZHYoaW50LCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKK2ludAlyZWN2KGludCwgY2hhciAqLCB1X2ludCwgaW50KTsKK2ludAlyZWN2ZnJvbShpbnQsIGNoYXIgKiwgdV9pbnQsIGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKK2ludAlyZW5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworaW50CXJjbWQoY2hhciAqKiwgdV9zaG9ydCwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50ICopOworaW50CXJyZXN2cG9ydChpbnQgKik7CitpbnQJc2VuZChpbnQsIGNoYXIgKiwgdV9pbnQsIGludCk7CitpbnQJc2VuZHRvKGludCwgY2hhciAqLCB1X2ludCwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKK2ludAlzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitpbnQJc2V0ZXVpZChpbnQpOworaW50CXNldHByaW9yaXR5KGludCwgaW50LCBpbnQpOworaW50CXNlbGVjdChpbnQsIGZkX3NldCAqLCBmZF9zZXQgKiwgZmRfc2V0ICosIHN0cnVjdCB0aW1ldmFsICopOworaW50CXNldHBncnAoaW50LCBpbnQpOwordm9pZAlzZXRwd2VudCh2b2lkKTsKK2ludAlzZXRybGltaXQoaW50LCBzdHJ1Y3QgcmxpbWl0ICopOwordm9pZAlzZXRzZXJ2ZW50KGludCk7CitpbnQJc2V0c29ja29wdChpbnQsIGludCwgaW50LCBjaGFyICosIGludCk7CitpbnQJc2h1dGRvd24oaW50LCBpbnQpOworaW50CXNpZ2Jsb2NrKGludCk7Cit2b2lkCSgqc2lnbmFsIChpbnQsIHZvaWQgKCopIChpbnQpKSkgKGludCk7CitpbnQJc2lncGF1c2UoaW50KTsKK2ludAlzaWdzZXRtYXNrKGludCk7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdAlzaWd2ZWM7CisjZW5kaWYKK2ludAlzaWd2ZWMoaW50LCBzdHJ1Y3Qgc2lndmVjICosIHN0cnVjdCBzaWd2ZWMqKTsKK2ludAlzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXNvY2tldChpbnQsIGludCwgaW50KTsKK2ludAlzb2NrZXRwYWlyKGludCwgaW50LCBpbnQsIGludCAqKTsKK2ludAlzeW1saW5rKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3ZvaWQJc3JhbmRvbShpbnQpOworaW50CXNzY2FuZihjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAlzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7CitpbnQJc3RhdGZzKGNoYXIgKiwgc3RydWN0IHN0YXRmcyAqKTsKK2NoYXIJKnN0cmVycm9yKGludCk7CitpbnQJc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdAl0bTsKKyNlbmRpZgoraW50CXN0cmZ0aW1lKGNoYXIgKiwgaW50LCBjaGFyICosIHN0cnVjdCB0bSAqKTsKK2ludAlzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2xvbmcJc3RydG9sKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK3ZvaWQJc3luYyh2b2lkKTsKK3ZvaWQJc3lzbG9nKGludCwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXN5c3RlbShjb25zdCBjaGFyICopOworbG9uZwl0ZWxsKGludCk7Cit0aW1lX3QJdGltZSh0aW1lX3QgKik7CitjaGFyCSp0aW1lem9uZShpbnQsIGludCk7CitpbnQJdG9sb3dlcihpbnQpOworaW50CXRvdXBwZXIoaW50KTsKK2ludAl0cnVuY2F0ZShjaGFyICosIG9mZl90KTsKK3ZvaWQJdW5zZXRlbnYoY29uc3QgY2hhciAqKTsKK2ludAl2Zm9yayh2b2lkKTsKK2ludAl2c3ByaW50ZihjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAl3cml0ZXYoaW50LCBzdHJ1Y3QgaW92ZWMgKiwgaW50KTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXJ1c2FnZTsKKyNlbmRpZgoraW50CXV0aW1lcyhjb25zdCBjaGFyICosIHN0cnVjdCB0aW1ldmFsICopOworI2lmIF9fR05VQ19fIDw9IDEKK2ludAl3YWl0KGludCAqKTsKK3BpZF90CXdhaXQzKGludCAqLCBpbnQsIHN0cnVjdCBydXNhZ2UgKik7CisjZW5kaWYKKworLyogVWdseSBzaWduYWwgaGFja2luZyAqLworI2lmZGVmIFNJR19FUlIKKyN1bmRlZiBTSUdfRVJSCisjZGVmaW5lIFNJR19FUlIJCSh2b2lkICgqKShpbnQpKS0xCisjdW5kZWYgU0lHX0RGTAorI2RlZmluZSBTSUdfREZMCQkodm9pZCAoKikoaW50KSkwCisjdW5kZWYgU0lHX0lHTgorI2RlZmluZSBTSUdfSUdOCQkodm9pZCAoKikoaW50KSkxCisKKyNpZmRlZiBLRVJORUwKKyN1bmRlZiBTSUdfQ0FUQ0gKKyNkZWZpbmUgU0lHX0NBVENICSh2b2lkICgqKShpbnQpKTIKKyNlbmRpZgorI3VuZGVmIFNJR19IT0xECisjZGVmaW5lIFNJR19IT0xECSh2b2lkICgqKShpbnQpKTMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGJsL29zLXVsdHJpeDQuaCBiL2xibC9vcy11bHRyaXg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2YjNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xibC9vcy11bHRyaXg0LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGJsL29zLXVsdHJpeDQuaCx2IDEuMTkuMS4xIDE5OTkvMTAvMDcgMjM6NDc6MTMgbWNyIEV4cCAkIChMQkwpCisgKi8KKworLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFVsdHJpeCA0ICovCitpbnQJYmNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdV9pbnQpOwordm9pZAliY29weShjb25zdCB2b2lkICosIHZvaWQgKiwgdV9pbnQpOwordm9pZAliemVybyh2b2lkICosIHVfaW50KTsKK3ZvaWQJZW5kc2VydmVudCh2b2lkKTsKK2ludAlnZXRvcHQoaW50LCBjaGFyICogY29uc3QgKiwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0IHRpbWV2YWw7CitzdHJ1Y3QgdGltZXpvbmU7CisjZW5kaWYKK2ludAlnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopOworaW50CWlvY3RsKGludCwgaW50LCBjYWRkcl90KTsKK2ludAlwZm9wZW4oY2hhciAqLCBpbnQpOworaW50CXNldGxpbmVidWYoRklMRSAqKTsKK2ludAlzb2NrZXQoaW50LCBpbnQsIGludCk7CitpbnQJc3RyY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9sbGMuaCBiL2xsYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDRjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9sbGMuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGxjLmgsdiAxLjE3LjIuNCAyMDA3LzAyLzA4IDA3OjA3OjUxIGd1eSBFeHAgJCAoTEJMKQorICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgaW5mb3JtYXRpb24gaW4gdGhlIExMQyBoZWFkZXIuCisgKi8KKworI2RlZmluZQlMTENfVV9GTVQJMworI2RlZmluZQlMTENfR1NBUAkxCisjZGVmaW5lCUxMQ19JRwkgICAgICAgIDEgLyogSW5kaXZpZHVhbCAvIEdyb3VwICovCisjZGVmaW5lIExMQ19TX0ZNVAkxCisKKyNkZWZpbmUJTExDX1VfUE9MTAkweDEwCisjZGVmaW5lCUxMQ19JU19QT0xMCTB4MDEwMAorI2RlZmluZQlMTENfWElEX0ZJCTB4ODEKKworI2RlZmluZQlMTENfVV9DTUQodSkJKCh1KSAmIDB4ZWYpCisjZGVmaW5lCUxMQ19VSQkJMHgwMworI2RlZmluZQlMTENfVUEJCTB4NjMKKyNkZWZpbmUJTExDX0RJU0MJMHg0MworI2RlZmluZQlMTENfRE0JCTB4MGYKKyNkZWZpbmUJTExDX1NBQk1FCTB4NmYKKyNkZWZpbmUJTExDX1RFU1QJMHhlMworI2RlZmluZQlMTENfWElECQkweGFmCisjZGVmaW5lCUxMQ19GUk1SCTB4ODcKKworI2RlZmluZQlMTENfU19DTUQoaXMpCSgoKGlzKSA+PiAyKSAmIDB4MDMpCisjZGVmaW5lCUxMQ19SUgkJMHgwMDAxCisjZGVmaW5lCUxMQ19STlIJCTB4MDAwNQorI2RlZmluZQlMTENfUkVKCQkweDAwMDkKKworI2RlZmluZSBMTENfSVNfTlIoaXMpCSgoKGlzKSA+PiA5KSAmIDB4N2YpCisjZGVmaW5lIExMQ19JX05TKGlzKQkoKChpcykgPj4gMSkgJiAweDdmKQorCisjaWZuZGVmIExMQ1NBUF9OVUxMCisjZGVmaW5lCUxMQ1NBUF9OVUxMCQkweDAwCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQX0dMT0JBTAorI2RlZmluZQlMTENTQVBfR0xPQkFMCQkweGZmCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQXzgwMjFCX0kKKyNkZWZpbmUJTExDU0FQXzgwMjFCX0kJCTB4MDIKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfODAyMUJfRworI2RlZmluZQlMTENTQVBfODAyMUJfRwkJMHgwMworI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9TTkEKKyNkZWZpbmUJTExDU0FQX1NOQQkJMHgwNAorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9JUAorI2RlZmluZQlMTENTQVBfSVAJCTB4MDYKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfUFJPV0FZTk0KKyNkZWZpbmUJTExDU0FQX1BST1dBWU5NCQkweDBlCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQXzgwMjFECisjZGVmaW5lCUxMQ1NBUF84MDIxRAkJMHg0MgorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9SUzUxMQorI2RlZmluZQlMTENTQVBfUlM1MTEJCTB4NGUKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfSVNPODIwOAorI2RlZmluZQlMTENTQVBfSVNPODIwOAkJMHg3ZQorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9QUk9XQVkKKyNkZWZpbmUJTExDU0FQX1BST1dBWQkJMHg4ZQorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9TTkFQCisjZGVmaW5lCUxMQ1NBUF9TTkFQCQkweGFhCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQX0lQWAorI2RlZmluZSBMTENTQVBfSVBYCQkweGUwCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQX05FVEJFVUkKKyNkZWZpbmUgTExDU0FQX05FVEJFVUkJCTB4ZjAKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfSVNPTlMKKyNkZWZpbmUJTExDU0FQX0lTT05TCQkweGZlCisjZW5kaWYKKworLyoKKyAqIFBJRHMgZm9yIHVzZSB3aXRoIE9VSV9DSVNDTy4KKyAqLworI2RlZmluZQlQSURfQ0lTQ09fQ0RQCQkweDIwMDAJLyogQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sICovCisjZGVmaW5lCVBJRF9DSVNDT19WVFAJCTB4MjAwMwkvKiBDaXNjbyBWTEFOIFRydW5rIFByb3RvY29sICovCisjZGVmaW5lCVBJRF9DSVNDT19EVFAJCTB4MjAwNAkvKiBDaXNjbyBEeW5hbWljIFRydW5rIFByb3RvY29sICovCisKKy8qCisgKiBQSURzIGZvciB1c2Ugd2l0aCBPVUlfUkZDMjY4NC4KKyAqLworI2RlZmluZSBQSURfUkZDMjY4NF9FVEhfRkNTCTB4MDAwMQkvKiBFdGhlcm5ldCwgd2l0aCBGQ1MgKi8KKyNkZWZpbmUgUElEX1JGQzI2ODRfRVRIX05PRkNTCTB4MDAwNwkvKiBFdGhlcm5ldCwgd2l0aG91dCBGQ1MgKi8KKyNkZWZpbmUgUElEX1JGQzI2ODRfODAyXzRfRkNTCTB4MDAwMgkvKiA4MDIuNCwgd2l0aCBGQ1MgKi8KKyNkZWZpbmUgUElEX1JGQzI2ODRfODAyXzRfTk9GQ1MJMHgwMDA4CS8qIDgwMi40LCB3aXRob3V0IEZDUyAqLworI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNV9GQ1MJMHgwMDAzCS8qIDgwMi41LCB3aXRoIEZDUyAqLworI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNV9OT0ZDUwkweDAwMDkJLyogODAyLjUsIHdpdGhvdXQgRkNTICovCisjZGVmaW5lIFBJRF9SRkMyNjg0X0ZERElfRkNTCTB4MDAwNAkvKiBGRERJLCB3aXRoIEZDUyAqLworI2RlZmluZSBQSURfUkZDMjY4NF9GRERJX05PRkNTCTB4MDAwYQkvKiBGRERJLCB3aXRob3V0IEZDUyAqLworI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNl9GQ1MJMHgwMDA1CS8qIDgwMi42LCB3aXRoIEZDUyAqLworI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNl9OT0ZDUwkweDAwMGIJLyogODAyLjYsIHdpdGhvdXQgRkNTICovCisjZGVmaW5lIFBJRF9SRkMyNjg0X0JQRFUJMHgwMDBlCS8qIEJQRFVzICovCmRpZmYgLS1naXQgYS9tYWNoZGVwLmMgYi9tYWNoZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNDUwMwotLS0gL2Rldi9udWxsCisrKyBiL21hY2hkZXAuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWFjaGRlcC5jLHYgMS4xMyAyMDAzLzEyLzE1IDAzOjUzOjIxIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisvKgorICogWFhYIC0gYWxsIHdlIG5lZWQsIG9uIHBsYXRmb3JtcyBvdGhlciB0aGFuIERFQyBPU0YvMSAoYS9rL2EgRGlnaXRhbCBVTklYLAorICogYS9rL2EgVHJ1NjQgVU5JWCksIGlzICJzaXplX3QiLCB3aGljaCBpcyBhIHN0YW5kYXJkIEMgdHlwZTsgd2hhdCBkbyB3ZQorICogbmVlZCB0byBkbyB0byBnZXQgaXQgZGVmaW5lZD8gIFRoaXMgaXMgY2xlYXJseSB3cm9uZywgYXMgd2Ugc2hvdWxkbid0CisgKiBoYXZlIHRvIGluY2x1ZGUgVU5JWCBvciBXaW5kb3dzIHN5c3RlbSBoZWFkZXIgZmlsZXMgdG8gZ2V0IGl0LgorICovCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2lmbmRlZiBIQVZFX19fQVRUUklCVVRFX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmIC8qIEhBVkVfX19BVFRSSUJVVEVfXyAqLworCisjaWZkZWYgX19vc2ZfXworI2luY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKworI2lmICFkZWZpbmVkKEhBVkVfU05QUklOVEYpCitpbnQgc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfU05QUklOVEYpICovCisjZW5kaWYgLyogX19vc2ZfXyAqLworCisjaW5jbHVkZSAibWFjaGRlcC5oIgorCitpbnQKK2Fib3J0X29uX21pc2FsaWdubWVudChjaGFyICplYnVmIF9VXywgc2l6ZV90IGVidWZzaXogX1VfKQoreworI2lmZGVmIF9fb3NmX18KKwlzdGF0aWMgaW50IGJ1ZlsyXSA9IHsgU1NJTl9VQUNQUk9DLCBVQUNfU0lHQlVTIH07CisKKwlpZiAoc2V0c3lzaW5mbyhTU0lfTlZQQUlSUywgKGNhZGRyX3QpYnVmLCAxLCAwLCAwKSA8IDApIHsKKwkJKHZvaWQpc25wcmludGYoZWJ1ZiwgZWJ1ZnNpeiwgInNldHN5c2luZm86IGVycm5vICVkIiwgZXJybm8pOworCQlyZXR1cm4gKC0xKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvbWFjaGRlcC5oIGIvbWFjaGRlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDlhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tYWNoZGVwLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWFjaGRlcC5oLHYgMS4yIDIwMDAvMDEvMTcgMDY6MjQ6MjQgaXRvanVuIEV4cCAkIChMQkwpCisgKi8KKyNpZm5kZWYgdGNwZHVtcF9tYWNoZGVwX2gKKyNkZWZpbmUgdGNwZHVtcF9tYWNoZGVwX2gKKworaW50IGFib3J0X29uX21pc2FsaWdubWVudChjaGFyICosIHNpemVfdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL21ha2VtaWIgYi9tYWtlbWliCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjODBiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlbWliCkBAIC0wLDAgKzEsMjQ5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTkwLCAxOTk2CisjCUpvaG4gUm9iZXJ0IExvVmVyc28uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFNNSXYyIHBhcnNpbmcgY29weXJpZ2h0IChjKSAxOTk5CisjCVdpbGxpYW0gQy4gRmVubmVyLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZXMsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZXMsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisjIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisjIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyBAKCMpICRJZDogbWFrZW1pYix2IDEuMyAyMDAxLzA5LzE3IDIyOjE2OjUyIGZlbm5lciBFeHAgJCAoamx2KQorCisjCisjIFRoaXMgc2NyaXB0IHdpbGwgcmVhZCBlaXRoZXIgQVNOLjEtc3R5bGUgTUlCIGZpbGVzIG9yIHRoZSAiLmRlZnMiIGZpbGVzCisjIGNyZWF0ZWQgYnkgdGhlIElTT0RFICJtb3N5IiBwcm9ncmFtIG9uIHN1Y2ggZmlsZXMuCisjCisjIFRoZSBvdXRwdXQgb2YgdGhpcyBzY3JpcHQgaXMgdGhlICJtaWIuaCIgZmlsZSB1c2VkIGJ5IHRjcGR1bXBzJyBBU04uMS9TTk1QCisjIGRlY29kaW5nIGNvZGUuCisjCisjIFRoaXMgc2NyaXB0IG5lZWRzIHRvIGJlIHJ1biBieSAiZ2F3ayIgKEdOVSBhd2spLiAgIm5hd2siIHdpbGwgd29yaywgYnV0CisjIGR1bXAgd2lsbCBnZXQgYSByZWN1cnNpb24gZXJyb3IgaWYgeW91IHByb2Nlc3MgTEFSR0UgbWlicy4gIFdoaWxlIGl0IHdvdWxkCisjIGJ5IGZhcmlseSBlYXN5IHRvIHJld3JpdGUgdGhpcyBub3QgdG8gdXNlIHJlY3Vyc2lvbiAoYW5kIGFsc28gZWFzeSB0bworIyBlbGltaW5hdGUgdXNlIG9mIGdzdWIgYW5kIGZ1bmN0aW9ucyB0byB1c2UgY2xhc3NpYyAiYXdrIiksIHlvdSBoYXZlIHRvIAorIyBvcmRlciB0aGUgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBpbiBkZWZpbmVkLWZpcnN0IG9yZGVyIGZvciB0aGUgY29tcGlsZXIKKyMgbm90IHRvIGJhcmY7IHRvbyBiYWQgdHNvcnQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cy4KKyMKKworY2F0IDw8IEVPRgorLyoKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRjcGR1bXAvbWFrZW1pYiBvbiBgZGF0ZWAKKyAqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGVkaXQgdGhpcyBieSBoYW5kIQorICoKKyAqIHN0cnVjdCBtaWIgc29tZW5hbWUgPSB7IGRlc2MsIG9pZC1vY3RldCwgdHlwZSwgY2hpbGQtcG9pbnRlciwgbmV4dC1wb2ludGVyIAorfTsKKyAqLworCitFT0YKKworYXdrICcKK0JFR0lOIHsKKwlkZWJ1Zz0wOworCSMgZm9yIHNhbml0eSwgd2UgcHJlcCB0aGUgbmFtZXNwYWNlIHdpdGggb2JqZWN0cyBmcm9tIFJGQy0xMTU1CisJIyAod2UgbWFudWFsbHkgZXN0YWJsaXNoIHRoZSByb290KQorCW9pZFsiaXNvIl09MQorCW9pZGFkZCgib3JnIiwgImlzbyIsIDMpCisJb2lkYWRkKCJkb2QiLCAib3JnIiwgNikKKwlvaWRhZGQoImludGVybmV0IiwgImRvZCIsIDEpCisJb2lkYWRkKCJkaXJlY3RvcnkiLCAiaW50ZXJuZXQiLCAxKQorCW9pZGFkZCgibWdtdCIsICJpbnRlcm5ldCIsIDIpCisjWFhYCW9pZGFkZCgibWliIiwgIm1nbXQiLCAxKQorCW9pZGFkZCgibWliLTIiLCAibWdtdCIsIDEpCisJb2lkYWRkKCJleHBlcmltZW50YWwiLCAiaW50ZXJuZXQiLCAzKQorCW9pZGFkZCgicHJpdmF0ZSIsICJpbnRlcm5ldCIsIDQpCisJb2lkYWRkKCJlbnRlcnByaXNlcyIsICJwcml2YXRlIiwgMSkKKwlvaWRhZGQoImlwIiwgIm1pYi0yIiwgNCkKKwlvaWRhZGQoInRyYW5zbWlzc2lvbiIsICJtaWItMiIsIDEwKQorCisJaG9sZGRlc2M9Im5vbmUiCit9CisKKyMKKyMgUmVhZCBtb3N5ICIqLmRlZnMiIGZpbGUuICBtb3N5IGRvZXMgYWxsIHRoZSBwYXJzaW5nIHdvcms7IHdlIGp1c3QgcmVhZAorIyBpdHMgc2ltcGxlIGFuZCBzdHJhaWdodGZvcndhcmQgb3V0cHV0LiAgSXQgd291bGQgbm90IGJlIHRvbyBoYXJkIHRvIG1ha2UKKyMgdGNwZHVtcCBkaXJlY3RseSByZWFkIG1vc3kgb3V0cHV0LCBidXQuLi4KKyMKKyMgSWdub3JlIHRoZXNlIHVubGVzcyB0aGUgY3VycmVudCBmaWxlIGlzIGNhbGxlZCBzb21ldGhpbmcuZGVmczsgZmFsc2UKKyMgcG9zaXRpdmVzIGFyZSB0b28gY29tbW9uIGluIERFU0NSSVBUSU9Ocy4KKworTkYgPiAxICYmIGluZGV4KCQyLCIuIik+MCAmJiBGSUxFTkFNRSB+IC9cLmRlZnMvIHsKKwkjIGN1cnJlbnRseSBpZ25vcmUgaXRlbXMgb2YgdGhlIGZvcm0gInsgaXNvLjMuNi4xIH0iCisJaWYgKHNwbGl0KCQyLCBwLCAiLiIpID09IDIpIHsKKwkJb2lkYWRkKCQxLCBwWzFdLCBwWzJdKQorCX0KKwluZXh0Cit9CisKKyMKKyMgTXVzdCBiZSBhIE1JQiBmaWxlCisjIE1ha2UgaXQgZWFzaWVyIHRvIHBhcnNlIC0gdXNlZCB0byBiZSBkb25lIGJ5IHNlZAoreyBzdWIoLy0tXCouKlwqLS0vLCAiIik7IHN1YigvLS0uKi8sICIiKTsgZ3N1YigvW3t9XS8sICIgJiAiKTsgfQorCisjCisjIHRoaXMgbmV4dCBzZWN0aW9uIGlzIHNpbXBsZSBhbmQgbmFpdmUsIGJ1dCBkb2VzIHRoZSBqb2Igb2sKKyMKKworIyBmb28gT0JKRUNUIElERU5USUZJRVIgOjo9IHsgYmF6IDE3IH0KKyMgb3IKKyMgZm9vIE9CSkVDVCBJREVOVElGSUVSIDo6PQorIyB7IGJheiAxNyB9CiskMiQzJDQgPT0gIk9CSkVDVElERU5USUZJRVI6Oj0iIHsKKwlob2xkZGVzYz0ibm9uZSIKKwlpZiAoTkYgPT0gOCkKKwkJb2lkYWRkKCQxLCAkNiwgJDcpCisJaWYgKE5GID09IDQpCisJCWhvbGRkZXNjPSQxCisJbmV4dAorfQorJDEgPT0gInsiICYmIGhvbGRkZXNjICE9ICJub25lIiAmJiBORiA9PSA0IHsKKwlvaWRhZGQoaG9sZGRlc2MsICQyLCAkMykKKwlob2xkZGVzYz0ibm9uZSIKK30KKyMKKyMgZm9vIE9CSkVDVCBJREVOVElGSUVSCisjICA6Oj0geyBiYXIgMSB9CiskMiQzID09ICJPQkpFQ1RJREVOVElGSUVSIiAmJiAkMSAhPSAiU1lOVEFYIiAmJiBORiA9PSAzIHsKKwlob2xkZGVzYz0kMQorfQorIworIyBmb28KKyMgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgYmFyIDEgfQorIyBhIGNvdXBsZSBvZiBoZXVyaXN0aWNzIHRvIGV4Y2x1ZGUgc2luZ2xlIHdvcmRzIGluIGUuZy4gbG9uZworIyAgREVTQ1JJUFRJT04gY2xhdXNlcworTkYgPT0gMSAmJiAkMSB+ICJbYS16XVthLXpdKltBLVpdIiAmJiAkMSAhfiAvWygpe30uLF0vICYmIGhvbGRkZXNjID09ICJub25lIiB7CisJaG9sZGRlc2M9JDEKK30KKyQxJDIkMyA9PSAiT0JKRUNUSURFTlRJRklFUjo6PSIgJiYgaG9sZGRlc2MgIT0gIm5vbmUiIHsKKwlvaWRhZGQoaG9sZGRlc2MsICQ1LCAkNikKKwlob2xkZGVzYz0ibm9uZSIKK30KKyMKKyMgIm5vcm1hbCIgc3R5bGUKKyMgZm9vIE9CSkVDVC1UWVBFIC4uLgorIyAuLi4KKyMgICA6Oj0geyBiYXogNSB9CiskMiA9PSAiTU9EVUxFLUlERU5USVRZIiB8fCAkMiA9PSAiTU9EVUxFLUNPTVBMSUFOQ0UiIHx8CisJJDIgPT0gIk9CSkVDVC1JREVOVElUWSIgfHwgJDIgPT0gIk9CSkVDVC1UWVBFIiB8fAorCSQyID09ICJPQkpFQ1QtR1JPVVAiIHx8CisJJDIgPT0gIk5PVElGSUNBVElPTi1UWVBFIiB8fCAkMiA9PSAiTk9USUZJQ0FUSU9OLUdST1VQIiB7CisJaG9sZGRlc2M9JDEKK30KKyQxID09ICI6Oj0iICYmIGhvbGRkZXNjICE9ICJub25lIiAmJiBORiA9PSA1IHsKKwlvaWRhZGQoaG9sZGRlc2MsICQzLCAkNCkKKwlob2xkZGVzYz0ibm9uZSIKK30KKyMKKyMgZm9vIDo6PSB7IGJheiAxNyB9CiskMiQzID09ICI6Oj17IiB7CisJb2lkYWRkKCQxLCQ0LCQ1KQorCWhvbGRkZXNjPSJub25lIgorfQorCisKKyMgCisjIEVuZCBvZiB0aGUgcm9hZCAtIG91dHB1dCB0aGUgZGF0YS4KKyMKKworRU5EIHsKKwlwcmludCAic3RydWN0IG9iaiIKKwlkdW1wKCJpc28iKQorCXByaW50ICIqbWlicm9vdCA9ICZfaXNvX29iajsiCit9CisKK2Z1bmN0aW9uIGlubihmaWxlKSB7CisJaWYgKGZpbGUgPT0gIiIgfHwgZmlsZSA9PSAiLSIpCisJCXJldHVybiAiIgorCXJldHVybiAiIGluICIgZmlsZQorfQorCisjCisjIGFkZCBhIG5ldyBvYmplY3QgdG8gdGhlIHRyZWUKKyMKKyMJCW5ldyBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBwYXJlbnQgdmFsdWUgfQorIworCitmdW5jdGlvbiBvaWRhZGQobmV3LCBwYXJlbnQsIHZhbHVlKSB7CisJIyBJZ25vcmUgMC4wCisJaWYgKHBhcmVudCA9PSAiMCIgJiYgdmFsdWUgPT0gMCkKKwkJcmV0dXJuCisJaWYgKGRlYnVnKQorCQlwcmludCAiLyogb2lkYWRkIiBpbm4oRklMRU5BTUUpICI6IiwgbmV3LCAiaW4iLCBwYXJlbnQsICJhcyIsIHZhbHVlLCAibGluZSIsICQwLCAiKi8iCisJIyB1c2Ugc2FmZSBDIGlkZW50aWZpZXJzCisJZ3N1YigvWy0mXC9dLywiIixuZXcpCisJZ3N1YigvWy0mXC9dLywiIixwYXJlbnQpCisJIyBjaGVjayBpZiBwYXJlbnQgbWlzc2luZworCWlmIChvaWRbcGFyZW50XSA9PSAiIikgeworCQlwcmludGYgIi8qIHBhcnNlIHByb2JsZW0lczogbm8gcGFyZW50IGZvciAlcy4lcyglZCkgKi9cbiIsIFwKKwkJCWlubihGSUxFTkFNRSksIHBhcmVudCwgbmV3LCB2YWx1ZQorCQlyZXR1cm4KKwl9CisJIyBjaGVjayBpZiBwYXJlbnQudmFsdWUgYWxyZWFkeSBleGlzdHMKKwlpZiAob2lkW25ld10gPiAwICYmIG9pZFtuZXddICE9IHZhbHVlKSB7CisJCXByaW50ZiAiLyogcGFyc2UgcHJvYmxlbSVzOiBkdXAgJXMuJXMoJWQpICE9IG9sZCAoJWQpICovXG4iLCBcCisJCQlpbm4oRklMRU5BTUUpLCBwYXJlbnQsIG5ldywgdmFsdWUsIG9pZFtuZXddCisJCXJldHVybgorCX0KKwkjIGNoZWNrIGZvciBuZXcgbmFtZSBmb3IgcGFyZW50LnZhbHVlCisJaWYgKGNoaWxkW3BhcmVudF0gIT0gIiIpIHsKKwkJZm9yIChzaWIgPSBjaGlsZFtwYXJlbnRdOyBzaWIgIT0gIiI7IHNpYiA9IHNpYmxpbmdbc2liXSkKKwkJCWlmIChvaWRbc2liXSA9PSB2YWx1ZSkgeworCQkJCWlmIChuZXcgIT0gc2liKQorCQkJCQlwcmludGYgIi8qIHBhcnNlIHByb2JsZW0lczogbmV3IG5hbWUiIFwKKwkJCQkJCSIgXCIlc1wiIiBcCisJCQkJCQkiIGZvciAlcy4lcyglZCkgaWdub3JlZCAqL1xuIiwgXAorCQkJCQkJaW5uKEZJTEVOQU1FKSwgbmV3LCBwYXJlbnQsIFwKKwkJCQkJCXNpYiwgdmFsdWUKKwkJCQlyZXR1cm4KKwkJCX0KKwl9CisKKwlvaWRbbmV3XT12YWx1ZQorCWlmIChjaGlsZFtwYXJlbnRdID09ICIiKSB7CisJCWNoaWxkW3BhcmVudF0gPSBuZXcKKwl9IGVsc2UgeworCQlzaWJsaW5nW25ld10gPSBjaGlsZFtwYXJlbnRdCisJCWNoaWxkW3BhcmVudF0gPSBuZXcKKwl9Cit9CisKKyMKKyMgb2xkKD8pIHJvdXRpbmUgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlIChpbiBwb3N0Zml4IG9yZGVyIGZvciBjb252ZW5pZW5jZSkKKyMKKworZnVuY3Rpb24gZHVtcChpdGVtLCBjLCBzKSB7CisjCW5ld2l0ZW09c29mYXIiLiJpdGVtIigib2lkW2l0ZW1dIikiCisjCXByaW50ZiAiLyogJXMgYz0lcyBzPSVzICovXG4iLCBuZXdpdGVtLCBjaGlsZFtpdGVtXSwgc2libGluZ1tpdGVtXQorCWM9Ik5VTEwiCisJaWYgKGNoaWxkW2l0ZW1dICE9ICIiKSB7CisJCWR1bXAoY2hpbGRbaXRlbV0pCisJCWMgPSAiJl8iY2hpbGRbaXRlbV0iX29iaiIKKwl9CisJcz0iTlVMTCIKKwlpZiAoc2libGluZ1tpdGVtXSAhPSAiIikgeworCQlkdW1wKHNpYmxpbmdbaXRlbV0pCisJCXMgPSAiJl8ic2libGluZ1tpdGVtXSJfb2JqIgorCX0KKwlwcmludGYgIl8lc19vYmogPSB7XG5cdFwiJXNcIiwgJWQsIDAsXG5cdCVzLCAlc1xufSxcbiIsIFwKKwkJaXRlbSwgaXRlbSwgb2lkW2l0ZW1dLCBjLCBzCit9CisnICRACitleGl0IDAKZGlmZiAtLWdpdCBhL21pYi5oIGIvbWliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjNmMyYwotLS0gL2Rldi9udWxsCisrKyBiL21pYi5oCkBAIC0wLDAgKzEsMTQ2MCBAQAorLyoKKyAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRjcGR1bXAvbWFrZW1pYiBvbiBXZWQgU2VwIDI2IDEyOjEyOjMxIEVEVCAxOTkwCisgKiBZb3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBlZGl0IHRoaXMgYnkgaGFuZCEKKyAqCisgKiBzdHJ1Y3QgbWliIHNvbWVuYW1lID0geyBkZXNjLCBvaWQtb2N0ZXQsIHR5cGUsIGNoaWxkLXBvaW50ZXIsIG5leHQtcG9pbnRlcgorfTsKKyAqLworCisvKiBwYXJzZSBwcm9ibGVtOiBuZXcgbmFtZSAibWliIiBmb3IgbWdtdC5taWIoMSkgaWdub3JlZCAqLworLyogcGFyc2UgcHJvYmxlbTogbm8gcGFyZW50IGZvciAwLm51bGxTcGVjaWZpYygwKSAqLworc3RydWN0IG9iagorX3Byb3Rlb25fb2JqID0geworCSJwcm90ZW9uIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX2libV9vYmogPSB7CisJImlibSIsIDIsIDAsCisJTlVMTCwgJl9wcm90ZW9uX29iagorfSwKK19jbXVfb2JqID0geworCSJjbXUiLCAzLCAwLAorCU5VTEwsICZfaWJtX29iagorfSwKK191bml4X29iaiA9IHsKKwkidW5peCIsIDQsIDAsCisJTlVMTCwgJl9jbXVfb2JqCit9LAorX2FjY19vYmogPSB7CisJImFjYyIsIDUsIDAsCisJTlVMTCwgJl91bml4X29iagorfSwKK190d2dfb2JqID0geworCSJ0d2ciLCA2LCAwLAorCU5VTEwsICZfYWNjX29iagorfSwKK19jYXltYW5fb2JqID0geworCSJjYXltYW4iLCA3LCAwLAorCU5VTEwsICZfdHdnX29iagorfSwKK19ueXNlcm5ldF9vYmogPSB7CisJIm55c2VybmV0IiwgOCwgMCwKKwlOVUxMLCAmX2NheW1hbl9vYmoKK30sCitfY2lzY29fb2JqID0geworCSJjaXNjbyIsIDksIDAsCisJTlVMTCwgJl9ueXNlcm5ldF9vYmoKK30sCitfbnNjX29iaiA9IHsKKwkibnNjIiwgMTAsIDAsCisJTlVMTCwgJl9jaXNjb19vYmoKK30sCitfaHBfb2JqID0geworCSJocCIsIDExLCAwLAorCU5VTEwsICZfbnNjX29iagorfSwKK19lcGlsb2d1ZV9vYmogPSB7CisJImVwaWxvZ3VlIiwgMTIsIDAsCisJTlVMTCwgJl9ocF9vYmoKK30sCitfdXRlbm5lc3NlZV9vYmogPSB7CisJInV0ZW5uZXNzZWUiLCAxMywgMCwKKwlOVUxMLCAmX2VwaWxvZ3VlX29iagorfSwKK19iYm5fb2JqID0geworCSJiYm4iLCAxNCwgMCwKKwlOVUxMLCAmX3V0ZW5uZXNzZWVfb2JqCit9LAorX3h5bG9naWNzX29iaiA9IHsKKwkieHlsb2dpY3MiLCAxNSwgMCwKKwlOVUxMLCAmX2Jibl9vYmoKK30sCitfdW5pc3lzX29iaiA9IHsKKwkidW5pc3lzIiwgMTYsIDAsCisJTlVMTCwgJl94eWxvZ2ljc19vYmoKK30sCitfY2Fuc3Rhcl9vYmogPSB7CisJImNhbnN0YXIiLCAxNywgMCwKKwlOVUxMLCAmX3VuaXN5c19vYmoKK30sCitfd2VsbGZsZWV0X29iaiA9IHsKKwkid2VsbGZsZWV0IiwgMTgsIDAsCisJTlVMTCwgJl9jYW5zdGFyX29iagorfSwKK190cndfb2JqID0geworCSJ0cnciLCAxOSwgMCwKKwlOVUxMLCAmX3dlbGxmbGVldF9vYmoKK30sCitfbWl0X29iaiA9IHsKKwkibWl0IiwgMjAsIDAsCisJTlVMTCwgJl90cndfb2JqCit9LAorX2Vvbl9vYmogPSB7CisJImVvbiIsIDIxLCAwLAorCU5VTEwsICZfbWl0X29iagorfSwKK19zcGFydGFjdXNfb2JqID0geworCSJzcGFydGFjdXMiLCAyMiwgMCwKKwlOVUxMLCAmX2Vvbl9vYmoKK30sCitfZXhjZWxhbl9vYmogPSB7CisJImV4Y2VsYW4iLCAyMywgMCwKKwlOVUxMLCAmX3NwYXJ0YWN1c19vYmoKK30sCitfc3BpZGVyX29iaiA9IHsKKwkic3BpZGVyIiwgMjQsIDAsCisJTlVMTCwgJl9leGNlbGFuX29iagorfSwKK19uc2ZuZXRfb2JqID0geworCSJuc2ZuZXQiLCAyNSwgMCwKKwlOVUxMLCAmX3NwaWRlcl9vYmoKK30sCitfc3l0ZWtfb2JqID0geworCSJzeXRlayIsIDI2LCAwLAorCU5VTEwsICZfbnNmbmV0X29iagorfSwKK19pbnRlcmdyYXBoX29iaiA9IHsKKwkiaW50ZXJncmFwaCIsIDI3LCAwLAorCU5VTEwsICZfc3l0ZWtfb2JqCit9LAorX2ludGVybGFuX29iaiA9IHsKKwkiaW50ZXJsYW4iLCAyOCwgMCwKKwlOVUxMLCAmX2ludGVyZ3JhcGhfb2JqCit9LAorX3ZpdGFsaW5rX29iaiA9IHsKKwkidml0YWxpbmsiLCAyOSwgMCwKKwlOVUxMLCAmX2ludGVybGFuX29iagorfSwKK191bGFuYV9vYmogPSB7CisJInVsYW5hIiwgMzAsIDAsCisJTlVMTCwgJl92aXRhbGlua19vYmoKK30sCitfbnN3Y19vYmogPSB7CisJIm5zd2MiLCAzMSwgMCwKKwlOVUxMLCAmX3VsYW5hX29iagorfSwKK19zYW50YWNydXpvcGVyYXRpb25fb2JqID0geworCSJzYW50YWNydXpvcGVyYXRpb24iLCAzMiwgMCwKKwlOVUxMLCAmX25zd2Nfb2JqCit9LAorX3h5cGxleF9vYmogPSB7CisJInh5cGxleCIsIDMzLCAwLAorCU5VTEwsICZfc2FudGFjcnV6b3BlcmF0aW9uX29iagorfSwKK19jcmF5X29iaiA9IHsKKwkiY3JheSIsIDM0LCAwLAorCU5VTEwsICZfeHlwbGV4X29iagorfSwKK19iZWxsbm9ydGhlcm5yZXNlYXJjaF9vYmogPSB7CisJImJlbGxub3J0aGVybnJlc2VhcmNoIiwgMzUsIDAsCisJTlVMTCwgJl9jcmF5X29iagorfSwKK19kZWNfb2JqID0geworCSJkZWMiLCAzNiwgMCwKKwlOVUxMLCAmX2JlbGxub3J0aGVybnJlc2VhcmNoX29iagorfSwKK190b3VjaF9vYmogPSB7CisJInRvdWNoIiwgMzcsIDAsCisJTlVMTCwgJl9kZWNfb2JqCit9LAorX25ldHdvcmtyZXNlYXJjaGNvcnBfb2JqID0geworCSJuZXR3b3JrcmVzZWFyY2hjb3JwIiwgMzgsIDAsCisJTlVMTCwgJl90b3VjaF9vYmoKK30sCitfYmF5bG9yX29iaiA9IHsKKwkiYmF5bG9yIiwgMzksIDAsCisJTlVMTCwgJl9uZXR3b3JrcmVzZWFyY2hjb3JwX29iagorfSwKK19ubWZlY2NsbG5sX29iaiA9IHsKKwkibm1mZWNjbGxubCIsIDQwLCAwLAorCU5VTEwsICZfYmF5bG9yX29iagorfSwKK19zcmlfb2JqID0geworCSJzcmkiLCA0MSwgMCwKKwlOVUxMLCAmX25tZmVjY2xsbmxfb2JqCit9LAorX3N1bl9vYmogPSB7CisJInN1biIsIDQyLCAwLAorCU5VTEwsICZfc3JpX29iagorfSwKK18zY29tX29iaiA9IHsKKwkiM2NvbSIsIDQzLCAwLAorCU5VTEwsICZfc3VuX29iagorfSwKK19jbWNfb2JqID0geworCSJjbWMiLCA0NCwgMCwKKwlOVUxMLCAmXzNjb21fb2JqCit9LAorX3N5bm9wdGljc19vYmogPSB7CisJInN5bm9wdGljcyIsIDQ1LCAwLAorCU5VTEwsICZfY21jX29iagorfSwKK19jaGV5ZW5uZV9vYmogPSB7CisJImNoZXllbm5lIiwgNDYsIDAsCisJTlVMTCwgJl9zeW5vcHRpY3Nfb2JqCit9LAorX3ByaW1lX29iaiA9IHsKKwkicHJpbWUiLCA0NywgMCwKKwlOVUxMLCAmX2NoZXllbm5lX29iagorfSwKK19tY25jX29iaiA9IHsKKwkibWNuYyIsIDQ4LCAwLAorCU5VTEwsICZfcHJpbWVfb2JqCit9LAorX2NoaXBjb21fb2JqID0geworCSJjaGlwY29tIiwgNDksIDAsCisJTlVMTCwgJl9tY25jX29iagorfSwKK19vcHRpY2FsZGF0YXN5c3RlbXNfb2JqID0geworCSJvcHRpY2FsZGF0YXN5c3RlbXMiLCA1MCwgMCwKKwlOVUxMLCAmX2NoaXBjb21fb2JqCit9LAorX2dhdGVkX29iaiA9IHsKKwkiZ2F0ZWQiLCA1MSwgMCwKKwlOVUxMLCAmX29wdGljYWxkYXRhc3lzdGVtc19vYmoKK30sCitfY2FibGV0cm9uX29iaiA9IHsKKwkiY2FibGV0cm9uIiwgNTIsIDAsCisJTlVMTCwgJl9nYXRlZF9vYmoKK30sCitfYXBvbGxvX29iaiA9IHsKKwkiYXBvbGxvIiwgNTMsIDAsCisJTlVMTCwgJl9jYWJsZXRyb25fb2JqCit9LAorX2Rlc2t0YWxrc3lzdGVtc19vYmogPSB7CisJImRlc2t0YWxrc3lzdGVtcyIsIDU0LCAwLAorCU5VTEwsICZfYXBvbGxvX29iagorfSwKK19zc2RzX29iaiA9IHsKKwkic3NkcyIsIDU1LCAwLAorCU5VTEwsICZfZGVza3RhbGtzeXN0ZW1zX29iagorfSwKK19jYXN0bGVyb2NrX29iaiA9IHsKKwkiY2FzdGxlcm9jayIsIDU2LCAwLAorCU5VTEwsICZfc3Nkc19vYmoKK30sCitfbWlwc19vYmogPSB7CisJIm1pcHMiLCA1NywgMCwKKwlOVUxMLCAmX2Nhc3RsZXJvY2tfb2JqCit9LAorX3Rndl9vYmogPSB7CisJInRndiIsIDU4LCAwLAorCU5VTEwsICZfbWlwc19vYmoKK30sCitfc2lsaWNvbmdyYXBoaWNzX29iaiA9IHsKKwkic2lsaWNvbmdyYXBoaWNzIiwgNTksIDAsCisJTlVMTCwgJl90Z3Zfb2JqCit9LAorX3ViY19vYmogPSB7CisJInViYyIsIDYwLCAwLAorCU5VTEwsICZfc2lsaWNvbmdyYXBoaWNzX29iagorfSwKK19tZXJpdF9vYmogPSB7CisJIm1lcml0IiwgNjEsIDAsCisJTlVMTCwgJl91YmNfb2JqCit9LAorX2ZpYmVyY29tX29iaiA9IHsKKwkiZmliZXJjb20iLCA2MiwgMCwKKwlOVUxMLCAmX21lcml0X29iagorfSwKK19hcHBsZV9vYmogPSB7CisJImFwcGxlIiwgNjMsIDAsCisJTlVMTCwgJl9maWJlcmNvbV9vYmoKK30sCitfZ2FuZGFsZl9vYmogPSB7CisJImdhbmRhbGYiLCA2NCwgMCwKKwlOVUxMLCAmX2FwcGxlX29iagorfSwKK19kYXJ0bW91dGhfb2JqID0geworCSJkYXJ0bW91dGgiLCA2NSwgMCwKKwlOVUxMLCAmX2dhbmRhbGZfb2JqCit9LAorX2Rhdmlkc3lzdGVtc19vYmogPSB7CisJImRhdmlkc3lzdGVtcyIsIDY2LCAwLAorCU5VTEwsICZfZGFydG1vdXRoX29iagorfSwKK19yZXV0ZXJfb2JqID0geworCSJyZXV0ZXIiLCA2NywgMCwKKwlOVUxMLCAmX2Rhdmlkc3lzdGVtc19vYmoKK30sCitfY29ybmVsbF9vYmogPSB7CisJImNvcm5lbGwiLCA2OCwgMCwKKwlOVUxMLCAmX3JldXRlcl9vYmoKK30sCitfdG1hY19vYmogPSB7CisJInRtYWMiLCA2OSwgMCwKKwlOVUxMLCAmX2Nvcm5lbGxfb2JqCit9LAorX2xvY3VzX29iaiA9IHsKKwkibG9jdXMiLCA3MCwgMCwKKwlOVUxMLCAmX3RtYWNfb2JqCit9LAorX25hc2Ffb2JqID0geworCSJuYXNhIiwgNzEsIDAsCisJTlVMTCwgJl9sb2N1c19vYmoKK30sCitfcmV0aXhfb2JqID0geworCSJyZXRpeCIsIDcyLCAwLAorCU5VTEwsICZfbmFzYV9vYmoKK30sCitfYm9laW5nX29iaiA9IHsKKwkiYm9laW5nIiwgNzMsIDAsCisJTlVMTCwgJl9yZXRpeF9vYmoKK30sCitfYXR0X29iaiA9IHsKKwkiYXR0IiwgNzQsIDAsCisJTlVMTCwgJl9ib2Vpbmdfb2JqCit9LAorX3VuZ2VybWFubmJhc3Nfb2JqID0geworCSJ1bmdlcm1hbm5iYXNzIiwgNzUsIDAsCisJTlVMTCwgJl9hdHRfb2JqCit9LAorX2RpZ2l0YWxhbmFseXNpc19vYmogPSB7CisJImRpZ2l0YWxhbmFseXNpcyIsIDc2LCAwLAorCU5VTEwsICZfdW5nZXJtYW5uYmFzc19vYmoKK30sCitfaHBsYW5tYW5fb2JqID0geworCSJocGxhbm1hbiIsIDc3LCAwLAorCU5VTEwsICZfZGlnaXRhbGFuYWx5c2lzX29iagorfSwKK19uZXRsYWJzX29iaiA9IHsKKwkibmV0bGFicyIsIDc4LCAwLAorCU5VTEwsICZfaHBsYW5tYW5fb2JqCit9LAorX2ljbF9vYmogPSB7CisJImljbCIsIDc5LCAwLAorCU5VTEwsICZfbmV0bGFic19vYmoKK30sCitfYXVzcGV4X29iaiA9IHsKKwkiYXVzcGV4IiwgODAsIDAsCisJTlVMTCwgJl9pY2xfb2JqCit9LAorX2xhbm5ldF9vYmogPSB7CisJImxhbm5ldCIsIDgxLCAwLAorCU5VTEwsICZfYXVzcGV4X29iagorfSwKK19uY2Rfb2JqID0geworCSJuY2QiLCA4MiwgMCwKKwlOVUxMLCAmX2xhbm5ldF9vYmoKK30sCitfcmF5Y29tX29iaiA9IHsKKwkicmF5Y29tIiwgODMsIDAsCisJTlVMTCwgJl9uY2Rfb2JqCit9LAorX3BpcmVsbGlmb2NvbV9vYmogPSB7CisJInBpcmVsbGlmb2NvbSIsIDg0LCAwLAorCU5VTEwsICZfcmF5Y29tX29iagorfSwKK19kYXRhYmlsaXR5X29iaiA9IHsKKwkiZGF0YWJpbGl0eSIsIDg1LCAwLAorCU5VTEwsICZfcGlyZWxsaWZvY29tX29iagorfSwKK19uZXR3b3JrYXBwbHRlY2hfb2JqID0geworCSJuZXR3b3JrYXBwbHRlY2giLCA4NiwgMCwKKwlOVUxMLCAmX2RhdGFiaWxpdHlfb2JqCit9LAorX2xpbmtfb2JqID0geworCSJsaW5rIiwgODcsIDAsCisJTlVMTCwgJl9uZXR3b3JrYXBwbHRlY2hfb2JqCit9LAorX255dV9vYmogPSB7CisJIm55dSIsIDg4LCAwLAorCU5VTEwsICZfbGlua19vYmoKK30sCitfcm5kX29iaiA9IHsKKwkicm5kIiwgODksIDAsCisJTlVMTCwgJl9ueXVfb2JqCit9LAorX2ludGVyY29uX29iaiA9IHsKKwkiaW50ZXJjb24iLCA5MCwgMCwKKwlOVUxMLCAmX3JuZF9vYmoKK30sCitfbGVhcm5pbmd0cmVlX29iaiA9IHsKKwkibGVhcm5pbmd0cmVlIiwgOTEsIDAsCisJTlVMTCwgJl9pbnRlcmNvbl9vYmoKK30sCitfd2Vic3RlcmNvbXB1dGVyX29iaiA9IHsKKwkid2Vic3RlcmNvbXB1dGVyIiwgOTIsIDAsCisJTlVMTCwgJl9sZWFybmluZ3RyZWVfb2JqCit9LAorX2Zyb250aWVyX29iaiA9IHsKKwkiZnJvbnRpZXIiLCA5MywgMCwKKwlOVUxMLCAmX3dlYnN0ZXJjb21wdXRlcl9vYmoKK30sCitfbm9raWFfb2JqID0geworCSJub2tpYSIsIDk0LCAwLAorCU5VTEwsICZfZnJvbnRpZXJfb2JqCit9LAorX2FsbGVuYnJhZGxleV9vYmogPSB7CisJImFsbGVuYnJhZGxleSIsIDk1LCAwLAorCU5VTEwsICZfbm9raWFfb2JqCit9LAorX2Nlcm5fb2JqID0geworCSJjZXJuIiwgOTYsIDAsCisJTlVMTCwgJl9hbGxlbmJyYWRsZXlfb2JqCit9LAorX3NpZ21hX29iaiA9IHsKKwkic2lnbWEiLCA5NywgMCwKKwlOVUxMLCAmX2Nlcm5fb2JqCit9LAorX2VtZXJnaW5ndGVjaF9vYmogPSB7CisJImVtZXJnaW5ndGVjaCIsIDk4LCAwLAorCU5VTEwsICZfc2lnbWFfb2JqCit9LAorX3NubXByZXNlYXJjaF9vYmogPSB7CisJInNubXByZXNlYXJjaCIsIDk5LCAwLAorCU5VTEwsICZfZW1lcmdpbmd0ZWNoX29iagorfSwKK19vaGlvc3RhdGVfb2JqID0geworCSJvaGlvc3RhdGUiLCAxMDAsIDAsCisJTlVMTCwgJl9zbm1wcmVzZWFyY2hfb2JqCit9LAorX3VsdHJhX29iaiA9IHsKKwkidWx0cmEiLCAxMDEsIDAsCisJTlVMTCwgJl9vaGlvc3RhdGVfb2JqCit9LAorX2NjdXJfb2JqID0geworCSJjY3VyIiwgMTM2LCAwLAorCU5VTEwsICZfdWx0cmFfb2JqCit9LAorX2VudGVycHJpc2VzX29iaiA9IHsKKwkiZW50ZXJwcmlzZXMiLCAxLCAwLAorCSZfY2N1cl9vYmosIE5VTEwKK30sCitfc25tcEluUGt0c19vYmogPSB7CisJInNubXBJblBrdHMiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfc25tcE91dFBrdHNfb2JqID0geworCSJzbm1wT3V0UGt0cyIsIDIsIDAsCisJTlVMTCwgJl9zbm1wSW5Qa3RzX29iagorfSwKK19zbm1wSW5CYWRWZXJzaW9uc19vYmogPSB7CisJInNubXBJbkJhZFZlcnNpb25zIiwgMywgMCwKKwlOVUxMLCAmX3NubXBPdXRQa3RzX29iagorfSwKK19zbm1wSW5CYWRDb21tdW5pdHlOYW1lc19vYmogPSB7CisJInNubXBJbkJhZENvbW11bml0eU5hbWVzIiwgNCwgMCwKKwlOVUxMLCAmX3NubXBJbkJhZFZlcnNpb25zX29iagorfSwKK19zbm1wSW5CYWRDb21tdW5pdHlVc2VzX29iaiA9IHsKKwkic25tcEluQmFkQ29tbXVuaXR5VXNlcyIsIDUsIDAsCisJTlVMTCwgJl9zbm1wSW5CYWRDb21tdW5pdHlOYW1lc19vYmoKK30sCitfc25tcEluQVNOUGFyc2VFcnJzX29iaiA9IHsKKwkic25tcEluQVNOUGFyc2VFcnJzIiwgNiwgMCwKKwlOVUxMLCAmX3NubXBJbkJhZENvbW11bml0eVVzZXNfb2JqCit9LAorX3NubXBJbkJhZFR5cGVzX29iaiA9IHsKKwkic25tcEluQmFkVHlwZXMiLCA3LCAwLAorCU5VTEwsICZfc25tcEluQVNOUGFyc2VFcnJzX29iagorfSwKK19zbm1wSW5Ub29CaWdzX29iaiA9IHsKKwkic25tcEluVG9vQmlncyIsIDgsIDAsCisJTlVMTCwgJl9zbm1wSW5CYWRUeXBlc19vYmoKK30sCitfc25tcEluTm9TdWNoTmFtZXNfb2JqID0geworCSJzbm1wSW5Ob1N1Y2hOYW1lcyIsIDksIDAsCisJTlVMTCwgJl9zbm1wSW5Ub29CaWdzX29iagorfSwKK19zbm1wSW5CYWRWYWx1ZXNfb2JqID0geworCSJzbm1wSW5CYWRWYWx1ZXMiLCAxMCwgMCwKKwlOVUxMLCAmX3NubXBJbk5vU3VjaE5hbWVzX29iagorfSwKK19zbm1wSW5SZWFkT25seXNfb2JqID0geworCSJzbm1wSW5SZWFkT25seXMiLCAxMSwgMCwKKwlOVUxMLCAmX3NubXBJbkJhZFZhbHVlc19vYmoKK30sCitfc25tcEluR2VuRXJyc19vYmogPSB7CisJInNubXBJbkdlbkVycnMiLCAxMiwgMCwKKwlOVUxMLCAmX3NubXBJblJlYWRPbmx5c19vYmoKK30sCitfc25tcEluVG90YWxSZXFWYXJzX29iaiA9IHsKKwkic25tcEluVG90YWxSZXFWYXJzIiwgMTMsIDAsCisJTlVMTCwgJl9zbm1wSW5HZW5FcnJzX29iagorfSwKK19zbm1wSW5Ub3RhbFNldFZhcnNfb2JqID0geworCSJzbm1wSW5Ub3RhbFNldFZhcnMiLCAxNCwgMCwKKwlOVUxMLCAmX3NubXBJblRvdGFsUmVxVmFyc19vYmoKK30sCitfc25tcEluR2V0UmVxdWVzdHNfb2JqID0geworCSJzbm1wSW5HZXRSZXF1ZXN0cyIsIDE1LCAwLAorCU5VTEwsICZfc25tcEluVG90YWxTZXRWYXJzX29iagorfSwKK19zbm1wSW5HZXROZXh0c19vYmogPSB7CisJInNubXBJbkdldE5leHRzIiwgMTYsIDAsCisJTlVMTCwgJl9zbm1wSW5HZXRSZXF1ZXN0c19vYmoKK30sCitfc25tcEluU2V0UmVxdWVzdHNfb2JqID0geworCSJzbm1wSW5TZXRSZXF1ZXN0cyIsIDE3LCAwLAorCU5VTEwsICZfc25tcEluR2V0TmV4dHNfb2JqCit9LAorX3NubXBJbkdldFJlc3BvbnNlc19vYmogPSB7CisJInNubXBJbkdldFJlc3BvbnNlcyIsIDE4LCAwLAorCU5VTEwsICZfc25tcEluU2V0UmVxdWVzdHNfb2JqCit9LAorX3NubXBJblRyYXBzX29iaiA9IHsKKwkic25tcEluVHJhcHMiLCAxOSwgMCwKKwlOVUxMLCAmX3NubXBJbkdldFJlc3BvbnNlc19vYmoKK30sCitfc25tcE91dFRvb0JpZ3Nfb2JqID0geworCSJzbm1wT3V0VG9vQmlncyIsIDIwLCAwLAorCU5VTEwsICZfc25tcEluVHJhcHNfb2JqCit9LAorX3NubXBPdXROb1N1Y2hOYW1lc19vYmogPSB7CisJInNubXBPdXROb1N1Y2hOYW1lcyIsIDIxLCAwLAorCU5VTEwsICZfc25tcE91dFRvb0JpZ3Nfb2JqCit9LAorX3NubXBPdXRCYWRWYWx1ZXNfb2JqID0geworCSJzbm1wT3V0QmFkVmFsdWVzIiwgMjIsIDAsCisJTlVMTCwgJl9zbm1wT3V0Tm9TdWNoTmFtZXNfb2JqCit9LAorX3NubXBPdXRSZWFkT25seXNfb2JqID0geworCSJzbm1wT3V0UmVhZE9ubHlzIiwgMjMsIDAsCisJTlVMTCwgJl9zbm1wT3V0QmFkVmFsdWVzX29iagorfSwKK19zbm1wT3V0R2VuRXJyc19vYmogPSB7CisJInNubXBPdXRHZW5FcnJzIiwgMjQsIDAsCisJTlVMTCwgJl9zbm1wT3V0UmVhZE9ubHlzX29iagorfSwKK19zbm1wT3V0R2V0UmVxdWVzdHNfb2JqID0geworCSJzbm1wT3V0R2V0UmVxdWVzdHMiLCAyNSwgMCwKKwlOVUxMLCAmX3NubXBPdXRHZW5FcnJzX29iagorfSwKK19zbm1wT3V0R2V0TmV4dHNfb2JqID0geworCSJzbm1wT3V0R2V0TmV4dHMiLCAyNiwgMCwKKwlOVUxMLCAmX3NubXBPdXRHZXRSZXF1ZXN0c19vYmoKK30sCitfc25tcE91dFNldFJlcXVlc3RzX29iaiA9IHsKKwkic25tcE91dFNldFJlcXVlc3RzIiwgMjcsIDAsCisJTlVMTCwgJl9zbm1wT3V0R2V0TmV4dHNfb2JqCit9LAorX3NubXBPdXRHZXRSZXNwb25zZXNfb2JqID0geworCSJzbm1wT3V0R2V0UmVzcG9uc2VzIiwgMjgsIDAsCisJTlVMTCwgJl9zbm1wT3V0U2V0UmVxdWVzdHNfb2JqCit9LAorX3NubXBPdXRUcmFwc19vYmogPSB7CisJInNubXBPdXRUcmFwcyIsIDI5LCAwLAorCU5VTEwsICZfc25tcE91dEdldFJlc3BvbnNlc19vYmoKK30sCitfc25tcEVuYWJsZUF1dGhUcmFwc19vYmogPSB7CisJInNubXBFbmFibGVBdXRoVHJhcHMiLCAzMCwgMCwKKwlOVUxMLCAmX3NubXBPdXRUcmFwc19vYmoKK30sCitfZWdwTmVpZ2hTdGF0ZV9vYmogPSB7CisJImVncE5laWdoU3RhdGUiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfZWdwTmVpZ2hBZGRyX29iaiA9IHsKKwkiZWdwTmVpZ2hBZGRyIiwgMiwgMCwKKwlOVUxMLCAmX2VncE5laWdoU3RhdGVfb2JqCit9LAorX2VncE5laWdoQXNfb2JqID0geworCSJlZ3BOZWlnaEFzIiwgMywgMCwKKwlOVUxMLCAmX2VncE5laWdoQWRkcl9vYmoKK30sCitfZWdwTmVpZ2hJbk1zZ3Nfb2JqID0geworCSJlZ3BOZWlnaEluTXNncyIsIDQsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaEFzX29iagorfSwKK19lZ3BOZWlnaEluRXJyc19vYmogPSB7CisJImVncE5laWdoSW5FcnJzIiwgNSwgMCwKKwlOVUxMLCAmX2VncE5laWdoSW5Nc2dzX29iagorfSwKK19lZ3BOZWlnaE91dE1zZ3Nfb2JqID0geworCSJlZ3BOZWlnaE91dE1zZ3MiLCA2LCAwLAorCU5VTEwsICZfZWdwTmVpZ2hJbkVycnNfb2JqCit9LAorX2VncE5laWdoT3V0RXJyc19vYmogPSB7CisJImVncE5laWdoT3V0RXJycyIsIDcsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaE91dE1zZ3Nfb2JqCit9LAorX2VncE5laWdoSW5FcnJNc2dzX29iaiA9IHsKKwkiZWdwTmVpZ2hJbkVyck1zZ3MiLCA4LCAwLAorCU5VTEwsICZfZWdwTmVpZ2hPdXRFcnJzX29iagorfSwKK19lZ3BOZWlnaE91dEVyck1zZ3Nfb2JqID0geworCSJlZ3BOZWlnaE91dEVyck1zZ3MiLCA5LCAwLAorCU5VTEwsICZfZWdwTmVpZ2hJbkVyck1zZ3Nfb2JqCit9LAorX2VncE5laWdoU3RhdGVVcHNfb2JqID0geworCSJlZ3BOZWlnaFN0YXRlVXBzIiwgMTAsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaE91dEVyck1zZ3Nfb2JqCit9LAorX2VncE5laWdoU3RhdGVEb3duc19vYmogPSB7CisJImVncE5laWdoU3RhdGVEb3ducyIsIDExLCAwLAorCU5VTEwsICZfZWdwTmVpZ2hTdGF0ZVVwc19vYmoKK30sCitfZWdwTmVpZ2hJbnRlcnZhbEhlbGxvX29iaiA9IHsKKwkiZWdwTmVpZ2hJbnRlcnZhbEhlbGxvIiwgMTIsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaFN0YXRlRG93bnNfb2JqCit9LAorX2VncE5laWdoSW50ZXJ2YWxQb2xsX29iaiA9IHsKKwkiZWdwTmVpZ2hJbnRlcnZhbFBvbGwiLCAxMywgMCwKKwlOVUxMLCAmX2VncE5laWdoSW50ZXJ2YWxIZWxsb19vYmoKK30sCitfZWdwTmVpZ2hNb2RlX29iaiA9IHsKKwkiZWdwTmVpZ2hNb2RlIiwgMTQsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaEludGVydmFsUG9sbF9vYmoKK30sCitfZWdwTmVpZ2hFdmVudFRyaWdnZXJfb2JqID0geworCSJlZ3BOZWlnaEV2ZW50VHJpZ2dlciIsIDE1LCAwLAorCU5VTEwsICZfZWdwTmVpZ2hNb2RlX29iagorfSwKK19lZ3BOZWlnaEVudHJ5X29iaiA9IHsKKwkiZWdwTmVpZ2hFbnRyeSIsIDEsIDAsCisJJl9lZ3BOZWlnaEV2ZW50VHJpZ2dlcl9vYmosIE5VTEwKK30sCitfZWdwSW5Nc2dzX29iaiA9IHsKKwkiZWdwSW5Nc2dzIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX2VncEluRXJyb3JzX29iaiA9IHsKKwkiZWdwSW5FcnJvcnMiLCAyLCAwLAorCU5VTEwsICZfZWdwSW5Nc2dzX29iagorfSwKK19lZ3BPdXRNc2dzX29iaiA9IHsKKwkiZWdwT3V0TXNncyIsIDMsIDAsCisJTlVMTCwgJl9lZ3BJbkVycm9yc19vYmoKK30sCitfZWdwT3V0RXJyb3JzX29iaiA9IHsKKwkiZWdwT3V0RXJyb3JzIiwgNCwgMCwKKwlOVUxMLCAmX2VncE91dE1zZ3Nfb2JqCit9LAorX2VncE5laWdoVGFibGVfb2JqID0geworCSJlZ3BOZWlnaFRhYmxlIiwgNSwgMCwKKwkmX2VncE5laWdoRW50cnlfb2JqLCAmX2VncE91dEVycm9yc19vYmoKK30sCitfZWdwQXNfb2JqID0geworCSJlZ3BBcyIsIDYsIDAsCisJTlVMTCwgJl9lZ3BOZWlnaFRhYmxlX29iagorfSwKK191ZHBMb2NhbEFkZHJlc3Nfb2JqID0geworCSJ1ZHBMb2NhbEFkZHJlc3MiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfdWRwTG9jYWxQb3J0X29iaiA9IHsKKwkidWRwTG9jYWxQb3J0IiwgMiwgMCwKKwlOVUxMLCAmX3VkcExvY2FsQWRkcmVzc19vYmoKK30sCitfdWRwRW50cnlfb2JqID0geworCSJ1ZHBFbnRyeSIsIDEsIDAsCisJJl91ZHBMb2NhbFBvcnRfb2JqLCBOVUxMCit9LAorX3VkcEluRGF0YWdyYW1zX29iaiA9IHsKKwkidWRwSW5EYXRhZ3JhbXMiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfdWRwTm9Qb3J0c19vYmogPSB7CisJInVkcE5vUG9ydHMiLCAyLCAwLAorCU5VTEwsICZfdWRwSW5EYXRhZ3JhbXNfb2JqCit9LAorX3VkcEluRXJyb3JzX29iaiA9IHsKKwkidWRwSW5FcnJvcnMiLCAzLCAwLAorCU5VTEwsICZfdWRwTm9Qb3J0c19vYmoKK30sCitfdWRwT3V0RGF0YWdyYW1zX29iaiA9IHsKKwkidWRwT3V0RGF0YWdyYW1zIiwgNCwgMCwKKwlOVUxMLCAmX3VkcEluRXJyb3JzX29iagorfSwKK191ZHBUYWJsZV9vYmogPSB7CisJInVkcFRhYmxlIiwgNSwgMCwKKwkmX3VkcEVudHJ5X29iaiwgJl91ZHBPdXREYXRhZ3JhbXNfb2JqCit9LAorX3RjcENvbm5TdGF0ZV9vYmogPSB7CisJInRjcENvbm5TdGF0ZSIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK190Y3BDb25uTG9jYWxBZGRyZXNzX29iaiA9IHsKKwkidGNwQ29ubkxvY2FsQWRkcmVzcyIsIDIsIDAsCisJTlVMTCwgJl90Y3BDb25uU3RhdGVfb2JqCit9LAorX3RjcENvbm5Mb2NhbFBvcnRfb2JqID0geworCSJ0Y3BDb25uTG9jYWxQb3J0IiwgMywgMCwKKwlOVUxMLCAmX3RjcENvbm5Mb2NhbEFkZHJlc3Nfb2JqCit9LAorX3RjcENvbm5SZW1BZGRyZXNzX29iaiA9IHsKKwkidGNwQ29ublJlbUFkZHJlc3MiLCA0LCAwLAorCU5VTEwsICZfdGNwQ29ubkxvY2FsUG9ydF9vYmoKK30sCitfdGNwQ29ublJlbVBvcnRfb2JqID0geworCSJ0Y3BDb25uUmVtUG9ydCIsIDUsIDAsCisJTlVMTCwgJl90Y3BDb25uUmVtQWRkcmVzc19vYmoKK30sCitfdGNwQ29ubkVudHJ5X29iaiA9IHsKKwkidGNwQ29ubkVudHJ5IiwgMSwgMCwKKwkmX3RjcENvbm5SZW1Qb3J0X29iaiwgTlVMTAorfSwKK190Y3BSdG9BbGdvcml0aG1fb2JqID0geworCSJ0Y3BSdG9BbGdvcml0aG0iLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfdGNwUnRvTWluX29iaiA9IHsKKwkidGNwUnRvTWluIiwgMiwgMCwKKwlOVUxMLCAmX3RjcFJ0b0FsZ29yaXRobV9vYmoKK30sCitfdGNwUnRvTWF4X29iaiA9IHsKKwkidGNwUnRvTWF4IiwgMywgMCwKKwlOVUxMLCAmX3RjcFJ0b01pbl9vYmoKK30sCitfdGNwTWF4Q29ubl9vYmogPSB7CisJInRjcE1heENvbm4iLCA0LCAwLAorCU5VTEwsICZfdGNwUnRvTWF4X29iagorfSwKK190Y3BBY3RpdmVPcGVuc19vYmogPSB7CisJInRjcEFjdGl2ZU9wZW5zIiwgNSwgMCwKKwlOVUxMLCAmX3RjcE1heENvbm5fb2JqCit9LAorX3RjcFBhc3NpdmVPcGVuc19vYmogPSB7CisJInRjcFBhc3NpdmVPcGVucyIsIDYsIDAsCisJTlVMTCwgJl90Y3BBY3RpdmVPcGVuc19vYmoKK30sCitfdGNwQXR0ZW1wdEZhaWxzX29iaiA9IHsKKwkidGNwQXR0ZW1wdEZhaWxzIiwgNywgMCwKKwlOVUxMLCAmX3RjcFBhc3NpdmVPcGVuc19vYmoKK30sCitfdGNwRXN0YWJSZXNldHNfb2JqID0geworCSJ0Y3BFc3RhYlJlc2V0cyIsIDgsIDAsCisJTlVMTCwgJl90Y3BBdHRlbXB0RmFpbHNfb2JqCit9LAorX3RjcEN1cnJFc3RhYl9vYmogPSB7CisJInRjcEN1cnJFc3RhYiIsIDksIDAsCisJTlVMTCwgJl90Y3BFc3RhYlJlc2V0c19vYmoKK30sCitfdGNwSW5TZWdzX29iaiA9IHsKKwkidGNwSW5TZWdzIiwgMTAsIDAsCisJTlVMTCwgJl90Y3BDdXJyRXN0YWJfb2JqCit9LAorX3RjcE91dFNlZ3Nfb2JqID0geworCSJ0Y3BPdXRTZWdzIiwgMTEsIDAsCisJTlVMTCwgJl90Y3BJblNlZ3Nfb2JqCit9LAorX3RjcFJldHJhbnNTZWdzX29iaiA9IHsKKwkidGNwUmV0cmFuc1NlZ3MiLCAxMiwgMCwKKwlOVUxMLCAmX3RjcE91dFNlZ3Nfb2JqCit9LAorX3RjcENvbm5UYWJsZV9vYmogPSB7CisJInRjcENvbm5UYWJsZSIsIDEzLCAwLAorCSZfdGNwQ29ubkVudHJ5X29iaiwgJl90Y3BSZXRyYW5zU2Vnc19vYmoKK30sCitfdGNwSW5FcnJzX29iaiA9IHsKKwkidGNwSW5FcnJzIiwgMTQsIDAsCisJTlVMTCwgJl90Y3BDb25uVGFibGVfb2JqCit9LAorX3RjcE91dFJzdHNfb2JqID0geworCSJ0Y3BPdXRSc3RzIiwgMTUsIDAsCisJTlVMTCwgJl90Y3BJbkVycnNfb2JqCit9LAorX2ljbXBJbk1zZ3Nfb2JqID0geworCSJpY21wSW5Nc2dzIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX2ljbXBJbkVycm9yc19vYmogPSB7CisJImljbXBJbkVycm9ycyIsIDIsIDAsCisJTlVMTCwgJl9pY21wSW5Nc2dzX29iagorfSwKK19pY21wSW5EZXN0VW5yZWFjaHNfb2JqID0geworCSJpY21wSW5EZXN0VW5yZWFjaHMiLCAzLCAwLAorCU5VTEwsICZfaWNtcEluRXJyb3JzX29iagorfSwKK19pY21wSW5UaW1lRXhjZHNfb2JqID0geworCSJpY21wSW5UaW1lRXhjZHMiLCA0LCAwLAorCU5VTEwsICZfaWNtcEluRGVzdFVucmVhY2hzX29iagorfSwKK19pY21wSW5QYXJtUHJvYnNfb2JqID0geworCSJpY21wSW5QYXJtUHJvYnMiLCA1LCAwLAorCU5VTEwsICZfaWNtcEluVGltZUV4Y2RzX29iagorfSwKK19pY21wSW5TcmNRdWVuY2hzX29iaiA9IHsKKwkiaWNtcEluU3JjUXVlbmNocyIsIDYsIDAsCisJTlVMTCwgJl9pY21wSW5QYXJtUHJvYnNfb2JqCit9LAorX2ljbXBJblJlZGlyZWN0c19vYmogPSB7CisJImljbXBJblJlZGlyZWN0cyIsIDcsIDAsCisJTlVMTCwgJl9pY21wSW5TcmNRdWVuY2hzX29iagorfSwKK19pY21wSW5FY2hvc19vYmogPSB7CisJImljbXBJbkVjaG9zIiwgOCwgMCwKKwlOVUxMLCAmX2ljbXBJblJlZGlyZWN0c19vYmoKK30sCitfaWNtcEluRWNob1JlcHNfb2JqID0geworCSJpY21wSW5FY2hvUmVwcyIsIDksIDAsCisJTlVMTCwgJl9pY21wSW5FY2hvc19vYmoKK30sCitfaWNtcEluVGltZXN0YW1wc19vYmogPSB7CisJImljbXBJblRpbWVzdGFtcHMiLCAxMCwgMCwKKwlOVUxMLCAmX2ljbXBJbkVjaG9SZXBzX29iagorfSwKK19pY21wSW5UaW1lc3RhbXBSZXBzX29iaiA9IHsKKwkiaWNtcEluVGltZXN0YW1wUmVwcyIsIDExLCAwLAorCU5VTEwsICZfaWNtcEluVGltZXN0YW1wc19vYmoKK30sCitfaWNtcEluQWRkck1hc2tzX29iaiA9IHsKKwkiaWNtcEluQWRkck1hc2tzIiwgMTIsIDAsCisJTlVMTCwgJl9pY21wSW5UaW1lc3RhbXBSZXBzX29iagorfSwKK19pY21wSW5BZGRyTWFza1JlcHNfb2JqID0geworCSJpY21wSW5BZGRyTWFza1JlcHMiLCAxMywgMCwKKwlOVUxMLCAmX2ljbXBJbkFkZHJNYXNrc19vYmoKK30sCitfaWNtcE91dE1zZ3Nfb2JqID0geworCSJpY21wT3V0TXNncyIsIDE0LCAwLAorCU5VTEwsICZfaWNtcEluQWRkck1hc2tSZXBzX29iagorfSwKK19pY21wT3V0RXJyb3JzX29iaiA9IHsKKwkiaWNtcE91dEVycm9ycyIsIDE1LCAwLAorCU5VTEwsICZfaWNtcE91dE1zZ3Nfb2JqCit9LAorX2ljbXBPdXREZXN0VW5yZWFjaHNfb2JqID0geworCSJpY21wT3V0RGVzdFVucmVhY2hzIiwgMTYsIDAsCisJTlVMTCwgJl9pY21wT3V0RXJyb3JzX29iagorfSwKK19pY21wT3V0VGltZUV4Y2RzX29iaiA9IHsKKwkiaWNtcE91dFRpbWVFeGNkcyIsIDE3LCAwLAorCU5VTEwsICZfaWNtcE91dERlc3RVbnJlYWNoc19vYmoKK30sCitfaWNtcE91dFBhcm1Qcm9ic19vYmogPSB7CisJImljbXBPdXRQYXJtUHJvYnMiLCAxOCwgMCwKKwlOVUxMLCAmX2ljbXBPdXRUaW1lRXhjZHNfb2JqCit9LAorX2ljbXBPdXRTcmNRdWVuY2hzX29iaiA9IHsKKwkiaWNtcE91dFNyY1F1ZW5jaHMiLCAxOSwgMCwKKwlOVUxMLCAmX2ljbXBPdXRQYXJtUHJvYnNfb2JqCit9LAorX2ljbXBPdXRSZWRpcmVjdHNfb2JqID0geworCSJpY21wT3V0UmVkaXJlY3RzIiwgMjAsIDAsCisJTlVMTCwgJl9pY21wT3V0U3JjUXVlbmNoc19vYmoKK30sCitfaWNtcE91dEVjaG9zX29iaiA9IHsKKwkiaWNtcE91dEVjaG9zIiwgMjEsIDAsCisJTlVMTCwgJl9pY21wT3V0UmVkaXJlY3RzX29iagorfSwKK19pY21wT3V0RWNob1JlcHNfb2JqID0geworCSJpY21wT3V0RWNob1JlcHMiLCAyMiwgMCwKKwlOVUxMLCAmX2ljbXBPdXRFY2hvc19vYmoKK30sCitfaWNtcE91dFRpbWVzdGFtcHNfb2JqID0geworCSJpY21wT3V0VGltZXN0YW1wcyIsIDIzLCAwLAorCU5VTEwsICZfaWNtcE91dEVjaG9SZXBzX29iagorfSwKK19pY21wT3V0VGltZXN0YW1wUmVwc19vYmogPSB7CisJImljbXBPdXRUaW1lc3RhbXBSZXBzIiwgMjQsIDAsCisJTlVMTCwgJl9pY21wT3V0VGltZXN0YW1wc19vYmoKK30sCitfaWNtcE91dEFkZHJNYXNrc19vYmogPSB7CisJImljbXBPdXRBZGRyTWFza3MiLCAyNSwgMCwKKwlOVUxMLCAmX2ljbXBPdXRUaW1lc3RhbXBSZXBzX29iagorfSwKK19pY21wT3V0QWRkck1hc2tSZXBzX29iaiA9IHsKKwkiaWNtcE91dEFkZHJNYXNrUmVwcyIsIDI2LCAwLAorCU5VTEwsICZfaWNtcE91dEFkZHJNYXNrc19vYmoKK30sCitfaXBOZXRUb01lZGlhSWZJbmRleF9vYmogPSB7CisJImlwTmV0VG9NZWRpYUlmSW5kZXgiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfaXBOZXRUb01lZGlhUGh5c0FkZHJlc3Nfb2JqID0geworCSJpcE5ldFRvTWVkaWFQaHlzQWRkcmVzcyIsIDIsIDAsCisJTlVMTCwgJl9pcE5ldFRvTWVkaWFJZkluZGV4X29iagorfSwKK19pcE5ldFRvTWVkaWFOZXRBZGRyZXNzX29iaiA9IHsKKwkiaXBOZXRUb01lZGlhTmV0QWRkcmVzcyIsIDMsIDAsCisJTlVMTCwgJl9pcE5ldFRvTWVkaWFQaHlzQWRkcmVzc19vYmoKK30sCitfaXBOZXRUb01lZGlhVHlwZV9vYmogPSB7CisJImlwTmV0VG9NZWRpYVR5cGUiLCA0LCAwLAorCU5VTEwsICZfaXBOZXRUb01lZGlhTmV0QWRkcmVzc19vYmoKK30sCitfaXBOZXRUb01lZGlhRW50cnlfb2JqID0geworCSJpcE5ldFRvTWVkaWFFbnRyeSIsIDEsIDAsCisJJl9pcE5ldFRvTWVkaWFUeXBlX29iaiwgTlVMTAorfSwKK19pcFJvdXRlRGVzdF9vYmogPSB7CisJImlwUm91dGVEZXN0IiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX2lwUm91dGVJZkluZGV4X29iaiA9IHsKKwkiaXBSb3V0ZUlmSW5kZXgiLCAyLCAwLAorCU5VTEwsICZfaXBSb3V0ZURlc3Rfb2JqCit9LAorX2lwUm91dGVNZXRyaWMxX29iaiA9IHsKKwkiaXBSb3V0ZU1ldHJpYzEiLCAzLCAwLAorCU5VTEwsICZfaXBSb3V0ZUlmSW5kZXhfb2JqCit9LAorX2lwUm91dGVNZXRyaWMyX29iaiA9IHsKKwkiaXBSb3V0ZU1ldHJpYzIiLCA0LCAwLAorCU5VTEwsICZfaXBSb3V0ZU1ldHJpYzFfb2JqCit9LAorX2lwUm91dGVNZXRyaWMzX29iaiA9IHsKKwkiaXBSb3V0ZU1ldHJpYzMiLCA1LCAwLAorCU5VTEwsICZfaXBSb3V0ZU1ldHJpYzJfb2JqCit9LAorX2lwUm91dGVNZXRyaWM0X29iaiA9IHsKKwkiaXBSb3V0ZU1ldHJpYzQiLCA2LCAwLAorCU5VTEwsICZfaXBSb3V0ZU1ldHJpYzNfb2JqCit9LAorX2lwUm91dGVOZXh0SG9wX29iaiA9IHsKKwkiaXBSb3V0ZU5leHRIb3AiLCA3LCAwLAorCU5VTEwsICZfaXBSb3V0ZU1ldHJpYzRfb2JqCit9LAorX2lwUm91dGVUeXBlX29iaiA9IHsKKwkiaXBSb3V0ZVR5cGUiLCA4LCAwLAorCU5VTEwsICZfaXBSb3V0ZU5leHRIb3Bfb2JqCit9LAorX2lwUm91dGVQcm90b19vYmogPSB7CisJImlwUm91dGVQcm90byIsIDksIDAsCisJTlVMTCwgJl9pcFJvdXRlVHlwZV9vYmoKK30sCitfaXBSb3V0ZUFnZV9vYmogPSB7CisJImlwUm91dGVBZ2UiLCAxMCwgMCwKKwlOVUxMLCAmX2lwUm91dGVQcm90b19vYmoKK30sCitfaXBSb3V0ZU1hc2tfb2JqID0geworCSJpcFJvdXRlTWFzayIsIDExLCAwLAorCU5VTEwsICZfaXBSb3V0ZUFnZV9vYmoKK30sCitfaXBSb3V0ZUVudHJ5X29iaiA9IHsKKwkiaXBSb3V0ZUVudHJ5IiwgMSwgMCwKKwkmX2lwUm91dGVNYXNrX29iaiwgTlVMTAorfSwKK19pcEFkRW50QWRkcl9vYmogPSB7CisJImlwQWRFbnRBZGRyIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX2lwQWRFbnRJZkluZGV4X29iaiA9IHsKKwkiaXBBZEVudElmSW5kZXgiLCAyLCAwLAorCU5VTEwsICZfaXBBZEVudEFkZHJfb2JqCit9LAorX2lwQWRFbnROZXRNYXNrX29iaiA9IHsKKwkiaXBBZEVudE5ldE1hc2siLCAzLCAwLAorCU5VTEwsICZfaXBBZEVudElmSW5kZXhfb2JqCit9LAorX2lwQWRFbnRCY2FzdEFkZHJfb2JqID0geworCSJpcEFkRW50QmNhc3RBZGRyIiwgNCwgMCwKKwlOVUxMLCAmX2lwQWRFbnROZXRNYXNrX29iagorfSwKK19pcEFkRW50UmVhc21NYXhTaXplX29iaiA9IHsKKwkiaXBBZEVudFJlYXNtTWF4U2l6ZSIsIDUsIDAsCisJTlVMTCwgJl9pcEFkRW50QmNhc3RBZGRyX29iagorfSwKK19pcEFkZHJFbnRyeV9vYmogPSB7CisJImlwQWRkckVudHJ5IiwgMSwgMCwKKwkmX2lwQWRFbnRSZWFzbU1heFNpemVfb2JqLCBOVUxMCit9LAorX2lwRm9yd2FyZGluZ19vYmogPSB7CisJImlwRm9yd2FyZGluZyIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK19pcERlZmF1bHRUVExfb2JqID0geworCSJpcERlZmF1bHRUVEwiLCAyLCAwLAorCU5VTEwsICZfaXBGb3J3YXJkaW5nX29iagorfSwKK19pcEluUmVjZWl2ZXNfb2JqID0geworCSJpcEluUmVjZWl2ZXMiLCAzLCAwLAorCU5VTEwsICZfaXBEZWZhdWx0VFRMX29iagorfSwKK19pcEluSGRyRXJyb3JzX29iaiA9IHsKKwkiaXBJbkhkckVycm9ycyIsIDQsIDAsCisJTlVMTCwgJl9pcEluUmVjZWl2ZXNfb2JqCit9LAorX2lwSW5BZGRyRXJyb3JzX29iaiA9IHsKKwkiaXBJbkFkZHJFcnJvcnMiLCA1LCAwLAorCU5VTEwsICZfaXBJbkhkckVycm9yc19vYmoKK30sCitfaXBGb3J3RGF0YWdyYW1zX29iaiA9IHsKKwkiaXBGb3J3RGF0YWdyYW1zIiwgNiwgMCwKKwlOVUxMLCAmX2lwSW5BZGRyRXJyb3JzX29iagorfSwKK19pcEluVW5rbm93blByb3Rvc19vYmogPSB7CisJImlwSW5Vbmtub3duUHJvdG9zIiwgNywgMCwKKwlOVUxMLCAmX2lwRm9yd0RhdGFncmFtc19vYmoKK30sCitfaXBJbkRpc2NhcmRzX29iaiA9IHsKKwkiaXBJbkRpc2NhcmRzIiwgOCwgMCwKKwlOVUxMLCAmX2lwSW5Vbmtub3duUHJvdG9zX29iagorfSwKK19pcEluRGVsaXZlcnNfb2JqID0geworCSJpcEluRGVsaXZlcnMiLCA5LCAwLAorCU5VTEwsICZfaXBJbkRpc2NhcmRzX29iagorfSwKK19pcE91dFJlcXVlc3RzX29iaiA9IHsKKwkiaXBPdXRSZXF1ZXN0cyIsIDEwLCAwLAorCU5VTEwsICZfaXBJbkRlbGl2ZXJzX29iagorfSwKK19pcE91dERpc2NhcmRzX29iaiA9IHsKKwkiaXBPdXREaXNjYXJkcyIsIDExLCAwLAorCU5VTEwsICZfaXBPdXRSZXF1ZXN0c19vYmoKK30sCitfaXBPdXROb1JvdXRlc19vYmogPSB7CisJImlwT3V0Tm9Sb3V0ZXMiLCAxMiwgMCwKKwlOVUxMLCAmX2lwT3V0RGlzY2FyZHNfb2JqCit9LAorX2lwUmVhc21UaW1lb3V0X29iaiA9IHsKKwkiaXBSZWFzbVRpbWVvdXQiLCAxMywgMCwKKwlOVUxMLCAmX2lwT3V0Tm9Sb3V0ZXNfb2JqCit9LAorX2lwUmVhc21SZXFkc19vYmogPSB7CisJImlwUmVhc21SZXFkcyIsIDE0LCAwLAorCU5VTEwsICZfaXBSZWFzbVRpbWVvdXRfb2JqCit9LAorX2lwUmVhc21PS3Nfb2JqID0geworCSJpcFJlYXNtT0tzIiwgMTUsIDAsCisJTlVMTCwgJl9pcFJlYXNtUmVxZHNfb2JqCit9LAorX2lwUmVhc21GYWlsc19vYmogPSB7CisJImlwUmVhc21GYWlscyIsIDE2LCAwLAorCU5VTEwsICZfaXBSZWFzbU9Lc19vYmoKK30sCitfaXBGcmFnT0tzX29iaiA9IHsKKwkiaXBGcmFnT0tzIiwgMTcsIDAsCisJTlVMTCwgJl9pcFJlYXNtRmFpbHNfb2JqCit9LAorX2lwRnJhZ0ZhaWxzX29iaiA9IHsKKwkiaXBGcmFnRmFpbHMiLCAxOCwgMCwKKwlOVUxMLCAmX2lwRnJhZ09Lc19vYmoKK30sCitfaXBGcmFnQ3JlYXRlc19vYmogPSB7CisJImlwRnJhZ0NyZWF0ZXMiLCAxOSwgMCwKKwlOVUxMLCAmX2lwRnJhZ0ZhaWxzX29iagorfSwKK19pcEFkZHJUYWJsZV9vYmogPSB7CisJImlwQWRkclRhYmxlIiwgMjAsIDAsCisJJl9pcEFkZHJFbnRyeV9vYmosICZfaXBGcmFnQ3JlYXRlc19vYmoKK30sCitfaXBSb3V0aW5nVGFibGVfb2JqID0geworCSJpcFJvdXRpbmdUYWJsZSIsIDIxLCAwLAorCSZfaXBSb3V0ZUVudHJ5X29iaiwgJl9pcEFkZHJUYWJsZV9vYmoKK30sCitfaXBOZXRUb01lZGlhVGFibGVfb2JqID0geworCSJpcE5ldFRvTWVkaWFUYWJsZSIsIDIyLCAwLAorCSZfaXBOZXRUb01lZGlhRW50cnlfb2JqLCAmX2lwUm91dGluZ1RhYmxlX29iagorfSwKK19hdElmSW5kZXhfb2JqID0geworCSJhdElmSW5kZXgiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfYXRQaHlzQWRkcmVzc19vYmogPSB7CisJImF0UGh5c0FkZHJlc3MiLCAyLCAwLAorCU5VTEwsICZfYXRJZkluZGV4X29iagorfSwKK19hdE5ldEFkZHJlc3Nfb2JqID0geworCSJhdE5ldEFkZHJlc3MiLCAzLCAwLAorCU5VTEwsICZfYXRQaHlzQWRkcmVzc19vYmoKK30sCitfYXRFbnRyeV9vYmogPSB7CisJImF0RW50cnkiLCAxLCAwLAorCSZfYXROZXRBZGRyZXNzX29iaiwgTlVMTAorfSwKK19hdFRhYmxlX29iaiA9IHsKKwkiYXRUYWJsZSIsIDEsIDAsCisJJl9hdEVudHJ5X29iaiwgTlVMTAorfSwKK19pZkluZGV4X29iaiA9IHsKKwkiaWZJbmRleCIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK19pZkRlc2NyX29iaiA9IHsKKwkiaWZEZXNjciIsIDIsIDAsCisJTlVMTCwgJl9pZkluZGV4X29iagorfSwKK19pZlR5cGVfb2JqID0geworCSJpZlR5cGUiLCAzLCAwLAorCU5VTEwsICZfaWZEZXNjcl9vYmoKK30sCitfaWZNdHVfb2JqID0geworCSJpZk10dSIsIDQsIDAsCisJTlVMTCwgJl9pZlR5cGVfb2JqCit9LAorX2lmU3BlZWRfb2JqID0geworCSJpZlNwZWVkIiwgNSwgMCwKKwlOVUxMLCAmX2lmTXR1X29iagorfSwKK19pZlBoeXNBZGRyZXNzX29iaiA9IHsKKwkiaWZQaHlzQWRkcmVzcyIsIDYsIDAsCisJTlVMTCwgJl9pZlNwZWVkX29iagorfSwKK19pZkFkbWluU3RhdHVzX29iaiA9IHsKKwkiaWZBZG1pblN0YXR1cyIsIDcsIDAsCisJTlVMTCwgJl9pZlBoeXNBZGRyZXNzX29iagorfSwKK19pZk9wZXJTdGF0dXNfb2JqID0geworCSJpZk9wZXJTdGF0dXMiLCA4LCAwLAorCU5VTEwsICZfaWZBZG1pblN0YXR1c19vYmoKK30sCitfaWZMYXN0Q2hhbmdlX29iaiA9IHsKKwkiaWZMYXN0Q2hhbmdlIiwgOSwgMCwKKwlOVUxMLCAmX2lmT3BlclN0YXR1c19vYmoKK30sCitfaWZJbk9jdGV0c19vYmogPSB7CisJImlmSW5PY3RldHMiLCAxMCwgMCwKKwlOVUxMLCAmX2lmTGFzdENoYW5nZV9vYmoKK30sCitfaWZJblVjYXN0UGt0c19vYmogPSB7CisJImlmSW5VY2FzdFBrdHMiLCAxMSwgMCwKKwlOVUxMLCAmX2lmSW5PY3RldHNfb2JqCit9LAorX2lmSW5OVWNhc3RQa3RzX29iaiA9IHsKKwkiaWZJbk5VY2FzdFBrdHMiLCAxMiwgMCwKKwlOVUxMLCAmX2lmSW5VY2FzdFBrdHNfb2JqCit9LAorX2lmSW5EaXNjYXJkc19vYmogPSB7CisJImlmSW5EaXNjYXJkcyIsIDEzLCAwLAorCU5VTEwsICZfaWZJbk5VY2FzdFBrdHNfb2JqCit9LAorX2lmSW5FcnJvcnNfb2JqID0geworCSJpZkluRXJyb3JzIiwgMTQsIDAsCisJTlVMTCwgJl9pZkluRGlzY2FyZHNfb2JqCit9LAorX2lmSW5Vbmtub3duUHJvdG9zX29iaiA9IHsKKwkiaWZJblVua25vd25Qcm90b3MiLCAxNSwgMCwKKwlOVUxMLCAmX2lmSW5FcnJvcnNfb2JqCit9LAorX2lmT3V0T2N0ZXRzX29iaiA9IHsKKwkiaWZPdXRPY3RldHMiLCAxNiwgMCwKKwlOVUxMLCAmX2lmSW5Vbmtub3duUHJvdG9zX29iagorfSwKK19pZk91dFVjYXN0UGt0c19vYmogPSB7CisJImlmT3V0VWNhc3RQa3RzIiwgMTcsIDAsCisJTlVMTCwgJl9pZk91dE9jdGV0c19vYmoKK30sCitfaWZPdXROVWNhc3RQa3RzX29iaiA9IHsKKwkiaWZPdXROVWNhc3RQa3RzIiwgMTgsIDAsCisJTlVMTCwgJl9pZk91dFVjYXN0UGt0c19vYmoKK30sCitfaWZPdXREaXNjYXJkc19vYmogPSB7CisJImlmT3V0RGlzY2FyZHMiLCAxOSwgMCwKKwlOVUxMLCAmX2lmT3V0TlVjYXN0UGt0c19vYmoKK30sCitfaWZPdXRFcnJvcnNfb2JqID0geworCSJpZk91dEVycm9ycyIsIDIwLCAwLAorCU5VTEwsICZfaWZPdXREaXNjYXJkc19vYmoKK30sCitfaWZPdXRRTGVuX29iaiA9IHsKKwkiaWZPdXRRTGVuIiwgMjEsIDAsCisJTlVMTCwgJl9pZk91dEVycm9yc19vYmoKK30sCitfaWZTcGVjaWZpY19vYmogPSB7CisJImlmU3BlY2lmaWMiLCAyMiwgMCwKKwlOVUxMLCAmX2lmT3V0UUxlbl9vYmoKK30sCitfaWZFbnRyeV9vYmogPSB7CisJImlmRW50cnkiLCAxLCAwLAorCSZfaWZTcGVjaWZpY19vYmosIE5VTEwKK30sCitfaWZOdW1iZXJfb2JqID0geworCSJpZk51bWJlciIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK19pZlRhYmxlX29iaiA9IHsKKwkiaWZUYWJsZSIsIDIsIDAsCisJJl9pZkVudHJ5X29iaiwgJl9pZk51bWJlcl9vYmoKK30sCitfc3lzRGVzY3Jfb2JqID0geworCSJzeXNEZXNjciIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK19zeXNPYmplY3RJRF9vYmogPSB7CisJInN5c09iamVjdElEIiwgMiwgMCwKKwlOVUxMLCAmX3N5c0Rlc2NyX29iagorfSwKK19zeXNVcFRpbWVfb2JqID0geworCSJzeXNVcFRpbWUiLCAzLCAwLAorCU5VTEwsICZfc3lzT2JqZWN0SURfb2JqCit9LAorX3N5c0NvbnRhY3Rfb2JqID0geworCSJzeXNDb250YWN0IiwgNCwgMCwKKwlOVUxMLCAmX3N5c1VwVGltZV9vYmoKK30sCitfc3lzTmFtZV9vYmogPSB7CisJInN5c05hbWUiLCA1LCAwLAorCU5VTEwsICZfc3lzQ29udGFjdF9vYmoKK30sCitfc3lzTG9jYXRpb25fb2JqID0geworCSJzeXNMb2NhdGlvbiIsIDYsIDAsCisJTlVMTCwgJl9zeXNOYW1lX29iagorfSwKK19zeXNTZXJ2aWNlc19vYmogPSB7CisJInN5c1NlcnZpY2VzIiwgNywgMCwKKwlOVUxMLCAmX3N5c0xvY2F0aW9uX29iagorfSwKK19zeXN0ZW1fb2JqID0geworCSJzeXN0ZW0iLCAxLCAwLAorCSZfc3lzU2VydmljZXNfb2JqLCBOVUxMCit9LAorX2ludGVyZmFjZXNfb2JqID0geworCSJpbnRlcmZhY2VzIiwgMiwgMCwKKwkmX2lmVGFibGVfb2JqLCAmX3N5c3RlbV9vYmoKK30sCitfYXRfb2JqID0geworCSJhdCIsIDMsIDAsCisJJl9hdFRhYmxlX29iaiwgJl9pbnRlcmZhY2VzX29iagorfSwKK19pcF9vYmogPSB7CisJImlwIiwgNCwgMCwKKwkmX2lwTmV0VG9NZWRpYVRhYmxlX29iaiwgJl9hdF9vYmoKK30sCitfaWNtcF9vYmogPSB7CisJImljbXAiLCA1LCAwLAorCSZfaWNtcE91dEFkZHJNYXNrUmVwc19vYmosICZfaXBfb2JqCit9LAorX3RjcF9vYmogPSB7CisJInRjcCIsIDYsIDAsCisJJl90Y3BPdXRSc3RzX29iaiwgJl9pY21wX29iagorfSwKK191ZHBfb2JqID0geworCSJ1ZHAiLCA3LCAwLAorCSZfdWRwVGFibGVfb2JqLCAmX3RjcF9vYmoKK30sCitfZWdwX29iaiA9IHsKKwkiZWdwIiwgOCwgMCwKKwkmX2VncEFzX29iaiwgJl91ZHBfb2JqCit9LAorX3RyYW5zbWlzc2lvbl9vYmogPSB7CisJInRyYW5zbWlzc2lvbiIsIDEwLCAwLAorCU5VTEwsICZfZWdwX29iagorfSwKK19zbm1wX29iaiA9IHsKKwkic25tcCIsIDExLCAwLAorCSZfc25tcEVuYWJsZUF1dGhUcmFwc19vYmosICZfdHJhbnNtaXNzaW9uX29iagorfSwKK191c21NSUJDb21wbGlhbmNlc19vYmogPSB7CisJInVzbU1JQkNvbXBsaWFuY2VzIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX3VzbU1JQkdyb3Vwc19vYmogPSB7CisJInVzbU1JQkdyb3VwcyIsIDIsIDAsCisJTlVMTCwgJl91c21NSUJDb21wbGlhbmNlc19vYmoKK30sCitfdXNtVXNlckVuZ2luZUlEX29iaiA9IHsKKwkidXNtVXNlckVuZ2luZUlEIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX3VzbVVzZXJOYW1lX29iaiA9IHsKKwkidXNtVXNlck5hbWUiLCAyLCAwLAorCU5VTEwsICZfdXNtVXNlckVuZ2luZUlEX29iagorfSwKK191c21Vc2VyU2VjdXJpdHlOYW1lX29iaiA9IHsKKwkidXNtVXNlclNlY3VyaXR5TmFtZSIsIDMsIDAsCisJTlVMTCwgJl91c21Vc2VyTmFtZV9vYmoKK30sCitfdXNtVXNlckNsb25lRnJvbV9vYmogPSB7CisJInVzbVVzZXJDbG9uZUZyb20iLCA0LCAwLAorCU5VTEwsICZfdXNtVXNlclNlY3VyaXR5TmFtZV9vYmoKK30sCitfdXNtVXNlckF1dGhQcm90b2NvbF9vYmogPSB7CisJInVzbVVzZXJBdXRoUHJvdG9jb2wiLCA1LCAwLAorCU5VTEwsICZfdXNtVXNlckNsb25lRnJvbV9vYmoKK30sCitfdXNtVXNlckF1dGhLZXlDaGFuZ2Vfb2JqID0geworCSJ1c21Vc2VyQXV0aEtleUNoYW5nZSIsIDYsIDAsCisJTlVMTCwgJl91c21Vc2VyQXV0aFByb3RvY29sX29iagorfSwKK191c21Vc2VyT3duQXV0aEtleUNoYW5nZV9vYmogPSB7CisJInVzbVVzZXJPd25BdXRoS2V5Q2hhbmdlIiwgNywgMCwKKwlOVUxMLCAmX3VzbVVzZXJBdXRoS2V5Q2hhbmdlX29iagorfSwKK191c21Vc2VyUHJpdlByb3RvY29sX29iaiA9IHsKKwkidXNtVXNlclByaXZQcm90b2NvbCIsIDgsIDAsCisJTlVMTCwgJl91c21Vc2VyT3duQXV0aEtleUNoYW5nZV9vYmoKK30sCitfdXNtVXNlclByaXZLZXlDaGFuZ2Vfb2JqID0geworCSJ1c21Vc2VyUHJpdktleUNoYW5nZSIsIDksIDAsCisJTlVMTCwgJl91c21Vc2VyUHJpdlByb3RvY29sX29iagorfSwKK191c21Vc2VyT3duUHJpdktleUNoYW5nZV9vYmogPSB7CisJInVzbVVzZXJPd25Qcml2S2V5Q2hhbmdlIiwgMTAsIDAsCisJTlVMTCwgJl91c21Vc2VyUHJpdktleUNoYW5nZV9vYmoKK30sCitfdXNtVXNlclB1YmxpY19vYmogPSB7CisJInVzbVVzZXJQdWJsaWMiLCAxMSwgMCwKKwlOVUxMLCAmX3VzbVVzZXJPd25Qcml2S2V5Q2hhbmdlX29iagorfSwKK191c21Vc2VyU3RvcmFnZVR5cGVfb2JqID0geworCSJ1c21Vc2VyU3RvcmFnZVR5cGUiLCAxMiwgMCwKKwlOVUxMLCAmX3VzbVVzZXJQdWJsaWNfb2JqCit9LAorX3VzbVVzZXJTdGF0dXNfb2JqID0geworCSJ1c21Vc2VyU3RhdHVzIiwgMTMsIDAsCisJTlVMTCwgJl91c21Vc2VyU3RvcmFnZVR5cGVfb2JqCit9LAorX3VzbVVzZXJFbnRyeV9vYmogPSB7CisJInVzbVVzZXJFbnRyeSIsIDEsIDAsCisJJl91c21Vc2VyU3RhdHVzX29iaiwgTlVMTAorfSwKK191c21Vc2VyU3BpbkxvY2tfb2JqID0geworCSJ1c21Vc2VyU3BpbkxvY2siLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfdXNtVXNlclRhYmxlX29iaiA9IHsKKwkidXNtVXNlclRhYmxlIiwgMiwgMCwKKwkmX3VzbVVzZXJFbnRyeV9vYmosICZfdXNtVXNlclNwaW5Mb2NrX29iagorfSwKK191c21TdGF0c1Vuc3VwcG9ydGVkU2VjTGV2ZWxzX29iaiA9IHsKKwkidXNtU3RhdHNVbnN1cHBvcnRlZFNlY0xldmVscyIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK191c21TdGF0c05vdEluVGltZVdpbmRvd3Nfb2JqID0geworCSJ1c21TdGF0c05vdEluVGltZVdpbmRvd3MiLCAyLCAwLAorCU5VTEwsICZfdXNtU3RhdHNVbnN1cHBvcnRlZFNlY0xldmVsc19vYmoKK30sCitfdXNtU3RhdHNVbmtub3duVXNlck5hbWVzX29iaiA9IHsKKwkidXNtU3RhdHNVbmtub3duVXNlck5hbWVzIiwgMywgMCwKKwlOVUxMLCAmX3VzbVN0YXRzTm90SW5UaW1lV2luZG93c19vYmoKK30sCitfdXNtU3RhdHNVbmtub3duRW5naW5lSURzX29iaiA9IHsKKwkidXNtU3RhdHNVbmtub3duRW5naW5lSURzIiwgNCwgMCwKKwlOVUxMLCAmX3VzbVN0YXRzVW5rbm93blVzZXJOYW1lc19vYmoKK30sCitfdXNtU3RhdHNXcm9uZ0RpZ2VzdHNfb2JqID0geworCSJ1c21TdGF0c1dyb25nRGlnZXN0cyIsIDUsIDAsCisJTlVMTCwgJl91c21TdGF0c1Vua25vd25FbmdpbmVJRHNfb2JqCit9LAorX3VzbVN0YXRzRGVjcnlwdGlvbkVycm9yc19vYmogPSB7CisJInVzbVN0YXRzRGVjcnlwdGlvbkVycm9ycyIsIDYsIDAsCisJTlVMTCwgJl91c21TdGF0c1dyb25nRGlnZXN0c19vYmoKK30sCitfdXNtU3RhdHNfb2JqID0geworCSJ1c21TdGF0cyIsIDEsIDAsCisJJl91c21TdGF0c0RlY3J5cHRpb25FcnJvcnNfb2JqLCBOVUxMCit9LAorX3VzbVVzZXJfb2JqID0geworCSJ1c21Vc2VyIiwgMiwgMCwKKwkmX3VzbVVzZXJUYWJsZV9vYmosICZfdXNtU3RhdHNfb2JqCit9LAorX3VzbU1JQk9iamVjdHNfb2JqID0geworCSJ1c21NSUJPYmplY3RzIiwgMSwgMCwKKwkmX3VzbVVzZXJfb2JqLCBOVUxMCit9LAorX3VzbU1JQkNvbmZvcm1hbmNlX29iaiA9IHsKKwkidXNtTUlCQ29uZm9ybWFuY2UiLCAyLCAwLAorCSZfdXNtTUlCR3JvdXBzX29iaiwgJl91c21NSUJPYmplY3RzX29iagorfSwKK19zbm1wTVBETUlCQ29tcGxpYW5jZXNfb2JqID0geworCSJzbm1wTVBETUlCQ29tcGxpYW5jZXMiLCAxLCAwLAorCU5VTEwsIE5VTEwKK30sCitfc25tcE1QRE1JQkdyb3Vwc19vYmogPSB7CisJInNubXBNUERNSUJHcm91cHMiLCAyLCAwLAorCU5VTEwsICZfc25tcE1QRE1JQkNvbXBsaWFuY2VzX29iagorfSwKK19zbm1wVW5rbm93blNlY3VyaXR5TW9kZWxzX29iaiA9IHsKKwkic25tcFVua25vd25TZWN1cml0eU1vZGVscyIsIDEsIDAsCisJTlVMTCwgTlVMTAorfSwKK19zbm1wSW52YWxpZE1zZ3Nfb2JqID0geworCSJzbm1wSW52YWxpZE1zZ3MiLCAyLCAwLAorCU5VTEwsICZfc25tcFVua25vd25TZWN1cml0eU1vZGVsc19vYmoKK30sCitfc25tcFVua25vd25QRFVIYW5kbGVyc19vYmogPSB7CisJInNubXBVbmtub3duUERVSGFuZGxlcnMiLCAzLCAwLAorCU5VTEwsICZfc25tcEludmFsaWRNc2dzX29iagorfSwKK19zbm1wTVBEU3RhdHNfb2JqID0geworCSJzbm1wTVBEU3RhdHMiLCAxLCAwLAorCSZfc25tcFVua25vd25QRFVIYW5kbGVyc19vYmosIE5VTEwKK30sCitfc25tcE1QREFkbWluX29iaiA9IHsKKwkic25tcE1QREFkbWluIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX3NubXBNUERNSUJPYmplY3RzX29iaiA9IHsKKwkic25tcE1QRE1JQk9iamVjdHMiLCAyLCAwLAorCSZfc25tcE1QRFN0YXRzX29iaiwgJl9zbm1wTVBEQWRtaW5fb2JqCit9LAorX3NubXBNUERNSUJDb25mb3JtYW5jZV9vYmogPSB7CisJInNubXBNUERNSUJDb25mb3JtYW5jZSIsIDMsIDAsCisJJl9zbm1wTVBETUlCR3JvdXBzX29iaiwgJl9zbm1wTVBETUlCT2JqZWN0c19vYmoKK30sCitfc25tcEVuZ2luZUlEX29iaiA9IHsKKwkic25tcEVuZ2luZUlEIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX3NubXBFbmdpbmVCb290c19vYmogPSB7CisJInNubXBFbmdpbmVCb290cyIsIDIsIDAsCisJTlVMTCwgJl9zbm1wRW5naW5lSURfb2JqCit9LAorX3NubXBFbmdpbmVUaW1lX29iaiA9IHsKKwkic25tcEVuZ2luZVRpbWUiLCAzLCAwLAorCU5VTEwsICZfc25tcEVuZ2luZUJvb3RzX29iagorfSwKK19zbm1wRW5naW5lTWF4TWVzc2FnZVNpemVfb2JqID0geworCSJzbm1wRW5naW5lTWF4TWVzc2FnZVNpemUiLCA0LCAwLAorCU5VTEwsICZfc25tcEVuZ2luZVRpbWVfb2JqCit9LAorX3NubXBFbmdpbmVfb2JqID0geworCSJzbm1wRW5naW5lIiwgMSwgMCwKKwkmX3NubXBFbmdpbmVNYXhNZXNzYWdlU2l6ZV9vYmosIE5VTEwKK30sCitfc25tcEZyYW1ld29ya0FkbWluX29iaiA9IHsKKwkic25tcEZyYW1ld29ya0FkbWluIiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX3NubXBGcmFtZXdvcmtNSUJPYmplY3RzX29iaiA9IHsKKwkic25tcEZyYW1ld29ya01JQk9iamVjdHMiLCAyLCAwLAorCSZfc25tcEVuZ2luZV9vYmosICZfc25tcEZyYW1ld29ya0FkbWluX29iagorfSwKK19zbm1wRnJhbWV3b3JrTUlCQ29uZm9ybWFuY2Vfb2JqID0geworCSJzbm1wRnJhbWV3b3JrTUlCQ29uZm9ybWFuY2UiLCAzLCAwLAorCU5VTEwsICZfc25tcEZyYW1ld29ya01JQk9iamVjdHNfb2JqCit9LAorX3NubXBGcmFtZXdvcmtNSUJfb2JqID0geworCSJzbm1wRnJhbWV3b3JrTUlCIiwgMTAsIDAsCisJJl9zbm1wRnJhbWV3b3JrTUlCQ29uZm9ybWFuY2Vfb2JqLCBOVUxMCit9LAorX3NubXBNUERNSUJfb2JqID0geworCSJzbm1wTVBETUlCIiwgMTEsIDAsCisJJl9zbm1wTVBETUlCQ29uZm9ybWFuY2Vfb2JqLCAmX3NubXBGcmFtZXdvcmtNSUJfb2JqCit9LAorX3NubXBVc21NSUJfb2JqID0geworCSJzbm1wVXNtTUlCIiwgMTUsIDAsCisJJl91c21NSUJDb25mb3JtYW5jZV9vYmosICZfc25tcE1QRE1JQl9vYmoKK30sCitfc25tcE1vZHVsZXNfb2JqID0geworCSJzbm1wTW9kdWxlcyIsIDMsIDAsCisJJl9zbm1wVXNtTUlCX29iaiwgTlVMTAorfSwKK19taWJfb2JqID0geworCSJtaWIiLCAxLCAwLAorCSZfc25tcF9vYmosIE5VTEwKK30sCitfZGlyZWN0b3J5X29iaiA9IHsKKwkiZGlyZWN0b3J5IiwgMSwgMCwKKwlOVUxMLCBOVUxMCit9LAorX21nbXRfb2JqID0geworCSJtZ210IiwgMiwgMCwKKwkmX21pYl9vYmosICZfZGlyZWN0b3J5X29iagorfSwKK19leHBlcmltZW50YWxfb2JqID0geworCSJleHBlcmltZW50YWwiLCAzLCAwLAorCU5VTEwsICZfbWdtdF9vYmoKK30sCitfcHJpdmF0ZV9vYmogPSB7CisJInByaXZhdGUiLCA0LCAwLAorCSZfZW50ZXJwcmlzZXNfb2JqLCAmX2V4cGVyaW1lbnRhbF9vYmoKK30sCitfc2VjdXJpdHlfb2JqID0geworCSJzZWN1cml0eSIsIDUsIDAsCisJTlVMTCwgJl9wcml2YXRlX29iagorfSwKK19zbm1wVjJfb2JqID0geworCSJzbm1wVjIiLCA2LCAwLAorCSZfc25tcE1vZHVsZXNfb2JqLCAmX3NlY3VyaXR5X29iagorfSwKK19pbnRlcm5ldF9vYmogPSB7CisJImludGVybmV0IiwgMSwgMCwKKwkmX3NubXBWMl9vYmosIE5VTEwKK30sCitfZG9kX29iaiA9IHsKKwkiZG9kIiwgNiwgMCwKKwkmX2ludGVybmV0X29iaiwgTlVMTAorfSwKK19vcmdfb2JqID0geworCSJvcmciLCAzLCAwLAorCSZfZG9kX29iaiwgTlVMTAorfSwKK19pc29fb2JqID0geworCSJpc28iLCAxLCAwLAorCSZfb3JnX29iaiwgTlVMTAorfSwKKyptaWJyb290ID0gJl9pc29fb2JqOwpkaWZmIC0tZ2l0IGEvbWlzc2luZy9hZGRyaW5mby5oIGIvbWlzc2luZy9hZGRyaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZjZhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL2FkZHJpbmZvLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIGFuZCAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qICRJZDogYWRkcmluZm8uaCx2IDEuNCAyMDAyLzA2LzExIDE3OjEzOjM2IGl0b2p1biBFeHAgJCAqLworCisjaWZuZGVmIEhBVkVfQUREUklORk8KKworLyoKKyAqIEVycm9yIHJldHVybiBjb2RlcyBmcm9tIGdldGFkZHJpbmZvKCkKKyAqLworI2RlZmluZQlFQUlfQUREUkZBTUlMWQkgMQkvKiBhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUlfQUdBSU4JIDIJLyogdGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lCUVBSV9CQURGTEFHUwkgMwkvKiBpbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAqLworI2RlZmluZQlFQUlfRkFJTAkgNAkvKiBub24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJRUFJX0ZBTUlMWQkgNQkvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUlfTUVNT1JZCSA2CS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyNkZWZpbmUJRUFJX05PREFUQQkgNwkvKiBubyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSAqLworI2RlZmluZQlFQUlfTk9OQU1FCSA4CS8qIGhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duICovCisjZGVmaW5lCUVBSV9TRVJWSUNFCSA5CS8qIHNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlICovCisjZGVmaW5lCUVBSV9TT0NLVFlQRQkxMAkvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVBSV9TWVNURU0JMTEJLyogc3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vICovCisjZGVmaW5lIEVBSV9CQURISU5UUwkxMgorI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKKyNkZWZpbmUgRUFJX01BWAkJMTQKKworLyogaW50ZXJuYWwgZXJyb3IgKi8KKyNkZWZpbmUJTkVUREJfSU5URVJOQUwJLTEJLyogc2VlIGVycm5vICovCisKKy8qCisgKiBGbGFnIHZhbHVlcyBmb3IgZ2V0YWRkcmluZm8oKQorICovCisjZGVmaW5lCUFJX1BBU1NJVkUJMHgwMDAwMDAwMSAvKiBnZXQgYWRkcmVzcyB0byB1c2UgYmluZCgpICovCisjZGVmaW5lCUFJX0NBTk9OTkFNRQkweDAwMDAwMDAyIC8qIGZpbGwgYWlfY2Fub25uYW1lICovCisjZGVmaW5lCUFJX05VTUVSSUNIT1NUCTB4MDAwMDAwMDQgLyogcHJldmVudCBuYW1lIHJlc29sdXRpb24gKi8KKy8qIHZhbGlkIGZsYWdzIGZvciBhZGRyaW5mbyAqLworI2RlZmluZQlBSV9NQVNLCQkoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQorCisjZGVmaW5lCUFJX0FMTAkJMHgwMDAwMDEwMCAvKiBJUHY2IGFuZCBJUHY0LW1hcHBlZCAod2l0aCBBSV9WNE1BUFBFRCkgKi8KKyNkZWZpbmUJQUlfVjRNQVBQRURfQ0ZHCTB4MDAwMDAyMDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIGlmIGtlcm5lbCBzdXBwb3J0cyAqLworI2RlZmluZQlBSV9BRERSQ09ORklHCTB4MDAwMDA0MDAgLyogb25seSBpZiBhbnkgYWRkcmVzcyBpcyBhc3NpZ25lZCAqLworI2RlZmluZQlBSV9WNE1BUFBFRAkweDAwMDAwODAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3MgKi8KKy8qIHNwZWNpYWwgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGdldGlwbm9kZWJ5bmFtZSAqLworI2RlZmluZQlBSV9ERUZBVUxUCShBSV9WNE1BUFBFRF9DRkcgfCBBSV9BRERSQ09ORklHKQorCitzdHJ1Y3QgYWRkcmluZm8geworCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCisJaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCisJaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLworCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLworCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLworCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCisJc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLworCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KK307CisKK2V4dGVybiB2b2lkIGZyZWVhZGRyaW5mbyAoc3RydWN0IGFkZHJpbmZvICopOworZXh0ZXJuIHZvaWQgZnJlZWhvc3RlbnQgKHN0cnVjdCBob3N0ZW50ICopOworZXh0ZXJuIGNoYXIgKmdhaV9zdHJlcnJvciAoaW50KTsKK2V4dGVybiBpbnQgZ2V0YWRkcmluZm8gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOworZXh0ZXJuIGludCBnZXRuYW1laW5mbyAoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqLAorCQkJICAgIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIGludCk7CitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGlwbm9kZWJ5YWRkciAoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCwgaW50ICopOworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRpcG5vZGVieW5hbWUgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCAqKTsKK2V4dGVybiBpbnQgaW5ldF9wdG9uIChpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK2V4dGVybiBjb25zdCBjaGFyICppbmV0X250b3AgKGludCwgY29uc3Qgdm9pZCAqLCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYgLyogSEFWRV9BRERSSU5GTyAqLworCisvKgorICogQ29uc3RhbnRzIGZvciBnZXRuYW1laW5mbygpCisgKi8KKyNpZm5kZWYgTklfTUFYSE9TVAorI2RlZmluZQlOSV9NQVhIT1NUCTEwMjUKKyNlbmRpZgorI2lmbmRlZiBOSV9NQVhTRVJWCisjZGVmaW5lCU5JX01BWFNFUlYJMzIKKyNlbmRpZgorCisvKgorICogRmxhZyB2YWx1ZXMgZm9yIGdldG5hbWVpbmZvKCkKKyAqLworI2lmbmRlZiBOSV9OT0ZRRE4KKyNkZWZpbmUJTklfTk9GUUROCTB4MDAwMDAwMDEKKyNlbmRpZgorI2lmbmRlZiBOSV9OVU1FUklDSE9TVAorI2RlZmluZQlOSV9OVU1FUklDSE9TVAkweDAwMDAwMDAyCisjZW5kaWYKKyNpZm5kZWYgTklfTkFNRVJFUUQKKyNkZWZpbmUJTklfTkFNRVJFUUQJMHgwMDAwMDAwNAorI2VuZGlmCisjaWZuZGVmIE5JX05VTUVSSUNTRVJWCisjZGVmaW5lCU5JX05VTUVSSUNTRVJWCTB4MDAwMDAwMDgKKyNlbmRpZgorI2lmbmRlZiBOSV9ER1JBTQorI2RlZmluZQlOSV9ER1JBTQkweDAwMDAwMDEwCisjZW5kaWYKZGlmZiAtLWdpdCBhL21pc3NpbmcvYWRkcnNpemUuaCBiL21pc3NpbmcvYWRkcnNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2RiNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9hZGRyc2l6ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgSU5BRERSU1oKKyNkZWZpbmUgSU5BRERSU1ogNAkJLyogSVB2NCBUX0EgKi8KKyNlbmRpZgorCisjaWZuZGVmIElONkFERFJTWgorI2RlZmluZSBJTjZBRERSU1oJMTYJLyogSVB2NiBUX0FBQUEgKi8KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9taXNzaW5nL2JpdHR5cGVzLmggYi9taXNzaW5nL2JpdHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwMTNhZQotLS0gL2Rldi9udWxsCisrKyBiL21pc3NpbmcvYml0dHlwZXMuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBIQVZFX1VfSU5UOF9UCisKKyNpZiBTSVpFT0ZfQ0hBUiA9PSAxCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9pbnQ4X3Q7CisjZWxpZiBTSVpFT0ZfSU5UID09IDEKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OF90OworI2Vsc2UgIC8qIFhYWCAqLworI2Vycm9yICJ0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHVfaW50OF90IgorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1VfSU5UOF9UICovCisKKyNpZm5kZWYgSEFWRV9VX0lOVDE2X1QKKworI2lmIFNJWkVPRl9TSE9SVCA9PSAyCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVfaW50MTZfdDsKKyNlbGlmIFNJWkVPRl9JTlQgPT0gMgordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQxNl90OworI2VsaWYgU0laRU9GX0NIQVIgPT0gMgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfaW50MTZfdDsKKyNlbHNlICAvKiBYWFggKi8KKyNlcnJvciAidGhlcmUncyBubyBhcHByb3ByaWF0ZSB0eXBlIGZvciB1X2ludDE2X3QiCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfVV9JTlQxNl9UICovCisKKyNpZm5kZWYgSEFWRV9VX0lOVDMyX1QKKworI2lmIFNJWkVPRl9JTlQgPT0gNAordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworI2VsaWYgU0laRU9GX0xPTkcgPT0gNAordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVfaW50MzJfdDsKKyNlbGlmIFNJWkVPRl9TSE9SVCA9PSA0Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVfaW50MzJfdDsKKyNlbHNlICAvKiBYWFggKi8KKyNlcnJvciAidGhlcmUncyBubyBhcHByb3ByaWF0ZSB0eXBlIGZvciB1X2ludDMyX3QiCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfVV9JTlQzMl9UICovCisKKyNpZm5kZWYgSEFWRV9VX0lOVDY0X1QKKworI2lmIFNJWkVPRl9MT05HX0xPTkcgPT0gOAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdV9pbnQ2NF90OworI2VsaWYgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCit0eXBlZGVmIHVuc2lnbmVkIF9pbnQ2NCB1X2ludDY0X3Q7CisjZWxpZiBTSVpFT0ZfSU5UID09IDgKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50NjRfdDsKKyNlbGlmIFNJWkVPRl9MT05HID09IDgKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1X2ludDY0X3Q7CisjZWxpZiBTSVpFT0ZfU0hPUlQgPT0gOAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDY0X3Q7CisjZWxzZSAgLyogWFhYICovCisjZXJyb3IgInRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdV9pbnQ2NF90IgorI2VuZGlmCisKKyNlbmRpZiAvKiBIQVZFX1VfSU5UNjRfVCAqLworCisjaWZuZGVmIFBSSWQ2NAorI2lmZGVmIF9NU0NfRVhURU5TSU9OUworI2RlZmluZSBQUklkNjQJIkk2NGQiCisjZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNkZWZpbmUgUFJJZDY0CSJsbGQiCisjZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCisjZW5kaWYgLyogUFJJZDY0ICovCisKKyNpZm5kZWYgUFJJbzY0CisjaWZkZWYgX01TQ19FWFRFTlNJT05TCisjZGVmaW5lIFBSSW82NAkiSTY0byIKKyNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2RlZmluZSBQUklvNjQJImxsbyIKKyNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNlbmRpZiAvKiBQUklvNjQgKi8KKworI2lmbmRlZiBQUkl4NjQKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNkZWZpbmUgUFJJeDY0CSJJNjR4IgorI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCisjZGVmaW5lIFBSSXg2NAkibGx4IgorI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2VuZGlmIC8qIFBSSXg2NCAqLworCisjaWZuZGVmIFBSSXU2NAorI2lmZGVmIF9NU0NfRVhURU5TSU9OUworI2RlZmluZSBQUkl1NjQJIkk2NHUiCisjZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNkZWZpbmUgUFJJdTY0CSJsbHUiCisjZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCisjZW5kaWYgLyogUFJJdTY0ICovCmRpZmYgLS1naXQgYS9taXNzaW5nL2RhdGFsaW5rcy5jIGIvbWlzc2luZy9kYXRhbGlua3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2MxMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9kYXRhbGlua3MuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9kYXRhbGlua3MuYyx2IDEuMyAyMDAzLzExLzE2IDA5OjM2OjQ3IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAicGNhcC1taXNzaW5nLmgiCisKKy8qCisgKiBTdHViIHZlcnNpb25zIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgKi8KK2ludAorcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKnAsIGludCAqKmRsdF9idWZmZXIpCit7CisJLyoKKwkgKiBUaGlzIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgRExUIGZvciBhbgorCSAqIGludGVyZmFjZS4gIFJldHVybiBhIGxpc3Qgb2YgRExUcyBjb250YWluaW5nIG9ubHkgdGhlCisJICogRExUIHRoaXMgZGV2aWNlIHN1cHBvcnRzLgorCSAqLworCSpkbHRfYnVmZmVyID0gKGludCopbWFsbG9jKHNpemVvZigqKmRsdF9idWZmZXIpKTsKKwlpZiAoKmRsdF9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisJKipkbHRfYnVmZmVyID0gcGNhcF9kYXRhbGluayhwKTsKKwlyZXR1cm4gKDEpOworfQpkaWZmIC0tZ2l0IGEvbWlzc2luZy9kbG5hbWVzLmMgYi9taXNzaW5nL2RsbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGY1ODNlCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9kbG5hbWVzLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL2RsbmFtZXMuYyx2IDEuNSAyMDAzLzExLzE4IDIzOjA5OjQzIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInBjYXAtbWlzc2luZy5oIgorCitzdHJ1Y3QgZGx0X2Nob2ljZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQJZGx0OworfTsKKworI2RlZmluZSBETFRfQ0hPSUNFKGNvZGUsIGRlc2NyaXB0aW9uKSB7ICNjb2RlLCBkZXNjcmlwdGlvbiwgY29kZSB9CisjZGVmaW5lIERMVF9DSE9JQ0VfU0VOVElORUwgeyBOVUxMLCBOVUxMLCAwIH0KKworc3RhdGljIHN0cnVjdCBkbHRfY2hvaWNlIGRsdF9jaG9pY2VzW10gPSB7CisJRExUX0NIT0lDRShETFRfTlVMTCwgIkJTRCBsb29wYmFjayIpLAorCURMVF9DSE9JQ0UoRExUX0VOMTBNQiwgIkV0aGVybmV0IiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMiwgIlRva2VuIHJpbmciKSwKKwlETFRfQ0hPSUNFKERMVF9BUkNORVQsICJBUkNORVQiKSwKKwlETFRfQ0hPSUNFKERMVF9TTElQLCAiU0xJUCIpLAorCURMVF9DSE9JQ0UoRExUX1BQUCwgIlBQUCIpLAorCURMVF9DSE9JQ0UoRExUX0ZEREksICJGRERJIiksCisJRExUX0NIT0lDRShETFRfQVRNX1JGQzE0ODMsICJSRkMgMTQ4MyBJUC1vdmVyLUFUTSIpLAorCURMVF9DSE9JQ0UoRExUX1JBVywgIlJhdyBJUCIpLAorI2lmZGVmIERMVF9TTElQX0JTRE9TCisJRExUX0NIT0lDRShETFRfU0xJUF9CU0RPUywgIkJTRC9PUyBTTElQIiksCisjZW5kaWYKKyNpZmRlZiBETFRfUFBQX0JTRE9TCisJRExUX0NIT0lDRShETFRfUFBQX0JTRE9TLCAiQlNEL09TIFBQUCIpLAorI2VuZGlmCisjaWZkZWYgRExUX0FUTV9DTElQCisJRExUX0NIT0lDRShETFRfQVRNX0NMSVAsICJMaW51eCBDbGFzc2ljYWwgSVAtb3Zlci1BVE0iKSwKKyNlbmRpZgorI2lmZGVmIERMVF9QUFBfU0VSSUFMCisJRExUX0NIT0lDRShETFRfUFBQX1NFUklBTCwgIlBQUCBvdmVyIHNlcmlhbCIpLAorI2VuZGlmCisjaWZkZWYgRExUX1BQUF9FVEhFUgorCURMVF9DSE9JQ0UoRExUX1BQUF9FVEhFUiwgIlBQUG9FIiksCisjZW5kaWYKKyNpZmRlZiBETFRfQ19IRExDCisJRExUX0NIT0lDRShETFRfQ19IRExDLCAiQ2lzY28gSERMQyIpLAorI2VuZGlmCisjaWZkZWYgRExUX0lFRUU4MDJfMTEKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExLCAiODAyLjExIiksCisjZW5kaWYKKyNpZmRlZiBETFRfRlJFTEFZCisJRExUX0NIT0lDRShETFRfRlJFTEFZLCAiRnJhbWUgUmVsYXkiKSwKKyNlbmRpZgorI2lmZGVmIERMVF9MT09QCisJRExUX0NIT0lDRShETFRfTE9PUCwgIk9wZW5CU0QgbG9vcGJhY2siKSwKKyNlbmRpZgorI2lmZGVmIERMVF9FTkMKKwlETFRfQ0hPSUNFKERMVF9FTkMsICJPcGVuQlNEIGVuY2Fwc3VsYXRlZCBJUCIpLAorI2VuZGlmCisjaWZkZWYgRExUX0xJTlVYX1NMTAorCURMVF9DSE9JQ0UoRExUX0xJTlVYX1NMTCwgIkxpbnV4IGNvb2tlZCIpLAorI2VuZGlmCisjaWZkZWYgRExUX0xUQUxLCisJRExUX0NIT0lDRShETFRfTFRBTEssICJMb2NhbHRhbGsiKSwKKyNlbmRpZgorI2lmZGVmIERMVF9QRkxPRworCURMVF9DSE9JQ0UoRExUX1BGTE9HLCAiT3BlbkJTRCBwZmxvZyBmaWxlIiksCisjZW5kaWYKKyNpZmRlZiBETFRfUFJJU01fSEVBREVSCisJRExUX0NIT0lDRShETFRfUFJJU01fSEVBREVSLCAiODAyLjExIHBsdXMgUHJpc20gaGVhZGVyIiksCisjZW5kaWYKKyNpZmRlZiBETFRfSVBfT1ZFUl9GQworCURMVF9DSE9JQ0UoRExUX0lQX09WRVJfRkMsICJSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwiKSwKKyNlbmRpZgorI2lmZGVmIERMVF9TVU5BVE0KKwlETFRfQ0hPSUNFKERMVF9TVU5BVE0sICJTdW4gcmF3IEFUTSIpLAorI2VuZGlmCisjaWZkZWYgRExUX0lFRUU4MDJfMTFfUkFESU8KKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExX1JBRElPLCAiODAyLjExIHBsdXMgcmFkaW8gaW5mb3JtYXRpb24gaGVhZGVyIiksCisjZW5kaWYKKyNpZmRlZiBETFRfQVJDTkVUX0xJTlVYCisJRExUX0NIT0lDRShETFRfQVJDTkVUX0xJTlVYLCAiTGludXggQVJDTkVUIiksCisjZW5kaWYKKyNpZmRlZiBETFRfTElOVVhfSVJEQQorCURMVF9DSE9JQ0UoRExUX0xJTlVYX0lSREEsICJMaW51eCBJckRBIiksCisjZW5kaWYKKyNpZmRlZiBETFRfTEFORTgwMjMKKwlETFRfQ0hPSUNFKERMVF9MQU5FODAyMywgIkxpbnV4IDgwMi4zIExBTkUiKSwKKyNlbmRpZgorI2lmZGVmIERMVF9DSVAKKwlETFRfQ0hPSUNFKERMVF9DSVAsICJMaW51eCBDbGFzc2ljYWwgSVAtb3Zlci1BVE0iKSwKKyNlbmRpZgorI2lmZGVmIERMVF9IRExDCisJRExUX0NIT0lDRShETFRfSERMQywgIkNpc2NvIEhETEMiKSwKKyNlbmRpZgorCURMVF9DSE9JQ0VfU0VOVElORUwKK307CisKKyNpZm5kZWYgSEFWRV9QQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMCitpbnQKK3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGRsdF9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChzdHJjYXNlY21wKGRsdF9jaG9pY2VzW2ldLm5hbWUgKyBzaXplb2YoIkRMVF8iKSAtIDEsCisJCSAgICBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIChkbHRfY2hvaWNlc1tpXS5kbHQpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworY29uc3QgY2hhciAqCitwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKGludCBkbHQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBkbHRfY2hvaWNlc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlpZiAoZGx0X2Nob2ljZXNbaV0uZGx0ID09IGRsdCkKKwkJCXJldHVybiAoZGx0X2Nob2ljZXNbaV0ubmFtZSArIHNpemVvZigiRExUXyIpIC0gMSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisjZW5kaWYKKworY29uc3QgY2hhciAqCitwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgZGx0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgZGx0X2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKGRsdF9jaG9pY2VzW2ldLmRsdCA9PSBkbHQpCisJCQlyZXR1cm4gKGRsdF9jaG9pY2VzW2ldLmRlc2NyaXB0aW9uKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KZGlmZiAtLWdpdCBhL21pc3NpbmcvZ2V0YWRkcmluZm8uYyBiL21pc3NpbmcvZ2V0YWRkcmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMwMzIyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9nZXRhZGRyaW5mby5jCkBAIC0wLDAgKzEsMTExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqICIjaWZkZWYgRkFJVEgiIHBhcnQgaXMgbG9jYWwgaGFjayBmb3Igc3VwcG9ydGluZyBJUHY0LXY2IHRyYW5zbGF0b3IuCisgKgorICogSXNzdWVzIHRvIGJlIGRpc2N1c3NlZDoKKyAqIC0gVGhyZWFkIHNhZmUtbmVzcyBtdXN0IGJlIGNoZWNrZWQuCisgKiAtIFJldHVybiB2YWx1ZXMuICBUaGVyZSBhcmUgbm9uc3RhbmRhcmQgcmV0dXJuIHZhbHVlcyBkZWZpbmVkIGFuZCB1c2VkCisgKiAgIGluIHRoZSBzb3VyY2UgY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBSRkMyNTUzIGlzIHNpbGVudCBhYm91dCB3aGljaCBlcnJvcgorICogICBjb2RlIG11c3QgYmUgcmV0dXJuZWQgZm9yIHdoaWNoIHNpdHVhdGlvbi4KKyAqIE5vdGU6CisgKiAtIFdlIHVzZSBnZXRpcG5vZGVieW5hbWUoKSBqdXN0IGZvciB0aHJlYWQtc2FmZW5lc3MuICBUaGVyZSdzIG5vIGludGVudAorICogICB0byBsZXQgaXQgZG8gUEZfVU5TUEVDIChhY3R1YWxseSB3ZSBuZXZlciBwYXNzIFBGX1VOU1BFQyB0bworICogICBnZXRpcG5vZGVieW5hbWUoKS4KKyAqIC0gVGhlIGNvZGUgZmlsdGVycyBvdXQgQUZzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCwKKyAqICAgd2hlbiBnbG9iYmluZyBOVUxMIGhvc3RuYW1lICh0byBsb29wYmFjaywgb3Igd2lsZGNhcmQpLiAgSXMgaXQgdGhlIHJpZ2h0CisgKiAgIHRoaW5nIHRvIGRvPyAgV2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIHdpdGggcG9zdC1SRkMyNTUzIEFJX0FERFJDT05GSUcKKyAqICAgaW4gYWlfZmxhZ3M/CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9nZXRhZGRyaW5mby5jLHYgMS4xMyAyMDAzLzExLzE2IDA5OjM2OjQ4IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmIDAKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgSEFWRV9VX0lOVDMyX1QKKyNpbmNsdWRlICJiaXR0eXBlcy5oIgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TT0NLQUREUl9TVE9SQUdFCisjaW5jbHVkZSAic29ja3N0b3JhZ2UuaCIKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9BRERSSU5GT19ICisjaW5jbHVkZSAiYWRkcmluZm8uaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0tBTUVfXykgJiYgZGVmaW5lZChJTkVUNikKKyMgZGVmaW5lIEZBSVRICisjZW5kaWYKKworI2RlZmluZSBTVUNDRVNTIDAKKyNkZWZpbmUgQU5ZIDAKKyNkZWZpbmUgWUVTIDEKKyNkZWZpbmUgTk8gIDAKKworI2lmZGVmIEZBSVRICitzdGF0aWMgaW50IHRyYW5zbGF0ZSA9IE5POworc3RhdGljIHN0cnVjdCBpbjZfYWRkciBmYWl0aF9wcmVmaXggPSBJTjZBRERSX0FOWV9JTklUOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIGluX2FkZHJhbnlbXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGNvbnN0IGNoYXIgaW42X2FkZHJhbnlbXSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9Oworc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07CitzdGF0aWMgY29uc3QgY2hhciBpbjZfbG9vcGJhY2tbXSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxCit9OworCitzdHJ1Y3Qgc29ja2luZXQgeworCXVfY2hhcglzaV9sZW47CisJdV9jaGFyCXNpX2ZhbWlseTsKKwl1X3Nob3J0CXNpX3BvcnQ7CisJdV9pbnQzMl90IHNpX3Njb3BlX2lkOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgeworCWludCBhX2FmOworCWludCBhX2FkZHJsZW47CisJaW50IGFfc29ja2xlbjsKKwlpbnQgYV9vZmY7CisJY29uc3QgY2hhciAqYV9hZGRyYW55OworCWNvbnN0IGNoYXIgKmFfbG9vcGJhY2s7CisJaW50IGFfc2NvcGVkOworfSBhZmRsIFtdID0geworI2lmZGVmIElORVQ2CisJe1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKKwkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAorCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAorCSBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrLCAxfSwKKyNlbmRpZgorCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAorCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKKwkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkciksCisJIGluX2FkZHJhbnksIGluX2xvb3BiYWNrLCAwfSwKKwl7MCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgMH0sCit9OworCitzdHJ1Y3QgZXhwbG9yZSB7CisJaW50IGVfYWY7CisJaW50IGVfc29ja3R5cGU7CisJaW50IGVfcHJvdG9jb2w7CisJY29uc3QgY2hhciAqZV9wcm90b3N0cjsKKwlpbnQgZV93aWxkOworI2RlZmluZSBXSUxEX0FGKGV4KQkJKChleCktPmVfd2lsZCAmIDB4MDEpCisjZGVmaW5lIFdJTERfU09DS1RZUEUoZXgpCSgoZXgpLT5lX3dpbGQgJiAweDAyKQorI2RlZmluZSBXSUxEX1BST1RPQ09MKGV4KQkoKGV4KS0+ZV93aWxkICYgMHgwNCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXhwbG9yZSBleHBsb3JlW10gPSB7CisjaWYgMAorCXsgUEZfTE9DQUwsIDAsIEFOWSwgQU5ZLCBOVUxMLCAweDAxIH0sCisjZW5kaWYKKyNpZmRlZiBJTkVUNgorCXsgUEZfSU5FVDYsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAorCXsgUEZfSU5FVDYsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgInRjcCIsIDB4MDcgfSwKKwl7IFBGX0lORVQ2LCBTT0NLX1JBVywgQU5ZLCBOVUxMLCAweDA1IH0sCisjZW5kaWYKKwl7IFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQLCAidWRwIiwgMHgwNyB9LAorCXsgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAidGNwIiwgMHgwNyB9LAorCXsgUEZfSU5FVCwgU09DS19SQVcsIEFOWSwgTlVMTCwgMHgwNSB9LAorCXsgLTEsIDAsIDAsIE5VTEwsIDAgfSwKK307CisKKyNpZmRlZiBJTkVUNgorI2RlZmluZSBQVE9OX01BWAkxNgorI2Vsc2UKKyNkZWZpbmUgUFRPTl9NQVgJNAorI2VuZGlmCisKKworc3RhdGljIGludCBzdHJfaXNudW1iZXIgKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGV4cGxvcmVfZnFkbiAoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitzdGF0aWMgaW50IGV4cGxvcmVfbnVsbCAoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitzdGF0aWMgaW50IGV4cGxvcmVfbnVtZXJpYyAoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitzdGF0aWMgaW50IGV4cGxvcmVfbnVtZXJpY19zY29wZSAoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKik7CitzdGF0aWMgaW50IGdldF9uYW1lIChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBhZmQgKiwgc3RydWN0IGFkZHJpbmZvICoqLAorCWNoYXIgKiwgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGdldF9jYW5vbm5hbWUgKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLAorCXN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICopOworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyAqZ2V0X2FpIChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKKwljb25zdCBzdHJ1Y3QgYWZkICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGdldF9wb3J0bWF0Y2ggKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBnZXRfcG9ydCAoc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZkICpmaW5kX2FmZCAoaW50KTsKKworc3RhdGljIGNoYXIgKmFpX2Vycmxpc3RbXSA9IHsKKwkiU3VjY2VzcyIsCisJIkFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkIiwJLyogRUFJX0FERFJGQU1JTFkgKi8KKwkiVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwJCS8qIEVBSV9BR0FJTiAgICAgICovCisJIkludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzIiwJCSAgICAgICAJLyogRUFJX0JBREZMQUdTICAgKi8KKwkiTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwgCS8qIEVBSV9GQUlMICAgICAgICovCisJImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkIiwJCQkvKiBFQUlfRkFNSUxZICAgICAqLworCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgCQkJLyogRUFJX01FTU9SWSAgICAgKi8KKwkiTm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUiLCAJCS8qIEVBSV9OT0RBVEEgICAgICovCisJImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duIiwJLyogRUFJX05PTkFNRSAgICAgKi8KKwkic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUiLAkvKiBFQUlfU0VSVklDRSAgICAqLworCSJhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkIiwgCQkJLyogRUFJX1NPQ0tUWVBFICAgKi8KKwkiU3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vIiwgCQkvKiBFQUlfU1lTVEVNICAgICAqLworCSJJbnZhbGlkIHZhbHVlIGZvciBoaW50cyIsCQkJLyogRUFJX0JBREhJTlRTCSAgKi8KKwkiUmVzb2x2ZWQgcHJvdG9jb2wgaXMgdW5rbm93biIsCQkJLyogRUFJX1BST1RPQ09MICAgKi8KKwkiVW5rbm93biBlcnJvciIsIAkJCQkvKiBFQUlfTUFYICAgICAgICAqLworfTsKKworLyogWFhYIG1hY3JvcyB0aGF0IG1ha2UgZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIEJBRC4gKi8KKworI2RlZmluZSBHRVRfQUkoYWksIGFmZCwgYWRkcikgXAorZG8geyBcCisJLyogZXh0ZXJuYWwgcmVmZXJlbmNlOiBwYWksIGVycm9yLCBhbmQgbGFiZWwgZnJlZSAqLyBcCisJKGFpKSA9IGdldF9haShwYWksIChhZmQpLCAoYWRkcikpOyBcCisJaWYgKChhaSkgPT0gTlVMTCkgeyBcCisJCWVycm9yID0gRUFJX01FTU9SWTsgXAorCQlnb3RvIGZyZWU7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX1BPUlQoYWksIHNlcnYpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogZXJyb3IgYW5kIGxhYmVsIGZyZWUgKi8gXAorCWVycm9yID0gZ2V0X3BvcnQoKGFpKSwgKHNlcnYpLCAwKTsgXAorCWlmIChlcnJvciAhPSAwKSBcCisJCWdvdG8gZnJlZTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQ0FOT05OQU1FKGFpLCBzdHIpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogcGFpLCBlcnJvciBhbmQgbGFiZWwgZnJlZSAqLyBcCisJZXJyb3IgPSBnZXRfY2Fub25uYW1lKHBhaSwgKGFpKSwgKHN0cikpOyBcCisJaWYgKGVycm9yICE9IDApIFwKKwkJZ290byBmcmVlOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVSUihlcnIpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogZXJyb3IsIGFuZCBsYWJlbCBiYWQgKi8gXAorCWVycm9yID0gKGVycik7IFwKKwlnb3RvIGJhZDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVRDSF9GQU1JTFkoeCwgeSwgdykgXAorCSgoeCkgPT0gKHkpIHx8ICgodykgJiYgKCh4KSA9PSBQRl9VTlNQRUMgfHwgKHkpID09IFBGX1VOU1BFQykpKQorI2RlZmluZSBNQVRDSCh4LCB5LCB3KSBcCisJKCh4KSA9PSAoeSkgfHwgKCh3KSAmJiAoKHgpID09IEFOWSB8fCAoeSkgPT0gQU5ZKSkpCisKK2NoYXIgKgorZ2FpX3N0cmVycm9yKGVjb2RlKQorCWludCBlY29kZTsKK3sKKwlpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKKwkJZWNvZGUgPSBFQUlfTUFYOworCXJldHVybiBhaV9lcnJsaXN0W2Vjb2RlXTsKK30KKwordm9pZAorZnJlZWFkZHJpbmZvKGFpKQorCXN0cnVjdCBhZGRyaW5mbyAqYWk7Cit7CisJc3RydWN0IGFkZHJpbmZvICpuZXh0OworCisJZG8geworCQluZXh0ID0gYWktPmFpX25leHQ7CisJCWlmIChhaS0+YWlfY2Fub25uYW1lKQorCQkJZnJlZShhaS0+YWlfY2Fub25uYW1lKTsKKwkJLyogbm8gbmVlZCB0byBmcmVlKGFpLT5haV9hZGRyKSAqLworCQlmcmVlKGFpKTsKKwl9IHdoaWxlICgoYWkgPSBuZXh0KSAhPSBOVUxMKTsKK30KKworc3RhdGljIGludAorc3RyX2lzbnVtYmVyKHApCisJY29uc3QgY2hhciAqcDsKK3sKKwljaGFyICpxID0gKGNoYXIgKilwOworCXdoaWxlICgqcSkgeworCQlpZiAoISBpc2RpZ2l0KCpxKSkKKwkJCXJldHVybiBOTzsKKwkJcSsrOworCX0KKwlyZXR1cm4gWUVTOworfQorCitpbnQKK2dldGFkZHJpbmZvKGhvc3RuYW1lLCBzZXJ2bmFtZSwgaGludHMsIHJlcykKKwljb25zdCBjaGFyICpob3N0bmFtZSwgKnNlcnZuYW1lOworCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHM7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKKwlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBhZGRyaW5mbyBhaTsKKwlzdHJ1Y3QgYWRkcmluZm8gYWkwOworCXN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKwljb25zdCBzdHJ1Y3QgZXhwbG9yZSAqZXg7CisKKyNpZmRlZiBGQUlUSAorCXN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKKworCWlmIChmaXJzdHRpbWUpIHsKKwkJLyogdHJhbnNsYXRvciBoYWNrICovCisJCWNoYXIgKnEgPSBnZXRlbnYoIkdBSSIpOworCQlpZiAocSAmJiBpbmV0X3B0b24oQUZfSU5FVDYsIHEsICZmYWl0aF9wcmVmaXgpID09IDEpCisJCQl0cmFuc2xhdGUgPSBZRVM7CisJCWZpcnN0dGltZSA9IDA7CisJfQorI2VuZGlmCisKKwlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKKwljdXIgPSAmc2VudGluZWw7CisJcGFpID0gJmFpOworCXBhaS0+YWlfZmxhZ3MgPSAwOworCXBhaS0+YWlfZmFtaWx5ID0gUEZfVU5TUEVDOworCXBhaS0+YWlfc29ja3R5cGUgPSBBTlk7CisJcGFpLT5haV9wcm90b2NvbCA9IEFOWTsKKwlwYWktPmFpX2FkZHJsZW4gPSAwOworCXBhaS0+YWlfY2Fub25uYW1lID0gTlVMTDsKKwlwYWktPmFpX2FkZHIgPSBOVUxMOworCXBhaS0+YWlfbmV4dCA9IE5VTEw7CisKKwlpZiAoaG9zdG5hbWUgPT0gTlVMTCAmJiBzZXJ2bmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gRUFJX05PTkFNRTsKKwlpZiAoaGludHMpIHsKKwkJLyogZXJyb3IgY2hlY2sgZm9yIGhpbnRzICovCisJCWlmIChoaW50cy0+YWlfYWRkcmxlbiB8fCBoaW50cy0+YWlfY2Fub25uYW1lIHx8CisJCSAgICBoaW50cy0+YWlfYWRkciB8fCBoaW50cy0+YWlfbmV4dCkKKwkJCUVSUihFQUlfQkFESElOVFMpOyAvKiB4eHggKi8KKwkJaWYgKGhpbnRzLT5haV9mbGFncyAmIH5BSV9NQVNLKQorCQkJRVJSKEVBSV9CQURGTEFHUyk7CisJCXN3aXRjaCAoaGludHMtPmFpX2ZhbWlseSkgeworCQljYXNlIFBGX1VOU1BFQzoKKwkJY2FzZSBQRl9JTkVUOgorI2lmZGVmIElORVQ2CisJCWNhc2UgUEZfSU5FVDY6CisjZW5kaWYKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRVJSKEVBSV9GQU1JTFkpOworCQl9CisJCW1lbWNweShwYWksIGhpbnRzLCBzaXplb2YoKnBhaSkpOworCisJCS8qCisJCSAqIGlmIGJvdGggc29ja3R5cGUvcHJvdG9jb2wgYXJlIHNwZWNpZmllZCwgY2hlY2sgaWYgdGhleQorCQkgKiBhcmUgbWVhbmluZ2Z1bCBjb21iaW5hdGlvbi4KKwkJICovCisJCWlmIChwYWktPmFpX3NvY2t0eXBlICE9IEFOWSAmJiBwYWktPmFpX3Byb3RvY29sICE9IEFOWSkgeworCQkJZm9yIChleCA9IGV4cGxvcmU7IGV4LT5lX2FmID49IDA7IGV4KyspIHsKKwkJCQlpZiAocGFpLT5haV9mYW1pbHkgIT0gZXgtPmVfYWYpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleC0+ZV9zb2NrdHlwZSA9PSBBTlkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleC0+ZV9wcm90b2NvbCA9PSBBTlkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IGV4LT5lX3NvY2t0eXBlCisJCQkJICYmIHBhaS0+YWlfcHJvdG9jb2wgIT0gZXgtPmVfcHJvdG9jb2wpIHsKKwkJCQkJRVJSKEVBSV9CQURISU5UUyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBjaGVjayBmb3Igc3BlY2lhbCBjYXNlcy4gICgxKSBudW1lcmljIHNlcnZuYW1lIGlzIGRpc2FsbG93ZWQgaWYKKwkgKiBzb2NrdHlwZS9wcm90b2NvbCBhcmUgbGVmdCB1bnNwZWNpZmllZC4gKDIpIHNlcnZuYW1lIGlzIGRpc2FsbG93ZWQKKwkgKiBmb3IgcmF3IGFuZCBvdGhlciBpbmV0eyw2fSBzb2NrZXRzLgorCSAqLworCWlmIChNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIFBGX0lORVQsIDEpCisjaWZkZWYgUEZfSU5FVDYKKwkgfHwgTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBQRl9JTkVUNiwgMSkKKyNlbmRpZgorCSAgICApIHsKKwkJYWkwID0gKnBhaTsKKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7CisjaWZkZWYgUEZfSU5FVDYKKwkJCXBhaS0+YWlfZmFtaWx5ID0gUEZfSU5FVDY7CisjZWxzZQorCQkJcGFpLT5haV9mYW1pbHkgPSBQRl9JTkVUOworI2VuZGlmCisJCX0KKwkJZXJyb3IgPSBnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpOworCQlpZiAoZXJyb3IpCisJCQlFUlIoZXJyb3IpOworCisJCSpwYWkgPSBhaTA7CisJfQorCisJYWkwID0gKnBhaTsKKworCS8qIE5VTEwgaG9zdG5hbWUsIG9yIG51bWVyaWMgaG9zdG5hbWUgKi8KKwlmb3IgKGV4ID0gZXhwbG9yZTsgZXgtPmVfYWYgPj0gMDsgZXgrKykgeworCQkqcGFpID0gYWkwOworCisJCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBleC0+ZV9hZiwgV0lMRF9BRihleCkpKQorCQkJY29udGludWU7CisJCWlmICghTUFUQ0gocGFpLT5haV9zb2NrdHlwZSwgZXgtPmVfc29ja3R5cGUsIFdJTERfU09DS1RZUEUoZXgpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIU1BVENIKHBhaS0+YWlfcHJvdG9jb2wsIGV4LT5lX3Byb3RvY29sLCBXSUxEX1BST1RPQ09MKGV4KSkpCisJCQljb250aW51ZTsKKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKQorCQkJcGFpLT5haV9mYW1pbHkgPSBleC0+ZV9hZjsKKwkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gQU5ZICYmIGV4LT5lX3NvY2t0eXBlICE9IEFOWSkKKwkJCXBhaS0+YWlfc29ja3R5cGUgPSBleC0+ZV9zb2NrdHlwZTsKKwkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgPT0gQU5ZICYmIGV4LT5lX3Byb3RvY29sICE9IEFOWSkKKwkJCXBhaS0+YWlfcHJvdG9jb2wgPSBleC0+ZV9wcm90b2NvbDsKKworCQlpZiAoaG9zdG5hbWUgPT0gTlVMTCkKKwkJCWVycm9yID0gZXhwbG9yZV9udWxsKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCAmY3VyLT5haV9uZXh0KTsKKwkJZWxzZQorCQkJZXJyb3IgPSBleHBsb3JlX251bWVyaWNfc2NvcGUocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsICZjdXItPmFpX25leHQpOworCisJCWlmIChlcnJvcikKKwkJCWdvdG8gZnJlZTsKKworCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKKwl9CisKKwkvKgorCSAqIFhYWAorCSAqIElmIG51bXJlaWMgcmVwcmVzZW50YXRpb24gb2YgQUYxIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBGUUROCisJICogcmVwcmVzZW50YXRpb24gb2YgQUYyLCB3ZSBuZWVkIHRvIHRoaW5rIGFnYWluIGFib3V0IHRoZSBjb2RlIGJlbG93LgorCSAqLworCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlnb3RvIGdvb2Q7CisKKwlpZiAocGFpLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQorCQlFUlIoRUFJX05PTkFNRSk7CisJaWYgKGhvc3RuYW1lID09IE5VTEwpCisJCUVSUihFQUlfTk9OQU1FKTsKKworCS8qCisJICogaG9zdG5hbWUgYXMgYWxwaGFiZXRpY2FsIG5hbWUuCisJICogd2Ugd291bGQgbGlrZSB0byBwcmVmZXIgQUZfSU5FVDYgdGhhbiBBRl9JTkVULCBzbyB3ZSdsbCBtYWtlIGEKKwkgKiBvdXRlciBsb29wIGJ5IEFGcy4KKwkgKi8KKwlmb3IgKGFmZCA9IGFmZGw7IGFmZC0+YV9hZjsgYWZkKyspIHsKKwkJKnBhaSA9IGFpMDsKKworCQlpZiAoIU1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgYWZkLT5hX2FmLCAxKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoZXggPSBleHBsb3JlOyBleC0+ZV9hZiA+PSAwOyBleCsrKSB7CisJCQkqcGFpID0gYWkwOworCisJCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKQorCQkJCXBhaS0+YWlfZmFtaWx5ID0gYWZkLT5hX2FmOworCisJCQlpZiAoIU1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgZXgtPmVfYWYsIFdJTERfQUYoZXgpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghTUFUQ0gocGFpLT5haV9zb2NrdHlwZSwgZXgtPmVfc29ja3R5cGUsCisJCQkJCVdJTERfU09DS1RZUEUoZXgpKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFNQVRDSChwYWktPmFpX3Byb3RvY29sLCBleC0+ZV9wcm90b2NvbCwKKwkJCQkJV0lMRF9QUk9UT0NPTChleCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCisJCQkJcGFpLT5haV9mYW1pbHkgPSBleC0+ZV9hZjsKKwkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEFOWSAmJiBleC0+ZV9zb2NrdHlwZSAhPSBBTlkpCisJCQkJcGFpLT5haV9zb2NrdHlwZSA9IGV4LT5lX3NvY2t0eXBlOworCQkJaWYgKHBhaS0+YWlfcHJvdG9jb2wgPT0gQU5ZICYmIGV4LT5lX3Byb3RvY29sICE9IEFOWSkKKwkJCQlwYWktPmFpX3Byb3RvY29sID0gZXgtPmVfcHJvdG9jb2w7CisKKwkJCWVycm9yID0gZXhwbG9yZV9mcWRuKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLAorCQkJCSZjdXItPmFpX25leHQpOworCisJCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCQljdXIgPSBjdXItPmFpX25leHQ7CisJCX0KKwl9CisKKwkvKiBYWFggKi8KKwlpZiAoc2VudGluZWwuYWlfbmV4dCkKKwkJZXJyb3IgPSAwOworCisJaWYgKGVycm9yKQorCQlnb3RvIGZyZWU7CisJaWYgKGVycm9yID09IDApIHsKKwkJaWYgKHNlbnRpbmVsLmFpX25leHQpIHsKKyBnb29kOgorCQkJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJCQlyZXR1cm4gU1VDQ0VTUzsKKwkJfSBlbHNlCisJCQllcnJvciA9IEVBSV9GQUlMOworCX0KKyBmcmVlOgorIGJhZDoKKwlpZiAoc2VudGluZWwuYWlfbmV4dCkKKwkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOworCSpyZXMgPSBOVUxMOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZRRE4gaG9zdG5hbWUsIEROUyBsb29rdXAKKyAqLworc3RhdGljIGludAorZXhwbG9yZV9mcWRuKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworCXN0cnVjdCBob3N0ZW50ICpocDsKKwlpbnQgaF9lcnJvcjsKKwlpbnQgYWY7CisJY2hhciAqKmFwbGlzdCA9IE5VTEwsICphcGJ1ZiA9IE5VTEw7CisJY2hhciAqYXA7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsLCAqY3VyOworCWludCBpOworI2lmbmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpbnQgbmFkZHJzOworI2VuZGlmCisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCWludCBlcnJvcjsKKworCSpyZXMgPSBOVUxMOworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKworCS8qCisJICogRG8gbm90IGZpbHRlciB1bnN1cHBvcnRlZCBBRnMgaGVyZS4gIFdlIG5lZWQgdG8gaG9ub3IgY29udGVudCBvZgorCSAqIGRhdGFiYXNlcyAoL2V0Yy9ob3N0cywgRE5TIGFuZCBvdGhlcnMpLiAgT3RoZXJ3aXNlIHdlIGNhbm5vdAorCSAqIHJlcGxhY2UgZ2V0aG9zdGJ5bmFtZSgpIGJ5IGdldGFkZHJpbmZvKCkuCisJICovCisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCisJLyoKKwkgKiBwb3N0LVJGQzI1NTM6IHNob3VsZCBsb29rIGF0IChwYWktPmFpX2ZsYWdzICYgQUlfQUREUkNPTkZJRykKKwkgKiByYXRoZXIgdGhhbiBoYXJkY29kaW5nIGl0LiAgd2UgbWF5IG5lZWQgdG8gYWRkIEFJX0FERFJDT05GSUcKKwkgKiBoYW5kbGluZyBjb2RlIGJ5IG91cnNlbHZlcyBpbiBjYXNlIHdlIGRvbid0IGhhdmUgZ2V0aXBub2RlYnluYW1lKCkuCisJICovCisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCBBSV9BRERSQ09ORklHLCAmaF9lcnJvcik7CisjZWxzZQorI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRTIKKwlocCA9IGdldGhvc3RieW5hbWUyKGhvc3RuYW1lLCBwYWktPmFpX2ZhbWlseSk7CisjZWxzZQorCWlmIChwYWktPmFpX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gMDsKKwlocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworI2lmZGVmIEhBVkVfSF9FUlJOTworCWhfZXJyb3IgPSBoX2Vycm5vOworI2Vsc2UKKwloX2Vycm9yID0gRUlOVkFMOworI2VuZGlmCisjZW5kaWYgLypIQVZFX0dFVEhPU1RCWU5BTUUyKi8KKyNlbmRpZiAvKlVTRV9HRVRJUE5PREVCWSovCisKKwlpZiAoaHAgPT0gTlVMTCkgeworCQlzd2l0Y2ggKGhfZXJyb3IpIHsKKwkJY2FzZSBIT1NUX05PVF9GT1VORDoKKwkJY2FzZSBOT19EQVRBOgorCQkJZXJyb3IgPSBFQUlfTk9EQVRBOworCQkJYnJlYWs7CisJCWNhc2UgVFJZX0FHQUlOOgorCQkJZXJyb3IgPSBFQUlfQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBOT19SRUNPVkVSWToKKwkJY2FzZSBORVREQl9JTlRFUk5BTDoKKwkJZGVmYXVsdDoKKwkJCWVycm9yID0gRUFJX0ZBSUw7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoKGhwLT5oX25hbWUgPT0gTlVMTCkgfHwgKGhwLT5oX25hbWVbMF0gPT0gMCkKKwkJCXx8IChocC0+aF9hZGRyX2xpc3RbMF0gPT0gTlVMTCkpIHsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJCWhwID0gTlVMTDsKKwkJZXJyb3IgPSBFQUlfRkFJTDsKKwl9CisKKwlpZiAoaHAgPT0gTlVMTCkKKwkJZ290byBmcmVlOworCisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJYXBsaXN0ID0gaHAtPmhfYWRkcl9saXN0OworI2Vsc2UKKwkvKgorCSAqIGhwIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgd2UgdXNlIGdldGhvc3RieW5hbWUyKCkuCisJICogYWx3YXlzIGRlZXAgY29weSBmb3Igc2ltcGxpZmljYXRpb24uCisJICovCisJZm9yIChuYWRkcnMgPSAwOyBocC0+aF9hZGRyX2xpc3RbbmFkZHJzXSAhPSBOVUxMOyBuYWRkcnMrKykKKwkJOworCW5hZGRycysrOworCWFwbGlzdCA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoYXBsaXN0WzBdKSAqIG5hZGRycyk7CisJYXBidWYgPSAoY2hhciAqKW1hbGxvYyhocC0+aF9sZW5ndGggKiBuYWRkcnMpOworCWlmIChhcGxpc3QgPT0gTlVMTCB8fCBhcGJ1ZiA9PSBOVUxMKSB7CisJCWVycm9yID0gRUFJX01FTU9SWTsKKwkJZ290byBmcmVlOworCX0KKwltZW1zZXQoYXBsaXN0LCAwLCBzaXplb2YoYXBsaXN0WzBdKSAqIG5hZGRycyk7CisJZm9yIChpID0gMDsgaSA8IG5hZGRyczsgaSsrKSB7CisJCWlmIChocC0+aF9hZGRyX2xpc3RbaV0gPT0gTlVMTCkgeworCQkJYXBsaXN0W2ldID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbWNweSgmYXBidWZbaSAqIGhwLT5oX2xlbmd0aF0sIGhwLT5oX2FkZHJfbGlzdFtpXSwKKwkJCWhwLT5oX2xlbmd0aCk7CisJCWFwbGlzdFtpXSA9ICZhcGJ1ZltpICogaHAtPmhfbGVuZ3RoXTsKKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGFwbGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKKwkJYWYgPSBocC0+aF9hZGRydHlwZTsKKwkJYXAgPSBhcGxpc3RbaV07CisjaWZkZWYgQUZfSU5FVDYKKwkJaWYgKGFmID09IEFGX0lORVQ2CisJCSAmJiBJTjZfSVNfQUREUl9WNE1BUFBFRCgoc3RydWN0IGluNl9hZGRyICopYXApKSB7CisJCQlhZiA9IEFGX0lORVQ7CisJCQlhcCA9IGFwICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikKKwkJCQktIHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCX0KKyNlbmRpZgorCisJCWlmIChhZiAhPSBwYWktPmFpX2ZhbWlseSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocGFpLT5haV9mbGFncyAmIEFJX0NBTk9OTkFNRSkgPT0gMCkgeworCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBhcCk7CisJCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCisJCQkgKiBmYWlsLCByZXR1cm4gYWkgYW55d2F5IHRvIHBhY2lmeQorCQkJICogY2FsbGluZyBhcHBsaWNhdGlvbi4KKwkJCSAqCisJCQkgKiBYWFggZ2V0YWRkcmluZm8oKSBpcyBhIG5hbWUtPmFkZHJlc3MKKwkJCSAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3MKKwkJCSAqIHN0cmFuZ2UgdGhhdCB3ZSBkbyBhZGRyLT5uYW1lCisJCQkgKiB0cmFuc2xhdGlvbiBoZXJlLgorCQkJICovCisJCQlnZXRfbmFtZShhcCwgYWZkLCAmY3VyLT5haV9uZXh0LAorCQkJCWFwLCBwYWksIHNlcnZuYW1lKTsKKwkJfQorCisJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQorCQkJY3VyID0gY3VyLT5haV9uZXh0OworCX0KKworCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OworCXJldHVybiAwOworCitmcmVlOgorI2lmZGVmIFVTRV9HRVRJUE5PREVCWQorCWlmIChocCkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJaWYgKGFwbGlzdCkKKwkJZnJlZShhcGxpc3QpOworCWlmIChhcGJ1ZikKKwkJZnJlZShhcGJ1Zik7CisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBob3N0bmFtZSA9PSBOVUxMLgorICogcGFzc2l2ZSBzb2NrZXQgLT4gYW55YWRkciAoMC4wLjAuMCBvciA6OikKKyAqIG5vbi1wYXNzaXZlIHNvY2tldCAtPiBsb2NhbGhvc3QgKDEyNy4wLjAuMSBvciA6OjEpCisgKi8KK3N0YXRpYyBpbnQKK2V4cGxvcmVfbnVsbChwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKK3sKKwlpbnQgczsKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOworCWludCBlcnJvcjsKKworCSpyZXMgPSBOVUxMOworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKworCS8qCisJICogZmlsdGVyIG91dCBBRnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsCisJICogWFhYIGVycm5vPworCSAqLworCXMgPSBzb2NrZXQocGFpLT5haV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworCWlmIChzIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU1GSUxFKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWNsb3NlKHMpOworCisJLyoKKwkgKiBpZiB0aGUgc2Vydm5hbWUgZG9lcyBub3QgbWF0Y2ggc29ja3R5cGUvcHJvdG9jb2wsIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCWFmZCA9IGZpbmRfYWZkKHBhaS0+YWlfZmFtaWx5KTsKKworCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfUEFTU0lWRSkgeworCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIGFmZC0+YV9hZGRyYW55KTsKKwkJLyogeHh4IG1lYW5pbmdsZXNzPworCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImFueWFkZHIiKTsKKwkJICovCisJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOworCX0gZWxzZSB7CisJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgYWZkLT5hX2xvb3BiYWNrKTsKKwkJLyogeHh4IG1lYW5pbmdsZXNzPworCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImxvY2FsaG9zdCIpOworCQkgKi8KKwkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7CisJfQorCWN1ciA9IGN1ci0+YWlfbmV4dDsKKworCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OworCXJldHVybiAwOworCitmcmVlOgorCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogbnVtZXJpYyBob3N0bmFtZQorICovCitzdGF0aWMgaW50CitleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Cit7CisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyOworCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKKwlpbnQgZXJyb3I7CisJY2hhciBwdG9uW1BUT05fTUFYXTsKKwlpbnQgZmxhZ3M7CisKKwkqcmVzID0gTlVMTDsKKwlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKKwljdXIgPSAmc2VudGluZWw7CisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCWZsYWdzID0gcGFpLT5haV9mbGFnczsKKworCWlmIChpbmV0X3B0b24oYWZkLT5hX2FmLCBob3N0bmFtZSwgcHRvbikgPT0gMSkgeworCQl1X2ludDMyX3QgdjRhOworI2lmZGVmIElORVQ2CisJCXVfY2hhciBwZng7CisjZW5kaWYKKworCQlzd2l0Y2ggKGFmZC0+YV9hZikgeworCQljYXNlIEFGX0lORVQ6CisJCQl2NGEgPSAodV9pbnQzMl90KW50b2hsKCgoc3RydWN0IGluX2FkZHIgKilwdG9uKS0+c19hZGRyKTsKKwkJCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKwkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOworCQkJdjRhID4+PSBJTl9DTEFTU0FfTlNISUZUOworCQkJaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKKwkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOworCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXBmeCA9ICgoc3RydWN0IGluNl9hZGRyICopcHRvbiktPnM2X2FkZHJbMF07CisJCQlpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCisJCQkJZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gYWZkLT5hX2FmIHx8CisJCSAgICBwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMgLyo/Ki8pIHsKKwkJCWlmICgoZmxhZ3MgJiBBSV9DQU5PTk5BTUUpID09IDApIHsKKwkJCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIHB0b24pOworCQkJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIGlmIEFJX0NBTk9OTkFNRSBhbmQgaWYgcmV2ZXJzZSBsb29rdXAKKwkJCQkgKiBmYWlsLCByZXR1cm4gYWkgYW55d2F5IHRvIHBhY2lmeQorCQkJCSAqIGNhbGxpbmcgYXBwbGljYXRpb24uCisJCQkJICoKKwkJCQkgKiBYWFggZ2V0YWRkcmluZm8oKSBpcyBhIG5hbWUtPmFkZHJlc3MKKwkJCQkgKiB0cmFuc2xhdGlvbiBmdW5jdGlvbiwgYW5kIGl0IGxvb2tzCisJCQkJICogc3RyYW5nZSB0aGF0IHdlIGRvIGFkZHItPm5hbWUKKwkJCQkgKiB0cmFuc2xhdGlvbiBoZXJlLgorCQkJCSAqLworCQkJCWdldF9uYW1lKHB0b24sIGFmZCwgJmN1ci0+YWlfbmV4dCwKKwkJCQkJcHRvbiwgcGFpLCBzZXJ2bmFtZSk7CisJCQl9CisJCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKKwkJCQljdXIgPSBjdXItPmFpX25leHQ7CisJCX0gZWxzZQorCQkJRVJSKEVBSV9GQU1JTFkpOwkvKnh4eCovCisJfQorCisJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJcmV0dXJuIDA7CisKK2ZyZWU6CitiYWQ6CisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBudW1lcmljIGhvc3RuYW1lIHdpdGggc2NvcGUKKyAqLworc3RhdGljIGludAorZXhwbG9yZV9udW1lcmljX3Njb3BlKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworI2lmbmRlZiBTQ09QRV9ERUxJTUlURVIKKwlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOworI2Vsc2UKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJaW50IGVycm9yOworCWNoYXIgKmNwLCAqaG9zdG5hbWUyID0gTlVMTDsKKwlpbnQgc2NvcGU7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKworCS8qCisJICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7CisJaWYgKCFhZmQtPmFfc2NvcGVkKQorCQlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOworCisJY3AgPSBzdHJjaHIoaG9zdG5hbWUsIFNDT1BFX0RFTElNSVRFUik7CisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcyk7CisKKwkvKgorCSAqIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgPHNjb3BlZF9hZGRyZXNzPjxkZWxpbWl0ZXI+PHNjb3BlIGlkPgorCSAqLworCWhvc3RuYW1lMiA9IHN0cmR1cChob3N0bmFtZSk7CisJaWYgKGhvc3RuYW1lMiA9PSBOVUxMKQorCQlyZXR1cm4gRUFJX01FTU9SWTsKKwkvKiB0ZXJtaW5hdGUgYXQgdGhlIGRlbGltaXRlciAqLworCWhvc3RuYW1lMltjcCAtIGhvc3RuYW1lXSA9ICdcMCc7CisKKwljcCsrOworCXN3aXRjaCAocGFpLT5haV9mYW1pbHkpIHsKKyNpZmRlZiBJTkVUNgorCWNhc2UgQUZfSU5FVDY6CisJCXNjb3BlID0gaWZfbmFtZXRvaW5kZXgoY3ApOworCQlpZiAoc2NvcGUgPT0gMCkgeworCQkJZnJlZShob3N0bmFtZTIpOworCQkJcmV0dXJuIChFQUlfTk9OQU1FKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCX0KKworCWVycm9yID0gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUyLCBzZXJ2bmFtZSwgcmVzKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQlmb3IgKGN1ciA9ICpyZXM7IGN1cjsgY3VyID0gY3VyLT5haV9uZXh0KSB7CisJCQlpZiAoY3VyLT5haV9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCQkJY29udGludWU7CisJCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiljdXItPmFpX2FkZHI7CisJCQlpZiAoSU42X0lTX0FERFJfTElOS0xPQ0FMKCZzaW42LT5zaW42X2FkZHIpIHx8CisJCQkgICAgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKCZzaW42LT5zaW42X2FkZHIpKQorCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzY29wZTsKKwkJfQorCX0KKworCWZyZWUoaG9zdG5hbWUyKTsKKworCXJldHVybiBlcnJvcjsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitnZXRfbmFtZShhZGRyLCBhZmQsIHJlcywgbnVtYWRkciwgcGFpLCBzZXJ2bmFtZSkKKwljb25zdCBjaGFyICphZGRyOworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7CisJY2hhciAqbnVtYWRkcjsKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKmFwID0gTlVMTCwgKmNuID0gTlVMTDsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpbnQgaF9lcnJvcjsKKworCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYsICZoX2Vycm9yKTsKKyNlbHNlCisJaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYpOworI2VuZGlmCisJaWYgKGhwICYmIGhwLT5oX25hbWUgJiYgaHAtPmhfbmFtZVswXSAmJiBocC0+aF9hZGRyX2xpc3RbMF0pIHsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwkJR0VUX0FJKGN1ciwgYWZkLCBocC0+aF9hZGRyX2xpc3RbMF0pOworCQlHRVRfUE9SVChjdXIsIHNlcnZuYW1lKTsKKwkJR0VUX0NBTk9OTkFNRShjdXIsIGhwLT5oX25hbWUpOworI2Vsc2UKKwkJLyogaHAgd2lsbCBiZSBkYW1hZ2VkIGlmIHdlIHVzZSBnZXRob3N0YnlhZGRyKCkgKi8KKwkJaWYgKChhcCA9IChjaGFyICopbWFsbG9jKGhwLT5oX2xlbmd0aCkpID09IE5VTEwpIHsKKwkJCWVycm9yID0gRUFJX01FTU9SWTsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCQltZW1jcHkoYXAsIGhwLT5oX2FkZHJfbGlzdFswXSwgaHAtPmhfbGVuZ3RoKTsKKwkJaWYgKChjbiA9IHN0cmR1cChocC0+aF9uYW1lKSkgPT0gTlVMTCkgeworCQkJZXJyb3IgPSBFQUlfTUVNT1JZOworCQkJZ290byBmcmVlOworCQl9CisKKwkJR0VUX0FJKGN1ciwgYWZkLCBhcCk7CisJCUdFVF9QT1JUKGN1ciwgc2Vydm5hbWUpOworCQlHRVRfQ0FOT05OQU1FKGN1ciwgY24pOworCQlmcmVlKGFwKTsgYXAgPSBOVUxMOworCQlmcmVlKGNuKTsgY24gPSBOVUxMOworI2VuZGlmCisJfSBlbHNlIHsKKwkJR0VUX0FJKGN1ciwgYWZkLCBudW1hZGRyKTsKKwkJR0VUX1BPUlQoY3VyLCBzZXJ2bmFtZSk7CisJfQorCisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaWYgKGhwKQorCQlmcmVlaG9zdGVudChocCk7CisjZW5kaWYKKwkqcmVzID0gY3VyOworCXJldHVybiBTVUNDRVNTOworIGZyZWU6CisJaWYgKGN1cikKKwkJZnJlZWFkZHJpbmZvKGN1cik7CisJaWYgKGFwKQorCQlmcmVlKGFwKTsKKwlpZiAoY24pCisJCWZyZWUoY24pOworI2lmZGVmIFVTRV9HRVRJUE5PREVCWQorCWlmIChocCkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJKnJlcyA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitnZXRfY2Fub25uYW1lKHBhaSwgYWksIHN0cikKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCWNvbnN0IGNoYXIgKnN0cjsKK3sKKwlpZiAoKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpICE9IDApIHsKKwkJYWktPmFpX2Nhbm9ubmFtZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzdHIpICsgMSk7CisJCWlmIChhaS0+YWlfY2Fub25uYW1lID09IE5VTEwpCisJCQlyZXR1cm4gRUFJX01FTU9SWTsKKwkJc3RyY3B5KGFpLT5haV9jYW5vbm5hbWUsIHN0cik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJpbmZvICoKK2dldF9haShwYWksIGFmZCwgYWRkcikKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJY29uc3QgY2hhciAqYWRkcjsKK3sKKwljaGFyICpwOworCXN0cnVjdCBhZGRyaW5mbyAqYWk7CisKKwlhaSA9IChzdHJ1Y3QgYWRkcmluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykKKwkJKyAoYWZkLT5hX3NvY2tsZW4pKTsKKwlpZiAoYWkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpOworCWFpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKShhaSArIDEpOworCW1lbXNldChhaS0+YWlfYWRkciwgMCwgYWZkLT5hX3NvY2tsZW4pOworI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisJYWktPmFpX2FkZHItPnNhX2xlbiA9IGFmZC0+YV9zb2NrbGVuOworI2VuZGlmCisJYWktPmFpX2FkZHJsZW4gPSBhZmQtPmFfc29ja2xlbjsKKwlhaS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gYWktPmFpX2ZhbWlseSA9IGFmZC0+YV9hZjsKKwlwID0gKGNoYXIgKikoYWktPmFpX2FkZHIpOworCW1lbWNweShwICsgYWZkLT5hX29mZiwgYWRkciwgYWZkLT5hX2FkZHJsZW4pOworCXJldHVybiBhaTsKK30KKworc3RhdGljIGludAorZ2V0X3BvcnRtYXRjaChhaSwgc2Vydm5hbWUpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICphaTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKK3sKKworCS8qIGdldF9wb3J0IGRvZXMgbm90IHRvdWNoIGZpcnN0IGFyZ3VtZW50LiB3aGVuIG1hdGNob25seSA9PSAxLiAqLworCXJldHVybiBnZXRfcG9ydCgoc3RydWN0IGFkZHJpbmZvICopYWksIHNlcnZuYW1lLCAxKTsKK30KKworc3RhdGljIGludAorZ2V0X3BvcnQoYWksIHNlcnZuYW1lLCBtYXRjaG9ubHkpCisJc3RydWN0IGFkZHJpbmZvICphaTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKKwlpbnQgbWF0Y2hvbmx5OworeworCWNvbnN0IGNoYXIgKnByb3RvOworCXN0cnVjdCBzZXJ2ZW50ICpzcDsKKwlpbnQgcG9ydDsKKwlpbnQgYWxsb3dudW1lcmljOworCisJaWYgKHNlcnZuYW1lID09IE5VTEwpCisJCXJldHVybiAwOworCXN3aXRjaCAoYWktPmFpX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKyNpZmRlZiBBRl9JTkVUNgorCWNhc2UgQUZfSU5FVDY6CisjZW5kaWYKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChhaS0+YWlfc29ja3R5cGUpIHsKKwljYXNlIFNPQ0tfUkFXOgorCQlyZXR1cm4gRUFJX1NFUlZJQ0U7CisJY2FzZSBTT0NLX0RHUkFNOgorCWNhc2UgU09DS19TVFJFQU06CisJCWFsbG93bnVtZXJpYyA9IDE7CisJCWJyZWFrOworCWNhc2UgQU5ZOgorCQlhbGxvd251bWVyaWMgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRUFJX1NPQ0tUWVBFOworCX0KKworCWlmIChzdHJfaXNudW1iZXIoc2Vydm5hbWUpKSB7CisJCWlmICghYWxsb3dudW1lcmljKQorCQkJcmV0dXJuIEVBSV9TRVJWSUNFOworCQlwb3J0ID0gaHRvbnMoYXRvaShzZXJ2bmFtZSkpOworCQlpZiAocG9ydCA8IDAgfHwgcG9ydCA+IDY1NTM1KQorCQkJcmV0dXJuIEVBSV9TRVJWSUNFOworCX0gZWxzZSB7CisJCXN3aXRjaCAoYWktPmFpX3NvY2t0eXBlKSB7CisJCWNhc2UgU09DS19ER1JBTToKKwkJCXByb3RvID0gInVkcCI7CisJCQlicmVhazsKKwkJY2FzZSBTT0NLX1NUUkVBTToKKwkJCXByb3RvID0gInRjcCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByb3RvID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzcCA9IGdldHNlcnZieW5hbWUoc2Vydm5hbWUsIHByb3RvKSkgPT0gTlVMTCkKKwkJCXJldHVybiBFQUlfU0VSVklDRTsKKwkJcG9ydCA9IHNwLT5zX3BvcnQ7CisJfQorCisJaWYgKCFtYXRjaG9ubHkpIHsKKwkJc3dpdGNoIChhaS0+YWlfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopYWktPmFpX2FkZHIpLT5zaW5fcG9ydCA9IHBvcnQ7CisJCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCQljYXNlIEFGX0lORVQ2OgorCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWktPmFpX2FkZHIpLT5zaW42X3BvcnQgPSBwb3J0OworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmZCAqCitmaW5kX2FmZChhZikKKwlpbnQgYWY7Cit7CisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCisJaWYgKGFmID09IFBGX1VOU1BFQykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChhZmQgPSBhZmRsOyBhZmQtPmFfYWY7IGFmZCsrKSB7CisJCWlmIChhZmQtPmFfYWYgPT0gYWYpCisJCQlyZXR1cm4gYWZkOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL21pc3NpbmcvZ2V0bmFtZWluZm8uYyBiL21pc3NpbmcvZ2V0bmFtZWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ1YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9nZXRuYW1laW5mby5jCkBAIC0wLDAgKzEsMjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogSXNzdWVzIHRvIGJlIGRpc2N1c3NlZDoKKyAqIC0gVGhyZWFkIHNhZmUtbmVzcyBtdXN0IGJlIGNoZWNrZWQKKyAqIC0gUmV0dXJuIHZhbHVlcy4gIFRoZXJlIHNlZW1zIHRvIGJlIG5vIHN0YW5kYXJkIGZvciByZXR1cm4gdmFsdWUgKFJGQzI1NTMpCisgKiAgIGJ1dCBJTlJJQSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIEVBSV94eHggZGVmaW5lZCBmb3IgZ2V0YWRkcmluZm8oKS4KKyAqIC0gUkZDMjU1MyBzYXlzIHRoYXQgd2Ugc2hvdWxkIHJhaXNlIGVycm9yIG9uIHNob3J0IGJ1ZmZlci4gIFgvT3BlbiBzYXlzCisgKiAgIHdlIG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHJlc3VsdC4gIFdlIG9iZXkgUkZDMjU1MyAoYW5kIFgvT3BlbiBzaG91bGQgYmUKKyAqICAgbW9kaWZpZWQpLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3NpbmcvZ2V0bmFtZWluZm8uYyx2IDEuMTEgMjAwMy8xMS8xNiAwOTozNjo0OSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGFycGEvbmFtZXNlci5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8cmVzb2x2Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIE5FRURfQUREUklORk9fSAorI2luY2x1ZGUgImFkZHJpbmZvLmgiCisjZW5kaWYKKworI2RlZmluZSBTVUNDRVNTIDAKKyNkZWZpbmUgQU5ZIDAKKyNkZWZpbmUgWUVTIDEKKyNkZWZpbmUgTk8gIDAKKworc3RhdGljIHN0cnVjdCBhZmQgeworCWludCBhX2FmOworCWludCBhX2FkZHJsZW47CisJaW50IGFfc29ja2xlbjsKKwlpbnQgYV9vZmY7Cit9IGFmZGwgW10gPSB7CisjaWZkZWYgSU5FVDYKKwl7UEZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCisJCW9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkcil9LAorI2VuZGlmCisJe1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKX0sCisJezAsIDAsIDB9LAorfTsKKworc3RydWN0IHNvY2tpbmV0IHsKKwl1X2NoYXIJc2lfbGVuOworCXVfY2hhcglzaV9mYW1pbHk7CisJdV9zaG9ydAlzaV9wb3J0OworfTsKKworI2RlZmluZSBFTklfTk9TT0NLRVQgCTAKKyNkZWZpbmUgRU5JX05PU0VSVk5BTUUJMQorI2RlZmluZSBFTklfTk9IT1NUTkFNRQkyCisjZGVmaW5lIEVOSV9NRU1PUlkJMworI2RlZmluZSBFTklfU1lTVEVNCTQKKyNkZWZpbmUgRU5JX0ZBTUlMWQk1CisjZGVmaW5lIEVOSV9TQUxFTgk2CisKK2ludAorZ2V0bmFtZWluZm8oc2EsIHNhbGVuLCBob3N0LCBob3N0bGVuLCBzZXJ2LCBzZXJ2bGVuLCBmbGFncykKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhOworCXNpemVfdCBzYWxlbjsKKwljaGFyICpob3N0OworCXNpemVfdCBob3N0bGVuOworCWNoYXIgKnNlcnY7CisJc2l6ZV90IHNlcnZsZW47CisJaW50IGZsYWdzOworeworCXN0cnVjdCBhZmQgKmFmZDsKKwlzdHJ1Y3Qgc2VydmVudCAqc3A7CisJc3RydWN0IGhvc3RlbnQgKmhwOworCXVfc2hvcnQgcG9ydDsKKwlpbnQgZmFtaWx5LCBpOworCWNoYXIgKmFkZHIsICpwOworCXVfaW50MzJfdCB2NGE7CisJaW50IGhfZXJyb3I7CisJY2hhciBudW1zZXJ2WzUxMl07CisJY2hhciBudW1hZGRyWzUxMl07CisKKwlpZiAoc2EgPT0gTlVMTCkKKwkJcmV0dXJuIEVOSV9OT1NPQ0tFVDsKKworI2lmZGVmIEhBVkVfU0FfTEVOCS8qWFhYKi8KKwlpZiAoc2EtPnNhX2xlbiAhPSBzYWxlbikKKwkJcmV0dXJuIEVOSV9TQUxFTjsKKyNlbmRpZgorCisJZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKKwlmb3IgKGkgPSAwOyBhZmRsW2ldLmFfYWY7IGkrKykKKwkJaWYgKGFmZGxbaV0uYV9hZiA9PSBmYW1pbHkpIHsKKwkJCWFmZCA9ICZhZmRsW2ldOworCQkJZ290byBmb3VuZDsKKwkJfQorCXJldHVybiBFTklfRkFNSUxZOworCisgZm91bmQ6CisJaWYgKHNhbGVuICE9IGFmZC0+YV9zb2NrbGVuKQorCQlyZXR1cm4gRU5JX1NBTEVOOworCisJcG9ydCA9ICgoc3RydWN0IHNvY2tpbmV0ICopc2EpLT5zaV9wb3J0OyAvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlhZGRyID0gKGNoYXIgKilzYSArIGFmZC0+YV9vZmY7CisKKwlpZiAoc2VydiA9PSBOVUxMIHx8IHNlcnZsZW4gPT0gMCkgeworCQkvKgorCQkgKiBkbyBub3RoaW5nIGluIHRoaXMgY2FzZS4KKwkJICogaW4gY2FzZSB5b3UgYXJlIHdvbmRlcmluZyBpZiAiJiYiIGlzIG1vcmUgY29ycmVjdCB0aGFuCisJCSAqICJ8fCIgaGVyZTogUkZDMjU1MyBzYXlzIHRoYXQgc2VydiA9PSBOVUxMIE9SIHNlcnZsZW4gPT0gMAorCQkgKiBtZWFucyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgcmVzdWx0LgorCQkgKi8KKwl9IGVsc2UgeworCQlpZiAoZmxhZ3MgJiBOSV9OVU1FUklDU0VSVikKKwkJCXNwID0gTlVMTDsKKwkJZWxzZSB7CisJCQlzcCA9IGdldHNlcnZieXBvcnQocG9ydCwKKwkJCQkoZmxhZ3MgJiBOSV9ER1JBTSkgPyAidWRwIiA6ICJ0Y3AiKTsKKwkJfQorCQlpZiAoc3ApIHsKKwkJCWlmIChzdHJsZW4oc3AtPnNfbmFtZSkgKyAxID4gc2VydmxlbikKKwkJCQlyZXR1cm4gRU5JX01FTU9SWTsKKwkJCXN0cmNweShzZXJ2LCBzcC0+c19uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXNucHJpbnRmKG51bXNlcnYsIHNpemVvZihudW1zZXJ2KSwgIiVkIiwgbnRvaHMocG9ydCkpOworCQkJaWYgKHN0cmxlbihudW1zZXJ2KSArIDEgPiBzZXJ2bGVuKQorCQkJCXJldHVybiBFTklfTUVNT1JZOworCQkJc3RyY3B5KHNlcnYsIG51bXNlcnYpOworCQl9CisJfQorCisJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQl2NGEgPSAodV9pbnQzMl90KQorCQkJbnRvaGwoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkcik7CisJCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKwkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworCQl2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7CisJCWlmICh2NGEgPT0gMCkKKwkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgQUZfSU5FVDY6CisJICAgIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2E7CisJCXN3aXRjaCAoc2luNi0+c2luNl9hZGRyLnM2X2FkZHJbMF0pIHsKKwkJY2FzZSAweDAwOgorCQkJaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKCZzaW42LT5zaW42X2FkZHIpKQorCQkJCTsKKwkJCWVsc2UgaWYgKElONl9JU19BRERSX0xPT1BCQUNLKCZzaW42LT5zaW42X2FkZHIpKQorCQkJCTsKKwkJCWVsc2UKKwkJCQlmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKElONl9JU19BRERSX0xJTktMT0NBTCgmc2luNi0+c2luNl9hZGRyKSkgeworCQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworCQkJfQorCQkJZWxzZSBpZiAoSU42X0lTX0FERFJfTVVMVElDQVNUKCZzaW42LT5zaW42X2FkZHIpKQorCQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworCQkJYnJlYWs7CisJCX0KKwkgICAgfQorCQlicmVhazsKKyNlbmRpZgorCX0KKwlpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3RsZW4gPT0gMCkgeworCQkvKgorCQkgKiBkbyBub3RoaW5nIGluIHRoaXMgY2FzZS4KKwkJICogaW4gY2FzZSB5b3UgYXJlIHdvbmRlcmluZyBpZiAiJiYiIGlzIG1vcmUgY29ycmVjdCB0aGFuCisJCSAqICJ8fCIgaGVyZTogUkZDMjU1MyBzYXlzIHRoYXQgaG9zdCA9PSBOVUxMIE9SIGhvc3RsZW4gPT0gMAorCQkgKiBtZWFucyB0aGF0IHRoZSBjYWxsZXIgZG9lcyBub3Qgd2FudCB0aGUgcmVzdWx0LgorCQkgKi8KKwl9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKKwkJLyogTlVNRVJJQ0hPU1QgYW5kIE5BTUVSRVFEIGNvbmZsaWN0cyB3aXRoIGVhY2ggb3RoZXIgKi8KKwkJaWYgKGZsYWdzICYgTklfTkFNRVJFUUQpCisJCQlyZXR1cm4gRU5JX05PSE9TVE5BTUU7CisJCWlmIChpbmV0X250b3AoYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCisJCSAgICA9PSBOVUxMKQorCQkJcmV0dXJuIEVOSV9TWVNURU07CisJCWlmIChzdHJsZW4obnVtYWRkcikgKyAxID4gaG9zdGxlbikKKwkJCXJldHVybiBFTklfTUVNT1JZOworCQlzdHJjcHkoaG9zdCwgbnVtYWRkcik7CisjaWYgZGVmaW5lZChJTkVUNikgJiYgZGVmaW5lZChOSV9XSVRIU0NPUEVJRCkKKwkJaWYgKGFmZC0+YV9hZiA9PSBBRl9JTkVUNiAmJgorCQkgICAgKElONl9JU19BRERSX0xJTktMT0NBTCgoc3RydWN0IGluNl9hZGRyICopYWRkcikgfHwKKwkJICAgICBJTjZfSVNfQUREUl9NVUxUSUNBU1QoKHN0cnVjdCBpbjZfYWRkciAqKWFkZHIpKSAmJgorCQkgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X3Njb3BlX2lkKSB7CisjaWZuZGVmIEFMV0FZU19XSVRIU0NPUEUKKwkJCWlmIChmbGFncyAmIE5JX1dJVEhTQ09QRUlEKQorI2VuZGlmIC8qICFBTFdBWVNfV0lUSFNDT1BFICovCisJCQl7CisJCQkJY2hhciAqZXAgPSBzdHJjaHIoaG9zdCwgJ1wwJyk7CisJCQkJdW5zaWduZWQgaW50IGlmaW5kZXggPQorCQkJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfc2NvcGVfaWQ7CisKKwkJCQkqZXAgPSBTQ09QRV9ERUxJTUlURVI7CisJCQkJaWYgKChpZl9pbmRleHRvbmFtZShpZmluZGV4LCBlcCArIDEpKSA9PSBOVUxMKQorCQkJCQkvKiBYWFggd2hhdCBzaG91bGQgd2UgZG8/ICovCisJCQkJCXN0cm5jcHkoZXAgKyAxLCAiPz8/IiwgMyk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBJTkVUNiAqLworCX0gZWxzZSB7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYsICZoX2Vycm9yKTsKKyNlbHNlCisJCWhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBhZmQtPmFfYWRkcmxlbiwgYWZkLT5hX2FmKTsKKyNpZmRlZiBIQVZFX0hfRVJSTk8KKwkJaF9lcnJvciA9IGhfZXJybm87CisjZWxzZQorCQloX2Vycm9yID0gRUlOVkFMOworI2VuZGlmCisjZW5kaWYKKworCQlpZiAoaHApIHsKKwkJCWlmIChmbGFncyAmIE5JX05PRlFETikgeworCQkJCXAgPSBzdHJjaHIoaHAtPmhfbmFtZSwgJy4nKTsKKwkJCQlpZiAocCkgKnAgPSAnXDAnOworCQkJfQorCQkJaWYgKHN0cmxlbihocC0+aF9uYW1lKSArIDEgPiBob3N0bGVuKSB7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJCQkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJCQkJcmV0dXJuIEVOSV9NRU1PUlk7CisJCQl9CisJCQlzdHJjcHkoaG9zdCwgaHAtPmhfbmFtZSk7CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJCQlmcmVlaG9zdGVudChocCk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWlmIChmbGFncyAmIE5JX05BTUVSRVFEKQorCQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKKwkJCWlmIChpbmV0X250b3AoYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCisJCQkgICAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gRU5JX05PSE9TVE5BTUU7CisJCQlpZiAoc3RybGVuKG51bWFkZHIpICsgMSA+IGhvc3RsZW4pCisJCQkJcmV0dXJuIEVOSV9NRU1PUlk7CisJCQlzdHJjcHkoaG9zdCwgbnVtYWRkcik7CisJCX0KKwl9CisJcmV0dXJuIFNVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNzaW5nL2luZXRfYXRvbi5jIGIvbWlzc2luZy9pbmV0X2F0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGIyZWViCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9pbmV0X2F0b24uYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEt1bmdsaWdhIFRla25pc2thCisgKiAgICAgIEj2Z3Nrb2xhbiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qICRJZDogaW5ldF9hdG9uLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjo0OSBndXkgRXhwICQgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3NpbmcvaW5ldF9hdG9uLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjo0OSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisvKiBNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGluZXRfYXRvbi4KKyAqIENhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhaWx1cmUgYW5kIGEgbG9jYWwgYnJvYWRjYXN0IGFkZHJlc3MuICovCisKKyNpZm5kZWYgSU5BRERSX05PTkUKKyNkZWZpbmUgSU5BRERSX05PTkUgMHhmZmZmZmZmZgorI2VuZGlmCisKK2ludAoraW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKK3sKKyAgYWRkci0+c19hZGRyID0gaW5ldF9hZGRyKGNwKTsKKyAgcmV0dXJuIChhZGRyLT5zX2FkZHIgPT0gSU5BRERSX05PTkUpID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9taXNzaW5nL2luZXRfbnRvcC5jIGIvbWlzc2luZy9pbmV0X250b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmJiYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9pbmV0X250b3AuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQorICogICAgICBI9mdza29sYW4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAkSWQ6IGluZXRfbnRvcC5jLHYgMS44IDIwMDUvMDIvMDkgMDI6MjU6NDYgZ3V5IEV4cCAkICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL2luZXRfbnRvcC5jLHYgMS44IDIwMDUvMDIvMDkgMDI6MjU6NDYgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyoKKyAqCisgKi8KKworI2lmbmRlZiBJTjZBRERSU1oKKyNkZWZpbmUgSU42QUREUlNaICAgMTYgICAvKiBJUHY2IFRfQUFBQSAqLworI2VuZGlmCisKKyNpZm5kZWYgSU5UMTZTWgorI2RlZmluZSBJTlQxNlNaICAgICAyICAgIC8qIHdvcmQgc2l6ZSAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcF92NCAoY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKQoreworICAgIGNvbnN0IGNoYXIgZGlnaXRzW10gPSAiMDEyMzQ1Njc4OSI7CisgICAgaW50IGk7CisgICAgc3RydWN0IGluX2FkZHIgKmFkZHIgPSAoc3RydWN0IGluX2FkZHIgKilzcmM7CisgICAgdV9sb25nIGEgPSBudG9obChhZGRyLT5zX2FkZHIpOworICAgIGNvbnN0IGNoYXIgKm9yaWdfZHN0ID0gZHN0OworCisgICAgaWYgKHNpemUgPCBJTkVUX0FERFJTVFJMRU4pIHsKKwllcnJubyA9IEVOT1NQQzsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworCWludCBuID0gKGEgPj4gKDI0IC0gaSAqIDgpKSAmIDB4RkY7CisJaW50IG5vbl96ZXJvcCA9IDA7CisKKwlpZiAobm9uX3plcm9wIHx8IG4gLyAxMDAgPiAwKSB7CisJICAgICpkc3QrKyA9IGRpZ2l0c1tuIC8gMTAwXTsKKwkgICAgbiAlPSAxMDA7CisJICAgIG5vbl96ZXJvcCA9IDE7CisJfQorCWlmIChub25femVyb3AgfHwgbiAvIDEwID4gMCkgeworCSAgICAqZHN0KysgPSBkaWdpdHNbbiAvIDEwXTsKKwkgICAgbiAlPSAxMDsKKwkgICAgbm9uX3plcm9wID0gMTsKKwl9CisJKmRzdCsrID0gZGlnaXRzW25dOworCWlmIChpICE9IDMpCisJICAgICpkc3QrKyA9ICcuJzsKKyAgICB9CisgICAgKmRzdCsrID0gJ1wwJzsKKyAgICByZXR1cm4gb3JpZ19kc3Q7Cit9CisKKyNpZmRlZiBJTkVUNgorLyoKKyAqIENvbnZlcnQgSVB2NiBiaW5hcnkgYWRkcmVzcyBpbnRvIHByZXNlbnRhdGlvbiAocHJpbnRhYmxlKSBmb3JtYXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcF92NiAoY29uc3QgdV9jaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpCit7CisgIC8qCisgICAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorICAgKiB0byBjb250YWluIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzaXplLiAgT24gc29tZSBzeXN0ZW1zLCBsaWtlCisgICAqIENyYXlzLCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIGludGVnZXIgdmFyaWFibGUgd2l0aCAxNiBiaXRzLgorICAgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisgICAqIHRvIHVzZSBwb2ludGVyIG92ZXJsYXlzLiAgQWxsIHRoZSB3b3JsZCdzIG5vdCBhIFZBWC4KKyAgICovCisgIGNoYXIgIHRtcCBbSU5FVDZfQUREUlNUUkxFTisxXTsKKyAgY2hhciAqdHA7CisgIHN0cnVjdCB7CisgICAgbG9uZyBiYXNlOworICAgIGxvbmcgbGVuOworICB9IGJlc3QsIGN1cjsKKyAgdV9sb25nIHdvcmRzIFtJTjZBRERSU1ogLyBJTlQxNlNaXTsKKyAgaW50ICAgIGk7CisKKyAgLyogUHJlcHJvY2VzczoKKyAgICogIENvcHkgdGhlIGlucHV0IChieXRld2lzZSkgYXJyYXkgaW50byBhIHdvcmR3aXNlIGFycmF5LgorICAgKiAgRmluZCB0aGUgbG9uZ2VzdCBydW4gb2YgMHgwMCdzIGluIHNyY1tdIGZvciA6OiBzaG9ydGhhbmRpbmcuCisgICAqLworICBtZW1zZXQgKHdvcmRzLCAwLCBzaXplb2Yod29yZHMpKTsKKyAgZm9yIChpID0gMDsgaSA8IElONkFERFJTWjsgaSsrKQorICAgICAgd29yZHNbaS8yXSB8PSAoc3JjW2ldIDw8ICgoMSAtIChpICUgMikpIDw8IDMpKTsKKworICBiZXN0LmJhc2UgPSAtMTsKKyAgY3VyLmJhc2UgID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCAoSU42QUREUlNaIC8gSU5UMTZTWik7IGkrKykKKyAgeworICAgIGlmICh3b3Jkc1tpXSA9PSAwKQorICAgIHsKKyAgICAgIGlmIChjdXIuYmFzZSA9PSAtMSkKKyAgICAgICAgICAgY3VyLmJhc2UgPSBpLCBjdXIubGVuID0gMTsKKyAgICAgIGVsc2UgY3VyLmxlbisrOworICAgIH0KKyAgICBlbHNlIGlmIChjdXIuYmFzZSAhPSAtMSkKKyAgICB7CisgICAgICBpZiAoYmVzdC5iYXNlID09IC0xIHx8IGN1ci5sZW4gPiBiZXN0LmxlbikKKyAgICAgICAgIGJlc3QgPSBjdXI7CisgICAgICBjdXIuYmFzZSA9IC0xOworICAgIH0KKyAgfQorICBpZiAoKGN1ci5iYXNlICE9IC0xKSAmJiAoYmVzdC5iYXNlID09IC0xIHx8IGN1ci5sZW4gPiBiZXN0LmxlbikpCisgICAgIGJlc3QgPSBjdXI7CisgIGlmIChiZXN0LmJhc2UgIT0gLTEgJiYgYmVzdC5sZW4gPCAyKQorICAgICBiZXN0LmJhc2UgPSAtMTsKKworICAvKiBGb3JtYXQgdGhlIHJlc3VsdC4KKyAgICovCisgIHRwID0gdG1wOworICBmb3IgKGkgPSAwOyBpIDwgKElONkFERFJTWiAvIElOVDE2U1opOyBpKyspCisgIHsKKyAgICAvKiBBcmUgd2UgaW5zaWRlIHRoZSBiZXN0IHJ1biBvZiAweDAwJ3M/CisgICAgICovCisgICAgaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBpID49IGJlc3QuYmFzZSAmJiBpIDwgKGJlc3QuYmFzZSArIGJlc3QubGVuKSkKKyAgICB7CisgICAgICBpZiAoaSA9PSBiZXN0LmJhc2UpCisgICAgICAgICAqdHArKyA9ICc6JzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEFyZSB3ZSBmb2xsb3dpbmcgYW4gaW5pdGlhbCBydW4gb2YgMHgwMHMgb3IgYW55IHJlYWwgaGV4PworICAgICAqLworICAgIGlmIChpICE9IDApCisgICAgICAgKnRwKysgPSAnOic7CisKKyAgICAvKiBJcyB0aGlzIGFkZHJlc3MgYW4gZW5jYXBzdWxhdGVkIElQdjQ/CisgICAgICovCisgICAgaWYgKGkgPT0gNiAmJiBiZXN0LmJhc2UgPT0gMCAmJgorICAgICAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkKKyAgICB7CisgICAgICBpZiAoIWluZXRfbnRvcF92NChzcmMrMTIsIHRwLCBzaXplb2YodG1wKSAtICh0cCAtIHRtcCkpKQorICAgICAgeworICAgICAgICBlcnJubyA9IEVOT1NQQzsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICAgIH0KKyAgICAgIHRwICs9IHN0cmxlbih0cCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdHAgKz0gc3ByaW50ZiAodHAsICIlbFgiLCB3b3Jkc1tpXSk7CisgIH0KKworICAvKiBXYXMgaXQgYSB0cmFpbGluZyBydW4gb2YgMHgwMCdzPworICAgKi8KKyAgaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiAoYmVzdC5iYXNlICsgYmVzdC5sZW4pID09IChJTjZBRERSU1ogLyBJTlQxNlNaKSkKKyAgICAgKnRwKysgPSAnOic7CisgICp0cCsrID0gJ1wwJzsKKworICAvKiBDaGVjayBmb3Igb3ZlcmZsb3csIGNvcHksIGFuZCB3ZSdyZSBkb25lLgorICAgKi8KKyAgaWYgKChzaXplX3QpKHRwIC0gdG1wKSA+IHNpemUpCisgIHsKKyAgICBlcnJubyA9IEVOT1NQQzsKKyAgICByZXR1cm4gKE5VTEwpOworICB9CisgIHJldHVybiBzdHJjcHkgKGRzdCwgdG1wKTsKKyAgcmV0dXJuIChOVUxMKTsKK30KKyNlbmRpZiAgIC8qIElORVQ2ICovCisKKworY29uc3QgY2hhciAqCitpbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUpCit7CisgICAgc3dpdGNoIChhZikgeworICAgIGNhc2UgQUZfSU5FVCA6CisJcmV0dXJuIGluZXRfbnRvcF92NCAoc3JjLCBkc3QsIHNpemUpOworI2lmZGVmIElORVQ2CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgIHJldHVybiBpbmV0X250b3BfdjYgKChjb25zdCB1X2NoYXIqKXNyYywgZHN0LCBzaXplKTsKKyNlbmRpZgorICAgIGRlZmF1bHQgOgorCWVycm5vID0gRUFGTk9TVVBQT1JUOworCXJldHVybiBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21pc3NpbmcvaW5ldF9wdG9uLmMgYi9taXNzaW5nL2luZXRfcHRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGFiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL2luZXRfcHRvbi5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgS3VuZ2xpZ2EgVGVrbmlza2EKKyAqICAgICAgSPZnc2tvbGFuIGFuZCBpdHMgY29udHJpYnV0b3JzLgorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogJElkOiBpbmV0X3B0b24uYyx2IDEuNiAyMDAzLzExLzE2IDA5OjM2OjUxIGd1eSBFeHAgJCAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9pbmV0X3B0b24uYyx2IDEuNiAyMDAzLzExLzE2IDA5OjM2OjUxIGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCitpbnQKK2luZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqZHN0KQoreworICAgIGlmIChhZiAhPSBBRl9JTkVUKSB7CisJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaW5ldF9hdG9uIChzcmMsIGRzdCk7Cit9CmRpZmYgLS1naXQgYS9taXNzaW5nL3Jlc29sdjYuaCBiL21pc3NpbmcvcmVzb2x2Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWUwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL3Jlc29sdjYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBSZXNvbHZlciBvcHRpb25zIGZvciBJUHY2LgorICogWFhYOiB0aGlzIHNob3VsZCBiZSBpbiBhbiBvZmZpY2FsIGluY2x1ZGUgZmlsZS4gVGhlcmUgbWF5IGJlIGNvbmZsaWN0cy4uLgorICovCisjaWZuZGVmIEhBVkVfUkVTX1VTRV9JTkVUNgorI2RlZmluZQlSRVNfVVNFX0lORVQ2CTB4ODAwMDAwMDAJLyogdXNlL21hcCBJUHY2IGluIGdldGhvc3RieW5hbWUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9taXNzaW5nL3Jlc29sdl9leHQuaCBiL21pc3NpbmcvcmVzb2x2X2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzUzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL3Jlc29sdl9leHQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTUFYUkVTT0xWU09SVAkJLyogWFhYICovCisjZGVmaW5lCU1BWFJFU09MVlNPUlQJCTEwCS8qIG51bWJlciBvZiBuZXQgdG8gc29ydCBvbiAqLworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUCitzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBuc2FkZHJfbGlzdFtNQVhOU107CisJc3RydWN0IHsKKwkJaW50IGFmOwkJLyogYWRkcmVzcyBmYW1pbHkgZm9yIGFkZHIsIG1hc2sgKi8KKwkJdW5pb24geworCQkJc3RydWN0IGluX2FkZHIgaW5hOworI2lmZGVmIElORVQ2CisJCQlzdHJ1Y3QgaW42X2FkZHIgaW42YTsKKyNlbmRpZgorCQl9IGFkZHIsIG1hc2s7CisJfSBzb3J0X2xpc3RbTUFYUkVTT0xWU09SVF07Cit9OworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0IF9yZXNfZXh0OwpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zbnByaW50Zi5jIGIvbWlzc2luZy9zbnByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmJiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL3NucHJpbnRmLmMKQEAgLTAsMCArMSw2MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KKyAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogJElkOiBzbnByaW50Zi5jLHYgMS44IDIwMDMvMTEvMTYgMDk6MzY6NTEgZ3V5IEV4cCAkICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3Npbmcvc25wcmludGYuYyx2IDEuOCAyMDAzLzExLzE2IDA5OjM2OjUxIGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGludGVyZmFjZS5oPgorCitlbnVtIGZvcm1hdF9mbGFncyB7CisgICAgbWludXNfZmxhZyAgICAgPSAgMSwKKyAgICBwbHVzX2ZsYWcgICAgICA9ICAyLAorICAgIHNwYWNlX2ZsYWcgICAgID0gIDQsCisgICAgYWx0ZXJuYXRlX2ZsYWcgPSAgOCwKKyAgICB6ZXJvX2ZsYWcgICAgICA9IDE2Cit9OworCisvKgorICogQ29tbW9uIHN0YXRlCisgKi8KKworc3RydWN0IHN0YXRlIHsKKyAgdW5zaWduZWQgY2hhciAqc3RyOworICB1bnNpZ25lZCBjaGFyICpzOworICB1bnNpZ25lZCBjaGFyICp0aGVlbmQ7CisgIHNpemVfdCBzejsKKyAgc2l6ZV90IG1heF9zejsKKyAgaW50ICgqYXBwZW5kX2NoYXIpKHN0cnVjdCBzdGF0ZSAqLCB1bnNpZ25lZCBjaGFyKTsKKyAgaW50ICgqcmVzZXJ2ZSkoc3RydWN0IHN0YXRlICosIHNpemVfdCk7CisgIC8qIFhYWCAtIG1ldGhvZHMgKi8KK307CisKKyNpZm5kZWYgSEFWRV9WU05QUklOVEYKK3N0YXRpYyBpbnQKK3NuX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQoreworICByZXR1cm4gc3RhdGUtPnMgKyBuID4gc3RhdGUtPnRoZWVuZDsKK30KKworc3RhdGljIGludAorc25fYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgaWYgKHNuX3Jlc2VydmUgKHN0YXRlLCAxKSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgICpzdGF0ZS0+cysrID0gYzsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgaW50Cithc19yZXNlcnZlIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBzaXplX3QgbikKK3sKKyAgaWYgKHN0YXRlLT5zICsgbiA+IHN0YXRlLT50aGVlbmQpIHsKKyAgICBpbnQgb2ZmID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOworICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKKworICAgIGlmIChzdGF0ZS0+bWF4X3N6ICYmIHN0YXRlLT5zeiA+PSBzdGF0ZS0+bWF4X3N6KQorICAgICAgcmV0dXJuIDE7CisKKyAgICBzdGF0ZS0+c3ogPSBtYXgoc3RhdGUtPnN6ICogMiwgc3RhdGUtPnN6ICsgbik7CisgICAgaWYgKHN0YXRlLT5tYXhfc3opCisgICAgICBzdGF0ZS0+c3ogPSBtaW4oc3RhdGUtPnN6LCBzdGF0ZS0+bWF4X3N6KTsKKyAgICB0bXAgPSByZWFsbG9jIChzdGF0ZS0+c3RyLCBzdGF0ZS0+c3opOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgIHJldHVybiAxOworICAgIHN0YXRlLT5zdHIgPSB0bXA7CisgICAgc3RhdGUtPnMgPSBzdGF0ZS0+c3RyICsgb2ZmOworICAgIHN0YXRlLT50aGVlbmQgPSBzdGF0ZS0+c3RyICsgc3RhdGUtPnN6IC0gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXNfYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgaWYoYXNfcmVzZXJ2ZSAoc3RhdGUsIDEpKQorICAgIHJldHVybiAxOworICBlbHNlIHsKKyAgICAqc3RhdGUtPnMrKyA9IGM7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CithcHBlbmRfbnVtYmVyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCisJICAgICAgdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGJhc2UsIGNoYXIgKnJlcCwKKwkgICAgICBpbnQgd2lkdGgsIGludCBwcmVjLCBpbnQgZmxhZ3MsIGludCBtaW51c3ApCit7CisgIGludCBsZW4gPSAwOworICBpbnQgaTsKKworICAvKiBnaXZlbiBwcmVjaXNpb24sIGlnbm9yZSB6ZXJvIGZsYWcgKi8KKyAgaWYocHJlYyAhPSAtMSkKKyAgICBmbGFncyAmPSB+emVyb19mbGFnOworICBlbHNlCisgICAgcHJlYyA9IDE7CisgIC8qIHplcm8gdmFsdWUgd2l0aCB6ZXJvIHByZWNpc2lvbiAtPiAiIiAqLworICBpZihwcmVjID09IDAgJiYgbnVtID09IDApCisgICAgcmV0dXJuIDA7CisgIGRveworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwW251bSAlIGJhc2VdKSkKKyAgICAgIHJldHVybiAxOworICAgIGxlbisrOworICAgIG51bSAvPSBiYXNlOworICB9d2hpbGUobnVtKTsKKyAgcHJlYyAtPSBsZW47CisgIC8qIHBhZCB3aXRoIHByZWMgemVyb3MgKi8KKyAgd2hpbGUocHJlYy0tID4gMCl7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0KKyAgLyogYWRkIGxlbmd0aCBvZiBhbHRlcm5hdGUgcHJlZml4IChhZGRlZCBsYXRlcikgdG8gbGVuICovCisgIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSkKKyAgICBsZW4gKz0gYmFzZSAvIDg7CisgIC8qIHBhZCB3aXRoIHplcm9zICovCisgIGlmKGZsYWdzICYgemVyb19mbGFnKXsKKyAgICB3aWR0aCAtPSBsZW47CisgICAgaWYobWludXNwIHx8IChmbGFncyAmIHNwYWNlX2ZsYWcpIHx8IChmbGFncyAmIHBsdXNfZmxhZykpCisgICAgICB3aWR0aC0tOworICAgIHdoaWxlKHdpZHRoLS0gPiAwKXsKKyAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKKwlyZXR1cm4gMTsKKyAgICAgIGxlbisrOworICAgIH0KKyAgfQorICAvKiBhZGQgYWx0ZXJuYXRlIHByZWZpeCAqLworICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpeworICAgIGlmKGJhc2UgPT0gMTYpCisgICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIHJlcFsxMF0gKyAyMykpIC8qIFhYWCAqLworCXJldHVybiAxOworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKKyAgICAgIHJldHVybiAxOworICB9CisgIC8qIGFkZCBzaWduICovCisgIGlmKG1pbnVzcCl7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnLScpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0gZWxzZSBpZihmbGFncyAmIHBsdXNfZmxhZykgeworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJysnKSkKKyAgICAgIHJldHVybiAxOworICAgIGxlbisrOworICB9IGVsc2UgaWYoZmxhZ3MgJiBzcGFjZV9mbGFnKSB7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnICcpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0KKyAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQorICAgIC8qIHN3YXAgYmVmb3JlIHBhZGRpbmcgd2l0aCBzcGFjZXMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspeworICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CisgICAgICBzdGF0ZS0+c1staS0xXSA9IHN0YXRlLT5zWy1sZW4raV07CisgICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKKyAgICB9CisgIHdpZHRoIC09IGxlbjsKKyAgd2hpbGUod2lkdGgtLSA+IDApeworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgICcgJykpCisgICAgICByZXR1cm4gMTsKKyAgICBsZW4rKzsKKyAgfQorICBpZighKGZsYWdzICYgbWludXNfZmxhZykpCisgICAgLyogc3dhcCBhZnRlciBwYWRkaW5nIHdpdGggc3BhY2VzICovCisgICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKKyAgICAgIGNoYXIgYyA9IHN0YXRlLT5zWy1pLTFdOworICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOworICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcHBlbmRfc3RyaW5nIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAorCSAgICAgICB1bnNpZ25lZCBjaGFyICphcmcsCisJICAgICAgIGludCB3aWR0aCwKKwkgICAgICAgaW50IHByZWMsCisJICAgICAgIGludCBmbGFncykKK3sKKyAgaWYocHJlYyAhPSAtMSkKKyAgICB3aWR0aCAtPSBwcmVjOworICBlbHNlCisgICAgd2lkdGggLT0gc3RybGVuKChjaGFyICopYXJnKTsKKyAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQorICAgIHdoaWxlKHdpZHRoLS0gPiAwKQorICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKKwlyZXR1cm4gMTsKKyAgaWYgKHByZWMgIT0gLTEpIHsKKyAgICB3aGlsZSAoKmFyZyAmJiBwcmVjLS0pCisgICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgKmFyZysrKSkKKwlyZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKmFyZykKKyAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQorCXJldHVybiAxOworICB9CisgIGlmKGZsYWdzICYgbWludXNfZmxhZykKKyAgICB3aGlsZSh3aWR0aC0tID4gMCkKKyAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCisJcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcHBlbmRfY2hhcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAorCSAgICB1bnNpZ25lZCBjaGFyIGFyZywKKwkgICAgaW50IHdpZHRoLAorCSAgICBpbnQgZmxhZ3MpCit7CisgIHdoaWxlKCEoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKKyAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQorICAgICAgcmV0dXJuIDE7CisKKyAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgYXJnKSkKKyAgICByZXR1cm4gMTsKKyAgd2hpbGUoKGZsYWdzICYgbWludXNfZmxhZykgJiYgLS13aWR0aCA+IDApCisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisvKgorICogVGhpcyBjYW4ndCBiZSBtYWRlIGludG8gYSBmdW5jdGlvbi4uLgorICovCisKKyNkZWZpbmUgUEFSU0VfSU5UX0ZPUk1BVChyZXMsIGFyZywgdW5zaWcpIFwKK2lmIChsb25nX2ZsYWcpIFwKKyAgICAgcmVzID0gKHVuc2lnIGxvbmcpdmFfYXJnKGFyZywgdW5zaWcgbG9uZyk7IFwKK2Vsc2UgaWYgKHNob3J0X2ZsYWcpIFwKKyAgICAgcmVzID0gKHVuc2lnIHNob3J0KXZhX2FyZyhhcmcsIHVuc2lnIGludCk7IFwKK2Vsc2UgXAorICAgICByZXMgPSAodW5zaWcgaW50KXZhX2FyZyhhcmcsIHVuc2lnIGludCkKKworLyoKKyAqIHp5eHByaW50ZiAtIHJldHVybiAwIG9yIC0xCisgKi8KKworc3RhdGljIGludAoreHl6cHJpbnRmIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpjaGFyX2Zvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZm9ybWF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiljaGFyX2Zvcm1hdDsKKyAgdW5zaWduZWQgY2hhciBjOworCisgIHdoaWxlKChjID0gKmZvcm1hdCsrKSkgeworICAgIGlmIChjID09ICclJykgeworICAgICAgaW50IGZsYWdzICAgICAgPSAwOworICAgICAgaW50IHdpZHRoICAgICAgPSAwOworICAgICAgaW50IHByZWMgICAgICAgPSAtMTsKKyAgICAgIGludCBsb25nX2ZsYWcgID0gMDsKKyAgICAgIGludCBzaG9ydF9mbGFnID0gMDsKKworICAgICAgLyogZmxhZ3MgKi8KKyAgICAgIHdoaWxlKChjID0gKmZvcm1hdCsrKSl7CisJaWYoYyA9PSAnLScpCisJICBmbGFncyB8PSBtaW51c19mbGFnOworCWVsc2UgaWYoYyA9PSAnKycpCisJICBmbGFncyB8PSBwbHVzX2ZsYWc7CisJZWxzZSBpZihjID09ICcgJykKKwkgIGZsYWdzIHw9IHNwYWNlX2ZsYWc7CisJZWxzZSBpZihjID09ICcjJykKKwkgIGZsYWdzIHw9IGFsdGVybmF0ZV9mbGFnOworCWVsc2UgaWYoYyA9PSAnMCcpCisJICBmbGFncyB8PSB6ZXJvX2ZsYWc7CisJZWxzZQorCSAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKChmbGFncyAmIHNwYWNlX2ZsYWcpICYmIChmbGFncyAmIHBsdXNfZmxhZykpCisJZmxhZ3MgXj0gc3BhY2VfZmxhZzsKKworICAgICAgaWYoKGZsYWdzICYgbWludXNfZmxhZykgJiYgKGZsYWdzICYgemVyb19mbGFnKSkKKwlmbGFncyBePSB6ZXJvX2ZsYWc7CisKKyAgICAgIC8qIHdpZHRoICovCisgICAgICBpZiAoaXNkaWdpdChjKSkKKwlkbyB7CisJICB3aWR0aCA9IHdpZHRoICogMTAgKyBjIC0gJzAnOworCSAgYyA9ICpmb3JtYXQrKzsKKwl9IHdoaWxlKGlzZGlnaXQoYykpOworICAgICAgZWxzZSBpZihjID09ICcqJykgeworCXdpZHRoID0gdmFfYXJnKGFwLCBpbnQpOworCWMgPSAqZm9ybWF0Kys7CisgICAgICB9CisKKyAgICAgIC8qIHByZWNpc2lvbiAqLworICAgICAgaWYgKGMgPT0gJy4nKSB7CisJcHJlYyA9IDA7CisJYyA9ICpmb3JtYXQrKzsKKwlpZiAoaXNkaWdpdChjKSkKKwkgIGRvIHsKKwkgICAgcHJlYyA9IHByZWMgKiAxMCArIGMgLSAnMCc7CisJICAgIGMgPSAqZm9ybWF0Kys7CisJICB9IHdoaWxlKGlzZGlnaXQoYykpOworCWVsc2UgaWYgKGMgPT0gJyonKSB7CisJICBwcmVjID0gdmFfYXJnKGFwLCBpbnQpOworCSAgYyA9ICpmb3JtYXQrKzsKKwl9CisgICAgICB9CisKKyAgICAgIC8qIHNpemUgKi8KKworICAgICAgaWYgKGMgPT0gJ2gnKSB7CisJc2hvcnRfZmxhZyA9IDE7CisJYyA9ICpmb3JtYXQrKzsKKyAgICAgIH0gZWxzZSBpZiAoYyA9PSAnbCcpIHsKKwlsb25nX2ZsYWcgPSAxOworCWMgPSAqZm9ybWF0Kys7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnYycgOgorCWlmKGFwcGVuZF9jaGFyKHN0YXRlLCB2YV9hcmcoYXAsIGludCksIHdpZHRoLCBmbGFncykpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICBjYXNlICdzJyA6CisJaWYgKGFwcGVuZF9zdHJpbmcoc3RhdGUsCisJCQkgIHZhX2FyZyhhcCwgdW5zaWduZWQgY2hhciopLAorCQkJICB3aWR0aCwKKwkJCSAgcHJlYywKKwkJCSAgZmxhZ3MpKQorCSAgcmV0dXJuIC0xOworCWJyZWFrOworICAgICAgY2FzZSAnZCcgOgorICAgICAgY2FzZSAnaScgOiB7CisJbG9uZyBhcmc7CisJdW5zaWduZWQgbG9uZyBudW07CisJaW50IG1pbnVzcCA9IDA7CisKKwlQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHNpZ25lZCk7CisKKwlpZiAoYXJnIDwgMCkgeworCSAgbWludXNwID0gMTsKKwkgIG51bSA9IC1hcmc7CisJfSBlbHNlCisJICBudW0gPSBhcmc7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIG51bSwgMTAsICIwMTIzNDU2Nzg5IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgbWludXNwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3UnIDogeworCXVuc2lnbmVkIGxvbmcgYXJnOworCisJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMTAsICIwMTIzNDU2Nzg5IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdvJyA6IHsKKwl1bnNpZ25lZCBsb25nIGFyZzsKKworCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOworCisJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDAxMCwgIjAxMjM0NTY3IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICd4JyA6IHsKKwl1bnNpZ25lZCBsb25nIGFyZzsKKworCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOworCisJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5YWJjZGVmIiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdYJyA6eworCXVuc2lnbmVkIGxvbmcgYXJnOworCisJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAorCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3AnIDogeworCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpdmFfYXJnKGFwLCB2b2lkKik7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAorCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ24nIDogeworCWludCAqYXJnID0gdmFfYXJnKGFwLCBpbnQqKTsKKwkqYXJnID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOworCWJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnXDAnIDoKKwkgIC0tZm9ybWF0OworCSAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgJyUnIDoKKwlpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQgOgorCWlmICggICAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICclJykKKwkgICAgfHwgKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBjKSkKKwlyZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgSEFWRV9TTlBSSU5URgoraW50CitzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXQ7CisKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgcmV0ID0gdnNucHJpbnRmIChzdHIsIHN6LCBmb3JtYXQsIGFyZ3MpOworCisjaWZkZWYgUEFSQU5PSUEKKyAgeworICAgIGludCByZXQyOworICAgIGNoYXIgKnRtcDsKKworICAgIHRtcCA9IG1hbGxvYyAoc3opOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgIGFib3J0ICgpOworCisgICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7CisgICAgaWYgKHJldCAhPSByZXQyIHx8IHN0cmNtcChzdHIsIHRtcCkpCisgICAgICBhYm9ydCAoKTsKKyAgICBmcmVlICh0bXApOworICB9CisjZW5kaWYKKworICB2YV9lbmQoYXJncyk7CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgSEFWRV9BU1BSSU5URgoraW50Cithc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHZhbDsKKworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICB2YWwgPSB2YXNwcmludGYgKHJldCwgZm9ybWF0LCBhcmdzKTsKKworI2lmZGVmIFBBUkFOT0lBCisgIHsKKyAgICBpbnQgcmV0MjsKKyAgICBjaGFyICp0bXA7CisgICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICBhYm9ydCAoKTsKKworICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOworICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKKyAgICAgIGFib3J0ICgpOworICAgIGZyZWUgKHRtcCk7CisgIH0KKyNlbmRpZgorCisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVNOUFJJTlRGCitpbnQKK2FzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHZhbDsKKworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICB2YWwgPSB2YXNucHJpbnRmIChyZXQsIG1heF9zeiwgZm9ybWF0LCBhcmdzKTsKKworI2lmZGVmIFBBUkFOT0lBCisgIHsKKyAgICBpbnQgcmV0MjsKKyAgICBjaGFyICp0bXA7CisgICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICBhYm9ydCAoKTsKKworICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOworICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKKyAgICAgIGFib3J0ICgpOworICAgIGZyZWUgKHRtcCk7CisgIH0KKyNlbmRpZgorCisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitpbnQKK3Zhc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHJldHVybiB2YXNucHJpbnRmIChyZXQsIDAsIGZvcm1hdCwgYXJncyk7Cit9CisjZW5kaWYKKworCisjaWZuZGVmIEhBVkVfVkFTTlBSSU5URgoraW50Cit2YXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaW50IHN0OworICBzaXplX3QgbGVuOworICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CisKKyAgc3RhdGUubWF4X3N6ID0gbWF4X3N6OworICBzdGF0ZS5zeiAgICAgPSAxOworICBzdGF0ZS5zdHIgICAgPSBtYWxsb2Moc3RhdGUuc3opOworICBpZiAoc3RhdGUuc3RyID09IE5VTEwpIHsKKyAgICAqcmV0ID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgc3RhdGUucyA9IHN0YXRlLnN0cjsKKyAgc3RhdGUudGhlZW5kID0gc3RhdGUucyArIHN0YXRlLnN6IC0gMTsKKyAgc3RhdGUuYXBwZW5kX2NoYXIgPSBhc19hcHBlbmRfY2hhcjsKKyAgc3RhdGUucmVzZXJ2ZSAgICAgPSBhc19yZXNlcnZlOworCisgIHN0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CisgIGlmIChzdCkgeworICAgIGZyZWUgKHN0YXRlLnN0cik7CisgICAgKnJldCA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIGNoYXIgKnRtcDsKKworICAgICpzdGF0ZS5zID0gJ1wwJzsKKyAgICBsZW4gPSBzdGF0ZS5zIC0gc3RhdGUuc3RyOworICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLnN0ciwgbGVuKzEpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgZnJlZSAoc3RhdGUuc3RyKTsKKyAgICAgICpyZXQgPSBOVUxMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcmV0ID0gdG1wOworICAgIHJldHVybiBsZW47CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9WU05QUklOVEYKK2ludAordnNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHN0cnVjdCBzdGF0ZSBzdGF0ZTsKKyAgaW50IHJldDsKKyAgdW5zaWduZWQgY2hhciAqdXN0ciA9ICh1bnNpZ25lZCBjaGFyICopc3RyOworCisgIHN0YXRlLm1heF9zeiA9IDA7CisgIHN0YXRlLnN6ICAgICA9IHN6OworICBzdGF0ZS5zdHIgICAgPSB1c3RyOworICBzdGF0ZS5zICAgICAgPSB1c3RyOworICBzdGF0ZS50aGVlbmQgPSB1c3RyICsgc3ogLSAxOworICBzdGF0ZS5hcHBlbmRfY2hhciA9IHNuX2FwcGVuZF9jaGFyOworICBzdGF0ZS5yZXNlcnZlICAgICA9IHNuX3Jlc2VydmU7CisKKyAgcmV0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CisgICpzdGF0ZS5zID0gJ1wwJzsKKyAgaWYgKHJldCkKKyAgICByZXR1cm4gc3o7CisgIGVsc2UKKyAgICByZXR1cm4gc3RhdGUucyAtIHN0YXRlLnN0cjsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9taXNzaW5nL3NvY2tzdG9yYWdlLmggYi9taXNzaW5nL3NvY2tzdG9yYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMzMyOAotLS0gL2Rldi9udWxsCisrKyBiL21pc3Npbmcvc29ja3N0b3JhZ2UuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CisjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KKwl1X2ludDhfdCBzc19sZW47CisJdV9pbnQ4X3Qgc3NfZmFtaWx5OworCXVfaW50OF90IGZpbGxbMTI2XTsKKyNlbHNlCisJdV9pbnQ4X3Qgc3NfZmFtaWx5OworCXVfaW50OF90IGZpbGxbMTI3XTsKKyNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLworfTsKZGlmZiAtLWdpdCBhL21pc3Npbmcvc3RyZHVwLmMgYi9taXNzaW5nL3N0cmR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2MzYjIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNzaW5nL3N0cmR1cC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9zdHJkdXAuYyx2IDEuMSAyMDAxLzAxLzIwIDA3OjI2OjA4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworY2hhciAqCitzdHJkdXAoc3RyKQorCWNvbnN0IGNoYXIgKnN0cjsKK3sKKwlzaXplX3QgbGVuOworCWNoYXIgKmNvcHk7CisKKwlsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisJaWYgKChjb3B5ID0gbWFsbG9jKGxlbikpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJbWVtY3B5KGNvcHksIHN0ciwgbGVuKTsKKwlyZXR1cm4gKGNvcHkpOworfQpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zdHJsY2F0LmMgYi9taXNzaW5nL3N0cmxjYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EyZThhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9zdHJsY2F0LmMKQEAgLTAsMCArMSw3NiBAQAorLyoJJE5ldEJTRDogc3RybGNhdC5jLHYgMS41IDE5OTkvMDkvMjAgMDQ6Mzk6NDcgbHVrZW0gRXhwICQJKi8KKy8qCWZyb20gT3BlbkJTRDogc3RybGNhdC5jLHYgMS4yIDE5OTkvMDYvMTcgMTY6Mjg6NTggbWlsbGVydCBFeHAgCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisgKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL3N0cmxjYXQuYyx2IDEuNSAyMDAzLzExLzE2IDA5OjM2OjUxIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0ggCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIEFwcGVuZHMgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXogKHVubGlrZSBzdHJuY2F0LCBzaXogaXMgdGhlCisgKiBmdWxsIHNpemUgb2YgZHN0LCBub3Qgc3BhY2UgbGVmdCkuICBBdCBtb3N0IHNpei0xIGNoYXJhY3RlcnMKKyAqIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3Mgc2l6ID09IDApLgorICogUmV0dXJucyBzdHJsZW4oc3JjKTsgaWYgcmV0dmFsID49IHNpeiwgdHJ1bmNhdGlvbiBvY2N1cnJlZC4KKyAqLworc2l6ZV90CitzdHJsY2F0KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6KQoreworCXJlZ2lzdGVyIGNoYXIgKmQgPSBkc3Q7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHNyYzsKKwlyZWdpc3RlciBzaXplX3QgbiA9IHNpejsKKwlzaXplX3QgZGxlbjsKKworCS8qIEZpbmQgdGhlIGVuZCBvZiBkc3QgYW5kIGFkanVzdCBieXRlcyBsZWZ0IGJ1dCBkb24ndCBnbyBwYXN0IGVuZCAqLworCXdoaWxlICgqZCAhPSAnXDAnICYmIG4tLSAhPSAwKQorCQlkKys7CisJZGxlbiA9IGQgLSBkc3Q7CisJbiA9IHNpeiAtIGRsZW47CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4oZGxlbiArIHN0cmxlbihzKSk7CisJd2hpbGUgKCpzICE9ICdcMCcpIHsKKwkJaWYgKG4gIT0gMSkgeworCQkJKmQrKyA9ICpzOworCQkJbi0tOworCQl9CisJCXMrKzsKKwl9CisJKmQgPSAnXDAnOworCisJcmV0dXJuKGRsZW4gKyAocyAtIHNyYykpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zdHJsY3B5LmMgYi9taXNzaW5nL3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE4MDlhCi0tLSAvZGV2L251bGwKKysrIGIvbWlzc2luZy9zdHJsY3B5LmMKQEAgLTAsMCArMSw3MyBAQAorLyoJJE5ldEJTRDogc3RybGNweS5jLHYgMS41IDE5OTkvMDkvMjAgMDQ6Mzk6NDcgbHVrZW0gRXhwICQJKi8KKy8qCWZyb20gT3BlbkJTRDogc3RybGNweS5jLHYgMS40IDE5OTkvMDUvMDEgMTg6NTY6NDEgbWlsbGVydCBFeHAgCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisgKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL3N0cmxjcHkuYyx2IDEuNSAyMDAzLzExLzE2IDA5OjM2OjUyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0ggCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIENvcHkgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXouICBBdCBtb3N0IHNpei0xIGNoYXJhY3RlcnMKKyAqIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3Mgc2l6ID09IDApLgorICogUmV0dXJucyBzdHJsZW4oc3JjKTsgaWYgcmV0dmFsID49IHNpeiwgdHJ1bmNhdGlvbiBvY2N1cnJlZC4KKyAqLworc2l6ZV90CitzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6KQoreworCXJlZ2lzdGVyIGNoYXIgKmQgPSBkc3Q7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHNyYzsKKwlyZWdpc3RlciBzaXplX3QgbiA9IHNpejsKKworCS8qIENvcHkgYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCAqLworCWlmIChuICE9IDAgJiYgLS1uICE9IDApIHsKKwkJZG8geworCQkJaWYgKCgqZCsrID0gKnMrKykgPT0gMCkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1uICE9IDApOworCX0KKworCS8qIE5vdCBlbm91Z2ggcm9vbSBpbiBkc3QsIGFkZCBOVUwgYW5kIHRyYXZlcnNlIHJlc3Qgb2Ygc3JjICovCisJaWYgKG4gPT0gMCkgeworCQlpZiAoc2l6ICE9IDApCisJCQkqZCA9ICdcMCc7CQkvKiBOVUwtdGVybWluYXRlIGRzdCAqLworCQl3aGlsZSAoKnMrKykKKwkJCTsKKwl9CisKKwlyZXR1cm4ocyAtIHNyYyAtIDEpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zdHJzZXAuYyBiL21pc3Npbmcvc3Ryc2VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmYjZiMgotLS0gL2Rldi9udWxsCisrKyBiL21pc3Npbmcvc3Ryc2VwLmMKQEAgLTAsMCArMSw4MyBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9zdHJzZXAuYyx2IDEuMyAyMDAzLzAzLzI1IDA4OjMzOjQ4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSCAKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogR2V0IG5leHQgdG9rZW4gZnJvbSBzdHJpbmcgKnN0cmluZ3AsIHdoZXJlIHRva2VucyBhcmUgcG9zc2libHktZW1wdHkKKyAqIHN0cmluZ3Mgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgZnJvbSBkZWxpbS4KKyAqCisgKiBXcml0ZXMgTlVMcyBpbnRvIHRoZSBzdHJpbmcgYXQgKnN0cmluZ3AgdG8gZW5kIHRva2Vucy4KKyAqIGRlbGltIG5lZWQgbm90IHJlbWFpbiBjb25zdGFudCBmcm9tIGNhbGwgdG8gY2FsbC4KKyAqIE9uIHJldHVybiwgKnN0cmluZ3AgcG9pbnRzIHBhc3QgdGhlIGxhc3QgTlVMIHdyaXR0ZW4gKGlmIHRoZXJlIG1pZ2h0CisgKiBiZSBmdXJ0aGVyIHRva2VucyksIG9yIGlzIE5VTEwgKGlmIHRoZXJlIGFyZSBkZWZpbml0ZWx5IG5vIG1vcmUgdG9rZW5zKS4KKyAqCisgKiBJZiAqc3RyaW5ncCBpcyBOVUxMLCBzdHJzZXAgcmV0dXJucyBOVUxMLgorICovCitjaGFyICoKK3N0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCit7CisJcmVnaXN0ZXIgY2hhciAqczsKKwlyZWdpc3RlciBjb25zdCBjaGFyICpzcGFucDsKKwlyZWdpc3RlciBpbnQgYywgc2M7CisJY2hhciAqdG9rOworCisJaWYgKChzID0gKnN0cmluZ3ApID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJZm9yICh0b2sgPSBzOzspIHsKKwkJYyA9ICpzKys7CisJCXNwYW5wID0gZGVsaW07CisJCWRvIHsKKwkJCWlmICgoc2MgPSAqc3BhbnArKykgPT0gYykgeworCQkJCWlmIChjID09IDApCisJCQkJCXMgPSBOVUxMOworCQkJCWVsc2UKKwkJCQkJc1stMV0gPSAwOworCQkJCSpzdHJpbmdwID0gczsKKwkJCQlyZXR1cm4gKHRvayk7CisJCQl9CisJCX0gd2hpbGUgKHNjICE9IDApOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9ta2RlcCBiL21rZGVwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhOWMyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9ta2RlcApAQCAtMCwwICsxLDEwOSBAQAorIyEvYmluL3NoIC0KKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2CisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyMgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgorIyB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQorIyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisjIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCisjIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMJQCgjKW1rZGVwLnNoCTUuMTEgKEJlcmtlbGV5KSA1LzUvODgKKyMKKworUEFUSD0vYmluOi91c3IvYmluOi91c3IvdWNiOi91c3IvbG9jYWw6L3Vzci9sb2NhbC9iaW4KK2V4cG9ydCBQQVRICisKK01BS0U9TWFrZWZpbGUJCQkjIGRlZmF1bHQgbWFrZWZpbGUgbmFtZSBpcyAiTWFrZWZpbGUiCitDQz1jYwkJCQkjIGRlZmF1bHQgQyBjb21waWxlciBpcyAiY2MiCisKK3doaWxlIDoKKwlkbyBjYXNlICIkMSIgaW4KKwkJIyAtYyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIEMgY29tcGlsZXIKKwkJLWMpCisJCQlDQz0kMgorCQkJc2hpZnQ7IHNoaWZ0IDs7CisKKwkJIyAtZiBhbGxvd3MgeW91IHRvIHNlbGVjdCBhIG1ha2VmaWxlIG5hbWUKKwkJLWYpCisJCQlNQUtFPSQyCisJCQlzaGlmdDsgc2hpZnQgOzsKKworCQkjIHRoZSAtcCBmbGFnIHByb2R1Y2VzICJwcm9ncmFtOiBwcm9ncmFtLmMiIHN0eWxlIGRlcGVuZGVuY2llcworCQkjIHNvIC5vJ3MgZG9uJ3QgZ2V0IHByb2R1Y2VkCisJCS1wKQorCQkJU0VEPSdzO1wubzs7JworCQkJc2hpZnQgOzsKKwkJKikKKwkJCWJyZWFrIDs7CisJZXNhYworZG9uZQorCitpZiBbICQjID0gMCBdIDsgdGhlbgorCWVjaG8gJ3VzYWdlOiBta2RlcCBbLXBdIFstYyBjY10gWy1mIG1ha2VmaWxlXSBbZmxhZ3NdIGZpbGUgLi4uJworCWV4aXQgMQorZmkKKworaWYgWyAhIC13ICRNQUtFIF07IHRoZW4KKwllY2hvICJta2RlcDogbm8gd3JpdGVhYmxlIGZpbGUgXCIkTUFLRVwiIgorCWV4aXQgMQorZmkKKworVE1QPS90bXAvbWtkZXAkJAorCit0cmFwICdybSAtZiAkVE1QIDsgZXhpdCAxJyAxIDIgMyAxMyAxNQorCitjcCAkTUFLRSAke01BS0V9LmJhaworCitzZWQgLWUgJy9ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJGQnIDwgJE1BS0UgPiAkVE1QCisKK2NhdCA8PCBfRU9GXyA+PiAkVE1QCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCisjIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCisKK19FT0ZfCisKKyMgSWYgeW91ciBjb21waWxlciBkb2Vzbid0IGhhdmUgLU0sIGFkZCBpdC4gIElmIHlvdSBjYW4ndCwgdGhlIG5leHQgdHdvCisjIGxpbmVzIHdpbGwgdHJ5IGFuZCByZXBsYWNlIHRoZSAiY2MgLU0iLiAgVGhlIHJlYWwgcHJvYmxlbSBpcyB0aGF0IHRoaXMKKyMgaGFjayBjYW4ndCBkZWFsIHdpdGggYW55dGhpbmcgdGhhdCByZXF1aXJlcyBhIHNlYXJjaCBwYXRoLCBhbmQgZG9lc24ndAorIyBldmVuIHRyeSBmb3IgYW55dGhpbmcgdXNpbmcgYnJhY2tldCAoPD4pIHN5bnRheC4KKyMKKyMgZWdyZXAgJ14jaW5jbHVkZVsgCV0qIi4qIicgL2Rldi9udWxsICQqIHwKKyMgc2VkIC1lICdzLzpbXiJdKiJcKFteIl0qXCkiLiovOiBcMS8nIC1lICdzL1wuYy8uby8nIHwKKworIyBYWFggdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCB0aGluZ3MgbGlrZSAiLURERUNMV0FJVFNUQVRVUz11bmlvblwgd2FpdCIKKyRDQyAtTSAkKiB8CitzZWQgIgorCXM7IFwuLzsgO2cKKwkkU0VEIiB8Cithd2sgJ3sKKwlpZiAoJDEgIT0gcHJldikgeworCQlpZiAocmVjICE9ICIiKQorCQkJcHJpbnQgcmVjOworCQlyZWMgPSAkMDsKKwkJcHJldiA9ICQxOworCX0KKwllbHNlIHsKKwkJaWYgKGxlbmd0aChyZWMgJDIpID4gNzgpIHsKKwkJCXByaW50IHJlYzsKKwkJCXJlYyA9ICQwOworCQl9CisJCWVsc2UKKwkJCXJlYyA9IHJlYyAiICIgJDIKKwl9Cit9CitFTkQgeworCXByaW50IHJlYworfScgPj4gJFRNUAorCitjYXQgPDwgX0VPRl8gPj4gJFRNUAorCisjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKK19FT0ZfCisKKyMgY29weSB0byBwcmVzZXJ2ZSBwZXJtaXNzaW9ucworY3AgJFRNUCAkTUFLRQorcm0gLWYgJHtNQUtFfS5iYWsgJFRNUAorZXhpdCAwCmRpZmYgLS1naXQgYS9tcGxzLmggYi9tcGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmYzljOQotLS0gL2Rldi9udWxsCisrKyBiL21wbHMuaApAQCAtMCwwICsxLDQxIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21wbHMuaCx2IDEuMSAyMDA0LzA2LzE0IDE0OjQ3OjU4IGhhbm5lcyBFeHAgJCAoTEJMKQorICogQ29weXJpZ2h0IChDKSAyMDAxIFdJREUgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgTEFCRUxfTUFTSwkweGZmZmZmMDAwCisjZGVmaW5lIExBQkVMX1NISUZUCTEyCisjZGVmaW5lCUVYUF9NQVNLCTB4MDAwMDBlMDAKKyNkZWZpbmUgRVhQX1NISUZUCTkKKyNkZWZpbmUJU1RBQ0tfTUFTSwkweDAwMDAwMTAwCisjZGVmaW5lIFNUQUNLX1NISUZUCTgKKyNkZWZpbmUgVFRMX01BU0sJMHgwMDAwMDBmZgorI2RlZmluZSBUVExfU0hJRlQJMAorCisjZGVmaW5lIE1QTFNfTEFCRUwoeCkJKCgoeCkgJiBMQUJFTF9NQVNLKSA+PiBMQUJFTF9TSElGVCkKKyNkZWZpbmUgTVBMU19FWFAoeCkJKCgoeCkgJiBFWFBfTUFTSykgPj4gRVhQX1NISUZUKQorI2RlZmluZSBNUExTX1NUQUNLKHgpCSgoKHgpICYgU1RBQ0tfTUFTSykgPj4gU1RBQ0tfU0hJRlQpCisjZGVmaW5lIE1QTFNfVFRMKHgpCSgoKHgpICYgVFRMX01BU0spID4+IFRUTF9TSElGVCkKZGlmZiAtLWdpdCBhL25hbWVzZXIuaCBiL25hbWVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjM5MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmFtZXNlci5oCkBAIC0wLDAgKzEsMzE1IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25hbWVzZXIuaCx2IDEuMTQuNC4yIDIwMDYvMTEvMTAgMDM6MTU6MzUgZ3V5IEV4cCAkIChMQkwpICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICAgICAgQCgjKW5hbWVzZXIuaAk4LjIgKEJlcmtlbGV5KSAyLzE2Lzk0CisgKiAtCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5OTMgYnkgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdAorICogdGhlIG5hbWUgb2YgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZG9jdW1lbnQgb3Igc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgRElHSVRBTCBFUVVJUE1FTlQgQ09SUC4gRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwgRVFVSVBNRU5UCisgKiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICogLQorICogLS1Db3B5cmlnaHQtLQorICovCisKKyNpZm5kZWYgX05BTUVTRVJfSF8KKyNkZWZpbmUJX05BTUVTRVJfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKgorICogRGVmaW5lIGNvbnN0YW50cyBiYXNlZCBvbiByZmM4ODMKKyAqLworI2RlZmluZSBQQUNLRVRTWgk1MTIJCS8qIG1heGltdW0gcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTUFYRE5BTUUJMjU2CQkvKiBtYXhpbXVtIGRvbWFpbiBuYW1lICovCisjZGVmaW5lIE1BWENETkFNRQkyNTUJCS8qIG1heGltdW0gY29tcHJlc3NlZCBkb21haW4gbmFtZSAqLworI2RlZmluZSBNQVhMQUJFTAk2MwkJLyogbWF4aW11bSBsZW5ndGggb2YgZG9tYWluIGxhYmVsICovCisJLyogTnVtYmVyIG9mIGJ5dGVzIG9mIGZpeGVkIHNpemUgZGF0YSBpbiBxdWVyeSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgUUZJWEVEU1oJNAorCS8qIG51bWJlciBvZiBieXRlcyBvZiBmaXhlZCBzaXplIGRhdGEgaW4gcmVzb3VyY2UgcmVjb3JkICovCisjZGVmaW5lIFJSRklYRURTWgkxMAorCisvKgorICogSW50ZXJuZXQgbmFtZXNlcnZlciBwb3J0IG51bWJlcgorICovCisjZGVmaW5lIE5BTUVTRVJWRVJfUE9SVAk1MworCisvKgorICogUG9ydCBmb3IgbXVsdGljYXN0IEROUzsgc2VlCisgKgorICoJaHR0cDovL2ZpbGVzLm11bHRpY2FzdGRucy5vcmcvZHJhZnQtY2hlc2hpcmUtZG5zZXh0LW11bHRpY2FzdGRucy50eHQKKyAqCisgKiBmb3IgdGhlIGN1cnJlbnQgbUROUyBzcGVjLgorICovCisjZGVmaW5lIE1VTFRJQ0FTVEROU19QT1JUCTUzNTMKKworLyoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIG9wY29kZXMKKyAqLworI2RlZmluZSBRVUVSWQkJMHgwCQkvKiBzdGFuZGFyZCBxdWVyeSAqLworI2RlZmluZSBJUVVFUlkJCTB4MQkJLyogaW52ZXJzZSBxdWVyeSAqLworI2RlZmluZSBTVEFUVVMJCTB4MgkJLyogbmFtZXNlcnZlciBzdGF0dXMgcXVlcnkgKi8KKyNpZiAwCisjZGVmaW5lIHh4eAkJMHgzCQkvKiAweDMgcmVzZXJ2ZWQgKi8KKyNlbmRpZgorCS8qIG5vbiBzdGFuZGFyZCAtIHN1cHBvcnRzIEFMTE9XX1VQREFURVMgc3R1ZmYgZnJvbSBNaWtlIFNjaHdhcnR6ICovCisjZGVmaW5lIFVQREFURUEJCTB4OQkJLyogYWRkIHJlc291cmNlIHJlY29yZCAqLworI2RlZmluZSBVUERBVEVECQkweGEJCS8qIGRlbGV0ZSBhIHNwZWNpZmljIHJlc291cmNlIHJlY29yZCAqLworI2RlZmluZSBVUERBVEVEQQkweGIJCS8qIGRlbGV0ZSBhbGwgbmFtZWQgcmVzb3VyY2UgcmVjb3JkICovCisjZGVmaW5lIFVQREFURU0JCTB4YwkJLyogbW9kaWZ5IGEgc3BlY2lmaWMgcmVzb3VyY2UgcmVjb3JkICovCisjZGVmaW5lIFVQREFURU1BCTB4ZAkJLyogbW9kaWZ5IGFsbCBuYW1lZCByZXNvdXJjZSByZWNvcmQgKi8KKworI2RlZmluZSBaT05FSU5JVAkweGUJCS8qIGluaXRpYWwgem9uZSB0cmFuc2ZlciAqLworI2RlZmluZSBaT05FUkVGCQkweGYJCS8qIGluY3JlbWVudGFsIHpvbmUgcmVmZXJlc2ggKi8KKworLyoKKyAqIFVuZGVmaW5lIHZhcmlvdXMgI2RlZmluZXMgZnJvbSB2YXJpb3VzIFN5c3RlbSBWLWZsYXZvcmVkIE9TZXMgKFNvbGFyaXMsCisgKiBTSU5JWCwgSFAtVVgpIHNvIHRoZSBjb21waWxlciBkb2Vzbid0IHdoaW5lIHRoYXQgd2UgcmVkZWZpbmUgdGhlbS4KKyAqLworI2lmZGVmIFRfTlVMTAorI3VuZGVmIFRfTlVMTAorI2VuZGlmCisjaWZkZWYgVF9PUFQKKyN1bmRlZiBUX09QVAorI2VuZGlmCisjaWZkZWYgVF9VTlNQRUMKKyN1bmRlZiBUX1VOU1BFQworI2VuZGlmCisjaWZkZWYgTk9FUlJPUgorI3VuZGVmIE5PRVJST1IKKyNlbmRpZgorCisvKgorICogQ3VycmVudGx5IGRlZmluZWQgcmVzcG9uc2UgY29kZXMKKyAqLworI2RlZmluZSBOT0VSUk9SCQkwCQkvKiBubyBlcnJvciAqLworI2RlZmluZSBGT1JNRVJSCQkxCQkvKiBmb3JtYXQgZXJyb3IgKi8KKyNkZWZpbmUgU0VSVkZBSUwJMgkJLyogc2VydmVyIGZhaWx1cmUgKi8KKyNkZWZpbmUgTlhET01BSU4JMwkJLyogbm9uIGV4aXN0ZW50IGRvbWFpbiAqLworI2RlZmluZSBOT1RJTVAJCTQJCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBSRUZVU0VECQk1CQkvKiBxdWVyeSByZWZ1c2VkICovCisJLyogbm9uIHN0YW5kYXJkICovCisjZGVmaW5lIE5PQ0hBTkdFCTB4ZgkJLyogdXBkYXRlIGZhaWxlZCB0byBjaGFuZ2UgZGIgKi8KKworLyoKKyAqIFR5cGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYW5kIHF1ZXJpZXMKKyAqLworI2RlZmluZSBUX0EJCTEJCS8qIGhvc3QgYWRkcmVzcyAqLworI2RlZmluZSBUX05TCQkyCQkvKiBhdXRob3JpdGF0aXZlIHNlcnZlciAqLworI2RlZmluZSBUX01ECQkzCQkvKiBtYWlsIGRlc3RpbmF0aW9uICovCisjZGVmaW5lIFRfTUYJCTQJCS8qIG1haWwgZm9yd2FyZGVyICovCisjZGVmaW5lIFRfQ05BTUUJCTUJCS8qIGNvbm5vbmljYWwgbmFtZSAqLworI2RlZmluZSBUX1NPQQkJNgkJLyogc3RhcnQgb2YgYXV0aG9yaXR5IHpvbmUgKi8KKyNkZWZpbmUgVF9NQgkJNwkJLyogbWFpbGJveCBkb21haW4gbmFtZSAqLworI2RlZmluZSBUX01HCQk4CQkvKiBtYWlsIGdyb3VwIG1lbWJlciAqLworI2RlZmluZSBUX01SCQk5CQkvKiBtYWlsIHJlbmFtZSBuYW1lICovCisjZGVmaW5lIFRfTlVMTAkJMTAJCS8qIG51bGwgcmVzb3VyY2UgcmVjb3JkICovCisjZGVmaW5lIFRfV0tTCQkxMQkJLyogd2VsbCBrbm93biBzZXJ2aWNlICovCisjZGVmaW5lIFRfUFRSCQkxMgkJLyogZG9tYWluIG5hbWUgcG9pbnRlciAqLworI2RlZmluZSBUX0hJTkZPCQkxMwkJLyogaG9zdCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX01JTkZPCQkxNAkJLyogbWFpbGJveCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX01YCQkxNQkJLyogbWFpbCByb3V0aW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFRfVFhUCQkxNgkJLyogdGV4dCBzdHJpbmdzICovCisjZGVmaW5lCVRfUlAJCTE3CQkvKiByZXNwb25zaWJsZSBwZXJzb24gKi8KKyNkZWZpbmUJVF9BRlNEQgkJMTgJCS8qIEFGUyBjZWxsIGRhdGFiYXNlICovCisjZGVmaW5lIFRfWDI1CQkxOQkJLyogWF8yNSBjYWxsaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9JU0ROCQkyMAkJLyogSVNETiBjYWxsaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9SVAkJMjEJCS8qIHJvdXRlciAqLworI2RlZmluZQlUX05TQVAJCTIyCQkvKiBOU0FQIGFkZHJlc3MgKi8KKyNkZWZpbmUJVF9OU0FQX1BUUgkyMwkJLyogcmV2ZXJzZSBsb29rdXAgZm9yIE5TQVAgKi8KKyNkZWZpbmUgVF9TSUcJCTI0CQkvKiBzZWN1cml0eSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgVF9LRVkJCTI1CQkvKiBzZWN1cml0eSBrZXkgKi8KKyNkZWZpbmUgVF9QWAkJMjYJCS8qIFguNDAwIG1haWwgbWFwcGluZyAqLworI2RlZmluZSBUX0dQT1MJCTI3CQkvKiBnZW9ncmFwaGljYWwgcG9zaXRpb24gKHdpdGhkcmF3bikgKi8KKyNkZWZpbmUgVF9BQUFBCQkyOAkJLyogSVA2IEFkZHJlc3MgKi8KKyNkZWZpbmUgVF9MT0MJCTI5CQkvKiBMb2NhdGlvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX05YVAkJMzAJCS8qIE5leHQgVmFsaWQgTmFtZSBpbiBab25lICovCisjZGVmaW5lIFRfRUlECQkzMQkJLyogRW5kcG9pbnQgaWRlbnRpZmllciAqLworI2RlZmluZSBUX05JTUxPQwkzMgkJLyogTmltcm9kIGxvY2F0b3IgKi8KKyNkZWZpbmUgVF9TUlYJCTMzCQkvKiBTZXJ2ZXIgc2VsZWN0aW9uICovCisjZGVmaW5lIFRfQVRNQQkJMzQJCS8qIEFUTSBBZGRyZXNzICovCisjZGVmaW5lIFRfTkFQVFIJCTM1CQkvKiBOYW1pbmcgQXV0aG9yaXR5IFBvaW5UZVIgKi8KKyNkZWZpbmUgVF9LWAkJMzYJCS8qIEtleSBFeGNoYW5nZXIgKi8KKyNkZWZpbmUgVF9DRVJUCQkzNwkJLyogQ2VydGlmaWNhdGVzIGluIHRoZSBETlMgKi8KKyNkZWZpbmUgVF9BNgkJMzgJCS8qIElQNiBhZGRyZXNzICovCisjZGVmaW5lIFRfRE5BTUUJCTM5CQkvKiBub24tdGVybWluYWwgcmVkaXJlY3Rpb24gKi8KKyNkZWZpbmUgVF9TSU5LCQk0MAkJLyogdW5rbm93biAqLworI2RlZmluZSBUX09QVAkJNDEJCS8qIEVETlMwIG9wdGlvbiAobWV0YS1SUikgKi8KKyNkZWZpbmUgVF9BUEwJCTQyCQkvKiBsaXN0cyBvZiBhZGRyZXNzIHByZWZpeGVzICovCisjZGVmaW5lIFRfRFMJCTQzCQkvKiBEZWxlZ2F0aW9uIFNpZ25lciAqLworI2RlZmluZSBUX1NTSEZQCQk0NAkJLyogU1NIIEZpbmdlcnByaW50ICovCisjZGVmaW5lIFRfSVBTRUNLRVkJNDUJCS8qIElQc2VjIGtleWluZyBtYXRlcmlhbCAqLworI2RlZmluZSBUX1JSU0lHCQk0NgkJLyogbmV3IHNlY3VyaXR5IHNpZ25hdHVyZSAqLworI2RlZmluZSBUX05TRUMJCTQ3CQkvKiBwcm92YWJsZSBpbnNlY3VyZSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX0ROU0tFWQk0OAkJLyogbmV3IHNlY3VyaXR5IGtleSAqLworCS8qIG5vbiBzdGFuZGFyZCAqLworI2RlZmluZSBUX1NQRgkJOTkJCS8qIHNlbmRlciBwb2xpY3kgZnJhbWV3b3JrICovCisjZGVmaW5lIFRfVUlORk8JCTEwMAkJLyogdXNlciAoZmluZ2VyKSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX1VJRAkJMTAxCQkvKiB1c2VyIElEICovCisjZGVmaW5lIFRfR0lECQkxMDIJCS8qIGdyb3VwIElEICovCisjZGVmaW5lIFRfVU5TUEVDCTEwMwkJLyogVW5zcGVjaWZpZWQgZm9ybWF0IChiaW5hcnkgZGF0YSkgKi8KKyNkZWZpbmUgVF9VTlNQRUNBCTEwNAkJLyogInVuc3BlY2lmaWVkIGFzY2lpIi4gVWdseSBNSVQgaGFjayAqLworCS8qIFF1ZXJ5IHR5cGUgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworI2RlZmluZSBUX1RLRVkJCTI0OQkJLyogVHJhbnNhY3Rpb24gS2V5IFtSRkMyOTMwXSAqLworI2RlZmluZSBUX1RTSUcJCTI1MAkJLyogVHJhbnNhY3Rpb24gU2lnbmF0dXJlIFtSRkMyODQ1XSAqLworI2RlZmluZSBUX0lYRlIJCTI1MQkJLyogaW5jcmVtZW50YWwgdHJhbnNmZXIgW1JGQzE5OTVdICovCisjZGVmaW5lIFRfQVhGUgkJMjUyCQkvKiB0cmFuc2ZlciB6b25lIG9mIGF1dGhvcml0eSAqLworI2RlZmluZSBUX01BSUxCCQkyNTMJCS8qIHRyYW5zZmVyIG1haWxib3ggcmVjb3JkcyAqLworI2RlZmluZSBUX01BSUxBCQkyNTQJCS8qIHRyYW5zZmVyIG1haWwgYWdlbnQgcmVjb3JkcyAqLworI2RlZmluZSBUX0FOWQkJMjU1CQkvKiB3aWxkY2FyZCBtYXRjaCAqLworCisvKgorICogVmFsdWVzIGZvciBjbGFzcyBmaWVsZAorICovCisKKyNkZWZpbmUgQ19JTgkJMQkJLyogdGhlIGFycGEgaW50ZXJuZXQgKi8KKyNkZWZpbmUgQ19DSEFPUwkJMwkJLyogZm9yIGNoYW9zIG5ldCAoTUlUKSAqLworI2RlZmluZSBDX0hTCQk0CQkvKiBmb3IgSGVzaW9kIG5hbWUgc2VydmVyIChNSVQpIChYWFgpICovCisJLyogUXVlcnkgY2xhc3MgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworI2RlZmluZSBDX0FOWQkJMjU1CQkvKiB3aWxkY2FyZCBtYXRjaCAqLworI2RlZmluZSBDX1FVCQkweDgwMDAJCS8qIG1ETlMgUVUgZmxhZyBpbiBxdWVyaWVzICovCisjZGVmaW5lIENfQ0FDSEVfRkxVU0gJMHg4MDAwCQkvKiBtRE5TIGNhY2hlIGZsdXNoIGZsYWcgaW4gcmVwbGllcyAqLworCisvKgorICogU3RhdHVzIHJldHVybiBjb2RlcyBmb3IgVF9VTlNQRUMgY29udmVyc2lvbiByb3V0aW5lcworICovCisjZGVmaW5lIENPTlZfU1VDQ0VTUyAwCisjZGVmaW5lIENPTlZfT1ZFUkZMT1cgLTEKKyNkZWZpbmUgQ09OVl9CQURGTVQgLTIKKyNkZWZpbmUgQ09OVl9CQURDS1NVTSAtMworI2RlZmluZSBDT05WX0JBREJVRkxFTiAtNAorCisvKgorICogU3RydWN0dXJlIGZvciBxdWVyeSBoZWFkZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1X2ludDE2X3QgaWQ7CQkvKiBxdWVyeSBpZGVudGlmaWNhdGlvbiBudW1iZXIgKi8KKwl1X2ludDhfdCAgZmxhZ3MxOwkvKiBmaXJzdCBieXRlIG9mIGZsYWdzICovCisJdV9pbnQ4X3QgIGZsYWdzMjsJLyogc2Vjb25kIGJ5dGUgb2YgZmxhZ3MgKi8KKwl1X2ludDE2X3QgcWRjb3VudDsJLyogbnVtYmVyIG9mIHF1ZXN0aW9uIGVudHJpZXMgKi8KKwl1X2ludDE2X3QgYW5jb3VudDsJLyogbnVtYmVyIG9mIGFuc3dlciBlbnRyaWVzICovCisJdV9pbnQxNl90IG5zY291bnQ7CS8qIG51bWJlciBvZiBhdXRob3JpdHkgZW50cmllcyAqLworCXVfaW50MTZfdCBhcmNvdW50OwkvKiBudW1iZXIgb2YgcmVzb3VyY2UgZW50cmllcyAqLworfSBIRUFERVI7CisKKy8qCisgKiBNYWNyb3MgZm9yIHN1YmZpZWxkcyBvZiBmbGFnIGZpZWxkcy4KKyAqLworI2RlZmluZSBETlNfUVIobnApCSgobnApLT5mbGFnczEgJiAweDgwKQkJLyogcmVzcG9uc2UgZmxhZyAqLworI2RlZmluZSBETlNfT1BDT0RFKG5wKQkoKCgobnApLT5mbGFnczEpID4+IDMpICYgMHhGKQkvKiBwdXJwb3NlIG9mIG1lc3NhZ2UgKi8KKyNkZWZpbmUgRE5TX0FBKG5wKQkoKG5wKS0+ZmxhZ3MxICYgMHgwNCkJCS8qIGF1dGhvcml0YXRpdmUgYW5zd2VyICovCisjZGVmaW5lIEROU19UQyhucCkJKChucCktPmZsYWdzMSAmIDB4MDIpCQkvKiB0cnVuY2F0ZWQgbWVzc2FnZSAqLworI2RlZmluZSBETlNfUkQobnApCSgobnApLT5mbGFnczEgJiAweDAxKQkJLyogcmVjdXJzaW9uIGRlc2lyZWQgKi8KKworI2RlZmluZSBETlNfUkEobnApCSgobnApLT5mbGFnczIgJiAweDgwKQkvKiByZWN1cnNpb24gYXZhaWxhYmxlICovCisjZGVmaW5lIEROU19BRChucCkJKChucCktPmZsYWdzMiAmIDB4MjApCS8qIGF1dGhlbnRpYyBkYXRhIGZyb20gbmFtZWQgKi8KKyNkZWZpbmUgRE5TX0NEKG5wKQkoKG5wKS0+ZmxhZ3MyICYgMHgxMCkJLyogY2hlY2tpbmcgZGlzYWJsZWQgYnkgcmVzb2x2ZXIgKi8KKyNkZWZpbmUgRE5TX1JDT0RFKG5wKQkoKG5wKS0+ZmxhZ3MyICYgMHhGKQkvKiByZXNwb25zZSBjb2RlICovCisKKy8qCisgKiBEZWZpbmVzIGZvciBoYW5kbGluZyBjb21wcmVzc2VkIGRvbWFpbiBuYW1lcywgRUROUzAgbGFiZWxzLCBldGMuCisgKi8KKyNkZWZpbmUgSU5ESVJfTUFTSwkweGMwCS8qIDExLi4uLiAqLworI2RlZmluZSBFRE5TMF9NQVNLCTB4NDAJLyogMDEuLi4uICovCisjICBkZWZpbmUgRUROUzBfRUxUX0JJVExBQkVMIDB4MDEKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgcGFzc2luZyByZXNvdXJjZSByZWNvcmRzIGFyb3VuZC4KKyAqLworc3RydWN0IHJyZWMgeworCWludDE2X3QJcl96b25lOwkJCS8qIHpvbmUgbnVtYmVyICovCisJaW50MTZfdAlyX2NsYXNzOwkJLyogY2xhc3MgbnVtYmVyICovCisJaW50MTZfdAlyX3R5cGU7CQkJLyogdHlwZSBudW1iZXIgKi8KKwl1X2ludDMyX3QJcl90dGw7CQkJLyogdGltZSB0byBsaXZlICovCisJaW50CXJfc2l6ZTsJCQkvKiBzaXplIG9mIGRhdGEgYXJlYSAqLworCWNoYXIJKnJfZGF0YTsJCS8qIHBvaW50ZXIgdG8gZGF0YSAqLworfTsKKworLyoKKyAqIElubGluZSB2ZXJzaW9ucyBvZiBnZXQvcHV0IHNob3J0L2xvbmcuICBQb2ludGVyIGlzIGFkdmFuY2VkLgorICogV2UgYWxzbyBhc3N1bWUgdGhhdCBhICJ1X2ludDE2X3QiIGhvbGRzIDIgImNoYXJzIgorICogYW5kIHRoYXQgYSAidV9pbnQzMl90IiBob2xkcyA0ICJjaGFycyIuCisgKgorICogVGhlc2UgbWFjcm9zIGRlbW9uc3RyYXRlIHRoZSBwcm9wZXJ0eSBvZiBDIHdoZXJlYnkgaXQgY2FuIGJlCisgKiBwb3J0YWJsZSBvciBpdCBjYW4gYmUgZWxlZ2FudCBidXQgbmV2ZXIgYm90aC4KKyAqLworI2RlZmluZSBHRVRTSE9SVChzLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkocykgPSAoKHVfaW50MTZfdCl0X2NwWzBdIDw8IDgpIHwgKHVfaW50MTZfdCl0X2NwWzFdOyBcCisJKGNwKSArPSAyOyBcCit9CisKKyNkZWZpbmUgR0VUTE9ORyhsLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkobCkgPSAoKCh1X2ludDMyX3QpdF9jcFswXSkgPDwgMjQpIFwKKwkgICAgfCAoKCh1X2ludDMyX3QpdF9jcFsxXSkgPDwgMTYpIFwKKwkgICAgfCAoKCh1X2ludDMyX3QpdF9jcFsyXSkgPDwgOCkgXAorCSAgICB8ICgoKHVfaW50MzJfdCl0X2NwWzNdKSk7IFwKKwkoY3ApICs9IDQ7IFwKK30KKworI2RlZmluZSBQVVRTSE9SVChzLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9pbnQxNl90IHRfcyA9ICh1X2ludDE2X3QpKHMpOyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkqdF9jcCsrID0gdF9zID4+IDg7IFwKKwkqdF9jcCAgID0gdF9zOyBcCisJKGNwKSArPSAyOyBcCit9CisKKy8qCisgKiBXYXJuaW5nOiBQVVRMT05HIC0tbm8tbG9uZ2VyLS0gZGVzdHJveXMgaXRzIGZpcnN0IGFyZ3VtZW50LiAgaWYgeW91CisgKiB3ZXJlIGRlcGVuZGluZyBvbiB0aGlzICJmZWF0dXJlIiwgeW91IHdpbGwgbG9zZS4KKyAqLworI2RlZmluZSBQVVRMT05HKGwsIGNwKSB7IFwKKwlyZWdpc3RlciB1X2ludDMyX3QgdF9sID0gKHVfaW50MzJfdCkobCk7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCSp0X2NwKysgPSB0X2wgPj4gMjQ7IFwKKwkqdF9jcCsrID0gdF9sID4+IDE2OyBcCisJKnRfY3ArKyA9IHRfbCA+PiA4OyBcCisJKnRfY3AgICA9IHRfbDsgXAorCShjcCkgKz0gNDsgXAorfQorCisjZW5kaWYgLyogIV9OQU1FU0VSX0hfICovCmRpZmYgLS1naXQgYS9uZXRiaW9zLmggYi9uZXRiaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhYmViYQotLS0gL2Rldi9udWxsCisrKyBiL25ldGJpb3MuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogTkVUQklPUyBwcm90b2NvbCBmb3JtYXRzCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9uZXRiaW9zLmgsdiAxLjMgMjAwMi8xMi8xMSAwNzoxMzo1NSBndXkgRXhwICQKKyAqLworCitzdHJ1Y3QgcDgwMjJIZHIgeworICAgIHVfY2hhcglkc2FwOworICAgIHVfY2hhcglzc2FwOworICAgIHVfY2hhcglmbGFnczsKK307CisKKyNkZWZpbmUJcDgwMjJTaXplCTMJCS8qIG1pbiA4MDIuMiBoZWFkZXIgc2l6ZSAqLworCisjZGVmaW5lIFVJCQkweDAzCQkvKiA4MDIuMiBmbGFncyAqLworCmRpZmYgLS1naXQgYS9uZXRkaXNzZWN0LmggYi9uZXRkaXNzZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwOTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL25ldGRpc3NlY3QuaApAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCAgTWljaGFlbCBSaWNoYXJkc29uIDxtY3JAdGNwZHVtcC5vcmc+CisgKiAgICAgIFRoZSBUQ1BEVU1QIHByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9uZXRkaXNzZWN0LmgsdiAxLjE2LjIuNCAyMDA2LzAyLzA4IDAxOjQwOjA5IGhhbm5lcyBFeHAgJCAoTEJMKQorICovCisKKyNpZm5kZWYgbmV0ZGlzc2VjdF9oCisjZGVmaW5lIG5ldGRpc3NlY3RfaAorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZuZGVmIEhBVkVfX19BVFRSSUJVVEVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYKKworLyogc25wcmludGYgZXQgYWwgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWYgIWRlZmluZWQoSEFWRV9TTlBSSU5URikKK2ludCBzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQoraW50IHZzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKKyAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDApKSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkxDQVQKK2V4dGVybiBzaXplX3Qgc3RybGNhdCAoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgSEFWRV9TVFJMQ1BZCitleHRlcm4gc2l6ZV90IHN0cmxjcHkgKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJEVVAKK2V4dGVybiBjaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cik7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlNFUAorZXh0ZXJuIGNoYXIgKnN0cnNlcChjaGFyICoqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKK3N0cnVjdCB0b2sgeworCWludCB2OwkJCS8qIHZhbHVlICovCisJY29uc3QgY2hhciAqczsJCS8qIHN0cmluZyAqLworfTsKKworI2RlZmluZSBUT0tCVUZTSVpFIDEyOAorZXh0ZXJuIGNvbnN0IGNoYXIgKnRvazJzdHJidWYoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCwKKwkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworCisvKiB0b2syc3RyIGlzIGRlcHJlY2F0ZWQgKi8KK2V4dGVybiBjb25zdCBjaGFyICp0b2syc3RyKGNvbnN0IHN0cnVjdCB0b2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOworZXh0ZXJuIGNoYXIgKmJpdHRvazJzdHIoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgbmV0ZGlzc2VjdF9vcHRpb25zIG5ldGRpc3NlY3Rfb3B0aW9uczsKKworc3RydWN0IG5ldGRpc3NlY3Rfb3B0aW9ucyB7CisgIGludCBuZG9fYWZsYWc7CQkvKiB0cmFuc2xhdGUgbmV0d29yayBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyAqLworICBpbnQgbmRvX2VmbGFnOwkJLyogcHJpbnQgZXRoZXJuZXQgaGVhZGVyICovCisgIGludCBuZG9fZmZsYWc7CQkvKiBkb24ndCB0cmFuc2xhdGUgImZvcmVpZ24iIElQIGFkZHJlc3MgKi8KKyAgaW50IG5kb19uZmxhZzsJCS8qIGxlYXZlIGFkZHJlc3NlcyBhcyBudW1iZXJzICovCisgIGludCBuZG9fTmZsYWc7CQkvKiByZW1vdmUgZG9tYWlucyBmcm9tIHByaW50ZWQgaG9zdCBuYW1lcyAqLworICBpbnQgbmRvX3FmbGFnOwkJLyogcXVpY2sgKHNob3J0ZXIpIG91dHB1dCAqLworICBpbnQgbmRvX1JmbGFnOwkJLyogcHJpbnQgc2VxdWVuY2UgIyBmaWVsZCBpbiBBSC9FU1AqLworICBpbnQgbmRvX3NmbGFnOwkJLyogdXNlIHRoZSBsaWJzbWkgdG8gdHJhbnNsYXRlIE9JRHMgKi8KKyAgaW50IG5kb19TZmxhZzsJCS8qIHByaW50IHJhdyBUQ1Agc2VxdWVuY2UgbnVtYmVycyAqLworICBpbnQgbmRvX3RmbGFnOwkJLyogcHJpbnQgcGFja2V0IGFycml2YWwgdGltZSAqLworICBpbnQgbmRvX1VmbGFnOwkJLyogInVuYnVmZmVyZWQiIG91dHB1dCBvZiBkdW1wIGZpbGVzICovCisgIGludCBuZG9fdWZsYWc7CQkvKiBQcmludCB1bmRlY29kZWQgTkZTIGhhbmRsZXMgKi8KKyAgaW50IG5kb192ZmxhZzsJCS8qIHZlcmJvc2UgKi8KKyAgaW50IG5kb194ZmxhZzsJCS8qIHByaW50IHBhY2tldCBpbiBoZXggKi8KKyAgaW50IG5kb19YZmxhZzsJCS8qIHByaW50IHBhY2tldCBpbiBoZXgvYXNjaWkgKi8KKyAgaW50IG5kb19BZmxhZzsJCS8qIHByaW50IHBhY2tldCBvbmx5IGluIGFzY2lpIG9ic2VydmluZyBUQUIsCisJCQkJICogTEYsIENSIGFuZCBTUEFDRSBhcyBncmFwaGljYWwgY2hhcnMKKwkJCQkgKi8KKyAgaW50IG5kb19PZmxhZzsgICAgICAgICAgICAgICAgLyogcnVuIGZpbHRlciBjb2RlIG9wdGltaXplciAqLworICBpbnQgbmRvX2RsdDsgICAgICAgICAgICAgICAgICAvKiBpZiAhPSAtMSwgYXNrIGxpYnBjYXAgZm9yIHRoZSBETFQgaXQgbmFtZXMqLworICBpbnQgbmRvX3BmbGFnOyAgICAgICAgICAgICAgICAvKiBkb24ndCBnbyBwcm9taXNjdW91cyAqLworCisgIGludCBuZG9fQ2ZsYWc7ICAgICAgICAgICAgICAgIC8qIHJvdGF0ZSBkdW1wIGZpbGVzIGFmdGVyIHRoaXMgbWFueSBieXRlcyAqLyAKKyAgaW50IG5kb19DZmxhZ19jb3VudDsgICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgbnVtYmVyIHdlJ3JlIHdyaXRpbmcgKi8KKyAgaW50IG5kb19XZmxhZzsgICAgICAgICAgLyogcmVjeWNsZSBvdXRwdXQgZmlsZXMgYWZ0ZXIgdGhpcyBudW1iZXIgb2YgZmlsZXMgKi8KKyAgaW50IG5kb19XZmxhZ0NoYXJzOworICBpbnQgbmRvX3N1cHByZXNzX2RlZmF1bHRfcHJpbnQ7IC8qIGRvbid0IHVzZSBkZWZhdWx0X3ByaW50KCkgZm9yIHVua25vd24gcGFja2V0IHR5cGVzICovCisgIGNvbnN0IGNoYXIgKm5kb19kbHRuYW1lOworCisgIGNoYXIgKm5kb19lc3BzZWNyZXQ7CisgIHN0cnVjdCBzYV9saXN0ICpuZG9fc2FfbGlzdF9oZWFkOyAgLyogdXNlZCBieSBwcmludC1lc3AuYyAqLworICBzdHJ1Y3Qgc2FfbGlzdCAqbmRvX3NhX2RlZmF1bHQ7CisKKyAgY2hhciAqbmRvX3RjcG1kNXNlY3JldDsgICAgIAkvKiBUQ1AtTUQ1IHNlY3JldCBrZXkgKi8KKworICBzdHJ1Y3QgZXNwX2FsZ29yaXRobSAqbmRvX2VzcHNlY3JldF94Zm9ybTsgICAvKiBjYWNoZSBvZiBkZWNvZGVkICAqLworICBjaGFyICAgICAgICAgICAgICAgICAqbmRvX2VzcHNlY3JldF9rZXk7CisKKyAgaW50ICAgbmRvX3BhY2tldHR5cGU7CS8qIGFzIHNwZWNpZmllZCBieSAtVCAqLworCisgIGNoYXIgKm5kb19wcm9ncmFtX25hbWU7CS8qdXNlZCB0byBnZW5lcmF0ZSBzZWxmLWlkZW50aWZ5aW5nIG1lc3NhZ2VzICovCisKKyAgaW50MzJfdCBuZG9fdGhpc3pvbmU7CS8qIHNlY29uZHMgb2Zmc2V0IGZyb20gZ210IHRvIGxvY2FsIHRpbWUgKi8KKworICBpbnQgICBuZG9fc25hcGxlbjsKKworICAvKmdsb2JhbCBwb2ludGVycyB0byBiZWdpbm5pbmcgYW5kIGVuZCBvZiBjdXJyZW50IHBhY2tldCAoZHVyaW5nIHByaW50aW5nKSAqLworICBjb25zdCB1X2NoYXIgKm5kb19wYWNrZXRwOworICBjb25zdCB1X2NoYXIgKm5kb19zbmFwZW5kOworCisgIC8qIGJvb2trZWVwaW5nIGZvciBeVCBvdXRwdXQgKi8KKyAgaW50IG5kb19pbmZvZGVsYXk7CisKKyAgLyogcG9pbnRlciB0byB2b2lkIGZ1bmN0aW9uIHRvIG91dHB1dCBzdHVmZiAqLworICB2b2lkICgqbmRvX2RlZmF1bHRfcHJpbnQpKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorICAJCSAgICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCk7CisgIHZvaWQgKCpuZG9faW5mbykobmV0ZGlzc2VjdF9vcHRpb25zICosIGludCB2ZXJib3NlKTsKKworICBpbnQgICgqbmRvX3ByaW50ZikobmV0ZGlzc2VjdF9vcHRpb25zICosCisJCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOworICB2b2lkICgqbmRvX2Vycm9yKShuZXRkaXNzZWN0X29wdGlvbnMgKiwKKwkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKyAgdm9pZCAoKm5kb193YXJuaW5nKShuZXRkaXNzZWN0X29wdGlvbnMgKiwKKwkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOworfTsKKworI2RlZmluZSBQVF9WQVQJCTEJLyogVmlzdWFsIEF1ZGlvIFRvb2wgKi8KKyNkZWZpbmUgUFRfV0IJCTIJLyogZGlzdHJpYnV0ZWQgV2hpdGUgQm9hcmQgKi8KKyNkZWZpbmUgUFRfUlBDCQkzCS8qIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCAqLworI2RlZmluZSBQVF9SVFAJCTQJLyogUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBwcm90b2NvbCAqLworI2RlZmluZSBQVF9SVENQCQk1CS8qIFJlYWwtVGltZSBBcHBsaWNhdGlvbnMgY29udHJvbCBwcm90b2NvbCAqLworI2RlZmluZSBQVF9TTk1QCQk2CS8qIFNpbXBsZSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFRfQ05GUAkJNwkvKiBDaXNjbyBOZXRGbG93IHByb3RvY29sICovCisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpICgoYSk+KGIpPyhiKTooYSkpCisjZW5kaWYKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYik+KGEpPyhiKTooYSkpCisjZW5kaWYKKworI2lmbmRlZiBJTkVUNgorLyoKKyAqIFRoZSBkZWZhdWx0IHNuYXBzaG90IGxlbmd0aC4gIFRoaXMgdmFsdWUgYWxsb3dzIG1vc3QgcHJpbnRlcnMgdG8gcHJpbnQKKyAqIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGlsZSBrZWVwaW5nIHRoZSBhbW91bnQgb2YgdW53YW50ZWQgZGF0YSBkb3duLgorICogSW4gcGFydGljdWxhciwgaXQgYWxsb3dzIGZvciBhbiBldGhlcm5ldCBoZWFkZXIsIHRjcC9pcCBoZWFkZXIsIGFuZAorICogMTQgYnl0ZXMgb2YgZGF0YSAoYXNzdW1pbmcgbm8gaXAgb3B0aW9ucykuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9TTkFQTEVOIDY4CisjZWxzZQorI2RlZmluZSBERUZBVUxUX1NOQVBMRU4gOTYKKyNlbmRpZgorCisjaWZuZGVmIEJJR19FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTiA0MzIxCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAorI2VuZGlmCisKKyNkZWZpbmUgRVNSQyhlcCkgKChlcCktPmV0aGVyX3Nob3N0KQorI2RlZmluZSBFRFNUKGVwKSAoKGVwKS0+ZXRoZXJfZGhvc3QpCisKKyNpZm5kZWYgTlRPSEwKKyNkZWZpbmUgTlRPSEwoeCkJKHgpID0gbnRvaGwoeCkKKyNkZWZpbmUgTlRPSFMoeCkJKHgpID0gbnRvaHMoeCkKKyNkZWZpbmUgSFRPTkwoeCkJKHgpID0gaHRvbmwoeCkKKyNkZWZpbmUgSFRPTlMoeCkJKHgpID0gaHRvbnMoeCkKKyNlbmRpZgorCisvKgorICogVHJ1ZSBpZiAibCIgYnl0ZXMgb2YgInZhciIgd2VyZSBjYXB0dXJlZC4KKyAqCisgKiBUaGUgIm5kby0+bmRvX3NuYXBlbmQgLSAobCkgPD0gbmRvLT5uZG9fc25hcGVuZCIgY2hlY2tzIHRvIG1ha2Ugc3VyZQorICogImwiIGlzbid0IHNvIGxhcmdlIHRoYXQgIm5kby0+bmRvX3NuYXBlbmQgLSAobCkiIHVuZGVyZmxvd3MuCisgKgorICogVGhlIGNoZWNrIGlzIGZvciA8PSByYXRoZXIgdGhhbiA8IGJlY2F1c2UgImwiIG1pZ2h0IGJlIDAuCisgKi8KKyNkZWZpbmUgTkRfVFRFU1QyKHZhciwgbCkgKG5kby0+bmRvX3NuYXBlbmQgLSAobCkgPD0gbmRvLT5uZG9fc25hcGVuZCAmJiBcCisJCQkoY29uc3QgdV9jaGFyICopJih2YXIpIDw9IG5kby0+bmRvX3NuYXBlbmQgLSAobCkpCisKKy8qIFRydWUgaWYgInZhciIgd2FzIGNhcHR1cmVkICovCisjZGVmaW5lIE5EX1RURVNUKHZhcikgTkRfVFRFU1QyKHZhciwgc2l6ZW9mKHZhcikpCisKKy8qIEJhaWwgaWYgImwiIGJ5dGVzIG9mICJ2YXIiIHdlcmUgbm90IGNhcHR1cmVkICovCisjZGVmaW5lIE5EX1RDSEVDSzIodmFyLCBsKSBpZiAoIU5EX1RURVNUMih2YXIsIGwpKSBnb3RvIHRydW5jCisKKy8qIEJhaWwgaWYgInZhciIgd2FzIG5vdCBjYXB0dXJlZCAqLworI2RlZmluZSBORF9UQ0hFQ0sodmFyKSBORF9UQ0hFQ0syKHZhciwgc2l6ZW9mKHZhcikpCisKKyNkZWZpbmUgTkRfUFJJTlQoU1RVRkYpICgqbmRvLT5uZG9fcHJpbnRmKVNUVUZGCisjZGVmaW5lIE5EX0RFRkFVTFRQUklOVChhcCwgbGVuZ3RoKSAoKm5kby0+bmRvX2RlZmF1bHRfcHJpbnQpKG5kbywgYXAsIGxlbmd0aCkKKworI2lmIDAJCitleHRlcm4gdm9pZCB0c19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKmlwZG8sCisJCSAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7CitleHRlcm4gdm9pZCByZWx0c19wcmludChpbnQpOworI2VuZGlmCisKK2V4dGVybiBpbnQgZm5fcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiBpbnQgZm5fcHJpbnRuKGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnRvazJzdHIoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCk7CisKK2V4dGVybiB2b2lkIHdyYXB1cChpbnQpOworCisjaWYgMAorZXh0ZXJuIGNoYXIgKnJlYWRfaW5maWxlKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCBjaGFyICopOworZXh0ZXJuIGNoYXIgKmNvcHlfYXJndihuZXRkaXNzZWN0X29wdGlvbnMgKiwgY2hhciAqKik7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc2FmZXB1dGNoYXIoaW50KTsKK2V4dGVybiB2b2lkIHNhZmVwdXRzKGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2lmIDAKK2V4dGVybiBjb25zdCBjaGFyICppc29uc2FwX3N0cmluZyhuZXRkaXNzZWN0X29wdGlvbnMgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnByb3RvaWRfc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqZG5uYW1lX3N0cmluZyhuZXRkaXNzZWN0X29wdGlvbnMgKiwgdV9zaG9ydCk7CitleHRlcm4gY29uc3QgY2hhciAqZG5udW1fc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCB1X3Nob3J0KTsKKyNlbmRpZgorCisvKiBUaGUgcHJpbnRlciByb3V0aW5lcy4gKi8KKworI2luY2x1ZGUgPHBjYXAuaD4KKworCitleHRlcm4gdm9pZCBlYXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsgICAgCitleHRlcm4gaW50IGVzcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKiwKKwkJICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMiwKKwkJICAgICBpbnQgKm5oZHIsIGludCAqcGFkbGVuKTsKK2V4dGVybiB2b2lkIGFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKK2V4dGVybiB2b2lkIGlzYWttcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKKwkJCSB1X2ludCwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgaXNha21wX3JmYzM5NDhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCisJCQkJIHVfaW50LCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBpcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaXBfcHJpbnRfaW5uZXIobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCQkgICBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIHVfaW50IG5oLAorCQkJICAgY29uc3QgdV9jaGFyICpicDIpOworCisvKiBzdHVmZiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gcm90b3RpbGVkICovCisjaWYgMAorZXh0ZXJuIHZvaWQgYXNjaWlfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosdV9pbnQpOworZXh0ZXJuIHZvaWQgaGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCBjaGFyICosCisJCQkJICAgIHVfaW50LCB1X2ludCk7CitleHRlcm4gdm9pZCBoZXhfYW5kX2FzY2lpX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IGNoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaGV4X3ByaW50X3dpdGhfb2Zmc2V0KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IGNoYXIgKiwKKwkJCQkgIHVfaW50LCB1X2ludCk7CitleHRlcm4gdm9pZCBoZXhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCB0ZWxuZXRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiBpbnQgZXRoZXJfZW5jYXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosdV9zaG9ydCwgY29uc3QgdV9jaGFyICosCisJCQkgICAgIHVfaW50LCB1X2ludCwgdV9zaG9ydCAqKTsKK2V4dGVybiBpbnQgbGxjX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorCQkgICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLAorCQkgICAgIGNvbnN0IHVfY2hhciAqLCB1X3Nob3J0ICopOworZXh0ZXJuIHZvaWQgYWFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgYXRhbGtfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGF0bV9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgYm9vdHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCisJCQl1X2ludCwgdV9zaG9ydCwgdV9zaG9ydCk7CitleHRlcm4gdm9pZCBiZ3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gdm9pZCBieHhwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBjaGRsY19pZl9wcmludCh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKKwkJCSAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCk7CitleHRlcm4gdm9pZCBjaGRsY19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKKwkJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pOworZXh0ZXJuIHZvaWQgY2lzY29fYXV0b3JwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorCQkJICAgICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBjbmZwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqY3AsCisJCSAgICAgICB1X2ludCBsZW4sIGNvbnN0IHVfY2hhciAqYnApOworZXh0ZXJuIHZvaWQgZGVjbmV0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAorCQkJIHVfaW50LCB1X2ludCk7CitleHRlcm4gdm9pZCBkZWZhdWx0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBkdm1ycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgZWdwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCwKKwkJICAgICAgY29uc3QgdV9jaGFyICopOworCitleHRlcm4gdm9pZCBhcmNuZXRfaWZfcHJpbnQodV9jaGFyKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBldGhlcl9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCB0b2tlbl9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBmZGRpX2lmX3ByaW50KHVfY2hhciAqLGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CisKK2V4dGVybiB2b2lkIGdyZV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaWNtcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisJCSAgICAgICBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBoc3JwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCQkgICAgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKTsKK2V4dGVybiB2b2lkIGllZWU4MDJfMTFfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGlnbXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosCisJCSAgICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaWdycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisJCSAgICAgICBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBpcE5fcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGlweF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgaXNvY2xuc19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKKwkJCSAgdV9pbnQsIHVfaW50LCBjb25zdCB1X2NoYXIgKiwJY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQga3JiX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBsbGFwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gY29uc3QgY2hhciAqbGlua2FkZHJfc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCQkJCSAgIGNvbnN0IHVfY2hhciAqZXAsIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pOworZXh0ZXJuIHZvaWQgbHRhbGtfaWZfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCQkgICB1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKKwkJCSAgIGNvbnN0IHVfY2hhciAqcCk7CitleHRlcm4gdm9pZCBtcGxzX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCQkgICAgICAgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKTsKK2V4dGVybiB2b2lkIG1zZHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcCwgdV9pbnQgbGVuZ3RoKTsKK2V4dGVybiB2b2lkIG5mc3JlcGx5X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAorCQkJICAgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIG5mc3JlcV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKKwkJCSB1X2ludCwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgbnNfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIG50cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbnVsbF9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgb3NwZl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKKwkJICAgICAgIHVfaW50LCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBwaW12MV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgbW9iaWxlX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBwaW1fcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHBwcG9lX2lmX3ByaW50KHVfY2hhciAqLGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBwcHBvZV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgcHBwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorCQkgICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworCitleHRlcm4gdm9pZCBwcHBfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIHBwcF9oZGxjX2lmX3ByaW50KHVfY2hhciAqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIHBwcF9ic2Rvc19pZl9wcmludCh1X2NoYXIgKiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworCitleHRlcm4gaW50IHZqY19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCBjaGFyICosCisJCSAgICAgcmVnaXN0ZXIgdV9pbnQsIHVfc2hvcnQpOworCitleHRlcm4gdm9pZCByYXdfaWZfcHJpbnQodV9jaGFyICosCisJCQkgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKKworZXh0ZXJuIHZvaWQgcmlwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CisKK2V4dGVybiB2b2lkIHNjdHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCSAgICAgICBjb25zdCB1X2NoYXIgKmJwLCBjb25zdCB1X2NoYXIgKmJwMiwgICAgICAgCisJCSAgICAgICB1X2ludCBzY3RwUGFja2V0TGVuZ3RoKTsKKworZXh0ZXJuIHZvaWQgc2xfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKKworZXh0ZXJuIHZvaWQgbGFuZV9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBjaXBfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgc2xfYnNkb3NfaWZfcHJpbnQodV9jaGFyICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgc2xsX2lmX3ByaW50KHVfY2hhciAqLAorCQkJIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CisKK2V4dGVybiB2b2lkIHNubXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHN1bnJwY3JlcXVlc3RfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCisJCQkJdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIHRjcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisJCSAgICAgIGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdGZ0cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworZXh0ZXJuIHZvaWQgdGltZWRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHVkcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCisJCSAgICAgIGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgd2JfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3Qgdm9pZCAqLCB1X2ludCk7CitleHRlcm4gaW50IGFoX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLAorCQkgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgZXNwX3ByaW50X2RlY29kZXNlY3JldChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbyk7CitleHRlcm4gaW50IGlwY29tcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwKKwkJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCBpbnQgKik7CitleHRlcm4gdm9pZCByeF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwKKwkJICAgICBpbnQsIGludCwgaW50LCB1X2NoYXIgKik7CitleHRlcm4gdm9pZCBuZXRiZXVpX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLHVfc2hvcnQsCisJCQkgIGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgaXB4X25ldGJpb3NfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIG5idF90Y3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gdm9pZCBuYnRfdWRwMTM3X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorCQkJICAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCk7CitleHRlcm4gdm9pZCBuYnRfdWRwMTM4X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAorCQkJICAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCk7CitleHRlcm4gY2hhciAqc21iX2VycnN0cihuZXRkaXNzZWN0X29wdGlvbnMgKixpbnQsIGludCk7CitleHRlcm4gY29uc3QgY2hhciAqbnRfZXJyc3RyKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCB1X2ludDMyX3QpOworZXh0ZXJuIHZvaWQgcHJpbnRfZGF0YShuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCBsMnRwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBsY3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIHZycnBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICpicCwKKwkJICAgICAgIHVfaW50IGxlbiwgaW50IHR0bCk7CitleHRlcm4gdm9pZCBjZHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCisJCSAgICAgIHVfaW50LCB1X2ludCwgY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIHN0cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCk7CitleHRlcm4gdm9pZCByYWRpdXNfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGx3cmVzX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBwcHRwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CisKKyNpZmRlZiBJTkVUNgorZXh0ZXJuIHZvaWQgaXA2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitleHRlcm4gdm9pZCBpcDZfb3B0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCBpbnQpOworZXh0ZXJuIGludCBoYmhvcHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGludCBkc3RvcHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICopOworZXh0ZXJuIGludCBmcmFnNl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKKwkJICAgICAgIGNvbnN0IHVfY2hhciAqKTsKK2V4dGVybiB2b2lkIGljbXA2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAorCQkJY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgcmlwbmdfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7CitleHRlcm4gaW50IHJ0Nl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOworZXh0ZXJuIHZvaWQgb3NwZjZfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKK2V4dGVybiB2b2lkIGRoY3A2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAorCQkJdV9pbnQsIHVfaW50MTZfdCwgdV9pbnQxNl90KTsKKworZXh0ZXJuIHZvaWQgemVwaHlyX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqIG5kbywKKwkJCSBjb25zdCB1X2NoYXIgKmNwLCBpbnQgbGVuZ3RoKTsKKworI2VuZGlmIC8qSU5FVDYqLworZXh0ZXJuIHVfc2hvcnQgaW5fY2tzdW0oY29uc3QgdV9zaG9ydCAqLAorCQkJcmVnaXN0ZXIgdV9pbnQsIGludCk7CisKKyNlbmRpZgorCisjZW5kaWYgIC8qIG5ldGRpc3NlY3RfaCAqLwpkaWZmIC0tZ2l0IGEvbmZzLmggYi9uZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQ3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLmgKQEAgLTAsMCArMSw0NTMgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbmZzLmgsdiAxLjcgMjAwMi8xMi8xMSAwNzoxMzo1NSBndXkgRXhwICQgKExCTCkgKi8KKy8qCSROZXRCU0Q6IG5mcy5oLHYgMS4xIDE5OTYvMDUvMjMgMjI6NDk6NTMgZnZkbCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBSaWNrIE1hY2tsZW0gYXQgVGhlIFVuaXZlcnNpdHkgb2YgR3VlbHBoLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKW5mc3Byb3RvLmgJOC4yIChCZXJrZWxleSkgMy8zMC85NQorICovCisKKy8qCisgKiBuZnMgZGVmaW5pdGlvbnMgYXMgcGVyIHRoZSBWZXJzaW9uIDIgYW5kIDMgc3BlY3MKKyAqLworCisvKgorICogQ29uc3RhbnRzIGFzIGRlZmluZWQgaW4gdGhlIFN1biBORlMgVmVyc2lvbiAyIGFuZCAzIHNwZWNzLgorICogIk5GUzogTmV0d29yayBGaWxlIFN5c3RlbSBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIiBSRkMxMDk0CisgKiBhbmQgaW4gdGhlICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gVmVyc2lvbiAzIFByb3RvY29sCisgKiBTcGVjaWZpY2F0aW9uIgorICovCisKKyNkZWZpbmUgTkZTX1BPUlQJMjA0OQorI2RlZmluZQlORlNfUFJPRwkxMDAwMDMKKyNkZWZpbmUgTkZTX1ZFUjIJMgorI2RlZmluZQlORlNfVkVSMwkzCisjZGVmaW5lIE5GU19WMk1BWERBVEEJODE5MgorI2RlZmluZQlORlNfTUFYREdSQU1EQVRBIDE2Mzg0CisjZGVmaW5lCU5GU19NQVhEQVRBCTMyNzY4CisjZGVmaW5lCU5GU19NQVhQQVRITEVOCTEwMjQKKyNkZWZpbmUJTkZTX01BWE5BTUxFTgkyNTUKKyNkZWZpbmUJTkZTX01BWFBLVEhEUgk0MDQKKyNkZWZpbmUgTkZTX01BWFBBQ0tFVAkoTkZTX01BWFBLVEhEUiArIE5GU19NQVhEQVRBKQorI2RlZmluZQlORlNfTUlOUEFDS0VUCTIwCisjZGVmaW5lCU5GU19GQUJMS1NJWkUJNTEyCS8qIFNpemUgaW4gYnl0ZXMgb2YgYSBibG9jayB3cnQgZmFfYmxvY2tzICovCisKKy8qIFN0YXQgbnVtYmVycyBmb3IgcnBjIHJldHVybnMgKHZlcnNpb24gMiBhbmQgMykgKi8KKyNkZWZpbmUJTkZTX09LCQkJMAorI2RlZmluZQlORlNFUlJfUEVSTQkJMQorI2RlZmluZQlORlNFUlJfTk9FTlQJCTIKKyNkZWZpbmUJTkZTRVJSX0lPCQk1CisjZGVmaW5lCU5GU0VSUl9OWElPCQk2CisjZGVmaW5lCU5GU0VSUl9BQ0NFUwkJMTMKKyNkZWZpbmUJTkZTRVJSX0VYSVNUCQkxNworI2RlZmluZQlORlNFUlJfWERFVgkJMTgJLyogVmVyc2lvbiAzIG9ubHkgKi8KKyNkZWZpbmUJTkZTRVJSX05PREVWCQkxOQorI2RlZmluZQlORlNFUlJfTk9URElSCQkyMAorI2RlZmluZQlORlNFUlJfSVNESVIJCTIxCisjZGVmaW5lCU5GU0VSUl9JTlZBTAkJMjIJLyogVmVyc2lvbiAzIG9ubHkgKi8KKyNkZWZpbmUJTkZTRVJSX0ZCSUcJCTI3CisjZGVmaW5lCU5GU0VSUl9OT1NQQwkJMjgKKyNkZWZpbmUJTkZTRVJSX1JPRlMJCTMwCisjZGVmaW5lCU5GU0VSUl9NTElOSwkJMzEJLyogVmVyc2lvbiAzIG9ubHkgKi8KKyNkZWZpbmUJTkZTRVJSX05BTUVUT0wJCTYzCisjZGVmaW5lCU5GU0VSUl9OT1RFTVBUWQkJNjYKKyNkZWZpbmUJTkZTRVJSX0RRVU9UCQk2OQorI2RlZmluZQlORlNFUlJfU1RBTEUJCTcwCisjZGVmaW5lCU5GU0VSUl9SRU1PVEUJCTcxCS8qIFZlcnNpb24gMyBvbmx5ICovCisjZGVmaW5lCU5GU0VSUl9XRkxVU0gJCTk5CS8qIFZlcnNpb24gMiBvbmx5ICovCisjZGVmaW5lCU5GU0VSUl9CQURIQU5ETEUJMTAwMDEJLyogVGhlIHJlc3QgVmVyc2lvbiAzIG9ubHkgKi8KKyNkZWZpbmUJTkZTRVJSX05PVF9TWU5DCQkxMDAwMgorI2RlZmluZQlORlNFUlJfQkFEX0NPT0tJRQkxMDAwMworI2RlZmluZQlORlNFUlJfTk9UU1VQUAkJMTAwMDQKKyNkZWZpbmUJTkZTRVJSX1RPT1NNQUxMCQkxMDAwNQorI2RlZmluZQlORlNFUlJfU0VSVkVSRkFVTFQJMTAwMDYKKyNkZWZpbmUJTkZTRVJSX0JBRFRZUEUJCTEwMDA3CisjZGVmaW5lCU5GU0VSUl9KVUtFQk9YCQkxMDAwOAorI2RlZmluZSBORlNFUlJfVFJZTEFURVIJCU5GU0VSUl9KVUtFQk9YCisjZGVmaW5lCU5GU0VSUl9TVEFMRVdSSVRFVkVSRgkzMDAwMQkvKiBGYWtlIHJldHVybiBmb3IgbmZzX2NvbW1pdCgpICovCisKKyNkZWZpbmUgTkZTRVJSX1JFVFZPSUQJCTB4MjAwMDAwMDAgLyogUmV0dXJuIHZvaWQsIG5vdCBlcnJvciAqLworI2RlZmluZSBORlNFUlJfQVVUSEVSUgkJMHg0MDAwMDAwMCAvKiBNYXJrIGFuIGF1dGhlbnRpY2F0aW9uIGVycm9yICovCisjZGVmaW5lIE5GU0VSUl9SRVRFUlIJCTB4ODAwMDAwMDAgLyogTWFyayBhbiBlcnJvciByZXR1cm4gZm9yIFYzICovCisKKy8qIFNpemVzIGluIGJ5dGVzIG9mIHZhcmlvdXMgbmZzIHJwYyBjb21wb25lbnRzICovCisjZGVmaW5lCU5GU1hfVU5TSUdORUQJNAorCisvKiBzcGVjaWZpYyB0byBORlMgVmVyc2lvbiAyICovCisjZGVmaW5lCU5GU1hfVjJGSAkzMgorI2RlZmluZQlORlNYX1YyRkFUVFIJNjgKKyNkZWZpbmUJTkZTWF9WMlNBVFRSCTMyCisjZGVmaW5lCU5GU1hfVjJDT09LSUUJNAorI2RlZmluZSBORlNYX1YyU1RBVEZTCTIwCisKKy8qIHNwZWNpZmljIHRvIE5GUyBWZXJzaW9uIDMgKi8KKyNpZiAwCisjZGVmaW5lIE5GU1hfVjNGSAkJKHNpemVvZiAoZmhhbmRsZV90KSkgLyogc2l6ZSB0aGlzIHNlcnZlciB1c2VzICovCisjZW5kaWYKKyNkZWZpbmUJTkZTWF9WM0ZITUFYCQk2NAkvKiBtYXguIGFsbG93ZWQgYnkgcHJvdG9jb2wgKi8KKyNkZWZpbmUgTkZTWF9WM0ZBVFRSCQk4NAorI2RlZmluZSBORlNYX1YzU0FUVFIJCTYwCS8qIG1heC4gYWxsIGZpZWxkcyBmaWxsZWQgaW4gKi8KKyNkZWZpbmUgTkZTWF9WM1NSVlNBVFRSCQkoc2l6ZW9mIChzdHJ1Y3QgbmZzdjNfc2F0dHIpKQorI2RlZmluZSBORlNYX1YzUE9TVE9QQVRUUgkoTkZTWF9WM0ZBVFRSICsgTkZTWF9VTlNJR05FRCkKKyNkZWZpbmUgTkZTWF9WM1dDQ0RBVEEJCShORlNYX1YzUE9TVE9QQVRUUiArIDggKiBORlNYX1VOU0lHTkVEKQorI2RlZmluZSBORlNYX1YzQ09PS0lFVkVSRiAJOAorI2RlZmluZSBORlNYX1YzV1JJVEVWRVJGIAk4CisjZGVmaW5lIE5GU1hfVjNDUkVBVEVWRVJGCTgKKyNkZWZpbmUgTkZTWF9WM1NUQVRGUwkJNTIKKyNkZWZpbmUgTkZTWF9WM0ZTSU5GTwkJNDgKKyNkZWZpbmUgTkZTWF9WM1BBVEhDT05GCQkyNAorCisvKiB2YXJpYW50cyBmb3IgYm90aCB2ZXJzaW9ucyAqLworI2RlZmluZSBORlNYX0ZIKHYzKQkJKCh2MykgPyAoTkZTWF9WM0ZITUFYICsgTkZTWF9VTlNJR05FRCkgOiBcCisJCQkJCU5GU1hfVjJGSCkKKyNkZWZpbmUgTkZTWF9TUlZGSCh2MykJCSgodjMpID8gTkZTWF9WM0ZIIDogTkZTWF9WMkZIKQorI2RlZmluZQlORlNYX0ZBVFRSKHYzKQkJKCh2MykgPyBORlNYX1YzRkFUVFIgOiBORlNYX1YyRkFUVFIpCisjZGVmaW5lIE5GU1hfUFJFT1BBVFRSKHYzKQkoKHYzKSA/ICg3ICogTkZTWF9VTlNJR05FRCkgOiAwKQorI2RlZmluZSBORlNYX1BPU1RPUEFUVFIodjMpCSgodjMpID8gKE5GU1hfVjNGQVRUUiArIE5GU1hfVU5TSUdORUQpIDogMCkKKyNkZWZpbmUgTkZTWF9QT1NUT1BPUkZBVFRSKHYzKQkoKHYzKSA/IChORlNYX1YzRkFUVFIgKyBORlNYX1VOU0lHTkVEKSA6IFwKKwkJCQkJTkZTWF9WMkZBVFRSKQorI2RlZmluZSBORlNYX1dDQ0RBVEEodjMpCSgodjMpID8gTkZTWF9WM1dDQ0RBVEEgOiAwKQorI2RlZmluZSBORlNYX1dDQ09SRkFUVFIodjMpCSgodjMpID8gTkZTWF9WM1dDQ0RBVEEgOiBORlNYX1YyRkFUVFIpCisjZGVmaW5lCU5GU1hfU0FUVFIodjMpCQkoKHYzKSA/IE5GU1hfVjNTQVRUUiA6IE5GU1hfVjJTQVRUUikKKyNkZWZpbmUJTkZTWF9DT09LSUVWRVJGKHYzKQkoKHYzKSA/IE5GU1hfVjNDT09LSUVWRVJGIDogMCkKKyNkZWZpbmUJTkZTWF9XUklURVZFUkYodjMpCSgodjMpID8gTkZTWF9WM1dSSVRFVkVSRiA6IDApCisjZGVmaW5lIE5GU1hfUkVBRERJUih2MykJKCh2MykgPyAoNSAqIE5GU1hfVU5TSUdORUQpIDogXAorCQkJCQkoMiAqIE5GU1hfVU5TSUdORUQpKQorI2RlZmluZQlORlNYX1NUQVRGUyh2MykJCSgodjMpID8gTkZTWF9WM1NUQVRGUyA6IE5GU1hfVjJTVEFURlMpCisKKy8qIG5mcyBycGMgcHJvY2VkdXJlIG51bWJlcnMgKGJlZm9yZSB2ZXJzaW9uIG1hcHBpbmcpICovCisjZGVmaW5lCU5GU1BST0NfTlVMTAkJMAorI2RlZmluZQlORlNQUk9DX0dFVEFUVFIJCTEKKyNkZWZpbmUJTkZTUFJPQ19TRVRBVFRSCQkyCisjZGVmaW5lCU5GU1BST0NfTE9PS1VQCQkzCisjZGVmaW5lCU5GU1BST0NfQUNDRVNTCQk0CisjZGVmaW5lCU5GU1BST0NfUkVBRExJTksJNQorI2RlZmluZQlORlNQUk9DX1JFQUQJCTYKKyNkZWZpbmUJTkZTUFJPQ19XUklURQkJNworI2RlZmluZQlORlNQUk9DX0NSRUFURQkJOAorI2RlZmluZQlORlNQUk9DX01LRElSCQk5CisjZGVmaW5lCU5GU1BST0NfU1lNTElOSwkJMTAKKyNkZWZpbmUJTkZTUFJPQ19NS05PRAkJMTEKKyNkZWZpbmUJTkZTUFJPQ19SRU1PVkUJCTEyCisjZGVmaW5lCU5GU1BST0NfUk1ESVIJCTEzCisjZGVmaW5lCU5GU1BST0NfUkVOQU1FCQkxNAorI2RlZmluZQlORlNQUk9DX0xJTksJCTE1CisjZGVmaW5lCU5GU1BST0NfUkVBRERJUgkJMTYKKyNkZWZpbmUJTkZTUFJPQ19SRUFERElSUExVUwkxNworI2RlZmluZQlORlNQUk9DX0ZTU1RBVAkJMTgKKyNkZWZpbmUJTkZTUFJPQ19GU0lORk8JCTE5CisjZGVmaW5lCU5GU1BST0NfUEFUSENPTkYJMjAKKyNkZWZpbmUJTkZTUFJPQ19DT01NSVQJCTIxCisKKy8qIEFuZCBsZWFzaW5nIChucW5mcykgcHJvY2VkdXJlIG51bWJlcnMgKG11c3QgYmUgbGFzdCkgKi8KKyNkZWZpbmUJTlFORlNQUk9DX0dFVExFQVNFCTIyCisjZGVmaW5lCU5RTkZTUFJPQ19WQUNBVEVECTIzCisjZGVmaW5lCU5RTkZTUFJPQ19FVklDVEVECTI0CisKKyNkZWZpbmUgTkZTUFJPQ19OT09QCQkyNQorI2RlZmluZQlORlNfTlBST0NTCQkyNgorCisvKiBBY3R1YWwgVmVyc2lvbiAyIHByb2NlZHVyZSBudW1iZXJzICovCisjZGVmaW5lCU5GU1YyUFJPQ19OVUxMCQkwCisjZGVmaW5lCU5GU1YyUFJPQ19HRVRBVFRSCTEKKyNkZWZpbmUJTkZTVjJQUk9DX1NFVEFUVFIJMgorI2RlZmluZQlORlNWMlBST0NfTk9PUAkJMworI2RlZmluZQlORlNWMlBST0NfUk9PVAkJTkZTVjJQUk9DX05PT1AJLyogT2Jzb2xldGUgKi8KKyNkZWZpbmUJTkZTVjJQUk9DX0xPT0tVUAk0CisjZGVmaW5lCU5GU1YyUFJPQ19SRUFETElOSwk1CisjZGVmaW5lCU5GU1YyUFJPQ19SRUFECQk2CisjZGVmaW5lCU5GU1YyUFJPQ19XUklURUNBQ0hFCU5GU1YyUFJPQ19OT09QCS8qIE9ic29sZXRlICovCisjZGVmaW5lCU5GU1YyUFJPQ19XUklURQkJOAorI2RlZmluZQlORlNWMlBST0NfQ1JFQVRFCTkKKyNkZWZpbmUJTkZTVjJQUk9DX1JFTU9WRQkxMAorI2RlZmluZQlORlNWMlBST0NfUkVOQU1FCTExCisjZGVmaW5lCU5GU1YyUFJPQ19MSU5LCQkxMgorI2RlZmluZQlORlNWMlBST0NfU1lNTElOSwkxMworI2RlZmluZQlORlNWMlBST0NfTUtESVIJCTE0CisjZGVmaW5lCU5GU1YyUFJPQ19STURJUgkJMTUKKyNkZWZpbmUJTkZTVjJQUk9DX1JFQURESVIJMTYKKyNkZWZpbmUJTkZTVjJQUk9DX1NUQVRGUwkxNworCisvKgorICogQ29uc3RhbnRzIHVzZWQgYnkgdGhlIFZlcnNpb24gMyBwcm90b2NvbCBmb3IgdmFyaW91cyBSUENzCisgKi8KKyNkZWZpbmUgTkZTVjNTQVRUUlRJTUVfRE9OVENIQU5HRQkwCisjZGVmaW5lIE5GU1YzU0FUVFJUSU1FX1RPU0VSVkVSCQkxCisjZGVmaW5lIE5GU1YzU0FUVFJUSU1FX1RPQ0xJRU5UCQkyCisKKyNkZWZpbmUgTkZTVjNBVFRSVElNRV9OTU9ERVMJCTMKKworI2RlZmluZSBORlNWM0FDQ0VTU19SRUFECQkweDAxCisjZGVmaW5lIE5GU1YzQUNDRVNTX0xPT0tVUAkJMHgwMgorI2RlZmluZSBORlNWM0FDQ0VTU19NT0RJRlkJCTB4MDQKKyNkZWZpbmUgTkZTVjNBQ0NFU1NfRVhURU5ECQkweDA4CisjZGVmaW5lIE5GU1YzQUNDRVNTX0RFTEVURQkJMHgxMAorI2RlZmluZSBORlNWM0FDQ0VTU19FWEVDVVRFCQkweDIwCisKKyNkZWZpbmUgTkZTVjNXUklURV9VTlNUQUJMRQkJMAorI2RlZmluZSBORlNWM1dSSVRFX0RBVEFTWU5DCQkxCisjZGVmaW5lIE5GU1YzV1JJVEVfRklMRVNZTkMJCTIKKworI2RlZmluZSBORlNWM1dSSVRFX05NT0RFUwkJMworCisjZGVmaW5lIE5GU1YzQ1JFQVRFX1VOQ0hFQ0tFRAkJMAorI2RlZmluZSBORlNWM0NSRUFURV9HVUFSREVECQkxCisjZGVmaW5lIE5GU1YzQ1JFQVRFX0VYQ0xVU0lWRQkJMgorCisjZGVmaW5lIE5GU1YzQ1JFQVRFX05NT0RFUwkJMworCisjZGVmaW5lIE5GU1YzRlNJTkZPX0xJTksJCTB4MDEKKyNkZWZpbmUgTkZTVjNGU0lORk9fU1lNTElOSwkJMHgwMgorI2RlZmluZSBORlNWM0ZTSU5GT19IT01PR0VORU9VUwkJMHgwOAorI2RlZmluZSBORlNWM0ZTSU5GT19DQU5TRVRUSU1FCQkweDEwCisKKy8qIENvbnZlcnNpb24gbWFjcm9zICovCisjZGVmaW5lCXZ0b25mc3YyX21vZGUodCxtKSBcCisJCXR4ZHJfdW5zaWduZWQoKCh0KSA9PSBWRklGTykgPyBNQUtFSU1PREUoVkNIUiwgKG0pKSA6IFwKKwkJCQlNQUtFSU1PREUoKHQpLCAobSkpKQorI2RlZmluZSB2dG9uZnN2M19tb2RlKG0pCXR4ZHJfdW5zaWduZWQoKG0pICYgMDc3NzcpCisjZGVmaW5lCW5mc3Rvdl9tb2RlKGEpCQkoZnhkcl91bnNpZ25lZCh1X2ludDE2X3QsIChhKSkmMDc3NzcpCisjZGVmaW5lCXZ0b25mc3YyX3R5cGUoYSkJdHhkcl91bnNpZ25lZChuZnN2Ml90eXBlWygoaW50MzJfdCkoYSkpXSkKKyNkZWZpbmUJdnRvbmZzdjNfdHlwZShhKQl0eGRyX3Vuc2lnbmVkKG5mc3YzX3R5cGVbKChpbnQzMl90KShhKSldKQorI2RlZmluZQluZnN2MnRvdl90eXBlKGEpCW52MnRvdl90eXBlW2Z4ZHJfdW5zaWduZWQodV9pbnQzMl90LChhKSkmMHg3XQorI2RlZmluZQluZnN2M3Rvdl90eXBlKGEpCW52M3Rvdl90eXBlW2Z4ZHJfdW5zaWduZWQodV9pbnQzMl90LChhKSkmMHg3XQorCisvKiBGaWxlIHR5cGVzICovCit0eXBlZGVmIGVudW0geyBORk5PTj0wLCBORlJFRz0xLCBORkRJUj0yLCBORkJMSz0zLCBORkNIUj00LCBORkxOSz01LAorCU5GU09DSz02LCBORkZJRk89NyB9IG5mc190eXBlOworCisvKiBTdHJ1Y3RzIGZvciBjb21tb24gcGFydHMgb2YgdGhlIHJwYydzICovCisvKgorICogRmlsZSBIYW5kbGUgKDMyIGJ5dGVzIGZvciB2ZXJzaW9uIDIpLCB2YXJpYWJsZSB1cCB0byA2NCBmb3IgdmVyc2lvbiAzLgorICogRmlsZSBIYW5kbGVzIG9mIHVwIHRvIE5GU19TTUFMTEZIIGluIHNpemUgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUKKyAqIG5mcyBub2RlLCB3aGVyZWFzIGxhcmdlciBvbmVzIGFyZSBtYWxsb2MnZC4gKFRoaXMgbmV2ZXIgaGFwcGVucyB3aGVuCisgKiBORlNfU01BTExGSCBpcyBzZXQgdG8gNjQuKQorICogTkZTX1NNQUxMRkggc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAzMiB0byA2NCBhbmQgYmUgZGl2aXNpYmxlIGJ5IDQuCisgKi8KKyNpZm5kZWYgTkZTX1NNQUxMRkgKKyNkZWZpbmUgTkZTX1NNQUxMRkgJNjQKKyNlbmRpZgordW5pb24gbmZzZmggeworLyoJZmhhbmRsZV90IGZoX2dlbmVyaWM7ICovCisJdV9jaGFyICAgIGZoX2J5dGVzW05GU19TTUFMTEZIXTsKK307Cit0eXBlZGVmIHVuaW9uIG5mc2ZoIG5mc2ZoX3Q7CisKK3N0cnVjdCBuZnN2Ml90aW1lIHsKKwl1X2ludDMyX3QgbmZzdjJfc2VjOworCXVfaW50MzJfdCBuZnN2Ml91c2VjOworfTsKK3R5cGVkZWYgc3RydWN0IG5mc3YyX3RpbWUJbmZzdGltZTI7CisKK3N0cnVjdCBuZnN2M190aW1lIHsKKwl1X2ludDMyX3QgbmZzdjNfc2VjOworCXVfaW50MzJfdCBuZnN2M19uc2VjOworfTsKK3R5cGVkZWYgc3RydWN0IG5mc3YzX3RpbWUJbmZzdGltZTM7CisKKy8qCisgKiBRdWFkcyBhcmUgZGVmaW5lZCBhcyBhcnJheXMgb2YgMiBsb25ncyB0byBlbnN1cmUgZGVuc2UgcGFja2luZyBmb3IgdGhlCisgKiBwcm90b2NvbCBhbmQgdG8gZmFjaWxpdGF0ZSB4ZHIgY29udmVyc2lvbi4KKyAqLworc3RydWN0IG5mc191cXVhZCB7CisJdV9pbnQzMl90IG5mc3VxdWFkWzJdOworfTsKK3R5cGVkZWYJc3RydWN0IG5mc191cXVhZAluZnN1aW50NjQ7CisKKyNpZiAwIC8qIFhYWCAtIHRoaXMgZG9lc24ndCBzZWVtZWQgdG8gYmUgdXNlZCBhbmQgaXQgZG9lc24ndCB3b3JrCisgICAgICAgKiB3aXRoIG5vbi1nY2MsIHNvIGNvbW1lbnQgaXQgb3V0IGZvciBub3cuCisgICAgICAgKi8KKworLyoKKyAqIFVzZWQgdG8gY29udmVydCBiZXR3ZWVuIHR3byB1X2xvbmdzIGFuZCBhIHVfcXVhZF90LgorICovCit1bmlvbiBuZnNfcXVhZGNvbnZlcnQgeworCXVfaW50MzJfdCBsdmFsWzJdOworCXVfaW50NjRfdCBxdmFsOworfTsKK3R5cGVkZWYgdW5pb24gbmZzX3F1YWRjb252ZXJ0CW5mc3F1YWRfdDsKKworI2VuZGlmCisKKy8qCisgKiBORlMgVmVyc2lvbiAzIHNwZWNpYWwgZmlsZSBudW1iZXIuCisgKi8KK3N0cnVjdCBuZnN2M19zcGVjIHsKKwl1X2ludDMyX3Qgc3BlY2RhdGExOworCXVfaW50MzJfdCBzcGVjZGF0YTI7Cit9OwordHlwZWRlZglzdHJ1Y3QgbmZzdjNfc3BlYwluZnN2M3NwZWM7CisKKy8qCisgKiBGaWxlIGF0dHJpYnV0ZXMgYW5kIHNldGFibGUgYXR0cmlidXRlcy4gVGhlc2Ugc3RydWN0dXJlcyBjb3ZlciBib3RoCisgKiBORlMgdmVyc2lvbiAyIGFuZCB0aGUgdmVyc2lvbiAzIHByb3RvY29sLiBOb3RlIHRoYXQgdGhlIHVuaW9uIGlzIG9ubHkKKyAqIHVzZWQgc28gdGhhdCBvbmUgcG9pbnRlciBjYW4gcmVmZXIgdG8gYm90aCB2YXJpYW50cy4gVGhlc2Ugc3RydWN0dXJlcworICogZ28gb3V0IG9uIHRoZSB3aXJlIGFuZCBtdXN0IGJlIGRlbnNlbHkgcGFja2VkLCBzbyBubyBxdWFkIGRhdGEgdHlwZXMKKyAqIGFyZSB1c2VkLiAoYWxsIGZpZWxkcyBhcmUgbG9uZ3Mgb3IgdV9sb25ncyBvciBzdHJ1Y3R1cmVzIG9mIHNhbWUpCisgKiBOQjogWW91IGNhbid0IGRvIHNpemVvZihzdHJ1Y3QgbmZzX2ZhdHRyKSwgeW91IG11c3QgdXNlIHRoZQorICogICAgIE5GU1hfRkFUVFIodjMpIG1hY3JvLgorICovCitzdHJ1Y3QgbmZzX2ZhdHRyIHsKKwl1X2ludDMyX3QgZmFfdHlwZTsKKwl1X2ludDMyX3QgZmFfbW9kZTsKKwl1X2ludDMyX3QgZmFfbmxpbms7CisJdV9pbnQzMl90IGZhX3VpZDsKKwl1X2ludDMyX3QgZmFfZ2lkOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdCBuZnN2MmZhX3NpemU7CisJCQl1X2ludDMyX3QgbmZzdjJmYV9ibG9ja3NpemU7CisJCQl1X2ludDMyX3QgbmZzdjJmYV9yZGV2OworCQkJdV9pbnQzMl90IG5mc3YyZmFfYmxvY2tzOworCQkJdV9pbnQzMl90IG5mc3YyZmFfZnNpZDsKKwkJCXVfaW50MzJfdCBuZnN2MmZhX2ZpbGVpZDsKKwkJCW5mc3RpbWUyICBuZnN2MmZhX2F0aW1lOworCQkJbmZzdGltZTIgIG5mc3YyZmFfbXRpbWU7CisJCQluZnN0aW1lMiAgbmZzdjJmYV9jdGltZTsKKwkJfSBmYV9uZnN2MjsKKwkJc3RydWN0IHsKKwkJCW5mc3VpbnQ2NCBuZnN2M2ZhX3NpemU7CisJCQluZnN1aW50NjQgbmZzdjNmYV91c2VkOworCQkJbmZzdjNzcGVjIG5mc3YzZmFfcmRldjsKKwkJCW5mc3VpbnQ2NCBuZnN2M2ZhX2ZzaWQ7CisJCQluZnN1aW50NjQgbmZzdjNmYV9maWxlaWQ7CisJCQluZnN0aW1lMyAgbmZzdjNmYV9hdGltZTsKKwkJCW5mc3RpbWUzICBuZnN2M2ZhX210aW1lOworCQkJbmZzdGltZTMgIG5mc3YzZmFfY3RpbWU7CisJCX0gZmFfbmZzdjM7CisJfSBmYV91bjsKK307CisKKy8qIGFuZCBzb21lIHVnbHkgZGVmaW5lcyBmb3IgYWNjZXNzaW5nIHVuaW9uIGNvbXBvbmVudHMgKi8KKyNkZWZpbmUJZmEyX3NpemUJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfc2l6ZQorI2RlZmluZQlmYTJfYmxvY2tzaXplCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX2Jsb2Nrc2l6ZQorI2RlZmluZQlmYTJfcmRldgkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9yZGV2CisjZGVmaW5lCWZhMl9ibG9ja3MJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfYmxvY2tzCisjZGVmaW5lCWZhMl9mc2lkCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX2ZzaWQKKyNkZWZpbmUJZmEyX2ZpbGVpZAkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9maWxlaWQKKyNkZWZpbmUJZmEyX2F0aW1lCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX2F0aW1lCisjZGVmaW5lCWZhMl9tdGltZQkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9tdGltZQorI2RlZmluZQlmYTJfY3RpbWUJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfY3RpbWUKKyNkZWZpbmUJZmEzX3NpemUJCWZhX3VuLmZhX25mc3YzLm5mc3YzZmFfc2l6ZQorI2RlZmluZQlmYTNfdXNlZAkJZmFfdW4uZmFfbmZzdjMubmZzdjNmYV91c2VkCisjZGVmaW5lCWZhM19yZGV2CQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX3JkZXYKKyNkZWZpbmUJZmEzX2ZzaWQJCWZhX3VuLmZhX25mc3YzLm5mc3YzZmFfZnNpZAorI2RlZmluZQlmYTNfZmlsZWlkCQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX2ZpbGVpZAorI2RlZmluZQlmYTNfYXRpbWUJCWZhX3VuLmZhX25mc3YzLm5mc3YzZmFfYXRpbWUKKyNkZWZpbmUJZmEzX210aW1lCQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX210aW1lCisjZGVmaW5lCWZhM19jdGltZQkJZmFfdW4uZmFfbmZzdjMubmZzdjNmYV9jdGltZQorCitzdHJ1Y3QgbmZzdjJfc2F0dHIgeworCXVfaW50MzJfdCBzYV9tb2RlOworCXVfaW50MzJfdCBzYV91aWQ7CisJdV9pbnQzMl90IHNhX2dpZDsKKwl1X2ludDMyX3Qgc2Ffc2l6ZTsKKwluZnN0aW1lMiAgc2FfYXRpbWU7CisJbmZzdGltZTIgIHNhX210aW1lOworfTsKKworLyoKKyAqIE5GUyBWZXJzaW9uIDMgc2F0dHIgc3RydWN0dXJlIGZvciB0aGUgbmV3IG5vZGUgY3JlYXRpb24gY2FzZS4KKyAqLworc3RydWN0IG5mc3YzX3NhdHRyIHsKKwl1X2ludDMyX3QgICBzYV9tb2Rlc2V0OworCXVfaW50MzJfdCAgIHNhX21vZGU7CisJdV9pbnQzMl90ICAgc2FfdWlkc2V0OworCXVfaW50MzJfdCAgIHNhX3VpZDsKKwl1X2ludDMyX3QgICBzYV9naWRzZXQ7CisJdV9pbnQzMl90ICAgc2FfZ2lkOworCXVfaW50MzJfdCAgIHNhX3NpemVzZXQ7CisJdV9pbnQzMl90ICAgc2Ffc2l6ZTsKKwl1X2ludDMyX3QgICBzYV9hdGltZXR5cGU7CisJbmZzdGltZTMgIHNhX2F0aW1lOworCXVfaW50MzJfdCAgIHNhX210aW1ldHlwZTsKKwluZnN0aW1lMyAgc2FfbXRpbWU7Cit9OworCitzdHJ1Y3QgbmZzX3N0YXRmcyB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQzMl90IG5mc3Yyc2ZfdHNpemU7CisJCQl1X2ludDMyX3QgbmZzdjJzZl9ic2l6ZTsKKwkJCXVfaW50MzJfdCBuZnN2MnNmX2Jsb2NrczsKKwkJCXVfaW50MzJfdCBuZnN2MnNmX2JmcmVlOworCQkJdV9pbnQzMl90IG5mc3Yyc2ZfYmF2YWlsOworCQl9IHNmX25mc3YyOworCQlzdHJ1Y3QgeworCQkJbmZzdWludDY0IG5mc3Yzc2ZfdGJ5dGVzOworCQkJbmZzdWludDY0IG5mc3Yzc2ZfZmJ5dGVzOworCQkJbmZzdWludDY0IG5mc3Yzc2ZfYWJ5dGVzOworCQkJbmZzdWludDY0IG5mc3Yzc2ZfdGZpbGVzOworCQkJbmZzdWludDY0IG5mc3Yzc2ZfZmZpbGVzOworCQkJbmZzdWludDY0IG5mc3Yzc2ZfYWZpbGVzOworCQkJdV9pbnQzMl90IG5mc3Yzc2ZfaW52YXJzZWM7CisJCX0gc2ZfbmZzdjM7CisJfSBzZl91bjsKK307CisKKyNkZWZpbmUgc2ZfdHNpemUJc2ZfdW4uc2ZfbmZzdjIubmZzdjJzZl90c2l6ZQorI2RlZmluZSBzZl9ic2l6ZQlzZl91bi5zZl9uZnN2Mi5uZnN2MnNmX2JzaXplCisjZGVmaW5lIHNmX2Jsb2NrcwlzZl91bi5zZl9uZnN2Mi5uZnN2MnNmX2Jsb2NrcworI2RlZmluZSBzZl9iZnJlZQlzZl91bi5zZl9uZnN2Mi5uZnN2MnNmX2JmcmVlCisjZGVmaW5lIHNmX2JhdmFpbAlzZl91bi5zZl9uZnN2Mi5uZnN2MnNmX2JhdmFpbAorI2RlZmluZSBzZl90Ynl0ZXMJc2ZfdW4uc2ZfbmZzdjMubmZzdjNzZl90Ynl0ZXMKKyNkZWZpbmUgc2ZfZmJ5dGVzCXNmX3VuLnNmX25mc3YzLm5mc3Yzc2ZfZmJ5dGVzCisjZGVmaW5lIHNmX2FieXRlcwlzZl91bi5zZl9uZnN2My5uZnN2M3NmX2FieXRlcworI2RlZmluZSBzZl90ZmlsZXMJc2ZfdW4uc2ZfbmZzdjMubmZzdjNzZl90ZmlsZXMKKyNkZWZpbmUgc2ZfZmZpbGVzCXNmX3VuLnNmX25mc3YzLm5mc3Yzc2ZfZmZpbGVzCisjZGVmaW5lIHNmX2FmaWxlcwlzZl91bi5zZl9uZnN2My5uZnN2M3NmX2FmaWxlcworI2RlZmluZSBzZl9pbnZhcnNlYwlzZl91bi5zZl9uZnN2My5uZnN2M3NmX2ludmFyc2VjCisKK3N0cnVjdCBuZnN2M19mc2luZm8geworCXVfaW50MzJfdCBmc19ydG1heDsKKwl1X2ludDMyX3QgZnNfcnRwcmVmOworCXVfaW50MzJfdCBmc19ydG11bHQ7CisJdV9pbnQzMl90IGZzX3d0bWF4OworCXVfaW50MzJfdCBmc193dHByZWY7CisJdV9pbnQzMl90IGZzX3d0bXVsdDsKKwl1X2ludDMyX3QgZnNfZHRwcmVmOworCW5mc3VpbnQ2NCBmc19tYXhmaWxlc2l6ZTsKKwluZnN0aW1lMyAgZnNfdGltZWRlbHRhOworCXVfaW50MzJfdCBmc19wcm9wZXJ0aWVzOworfTsKKworc3RydWN0IG5mc3YzX3BhdGhjb25mIHsKKwl1X2ludDMyX3QgcGNfbGlua21heDsKKwl1X2ludDMyX3QgcGNfbmFtZW1heDsKKwl1X2ludDMyX3QgcGNfbm90cnVuYzsKKwl1X2ludDMyX3QgcGNfY2hvd25yZXN0cmljdGVkOworCXVfaW50MzJfdCBwY19jYXNlaW5zZW5zaXRpdmU7CisJdV9pbnQzMl90IHBjX2Nhc2VwcmVzZXJ2aW5nOworfTsKZGlmZiAtLWdpdCBhL25mc2ZoLmggYi9uZnNmaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTgyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnNmaC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbmZzZmguaCx2IDEuMTMgMjAwMi8wNC8yNCAwNjoyNzowNSBndXkgRXhwICQgKExCTCkgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCBKZWZmcmV5IEMuIE1vZ3VsLCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiwKKyAqIFdlc3Rlcm4gUmVzZWFyY2ggTGFib3JhdG9yeS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBDb21wYXEgQ29tcHV0ZXIgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBhbmQgbW9kaWZ5IHRoaXMgc29mdHdhcmUgYW5kIGl0cworICogIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQgb25seSB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZAorICogIGNvbmRpdGlvbnMuICBCb3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyAqICBub3RpY2UgbXVzdCBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIGRlcml2YXRpdmUgd29ya3MKKyAqICBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucyB0aGVyZW9mLCBhbmQgYm90aCBub3RpY2VzCisgKiAgbXVzdCBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICogICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTgorICogIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKyAqICBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gICBJTiBOTworICogIEVWRU5UIFNIQUxMIENPTVBBUSBDT01QVVRFUiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWQorICogIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgorICogIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKKyAqICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBuZnNmaC5oIC0gTkZTIGZpbGUgaGFuZGxlIGRlZmluaXRpb25zIChmb3IgcG9ydGFibGUgdXNlKQorICoKKyAqIEplZmZyZXkgQy4gTW9ndWwKKyAqIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCisgKiBXZXN0ZXJuIFJlc2VhcmNoIExhYm9yYXRvcnkKKyAqLworCisvKgorICogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgZGV2X3QsIGJlY2F1c2UgZGlmZmVyZW50IE5GUyBzZXJ2ZXJzCisgKiB0aGF0IHdlIG1pZ2h0IGJlIHNweWluZyB1cG9uIHVzZSBkaWZmZXJlbnQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdV9pbnQzMl90IE1pbm9yOwkvKiB1cHBlciBjYXNlIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggbWFjcm8gbmFtZXMgKi8KKwl1X2ludDMyX3QgTWFqb3I7Cit9IG15X2RldnQ7CisKKyNkZWZpbmUJZGV2X2VxKGEsYikJKChhLk1pbm9yID09IGIuTWlub3IpICYmIChhLk1ham9yID09IGIuTWFqb3IpKQorCisvKgorICogTWFueSBmaWxlIHNlcnZlcnMgbm93IHVzZSBhIGxhcmdlIGZpbGUgc3lzdGVtIElELiAgVGhpcyBpcworICogb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoYXQuCisgKi8KK3R5cGVkZWYJc3RydWN0IHsKKwlteV9kZXZ0CUZzaWRfZGV2OwkJLyogWFhYIGF2b2lkIG5hbWUgY29uZmxpY3Qgd2l0aCBBSVggKi8KKwljaGFyIE9wYXF1ZV9IYW5kbGVbMiAqIDMyICsgMV07CisJdV9pbnQzMl90IGZzaWRfY29kZTsKK30gbXlfZnNpZDsKKworI2RlZmluZQlmc2lkX2VxKGEsYikJKChhLmZzaWRfY29kZSA9PSBiLmZzaWRfY29kZSkgJiZcCisJCQkgZGV2X2VxKGEuRnNpZF9kZXYsIGIuRnNpZF9kZXYpKQorCitleHRlcm4gdm9pZCBQYXJzZV9maChjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCwgbXlfZnNpZCAqLCBpbm9fdCAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvbmxwaWQuYyBiL25scGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2RmZDZhNgotLS0gL2Rldi9udWxsCisrKyBiL25scGlkLmMKQEAgLTAsMCArMSw0NSBAQAorLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25scGlkLmMsdiAxLjQgMjAwNC8xMC8xOSAxNToyNzo1NSBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibmxwaWQuaCIKKworc3RydWN0IHRvayBubHBpZF92YWx1ZXNbXSA9IHsKKyAgICB7IE5MUElEX05VTExOUywgIk5VTEwiIH0sCisgICAgeyBOTFBJRF9ROTMzLCAiUS45MzMiIH0sCisgICAgeyBOTFBJRF9MTUksICJMTUkiIH0sCisgICAgeyBOTFBJRF9TTkFQLCAiU05BUCIgfSwKKyAgICB7IE5MUElEX0NMTlAsICJDTE5QIiB9LAorICAgIHsgTkxQSURfRVNJUywgIkVTLUlTIiB9LAorICAgIHsgTkxQSURfSVNJUywgIklTLUlTIiB9LAorICAgIHsgTkxQSURfQ09OUywgIkNPTlMiIH0sCisgICAgeyBOTFBJRF9JRFJQLCAiSURSUCIgfSwKKyAgICB7IE5MUElEX01GUiwgIkZSRi4xNSIgfSwKKyAgICB7IE5MUElEX0lQLCAiSVB2NCIgfSwKKyAgICB7IE5MUElEX1BQUCwgIlBQUCIgfSwKKyAgICB7IE5MUElEX1gyNV9FU0lTLCAiWDI1IEVTLUlTIiB9LAorICAgIHsgTkxQSURfSVA2LCAiSVB2NiIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKZGlmZiAtLWdpdCBhL25scGlkLmggYi9ubHBpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2E0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9ubHBpZC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbmxwaWQuaCx2IDEuNCAyMDA0LzEwLzE5IDE1OjI3OjU1IGhhbm5lcyBFeHAgJCAoTEJMKSAqLworLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKK2V4dGVybiBzdHJ1Y3QgdG9rIG5scGlkX3ZhbHVlc1tdOworCisjZGVmaW5lCU5MUElEX05VTExOUwkweDAwCisjZGVmaW5lIE5MUElEX1E5MzMgICAgICAweDA4IC8qIEFOU0kgVDEuNjE3IEFubmV4IEQgb3IgSVRVLVQgUS45MzMgQW5uZXggQSAqLworI2RlZmluZSBOTFBJRF9MTUkgICAgICAgMHgwOSAvKiBUaGUgb3JpZ2luYWwsIGFrYSBDaXNjbywgYWthIEdhbmcgb2YgRm91ciAqLworI2RlZmluZSBOTFBJRF9TTkFQICAgICAgMHg4MAorI2RlZmluZQlOTFBJRF9DTE5QCTB4ODEgLyogaXNvOTU3NyAqLworI2RlZmluZQlOTFBJRF9FU0lTCTB4ODIgLyogaXNvOTU3NyAqLworI2RlZmluZQlOTFBJRF9JU0lTCTB4ODMgLyogaXNvOTU3NyAqLworI2RlZmluZSBOTFBJRF9DT05TICAgICAgMHg4NAorI2RlZmluZSBOTFBJRF9JRFJQICAgICAgMHg4NQorI2RlZmluZSBOTFBJRF9NRlIgICAgICAgMHhiMSAvKiBGUkYuMTUgKi8KKyNkZWZpbmUgTkxQSURfSVAgICAgICAgIDB4Y2MKKyNkZWZpbmUgTkxQSURfUFBQICAgICAgIDB4Y2YKKyNkZWZpbmUgTkxQSURfWDI1X0VTSVMgIDB4OGEKKyNkZWZpbmUgTkxQSURfSVA2ICAgICAgIDB4OGUKZGlmZiAtLWdpdCBhL250cC5oIGIvbnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4NTY2OQotLS0gL2Rldi9udWxsCisrKyBiL250cC5oCkBAIC0wLDAgKzEsMTI3IEBACisvKiAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9udHAuaCx2IDEuOCAyMDA0LzAxLzI4IDE0OjM0OjUwIGhhbm5lcyBFeHAgJCAqLworCisvKgorICogQmFzZWQgb24gbnRwLmggZnJvbSB0aGUgVSBvZiBNRCBpbXBsZW1lbnRhdGlvbgorICoJVGhpcyBmaWxlIGlzIGJhc2VkIG9uIFZlcnNpb24gMiBvZiB0aGUgTlRQIHNwZWMgKFJGQzExMTkpLgorICovCisKKy8qCisgKiAgRGVmaW5pdGlvbnMgZm9yIHRoZSBtYXNzZXMKKyAqLworI2RlZmluZQlKQU5fMTk3MAkyMjA4OTg4ODAwVQkvKiAxOTcwIC0gMTkwMCBpbiBzZWNvbmRzICovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIE5UUCBmaXhlZCBwb2ludCB2YWx1ZXMKKyAqCisgKiAgICAwCQkJICAxCQkgICAgICAyCQkJICAzCisgKiAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgfAkJCSAgICAgICBJbnRlZ2VyIFBhcnQJCQkgICAgIHwKKyAqICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgfAkJCSAgICAgICBGcmFjdGlvbiBQYXJ0CQkJICAgICB8CisgKiAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKgorICogICAgMAkJCSAgMQkJICAgICAgMgkJCSAgMworICogICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgIHwJCSAgSW50ZWdlciBQYXJ0CSAgICAgfAkgICBGcmFjdGlvbiBQYXJ0CSAgICAgfAorICogICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworKi8KK3N0cnVjdCBsX2ZpeGVkcHQgeworCXVfaW50MzJfdCBpbnRfcGFydDsKKwl1X2ludDMyX3QgZnJhY3Rpb247Cit9OworCitzdHJ1Y3Qgc19maXhlZHB0IHsKKwl1X2ludDE2X3QgaW50X3BhcnQ7CisJdV9pbnQxNl90IGZyYWN0aW9uOworfTsKKworLyogcmZjMjAzMAorICogICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8TEkgfCBWTiAgfE1vZGUgfCAgICBTdHJhdHVtICAgIHwgICAgIFBvbGwgICAgICB8ICAgUHJlY2lzaW9uICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFJvb3QgRGVsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgUm9vdCBEaXNwZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIElkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBUaW1lc3RhbXAgKDY0KSAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICBPcmlnaW5hdGUgVGltZXN0YW1wICg2NCkgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgIFJlY2VpdmUgVGltZXN0YW1wICg2NCkgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICBUcmFuc21pdCBUaW1lc3RhbXAgKDY0KSAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICBLZXkgSWRlbnRpZmllciAob3B0aW9uYWwpICgzMikgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgTWVzc2FnZSBEaWdlc3QgKG9wdGlvbmFsKSAoMTI4KSAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworCitzdHJ1Y3QgbnRwZGF0YSB7CisJdV9jaGFyIHN0YXR1czsJCS8qIHN0YXR1cyBvZiBsb2NhbCBjbG9jayBhbmQgbGVhcCBpbmZvICovCisJdV9jaGFyIHN0cmF0dW07CQkvKiBTdHJhdHVtIGxldmVsICovCisJdV9jaGFyIHBwb2xsOwkJLyogcG9sbCB2YWx1ZSAqLworCWludCBwcmVjaXNpb246ODsKKwlzdHJ1Y3Qgc19maXhlZHB0IHJvb3RfZGVsYXk7CisJc3RydWN0IHNfZml4ZWRwdCByb290X2Rpc3BlcnNpb247CisJdV9pbnQzMl90IHJlZmlkOworCXN0cnVjdCBsX2ZpeGVkcHQgcmVmX3RpbWVzdGFtcDsKKwlzdHJ1Y3QgbF9maXhlZHB0IG9yZ190aW1lc3RhbXA7CisJc3RydWN0IGxfZml4ZWRwdCByZWNfdGltZXN0YW1wOworCXN0cnVjdCBsX2ZpeGVkcHQgeG10X3RpbWVzdGFtcDsKKyAgICAgICAgdV9pbnQzMl90IGtleV9pZDsKKyAgICAgICAgdV9pbnQ4X3QgIG1lc3NhZ2VfZGlnZXN0WzE2XTsKK307CisvKgorICoJTGVhcCBTZWNvbmQgQ29kZXMgKGhpZ2ggb3JkZXIgdHdvIGJpdHMpCisgKi8KKyNkZWZpbmUJTk9fV0FSTklORwkweDAwCS8qIG5vIHdhcm5pbmcgKi8KKyNkZWZpbmUJUExVU19TRUMJMHg0MAkvKiBhZGQgYSBzZWNvbmQgKDYxIHNlY29uZHMpICovCisjZGVmaW5lCU1JTlVTX1NFQwkweDgwCS8qIG1pbnVzIGEgc2Vjb25kICg1OSBzZWNvbmRzKSAqLworI2RlZmluZQlBTEFSTQkJMHhjMAkvKiBhbGFybSBjb25kaXRpb24gKGNsb2NrIHVuc3luY2hyb25pemVkKSAqLworCisvKgorICoJQ2xvY2sgU3RhdHVzIEJpdHMgdGhhdCBFbmNvZGUgVmVyc2lvbgorICovCisjZGVmaW5lCU5UUFZFUlNJT05fMQkweDA4CisjZGVmaW5lCVZFUlNJT05NQVNLCTB4MzgKKyNkZWZpbmUgTEVBUE1BU0sJMHhjMAorI2RlZmluZQlNT0RFTUFTSwkweDA3CisKKy8qCisgKglDb2RlIHZhbHVlcworICovCisjZGVmaW5lCU1PREVfVU5TUEVDCTAJLyogdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUJTU9ERV9TWU1fQUNUCTEJLyogc3ltbWV0cmljIGFjdGl2ZSAqLworI2RlZmluZQlNT0RFX1NZTV9QQVMJMgkvKiBzeW1tZXRyaWMgcGFzc2l2ZSAqLworI2RlZmluZQlNT0RFX0NMSUVOVAkzCS8qIGNsaWVudCAqLworI2RlZmluZQlNT0RFX1NFUlZFUgk0CS8qIHNlcnZlciAqLworI2RlZmluZQlNT0RFX0JST0FEQ0FTVAk1CS8qIGJyb2FkY2FzdCAqLworI2RlZmluZQlNT0RFX1JFUzEJNgkvKiByZXNlcnZlZCAqLworI2RlZmluZQlNT0RFX1JFUzIJNwkvKiByZXNlcnZlZCAqLworCisvKgorICoJU3RyYXR1bSBEZWZpbml0aW9ucworICovCisjZGVmaW5lCVVOU1BFQ0lGSUVECTAKKyNkZWZpbmUJUFJJTV9SRUYJMQkvKiByYWRpbyBjbG9jayAqLworI2RlZmluZQlJTkZPX1FVRVJZCTYyCS8qICoqKiogVEhJUyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKioqKiAqLworI2RlZmluZQlJTkZPX1JFUExZCTYzCS8qICoqKiogVEhJUyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKioqKiAqLwpkaWZmIC0tZ2l0IGEvb2FrbGV5LmggYi9vYWtsZXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDBkNjA3Ci0tLSAvZGV2L251bGwKKysrIGIvb2FrbGV5LmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisvKiBZSVBTIEAoIykkSWQ6IG9ha2xleS5oLHYgMS40IDIwMDIvMTIvMTEgMDc6MTM6NTYgZ3V5IEV4cCAkICovCisKKy8qIHJlZmVyIHRvIFJGQyAyNDA5ICovCisKKyNpZiAhZGVmaW5lZChfSVNBS01QX09BS0xFWV9IXykKKyNkZWZpbmUgX0lTQUtNUF9PQUtMRVlfSF8KKworLyogQXR0cmlidXRlIENsYXNzZXMgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfRU5DX0FMRyAgICAgICAgICAgICAgICAgICAxIC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0RFUyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0lERUEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0JMICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX1JDNSAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHXzNERVMgICAgICAgICAgICAgIDUKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0NBU1QgICAgICAgICAgICAgIDYKKyNkZWZpbmUgT0FLTEVZX0FUVFJfSEFTSF9BTEcgICAgICAgICAgICAgICAgICAyIC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19NRDUgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19TSEEgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19USUdFUiAgICAgICAgICAgIDMKKyNkZWZpbmUgT0FLTEVZX0FUVFJfQVVUSF9NRVRIT0QgICAgICAgICAgICAgICAzIC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9QU0tFWSAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9EU1MgICAgICAgICAgIDIKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0EgICAgICAgICAgIDMKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0FFTkMgICAgICAgIDQKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0FSRVYgICAgICAgIDUKKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0RFU0MgICAgICAgICAgICAgICAgICA0IC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19NT0RQNzY4ICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19NT0RQMTAyNCAgICAgICAgIDIKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19FQzJOMTU1ICAgICAgICAgIDMKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19FQzJOMTg1ICAgICAgICAgIDQKKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX1RZUEUgICAgICAgICAgICAgICAgICA1IC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9NT0RQICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9FQ1AgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9FQzJOICAgICAgICAgICAgIDMKKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX1BJICAgICAgICAgICAgICAgICAgICA2IC8qIFYgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0dFTl9PTkUgICAgICAgICAgICAgICA3IC8qIFYgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0dFTl9UV08gICAgICAgICAgICAgICA4IC8qIFYgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0NVUlZFX0EgICAgICAgICAgICAgICA5IC8qIFYgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0NVUlZFX0IgICAgICAgICAgICAgIDEwIC8qIFYgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfU0FfTFRZUEUgICAgICAgICAgICAgICAgIDExIC8qIEIgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9ERUZBVUxUICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9TRUMgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9LQiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgT0FLTEVZX0FUVFJfU0FfTERVUiAgICAgICAgICAgICAgICAgIDEyIC8qIFYgKi8KKyNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MRFVSX0RFRkFVTFQgICAgICAgICAgIDI4ODAwIC8qIDggaG91cnMgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfUFJGICAgICAgICAgICAgICAgICAgICAgIDEzIC8qIEIgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfS0VZX0xFTiAgICAgICAgICAgICAgICAgIDE0IC8qIEIgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfRklFTERfU0laRSAgICAgICAgICAgICAgIDE1IC8qIEIgKi8KKyNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX09SREVSICAgICAgICAgICAgICAgIDE2IC8qIFYgKi8KKworI2RlZmluZSBPQUtMRVlfSURfSVBWNF9BRERSICAgICAgICAgIDAKKyNkZWZpbmUgT0FLTEVZX0lEX0lQVjRfQUREUl9TVUJORVQgICAxCisjZGVmaW5lIE9BS0xFWV9JRF9JUFY2X0FERFIgICAgICAgICAgMgorI2RlZmluZSBPQUtMRVlfSURfSVBWNl9BRERSX1NVQk5FVCAgIDMKKworLyogQWRkaXRpb25hbCBFeGNoYW5nZSBUeXBlICovCisjZGVmaW5lIElTQUtNUF9FVFlQRV9RVUlDSyAgICAzMgorI2RlZmluZSBJU0FLTVBfRVRZUEVfTkVXR1JQICAgMzMKKworLyogVGhlIHVzZSBmb3IgY2hlY2tpbmcgcHJvcG9zYWwgcGF5bG9hZC4gVGhpcyBpcyBub3QgZXhjaGFuZ2UgdHlwZS4gKi8KKyNkZWZpbmUgT0FLTEVZX01BSU5fTU9ERSAgICAwCisjZGVmaW5lIE9BS0xFWV9RVUlDS19NT0RFICAgMQorCisjZGVmaW5lIE9BS0xFWV9QUklNRV9NT0RQNzY4ICJcCisJRkZGRkZGRkYgRkZGRkZGRkYgQzkwRkRBQTIgMjE2OEMyMzQgQzRDNjYyOEIgODBEQzFDRDEgXAorCTI5MDI0RTA4IDhBNjdDQzc0IDAyMEJCRUE2IDNCMTM5QjIyIDUxNEEwODc5IDhFMzQwNEREIFwKKwlFRjk1MTlCMyBDRDNBNDMxQiAzMDJCMEE2RCBGMjVGMTQzNyA0RkUxMzU2RCA2RDUxQzI0NSBcCisJRTQ4NUI1NzYgNjI1RTdFQzYgRjQ0QzQyRTkgQTYzQTM2MjAgRkZGRkZGRkYgRkZGRkZGRkYiCisKKyNkZWZpbmUgT0FLTEVZX1BSSU1FX01PRFAxMDI0ICJcCisJRkZGRkZGRkYgRkZGRkZGRkYgQzkwRkRBQTIgMjE2OEMyMzQgQzRDNjYyOEIgODBEQzFDRDEgXAorCTI5MDI0RTA4IDhBNjdDQzc0IDAyMEJCRUE2IDNCMTM5QjIyIDUxNEEwODc5IDhFMzQwNEREIFwKKwlFRjk1MTlCMyBDRDNBNDMxQiAzMDJCMEE2RCBGMjVGMTQzNyA0RkUxMzU2RCA2RDUxQzI0NSBcCisJRTQ4NUI1NzYgNjI1RTdFQzYgRjQ0QzQyRTkgQTYzN0VENkIgMEJGRjVDQjYgRjQwNkI3RUQgXAorCUVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKKwlGRkZGRkZGRiBGRkZGRkZGRiIKKworI2RlZmluZSBERUZBVUxUU0VDUkVUU0laRSAoIDEyOCAvIDggKSAvKiAxMjggYml0cyAqLworI2RlZmluZSBERUZBVUxUTk9OQ0VTSVpFICAoIDEyOCAvIDggKSAvKiAxMjggYml0cyAqLworCisjZGVmaW5lIE1BWFBBRExXT1JEIDIwCisKKyNpZiAwCisvKiBpc2FrbXAgc2Egc3RydWN0dXJlICovCitzdHJ1Y3Qgb2FrbGV5X3NhIHsKKwl1X2ludDhfdCAgcHJvdG9faWQ7ICAgICAgICAgICAgLyogT0FLTEVZICovCisJdmNoYXJfdCAgICpzcGk7ICAgICAgICAgICAgICAgIC8qIHNwaSAqLworCXVfaW50OF90ICBkaGdycDsgICAgICAgICAgICAgICAvKiBESDsgZ3JvdXAgKi8KKwl1X2ludDhfdCAgYXV0aF90OyAgICAgICAgICAgICAgLyogbWV0aG9kIG9mIGF1dGhlbnRpY2F0aW9uICovCisJdV9pbnQ4X3QgIHByZl90OyAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgcHJmICovCisJdV9pbnQ4X3QgIGhhc2hfdDsgICAgICAgICAgICAgIC8qIHR5cGUgb2YgaGFzaCAqLworCXVfaW50OF90ICBlbmNfdDsgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGNpcGhlciAqLworCXVfaW50OF90ICBsaWZlX3Q7ICAgICAgICAgICAgICAvKiB0eXBlIG9mIGR1cmF0aW9uIG9mIGxpZmV0aW1lICovCisJdV9pbnQzMl90IGxkdXI7ICAgICAgICAgICAgICAgIC8qIGxpZmUgZHVyYXRpb24gKi8KK307CisjZW5kaWYKKworI2VuZGlmIC8qICFkZWZpbmVkKF9JU0FLTVBfT0FLTEVZX0hfKSAqLwpkaWZmIC0tZ2l0IGEvb3NwZi5oIGIvb3NwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTkwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vc3BmLmgKQEAgLTAsMCArMSwzMTYgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvb3NwZi5oLHYgMS4xNi4yLjIgMjAwNi8xMi8xMyAwODoyNDoyNyBoYW5uZXMgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBPU1BGIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgSmVmZnJleSBIb25pZyAoamNoQG1pdGNoZWxsLmNpdC5jb3JuZWxsLmVkdSkKKyAqLworI2RlZmluZQlPU1BGX1RZUEVfVU1EICAgICAgICAgICAwCS8qIFVNZCdzIHNwZWNpYWwgbW9uaXRvcmluZyBwYWNrZXRzICovCisjZGVmaW5lCU9TUEZfVFlQRV9IRUxMTyAgICAgICAgIDEJLyogSGVsbG8gKi8KKyNkZWZpbmUJT1NQRl9UWVBFX0REICAgICAgICAgICAgMgkvKiBEYXRhYmFzZSBEZXNjcmlwdGlvbiAqLworI2RlZmluZQlPU1BGX1RZUEVfTFNfUkVRICAgICAgICAzCS8qIExpbmsgU3RhdGUgUmVxdWVzdCAqLworI2RlZmluZQlPU1BGX1RZUEVfTFNfVVBEQVRFICAgICA0CS8qIExpbmsgU3RhdGUgVXBkYXRlICovCisjZGVmaW5lCU9TUEZfVFlQRV9MU19BQ0sgICAgICAgIDUJLyogTGluayBTdGF0ZSBBY2sgKi8KKworLyogT3B0aW9ucyBmaWVsZAorICoKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICogfCBPIHwgREMgfCBFQSB8IE4vUCB8IE1DIHwgRSB8IFQgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKi8KKyAgICAgICAgICAgICAgICAKKyNkZWZpbmUgT1NQRl9PUFRJT05fVAkweDAxCS8qIFQgYml0OiBUT1Mgc3VwcG9ydAkqLworI2RlZmluZSBPU1BGX09QVElPTl9FCTB4MDIJLyogRSBiaXQ6IEV4dGVybmFsIHJvdXRlcyBhZHZlcnRpc2VkCSovCisjZGVmaW5lCU9TUEZfT1BUSU9OX01DCTB4MDQJLyogTUMgYml0OiBNdWx0aWNhc3QgY2FwYWJsZSAqLworI2RlZmluZQlPU1BGX09QVElPTl9OUAkweDA4CS8qIE4vUCBiaXQ6IE5TU0EgY2FwYWJsZSAqLworI2RlZmluZQlPU1BGX09QVElPTl9FQQkweDEwCS8qIEVBIGJpdDogRXh0ZXJuYWwgQXR0cmlidXRlIGNhcGFibGUgKi8KKyNkZWZpbmUJT1NQRl9PUFRJT05fREMJMHgyMAkvKiBEQyBiaXQ6IERlbWFuZCBjaXJjdWl0IGNhcGFibGUgKi8KKyNkZWZpbmUJT1NQRl9PUFRJT05fTwkweDQwCS8qIE8gYml0OiBPcGFxdWUgTFNBIGNhcGFibGUgKi8KKyNkZWZpbmUJT1NQRl9PUFRJT05fRE4JMHg4MAkvKiBETiBiaXQ6IFVwL0Rvd24gQml0IGNhcGFibGUgLSBkcmFmdC1pZXRmLW9zcGYtMjU0Ny1kbmJpdC0wNCAqLworCisvKiBvc3BmX2F1dGh0eXBlCSovCisjZGVmaW5lCU9TUEZfQVVUSF9OT05FCQkwCS8qIE5vIGF1dGgtZGF0YSAqLworI2RlZmluZQlPU1BGX0FVVEhfU0lNUExFCTEJLyogU2ltcGxlIHBhc3N3b3JkICovCisjZGVmaW5lIE9TUEZfQVVUSF9TSU1QTEVfTEVOCTgJLyogbWF4IGxlbmd0aCBvZiBzaW1wbGUgYXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUgT1NQRl9BVVRIX01ENQkJMgkvKiBNRDUgYXV0aGVudGljYXRpb24gKi8KKyNkZWZpbmUgT1NQRl9BVVRIX01ENV9MRU4JMTYJLyogbGVuZ3RoIG9mIE1ENSBhdXRoZW50aWNhdGlvbiAqLworCisvKiBkYl9mbGFncwkqLworI2RlZmluZQlPU1BGX0RCX0lOSVQJCTB4MDQJICAgIC8qCSovCisjZGVmaW5lCU9TUEZfREJfTU9SRQkJMHgwMgorI2RlZmluZQlPU1BGX0RCX01BU1RFUgkJMHgwMQorCisvKiBsc190eXBlCSovCisjZGVmaW5lCUxTX1RZUEVfUk9VVEVSCQkxICAgLyogcm91dGVyIGxpbmsgKi8KKyNkZWZpbmUJTFNfVFlQRV9ORVRXT1JLCQkyICAgLyogbmV0d29yayBsaW5rICovCisjZGVmaW5lCUxTX1RZUEVfU1VNX0lQCQkzICAgLyogc3VtbWFyeSBsaW5rICovCisjZGVmaW5lCUxTX1RZUEVfU1VNX0FCUgkJNCAgIC8qIHN1bW1hcnkgYXJlYSBsaW5rICovCisjZGVmaW5lCUxTX1RZUEVfQVNFCQk1ICAgLyogQVNFICAqLworI2RlZmluZQlMU19UWVBFX0dST1VQCQk2ICAgLyogR3JvdXAgbWVtYmVyc2hpcCAobXVsdGljYXN0ICovCisJCQkJICAgIC8qIGV4dGVuc2lvbnMgMjMgSnVseSAxOTkxKSAqLworI2RlZmluZQlMU19UWVBFX05TU0EgICAgICAgICAgICA3ICAgLyogcmZjMzEwMSAtIE5vdCBzbyBTdHViYnkgQXJlYXMgKi8KKyNkZWZpbmUJTFNfVFlQRV9PUEFRVUVfTEwgICAgICAgOSAgIC8qIHJmYzIzNzAgLSBPcGFxdWUgTGluayBMb2NhbCAqLworI2RlZmluZQlMU19UWVBFX09QQVFVRV9BTCAgICAgIDEwICAgLyogcmZjMjM3MCAtIE9wYXF1ZSBMaW5rIExvY2FsICovCisjZGVmaW5lCUxTX1RZUEVfT1BBUVVFX0RXICAgICAgMTEgICAvKiByZmMyMzcwIC0gT3BhcXVlIERvbWFpbiBXaWRlICovCisKKyNkZWZpbmUgTFNfT1BBUVVFX1RZUEVfVEUgICAgICAgMSAgIC8qIHJmYzM2MzAgKi8KKyNkZWZpbmUgTFNfT1BBUVVFX1RZUEVfR1JBQ0UgICAgMyAgIC8qIHJmYzM2MjMgKi8KKyNkZWZpbmUgTFNfT1BBUVVFX1RZUEVfUkkgICAgICAgNCAgIC8qIGRyYWZ0LWlldGYtb3NwZi1jYXAtMDMgKi8KKworI2RlZmluZSBMU19PUEFRVUVfVEVfVExWX1JPVVRFUiAxICAgLyogcmZjMzYzMCAqLworI2RlZmluZSBMU19PUEFRVUVfVEVfVExWX0xJTksgICAyICAgLyogcmZjMzYzMCAqLworCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEUgICAgICAgICAgICAgMSAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX0lEICAgICAgICAgICAgICAgMiAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MT0NBTF9JUCAgICAgICAgICAgICAgMyAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9SRU1PVEVfSVAgICAgICAgICAgICAgNCAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9URV9NRVRSSUMgICAgICAgICAgICAgNSAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9NQVhfQlcgICAgICAgICAgICAgICAgNiAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9NQVhfUkVTX0JXICAgICAgICAgICAgNyAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9VTlJFU19CVyAgICAgICAgICAgICAgOCAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9BRE1JTl9HUk9VUCAgICAgICAgICAgOSAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX0xPQ0FMX1JFTU9URV9JRCAxMSAvKiBkcmFmdC1pZXRmLWNjYW1wLW9zcGYtZ21wbHMtZXh0ZW5zaW9ucyAqLworI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19QUk9URUNUSU9OX1RZUEUgMTQgLyogZHJhZnQtaWV0Zi1jY2FtcC1vc3BmLWdtcGxzLWV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0lOVEZfU1dfQ0FQX0RFU0NSICAgIDE1IC8qIGRyYWZ0LWlldGYtY2NhbXAtb3NwZi1nbXBscy1leHRlbnNpb25zICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9TSEFSRURfUklTS19HUk9VUCAgICAxNiAvKiBkcmFmdC1pZXRmLWNjYW1wLW9zcGYtZ21wbHMtZXh0ZW5zaW9ucyAqLworI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQldfQ09OU1RSQUlOVFMgICAgICAgMTcgLyogcmZjNDEyNCAqLworCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEVfUFRQICAgICAgICAxICAvKiByZmMzNjMwICovCisjZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEVfTUEgICAgICAgICAyICAvKiByZmMzNjMwICovCisKKyNkZWZpbmUgTFNfT1BBUVVFX0dSQUNFX1RMVl9QRVJJT0QgICAgICAgMSAvKiByZmMzNjIzICovCisjZGVmaW5lIExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OICAgICAgIDIgLyogcmZjMzYyMyAqLworI2RlZmluZSBMU19PUEFRVUVfR1JBQ0VfVExWX0lOVF9BRERSRVNTICAzIC8qIHJmYzM2MjMgKi8KKworI2RlZmluZSBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9VTktOT1dOICAgICAwIC8qIHJmYzM2MjMgKi8KKyNkZWZpbmUgTFNfT1BBUVVFX0dSQUNFX1RMVl9SRUFTT05fU1dfUkVTVEFSVCAgMSAvKiByZmMzNjIzICovCisjZGVmaW5lIExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OX1NXX1VQR1JBREUgIDIgLyogcmZjMzYyMyAqLworI2RlZmluZSBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9DUF9TV0lUQ0ggICAzIC8qIHJmYzM2MjMgKi8KKworI2RlZmluZSBMU19PUEFRVUVfUklfVExWX0NBUCAgICAgICAgICAgICAxIC8qIGRyYWZ0LWlldGYtb3NwZi1jYXAtMDMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpcyB0aGUgYWJvdmUgYSBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24/CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogcmxhX2xpbmsubGlua190eXBlCSovCisjZGVmaW5lCVJMQV9UWVBFX1JPVVRFUgkJMSAgIC8qIHBvaW50LXRvLXBvaW50IHRvIGFub3RoZXIgcm91dGVyCSovCisjZGVmaW5lCVJMQV9UWVBFX1RSQU5TSVQJMiAgIC8qIGNvbm5lY3Rpb24gdG8gdHJhbnNpdCBuZXR3b3JrCSovCisjZGVmaW5lCVJMQV9UWVBFX1NUVUIJCTMgICAvKiBjb25uZWN0aW9uIHRvIHN0dWIgbmV0d29yawkqLworI2RlZmluZSBSTEFfVFlQRV9WSVJUVUFMCTQgICAvKiB2aXJ0dWFsIGxpbmsJCQkqLworCisvKiBybGFfZmxhZ3MJKi8KKyNkZWZpbmUJUkxBX0ZMQUdfQgkweDAxCisjZGVmaW5lCVJMQV9GTEFHX0UJMHgwMgorI2RlZmluZQlSTEFfRkxBR19XMQkweDA0CisjZGVmaW5lCVJMQV9GTEFHX1cyCTB4MDgKKworLyogc2xhX3Rvc21ldHJpYyBicmVha2Rvd24JKi8KKyNkZWZpbmUJU0xBX01BU0tfVE9TCQkweDdmMDAwMDAwCisjZGVmaW5lCVNMQV9NQVNLX01FVFJJQwkJMHgwMGZmZmZmZgorI2RlZmluZSBTTEFfU0hJRlRfVE9TCQkyNAorCisvKiBhc2xhX3Rvc21ldHJpYyBicmVha2Rvd24JKi8KKyNkZWZpbmUJQVNMQV9GTEFHX0VYVEVSTkFMCTB4ODAwMDAwMDAKKyNkZWZpbmUJQVNMQV9NQVNLX1RPUwkJMHg3ZjAwMDAwMAorI2RlZmluZQlBU0xBX1NISUZUX1RPUwkJMjQKKyNkZWZpbmUJQVNMQV9NQVNLX01FVFJJQwkweDAwZmZmZmZmCisKKy8qIG11bHRpY2FzdCB2ZXJ0ZXggdHlwZSAqLworI2RlZmluZQlNQ0xBX1ZFUlRFWF9ST1VURVIJMQorI2RlZmluZQlNQ0xBX1ZFUlRFWF9ORVRXT1JLCTIKKworLyogbGluayBzdGF0ZSBhZHZlcnRpc2VtZW50IGhlYWRlciAqLworc3RydWN0IGxzYV9oZHIgeworICAgIHVfaW50MTZfdCBsc19hZ2U7CisgICAgdV9pbnQ4X3QgbHNfb3B0aW9uczsKKyAgICB1X2ludDhfdCBsc190eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGluX2FkZHIgbHNhX2lkOworICAgICAgICBzdHJ1Y3QgeyAvKiBvcGFxdWUgTFNBcyBjaGFuZ2UgdGhlIExTQS1JRCBmaWVsZCAqLworICAgICAgICAgICAgdV9pbnQ4X3Qgb3BhcXVlX3R5cGU7CisgICAgICAgICAgICB1X2ludDhfdCBvcGFxdWVfaWRbM107CisJfSBvcGFxdWVfZmllbGQ7CisgICAgfSB1bl9sc2FfaWQ7CisgICAgc3RydWN0IGluX2FkZHIgbHNfcm91dGVyOworICAgIHVfaW50MzJfdCBsc19zZXE7CisgICAgdV9pbnQxNl90IGxzX2Noa3N1bTsKKyAgICB1X2ludDE2X3QgbHNfbGVuZ3RoOworfTsKKworLyogbGluayBzdGF0ZSBhZHZlcnRpc2VtZW50ICovCitzdHJ1Y3QgbHNhIHsKKyAgICBzdHJ1Y3QgbHNhX2hkciBsc19oZHI7CisKKyAgICAvKiBMaW5rIHN0YXRlIHR5cGVzICovCisgICAgdW5pb24geworCS8qIFJvdXRlciBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLworCXN0cnVjdCB7CisJICAgIHVfaW50OF90IHJsYV9mbGFnczsKKwkgICAgdV9pbnQ4X3QgcmxhX3plcm9bMV07CisJICAgIHVfaW50MTZfdCBybGFfY291bnQ7CisJICAgIHN0cnVjdCBybGFsaW5rIHsKKwkJc3RydWN0IGluX2FkZHIgbGlua19pZDsKKwkJc3RydWN0IGluX2FkZHIgbGlua19kYXRhOworCQl1X2ludDhfdCBsaW5rX3R5cGU7CisJCXVfaW50OF90IGxpbmtfdG9zY291bnQ7CisJCXVfaW50MTZfdCBsaW5rX3RvczBtZXRyaWM7CisJICAgIH0gcmxhX2xpbmtbMV07CQkvKiBtYXkgcmVwZWF0CSovCisJfSB1bl9ybGE7CisKKwkvKiBOZXR3b3JrIGxpbmtzIGFkdmVydGlzZW1lbnRzICovCisJc3RydWN0IHsKKwkgICAgc3RydWN0IGluX2FkZHIgbmxhX21hc2s7CisJICAgIHN0cnVjdCBpbl9hZGRyIG5sYV9yb3V0ZXJbMV07CS8qIG1heSByZXBlYXQJKi8KKwl9IHVuX25sYTsKKworCS8qIFN1bW1hcnkgbGlua3MgYWR2ZXJ0aXNlbWVudHMgKi8KKwlzdHJ1Y3QgeworCSAgICBzdHJ1Y3QgaW5fYWRkciBzbGFfbWFzazsKKwkgICAgdV9pbnQzMl90IHNsYV90b3NtZXRyaWNbMV07CS8qIG1heSByZXBlYXQJKi8KKwl9IHVuX3NsYTsKKworCS8qIEFTIGV4dGVybmFsIGxpbmtzIGFkdmVydGlzZW1lbnRzICovCisJc3RydWN0IHsKKwkgICAgc3RydWN0IGluX2FkZHIgYXNsYV9tYXNrOworCSAgICBzdHJ1Y3QgYXNsYW1ldHJpYyB7CisJCXVfaW50MzJfdCBhc2xhX3Rvc21ldHJpYzsKKwkJc3RydWN0IGluX2FkZHIgYXNsYV9mb3J3YXJkOworCQlzdHJ1Y3QgaW5fYWRkciBhc2xhX3RhZzsKKwkgICAgfSBhc2xhX21ldHJpY1sxXTsJCS8qIG1heSByZXBlYXQJKi8KKwl9IHVuX2FzbGE7CisKKwkvKiBNdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCAqLworCXN0cnVjdCBtY2xhIHsKKwkgICAgdV9pbnQzMl90IG1jbGFfdnR5cGU7CisJICAgIHN0cnVjdCBpbl9hZGRyIG1jbGFfdmlkOworCX0gdW5fbWNsYVsxXTsKKworICAgICAgICAvKiBPcGFxdWUgVEUgTFNBICovCisgICAgICAgIHN0cnVjdCB7CisJICAgIHVfaW50MTZfdCB0eXBlOworCSAgICB1X2ludDE2X3QgbGVuZ3RoOworCSAgICB1X2ludDhfdCBkYXRhWzFdOyAvKiBtYXkgcmVwZWF0ICAgKi8KKwl9IHVuX3RlX2xzYV90bHY7CisKKyAgICAgICAgLyogT3BhcXVlIEdyYWNlIExTQSAqLworICAgICAgICBzdHJ1Y3QgeworCSAgICB1X2ludDE2X3QgdHlwZTsKKwkgICAgdV9pbnQxNl90IGxlbmd0aDsKKwkgICAgdV9pbnQ4X3QgZGF0YVsxXTsgLyogbWF5IHJlcGVhdCAgICovCisJfSB1bl9ncmFjZV90bHY7CisKKyAgICAgICAgLyogT3BhcXVlIFJvdXRlciBpbmZvcm1hdGlvbiBMU0EgKi8KKyAgICAgICAgc3RydWN0IHsKKwkgICAgdV9pbnQxNl90IHR5cGU7CisJICAgIHVfaW50MTZfdCBsZW5ndGg7CisJICAgIHVfaW50OF90IGRhdGFbMV07IC8qIG1heSByZXBlYXQgICAqLworCX0gdW5fcmlfdGx2OworCisgICAgICAgIC8qIFVua25vd24gTFNBICovCisgICAgICAgIHN0cnVjdCB1bmtub3duIHsKKwkgICAgdV9pbnQ4X3QgZGF0YVsxXTsgLyogbWF5IHJlcGVhdCAgICovCisJfSB1bl91bmtub3duWzFdOworCisgICAgfSBsc2FfdW47Cit9OworCisKKy8qCisgKiBUT1MgbWV0cmljIHN0cnVjdCAod2lsbCBiZSAwIG9yIG1vcmUgaW4gcm91dGVyIGxpbmtzIHVwZGF0ZSkKKyAqLworc3RydWN0IHRvc19tZXRyaWMgeworICAgIHVfaW50OF90IHRvc190eXBlOworICAgIHVfaW50OF90IHRvc196ZXJvOworICAgIHVfaW50MTZfdCB0b3NfbWV0cmljOworfTsKKworI2RlZmluZQlPU1BGX0FVVEhfU0laRQk4CisKKy8qCisgKiB0aGUgbWFpbiBoZWFkZXIKKyAqLworc3RydWN0IG9zcGZoZHIgeworICAgIHVfaW50OF90IG9zcGZfdmVyc2lvbjsKKyAgICB1X2ludDhfdCBvc3BmX3R5cGU7CisgICAgdV9pbnQxNl90IG9zcGZfbGVuOworICAgIHN0cnVjdCBpbl9hZGRyIG9zcGZfcm91dGVyaWQ7CisgICAgc3RydWN0IGluX2FkZHIgb3NwZl9hcmVhaWQ7CisgICAgdV9pbnQxNl90IG9zcGZfY2hrc3VtOworICAgIHVfaW50MTZfdCBvc3BmX2F1dGh0eXBlOworICAgIHVfaW50OF90IG9zcGZfYXV0aGRhdGFbT1NQRl9BVVRIX1NJWkVdOworICAgIHVuaW9uIHsKKworCS8qIEhlbGxvIHBhY2tldCAqLworCXN0cnVjdCB7CisJICAgIHN0cnVjdCBpbl9hZGRyIGhlbGxvX21hc2s7CisJICAgIHVfaW50MTZfdCBoZWxsb19oZWxsb2ludDsKKwkgICAgdV9pbnQ4X3QgaGVsbG9fb3B0aW9uczsKKwkgICAgdV9pbnQ4X3QgaGVsbG9fcHJpb3JpdHk7CisJICAgIHVfaW50MzJfdCBoZWxsb19kZWFkaW50OworCSAgICBzdHJ1Y3QgaW5fYWRkciBoZWxsb19kcjsKKwkgICAgc3RydWN0IGluX2FkZHIgaGVsbG9fYmRyOworCSAgICBzdHJ1Y3QgaW5fYWRkciBoZWxsb19uZWlnaGJvclsxXTsgLyogbWF5IHJlcGVhdAkqLworCX0gdW5faGVsbG87CisKKwkvKiBEYXRhYmFzZSBEZXNjcmlwdGlvbiBwYWNrZXQgKi8KKwlzdHJ1Y3QgeworCSAgICB1X2ludDhfdCBkYl96ZXJvWzJdOworCSAgICB1X2ludDhfdCBkYl9vcHRpb25zOworCSAgICB1X2ludDhfdCBkYl9mbGFnczsKKwkgICAgdV9pbnQzMl90IGRiX3NlcTsKKwkgICAgc3RydWN0IGxzYV9oZHIgZGJfbHNoZHJbMV07IC8qIG1heSByZXBlYXQJKi8KKwl9IHVuX2RiOworCisJLyogTGluayBTdGF0ZSBSZXF1ZXN0ICovCisJc3RydWN0IGxzciB7CisJICAgIHVfaW50OF90IGxzX3R5cGVbNF07CisgICAgICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIgbHNfc3RhdGVpZDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeyAvKiBvcGFxdWUgTFNBcyBjaGFuZ2UgdGhlIExTQS1JRCBmaWVsZCAqLworICAgICAgICAgICAgICAgICAgICB1X2ludDhfdCBvcGFxdWVfdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3Qgb3BhcXVlX2lkWzNdOworICAgICAgICAgICAgICAgIH0gb3BhcXVlX2ZpZWxkOworICAgICAgICAgICAgfSB1bl9sc19zdGF0ZWlkOworCSAgICBzdHJ1Y3QgaW5fYWRkciBsc19yb3V0ZXI7CisJfSB1bl9sc3JbMV07CQkvKiBtYXkgcmVwZWF0CSovCisKKwkvKiBMaW5rIFN0YXRlIFVwZGF0ZSAqLworCXN0cnVjdCB7CisJICAgIHVfaW50MzJfdCBsc3VfY291bnQ7CisJICAgIHN0cnVjdCBsc2EgbHN1X2xzYVsxXTsgLyogbWF5IHJlcGVhdAkqLworCX0gdW5fbHN1OworCisJLyogTGluayBTdGF0ZSBBY2tub3dsZWRnZW1lbnQgKi8KKwlzdHJ1Y3QgeworCSAgICBzdHJ1Y3QgbHNhX2hkciBsc2FfbHNoZHJbMV07IC8qIG1heSByZXBlYXQJKi8KKwl9IHVuX2xzYSA7CisgICAgfSBvc3BmX3VuIDsKK307CisKKyNkZWZpbmUJb3NwZl9oZWxsbwlvc3BmX3VuLnVuX2hlbGxvCisjZGVmaW5lCW9zcGZfZGIJCW9zcGZfdW4udW5fZGIKKyNkZWZpbmUJb3NwZl9sc3IJb3NwZl91bi51bl9sc3IKKyNkZWZpbmUJb3NwZl9sc3UJb3NwZl91bi51bl9sc3UKKyNkZWZpbmUJb3NwZl9sc2EJb3NwZl91bi51bl9sc2EKKwpkaWZmIC0tZ2l0IGEvb3NwZjYuaCBiL29zcGY2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyOThlYQotLS0gL2Rldi9udWxsCisrKyBiL29zcGY2LmgKQEAgLTAsMCArMSwyNzggQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvb3NwZjYuaCx2IDEuNiAyMDAyLzEyLzExIDA3OjEzOjU2IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9TUEYgc3VwcG9ydCBjb250cmlidXRlZCBieSBKZWZmcmV5IEhvbmlnIChqY2hAbWl0Y2hlbGwuY2l0LmNvcm5lbGwuZWR1KQorICovCisjZGVmaW5lCU9TUEZfVFlQRV9VTUQJMAkvKiBVTWQncyBzcGVjaWFsIG1vbml0b3JpbmcgcGFja2V0cyAqLworI2RlZmluZQlPU1BGX1RZUEVfSEVMTE8JMQkvKiBIZWxsbyAqLworI2RlZmluZQlPU1BGX1RZUEVfREIJMgkvKiBEYXRhYmFzZSBEZXNjcmlwdGlvbiAqLworI2RlZmluZQlPU1BGX1RZUEVfTFNSCTMJLyogTGluayBTdGF0ZSBSZXF1ZXN0ICovCisjZGVmaW5lCU9TUEZfVFlQRV9MU1UJNAkvKiBMaW5rIFN0YXRlIFVwZGF0ZSAqLworI2RlZmluZQlPU1BGX1RZUEVfTFNBCTUJLyogTGluayBTdGF0ZSBBY2sgKi8KKyNkZWZpbmUJT1NQRl9UWVBFX01BWAk2CisKKy8qIE9wdGlvbnMgKl9vcHRpb25zCSovCisjZGVmaW5lIE9TUEY2X09QVElPTl9WNgkweDAxCS8qIFY2IGJpdDogQSBiaXQgZm9yIHBlZXBpbmcgdG9tICovCisjZGVmaW5lIE9TUEY2X09QVElPTl9FCTB4MDIJLyogRSBiaXQ6IEV4dGVybmFsIHJvdXRlcyBhZHZlcnRpc2VkCSovCisjZGVmaW5lIE9TUEY2X09QVElPTl9NQwkweDA0CS8qIE1DIGJpdDogTXVsdGljYXN0IGNhcGFibGUgKi8KKyNkZWZpbmUgT1NQRjZfT1BUSU9OX04JMHgwOAkvKiBOIGJpdDogRm9yIHR5cGUtNyBMU0EgKi8KKyNkZWZpbmUgT1NQRjZfT1BUSU9OX1IJMHgxMAkvKiBSIGJpdDogUm91dGVyIGJpdCAqLworI2RlZmluZSBPU1BGNl9PUFRJT05fREMJMHgyMAkvKiBEQyBiaXQ6IERlbWFuZCBjaXJjdWl0cyAqLworCisKKy8qIGRiX2ZsYWdzCSovCisjZGVmaW5lCU9TUEY2X0RCX0lOSVQJCTB4MDQJICAgIC8qCSovCisjZGVmaW5lCU9TUEY2X0RCX01PUkUJCTB4MDIKKyNkZWZpbmUJT1NQRjZfREJfTUFTVEVSCQkweDAxCisKKy8qIGxzX3R5cGUJKi8KKyNkZWZpbmUJTFNfVFlQRV9ST1VURVIJCTEgICAvKiByb3V0ZXIgbGluayAqLworI2RlZmluZQlMU19UWVBFX05FVFdPUksJCTIgICAvKiBuZXR3b3JrIGxpbmsgKi8KKyNkZWZpbmUJTFNfVFlQRV9JTlRFUl9BUAkzICAgLyogSW50ZXItQXJlYS1QcmVmaXggKi8KKyNkZWZpbmUJTFNfVFlQRV9JTlRFUl9BUgk0ICAgLyogSW50ZXItQXJlYS1Sb3V0ZXIgKi8KKyNkZWZpbmUJTFNfVFlQRV9BU0UJCTUgICAvKiBBU0UgKi8KKyNkZWZpbmUJTFNfVFlQRV9HUk9VUAkJNiAgIC8qIEdyb3VwIG1lbWJlcnNoaXAgKi8KKyNkZWZpbmUJTFNfVFlQRV9UWVBFNwkJNyAgIC8qIFR5cGUgNyBMU0EgKi8KKyNkZWZpbmUJTFNfVFlQRV9MSU5LCQk4ICAgLyogTGluayBMU0EgKi8KKyNkZWZpbmUJTFNfVFlQRV9JTlRSQV9BUAk5ICAgLyogSW50cmEtQXJlYS1QcmVmaXggKi8KKyNkZWZpbmUJTFNfVFlQRV9NQVgJCTEwCisjZGVmaW5lIExTX1RZUEVfTUFTSwkJMHgxZmZmCisKKyNkZWZpbmUgTFNfU0NPUEVfTElOS0xPQ0FMCTB4MDAwMAorI2RlZmluZSBMU19TQ09QRV9BUkVBCQkweDIwMDAKKyNkZWZpbmUgTFNfU0NPUEVfQVMJCTB4NDAwMAorI2RlZmluZSBMU19TQ09QRV9NQVNLCQkweDYwMDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBpcyB0aGUgYWJvdmUgYSBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24/CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogcmxhX2xpbmsubGlua190eXBlCSovCisjZGVmaW5lCVJMQV9UWVBFX1JPVVRFUgkJMSAgIC8qIHBvaW50LXRvLXBvaW50IHRvIGFub3RoZXIgcm91dGVyCSovCisjZGVmaW5lCVJMQV9UWVBFX1RSQU5TSVQJMiAgIC8qIGNvbm5lY3Rpb24gdG8gdHJhbnNpdCBuZXR3b3JrCSovCisjZGVmaW5lIFJMQV9UWVBFX1ZJUlRVQUwJNCAgIC8qIHZpcnR1YWwgbGluawkJCSovCisKKy8qIHJsYV9mbGFncwkqLworI2RlZmluZQlSTEFfRkxBR19CCTB4MDEKKyNkZWZpbmUJUkxBX0ZMQUdfRQkweDAyCisjZGVmaW5lCVJMQV9GTEFHX1YJMHgwNAorI2RlZmluZQlSTEFfRkxBR19XCTB4MDgKKworLyogc2xhX3Rvc21ldHJpYyBicmVha2Rvd24JKi8KKyNkZWZpbmUJU0xBX01BU0tfVE9TCQkweDdmMDAwMDAwCisjZGVmaW5lCVNMQV9NQVNLX01FVFJJQwkJMHgwMGZmZmZmZgorI2RlZmluZSBTTEFfU0hJRlRfVE9TCQkyNAorCisvKiBhc2xhX21ldHJpYyAqLworI2RlZmluZSBBU0xBX0ZMQUdfRVhURVJOQUwJMHgwNDAwMDAwMAorI2RlZmluZSBBU0xBX0ZMQUdfRldEQUREUgkweDAyMDAwMDAwCisjZGVmaW5lIEFTTEFfRkxBR19ST1VURVRBRwkweDAxMDAwMDAwCisjZGVmaW5lCUFTTEFfTUFTS19NRVRSSUMJMHgwMGZmZmZmZgorCisvKiBtdWx0aWNhc3QgdmVydGV4IHR5cGUgKi8KKyNkZWZpbmUJTUNMQV9WRVJURVhfUk9VVEVSCTEKKyNkZWZpbmUJTUNMQV9WRVJURVhfTkVUV09SSwkyCisKK3R5cGVkZWYgdV9pbnQzMl90IHJ0cmlkX3Q7CisKKy8qIGxpbmsgc3RhdGUgYWR2ZXJ0aXNlbWVudCBoZWFkZXIgKi8KK3N0cnVjdCBsc2FfaGRyIHsKKyAgICB1X2ludDE2X3QgbHNfYWdlOworICAgIHVfaW50MTZfdCBsc190eXBlOworICAgIHJ0cmlkX3QgbHNfc3RhdGVpZDsKKyAgICBydHJpZF90IGxzX3JvdXRlcjsKKyAgICB1X2ludDMyX3QgbHNfc2VxOworICAgIHVfaW50MTZfdCBsc19jaGtzdW07CisgICAgdV9pbnQxNl90IGxzX2xlbmd0aDsKK307CisKK3N0cnVjdCBsc2FfcHJlZml4IHsKKyAgICB1X2ludDhfdCBsc2FfcF9sZW47CisgICAgdV9pbnQ4X3QgbHNhX3Bfb3B0OworICAgIHVfaW50MTZfdCBsc2FfcF9tYno7CisgICAgdV9pbnQ4X3QgbHNhX3BfcHJlZml4WzRdOworfTsKKworLyogbGluayBzdGF0ZSBhZHZlcnRpc2VtZW50ICovCitzdHJ1Y3QgbHNhIHsKKyAgICBzdHJ1Y3QgbHNhX2hkciBsc19oZHI7CisKKyAgICAvKiBMaW5rIHN0YXRlIHR5cGVzICovCisgICAgdW5pb24geworCS8qIFJvdXRlciBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLworCXN0cnVjdCB7CisJICAgIHVuaW9uIHsKKwkJdV9pbnQ4X3QgZmxnOworCQl1X2ludDMyX3Qgb3B0OworCSAgICB9IHJsYV9mbGdhbmRvcHQ7CisjZGVmaW5lIHJsYV9mbGFncwlybGFfZmxnYW5kb3B0LmZsZworI2RlZmluZSBybGFfb3B0aW9ucwlybGFfZmxnYW5kb3B0Lm9wdAorCSAgICBzdHJ1Y3QgcmxhbGluayB7CisJCXVfaW50OF90IGxpbmtfdHlwZTsKKwkJdV9pbnQ4X3QgbGlua196ZXJvWzFdOworCQl1X2ludDE2X3QgbGlua19tZXRyaWM7CisJCXVfaW50MzJfdCBsaW5rX2lmaWQ7CisJCXVfaW50MzJfdCBsaW5rX25pZmlkOworCQlydHJpZF90IGxpbmtfbnJ0aWQ7CisJICAgIH0gcmxhX2xpbmtbMV07CQkvKiBtYXkgcmVwZWF0CSovCisJfSB1bl9ybGE7CisKKwkvKiBOZXR3b3JrIGxpbmtzIGFkdmVydGlzZW1lbnRzICovCisJc3RydWN0IHsKKwkgICAgdV9pbnQzMl90IG5sYV9vcHRpb25zOworCSAgICBydHJpZF90IG5sYV9yb3V0ZXJbMV07CS8qIG1heSByZXBlYXQJKi8KKwl9IHVuX25sYTsKKworCS8qIEludGVyIEFyZWEgUHJlZml4IExTQSAqLworCXN0cnVjdCB7CisJICAgIHVfaW50MzJfdCBpbnRlcl9hcF9tZXRyaWM7CisJICAgIHN0cnVjdCBsc2FfcHJlZml4IGludGVyX2FwX3ByZWZpeFsxXTsKKwl9IHVuX2ludGVyX2FwOworCisJLyogQVMgZXh0ZXJuYWwgbGlua3MgYWR2ZXJ0aXNlbWVudHMgKi8KKwlzdHJ1Y3QgeworCSAgICB1X2ludDMyX3QgYXNsYV9tZXRyaWM7CisJICAgIHN0cnVjdCBsc2FfcHJlZml4IGFzbGFfcHJlZml4WzFdOworCSAgICAvKiBzb21lIG9wdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KKwl9IHVuX2FzbGE7CisKKyNpZiAwCisJLyogU3VtbWFyeSBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLworCXN0cnVjdCB7CisJICAgIHN0cnVjdCBpbl9hZGRyIHNsYV9tYXNrOworCSAgICB1X2ludDMyX3Qgc2xhX3Rvc21ldHJpY1sxXTsJLyogbWF5IHJlcGVhdAkqLworCX0gdW5fc2xhOworCisJLyogTXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgKi8KKwlzdHJ1Y3QgbWNsYSB7CisJICAgIHVfaW50MzJfdCBtY2xhX3Z0eXBlOworCSAgICBzdHJ1Y3QgaW5fYWRkciBtY2xhX3ZpZDsKKwl9IHVuX21jbGFbMV07CisjZW5kaWYKKworCS8qIFR5cGUgNyBMU0EgKi8KKworCS8qIExpbmsgTFNBICovCisJc3RydWN0IGxsc2EgeworCSAgICB1bmlvbiB7CisJCXVfaW50OF90IHByaTsKKwkJdV9pbnQzMl90IG9wdDsKKwkgICAgfSBsbHNhX3ByaWFuZG9wdDsKKyNkZWZpbmUgbGxzYV9wcmlvcml0eQlsbHNhX3ByaWFuZG9wdC5wcmkKKyNkZWZpbmUgbGxzYV9vcHRpb25zCWxsc2FfcHJpYW5kb3B0Lm9wdAorCSAgICBzdHJ1Y3QgaW42X2FkZHIgbGxzYV9sbGFkZHI7CisJICAgIHVfaW50MzJfdCBsbHNhX25wcmVmaXg7CisJICAgIHN0cnVjdCBsc2FfcHJlZml4IGxsc2FfcHJlZml4WzFdOworCX0gdW5fbGxzYTsKKworCS8qIEludHJhLUFyZWEtUHJlZml4ICovCisJc3RydWN0IHsKKwkgICAgdV9pbnQxNl90IGludHJhX2FwX25wcmVmaXg7CisJICAgIHVfaW50MTZfdCBpbnRyYV9hcF9sc3R5cGU7CisJICAgIHJ0cmlkX3QgaW50cmFfYXBfbHNpZDsKKwkgICAgcnRyaWRfdCBpbnRyYV9hcF9ydGlkOworCSAgICBzdHJ1Y3QgbHNhX3ByZWZpeCBpbnRyYV9hcF9wcmVmaXhbMV07CisJfSB1bl9pbnRyYV9hcDsKKyAgICB9IGxzYV91bjsKK307CisKKworLyoKKyAqIFRPUyBtZXRyaWMgc3RydWN0ICh3aWxsIGJlIDAgb3IgbW9yZSBpbiByb3V0ZXIgbGlua3MgdXBkYXRlKQorICovCitzdHJ1Y3QgdG9zX21ldHJpYyB7CisgICAgdV9pbnQ4X3QgdG9zX3R5cGU7CisgICAgdV9pbnQ4X3QgdG9zX3plcm87CisgICAgdV9pbnQxNl90IHRvc19tZXRyaWM7Cit9OworCisjZGVmaW5lCU9TUEZfQVVUSF9TSVpFCTgKKworLyoKKyAqIHRoZSBtYWluIGhlYWRlcgorICovCitzdHJ1Y3Qgb3NwZjZoZHIgeworICAgIHVfaW50OF90IG9zcGY2X3ZlcnNpb247CisgICAgdV9pbnQ4X3Qgb3NwZjZfdHlwZTsKKyAgICB1X2ludDE2X3Qgb3NwZjZfbGVuOworICAgIHJ0cmlkX3Qgb3NwZjZfcm91dGVyaWQ7CisgICAgcnRyaWRfdCBvc3BmNl9hcmVhaWQ7CisgICAgdV9pbnQxNl90IG9zcGY2X2Noa3N1bTsKKyAgICB1X2ludDhfdCBvc3BmNl9pbnN0YW5jZWlkOworICAgIHVfaW50OF90IG9zcGY2X3JzdmQ7CisgICAgdW5pb24geworCisJLyogSGVsbG8gcGFja2V0ICovCisJc3RydWN0IHsKKwkgICAgdV9pbnQzMl90IGhlbGxvX2lmaWQ7CisJICAgIHVuaW9uIHsKKwkJdV9pbnQ4X3QgcHJpOworCQl1X2ludDMyX3Qgb3B0OworCSAgICB9IGhlbGxvX3ByaWFuZG9wdDsKKyNkZWZpbmUgaGVsbG9fcHJpb3JpdHkJaGVsbG9fcHJpYW5kb3B0LnByaQorI2RlZmluZSBoZWxsb19vcHRpb25zCWhlbGxvX3ByaWFuZG9wdC5vcHQKKwkgICAgdV9pbnQxNl90IGhlbGxvX2hlbGxvaW50OworCSAgICB1X2ludDE2X3QgaGVsbG9fZGVhZGludDsKKwkgICAgcnRyaWRfdCBoZWxsb19kcjsKKwkgICAgcnRyaWRfdCBoZWxsb19iZHI7CisJICAgIHJ0cmlkX3QgaGVsbG9fbmVpZ2hib3JbMV07IC8qIG1heSByZXBlYXQJKi8KKwl9IHVuX2hlbGxvOworCisJLyogRGF0YWJhc2UgRGVzY3JpcHRpb24gcGFja2V0ICovCisJc3RydWN0IHsKKwkgICAgdV9pbnQzMl90IGRiX29wdGlvbnM7CisJICAgIHVfaW50MTZfdCBkYl9tdHU7CisJICAgIHVfaW50OF90IGRiX21iejsKKwkgICAgdV9pbnQ4X3QgZGJfZmxhZ3M7CisJICAgIHVfaW50MzJfdCBkYl9zZXE7CisJICAgIHN0cnVjdCBsc2FfaGRyIGRiX2xzaGRyWzFdOyAvKiBtYXkgcmVwZWF0CSovCisJfSB1bl9kYjsKKworCS8qIExpbmsgU3RhdGUgUmVxdWVzdCAqLworCXN0cnVjdCBsc3IgeworCSAgICB1X2ludDE2X3QgbHNfbWJ6OworCSAgICB1X2ludDE2X3QgbHNfdHlwZTsKKwkgICAgcnRyaWRfdCBsc19zdGF0ZWlkOworCSAgICBydHJpZF90IGxzX3JvdXRlcjsKKwl9IHVuX2xzclsxXTsJCS8qIG1heSByZXBlYXQJKi8KKworCS8qIExpbmsgU3RhdGUgVXBkYXRlICovCisJc3RydWN0IHsKKwkgICAgdV9pbnQzMl90IGxzdV9jb3VudDsKKwkgICAgc3RydWN0IGxzYSBsc3VfbHNhWzFdOyAvKiBtYXkgcmVwZWF0CSovCisJfSB1bl9sc3U7CisKKwkvKiBMaW5rIFN0YXRlIEFja25vd2xlZGdlbWVudCAqLworCXN0cnVjdCB7CisJICAgIHN0cnVjdCBsc2FfaGRyIGxzYV9sc2hkclsxXTsgLyogbWF5IHJlcGVhdAkqLworCX0gdW5fbHNhIDsKKyAgICB9IG9zcGY2X3VuIDsKK307CisKKyNkZWZpbmUJb3NwZjZfaGVsbG8Jb3NwZjZfdW4udW5faGVsbG8KKyNkZWZpbmUJb3NwZjZfZGIJb3NwZjZfdW4udW5fZGIKKyNkZWZpbmUJb3NwZjZfbHNyCW9zcGY2X3VuLnVuX2xzcgorI2RlZmluZQlvc3BmNl9sc3UJb3NwZjZfdW4udW5fbHN1CisjZGVmaW5lCW9zcGY2X2xzYQlvc3BmNl91bi51bl9sc2EKKwpkaWZmIC0tZ2l0IGEvb3VpLmMgYi9vdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RjZDQwCi0tLSAvZGV2L251bGwKKysrIGIvb3VpLmMKQEAgLTAsMCArMSw5NSBAQAorLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL291aS5jLHYgMS40LjIuMSAyMDA1LzA0LzE3IDAxOjIwOjU2IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJvdWkuaCIKKworLyogRklYTUUgY29tcGxldGUgT1VJIGxpc3QgdXNpbmcgYSBzY3JpcHQgKi8KKworc3RydWN0IHRvayBvdWlfdmFsdWVzW10gPSB7CisgICAgeyBPVUlfRU5DQVBfRVRIRVIsICJFdGhlcm5ldCIgfSwKKyAgICB7IE9VSV9DSVNDTywgIkNpc2NvIiB9LAorICAgIHsgT1VJX05PUlRFTCwgIk5vcnRlbCBOZXR3b3JrcyBTT05NUCIgfSwKKyAgICB7IE9VSV9DSVNDT185MCwgIkNpc2NvIGJyaWRnZWQiIH0sCisgICAgeyBPVUlfUkZDMjY4NCwgIkV0aGVybmV0IGJyaWRnZWQiIH0sCisgICAgeyBPVUlfQVRNX0ZPUlVNLCAiQVRNIEZvcnVtIiB9LAorICAgIHsgT1VJX0NBQkxFX0JQRFUsICJET0NTSVMgU3Bhbm5pbmcgVHJlZSIgfSwKKyAgICB7IE9VSV9BUFBMRVRBTEssICJBcHBsZXRhbGsiIH0sCisgICAgeyBPVUlfSlVOSVBFUiwgIkp1bmlwZXIiIH0sCisgICAgeyBPVUlfSFAsICJIZXdsZXR0LVBhY2thcmQiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qCisgKiBTTUkgTmV0d29yayBNYW5hZ2VtZW50IFByaXZhdGUgRW50ZXJwcmlzZSBDb2RlcyBmb3Igb3JnYW5pemF0aW9ucy4KKyAqCisgKiBYWFggLSB0aGVzZSBhbHNvIGFwcGVhciBpbiBGcmVlUmFkaXVzIGRpY3Rpb25hcnkgZmlsZXMsIHdpdGggaXRlbXMgc3VjaAorICogYXMKKyAqCisgKglWRU5ET1IgICAgICAgICAgQ2lzY28gICAgICAgICAgIDkKKyAqCisgKiBMaXN0IHRha2VuIGZyb20gRXRoZXJlYWwncyBlcGFuL3NtaW5tcGVjLmMuCisgKi8KK3N0cnVjdCB0b2sgc21pX3ZhbHVlc1tdID0geworICAgIHsgU01JX0lFVEYsICAgICAgICAgICAgICAgICAiSUVURiAocmVzZXJ2ZWQpIn0sCisgICAgeyBTTUlfQUNDLCAgICAgICAgICAgICAgICAgICJBQ0MifSwKKyAgICB7IFNNSV9DSVNDTywgICAgICAgICAgICAgICAgIkNpc2NvIn0sCisgICAgeyBTTUlfSEVXTEVUVF9QQUNLQVJELCAgICAgICJIZXdsZXR0IFBhY2thcmQifSwKKyAgICB7IFNNSV9TVU5fTUlDUk9TWVNURU1TLCAgICAgIlN1biBNaWNyb3N5c3RlbXMifSwKKyAgICB7IFNNSV9NRVJJVCwgICAgICAgICAgICAgICAgIk1lcml0In0sCisgICAgeyBTTUlfU0hJVkEsICAgICAgICAgICAgICAgICJTaGl2YSJ9LAorICAgIHsgU01JX0VSSUNTU09OLCAgICAgICAgICAgICAiRXJpY3Nzb24gQUIifSwKKyAgICB7IFNNSV9DSVNDT19WUE41MDAwLCAgICAgICAgIkNpc2NvIFZQTiA1MDAwIn0sCisgICAgeyBTTUlfTElWSU5HU1RPTiwgICAgICAgICAgICJMaXZpbmdzdG9uIn0sCisgICAgeyBTTUlfTUlDUk9TT0ZULCAgICAgICAgICAgICJNaWNyb3NvZnQifSwKKyAgICB7IFNNSV8zQ09NLCAgICAgICAgICAgICAgICAgIjNDb20ifSwKKyAgICB7IFNNSV9BU0NFTkQsICAgICAgICAgICAgICAgIkFzY2VuZCJ9LAorICAgIHsgU01JX0JBWSwgICAgICAgICAgICAgICAgICAiQmF5IE5ldHdvcmtzIn0sCisgICAgeyBTTUlfRk9VTkRSWSwgICAgICAgICAgICAgICJGb3VuZHJ5In0sCisgICAgeyBTTUlfVkVSU0FORVQsICAgICAgICAgICAgICJWZXJzYW5ldCJ9LAorICAgIHsgU01JX1JFREJBQ0ssICAgICAgICAgICAgICAiUmVkYmFjayJ9LAorICAgIHsgU01JX0pVTklQRVIsICAgICAgICAgICAgICAiSnVuaXBlciBOZXR3b3JrcyJ9LAorICAgIHsgU01JX0FQVElTLCAgICAgICAgICAgICAgICAiQXB0aXMifSwKKyAgICB7IFNNSV9DSVNDT19WUE4zMDAwLCAgICAgICAgIkNpc2NvIFZQTiAzMDAwIn0sCisgICAgeyBTTUlfQ09TSU5FLCAgICAgICAgICAgICAgICJDb1NpbmUgQ29tbXVuaWNhdGlvbnMifSwKKyAgICB7IFNNSV9ORVRTQ1JFRU4sICAgICAgICAgICAgIk5ldHNjcmVlbiJ9LAorICAgIHsgU01JX1NIQVNUQSwgICAgICAgICAgICAgICAiU2hhc3RhIn0sCisgICAgeyBTTUlfTk9NQURJWCwgICAgICAgICAgICAgICJOb21hZGl4In0sCisgICAgeyBTTUlfU0lFTUVOUywgICAgICAgICAgICAgICJTaWVtZW5zIn0sCisgICAgeyBTTUlfQ0FCTEVMQUJTLCAgICAgICAgICAgICJDYWJsZUxhYnMifSwKKyAgICB7IFNNSV9VTklTUEhFUkUsICAgICAgICAgICAgIlVuaXNwaGVyZSBOZXR3b3JrcyJ9LAorICAgIHsgU01JX0NJU0NPX0JCU00sICAgICAgICAgICAiQ2lzY28gQkJTTSJ9LAorICAgIHsgU01JX1RIRTNHUFAyLCAgICAgICAgICAgICAiM3JkIEdlbmVyYXRpb24gUGFydG5lcnNoaXAgUHJvamVjdCAyICgzR1BQMikifSwKKyAgICB7IFNNSV9JUF9VTlBMVUdHRUQsICAgICAgICAgImlwVW5wbHVnZ2VkIn0sCisgICAgeyBTTUlfSVNTQU5OSSwgICAgICAgICAgICAgICJJc3Nhbm5pIENvbW11bmljYXRpb25zIn0sCisgICAgeyBTTUlfUVVJTlRVTSwgICAgICAgICAgICAgICJRdWludHVtIn0sCisgICAgeyBTTUlfSU5URVJMSU5LLCAgICAgICAgICAgICJJbnRlcmxpbmsifSwKKyAgICB7IFNNSV9DT0xVQlJJUywgICAgICAgICAgICAgIkNvbHVicmlzIn0sCisgICAgeyBTTUlfQ09MVU1CSUFfVU5JVkVSU0lUWSwgICJDb2x1bWJpYSBVbml2ZXJzaXR5In0sCisgICAgeyBTTUlfVEhFM0dQUCwgICAgICAgICAgICAgICIzR1BQIn0sCisgICAgeyBTTUlfR0VNVEVLX1NZU1RFTVMsICAgICAgICJHZW10ZWstU3lzdGVtcyJ9LAorICAgIHsgU01JX1dJRklfQUxMSUFOQ0UsICAgICAgICAiV2ktRmkgQWxsaWFuY2UifSwKKyAgICB7IDAsIE5VTEx9Cit9OwpkaWZmIC0tZ2l0IGEvb3VpLmggYi9vdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDc5ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3VpLmgKQEAgLTAsMCArMSw3OCBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9vdWkuaCx2IDEuMy4yLjEgMjAwNS8wNC8xNyAwMToyMDo1NiBndXkgRXhwICQgKExCTCkgKi8KKy8qIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCitleHRlcm4gc3RydWN0IHRvayBvdWlfdmFsdWVzW107CitleHRlcm4gc3RydWN0IHRvayBzbWlfdmFsdWVzW107CisKKyNkZWZpbmUgT1VJX0VOQ0FQX0VUSEVSIDB4MDAwMDAwICAgICAgICAvKiBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQgKi8KKyNkZWZpbmUgT1VJX0NJU0NPICAgICAgIDB4MDAwMDBjICAgICAgICAvKiBDaXNjbyBwcm90b2NvbHMgKi8KKyNkZWZpbmUgT1VJX05PUlRFTCAgICAgIDB4MDAwMDgxICAgICAgICAvKiBOb3J0ZWwgU09OTVAgKi8KKyNkZWZpbmUgT1VJX0NJU0NPXzkwICAgIDB4MDAwMGY4ICAgICAgICAvKiBDaXNjbyBicmlkZ2luZyAqLworI2RlZmluZSBPVUlfUkZDMjY4NCAgICAgMHgwMDgwYzIgICAgICAgIC8qIFJGQyAyNDI3LzI2ODQgYnJpZGdlZCBFdGhlcm5ldCAqLworI2RlZmluZSBPVUlfQVRNX0ZPUlVNICAgMHgwMEEwM0UgICAgICAgIC8qIEFUTSBGb3J1bSAqLworI2RlZmluZSBPVUlfQ0FCTEVfQlBEVSAgMHgwMEUwMkYgICAgICAgIC8qIERPQ1NJUyBzcGFubmluZyB0cmVlIEJQRFUgKi8KKyNkZWZpbmUgT1VJX0FQUExFVEFMSyAgIDB4MDgwMDA3ICAgICAgICAvKiBBcHBsZXRhbGsgKi8KKyNkZWZpbmUgT1VJX0pVTklQRVIgICAgIDB4MDA5MDY5ICAgICAgICAvKiBKdW5pcGVyICovCisjZGVmaW5lIE9VSV9IUCAgICAgICAgICAweDA4MDAwOSAgICAgICAgLyogSGV3bGV0dC1QYWNrYXJkICovCisKKy8qCisgKiBUaGVzZSBhcmUgU01JIE5ldHdvcmsgTWFuYWdlbWVudCBQcml2YXRlIEVudGVycHJpc2UgQ29kZXMgZm9yCisgKiBvcmdhbml6YXRpb25zOyBzZWUKKyAqCisgKglodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2VudGVycHJpc2UtbnVtYmVycworICoKKyAqIGZvciBhIGxpc3QuCisgKgorICogTGlzdCB0YWtlbiBmcm9tIEV0aGVyZWFsJ3MgZXBhbi9zbWlubXBlYy5oLgorICovCisjZGVmaW5lIFNNSV9JRVRGICAgICAgICAgICAgICAgICAgICAgMCAvKiByZXNlcnZlZCAtIHVzZWQgYnkgdGhlIElFVEYgaW4gTDJUUD8gKi8KKyNkZWZpbmUgU01JX0FDQyAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNNSV9DSVNDTyAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBTTUlfSEVXTEVUVF9QQUNLQVJEICAgICAgICAgIDExCisjZGVmaW5lIFNNSV9TVU5fTUlDUk9TWVNURU1TICAgICAgICAgNDIKKyNkZWZpbmUgU01JX01FUklUICAgICAgICAgICAgICAgICAgICA2MQorI2RlZmluZSBTTUlfU0hJVkEgICAgICAgICAgICAgICAgICAgIDE2NgorI2RlZmluZSBTTUlfRVJJQ1NTT04gICAgICAgICAgICAgICAgIDE5MworI2RlZmluZSBTTUlfQ0lTQ09fVlBONTAwMCAgICAgICAgICAgIDI1NQorI2RlZmluZSBTTUlfTElWSU5HU1RPTiAgICAgICAgICAgICAgIDMwNworI2RlZmluZSBTTUlfTUlDUk9TT0ZUICAgICAgICAgICAgICAgIDMxMQorI2RlZmluZSBTTUlfM0NPTSAgICAgICAgICAgICAgICAgICAgIDQyOQorI2RlZmluZSBTTUlfQVNDRU5EICAgICAgICAgICAgICAgICAgIDUyOQorI2RlZmluZSBTTUlfQkFZICAgICAgICAgICAgICAgICAgICAgIDE1ODQKKyNkZWZpbmUgU01JX0ZPVU5EUlkgICAgICAgICAgICAgICAgICAxOTkxCisjZGVmaW5lIFNNSV9WRVJTQU5FVCAgICAgICAgICAgICAgICAgMjE4MAorI2RlZmluZSBTTUlfUkVEQkFDSyAgICAgICAgICAgICAgICAgIDIzNTIKKyNkZWZpbmUgU01JX0pVTklQRVIgICAgICAgICAgICAgICAgICAyNjM2CisjZGVmaW5lIFNNSV9BUFRJUyAgICAgICAgICAgICAgICAgICAgMjYzNworI2RlZmluZSBTTUlfQ0lTQ09fVlBOMzAwMCAgICAgICAgICAgIDMwNzYKKyNkZWZpbmUgU01JX0NPU0lORSAgICAgICAgICAgICAgICAgICAzMDg1CisjZGVmaW5lIFNNSV9TSEFTVEEgICAgICAgICAgICAgICAgICAgMzE5OQorI2RlZmluZSBTTUlfTkVUU0NSRUVOICAgICAgICAgICAgICAgIDMyMjQKKyNkZWZpbmUgU01JX05PTUFESVggICAgICAgICAgICAgICAgICAzMzA5CisjZGVmaW5lIFNNSV9TSUVNRU5TICAgICAgICAgICAgICAgICAgNDMyOQorI2RlZmluZSBTTUlfQ0FCTEVMQUJTICAgICAgICAgICAgICAgIDQ0OTEKKyNkZWZpbmUgU01JX1VOSVNQSEVSRSAgICAgICAgICAgICAgICA0ODc0CisjZGVmaW5lIFNNSV9DSVNDT19CQlNNICAgICAgICAgICAgICAgNTI2MworI2RlZmluZSBTTUlfVEhFM0dQUDIgICAgICAgICAgICAgICAgIDU1MzUKKyNkZWZpbmUgU01JX0lQX1VOUExVR0dFRCAgICAgICAgICAgICA1OTI1CisjZGVmaW5lIFNNSV9JU1NBTk5JICAgICAgICAgICAgICAgICAgNTk0OAorI2RlZmluZSBTTUlfUVVJTlRVTSAgICAgICAgICAgICAgICAgIDY2MTgKKyNkZWZpbmUgU01JX0lOVEVSTElOSyAgICAgICAgICAgICAgICA2NzI4CisjZGVmaW5lIFNNSV9DT0xVQlJJUyAgICAgICAgICAgICAgICAgODc0NAorI2RlZmluZSBTTUlfQ09MVU1CSUFfVU5JVkVSU0lUWSAgICAgIDExODYyCisjZGVmaW5lIFNNSV9USEUzR1BQICAgICAgICAgICAgICAgICAgMTA0MTUKKyNkZWZpbmUgU01JX0dFTVRFS19TWVNURU1TICAgICAgICAgICAxMDUyOQorI2RlZmluZSBTTUlfV0lGSV9BTExJQU5DRSAgICAgICAgICAgIDE0MTIyCmRpZmYgLS1naXQgYS9wYWNrZXRkYXQuYXdrIGIvcGFja2V0ZGF0LmF3awpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTJlMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2V0ZGF0LmF3awpAQCAtMCwwICsxLDYxIEBACitCRUdJTgl7CisJIyB3ZSBuZWVkIHRvIGtub3cgKHVzdWFsKSBwYWNrZXQgc2l6ZSB0byBjb252ZXJ0IGJ5dGUgbnVtYmVycworCSMgdG8gcGFja2V0IG51bWJlcnMKKwlpZiAocGFja2V0c2l6ZSA8PSAwKQorCQlwYWNrZXRzaXplID0gNTEyCisJfQorJDUgIX4gL1tTUl0vCXsKKwkjIHByaW50IG91dCBwZXItcGFja2V0IGRhdGEgaW4gdGhlIGZvcm06CisJIyAgPHBhY2tldCAjPgorCSMgIDxzdGFydCBzZXF1ZW5jZSAjPgorCSMgIDwxc3Qgc2VuZCB0aW1lPgorCSMgIDxsYXN0IHNlbmQgdGltZT4KKwkjICA8MXN0IGFjayB0aW1lPgorCSMgIDxsYXN0IGFjayB0aW1lPgorCSMgIDwjIHNlbmRzPgorCSMgIDwjIGFja3M+CisKKwluID0gc3BsaXQgKCQxLHQsIjoiKQorCXRpbSA9IHRbMV0qMzYwMCArIHRbMl0qNjAgKyB0WzNdCisJaWYgKCQ2ICE9ICJhY2siKSB7CisJCWkgPSBpbmRleCgkNiwiOiIpCisJCXN0cnRTZXEgPSBzdWJzdHIoJDYsMSxpLTEpCisJCWlkID0gMS41ICsgKHN0cnRTZXEgLSAxKSAvIHBhY2tldHNpemUKKwkJaWQgLT0gaWQgJSAxCisJCWlmIChtYXhJZCA8IGlkKQorCQkJbWF4SWQgPSBpZAorCQlpZiAoZmlyc3RTZW5kW2lkXSA9PSAwKSB7CisJCQlmaXJzdFNlbmRbaWRdID0gdGltCisJCQlzZXFOb1tpZF0gPSBzdHJ0U2VxCisJCX0KKwkJbGFzdFNlbmRbaWRdID0gdGltCisJCXRpbWVzU2VudFtpZF0rKworCQl0b3RhbFBhY2tldHMrKworCX0gZWxzZSB7CisJCWlkID0gMSArICgkNyAtIDIpIC8gcGFja2V0c2l6ZQorCQlpZCAtPSBpZCAlIDEKKwkJdGltZXNBY2tlZFtpZF0rKworCQlpZiAoZmlyc3RBY2tbaWRdID09IDApCisJCQlmaXJzdEFja1tpZF0gPSB0aW0KKwkJbGFzdEFja1tpZF0gPSB0aW0KKwkJdG90YWxBY2tzKysKKwl9CisJfQorRU5ECXsKKwlwcmludCAiIyAiIG1heElkICIgY2h1bmtzLiAgIiB0b3RhbFBhY2tldHMgIiBwYWNrZXRzIHNlbnQuICAiIFwKKwkJdG90YWxBY2tzICIgYWNrcy4iCisJIyBmb3IgcGFja2V0cyB0aGF0IHdlcmUgaW1wbGljaXRseSBhY2tlZCwgbWFrZSB0aGUgYWNrIHRpbWUKKwkjIGJlIHRoZSBhY2sgdGltZSBvZiBuZXh0IGV4cGxpY2l0bHkgYWNrZWQgcGFja2V0LgorCWZvciAoaSA9IG1heElkLTE7IGkgPiAwOyAtLWkpCisJCXdoaWxlIChpID4gMCAmJiBmaXJzdEFja1tpXSA9PSAwKSB7CisJCQlsYXN0QWNrW2ldID0gZmlyc3RBY2tbaV0gPSBmaXJzdEFja1tpKzFdCisJCQktLWkKKwkJfQorCXR6ZXJvID0gZmlyc3RTZW5kWzFdCisJZm9yIChpID0gMTsgaSA8PSBtYXhJZDsgaSsrKQorCQlwcmludGYgIiVkXHQlZFx0JS4yZlx0JS4yZlx0JS4yZlx0JS4yZlx0JWRcdCVkXG4iLFwKKwkJCWksIHNlcU5vW2ldLCBcCisJCQlmaXJzdFNlbmRbaV0gLSB0emVybywgbGFzdFNlbmRbaV0gLSB0emVybyxcCisJCQlmaXJzdEFja1tpXSAtIHR6ZXJvLCBsYXN0QWNrW2ldIC0gdHplcm8sXAorCQkJdGltZXNTZW50W2ldLCB0aW1lc0Fja2VkW2ldCisJfQpkaWZmIC0tZ2l0IGEvcGFyc2VuZnNmaC5jIGIvcGFyc2VuZnNmaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWUwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYXJzZW5mc2ZoLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQgSmVmZnJleSBDLiBNb2d1bCwgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sCisgKiBXZXN0ZXJuIFJlc2VhcmNoIExhYm9yYXRvcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqICBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkIG9ubHkgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQKKyAqICBjb25kaXRpb25zLiAgQm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisgKiAgbm90aWNlIG11c3QgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzCisgKiAgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMgdGhlcmVvZiwgYW5kIGJvdGggbm90aWNlcworICogIG11c3QgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04KKyAqICBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisgKiAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICAgSU4gTk8KKyAqICBFVkVOVCBTSEFMTCBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkKKyAqICBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KKyAqICBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCisgKiAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRS4KKyAqLworCisvKgorICogcGFyc2VuZnNmaC5jIC0gcG9ydGFibGUgcGFyc2VyIGZvciBORlMgZmlsZSBoYW5kbGVzCisgKgkJCXVzZXMgYWxsIHNvcnRzIG9mIGhldXJpc3RpY3MKKyAqCisgKiBKZWZmcmV5IEMuIE1vZ3VsCisgKiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgorICogV2VzdGVybiBSZXNlYXJjaCBMYWJvcmF0b3J5CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcGFyc2VuZnNmaC5jLHYgMS4yOC4yLjEgMjAwNy8wNi8xNSAxOToxNTowNCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibmZzZmguaCIKKworLyoKKyAqIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBwYXJzZSBhIGZpbGUgaGFuZGxlIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpLAorICogdXNpbmcgaGV1cmlzdGljcyB0byBndWVzcyB3aGF0IGtpbmQgb2YgZm9ybWF0IGl0IGlzIGluLiAgU2VlIHRoZQorICogZmlsZSAiZmhhbmRsZV9sYXlvdXRzIiBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91cworICogcGF0dGVybnMgd2Uga25vdyBhYm91dC4KKyAqCisgKiBUaGUgZmlsZSBoYW5kbGUgaXMgcGFyc2VkIGludG8gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKKyAqIGZpbGUtc3lzdGVtIGlkLCBhbmQgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW5vZGUtbnVtYmVyLgorICovCisKKyNkZWZpbmUJRkhUX1VOS05PV04JMAorI2RlZmluZQlGSFRfQVVTUEVYCTEKKyNkZWZpbmUJRkhUX0RFQ09TRgkyCisjZGVmaW5lCUZIVF9JUklYNAkzCisjZGVmaW5lCUZIVF9JUklYNQk0CisjZGVmaW5lCUZIVF9TVU5PUzMJNQorI2RlZmluZQlGSFRfU1VOT1M0CTYKKyNkZWZpbmUJRkhUX1VMVFJJWAk3CisjZGVmaW5lCUZIVF9WTVNVQ1gJOAorI2RlZmluZQlGSFRfU1VOT1M1CTkKKyNkZWZpbmUJRkhUX0FJWDMyCTEwCisjZGVmaW5lCUZIVF9IUFVYOQkxMQorI2RlZmluZQlGSFRfQlNENDQJMTIKKworI2lmZGVmCXVsdHJpeAorLyogTmFzdHkgaGFjayB0byBrZWVwIHRoZSBVbHRyaXggQyBjb21waWxlciBmcm9tIGVtaXR0aW5nIGJvZ3VzIHdhcm5pbmdzICovCisjZGVmaW5lCVhGRih4KQkoKHVfaW50MzJfdCkoeCkpCisjZWxzZQorI2RlZmluZQlYRkYoeCkJKHgpCisjZW5kaWYKKworI2RlZmluZQltYWtlX3VpbnQzMihtc2IsYixjLGxzYilcCisJKFhGRihsc2IpICsgKFhGRihjKTw8OCkgKyAoWEZGKGIpPDwxNikgKyAoWEZGKG1zYik8PDI0KSkKKworI2RlZmluZQltYWtlX3VpbnQyNChtc2IsYiwgbHNiKVwKKwkoWEZGKGxzYikgKyAoWEZGKGIpPDw4KSArIChYRkYobXNiKTw8MTYpKQorCisjZGVmaW5lCW1ha2VfdWludDE2KG1zYixsc2IpXAorCShYRkYobHNiKSArIChYRkYobXNiKTw8OCkpCisKKyNpZmRlZglfX2FscGhhCisJLyogb3Igb3RoZXIgNjQtYml0IHN5c3RlbXMgKi8KKyNkZWZpbmUJbWFrZV91aW50NDgobXNiLGIsYyxkLGUsbHNiKVwKKwkoKGxzYikgKyAoKGUpPDw4KSArICgoZCk8PDE2KSArICgoYyk8PDI0KSArICgoYik8PDMyKSArICgobXNiKTw8NDApKQorI2Vsc2UKKwkvKiBvbiAzMi1iaXQgc3lzdGVtcyBpZ25vcmUgaGlnaC1vcmRlciBiaXRzICovCisjZGVmaW5lCW1ha2VfdWludDQ4KG1zYixiLGMsZCxlLGxzYilcCisJKChsc2IpICsgKChlKTw8OCkgKyAoKGQpPDwxNikgKyAoKGMpPDwyNCkpCisjZW5kaWYKKworc3RhdGljIGludCBpc19VQ1goY29uc3QgdW5zaWduZWQgY2hhciAqKTsKKwordm9pZAorUGFyc2VfZmgoZmgsIGxlbiwgZnNpZHAsIGlub3AsIG9zbmFtZXAsIGZzbmFtZXAsIG91cnNlbGYpCityZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpmaDsKK2ludCBsZW4gX1VfOworbXlfZnNpZCAqZnNpZHA7Citpbm9fdCAqaW5vcDsKK2NvbnN0IGNoYXIgKipvc25hbWVwOwkJLyogaWYgbm9uLU5VTEwsIHJldHVybiBPUyBuYW1lIGhlcmUgKi8KK2NvbnN0IGNoYXIgKipmc25hbWVwOwkJLyogaWYgbm9uLU5VTEwsIHJldHVybiBzZXJ2ZXIgZnMgbmFtZSBoZXJlIChmb3IgVk1TKSAqLworaW50IG91cnNlbGY7CQkvKiB0cnVlIGlmIGZpbGUgaGFuZGxlIHdhcyBnZW5lcmF0ZWQgb24gdGhpcyBob3N0ICovCit7CisJcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZmhwID0gZmg7CisJdV9pbnQzMl90IHRlbXA7CisJaW50IGZodHlwZSA9IEZIVF9VTktOT1dOOworCWludCBpOworCisJaWYgKG91cnNlbGYpIHsKKwkgICAgLyogRmlsZSBoYW5kbGUgZ2VuZXJhdGVkIG9uIHRoaXMgaG9zdCwgbm8gbmVlZCBmb3IgZ3Vlc3NpbmcgKi8KKyNpZglkZWZpbmVkKElSSVg0MCkKKwkgICAgZmh0eXBlID0gRkhUX0lSSVg0OworI2VuZGlmCisjaWYJZGVmaW5lZChJUklYNTApCisJICAgIGZodHlwZSA9IEZIVF9JUklYNTsKKyNlbmRpZgorI2lmCWRlZmluZWQoSVJJWDUxKQorCSAgICBmaHR5cGUgPSBGSFRfSVJJWDU7CisjZW5kaWYKKyNpZglkZWZpbmVkKFNVTk9TNCkKKwkgICAgZmh0eXBlID0gRkhUX1NVTk9TNDsKKyNlbmRpZgorI2lmCWRlZmluZWQoU1VOT1M1KQorCSAgICBmaHR5cGUgPSBGSFRfU1VOT1M1OworI2VuZGlmCisjaWYJZGVmaW5lZCh1bHRyaXgpCisJICAgIGZodHlwZSA9IEZIVF9VTFRSSVg7CisjZW5kaWYKKyNpZglkZWZpbmVkKF9fb3NmX18pCisJICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7CisjZW5kaWYKKyNpZglkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykgXAorICAgICB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorCSAgICBmaHR5cGUgPSBGSFRfQlNENDQ7CisjZW5kaWYKKwl9CisJLyoKKwkgKiBUaGlzIGlzIGJhc2ljYWxseSBhIGJpZyBkZWNpc2lvbiB0cmVlCisJICovCisJZWxzZSBpZiAoKGZocFswXSA9PSAwKSAmJiAoZmhwWzFdID09IDApKSB7CisJICAgIC8qIGJ5dGVzWzAsMV0gPT0gKDAsMCk7IHJ1bGVzIG91dCBVbHRyaXgsIElSSVg1LCBTVU5PUzUgKi8KKwkgICAgLyogcHJvYmFibHkgcnVsZXMgb3V0IEhQLVVYLCBBSVggdW5sZXNzIHRoZXkgYWxsb3cgbWFqb3I9MCAqLworCSAgICBpZiAoKGZocFsyXSA9PSAwKSAmJiAoZmhwWzNdID09IDApKSB7CisJCS8qIGJ5dGVzWzIsM10gPT0gKDAsMCk7IG11c3QgYmUgQXVzcGV4ICovCisJCS8qIFhYWCBvciBjb3VsZCBiZSBVbHRyaXgrTUFTU0JVUyAiaHAiIGRpc2s/ICovCisJCWZodHlwZSA9IEZIVF9BVVNQRVg7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCS8qCisJCSAqIGJ5dGVzWzIsM10gIT0gKDAsMCk7IHJ1bGVzIG91dCBBdXNwZXgsIGNvdWxkIGJlCisJCSAqIERFQ09TRiwgU1VOT1M0LCBvciBJUklYNAorCQkgKi8KKwkJaWYgKChmaHBbNF0gIT0gMCkgJiYgKGZocFs1XSA9PSAwKSAmJgorCQkJKGZocFs4XSA9PSAxMikgJiYgKGZocFs5XSA9PSAwKSkgeworCQkgICAgLyogc2VlbXMgdG8gYmUgREVDT1NGLCB3aXRoIG1pbm9yID09IDAgKi8KKwkJICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7CisJCX0KKwkJZWxzZSB7CisJCSAgICAvKiBjb3VsZCBiZSBTVU5PUzQgb3IgSVJJWDQgKi8KKwkJICAgIC8qIFhYWCB0aGUgdGVzdCBvZiBmaHBbNV0gPT0gOCBjb3VsZCBiZSB3cm9uZyAqLworCQkgICAgaWYgKChmaHBbNF0gPT0gMCkgJiYgKGZocFs1XSA9PSA4KSAmJiAoZmhwWzZdID09IDApICYmCisJCQkoZmhwWzddID09IDApKSB7CisJCQkvKiBsb29rcyBsaWtlIGEgbGVuZ3RoLCBub3QgYSBmaWxlIHN5c3RlbSB0eXBlY29kZSAqLworCQkJZmh0eXBlID0gRkhUX0lSSVg0OworCQkgICAgfQorCQkgICAgZWxzZSB7CisJCQkvKiBieSBlbGltaW5hdGlvbiAqLworCQkJZmh0eXBlID0gRkhUX1NVTk9TNDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCWVsc2UgeworCSAgICAvKgorCSAgICAgKiBieXRlc1swLDFdICE9ICgwLDApOyBydWxlcyBvdXQgQXVzcGV4LCBJUklYNCwgU1VOT1M0CisJICAgICAqIGNvdWxkIGJlIElSSVg1LCBERUNPU0YsIFVDWCwgVWx0cml4LCBTVU5PUzUKKwkgICAgICogY291bGQgYmUgQUlYLCBIUC1VWAorCSAgICAgKi8KKwkgICAgaWYgKChmaHBbMl0gPT0gMCkgJiYgKGZocFszXSA9PSAwKSkgeworCQkvKgorCQkgKiBieXRlc1syLDNdID09ICgwLDApOyBydWxlcyBvdXQgT1NGLCBwcm9iYWJseSBub3QgVUNYCisJCSAqICh1bmxlc3MgdGhlIGV4cG9ydGVkIGRldmljZSBuYW1lIGlzIGp1c3Qgb25lIGxldHRlciEpLAorCQkgKiBjb3VsZCBiZSBVbHRyaXgsIElSSVg1LCBBSVgsIG9yIFNVTk9TNQorCQkgKiBtaWdodCBiZSBIUC1VWCAoZGVwZW5kcyBvbiB0aGVpciB2YWx1ZXMgZm9yIG1pbm9yIGRldnMpCisJCSAqLworCQlpZiAoKGZocFs2XSA9PSAwKSAmJiAoZmhwWzddID09IDApKSB7CisJCSAgICBmaHR5cGUgPSBGSFRfQlNENDQ7CisJCX0KKwkJLypYWFggd2UgcHJvYmFibHkgb25seSBuZWVkIHRvIHRlc3Qgb2YgdGhlc2UgdHdvIGJ5dGVzICovCisJCWVsc2UgaWYgKChmaHBbMjFdID09IDApICYmIChmaHBbMjNdID09IDApKSB7CisJCSAgICBmaHR5cGUgPSBGSFRfVUxUUklYOworCQl9CisJCWVsc2UgeworCQkgICAgLyogQ291bGQgYmUgU1VOT1M1L0lSSVg1LCBtYXliZSBBSVggKi8KKwkJICAgIC8qIFhYWCBubyBvYnZpb3VzIGRpZmZlcmVuY2UgYmV0d2VlbiBTVU5PUzUgYW5kIElSSVg1ICovCisJCSAgICBpZiAoZmhwWzldID09IDEwKQorCQkJZmh0eXBlID0gRkhUX1NVTk9TNTsKKwkJICAgIC8qIFhYWCB3aGF0IGFib3V0IEFJWD8gKi8KKwkJfQorCSAgICB9CisJICAgIGVsc2UgeworCQkvKgorCQkgKiBieXRlc1syLDNdICE9ICgwLDApOyBydWxlcyBvdXQgVWx0cml4LCBjb3VsZCBiZQorCQkgKiBERUNPU0YsIFNVTk9TNSwgSVJJWDUsIEFJWCwgSFAtVVgsIG9yIFVDWAorCQkgKi8KKwkJaWYgKChmaHBbOF0gPT0gMTIpICYmIChmaHBbOV0gPT0gMCkpIHsKKwkJICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7CisJCX0KKwkJZWxzZSBpZiAoKGZocFs4XSA9PSAwKSAmJiAoZmhwWzldID09IDEwKSkgeworCQkgICAgLyogY291bGQgYmUgU1VOT1M1L0lSSVg1LCBBSVgsIEhQLVVYICovCisJCSAgICBpZiAoKGZocFs3XSA9PSAwKSAmJiAoZmhwWzZdID09IDApICYmCisJCQkoZmhwWzVdID09IDApICYmIChmaHBbNF0gPT0gMCkpIHsKKwkJCS8qIFhYWCBpcyB0aGlzIGFsd2F5cyB0cnVlIG9mIEhQLVVYPyAqLworCQkJZmh0eXBlID0gRkhUX0hQVVg5OworCQkgICAgfQorCQkgICAgZWxzZSBpZiAoZmhwWzddID09IDIpIHsKKwkJCS8qIFRoaXMgd291bGQgYmUgTU5UX05GUyBvbiBBSVgsIHdoaWNoIGlzIGltcG9zc2libGUgKi8KKwkJCWZodHlwZSA9IEZIVF9TVU5PUzU7CS8qIG9yIG1heWJlIElSSVg1ICovCisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggQ291bGQgYmUgU1VOT1M1L0lSSVg1IG9yIEFJWC4gIEkgZG9uJ3QKKwkJCSAqIFhYWCBzZWUgYW55IHdheSB0byBkaXNhbWJpZ3VhdGUgdGhlc2UsIHNvCisJCQkgKiBYWFggSSdtIGdvaW5nIHdpdGggdGhlIG1vcmUgbGlrZWx5IGd1ZXNzLgorCQkJICogWFhYIFNvcnJ5LCBCaWcgQmx1ZS4KKwkJCSAqLworCQkJZmh0eXBlID0gRkhUX1NVTk9TNTsJLyogb3IgbWF5YmUgSVJJWDUgKi8KKwkJICAgIH0KKwkgICAgICAgIH0KKwkJZWxzZSB7CisJCSAgICBpZiAoaXNfVUNYKGZocCkpIHsKKwkJCWZodHlwZSA9IEZIVF9WTVNVQ1g7CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCWZodHlwZSA9IEZIVF9VTktOT1dOOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKwkvKiBYWFggc3RpbGwgbmVlZHMgdG8gaGFuZGxlIFNVTk9TMyAqLworCisJc3dpdGNoIChmaHR5cGUpIHsKKwljYXNlIEZIVF9BVVNQRVg6CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFs3XTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzZdOworCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gMDsKKworCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzEyXSwgZmhwWzEzXSwgZmhwWzE0XSwgZmhwWzE1XSk7CisJICAgICppbm9wID0gdGVtcDsKKworCSAgICBpZiAob3NuYW1lcCkKKwkJKm9zbmFtZXAgPSAiQXVzcGV4IjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEZIVF9CU0Q0NDoKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gZmhwWzBdOworCSAgICBmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSBmaHBbMV07CisJICAgIGZzaWRwLT5mc2lkX2NvZGUgPSAwOworCisJICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTVdLCBmaHBbMTRdLCBmaHBbMTNdLCBmaHBbMTJdKTsKKwkgICAgKmlub3AgPSB0ZW1wOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJCU0QgNC40IjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEZIVF9ERUNPU0Y6CisJICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbN10sIGZocFs2XSwgZmhwWzVdLCBmaHBbNF0pOworCQkJLyogWFhYIGNvdWxkIGlnbm9yZSAzIGhpZ2gtb3JkZXIgYnl0ZXMgKi8KKworCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzNdLCBmaHBbMl0sIGZocFsxXSwgZmhwWzBdKTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcCAmIDB4RkZGRkY7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9ICh0ZW1wPj4yMCkgJiAweEZGRjsKKworCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzE1XSwgZmhwWzE0XSwgZmhwWzEzXSwgZmhwWzEyXSk7CisJICAgICppbm9wID0gdGVtcDsKKwkgICAgaWYgKG9zbmFtZXApCisJCSpvc25hbWVwID0gIk9TRiI7CisJICAgIGJyZWFrOworCisJY2FzZSBGSFRfSVJJWDQ6CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFszXTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzJdOworCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gMDsKKworCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzhdLCBmaHBbOV0sIGZocFsxMF0sIGZocFsxMV0pOworCSAgICAqaW5vcCA9IHRlbXA7CisKKwkgICAgaWYgKG9zbmFtZXApCisJCSpvc25hbWVwID0gIklSSVg0IjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEZIVF9JUklYNToKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gbWFrZV91aW50MTYoZmhwWzJdLCBmaHBbM10pOworCSAgICBmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSBtYWtlX3VpbnQxNihmaHBbMF0sIGZocFsxXSk7CisJICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOworCisJICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKKwkgICAgKmlub3AgPSB0ZW1wOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJJUklYNSI7CisJICAgIGJyZWFrOworCisjaWZkZWYgbm90ZGVmCisJY2FzZSBGSFRfU1VOT1MzOgorCSAgICAvKgorCSAgICAgKiBYWFggLSBub25lIG9mIHRoZSBoZXVyaXN0aWNzIGFib3ZlIHJldHVybiB0aGlzLgorCSAgICAgKiBBcmUgdGhlcmUgYW55IFN1bk9TIDMueCBzeXN0ZW1zIGFyb3VuZCB0byBjYXJlIGFib3V0PworCSAgICAgKi8KKwkgICAgaWYgKG9zbmFtZXApCisJCSpvc25hbWVwID0gIlNVTk9TMyI7CisJICAgIGJyZWFrOworI2VuZGlmCisKKwljYXNlIEZIVF9TVU5PUzQ6CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFszXTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzJdOworCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gbWFrZV91aW50MzIoZmhwWzRdLCBmaHBbNV0sIGZocFs2XSwgZmhwWzddKTsKKworCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzEyXSwgZmhwWzEzXSwgZmhwWzE0XSwgZmhwWzE1XSk7CisJICAgICppbm9wID0gdGVtcDsKKworCSAgICBpZiAob3NuYW1lcCkKKwkJKm9zbmFtZXAgPSAiU1VOT1M0IjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEZIVF9TVU5PUzU6CisJICAgIHRlbXAgPSBtYWtlX3VpbnQxNihmaHBbMF0sIGZocFsxXSk7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9ICh0ZW1wPj4yKSAmICAweDNGRkY7CisJICAgIHRlbXAgPSBtYWtlX3VpbnQyNChmaHBbMV0sIGZocFsyXSwgZmhwWzNdKTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcCAmIDB4M0ZGRkY7CisJICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOworCisJICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKKwkgICAgKmlub3AgPSB0ZW1wOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJTVU5PUzUiOworCSAgICBicmVhazsKKworCWNhc2UgRkhUX1VMVFJJWDoKKwkgICAgZnNpZHAtPmZzaWRfY29kZSA9IDA7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFswXTsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzFdOworCisJICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbN10sIGZocFs2XSwgZmhwWzVdLCBmaHBbNF0pOworCSAgICAqaW5vcCA9IHRlbXA7CisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJVbHRyaXgiOworCSAgICBicmVhazsKKworCWNhc2UgRkhUX1ZNU1VDWDoKKwkgICAgLyogTm8gbnVtZXJpYyBmaWxlIHN5c3RlbSBJRCwgc28gaGFzaCBvbiB0aGUgZGV2aWNlLW5hbWUgKi8KKwkgICAgaWYgKHNpemVvZigqZnNpZHApID49IDE0KSB7CisJCWlmIChzaXplb2YoKmZzaWRwKSA+IDE0KQorCQkgICAgbWVtc2V0KChjaGFyICopZnNpZHAsIDAsIHNpemVvZigqZnNpZHApKTsKKwkJLyoganVzdCB1c2UgdGhlIHdob2xlIHRoaW5nICovCisJCW1lbWNweSgoY2hhciAqKWZzaWRwLCAoY2hhciAqKWZoLCAxNCk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCXVfaW50MzJfdCB0ZW1wYVs0XTsJLyogYXQgbGVhc3QgMTYgYnl0ZXMsIG1heWJlIG1vcmUgKi8KKworCQltZW1zZXQoKGNoYXIgKil0ZW1wYSwgMCwgc2l6ZW9mKHRlbXBhKSk7CisJCW1lbWNweSgoY2hhciAqKXRlbXBhLCAoY2hhciAqKWZoLCAxNCk7IC8qIGVuc3VyZSBhbGlnbm1lbnQgKi8KKwkJZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcGFbMF0gKyAodGVtcGFbMV08PDEpOworCQlmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSB0ZW1wYVsyXSArICh0ZW1wYVszXTw8MSk7CisJCWZzaWRwLT5mc2lkX2NvZGUgPSAwOworCSAgICB9CisKKwkgICAgLyogVk1TIGZpbGUgSUQgaXM6IChSVk4sIEZpZEhpLCBGaWRMbykgKi8KKwkgICAgKmlub3AgPSBtYWtlX3VpbnQzMihmaHBbMjZdLCBmaHBbMjddLCBmaHBbMjNdLCBmaHBbMjJdKTsKKworCSAgICAvKiBDYWxsZXIgbXVzdCBzYXZlIChhbmQgbnVsbC10ZXJtaW5hdGU/KSB0aGlzIHZhbHVlICovCisJICAgIGlmIChmc25hbWVwKQorCQkqZnNuYW1lcCA9IChjaGFyICopJihmaHBbMV0pOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJWTVMiOworCSAgICBicmVhazsKKworCWNhc2UgRkhUX0FJWDMyOgorCSAgICBmc2lkcC0+RnNpZF9kZXYuTWlub3IgPSBtYWtlX3VpbnQxNihmaHBbMl0sIGZocFszXSk7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9IG1ha2VfdWludDE2KGZocFswXSwgZmhwWzFdKTsKKwkgICAgZnNpZHAtPmZzaWRfY29kZSA9IG1ha2VfdWludDMyKGZocFs0XSwgZmhwWzVdLCBmaHBbNl0sIGZocFs3XSk7CisKKwkgICAgdGVtcCA9IG1ha2VfdWludDMyKGZocFsxMl0sIGZocFsxM10sIGZocFsxNF0sIGZocFsxNV0pOworCSAgICAqaW5vcCA9IHRlbXA7CisKKwkgICAgaWYgKG9zbmFtZXApCisJCSpvc25hbWVwID0gIkFJWDMyIjsKKwkgICAgYnJlYWs7CisKKwljYXNlIEZIVF9IUFVYOToKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzBdOworCSAgICB0ZW1wID0gbWFrZV91aW50MjQoZmhwWzFdLCBmaHBbMl0sIGZocFszXSk7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IHRlbXA7CisJICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOworCisJICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKKwkgICAgKmlub3AgPSB0ZW1wOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJIUFVYOSI7CisJICAgIGJyZWFrOworCisJY2FzZSBGSFRfVU5LTk9XTjoKKyNpZmRlZiBERUJVRworCSAgICAvKiBYWFggZGVidWdnaW5nICovCisJICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiV4LiIsIGZocFtpXSk7CisJICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyNlbmRpZgorCSAgICAvKiBTYXZlIHRoZSBhY3R1YWwgaGFuZGxlLCBzbyBpdCBjYW4gYmUgZGlzcGxheSB3aXRoIC11ICovCisJICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCSAgICAJKHZvaWQpc25wcmludGYoJihmc2lkcC0+T3BhcXVlX0hhbmRsZVtpKjJdKSwgMywgIiUuMlgiLCBmaHBbaV0pOworCisJICAgIC8qIFhYWCBmb3Igbm93LCBnaXZlICJib2d1cyIgdmFsdWVzIHRvIGFpZCBkZWJ1Z2dpbmcgKi8KKwkgICAgZnNpZHAtPmZzaWRfY29kZSA9IDA7CisJICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IDI1NzsKKwkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gMjU3OworCSAgICAqaW5vcCA9IDE7CisKKwkgICAgLyogZGlzcGxheSB3aWxsIHNob3cgdGhpcyBzdHJpbmcgaW5zdGVhZCBvZiAoMjU3LDI1NykgKi8KKwkgICAgaWYgKGZzbmFtZXApCisJCSpmc25hbWVwID0gIlVua25vd24iOworCisJICAgIGlmIChvc25hbWVwKQorCQkqb3NuYW1lcCA9ICJVbmtub3duIjsKKwkgICAgYnJlYWs7CisKKwl9Cit9CisKKy8qCisgKiBJcyB0aGlzIGEgVk1TIFVDWCBmaWxlIGhhbmRsZT8KKyAqCUNoZWNrIGZvcjoKKyAqCSgxKSBsZWFkaW5nIGNvZGUgYnl0ZQlbWFhYIG5vdCB5ZXRdCisgKgkoMikgZm9sbG93ZWQgYnkgc3RyaW5nIG9mIHByaW50aW5nIGNoYXJzICYgc3BhY2VzCisgKgkoMykgZm9sbG93ZWQgYnkgc3RyaW5nIG9mIG51bGxzCisgKi8KK3N0YXRpYyBpbnQKK2lzX1VDWChmaHApCitjb25zdCB1bnNpZ25lZCBjaGFyICpmaHA7Cit7CisJcmVnaXN0ZXIgaW50IGk7CisJaW50IHNlZW5fbnVsbCA9IDA7CisKKwlmb3IgKGkgPSAxOyBpIDwgMTQ7IGkrKykgeworCSAgICBpZiAoaXNwcmludChmaHBbaV0pKSB7CisJCWlmIChzZWVuX251bGwpCisJCSAgIHJldHVybigwKTsKKwkJZWxzZQorCQkgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChmaHBbaV0gPT0gMCkgeworCQlzZWVuX251bGwgPSAxOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBlbHNlCisJCXJldHVybigwKTsKKwl9CisKKwlyZXR1cm4oMSk7Cit9CmRpZmYgLS1naXQgYS9wY2FwLW1pc3NpbmcuaCBiL3BjYXAtbWlzc2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMmZjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9wY2FwLW1pc3NpbmcuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LTIwMDIKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3BjYXAtbWlzc2luZy5oLHYgMS4yLjIuMSAyMDA1LzA2LzAzIDIyOjEwOjE2IGd1eSBFeHAgJCAoTEJMKQorICovCisKKyNpZm5kZWYgdGNwZHVtcF9wY2FwX21pc3NpbmdfaAorI2RlZmluZSB0Y3BkdW1wX3BjYXBfbWlzc2luZ19oCisKKy8qCisgKiBEZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zIHRoYXQgbWlnaHQgYmUgbWlzc2luZyBmcm9tIGxpYnBjYXAuCisgKi8KKworI2lmbmRlZiBIQVZFX1BDQVBfTElTVF9EQVRBTElOS1MKK2V4dGVybiBpbnQgcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKiwgaW50ICoqKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTAorLyoKKyAqIFdlIGFzc3VtZSBubyBwbGF0Zm9ybSBoYXMgb25lIGJ1dCBub3QgdGhlIG90aGVyLgorICovCitleHRlcm4gaW50IHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqKTsKK2V4dGVybiBjb25zdCBjaGFyICpwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKGludCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1BDQVBfREFUQUxJTktfVkFMX1RPX0RFU0NSSVBUSU9OCitleHRlcm4gY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUENBUF9EVU1QX0ZURUxMCitleHRlcm4gbG9uZyBwY2FwX2R1bXBfZnRlbGwocGNhcF9kdW1wZXJfdCAqKTsKKyNlbmRpZgorCisjZW5kaWYKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL3BjYXBfZHVtcF9mdGVsbC5jIGIvcGNhcF9kdW1wX2Z0ZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4Y2QyOQotLS0gL2Rldi9udWxsCisrKyBiL3BjYXBfZHVtcF9mdGVsbC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wY2FwX2R1bXBfZnRlbGwuYyx2IDEuMS4yLjEgMjAwNS8wNi8wMyAyMjoxMDoxNyBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBjYXAuaD4KKworI2luY2x1ZGUgInBjYXAtbWlzc2luZy5oIgorCitsb25nCitwY2FwX2R1bXBfZnRlbGwocGNhcF9kdW1wZXJfdCAqcCkKK3sKKwlyZXR1cm4gKGZ0ZWxsKChGSUxFICopcCkpOworfQpkaWZmIC0tZ2l0IGEvcG1hcF9wcm90LmggYi9wbWFwX3Byb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNlODQxCi0tLSAvZGV2L251bGwKKysrIGIvcG1hcF9wcm90LmgKQEAgLTAsMCArMSw4OSBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wbWFwX3Byb3QuaCx2IDEuMS4yLjIgMjAwNS8wNC8yNyAyMTo0NDowNiBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqCisgKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCisgKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KKyAqCisgKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKKyAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKKyAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KKyAqCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKgorICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQorICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCisgKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICoKKyAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIDI1NTAgR2FyY2lhIEF2ZW51ZQorICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKKyAqCisgKglmcm9tOiBAKCMpcG1hcF9wcm90LmggMS4xNCA4OC8wMi8wOCBTTUkKKyAqCWZyb206IEAoIylwbWFwX3Byb3QuaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQworICogJEZyZWVCU0Q6IHNyYy9pbmNsdWRlL3JwYy9wbWFwX3Byb3QuaCx2IDEuOS4yLjEgMTk5OS8wOC8yOSAxNDozOTowNSBwZXRlciBFeHAgJAorICovCisKKy8qCisgKiBwbWFwX3Byb3QuaAorICogUHJvdG9jb2wgZm9yIHRoZSBsb2NhbCBiaW5kZXIgc2VydmljZSwgb3IgcG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2w6CisgKgorICogUE1BUFBST0NfTlVMTCgpIHJldHVybnMgKCkKKyAqIAl0YWtlcyBub3RoaW5nLCByZXR1cm5zIG5vdGhpbmcKKyAqCisgKiBQTUFQUFJPQ19TRVQoc3RydWN0IHBtYXApIHJldHVybnMgKGJvb2xfdCkKKyAqIAlUUlVFIGlzIHN1Y2Nlc3MsIEZBTFNFIGlzIGZhaWx1cmUuICBSZWdpc3RlcnMgdGhlIHR1cGxlCisgKglbcHJvZywgdmVycywgcHJvdCwgcG9ydF0uCisgKgorICogUE1BUFBST0NfVU5TRVQoc3RydWN0IHBtYXApIHJldHVybnMgKGJvb2xfdCkKKyAqCVRSVUUgaXMgc3VjY2VzcywgRkFMU0UgaXMgZmFpbHVyZS4gIFVuLXJlZ2lzdGVycyBwYWlyCisgKglbcHJvZywgdmVyc10uICBwcm90IGFuZCBwb3J0IGFyZSBpZ25vcmVkLgorICoKKyAqIFBNQVBQUk9DX0dFVFBPUlQoc3RydWN0IHBtYXApIHJldHVybnMgKGxvbmcgdW5zaWduZWQpLgorICoJMCBpcyBmYWlsdXJlLiAgT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvcnQgbnVtYmVyIHdoZXJlIHRoZSBwYWlyCisgKglbcHJvZywgdmVyc10gaXMgcmVnaXN0ZXJlZC4gIEl0IG1heSBsaWUhCisgKgorICogUE1BUFBST0NfRFVNUCgpIFJFVFVSTlMgKHN0cnVjdCBwbWFwbGlzdCAqKQorICoKKyAqIFBNQVBQUk9DX0NBTExJVCh1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBzdHJpbmc8PikKKyAqIAlSRVRVUk5TIChwb3J0LCBzdHJpbmc8Pik7CisgKiB1c2FnZTogZW5jYXBzdWxhdGVkcmVzdWx0cyA9IFBNQVBQUk9DX0NBTExJVChwcm9nLCB2ZXJzLCBwcm9jLCBlbmNhcHN1bGF0ZWRhcmdzKTsKKyAqIAlDYWxscyB0aGUgcHJvY2VkdXJlIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgSWYgaXQgaXMgbm90IHJlZ2lzdGVyZWQsCisgKgl0aGlzIHByb2NlZHVyZSBpcyBxdWl0ZTsgaWUgaXQgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluZm9ybWF0aW9uISEhCisgKglUaGlzIHByb2NlZHVyZSBvbmx5IGlzIHN1cHBvcnRlZCBvbiBycGMvdWRwIGFuZCBjYWxscyB2aWEKKyAqCXJwYy91ZHAuICBUaGlzIHJvdXRpbmUgb25seSBwYXNzZXMgbnVsbCBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLgorICoJVGhpcyBmaWxlIGhhcyBubyBpbnRlcmZhY2UgdG8geGRyIHJvdXRpbmVzIGZvciBQTUFQUFJPQ19DQUxMSVQuCisgKgorICogVGhlIHNlcnZpY2Ugc3VwcG9ydHMgcmVtb3RlIHByb2NlZHVyZSBjYWxscyBvbiB1ZHAvaXAgb3IgdGNwL2lwIHNvY2tldCAxMTEuCisgKi8KKworI2RlZmluZSBTVU5SUENfUE1BUFBPUlQJCSgodV9pbnQxNl90KTExMSkKKyNkZWZpbmUgU1VOUlBDX1BNQVBQUk9HCQkoKHVfaW50MzJfdCkxMDAwMDApCisjZGVmaW5lIFNVTlJQQ19QTUFQVkVSUwkJKCh1X2ludDMyX3QpMikKKyNkZWZpbmUgU1VOUlBDX1BNQVBWRVJTX1BST1RPCSgodV9pbnQzMl90KTIpCisjZGVmaW5lIFNVTlJQQ19QTUFQVkVSU19PUklHCSgodV9pbnQzMl90KTEpCisjZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19OVUxMCSgodV9pbnQzMl90KTApCisjZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19TRVQJKCh1X2ludDMyX3QpMSkKKyNkZWZpbmUgU1VOUlBDX1BNQVBQUk9DX1VOU0VUCSgodV9pbnQzMl90KTIpCisjZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19HRVRQT1JUCSgodV9pbnQzMl90KTMpCisjZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19EVU1QCSgodV9pbnQzMl90KTQpCisjZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19DQUxMSVQJKCh1X2ludDMyX3QpNSkKKworc3RydWN0IHN1bnJwY19wbWFwIHsKKwl1X2ludDMyX3QgcG1fcHJvZzsKKwl1X2ludDMyX3QgcG1fdmVyczsKKwl1X2ludDMyX3QgcG1fcHJvdDsKKwl1X2ludDMyX3QgcG1fcG9ydDsKK307CmRpZmYgLS1naXQgYS9wcHAuaCBiL3BwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNjIxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9wcHAuaApAQCAtMCwwICsxLDcxIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3BwcC5oLHYgMS4xNiAyMDA0LzEwLzIwIDE2OjE0OjE2IGhhbm5lcyBFeHAgJCAoTEJMKSAqLworLyoKKyAqIFBvaW50IHRvIFBvaW50IFByb3RvY29sIChQUFApIFJGQzEzMzEKKyAqCisgKiBDb3B5cmlnaHQgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0CisgKiBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKKyAqIHRoZSBuYW1lIG9mIENhcm5lZ2llIE1lbGxvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4gaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZworICogYW5kIGRpc3RyaWJ1dGlvbiBpcyBieSBwZXJtaXNzaW9uIG9mIENhcm5lZ2llIE1lbGxvbiBhbmQgU3RhbmZvcmQKKyAqIFVuaXZlcnNpdHkuICBDYXJuZWdpZSBNZWxsb24gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworI2RlZmluZSBQUFBfSERSTEVOCTQJLyogbGVuZ3RoIG9mIFBQUCBoZWFkZXIgKi8KKworI2RlZmluZSBQUFBfQUREUkVTUwkweGZmCS8qIFRoZSBhZGRyZXNzIGJ5dGUgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX0NPTlRST0wJMHgwMwkvKiBUaGUgY29udHJvbCBieXRlIHZhbHVlICovCisKKyNkZWZpbmUgUFBQX1dJVEhESVJFQ1RJT05fSU4gIDB4MDAgLyogbm9uLXN0YW5kYXJkIGZvciBETFRfUFBQX1dJVEhESVJFQ1RJT04gKi8KKyNkZWZpbmUgUFBQX1dJVEhESVJFQ1RJT05fT1VUIDB4MDEgLyogbm9uLXN0YW5kYXJkIGZvciBETFRfUFBQX1dJVEhESVJFQ1RJT04gKi8KKworLyogUHJvdG9jb2wgbnVtYmVycyAqLworI2RlZmluZSBQUFBfSVAJCTB4MDAyMQkvKiBSYXcgSVAgKi8KKyNkZWZpbmUgUFBQX09TSQkJMHgwMDIzCS8qIE9TSSBOZXR3b3JrIExheWVyICovCisjZGVmaW5lIFBQUF9OUwkJMHgwMDI1CS8qIFhlcm94IE5TIElEUCAqLworI2RlZmluZSBQUFBfREVDTkVUCTB4MDAyNwkvKiBERUNuZXQgUGhhc2UgSVYgKi8KKyNkZWZpbmUgUFBQX0FQUExFCTB4MDAyOQkvKiBBcHBsZXRhbGsgKi8KKyNkZWZpbmUgUFBQX0lQWAkJMHgwMDJiCS8qIE5vdmVsbCBJUFggKi8KKyNkZWZpbmUgUFBQX1ZKQwkJMHgwMDJkCS8qIFZhbiBKYWNvYnNvbiBDb21wcmVzc2VkIFRDUC9JUCAqLworI2RlZmluZSBQUFBfVkpOQwkweDAwMmYJLyogVmFuIEphY29ic29uIFVuY29tcHJlc3NlZCBUQ1AvSVAgKi8KKyNkZWZpbmUgUFBQX0JSUERVCTB4MDAzMQkvKiBCcmlkZ2luZyBQRFUgKi8KKyNkZWZpbmUgUFBQX1NUSUkJMHgwMDMzCS8qIFN0cmVhbSBQcm90b2NvbCAoU1QtSUkpICovCisjZGVmaW5lIFBQUF9WSU5FUwkweDAwMzUJLyogQmFueWFuIFZpbmVzICovCisjZGVmaW5lIFBQUF9NTCAgICAgICAgICAweDAwM2QgIC8qIE11bHRpLUxpbmsgUFBQICovCisjZGVmaW5lIFBQUF9JUFY2CTB4MDA1NwkvKiBJUHY2ICovCisjZGVmaW5lCVBQUF9DT01QCTB4MDBmZAkvKiBDb21wcmVzc2VkIERhdGFncmFtICovCisKKyNkZWZpbmUgUFBQX0hFTExPCTB4MDIwMQkvKiA4MDIuMWQgSGVsbG8gUGFja2V0cyAqLworI2RlZmluZSBQUFBfTFVYQ09NCTB4MDIzMQkvKiBMdXhjb20gKi8KKyNkZWZpbmUgUFBQX1NOUwkJMHgwMjMzCS8qIFNpZ21hIE5ldHdvcmsgU3lzdGVtcyAqLworI2RlZmluZSBQUFBfTVBMU19VQ0FTVCAgMHgwMjgxICAvKiByZmMgMzAzMiAqLworI2RlZmluZSBQUFBfTVBMU19NQ0FTVCAgMHgwMjgzICAvKiByZmMgMzAyMiAqLworCisjZGVmaW5lIFBQUF9JUENQCTB4ODAyMQkvKiBJUCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9PU0lDUAkweDgwMjMJLyogT1NJIE5ldHdvcmsgTGF5ZXIgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfTlNDUAkweDgwMjUJLyogWGVyb3ggTlMgSURQIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0RFQ05FVENQCTB4ODAyNwkvKiBERUNuZXQgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfQVBQTEVDUAkweDgwMjkJLyogQXBwbGV0YWxrIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0lQWENQCTB4ODAyYgkvKiBOb3ZlbGwgSVBYIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1NUSUlDUAkweDgwMzMJLyogU3RyZWFuIFByb3RvY29sIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1ZJTkVTQ1AJMHg4MDM1CS8qIEJhbnlhbiBWaW5lcyBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUFY2Q1AJMHg4MDU3CS8qIElQdjYgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfQ0NQCQkweDgwZmQJLyogQ29tcHJlc3MgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfTVBMU0NQICAgICAgMHg4MjgxICAvKiByZmMgMzAyMiAqLworCisjZGVmaW5lIFBQUF9MQ1AJCTB4YzAyMQkvKiBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX1BBUAkJMHhjMDIzCS8qIFBhc3N3b3JkIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9MUU0JCTB4YzAyNQkvKiBMaW5rIFF1YWxpdHkgTW9uaXRvcmluZyAqLworI2RlZmluZSBQUFBfU1BBUCAgICAgICAgMHhjMDI3CisjZGVmaW5lIFBQUF9DSEFQCTB4YzIyMwkvKiBDaGFsbGVuZ2UgSGFuZHNoYWtlIEF1dGhlbnRpY2F0aW9uIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9CQUNQCTB4YzAyYgkvKiBCYW5kd2lkdGggQWxsb2NhdGlvbiBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9CQVAJCTB4YzAyZAkvKiBCQVAgKi8KKyNkZWZpbmUgUFBQX01QQ1AJCTB4YzAzZAkvKiBNdWx0aS1MaW5rICovCisjZGVmaW5lIFBQUF9TUEFQX09MRCAgICAweGMxMjMKKyNkZWZpbmUgUFBQX0VBUCAgICAgICAgIDB4YzIyNworCitleHRlcm4gc3RydWN0IHRvayBwcHB0eXBlMnN0cltdOwpkaWZmIC0tZ2l0IGEvcHJpbnQtODAyXzExLmMgYi9wcmludC04MDJfMTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUzMTZkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtODAyXzExLmMKQEAgLTAsMCArMSwxMjg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxCisgKglGb3J0cmVzcyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgIENoYXJsaWUgTGVuYWhhbiAoY2xlbmFoYW5AZm9ydHJlc3N0ZWNoLmNvbSkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtODAyXzExLmMsdiAxLjMxLjIuMTUgMjAwNy8wNy8yMiAyMzoxNDoxNCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKworI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImNwYWNrLmgiCisKKyNpbmNsdWRlICJpZWVlODAyXzExLmgiCisjaW5jbHVkZSAiaWVlZTgwMl8xMV9yYWRpby5oIgorCisjZGVmaW5lIFBSSU5UX1NTSUQocCkgXAorCXN3aXRjaCAocC5zc2lkX3N0YXR1cykgeyBcCisJY2FzZSBUUlVOQ0FURUQ6IFwKKwkJcmV0dXJuIDA7IFwKKwljYXNlIFBSRVNFTlQ6IFwKKwkJcHJpbnRmKCIgKCIpOyBcCisJCWZuX3ByaW50KHAuc3NpZC5zc2lkLCBOVUxMKTsgXAorCQlwcmludGYoIikiKTsgXAorCQlicmVhazsgXAorCWNhc2UgTk9UX1BSRVNFTlQ6IFwKKwkJYnJlYWs7IFwKKwl9CisKKyNkZWZpbmUgUFJJTlRfUkFURShfc2VwLCBfciwgX3N1ZikgXAorCXByaW50ZigiJXMlMi4xZiVzIiwgX3NlcCwgKC41ICogKChfcikgJiAweDdmKSksIF9zdWYpCisjZGVmaW5lIFBSSU5UX1JBVEVTKHApIFwKKwlzd2l0Y2ggKHAucmF0ZXNfc3RhdHVzKSB7IFwKKwljYXNlIFRSVU5DQVRFRDogXAorCQlyZXR1cm4gMDsgXAorCWNhc2UgUFJFU0VOVDogXAorCQlkbyB7IFwKKwkJCWludCB6OyBcCisJCQljb25zdCBjaGFyICpzZXAgPSAiIFsiOyBcCisJCQlmb3IgKHogPSAwOyB6IDwgcC5yYXRlcy5sZW5ndGggOyB6KyspIHsgXAorCQkJCVBSSU5UX1JBVEUoc2VwLCBwLnJhdGVzLnJhdGVbel0sIFwKKwkJCQkJKHAucmF0ZXMucmF0ZVt6XSAmIDB4ODAgPyAiKiIgOiAiIikpOyBcCisJCQkJc2VwID0gIiAiOyBcCisJCQl9IFwKKwkJCWlmIChwLnJhdGVzLmxlbmd0aCAhPSAwKSBcCisJCQkJcHJpbnRmKCIgTWJpdF0iKTsgXAorCQl9IHdoaWxlICgwKTsgXAorCQlicmVhazsgXAorCWNhc2UgTk9UX1BSRVNFTlQ6IFwKKwkJYnJlYWs7IFwKKwl9CisKKyNkZWZpbmUgUFJJTlRfRFNfQ0hBTk5FTChwKSBcCisJc3dpdGNoIChwLmRzX3N0YXR1cykgeyBcCisJY2FzZSBUUlVOQ0FURUQ6IFwKKwkJcmV0dXJuIDA7IFwKKwljYXNlIFBSRVNFTlQ6IFwKKwkJcHJpbnRmKCIgQ0g6ICV1IiwgcC5kcy5jaGFubmVsKTsgXAorCQlicmVhazsgXAorCWNhc2UgTk9UX1BSRVNFTlQ6IFwKKwkJYnJlYWs7IFwKKwl9IFwKKwlwcmludGYoIiVzIiwgXAorCSAgICBDQVBBQklMSVRZX1BSSVZBQ1kocC5jYXBhYmlsaXR5X2luZm8pID8gIiwgUFJJVkFDWSIgOiAiIiApOworCitzdGF0aWMgY29uc3QgY2hhciAqYXV0aF9hbGdfdGV4dFtdPXsiT3BlbiBTeXN0ZW0iLCJTaGFyZWQgS2V5IiwiRUFQIn07CisjZGVmaW5lIE5VTV9BVVRIX0FMR1MJKHNpemVvZiBhdXRoX2FsZ190ZXh0IC8gc2l6ZW9mIGF1dGhfYWxnX3RleHRbMF0pCisKK3N0YXRpYyBjb25zdCBjaGFyICpzdGF0dXNfdGV4dFtdID0geworCSJTdWNjZXNmdWwiLCAgLyogIDAgICovCisJIlVuc3BlY2lmaWVkIGZhaWx1cmUiLCAgLyogIDEgICovCisJIlJlc2VydmVkIiwJICAvKiAgMiAgKi8KKwkiUmVzZXJ2ZWQiLAkgIC8qICAzICAqLworCSJSZXNlcnZlZCIsCSAgLyogIDQgICovCisJIlJlc2VydmVkIiwJICAvKiAgNSAgKi8KKwkiUmVzZXJ2ZWQiLAkgIC8qICA2ICAqLworCSJSZXNlcnZlZCIsCSAgLyogIDcgICovCisJIlJlc2VydmVkIiwJICAvKiAgOCAgKi8KKwkiUmVzZXJ2ZWQiLAkgIC8qICA5ICAqLworCSJDYW5ub3QgU3VwcG9ydCBhbGwgcmVxdWVzdGVkIGNhcGFiaWxpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBJbmZvcm1hdGlvbiBmaWVsZCIsCSAgLyogIDEwICAqLworCSJSZWFzc29jaWF0aW9uIGRlbmllZCBkdWUgdG8gaW5hYmlsaXR5IHRvIGNvbmZpcm0gdGhhdCBhc3NvY2lhdGlvbiBleGlzdHMiLAkgIC8qICAxMSAgKi8KKwkiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZWFzb24gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhlIHN0YW5kYXJkIiwJICAvKiAgMTIgICovCisJIlJlc3BvbmRpbmcgc3RhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgYXV0aGVudGljYXRpb24gYWxnb3JpdGhtICIsCSAgLyogIDEzICAqLworCSJSZWNlaXZlZCBhbiBBdXRoZW50aWNhdGlvbiBmcmFtZSB3aXRoIGF1dGhlbnRpY2F0aW9uIHRyYW5zYWN0aW9uICIgXAorCQkic2VxdWVuY2UgbnVtYmVyIG91dCBvZiBleHBlY3RlZCBzZXF1ZW5jZSIsCSAgLyogIDE0ICAqLworCSJBdXRoZW50aWNhdGlvbiByZWplY3RlZCBiZWNhdXNlIG9mIGNoYWxsZW5nZSBmYWlsdXJlIiwJICAvKiAgMTUgKi8KKwkiQXV0aGVudGljYXRpb24gcmVqZWN0ZWQgZHVlIHRvIHRpbWVvdXQgd2FpdGluZyBmb3IgbmV4dCBmcmFtZSBpbiBzZXF1ZW5jZSIsCSAgLyogIDE2ICovCisJIkFzc29jaWF0aW9uIGRlbmllZCBiZWNhdXNlIEFQIGlzIHVuYWJsZSB0byBoYW5kbGUgYWRkaXRpb25hbCBhc3NvY2lhdGVkIHN0YXRpb25zIiwJICAvKiAgMTcgKi8KKwkiQXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byByZXF1ZXN0aW5nIHN0YXRpb24gbm90IHN1cHBvcnRpbmcgYWxsIG9mIHRoZSAiIFwKKwkJImRhdGEgcmF0ZXMgaW4gQlNTQmFzaWNSYXRlU2V0IHBhcmFtZXRlciIsCSAgLyogIDE4ICovCit9OworI2RlZmluZSBOVU1fU1RBVFVTRVMJKHNpemVvZiBzdGF0dXNfdGV4dCAvIHNpemVvZiBzdGF0dXNfdGV4dFswXSkKKworc3RhdGljIGNvbnN0IGNoYXIgKnJlYXNvbl90ZXh0W10gPSB7CisJIlJlc2VydmVkIiwgLyogMCAqLworCSJVbnNwZWNpZmllZCByZWFzb24iLCAvKiAxICovCisJIlByZXZpb3VzIGF1dGhlbnRpY2F0aW9uIG5vIGxvbmdlciB2YWxpZCIsICAvKiAyICovCisJIkRlYXV0aGVudGljYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nIChvciBoYXMgbGVmdCkgSUJTUyBvciBFU1MiLCAvKiAzICovCisJIkRpc2Fzc29jaWF0ZWQgZHVlIHRvIGluYWN0aXZpdHkiLCAvKiA0ICovCisJIkRpc2Fzc29jaWF0ZWQgYmVjYXVzZSBBUCBpcyB1bmFibGUgdG8gaGFuZGxlIGFsbCBjdXJyZW50bHkgYXNzb2NpYXRlZCBzdGF0aW9ucyIsIC8qIDUgKi8KKwkiQ2xhc3MgMiBmcmFtZSByZWNlaXZlZCBmcm9tIG5vbmF1dGhlbnRpY2F0ZWQgc3RhdGlvbiIsIC8qIDYgKi8KKwkiQ2xhc3MgMyBmcmFtZSByZWNlaXZlZCBmcm9tIG5vbmFzc29jaWF0ZWQgc3RhdGlvbiIsIC8qIDcgKi8KKwkiRGlzYXNzb2NpYXRlZCBiZWNhdXNlIHNlbmRpbmcgc3RhdGlvbiBpcyBsZWF2aW5nIChvciBoYXMgbGVmdCkgQlNTIiwgLyogOCAqLworCSJTdGF0aW9uIHJlcXVlc3RpbmcgKHJlKWFzc29jaWF0aW9uIGlzIG5vdCBhdXRoZW50aWNhdGVkIHdpdGggcmVzcG9uZGluZyBzdGF0aW9uIiwgLyogOSAqLworfTsKKyNkZWZpbmUgTlVNX1JFQVNPTlMJKHNpemVvZiByZWFzb25fdGV4dCAvIHNpemVvZiByZWFzb25fdGV4dFswXSkKKworc3RhdGljIGludAord2VwX3ByaW50KGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludDMyX3QgaXY7CisKKwlpZiAoIVRURVNUMigqcCwgSUVFRTgwMl8xMV9JVl9MRU4gKyBJRUVFODAyXzExX0tJRF9MRU4pKQorCQlyZXR1cm4gMDsKKwlpdiA9IEVYVFJBQ1RfTEVfMzJCSVRTKHApOworCisJcHJpbnRmKCJEYXRhIElWOiUzeCBQYWQgJXggS2V5SUQgJXgiLCBJVl9JVihpdiksIElWX1BBRChpdiksCisJICAgIElWX0tFWUlEKGl2KSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlX2VsZW1lbnRzKHN0cnVjdCBtZ210X2JvZHlfdCAqcGJvZHksIGNvbnN0IHVfY2hhciAqcCwgaW50IG9mZnNldCkKK3sKKwkvKgorCSAqIFdlIGhhdmVuJ3Qgc2VlbiBhbnkgZWxlbWVudHMgeWV0LgorCSAqLworCXBib2R5LT5jaGFsbGVuZ2Vfc3RhdHVzID0gTk9UX1BSRVNFTlQ7CisJcGJvZHktPnNzaWRfc3RhdHVzID0gTk9UX1BSRVNFTlQ7CisJcGJvZHktPnJhdGVzX3N0YXR1cyA9IE5PVF9QUkVTRU5UOworCXBib2R5LT5kc19zdGF0dXMgPSBOT1RfUFJFU0VOVDsKKwlwYm9keS0+Y2Zfc3RhdHVzID0gTk9UX1BSRVNFTlQ7CisJcGJvZHktPnRpbV9zdGF0dXMgPSBOT1RfUFJFU0VOVDsKKworCWZvciAoOzspIHsKKwkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgMSkpCisJCQlyZXR1cm47CisJCXN3aXRjaCAoKihwICsgb2Zmc2V0KSkgeworCQljYXNlIEVfU1NJRDoKKwkJCS8qIFByZXNlbnQsIHBvc3NpYmx5IHRydW5jYXRlZCAqLworCQkJcGJvZHktPnNzaWRfc3RhdHVzID0gVFJVTkNBVEVEOworCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgMikpCisJCQkJcmV0dXJuOworCQkJbWVtY3B5KCZwYm9keS0+c3NpZCwgcCArIG9mZnNldCwgMik7CisJCQlvZmZzZXQgKz0gMjsKKwkJCWlmIChwYm9keS0+c3NpZC5sZW5ndGggIT0gMCkgeworCQkJCWlmIChwYm9keS0+c3NpZC5sZW5ndGggPgorCQkJCSAgICBzaXplb2YocGJvZHktPnNzaWQuc3NpZCkgLSAxKQorCQkJCQlyZXR1cm47CisJCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgcGJvZHktPnNzaWQubGVuZ3RoKSkKKwkJCQkJcmV0dXJuOworCQkJCW1lbWNweSgmcGJvZHktPnNzaWQuc3NpZCwgcCArIG9mZnNldCwKKwkJCQkgICAgcGJvZHktPnNzaWQubGVuZ3RoKTsKKwkJCQlvZmZzZXQgKz0gcGJvZHktPnNzaWQubGVuZ3RoOworCQkJfQorCQkJcGJvZHktPnNzaWQuc3NpZFtwYm9keS0+c3NpZC5sZW5ndGhdID0gJ1wwJzsKKwkJCS8qIFByZXNlbnQgYW5kIG5vdCB0cnVuY2F0ZWQgKi8KKwkJCXBib2R5LT5zc2lkX3N0YXR1cyA9IFBSRVNFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBFX0NIQUxMRU5HRToKKwkJCS8qIFByZXNlbnQsIHBvc3NpYmx5IHRydW5jYXRlZCAqLworCQkJcGJvZHktPmNoYWxsZW5nZV9zdGF0dXMgPSBUUlVOQ0FURUQ7CisJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAyKSkKKwkJCQlyZXR1cm47CisJCQltZW1jcHkoJnBib2R5LT5jaGFsbGVuZ2UsIHAgKyBvZmZzZXQsIDIpOworCQkJb2Zmc2V0ICs9IDI7CisJCQlpZiAocGJvZHktPmNoYWxsZW5nZS5sZW5ndGggIT0gMCkgeworCQkJCWlmIChwYm9keS0+Y2hhbGxlbmdlLmxlbmd0aCA+CisJCQkJICAgIHNpemVvZihwYm9keS0+Y2hhbGxlbmdlLnRleHQpIC0gMSkKKwkJCQkJcmV0dXJuOworCQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIHBib2R5LT5jaGFsbGVuZ2UubGVuZ3RoKSkKKwkJCQkJcmV0dXJuOworCQkJCW1lbWNweSgmcGJvZHktPmNoYWxsZW5nZS50ZXh0LCBwICsgb2Zmc2V0LAorCQkJCSAgICBwYm9keS0+Y2hhbGxlbmdlLmxlbmd0aCk7CisJCQkJb2Zmc2V0ICs9IHBib2R5LT5jaGFsbGVuZ2UubGVuZ3RoOworCQkJfQorCQkJcGJvZHktPmNoYWxsZW5nZS50ZXh0W3Bib2R5LT5jaGFsbGVuZ2UubGVuZ3RoXSA9ICdcMCc7CisJCQkvKiBQcmVzZW50IGFuZCBub3QgdHJ1bmNhdGVkICovCisJCQlwYm9keS0+Y2hhbGxlbmdlX3N0YXR1cyA9IFBSRVNFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBFX1JBVEVTOgorCQkJLyogUHJlc2VudCwgcG9zc2libHkgdHJ1bmNhdGVkICovCisJCQlwYm9keS0+cmF0ZXNfc3RhdHVzID0gVFJVTkNBVEVEOworCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgMikpCisJCQkJcmV0dXJuOworCQkJbWVtY3B5KCYocGJvZHktPnJhdGVzKSwgcCArIG9mZnNldCwgMik7CisJCQlvZmZzZXQgKz0gMjsKKwkJCWlmIChwYm9keS0+cmF0ZXMubGVuZ3RoICE9IDApIHsKKwkJCQlpZiAocGJvZHktPnJhdGVzLmxlbmd0aCA+IHNpemVvZiBwYm9keS0+cmF0ZXMucmF0ZSkKKwkJCQkJcmV0dXJuOworCQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIHBib2R5LT5yYXRlcy5sZW5ndGgpKQorCQkJCQlyZXR1cm47CisJCQkJbWVtY3B5KCZwYm9keS0+cmF0ZXMucmF0ZSwgcCArIG9mZnNldCwKKwkJCQkgICAgcGJvZHktPnJhdGVzLmxlbmd0aCk7CisJCQkJb2Zmc2V0ICs9IHBib2R5LT5yYXRlcy5sZW5ndGg7CisJCQl9CisJCQkvKiBQcmVzZW50IGFuZCBub3QgdHJ1bmNhdGVkICovCisJCQlwYm9keS0+cmF0ZXNfc3RhdHVzID0gUFJFU0VOVDsKKwkJCWJyZWFrOworCQljYXNlIEVfRFM6CisJCQkvKiBQcmVzZW50LCBwb3NzaWJseSB0cnVuY2F0ZWQgKi8KKwkJCXBib2R5LT5kc19zdGF0dXMgPSBUUlVOQ0FURUQ7CisJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAzKSkKKwkJCQlyZXR1cm47CisJCQltZW1jcHkoJnBib2R5LT5kcywgcCArIG9mZnNldCwgMyk7CisJCQlvZmZzZXQgKz0gMzsKKwkJCS8qIFByZXNlbnQgYW5kIG5vdCB0cnVuY2F0ZWQgKi8KKwkJCXBib2R5LT5kc19zdGF0dXMgPSBQUkVTRU5UOworCQkJYnJlYWs7CisJCWNhc2UgRV9DRjoKKwkJCS8qIFByZXNlbnQsIHBvc3NpYmx5IHRydW5jYXRlZCAqLworCQkJcGJvZHktPmNmX3N0YXR1cyA9IFRSVU5DQVRFRDsKKwkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIDgpKQorCQkJCXJldHVybjsKKwkJCW1lbWNweSgmcGJvZHktPmNmLCBwICsgb2Zmc2V0LCA4KTsKKwkJCW9mZnNldCArPSA4OworCQkJLyogUHJlc2VudCBhbmQgbm90IHRydW5jYXRlZCAqLworCQkJcGJvZHktPmNmX3N0YXR1cyA9IFBSRVNFTlQ7CisJCQlicmVhazsKKwkJY2FzZSBFX1RJTToKKwkJCS8qIFByZXNlbnQsIHBvc3NpYmx5IHRydW5jYXRlZCAqLworCQkJcGJvZHktPnRpbV9zdGF0dXMgPSBUUlVOQ0FURUQ7CisJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAyKSkKKwkJCQlyZXR1cm47CisJCQltZW1jcHkoJnBib2R5LT50aW0sIHAgKyBvZmZzZXQsIDIpOworCQkJb2Zmc2V0ICs9IDI7CisJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAzKSkKKwkJCQlyZXR1cm47CisJCQltZW1jcHkoJnBib2R5LT50aW0uY291bnQsIHAgKyBvZmZzZXQsIDMpOworCQkJb2Zmc2V0ICs9IDM7CisKKwkJCWlmIChwYm9keS0+dGltLmxlbmd0aCA8PSAzKQorCQkJCWJyZWFrOworCQkJaWYgKHBib2R5LT50aW0ubGVuZ3RoIC0gMyA+IHNpemVvZiBwYm9keS0+dGltLmJpdG1hcCkKKwkJCQlyZXR1cm47CisJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCBwYm9keS0+dGltLmxlbmd0aCAtIDMpKQorCQkJCXJldHVybjsKKwkJCW1lbWNweShwYm9keS0+dGltLmJpdG1hcCwgcCArIChwYm9keS0+dGltLmxlbmd0aCAtIDMpLAorCQkJICAgIChwYm9keS0+dGltLmxlbmd0aCAtIDMpKTsKKwkJCW9mZnNldCArPSBwYm9keS0+dGltLmxlbmd0aCAtIDM7CisJCQkvKiBQcmVzZW50IGFuZCBub3QgdHJ1bmNhdGVkICovCisJCQlwYm9keS0+dGltX3N0YXR1cyA9IFBSRVNFTlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKyNpZiAwCisJCQlwcmludGYoIigxKSB1bmhhbmRsZWQgZWxlbWVudF9pZCAoJWQpICAiLAorCQkJICAgICoocCArIG9mZnNldCkgKTsKKyNlbmRpZgorCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgMikpCisJCQkJcmV0dXJuOworCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0ICsgMiksICoocCArIG9mZnNldCArIDEpKSkKKwkJCQlyZXR1cm47CisJCQlvZmZzZXQgKz0gKihwICsgb2Zmc2V0ICsgMSkgKyAyOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFByaW50IEhhbmRsZSBmdW5jdGlvbnMgZm9yIHRoZSBtYW5hZ2VtZW50IGZyYW1lIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitoYW5kbGVfYmVhY29uKGNvbnN0IHVfY2hhciAqcCkKK3sKKwlzdHJ1Y3QgbWdtdF9ib2R5X3QgcGJvZHk7CisJaW50IG9mZnNldCA9IDA7CisKKwltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKKworCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX1RTVEFNUF9MRU4gKyBJRUVFODAyXzExX0JDTklOVF9MRU4gKworCSAgICBJRUVFODAyXzExX0NBUElORk9fTEVOKSkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KCZwYm9keS50aW1lc3RhbXAsIHAsIElFRUU4MDJfMTFfVFNUQU1QX0xFTik7CisJb2Zmc2V0ICs9IElFRUU4MDJfMTFfVFNUQU1QX0xFTjsKKwlwYm9keS5iZWFjb25faW50ZXJ2YWwgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7CisJb2Zmc2V0ICs9IElFRUU4MDJfMTFfQkNOSU5UX0xFTjsKKwlwYm9keS5jYXBhYmlsaXR5X2luZm8gPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7CisJb2Zmc2V0ICs9IElFRUU4MDJfMTFfQ0FQSU5GT19MRU47CisKKwlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7CisKKwlQUklOVF9TU0lEKHBib2R5KTsKKwlQUklOVF9SQVRFUyhwYm9keSk7CisJcHJpbnRmKCIgJXMiLAorCSAgICBDQVBBQklMSVRZX0VTUyhwYm9keS5jYXBhYmlsaXR5X2luZm8pID8gIkVTUyIgOiAiSUJTUyIpOworCVBSSU5UX0RTX0NIQU5ORUwocGJvZHkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9hc3NvY19yZXF1ZXN0KGNvbnN0IHVfY2hhciAqcCkKK3sKKwlzdHJ1Y3QgbWdtdF9ib2R5X3QgcGJvZHk7CisJaW50IG9mZnNldCA9IDA7CisKKwltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKKworCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX0NBUElORk9fTEVOICsgSUVFRTgwMl8xMV9MSVNURU5JTlRfTEVOKSkKKwkJcmV0dXJuIDA7CisJcGJvZHkuY2FwYWJpbGl0eV9pbmZvID0gRVhUUkFDVF9MRV8xNkJJVFMocCk7CisJb2Zmc2V0ICs9IElFRUU4MDJfMTFfQ0FQSU5GT19MRU47CisJcGJvZHkubGlzdGVuX2ludGVydmFsID0gRVhUUkFDVF9MRV8xNkJJVFMocCtvZmZzZXQpOworCW9mZnNldCArPSBJRUVFODAyXzExX0xJU1RFTklOVF9MRU47CisKKwlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7CisKKwlQUklOVF9TU0lEKHBib2R5KTsKKwlQUklOVF9SQVRFUyhwYm9keSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9hc3NvY19yZXNwb25zZShjb25zdCB1X2NoYXIgKnApCit7CisJc3RydWN0IG1nbXRfYm9keV90IHBib2R5OworCWludCBvZmZzZXQgPSAwOworCisJbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7CisKKwlpZiAoIVRURVNUMigqcCwgSUVFRTgwMl8xMV9DQVBJTkZPX0xFTiArIElFRUU4MDJfMTFfU1RBVFVTX0xFTiArCisJICAgIElFRUU4MDJfMTFfQUlEX0xFTikpCisJCXJldHVybiAwOworCXBib2R5LmNhcGFiaWxpdHlfaW5mbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOworCW9mZnNldCArPSBJRUVFODAyXzExX0NBUElORk9fTEVOOworCXBib2R5LnN0YXR1c19jb2RlID0gRVhUUkFDVF9MRV8xNkJJVFMocCtvZmZzZXQpOworCW9mZnNldCArPSBJRUVFODAyXzExX1NUQVRVU19MRU47CisJcGJvZHkuYWlkID0gRVhUUkFDVF9MRV8xNkJJVFMocCtvZmZzZXQpOworCW9mZnNldCArPSBJRUVFODAyXzExX0FJRF9MRU47CisKKwlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7CisKKwlwcmludGYoIiBBSUQoJXgpIDolczogJXMiLCAoKHVfaW50MTZfdCkocGJvZHkuYWlkIDw8IDIgKSkgPj4gMiAsCisJICAgIENBUEFCSUxJVFlfUFJJVkFDWShwYm9keS5jYXBhYmlsaXR5X2luZm8pID8gIiBQUklWQUNZICIgOiAiIiwKKwkgICAgKHBib2R5LnN0YXR1c19jb2RlIDwgTlVNX1NUQVRVU0VTCisJCT8gc3RhdHVzX3RleHRbcGJvZHkuc3RhdHVzX2NvZGVdCisJCTogIm4vYSIpKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfcmVhc3NvY19yZXF1ZXN0KGNvbnN0IHVfY2hhciAqcCkKK3sKKwlzdHJ1Y3QgbWdtdF9ib2R5X3QgcGJvZHk7CisJaW50IG9mZnNldCA9IDA7CisKKwltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKKworCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX0NBUElORk9fTEVOICsgSUVFRTgwMl8xMV9MSVNURU5JTlRfTEVOICsKKwkgICAgSUVFRTgwMl8xMV9BUF9MRU4pKQorCQlyZXR1cm4gMDsKKwlwYm9keS5jYXBhYmlsaXR5X2luZm8gPSBFWFRSQUNUX0xFXzE2QklUUyhwKTsKKwlvZmZzZXQgKz0gSUVFRTgwMl8xMV9DQVBJTkZPX0xFTjsKKwlwYm9keS5saXN0ZW5faW50ZXJ2YWwgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7CisJb2Zmc2V0ICs9IElFRUU4MDJfMTFfTElTVEVOSU5UX0xFTjsKKwltZW1jcHkoJnBib2R5LmFwLCBwK29mZnNldCwgSUVFRTgwMl8xMV9BUF9MRU4pOworCW9mZnNldCArPSBJRUVFODAyXzExX0FQX0xFTjsKKworCXBhcnNlX2VsZW1lbnRzKCZwYm9keSwgcCwgb2Zmc2V0KTsKKworCVBSSU5UX1NTSUQocGJvZHkpOworCXByaW50ZigiIEFQIDogJXMiLCBldGhlcmFkZHJfc3RyaW5nKCBwYm9keS5hcCApKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfcmVhc3NvY19yZXNwb25zZShjb25zdCB1X2NoYXIgKnApCit7CisJLyogU2FtZSBhcyBhIEFzc29jaWF0aW9uIFJlcG9uc2UgKi8KKwlyZXR1cm4gaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKHApOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfcHJvYmVfcmVxdWVzdChjb25zdCB1X2NoYXIgKnApCit7CisJc3RydWN0IG1nbXRfYm9keV90ICBwYm9keTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOworCisJcGFyc2VfZWxlbWVudHMoJnBib2R5LCBwLCBvZmZzZXQpOworCisJUFJJTlRfU1NJRChwYm9keSk7CisJUFJJTlRfUkFURVMocGJvZHkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9wcm9iZV9yZXNwb25zZShjb25zdCB1X2NoYXIgKnApCit7CisJc3RydWN0IG1nbXRfYm9keV90ICBwYm9keTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOworCisJaWYgKCFUVEVTVDIoKnAsIElFRUU4MDJfMTFfVFNUQU1QX0xFTiArIElFRUU4MDJfMTFfQkNOSU5UX0xFTiArCisJICAgIElFRUU4MDJfMTFfQ0FQSU5GT19MRU4pKQorCQlyZXR1cm4gMDsKKworCW1lbWNweSgmcGJvZHkudGltZXN0YW1wLCBwLCBJRUVFODAyXzExX1RTVEFNUF9MRU4pOworCW9mZnNldCArPSBJRUVFODAyXzExX1RTVEFNUF9MRU47CisJcGJvZHkuYmVhY29uX2ludGVydmFsID0gRVhUUkFDVF9MRV8xNkJJVFMocCtvZmZzZXQpOworCW9mZnNldCArPSBJRUVFODAyXzExX0JDTklOVF9MRU47CisJcGJvZHkuY2FwYWJpbGl0eV9pbmZvID0gRVhUUkFDVF9MRV8xNkJJVFMocCtvZmZzZXQpOworCW9mZnNldCArPSBJRUVFODAyXzExX0NBUElORk9fTEVOOworCisJcGFyc2VfZWxlbWVudHMoJnBib2R5LCBwLCBvZmZzZXQpOworCisJUFJJTlRfU1NJRChwYm9keSk7CisJUFJJTlRfUkFURVMocGJvZHkpOworCVBSSU5UX0RTX0NIQU5ORUwocGJvZHkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2hhbmRsZV9hdGltKHZvaWQpCit7CisJLyogdGhlIGZyYW1lIGJvZHkgZm9yIEFUSU0gaXMgbnVsbC4gKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraGFuZGxlX2Rpc2Fzc29jKGNvbnN0IHVfY2hhciAqcCkKK3sKKwlzdHJ1Y3QgbWdtdF9ib2R5X3QgIHBib2R5OworCisJbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7CisKKwlpZiAoIVRURVNUMigqcCwgSUVFRTgwMl8xMV9SRUFTT05fTEVOKSkKKwkJcmV0dXJuIDA7CisJcGJvZHkucmVhc29uX2NvZGUgPSBFWFRSQUNUX0xFXzE2QklUUyhwKTsKKworCXByaW50ZigiOiAlcyIsCisJICAgIChwYm9keS5yZWFzb25fY29kZSA8IE5VTV9SRUFTT05TKQorCQk/IHJlYXNvbl90ZXh0W3Bib2R5LnJlYXNvbl9jb2RlXQorCQk6ICJSZXNlcnZlZCIgKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitoYW5kbGVfYXV0aChjb25zdCB1X2NoYXIgKnApCit7CisJc3RydWN0IG1nbXRfYm9keV90ICBwYm9keTsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOworCisJaWYgKCFUVEVTVDIoKnAsIDYpKQorCQlyZXR1cm4gMDsKKwlwYm9keS5hdXRoX2FsZyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOworCW9mZnNldCArPSAyOworCXBib2R5LmF1dGhfdHJhbnNfc2VxX251bSA9IEVYVFJBQ1RfTEVfMTZCSVRTKHAgKyBvZmZzZXQpOworCW9mZnNldCArPSAyOworCXBib2R5LnN0YXR1c19jb2RlID0gRVhUUkFDVF9MRV8xNkJJVFMocCArIG9mZnNldCk7CisJb2Zmc2V0ICs9IDI7CisKKwlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7CisKKwlpZiAoKHBib2R5LmF1dGhfYWxnID09IDEpICYmCisJICAgICgocGJvZHkuYXV0aF90cmFuc19zZXFfbnVtID09IDIpIHx8CisJICAgICAocGJvZHkuYXV0aF90cmFuc19zZXFfbnVtID09IDMpKSkgeworCQlwcmludGYoIiAoJXMpLSV4IFtDaGFsbGVuZ2UgVGV4dF0gJXMiLAorCQkgICAgKHBib2R5LmF1dGhfYWxnIDwgTlVNX0FVVEhfQUxHUykKKwkJCT8gYXV0aF9hbGdfdGV4dFtwYm9keS5hdXRoX2FsZ10KKwkJCTogIlJlc2VydmVkIiwKKwkJICAgIHBib2R5LmF1dGhfdHJhbnNfc2VxX251bSwKKwkJICAgICgocGJvZHkuYXV0aF90cmFuc19zZXFfbnVtICUgMikKKwkJICAgICAgICA/ICgocGJvZHkuc3RhdHVzX2NvZGUgPCBOVU1fU1RBVFVTRVMpCisJCQkgICAgICAgPyBzdGF0dXNfdGV4dFtwYm9keS5zdGF0dXNfY29kZV0KKwkJCSAgICAgICA6ICJuL2EiKSA6ICIiKSk7CisJCXJldHVybiAxOworCX0KKwlwcmludGYoIiAoJXMpLSV4OiAlcyIsCisJICAgIChwYm9keS5hdXRoX2FsZyA8IE5VTV9BVVRIX0FMR1MpCisJCT8gYXV0aF9hbGdfdGV4dFtwYm9keS5hdXRoX2FsZ10KKwkJOiAiUmVzZXJ2ZWQiLAorCSAgICBwYm9keS5hdXRoX3RyYW5zX3NlcV9udW0sCisJICAgIChwYm9keS5hdXRoX3RyYW5zX3NlcV9udW0gJSAyKQorCSAgICAgICAgPyAoKHBib2R5LnN0YXR1c19jb2RlIDwgTlVNX1NUQVRVU0VTKQorCQkgICAgPyBzdGF0dXNfdGV4dFtwYm9keS5zdGF0dXNfY29kZV0KKwkgICAgICAgICAgICA6ICJuL2EiKQorCSAgICAgICAgOiAiIik7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAoraGFuZGxlX2RlYXV0aChjb25zdCBzdHJ1Y3QgbWdtdF9oZWFkZXJfdCAqcG1oLCBjb25zdCB1X2NoYXIgKnApCit7CisJc3RydWN0IG1nbXRfYm9keV90ICBwYm9keTsKKwlpbnQgb2Zmc2V0ID0gMDsKKwljb25zdCBjaGFyICpyZWFzb24gPSBOVUxMOworCisJbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7CisKKwlpZiAoIVRURVNUMigqcCwgSUVFRTgwMl8xMV9SRUFTT05fTEVOKSkKKwkJcmV0dXJuIDA7CisJcGJvZHkucmVhc29uX2NvZGUgPSBFWFRSQUNUX0xFXzE2QklUUyhwKTsKKwlvZmZzZXQgKz0gSUVFRTgwMl8xMV9SRUFTT05fTEVOOworCisJcmVhc29uID0gKHBib2R5LnJlYXNvbl9jb2RlIDwgTlVNX1JFQVNPTlMpCisJCQk/IHJlYXNvbl90ZXh0W3Bib2R5LnJlYXNvbl9jb2RlXQorCQkJOiAiUmVzZXJ2ZWQiOworCisJaWYgKGVmbGFnKSB7CisJCXByaW50ZigiOiAlcyIsIHJlYXNvbik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgKCVzKTogJXMiLCBldGhlcmFkZHJfc3RyaW5nKHBtaC0+c2EpLCByZWFzb24pOworCX0KKwlyZXR1cm4gMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQcmludCBCb2R5IGZ1bmNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQKK21nbXRfYm9keV9wcmludCh1X2ludDE2X3QgZmMsIGNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICpwbWgsCisgICAgY29uc3QgdV9jaGFyICpwKQoreworCXN3aXRjaCAoRkNfU1VCVFlQRShmYykpIHsKKwljYXNlIFNUX0FTU09DX1JFUVVFU1Q6CisJCXByaW50ZigiQXNzb2MgUmVxdWVzdCIpOworCQlyZXR1cm4gaGFuZGxlX2Fzc29jX3JlcXVlc3QocCk7CisJY2FzZSBTVF9BU1NPQ19SRVNQT05TRToKKwkJcHJpbnRmKCJBc3NvYyBSZXNwb25zZSIpOworCQlyZXR1cm4gaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKHApOworCWNhc2UgU1RfUkVBU1NPQ19SRVFVRVNUOgorCQlwcmludGYoIlJlQXNzb2MgUmVxdWVzdCIpOworCQlyZXR1cm4gaGFuZGxlX3JlYXNzb2NfcmVxdWVzdChwKTsKKwljYXNlIFNUX1JFQVNTT0NfUkVTUE9OU0U6CisJCXByaW50ZigiUmVBc3NvYyBSZXNwb25zZSIpOworCQlyZXR1cm4gaGFuZGxlX3JlYXNzb2NfcmVzcG9uc2UocCk7CisJY2FzZSBTVF9QUk9CRV9SRVFVRVNUOgorCQlwcmludGYoIlByb2JlIFJlcXVlc3QiKTsKKwkJcmV0dXJuIGhhbmRsZV9wcm9iZV9yZXF1ZXN0KHApOworCWNhc2UgU1RfUFJPQkVfUkVTUE9OU0U6CisJCXByaW50ZigiUHJvYmUgUmVzcG9uc2UiKTsKKwkJcmV0dXJuIGhhbmRsZV9wcm9iZV9yZXNwb25zZShwKTsKKwljYXNlIFNUX0JFQUNPTjoKKwkJcHJpbnRmKCJCZWFjb24iKTsKKwkJcmV0dXJuIGhhbmRsZV9iZWFjb24ocCk7CisJY2FzZSBTVF9BVElNOgorCQlwcmludGYoIkFUSU0iKTsKKwkJcmV0dXJuIGhhbmRsZV9hdGltKCk7CisJY2FzZSBTVF9ESVNBU1NPQzoKKwkJcHJpbnRmKCJEaXNhc3NvY2lhdGlvbiIpOworCQlyZXR1cm4gaGFuZGxlX2Rpc2Fzc29jKHApOworCWNhc2UgU1RfQVVUSDoKKwkJcHJpbnRmKCJBdXRoZW50aWNhdGlvbiIpOworCQlpZiAoIVRURVNUMigqcCwgMykpCisJCQlyZXR1cm4gMDsKKwkJaWYgKChwWzBdID09IDAgKSAmJiAocFsxXSA9PSAwKSAmJiAocFsyXSA9PSAwKSkgeworCQkJcHJpbnRmKCJBdXRoZW50aWNhdGlvbiAoU2hhcmVkLUtleSktMyAiKTsKKwkJCXJldHVybiB3ZXBfcHJpbnQocCk7CisJCX0KKwkJcmV0dXJuIGhhbmRsZV9hdXRoKHApOworCWNhc2UgU1RfREVBVVRIOgorCQlwcmludGYoIkRlQXV0aGVudGljYXRpb24iKTsKKwkJcmV0dXJuIGhhbmRsZV9kZWF1dGgocG1oLCBwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmhhbmRsZWQgTWFuYWdlbWVudCBzdWJ0eXBlKCV4KSIsCisJCSAgICBGQ19TVUJUWVBFKGZjKSk7CisJCXJldHVybiAxOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIYW5kbGVzIHByaW50aW5nIGFsbCB0aGUgY29udHJvbCBmcmFtZSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorY3RybF9ib2R5X3ByaW50KHVfaW50MTZfdCBmYywgY29uc3QgdV9jaGFyICpwKQoreworCXN3aXRjaCAoRkNfU1VCVFlQRShmYykpIHsKKwljYXNlIENUUkxfUFNfUE9MTDoKKwkJcHJpbnRmKCJQb3dlciBTYXZlLVBvbGwiKTsKKwkJaWYgKCFUVEVTVDIoKnAsIENUUkxfUFNfUE9MTF9IRFJMRU4pKQorCQkJcmV0dXJuIDA7CisJCXByaW50ZigiIEFJRCgleCkiLAorCQkgICAgRVhUUkFDVF9MRV8xNkJJVFMoJigoKGNvbnN0IHN0cnVjdCBjdHJsX3BzX3BvbGxfdCAqKXApLT5haWQpKSk7CisJCWJyZWFrOworCWNhc2UgQ1RSTF9SVFM6CisJCXByaW50ZigiUmVxdWVzdC1Uby1TZW5kIik7CisJCWlmICghVFRFU1QyKCpwLCBDVFJMX1JUU19IRFJMRU4pKQorCQkJcmV0dXJuIDA7CisJCWlmICghZWZsYWcpCisJCQlwcmludGYoIiBUQTolcyAiLAorCQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9ydHNfdCAqKXApLT50YSkpOworCQlicmVhazsKKwljYXNlIENUUkxfQ1RTOgorCQlwcmludGYoIkNsZWFyLVRvLVNlbmQiKTsKKwkJaWYgKCFUVEVTVDIoKnAsIENUUkxfQ1RTX0hEUkxFTikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFlZmxhZykKKwkJCXByaW50ZigiIFJBOiVzICIsCisJCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2N0c190ICopcCktPnJhKSk7CisJCWJyZWFrOworCWNhc2UgQ1RSTF9BQ0s6CisJCXByaW50ZigiQWNrbm93bGVkZ21lbnQiKTsKKwkJaWYgKCFUVEVTVDIoKnAsIENUUkxfQUNLX0hEUkxFTikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFlZmxhZykKKwkJCXByaW50ZigiIFJBOiVzICIsCisJCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2Fja190ICopcCktPnJhKSk7CisJCWJyZWFrOworCWNhc2UgQ1RSTF9DRl9FTkQ6CisJCXByaW50ZigiQ0YtRW5kIik7CisJCWlmICghVFRFU1QyKCpwLCBDVFJMX0VORF9IRFJMRU4pKQorCQkJcmV0dXJuIDA7CisJCWlmICghZWZsYWcpCisJCQlwcmludGYoIiBSQTolcyAiLAorCQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9lbmRfdCAqKXApLT5yYSkpOworCQlicmVhazsKKwljYXNlIENUUkxfRU5EX0FDSzoKKwkJcHJpbnRmKCJDRi1FbmQrQ0YtQWNrIik7CisJCWlmICghVFRFU1QyKCpwLCBDVFJMX0VORF9BQ0tfSERSTEVOKSkKKwkJCXJldHVybiAwOworCQlpZiAoIWVmbGFnKQorCQkJcHJpbnRmKCIgUkE6JXMgIiwKKwkJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfZW5kX2Fja190ICopcCktPnJhKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiVW5rbm93biBDdHJsIFN1YnR5cGUiKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQcmludCBIZWFkZXIgZnVuY3MKKyAqLworCisvKgorICogIERhdGEgRnJhbWUgLSBBZGRyZXNzIGZpZWxkIGNvbnRlbnRzCisgKgorICogIFRvIERzICB8IEZyb20gRFMgfCBBZGRyIDEgfCBBZGRyIDIgfCBBZGRyIDMgfCBBZGRyIDQKKyAqICAgIDAgICAgfCAgMCAgICAgIHwgIERBICAgIHwgU0EgICAgIHwgQlNTSUQgIHwgbi9hCisgKiAgICAwICAgIHwgIDEgICAgICB8ICBEQSAgICB8IEJTU0lEICB8IFNBICAgICB8IG4vYQorICogICAgMSAgICB8ICAwICAgICAgfCAgQlNTSUQgfCBTQSAgICAgfCBEQSAgICAgfCBuL2EKKyAqICAgIDEgICAgfCAgMSAgICAgIHwgIFJBICAgIHwgVEEgICAgIHwgREEgICAgIHwgU0EKKyAqLworCitzdGF0aWMgdm9pZAorZGF0YV9oZWFkZXJfcHJpbnQodV9pbnQxNl90IGZjLCBjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHVfaW50OF90ICoqc3JjcCwKKyAgICBjb25zdCB1X2ludDhfdCAqKmRzdHApCit7CisJdV9pbnQgc3VidHlwZSA9IEZDX1NVQlRZUEUoZmMpOworCisJaWYgKERBVEFfRlJBTUVfSVNfQ0ZfQUNLKHN1YnR5cGUpIHx8IERBVEFfRlJBTUVfSVNfQ0ZfUE9MTChzdWJ0eXBlKSB8fAorCSAgICBEQVRBX0ZSQU1FX0lTX1FPUyhzdWJ0eXBlKSkgeworCQlwcmludGYoIkNGICIpOworCQlpZiAoREFUQV9GUkFNRV9JU19DRl9BQ0soc3VidHlwZSkpIHsKKwkJCWlmIChEQVRBX0ZSQU1FX0lTX0NGX1BPTEwoc3VidHlwZSkpCisJCQkJcHJpbnRmKCJBY2svUG9sbCIpOworCQkJZWxzZQorCQkJCXByaW50ZigiQWNrIik7CisJCX0gZWxzZSB7CisJCQlpZiAoREFUQV9GUkFNRV9JU19DRl9QT0xMKHN1YnR5cGUpKQorCQkJCXByaW50ZigiUG9sbCIpOworCQl9CisJCWlmIChEQVRBX0ZSQU1FX0lTX1FPUyhzdWJ0eXBlKSkKKwkJCXByaW50ZigiK1FvUyIpOworCQlwcmludGYoIiAiKTsKKwl9CisKKyNkZWZpbmUgQUREUjEgIChwICsgNCkKKyNkZWZpbmUgQUREUjIgIChwICsgMTApCisjZGVmaW5lIEFERFIzICAocCArIDE2KQorI2RlZmluZSBBRERSNCAgKHAgKyAyNCkKKworCWlmICghRkNfVE9fRFMoZmMpICYmICFGQ19GUk9NX0RTKGZjKSkgeworCQlpZiAoc3JjcCAhPSBOVUxMKQorCQkJKnNyY3AgPSBBRERSMjsKKwkJaWYgKGRzdHAgIT0gTlVMTCkKKwkJCSpkc3RwID0gQUREUjE7CisJCWlmICghZWZsYWcpCisJCQlyZXR1cm47CisJCXByaW50ZigiREE6JXMgU0E6JXMgQlNTSUQ6JXMgIiwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoQUREUjEpLCBldGhlcmFkZHJfc3RyaW5nKEFERFIyKSwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoQUREUjMpKTsKKwl9IGVsc2UgaWYgKCFGQ19UT19EUyhmYykgJiYgRkNfRlJPTV9EUyhmYykpIHsKKwkJaWYgKHNyY3AgIT0gTlVMTCkKKwkJCSpzcmNwID0gQUREUjM7CisJCWlmIChkc3RwICE9IE5VTEwpCisJCQkqZHN0cCA9IEFERFIxOworCQlpZiAoIWVmbGFnKQorCQkJcmV0dXJuOworCQlwcmludGYoIkRBOiVzIEJTU0lEOiVzIFNBOiVzICIsCisJCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIxKSwgZXRoZXJhZGRyX3N0cmluZyhBRERSMiksCisJCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIzKSk7CisJfSBlbHNlIGlmIChGQ19UT19EUyhmYykgJiYgIUZDX0ZST01fRFMoZmMpKSB7CisJCWlmIChzcmNwICE9IE5VTEwpCisJCQkqc3JjcCA9IEFERFIyOworCQlpZiAoZHN0cCAhPSBOVUxMKQorCQkJKmRzdHAgPSBBRERSMzsKKwkJaWYgKCFlZmxhZykKKwkJCXJldHVybjsKKwkJcHJpbnRmKCJCU1NJRDolcyBTQTolcyBEQTolcyAiLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMSksIGV0aGVyYWRkcl9zdHJpbmcoQUREUjIpLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMykpOworCX0gZWxzZSBpZiAoRkNfVE9fRFMoZmMpICYmIEZDX0ZST01fRFMoZmMpKSB7CisJCWlmIChzcmNwICE9IE5VTEwpCisJCQkqc3JjcCA9IEFERFI0OworCQlpZiAoZHN0cCAhPSBOVUxMKQorCQkJKmRzdHAgPSBBRERSMzsKKwkJaWYgKCFlZmxhZykKKwkJCXJldHVybjsKKwkJcHJpbnRmKCJSQTolcyBUQTolcyBEQTolcyBTQTolcyAiLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMSksIGV0aGVyYWRkcl9zdHJpbmcoQUREUjIpLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMyksIGV0aGVyYWRkcl9zdHJpbmcoQUREUjQpKTsKKwl9CisKKyN1bmRlZiBBRERSMQorI3VuZGVmIEFERFIyCisjdW5kZWYgQUREUjMKKyN1bmRlZiBBRERSNAorfQorCitzdGF0aWMgdm9pZAorbWdtdF9oZWFkZXJfcHJpbnQoY29uc3QgdV9jaGFyICpwLCBjb25zdCB1X2ludDhfdCAqKnNyY3AsCisgICAgY29uc3QgdV9pbnQ4X3QgKipkc3RwKQoreworCWNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICpocCA9IChjb25zdCBzdHJ1Y3QgbWdtdF9oZWFkZXJfdCAqKSBwOworCisJaWYgKHNyY3AgIT0gTlVMTCkKKwkJKnNyY3AgPSBocC0+c2E7CisJaWYgKGRzdHAgIT0gTlVMTCkKKwkJKmRzdHAgPSBocC0+ZGE7CisJaWYgKCFlZmxhZykKKwkJcmV0dXJuOworCisJcHJpbnRmKCJCU1NJRDolcyBEQTolcyBTQTolcyAiLAorCSAgICBldGhlcmFkZHJfc3RyaW5nKChocCktPmJzc2lkKSwgZXRoZXJhZGRyX3N0cmluZygoaHApLT5kYSksCisJICAgIGV0aGVyYWRkcl9zdHJpbmcoKGhwKS0+c2EpKTsKK30KKworc3RhdGljIHZvaWQKK2N0cmxfaGVhZGVyX3ByaW50KHVfaW50MTZfdCBmYywgY29uc3QgdV9jaGFyICpwLCBjb25zdCB1X2ludDhfdCAqKnNyY3AsCisgICAgY29uc3QgdV9pbnQ4X3QgKipkc3RwKQoreworCWlmIChzcmNwICE9IE5VTEwpCisJCSpzcmNwID0gTlVMTDsKKwlpZiAoZHN0cCAhPSBOVUxMKQorCQkqZHN0cCA9IE5VTEw7CisJaWYgKCFlZmxhZykKKwkJcmV0dXJuOworCisJc3dpdGNoIChGQ19TVUJUWVBFKGZjKSkgeworCWNhc2UgQ1RSTF9QU19QT0xMOgorCQlwcmludGYoIkJTU0lEOiVzIFRBOiVzICIsCisJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfcHNfcG9sbF90ICopcCktPmJzc2lkKSwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9wc19wb2xsX3QgKilwKS0+dGEpKTsKKwkJYnJlYWs7CisJY2FzZSBDVFJMX1JUUzoKKwkJcHJpbnRmKCJSQTolcyBUQTolcyAiLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX3J0c190ICopcCktPnJhKSwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9ydHNfdCAqKXApLT50YSkpOworCQlicmVhazsKKwljYXNlIENUUkxfQ1RTOgorCQlwcmludGYoIlJBOiVzICIsCisJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfY3RzX3QgKilwKS0+cmEpKTsKKwkJYnJlYWs7CisJY2FzZSBDVFJMX0FDSzoKKwkJcHJpbnRmKCJSQTolcyAiLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2Fja190ICopcCktPnJhKSk7CisJCWJyZWFrOworCWNhc2UgQ1RSTF9DRl9FTkQ6CisJCXByaW50ZigiUkE6JXMgQlNTSUQ6JXMgIiwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9lbmRfdCAqKXApLT5yYSksCisJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfZW5kX3QgKilwKS0+YnNzaWQpKTsKKwkJYnJlYWs7CisJY2FzZSBDVFJMX0VORF9BQ0s6CisJCXByaW50ZigiUkE6JXMgQlNTSUQ6JXMgIiwKKwkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9lbmRfYWNrX3QgKilwKS0+cmEpLAorCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2VuZF9hY2tfdCAqKXApLT5ic3NpZCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIihIKSBVbmtub3duIEN0cmwgU3VidHlwZSIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2V4dHJhY3RfaGVhZGVyX2xlbmd0aCh1X2ludDE2X3QgZmMpCit7CisJaW50IGxlbjsKKworCXN3aXRjaCAoRkNfVFlQRShmYykpIHsKKwljYXNlIFRfTUdNVDoKKwkJcmV0dXJuIE1HTVRfSERSTEVOOworCWNhc2UgVF9DVFJMOgorCQlzd2l0Y2ggKEZDX1NVQlRZUEUoZmMpKSB7CisJCWNhc2UgQ1RSTF9QU19QT0xMOgorCQkJcmV0dXJuIENUUkxfUFNfUE9MTF9IRFJMRU47CisJCWNhc2UgQ1RSTF9SVFM6CisJCQlyZXR1cm4gQ1RSTF9SVFNfSERSTEVOOworCQljYXNlIENUUkxfQ1RTOgorCQkJcmV0dXJuIENUUkxfQ1RTX0hEUkxFTjsKKwkJY2FzZSBDVFJMX0FDSzoKKwkJCXJldHVybiBDVFJMX0FDS19IRFJMRU47CisJCWNhc2UgQ1RSTF9DRl9FTkQ6CisJCQlyZXR1cm4gQ1RSTF9FTkRfSERSTEVOOworCQljYXNlIENUUkxfRU5EX0FDSzoKKwkJCXJldHVybiBDVFJMX0VORF9BQ0tfSERSTEVOOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIFRfREFUQToKKwkJbGVuID0gKEZDX1RPX0RTKGZjKSAmJiBGQ19GUk9NX0RTKGZjKSkgPyAzMCA6IDI0OworCQlpZiAoREFUQV9GUkFNRV9JU19RT1MoRkNfU1VCVFlQRShmYykpKQorCQkJbGVuICs9IDI7CisJCXJldHVybiBsZW47CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJ1bmtub3duIElFRUU4MDIuMTEgZnJhbWUgdHlwZSAoJWQpIiwgRkNfVFlQRShmYykpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBQcmludCB0aGUgODAyLjExIE1BQyBoZWFkZXIgaWYgZWZsYWcgaXMgc2V0LCBhbmQgc2V0ICIqc3JjcCIgYW5kICIqZHN0cCIKKyAqIHRvIHBvaW50IHRvIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzZXMgaW4gYW55IGNhc2UgaWYKKyAqICJzcmNwIiBhbmQgImRzdHAiIGFyZW4ndCBudWxsLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2llZWVfODAyXzExX2hkcl9wcmludCh1X2ludDE2X3QgZmMsIGNvbnN0IHVfY2hhciAqcCwgY29uc3QgdV9pbnQ4X3QgKipzcmNwLAorICAgIGNvbnN0IHVfaW50OF90ICoqZHN0cCkKK3sKKwlpZiAodmZsYWcpIHsKKwkJaWYgKEZDX01PUkVfREFUQShmYykpCisJCQlwcmludGYoIk1vcmUgRGF0YSAiKTsKKwkJaWYgKEZDX01PUkVfRkxBRyhmYykpCisJCQlwcmludGYoIk1vcmUgRnJhZ21lbnRzICIpOworCQlpZiAoRkNfUE9XRVJfTUdNVChmYykpCisJCQlwcmludGYoIlB3ciBNZ210ICIpOworCQlpZiAoRkNfUkVUUlkoZmMpKQorCQkJcHJpbnRmKCJSZXRyeSAiKTsKKwkJaWYgKEZDX09SREVSKGZjKSkKKwkJCXByaW50ZigiU3RyaWN0bHkgT3JkZXJlZCAiKTsKKwkJaWYgKEZDX1dFUChmYykpCisJCQlwcmludGYoIldFUCBFbmNyeXB0ZWQgIik7CisJCWlmIChGQ19UWVBFKGZjKSAhPSBUX0NUUkwgfHwgRkNfU1VCVFlQRShmYykgIT0gQ1RSTF9QU19QT0xMKQorCQkJcHJpbnRmKCIlZHVzICIsCisJCQkgICAgRVhUUkFDVF9MRV8xNkJJVFMoCisJCQkgICAgICAgICYoKGNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICopcCktPmR1cmF0aW9uKSk7CisJfQorCisJc3dpdGNoIChGQ19UWVBFKGZjKSkgeworCWNhc2UgVF9NR01UOgorCQltZ210X2hlYWRlcl9wcmludChwLCBzcmNwLCBkc3RwKTsKKwkJYnJlYWs7CisJY2FzZSBUX0NUUkw6CisJCWN0cmxfaGVhZGVyX3ByaW50KGZjLCBwLCBzcmNwLCBkc3RwKTsKKwkJYnJlYWs7CisJY2FzZSBUX0RBVEE6CisJCWRhdGFfaGVhZGVyX3ByaW50KGZjLCBwLCBzcmNwLCBkc3RwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIoaGVhZGVyKSB1bmtub3duIElFRUU4MDIuMTEgZnJhbWUgdHlwZSAoJWQpIiwKKwkJICAgIEZDX1RZUEUoZmMpKTsKKwkJKnNyY3AgPSBOVUxMOworCQkqZHN0cCA9IE5VTEw7CisJCWJyZWFrOworCX0KK30KKworI2lmbmRlZiByb3VuZHVwMgorI2RlZmluZQlyb3VuZHVwMih4LCB5KQkoKCh4KSsoKHkpLTEpKSYofigoeSktMSkpKSAvKiBpZiB5IGlzIHBvd2VycyBvZiB0d28gKi8KKyNlbmRpZgorCitzdGF0aWMgdV9pbnQKK2llZWU4MDJfMTFfcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbiwgaW50IHBhZCkKK3sKKwl1X2ludDE2X3QgZmM7CisJdV9pbnQgaGRybGVuOworCWNvbnN0IHVfaW50OF90ICpzcmMsICpkc3Q7CisJdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOworCisJaWYgKGNhcGxlbiA8IElFRUU4MDJfMTFfRkNfTEVOKSB7CisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiBjYXBsZW47CisJfQorCisJZmMgPSBFWFRSQUNUX0xFXzE2QklUUyhwKTsKKwloZHJsZW4gPSBleHRyYWN0X2hlYWRlcl9sZW5ndGgoZmMpOworCWlmIChwYWQpCisJCWhkcmxlbiA9IHJvdW5kdXAyKGhkcmxlbiwgNCk7CisKKwlpZiAoY2FwbGVuIDwgaGRybGVuKSB7CisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiBoZHJsZW47CisJfQorCisJaWVlZV84MDJfMTFfaGRyX3ByaW50KGZjLCBwLCAmc3JjLCAmZHN0KTsKKworCS8qCisJICogR28gcGFzdCB0aGUgODAyLjExIGhlYWRlci4KKwkgKi8KKwlsZW5ndGggLT0gaGRybGVuOworCWNhcGxlbiAtPSBoZHJsZW47CisJcCArPSBoZHJsZW47CisKKwlzd2l0Y2ggKEZDX1RZUEUoZmMpKSB7CisJY2FzZSBUX01HTVQ6CisJCWlmICghbWdtdF9ib2R5X3ByaW50KGZjLAorCQkgICAgKGNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICopKHAgLSBoZHJsZW4pLCBwKSkgeworCQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJCXJldHVybiBoZHJsZW47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUX0NUUkw6CisJCWlmICghY3RybF9ib2R5X3ByaW50KGZjLCBwIC0gaGRybGVuKSkgeworCQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJCXJldHVybiBoZHJsZW47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBUX0RBVEE6CisJCWlmIChEQVRBX0ZSQU1FX0lTX05VTEwoRkNfU1VCVFlQRShmYykpKQorCQkJcmV0dXJuIGhkcmxlbjsJLyogbm8tZGF0YSBmcmFtZSAqLworCQkvKiBUaGVyZSBtYXkgYmUgYSBwcm9ibGVtIHcvIEFQIG5vdCBoYXZpbmcgdGhpcyBiaXQgc2V0ICovCisJCWlmIChGQ19XRVAoZmMpKSB7CisJCQlpZiAoIXdlcF9wcmludChwKSkgeworCQkJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCQkJcmV0dXJuIGhkcmxlbjsKKwkJCX0KKwkJfSBlbHNlIGlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIGRzdCwgc3JjLAorCQkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApIHsKKwkJCS8qCisJCQkgKiBTb21lIGtpbmRzIG9mIExMQyBwYWNrZXQgd2UgY2Fubm90CisJCQkgKiBoYW5kbGUgaW50ZWxsaWdlbnRseQorCQkJICovCisJCQlpZiAoIWVmbGFnKQorCQkJCWllZWVfODAyXzExX2hkcl9wcmludChmYywgcCAtIGhkcmxlbiwgTlVMTCwKKwkJCQkgICAgTlVMTCk7CisJCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkKKwkJCQlwcmludGYoIihMTEMgJXMpICIsCisJCQkJICAgIGV0aGVycHJvdG9fc3RyaW5nKAorCQkJCSAgICAgICAgaHRvbnMoZXh0cmFjdGVkX2V0aGVydHlwZSkpKTsKKwkJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJ1bmtub3duIDgwMi4xMSBmcmFtZSB0eXBlICglZCkiLCBGQ19UWVBFKGZjKSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSA4MDIuMTEgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqLwordV9pbnQKK2llZWU4MDJfMTFfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJcmV0dXJuIGllZWU4MDJfMTFfcHJpbnQocCwgaC0+bGVuLCBoLT5jYXBsZW4sIDApOworfQorCitzdGF0aWMgaW50CitwcmludF9yYWRpb3RhcF9maWVsZChzdHJ1Y3QgY3BhY2tfc3RhdGUgKnMsIHVfaW50MzJfdCBiaXQsIGludCAqcGFkKQoreworCXVuaW9uIHsKKwkJaW50OF90CQlpODsKKwkJdV9pbnQ4X3QJdTg7CisJCWludDE2X3QJCWkxNjsKKwkJdV9pbnQxNl90CXUxNjsKKwkJdV9pbnQzMl90CXUzMjsKKwkJdV9pbnQ2NF90CXU2NDsKKwl9IHUsIHUyOworCWludCByYzsKKworCXN3aXRjaCAoYml0KSB7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1M6CisJCXJjID0gY3BhY2tfdWludDgocywgJnUudTgpOworCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX0RBVEFQQUQpCisJCQkqcGFkID0gMTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfUkFURToKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlRTSUdOQUw6CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0U6CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQToKKwkJcmMgPSBjcGFja191aW50OChzLCAmdS51OCk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUw6CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFOgorCQlyYyA9IGNwYWNrX2ludDgocywgJnUuaTgpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9DSEFOTkVMOgorCQlyYyA9IGNwYWNrX3VpbnQxNihzLCAmdS51MTYpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCQlyYyA9IGNwYWNrX3VpbnQxNihzLCAmdTIudTE2KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfRkhTUzoKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFk6CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT046CisJCXJjID0gY3BhY2tfdWludDE2KHMsICZ1LnUxNik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OOgorCQlyYyA9IGNwYWNrX3VpbnQ4KHMsICZ1LnU4KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJNX1RYX1BPV0VSOgorCQlyYyA9IGNwYWNrX2ludDgocywgJnUuaTgpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUOgorCQlyYyA9IGNwYWNrX3VpbnQ2NChzLCAmdS51NjQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB0aGlzIGJpdCBpbmRpY2F0ZXMgYSBmaWVsZCB3aG9zZQorCQkgKiBzaXplIHdlIGRvIG5vdCBrbm93LCBzbyB3ZSBjYW5ub3QKKwkJICogcHJvY2VlZC4KKwkJICovCisJCXByaW50ZigiWzB4JTA4eF0gIiwgYml0KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyYyAhPSAwKSB7CisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiByYzsKKwl9CisKKwlzd2l0Y2ggKGJpdCkgeworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUw6CisJCXByaW50ZigiJXUgTUh6ICIsIHUudTE2KTsKKwkJaWYgKHUyLnUxNiAhPSAwKQorCQkJcHJpbnRmKCIoMHglMDR4KSAiLCB1Mi51MTYpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTOgorCQlwcmludGYoImZoc2V0ICVkIGZocGF0ICVkICIsIHUudTE2ICYgMHhmZiwgKHUudTE2ID4+IDgpICYgMHhmZik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX1JBVEU6CisJCVBSSU5UX1JBVEUoIiIsIHUudTgsICIgTWIvcyAiKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTDoKKwkJcHJpbnRmKCIlZGRCIHNpZ25hbCAiLCB1Lmk4KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFOgorCQlwcmludGYoIiVkZEIgbm9pc2UgIiwgdS5pOCk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTDoKKwkJcHJpbnRmKCIlZGRCIHNpZ25hbCAiLCB1LnU4KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UTk9JU0U6CisJCXByaW50ZigiJWRkQiBub2lzZSAiLCB1LnU4KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZOgorCQlwcmludGYoIiV1IHNxICIsIHUudTE2KTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT046CisJCXByaW50ZigiJWQgdHggcG93ZXIgIiwgLShpbnQpdS51MTYpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTjoKKwkJcHJpbnRmKCIlZGRCIHR4IHBvd2VyICIsIC0oaW50KXUudTgpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVI6CisJCXByaW50ZigiJWRkQm0gdHggcG93ZXIgIiwgdS5pOCk7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTOgorCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX0NGUCkKKwkJCXByaW50ZigiY2ZwICIpOworCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX1NIT1JUUFJFKQorCQkJcHJpbnRmKCJzaG9ydCBwcmVhbWJsZSAiKTsKKwkJaWYgKHUudTggJiBJRUVFODAyMTFfUkFESU9UQVBfRl9XRVApCisJCQlwcmludGYoIndlcCAiKTsKKwkJaWYgKHUudTggJiBJRUVFODAyMTFfUkFESU9UQVBfRl9GUkFHKQorCQkJcHJpbnRmKCJmcmFnbWVudGVkICIpOworCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX0JBREZDUykKKwkJCXByaW50ZigiYmFkLWZjcyAiKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfQU5URU5OQToKKwkJcHJpbnRmKCJhbnRlbm5hICVkICIsIHUudTgpOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9UU0ZUOgorCQlwcmludGYoIiUiIFBSSXU2NCAidXMgdHNmdCAiLCB1LnU2NCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVfaW50CitpZWVlODAyXzExX3JhZGlvX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pCit7CisjZGVmaW5lCUJJVE5PXzMyKHgpICgoKHgpID4+IDE2KSA/IDE2ICsgQklUTk9fMTYoKHgpID4+IDE2KSA6IEJJVE5PXzE2KCh4KSkpCisjZGVmaW5lCUJJVE5PXzE2KHgpICgoKHgpID4+IDgpID8gOCArIEJJVE5PXzgoKHgpID4+IDgpIDogQklUTk9fOCgoeCkpKQorI2RlZmluZQlCSVROT184KHgpICgoKHgpID4+IDQpID8gNCArIEJJVE5PXzQoKHgpID4+IDQpIDogQklUTk9fNCgoeCkpKQorI2RlZmluZQlCSVROT180KHgpICgoKHgpID4+IDIpID8gMiArIEJJVE5PXzIoKHgpID4+IDIpIDogQklUTk9fMigoeCkpKQorI2RlZmluZQlCSVROT18yKHgpICgoKHgpICYgMikgPyAxIDogMCkKKyNkZWZpbmUJQklUKG4pCSgxIDw8IG4pCisjZGVmaW5lCUlTX0VYVEVOREVEKF9fcCkJXAorCSAgICAoRVhUUkFDVF9MRV8zMkJJVFMoX19wKSAmIEJJVChJRUVFODAyMTFfUkFESU9UQVBfRVhUKSkgIT0gMAorCisJc3RydWN0IGNwYWNrX3N0YXRlIGNwYWNrZXI7CisJc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKmhkcjsKKwl1X2ludDMyX3QgcHJlc2VudCwgbmV4dF9wcmVzZW50OworCXVfaW50MzJfdCAqcHJlc2VudHAsICpsYXN0X3ByZXNlbnRwOworCWVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgYml0OworCWludCBiaXQwOworCWNvbnN0IHVfY2hhciAqaXRlcjsKKwl1X2ludCBsZW47CisJaW50IHBhZDsKKworCWlmIChjYXBsZW4gPCBzaXplb2YoKmhkcikpIHsKKwkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKilwOworCisJbGVuID0gRVhUUkFDVF9MRV8xNkJJVFMoJmhkci0+aXRfbGVuKTsKKworCWlmIChjYXBsZW4gPCBsZW4pIHsKKwkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisJZm9yIChsYXN0X3ByZXNlbnRwID0gJmhkci0+aXRfcHJlc2VudDsKKwkgICAgIElTX0VYVEVOREVEKGxhc3RfcHJlc2VudHApICYmCisJICAgICAodV9jaGFyKikobGFzdF9wcmVzZW50cCArIDEpIDw9IHAgKyBsZW47CisJICAgICBsYXN0X3ByZXNlbnRwKyspOworCisJLyogYXJlIHRoZXJlIG1vcmUgYml0bWFwIGV4dGVuc2lvbnMgdGhhbiBieXRlcyBpbiBoZWFkZXI/ICovCisJaWYgKElTX0VYVEVOREVEKGxhc3RfcHJlc2VudHApKSB7CisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiBjYXBsZW47CisJfQorCisJaXRlciA9ICh1X2NoYXIqKShsYXN0X3ByZXNlbnRwICsgMSk7CisKKwlpZiAoY3BhY2tfaW5pdCgmY3BhY2tlciwgKHVfaW50OF90KilpdGVyLCBsZW4gLSAoaXRlciAtIHApKSAhPSAwKSB7CisJCS8qIFhYWCAqLworCQlwcmludGYoIlt8ODAyLjExXSIpOworCQlyZXR1cm4gY2FwbGVuOworCX0KKworCS8qIEFzc3VtZSBubyBBdGhlcm9zIHBhZGRpbmcgYmV0d2VlbiA4MDIuMTEgaGVhZGVyIGFuZCBib2R5ICovCisJcGFkID0gMDsKKwlmb3IgKGJpdDAgPSAwLCBwcmVzZW50cCA9ICZoZHItPml0X3ByZXNlbnQ7IHByZXNlbnRwIDw9IGxhc3RfcHJlc2VudHA7CisJICAgICBwcmVzZW50cCsrLCBiaXQwICs9IDMyKSB7CisJCWZvciAocHJlc2VudCA9IEVYVFJBQ1RfTEVfMzJCSVRTKHByZXNlbnRwKTsgcHJlc2VudDsKKwkJICAgICBwcmVzZW50ID0gbmV4dF9wcmVzZW50KSB7CisJCQkvKiBjbGVhciB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0ICovCisJCQluZXh0X3ByZXNlbnQgPSBwcmVzZW50ICYgKHByZXNlbnQgLSAxKTsKKworCQkJLyogZXh0cmFjdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRoYXQgaXMgc2V0ICovCisJCQliaXQgPSAoZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSkKKwkJCSAgICAoYml0MCArIEJJVE5PXzMyKHByZXNlbnQgXiBuZXh0X3ByZXNlbnQpKTsKKworCQkJaWYgKHByaW50X3JhZGlvdGFwX2ZpZWxkKCZjcGFja2VyLCBiaXQsICZwYWQpICE9IDApCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIGxlbiArIGllZWU4MDJfMTFfcHJpbnQocCArIGxlbiwgbGVuZ3RoIC0gbGVuLCBjYXBsZW4gLSBsZW4sIHBhZCk7CisjdW5kZWYgQklUTk9fMzIKKyN1bmRlZiBCSVROT18xNgorI3VuZGVmIEJJVE5PXzgKKyN1bmRlZiBCSVROT180CisjdW5kZWYgQklUTk9fMgorI3VuZGVmIEJJVAorfQorCitzdGF0aWMgdV9pbnQKK2llZWU4MDJfMTFfYXZzX3JhZGlvX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pCit7CisJdV9pbnQzMl90IGNhcGhkcl9sZW47CisKKwljYXBoZHJfbGVuID0gRVhUUkFDVF8zMkJJVFMocCArIDQpOworCWlmIChjYXBoZHJfbGVuIDwgOCkgeworCQkvKgorCQkgKiBZb3chICBUaGUgY2FwdHVyZSBoZWFkZXIgbGVuZ3RoIGlzIGNsYWltZWQgbm90CisJCSAqIHRvIGJlIGxhcmdlIGVub3VnaCB0byBpbmNsdWRlIGV2ZW4gdGhlIHZlcnNpb24KKwkJICogY29va2llIG9yIGNhcHR1cmUgaGVhZGVyIGxlbmd0aCEKKwkJICovCisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiBjYXBsZW47CisJfQorCisJaWYgKGNhcGxlbiA8IGNhcGhkcl9sZW4pIHsKKwkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisKKwlyZXR1cm4gY2FwaGRyX2xlbiArIGllZWU4MDJfMTFfcHJpbnQocCArIGNhcGhkcl9sZW4sCisJICAgIGxlbmd0aCAtIGNhcGhkcl9sZW4sIGNhcGxlbiAtIGNhcGhkcl9sZW4sIDApOworfQorCisjZGVmaW5lIFBSSVNNX0hEUl9MRU4JCTE0NAorCisjZGVmaW5lIFdMQU5DQVBfTUFHSUNfQ09PS0lFX1YxCTB4ODAyMTEwMDEKKworLyoKKyAqIEZvciBETFRfUFJJU01fSEVBREVSOyBsaWtlIERMVF9JRUVFODAyXzExLCBidXQgd2l0aCBhbiBleHRyYSBoZWFkZXIsCisgKiBjb250YWluaW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmFkaW8gaW5mb3JtYXRpb24sIHdoaWNoIHdlCisgKiBjdXJyZW50bHkgaWdub3JlLgorICoKKyAqIElmLCBob3dldmVyLCB0aGUgcGFja2V0IGJlZ2lucyB3aXRoIFdMQU5DQVBfTUFHSUNfQ09PS0lFX1YxLCBpdCdzCisgKiByZWFsbHkgRExUX0lFRUU4MDJfMTFfUkFESU8gKGN1cnJlbnRseSwgb24gTGludXgsIHRoZXJlJ3Mgbm8KKyAqIEFSUEhSRF8gdHlwZSBmb3IgRExUX0lFRUU4MDJfMTFfUkFESU8sIGFzIHRoZXJlIGlzIGEKKyAqIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gZm9yIERMVF9QUklTTV9IRUFERVIsIHNvCisgKiBBUlBIUkRfSUVFRTgwMjExX1BSSVNNIGlzIHVzZWQgZm9yIERMVF9JRUVFODAyXzExX1JBRElPLCBhbmQKKyAqIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBoZWFkZXIgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggaXQgaXMpLgorICovCit1X2ludAorcHJpc21faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCXVfaW50IGxlbmd0aCA9IGgtPmxlbjsKKworCWlmIChjYXBsZW4gPCA0KSB7CisJCXByaW50ZigiW3w4MDIuMTFdIik7CisJCXJldHVybiBjYXBsZW47CisJfQorCisJaWYgKEVYVFJBQ1RfMzJCSVRTKHApID09IFdMQU5DQVBfTUFHSUNfQ09PS0lFX1YxKQorCQlyZXR1cm4gaWVlZTgwMl8xMV9hdnNfcmFkaW9fcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4pOworCisJaWYgKGNhcGxlbiA8IFBSSVNNX0hEUl9MRU4pIHsKKwkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisKKwlyZXR1cm4gUFJJU01fSERSX0xFTiArIGllZWU4MDJfMTFfcHJpbnQocCArIFBSSVNNX0hEUl9MRU4sCisJICAgIGxlbmd0aCAtIFBSSVNNX0hEUl9MRU4sIGNhcGxlbiAtIFBSSVNNX0hEUl9MRU4sIDApOworfQorCisvKgorICogRm9yIERMVF9JRUVFODAyXzExX1JBRElPOyBsaWtlIERMVF9JRUVFODAyXzExLCBidXQgd2l0aCBhbiBleHRyYQorICogaGVhZGVyLCBjb250YWluaW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmFkaW8gaW5mb3JtYXRpb24sIHdoaWNoIHdlCisgKiBjdXJyZW50bHkgaWdub3JlLgorICovCit1X2ludAoraWVlZTgwMl8xMV9yYWRpb19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCisJaWYgKGNhcGxlbiA8IDgpIHsKKwkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisKKwlyZXR1cm4gaWVlZTgwMl8xMV9yYWRpb19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1haC5jIGIvcHJpbnQtYWguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmVkOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtYWguYwpAQCAtMCwwICsxLDcxIEBACisvKgkkTmV0QlNEOiBwcmludC1haC5jLHYgMS40IDE5OTYvMDUvMjAgMDA6NDE6MTYgZnZkbCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYWguYyx2IDEuMjIgMjAwMy8xMS8xOSAwMDozNjowNiBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYWguaCIKKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisKK2ludAorYWhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYWggKmFoOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7CisJaW50IHN1bWxlbjsKKwl1X2ludDMyX3Qgc3BpOworCisJYWggPSAoY29uc3Qgc3RydWN0IGFoICopYnA7CisJZXAgPSBzbmFwZW5kOwkJLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KKworCVRDSEVDSygqYWgpOworCisJc3VtbGVuID0gYWgtPmFoX2xlbiA8PCAyOworCXNwaSA9IEVYVFJBQ1RfMzJCSVRTKCZhaC0+YWhfc3BpKTsKKworCXByaW50ZigiQUgoc3BpPTB4JTA4eCIsIHNwaSk7CisJaWYgKHZmbGFnKQorCQlwcmludGYoIixzdW1sZW49JWQiLCBzdW1sZW4pOworCXByaW50ZigiLHNlcT0weCV4IiwgRVhUUkFDVF8zMkJJVFMoYWggKyAxKSk7CisJaWYgKGJwICsgc2l6ZW9mKHN0cnVjdCBhaCkgKyBzdW1sZW4gPiBlcCkKKwkJZnB1dHMoIlt0cnVuY2F0ZWRdIiwgc3Rkb3V0KTsKKwlmcHV0cygiKTogIiwgc3Rkb3V0KTsKKworCXJldHVybiBzaXplb2Yoc3RydWN0IGFoKSArIHN1bWxlbjsKKyB0cnVuYzoKKwlmcHV0cygiW3xBSF0iLCBzdGRvdXQpOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWFvZHYuYyBiL3ByaW50LWFvZHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGE1NDdkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtYW9kdi5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEJydWNlIE0uIFNpbXBzb24gPGJtc0BzcGMub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgQnJ1Y2UgTS4gU2ltcHNvbi4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgQnJ1Y2UgTS4gU2ltcHNvbiBub3IgdGhlIG5hbWVzIG9mIGNvLQorICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBCcnVjZSBNLiBTaW1wc29uIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorICogVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBCcnVjZSBNLiBTaW1wc29uIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYW9kdi5jLHYgMS4xMSAyMDA0LzAzLzI0IDAwOjMwOjE5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKyNpbmNsdWRlICJhb2R2LmgiCisKK3N0YXRpYyB2b2lkCithb2R2X2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYW9kdl9leHQgKmVwLCB1X2ludCBsZW5ndGgpCit7CisJdV9pbnQgaTsKKwljb25zdCBzdHJ1Y3QgYW9kdl9oZWxsbyAqYWg7CisKKwlzd2l0Y2ggKGVwLT50eXBlKSB7CisJY2FzZSBBT0RWX0VYVF9IRUxMTzoKKwkJaWYgKHNuYXBlbmQgPCAodV9jaGFyICopIGVwKSB7CisJCQlwcmludGYoIiBbfGhlbGxvXSIpOworCQkJcmV0dXJuOworCQl9CisJCWkgPSBtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSAodV9jaGFyICopZXApKTsKKwkJaWYgKGkgPCBzaXplb2Yoc3RydWN0IGFvZHZfaGVsbG8pKSB7CisJCQlwcmludGYoIiBbfGhlbGxvXSIpOworCQkJcmV0dXJuOworCQl9CisJCWkgLT0gc2l6ZW9mKHN0cnVjdCBhb2R2X2hlbGxvKTsKKwkJYWggPSAodm9pZCAqKWVwOworCQlwcmludGYoIlxuXHRleHQgSEVMTE8gJWxkIG1zIiwKKwkJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhaC0+aW50ZXJ2YWwpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIlxuXHRleHQgJXUgJXUiLCBlcC0+dHlwZSwgZXAtPmxlbmd0aCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2FvZHZfcnJlcShjb25zdCB1bmlvbiBhb2R2ICphcCwgY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludCBpOworCisJaWYgKHNuYXBlbmQgPCBkYXQpIHsKKwkJcHJpbnRmKCIgW3xhb2R2XSIpOworCQlyZXR1cm47CisJfQorCWkgPSBtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSBkYXQpKTsKKwlpZiAoaSA8IHNpemVvZihhcC0+cnJlcSkpIHsKKwkJcHJpbnRmKCIgW3xycmVxXSIpOworCQlyZXR1cm47CisJfQorCWkgLT0gc2l6ZW9mKGFwLT5ycmVxKTsKKwlwcmludGYoIiBycmVxICV1ICVzJXMlcyVzJXNob3BzICV1IGlkIDB4JTA4bHhcbiIKKwkgICAgIlx0ZHN0ICVzIHNlcSAlbHUgc3JjICVzIHNlcSAlbHUiLCBsZW5ndGgsCisJICAgIGFwLT5ycmVxLnJyZXFfdHlwZSAmIFJSRVFfSk9JTiA/ICJbSl0iIDogIiIsCisJICAgIGFwLT5ycmVxLnJyZXFfdHlwZSAmIFJSRVFfUkVQQUlSID8gIltSXSIgOiAiIiwKKwkgICAgYXAtPnJyZXEucnJlcV90eXBlICYgUlJFUV9HUkFUID8gIltHXSIgOiAiIiwKKwkgICAgYXAtPnJyZXEucnJlcV90eXBlICYgUlJFUV9ERVNUID8gIltEXSIgOiAiIiwKKwkgICAgYXAtPnJyZXEucnJlcV90eXBlICYgUlJFUV9VTktOT1dOID8gIltVXSAiIDogIiAiLAorCSAgICBhcC0+cnJlcS5ycmVxX2hvcHMsCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcS5ycmVxX2lkKSwKKwkgICAgaXBhZGRyX3N0cmluZygmYXAtPnJyZXEucnJlcV9kYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcS5ycmVxX2RzKSwKKwkgICAgaXBhZGRyX3N0cmluZygmYXAtPnJyZXEucnJlcV9vYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcS5ycmVxX29zKSk7CisJaWYgKGkgPj0gc2l6ZW9mKHN0cnVjdCBhb2R2X2V4dCkpCisJCWFvZHZfZXh0ZW5zaW9uKCh2b2lkICopKCZhcC0+cnJlcSArIDEpLCBpKTsKK30KKworc3RhdGljIHZvaWQKK2FvZHZfcnJlcChjb25zdCB1bmlvbiBhb2R2ICphcCwgY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludCBpOworCisJaWYgKHNuYXBlbmQgPCBkYXQpIHsKKwkJcHJpbnRmKCIgW3xhb2R2XSIpOworCQlyZXR1cm47CisJfQorCWkgPSBtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSBkYXQpKTsKKwlpZiAoaSA8IHNpemVvZihhcC0+cnJlcCkpIHsKKwkJcHJpbnRmKCIgW3xycmVwXSIpOworCQlyZXR1cm47CisJfQorCWkgLT0gc2l6ZW9mKGFwLT5ycmVwKTsKKwlwcmludGYoIiBycmVwICV1ICVzJXNwcmVmaXggJXUgaG9wcyAldVxuIgorCSAgICAiXHRkc3QgJXMgZHNlcSAlbHUgc3JjICVzICVsdSBtcyIsIGxlbmd0aCwKKwkgICAgYXAtPnJyZXAucnJlcF90eXBlICYgUlJFUF9SRVBBSVIgPyAiW1JdIiA6ICIiLAorCSAgICBhcC0+cnJlcC5ycmVwX3R5cGUgJiBSUkVQX0FDSyA/ICJbQV0gIiA6ICIgIiwKKwkgICAgYXAtPnJyZXAucnJlcF9wcyAmIFJSRVBfUFJFRklYX01BU0ssCisJICAgIGFwLT5ycmVwLnJyZXBfaG9wcywKKwkgICAgaXBhZGRyX3N0cmluZygmYXAtPnJyZXAucnJlcF9kYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcC5ycmVwX2RzKSwKKwkgICAgaXBhZGRyX3N0cmluZygmYXAtPnJyZXAucnJlcF9vYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcC5ycmVwX2xpZmUpKTsKKwlpZiAoaSA+PSBzaXplb2Yoc3RydWN0IGFvZHZfZXh0KSkKKwkJYW9kdl9leHRlbnNpb24oKHZvaWQgKikoJmFwLT5ycmVwICsgMSksIGkpOworfQorCitzdGF0aWMgdm9pZAorYW9kdl9yZXJyKGNvbnN0IHVuaW9uIGFvZHYgKmFwLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQoreworCXVfaW50IGk7CisJY29uc3Qgc3RydWN0IHJlcnJfdW5yZWFjaCAqZHAgPSBOVUxMOworCWludCBuLCB0cnVuYzsKKworCWlmIChzbmFwZW5kIDwgZGF0KSB7CisJCXByaW50ZigiIFt8YW9kdl0iKTsKKwkJcmV0dXJuOworCX0KKwlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gZGF0KSk7CisJaWYgKGkgPCBvZmZzZXRvZihzdHJ1Y3QgYW9kdl9yZXJyLCByKSkgeworCQlwcmludGYoIiBbfHJlcnJdIik7CisJCXJldHVybjsKKwl9CisJaSAtPSBvZmZzZXRvZihzdHJ1Y3QgYW9kdl9yZXJyLCByKTsKKwlkcCA9ICZhcC0+cmVyci5yLmRlc3RbMF07CisJbiA9IGFwLT5yZXJyLnJlcnJfZGMgKiBzaXplb2YoYXAtPnJlcnIuci5kZXN0WzBdKTsKKwlwcmludGYoIiByZXJyICVzIFtpdGVtcyAldV0gWyV1XToiLAorCSAgICBhcC0+cmVyci5yZXJyX2ZsYWdzICYgUkVSUl9OT0RFTEVURSA/ICJbRF0iIDogIiIsCisJICAgIGFwLT5yZXJyLnJlcnJfZGMsIGxlbmd0aCk7CisJdHJ1bmMgPSBuIC0gKGkvc2l6ZW9mKGFwLT5yZXJyLnIuZGVzdFswXSkpOworCWZvciAoOyBpID49IHNpemVvZihhcC0+cmVyci5yLmRlc3RbMF0pOworCSAgICArK2RwLCBpIC09IHNpemVvZihhcC0+cmVyci5yLmRlc3RbMF0pKSB7CisJCXByaW50ZigiIHslc30oJWxkKSIsIGlwYWRkcl9zdHJpbmcoJmRwLT51X2RhKSwKKwkJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZkcC0+dV9kcykpOworCX0KKwlpZiAodHJ1bmMpCisJCXByaW50ZigiW3xyZXJyXSIpOworfQorCitzdGF0aWMgdm9pZAorI2lmZGVmIElORVQ2Cithb2R2X3Y2X3JyZXEoY29uc3QgdW5pb24gYW9kdiAqYXAsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCisjZWxzZQorYW9kdl92Nl9ycmVxKGNvbnN0IHVuaW9uIGFvZHYgKmFwIF9VXywgY29uc3QgdV9jaGFyICpkYXQgX1VfLCB1X2ludCBsZW5ndGgpCisjZW5kaWYKK3sKKyNpZmRlZiBJTkVUNgorCXVfaW50IGk7CisKKwlpZiAoc25hcGVuZCA8IGRhdCkgeworCQlwcmludGYoIiBbfGFvZHZdIik7CisJCXJldHVybjsKKwl9CisJaSA9IG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpOworCWlmIChpIDwgc2l6ZW9mKGFwLT5ycmVxNikpIHsKKwkJcHJpbnRmKCIgW3xycmVxNl0iKTsKKwkJcmV0dXJuOworCX0KKwlpIC09IHNpemVvZihhcC0+cnJlcTYpOworCXByaW50ZigiIHY2IHJyZXEgJXUgJXMlcyVzJXMlc2hvcHMgJXUgaWQgMHglMDhseFxuIgorCSAgICAiXHRkc3QgJXMgc2VxICVsdSBzcmMgJXMgc2VxICVsdSIsIGxlbmd0aCwKKwkgICAgYXAtPnJyZXE2LnJyZXFfdHlwZSAmIFJSRVFfSk9JTiA/ICJbSl0iIDogIiIsCisJICAgIGFwLT5ycmVxNi5ycmVxX3R5cGUgJiBSUkVRX1JFUEFJUiA/ICJbUl0iIDogIiIsCisJICAgIGFwLT5ycmVxNi5ycmVxX3R5cGUgJiBSUkVRX0dSQVQgPyAiW0ddIiA6ICIiLAorCSAgICBhcC0+cnJlcTYucnJlcV90eXBlICYgUlJFUV9ERVNUID8gIltEXSIgOiAiIiwKKwkgICAgYXAtPnJyZXE2LnJyZXFfdHlwZSAmIFJSRVFfVU5LTk9XTiA/ICJbVV0gIiA6ICIgIiwKKwkgICAgYXAtPnJyZXE2LnJyZXFfaG9wcywKKwkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNi5ycmVxX2lkKSwKKwkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVxNi5ycmVxX2RhKSwKKwkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNi5ycmVxX2RzKSwKKwkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVxNi5ycmVxX29hKSwKKwkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNi5ycmVxX29zKSk7CisJaWYgKGkgPj0gc2l6ZW9mKHN0cnVjdCBhb2R2X2V4dCkpCisJCWFvZHZfZXh0ZW5zaW9uKCh2b2lkICopKCZhcC0+cnJlcTYgKyAxKSwgaSk7CisjZWxzZQorCXByaW50ZigiIHY2IHJyZXEgJXUiLCBsZW5ndGgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgSU5FVDYKK2FvZHZfdjZfcnJlcChjb25zdCB1bmlvbiBhb2R2ICphcCwgY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKKyNlbHNlCithb2R2X3Y2X3JyZXAoY29uc3QgdW5pb24gYW9kdiAqYXAgX1VfLCBjb25zdCB1X2NoYXIgKmRhdCBfVV8sIHVfaW50IGxlbmd0aCkKKyNlbmRpZgoreworI2lmZGVmIElORVQ2CisJdV9pbnQgaTsKKworCWlmIChzbmFwZW5kIDwgZGF0KSB7CisJCXByaW50ZigiIFt8YW9kdl0iKTsKKwkJcmV0dXJuOworCX0KKwlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gZGF0KSk7CisJaWYgKGkgPCBzaXplb2YoYXAtPnJyZXA2KSkgeworCQlwcmludGYoIiBbfHJyZXA2XSIpOworCQlyZXR1cm47CisJfQorCWkgLT0gc2l6ZW9mKGFwLT5ycmVwNik7CisJcHJpbnRmKCIgcnJlcCAldSAlcyVzcHJlZml4ICV1IGhvcHMgJXVcbiIKKwkgICAiXHRkc3QgJXMgZHNlcSAlbHUgc3JjICVzICVsdSBtcyIsIGxlbmd0aCwKKwkgICAgYXAtPnJyZXA2LnJyZXBfdHlwZSAmIFJSRVBfUkVQQUlSID8gIltSXSIgOiAiIiwKKwkgICAgYXAtPnJyZXA2LnJyZXBfdHlwZSAmIFJSRVBfQUNLID8gIltBXSAiIDogIiAiLAorCSAgICBhcC0+cnJlcDYucnJlcF9wcyAmIFJSRVBfUFJFRklYX01BU0ssCisJICAgIGFwLT5ycmVwNi5ycmVwX2hvcHMsCisJICAgIGlwNmFkZHJfc3RyaW5nKCZhcC0+cnJlcDYucnJlcF9kYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcDYucnJlcF9kcyksCisJICAgIGlwNmFkZHJfc3RyaW5nKCZhcC0+cnJlcDYucnJlcF9vYSksCisJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcDYucnJlcF9saWZlKSk7CisJaWYgKGkgPj0gc2l6ZW9mKHN0cnVjdCBhb2R2X2V4dCkpCisJCWFvZHZfZXh0ZW5zaW9uKCh2b2lkICopKCZhcC0+cnJlcDYgKyAxKSwgaSk7CisjZWxzZQorCXByaW50ZigiIHJyZXAgJXUiLCBsZW5ndGgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCisjaWZkZWYgSU5FVDYKK2FvZHZfdjZfcmVycihjb25zdCB1bmlvbiBhb2R2ICphcCwgdV9pbnQgbGVuZ3RoKQorI2Vsc2UKK2FvZHZfdjZfcmVycihjb25zdCB1bmlvbiBhb2R2ICphcCBfVV8sIHVfaW50IGxlbmd0aCkKKyNlbmRpZgoreworI2lmZGVmIElORVQ2CisJY29uc3Qgc3RydWN0IHJlcnJfdW5yZWFjaDYgKmRwNiA9IE5VTEw7CisJaW50IGksIGosIG4sIHRydW5jOworCisJaSA9IGxlbmd0aCAtIG9mZnNldG9mKHN0cnVjdCBhb2R2X3JlcnIsIHIpOworCWogPSBzaXplb2YoYXAtPnJlcnIuci5kZXN0NlswXSk7CisJZHA2ID0gJmFwLT5yZXJyLnIuZGVzdDZbMF07CisJbiA9IGFwLT5yZXJyLnJlcnJfZGMgKiBqOworCXByaW50ZigiIHJlcnIgJXMgW2l0ZW1zICV1XSBbJXVdOiIsCisJICAgIGFwLT5yZXJyLnJlcnJfZmxhZ3MgJiBSRVJSX05PREVMRVRFID8gIltEXSIgOiAiIiwKKwkgICAgYXAtPnJlcnIucmVycl9kYywgbGVuZ3RoKTsKKwl0cnVuYyA9IG4gLSAoaS9qKTsKKwlmb3IgKDsgaSAtPSBqID49IDA7ICsrZHA2KSB7CisJCXByaW50ZigiIHslc30oJWxkKSIsIGlwNmFkZHJfc3RyaW5nKCZkcDYtPnVfZGEpLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmRwNi0+dV9kcykpOworCX0KKwlpZiAodHJ1bmMpCisJCXByaW50ZigiW3xyZXJyXSIpOworI2Vsc2UKKwlwcmludGYoIiByZXJyICV1IiwgbGVuZ3RoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorI2lmZGVmIElORVQ2Cithb2R2X3Y2X2RyYWZ0XzAxX3JyZXEoY29uc3QgdW5pb24gYW9kdiAqYXAsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCisjZWxzZQorYW9kdl92Nl9kcmFmdF8wMV9ycmVxKGNvbnN0IHVuaW9uIGFvZHYgKmFwIF9VXywgY29uc3QgdV9jaGFyICpkYXQgX1VfLAorICAgIHVfaW50IGxlbmd0aCkKKyNlbmRpZgoreworI2lmZGVmIElORVQ2CisJdV9pbnQgaTsKKworCWlmIChzbmFwZW5kIDwgZGF0KSB7CisJCXByaW50ZigiIFt8YW9kdl0iKTsKKwkJcmV0dXJuOworCX0KKwlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gZGF0KSk7CisJaWYgKGkgPCBzaXplb2YoYXAtPnJyZXE2X2RyYWZ0XzAxKSkgeworCQlwcmludGYoIiBbfHJyZXE2XSIpOworCQlyZXR1cm47CisJfQorCWkgLT0gc2l6ZW9mKGFwLT5ycmVxNl9kcmFmdF8wMSk7CisJcHJpbnRmKCIgcnJlcSAldSAlcyVzJXMlcyVzaG9wcyAldSBpZCAweCUwOGx4XG4iCisJICAgICJcdGRzdCAlcyBzZXEgJWx1IHNyYyAlcyBzZXEgJWx1IiwgbGVuZ3RoLAorCSAgICBhcC0+cnJlcTZfZHJhZnRfMDEucnJlcV90eXBlICYgUlJFUV9KT0lOID8gIltKXSIgOiAiIiwKKwkgICAgYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfdHlwZSAmIFJSRVFfUkVQQUlSID8gIltSXSIgOiAiIiwKKwkgICAgYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfdHlwZSAmIFJSRVFfR1JBVCA/ICJbR10iIDogIiIsCisJICAgIGFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX3R5cGUgJiBSUkVRX0RFU1QgPyAiW0RdIiA6ICIiLAorCSAgICBhcC0+cnJlcTZfZHJhZnRfMDEucnJlcV90eXBlICYgUlJFUV9VTktOT1dOID8gIltVXSAiIDogIiAiLAorCSAgICBhcC0+cnJlcTZfZHJhZnRfMDEucnJlcV9ob3BzLAorCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfaWQpLAorCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfZGEpLAorCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfZHMpLAorCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfb2EpLAorCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfb3MpKTsKKwlpZiAoaSA+PSBzaXplb2Yoc3RydWN0IGFvZHZfZXh0KSkKKwkJYW9kdl9leHRlbnNpb24oKHZvaWQgKikoJmFwLT5ycmVxNl9kcmFmdF8wMSArIDEpLCBpKTsKKyNlbHNlCisJcHJpbnRmKCIgcnJlcSAldSIsIGxlbmd0aCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKKyNpZmRlZiBJTkVUNgorYW9kdl92Nl9kcmFmdF8wMV9ycmVwKGNvbnN0IHVuaW9uIGFvZHYgKmFwLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQorI2Vsc2UKK2FvZHZfdjZfZHJhZnRfMDFfcnJlcChjb25zdCB1bmlvbiBhb2R2ICphcCBfVV8sIGNvbnN0IHVfY2hhciAqZGF0IF9VXywKKyAgICB1X2ludCBsZW5ndGgpCisjZW5kaWYKK3sKKyNpZmRlZiBJTkVUNgorCXVfaW50IGk7CisKKwlpZiAoc25hcGVuZCA8IGRhdCkgeworCQlwcmludGYoIiBbfGFvZHZdIik7CisJCXJldHVybjsKKwl9CisJaSA9IG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpOworCWlmIChpIDwgc2l6ZW9mKGFwLT5ycmVwNl9kcmFmdF8wMSkpIHsKKwkJcHJpbnRmKCIgW3xycmVwNl0iKTsKKwkJcmV0dXJuOworCX0KKwlpIC09IHNpemVvZihhcC0+cnJlcDZfZHJhZnRfMDEpOworCXByaW50ZigiIHJyZXAgJXUgJXMlc3ByZWZpeCAldSBob3BzICV1XG4iCisJICAgIlx0ZHN0ICVzIGRzZXEgJWx1IHNyYyAlcyAlbHUgbXMiLCBsZW5ndGgsCisJICAgIGFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX3R5cGUgJiBSUkVQX1JFUEFJUiA/ICJbUl0iIDogIiIsCisJICAgIGFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX3R5cGUgJiBSUkVQX0FDSyA/ICJbQV0gIiA6ICIgIiwKKwkgICAgYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfcHMgJiBSUkVQX1BSRUZJWF9NQVNLLAorCSAgICBhcC0+cnJlcDZfZHJhZnRfMDEucnJlcF9ob3BzLAorCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfZGEpLAorCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfZHMpLAorCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfb2EpLAorCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfbGlmZSkpOworCWlmIChpID49IHNpemVvZihzdHJ1Y3QgYW9kdl9leHQpKQorCQlhb2R2X2V4dGVuc2lvbigodm9pZCAqKSgmYXAtPnJyZXA2X2RyYWZ0XzAxICsgMSksIGkpOworI2Vsc2UKKwlwcmludGYoIiBycmVwICV1IiwgbGVuZ3RoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorI2lmZGVmIElORVQ2Cithb2R2X3Y2X2RyYWZ0XzAxX3JlcnIoY29uc3QgdW5pb24gYW9kdiAqYXAsIHVfaW50IGxlbmd0aCkKKyNlbHNlCithb2R2X3Y2X2RyYWZ0XzAxX3JlcnIoY29uc3QgdW5pb24gYW9kdiAqYXAgX1VfLCB1X2ludCBsZW5ndGgpCisjZW5kaWYKK3sKKyNpZmRlZiBJTkVUNgorCWNvbnN0IHN0cnVjdCByZXJyX3VucmVhY2g2X2RyYWZ0XzAxICpkcDYgPSBOVUxMOworCWludCBpLCBqLCBuLCB0cnVuYzsKKworCWkgPSBsZW5ndGggLSBvZmZzZXRvZihzdHJ1Y3QgYW9kdl9yZXJyLCByKTsKKwlqID0gc2l6ZW9mKGFwLT5yZXJyLnIuZGVzdDZfZHJhZnRfMDFbMF0pOworCWRwNiA9ICZhcC0+cmVyci5yLmRlc3Q2X2RyYWZ0XzAxWzBdOworCW4gPSBhcC0+cmVyci5yZXJyX2RjICogajsKKwlwcmludGYoIiByZXJyICVzIFtpdGVtcyAldV0gWyV1XToiLAorCSAgICBhcC0+cmVyci5yZXJyX2ZsYWdzICYgUkVSUl9OT0RFTEVURSA/ICJbRF0iIDogIiIsCisJICAgIGFwLT5yZXJyLnJlcnJfZGMsIGxlbmd0aCk7CisJdHJ1bmMgPSBuIC0gKGkvaik7CisJZm9yICg7IGkgLT0gaiA+PSAwOyArK2RwNikgeworCQlwcmludGYoIiB7JXN9KCVsZCkiLCBpcDZhZGRyX3N0cmluZygmZHA2LT51X2RhKSwKKwkJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZkcDYtPnVfZHMpKTsKKwl9CisJaWYgKHRydW5jKQorCQlwcmludGYoIlt8cmVycl0iKTsKKyNlbHNlCisJcHJpbnRmKCIgcmVyciAldSIsIGxlbmd0aCk7CisjZW5kaWYKK30KKwordm9pZAorYW9kdl9wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoLCBpbnQgaXNfaXA2KQoreworCWNvbnN0IHVuaW9uIGFvZHYgKmFwOworCisJYXAgPSAodW5pb24gYW9kdiAqKWRhdDsKKwlpZiAoc25hcGVuZCA8IGRhdCkgeworCQlwcmludGYoIiBbfGFvZHZdIik7CisJCXJldHVybjsKKwl9CisJaWYgKG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpIDwgc2l6ZW9mKGFwLT5ycmVwX2FjaykpIHsKKwkJcHJpbnRmKCIgW3xhb2R2XSIpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiIGFvZHYiKTsKKworCXN3aXRjaCAoYXAtPnJlcnIucmVycl90eXBlKSB7CisKKwljYXNlIEFPRFZfUlJFUToKKwkJaWYgKGlzX2lwNikKKwkJCWFvZHZfdjZfcnJlcShhcCwgZGF0LCBsZW5ndGgpOworCQllbHNlCisJCQlhb2R2X3JyZXEoYXAsIGRhdCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFPRFZfUlJFUDoKKwkJaWYgKGlzX2lwNikKKwkJCWFvZHZfdjZfcnJlcChhcCwgZGF0LCBsZW5ndGgpOworCQllbHNlCisJCQlhb2R2X3JyZXAoYXAsIGRhdCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFPRFZfUkVSUjoKKwkJaWYgKGlzX2lwNikKKwkJCWFvZHZfdjZfcmVycihhcCwgbGVuZ3RoKTsKKwkJZWxzZQorCQkJYW9kdl9yZXJyKGFwLCBkYXQsIGxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBBT0RWX1JSRVBfQUNLOgorCQlwcmludGYoIiBycmVwLWFjayAldSIsIGxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBBT0RWX1Y2X0RSQUZUXzAxX1JSRVE6CisJCWFvZHZfdjZfZHJhZnRfMDFfcnJlcShhcCwgZGF0LCBsZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgQU9EVl9WNl9EUkFGVF8wMV9SUkVQOgorCQlhb2R2X3Y2X2RyYWZ0XzAxX3JyZXAoYXAsIGRhdCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIEFPRFZfVjZfRFJBRlRfMDFfUkVSUjoKKwkJYW9kdl92Nl9kcmFmdF8wMV9yZXJyKGFwLCBsZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgQU9EVl9WNl9EUkFGVF8wMV9SUkVQX0FDSzoKKwkJcHJpbnRmKCIgcnJlcC1hY2sgJXUiLCBsZW5ndGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiICV1ICV1IiwgYXAtPnJyZXEucnJlcV90eXBlLCBsZW5ndGgpOworCX0KK30KZGlmZiAtLWdpdCBhL3ByaW50LWFwMTM5NC5jIGIvcHJpbnQtYXAxMzk0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxY2UzNAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWFwMTM5NC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWFwMTM5NC5jLHYgMS4zLjIuMSAyMDA1LzA3LzA3IDAxOjI0OjMzIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorCisvKgorICogU3RydWN0dXJlIG9mIGEgaGVhZGVyIGZvciBBcHBsZSdzIElQLW92ZXItSUVFRSAxMzg0IEJQRiBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRklSRVdJUkVfRVVJNjRfTEVOCTgKK3N0cnVjdCBmaXJld2lyZV9oZWFkZXIgeworCXVfY2hhciAgZmlyZXdpcmVfZGhvc3RbRklSRVdJUkVfRVVJNjRfTEVOXTsKKwl1X2NoYXIgIGZpcmV3aXJlX3Nob3N0W0ZJUkVXSVJFX0VVSTY0X0xFTl07CisJdV9zaG9ydCBmaXJld2lyZV90eXBlOworfTsKKworLyoKKyAqIExlbmd0aCBvZiB0aGF0IGhlYWRlcjsgbm90ZSB0aGF0IHNvbWUgY29tcGlsZXJzIG1heSBwYWQKKyAqICJzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyIiB0byBhIG11bHRpcGxlIG9mIDQgYnl0ZXMsIGZvciBleGFtcGxlLCBzbworICogInNpemVvZiAoc3RydWN0IGZpcmV3aXJlX2hlYWRlcikiIG1heSBub3QgZ2l2ZSB0aGUgcmlnaHQgYW5zd2VyLgorICovCisjZGVmaW5lIEZJUkVXSVJFX0hEUkxFTgkJMTgKKworc3RhdGljIGlubGluZSB2b2lkCithcDEzOTRfaGRyX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyICpmcDsKKwlmcCA9IChjb25zdCBzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyICopYnA7CisKKwkodm9pZClwcmludGYoIiVzID4gJXMiLAorCQkgICAgIGxpbmthZGRyX3N0cmluZyhmcC0+ZmlyZXdpcmVfZGhvc3QsIEZJUkVXSVJFX0VVSTY0X0xFTiksCisJCSAgICAgbGlua2FkZHJfc3RyaW5nKGZwLT5maXJld2lyZV9zaG9zdCwgRklSRVdJUkVfRVVJNjRfTEVOKSk7CisKKwlpZiAoIXFmbGFnKSB7CisJCSh2b2lkKXByaW50ZigiLCBldGhlcnR5cGUgJXMgKDB4JTA0eCkiLAorCQkJICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biIsIG50b2hzKGZwLT5maXJld2lyZV90eXBlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoZnAtPmZpcmV3aXJlX3R5cGUpKTsJICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsICVzIiwgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCJVbmtub3duIEV0aGVydHlwZSAoMHglMDR4KSIsIG50b2hzKGZwLT5maXJld2lyZV90eXBlKSkpOyAgCisgICAgICAgIH0KKworCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBldGhlciBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgorICovCit1X2ludAorYXAxMzk0X2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCXVfaW50IGxlbmd0aCA9IGgtPmxlbjsKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJc3RydWN0IGZpcmV3aXJlX2hlYWRlciAqZnA7CisJdV9zaG9ydCBldGhlcl90eXBlOworCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVyX3R5cGU7CisKKwlpZiAoY2FwbGVuIDwgRklSRVdJUkVfSERSTEVOKSB7CisJCXByaW50ZigiW3xhcDEzOTRdIik7CisJCXJldHVybiBGSVJFV0lSRV9IRFJMRU47CisJfQorCisJaWYgKGVmbGFnKQorCQlhcDEzOTRfaGRyX3ByaW50KHAsIGxlbmd0aCk7CisKKwlsZW5ndGggLT0gRklSRVdJUkVfSERSTEVOOworCWNhcGxlbiAtPSBGSVJFV0lSRV9IRFJMRU47CisJZnAgPSAoc3RydWN0IGZpcmV3aXJlX2hlYWRlciAqKXA7CisJcCArPSBGSVJFV0lSRV9IRFJMRU47CisKKwlldGhlcl90eXBlID0gbnRvaHMoZnAtPmZpcmV3aXJlX3R5cGUpOworCisJZXh0cmFjdGVkX2V0aGVyX3R5cGUgPSAwOworCWlmIChldGhlcl9lbmNhcF9wcmludChldGhlcl90eXBlLCBwLCBsZW5ndGgsIGNhcGxlbiwKKwkgICAgJmV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7CisJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCWlmICghZWZsYWcpCisJCQlhcDEzOTRfaGRyX3ByaW50KCh1X2NoYXIgKilmcCwgbGVuZ3RoICsgRklSRVdJUkVfSERSTEVOKTsKKworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfSAKKworCXJldHVybiBGSVJFV0lSRV9IRFJMRU47Cit9CmRpZmYgLS1naXQgYS9wcmludC1hcmNuZXQuYyBiL3ByaW50LWFyY25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjljMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1hcmNuZXQuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZyb206IE5ldEJTRDogcHJpbnQtYXJjbmV0LmMsdiAxLjIgMjAwMC8wNC8yNCAxMzowMjoyOCBpdG9qdW4gRXhwCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWFyY25ldC5jLHYgMS4yMCAyMDA1LzA0LzA2IDIxOjMyOjM4IG1jciBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYXJjbmV0LmgiCisKK3N0YXRpYyBpbnQgYXJjbmV0X2VuY2FwX3ByaW50KHVfY2hhciBhcmN0eXBlLCBjb25zdCB1X2NoYXIgKnAsCisgICAgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pOworCitzdHJ1Y3QgdG9rIGFyY3R5cGVtYXBbXSA9IHsKKwl7IEFSQ1RZUEVfSVBfT0xELAkib2xkaXAiIH0sCisJeyBBUkNUWVBFX0FSUF9PTEQsCSJvbGRhcnAiIH0sCisJeyBBUkNUWVBFX0lQLAkJImlwIiB9LAorCXsgQVJDVFlQRV9BUlAsCQkiYXJwIiB9LAorCXsgQVJDVFlQRV9SRVZBUlAsCSJyYXJwIiB9LAorCXsgQVJDVFlQRV9BVEFMSywJImF0YWxrIiB9LAorCXsgQVJDVFlQRV9CQU5JQU4sCSJiYW55YW4iIH0sCisJeyBBUkNUWVBFX0lQWCwJCSJpcHgiIH0sCisJeyBBUkNUWVBFX0lORVQ2LAkiaXB2NiIgfSwKKwl7IEFSQ1RZUEVfRElBR05PU0UsCSJkaWFnIiB9LAorCXsgMCwgMCB9Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2FyY25ldF9wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIGludCBwaGRzLCBpbnQgZmxhZywgdV9pbnQgc2VxaWQpCit7CisJY29uc3Qgc3RydWN0IGFyY19oZWFkZXIgKmFwOworCWNvbnN0IGNoYXIgKmFyY3R5cGVuYW1lOworCisKKwlhcCA9IChjb25zdCBzdHJ1Y3QgYXJjX2hlYWRlciAqKWJwOworCisKKwlpZiAocWZsYWcpIHsKKwkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJWQ6ICIsCisJCQkgICAgIGFwLT5hcmNfc2hvc3QsCisJCQkgICAgIGFwLT5hcmNfZGhvc3QsCisJCQkgICAgIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwlhcmN0eXBlbmFtZSA9IHRvazJzdHIoYXJjdHlwZW1hcCwgIiUwMngiLCBhcC0+YXJjX3R5cGUpOworCisJaWYgKCFwaGRzKSB7CisJCSh2b2lkKXByaW50ZigiJTAyeCAlMDJ4ICVzICVkOiAiLAorCQkJICAgICBhcC0+YXJjX3Nob3N0LCBhcC0+YXJjX2Rob3N0LCBhcmN0eXBlbmFtZSwKKwkJCSAgICAgbGVuZ3RoKTsKKwkJCSAgICAgcmV0dXJuOworCX0KKworCWlmIChmbGFnID09IDApIHsKKwkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJXMgc2VxaWQgJTA0eCAlZDogIiwKKwkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKKwkJCWxlbmd0aCk7CisJCQlyZXR1cm47CisJfQorCisJaWYgKGZsYWcgJiAxKQorCQkodm9pZClwcmludGYoIiUwMnggJTAyeCAlcyBzZXFpZCAlMDR4ICIKKwkJCSIoZmlyc3Qgb2YgJWQgZnJhZ21lbnRzKSAlZDogIiwKKwkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKKwkJCShmbGFnICsgMykgLyAyLCBsZW5ndGgpOworCWVsc2UKKwkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJXMgc2VxaWQgJTA0eCAiCisJCQkiKGZyYWdtZW50ICVkKSAlZDogIiwKKwkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKKwkJCWZsYWcvMiArIDEsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBBUkNORVQgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqLwordV9pbnQKK2FyY25ldF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCWNvbnN0IHN0cnVjdCBhcmNfaGVhZGVyICphcDsKKworCWludCBwaGRzLCBmbGFnID0gMCwgYXJjaGRybGVuID0gMDsKKwl1X2ludCBzZXFpZCA9IDA7CisJdV9jaGFyIGFyY190eXBlOworCisJaWYgKGNhcGxlbiA8IEFSQ19IRFJMRU4pIHsKKwkJcHJpbnRmKCJbfGFyY25ldF0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCWFwID0gKGNvbnN0IHN0cnVjdCBhcmNfaGVhZGVyICopcDsKKwlhcmNfdHlwZSA9IGFwLT5hcmNfdHlwZTsKKworCXN3aXRjaCAoYXJjX3R5cGUpIHsKKwlkZWZhdWx0OgorCQlwaGRzID0gMTsKKwkJYnJlYWs7CisJY2FzZSBBUkNUWVBFX0lQX09MRDoKKwljYXNlIEFSQ1RZUEVfQVJQX09MRDoKKwljYXNlIEFSQ1RZUEVfRElBR05PU0U6CisJCXBoZHMgPSAwOworCQlhcmNoZHJsZW4gPSBBUkNfSERSTEVOOworCQlicmVhazsKKwl9CisKKwlpZiAocGhkcykgeworCQlpZiAoY2FwbGVuIDwgQVJDX0hEUk5FV0xFTikgeworCQkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7CisJCQlwcmludGYoIlt8cGhkc10iKTsKKwkJCXJldHVybiAoY2FwbGVuKTsKKwkJfQorCisJCWlmIChhcC0+YXJjX2ZsYWcgPT0gMHhmZikgeworCQkJaWYgKGNhcGxlbiA8IEFSQ19IRFJORVdMRU5fRVhDKSB7CisJCQkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7CisJCQkJcHJpbnRmKCJbfHBoZHMgZXh0ZW5kZWRdIik7CisJCQkJcmV0dXJuIChjYXBsZW4pOworCQkJfQorCQkJZmxhZyA9IGFwLT5hcmNfZmxhZzI7CisJCQlzZXFpZCA9IG50b2hzKGFwLT5hcmNfc2VxaWQyKTsKKwkJCWFyY2hkcmxlbiA9IEFSQ19IRFJORVdMRU5fRVhDOworCQl9IGVsc2UgeworCQkJZmxhZyA9IGFwLT5hcmNfZmxhZzsKKwkJCXNlcWlkID0gbnRvaHMoYXAtPmFyY19zZXFpZCk7CisJCQlhcmNoZHJsZW4gPSBBUkNfSERSTkVXTEVOOworCQl9CisJfQorCisKKwlpZiAoZWZsYWcpCisJCWFyY25ldF9wcmludChwLCBsZW5ndGgsIHBoZHMsIGZsYWcsIHNlcWlkKTsKKworCS8qCisJICogR28gcGFzdCB0aGUgQVJDTkVUIGhlYWRlci4KKwkgKi8KKwlsZW5ndGggLT0gYXJjaGRybGVuOworCWNhcGxlbiAtPSBhcmNoZHJsZW47CisJcCArPSBhcmNoZHJsZW47CisKKwlpZiAocGhkcyAmJiBmbGFnICYmIChmbGFnICYgMSkgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEgbWlkZGxlIGZyYWdtZW50LgorCQkgKi8KKwkJcmV0dXJuIChhcmNoZHJsZW4pOworCX0KKworCWlmICghYXJjbmV0X2VuY2FwX3ByaW50KGFyY190eXBlLCBwLCBsZW5ndGgsIGNhcGxlbikpCisJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKworCXJldHVybiAoYXJjaGRybGVuKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cworICogdG8gdGhlIEFSQ05FVCBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLiAgSXQgaXMgcXVpdGUgc2ltaWxhcgorICogdG8gdGhlIG5vbi1MaW51eCBzdHlsZSBwcmludGVyIGV4Y2VwdCB0aGF0IExpbnV4IGRvZXNuJ3QgZXZlcgorICogc3VwcGx5IHBhY2tldHMgdGhhdCBsb29rIGxpa2UgZXhjZXB0aW9uIGZyYW1lcywgaXQgYWx3YXlzIHN1cHBsaWVzCisgKiByZWFzc2VtYmxlZCBwYWNrZXRzIHJhdGhlciB0aGFuIHJhdyBmcmFtZXMsIGFuZCBoZWFkZXJzIGhhdmUgYW4KKyAqIGV4dHJhICJvZmZzZXQiIGZpZWxkIGJldHdlZW4gdGhlIHNyYy9kZXN0IGFuZCBwYWNrZXQgdHlwZS4KKyAqLwordV9pbnQKK2FyY25ldF9saW51eF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCWNvbnN0IHN0cnVjdCBhcmNfbGludXhfaGVhZGVyICphcDsKKworCWludCBhcmNoZHJsZW4gPSAwOworCXVfY2hhciBhcmNfdHlwZTsKKworCWlmIChjYXBsZW4gPCBBUkNfTElOVVhfSERSTEVOKSB7CisJCXByaW50ZigiW3xhcmNuZXRdIik7CisJCXJldHVybiAoY2FwbGVuKTsKKwl9CisKKwlhcCA9IChjb25zdCBzdHJ1Y3QgYXJjX2xpbnV4X2hlYWRlciAqKXA7CisJYXJjX3R5cGUgPSBhcC0+YXJjX3R5cGU7CisKKwlzd2l0Y2ggKGFyY190eXBlKSB7CisJZGVmYXVsdDoKKwkJYXJjaGRybGVuID0gQVJDX0xJTlVYX0hEUk5FV0xFTjsKKwkJaWYgKGNhcGxlbiA8IEFSQ19MSU5VWF9IRFJORVdMRU4pIHsKKwkJCXByaW50ZigiW3xhcmNuZXRdIik7CisJCQlyZXR1cm4gKGNhcGxlbik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBUkNUWVBFX0lQX09MRDoKKwljYXNlIEFSQ1RZUEVfQVJQX09MRDoKKwljYXNlIEFSQ1RZUEVfRElBR05PU0U6CisJCWFyY2hkcmxlbiA9IEFSQ19MSU5VWF9IRFJMRU47CisJCWJyZWFrOworCX0KKworCWlmIChlZmxhZykKKwkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7CisKKwkvKgorCSAqIEdvIHBhc3QgdGhlIEFSQ05FVCBoZWFkZXIuCisJICovCisJbGVuZ3RoIC09IGFyY2hkcmxlbjsKKwljYXBsZW4gLT0gYXJjaGRybGVuOworCXAgKz0gYXJjaGRybGVuOworCisJaWYgKCFhcmNuZXRfZW5jYXBfcHJpbnQoYXJjX3R5cGUsIHAsIGxlbmd0aCwgY2FwbGVuKSkKKwkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOworCisJcmV0dXJuIChhcmNoZHJsZW4pOworfQorCisvKgorICogUHJpbnRzIHRoZSBwYWNrZXQgZW5jYXBzdWxhdGVkIGluIGFuIEFSQ25ldCBkYXRhIGZpZWxkLAorICogZ2l2ZW4gdGhlIEFSQ25ldCBzeXN0ZW0gY29kZS4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IGNhbiBkbyBzbywgemVybyBpZiB0aGUgc3lzdGVtIGNvZGUgaXMgdW5rbm93bi4KKyAqLworCisKK3N0YXRpYyBpbnQKK2FyY25ldF9lbmNhcF9wcmludCh1X2NoYXIgYXJjdHlwZSwgY29uc3QgdV9jaGFyICpwLAorICAgIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCXN3aXRjaCAoYXJjdHlwZSkgeworCisJY2FzZSBBUkNUWVBFX0lQX09MRDoKKwljYXNlIEFSQ1RZUEVfSVA6CisJICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisjaWZkZWYgSU5FVDYKKwljYXNlIEFSQ1RZUEVfSU5FVDY6CisJCWlwNl9wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworI2VuZGlmIC8qSU5FVDYqLworCisJY2FzZSBBUkNUWVBFX0FSUF9PTEQ6CisJY2FzZSBBUkNUWVBFX0FSUDoKKwljYXNlIEFSQ1RZUEVfUkVWQVJQOgorCSAgYXJwX3ByaW50KGduZG8sIHAsIGxlbmd0aCwgY2FwbGVuKTsKKwkJcmV0dXJuICgxKTsKKworCWNhc2UgQVJDVFlQRV9BVEFMSzoJLyogWFhYIHdhcyB0aGlzIGV2ZXIgdXNlZD8gKi8KKwkJaWYgKHZmbGFnKQorCQkJZnB1dHMoImV0MSAiLCBzdGRvdXQpOworCQlhdGFsa19wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBBUkNUWVBFX0lQWDoKKwkJaXB4X3ByaW50KHAsIGxlbmd0aCk7CisJCXJldHVybiAoMSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKDApOworCX0KK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IGJzZAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL3ByaW50LWFycC5jIGIvcHJpbnQtYXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlOWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWFycC5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYXJwLmMsdiAxLjY0IDIwMDQvMDQvMzAgMTY6NDI6MTQgbWNyIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIm5ldGRpc3NlY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXIuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKy8qCisgKiBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wuCisgKgorICogU2VlIFJGQyA4MjYgZm9yIHByb3RvY29sIGRlc2NyaXB0aW9uLiAgQVJQIHBhY2tldHMgYXJlIHZhcmlhYmxlCisgKiBpbiBzaXplOyB0aGUgYXJwaGRyIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbi4KKyAqIFByb3RvY29sIHR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgMTAgTWIvcyBFdGhlcm5ldC4KKyAqIEl0IGlzIGZvbGxvd2VkIGJ5IHRoZSB2YXJpYWJsZS1zaXplZCBmaWVsZHMgYXJfc2hhLCBhcnBfc3BhLAorICogYXJwX3RoYSBhbmQgYXJwX3RwYSBpbiB0aGF0IG9yZGVyLCBhY2NvcmRpbmcgdG8gdGhlIGxlbmd0aHMKKyAqIHNwZWNpZmllZC4gIEZpZWxkIG5hbWVzIHVzZWQgY29ycmVzcG9uZCB0byBSRkMgODI2LgorICovCitzdHJ1Y3QJYXJwX3BrdGhkciB7CisJdV9zaG9ydAlhcl9ocmQ7CQkvKiBmb3JtYXQgb2YgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBBUlBIUkRfRVRIRVIgCTEJLyogZXRoZXJuZXQgaGFyZHdhcmUgZm9ybWF0ICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyCTYJLyogdG9rZW4tcmluZyBoYXJkd2FyZSBmb3JtYXQgKi8KKyNkZWZpbmUgQVJQSFJEX0FSQ05FVAk3CS8qIGFyY25ldCBoYXJkd2FyZSBmb3JtYXQgKi8KKyNkZWZpbmUgQVJQSFJEX0ZSRUxBWSAJMTUJLyogZnJhbWUgcmVsYXkgaGFyZHdhcmUgZm9ybWF0ICovCisjZGVmaW5lIEFSUEhSRF9TVFJJUCAJMjMJLyogUmljb2NoZXQgU3Rhcm1vZGUgUmFkaW8gaGFyZHdhcmUgZm9ybWF0ICovCisjZGVmaW5lIEFSUEhSRF9JRUVFMTM5NAkyNAkvKiBJRUVFIDEzOTQgKEZpcmVXaXJlKSBoYXJkd2FyZSBmb3JtYXQgKi8KKwl1X3Nob3J0CWFyX3BybzsJCS8qIGZvcm1hdCBvZiBwcm90b2NvbCBhZGRyZXNzICovCisJdV9jaGFyCWFyX2hsbjsJCS8qIGxlbmd0aCBvZiBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9jaGFyCWFyX3BsbjsJCS8qIGxlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzICovCisJdV9zaG9ydAlhcl9vcDsJCS8qIG9uZSBvZjogKi8KKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCS8qIHJlcXVlc3QgdG8gcmVzb2x2ZSBhZGRyZXNzICovCisjZGVmaW5lCUFSUE9QX1JFUExZCTIJLyogcmVzcG9uc2UgdG8gcHJldmlvdXMgcmVxdWVzdCAqLworI2RlZmluZQlBUlBPUF9SRVZSRVFVRVNUIDMJLyogcmVxdWVzdCBwcm90b2NvbCBhZGRyZXNzIGdpdmVuIGhhcmR3YXJlICovCisjZGVmaW5lCUFSUE9QX1JFVlJFUExZCTQJLyogcmVzcG9uc2UgZ2l2aW5nIHByb3RvY29sIGFkZHJlc3MgKi8KKyNkZWZpbmUgQVJQT1BfSU5WUkVRVUVTVCA4IAkvKiByZXF1ZXN0IHRvIGlkZW50aWZ5IHBlZXIgKi8KKyNkZWZpbmUgQVJQT1BfSU5WUkVQTFkJOQkvKiByZXNwb25zZSBpZGVudGlmeWluZyBwZWVyICovCisvKgorICogVGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIHZhcmlhYmxlIGluIHNpemUsCisgKiBhY2NvcmRpbmcgdG8gdGhlIHNpemVzIGFib3ZlLgorICovCisjaWZkZWYgQ09NTUVOVF9PTkxZCisJdV9jaGFyCWFyX3NoYVtdOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVfY2hhcglhcl9zcGFbXTsJLyogc2VuZGVyIHByb3RvY29sIGFkZHJlc3MgKi8KKwl1X2NoYXIJYXJfdGhhW107CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzICovCisJdV9jaGFyCWFyX3RwYVtdOwkvKiB0YXJnZXQgcHJvdG9jb2wgYWRkcmVzcyAqLworI2VuZGlmCisjZGVmaW5lIGFyX3NoYShhcCkJKCgoY29uc3QgdV9jaGFyICopKChhcCkrMSkpKzApCisjZGVmaW5lIGFyX3NwYShhcCkJKCgoY29uc3QgdV9jaGFyICopKChhcCkrMSkpKyAgKGFwKS0+YXJfaGxuKQorI2RlZmluZSBhcl90aGEoYXApCSgoKGNvbnN0IHVfY2hhciAqKSgoYXApKzEpKSsgIChhcCktPmFyX2hsbisoYXApLT5hcl9wbG4pCisjZGVmaW5lIGFyX3RwYShhcCkJKCgoY29uc3QgdV9jaGFyICopKChhcCkrMSkpKzIqKGFwKS0+YXJfaGxuKyhhcCktPmFyX3BsbikKK307CisKKyNkZWZpbmUgQVJQX0hEUkxFTgk4CisKKyNkZWZpbmUgSFJEKGFwKSBFWFRSQUNUXzE2QklUUygmKGFwKS0+YXJfaHJkKQorI2RlZmluZSBITE4oYXApICgoYXApLT5hcl9obG4pCisjZGVmaW5lIFBMTihhcCkgKChhcCktPmFyX3BsbikKKyNkZWZpbmUgT1AoYXApICBFWFRSQUNUXzE2QklUUygmKGFwKS0+YXJfb3ApCisjZGVmaW5lIFBSTyhhcCkgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFyX3BybykKKyNkZWZpbmUgU0hBKGFwKSAoYXJfc2hhKGFwKSkKKyNkZWZpbmUgU1BBKGFwKSAoYXJfc3BhKGFwKSkKKyNkZWZpbmUgVEhBKGFwKSAoYXJfdGhhKGFwKSkKKyNkZWZpbmUgVFBBKGFwKSAoYXJfdHBhKGFwKSkKKworLyoKKyAqIEFUTSBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wuCisgKgorICogU2VlIFJGQyAyMjI1IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIEFUTUFSUCBwYWNrZXRzIGFyZSBzaW1pbGFyCisgKiB0byBBUlAgcGFja2V0cywgZXhjZXB0IHRoYXQgdGhlcmUgYXJlIG5vIGxlbmd0aCBmaWVsZHMgZm9yIHRoZQorICogcHJvdG9jb2wgYWRkcmVzcyAtIGluc3RlYWQsIHRoZXJlIGFyZSB0eXBlL2xlbmd0aCBmaWVsZHMgZm9yCisgKiB0aGUgQVRNIG51bWJlciBhbmQgc3ViYWRkcmVzcyAtIGFuZCB0aGUgaGFyZHdhcmUgYWRkcmVzc2VzIGNvbnNpc3QKKyAqIG9mIGFuIEFUTSBudW1iZXIgYW5kIGFuIEFUTSBzdWJhZGRyZXNzLgorICovCitzdHJ1Y3QJYXRtYXJwX3BrdGhkciB7CisJdV9zaG9ydAlhYXJfaHJkOwkvKiBmb3JtYXQgb2YgaGFyZHdhcmUgYWRkcmVzcyAqLworI2RlZmluZSBBUlBIUkRfQVRNMjIyNQkxOQkvKiBBVE0gKFJGQyAyMjI1KSAqLworCXVfc2hvcnQJYWFyX3BybzsJLyogZm9ybWF0IG9mIHByb3RvY29sIGFkZHJlc3MgKi8KKwl1X2NoYXIJYWFyX3NodGw7CS8qIGxlbmd0aCBvZiBzb3VyY2UgQVRNIG51bWJlciAqLworCXVfY2hhcglhYXJfc3N0bDsJLyogbGVuZ3RoIG9mIHNvdXJjZSBBVE0gc3ViYWRkcmVzcyAqLworI2RlZmluZSBBVE1BUlBfSVNfRTE2NAkweDQwCS8qIGJpdCBpbiB0eXBlL2xlbmd0aCBmb3IgRS4xNjQgZm9ybWF0ICovCisjZGVmaW5lIEFUTUFSUF9MRU5fTUFTSwkweDNGCS8qIGxlbmd0aCBvZiB7c3VifWFkZHJlc3MgaW4gdHlwZS9sZW5ndGggKi8KKwl1X3Nob3J0CWFhcl9vcDsJCS8qIHNhbWUgYXMgcmVndWxhciBBUlAgKi8KKyNkZWZpbmUgQVRNQVJQT1BfTkFLCTEwCS8qIE5BSyAqLworCXVfY2hhcglhYXJfc3BsbjsJLyogbGVuZ3RoIG9mIHNvdXJjZSBwcm90b2NvbCBhZGRyZXNzICovCisJdV9jaGFyCWFhcl90aHRsOwkvKiBsZW5ndGggb2YgdGFyZ2V0IEFUTSBudW1iZXIgKi8KKwl1X2NoYXIJYWFyX3RzdGw7CS8qIGxlbmd0aCBvZiB0YXJnZXQgQVRNIHN1YmFkZHJlc3MgKi8KKwl1X2NoYXIJYWFyX3RwbG47CS8qIGxlbmd0aCBvZiB0YXJnZXQgcHJvdG9jb2wgYWRkcmVzcyAqLworLyoKKyAqIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSB2YXJpYWJsZSBpbiBzaXplLAorICogYWNjb3JkaW5nIHRvIHRoZSBzaXplcyBhYm92ZS4KKyAqLworI2lmZGVmIENPTU1FTlRfT05MWQorCXVfY2hhcglhYXJfc2hhW107CS8qIHNvdXJjZSBBVE0gbnVtYmVyICovCisJdV9jaGFyCWFhcl9zc2FbXTsJLyogc291cmNlIEFUTSBzdWJhZGRyZXNzICovCisJdV9jaGFyCWFhcl9zcGFbXTsJLyogc2VuZGVyIHByb3RvY29sIGFkZHJlc3MgKi8KKwl1X2NoYXIJYWFyX3RoYVtdOwkvKiB0YXJnZXQgQVRNIG51bWJlciAqLworCXVfY2hhcglhYXJfdHNhW107CS8qIHRhcmdldCBBVE0gc3ViYWRkcmVzcyAqLworCXVfY2hhcglhYXJfdHBhW107CS8qIHRhcmdldCBwcm90b2NvbCBhZGRyZXNzICovCisjZW5kaWYKKworI2RlZmluZSBBVE1IUkQoYXApICBFWFRSQUNUXzE2QklUUygmKGFwKS0+YWFyX2hyZCkKKyNkZWZpbmUgQVRNU0hMTihhcCkgKChhcCktPmFhcl9zaHRsICYgQVRNQVJQX0xFTl9NQVNLKQorI2RlZmluZSBBVE1TU0xOKGFwKSAoKGFwKS0+YWFyX3NzdGwgJiBBVE1BUlBfTEVOX01BU0spCisjZGVmaW5lIEFUTVNQTE4oYXApICgoYXApLT5hYXJfc3BsbikKKyNkZWZpbmUgQVRNT1AoYXApICAgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFhcl9vcCkKKyNkZWZpbmUgQVRNUFJPKGFwKSAgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFhcl9wcm8pCisjZGVmaW5lIEFUTVRITE4oYXApICgoYXApLT5hYXJfdGh0bCAmIEFUTUFSUF9MRU5fTUFTSykKKyNkZWZpbmUgQVRNVFNMTihhcCkgKChhcCktPmFhcl90c3RsICYgQVRNQVJQX0xFTl9NQVNLKQorI2RlZmluZSBBVE1UUExOKGFwKSAoKGFwKS0+YWFyX3RwbG4pCisjZGVmaW5lIGFhcl9zaGEoYXApCSgoY29uc3QgdV9jaGFyICopKChhcCkrMSkpCisjZGVmaW5lIGFhcl9zc2EoYXApCShhYXJfc2hhKGFwKSArIEFUTVNITE4oYXApKQorI2RlZmluZSBhYXJfc3BhKGFwKQkoYWFyX3NzYShhcCkgKyBBVE1TU0xOKGFwKSkKKyNkZWZpbmUgYWFyX3RoYShhcCkJKGFhcl9zcGEoYXApICsgQVRNU1BMTihhcCkpCisjZGVmaW5lIGFhcl90c2EoYXApCShhYXJfdGhhKGFwKSArIEFUTVRITE4oYXApKQorI2RlZmluZSBhYXJfdHBhKGFwKQkoYWFyX3RzYShhcCkgKyBBVE1UU0xOKGFwKSkKK307CisKKyNkZWZpbmUgQVRNU0hBKGFwKSAoYWFyX3NoYShhcCkpCisjZGVmaW5lIEFUTVNTQShhcCkgKGFhcl9zc2EoYXApKQorI2RlZmluZSBBVE1TUEEoYXApIChhYXJfc3BhKGFwKSkKKyNkZWZpbmUgQVRNVEhBKGFwKSAoYWFyX3RoYShhcCkpCisjZGVmaW5lIEFUTVRTQShhcCkgKGFhcl90c2EoYXApKQorI2RlZmluZSBBVE1UUEEoYXApIChhYXJfdHBhKGFwKSkKKworc3RhdGljIHVfY2hhciBlemVyb1s2XTsKKworc3RhdGljIHZvaWQKK2F0bWFycF9hZGRyX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCQkgIGNvbnN0IHVfY2hhciAqaGEsIHVfaW50IGhhX2xlbiwgY29uc3QgdV9jaGFyICpzcmNhLAorICAgIHVfaW50IHNyY2FfbGVuKQoreworCWlmIChoYV9sZW4gPT0gMCkKKwkJTkRfUFJJTlQoKG5kbywgIjxObyBhZGRyZXNzPiIpKTsKKwllbHNlIHsKKwkJTkRfUFJJTlQoKG5kbywgIiVzIiwgbGlua2FkZHJfc3RyaW5nKGhhLCBoYV9sZW4pKSk7CisJCWlmIChzcmNhX2xlbiAhPSAwKSAKKwkJCU5EX1BSSU5UKChuZG8sICIsJXMiLAorCQkJCSAgbGlua2FkZHJfc3RyaW5nKHNyY2EsIHNyY2FfbGVuKSkpOworCX0KK30KKworc3RhdGljIHZvaWQKK2F0bWFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKKwkgICAgIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWNvbnN0IHN0cnVjdCBhdG1hcnBfcGt0aGRyICphcDsKKwl1X3Nob3J0IHBybywgaHJkLCBvcDsKKworCWFwID0gKGNvbnN0IHN0cnVjdCBhdG1hcnBfcGt0aGRyICopYnA7CisJTkRfVENIRUNLKCphcCk7CisKKwlocmQgPSBBVE1IUkQoYXApOworCXBybyA9IEFUTVBSTyhhcCk7CisJb3AgPSBBVE1PUChhcCk7CisKKwlpZiAoIU5EX1RURVNUMigqYWFyX3RwYShhcCksIEFUTVRQTE4oYXApKSkgeworCQlORF9QUklOVCgobmRvLCAidHJ1bmNhdGVkLWF0bWFycCIpKTsKKwkJTkRfREVGQVVMVFBSSU5UKChjb25zdCB1X2NoYXIgKilhcCwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocHJvICE9IEVUSEVSVFlQRV9JUCAmJiBwcm8gIT0gRVRIRVJUWVBFX1RSQUlMKSB8fAorCSAgICBBVE1TUExOKGFwKSAhPSA0IHx8IEFUTVRQTE4oYXApICE9IDQpIHsKKwkJTkRfUFJJTlQoKG5kbywgImF0bWFycC0jJWQgZm9yIHByb3RvICMlZCAoJWQvJWQpIGhhcmR3YXJlICMlZCIsCisJCQkgIG9wLCBwcm8sIEFUTVNQTE4oYXApLCBBVE1UUExOKGFwKSwgaHJkKSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBybyA9PSBFVEhFUlRZUEVfVFJBSUwpCisJCU5EX1BSSU5UKChuZG8sICJ0cmFpbGVyLSIpKTsKKwlzd2l0Y2ggKG9wKSB7CisKKwljYXNlIEFSUE9QX1JFUVVFU1Q6CisJCU5EX1BSSU5UKChuZG8sICJhcnAgd2hvLWhhcyAlcyIsIGlwYWRkcl9zdHJpbmcoQVRNVFBBKGFwKSkpKTsKKwkJaWYgKEFUTVRITE4oYXApICE9IDApIHsKKwkJCU5EX1BSSU5UKChuZG8sICIgKCIpKTsKKwkJCWF0bWFycF9hZGRyX3ByaW50KG5kbywgQVRNVEhBKGFwKSwgQVRNVEhMTihhcCksCisJCQkgICAgQVRNVFNBKGFwKSwgQVRNVFNMTihhcCkpOworCQkJTkRfUFJJTlQoKG5kbywgIikiKSk7CisJCX0KKwkJTkRfUFJJTlQoKG5kbywgIiB0ZWxsICVzIiwgaXBhZGRyX3N0cmluZyhBVE1TUEEoYXApKSkpOworCQlicmVhazsKKworCWNhc2UgQVJQT1BfUkVQTFk6CisJCU5EX1BSSU5UKChuZG8sICJhcnAgcmVwbHkgJXMiLCBpcGFkZHJfc3RyaW5nKEFUTVNQQShhcCkpKSk7CisJCU5EX1BSSU5UKChuZG8sICIgaXMtYXQgIikpOworCQlhdG1hcnBfYWRkcl9wcmludChuZG8sIEFUTVNIQShhcCksIEFUTVNITE4oYXApLCBBVE1TU0EoYXApLAorCQkgICAgQVRNU1NMTihhcCkpOworCQlicmVhazsKKworCWNhc2UgQVJQT1BfSU5WUkVRVUVTVDoKKwkJTkRfUFJJTlQoKG5kbywgImludmFycCB3aG8taXMgIikpOworCQlhdG1hcnBfYWRkcl9wcmludChuZG8sIEFUTVRIQShhcCksIEFUTVRITE4oYXApLCBBVE1UU0EoYXApLAorCQkgICAgQVRNVFNMTihhcCkpOworCQlORF9QUklOVCgobmRvLCAiIHRlbGwgIikpOworCQlhdG1hcnBfYWRkcl9wcmludChuZG8sIEFUTVNIQShhcCksIEFUTVNITE4oYXApLCBBVE1TU0EoYXApLAorCQkgICAgQVRNU1NMTihhcCkpOworCQlicmVhazsKKworCWNhc2UgQVJQT1BfSU5WUkVQTFk6CisJCU5EX1BSSU5UKChuZG8sICJpbnZhcnAgcmVwbHkgIikpOworCQlhdG1hcnBfYWRkcl9wcmludChuZG8sIEFUTVNIQShhcCksIEFUTVNITE4oYXApLCBBVE1TU0EoYXApLAorCQkgICAgQVRNU1NMTihhcCkpOworCQlORF9QUklOVCgobmRvLCAiIGF0ICVzIiwgaXBhZGRyX3N0cmluZyhBVE1TUEEoYXApKSkpOworCQlicmVhazsKKworCWNhc2UgQVRNQVJQT1BfTkFLOgorCQlORF9QUklOVCgobmRvLCAibmFrIHJlcGx5IGZvciAlcyIsCisJCQkgIGlwYWRkcl9zdHJpbmcoQVRNU1BBKGFwKSkpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORF9QUklOVCgobmRvLCAiYXRtYXJwLSMlZCIsIG9wKSk7CisJCU5EX0RFRkFVTFRQUklOVCgoY29uc3QgdV9jaGFyICopYXAsIGNhcGxlbik7CisJCXJldHVybjsKKwl9CisJcmV0dXJuOwordHJ1bmM6CisJTkRfUFJJTlQoKG5kbywgIlt8YXRtYXJwXSIpKTsKK30KKwordm9pZAorYXJwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCSAgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pCit7CisJY29uc3Qgc3RydWN0IGFycF9wa3RoZHIgKmFwOworCXVfc2hvcnQgcHJvLCBocmQsIG9wOworCisJYXAgPSAoY29uc3Qgc3RydWN0IGFycF9wa3RoZHIgKilicDsKKwlORF9UQ0hFQ0soKmFwKTsKKwlocmQgPSBIUkQoYXApOworCWlmIChocmQgPT0gQVJQSFJEX0FUTTIyMjUpIHsKKwkgICAgICAgIGF0bWFycF9wcmludChuZG8sIGJwLCBsZW5ndGgsIGNhcGxlbik7CisJCXJldHVybjsKKwl9CisJcHJvID0gUFJPKGFwKTsKKwlvcCA9IE9QKGFwKTsKKworCWlmICghTkRfVFRFU1QyKCphcl90cGEoYXApLCBQTE4oYXApKSkgeworCQlORF9QUklOVCgobmRvLCAidHJ1bmNhdGVkLWFycCIpKTsKKwkJTkRfREVGQVVMVFBSSU5UKChjb25zdCB1X2NoYXIgKilhcCwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgocHJvICE9IEVUSEVSVFlQRV9JUCAmJiBwcm8gIT0gRVRIRVJUWVBFX1RSQUlMKSB8fAorCSAgICBQTE4oYXApICE9IDQgfHwgSExOKGFwKSA9PSAwKSB7CisJCU5EX1BSSU5UKChuZG8sICJhcnAtIyVkIGZvciBwcm90byAjJWQgKCVkKSBoYXJkd2FyZSAjJWQgKCVkKSIsCisJCQkgIG9wLCBwcm8sIFBMTihhcCksIGhyZCwgSExOKGFwKSkpOworCQlyZXR1cm47CisJfQorCWlmIChwcm8gPT0gRVRIRVJUWVBFX1RSQUlMKQorCQlORF9QUklOVCgobmRvLCAidHJhaWxlci0iKSk7CisJc3dpdGNoIChvcCkgeworCisJY2FzZSBBUlBPUF9SRVFVRVNUOgorCQlORF9QUklOVCgobmRvLCAiYXJwIHdoby1oYXMgJXMiLCBpcGFkZHJfc3RyaW5nKFRQQShhcCkpKSk7CisJCWlmIChtZW1jbXAoKGNvbnN0IGNoYXIgKillemVybywgKGNvbnN0IGNoYXIgKilUSEEoYXApLCBITE4oYXApKSAhPSAwKQorCQkJTkRfUFJJTlQoKG5kbywgIiAoJXMpIiwKKwkJCQkgIGxpbmthZGRyX3N0cmluZyhUSEEoYXApLCBITE4oYXApKSkpOworCQlORF9QUklOVCgobmRvLCAiIHRlbGwgJXMiLCBpcGFkZHJfc3RyaW5nKFNQQShhcCkpKSk7CisJCWJyZWFrOworCisJY2FzZSBBUlBPUF9SRVBMWToKKwkJTkRfUFJJTlQoKG5kbywgImFycCByZXBseSAlcyIsIGlwYWRkcl9zdHJpbmcoU1BBKGFwKSkpKTsKKwkJTkRfUFJJTlQoKG5kbywgIiBpcy1hdCAlcyIsIGxpbmthZGRyX3N0cmluZyhTSEEoYXApLCBITE4oYXApKSkpOworCQlicmVhazsKKworCWNhc2UgQVJQT1BfUkVWUkVRVUVTVDoKKwkJTkRfUFJJTlQoKG5kbywgInJhcnAgd2hvLWlzICVzIHRlbGwgJXMiLAorCQkJICBsaW5rYWRkcl9zdHJpbmcoVEhBKGFwKSwgSExOKGFwKSksCisJCQkgIGxpbmthZGRyX3N0cmluZyhTSEEoYXApLCBITE4oYXApKSkpOworCQlicmVhazsKKworCWNhc2UgQVJQT1BfUkVWUkVQTFk6CisJCU5EX1BSSU5UKChuZG8sICJyYXJwIHJlcGx5ICVzIGF0ICVzIiwKKwkJCSAgbGlua2FkZHJfc3RyaW5nKFRIQShhcCksIEhMTihhcCkpLAorCQkJICBpcGFkZHJfc3RyaW5nKFRQQShhcCkpKSk7CisJCWJyZWFrOworCisJY2FzZSBBUlBPUF9JTlZSRVFVRVNUOgorCQlORF9QUklOVCgobmRvLCAiaW52YXJwIHdoby1pcyAlcyB0ZWxsICVzIiwKKwkJCSAgbGlua2FkZHJfc3RyaW5nKFRIQShhcCksIEhMTihhcCkpLAorCQkJICBsaW5rYWRkcl9zdHJpbmcoU0hBKGFwKSwgSExOKGFwKSkpKTsKKwkJYnJlYWs7CisKKwljYXNlIEFSUE9QX0lOVlJFUExZOgorCQlORF9QUklOVCgobmRvLCJpbnZhcnAgcmVwbHkgJXMgYXQgJXMiLAorCQkJICBsaW5rYWRkcl9zdHJpbmcoVEhBKGFwKSwgSExOKGFwKSksCisJCQkgIGlwYWRkcl9zdHJpbmcoVFBBKGFwKSkpKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlORF9QUklOVCgobmRvLCAiYXJwLSMlZCIsIG9wKSk7CisJCU5EX0RFRkFVTFRQUklOVCgoY29uc3QgdV9jaGFyICopYXAsIGNhcGxlbik7CisJCXJldHVybjsKKwl9CisJaWYgKGhyZCAhPSBBUlBIUkRfRVRIRVIpCisJCU5EX1BSSU5UKChuZG8sICIgaGFyZHdhcmUgIyVkIiwgaHJkKSk7CisJcmV0dXJuOwordHJ1bmM6CisJTkRfUFJJTlQoKG5kbywgIlt8YXJwXSIpKTsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IGJzZAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL3ByaW50LWFzY2lpLmMgYi9wcmludC1hc2NpaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNDhlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1hc2NpaS5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgkkTmV0QlNEOiBwcmludC1hc2NpaS5jLHYgMS4xIDE5OTkvMDkvMzAgMTQ6NDk6MTIgc2pnIEV4cCAkIAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMTk5OCBUaGUgTmV0QlNEIEZvdW5kYXRpb24sIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBUaGUgTmV0QlNEIEZvdW5kYXRpb24KKyAqIGJ5IEFsYW4gQmFycmV0dCBhbmQgU2ltb24gSi4gR2VycmF0eS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5ldEJTRAorICogICAgICAgIEZvdW5kYXRpb24sIEluYy4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYXNjaWkuYyx2IDEuMTYuMi4xIDIwMDUvMDcvMDYgMjA6NTQ6NDkgZ3V5IEV4cCAkIjsKKyNlbmRpZgorI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisjZGVmaW5lIEFTQ0lJX0xJTkVMRU5HVEggMzAwCisjZGVmaW5lIEhFWERVTVBfQllURVNfUEVSX0xJTkUgMTYKKyNkZWZpbmUgSEVYRFVNUF9TSE9SVFNfUEVSX0xJTkUgKEhFWERVTVBfQllURVNfUEVSX0xJTkUgLyAyKQorI2RlZmluZSBIRVhEVU1QX0hFWFNUVUZGX1BFUl9TSE9SVCA1IC8qIDQgaGV4IGRpZ2l0cyBhbmQgYSBzcGFjZSAqLworI2RlZmluZSBIRVhEVU1QX0hFWFNUVUZGX1BFUl9MSU5FIFwKKwkJKEhFWERVTVBfSEVYU1RVRkZfUEVSX1NIT1JUICogSEVYRFVNUF9TSE9SVFNfUEVSX0xJTkUpCisKK3ZvaWQKK2FzY2lpX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBpbnQgczsKKworCXB1dGNoYXIoJ1xuJyk7CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJcyA9ICpjcCsrOworCQlsZW5ndGgtLTsKKwkJaWYgKCFpc2dyYXBoKHMpICYmCisJCSAgICAocyAhPSAnXHQnICYmIHMgIT0gJyAnICYmIHMgIT0gJ1xuJyAmJiBzICE9ICdccicpKQorCQkJcHV0Y2hhcignLicpOworCQllbHNlCisJCQlwdXRjaGFyKHMpOworCX0KK30KKwordm9pZAoraGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldChyZWdpc3RlciBjb25zdCBjaGFyICppZGVudCwKKyAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsIHJlZ2lzdGVyIHVfaW50IG9zZXQpCit7CisJcmVnaXN0ZXIgdV9pbnQgaTsKKwlyZWdpc3RlciBpbnQgczEsIHMyOworCXJlZ2lzdGVyIGludCBuc2hvcnRzOworCWNoYXIgaGV4c3R1ZmZbSEVYRFVNUF9TSE9SVFNfUEVSX0xJTkUqSEVYRFVNUF9IRVhTVFVGRl9QRVJfU0hPUlQrMV0sICpoc3A7CisJY2hhciBhc2NpaXN0dWZmW0FTQ0lJX0xJTkVMRU5HVEgrMV0sICphc3A7CisKKwluc2hvcnRzID0gbGVuZ3RoIC8gc2l6ZW9mKHVfc2hvcnQpOworCWkgPSAwOworCWhzcCA9IGhleHN0dWZmOyBhc3AgPSBhc2NpaXN0dWZmOworCXdoaWxlICgtLW5zaG9ydHMgPj0gMCkgeworCQlzMSA9ICpjcCsrOworCQlzMiA9ICpjcCsrOworCQkodm9pZClzbnByaW50Zihoc3AsIHNpemVvZihoZXhzdHVmZikgLSAoaHNwIC0gaGV4c3R1ZmYpLAorCQkgICAgIiAlMDJ4JTAyeCIsIHMxLCBzMik7CisJCWhzcCArPSBIRVhEVU1QX0hFWFNUVUZGX1BFUl9TSE9SVDsKKwkJKihhc3ArKykgPSAoaXNncmFwaChzMSkgPyBzMSA6ICcuJyk7CisJCSooYXNwKyspID0gKGlzZ3JhcGgoczIpID8gczIgOiAnLicpOworCQlpKys7CisJCWlmIChpID49IEhFWERVTVBfU0hPUlRTX1BFUl9MSU5FKSB7CisJCQkqaHNwID0gKmFzcCA9ICdcMCc7CisJCQkodm9pZClwcmludGYoIiVzMHglMDR4OiAlLSpzICAlcyIsCisJCQkgICAgaWRlbnQsIG9zZXQsIEhFWERVTVBfSEVYU1RVRkZfUEVSX0xJTkUsCisJCQkgICAgaGV4c3R1ZmYsIGFzY2lpc3R1ZmYpOworCQkJaSA9IDA7IGhzcCA9IGhleHN0dWZmOyBhc3AgPSBhc2NpaXN0dWZmOworCQkJb3NldCArPSBIRVhEVU1QX0JZVEVTX1BFUl9MSU5FOworCQl9CisJfQorCWlmIChsZW5ndGggJiAxKSB7CisJCXMxID0gKmNwKys7CisJCSh2b2lkKXNucHJpbnRmKGhzcCwgc2l6ZW9mKGhleHN0dWZmKSAtIChoc3AgLSBoZXhzdHVmZiksCisJCSAgICAiICUwMngiLCBzMSk7CisJCWhzcCArPSAzOworCQkqKGFzcCsrKSA9IChpc2dyYXBoKHMxKSA/IHMxIDogJy4nKTsKKwkJKytpOworCX0KKwlpZiAoaSA+IDApIHsKKwkJKmhzcCA9ICphc3AgPSAnXDAnOworCQkodm9pZClwcmludGYoIiVzMHglMDR4OiAlLSpzICAlcyIsCisJCSAgICAgaWRlbnQsIG9zZXQsIEhFWERVTVBfSEVYU1RVRkZfUEVSX0xJTkUsCisJCSAgICAgaGV4c3R1ZmYsIGFzY2lpc3R1ZmYpOworCX0KK30KKwordm9pZAoraGV4X2FuZF9hc2NpaV9wcmludChyZWdpc3RlciBjb25zdCBjaGFyICppZGVudCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwKKyAgICByZWdpc3RlciB1X2ludCBsZW5ndGgpCit7CisJaGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldChpZGVudCwgY3AsIGxlbmd0aCwgMCk7Cit9CisKKy8qCisgKiB0ZWxuZXRfcHJpbnQoKSB3YW50cyB0aGlzLiAgSXQgaXMgZXNzZW50aWFsbHkgZGVmYXVsdF9wcmludF91bmFsaWduZWQoKQorICovCit2b2lkCitoZXhfcHJpbnRfd2l0aF9vZmZzZXQocmVnaXN0ZXIgY29uc3QgY2hhciAqaWRlbnQsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCwKKwkJICAgICAgcmVnaXN0ZXIgdV9pbnQgb3NldCkKK3sKKwlyZWdpc3RlciB1X2ludCBpLCBzOworCXJlZ2lzdGVyIGludCBuc2hvcnRzOworCisJbnNob3J0cyA9ICh1X2ludCkgbGVuZ3RoIC8gc2l6ZW9mKHVfc2hvcnQpOworCWkgPSAwOworCXdoaWxlICgtLW5zaG9ydHMgPj0gMCkgeworCQlpZiAoKGkrKyAlIDgpID09IDApIHsKKwkJCSh2b2lkKXByaW50ZigiJXMweCUwNHg6ICIsIGlkZW50LCBvc2V0KTsKKwkJCW9zZXQgKz0gSEVYRFVNUF9CWVRFU19QRVJfTElORTsKKwkJfQorCQlzID0gKmNwKys7CisJCSh2b2lkKXByaW50ZigiICUwMnglMDJ4IiwgcywgKmNwKyspOworCX0KKwlpZiAobGVuZ3RoICYgMSkgeworCQlpZiAoKGkgJSA4KSA9PSAwKQorCQkJKHZvaWQpcHJpbnRmKCIlczB4JTA0eDogIiwgaWRlbnQsIG9zZXQpOworCQkodm9pZClwcmludGYoIiAlMDJ4IiwgKmNwKTsKKwl9Cit9CisKKy8qCisgKiBqdXN0IGZvciBjb21wbGV0ZW5lc3MKKyAqLwordm9pZAoraGV4X3ByaW50KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmlkZW50LCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCByZWdpc3RlciB1X2ludCBsZW5ndGgpCit7CisJaGV4X3ByaW50X3dpdGhfb2Zmc2V0KGlkZW50LCBjcCwgbGVuZ3RoLCAwKTsKK30KKworI2lmZGVmIE1BSU4KK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWhleF9wcmludCgiXG5cdCIsICJIZWxsbywgV29ybGQhXG4iLCAxNCk7CisJcHJpbnRmKCJcbiIpOworCWhleF9hbmRfYXNjaWlfcHJpbnQoIlxuXHQiLCAiSGVsbG8sIFdvcmxkIVxuIiwgMTQpOworCXByaW50ZigiXG4iKTsKKwlhc2NpaV9wcmludCgiSGVsbG8sIFdvcmxkIVxuIiwgMTQpOworCXByaW50ZigiXG4iKTsKKyNkZWZpbmUgVE1TRyAiTm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQuLi5cbiIKKwloZXhfcHJpbnRfd2l0aF9vZmZzZXQoIlxuXHQiLCBUTVNHLCBzaXplb2YoVE1TRykgLSAxLCAweDEwMCk7CisJcHJpbnRmKCJcbiIpOworCWhleF9hbmRfYXNjaWlfcHJpbnRfd2l0aF9vZmZzZXQoIlxuXHQiLCBUTVNHLCBzaXplb2YoVE1TRykgLSAxLCAweDEwMCk7CisJcHJpbnRmKCJcbiIpOworCWV4aXQoMCk7Cit9CisjZW5kaWYgLyogTUFJTiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtYXRhbGsuYyBiL3ByaW50LWF0YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNDVhMwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWF0YWxrLmMKQEAgLTAsMCArMSw2MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGb3JtYXQgYW5kIHByaW50IEFwcGxlVGFsayBwYWNrZXRzLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWF0YWxrLmMsdiAxLjgxIDIwMDQvMDUvMDEgMDk6NDE6NTAgaGFubmVzIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwY2FwLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworI2luY2x1ZGUgImFwcGxldGFsay5oIgorCitzdGF0aWMgc3RydWN0IHRvayB0eXBlMnN0cltdID0geworCXsgZGRwUlRNUCwJCSJydG1wIiB9LAorCXsgZGRwUlRNUHJlcXVlc3QsCSJydG1wUmVxIiB9LAorCXsgZGRwRUNITywJCSJlY2hvIiB9LAorCXsgZGRwSVAsCQkiSVAiIH0sCisJeyBkZHBBUlAsCQkiQVJQIiB9LAorCXsgZGRwS0xBUCwJCSJLTEFQIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0cnVjdCBhYXJwIHsKKwl1X2ludDE2X3QJaHR5cGUsIHB0eXBlOworCXVfaW50OF90CWhhbGVuLCBwYWxlbjsKKwl1X2ludDE2X3QJb3A7CisJdV9pbnQ4X3QJaHNhZGRyWzZdOworCXVfaW50OF90CXBzYWRkcls0XTsKKwl1X2ludDhfdAloZGFkZHJbNl07CisJdV9pbnQ4X3QJcGRhZGRyWzRdOworfTsKKworc3RhdGljIGNoYXIgdHN0cltdID0gIlt8YXRhbGtdIjsKKworc3RhdGljIHZvaWQgYXRwX3ByaW50KGNvbnN0IHN0cnVjdCBhdEFUUCAqLCB1X2ludCk7CitzdGF0aWMgdm9pZCBhdHBfYml0bWFwX3ByaW50KHVfY2hhcik7CitzdGF0aWMgdm9pZCBuYnBfcHJpbnQoY29uc3Qgc3RydWN0IGF0TkJQICosIHVfaW50LCB1X3Nob3J0LCB1X2NoYXIsIHVfY2hhcik7CitzdGF0aWMgY29uc3QgY2hhciAqcHJpbnRfY3N0cmluZyhjb25zdCBjaGFyICosIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqbmJwX3R1cGxlX3ByaW50KGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICosCisJCQkJCQljb25zdCB1X2NoYXIgKiwKKwkJCQkJCXVfc2hvcnQsIHVfY2hhciwgdV9jaGFyKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqbmJwX25hbWVfcHJpbnQoY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKiwKKwkJCQkJICAgICAgIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICphdGFkZHJfc3RyaW5nKHVfc2hvcnQsIHVfY2hhcik7CitzdGF0aWMgdm9pZCBkZHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQsIHVfc2hvcnQsIHVfY2hhciwgdV9jaGFyKTsKK3N0YXRpYyBjb25zdCBjaGFyICpkZHBza3Rfc3RyaW5nKGludCk7CisKKy8qCisgKiBQcmludCBMTEFQIHBhY2tldHMgcmVjZWl2ZWQgb24gYSBwaHlzaWNhbCBMb2NhbFRhbGsgaW50ZXJmYWNlLgorICovCit1X2ludAorbHRhbGtfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJcmV0dXJuIChsbGFwX3ByaW50KHAsIGgtPmNhcGxlbikpOworfQorCisvKgorICogUHJpbnQgQXBwbGVUYWxrIExMQVAgcGFja2V0cy4KKyAqLwordV9pbnQKK2xsYXBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBMQVAgKmxwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhdEREUCAqZHA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0U2hvcnRERFAgKnNkcDsKKwl1X3Nob3J0IHNuZXQ7CisJdV9pbnQgaGRybGVuOworCisJLyoKKwkgKiBPdXIgcGFja2V0IGlzIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LCBhcyB3ZSdyZSBlaXRoZXIgY2FsbGVkCisJICogZGlyZWN0bHkgZnJvbSBhIHRvcC1sZXZlbCBsaW5rLWxheWVyIHByaW50ZXIgKGx0YWxrX2lmX3ByaW50KQorCSAqIG9yIGZyb20gdGhlIFVEUCBwcmludGVyLiAgVGhlIExMQVArRERQIGhlYWRlciBpcyBhIG11bHRpcGxlCisJICogb2YgNCBieXRlcyBpbiBsZW5ndGgsIHNvIHRoZSBERFAgcGF5bG9hZCBpcyBhbHNvIG9uIGEgNC1ieXRlCisJICogYm91bmRhcnksIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGFsaWduIGl0IGJlZm9yZSBjYWxsaW5nCisJICogImRkcF9wcmludCgpIi4KKwkgKi8KKwlscCA9IChjb25zdCBzdHJ1Y3QgTEFQICopYnA7CisJYnAgKz0gc2l6ZW9mKCpscCk7CisJbGVuZ3RoIC09IHNpemVvZigqbHApOworCWhkcmxlbiA9IHNpemVvZigqbHApOworCXN3aXRjaCAobHAtPnR5cGUpIHsKKworCWNhc2UgbGFwU2hvcnRERFA6CisJCWlmIChsZW5ndGggPCBkZHBTU2l6ZSkgeworCQkJKHZvaWQpcHJpbnRmKCIgW3xzZGRwICVkXSIsIGxlbmd0aCk7CisJCQlyZXR1cm4gKGxlbmd0aCk7CisJCX0KKwkJc2RwID0gKGNvbnN0IHN0cnVjdCBhdFNob3J0RERQICopYnA7CisJCXByaW50ZigiJXMuJXMiLAorCQkgICAgYXRhZGRyX3N0cmluZygwLCBscC0+c3JjKSwgZGRwc2t0X3N0cmluZyhzZHAtPnNyY1NrdCkpOworCQlwcmludGYoIiA+ICVzLiVzOiIsCisJCSAgICBhdGFkZHJfc3RyaW5nKDAsIGxwLT5kc3QpLCBkZHBza3Rfc3RyaW5nKHNkcC0+ZHN0U2t0KSk7CisJCWJwICs9IGRkcFNTaXplOworCQlsZW5ndGggLT0gZGRwU1NpemU7CisJCWhkcmxlbiArPSBkZHBTU2l6ZTsKKwkJZGRwX3ByaW50KGJwLCBsZW5ndGgsIHNkcC0+dHlwZSwgMCwgbHAtPnNyYywgc2RwLT5zcmNTa3QpOworCQlicmVhazsKKworCWNhc2UgbGFwRERQOgorCQlpZiAobGVuZ3RoIDwgZGRwU2l6ZSkgeworCQkJKHZvaWQpcHJpbnRmKCIgW3xkZHAgJWRdIiwgbGVuZ3RoKTsKKwkJCXJldHVybiAobGVuZ3RoKTsKKwkJfQorCQlkcCA9IChjb25zdCBzdHJ1Y3QgYXRERFAgKilicDsKKwkJc25ldCA9IEVYVFJBQ1RfMTZCSVRTKCZkcC0+c3JjTmV0KTsKKwkJcHJpbnRmKCIlcy4lcyIsIGF0YWRkcl9zdHJpbmcoc25ldCwgZHAtPnNyY05vZGUpLAorCQkgICAgZGRwc2t0X3N0cmluZyhkcC0+c3JjU2t0KSk7CisJCXByaW50ZigiID4gJXMuJXM6IiwKKwkJICAgIGF0YWRkcl9zdHJpbmcoRVhUUkFDVF8xNkJJVFMoJmRwLT5kc3ROZXQpLCBkcC0+ZHN0Tm9kZSksCisJCSAgICBkZHBza3Rfc3RyaW5nKGRwLT5kc3RTa3QpKTsKKwkJYnAgKz0gZGRwU2l6ZTsKKwkJbGVuZ3RoIC09IGRkcFNpemU7CisJCWhkcmxlbiArPSBkZHBTaXplOworCQlkZHBfcHJpbnQoYnAsIGxlbmd0aCwgZHAtPnR5cGUsIHNuZXQsIGRwLT5zcmNOb2RlLCBkcC0+c3JjU2t0KTsKKwkJYnJlYWs7CisKKyNpZmRlZiBub3RkZWYKKwljYXNlIGxhcEtMQVA6CisJCWtsYXBfcHJpbnQoYnAsIGxlbmd0aCk7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlwcmludGYoIiVkID4gJWQgYXQtbGFwIyVkICVkIiwKKwkJICAgIGxwLT5zcmMsIGxwLT5kc3QsIGxwLT50eXBlLCBsZW5ndGgpOworCQlicmVhazsKKwl9CisJcmV0dXJuIChoZHJsZW4pOworfQorCisvKgorICogUHJpbnQgRXRoZXJUYWxrL1Rva2VuVGFsayBwYWNrZXRzIChvciBGRERJVGFsaywgb3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQKKyAqIHdoZW4gaXQgcnVucyBvdmVyIEZEREk7IHllcywgSSd2ZSBzZWVuIEZEREkgY2FwdHVyZXMgd2l0aCBBcHBsZVRhbGsKKyAqIHBhY2tldHMgaW4gdGhlbSkuCisgKi8KK3ZvaWQKK2F0YWxrX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXRERFAgKmRwOworCXVfc2hvcnQgc25ldDsKKworICAgICAgICBpZighZWZsYWcpCisgICAgICAgICAgICBwcmludGYoIkFUICIpOworCisJaWYgKGxlbmd0aCA8IGRkcFNpemUpIHsKKwkJKHZvaWQpcHJpbnRmKCIgW3xkZHAgJWRdIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKwlkcCA9IChjb25zdCBzdHJ1Y3QgYXRERFAgKilicDsKKwlzbmV0ID0gRVhUUkFDVF8xNkJJVFMoJmRwLT5zcmNOZXQpOworCXByaW50ZigiJXMuJXMiLCBhdGFkZHJfc3RyaW5nKHNuZXQsIGRwLT5zcmNOb2RlKSwKKwkgICAgICAgZGRwc2t0X3N0cmluZyhkcC0+c3JjU2t0KSk7CisJcHJpbnRmKCIgPiAlcy4lczogIiwKKwkgICAgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmZHAtPmRzdE5ldCksIGRwLT5kc3ROb2RlKSwKKwkgICAgICAgZGRwc2t0X3N0cmluZyhkcC0+ZHN0U2t0KSk7CisJYnAgKz0gZGRwU2l6ZTsKKwlsZW5ndGggLT0gZGRwU2l6ZTsKKwlkZHBfcHJpbnQoYnAsIGxlbmd0aCwgZHAtPnR5cGUsIHNuZXQsIGRwLT5zcmNOb2RlLCBkcC0+c3JjU2t0KTsKK30KKworLyogWFhYIHNob3VsZCBwcm9iYWJseSBwYXNzIGluIHRoZSBzbmFwIGhlYWRlciBhbmQgZG8gY2hlY2tzIGxpa2UgYXJwX3ByaW50KCkgKi8KK3ZvaWQKK2FhcnBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhYXJwICphcDsKKworI2RlZmluZSBBVChtZW1iZXIpIGF0YWRkcl9zdHJpbmcoKGFwLT5tZW1iZXJbMV08PDgpfGFwLT5tZW1iZXJbMl0sYXAtPm1lbWJlclszXSkKKworCXByaW50ZigiYWFycCAiKTsKKwlhcCA9IChjb25zdCBzdHJ1Y3QgYWFycCAqKWJwOworCWlmIChFWFRSQUNUXzE2QklUUygmYXAtPmh0eXBlKSA9PSAxICYmCisJICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+cHR5cGUpID09IEVUSEVSVFlQRV9BVEFMSyAmJgorCSAgICBhcC0+aGFsZW4gPT0gNiAmJiBhcC0+cGFsZW4gPT0gNCApCisJCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJmFwLT5vcCkpIHsKKworCQljYXNlIDE6CQkJCS8qIHJlcXVlc3QgKi8KKwkJCSh2b2lkKXByaW50Zigid2hvLWhhcyAlcyB0ZWxsICVzIiwKKwkJCSAgICBBVChwZGFkZHIpLCBBVChwc2FkZHIpKTsKKwkJCXJldHVybjsKKworCQljYXNlIDI6CQkJCS8qIHJlc3BvbnNlICovCisJCQkodm9pZClwcmludGYoInJlcGx5ICVzIGlzLWF0ICVzIiwKKwkJCSAgICBBVChwZGFkZHIpLCBldGhlcmFkZHJfc3RyaW5nKGFwLT5oZGFkZHIpKTsKKwkJCXJldHVybjsKKworCQljYXNlIDM6CQkJCS8qIHByb2JlIChveSEpICovCisJCQkodm9pZClwcmludGYoInByb2JlICVzIHRlbGwgJXMiLAorCQkJICAgIEFUKHBkYWRkciksIEFUKHBzYWRkcikpOworCQkJcmV0dXJuOworCQl9CisJKHZvaWQpcHJpbnRmKCJsZW4gJXUgb3AgJXUgaHR5cGUgJXUgcHR5cGUgJSN4IGhhbGVuICV1IHBhbGVuICV1IiwKKwkgICAgbGVuZ3RoLCBFWFRSQUNUXzE2QklUUygmYXAtPm9wKSwgRVhUUkFDVF8xNkJJVFMoJmFwLT5odHlwZSksCisJICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+cHR5cGUpLCBhcC0+aGFsZW4sIGFwLT5wYWxlbik7Cit9CisKKy8qCisgKiBQcmludCBBcHBsZVRhbGsgRGF0YWdyYW0gRGVsaXZlcnkgUHJvdG9jb2wgcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQKK2RkcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsIHJlZ2lzdGVyIGludCB0LAorCSAgcmVnaXN0ZXIgdV9zaG9ydCBzbmV0LCByZWdpc3RlciB1X2NoYXIgc25vZGUsIHVfY2hhciBza3QpCit7CisKKwlzd2l0Y2ggKHQpIHsKKworCWNhc2UgZGRwTkJQOgorCQluYnBfcHJpbnQoKGNvbnN0IHN0cnVjdCBhdE5CUCAqKWJwLCBsZW5ndGgsIHNuZXQsIHNub2RlLCBza3QpOworCQlicmVhazsKKworCWNhc2UgZGRwQVRQOgorCQlhdHBfcHJpbnQoKGNvbnN0IHN0cnVjdCBhdEFUUCAqKWJwLCBsZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgZGRwRUlHUlA6CisJCWVpZ3JwX3ByaW50KGJwLCBsZW5ndGgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCSh2b2lkKXByaW50ZigiIGF0LSVzICVkIiwgdG9rMnN0cih0eXBlMnN0ciwgTlVMTCwgdCksIGxlbmd0aCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2F0cF9wcmludChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXRBVFAgKmFwLCB1X2ludCBsZW5ndGgpCit7CisJY2hhciBjOworCXVfaW50MzJfdCBkYXRhOworCisJaWYgKChjb25zdCB1X2NoYXIgKikoYXAgKyAxKSA+IHNuYXBlbmQpIHsKKwkJLyogSnVzdCBiYWlsIGlmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGNodW5rLiAqLworCQlmcHV0cyh0c3RyLCBzdGRvdXQpOworCQlyZXR1cm47CisJfQorCWxlbmd0aCAtPSBzaXplb2YoKmFwKTsKKwlzd2l0Y2ggKGFwLT5jb250cm9sICYgMHhjMCkgeworCisJY2FzZSBhdHBSZXFDb2RlOgorCQkodm9pZClwcmludGYoIiBhdHAtcmVxJXMgJWQiLAorCQkJICAgICBhcC0+Y29udHJvbCAmIGF0cFhPPyAiICIgOiAiKiIsCisJCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+dHJhbnNJRCkpOworCisJCWF0cF9iaXRtYXBfcHJpbnQoYXAtPmJpdG1hcCk7CisKKwkJaWYgKGxlbmd0aCAhPSAwKQorCQkJKHZvaWQpcHJpbnRmKCIgW2xlbj0lZF0iLCBsZW5ndGgpOworCisJCXN3aXRjaCAoYXAtPmNvbnRyb2wgJiAoYXRwRU9NfGF0cFNUUykpIHsKKwkJY2FzZSBhdHBFT006CisJCQkodm9pZClwcmludGYoIiBbRU9NXSIpOworCQkJYnJlYWs7CisJCWNhc2UgYXRwU1RTOgorCQkJKHZvaWQpcHJpbnRmKCIgW1NUU10iKTsKKwkJCWJyZWFrOworCQljYXNlIGF0cEVPTXxhdHBTVFM6CisJCQkodm9pZClwcmludGYoIiBbRU9NLFNUU10iKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBhdHBSc3BDb2RlOgorCQkodm9pZClwcmludGYoIiBhdHAtcmVzcCVzJWQ6JWQgKCVkKSIsCisJCQkgICAgIGFwLT5jb250cm9sICYgYXRwRU9NPyAiKiIgOiAiICIsCisJCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+dHJhbnNJRCksIGFwLT5iaXRtYXAsIGxlbmd0aCk7CisJCXN3aXRjaCAoYXAtPmNvbnRyb2wgJiAoYXRwWE98YXRwU1RTKSkgeworCQljYXNlIGF0cFhPOgorCQkJKHZvaWQpcHJpbnRmKCIgW1hPXSIpOworCQkJYnJlYWs7CisJCWNhc2UgYXRwU1RTOgorCQkJKHZvaWQpcHJpbnRmKCIgW1NUU10iKTsKKwkJCWJyZWFrOworCQljYXNlIGF0cFhPfGF0cFNUUzoKKwkJCSh2b2lkKXByaW50ZigiIFtYTyxTVFNdIik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgYXRwUmVsQ29kZToKKwkJKHZvaWQpcHJpbnRmKCIgYXRwLXJlbCAgJWQiLCBFWFRSQUNUXzE2QklUUygmYXAtPnRyYW5zSUQpKTsKKworCQlhdHBfYml0bWFwX3ByaW50KGFwLT5iaXRtYXApOworCisJCS8qIGxlbmd0aCBzaG91bGQgYmUgemVybyAqLworCQlpZiAobGVuZ3RoKQorCQkJKHZvaWQpcHJpbnRmKCIgW2xlbj0lZF0iLCBsZW5ndGgpOworCisJCS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgY29udHJvbCBmbGFncyAqLworCQlpZiAoYXAtPmNvbnRyb2wgJiAoYXRwWE98YXRwRU9NfGF0cFNUUykpIHsKKwkJCWMgPSAnWyc7CisJCQlpZiAoYXAtPmNvbnRyb2wgJiBhdHBYTykgeworCQkJCSh2b2lkKXByaW50ZigiJWNYTyIsIGMpOworCQkJCWMgPSAnLCc7CisJCQl9CisJCQlpZiAoYXAtPmNvbnRyb2wgJiBhdHBFT00pIHsKKwkJCQkodm9pZClwcmludGYoIiVjRU9NIiwgYyk7CisJCQkJYyA9ICcsJzsKKwkJCX0KKwkJCWlmIChhcC0+Y29udHJvbCAmIGF0cFNUUykgeworCQkJCSh2b2lkKXByaW50ZigiJWNTVFMiLCBjKTsKKwkJCQljID0gJywnOworCQkJfQorCQkJKHZvaWQpcHJpbnRmKCJdIik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkodm9pZClwcmludGYoIiBhdHAtMHgleCAgJWQgKCVkKSIsIGFwLT5jb250cm9sLAorCQkJICAgICBFWFRSQUNUXzE2QklUUygmYXAtPnRyYW5zSUQpLCBsZW5ndGgpOworCQlicmVhazsKKwl9CisJZGF0YSA9IEVYVFJBQ1RfMzJCSVRTKCZhcC0+dXNlckRhdGEpOworCWlmIChkYXRhICE9IDApCisJCSh2b2lkKXByaW50ZigiIDB4JXgiLCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2F0cF9iaXRtYXBfcHJpbnQocmVnaXN0ZXIgdV9jaGFyIGJtKQoreworCXJlZ2lzdGVyIGNoYXIgYzsKKwlyZWdpc3RlciBpbnQgaTsKKworCS8qCisJICogVGhlICcmIDB4ZmYnIGJlbG93IGlzIG5lZWRlZCBmb3IgY29tcGlsZXJzIHRoYXQgd2FudCB0byBzaWduCisJICogZXh0ZW5kIGEgdV9jaGFyLCB3aGljaCBpcyB0aGUgY2FzZSB3aXRoIHRoZSBVbHRyaXggY29tcGlsZXIuCisJICogKGdjYyBpcyBzbWFydCBlbm91Z2ggdG8gZWxpbWluYXRlIGl0LCBhdCBsZWFzdCBvbiB0aGUgU3BhcmMpLgorCSAqLworCWlmICgoYm0gKyAxKSAmIChibSAmIDB4ZmYpKSB7CisJCWMgPSAnPCc7CisJCWZvciAoaSA9IDA7IGJtOyArK2kpIHsKKwkJCWlmIChibSAmIDEpIHsKKwkJCQkodm9pZClwcmludGYoIiVjJWQiLCBjLCBpKTsKKwkJCQljID0gJywnOworCQkJfQorCQkJYm0gPj49IDE7CisJCX0KKwkJKHZvaWQpcHJpbnRmKCI+Iik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgYm07ICsraSkKKwkJCWJtID4+PSAxOworCQlpZiAoaSA+IDEpCisJCQkodm9pZClwcmludGYoIjwwLSVkPiIsIGkgLSAxKTsKKwkJZWxzZQorCQkJKHZvaWQpcHJpbnRmKCI8MD4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituYnBfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQICpucCwgdV9pbnQgbGVuZ3RoLCByZWdpc3RlciB1X3Nob3J0IHNuZXQsCisJICByZWdpc3RlciB1X2NoYXIgc25vZGUsIHJlZ2lzdGVyIHVfY2hhciBza3QpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKnRwID0KKwkJKGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICopKCh1X2NoYXIgKilucCArIG5icEhlYWRlclNpemUpOworCWludCBpOworCWNvbnN0IHVfY2hhciAqZXA7CisKKwlpZiAobGVuZ3RoIDwgbmJwSGVhZGVyU2l6ZSkgeworCQkodm9pZClwcmludGYoIiB0cnVuY2F0ZWQtbmJwICVkIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCWxlbmd0aCAtPSBuYnBIZWFkZXJTaXplOworCWlmIChsZW5ndGggPCA4KSB7CisJCS8qIG11c3QgYmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHR1cGxlICovCisJCSh2b2lkKXByaW50ZigiIHRydW5jYXRlZC1uYnAgJWQiLCBsZW5ndGggKyBuYnBIZWFkZXJTaXplKTsKKwkJcmV0dXJuOworCX0KKwkvKiBlcCBwb2ludHMgdG8gZW5kIG9mIGF2YWlsYWJsZSBkYXRhICovCisJZXAgPSBzbmFwZW5kOworCWlmICgoY29uc3QgdV9jaGFyICopdHAgPiBlcCkgeworCQlmcHV0cyh0c3RyLCBzdGRvdXQpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoaSA9IG5wLT5jb250cm9sICYgMHhmMCkgeworCisJY2FzZSBuYnBCclJxOgorCWNhc2UgbmJwTGtVcDoKKwkJKHZvaWQpcHJpbnRmKGkgPT0gbmJwTGtVcD8gIiBuYnAtbGt1cCAlZDoiOiIgbmJwLWJyUnEgJWQ6IiwKKwkJCSAgICAgbnAtPmlkKTsKKwkJaWYgKChjb25zdCB1X2NoYXIgKikodHAgKyAxKSA+IGVwKSB7CisJCQlmcHV0cyh0c3RyLCBzdGRvdXQpOworCQkJcmV0dXJuOworCQl9CisJCSh2b2lkKW5icF9uYW1lX3ByaW50KHRwLCBlcCk7CisJCS8qCisJCSAqIGxvb2sgZm9yIGFub21hbGllczogdGhlIHNwZWMgc2F5cyB0aGVyZSBjYW4gb25seQorCQkgKiBiZSBvbmUgdHVwbGUsIHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdGhlIHNvdXJjZQorCQkgKiBhZGRyZXNzIGFuZCB0aGUgZW51bWVyYXRvciBzaG91bGQgYmUgemVyby4KKwkJICovCisJCWlmICgobnAtPmNvbnRyb2wgJiAweGYpICE9IDEpCisJCQkodm9pZClwcmludGYoIiBbbnR1cD0lZF0iLCBucC0+Y29udHJvbCAmIDB4Zik7CisJCWlmICh0cC0+ZW51bWVyYXRvcikKKwkJCSh2b2lkKXByaW50ZigiIFtlbnVtPSVkXSIsIHRwLT5lbnVtZXJhdG9yKTsKKwkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZ0cC0+bmV0KSAhPSBzbmV0IHx8CisJCSAgICB0cC0+bm9kZSAhPSBzbm9kZSB8fCB0cC0+c2t0ICE9IHNrdCkKKwkJCSh2b2lkKXByaW50ZigiIFthZGRyPSVzLiVkXSIsCisJCQkgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmdHAtPm5ldCksCisJCQkgICAgdHAtPm5vZGUpLCB0cC0+c2t0KTsKKwkJYnJlYWs7CisKKwljYXNlIG5icExrVXBSZXBseToKKwkJKHZvaWQpcHJpbnRmKCIgbmJwLXJlcGx5ICVkOiIsIG5wLT5pZCk7CisKKwkJLyogcHJpbnQgZWFjaCBvZiB0aGUgdHVwbGVzIGluIHRoZSByZXBseSAqLworCQlmb3IgKGkgPSBucC0+Y29udHJvbCAmIDB4ZjsgLS1pID49IDAgJiYgdHA7ICkKKwkJCXRwID0gbmJwX3R1cGxlX3ByaW50KHRwLCBlcCwgc25ldCwgc25vZGUsIHNrdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJKHZvaWQpcHJpbnRmKCIgbmJwLTB4JXggICVkICglZCkiLCBucC0+Y29udHJvbCwgbnAtPmlkLAorCQkJCWxlbmd0aCk7CisJCWJyZWFrOworCX0KK30KKworLyogcHJpbnQgYSBjb3VudGVkIHN0cmluZyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcHJpbnRfY3N0cmluZyhyZWdpc3RlciBjb25zdCBjaGFyICpjcCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCkKK3sKKwlyZWdpc3RlciB1X2ludCBsZW5ndGg7CisKKwlpZiAoY3AgPj0gKGNvbnN0IGNoYXIgKillcCkgeworCQlmcHV0cyh0c3RyLCBzdGRvdXQpOworCQlyZXR1cm4gKDApOworCX0KKwlsZW5ndGggPSAqY3ArKzsKKworCS8qIFNwZWMgc2F5cyBzdHJpbmcgY2FuIGJlIGF0IG1vc3QgMzIgYnl0ZXMgbG9uZyAqLworCWlmIChsZW5ndGggPiAzMikgeworCQkodm9pZClwcmludGYoIltsZW49JXVdIiwgbGVuZ3RoKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJd2hpbGUgKChpbnQpLS1sZW5ndGggPj0gMCkgeworCQlpZiAoY3AgPj0gKGNvbnN0IGNoYXIgKillcCkgeworCQkJZnB1dHModHN0ciwgc3Rkb3V0KTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJcHV0Y2hhcigqY3ArKyk7CisJfQorCXJldHVybiAoY3ApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKgorbmJwX3R1cGxlX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICp0cCwKKwkJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCwKKwkJcmVnaXN0ZXIgdV9zaG9ydCBzbmV0LCByZWdpc3RlciB1X2NoYXIgc25vZGUsCisJCXJlZ2lzdGVyIHVfY2hhciBza3QpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKnRwbjsKKworCWlmICgoY29uc3QgdV9jaGFyICopKHRwICsgMSkgPiBlcCkgeworCQlmcHV0cyh0c3RyLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisJdHBuID0gbmJwX25hbWVfcHJpbnQodHAsIGVwKTsKKworCS8qIGlmIHRoZSBlbnVtZXJhdG9yIGlzbid0IDEsIHByaW50IGl0ICovCisJaWYgKHRwLT5lbnVtZXJhdG9yICE9IDEpCisJCSh2b2lkKXByaW50ZigiKCVkKSIsIHRwLT5lbnVtZXJhdG9yKTsKKworCS8qIGlmIHRoZSBzb2NrZXQgZG9lc24ndCBtYXRjaCB0aGUgc3JjIHNvY2tldCwgcHJpbnQgaXQgKi8KKwlpZiAodHAtPnNrdCAhPSBza3QpCisJCSh2b2lkKXByaW50ZigiICVkIiwgdHAtPnNrdCk7CisKKwkvKiBpZiB0aGUgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIHRoZSBzcmMgYWRkcmVzcywgaXQncyBhbiBhbm9tYWx5ICovCisJaWYgKEVYVFJBQ1RfMTZCSVRTKCZ0cC0+bmV0KSAhPSBzbmV0IHx8IHRwLT5ub2RlICE9IHNub2RlKQorCQkodm9pZClwcmludGYoIiBbYWRkcj0lc10iLAorCQkgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmdHAtPm5ldCksIHRwLT5ub2RlKSk7CisKKwlyZXR1cm4gKHRwbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqCituYnBfbmFtZV9wcmludChjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqdHAsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXApCit7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqY3AgPSAoY29uc3QgY2hhciAqKXRwICsgbmJwVHVwbGVTaXplOworCisJcHV0Y2hhcignICcpOworCisJLyogT2JqZWN0ICovCisJcHV0Y2hhcignIicpOworCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpIHsKKwkJLyogVHlwZSAqLworCQlwdXRjaGFyKCc6Jyk7CisJCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpIHsKKwkJCS8qIFpvbmUgKi8KKwkJCXB1dGNoYXIoJ0AnKTsKKwkJCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpCisJCQkJcHV0Y2hhcignIicpOworCQl9CisJfQorCXJldHVybiAoKGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICopY3ApOworfQorCisKKyNkZWZpbmUgSEFTSE5BTUVTSVpFIDQwOTYKKworc3RydWN0IGhuYW1lbWVtIHsKKwlpbnQgYWRkcjsKKwljaGFyICpuYW1lOworCXN0cnVjdCBobmFtZW1lbSAqbnh0OworfTsKKworc3RhdGljIHN0cnVjdCBobmFtZW1lbSBobmFtZXRhYmxlW0hBU0hOQU1FU0laRV07CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2F0YWRkcl9zdHJpbmcodV9zaG9ydCBhdG5ldCwgdV9jaGFyIGF0aG9zdCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRwLCAqdHAyOworCXJlZ2lzdGVyIGludCBpID0gKGF0bmV0IDw8IDgpIHwgYXRob3N0OworCWNoYXIgbmFtYnVmW01BWEhPU1ROQU1FTEVOICsgMjBdOworCXN0YXRpYyBpbnQgZmlyc3QgPSAxOworCUZJTEUgKmZwOworCisJLyoKKwkgKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBzZWUgaWYgdGhlcmUncyBhbiBBcHBsZVRhbGsKKwkgKiBudW1iZXIgdG8gbmFtZSBtYXAgZmlsZS4KKwkgKi8KKwlpZiAoZmlyc3QgJiYgKGZpcnN0ID0gMCwgIW5mbGFnKQorCSAgICAmJiAoZnAgPSBmb3BlbigiL2V0Yy9hdGFsay5uYW1lcyIsICJyIikpKSB7CisJCWNoYXIgbGluZVsyNTZdOworCQlpbnQgaTEsIGkyLCBpMzsKKworCQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHsKKwkJCWlmIChsaW5lWzBdID09ICdcbicgfHwgbGluZVswXSA9PSAwIHx8IGxpbmVbMF0gPT0gJyMnKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNzY2FuZihsaW5lLCAiJWQuJWQuJWQgJTI1NnMiLCAmaTEsICZpMiwgJmkzLAorCQkJCSAgICAgbmFtYnVmKSA9PSA0KQorCQkJCS8qIGdvdCBhIGhvc3RuYW1lLiAqLworCQkJCWkzIHw9ICgoaTEgPDwgOCkgfCBpMikgPDwgODsKKwkJCWVsc2UgaWYgKHNzY2FuZihsaW5lLCAiJWQuJWQgJTI1NnMiLCAmaTEsICZpMiwKKwkJCQkJbmFtYnVmKSA9PSAzKQorCQkJCS8qIGdvdCBhIG5ldCBuYW1lICovCisJCQkJaTMgPSAoKChpMSA8PCA4KSB8IGkyKSA8PCA4KSB8IDI1NTsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKworCQkJZm9yICh0cCA9ICZobmFtZXRhYmxlW2kzICYgKEhBU0hOQU1FU0laRS0xKV07CisJCQkgICAgIHRwLT5ueHQ7IHRwID0gdHAtPm54dCkKKwkJCQk7CisJCQl0cC0+YWRkciA9IGkzOworCQkJdHAtPm54dCA9IG5ld2huYW1lbWVtKCk7CisJCQl0cC0+bmFtZSA9IHN0cmR1cChuYW1idWYpOworCQl9CisJCWZjbG9zZShmcCk7CisJfQorCisJZm9yICh0cCA9ICZobmFtZXRhYmxlW2kgJiAoSEFTSE5BTUVTSVpFLTEpXTsgdHAtPm54dDsgdHAgPSB0cC0+bnh0KQorCQlpZiAodHAtPmFkZHIgPT0gaSkKKwkJCXJldHVybiAodHAtPm5hbWUpOworCisJLyogZGlkbid0IGhhdmUgdGhlIG5vZGUgbmFtZSAtLSBzZWUgaWYgd2UndmUgZ290IHRoZSBuZXQgbmFtZSAqLworCWkgfD0gMjU1OworCWZvciAodHAyID0gJmhuYW1ldGFibGVbaSAmIChIQVNITkFNRVNJWkUtMSldOyB0cDItPm54dDsgdHAyID0gdHAyLT5ueHQpCisJCWlmICh0cDItPmFkZHIgPT0gaSkgeworCQkJdHAtPmFkZHIgPSAoYXRuZXQgPDwgOCkgfCBhdGhvc3Q7CisJCQl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKKwkJCSh2b2lkKXNucHJpbnRmKG5hbWJ1Ziwgc2l6ZW9mKG5hbWJ1ZiksICIlcy4lZCIsCisJCQkgICAgdHAyLT5uYW1lLCBhdGhvc3QpOworCQkJdHAtPm5hbWUgPSBzdHJkdXAobmFtYnVmKTsKKwkJCXJldHVybiAodHAtPm5hbWUpOworCQl9CisKKwl0cC0+YWRkciA9IChhdG5ldCA8PCA4KSB8IGF0aG9zdDsKKwl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKKwlpZiAoYXRob3N0ICE9IDI1NSkKKwkJKHZvaWQpc25wcmludGYobmFtYnVmLCBzaXplb2YobmFtYnVmKSwgIiVkLiVkLiVkIiwKKwkJICAgIGF0bmV0ID4+IDgsIGF0bmV0ICYgMHhmZiwgYXRob3N0KTsKKwllbHNlCisJCSh2b2lkKXNucHJpbnRmKG5hbWJ1Ziwgc2l6ZW9mKG5hbWJ1ZiksICIlZC4lZCIsIGF0bmV0ID4+IDgsCisJCSAgICBhdG5ldCAmIDB4ZmYpOworCXRwLT5uYW1lID0gc3RyZHVwKG5hbWJ1Zik7CisKKwlyZXR1cm4gKHRwLT5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCB0b2sgc2t0MnN0cltdID0geworCXsgcnRtcFNrdCwJInJ0bXAiIH0sCS8qIHJvdXRpbmcgdGFibGUgbWFpbnRlbmFuY2UgKi8KKwl7IG5icFNrdCwJIm5pcyIgfSwJLyogbmFtZSBpbmZvIHNvY2tldCAqLworCXsgZWNob1NrdCwJImVjaG8iIH0sCS8qIEFwcGxlVGFsayBlY2hvIHByb3RvY29sICovCisJeyB6aXBTa3QsCSJ6aXAiIH0sCS8qIHpvbmUgaW5mbyBwcm90b2NvbCAqLworCXsgMCwJCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGRwc2t0X3N0cmluZyhyZWdpc3RlciBpbnQgc2t0KQoreworCXN0YXRpYyBjaGFyIGJ1Zls4XTsKKworCWlmIChuZmxhZykgeworCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBza3QpOworCQlyZXR1cm4gKGJ1Zik7CisJfQorCXJldHVybiAodG9rMnN0cihza3Qyc3RyLCAiJWQiLCBza3QpKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWF0bS5jIGIvcHJpbnQtYXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWF0bS5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWF0bS5jLHYgMS4zOC4yLjYgMjAwNi8wMS8yNSAxMzoyNzoyNCBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisjaW5jbHVkZSAiYXRtLmgiCisjaW5jbHVkZSAiYXRtdW5pMzEuaCIKKyNpbmNsdWRlICJsbGMuaCIKKworI2luY2x1ZGUgImV0aGVyLmgiCisKK3N0cnVjdCB0b2sgb2FtX2ZfdmFsdWVzW10gPSB7CisgICAgeyBPQU1GNFNDLCAiT0FNIEY0IChzZWdtZW50KSIgfSwKKyAgICB7IE9BTUY0RUMsICJPQU0gRjQgKGVuZCkiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCB0b2sgb2FtX2NlbGx0eXBlX3ZhbHVlc1tdID0geworICAgIHsgMHgxLCAiRmF1bHQgTWFuYWdlbWVudCIgfSwKKyAgICB7IDB4MiwgIlBlcmZvcm1hbmNlIE1hbmFnZW1lbnQiIH0sCisgICAgeyAweDgsICJhY3RpdmF0ZS9kZWFjdGl2YXRlIiB9LAorICAgIHsgMHhmLCAiU3lzdGVtIE1hbmFnZW1lbnQiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCB0b2sgb2FtX2ZtX2Z1bmN0eXBlX3ZhbHVlc1tdID0geworICAgIHsgMHgwLCAiQUlTIiB9LAorICAgIHsgMHgxLCAiUkRJIiB9LAorICAgIHsgMHg0LCAiQ29udGludWl0eSBDaGVjayIgfSwKKyAgICB7IDB4OCwgIkxvb3BiYWNrIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdHJ1Y3QgdG9rIG9hbV9wbV9mdW5jdHlwZV92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MCwgIkZvcndhcmQgTW9uaXRvcmluZyIgfSwKKyAgICB7IDB4MSwgIkJhY2t3YXJkIFJlcG9ydGluZyIgfSwKKyAgICB7IDB4MiwgIk1vbml0b3JpbmcgYW5kIFJlcG9ydGluZyIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RydWN0IHRvayBvYW1fYWRfZnVuY3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJQZXJmb3JtYW5jZSBNb25pdG9yaW5nIiB9LAorICAgIHsgMHgxLCAiQ29udGludWl0eSBDaGVjayIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgKm9hbV9mdW5jdHlwZV92YWx1ZXNbMTZdID0geworICAgIE5VTEwsCisgICAgb2FtX2ZtX2Z1bmN0eXBlX3ZhbHVlcywgLyogMSAqLworICAgIG9hbV9wbV9mdW5jdHlwZV92YWx1ZXMsIC8qIDIgKi8KKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgb2FtX2FkX2Z1bmN0eXBlX3ZhbHVlcywgLyogOCAqLworICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwKK307CisKKy8qCisgKiBQcmludCBhbiBSRkMgMTQ4MyBMTEMtZW5jYXBzdWxhdGVkIEFUTSBmcmFtZS4KKyAqLworc3RhdGljIHZvaWQKK2F0bV9sbGNfcHJpbnQoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoLCBpbnQgY2FwbGVuKQoreworCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVydHlwZTsKKworCWlmICghbGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBOVUxMLCBOVUxMLAorCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkpIHsKKwkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KKwkJaWYgKGV4dHJhY3RlZF9ldGhlcnR5cGUpIHsKKwkJCXByaW50ZigiKExMQyAlcykgIiwKKwkJZXRoZXJwcm90b19zdHJpbmcoaHRvbnMoZXh0cmFjdGVkX2V0aGVydHlwZSkpKTsKKwkJfQorCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfQorfQorCisvKgorICogR2l2ZW4gYSBTQVAgdmFsdWUsIGdlbmVyYXRlIHRoZSBMTEMgaGVhZGVyIHZhbHVlIGZvciBhIFVJIHBhY2tldAorICogd2l0aCB0aGF0IFNBUCBhcyB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBTQVAuCisgKi8KKyNkZWZpbmUgTExDX1VJX0hEUihzYXApCSgoc2FwKTw8MTYgfCAoc2FwPDw4KSB8IDB4MDMpCisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBMTEMvU05BUCBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgorICovCit1X2ludAorYXRtX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwl1X2ludCBsZW5ndGggPSBoLT5sZW47CisJdV9pbnQzMl90IGxsY2hkcjsKKwl1X2ludCBoZHJsZW4gPSAwOworCisJaWYgKGNhcGxlbiA8IDgpIHsKKwkJcHJpbnRmKCJbfGF0bV0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworICAgICAgICAvKiBDaXNjbyBTdHlsZSBOTFBJRCA/ICovCisgICAgICAgIGlmICgqcCA9PSBMTENfVUkpIHsKKyAgICAgICAgICAgIGlmIChlZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIkNOTFBJRCAiKTsKKyAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCsxLCBsZW5ndGgtMSwgY2FwbGVuLTEpOworICAgICAgICAgICAgcmV0dXJuIGhkcmxlbjsKKyAgICAgICAgfQorCisJLyoKKwkgKiBFeHRyYWN0IHRoZSBwcmVzdW1lZCBMTEMgaGVhZGVyIGludG8gYSB2YXJpYWJsZSwgZm9yIHF1aWNrCisJICogdGVzdGluZy4KKwkgKiBUaGVuIGNoZWNrIGZvciBhIGhlYWRlciB0aGF0J3MgbmVpdGhlciBhIGhlYWRlciBmb3IgYSBTTkFQCisJICogcGFja2V0IG5vciBhbiBSRkMgMjY4NCByb3V0ZWQgTkxQSUQtZm9ybWF0dGVkIFBEVSBub3IKKwkgKiBhbiA4MDIuMi1idXQtbm8tU05BUCBJUCBwYWNrZXQuCisJICovCisJbGxjaGRyID0gRVhUUkFDVF8yNEJJVFMocCk7CisJaWYgKGxsY2hkciAhPSBMTENfVUlfSERSKExMQ1NBUF9TTkFQKSAmJgorCSAgICBsbGNoZHIgIT0gTExDX1VJX0hEUihMTENTQVBfSVNPTlMpICYmCisJICAgIGxsY2hkciAhPSBMTENfVUlfSERSKExMQ1NBUF9JUCkpIHsKKwkJLyoKKwkJICogWFhYIC0gYXNzdW1lIDgwMi42IE1BQyBoZWFkZXIgZnJvbSBGb3JlIGRyaXZlci4KKwkJICoKKwkJICogVW5mb3J0dW5hdGVseSwgdGhlIGFib3ZlIGxpc3QgZG9lc24ndCBjaGVjayBmb3IKKwkJICogYWxsIGtub3duIFNBUHMsIGRvZXNuJ3QgY2hlY2sgZm9yIGhlYWRlcnMgd2hlcmUKKwkJICogdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gU0FQIGFyZW4ndCB0aGUgc2FtZSwKKwkJICogYW5kIGRvZXNuJ3QgY2hlY2sgZm9yIG5vbi1VSSBmcmFtZXMuICBJdCBhbHNvCisJCSAqIHJ1bnMgdGhlIHJpc2sgb2YgYW4gODAyLjYgTUFDIGhlYWRlciB0aGF0IGhhcHBlbnMKKwkJICogdG8gYmVnaW4gd2l0aCBvbmUgb2YgdGhvc2UgdmFsdWVzIGJlaW5nCisJCSAqIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgYW4gODAyLjIgaGVhZGVyLgorCQkgKgorCQkgKiBTbyBpcyB0aGF0IEZvcmUgZHJpdmVyIHN0aWxsIGFyb3VuZD8gIEFuZCwgaWYgc28sCisJCSAqIGlzIGl0IHN0aWxsIHB1dHRpbmcgODAyLjYgTUFDIGhlYWRlcnMgb24gQVRNCisJCSAqIHBhY2tldHM/ICBJZiBzbywgY291bGQgaXQgYmUgY2hhbmdlZCB0byB1c2UgYQorCQkgKiBuZXcgRExUX0lFRUU4MDJfNiB2YWx1ZSBpZiB3ZSBhZGRlZCBpdD8KKwkJICovCisJCWlmIChlZmxhZykKKwkJCXByaW50ZigiJTA4eCUwOHggJTA4eCUwOHggIiwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUyhwKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUyhwKzQpLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKHArOCksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMocCsxMikpOworCQlwICs9IDIwOworCQlsZW5ndGggLT0gMjA7CisJCWNhcGxlbiAtPSAyMDsKKwkJaGRybGVuICs9IDIwOworCX0KKwlhdG1fbGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKKwlyZXR1cm4gKGhkcmxlbik7Cit9CisKKy8qCisgKiBBVE0gc2lnbmFsbGluZy4KKyAqLworc3RhdGljIHN0cnVjdCB0b2sgbXNndHlwZTJzdHJbXSA9IHsKKwl7IENBTExfUFJPQ0VFRCwJCSJDYWxsX3Byb2NlZWRpbmciIH0sCisJeyBDT05ORUNULAkJIkNvbm5lY3QiIH0sCisJeyBDT05ORUNUX0FDSywJCSJDb25uZWN0X2FjayIgfSwKKwl7IFNFVFVQLAkJIlNldHVwIiB9LAorCXsgUkVMRUFTRSwJCSJSZWxlYXNlIiB9LAorCXsgUkVMRUFTRV9ET05FLAkJIlJlbGVhc2VfY29tcGxldGUiIH0sCisJeyBSRVNUQVJULAkJIlJlc3RhcnQiIH0sCisJeyBSRVNUQVJUX0FDSywJCSJSZXN0YXJ0X2FjayIgfSwKKwl7IFNUQVRVUywJCSJTdGF0dXMiIH0sCisJeyBTVEFUVVNfRU5RLAkJIlN0YXR1c19lbnF1aXJ5IiB9LAorCXsgQUREX1BBUlRZLAkJIkFkZF9wYXJ0eSIgfSwKKwl7IEFERF9QQVJUWV9BQ0ssCSJBZGRfcGFydHlfYWNrIiB9LAorCXsgQUREX1BBUlRZX1JFSiwJIkFkZF9wYXJ0eV9yZWplY3QiIH0sCisJeyBEUk9QX1BBUlRZLAkJIkRyb3BfcGFydHkiIH0sCisJeyBEUk9QX1BBUlRZX0FDSywJIkRyb3BfcGFydHlfYWNrIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyB2b2lkCitzaWdfcHJpbnQoY29uc3QgdV9jaGFyICpwLCBpbnQgY2FwbGVuKQoreworCWJwZl91X2ludDMyIGNhbGxfcmVmOworCisJaWYgKGNhcGxlbiA8IFBST1RPX1BPUykgeworCQlwcmludGYoIlt8YXRtXSIpOworCQlyZXR1cm47CisJfQorCWlmIChwW1BST1RPX1BPU10gPT0gUTI5MzEpIHsKKwkJLyoKKwkJICogcHJvdG9jb2w6US4yOTMxIGZvciBVc2VyIHRvIE5ldHdvcmsgSW50ZXJmYWNlIAorCQkgKiAoVU5JIDMuMSkgc2lnbmFsbGluZworCQkgKi8KKwkJcHJpbnRmKCJRLjI5MzEiKTsKKwkJaWYgKGNhcGxlbiA8IE1TR19UWVBFX1BPUykgeworCQkJcHJpbnRmKCIgW3xhdG1dIik7CisJCQlyZXR1cm47CisJCX0KKwkJcHJpbnRmKCI6JXMgIiwKKwkJICAgIHRvazJzdHIobXNndHlwZTJzdHIsICJtc2d0eXBlIyVkIiwgcFtNU0dfVFlQRV9QT1NdKSk7CisKKwkJaWYgKGNhcGxlbiA8IENBTExfUkVGX1BPUyszKSB7CisJCQlwcmludGYoIlt8YXRtXSIpOworCQkJcmV0dXJuOworCQl9CisJCWNhbGxfcmVmID0gRVhUUkFDVF8yNEJJVFMoJnBbQ0FMTF9SRUZfUE9TXSk7CisJCXByaW50ZigiQ0FMTF9SRUY6MHglMDZ4IiwgY2FsbF9yZWYpOworCX0gZWxzZSB7CisJCS8qIFNDQ09QIHdpdGggc29tZSB1bmtub3duIHByb3RvY29sIGF0b3AgaXQgKi8KKwkJcHJpbnRmKCJTU0NPUCwgcHJvdG8gJWQgIiwgcFtQUk9UT19QT1NdKTsKKwl9Cit9CisKKy8qCisgKiBQcmludCBhbiBBVE0gUERVIChzdWNoIGFzIGFuIEFBTDUgUERVKS4KKyAqLwordm9pZAorYXRtX3ByaW50KHVfaW50IHZwaSwgdV9pbnQgdmNpLCB1X2ludCB0cmFmdHlwZSwgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsCisgICAgdV9pbnQgY2FwbGVuKQoreworCWlmIChlZmxhZykKKwkJcHJpbnRmKCJWUEk6JXUgVkNJOiV1ICIsIHZwaSwgdmNpKTsKKworCWlmICh2cGkgPT0gMCkgeworCQlzd2l0Y2ggKHZjaSkgeworCisJCWNhc2UgUFBDOgorCQkJc2lnX3ByaW50KHAsIGNhcGxlbik7CisJCQlyZXR1cm47CisKKwkJY2FzZSBCQ0M6CisJCQlwcmludGYoImJyb2FkY2FzdCBzaWc6ICIpOworCQkJcmV0dXJuOworCisJCWNhc2UgT0FNRjRTQzogLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgT0FNRjRFQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9hbV9wcmludChwLCBsZW5ndGgsIEFUTV9PQU1fSEVDKTsKKwkJCXJldHVybjsKKworCQljYXNlIE1FVEFDOgorCQkJcHJpbnRmKCJtZXRhOiAiKTsKKwkJCXJldHVybjsKKworCQljYXNlIElMTUlDOgorCQkJcHJpbnRmKCJpbG1pOiAiKTsKKwkJCXNubXBfcHJpbnQocCwgbGVuZ3RoKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXN3aXRjaCAodHJhZnR5cGUpIHsKKworCWNhc2UgQVRNX0xMQzoKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBBc3N1bWVzIHRyYWZmaWMgaXMgTExDIGlmIHVua25vd24uCisJCSAqLworCQlhdG1fbGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUTV9MQU5FOgorCQlsYW5lX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKKwkJYnJlYWs7CisJfQorfQorCitpbnQgCitvYW1fcHJpbnQgKGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBoZWMpIHsKKworICAgIHVfaW50MzJfdCBjZWxsX2hlYWRlcjsKKyAgICB1X2ludDE2X3QgY2VsbF90eXBlLCBmdW5jX3R5cGUsdnBpLHZjaSxwYXlsb2FkLGNscDsKKworICAgIGNlbGxfaGVhZGVyID0gRVhUUkFDVF8zMkJJVFMocCtoZWMpOworICAgIGNlbGxfdHlwZSA9ICgoKihwKzQraGVjKSk+PjQpICYgMHgwZjsKKyAgICBmdW5jX3R5cGUgPSAqKHArNCtoZWMpICYgMHgwZjsKKworICAgIHZwaSA9IChjZWxsX2hlYWRlcj4+MjApJjB4ZmY7CisgICAgdmNpID0gKGNlbGxfaGVhZGVyPj40KSYweGZmZmY7CisgICAgcGF5bG9hZCA9IChjZWxsX2hlYWRlcj4+MSkmMHg3OworICAgIGNscCA9IGNlbGxfaGVhZGVyJjB4MTsKKworICAgIHByaW50ZigiJXMsIHZwaSAldSwgdmNpICV1LCBwYXlsb2FkICV1LCBjbHAgJXUsICIsCisgICAgICAgICAgIHRvazJzdHIob2FtX2ZfdmFsdWVzLCAiT0FNIEY1IiwgdmNpKSwKKyAgICAgICAgICAgdnBpLCB2Y2ksIHBheWxvYWQsIGNscCk7CisKKyAgICBwcmludGYoImNlbGwtdHlwZSAlcyAoJXUpIiwKKyAgICAgICAgICAgdG9rMnN0cihvYW1fY2VsbHR5cGVfdmFsdWVzLCAidW5rbm93biIsIGNlbGxfdHlwZSksCisgICAgICAgICAgIGNlbGxfdHlwZSk7CisKKyAgICBpZiAob2FtX2Z1bmN0eXBlX3ZhbHVlc1tjZWxsX3R5cGVdID09IE5VTEwpCisgICAgICAgIHByaW50ZigiLCBmdW5jLXR5cGUgdW5rbm93biAoJXUpIiwgZnVuY190eXBlKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiLCBmdW5jLXR5cGUgJXMgKCV1KSIsCisgICAgICAgICAgICAgICBiaXR0b2syc3RyKG9hbV9mdW5jdHlwZV92YWx1ZXNbY2VsbF90eXBlXSwibm9uZSIsZnVuY190eXBlKSwKKyAgICAgICAgICAgICAgIGZ1bmNfdHlwZSk7CisKKyAgICBwcmludGYoIiwgbGVuZ3RoICV1IixsZW5ndGgpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtYmVlcC5jIGIvcHJpbnQtYmVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDBkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1iZWVwLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCwgUmljaGFyZCBTaGFycGUKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogQlNELXN0eWxlIGxpY2VuY2UgdGhhdCBhY2NvbXBhbmllcyB0Y3BkdW1wIG9yIHVuZGVyIHRoZSBHTlUgR1BMCisgKiB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKgorICogcHJpbnQtYmVlcC5jCisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1iZWVwLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjoxMyBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpZmRlZiBIQVZFX01FTU9SWV9ICisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisvKiBDaGVjayBmb3IgYSBzdHJpbmcgYnV0IG5vdCBnbyBiZXlvbmQgbGVuZ3RoCisgKiBSZXR1cm4gVFJVRSBvbiBtYXRjaCwgRkFMU0Ugb3RoZXJ3aXNlCisgKgorICogTG9va3MgYXQgdGhlIGZpcnN0IGZldyBjaGFycyB1cCB0byB0bDEgLi4uCisgKi8KKworc3RhdGljIGludCBsX3N0cm5zdGFydChjb25zdCBjaGFyICosIHVfaW50LCBjb25zdCBjaGFyICosIHVfaW50KTsKKworc3RhdGljIGludAorbF9zdHJuc3RhcnQoY29uc3QgY2hhciAqdHN0cjEsIHVfaW50IHRsMSwgY29uc3QgY2hhciAqc3RyMiwgdV9pbnQgbDIpCit7CisKKwlpZiAodGwxID4gbDIpCisJCXJldHVybiAwOworCisJcmV0dXJuIChzdHJuY21wKHRzdHIxLCBzdHIyLCB0bDEpID09IDAgPyAxIDogMCk7Cit9CisKK3ZvaWQKK2JlZXBfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCisJaWYgKGxfc3RybnN0YXJ0KCJNU0ciLCA0LCAoY29uc3QgY2hhciAqKWJwLCBsZW5ndGgpKSAvKiBBIFJFUXVlc3QgKi8KKwkJcHJpbnRmKCIgQkVFUCBNU0ciKTsKKwllbHNlIGlmIChsX3N0cm5zdGFydCgiUlBZICIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpCisJCXByaW50ZigiIEJFRVAgUlBZIik7CisJZWxzZSBpZiAobF9zdHJuc3RhcnQoIkVSUiAiLCA0LCAoY29uc3QgY2hhciAqKWJwLCBsZW5ndGgpKQorCQlwcmludGYoIiBCRUVQIEVSUiIpOworCWVsc2UgaWYgKGxfc3RybnN0YXJ0KCJBTlMgIiwgNCwgKGNvbnN0IGNoYXIgKilicCwgbGVuZ3RoKSkKKwkJcHJpbnRmKCIgQkVFUCBBTlMiKTsKKwllbHNlIGlmIChsX3N0cm5zdGFydCgiTlVMICIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpCisJCXByaW50ZigiIEJFRVAgTlVMIik7CisJZWxzZSBpZiAobF9zdHJuc3RhcnQoIlNFUSAiLCA0LCAoY29uc3QgY2hhciAqKWJwLCBsZW5ndGgpKQorCQlwcmludGYoIiBCRUVQIFNFUSIpOworCWVsc2UgaWYgKGxfc3RybnN0YXJ0KCJFTkQiLCA0LCAoY29uc3QgY2hhciAqKWJwLCBsZW5ndGgpKQorCQlwcmludGYoIiBCRUVQIEVORCIpOworCWVsc2UKKwkJcHJpbnRmKCIgQkVFUCAocGF5bG9hZCBvciB1bmRlY29kZWQpIik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1iZmQuYyBiL3ByaW50LWJmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTU5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1iZmQuYwpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQorICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCisgKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAorICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAorICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYmZkLmMsdiAxLjUuMi41IDIwMDYvMDIvMDIgMDY6MzY6MzcgaGFubmVzIEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKyNpbmNsdWRlICJ1ZHAuaCIKKworLyoKKyAqIENvbnRyb2wgcGFja2V0LCBCRkR2MCwgZHJhZnQta2F0ei13YXJkLWJmZC0wMS50eHQKKyAqCisgKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHxWZXJzIHwgIERpYWcgICB8SHxEfFB8RnwgUnN2ZCAgfCAgRGV0ZWN0IE11bHQgIHwgICAgTGVuZ3RoICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgTXkgRGlzY3JpbWluYXRvciAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgIFlvdXIgRGlzY3JpbWluYXRvciAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgIERlc2lyZWQgTWluIFRYIEludGVydmFsICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBNaW4gUlggSW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgICAgICAgICAgICAgICBSZXF1aXJlZCBNaW4gRWNobyBSWCBJbnRlcnZhbCAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworCisvKiAKKyAqICBDb250cm9sIHBhY2tldCwgQkZEdjEsIGRyYWZ0LWlldGYtYmZkLWJhc2UtMDIudHh0CisgKgorICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8VmVycyB8ICBEaWFnICAgfFN0YXxQfEZ8Q3xBfER8UnwgIERldGVjdCBNdWx0ICB8ICAgIExlbmd0aCAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgIE15IERpc2NyaW1pbmF0b3IgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgICAgICAgICAgICBZb3VyIERpc2NyaW1pbmF0b3IgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICBEZXNpcmVkIE1pbiBUWCBJbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgTWluIFJYIEludGVydmFsICAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgICAgICAgUmVxdWlyZWQgTWluIEVjaG8gUlggSW50ZXJ2YWwgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KKworc3RydWN0IGJmZF9oZWFkZXJfdCB7CisgICAgdV9pbnQ4X3QgdmVyc2lvbl9kaWFnOworICAgIHVfaW50OF90IGZsYWdzOworICAgIHVfaW50OF90IGRldGVjdF90aW1lX211bHRpcGxpZXI7CisgICAgdV9pbnQ4X3QgbGVuZ3RoOworICAgIHVfaW50OF90IG15X2Rpc2NyaW1pbmF0b3JbNF07CisgICAgdV9pbnQ4X3QgeW91cl9kaXNjcmltaW5hdG9yWzRdOworICAgIHVfaW50OF90IGRlc2lyZWRfbWluX3R4X2ludGVydmFsWzRdOworICAgIHVfaW50OF90IHJlcXVpcmVkX21pbl9yeF9pbnRlcnZhbFs0XTsKKyAgICB1X2ludDhfdCByZXF1aXJlZF9taW5fZWNob19pbnRlcnZhbFs0XTsKK307CisKKy8qCisgKiAgICBBbiBvcHRpb25hbCBBdXRoZW50aWNhdGlvbiBIZWFkZXIgbWF5IGJlIHByZXNlbnQKKyAqCisgKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICBBdXRoIFR5cGUgICB8ICAgQXV0aCBMZW4gICAgfCAgICBBdXRoZW50aWNhdGlvbiBEYXRhLi4uICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisKK3N0cnVjdCBiZmRfYXV0aF9oZWFkZXJfdCB7CisgICAgdV9pbnQ4X3QgYXV0aF90eXBlOworICAgIHVfaW50OF90IGF1dGhfbGVuOworICAgIHVfaW50OF90IGF1dGhfZGF0YTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MV9hdXRoZW50aWNhdGlvbl92YWx1ZXNbXSA9IHsKKyAgICB7IDAsICAgICAgICAiUmVzZXJ2ZWQiIH0sCisgICAgeyAxLCAgICAgICAgIlNpbXBsZSBQYXNzd29yZCIgfSwKKyAgICB7IDIsICAgICAgICAiS2V5ZWQgTUQ1IiB9LAorICAgIHsgMywgICAgICAgICJNZXRpY3Vsb3VzIEtleWVkIE1ENSIgfSwKKyAgICB7IDQsICAgICAgICAiS2V5ZWQgU0hBMSIgfSwKKyAgICB7IDUsICAgICAgICAiTWV0aWN1bG91cyBLZXllZCBTSEExIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lCUJGRF9FWFRSQUNUX1ZFUlNJT04oeCkgKCgoeCkmMHhlMCk+PjUpCisjZGVmaW5lCUJGRF9FWFRSQUNUX0RJQUcoeCkgICAgICgoeCkmMHgxZikKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYmZkX3BvcnRfdmFsdWVzW10gPSB7CisgICAgeyBCRkRfQ09OVFJPTF9QT1JULCAiQ29udHJvbCIgfSwKKyAgICB7IEJGRF9FQ0hPX1BPUlQsICAgICJFY2hvIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF9kaWFnX3ZhbHVlc1tdID0geworICAgIHsgMCwgIk5vIERpYWdub3N0aWMiIH0sCisgICAgeyAxLCAiQ29udHJvbCBEZXRlY3Rpb24gVGltZSBFeHBpcmVkIiB9LAorICAgIHsgMiwgIkVjaG8gRnVuY3Rpb24gRmFpbGVkIiB9LAorICAgIHsgMywgIk5laWdoYm9yIFNpZ25hbGVkIFNlc3Npb24gRG93biIgfSwKKyAgICB7IDQsICJGb3J3YXJkaW5nIFBsYW5lIFJlc2V0IiB9LAorICAgIHsgNSwgIlBhdGggRG93biIgfSwKKyAgICB7IDYsICJDb25jYXRlbmF0ZWQgUGF0aCBEb3duIiB9LAorICAgIHsgNywgIkFkbWluaXN0cmF0aXZlbHkgRG93biIgfSwKKyAgICB7IDgsICJSZXZlcnNlIENvbmNhdGVuYXRlZCBQYXRoIERvd24iIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MF9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHg4MCwJIkkgSGVhciBZb3UiIH0sCisgICAgeyAweDQwLAkiRGVtYW5kIiB9LAorICAgIHsgMHgyMCwJIlBvbGwiIH0sCisgICAgeyAweDEwLAkiRmluYWwiIH0sCisgICAgeyAweDA4LAkiUmVzZXJ2ZWQiIH0sCisgICAgeyAweDA0LAkiUmVzZXJ2ZWQiIH0sCisgICAgeyAweDAyLAkiUmVzZXJ2ZWQiIH0sCisgICAgeyAweDAxLAkiUmVzZXJ2ZWQiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKyNkZWZpbmUgQkZEX0ZMQUdfQVVUSCAweDA0CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgyMCwgIlBvbGwiIH0sCisgICAgeyAweDEwLCAiRmluYWwiIH0sCisgICAgeyAweDA4LCAiQ29udHJvbCBQbGFuZSBJbmRlcGVuZGVudCIgfSwKKyAgICB7IEJGRF9GTEFHX0FVVEgsICJBdXRoZW50aWNhdGlvbiBQcmVzZW50IiB9LAorICAgIHsgMHgwMiwgIkRlbWFuZCIgfSwKKyAgICB7IDB4MDEsICJSZXNlcnZlZCIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYmZkX3YxX3N0YXRlX3ZhbHVlc1tdID0geworICAgIHsgMCwgIkFkbWluRG93biIgfSwKKyAgICB7IDEsICJEb3duIiB9LAorICAgIHsgMiwgIkluaXQiIH0sCisgICAgeyAzLCAiVXAiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3ZvaWQKK2JmZF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbiwgcmVnaXN0ZXIgdV9pbnQgcG9ydCkKK3sKKyAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9oZWFkZXJfdCAqYmZkX2hlYWRlcjsKKyAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hdXRoX2hlYWRlcl90ICpiZmRfYXV0aF9oZWFkZXI7CisgICAgICAgIHVfaW50OF90IHZlcnNpb247CisKKyAgICAgICAgYmZkX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgYmZkX2hlYWRlcl90ICopcHB0cjsKKyAgICAgICAgVENIRUNLKCpiZmRfaGVhZGVyKTsKKyAgICAgICAgdmVyc2lvbiA9IEJGRF9FWFRSQUNUX1ZFUlNJT04oYmZkX2hlYWRlci0+dmVyc2lvbl9kaWFnKTsKKworICAgICAgICBzd2l0Y2ggKHBvcnQgPDwgOCB8IHZlcnNpb24pIHsKKworICAgICAgICAgICAgLyogQkZEdjAgKi8KKyAgICAgICAgY2FzZSAoQkZEX0NPTlRST0xfUE9SVCA8PCA4KToKKyAgICAgICAgICAgIGlmICh2ZmxhZyA8IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50ZigiQkZEdiV1LCAlcywgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGJmZF92MF9mbGFnX3ZhbHVlcywgIm5vbmUiLCBiZmRfaGVhZGVyLT5mbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGYoIkJGRHYldSwgbGVuZ3RoOiAldVxuXHQlcywgRmxhZ3M6IFslc10sIERpYWdub3N0aWM6ICVzICgweCUwMngpIiwKKyAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAorICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoYmZkX3YwX2ZsYWdfdmFsdWVzLCAibm9uZSIsIGJmZF9oZWFkZXItPmZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9kaWFnX3ZhbHVlcywidW5rbm93biIsQkZEX0VYVFJBQ1RfRElBRyhiZmRfaGVhZGVyLT52ZXJzaW9uX2RpYWcpKSwKKyAgICAgICAgICAgICAgICAgICBCRkRfRVhUUkFDVF9ESUFHKGJmZF9oZWFkZXItPnZlcnNpb25fZGlhZykpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGYoIlxuXHREZXRlY3Rpb24gVGltZXIgTXVsdGlwbGllcjogJXUgKCV1IG1zIERldGVjdGlvbiB0aW1lKSwgQkZEIExlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmRldGVjdF90aW1lX211bHRpcGxpZXIsCisgICAgICAgICAgICAgICAgICAgYmZkX2hlYWRlci0+ZGV0ZWN0X3RpbWVfbXVsdGlwbGllciAqIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPmRlc2lyZWRfbWluX3R4X2ludGVydmFsKS8xMDAwLAorICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmxlbmd0aCk7CisKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0TXkgRGlzY3JpbWluYXRvcjogMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+bXlfZGlzY3JpbWluYXRvcikpOworICAgICAgICAgICAgcHJpbnRmKCIsIFlvdXIgRGlzY3JpbWluYXRvcjogMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+eW91cl9kaXNjcmltaW5hdG9yKSk7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgIERlc2lyZWQgbWluIFR4IEludGVydmFsOiAgICAlNHUgbXMiLCBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5kZXNpcmVkX21pbl90eF9pbnRlcnZhbCkvMTAwMCk7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgIFJlcXVpcmVkIG1pbiBSeCBJbnRlcnZhbDogICAlNHUgbXMiLCBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5yZXF1aXJlZF9taW5fcnhfaW50ZXJ2YWwpLzEwMDApOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBSZXF1aXJlZCBtaW4gRWNobyBJbnRlcnZhbDogJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+cmVxdWlyZWRfbWluX2VjaG9faW50ZXJ2YWwpLzEwMDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIEJGRHYxICovCisgICAgICAgIGNhc2UgKEJGRF9DT05UUk9MX1BPUlQgPDwgOCB8IDEpOgorICAgICAgICAgICAgaWYgKHZmbGFnIDwgMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJCRkR2JXUsICVzLCBTdGF0ZSAlcywgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF92MV9zdGF0ZV92YWx1ZXMsICJ1bmtub3duICgldSkiLCAoYmZkX2hlYWRlci0+ZmxhZ3MgJiAweGMwKSA+PiA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihiZmRfdjFfZmxhZ192YWx1ZXMsICJub25lIiwgYmZkX2hlYWRlci0+ZmxhZ3MgJiAweDNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaW50ZigiQkZEdiV1LCBsZW5ndGg6ICV1XG5cdCVzLCBTdGF0ZSAlcywgRmxhZ3M6IFslc10sIERpYWdub3N0aWM6ICVzICgweCUwMngpIiwKKyAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3YxX3N0YXRlX3ZhbHVlcywgInVua25vd24gKCV1KSIsIChiZmRfaGVhZGVyLT5mbGFncyAmIDB4YzApID4+IDYpLAorICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoYmZkX3YxX2ZsYWdfdmFsdWVzLCAibm9uZSIsIGJmZF9oZWFkZXItPmZsYWdzICYgMHgzZiksCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihiZmRfZGlhZ192YWx1ZXMsInVua25vd24iLEJGRF9FWFRSQUNUX0RJQUcoYmZkX2hlYWRlci0+dmVyc2lvbl9kaWFnKSksCisgICAgICAgICAgICAgICAgICAgQkZEX0VYVFJBQ1RfRElBRyhiZmRfaGVhZGVyLT52ZXJzaW9uX2RpYWcpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHJpbnRmKCJcblx0RGV0ZWN0aW9uIFRpbWVyIE11bHRpcGxpZXI6ICV1ICgldSBtcyBEZXRlY3Rpb24gdGltZSksIEJGRCBMZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgICAgICBiZmRfaGVhZGVyLT5kZXRlY3RfdGltZV9tdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmRldGVjdF90aW1lX211bHRpcGxpZXIgKiBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5kZXNpcmVkX21pbl90eF9pbnRlcnZhbCkvMTAwMCwKKyAgICAgICAgICAgICAgICAgICBiZmRfaGVhZGVyLT5sZW5ndGgpOworCisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdE15IERpc2NyaW1pbmF0b3I6IDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPm15X2Rpc2NyaW1pbmF0b3IpKTsKKyAgICAgICAgICAgIHByaW50ZigiLCBZb3VyIERpc2NyaW1pbmF0b3I6IDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPnlvdXJfZGlzY3JpbWluYXRvcikpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBEZXNpcmVkIG1pbiBUeCBJbnRlcnZhbDogICAgJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+ZGVzaXJlZF9taW5fdHhfaW50ZXJ2YWwpLzEwMDApOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBSZXF1aXJlZCBtaW4gUnggSW50ZXJ2YWw6ICAgJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+cmVxdWlyZWRfbWluX3J4X2ludGVydmFsKS8xMDAwKTsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgUmVxdWlyZWQgbWluIEVjaG8gSW50ZXJ2YWw6ICU0dSBtcyIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPnJlcXVpcmVkX21pbl9lY2hvX2ludGVydmFsKS8xMDAwKTsKKworICAgICAgICAgICAgaWYgKGJmZF9oZWFkZXItPmZsYWdzICYgQkZEX0ZMQUdfQVVUSCkgeworICAgICAgICAgICAgICAgIHBwdHIgKz0gc2l6ZW9mIChjb25zdCBzdHJ1Y3QgYmZkX2hlYWRlcl90KTsKKyAgICAgICAgICAgICAgICBiZmRfYXV0aF9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGJmZF9hdXRoX2hlYWRlcl90ICopcHB0cjsKKyAgICAgICAgICAgICAgICBUQ0hFQ0syKCpiZmRfYXV0aF9oZWFkZXIsIHNpemVvZihjb25zdCBzdHJ1Y3QgYmZkX2F1dGhfaGVhZGVyX3QpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQlcyAoJXUpIEF1dGhlbnRpY2F0aW9uLCBsZW5ndGggJXUgcHJlc2VudCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3YxX2F1dGhlbnRpY2F0aW9uX3ZhbHVlcywiVW5rbm93biIsYmZkX2F1dGhfaGVhZGVyLT5hdXRoX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICBiZmRfYXV0aF9oZWFkZXItPmF1dGhfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmZkX2F1dGhfaGVhZGVyLT5hdXRoX2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogQkZEdjAgKi8KKyAgICAgICAgY2FzZSAoQkZEX0VDSE9fUE9SVCA8PCA4KTogLyogbm90IHlldCBzdXBwb3J0ZWQgLSBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIC8qIEJGRHYxICovCisgICAgICAgIGNhc2UgKEJGRF9FQ0hPX1BPUlQgPDwgOCB8IDEpOgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIkJGRCwgJXMsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3BvcnRfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgcG9ydCksCisgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgICAgIGlmICh2ZmxhZyA+PSAxKSB7CisgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0IixsZW4pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisKK3RydW5jOgorICAgICAgICBwcmludGYoIlt8QkZEXSIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtYmdwLmMgYi9wcmludC1iZ3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGFhNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtYmdwLmMKQEAgLTAsMCArMSwyMDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEV4dGVuc2l2ZWx5IG1vZGlmaWVkIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpIGZvciBtb3JlCisgKiBjb21wbGV0ZSBCR1Agc3VwcG9ydC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1iZ3AuYyx2IDEuOTEuMi4xMiAyMDA3LzA3LzE0IDIyOjI2OjM1IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZGVjb2RlX3ByZWZpeC5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAiYmdwLmgiCisjaW5jbHVkZSAibDJ2cG4uaCIKKyNpbmNsdWRlICJhZi5oIgorCitzdHJ1Y3QgYmdwIHsKKwl1X2ludDhfdCBiZ3BfbWFya2VyWzE2XTsKKwl1X2ludDE2X3QgYmdwX2xlbjsKKwl1X2ludDhfdCBiZ3BfdHlwZTsKK307CisjZGVmaW5lIEJHUF9TSVpFCQkxOQkvKiB1bmFsaWduZWQgKi8KKworI2RlZmluZSBCR1BfT1BFTgkJMQorI2RlZmluZSBCR1BfVVBEQVRFCQkyCisjZGVmaW5lIEJHUF9OT1RJRklDQVRJT04JMworI2RlZmluZSBCR1BfS0VFUEFMSVZFCQk0CisjZGVmaW5lIEJHUF9ST1VURV9SRUZSRVNIICAgICAgIDUKKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX21zZ192YWx1ZXNbXSA9IHsKKyAgICB7IEJHUF9PUEVOLCAgICAgICAgICAgICAgICAgIk9wZW4ifSwKKyAgICB7IEJHUF9VUERBVEUsICAgICAgICAgICAgICAgIlVwZGF0ZSJ9LAorICAgIHsgQkdQX05PVElGSUNBVElPTiwgICAgICAgICAiTm90aWZpY2F0aW9uIn0sCisgICAgeyBCR1BfS0VFUEFMSVZFLCAgICAgICAgICAgICJLZWVwYWxpdmUifSwKKyAgICB7IEJHUF9ST1VURV9SRUZSRVNILCAgICAgICAgIlJvdXRlIFJlZnJlc2gifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdHJ1Y3QgYmdwX29wZW4geworCXVfaW50OF90IGJncG9fbWFya2VyWzE2XTsKKwl1X2ludDE2X3QgYmdwb19sZW47CisJdV9pbnQ4X3QgYmdwb190eXBlOworCXVfaW50OF90IGJncG9fdmVyc2lvbjsKKwl1X2ludDE2X3QgYmdwb19teWFzOworCXVfaW50MTZfdCBiZ3BvX2hvbGR0aW1lOworCXVfaW50MzJfdCBiZ3BvX2lkOworCXVfaW50OF90IGJncG9fb3B0bGVuOworCS8qIG9wdGlvbnMgc2hvdWxkIGZvbGxvdyAqLworfTsKKyNkZWZpbmUgQkdQX09QRU5fU0laRQkJMjkJLyogdW5hbGlnbmVkICovCisKK3N0cnVjdCBiZ3Bfb3B0IHsKKwl1X2ludDhfdCBiZ3BvcHRfdHlwZTsKKwl1X2ludDhfdCBiZ3BvcHRfbGVuOworCS8qIHZhcmlhYmxlIGxlbmd0aCAqLworfTsKKyNkZWZpbmUgQkdQX09QVF9TSVpFCQkyCS8qIHNvbWUgY29tcGlsZXJzIG1heSBwYWQgdG8gNCBieXRlcyAqLworCisjZGVmaW5lIEJHUF9VUERBVEVfTUlOU0laRSAgICAgIDIzCisKK3N0cnVjdCBiZ3Bfbm90aWZpY2F0aW9uIHsKKwl1X2ludDhfdCBiZ3BuX21hcmtlclsxNl07CisJdV9pbnQxNl90IGJncG5fbGVuOworCXVfaW50OF90IGJncG5fdHlwZTsKKwl1X2ludDhfdCBiZ3BuX21ham9yOworCXVfaW50OF90IGJncG5fbWlub3I7Cit9OworI2RlZmluZSBCR1BfTk9USUZJQ0FUSU9OX1NJWkUJCTIxCS8qIHVuYWxpZ25lZCAqLworCitzdHJ1Y3QgYmdwX3JvdXRlX3JlZnJlc2ggeworICAgIHVfaW50OF90ICBiZ3BfbWFya2VyWzE2XTsKKyAgICB1X2ludDE2X3QgbGVuOworICAgIHVfaW50OF90ICB0eXBlOworICAgIHVfaW50OF90ICBhZmlbMl07IC8qIHRoZSBjb21waWxlciBtZXNzZXMgdGhpcyBzdHJ1Y3R1cmUgdXAgICAgICAgICAgICAgICAqLworICAgIHVfaW50OF90ICByZXM7ICAgIC8qIHdoZW4gZG9pbmcgbWlzYWxpZ25lZCBzZXF1ZW5jZXMgb2YgaW50OCBhbmQgaW50MTYgICAqLworICAgIHVfaW50OF90ICBzYWZpOyAgIC8qIGFmaSBzaG91bGQgYmUgaW50MTYgLSBzbyB3ZSBoYXZlIHRvIGFjY2VzcyBpdCB1c2luZyAqLworfTsgICAgICAgICAgICAgICAgICAgIC8qIEVYVFJBQ1RfMTZCSVRTKCZiZ3Bfcm91dGVfcmVmcmVzaC0+YWZpKSAoc2lnaCkgICAgICAqLyAKKyNkZWZpbmUgQkdQX1JPVVRFX1JFRlJFU0hfU0laRSAgICAgICAgICAyMworCitzdHJ1Y3QgYmdwX2F0dHIgeworCXVfaW50OF90IGJncGFfZmxhZ3M7CisJdV9pbnQ4X3QgYmdwYV90eXBlOworCXVuaW9uIHsKKwkJdV9pbnQ4X3QgbGVuOworCQl1X2ludDE2X3QgZWxlbjsKKwl9IGJncGFfbGVuOworI2RlZmluZSBiZ3BfYXR0cl9sZW4ocCkgXAorCSgoKHApLT5iZ3BhX2ZsYWdzICYgMHgxMCkgPyBcCisJCUVYVFJBQ1RfMTZCSVRTKCYocCktPmJncGFfbGVuLmVsZW4pIDogKHApLT5iZ3BhX2xlbi5sZW4pCisjZGVmaW5lIGJncF9hdHRyX29mZihwKSBcCisJKCgocCktPmJncGFfZmxhZ3MgJiAweDEwKSA/IDQgOiAzKQorfTsKKworI2RlZmluZSBCR1BUWVBFX09SSUdJTgkJCTEKKyNkZWZpbmUgQkdQVFlQRV9BU19QQVRICQkJMgorI2RlZmluZSBCR1BUWVBFX05FWFRfSE9QCQkzCisjZGVmaW5lIEJHUFRZUEVfTVVMVElfRVhJVF9ESVNDCQk0CisjZGVmaW5lIEJHUFRZUEVfTE9DQUxfUFJFRgkJNQorI2RlZmluZSBCR1BUWVBFX0FUT01JQ19BR0dSRUdBVEUJNgorI2RlZmluZSBCR1BUWVBFX0FHR1JFR0FUT1IJCTcKKyNkZWZpbmUJQkdQVFlQRV9DT01NVU5JVElFUwkJOAkvKiBSRkMxOTk3ICovCisjZGVmaW5lCUJHUFRZUEVfT1JJR0lOQVRPUl9JRAkJOQkvKiBSRkMxOTk4ICovCisjZGVmaW5lCUJHUFRZUEVfQ0xVU1RFUl9MSVNUCQkxMAkvKiBSRkMxOTk4ICovCisjZGVmaW5lCUJHUFRZUEVfRFBBCQkJMTEJLyogZHJhZnQtaWV0Zi1pZHItYmdwLWRwYSAqLworI2RlZmluZQlCR1BUWVBFX0FEVkVSVElTRVJTCQkxMgkvKiBSRkMxODYzICovCisjZGVmaW5lCUJHUFRZUEVfUkNJRF9QQVRICQkxMwkvKiBSRkMxODYzICovCisjZGVmaW5lIEJHUFRZUEVfTVBfUkVBQ0hfTkxSSQkJMTQJLyogUkZDMjI4MyAqLworI2RlZmluZSBCR1BUWVBFX01QX1VOUkVBQ0hfTkxSSQkJMTUJLyogUkZDMjI4MyAqLworI2RlZmluZSBCR1BUWVBFX0VYVERfQ09NTVVOSVRJRVMgICAgICAgIDE2ICAgICAgLyogZHJhZnQtaWV0Zi1pZHItYmdwLWV4dC1jb21tdW5pdGllcyAqLworI2RlZmluZSBCR1BUWVBFX0FUVFJfU0VUICAgICAgICAgICAgICAgMTI4ICAgICAgLyogZHJhZnQtbWFycXVlcy1wcHZwbi1pYmdwICovCisKKyNkZWZpbmUgQkdQX01QX05MUklfTUlOU0laRSAgICAgICAgICAgICAgMyAgICAgICAvKiBFbmQgb2YgUklCIE1hcmtlciBkZXRlY3Rpb24gKi8KKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX2F0dHJfdmFsdWVzW10gPSB7CisgICAgeyBCR1BUWVBFX09SSUdJTiwgICAgICAgICAgICJPcmlnaW4ifSwKKyAgICB7IEJHUFRZUEVfQVNfUEFUSCwgICAgICAgICAgIkFTIFBhdGgifSwKKyAgICB7IEJHUFRZUEVfTkVYVF9IT1AsICAgICAgICAgIk5leHQgSG9wIn0sCisgICAgeyBCR1BUWVBFX01VTFRJX0VYSVRfRElTQywgICJNdWx0aSBFeGl0IERpc2NyaW1pbmF0b3IifSwKKyAgICB7IEJHUFRZUEVfTE9DQUxfUFJFRiwgICAgICAgIkxvY2FsIFByZWZlcmVuY2UifSwKKyAgICB7IEJHUFRZUEVfQVRPTUlDX0FHR1JFR0FURSwgIkF0b21pYyBBZ2dyZWdhdGUifSwKKyAgICB7IEJHUFRZUEVfQUdHUkVHQVRPUiwgICAgICAgIkFnZ3JlZ2F0b3IifSwKKyAgICB7IEJHUFRZUEVfQ09NTVVOSVRJRVMsICAgICAgIkNvbW11bml0eSJ9LAorICAgIHsgQkdQVFlQRV9PUklHSU5BVE9SX0lELCAgICAiT3JpZ2luYXRvciBJRCJ9LAorICAgIHsgQkdQVFlQRV9DTFVTVEVSX0xJU1QsICAgICAiQ2x1c3RlciBMaXN0In0sCisgICAgeyBCR1BUWVBFX0RQQSwgICAgICAgICAgICAgICJEUEEifSwKKyAgICB7IEJHUFRZUEVfQURWRVJUSVNFUlMsICAgICAgIkFkdmVydGlzZXJzIn0sCisgICAgeyBCR1BUWVBFX1JDSURfUEFUSCwgICAgICAgICJSQ0lEIFBhdGggLyBDbHVzdGVyIElEIn0sCisgICAgeyBCR1BUWVBFX01QX1JFQUNIX05MUkksICAgICJNdWx0aS1Qcm90b2NvbCBSZWFjaCBOTFJJIn0sCisgICAgeyBCR1BUWVBFX01QX1VOUkVBQ0hfTkxSSSwgICJNdWx0aS1Qcm90b2NvbCBVbnJlYWNoIE5MUkkifSwKKyAgICB7IEJHUFRZUEVfRVhURF9DT01NVU5JVElFUywgIkV4dGVuZGVkIENvbW11bml0eSJ9LAorICAgIHsgQkdQVFlQRV9BVFRSX1NFVCwgICAgICAgICAiQXR0cmlidXRlIFNldCJ9LAorICAgIHsgMjU1LCAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIGRldmVsb3BtZW50In0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZSBCR1BfQVNfU0VUICAgICAgICAgICAgIDEKKyNkZWZpbmUgQkdQX0FTX1NFUVVFTkNFICAgICAgICAyCisjZGVmaW5lIEJHUF9DT05GRURfQVNfU0VRVUVOQ0UgMyAvKiBkcmFmdC1pZXRmLWlkci1yZmMzMDY1YmlzLTAxICovCisjZGVmaW5lIEJHUF9DT05GRURfQVNfU0VUICAgICAgNCAvKiBkcmFmdC1pZXRmLWlkci1yZmMzMDY1YmlzLTAxICAqLworCitzdGF0aWMgc3RydWN0IHRvayBiZ3BfYXNfcGF0aF9zZWdtZW50X29wZW5fdmFsdWVzW10gPSB7CisgICAgeyBCR1BfQVNfU0VRVUVOQ0UsICAgICAgICAgIiJ9LAorICAgIHsgQkdQX0FTX1NFVCwgICAgICAgICAgICAgICJ7ICJ9LAorICAgIHsgQkdQX0NPTkZFRF9BU19TRVFVRU5DRSwgICIoICJ9LAorICAgIHsgQkdQX0NPTkZFRF9BU19TRVQsICAgICAgICIoeyAifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBiZ3BfYXNfcGF0aF9zZWdtZW50X2Nsb3NlX3ZhbHVlc1tdID0geworICAgIHsgQkdQX0FTX1NFUVVFTkNFLCAgICAgICAgICIifSwKKyAgICB7IEJHUF9BU19TRVQsICAgICAgICAgICAgICAifSJ9LAorICAgIHsgQkdQX0NPTkZFRF9BU19TRVFVRU5DRSwgICIpIn0sCisgICAgeyBCR1BfQ09ORkVEX0FTX1NFVCwgICAgICAgIn0pIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZSBCR1BfT1BUX0FVVEggICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQkdQX09QVF9DQVAgICAgICAgICAgICAgICAgICAgICAyCisKKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX29wdF92YWx1ZXNbXSA9IHsKKyAgICB7IEJHUF9PUFRfQVVUSCwgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIEluZm9ybWF0aW9uIn0sCisgICAgeyBCR1BfT1BUX0NBUCwgICAgICAgICAgICAgICJDYXBhYmlsaXRpZXMgQWR2ZXJ0aXNlbWVudCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUgQkdQX0NBUENPREVfTVAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEJHUF9DQVBDT0RFX1JSICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBCR1BfQ0FQQ09ERV9PUkYgICAgICAgICAgICAgICAgIDMgLyogWFhYICovCisjZGVmaW5lIEJHUF9DQVBDT0RFX1JFU1RBUlQgICAgICAgICAgICA2NCAvKiBkcmFmdC1pZXRmLWlkci1yZXN0YXJ0LTA1ICAqLworI2RlZmluZSBCR1BfQ0FQQ09ERV9BU19ORVcgICAgICAgICAgICAgNjUgLyogWFhYICovCisjZGVmaW5lIEJHUF9DQVBDT0RFX0RZTl9DQVAgICAgICAgICAgICA2NyAvKiBYWFggKi8KKyNkZWZpbmUgQkdQX0NBUENPREVfUlJfQ0lTQ08gICAgICAgICAgMTI4CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGJncF9jYXBjb2RlX3ZhbHVlc1tdID0geworICAgIHsgQkdQX0NBUENPREVfTVAsICAgICAgICAgICAiTXVsdGlwcm90b2NvbCBFeHRlbnNpb25zIn0sCisgICAgeyBCR1BfQ0FQQ09ERV9SUiwgICAgICAgICAgICJSb3V0ZSBSZWZyZXNoIn0sCisgICAgeyBCR1BfQ0FQQ09ERV9PUkYsICAgICAgICAgICJDb29wZXJhdGl2ZSBSb3V0ZSBGaWx0ZXJpbmcifSwKKyAgICB7IEJHUF9DQVBDT0RFX1JFU1RBUlQsICAgICAgIkdyYWNlZnVsIFJlc3RhcnQifSwKKyAgICB7IEJHUF9DQVBDT0RFX0FTX05FVywgICAgICAgIjMyLUJpdCBBUyBOdW1iZXIifSwKKyAgICB7IEJHUF9DQVBDT0RFX0RZTl9DQVAsICAgICAgIkR5bmFtaWMgQ2FwYWJpbGl0eSJ9LAorICAgIHsgQkdQX0NBUENPREVfUlJfQ0lTQ08sICAgICAiUm91dGUgUmVmcmVzaCAoQ2lzY28pIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZSBCR1BfTk9USUZZX01BSk9SX01TRyAgICAgICAgICAgIDEKKyNkZWZpbmUgQkdQX05PVElGWV9NQUpPUl9PUEVOICAgICAgICAgICAyCisjZGVmaW5lIEJHUF9OT1RJRllfTUFKT1JfVVBEQVRFICAgICAgICAgMworI2RlZmluZSBCR1BfTk9USUZZX01BSk9SX0hPTERUSU1FICAgICAgIDQKKyNkZWZpbmUgQkdQX05PVElGWV9NQUpPUl9GU00gICAgICAgICAgICA1CisjZGVmaW5lIEJHUF9OT1RJRllfTUFKT1JfQ0VBU0UgICAgICAgICAgNgorI2RlZmluZSBCR1BfTk9USUZZX01BSk9SX0NBUCAgICAgICAgICAgIDcKKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX25vdGlmeV9tYWpvcl92YWx1ZXNbXSA9IHsKKyAgICB7IEJHUF9OT1RJRllfTUFKT1JfTVNHLCAgICAgIk1lc3NhZ2UgSGVhZGVyIEVycm9yIn0sCisgICAgeyBCR1BfTk9USUZZX01BSk9SX09QRU4sICAgICJPUEVOIE1lc3NhZ2UgRXJyb3IifSwKKyAgICB7IEJHUF9OT1RJRllfTUFKT1JfVVBEQVRFLCAgIlVQREFURSBNZXNzYWdlIEVycm9yIn0sCisgICAgeyBCR1BfTk9USUZZX01BSk9SX0hPTERUSU1FLCJIb2xkIFRpbWVyIEV4cGlyZWQifSwKKyAgICB7IEJHUF9OT1RJRllfTUFKT1JfRlNNLCAgICAgIkZpbml0ZSBTdGF0ZSBNYWNoaW5lIEVycm9yIn0sCisgICAgeyBCR1BfTk9USUZZX01BSk9SX0NFQVNFLCAgICJDZWFzZSJ9LAorICAgIHsgQkdQX05PVElGWV9NQUpPUl9DQVAsICAgICAiQ2FwYWJpbGl0eSBNZXNzYWdlIEVycm9yIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogZHJhZnQtaWV0Zi1pZHItY2Vhc2Utc3ViY29kZS0wMiAqLworI2RlZmluZSBCR1BfTk9USUZZX01JTk9SX0NFQVNFX01BWFBSRlggIDEKK3N0YXRpYyBzdHJ1Y3QgdG9rIGJncF9ub3RpZnlfbWlub3JfY2Vhc2VfdmFsdWVzW10gPSB7CisgICAgeyBCR1BfTk9USUZZX01JTk9SX0NFQVNFX01BWFBSRlgsICJNYXhpbXVtIE51bWJlciBvZiBQcmVmaXhlcyBSZWFjaGVkIn0sCisgICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAgICJBZG1pbmlzdHJhdGl2ZWx5IFNodXRkb3duIn0sCisgICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAgICJQZWVyIFVuY29uZmlndXJlZCJ9LAorICAgIHsgNCwgICAgICAgICAgICAgICAgICAgICAgICAiQWRtaW5pc3RyYXRpdmVseSBSZXNldCJ9LAorICAgIHsgNSwgICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbiBSZWplY3RlZCJ9LAorICAgIHsgNiwgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgQ29uZmlndXJhdGlvbiBDaGFuZ2UifSwKKyAgICB7IDcsICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gQ29sbGlzaW9uIFJlc29sdXRpb24ifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBiZ3Bfbm90aWZ5X21pbm9yX21zZ192YWx1ZXNbXSA9IHsKKyAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gTm90IFN5bmNocm9uaXplZCJ9LAorICAgIHsgMiwgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIE1lc3NhZ2UgTGVuZ3RoIn0sCisgICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgTWVzc2FnZSBUeXBlIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX25vdGlmeV9taW5vcl9vcGVuX3ZhbHVlc1tdID0geworICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgVmVyc2lvbiBOdW1iZXIifSwKKyAgICB7IDIsICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBQZWVyIEFTIn0sCisgICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQkdQIElkZW50aWZpZXIifSwKKyAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIE9wdGlvbmFsIFBhcmFtZXRlciJ9LAorICAgIHsgNSwgICAgICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gRmFpbHVyZSJ9LAorICAgIHsgNiwgICAgICAgICAgICAgICAgICAgICAgICAiVW5hY2NlcHRhYmxlIEhvbGQgVGltZSJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGJncF9ub3RpZnlfbWlub3JfdXBkYXRlX3ZhbHVlc1tdID0geworICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkIEF0dHJpYnV0ZSBMaXN0In0sCisgICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgV2VsbC1rbm93biBBdHRyaWJ1dGUifSwKKyAgICB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgV2VsbC1rbm93biBBdHRyaWJ1dGUifSwKKyAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBGbGFncyBFcnJvciJ9LAorICAgIHsgNSwgICAgICAgICAgICAgICAgICAgICAgICAiQXR0cmlidXRlIExlbmd0aCBFcnJvciJ9LAorICAgIHsgNiwgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBPUklHSU4gQXR0cmlidXRlIn0sCisgICAgeyA3LCAgICAgICAgICAgICAgICAgICAgICAgICJBUyBSb3V0aW5nIExvb3AifSwKKyAgICB7IDgsICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTkVYVF9IT1AgQXR0cmlidXRlIn0sCisgICAgeyA5LCAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25hbCBBdHRyaWJ1dGUgRXJyb3IifSwKKyAgICB7IDEwLCAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgTmV0d29yayBGaWVsZCJ9LAorICAgIHsgMTEsICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkIEFTX1BBVEgifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBiZ3Bfbm90aWZ5X21pbm9yX2NhcF92YWx1ZXNbXSA9IHsKKyAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQWN0aW9uIFZhbHVlIiB9LAorICAgIHsgMiwgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDYXBhYmlsaXR5IExlbmd0aCIgfSwKKyAgICB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBDYXBhYmlsaXR5IFZhbHVlIiB9LAorICAgIHsgNCwgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgQ2FwYWJpbGl0eSBDb2RlIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBiZ3Bfb3JpZ2luX3ZhbHVlc1tdID0geworICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgICAiSUdQIn0sCisgICAgeyAxLCAgICAgICAgICAgICAgICAgICAgICAgICJFR1AifSwKKyAgICB7IDIsICAgICAgICAgICAgICAgICAgICAgICAgIkluY29tcGxldGUifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBTdWJzZXF1ZW50IGFkZHJlc3MgZmFtaWx5IGlkZW50aWZpZXIsIFJGQzIyODMgc2VjdGlvbiA3ICovCisjZGVmaW5lIFNBRk5VTV9SRVMgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTQUZOVU1fVU5JQ0FTVCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0FGTlVNX01VTFRJQ0FTVCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNBRk5VTV9VTklNVUxUSUNBU1QgICAgICAgICAgICAgMworLyogbGFiZWxlZCBCR1AgUkZDMzEwNyAqLworI2RlZmluZSBTQUZOVU1fTEFCVU5JQ0FTVCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0FGTlVNX1RVTk5FTCAgICAgICAgICAgICAgICAgICA2NCAvKiBYWFggKi8KKyNkZWZpbmUgU0FGTlVNX1ZQTFMgICAgICAgICAgICAgICAgICAgICA2NSAvKiBYWFggKi8KKyNkZWZpbmUgU0FGTlVNX01EVCAgICAgICAgICAgICAgICAgICAgICA2NiAvKiBYWFggKi8KKy8qIFNlY3Rpb24gNC4zLjQgb2YgZHJhZnQtcm9zZW4tcmZjMjU0N2Jpcy0wMy50eHQgICovCisjZGVmaW5lIFNBRk5VTV9WUE5VTklDQVNUICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIFNBRk5VTV9WUE5NVUxUSUNBU1QgICAgICAgICAgICAgMTI5CisjZGVmaW5lIFNBRk5VTV9WUE5VTklNVUxUSUNBU1QgICAgICAgICAgMTMwCisvKiBkcmFmdC1tYXJxdWVzLXBwdnBuLXJ0LWNvbnN0cmFpbi0wMS50eHQgKi8KKyNkZWZpbmUgU0FGTlVNX1JUX1JPVVRJTkdfSU5GTyAgICAgICAgICAxMzIKKworI2RlZmluZSBCR1BfVlBOX1JEX0xFTiAgICAgICAgICAgICAgICAgIDgKKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX3NhZmlfdmFsdWVzW10gPSB7CisgICAgeyBTQUZOVU1fUkVTLCAgICAgICAgICAgICAgICJSZXNlcnZlZCJ9LAorICAgIHsgU0FGTlVNX1VOSUNBU1QsICAgICAgICAgICAiVW5pY2FzdCJ9LAorICAgIHsgU0FGTlVNX01VTFRJQ0FTVCwgICAgICAgICAiTXVsdGljYXN0In0sCisgICAgeyBTQUZOVU1fVU5JTVVMVElDQVNULCAgICAgICJVbmljYXN0K011bHRpY2FzdCJ9LAorICAgIHsgU0FGTlVNX0xBQlVOSUNBU1QsICAgICAgICAibGFiZWxlZCBVbmljYXN0In0sCisgICAgeyBTQUZOVU1fVFVOTkVMLCAgICAgICAgICAgICJUdW5uZWwifSwKKyAgICB7IFNBRk5VTV9WUExTLCAgICAgICAgICAgICAgIlZQTFMifSwKKyAgICB7IFNBRk5VTV9NRFQsICAgICAgICAgICAgICAgIk1EVCJ9LAorICAgIHsgU0FGTlVNX1ZQTlVOSUNBU1QsICAgICAgICAibGFiZWxlZCBWUE4gVW5pY2FzdCJ9LAorICAgIHsgU0FGTlVNX1ZQTk1VTFRJQ0FTVCwgICAgICAibGFiZWxlZCBWUE4gTXVsdGljYXN0In0sCisgICAgeyBTQUZOVU1fVlBOVU5JTVVMVElDQVNULCAgICJsYWJlbGVkIFZQTiBVbmljYXN0K011bHRpY2FzdCJ9LAorICAgIHsgU0FGTlVNX1JUX1JPVVRJTkdfSU5GTywgICAiUm91dGUgVGFyZ2V0IFJvdXRpbmcgSW5mb3JtYXRpb24ifSwgLyogZHJhZnQtbWFycXVlcy1wcHZwbi1ydC1jb25zdHJhaW4tMDEudHh0ICovCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qIHdlbGwta25vd24gY29tbXVuaXR5ICovCisjZGVmaW5lIEJHUF9DT01NVU5JVFlfTk9fRVhQT1JUCQkJMHhmZmZmZmYwMQorI2RlZmluZSBCR1BfQ09NTVVOSVRZX05PX0FEVkVSVAkJCTB4ZmZmZmZmMDIKKyNkZWZpbmUgQkdQX0NPTU1VTklUWV9OT19FWFBPUlRfU1VCQ09ORkVECTB4ZmZmZmZmMDMKKworLyogRXh0ZW5kZWQgY29tbXVuaXR5IHR5cGUgLSBkcmFmdC1pZXRmLWlkci1iZ3AtZXh0LWNvbW11bml0aWVzLTA1ICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX1JUXzAgICAgICAgIDB4MDAwMiAgLyogUm91dGUgVGFyZ2V0LEZvcm1hdCBBUygyYnl0ZXMpOkFOKDRieXRlcykgKi8KKyNkZWZpbmUgQkdQX0VYVF9DT01fUlRfMSAgICAgICAgMHgwMTAyICAvKiBSb3V0ZSBUYXJnZXQsRm9ybWF0IElQIGFkZHJlc3M6QU4oMmJ5dGVzKSAqLworI2RlZmluZSBCR1BfRVhUX0NPTV9SVF8yICAgICAgICAweDAyMDIgIC8qIFJvdXRlIFRhcmdldCxGb3JtYXQgQU4oNGJ5dGVzKTpsb2NhbCgyYnl0ZXMpICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX1JPXzAgICAgICAgIDB4MDAwMyAgLyogUm91dGUgT3JpZ2luLEZvcm1hdCBBUygyYnl0ZXMpOkFOKDRieXRlcykgKi8KKyNkZWZpbmUgQkdQX0VYVF9DT01fUk9fMSAgICAgICAgMHgwMTAzICAvKiBSb3V0ZSBPcmlnaW4sRm9ybWF0IElQIGFkZHJlc3M6QU4oMmJ5dGVzKSAqLworI2RlZmluZSBCR1BfRVhUX0NPTV9ST18yICAgICAgICAweDAyMDMgIC8qIFJvdXRlIE9yaWdpbixGb3JtYXQgQU4oNGJ5dGVzKTpsb2NhbCgyYnl0ZXMpICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX0xJTktCQU5EICAgIDB4NDAwNCAgLyogTGluayBCYW5kd2lkdGgsRm9ybWF0IEFTKDJCKTpCYW5kd2lkdGgoNEIpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmZjMjU0NyBiZ3AtbXBscy12cG5zICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX0NJU0NPX01DQVNUIDB4MDAwOSAgLyogY2lzY28gcHJvcHJpZXRhcnkgKi8KKworI2RlZmluZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOICAweDAwMDUgIC8qIE9TUEYgRG9tYWluIElEIC8gVlBOIG9mIE9yaWdpbiAgLSBkcmFmdC1yb3Nlbi12cG5zLW9zcGYtYmdwLW1wbHMgKi8KKyNkZWZpbmUgQkdQX0VYVF9DT01fVlBOX09SSUdJTjIgMHgwMTA1ICAvKiBkdXBsaWNhdGUgLSBrZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSAqLworI2RlZmluZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOMyAweDAyMDUgIC8qIGR1cGxpY2F0ZSAtIGtlZXAgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5ICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX1ZQTl9PUklHSU40IDB4ODAwNSAgLyogZHVwbGljYXRlIC0ga2VlcCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgKi8KKworI2RlZmluZSBCR1BfRVhUX0NPTV9PU1BGX1JUWVBFICAweDAzMDYgIC8qIE9TUEYgUm91dGUgVHlwZSxGb3JtYXQgQXJlYSg0Qik6Um91dGVUeXBlKDFCKTpPcHRpb25zKDFCKSAqLworI2RlZmluZSBCR1BfRVhUX0NPTV9PU1BGX1JUWVBFMiAweDgwMDAgIC8qIGR1cGxpY2F0ZSAtIGtlZXAgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5ICovCisKKyNkZWZpbmUgQkdQX0VYVF9DT01fT1NQRl9SSUQgICAgMHgwMTA3ICAvKiBPU1BGIFJvdXRlciBJRCxGb3JtYXQgUm91dGVySUQoNEIpOlVudXNlZCgyQikgKi8KKyNkZWZpbmUgQkdQX0VYVF9DT01fT1NQRl9SSUQyICAgMHg4MDAxICAvKiBkdXBsaWNhdGUgLSBrZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSAqLyAKKworI2RlZmluZSBCR1BfRVhUX0NPTV9MMklORk8gICAgICAweDgwMGEgIC8qIGRyYWZ0LWtvbXBlbGxhLXBwdnBuLWwydnBuICovCisKKy8qIGh0dHA6Ly93d3cuY2lzY28uY29tL2VuL1VTL3RlY2gvdGs0MzYvdGs0MjgvdGVjaG5vbG9naWVzX3RlY2hfbm90ZTA5MTg2YTAwODAxZWIwOWEuc2h0bWwgICovCisjZGVmaW5lIEJHUF9FWFRfQ09NX0VJR1JQX0dFTiAgIDB4ODgwMAorI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfQVNfREVMQVkgIDB4ODgwMQorI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfUkVMX05IX0JXIDB4ODgwMgorI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfTE9BRF9NVFUgIDB4ODgwMworI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9FWFRfUkVNQVNfUkVNSUQgIDB4ODgwNAorI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9FWFRfUkVNUFJPVE9fUkVNTUVUUklDIDB4ODgwNQorCitzdGF0aWMgc3RydWN0IHRvayBiZ3BfZXh0ZF9jb21tX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDgwMDAsICAgICAgICAgICAgICAgICAgInZlbmRvci1zcGVjaWZpYyJ9LAorICAgIHsgMHg0MDAwLCAgICAgICAgICAgICAgICAgICJub24tdHJhbnNpdGl2ZSJ9LAorICAgIHsgMCwgTlVMTH0sCit9OworCitzdGF0aWMgc3RydWN0IHRvayBiZ3BfZXh0ZF9jb21tX3N1YnR5cGVfdmFsdWVzW10gPSB7CisgICAgeyBCR1BfRVhUX0NPTV9SVF8wLCAgICAgICAgInRhcmdldCJ9LAorICAgIHsgQkdQX0VYVF9DT01fUlRfMSwgICAgICAgICJ0YXJnZXQifSwKKyAgICB7IEJHUF9FWFRfQ09NX1JUXzIsICAgICAgICAidGFyZ2V0In0sCisgICAgeyBCR1BfRVhUX0NPTV9ST18wLCAgICAgICAgIm9yaWdpbiJ9LAorICAgIHsgQkdQX0VYVF9DT01fUk9fMSwgICAgICAgICJvcmlnaW4ifSwKKyAgICB7IEJHUF9FWFRfQ09NX1JPXzIsICAgICAgICAib3JpZ2luIn0sCisgICAgeyBCR1BfRVhUX0NPTV9MSU5LQkFORCwgICAgImxpbmstQlcifSwKKyAgICB7IEJHUF9FWFRfQ09NX0NJU0NPX01DQVNULCAibWR0LWdyb3VwIn0sCisgICAgeyBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOLCAgIm9zcGYtZG9tYWluIn0sCisgICAgeyBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOMiwgIm9zcGYtZG9tYWluIn0sCisgICAgeyBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOMywgIm9zcGYtZG9tYWluIn0sCisgICAgeyBCR1BfRVhUX0NPTV9WUE5fT1JJR0lONCwgIm9zcGYtZG9tYWluIn0sCisgICAgeyBCR1BfRVhUX0NPTV9PU1BGX1JUWVBFLCAgIm9zcGYtcm91dGUtdHlwZSJ9LAorICAgIHsgQkdQX0VYVF9DT01fT1NQRl9SVFlQRTIsICJvc3BmLXJvdXRlLXR5cGUifSwKKyAgICB7IEJHUF9FWFRfQ09NX09TUEZfUklELCAgICAib3NwZi1yb3V0ZXItaWQifSwKKyAgICB7IEJHUF9FWFRfQ09NX09TUEZfUklEMiwgICAib3NwZi1yb3V0ZXItaWQifSwKKyAgICB7IEJHUF9FWFRfQ09NX0wySU5GTywgICAgICAibGF5ZXIyLWluZm8ifSwgCisgICAgeyBCR1BfRVhUX0NPTV9FSUdSUF9HRU4gLCAiZWlncnAtZ2VuZXJhbC1yb3V0ZSAoZmxhZywgdGFnKSIgfSwKKyAgICB7IEJHUF9FWFRfQ09NX0VJR1JQX01FVFJJQ19BU19ERUxBWSAsICJlaWdycC1yb3V0ZS1tZXRyaWMgKEFTLCBkZWxheSkiIH0sCisgICAgeyBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfUkVMX05IX0JXICwgImVpZ3JwLXJvdXRlLW1ldHJpYyAocmVsaWFiaWxpdHksIG5leHRob3AsIGJhbmR3aWR0aCkiIH0sCisgICAgeyBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfTE9BRF9NVFUgLCAiZWlncnAtcm91dGUtbWV0cmljIChsb2FkLCBNVFUpIiB9LAorICAgIHsgQkdQX0VYVF9DT01fRUlHUlBfRVhUX1JFTUFTX1JFTUlEICwgImVpZ3JwLWV4dGVybmFsLXJvdXRlIChyZW1vdGUtQVMsIHJlbW90ZS1JRCkiIH0sCisgICAgeyBCR1BfRVhUX0NPTV9FSUdSUF9FWFRfUkVNUFJPVE9fUkVNTUVUUklDICwgImVpZ3JwLWV4dGVybmFsLXJvdXRlIChyZW1vdGUtcHJvdG8sIHJlbW90ZS1tZXRyaWMpIiB9LAorICAgIHsgMCwgTlVMTH0sCit9OworCisvKiBPU1BGIGNvZGVzIGZvciAgQkdQX0VYVF9DT01fT1NQRl9SVFlQRSBkcmFmdC1yb3Nlbi12cG5zLW9zcGYtYmdwLW1wbHMgICovCisjZGVmaW5lIEJHUF9PU1BGX1JUWVBFX1JUUiAgICAgIDEgLyogT1NQRiBSb3V0ZXIgTFNBICovCisjZGVmaW5lIEJHUF9PU1BGX1JUWVBFX05FVCAgICAgIDIgLyogT1NQRiBOZXR3b3JrIExTQSAqLworI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9TVU0gICAgICAzIC8qIE9TUEYgU3VtbWFyeSBMU0EgKi8KKyNkZWZpbmUgQkdQX09TUEZfUlRZUEVfRVhUICAgICAgNSAvKiBPU1BGIEV4dGVybmFsIExTQSwgbm90ZSB0aGF0IEFTQlIgZG9lc24ndCBhcHBseSB0byBNUExTLVZQTiAqLworI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9OU1NBICAgICA3IC8qIE9TUEYgTlNTQSBFeHRlcm5hbCovCisjZGVmaW5lIEJHUF9PU1BGX1JUWVBFX1NIQU0gICAgIDEyOSAvKiBPU1BGLU1QTFMtVlBOIFNoYW0gbGluayAqLworI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9NRVRSSUNfVFlQRSAweDEgLyogTFNCIG9mIFJUWVBFIE9wdGlvbnMgRmllbGQgKi8KKworc3RhdGljIHN0cnVjdCB0b2sgYmdwX2V4dGRfY29tbV9vc3BmX3J0eXBlX3ZhbHVlc1tdID0geworICB7IEJHUF9PU1BGX1JUWVBFX1JUUiwgIlJvdXRlciIgfSwgIAorICB7IEJHUF9PU1BGX1JUWVBFX05FVCwgIk5ldHdvcmsiIH0sICAKKyAgeyBCR1BfT1NQRl9SVFlQRV9TVU0sICJTdW1tYXJ5IiB9LCAgCisgIHsgQkdQX09TUEZfUlRZUEVfRVhULCAiRXh0ZXJuYWwiIH0sICAKKyAgeyBCR1BfT1NQRl9SVFlQRV9OU1NBLCJOU1NBIEV4dGVybmFsIiB9LAorICB7IEJHUF9PU1BGX1JUWVBFX1NIQU0sIk1QTFMtVlBOIFNoYW0iIH0sICAKKyAgeyAwLCBOVUxMIH0sCit9OworCitpbnQKK2RlY29kZV9wcmVmaXg0KGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCit7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwl1X2ludCBwbGVuOworCisJVENIRUNLKHBwdHJbMF0pOworCXBsZW4gPSBwcHRyWzBdOworCWlmICgzMiA8IHBsZW4pCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlUQ0hFQ0syKHBwdHJbMV0sIChwbGVuICsgNykgLyA4KTsKKwltZW1jcHkoJmFkZHIsICZwcHRyWzFdLCAocGxlbiArIDcpIC8gOCk7CisJaWYgKHBsZW4gJSA4KSB7CisJCSgodV9jaGFyICopJmFkZHIpWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KKwkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7CisJfQorCXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMvJWQiLCBnZXRuYW1lKCh1X2NoYXIgKikmYWRkciksIHBsZW4pOworCXJldHVybiAxICsgKHBsZW4gKyA3KSAvIDg7CisKK3RydW5jOgorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludAorZGVjb2RlX2xhYmVsZWRfcHJlZml4NChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQoreworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisJdV9pbnQgcGxlbjsKKworCVRDSEVDSyhwcHRyWzBdKTsKKwlwbGVuID0gcHB0clswXTsgICAvKiBnZXQgcHJlZml4IGxlbmd0aCAqLworCisgICAgICAgIC8qIHRoaXMgaXMgb25lIG9mIHRoZSB3ZWlyZG5lc3NlcyBvZiByZmMzMTA3CisgICAgICAgICAgIHRoZSBsYWJlbCBsZW5ndGggKGFjdHVhbGx5IHRoZSBsYWJlbCArIENPUyBiaXRzKQorICAgICAgICAgICBpcyBhZGRlZCB0byB0aGUgcHJlZml4IGxlbmd0aDsKKyAgICAgICAgICAgd2UgYWxzbyBkbyBvbmx5IHJlYWQgb3V0IGp1c3Qgb25lIGxhYmVsIC0KKyAgICAgICAgICAgdGhlcmUgaXMgbm8gcmVhbCBhcHBsaWNhdGlvbiBmb3IgYWR2ZXJ0aXNlbWVudCBvZgorICAgICAgICAgICBzdGFja2VkIGxhYmVscyBpbiBhIGEgc2luZ2xlIEJHUCBtZXNzYWdlCisgICAgICAgICovCisKKwlpZiAoMjQgPiBwbGVuKQorCQlyZXR1cm4gLTE7CisKKyAgICAgICAgcGxlbi09MjQ7IC8qIGFkanVzdCBwcmVmaXhsZW4gLSBsYWJlbGxlbmd0aCAqLworCisJaWYgKDMyIDwgcGxlbikKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCVRDSEVDSzIocHB0cls0XSwgKHBsZW4gKyA3KSAvIDgpOworCW1lbWNweSgmYWRkciwgJnBwdHJbNF0sIChwbGVuICsgNykgLyA4KTsKKwlpZiAocGxlbiAlIDgpIHsKKwkJKCh1X2NoYXIgKikmYWRkcilbKHBsZW4gKyA3KSAvIDggLSAxXSAmPQorCQkJKCgweGZmMDAgPj4gKHBsZW4gJSA4KSkgJiAweGZmKTsKKwl9CisgICAgICAgIC8qIHRoZSBsYWJlbCBtYXkgZ2V0IG9mZnNldHRlZCBieSA0IGJpdHMgc28gbGV0cyBzaGlmdCBpdCByaWdodCAqLworCXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMvJWQsIGxhYmVsOiV1ICVzIiwKKyAgICAgICAgICAgICAgICAgZ2V0bmFtZSgodV9jaGFyICopJmFkZHIpLAorICAgICAgICAgICAgICAgICBwbGVuLAorICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwcHRyKzEpPj40LAorICAgICAgICAgICAgICAgICAoKHBwdHJbM10mMSk9PTApID8gIihCT0dVUzogQm90dG9tIG9mIFN0YWNrIE5PVCBzZXQhKSIgOiAiKGJvdHRvbSkiICk7CisKKwlyZXR1cm4gNCArIChwbGVuICsgNykgLyA4OworCit0cnVuYzoKKwlyZXR1cm4gLTI7Cit9CisKKy8qIFJEcyBhbmQgUlRzIHNoYXJlIHRoZSBzYW1lIHNlbWFudGljcworICogd2UgdXNlIGJncF92cG5fcmRfcHJpbnQgZm9yCisgKiBwcmludGluZyByb3V0ZSB0YXJnZXRzIGluc2lkZSBhIE5MUkkgKi8KK2NoYXIgKgorYmdwX3Zwbl9yZF9wcmludCAoY29uc3QgdV9jaGFyICpwcHRyKSB7CisKKyAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzdHJpbmcgKi8KKyAgICBzdGF0aWMgY2hhciByZFtzaXplb2YoInh4eHh4eHh4eHg6eHh4eHggKHh4eC54eHgueHh4Lnh4eDp4eHh4eCkiKV07CisgICAgY2hhciAqcG9zID0gcmQ7CisKKyAgICAvKiBvayBsZXRzIGxvYWQgdGhlIFJEIGZvcm1hdCAqLworICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMocHB0cikpIHsKKworICAgICAgICAvKiBBUzpJUC1hZGRyZXNzIGZtdCovCisgICAgY2FzZSAwOgorICAgICAgICBzbnByaW50Zihwb3MsIHNpemVvZihyZCkgLSAocG9zIC0gcmQpLCAiJXU6JXUuJXUuJXUuJXUiLAorICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocHB0cisyKSwgKihwcHRyKzQpLCAqKHBwdHIrNSksICoocHB0cis2KSwgKihwcHRyKzcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIElQLWFkZHJlc3M6QVMgZm10Ki8KKworICAgIGNhc2UgMToKKyAgICAgICAgc25wcmludGYocG9zLCBzaXplb2YocmQpIC0gKHBvcyAtIHJkKSwgIiV1LiV1LiV1LiV1OiV1IiwKKyAgICAgICAgICAgICoocHB0cisyKSwgKihwcHRyKzMpLCAqKHBwdHIrNCksICoocHB0cis1KSwgRVhUUkFDVF8xNkJJVFMocHB0cis2KSk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIDQtYnl0ZS1BUzpudW1iZXIgZm10Ki8KKyAgICBjYXNlIDI6CisgICAgICAgIHNucHJpbnRmKHBvcywgc2l6ZW9mKHJkKSAtIChwb3MgLSByZCksICIldToldSAoJXUuJXUuJXUuJXU6JXUpIiwKKyAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHBwdHIrMiksIEVYVFJBQ1RfMTZCSVRTKHBwdHIrNiksCisgICAgICAgICAgICAqKHBwdHIrMiksICoocHB0ciszKSwgKihwcHRyKzQpLCAqKHBwdHIrNSksIEVYVFJBQ1RfMTZCSVRTKHBwdHIrNikpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbnByaW50Zihwb3MsIHNpemVvZihyZCkgLSAocG9zIC0gcmQpLCAidW5rbm93biBSRCBmb3JtYXQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcyArPSBzdHJsZW4ocG9zKTsKKyAgICAqKHBvcykgPSAnXDAnOworICAgIHJldHVybiAocmQpOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfcnRfcm91dGluZ19pbmZvKGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCit7CisJdV9pbnQ4X3Qgcm91dGVfdGFyZ2V0WzhdOworCXVfaW50IHBsZW47CisKKwlUQ0hFQ0socHB0clswXSk7CisJcGxlbiA9IHBwdHJbMF07ICAgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KKworCWlmICgwID09IHBsZW4pCisJCXJldHVybiAxOyAvKiBkZWZhdWx0IHJvdXRlIHRhcmdldCAqLworCisJaWYgKDMyID4gcGxlbikKKwkJcmV0dXJuIC0xOworCisgICAgICAgIHBsZW4tPTMyOyAvKiBhZGp1c3QgcHJlZml4IGxlbmd0aCAqLworCisJaWYgKDY0IDwgcGxlbikKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZyb3V0ZV90YXJnZXQsIDAsIHNpemVvZihyb3V0ZV90YXJnZXQpKTsKKwlUQ0hFQ0syKHBwdHJbMV0sIChwbGVuICsgNykgLyA4KTsKKwltZW1jcHkoJnJvdXRlX3RhcmdldCwgJnBwdHJbMV0sIChwbGVuICsgNykgLyA4KTsKKwlpZiAocGxlbiAlIDgpIHsKKwkJKCh1X2NoYXIgKikmcm91dGVfdGFyZ2V0KVsocGxlbiArIDcpIC8gOCAtIDFdICY9CisJCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOworCX0KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIm9yaWdpbiBBUzogJXUsIHJvdXRlIHRhcmdldCAlcyIsCisgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHBwdHIrMSksCisgICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQoKHVfY2hhciAqKSZyb3V0ZV90YXJnZXQpKTsKKworCXJldHVybiA1ICsgKHBsZW4gKyA3KSAvIDg7CisKK3RydW5jOgorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludAorZGVjb2RlX2xhYmVsZWRfdnBuX3ByZWZpeDQoY29uc3QgdV9jaGFyICpwcHRyLCBjaGFyICpidWYsIHVfaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCXVfaW50IHBsZW47CisKKwlUQ0hFQ0socHB0clswXSk7CisJcGxlbiA9IHBwdHJbMF07ICAgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KKworCWlmICgoMjQrNjQpID4gcGxlbikKKwkJcmV0dXJuIC0xOworCisgICAgICAgIHBsZW4tPSgyNCs2NCk7IC8qIGFkanVzdCBwcmVmaXhsZW4gLSBsYWJlbGxlbmd0aCAtIFJEIGxlbiovCisKKwlpZiAoMzIgPCBwbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJVENIRUNLMihwcHRyWzEyXSwgKHBsZW4gKyA3KSAvIDgpOworCW1lbWNweSgmYWRkciwgJnBwdHJbMTJdLCAocGxlbiArIDcpIC8gOCk7CisJaWYgKHBsZW4gJSA4KSB7CisJCSgodV9jaGFyICopJmFkZHIpWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KKwkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7CisJfQorICAgICAgICAvKiB0aGUgbGFiZWwgbWF5IGdldCBvZmZzZXR0ZWQgYnkgNCBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIlJEOiAlcywgJXMvJWQsIGxhYmVsOiV1ICVzIiwKKyAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChwcHRyKzQpLAorICAgICAgICAgICAgICAgICBnZXRuYW1lKCh1X2NoYXIgKikmYWRkciksCisgICAgICAgICAgICAgICAgIHBsZW4sCisgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKHBwdHIrMSk+PjQsCisgICAgICAgICAgICAgICAgICgocHB0clszXSYxKT09MCkgPyAiKEJPR1VTOiBCb3R0b20gb2YgU3RhY2sgTk9UIHNldCEpIiA6ICIoYm90dG9tKSIgKTsKKworCXJldHVybiAxMiArIChwbGVuICsgNykgLyA4OworCit0cnVuYzoKKwlyZXR1cm4gLTI7Cit9CisKKy8qCisgKiBBcyBJIHJlbWVtYmVyLCBzb21lIHZlcnNpb25zIG9mIHN5c3RlbXMgaGF2ZSBhbiBzbnByaW50ZigpIHRoYXQKKyAqIHJldHVybnMgLTEgaWYgdGhlIGJ1ZmZlciB3b3VsZCBoYXZlIG92ZXJmbG93ZWQuICBJZiB0aGUgcmV0dXJuCisgKiB2YWx1ZSBpcyBuZWdhdGl2ZSwgc2V0IGJ1ZmxlbiB0byAwLCB0byBpbmRpY2F0ZSB0aGF0IHdlJ3ZlIGZpbGxlZAorICogdGhlIGJ1ZmZlciB1cC4KKyAqCisgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBidWZsZW4sIHRoYXQgbWVhbnMgdGhhdAorICogdGhlIGJ1ZmZlciB3b3VsZCBoYXZlIG92ZXJmbG93ZWQ7IGFnYWluLCBzZXQgYnVmbGVuIHRvIDAgaW4KKyAqIHRoYXQgY2FzZS4KKyAqLworI2RlZmluZSBVUERBVEVfQlVGX0JVRkxFTihidWYsIGJ1Zmxlbiwgc3RybGVuKSBcCisgICAgaWYgKHN0cmxlbjwwKSBcCisgICAgICAgCWJ1Zmxlbj0wOyBcCisgICAgZWxzZSBpZiAoKHVfaW50KXN0cmxlbj5idWZsZW4pIFwKKyAgICAgICAgYnVmbGVuPTA7IFwKKyAgICBlbHNlIHsgXAorICAgICAgICBidWZsZW4tPXN0cmxlbjsgXAorCWJ1Zis9c3RybGVuOyBcCisgICAgfQorCitzdGF0aWMgaW50CitkZWNvZGVfbGFiZWxlZF92cG5fbDIoY29uc3QgdV9jaGFyICpwcHRyLCBjaGFyICpidWYsIHVfaW50IGJ1ZmxlbikKK3sKKyAgICAgICAgaW50IHBsZW4sdGxlbixzdHJsZW4sdGx2X3R5cGUsdGx2X2xlbix0dGx2X2xlbjsKKworCVRDSEVDSzIocHB0clswXSwgMik7CisgICAgICAgIHBsZW49RVhUUkFDVF8xNkJJVFMocHB0cik7CisgICAgICAgIHRsZW49cGxlbjsKKyAgICAgICAgcHB0cis9MjsKKwlUQ0hFQ0syKHBwdHJbMF0sMTUpOworCWJ1ZlswXT0nXDAnOworICAgICAgICBzdHJsZW49c25wcmludGYoYnVmLCBidWZsZW4sICJSRDogJXMsIENFLUlEOiAldSwgTGFiZWwtQmxvY2sgT2Zmc2V0OiAldSwgTGFiZWwgQmFzZSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KHBwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocHB0cis4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHBwdHIrMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocHB0cisxMik+PjQpOyAvKiB0aGUgbGFiZWwgaXMgb2Zmc2V0dGVkIGJ5IDQgYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCisgICAgICAgIFVQREFURV9CVUZfQlVGTEVOKGJ1ZiwgYnVmbGVuLCBzdHJsZW4pOworICAgICAgICBwcHRyKz0xNTsKKyAgICAgICAgdGxlbi09MTU7CisKKyAgICAgICAgLyogb2sgbm93IHRoZSB2YXJpYWJsZSBwYXJ0IC0gbGV0cyByZWFkIG91dCBUTFZzKi8KKyAgICAgICAgd2hpbGUgKHRsZW4+MCkgeworICAgICAgICAgICAgaWYgKHRsZW4gPCAzKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFRDSEVDSzIocHB0clswXSwgMyk7CisgICAgICAgICAgICB0bHZfdHlwZT0qcHB0cisrOworICAgICAgICAgICAgdGx2X2xlbj1FWFRSQUNUXzE2QklUUyhwcHRyKTsKKyAgICAgICAgICAgIHR0bHZfbGVuPXRsdl9sZW47CisgICAgICAgICAgICBwcHRyKz0yOworCisgICAgICAgICAgICBzd2l0Y2godGx2X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoYnVmbGVuIT0wKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmxlbj1zbnByaW50ZihidWYsYnVmbGVuLCAiXG5cdFx0Y2lyY3VpdCBzdGF0dXMgdmVjdG9yICgldSkgbGVuZ3RoOiAldTogMHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0JVRl9CVUZMRU4oYnVmLCBidWZsZW4sIHN0cmxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHR0bHZfbGVuPXR0bHZfbGVuLzgrMTsgLyogaG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZCB0byByZWFkID8gKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAodHRsdl9sZW4+MCkgeworICAgICAgICAgICAgICAgICAgICBUQ0hFQ0socHB0clswXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZsZW4hPTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbj1zbnByaW50ZihidWYsYnVmbGVuLCAiJTAyeCIsKnBwdHIrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQlVGX0JVRkxFTihidWYsIGJ1Zmxlbiwgc3RybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0dGx2X2xlbi0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmxlbiE9MCkgeworICAgICAgICAgICAgICAgICAgICBzdHJsZW49c25wcmludGYoYnVmLGJ1ZmxlbiwgIlxuXHRcdHVua25vd24gVExWICMldSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl9sZW4pOworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQlVGX0JVRkxFTihidWYsIGJ1Zmxlbiwgc3RybGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bGVuLT0odGx2X2xlbjw8Myk7IC8qIHRoZSB0bHYtbGVuZ3RoIGlzIGV4cHJlc3NlZCBpbiBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGxlbisyOworCit0cnVuYzoKKyAgICAgICAgcmV0dXJuIC0yOworfQorCisjaWZkZWYgSU5FVDYKK2ludAorZGVjb2RlX3ByZWZpeDYoY29uc3QgdV9jaGFyICpwZCwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCit7CisJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJdV9pbnQgcGxlbjsKKworCVRDSEVDSyhwZFswXSk7CisJcGxlbiA9IHBkWzBdOworCWlmICgxMjggPCBwbGVuKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJVENIRUNLMihwZFsxXSwgKHBsZW4gKyA3KSAvIDgpOworCW1lbWNweSgmYWRkciwgJnBkWzFdLCAocGxlbiArIDcpIC8gOCk7CisJaWYgKHBsZW4gJSA4KSB7CisJCWFkZHIuczZfYWRkclsocGxlbiArIDcpIC8gOCAtIDFdICY9CisJCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOworCX0KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzLyVkIiwgZ2V0bmFtZTYoKHVfY2hhciAqKSZhZGRyKSwgcGxlbik7CisJcmV0dXJuIDEgKyAocGxlbiArIDcpIC8gODsKKwordHJ1bmM6CisJcmV0dXJuIC0yOworfQorCitzdGF0aWMgaW50CitkZWNvZGVfbGFiZWxlZF9wcmVmaXg2KGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCit7CisJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJdV9pbnQgcGxlbjsKKworCVRDSEVDSyhwcHRyWzBdKTsKKwlwbGVuID0gcHB0clswXTsgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KKworCWlmICgyNCA+IHBsZW4pCisJCXJldHVybiAtMTsKKworICAgICAgICBwbGVuLT0yNDsgLyogYWRqdXN0IHByZWZpeGxlbiAtIGxhYmVsbGVuZ3RoICovCisKKwlpZiAoMTI4IDwgcGxlbikKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCVRDSEVDSzIocHB0cls0XSwgKHBsZW4gKyA3KSAvIDgpOworCW1lbWNweSgmYWRkciwgJnBwdHJbNF0sIChwbGVuICsgNykgLyA4KTsKKwlpZiAocGxlbiAlIDgpIHsKKwkJYWRkci5zNl9hZGRyWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KKwkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7CisJfQorICAgICAgICAvKiB0aGUgbGFiZWwgbWF5IGdldCBvZmZzZXR0ZWQgYnkgNCBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzLyVkLCBsYWJlbDoldSAlcyIsCisgICAgICAgICAgICAgICAgIGdldG5hbWU2KCh1X2NoYXIgKikmYWRkciksCisgICAgICAgICAgICAgICAgIHBsZW4sCisgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKHBwdHIrMSk+PjQsCisgICAgICAgICAgICAgICAgICgocHB0clszXSYxKT09MCkgPyAiKEJPR1VTOiBCb3R0b20gb2YgU3RhY2sgTk9UIHNldCEpIiA6ICIoYm90dG9tKSIgKTsKKworCXJldHVybiA0ICsgKHBsZW4gKyA3KSAvIDg7CisKK3RydW5jOgorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludAorZGVjb2RlX2xhYmVsZWRfdnBuX3ByZWZpeDYoY29uc3QgdV9jaGFyICpwcHRyLCBjaGFyICpidWYsIHVfaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwl1X2ludCBwbGVuOworCisJVENIRUNLKHBwdHJbMF0pOworCXBsZW4gPSBwcHRyWzBdOyAgIC8qIGdldCBwcmVmaXggbGVuZ3RoICovCisKKwlpZiAoKDI0KzY0KSA+IHBsZW4pCisJCXJldHVybiAtMTsKKworICAgICAgICBwbGVuLT0oMjQrNjQpOyAvKiBhZGp1c3QgcHJlZml4bGVuIC0gbGFiZWxsZW5ndGggLSBSRCBsZW4qLworCisJaWYgKDEyOCA8IHBsZW4pCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlUQ0hFQ0syKHBwdHJbMTJdLCAocGxlbiArIDcpIC8gOCk7CisJbWVtY3B5KCZhZGRyLCAmcHB0clsxMl0sIChwbGVuICsgNykgLyA4KTsKKwlpZiAocGxlbiAlIDgpIHsKKwkJYWRkci5zNl9hZGRyWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KKwkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7CisJfQorICAgICAgICAvKiB0aGUgbGFiZWwgbWF5IGdldCBvZmZzZXR0ZWQgYnkgNCBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIlJEOiAlcywgJXMvJWQsIGxhYmVsOiV1ICVzIiwKKyAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChwcHRyKzQpLAorICAgICAgICAgICAgICAgICBnZXRuYW1lNigodV9jaGFyICopJmFkZHIpLAorICAgICAgICAgICAgICAgICBwbGVuLAorICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwcHRyKzEpPj40LAorICAgICAgICAgICAgICAgICAoKHBwdHJbM10mMSk9PTApID8gIihCT0dVUzogQm90dG9tIG9mIFN0YWNrIE5PVCBzZXQhKSIgOiAiKGJvdHRvbSkiICk7CisKKwlyZXR1cm4gMTIgKyAocGxlbiArIDcpIC8gODsKKwordHJ1bmM6CisJcmV0dXJuIC0yOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2RlY29kZV9jbG5wX3ByZWZpeChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQoreworICAgICAgICB1X2ludDhfdCBhZGRyWzE5XTsKKwl1X2ludCBwbGVuOworCisJVENIRUNLKHBwdHJbMF0pOworCXBsZW4gPSBwcHRyWzBdOyAvKiBnZXQgcHJlZml4IGxlbmd0aCAqLworCisJaWYgKDE1MiA8IHBsZW4pCisJCXJldHVybiAtMTsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlUQ0hFQ0syKHBwdHJbNF0sIChwbGVuICsgNykgLyA4KTsKKwltZW1jcHkoJmFkZHIsICZwcHRyWzRdLCAocGxlbiArIDcpIC8gOCk7CisJaWYgKHBsZW4gJSA4KSB7CisJCWFkZHJbKHBsZW4gKyA3KSAvIDggLSAxXSAmPQorCQkJKCgweGZmMDAgPj4gKHBsZW4gJSA4KSkgJiAweGZmKTsKKwl9CisJc25wcmludGYoYnVmLCBidWZsZW4sICIlcy8lZCIsCisgICAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKGFkZHIsKHBsZW4gKyA3KSAvIDgpLAorICAgICAgICAgICAgICAgICBwbGVuKTsKKworCXJldHVybiAxICsgKHBsZW4gKyA3KSAvIDg7CisKK3RydW5jOgorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludAorZGVjb2RlX2xhYmVsZWRfdnBuX2NsbnBfcHJlZml4KGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCit7CisgICAgICAgIHVfaW50OF90IGFkZHJbMTldOworCXVfaW50IHBsZW47CisKKwlUQ0hFQ0socHB0clswXSk7CisJcGxlbiA9IHBwdHJbMF07ICAgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KKworCWlmICgoMjQrNjQpID4gcGxlbikKKwkJcmV0dXJuIC0xOworCisgICAgICAgIHBsZW4tPSgyNCs2NCk7IC8qIGFkanVzdCBwcmVmaXhsZW4gLSBsYWJlbGxlbmd0aCAtIFJEIGxlbiovCisKKwlpZiAoMTUyIDwgcGxlbikKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCVRDSEVDSzIocHB0clsxMl0sIChwbGVuICsgNykgLyA4KTsKKwltZW1jcHkoJmFkZHIsICZwcHRyWzEyXSwgKHBsZW4gKyA3KSAvIDgpOworCWlmIChwbGVuICUgOCkgeworCQlhZGRyWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KKwkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7CisJfQorICAgICAgICAvKiB0aGUgbGFiZWwgbWF5IGdldCBvZmZzZXR0ZWQgYnkgNCBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KKwlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIlJEOiAlcywgJXMvJWQsIGxhYmVsOiV1ICVzIiwKKyAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChwcHRyKzQpLAorICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyhhZGRyLChwbGVuICsgNykgLyA4KSwKKyAgICAgICAgICAgICAgICAgcGxlbiwKKyAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocHB0cisxKT4+NCwKKyAgICAgICAgICAgICAgICAgKChwcHRyWzNdJjEpPT0wKSA/ICIoQk9HVVM6IEJvdHRvbSBvZiBTdGFjayBOT1Qgc2V0ISkiIDogIihib3R0b20pIiApOworCisJcmV0dXJuIDEyICsgKHBsZW4gKyA3KSAvIDg7CisKK3RydW5jOgorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludAorYmdwX2F0dHJfcHJpbnQoY29uc3Qgc3RydWN0IGJncF9hdHRyICphdHRyLCBjb25zdCB1X2NoYXIgKnBwdHIsIGludCBsZW4pCit7CisJaW50IGk7CisJdV9pbnQxNl90IGFmOworCXVfaW50OF90IHNhZmksIHNucGEsIG5obGVuOworICAgICAgICB1bmlvbiB7IC8qIGNvcHkgYnVmZmVyIGZvciBiYW5kd2lkdGggdmFsdWVzICovCisgICAgICAgICAgICBmbG9hdCBmOyAKKyAgICAgICAgICAgIHVfaW50MzJfdCBpOworICAgICAgICB9IGJ3OworCWludCBhZHZhbmNlOworCWludCB0bGVuOworCWNvbnN0IHVfY2hhciAqdHB0cjsKKwljaGFyIGJ1ZltNQVhIT1NUTkFNRUxFTiArIDEwMF07CisJY2hhciB0b2tidWZbVE9LQlVGU0laRV07CisKKyAgICAgICAgdHB0ciA9IHBwdHI7CisgICAgICAgIHRsZW49bGVuOworCisJc3dpdGNoIChhdHRyLT5iZ3BhX3R5cGUpIHsKKwljYXNlIEJHUFRZUEVfT1JJR0lOOgorCQlpZiAobGVuICE9IDEpCisJCQlwcmludGYoImludmFsaWQgbGVuIik7CisJCWVsc2UgeworCQkJVENIRUNLKCp0cHRyKTsKKwkJCXByaW50ZigiJXMiLCB0b2syc3RyYnVmKGJncF9vcmlnaW5fdmFsdWVzLAorCQkJCQkJIlVua25vd24gT3JpZ2luIFR5cGVjb2RlIiwKKwkJCQkJCXRwdHJbMF0sCisJCQkJCQl0b2tidWYsIHNpemVvZih0b2tidWYpKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJHUFRZUEVfQVNfUEFUSDoKKwkJaWYgKGxlbiAlIDIpIHsKKwkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgICAgICAgICAgaWYgKCFsZW4pIHsKKwkJCXByaW50ZigiZW1wdHkiKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIH0KKworCQl3aGlsZSAodHB0ciA8IHBwdHIgKyBsZW4pIHsKKwkJCVRDSEVDSyh0cHRyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCB0b2syc3RyYnVmKGJncF9hc19wYXRoX3NlZ21lbnRfb3Blbl92YWx1ZXMsCisJCQkJCQkiPyIsIHRwdHJbMF0sCisJCQkJCQl0b2tidWYsIHNpemVvZih0b2tidWYpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHB0clsxXSAqIDI7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clsyICsgaV0sIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXUgIiwgRVhUUkFDVF8xNkJJVFMoJnRwdHJbMiArIGldKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlUQ0hFQ0sodHB0clswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwgdG9rMnN0cmJ1ZihiZ3BfYXNfcGF0aF9zZWdtZW50X2Nsb3NlX3ZhbHVlcywKKwkJCQkJCSI/IiwgdHB0clswXSwKKwkJCQkJCXRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSyh0cHRyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gMiArIHRwdHJbMV0gKiAyOworCQl9CisJCWJyZWFrOworCWNhc2UgQkdQVFlQRV9ORVhUX0hPUDoKKwkJaWYgKGxlbiAhPSA0KQorCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworCQllbHNlIHsKKwkJCVRDSEVDSzIodHB0clswXSwgNCk7CisJCQlwcmludGYoIiVzIiwgZ2V0bmFtZSh0cHRyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCR1BUWVBFX01VTFRJX0VYSVRfRElTQzoKKwljYXNlIEJHUFRZUEVfTE9DQUxfUFJFRjoKKwkJaWYgKGxlbiAhPSA0KQorCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworCQllbHNlIHsKKwkJCVRDSEVDSzIodHB0clswXSwgNCk7CisJCQlwcmludGYoIiV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworCQl9CisJCWJyZWFrOworCWNhc2UgQkdQVFlQRV9BVE9NSUNfQUdHUkVHQVRFOgorCQlpZiAobGVuICE9IDApCisJCQlwcmludGYoImludmFsaWQgbGVuIik7CisJCWJyZWFrOworCWNhc2UgQkdQVFlQRV9BR0dSRUdBVE9SOgorCQlpZiAobGVuICE9IDYpIHsKKwkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKKwkJCWJyZWFrOworCQl9CisJCVRDSEVDSzIodHB0clswXSwgNik7CisJCXByaW50ZigiIEFTICMldSwgb3JpZ2luICVzIiwgRVhUUkFDVF8xNkJJVFModHB0ciksCisJCQlnZXRuYW1lKHRwdHIgKyAyKSk7CisJCWJyZWFrOworCWNhc2UgQkdQVFlQRV9DT01NVU5JVElFUzoKKwkJaWYgKGxlbiAlIDQpIHsKKwkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlICh0bGVuPjApIHsKKwkJCXVfaW50MzJfdCBjb21tOworCQkJVENIRUNLMih0cHRyWzBdLCA0KTsKKwkJCWNvbW0gPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKwkJCXN3aXRjaCAoY29tbSkgeworCQkJY2FzZSBCR1BfQ09NTVVOSVRZX05PX0VYUE9SVDoKKwkJCQlwcmludGYoIiBOT19FWFBPUlQiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQkdQX0NPTU1VTklUWV9OT19BRFZFUlQ6CisJCQkJcHJpbnRmKCIgTk9fQURWRVJUSVNFIik7CisJCQkJYnJlYWs7CisJCQljYXNlIEJHUF9DT01NVU5JVFlfTk9fRVhQT1JUX1NVQkNPTkZFRDoKKwkJCQlwcmludGYoIiBOT19FWFBPUlRfU1VCQ09ORkVEIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiJXU6JXUlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tbSA+PiAxNikgJiAweGZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tICYgMHhmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsZW4+NCkgPyAiLCAiIDogIiIpOworCQkJCWJyZWFrOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPTQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9NDsKKwkJfQorCQlicmVhazsKKyAgICAgICAgY2FzZSBCR1BUWVBFX09SSUdJTkFUT1JfSUQ6CisJCWlmIChsZW4gIT0gNCkgeworCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworCQkJYnJlYWs7CisJCX0KKwkJVENIRUNLMih0cHRyWzBdLCA0KTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzIixnZXRuYW1lKHRwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCR1BUWVBFX0NMVVNURVJfTElTVDoKKwkJaWYgKGxlbiAlIDQpIHsKKwkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKKwkJCWJyZWFrOworCQl9CisgICAgICAgICAgICAgICAgd2hpbGUgKHRsZW4+MCkgeworCQkJVENIRUNLMih0cHRyWzBdLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0bmFtZSh0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRsZW4+NCkgPyAiLCAiIDogIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPTQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisJY2FzZSBCR1BUWVBFX01QX1JFQUNIX05MUkk6CisJCVRDSEVDSzIodHB0clswXSwgMyk7CisJCWFmID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisJCXNhZmkgPSB0cHRyWzJdOworCQorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBBRkk6ICVzICgldSksICVzU0FGSTogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYWZfdmFsdWVzLCAiVW5rbm93biBBRkkiLCBhZiwKKwkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorICAgICAgICAgICAgICAgICAgICAgICBhZiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHNhZmk+MTI4KSA/ICJ2ZW5kb3Igc3BlY2lmaWMgIiA6ICIiLCAvKiAxMjggaXMgbWVhbndoaWxlIHdlbGxrbm93biAqLworICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9zYWZpX3ZhbHVlcywgIlVua25vd24gU0FGSSIsIHNhZmksCisJCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2FmaSk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2goYWY8PDggfCBzYWZpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9SVF9ST1VUSU5HX0lORk8pOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9MQUJVTklDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9SVF9ST1VUSU5HX0lORk8pOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyNlbmRpZgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX1ZQTFM8PDggfCBTQUZOVU1fVlBMUyk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgdGxlbik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBubyBBRkkgJXUgLyBTQUZJICV1IGRlY29kZXIiLGFmLHNhZmkpOworICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAgICIsdGxlbik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHB0ciArPTM7CisKKwkJVENIRUNLKHRwdHJbMF0pOworCQluaGxlbiA9IHRwdHJbMF07CisgICAgICAgICAgICAgICAgdGxlbiA9IG5obGVuOworICAgICAgICAgICAgICAgIHRwdHIrKzsKKworCQlpZiAodGxlbikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgbmV4dGhvcDogIik7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0bGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGFmPDw4IHwgc2FmaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1JUX1JPVVRJTkdfSU5GTyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIixnZXRuYW1lKHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IChpbnQpKHNpemVvZihzdHJ1Y3QgaW5fYWRkcikrQkdQX1ZQTl9SRF9MRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpK0JHUF9WUE5fUkRfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSRDogJXMsICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQodHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRuYW1lKHRwdHIrQkdQX1ZQTl9SRF9MRU4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPSAoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKStCR1BfVlBOX1JEX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gKHNpemVvZihzdHJ1Y3QgaW5fYWRkcikrQkdQX1ZQTl9SRF9MRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX0xBQlVOSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fUlRfUk9VVElOR19JTkZPKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsIGdldG5hbWU2KHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bGVuIDwgKGludCkoc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikrQkdQX1ZQTl9SRF9MRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKStCR1BfVlBOX1JEX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUkQ6ICVzLCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KHRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0bmFtZTYodHB0citCR1BfVlBOX1JEX0xFTikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuIC09IChzaXplb2Yoc3RydWN0IGluNl9hZGRyKStCR1BfVlBOX1JEX0xFTik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gKHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpK0JHUF9WUE5fUkRfTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX1ZQTFM8PDggfCBTQUZOVU1fVlBMUyk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bGVuIDwgKGludClzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsIGdldG5hbWUodHB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuIC09IChzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPSAoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHRsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLGlzb25zYXBfc3RyaW5nKHRwdHIsdGxlbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IEJHUF9WUE5fUkRfTEVOKzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHRsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJEOiAlcywgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludCh0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKHRwdHIrQkdQX1ZQTl9SRF9MRU4sdGxlbi1CR1BfVlBOX1JEX0xFTikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZmM5ODYgbWFwcGVkIElQdjQgYWRkcmVzcyA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyh0cHRyK0JHUF9WUE5fUkRfTEVOKSA9PSAgMHg0NzAwMDYwMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiID0gJXMiLCBnZXRuYW1lKHRwdHIrQkdQX1ZQTl9SRF9MRU4rNCkpOworI2lmZGVmIElORVQ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJmYzE4ODggbWFwcGVkIElQdjYgYWRkcmVzcyA/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEVYVFJBQ1RfMjRCSVRTKHRwdHIrQkdQX1ZQTl9SRF9MRU4pID09ICAweDM1MDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiID0gJXMiLCBnZXRuYW1lNih0cHRyK0JHUF9WUE5fUkRfTEVOKzMpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IHRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCB0bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIEFGSSAldS9TQUZJICV1IGRlY29kZXIiLGFmLHNhZmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAiLHRsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorICAgICAgICAgICAgICAgIHByaW50ZigiLCBuaC1sZW5ndGg6ICV1IiwgbmhsZW4pOworCQl0cHRyICs9IHRsZW47CisKKwkJVENIRUNLKHRwdHJbMF0pOworCQlzbnBhID0gdHB0clswXTsKKwkJdHB0cisrOworCisJCWlmIChzbnBhKSB7CisJCQlwcmludGYoIlxuXHQgICAgJXUgU05QQSIsIHNucGEpOworCQkJZm9yICgvKm5vdGhpbmcqLzsgc25wYSA+IDA7IHNucGEtLSkgeworCQkJCVRDSEVDSyh0cHRyWzBdKTsKKwkJCQlwcmludGYoIlxuXHQgICAgICAlZCBieXRlcyIsIHRwdHJbMF0pOworCQkJCXRwdHIgKz0gdHB0clswXSArIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiwgbm8gU05QQSIpOworICAgICAgICAgICAgICAgIH0KKworCQl3aGlsZSAobGVuIC0gKHRwdHIgLSBwcHRyKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhZjw8OCB8IHNhZmkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX3ByZWZpeDQodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9MQUJVTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3Zwbl9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fUlRfUk9VVElOR19JTkZPKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfcnRfcm91dGluZ19pbmZvKHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfcHJlZml4Nih0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fcHJlZml4Nih0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9SVF9ST1VUSU5HX0lORk8pOgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9ydF9yb3V0aW5nX2luZm8odHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9WUExTPDw4IHwgU0FGTlVNX1ZQTFMpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fbDIodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfY2xucF9wcmVmaXgodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfdnBuX2NsbnBfcHJlZml4KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKnRwdHIsdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgbm8gQUZJICV1IC8gU0FGSSAldSBkZWNvZGVyIixhZixzYWZpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAgICIsdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgPSBwcHRyICsgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gYWR2YW5jZTsKKwkJfQorICAgICAgICBkb25lOgorCQlicmVhazsKKworCWNhc2UgQkdQVFlQRV9NUF9VTlJFQUNIX05MUkk6CisJCVRDSEVDSzIodHB0clswXSwgQkdQX01QX05MUklfTUlOU0laRSk7CisJCWFmID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisJCXNhZmkgPSB0cHRyWzJdOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEFGSTogJXMgKCV1KSwgJXNTQUZJOiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihhZl92YWx1ZXMsICJVbmtub3duIEFGSSIsIGFmLAorCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAoc2FmaT4xMjgpID8gInZlbmRvciBzcGVjaWZpYyAiIDogIiIsIC8qIDEyOCBpcyBtZWFud2hpbGUgd2VsbGtub3duICovCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX3NhZmlfdmFsdWVzLCAiVW5rbm93biBTQUZJIiwgc2FmaSwKKwkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorICAgICAgICAgICAgICAgICAgICAgICBzYWZpKTsKKworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gQkdQX01QX05MUklfTUlOU0laRSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgRW5kLW9mLVJpYiBNYXJrZXIgKGVtcHR5IE5MUkkpIik7CisKKwkJdHB0ciArPSAzOworICAgICAgICAgICAgICAgIAorCQl3aGlsZSAobGVuIC0gKHRwdHIgLSBwcHRyKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhZjw8OCB8IHNhZmkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX3ByZWZpeDQodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9MQUJVTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3Zwbl9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfcHJlZml4Nih0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fcHJlZml4Nih0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX1ZQTFM8PDggfCBTQUZOVU1fVlBMUyk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3Zwbl9sMih0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBsZW5ndGgpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOyAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9jbG5wX3ByZWZpeCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgorICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fY2xucF9wcmVmaXgodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqKHRwdHItMyksdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIm5vIEFGSSAldSAvIFNBRkkgJXUgZGVjb2RlciIsYWYsc2FmaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ci0zLCJcblx0ICAgICIsdGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cHRyID0gcHB0ciArIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB0cHRyICs9IGFkdmFuY2U7CisJCX0KKwkJYnJlYWs7CisgICAgICAgIGNhc2UgQkdQVFlQRV9FWFREX0NPTU1VTklUSUVTOgorCQlpZiAobGVuICUgOCkgeworCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICB3aGlsZSAodGxlbj4wKSB7CisgICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBleHRkX2NvbW07CisKKyAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZF9jb21tPUVYVFJBQ1RfMTZCSVRTKHRwdHIpOworCisJCSAgICBwcmludGYoIlxuXHQgICAgJXMgKDB4JTA0eCksIEZsYWdzIFslc10iLAorCQkJICAgdG9rMnN0cmJ1ZihiZ3BfZXh0ZF9jb21tX3N1YnR5cGVfdmFsdWVzLAorCQkJCSAgICAgICJ1bmtub3duIGV4dGQgY29tbXVuaXR5IHR5cGVjb2RlIiwKKwkJCQkgICAgICBleHRkX2NvbW0sIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorCQkJICAgZXh0ZF9jb21tLAorCQkJICAgYml0dG9rMnN0cihiZ3BfZXh0ZF9jb21tX2ZsYWdfdmFsdWVzLCAibm9uZSIsIGV4dGRfY29tbSkpOworCisgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKih0cHRyKzIpLCA2KTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGV4dGRfY29tbSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1JUXzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fUk9fMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiOiAldTolcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModHB0cisyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRuYW1lKHRwdHIrNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fUlRfMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9ST18xOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI6ICVzOiV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRuYW1lKHRwdHIrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModHB0cis2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9SVF8yOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1JPXzI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogJXU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModHB0cis2KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9MSU5LQkFORDoKKwkJICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cisyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiOiBiYW5kd2lkdGg6ICUuM2YgTWJwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fQ0lTQ09fTUNBU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogQVMgJXUsIGdyb3VwICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0cHRyKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldG5hbWUodHB0cis0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1ZQTl9PUklHSU4yOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1ZQTl9PUklHSU4zOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1ZQTl9PUklHSU40OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX09TUEZfUklEOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX09TUEZfUklEMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBnZXRuYW1lKHRwdHIrMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fT1NQRl9SVFlQRToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9PU1BGX1JUWVBFMjogCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogYXJlYTolcywgcm91dGVyLXR5cGU6JXMsIG1ldHJpYy10eXBlOiVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldG5hbWUodHB0cisyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9leHRkX2NvbW1fb3NwZl9ydHlwZV92YWx1ZXMsCisJCQkJCSAgInVua25vd24gKDB4JTAyeCkiLAorCQkJCQkgICoodHB0cis2KSwKKwkJCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKih0cHRyKzcpICYgIEJHUF9PU1BGX1JUWVBFX01FVFJJQ19UWVBFKSA/ICJFMiIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCoodHB0cis2KSA9PSBCR1BfT1NQRl9SVFlQRV9FWFQpIHx8ICgqKHRwdHIrNikgPT0gQkdQX09TUEZfUlRZUEVfTlNTQSkpID8gIkUxIiA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX0wySU5GTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiOiAlcyBDb250cm9sIEZsYWdzIFsweCUwMnhdOk1UVSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihsMnZwbl9lbmNhcHNfdmFsdWVzLAorCQkJCQkgICJ1bmtub3duIGVuY2FwcyIsCisJCQkJCSAgKih0cHRyKzIpLAorCQkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cHRyKzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIrNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLDgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICAgICAiLDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGxlbiAtPTg7CisgICAgICAgICAgICAgICAgICAgIHRwdHIgKz04OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJHUFRZUEVfQVRUUl9TRVQ6CisgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCA0KTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgT3JpZ2luIEFTOiAldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgICAgICB0cHRyKz00OworICAgICAgICAgICAgICAgIGxlbiAtPTQ7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAobGVuID49IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBhbGVuOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmdwX2F0dHIgYmdwYTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgc2l6ZW9mKGJncGEpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZiZ3BhLCB0cHRyLCBzaXplb2YoYmdwYSkpOworICAgICAgICAgICAgICAgICAgICBhbGVuID0gYmdwX2F0dHJfbGVuKCZiZ3BhKTsKKyAgICAgICAgICAgICAgICAgICAgdHB0ciArPSBiZ3BfYXR0cl9vZmYoJmJncGEpOworICAgICAgICAgICAgICAgICAgICBsZW4gLT0gYmdwX2F0dHJfb2ZmKCZiZ3BhKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzICgldSksIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3BfYXR0cl92YWx1ZXMsCisJCQkJICAgICAgIlVua25vd24gQXR0cmlidXRlIiwgYmdwYS5iZ3BhX3R5cGUsCisJCQkJICAgICAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BhLmJncGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZW4pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJncGEuYmdwYV9mbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIEZsYWdzIFslcyVzJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwYS5iZ3BhX2ZsYWdzICYgMHg4MCA/ICJPIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncGEuYmdwYV9mbGFncyAmIDB4NDAgPyAiVCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BhLmJncGFfZmxhZ3MgJiAweDIwID8gIlAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwYS5iZ3BhX2ZsYWdzICYgMHgxMCA/ICJFIiA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZ3BhLmJncGFfZmxhZ3MgJiAweGYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIrJXgiLCBiZ3BhLmJncGFfZmxhZ3MgJiAweGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJdOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRSBjaGVjayBmb3IgcmVjdXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICghYmdwX2F0dHJfcHJpbnQoJmJncGEsIHRwdHIsIGFsZW4pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gYWxlbjsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IGFsZW47CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgCisKKwlkZWZhdWx0OgorCSAgICBUQ0hFQ0syKCpwcHRyLGxlbik7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgbm8gQXR0cmlidXRlICV1IGRlY29kZXIiLGF0dHItPmJncGFfdHlwZSk7IC8qIHdlIGhhdmUgbm8gZGVjb2RlciBmb3IgdGhlIGF0dHJpYnV0ZSAqLworICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICAgIixsZW4pOworICAgICAgICAgICAgYnJlYWs7CisJfQorICAgICAgICBpZiAodmZsYWcgPiAxICYmIGxlbikgeyAvKiBvbWl0IHplcm8gbGVuZ3RoIGF0dHJpYnV0ZXMqLworICAgICAgICAgICAgVENIRUNLMigqcHB0cixsZW4pOworICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICAgIixsZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworCit0cnVuYzoKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiZ3Bfb3Blbl9wcmludChjb25zdCB1X2NoYXIgKmRhdCwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmdwX29wZW4gYmdwbzsKKwlzdHJ1Y3QgYmdwX29wdCBiZ3BvcHQ7CisJY29uc3QgdV9jaGFyICpvcHQ7CisJaW50IGksY2FwX3R5cGUsY2FwX2xlbix0Y2FwX2xlbixjYXBfb2Zmc2V0OworCWNoYXIgdG9rYnVmW1RPS0JVRlNJWkVdOworCWNoYXIgdG9rYnVmMltUT0tCVUZTSVpFXTsKKworCVRDSEVDSzIoZGF0WzBdLCBCR1BfT1BFTl9TSVpFKTsKKwltZW1jcHkoJmJncG8sIGRhdCwgQkdQX09QRU5fU0laRSk7CisKKwlwcmludGYoIlxuXHQgIFZlcnNpb24gJWQsICIsIGJncG8uYmdwb192ZXJzaW9uKTsKKwlwcmludGYoIm15IEFTICV1LCAiLCBudG9ocyhiZ3BvLmJncG9fbXlhcykpOworCXByaW50ZigiSG9sZHRpbWUgJXVzLCAiLCBudG9ocyhiZ3BvLmJncG9faG9sZHRpbWUpKTsKKwlwcmludGYoIklEICVzIiwgZ2V0bmFtZSgodV9jaGFyICopJmJncG8uYmdwb19pZCkpOworCXByaW50ZigiXG5cdCAgT3B0aW9uYWwgcGFyYW1ldGVycywgbGVuZ3RoOiAldSIsIGJncG8uYmdwb19vcHRsZW4pOworCisgICAgICAgIC8qIHNvbWUgbGl0dGxlIHNhbml0eSBjaGVja2luZyAqLworICAgICAgICBpZiAobGVuZ3RoIDwgYmdwby5iZ3BvX29wdGxlbitCR1BfT1BFTl9TSVpFKSAKKyAgICAgICAgICAgIHJldHVybjsKKworCS8qIHVnbHkhICovCisJb3B0ID0gJigoY29uc3Qgc3RydWN0IGJncF9vcGVuICopZGF0KS0+Ymdwb19vcHRsZW47CisJb3B0Kys7CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGJncG8uYmdwb19vcHRsZW4pIHsKKwkJVENIRUNLMihvcHRbaV0sIEJHUF9PUFRfU0laRSk7CisJCW1lbWNweSgmYmdwb3B0LCAmb3B0W2ldLCBCR1BfT1BUX1NJWkUpOworCQlpZiAoaSArIDIgKyBiZ3BvcHQuYmdwb3B0X2xlbiA+IGJncG8uYmdwb19vcHRsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgT3B0aW9uICVkLCBsZW5ndGg6ICV1IiwgYmdwb3B0LmJncG9wdF90eXBlLCBiZ3BvcHQuYmdwb3B0X2xlbik7CisJCQlicmVhazsKKwkJfQorCisJCXByaW50ZigiXG5cdCAgICBPcHRpb24gJXMgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX29wdF92YWx1ZXMsIlVua25vd24iLAorCQkJCSAgYmdwb3B0LmJncG9wdF90eXBlLAorCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgIGJncG9wdC5iZ3BvcHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYmdwb3B0LmJncG9wdF9sZW4pOworCisgICAgICAgICAgICAgICAgLyogbm93IGxldHMgZGVjb2RlIHRoZSBvcHRpb25zIHdlIGtub3cqLworICAgICAgICAgICAgICAgIHN3aXRjaChiZ3BvcHQuYmdwb3B0X3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJHUF9PUFRfQ0FQOgorICAgICAgICAgICAgICAgICAgICBjYXBfdHlwZT1vcHRbaStCR1BfT1BUX1NJWkVdOworICAgICAgICAgICAgICAgICAgICBjYXBfbGVuPW9wdFtpK0JHUF9PUFRfU0laRSsxXTsKKyAgICAgICAgICAgICAgICAgICAgdGNhcF9sZW49Y2FwX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9jYXBjb2RlX3ZhbHVlcywgIlVua25vd24iLAorCQkJCSAgICAgIGNhcF90eXBlLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwX2xlbik7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjYXBfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9DQVBDT0RFX01QOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRBRkkgJXMgKCV1KSwgU0FGSSAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGFmX3ZhbHVlcywgIlVua25vd24iLAorCQkJCQkgIEVYVFJBQ1RfMTZCSVRTKG9wdCtpK0JHUF9PUFRfU0laRSsyKSwKKwkJCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvcHQraStCR1BfT1BUX1NJWkUrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfc2FmaV92YWx1ZXMsICJVbmtub3duIiwKKwkJCQkJICBvcHRbaStCR1BfT1BUX1NJWkUrNV0sCisJCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0W2krQkdQX09QVF9TSVpFKzVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9DQVBDT0RFX1JFU1RBUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdFJlc3RhcnQgRmxhZ3M6IFslc10sIFJlc3RhcnQgVGltZSAldXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3B0W2krQkdQX09QVF9TSVpFKzJdKSYweDgwKSA/ICJSIiA6ICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvcHQraStCR1BfT1BUX1NJWkUrMikmMHhmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNhcF9sZW4tPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBfb2Zmc2V0PTQ7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSh0Y2FwX2xlbj49NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0ICBBRkkgJXMgKCV1KSwgU0FGSSAlcyAoJXUpLCBGb3J3YXJkaW5nIHN0YXRlIHByZXNlcnZlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGFmX3ZhbHVlcywiVW5rbm93biIsCisJCQkJCSAgICAgIEVYVFJBQ1RfMTZCSVRTKG9wdCtpK0JHUF9PUFRfU0laRStjYXBfb2Zmc2V0KSwKKwkJCQkJICAgICAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9wdCtpK0JHUF9PUFRfU0laRStjYXBfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfc2FmaV92YWx1ZXMsIlVua25vd24iLAorCQkJCQkgICAgICBvcHRbaStCR1BfT1BUX1NJWkUrY2FwX29mZnNldCsyXSwKKwkJCQkJICAgICAgdG9rYnVmMiwgc2l6ZW9mKHRva2J1ZjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0W2krQkdQX09QVF9TSVpFK2NhcF9vZmZzZXQrMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3B0W2krQkdQX09QVF9TSVpFK2NhcF9vZmZzZXQrM10pJjB4ODApID8gInllcyIgOiAibm8iICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNhcF9sZW4tPTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwX29mZnNldCs9NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9DQVBDT0RFX1JSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9DQVBDT0RFX1JSX0NJU0NPOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKG9wdFtpK0JHUF9PUFRfU0laRSsyXSxjYXBfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0bm8gZGVjb2RlciBmb3IgQ2FwYWJpbGl0eSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZvcHRbaStCR1BfT1BUX1NJWkUrMl0sIlxuXHRcdCIsY2FwX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKG9wdFtpK0JHUF9PUFRfU0laRSsyXSxjYXBfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmb3B0W2krQkdQX09QVF9TSVpFKzJdLCJcblx0XHQiLGNhcF9sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQkdQX09QVF9BVVRIOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIG5vIGRlY29kZXIgZm9yIG9wdGlvbiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BvcHQuYmdwb3B0X3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKwkJaSArPSBCR1BfT1BUX1NJWkUgKyBiZ3BvcHQuYmdwb3B0X2xlbjsKKwl9CisJcmV0dXJuOwordHJ1bmM6CisJcHJpbnRmKCJbfEJHUF0iKTsKK30KKworc3RhdGljIHZvaWQKK2JncF91cGRhdGVfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGJncCBiZ3A7CisJc3RydWN0IGJncF9hdHRyIGJncGE7CisJY29uc3QgdV9jaGFyICpwOworCWludCBsZW47CisJaW50IGk7CisJY2hhciB0b2tidWZbVE9LQlVGU0laRV07CisKKwlUQ0hFQ0syKGRhdFswXSwgQkdQX1NJWkUpOworCW1lbWNweSgmYmdwLCBkYXQsIEJHUF9TSVpFKTsKKwlwID0gZGF0ICsgQkdQX1NJWkU7CS8qWFhYKi8KKworCS8qIFVuZmVhc2libGUgcm91dGVzICovCisJbGVuID0gRVhUUkFDVF8xNkJJVFMocCk7CisJaWYgKGxlbikgeworCQkvKgorCQkgKiBXaXRob3V0IGtlZXBpbmcgc3RhdGUgZnJvbSB0aGUgb3JpZ2luYWwgTkxSSSBtZXNzYWdlLAorCQkgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIGlmIHRoaXMgYSB2NCBvciB2NiByb3V0ZSwKKwkJICogc28gb25seSB0cnkgdG8gZGVjb2RlIGl0IGlmIHdlJ3JlIG5vdCB2NiBlbmFibGVkLgorCSAgICAgICAgICovCisjaWZkZWYgSU5FVDYKKwkJcHJpbnRmKCJcblx0ICBXaXRoZHJhd24gcm91dGVzOiAlZCBieXRlcyIsIGxlbik7CisjZWxzZQorCQljaGFyIGJ1ZltNQVhIT1NUTkFNRUxFTiArIDEwMF07CisJCWludCB3cGZ4OworCisJCVRDSEVDSzIocFsyXSwgbGVuKTsKKwkJaSA9IDI7CisKKwkJcHJpbnRmKCJcblx0ICBXaXRoZHJhd24gcm91dGVzOiIpOworCisJCXdoaWxlKGkgPCAyICsgbGVuKSB7CisJCQl3cGZ4ID0gZGVjb2RlX3ByZWZpeDQoJnBbaV0sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaWYgKHdwZnggPT0gLTEpIHsKKwkJCQlwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAod3BmeCA9PSAtMikKKwkJCQlnb3RvIHRydW5jOworCQkJZWxzZSB7CisJCQkJaSArPSB3cGZ4OworCQkJCXByaW50ZigiXG5cdCAgICAlcyIsIGJ1Zik7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlwICs9IDIgKyBsZW47CisKKwlUQ0hFQ0syKHBbMF0sIDIpOworCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKHApOworCisgICAgICAgIGlmIChsZW4gPT0gMCAmJiBsZW5ndGggPT0gQkdQX1VQREFURV9NSU5TSVpFKSB7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgIEVuZC1vZi1SaWIgTWFya2VyIChlbXB0eSBOTFJJKSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKwlpZiAobGVuKSB7CisJCS8qIGRvIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCEqLworCQlpID0gMjsKKwkJd2hpbGUgKGkgPCAyICsgbGVuKSB7CisJCQlpbnQgYWxlbiwgYW9mZjsKKworCQkJVENIRUNLMihwW2ldLCBzaXplb2YoYmdwYSkpOworCQkJbWVtY3B5KCZiZ3BhLCAmcFtpXSwgc2l6ZW9mKGJncGEpKTsKKwkJCWFsZW4gPSBiZ3BfYXR0cl9sZW4oJmJncGEpOworCQkJYW9mZiA9IGJncF9hdHRyX29mZigmYmdwYSk7CisKKwkJICAgICAgIHByaW50ZigiXG5cdCAgJXMgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9hdHRyX3ZhbHVlcywgIlVua25vd24gQXR0cmlidXRlIiwKKwkJCQkJIGJncGEuYmdwYV90eXBlLAorCQkJCQkgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BhLmJncGFfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZW4pOworCisJCQlpZiAoYmdwYS5iZ3BhX2ZsYWdzKSB7CisJCQkJcHJpbnRmKCIsIEZsYWdzIFslcyVzJXMlcyIsCisJCQkJCWJncGEuYmdwYV9mbGFncyAmIDB4ODAgPyAiTyIgOiAiIiwKKwkJCQkJYmdwYS5iZ3BhX2ZsYWdzICYgMHg0MCA/ICJUIiA6ICIiLAorCQkJCQliZ3BhLmJncGFfZmxhZ3MgJiAweDIwID8gIlAiIDogIiIsCisJCQkJCWJncGEuYmdwYV9mbGFncyAmIDB4MTAgPyAiRSIgOiAiIik7CisJCQkJaWYgKGJncGEuYmdwYV9mbGFncyAmIDB4ZikKKwkJCQkJcHJpbnRmKCIrJXgiLCBiZ3BhLmJncGFfZmxhZ3MgJiAweGYpOworCQkJCXByaW50ZigiXTogIik7CisJCQl9CisJCQlpZiAoIWJncF9hdHRyX3ByaW50KCZiZ3BhLCAmcFtpICsgYW9mZl0sIGFsZW4pKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlpICs9IGFvZmYgKyBhbGVuOworCQl9CisJfSAKKwlwICs9IDIgKyBsZW47CisKKwlpZiAoZGF0ICsgbGVuZ3RoID4gcCkgeworCQlwcmludGYoIlxuXHQgIFVwZGF0ZWQgcm91dGVzOiIpOworCQl3aGlsZSAoZGF0ICsgbGVuZ3RoID4gcCkgeworCQkJY2hhciBidWZbTUFYSE9TVE5BTUVMRU4gKyAxMDBdOworCQkJaSA9IGRlY29kZV9wcmVmaXg0KHAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJaWYgKGkgPT0gLTEpIHsKKwkJCQlwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoaSA9PSAtMikKKwkJCQlnb3RvIHRydW5jOworCQkJZWxzZSB7CisJCQkJcHJpbnRmKCJcblx0ICAgICVzIiwgYnVmKTsKKwkJCQlwICs9IGk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuOwordHJ1bmM6CisJcHJpbnRmKCJbfEJHUF0iKTsKK30KKworc3RhdGljIHZvaWQKK2JncF9ub3RpZmljYXRpb25fcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIGludCBsZW5ndGgpCit7CisJc3RydWN0IGJncF9ub3RpZmljYXRpb24gYmdwbjsKKwljb25zdCB1X2NoYXIgKnRwdHI7CisJY2hhciB0b2tidWZbVE9LQlVGU0laRV07CisJY2hhciB0b2tidWYyW1RPS0JVRlNJWkVdOworCisJVENIRUNLMihkYXRbMF0sIEJHUF9OT1RJRklDQVRJT05fU0laRSk7CisJbWVtY3B5KCZiZ3BuLCBkYXQsIEJHUF9OT1RJRklDQVRJT05fU0laRSk7CisKKyAgICAgICAgLyogc29tZSBsaXR0bGUgc2FuaXR5IGNoZWNraW5nICovCisgICAgICAgIGlmIChsZW5ndGg8QkdQX05PVElGSUNBVElPTl9TSVpFKQorICAgICAgICAgICAgcmV0dXJuOworCisJcHJpbnRmKCIsICVzICgldSkiLAorCSAgICAgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWFqb3JfdmFsdWVzLCAiVW5rbm93biBFcnJvciIsCisJCQkgIGJncG4uYmdwbl9tYWpvciwgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisJICAgICAgIGJncG4uYmdwbl9tYWpvcik7CisKKyAgICAgICAgc3dpdGNoIChiZ3BuLmJncG5fbWFqb3IpIHsKKworICAgICAgICBjYXNlIEJHUF9OT1RJRllfTUFKT1JfTVNHOgorICAgICAgICAgICAgcHJpbnRmKCIsIHN1YmNvZGUgJXMgKCV1KSIsCisJCSAgIHRvazJzdHJidWYoYmdwX25vdGlmeV9taW5vcl9tc2dfdmFsdWVzLCAiVW5rbm93biIsCisJCQkgICAgICBiZ3BuLmJncG5fbWlub3IsIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorCQkgICBiZ3BuLmJncG5fbWlub3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkdQX05PVElGWV9NQUpPUl9PUEVOOgorICAgICAgICAgICAgcHJpbnRmKCIsIHN1YmNvZGUgJXMgKCV1KSIsCisJCSAgIHRvazJzdHJidWYoYmdwX25vdGlmeV9taW5vcl9vcGVuX3ZhbHVlcywgIlVua25vd24iLAorCQkJICAgICAgYmdwbi5iZ3BuX21pbm9yLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKwkJICAgYmdwbi5iZ3BuX21pbm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJHUF9OT1RJRllfTUFKT1JfVVBEQVRFOgorICAgICAgICAgICAgcHJpbnRmKCIsIHN1YmNvZGUgJXMgKCV1KSIsCisJCSAgIHRvazJzdHJidWYoYmdwX25vdGlmeV9taW5vcl91cGRhdGVfdmFsdWVzLCAiVW5rbm93biIsCisJCQkgICAgICBiZ3BuLmJncG5fbWlub3IsIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorCQkgICBiZ3BuLmJncG5fbWlub3IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkdQX05PVElGWV9NQUpPUl9DQVA6CisgICAgICAgICAgICBwcmludGYoIiBzdWJjb2RlICVzICgldSkiLAorCQkgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWlub3JfY2FwX3ZhbHVlcywgIlVua25vd24iLAorCQkJICAgICAgYmdwbi5iZ3BuX21pbm9yLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKKwkJICAgYmdwbi5iZ3BuX21pbm9yKTsKKyAgICAgICAgY2FzZSBCR1BfTk9USUZZX01BSk9SX0NFQVNFOgorICAgICAgICAgICAgcHJpbnRmKCIsIHN1YmNvZGUgJXMgKCV1KSIsCisJCSAgIHRvazJzdHJidWYoYmdwX25vdGlmeV9taW5vcl9jZWFzZV92YWx1ZXMsICJVbmtub3duIiwKKwkJCSAgICAgIGJncG4uYmdwbl9taW5vciwgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisJCSAgIGJncG4uYmdwbl9taW5vcik7CisKKwkgICAgLyogZHJhZnQtaWV0Zi1pZHItY2Vhc2Utc3ViY29kZS0wMiBtZW50aW9ucyBvcHRpb25hbGx5IDcgYnl0ZXMKKyAgICAgICAgICAgICAqIGZvciB0aGUgbWF4cHJlZml4IHN1YnR5cGUsIHdoaWNoIG1heSBjb250YWluIEFGSSwgU0FGSSBhbmQgTUFYUFJFRklYRVMKKyAgICAgICAgICAgICAqLworCSAgICBpZihiZ3BuLmJncG5fbWlub3IgPT0gQkdQX05PVElGWV9NSU5PUl9DRUFTRV9NQVhQUkZYICYmIGxlbmd0aCA+PSBCR1BfTk9USUZJQ0FUSU9OX1NJWkUgKyA3KSB7CisJCXRwdHIgPSBkYXQgKyBCR1BfTk9USUZJQ0FUSU9OX1NJWkU7CisJCVRDSEVDSzIoKnRwdHIsIDcpOworCQlwcmludGYoIiwgQUZJICVzICgldSksIFNBRkkgJXMgKCV1KSwgTWF4IFByZWZpeGVzOiAldSIsCisJCSAgICAgICB0b2syc3RyYnVmKGFmX3ZhbHVlcywgIlVua25vd24iLAorCQkJCSAgRVhUUkFDVF8xNkJJVFModHB0ciksIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAorCQkgICAgICAgRVhUUkFDVF8xNkJJVFModHB0ciksCisJCSAgICAgICB0b2syc3RyYnVmKGJncF9zYWZpX3ZhbHVlcywgIlVua25vd24iLCAqKHRwdHIrMiksCisJCQkJICB0b2tidWYyLCBzaXplb2YodG9rYnVmKSksCisJCSAgICAgICAqKHRwdHIrMiksCisJCSAgICAgICBFWFRSQUNUXzMyQklUUyh0cHRyKzMpKTsKKwkgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisJcmV0dXJuOwordHJ1bmM6CisJcHJpbnRmKCJbfEJHUF0iKTsKK30KKworc3RhdGljIHZvaWQKK2JncF9yb3V0ZV9yZWZyZXNoX3ByaW50KGNvbnN0IHVfY2hhciAqcHB0ciwgaW50IGxlbikgeworCisgICAgICAgIGNvbnN0IHN0cnVjdCBiZ3Bfcm91dGVfcmVmcmVzaCAqYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyOworCWNoYXIgdG9rYnVmW1RPS0JVRlNJWkVdOworCWNoYXIgdG9rYnVmMltUT0tCVUZTSVpFXTsKKworCVRDSEVDSzIocHB0clswXSwgQkdQX1JPVVRFX1JFRlJFU0hfU0laRSk7CisKKyAgICAgICAgLyogc29tZSBsaXR0bGUgc2FuaXR5IGNoZWNraW5nICovCisgICAgICAgIGlmIChsZW48QkdQX1JPVVRFX1JFRlJFU0hfU0laRSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBiZ3Bfcm91dGVfcmVmcmVzaF9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGJncF9yb3V0ZV9yZWZyZXNoICopcHB0cjsKKworICAgICAgICBwcmludGYoIlxuXHQgIEFGSSAlcyAoJXUpLCBTQUZJICVzICgldSkiLAorICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihhZl92YWx1ZXMsIlVua25vd24iLAorCQkJICAvKiB0aGlzIHN0aW5rcyBidXQgdGhlIGNvbXBpbGVyIHBhZHMgdGhlIHN0cnVjdHVyZQorCQkJICAgKiB3ZWlyZCAqLworCQkJICBFWFRSQUNUXzE2QklUUygmYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyLT5hZmkpLAorCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwgCisgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyLT5hZmkpLAorICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfc2FmaV92YWx1ZXMsIlVua25vd24iLAorCQkJICBiZ3Bfcm91dGVfcmVmcmVzaF9oZWFkZXItPnNhZmksCisJCQkgIHRva2J1ZjIsIHNpemVvZih0b2tidWYyKSksCisgICAgICAgICAgICAgICBiZ3Bfcm91dGVfcmVmcmVzaF9oZWFkZXItPnNhZmkpOworCisgICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKKyAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIGxlbik7CisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIiwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuOwordHJ1bmM6CisJcHJpbnRmKCJbfEJHUF0iKTsKK30KKworc3RhdGljIGludAorYmdwX2hlYWRlcl9wcmludChjb25zdCB1X2NoYXIgKmRhdCwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmdwIGJncDsKKwljaGFyIHRva2J1ZltUT0tCVUZTSVpFXTsKKworCVRDSEVDSzIoZGF0WzBdLCBCR1BfU0laRSk7CisJbWVtY3B5KCZiZ3AsIGRhdCwgQkdQX1NJWkUpOworCXByaW50ZigiXG5cdCVzIE1lc3NhZ2UgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9tc2dfdmFsdWVzLCAiVW5rbm93biIsIGJncC5iZ3BfdHlwZSwKKwkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCisgICAgICAgICAgICAgICBiZ3AuYmdwX3R5cGUsCisgICAgICAgICAgICAgICBsZW5ndGgpOworCisJc3dpdGNoIChiZ3AuYmdwX3R5cGUpIHsKKwljYXNlIEJHUF9PUEVOOgorCQliZ3Bfb3Blbl9wcmludChkYXQsIGxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQkdQX1VQREFURToKKwkJYmdwX3VwZGF0ZV9wcmludChkYXQsIGxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgQkdQX05PVElGSUNBVElPTjoKKwkJYmdwX25vdGlmaWNhdGlvbl9wcmludChkYXQsIGxlbmd0aCk7CisJCWJyZWFrOworICAgICAgICBjYXNlIEJHUF9LRUVQQUxJVkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkdQX1JPVVRFX1JFRlJFU0g6CisgICAgICAgICAgICAgICAgYmdwX3JvdXRlX3JlZnJlc2hfcHJpbnQoZGF0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8qIHdlIGhhdmUgbm8gZGVjb2RlciBmb3IgdGhlIEJHUCBtZXNzYWdlICovCisgICAgICAgICAgICAgICAgVENIRUNLMigqZGF0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgbm8gTWVzc2FnZSAldSBkZWNvZGVyIixiZ3AuYmdwX3R5cGUpOworICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShkYXQsIlxuXHQgICIsbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwl9CisJcmV0dXJuIDE7Cit0cnVuYzoKKwlwcmludGYoIlt8QkdQXSIpOworCXJldHVybiAwOworfQorCit2b2lkCitiZ3BfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIGludCBsZW5ndGgpCit7CisJY29uc3QgdV9jaGFyICpwOworCWNvbnN0IHVfY2hhciAqZXA7CisJY29uc3QgdV9jaGFyICpzdGFydDsKKwljb25zdCB1X2NoYXIgbWFya2VyW10gPSB7CisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisJfTsKKwlzdHJ1Y3QgYmdwIGJncDsKKwl1X2ludDE2X3QgaGxlbjsKKwljaGFyIHRva2J1ZltUT0tCVUZTSVpFXTsKKworCWVwID0gZGF0ICsgbGVuZ3RoOworCWlmIChzbmFwZW5kIDwgZGF0ICsgbGVuZ3RoKQorCQllcCA9IHNuYXBlbmQ7CisKKwlwcmludGYoIjogQkdQLCBsZW5ndGg6ICV1IixsZW5ndGgpOworCisgICAgICAgIGlmICh2ZmxhZyA8IDEpIC8qIGxldHMgYmUgbGVzcyBjaGF0dHkgKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisKKwlwID0gZGF0OworCXN0YXJ0ID0gcDsKKwl3aGlsZSAocCA8IGVwKSB7CisJCWlmICghVFRFU1QyKHBbMF0sIDEpKQorCQkJYnJlYWs7CisJCWlmIChwWzBdICE9IDB4ZmYpIHsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFUVEVTVDIocFswXSwgc2l6ZW9mKG1hcmtlcikpKQorCQkJYnJlYWs7CisJCWlmIChtZW1jbXAocCwgbWFya2VyLCBzaXplb2YobWFya2VyKSkgIT0gMCkgeworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBmb3VuZCBCR1AgaGVhZGVyICovCisJCVRDSEVDSzIocFswXSwgQkdQX1NJWkUpOwkvKlhYWCovCisJCW1lbWNweSgmYmdwLCBwLCBCR1BfU0laRSk7CisKKwkJaWYgKHN0YXJ0ICE9IHApCisJCQlwcmludGYoIiBbfEJHUF0iKTsKKworCQlobGVuID0gbnRvaHMoYmdwLmJncF9sZW4pOworCQlpZiAoaGxlbiA8IEJHUF9TSVpFKSB7CisJCQlwcmludGYoIlxuW3xCR1AgQm9ndXMgaGVhZGVyIGxlbmd0aCAldSA8ICV1XSIsIGhsZW4sCisJCQkgICAgQkdQX1NJWkUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoVFRFU1QyKHBbMF0sIGhsZW4pKSB7CisJCQlpZiAoIWJncF9oZWFkZXJfcHJpbnQocCwgaGxlbikpCisJCQkJcmV0dXJuOworCQkJcCArPSBobGVuOworCQkJc3RhcnQgPSBwOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJcblt8QkdQICVzXSIsCisJCQkgICAgICAgdG9rMnN0cmJ1ZihiZ3BfbXNnX3ZhbHVlcywKKwkJCQkJICAiVW5rbm93biBNZXNzYWdlIFR5cGUiLAorCQkJCQkgIGJncC5iZ3BfdHlwZSwKKwkJCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xCR1BdIik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1ib290cC5jIGIvcHJpbnQtYm9vdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjA4NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtYm9vdHAuYwpAQCAtMCwwICsxLDgyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZvcm1hdCBhbmQgcHJpbnQgYm9vdHAgcGFja2V0cy4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYm9vdHAuYyx2IDEuNzguMi45IDIwMDcvMDgvMjEgMjI6MDI6MDggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAiZXRoZXIuaCIKKyNpbmNsdWRlICJib290cC5oIgorCitzdGF0aWMgdm9pZCByZmMxMDQ4X3ByaW50KGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIGNtdV9wcmludChjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgY2hhciAqY2xpZW50X2ZxZG5fZmxhZ3ModV9pbnQgZmxhZ3MpOworCitzdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8Ym9vdHBdIjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYm9vdHBfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IDB4ODAwMCwgICAgICAgICAgICAgICAgICAgIkJyb2FkY2FzdCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBib290cF9vcF92YWx1ZXNbXSA9IHsKKyAgICB7IEJPT1RQUkVRVUVTVCwgICAgICAgICAgICAgIlJlcXVlc3QiIH0sCisgICAgeyBCT09UUFJFUExZLCAgICAgICAgICAgICAgICJSZXBseSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKgorICogUHJpbnQgYm9vdHAgcmVxdWVzdHMKKyAqLwordm9pZAorYm9vdHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBib290cCAqYnA7CisJc3RhdGljIGNvbnN0IHVfY2hhciB2bV9jbXVbNF0gPSBWTV9DTVU7CisJc3RhdGljIGNvbnN0IHVfY2hhciB2bV9yZmMxMDQ4WzRdID0gVk1fUkZDMTA0ODsKKworCWJwID0gKGNvbnN0IHN0cnVjdCBib290cCAqKWNwOworCVRDSEVDSyhicC0+YnBfb3ApOworCisgICAgICAgIHByaW50ZigiQk9PVFAvREhDUCwgJXMiLAorCSAgICAgICB0b2syc3RyKGJvb3RwX29wX3ZhbHVlcywgInVua25vd24gKDB4JTAyeCkiLCBicC0+YnBfb3ApKTsKKworCWlmIChicC0+YnBfaHR5cGUgPT0gMSAmJiBicC0+YnBfaGxlbiA9PSA2ICYmIGJwLT5icF9vcCA9PSBCT09UUFJFUVVFU1QpIHsKKwkJVENIRUNLMihicC0+YnBfY2hhZGRyWzBdLCA2KTsKKwkJcHJpbnRmKCIgZnJvbSAlcyIsIGV0aGVyYWRkcl9zdHJpbmcoYnAtPmJwX2NoYWRkcikpOworCX0KKworICAgICAgICBwcmludGYoIiwgbGVuZ3RoICV1IiwgbGVuZ3RoKTsKKworICAgICAgICBpZiAoIXZmbGFnKQorICAgICAgICAgICAgcmV0dXJuOworCisJVENIRUNLKGJwLT5icF9zZWNzKTsKKworCS8qIFRoZSB1c3VhbCBoYXJkd2FyZSBhZGRyZXNzIHR5cGUgaXMgMSAoMTBNYiBFdGhlcm5ldCkgKi8KKwlpZiAoYnAtPmJwX2h0eXBlICE9IDEpCisJCXByaW50ZigiLCBodHlwZSAlZCIsIGJwLT5icF9odHlwZSk7CisKKwkvKiBUaGUgdXN1YWwgbGVuZ3RoIGZvciAxME1iIEV0aGVybmV0IGFkZHJlc3MgaXMgNiBieXRlcyAqLworCWlmIChicC0+YnBfaHR5cGUgIT0gMSB8fCBicC0+YnBfaGxlbiAhPSA2KQorCQlwcmludGYoIiwgaGxlbiAlZCIsIGJwLT5icF9obGVuKTsKKworCS8qIE9ubHkgcHJpbnQgaW50ZXJlc3RpbmcgZmllbGRzICovCisJaWYgKGJwLT5icF9ob3BzKQorCQlwcmludGYoIiwgaG9wcyAlZCIsIGJwLT5icF9ob3BzKTsKKwlpZiAoYnAtPmJwX3hpZCkKKwkJcHJpbnRmKCIsIHhpZCAweCV4IiwgRVhUUkFDVF8zMkJJVFMoJmJwLT5icF94aWQpKTsKKwlpZiAoYnAtPmJwX3NlY3MpCisJCXByaW50ZigiLCBzZWNzICVkIiwgRVhUUkFDVF8xNkJJVFMoJmJwLT5icF9zZWNzKSk7CisKKwlwcmludGYoIiwgRmxhZ3MgWyVzXSIsCisJCWJpdHRvazJzdHIoYm9vdHBfZmxhZ192YWx1ZXMsICJub25lIiwgRVhUUkFDVF8xNkJJVFMoJmJwLT5icF9mbGFncykpKTsKKwlpZiAodmZsYWcgPiAxKQorCQlwcmludGYoIiAoMHglMDR4KSIsIEVYVFJBQ1RfMTZCSVRTKCZicC0+YnBfZmxhZ3MpKTsKKworCS8qIENsaWVudCdzIGlwIGFkZHJlc3MgKi8KKwlUQ0hFQ0soYnAtPmJwX2NpYWRkcik7CisJaWYgKGJwLT5icF9jaWFkZHIuc19hZGRyKQorCQlwcmludGYoIlxuXHQgIENsaWVudC1JUCAlcyIsIGlwYWRkcl9zdHJpbmcoJmJwLT5icF9jaWFkZHIpKTsKKworCS8qICd5b3VyJyBpcCBhZGRyZXNzIChib290cCBjbGllbnQpICovCisJVENIRUNLKGJwLT5icF95aWFkZHIpOworCWlmIChicC0+YnBfeWlhZGRyLnNfYWRkcikKKwkJcHJpbnRmKCJcblx0ICBZb3VyLUlQICVzIiwgaXBhZGRyX3N0cmluZygmYnAtPmJwX3lpYWRkcikpOworCisJLyogU2VydmVyJ3MgaXAgYWRkcmVzcyAqLworCVRDSEVDSyhicC0+YnBfc2lhZGRyKTsKKwlpZiAoYnAtPmJwX3NpYWRkci5zX2FkZHIpCisJCXByaW50ZigiXG5cdCAgU2VydmVyLUlQICVzIiwgaXBhZGRyX3N0cmluZygmYnAtPmJwX3NpYWRkcikpOworCisJLyogR2F0ZXdheSdzIGlwIGFkZHJlc3MgKi8KKwlUQ0hFQ0soYnAtPmJwX2dpYWRkcik7CisJaWYgKGJwLT5icF9naWFkZHIuc19hZGRyKQorCQlwcmludGYoIlxuXHQgIEdhdGV3YXktSVAgJXMiLCBpcGFkZHJfc3RyaW5nKCZicC0+YnBfZ2lhZGRyKSk7CisKKwkvKiBDbGllbnQncyBFdGhlcm5ldCBhZGRyZXNzICovCisJaWYgKGJwLT5icF9odHlwZSA9PSAxICYmIGJwLT5icF9obGVuID09IDYpIHsKKwkJVENIRUNLMihicC0+YnBfY2hhZGRyWzBdLCA2KTsKKwkJcHJpbnRmKCJcblx0ICBDbGllbnQtRXRoZXJuZXQtQWRkcmVzcyAlcyIsIGV0aGVyYWRkcl9zdHJpbmcoYnAtPmJwX2NoYWRkcikpOworCX0KKworCVRDSEVDSzIoYnAtPmJwX3NuYW1lWzBdLCAxKTsJCS8qIGNoZWNrIGZpcnN0IGNoYXIgb25seSAqLworCWlmICgqYnAtPmJwX3NuYW1lKSB7CisJCXByaW50ZigiXG5cdCAgc25hbWUgXCIiKTsKKwkJaWYgKGZuX3ByaW50KGJwLT5icF9zbmFtZSwgc25hcGVuZCkpIHsKKwkJCXB1dGNoYXIoJyInKTsKKwkJCWZwdXRzKHRzdHIgKyAxLCBzdGRvdXQpOworCQkJcmV0dXJuOworCQl9CisJCXB1dGNoYXIoJyInKTsKKwl9CisJVENIRUNLMihicC0+YnBfZmlsZVswXSwgMSk7CQkvKiBjaGVjayBmaXJzdCBjaGFyIG9ubHkgKi8KKwlpZiAoKmJwLT5icF9maWxlKSB7CisJCXByaW50ZigiXG5cdCAgZmlsZSBcIiIpOworCQlpZiAoZm5fcHJpbnQoYnAtPmJwX2ZpbGUsIHNuYXBlbmQpKSB7CisJCQlwdXRjaGFyKCciJyk7CisJCQlmcHV0cyh0c3RyICsgMSwgc3Rkb3V0KTsKKwkJCXJldHVybjsKKwkJfQorCQlwdXRjaGFyKCciJyk7CisJfQorCisJLyogRGVjb2RlIHRoZSB2ZW5kb3IgYnVmZmVyICovCisJVENIRUNLKGJwLT5icF92ZW5kWzBdKTsKKwlpZiAobWVtY21wKChjb25zdCBjaGFyICopYnAtPmJwX3ZlbmQsIHZtX3JmYzEwNDgsCisJCSBzaXplb2YodV9pbnQzMl90KSkgPT0gMCkKKwkJcmZjMTA0OF9wcmludChicC0+YnBfdmVuZCk7CisJZWxzZSBpZiAobWVtY21wKChjb25zdCBjaGFyICopYnAtPmJwX3ZlbmQsIHZtX2NtdSwKKwkJICAgICAgc2l6ZW9mKHVfaW50MzJfdCkpID09IDApCisJCWNtdV9wcmludChicC0+YnBfdmVuZCk7CisJZWxzZSB7CisJCXVfaW50MzJfdCB1bDsKKworCQl1bCA9IEVYVFJBQ1RfMzJCSVRTKCZicC0+YnBfdmVuZCk7CisJCWlmICh1bCAhPSAwKQorCQkJcHJpbnRmKCJcblx0ICBWZW5kb3ItIzB4JXgiLCB1bCk7CisJfQorCisJcmV0dXJuOwordHJ1bmM6CisJZnB1dHModHN0ciwgc3Rkb3V0KTsKK30KKworLyoKKyAqIFRoZSBmaXJzdCBjaGFyYWN0ZXIgc3BlY2lmaWVzIHRoZSBmb3JtYXQgdG8gcHJpbnQ6CisgKiAgICAgaSAtIGlwIGFkZHJlc3MgKDMyIGJpdHMpCisgKiAgICAgcCAtIGlwIGFkZHJlc3MgcGFpcnMgKDMyIGJpdHMgKyAzMiBiaXRzKQorICogICAgIGwgLSBsb25nICgzMiBiaXRzKQorICogICAgIEwgLSB1bnNpZ25lZCBsb25nICgzMiBiaXRzKQorICogICAgIHMgLSBzaG9ydCAoMTYgYml0cykKKyAqICAgICBiIC0gcGVyaW9kLXNlcGVyYXRlZCBkZWNpbWFsIGJ5dGVzICh2YXJpYWJsZSBsZW5ndGgpCisgKiAgICAgeCAtIGNvbG9uLXNlcGVyYXRlZCBoZXggYnl0ZXMgKHZhcmlhYmxlIGxlbmd0aCkKKyAqICAgICBhIC0gYXNjaWkgc3RyaW5nICh2YXJpYWJsZSBsZW5ndGgpCisgKiAgICAgQiAtIG9uL29mZiAoOCBiaXRzKQorICogICAgICQgLSBzcGVjaWFsIChleHBsaWNpdCBjb2RlIHRvIGhhbmRsZSkKKyAqLworc3RhdGljIHN0cnVjdCB0b2sgdGFnMnN0cltdID0geworLyogUkZDMTA0OCB0YWdzICovCisJeyBUQUdfUEFELAkJIiBQQUQiIH0sCisJeyBUQUdfU1VCTkVUX01BU0ssCSJpU3VibmV0LU1hc2siIH0sCS8qIHN1Ym5ldCBtYXNrIChSRkM5NTApICovCisJeyBUQUdfVElNRV9PRkZTRVQsCSJMVGltZS1ab25lIiB9LAkvKiBzZWNvbmRzIGZyb20gVVRDICovCisJeyBUQUdfR0FURVdBWSwJCSJpRGVmYXVsdC1HYXRld2F5IiB9LAkvKiBkZWZhdWx0IGdhdGV3YXkgKi8KKwl7IFRBR19USU1FX1NFUlZFUiwJImlUaW1lLVNlcnZlciIgfSwJLyogdGltZSBzZXJ2ZXJzIChSRkM4NjgpICovCisJeyBUQUdfTkFNRV9TRVJWRVIsCSJpSUVOLU5hbWUtU2VydmVyIiB9LAkvKiBJRU4gbmFtZSBzZXJ2ZXJzIChJRU4xMTYpICovCisJeyBUQUdfRE9NQUlOX1NFUlZFUiwJImlEb21haW4tTmFtZS1TZXJ2ZXIiIH0sCS8qIGRvbWFpbiBuYW1lIChSRkMxMDM1KSAqLworCXsgVEFHX0xPR19TRVJWRVIsCSJpTE9HIiB9LAkvKiBNSVQgbG9nIHNlcnZlcnMgKi8KKwl7IFRBR19DT09LSUVfU0VSVkVSLAkiaUNTIiB9LAkvKiBjb29raWUgc2VydmVycyAoUkZDODY1KSAqLworCXsgVEFHX0xQUl9TRVJWRVIsCSJpTFBSLVNlcnZlciIgfSwJLyogbHByIHNlcnZlciAoUkZDMTE3OSkgKi8KKwl7IFRBR19JTVBSRVNTX1NFUlZFUiwJImlJTSIgfSwJLyogaW1wcmVzcyBzZXJ2ZXJzIChJbWFnZW4pICovCisJeyBUQUdfUkxQX1NFUlZFUiwJImlSTCIgfSwJLyogcmVzb3VyY2UgbG9jYXRpb24gKFJGQzg4NykgKi8KKwl7IFRBR19IT1NUTkFNRSwJCSJhSG9zdG5hbWUiIH0sCS8qIGFzY2lpIGhvc3RuYW1lICovCisJeyBUQUdfQk9PVFNJWkUsCQkic0JTIiB9LAkvKiA1MTIgYnl0ZSBibG9ja3MgKi8KKwl7IFRBR19FTkQsCQkiIEVORCIgfSwKKy8qIFJGQzE0OTcgdGFncyAqLworCXsgVEFHX0RVTVBQQVRILAkJImFEUCIgfSwKKwl7IFRBR19ET01BSU5OQU1FLAkiYURvbWFpbi1OYW1lIiB9LAorCXsgVEFHX1NXQVBfU0VSVkVSLAkiaVNTIiB9LAorCXsgVEFHX1JPT1RQQVRILAkJImFSUCIgfSwKKwl7IFRBR19FWFRQQVRILAkJImFFUCIgfSwKKy8qIFJGQzIxMzIgdGFncyAqLworCXsgVEFHX0lQX0ZPUldBUkQsCSJCSVBGIiB9LAorCXsgVEFHX05MX1NSQ1JULAkJIkJTUlQiIH0sCisJeyBUQUdfUEZJTFRFUlMsCQkicFBGIiB9LAorCXsgVEFHX1JFQVNTX1NJWkUsCSJzUlNaIiB9LAorCXsgVEFHX0RFRl9UVEwsCQkiYlRUTCIgfSwKKwl7IFRBR19NVFVfVElNRU9VVCwJImxNVFUtVGltZW91dCIgfSwKKwl7IFRBR19NVFVfVEFCTEUsCSJzTVRVLVRhYmxlIiB9LAorCXsgVEFHX0lOVF9NVFUsCQkic01UVSIgfSwKKwl7IFRBR19MT0NBTF9TVUJORVRTLAkiQkxTTiIgfSwKKwl7IFRBR19CUk9BRF9BRERSLAkiaUJSIiB9LAorCXsgVEFHX0RPX01BU0tfRElTQywJIkJNRCIgfSwKKwl7IFRBR19TVVBQTFlfTUFTSywJIkJNUyIgfSwKKwl7IFRBR19ET19SRElTQywJCSJCUm91dGVyLURpc2NvdmVyeSIgfSwKKwl7IFRBR19SVFJfU09MX0FERFIsCSJpUlNBIiB9LAorCXsgVEFHX1NUQVRJQ19ST1VURSwJInBTdGF0aWMtUm91dGUiIH0sCisJeyBUQUdfVVNFX1RSQUlMRVJTLAkiQlVUIiB9LAorCXsgVEFHX0FSUF9USU1FT1VULAkibEFUIiB9LAorCXsgVEFHX0VUSF9FTkNBUCwJIkJJRSIgfSwKKwl7IFRBR19UQ1BfVFRMLAkJImJUVCIgfSwKKwl7IFRBR19UQ1BfS0VFUEFMSVZFLAkibEtJIiB9LAorCXsgVEFHX0tFRVBBTElWRV9HTywJIkJLRyIgfSwKKwl7IFRBR19OSVNfRE9NQUlOLAkiYVlEIiB9LAorCXsgVEFHX05JU19TRVJWRVJTLAkiaVlTIiB9LAorCXsgVEFHX05UUF9TRVJWRVJTLAkiaU5UUCIgfSwKKwl7IFRBR19WRU5ET1JfT1BUUywJImJWZW5kb3ItT3B0aW9uIiB9LAorCXsgVEFHX05FVEJJT1NfTlMsCSJpTmV0Ymlvcy1OYW1lLVNlcnZlciIgfSwKKwl7IFRBR19ORVRCSU9TX0REUywJImlXREQiIH0sCisJeyBUQUdfTkVUQklPU19OT0RFLAkiJE5ldGJpb3MtTm9kZSIgfSwKKwl7IFRBR19ORVRCSU9TX1NDT1BFLAkiYU5ldGJpb3MtU2NvcGUiIH0sCisJeyBUQUdfWFdJTl9GUywJCSJpWEZTIiB9LAorCXsgVEFHX1hXSU5fRE0sCQkiaVhETSIgfSwKKwl7IFRBR19OSVNfUF9ET01BSU4sCSJzTitEIiB9LAorCXsgVEFHX05JU19QX1NFUlZFUlMsCSJpTitTIiB9LAorCXsgVEFHX01PQklMRV9IT01FLAkiaU1IIiB9LAorCXsgVEFHX1NNUFRfU0VSVkVSLAkiaVNNVFAiIH0sCisJeyBUQUdfUE9QM19TRVJWRVIsCSJpUE9QMyIgfSwKKwl7IFRBR19OTlRQX1NFUlZFUiwJImlOTlRQIiB9LAorCXsgVEFHX1dXV19TRVJWRVIsCSJpV1dXIiB9LAorCXsgVEFHX0ZJTkdFUl9TRVJWRVIsCSJpRkciIH0sCisJeyBUQUdfSVJDX1NFUlZFUiwJImlJUkMiIH0sCisJeyBUQUdfU1RSRUVUVEFMS19TUlZSLAkiaVNUUyIgfSwKKwl7IFRBR19TVFJFRVRUQUxLX1NUREEsCSJpU1REQSIgfSwKKwl7IFRBR19SRVFVRVNURURfSVAsCSJpUmVxdWVzdGVkLUlQIiB9LAorCXsgVEFHX0lQX0xFQVNFLAkJImxMZWFzZS1UaW1lIiB9LAorCXsgVEFHX09QVF9PVkVSTE9BRCwJIiRPTyIgfSwKKwl7IFRBR19URlRQX1NFUlZFUiwJImFURlRQIiB9LAorCXsgVEFHX0JPT1RGSUxFTkFNRSwJImFCRiIgfSwKKwl7IFRBR19ESENQX01FU1NBR0UsCSIgREhDUC1NZXNzYWdlIiB9LAorCXsgVEFHX1NFUlZFUl9JRCwJImlTZXJ2ZXItSUQiIH0sCisJeyBUQUdfUEFSTV9SRVFVRVNULAkiYlBhcmFtZXRlci1SZXF1ZXN0IiB9LAorCXsgVEFHX01FU1NBR0UsCQkiYU1TRyIgfSwKKwl7IFRBR19NQVhfTVNHX1NJWkUsCSJzTVNaIiB9LAorCXsgVEFHX1JFTkVXQUxfVElNRSwJImxSTiIgfSwKKwl7IFRBR19SRUJJTkRfVElNRSwJImxSQiIgfSwKKwl7IFRBR19WRU5ET1JfQ0xBU1MsCSJhVmVuZG9yLUNsYXNzIiB9LAorCXsgVEFHX0NMSUVOVF9JRCwJIiRDbGllbnQtSUQiIH0sCisvKiBSRkMgMjQ4NSAqLworCXsgVEFHX09QRU5fR1JPVVBfVUFQLAkiYVVBUCIgfSwKKy8qIFJGQyAyNTYzICovCisJeyBUQUdfRElTQUJMRV9BVVRPQ09ORiwJIkJOT0FVVE8iIH0sCisvKiBSRkMgMjYxMCAqLworCXsgVEFHX1NMUF9EQSwJCSJiU0xQLURBIiB9LAkvKiJiIiBpcyBhIGxpdHRsZSB3cm9uZyAqLworCXsgVEFHX1NMUF9TQ09QRSwJImJTTFAtU0NPUEUiIH0sCS8qImIiIGlzIGEgbGl0dGxlIHdyb25nICovCisvKiBSRkMgMjkzNyAqLworCXsgVEFHX05TX1NFQVJDSCwJInNOU1NFQVJDSCIgfSwJLyogWFhYICdzJyAqLworLyogUkZDIDMwMTEgKi8KKwl7IFRBR19JUDRfU1VCTkVUX1NFTEVDVCwgImlTVUJORVQiIH0sCisvKiBSRkMgMzQ0MiAqLworCXsgVEFHX0NMQVNTTEVTU19TVEFUSUNfUlQsICIkQ2xhc3NsZXNzLVN0YXRpYy1Sb3V0ZSIgfSwKKwl7IFRBR19DTEFTU0xFU1NfU1RBX1JUX01TLCAiJENsYXNzbGVzcy1TdGF0aWMtUm91dGUtTWljcm9zb2Z0IiB9LAorLyogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ib290cC1kaGNwLWV4dGVuc2lvbnMvaW5kZXguaHRtICovCisJeyBUQUdfVVNFUl9DTEFTUywJImFDTEFTUyIgfSwKKwl7IFRBR19TTFBfTkFNSU5HX0FVVEgsCSJhU0xQLU5BIiB9LAorCXsgVEFHX0NMSUVOVF9GUUROLAkiJEZRRE4iIH0sCisJeyBUQUdfQUdFTlRfQ0lSQ1VJVCwJIiRBZ2VudC1JbmZvcm1hdGlvbiIgfSwKKwl7IFRBR19BR0VOVF9SRU1PVEUsCSJiQVJNVCIgfSwKKwl7IFRBR19BR0VOVF9NQVNLLAkiYkFNU0siIH0sCisJeyBUQUdfVFpfU1RSSU5HLAkiYVRaU1RSIiB9LAorCXsgVEFHX0ZRRE5fT1BUSU9OLAkiYkZRRE5TIiB9LAkvKiBYWFggJ2InICovCisJeyBUQUdfQVVUSCwJCSJiQVVUSCIgfSwJLyogWFhYICdiJyAqLworCXsgVEFHX1ZJTkVTX1NFUlZFUlMsCSJpVklORVMiIH0sCisJeyBUQUdfU0VSVkVSX1JBTkssCSJzUkFOSyIgfSwKKwl7IFRBR19DTElFTlRfQVJDSCwJInNBUkNIIiB9LAorCXsgVEFHX0NMSUVOVF9OREksCSJiTkRJIiB9LAkvKiBYWFggJ2InICovCisJeyBUQUdfQ0xJRU5UX0dVSUQsCSJiR1VJRCIgfSwJLyogWFhYICdiJyAqLworCXsgVEFHX0xEQVBfVVJMLAkJImFMREFQIiB9LAorCXsgVEFHXzZPVkVSNCwJCSJpNm80IiB9LAorCXsgVEFHX1BSSU5URVJfTkFNRSwJImFQUlRSIiB9LAorCXsgVEFHX01ESENQX1NFUlZFUiwJImJNREhDUCIgfSwJLyogWFhYICdiJyAqLworCXsgVEFHX0lQWF9DT01QQVQsCSJiSVBYIiB9LAkvKiBYWFggJ2InICovCisJeyBUQUdfTkVUSU5GT19QQVJFTlQsCSJpTkkiIH0sCisJeyBUQUdfTkVUSU5GT19QQVJFTlRfVEFHLCAiYU5JVEFHIiB9LAorCXsgVEFHX1VSTCwJCSJhVVJMIiB9LAorCXsgVEFHX0ZBSUxPVkVSLAkJImJGQUlMIiB9LAkvKiBYWFggJ2InICovCisJeyAwLAkJCU5VTEwgfQorfTsKKy8qIDItYnl0ZSBleHRlbmRlZCB0YWdzICovCitzdGF0aWMgc3RydWN0IHRvayB4dGFnMnN0cltdID0geworCXsgMCwJCQlOVUxMIH0KK307CisKKy8qIERIQ1AgIm9wdGlvbnMgb3ZlcmxvYWQiIHR5cGVzICovCitzdGF0aWMgc3RydWN0IHRvayBvbzJzdHJbXSA9IHsKKwl7IDEsCQkJImZpbGUiIH0sCisJeyAyLAkJCSJzbmFtZSIgfSwKKwl7IDMsCQkJImZpbGUrc25hbWUiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworLyogTkVUQklPUyBvdmVyIFRDUC9JUCBub2RlIHR5cGUgb3B0aW9ucyAqLworc3RhdGljIHN0cnVjdCB0b2sgbmJvMnN0cltdID0geworCXsgMHgxLAkJCSJiLW5vZGUiIH0sCisJeyAweDIsCQkJInAtbm9kZSIgfSwKKwl7IDB4NCwJCQkibS1ub2RlIiB9LAorCXsgMHg4LAkJCSJoLW5vZGUiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworLyogQVJQIEhhcmR3YXJlIHR5cGVzLCBmb3IgQ2xpZW50LUlEIG9wdGlvbiAqLworc3RhdGljIHN0cnVjdCB0b2sgYXJwMnN0cltdID0geworCXsgMHgxLAkJCSJldGhlciIgfSwKKwl7IDB4NiwJCQkiaWVlZTgwMiIgfSwKKwl7IDB4NywJCQkiYXJjbmV0IiB9LAorCXsgMHhmLAkJCSJmcmVsYXkiIH0sCisJeyAweDE3LAkJCSJzdHJpcCIgfSwKKwl7IDB4MTgsCQkJImllZWUxMzk0IiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGRoY3BfbXNnX3ZhbHVlc1tdID0geworICAgICAgICB7IERIQ1BESVNDT1ZFUiwgIkRpc2NvdmVyIiB9LAorICAgICAgICB7IERIQ1BPRkZFUiwgIk9mZmVyIiB9LAorICAgICAgICB7IERIQ1BSRVFVRVNULCAiUmVxdWVzdCIgfSwKKyAgICAgICAgeyBESENQREVDTElORSwgIkRlY2xpbmUiIH0sCisgICAgICAgIHsgREhDUEFDSywgIkFDSyIgfSwKKyAgICAgICAgeyBESENQTkFLLCAiTkFDSyIgfSwKKyAgICAgICAgeyBESENQUkVMRUFTRSwgIlJlbGVhc2UiIH0sCisgICAgICAgIHsgREhDUElORk9STSwgIkluZm9ybSIgfSwKKyAgICAgICAgeyAwLAkJCU5VTEwgfQorfTsKKworI2RlZmluZSBBR0VOVF9TVUJPUFRJT05fQ0lSQ1VJVF9JRCAxCitzdGF0aWMgc3RydWN0IHRvayBhZ2VudF9zdWJvcHRpb25fdmFsdWVzW10gPSB7CisgICAgICAgIHsgQUdFTlRfU1VCT1BUSU9OX0NJUkNVSVRfSUQsICJDaXJjdWl0LUlEIiB9LAorICAgICAgICB7IDAsCQkJTlVMTCB9Cit9OworCisKK3N0YXRpYyB2b2lkCityZmMxMDQ4X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCit7CisJcmVnaXN0ZXIgdV9pbnQxNl90IHRhZzsKKwlyZWdpc3RlciB1X2ludCBsZW47CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7CisJcmVnaXN0ZXIgY2hhciBjOworCWludCBmaXJzdCwgaWR4OworCXVfaW50MzJfdCB1bDsKKwl1X2ludDE2X3QgdXM7CisJdV9pbnQ4X3QgdWMsIHN1Ym9wdCwgc3Vib3B0bGVuOworCisJcHJpbnRmKCJcblx0ICBWZW5kb3ItcmZjMTA0OCBFeHRlbnNpb25zIik7CisKKwkvKiBTdGVwIG92ZXIgbWFnaWMgY29va2llICovCisgICAgICAgIHByaW50ZigiXG5cdCAgICBNYWdpYyBDb29raWUgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKKwlicCArPSBzaXplb2YoaW50MzJfdCk7CisKKwkvKiBMb29wIHdoaWxlIHdlIHRoZXJlIGlzIGEgdGFnIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworCXdoaWxlIChUVEVTVDIoKmJwLCAxKSkgeworCQl0YWcgPSAqYnArKzsKKwkJaWYgKHRhZyA9PSBUQUdfUEFEICYmIHZmbGFnIDwgMykKKwkJCWNvbnRpbnVlOworCQlpZiAodGFnID09IFRBR19FTkQgJiYgdmZsYWcgPCAzKQorCQkJcmV0dXJuOworCQlpZiAodGFnID09IFRBR19FWFRFTkRFRF9PUFRJT04pIHsKKwkJCVRDSEVDSzIoKihicCArIDEpLCAyKTsKKwkJCXRhZyA9IEVYVFJBQ1RfMTZCSVRTKGJwICsgMSk7CisJCQkvKiBYWFggd2UgZG9uJ3Qga25vdyB5ZXQgaWYgdGhlIElBTkEgd2lsbAorCQkJICogcHJlY2x1ZGUgb3ZlcmxhcCBvZiAxLWJ5dGUgYW5kIDItYnl0ZSBzcGFjZXMuCisJCQkgKiBJZiBub3QsIHdlIG5lZWQgdG8gb2Zmc2V0IHRhZyBhZnRlciB0aGlzIHN0ZXAuCisJCQkgKi8KKwkJCWNwID0gdG9rMnN0cih4dGFnMnN0ciwgIj94VCV1IiwgdGFnKTsKKwkJfSBlbHNlCisJCQljcCA9IHRvazJzdHIodGFnMnN0ciwgIj9UJXUiLCB0YWcpOworCQljID0gKmNwKys7CisKKwkJaWYgKHRhZyA9PSBUQUdfUEFEIHx8IHRhZyA9PSBUQUdfRU5EKQorCQkJbGVuID0gMDsKKwkJZWxzZSB7CisJCQkvKiBHZXQgdGhlIGxlbmd0aDsgY2hlY2sgZm9yIHRydW5jYXRpb24gKi8KKwkJCVRDSEVDSzIoKmJwLCAxKTsKKwkJCWxlbiA9ICpicCsrOworCQl9CisKKwkJcHJpbnRmKCJcblx0ICAgICVzIE9wdGlvbiAldSwgbGVuZ3RoICV1JXMiLCBjcCwgdGFnLCBsZW4sCisJCSAgICBsZW4gPiAwID8gIjogIiA6ICIiKTsKKworCQlpZiAodGFnID09IFRBR19QQUQgJiYgdmZsYWcgPiAyKSB7CisJCQl1X2ludCBudGFnID0gMTsKKwkJCXdoaWxlIChUVEVTVDIoKmJwLCAxKSAmJiAqYnAgPT0gVEFHX1BBRCkgeworCQkJCWJwKys7CisJCQkJbnRhZysrOworCQkJfQorCQkJaWYgKG50YWcgPiAxKQorCQkJCXByaW50ZigiLCBvY2N1cnMgJXUiLCBudGFnKTsKKwkJfQorCisJCWlmICghVFRFU1QyKCpicCwgbGVuKSkgeworCQkJcHJpbnRmKCJbfHJmYzEwNDggJXVdIiwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICh0YWcgPT0gVEFHX0RIQ1BfTUVTU0FHRSAmJiBsZW4gPT0gMSkgeworCQkJdWMgPSAqYnArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCB0b2syc3RyKGRoY3BfbXNnX3ZhbHVlcywgIlVua25vd24gKCV1KSIsIHVjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwkJfQorCisJCWlmICh0YWcgPT0gVEFHX1BBUk1fUkVRVUVTVCkgeworCQkJaWR4ID0gMDsKKwkJCXdoaWxlIChsZW4tLSA+IDApIHsKKwkJCQl1YyA9ICpicCsrOworCQkJCWNwID0gdG9rMnN0cih0YWcyc3RyLCAiP09wdGlvbiAldSIsIHVjKTsKKwkJCQlpZiAoaWR4ICUgNCA9PSAwKQorCQkJCQlwcmludGYoIlxuXHQgICAgICAiKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiLCAiKTsKKwkJCQlwcmludGYoIiVzIiwgY3AgKyAxKTsKKwkJCQlpZHgrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHRhZyA9PSBUQUdfRVhURU5ERURfUkVRVUVTVCkgeworCQkJZmlyc3QgPSAxOworCQkJd2hpbGUgKGxlbiA+IDEpIHsKKwkJCQlsZW4gLT0gMjsKKwkJCQl1cyA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKKwkJCQlicCArPSAyOworCQkJCWNwID0gdG9rMnN0cih4dGFnMnN0ciwgIj94VCV1IiwgdXMpOworCQkJCWlmICghZmlyc3QpCisJCQkJCXB1dGNoYXIoJysnKTsKKwkJCQlwcmludGYoIiVzIiwgY3AgKyAxKTsKKwkJCQlmaXJzdCA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFByaW50IGRhdGEgKi8KKwkJaWYgKGMgPT0gJz8nKSB7CisJCQkvKiBCYXNlIGRlZmF1bHQgZm9ybWF0cyBmb3IgdW5rbm93biB0YWdzIG9uIGRhdGEgc2l6ZSAqLworCQkJaWYgKGxlbiAmIDEpCisJCQkJYyA9ICdiJzsKKwkJCWVsc2UgaWYgKGxlbiAmIDIpCisJCQkJYyA9ICdzJzsKKwkJCWVsc2UKKwkJCQljID0gJ2wnOworCQl9CisJCWZpcnN0ID0gMTsKKwkJc3dpdGNoIChjKSB7CisKKwkJY2FzZSAnYSc6CisJCQkvKiBhc2NpaSBzdHJpbmdzICovCisJCQlwdXRjaGFyKCciJyk7CisJCQlpZiAoZm5fcHJpbnRuKGJwLCBsZW4sIHNuYXBlbmQpKSB7CisJCQkJcHV0Y2hhcignIicpOworCQkJCWdvdG8gdHJ1bmM7CisJCQl9CisJCQlwdXRjaGFyKCciJyk7CisJCQlicCArPSBsZW47CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCWNhc2UgJ2wnOgorCQljYXNlICdMJzoKKwkJCS8qIGlwIGFkZHJlc3Nlcy8zMi1iaXQgd29yZHMgKi8KKwkJCXdoaWxlIChsZW4gPj0gc2l6ZW9mKHVsKSkgeworCQkJCWlmICghZmlyc3QpCisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQl1bCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJCQlpZiAoYyA9PSAnaScpIHsKKwkJCQkJdWwgPSBodG9ubCh1bCk7CisJCQkJCXByaW50ZigiJXMiLCBpcGFkZHJfc3RyaW5nKCZ1bCkpOworCQkJCX0gZWxzZSBpZiAoYyA9PSAnTCcpCisJCQkJCXByaW50ZigiJWQiLCB1bCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiV1IiwgdWwpOworCQkJCWJwICs9IHNpemVvZih1bCk7CisJCQkJbGVuIC09IHNpemVvZih1bCk7CisJCQkJZmlyc3QgPSAwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAncCc6CisJCQkvKiBJUCBhZGRyZXNzIHBhaXJzICovCisJCQl3aGlsZSAobGVuID49IDIqc2l6ZW9mKHVsKSkgeworCQkJCWlmICghZmlyc3QpCisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQltZW1jcHkoKGNoYXIgKikmdWwsIChjb25zdCBjaGFyICopYnAsIHNpemVvZih1bCkpOworCQkJCXByaW50ZigiKCVzOiIsIGlwYWRkcl9zdHJpbmcoJnVsKSk7CisJCQkJYnAgKz0gc2l6ZW9mKHVsKTsKKwkJCQltZW1jcHkoKGNoYXIgKikmdWwsIChjb25zdCBjaGFyICopYnAsIHNpemVvZih1bCkpOworCQkJCXByaW50ZigiJXMpIiwgaXBhZGRyX3N0cmluZygmdWwpKTsKKwkJCQlicCArPSBzaXplb2YodWwpOworCQkJCWxlbiAtPSAyKnNpemVvZih1bCk7CisJCQkJZmlyc3QgPSAwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAncyc6CisJCQkvKiBzaG9ydHMgKi8KKwkJCXdoaWxlIChsZW4gPj0gc2l6ZW9mKHVzKSkgeworCQkJCWlmICghZmlyc3QpCisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQl1cyA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKKwkJCQlwcmludGYoIiV1IiwgdXMpOworCQkJCWJwICs9IHNpemVvZih1cyk7CisJCQkJbGVuIC09IHNpemVvZih1cyk7CisJCQkJZmlyc3QgPSAwOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnQic6CisJCQkvKiBib29sZWFuICovCisJCQl3aGlsZSAobGVuID4gMCkgeworCQkJCWlmICghZmlyc3QpCisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQlzd2l0Y2ggKCpicCkgeworCQkJCWNhc2UgMDoKKwkJCQkJcHV0Y2hhcignTicpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXB1dGNoYXIoJ1knKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRmKCIldT8iLCAqYnApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJKyticDsKKwkJCQktLWxlbjsKKwkJCQlmaXJzdCA9IDA7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdiJzoKKwkJY2FzZSAneCc6CisJCWRlZmF1bHQ6CisJCQkvKiBCeXRlcyAqLworCQkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlwdXRjaGFyKGMgPT0gJ3gnID8gJzonIDogJy4nKTsKKwkJCQlpZiAoYyA9PSAneCcpCisJCQkJCXByaW50ZigiJTAyeCIsICpicCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiV1IiwgKmJwKTsKKwkJCQkrK2JwOworCQkJCS0tbGVuOworCQkJCWZpcnN0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJyQnOgorCQkJLyogR3V5cyB3ZSBjYW4ndCBoYW5kbGUgd2l0aCBvbmUgb2YgdGhlIHVzdWFsIGNhc2VzICovCisJCQlzd2l0Y2ggKHRhZykgeworCisJCQljYXNlIFRBR19ORVRCSU9TX05PREU6CisJCQkJLyogdGhpcyBvcHRpb24gc2hvdWxkIGJlIGF0IGxlYXN0IDEgYnl0ZSBsb25nICovCisJCQkJaWYgKGxlbiA8IDEpICB7CisJCQkJCXByaW50ZigiRVJST1I6IG9wdGlvbiAldSBsZW4gJXUgPCAxIGJ5dGVzIiwKKwkJCQkJICAgIFRBR19ORVRCSU9TX05PREUsIGxlbik7CisJCQkJCWJwICs9IGxlbjsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRhZyA9ICpicCsrOworCQkJCS0tbGVuOworCQkJCWZwdXRzKHRvazJzdHIobmJvMnN0ciwgTlVMTCwgdGFnKSwgc3Rkb3V0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQUdfT1BUX09WRVJMT0FEOgorCQkJCS8qIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBhdCBsZWFzdCAxIGJ5dGUgbG9uZyAqLworCQkJCWlmIChsZW4gPCAxKSAgeworCQkJCQlwcmludGYoIkVSUk9SOiBvcHRpb24gJXUgbGVuICV1IDwgMSBieXRlcyIsCisJCQkJCSAgICBUQUdfT1BUX09WRVJMT0FELCBsZW4pOworCQkJCQlicCArPSBsZW47CisJCQkJCWxlbiA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQl0YWcgPSAqYnArKzsKKwkJCQktLWxlbjsKKwkJCQlmcHV0cyh0b2syc3RyKG9vMnN0ciwgTlVMTCwgdGFnKSwgc3Rkb3V0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQUdfQ0xJRU5UX0ZRRE46CisJCQkJLyogdGhpcyBvcHRpb24gc2hvdWxkIGJlIGF0IGxlYXN0IDMgYnl0ZXMgbG9uZyAqLworCQkJCWlmIChsZW4gPCAzKSAgeworCQkJCQlwcmludGYoIkVSUk9SOiBvcHRpb24gJXUgbGVuICV1IDwgMyBieXRlcyIsCisJCQkJCSAgICBUQUdfQ0xJRU5UX0ZRRE4sIGxlbik7CisJCQkJCWJwICs9IGxlbjsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICgqYnApCisJCQkJCXByaW50ZigiWyVzXSAiLCBjbGllbnRfZnFkbl9mbGFncygqYnApKTsKKwkJCQlicCsrOworCQkJCWlmICgqYnAgfHwgKihicCsxKSkKKwkJCQkJcHJpbnRmKCIldS8ldSAiLCAqYnAsICooYnArMSkpOworCQkJCWJwICs9IDI7CisJCQkJcHV0Y2hhcignIicpOworCQkJCWlmIChmbl9wcmludG4oYnAsIGxlbiAtIDMsIHNuYXBlbmQpKSB7CisJCQkJCXB1dGNoYXIoJyInKTsKKwkJCQkJZ290byB0cnVuYzsKKwkJCQl9CisJCQkJcHV0Y2hhcignIicpOworCQkJCWJwICs9IGxlbiAtIDM7CisJCQkJbGVuID0gMDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQUdfQ0xJRU5UX0lEOgorCQkJICAgIHsJaW50IHR5cGU7CisKKwkJCQkvKiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgYXQgbGVhc3QgMSBieXRlIGxvbmcgKi8KKwkJCQlpZiAobGVuIDwgMSkgIHsKKwkJCQkJcHJpbnRmKCJFUlJPUjogb3B0aW9uICV1IGxlbiAldSA8IDEgYnl0ZXMiLAorCQkJCQkgICAgVEFHX0NMSUVOVF9JRCwgbGVuKTsKKwkJCQkJYnAgKz0gbGVuOworCQkJCQlsZW4gPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJdHlwZSA9ICpicCsrOworCQkJCWxlbi0tOworCQkJCWlmICh0eXBlID09IDApIHsKKwkJCQkJcHV0Y2hhcignIicpOworCQkJCQlpZiAoZm5fcHJpbnRuKGJwLCBsZW4sIHNuYXBlbmQpKSB7CisJCQkJCQlwdXRjaGFyKCciJyk7CisJCQkJCQlnb3RvIHRydW5jOworCQkJCQl9CisJCQkJCXB1dGNoYXIoJyInKTsKKwkJCQkJYnAgKz0gbGVuOworCQkJCQlsZW4gPSAwOworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGYoIiVzICIsIHRvazJzdHIoYXJwMnN0ciwgImhhcmR3YXJlLXR5cGUgJXUsIiwgdHlwZSkpOworCQkJCQl3aGlsZSAobGVuID4gMCkgeworCQkJCQkJaWYgKCFmaXJzdCkKKwkJCQkJCQlwdXRjaGFyKCc6Jyk7CisJCQkJCQlwcmludGYoIiUwMngiLCAqYnApOworCQkJCQkJKyticDsKKwkJCQkJCS0tbGVuOworCQkJCQkJZmlyc3QgPSAwOworCQkJCQl9CisJCQkJfQorCQkJCWJyZWFrOworCQkJICAgIH0KKworCQkJY2FzZSBUQUdfQUdFTlRfQ0lSQ1VJVDoKKwkJCQl3aGlsZSAobGVuID49IDIpIHsKKwkJCQkJc3Vib3B0ID0gKmJwKys7CisJCQkJCXN1Ym9wdGxlbiA9ICpicCsrOworCQkJCQlsZW4gLT0gMjsKKwkJCQkJaWYgKHN1Ym9wdGxlbiA+IGxlbikgeworCQkJCQkJcHJpbnRmKCJcblx0ICAgICAgJXMgU3ViT3B0aW9uICV1LCBsZW5ndGggJXU6IGxlbmd0aCBnb2VzIHBhc3QgZW5kIG9mIG9wdGlvbiIsCisJCQkJCQkgICB0b2syc3RyKGFnZW50X3N1Ym9wdGlvbl92YWx1ZXMsICJVbmtub3duIiwgc3Vib3B0KSwKKwkJCQkJCSAgIHN1Ym9wdCwKKwkJCQkJCSAgIHN1Ym9wdGxlbik7CisJCQkJCQlicCArPSBsZW47CisJCQkJCQlsZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCJcblx0ICAgICAgJXMgU3ViT3B0aW9uICV1LCBsZW5ndGggJXU6ICIsCisJCQkJCSAgIHRvazJzdHIoYWdlbnRfc3Vib3B0aW9uX3ZhbHVlcywgIlVua25vd24iLCBzdWJvcHQpLAorCQkJCQkgICBzdWJvcHQsCisJCQkJCSAgIHN1Ym9wdGxlbik7CisJCQkJCXN3aXRjaCAoc3Vib3B0KSB7CisKKwkJCQkJY2FzZSBBR0VOVF9TVUJPUFRJT05fQ0lSQ1VJVF9JRDoKKwkJCQkJCWZuX3ByaW50bihicCwgc3Vib3B0bGVuLCBOVUxMKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlwcmludF91bmtub3duX2RhdGEoYnAsICJcblx0XHQiLCBzdWJvcHRsZW4pOworCQkJCQl9CisKKwkJCQkJbGVuIC09IHN1Ym9wdGxlbjsKKwkJCQkJYnAgKz0gc3Vib3B0bGVuOworCQkJICAgIH0KKwkJCSAgICBicmVhazsKKworCQkJY2FzZSBUQUdfQ0xBU1NMRVNTX1NUQVRJQ19SVDoKKwkJCWNhc2UgVEFHX0NMQVNTTEVTU19TVEFfUlRfTVM6CisJCQl7CQorCQkJCXVfaW50IG1hc2tfd2lkdGgsIHNpZ25pZmljYW50X29jdGV0cywgaTsKKworCQkJCS8qIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBhdCBsZWFzdCA1IGJ5dGVzIGxvbmcgKi8KKwkJCQlpZiAobGVuIDwgNSkgIHsKKwkJCQkJcHJpbnRmKCJFUlJPUjogb3B0aW9uICV1IGxlbiAldSA8IDUgYnl0ZXMiLAorCQkJCQkgICAgVEFHX0NMQVNTTEVTU19TVEFUSUNfUlQsIGxlbik7CisJCQkJCWJwICs9IGxlbjsKKwkJCQkJbGVuID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJCWlmICghZmlyc3QpCisJCQkJCQlwdXRjaGFyKCcsJyk7CisJCQkJCW1hc2tfd2lkdGggPSAqYnArKzsKKwkJCQkJbGVuLS07CisJCQkJCS8qIG1hc2tfd2lkdGggPD0gMzIgKi8KKwkJCQkJaWYgKG1hc2tfd2lkdGggPiAzMikgeworCQkJCQkJcHJpbnRmKCJbRVJST1I6IE1hc2sgd2lkdGggKCVkKSA+IDMyXSIsICBtYXNrX3dpZHRoKTsKKwkJCQkJCWJwICs9IGxlbjsKKwkJCQkJCWxlbiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzaWduaWZpY2FudF9vY3RldHMgPSAobWFza193aWR0aCArIDcpIC8gODsKKwkJCQkJLyogc2lnbmlmaWNhbnQgb2N0ZXRzICsgcm91dGVyKDQpICovCisJCQkJCWlmIChsZW4gPCBzaWduaWZpY2FudF9vY3RldHMgKyA0KSB7CisJCQkJCQlwcmludGYoIltFUlJPUjogUmVtYWluaW5nIGxlbmd0aCAoJXUpIDwgJXUgYnl0ZXNdIiwgIGxlbiwgc2lnbmlmaWNhbnRfb2N0ZXRzICsgNCk7CisJCQkJCQlicCArPSBsZW47CisJCQkJCQlsZW4gPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJcHV0Y2hhcignKCcpOworCQkJCQlpZiAobWFza193aWR0aCA9PSAwKQorCQkJCQkJcHJpbnRmKCJkZWZhdWx0Iik7CisJCQkJCWVsc2UgeworCQkJCQkJZm9yIChpID0gMDsgaSA8IHNpZ25pZmljYW50X29jdGV0cyA7IGkrKykgeworCQkJCQkJCWlmIChpID4gMCkKKwkJCQkJCQkJcHV0Y2hhcignLicpOworCQkJCQkJCXByaW50ZigiJWQiLCAqYnArKyk7CisJCQkJCQl9CisJCQkJCQlmb3IgKGkgPSBzaWduaWZpY2FudF9vY3RldHMgOyBpIDwgNCA7IGkrKykKKwkJCQkJCQlwcmludGYoIi4wIik7CisJCQkJCQlwcmludGYoIi8lZCIsIG1hc2tfd2lkdGgpOworCQkJCQl9CisJCQkJCW1lbWNweSgoY2hhciAqKSZ1bCwgKGNvbnN0IGNoYXIgKilicCwgc2l6ZW9mKHVsKSk7CisJCQkJCXByaW50ZigiOiVzKSIsIGlwYWRkcl9zdHJpbmcoJnVsKSk7CisJCQkJCWJwICs9IHNpemVvZih1bCk7CisJCQkJCWxlbiAtPSAoc2lnbmlmaWNhbnRfb2N0ZXRzICsgNCk7CisJCQkJCWZpcnN0ID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIlt1bmtub3duIHNwZWNpYWwgdGFnICV1LCBzaXplICV1XSIsCisJCQkJICAgIHRhZywgbGVuKTsKKwkJCQlicCArPSBsZW47CisJCQkJbGVuID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8qIERhdGEgbGVmdCBvdmVyPyAqLworCQlpZiAobGVuKSB7CisJCQlwcmludGYoIlxuXHQgIHRyYWlsaW5nIGRhdGEgbGVuZ3RoICV1IiwgbGVuKTsKKwkJCWJwICs9IGxlbjsKKwkJfQorCX0KKwlyZXR1cm47Cit0cnVuYzoKKwlwcmludGYoInxbcmZjMTA0OF0iKTsKK30KKworc3RhdGljIHZvaWQKK2NtdV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBjbXVfdmVuZCAqY211OworCisjZGVmaW5lIFBSSU5UQ01VQUREUihtLCBzKSB7IFRDSEVDSyhjbXUtPm0pOyBcCisgICAgaWYgKGNtdS0+bS5zX2FkZHIgIT0gMCkgXAorCXByaW50ZigiICVzOiVzIiwgcywgaXBhZGRyX3N0cmluZygmY211LT5tLnNfYWRkcikpOyB9CisKKwlwcmludGYoIiB2ZW5kLWNtdSIpOworCWNtdSA9IChjb25zdCBzdHJ1Y3QgY211X3ZlbmQgKilicDsKKworCS8qIE9ubHkgcHJpbnQgaWYgdGhlcmUgYXJlIHVua25vd24gYml0cyAqLworCVRDSEVDSyhjbXUtPnZfZmxhZ3MpOworCWlmICgoY211LT52X2ZsYWdzICYgfihWRl9TTUFTSykpICE9IDApCisJCXByaW50ZigiIEY6MHgleCIsIGNtdS0+dl9mbGFncyk7CisJUFJJTlRDTVVBRERSKHZfZGdhdGUsICJERyIpOworCVBSSU5UQ01VQUREUih2X3NtYXNrLCBjbXUtPnZfZmxhZ3MgJiBWRl9TTUFTSyA/ICJTTSIgOiAiU00qIik7CisJUFJJTlRDTVVBRERSKHZfZG5zMSwgIk5TMSIpOworCVBSSU5UQ01VQUREUih2X2RuczIsICJOUzIiKTsKKwlQUklOVENNVUFERFIodl9pbnMxLCAiSUVOMSIpOworCVBSSU5UQ01VQUREUih2X2luczIsICJJRU4yIik7CisJUFJJTlRDTVVBRERSKHZfdHMxLCAiVFMxIik7CisJUFJJTlRDTVVBRERSKHZfdHMyLCAiVFMyIik7CisJcmV0dXJuOworCit0cnVuYzoKKwlmcHV0cyh0c3RyLCBzdGRvdXQpOworI3VuZGVmIFBSSU5UQ01VQUREUgorfQorCitzdGF0aWMgY2hhciAqCitjbGllbnRfZnFkbl9mbGFncyh1X2ludCBmbGFncykKK3sKKwlzdGF0aWMgY2hhciBidWZbOCsxXTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoZmxhZ3MgJiBDTElFTlRfRlFETl9GTEFHU19TKQorCQlidWZbaSsrXSA9ICdTJzsKKwlpZiAoZmxhZ3MgJiBDTElFTlRfRlFETl9GTEFHU19PKQorCQlidWZbaSsrXSA9ICdPJzsKKwlpZiAoZmxhZ3MgJiBDTElFTlRfRlFETl9GTEFHU19FKQorCQlidWZbaSsrXSA9ICdFJzsKKwlpZiAoZmxhZ3MgJiBDTElFTlRfRlFETl9GTEFHU19OKQorCQlidWZbaSsrXSA9ICdOJzsKKwlidWZbaV0gPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWNkcC5jIGIvcHJpbnQtY2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5OGZiZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWNkcC5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQ29kZSBieSBHZXJ0IERvZXJpbmcsIFNwYWNlTmV0IEdtYkgsIGdlcnRAc3BhY2UubmV0CisgKgorICogUmVmZXJlbmNlIGRvY3VtZW50YXRpb246CisgKiAgICBodHRwOi8vd3d3LmNpc2NvLmNvbS91bml2ZXJjZC9jYy90ZC9kb2MvcHJvZHVjdC9sYW4vdHJzcmIvZnJhbWVzLmh0bQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWNkcC5jLHYgMS4yNSAyMDA0LzEwLzA3IDE0OjUzOjExIGhhbm5lcyBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworI2luY2x1ZGUgIm5scGlkLmgiCisKKyNkZWZpbmUgQ0RQX0hFQURFUl9MRU4gIDQKKworc3RhdGljIHN0cnVjdCB0b2sgY2RwX3Rsdl92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICAgICAgICAgICAgICJEZXZpY2UtSUQifSwKKyAgICB7IDB4MDIsICAgICAgICAgICAgICJBZGRyZXNzIn0sCisgICAgeyAweDAzLCAgICAgICAgICAgICAiUG9ydC1JRCJ9LAorICAgIHsgMHgwNCwgICAgICAgICAgICAgIkNhcGFiaWxpdHkifSwKKyAgICB7IDB4MDUsICAgICAgICAgICAgICJWZXJzaW9uIFN0cmluZyJ9LAorICAgIHsgMHgwNiwgICAgICAgICAgICAgIlBsYXRmb3JtIn0sCisgICAgeyAweDA3LCAgICAgICAgICAgICAiUHJlZml4ZXMifSwKKyAgICB7IDB4MDgsICAgICAgICAgICAgICJQcm90b2NvbC1IZWxsbyBvcHRpb24ifSwKKyAgICB7IDB4MDksICAgICAgICAgICAgICJWVFAgTWFuYWdlbWVudCBEb21haW4ifSwKKyAgICB7IDB4MGEsICAgICAgICAgICAgICJOYXRpdmUgVkxBTiBJRCJ9LAorICAgIHsgMHgwYiwgICAgICAgICAgICAgIkR1cGxleCJ9LAorICAgIHsgMHgwZSwgICAgICAgICAgICAgIkFUQS0xODYgVm9JUCBWTEFOIHJlcXVlc3QifSwKKyAgICB7IDB4MGYsICAgICAgICAgICAgICJBVEEtMTg2IFZvSVAgVkxBTiBhc3NpZ25tZW50In0sCisgICAgeyAweDEwLCAgICAgICAgICAgICAicG93ZXIgY29uc3VtcHRpb24ifSwKKyAgICB7IDB4MTEsICAgICAgICAgICAgICJNVFUifSwKKyAgICB7IDB4MTIsICAgICAgICAgICAgICJBVlZJRCB0cnVzdCBiaXRtYXAifSwKKyAgICB7IDB4MTMsICAgICAgICAgICAgICJBVlZJRCB1bnRydXN0ZWQgcG9ydHMgQ29TIn0sCisgICAgeyAweDE0LCAgICAgICAgICAgICAiU3lzdGVtIE5hbWUifSwKKyAgICB7IDB4MTUsICAgICAgICAgICAgICJTeXN0ZW0gT2JqZWN0IElEIChub3QgZGVjb2RlZCkifSwKKyAgICB7IDB4MTYsICAgICAgICAgICAgICJNYW5hZ2VtZW50IEFkZHJlc3NlcyJ9LAorICAgIHsgMHgxNywgICAgICAgICAgICAgIlBoeXNpY2FsIExvY2F0aW9uIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2RwX2NhcGFiaWxpdHlfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAgICAgICAgICAgICAiUm91dGVyIiB9LAorICAgIHsgMHgwMiwgICAgICAgICAgICAgIlRyYW5zcGFyZW50IEJyaWRnZSIgfSwKKyAgICB7IDB4MDQsICAgICAgICAgICAgICJTb3VyY2UgUm91dGUgQnJpZGdlIiB9LAorICAgIHsgMHgwOCwgICAgICAgICAgICAgIkwyIFN3aXRjaCIgfSwKKyAgICB7IDB4MTAsICAgICAgICAgICAgICJMMyBjYXBhYmxlIiB9LAorICAgIHsgMHgyMCwgICAgICAgICAgICAgIklHTVAgc25vb3BpbmciIH0sCisgICAgeyAweDQwLCAgICAgICAgICAgICAiTDEgY2FwYWJsZSIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGludCBjZHBfcHJpbnRfYWRkcihjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgY2RwX3ByaW50X3ByZWZpeGVzKGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2RwX2dldF9udW1iZXIoY29uc3QgdV9jaGFyICosIGludCk7CisKK3ZvaWQKK2NkcF9wcmludChjb25zdCB1X2NoYXIgKnBwdHIsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWludCB0eXBlLCBsZW4sIGksIGo7CisgICAgICAgIGNvbnN0IHVfY2hhciAqdHB0cjsKKworCWlmIChjYXBsZW4gPCBDRFBfSEVBREVSX0xFTikgeworCQkodm9pZClwcmludGYoIlt8Y2RwXSIpOworCQlyZXR1cm47CisJfQorCisgICAgICAgIHRwdHIgPSBwcHRyOyAvKiB0ZW1wb3JhcnkgcG9pbnRlciAqLworCisgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBDRFBfSEVBREVSX0xFTikpCisgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKwlwcmludGYoIkNEUHYldSwgdHRsOiAldXMiLCAqdHB0ciwgKih0cHRyKzEpKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiLCBjaGVja3N1bTogJXUgKHVudmVyaWZpZWQpLCBsZW5ndGggJXUiLCBFWFRSQUNUXzE2QklUUyh0cHRyKSwgbGVuZ3RoKTsKKwl0cHRyICs9IENEUF9IRUFERVJfTEVOOworCisJd2hpbGUgKHRwdHIgPCAocHB0citsZW5ndGgpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgNCkpIC8qIHJlYWQgb3V0IFR5cGUgYW5kIExlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCQl0eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisJCWxlbiAgPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpOyAvKiBvYmplY3QgbGVuZ3RoIGluY2x1ZGVzIHRoZSA0IGJ5dGVzIGhlYWRlciBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB0cHRyICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisKKwkJaWYgKCFUVEVTVDIoKnRwdHIsIGxlbikpCisJCQlnb3RvIHRydW5jOworCisgICAgICAgICAgICAgICAgaWYgKHZmbGFnIHx8IHR5cGUgPT0gMSkgeyAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgcHJpbnQgRGV2aWNlLUlEICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0JXMgKDB4JTAyeCksIGxlbmd0aDogJXUgYnl0ZSVzOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2RwX3Rsdl92YWx1ZXMsInVua25vd24gZmllbGQgdHlwZSIsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj4xID8gInMiIDogIiIpOyAvKiBwbHVyYWwgKi8KKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6IC8qIERldmljZS1JRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZmxhZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRGV2aWNlLUlEICclLipzJyIsIGxlbiwgdHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjogLyogQWRkcmVzcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNkcF9wcmludF9hZGRyKHRwdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOiAvKiBQb3J0LUlEICovCisJCQlwcmludGYoIiclLipzJyIsIGxlbiwgdHB0cik7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA0OiAvKiBDYXBhYmlsaXRpZXMgKi8KKwkJCXByaW50ZigiKDB4JTA4eCk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGNkcF9jYXBhYmlsaXR5X3ZhbHVlcywgIm5vbmUiLEVYVFJBQ1RfMzJCSVRTKHRwdHIpKSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA1OiAvKiBWZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsZW47aSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9ICoodHB0citpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKGopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDB4MGEpIC8qIGxldHMgcmV3b3JrIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBnZXQgYSBuaWNlIGlkZW50YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdCAgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA2OiAvKiBQbGF0Zm9ybSAqLworCQkJcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNzogLyogUHJlZml4ZXMgKi8KKwkJCWlmIChjZHBfcHJpbnRfcHJlZml4ZXModHB0ciwgbGVuKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDg6IC8qIFByb3RvY29sIEhlbGxvIE9wdGlvbiAtIG5vdCBkb2N1bWVudGVkICovCisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA5OiAvKiBWVFAgTWdtdCBEb21haW4gIC0gbm90IGRvY3VtZW50ZWQgKi8KKwkJCXByaW50ZigiJyUuKnMnIiwgbGVuLHRwdHIpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwYTogLyogTmF0aXZlIFZMQU4gSUQgLSBub3QgZG9jdW1lbnRlZCAqLworCQkJcHJpbnRmKCIlZCIsRVhUUkFDVF8xNkJJVFModHB0cikpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwYjogLyogRHVwbGV4IC0gbm90IGRvY3VtZW50ZWQgKi8KKwkJCXByaW50ZigiJXMiLCAqKHRwdHIpID8gImZ1bGwiOiAiaGFsZiIpOworCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLyogaHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvdm9pY2UvYXRhL2F0YXJuLzE4NnJuMjFtLmh0bQorICAgICAgICAgICAgICAgICAgICAgKiBwbHVzIG1vcmUgZGV0YWlscyBmcm9tIG90aGVyIHNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwZTogLyogQVRBLTE4NiBWb0lQIFZMQU4gcmVxdWVzdCAtIGluY29tcGxldGUgZG9jLiAqLworCQkJcHJpbnRmKCJhcHAgJWQsIHZsYW4gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0ciksIEVYVFJBQ1RfMTZCSVRTKHRwdHIrMSkpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxMDogLyogQVRBLTE4NiBWb0lQIFZMQU4gYXNzaWdubWVudCAtIGluY29tcGxldGUgZG9jLiAqLworCQkJcHJpbnRmKCIlMS4yZlciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkcF9nZXRfbnVtYmVyKHRwdHIsIGxlbikvMTAwMC4wICk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDExOiAvKiBNVFUgLSBub3QgZG9jdW1lbnRlZCAqLworCQkJcHJpbnRmKCIldSBieXRlcyIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTI6IC8qIEFWVklEIHRydXN0IGJpdG1hcCAtIG5vdCBkb2N1bWVudGVkICovCisJCQlwcmludGYoIjB4JTAyeCIsICoodHB0cikgKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTM6IC8qIEFWVklEIHVudHJ1c3RlZCBwb3J0IENvUyAtIG5vdCBkb2N1bWVudGVkICovCisJCQlwcmludGYoIjB4JTAyeCIsICoodHB0cikpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNDogLyogU3lzdGVtIE5hbWUgLSBub3QgZG9jdW1lbnRlZCAqLworCQkJcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNjogLyogU3lzdGVtIE9iamVjdCBJRCAtIG5vdCBkb2N1bWVudGVkICovCisJCQlpZiAoY2RwX3ByaW50X2FkZHIodHB0ciwgbGVuKSA8IDApCisJCQkJZ290byB0cnVuYzsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTc6IC8qIFBoeXNpY2FsIExvY2F0aW9uIC0gbm90IGRvY3VtZW50ZWQgKi8KKwkJCXByaW50ZigiMHglMDJ4LyUuKnMiLCAqKHRwdHIpLCBsZW4gLSAxLCB0cHRyICsgMSApOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgIixsZW4pOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisJCS8qIGF2b2lkIGluZmluaXRlIGxvb3AgKi8KKwkJaWYgKGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCXRwdHIgPSB0cHRyK2xlbjsKKwl9CisgICAgICAgIGlmICh2ZmxhZyA8IDEpCisgICAgICAgICAgICBwcmludGYoIiwgbGVuZ3RoICV1IixjYXBsZW4pOworCisJcmV0dXJuOwordHJ1bmM6CisJcHJpbnRmKCJbfGNkcF0iKTsKK30KKworLyoKKyAqIFByb3RvY29sIHR5cGUgdmFsdWVzLgorICoKKyAqIFBUX05MUElEIG1lYW5zIHRoYXQgdGhlIHByb3RvY29sIHR5cGUgZmllbGQgY29udGFpbnMgYW4gT1NJIE5MUElELgorICoKKyAqIFBUX0lFRUVfODAyXzIgbWVhbnMgdGhhdCB0aGUgcHJvdG9jb2wgdHlwZSBmaWVsZCBjb250YWlucyBhbiBJRUVFIDgwMi4yCisgKiBMTEMgaGVhZGVyIHRoYXQgc3BlY2lmaWVzIHRoYXQgdGhlIHBheWxvYWQgaXMgZm9yIHRoYXQgcHJvdG9jb2wuCisgKi8KKyNkZWZpbmUgUFRfTkxQSUQJCTEJLyogT1NJIE5MUElEICovCisjZGVmaW5lIFBUX0lFRUVfODAyXzIJCTIJLyogSUVFRSA4MDIuMiBMTEMgaGVhZGVyICovCisKK3N0YXRpYyBpbnQKK2NkcF9wcmludF9hZGRyKGNvbnN0IHVfY2hhciAqIHAsIGludCBsKQoreworCWludCBwdCwgcGwsIGFsLCBudW07CisJY29uc3QgdV9jaGFyICplbmRwID0gcCArIGw7CisjaWZkZWYgSU5FVDYKKwlzdGF0aWMgdV9jaGFyIHByb3RfaXB2NltdID0geworCQkweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg2LCAweGRkCisJfTsKKyNlbmRpZgorCisJVENIRUNLMigqcCwgMik7CisJbnVtID0gRVhUUkFDVF8zMkJJVFMocCk7CisJcCArPSA0OworCisJd2hpbGUgKHAgPCBlbmRwICYmIG51bSA+PSAwKSB7CisJCVRDSEVDSzIoKnAsIDIpOworCQlpZiAocCArIDIgPiBlbmRwKQorCQkJZ290byB0cnVuYzsKKwkJcHQgPSBwWzBdOwkJLyogdHlwZSBvZiAicHJvdG9jb2wiIGZpZWxkICovCisJCXBsID0gcFsxXTsJCS8qIGxlbmd0aCBvZiAicHJvdG9jb2wiIGZpZWxkICovCisJCXAgKz0gMjsKKworCQlUQ0hFQ0syKHBbcGxdLCAyKTsKKwkJaWYgKHAgKyBwbCArIDIgPiBlbmRwKQorCQkJZ290byB0cnVuYzsKKwkJYWwgPSBFWFRSQUNUXzE2QklUUygmcFtwbF0pOwkvKiBhZGRyZXNzIGxlbmd0aCAqLworCisJCWlmIChwdCA9PSBQVF9OTFBJRCAmJiBwbCA9PSAxICYmICpwID09IE5MUElEX0lQICYmIGFsID09IDQpIHsKKwkJCS8qCisJCQkgKiBJUHY0OiBwcm90b2NvbCB0eXBlID0gTkxQSUQsIHByb3RvY29sIGxlbmd0aCA9IDEKKwkJCSAqICgxLWJ5dGUgTkxQSUQpLCBwcm90b2NvbCA9IDB4Y2MgKE5MUElEIGZvciBJUHY0KSwKKwkJCSAqIGFkZHJlc3MgbGVuZ3RoID0gNAorCQkJICovCisJCQlwICs9IDM7CisKKwkJCVRDSEVDSzIoKnAsIDQpOworCQkJaWYgKHAgKyA0ID4gZW5kcCkKKwkJCQlnb3RvIHRydW5jOworCQkJcHJpbnRmKCJJUHY0ICgldSkgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHApKTsKKwkJCXAgKz0gNDsKKwkJfQorI2lmZGVmIElORVQ2CisJCWVsc2UgaWYgKHB0ID09IFBUX0lFRUVfODAyXzIgJiYgcGwgPT0gOCAmJgorCQkgICAgbWVtY21wKHAsIHByb3RfaXB2NiwgOCkgPT0gMCAmJiBhbCA9PSAxNikgeworCQkJLyoKKwkJCSAqIElQdjY6IHByb3RvY29sIHR5cGUgPSBJRUVFIDgwMi4yIGhlYWRlciwKKwkJCSAqIHByb3RvY29sIGxlbmd0aCA9IDggKHNpemUgb2YgTExDK1NOQVAgaGVhZGVyKSwKKwkJCSAqIHByb3RvY29sID0gTExDK1NOQVAgaGVhZGVyIHdpdGggdGhlIElQdjYKKwkJCSAqIEV0aGVydHlwZSwgYWRkcmVzcyBsZW5ndGggPSAxNgorCQkJICovCisJCQlwICs9IDEwOworCQkJVENIRUNLMigqcCwgYWwpOworCQkJaWYgKHAgKyBhbCA+IGVuZHApCisJCQkJZ290byB0cnVuYzsKKworCQkJcHJpbnRmKCJJUHY2ICgldSkgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhwKSk7CisJCQlwICs9IGFsOworCQl9CisjZW5kaWYKKwkJZWxzZSB7CisJCQkvKgorCQkJICogR2VuZXJpYyBjYXNlOiBqdXN0IHByaW50IHJhdyBkYXRhCisJCQkgKi8KKwkJCVRDSEVDSzIoKnAsIHBsKTsKKwkJCWlmIChwICsgcGwgPiBlbmRwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlwcmludGYoInB0PTB4JTAyeCwgcGw9JWQsIHBiPSIsICoocCAtIDIpLCBwbCk7CisJCQl3aGlsZSAocGwtLSA+IDApCisJCQkJcHJpbnRmKCIgJTAyeCIsICpwKyspOworCQkJVENIRUNLMigqcCwgMik7CisJCQlpZiAocCArIDIgPiBlbmRwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlhbCA9ICgqcCA8PCA4KSArICoocCArIDEpOworCQkJcHJpbnRmKCIsIGFsPSVkLCBhPSIsIGFsKTsKKwkJCXAgKz0gMjsKKwkJCVRDSEVDSzIoKnAsIGFsKTsKKwkJCWlmIChwICsgYWwgPiBlbmRwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQl3aGlsZSAoYWwtLSA+IDApCisJCQkJcHJpbnRmKCIgJTAyeCIsICpwKyspOworCQl9CisJCW51bS0tOworCQlpZiAobnVtKQorCQkJcHJpbnRmKCIgIik7CisJfQorCisJcmV0dXJuIDA7CisKK3RydW5jOgorCXJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50CitjZHBfcHJpbnRfcHJlZml4ZXMoY29uc3QgdV9jaGFyICogcCwgaW50IGwpCit7CisJaWYgKGwgJSA1KQorCQlnb3RvIHRydW5jOworCisJcHJpbnRmKCIgSVB2NCBQcmVmaXhlcyAoJWQpOiIsIGwgLyA1KTsKKworCXdoaWxlIChsID4gMCkgeworCQlwcmludGYoIiAldS4ldS4ldS4ldS8ldSIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0pOworCQlsIC09IDU7CisJCXAgKz0gNTsKKwl9CisKKwlyZXR1cm4gMDsKKwordHJ1bmM6CisJcmV0dXJuIC0xOworfQorCisvKiByZWFkIGluIGEgPG4+LWJ5dGUgbnVtYmVyLCBNU0IgZmlyc3QKKyAqIChvZiBjb3Vyc2UgdGhpcyBjYW4gaGFuZGxlIG1heCBzaXplb2YobG9uZykpCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNkcF9nZXRfbnVtYmVyKGNvbnN0IHVfY2hhciAqIHAsIGludCBsKQoreworICAgIHVuc2lnbmVkIGxvbmcgcmVzPTA7CisgICAgd2hpbGUoIGw+MCApCisgICAgeworCXJlcyA9IChyZXM8PDgpICsgKnA7CisJcCsrOyBsLS07CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9wcmludC1jaGRsYy5jIGIvcHJpbnQtY2hkbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY1NGY1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtY2hkbGMuYwpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWNoZGxjLmMsdiAxLjMyLjIuMTEgMjAwNS8xMS8yOSAwODo1NzoxMCBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAiY2hkbGMuaCIKKworc3RhdGljIHZvaWQgY2hkbGNfc2xhcnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKKworY29uc3Qgc3RydWN0IHRvayBjaGRsY19jYXN0X3ZhbHVlc1tdID0geyAKKyAgICB7IENIRExDX1VOSUNBU1QsICJ1bmljYXN0IiB9LAorICAgIHsgQ0hETENfQkNBU1QsICJiY2FzdCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisKKy8qIFN0YW5kYXJkIENIRExDIHByaW50ZXIgKi8KK3VfaW50CitjaGRsY19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlyZWdpc3RlciB1X2ludCBsZW5ndGggPSBoLT5sZW47CisJcmVnaXN0ZXIgdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCisJaWYgKGNhcGxlbiA8IENIRExDX0hEUkxFTikgeworCQlwcmludGYoIlt8Y2hkbGNdIik7CisJCXJldHVybiAoY2FwbGVuKTsKKwl9CisgICAgICAgIHJldHVybiAoY2hkbGNfcHJpbnQocCxsZW5ndGgpKTsKK30KKwordV9pbnQKK2NoZGxjX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoKSB7CisJdV9pbnQgcHJvdG87CisKKwlwcm90byA9IEVYVFJBQ1RfMTZCSVRTKCZwWzJdKTsKKwlpZiAoZWZsYWcpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzLCBldGhlcnR5cGUgJXMgKDB4JTA0eCksIGxlbmd0aCAldTogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihjaGRsY19jYXN0X3ZhbHVlcywgIjB4JTAyeCIsIHBbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsICJVbmtub3duIiwgcHJvdG8pLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKwl9CisKKwlsZW5ndGggLT0gQ0hETENfSERSTEVOOworCXAgKz0gQ0hETENfSERSTEVOOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgRVRIRVJUWVBFX0lQOgorCQlpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCWlwNl9wcmludChwLCBsZW5ndGgpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgQ0hETENfVFlQRV9TTEFSUDoKKwkJY2hkbGNfc2xhcnBfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjaWYgMAorCWNhc2UgQ0hETENfVFlQRV9DRFA6CisJCWNoZGxjX2NkcF9wcmludChwLCBsZW5ndGgpOworCQlicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIEVUSEVSVFlQRV9NUExTOgorICAgICAgICBjYXNlIEVUSEVSVFlQRV9NUExTX01VTFRJOgorICAgICAgICAgICAgICAgIG1wbHNfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgRVRIRVJUWVBFX0lTTzoKKyAgICAgICAgICAgICAgICAvKiBpcyB0aGUgZnVkZ2UgYnl0ZSBzZXQgPyBsZXRzIHZlcmlmeSBieSBzcG90dGluZyBJU08gaGVhZGVycyAqLworICAgICAgICAgICAgICAgIGlmICgqKHArMSkgPT0gMHg4MSB8fAorICAgICAgICAgICAgICAgICAgICAqKHArMSkgPT0gMHg4MiB8fAorICAgICAgICAgICAgICAgICAgICAqKHArMSkgPT0gMHg4MykKKyAgICAgICAgICAgICAgICAgICAgaXNvY2xuc19wcmludChwKzEsIGxlbmd0aC0xLCBsZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpc29jbG5zX3ByaW50KHAsIGxlbmd0aCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmICghZWZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInVua25vd24gQ0hETEMgcHJvdG9jb2wgKDB4JTA0eCkiLCBwcm90byk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJfQorCisJcmV0dXJuIChDSERMQ19IRFJMRU4pOworfQorCisvKgorICogVGhlIGZpeGVkLWxlbmd0aCBwb3J0aW9uIG9mIGEgU0xBUlAgcGFja2V0LgorICovCitzdHJ1Y3QgY2lzY29fc2xhcnAgeworCXVfaW50OF90IGNvZGVbNF07CisjZGVmaW5lIFNMQVJQX1JFUVVFU1QJMAorI2RlZmluZSBTTEFSUF9SRVBMWQkxCisjZGVmaW5lIFNMQVJQX0tFRVBBTElWRQkyCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgYWRkcls0XTsKKwkJCXVfaW50OF90IG1hc2tbNF07CisJCX0gYWRkcjsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IG15c2VxWzRdOworCQkJdV9pbnQ4X3QgeW91cnNlcVs0XTsKKwkJCXVfaW50OF90IHJlbFsyXTsKKwkJfSBrZWVwOworCX0gdW47Cit9OworCisjZGVmaW5lIFNMQVJQX01JTl9MRU4JMTQKKyNkZWZpbmUgU0xBUlBfTUFYX0xFTgkxOAorCitzdGF0aWMgdm9pZAorY2hkbGNfc2xhcnBfcHJpbnQoY29uc3QgdV9jaGFyICpjcCwgdV9pbnQgbGVuZ3RoKQoreworCWNvbnN0IHN0cnVjdCBjaXNjb19zbGFycCAqc2xhcnA7CisgICAgICAgIHVfaW50IHNlYyxtaW4saHJzLGRheXM7CisKKyAgICAgICAgcHJpbnRmKCJTTEFSUCAobGVuZ3RoOiAldSksICIsbGVuZ3RoKTsKKwlpZiAobGVuZ3RoIDwgU0xBUlBfTUlOX0xFTikKKwkJZ290byB0cnVuYzsKKworCXNsYXJwID0gKGNvbnN0IHN0cnVjdCBjaXNjb19zbGFycCAqKWNwOworCVRDSEVDSzIoKnNsYXJwLCBTTEFSUF9NSU5fTEVOKTsKKwlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKCZzbGFycC0+Y29kZSkpIHsKKwljYXNlIFNMQVJQX1JFUVVFU1Q6CisJCXByaW50ZigicmVxdWVzdCIpOworCQkvKgorCQkgKiBBdCBsZWFzdCBhY2NvcmRpbmcgdG8gV2lsbGlhbSAiQ2hvcHMiIFdlc3RmaWVsZCdzCisJCSAqIG1lc3NhZ2UgaW4KKwkJICoKKwkJICoJaHR0cDovL3d3dy5uZXRoZWxwLm5vL25ldC9jaXNjby1oZGxjLnR4dAorCQkgKgorCQkgKiB0aGUgYWRkcmVzcyBhbmQgbWFzayBhcmVuJ3QgdXNlZCBpbiByZXF1ZXN0cyAtCisJCSAqIHRoZXkncmUganVzdCB6ZXJvLgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBTTEFSUF9SRVBMWToKKwkJcHJpbnRmKCJyZXBseSAlcy8lcyIsCisJCQlpcGFkZHJfc3RyaW5nKCZzbGFycC0+dW4uYWRkci5hZGRyKSwKKwkJCWlwYWRkcl9zdHJpbmcoJnNsYXJwLT51bi5hZGRyLm1hc2spKTsKKwkJYnJlYWs7CisJY2FzZSBTTEFSUF9LRUVQQUxJVkU6CisJCXByaW50Zigia2VlcGFsaXZlOiBtaW5lc2Vlbj0weCUwOHgsIHlvdXJzZWVuPTB4JTA4eCwgcmVsaWFiaWxpdHk9MHglMDR4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNsYXJwLT51bi5rZWVwLm15c2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNsYXJwLT51bi5rZWVwLnlvdXJzZXEpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmc2xhcnAtPnVuLmtlZXAucmVsKSk7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IFNMQVJQX01BWF9MRU4pIHsgLyogdXB0aW1lLXN0YW1wIGlzIG9wdGlvbmFsICovCisgICAgICAgICAgICAgICAgICAgICAgICBjcCArPSBTTEFSUF9NSU5fTEVOOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUVEVTVDIoKmNwLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYyA9IEVYVFJBQ1RfMzJCSVRTKGNwKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBzZWMgLyA2MDsgc2VjIC09IG1pbiAqIDYwOworICAgICAgICAgICAgICAgICAgICAgICAgaHJzID0gbWluIC8gNjA7IG1pbiAtPSBocnMgKiA2MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRheXMgPSBocnMgLyAyNDsgaHJzIC09IGRheXMgKiAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBsaW5rIHVwdGltZT0ldWQldWgldW0ldXMiLGRheXMsaHJzLG1pbixzZWMpOworICAgICAgICAgICAgICAgIH0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIweCUwMnggdW5rbm93biIsIEVYVFJBQ1RfMzJCSVRTKCZzbGFycC0+Y29kZSkpOworICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoY3ArNCwiXG5cdCIsbGVuZ3RoLTQpOworCQlicmVhazsKKwl9CisKKwlpZiAoU0xBUlBfTUFYX0xFTiA8IGxlbmd0aCAmJiB2ZmxhZykKKwkJcHJpbnRmKCIsICh0cmFpbGluZyBqdW5rOiAlZCBieXRlcykiLCBsZW5ndGggLSBTTEFSUF9NQVhfTEVOKTsKKyAgICAgICAgaWYgKHZmbGFnID4gMSkKKyAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShjcCs0LCJcblx0IixsZW5ndGgtNCk7CisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIlt8c2xhcnBdIik7Cit9CisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LWNpcC5jIGIvcHJpbnQtY2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0YjcwMAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWNpcC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogTWFya28gS2lpc2tpbGEgY2FybmlsQGNzLnR1dC5maQorICoKKyAqIFRhbXBlcmUgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5IC0gVGVsZWNvbW11bmljYXRpb25zIExhYm9yYXRvcnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcworICogcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLAorICogZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcworICogYWNrbm93bGVkZ2VkIGluIGFueSBwdWJsaWNhdGlvbnMgcmVzdWx0aW5nIGZyb20gdXNpbmcKKyAqIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBUVVQgQUxMT1dTIEZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTICJBUyBJUyIKKyAqIENPTkRJVElPTiBBTkQgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWNpcC5jLHYgMS4yNS4yLjEgMjAwNS8wNy8wNyAwMToyNDozNCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorI2luY2x1ZGUgImV0aGVyLmgiCisKKyNkZWZpbmUgUkZDMTQ4M0xMQ19MRU4JOAorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZmNsbGNbXSA9IHsKKwkweGFhLAkvKiBEU0FQOiBub24tSVNPICovCisJMHhhYSwJLyogU1NBUDogbm9uLUlTTyAqLworCTB4MDMsCS8qIEN0cmw6IFVubnVtYmVyZWQgSW5mb3JtYXRpb24gQ29tbWFuZCBQRFUgKi8KKwkweDAwLAkvKiBPVUk6IEV0aGVyVHlwZSAqLworCTB4MDAsCisJMHgwMCB9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2NpcF9wcmludChpbnQgbGVuZ3RoKQoreworCS8qCisJICogVGhlcmUgaXMgbm8gTUFDLWxheWVyIGhlYWRlciwgc28ganVzdCBwcmludCB0aGUgbGVuZ3RoLgorCSAqLworCXByaW50ZigiJWQ6ICIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBMTEMvU05BUCBvciByYXcgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqLwordV9pbnQKK2NpcF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVydHlwZTsKKworCWlmIChtZW1jbXAocmZjbGxjLCBwLCBzaXplb2YocmZjbGxjKSk9PTAgJiYgY2FwbGVuIDwgUkZDMTQ4M0xMQ19MRU4pIHsKKwkJcHJpbnRmKCJbfGNpcF0iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoZWZsYWcpCisJCWNpcF9wcmludChsZW5ndGgpOworCisJaWYgKG1lbWNtcChyZmNsbGMsIHAsIHNpemVvZihyZmNsbGMpKSA9PSAwKSB7CisJCS8qCisJCSAqIExMQyBoZWFkZXIgaXMgcHJlc2VudC4gIFRyeSB0byBwcmludCBpdCAmIGhpZ2hlciBsYXllcnMuCisJCSAqLworCQlpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBOVUxMLCBOVUxMLAorCQkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApIHsKKwkJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCQlpZiAoIWVmbGFnKQorCQkJCWNpcF9wcmludChsZW5ndGgpOworCQkJaWYgKGV4dHJhY3RlZF9ldGhlcnR5cGUpIHsKKwkJCQlwcmludGYoIihMTEMgJXMpICIsCisJCQkgICAgICAgZXRoZXJwcm90b19zdHJpbmcoaHRvbnMoZXh0cmFjdGVkX2V0aGVydHlwZSkpKTsKKwkJCX0KKwkJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBMTEMgaGVhZGVyIGlzIGFic2VudDsgdHJlYXQgaXQgYXMganVzdCBJUC4KKwkJICovCisJCWlwX3ByaW50KGduZG8sIHAsIGxlbmd0aCk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtY25mcC5jIGIvcHJpbnQtY25mcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGZiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1jbmZwLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8qCSRPcGVuQlNEOiBwcmludC1jbmZwLmMsdiAxLjIgMTk5OC8wNi8yNSAyMDoyNjo1OSBtaWNrZXkgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OCBNaWNoYWVsIFNoYWxheWVmZgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBNaWNoYWVsIFNoYWxheWVmZi4KKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIENpc2NvIE5ldEZsb3cgcHJvdG9jb2wgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtY25mcC5jLHYgMS4xNi4yLjEgMjAwNS8wNC8yMCAyMDo1MzozOSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgInRjcC5oIgorI2luY2x1ZGUgImlwcHJvdG8uaCIKKworc3RydWN0IG5maGRyIHsKKwl1X2ludDMyX3QJdmVyX2NudDsJLyogdmVyc2lvbiBbMTVdLCBhbmQgIyBvZiByZWNvcmRzICovCisJdV9pbnQzMl90CW1zeXNfdXB0aW1lOworCXVfaW50MzJfdAl1dGNfc2VjOworCXVfaW50MzJfdAl1dGNfbnNlYzsKKwl1X2ludDMyX3QJc2VxdWVuY2U7CS8qIHY1IGZsb3cgc2VxdWVuY2UgbnVtYmVyICovCisJdV9pbnQzMl90CXJlc2VydmVkOwkvKiB2NSBvbmx5ICovCit9OworCitzdHJ1Y3QgbmZyZWMgeworCXN0cnVjdCBpbl9hZGRyCXNyY19pbmE7CisJc3RydWN0IGluX2FkZHIJZHN0X2luYTsKKwlzdHJ1Y3QgaW5fYWRkcgluaG9wX2luYTsKKwl1X2ludDMyX3QJaWZhY2VzOwkJLyogc3JjLGRzdCBpZmFjZXMgKi8KKwl1X2ludDMyX3QJcGFja2V0czsKKwl1X2ludDMyX3QJb2N0ZXRzOworCXVfaW50MzJfdAlzdGFydF90aW1lOwkvKiBzeXNfdXB0aW1lIHZhbHVlICovCisJdV9pbnQzMl90CWxhc3RfdGltZTsJLyogc3lzX3VwdGltZSB2YWx1ZSAqLworCXVfaW50MzJfdAlwb3J0czsJCS8qIHNyYyxkc3QgcG9ydHMgKi8KKwl1X2ludDMyX3QJcHJvdG9fdG9zOwkvKiBwcm90bywgdG9zLCBwYWQsIGZsYWdzKHY1KSAqLworCXVfaW50MzJfdAlhc3NlczsJCS8qIHYxOiBmbGFnczsgdjU6IHNyYyxkc3QgQVMgKi8KKwl1X2ludDMyX3QJbWFza3M7CQkvKiBzcmMsZHN0IGFkZHIgcHJlZml4OyB2NjogZW5jYXBzICovCisJc3RydWN0IGluX2FkZHIJcGVlcl9uZXh0aG9wOwkvKiB2NjogSVAgYWRkcmVzcyBvZiB0aGUgbmV4dGhvcCB3aXRoaW4gdGhlIHBlZXIgKEZJQikqLworfTsKKwordm9pZAorY25mcF9wcmludChjb25zdCB1X2NoYXIgKmNwLCBjb25zdCB1X2NoYXIgKmJwIF9VXykKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbmZoZHIgKm5oOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBuZnJlYyAqbnI7CisJc3RydWN0IHByb3RvZW50ICpwZW50OworCWludCBucmVjcywgdmVyOworI2lmIDAKKwl0aW1lX3QgdDsKKyNlbmRpZgorCisJbmggPSAoY29uc3Qgc3RydWN0IG5maGRyICopY3A7CisKKwlpZiAoKGNvbnN0IHVfY2hhciAqKShuaCArIDEpID4gc25hcGVuZCkKKwkJcmV0dXJuOworCisJbnJlY3MgPSBFWFRSQUNUXzMyQklUUygmbmgtPnZlcl9jbnQpICYgMHhmZmZmOworCXZlciA9IChFWFRSQUNUXzMyQklUUygmbmgtPnZlcl9jbnQpICYgMHhmZmZmMDAwMCkgPj4gMTY7CisjaWYgMAorCS8qCisJICogVGhpcyBpcyBzZWNvbmRzIHNpbmNlIHRoZSBVTipYIGVwb2NoLCBhbmQgaXMgZm9sbG93ZWQgYnkKKwkgKiBuYW5vc2Vjb25kcy4gIFhYWCAtIGZvcm1hdCBpdCwgcmF0aGVyIHRoYW4ganVzdCBkdW1waW5nIHRoZQorCSAqIHJhdyBzZWNvbmRzLXNpbmNlLXRoZS1FcG9jaC4KKwkgKi8KKwl0ID0gRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfc2VjKTsKKyNlbmRpZgorCisJcHJpbnRmKCJOZXRGbG93IHYleCwgJXUuJTAzdSB1cHRpbWUsICV1LiUwOXUsICIsIHZlciwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT5tc3lzX3VwdGltZSkvMTAwMCwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT5tc3lzX3VwdGltZSklMTAwMCwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfc2VjKSwgRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfbnNlYykpOworCisJaWYgKHZlciA9PSA1IHx8IHZlciA9PSA2KSB7CisJCXByaW50ZigiIyV1LCAiLCBFWFRSQUNUXzMyQklUUygmbmgtPnNlcXVlbmNlKSk7CisJCW5yID0gKGNvbnN0IHN0cnVjdCBuZnJlYyAqKSZuaFsxXTsKKwkJc25hcGxlbiAtPSAyNDsKKwl9IGVsc2UgeworCQluciA9IChjb25zdCBzdHJ1Y3QgbmZyZWMgKikmbmgtPnNlcXVlbmNlOworCQlzbmFwbGVuIC09IDE2OworCX0KKworCXByaW50ZigiJTJ1IHJlY3MiLCBucmVjcyk7CisKKwlmb3IgKDsgbnJlY3MtLSAmJiAoY29uc3QgdV9jaGFyICopKG5yICsgMSkgPD0gc25hcGVuZDsgbnIrKykgeworCQljaGFyIGJ1ZlsyMF07CisJCWNoYXIgYXNidWZbMjBdOworCisJCXByaW50ZigiXG4gIHN0YXJ0ZWQgJXUuJTAzdSwgbGFzdCAldS4lMDN1IiwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+c3RhcnRfdGltZSkvMTAwMCwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+c3RhcnRfdGltZSklMTAwMCwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+bGFzdF90aW1lKS8xMDAwLAorCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5yLT5sYXN0X3RpbWUpJTEwMDApOworCisJCWFzYnVmWzBdID0gYnVmWzBdID0gJ1wwJzsKKwkJaWYgKHZlciA9PSA1IHx8IHZlciA9PSA2KSB7CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiLyV1IiwKKwkJCQkgKEVYVFJBQ1RfMzJCSVRTKCZuci0+bWFza3MpID4+IDI0KSAmIDB4ZmYpOworCQkJc25wcmludGYoYXNidWYsIHNpemVvZihhc2J1ZiksICI6JXUiLAorCQkJCSAoRVhUUkFDVF8zMkJJVFMoJm5yLT5hc3NlcykgPj4gMTYpICYgMHhmZmZmKTsKKwkJfQorCQlwcmludGYoIlxuICAgICVzJXMlczoldSAiLCBpbnRvYShuci0+c3JjX2luYS5zX2FkZHIpLCBidWYsIGFzYnVmLAorCQkJRVhUUkFDVF8zMkJJVFMoJm5yLT5wb3J0cykgPj4gMTYpOworCisJCWlmICh2ZXIgPT0gNSB8fCB2ZXIgPT02KSB7CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiLyVkIiwKKwkJCQkgKEVYVFJBQ1RfMzJCSVRTKCZuci0+bWFza3MpID4+IDE2KSAmIDB4ZmYpOworCQkJc25wcmludGYoYXNidWYsIHNpemVvZihhc2J1ZiksICI6JXUiLAorCQkJCSBFWFRSQUNUXzMyQklUUygmbnItPmFzc2VzKSAmIDB4ZmZmZik7CisJCX0KKwkJcHJpbnRmKCI+ICVzJXMlczoldSAiLCBpbnRvYShuci0+ZHN0X2luYS5zX2FkZHIpLCBidWYsIGFzYnVmLAorCQkJRVhUUkFDVF8zMkJJVFMoJm5yLT5wb3J0cykgJiAweGZmZmYpOworCisJCXByaW50ZigiPj4gJXNcbiAgICAiLCBpbnRvYShuci0+bmhvcF9pbmEuc19hZGRyKSk7CisKKwkJcGVudCA9IGdldHByb3RvYnludW1iZXIoKEVYVFJBQ1RfMzJCSVRTKCZuci0+cHJvdG9fdG9zKSA+PiA4KSAmIDB4ZmYpOworCQlpZiAoIXBlbnQgfHwgbmZsYWcpCisJCQlwcmludGYoIiV1ICIsCisJCQkgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZuci0+cHJvdG9fdG9zKSA+PiA4KSAmIDB4ZmYpOworCQllbHNlCisJCQlwcmludGYoIiVzICIsIHBlbnQtPnBfbmFtZSk7CisKKwkJLyogdGNwIGZsYWdzIGZvciB0Y3Agb25seSAqLworCQlpZiAocGVudCAmJiBwZW50LT5wX3Byb3RvID09IElQUFJPVE9fVENQKSB7CisJCQlpbnQgZmxhZ3M7CisJCQlpZiAodmVyID09IDEpCisJCQkJZmxhZ3MgPSAoRVhUUkFDVF8zMkJJVFMoJm5yLT5hc3NlcykgPj4gMjQpICYgMHhmZjsKKwkJCWVsc2UKKwkJCQlmbGFncyA9IChFWFRSQUNUXzMyQklUUygmbnItPnByb3RvX3RvcykgPj4gMTYpICYgMHhmZjsKKwkJCWlmIChmbGFncyAmIFRIX0ZJTikJcHV0Y2hhcignRicpOworCQkJaWYgKGZsYWdzICYgVEhfU1lOKQlwdXRjaGFyKCdTJyk7CisJCQlpZiAoZmxhZ3MgJiBUSF9SU1QpCXB1dGNoYXIoJ1InKTsKKwkJCWlmIChmbGFncyAmIFRIX1BVU0gpCXB1dGNoYXIoJ1AnKTsKKwkJCWlmIChmbGFncyAmIFRIX0FDSykJcHV0Y2hhcignQScpOworCQkJaWYgKGZsYWdzICYgVEhfVVJHKQlwdXRjaGFyKCdVJyk7CisJCQlpZiAoZmxhZ3MpCisJCQkJcHV0Y2hhcignICcpOworCQl9CisKKwkJYnVmWzBdPSdcMCc7CisJCWlmICh2ZXIgPT0gNikgeworCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIigldTw+JXUgZW5jYXBzKSIsCisJCQkJIChFWFRSQUNUXzMyQklUUygmbnItPm1hc2tzKSA+PiA4KSAmIDB4ZmYsCisJCQkJIChFWFRSQUNUXzMyQklUUygmbnItPm1hc2tzKSkgJiAweGZmKTsKKwkJfQorCQlwcmludGYoInRvcyAldSwgJXUgKCV1IG9jdGV0cykgJXMiLAorCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5yLT5wcm90b190b3MpICYgMHhmZiwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+cGFja2V0cyksCisJCSAgICAgICBFWFRSQUNUXzMyQklUUygmbnItPm9jdGV0cyksIGJ1Zik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZGNjcC5jIGIvcHJpbnQtZGNjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YmZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1kY2NwLmMKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyAyMDA0CisgKiBDb3B5cmlnaHQgKEMpIElhbiBNY0RvbmFsZCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIFlvc2hpZnVtaSBOaXNoaWRhIDIwMDUKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0Y3BkdW1wIG9yIHRoZSBHTlUgR1BMIHZlcnNpb24gMgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWRjY3AuYyx2IDEuMS4yLjYgMjAwNi8wMi8xOSAwNTowODo0NCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlICJkY2NwLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIJCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KKyNpbmNsdWRlICJpcC5oIgorI2lmZGVmIElORVQ2CisjaW5jbHVkZSAiaXA2LmgiCisjZW5kaWYKKyNpbmNsdWRlICJpcHByb3RvLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpkY2NwX3Jlc2V0X2NvZGVzW10gPSB7CisJInVuc3BlY2lmaWVkIiwKKwkiY2xvc2VkIiwKKwkiYWJvcnRlZCIsCisJIm5vX2Nvbm5lY3Rpb24iLAorCSJwYWNrZXRfZXJyb3IiLAorCSJvcHRpb25fZXJyb3IiLAorCSJtYW5kYXRvcnlfZXJyb3IiLAorCSJjb25uZWN0aW9uX3JlZnVzZWQiLAorCSJiYWRfc2VydmljZV9jb2RlIiwKKwkidG9vX2J1c3kiLAorCSJiYWRfaW5pdF9jb29raWUiLAorCSJhZ2dyZXNzaW9uX3BlbmFsdHkiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRjY3BfZmVhdHVyZV9udW1zW10gPSB7CisJInJlc2VydmVkIiwgCisJImNjaWQiLAorCSJhbGxvd19zaG9ydF9zZXFubyIsCisJInNlcXVlbmNlX3dpbmRvdyIsCisJImVjbl9pbmNhcGFibGUiLCAKKwkiYWNrX3JhdGlvIiwgICAgIAorCSJzZW5kX2Fja192ZWN0b3IiLAorCSJzZW5kX25kcF9jb3VudCIsIAorCSJtaW5pbXVtIGNoZWNrc3VtIGNvdmVyYWdlIiwgCisJImNoZWNrIGRhdGEgY2hlY2tzdW0iLAorfTsKKworc3RhdGljIGludCBkY2NwX2Nrc3VtKGNvbnN0IHN0cnVjdCBpcCAqaXAsCisJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgdV9pbnQgbGVuKQoreworCXVuaW9uIHBodSB7CisJCXN0cnVjdCBwaGRyIHsKKwkJCXVfaW50MzJfdCBzcmM7CisJCQl1X2ludDMyX3QgZHN0OworCQkJdV9jaGFyIG1iejsKKwkJCXVfY2hhciBwcm90bzsKKwkJCXVfaW50MTZfdCBsZW47CisJCX0gcGg7CisJCXVfaW50MTZfdCBwYVs2XTsKKwl9IHBodTsKKwljb25zdCB1X2ludDE2X3QgKnNwOworCisJLyogcHNldWRvLWhlYWRlci4uICovCisJcGh1LnBoLm1ieiA9IDA7CisJcGh1LnBoLmxlbiA9IGh0b25zKGxlbik7CisJcGh1LnBoLnByb3RvID0gSVBQUk9UT19EQ0NQOworCW1lbWNweSgmcGh1LnBoLnNyYywgJmlwLT5pcF9zcmMuc19hZGRyLCBzaXplb2YodV9pbnQzMl90KSk7CisJaWYgKElQX0hMKGlwKSA9PSA1KQorCQltZW1jcHkoJnBodS5waC5kc3QsICZpcC0+aXBfZHN0LnNfYWRkciwgc2l6ZW9mKHVfaW50MzJfdCkpOworCWVsc2UKKwkJcGh1LnBoLmRzdCA9IGlwX2ZpbmRkc3QoaXApOworCisJc3AgPSAmcGh1LnBhWzBdOworCXJldHVybiBpbl9ja3N1bSgodV9zaG9ydCAqKWRoLCBsZW4sIHNwWzBdK3NwWzFdK3NwWzJdK3NwWzNdK3NwWzRdK3NwWzVdKTsKK30KKworI2lmZGVmIElORVQ2CitzdGF0aWMgaW50IGRjY3A2X2Nrc3VtKGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDYsIGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIHVfaW50IGxlbikKK3sKKwlzaXplX3QgaTsKKwljb25zdCB1X2ludDE2X3QgKnNwOworCXVfaW50MzJfdCBzdW07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGluNl9hZGRyIHBoX3NyYzsKKwkJCXN0cnVjdCBpbjZfYWRkciBwaF9kc3Q7CisJCQl1X2ludDMyX3QgICBwaF9sZW47CisJCQl1X2ludDhfdCAgICBwaF96ZXJvWzNdOworCQkJdV9pbnQ4X3QgICAgcGhfbnh0OworCQl9IHBoOworCQl1X2ludDE2X3QgcGFbMjBdOworCX0gcGh1OworCisJLyogcHNldWRvLWhlYWRlciAqLworCW1lbXNldCgmcGh1LCAwLCBzaXplb2YocGh1KSk7CisJcGh1LnBoLnBoX3NyYyA9IGlwNi0+aXA2X3NyYzsKKwlwaHUucGgucGhfZHN0ID0gaXA2LT5pcDZfZHN0OworCXBodS5waC5waF9sZW4gPSBodG9ubChsZW4pOworCXBodS5waC5waF9ueHQgPSBJUFBST1RPX0RDQ1A7CisKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocGh1LnBhKSAvIHNpemVvZihwaHUucGFbMF0pOyBpKyspCisJCXN1bSArPSBwaHUucGFbaV07CisKKwlzcCA9IChjb25zdCB1X2ludDE2X3QgKilkaDsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuICYgfjEpOyBpICs9IDIpCisJCXN1bSArPSAqc3ArKzsKKworCWlmIChsZW4gJiAxKQorCQlzdW0gKz0gaHRvbnMoKCooY29uc3QgdV9pbnQ4X3QgKilzcCkgPDwgOCk7CisKKwl3aGlsZSAoc3VtID4gMHhmZmZmKQorCQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCXN1bSA9IH5zdW0gJiAweGZmZmY7CisKKwlyZXR1cm4gKHN1bSk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKmRjY3BfcmVzZXRfY29kZSh1X2ludDhfdCBjb2RlKQoreworCWlmIChjb2RlID49IF9fRENDUF9SRVNFVF9DT0RFX0xBU1QpCisJCXJldHVybiAiaW52YWxpZCI7CisJcmV0dXJuIGRjY3BfcmVzZXRfY29kZXNbY29kZV07Cit9CisKK3N0YXRpYyB1X2ludDY0X3QgZGNjcF9zZXFubyhjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoKQoreworCXVfaW50MzJfdCBzZXFfaGlnaCA9IERDQ1BIX1NFUShkaCk7CisJdV9pbnQ2NF90IHNlcW5vID0gRVhUUkFDVF8yNEJJVFMoJnNlcV9oaWdoKSAmIDB4RkZGRkZGOworCisJaWYgKERDQ1BIX1goZGgpICE9IDApIHsKKwkJY29uc3Qgc3RydWN0IGRjY3BfaGRyX2V4dCAqZGh4ID0gKHZvaWQgKikoZGggKyAxKTsKKwkJdV9pbnQzMl90IHNlcV9sb3cgPSBkaHgtPmRjY3BoX3NlcV9sb3c7CisJCXNlcW5vICY9IDB4MDBGRkZGOyAgLyogY2xlYXIgcmVzZXJ2ZWQgZmllbGQgKi8KKwkJc2Vxbm8gPSAoc2Vxbm8gPDwgMzIpICsgRVhUUkFDVF8zMkJJVFMoJnNlcV9sb3cpOworCX0KKworCXJldHVybiBzZXFubzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZGNjcF9iYXNpY19oZHJfbGVuKGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgpCit7CisJcmV0dXJuIHNpemVvZigqZGgpICsgKERDQ1BIX1goZGgpID8gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9leHQpIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRjY3BfcHJpbnRfYWNrX25vKGNvbnN0IHVfY2hhciAqYnApCit7CisJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCA9IChjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKilicDsKKwljb25zdCBzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgKmRoX2FjayA9CisJCShzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMgKikoYnAgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oZGgpKTsKKwl1X2ludDMyX3QgYWNrX2hpZ2g7CisJdV9pbnQ2NF90IGFja25vOworCisJVENIRUNLMigqZGhfYWNrLDQpOworCWFja19oaWdoID0gRENDUEhfQUNLKGRoX2Fjayk7CisJYWNrbm8gPSBFWFRSQUNUXzI0QklUUygmYWNrX2hpZ2gpICYgMHhGRkZGRkY7CisKKwlpZiAoRENDUEhfWChkaCkgIT0gMCkgeworCQl1X2ludDMyX3QgYWNrX2xvdzsKKworCQlUQ0hFQ0syKCpkaF9hY2ssOCk7CisJCWFja19sb3cgPSBkaF9hY2stPmRjY3BoX2Fja19ucl9sb3c7CisKKwkJYWNrbm8gJj0gMHgwMEZGRkY7ICAvKiBjbGVhciByZXNlcnZlZCBmaWVsZCAqLworCQlhY2tubyA9IChhY2tubyA8PCAzMikgKyBFWFRSQUNUXzMyQklUUygmYWNrX2xvdyk7CisJfQorCisJKHZvaWQpcHJpbnRmKCIoYWNrPSUiIFBSSXU2NCAiKSAiLCBhY2tubyk7Cit0cnVuYzoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRjY3BfcGFja2V0X2hkcl9sZW4oY29uc3QgdV9pbnQ4X3QgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBEQ0NQX1BLVF9EQVRBKQorCQlyZXR1cm4gMDsKKwlpZiAodHlwZSA9PSBEQ0NQX1BLVF9EQVRBQUNLCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfQUNLCXx8CisJICAgIHR5cGUgPT0gRENDUF9QS1RfU1lOQwl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX1NZTkNBQ0sJfHwKKwkgICAgdHlwZSA9PSBEQ0NQX1BLVF9DTE9TRQl8fAorCSAgICB0eXBlID09IERDQ1BfUEtUX0NMT1NFUkVRKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyk7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfUkVRVUVTVCkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCk7CisJaWYgKHR5cGUgPT0gRENDUF9QS1RfUkVTUE9OU0UpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNldCk7Cit9CisKK3N0YXRpYyBpbnQgZGNjcF9wcmludF9vcHRpb24oY29uc3QgdV9jaGFyICpvcHRpb24pOworCisvKioKKyAqIGRjY3BfcHJpbnQgLSBzaG93IGRjY3AgcGFja2V0CisgKiBAYnAgLSBiZWdpbm5pbmcgb2YgZGNjcCBwYWNrZXQKKyAqIEBkYXRhMiAtIGJlZ2lubmluZyBvZiBlbmNsb3NpbmcgCisgKiBAbGVuIC0gbGVuZ2h0IG9mIGlwIHBhY2tldAorICovCit2b2lkIGRjY3BfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgY29uc3QgdV9jaGFyICpkYXRhMiwgdV9pbnQgbGVuKQoreworCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGg7CisJY29uc3Qgc3RydWN0IGlwICppcDsKKyNpZmRlZiBJTkVUNgorCWNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDY7CisjZW5kaWYKKwljb25zdCB1X2NoYXIgKmNwOworCXVfc2hvcnQgc3BvcnQsIGRwb3J0OworCXVfaW50IGhsZW47CisJdV9pbnQgZXh0bGVuID0gMDsKKworCWRoID0gKGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqKWJwOworCisJaXAgPSAoc3RydWN0IGlwICopZGF0YTI7CisjaWZkZWYgSU5FVDYKKwlpZiAoSVBfVihpcCkgPT0gNikKKwkJaXA2ID0gKGNvbnN0IHN0cnVjdCBpcDZfaGRyICopZGF0YTI7CisJZWxzZQorCQlpcDYgPSBOVUxMOworI2VuZGlmIC8qSU5FVDYqLworCWNwID0gKGNvbnN0IHVfY2hhciAqKShkaCArIDEpOworCWlmIChjcCA+IHNuYXBlbmQpIHsKKwkJcHJpbnRmKCJbSW52YWxpZCBwYWNrZXR8ZGNjcF0iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGRjY3BfaGRyKSkgeworCQlwcmludGYoInRydW5jYXRlZC1kY2NwIC0gJWxkIGJ5dGVzIG1pc3NpbmchIiwKKwkJCSAgICAgKGxvbmcpbGVuIC0gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikpOworCQlyZXR1cm47CisJfQorCisJc3BvcnQgPSBFWFRSQUNUXzE2QklUUygmZGgtPmRjY3BoX3Nwb3J0KTsKKwlkcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZkaC0+ZGNjcGhfZHBvcnQpOworCWhsZW4gPSBkaC0+ZGNjcGhfZG9mZiAqIDQ7CisKKyNpZmRlZiBJTkVUNgorCWlmIChpcDYpIHsKKwkJKHZvaWQpcHJpbnRmKCIlcy4lZCA+ICVzLiVkOiAiLAorCQkJICAgICBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwgc3BvcnQsCisJCQkgICAgIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLCBkcG9ydCk7CisJfSBlbHNlCisjZW5kaWYgLypJTkVUNiovCisJeworCQkodm9pZClwcmludGYoIiVzLiVkID4gJXMuJWQ6ICIsCisJCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwLT5pcF9zcmMpLCBzcG9ydCwKKwkJCSAgICAgaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCksIGRwb3J0KTsKKwl9CisJZmZsdXNoKHN0ZG91dCk7CisKKwlpZiAocWZsYWcpIHsKKwkJKHZvaWQpcHJpbnRmKCIgJWQiLCBsZW4gLSBobGVuKTsKKwkJaWYgKGhsZW4gPiBsZW4pIHsKKwkJCSh2b2lkKXByaW50ZigiZGNjcCBbYmFkIGhkciBsZW5ndGggJXUgLSB0b28gbG9uZywgPiAldV0iLAorCQkJICAgIGhsZW4sIGxlbik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIG90aGVyIHZhcmlhYmxlcyBpbiBnZW5lcmljIGhlYWRlciAqLworCWlmICh2ZmxhZykgeworCQkodm9pZClwcmludGYoIkNDVmFsICVkLCBDc0NvdiAlZCwgIiwgRENDUEhfQ0NWQUwoZGgpLCBEQ0NQSF9DU0NPVihkaCkpOworCX0KKworCS8qIGNoZWNrc3VtIGNhbGN1bGF0aW9uICovCisjaWZkZWYgSU5FVDYKKwlpZiAoaXA2KSB7CisJCWlmIChpcDYtPmlwNl9wbGVuICYmIHZmbGFnKSB7CisJCQl1X2ludDE2X3Qgc3VtLCBkY2NwX3N1bTsKKworCQkJc3VtID0gZGNjcDZfY2tzdW0oaXA2LCBkaCwgbGVuKTsKKwkJCWRjY3Bfc3VtID0gRVhUUkFDVF8xNkJJVFMoJmRoLT5kY2NwaF9jaGVja3N1bSk7CQkKKwkJCXByaW50ZigiY2tzdW0gMHglMDR4IiwgZGNjcF9zdW0pOwkJCisJCQlpZiAoc3VtICE9IDApIHsKKwkJCQkodm9pZClwcmludGYoIiAoaW5jb3JyZWN0ICgtPiAweCUwNHgpLCAiLGluX2Nrc3VtX3Nob3VsZGJlKGRjY3Bfc3VtLCBzdW0pKTsKKwkJCX0gZWxzZQorCQkJCSh2b2lkKXByaW50ZigiIChjb3JyZWN0KSwgIik7CisJCX0JCQkJCQorCX0gZWxzZSAKKyNlbmRpZiAvKiBJTkVUNiAqLworCWlmICh2ZmxhZykKKwl7CisJCXVfaW50MTZfdCBzdW0sIGRjY3Bfc3VtOworCisJCXN1bSA9IGRjY3BfY2tzdW0oaXAsIGRoLCBsZW4pOworCQlkY2NwX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZkaC0+ZGNjcGhfY2hlY2tzdW0pOwkJCisJCXByaW50ZigiY2tzdW0gMHglMDR4IiwgZGNjcF9zdW0pOwkJCisJCWlmIChzdW0gIT0gMCkgeworCQkJKHZvaWQpcHJpbnRmKCIgKGluY29ycmVjdCAoLT4gMHglMDR4KSwgIixpbl9ja3N1bV9zaG91bGRiZShkY2NwX3N1bSwgc3VtKSk7CisJCX0gZWxzZQorCQkJKHZvaWQpcHJpbnRmKCIgKGNvcnJlY3QpLCAiKTsKKwl9CisKKwlzd2l0Y2ggKERDQ1BIX1RZUEUoZGgpKSB7CisJY2FzZSBEQ0NQX1BLVF9SRVFVRVNUOiB7CisJCXN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0ICpkaHIgPQorCQkJKHN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0ICopKGJwICsgZGNjcF9iYXNpY19oZHJfbGVuKGRoKSk7CisJCVRDSEVDSygqZGhyKTsKKwkJKHZvaWQpcHJpbnRmKCJyZXF1ZXN0IChzZXJ2aWNlPSVkKSAiLAorCQkJICAgICBFWFRSQUNUXzMyQklUUygmZGhyLT5kY2NwaF9yZXFfc2VydmljZSkpOworCQlleHRsZW4gKz0gNDsKKwkJYnJlYWs7CisJfQorCWNhc2UgRENDUF9QS1RfUkVTUE9OU0U6IHsKKwkJc3RydWN0IGRjY3BfaGRyX3Jlc3BvbnNlICpkaHIgPQorCQkJKHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAqKShicCArIGRjY3BfYmFzaWNfaGRyX2xlbihkaCkpOworCQlUQ0hFQ0soKmRocik7CisJCSh2b2lkKXByaW50ZigicmVzcG9uc2UgKHNlcnZpY2U9JWQpICIsCisJCQkgICAgIEVYVFJBQ1RfMzJCSVRTKCZkaHItPmRjY3BoX3Jlc3Bfc2VydmljZSkpOworCQlleHRsZW4gKz0gMTI7CisJCWJyZWFrOworCX0KKwljYXNlIERDQ1BfUEtUX0RBVEE6CisJCSh2b2lkKXByaW50ZigiZGF0YSAiKTsKKwkJYnJlYWs7CisJY2FzZSBEQ0NQX1BLVF9BQ0s6IHsKKwkJKHZvaWQpcHJpbnRmKCJhY2sgIik7CisJCWV4dGxlbiArPSA4OworCQlicmVhazsKKwl9CisJY2FzZSBEQ0NQX1BLVF9EQVRBQUNLOiB7CisJCSh2b2lkKXByaW50ZigiZGF0YWFjayAiKTsKKwkJZXh0bGVuICs9IDg7CisJCWJyZWFrOworCX0KKwljYXNlIERDQ1BfUEtUX0NMT1NFUkVROgorCQkodm9pZClwcmludGYoImNsb3NlcmVxICIpOworCQlleHRsZW4gKz0gODsKKwkJYnJlYWs7CisJY2FzZSBEQ0NQX1BLVF9DTE9TRToKKwkJKHZvaWQpcHJpbnRmKCJjbG9zZSAiKTsKKwkJZXh0bGVuICs9IDg7CisJCWJyZWFrOworCWNhc2UgRENDUF9QS1RfUkVTRVQ6IHsKKwkJc3RydWN0IGRjY3BfaGRyX3Jlc2V0ICpkaHIgPQorCQkJKHN0cnVjdCBkY2NwX2hkcl9yZXNldCAqKShicCArIGRjY3BfYmFzaWNfaGRyX2xlbihkaCkpOworCQlUQ0hFQ0soKmRocik7CisJCSh2b2lkKXByaW50ZigicmVzZXQgKGNvZGU9JXMpICIsCisJCQkgICAgIGRjY3BfcmVzZXRfY29kZShkaHItPmRjY3BoX3Jlc2V0X2NvZGUpKTsKKwkJZXh0bGVuICs9IDEyOworCQlicmVhazsKKwl9CisJY2FzZSBEQ0NQX1BLVF9TWU5DOgorCQkodm9pZClwcmludGYoInN5bmMgIik7CisJCWV4dGxlbiArPSA4OworCQlicmVhazsKKwljYXNlIERDQ1BfUEtUX1NZTkNBQ0s6CisJCSh2b2lkKXByaW50Zigic3luY2FjayAiKTsKKwkJZXh0bGVuICs9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSh2b2lkKXByaW50ZigiaW52YWxpZCAiKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKChEQ0NQSF9UWVBFKGRoKSAhPSBEQ0NQX1BLVF9EQVRBKSAmJiAKKwkJCShEQ0NQSF9UWVBFKGRoKSAhPSBEQ0NQX1BLVF9SRVFVRVNUKSkKKwkJZGNjcF9wcmludF9hY2tfbm8oYnApOworCisJaWYgKHZmbGFnIDwgMikKKwkJcmV0dXJuOworCisJKHZvaWQpcHJpbnRmKCJzZXEgJSIgUFJJdTY0LCBkY2NwX3NlcW5vKGRoKSk7CisKKwkvKiBwcm9jZXNzIG9wdGlvbnMgKi8KKwlpZiAoaGxlbiA+IGRjY3BfYmFzaWNfaGRyX2xlbihkaCkgKyBleHRsZW4peworCQljb25zdCB1X2NoYXIgKmNwOworCQl1X2ludCBvcHRsZW47CisJCWNwID0gYnAgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oZGgpICsgZXh0bGVuOworCQlwcmludGYoIiA8Iik7CQorCisJCWhsZW4gLT0gZGNjcF9iYXNpY19oZHJfbGVuKGRoKSArIGV4dGxlbjsKKwkJd2hpbGUoMSl7CisJCQlUQ0hFQ0soKmNwKTsKKwkJCW9wdGxlbiA9IGRjY3BfcHJpbnRfb3B0aW9uKGNwKTsKKwkJCWlmICghb3B0bGVuKSBnb3RvIHRydW5jMjsKKwkJCWlmIChobGVuIDw9IG9wdGxlbikgYnJlYWs7IAorCQkJaGxlbiAtPSBvcHRsZW47CisJCQljcCArPSBvcHRsZW47CisJCQlwcmludGYoIiwgIik7CisJCX0KKwkJcHJpbnRmKCI+Iik7CQorCX0KKwlyZXR1cm47Cit0cnVuYzoKKwlwcmludGYoIlt8ZGNjcF0iKTsKK3RydW5jMjoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZGNjcF9wcmludF9vcHRpb24oY29uc3QgdV9jaGFyICpvcHRpb24pCit7CQorCXVfaW50OF90IG9wdGxlbiwgaTsKKwl1X2ludDMyX3QgKnRzOworCXVfaW50MTZfdCAqdmFyMTY7CisJdV9pbnQzMl90ICp2YXIzMjsKKworCVRDSEVDSygqb3B0aW9uKTsKKworCWlmICgqb3B0aW9uID49IDMyKSB7CisJCVRDSEVDSygqKG9wdGlvbisxKSk7CisJCW9wdGxlbiA9ICoob3B0aW9uICsxKTsKKwkJaWYgKG9wdGxlbiA8IDIpIHsKKwkJCXByaW50ZigiT3B0aW9uICVkIG9wdGxlbiB0b28gc2hvcnQiLCpvcHRpb24pOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2Ugb3B0bGVuID0gMTsKKworCVRDSEVDSzIoKm9wdGlvbixvcHRsZW4pOworCisJc3dpdGNoICgqb3B0aW9uKXsKKwljYXNlIDA6CisJCXByaW50Zigibm9wIik7CisJCWJyZWFrOwkKKwljYXNlIDE6CisJCXByaW50ZigibWFuZGF0b3J5Iik7CisJCWJyZWFrOwkKKwljYXNlIDI6CisJCXByaW50Zigic2xvd3JlY2VpdmVyIik7CisJCWJyZWFrOwkKKwljYXNlIDMyOgorCQlwcmludGYoImNoYW5nZV9sIik7CisJCWlmICgqKG9wdGlvbiArMikgPCAxMCl7CisJCQlwcmludGYoIiAlcyIsIGRjY3BfZmVhdHVyZV9udW1zWyoob3B0aW9uICsyKV0pOworCQkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMzsgaSArKykgcHJpbnRmKCIgJWQiLCAqKG9wdGlvbiArMyArIGkpKTsJCisJCX0KKwkJYnJlYWs7CQorCWNhc2UgMzM6CisJCXByaW50ZigiY29uZmlybV9sIik7CisJCWlmICgqKG9wdGlvbiArMikgPCAxMCl7CisJCQlwcmludGYoIiAlcyIsIGRjY3BfZmVhdHVyZV9udW1zWyoob3B0aW9uICsyKV0pOworCQkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMzsgaSArKykgcHJpbnRmKCIgJWQiLCAqKG9wdGlvbiArMyArIGkpKTsJCisJCX0KKwkJYnJlYWs7CisJY2FzZSAzNDoKKwkgICAgICAgIHByaW50ZigiY2hhbmdlX3IiKTsKKwkJaWYgKCoob3B0aW9uICsyKSA8IDEwKXsKKwkJCXByaW50ZigiICVzIiwgZGNjcF9mZWF0dXJlX251bXNbKihvcHRpb24gKzIpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0zOyBpICsrKSBwcmludGYoIiAlZCIsICoob3B0aW9uICszICsgaSkpOwkKKwkJfQorCQlicmVhazsKKwljYXNlIDM1OgorCQlwcmludGYoImNvbmZpcm1fciIpOworCQlpZiAoKihvcHRpb24gKzIpIDwgMTApeworCQkJcHJpbnRmKCIgJXMiLCBkY2NwX2ZlYXR1cmVfbnVtc1sqKG9wdGlvbiArMildKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTM7IGkgKyspIHByaW50ZigiICVkIiwgKihvcHRpb24gKzMgKyBpKSk7CQorCQl9CisJCWJyZWFrOworCWNhc2UgMzY6CisJCXByaW50ZigiaW5pdGNvb2tpZSAweCIpOworCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0yOyBpICsrKSBwcmludGYoIiUwMngiLCAqKG9wdGlvbiArMiArIGkpKTsJCisJCWJyZWFrOworCWNhc2UgMzc6CisJCXByaW50ZigibmRwX2NvdW50Iik7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTI7IGkgKyspIHByaW50ZigiICVkIiwgKihvcHRpb24gKzIgKyBpKSk7CQorCQlicmVhazsKKwljYXNlIDM4OgorCQlwcmludGYoImFja192ZWN0b3IwIDB4Iik7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTI7IGkgKyspIHByaW50ZigiJTAyeCIsICoob3B0aW9uICsyICsgaSkpOwkKKwkJYnJlYWs7CisJY2FzZSAzOToKKwkJcHJpbnRmKCJhY2tfdmVjdG9yMSAweCIpOworCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0yOyBpICsrKSBwcmludGYoIiUwMngiLCAqKG9wdGlvbiArMiArIGkpKTsJCisJCWJyZWFrOworCWNhc2UgNDA6CisJCXByaW50ZigiZGF0YV9kcm9wcGVkIDB4Iik7CisJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTI7IGkgKyspIHByaW50ZigiJTAyeCIsICoob3B0aW9uICsyICsgaSkpOwkKKwkJYnJlYWs7CisJY2FzZSA0MToKKwkJdHMgPSAodV9pbnQzMl90ICopKG9wdGlvbiArIDIpOworCQlwcmludGYoInRpbWVzdGFtcCAldSIsICh1X2ludDMyX3QpbnRvaGwoKnRzKSk7CisJCWJyZWFrOworCWNhc2UgNDI6CisJCXRzID0gKHVfaW50MzJfdCAqKShvcHRpb24gKyAyKTsKKwkJcHJpbnRmKCJ0aW1lc3RhbXBfZWNobyAldSIsICh1X2ludDMyX3QpbnRvaGwoKnRzKSk7CisJCWJyZWFrOworCWNhc2UgNDM6CisJCXByaW50ZigiZWxhcHNlZF90aW1lICIpOworCQlpZiAob3B0bGVuID09IDYpeworCQkJdHMgPSAodV9pbnQzMl90ICopKG9wdGlvbiArIDIpOworCQkJcHJpbnRmKCIldSIsICh1X2ludDMyX3QpbnRvaGwoKnRzKSk7CisJCX0gZWxzZSB7CisJCQl2YXIxNiA9ICh1X2ludDE2X3QgKikob3B0aW9uICsgMik7CisJCQlwcmludGYoIiV1IiwgbnRvaHMoKnZhcjE2KSk7CisJCX0JCisJCWJyZWFrOworCWNhc2UgNDQ6CisJCXByaW50ZigiZGF0YV9jaGVja3N1bSAiKTsKKwkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMjsgaSArKykgcHJpbnRmKCIlMDJ4IiwgKihvcHRpb24gKzIgKyBpKSk7CQorCQlicmVhazsKKwlkZWZhdWx0IDoKKwkJaWYgKCpvcHRpb24gPj0gMTI4KSB7CisJCQlwcmludGYoIkNDSUQgb3B0aW9uICVkIiwqb3B0aW9uKTsKKwkJCXN3aXRjaCAob3B0bGVuKSB7CisJCQkJY2FzZSA0OgorCQkJCQl2YXIxNiA9ICh1X2ludDE2X3QgKikob3B0aW9uICsgMik7CisJCQkJCXByaW50ZigiICV1IixudG9ocygqdmFyMTYpKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgorCQkJCQl2YXIzMiA9ICh1X2ludDMyX3QgKikob3B0aW9uICsgMik7CisJCQkJCXByaW50ZigiICV1IiwodV9pbnQzMl90KW50b2hsKCp2YXIzMikpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCQkKKwkJcHJpbnRmKCJ1bmtub3duX29wdCAlZCIsICpvcHRpb24pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gb3B0bGVuOwordHJ1bmM6CisJcHJpbnRmKCJbfGRjY3BdIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcmludC1kZWNuZXQuYyBiL3ByaW50LWRlY25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2JhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1kZWNuZXQuYwpAQCAtMCwwICsxLDg5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWRlY25ldC5jLHYgMS4zOC4yLjEgMjAwNS8wNS8wNiAwMjoxNjo1MyBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKK3N0cnVjdCBtYnVmOworc3RydWN0IHJ0ZW50cnk7CisKKyNpZmRlZiBIQVZFX05FVERORVRfRE5FVERCX0gKKyNpbmNsdWRlIDxuZXRkbmV0L2RuZXRkYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZGVjbmV0LmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBpbnQgcHJpbnRfZGVjbmV0X2N0bG1zZyhjb25zdCB1bmlvbiByb3V0ZWhkciAqLCB1X2ludCwgdV9pbnQpOworc3RhdGljIHZvaWQgcHJpbnRfdF9pbmZvKGludCk7CitzdGF0aWMgaW50IHByaW50X2wxX3JvdXRlcyhjb25zdCBjaGFyICosIHVfaW50KTsKK3N0YXRpYyBpbnQgcHJpbnRfbDJfcm91dGVzKGNvbnN0IGNoYXIgKiwgdV9pbnQpOworc3RhdGljIHZvaWQgcHJpbnRfaV9pbmZvKGludCk7CitzdGF0aWMgaW50IHByaW50X2VsaXN0KGNvbnN0IGNoYXIgKiwgdV9pbnQpOworc3RhdGljIGludCBwcmludF9uc3AoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3N0YXRpYyB2b2lkIHByaW50X3JlYXNvbihpbnQpOworI2lmZGVmCVBSSU5UX05TUERBVEEKK3N0YXRpYyB2b2lkIHBkYXRhKHVfY2hhciAqLCBpbnQpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9ORVRETkVUX0RORVREQl9IX0RORVRfSFRPQQorZXh0ZXJuIGNoYXIgKmRuZXRfaHRvYShzdHJ1Y3QgZG5fbmFkZHIgKik7CisjZW5kaWYKKwordm9pZAorZGVjbmV0X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYXAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCwKKwkgICAgIHJlZ2lzdGVyIHVfaW50IGNhcGxlbikKK3sKKwlyZWdpc3RlciBjb25zdCB1bmlvbiByb3V0ZWhkciAqcmhwOworCXJlZ2lzdGVyIGludCBtZmxhZ3M7CisJaW50IGRzdCwgc3JjLCBob3BzOworCXVfaW50IG5zcGxlbiwgcGt0bGVuOworCWNvbnN0IHVfY2hhciAqbnNwcDsKKworCWlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IHNob3J0aGRyKSkgeworCQkodm9pZClwcmludGYoIlt8ZGVjbmV0XSIpOworCQlyZXR1cm47CisJfQorCisJVENIRUNLMigqYXAsIHNpemVvZihzaG9ydCkpOworCXBrdGxlbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKGFwKTsKKwlpZiAocGt0bGVuIDwgc2l6ZW9mKHN0cnVjdCBzaG9ydGhkcikpIHsKKwkJKHZvaWQpcHJpbnRmKCJbfGRlY25ldF0iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocGt0bGVuID4gbGVuZ3RoKSB7CisJCSh2b2lkKXByaW50ZigiW3xkZWNuZXRdIik7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gcGt0bGVuOworCisJcmhwID0gKGNvbnN0IHVuaW9uIHJvdXRlaGRyICopJihhcFtzaXplb2Yoc2hvcnQpXSk7CisJVENIRUNLKHJocC0+cmhfc2hvcnQuc2hfZmxhZ3MpOworCW1mbGFncyA9IEVYVFJBQ1RfTEVfOEJJVFMocmhwLT5yaF9zaG9ydC5zaF9mbGFncyk7CisKKwlpZiAobWZsYWdzICYgUk1GX1BBRCkgeworCSAgICAvKiBwYWQgYnl0ZXMgb2Ygc29tZSBzb3J0IGluIGZyb250IG9mIG1lc3NhZ2UgKi8KKwkgICAgdV9pbnQgcGFkbGVuID0gbWZsYWdzICYgUk1GX1BBRE1BU0s7CisJICAgIGlmICh2ZmxhZykKKwkJKHZvaWQpIHByaW50ZigiW3BhZDolZF0gIiwgcGFkbGVuKTsKKwkgICAgaWYgKGxlbmd0aCA8IHBhZGxlbiArIDIpIHsKKwkJKHZvaWQpcHJpbnRmKCJbfGRlY25ldF0iKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIFRDSEVDSzIoYXBbc2l6ZW9mKHNob3J0KV0sIHBhZGxlbik7CisJICAgIGFwICs9IHBhZGxlbjsKKwkgICAgbGVuZ3RoIC09IHBhZGxlbjsKKwkgICAgY2FwbGVuIC09IHBhZGxlbjsKKwkgICAgcmhwID0gKGNvbnN0IHVuaW9uIHJvdXRlaGRyICopJihhcFtzaXplb2Yoc2hvcnQpXSk7CisJICAgIG1mbGFncyA9IEVYVFJBQ1RfTEVfOEJJVFMocmhwLT5yaF9zaG9ydC5zaF9mbGFncyk7CisJfQorCisJaWYgKG1mbGFncyAmIFJNRl9GVkVSKSB7CisJCSh2b2lkKSBwcmludGYoImZ1dHVyZS12ZXJzaW9uLWRlY25ldCIpOworCQlkZWZhdWx0X3ByaW50KGFwLCBtaW4obGVuZ3RoLCBjYXBsZW4pKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlzIGl0IGEgY29udHJvbCBtZXNzYWdlPyAqLworCWlmIChtZmxhZ3MgJiBSTUZfQ1RMTVNHKSB7CisJCWlmICghcHJpbnRfZGVjbmV0X2N0bG1zZyhyaHAsIGxlbmd0aCwgY2FwbGVuKSkKKwkJCWdvdG8gdHJ1bmM7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKG1mbGFncyAmIFJNRl9NQVNLKSB7CisJY2FzZSBSTUZfTE9ORzoKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbG9uZ2hkcikpIHsKKwkJKHZvaWQpcHJpbnRmKCJbfGRlY25ldF0iKTsKKwkJcmV0dXJuOworCSAgICB9CisJICAgIFRDSEVDSyhyaHAtPnJoX2xvbmcpOworCSAgICBkc3QgPQorCQlFWFRSQUNUX0xFXzE2QklUUyhyaHAtPnJoX2xvbmcubGdfZHN0LmRuZV9yZW1vdGUuZG5lX25vZGVhZGRyKTsKKwkgICAgc3JjID0KKwkJRVhUUkFDVF9MRV8xNkJJVFMocmhwLT5yaF9sb25nLmxnX3NyYy5kbmVfcmVtb3RlLmRuZV9ub2RlYWRkcik7CisJICAgIGhvcHMgPSBFWFRSQUNUX0xFXzhCSVRTKHJocC0+cmhfbG9uZy5sZ192aXNpdHMpOworCSAgICBuc3BwID0gJihhcFtzaXplb2Yoc2hvcnQpICsgc2l6ZW9mKHN0cnVjdCBsb25naGRyKV0pOworCSAgICBuc3BsZW4gPSBsZW5ndGggLSBzaXplb2Yoc3RydWN0IGxvbmdoZHIpOworCSAgICBicmVhazsKKwljYXNlIFJNRl9TSE9SVDoKKwkgICAgVENIRUNLKHJocC0+cmhfc2hvcnQpOworCSAgICBkc3QgPSBFWFRSQUNUX0xFXzE2QklUUyhyaHAtPnJoX3Nob3J0LnNoX2RzdCk7CisJICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJocC0+cmhfc2hvcnQuc2hfc3JjKTsKKwkgICAgaG9wcyA9IChFWFRSQUNUX0xFXzhCSVRTKHJocC0+cmhfc2hvcnQuc2hfdmlzaXRzKSAmIFZJU19NQVNLKSsxOworCSAgICBuc3BwID0gJihhcFtzaXplb2Yoc2hvcnQpICsgc2l6ZW9mKHN0cnVjdCBzaG9ydGhkcildKTsKKwkgICAgbnNwbGVuID0gbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBzaG9ydGhkcik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgICh2b2lkKSBwcmludGYoInVua25vd24gbWVzc2FnZSBmbGFncyB1bmRlciBtYXNrIik7CisJICAgIGRlZmF1bHRfcHJpbnQoKHVfY2hhciAqKWFwLCBtaW4obGVuZ3RoLCBjYXBsZW4pKTsKKwkgICAgcmV0dXJuOworCX0KKworCSh2b2lkKXByaW50ZigiJXMgPiAlcyAlZCAiLAorCQkJZG5hZGRyX3N0cmluZyhzcmMpLCBkbmFkZHJfc3RyaW5nKGRzdCksIHBrdGxlbik7CisJaWYgKHZmbGFnKSB7CisJICAgIGlmIChtZmxhZ3MgJiBSTUZfUlFSKQorCQkodm9pZClwcmludGYoIlJRUiAiKTsKKwkgICAgaWYgKG1mbGFncyAmIFJNRl9SVFMpCisJCSh2b2lkKXByaW50ZigiUlRTICIpOworCSAgICBpZiAobWZsYWdzICYgUk1GX0lFKQorCQkodm9pZClwcmludGYoIklFICIpOworCSAgICAodm9pZClwcmludGYoIiVkIGhvcHMgIiwgaG9wcyk7CisJfQorCisJaWYgKCFwcmludF9uc3AobnNwcCwgbnNwbGVuKSkKKwkJZ290byB0cnVuYzsKKwlyZXR1cm47CisKK3RydW5jOgorCSh2b2lkKXByaW50ZigiW3xkZWNuZXRdIik7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CitwcmludF9kZWNuZXRfY3RsbXNnKHJlZ2lzdGVyIGNvbnN0IHVuaW9uIHJvdXRlaGRyICpyaHAsIHVfaW50IGxlbmd0aCwKKyAgICB1X2ludCBjYXBsZW4pCit7CisJaW50IG1mbGFncyA9IEVYVFJBQ1RfTEVfOEJJVFMocmhwLT5yaF9zaG9ydC5zaF9mbGFncyk7CisJcmVnaXN0ZXIgdW5pb24gY29udHJvbG1zZyAqY21wID0gKHVuaW9uIGNvbnRyb2xtc2cgKilyaHA7CisJaW50IHNyYywgZHN0LCBpbmZvLCBibGtzaXplLCBlY28sIHVlY28sIGhlbGxvLCBvdGhlciwgdmVyczsKKwlldGhlcmFkZHIgc3JjZWEsIHJ0ZWE7CisJaW50IHByaW9yaXR5OworCWNoYXIgKnJocHggPSAoY2hhciAqKXJocDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtZmxhZ3MgJiBSTUZfQ1RMTUFTSykgeworCWNhc2UgUk1GX0lOSVQ6CisJICAgICh2b2lkKXByaW50ZigiaW5pdCAiKTsKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaW5pdG1zZykpCisJCWdvdG8gdHJ1bmM7CisJICAgIFRDSEVDSyhjbXAtPmNtX2luaXQpOworCSAgICBzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2luaXQuaW5fc3JjKTsKKwkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9pbml0LmluX2luZm8pOworCSAgICBibGtzaXplID0gRVhUUkFDVF9MRV8xNkJJVFMoY21wLT5jbV9pbml0LmluX2Jsa3NpemUpOworCSAgICB2ZXJzID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2luaXQuaW5fdmVycyk7CisJICAgIGVjbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9pbml0LmluX2Vjbyk7CisJICAgIHVlY28gPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21faW5pdC5pbl91ZWNvKTsKKwkgICAgaGVsbG8gPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2luaXQuaW5faGVsbG8pOworCSAgICBwcmludF90X2luZm8oaW5mbyk7CisJICAgICh2b2lkKXByaW50ZigKKwkJInNyYyAlc2Jsa3NpemUgJWQgdmVycyAlZCBlY28gJWQgdWVjbyAlZCBoZWxsbyAlZCIsCisJCQlkbmFkZHJfc3RyaW5nKHNyYyksIGJsa3NpemUsIHZlcnMsIGVjbywgdWVjbywKKwkJCWhlbGxvKTsKKwkgICAgcmV0ID0gMTsKKwkgICAgYnJlYWs7CisJY2FzZSBSTUZfVkVSOgorCSAgICAodm9pZClwcmludGYoInZlcmlmaWNhdGlvbiAiKTsKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgdmVyaWZtc2cpKQorCQlnb3RvIHRydW5jOworCSAgICBUQ0hFQ0soY21wLT5jbV92ZXIpOworCSAgICBzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX3Zlci52ZV9zcmMpOworCSAgICBvdGhlciA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV92ZXIudmVfZmNudmFsKTsKKwkgICAgKHZvaWQpcHJpbnRmKCJzcmMgJXMgZmNudmFsICVvIiwgZG5hZGRyX3N0cmluZyhzcmMpLCBvdGhlcik7CisJICAgIHJldCA9IDE7CisJICAgIGJyZWFrOworCWNhc2UgUk1GX1RFU1Q6CisJICAgICh2b2lkKXByaW50ZigidGVzdCAiKTsKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgdGVzdG1zZykpCisJCWdvdG8gdHJ1bmM7CisJICAgIFRDSEVDSyhjbXAtPmNtX3Rlc3QpOworCSAgICBzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX3Rlc3QudGVfc3JjKTsKKwkgICAgb3RoZXIgPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fdGVzdC50ZV9kYXRhKTsKKwkgICAgKHZvaWQpcHJpbnRmKCJzcmMgJXMgZGF0YSAlbyIsIGRuYWRkcl9zdHJpbmcoc3JjKSwgb3RoZXIpOworCSAgICByZXQgPSAxOworCSAgICBicmVhazsKKwljYXNlIFJNRl9MMVJPVVQ6CisJICAgICh2b2lkKXByaW50ZigibGV2LTEtcm91dGluZyAiKTsKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbDFyb3V0KSkKKwkJZ290byB0cnVuYzsKKwkgICAgVENIRUNLKGNtcC0+Y21fbDFyb3UpOworCSAgICBzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2wxcm91LnIxX3NyYyk7CisJICAgICh2b2lkKXByaW50Zigic3JjICVzICIsIGRuYWRkcl9zdHJpbmcoc3JjKSk7CisJICAgIHJldCA9IHByaW50X2wxX3JvdXRlcygmKHJocHhbc2l6ZW9mKHN0cnVjdCBsMXJvdXQpXSksCisJCQkJbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBsMXJvdXQpKTsKKwkgICAgYnJlYWs7CisJY2FzZSBSTUZfTDJST1VUOgorCSAgICAodm9pZClwcmludGYoImxldi0yLXJvdXRpbmcgIik7CisJICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IGwycm91dCkpCisJCWdvdG8gdHJ1bmM7CisJICAgIFRDSEVDSyhjbXAtPmNtX2wycm91dCk7CisJICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fbDJyb3V0LnIyX3NyYyk7CisJICAgICh2b2lkKXByaW50Zigic3JjICVzICIsIGRuYWRkcl9zdHJpbmcoc3JjKSk7CisJICAgIHJldCA9IHByaW50X2wyX3JvdXRlcygmKHJocHhbc2l6ZW9mKHN0cnVjdCBsMnJvdXQpXSksCisJCQkJbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBsMnJvdXQpKTsKKwkgICAgYnJlYWs7CisJY2FzZSBSTUZfUkhFTExPOgorCSAgICAodm9pZClwcmludGYoInJvdXRlci1oZWxsbyAiKTsKKwkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgcmhlbGxvbXNnKSkKKwkJZ290byB0cnVuYzsKKwkgICAgVENIRUNLKGNtcC0+Y21fcmhlbGxvKTsKKwkgICAgdmVycyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9yaGVsbG8ucmhfdmVycyk7CisJICAgIGVjbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9yaGVsbG8ucmhfZWNvKTsKKwkgICAgdWVjbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9yaGVsbG8ucmhfdWVjbyk7CisJICAgIG1lbWNweSgoY2hhciAqKSZzcmNlYSwgKGNoYXIgKikmKGNtcC0+Y21fcmhlbGxvLnJoX3NyYyksCisJCXNpemVvZihzcmNlYSkpOworCSAgICBzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhzcmNlYS5kbmVfcmVtb3RlLmRuZV9ub2RlYWRkcik7CisJICAgIGluZm8gPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fcmhlbGxvLnJoX2luZm8pOworCSAgICBibGtzaXplID0gRVhUUkFDVF9MRV8xNkJJVFMoY21wLT5jbV9yaGVsbG8ucmhfYmxrc2l6ZSk7CisJICAgIHByaW9yaXR5ID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX3JoZWxsby5yaF9wcmlvcml0eSk7CisJICAgIGhlbGxvID0gRVhUUkFDVF9MRV8xNkJJVFMoY21wLT5jbV9yaGVsbG8ucmhfaGVsbG8pOworCSAgICBwcmludF9pX2luZm8oaW5mbyk7CisJICAgICh2b2lkKXByaW50ZigKKwkgICAgInZlcnMgJWQgZWNvICVkIHVlY28gJWQgc3JjICVzIGJsa3NpemUgJWQgcHJpICVkIGhlbGxvICVkIiwKKwkJCXZlcnMsIGVjbywgdWVjbywgZG5hZGRyX3N0cmluZyhzcmMpLAorCQkJYmxrc2l6ZSwgcHJpb3JpdHksIGhlbGxvKTsKKwkgICAgcmV0ID0gcHJpbnRfZWxpc3QoJihyaHB4W3NpemVvZihzdHJ1Y3QgcmhlbGxvbXNnKV0pLAorCQkJCWxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgcmhlbGxvbXNnKSk7CisJICAgIGJyZWFrOworCWNhc2UgUk1GX0VIRUxMTzoKKwkgICAgKHZvaWQpcHJpbnRmKCJlbmRub2RlLWhlbGxvICIpOworCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBlaGVsbG9tc2cpKQorCQlnb3RvIHRydW5jOworCSAgICBUQ0hFQ0soY21wLT5jbV9laGVsbG8pOworCSAgICB2ZXJzID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2VoZWxsby5laF92ZXJzKTsKKwkgICAgZWNvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2VoZWxsby5laF9lY28pOworCSAgICB1ZWNvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2VoZWxsby5laF91ZWNvKTsKKwkgICAgbWVtY3B5KChjaGFyICopJnNyY2VhLCAoY2hhciAqKSYoY21wLT5jbV9laGVsbG8uZWhfc3JjKSwKKwkJc2l6ZW9mKHNyY2VhKSk7CisJICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNyY2VhLmRuZV9yZW1vdGUuZG5lX25vZGVhZGRyKTsKKwkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9laGVsbG8uZWhfaW5mbyk7CisJICAgIGJsa3NpemUgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2VoZWxsby5laF9ibGtzaXplKTsKKwkgICAgLypzZWVkKi8KKwkgICAgbWVtY3B5KChjaGFyICopJnJ0ZWEsIChjaGFyICopJihjbXAtPmNtX2VoZWxsby5laF9yb3V0ZXIpLAorCQlzaXplb2YocnRlYSkpOworCSAgICBkc3QgPSBFWFRSQUNUX0xFXzE2QklUUyhydGVhLmRuZV9yZW1vdGUuZG5lX25vZGVhZGRyKTsKKwkgICAgaGVsbG8gPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2VoZWxsby5laF9oZWxsbyk7CisJICAgIG90aGVyID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2VoZWxsby5laF9kYXRhKTsKKwkgICAgcHJpbnRfaV9pbmZvKGluZm8pOworCSAgICAodm9pZClwcmludGYoCisJInZlcnMgJWQgZWNvICVkIHVlY28gJWQgc3JjICVzIGJsa3NpemUgJWQgcnRyICVzIGhlbGxvICVkIGRhdGEgJW8iLAorCQkJdmVycywgZWNvLCB1ZWNvLCBkbmFkZHJfc3RyaW5nKHNyYyksCisJCQlibGtzaXplLCBkbmFkZHJfc3RyaW5nKGRzdCksIGhlbGxvLCBvdGhlcik7CisJICAgIHJldCA9IDE7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgKHZvaWQpcHJpbnRmKCJ1bmtub3duIGNvbnRyb2wgbWVzc2FnZSIpOworCSAgICBkZWZhdWx0X3ByaW50KCh1X2NoYXIgKilyaHAsIG1pbihsZW5ndGgsIGNhcGxlbikpOworCSAgICByZXQgPSAxOworCSAgICBicmVhazsKKwl9CisJcmV0dXJuIChyZXQpOworCit0cnVuYzoKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdF9pbmZvKGludCBpbmZvKQoreworCWludCBudHlwZSA9IGluZm8gJiAzOworCXN3aXRjaCAobnR5cGUpIHsKKwljYXNlIDA6ICh2b2lkKXByaW50ZigicmVzZXJ2ZWQtbnR5cGU/ICIpOyBicmVhazsKKwljYXNlIFRJX0wyUk9VVDogKHZvaWQpcHJpbnRmKCJsMnJvdXQgIik7IGJyZWFrOworCWNhc2UgVElfTDFST1VUOiAodm9pZClwcmludGYoImwxcm91dCAiKTsgYnJlYWs7CisJY2FzZSBUSV9FTkROT0RFOiAodm9pZClwcmludGYoImVuZG5vZGUgIik7IGJyZWFrOworCX0KKwlpZiAoaW5mbyAmIFRJX1ZFUklGKQorCSAgICAodm9pZClwcmludGYoInZlcmlmICIpOworCWlmIChpbmZvICYgVElfQkxPQ0spCisJICAgICh2b2lkKXByaW50ZigiYmxvICIpOworfQorCitzdGF0aWMgaW50CitwcmludF9sMV9yb3V0ZXMoY29uc3QgY2hhciAqcnAsIHVfaW50IGxlbikKK3sKKwlpbnQgY291bnQ7CisJaW50IGlkOworCWludCBpbmZvOworCisJLyogVGhlIGxhc3Qgc2hvcnQgaXMgYSBjaGVja3N1bSAqLworCXdoaWxlIChsZW4gPiAoMyAqIHNpemVvZihzaG9ydCkpKSB7CisJICAgIFRDSEVDSzIoKnJwLCAzICogc2l6ZW9mKHNob3J0KSk7CisJICAgIGNvdW50ID0gRVhUUkFDVF9MRV8xNkJJVFMocnApOworCSAgICBpZiAoY291bnQgPiAxMDI0KQorCQlyZXR1cm4gKDEpOwkvKiBzZWVtcyB0byBiZSBib2d1cyBmcm9tIGhlcmUgb24gKi8KKwkgICAgcnAgKz0gc2l6ZW9mKHNob3J0KTsKKwkgICAgbGVuIC09IHNpemVvZihzaG9ydCk7CisJICAgIGlkID0gRVhUUkFDVF9MRV8xNkJJVFMocnApOworCSAgICBycCArPSBzaXplb2Yoc2hvcnQpOworCSAgICBsZW4gLT0gc2l6ZW9mKHNob3J0KTsKKwkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJwKTsKKwkgICAgcnAgKz0gc2l6ZW9mKHNob3J0KTsKKwkgICAgbGVuIC09IHNpemVvZihzaG9ydCk7CisJICAgICh2b2lkKXByaW50Zigie2lkcyAlZC0lZCBjb3N0ICVkIGhvcHMgJWR9ICIsIGlkLCBpZCArIGNvdW50LAorCQkJICAgIFJJX0NPU1QoaW5mbyksIFJJX0hPUFMoaW5mbykpOworCX0KKwlyZXR1cm4gKDEpOworCit0cnVuYzoKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwcmludF9sMl9yb3V0ZXMoY29uc3QgY2hhciAqcnAsIHVfaW50IGxlbikKK3sKKwlpbnQgY291bnQ7CisJaW50IGFyZWE7CisJaW50IGluZm87CisKKwkvKiBUaGUgbGFzdCBzaG9ydCBpcyBhIGNoZWNrc3VtICovCisJd2hpbGUgKGxlbiA+ICgzICogc2l6ZW9mKHNob3J0KSkpIHsKKwkgICAgVENIRUNLMigqcnAsIDMgKiBzaXplb2Yoc2hvcnQpKTsKKwkgICAgY291bnQgPSBFWFRSQUNUX0xFXzE2QklUUyhycCk7CisJICAgIGlmIChjb3VudCA+IDEwMjQpCisJCXJldHVybiAoMSk7CS8qIHNlZW1zIHRvIGJlIGJvZ3VzIGZyb20gaGVyZSBvbiAqLworCSAgICBycCArPSBzaXplb2Yoc2hvcnQpOworCSAgICBsZW4gLT0gc2l6ZW9mKHNob3J0KTsKKwkgICAgYXJlYSA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJwKTsKKwkgICAgcnAgKz0gc2l6ZW9mKHNob3J0KTsKKwkgICAgbGVuIC09IHNpemVvZihzaG9ydCk7CisJICAgIGluZm8gPSBFWFRSQUNUX0xFXzE2QklUUyhycCk7CisJICAgIHJwICs9IHNpemVvZihzaG9ydCk7CisJICAgIGxlbiAtPSBzaXplb2Yoc2hvcnQpOworCSAgICAodm9pZClwcmludGYoInthcmVhcyAlZC0lZCBjb3N0ICVkIGhvcHMgJWR9ICIsIGFyZWEsIGFyZWEgKyBjb3VudCwKKwkJCSAgICBSSV9DT1NUKGluZm8pLCBSSV9IT1BTKGluZm8pKTsKKwl9CisJcmV0dXJuICgxKTsKKwordHJ1bmM6CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lfaW5mbyhpbnQgaW5mbykKK3sKKwlpbnQgbnR5cGUgPSBpbmZvICYgSUlfVFlQRU1BU0s7CisJc3dpdGNoIChudHlwZSkgeworCWNhc2UgMDogKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1udHlwZT8gIik7IGJyZWFrOworCWNhc2UgSUlfTDJST1VUOiAodm9pZClwcmludGYoImwycm91dCAiKTsgYnJlYWs7CisJY2FzZSBJSV9MMVJPVVQ6ICh2b2lkKXByaW50ZigibDFyb3V0ICIpOyBicmVhazsKKwljYXNlIElJX0VORE5PREU6ICh2b2lkKXByaW50ZigiZW5kbm9kZSAiKTsgYnJlYWs7CisJfQorCWlmIChpbmZvICYgSUlfVkVSSUYpCisJICAgICh2b2lkKXByaW50ZigidmVyaWYgIik7CisJaWYgKGluZm8gJiBJSV9OT01DQVNUKQorCSAgICAodm9pZClwcmludGYoIm5vbWNhc3QgIik7CisJaWYgKGluZm8gJiBJSV9CTE9DSykKKwkgICAgKHZvaWQpcHJpbnRmKCJibG8gIik7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2VsaXN0KGNvbnN0IGNoYXIgKmVscCBfVV8sIHVfaW50IGxlbiBfVV8pCit7CisJLyogTm90IGVub3VnaCBleGFtcGxlcyBhdmFpbGFibGUgZm9yIG1lIHRvIGRlYnVnIHRoaXMgKi8KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50CitwcmludF9uc3AoY29uc3QgdV9jaGFyICpuc3BwLCB1X2ludCBuc3BsZW4pCit7CisJY29uc3Qgc3RydWN0IG5zcGhkciAqbnNwaHAgPSAoc3RydWN0IG5zcGhkciAqKW5zcHA7CisJaW50IGRzdCwgc3JjLCBmbGFnczsKKworCWlmIChuc3BsZW4gPCBzaXplb2Yoc3RydWN0IG5zcGhkcikpCisJCWdvdG8gdHJ1bmM7CisJVENIRUNLKCpuc3BocCk7CisJZmxhZ3MgPSBFWFRSQUNUX0xFXzhCSVRTKG5zcGhwLT5uaF9mbGFncyk7CisJZHN0ID0gRVhUUkFDVF9MRV8xNkJJVFMobnNwaHAtPm5oX2RzdCk7CisJc3JjID0gRVhUUkFDVF9MRV8xNkJJVFMobnNwaHAtPm5oX3NyYyk7CisKKwlzd2l0Y2ggKGZsYWdzICYgTlNQX1RZUEVNQVNLKSB7CisJY2FzZSBNRlRfREFUQToKKwkgICAgc3dpdGNoIChmbGFncyAmIE5TUF9TVUJNQVNLKSB7CisJICAgIGNhc2UgTUZTX0JPTToKKwkgICAgY2FzZSBNRlNfTU9NOgorCSAgICBjYXNlIE1GU19FT006CisJICAgIGNhc2UgTUZTX0JPTStNRlNfRU9NOgorCQlwcmludGYoImRhdGEgJWQ+JWQgIiwgc3JjLCBkc3QpOworCQl7CisJCSAgICBzdHJ1Y3Qgc2VnaGRyICpzaHAgPSAoc3RydWN0IHNlZ2hkciAqKW5zcHA7CisJCSAgICBpbnQgYWNrOworI2lmZGVmCVBSSU5UX05TUERBVEEKKwkJICAgIHVfY2hhciAqZHA7CisjZW5kaWYKKwkJICAgIHVfaW50IGRhdGFfb2ZmID0gc2l6ZW9mKHN0cnVjdCBtaW5zZWdoZHIpOworCisJCSAgICBpZiAobnNwbGVuIDwgZGF0YV9vZmYpCisJCQlnb3RvIHRydW5jOworCQkgICAgVENIRUNLKHNocC0+c2hfc2VxWzBdKTsKKwkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzBdKTsKKwkJICAgIGlmIChhY2sgJiBTR1FfQUNLKSB7CS8qIGFja251bSBmaWVsZCAqLworCQkJaWYgKChhY2sgJiBTR1FfTkFLKSA9PSBTR1FfTkFLKQorCQkJICAgICh2b2lkKXByaW50ZigibmFrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCWVsc2UKKwkJCSAgICAodm9pZClwcmludGYoImFjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQlkYXRhX29mZiArPSBzaXplb2Yoc2hvcnQpOworCQkJaWYgKG5zcGxlbiA8IGRhdGFfb2ZmKQorCQkJICAgIGdvdG8gdHJ1bmM7CisJCQlUQ0hFQ0soc2hwLT5zaF9zZXFbMV0pOworCQkgICAgICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzFdKTsKKwkJCWlmIChhY2sgJiBTR1FfT0FDSykgewkvKiBhY2tvdGggZmllbGQgKi8KKwkJCSAgICBpZiAoKGFjayAmIFNHUV9PTkFLKSA9PSBTR1FfT05BSykKKwkJCQkodm9pZClwcmludGYoIm9uYWsgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJICAgIGVsc2UKKwkJCQkodm9pZClwcmludGYoIm9hY2sgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJICAgIGRhdGFfb2ZmICs9IHNpemVvZihzaG9ydCk7CisJCQkgICAgaWYgKG5zcGxlbiA8IGRhdGFfb2ZmKQorCQkJCWdvdG8gdHJ1bmM7CisJCQkgICAgVENIRUNLKHNocC0+c2hfc2VxWzJdKTsKKwkJCSAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhzaHAtPnNoX3NlcVsyXSk7CisJCQl9CisJCSAgICB9CisJCSAgICAodm9pZClwcmludGYoInNlZyAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisjaWZkZWYJUFJJTlRfTlNQREFUQQorCQkgICAgaWYgKG5zcGxlbiA+IGRhdGFfb2ZmKSB7CisJCQlkcCA9ICYobnNwcFtkYXRhX29mZl0pOworCQkJVENIRUNLMigqZHAsIG5zcGxlbiAtIGRhdGFfb2ZmKTsKKwkJCXBkYXRhKGRwLCBuc3BsZW4gLSBkYXRhX29mZik7CisJCSAgICB9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBNRlNfSUxTK01GU19JTlQ6CisJCXByaW50ZigiaW50ciAiKTsKKwkJeworCQkgICAgc3RydWN0IHNlZ2hkciAqc2hwID0gKHN0cnVjdCBzZWdoZHIgKiluc3BwOworCQkgICAgaW50IGFjazsKKyNpZmRlZglQUklOVF9OU1BEQVRBCisJCSAgICB1X2NoYXIgKmRwOworI2VuZGlmCisJCSAgICB1X2ludCBkYXRhX29mZiA9IHNpemVvZihzdHJ1Y3QgbWluc2VnaGRyKTsKKworCQkgICAgaWYgKG5zcGxlbiA8IGRhdGFfb2ZmKQorCQkJZ290byB0cnVuYzsKKwkJICAgIFRDSEVDSyhzaHAtPnNoX3NlcVswXSk7CisJCSAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhzaHAtPnNoX3NlcVswXSk7CisJCSAgICBpZiAoYWNrICYgU0dRX0FDSykgewkvKiBhY2tudW0gZmllbGQgKi8KKwkJCWlmICgoYWNrICYgU0dRX05BSykgPT0gU0dRX05BSykKKwkJCSAgICAodm9pZClwcmludGYoIm5hayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQllbHNlCisJCQkgICAgKHZvaWQpcHJpbnRmKCJhY2sgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJZGF0YV9vZmYgKz0gc2l6ZW9mKHNob3J0KTsKKwkJCWlmIChuc3BsZW4gPCBkYXRhX29mZikKKwkJCSAgICBnb3RvIHRydW5jOworCQkJVENIRUNLKHNocC0+c2hfc2VxWzFdKTsKKwkJICAgICAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhzaHAtPnNoX3NlcVsxXSk7CisJCQlpZiAoYWNrICYgU0dRX09BQ0spIHsJLyogYWNrZGF0IGZpZWxkICovCisJCQkgICAgaWYgKChhY2sgJiBTR1FfT05BSykgPT0gU0dRX09OQUspCisJCQkJKHZvaWQpcHJpbnRmKCJuYWtkYXQgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJICAgIGVsc2UKKwkJCQkodm9pZClwcmludGYoImFja2RhdCAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQkgICAgZGF0YV9vZmYgKz0gc2l6ZW9mKHNob3J0KTsKKwkJCSAgICBpZiAobnNwbGVuIDwgZGF0YV9vZmYpCisJCQkJZ290byB0cnVuYzsKKwkJCSAgICBUQ0hFQ0soc2hwLT5zaF9zZXFbMl0pOworCQkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzJdKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgICh2b2lkKXByaW50Zigic2VnICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKyNpZmRlZglQUklOVF9OU1BEQVRBCisJCSAgICBpZiAobnNwbGVuID4gZGF0YV9vZmYpIHsKKwkJCWRwID0gJihuc3BwW2RhdGFfb2ZmXSk7CisJCQlUQ0hFQ0syKCpkcCwgbnNwbGVuIC0gZGF0YV9vZmYpOworCQkJcGRhdGEoZHAsIG5zcGxlbiAtIGRhdGFfb2ZmKTsKKwkJICAgIH0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIE1GU19JTFM6CisJCSh2b2lkKXByaW50ZigibGluay1zZXJ2aWNlICVkPiVkICIsIHNyYywgZHN0KTsKKwkJeworCQkgICAgc3RydWN0IHNlZ2hkciAqc2hwID0gKHN0cnVjdCBzZWdoZHIgKiluc3BwOworCQkgICAgc3RydWN0IGxzbXNnICpsc21wID0KKwkJCShzdHJ1Y3QgbHNtc2cgKikmKG5zcHBbc2l6ZW9mKHN0cnVjdCBzZWdoZHIpXSk7CisJCSAgICBpbnQgYWNrOworCQkgICAgaW50IGxzZmxhZ3MsIGZjdmFsOworCisJCSAgICBpZiAobnNwbGVuIDwgc2l6ZW9mKHN0cnVjdCBzZWdoZHIpICsgc2l6ZW9mKHN0cnVjdCBsc21zZykpCisJCQlnb3RvIHRydW5jOworCQkgICAgVENIRUNLKHNocC0+c2hfc2VxWzBdKTsKKwkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzBdKTsKKwkJICAgIGlmIChhY2sgJiBTR1FfQUNLKSB7CS8qIGFja251bSBmaWVsZCAqLworCQkJaWYgKChhY2sgJiBTR1FfTkFLKSA9PSBTR1FfTkFLKQorCQkJICAgICh2b2lkKXByaW50ZigibmFrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCWVsc2UKKwkJCSAgICAodm9pZClwcmludGYoImFjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQlUQ0hFQ0soc2hwLT5zaF9zZXFbMV0pOworCQkgICAgICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzFdKTsKKwkJCWlmIChhY2sgJiBTR1FfT0FDSykgewkvKiBhY2tkYXQgZmllbGQgKi8KKwkJCSAgICBpZiAoKGFjayAmIFNHUV9PTkFLKSA9PSBTR1FfT05BSykKKwkJCQkodm9pZClwcmludGYoIm5ha2RhdCAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQkgICAgZWxzZQorCQkJCSh2b2lkKXByaW50ZigiYWNrZGF0ICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCSAgICBUQ0hFQ0soc2hwLT5zaF9zZXFbMl0pOworCQkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzJdKTsKKwkJCX0KKwkJICAgIH0KKwkJICAgICh2b2lkKXByaW50Zigic2VnICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJICAgIFRDSEVDSygqbHNtcCk7CisJCSAgICBsc2ZsYWdzID0gRVhUUkFDVF9MRV84QklUUyhsc21wLT5sc19sc2ZsYWdzKTsKKwkJICAgIGZjdmFsID0gRVhUUkFDVF9MRV84QklUUyhsc21wLT5sc19mY3ZhbCk7CisJCSAgICBzd2l0Y2ggKGxzZmxhZ3MgJiBMU0lfTUFTSykgeworCQkgICAgY2FzZSBMU0lfREFUQToKKwkJCSh2b2lkKXByaW50ZigiZGF0IHNlZyBjb3VudCAlZCAiLCBmY3ZhbCk7CisJCQlzd2l0Y2ggKGxzZmxhZ3MgJiBMU01fTUFTSykgeworCQkJY2FzZSBMU01fTk9DSEFOR0U6CisJCQkgICAgYnJlYWs7CisJCQljYXNlIExTTV9ET05PVFNFTkQ6CisJCQkgICAgKHZvaWQpcHJpbnRmKCJkb25vdHNlbmQtZGF0YSAiKTsKKwkJCSAgICBicmVhazsKKwkJCWNhc2UgTFNNX1NFTkQ6CisJCQkgICAgKHZvaWQpcHJpbnRmKCJzZW5kLWRhdGEgIik7CisJCQkgICAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICAgICh2b2lkKXByaW50ZigicmVzZXJ2ZWQtZmNtb2Q/ICV4IiwgbHNmbGFncyk7CisJCQkgICAgYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJICAgIGNhc2UgTFNJX0lOVFI6CisJCQkodm9pZClwcmludGYoImludHIgcmVxIGNvdW50ICVkICIsIGZjdmFsKTsKKwkJCWJyZWFrOworCQkgICAgZGVmYXVsdDoKKwkJCSh2b2lkKXByaW50ZigicmVzZXJ2ZWQtZmN2YWwtaW50PyAleCIsIGxzZmxhZ3MpOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCSh2b2lkKXByaW50ZigicmVzZXJ2ZWQtc3VidHlwZT8gJXggJWQgPiAlZCIsIGZsYWdzLCBzcmMsIGRzdCk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTUZUX0FDSzoKKwkgICAgc3dpdGNoIChmbGFncyAmIE5TUF9TVUJNQVNLKSB7CisJICAgIGNhc2UgTUZTX0RBQ0s6CisJCSh2b2lkKXByaW50ZigiZGF0YS1hY2sgJWQ+JWQgIiwgc3JjLCBkc3QpOworCQl7CisJCSAgICBzdHJ1Y3QgYWNrbXNnICphbXAgPSAoc3RydWN0IGFja21zZyAqKW5zcHA7CisJCSAgICBpbnQgYWNrOworCisJCSAgICBpZiAobnNwbGVuIDwgc2l6ZW9mKHN0cnVjdCBhY2ttc2cpKQorCQkJZ290byB0cnVuYzsKKwkJICAgIFRDSEVDSygqYW1wKTsKKwkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKGFtcC0+YWtfYWNrbnVtWzBdKTsKKwkJICAgIGlmIChhY2sgJiBTR1FfQUNLKSB7CS8qIGFja251bSBmaWVsZCAqLworCQkJaWYgKChhY2sgJiBTR1FfTkFLKSA9PSBTR1FfTkFLKQorCQkJICAgICh2b2lkKXByaW50ZigibmFrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCWVsc2UKKwkJCSAgICAodm9pZClwcmludGYoImFjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCSAgICAgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoYW1wLT5ha19hY2tudW1bMV0pOworCQkJaWYgKGFjayAmIFNHUV9PQUNLKSB7CS8qIGFja290aCBmaWVsZCAqLworCQkJICAgIGlmICgoYWNrICYgU0dRX09OQUspID09IFNHUV9PTkFLKQorCQkJCSh2b2lkKXByaW50Zigib25hayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQkgICAgZWxzZQorCQkJCSh2b2lkKXByaW50Zigib2FjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7CisJCQl9CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgTUZTX0lBQ0s6CisJCSh2b2lkKXByaW50ZigiaWxzLWFjayAlZD4lZCAiLCBzcmMsIGRzdCk7CisJCXsKKwkJICAgIHN0cnVjdCBhY2ttc2cgKmFtcCA9IChzdHJ1Y3QgYWNrbXNnICopbnNwcDsKKwkJICAgIGludCBhY2s7CisKKwkJICAgIGlmIChuc3BsZW4gPCBzaXplb2Yoc3RydWN0IGFja21zZykpCisJCQlnb3RvIHRydW5jOworCQkgICAgVENIRUNLKCphbXApOworCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoYW1wLT5ha19hY2tudW1bMF0pOworCQkgICAgaWYgKGFjayAmIFNHUV9BQ0spIHsJLyogYWNrbnVtIGZpZWxkICovCisJCQlpZiAoKGFjayAmIFNHUV9OQUspID09IFNHUV9OQUspCisJCQkgICAgKHZvaWQpcHJpbnRmKCJuYWsgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJZWxzZQorCQkJICAgICh2b2lkKXByaW50ZigiYWNrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCVRDSEVDSyhhbXAtPmFrX2Fja251bVsxXSk7CisJCSAgICAgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoYW1wLT5ha19hY2tudW1bMV0pOworCQkJaWYgKGFjayAmIFNHUV9PQUNLKSB7CS8qIGFja2RhdCBmaWVsZCAqLworCQkJICAgIGlmICgoYWNrICYgU0dRX09OQUspID09IFNHUV9PTkFLKQorCQkJCSh2b2lkKXByaW50ZigibmFrZGF0ICVkICIsIGFjayAmIFNHUV9NQVNLKTsKKwkJCSAgICBlbHNlCisJCQkJKHZvaWQpcHJpbnRmKCJhY2tkYXQgJWQgIiwgYWNrICYgU0dRX01BU0spOworCQkJfQorCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIE1GU19DQUNLOgorCQkodm9pZClwcmludGYoImNvbm4tYWNrICVkIiwgZHN0KTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCSh2b2lkKXByaW50ZigicmVzZXJ2ZWQtYWNrdHlwZT8gJXggJWQgPiAlZCIsIGZsYWdzLCBzcmMsIGRzdCk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgTUZUX0NUTDoKKwkgICAgc3dpdGNoIChmbGFncyAmIE5TUF9TVUJNQVNLKSB7CisJICAgIGNhc2UgTUZTX0NJOgorCSAgICBjYXNlIE1GU19SQ0k6CisJCWlmICgoZmxhZ3MgJiBOU1BfU1VCTUFTSykgPT0gTUZTX0NJKQorCQkgICAgKHZvaWQpcHJpbnRmKCJjb25uLWluaXRpYXRlICIpOworCQllbHNlCisJCSAgICAodm9pZClwcmludGYoInJldHJhbnMtY29ubi1pbml0aWF0ZSAiKTsKKwkJKHZvaWQpcHJpbnRmKCIlZD4lZCAiLCBzcmMsIGRzdCk7CisJCXsKKwkJICAgIHN0cnVjdCBjaW1zZyAqY2ltcCA9IChzdHJ1Y3QgY2ltc2cgKiluc3BwOworCQkgICAgaW50IHNlcnZpY2VzLCBpbmZvLCBzZWdzaXplOworI2lmZGVmCVBSSU5UX05TUERBVEEKKwkJICAgIHVfY2hhciAqZHA7CisjZW5kaWYKKworCQkgICAgaWYgKG5zcGxlbiA8IHNpemVvZihzdHJ1Y3QgY2ltc2cpKQorCQkJZ290byB0cnVuYzsKKwkJICAgIFRDSEVDSygqY2ltcCk7CisJCSAgICBzZXJ2aWNlcyA9IEVYVFJBQ1RfTEVfOEJJVFMoY2ltcC0+Y2lfc2VydmljZXMpOworCQkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY2ltcC0+Y2lfaW5mbyk7CisJCSAgICBzZWdzaXplID0gRVhUUkFDVF9MRV8xNkJJVFMoY2ltcC0+Y2lfc2Vnc2l6ZSk7CisKKwkJICAgIHN3aXRjaCAoc2VydmljZXMgJiBDT1NfTUFTSykgeworCQkgICAgY2FzZSBDT1NfTk9ORToKKwkJCWJyZWFrOworCQkgICAgY2FzZSBDT1NfU0VHTUVOVDoKKwkJCSh2b2lkKXByaW50Zigic2VnICIpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENPU19NRVNTQUdFOgorCQkJKHZvaWQpcHJpbnRmKCJtc2cgIik7CisJCQlicmVhazsKKwkJICAgIGNhc2UgQ09TX0NSWVBUU0VSOgorCQkJKHZvaWQpcHJpbnRmKCJjcnlwdCAiKTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgc3dpdGNoIChpbmZvICYgQ09JX01BU0spIHsKKwkJICAgIGNhc2UgQ09JXzMyOgorCQkJKHZvaWQpcHJpbnRmKCJ2ZXIgMy4yICIpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENPSV8zMToKKwkJCSh2b2lkKXByaW50ZigidmVyIDMuMSAiKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBDT0lfNDA6CisJCQkodm9pZClwcmludGYoInZlciA0LjAgIik7CisJCQlicmVhazsKKwkJICAgIGNhc2UgQ09JXzQxOgorCQkJKHZvaWQpcHJpbnRmKCJ2ZXIgNC4xICIpOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICAodm9pZClwcmludGYoInNlZ3NpemUgJWQgIiwgc2Vnc2l6ZSk7CisjaWZkZWYJUFJJTlRfTlNQREFUQQorCQkgICAgaWYgKG5zcGxlbiA+IHNpemVvZihzdHJ1Y3QgY2ltc2cpKSB7CisJCQlkcCA9ICYobnNwcFtzaXplb2Yoc3RydWN0IGNpbXNnKV0pOworCQkJVENIRUNLMigqZHAsIG5zcGxlbiAtIHNpemVvZihzdHJ1Y3QgY2ltc2cpKTsKKwkJCXBkYXRhKGRwLCBuc3BsZW4gLSBzaXplb2Yoc3RydWN0IGNpbXNnKSk7CisJCSAgICB9CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSBNRlNfQ0M6CisJCSh2b2lkKXByaW50ZigiY29ubi1jb25maXJtICVkPiVkICIsIHNyYywgZHN0KTsKKwkJeworCQkgICAgc3RydWN0IGNjbXNnICpjY21wID0gKHN0cnVjdCBjY21zZyAqKW5zcHA7CisJCSAgICBpbnQgc2VydmljZXMsIGluZm87CisJCSAgICB1X2ludCBzZWdzaXplLCBvcHRsZW47CisjaWZkZWYJUFJJTlRfTlNQREFUQQorCQkgICAgdV9jaGFyICpkcDsKKyNlbmRpZgorCisJCSAgICBpZiAobnNwbGVuIDwgc2l6ZW9mKHN0cnVjdCBjY21zZykpCisJCQlnb3RvIHRydW5jOworCQkgICAgVENIRUNLKCpjY21wKTsKKwkJICAgIHNlcnZpY2VzID0gRVhUUkFDVF9MRV84QklUUyhjY21wLT5jY19zZXJ2aWNlcyk7CisJCSAgICBpbmZvID0gRVhUUkFDVF9MRV84QklUUyhjY21wLT5jY19pbmZvKTsKKwkJICAgIHNlZ3NpemUgPSBFWFRSQUNUX0xFXzE2QklUUyhjY21wLT5jY19zZWdzaXplKTsKKwkJICAgIG9wdGxlbiA9IEVYVFJBQ1RfTEVfOEJJVFMoY2NtcC0+Y2Nfb3B0bGVuKTsKKworCQkgICAgc3dpdGNoIChzZXJ2aWNlcyAmIENPU19NQVNLKSB7CisJCSAgICBjYXNlIENPU19OT05FOgorCQkJYnJlYWs7CisJCSAgICBjYXNlIENPU19TRUdNRU5UOgorCQkJKHZvaWQpcHJpbnRmKCJzZWcgIik7CisJCQlicmVhazsKKwkJICAgIGNhc2UgQ09TX01FU1NBR0U6CisJCQkodm9pZClwcmludGYoIm1zZyAiKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBDT1NfQ1JZUFRTRVI6CisJCQkodm9pZClwcmludGYoImNyeXB0ICIpOworCQkJYnJlYWs7CisJCSAgICB9CisJCSAgICBzd2l0Y2ggKGluZm8gJiBDT0lfTUFTSykgeworCQkgICAgY2FzZSBDT0lfMzI6CisJCQkodm9pZClwcmludGYoInZlciAzLjIgIik7CisJCQlicmVhazsKKwkJICAgIGNhc2UgQ09JXzMxOgorCQkJKHZvaWQpcHJpbnRmKCJ2ZXIgMy4xICIpOworCQkJYnJlYWs7CisJCSAgICBjYXNlIENPSV80MDoKKwkJCSh2b2lkKXByaW50ZigidmVyIDQuMCAiKTsKKwkJCWJyZWFrOworCQkgICAgY2FzZSBDT0lfNDE6CisJCQkodm9pZClwcmludGYoInZlciA0LjEgIik7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgICh2b2lkKXByaW50Zigic2Vnc2l6ZSAlZCAiLCBzZWdzaXplKTsKKwkJICAgIGlmIChvcHRsZW4pIHsKKwkJCSh2b2lkKXByaW50Zigib3B0bGVuICVkICIsIG9wdGxlbik7CisjaWZkZWYJUFJJTlRfTlNQREFUQQorCQkJaWYgKG9wdGxlbiA+IG5zcGxlbiAtIHNpemVvZihzdHJ1Y3QgY2Ntc2cpKQorCQkJICAgIGdvdG8gdHJ1bmM7CisJCQlkcCA9ICYobnNwcFtzaXplb2Yoc3RydWN0IGNjbXNnKV0pOworCQkJVENIRUNLMigqZHAsIG9wdGxlbik7CisJCQlwZGF0YShkcCwgb3B0bGVuKTsKKyNlbmRpZgorCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIE1GU19ESToKKwkJKHZvaWQpcHJpbnRmKCJkaXNjb25uLWluaXRpYXRlICVkPiVkICIsIHNyYywgZHN0KTsKKwkJeworCQkgICAgc3RydWN0IGRpbXNnICpkaW1wID0gKHN0cnVjdCBkaW1zZyAqKW5zcHA7CisJCSAgICBpbnQgcmVhc29uOworCQkgICAgdV9pbnQgb3B0bGVuOworI2lmZGVmCVBSSU5UX05TUERBVEEKKwkJICAgIHVfY2hhciAqZHA7CisjZW5kaWYKKworCQkgICAgaWYgKG5zcGxlbiA8IHNpemVvZihzdHJ1Y3QgZGltc2cpKQorCQkJZ290byB0cnVuYzsKKwkJICAgIFRDSEVDSygqZGltcCk7CisJCSAgICByZWFzb24gPSBFWFRSQUNUX0xFXzE2QklUUyhkaW1wLT5kaV9yZWFzb24pOworCQkgICAgb3B0bGVuID0gRVhUUkFDVF9MRV84QklUUyhkaW1wLT5kaV9vcHRsZW4pOworCisJCSAgICBwcmludF9yZWFzb24ocmVhc29uKTsKKwkJICAgIGlmIChvcHRsZW4pIHsKKwkJCSh2b2lkKXByaW50Zigib3B0bGVuICVkICIsIG9wdGxlbik7CisjaWZkZWYJUFJJTlRfTlNQREFUQQorCQkJaWYgKG9wdGxlbiA+IG5zcGxlbiAtIHNpemVvZihzdHJ1Y3QgZGltc2cpKQorCQkJICAgIGdvdG8gdHJ1bmM7CisJCQlkcCA9ICYobnNwcFtzaXplb2Yoc3RydWN0IGRpbXNnKV0pOworCQkJVENIRUNLMigqZHAsIG9wdGxlbik7CisJCQlwZGF0YShkcCwgb3B0bGVuKTsKKyNlbmRpZgorCQkgICAgfQorCQl9CisJCWJyZWFrOworCSAgICBjYXNlIE1GU19EQzoKKwkJKHZvaWQpcHJpbnRmKCJkaXNjb25uLWNvbmZpcm0gJWQ+JWQgIiwgc3JjLCBkc3QpOworCQl7CisJCSAgICBzdHJ1Y3QgZGNtc2cgKmRjbXAgPSAoc3RydWN0IGRjbXNnICopbnNwcDsKKwkJICAgIGludCByZWFzb247CisKKwkJICAgIFRDSEVDSygqZGNtcCk7CisJCSAgICByZWFzb24gPSBFWFRSQUNUX0xFXzE2QklUUyhkY21wLT5kY19yZWFzb24pOworCisJCSAgICBwcmludF9yZWFzb24ocmVhc29uKTsKKwkJfQorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1jdGx0eXBlPyAleCAlZCA+ICVkIiwgZmxhZ3MsIHNyYywgZHN0KTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC10eXBlPyAleCAlZCA+ICVkIiwgZmxhZ3MsIHNyYywgZHN0KTsKKwkgICAgYnJlYWs7CisJfQorCXJldHVybiAoMSk7CisKK3RydW5jOgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHJlYXNvbjJzdHJbXSA9IHsKKwl7IFVDX09CSlJFSkVDVCwJCSJvYmplY3QgcmVqZWN0ZWQgY29ubmVjdCIgfSwKKwl7IFVDX1JFU09VUkNFUywJCSJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiB9LAorCXsgVUNfTk9TVUNITk9ERSwJInVucmVjb2duaXplZCBub2RlIG5hbWUiIH0sCisJeyBESV9TSFVULAkJIm5vZGUgaXMgc2h1dHRpbmcgZG93biIgfSwKKwl7IFVDX05PU1VDSE9CSiwJCSJ1bnJlY29nbml6ZWQgb2JqZWN0IiB9LAorCXsgVUNfSU5WT0JKRk9STUFULAkiaW52YWxpZCBvYmplY3QgbmFtZSBmb3JtYXQiIH0sCisJeyBVQ19PQkpUT09CVVNZLAkib2JqZWN0IHRvbyBidXN5IiB9LAorCXsgRElfUFJPVE9DT0wsCQkicHJvdG9jb2wgZXJyb3IgZGlzY292ZXJlZCIgfSwKKwl7IERJX1RQQSwJCSJ0aGlyZCBwYXJ0eSBhYm9ydCIgfSwKKwl7IFVDX1VTRVJBQk9SVCwJCSJ1c2VyIGFib3J0IiB9LAorCXsgVUNfSU5WTk9ERUZPUk1BVCwJImludmFsaWQgbm9kZSBuYW1lIGZvcm1hdCIgfSwKKwl7IFVDX0xPQ0FMU0hVVCwJCSJsb2NhbCBub2RlIHNodXR0aW5nIGRvd24iIH0sCisJeyBESV9MT0NBTFJFU1JDLAkiaW5zdWZmaWNpZW50IGxvY2FsIHJlc291cmNlcyIgfSwKKwl7IERJX1JFTVVTRVJSRVNSQywJImluc3VmZmljaWVudCByZW1vdGUgdXNlciByZXNvdXJjZXMiIH0sCisJeyBVQ19BQ0NFU1NSRUpFQ1QsCSJpbnZhbGlkIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uIiB9LAorCXsgRElfQkFEQUNDTlQsCQkiYmFkIEFDQ09VTlQgaW5mb3JtYXRpb24iIH0sCisJeyBVQ19OT1JFU1BPTlNFLAkibm8gcmVzcG9uc2UgZnJvbSBvYmplY3QiIH0sCisJeyBVQ19VTlJFQUNIQUJMRSwJIm5vZGUgdW5yZWFjaGFibGUiIH0sCisJeyBEQ19OT0xJTkssCQkibm8gbGluayB0ZXJtaW5hdGUiIH0sCisJeyBEQ19DT01QTEVURSwJCSJkaXNjb25uZWN0IGNvbXBsZXRlIiB9LAorCXsgRElfQkFESU1BR0UsCQkiYmFkIGltYWdlIGRhdGEgaW4gY29ubmVjdCIgfSwKKwl7IERJX1NFUlZNSVNNQVRDSCwJImNyeXB0b2dyYXBoaWMgc2VydmljZSBtaXNtYXRjaCIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgdm9pZAorcHJpbnRfcmVhc29uKHJlZ2lzdGVyIGludCByZWFzb24pCit7CisJcHJpbnRmKCIlcyAiLCB0b2syc3RyKHJlYXNvbjJzdHIsICJyZWFzb24tJWQiLCByZWFzb24pKTsKK30KKworY29uc3QgY2hhciAqCitkbm51bV9zdHJpbmcodV9zaG9ydCBkbmFkZHIpCit7CisJY2hhciAqc3RyOworCXNpemVfdCBzaXo7CisJaW50IGFyZWEgPSAodV9zaG9ydCkoZG5hZGRyICYgQVJFQU1BU0spID4+IEFSRUFTSElGVDsKKwlpbnQgbm9kZSA9IGRuYWRkciAmIE5PREVNQVNLOworCisJc3RyID0gKGNoYXIgKiltYWxsb2Moc2l6ID0gc2l6ZW9mKCIwMC4wMDAwIikpOworCWlmIChzdHIgPT0gTlVMTCkKKwkJZXJyb3IoImRubnVtX3N0cmluZzogbWFsbG9jIik7CisJc25wcmludGYoc3RyLCBzaXosICIlZC4lZCIsIGFyZWEsIG5vZGUpOworCXJldHVybihzdHIpOworfQorCitjb25zdCBjaGFyICoKK2RubmFtZV9zdHJpbmcodV9zaG9ydCBkbmFkZHIpCit7CisjaWZkZWYgSEFWRV9ETkVUX0hUT0EKKwlzdHJ1Y3QgZG5fbmFkZHIgZG5hOworCisJZG5hLmFfbGVuID0gc2l6ZW9mKHNob3J0KTsKKwltZW1jcHkoKGNoYXIgKilkbmEuYV9hZGRyLCAoY2hhciAqKSZkbmFkZHIsIHNpemVvZihzaG9ydCkpOworCXJldHVybiAoc3RyZHVwKGRuZXRfaHRvYSgmZG5hKSkpOworI2Vsc2UKKwlyZXR1cm4oZG5udW1fc3RyaW5nKGRuYWRkcikpOwkvKiBwdW50ICovCisjZW5kaWYKK30KKworI2lmZGVmCVBSSU5UX05TUERBVEEKK3N0YXRpYyB2b2lkCitwZGF0YSh1X2NoYXIgKmRwLCB1X2ludCBtYXhsZW4pCit7CisJY2hhciBjOworCXVfaW50IHggPSBtYXhsZW47CisKKwl3aGlsZSAoeC0tID4gMCkgeworCSAgICBjID0gKmRwKys7CisJICAgIHNhZmVwdXRjaGFyKGMpOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcHJpbnQtZGhjcDYuYyBiL3ByaW50LWRoY3A2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0OTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWRoY3A2LmMKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggYW5kIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKy8qCisgKiBSRkMzMzE1OiBESENQdjYKKyAqIHN1cHBvcnRlZCBESENQdjYgb3B0aW9uczogCisgKiAgUkZDMzMxOSwKKyAqICBSRkMzNjMzLAorICogIFJGQzM2NDYsCisgKiAgUkZDMzg5OCwKKyAqICBSRkM0MDc1LAorICogIFJGQzQyNDIsCisgKiAgUkZDNDI4MCwKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1kaGNwNi5jLHYgMS4zNS4yLjEgMjAwNi8xMC8yNSAyMjowNDozNiBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworLyogbGVhc2UgZHVyYXRpb24gKi8KKyNkZWZpbmUgREhDUDZfRFVSQVRJVElPTl9JTkZJTklURSAweGZmZmZmZmZmCisKKy8qIEVycm9yIFZhbHVlcyAqLworI2RlZmluZSBESDZFUlJfRkFJTFVSRQkJMTYKKyNkZWZpbmUgREg2RVJSX0FVVEhGQUlMCQkxNworI2RlZmluZSBESDZFUlJfUE9PUkxZRk9STUVECTE4CisjZGVmaW5lIERINkVSUl9VTkFWQUlMCQkxOQorI2RlZmluZSBESDZFUlJfT1BUVU5BVkFJTAkyMAorCisvKiBNZXNzYWdlIHR5cGUgKi8KKyNkZWZpbmUgREg2X1NPTElDSVQJMQorI2RlZmluZSBESDZfQURWRVJUSVNFCTIKKyNkZWZpbmUgREg2X1JFUVVFU1QJMworI2RlZmluZSBESDZfQ09ORklSTQk0CisjZGVmaW5lIERINl9SRU5FVwk1CisjZGVmaW5lIERINl9SRUJJTkQJNgorI2RlZmluZSBESDZfUkVQTFkJNworI2RlZmluZSBESDZfUkVMRUFTRQk4CisjZGVmaW5lIERINl9ERUNMSU5FCTkKKyNkZWZpbmUgREg2X1JFQ09ORklHVVJFCTEwCisjZGVmaW5lIERINl9JTkZPUk1fUkVRCTExCisjZGVmaW5lIERINl9SRUxBWV9GT1JXCTEyCisjZGVmaW5lIERINl9SRUxBWV9SRVBMWQkxMworCisvKiBESENQNiBiYXNlIHBhY2tldCBmb3JtYXQgKi8KK3N0cnVjdCBkaGNwNiB7CisJdW5pb24geworCQl1X2ludDhfdCBtOworCQl1X2ludDMyX3QgeDsKKwl9IGRoNl9tc2d0eXBleGlkOworCS8qIG9wdGlvbnMgZm9sbG93ICovCit9OworI2RlZmluZSBkaDZfbXNndHlwZQlkaDZfbXNndHlwZXhpZC5tCisjZGVmaW5lIGRoNl94aWQJCWRoNl9tc2d0eXBleGlkLngKKyNkZWZpbmUgREg2X1hJRE1BU0sJMHgwMGZmZmZmZgorCisvKiBESENQdjYgcmVsYXkgbWVzc2FnZXMgKi8KK3N0cnVjdCBkaGNwNl9yZWxheSB7CisJdV9pbnQ4X3QgZGg2cmVsYXlfbXNndHlwZTsKKwl1X2ludDhfdCBkaDZyZWxheV9oY250OworCXVfaW50OF90IGRoNnJlbGF5X2xpbmthZGRyWzE2XTsJLyogWFhYOiBiYWRseSBhbGlnbmVkICovCisJdV9pbnQ4X3QgZGg2cmVsYXlfcGVlcmFkZHJbMTZdOworCS8qIG9wdGlvbnMgZm9sbG93ICovCit9OworCisvKiBvcHRpb25zICovCisjZGVmaW5lIERINk9QVF9DTElFTlRJRAkxCisjZGVmaW5lIERINk9QVF9TRVJWRVJJRAkyCisjZGVmaW5lIERINk9QVF9JQV9OQSAzCisjZGVmaW5lIERINk9QVF9JQV9UQSA0CisjZGVmaW5lIERINk9QVF9JQV9BRERSIDUKKyNkZWZpbmUgREg2T1BUX09STyA2CisjZGVmaW5lIERINk9QVF9QUkVGRVJFTkNFIDcKKyMgIGRlZmluZSBESDZPUFRfUFJFRl9NQVggMjU1CisjZGVmaW5lIERINk9QVF9FTEFQU0VEX1RJTUUgOAorI2RlZmluZSBESDZPUFRfUkVMQVlfTVNHIDkKKy8qI2RlZmluZSBESDZPUFRfU0VSVkVSX01TRyAxMCBkZXByZWNhdGVkICovCisjZGVmaW5lIERINk9QVF9BVVRIIDExCisjICBkZWZpbmUgREg2T1BUX0FVVEhQUk9UT19ERUxBWUVEIDIKKyMgIGRlZmluZSBESDZPUFRfQVVUSFBST1RPX1JFQ09ORklHIDMKKyMgIGRlZmluZSBESDZPUFRfQVVUSEFMR19ITUFDTUQ1IDEKKyMgIGRlZmluZSBESDZPUFRfQVVUSFJETV9NT05PQ09VTlRFUiAwCisjICBkZWZpbmUgREg2T1BUX0FVVEhSRUNPTkZJR19LRVkgMQorIyAgZGVmaW5lIERINk9QVF9BVVRIUkVDT05GSUdfSE1BQ01ENSAyCisjZGVmaW5lIERINk9QVF9VTklDQVNUIDEyCisjZGVmaW5lIERINk9QVF9TVEFUVVNfQ09ERSAxMworIyAgZGVmaW5lIERINk9QVF9TVENPREVfU1VDQ0VTUyAwCisjICBkZWZpbmUgREg2T1BUX1NUQ09ERV9VTlNQRUNGQUlMIDEKKyMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PQUREUkFWQUlMIDIKKyMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PQklORElORyAzCisjICBkZWZpbmUgREg2T1BUX1NUQ09ERV9OT1RPTkxJTksgNAorIyAgZGVmaW5lIERINk9QVF9TVENPREVfVVNFTVVMVElDQVNUIDUKKyMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PUFJFRklYQVZBSUwgNgorI2RlZmluZSBESDZPUFRfUkFQSURfQ09NTUlUIDE0CisjZGVmaW5lIERINk9QVF9VU0VSX0NMQVNTIDE1CisjZGVmaW5lIERINk9QVF9WRU5ET1JfQ0xBU1MgMTYKKyNkZWZpbmUgREg2T1BUX1ZFTkRPUl9PUFRTIDE3CisjZGVmaW5lIERINk9QVF9JTlRFUkZBQ0VfSUQgMTgKKyNkZWZpbmUgREg2T1BUX1JFQ09ORl9NU0cgMTkKKyNkZWZpbmUgREg2T1BUX1JFQ09ORl9BQ0NFUFQgMjAKKyNkZWZpbmUgREg2T1BUX1NJUF9TRVJWRVJfRCAyMQorI2RlZmluZSBESDZPUFRfU0lQX1NFUlZFUl9BIDIyCisjZGVmaW5lIERINk9QVF9ETlMgMjMKKyNkZWZpbmUgREg2T1BUX0ROU05BTUUgMjQKKyNkZWZpbmUgREg2T1BUX0lBX1BEIDI1CisjZGVmaW5lIERINk9QVF9JQV9QRF9QUkVGSVggMjYKKyNkZWZpbmUgREg2T1BUX05JU19TRVJWRVJTIDI3CisjZGVmaW5lIERINk9QVF9OSVNQX1NFUlZFUlMgMjgKKyNkZWZpbmUgREg2T1BUX05JU19OQU1FIDI5CisjZGVmaW5lIERINk9QVF9OSVNQX05BTUUgMzAKKyNkZWZpbmUgREg2T1BUX05UUF9TRVJWRVJTIDMxCisjZGVmaW5lIERINk9QVF9MSUZFVElNRSAzMgorI2RlZmluZSBESDZPUFRfQkNNQ1NfU0VSVkVSX0QgMzMKKyNkZWZpbmUgREg2T1BUX0JDTUNTX1NFUlZFUl9BIDM0CisjZGVmaW5lIERINk9QVF9HRU9DT05GX0NJVklDIDM2CisjZGVmaW5lIERINk9QVF9SRU1PVEVfSUQgMzcKKyNkZWZpbmUgREg2T1BUX1NVQlNDUklCRVJfSUQgMzgKKyNkZWZpbmUgREg2T1BUX0NMSUVOVF9GUUROIDM5CisKK3N0cnVjdCBkaGNwNm9wdCB7CisJdV9pbnQxNl90IGRoNm9wdF90eXBlOworCXVfaW50MTZfdCBkaDZvcHRfbGVuOworCS8qIHR5cGUtZGVwZW5kZW50IGRhdGEgZm9sbG93cyAqLworfTsKKworc3RydWN0IGRoY3A2X2lhIHsKKwl1X2ludDE2X3QgZGg2b3B0X2lhX3R5cGU7CisJdV9pbnQxNl90IGRoNm9wdF9pYV9sZW47CisJdV9pbnQzMl90IGRoNm9wdF9pYV9pYWlkOworCXVfaW50MzJfdCBkaDZvcHRfaWFfdDE7CisJdV9pbnQzMl90IGRoNm9wdF9pYV90MjsKK307CisKK3N0cnVjdCBkaGNwNl9pYV9hZGRyIHsKKwl1X2ludDE2X3QgZGg2b3B0X2lhX2FkZHJfdHlwZTsKKwl1X2ludDE2X3QgZGg2b3B0X2lhX2FkZHJfbGVuOworCXN0cnVjdCBpbjZfYWRkciBkaDZvcHRfaWFfYWRkcl9hZGRyOworCXVfaW50MzJfdCBkaDZvcHRfaWFfYWRkcl9wbHRpbWU7CisJdV9pbnQzMl90IGRoNm9wdF9pYV9hZGRyX3ZsdGltZTsKK30gIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0cnVjdCBkaGNwNl9pYV9wcmVmaXggeworCXVfaW50MTZfdCBkaDZvcHRfaWFfcHJlZml4X3R5cGU7CisJdV9pbnQxNl90IGRoNm9wdF9pYV9wcmVmaXhfbGVuOworCXVfaW50MzJfdCBkaDZvcHRfaWFfcHJlZml4X3BsdGltZTsKKwl1X2ludDMyX3QgZGg2b3B0X2lhX3ByZWZpeF92bHRpbWU7CisJdV9pbnQ4X3QgZGg2b3B0X2lhX3ByZWZpeF9wbGVuOworCXN0cnVjdCBpbjZfYWRkciBkaDZvcHRfaWFfcHJlZml4X2FkZHI7Cit9ICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgZGhjcDZfYXV0aCB7CisJdV9pbnQxNl90IGRoNm9wdF9hdXRoX3R5cGU7CisJdV9pbnQxNl90IGRoNm9wdF9hdXRoX2xlbjsKKwl1X2ludDhfdCBkaDZvcHRfYXV0aF9wcm90bzsKKwl1X2ludDhfdCBkaDZvcHRfYXV0aF9hbGc7CisJdV9pbnQ4X3QgZGg2b3B0X2F1dGhfcmRtOworCXVfaW50OF90IGRoNm9wdF9hdXRoX3JkaW5mb1s4XTsKKwkvKiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb2xsb3dzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RoY3A2b3B0X25hbWUoaW50IHR5cGUpCit7CisJc3RhdGljIGNoYXIgZ2Vuc3RyW3NpemVvZigib3B0XzY1NTM1IikgKyAxXTsgLyogWFhYIHRocmVhZCB1bnNhZmUgKi8KKworCWlmICh0eXBlID4gNjU1MzUpCisJCXJldHVybiAiSU5WQUxJRCBvcHRpb24iOworCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIERINk9QVF9DTElFTlRJRDoKKwkJcmV0dXJuICJjbGllbnQgSUQiOworCWNhc2UgREg2T1BUX1NFUlZFUklEOgorCQlyZXR1cm4gInNlcnZlciBJRCI7CisJY2FzZSBESDZPUFRfSUFfTkE6CisJCXJldHVybiAiSUFfTkEiOworCWNhc2UgREg2T1BUX0lBX1RBOgorCQlyZXR1cm4gIklBX1RBIjsKKwljYXNlIERINk9QVF9JQV9BRERSOgorCQlyZXR1cm4gIklBX0FERFIiOworCWNhc2UgREg2T1BUX09STzoKKwkJcmV0dXJuICJvcHRpb24gcmVxdWVzdCI7CisJY2FzZSBESDZPUFRfUFJFRkVSRU5DRToKKwkJcmV0dXJuICJwcmVmZXJlbmNlIjsKKwljYXNlIERINk9QVF9FTEFQU0VEX1RJTUU6CisJCXJldHVybiAiZWxhcHNlZCB0aW1lIjsKKwljYXNlIERINk9QVF9SRUxBWV9NU0c6CisJCXJldHVybiAicmVsYXkgbWVzc2FnZSI7CisJY2FzZSBESDZPUFRfQVVUSDoKKwkJcmV0dXJuICJhdXRoZW50aWNhdGlvbiI7CisJY2FzZSBESDZPUFRfVU5JQ0FTVDoKKwkJcmV0dXJuICJzZXJ2ZXIgdW5pY2FzdCI7CisJY2FzZSBESDZPUFRfU1RBVFVTX0NPREU6CisJCXJldHVybiAic3RhdHVzIGNvZGUiOworCWNhc2UgREg2T1BUX1JBUElEX0NPTU1JVDoKKwkJcmV0dXJuICJyYXBpZCBjb21taXQiOworCWNhc2UgREg2T1BUX1VTRVJfQ0xBU1M6CisJCXJldHVybiAidXNlciBjbGFzcyI7CisJY2FzZSBESDZPUFRfVkVORE9SX0NMQVNTOgorCQlyZXR1cm4gInZlbmRvciBjbGFzcyI7CisJY2FzZSBESDZPUFRfVkVORE9SX09QVFM6CisJCXJldHVybiAidmVuZG9yLXNwZWNpZmljIGluZm8iOworCWNhc2UgREg2T1BUX0lOVEVSRkFDRV9JRDoKKwkJcmV0dXJuICJpbnRlcmZhY2UgSUQiOworCWNhc2UgREg2T1BUX1JFQ09ORl9NU0c6CisJCXJldHVybiAicmVjb25maWd1cmUgbWVzc2FnZSI7CisJY2FzZSBESDZPUFRfUkVDT05GX0FDQ0VQVDoKKwkJcmV0dXJuICJyZWNvbmZpZ3VyZSBhY2NlcHQiOworCWNhc2UgREg2T1BUX1NJUF9TRVJWRVJfRDoKKwkJcmV0dXJuICJTSVAgc2VydmVycyBkb21haW4iOworCWNhc2UgREg2T1BUX1NJUF9TRVJWRVJfQToKKwkJcmV0dXJuICJTSVAgc2VydmVycyBhZGRyZXNzIjsKKwljYXNlIERINk9QVF9ETlM6CisJCXJldHVybiAiRE5TIjsKKwljYXNlIERINk9QVF9ETlNOQU1FOgorCQlyZXR1cm4gIkROUyBuYW1lIjsKKwljYXNlIERINk9QVF9JQV9QRDoKKwkJcmV0dXJuICJJQV9QRCI7CisJY2FzZSBESDZPUFRfSUFfUERfUFJFRklYOgorCQlyZXR1cm4gIklBX1BEIHByZWZpeCI7CisJY2FzZSBESDZPUFRfTlRQX1NFUlZFUlM6CisJCXJldHVybiAiTlRQIFNlcnZlciI7CisJY2FzZSBESDZPUFRfTElGRVRJTUU6CisJCXJldHVybiAibGlmZXRpbWUiOworCWNhc2UgREg2T1BUX05JU19TRVJWRVJTOgorCQlyZXR1cm4gIk5JUyBzZXJ2ZXIiOworCWNhc2UgREg2T1BUX05JU1BfU0VSVkVSUzoKKwkJcmV0dXJuICJOSVMrIHNlcnZlciI7CisJY2FzZSBESDZPUFRfTklTX05BTUU6CisJCXJldHVybiAiTklTIGRvbWFpbiBuYW1lIjsKKwljYXNlIERINk9QVF9OSVNQX05BTUU6CisJCXJldHVybiAiTklTKyBkb21haW4gbmFtZSI7CisJY2FzZSBESDZPUFRfQkNNQ1NfU0VSVkVSX0Q6CisJCXJldHVybiAiQkNNQ1MgZG9tYWluIG5hbWUiOworCWNhc2UgREg2T1BUX0JDTUNTX1NFUlZFUl9BOgorCQlyZXR1cm4gIkJDTUNTIHNlcnZlciI7CisJY2FzZSBESDZPUFRfR0VPQ09ORl9DSVZJQzoKKwkJcmV0dXJuICJHZW9jb25mIENpdmljIjsKKwljYXNlIERINk9QVF9SRU1PVEVfSUQ6CisJCXJldHVybiAiUmVtb3RlIElEIjsKKwljYXNlIERINk9QVF9TVUJTQ1JJQkVSX0lEOgorCQlyZXR1cm4gIlN1YnNjcmliZXIgSUQiOworCWNhc2UgREg2T1BUX0NMSUVOVF9GUUROOgorCQlyZXR1cm4gIkNsaWVudCBGUUROIjsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihnZW5zdHIsIHNpemVvZihnZW5zdHIpLCAib3B0XyVkIiwgdHlwZSk7CisJCXJldHVybihnZW5zdHIpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZGhjcDZzdGNvZGUoaW50IGNvZGUpCit7CisJc3RhdGljIGNoYXIgZ2Vuc3RyW3NpemVvZigiY29kZTI1NSIpICsgMV07IC8qIFhYWCB0aHJlYWQgdW5zYWZlICovCisKKwlpZiAoY29kZSA+IDI1NSkKKwkJcmV0dXJuICJJTlZBTElEIGNvZGUiOworCisJc3dpdGNoKGNvZGUpIHsKKwljYXNlIERINk9QVF9TVENPREVfU1VDQ0VTUzoKKwkJcmV0dXJuICJzdWNjZXNzIjsKKwljYXNlIERINk9QVF9TVENPREVfVU5TUEVDRkFJTDoKKwkJcmV0dXJuICJ1bnNwZWMgZmFpbHVyZSI7CisJY2FzZSBESDZPUFRfU1RDT0RFX05PQUREUkFWQUlMOgorCQlyZXR1cm4gIm5vIGFkZHJlc3NlcyI7CisJY2FzZSBESDZPUFRfU1RDT0RFX05PQklORElORzoKKwkJcmV0dXJuICJubyBiaW5kaW5nIjsKKwljYXNlIERINk9QVF9TVENPREVfTk9UT05MSU5LOgorCQlyZXR1cm4gIm5vdCBvbi1saW5rIjsKKwljYXNlIERINk9QVF9TVENPREVfVVNFTVVMVElDQVNUOgorCQlyZXR1cm4gInVzZSBtdWx0aWNhc3QiOworCWNhc2UgREg2T1BUX1NUQ09ERV9OT1BSRUZJWEFWQUlMOgorCQlyZXR1cm4gIm5vIHByZWZpeGVzIjsKKwlkZWZhdWx0OgorCQlzbnByaW50ZihnZW5zdHIsIHNpemVvZihnZW5zdHIpLCAiY29kZSVkIiwgY29kZSk7CisJCXJldHVybihnZW5zdHIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2RoY3A2b3B0X3ByaW50KGNvbnN0IHVfY2hhciAqY3AsIGNvbnN0IHVfY2hhciAqZXApCit7CisJc3RydWN0IGRoY3A2b3B0ICpkaDZvOworCXVfY2hhciAqdHA7CisJc2l6ZV90IGk7CisJdV9pbnQxNl90IG9wdHR5cGU7CisJc2l6ZV90IG9wdGxlbjsKKwl1X2ludDE2X3QgdmFsMTY7CisJdV9pbnQzMl90IHZhbDMyOworCXN0cnVjdCBkaGNwNl9pYSBpYTsKKwlzdHJ1Y3QgZGhjcDZfaWFfcHJlZml4IGlhX3ByZWZpeDsKKwlzdHJ1Y3QgZGhjcDZfaWFfYWRkciBpYV9hZGRyOworCXN0cnVjdCBkaGNwNl9hdXRoIGF1dGhvcHQ7CisJdV9pbnQgYXV0aGluZm9sZW4sIGF1dGhyZWFsbWxlbjsKKworCWlmIChjcCA9PSBlcCkKKwkJcmV0dXJuOworCXdoaWxlIChjcCA8IGVwKSB7CisJCWlmIChlcCA8IGNwICsgc2l6ZW9mKCpkaDZvKSkKKwkJCWdvdG8gdHJ1bmM7CisJCWRoNm8gPSAoc3RydWN0IGRoY3A2b3B0ICopY3A7CisJCW9wdGxlbiA9IEVYVFJBQ1RfMTZCSVRTKCZkaDZvLT5kaDZvcHRfbGVuKTsKKwkJaWYgKGVwIDwgY3AgKyBzaXplb2YoKmRoNm8pICsgb3B0bGVuKQorCQkJZ290byB0cnVuYzsKKwkJb3B0dHlwZSA9IEVYVFJBQ1RfMTZCSVRTKCZkaDZvLT5kaDZvcHRfdHlwZSk7CisJCXByaW50ZigiICglcyIsIGRoY3A2b3B0X25hbWUob3B0dHlwZSkpOworCQlzd2l0Y2ggKG9wdHR5cGUpIHsKKwkJY2FzZSBESDZPUFRfQ0xJRU5USUQ6CisJCWNhc2UgREg2T1BUX1NFUlZFUklEOgorCQkJaWYgKG9wdGxlbiA8IDIpIHsKKwkJCQkvKigqLworCQkJCXByaW50ZigiID8pIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0cCA9ICh1X2NoYXIgKikoZGg2byArIDEpOworCQkJc3dpdGNoIChFWFRSQUNUXzE2QklUUyh0cCkpIHsKKwkJCWNhc2UgMToKKwkJCQlpZiAob3B0bGVuID49IDIgKyA2KSB7CisJCQkJCXByaW50ZigiIGh3YWRkci90aW1lIHR5cGUgJXUgdGltZSAldSAiLAorCQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJnRwWzJdKSwKKwkJCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZ0cFs0XSkpOworCQkJCQlmb3IgKGkgPSA4OyBpIDwgb3B0bGVuOyBpKyspCisJCQkJCQlwcmludGYoIiUwMngiLCB0cFtpXSk7CisJCQkJCS8qKCovCisJCQkJCXByaW50ZigiKSIpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qKCovCisJCQkJCXByaW50ZigiID8pIik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCWlmIChvcHRsZW4gPj0gMiArIDgpIHsKKwkJCQkJcHJpbnRmKCIgdmlkICIpOworCQkJCQlmb3IgKGkgPSAyOyBpIDwgMiArIDg7IGkrKykKKwkJCQkJCXByaW50ZigiJTAyeCIsIHRwW2ldKTsKKwkJCQkJLyooKi8KKwkJCQkJcHJpbnRmKCIpIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyooKi8KKwkJCQkJcHJpbnRmKCIgPykiKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJaWYgKG9wdGxlbiA+PSAyICsgMikgeworCQkJCQlwcmludGYoIiBod2FkZHIgdHlwZSAldSAiLAorCQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJnRwWzJdKSk7CisJCQkJCWZvciAoaSA9IDQ7IGkgPCBvcHRsZW47IGkrKykKKwkJCQkJCXByaW50ZigiJTAyeCIsIHRwW2ldKTsKKwkJCQkJLyooKi8KKwkJCQkJcHJpbnRmKCIpIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyooKi8KKwkJCQkJcHJpbnRmKCIgPykiKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiIHR5cGUgJWQpIiwgRVhUUkFDVF8xNkJJVFModHApKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9JQV9BRERSOgorCQkJaWYgKG9wdGxlbiA8IHNpemVvZihpYV9hZGRyKSAtIDQpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZpYV9hZGRyLCAodV9jaGFyICopZGg2bywgc2l6ZW9mKGlhX2FkZHIpKTsKKwkJCXByaW50ZigiICVzIiwKKwkJCSAgICBpcDZhZGRyX3N0cmluZygmaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9hZGRyKSk7CisJCQlpYV9hZGRyLmRoNm9wdF9pYV9hZGRyX3BsdGltZSA9CisJCQkgICAgbnRvaGwoaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9wbHRpbWUpOworCQkJaWFfYWRkci5kaDZvcHRfaWFfYWRkcl92bHRpbWUgPQorCQkJICAgIG50b2hsKGlhX2FkZHIuZGg2b3B0X2lhX2FkZHJfdmx0aW1lKTsKKwkJCXByaW50ZigiIHBsdGltZTolbHUgdmx0aW1lOiVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9wbHRpbWUsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfYWRkci5kaDZvcHRfaWFfYWRkcl92bHRpbWUpOworCQkJaWYgKG9wdGxlbiA+IHNpemVvZihpYV9hZGRyKSAtIDQpIHsKKwkJCQkvKiB0aGVyZSBhcmUgc3ViLW9wdGlvbnMgKi8KKwkJCQlkaGNwNm9wdF9wcmludCgodV9jaGFyICopZGg2byArCisJCQkJICAgIHNpemVvZihpYV9hZGRyKSwKKwkJCQkgICAgKHVfY2hhciAqKShkaDZvICsgMSkgKyBvcHRsZW4pOworCQkJfQorCQkJcHJpbnRmKCIpIik7CisJCQlicmVhazsKKwkJY2FzZSBESDZPUFRfT1JPOgorCQkJaWYgKG9wdGxlbiAlIDIpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJdHAgPSAodV9jaGFyICopKGRoNm8gKyAxKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47IGkgKz0gMikgeworCQkJCXVfaW50MTZfdCBvcHQ7CisKKwkJCQltZW1jcHkoJm9wdCwgJnRwW2ldLCBzaXplb2Yob3B0KSk7CisJCQkJcHJpbnRmKCIgJXMiLCBkaGNwNm9wdF9uYW1lKG50b2hzKG9wdCkpKTsKKwkJCX0KKwkJCXByaW50ZigiKSIpOworCQkJYnJlYWs7CisJCWNhc2UgREg2T1BUX1BSRUZFUkVOQ0U6CisJCQlpZiAob3B0bGVuICE9IDEpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIgJWQpIiwgKigodV9jaGFyICopKGRoNm8gKyAxKSArIDEpKTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9FTEFQU0VEX1RJTUU6CisJCQlpZiAob3B0bGVuICE9IDIpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZ2YWwxNiwgZGg2byArIDEsIHNpemVvZih2YWwxNikpOworCQkJdmFsMTYgPSBudG9ocyh2YWwxNik7CisJCQlwcmludGYoIiAlZCkiLCAoaW50KXZhbDE2KTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9SRUxBWV9NU0c6CisJCQlwcmludGYoIiAoIik7CisJCQlkaGNwNl9wcmludCgoY29uc3QgdV9jaGFyICopKGRoNm8gKyAxKSwgb3B0bGVuKTsKKwkJCXByaW50ZigiKSIpOworCQkJYnJlYWs7CisJCWNhc2UgREg2T1BUX0FVVEg6CisJCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGF1dGhvcHQpIC0gc2l6ZW9mKCpkaDZvKSkgeworCQkJCXByaW50ZigiID8pIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltZW1jcHkoJmF1dGhvcHQsIGRoNm8sIHNpemVvZihhdXRob3B0KSk7CisJCQlzd2l0Y2ggKGF1dGhvcHQuZGg2b3B0X2F1dGhfcHJvdG8pIHsKKwkJCWNhc2UgREg2T1BUX0FVVEhQUk9UT19ERUxBWUVEOgorCQkJCXByaW50ZigiIHByb3RvOiBkZWxheWVkIik7CisJCQkJYnJlYWs7CisJCQljYXNlIERINk9QVF9BVVRIUFJPVE9fUkVDT05GSUc6CisJCQkJcHJpbnRmKCIgcHJvdG86IHJlY29uZmlndXJlIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiIHByb3RvOiAlZCIsCisJCQkJICAgIGF1dGhvcHQuZGg2b3B0X2F1dGhfcHJvdG8pOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChhdXRob3B0LmRoNm9wdF9hdXRoX2FsZykgeworCQkJY2FzZSBESDZPUFRfQVVUSEFMR19ITUFDTUQ1OgorCQkJCS8qIFhYWDogbWF5IGRlcGVuZCBvbiB0aGUgcHJvdG9jb2wgKi8KKwkJCQlwcmludGYoIiwgYWxnOiBITUFDLU1ENSIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIiwgYWxnOiAlZCIsIGF1dGhvcHQuZGg2b3B0X2F1dGhfYWxnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoYXV0aG9wdC5kaDZvcHRfYXV0aF9yZG0pIHsKKwkJCWNhc2UgREg2T1BUX0FVVEhSRE1fTU9OT0NPVU5URVI6CisJCQkJcHJpbnRmKCIsIFJETTogbW9ubyIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIiwgUkRNOiAlZCIsIGF1dGhvcHQuZGg2b3B0X2F1dGhfcmRtKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRwID0gKHVfY2hhciAqKSZhdXRob3B0LmRoNm9wdF9hdXRoX3JkaW5mbzsKKwkJCXByaW50ZigiLCBSRDoiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHRwICs9IHNpemVvZih2YWwxNikpCisJCQkJcHJpbnRmKCIgJTA0eCIsIEVYVFJBQ1RfMTZCSVRTKHRwKSk7CisKKwkJCS8qIHByb3RvY29sIGRlcGVuZGVudCBwYXJ0ICovCisJCQl0cCA9ICh1X2NoYXIgKilkaDZvICsgc2l6ZW9mKGF1dGhvcHQpOworCQkJYXV0aGluZm9sZW4gPQorCQkJICAgIG9wdGxlbiArIHNpemVvZigqZGg2bykgLSBzaXplb2YoYXV0aG9wdCk7IAorCQkJc3dpdGNoIChhdXRob3B0LmRoNm9wdF9hdXRoX3Byb3RvKSB7CisJCQljYXNlIERINk9QVF9BVVRIUFJPVE9fREVMQVlFRDoKKwkJCQlpZiAoYXV0aGluZm9sZW4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGF1dGhpbmZvbGVuIDwgMjApIHsKKwkJCQkJcHJpbnRmKCIgPz8iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWF1dGhyZWFsbWxlbiA9IGF1dGhpbmZvbGVuIC0gMjA7CisJCQkJaWYgKGF1dGhyZWFsbWxlbiA+IDApIHsKKwkJCQkJcHJpbnRmKCIsIHJlYWxtOiAiKTsKKwkJCQl9CisJCQkJZm9yIChpID0gMDsgaSA8IGF1dGhyZWFsbWxlbjsgaSsrLCB0cCsrKQorCQkJCQlwcmludGYoIiUwMngiLCAqdHApOworCQkJCXByaW50ZigiLCBrZXkgSUQ6ICUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cCkpOworCQkJCXRwICs9IDQ7CisJCQkJcHJpbnRmKCIsIEhNQUMtTUQ1OiIpOworCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHRwKz0gNCkKKwkJCQkJcHJpbnRmKCIgJTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIERINk9QVF9BVVRIUFJPVE9fUkVDT05GSUc6CisJCQkJaWYgKGF1dGhpbmZvbGVuICE9IDE3KSB7CisJCQkJCXByaW50ZigiID8/Iik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlzd2l0Y2ggKCp0cCsrKSB7CisJCQkJY2FzZSBESDZPUFRfQVVUSFJFQ09ORklHX0tFWToKKwkJCQkJcHJpbnRmKCIgcmVjb25maWcta2V5Iik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgREg2T1BUX0FVVEhSRUNPTkZJR19ITUFDTUQ1OgorCQkJCQlwcmludGYoIiB0eXBlOiBITUFDLU1ENSIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGYoIiB0eXBlOiA/PyIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcHJpbnRmKCIgdmFsdWU6Iik7CisJCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgdHArPSA0KQorCQkJCQlwcmludGYoIiAlMDh4IiwgRVhUUkFDVF8zMkJJVFModHApKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCIgPz8iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJpbnRmKCIpIik7CisJCQlicmVhazsKKwkJY2FzZSBESDZPUFRfUkFQSURfQ09NTUlUOiAvKiBub3RoaW5nIHRvZG8gKi8KKwkJCXByaW50ZigiKSIpOworCQkJYnJlYWs7CisJCWNhc2UgREg2T1BUX0lOVEVSRkFDRV9JRDoKKwkJCS8qCisJCQkgKiBTaW5jZSB3ZSBjYW5ub3QgcHJlZGljdCB0aGUgZW5jb2RpbmcsIHByaW50IGhleCBkdW1wCisJCQkgKiBhdCBtb3N0IDEwIGNoYXJhY3RlcnMuCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gJiYgaSA8IDEwOyBpKyspCisJCQkJcHJpbnRmKCIlMDJ4IiwgKCh1X2NoYXIgKikoZGg2byArIDEpKVtpXSk7CisJCQlicmVhazsKKwkJY2FzZSBESDZPUFRfUkVDT05GX01TRzoKKwkJCXRwID0gKHVfY2hhciAqKShkaDZvICsgMSk7CisJCQlzd2l0Y2ggKCp0cCkgeworCQkJY2FzZSBESDZfUkVORVc6CisJCQkJcHJpbnRmKCIgZm9yIHJlbmV3KSIpOworCQkJCWJyZWFrOworCQkJY2FzZSBESDZfSU5GT1JNX1JFUToKKwkJCQlwcmludGYoIiBmb3IgaW5mLXJlcSkiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCIgZm9yID9cP1w/KCUwMngpKSIsICp0cCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBESDZPUFRfUkVDT05GX0FDQ0VQVDogLyogbm90aGluZyB0b2RvICovCisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9TSVBfU0VSVkVSX0E6CisJCWNhc2UgREg2T1BUX0ROUzoKKwkJY2FzZSBESDZPUFRfTlRQX1NFUlZFUlM6CisJCWNhc2UgREg2T1BUX05JU19TRVJWRVJTOgorCQljYXNlIERINk9QVF9OSVNQX1NFUlZFUlM6CisJCWNhc2UgREg2T1BUX0JDTUNTX1NFUlZFUl9BOgorCQkJaWYgKG9wdGxlbiAlIDE2KSB7CisJCQkJcHJpbnRmKCIgPykiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRwID0gKHVfY2hhciAqKShkaDZvICsgMSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyBpICs9IDE2KQorCQkJCXByaW50ZigiICVzIiwgaXA2YWRkcl9zdHJpbmcoJnRwW2ldKSk7CisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9TVEFUVVNfQ09ERToKKwkJCWlmIChvcHRsZW4gPCAyKSB7CisJCQkJcHJpbnRmKCIgPykiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweSgmdmFsMTYsICh1X2NoYXIgKikoZGg2byArIDEpLCBzaXplb2YodmFsMTYpKTsKKwkJCXZhbDE2ID0gbnRvaHModmFsMTYpOworCQkJcHJpbnRmKCIgJXMpIiwgZGhjcDZzdGNvZGUodmFsMTYpKTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9JQV9OQToKKwkJY2FzZSBESDZPUFRfSUFfUEQ6CisJCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGlhKSAtIDQpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZpYSwgKHVfY2hhciAqKWRoNm8sIHNpemVvZihpYSkpOworCQkJaWEuZGg2b3B0X2lhX2lhaWQgPSBudG9obChpYS5kaDZvcHRfaWFfaWFpZCk7CisJCQlpYS5kaDZvcHRfaWFfdDEgPSBudG9obChpYS5kaDZvcHRfaWFfdDEpOworCQkJaWEuZGg2b3B0X2lhX3QyID0gbnRvaGwoaWEuZGg2b3B0X2lhX3QyKTsKKwkJCXByaW50ZigiIElBSUQ6JWx1IFQxOiVsdSBUMjolbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWlhLmRoNm9wdF9pYV9pYWlkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWlhLmRoNm9wdF9pYV90MSwKKwkJCSAgICAodW5zaWduZWQgbG9uZylpYS5kaDZvcHRfaWFfdDIpOworCQkJaWYgKG9wdGxlbiA+IHNpemVvZihpYSkgLSA0KSB7CisJCQkJLyogdGhlcmUgYXJlIHN1Yi1vcHRpb25zICovCisJCQkJZGhjcDZvcHRfcHJpbnQoKHVfY2hhciAqKWRoNm8gKyBzaXplb2YoaWEpLAorCQkJCSAgICAodV9jaGFyICopKGRoNm8gKyAxKSArIG9wdGxlbik7CisJCQl9CisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQljYXNlIERINk9QVF9JQV9QRF9QUkVGSVg6CisJCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGlhX3ByZWZpeCkgLSA0KSB7CisJCQkJcHJpbnRmKCIgPykiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweSgmaWFfcHJlZml4LCAodV9jaGFyICopZGg2bywgc2l6ZW9mKGlhX3ByZWZpeCkpOworCQkJcHJpbnRmKCIgJXMvJWQiLAorCQkJICAgIGlwNmFkZHJfc3RyaW5nKCZpYV9wcmVmaXguZGg2b3B0X2lhX3ByZWZpeF9hZGRyKSwKKwkJCSAgICBpYV9wcmVmaXguZGg2b3B0X2lhX3ByZWZpeF9wbGVuKTsKKwkJCWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3BsdGltZSA9CisJCQkgICAgbnRvaGwoaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfcGx0aW1lKTsKKwkJCWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3ZsdGltZSA9CisJCQkgICAgbnRvaGwoaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfdmx0aW1lKTsKKwkJCXByaW50ZigiIHBsdGltZTolbHUgdmx0aW1lOiVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfcGx0aW1lLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3ZsdGltZSk7CisJCQlpZiAob3B0bGVuID4gc2l6ZW9mKGlhX3ByZWZpeCkgLSA0KSB7CisJCQkJLyogdGhlcmUgYXJlIHN1Yi1vcHRpb25zICovCisJCQkJZGhjcDZvcHRfcHJpbnQoKHVfY2hhciAqKWRoNm8gKworCQkJCSAgICBzaXplb2YoaWFfcHJlZml4KSwKKwkJCQkgICAgKHVfY2hhciAqKShkaDZvICsgMSkgKyBvcHRsZW4pOworCQkJfQorCQkJcHJpbnRmKCIpIik7CisJCQlicmVhazsKKwkJY2FzZSBESDZPUFRfTElGRVRJTUU6CisJCQlpZiAob3B0bGVuICE9IDQpIHsKKwkJCQlwcmludGYoIiA/KSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWVtY3B5KCZ2YWwzMiwgZGg2byArIDEsIHNpemVvZih2YWwzMikpOworCQkJdmFsMzIgPSBudG9obCh2YWwzMik7CisJCQlwcmludGYoIiAlZCkiLCAoaW50KXZhbDMyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCIpIik7CisJCQlicmVhazsKKwkJfQorCisJCWNwICs9IHNpemVvZigqZGg2bykgKyBvcHRsZW47CisJfQorCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCJbfGRoY3A2ZXh0XSIpOworfQorCisvKgorICogUHJpbnQgZGhjcDYgcGFja2V0cworICovCit2b2lkCitkaGNwNl9wcmludChjb25zdCB1X2NoYXIgKmNwLCB1X2ludCBsZW5ndGgpCit7CisJc3RydWN0IGRoY3A2ICpkaDY7CisJc3RydWN0IGRoY3A2X3JlbGF5ICpkaDZyZWxheTsKKwljb25zdCB1X2NoYXIgKmVwOworCXVfY2hhciAqZXh0cDsKKwljb25zdCBjaGFyICpuYW1lOworCisJcHJpbnRmKCJkaGNwNiIpOworCisJZXAgPSAodV9jaGFyICopc25hcGVuZDsKKwlpZiAoY3AgKyBsZW5ndGggPCBlcCkKKwkJZXAgPSBjcCArIGxlbmd0aDsKKworCWRoNiA9IChzdHJ1Y3QgZGhjcDYgKiljcDsKKwlkaDZyZWxheSA9IChzdHJ1Y3QgZGhjcDZfcmVsYXkgKiljcDsKKwlUQ0hFQ0soZGg2LT5kaDZfeGlkKTsKKwlzd2l0Y2ggKGRoNi0+ZGg2X21zZ3R5cGUpIHsKKwljYXNlIERINl9TT0xJQ0lUOgorCQluYW1lID0gInNvbGljaXQiOworCQlicmVhazsKKwljYXNlIERINl9BRFZFUlRJU0U6CisJCW5hbWUgPSAiYWR2ZXJ0aXNlIjsKKwkJYnJlYWs7CisJY2FzZSBESDZfUkVRVUVTVDoKKwkJbmFtZSA9ICJyZXF1ZXN0IjsKKwkJYnJlYWs7CisJY2FzZSBESDZfQ09ORklSTToKKwkJbmFtZSA9ICJjb25maXJtIjsKKwkJYnJlYWs7CisJY2FzZSBESDZfUkVORVc6CisJCW5hbWUgPSAicmVuZXciOworCQlicmVhazsKKwljYXNlIERINl9SRUJJTkQ6CisJCW5hbWUgPSAicmViaW5kIjsKKwkJYnJlYWs7CisJY2FzZSBESDZfUkVQTFk6CisJCW5hbWUgPSAicmVwbHkiOworCQlicmVhazsKKwljYXNlIERINl9SRUxFQVNFOgorCQluYW1lID0gInJlbGVhc2UiOworCQlicmVhazsKKwljYXNlIERINl9ERUNMSU5FOgorCQluYW1lID0gImRlY2xpbmUiOworCQlicmVhazsKKwljYXNlIERINl9SRUNPTkZJR1VSRToKKwkJbmFtZSA9ICJyZWNvbmZpZ3VyZSI7CisJCWJyZWFrOworCWNhc2UgREg2X0lORk9STV9SRVE6CisJCW5hbWU9ICJpbmYtcmVxIjsKKwkJYnJlYWs7CisJY2FzZSBESDZfUkVMQVlfRk9SVzoKKwkJbmFtZT0gInJlbGF5LWZ3ZCI7CisJCWJyZWFrOworCWNhc2UgREg2X1JFTEFZX1JFUExZOgorCQluYW1lPSAicmVsYXktcmVwbHkiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluYW1lID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCF2ZmxhZykgeworCQlpZiAobmFtZSkKKwkJCXByaW50ZigiICVzIiwgbmFtZSk7CisJCWVsc2UgaWYgKGRoNi0+ZGg2X21zZ3R5cGUgIT0gREg2X1JFTEFZX0ZPUlcgJiYKKwkJICAgIGRoNi0+ZGg2X21zZ3R5cGUgIT0gREg2X1JFTEFZX1JFUExZKSB7CisJCQlwcmludGYoIiBtc2d0eXBlLSV1IiwgZGg2LT5kaDZfbXNndHlwZSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIFhYWCByZWxheSBhZ2VudCBtZXNzYWdlcyBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KKworCWlmIChuYW1lKQorCQlwcmludGYoIiAlcyAoIiwgbmFtZSk7CS8qKSovCisJZWxzZQorCQlwcmludGYoIiBtc2d0eXBlLSV1ICgiLCBkaDYtPmRoNl9tc2d0eXBlKTsJLyopKi8KKwlpZiAoZGg2LT5kaDZfbXNndHlwZSAhPSBESDZfUkVMQVlfRk9SVyAmJgorCSAgICBkaDYtPmRoNl9tc2d0eXBlICE9IERINl9SRUxBWV9SRVBMWSkgeworCQlwcmludGYoInhpZD0leCIsIEVYVFJBQ1RfMzJCSVRTKCZkaDYtPmRoNl94aWQpICYgREg2X1hJRE1BU0spOworCQlleHRwID0gKHVfY2hhciAqKShkaDYgKyAxKTsKKwkJZGhjcDZvcHRfcHJpbnQoZXh0cCwgZXApOworCX0gZWxzZSB7CQkvKiByZWxheSBtZXNzYWdlcyAqLworCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjY7CisKKwkJVENIRUNLKGRoNnJlbGF5LT5kaDZyZWxheV9wZWVyYWRkcik7CisKKwkJbWVtY3B5KCZhZGRyNiwgZGg2cmVsYXktPmRoNnJlbGF5X2xpbmthZGRyLCBzaXplb2YgKGFkZHI2KSk7CisJCXByaW50ZigibGlua2FkZHI9JXMiLCBpcDZhZGRyX3N0cmluZygmYWRkcjYpKTsKKworCQltZW1jcHkoJmFkZHI2LCBkaDZyZWxheS0+ZGg2cmVsYXlfcGVlcmFkZHIsIHNpemVvZiAoYWRkcjYpKTsKKwkJcHJpbnRmKCIgcGVlcmFkZHI9JXMiLCBpcDZhZGRyX3N0cmluZygmYWRkcjYpKTsKKworCQlkaGNwNm9wdF9wcmludCgodV9jaGFyICopKGRoNnJlbGF5ICsgMSksIGVwKTsKKwl9CisJLyooKi8KKwlwcmludGYoIikiKTsKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiW3xkaGNwNl0iKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWRvbWFpbi5jIGIvcHJpbnQtZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhMzVkOAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWRvbWFpbi5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZG9tYWluLmMsdiAxLjg5LjIuOCAyMDA3LzAyLzEzIDE5OjE5OjI3IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgIm5hbWVzZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIiAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpuc19vcHNbXSA9IHsKKwkiIiwgIiBpbnZfcSIsICIgc3RhdCIsICIgb3AzIiwgIiBub3RpZnkiLCAiIHVwZGF0ZSIsICIgb3A2IiwgIiBvcDciLAorCSIgb3A4IiwgIiB1cGRhdGFBIiwgIiB1cGRhdGVEIiwgIiB1cGRhdGVEQSIsCisJIiB1cGRhdGVNIiwgIiB1cGRhdGVNQSIsICIgem9uZUluaXQiLCAiIHpvbmVSZWYiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm5zX3Jlc3BbXSA9IHsKKwkiIiwgIiBGb3JtRXJyIiwgIiBTZXJ2RmFpbCIsICIgTlhEb21haW4iLAorCSIgTm90SW1wIiwgIiBSZWZ1c2VkIiwgIiBZWERvbWFpbiIsICIgWVhSUlNldCIsCisJIiBOWFJSU2V0IiwgIiBOb3RBdXRoIiwgIiBOb3Rab25lIiwgIiBSZXNwMTEiLAorCSIgUmVzcDEyIiwgIiBSZXNwMTMiLCAiIFJlc3AxNCIsICIgTm9DaGFuZ2UiLAorfTsKKworLyogc2tpcCBvdmVyIGEgZG9tYWluIG5hbWUgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgKgorbnNfbnNraXAocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCkKK3sKKwlyZWdpc3RlciB1X2NoYXIgaTsKKworCWlmICghVFRFU1QyKCpjcCwgMSkpCisJCXJldHVybiAoTlVMTCk7CisJaSA9ICpjcCsrOworCXdoaWxlIChpKSB7CisJCWlmICgoaSAmIElORElSX01BU0spID09IElORElSX01BU0spCisJCQlyZXR1cm4gKGNwICsgMSk7CisJCWlmICgoaSAmIElORElSX01BU0spID09IEVETlMwX01BU0spIHsKKwkJCWludCBiaXRsZW4sIGJ5dGVsZW47CisKKwkJCWlmICgoaSAmIH5JTkRJUl9NQVNLKSAhPSBFRE5TMF9FTFRfQklUTEFCRUwpCisJCQkJcmV0dXJuKE5VTEwpOyAvKiB1bmtub3duIEVMVCAqLworCQkJaWYgKCFUVEVTVDIoKmNwLCAxKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJaWYgKChiaXRsZW4gPSAqY3ArKykgPT0gMCkKKwkJCQliaXRsZW4gPSAyNTY7CisJCQlieXRlbGVuID0gKGJpdGxlbiArIDcpIC8gODsKKwkJCWNwICs9IGJ5dGVsZW47CisJCX0gZWxzZQorCQkJY3AgKz0gaTsKKwkJaWYgKCFUVEVTVDIoKmNwLCAxKSkKKwkJCXJldHVybiAoTlVMTCk7CisJCWkgPSAqY3ArKzsKKwl9CisJcmV0dXJuIChjcCk7Cit9CisKKy8qIHByaW50IGEgPGRvbWFpbi1uYW1lPiAqLworc3RhdGljIGNvbnN0IHVfY2hhciAqCitibGFiZWxfcHJpbnQoY29uc3QgdV9jaGFyICpjcCkKK3sKKwlpbnQgYml0bGVuLCBzbGVuLCBiOworCWNvbnN0IHVfY2hhciAqYml0cCwgKmxpbTsKKwljaGFyIHRjOworCisJaWYgKCFUVEVTVDIoKmNwLCAxKSkKKwkJcmV0dXJuKE5VTEwpOworCWlmICgoYml0bGVuID0gKmNwKSA9PSAwKQorCQliaXRsZW4gPSAyNTY7CisJc2xlbiA9IChiaXRsZW4gKyAzKSAvIDQ7CisJbGltID0gY3AgKyAxICsgc2xlbjsKKworCS8qIHByaW50IHRoZSBiaXQgc3RyaW5nIGFzIGEgaGV4IHN0cmluZyAqLworCXByaW50ZigiXFxbeCIpOworCWZvciAoYml0cCA9IGNwICsgMSwgYiA9IGJpdGxlbjsgYml0cCA8IGxpbSAmJiBiID4gNzsgYiAtPSA4LCBiaXRwKyspIHsKKwkJVENIRUNLKCpiaXRwKTsKKwkJcHJpbnRmKCIlMDJ4IiwgKmJpdHApOworCX0KKwlpZiAoYiA+IDQpIHsKKwkJVENIRUNLKCpiaXRwKTsKKwkJdGMgPSAqYml0cCsrOworCQlwcmludGYoIiUwMngiLCB0YyAmICgweGZmIDw8ICg4IC0gYikpKTsKKwl9IGVsc2UgaWYgKGIgPiAwKSB7CisJCVRDSEVDSygqYml0cCk7CisJCXRjID0gKmJpdHArKzsKKwkJcHJpbnRmKCIlMXgiLCAoKHRjID4+IDQpICYgMHgwZikgJiAoMHgwZiA8PCAoNCAtIGIpKSk7CisJfQorCXByaW50ZigiLyVkXSIsIGJpdGxlbik7CisJcmV0dXJuIGxpbTsKK3RydW5jOgorCXByaW50ZigiLi4uLyVkXSIsIGJpdGxlbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2xhYmVsbGVuKGNvbnN0IHVfY2hhciAqY3ApCit7CisJcmVnaXN0ZXIgdV9pbnQgaTsKKworCWlmICghVFRFU1QyKCpjcCwgMSkpCisJCXJldHVybigtMSk7CisJaSA9ICpjcDsKKwlpZiAoKGkgJiBJTkRJUl9NQVNLKSA9PSBFRE5TMF9NQVNLKSB7CisJCWludCBiaXRsZW4sIGVsdDsKKwkJaWYgKChlbHQgPSAoaSAmIH5JTkRJUl9NQVNLKSkgIT0gRUROUzBfRUxUX0JJVExBQkVMKSB7CisJCQlwcmludGYoIjxFTFQgJWQ+IiwgZWx0KTsKKwkJCXJldHVybigtMSk7CisJCX0KKwkJaWYgKCFUVEVTVDIoKihjcCArIDEpLCAxKSkKKwkJCXJldHVybigtMSk7CisJCWlmICgoYml0bGVuID0gKihjcCArIDEpKSA9PSAwKQorCQkJYml0bGVuID0gMjU2OworCQlyZXR1cm4oKChiaXRsZW4gKyA3KSAvIDgpICsgMSk7CisJfSBlbHNlCisJCXJldHVybihpKTsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCituc19ucHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKK3sKKwlyZWdpc3RlciB1X2ludCBpLCBsOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcnAgPSBOVUxMOworCXJlZ2lzdGVyIGludCBjb21wcmVzcyA9IDA7CisJaW50IGNoYXJzX3Byb2Nlc3NlZDsKKwlpbnQgZWx0OworCWludCBkYXRhX3NpemUgPSBzbmFwZW5kIC0gYnA7CisKKwlpZiAoKGwgPSBsYWJlbGxlbihjcCkpID09ICh1X2ludCktMSkKKwkJcmV0dXJuKE5VTEwpOworCWlmICghVFRFU1QyKCpjcCwgMSkpCisJCXJldHVybihOVUxMKTsKKwljaGFyc19wcm9jZXNzZWQgPSAxOworCWlmICgoKGkgPSAqY3ArKykgJiBJTkRJUl9NQVNLKSAhPSBJTkRJUl9NQVNLKSB7CisJCWNvbXByZXNzID0gMDsKKwkJcnAgPSBjcCArIGw7CisJfQorCisJaWYgKGkgIT0gMCkKKwkJd2hpbGUgKGkgJiYgY3AgPCBzbmFwZW5kKSB7CisJCQlpZiAoKGkgJiBJTkRJUl9NQVNLKSA9PSBJTkRJUl9NQVNLKSB7CisJCQkJaWYgKCFjb21wcmVzcykgeworCQkJCQlycCA9IGNwICsgMTsKKwkJCQkJY29tcHJlc3MgPSAxOworCQkJCX0KKwkJCQlpZiAoIVRURVNUMigqY3AsIDEpKQorCQkJCQlyZXR1cm4oTlVMTCk7CisJCQkJY3AgPSBicCArICgoKGkgPDwgOCkgfCAqY3ApICYgMHgzZmZmKTsKKwkJCQlpZiAoKGwgPSBsYWJlbGxlbihjcCkpID09ICh1X2ludCktMSkKKwkJCQkJcmV0dXJuKE5VTEwpOworCQkJCWlmICghVFRFU1QyKCpjcCwgMSkpCisJCQkJCXJldHVybihOVUxMKTsKKwkJCQlpID0gKmNwKys7CisJCQkJY2hhcnNfcHJvY2Vzc2VkKys7CisKKwkJCQkvKgorCQkJCSAqIElmIHdlJ3ZlIGxvb2tlZCBhdCBldmVyeSBjaGFyYWN0ZXIgaW4KKwkJCQkgKiB0aGUgbWVzc2FnZSwgdGhpcyBwb2ludGVyIHdpbGwgbWFrZQorCQkJCSAqIHVzIGxvb2sgYXQgc29tZSBjaGFyYWN0ZXIgYWdhaW4sCisJCQkJICogd2hpY2ggbWVhbnMgd2UncmUgbG9vcGluZy4KKwkJCQkgKi8KKwkJCQlpZiAoY2hhcnNfcHJvY2Vzc2VkID49IGRhdGFfc2l6ZSkgeworCQkJCQlwcmludGYoIjxMT09QPiIpOworCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoaSAmIElORElSX01BU0spID09IEVETlMwX01BU0spIHsKKwkJCQllbHQgPSAoaSAmIH5JTkRJUl9NQVNLKTsKKwkJCQlzd2l0Y2goZWx0KSB7CisJCQkJY2FzZSBFRE5TMF9FTFRfQklUTEFCRUw6CisJCQkJCWlmIChibGFiZWxfcHJpbnQoY3ApID09IE5VTEwpCisJCQkJCQlyZXR1cm4gKE5VTEwpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkvKiB1bmtub3duIEVMVCAqLworCQkJCQlwcmludGYoIjxFTFQgJWQ+IiwgZWx0KTsKKwkJCQkJcmV0dXJuKE5VTEwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZuX3ByaW50bihjcCwgbCwgc25hcGVuZCkpCisJCQkJCXJldHVybihOVUxMKTsKKwkJCX0KKworCQkJY3AgKz0gbDsKKwkJCWNoYXJzX3Byb2Nlc3NlZCArPSBsOworCQkJcHV0Y2hhcignLicpOworCQkJaWYgKChsID0gbGFiZWxsZW4oY3ApKSA9PSAodV9pbnQpLTEpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJaWYgKCFUVEVTVDIoKmNwLCAxKSkKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlpID0gKmNwKys7CisJCQljaGFyc19wcm9jZXNzZWQrKzsKKwkJCWlmICghY29tcHJlc3MpCisJCQkJcnAgKz0gbCArIDE7CisJCX0KKwllbHNlCisJCXB1dGNoYXIoJy4nKTsKKwlyZXR1cm4gKHJwKTsKK30KKworLyogcHJpbnQgYSA8Y2hhcmFjdGVyLXN0cmluZz4gKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgKgorbnNfY3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3ApCit7CisJcmVnaXN0ZXIgdV9pbnQgaTsKKworCWlmICghVFRFU1QyKCpjcCwgMSkpCisJCXJldHVybiAoTlVMTCk7CisJaSA9ICpjcCsrOworCWlmIChmbl9wcmludG4oY3AsIGksIHNuYXBlbmQpKQorCQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAoY3AgKyBpKTsKK30KKworLyogaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9kbnMtcGFyYW1ldGVycyAqLworc3RydWN0IHRvayBuc190eXBlMnN0cltdID0geworCXsgVF9BLAkJIkEiIH0sCQkJLyogUkZDIDEwMzUgKi8KKwl7IFRfTlMsCQkiTlMiIH0sCQkJLyogUkZDIDEwMzUgKi8KKwl7IFRfTUQsCQkiTUQiIH0sCQkJLyogUkZDIDEwMzUgKi8KKwl7IFRfTUYsCQkiTUYiIH0sCQkJLyogUkZDIDEwMzUgKi8KKwl7IFRfQ05BTUUsCSJDTkFNRSIgfSwJCS8qIFJGQyAxMDM1ICovCisJeyBUX1NPQSwJIlNPQSIgfSwJCS8qIFJGQyAxMDM1ICovCisJeyBUX01CLAkJIk1CIiB9LAkJCS8qIFJGQyAxMDM1ICovCisJeyBUX01HLAkJIk1HIiB9LAkJCS8qIFJGQyAxMDM1ICovCisJeyBUX01SLAkJIk1SIiB9LAkJCS8qIFJGQyAxMDM1ICovCisJeyBUX05VTEwsCSJOVUxMIiB9LAkJLyogUkZDIDEwMzUgKi8KKwl7IFRfV0tTLAkiV0tTIiB9LAkJLyogUkZDIDEwMzUgKi8KKwl7IFRfUFRSLAkiUFRSIiB9LAkJLyogUkZDIDEwMzUgKi8KKwl7IFRfSElORk8sCSJISU5GTyIgfSwJCS8qIFJGQyAxMDM1ICovCisJeyBUX01JTkZPLAkiTUlORk8iIH0sCQkvKiBSRkMgMTAzNSAqLworCXsgVF9NWCwJCSJNWCIgfSwJCQkvKiBSRkMgMTAzNSAqLworCXsgVF9UWFQsCSJUWFQiIH0sCQkvKiBSRkMgMTAzNSAqLworCXsgVF9SUCwJCSJSUCIgfSwJCQkvKiBSRkMgMTE4MyAqLworCXsgVF9BRlNEQiwJIkFGU0RCIiB9LAkJLyogUkZDIDExODMgKi8KKwl7IFRfWDI1LAkiWDI1IiB9LAkJLyogUkZDIDExODMgKi8KKwl7IFRfSVNETiwJIklTRE4iIH0sCQkvKiBSRkMgMTE4MyAqLworCXsgVF9SVCwJCSJSVCIgfSwJCQkvKiBSRkMgMTE4MyAqLworCXsgVF9OU0FQLAkiTlNBUCIgfSwJCS8qIFJGQyAxNzA2ICovCisJeyBUX05TQVBfUFRSLAkiTlNBUF9QVFIiIH0sCisJeyBUX1NJRywJIlNJRyIgfSwJCS8qIFJGQyAyNTM1ICovCisJeyBUX0tFWSwJIktFWSIgfSwJCS8qIFJGQyAyNTM1ICovCisJeyBUX1BYLAkJIlBYIiB9LAkJCS8qIFJGQyAyMTYzICovCisJeyBUX0dQT1MsCSJHUE9TIiB9LAkJLyogUkZDIDE3MTIgKi8KKwl7IFRfQUFBQSwJIkFBQUEiIH0sCQkvKiBSRkMgMTg4NiAqLworCXsgVF9MT0MsCSJMT0MiIH0sCQkvKiBSRkMgMTg3NiAqLworCXsgVF9OWFQsCSJOWFQiIH0sCQkvKiBSRkMgMjUzNSAqLworCXsgVF9FSUQsCSJFSUQiIH0sCQkvKiBOaW1yb2QgKi8KKwl7IFRfTklNTE9DLAkiTklNTE9DIiB9LAkJLyogTmltcm9kICovCisJeyBUX1NSViwJIlNSViIgfSwJCS8qIFJGQyAyNzgyICovCisJeyBUX0FUTUEsCSJBVE1BIiB9LAkJLyogQVRNIEZvcnVtICovCisJeyBUX05BUFRSLAkiTkFQVFIiIH0sCQkvKiBSRkMgMjE2OCwgUkZDIDI5MTUgKi8KKwl7IFRfS1gsCQkiS1giIH0sCQkJLyogUkZDIDIyMzAgKi8KKwl7IFRfQ0VSVCwJIkNFUlQiIH0sCQkvKiBSRkMgMjUzOCAqLworCXsgVF9BNiwJCSJBNiIgfSwJCQkvKiBSRkMgMjg3NCAqLworCXsgVF9ETkFNRSwJIkROQU1FIiB9LAkJLyogUkZDIDI2NzIgKi8KKwl7IFRfU0lOSywgCSJTSU5LIiB9LAorCXsgVF9PUFQsCSJPUFQiIH0sCQkvKiBSRkMgMjY3MSAqLworCXsgVF9BUEwsIAkiQVBMIiB9LAkJLyogUkZDIDMxMjMgKi8KKwl7IFRfRFMsCQkiRFMiIH0sCQkJLyogUkZDIDQwMzQgKi8KKwl7IFRfU1NIRlAsCSJTU0hGUCIgfSwJCS8qIFJGQyA0MjU1ICovCisJeyBUX0lQU0VDS0VZLAkiSVBTRUNLRVkiIH0sCQkvKiBSRkMgNDAyNSAqLworCXsgVF9SUlNJRywgCSJSUlNJRyIgfSwJCS8qIFJGQyA0MDM0ICovCisJeyBUX05TRUMsCSJOU0VDIiB9LAkJLyogUkZDIDQwMzQgKi8KKwl7IFRfRE5TS0VZLAkiRE5TS0VZIiB9LAkJLyogUkZDIDQwMzQgKi8KKwl7IFRfU1BGLAkiU1BGIiB9LAkJLyogUkZDLXNjaGxpdHQtc3BmLWNsYXNzaWMtMDIudHh0ICovCisJeyBUX1VJTkZPLAkiVUlORk8iIH0sCisJeyBUX1VJRCwJIlVJRCIgfSwKKwl7IFRfR0lELAkiR0lEIiB9LAorCXsgVF9VTlNQRUMsCSJVTlNQRUMiIH0sCisJeyBUX1VOU1BFQ0EsCSJVTlNQRUNBIiB9LAorCXsgVF9US0VZLAkiVEtFWSIgfSwJCS8qIFJGQyAyOTMwICovCisJeyBUX1RTSUcsCSJUU0lHIiB9LAkJLyogUkZDIDI4NDUgKi8KKwl7IFRfSVhGUiwJIklYRlIiIH0sCQkvKiBSRkMgMTk5NSAqLworCXsgVF9BWEZSLAkiQVhGUiIgfSwJCS8qIFJGQyAxMDM1ICovCisJeyBUX01BSUxCLAkiTUFJTEIiIH0sCQkvKiBSRkMgMTAzNSAqLworCXsgVF9NQUlMQSwJIk1BSUxBIiB9LAkJLyogUkZDIDEwMzUgKi8KKwl7IFRfQU5ZLAkiQU5ZIiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworc3RydWN0IHRvayBuc19jbGFzczJzdHJbXSA9IHsKKwl7IENfSU4sCQkiSU4iIH0sCQkvKiBOb3QgdXNlZCAqLworCXsgQ19DSEFPUywJIkNIQU9TIiB9LAorCXsgQ19IUywJCSJIUyIgfSwKKwl7IENfQU5ZLAkiQU5ZIiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworLyogcHJpbnQgYSBxdWVyeSAqLworc3RhdGljIGNvbnN0IHVfY2hhciAqCituc19xcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGlzX21kbnMpCit7CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpucCA9IGNwOworCXJlZ2lzdGVyIHVfaW50IGksIGNsYXNzOworCisJY3AgPSBuc19uc2tpcChjcCk7CisKKwlpZiAoY3AgPT0gTlVMTCB8fCAhVFRFU1QyKCpjcCwgNCkpCisJCXJldHVybihOVUxMKTsKKworCS8qIHByaW50IHRoZSBxdHlwZSAqLworCWkgPSBFWFRSQUNUXzE2QklUUyhjcCk7CisJY3AgKz0gMjsKKwlwcmludGYoIiAlcyIsIHRvazJzdHIobnNfdHlwZTJzdHIsICJUeXBlJWQiLCBpKSk7CisJLyogcHJpbnQgdGhlIHFjbGFzcyAoaWYgaXQncyBub3QgSU4pICovCisJaSA9IEVYVFJBQ1RfMTZCSVRTKGNwKTsKKwljcCArPSAyOworCWlmIChpc19tZG5zKQorCQljbGFzcyA9IChpICYgfkNfUVUpOworCWVsc2UKKwkJY2xhc3MgPSBpOworCWlmIChjbGFzcyAhPSBDX0lOKQorCQlwcmludGYoIiAlcyIsIHRvazJzdHIobnNfY2xhc3Myc3RyLCAiKENsYXNzICVkKSIsIGNsYXNzKSk7CisJaWYgKGlzX21kbnMpIHsKKwkJaWYgKGkgJiBDX1FVKQorCQkJcHJpbnRmKCIgKFFVKSIpOworCQllbHNlCisJCQlwcmludGYoIiAoUU0pIik7CisJfQorCisJZnB1dHMoIj8gIiwgc3Rkb3V0KTsKKwljcCA9IG5zX25wcmludChucCwgYnApOworCXJldHVybihjcCA/IGNwICsgNCA6IE5VTEwpOworfQorCisvKiBwcmludCBhIHJlcGx5ICovCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK25zX3JwcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgaXNfbWRucykKK3sKKwlyZWdpc3RlciB1X2ludCBpLCBjbGFzcywgb3B0X2ZsYWdzID0gMDsKKwlyZWdpc3RlciB1X3Nob3J0IHR5cCwgbGVuOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcnA7CisKKwlpZiAodmZsYWcpIHsKKwkJcHV0Y2hhcignICcpOworCQlpZiAoKGNwID0gbnNfbnByaW50KGNwLCBicCkpID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJY3AgPSBuc19uc2tpcChjcCk7CisKKwlpZiAoY3AgPT0gTlVMTCB8fCAhVFRFU1QyKCpjcCwgMTApKQorCQlyZXR1cm4gKHNuYXBlbmQpOworCisJLyogcHJpbnQgdGhlIHR5cGUvcXR5cGUgKi8KKwl0eXAgPSBFWFRSQUNUXzE2QklUUyhjcCk7CisJY3AgKz0gMjsKKwkvKiBwcmludCB0aGUgY2xhc3MgKGlmIGl0J3Mgbm90IElOIGFuZCB0aGUgdHlwZSBpc24ndCBPUFQpICovCisJaSA9IEVYVFJBQ1RfMTZCSVRTKGNwKTsKKwljcCArPSAyOworCWlmIChpc19tZG5zKQorCQljbGFzcyA9IChpICYgfkNfQ0FDSEVfRkxVU0gpOworCWVsc2UKKwkJY2xhc3MgPSBpOworCWlmIChjbGFzcyAhPSBDX0lOICYmIHR5cCAhPSBUX09QVCkKKwkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX2NsYXNzMnN0ciwgIihDbGFzcyAlZCkiLCBjbGFzcykpOworCWlmIChpc19tZG5zKSB7CisJCWlmIChpICYgQ19DQUNIRV9GTFVTSCkKKwkJCXByaW50ZigiIChDYWNoZSBmbHVzaCkiKTsKKwl9CisKKwkvKiBpZ25vcmUgdHRsICovCisJY3AgKz0gMjsKKwkvKiBpZiBUX09QVCwgc2F2ZSBvcHRfZmxhZ3MgKi8KKwlpZiAodHlwID09IFRfT1BUKQorCQlvcHRfZmxhZ3MgPSBFWFRSQUNUXzE2QklUUyhjcCk7CisJLyogaWdub3JlIHJlc3Qgb2YgdHRsICovCisJY3AgKz0gMjsKKworCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKGNwKTsKKwljcCArPSAyOworCisJcnAgPSBjcCArIGxlbjsKKworCXByaW50ZigiICVzIiwgdG9rMnN0cihuc190eXBlMnN0ciwgIlR5cGUlZCIsIHR5cCkpOworCWlmIChycCA+IHNuYXBlbmQpCisJCXJldHVybihOVUxMKTsKKworCXN3aXRjaCAodHlwKSB7CisJY2FzZSBUX0E6CisJCWlmICghVFRFU1QyKCpjcCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCisJCQlyZXR1cm4oTlVMTCk7CisJCXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZyhjcCkpOworCQlicmVhazsKKworCWNhc2UgVF9OUzoKKwljYXNlIFRfQ05BTUU6CisJY2FzZSBUX1BUUjoKKyNpZmRlZiBUX0ROQU1FCisJY2FzZSBUX0ROQU1FOgorI2VuZGlmCisJCXB1dGNoYXIoJyAnKTsKKwkJaWYgKG5zX25wcmludChjcCwgYnApID09IE5VTEwpCisJCQlyZXR1cm4oTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBUX1NPQToKKwkJaWYgKCF2ZmxhZykKKwkJCWJyZWFrOworCQlwdXRjaGFyKCcgJyk7CisJCWlmICgoY3AgPSBuc19ucHJpbnQoY3AsIGJwKSkgPT0gTlVMTCkKKwkJCXJldHVybihOVUxMKTsKKwkJcHV0Y2hhcignICcpOworCQlpZiAoKGNwID0gbnNfbnByaW50KGNwLCBicCkpID09IE5VTEwpCisJCQlyZXR1cm4oTlVMTCk7CisJCWlmICghVFRFU1QyKCpjcCwgNSAqIDQpKQorCQkJcmV0dXJuKE5VTEwpOworCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7CisJCWNwICs9IDQ7CisJCXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKKwkJY3AgKz0gNDsKKwkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOworCQljcCArPSA0OworCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7CisJCWNwICs9IDQ7CisJCXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKKwkJY3AgKz0gNDsKKwkJYnJlYWs7CisJY2FzZSBUX01YOgorCQlwdXRjaGFyKCcgJyk7CisJCWlmICghVFRFU1QyKCpjcCwgMikpCisJCQlyZXR1cm4oTlVMTCk7CisJCWlmIChuc19ucHJpbnQoY3AgKyAyLCBicCkgPT0gTlVMTCkKKwkJCXJldHVybihOVUxMKTsKKwkJcHJpbnRmKCIgJWQiLCBFWFRSQUNUXzE2QklUUyhjcCkpOworCQlicmVhazsKKworCWNhc2UgVF9UWFQ6CisJCXdoaWxlIChjcCA8IHJwKSB7CisJCQlwcmludGYoIiBcIiIpOworCQkJY3AgPSBuc19jcHJpbnQoY3ApOworCQkJaWYgKGNwID09IE5VTEwpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJcHV0Y2hhcignIicpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBUX1NSVjoKKwkJcHV0Y2hhcignICcpOworCQlpZiAoIVRURVNUMigqY3AsIDYpKQorCQkJcmV0dXJuKE5VTEwpOworCQlpZiAobnNfbnByaW50KGNwICsgNiwgYnApID09IE5VTEwpCisJCQlyZXR1cm4oTlVMTCk7CisJCXByaW50ZigiOiVkICVkICVkIiwgRVhUUkFDVF8xNkJJVFMoY3AgKyA0KSwKKwkJCUVYVFJBQ1RfMTZCSVRTKGNwKSwgRVhUUkFDVF8xNkJJVFMoY3AgKyAyKSk7CisJCWJyZWFrOworCisjaWZkZWYgSU5FVDYKKwljYXNlIFRfQUFBQToKKwkJaWYgKCFUVEVTVDIoKmNwLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpCisJCQlyZXR1cm4oTlVMTCk7CisJCXByaW50ZigiICVzIiwgaXA2YWRkcl9zdHJpbmcoY3ApKTsKKwkJYnJlYWs7CisKKwljYXNlIFRfQTY6CisJICAgIHsKKwkJc3RydWN0IGluNl9hZGRyIGE7CisJCWludCBwYml0LCBwYnl0ZTsKKworCQlpZiAoIVRURVNUMigqY3AsIDEpKQorCQkJcmV0dXJuKE5VTEwpOworCQlwYml0ID0gKmNwOworCQlwYnl0ZSA9IChwYml0ICYgfjcpIC8gODsKKwkJaWYgKHBiaXQgPiAxMjgpIHsKKwkJCXByaW50ZigiICV1KGJhZCBwbGVuKSIsIHBiaXQpOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocGJpdCA8IDEyOCkgeworCQkJaWYgKCFUVEVTVDIoKihjcCArIDEpLCBzaXplb2YoYSkgLSBwYnl0ZSkpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJbWVtc2V0KCZhLCAwLCBzaXplb2YoYSkpOworCQkJbWVtY3B5KCZhLnM2X2FkZHJbcGJ5dGVdLCBjcCArIDEsIHNpemVvZihhKSAtIHBieXRlKTsKKwkJCXByaW50ZigiICV1ICVzIiwgcGJpdCwgaXA2YWRkcl9zdHJpbmcoJmEpKTsKKwkJfQorCQlpZiAocGJpdCA+IDApIHsKKwkJCXB1dGNoYXIoJyAnKTsKKwkJCWlmIChuc19ucHJpbnQoY3AgKyAxICsgc2l6ZW9mKGEpIC0gcGJ5dGUsIGJwKSA9PSBOVUxMKQorCQkJCXJldHVybihOVUxMKTsKKwkJfQorCQlicmVhazsKKwkgICAgfQorI2VuZGlmIC8qSU5FVDYqLworCisJY2FzZSBUX09QVDoKKwkJcHJpbnRmKCIgVURQc2l6ZT0ldSIsIGNsYXNzKTsKKwkJaWYgKG9wdF9mbGFncyAmIDB4ODAwMCkKKwkJCXByaW50ZigiIE9LIik7CisJCWJyZWFrOworCisJY2FzZSBUX1VOU1BFQ0E6CQkvKiBPbmUgbG9uZyBzdHJpbmcgKi8KKwkJaWYgKCFUVEVTVDIoKmNwLCBsZW4pKQorCQkJcmV0dXJuKE5VTEwpOworCQlpZiAoZm5fcHJpbnRuKGNwLCBsZW4sIHNuYXBlbmQpKQorCQkJcmV0dXJuKE5VTEwpOworCQlicmVhazsKKworCWNhc2UgVF9UU0lHOgorCSAgICB7CisJCWlmIChjcCArIGxlbiA+IHNuYXBlbmQpCisJCQlyZXR1cm4oTlVMTCk7CisJCWlmICghdmZsYWcpCisJCQlicmVhazsKKwkJcHV0Y2hhcignICcpOworCQlpZiAoKGNwID0gbnNfbnByaW50KGNwLCBicCkpID09IE5VTEwpCisJCQlyZXR1cm4oTlVMTCk7CisJCWNwICs9IDY7CisJCWlmICghVFRFU1QyKCpjcCwgMikpCisJCQlyZXR1cm4oTlVMTCk7CisJCXByaW50ZigiIGZ1ZGdlPSV1IiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKKwkJY3AgKz0gMjsKKwkJaWYgKCFUVEVTVDIoKmNwLCAyKSkKKwkJCXJldHVybihOVUxMKTsKKwkJcHJpbnRmKCIgbWFjbGVuPSV1IiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKKwkJY3AgKz0gMiArIEVYVFJBQ1RfMTZCSVRTKGNwKTsKKwkJaWYgKCFUVEVTVDIoKmNwLCAyKSkKKwkJCXJldHVybihOVUxMKTsKKwkJcHJpbnRmKCIgb3JpZ2lkPSV1IiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKKwkJY3AgKz0gMjsKKwkJaWYgKCFUVEVTVDIoKmNwLCAyKSkKKwkJCXJldHVybihOVUxMKTsKKwkJcHJpbnRmKCIgZXJyb3I9JXUiLCBFWFRSQUNUXzE2QklUUyhjcCkpOworCQljcCArPSAyOworCQlpZiAoIVRURVNUMigqY3AsIDIpKQorCQkJcmV0dXJuKE5VTEwpOworCQlwcmludGYoIiBvdGhlcmxlbj0ldSIsIEVYVFJBQ1RfMTZCSVRTKGNwKSk7CisJCWNwICs9IDI7CisJICAgIH0KKwl9CisJcmV0dXJuIChycCk7CQkvKiBYWFggVGhpcyBpc24ndCBhbHdheXMgcmlnaHQgKi8KK30KKwordm9pZAorbnNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLCBpbnQgaXNfbWRucykKK3sKKwlyZWdpc3RlciBjb25zdCBIRUFERVIgKm5wOworCXJlZ2lzdGVyIGludCBxZGNvdW50LCBhbmNvdW50LCBuc2NvdW50LCBhcmNvdW50OworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3A7CisJdV9pbnQxNl90IGIyOworCisJbnAgPSAoY29uc3QgSEVBREVSICopYnA7CisJVENIRUNLKCpucCk7CisJLyogZ2V0IHRoZSBieXRlLW9yZGVyIHJpZ2h0ICovCisJcWRjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+cWRjb3VudCk7CisJYW5jb3VudCA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+YW5jb3VudCk7CisJbnNjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+bnNjb3VudCk7CisJYXJjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+YXJjb3VudCk7CisKKwlpZiAoRE5TX1FSKG5wKSkgeworCQkvKiB0aGlzIGlzIGEgcmVzcG9uc2UgKi8KKwkJcHJpbnRmKCIlZCVzJXMlcyVzJXMlcyIsCisJCQlFWFRSQUNUXzE2QklUUygmbnAtPmlkKSwKKwkJCW5zX29wc1tETlNfT1BDT0RFKG5wKV0sCisJCQluc19yZXNwW0ROU19SQ09ERShucCldLAorCQkJRE5TX0FBKG5wKT8gIioiIDogIiIsCisJCQlETlNfUkEobnApPyAiIiA6ICItIiwKKwkJCUROU19UQyhucCk/ICJ8IiA6ICIiLAorCQkJRE5TX0FEKG5wKT8gIiQiIDogIiIpOworCisJCWlmIChxZGNvdW50ICE9IDEpCisJCQlwcmludGYoIiBbJWRxXSIsIHFkY291bnQpOworCQkvKiBQcmludCBRVUVTVElPTiBzZWN0aW9uIG9uIC12diAqLworCQljcCA9IChjb25zdCB1X2NoYXIgKikobnAgKyAxKTsKKwkJd2hpbGUgKHFkY291bnQtLSkgeworCQkJaWYgKHFkY291bnQgPCBFWFRSQUNUXzE2QklUUygmbnAtPnFkY291bnQpIC0gMSkKKwkJCQlwdXRjaGFyKCcsJyk7CisJCQlpZiAodmZsYWcgPiAxKSB7CisJCQkJZnB1dHMoIiBxOiIsIHN0ZG91dCk7CisJCQkJaWYgKChjcCA9IG5zX3FwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQlnb3RvIHRydW5jOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGNwID0gbnNfbnNraXAoY3ApKSA9PSBOVUxMKQorCQkJCQlnb3RvIHRydW5jOworCQkJCWNwICs9IDQ7CS8qIHNraXAgUVRZUEUgYW5kIFFDTEFTUyAqLworCQkJfQorCQl9CisJCXByaW50ZigiICVkLyVkLyVkIiwgYW5jb3VudCwgbnNjb3VudCwgYXJjb3VudCk7CisJCWlmIChhbmNvdW50LS0pIHsKKwkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKKwkJCQlnb3RvIHRydW5jOworCQkJd2hpbGUgKGNwIDwgc25hcGVuZCAmJiBhbmNvdW50LS0pIHsKKwkJCQlwdXRjaGFyKCcsJyk7CisJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQlnb3RvIHRydW5jOworCQkJfQorCQl9CisJCWlmIChhbmNvdW50ID4gMCkKKwkJCWdvdG8gdHJ1bmM7CisJCS8qIFByaW50IE5TIGFuZCBBUiBzZWN0aW9ucyBvbiAtdnYgKi8KKwkJaWYgKHZmbGFnID4gMSkgeworCQkJaWYgKGNwIDwgc25hcGVuZCAmJiBuc2NvdW50LS0pIHsKKwkJCQlmcHV0cygiIG5zOiIsIHN0ZG91dCk7CisJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQlnb3RvIHRydW5jOworCQkJCXdoaWxlIChjcCA8IHNuYXBlbmQgJiYgbnNjb3VudC0tKSB7CisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQkJZ290byB0cnVuYzsKKwkJCQl9CisJCQl9CisJCQlpZiAobnNjb3VudCA+IDApCisJCQkJZ290byB0cnVuYzsKKwkJCWlmIChjcCA8IHNuYXBlbmQgJiYgYXJjb3VudC0tKSB7CisJCQkJZnB1dHMoIiBhcjoiLCBzdGRvdXQpOworCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKKwkJCQkJZ290byB0cnVuYzsKKwkJCQl3aGlsZSAoY3AgPCBzbmFwZW5kICYmIGFyY291bnQtLSkgeworCQkJCQlwdXRjaGFyKCcsJyk7CisJCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKKwkJCQkJCWdvdG8gdHJ1bmM7CisJCQkJfQorCQkJfQorCQkJaWYgKGFyY291bnQgPiAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIHRoaXMgaXMgYSByZXF1ZXN0ICovCisJCXByaW50ZigiJWQlcyVzJXMiLCBFWFRSQUNUXzE2QklUUygmbnAtPmlkKSwgbnNfb3BzW0ROU19PUENPREUobnApXSwKKwkJICAgIEROU19SRChucCkgPyAiKyIgOiAiIiwKKwkJICAgIEROU19DRChucCkgPyAiJSIgOiAiIik7CisKKwkJLyogYW55IHdlaXJkbmVzcz8gKi8KKwkJYjIgPSBFWFRSQUNUXzE2QklUUygoKHVfc2hvcnQgKilucCkrMSk7CisJCWlmIChiMiAmIDB4NmNmKQorCQkJcHJpbnRmKCIgW2IyJjM9MHgleF0iLCBiMik7CisKKwkJaWYgKEROU19PUENPREUobnApID09IElRVUVSWSkgeworCQkJaWYgKHFkY291bnQpCisJCQkJcHJpbnRmKCIgWyVkcV0iLCBxZGNvdW50KTsKKwkJCWlmIChhbmNvdW50ICE9IDEpCisJCQkJcHJpbnRmKCIgWyVkYV0iLCBhbmNvdW50KTsKKwkJfQorCQllbHNlIHsKKwkJCWlmIChhbmNvdW50KQorCQkJCXByaW50ZigiIFslZGFdIiwgYW5jb3VudCk7CisJCQlpZiAocWRjb3VudCAhPSAxKQorCQkJCXByaW50ZigiIFslZHFdIiwgcWRjb3VudCk7CisJCX0KKwkJaWYgKG5zY291bnQpCisJCQlwcmludGYoIiBbJWRuXSIsIG5zY291bnQpOworCQlpZiAoYXJjb3VudCkKKwkJCXByaW50ZigiIFslZGF1XSIsIGFyY291bnQpOworCisJCWNwID0gKGNvbnN0IHVfY2hhciAqKShucCArIDEpOworCQlpZiAocWRjb3VudC0tKSB7CisJCQljcCA9IG5zX3FwcmludChjcCwgKGNvbnN0IHVfY2hhciAqKW5wLCBpc19tZG5zKTsKKwkJCWlmICghY3ApCisJCQkJZ290byB0cnVuYzsKKwkJCXdoaWxlIChjcCA8IHNuYXBlbmQgJiYgcWRjb3VudC0tKSB7CisJCQkJY3AgPSBuc19xcHJpbnQoKGNvbnN0IHVfY2hhciAqKWNwLAorCQkJCQkgICAgICAgKGNvbnN0IHVfY2hhciAqKW5wLAorCQkJCQkgICAgICAgaXNfbWRucyk7CisJCQkJaWYgKCFjcCkKKwkJCQkJZ290byB0cnVuYzsKKwkJCX0KKwkJfQorCQlpZiAocWRjb3VudCA+IDApCisJCQlnb3RvIHRydW5jOworCisJCS8qIFByaW50IHJlbWFpbmluZyBzZWN0aW9ucyBvbiAtdnYgKi8KKwkJaWYgKHZmbGFnID4gMSkgeworCQkJaWYgKGFuY291bnQtLSkgeworCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKKwkJCQkJZ290byB0cnVuYzsKKwkJCQl3aGlsZSAoY3AgPCBzbmFwZW5kICYmIGFuY291bnQtLSkgeworCQkJCQlwdXRjaGFyKCcsJyk7CisJCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKKwkJCQkJCWdvdG8gdHJ1bmM7CisJCQkJfQorCQkJfQorCQkJaWYgKGFuY291bnQgPiAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlpZiAoY3AgPCBzbmFwZW5kICYmIG5zY291bnQtLSkgeworCQkJCWZwdXRzKCIgbnM6Iiwgc3Rkb3V0KTsKKwkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCisJCQkJCWdvdG8gdHJ1bmM7CisJCQkJd2hpbGUgKG5zY291bnQtLSAmJiBjcCA8IHNuYXBlbmQpIHsKKwkJCQkJcHV0Y2hhcignLCcpOworCQkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCisJCQkJCQlnb3RvIHRydW5jOworCQkJCX0KKwkJCX0KKwkJCWlmIChuc2NvdW50ID4gMCkKKwkJCQlnb3RvIHRydW5jOworCQkJaWYgKGNwIDwgc25hcGVuZCAmJiBhcmNvdW50LS0pIHsKKwkJCQlmcHV0cygiIGFyOiIsIHN0ZG91dCk7CisJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQlnb3RvIHRydW5jOworCQkJCXdoaWxlIChjcCA8IHNuYXBlbmQgJiYgYXJjb3VudC0tKSB7CisJCQkJCXB1dGNoYXIoJywnKTsKKwkJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQorCQkJCQkJZ290byB0cnVuYzsKKwkJCQl9CisJCQl9CisJCQlpZiAoYXJjb3VudCA+IDApCisJCQkJZ290byB0cnVuYzsKKwkJfQorCX0KKwlwcmludGYoIiAoJWQpIiwgbGVuZ3RoKTsKKwlyZXR1cm47CisKKyAgdHJ1bmM6CisJcHJpbnRmKCJbfGRvbWFpbl0iKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9wcmludC1kdm1ycC5jIGIvcHJpbnQtZHZtcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE1OWJmCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtZHZtcnAuYwpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWR2bXJwLmMsdiAxLjI3IDIwMDMvMTEvMTkgMDk6NDI6MDQgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKy8qCisgKiBEVk1SUCBtZXNzYWdlIHR5cGVzIGFuZCBmbGFnIHZhbHVlcyBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbQorICogbXJvdXRlZC9kdm1ycC5oLgorICovCisjZGVmaW5lIERWTVJQX1BST0JFCQkxCS8qIGZvciBmaW5kaW5nIG5laWdoYm9ycyAqLworI2RlZmluZSBEVk1SUF9SRVBPUlQJCTIJLyogZm9yIHJlcG9ydGluZyBzb21lIG9yIGFsbCByb3V0ZXMgKi8KKyNkZWZpbmUgRFZNUlBfQVNLX05FSUdIQk9SUwkzCS8qIHNlbnQgYnkgbWFwcGVyLCBhc2tpbmcgZm9yIGEgbGlzdCAqLworCQkJCQkvKiBvZiB0aGlzIHJvdXRlcidzIG5laWdoYm9ycyAqLworI2RlZmluZSBEVk1SUF9ORUlHSEJPUlMJCTQJLyogcmVzcG9uc2UgdG8gc3VjaCBhIHJlcXVlc3QgKi8KKyNkZWZpbmUgRFZNUlBfQVNLX05FSUdIQk9SUzIJNQkvKiBhcyBhYm92ZSwgd2FudCBuZXcgZm9ybWF0IHJlcGx5ICovCisjZGVmaW5lIERWTVJQX05FSUdIQk9SUzIJNgorI2RlZmluZSBEVk1SUF9QUlVORQkJNwkvKiBwcnVuZSBtZXNzYWdlICovCisjZGVmaW5lIERWTVJQX0dSQUZUCQk4CS8qIGdyYWZ0IG1lc3NhZ2UgKi8KKyNkZWZpbmUgRFZNUlBfR1JBRlRfQUNLCQk5CS8qIGdyYWZ0IGFja25vd2xlZGdlbWVudCAqLworCisvKgorICogJ2ZsYWdzJyBieXRlIHZhbHVlcyBpbiBEVk1SUF9ORUlHSEJPUlMyIHJlcGx5LgorICovCisjZGVmaW5lIERWTVJQX05GX1RVTk5FTAkJMHgwMQkvKiBuZWlnaGJvcnMgcmVhY2hlZCB2aWEgdHVubmVsICovCisjZGVmaW5lIERWTVJQX05GX1NSQ1JUCQkweDAyCS8qIHR1bm5lbCB1c2VzIElQIHNvdXJjZSByb3V0aW5nICovCisjZGVmaW5lIERWTVJQX05GX0RPV04JCTB4MTAJLyoga2VybmVsIHN0YXRlIG9mIGludGVyZmFjZSAqLworI2RlZmluZSBEVk1SUF9ORl9ESVNBQkxFRAkweDIwCS8qIGFkbWluaXN0cmF0aXZlbHkgZGlzYWJsZWQgKi8KKyNkZWZpbmUgRFZNUlBfTkZfUVVFUklFUgkweDQwCS8qIEkgYW0gdGhlIHN1Ym5ldCdzIHF1ZXJpZXIgKi8KKworc3RhdGljIGludCBwcmludF9wcm9iZShjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3N0YXRpYyBpbnQgcHJpbnRfcmVwb3J0KGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworc3RhdGljIGludCBwcmludF9uZWlnaGJvcnMoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitzdGF0aWMgaW50IHByaW50X25laWdoYm9yczIoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitzdGF0aWMgaW50IHByaW50X3BydW5lKGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgcHJpbnRfZ3JhZnQoY29uc3QgdV9jaGFyICopOworc3RhdGljIGludCBwcmludF9ncmFmdF9hY2soY29uc3QgdV9jaGFyICopOworCitzdGF0aWMgdV9pbnQzMl90IHRhcmdldF9sZXZlbDsKKwordm9pZAorZHZtcnBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7CisJcmVnaXN0ZXIgdV9jaGFyIHR5cGU7CisKKwllcCA9IChjb25zdCB1X2NoYXIgKilzbmFwZW5kOworCWlmIChicCA+PSBlcCkKKwkJcmV0dXJuOworCisJVENIRUNLKGJwWzFdKTsKKwl0eXBlID0gYnBbMV07CisKKwkvKiBTa2lwIElHTVAgaGVhZGVyICovCisJYnAgKz0gODsKKwlsZW4gLT0gODsKKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBEVk1SUF9QUk9CRToKKwkJcHJpbnRmKCIgUHJvYmUiKTsKKwkJaWYgKHZmbGFnKSB7CisJCQlpZiAocHJpbnRfcHJvYmUoYnAsIGVwLCBsZW4pIDwgMCkKKwkJCQlnb3RvIHRydW5jOworCQl9CisJCWJyZWFrOworCisJY2FzZSBEVk1SUF9SRVBPUlQ6CisJCXByaW50ZigiIFJlcG9ydCIpOworCQlpZiAodmZsYWcgPiAxKSB7CisJCQlpZiAocHJpbnRfcmVwb3J0KGJwLCBlcCwgbGVuKSA8IDApCisJCQkJZ290byB0cnVuYzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRFZNUlBfQVNLX05FSUdIQk9SUzoKKwkJcHJpbnRmKCIgQXNrLW5laWdoYm9ycyhvbGQpIik7CisJCWJyZWFrOworCisJY2FzZSBEVk1SUF9ORUlHSEJPUlM6CisJCXByaW50ZigiIE5laWdoYm9ycyhvbGQpIik7CisJCWlmIChwcmludF9uZWlnaGJvcnMoYnAsIGVwLCBsZW4pIDwgMCkKKwkJCWdvdG8gdHJ1bmM7CisJCWJyZWFrOworCisJY2FzZSBEVk1SUF9BU0tfTkVJR0hCT1JTMjoKKwkJcHJpbnRmKCIgQXNrLW5laWdoYm9yczIiKTsKKwkJYnJlYWs7CisKKwljYXNlIERWTVJQX05FSUdIQk9SUzI6CisJCXByaW50ZigiIE5laWdoYm9yczIiKTsKKwkJLyoKKwkJICogZXh0cmFjdCB2ZXJzaW9uIGFuZCBjYXBhYmlsaXRpZXMgZnJvbSBJR01QIGdyb3VwCisJCSAqIGFkZHJlc3MgZmllbGQKKwkJICovCisJCWJwIC09IDQ7CisJCVRDSEVDSzIoYnBbMF0sIDQpOworCQl0YXJnZXRfbGV2ZWwgPSAoYnBbMF0gPDwgMjQpIHwgKGJwWzFdIDw8IDE2KSB8CisJCSAgICAoYnBbMl0gPDwgOCkgfCBicFszXTsKKwkJYnAgKz0gNDsKKwkJaWYgKHByaW50X25laWdoYm9yczIoYnAsIGVwLCBsZW4pIDwgMCkKKwkJCWdvdG8gdHJ1bmM7CisJCWJyZWFrOworCisJY2FzZSBEVk1SUF9QUlVORToKKwkJcHJpbnRmKCIgUHJ1bmUiKTsKKwkJaWYgKHByaW50X3BydW5lKGJwKSA8IDApCisJCQlnb3RvIHRydW5jOworCQlicmVhazsKKworCWNhc2UgRFZNUlBfR1JBRlQ6CisJCXByaW50ZigiIEdyYWZ0Iik7CisJCWlmIChwcmludF9ncmFmdChicCkgPCAwKQorCQkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisKKwljYXNlIERWTVJQX0dSQUZUX0FDSzoKKwkJcHJpbnRmKCIgR3JhZnQtQUNLIik7CisJCWlmIChwcmludF9ncmFmdF9hY2soYnApIDwgMCkKKwkJCWdvdG8gdHJ1bmM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgW3R5cGUgJWRdIiwgdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiW3xkdm1ycF0iKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgCitwcmludF9yZXBvcnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCwKKyAgICByZWdpc3RlciB1X2ludCBsZW4pCit7CisJcmVnaXN0ZXIgdV9pbnQzMl90IG1hc2ssIG9yaWdpbjsKKwlyZWdpc3RlciBpbnQgbWV0cmljLCBkb25lOworCXJlZ2lzdGVyIHVfaW50IGksIHdpZHRoOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGxlbiA8IDMpIHsKKwkJCXByaW50ZigiIFt8XSIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlUQ0hFQ0syKGJwWzBdLCAzKTsKKwkJbWFzayA9ICh1X2ludDMyX3QpMHhmZiA8PCAyNCB8IGJwWzBdIDw8IDE2IHwgYnBbMV0gPDwgOCB8IGJwWzJdOworCQl3aWR0aCA9IDE7CisJCWlmIChicFswXSkKKwkJCXdpZHRoID0gMjsKKwkJaWYgKGJwWzFdKQorCQkJd2lkdGggPSAzOworCQlpZiAoYnBbMl0pCisJCQl3aWR0aCA9IDQ7CisKKwkJcHJpbnRmKCJcblx0TWFzayAlcyIsIGludG9hKGh0b25sKG1hc2spKSk7CisJCWJwICs9IDM7CisJCWxlbiAtPSAzOworCQlkbyB7CisJCQlpZiAoYnAgKyB3aWR0aCArIDEgPiBlcCkgeworCQkJCXByaW50ZigiIFt8XSIpOworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQlpZiAobGVuIDwgd2lkdGggKyAxKSB7CisJCQkJcHJpbnRmKCJcblx0ICBbVHJ1bmNhdGVkIFJlcG9ydF0iKTsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJb3JpZ2luID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisJCQkJVENIRUNLKCpicCk7CisJCQkJb3JpZ2luID0gb3JpZ2luIDw8IDggfCAqYnArKzsKKwkJCX0KKwkJCWZvciAoIDsgaSA8IDQ7ICsraSkKKwkJCQlvcmlnaW4gPDw9IDg7CisKKwkJCVRDSEVDSygqYnApOworCQkJbWV0cmljID0gKmJwKys7CisJCQlkb25lID0gbWV0cmljICYgMHg4MDsKKwkJCW1ldHJpYyAmPSAweDdmOworCQkJcHJpbnRmKCJcblx0ICAlcyBtZXRyaWMgJWQiLCBpbnRvYShodG9ubChvcmlnaW4pKSwKKwkJCQltZXRyaWMpOworCQkJbGVuIC09IHdpZHRoICsgMTsKKwkJfSB3aGlsZSAoIWRvbmUpOworCX0KKwlyZXR1cm4gKDApOwordHJ1bmM6CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X3Byb2JlKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXAsCisgICAgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCXJlZ2lzdGVyIHVfaW50MzJfdCBnZW5pZDsKKworCVRDSEVDSzIoYnBbMF0sIDQpOworCWlmICgobGVuIDwgNCkgfHwgKChicCArIDQpID4gZXApKSB7CisJCS8qIHsgKGN0YWdzKSAqLworCQlwcmludGYoIiBbfH0iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJZ2VuaWQgPSAoYnBbMF0gPDwgMjQpIHwgKGJwWzFdIDw8IDE2KSB8IChicFsyXSA8PCA4KSB8IGJwWzNdOworCWJwICs9IDQ7CisJbGVuIC09IDQ7CisJaWYgKHZmbGFnID4gMSkKKwkJcHJpbnRmKCJcblx0Iik7CisJZWxzZQorCQlwcmludGYoIiAiKTsKKwlwcmludGYoImdlbmlkICV1IiwgZ2VuaWQpOworCWlmICh2ZmxhZyA8IDIpCisJCXJldHVybiAoMCk7CisKKwl3aGlsZSAoKGxlbiA+IDApICYmIChicCA8IGVwKSkgeworCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJcHJpbnRmKCJcblx0bmVpZ2hib3IgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSk7CisJCWJwICs9IDQ7IGxlbiAtPSA0OworCX0KKwlyZXR1cm4gKDApOwordHJ1bmM6CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X25laWdoYm9ycyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwLAorICAgIHJlZ2lzdGVyIHVfaW50IGxlbikKK3sKKwljb25zdCB1X2NoYXIgKmxhZGRyOworCXJlZ2lzdGVyIHVfY2hhciBtZXRyaWM7CisJcmVnaXN0ZXIgdV9jaGFyIHRocmVzaDsKKwlyZWdpc3RlciBpbnQgbmNvdW50OworCisJd2hpbGUgKGxlbiA+IDAgJiYgYnAgPCBlcCkgeworCQlUQ0hFQ0syKGJwWzBdLCA3KTsKKwkJbGFkZHIgPSBicDsKKwkJYnAgKz0gNDsKKwkJbWV0cmljID0gKmJwKys7CisJCXRocmVzaCA9ICpicCsrOworCQluY291bnQgPSAqYnArKzsKKwkJbGVuIC09IDc7CisJCXdoaWxlICgtLW5jb3VudCA+PSAwKSB7CisJCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJCXByaW50ZigiIFslcyAtPiIsIGlwYWRkcl9zdHJpbmcobGFkZHIpKTsKKwkJCXByaW50ZigiICVzLCAoJWQvJWQpXSIsCisJCQkJICAgaXBhZGRyX3N0cmluZyhicCksIG1ldHJpYywgdGhyZXNoKTsKKwkJCWJwICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJfQorCX0KKwlyZXR1cm4gKDApOwordHJ1bmM6CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X25laWdoYm9yczIocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCwKKyAgICByZWdpc3RlciB1X2ludCBsZW4pCit7CisJY29uc3QgdV9jaGFyICpsYWRkcjsKKwlyZWdpc3RlciB1X2NoYXIgbWV0cmljLCB0aHJlc2gsIGZsYWdzOworCXJlZ2lzdGVyIGludCBuY291bnQ7CisKKwlwcmludGYoIiAodiAlZC4lZCk6IiwKKwkgICAgICAgKGludCl0YXJnZXRfbGV2ZWwgJiAweGZmLAorCSAgICAgICAoaW50KSh0YXJnZXRfbGV2ZWwgPj4gOCkgJiAweGZmKTsKKworCXdoaWxlIChsZW4gPiAwICYmIGJwIDwgZXApIHsKKwkJVENIRUNLMihicFswXSwgOCk7CisJCWxhZGRyID0gYnA7CisJCWJwICs9IDQ7CisJCW1ldHJpYyA9ICpicCsrOworCQl0aHJlc2ggPSAqYnArKzsKKwkJZmxhZ3MgPSAqYnArKzsKKwkJbmNvdW50ID0gKmJwKys7CisJCWxlbiAtPSA4OworCQl3aGlsZSAoLS1uY291bnQgPj0gMCAmJiAobGVuID49IDQpICYmIChicCArIDQpIDw9IGVwKSB7CisJCQlwcmludGYoIiBbJXMgLT4gIiwgaXBhZGRyX3N0cmluZyhsYWRkcikpOworCQkJcHJpbnRmKCIlcyAoJWQvJWQiLCBpcGFkZHJfc3RyaW5nKGJwKSwKKwkJCQkgICAgIG1ldHJpYywgdGhyZXNoKTsKKwkJCWlmIChmbGFncyAmIERWTVJQX05GX1RVTk5FTCkKKwkJCQlwcmludGYoIi90dW5uZWwiKTsKKwkJCWlmIChmbGFncyAmIERWTVJQX05GX1NSQ1JUKQorCQkJCXByaW50ZigiL3NyY3J0Iik7CisJCQlpZiAoZmxhZ3MgJiBEVk1SUF9ORl9RVUVSSUVSKQorCQkJCXByaW50ZigiL3F1ZXJpZXIiKTsKKwkJCWlmIChmbGFncyAmIERWTVJQX05GX0RJU0FCTEVEKQorCQkJCXByaW50ZigiL2Rpc2FibGVkIik7CisJCQlpZiAoZmxhZ3MgJiBEVk1SUF9ORl9ET1dOKQorCQkJCXByaW50ZigiL2Rvd24iKTsKKwkJCXByaW50ZigiKV0iKTsKKwkJCWJwICs9IDQ7CisJCQlsZW4gLT0gNDsKKwkJfQorCQlpZiAobmNvdW50ICE9IC0xKSB7CisJCQlwcmludGYoIiBbfF0iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgaW50CitwcmludF9wcnVuZShyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwKQoreworCVRDSEVDSzIoYnBbMF0sIDEyKTsKKwlwcmludGYoIiBzcmMgJXMgZ3JwICVzIiwgaXBhZGRyX3N0cmluZyhicCksIGlwYWRkcl9zdHJpbmcoYnAgKyA0KSk7CisJYnAgKz0gODsKKwkodm9pZClwcmludGYoIiB0aW1lciAiKTsKKwlyZWx0c19wcmludChFWFRSQUNUXzMyQklUUyhicCkpOworCXJldHVybiAoMCk7Cit0cnVuYzoKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorcHJpbnRfZ3JhZnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKK3sKKwlUQ0hFQ0syKGJwWzBdLCA4KTsKKwlwcmludGYoIiBzcmMgJXMgZ3JwICVzIiwgaXBhZGRyX3N0cmluZyhicCksIGlwYWRkcl9zdHJpbmcoYnAgKyA0KSk7CisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgaW50CitwcmludF9ncmFmdF9hY2socmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKK3sKKwlUQ0hFQ0syKGJwWzBdLCA4KTsKKwlwcmludGYoIiBzcmMgJXMgZ3JwICVzIiwgaXBhZGRyX3N0cmluZyhicCksIGlwYWRkcl9zdHJpbmcoYnAgKyA0KSk7CisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoLTEpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZWFwLmMgYi9wcmludC1lYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjM5ZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtZWFwLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCAtIE1pY2hhZWwgUmljaGFyZHNvbiA8bWNyQHhlbGVyYW5jZS5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZvcm1hdCBhbmQgcHJpbnQgYm9vdHAgcGFja2V0cy4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1lYXAuYyx2IDEuMyAyMDA0LzA0LzIzIDE5OjAzOjM5IG1jciBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJldGhlci5oIgorCitzdHJ1Y3QgZWFwX3BhY2tldF90IHsKKwl1bnNpZ25lZCBjaGFyCWNvZGU7CisJdW5zaWduZWQgY2hhcglpZDsKKwl1bnNpZ25lZCBjaGFyCWxlbmd0aFsyXTsKKwl1bnNpZ25lZCBjaGFyCWRhdGFbMV07Cit9OworCisvKgorICogUHJpbnQgYm9vdHAgcmVxdWVzdHMKKyAqLwordm9pZAorZWFwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCSAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwKKwkgIHVfaW50IGxlbmd0aCBfVV8pCit7CisJY29uc3Qgc3RydWN0IGVhcF9wYWNrZXRfdCAqZWFwOworCisJZWFwID0gKGNvbnN0IHN0cnVjdCBlYXBfcGFja2V0X3QgKiljcDsKKwlORF9UQ0hFQ0soZWFwLT5kYXRhKTsKKworICAgICAgICBORF9QUklOVCgobmRvLCAiRUFQIGNvZGU9JXUgaWQ9JXUgbGVuZ3RoPSV1ICIsIAorCQkgIGVhcC0+Y29kZSwgZWFwLT5pZCwgKGVhcC0+bGVuZ3RoWzBdPDw4KSArIGVhcC0+bGVuZ3RoWzFdKSk7CisKKyAgICAgICAgaWYgKCFuZG8tPm5kb192ZmxhZykKKyAgICAgICAgICAgIHJldHVybjsKKwordHJ1bmM6CisJOworfQorCmRpZmYgLS1naXQgYS9wcmludC1lZ3AuYyBiL3ByaW50LWVncC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTgxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1lZ3AuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LAorICogQmVya2VsZXksIENBLiAgVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvCisgKiBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSW5pdGlhbCBjb250cmlidXRpb24gZnJvbSBKZWZmIEhvbmlnIChqY2hATUlUQ0hFTEwuQ0lULkNPUk5FTEwuRURVKS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1lZ3AuYyx2IDEuMzcgMjAwNS8wMS8xMiAxMToxOTowOSBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImlwLmgiCisKK3N0cnVjdCBlZ3BfcGFja2V0IHsKKwl1X2ludDhfdCAgZWdwX3ZlcnNpb247CisjZGVmaW5lCUVHUF9WRVJTSU9OCTIKKwl1X2ludDhfdCAgZWdwX3R5cGU7CisjZGVmaW5lICBFR1BUX0FDUVVJUkUJMworI2RlZmluZSAgRUdQVF9SRUFDSAk1CisjZGVmaW5lICBFR1BUX1BPTEwJMgorI2RlZmluZSAgRUdQVF9VUERBVEUJMQorI2RlZmluZSAgRUdQVF9FUlJPUgk4CisJdV9pbnQ4X3QgIGVncF9jb2RlOworI2RlZmluZSAgRUdQQ19SRVFVRVNUCTAKKyNkZWZpbmUgIEVHUENfQ09ORklSTQkxCisjZGVmaW5lICBFR1BDX1JFRlVTRQkyCisjZGVmaW5lICBFR1BDX0NFQVNFCTMKKyNkZWZpbmUgIEVHUENfQ0VBU0VBQ0sJNAorI2RlZmluZSAgRUdQQ19IRUxMTwkwCisjZGVmaW5lICBFR1BDX0hFQVJEVQkxCisJdV9pbnQ4X3QgIGVncF9zdGF0dXM7CisjZGVmaW5lICBFR1BTX1VOU1BFQwkwCisjZGVmaW5lICBFR1BTX0FDVElWRQkxCisjZGVmaW5lICBFR1BTX1BBU1NJVkUJMgorI2RlZmluZSAgRUdQU19OT1JFUwkzCisjZGVmaW5lICBFR1BTX0FETUlOCTQKKyNkZWZpbmUgIEVHUFNfR09ET1dOCTUKKyNkZWZpbmUgIEVHUFNfUEFSQU0JNgorI2RlZmluZSAgRUdQU19QUk9UTwk3CisjZGVmaW5lICBFR1BTX0lOREVUCTAKKyNkZWZpbmUgIEVHUFNfVVAJMQorI2RlZmluZSAgRUdQU19ET1dOCTIKKyNkZWZpbmUgIEVHUFNfVU5TT0wJMHg4MAorCXVfaW50MTZfdCAgZWdwX2NoZWNrc3VtOworCXVfaW50MTZfdCAgZWdwX2FzOworCXVfaW50MTZfdCAgZWdwX3NlcXVlbmNlOworCXVuaW9uIHsKKwkJdV9pbnQxNl90ICBlZ3B1X2hlbGxvOworCQl1X2ludDhfdCBlZ3B1X2d3c1syXTsKKwkJdV9pbnQxNl90ICBlZ3B1X3JlYXNvbjsKKyNkZWZpbmUgIEVHUFJfVU5TUEVDCTAKKyNkZWZpbmUgIEVHUFJfQkFESEVBRAkxCisjZGVmaW5lICBFR1BSX0JBRERBVEEJMgorI2RlZmluZSAgRUdQUl9OT1JFQUNICTMKKyNkZWZpbmUgIEVHUFJfWFNQT0xMCTQKKyNkZWZpbmUgIEVHUFJfTk9SRVNQCTUKKyNkZWZpbmUgIEVHUFJfVVZFUlNJT04JNgorCX0gZWdwX2hhbmRnOworI2RlZmluZSAgZWdwX2hlbGxvICBlZ3BfaGFuZGcuZWdwdV9oZWxsbworI2RlZmluZSAgZWdwX2ludGd3ICBlZ3BfaGFuZGcuZWdwdV9nd3NbMF0KKyNkZWZpbmUgIGVncF9leHRndyAgZWdwX2hhbmRnLmVncHVfZ3dzWzFdCisjZGVmaW5lICBlZ3BfcmVhc29uICBlZ3BfaGFuZGcuZWdwdV9yZWFzb24KKwl1bmlvbiB7CisJCXVfaW50MTZfdCAgZWdwdV9wb2xsOworCQl1X2ludDMyX3QgZWdwdV9zb3VyY2VuZXQ7CisJfSBlZ3BfcGFuZHM7CisjZGVmaW5lICBlZ3BfcG9sbCAgZWdwX3BhbmRzLmVncHVfcG9sbAorI2RlZmluZSAgZWdwX3NvdXJjZW5ldCAgZWdwX3BhbmRzLmVncHVfc291cmNlbmV0Cit9OworCitjb25zdCBjaGFyICplZ3BfYWNxdWlyZV9jb2Rlc1tdID0geworCSJyZXF1ZXN0IiwKKwkiY29uZmlybSIsCisJInJlZnVzZSIsCisJImNlYXNlIiwKKwkiY2Vhc2VfYWNrIgorfTsKKworY29uc3QgY2hhciAqZWdwX2FjcXVpcmVfc3RhdHVzW10gPSB7CisJInVuc3BlY2lmaWVkIiwKKwkiYWN0aXZlX21vZGUiLAorCSJwYXNzaXZlX21vZGUiLAorCSJpbnN1ZmZpY2llbnRfcmVzb3VyY2VzIiwKKwkiYWRtaW5pc3RyYXRpdmVseV9wcm9oaWJpdGVkIiwKKwkiZ29pbmdfZG93biIsCisJInBhcmFtZXRlcl92aW9sYXRpb24iLAorCSJwcm90b2NvbF92aW9sYXRpb24iCit9OworCitjb25zdCBjaGFyICplZ3BfcmVhY2hfY29kZXNbXSA9IHsKKwkiaGVsbG8iLAorCSJpLWgtdSIKK307CisKK2NvbnN0IGNoYXIgKmVncF9zdGF0dXNfdXBkb3duW10gPSB7CisJImluZGV0ZXJtaW5hdGUiLAorCSJ1cCIsCisJImRvd24iCit9OworCitjb25zdCBjaGFyICplZ3BfcmVhc29uc1tdID0geworCSJ1bnNwZWNpZmllZCIsCisJImJhZF9FR1BfaGVhZGVyX2Zvcm1hdCIsCisJImJhZF9FR1BfZGF0YV9maWVsZF9mb3JtYXQiLAorCSJyZWFjaGFiaWxpdHlfaW5mb191bmF2YWlsYWJsZSIsCisJImV4Y2Vzc2l2ZV9wb2xsaW5nX3JhdGUiLAorCSJub19yZXNwb25zZSIsCisJInVuc3VwcG9ydGVkX3ZlcnNpb24iCit9OworCitzdGF0aWMgdm9pZAorZWdwbnJwcmludChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgZWdwX3BhY2tldCAqZWdwKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfaW50OF90ICpjcDsKKwl1X2ludDMyX3QgYWRkcjsKKwlyZWdpc3RlciB1X2ludDMyX3QgbmV0OworCXJlZ2lzdGVyIHVfaW50IG5ldGxlbjsKKwlpbnQgZ2F0ZXdheXMsIGRpc3RhbmNlcywgbmV0d29ya3M7CisJaW50IHRfZ2F0ZXdheXM7CisJY29uc3QgY2hhciAqY29tbWE7CisKKwlhZGRyID0gZWdwLT5lZ3Bfc291cmNlbmV0OworCWlmIChJTl9DTEFTU0EoYWRkcikpIHsKKwkJbmV0ID0gYWRkciAmIElOX0NMQVNTQV9ORVQ7CisJCW5ldGxlbiA9IDE7CisJfSBlbHNlIGlmIChJTl9DTEFTU0IoYWRkcikpIHsKKwkJbmV0ID0gYWRkciAmIElOX0NMQVNTQl9ORVQ7CisJCW5ldGxlbiA9IDI7CisJfSBlbHNlIGlmIChJTl9DTEFTU0MoYWRkcikpIHsKKwkJbmV0ID0gYWRkciAmIElOX0NMQVNTQ19ORVQ7CisJCW5ldGxlbiA9IDM7CisJfSBlbHNlIHsKKwkJbmV0ID0gMDsKKwkJbmV0bGVuID0gMDsKKwl9CisJY3AgPSAodV9pbnQ4X3QgKikoZWdwICsgMSk7CisKKwl0X2dhdGV3YXlzID0gZWdwLT5lZ3BfaW50Z3cgKyBlZ3AtPmVncF9leHRndzsKKwlmb3IgKGdhdGV3YXlzID0gMDsgZ2F0ZXdheXMgPCB0X2dhdGV3YXlzOyArK2dhdGV3YXlzKSB7CisJCS8qIFBpY2t1cCBob3N0IHBhcnQgb2YgZ2F0ZXdheSBhZGRyZXNzICovCisJCWFkZHIgPSAwOworCQlUQ0hFQ0syKGNwWzBdLCA0IC0gbmV0bGVuKTsKKwkJc3dpdGNoIChuZXRsZW4pIHsKKworCQljYXNlIDE6CisJCQlhZGRyID0gKmNwKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAyOgorCQkJYWRkciA9IChhZGRyIDw8IDgpIHwgKmNwKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAzOgorCQkJYWRkciA9IChhZGRyIDw8IDgpIHwgKmNwKys7CisJCX0KKwkJYWRkciB8PSBuZXQ7CisJCVRDSEVDSzIoY3BbMF0sIDEpOworCQlkaXN0YW5jZXMgPSAqY3ArKzsKKwkJcHJpbnRmKCIgJXMgJXMgIiwKKwkJICAgICAgIGdhdGV3YXlzIDwgKGludCllZ3AtPmVncF9pbnRndyA/ICJpbnQiIDogImV4dCIsCisJCSAgICAgICBpcGFkZHJfc3RyaW5nKCZhZGRyKSk7CisKKwkJY29tbWEgPSAiIjsKKwkJcHV0Y2hhcignKCcpOworCQl3aGlsZSAoLS1kaXN0YW5jZXMgPj0gMCkgeworCQkJVENIRUNLMihjcFswXSwgMik7CisJCQlwcmludGYoIiVzZCVkOiIsIGNvbW1hLCAoaW50KSpjcCsrKTsKKwkJCWNvbW1hID0gIiwgIjsKKwkJCW5ldHdvcmtzID0gKmNwKys7CisJCQl3aGlsZSAoLS1uZXR3b3JrcyA+PSAwKSB7CisJCQkJLyogUGlja3VwIG5ldHdvcmsgbnVtYmVyICovCisJCQkJVENIRUNLMihjcFswXSwgMSk7CisJCQkJYWRkciA9ICh1X2ludDMyX3QpKmNwKysgPDwgMjQ7CisJCQkJaWYgKElOX0NMQVNTQihhZGRyKSkgeworCQkJCQlUQ0hFQ0syKGNwWzBdLCAxKTsKKwkJCQkJYWRkciB8PSAodV9pbnQzMl90KSpjcCsrIDw8IDE2OworCQkJCX0gZWxzZSBpZiAoIUlOX0NMQVNTQShhZGRyKSkgeworCQkJCQlUQ0hFQ0syKGNwWzBdLCAyKTsKKwkJCQkJYWRkciB8PSAodV9pbnQzMl90KSpjcCsrIDw8IDE2OworCQkJCQlhZGRyIHw9ICh1X2ludDMyX3QpKmNwKysgPDwgODsKKwkJCQl9CisJCQkJcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKCZhZGRyKSk7CisJCQl9CisJCX0KKwkJcHV0Y2hhcignKScpOworCX0KKwlyZXR1cm47Cit0cnVuYzoKKwlmcHV0cygiW3xdIiwgc3Rkb3V0KTsKK30KKwordm9pZAorZWdwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfaW50OF90ICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBlZ3BfcGFja2V0ICplZ3A7CisJcmVnaXN0ZXIgaW50IHN0YXR1czsKKwlyZWdpc3RlciBpbnQgY29kZTsKKwlyZWdpc3RlciBpbnQgdHlwZTsKKworCWVncCA9IChzdHJ1Y3QgZWdwX3BhY2tldCAqKWJwOworICAgICAgICBpZiAoIVRURVNUMigqZWdwLCBsZW5ndGgpKSB7CisJCXByaW50ZigiW3xlZ3BdIik7CisJCXJldHVybjsKKwl9CisJKHZvaWQpcHJpbnRmKCJlZ3A6ICIpOworCisJaWYgKGVncC0+ZWdwX3ZlcnNpb24gIT0gRUdQX1ZFUlNJT04pIHsKKwkJcHJpbnRmKCJbdmVyc2lvbiAlZF0iLCBlZ3AtPmVncF92ZXJzaW9uKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYoImFzOiVkIHNlcTolZCIsIEVYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9hcyksIEVYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9zZXF1ZW5jZSkpOworCisJdHlwZSA9IGVncC0+ZWdwX3R5cGU7CisJY29kZSA9IGVncC0+ZWdwX2NvZGU7CisJc3RhdHVzID0gZWdwLT5lZ3Bfc3RhdHVzOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFR1BUX0FDUVVJUkU6CisJCXByaW50ZigiIGFjcXVpcmUiKTsKKwkJc3dpdGNoIChjb2RlKSB7CisJCWNhc2UgRUdQQ19SRVFVRVNUOgorCQljYXNlIEVHUENfQ09ORklSTToKKwkJCXByaW50ZigiICVzIiwgZWdwX2FjcXVpcmVfY29kZXNbY29kZV0pOworCQkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWNhc2UgRUdQU19VTlNQRUM6CisJCQljYXNlIEVHUFNfQUNUSVZFOgorCQkJY2FzZSBFR1BTX1BBU1NJVkU6CisJCQkJcHJpbnRmKCIgJXMiLCBlZ3BfYWNxdWlyZV9zdGF0dXNbc3RhdHVzXSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCIgW3N0YXR1cyAlZF0iLCBzdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIgaGVsbG86JWQgcG9sbDolZCIsCisJCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJmVncC0+ZWdwX2hlbGxvKSwKKwkJCSAgICAgICBFWFRSQUNUXzE2QklUUygmZWdwLT5lZ3BfcG9sbCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFR1BDX1JFRlVTRToKKwkJY2FzZSBFR1BDX0NFQVNFOgorCQljYXNlIEVHUENfQ0VBU0VBQ0s6CisJCQlwcmludGYoIiAlcyIsIGVncF9hY3F1aXJlX2NvZGVzW2NvZGVdKTsKKwkJCXN3aXRjaCAoc3RhdHVzICkgeworCQkJY2FzZSBFR1BTX1VOU1BFQzoKKwkJCWNhc2UgRUdQU19OT1JFUzoKKwkJCWNhc2UgRUdQU19BRE1JTjoKKwkJCWNhc2UgRUdQU19HT0RPV046CisJCQljYXNlIEVHUFNfUEFSQU06CisJCQljYXNlIEVHUFNfUFJPVE86CisJCQkJcHJpbnRmKCIgJXMiLCBlZ3BfYWNxdWlyZV9zdGF0dXNbc3RhdHVzXSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJbc3RhdHVzICVkXSIsIHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJbY29kZSAlZF0iLCBjb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBFR1BUX1JFQUNIOgorCQlzd2l0Y2ggKGNvZGUpIHsKKworCQljYXNlIEVHUENfSEVMTE86CisJCWNhc2UgRUdQQ19IRUFSRFU6CisJCQlwcmludGYoIiAlcyIsIGVncF9yZWFjaF9jb2Rlc1tjb2RlXSk7CisJCQlpZiAoc3RhdHVzIDw9IEVHUFNfRE9XTikKKwkJCQlwcmludGYoIiBzdGF0ZTolcyIsIGVncF9zdGF0dXNfdXBkb3duW3N0YXR1c10pOworCQkJZWxzZQorCQkJCXByaW50ZigiIFtzdGF0dXMgJWRdIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIltyZWFjaCBjb2RlICVkXSIsIGNvZGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEVHUFRfUE9MTDoKKwkJcHJpbnRmKCIgcG9sbCIpOworCQlpZiAoZWdwLT5lZ3Bfc3RhdHVzIDw9IEVHUFNfRE9XTikKKwkJCXByaW50ZigiIHN0YXRlOiVzIiwgZWdwX3N0YXR1c191cGRvd25bc3RhdHVzXSk7CisJCWVsc2UKKwkJCXByaW50ZigiIFtzdGF0dXMgJWRdIiwgc3RhdHVzKTsKKwkJcHJpbnRmKCIgbmV0OiVzIiwgaXBhZGRyX3N0cmluZygmZWdwLT5lZ3Bfc291cmNlbmV0KSk7CisJCWJyZWFrOworCisJY2FzZSBFR1BUX1VQREFURToKKwkJcHJpbnRmKCIgdXBkYXRlIik7CisJCWlmIChzdGF0dXMgJiBFR1BTX1VOU09MKSB7CisJCQlzdGF0dXMgJj0gfkVHUFNfVU5TT0w7CisJCQlwcmludGYoIiB1bnNvbGljaXRlZCIpOworCQl9CisJCWlmIChzdGF0dXMgPD0gRUdQU19ET1dOKQorCQkJcHJpbnRmKCIgc3RhdGU6JXMiLCBlZ3Bfc3RhdHVzX3VwZG93bltzdGF0dXNdKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgW3N0YXR1cyAlZF0iLCBzdGF0dXMpOworCQlwcmludGYoIiAlcyBpbnQgJWQgZXh0ICVkIiwKKwkJICAgICAgIGlwYWRkcl9zdHJpbmcoJmVncC0+ZWdwX3NvdXJjZW5ldCksCisJCSAgICAgICBlZ3AtPmVncF9pbnRndywKKwkJICAgICAgIGVncC0+ZWdwX2V4dGd3KTsKKwkJaWYgKHZmbGFnKQorCQkJZWdwbnJwcmludChlZ3ApOworCQlicmVhazsKKworCWNhc2UgRUdQVF9FUlJPUjoKKwkJcHJpbnRmKCIgZXJyb3IiKTsKKwkJaWYgKHN0YXR1cyA8PSBFR1BTX0RPV04pCisJCQlwcmludGYoIiBzdGF0ZTolcyIsIGVncF9zdGF0dXNfdXBkb3duW3N0YXR1c10pOworCQllbHNlCisJCQlwcmludGYoIiBbc3RhdHVzICVkXSIsIHN0YXR1cyk7CisKKwkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9yZWFzb24pIDw9IEVHUFJfVVZFUlNJT04pCisJCQlwcmludGYoIiAlcyIsIGVncF9yZWFzb25zW0VYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9yZWFzb24pXSk7CisJCWVsc2UKKwkJCXByaW50ZigiIFtyZWFzb24gJWRdIiwgRVhUUkFDVF8xNkJJVFMoJmVncC0+ZWdwX3JlYXNvbikpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiW3R5cGUgJWRdIiwgdHlwZSk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL3ByaW50LWVpZ3JwLmMgYi9wcmludC1laWdycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjhiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1laWdycC5jCkBAIC0wLDAgKzEsNDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDQgIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAdGNwZHVtcC5vcmc+CisgKiAgICAgIFRoZSBUQ1BEVU1QIHByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZWlncnAuYyx2IDEuNS4yLjIgMjAwNS8wNS8wNiAwMjo1Mzo0MSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworLyoKKyAqIHBhY2tldCBmb3JtYXQgZG9jdW1lbnRlZCBhdAorICogaHR0cDovL3d3dy5yaHlzaGFkZW4uY29tL2VpZ3JwLmh0bQorICovCisKK3N0cnVjdCBlaWdycF9jb21tb25faGVhZGVyIHsKKyAgICB1X2ludDhfdCB2ZXJzaW9uOworICAgIHVfaW50OF90IG9wY29kZTsKKyAgICB1X2ludDhfdCBjaGVja3N1bVsyXTsKKyAgICB1X2ludDhfdCBmbGFnc1s0XTsKKyAgICB1X2ludDhfdCBzZXFbNF07CisgICAgdV9pbnQ4X3QgYWNrWzRdOworICAgIHVfaW50OF90IGFzbls0XTsKK307CisKKyNkZWZpbmUJRUlHUlBfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZQlFSUdSUF9PUENPREVfVVBEQVRFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZQlFSUdSUF9PUENPREVfUVVFUlkgICAgICAgICAgICAgICAgICAgMworI2RlZmluZQlFSUdSUF9PUENPREVfUkVQTFkgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZQlFSUdSUF9PUENPREVfSEVMTE8gICAgICAgICAgICAgICAgICAgNQorI2RlZmluZQlFSUdSUF9PUENPREVfSVBYU0FQICAgICAgICAgICAgICAgICAgNgorI2RlZmluZQlFSUdSUF9PUENPREVfUFJPQkUgICAgICAgICAgICAgICAgICAgNworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBlaWdycF9vcGNvZGVfdmFsdWVzW10gPSB7CisgICAgeyBFSUdSUF9PUENPREVfVVBEQVRFLCAiVXBkYXRlIiB9LAorICAgIHsgRUlHUlBfT1BDT0RFX1FVRVJZLCAiUXVlcnkiIH0sCisgICAgeyBFSUdSUF9PUENPREVfUkVQTFksICJSZXBseSIgfSwKKyAgICB7IEVJR1JQX09QQ09ERV9IRUxMTywgIkhlbGxvIiB9LAorICAgIHsgRUlHUlBfT1BDT0RFX0lQWFNBUCwgIklQWCBTQVAiIH0sCisgICAgeyBFSUdSUF9PUENPREVfUFJPQkUsICJQcm9iZSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBlaWdycF9jb21tb25faGVhZGVyX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAiSW5pdCIgfSwKKyAgICB7IDB4MDIsICJDb25kaXRpb25hbGx5IFJlY2VpdmVkIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCBlaWdycF90bHZfaGVhZGVyIHsKKyAgICB1X2ludDhfdCB0eXBlWzJdOworICAgIHVfaW50OF90IGxlbmd0aFsyXTsKK307CisKKyNkZWZpbmUgRUlHUlBfVExWX0dFTkVSQUxfUEFSTSAgIDB4MDAwMQorI2RlZmluZSBFSUdSUF9UTFZfQVVUSCAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEVJR1JQX1RMVl9TRVEgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRUlHUlBfVExWX1NXX1ZFUlNJT04gICAgIDB4MDAwNAorI2RlZmluZSBFSUdSUF9UTFZfTUNBU1RfU0VRICAgICAgMHgwMDA1CisjZGVmaW5lIEVJR1JQX1RMVl9JUF9JTlQgICAgICAgICAweDAxMDIKKyNkZWZpbmUgRUlHUlBfVExWX0lQX0VYVCAgICAgICAgIDB4MDEwMworI2RlZmluZSBFSUdSUF9UTFZfQVRfSU5UICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEVJR1JQX1RMVl9BVF9FWFQgICAgICAgICAweDAyMDMKKyNkZWZpbmUgRUlHUlBfVExWX0FUX0NBQkxFX1NFVFVQIDB4MDIwNAorI2RlZmluZSBFSUdSUF9UTFZfSVBYX0lOVCAgICAgICAgMHgwMzAyCisjZGVmaW5lIEVJR1JQX1RMVl9JUFhfRVhUICAgICAgICAweDAzMDMKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgZWlncnBfdGx2X3ZhbHVlc1tdID0geworICAgIHsgRUlHUlBfVExWX0dFTkVSQUxfUEFSTSwgIkdlbmVyYWwgUGFyYW1ldGVycyJ9LAorICAgIHsgRUlHUlBfVExWX0FVVEgsICJBdXRoZW50aWNhdGlvbiJ9LAorICAgIHsgRUlHUlBfVExWX1NFUSwgIlNlcXVlbmNlIn0sCisgICAgeyBFSUdSUF9UTFZfU1dfVkVSU0lPTiwgIlNvZnR3YXJlIFZlcnNpb24ifSwKKyAgICB7IEVJR1JQX1RMVl9NQ0FTVF9TRVEsICJOZXh0IE11bHRpY2FzdCBTZXF1ZW5jZSJ9LAorICAgIHsgRUlHUlBfVExWX0lQX0lOVCwgIklQIEludGVybmFsIHJvdXRlcyJ9LAorICAgIHsgRUlHUlBfVExWX0lQX0VYVCwgIklQIEV4dGVybmFsIHJvdXRlcyJ9LAorICAgIHsgRUlHUlBfVExWX0FUX0lOVCwgIkFwcGxlVGFsayBJbnRlcm5hbCByb3V0ZXMifSwKKyAgICB7IEVJR1JQX1RMVl9BVF9FWFQsICJBcHBsZVRhbGsgRXh0ZXJuYWwgcm91dGVzIn0sCisgICAgeyBFSUdSUF9UTFZfQVRfQ0FCTEVfU0VUVVAsICJBcHBsZVRhbGsgQ2FibGUgc2V0dXAifSwKKyAgICB7IEVJR1JQX1RMVl9JUFhfSU5ULCAiSVBYIEludGVybmFsIHJvdXRlcyJ9LAorICAgIHsgRUlHUlBfVExWX0lQWF9FWFQsICJJUFggRXh0ZXJuYWwgcm91dGVzIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RydWN0IGVpZ3JwX3Rsdl9nZW5lcmFsX3Bhcm1fdCB7CisgICAgdV9pbnQ4X3QgazE7CisgICAgdV9pbnQ4X3QgazI7CisgICAgdV9pbnQ4X3QgazM7CisgICAgdV9pbnQ4X3QgazQ7CisgICAgdV9pbnQ4X3QgazU7CisgICAgdV9pbnQ4X3QgcmVzOworICAgIHVfaW50OF90IGhvbGR0aW1lWzJdOworfTsgICAgICAgICAgCisKK3N0cnVjdCBlaWdycF90bHZfc3dfdmVyc2lvbl90IHsKKyAgICB1X2ludDhfdCBpb3NfbWFqb3I7CisgICAgdV9pbnQ4X3QgaW9zX21pbm9yOworICAgIHVfaW50OF90IGVpZ3JwX21ham9yOworICAgIHVfaW50OF90IGVpZ3JwX21pbm9yOworfTsgCisKK3N0cnVjdCBlaWdycF90bHZfaXBfaW50X3QgeworICAgIHVfaW50OF90IG5leHRob3BbNF07CisgICAgdV9pbnQ4X3QgZGVsYXlbNF07CisgICAgdV9pbnQ4X3QgYmFuZHdpZHRoWzRdOworICAgIHVfaW50OF90IG10dVszXTsKKyAgICB1X2ludDhfdCBob3Bjb3VudDsKKyAgICB1X2ludDhfdCByZWxpYWJpbGl0eTsKKyAgICB1X2ludDhfdCBsb2FkOworICAgIHVfaW50OF90IHJlc2VydmVkWzJdOworICAgIHVfaW50OF90IHBsZW47CisgICAgdV9pbnQ4X3QgZGVzdGluYXRpb247IC8qIHZhcmlhYmxlIGxlbmd0aCBbMS00XSBieXRlcyBlbmNvZGluZyAqLworfTsgCisKK3N0cnVjdCBlaWdycF90bHZfaXBfZXh0X3QgeworICAgIHVfaW50OF90IG5leHRob3BbNF07CisgICAgdV9pbnQ4X3Qgb3JpZ2luX3JvdXRlcls0XTsKKyAgICB1X2ludDhfdCBvcmlnaW5fYXNbNF07CisgICAgdV9pbnQ4X3QgdGFnWzRdOworICAgIHVfaW50OF90IG1ldHJpY1s0XTsKKyAgICB1X2ludDhfdCByZXNlcnZlZFsyXTsKKyAgICB1X2ludDhfdCBwcm90b19pZDsKKyAgICB1X2ludDhfdCBmbGFnczsKKyAgICB1X2ludDhfdCBkZWxheVs0XTsKKyAgICB1X2ludDhfdCBiYW5kd2lkdGhbNF07CisgICAgdV9pbnQ4X3QgbXR1WzNdOworICAgIHVfaW50OF90IGhvcGNvdW50OworICAgIHVfaW50OF90IHJlbGlhYmlsaXR5OworICAgIHVfaW50OF90IGxvYWQ7CisgICAgdV9pbnQ4X3QgcmVzZXJ2ZWQyWzJdOworICAgIHVfaW50OF90IHBsZW47CisgICAgdV9pbnQ4X3QgZGVzdGluYXRpb247IC8qIHZhcmlhYmxlIGxlbmd0aCBbMS00XSBieXRlcyBlbmNvZGluZyAqLworfTsgCisKK3N0cnVjdCBlaWdycF90bHZfYXRfY2FibGVfc2V0dXBfdCB7CisgICAgdV9pbnQ4X3QgY2FibGVfc3RhcnRbMl07CisgICAgdV9pbnQ4X3QgY2FibGVfZW5kWzJdOworICAgIHVfaW50OF90IHJvdXRlcl9pZFs0XTsKK307CisKK3N0cnVjdCBlaWdycF90bHZfYXRfaW50X3QgeworICAgIHVfaW50OF90IG5leHRob3BbNF07CisgICAgdV9pbnQ4X3QgZGVsYXlbNF07CisgICAgdV9pbnQ4X3QgYmFuZHdpZHRoWzRdOworICAgIHVfaW50OF90IG10dVszXTsKKyAgICB1X2ludDhfdCBob3Bjb3VudDsKKyAgICB1X2ludDhfdCByZWxpYWJpbGl0eTsKKyAgICB1X2ludDhfdCBsb2FkOworICAgIHVfaW50OF90IHJlc2VydmVkWzJdOworICAgIHVfaW50OF90IGNhYmxlX3N0YXJ0WzJdOworICAgIHVfaW50OF90IGNhYmxlX2VuZFsyXTsKK307IAorCitzdHJ1Y3QgZWlncnBfdGx2X2F0X2V4dF90IHsKKyAgICB1X2ludDhfdCBuZXh0aG9wWzRdOworICAgIHVfaW50OF90IG9yaWdpbl9yb3V0ZXJbNF07CisgICAgdV9pbnQ4X3Qgb3JpZ2luX2FzWzRdOworICAgIHVfaW50OF90IHRhZ1s0XTsKKyAgICB1X2ludDhfdCBwcm90b19pZDsKKyAgICB1X2ludDhfdCBmbGFnczsKKyAgICB1X2ludDhfdCBtZXRyaWNbMl07CisgICAgdV9pbnQ4X3QgZGVsYXlbNF07CisgICAgdV9pbnQ4X3QgYmFuZHdpZHRoWzRdOworICAgIHVfaW50OF90IG10dVszXTsKKyAgICB1X2ludDhfdCBob3Bjb3VudDsKKyAgICB1X2ludDhfdCByZWxpYWJpbGl0eTsKKyAgICB1X2ludDhfdCBsb2FkOworICAgIHVfaW50OF90IHJlc2VydmVkMlsyXTsKKyAgICB1X2ludDhfdCBjYWJsZV9zdGFydFsyXTsKKyAgICB1X2ludDhfdCBjYWJsZV9lbmRbMl07Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBlaWdycF9leHRfcHJvdG9faWRfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAiSUdSUCIgfSwKKyAgICB7IDB4MDIsICJFSUdSUCIgfSwKKyAgICB7IDB4MDMsICJTdGF0aWMiIH0sCisgICAgeyAweDA0LCAiUklQIiB9LAorICAgIHsgMHgwNSwgIkhlbGxvIiB9LAorICAgIHsgMHgwNiwgIk9TUEYiIH0sCisgICAgeyAweDA3LCAiSVMtSVMiIH0sCisgICAgeyAweDA4LCAiRUdQIiB9LAorICAgIHsgMHgwOSwgIkJHUCIgfSwKKyAgICB7IDB4MGEsICJJRFJQIiB9LAorICAgIHsgMHgwYiwgIkNvbm5lY3RlZCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCit2b2lkCitlaWdycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikgeworCisgICAgY29uc3Qgc3RydWN0IGVpZ3JwX2NvbW1vbl9oZWFkZXIgKmVpZ3JwX2NvbV9oZWFkZXI7CisgICAgY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIgKmVpZ3JwX3Rsdl9oZWFkZXI7CisgICAgY29uc3QgdV9jaGFyICp0cHRyLCp0bHZfdHB0cjsKKyAgICB1X2ludCB0bGVuLGVpZ3JwX3Rsdl9sZW4sZWlncnBfdGx2X3R5cGUsdGx2X3RsZW4sIGJ5dGVfbGVuZ3RoLCBiaXRfbGVuZ3RoOworICAgIHVfaW50OF90IHByZWZpeFs0XTsKKworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9nZW5lcmFsX3Bhcm1fdCAqZWlncnBfdGx2X2dlbmVyYWxfcGFybTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9zd192ZXJzaW9uX3QgKmVpZ3JwX3Rsdl9zd192ZXJzaW9uOworICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2lwX2ludF90ICplaWdycF90bHZfaXBfaW50OworICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2lwX2V4dF90ICplaWdycF90bHZfaXBfZXh0OworICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2F0X2NhYmxlX3NldHVwX3QgKmVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9hdF9pbnRfdCAqZWlncnBfdGx2X2F0X2ludDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9hdF9leHRfdCAqZWlncnBfdGx2X2F0X2V4dDsKKyAgICB9IHRsdl9wdHI7CisKKyAgICB0cHRyPXBwdHI7CisgICAgZWlncnBfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgZWlncnBfY29tbW9uX2hlYWRlciAqKXBwdHI7CisgICAgVENIRUNLKCplaWdycF9jb21faGVhZGVyKTsKKworICAgIC8qCisgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCisgICAgICovCisgICAgaWYgKGVpZ3JwX2NvbV9oZWFkZXItPnZlcnNpb24gIT0gRUlHUlBfVkVSU0lPTikgeworCXByaW50ZigiRUlHUlAgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsZWlncnBfY29tX2hlYWRlci0+dmVyc2lvbik7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGluIG5vbi12ZXJib3NlIG1vZGUganVzdCBsZXRzIHByaW50IHRoZSBiYXNpYyBNZXNzYWdlIFR5cGUqLworICAgIGlmICh2ZmxhZyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJFSUdSUCAlcywgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICB0b2syc3RyKGVpZ3JwX29wY29kZV92YWx1ZXMsICJ1bmtub3duICgldSkiLGVpZ3JwX2NvbV9oZWFkZXItPm9wY29kZSksCisgICAgICAgICAgICAgICBsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogb2sgdGhleSBzZWVtIHRvIHdhbnQgdG8ga25vdyBldmVyeXRoaW5nIC0gbGV0cyBmdWxseSBkZWNvZGUgaXQgKi8KKworICAgIHRsZW49bGVuLXNpemVvZihzdHJ1Y3QgZWlncnBfY29tbW9uX2hlYWRlcik7CisKKyAgICAvKiBGSVhNRSBwcmludCBvdGhlciBoZWFkZXIgaW5mbyAqLworICAgIHByaW50ZigiXG5cdEVJR1JQIHYldSwgb3Bjb2RlOiAlcyAoJXUpLCBjaGtzdW06IDB4JTA0eCwgRmxhZ3M6IFslc11cblx0c2VxOiAweCUwOHgsIGFjazogMHglMDh4LCBBUzogJXUsIGxlbmd0aDogJXUiLAorICAgICAgICAgICBlaWdycF9jb21faGVhZGVyLT52ZXJzaW9uLAorICAgICAgICAgICB0b2syc3RyKGVpZ3JwX29wY29kZV92YWx1ZXMsICJ1bmtub3duLCB0eXBlOiAldSIsZWlncnBfY29tX2hlYWRlci0+b3Bjb2RlKSwKKyAgICAgICAgICAgZWlncnBfY29tX2hlYWRlci0+b3Bjb2RlLAorICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmZWlncnBfY29tX2hlYWRlci0+Y2hlY2tzdW0pLAorICAgICAgICAgICB0b2syc3RyKGVpZ3JwX2NvbW1vbl9oZWFkZXJfZmxhZ192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZlaWdycF9jb21faGVhZGVyLT5mbGFncykpLAorICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmZWlncnBfY29tX2hlYWRlci0+c2VxKSwKKyAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmVpZ3JwX2NvbV9oZWFkZXItPmFjayksCisgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZlaWdycF9jb21faGVhZGVyLT5hc24pLAorICAgICAgICAgICB0bGVuKTsKKworICAgIHRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3QgZWlncnBfY29tbW9uX2hlYWRlcik7CisKKyAgICB3aGlsZSh0bGVuPjApIHsKKyAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0IGhlYWRlciA/ICovCisgICAgICAgIFRDSEVDSzIoKnRwdHIsIHNpemVvZihzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlcikpOworCisgICAgICAgIGVpZ3JwX3Rsdl9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIgKil0cHRyOworICAgICAgICBlaWdycF90bHZfbGVuPUVYVFJBQ1RfMTZCSVRTKCZlaWdycF90bHZfaGVhZGVyLT5sZW5ndGgpOworICAgICAgICBlaWdycF90bHZfdHlwZT1FWFRSQUNUXzE2QklUUygmZWlncnBfdGx2X2hlYWRlci0+dHlwZSk7CisKKworICAgICAgICBpZiAoZWlncnBfdGx2X2xlbiA8IHNpemVvZihzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlcikgfHwKKyAgICAgICAgICAgIGVpZ3JwX3Rsdl9sZW4gPiB0bGVuKSB7CisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKSksIlxuXHQgICAgIix0bGVuKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigiXG5cdCAgJXMgVExWICgweCUwNHgpLCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgIHRvazJzdHIoZWlncnBfdGx2X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICBlaWdycF90bHZfdHlwZSksCisgICAgICAgICAgICAgICBlaWdycF90bHZfdHlwZSwKKyAgICAgICAgICAgICAgIGVpZ3JwX3Rsdl9sZW4pOworCisgICAgICAgIHRsdl90cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKTsKKyAgICAgICAgdGx2X3RsZW49ZWlncnBfdGx2X2xlbi1zaXplb2Yoc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIpOworCisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG9iamVjdCA/ICovCisgICAgICAgIFRDSEVDSzIoKnRwdHIsIGVpZ3JwX3Rsdl9sZW4pOworCisgICAgICAgIHN3aXRjaChlaWdycF90bHZfdHlwZSkgeworCisgICAgICAgIGNhc2UgRUlHUlBfVExWX0dFTkVSQUxfUEFSTToKKyAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2dlbmVyYWxfcGFybSA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2dlbmVyYWxfcGFybV90ICopdGx2X3RwdHI7CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBob2xkdGltZTogJXVzLCBrMSAldSwgazIgJXUsIGszICV1LCBrNCAldSwgazUgJXUiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIuZWlncnBfdGx2X2dlbmVyYWxfcGFybS0+aG9sZHRpbWUpLAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2dlbmVyYWxfcGFybS0+azEsCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtLT5rMiwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9nZW5lcmFsX3Bhcm0tPmszLAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2dlbmVyYWxfcGFybS0+azQsCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtLT5rNSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVJR1JQX1RMVl9TV19WRVJTSU9OOgorICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfc3dfdmVyc2lvbiA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X3N3X3ZlcnNpb25fdCAqKXRsdl90cHRyOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgSU9TIHZlcnNpb246ICV1LiV1LCBFSUdSUCB2ZXJzaW9uICV1LiV1IiwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9zd192ZXJzaW9uLT5pb3NfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfc3dfdmVyc2lvbi0+aW9zX21pbm9yLAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X3N3X3ZlcnNpb24tPmVpZ3JwX21ham9yLAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X3N3X3ZlcnNpb24tPmVpZ3JwX21pbm9yKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUlHUlBfVExWX0lQX0lOVDoKKyAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2ludCA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2lwX2ludF90ICopdGx2X3RwdHI7CisKKyAgICAgICAgICAgIGJpdF9sZW5ndGggPSB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPnBsZW47CisgICAgICAgICAgICBpZiAoYml0X2xlbmd0aCA+IDMyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIGlsbGVnYWwgcHJlZml4IGxlbmd0aCAldSIsYml0X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlX2xlbmd0aCA9IChiaXRfbGVuZ3RoICsgNykgLyA4OyAvKiB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcgKi8KKyAgICAgICAgICAgIG1lbXNldChwcmVmaXgsIDAsIDQpOworICAgICAgICAgICAgbWVtY3B5KHByZWZpeCwmdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5kZXN0aW5hdGlvbixieXRlX2xlbmd0aCk7CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBJUHY0IHByZWZpeDogJTE1cy8ldSwgbmV4dGhvcDogIiwKKyAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHByZWZpeCksCisgICAgICAgICAgICAgICAgICAgYml0X2xlbmd0aCk7CisgICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+bmV4dGhvcCkgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGYoInNlbGYiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzIixpcGFkZHJfc3RyaW5nKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPm5leHRob3ApKTsKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgZGVsYXkgJXUgbXMsIGJhbmR3aWR0aCAldSBLYnBzLCBtdHUgJXUsIGhvcCAldSwgcmVsaWFiaWxpdHkgJXUsIGxvYWQgJXUiLAorICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5kZWxheSkvMTAwKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPm10dSksCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5ob3Bjb3VudCwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPnJlbGlhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVJR1JQX1RMVl9JUF9FWFQ6CisgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQgPSAoY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9pcF9leHRfdCAqKXRsdl90cHRyOworCisgICAgICAgICAgICBiaXRfbGVuZ3RoID0gdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5wbGVuOworICAgICAgICAgICAgaWYgKGJpdF9sZW5ndGggPiAzMikgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBpbGxlZ2FsIHByZWZpeCBsZW5ndGggJXUiLGJpdF9sZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZV9sZW5ndGggPSAoYml0X2xlbmd0aCArIDcpIC8gODsgLyogdmFyaWFibGUgbGVuZ3RoIGVuY29kaW5nICovCisgICAgICAgICAgICBtZW1zZXQocHJlZml4LCAwLCA0KTsKKyAgICAgICAgICAgIG1lbWNweShwcmVmaXgsJnRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+ZGVzdGluYXRpb24sYnl0ZV9sZW5ndGgpOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgSVB2NCBwcmVmaXg6ICUxNXMvJXUsIG5leHRob3A6ICIsCisgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgIGJpdF9sZW5ndGgpOworICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPm5leHRob3ApID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJzZWxmIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsaXBhZGRyX3N0cmluZygmdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5uZXh0aG9wKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIG9yaWdpbi1yb3V0ZXIgJXMsIG9yaWdpbi1hcyAldSwgb3JpZ2luLXByb3RvICVzLCBmbGFncyBbMHglMDJ4XSwgdGFnIDB4JTA4eCwgbWV0cmljICV1IiwKKyAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+b3JpZ2luX3JvdXRlciksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5vcmlnaW5fYXMpLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZWlncnBfZXh0X3Byb3RvX2lkX3ZhbHVlcywidW5rbm93biIsdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5wcm90b19pZCksCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5mbGFncywKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPnRhZyksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5tZXRyaWMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgZGVsYXkgJXUgbXMsIGJhbmR3aWR0aCAldSBLYnBzLCBtdHUgJXUsIGhvcCAldSwgcmVsaWFiaWxpdHkgJXUsIGxvYWQgJXUiLAorICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5kZWxheSkvMTAwKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPm10dSksCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5ob3Bjb3VudCwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPnJlbGlhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVJR1JQX1RMVl9BVF9DQUJMRV9TRVRVUDoKKyAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2NhYmxlX3NldHVwID0gKGNvbnN0IHN0cnVjdCBlaWdycF90bHZfYXRfY2FibGVfc2V0dXBfdCAqKXRsdl90cHRyOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQ2FibGUtcmFuZ2U6ICV1LSV1LCBSb3V0ZXItSUQgJXUiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cC0+Y2FibGVfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cC0+Y2FibGVfZW5kKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfY2FibGVfc2V0dXAtPnJvdXRlcl9pZCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFSUdSUF9UTFZfQVRfSU5UOgorICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfaW50ID0gKGNvbnN0IHN0cnVjdCBlaWdycF90bHZfYXRfaW50X3QgKil0bHZfdHB0cjsKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICBDYWJsZS1SYW5nZTogJXUtJXUsIG5leHRob3A6ICIsCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+Y2FibGVfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPmNhYmxlX2VuZCkpOworCisgICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+bmV4dGhvcCkgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGYoInNlbGYiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIiV1LiV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+bmV4dGhvcCksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPm5leHRob3BbMl0pKTsKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgZGVsYXkgJXUgbXMsIGJhbmR3aWR0aCAldSBLYnBzLCBtdHUgJXUsIGhvcCAldSwgcmVsaWFiaWxpdHkgJXUsIGxvYWQgJXUiLAorICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5kZWxheSkvMTAwKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPm10dSksCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5ob3Bjb3VudCwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPnJlbGlhYmlsaXR5LAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+bG9hZCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVJR1JQX1RMVl9BVF9FWFQ6CisgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQgPSAoY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9hdF9leHRfdCAqKXRsdl90cHRyOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgIENhYmxlLVJhbmdlOiAldS0ldSwgbmV4dGhvcDogIiwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5jYWJsZV9zdGFydCksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+Y2FibGVfZW5kKSk7CisKKyAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5uZXh0aG9wKSA9PSAwKQorICAgICAgICAgICAgICAgIHByaW50Zigic2VsZiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiJXUuJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5uZXh0aG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+bmV4dGhvcFsyXSkpOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBvcmlnaW4tcm91dGVyICV1LCBvcmlnaW4tYXMgJXUsIG9yaWdpbi1wcm90byAlcywgZmxhZ3MgWzB4JTAyeF0sIHRhZyAweCUwOHgsIG1ldHJpYyAldSIsCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5vcmlnaW5fcm91dGVyKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPm9yaWdpbl9hcyksCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihlaWdycF9leHRfcHJvdG9faWRfdmFsdWVzLCJ1bmtub3duIix0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPnByb3RvX2lkKSwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+dGFnKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPm1ldHJpYykpOworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBkZWxheSAldSBtcywgYmFuZHdpZHRoICV1IEticHMsIG10dSAldSwgaG9wICV1LCByZWxpYWJpbGl0eSAldSwgbG9hZCAldSIsCisgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmRlbGF5KS8xMDApLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+bXR1KSwKKyAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmhvcGNvdW50LAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+cmVsaWFiaWxpdHksCisgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5sb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIFRMVnMgdGhhdCBsYWNrIGEgZGVjb2RlcgorICAgICAgICAgICAgICogeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKKyAgICAgICAgICAgICAqLworCisgICAgICAgIGNhc2UgRUlHUlBfVExWX0FVVEg6CisgICAgICAgIGNhc2UgRUlHUlBfVExWX1NFUToKKyAgICAgICAgY2FzZSBFSUdSUF9UTFZfTUNBU1RfU0VROgorICAgICAgICBjYXNlIEVJR1JQX1RMVl9JUFhfSU5UOgorICAgICAgICBjYXNlIEVJR1JQX1RMVl9JUFhfRVhUOgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKKyAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodGx2X3RwdHIsIlxuXHQgICAgIix0bHZfdGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgaGV4ZHVtcCA/ICovCisgICAgICAgIGlmICh2ZmxhZyA+IDEpCisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKSksIlxuXHQgICAgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdycF90bHZfbGVuLXNpemVvZihzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlcikpOworCisgICAgICAgIHRwdHIrPWVpZ3JwX3Rsdl9sZW47CisgICAgICAgIHRsZW4tPWVpZ3JwX3Rsdl9sZW47CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZW5jLmMgYi9wcmludC1lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI4NzFiCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtZW5jLmMKQEAgLTAsMCArMSw4NiBAQAorLyoJJE9wZW5CU0Q6IHByaW50LWVuYy5jLHYgMS43IDIwMDIvMDIvMTkgMTk6Mzk6NDAgbWlsbGVydCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZW5jLmMsdiAxLjQgMjAwNS8wNC8wNiAyMTozMjozOSBtY3IgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxwY2FwLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKyNpbmNsdWRlICJlbmMuaCIKKworI2RlZmluZSBFTkNfUFJJTlRfVFlQRSh3aCwgeGYsIG5hbSkgXAorCWlmICgod2gpICYgKHhmKSkgeyBcCisJCXByaW50ZigiJXMlcyIsIG5hbSwgKHdoKSA9PSAoeGYpID8gIik6ICIgOiAiLCIpOyBcCisJCSh3aCkgJj0gfih4Zik7IFwKKwl9CisKK3VfaW50CitlbmNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisJcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwlpbnQgZmxhZ3M7CisJY29uc3Qgc3RydWN0IGVuY2hkciAqaGRyOworCisJaWYgKGNhcGxlbiA8IEVOQ19IRFJMRU4pIHsKKwkJcHJpbnRmKCJbfGVuY10iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaGRyID0gKHN0cnVjdCBlbmNoZHIgKilwOworCWZsYWdzID0gaGRyLT5mbGFnczsKKwlpZiAoZmxhZ3MgPT0gMCkKKwkJcHJpbnRmKCIodW5wcm90ZWN0ZWQpOiAiKTsKKwllbHNlCisJCXByaW50ZigiKCIpOworCUVOQ19QUklOVF9UWVBFKGZsYWdzLCBNX0FVVEgsICJhdXRoZW50aWMiKTsKKwlFTkNfUFJJTlRfVFlQRShmbGFncywgTV9DT05GLCAiY29uZmlkZW50aWFsIik7CisJLyogRU5DX1BSSU5UX1RZUEUoZmxhZ3MsIE1fVFVOTkVMLCAidHVubmVsIik7ICovCisJcHJpbnRmKCJTUEkgMHglMDh4OiAiLCAodV9pbnQzMl90KW50b2hsKGhkci0+c3BpKSk7CisKKwlsZW5ndGggLT0gRU5DX0hEUkxFTjsKKwkvKiBYWFggLSB1c2UgdGhlIGFkZHJlc3MgZmFtaWx5ICovCisJaXBfcHJpbnQoZ25kbywgcCArIEVOQ19IRFJMRU4sIGxlbmd0aCk7CisKK291dDoKKwlyZXR1cm4gKEVOQ19IRFJMRU4pOworfQorCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC1lc3AuYyBiL3ByaW50LWVzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2M4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1lc3AuYwpAQCAtMCwwICsxLDUxMSBAQAorLyoJJE5ldEJTRDogcHJpbnQtYWguYyx2IDEuNCAxOTk2LzA1LzIwIDAwOjQxOjE2IGZ2ZGwgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWVzcC5jLHYgMS41NS4yLjEgMjAwNS8wNC8yMSAwNjo0NDo1NyBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgSEFWRV9MSUJDUllQVE8KKyNpZmRlZiBIQVZFX09QRU5TU0xfRVZQX0gKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgImVzcC5oIgorI2lmZGVmIElORVQ2CisjaW5jbHVkZSAiaXA2LmgiCisjZW5kaWYKKworI2luY2x1ZGUgIm5ldGRpc3NlY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisjaWZuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorI2lmZGVmIElORVQ2CitzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjY7CisJfSB1bjsKK307CisjZWxzZQorI2RlZmluZSBzb2NrYWRkcl9zdG9yYWdlIHNvY2thZGRyCisjZW5kaWYKKyNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgKi8KKworI2lmZGVmIEhBVkVfTElCQ1JZUFRPCitzdHJ1Y3Qgc2FfbGlzdCB7CisJc3RydWN0IHNhX2xpc3QJKm5leHQ7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgZGFkZHI7CisJdV9pbnQzMl90CXNwaTsKKwljb25zdCBFVlBfQ0lQSEVSICpldnA7CisJaW50CQlpdmxlbjsKKwlpbnQJCWF1dGhsZW47CisJdV9jaGFyCQlzZWNyZXRbMjU2XTsgIC8qIGlzIHRoYXQgYmlnIGVub3VnaCBmb3IgYWxsIHNlY3JldHM/ICovCisJaW50CQlzZWNyZXRsZW47Cit9OworCitzdGF0aWMgdm9pZCBlc3BfcHJpbnRfYWRkc2EobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCQkgICAgc3RydWN0IHNhX2xpc3QgKnNhLCBpbnQgc2FfZGVmKQoreworCS8qIGNvcHkgdGhlICJzYSIgKi8KKworCXN0cnVjdCBzYV9saXN0ICpuc2E7CisKKwluc2EgPSAoc3RydWN0IHNhX2xpc3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYV9saXN0KSk7CisJaWYgKG5zYSA9PSBOVUxMKQorCQkoKm5kby0+bmRvX2Vycm9yKShuZG8sICJyYW4gb3V0IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBzYSBzdHJ1Y3R1cmUiKTsKKworCSpuc2EgPSAqc2E7CisKKwlpZiAoc2FfZGVmKQorCQluZG8tPm5kb19zYV9kZWZhdWx0ID0gbnNhOworCisJbnNhLT5uZXh0ID0gbmRvLT5uZG9fc2FfbGlzdF9oZWFkOworCW5kby0+bmRvX3NhX2xpc3RfaGVhZCA9IG5zYTsKK30KKworCitzdGF0aWMgdV9pbnQgaGV4ZGlnaXQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sIGNoYXIgaGV4KQoreworCWlmIChoZXggPj0gJzAnICYmIGhleCA8PSAnOScpCisJCXJldHVybiAoaGV4IC0gJzAnKTsKKwllbHNlIGlmIChoZXggPj0gJ0EnICYmIGhleCA8PSAnRicpCisJCXJldHVybiAoaGV4IC0gJ0EnICsgMTApOworCWVsc2UgaWYgKGhleCA+PSAnYScgJiYgaGV4IDw9ICdmJykKKwkJcmV0dXJuIChoZXggLSAnYScgKyAxMCk7CisJZWxzZSB7CisJCSgqbmRvLT5uZG9fZXJyb3IpKG5kbywgImludmFsaWQgaGV4IGRpZ2l0ICVjIGluIGVzcHNlY3JldFxuIiwgaGV4KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdV9pbnQgaGV4MmJ5dGUobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sIGNoYXIgKmhleHN0cmluZykKK3sKKwl1X2ludCBieXRlOworCisJYnl0ZSA9IChoZXhkaWdpdChuZG8sIGhleHN0cmluZ1swXSkgPDwgNCkgKyBoZXhkaWdpdChuZG8sIGhleHN0cmluZ1sxXSk7CisJcmV0dXJuIGJ5dGU7Cit9CisKKy8qCisgKiBkZWNvZGUgdGhlIGZvcm06ICAgIFNQSU5VTUBJUCA8dGFiPiBBTEdPTkFNRToweHNlY3JldAorICoKKyAqIHNwZWNpYWwgZm9ybTogZmlsZSAvbmFtZQorICogY2F1c2VzIHVzIHRvIGdvIHJlYWQgZnJvbSB0aGlzIGZpbGUgaW5zdGVhZC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGVzcF9wcmludF9kZWNvZGVfb25lc2VjcmV0KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLCBjaGFyICpsaW5lKQoreworCXN0cnVjdCBzYV9saXN0IHNhMTsKKwlpbnQgc2FfZGVmOworCisJY2hhciAqc3Bpa2V5OworCWNoYXIgKmRlY29kZTsKKworCXNwaWtleSA9IHN0cnNlcCgmbGluZSwgIiBcdCIpOworCXNhX2RlZiA9IDA7CisJbWVtc2V0KCZzYTEsIDAsIHNpemVvZihzdHJ1Y3Qgc2FfbGlzdCkpOworCisJLyogaWYgdGhlcmUgaXMgb25seSBvbmUgdG9rZW4sIHRoZW4gaXQgaXMgYW4gYWxnbzprZXkgdG9rZW4gKi8KKwlpZiAobGluZSA9PSBOVUxMKSB7CisJCWRlY29kZSA9IHNwaWtleTsKKwkJc3Bpa2V5ID0gTlVMTDsKKwkJLyogbWVtc2V0KCZzYTEuZGFkZHIsIDAsIHNpemVvZihzYTEuZGFkZHIpKTsgKi8KKwkJLyogc2ExLnNwaSA9IDA7ICovCisJCXNhX2RlZiAgICA9IDE7CisJfSBlbHNlCisJCWRlY29kZSA9IGxpbmU7CisKKwlpZiAoc3Bpa2V5ICYmIHN0cmNhc2VjbXAoc3Bpa2V5LCAiZmlsZSIpID09IDApIHsKKwkJLyogb3BlbiBmaWxlIGFuZCByZWFkIGl0ICovCisJCUZJTEUgKnNlY3JldGZpbGU7CisJCWNoYXIgIGZpbGVsaW5lWzEwMjRdOworCQljaGFyICAqbmw7CisKKwkJc2VjcmV0ZmlsZSA9IGZvcGVuKGxpbmUsIEZPUEVOX1JFQURfVFhUKTsKKwkJaWYgKHNlY3JldGZpbGUgPT0gTlVMTCkgeworCQkJcGVycm9yKGxpbmUpOworCQkJZXhpdCgzKTsKKwkJfQorCisJCXdoaWxlIChmZ2V0cyhmaWxlbGluZSwgc2l6ZW9mKGZpbGVsaW5lKS0xLCBzZWNyZXRmaWxlKSAhPSBOVUxMKSB7CisJCQkvKiByZW1vdmUgbmV3bGluZSBmcm9tIHRoZSBsaW5lICovCisJCQlubCA9IHN0cmNocihmaWxlbGluZSwgJ1xuJyk7CisJCQlpZiAobmwpCisJCQkJKm5sID0gJ1wwJzsKKwkJCWlmIChmaWxlbGluZVswXSA9PSAnIycpIGNvbnRpbnVlOworCQkJaWYgKGZpbGVsaW5lWzBdID09ICdcMCcpIGNvbnRpbnVlOworCisJCQllc3BfcHJpbnRfZGVjb2RlX29uZXNlY3JldChuZG8sIGZpbGVsaW5lKTsKKwkJfQorCQlmY2xvc2Uoc2VjcmV0ZmlsZSk7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGlrZXkpIHsKKwkJY2hhciAqc3Bpc3RyLCAqZm9vOworCQl1X2ludDMyX3Qgc3Bpbm87CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworI2lmZGVmIElORVQ2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisjZW5kaWYKKworCQlzcGlzdHIgPSBzdHJzZXAoJnNwaWtleSwgIkAiKTsKKworCQlzcGlubyA9IHN0cnRvdWwoc3Bpc3RyLCAmZm9vLCAwKTsKKwkJaWYgKHNwaXN0ciA9PSBmb28gfHwgIXNwaWtleSkgeworCQkJKCpuZG8tPm5kb193YXJuaW5nKShuZG8sICJwcmludF9lc3A6IGZhaWxlZCB0byBkZWNvZGUgc3BpIyAlc1xuIiwgZm9vKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXNhMS5zcGkgPSBzcGlubzsKKworCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNhMS5kYWRkcjsKKyNpZmRlZiBJTkVUNgorCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2ExLmRhZGRyOworCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBzcGlrZXksICZzaW42LT5zaW42X2FkZHIpID09IDEpIHsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCQkJc2luNi0+c2luNl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisjZW5kaWYKKwkJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCX0gZWxzZQorI2VuZGlmCisJCWlmIChpbmV0X3B0b24oQUZfSU5FVCwgc3Bpa2V5LCAmc2luLT5zaW5fYWRkcikgPT0gMSkgeworI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisJCQlzaW4tPnNpbl9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyNlbmRpZgorCQkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJfSBlbHNlIHsKKwkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAicHJpbnRfZXNwOiBjYW4gbm90IGRlY29kZSBJUCMgJXNcbiIsIHNwaWtleSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoZGVjb2RlKSB7CisJCWNoYXIgKmNvbG9uLCAqcDsKKwkJdV9jaGFyIGVzcHNlY3JldF9rZXlbMjU2XTsKKwkJaW50IGxlbjsKKwkJc2l6ZV90IGk7CisJCWNvbnN0IEVWUF9DSVBIRVIgKmV2cDsKKwkJaW50IGF1dGhsZW4gPSAwOworCisJCS8qIHNraXAgYW55IGJsYW5rIHNwYWNlcyAqLworCQl3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqZGVjb2RlKSkKKwkJCWRlY29kZSsrOworCisJCWNvbG9uID0gc3RyY2hyKGRlY29kZSwgJzonKTsKKwkJaWYgKGNvbG9uID09IE5VTEwpIHsKKwkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAiZmFpbGVkIHRvIGRlY29kZSBlc3BzZWNyZXQ6ICVzXG4iLCBkZWNvZGUpOworCQkJcmV0dXJuOworCQl9CisJCSpjb2xvbiA9ICdcMCc7CisKKwkJbGVuID0gY29sb24gLSBkZWNvZGU7CisJCWlmIChzdHJsZW4oZGVjb2RlKSA+IHN0cmxlbigiLWhtYWM5NiIpICYmCisJCSAgICAhc3RyY21wKGRlY29kZSArIHN0cmxlbihkZWNvZGUpIC0gc3RybGVuKCItaG1hYzk2IiksCisJCSAgICAiLWhtYWM5NiIpKSB7CisJCQlwID0gc3Ryc3RyKGRlY29kZSwgIi1obWFjOTYiKTsKKwkJCSpwID0gJ1wwJzsKKwkJCWF1dGhsZW4gPSAxMjsKKwkJfQorCQlpZiAoc3RybGVuKGRlY29kZSkgPiBzdHJsZW4oIi1jYmMiKSAmJgorCQkgICAgIXN0cmNtcChkZWNvZGUgKyBzdHJsZW4oZGVjb2RlKSAtIHN0cmxlbigiLWNiYyIpLCAiLWNiYyIpKSB7CisJCQlwID0gc3Ryc3RyKGRlY29kZSwgIi1jYmMiKTsKKwkJCSpwID0gJ1wwJzsKKwkJfQorCQlldnAgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShkZWNvZGUpOworCQlpZiAoIWV2cCkgeworCQkJKCpuZG8tPm5kb193YXJuaW5nKShuZG8sICJmYWlsZWQgdG8gZmluZCBjaXBoZXIgYWxnbyAlc1xuIiwgZGVjb2RlKTsKKwkJCXNhMS5ldnAgPSBOVUxMOworCQkJc2ExLmF1dGhsZW4gPSAwOworCQkJc2ExLml2bGVuID0gMDsKKwkJCXJldHVybjsKKwkJfQorCisJCXNhMS5ldnAgPSBldnA7CisJCXNhMS5hdXRobGVuID0gYXV0aGxlbjsKKwkJc2ExLml2bGVuID0gRVZQX0NJUEhFUl9pdl9sZW5ndGgoZXZwKTsKKworCQljb2xvbisrOworCQlpZiAoY29sb25bMF0gPT0gJzAnICYmIGNvbG9uWzFdID09ICd4JykgeworCQkJLyogZGVjb2RlIHNvbWUgaGV4ISAqLworCQkJY29sb24gKz0gMjsKKwkJCWxlbiA9IHN0cmxlbihjb2xvbikgLyAyOworCisJCQlpZiAobGVuID4gMjU2KSB7CisJCQkJKCpuZG8tPm5kb193YXJuaW5nKShuZG8sICJzZWNyZXQgaXMgdG9vIGJpZzogJWRcbiIsIGxlbik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlpID0gMDsKKwkJCXdoaWxlIChjb2xvblswXSAhPSAnXDAnICYmIGNvbG9uWzFdIT0nXDAnKSB7CisJCQkJZXNwc2VjcmV0X2tleVtpXSA9IGhleDJieXRlKG5kbywgY29sb24pOworCQkJCWNvbG9uICs9IDI7CisJCQkJaSsrOworCQkJfQorCisJCQltZW1jcHkoc2ExLnNlY3JldCwgZXNwc2VjcmV0X2tleSwgaSk7CisJCQlzYTEuc2VjcmV0bGVuID0gaTsKKwkJfSBlbHNlIHsKKwkJCWkgPSBzdHJsZW4oY29sb24pOworCisJCQlpZiAoaSA8IHNpemVvZihzYTEuc2VjcmV0KSkgeworCQkJCW1lbWNweShzYTEuc2VjcmV0LCBjb2xvbiwgaSk7CisJCQkJc2ExLnNlY3JldGxlbiA9IGk7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweShzYTEuc2VjcmV0LCBjb2xvbiwgc2l6ZW9mKHNhMS5zZWNyZXQpKTsKKwkJCQlzYTEuc2VjcmV0bGVuID0gc2l6ZW9mKHNhMS5zZWNyZXQpOworCQkJfQorCQl9CisJfQorCisJZXNwX3ByaW50X2FkZHNhKG5kbywgJnNhMSwgc2FfZGVmKTsKK30KKworc3RhdGljIHZvaWQgZXNwX3ByaW50X2RlY29kZXNlY3JldChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbykKK3sKKwljaGFyICpsaW5lOworCWNoYXIgKnA7CisKKwlwID0gbmRvLT5uZG9fZXNwc2VjcmV0OworCisJd2hpbGUgKG5kby0+bmRvX2VzcHNlY3JldCAmJiBuZG8tPm5kb19lc3BzZWNyZXRbMF0gIT0gJ1wwJykgeworCQkvKiBwaWNrIG91dCB0aGUgZmlyc3QgbGluZSBvciBmaXJzdCB0aGluZyB1bnRpbCBhIGNvbW1hICovCisJCWlmICgobGluZSA9IHN0cnNlcCgmbmRvLT5uZG9fZXNwc2VjcmV0LCAiXG4sIikpID09IE5VTEwpIHsKKwkJCWxpbmUgPSBuZG8tPm5kb19lc3BzZWNyZXQ7CisJCQluZG8tPm5kb19lc3BzZWNyZXQgPSBOVUxMOworCQl9CisKKwkJZXNwX3ByaW50X2RlY29kZV9vbmVzZWNyZXQobmRvLCBsaW5lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzcF9pbml0KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvIF9VXykKK3sKKworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fZGVzX2VkZTNfY2JjLCAiM2RlcyIpOworfQorI2VuZGlmCisKK2ludAorZXNwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCSAgY29uc3QgdV9jaGFyICpicCwgY29uc3QgaW50IGxlbmd0aCwgY29uc3QgdV9jaGFyICpicDIKKyNpZm5kZWYgSEFWRV9MSUJDUllQVE8KKwlfVV8KKyNlbmRpZgorCSwKKwlpbnQgKm5oZHIKKyNpZm5kZWYgSEFWRV9MSUJDUllQVE8KKwlfVV8KKyNlbmRpZgorCSwKKwlpbnQgKnBhZGxlbgorI2lmbmRlZiBIQVZFX0xJQkNSWVBUTworCV9VXworI2VuZGlmCisJKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBuZXdlc3AgKmVzcDsKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwOworI2lmZGVmIEhBVkVfTElCQ1JZUFRPCisJc3RydWN0IGlwICppcDsKKwlzdHJ1Y3Qgc2FfbGlzdCAqc2EgPSBOVUxMOworCWludCBlc3BzZWNyZXRfa2V5bGVuOworI2lmZGVmIElORVQ2CisJc3RydWN0IGlwNl9oZHIgKmlwNiA9IE5VTEw7CisjZW5kaWYKKwlpbnQgYWR2YW5jZTsKKwlpbnQgbGVuOworCXVfY2hhciAqc2VjcmV0OworCWludCBpdmxlbiA9IDA7CisJdV9jaGFyICppdm9mZjsKKwl1X2NoYXIgKnA7CisJRVZQX0NJUEhFUl9DVFggY3R4OworCWludCBibG9ja3N6OworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworI2VuZGlmCisKKwllc3AgPSAoc3RydWN0IG5ld2VzcCAqKWJwOworCisjaWZkZWYgSEFWRV9MSUJDUllQVE8KKwlzZWNyZXQgPSBOVUxMOworCWFkdmFuY2UgPSAwOworCisJaWYgKCFpbml0aWFsaXplZCkgeworCQllc3BfaW5pdChuZG8pOworCQlpbml0aWFsaXplZCA9IDE7CisJfQorI2VuZGlmCisKKyNpZiAwCisJLyoga2VlcCBzZWNyZXQgb3V0IG9mIGEgcmVnaXN0ZXIgKi8KKwlwID0gKHVfY2hhciAqKSZzZWNyZXQ7CisjZW5kaWYKKworCS8qICdlcCcgcG9pbnRzIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIGRhdGEuICovCisJZXAgPSBuZG8tPm5kb19zbmFwZW5kOworCisJaWYgKCh1X2NoYXIgKikoZXNwICsgMSkgPj0gZXApIHsKKwkJZnB1dHMoIlt8RVNQXSIsIHN0ZG91dCk7CisJCWdvdG8gZmFpbDsKKwl9CisJKCpuZG8tPm5kb19wcmludGYpKG5kbywgIkVTUChzcGk9MHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoJmVzcC0+ZXNwX3NwaSkpOworCSgqbmRvLT5uZG9fcHJpbnRmKShuZG8sICIsc2VxPTB4JXgpIiwgRVhUUkFDVF8zMkJJVFMoJmVzcC0+ZXNwX3NlcSkpOworICAgICAgICAoKm5kby0+bmRvX3ByaW50ZikobmRvLCAiLCBsZW5ndGggJXUiLCBsZW5ndGgpOworCisjaWZuZGVmIEhBVkVfTElCQ1JZUFRPCisJZ290byBmYWlsOworI2Vsc2UKKwkvKiBpbml0aWFpbGl6ZSBTQXMgKi8KKwlpZiAobmRvLT5uZG9fc2FfbGlzdF9oZWFkID09IE5VTEwpIHsKKwkJaWYgKCFuZG8tPm5kb19lc3BzZWNyZXQpCisJCQlnb3RvIGZhaWw7CisKKwkJZXNwX3ByaW50X2RlY29kZXNlY3JldChuZG8pOworCX0KKworCWlmIChuZG8tPm5kb19zYV9saXN0X2hlYWQgPT0gTlVMTCkKKwkJZ290byBmYWlsOworCisJaXAgPSAoc3RydWN0IGlwICopYnAyOworCXN3aXRjaCAoSVBfVihpcCkpIHsKKyNpZmRlZiBJTkVUNgorCWNhc2UgNjoKKwkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnAyOworCQkvKiB3ZSBkbyBub3QgYXR0ZW1wdCB0byBkZWNyeXB0IGp1bWJvZ3JhbXMgKi8KKwkJaWYgKCFFWFRSQUNUXzE2QklUUygmaXA2LT5pcDZfcGxlbikpCisJCQlnb3RvIGZhaWw7CisJCS8qIGlmIHdlIGNhbid0IGdldCBuZXh0aGRyLCB3ZSBkbyBub3QgbmVlZCB0byBkZWNyeXB0IGl0ICovCisJCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXA2X2hkcikgKyBFWFRSQUNUXzE2QklUUygmaXA2LT5pcDZfcGxlbik7CisKKwkJLyogc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBTQSwgYW5kIGlmIHNvLCBkZWNvZGUgaXQgKi8KKwkJZm9yIChzYSA9IG5kby0+bmRvX3NhX2xpc3RfaGVhZDsgc2EgIT0gTlVMTDsgc2EgPSBzYS0+bmV4dCkgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNhLT5kYWRkcjsKKwkJCWlmIChzYS0+c3BpID09IG50b2hsKGVzcC0+ZXNwX3NwaSkgJiYKKwkJCSAgICBzaW42LT5zaW42X2ZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkJICAgIG1lbWNtcCgmc2luNi0+c2luNl9hZGRyLCAmaXA2LT5pcDZfZHN0LAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLypJTkVUNiovCisJY2FzZSA0OgorCQkvKiBuZXh0aGRyICYgcGFkZGluZyBhcmUgaW4gdGhlIGxhc3QgZnJhZ21lbnQgKi8KKwkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZpcC0+aXBfb2ZmKSAmIElQX01GKQorCQkJZ290byBmYWlsOworCQlsZW4gPSBFWFRSQUNUXzE2QklUUygmaXAtPmlwX2xlbik7CisKKwkJLyogc2VlIGlmIHdlIGNhbiBmaW5kIHRoZSBTQSwgYW5kIGlmIHNvLCBkZWNvZGUgaXQgKi8KKwkJZm9yIChzYSA9IG5kby0+bmRvX3NhX2xpc3RfaGVhZDsgc2EgIT0gTlVMTDsgc2EgPSBzYS0+bmV4dCkgeworCQkJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNhLT5kYWRkcjsKKwkJCWlmIChzYS0+c3BpID09IG50b2hsKGVzcC0+ZXNwX3NwaSkgJiYKKwkJCSAgICBzaW4tPnNpbl9mYW1pbHkgPT0gQUZfSU5FVCAmJgorCQkJICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID09IGlwLT5pcF9kc3Quc19hZGRyKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBmYWlsOworCX0KKworCS8qIGlmIHdlIGRpZG4ndCBmaW5kIHRoZSBzcGVjaWZpYyBvbmUsIHRoZW4gbG9vayBmb3IKKwkgKiBhbiB1bnNwZWNpZmllZCBvbmUuCisJICovCisJaWYgKHNhID09IE5VTEwpCisJCXNhID0gbmRvLT5uZG9fc2FfZGVmYXVsdDsKKwkKKwkvKiBpZiBub3QgZm91bmQgZmFpbCAqLworCWlmIChzYSA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwkvKiBpZiB3ZSBjYW4ndCBnZXQgbmV4dGhkciwgd2UgZG8gbm90IG5lZWQgdG8gZGVjcnlwdCBpdCAqLworCWlmIChlcCAtIGJwMiA8IGxlbikKKwkJZ290byBmYWlsOworCWlmIChlcCAtIGJwMiA+IGxlbikgeworCQkvKiBGQ1MgaW5jbHVkZWQgYXQgZW5kIG9mIGZyYW1lIChOZXRCU0QgMS42IG9yIGxhdGVyKSAqLworCQllcCA9IGJwMiArIGxlbjsKKwl9CisKKwlpdm9mZiA9ICh1X2NoYXIgKikoZXNwICsgMSkgKyAwOworCWl2bGVuID0gc2EtPml2bGVuOworCXNlY3JldCA9IHNhLT5zZWNyZXQ7CisJZXNwc2VjcmV0X2tleWxlbiA9IHNhLT5zZWNyZXRsZW47CisJZXAgPSBlcCAtIHNhLT5hdXRobGVuOworCisJaWYgKHNhLT5ldnApIHsKKwkJbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKKwkJaWYgKEVWUF9DaXBoZXJJbml0KCZjdHgsIHNhLT5ldnAsIHNlY3JldCwgTlVMTCwgMCkgPCAwKQorCQkJKCpuZG8tPm5kb193YXJuaW5nKShuZG8sICJlc3BrZXkgaW5pdCBmYWlsZWQiKTsKKworCQlibG9ja3N6ID0gRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZSgmY3R4KTsKKworCQlwID0gaXZvZmY7CisJCUVWUF9DaXBoZXJJbml0KCZjdHgsIE5VTEwsIE5VTEwsIHAsIDApOworCQlFVlBfQ2lwaGVyKCZjdHgsIHAgKyBpdmxlbiwgcCArIGl2bGVuLCBlcCAtIChwICsgaXZsZW4pKTsKKwkJYWR2YW5jZSA9IGl2b2ZmIC0gKHVfY2hhciAqKWVzcCArIGl2bGVuOworCX0gZWxzZQorCQlhZHZhbmNlID0gc2l6ZW9mKHN0cnVjdCBuZXdlc3ApOworCisJLyogc2FuaXR5IGNoZWNrIGZvciBwYWQgbGVuZ3RoICovCisJaWYgKGVwIC0gYnAgPCAqKGVwIC0gMikpCisJCWdvdG8gZmFpbDsKKworCWlmIChwYWRsZW4pCisJCSpwYWRsZW4gPSAqKGVwIC0gMikgKyAyOworCisJaWYgKG5oZHIpCisJCSpuaGRyID0gKihlcCAtIDEpOworCisJKG5kby0+bmRvX3ByaW50ZikobmRvLCAiOiAiKTsKKwlyZXR1cm4gYWR2YW5jZTsKKyNlbmRpZgorCitmYWlsOgorCXJldHVybiAtMTsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LWV0aGVyLmMgYi9wcmludC1ldGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MWE3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1ldGhlci5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWV0aGVyLmMsdiAxLjk1LjIuNiAyMDA2LzAyLzIwIDE4OjE1OjAzIGhhbm5lcyBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorCisjaW5jbHVkZSAiZXRoZXIuaCIKKworY29uc3Qgc3RydWN0IHRvayBldGhlcnR5cGVfdmFsdWVzW10gPSB7IAorICAgIHsgRVRIRVJUWVBFX0lQLAkJIklQdjQiIH0sCisgICAgeyBFVEhFUlRZUEVfTVBMUywJCSJNUExTIHVuaWNhc3QiIH0sCisgICAgeyBFVEhFUlRZUEVfTVBMU19NVUxUSSwJIk1QTFMgbXVsdGljYXN0IiB9LAorICAgIHsgRVRIRVJUWVBFX0lQVjYsCQkiSVB2NiIgfSwKKyAgICB7IEVUSEVSVFlQRV84MDIxUSwJCSI4MDIuMVEiIH0sCisgICAgeyBFVEhFUlRZUEVfVk1BTiwJCSJWTUFOIiB9LAorICAgIHsgRVRIRVJUWVBFX1BVUCwgICAgICAgICAgICAiUFVQIiB9LAorICAgIHsgRVRIRVJUWVBFX0FSUCwgICAgICAgICAgICAiQVJQIn0sCisgICAgeyBFVEhFUlRZUEVfUkVWQVJQLCAgICAgICAgICJSZXZlcnNlIEFSUCJ9LAorICAgIHsgRVRIRVJUWVBFX05TLCAgICAgICAgICAgICAiTlMiIH0sCisgICAgeyBFVEhFUlRZUEVfU1BSSVRFLCAgICAgICAgICJTcHJpdGUiIH0sCisgICAgeyBFVEhFUlRZUEVfVFJBSUwsICAgICAgICAgICJUcmFpbCIgfSwKKyAgICB7IEVUSEVSVFlQRV9NT1BETCwgICAgICAgICAgIk1PUCBETCIgfSwKKyAgICB7IEVUSEVSVFlQRV9NT1BSQywgICAgICAgICAgIk1PUCBSQyIgfSwKKyAgICB7IEVUSEVSVFlQRV9ETiwgICAgICAgICAgICAgIkROIiB9LAorICAgIHsgRVRIRVJUWVBFX0xBVCwgICAgICAgICAgICAiTEFUIiB9LAorICAgIHsgRVRIRVJUWVBFX1NDQSwgICAgICAgICAgICAiU0NBIiB9LAorICAgIHsgRVRIRVJUWVBFX0xBTkJSSURHRSwgICAgICAiTGFuYnJpZGdlIiB9LAorICAgIHsgRVRIRVJUWVBFX0RFQ0ROUywgICAgICAgICAiREVDIEROUyIgfSwKKyAgICB7IEVUSEVSVFlQRV9ERUNEVFMsICAgICAgICAgIkRFQyBEVFMiIH0sCisgICAgeyBFVEhFUlRZUEVfVkVYUCwgICAgICAgICAgICJWRVhQIiB9LAorICAgIHsgRVRIRVJUWVBFX1ZQUk9ELCAgICAgICAgICAiVlBST0QiIH0sCisgICAgeyBFVEhFUlRZUEVfQVRBTEssICAgICAgICAgICJBcHBsZXRhbGsiIH0sCisgICAgeyBFVEhFUlRZUEVfQUFSUCwgICAgICAgICAgICJBcHBsZXRhbGsgQVJQIiB9LAorICAgIHsgRVRIRVJUWVBFX0lQWCwgICAgICAgICAgICAiSVBYIiB9LAorICAgIHsgRVRIRVJUWVBFX1BQUCwgICAgICAgICAgICAiUFBQIiB9LAorICAgIHsgRVRIRVJUWVBFX1NMT1csICAgICAgICAgICAiU2xvdyBQcm90b2NvbHMiIH0sCisgICAgeyBFVEhFUlRZUEVfUFBQT0VELCAgICAgICAgICJQUFBvRSBEIiB9LAorICAgIHsgRVRIRVJUWVBFX1BQUE9FUywgICAgICAgICAiUFBQb0UgUyIgfSwKKyAgICB7IEVUSEVSVFlQRV9FQVBPTCwgICAgICAgICAgIkVBUE9MIiB9LAorICAgIHsgRVRIRVJUWVBFX0pVTUJPLCAgICAgICAgICAiSnVtYm8iIH0sCisgICAgeyBFVEhFUlRZUEVfTE9PUEJBQ0ssICAgICAgICJMb29wYmFjayIgfSwKKyAgICB7IEVUSEVSVFlQRV9JU08sICAgICAgICAgICAgIk9TSSIgfSwKKyAgICB7IEVUSEVSVFlQRV9HUkVfSVNPLCAgICAgICAgIkdSRS1PU0kiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGlubGluZSB2b2lkCitldGhlcl9oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBldGhlcl9oZWFkZXIgKmVwOworCWVwID0gKGNvbnN0IHN0cnVjdCBldGhlcl9oZWFkZXIgKilicDsKKworCSh2b2lkKXByaW50ZigiJXMgPiAlcyIsCisJCSAgICAgZXRoZXJhZGRyX3N0cmluZyhFU1JDKGVwKSksCisJCSAgICAgZXRoZXJhZGRyX3N0cmluZyhFRFNUKGVwKSkpOworCisJaWYgKCFxZmxhZykgeworCSAgICAgICAgaWYgKG50b2hzKGVwLT5ldGhlcl90eXBlKSA8PSBFVEhFUk1UVSkKKwkJICAgICAgICAgICh2b2lkKXByaW50ZigiLCA4MDIuMyIpOworICAgICAgICAgICAgICAgIGVsc2UgCisJCSAgICAgICAgICAodm9pZClwcmludGYoIiwgZXRoZXJ0eXBlICVzICgweCUwNHgpIiwKKwkJCQkgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCJVbmtub3duIiwgbnRvaHMoZXAtPmV0aGVyX3R5cGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGVwLT5ldGhlcl90eXBlKSk7CSAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChudG9ocyhlcC0+ZXRoZXJfdHlwZSkgPD0gRVRIRVJNVFUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiLCA4MDIuMyIpOworICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiLCAlcyIsIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biBFdGhlcnR5cGUgKDB4JTA0eCkiLCBudG9ocyhlcC0+ZXRoZXJfdHlwZSkpKTsgIAorICAgICAgICB9CisKKwkodm9pZClwcmludGYoIiwgbGVuZ3RoICV1OiAiLCBsZW5ndGgpOworfQorCit2b2lkCitldGhlcl9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCXN0cnVjdCBldGhlcl9oZWFkZXIgKmVwOworCXVfc2hvcnQgZXRoZXJfdHlwZTsKKwl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcl90eXBlOworCisJaWYgKGNhcGxlbiA8IEVUSEVSX0hEUkxFTikgeworCQlwcmludGYoIlt8ZXRoZXJdIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZWZsYWcpCisJCWV0aGVyX2hkcl9wcmludChwLCBsZW5ndGgpOworCisJbGVuZ3RoIC09IEVUSEVSX0hEUkxFTjsKKwljYXBsZW4gLT0gRVRIRVJfSERSTEVOOworCWVwID0gKHN0cnVjdCBldGhlcl9oZWFkZXIgKilwOworCXAgKz0gRVRIRVJfSERSTEVOOworCisJZXRoZXJfdHlwZSA9IG50b2hzKGVwLT5ldGhlcl90eXBlKTsKKworCS8qCisJICogSXMgaXQgKGdhZykgYW4gODAyLjMgZW5jYXBzdWxhdGlvbj8KKwkgKi8KKwlpZiAoZXRoZXJfdHlwZSA8PSBFVEhFUk1UVSkgeworCQkvKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzICovCisJCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoZXApLCBFRFNUKGVwKSwKKwkJICAgICZleHRyYWN0ZWRfZXRoZXJfdHlwZSkgPT0gMCkgeworCQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KKwkJCWlmICghZWZsYWcpCisJCQkJZXRoZXJfaGRyX3ByaW50KCh1X2NoYXIgKillcCwgbGVuZ3RoICsgRVRIRVJfSERSTEVOKTsKKworCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQorCQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwkJfQorCX0gZWxzZSBpZiAoZXRoZXJfZW5jYXBfcHJpbnQoZXRoZXJfdHlwZSwgcCwgbGVuZ3RoLCBjYXBsZW4sCisJICAgICZleHRyYWN0ZWRfZXRoZXJfdHlwZSkgPT0gMCkgeworCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLworCQlpZiAoIWVmbGFnKQorCQkJZXRoZXJfaGRyX3ByaW50KCh1X2NoYXIgKillcCwgbGVuZ3RoICsgRVRIRVJfSERSTEVOKTsKKworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfSAKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cworICogdG8gdGhlIGV0aGVyIGhlYWRlciBvZiB0aGUgcGFja2V0LCAnaC0+dHMnIGlzIHRoZSB0aW1lc3RhbXAsCisgKiAnaC0+bGVuJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb2ZmIHRoZSB3aXJlLCBhbmQgJ2gtPmNhcGxlbicKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgY2FwdHVyZWQuCisgKi8KK3VfaW50CitldGhlcl9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlldGhlcl9wcmludChwLCBoLT5sZW4sIGgtPmNhcGxlbik7CisKKwlyZXR1cm4gKEVUSEVSX0hEUkxFTik7Cit9CisKKy8qCisgKiBQcmludHMgdGhlIHBhY2tldCBlbmNhcHN1bGF0ZWQgaW4gYW4gRXRoZXJuZXQgZGF0YSBzZWdtZW50CisgKiAob3IgYW4gZXF1aXZhbGVudCBlbmNhcHN1bGF0aW9uKSwgZ2l2ZW4gdGhlIEV0aGVybmV0IHR5cGUgY29kZS4KKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IGNhbiBkbyBzbywgemVybyBpZiB0aGUgZXRoZXJ0eXBlIGlzIHVua25vd24uCisgKgorICogVGhlIEV0aGVybmV0IHR5cGUgY29kZSBpcyBwYXNzZWQgdGhyb3VnaCBhIHBvaW50ZXI7IGlmIGl0IHdhcworICogRVRIRVJUWVBFXzgwMjFRLCBpdCBnZXRzIHVwZGF0ZWQgdG8gYmUgdGhlIEV0aGVybmV0IHR5cGUgb2YKKyAqIHRoZSA4MDIuMVEgcGF5bG9hZCwgZm9yIHRoZSBiZW5lZml0IG9mIGxvd2VyIGxheWVycyB0aGF0IG1pZ2h0CisgKiB3YW50IHRvIGtub3cgd2hhdCBpdCBpcy4KKyAqLworCitpbnQKK2V0aGVyX2VuY2FwX3ByaW50KHVfc2hvcnQgZXRoZXJfdHlwZSwgY29uc3QgdV9jaGFyICpwLAorICAgIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuLCB1X3Nob3J0ICpleHRyYWN0ZWRfZXRoZXJfdHlwZSkKK3sKKyByZWN1cnNlOgorCSpleHRyYWN0ZWRfZXRoZXJfdHlwZSA9IGV0aGVyX3R5cGU7CisKKwlzd2l0Y2ggKGV0aGVyX3R5cGUpIHsKKworCWNhc2UgRVRIRVJUWVBFX0lQOgorCSAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKKwkJcmV0dXJuICgxKTsKKworI2lmZGVmIElORVQ2CisJY2FzZSBFVEhFUlRZUEVfSVBWNjoKKwkJaXA2X3ByaW50KHAsIGxlbmd0aCk7CisJCXJldHVybiAoMSk7CisjZW5kaWYgLypJTkVUNiovCisKKwljYXNlIEVUSEVSVFlQRV9BUlA6CisJY2FzZSBFVEhFUlRZUEVfUkVWQVJQOgorICAJICAgICAgICBhcnBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoLCBjYXBsZW4pOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBFVEhFUlRZUEVfRE46CisJCWRlY25ldF9wcmludChwLCBsZW5ndGgsIGNhcGxlbik7CisJCXJldHVybiAoMSk7CisKKwljYXNlIEVUSEVSVFlQRV9BVEFMSzoKKwkJaWYgKHZmbGFnKQorCQkJZnB1dHMoImV0MSAiLCBzdGRvdXQpOworCQlhdGFsa19wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBFVEhFUlRZUEVfQUFSUDoKKwkJYWFycF9wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBFVEhFUlRZUEVfSVBYOgorCQlwcmludGYoIihOT1YtRVRISUkpICIpOworCQlpcHhfcHJpbnQocCwgbGVuZ3RoKTsKKwkJcmV0dXJuICgxKTsKKworCWNhc2UgRVRIRVJUWVBFXzgwMjFROgorCSAgICAgICAgaWYgKGVmbGFnKQorCQkgICAgcHJpbnRmKCJ2bGFuICV1LCBwICV1JXMsICIsCisJCQkgICBudG9ocygqKHVfaW50MTZfdCAqKXApICYgMHhmZmYsCisJCQkgICBudG9ocygqKHVfaW50MTZfdCAqKXApID4+IDEzLAorCQkJICAgKG50b2hzKCoodV9pbnQxNl90ICopcCkgJiAweDEwMDApID8gIiwgQ0ZJIiA6ICIiKTsKKworCQlldGhlcl90eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKikocCArIDIpKTsKKwkJcCArPSA0OworCQlsZW5ndGggLT0gNDsKKwkJY2FwbGVuIC09IDQ7CisKKwkJaWYgKGV0aGVyX3R5cGUgPiBFVEhFUk1UVSkgeworCQkgICAgICAgIGlmIChlZmxhZykKKwkJCSAgICAgICAgcHJpbnRmKCJldGhlcnR5cGUgJXMsICIsCisJCQkJICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiMHglMDR4IiwgZXRoZXJfdHlwZSkpOworCQkJZ290byByZWN1cnNlOworCQl9CisKKwkJKmV4dHJhY3RlZF9ldGhlcl90eXBlID0gMDsKKworCQlpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBwIC0gMTgsIHAgLSAxMiwKKwkJICAgIGV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldGhlcl9oZHJfcHJpbnQocCAtIDE4LCBsZW5ndGggKyA0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJpbnQocCAtIDE4LCBjYXBsZW4gKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJfQorCisKKwkJcmV0dXJuICgxKTsKKworICAgICAgICBjYXNlIEVUSEVSVFlQRV9KVU1CTzoKKyAgICAgICAgICAgICAgICBldGhlcl90eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKikocCkpOworICAgICAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgICAgICBsZW5ndGggLT0gMjsgICAgICAKKyAgICAgICAgICAgICAgICBjYXBsZW4gLT0gMjsKKworICAgICAgICAgICAgICAgIGlmIChldGhlcl90eXBlID4gRVRIRVJNVFUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJldGhlcnR5cGUgJXMsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCIweCUwNHgiLCBldGhlcl90eXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVjdXJzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqZXh0cmFjdGVkX2V0aGVyX3R5cGUgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKGxsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbiwgcCAtIDE2LCBwIC0gMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0ZWRfZXRoZXJfdHlwZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBldGhlcl9oZHJfcHJpbnQocCAtIDE2LCBsZW5ndGggKyAyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ByaW50KHAgLSAxNiwgY2FwbGVuICsgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gKDEpOworCisgICAgICAgIGNhc2UgRVRIRVJUWVBFX0lTTzoKKyAgICAgICAgICAgICAgICBpc29jbG5zX3ByaW50KHArMSwgbGVuZ3RoLTEsIGxlbmd0aC0xKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisKKwljYXNlIEVUSEVSVFlQRV9QUFBPRUQ6CisJY2FzZSBFVEhFUlRZUEVfUFBQT0VTOgorCQlwcHBvZV9wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBFVEhFUlRZUEVfRUFQT0w6CisJICAgICAgICBlYXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKKwkJcmV0dXJuICgxKTsKKworCWNhc2UgRVRIRVJUWVBFX1BQUDoKKwkJaWYgKGxlbmd0aCkgeworCQkJcHJpbnRmKCI6ICIpOworCQkJcHBwX3ByaW50KHAsIGxlbmd0aCk7CisJCX0KKwkJcmV0dXJuICgxKTsKKworCWNhc2UgRVRIRVJUWVBFX1NMT1c6CisJICAgICAgICBzbG93X3ByaW50KHAsIGxlbmd0aCk7CisJCXJldHVybiAoMSk7CisKKyAgICAgICAgY2FzZSBFVEhFUlRZUEVfTE9PUEJBQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuICgxKTsKKworCWNhc2UgRVRIRVJUWVBFX01QTFM6CisJY2FzZSBFVEhFUlRZUEVfTVBMU19NVUxUSToKKwkJbXBsc19wcmludChwLCBsZW5ndGgpOworCQlyZXR1cm4gKDEpOworCisJY2FzZSBFVEhFUlRZUEVfTEFUOgorCWNhc2UgRVRIRVJUWVBFX1NDQToKKwljYXNlIEVUSEVSVFlQRV9NT1BSQzoKKwljYXNlIEVUSEVSVFlQRV9NT1BETDoKKwkJLyogZGVmYXVsdF9wcmludCBmb3Igbm93ICovCisJZGVmYXVsdDoKKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KKwpkaWZmIC0tZ2l0IGEvcHJpbnQtZmRkaS5jIGIvcHJpbnQtZmRkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjcxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1mZGRpLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1mZGRpLmMsdiAxLjY0LjIuMiAyMDA1LzExLzEzIDEyOjEyOjU5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorCisjaW5jbHVkZSAiZXRoZXIuaCIKKyNpbmNsdWRlICJmZGRpLmgiCisKKy8qCisgKiBTb21lIEZEREkgaW50ZXJmYWNlcyB1c2UgYml0LXN3YXBwZWQgYWRkcmVzc2VzLgorICovCisjaWYgZGVmaW5lZCh1bHRyaXgpIHx8IGRlZmluZWQoX19hbHBoYSkgfHwgZGVmaW5lZChfX2JzZGkpIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX2xpbnV4X18pCitpbnQJZmRkaV9iaXRzd2FwID0gMDsKKyNlbHNlCitpbnQJZmRkaV9iaXRzd2FwID0gMTsKKyNlbmRpZgorCisvKgorICogRkRESSBzdXBwb3J0IGZvciB0Y3BkdW1wLCBieSBKZWZmcmV5IE1vZ3VsIFtERUNXUkxdLCBKdW5lIDE5OTIKKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgYnkgVmFuIEphY29ic29uLCB3aGljaCBiZWFycyB0aGlzIG5vdGU6CisgKgorICogTk9URTogIFRoaXMgaXMgYSB2ZXJ5IHByZWxpbWluYXJ5IGhhY2sgZm9yIEZEREkgc3VwcG9ydC4KKyAqIFRoZXJlIGFyZSBhbGwgc29ydHMgb2Ygd2lyZWQgaW4gY29uc3RhbnRzICYgbm90aGluZyAoeWV0KQorICogdG8gcHJpbnQgU01UIHBhY2tldHMgYXMgYW55dGhpbmcgb3RoZXIgdGhhbiBoZXggZHVtcHMuCisgKiBNb3N0IG9mIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyBhcmUgd2FpdGluZyBvbiBteSByZWRvaW5nCisgKiB0aGUgImhlYWRlciIgdGhhdCBhIGtlcm5lbCBmZGRpIGRyaXZlciBzdXBwbGllcyB0byBicGY6ICBJCisgKiB3YW50IGl0IHRvIGxvb2sgbGlrZSBvbmUgYnl0ZSBvZiAnZGlyZWN0aW9uJyAoMCBvciAxCisgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcGFja2V0IHdhcyBpbmJvdW5kIG9yIG91dGJvdW5kKSwKKyAqIHR3byBieXRlcyBvZiBzeXN0ZW0vZHJpdmVyIGRlcGVuZGVudCBkYXRhIChhbnl0aGluZyBhbgorICogaW1wbGVtZW50b3IgdGhpbmtzIHdvdWxkIGJlIHVzZWZ1bCB0byBmaWx0ZXIgb24gYW5kL29yCisgKiBzYXZlIHBlci1wYWNrZXQsIHRoZW4gdGhlIHJlYWwgMjEtYnl0ZSBGRERJIGhlYWRlci4KKyAqIFN0ZXZlIE1jQ2FubmUgJiBJIGhhdmUgYWxzbyB0YWxrZWQgYWJvdXQgYWRkaW5nIHRoZQorICogJ2RpcmVjdGlvbicgYnl0ZSB0byBhbGwgYnBmIGhlYWRlcnMgKGUuZy4sIGluIHRoZSB0d28KKyAqIGJ5dGVzIG9mIHBhZGRpbmcgb24gYW4gZXRoZXJuZXQgaGVhZGVyKS4gIEl0J3Mgbm90IGNsZWFyCisgKiB3ZSBjb3VsZCBkbyB0aGlzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5ICYgd2UgaGF0ZQorICogdGhlIGlkZWEgb2YgYW4gaW5jb21wYXRpYmxlIGJwZiBjaGFuZ2UuICBEaXNjdXNzaW9ucyBhcmUKKyAqIHByb2NlZWRpbmcuCisgKgorICogQWxzbywgdG8gcmVhbGx5IHN1cHBvcnQgRkRESSAoYW5kIGJldHRlciBzdXBwb3J0IDgwMi4yCisgKiBvdmVyIGV0aGVybmV0KSB3ZSByZWFsbHkgbmVlZCB0byByZS10aGluayB0aGUgcmF0aGVyIHNpbXBsZQorICogbWluZGVkIGFzc3VtcHRpb25zIGFib3V0IGZpeGVkIGxlbmd0aCAmIGZpeGVkIGZvcm1hdCBsaW5rCisgKiBsZXZlbCBoZWFkZXJzIG1hZGUgaW4gZ2VuY29kZS5jLiAgT25lIGRheS4uLgorICoKKyAqICAtIHZqCisgKi8KKworc3RhdGljIHVfY2hhciBmZGRpX2JpdF9zd2FwW10gPSB7CisJMHgwMCwgMHg4MCwgMHg0MCwgMHhjMCwgMHgyMCwgMHhhMCwgMHg2MCwgMHhlMCwKKwkweDEwLCAweDkwLCAweDUwLCAweGQwLCAweDMwLCAweGIwLCAweDcwLCAweGYwLAorCTB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCisJMHgxOCwgMHg5OCwgMHg1OCwgMHhkOCwgMHgzOCwgMHhiOCwgMHg3OCwgMHhmOCwKKwkweDA0LCAweDg0LCAweDQ0LCAweGM0LCAweDI0LCAweGE0LCAweDY0LCAweGU0LAorCTB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCisJMHgwYywgMHg4YywgMHg0YywgMHhjYywgMHgyYywgMHhhYywgMHg2YywgMHhlYywKKwkweDFjLCAweDljLCAweDVjLCAweGRjLCAweDNjLCAweGJjLCAweDdjLCAweGZjLAorCTB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCisJMHgxMiwgMHg5MiwgMHg1MiwgMHhkMiwgMHgzMiwgMHhiMiwgMHg3MiwgMHhmMiwKKwkweDBhLCAweDhhLCAweDRhLCAweGNhLCAweDJhLCAweGFhLCAweDZhLCAweGVhLAorCTB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCisJMHgwNiwgMHg4NiwgMHg0NiwgMHhjNiwgMHgyNiwgMHhhNiwgMHg2NiwgMHhlNiwKKwkweDE2LCAweDk2LCAweDU2LCAweGQ2LCAweDM2LCAweGI2LCAweDc2LCAweGY2LAorCTB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCisJMHgxZSwgMHg5ZSwgMHg1ZSwgMHhkZSwgMHgzZSwgMHhiZSwgMHg3ZSwgMHhmZSwKKwkweDAxLCAweDgxLCAweDQxLCAweGMxLCAweDIxLCAweGExLCAweDYxLCAweGUxLAorCTB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCisJMHgwOSwgMHg4OSwgMHg0OSwgMHhjOSwgMHgyOSwgMHhhOSwgMHg2OSwgMHhlOSwKKwkweDE5LCAweDk5LCAweDU5LCAweGQ5LCAweDM5LCAweGI5LCAweDc5LCAweGY5LAorCTB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCisJMHgxNSwgMHg5NSwgMHg1NSwgMHhkNSwgMHgzNSwgMHhiNSwgMHg3NSwgMHhmNSwKKwkweDBkLCAweDhkLCAweDRkLCAweGNkLCAweDJkLCAweGFkLCAweDZkLCAweGVkLAorCTB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCisJMHgwMywgMHg4MywgMHg0MywgMHhjMywgMHgyMywgMHhhMywgMHg2MywgMHhlMywKKwkweDEzLCAweDkzLCAweDUzLCAweGQzLCAweDMzLCAweGIzLCAweDczLCAweGYzLAorCTB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCisJMHgxYiwgMHg5YiwgMHg1YiwgMHhkYiwgMHgzYiwgMHhiYiwgMHg3YiwgMHhmYiwKKwkweDA3LCAweDg3LCAweDQ3LCAweGM3LCAweDI3LCAweGE3LCAweDY3LCAweGU3LAorCTB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCisJMHgwZiwgMHg4ZiwgMHg0ZiwgMHhjZiwgMHgyZiwgMHhhZiwgMHg2ZiwgMHhlZiwKKwkweDFmLCAweDlmLCAweDVmLCAweGRmLCAweDNmLCAweGJmLCAweDdmLCAweGZmLAorfTsKKworLyoKKyAqIFByaW50IEZEREkgZnJhbWUtY29udHJvbCBiaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorcHJpbnRfZmRkaV9mYyh1X2NoYXIgZmMpCit7CisJc3dpdGNoIChmYykgeworCisJY2FzZSBGRERJRkNfVk9JRDogICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9pZCBmcmFtZSAqLworCQlwcmludGYoInZvaWQgIik7CisJCWJyZWFrOworCisJY2FzZSBGRERJRkNfTlJUOiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9ucmVzdHJpY3RlZCB0b2tlbiAqLworCQlwcmludGYoIm5ydCAiKTsKKwkJYnJlYWs7CisKKwljYXNlIEZERElGQ19SVDogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0cmljdGVkIHRva2VuICovCisJCXByaW50ZigicnQgIik7CisJCWJyZWFrOworCisJY2FzZSBGRERJRkNfU01UX0lORk86ICAgICAgICAgICAgICAgICAgICAgLyogU01UIEluZm8gKi8KKwkJcHJpbnRmKCJpbmZvICIpOworCQlicmVhazsKKworCWNhc2UgRkRESUZDX1NNVF9OU0E6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNNVCBOZXh0IHN0YXRpb24gYWRycyAqLworCQlwcmludGYoIm5zYSAiKTsKKwkJYnJlYWs7CisKKwljYXNlIEZERElGQ19NQUNfQkVBQ09OOiAgICAgICAgICAgICAgICAgICAvKiBNQUMgQmVhY29uIGZyYW1lICovCisJCXByaW50ZigiYmVhY29uICIpOworCQlicmVhazsKKworCWNhc2UgRkRESUZDX01BQ19DTEFJTTogICAgICAgICAgICAgICAgICAgIC8qIE1BQyBDbGFpbSBmcmFtZSAqLworCQlwcmludGYoImNsYWltICIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN3aXRjaCAoZmMgJiBGRERJRkNfQ0xGRikgeworCisJCWNhc2UgRkRESUZDX01BQzoKKwkJCXByaW50ZigibWFjJTF4ICIsIGZjICYgRkRESUZDX1paWlopOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRERJRkNfU01UOgorCQkJcHJpbnRmKCJzbXQlMXggIiwgZmMgJiBGRERJRkNfWlpaWik7CisJCQlicmVhazsKKworCQljYXNlIEZERElGQ19MTENfQVNZTkM6CisJCQlwcmludGYoImFzeW5jJTF4ICIsIGZjICYgRkRESUZDX1paWlopOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRERJRkNfTExDX1NZTkM6CisJCQlwcmludGYoInN5bmMlMXggIiwgZmMgJiBGRERJRkNfWlpaWik7CisJCQlicmVhazsKKworCQljYXNlIEZERElGQ19JTVBfQVNZTkM6CisJCQlwcmludGYoImltcF9hc3luYyUxeCAiLCBmYyAmIEZERElGQ19aWlpaKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRkRESUZDX0lNUF9TWU5DOgorCQkJcHJpbnRmKCJpbXBfc3luYyUxeCAiLCBmYyAmIEZERElGQ19aWlpaKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiUwMnggIiwgZmMpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIEV4dHJhY3Qgc3JjLCBkc3QgYWRkcmVzc2VzICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dHJhY3RfZmRkaV9hZGRycyhjb25zdCBzdHJ1Y3QgZmRkaV9oZWFkZXIgKmZkZGlwLCBjaGFyICpmc3JjLCBjaGFyICpmZHN0KQoreworCXJlZ2lzdGVyIGludCBpOworCisJaWYgKGZkZGlfYml0c3dhcCkgeworCQkvKgorCQkgKiBiaXQtc3dhcCB0aGUgZmRkaSBhZGRyZXNzZXMgKGlzbid0IHRoZSBJRUVFIHN0YW5kYXJkcworCQkgKiBwcm9jZXNzIHdvbmRlcmZ1bCEpIHRoZW4gY29udmVydCB0aGVtIHRvIG5hbWVzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwkJCWZkc3RbaV0gPSBmZGRpX2JpdF9zd2FwW2ZkZGlwLT5mZGRpX2Rob3N0W2ldXTsKKwkJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKKwkJCWZzcmNbaV0gPSBmZGRpX2JpdF9zd2FwW2ZkZGlwLT5mZGRpX3Nob3N0W2ldXTsKKwl9CisJZWxzZSB7CisJCW1lbWNweShmZHN0LCAoY29uc3QgY2hhciAqKWZkZGlwLT5mZGRpX2Rob3N0LCA2KTsKKwkJbWVtY3B5KGZzcmMsIChjb25zdCBjaGFyICopZmRkaXAtPmZkZGlfc2hvc3QsIDYpOworCX0KK30KKworLyoKKyAqIFByaW50IHRoZSBGRERJIE1BQyBoZWFkZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmZGRpX2hkcl9wcmludChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgZmRkaV9oZWFkZXIgKmZkZGlwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCisJICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpmc3JjLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmZkc3QpCit7CisJY29uc3QgY2hhciAqc3JjbmFtZSwgKmRzdG5hbWU7CisKKwlzcmNuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmc3JjKTsKKwlkc3RuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmZHN0KTsKKworCWlmICh2ZmxhZykKKwkJKHZvaWQpIHByaW50ZigiJTAyeCAlcyAlcyAlZDogIiwKKwkJICAgICAgIGZkZGlwLT5mZGRpX2ZjLAorCQkgICAgICAgc3JjbmFtZSwgZHN0bmFtZSwKKwkJICAgICAgIGxlbmd0aCk7CisJZWxzZSBpZiAocWZsYWcpCisJCXByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7CisJZWxzZSB7CisJCSh2b2lkKSBwcmludF9mZGRpX2ZjKGZkZGlwLT5mZGRpX2ZjKTsKKwkJKHZvaWQpIHByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZkZGlfc210X3ByaW50KGNvbnN0IHVfY2hhciAqcCBfVV8sIHVfaW50IGxlbmd0aCBfVV8pCit7CisJcHJpbnRmKCI8U01UIHByaW50ZXIgbm90IHlldCBpbXBsZW1lbnRlZD4iKTsKK30KKwordm9pZAorZmRkaV9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWNvbnN0IHN0cnVjdCBmZGRpX2hlYWRlciAqZmRkaXAgPSAoY29uc3Qgc3RydWN0IGZkZGlfaGVhZGVyICopcDsKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyIGVoZHI7CisJdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOworCisJaWYgKGNhcGxlbiA8IEZERElfSERSTEVOKSB7CisJCXByaW50ZigiW3xmZGRpXSIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIEZEREkgYWRkcmVzc2VzIGludG8gYSBjYW5vbmljYWwgZm9ybQorCSAqLworCWV4dHJhY3RfZmRkaV9hZGRycyhmZGRpcCwgKGNoYXIgKilFU1JDKCZlaGRyKSwgKGNoYXIgKilFRFNUKCZlaGRyKSk7CisKKwlpZiAoZWZsYWcpCisJCWZkZGlfaGRyX3ByaW50KGZkZGlwLCBsZW5ndGgsIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7CisKKwkvKiBTa2lwIG92ZXIgRkRESSBNQUMgaGVhZGVyICovCisJbGVuZ3RoIC09IEZERElfSERSTEVOOworCXAgKz0gRkRESV9IRFJMRU47CisJY2FwbGVuIC09IEZERElfSERSTEVOOworCisJLyogRnJhbWUgQ29udHJvbCBmaWVsZCBkZXRlcm1pbmVzIGludGVycHJldGF0aW9uIG9mIHBhY2tldCAqLworCWlmICgoZmRkaXAtPmZkZGlfZmMgJiBGRERJRkNfQ0xGRikgPT0gRkRESUZDX0xMQ19BU1lOQykgeworCQkvKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzICovCisJCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSwKKwkJICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7CisJCQkvKgorCQkJICogU29tZSBraW5kcyBvZiBMTEMgcGFja2V0IHdlIGNhbm5vdAorCQkJICogaGFuZGxlIGludGVsbGlnZW50bHkKKwkJCSAqLworCQkJaWYgKCFlZmxhZykKKwkJCQlmZGRpX2hkcl9wcmludChmZGRpcCwgbGVuZ3RoICsgRkRESV9IRFJMRU4sCisJCQkJICAgIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7CisJCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgeworCQkJCXByaW50ZigiKExMQyAlcykgIiwKKwkJCWV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7CisJCQl9CisJCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOworCQl9CisJfSBlbHNlIGlmICgoZmRkaXAtPmZkZGlfZmMgJiBGRERJRkNfQ0xGRikgPT0gRkRESUZDX1NNVCkKKwkJZmRkaV9zbXRfcHJpbnQocCwgY2FwbGVuKTsKKwllbHNlIHsKKwkJLyogU29tZSBraW5kcyBvZiBGRERJIHBhY2tldCB3ZSBjYW5ub3QgaGFuZGxlIGludGVsbGlnZW50bHkgKi8KKwkJaWYgKCFlZmxhZykKKwkJCWZkZGlfaGRyX3ByaW50KGZkZGlwLCBsZW5ndGggKyBGRERJX0hEUkxFTiwgRVNSQygmZWhkciksCisJCQkgICAgRURTVCgmZWhkcikpOworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCisgKiB0byB0aGUgRkRESSBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgorICovCit1X2ludAorZmRkaV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlmZGRpX3ByaW50KHAsIGgtPmxlbiwgaC0+Y2FwbGVuKTsKKworCXJldHVybiAoRkRESV9IRFJMRU4pOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZnIuYyBiL3ByaW50LWZyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYTg4YgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWZyLmMKQEAgLTAsMCArMSw4NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKwkiQCgjKSRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWZyLmMsdiAxLjMyLjIuMTUgMjAwNi8wMi8wMSAxNDozOTo1NiBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHBjYXAuaD4KKworI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJubHBpZC5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJvdWkuaCIKKworc3RhdGljIHZvaWQgZnJmMTVfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKKworLyoKKyAqIHRoZSBmcmFtZSByZWxheSBoZWFkZXIgaGFzIGEgdmFyaWFibGUgbGVuZ3RoCisgKgorICogdGhlIEVBIGJpdCBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZQorICogaW4gdGhlIGhlYWRlcgorICoKKyAqIG1pbmltdW0gaGVhZGVyIGxlbmd0aCBpcyAyIGJ5dGVzCisgKiBtYXhpbXVtIGhlYWRlciBsZW5ndGggaXMgNCBieXRlcworICoKKyAqICAgICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICogICAgfCAgICAgICAgRExDSSAoNiBiaXRzKSAgICAgICAgfCBDUiB8IEVBIHwKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8ICAgRExDSSAoNCBiaXRzKSAgIHxGRUNOfEJFQ058IERFIHwgRUEgfAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqICAgIHwgICAgICAgICAgIERMQ0kgKDcgYml0cykgICAgICAgICAgfCBFQSB8CisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICogICAgfCAgICAgICAgRExDSSAoNiBiaXRzKSAgICAgICAgfFNETEN8IEVBIHwKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKi8KKworI2RlZmluZSBGUl9FQV9CSVQJMHgwMQorCisjZGVmaW5lIEZSX0NSX0JJVCAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEZSX0RFX0JJVAkweDAwMDIwMDAwCisjZGVmaW5lIEZSX0JFQ05fQklUCTB4MDAwNDAwMDAKKyNkZWZpbmUgRlJfRkVDTl9CSVQJMHgwMDA4MDAwMAorI2RlZmluZSBGUl9TRExDX0JJVAkweDAwMDAwMDAyCisKKworc3RydWN0IHRvayBmcl9oZWFkZXJfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IEZSX0NSX0JJVCwgIkMhIiB9LAorICAgIHsgRlJfREVfQklULCAiREUiIH0sCisgICAgeyBGUl9CRUNOX0JJVCwgIkJFQ04iIH0sCisgICAgeyBGUl9GRUNOX0JJVCwgIkZFQ04iIH0sCisgICAgeyBGUl9TRExDX0JJVCwgInNkbGNvcmUiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qIEZSRi4xNSAvIEZSRi4xNiAqLworI2RlZmluZSBNRlJfQl9CSVQgMHg4MAorI2RlZmluZSBNRlJfRV9CSVQgMHg0MAorI2RlZmluZSBNRlJfQ19CSVQgMHgyMAorI2RlZmluZSBNRlJfQkVDX01BU0sgICAgKE1GUl9CX0JJVCB8IE1GUl9FX0JJVCB8IE1GUl9DX0JJVCkKKyNkZWZpbmUgTUZSX0NUUkxfRlJBTUUgIChNRlJfQl9CSVQgfCBNRlJfRV9CSVQgfCBNRlJfQ19CSVQpCisjZGVmaW5lIE1GUl9GUkFHX0ZSQU1FICAoTUZSX0JfQklUIHwgTUZSX0VfQklUICkKKworc3RydWN0IHRvayBmcmZfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IE1GUl9CX0JJVCwgIkJlZ2luIiB9LAorICAgIHsgTUZSX0VfQklULCAiRW5kIiB9LAorICAgIHsgTUZSX0NfQklULCAiQ29udHJvbCIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworLyogRmluZHMgb3V0IFEuOTIyIGFkZHJlc3MgbGVuZ3RoLCBETENJIGFuZCBmbGFncy4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAqIHNhdmUgdGhlIGZsYWdzIGRlcC4gb24gYWRkcmVzcyBsZW5ndGgKKyAqLworc3RhdGljIGludCBwYXJzZV9xOTIyX2FkZHIoY29uc3QgdV9jaGFyICpwLCB1X2ludCAqZGxjaSwgdV9pbnQgKnNkbGNvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCAqYWRkcl9sZW4sIHVfaW50OF90ICpmbGFncykKK3sKKwlpZiAoKHBbMF0gJiBGUl9FQV9CSVQpKQorCQlyZXR1cm4gLTE7CisKKwkqYWRkcl9sZW4gPSAyOworCSpkbGNpID0gKChwWzBdICYgMHhGQykgPDwgMikgfCAoKHBbMV0gJiAweEYwKSA+PiA0KTsKKworICAgICAgICBmbGFnc1swXSA9IHBbMF0gJiAweDAyOyAvKiBwb3B1bGF0ZSB0aGUgZmlyc3QgZmxhZyBmaWVsZHMgKi8KKyAgICAgICAgZmxhZ3NbMV0gPSBwWzFdICYgMHgwYzsKKyAgICAgICAgZmxhZ3NbMl0gPSAwOyAgICAgICAgICAgLyogY2xlYXIgdGhlIHJlc3Qgb2YgdGhlIGZsYWdzICovCisgICAgICAgIGZsYWdzWzNdID0gMDsKKworCWlmIChwWzFdICYgRlJfRUFfQklUKQorCQlyZXR1cm4gMDsJLyogMi1ieXRlIFEuOTIyIGFkZHJlc3MgKi8KKworCXAgKz0gMjsKKwkoKmFkZHJfbGVuKSsrOwkJLyogMy0gb3IgNC1ieXRlIFEuOTIyIGFkZHJlc3MgKi8KKwlpZiAoKHBbMF0gJiBGUl9FQV9CSVQpID09IDApIHsKKwkJKmRsY2kgPSAoKmRsY2kgPDwgNykgfCAocFswXSA+PiAxKTsKKwkJKCphZGRyX2xlbikrKzsJLyogNC1ieXRlIFEuOTIyIGFkZHJlc3MgKi8KKwkJcCsrOworCX0KKworCWlmICgocFswXSAmIEZSX0VBX0JJVCkgPT0gMCkKKwkJcmV0dXJuIC0xOyAvKiBtb3JlIHRoYW4gNCBieXRlcyBvZiBRLjkyMiBhZGRyZXNzPyAqLworCisgICAgICAgIGZsYWdzWzNdID0gcFswXSAmIDB4MDI7CisKKwlpZiAocFswXSAmIDB4MDIpCisgICAgICAgICAgICAgICAgKnNkbGNvcmUgPSAgcFswXSA+PiAyOworCWVsc2UKKwkJKmRsY2kgPSAoKmRsY2kgPDwgNikgfCAocFswXSA+PiAyKTsKKworCXJldHVybiAwOworfQorCisvKiBGcmFtZSBSZWxheSBwYWNrZXQgc3RydWN0dXJlLCB3aXRoIGZsYWdzIGFuZCBDUkMgcmVtb3ZlZAorCisgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgfCAgICAgICBRLjkyMiBBZGRyZXNzKiAgICAgIHwKKyAgICAgICAgICAgICAgICAgICstLSAgICAgICAgICAgICAgICAgICAgICAgLS0rCisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgIHwgQ29udHJvbCAoVUkgPSAweDAzKSAgICAgICB8CisgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgfCBPcHRpb25hbCBQYWQgICAgICAoMHgwMCkgIHwKKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICB8IE5MUElEICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgLiAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC4gICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIERhdGEgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC4gICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgICAgICAgKiBRLjkyMiBhZGRyZXNzZXMsIGFzIHByZXNlbnRseSBkZWZpbmVkLCBhcmUgdHdvIG9jdGV0cyBhbmQKKyAgICAgICAgICAgICBjb250YWluIGEgMTAtYml0IERMQ0kuICBJbiBzb21lIG5ldHdvcmtzIFEuOTIyIGFkZHJlc3NlcworICAgICAgICAgICAgIG1heSBvcHRpb25hbGx5IGJlIGluY3JlYXNlZCB0byB0aHJlZSBvciBmb3VyIG9jdGV0cy4KKyovCisKK3N0YXRpYyB1X2ludAorZnJfaGRybGVuKGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgYWRkcl9sZW4pCit7CisJaWYgKCFwW2FkZHJfbGVuICsgMV0gLyogcGFkIGV4aXN0ICovKQorCQlyZXR1cm4gYWRkcl9sZW4gKyAxIC8qIFVJICovICsgMSAvKiBwYWQgKi8gKyAxIC8qIE5MUElEICovOworCWVsc2UgCisJCXJldHVybiBhZGRyX2xlbiArIDEgLyogVUkgKi8gKyAxIC8qIE5MUElEICovOworfQorCitzdGF0aWMgdm9pZAorZnJfaGRyX3ByaW50KGludCBsZW5ndGgsIHVfaW50IGFkZHJfbGVuLCB1X2ludCBkbGNpLCB1X2ludDhfdCAqZmxhZ3MsIHVfaW50MTZfdCBubHBpZCkKK3sKKyAgICBpZiAocWZsYWcpIHsKKyAgICAgICAgKHZvaWQpcHJpbnRmKCJRLjkyMiwgRExDSSAldSwgbGVuZ3RoICV1OiAiLAorICAgICAgICAgICAgICAgICAgICAgZGxjaSwKKyAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5scGlkIDw9IDB4ZmYpIC8qIGlmIGl0cyBzbWFsbGVyIHRoYW4gMjU2IHRoZW4gaXRzIGEgTkxQSUQgKi8KKyAgICAgICAgICAgICh2b2lkKXByaW50ZigiUS45MjIsIGhkci1sZW4gJXUsIERMQ0kgJXUsIEZsYWdzIFslc10sIE5MUElEICVzICgweCUwMngpLCBsZW5ndGggJXU6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgZGxjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGZyX2hlYWRlcl9mbGFnX3ZhbHVlcywgIm5vbmUiLCBFWFRSQUNUXzMyQklUUyhmbGFncykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobmxwaWRfdmFsdWVzLCJ1bmtub3duIiwgbmxwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5scGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgIGVsc2UgLyogbXVzdCBiZSBhbiBldGhlcnR5cGUgKi8KKyAgICAgICAgICAgICh2b2lkKXByaW50ZigiUS45MjIsIGhkci1sZW4gJXUsIERMQ0kgJXUsIEZsYWdzIFslc10sIGNpc2NvLWV0aGVydHlwZSAlcyAoMHglMDR4KSwgbGVuZ3RoICV1OiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihmcl9oZWFkZXJfZmxhZ192YWx1ZXMsICJub25lIiwgRVhUUkFDVF8zMkJJVFMoZmxhZ3MpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsICJ1bmtub3duIiwgbmxwaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5scGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7ICAgICAgICAKKyAgICB9Cit9CisKK3VfaW50Citmcl9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlyZWdpc3RlciB1X2ludCBsZW5ndGggPSBoLT5sZW47CisJcmVnaXN0ZXIgdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCisgICAgICAgIFRDSEVDSzIoKnAsIDQpOyAvKiBtaW5pbXVtIGZyYW1lIGhlYWRlciBsZW5ndGggKi8KKworICAgICAgICBpZiAoKGxlbmd0aCA9IGZyX3ByaW50KHAsIGxlbmd0aCkpID09IDApCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbGVuZ3RoOworIHRydW5jOgorICAgICAgICBwcmludGYoIlt8ZnJdIik7CisgICAgICAgIHJldHVybiBjYXBsZW47Cit9CisKK3VfaW50Citmcl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludDE2X3QgZXh0cmFjdGVkX2V0aGVydHlwZTsKKwl1X2ludCBkbGNpOworICAgICAgICB1X2ludCBzZGxjb3JlOworCXVfaW50IGFkZHJfbGVuOworCXVfaW50MTZfdCBubHBpZDsKKwl1X2ludCBoZHJfbGVuOworCXVfaW50OF90IGZsYWdzWzRdOworCisJaWYgKHBhcnNlX3E5MjJfYWRkcihwLCAmZGxjaSwgJnNkbGNvcmUsICZhZGRyX2xlbiwgZmxhZ3MpKSB7CisJCXByaW50ZigiUS45MjIsIGludmFsaWQgYWRkcmVzcyIpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgVENIRUNLMigqcCxhZGRyX2xlbisxKzEpOworCWhkcl9sZW4gPSBmcl9oZHJsZW4ocCwgYWRkcl9sZW4pOworICAgICAgICBUQ0hFQ0syKCpwLGhkcl9sZW4pOworCisJaWYgKHBbYWRkcl9sZW5dICE9IDB4MDMgJiYgZGxjaSAhPSAwKSB7CisKKyAgICAgICAgICAgICAgICAvKiBsZXRzIGZpZ3VyZSBvdXQgaWYgd2UgaGF2ZSBjaXNjbyBzdHlsZSBlbmNhcHN1bGF0aW9uOiAqLworICAgICAgICAgICAgICAgIGV4dHJhY3RlZF9ldGhlcnR5cGUgPSBFWFRSQUNUXzE2QklUUyhwK2FkZHJfbGVuKTsKKworICAgICAgICAgICAgICAgIGlmIChlZmxhZykKKyAgICAgICAgICAgICAgICAgICAgZnJfaGRyX3ByaW50KGxlbmd0aCwgYWRkcl9sZW4sIGRsY2ksIGZsYWdzLCBleHRyYWN0ZWRfZXRoZXJ0eXBlKTsKKworICAgICAgICAgICAgICAgIGlmIChldGhlcl9lbmNhcF9wcmludChleHRyYWN0ZWRfZXRoZXJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwK2FkZHJfbGVuK0VUSEVSVFlQRV9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aC1hZGRyX2xlbi1FVEhFUlRZUEVfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgtYWRkcl9sZW4tRVRIRVJUWVBFX0xFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApCisgICAgICAgICAgICAgICAgICAgIC8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcm9iYWJseSBpdCB3YXNuJ3Qgb25lICovCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVUkgJTAyeCEgIiwgcFthZGRyX2xlbl0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhkcl9sZW47CisgICAgICAgIH0KKworCWlmICghcFthZGRyX2xlbiArIDFdKSB7CS8qIHBhZCBieXRlIHNob3VsZCBiZSB1c2VkIHdpdGggMy1ieXRlIFEuOTIyICovCisJCWlmIChhZGRyX2xlbiAhPSAzKQorCQkJcHJpbnRmKCJQYWQhICIpOworCX0gZWxzZSBpZiAoYWRkcl9sZW4gPT0gMykKKwkJcHJpbnRmKCJObyBwYWQhICIpOworCisJbmxwaWQgPSBwW2hkcl9sZW4gLSAxXTsKKworCWlmIChlZmxhZykKKwkJZnJfaGRyX3ByaW50KGxlbmd0aCwgYWRkcl9sZW4sIGRsY2ksIGZsYWdzLCBubHBpZCk7CisJcCArPSBoZHJfbGVuOworCWxlbmd0aCAtPSBoZHJfbGVuOworCisJc3dpdGNoIChubHBpZCkgeworCWNhc2UgTkxQSURfSVA6CisJICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOworCQlicmVhazsKKworI2lmZGVmIElORVQ2CisJY2FzZSBOTFBJRF9JUDY6CisJCWlwNl9wcmludChwLCBsZW5ndGgpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgTkxQSURfQ0xOUDoKKwljYXNlIE5MUElEX0VTSVM6CisJY2FzZSBOTFBJRF9JU0lTOgorICAgICAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocC0xLCBsZW5ndGgrMSwgbGVuZ3RoKzEpOyAvKiBPU0kgcHJpbnRlcnMgbmVlZCB0aGUgTkxQSUQgZmllbGQgKi8KKwkJYnJlYWs7CisKKwljYXNlIE5MUElEX1NOQVA6CisJCWlmIChzbmFwX3ByaW50KHAsIGxlbmd0aCwgbGVuZ3RoLCAmZXh0cmFjdGVkX2V0aGVydHlwZSwgMCkgPT0gMCkgeworCQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJfaGRyX3ByaW50KGxlbmd0aCArIGhkcl9sZW4sIGhkcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2ksIGZsYWdzLCBubHBpZCk7CisJCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9wcmludChwIC0gaGRyX2xlbiwgbGVuZ3RoICsgaGRyX2xlbik7CisJCX0KKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBOTFBJRF9ROTMzOgorCQlxOTMzX3ByaW50KHAsIGxlbmd0aCk7CisJCWJyZWFrOworCisgICAgICAgIGNhc2UgTkxQSURfTUZSOgorICAgICAgICAgICAgICAgIGZyZjE1X3ByaW50KHAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOTFBJRF9QUFA6CisgICAgICAgICAgICAgICAgcHBwX3ByaW50KHAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoIWVmbGFnKQorICAgICAgICAgICAgICAgICAgICBmcl9oZHJfcHJpbnQobGVuZ3RoICsgaGRyX2xlbiwgYWRkcl9sZW4sCisJCQkJICAgICBkbGNpLCBmbGFncywgbmxwaWQpOworCQlpZiAoIXhmbGFnKQorCQkJZGVmYXVsdF9wcmludChwLCBsZW5ndGgpOworCX0KKworCXJldHVybiBoZHJfbGVuOworCisgdHJ1bmM6CisgICAgICAgIHByaW50ZigiW3xmcl0iKTsKKyAgICAgICAgcmV0dXJuIDA7CisKK30KKwordV9pbnQKK21mcl9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlyZWdpc3RlciB1X2ludCBsZW5ndGggPSBoLT5sZW47CisJcmVnaXN0ZXIgdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCisgICAgICAgIFRDSEVDSzIoKnAsIDIpOyAvKiBtaW5pbXVtIGZyYW1lIGhlYWRlciBsZW5ndGggKi8KKworICAgICAgICBpZiAoKGxlbmd0aCA9IG1mcl9wcmludChwLCBsZW5ndGgpKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyB0cnVuYzoKKyAgICAgICAgcHJpbnRmKCJbfG1mcl0iKTsKKyAgICAgICAgcmV0dXJuIGNhcGxlbjsKK30KKworCisjZGVmaW5lIE1GUl9DVFJMX01TR19BRERfTElOSyAgICAgICAgMQorI2RlZmluZSBNRlJfQ1RSTF9NU0dfQUREX0xJTktfQUNLICAgIDIKKyNkZWZpbmUgTUZSX0NUUkxfTVNHX0FERF9MSU5LX1JFSiAgICAzCisjZGVmaW5lIE1GUl9DVFJMX01TR19IRUxMTyAgICAgICAgICAgNAorI2RlZmluZSBNRlJfQ1RSTF9NU0dfSEVMTE9fQUNLICAgICAgIDUKKyNkZWZpbmUgTUZSX0NUUkxfTVNHX1JFTU9WRV9MSU5LICAgICA2CisjZGVmaW5lIE1GUl9DVFJMX01TR19SRU1PVkVfTElOS19BQ0sgNworCitzdHJ1Y3QgdG9rIG1mcl9jdHJsX21zZ192YWx1ZXNbXSA9IHsKKyAgICB7IE1GUl9DVFJMX01TR19BRERfTElOSywgIkFkZCBMaW5rIiB9LAorICAgIHsgTUZSX0NUUkxfTVNHX0FERF9MSU5LX0FDSywgIkFkZCBMaW5rIEFDSyIgfSwKKyAgICB7IE1GUl9DVFJMX01TR19BRERfTElOS19SRUosICJBZGQgTGluayBSZWplY3QiIH0sCisgICAgeyBNRlJfQ1RSTF9NU0dfSEVMTE8sICJIZWxsbyIgfSwKKyAgICB7IE1GUl9DVFJMX01TR19IRUxMT19BQ0ssICJIZWxsbyBBQ0siIH0sCisgICAgeyBNRlJfQ1RSTF9NU0dfUkVNT1ZFX0xJTkssICJSZW1vdmUgTGluayIgfSwKKyAgICB7IE1GUl9DVFJMX01TR19SRU1PVkVfTElOS19BQ0ssICJSZW1vdmUgTGluayBBQ0siIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKyNkZWZpbmUgTUZSX0NUUkxfSUVfQlVORExFX0lEICAxCisjZGVmaW5lIE1GUl9DVFJMX0lFX0xJTktfSUQgICAgMgorI2RlZmluZSBNRlJfQ1RSTF9JRV9NQUdJQ19OVU0gIDMKKyNkZWZpbmUgTUZSX0NUUkxfSUVfVElNRVNUQU1QICA1CisjZGVmaW5lIE1GUl9DVFJMX0lFX1ZFTkRPUl9FWFQgNgorI2RlZmluZSBNRlJfQ1RSTF9JRV9DQVVTRSAgICAgIDcKKworc3RydWN0IHRvayBtZnJfY3RybF9pZV92YWx1ZXNbXSA9IHsKKyAgICB7IE1GUl9DVFJMX0lFX0JVTkRMRV9JRCwgIkJ1bmRsZSBJRCJ9LAorICAgIHsgTUZSX0NUUkxfSUVfTElOS19JRCwgIkxpbmsgSUQifSwKKyAgICB7IE1GUl9DVFJMX0lFX01BR0lDX05VTSwgIk1hZ2ljIE51bWJlciJ9LAorICAgIHsgTUZSX0NUUkxfSUVfVElNRVNUQU1QLCAiVGltZXN0YW1wIn0sCisgICAgeyBNRlJfQ1RSTF9JRV9WRU5ET1JfRVhULCAiVmVuZG9yIEV4dGVuc2lvbiJ9LAorICAgIHsgTUZSX0NUUkxfSUVfQ0FVU0UsICJDYXVzZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lIE1GUl9JRF9TVFJJTkdfTUFYTEVOIDUwCisKK3N0cnVjdCBpZV90bHZfaGVhZGVyX3QgeworICAgIHVfaW50OF90IGllX3R5cGU7CisgICAgdV9pbnQ4X3QgaWVfbGVuOworfTsKKwordV9pbnQKK21mcl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKK3sKKyAgICB1X2ludCB0bGVuLGlkeCxoZHJfbGVuID0gMDsKKyAgICB1X2ludDE2X3Qgc2VxdWVuY2VfbnVtOworICAgIHVfaW50OF90IGllX3R5cGUsaWVfbGVuOworICAgIGNvbnN0IHVfaW50OF90ICp0cHRyOworCisKKy8qCisgKiBGUkYuMTYgTGluayBJbnRlZ3JpdHkgQ29udHJvbCBGcmFtZQorICogCisgKiAgICAgIDcgICAgNiAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqICAgIHwgQiAgfCBFICB8IEM9MXwgMCAgICAwICAgIDAgICAgMCAgfCBFQSB8CisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICogICAgfCAwICAgIDAgICAgMCAgICAwICAgIDAgICAgMCAgICAwICAgIDAgIHwKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8ICAgICAgICAgICAgICBtZXNzYWdlIHR5cGUgICAgICAgICAgICAgfAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqLworCisgICAgVENIRUNLMigqcCwgNCk7IC8qIG1pbmltdW0gZnJhbWUgaGVhZGVyIGxlbmd0aCAqLworCisgICAgaWYgKChwWzBdICYgTUZSX0JFQ19NQVNLKSA9PSBNRlJfQ1RSTF9GUkFNRSAmJiBwWzFdID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJGUkYuMTYgQ29udHJvbCwgRmxhZ3MgWyVzXSwgJXMsIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICBiaXR0b2syc3RyKGZyZl9mbGFnX3ZhbHVlcywibm9uZSIsKHBbMF0gJiBNRlJfQkVDX01BU0spKSwKKyAgICAgICAgICAgICAgIHRvazJzdHIobWZyX2N0cmxfbXNnX3ZhbHVlcywiVW5rbm93biBNZXNzYWdlICgweCUwMngpIixwWzJdKSwKKyAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgICAgIHRwdHIgPSBwICsgMzsKKyAgICAgICAgdGxlbiA9IGxlbmd0aCAtMzsKKyAgICAgICAgaGRyX2xlbiA9IDM7CisKKyAgICAgICAgaWYgKCF2ZmxhZykKKyAgICAgICAgICAgIHJldHVybiBoZHJfbGVuOworCisgICAgICAgIHdoaWxlICh0bGVuPnNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90KSkgeworICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QpKTsKKyAgICAgICAgICAgIGllX3R5cGU9dHB0clswXTsKKyAgICAgICAgICAgIGllX2xlbj10cHRyWzFdOworCisgICAgICAgICAgICBwcmludGYoIlxuXHRJRSAlcyAoJXUpLCBsZW5ndGggJXU6ICIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihtZnJfY3RybF9pZV92YWx1ZXMsIlVua25vd24iLGllX3R5cGUpLAorICAgICAgICAgICAgICAgICAgIGllX3R5cGUsCisgICAgICAgICAgICAgICAgICAgaWVfbGVuKTsKKworICAgICAgICAgICAgLyogaW5maW5pdGUgbG9vcCBjaGVjayAqLworICAgICAgICAgICAgaWYgKGllX3R5cGUgPT0gMCB8fCBpZV9sZW4gPD0gc2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QpKQorICAgICAgICAgICAgICAgIHJldHVybiBoZHJfbGVuOworCisgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLGllX2xlbik7CisgICAgICAgICAgICB0cHRyKz1zaXplb2Yoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCk7CisgICAgICAgICAgICAvKiB0bHYgbGVuIGluY2x1ZGVzIGhlYWRlciAqLworICAgICAgICAgICAgaWVfbGVuLT1zaXplb2Yoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCk7CisgICAgICAgICAgICB0bGVuLT1zaXplb2Yoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoaWVfdHlwZSkgeworCisgICAgICAgICAgICBjYXNlIE1GUl9DVFJMX0lFX01BR0lDX05VTToKKyAgICAgICAgICAgICAgICBwcmludGYoIjB4JTA4eCIsRVhUUkFDVF8zMkJJVFModHB0cikpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1GUl9DVFJMX0lFX0JVTkRMRV9JRDogLyogc2FtZSBtZXNzYWdlIGZvcm1hdCAqLworICAgICAgICAgICAgY2FzZSBNRlJfQ1RSTF9JRV9MSU5LX0lEOgorICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgaWVfbGVuICYmIGlkeCA8IE1GUl9JRF9TVFJJTkdfTUFYTEVOOyBpZHgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKih0cHRyK2lkeCkgIT0gMCkgLyogZG9uJ3QgcHJpbnQgbnVsbCB0ZXJtaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgc2FmZXB1dGNoYXIoKih0cHRyK2lkeCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUZSX0NUUkxfSUVfVElNRVNUQU1QOgorICAgICAgICAgICAgICAgIGlmIChpZV9sZW4gPT0gc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgeworICAgICAgICAgICAgICAgICAgICB0c19wcmludCgoY29uc3Qgc3RydWN0IHRpbWV2YWwgKil0cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCBhbmQgaGV4ZHVtcCBpZiBubyB1bml4IHRpbWVzdGFtcCAqLworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgSUVzIHRoYXQgbGFjayBhIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgKiB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBjYXNlIE1GUl9DVFJMX0lFX1ZFTkRPUl9FWFQ6CisgICAgICAgICAgICBjYXNlIE1GUl9DVFJMX0lFX0NBVVNFOgorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgIixpZV9sZW4pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhIGhleGR1bXAgb2YgdGhlIElFID8gKi8KKyAgICAgICAgICAgIGlmICh2ZmxhZyA+IDEgKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAiLGllX2xlbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHRsZW4tPWllX2xlbjsKKyAgICAgICAgICAgIHRwdHIrPWllX2xlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGRyX2xlbjsKKyAgICB9CisvKgorICogRlJGLjE2IEZyYWdtZW50YXRpb24gRnJhbWUKKyAqIAorICogICAgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8IEIgIHwgRSAgfCBDPTB8c2VxLiAoaGlnaCA0IGJpdHMpIHwgRUEgIHwKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8ICAgICAgICBzZXF1ZW5jZSAgKGxvdyA4IGJpdHMpICAgICAgICAgfAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqICAgIHwgICAgICAgIERMQ0kgKDYgYml0cykgICAgICAgIHwgQ1IgfCBFQSAgfAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqICAgIHwgICBETENJICg0IGJpdHMpICAgfEZFQ058QkVDTnwgREUgfCBFQSB8CisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICovCisKKyAgICBzZXF1ZW5jZV9udW0gPSAocFswXSYweDFlKTw8NyB8IHBbMV07CisgICAgLyogd2hvbGUgcGFja2V0IG9yIGZpcnN0IGZyYWdtZW50ID8gKi8KKyAgICBpZiAoKHBbMF0gJiBNRlJfQkVDX01BU0spID09IE1GUl9GUkFHX0ZSQU1FIHx8CisgICAgICAgIChwWzBdICYgTUZSX0JFQ19NQVNLKSA9PSBNRlJfQl9CSVQpIHsKKyAgICAgICAgcHJpbnRmKCJGUkYuMTYgRnJhZywgc2VxICV1LCBGbGFncyBbJXNdLCAiLAorICAgICAgICAgICAgICAgc2VxdWVuY2VfbnVtLAorICAgICAgICAgICAgICAgYml0dG9rMnN0cihmcmZfZmxhZ192YWx1ZXMsIm5vbmUiLChwWzBdICYgTUZSX0JFQ19NQVNLKSkpOworICAgICAgICBoZHJfbGVuID0gMjsKKyAgICAgICAgZnJfcHJpbnQocCtoZHJfbGVuLGxlbmd0aC1oZHJfbGVuKTsKKyAgICAgICAgcmV0dXJuIGhkcl9sZW47CisgICAgfQorCisgICAgLyogbXVzdCBiZSBhIG1pZGRsZSBvciB0aGUgbGFzdCBmcmFnbWVudCAqLworICAgIHByaW50ZigiRlJGLjE2IEZyYWcsIHNlcSAldSwgRmxhZ3MgWyVzXSIsCisgICAgICAgICAgIHNlcXVlbmNlX251bSwKKyAgICAgICAgICAgYml0dG9rMnN0cihmcmZfZmxhZ192YWx1ZXMsIm5vbmUiLChwWzBdICYgTUZSX0JFQ19NQVNLKSkpOworICAgIHByaW50X3Vua25vd25fZGF0YShwLCJcblx0IixsZW5ndGgpOworCisgICAgcmV0dXJuIGhkcl9sZW47CisKKyB0cnVuYzoKKyAgICBwcmludGYoIlt8bWZyXSIpOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKKy8qIGFuIE5MUElEIG9mIDB4YjEgaW5kaWNhdGVzIGEgMi1ieXRlCisgKiBGUkYuMTUgaGVhZGVyCisgKiAKKyAqICAgICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICogICAgfiAgICAgICAgICAgICAgUS45MjIgaGVhZGVyICAgICAgICAgICAgIH4KKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8ICAgICAgICAgICAgIE5MUElEICg4IGJpdHMpICAgICAgICAgICAgfCBOTFBJRD0weGIxCisgKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKworICogICAgfCBCICB8IEUgIHwgQyAgfHNlcS4gKGhpZ2ggNCBiaXRzKSB8IFIgIHwKKyAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCisgKiAgICB8ICAgICAgICBzZXF1ZW5jZSAgKGxvdyA4IGJpdHMpICAgICAgICAgfAorICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKKyAqLworCisjZGVmaW5lIEZSX0ZSRjE1X0ZSQUdUWVBFIDB4MDEKKworc3RhdGljIHZvaWQKK2ZyZjE1X3ByaW50IChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkgeworICAgIAorICAgIHVfaW50MTZfdCBzZXF1ZW5jZV9udW0sIGZsYWdzOworCisgICAgZmxhZ3MgPSBwWzBdJk1GUl9CRUNfTUFTSzsKKyAgICBzZXF1ZW5jZV9udW0gPSAocFswXSYweDFlKTw8NyB8IHBbMV07CisKKyAgICBwcmludGYoIkZSRi4xNSwgc2VxIDB4JTAzeCwgRmxhZ3MgWyVzXSwlcyBGcmFnbWVudGF0aW9uLCBsZW5ndGggJXUiLAorICAgICAgICAgICBzZXF1ZW5jZV9udW0sCisgICAgICAgICAgIGJpdHRvazJzdHIoZnJmX2ZsYWdfdmFsdWVzLCJub25lIixmbGFncyksCisgICAgICAgICAgIHBbMF0mRlJfRlJGMTVfRlJBR1RZUEUgPyAiSW50ZXJmYWNlIiA6ICJFbmQtdG8tRW5kIiwKKyAgICAgICAgICAgbGVuZ3RoKTsKKworLyogVE9ETzoKKyAqIGRlcGVuZGluZyBvbiBhbGwgcGVybXV0YXRpb25zIG9mIHRoZSBCLCBFIGFuZCBDIGJpdAorICogZGlnIGFzIGRlZXAgYXMgd2UgY2FuIC0gZS5nLiBvbiB0aGUgZmlyc3QgKEIpIGZyYWdtZW50CisgKiB0aGVyZSBpcyBlbm91Z2ggcGF5bG9hZCB0byBwcmludCB0aGUgSVAgaGVhZGVyCisgKiBvbiBub24gKEIpIGZyYWdtZW50cyBpdCBkZXBlbmRzIGlmIHRoZSBmcmFnbWVudGF0aW9uCisgKiBtb2RlbCBpcyBlbmQtdG8tZW5kIG9yIGludGVyZmFjZSBiYXNlZCB3ZXRoZXIgd2Ugd2FudCB0byBwcmludAorICogYW5vdGhlciBRLjkyMiBoZWFkZXIKKyAqLworCit9CisKKy8qCisgKiBRLjkzMyBkZWNvZGluZyBwb3J0aW9uIGZvciBmcmFtZXJlbGF5IHNwZWNpZmljLgorICovCisKKy8qIFEuOTMzIHBhY2tldCBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgb2YgT3RoZXIgUHJvdG9jb2xzICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIFEuOTMzIE5MUElECisgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgIFEuOTIyIEFkZHJlc3MgICAgICAgICAgfCAKKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgfENvbnRyb2wgIDB4MDMgIHwgTkxQSUQgICAweDA4ICB8ICAgICAgICAKKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgCisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIEwyIFByb3RvY29sIElEICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgb2N0ZXQgMSAgICAgICB8ICBvY3RldCAyICAgICAgfAorICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIEwzIFByb3RvY29sIElEICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIHwgb2N0ZXQgMiAgICAgICB8ICBvY3RldCAyICAgICAgfAorICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgUHJvdG9jb2wgRGF0YSAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgfCBGQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqLworCisvKiBMMiAoT2N0ZXQgMSktIENhbGwgUmVmZXJlbmNlIFVzdWFsbHkgaXMgMHgwICovCisKKy8qCisgKiBMMiAoT2N0ZXQgMiktIE1lc3NhZ2UgVHlwZXMgZGVmaW5pdGlvbiAxIGJ5dGUgbG9uZy4KKyAqLworLyogQ2FsbCBFc3RhYmxpc2ggKi8KKyNkZWZpbmUgTVNHX1RZUEVfRVNDX1RPX05BVElPTkFMICAweDAwCisjZGVmaW5lIE1TR19UWVBFX0FMRVJUICAgICAgICAgICAgMHgwMQorI2RlZmluZSBNU0dfVFlQRV9DQUxMX1BST0NFRURJTkcgIDB4MDIKKyNkZWZpbmUgTVNHX1RZUEVfQ09OTkVDVCAgICAgICAgICAweDA3CisjZGVmaW5lIE1TR19UWVBFX0NPTk5FQ1RfQUNLICAgICAgMHgwRgorI2RlZmluZSBNU0dfVFlQRV9QUk9HUkVTUyAgICAgICAgIDB4MDMKKyNkZWZpbmUgTVNHX1RZUEVfU0VUVVAgICAgICAgICAgICAweDA1CisvKiBDYWxsIENsZWFyICovCisjZGVmaW5lIE1TR19UWVBFX0RJU0NPTk5FQ1QgICAgICAgMHg0NQorI2RlZmluZSBNU0dfVFlQRV9SRUxFQVNFICAgICAgICAgIDB4NEQKKyNkZWZpbmUgTVNHX1RZUEVfUkVMRUFTRV9DT01QTEVURSAweDVBCisjZGVmaW5lIE1TR19UWVBFX1JFU1RBUlQgICAgICAgICAgMHg0NgorI2RlZmluZSBNU0dfVFlQRV9SRVNUQVJUX0FDSyAgICAgIDB4NEUKKy8qIFN0YXR1cyAqLworI2RlZmluZSBNU0dfVFlQRV9TVEFUVVMgICAgICAgICAgIDB4N0QKKyNkZWZpbmUgTVNHX1RZUEVfU1RBVFVTX0VOUSAgICAgICAweDc1CisKK3N0cnVjdCB0b2sgZnJfcTkzM19tc2dfdmFsdWVzW10gPSB7CisgICAgeyBNU0dfVFlQRV9FU0NfVE9fTkFUSU9OQUwsICJFU0MgdG8gTmF0aW9uYWwiIH0sCisgICAgeyBNU0dfVFlQRV9BTEVSVCwgIkFsZXJ0IiB9LAorICAgIHsgTVNHX1RZUEVfQ0FMTF9QUk9DRUVESU5HLCAiQ2FsbCBwcm9jZWVkaW5nIiB9LAorICAgIHsgTVNHX1RZUEVfQ09OTkVDVCwgIkNvbm5lY3QiIH0sCisgICAgeyBNU0dfVFlQRV9DT05ORUNUX0FDSywgIkNvbm5lY3QgQUNLIiB9LAorICAgIHsgTVNHX1RZUEVfUFJPR1JFU1MsICJQcm9ncmVzcyIgfSwKKyAgICB7IE1TR19UWVBFX1NFVFVQLCAiU2V0dXAiIH0sCisgICAgeyBNU0dfVFlQRV9ESVNDT05ORUNULCAiRGlzY29ubmVjdCIgfSwKKyAgICB7IE1TR19UWVBFX1JFTEVBU0UsICJSZWxlYXNlIiB9LAorICAgIHsgTVNHX1RZUEVfUkVMRUFTRV9DT01QTEVURSwgIlJlbGVhc2UgQ29tcGxldGUiIH0sCisgICAgeyBNU0dfVFlQRV9SRVNUQVJULCAiUmVzdGFydCIgfSwKKyAgICB7IE1TR19UWVBFX1JFU1RBUlRfQUNLLCAiUmVzdGFydCBBQ0siIH0sCisgICAgeyBNU0dfVFlQRV9TVEFUVVMsICJTdGF0dXMgUmVwbHkiIH0sCisgICAgeyBNU0dfVFlQRV9TVEFUVVNfRU5RLCAiU3RhdHVzIEVucXVpcnkiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKyNkZWZpbmUgTVNHX0FOU0lfTE9DS0lOR19TSElGVAkweDk1CisKKyNkZWZpbmUgRlJfTE1JX0FOU0lfUkVQT1JUX1RZUEVfSUUJMHgwMQorI2RlZmluZSBGUl9MTUlfQU5TSV9MSU5LX1ZFUklGWV9JRV85MQkweDE5IC8qIGRldGFpbHM/ICovCisjZGVmaW5lIEZSX0xNSV9BTlNJX0xJTktfVkVSSUZZX0lFCTB4MDMKKyNkZWZpbmUgRlJfTE1JX0FOU0lfUFZDX1NUQVRVU19JRQkweDA3CisKKyNkZWZpbmUgRlJfTE1JX0NDSVRUX1JFUE9SVF9UWVBFX0lFCTB4NTEKKyNkZWZpbmUgRlJfTE1JX0NDSVRUX0xJTktfVkVSSUZZX0lFCTB4NTMKKyNkZWZpbmUgRlJfTE1JX0NDSVRUX1BWQ19TVEFUVVNfSUUJMHg1NworCitzdHJ1Y3QgdG9rIGZyX3E5MzNfaWVfdmFsdWVzX2NvZGVzZXQ1W10gPSB7CisgICAgeyBGUl9MTUlfQU5TSV9SRVBPUlRfVFlQRV9JRSwgIkFOU0kgUmVwb3J0IFR5cGUiIH0sCisgICAgeyBGUl9MTUlfQU5TSV9MSU5LX1ZFUklGWV9JRV85MSwgIkFOU0kgTGluayBWZXJpZnkiIH0sCisgICAgeyBGUl9MTUlfQU5TSV9MSU5LX1ZFUklGWV9JRSwgIkFOU0kgTGluayBWZXJpZnkiIH0sCisgICAgeyBGUl9MTUlfQU5TSV9QVkNfU1RBVFVTX0lFLCAiQU5TSSBQVkMgU3RhdHVzIiB9LAorICAgIHsgRlJfTE1JX0NDSVRUX1JFUE9SVF9UWVBFX0lFLCAiQ0NJVFQgUmVwb3J0IFR5cGUiIH0sCisgICAgeyBGUl9MTUlfQ0NJVFRfTElOS19WRVJJRllfSUUsICJDQ0lUVCBMaW5rIFZlcmlmeSIgfSwKKyAgICB7IEZSX0xNSV9DQ0lUVF9QVkNfU1RBVFVTX0lFLCAiQ0NJVFQgUFZDIFN0YXR1cyIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworI2RlZmluZSBGUl9MTUlfUkVQT1JUX1RZUEVfSUVfRlVMTF9TVEFUVVMgMAorI2RlZmluZSBGUl9MTUlfUkVQT1JUX1RZUEVfSUVfTElOS19WRVJJRlkgMQorI2RlZmluZSBGUl9MTUlfUkVQT1JUX1RZUEVfSUVfQVNZTkNfUFZDICAgMgorCitzdHJ1Y3QgdG9rIGZyX2xtaV9yZXBvcnRfdHlwZV9pZV92YWx1ZXNbXSA9IHsKKyAgICB7IEZSX0xNSV9SRVBPUlRfVFlQRV9JRV9GVUxMX1NUQVRVUywgIkZ1bGwgU3RhdHVzIiB9LAorICAgIHsgRlJfTE1JX1JFUE9SVF9UWVBFX0lFX0xJTktfVkVSSUZZLCAiTGluayB2ZXJpZnkiIH0sCisgICAgeyBGUl9MTUlfUkVQT1JUX1RZUEVfSUVfQVNZTkNfUFZDLCAiQXN5bmMgUFZDIFN0YXR1cyIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworLyogYXJyYXkgb2YgMTYgY29kZXBhZ2VzIC0gY3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBjb2RlcGFnZSAxLDUgKi8KK3N0YXRpYyBzdHJ1Y3QgdG9rICpmcl9xOTMzX2llX2NvZGVzZXRzW10gPSB7CisgICAgTlVMTCwKKyAgICBmcl9xOTMzX2llX3ZhbHVlc19jb2Rlc2V0NSwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBmcl9xOTMzX2llX3ZhbHVlc19jb2Rlc2V0NSwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCit9OworCitzdGF0aWMgaW50IGZyX3E5MzNfcHJpbnRfaWVfY29kZXNldDUoY29uc3Qgc3RydWN0IGllX3Rsdl9oZWFkZXJfdCAgKmllX3AsCisgICAgY29uc3QgdV9jaGFyICpwKTsKKwordHlwZWRlZiBpbnQgKCpjb2Rlc2V0X3ByX2Z1bmNfdCkoY29uc3Qgc3RydWN0IGllX3Rsdl9oZWFkZXJfdCAgKmllX3AsCisgICAgY29uc3QgdV9jaGFyICpwKTsKKworLyogYXJyYXkgb2YgMTYgY29kZXBhZ2VzIC0gY3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBjb2RlcGFnZSAxLDUgKi8KK3N0YXRpYyBjb2Rlc2V0X3ByX2Z1bmNfdCBmcl9xOTMzX3ByaW50X2llX2NvZGVzZXRbXSA9IHsKKyAgICBOVUxMLAorICAgIGZyX3E5MzNfcHJpbnRfaWVfY29kZXNldDUsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgZnJfcTkzM19wcmludF9pZV9jb2Rlc2V0NSwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCit9OworCit2b2lkCitxOTMzX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoKQoreworCWNvbnN0IHVfY2hhciAqcHRlbXAgPSBwOworCXN0cnVjdCBpZV90bHZfaGVhZGVyX3QgICppZV9wOworICAgICAgICBpbnQgb2xlbjsKKwlpbnQgaXNfYW5zaSA9IDA7CisgICAgICAgIHVfaW50IGNvZGVzZXQ7CisgICAgICAgIHVfaW50IGllX2lzX2tub3duID0gMDsKKworCWlmIChsZW5ndGggPCA5KSB7CS8qIHNob3J0ZXN0OiBRLjkzM2EgTElOSyBWRVJJRlkgKi8KKwkJcHJpbnRmKCJbfHEuOTMzXSIpOworCQlyZXR1cm47CisJfQorCisgICAgICAgIGNvZGVzZXQgPSBwWzJdJjB4MGY7ICAgLyogZXh0cmFjdCB0aGUgY29kZXNldCAqLworCisJaWYgKHBbMl0gPT0gTVNHX0FOU0lfTE9DS0lOR19TSElGVCkKKwkJaXNfYW5zaSA9IDE7CisgICAgCisgICAgICAgIHByaW50ZigiJXMiLCBlZmxhZyA/ICIiIDogIlEuOTMzLCAiKTsKKworCS8qIHByaW50aW5nIG91dCBoZWFkZXIgcGFydCAqLworCXByaW50ZigiJXMsIGNvZGVzZXQgJXUiLCBpc19hbnNpID8gIkFOU0kiIDogIkNDSVRUIiwgY29kZXNldCk7CisKKwlpZiAocFswXSkKKwkJcHJpbnRmKCIsIENhbGwgUmVmOiAweCUwMngiLCBwWzBdKTsKKworICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICBwcmludGYoIiwgJXMgKDB4JTAyeCksIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihmcl9xOTMzX21zZ192YWx1ZXMsInVua25vd24gbWVzc2FnZSIscFsxXSksCisgICAgICAgICAgICAgICAgICAgcFsxXSwKKyAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIiwgJXMiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZnJfcTkzM19tc2dfdmFsdWVzLCJ1bmtub3duIG1lc3NhZ2UgMHglMDJ4IixwWzFdKSk7ICAgICAgICAgICAgCisKKyAgICAgICAgb2xlbiA9IGxlbmd0aDsgLyogcHJlc2VydmUgdGhlIG9yaWdpbmFsIGxlbmd0aCBmb3Igbm9uIHZlcmJvc2UgbW9kZSAqLworCisJaWYgKGxlbmd0aCA8ICh1X2ludCkoMiAtIGlzX2Fuc2kpKSB7CisJCXByaW50ZigiW3xxLjkzM10iKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggLT0gMiAtIGlzX2Fuc2k7CisJcHRlbXAgKz0gMiArIGlzX2Fuc2k7CisJCisJLyogTG9vcCB0aHJvdWdoIHRoZSByZXN0IG9mIElFICovCisJd2hpbGUgKGxlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90ICkpIHsKKwkJaWVfcCA9IChzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90ICAqKXB0ZW1wOworCQlpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QgKSB8fAorCQkgICAgbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QgKSArIGllX3AtPmllX2xlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcpIC8qIG5vdCBiYXJrIGlmIHRoZXJlIGlzIGp1c3QgYSB0cmFpbGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuW3xxLjkzM10iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsb2xlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKwkJfQorCisgICAgICAgICAgICAgICAgLyogbGV0cyBkbyB0aGUgZnVsbCBJRSBwYXJzaW5nIG9ubHkgaW4gdmVyYm9zZSBtb2RlCisgICAgICAgICAgICAgICAgICogaG93ZXZlciBzb21lIElFcyAoRExDSSBTdGF0dXMsIExpbmsgVmVyaWZ5KQorICAgICAgICAgICAgICAgICAqIGFyZSBhbHNvIGludGVyZXN0c3RpbmcgaW4gbm9uLXZlcmJvc2UgbW9kZSAqLworICAgICAgICAgICAgICAgIGlmICh2ZmxhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0JXMgSUUgKDB4JTAyeCksIGxlbmd0aCAldTogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZnJfcTkzM19pZV9jb2Rlc2V0c1tjb2Rlc2V0XSwidW5rbm93biIsaWVfcC0+aWVfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZV9wLT5pZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVfcC0+aWVfbGVuKTsKKyAKKyAgICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICBpZiAoaWVfcC0+aWVfdHlwZSA9PSAwIHx8IGllX3AtPmllX2xlbiA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoZnJfcTkzM19wcmludF9pZV9jb2Rlc2V0W2NvZGVzZXRdICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGllX2lzX2tub3duID0gZnJfcTkzM19wcmludF9pZV9jb2Rlc2V0W2NvZGVzZXRdKGllX3AsIHB0ZW1wKTsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA+PSAxICYmICFpZV9pc19rbm93bikKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHB0ZW1wKzIsIlxuXHQiLGllX3AtPmllX2xlbik7CisKKyAgICAgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhIGhleGR1bXAgb2YgdGhlIElFID8gKi8KKyAgICAgICAgICAgICAgICBpZiAodmZsYWc+IDEgJiYgaWVfaXNfa25vd24pCisgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwdGVtcCsyLCJcblx0ICAiLGllX3AtPmllX2xlbik7CisKKwkJbGVuZ3RoID0gbGVuZ3RoIC0gaWVfcC0+aWVfbGVuIC0gMjsKKwkJcHRlbXAgPSBwdGVtcCArIGllX3AtPmllX2xlbiArIDI7CisJfQorICAgICAgICBpZiAoIXZmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsb2xlbik7Cit9CisKK3N0YXRpYyBpbnQKK2ZyX3E5MzNfcHJpbnRfaWVfY29kZXNldDUoY29uc3Qgc3RydWN0IGllX3Rsdl9oZWFkZXJfdCAgKmllX3AsIGNvbnN0IHVfY2hhciAqcCkKK3sKKyAgICAgICAgdV9pbnQgZGxjaTsKKworICAgICAgICBzd2l0Y2ggKGllX3AtPmllX3R5cGUpIHsKKworICAgICAgICBjYXNlIEZSX0xNSV9BTlNJX1JFUE9SVF9UWVBFX0lFOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBGUl9MTUlfQ0NJVFRfUkVQT1JUX1RZUEVfSUU6CisgICAgICAgICAgICBpZiAodmZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihmcl9sbWlfcmVwb3J0X3R5cGVfaWVfdmFsdWVzLCJ1bmtub3duIixwWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFsyXSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBjYXNlIEZSX0xNSV9BTlNJX0xJTktfVkVSSUZZX0lFOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBGUl9MTUlfQ0NJVFRfTElOS19WRVJJRllfSUU6CisgICAgICAgIGNhc2UgRlJfTE1JX0FOU0lfTElOS19WRVJJRllfSUVfOTE6CisgICAgICAgICAgICBpZiAoIXZmbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgICAgIHByaW50ZigiVFggU2VxOiAlM2QsIFJYIFNlcTogJTNkIiwgcFsyXSwgcFszXSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBjYXNlIEZSX0xNSV9BTlNJX1BWQ19TVEFUVVNfSUU6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIEZSX0xNSV9DQ0lUVF9QVkNfU1RBVFVTX0lFOgorICAgICAgICAgICAgaWYgKCF2ZmxhZykKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgICAgICAvKiBub3cgcGFyc2UgdGhlIERMQ0kgaW5mb3JtYXRpb24gZWxlbWVudC4gKi8gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKChpZV9wLT5pZV9sZW4gPCAzKSB8fAorICAgICAgICAgICAgICAgIChwWzJdICYgMHg4MCkgfHwKKyAgICAgICAgICAgICAgICAoKGllX3AtPmllX2xlbiA9PSAzKSAmJiAhKHBbM10gJiAweDgwKSkgfHwKKyAgICAgICAgICAgICAgICAoKGllX3AtPmllX2xlbiA9PSA0KSAmJiAoKHBbM10gJiAweDgwKSB8fCAhKHBbNF0gJiAweDgwKSkpIHx8CisgICAgICAgICAgICAgICAgKChpZV9wLT5pZV9sZW4gPT0gNSkgJiYgKChwWzNdICYgMHg4MCkgfHwgKHBbNF0gJiAweDgwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKHBbNV0gJiAweDgwKSkpIHx8CisgICAgICAgICAgICAgICAgKGllX3AtPmllX2xlbiA+IDUpIHx8CisgICAgICAgICAgICAgICAgIShwW2llX3AtPmllX2xlbiArIDFdICYgMHg4MCkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIERMQ0kgSUUiKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBkbGNpID0gKChwWzJdICYgMHgzRikgPDwgNCkgfCAoKHBbM10gJiAweDc4KSA+PiAzKTsKKyAgICAgICAgICAgIGlmIChpZV9wLT5pZV9sZW4gPT0gNCkKKyAgICAgICAgICAgICAgICBkbGNpID0gKGRsY2kgPDwgNikgfCAoKHBbNF0gJiAweDdFKSA+PiAxKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGllX3AtPmllX2xlbiA9PSA1KQorICAgICAgICAgICAgICAgIGRsY2kgPSAoZGxjaSA8PCAxMykgfCAocFs0XSAmIDB4N0YpIHwgKChwWzVdICYgMHg3RSkgPj4gMSk7CisKKyAgICAgICAgICAgIHByaW50ZigiRExDSSAldTogc3RhdHVzICVzJXMiLCBkbGNpLAorICAgICAgICAgICAgICAgICAgICBwW2llX3AtPmllX2xlbiArIDFdICYgMHg4ID8gIk5ldywgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICBwW2llX3AtPmllX2xlbiArIDFdICYgMHgyID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworCX0KKworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWZyYWc2LmMgYi9wcmludC1mcmFnNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzc4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1mcmFnNi5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1mcmFnNi5jLHYgMS4xOS4yLjEgMjAwNS8wNC8yMCAyMjozMzoyMSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIElORVQ2CisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImlwNi5oIgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworaW50CitmcmFnNl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMikKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXA2X2ZyYWcgKmRwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDY7CisKKwlkcCA9IChjb25zdCBzdHJ1Y3QgaXA2X2ZyYWcgKilicDsKKwlpcDYgPSAoY29uc3Qgc3RydWN0IGlwNl9oZHIgKilicDI7CisKKwlUQ0hFQ0soZHAtPmlwNmZfb2ZmbGcpOworCisJaWYgKHZmbGFnKSB7CisJCXByaW50ZigiZnJhZyAoMHglMDh4OiVkfCVsZCkiLAorCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmRwLT5pcDZmX2lkZW50KSwKKwkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aXA2Zl9vZmZsZykgJiBJUDZGX09GRl9NQVNLLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSArIEVYVFJBQ1RfMTZCSVRTKCZpcDYtPmlwNl9wbGVuKSAtCisJCQkgICAgICAgKGxvbmcpKGJwIC0gYnAyKSAtIHNpemVvZihzdHJ1Y3QgaXA2X2ZyYWcpKTsKKwl9IGVsc2UgeworCQlwcmludGYoImZyYWcgKCVkfCVsZCkiLAorCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJmRwLT5pcDZmX29mZmxnKSAmIElQNkZfT0ZGX01BU0ssCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlwNl9oZHIpICsgRVhUUkFDVF8xNkJJVFMoJmlwNi0+aXA2X3BsZW4pIC0KKwkJCSAgICAgICAobG9uZykoYnAgLSBicDIpIC0gc2l6ZW9mKHN0cnVjdCBpcDZfZnJhZykpOworCX0KKworI2lmIDEKKwkvKiBpdCBpcyBtZWFuaW5nbGVzcyB0byBkZWNvZGUgbm9uLWZpcnN0IGZyYWdtZW50ICovCisJaWYgKChFWFRSQUNUXzE2QklUUygmZHAtPmlwNmZfb2ZmbGcpICYgSVA2Rl9PRkZfTUFTSykgIT0gMCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKyNlbmRpZgorCXsKKwkJZnB1dHMoIiAiLCBzdGRvdXQpOworCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpcDZfZnJhZyk7CisJfQordHJ1bmM6CisJZnB1dHMoIlt8ZnJhZ10iLCBzdGRvdXQpOworCXJldHVybiAtMTsKKyN1bmRlZiBUQ0hFQ0sKK30KKyNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtZ3JlLmMgYi9wcmludC1ncmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzM5MzU2Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtZ3JlLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qCSRPcGVuQlNEOiBwcmludC1ncmUuYyx2IDEuNiAyMDAyLzEwLzMwIDAzOjA0OjA0IGZnc2NoIEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFzb24gTC4gV3JpZ2h0IChqYXNvbkB0aG91Z2h0Lm5ldCkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSmFzb24gTC4gV3JpZ2h0CisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiB0Y3BkdW1wIGZpbHRlciBmb3IgR1JFIC0gR2VuZXJpYyBSb3V0aW5nIEVuY2Fwc3VsYXRpb24KKyAqIFJGQzE3MDEgKEdSRSksIFJGQzE3MDIgKEdSRSBJUHY0KSwgYW5kIFJGQzI2MzcgKEVuaGFuY2VkIEdSRSkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1ncmUuYyx2IDEuMjggMjAwNS8wNC8wNiAyMTozMjozOSBtY3IgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImlwLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisKKyNkZWZpbmUJR1JFX0NQCQkweDgwMDAJCS8qIGNoZWNrc3VtIHByZXNlbnQgKi8KKyNkZWZpbmUJR1JFX1JQCQkweDQwMDAJCS8qIHJvdXRpbmcgcHJlc2VudCAqLworI2RlZmluZQlHUkVfS1AJCTB4MjAwMAkJLyoga2V5IHByZXNlbnQgKi8KKyNkZWZpbmUJR1JFX1NQCQkweDEwMDAJCS8qIHNlcXVlbmNlIyBwcmVzZW50ICovCisjZGVmaW5lCUdSRV9zUAkJMHgwODAwCQkvKiBzb3VyY2Ugcm91dGluZyAqLworI2RlZmluZQlHUkVfUkVDUlMJMHgwNzAwCQkvKiByZWN1cnNpb24gY291bnQgKi8KKyNkZWZpbmUJR1JFX0FQCQkweDAwODAJCS8qIGFja25vd2xlZGdtZW50IyBwcmVzZW50ICovCisKK3N0cnVjdCB0b2sgZ3JlX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyBHUkVfQ1AsICJjaGVja3N1bSBwcmVzZW50In0sCisgICAgeyBHUkVfUlAsICJyb3V0aW5nIHByZXNlbnQifSwgCisgICAgeyBHUkVfS1AsICJrZXkgcHJlc2VudCJ9LCAKKyAgICB7IEdSRV9TUCwgInNlcXVlbmNlIyBwcmVzZW50In0sIAorICAgIHsgR1JFX3NQLCAic291cmNlIHJvdXRpbmcgcHJlc2VudCJ9LAorICAgIHsgR1JFX1JFQ1JTLCAicmVjdXJzaW9uIGNvdW50In0sCisgICAgeyBHUkVfQVAsICJhY2sgcHJlc2VudCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lCUdSRV9WRVJTX01BU0sJMHgwMDA3CQkvKiBwcm90b2NvbCB2ZXJzaW9uICovCisKKy8qIHNvdXJjZSByb3V0ZSBlbnRyeSB0eXBlcyAqLworI2RlZmluZQlHUkVTUkVfSVAJMHgwODAwCQkvKiBJUCAqLworI2RlZmluZQlHUkVTUkVfQVNOCTB4ZmZmZQkJLyogQVNOICovCisKK3ZvaWQgZ3JlX3ByaW50XzAoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3ZvaWQgZ3JlX3ByaW50XzEoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3ZvaWQgZ3JlX3NyZV9wcmludCh1X2ludDE2X3QsIHVfaW50OF90LCB1X2ludDhfdCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3ZvaWQgZ3JlX3NyZV9pcF9wcmludCh1X2ludDhfdCwgdV9pbnQ4X3QsIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Cit2b2lkIGdyZV9zcmVfYXNuX3ByaW50KHVfaW50OF90LCB1X2ludDhfdCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKKwordm9pZAorZ3JlX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludCBsZW4gPSBsZW5ndGgsIHZlcnM7CisKKwlpZiAobGVuIDwgMikgeworCQlwcmludGYoIlt8Z3JlXSIpOworCQlyZXR1cm47CisJfQorCXZlcnMgPSBFWFRSQUNUXzE2QklUUyhicCkgJiBHUkVfVkVSU19NQVNLOworICAgICAgICBwcmludGYoIkdSRXYldSIsdmVycyk7CisKKyAgICAgICAgc3dpdGNoKHZlcnMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ3JlX3ByaW50XzAoYnAsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZ3JlX3ByaW50XzEoYnAsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCIgRVJST1I6IHVua25vd24tdmVyc2lvbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwlyZXR1cm47CisKK30KKwordm9pZAorZ3JlX3ByaW50XzAoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXVfaW50IGxlbiA9IGxlbmd0aDsKKwl1X2ludDE2X3QgZmxhZ3MsIHByb3Q7CisKKwlmbGFncyA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKKyAgICAgICAgaWYgKHZmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCIsIEZsYWdzIFslc10iLAorICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoZ3JlX2ZsYWdfdmFsdWVzLCJub25lIixmbGFncykpOworCisJbGVuIC09IDI7CisJYnAgKz0gMjsKKworCWlmIChsZW4gPCAyKQorCQlnb3RvIHRydW5jOworCXByb3QgPSBFWFRSQUNUXzE2QklUUyhicCk7CisJbGVuIC09IDI7CisJYnAgKz0gMjsKKworCWlmICgoZmxhZ3MgJiBHUkVfQ1ApIHwgKGZsYWdzICYgR1JFX1JQKSkgeworCQlpZiAobGVuIDwgMikKKwkJCWdvdG8gdHJ1bmM7CisJCWlmICh2ZmxhZykKKwkJCXByaW50ZigiLCBzdW0gMHgleCIsIEVYVFJBQ1RfMTZCSVRTKGJwKSk7CisJCWJwICs9IDI7CisJCWxlbiAtPSAyOworCisJCWlmIChsZW4gPCAyKQorCQkJZ290byB0cnVuYzsKKwkJcHJpbnRmKCIsIG9mZiAweCV4IiwgRVhUUkFDVF8xNkJJVFMoYnApKTsKKwkJYnAgKz0gMjsKKwkJbGVuIC09IDI7CisJfQorCisJaWYgKGZsYWdzICYgR1JFX0tQKSB7CisJCWlmIChsZW4gPCA0KQorCQkJZ290byB0cnVuYzsKKwkJcHJpbnRmKCIsIGtleT0weCV4IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKKwkJYnAgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJaWYgKGZsYWdzICYgR1JFX1NQKSB7CisJCWlmIChsZW4gPCA0KQorCQkJZ290byB0cnVuYzsKKwkJcHJpbnRmKCIsIHNlcSAldSIsIEVYVFJBQ1RfMzJCSVRTKGJwKSk7CisJCWJwICs9IDQ7CisJCWxlbiAtPSA0OworCX0KKworCWlmIChmbGFncyAmIEdSRV9SUCkgeworCQlmb3IgKDs7KSB7CisJCQl1X2ludDE2X3QgYWY7CisJCQl1X2ludDhfdCBzcmVvZmY7CisJCQl1X2ludDhfdCBzcmVsZW47CisKKwkJCWlmIChsZW4gPCA0KQorCQkJCWdvdG8gdHJ1bmM7CisJCQlhZiA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKKwkJCXNyZW9mZiA9ICooYnAgKyAyKTsKKwkJCXNyZWxlbiA9ICooYnAgKyAzKTsKKwkJCWJwICs9IDQ7CisJCQlsZW4gLT0gNDsKKworCQkJaWYgKGFmID09IDAgJiYgc3JlbGVuID09IDApCisJCQkJYnJlYWs7CisKKwkJCWdyZV9zcmVfcHJpbnQoYWYsIHNyZW9mZiwgc3JlbGVuLCBicCwgbGVuKTsKKworCQkJaWYgKGxlbiA8IHNyZWxlbikKKwkJCQlnb3RvIHRydW5jOworCQkJYnAgKz0gc3JlbGVuOworCQkJbGVuIC09IHNyZWxlbjsKKwkJfQorCX0KKworICAgICAgICBpZiAoZWZsYWcpCisgICAgICAgICAgICBwcmludGYoIiwgcHJvdG8gJXMgKDB4JTA0eCkiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywidW5rbm93biIscHJvdCksCisgICAgICAgICAgICAgICAgICAgcHJvdCk7CisKKyAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsbGVuZ3RoKTsKKworICAgICAgICBpZiAodmZsYWcgPCAxKQorICAgICAgICAgICAgcHJpbnRmKCI6ICIpOyAvKiBwdXQgaW4gYSBjb2xvbiBhcyBwcm90b2NvbCBkZW1hcmMgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJcblx0Iik7IC8qIGlmIHZlcmJvc2UgZ28gbXVsdGlsaW5lICovCisKKwlzd2l0Y2ggKHByb3QpIHsKKwljYXNlIEVUSEVSVFlQRV9JUDoKKwkgICAgICAgIGlwX3ByaW50KGduZG8sIGJwLCBsZW4pOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCWlwNl9wcmludChicCwgbGVuKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEVUSEVSVFlQRV9NUExTOgorCQltcGxzX3ByaW50KGJwLCBsZW4pOworCQlicmVhazsKKwljYXNlIEVUSEVSVFlQRV9JUFg6CisJCWlweF9wcmludChicCwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhFUlRZUEVfQVRBTEs6CisJCWF0YWxrX3ByaW50KGJwLCBsZW4pOworCQlicmVhazsKKwljYXNlIEVUSEVSVFlQRV9HUkVfSVNPOgorCQlpc29jbG5zX3ByaW50KGJwLCBsZW4sIGxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiZ3JlLXByb3RvLTB4JXgiLCBwcm90KTsKKwl9CisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIlt8Z3JlXSIpOworfQorCit2b2lkCitncmVfcHJpbnRfMShjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCit7CisJdV9pbnQgbGVuID0gbGVuZ3RoOworCXVfaW50MTZfdCBmbGFncywgcHJvdDsKKworCWZsYWdzID0gRVhUUkFDVF8xNkJJVFMoYnApOworCWxlbiAtPSAyOworCWJwICs9IDI7CisKKwlpZiAodmZsYWcpCisgICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyVzXSIsCisgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihncmVfZmxhZ192YWx1ZXMsIm5vbmUiLGZsYWdzKSk7CisKKwlpZiAobGVuIDwgMikKKwkJZ290byB0cnVuYzsKKwlwcm90ID0gRVhUUkFDVF8xNkJJVFMoYnApOworCWxlbiAtPSAyOworCWJwICs9IDI7CisKKworCWlmIChmbGFncyAmIEdSRV9LUCkgeworCQl1X2ludDMyX3QgazsKKworCQlpZiAobGVuIDwgNCkKKwkJCWdvdG8gdHJ1bmM7CisJCWsgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCXByaW50ZigiLCBjYWxsICVkIiwgayAmIDB4ZmZmZik7CisJCWxlbiAtPSA0OworCQlicCArPSA0OworCX0KKworCWlmIChmbGFncyAmIEdSRV9TUCkgeworCQlpZiAobGVuIDwgNCkKKwkJCWdvdG8gdHJ1bmM7CisJCXByaW50ZigiLCBzZXEgJXUiLCBFWFRSQUNUXzMyQklUUyhicCkpOworCQlicCArPSA0OworCQlsZW4gLT0gNDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBHUkVfQVApIHsKKwkJaWYgKGxlbiA8IDQpCisJCQlnb3RvIHRydW5jOworCQlwcmludGYoIiwgYWNrICV1IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKKwkJYnAgKz0gNDsKKwkJbGVuIC09IDQ7CisJfQorCisJaWYgKChmbGFncyAmIEdSRV9TUCkgPT0gMCkKKwkJcHJpbnRmKCIsIG5vLXBheWxvYWQiKTsKKworICAgICAgICBpZiAoZWZsYWcpCisgICAgICAgICAgICBwcmludGYoIiwgcHJvdG8gJXMgKDB4JTA0eCkiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywidW5rbm93biIscHJvdCksCisgICAgICAgICAgICAgICAgICAgcHJvdCk7CisKKyAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsbGVuZ3RoKTsKKworICAgICAgICBpZiAoKGZsYWdzICYgR1JFX1NQKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICh2ZmxhZyA8IDEpCisgICAgICAgICAgICBwcmludGYoIjogIik7IC8qIHB1dCBpbiBhIGNvbG9uIGFzIHByb3RvY29sIGRlbWFyYyAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIlxuXHQiKTsgLyogaWYgdmVyYm9zZSBnbyBtdWx0aWxpbmUgKi8KKworCXN3aXRjaCAocHJvdCkgeworCWNhc2UgRVRIRVJUWVBFX1BQUDoKKyAgICAgICAgICAgICAgICBwcHBfcHJpbnQoYnAsIGxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiZ3JlLXByb3RvLTB4JXgiLCBwcm90KTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCJbfGdyZV0iKTsKK30KKwordm9pZAorZ3JlX3NyZV9wcmludCh1X2ludDE2X3QgYWYsIHVfaW50OF90IHNyZW9mZiwgdV9pbnQ4X3Qgc3JlbGVuLAorICAgIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbikKK3sKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBHUkVTUkVfSVA6CisJCXByaW50ZigiLCAocnRhZj1pcCIpOworCQlncmVfc3JlX2lwX3ByaW50KHNyZW9mZiwgc3JlbGVuLCBicCwgbGVuKTsKKwkJcHJpbnRmKCIpICIpOworCQlicmVhazsKKwljYXNlIEdSRVNSRV9BU046CisJCXByaW50ZigiLCAocnRhZj1hc24iKTsKKwkJZ3JlX3NyZV9hc25fcHJpbnQoc3Jlb2ZmLCBzcmVsZW4sIGJwLCBsZW4pOworCQlwcmludGYoIikgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiLCAocnRhZj0weCV4KSAiLCBhZik7CisJfQorfQordm9pZAorZ3JlX3NyZV9pcF9wcmludCh1X2ludDhfdCBzcmVvZmYsIHVfaW50OF90IHNyZWxlbiwgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuKQoreworCXN0cnVjdCBpbl9hZGRyIGE7CisJY29uc3QgdV9jaGFyICp1cCA9IGJwOworCisJaWYgKHNyZW9mZiAmIDMpIHsKKwkJcHJpbnRmKCIsIGJhZG9mZnNldD0ldSIsIHNyZW9mZik7CisJCXJldHVybjsKKwl9CisJaWYgKHNyZWxlbiAmIDMpIHsKKwkJcHJpbnRmKCIsIGJhZGxlbmd0aD0ldSIsIHNyZWxlbik7CisJCXJldHVybjsKKwl9CisJaWYgKHNyZW9mZiA+PSBzcmVsZW4pIHsKKwkJcHJpbnRmKCIsIGJhZG9mZi9sZW49JXUvJXUiLCBzcmVvZmYsIHNyZWxlbik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWlmIChsZW4gPCA0IHx8IHNyZWxlbiA9PSAwKQorCQkJcmV0dXJuOworCisJCW1lbWNweSgmYSwgYnAsIHNpemVvZihhKSk7CisJCXByaW50ZigiICVzJXMiLAorCQkgICAgKChicCAtIHVwKSA9PSBzcmVvZmYpID8gIioiIDogIiIsCisJCSAgICBpbmV0X250b2EoYSkpOworCisJCWJwICs9IDQ7CisJCWxlbiAtPSA0OworCQlzcmVsZW4gLT0gNDsKKwl9Cit9CisKK3ZvaWQKK2dyZV9zcmVfYXNuX3ByaW50KHVfaW50OF90IHNyZW9mZiwgdV9pbnQ4X3Qgc3JlbGVuLCBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW4pCit7CisJY29uc3QgdV9jaGFyICp1cCA9IGJwOworCisJaWYgKHNyZW9mZiAmIDEpIHsKKwkJcHJpbnRmKCIsIGJhZG9mZnNldD0ldSIsIHNyZW9mZik7CisJCXJldHVybjsKKwl9CisJaWYgKHNyZWxlbiAmIDEpIHsKKwkJcHJpbnRmKCIsIGJhZGxlbmd0aD0ldSIsIHNyZWxlbik7CisJCXJldHVybjsKKwl9CisJaWYgKHNyZW9mZiA+PSBzcmVsZW4pIHsKKwkJcHJpbnRmKCIsIGJhZG9mZi9sZW49JXUvJXUiLCBzcmVvZmYsIHNyZWxlbik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWlmIChsZW4gPCAyIHx8IHNyZWxlbiA9PSAwKQorCQkJcmV0dXJuOworCisJCXByaW50ZigiICVzJXgiLAorCQkgICAgKChicCAtIHVwKSA9PSBzcmVvZmYpID8gIioiIDogIiIsCisJCSAgICBFWFRSQUNUXzE2QklUUyhicCkpOworCisJCWJwICs9IDI7CisJCWxlbiAtPSAyOworCQlzcmVsZW4gLT0gMjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wcmludC1oc3JwLmMgYi9wcmludC1oc3JwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyMjI0NwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWhzcnAuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBKdWxpYW4gQ293bGV5CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBDaXNjbyBIb3QgU3RhbmRieSBSb3V0ZXIgUHJvdG9jb2wgKEhTUlApLiAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1oc3JwLmMsdiAxLjkuMi4xIDIwMDUvMDUvMDYgMDc6NTc6MTcgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworLyogSFNSUCBvcCBjb2RlIHR5cGVzLiAqLworc3RhdGljIGNvbnN0IGNoYXIgKm9wX2NvZGVfc3RyW10gPSB7CisJImhlbGxvIiwKKwkiY291cCIsCisJInJlc2lnbiIKK307CisKKy8qIEhTUlAgc3RhdGVzIGFuZCBhc3NvY2lhdGVkIG5hbWVzLiAqLworc3RhdGljIHN0cnVjdCB0b2sgc3RhdGVzW10gPSB7CisJeyAgMCwgImluaXRpYWwiIH0sCisJeyAgMSwgImxlYXJuIiB9LAorCXsgIDIsICJsaXN0ZW4iIH0sCisJeyAgNCwgInNwZWFrIiB9LAorCXsgIDgsICJzdGFuZGJ5IiB9LAorCXsgMTYsICJhY3RpdmUiIH0sCisJeyAgMCwgTlVMTCB9Cit9OworCisvKgorICogUkZDIDIyODE6CisgKgorICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgVmVyc2lvbiAgICAgfCAgIE9wIENvZGUgICAgIHwgICAgIFN0YXRlICAgICB8ICAgSGVsbG90aW1lICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICBIb2xkdGltZSAgICB8ICAgUHJpb3JpdHkgICAgfCAgICAgR3JvdXAgICAgIHwgICBSZXNlcnZlZCAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiAgRGF0YSAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uICBEYXRhICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgVmlydHVhbCBJUCBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisKKyNkZWZpbmUgSFNSUF9BVVRIX1NJWkUJOAorCisvKiBIU1JQIHByb3RvY29sIGhlYWRlci4gKi8KK3N0cnVjdCBoc3JwIHsKKwl1X2ludDhfdAloc3JwX3ZlcnNpb247CisJdV9pbnQ4X3QJaHNycF9vcF9jb2RlOworCXVfaW50OF90CWhzcnBfc3RhdGU7CisJdV9pbnQ4X3QJaHNycF9oZWxsb3RpbWU7CisJdV9pbnQ4X3QJaHNycF9ob2xkdGltZTsKKwl1X2ludDhfdAloc3JwX3ByaW9yaXR5OworCXVfaW50OF90CWhzcnBfZ3JvdXA7CisJdV9pbnQ4X3QJaHNycF9yZXNlcnZlZDsKKwl1X2ludDhfdAloc3JwX2F1dGhkYXRhW0hTUlBfQVVUSF9TSVpFXTsKKwlzdHJ1Y3QgaW5fYWRkcgloc3JwX3ZpcnRhZGRyOworfTsKKwordm9pZAoraHNycF9wcmludChyZWdpc3RlciBjb25zdCB1X2ludDhfdCAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbikKK3sKKwlzdHJ1Y3QgaHNycCAqaHAgPSAoc3RydWN0IGhzcnAgKikgYnA7CisKKwlUQ0hFQ0soaHAtPmhzcnBfdmVyc2lvbik7CisJcHJpbnRmKCJIU1JQdiVkIiwgaHAtPmhzcnBfdmVyc2lvbik7CisJaWYgKGhwLT5oc3JwX3ZlcnNpb24gIT0gMCkKKwkJcmV0dXJuOworCVRDSEVDSyhocC0+aHNycF9vcF9jb2RlKTsKKwlwcmludGYoIi0iKTsKKwlwcmludGYoIiVzICIsIHRvazJzdHJhcnkob3BfY29kZV9zdHIsICJ1bmtub3duICglZCkiLCBocC0+aHNycF9vcF9jb2RlKSk7CisJcHJpbnRmKCIlZDogIiwgbGVuKTsKKwlUQ0hFQ0soaHAtPmhzcnBfc3RhdGUpOworCXByaW50Zigic3RhdGU9JXMgIiwgdG9rMnN0cihzdGF0ZXMsICJVbmtub3duICglZCkiLCBocC0+aHNycF9zdGF0ZSkpOworCVRDSEVDSyhocC0+aHNycF9ncm91cCk7CisJcHJpbnRmKCJncm91cD0lZCAiLCBocC0+aHNycF9ncm91cCk7CisJVENIRUNLKGhwLT5oc3JwX3Jlc2VydmVkKTsKKwlpZiAoaHAtPmhzcnBfcmVzZXJ2ZWQgIT0gMCkgeworCQlwcmludGYoIltyZXNlcnZlZD0lZCFdICIsIGhwLT5oc3JwX3Jlc2VydmVkKTsKKwl9CisJVENIRUNLKGhwLT5oc3JwX3ZpcnRhZGRyKTsKKwlwcmludGYoImFkZHI9JXMiLCBpcGFkZHJfc3RyaW5nKCZocC0+aHNycF92aXJ0YWRkcikpOworCWlmICh2ZmxhZykgeworCQlwcmludGYoIiBoZWxsb3RpbWU9Iik7CisJCXJlbHRzX3ByaW50KGhwLT5oc3JwX2hlbGxvdGltZSk7CisJCXByaW50ZigiIGhvbGR0aW1lPSIpOworCQlyZWx0c19wcmludChocC0+aHNycF9ob2xkdGltZSk7CisJCXByaW50ZigiIHByaW9yaXR5PSVkIiwgaHAtPmhzcnBfcHJpb3JpdHkpOworCQlwcmludGYoIiBhdXRoPVwiIik7CisJCWlmIChmbl9wcmludG4oaHAtPmhzcnBfYXV0aGRhdGEsIHNpemVvZihocC0+aHNycF9hdXRoZGF0YSksCisJCSAgICBzbmFwZW5kKSkgeworCQkJcHJpbnRmKCJcIiIpOworCQkJZ290byB0cnVuYzsKKwkJfQorCQlwcmludGYoIlwiIik7CisJfQorCXJldHVybjsKK3RydW5jOgorCXByaW50ZigiW3xoc3JwXSIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaWNtcC5jIGIvcHJpbnQtaWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTg0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pY21wLmMKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pY21wLmMsdiAxLjgxLjIuNiAyMDA3LzA5LzEzIDE3OjQwOjE4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworCisjaW5jbHVkZSAiaXAuaCIKKyNpbmNsdWRlICJ1ZHAuaCIKKyNpbmNsdWRlICJpcHByb3RvLmgiCisjaW5jbHVkZSAibXBscy5oIgorCisvKgorICogSW50ZXJmYWNlIENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCBEZWZpbml0aW9ucy4KKyAqIFBlciBSRkMgNzkyLCBTZXB0ZW1iZXIgMTk4MS4KKyAqLworCisvKgorICogU3RydWN0dXJlIG9mIGFuIGljbXAgaGVhZGVyLgorICovCitzdHJ1Y3QgaWNtcCB7CisJdV9pbnQ4X3QgIGljbXBfdHlwZTsJCS8qIHR5cGUgb2YgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9pbnQ4X3QgIGljbXBfY29kZTsJCS8qIHR5cGUgc3ViIGNvZGUgKi8KKwl1X2ludDE2X3QgaWNtcF9ja3N1bTsJCS8qIG9uZXMgY29tcGxlbWVudCBja3N1bSBvZiBzdHJ1Y3QgKi8KKwl1bmlvbiB7CisJCXVfaW50OF90IGloX3BwdHI7CQkJLyogSUNNUF9QQVJBTVBST0IgKi8KKwkJc3RydWN0IGluX2FkZHIgaWhfZ3dhZGRyOwkvKiBJQ01QX1JFRElSRUNUICovCisJCXN0cnVjdCBpaF9pZHNlcSB7CisJCQl1X2ludDE2X3QgaWNkX2lkOworCQkJdV9pbnQxNl90IGljZF9zZXE7CisJCX0gaWhfaWRzZXE7CisJCXVfaW50MzJfdCBpaF92b2lkOworCX0gaWNtcF9odW47CisjZGVmaW5lCWljbXBfcHB0cglpY21wX2h1bi5paF9wcHRyCisjZGVmaW5lCWljbXBfZ3dhZGRyCWljbXBfaHVuLmloX2d3YWRkcgorI2RlZmluZQlpY21wX2lkCQlpY21wX2h1bi5paF9pZHNlcS5pY2RfaWQKKyNkZWZpbmUJaWNtcF9zZXEJaWNtcF9odW4uaWhfaWRzZXEuaWNkX3NlcQorI2RlZmluZQlpY21wX3ZvaWQJaWNtcF9odW4uaWhfdm9pZAorCXVuaW9uIHsKKwkJc3RydWN0IGlkX3RzIHsKKwkJCXVfaW50MzJfdCBpdHNfb3RpbWU7CisJCQl1X2ludDMyX3QgaXRzX3J0aW1lOworCQkJdV9pbnQzMl90IGl0c190dGltZTsKKwkJfSBpZF90czsKKwkJc3RydWN0IGlkX2lwICB7CisJCQlzdHJ1Y3QgaXAgaWRpX2lwOworCQkJLyogb3B0aW9ucyBhbmQgdGhlbiA2NCBiaXRzIG9mIGRhdGEgKi8KKwkJfSBpZF9pcDsKKwkJdV9pbnQzMl90IGlkX21hc2s7CisJCXVfaW50OF90IGlkX2RhdGFbMV07CisJfSBpY21wX2R1bjsKKyNkZWZpbmUJaWNtcF9vdGltZQlpY21wX2R1bi5pZF90cy5pdHNfb3RpbWUKKyNkZWZpbmUJaWNtcF9ydGltZQlpY21wX2R1bi5pZF90cy5pdHNfcnRpbWUKKyNkZWZpbmUJaWNtcF90dGltZQlpY21wX2R1bi5pZF90cy5pdHNfdHRpbWUKKyNkZWZpbmUJaWNtcF9pcAkJaWNtcF9kdW4uaWRfaXAuaWRpX2lwCisjZGVmaW5lCWljbXBfbWFzawlpY21wX2R1bi5pZF9tYXNrCisjZGVmaW5lCWljbXBfZGF0YQlpY21wX2R1bi5pZF9kYXRhCit9OworCisjZGVmaW5lIElDTVBfTVBMU19FWFRfRVhUUkFDVF9WRVJTSU9OKHgpICgoKHgpJjB4ZjApPj40KSAKKyNkZWZpbmUgSUNNUF9NUExTX0VYVF9WRVJTSU9OIDIKKworLyoKKyAqIExvd2VyIGJvdW5kcyBvbiBwYWNrZXQgbGVuZ3RocyBmb3IgdmFyaW91cyB0eXBlcy4KKyAqIEZvciB0aGUgZXJyb3IgYWR2aWNlIHBhY2tldHMgbXVzdCBmaXJzdCBpbnN1cmUgdGhhdCB0aGUKKyAqIHBhY2tldCBpcyBsYXJnZSBlbm91Z2h0IHRvIGNvbnRhaW4gdGhlIHJldHVybmVkIGlwIGhlYWRlci4KKyAqIE9ubHkgdGhlbiBjYW4gd2UgZG8gdGhlIGNoZWNrIHRvIHNlZSBpZiA2NCBiaXRzIG9mIHBhY2tldAorICogZGF0YSBoYXZlIGJlZW4gcmV0dXJuZWQsIHNpbmNlIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybmVkCisgKiBpcCBoZWFkZXIgbGVuZ3RoLgorICovCisjZGVmaW5lCUlDTVBfTUlOTEVOCTgJCQkJLyogYWJzIG1pbmltdW0gKi8KKyNkZWZpbmUgSUNNUF9FWFREX01JTkxFTiAoMTU2IC0gc2l6ZW9mIChzdHJ1Y3QgaXApKSAgICAgLyogZHJhZnQtYm9uaWNhLWludGVybmV0LWljbXAtMDggKi8KKyNkZWZpbmUJSUNNUF9UU0xFTgkoOCArIDMgKiBzaXplb2YgKHVfaW50MzJfdCkpCS8qIHRpbWVzdGFtcCAqLworI2RlZmluZQlJQ01QX01BU0tMRU4JMTIJCQkJLyogYWRkcmVzcyBtYXNrICovCisjZGVmaW5lCUlDTVBfQURWTEVOTUlOCSg4ICsgc2l6ZW9mIChzdHJ1Y3QgaXApICsgOCkJLyogbWluICovCisjZGVmaW5lCUlDTVBfQURWTEVOKHApCSg4ICsgKElQX0hMKCYocCktPmljbXBfaXApIDw8IDIpICsgOCkKKwkvKiBOLkIuOiBtdXN0IHNlcGFyYXRlbHkgY2hlY2sgdGhhdCBpcF9obCA+PSA1ICovCisKKy8qCisgKiBEZWZpbml0aW9uIG9mIHR5cGUgYW5kIGNvZGUgZmllbGQgdmFsdWVzLgorICovCisjZGVmaW5lCUlDTVBfRUNIT1JFUExZCQkwCQkvKiBlY2hvIHJlcGx5ICovCisjZGVmaW5lCUlDTVBfVU5SRUFDSAkJMwkJLyogZGVzdCB1bnJlYWNoYWJsZSwgY29kZXM6ICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfTkVUCTAJCS8qIGJhZCBuZXQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9IT1NUCTEJCS8qIGJhZCBob3N0ICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfUFJPVE9DT0wJMgkJLyogYmFkIHByb3RvY29sICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfUE9SVAkzCQkvKiBiYWQgcG9ydCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX05FRURGUkFHCTQJCS8qIElQX0RGIGNhdXNlZCBkcm9wICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfU1JDRkFJTAk1CQkvKiBzcmMgcm91dGUgZmFpbGVkICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04gNgkJLyogdW5rbm93biBuZXQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9IT1NUX1VOS05PV04gNwkJLyogdW5rbm93biBob3N0ICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfSVNPTEFURUQJOAkJLyogc3JjIGhvc3QgaXNvbGF0ZWQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVRfUFJPSElCCTkJCS8qIHByb2hpYml0ZWQgYWNjZXNzICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUIgMTAJCS8qIGRpdHRvICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfVE9TTkVUCTExCQkvKiBiYWQgdG9zIGZvciBuZXQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9UT1NIT1NUCTEyCQkvKiBiYWQgdG9zIGZvciBob3N0ICovCisjZGVmaW5lCUlDTVBfU09VUkNFUVVFTkNICTQJCS8qIHBhY2tldCBsb3N0LCBzbG93IGRvd24gKi8KKyNkZWZpbmUJSUNNUF9SRURJUkVDVAkJNQkJLyogc2hvcnRlciByb3V0ZSwgY29kZXM6ICovCisjZGVmaW5lCQlJQ01QX1JFRElSRUNUX05FVAkwCQkvKiBmb3IgbmV0d29yayAqLworI2RlZmluZQkJSUNNUF9SRURJUkVDVF9IT1NUCTEJCS8qIGZvciBob3N0ICovCisjZGVmaW5lCQlJQ01QX1JFRElSRUNUX1RPU05FVAkyCQkvKiBmb3IgdG9zIGFuZCBuZXQgKi8KKyNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfVE9TSE9TVAkzCQkvKiBmb3IgdG9zIGFuZCBob3N0ICovCisjZGVmaW5lCUlDTVBfRUNITwkJOAkJLyogZWNobyBzZXJ2aWNlICovCisjZGVmaW5lCUlDTVBfUk9VVEVSQURWRVJUCTkJCS8qIHJvdXRlciBhZHZlcnRpc2VtZW50ICovCisjZGVmaW5lCUlDTVBfUk9VVEVSU09MSUNJVAkxMAkJLyogcm91dGVyIHNvbGljaXRhdGlvbiAqLworI2RlZmluZQlJQ01QX1RJTVhDRUVECQkxMQkJLyogdGltZSBleGNlZWRlZCwgY29kZTogKi8KKyNkZWZpbmUJCUlDTVBfVElNWENFRURfSU5UUkFOUwkwCQkvKiB0dGw9PTAgaW4gdHJhbnNpdCAqLworI2RlZmluZQkJSUNNUF9USU1YQ0VFRF9SRUFTUwkxCQkvKiB0dGw9PTAgaW4gcmVhc3MgKi8KKyNkZWZpbmUJSUNNUF9QQVJBTVBST0IJCTEyCQkvKiBpcCBoZWFkZXIgYmFkICovCisjZGVmaW5lCQlJQ01QX1BBUkFNUFJPQl9PUFRBQlNFTlQgMQkJLyogcmVxLiBvcHQuIGFic2VudCAqLworI2RlZmluZQlJQ01QX1RTVEFNUAkJMTMJCS8qIHRpbWVzdGFtcCByZXF1ZXN0ICovCisjZGVmaW5lCUlDTVBfVFNUQU1QUkVQTFkJMTQJCS8qIHRpbWVzdGFtcCByZXBseSAqLworI2RlZmluZQlJQ01QX0lSRVEJCTE1CQkvKiBpbmZvcm1hdGlvbiByZXF1ZXN0ICovCisjZGVmaW5lCUlDTVBfSVJFUVJFUExZCQkxNgkJLyogaW5mb3JtYXRpb24gcmVwbHkgKi8KKyNkZWZpbmUJSUNNUF9NQVNLUkVRCQkxNwkJLyogYWRkcmVzcyBtYXNrIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9NQVNLUkVQTFkJCTE4CQkvKiBhZGRyZXNzIG1hc2sgcmVwbHkgKi8KKworI2RlZmluZQlJQ01QX01BWFRZUEUJCTE4CisKKyNkZWZpbmUJSUNNUF9JTkZPVFlQRSh0eXBlKSBcCisJKCh0eXBlKSA9PSBJQ01QX0VDSE9SRVBMWSB8fCAodHlwZSkgPT0gSUNNUF9FQ0hPIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9ST1VURVJBRFZFUlQgfHwgKHR5cGUpID09IElDTVBfUk9VVEVSU09MSUNJVCB8fCBcCisJKHR5cGUpID09IElDTVBfVFNUQU1QIHx8ICh0eXBlKSA9PSBJQ01QX1RTVEFNUFJFUExZIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9JUkVRIHx8ICh0eXBlKSA9PSBJQ01QX0lSRVFSRVBMWSB8fCBcCisJKHR5cGUpID09IElDTVBfTUFTS1JFUSB8fCAodHlwZSkgPT0gSUNNUF9NQVNLUkVQTFkpCisjZGVmaW5lCUlDTVBfTVBMU19FWFRfVFlQRSh0eXBlKSBcCisJKCh0eXBlKSA9PSBJQ01QX1VOUkVBQ0ggfHwgXAorICAgICAgICAgKHR5cGUpID09IElDTVBfVElNWENFRUQgfHwgXAorICAgICAgICAgKHR5cGUpID09IElDTVBfUEFSQU1QUk9CKQorLyogcmZjMTcwMCAqLworI2lmbmRlZiBJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04KKyNkZWZpbmUgSUNNUF9VTlJFQUNIX05FVF9VTktOT1dOCTYJLyogZGVzdGluYXRpb24gbmV0IHVua25vd24gKi8KKyNlbmRpZgorI2lmbmRlZiBJQ01QX1VOUkVBQ0hfSE9TVF9VTktOT1dOCisjZGVmaW5lIElDTVBfVU5SRUFDSF9IT1NUX1VOS05PV04JNwkvKiBkZXN0aW5hdGlvbiBob3N0IHVua25vd24gKi8KKyNlbmRpZgorI2lmbmRlZiBJQ01QX1VOUkVBQ0hfSVNPTEFURUQKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX0lTT0xBVEVECQk4CS8qIHNvdXJjZSBob3N0IGlzb2xhdGVkICovCisjZW5kaWYKKyNpZm5kZWYgSUNNUF9VTlJFQUNIX05FVF9QUk9ISUIKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX05FVF9QUk9ISUIJCTkJLyogYWRtaW4gcHJvaGliaXRlZCBuZXQgKi8KKyNlbmRpZgorI2lmbmRlZiBJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUIKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX0hPU1RfUFJPSElCCTEwCS8qIGFkbWluIHByb2hpYml0ZWQgaG9zdCAqLworI2VuZGlmCisjaWZuZGVmIElDTVBfVU5SRUFDSF9UT1NORVQKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX1RPU05FVAkJMTEJLyogdG9zIHByb2hpYml0ZWQgbmV0ICovCisjZW5kaWYKKyNpZm5kZWYgSUNNUF9VTlJFQUNIX1RPU0hPU1QKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX1RPU0hPU1QJCTEyCS8qIHRvcyBwcm9oaWJpdGVkIGhvc3QgKi8KKyNlbmRpZgorCisvKiByZmMxNzE2ICovCisjaWZuZGVmIElDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCCisjZGVmaW5lIElDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCCTEzCS8qIGFkbWluIHByb2hpYml0ZWQgZmlsdGVyICovCisjZW5kaWYKKyNpZm5kZWYgSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRQorI2RlZmluZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFCTE0CS8qIGhvc3QgcHJlY2VkZW5jZSB2aW9sYXRpb24gKi8KKyNlbmRpZgorI2lmbmRlZiBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkYKKyNkZWZpbmUgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGCTE1CS8qIHByZWNlZGVuY2UgY3V0b2ZmICovCisjZW5kaWYKKworLyogTW9zdCBvZiB0aGUgaWNtcCB0eXBlcyAqLworc3RhdGljIHN0cnVjdCB0b2sgaWNtcDJzdHJbXSA9IHsKKwl7IElDTVBfRUNIT1JFUExZLAkJImVjaG8gcmVwbHkiIH0sCisJeyBJQ01QX1NPVVJDRVFVRU5DSCwJCSJzb3VyY2UgcXVlbmNoIiB9LAorCXsgSUNNUF9FQ0hPLAkJCSJlY2hvIHJlcXVlc3QiIH0sCisJeyBJQ01QX1JPVVRFUlNPTElDSVQsCQkicm91dGVyIHNvbGljaXRhdGlvbiIgfSwKKwl7IElDTVBfVFNUQU1QLAkJCSJ0aW1lIHN0YW1wIHJlcXVlc3QiIH0sCisJeyBJQ01QX1RTVEFNUFJFUExZLAkJInRpbWUgc3RhbXAgcmVwbHkiIH0sCisJeyBJQ01QX0lSRVEsCQkJImluZm9ybWF0aW9uIHJlcXVlc3QiIH0sCisJeyBJQ01QX0lSRVFSRVBMWSwJCSJpbmZvcm1hdGlvbiByZXBseSIgfSwKKwl7IElDTVBfTUFTS1JFUSwJCQkiYWRkcmVzcyBtYXNrIHJlcXVlc3QiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKKy8qIEZvcm1hdHMgZm9yIG1vc3Qgb2YgdGhlIElDTVBfVU5SRUFDSCBjb2RlcyAqLworc3RhdGljIHN0cnVjdCB0b2sgdW5yZWFjaDJzdHJbXSA9IHsKKwl7IElDTVBfVU5SRUFDSF9ORVQsCQkibmV0ICVzIHVucmVhY2hhYmxlIiB9LAorCXsgSUNNUF9VTlJFQUNIX0hPU1QsCQkiaG9zdCAlcyB1bnJlYWNoYWJsZSIgfSwKKwl7IElDTVBfVU5SRUFDSF9TUkNGQUlMLAorCSAgICAiJXMgdW5yZWFjaGFibGUgLSBzb3VyY2Ugcm91dGUgZmFpbGVkIiB9LAorCXsgSUNNUF9VTlJFQUNIX05FVF9VTktOT1dOLAkibmV0ICVzIHVucmVhY2hhYmxlIC0gdW5rbm93biIgfSwKKwl7IElDTVBfVU5SRUFDSF9IT1NUX1VOS05PV04sCSJob3N0ICVzIHVucmVhY2hhYmxlIC0gdW5rbm93biIgfSwKKwl7IElDTVBfVU5SRUFDSF9JU09MQVRFRCwKKwkgICAgIiVzIHVucmVhY2hhYmxlIC0gc291cmNlIGhvc3QgaXNvbGF0ZWQiIH0sCisJeyBJQ01QX1VOUkVBQ0hfTkVUX1BST0hJQiwKKwkgICAgIm5ldCAlcyB1bnJlYWNoYWJsZSAtIGFkbWluIHByb2hpYml0ZWQiIH0sCisJeyBJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUIsCisJICAgICJob3N0ICVzIHVucmVhY2hhYmxlIC0gYWRtaW4gcHJvaGliaXRlZCIgfSwKKwl7IElDTVBfVU5SRUFDSF9UT1NORVQsCisJICAgICJuZXQgJXMgdW5yZWFjaGFibGUgLSB0b3MgcHJvaGliaXRlZCIgfSwKKwl7IElDTVBfVU5SRUFDSF9UT1NIT1NULAorCSAgICAiaG9zdCAlcyB1bnJlYWNoYWJsZSAtIHRvcyBwcm9oaWJpdGVkIiB9LAorCXsgSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUIsCisJICAgICJob3N0ICVzIHVucmVhY2hhYmxlIC0gYWRtaW4gcHJvaGliaXRlZCBmaWx0ZXIiIH0sCisJeyBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFLAorCSAgICAiaG9zdCAlcyB1bnJlYWNoYWJsZSAtIGhvc3QgcHJlY2VkZW5jZSB2aW9sYXRpb24iIH0sCisJeyBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkYsCisJICAgICJob3N0ICVzIHVucmVhY2hhYmxlIC0gcHJlY2VkZW5jZSBjdXRvZmYiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKKy8qIEZvcm1hdHMgZm9yIHRoZSBJQ01QX1JFRElSRUNUIGNvZGVzICovCitzdGF0aWMgc3RydWN0IHRvayB0eXBlMnN0cltdID0geworCXsgSUNNUF9SRURJUkVDVF9ORVQsCQkicmVkaXJlY3QgJXMgdG8gbmV0ICVzIiB9LAorCXsgSUNNUF9SRURJUkVDVF9IT1NULAkJInJlZGlyZWN0ICVzIHRvIGhvc3QgJXMiIH0sCisJeyBJQ01QX1JFRElSRUNUX1RPU05FVCwJCSJyZWRpcmVjdC10b3MgJXMgdG8gbmV0ICVzIiB9LAorCXsgSUNNUF9SRURJUkVDVF9UT1NIT1NULAkicmVkaXJlY3QtdG9zICVzIHRvIGhvc3QgJXMiIH0sCisJeyAwLAkJCQlOVUxMIH0KK307CisKKy8qIHJmYzExOTEgKi8KK3N0cnVjdCBtdHVfZGlzY292ZXJ5IHsKKwl1X2ludDE2X3QgdW51c2VkOworCXVfaW50MTZfdCBuZXh0aG9wbXR1OworfTsKKworLyogcmZjMTI1NiAqLworc3RydWN0IGloX3JkaXNjb3ZlcnkgeworCXVfaW50OF90IGlyZF9hZGRybnVtOworCXVfaW50OF90IGlyZF9hZGRyc2l6OworCXVfaW50MTZfdCBpcmRfbGlmZXRpbWU7Cit9OworCitzdHJ1Y3QgaWRfcmRpc2NvdmVyeSB7CisJdV9pbnQzMl90IGlyZF9hZGRyOworCXVfaW50MzJfdCBpcmRfcHJlZjsKK307CisKKy8qCisgKiBkcmFmdC1ib25pY2EtaW50ZXJuZXQtaWNtcC0wOAorICoKKyAqIFRoZSBEZXN0aW5hdGlvbiBVbnJlYWNoYWJsZSwgVGltZSBFeGNlZWRlZAorICogYW5kIFBhcmFtZXRlciBQcm9ibGVtIG1lc3NhZ2VzIGFyZSBzbGlnaGx5IGNoYW5nZWQgYXMgcGVyCisgKiB0aGUgYWJvdmUgZHJhZnQuIEEgbmV3IExlbmd0aCBmaWVsZCBnZXRzIGFkZGVkIHRvIGdpdmUKKyAqIHRoZSBjYWxsZXIgYW4gaWRlYSBhYm91dCB0aGUgbGVuZ3RoIG9mIHRoZSBwaWdneXBhY2tlZAorICogSVAgcGFja2V0IGJlZm9yZSB0aGUgTVBMUyBleHRlbnNpb24gaGVhZGVyIHN0YXJ0cy4KKyAqCisgKiBUaGUgTGVuZ3RoIGZpZWxkIHJlcHJlc2VudHMgbGVuZ3RoIG9mIHRoZSBwYWRkZWQgIm9yaWdpbmFsIGRhdGFncmFtIgorICogZmllbGQgIG1lYXN1cmVkIGluIDMyLWJpdCB3b3Jkcy4KKyAqCisgKiAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICBUeXBlICAgICAgfCAgICAgQ29kZSAgICAgIHwgICAgICAgICAgQ2hlY2tzdW0gICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgIHVudXNlZCAgICB8ICAgIExlbmd0aCAgICAgfCAgICAgICAgICB1bnVzZWQgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgIEludGVybmV0IEhlYWRlciArIGxlYWRpbmcgb2N0ZXRzIG9mIG9yaWdpbmFsIGRhdGFncmFtICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KKworc3RydWN0IGljbXBfZXh0X3QgeworICAgIHVfaW50OF90IGljbXBfdHlwZTsKKyAgICB1X2ludDhfdCBpY21wX2NvZGU7CisgICAgdV9pbnQ4X3QgaWNtcF9jaGVja3N1bVsyXTsKKyAgICB1X2ludDhfdCBpY21wX3Jlc2VydmVkOworICAgIHVfaW50OF90IGljbXBfbGVuZ3RoOworICAgIHVfaW50OF90IGljbXBfcmVzZXJ2ZWQyWzJdOworICAgIHVfaW50OF90IGljbXBfZXh0X2xlZ2FjeV9oZWFkZXJbMTI4XTsgLyogZXh0ZW5zaW9uIGhlYWRlciBzdGFydHMgMTI4IGJ5dGVzIGFmdGVyIElDTVAgaGVhZGVyICovCisgICAgdV9pbnQ4X3QgaWNtcF9leHRfdmVyc2lvbl9yZXNbMl07CisgICAgdV9pbnQ4X3QgaWNtcF9leHRfY2hlY2tzdW1bMl07CisgICAgdV9pbnQ4X3QgaWNtcF9leHRfZGF0YVsxXTsKK307CisKK3N0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCB7CisgICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOworICAgIHVfaW50OF90IGNsYXNzX251bTsKKyAgICB1X2ludDhfdCBjdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGljbXBfbXBsc19leHRfb2JqX3ZhbHVlc1tdID0geworICAgIHsgMSwgIk1QTFMgU3RhY2sgRW50cnkiIH0sCisgICAgeyAyLCAiRXh0ZW5kZWQgUGF5bG9hZCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBwcm90b3R5cGVzICovCitjb25zdCBjaGFyICppY21wX3RzdGFtcF9wcmludCh1X2ludCk7CisKKy8qIHByaW50IHRoZSBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgVVRDICovCitjb25zdCBjaGFyICoKK2ljbXBfdHN0YW1wX3ByaW50KHVfaW50IHRzdGFtcCkgeworICAgIHVfaW50IG1zZWMsc2VjLG1pbixocnM7CisKKyAgICBzdGF0aWMgY2hhciBidWZbNjRdOworCisgICAgbXNlYyA9IHRzdGFtcCAlIDEwMDA7CisgICAgc2VjID0gdHN0YW1wIC8gMTAwMDsKKyAgICBtaW4gPSBzZWMgLyA2MDsgc2VjIC09IG1pbiAqIDYwOworICAgIGhycyA9IG1pbiAvIDYwOyBtaW4gLT0gaHJzICogNjA7CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUwMnU6JTAydTolMDJ1LiUwM3UiLGhycyxtaW4sc2VjLG1zZWMpOworICAgIHJldHVybiBidWY7Cit9CisgCit2b2lkCitpY21wX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IHBsZW4sIGNvbnN0IHVfY2hhciAqYnAyLCBpbnQgZnJhZ21lbnRlZCkKK3sKKwljaGFyICpjcDsKKwljb25zdCBzdHJ1Y3QgaWNtcCAqZHA7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpY21wX2V4dF90ICpleHRfZHA7CisJY29uc3Qgc3RydWN0IGlwICppcDsKKwljb25zdCBjaGFyICpzdHIsICpmbXQ7CisJY29uc3Qgc3RydWN0IGlwICpvaXA7CisJY29uc3Qgc3RydWN0IHVkcGhkciAqb3VoOworICAgICAgICBjb25zdCB1X2ludDhfdCAqb2JqX3RwdHI7CisgICAgICAgIHVfaW50MzJfdCByYXdfbGFiZWw7CisgICAgICAgIGNvbnN0IHVfY2hhciAqc25hcGVuZF9zYXZlOworCWNvbnN0IHN0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCAqaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyOworCXVfaW50IGhsZW4sIGRwb3J0LCBtdHUsIG9ial90bGVuLCBvYmpfY2xhc3NfbnVtLCBvYmpfY3R5cGU7CisJY2hhciBidWZbTUFYSE9TVE5BTUVMRU4gKyAxMDBdOworCisJZHAgPSAoc3RydWN0IGljbXAgKilicDsKKyAgICAgICAgZXh0X2RwID0gKHN0cnVjdCBpY21wX2V4dF90ICopYnA7CisJaXAgPSAoc3RydWN0IGlwICopYnAyOworCXN0ciA9IGJ1ZjsKKworCVRDSEVDSyhkcC0+aWNtcF9jb2RlKTsKKwlzd2l0Y2ggKGRwLT5pY21wX3R5cGUpIHsKKworCWNhc2UgSUNNUF9FQ0hPOgorCWNhc2UgSUNNUF9FQ0hPUkVQTFk6CisJCVRDSEVDSyhkcC0+aWNtcF9zZXEpOworCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiZWNobyAlcywgaWQgJXUsIHNlcSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IiA6ICJyZXBseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmRwLT5pY21wX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfc2VxKSk7CisJCWJyZWFrOworCisJY2FzZSBJQ01QX1VOUkVBQ0g6CisJCVRDSEVDSyhkcC0+aWNtcF9pcC5pcF9kc3QpOworCQlzd2l0Y2ggKGRwLT5pY21wX2NvZGUpIHsKKworCQljYXNlIElDTVBfVU5SRUFDSF9QUk9UT0NPTDoKKwkJCVRDSEVDSyhkcC0+aWNtcF9pcC5pcF9wKTsKKwkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkgICAgIiVzIHByb3RvY29sICVkIHVucmVhY2hhYmxlIiwKKwkJCSAgICBpcGFkZHJfc3RyaW5nKCZkcC0+aWNtcF9pcC5pcF9kc3QpLAorCQkJICAgIGRwLT5pY21wX2lwLmlwX3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSBJQ01QX1VOUkVBQ0hfUE9SVDoKKwkJCVRDSEVDSyhkcC0+aWNtcF9pcC5pcF9wKTsKKwkJCW9pcCA9ICZkcC0+aWNtcF9pcDsKKwkJCWhsZW4gPSBJUF9ITChvaXApICogNDsKKwkJCW91aCA9IChzdHJ1Y3QgdWRwaGRyICopKCgodV9jaGFyICopb2lwKSArIGhsZW4pOworCQkJVENIRUNLKG91aC0+dWhfZHBvcnQpOworCQkJZHBvcnQgPSBFWFRSQUNUXzE2QklUUygmb3VoLT51aF9kcG9ydCk7CisJCQlzd2l0Y2ggKG9pcC0+aXBfcCkgeworCisJCQljYXNlIElQUFJPVE9fVENQOgorCQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCSIlcyB0Y3AgcG9ydCAlcyB1bnJlYWNoYWJsZSIsCisJCQkJCWlwYWRkcl9zdHJpbmcoJm9pcC0+aXBfZHN0KSwKKwkJCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCQkiJXMgdWRwIHBvcnQgJXMgdW5yZWFjaGFibGUiLAorCQkJCQlpcGFkZHJfc3RyaW5nKCZvaXAtPmlwX2RzdCksCisJCQkJCXVkcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCQkJIiVzIHByb3RvY29sICVkIHBvcnQgJWQgdW5yZWFjaGFibGUiLAorCQkJCQlpcGFkZHJfc3RyaW5nKCZvaXAtPmlwX2RzdCksCisJCQkJCW9pcC0+aXBfcCwgZHBvcnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJQ01QX1VOUkVBQ0hfTkVFREZSQUc6CisJCSAgICB7CisJCQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbXR1X2Rpc2NvdmVyeSAqbXA7CisJCQltcCA9IChzdHJ1Y3QgbXR1X2Rpc2NvdmVyeSAqKSZkcC0+aWNtcF92b2lkOworCQkJbXR1ID0gRVhUUkFDVF8xNkJJVFMoJm1wLT5uZXh0aG9wbXR1KTsKKwkJCWlmIChtdHUpIHsKKwkJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSAgICAiJXMgdW5yZWFjaGFibGUgLSBuZWVkIHRvIGZyYWcgKG10dSAlZCkiLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZkcC0+aWNtcF9pcC5pcF9kc3QpLCBtdHUpOworCQkJfSBlbHNlIHsKKwkJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkJCSAgICAiJXMgdW5yZWFjaGFibGUgLSBuZWVkIHRvIGZyYWciLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZkcC0+aWNtcF9pcC5pcF9kc3QpKTsKKwkJCX0KKwkJICAgIH0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlmbXQgPSB0b2syc3RyKHVucmVhY2gyc3RyLCAiIyVkICUlcyB1bnJlYWNoYWJsZSIsCisJCQkgICAgZHAtPmljbXBfY29kZSk7CisJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsCisJCQkgICAgaXBhZGRyX3N0cmluZygmZHAtPmljbXBfaXAuaXBfZHN0KSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUNNUF9SRURJUkVDVDoKKwkJVENIRUNLKGRwLT5pY21wX2lwLmlwX2RzdCk7CisJCWZtdCA9IHRvazJzdHIodHlwZTJzdHIsICJyZWRpcmVjdC0jJWQgJSVzIHRvIG5ldCAlJXMiLAorCQkgICAgZHAtPmljbXBfY29kZSk7CisJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmRwLT5pY21wX2lwLmlwX2RzdCksCisJCSAgICBpcGFkZHJfc3RyaW5nKCZkcC0+aWNtcF9nd2FkZHIpKTsKKwkJYnJlYWs7CisKKwljYXNlIElDTVBfUk9VVEVSQURWRVJUOgorCSAgICB7CisJCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpaF9yZGlzY292ZXJ5ICppaHA7CisJCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpZF9yZGlzY292ZXJ5ICppZHA7CisJCXVfaW50IGxpZmV0aW1lLCBudW0sIHNpemU7CisKKwkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInJvdXRlciBhZHZlcnRpc2VtZW50Iik7CisJCWNwID0gYnVmICsgc3RybGVuKGJ1Zik7CisKKwkJaWhwID0gKHN0cnVjdCBpaF9yZGlzY292ZXJ5ICopJmRwLT5pY21wX3ZvaWQ7CisJCVRDSEVDSygqaWhwKTsKKwkJKHZvaWQpc3RybmNweShjcCwgIiBsaWZldGltZSAiLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZikpOworCQljcCA9IGJ1ZiArIHN0cmxlbihidWYpOworCQlsaWZldGltZSA9IEVYVFJBQ1RfMTZCSVRTKCZpaHAtPmlyZF9saWZldGltZSk7CisJCWlmIChsaWZldGltZSA8IDYwKSB7CisJCQkodm9pZClzbnByaW50ZihjcCwgc2l6ZW9mKGJ1ZikgLSAoY3AgLSBidWYpLCAiJXUiLAorCQkJICAgIGxpZmV0aW1lKTsKKwkJfSBlbHNlIGlmIChsaWZldGltZSA8IDYwICogNjApIHsKKwkJCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksICIldTolMDJ1IiwKKwkJCSAgICBsaWZldGltZSAvIDYwLCBsaWZldGltZSAlIDYwKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksCisJCQkgICAgIiV1OiUwMnU6JTAydSIsCisJCQkgICAgbGlmZXRpbWUgLyAzNjAwLAorCQkJICAgIChsaWZldGltZSAlIDM2MDApIC8gNjAsCisJCQkgICAgbGlmZXRpbWUgJSA2MCk7CisJCX0KKwkJY3AgPSBidWYgKyBzdHJsZW4oYnVmKTsKKworCQludW0gPSBpaHAtPmlyZF9hZGRybnVtOworCQkodm9pZClzbnByaW50ZihjcCwgc2l6ZW9mKGJ1ZikgLSAoY3AgLSBidWYpLCAiICVkOiIsIG51bSk7CisJCWNwID0gYnVmICsgc3RybGVuKGJ1Zik7CisKKwkJc2l6ZSA9IGlocC0+aXJkX2FkZHJzaXo7CisJCWlmIChzaXplICE9IDIpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksCisJCQkgICAgIiBbc2l6ZSAlZF0iLCBzaXplKTsKKwkJCWJyZWFrOworCQl9CisJCWlkcCA9IChzdHJ1Y3QgaWRfcmRpc2NvdmVyeSAqKSZkcC0+aWNtcF9kYXRhOworCQl3aGlsZSAobnVtLS0gPiAwKSB7CisJCQlUQ0hFQ0soKmlkcCk7CisJCQkodm9pZClzbnByaW50ZihjcCwgc2l6ZW9mKGJ1ZikgLSAoY3AgLSBidWYpLCAiIHslcyAldX0iLAorCQkJICAgIGlwYWRkcl9zdHJpbmcoJmlkcC0+aXJkX2FkZHIpLAorCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZpZHAtPmlyZF9wcmVmKSk7CisJCQljcCA9IGJ1ZiArIHN0cmxlbihidWYpOworCQkJKytpZHA7CisJCX0KKwkgICAgfQorCQlicmVhazsKKworCWNhc2UgSUNNUF9USU1YQ0VFRDoKKwkJVENIRUNLKGRwLT5pY21wX2lwLmlwX2RzdCk7CisJCXN3aXRjaCAoZHAtPmljbXBfY29kZSkgeworCisJCWNhc2UgSUNNUF9USU1YQ0VFRF9JTlRSQU5TOgorCQkJc3RyID0gInRpbWUgZXhjZWVkZWQgaW4tdHJhbnNpdCI7CisJCQlicmVhazsKKworCQljYXNlIElDTVBfVElNWENFRURfUkVBU1M6CisJCQlzdHIgPSAiaXAgcmVhc3NlbWJseSB0aW1lIGV4Y2VlZGVkIjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAidGltZSBleGNlZWRlZC0jJWQiLAorCQkJICAgIGRwLT5pY21wX2NvZGUpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElDTVBfUEFSQU1QUk9COgorCQlpZiAoZHAtPmljbXBfY29kZSkKKwkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkgICAgInBhcmFtZXRlciBwcm9ibGVtIC0gY29kZSAlZCIsIGRwLT5pY21wX2NvZGUpOworCQllbHNlIHsKKwkJCVRDSEVDSyhkcC0+aWNtcF9wcHRyKTsKKwkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkgICAgInBhcmFtZXRlciBwcm9ibGVtIC0gb2N0ZXQgJWQiLCBkcC0+aWNtcF9wcHRyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSUNNUF9NQVNLUkVQTFk6CisJCVRDSEVDSyhkcC0+aWNtcF9tYXNrKTsKKwkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFkZHJlc3MgbWFzayBpcyAweCUwOHgiLAorCQkgICAgRVhUUkFDVF8zMkJJVFMoJmRwLT5pY21wX21hc2spKTsKKwkJYnJlYWs7CisKKwljYXNlIElDTVBfVFNUQU1QOgorCQlUQ0hFQ0soZHAtPmljbXBfc2VxKTsKKwkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICJ0aW1lIHN0YW1wIHF1ZXJ5IGlkICV1IHNlcSAldSIsCisJCSAgICBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfaWQpLAorCQkgICAgRVhUUkFDVF8xNkJJVFMoJmRwLT5pY21wX3NlcSkpOworCQlicmVhazsKKworCWNhc2UgSUNNUF9UU1RBTVBSRVBMWToKKwkJVENIRUNLKGRwLT5pY21wX3R0aW1lKTsKKwkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJICAgICJ0aW1lIHN0YW1wIHJlcGx5IGlkICV1IHNlcSAldTogb3JnICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcF9zZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljbXBfdHN0YW1wX3ByaW50KEVYVFJBQ1RfMzJCSVRTKCZkcC0+aWNtcF9vdGltZSkpKTsKKworICAgICAgICAgICAgICAgICh2b2lkKXNucHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSxzaXplb2YoYnVmKS1zdHJsZW4oYnVmKSwiLCByZWN2ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpY21wX3RzdGFtcF9wcmludChFWFRSQUNUXzMyQklUUygmZHAtPmljbXBfcnRpbWUpKSk7CisgICAgICAgICAgICAgICAgKHZvaWQpc25wcmludGYoYnVmK3N0cmxlbihidWYpLHNpemVvZihidWYpLXN0cmxlbihidWYpLCIsIHhtaXQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljbXBfdHN0YW1wX3ByaW50KEVYVFJBQ1RfMzJCSVRTKCZkcC0+aWNtcF90dGltZSkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCWRlZmF1bHQ6CisJCXN0ciA9IHRvazJzdHIoaWNtcDJzdHIsICJ0eXBlLSMlZCIsIGRwLT5pY21wX3R5cGUpOworCQlicmVhazsKKwl9CisJKHZvaWQpcHJpbnRmKCJJQ01QICVzLCBsZW5ndGggJXUiLCBzdHIsIHBsZW4pOworCWlmICh2ZmxhZyAmJiAhZnJhZ21lbnRlZCkgeyAvKiBkb24ndCBhdHRlbXB0IGNoZWNrc3VtbWluZyBpZiB0aGlzIGlzIGEgZnJhZyAqLworCQl1X2ludDE2X3Qgc3VtLCBpY21wX3N1bTsKKwkJaWYgKFRURVNUMigqYnAsIHBsZW4pKSB7CisJCQlzdW0gPSBpbl9ja3N1bSgodV9zaG9ydCopZHAsIHBsZW4sIDApOworCQkJaWYgKHN1bSAhPSAwKSB7CisJCQkJaWNtcF9zdW0gPSBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfY2tzdW0pOworCQkJCSh2b2lkKXByaW50ZigiICh3cm9uZyBpY21wIGNrc3VtICV4ICgtPiV4KSEpIiwKKwkJCQkJICAgICBpY21wX3N1bSwKKwkJCQkJICAgICBpbl9ja3N1bV9zaG91bGRiZShpY21wX3N1bSwgc3VtKSk7CisJCQl9CisJCX0KKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcHJpbnQgdGhlIHJlbW5hbnRzIG9mIHRoZSBJUCBwYWNrZXQuCisgICAgICAgICAqIHNhdmUgdGhlIHNuYXBsZW5ndGggYXMgdGhpcyBtYXkgZ2V0IG92ZXJpZGRlbiBpbiB0aGUgSVAgcHJpbnRlci4KKyAgICAgICAgICovCisJaWYgKHZmbGFnID49IDEgJiYgIUlDTVBfSU5GT1RZUEUoZHAtPmljbXBfdHlwZSkpIHsKKwkJYnAgKz0gODsKKwkJKHZvaWQpcHJpbnRmKCJcblx0Iik7CisJCWlwID0gKHN0cnVjdCBpcCAqKWJwOworCQlzbmFwbGVuID0gc25hcGVuZCAtIGJwOworICAgICAgICAgICAgICAgIHNuYXBlbmRfc2F2ZSA9IHNuYXBlbmQ7CisJCWlwX3ByaW50KGduZG8sIGJwLCBFWFRSQUNUXzE2QklUUygmaXAtPmlwX2xlbikpOworICAgICAgICAgICAgICAgIHNuYXBlbmQgPSBzbmFwZW5kX3NhdmU7CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEF0dGVtcHQgdG8gZGVjb2RlIHRoZSBNUExTIGV4dGVuc2lvbnMgb25seSBmb3Igc29tZSBJQ01QIHR5cGVzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZmbGFnID49IDEgJiYgcGxlbiA+IElDTVBfRVhURF9NSU5MRU4gJiYgSUNNUF9NUExTX0VYVF9UWVBFKGRwLT5pY21wX3R5cGUpKSB7CisKKyAgICAgICAgICAgIFRDSEVDSygqZXh0X2RwKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoZWNrIGZpcnN0IGlmIHRoZSBtcGxzIGV4dGVuc2lvbiBoZWFkZXIgc2hvd3MgYSBub24temVybyBsZW5ndGguCisgICAgICAgICAgICAgKiBJZiB0aGUgbGVuZ3RoIGZpZWxkIGlzIG5vdCBzZXQgdGhlbiBzaWxlbnRseSB2ZXJpZnkgdGhlIGNoZWNrc3VtCisgICAgICAgICAgICAgKiB0byBjaGVjayBpZiBhbiBleHRlbnNpb24gaGVhZGVyIGlzIHByZXNlbnQuIFRoaXMgaXMgZXhwZWRpZW50LAorICAgICAgICAgICAgICogaG93ZXZlciBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBzZXQgdGhlIGxlbmd0aCBmaWVsZCBwcm9wZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghZXh0X2RwLT5pY21wX2xlbmd0aCAmJgorICAgICAgICAgICAgICAgIGluX2Nrc3VtKChjb25zdCB1X3Nob3J0ICopJmV4dF9kcC0+aWNtcF9leHRfdmVyc2lvbl9yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxlbiAtIElDTVBfRVhURF9NSU5MRU4sIDApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmludGYoIlxuXHRNUExTIGV4dGVuc2lvbiB2JXUiLAorICAgICAgICAgICAgICAgICAgIElDTVBfTVBMU19FWFRfRVhUUkFDVF9WRVJTSU9OKCooZXh0X2RwLT5pY21wX2V4dF92ZXJzaW9uX3JlcykpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoSUNNUF9NUExTX0VYVF9FWFRSQUNUX1ZFUlNJT04oKihleHRfZHAtPmljbXBfZXh0X3ZlcnNpb25fcmVzKSkgIT0KKyAgICAgICAgICAgICAgICBJQ01QX01QTFNfRVhUX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiBwYWNrZXQgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGxlbiA9IHBsZW4gLSBJQ01QX0VYVERfTUlOTEVOOworICAgICAgICAgICAgcHJpbnRmKCIsIGNoZWNrc3VtIDB4JTA0eCAoJXNjb3JyZWN0KSwgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhleHRfZHAtPmljbXBfZXh0X2NoZWNrc3VtKSwKKyAgICAgICAgICAgICAgICAgICBpbl9ja3N1bSgoY29uc3QgdV9zaG9ydCAqKSZleHRfZHAtPmljbXBfZXh0X3ZlcnNpb25fcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsZW4gLSBJQ01QX0VYVERfTUlOTEVOLCAwKSA/ICJpbiIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICBobGVuKTsKKworICAgICAgICAgICAgaGxlbiAtPSA0OyAvKiBzdWJ0cmFjdCBjb21tb24gaGVhZGVyIHNpemUgKi8KKyAgICAgICAgICAgIG9ial90cHRyID0gKHVfaW50OF90ICopZXh0X2RwLT5pY21wX2V4dF9kYXRhOworCisgICAgICAgICAgICB3aGlsZSAoaGxlbiA+IHNpemVvZihzdHJ1Y3QgaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyX3QpKSB7CisKKyAgICAgICAgICAgICAgICBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXIgPSAoc3RydWN0IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcl90ICopb2JqX3RwdHI7CisgICAgICAgICAgICAgICAgVENIRUNLKCppY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXIpOworICAgICAgICAgICAgICAgIG9ial90bGVuID0gRVhUUkFDVF8xNkJJVFMoaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyLT5sZW5ndGgpOworICAgICAgICAgICAgICAgIG9ial9jbGFzc19udW0gPSBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXItPmNsYXNzX251bTsKKyAgICAgICAgICAgICAgICBvYmpfY3R5cGUgPSBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXItPmN0eXBlOworICAgICAgICAgICAgICAgIG9ial90cHRyICs9IHNpemVvZihzdHJ1Y3QgaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyX3QpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBPYmplY3QgKCV1KSwgQ2xhc3MtVHlwZTogJXUsIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaWNtcF9tcGxzX2V4dF9vYmpfdmFsdWVzLCJ1bmtub3duIixvYmpfY2xhc3NfbnVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqX2NsYXNzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqX2N0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbik7CisKKyAgICAgICAgICAgICAgICBobGVuLT1zaXplb2Yoc3RydWN0IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcl90KTsgLyogbGVuZ3RoIGZpZWxkIGluY2x1ZGVzIHRsdiBoZWFkZXIgKi8KKworICAgICAgICAgICAgICAgIC8qIGluZmluaXRlIGxvb3AgcHJvdGVjdGlvbiAqLyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKG9ial9jbGFzc19udW0gPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKG9ial90bGVuIDwgc2l6ZW9mKHN0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPXNpemVvZihzdHJ1Y3QgaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyX3QpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChvYmpfY2xhc3NfbnVtKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob2JqX2N0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKm9ial90cHRyLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19sYWJlbCA9IEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBsYWJlbCAldSwgZXhwICV1IiwgTVBMU19MQUJFTChyYXdfbGFiZWwpLCBNUExTX0VYUChyYXdfbGFiZWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNUExTX1NUQUNLKHJhd19sYWJlbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFtTXSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHR0bCAldSIsIE1QTFNfVFRMKHJhd19sYWJlbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEob2JqX3RwdHIsICJcblx0ICAgICIsIG9ial90bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqICBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgb2JqZWN0cyB0aGF0IGxhY2sgYSBkZWNvZGVyCisgICAgICAgICAgICAgICAgKiAgeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEob2JqX3RwdHIsICJcblx0ICAgICIsIG9ial90bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChobGVuIDwgb2JqX3RsZW4pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGhsZW4gLT0gb2JqX3RsZW47CisgICAgICAgICAgICAgICAgb2JqX3RwdHIgKz0gb2JqX3RsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCXJldHVybjsKK3RydW5jOgorCWZwdXRzKCJbfGljbXBdIiwgc3Rkb3V0KTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWljbXA2LmMgYi9wcmludC1pY21wNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pY21wNi5jCkBAIC0wLDAgKzEsMTI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWljbXA2LmMsdiAxLjc5LjIuNiAyMDA1LzA5LzA1IDA5OjI5OjI4IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSU5FVDYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImlwNi5oIgorI2luY2x1ZGUgImljbXA2LmgiCisjaW5jbHVkZSAiaXBwcm90by5oIgorCisjaW5jbHVkZSAidWRwLmgiCisjaW5jbHVkZSAiYWguaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9ydHByZWYodV9pbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9saWZldGltZSh1X2ludDMyX3QpOworc3RhdGljIHZvaWQgcHJpbnRfbGxhZGRyKGNvbnN0IHVfY2hhciAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgaWNtcDZfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgbWxkNl9wcmludChjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCBtbGR2Ml9yZXBvcnRfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKK3N0YXRpYyB2b2lkIG1sZHYyX3F1ZXJ5X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitzdGF0aWMgc3RydWN0IHVkcGhkciAqZ2V0X3VwcGVybGF5ZXIodV9jaGFyICosIHVfaW50ICopOworc3RhdGljIHZvaWQgZG5zbmFtZV9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOworc3RhdGljIHZvaWQgaWNtcDZfbm9kZWluZm9fcHJpbnQodV9pbnQsIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCBpY21wNl9ycmVudW1fcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKKworI2lmbmRlZiBhYnMKKyNkZWZpbmUgYWJzKGEpCSgoMCA8IChhKSkgPyAoYSkgOiAtKGEpKQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyBJQ01QNl9EU1RfVU5SRUFDSCwgImRlc3RpbmF0aW9uIHVucmVhY2hhYmxlIn0sCisgICAgeyBJQ01QNl9QQUNLRVRfVE9PX0JJRywgInBhY2tldCB0b28gYmlnIn0sCisgICAgeyBJQ01QNl9USU1FX0VYQ0VFREVELCAidGltZSBleGNlZWRlZCBpbi10cmFuc2l0In0sCisgICAgeyBJQ01QNl9QQVJBTV9QUk9CLCAicGFyYW1ldGVyIHByb2JsZW0ifSwKKyAgICB7IElDTVA2X0VDSE9fUkVRVUVTVCwgImVjaG8gcmVxdWVzdCJ9LAorICAgIHsgSUNNUDZfRUNIT19SRVBMWSwgImVjaG8gcmVwbHkifSwKKyAgICB7IE1MRDZfTElTVEVORVJfUVVFUlksICJtdWx0aWNhc3QgbGlzdGVuZXIgcXVlcnkifSwKKyAgICB7IE1MRDZfTElTVEVORVJfUkVQT1JULCAibXVsdGljYXN0IGxpc3RlbmVyIHJlcG9ydCJ9LAorICAgIHsgTUxENl9MSVNURU5FUl9ET05FLCAibXVsdGljYXN0IGxpc3RlbmVyIGRvbmUifSwKKyAgICB7IE5EX1JPVVRFUl9TT0xJQ0lULCAicm91dGVyIHNvbGljaXRhdGlvbiJ9LAorICAgIHsgTkRfUk9VVEVSX0FEVkVSVCwgInJvdXRlciBhZHZlcnRpc2VtZW50In0sCisgICAgeyBORF9ORUlHSEJPUl9TT0xJQ0lULCAibmVpZ2hib3Igc29saWNpdGF0aW9uIn0sCisgICAgeyBORF9ORUlHSEJPUl9BRFZFUlQsICJuZWlnaGJvciBhZHZlcnRpc2VtZW50In0sCisgICAgeyBORF9SRURJUkVDVCwgInJlZGlyZWN0In0sCisgICAgeyBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkcsICJyb3V0ZXIgcmVudW1iZXJpbmcifSwKKyAgICB7IElORF9TT0xJQ0lULCAiaW52ZXJzZSBuZWlnaGJvciBzb2xpY2l0YXRpb24ifSwKKyAgICB7IElORF9BRFZFUlQsICJpbnZlcnNlIG5laWdoYm9yIGFkdmVydGlzZW1lbnQifSwKKyAgICB7IE1MRFYyX0xJU1RFTkVSX1JFUE9SVCwgIm11bHRpY2FzdCBsaXN0ZW5lciByZXBvcnQgdjIifSwKKyAgICB7IElDTVA2X0hBRElTQ09WX1JFUVVFU1QsICJoYSBkaXNjb3ZlcnkgcmVxdWVzdCJ9LAorICAgIHsgSUNNUDZfSEFESVNDT1ZfUkVQTFksICJoYSBkaXNjb3ZlcnkgcmVwbHkifSwKKyAgICB7IElDTVA2X01PQklMRVBSRUZJWF9TT0xJQ0lULCAibW9iaWxlIHJvdXRlciBzb2xpY2l0YXRpb24ifSwKKyAgICB7IElDTVA2X01PQklMRVBSRUZJWF9BRFZFUlQsICJtb2JpbGUgcm91dGVyIGFkdmVydGlzZW1lbnQifSwKKyAgICB7IElDTVA2X1dSVVJFUVVFU1QsICJ3aG8tYXJlLXlvdSByZXF1ZXN0In0sCisgICAgeyBJQ01QNl9XUlVSRVBMWSwgIndoby1hcmUteW91IHJlcGx5In0sCisgICAgeyBJQ01QNl9OSV9RVUVSWSwgIm5vZGUgaW5mb3JtYXRpb24gcXVlcnkifSwKKyAgICB7IElDTVA2X05JX1JFUExZLCAibm9kZSBpbmZvcm1hdGlvbiByZXBseSJ9LAorICAgIHsgTUxENl9NVFJBQ0UsICJtdHJhY2UgbWVzc2FnZSJ9LAorICAgIHsgTUxENl9NVFJBQ0VfUkVTUCwgIm10cmFjZSByZXNwb25zZSJ9LAorICAgIHsgMCwJTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBpY21wNl9kc3RfdW5yZWFjaF9jb2RlX3ZhbHVlc1tdID0geworICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSwgInVucmVhY2hhYmxlIHJvdXRlIiB9LAorICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU4sICIgdW5yZWFjaGFibGUgcHJvaGliaXRlZCJ9LAorICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfQkVZT05EU0NPUEUsICJiZXlvbmQgc2NvcGUifSwKKyAgICB7IElDTVA2X0RTVF9VTlJFQUNIX0FERFIsICJ1bnJlYWNoYWJsZSBhZGRyZXNzIn0sCisgICAgeyBJQ01QNl9EU1RfVU5SRUFDSF9OT1BPUlQsICJ1bnJlYWNoYWJsZSBwb3J0In0sCisgICAgeyAwLAlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X29wdF9waV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgTkRfT1BUX1BJX0ZMQUdfT05MSU5LLCAib25saW5rIiB9LAorICAgIHsgTkRfT1BUX1BJX0ZMQUdfQVVUTywgImF1dG8iIH0sCisgICAgeyBORF9PUFRfUElfRkxBR19ST1VURVIsICJyb3V0ZXIiIH0sCisgICAgeyAwLAlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X29wdF9yYV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgTkRfUkFfRkxBR19NQU5BR0VELCAibWFuYWdlZCIgfSwKKyAgICB7IE5EX1JBX0ZMQUdfT1RIRVIsICJvdGhlciBzdGF0ZWZ1bCJ9LAorICAgIHsgTkRfUkFfRkxBR19IT01FX0FHRU5ULCAiaG9tZSBhZ2VudCJ9LAorICAgIHsgMCwJTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBpY21wNl9uZF9uYV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgTkRfTkFfRkxBR19ST1VURVIsICJyb3V0ZXIiIH0sCisgICAgeyBORF9OQV9GTEFHX1NPTElDSVRFRCwgInNvbGljaXRlZCIgfSwKKyAgICB7IE5EX05BX0ZMQUdfT1ZFUlJJREUsICJvdmVycmlkZSIgfSwKKyAgICB7IDAsCU5VTEwgfQorfTsKKworCitzdGF0aWMgc3RydWN0IHRvayBpY21wNl9vcHRfdmFsdWVzW10gPSB7CisgICB7IE5EX09QVF9TT1VSQ0VfTElOS0FERFIsICJzb3VyY2UgbGluay1hZGRyZXNzIn0sCisgICB7IE5EX09QVF9UQVJHRVRfTElOS0FERFIsICJkZXN0aW5hdGlvbiBsaW5rLWFkZHJlc3MifSwKKyAgIHsgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTiwgInByZWZpeCBpbmZvIn0sCisgICB7IE5EX09QVF9SRURJUkVDVEVEX0hFQURFUiwgInJlZGlyZWN0ZWQgaGVhZGVyIn0sCisgICB7IE5EX09QVF9NVFUsICJtdHUifSwKKyAgIHsgTkRfT1BUX0FEVklOVEVSVkFMLCAiYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCJ9LAorICAgeyBORF9PUFRfSE9NRUFHRU5UX0lORk8sICJob21lYWdlbnQgaW5mb3JtYXRpb24ifSwKKyAgIHsgTkRfT1BUX1JPVVRFX0lORk8sICJyb3V0ZSBpbmZvIn0sCisgICB7IDAsCU5VTEwgfQorfTsKKworLyogbWxkdjIgcmVwb3J0IHR5cGVzICovCitzdGF0aWMgc3RydWN0IHRvayBtbGR2MnJlcG9ydDJzdHJbXSA9IHsKKwl7IDEsCSJpc19pbiIgfSwKKwl7IDIsCSJpc19leCIgfSwKKwl7IDMsCSJ0b19pbiIgfSwKKwl7IDQsCSJ0b19leCIgfSwKKwl7IDUsCSJhbGxvdyIgfSwKKwl7IDYsCSJibG9jayIgfSwKKwl7IDAsCU5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X3J0cHJlZih1X2ludCB2KQoreworCXN0YXRpYyBjb25zdCBjaGFyICpydHByZWZfc3RyW10gPSB7CisJCSJtZWRpdW0iLAkJLyogMDAgKi8KKwkJImhpZ2giLAkJCS8qIDAxICovCisJCSJyc3YiLAkJCS8qIDEwICovCisJCSJsb3ciCQkJLyogMTEgKi8KKwl9OworCisJcmV0dXJuIHJ0cHJlZl9zdHJbKCh2ICYgTkRfUkFfRkxBR19SVFBSRUZfTUFTSykgPj4gMykgJiAweGZmXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X2xpZmV0aW1lKHVfaW50MzJfdCB2KQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyMF07CisKKwlpZiAodiA9PSAodV9pbnQzMl90KX4wVUwpCisJCXJldHVybiAiaW5maW5pdHkiOworCWVsc2UgeworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCB2KTsKKwkJcmV0dXJuIGJ1ZjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9sbGFkZHIoY29uc3QgdV9pbnQ4X3QgKnAsIHNpemVfdCBsKQoreworCWNvbnN0IHVfaW50OF90ICplcCwgKnE7CisKKwlxID0gcDsKKwllcCA9IHAgKyBsOworCXdoaWxlIChsID4gMCAmJiBxIDwgZXApIHsKKwkJaWYgKHEgPiBwKQorCQkJcHJpbnRmKCI6Iik7CisJCXByaW50ZigiJTAyeCIsICpxKyspOworCQlsLS07CisJfQorfQorCitzdGF0aWMgaW50IGljbXA2X2Nrc3VtKGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDYsIGNvbnN0IHN0cnVjdCBpY21wNl9oZHIgKmljcCwKKwl1X2ludCBsZW4pCit7CisJc2l6ZV90IGk7CisJcmVnaXN0ZXIgY29uc3QgdV9pbnQxNl90ICpzcDsKKwl1X2ludDMyX3Qgc3VtOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbjZfYWRkciBwaF9zcmM7CisJCQlzdHJ1Y3QgaW42X2FkZHIgcGhfZHN0OworCQkJdV9pbnQzMl90CXBoX2xlbjsKKwkJCXVfaW50OF90CXBoX3plcm9bM107CisJCQl1X2ludDhfdAlwaF9ueHQ7CisJCX0gcGg7CisJCXVfaW50MTZfdCBwYVsyMF07CisJfSBwaHU7CisKKwkvKiBwc2V1ZG8taGVhZGVyICovCisJbWVtc2V0KCZwaHUsIDAsIHNpemVvZihwaHUpKTsKKwlwaHUucGgucGhfc3JjID0gaXA2LT5pcDZfc3JjOworCXBodS5waC5waF9kc3QgPSBpcDYtPmlwNl9kc3Q7CisJcGh1LnBoLnBoX2xlbiA9IGh0b25sKGxlbik7CisJcGh1LnBoLnBoX254dCA9IElQUFJPVE9fSUNNUFY2OworCisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBodS5wYSkgLyBzaXplb2YocGh1LnBhWzBdKTsgaSsrKQorCQlzdW0gKz0gcGh1LnBhW2ldOworCisJc3AgPSAoY29uc3QgdV9pbnQxNl90ICopaWNwOworCisJZm9yIChpID0gMDsgaSA8IChsZW4gJiB+MSk7IGkgKz0gMikKKwkJc3VtICs9ICpzcCsrOworCisJaWYgKGxlbiAmIDEpCisJCXN1bSArPSBodG9ucygoKihjb25zdCB1X2ludDhfdCAqKXNwKSA8PCA4KTsKKworCXdoaWxlIChzdW0gPiAweGZmZmYpCisJCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7CisJc3VtID0gfnN1bSAmIDB4ZmZmZjsKKworCXJldHVybiAoc3VtKTsKK30KKwordm9pZAoraWNtcDZfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLCBjb25zdCB1X2NoYXIgKmJwMiwgaW50IGZyYWdtZW50ZWQpCit7CisJY29uc3Qgc3RydWN0IGljbXA2X2hkciAqZHA7CisJY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwOworCWNvbnN0IHN0cnVjdCBpcDZfaGRyICpvaXA7CisJY29uc3Qgc3RydWN0IHVkcGhkciAqb3VoOworCWludCBkcG9ydDsKKwljb25zdCB1X2NoYXIgKmVwOworCXVfaW50IHByb3Q7CisKKwlkcCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopYnA7CisJaXAgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7CisJb2lwID0gKHN0cnVjdCBpcDZfaGRyICopKGRwICsgMSk7CisJLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KKwllcCA9IHNuYXBlbmQ7CisKKwlUQ0hFQ0soZHAtPmljbXA2X2Nrc3VtKTsKKworCWlmICh2ZmxhZyAmJiAhZnJhZ21lbnRlZCkgeworCQlpbnQgc3VtID0gZHAtPmljbXA2X2Nrc3VtOworCisJCWlmIChUVEVTVDIoYnBbMF0sIGxlbmd0aCkpIHsKKwkJCXN1bSA9IGljbXA2X2Nrc3VtKGlwLCBkcCwgbGVuZ3RoKTsKKwkJCWlmIChzdW0gIT0gMCkKKwkJCQkodm9pZClwcmludGYoIltiYWQgaWNtcDYgY2tzdW0gJXghXSAiLCBzdW0pOworCQkJZWxzZQorCQkJCSh2b2lkKXByaW50ZigiW2ljbXA2IHN1bSBva10gIik7CisJCX0KKwl9CisKKyAgICAgICAgcHJpbnRmKCJJQ01QNiwgJXMiLCB0b2syc3RyKGljbXA2X3R5cGVfdmFsdWVzLCJ1bmtub3duIGljbXA2IHR5cGUgKCV1KSIsZHAtPmljbXA2X3R5cGUpKTsKKworICAgICAgICAvKiBkaXNwbGF5IGNvc21ldGljczogcHJpbnQgdGhlIHBhY2tldCBsZW5ndGggZm9yIHByaW50ZXIgdGhhdCB1c2UgdGhlIHZmbGFnIG5vdyAqLworICAgICAgICBpZiAodmZsYWcgJiYgKGRwLT5pY21wNl90eXBlID09CisgICAgICAgICAgICAgICAgICAgICAgTkRfUk9VVEVSX1NPTElDSVQgfHwKKyAgICAgICAgICAgICAgICAgICAgICBORF9ST1VURVJfQURWRVJUIHx8CisgICAgICAgICAgICAgICAgICAgICAgTkRfTkVJR0hCT1JfQURWRVJUIHx8CisgICAgICAgICAgICAgICAgICAgICAgTkRfTkVJR0hCT1JfU09MSUNJVCB8fAorICAgICAgICAgICAgICAgICAgICAgIE5EX1JFRElSRUNUIHx8CisgICAgICAgICAgICAgICAgICAgICAgSUNNUDZfSEFESVNDT1ZfUkVQTFkgfHwKKyAgICAgICAgICAgICAgICAgICAgICBJQ01QNl9NT0JJTEVQUkVGSVhfQURWRVJUICkpCisgICAgICAgICAgICBwcmludGYoIiwgbGVuZ3RoICV1IiwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKwlzd2l0Y2ggKGRwLT5pY21wNl90eXBlKSB7CisJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSDoKKwkJVENIRUNLKG9pcC0+aXA2X2RzdCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzIiwgdG9rMnN0cihpY21wNl9kc3RfdW5yZWFjaF9jb2RlX3ZhbHVlcywidW5rbm93biB1bnJlYWNoIGNvZGUgKCV1KSIsZHAtPmljbXA2X2NvZGUpKTsKKwkJc3dpdGNoIChkcC0+aWNtcDZfY29kZSkgeworCisJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURTogLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU46CisJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIixpcDZhZGRyX3N0cmluZygmb2lwLT5pcDZfZHN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9CRVlPTkRTQ09QRToKKwkJCXByaW50ZigiICVzLCBzb3VyY2UgYWRkcmVzcyAlcyIsCisJCQkgICAgICAgaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCisJCQkgICAgICAgaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X3NyYykpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgorCQkJaWYgKChvdWggPSBnZXRfdXBwZXJsYXllcigodV9jaGFyICopb2lwLCAmcHJvdCkpCisJCQkgICAgPT0gTlVMTCkKKwkJCQlnb3RvIHRydW5jOworCisJCQlkcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZvdWgtPnVoX2Rwb3J0KTsKKwkJCXN3aXRjaCAocHJvdCkgeworCQkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCQlwcmludGYoIiwgJXMgdGNwIHBvcnQgJXMiLAorCQkJCQlpcDZhZGRyX3N0cmluZygmb2lwLT5pcDZfZHN0KSwKKwkJCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBQUk9UT19VRFA6CisJCQkJcHJpbnRmKCIsICVzIHVkcCBwb3J0ICVzIiwKKwkJCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCisJCQkJCXVkcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiLCAlcyBwcm90b2NvbCAlZCBwb3J0ICVkIHVucmVhY2hhYmxlIiwKKwkJCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCisJCQkJCW9pcC0+aXA2X254dCwgZHBvcnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0IixsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVA2X1BBQ0tFVF9UT09fQklHOgorCQlUQ0hFQ0soZHAtPmljbXA2X210dSk7CisJCXByaW50ZigiLCBtdHUgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X210dSkpOworCQlicmVhazsKKwljYXNlIElDTVA2X1RJTUVfRVhDRUVERUQ6CisJCVRDSEVDSyhvaXAtPmlwNl9kc3QpOworCQlzd2l0Y2ggKGRwLT5pY21wNl9jb2RlKSB7CisJCWNhc2UgSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVDoKKwkJCXByaW50ZigiIGZvciAlcyIsCisJCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCkpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUDZfVElNRV9FWENFRURfUkVBU1NFTUJMWToKKwkJCXByaW50ZigiIChyZWFzc2VtYmx5KSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiwgdW5rbm93biBjb2RlICgldSkiLCBkcC0+aWNtcDZfY29kZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVA2X1BBUkFNX1BST0I6CisJCVRDSEVDSyhvaXAtPmlwNl9kc3QpOworCQlzd2l0Y2ggKGRwLT5pY21wNl9jb2RlKSB7CisJCWNhc2UgSUNNUDZfUEFSQU1QUk9CX0hFQURFUjoKKwkJCXByaW50ZigiLCBlcnJvcm5lb3VzIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVA2X1BBUkFNUFJPQl9ORVhUSEVBREVSOgorCQkJcHJpbnRmKCIsIG5leHQgaGVhZGVyIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKKwkJCWJyZWFrOworCQljYXNlIElDTVA2X1BBUkFNUFJPQl9PUFRJT046CisJCQlwcmludGYoIiwgb3B0aW9uIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCIsIGNvZGUtIyVkIiwKKwkJCSAgICAgICBkcC0+aWNtcDZfY29kZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVA2X0VDSE9fUkVRVUVTVDoKKwljYXNlIElDTVA2X0VDSE9fUkVQTFk6CisJCVRDSEVDSyhkcC0+aWNtcDZfc2VxKTsKKwkJcHJpbnRmKCIsIHNlcSAldSIsIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcDZfc2VxKSk7CisJCWJyZWFrOworCWNhc2UgSUNNUDZfTUVNQkVSU0hJUF9RVUVSWToKKwkJaWYgKGxlbmd0aCA9PSBNTERfTUlOTEVOKSB7CisJCQltbGQ2X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCk7CisJCX0gZWxzZSBpZiAobGVuZ3RoID49IE1MRFYyX01JTkxFTikgeworCQkJcHJpbnRmKCJ2MiAiKTsKKwkJCW1sZHYyX3F1ZXJ5X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCwgbGVuZ3RoKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIHVua25vd24tdmVyc2lvbiAobGVuICV1KSAiLCBsZW5ndGgpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUNNUDZfTUVNQkVSU0hJUF9SRVBPUlQ6CisJCW1sZDZfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwKTsKKwkJYnJlYWs7CisJY2FzZSBJQ01QNl9NRU1CRVJTSElQX1JFRFVDVElPTjoKKwkJbWxkNl9wcmludCgoY29uc3QgdV9jaGFyICopZHApOworCQlicmVhazsKKwljYXNlIE5EX1JPVVRFUl9TT0xJQ0lUOgorI2RlZmluZSBSVFNPTExFTiA4CisJCWlmICh2ZmxhZykgeworCQkJaWNtcDZfb3B0X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCArIFJUU09MTEVOLAorCQkJCQlsZW5ndGggLSBSVFNPTExFTik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBORF9ST1VURVJfQURWRVJUOgorI2RlZmluZSBSVEFEVkxFTiAxNgorCQlpZiAodmZsYWcpIHsKKwkJCXN0cnVjdCBuZF9yb3V0ZXJfYWR2ZXJ0ICpwOworCisJCQlwID0gKHN0cnVjdCBuZF9yb3V0ZXJfYWR2ZXJ0ICopZHA7CisJCQlUQ0hFQ0socC0+bmRfcmFfcmV0cmFuc21pdCk7CisJCQlwcmludGYoIlxuXHRob3AgbGltaXQgJXUsIEZsYWdzIFslc10iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmICVzLCByb3V0ZXIgbGlmZXRpbWUgJXVzLCByZWFjaGFibGUgdGltZSAldXMsIHJldHJhbnMgdGltZSAldXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2ludClwLT5uZF9yYV9jdXJob3BsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGljbXA2X29wdF9yYV9mbGFnX3ZhbHVlcywibm9uZSIsKHAtPm5kX3JhX2ZsYWdzX3Jlc2VydmVkKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3J0cHJlZihwLT5uZF9yYV9mbGFnc19yZXNlcnZlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnAtPm5kX3JhX3JvdXRlcl9saWZldGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnAtPm5kX3JhX3JlYWNoYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnAtPm5kX3JhX3JldHJhbnNtaXQpKTsKKworCQkJaWNtcDZfb3B0X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCArIFJUQURWTEVOLAorCQkJCQlsZW5ndGggLSBSVEFEVkxFTik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBORF9ORUlHSEJPUl9TT0xJQ0lUOgorCSAgICB7CisJCXN0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICpwOworCQlwID0gKHN0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICopZHA7CisJCVRDSEVDSyhwLT5uZF9uc190YXJnZXQpOworCQlwcmludGYoIiwgd2hvIGhhcyAlcyIsIGlwNmFkZHJfc3RyaW5nKCZwLT5uZF9uc190YXJnZXQpKTsKKwkJaWYgKHZmbGFnKSB7CisjZGVmaW5lIE5EU09MTEVOIDI0CisJCQlpY21wNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgTkRTT0xMRU4sCisJCQkJCWxlbmd0aCAtIE5EU09MTEVOKTsKKwkJfQorCSAgICB9CisJCWJyZWFrOworCWNhc2UgTkRfTkVJR0hCT1JfQURWRVJUOgorCSAgICB7CisJCXN0cnVjdCBuZF9uZWlnaGJvcl9hZHZlcnQgKnA7CisKKwkJcCA9IChzdHJ1Y3QgbmRfbmVpZ2hib3JfYWR2ZXJ0ICopZHA7CisJCVRDSEVDSyhwLT5uZF9uYV90YXJnZXQpOworCQlwcmludGYoIiwgdGd0IGlzICVzIiwKKwkJCWlwNmFkZHJfc3RyaW5nKCZwLT5uZF9uYV90YXJnZXQpKTsKKwkJaWYgKHZmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihpY21wNl9uZF9uYV9mbGFnX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZwLT5uZF9uYV9mbGFnc19yZXNlcnZlZCkpKTsKKyNkZWZpbmUgTkRBRFZMRU4gMjQKKwkJCWljbXA2X29wdF9wcmludCgoY29uc3QgdV9jaGFyICopZHAgKyBOREFEVkxFTiwKKwkJCQkJbGVuZ3RoIC0gTkRBRFZMRU4pOworI3VuZGVmIE5EQURWTEVOCisJCX0KKwkgICAgfQorCQlicmVhazsKKwljYXNlIE5EX1JFRElSRUNUOgorI2RlZmluZSBSRFIoaSkgKChzdHJ1Y3QgbmRfcmVkaXJlY3QgKikoaSkpCisJCVRDSEVDSyhSRFIoZHApLT5uZF9yZF9kc3QpOworCQlwcmludGYoIiwgJXMiLCBnZXRuYW1lNigoY29uc3QgdV9jaGFyICopJlJEUihkcCktPm5kX3JkX2RzdCkpOworCQlUQ0hFQ0soUkRSKGRwKS0+bmRfcmRfdGFyZ2V0KTsKKwkJcHJpbnRmKCIgdG8gJXMiLAorCQkgICAgZ2V0bmFtZTYoKGNvbnN0IHVfY2hhciopJlJEUihkcCktPm5kX3JkX3RhcmdldCkpOworI2RlZmluZSBSRURJUkVDVExFTiA0MAorCQlpZiAodmZsYWcpIHsKKwkJCWljbXA2X29wdF9wcmludCgoY29uc3QgdV9jaGFyICopZHAgKyBSRURJUkVDVExFTiwKKwkJCQkJbGVuZ3RoIC0gUkVESVJFQ1RMRU4pOworCQl9CisJCWJyZWFrOworI3VuZGVmIFJFRElSRUNUTEVOCisjdW5kZWYgUkRSCisJY2FzZSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkc6CisJCWljbXA2X3JyZW51bV9wcmludChicCwgZXApOworCQlicmVhazsKKwljYXNlIElDTVA2X05JX1FVRVJZOgorCWNhc2UgSUNNUDZfTklfUkVQTFk6CisJCWljbXA2X25vZGVpbmZvX3ByaW50KGxlbmd0aCwgYnAsIGVwKTsKKwkJYnJlYWs7CisJY2FzZSBJTkRfU09MSUNJVDoKKwljYXNlIElORF9BRFZFUlQ6CisJCWJyZWFrOworCWNhc2UgSUNNUDZfVjJfTUVNQkVSU0hJUF9SRVBPUlQ6CisJCW1sZHYyX3JlcG9ydF9wcmludCgoY29uc3QgdV9jaGFyICopIGRwLCBsZW5ndGgpOworCQlicmVhazsKKwljYXNlIElDTVA2X01PQklMRVBSRUZJWF9TT0xJQ0lUOiAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIElDTVA2X0hBRElTQ09WX1JFUVVFU1Q6CisgICAgICAgICAgICAgICAgVENIRUNLKGRwLT5pY21wNl9kYXRhMTZbMF0pOworICAgICAgICAgICAgICAgIHByaW50ZigiLCBpZCAweCUwNHgiLCBFWFRSQUNUXzE2QklUUygmZHAtPmljbXA2X2RhdGExNlswXSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgSUNNUDZfSEFESVNDT1ZfUkVQTFk6CisJCWlmICh2ZmxhZykgeworCQkJc3RydWN0IGluNl9hZGRyICppbjY7CisJCQl1X2NoYXIgKmNwOworCisJCQlUQ0hFQ0soZHAtPmljbXA2X2RhdGExNlswXSk7CisJCQlwcmludGYoIiwgaWQgMHglMDR4IiwgRVhUUkFDVF8xNkJJVFMoJmRwLT5pY21wNl9kYXRhMTZbMF0pKTsKKwkJCWNwID0gKHVfY2hhciAqKWRwICsgbGVuZ3RoOworCQkJaW42ID0gKHN0cnVjdCBpbjZfYWRkciAqKShkcCArIDEpOworCQkJZm9yICg7ICh1X2NoYXIgKilpbjYgPCBjcDsgaW42KyspIHsKKwkJCQlUQ0hFQ0soKmluNik7CisJCQkJcHJpbnRmKCIsICVzIiwgaXA2YWRkcl9zdHJpbmcoaW42KSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ01QNl9NT0JJTEVQUkVGSVhfQURWRVJUOgorCQlpZiAodmZsYWcpIHsKKwkJCVRDSEVDSyhkcC0+aWNtcDZfZGF0YTE2WzBdKTsKKwkJCXByaW50ZigiLCBpZCAweCUwNHgiLCBFWFRSQUNUXzE2QklUUygmZHAtPmljbXA2X2RhdGExNlswXSkpOworCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweGMwKQorCQkJCXByaW50ZigiICIpOworCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweDgwKQorCQkJCXByaW50ZigiTSIpOworCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweDQwKQorCQkJCXByaW50ZigiTyIpOworI2RlZmluZSBNUEFEVkxFTiA4CisJCQlpY21wNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgTVBBRFZMRU4sCisJCQkJCWxlbmd0aCAtIE1QQURWTEVOKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ZigiLCBsZW5ndGggJXUiLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoYnAsIlxuXHQiLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXZmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsIGxlbmd0aCk7IAorCXJldHVybjsKK3RydW5jOgorCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRwaGRyICoKK2dldF91cHBlcmxheWVyKHVfY2hhciAqYnAsIHVfaW50ICpwcm90KQoreworCWNvbnN0IHVfY2hhciAqZXA7CisJc3RydWN0IGlwNl9oZHIgKmlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwOworCXN0cnVjdCB1ZHBoZHIgKnVoOworCXN0cnVjdCBpcDZfaGJoICpoYmg7CisJc3RydWN0IGlwNl9mcmFnICpmcmFnaDsKKwlzdHJ1Y3QgYWggKmFoOworCXVfaW50IG5oOworCWludCBobGVuOworCisJLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KKwllcCA9IHNuYXBlbmQ7CisKKwlpZiAoIVRURVNUKGlwNi0+aXA2X254dCkpCisJCXJldHVybiBOVUxMOworCisJbmggPSBpcDYtPmlwNl9ueHQ7CisJaGxlbiA9IHNpemVvZihzdHJ1Y3QgaXA2X2hkcik7CisKKwl3aGlsZSAoYnAgPCBlcCkgeworCQlicCArPSBobGVuOworCisJCXN3aXRjaChuaCkgeworCQljYXNlIElQUFJPVE9fVURQOgorCQljYXNlIElQUFJPVE9fVENQOgorCQkJdWggPSAoc3RydWN0IHVkcGhkciAqKWJwOworCQkJaWYgKFRURVNUKHVoLT51aF9kcG9ydCkpIHsKKwkJCQkqcHJvdCA9IG5oOworCQkJCXJldHVybih1aCk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuKE5VTEwpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCisJCWNhc2UgSVBQUk9UT19IT1BPUFRTOgorCQljYXNlIElQUFJPVE9fRFNUT1BUUzoKKwkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CisJCQloYmggPSAoc3RydWN0IGlwNl9oYmggKilicDsKKwkJCWlmICghVFRFU1QoaGJoLT5pcDZoX2xlbikpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJbmggPSBoYmgtPmlwNmhfbnh0OworCQkJaGxlbiA9IChoYmgtPmlwNmhfbGVuICsgMSkgPDwgMzsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBQUk9UT19GUkFHTUVOVDogLyogdGhpcyBzaG91bGQgYmUgb2RkLCBidXQgdHJ5IGFueXdheSAqLworCQkJZnJhZ2ggPSAoc3RydWN0IGlwNl9mcmFnICopYnA7CisJCQlpZiAoIVRURVNUKGZyYWdoLT5pcDZmX29mZmxnKSkKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQkvKiBmcmFnbWVudHMgd2l0aCBub24temVybyBvZmZzZXQgYXJlIG1lYW5pbmdsZXNzICovCisJCQlpZiAoKEVYVFJBQ1RfMTZCSVRTKCZmcmFnaC0+aXA2Zl9vZmZsZykgJiBJUDZGX09GRl9NQVNLKSAhPSAwKQorCQkJCXJldHVybihOVUxMKTsKKwkJCW5oID0gZnJhZ2gtPmlwNmZfbnh0OworCQkJaGxlbiA9IHNpemVvZihzdHJ1Y3QgaXA2X2ZyYWcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFBST1RPX0FIOgorCQkJYWggPSAoc3RydWN0IGFoICopYnA7CisJCQlpZiAoIVRURVNUKGFoLT5haF9sZW4pKQorCQkJCXJldHVybihOVUxMKTsKKwkJCW5oID0gYWgtPmFoX254dDsKKwkJCWhsZW4gPSAoYWgtPmFoX2xlbiArIDIpIDw8IDI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgkvKiB1bmtub3duIG9yIHVuZGVjb2RhYmxlIGhlYWRlciAqLworCQkJKnByb3QgPSBuaDsgLyogbWVhbmluZ2xlc3MsIGJ1dCBzZXQgaGVyZSBhbnl3YXkgKi8KKwkJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKworCXJldHVybihOVUxMKTsJCS8qIHNob3VsZCBiZSBub3RyZWFjaGVkLCB0aG91Z2ggKi8KK30KKworc3RhdGljIHZvaWQKK2ljbXA2X29wdF9wcmludChjb25zdCB1X2NoYXIgKmJwLCBpbnQgcmVzaWQpCit7CisJY29uc3Qgc3RydWN0IG5kX29wdF9oZHIgKm9wOworCWNvbnN0IHN0cnVjdCBuZF9vcHRfaGRyICpvcGw7CS8qIHdoeSB0aGVyZSdzIG5vIHN0cnVjdD8gKi8KKwljb25zdCBzdHJ1Y3QgbmRfb3B0X3ByZWZpeF9pbmZvICpvcHA7CisJY29uc3Qgc3RydWN0IGljbXA2X29wdHNfcmVkaXJlY3QgKm9wcjsKKwljb25zdCBzdHJ1Y3QgbmRfb3B0X210dSAqb3BtOworCWNvbnN0IHN0cnVjdCBuZF9vcHRfYWR2aW50ZXJ2YWwgKm9wYTsKKwljb25zdCBzdHJ1Y3QgbmRfb3B0X2hvbWVhZ2VudF9pbmZvICpvcGg7CisJY29uc3Qgc3RydWN0IG5kX29wdF9yb3V0ZV9pbmZvICpvcHJpOworCWNvbnN0IHVfY2hhciAqY3AsICplcDsKKwlzdHJ1Y3QgaW42X2FkZHIgaW42LCAqaW42cDsKKwlzaXplX3QgbDsKKworI2RlZmluZSBFQ0hFQ0sodmFyKSBpZiAoKHVfY2hhciAqKSYodmFyKSA+IGVwIC0gc2l6ZW9mKHZhcikpIHJldHVybgorCisJY3AgPSBicDsKKwkvKiAnZXAnIHBvaW50cyB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSBkYXRhLiAqLworCWVwID0gc25hcGVuZDsKKworCXdoaWxlIChjcCA8IGVwKSB7CisJCW9wID0gKHN0cnVjdCBuZF9vcHRfaGRyICopY3A7CisKKwkJRUNIRUNLKG9wLT5uZF9vcHRfbGVuKTsKKwkJaWYgKHJlc2lkIDw9IDApCisJCQlyZXR1cm47CisJCWlmIChvcC0+bmRfb3B0X2xlbiA9PSAwKQorCQkJZ290byB0cnVuYzsKKwkJaWYgKGNwICsgKG9wLT5uZF9vcHRfbGVuIDw8IDMpID4gZXApCisJCQlnb3RvIHRydW5jOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBvcHRpb24gKCV1KSwgbGVuZ3RoICV1ICgldSk6ICIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaWNtcDZfb3B0X3ZhbHVlcywgInVua25vd24iLCBvcC0+bmRfb3B0X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICBvcC0+bmRfb3B0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZF9vcHRfbGVuIDw8IDMsCisgICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZF9vcHRfbGVuKTsKKworCQlzd2l0Y2ggKG9wLT5uZF9vcHRfdHlwZSkgeworCQljYXNlIE5EX09QVF9TT1VSQ0VfTElOS0FERFI6CisJCQlvcGwgPSAoc3RydWN0IG5kX29wdF9oZHIgKilvcDsKKwkJCWwgPSAob3AtPm5kX29wdF9sZW4gPDwgMykgLSAyOworCQkJcHJpbnRfbGxhZGRyKGNwICsgMiwgbCk7CisJCQlicmVhazsKKwkJY2FzZSBORF9PUFRfVEFSR0VUX0xJTktBRERSOgorCQkJb3BsID0gKHN0cnVjdCBuZF9vcHRfaGRyICopb3A7CisJCQlsID0gKG9wLT5uZF9vcHRfbGVuIDw8IDMpIC0gMjsKKwkJCXByaW50X2xsYWRkcihjcCArIDIsIGwpOworCQkJYnJlYWs7CisJCWNhc2UgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTjoKKwkJCW9wcCA9IChzdHJ1Y3QgbmRfb3B0X3ByZWZpeF9pbmZvICopb3A7CisJCQlUQ0hFQ0sob3BwLT5uZF9vcHRfcGlfcHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMvJXUlcywgRmxhZ3MgWyVzXSwgdmFsaWQgdGltZSAlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKCZvcHAtPm5kX29wdF9waV9wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcC0+bmRfb3B0X3BpX3ByZWZpeF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wLT5uZF9vcHRfbGVuICE9IDQpID8gImJhZGxlbiIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGljbXA2X29wdF9waV9mbGFnX3ZhbHVlcywgIm5vbmUiLCBvcHAtPm5kX29wdF9waV9mbGFnc19yZXNlcnZlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHAtPm5kX29wdF9waV92YWxpZF90aW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHByZWYuIHRpbWUgJXNzIiwgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHAtPm5kX29wdF9waV9wcmVmZXJyZWRfdGltZSkpKTsKKwkJCWJyZWFrOworCQljYXNlIE5EX09QVF9SRURJUkVDVEVEX0hFQURFUjoKKwkJCW9wciA9IChzdHJ1Y3QgaWNtcDZfb3B0c19yZWRpcmVjdCAqKW9wOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0ICAgICIsb3AtPm5kX29wdF9sZW48PDMpOworCQkJLyogeHh4ICovCisJCQlicmVhazsKKwkJY2FzZSBORF9PUFRfTVRVOgorCQkJb3BtID0gKHN0cnVjdCBuZF9vcHRfbXR1ICopb3A7CisJCQlUQ0hFQ0sob3BtLT5uZF9vcHRfbXR1X210dSk7CisJCQlwcmludGYoIiAldSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmb3BtLT5uZF9vcHRfbXR1X210dSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wLT5uZF9vcHRfbGVuICE9IDEpID8gImJhZCBvcHRpb24gbGVuZ3RoIiA6ICIiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJY2FzZSBORF9PUFRfQURWSU5URVJWQUw6CisJCQlvcGEgPSAoc3RydWN0IG5kX29wdF9hZHZpbnRlcnZhbCAqKW9wOworCQkJVENIRUNLKG9wYS0+bmRfb3B0X2Fkdl9pbnRlcnZhbCk7CisJCQlwcmludGYoIiAldXMiLCBFWFRSQUNUXzMyQklUUygmb3BhLT5uZF9vcHRfYWR2X2ludGVydmFsKSk7CisJCQlicmVhazsKKwkJY2FzZSBORF9PUFRfSE9NRUFHRU5UX0lORk86CisJCQlvcGggPSAoc3RydWN0IG5kX29wdF9ob21lYWdlbnRfaW5mbyAqKW9wOworCQkJVENIRUNLKG9waC0+bmRfb3B0X2hhaV9saWZldGltZSk7CisJCQlwcmludGYoIiBwcmVmZXJlbmNlICV1LCBsaWZldGltZSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJm9waC0+bmRfb3B0X2hhaV9wcmVmZXJlbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmb3BoLT5uZF9vcHRfaGFpX2xpZmV0aW1lKSk7CisJCQlicmVhazsKKwkJY2FzZSBORF9PUFRfUk9VVEVfSU5GTzoKKwkJCW9wcmkgPSAoc3RydWN0IG5kX29wdF9yb3V0ZV9pbmZvICopb3A7CisJCQlUQ0hFQ0sob3ByaS0+bmRfb3B0X3J0aV9saWZldGltZSk7CisJCQltZW1zZXQoJmluNiwgMCwgc2l6ZW9mKGluNikpOworCQkJaW42cCA9IChzdHJ1Y3QgaW42X2FkZHIgKikob3ByaSArIDEpOworCQkJc3dpdGNoIChvcC0+bmRfb3B0X2xlbikgeworCQkJY2FzZSAxOgorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCVRDSEVDSzIoKmluNnAsIDgpOworCQkJCW1lbWNweSgmaW42LCBvcHJpICsgMSwgOCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJVENIRUNLKCppbjZwKTsKKwkJCQltZW1jcHkoJmluNiwgb3ByaSArIDEsIHNpemVvZihpbjYpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byB0cnVuYzsKKwkJCX0KKwkJCXByaW50ZigiICVzLyV1IiwgaXA2YWRkcl9zdHJpbmcoJmluNiksCisJCQkgICAgb3ByaS0+bmRfb3B0X3J0aV9wcmVmaXhsZW4pOworCQkJcHJpbnRmKCIsIHByZWY9JXMiLCBnZXRfcnRwcmVmKG9wcmktPm5kX29wdF9ydGlfZmxhZ3MpKTsKKwkJCXByaW50ZigiLCBsaWZldGltZT0lcyIsCisJCQkgICAgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHJpLT5uZF9vcHRfcnRpX2xpZmV0aW1lKSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShjcCsyLCJcblx0ICAiLCAob3AtPm5kX29wdF9sZW4gPDwgMykgLSAyKTsgLyogc2tpcCBvcHRpb24gaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsIGhleGR1bXAgPyAqLworICAgICAgICAgICAgICAgIGlmICh2ZmxhZz4gMSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGNwKzIsIlxuXHQgICAgIiwgKG9wLT5uZF9vcHRfbGVuIDw8IDMpIC0gMik7IC8qIHNraXAgb3B0aW9uIGhlYWRlciAqLworCisJCWNwICs9IG9wLT5uZF9vcHRfbGVuIDw8IDM7CisJCXJlc2lkIC09IG9wLT5uZF9vcHRfbGVuIDw8IDM7CisJfQorCXJldHVybjsKKworIHRydW5jOgorCWZwdXRzKCJbbmRwIG9wdF0iLCBzdGRvdXQpOworCXJldHVybjsKKyN1bmRlZiBFQ0hFQ0sKK30KKworc3RhdGljIHZvaWQKK21sZDZfcHJpbnQoY29uc3QgdV9jaGFyICpicCkKK3sKKwlzdHJ1Y3QgbWxkNl9oZHIgKm1wID0gKHN0cnVjdCBtbGQ2X2hkciAqKWJwOworCWNvbnN0IHVfY2hhciAqZXA7CisKKwkvKiAnZXAnIHBvaW50cyB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSBkYXRhLiAqLworCWVwID0gc25hcGVuZDsKKworCWlmICgodV9jaGFyICopbXAgKyBzaXplb2YoKm1wKSA+IGVwKQorCQlyZXR1cm47CisKKwlwcmludGYoIm1heCByZXNwIGRlbGF5OiAlZCAiLCBFWFRSQUNUXzE2QklUUygmbXAtPm1sZDZfbWF4ZGVsYXkpKTsKKwlwcmludGYoImFkZHI6ICVzIiwgaXA2YWRkcl9zdHJpbmcoJm1wLT5tbGQ2X2FkZHIpKTsKK30KKworc3RhdGljIHZvaWQKK21sZHYyX3JlcG9ydF9wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW4pCit7CisgICAgc3RydWN0IGljbXA2X2hkciAqaWNwID0gKHN0cnVjdCBpY21wNl9oZHIgKikgYnA7CisgICAgdV9pbnQgZ3JvdXAsIG5zcmNzLCBuZ3JvdXBzOworICAgIHVfaW50IGksIGo7CisKKyAgICAvKiBNaW5pbXVtIGxlbiBpcyA4ICovCisgICAgaWYgKGxlbiA8IDgpIHsKKwlwcmludGYoIiBbaW52YWxpZCBsZW4gJWRdIiwgbGVuKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgVENIRUNLKGljcC0+aWNtcDZfZGF0YTE2WzFdKTsKKyAgICBuZ3JvdXBzID0gbnRvaHMoaWNwLT5pY21wNl9kYXRhMTZbMV0pOworICAgIHByaW50ZigiLCAlZCBncm91cCByZWNvcmQocykiLCBuZ3JvdXBzKTsKKyAgICBpZiAodmZsYWcgPiAwKSB7CisJLyogUHJpbnQgdGhlIGdyb3VwIHJlY29yZHMgKi8KKwlncm91cCA9IDg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkgICAgLyogdHlwZSgxKSArIGF1eGxlbigxKSArIG51bXNyYygyKSArIGdycCgxNikgKi8KKwkgICAgaWYgKGxlbiA8IGdyb3VwICsgMjApIHsKKwkJcHJpbnRmKCIgW2ludmFsaWQgbnVtYmVyIG9mIGdyb3Vwc10iKTsKKwkJcmV0dXJuOworCSAgICB9CisgICAgICAgICAgICBUQ0hFQ0syKGJwW2dyb3VwICsgNF0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgICAgICAgICAgIHByaW50ZigiIFtnYWRkciAlcyIsIGlwNmFkZHJfc3RyaW5nKCZicFtncm91cCArIDRdKSk7CisJICAgIHByaW50ZigiICVzIiwgdG9rMnN0cihtbGR2MnJlcG9ydDJzdHIsICIgW3YyLXJlcG9ydC0jJWRdIiwKKwkJCQkJCQkJYnBbZ3JvdXBdKSk7CisgICAgICAgICAgICBuc3JjcyA9IChicFtncm91cCArIDJdIDw8IDgpICsgYnBbZ3JvdXAgKyAzXTsKKwkgICAgLyogQ2hlY2sgdGhlIG51bWJlciBvZiBzb3VyY2VzIGFuZCBwcmludCB0aGVtICovCisJICAgIGlmIChsZW4gPCBncm91cCArIDIwICsgKG5zcmNzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7CisJCXByaW50ZigiIFtpbnZhbGlkIG51bWJlciBvZiBzb3VyY2VzICVkXSIsIG5zcmNzKTsKKwkJcmV0dXJuOworCSAgICB9CisgICAgICAgICAgICBpZiAodmZsYWcgPT0gMSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOworICAgICAgICAgICAgZWxzZSB7CisJCS8qIFByaW50IHRoZSBzb3VyY2VzICovCisgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIgeyIpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuc3JjczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoYnBbZ3JvdXAgKyAyMCArIGogKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkgICAgcHJpbnRmKCIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbZ3JvdXAgKyAyMCArIGogKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKV0pKTsKKwkJfQorICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiIH0iKTsKKyAgICAgICAgICAgIH0KKwkgICAgLyogTmV4dCBncm91cCByZWNvcmQgKi8KKyAgICAgICAgICAgIGdyb3VwICs9IDIwICsgbnNyY3MgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkgICAgcHJpbnRmKCJdIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgKHZvaWQpcHJpbnRmKCJbfGljbXA2XSIpOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK21sZHYyX3F1ZXJ5X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbikKK3sKKyAgICBzdHJ1Y3QgaWNtcDZfaGRyICppY3AgPSAoc3RydWN0IGljbXA2X2hkciAqKSBicDsKKyAgICB1X2ludCBtcmM7CisgICAgaW50IG1ydCwgcXFpOworICAgIHVfaW50IG5zcmNzOworICAgIHJlZ2lzdGVyIHVfaW50IGk7CisKKyAgICAvKiBNaW5pbXVtIGxlbiBpcyAyOCAqLworICAgIGlmIChsZW4gPCAyOCkgeworCXByaW50ZigiIFtpbnZhbGlkIGxlbiAlZF0iLCBsZW4pOworCXJldHVybjsKKyAgICB9CisgICAgVENIRUNLKGljcC0+aWNtcDZfZGF0YTE2WzBdKTsKKyAgICBtcmMgPSBudG9ocyhpY3AtPmljbXA2X2RhdGExNlswXSk7CisgICAgaWYgKG1yYyA8IDMyNzY4KSB7CisJbXJ0ID0gbXJjOworICAgIH0gZWxzZSB7CisgICAgICAgIG1ydCA9ICgobXJjICYgMHgwZmZmKSB8IDB4MTAwMCkgPDwgKCgobXJjICYgMHg3MDAwKSA+PiAxMikgKyAzKTsKKyAgICB9CisgICAgaWYgKHZmbGFnKSB7CisJKHZvaWQpcHJpbnRmKCIgW21heCByZXNwIGRlbGF5PSVkXSIsIG1ydCk7CisgICAgfQorICAgIFRDSEVDSzIoYnBbOF0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgICBwcmludGYoIiBbZ2FkZHIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbOF0pKTsKKworICAgIGlmICh2ZmxhZykgeworICAgICAgICBUQ0hFQ0soYnBbMjVdKTsKKwlpZiAoYnBbMjRdICYgMHgwOCkgeworCQlwcmludGYoIiBzZmxhZyIpOworCX0KKwlpZiAoYnBbMjRdICYgMHgwNykgeworCQlwcmludGYoIiByb2J1c3RuZXNzPSVkIiwgYnBbMjRdICYgMHgwNyk7CisJfQorCWlmIChicFsyNV0gPCAxMjgpIHsKKwkJcXFpID0gYnBbMjVdOworCX0gZWxzZSB7CisJCXFxaSA9ICgoYnBbMjVdICYgMHgwZikgfCAweDEwKSA8PCAoKChicFsyNV0gJiAweDcwKSA+PiA0KSArIDMpOworCX0KKwlwcmludGYoIiBxcWk9JWQiLCBxcWkpOworICAgIH0KKworICAgIFRDSEVDSzIoYnBbMjZdLCAyKTsKKyAgICBuc3JjcyA9IG50b2hzKCoodV9zaG9ydCAqKSZicFsyNl0pOworICAgIGlmIChuc3JjcyA+IDApIHsKKwlpZiAobGVuIDwgMjggKyBuc3JjcyAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQorCSAgICBwcmludGYoIiBbaW52YWxpZCBudW1iZXIgb2Ygc291cmNlc10iKTsKKwllbHNlIGlmICh2ZmxhZyA+IDEpIHsKKwkgICAgcHJpbnRmKCIgeyIpOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbnNyY3M7IGkrKykgeworCQlUQ0hFQ0syKGJwWzI4ICsgaSAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcHJpbnRmKCIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbMjggKyBpICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcildKSk7CisJICAgIH0KKwkgICAgcHJpbnRmKCIgfSIpOworCX0gZWxzZQorCSAgICBwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOworICAgIH0KKyAgICBwcmludGYoIl0iKTsKKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICAodm9pZClwcmludGYoIlt8aWNtcDZdIik7CisgICAgcmV0dXJuOworfQorCit2b2lkCitkbnNuYW1lX3ByaW50KGNvbnN0IHVfY2hhciAqY3AsIGNvbnN0IHVfY2hhciAqZXApCit7CisJaW50IGk7CisKKwkvKiBETlMgbmFtZSBkZWNvZGluZyAtIG5vIGRlY29tcHJlc3Npb24gKi8KKwlwcmludGYoIiwgXCIiKTsKKwl3aGlsZSAoY3AgPCBlcCkgeworCQlpID0gKmNwKys7CisJCWlmIChpKSB7CisJCQlpZiAoaSA+IGVwIC0gY3ApIHsKKwkJCQlwcmludGYoIj8/PyIpOworCQkJCWJyZWFrOworCQkJfQorCQkJd2hpbGUgKGktLSAmJiBjcCA8IGVwKSB7CisJCQkJc2FmZXB1dGNoYXIoKmNwKTsKKwkJCQljcCsrOworCQkJfQorCQkJaWYgKGNwICsgMSA8IGVwICYmICpjcCkKKwkJCQlwcmludGYoIi4iKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjcCA9PSBlcCkgeworCQkJCS8qIEZRRE4gKi8KKwkJCQlwcmludGYoIi4iKTsKKwkJCX0gZWxzZSBpZiAoY3AgKyAxID09IGVwICYmICpjcCA9PSAnXDAnKSB7CisJCQkJLyogdHJ1bmNhdGVkICovCisJCQl9IGVsc2UgeworCQkJCS8qIGludmFsaWQgKi8KKwkJCQlwcmludGYoIj8/PyIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRmKCJcIiIpOworfQorCitzdGF0aWMgdm9pZAoraWNtcDZfbm9kZWluZm9fcHJpbnQodV9pbnQgaWNtcDZsZW4sIGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IHVfY2hhciAqZXApCit7CisJc3RydWN0IGljbXA2X25vZGVpbmZvICpuaTY7CisJc3RydWN0IGljbXA2X2hkciAqZHA7CisJY29uc3QgdV9jaGFyICpjcDsKKwlzaXplX3Qgc2l6LCBpOworCWludCBuZWVkY29tbWE7CisKKwlpZiAoZXAgPCBicCkKKwkJcmV0dXJuOworCWRwID0gKHN0cnVjdCBpY21wNl9oZHIgKilicDsKKwluaTYgPSAoc3RydWN0IGljbXA2X25vZGVpbmZvICopYnA7CisJc2l6ID0gZXAgLSBicDsKKworCXN3aXRjaCAobmk2LT5uaV90eXBlKSB7CisJY2FzZSBJQ01QNl9OSV9RVUVSWToKKwkJaWYgKHNpeiA9PSBzaXplb2YoKmRwKSArIDQpIHsKKwkJCS8qIEtBTUUgd2hvLWFyZS15b3UgKi8KKwkJCXByaW50ZigiIHdoby1hcmUteW91IHJlcXVlc3QiKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ZigiIG5vZGUgaW5mb3JtYXRpb24gcXVlcnkiKTsKKworCQlUQ0hFQ0syKCpkcCwgc2l6ZW9mKCpuaTYpKTsKKwkJbmk2ID0gKHN0cnVjdCBpY21wNl9ub2RlaW5mbyAqKWRwOworCQlwcmludGYoIiAoIik7CS8qKSovCisJCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJm5pNi0+bmlfcXR5cGUpKSB7CisJCWNhc2UgTklfUVRZUEVfTk9PUDoKKwkJCXByaW50Zigibm9vcCIpOworCQkJYnJlYWs7CisJCWNhc2UgTklfUVRZUEVfU1VQVFlQRVM6CisJCQlwcmludGYoInN1cHBvcnRlZCBxdHlwZXMiKTsKKwkJCWkgPSBFWFRSQUNUXzE2QklUUygmbmk2LT5uaV9mbGFncyk7CisJCQlpZiAoaSkKKwkJCQlwcmludGYoIiBbJXNdIiwgKGkgJiAweDAxKSA/ICJDIiA6ICIiKTsKKwkJCWJyZWFrOworCQkJYnJlYWs7CisJCWNhc2UgTklfUVRZUEVfRlFETjoKKwkJCXByaW50ZigiRE5TIG5hbWUiKTsKKwkJCWJyZWFrOworCQljYXNlIE5JX1FUWVBFX05PREVBRERSOgorCQkJcHJpbnRmKCJub2RlIGFkZHJlc3NlcyIpOworCQkJaSA9IG5pNi0+bmlfZmxhZ3M7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCQkvKiBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFIHVuZGVmaW5lZCBmb3IgcXVlcnkgKi8KKwkJCXByaW50ZigiIFslcyVzJXMlcyVzJXNdIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQU5ZQ0FTVCkgPyAiYSIgOiAiIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMKSA/ICJHIiA6ICIiLAorCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwpID8gIlMiIDogIiIsCisJCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTCkgPyAiTCIgOiAiIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQ09NUEFUKSA/ICJDIiA6ICIiLAorCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19BTEwpID8gIkEiIDogIiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoInVua25vd24iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG5pNi0+bmlfcXR5cGUgPT0gTklfUVRZUEVfTk9PUCB8fAorCQkgICAgbmk2LT5uaV9xdHlwZSA9PSBOSV9RVFlQRV9TVVBUWVBFUykgeworCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikpCisJCQkJaWYgKHZmbGFnKQorCQkJCQlwcmludGYoIiwgaW52YWxpZCBsZW4iKTsKKwkJCS8qKCovCisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQl9CisKKworCQkvKiBYWFggYmFja3dhcmQgY29tcGF0LCBpY21wLW5hbWUtbG9va3VwLTAzICovCisJCWlmIChzaXogPT0gc2l6ZW9mKCpuaTYpKSB7CisJCQlwcmludGYoIiwgMDMgZHJhZnQiKTsKKwkJCS8qKCovCisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChuaTYtPm5pX2NvZGUpIHsKKwkJY2FzZSBJQ01QNl9OSV9TVUJKX0lQVjY6CisJCQlpZiAoIVRURVNUMigqZHAsCisJCQkgICAgc2l6ZW9mKCpuaTYpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQorCQkJCWJyZWFrOworCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgeworCQkJCWlmICh2ZmxhZykKKwkJCQkJcHJpbnRmKCIsIGludmFsaWQgc3ViamVjdCBsZW4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ZigiLCBzdWJqZWN0PSVzIiwKKwkJCSAgICBnZXRuYW1lNigoY29uc3QgdV9jaGFyICopKG5pNiArIDEpKSk7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9OSV9TVUJKX0ZRRE46CisJCQlwcmludGYoIiwgc3ViamVjdD1ETlMgbmFtZSIpOworCQkJY3AgPSAoY29uc3QgdV9jaGFyICopKG5pNiArIDEpOworCQkJaWYgKGNwWzBdID09IGVwIC0gY3AgLSAxKSB7CisJCQkJLyogaWNtcC1uYW1lLWxvb2t1cC0wMywgcGFzY2FsIHN0cmluZyAqLworCQkJCWlmICh2ZmxhZykKKwkJCQkJcHJpbnRmKCIsIDAzIGRyYWZ0Iik7CisJCQkJY3ArKzsKKwkJCQlwcmludGYoIiwgXCIiKTsKKwkJCQl3aGlsZSAoY3AgPCBlcCkgeworCQkJCQlzYWZlcHV0Y2hhcigqY3ApOworCQkJCQljcCsrOworCQkJCX0KKwkJCQlwcmludGYoIlwiIik7CisJCQl9IGVsc2UKKwkJCQlkbnNuYW1lX3ByaW50KGNwLCBlcCk7CisJCQlicmVhazsKKwkJY2FzZSBJQ01QNl9OSV9TVUJKX0lQVjQ6CisJCQlpZiAoIVRURVNUMigqZHAsIHNpemVvZigqbmk2KSArIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQorCQkJCWJyZWFrOworCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikgKyBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCQkJaWYgKHZmbGFnKQorCQkJCQlwcmludGYoIiwgaW52YWxpZCBzdWJqZWN0IGxlbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJcHJpbnRmKCIsIHN1YmplY3Q9JXMiLAorCQkJICAgIGdldG5hbWUoKGNvbnN0IHVfY2hhciAqKShuaTYgKyAxKSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiwgdW5rbm93biBzdWJqZWN0Iik7CisJCQlicmVhazsKKwkJfQorCisJCS8qKCovCisJCXByaW50ZigiKSIpOworCQlicmVhazsKKworCWNhc2UgSUNNUDZfTklfUkVQTFk6CisJCWlmIChpY21wNmxlbiA+IHNpeikgeworCQkJcHJpbnRmKCJbfGljbXA2OiBub2RlIGluZm9ybWF0aW9uIHJlcGx5XSIpOworCQkJYnJlYWs7CisJCX0KKworCQluZWVkY29tbWEgPSAwOworCisJCW5pNiA9IChzdHJ1Y3QgaWNtcDZfbm9kZWluZm8gKilkcDsKKwkJcHJpbnRmKCIgbm9kZSBpbmZvcm1hdGlvbiByZXBseSIpOworCQlwcmludGYoIiAoIik7CS8qKSovCisJCXN3aXRjaCAobmk2LT5uaV9jb2RlKSB7CisJCWNhc2UgSUNNUDZfTklfU1VDQ0VTUzoKKwkJCWlmICh2ZmxhZykgeworCQkJCXByaW50Zigic3VjY2VzcyIpOworCQkJCW5lZWRjb21tYSsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUNNUDZfTklfUkVGVVNFRDoKKwkJCXByaW50ZigicmVmdXNlZCIpOworCQkJbmVlZGNvbW1hKys7CisJCQlpZiAoc2l6ICE9IHNpemVvZigqbmk2KSkKKwkJCQlpZiAodmZsYWcpCisJCQkJCXByaW50ZigiLCBpbnZhbGlkIGxlbmd0aCIpOworCQkJYnJlYWs7CisJCWNhc2UgSUNNUDZfTklfVU5LTk9XTjoKKwkJCXByaW50ZigidW5rbm93biIpOworCQkJbmVlZGNvbW1hKys7CisJCQlpZiAoc2l6ICE9IHNpemVvZigqbmk2KSkKKwkJCQlpZiAodmZsYWcpCisJCQkJCXByaW50ZigiLCBpbnZhbGlkIGxlbmd0aCIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobmk2LT5uaV9jb2RlICE9IElDTVA2X05JX1NVQ0NFU1MpIHsKKwkJCS8qKCovCisJCQlwcmludGYoIikiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChFWFRSQUNUXzE2QklUUygmbmk2LT5uaV9xdHlwZSkpIHsKKwkJY2FzZSBOSV9RVFlQRV9OT09QOgorCQkJaWYgKG5lZWRjb21tYSkKKwkJCQlwcmludGYoIiwgIik7CisJCQlwcmludGYoIm5vb3AiKTsKKwkJCWlmIChzaXogIT0gc2l6ZW9mKCpuaTYpKQorCQkJCWlmICh2ZmxhZykKKwkJCQkJcHJpbnRmKCIsIGludmFsaWQgbGVuZ3RoIik7CisJCQlicmVhazsKKwkJY2FzZSBOSV9RVFlQRV9TVVBUWVBFUzoKKwkJCWlmIChuZWVkY29tbWEpCisJCQkJcHJpbnRmKCIsICIpOworCQkJcHJpbnRmKCJzdXBwb3J0ZWQgcXR5cGVzIik7CisJCQlpID0gRVhUUkFDVF8xNkJJVFMoJm5pNi0+bmlfZmxhZ3MpOworCQkJaWYgKGkpCisJCQkJcHJpbnRmKCIgWyVzXSIsIChpICYgMHgwMSkgPyAiQyIgOiAiIik7CisJCQlicmVhazsKKwkJY2FzZSBOSV9RVFlQRV9GUUROOgorCQkJaWYgKG5lZWRjb21tYSkKKwkJCQlwcmludGYoIiwgIik7CisJCQlwcmludGYoIkROUyBuYW1lIik7CisJCQljcCA9IChjb25zdCB1X2NoYXIgKikobmk2ICsgMSkgKyA0OworCQkJaWYgKGNwWzBdID09IGVwIC0gY3AgLSAxKSB7CisJCQkJLyogaWNtcC1uYW1lLWxvb2t1cC0wMywgcGFzY2FsIHN0cmluZyAqLworCQkJCWlmICh2ZmxhZykKKwkJCQkJcHJpbnRmKCIsIDAzIGRyYWZ0Iik7CisJCQkJY3ArKzsKKwkJCQlwcmludGYoIiwgXCIiKTsKKwkJCQl3aGlsZSAoY3AgPCBlcCkgeworCQkJCQlzYWZlcHV0Y2hhcigqY3ApOworCQkJCQljcCsrOworCQkJCX0KKwkJCQlwcmludGYoIlwiIik7CisJCQl9IGVsc2UKKwkJCQlkbnNuYW1lX3ByaW50KGNwLCBlcCk7CisJCQlpZiAoKEVYVFJBQ1RfMTZCSVRTKCZuaTYtPm5pX2ZsYWdzKSAmIDB4MDEpICE9IDApCisJCQkJcHJpbnRmKCIgW1RUTD0ldV0iLCAqKHVfaW50MzJfdCAqKShuaTYgKyAxKSk7CisJCQlicmVhazsKKwkJY2FzZSBOSV9RVFlQRV9OT0RFQUREUjoKKwkJCWlmIChuZWVkY29tbWEpCisJCQkJcHJpbnRmKCIsICIpOworCQkJcHJpbnRmKCJub2RlIGFkZHJlc3NlcyIpOworCQkJaSA9IHNpemVvZigqbmk2KTsKKwkJCXdoaWxlIChpIDwgc2l6KSB7CisJCQkJaWYgKGkgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSArIHNpemVvZihpbnQzMl90KSA+IHNpeikKKwkJCQkJYnJlYWs7CisJCQkJcHJpbnRmKCIgJXMiLCBnZXRuYW1lNihicCArIGkpKTsKKwkJCQlpICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQkJCXByaW50ZigiKCVkKSIsIChpbnQzMl90KUVYVFJBQ1RfMzJCSVRTKGJwICsgaSkpOworCQkJCWkgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJfQorCQkJaSA9IG5pNi0+bmlfZmxhZ3M7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCQlwcmludGYoIiBbJXMlcyVzJXMlcyVzJXNdIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQU5ZQ0FTVCkgPyAiYSIgOiAiIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMKSA/ICJHIiA6ICIiLAorCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwpID8gIlMiIDogIiIsCisJCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTCkgPyAiTCIgOiAiIiwKKwkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQ09NUEFUKSA/ICJDIiA6ICIiLAorCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19BTEwpID8gIkEiIDogIiIsCisJCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFKSA/ICJUIiA6ICIiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKG5lZWRjb21tYSkKKwkJCQlwcmludGYoIiwgIik7CisJCQlwcmludGYoInVua25vd24iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyooKi8KKwkJcHJpbnRmKCIpIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm47CisKK3RydW5jOgorCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkCitpY21wNl9ycmVudW1fcHJpbnQoY29uc3QgdV9jaGFyICpicCwgY29uc3QgdV9jaGFyICplcCkKK3sKKwlzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICpycjY7CisJY29uc3QgY2hhciAqY3A7CisJc3RydWN0IHJyX3Bjb19tYXRjaCAqbWF0Y2g7CisJc3RydWN0IHJyX3Bjb191c2UgKnVzZTsKKwljaGFyIGhidWZbTklfTUFYSE9TVF07CisJaW50IG47CisKKwlpZiAoZXAgPCBicCkKKwkJcmV0dXJuOworCXJyNiA9IChzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICopYnA7CisJY3AgPSAoY29uc3QgY2hhciAqKShycjYgKyAxKTsKKworCVRDSEVDSyhycjYtPnJyX3Jlc2VydmVkKTsKKwlzd2l0Y2ggKHJyNi0+cnJfY29kZSkgeworCWNhc2UgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HX0NPTU1BTkQ6CisJCXByaW50Zigicm91dGVyIHJlbnVtOiBjb21tYW5kIik7CisJCWJyZWFrOworCWNhc2UgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HX1JFU1VMVDoKKwkJcHJpbnRmKCJyb3V0ZXIgcmVudW06IHJlc3VsdCIpOworCQlicmVhazsKKwljYXNlIElDTVA2X1JPVVRFUl9SRU5VTUJFUklOR19TRVFOVU1fUkVTRVQ6CisJCXByaW50Zigicm91dGVyIHJlbnVtOiBzZXF1ZW5jZSBudW1iZXIgcmVzZXQiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJyb3V0ZXIgcmVudW06IGNvZGUtIyVkIiwgcnI2LT5ycl9jb2RlKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRmKCIsIHNlcT0ldSIsIEVYVFJBQ1RfMzJCSVRTKCZycjYtPnJyX3NlcW51bSkpOworCisJaWYgKHZmbGFnKSB7CisjZGVmaW5lIEYoeCwgeSkJKChycjYtPnJyX2ZsYWdzKSAmICh4KSA/ICh5KSA6ICIiKQorCQlwcmludGYoIlsiKTsJLypdKi8KKwkJaWYgKHJyNi0+cnJfZmxhZ3MpIHsKKwkJCXByaW50ZigiJXMlcyVzJXMlcywiLCBGKElDTVA2X1JSX0ZMQUdTX1RFU1QsICJUIiksCisJCQkgICAgRihJQ01QNl9SUl9GTEFHU19SRVFSRVNVTFQsICJSIiksCisJCQkgICAgRihJQ01QNl9SUl9GTEFHU19GT1JDRUFQUExZLCAiQSIpLAorCQkJICAgIEYoSUNNUDZfUlJfRkxBR1NfU1BFQ1NJVEUsICJTIiksCisJCQkgICAgRihJQ01QNl9SUl9GTEFHU19QUkVWRE9ORSwgIlAiKSk7CisJCX0KKwkJcHJpbnRmKCJzZWc9JXUsIiwgcnI2LT5ycl9zZWdudW0pOworCQlwcmludGYoIm1heGRlbGF5PSV1IiwgcnI2LT5ycl9tYXhkZWxheSk7CisJCWlmIChycjYtPnJyX3Jlc2VydmVkKQorCQkJcHJpbnRmKCJyc3ZkPTB4JXgiLCBFWFRSQUNUXzE2QklUUygmcnI2LT5ycl9yZXNlcnZlZCkpOworCQkvKlsqLworCQlwcmludGYoIl0iKTsKKyN1bmRlZiBGCisJfQorCisJaWYgKHJyNi0+cnJfY29kZSA9PSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkdfQ09NTUFORCkgeworCQltYXRjaCA9IChzdHJ1Y3QgcnJfcGNvX21hdGNoICopY3A7CisJCWNwID0gKGNvbnN0IGNoYXIgKikobWF0Y2ggKyAxKTsKKworCQlUQ0hFQ0sobWF0Y2gtPnJwbV9wcmVmaXgpOworCisJCWlmICh2ZmxhZyA+IDEpCisJCQlwcmludGYoIlxuXHQiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgIik7CisJCXByaW50ZigibWF0Y2goIik7CS8qKSovCisJCXN3aXRjaCAobWF0Y2gtPnJwbV9jb2RlKSB7CisJCWNhc2UgUlBNX1BDT19BREQ6CXByaW50ZigiYWRkIik7IGJyZWFrOworCQljYXNlIFJQTV9QQ09fQ0hBTkdFOglwcmludGYoImNoYW5nZSIpOyBicmVhazsKKwkJY2FzZSBSUE1fUENPX1NFVEdMT0JBTDoJcHJpbnRmKCJzZXRnbG9iYWwiKTsgYnJlYWs7CisJCWRlZmF1bHQ6CQlwcmludGYoIiMldSIsIG1hdGNoLT5ycG1fY29kZSk7IGJyZWFrOworCQl9CisKKwkJaWYgKHZmbGFnKSB7CisJCQlwcmludGYoIixvcmQ9JXUiLCBtYXRjaC0+cnBtX29yZGluYWwpOworCQkJcHJpbnRmKCIsbWluPSV1IiwgbWF0Y2gtPnJwbV9taW5sZW4pOworCQkJcHJpbnRmKCIsbWF4PSV1IiwgbWF0Y2gtPnJwbV9tYXhsZW4pOworCQl9CisJCWlmIChpbmV0X250b3AoQUZfSU5FVDYsICZtYXRjaC0+cnBtX3ByZWZpeCwgaGJ1Ziwgc2l6ZW9mKGhidWYpKSkKKwkJCXByaW50ZigiLCVzLyV1IiwgaGJ1ZiwgbWF0Y2gtPnJwbV9tYXRjaGxlbik7CisJCWVsc2UKKwkJCXByaW50ZigiLD8vJXUiLCBtYXRjaC0+cnBtX21hdGNobGVuKTsKKwkJLyooKi8KKwkJcHJpbnRmKCIpIik7CisKKwkJbiA9IG1hdGNoLT5ycG1fbGVuIC0gMzsKKwkJaWYgKG4gJSA0KQorCQkJZ290byB0cnVuYzsKKwkJbiAvPSA0OworCQl3aGlsZSAobi0tID4gMCkgeworCQkJdXNlID0gKHN0cnVjdCBycl9wY29fdXNlICopY3A7CisJCQljcCA9IChjb25zdCBjaGFyICopKHVzZSArIDEpOworCisJCQlUQ0hFQ0sodXNlLT5ycHVfcHJlZml4KTsKKworCQkJaWYgKHZmbGFnID4gMSkKKwkJCQlwcmludGYoIlxuXHQiKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiAiKTsKKwkJCXByaW50ZigidXNlKCIpOwkvKikqLworCQkJaWYgKHVzZS0+cnB1X2ZsYWdzKSB7CisjZGVmaW5lIEYoeCwgeSkJKCh1c2UtPnJwdV9mbGFncykgJiAoeCkgPyAoeSkgOiAiIikKKwkJCQlwcmludGYoIiVzJXMsIiwKKwkJCQkgICAgRihJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSwgIlYiKSwKKwkJCQkgICAgRihJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSwgIlAiKSk7CisjdW5kZWYgRgorCQkJfQorCQkJaWYgKHZmbGFnKSB7CisJCQkJcHJpbnRmKCJtYXNrPTB4JXgsIiwgdXNlLT5ycHVfcmFtYXNrKTsKKwkJCQlwcmludGYoInJhZmxhZ3M9MHgleCwiLCB1c2UtPnJwdV9yYWZsYWdzKTsKKwkJCQlpZiAofnVzZS0+cnB1X3ZsdGltZSA9PSAwKQorCQkJCQlwcmludGYoInZsdGltZT1pbmZ0eSwiKTsKKwkJCQllbHNlCisJCQkJCXByaW50Zigidmx0aW1lPSV1LCIsCisJCQkJCSAgICBFWFRSQUNUXzMyQklUUygmdXNlLT5ycHVfdmx0aW1lKSk7CisJCQkJaWYgKH51c2UtPnJwdV9wbHRpbWUgPT0gMCkKKwkJCQkJcHJpbnRmKCJwbHRpbWU9aW5mdHksIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoInBsdGltZT0ldSwiLAorCQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJnVzZS0+cnB1X3BsdGltZSkpOworCQkJfQorCQkJaWYgKGluZXRfbnRvcChBRl9JTkVUNiwgJnVzZS0+cnB1X3ByZWZpeCwgaGJ1ZiwKKwkJCSAgICBzaXplb2YoaGJ1ZikpKQorCQkJCXByaW50ZigiJXMvJXUvJXUiLCBoYnVmLCB1c2UtPnJwdV91c2VsZW4sCisJCQkJICAgIHVzZS0+cnB1X2tlZXBsZW4pOworCQkJZWxzZQorCQkJCXByaW50ZigiPy8ldS8ldSIsIHVzZS0+cnB1X3VzZWxlbiwKKwkJCQkgICAgdXNlLT5ycHVfa2VlcGxlbik7CisJCQkvKigqLworCQkJcHJpbnRmKCIpIik7CisJCX0KKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Cit9CisKKyNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaWdtcC5jIGIvcHJpbnQtaWdtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTBkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pZ21wLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaWdtcC5jLHYgMS4xNSAyMDA0LzAzLzI0IDAwOjU5OjE2IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIiAgICAgICAgICAgIC8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworCisjaWZuZGVmIElOX0NMQVNTRAorI2RlZmluZSBJTl9DTEFTU0QoaSkgKCgoaW50MzJfdCkoaSkgJiAweGYwMDAwMDAwKSA9PSAweGUwMDAwMDAwKQorI2VuZGlmCisKKy8qIChmb2xsb3dpbmcgZnJvbSBpcG11bHRpL21yb3V0ZWQvcHJ1bmUuaCkgKi8KKworLyoKKyAqIFRoZSBwYWNrZXQgZm9ybWF0IGZvciBhIHRyYWNlcm91dGUgcmVxdWVzdC4KKyAqLworc3RydWN0IHRyX3F1ZXJ5IHsKKyAgICB1X2ludDMyX3QgIHRyX3NyYzsgICAgICAgICAgLyogdHJhY2Vyb3V0ZSBzb3VyY2UgKi8KKyAgICB1X2ludDMyX3QgIHRyX2RzdDsgICAgICAgICAgLyogdHJhY2Vyb3V0ZSBkZXN0aW5hdGlvbiAqLworICAgIHVfaW50MzJfdCAgdHJfcmFkZHI7ICAgICAgICAvKiB0cmFjZXJvdXRlIHJlc3BvbnNlIGFkZHJlc3MgKi8KKyAgICB1X2ludDMyX3QgIHRyX3J0dGxxaWQ7ICAgICAgLyogcmVzcG9uc2UgdHRsIGFuZCBxaWQgKi8KK307CisKKyNkZWZpbmUgVFJfR0VUVFRMKHgpICAgICAgICAoaW50KSgoKHgpID4+IDI0KSAmIDB4ZmYpCisjZGVmaW5lIFRSX0dFVFFJRCh4KSAgICAgICAgKCh4KSAmIDB4MDBmZmZmZmYpCisKKy8qCisgKiBUcmFjZXJvdXRlIHJlc3BvbnNlIGZvcm1hdC4gIEEgdHJhY2Vyb3V0ZSByZXNwb25zZSBoYXMgYSB0cl9xdWVyeSBhdCB0aGUKKyAqIGJlZ2lubmluZywgZm9sbG93ZWQgYnkgb25lIHRyX3Jlc3AgZm9yIGVhY2ggaG9wIHRha2VuLgorICovCitzdHJ1Y3QgdHJfcmVzcCB7CisgICAgdV9pbnQzMl90IHRyX3FhcnI7ICAgICAgICAgIC8qIHF1ZXJ5IGFycml2YWwgdGltZSAqLworICAgIHVfaW50MzJfdCB0cl9pbmFkZHI7ICAgICAgICAvKiBpbmNvbWluZyBpbnRlcmZhY2UgYWRkcmVzcyAqLworICAgIHVfaW50MzJfdCB0cl9vdXRhZGRyOyAgICAgICAvKiBvdXRnb2luZyBpbnRlcmZhY2UgYWRkcmVzcyAqLworICAgIHVfaW50MzJfdCB0cl9ybXRhZGRyOyAgICAgICAvKiBwYXJlbnQgYWRkcmVzcyBpbiBzb3VyY2UgdHJlZSAqLworICAgIHVfaW50MzJfdCB0cl92aWZpbjsgICAgICAgICAvKiBpbnB1dCBwYWNrZXQgY291bnQgb24gaW50ZXJmYWNlICovCisgICAgdV9pbnQzMl90IHRyX3ZpZm91dDsgICAgICAgIC8qIG91dHB1dCBwYWNrZXQgY291bnQgb24gaW50ZXJmYWNlICovCisgICAgdV9pbnQzMl90IHRyX3BrdGNudDsgICAgICAgIC8qIHRvdGFsIGluY29taW5nIHBhY2tldHMgZm9yIHNyYy1ncnAgKi8KKyAgICB1X2ludDhfdCAgdHJfcnByb3RvOyAgICAgIC8qIHJvdXRpbmcgcHJvdG8gZGVwbG95ZWQgb24gcm91dGVyICovCisgICAgdV9pbnQ4X3QgIHRyX2Z0dGw7ICAgICAgICAvKiB0dGwgcmVxdWlyZWQgdG8gZm9yd2FyZCBvbiBvdXR2aWYgKi8KKyAgICB1X2ludDhfdCAgdHJfc21hc2s7ICAgICAgIC8qIHN1Ym5ldCBtYXNrIGZvciBzcmMgYWRkciAqLworICAgIHVfaW50OF90ICB0cl9yZmxhZ3M7ICAgICAgLyogZm9yd2FyZGluZyBlcnJvciBjb2RlcyAqLworfTsKKworLyogZGVmcyB3aXRoaW4gbXRyYWNlICovCisjZGVmaW5lIFRSX1FVRVJZIDEKKyNkZWZpbmUgVFJfUkVTUCAyCisKKy8qIGZpZWxkcyBmb3IgdHJfcmZsYWdzIChmb3J3YXJkaW5nIGVycm9yIGNvZGVzKSAqLworI2RlZmluZSBUUl9OT19FUlIgICAwCisjZGVmaW5lIFRSX1dST05HX0lGIDEKKyNkZWZpbmUgVFJfUFJVTkVEICAgMgorI2RlZmluZSBUUl9PUFJVTkVEICAzCisjZGVmaW5lIFRSX1NDT1BFRCAgIDQKKyNkZWZpbmUgVFJfTk9fUlRFICAgNQorI2RlZmluZSBUUl9OT19GV0QgICA3CisjZGVmaW5lIFRSX05PX1NQQUNFIDB4ODEKKyNkZWZpbmUgVFJfT0xEX1JPVVRFUiAgIDB4ODIKKworLyogZmllbGRzIGZvciB0cl9ycHJvdG8gKHJvdXRpbmcgcHJvdG9jb2wpICovCisjZGVmaW5lIFRSX1BST1RPX0RWTVJQICAxCisjZGVmaW5lIFRSX1BST1RPX01PU1BGICAyCisjZGVmaW5lIFRSX1BST1RPX1BJTSAgICAzCisjZGVmaW5lIFRSX1BST1RPX0NCVCAgICA0CisKKy8qIGlnbXB2MyByZXBvcnQgdHlwZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdG9rIGlnbXB2M3JlcG9ydDJzdHJbXSA9IHsKKwl7IDEsCSJpc19pbiIgfSwKKwl7IDIsCSJpc19leCIgfSwKKwl7IDMsCSJ0b19pbiIgfSwKKwl7IDQsCSJ0b19leCIgfSwKKwl7IDUsCSJhbGxvdyIgfSwKKwl7IDYsCSJibG9jayIgfSwKKwl7IDAsCU5VTEwgfQorfTsKKworc3RhdGljIHZvaWQKK3ByaW50X210cmFjZShyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRyX3F1ZXJ5ICp0ciA9IChjb25zdCBzdHJ1Y3QgdHJfcXVlcnkgKikoYnAgKyA4KTsKKworICAgIFRDSEVDSygqdHIpOworICAgIGlmIChsZW4gPCA4ICsgc2l6ZW9mIChzdHJ1Y3QgdHJfcXVlcnkpKSB7CisJKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbGVuICVkXSIsIGxlbik7CisJcmV0dXJuOworICAgIH0KKyAgICBwcmludGYoIm10cmFjZSAldTogJXMgdG8gJXMgcmVwbHktdG8gJXMiLAorICAgICAgICBUUl9HRVRRSUQoRVhUUkFDVF8zMkJJVFMoJnRyLT50cl9ydHRscWlkKSksCisgICAgICAgIGlwYWRkcl9zdHJpbmcoJnRyLT50cl9zcmMpLCBpcGFkZHJfc3RyaW5nKCZ0ci0+dHJfZHN0KSwKKyAgICAgICAgaXBhZGRyX3N0cmluZygmdHItPnRyX3JhZGRyKSk7CisgICAgaWYgKElOX0NMQVNTRChFWFRSQUNUXzMyQklUUygmdHItPnRyX3JhZGRyKSkpCisgICAgICAgIHByaW50ZigiIHdpdGgtdHRsICVkIiwgVFJfR0VUVFRMKEVYVFJBQ1RfMzJCSVRTKCZ0ci0+dHJfcnR0bHFpZCkpKTsKKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICAodm9pZClwcmludGYoIlt8aWdtcF0iKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9tcmVzcChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRyX3F1ZXJ5ICp0ciA9IChjb25zdCBzdHJ1Y3QgdHJfcXVlcnkgKikoYnAgKyA4KTsKKworICAgIFRDSEVDSygqdHIpOworICAgIGlmIChsZW4gPCA4ICsgc2l6ZW9mIChzdHJ1Y3QgdHJfcXVlcnkpKSB7CisJKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbGVuICVkXSIsIGxlbik7CisJcmV0dXJuOworICAgIH0KKyAgICBwcmludGYoIm1yZXNwICVsdTogJXMgdG8gJXMgcmVwbHktdG8gJXMiLAorICAgICAgICAodV9sb25nKVRSX0dFVFFJRChFWFRSQUNUXzMyQklUUygmdHItPnRyX3J0dGxxaWQpKSwKKyAgICAgICAgaXBhZGRyX3N0cmluZygmdHItPnRyX3NyYyksIGlwYWRkcl9zdHJpbmcoJnRyLT50cl9kc3QpLAorICAgICAgICBpcGFkZHJfc3RyaW5nKCZ0ci0+dHJfcmFkZHIpKTsKKyAgICBpZiAoSU5fQ0xBU1NEKEVYVFJBQ1RfMzJCSVRTKCZ0ci0+dHJfcmFkZHIpKSkKKyAgICAgICAgcHJpbnRmKCIgd2l0aC10dGwgJWQiLCBUUl9HRVRUVEwoRVhUUkFDVF8zMkJJVFMoJnRyLT50cl9ydHRscWlkKSkpOworICAgIHJldHVybjsKK3RydW5jOgorICAgICh2b2lkKXByaW50ZigiW3xpZ21wXSIpOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lnbXB2M19yZXBvcnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworICAgIHVfaW50IGdyb3VwLCBuc3Jjcywgbmdyb3VwczsKKyAgICByZWdpc3RlciB1X2ludCBpLCBqOworCisgICAgLyogTWluaW11bSBsZW4gaXMgMTYsIGFuZCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0ICovCisgICAgaWYgKGxlbiA8IDE2IHx8IGxlbiAmIDB4MDMpIHsKKwkodm9pZClwcmludGYoIiBbaW52YWxpZCBsZW4gJWRdIiwgbGVuKTsKKwlyZXR1cm47CisgICAgfQorICAgIFRDSEVDSzIoYnBbNl0sIDIpOworICAgIG5ncm91cHMgPSBFWFRSQUNUXzE2QklUUygmYnBbNl0pOworICAgICh2b2lkKXByaW50ZigiLCAlZCBncm91cCByZWNvcmQocykiLCBuZ3JvdXBzKTsKKyAgICBpZiAodmZsYWcgPiAwKSB7CisJLyogUHJpbnQgdGhlIGdyb3VwIHJlY29yZHMgKi8KKwlncm91cCA9IDg7CisgICAgICAgIGZvciAoaT0wOyBpPG5ncm91cHM7IGkrKykgeworCSAgICBpZiAobGVuIDwgZ3JvdXArOCkgeworCQkodm9pZClwcmludGYoIiBbaW52YWxpZCBudW1iZXIgb2YgZ3JvdXBzXSIpOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgVENIRUNLMihicFtncm91cCs0XSwgNCk7CisgICAgICAgICAgICAodm9pZClwcmludGYoIiBbZ2FkZHIgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFtncm91cCs0XSkpOworCSAgICAodm9pZClwcmludGYoIiAlcyIsIHRvazJzdHIoaWdtcHYzcmVwb3J0MnN0ciwgIiBbdjMtcmVwb3J0LSMlZF0iLAorCQkJCQkJCQlicFtncm91cF0pKTsKKyAgICAgICAgICAgIG5zcmNzID0gRVhUUkFDVF8xNkJJVFMoJmJwW2dyb3VwKzJdKTsKKwkgICAgLyogQ2hlY2sgdGhlIG51bWJlciBvZiBzb3VyY2VzIGFuZCBwcmludCB0aGVtICovCisJICAgIGlmIChsZW4gPCBncm91cCs4Kyhuc3Jjczw8MikpIHsKKwkJKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbnVtYmVyIG9mIHNvdXJjZXMgJWRdIiwgbnNyY3MpOworCQlyZXR1cm47CisJICAgIH0KKyAgICAgICAgICAgIGlmICh2ZmxhZyA9PSAxKQorICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiLCAlZCBzb3VyY2UocykiLCBuc3Jjcyk7CisgICAgICAgICAgICBlbHNlIHsKKwkJLyogUHJpbnQgdGhlIHNvdXJjZXMgKi8KKyAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiB7Iik7CisgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8bnNyY3M7IGorKykgeworCQkgICAgVENIRUNLMihicFtncm91cCs4KyhqPDwyKV0sIDQpOworCQkgICAgKHZvaWQpcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFtncm91cCs4KyhqPDwyKV0pKTsKKwkJfQorICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiIH0iKTsKKyAgICAgICAgICAgIH0KKwkgICAgLyogTmV4dCBncm91cCByZWNvcmQgKi8KKyAgICAgICAgICAgIGdyb3VwICs9IDggKyAobnNyY3MgPDwgMik7CisJICAgICh2b2lkKXByaW50ZigiXSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgICh2b2lkKXByaW50ZigiW3xpZ21wXSIpOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lnbXB2M19xdWVyeShyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisgICAgdV9pbnQgbXJjOworICAgIGludCBtcnQ7CisgICAgdV9pbnQgbnNyY3M7CisgICAgcmVnaXN0ZXIgdV9pbnQgaTsKKworICAgICh2b2lkKXByaW50ZigiIHYzIik7CisgICAgLyogTWluaW11bSBsZW4gaXMgMTIsIGFuZCBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiA0ICovCisgICAgaWYgKGxlbiA8IDEyIHx8IGxlbiAmIDB4MDMpIHsKKwkodm9pZClwcmludGYoIiBbaW52YWxpZCBsZW4gJWRdIiwgbGVuKTsKKwlyZXR1cm47CisgICAgfQorICAgIFRDSEVDSyhicFsxXSk7CisgICAgbXJjID0gYnBbMV07CisgICAgaWYgKG1yYyA8IDEyOCkgeworCW1ydCA9IG1yYzsKKyAgICB9IGVsc2UgeworICAgICAgICBtcnQgPSAoKG1yYyAmIDB4MGYpIHwgMHgxMCkgPDwgKCgobXJjICYgMHg3MCkgPj4gNCkgKyAzKTsKKyAgICB9CisgICAgaWYgKG1yYyAhPSAxMDApIHsKKwkodm9pZClwcmludGYoIiBbbWF4IHJlc3AgdGltZSAiKTsKKwlyZWx0c19wcmludChtcnQpOworCSh2b2lkKXByaW50ZigiXSIpOworICAgIH0KKyAgICBUQ0hFQ0syKGJwWzRdLCA0KTsKKyAgICBpZiAoRVhUUkFDVF8zMkJJVFMoJmJwWzRdKSA9PSAwKQorCXJldHVybjsKKyAgICAodm9pZClwcmludGYoIiBbZ2FkZHIgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFs0XSkpOworICAgIFRDSEVDSzIoYnBbMTBdLCAyKTsKKyAgICBuc3JjcyA9IEVYVFJBQ1RfMTZCSVRTKCZicFsxMF0pOworICAgIGlmIChuc3JjcyA+IDApIHsKKwlpZiAobGVuIDwgMTIgKyAobnNyY3MgPDwgMikpCisJICAgICh2b2lkKXByaW50ZigiIFtpbnZhbGlkIG51bWJlciBvZiBzb3VyY2VzXSIpOworCWVsc2UgaWYgKHZmbGFnID4gMSkgeworCSAgICAodm9pZClwcmludGYoIiB7Iik7CisJICAgIGZvciAoaT0wOyBpPG5zcmNzOyBpKyspIHsKKwkJVENIRUNLMihicFsxMisoaTw8MildLCA0KTsKKwkJKHZvaWQpcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFsxMisoaTw8MildKSk7CisJICAgIH0KKwkgICAgKHZvaWQpcHJpbnRmKCIgfSIpOworCX0gZWxzZQorCSAgICAodm9pZClwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOworICAgIH0KKyAgICAodm9pZClwcmludGYoIl0iKTsKKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICAodm9pZClwcmludGYoIlt8aWdtcF0iKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQKK2lnbXBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworICAgIGlmIChxZmxhZykgeworICAgICAgICAodm9pZClwcmludGYoImlnbXAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRDSEVDSyhicFswXSk7CisgICAgc3dpdGNoIChicFswXSkgeworICAgIGNhc2UgMHgxMToKKyAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ21wIHF1ZXJ5Iik7CisJaWYgKGxlbiA+PSAxMikKKwkgICAgcHJpbnRfaWdtcHYzX3F1ZXJ5KGJwLCBsZW4pOworCWVsc2UgeworICAgICAgICAgICAgVENIRUNLKGJwWzFdKTsKKwkgICAgaWYgKGJwWzFdKSB7CisJCSh2b2lkKXByaW50ZigiIHYyIik7CisJCWlmIChicFsxXSAhPSAxMDApCisJCSAgICAodm9pZClwcmludGYoIiBbbWF4IHJlc3AgdGltZSAlZF0iLCBicFsxXSk7CisJICAgIH0gZWxzZQorCQkodm9pZClwcmludGYoIiB2MSIpOworICAgICAgICAgICAgVENIRUNLMihicFs0XSwgNCk7CisJICAgIGlmIChFWFRSQUNUXzMyQklUUygmYnBbNF0pKQorICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiIFtnYWRkciAlc10iLCBpcGFkZHJfc3RyaW5nKCZicFs0XSkpOworICAgICAgICAgICAgaWYgKGxlbiAhPSA4KQorICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiIFtsZW4gJWRdIiwgbGVuKTsKKwl9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMjoKKyAgICAgICAgVENIRUNLMihicFs0XSwgNCk7CisgICAgICAgICh2b2lkKXByaW50ZigiaWdtcCB2MSByZXBvcnQgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFs0XSkpOworICAgICAgICBpZiAobGVuICE9IDgpCisgICAgICAgICAgICAodm9pZClwcmludGYoIiBbbGVuICVkXSIsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNjoKKyAgICAgICAgVENIRUNLMihicFs0XSwgNCk7CisgICAgICAgICh2b2lkKXByaW50ZigiaWdtcCB2MiByZXBvcnQgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFs0XSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MjI6CisgICAgICAgICh2b2lkKXByaW50ZigiaWdtcCB2MyByZXBvcnQiKTsKKwlwcmludF9pZ21wdjNfcmVwb3J0KGJwLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTc6CisgICAgICAgIFRDSEVDSzIoYnBbNF0sIDQpOworICAgICAgICAodm9pZClwcmludGYoImlnbXAgbGVhdmUgJXMiLCBpcGFkZHJfc3RyaW5nKCZicFs0XSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTM6CisgICAgICAgICh2b2lkKXByaW50ZigiaWdtcCBkdm1ycCIpOworICAgICAgICBpZiAobGVuIDwgOCkKKyAgICAgICAgICAgICh2b2lkKXByaW50ZigiIFtsZW4gJWRdIiwgbGVuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHZtcnBfcHJpbnQoYnAsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNDoKKyAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ21wIHBpbXYxIik7CisgICAgICAgIHBpbXYxX3ByaW50KGJwLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWU6CisgICAgICAgIHByaW50X21yZXNwKGJwLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWY6CisgICAgICAgIHByaW50X210cmFjZShicCwgbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ21wLSVkIiwgYnBbMF0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodmZsYWcgJiYgVFRFU1QyKGJwWzBdLCBsZW4pKSB7CisgICAgICAgIC8qIENoZWNrIHRoZSBJR01QIGNoZWNrc3VtICovCisgICAgICAgIGlmIChpbl9ja3N1bSgoY29uc3QgdV9zaG9ydCopYnAsIGxlbiwgMCkpCisgICAgICAgICAgICBwcmludGYoIiBiYWQgaWdtcCBja3N1bSAleCEiLCBFWFRSQUNUXzE2QklUUygmYnBbMl0pKTsKKyAgICB9CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgZnB1dHMoIlt8aWdtcF0iLCBzdGRvdXQpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaWdycC5jIGIvcHJpbnQtaWdycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ODQ3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pZ3JwLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBJbml0aWFsIGNvbnRyaWJ1dGlvbiBmcm9tIEZyYW5jaXMgRHVwb250IChmcmFuY2lzLmR1cG9udEBpbnJpYS5mcikKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pZ3JwLmMsdiAxLjIwLjIuMSAyMDA1LzA0LzIwIDIxOjAyOjE1IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiaWdycC5oIgorI2luY2x1ZGUgImlwLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworCitzdGF0aWMgdm9pZAoraWdycF9lbnRyeV9wcmludChyZWdpc3RlciBzdHJ1Y3QgaWdycHJ0ZSAqaWdyLCByZWdpc3RlciBpbnQgaXNfaW50ZXJpb3IsCisgICAgcmVnaXN0ZXIgaW50IGlzX2V4dGVyaW9yKQoreworCXJlZ2lzdGVyIHVfaW50IGRlbGF5LCBiYW5kd2lkdGg7CisJdV9pbnQgbWV0cmljLCBtdHU7CisKKwlpZiAoaXNfaW50ZXJpb3IpCisJCXByaW50ZigiICouJWQuJWQuJWQiLCBpZ3ItPmlncl9uZXRbMF0sCisJCSAgICBpZ3ItPmlncl9uZXRbMV0sIGlnci0+aWdyX25ldFsyXSk7CisJZWxzZSBpZiAoaXNfZXh0ZXJpb3IpCisJCXByaW50ZigiIFglZC4lZC4lZC4wIiwgaWdyLT5pZ3JfbmV0WzBdLAorCQkgICAgaWdyLT5pZ3JfbmV0WzFdLCBpZ3ItPmlncl9uZXRbMl0pOworCWVsc2UKKwkJcHJpbnRmKCIgJWQuJWQuJWQuMCIsIGlnci0+aWdyX25ldFswXSwKKwkJICAgIGlnci0+aWdyX25ldFsxXSwgaWdyLT5pZ3JfbmV0WzJdKTsKKworCWRlbGF5ID0gRVhUUkFDVF8yNEJJVFMoaWdyLT5pZ3JfZGx5KTsKKwliYW5kd2lkdGggPSBFWFRSQUNUXzI0QklUUyhpZ3ItPmlncl9idyk7CisJbWV0cmljID0gYmFuZHdpZHRoICsgZGVsYXk7CisJaWYgKG1ldHJpYyA+IDB4ZmZmZmZmKQorCQltZXRyaWMgPSAweGZmZmZmZjsKKwltdHUgPSBFWFRSQUNUXzE2QklUUyhpZ3ItPmlncl9tdHUpOworCisJcHJpbnRmKCIgZD0lZCBiPSVkIHI9JWQgbD0lZCBNPSVkIG10dT0lZCBpbiAlZCBob3BzIiwKKwkgICAgMTAgKiBkZWxheSwgYmFuZHdpZHRoID09IDAgPyAwIDogMTAwMDAwMDAgLyBiYW5kd2lkdGgsCisJICAgIGlnci0+aWdyX3JlbCwgaWdyLT5pZ3JfbGQsIG1ldHJpYywKKwkgICAgbXR1LCBpZ3ItPmlncl9oY3QpOworfQorCitzdGF0aWMgc3RydWN0IHRvayBvcDJzdHJbXSA9IHsKKwl7IElHUlBfVVBEQVRFLAkJInVwZGF0ZSIgfSwKKwl7IElHUlBfUkVRVUVTVCwJCSJyZXF1ZXN0IiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3ZvaWQKK2lncnBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLCBjb25zdCB1X2NoYXIgKmJwMiBfVV8pCit7CisJcmVnaXN0ZXIgc3RydWN0IGlncnBoZHIgKmhkcjsKKwlyZWdpc3RlciB1X2NoYXIgKmNwOworCXVfaW50IG5pbnQsIG5zeXMsIG5leHQ7CisKKwloZHIgPSAoc3RydWN0IGlncnBoZHIgKilicDsKKwljcCA9ICh1X2NoYXIgKikoaGRyICsgMSk7CisgICAgICAgICh2b2lkKXByaW50ZigiaWdycDoiKTsKKworCS8qIEhlYWRlciAqLworCVRDSEVDSygqaGRyKTsKKwluaW50ID0gRVhUUkFDVF8xNkJJVFMoJmhkci0+aWdfbmkpOworCW5zeXMgPSBFWFRSQUNUXzE2QklUUygmaGRyLT5pZ19ucyk7CisJbmV4dCA9IEVYVFJBQ1RfMTZCSVRTKCZoZHItPmlnX254KTsKKworCSh2b2lkKXByaW50ZigiICVzIFYlZCBlZGl0PSVkIEFTPSVkICglZC8lZC8lZCkiLAorCSAgICB0b2syc3RyKG9wMnN0ciwgIm9wLSMlZCIsIElHUlBfT1AoaGRyLT5pZ192b3ApKSwKKwkgICAgSUdSUF9WKGhkci0+aWdfdm9wKSwKKwkgICAgaGRyLT5pZ19lZCwKKwkgICAgRVhUUkFDVF8xNkJJVFMoJmhkci0+aWdfYXMpLAorCSAgICBuaW50LAorCSAgICBuc3lzLAorCSAgICBuZXh0KTsKKworCWxlbmd0aCAtPSBzaXplb2YoKmhkcik7CisJd2hpbGUgKGxlbmd0aCA+PSBJR1JQX1JURV9TSVpFKSB7CisJCWlmIChuaW50ID4gMCkgeworCQkJVENIRUNLMigqY3AsIElHUlBfUlRFX1NJWkUpOworCQkJaWdycF9lbnRyeV9wcmludCgoc3RydWN0IGlncnBydGUgKiljcCwgMSwgMCk7CisJCQktLW5pbnQ7CisJCX0gZWxzZSBpZiAobnN5cyA+IDApIHsKKwkJCVRDSEVDSzIoKmNwLCBJR1JQX1JURV9TSVpFKTsKKwkJCWlncnBfZW50cnlfcHJpbnQoKHN0cnVjdCBpZ3JwcnRlICopY3AsIDAsIDApOworCQkJLS1uc3lzOworCQl9IGVsc2UgaWYgKG5leHQgPiAwKSB7CisJCQlUQ0hFQ0syKCpjcCwgSUdSUF9SVEVfU0laRSk7CisJCQlpZ3JwX2VudHJ5X3ByaW50KChzdHJ1Y3QgaWdycHJ0ZSAqKWNwLCAwLCAxKTsKKwkJCS0tbmV4dDsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKXByaW50ZigiIFtleHRyYSBieXRlcyAlZF0iLCBsZW5ndGgpOworCQkJYnJlYWs7CisJCX0KKwkJY3AgKz0gSUdSUF9SVEVfU0laRTsKKwkJbGVuZ3RoIC09IElHUlBfUlRFX1NJWkU7CisJfQorCWlmIChuaW50ID09IDAgJiYgbnN5cyA9PSAwICYmIG5leHQgPT0gMCkKKwkJcmV0dXJuOwordHJ1bmM6CisJZnB1dHMoIiBbfGlncnBdIiwgc3Rkb3V0KTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWlwLmMgYi9wcmludC1pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjM4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pcC5jCkBAIC0wLDAgKzEsNzQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXAuYyx2IDEuMTQ5LjIuOSAyMDA3LzA5LzE0IDAxOjMwOjAyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworCisjaW5jbHVkZSAiaXAuaCIKKyNpbmNsdWRlICJpcHByb3RvLmgiCisKK3N0cnVjdCB0b2sgaXBfb3B0aW9uX3ZhbHVlc1tdID0geworICAgIHsgSVBPUFRfRU9MLCAiRU9MIiB9LAorICAgIHsgSVBPUFRfTk9QLCAiTk9QIiB9LAorICAgIHsgSVBPUFRfVFMsICJ0aW1lc3RhbXAiIH0sCisgICAgeyBJUE9QVF9TRUNVUklUWSwgInNlY3VyaXR5IiB9LAorICAgIHsgSVBPUFRfUlIsICJSUiIgfSwKKyAgICB7IElQT1BUX1NTUlIsICJTU1JSIiB9LAorICAgIHsgSVBPUFRfTFNSUiwgIkxTUlIiIH0sCisgICAgeyBJUE9QVF9SQSwgIlJBIiB9LAorICAgIHsgSVBPUFRfUkZDMTM5MywgInRyYWNlcm91dGUiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qCisgKiBwcmludCB0aGUgcmVjb3JkZWQgcm91dGUgaW4gYW4gSVAgUlIsIExTUlIgb3IgU1NSUiBvcHRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpcF9wcmludHJvdXRlKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciB1X2ludCBwdHI7CisJcmVnaXN0ZXIgdV9pbnQgbGVuOworCisJaWYgKGxlbmd0aCA8IDMpIHsKKwkJcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKGxlbmd0aCArIDEpICYgMykKKwkJcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgbGVuZ3RoKTsKKwlwdHIgPSBjcFsyXSAtIDE7CisJaWYgKHB0ciA8IDMgfHwgKChwdHIgKyAxKSAmIDMpIHx8IHB0ciA+IGxlbmd0aCArIDEpCisJCXByaW50ZigiIFtiYWQgcHRyICV1XSIsIGNwWzJdKTsKKworCWZvciAobGVuID0gMzsgbGVuIDwgbGVuZ3RoOyBsZW4gKz0gNCkgeworCQlwcmludGYoIiAlcyIsIGlwYWRkcl9zdHJpbmcoJmNwW2xlbl0pKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyID4gbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIik7CisJfQorfQorCisvKgorICogSWYgc291cmNlLXJvdXRpbmcgaXMgcHJlc2VudCBhbmQgdmFsaWQsIHJldHVybiB0aGUgZmluYWwgZGVzdGluYXRpb24uCisgKiBPdGhlcndpc2UsIHJldHVybiBJUCBkZXN0aW5hdGlvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWQgZm9yIFVEUCBhbmQgVENQIHBzZXVkby1oZWFkZXIgaW4gdGhlIGNoZWNrc3VtCisgKiBjYWxjdWxhdGlvbi4KKyAqLwordV9pbnQzMl90CitpcF9maW5kZHN0KGNvbnN0IHN0cnVjdCBpcCAqaXApCit7CisJaW50IGxlbmd0aDsKKwlpbnQgbGVuOworCWNvbnN0IHVfY2hhciAqY3A7CisJdV9pbnQzMl90IHJldHZhbDsKKworCWNwID0gKGNvbnN0IHVfY2hhciAqKShpcCArIDEpOworCWxlbmd0aCA9IChJUF9ITChpcCkgPDwgMikgLSBzaXplb2Yoc3RydWN0IGlwKTsKKworCWZvciAoOyBsZW5ndGggPiAwOyBjcCArPSBsZW4sIGxlbmd0aCAtPSBsZW4pIHsKKwkJaW50IHR0OworCisJCVRDSEVDSygqY3ApOworCQl0dCA9ICpjcDsKKwkJaWYgKHR0ID09IElQT1BUX0VPTCkKKwkJCWJyZWFrOworCQllbHNlIGlmICh0dCA9PSBJUE9QVF9OT1ApCisJCQlsZW4gPSAxOworCQllbHNlIHsKKwkJCVRDSEVDSyhjcFsxXSk7CisJCQlsZW4gPSBjcFsxXTsKKwkJCWlmIChsZW4gPCAyKQorCQkJCWJyZWFrOworCQl9CisJCVRDSEVDSzIoKmNwLCBsZW4pOworCQlzd2l0Y2ggKHR0KSB7CisKKwkJY2FzZSBJUE9QVF9TU1JSOgorCQljYXNlIElQT1BUX0xTUlI6CisJCQlpZiAobGVuIDwgNykKKwkJCQlicmVhazsKKwkJCW1lbWNweSgmcmV0dmFsLCBjcCArIGxlbiAtIDQsIDQpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KK3RydW5jOgorCW1lbWNweSgmcmV0dmFsLCAmaXAtPmlwX2RzdC5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZAoraXBfcHJpbnR0cyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCB1X2ludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgdV9pbnQgcHRyOworCXJlZ2lzdGVyIHVfaW50IGxlbjsKKwlpbnQgaG9wbGVuOworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlpZiAobGVuZ3RoIDwgNCkgeworCQlwcmludGYoIltiYWQgbGVuZ3RoICV1XSIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRmKCIgVFN7Iik7CisJaG9wbGVuID0gKChjcFszXSYweEYpICE9IElQT1BUX1RTX1RTT05MWSkgPyA4IDogNDsKKwlpZiAoKGxlbmd0aCAtIDQpICYgKGhvcGxlbi0xKSkKKwkJcHJpbnRmKCJbYmFkIGxlbmd0aCAldV0iLCBsZW5ndGgpOworCXB0ciA9IGNwWzJdIC0gMTsKKwlsZW4gPSAwOworCWlmIChwdHIgPCA0IHx8ICgocHRyIC0gNCkgJiAoaG9wbGVuLTEpKSB8fCBwdHIgPiBsZW5ndGggKyAxKQorCQlwcmludGYoIltiYWQgcHRyICV1XSIsIGNwWzJdKTsKKwlzd2l0Y2ggKGNwWzNdJjB4RikgeworCWNhc2UgSVBPUFRfVFNfVFNPTkxZOgorCQlwcmludGYoIlRTT05MWSIpOworCQlicmVhazsKKwljYXNlIElQT1BUX1RTX1RTQU5EQUREUjoKKwkJcHJpbnRmKCJUUytBRERSIik7CisJCWJyZWFrOworCS8qCisJICogcHJlc3BlY2lmaWVkIHNob3VsZCByZWFsbHkgYmUgMywgYnV0IHNvbWUgb25lcyBtaWdodCBzZW5kIDIKKwkgKiBpbnN0ZWFkLCBhbmQgdGhlIElQT1BUX1RTX1BSRVNQRUMgY29uc3RhbnQgY2FuIGFwcGFyZW50bHkKKwkgKiBoYXZlIGJvdGggdmFsdWVzLCBzbyB3ZSBoYXZlIHRvIGhhcmQtY29kZSBpdCBoZXJlLgorCSAqLworCisJY2FzZSAyOgorCQlwcmludGYoIlBSRVNQRUMyLjAiKTsKKwkJYnJlYWs7CisJY2FzZSAzOgkJCS8qIElQT1BUX1RTX1BSRVNQRUMgKi8KKwkJcHJpbnRmKCJQUkVTUEVDIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiW2JhZCB0cyB0eXBlICVkXSIsIGNwWzNdJjB4Rik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl0eXBlID0gIiAiOworCWZvciAobGVuID0gNDsgbGVuIDwgbGVuZ3RoOyBsZW4gKz0gaG9wbGVuKSB7CisJCWlmIChwdHIgPT0gbGVuKQorCQkJdHlwZSA9ICIgXiAiOworCQlwcmludGYoIiVzJWRAJXMiLCB0eXBlLCBFWFRSQUNUXzMyQklUUygmY3BbbGVuK2hvcGxlbi00XSksCisJCSAgICAgICBob3BsZW4hPTggPyAiIiA6IGlwYWRkcl9zdHJpbmcoJmNwW2xlbl0pKTsKKwkJdHlwZSA9ICIgIjsKKwl9CisKK2RvbmU6CisJcHJpbnRmKCIlcyIsIHB0ciA9PSBsZW4gPyAiIF4gIiA6ICIiKTsKKworCWlmIChjcFszXT4+NCkKKwkJcHJpbnRmKCIgWyVkIGhvcHMgbm90IHJlY29yZGVkXX0gIiwgY3BbM10+PjQpOworCWVsc2UKKwkJcHJpbnRmKCJ9Iik7Cit9CisKKy8qCisgKiBwcmludCBJUCBvcHRpb25zLgorICovCitzdGF0aWMgdm9pZAoraXBfb3B0cHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIHVfaW50IG9wdGlvbl9sZW47CisJY29uc3QgY2hhciAqc2VwID0gIiI7CisKKwlmb3IgKDsgbGVuZ3RoID4gMDsgY3AgKz0gb3B0aW9uX2xlbiwgbGVuZ3RoIC09IG9wdGlvbl9sZW4pIHsKKwkJdV9pbnQgb3B0aW9uX2NvZGU7CisKKwkJcHJpbnRmKCIlcyIsIHNlcCk7CisJCXNlcCA9ICIsIjsKKworCQlUQ0hFQ0soKmNwKTsKKwkJb3B0aW9uX2NvZGUgPSAqY3A7CisKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaXBfb3B0aW9uX3ZhbHVlcywidW5rbm93biAldSIsb3B0aW9uX2NvZGUpKTsKKworCQlpZiAob3B0aW9uX2NvZGUgPT0gSVBPUFRfTk9QIHx8CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9jb2RlID09IElQT1BUX0VPTCkKKwkJCW9wdGlvbl9sZW4gPSAxOworCisJCWVsc2UgeworCQkJVENIRUNLKGNwWzFdKTsKKwkJCW9wdGlvbl9sZW4gPSBjcFsxXTsKKwkJCWlmIChvcHRpb25fbGVuIDwgMikgeworCQkgICAgICAgICAgICAgICAgcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgb3B0aW9uX2xlbik7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJaWYgKG9wdGlvbl9sZW4gPiBsZW5ndGgpIHsKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgb3B0aW9uX2xlbik7CisJCQlyZXR1cm47CisJCX0KKworICAgICAgICAgICAgICAgIFRDSEVDSzIoKmNwLCBvcHRpb25fbGVuKTsKKworCQlzd2l0Y2ggKG9wdGlvbl9jb2RlKSB7CisJCWNhc2UgSVBPUFRfRU9MOgorCQkJcmV0dXJuOworCisJCWNhc2UgSVBPUFRfVFM6CisJCQlpcF9wcmludHRzKGNwLCBvcHRpb25fbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBPUFRfUlI6ICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElQT1BUX1NTUlI6CisJCWNhc2UgSVBPUFRfTFNSUjoKKwkJCWlwX3ByaW50cm91dGUoY3AsIG9wdGlvbl9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUE9QVF9SQToKKwkJCWlmIChvcHRpb25fbGVuIDwgNCkgeworCQkJCXByaW50ZigiIFtiYWQgbGVuZ3RoICV1XSIsIG9wdGlvbl9sZW4pOworCQkJCWJyZWFrOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLKGNwWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFWFRSQUNUXzE2QklUUygmY3BbMl0pICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgdmFsdWUgJXUiLCBFWFRSQUNUXzE2QklUUygmY3BbMl0pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBPUFRfTk9QOiAgICAgICAvKiBub3RoaW5nIHRvIHByaW50IC0gZmFsbCB0aHJvdWdoICovCisJCWNhc2UgSVBPUFRfU0VDVVJJVFk6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiW3xpcF0iKTsKK30KKworLyoKKyAqIGNvbXB1dGUgYW4gSVAgaGVhZGVyIGNoZWNrc3VtLgorICogZG9uJ3QgbW9kaWZpeSB0aGUgcGFja2V0LgorICovCit1X3Nob3J0Citpbl9ja3N1bShjb25zdCB1X3Nob3J0ICphZGRyLCByZWdpc3RlciB1X2ludCBsZW4sIGludCBjc3VtKQoreworCWludCBubGVmdCA9IGxlbjsKKwljb25zdCB1X3Nob3J0ICp3ID0gYWRkcjsKKwl1X3Nob3J0IGFuc3dlcjsKKwlpbnQgc3VtID0gY3N1bTsKKworCS8qCisJICogIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKKwkgKiAgd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAorCSAqICBiYWNrIGFsbCB0aGUgY2FycnkgYml0cyBmcm9tIHRoZSB0b3AgMTYgYml0cyBpbnRvIHRoZSBsb3dlcgorCSAqICAxNiBiaXRzLgorCSAqLworCXdoaWxlIChubGVmdCA+IDEpICB7CisJCXN1bSArPSAqdysrOworCQlubGVmdCAtPSAyOworCX0KKwlpZiAobmxlZnQgPT0gMSkKKwkJc3VtICs9IGh0b25zKCoodV9jaGFyICopdzw8OCk7CisKKwkvKgorCSAqIGFkZCBiYWNrIGNhcnJ5IG91dHMgZnJvbSB0b3AgMTYgYml0cyB0byBsb3cgMTYgYml0cworCSAqLworCXN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7CS8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KKwlzdW0gKz0gKHN1bSA+PiAxNik7CQkJLyogYWRkIGNhcnJ5ICovCisJYW5zd2VyID0gfnN1bTsJCQkJLyogdHJ1bmNhdGUgdG8gMTYgYml0cyAqLworCXJldHVybiAoYW5zd2VyKTsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBob3N0LWJ5dGUtb3JkZXIgdmFsdWUgb2YgdGhlIGNoZWNrc3VtIGZpZWxkIGluIGEgcGFja2V0CisgKiBoZWFkZXIsIGFuZCB0aGUgbmV0d29yay1ieXRlLW9yZGVyIGNvbXB1dGVkIGNoZWNrc3VtIG9mIHRoZSBkYXRhCisgKiB0aGF0IHRoZSBjaGVja3N1bSBjb3ZlcnMgKGluY2x1ZGluZyB0aGUgY2hlY2tzdW0gaXRzZWxmKSwgY29tcHV0ZQorICogd2hhdCB0aGUgY2hlY2tzdW0gZmllbGQgKnNob3VsZCogaGF2ZSBiZWVuLgorICovCit1X2ludDE2X3QKK2luX2Nrc3VtX3Nob3VsZGJlKHVfaW50MTZfdCBzdW0sIHVfaW50MTZfdCBjb21wdXRlZF9zdW0pCit7CisJdV9pbnQzMl90IHNob3VsZGJlOworCisJLyoKKwkgKiBUaGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSBnb25lIGludG8gdGhlIGNoZWNrc3VtIGZpZWxkCisJICogaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSB2YWx1ZSBnb3R0ZW4gYnkgc3VtbWluZyB1cCBldmVyeXRoaW5nCisJICogKmJ1dCogdGhlIGNoZWNrc3VtIGZpZWxkLgorCSAqCisJICogV2UgY2FuIGNvbXB1dGUgdGhhdCBieSBzdWJ0cmFjdGluZyB0aGUgdmFsdWUgb2YgdGhlIGNoZWNrc3VtCisJICogZmllbGQgZnJvbSB0aGUgc3VtIG9mIGFsbCB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LCBhbmQgdGhlbgorCSAqIGNvbXB1dGluZyB0aGUgbmVnYXRpdmUgb2YgdGhhdCB2YWx1ZS4KKwkgKgorCSAqICJzdW0iIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gZmllbGQsIGFuZCAiY29tcHV0ZWRfc3VtIgorCSAqIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc3VtIG9mIGFsbCB0aGUgZGF0YSBpbiB0aGUgcGFja2V0cywKKwkgKiBzbyB0aGF0J3MgLSgtY29tcHV0ZWRfc3VtIC0gc3VtKSwgb3IgKHN1bSArIGNvbXB1dGVkX3N1bSkuCisJICoKKwkgKiBBbGwgdGhlIGFyaXRobWV0aWMgaW4gcXVlc3Rpb24gaXMgb25lJ3MgY29tcGxlbWVudCwgc28gdGhlCisJICogYWRkaXRpb24gbXVzdCBpbmNsdWRlIGFuIGVuZC1hcm91bmQgY2Fycnk7IHdlIGRvIHRoaXMgYnkKKwkgKiBkb2luZyB0aGUgYXJpdGhtZXRpYyBpbiAzMiBiaXRzICh3aXRoIG5vIHNpZ24tZXh0ZW5zaW9uKSwKKwkgKiBhbmQgdGhlbiBhZGRpbmcgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIHN1bSwgd2hpY2ggY29udGFpbgorCSAqIHRoZSBjYXJyeSwgdG8gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHN1bSwgYW5kIHRoZW4gZG8gaXQKKwkgKiBhZ2FpbiBpbiBjYXNlICp0aGF0KiBzdW0gcHJvZHVjZWQgYSBjYXJyeS4KKwkgKgorCSAqIEFzIFJGQyAxMDcxIG5vdGVzLCB0aGUgY2hlY2tzdW0gY2FuIGJlIGNvbXB1dGVkIHdpdGhvdXQKKwkgKiBieXRlLXN3YXBwaW5nIHRoZSAxNi1iaXQgd29yZHM7IHN1bW1pbmcgMTYtYml0IHdvcmRzCisJICogb24gYSBiaWctZW5kaWFuIG1hY2hpbmUgZ2l2ZXMgYSBiaWctZW5kaWFuIGNoZWNrc3VtLCB3aGljaAorCSAqIGNhbiBiZSBkaXJlY3RseSBzdHVmZmVkIGludG8gdGhlIGJpZy1lbmRpYW4gY2hlY2tzdW0gZmllbGRzCisJICogaW4gcHJvdG9jb2wgaGVhZGVycywgYW5kIHN1bW1pbmcgd29yZHMgb24gYSBsaXR0bGUtZW5kaWFuCisJICogbWFjaGluZSBnaXZlcyBhIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0sIHdoaWNoIG11c3QgYmUKKwkgKiBieXRlLXN3YXBwZWQgYmVmb3JlIGJlaW5nIHN0dWZmZWQgaW50byBhIGJpZy1lbmRpYW4gY2hlY2tzdW0KKwkgKiBmaWVsZC4KKwkgKgorCSAqICJjb21wdXRlZF9zdW0iIGlzIGEgbmV0d29yay1ieXRlLW9yZGVyIHZhbHVlLCBzbyB3ZSBtdXN0IHB1dAorCSAqIGl0IGluIGhvc3QgYnl0ZSBvcmRlciBiZWZvcmUgc3VidHJhY3RpbmcgaXQgZnJvbSB0aGUKKwkgKiBob3N0LWJ5dGUtb3JkZXIgdmFsdWUgZnJvbSB0aGUgaGVhZGVyOyB0aGUgYWRqdXN0ZWQgY2hlY2tzdW0KKwkgKiB3aWxsIGJlIGluIGhvc3QgYnl0ZSBvcmRlciwgd2hpY2ggaXMgd2hhdCB3ZSdsbCByZXR1cm4uCisJICovCisJc2hvdWxkYmUgPSBzdW07CisJc2hvdWxkYmUgKz0gbnRvaHMoY29tcHV0ZWRfc3VtKTsKKwlzaG91bGRiZSA9IChzaG91bGRiZSAmIDB4RkZGRikgKyAoc2hvdWxkYmUgPj4gMTYpOworCXNob3VsZGJlID0gKHNob3VsZGJlICYgMHhGRkZGKSArIChzaG91bGRiZSA+PiAxNik7CisJcmV0dXJuIHNob3VsZGJlOworfQorCisjZGVmaW5lIElQX1JFUyAweDgwMDAKKworc3RhdGljIHN0cnVjdCB0b2sgaXBfZnJhZ192YWx1ZXNbXSA9IHsKKyAgICAgICAgeyBJUF9NRiwgICAgICAgICIrIiB9LAorICAgICAgICB7IElQX0RGLCAgICAgICAgIkRGIiB9LAorCXsgSVBfUkVTLCAgICAgICAicnN2ZCIgfSwgLyogVGhlIFJGQzM1MTQgZXZpbCA7LSkgYml0ICovCisgICAgICAgIHsgMCwgICAgICAgICAgICBOVUxMIH0KK307CisKK3N0cnVjdCBpcF9wcmludF9kZW11eF9zdGF0ZSB7CisJY29uc3Qgc3RydWN0IGlwICppcDsKKwljb25zdCB1X2NoYXIgKmNwOworCXVfaW50ICAgbGVuLCBvZmY7CisJdV9jaGFyICBuaDsKKwlpbnQgICAgIGFkdmFuY2U7Cit9OworCitzdGF0aWMgdm9pZAoraXBfcHJpbnRfZGVtdXgobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJICAgICAgIHN0cnVjdCBpcF9wcmludF9kZW11eF9zdGF0ZSAqaXBkcykKK3sKKwlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOworCithZ2FpbjoKKwlzd2l0Y2ggKGlwZHMtPm5oKSB7CisKKwljYXNlIElQUFJPVE9fQUg6CisJCWlwZHMtPm5oID0gKmlwZHMtPmNwOworCQlpcGRzLT5hZHZhbmNlID0gYWhfcHJpbnQoaXBkcy0+Y3ApOworCQlpZiAoaXBkcy0+YWR2YW5jZSA8PSAwKQorCQkJYnJlYWs7CisJCWlwZHMtPmNwICs9IGlwZHMtPmFkdmFuY2U7CisJCWlwZHMtPmxlbiAtPSBpcGRzLT5hZHZhbmNlOworCQlnb3RvIGFnYWluOworCisJY2FzZSBJUFBST1RPX0VTUDoKKwl7CisJCWludCBlbmgsIHBhZGxlbjsKKwkJaXBkcy0+YWR2YW5jZSA9IGVzcF9wcmludChuZG8sIGlwZHMtPmNwLCBpcGRzLT5sZW4sCisJCQkJICAgIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwKKwkJCQkgICAgJmVuaCwgJnBhZGxlbik7CisJCWlmIChpcGRzLT5hZHZhbmNlIDw9IDApCisJCQlicmVhazsKKwkJaXBkcy0+Y3AgKz0gaXBkcy0+YWR2YW5jZTsKKwkJaXBkcy0+bGVuIC09IGlwZHMtPmFkdmFuY2UgKyBwYWRsZW47CisJCWlwZHMtPm5oID0gZW5oICYgMHhmZjsKKwkJZ290byBhZ2FpbjsKKwl9CisJCisJY2FzZSBJUFBST1RPX0lQQ09NUDoKKwl7CisJCWludCBlbmg7CisJCWlwZHMtPmFkdmFuY2UgPSBpcGNvbXBfcHJpbnQoaXBkcy0+Y3AsICZlbmgpOworCQlpZiAoaXBkcy0+YWR2YW5jZSA8PSAwKQorCQkJYnJlYWs7CisJCWlwZHMtPmNwICs9IGlwZHMtPmFkdmFuY2U7CisJCWlwZHMtPmxlbiAtPSBpcGRzLT5hZHZhbmNlOworCQlpcGRzLT5uaCA9IGVuaCAmIDB4ZmY7CisJCWdvdG8gYWdhaW47CisJfQorCisJY2FzZSBJUFBST1RPX1NDVFA6CisJCXNjdHBfcHJpbnQoaXBkcy0+Y3AsIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwgaXBkcy0+bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fRENDUDoKKwkJZGNjcF9wcmludChpcGRzLT5jcCwgKGNvbnN0IHVfY2hhciAqKWlwZHMtPmlwLCBpcGRzLT5sZW4pOworCQlicmVhazsKKwkJCisJY2FzZSBJUFBST1RPX1RDUDoKKwkJLyogcGFzcyBvbiB0aGUgTUYgYml0IHBsdXMgdGhlIG9mZnNldCB0byBkZXRlY3QgZnJhZ21lbnRzICovCisJCXRjcF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXAsCisJCQkgIGlwZHMtPm9mZiAmIChJUF9NRnxJUF9PRkZNQVNLKSk7CisJCWJyZWFrOworCQkKKwljYXNlIElQUFJPVE9fVURQOgorCQkvKiBwYXNzIG9uIHRoZSBNRiBiaXQgcGx1cyB0aGUgb2Zmc2V0IHRvIGRldGVjdCBmcmFnbWVudHMgKi8KKwkJdWRwX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4sIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwKKwkJCSAgaXBkcy0+b2ZmICYgKElQX01GfElQX09GRk1BU0spKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVBQUk9UT19JQ01QOgorCQkvKiBwYXNzIG9uIHRoZSBNRiBiaXQgcGx1cyB0aGUgb2Zmc2V0IHRvIGRldGVjdCBmcmFnbWVudHMgKi8KKwkJaWNtcF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXAsCisJCQkgICBpcGRzLT5vZmYgJiAoSVBfTUZ8SVBfT0ZGTUFTSykpOworCQlicmVhazsKKwkJCisJY2FzZSBJUFBST1RPX1BJR1A6CisJCS8qCisJCSAqIFhYWCAtIHRoZSBjdXJyZW50IElBTkEgcHJvdG9jb2wgbnVtYmVyIGFzc2lnbm1lbnRzCisJCSAqIHBhZ2UgbGlzdHMgOSBhcyAiYW55IHByaXZhdGUgaW50ZXJpb3IgZ2F0ZXdheQorCQkgKiAodXNlZCBieSBDaXNjbyBmb3IgdGhlaXIgSUdSUCkiIGFuZCA4OCBhcworCQkgKiAiRUlHUlAiIGZyb20gQ2lzY28uCisJCSAqCisJCSAqIFJlY2VudCBCU0QgPG5ldGluZXQvaW4uaD4gaGVhZGVycyBkZWZpbmUKKwkJICogSVBfUFJPVE9fUElHUCBhcyA5IGFuZCBJUF9QUk9UT19JR1JQIGFzIDg4LgorCQkgKiBXZSBkZWZpbmUgSVBfUFJPVE9fUElHUCBhcyA5IGFuZAorCQkgKiBJUF9QUk9UT19FSUdSUCBhcyA4ODsgdGhvc2UgbmFtZXMgYmV0dGVyCisJCSAqIG1hdGNoIHdhcyB0aGUgY3VycmVudCBwcm90b2NvbCBudW1iZXIKKwkJICogYXNzaWdubWVudHMgc2F5LgorCQkgKi8KKwkJaWdycF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXApOworCQlicmVhazsKKwkJCisJY2FzZSBJUFBST1RPX0VJR1JQOgorCQllaWdycF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgSVBQUk9UT19ORDoKKwkJTkRfUFJJTlQoKG5kbywgIiBuZCAlZCIsIGlwZHMtPmxlbikpOworCQlicmVhazsKKworCWNhc2UgSVBQUk9UT19FR1A6CisJCWVncF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fT1NQRjoKKwkJb3NwZl9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXApOworCQlicmVhazsKKworCWNhc2UgSVBQUk9UT19JR01QOgorCQlpZ21wX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4pOworCQlicmVhazsKKworCWNhc2UgSVBQUk9UT19JUFY0OgorCQkvKiBEVk1SUCBtdWx0aWNhc3QgdHVubmVsIChpcC1pbi1pcCBlbmNhcHN1bGF0aW9uKSAqLworCQlpcF9wcmludChnbmRvLCBpcGRzLT5jcCwgaXBkcy0+bGVuKTsKKwkJaWYgKCEgdmZsYWcpIHsKKwkJCU5EX1BSSU5UKChuZG8sICIgKGlwaXAtcHJvdG8tNCkiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJCQorI2lmZGVmIElORVQ2CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCS8qIGlwNi1pbi1pcCBlbmNhcHN1bGF0aW9uICovCisJCWlwNl9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKKwkJYnJlYWs7CisjZW5kaWYgLypJTkVUNiovCisKKwljYXNlIElQUFJPVE9fUlNWUDoKKwkJcnN2cF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fR1JFOgorCQkvKiBkbyBpdCAqLworCQlncmVfcHJpbnQoaXBkcy0+Y3AsIGlwZHMtPmxlbik7CisJCWJyZWFrOworCisJY2FzZSBJUFBST1RPX01PQklMRToKKwkJbW9iaWxlX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4pOworCQlicmVhazsKKworCWNhc2UgSVBQUk9UT19QSU06CisJCXBpbV9wcmludChpcGRzLT5jcCwgIGlwZHMtPmxlbik7CisJCWJyZWFrOworCisJY2FzZSBJUFBST1RPX1ZSUlA6CisJCXZycnBfcHJpbnQoaXBkcy0+Y3AsIGlwZHMtPmxlbiwgaXBkcy0+aXAtPmlwX3R0bCk7CisJCWJyZWFrOworCisJY2FzZSBJUFBST1RPX1BHTToKKwkJcGdtX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4sIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKChwcm90byA9IGdldHByb3RvYnludW1iZXIoaXBkcy0+bmgpKSAhPSBOVUxMKQorCQkJTkRfUFJJTlQoKG5kbywgIiAlcyIsIHByb3RvLT5wX25hbWUpKTsKKwkJZWxzZQorCQkJTkRfUFJJTlQoKG5kbywgIiBpcC1wcm90by0lZCIsIGlwZHMtPm5oKSk7CisJCU5EX1BSSU5UKChuZG8sICIgJWQiLCBpcGRzLT5sZW4pKTsKKwkJYnJlYWs7CisJfQorfQorCSAgICAgICAKK3ZvaWQKK2lwX3ByaW50X2lubmVyKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCSAgICAgICBjb25zdCB1X2NoYXIgKmJwLAorCSAgICAgICB1X2ludCBsZW5ndGgsIHVfaW50IG5oLAorCSAgICAgICBjb25zdCB1X2NoYXIgKmJwMikKK3sKKwlzdHJ1Y3QgaXBfcHJpbnRfZGVtdXhfc3RhdGUgIGlwZDsKKworCWlwZC5pcCA9IChjb25zdCBzdHJ1Y3QgaXAgKilicDI7CisJaXBkLmNwID0gYnA7CisJaXBkLmxlbiAgPSBsZW5ndGg7CisJaXBkLm9mZiAgPSAwOworCWlwZC5uaCAgID0gbmg7CisJaXBkLmFkdmFuY2UgPSAwOworCisJaXBfcHJpbnRfZGVtdXgobmRvLCAmaXBkKTsKK30KKworCisvKgorICogcHJpbnQgYW4gSVAgZGF0YWdyYW0uCisgKi8KK3ZvaWQKK2lwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAorCSBjb25zdCB1X2NoYXIgKmJwLAorCSB1X2ludCBsZW5ndGgpCit7CisJc3RydWN0IGlwX3ByaW50X2RlbXV4X3N0YXRlICBpcGQ7CisJc3RydWN0IGlwX3ByaW50X2RlbXV4X3N0YXRlICppcGRzPSZpcGQ7CisJY29uc3QgdV9jaGFyICppcGVuZDsKKwl1X2ludCBobGVuOworCXVfaW50MTZfdCBzdW0sIGlwX3N1bTsKKwlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOworCisJaXBkcy0+aXAgPSAoY29uc3Qgc3RydWN0IGlwICopYnA7CisJaWYgKElQX1YoaXBkcy0+aXApICE9IDQpIHsgLyogcHJpbnQgdmVyc2lvbiBpZiAhPSA0ICovCisJICAgIHByaW50ZigiSVAldSAiLCBJUF9WKGlwZHMtPmlwKSk7CisJICAgIGlmIChJUF9WKGlwZHMtPmlwKSA9PSA2KQorCQlwcmludGYoIiwgd3JvbmcgbGluay1sYXllciBlbmNhcHN1bGF0aW9uIik7CisJfQorICAgICAgICBlbHNlIGlmICghZWZsYWcpCisJICAgIHByaW50ZigiSVAgIik7CisKKwlpZiAoKHVfY2hhciAqKShpcGRzLT5pcCArIDEpID4gc25hcGVuZCkgeworCQlwcmludGYoIlt8aXBdIik7CisJCXJldHVybjsKKwl9CisJaWYgKGxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGlwKSkgeworCQkodm9pZClwcmludGYoInRydW5jYXRlZC1pcCAldSIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisJaGxlbiA9IElQX0hMKGlwZHMtPmlwKSAqIDQ7CisJaWYgKGhsZW4gPCBzaXplb2YgKHN0cnVjdCBpcCkpIHsKKwkJKHZvaWQpcHJpbnRmKCJiYWQtaGxlbiAldSIsIGhsZW4pOworCQlyZXR1cm47CisJfQorCisJaXBkcy0+bGVuID0gRVhUUkFDVF8xNkJJVFMoJmlwZHMtPmlwLT5pcF9sZW4pOworCWlmIChsZW5ndGggPCBpcGRzLT5sZW4pCisJCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwIC0gJXUgYnl0ZXMgbWlzc2luZyEgIiwKKwkJCWlwZHMtPmxlbiAtIGxlbmd0aCk7CisJaWYgKGlwZHMtPmxlbiA8IGhsZW4pIHsKKyNpZmRlZiBHVUVTU19UU08KKyAgICAgICAgICAgIGlmIChpcGRzLT5sZW4pIHsKKyAgICAgICAgICAgICAgICAodm9pZClwcmludGYoImJhZC1sZW4gJXUiLCBpcGRzLT5sZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHdlIGd1ZXNzIHRoYXQgaXQgaXMgYSBUU08gc2VuZCAqLworICAgICAgICAgICAgICAgIGlwZHMtPmxlbiA9IGxlbmd0aDsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAodm9pZClwcmludGYoImJhZC1sZW4gJXUiLCBpcGRzLT5sZW4pOworICAgICAgICAgICAgcmV0dXJuOworI2VuZGlmIC8qIEdVRVNTX1RTTyAqLworCX0KKworCS8qCisJICogQ3V0IG9mZiB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIHRoZSBlbmQgb2YgdGhlIElQIHBheWxvYWQuCisJICovCisJaXBlbmQgPSBicCArIGlwZHMtPmxlbjsKKwlpZiAoaXBlbmQgPCBzbmFwZW5kKQorCQlzbmFwZW5kID0gaXBlbmQ7CisKKwlpcGRzLT5sZW4gLT0gaGxlbjsKKworCWlwZHMtPm9mZiA9IEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfb2ZmKTsKKworICAgICAgICBpZiAodmZsYWcpIHsKKyAgICAgICAgICAgICh2b2lkKXByaW50ZigiKHRvcyAweCV4IiwgKGludClpcGRzLT5pcC0+aXBfdG9zKTsKKyAgICAgICAgICAgIC8qIEVDTiBiaXRzICovCisgICAgICAgICAgICBpZiAoaXBkcy0+aXAtPmlwX3RvcyAmIDB4MDMpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGlwZHMtPmlwLT5pcF90b3MgJiAweDAzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixFQ1QoMSkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixFQ1QoMCkiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixDRSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlwZHMtPmlwLT5pcF90dGwgPj0gMSkKKyAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiwgdHRsICV1IiwgaXBkcy0+aXAtPmlwX3R0bCk7ICAgIAorCisJICAgIC8qCisJICAgICAqIGZvciB0aGUgZmlyZXdhbGwgZ3V5cywgcHJpbnQgaWQsIG9mZnNldC4KKyAgICAgICAgICAgICAqIE9uIGFsbCBidXQgdGhlIGxhc3Qgc3RpY2sgYSAiKyIgaW4gdGhlIGZsYWdzIHBvcnRpb24uCisJICAgICAqIEZvciB1bmZyYWdtZW50ZWQgZGF0YWdyYW1zLCBub3RlIHRoZSBkb24ndCBmcmFnbWVudCBmbGFnLgorCSAgICAgKi8KKworCSAgICAodm9pZClwcmludGYoIiwgaWQgJXUsIG9mZnNldCAldSwgZmxhZ3MgWyVzXSwgcHJvdG8gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmlwZHMtPmlwLT5pcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlwZHMtPm9mZiAmIDB4MWZmZikgKiA4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoaXBfZnJhZ192YWx1ZXMsICJub25lIiwgaXBkcy0+b2ZmJjB4ZTAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpcHByb3RvX3ZhbHVlcywidW5rbm93biIsaXBkcy0+aXAtPmlwX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwZHMtPmlwLT5pcF9wKTsKKworICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIGxlbmd0aCAldSIsIEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfbGVuKSk7CisKKyAgICAgICAgICAgIGlmICgoaGxlbiAtIHNpemVvZihzdHJ1Y3QgaXApKSA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgb3B0aW9ucyAoIik7CisgICAgICAgICAgICAgICAgaXBfb3B0cHJpbnQoKHVfY2hhciAqKShpcGRzLT5pcCArIDEpLCBobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiKSIpOworICAgICAgICAgICAgfQorCisJICAgIGlmICgodV9jaGFyICopaXBkcy0+aXAgKyBobGVuIDw9IHNuYXBlbmQpIHsKKwkgICAgICAgIHN1bSA9IGluX2Nrc3VtKChjb25zdCB1X3Nob3J0ICopaXBkcy0+aXAsIGhsZW4sIDApOworCQlpZiAoc3VtICE9IDApIHsKKwkJICAgIGlwX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfc3VtKTsKKwkJICAgICh2b2lkKXByaW50ZigiLCBiYWQgY2tzdW0gJXggKC0+JXgpISIsIGlwX3N1bSwKKwkJCSAgICAgaW5fY2tzdW1fc2hvdWxkYmUoaXBfc3VtLCBzdW0pKTsKKwkJfQorCSAgICB9CisKKyAgICAgICAgICAgIHByaW50ZigiKSAiKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgZnJhZ21lbnQgemVybywgaGFuZCBpdCB0byB0aGUgbmV4dCBoaWdoZXIKKwkgKiBsZXZlbCBwcm90b2NvbC4KKwkgKi8KKwlpZiAoKGlwZHMtPm9mZiAmIDB4MWZmZikgPT0gMCkgeworCQlpcGRzLT5jcCA9IChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCArIGhsZW47CisJCWlwZHMtPm5oID0gaXBkcy0+aXAtPmlwX3A7CisKKwkJaWYgKGlwZHMtPm5oICE9IElQUFJPVE9fVENQICYmIGlwZHMtPm5oICE9IElQUFJPVE9fVURQICYmCisJCSAgICBpcGRzLT5uaCAhPSBJUFBST1RPX1NDVFAgJiYgaXBkcy0+bmggIT0gSVBQUk9UT19EQ0NQKSB7CisJCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsCisJCQkJICAgICBpcGFkZHJfc3RyaW5nKCZpcGRzLT5pcC0+aXBfc3JjKSwKKwkJCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwZHMtPmlwLT5pcF9kc3QpKTsKKwkJfQorCQlpcF9wcmludF9kZW11eChuZG8sIGlwZHMpOworCX0gZWxzZSB7CisJICAgIC8qIFVsdHJhIHF1aWV0IG5vdyBtZWFucyB0aGF0IGFsbCB0aGlzIHN0dWZmIHNob3VsZCBiZSBzdXBwcmVzc2VkICovCisJICAgIGlmIChxZmxhZyA+IDEpIHJldHVybjsKKworCSAgICAvKgorCSAgICAgKiBpZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBmcmFnLCB3ZSdyZSBtaXNzaW5nIHRoZQorCSAgICAgKiBuZXh0IGxldmVsIHByb3RvY29sIGhlYWRlci4gIHByaW50IHRoZSBpcCBhZGRyCisJICAgICAqIGFuZCB0aGUgcHJvdG9jb2wuCisJICAgICAqLworCSAgICBpZiAoaXBkcy0+b2ZmICYgMHgxZmZmKSB7CisJICAgICAgICAodm9pZClwcmludGYoIiVzID4gJXM6IiwgaXBhZGRyX3N0cmluZygmaXBkcy0+aXAtPmlwX3NyYyksCisJCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwZHMtPmlwLT5pcF9kc3QpKTsKKwkJaWYgKChwcm90byA9IGdldHByb3RvYnludW1iZXIoaXBkcy0+aXAtPmlwX3ApKSAhPSBOVUxMKQorCQkgICAgKHZvaWQpcHJpbnRmKCIgJXMiLCBwcm90by0+cF9uYW1lKTsKKwkJZWxzZQorCQkgICAgKHZvaWQpcHJpbnRmKCIgaXAtcHJvdG8tJWQiLCBpcGRzLT5pcC0+aXBfcCk7CisJICAgIH0gCisJfQorfQorCit2b2lkCitpcE5fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQoreworCXN0cnVjdCBpcCAqaXAsIGhkcjsKKworCWlwID0gKHN0cnVjdCBpcCAqKWJwOworCWlmIChsZW5ndGggPCA0KSB7CisJCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwICVkIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKwltZW1jcHkgKCZoZHIsIChjaGFyICopaXAsIDQpOworCXN3aXRjaCAoSVBfVigmaGRyKSkgeworCWNhc2UgNDoKKwkJaXBfcHJpbnQgKGduZG8sIGJwLCBsZW5ndGgpOworCQlyZXR1cm47CisjaWZkZWYgSU5FVDYKKwljYXNlIDY6CisJCWlwNl9wcmludCAoYnAsIGxlbmd0aCk7CisJCXJldHVybjsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCSh2b2lkKXByaW50ZigidW5rbm93biBpcCAlZCIsIElQX1YoJmhkcikpOworCQlyZXR1cm47CisJfQorfQorCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLworCisKZGlmZiAtLWdpdCBhL3ByaW50LWlwNi5jIGIvcHJpbnQtaXA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllNTk4OAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWlwNi5jCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXA2LmMsdiAxLjQ3LjIuNSAyMDA3LzA5LzIxIDA3OjA3OjUyIGhhbm5lcyBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSU5FVDYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImlwNi5oIgorI2luY2x1ZGUgImlwcHJvdG8uaCIKKworLyoKKyAqIHByaW50IGFuIElQNiBkYXRhZ3JhbS4KKyAqLwordm9pZAoraXA2X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OworCXJlZ2lzdGVyIGludCBhZHZhbmNlOworCXVfaW50IGxlbjsKKwljb25zdCB1X2NoYXIgKmlwZW5kOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3A7CisJcmVnaXN0ZXIgdV9pbnQgcGF5bG9hZF9sZW47CisJaW50IG5oOworCWludCBmcmFnbWVudGVkID0gMDsKKwl1X2ludCBmbG93OworCisJaXA2ID0gKGNvbnN0IHN0cnVjdCBpcDZfaGRyICopYnA7CisKKwlUQ0hFQ0soKmlwNik7CisJaWYgKGxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGlwNl9oZHIpKSB7CisJCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwNiAldSIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKyAgICAgICAgaWYgKCFlZmxhZykKKyAgICAgICAgICAgIHByaW50ZigiSVA2ICIpOworCisJcGF5bG9hZF9sZW4gPSBFWFRSQUNUXzE2QklUUygmaXA2LT5pcDZfcGxlbik7CisJbGVuID0gcGF5bG9hZF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwNl9oZHIpOworCWlmIChsZW5ndGggPCBsZW4pCisJCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwNiAtICV1IGJ5dGVzIG1pc3NpbmchIiwKKwkJCWxlbiAtIGxlbmd0aCk7CisKKyAgICAgICAgaWYgKHZmbGFnKSB7CisgICAgICAgICAgICBmbG93ID0gRVhUUkFDVF8zMkJJVFMoJmlwNi0+aXA2X2Zsb3cpOworICAgICAgICAgICAgcHJpbnRmKCIoIik7CisjaWYgMAorICAgICAgICAgICAgLyogcmZjMTg4MyAqLworICAgICAgICAgICAgaWYgKGZsb3cgJiAweDBmMDAwMDAwKQorCQkodm9pZClwcmludGYoInByaSAweCUwMngsICIsIChmbG93ICYgMHgwZjAwMDAwMCkgPj4gMjQpOworICAgICAgICAgICAgaWYgKGZsb3cgJiAweDAwZmZmZmZmKQorCQkodm9pZClwcmludGYoImZsb3dsYWJlbCAweCUwNngsICIsIGZsb3cgJiAweDAwZmZmZmZmKTsKKyNlbHNlCisgICAgICAgICAgICAvKiBSRkMgMjQ2MCAqLworICAgICAgICAgICAgaWYgKGZsb3cgJiAweDBmZjAwMDAwKQorCQkodm9pZClwcmludGYoImNsYXNzIDB4JTAyeCwgIiwgKGZsb3cgJiAweDBmZjAwMDAwKSA+PiAyMCk7CisgICAgICAgICAgICBpZiAoZmxvdyAmIDB4MDAwZmZmZmYpCisJCSh2b2lkKXByaW50ZigiZmxvd2xhYmVsIDB4JTA1eCwgIiwgZmxvdyAmIDB4MDAwZmZmZmYpOworI2VuZGlmCisKKyAgICAgICAgICAgICh2b2lkKXByaW50ZigiaGxpbSAldSwgbmV4dC1oZWFkZXIgJXMgKCV1KSBwYXlsb2FkIGxlbmd0aDogJXUpICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXA2LT5pcDZfaGxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGlwcHJvdG9fdmFsdWVzLCJ1bmtub3duIixpcDYtPmlwNl9ueHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlwNi0+aXA2X254dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX2xlbik7CisgICAgICAgIH0KKworCS8qCisJICogQ3V0IG9mZiB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIHRoZSBlbmQgb2YgdGhlIElQIHBheWxvYWQuCisJICovCisJaXBlbmQgPSBicCArIGxlbjsKKwlpZiAoaXBlbmQgPCBzbmFwZW5kKQorCQlzbmFwZW5kID0gaXBlbmQ7CisKKwljcCA9IChjb25zdCB1X2NoYXIgKilpcDY7CisJYWR2YW5jZSA9IHNpemVvZihzdHJ1Y3QgaXA2X2hkcik7CisJbmggPSBpcDYtPmlwNl9ueHQ7CisJd2hpbGUgKGNwIDwgc25hcGVuZCAmJiBhZHZhbmNlID4gMCkgeworCQljcCArPSBhZHZhbmNlOworCQlsZW4gLT0gYWR2YW5jZTsKKworCQlpZiAoY3AgPT0gKGNvbnN0IHVfY2hhciAqKShpcDYgKyAxKSAmJgorCQkgICAgbmggIT0gSVBQUk9UT19UQ1AgJiYgbmggIT0gSVBQUk9UT19VRFAgJiYKKwkJICAgIG5oICE9IElQUFJPVE9fRENDUCAmJiBuaCAhPSBJUFBST1RPX1NDVFApIHsKKwkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCisJCQkJICAgICBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSk7CisJCX0KKworCQlzd2l0Y2ggKG5oKSB7CisJCWNhc2UgSVBQUk9UT19IT1BPUFRTOgorCQkJYWR2YW5jZSA9IGhiaG9wdF9wcmludChjcCk7CisJCQluaCA9ICpjcDsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fRFNUT1BUUzoKKwkJCWFkdmFuY2UgPSBkc3RvcHRfcHJpbnQoY3ApOworCQkJbmggPSAqY3A7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX0ZSQUdNRU5UOgorCQkJYWR2YW5jZSA9IGZyYWc2X3ByaW50KGNwLCAoY29uc3QgdV9jaGFyICopaXA2KTsKKwkJCWlmIChzbmFwZW5kIDw9IGNwICsgYWR2YW5jZSkKKwkJCQlyZXR1cm47CisJCQluaCA9ICpjcDsKKwkJCWZyYWdtZW50ZWQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUFBST1RPX01PQklMSVRZX09MRDoKKwkJY2FzZSBJUFBST1RPX01PQklMSVRZOgorCQkJLyoKKwkJCSAqIFhYWCAtIHdlIGRvbid0IHVzZSAiYWR2YW5jZSI7IHRoZSBjdXJyZW50CisJCQkgKiAiTW9iaWxpdHkgU3VwcG9ydCBpbiBJUHY2IiBkcmFmdAorCQkJICogKGRyYWZ0LWlldGYtbW9iaWxlaXAtaXB2Ni0yNCkgc2F5cyB0aGF0CisJCQkgKiB0aGUgbmV4dCBoZWFkZXIgZmllbGQgaW4gYSBtb2JpbGl0eSBoZWFkZXIKKwkJCSAqIHNob3VsZCBiZSBJUFBST1RPX05PTkUsIGJ1dCBzcGVha3Mgb2YKKwkJCSAqIHRoZSBwb3NzaWJsaXR5IG9mIGEgZnV0dXJlIGV4dGVuc2lvbiBpbgorCQkJICogd2hpY2ggcGF5bG9hZCBjYW4gYmUgcGlnZ3liYWNrZWQgYXRvcCBhCisJCQkgKiBtb2JpbGl0eSBoZWFkZXIuCisJCQkgKi8KKwkJCWFkdmFuY2UgPSBtb2JpbGl0eV9wcmludChjcCwgKGNvbnN0IHVfY2hhciAqKWlwNik7CisJCQluaCA9ICpjcDsKKwkJCXJldHVybjsKKwkJY2FzZSBJUFBST1RPX1JPVVRJTkc6CisJCQlhZHZhbmNlID0gcnQ2X3ByaW50KGNwLCAoY29uc3QgdV9jaGFyICopaXA2KTsKKwkJCW5oID0gKmNwOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19TQ1RQOgorCQkJc2N0cF9wcmludChjcCwgKGNvbnN0IHVfY2hhciAqKWlwNiwgbGVuKTsKKwkJCXJldHVybjsKKwkJY2FzZSBJUFBST1RPX0RDQ1A6CisJCQlkY2NwX3ByaW50KGNwLCAoY29uc3QgdV9jaGFyICopaXA2LCBsZW4pOworCQkJcmV0dXJuOworCQljYXNlIElQUFJPVE9fVENQOgorCQkJdGNwX3ByaW50KGNwLCBsZW4sIChjb25zdCB1X2NoYXIgKilpcDYsIGZyYWdtZW50ZWQpOworCQkJcmV0dXJuOworCQljYXNlIElQUFJPVE9fVURQOgorCQkJdWRwX3ByaW50KGNwLCBsZW4sIChjb25zdCB1X2NoYXIgKilpcDYsIGZyYWdtZW50ZWQpOworCQkJcmV0dXJuOworCQljYXNlIElQUFJPVE9fSUNNUFY2OgorCQkJaWNtcDZfcHJpbnQoY3AsIGxlbiwgKGNvbnN0IHVfY2hhciAqKWlwNiwgZnJhZ21lbnRlZCk7CisJCQlyZXR1cm47CisJCWNhc2UgSVBQUk9UT19BSDoKKwkJCWFkdmFuY2UgPSBhaF9wcmludChjcCk7CisJCQluaCA9ICpjcDsKKwkJCWJyZWFrOworCQljYXNlIElQUFJPVE9fRVNQOgorCQkgICAgeworCQkJaW50IGVuaCwgcGFkbGVuOworCQkJYWR2YW5jZSA9IGVzcF9wcmludChnbmRvLCBjcCwgbGVuLCAoY29uc3QgdV9jaGFyICopaXA2LCAmZW5oLCAmcGFkbGVuKTsKKwkJCW5oID0gZW5oICYgMHhmZjsKKwkJCWxlbiAtPSBwYWRsZW47CisJCQlicmVhazsKKwkJICAgIH0KKwkJY2FzZSBJUFBST1RPX0lQQ09NUDoKKwkJICAgIHsKKwkJCWludCBlbmg7CisJCQlhZHZhbmNlID0gaXBjb21wX3ByaW50KGNwLCAmZW5oKTsKKwkJCW5oID0gZW5oICYgMHhmZjsKKwkJCWJyZWFrOworCQkgICAgfQorCisJCWNhc2UgSVBQUk9UT19QSU06CisJCQlwaW1fcHJpbnQoY3AsIGxlbik7CisJCQlyZXR1cm47CisKKwkJY2FzZSBJUFBST1RPX09TUEY6CisJCQlvc3BmNl9wcmludChjcCwgbGVuKTsKKwkJCXJldHVybjsKKworCQljYXNlIElQUFJPVE9fSVBWNjoKKwkJCWlwNl9wcmludChjcCwgbGVuKTsKKwkJCXJldHVybjsKKworCQljYXNlIElQUFJPVE9fSVBWNDoKKwkJICAgICAgICBpcF9wcmludChnbmRvLCBjcCwgbGVuKTsKKwkJCXJldHVybjsKKworICAgICAgICAgICAgICAgIGNhc2UgSVBQUk9UT19QR006CisgICAgICAgICAgICAgICAgICAgICAgICBwZ21fcHJpbnQoY3AsIGxlbiwgKGNvbnN0IHVfY2hhciAqKWlwNik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKwkJY2FzZSBJUFBST1RPX0dSRToKKwkJCWdyZV9wcmludChjcCwgbGVuKTsKKwkJCXJldHVybjsKKworCQljYXNlIElQUFJPVE9fUlNWUDoKKwkJCXJzdnBfcHJpbnQoY3AsIGxlbik7CisJCQlyZXR1cm47CisKKwkJY2FzZSBJUFBST1RPX05PTkU6CisJCQkodm9pZClwcmludGYoIm5vIG5leHQgaGVhZGVyIik7CisJCQlyZXR1cm47CisKKwkJZGVmYXVsdDoKKwkJCSh2b2lkKXByaW50ZigiaXAtcHJvdG8tJWQgJWQiLCBuaCwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJldHVybjsKK3RydW5jOgorCSh2b2lkKXByaW50ZigiW3xpcDZdIik7Cit9CisKKyNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaXA2b3B0cy5jIGIvcHJpbnQtaXA2b3B0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTYzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pcDZvcHRzLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXA2b3B0cy5jLHYgMS4xNy4yLjEgMjAwNS8wNC8yMCAyMjoxOTowNiBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBJTkVUNgorI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaXA2LmgiCisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisvKiBpdGVtcyBvdXRzaWRlIG9mIHJmYzIyOTJiaXMgKi8KKyNpZm5kZWYgSVA2T1BUX01JTkxFTgorI2RlZmluZSBJUDZPUFRfTUlOTEVOCTIKKyNlbmRpZgorI2lmbmRlZiBJUDZPUFRfUlRBTEVSVF9MRU4KKyNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfTEVOCTQKKyNlbmRpZgorI2lmbmRlZiBJUDZPUFRfSlVNQk9fTEVOCisjZGVmaW5lIElQNk9QVF9KVU1CT19MRU4JNgorI2VuZGlmCisjZGVmaW5lIElQNk9QVF9IT01FQUREUl9NSU5MRU4gMTgKKyNkZWZpbmUgSVA2T1BUX0JVX01JTkxFTiAgICAgICAxMAorI2RlZmluZSBJUDZPUFRfQkFfTUlOTEVOICAgICAgIDEzCisjZGVmaW5lIElQNk9QVF9CUl9NSU5MRU4gICAgICAgIDIKKyNkZWZpbmUgSVA2U09QVF9VSSAgICAgICAgICAgIDB4MgorI2RlZmluZSBJUDZTT1BUX1VJX01JTkxFTiAgICAgICA0CisjZGVmaW5lIElQNlNPUFRfQUxUQ09BICAgICAgICAweDMKKyNkZWZpbmUgSVA2U09QVF9BTFRDT0FfTUlOTEVOICAxOAorI2RlZmluZSBJUDZTT1BUX0FVVEggICAgICAgICAgMHg0CisjZGVmaW5lIElQNlNPUFRfQVVUSF9NSU5MRU4gICAgIDYKKworc3RhdGljIHZvaWQgaXA2X3NvcHRfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7CisKK3N0YXRpYyB2b2lkCitpcDZfc29wdF9wcmludChjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGludCBvcHRsZW47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IG9wdGxlbikgeworCWlmIChicFtpXSA9PSBJUDZPUFRfUEFEMSkKKwkgICAgb3B0bGVuID0gMTsKKwllbHNlIHsKKwkgICAgaWYgKGkgKyAxIDwgbGVuKQorCQlvcHRsZW4gPSBicFtpICsgMV0gKyAyOworCSAgICBlbHNlCisJCWdvdG8gdHJ1bmM7CisJfQorCWlmIChpICsgb3B0bGVuID4gbGVuKQorCSAgICBnb3RvIHRydW5jOworCisJc3dpdGNoIChicFtpXSkgeworCWNhc2UgSVA2T1BUX1BBRDE6CisgICAgICAgICAgICBwcmludGYoIiwgcGFkMSIpOworCSAgICBicmVhazsKKwljYXNlIElQNk9QVF9QQUROOgorCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9NSU5MRU4pIHsKKwkJcHJpbnRmKCIsIHBhZG46IHRydW5jIik7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiLCBwYWRuIik7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIElQNlNPUFRfVUk6CisgICAgICAgICAgICAgaWYgKGxlbiAtIGkgPCBJUDZTT1BUX1VJX01JTkxFTikgeworCQlwcmludGYoIiwgdWk6IHRydW5jIik7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiLCB1aTogMHglMDR4ICIsIEVYVFJBQ1RfMTZCSVRTKCZicFtpICsgMl0pKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVA2U09QVF9BTFRDT0E6CisgICAgICAgICAgICAgaWYgKGxlbiAtIGkgPCBJUDZTT1BUX0FMVENPQV9NSU5MRU4pIHsKKwkJcHJpbnRmKCIsIGFsdGNvYTogdHJ1bmMiKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIsIGFsdC1Db0E6ICVzIiwgaXA2YWRkcl9zdHJpbmcoJmJwW2krMl0pKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVA2U09QVF9BVVRIOgorICAgICAgICAgICAgIGlmIChsZW4gLSBpIDwgSVA2U09QVF9BVVRIX01JTkxFTikgeworCQlwcmludGYoIiwgYXV0aDogdHJ1bmMiKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIsIGF1dGggc3BpOiAweCUwOHgiLCBFWFRSQUNUXzMyQklUUygmYnBbaSArIDJdKSk7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX01JTkxFTikgeworCQlwcmludGYoIiwgc29wdF90eXBlICVkOiB0cnVuYykiLCBicFtpXSk7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgcHJpbnRmKCIsIHNvcHRfdHlwZSAweCUwMng6IGxlbj0lZCIsIGJwW2ldLCBicFtpICsgMV0pOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIHJldHVybjsKKwordHJ1bmM6CisgICAgcHJpbnRmKCJbdHJ1bmNdICIpOworfQorCit2b2lkCitpcDZfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50IG9wdGxlbiA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IG9wdGxlbikgeworCWlmIChicFtpXSA9PSBJUDZPUFRfUEFEMSkKKwkgICAgb3B0bGVuID0gMTsKKwllbHNlIHsKKwkgICAgaWYgKGkgKyAxIDwgbGVuKQorCQlvcHRsZW4gPSBicFtpICsgMV0gKyAyOworCSAgICBlbHNlCisJCWdvdG8gdHJ1bmM7CisJfQorCWlmIChpICsgb3B0bGVuID4gbGVuKQorCSAgICBnb3RvIHRydW5jOworCisJc3dpdGNoIChicFtpXSkgeworCWNhc2UgSVA2T1BUX1BBRDE6CisgICAgICAgICAgICBwcmludGYoIihwYWQxKSIpOworCSAgICBicmVhazsKKwljYXNlIElQNk9QVF9QQUROOgorCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9NSU5MRU4pIHsKKwkJcHJpbnRmKCIocGFkbjogdHJ1bmMpIik7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiKHBhZG4pIik7CisJICAgIGJyZWFrOworCWNhc2UgSVA2T1BUX1JPVVRFUl9BTEVSVDoKKwkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfUlRBTEVSVF9MRU4pIHsKKwkJcHJpbnRmKCIocnRhbGVydDogdHJ1bmMpIik7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgaWYgKGJwW2kgKyAxXSAhPSBJUDZPUFRfUlRBTEVSVF9MRU4gLSAyKSB7CisJCXByaW50ZigiKHJ0YWxlcnQ6IGludmFsaWQgbGVuICVkKSIsIGJwW2kgKyAxXSk7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgcHJpbnRmKCIocnRhbGVydDogMHglMDR4KSAiLCBFWFRSQUNUXzE2QklUUygmYnBbaSArIDJdKSk7CisJICAgIGJyZWFrOworCWNhc2UgSVA2T1BUX0pVTUJPOgorCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9KVU1CT19MRU4pIHsKKwkJcHJpbnRmKCIoanVtYm86IHRydW5jKSIpOworCQlnb3RvIHRydW5jOworCSAgICB9CisJICAgIGlmIChicFtpICsgMV0gIT0gSVA2T1BUX0pVTUJPX0xFTiAtIDIpIHsKKwkJcHJpbnRmKCIoanVtYm86IGludmFsaWQgbGVuICVkKSIsIGJwW2kgKyAxXSk7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgcHJpbnRmKCIoanVtYm86ICV1KSAiLCBFWFRSQUNUXzMyQklUUygmYnBbaSArIDJdKSk7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIElQNk9QVF9IT01FX0FERFJFU1M6CisJICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX0hPTUVBRERSX01JTkxFTikgeworCQlwcmludGYoIihob21lYWRkcjogdHJ1bmMpIik7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgaWYgKGJwW2kgKyAxXSA8IElQNk9QVF9IT01FQUREUl9NSU5MRU4gLSAyKSB7CisJCXByaW50ZigiKGhvbWVhZGRyOiBpbnZhbGlkIGxlbiAlZCkiLCBicFtpICsgMV0pOworCQlnb3RvIHRydW5jOworCSAgICB9CisJICAgIHByaW50ZigiKGhvbWVhZGRyOiAlcyIsIGlwNmFkZHJfc3RyaW5nKCZicFtpICsgMl0pKTsKKyAgICAgICAgICAgIGlmIChicFtpICsgMV0gPiBJUDZPUFRfSE9NRUFERFJfTUlOTEVOIC0gMikgeworCQlpcDZfc29wdF9wcmludCgmYnBbaSArIElQNk9QVF9IT01FQUREUl9NSU5MRU5dLAorCQkgICAgKG9wdGxlbiAtIElQNk9QVF9IT01FQUREUl9NSU5MRU4pKTsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIpIik7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIElQNk9QVF9CSU5ESU5HX1VQREFURToKKwkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfQlVfTUlOTEVOKSB7CisJCXByaW50ZigiKGJ1OiB0cnVuYykiKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorCSAgICBpZiAoYnBbaSArIDFdIDwgSVA2T1BUX0JVX01JTkxFTiAtIDIpIHsKKwkJcHJpbnRmKCIoYnU6IGludmFsaWQgbGVuICVkKSIsIGJwW2kgKyAxXSk7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgcHJpbnRmKCIoYnU6ICIpOworCSAgICBpZiAoYnBbaSArIDJdICYgMHg4MCkKKwkJICAgIHByaW50ZigiQSIpOworCSAgICBpZiAoYnBbaSArIDJdICYgMHg0MCkKKwkJICAgIHByaW50ZigiSCIpOworCSAgICBpZiAoYnBbaSArIDJdICYgMHgyMCkKKwkJICAgIHByaW50ZigiUyIpOworCSAgICBpZiAoYnBbaSArIDJdICYgMHgxMCkKKwkJICAgIHByaW50ZigiRCIpOworCSAgICBpZiAoKGJwW2kgKyAyXSAmIDB4MGYpIHx8IGJwW2kgKyAzXSB8fCBicFtpICsgNF0pCisJCSAgICBwcmludGYoInJlcyIpOworCSAgICBwcmludGYoIiwgc2VxdWVuY2U6ICV1IiwgYnBbaSArIDVdKTsKKwkgICAgcHJpbnRmKCIsIGxpZmV0aW1lOiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZicFtpICsgNl0pKTsKKworCSAgICBpZiAoYnBbaSArIDFdID4gSVA2T1BUX0JVX01JTkxFTiAtIDIpIHsKKwkJaXA2X3NvcHRfcHJpbnQoJmJwW2kgKyBJUDZPUFRfQlVfTUlOTEVOXSwKKwkJICAgIChvcHRsZW4gLSBJUDZPUFRfQlVfTUlOTEVOKSk7CisJICAgIH0KKwkgICAgcHJpbnRmKCIpIik7CisJICAgIGJyZWFrOworCWNhc2UgSVA2T1BUX0JJTkRJTkdfQUNLOgorCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9CQV9NSU5MRU4pIHsKKwkJcHJpbnRmKCIoYmE6IHRydW5jKSIpOworCQlnb3RvIHRydW5jOworCSAgICB9CisJICAgIGlmIChicFtpICsgMV0gPCBJUDZPUFRfQkFfTUlOTEVOIC0gMikgeworCQlwcmludGYoIihiYTogaW52YWxpZCBsZW4gJWQpIiwgYnBbaSArIDFdKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorCSAgICBwcmludGYoIihiYTogIik7CisJICAgIHByaW50Zigic3RhdHVzOiAldSIsIGJwW2kgKyAyXSk7CisJICAgIGlmIChicFtpICsgM10pCisJCSAgICBwcmludGYoInJlcyIpOworCSAgICBwcmludGYoIiwgc2VxdWVuY2U6ICV1IiwgYnBbaSArIDRdKTsKKwkgICAgcHJpbnRmKCIsIGxpZmV0aW1lOiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZicFtpICsgNV0pKTsKKwkgICAgcHJpbnRmKCIsIHJlZnJlc2g6ICV1IiwgRVhUUkFDVF8zMkJJVFMoJmJwW2kgKyA5XSkpOworCisJICAgIGlmIChicFtpICsgMV0gPiBJUDZPUFRfQkFfTUlOTEVOIC0gMikgeworCQlpcDZfc29wdF9wcmludCgmYnBbaSArIElQNk9QVF9CQV9NSU5MRU5dLAorCQkgICAgKG9wdGxlbiAtIElQNk9QVF9CQV9NSU5MRU4pKTsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIpIik7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIElQNk9QVF9CSU5ESU5HX1JFUToKKwkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfQlJfTUlOTEVOKSB7CisJCXByaW50ZigiKGJyOiB0cnVuYykiKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIoYnIiKTsKKyAgICAgICAgICAgIGlmIChicFtpICsgMV0gPiBJUDZPUFRfQlJfTUlOTEVOIC0gMikgeworCQlpcDZfc29wdF9wcmludCgmYnBbaSArIElQNk9QVF9CUl9NSU5MRU5dLAorCQkgICAgKG9wdGxlbiAtIElQNk9QVF9CUl9NSU5MRU4pKTsKKwkgICAgfQorICAgICAgICAgICAgcHJpbnRmKCIpIik7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX01JTkxFTikgeworCQlwcmludGYoIih0eXBlICVkOiB0cnVuYykiLCBicFtpXSk7CisJCWdvdG8gdHJ1bmM7CisJICAgIH0KKwkgICAgcHJpbnRmKCIob3B0X3R5cGUgMHglMDJ4OiBsZW49JWQpICIsIGJwW2ldLCBicFtpICsgMV0pOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisjaWYgMAorZW5kOgorI2VuZGlmCisgICAgcmV0dXJuOworCit0cnVuYzoKKyAgICBwcmludGYoIlt0cnVuY10gIik7Cit9CisKK2ludAoraGJob3B0X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCit7CisgICAgY29uc3Qgc3RydWN0IGlwNl9oYmggKmRwID0gKHN0cnVjdCBpcDZfaGJoICopYnA7CisgICAgaW50IGhiaGxlbiA9IDA7CisKKyAgICBUQ0hFQ0soZHAtPmlwNmhfbGVuKTsKKyAgICBoYmhsZW4gPSAoaW50KSgoZHAtPmlwNmhfbGVuICsgMSkgPDwgMyk7CisgICAgVENIRUNLMigqZHAsIGhiaGxlbik7CisgICAgcHJpbnRmKCJIQkggIik7CisgICAgaWYgKHZmbGFnKQorCWlwNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgc2l6ZW9mKCpkcCksIGhiaGxlbiAtIHNpemVvZigqZHApKTsKKworICAgIHJldHVybihoYmhsZW4pOworCisgIHRydW5jOgorICAgIGZwdXRzKCJbfEhCSF0iLCBzdGRvdXQpOworICAgIHJldHVybigtMSk7Cit9CisKK2ludAorZHN0b3B0X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCit7CisgICAgY29uc3Qgc3RydWN0IGlwNl9kZXN0ICpkcCA9IChzdHJ1Y3QgaXA2X2Rlc3QgKilicDsKKyAgICBpbnQgZHN0b3B0bGVuID0gMDsKKworICAgIFRDSEVDSyhkcC0+aXA2ZF9sZW4pOworICAgIGRzdG9wdGxlbiA9IChpbnQpKChkcC0+aXA2ZF9sZW4gKyAxKSA8PCAzKTsKKyAgICBUQ0hFQ0syKCpkcCwgZHN0b3B0bGVuKTsKKyAgICBwcmludGYoIkRTVE9QVCAiKTsKKyAgICBpZiAodmZsYWcpIHsKKwlpcDZfb3B0X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCArIHNpemVvZigqZHApLAorCSAgICBkc3RvcHRsZW4gLSBzaXplb2YoKmRwKSk7CisgICAgfQorCisgICAgcmV0dXJuKGRzdG9wdGxlbik7CisKKyAgdHJ1bmM6CisgICAgZnB1dHMoIlt8RFNUT1BUXSIsIHN0ZG91dCk7CisgICAgcmV0dXJuKC0xKTsKK30KKyNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaXBjb21wLmMgYi9wcmludC1pcGNvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTllNWFkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtaXBjb21wLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlwY29tcC5jLHYgMS4yMCAyMDAzLzExLzE5IDAwOjM2OjA4IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0cnVjdCBpcGNvbXAgeworCXVfaW50OF90IGNvbXBfbnh0OwkvKiBOZXh0IEhlYWRlciAqLworCXVfaW50OF90IGNvbXBfZmxhZ3M7CS8qIExlbmd0aCBvZiBkYXRhLCBpbiAzMmJpdCAqLworCXVfaW50MTZfdCBjb21wX2NwaTsJLyogQ29tcHJlc3Npb24gcGFyYW1ldGVyIGluZGV4ICovCit9OworCisjaWYgZGVmaW5lZChIQVZFX0xJQlopICYmIGRlZmluZWQoSEFWRV9aTElCX0gpCisjaW5jbHVkZSA8emxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCitpbnQKK2lwY29tcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgKm5oZHIgX1VfKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcGNvbXAgKmlwY29tcDsKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwOworCXVfaW50MTZfdCBjcGk7CisjaWYgZGVmaW5lZChIQVZFX0xJQlopICYmIGRlZmluZWQoSEFWRV9aTElCX0gpCisJaW50IGFkdmFuY2U7CisjZW5kaWYKKworCWlwY29tcCA9IChzdHJ1Y3QgaXBjb21wICopYnA7CisJY3BpID0gRVhUUkFDVF8xNkJJVFMoJmlwY29tcC0+Y29tcF9jcGkpOworCisJLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KKwllcCA9IHNuYXBlbmQ7CisKKwlpZiAoKHVfY2hhciAqKShpcGNvbXAgKyAxKSA+PSBlcCAtIHNpemVvZihzdHJ1Y3QgaXBjb21wKSkgeworCQlmcHV0cygiW3xJUENPTVBdIiwgc3Rkb3V0KTsKKwkJZ290byBmYWlsOworCX0KKwlwcmludGYoIklQQ29tcChjcGk9MHglMDR4KSIsIGNwaSk7CisKKyNpZiBkZWZpbmVkKEhBVkVfTElCWikgJiYgZGVmaW5lZChIQVZFX1pMSUJfSCkKKwlpZiAoMSkKKwkJZ290byBmYWlsOworCisJLyoKKwkgKiBXZSBtYXkgd2FudCB0byBkZWNvbXByZXNzIHRoZSBwYWNrZXQgaGVyZS4gIFBhY2tldCBidWZmZXIKKwkgKiBtYW5hZ2VtZW50IGlzIGEgaGVhZGFjaGUgKGlmIHdlIGRlY29tcHJlc3MsIHBhY2tldCB3aWxsIGJlY29tZQorCSAqIGxhcmdlcikuCisJICovCisJaWYgKG5oZHIpCisJCSpuaGRyID0gaXBjb21wLT5jb21wX254dDsKKwlhZHZhbmNlID0gc2l6ZW9mKHN0cnVjdCBpcGNvbXApOworCisJcHJpbnRmKCI6ICIpOworCXJldHVybiBhZHZhbmNlOworCisjZW5kaWYKK2ZhaWw6CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaXBmYy5jIGIvcHJpbnQtaXBmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MTJlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pcGZjLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pcGZjLmMsdiAxLjcuMi4yIDIwMDUvMTEvMTMgMTI6MTI6NTkgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisKKyNpbmNsdWRlICJldGhlci5oIgorI2luY2x1ZGUgImlwZmMuaCIKKworLyoKKyAqIFJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbC4KKyAqLworCisvKiBFeHRyYWN0IHNyYywgZHN0IGFkZHJlc3NlcyAqLworc3RhdGljIGlubGluZSB2b2lkCitleHRyYWN0X2lwZmNfYWRkcnMoY29uc3Qgc3RydWN0IGlwZmNfaGVhZGVyICppcGZjcCwgY2hhciAqaXBmY3NyYywKKyAgICBjaGFyICppcGZjZHN0KQoreworCS8qCisJICogV2UgYXNzdW1lIHRoYXQsIGFzIHBlciBSRkMgMjYyNSwgdGhlIGxvd2VyIDQ4IGJpdHMgb2YgdGhlCisJICogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIE1BQyBhZGRyZXNzZXMuCisJICovCisJbWVtY3B5KGlwZmNkc3QsIChjb25zdCBjaGFyICopJmlwZmNwLT5pcGZjX2Rob3N0WzJdLCA2KTsKKwltZW1jcHkoaXBmY3NyYywgKGNvbnN0IGNoYXIgKikmaXBmY3AtPmlwZmNfc2hvc3RbMl0sIDYpOworfQorCisvKgorICogUHJpbnQgdGhlIE5ldHdvcmtfSGVhZGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoraXBmY19oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwZmNfaGVhZGVyICppcGZjcCBfVV8sCisJICAgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmlwZmNzcmMsCisJICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICppcGZjZHN0KQoreworCWNvbnN0IGNoYXIgKnNyY25hbWUsICpkc3RuYW1lOworCisJc3JjbmFtZSA9IGV0aGVyYWRkcl9zdHJpbmcoaXBmY3NyYyk7CisJZHN0bmFtZSA9IGV0aGVyYWRkcl9zdHJpbmcoaXBmY2RzdCk7CisKKwkvKgorCSAqIFhYWCAtIHNob3cgdGhlIHVwcGVyIDE2IGJpdHM/ICBEbyBzbyBvbmx5IGlmICJ2ZmxhZyIgaXMgc2V0PworCSAqLworCSh2b2lkKSBwcmludGYoIiVzICVzICVkOiAiLCBzcmNuYW1lLCBkc3RuYW1lLCBsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZAoraXBmY19wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWNvbnN0IHN0cnVjdCBpcGZjX2hlYWRlciAqaXBmY3AgPSAoY29uc3Qgc3RydWN0IGlwZmNfaGVhZGVyICopcDsKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyIGVoZHI7CisJdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOworCisJaWYgKGNhcGxlbiA8IElQRkNfSERSTEVOKSB7CisJCXByaW50ZigiW3xpcGZjXSIpOworCQlyZXR1cm47CisJfQorCS8qCisJICogR2V0IHRoZSBuZXR3b3JrIGFkZHJlc3NlcyBpbnRvIGEgY2Fub25pY2FsIGZvcm0KKwkgKi8KKwlleHRyYWN0X2lwZmNfYWRkcnMoaXBmY3AsIChjaGFyICopRVNSQygmZWhkciksIChjaGFyICopRURTVCgmZWhkcikpOworCisJaWYgKGVmbGFnKQorCQlpcGZjX2hkcl9wcmludChpcGZjcCwgbGVuZ3RoLCBFU1JDKCZlaGRyKSwgRURTVCgmZWhkcikpOworCisJLyogU2tpcCBvdmVyIE5ldHdvcmtfSGVhZGVyICovCisJbGVuZ3RoIC09IElQRkNfSERSTEVOOworCXAgKz0gSVBGQ19IRFJMRU47CisJY2FwbGVuIC09IElQRkNfSERSTEVOOworCisJLyogVHJ5IHRvIHByaW50IHRoZSBMTEMtbGF5ZXIgaGVhZGVyICYgaGlnaGVyIGxheWVycyAqLworCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSwKKwkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApIHsKKwkJLyoKKwkJICogU29tZSBraW5kcyBvZiBMTEMgcGFja2V0IHdlIGNhbm5vdAorCQkgKiBoYW5kbGUgaW50ZWxsaWdlbnRseQorCQkgKi8KKwkJaWYgKCFlZmxhZykKKwkJCWlwZmNfaGRyX3ByaW50KGlwZmNwLCBsZW5ndGggKyBJUEZDX0hEUkxFTiwKKwkJCSAgICBFU1JDKCZlaGRyKSwgRURTVCgmZWhkcikpOworCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgeworCQkJcHJpbnRmKCIoTExDICVzKSAiLAorCQlldGhlcnByb3RvX3N0cmluZyhodG9ucyhleHRyYWN0ZWRfZXRoZXJ0eXBlKSkpOworCQl9CisJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBOZXR3b3JrX0hlYWRlciBvZiB0aGUgcGFja2V0LCAnaC0+dHMnIGlzIHRoZSB0aW1lc3RhbXAsCisgKiAnaC0+bGVuJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb2ZmIHRoZSB3aXJlLCBhbmQgJ2gtPmNhcGxlbicKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgY2FwdHVyZWQuCisgKi8KK3VfaW50CitpcGZjX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworCWlwZmNfcHJpbnQocCwgaC0+bGVuLCBoLT5jYXBsZW4pOworCisJcmV0dXJuIChJUEZDX0hEUkxFTik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1pcHguYyBiL3ByaW50LWlweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pcHguYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZvcm1hdCBhbmQgcHJpbnQgTm92ZWxsIElQWCBwYWNrZXRzLgorICogQ29udHJpYnV0ZWQgYnkgQnJhZCBQYXJrZXIgKGJyYWRAZmNyLmNvbSkuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXB4LmMsdiAxLjQwLjIuMiAyMDA1LzA1LzA2IDA4OjI3OjAwIGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiaXB4LmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisKK3N0YXRpYyBjb25zdCBjaGFyICppcHhhZGRyX3N0cmluZyh1X2ludDMyX3QsIGNvbnN0IHVfY2hhciAqKTsKK3ZvaWQgaXB4X2RlY29kZShjb25zdCBzdHJ1Y3QgaXB4SGRyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Cit2b2lkIGlweF9zYXBfcHJpbnQoY29uc3QgdV9zaG9ydCAqLCB1X2ludCk7Cit2b2lkIGlweF9yaXBfcHJpbnQoY29uc3QgdV9zaG9ydCAqLCB1X2ludCk7CisKKy8qCisgKiBQcmludCBJUFggZGF0YWdyYW0gcGFja2V0cy4KKyAqLwordm9pZAoraXB4X3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoKQoreworCWNvbnN0IHN0cnVjdCBpcHhIZHIgKmlweCA9IChjb25zdCBzdHJ1Y3QgaXB4SGRyICopcDsKKworCWlmICghZWZsYWcpCisJCXByaW50ZigiSVBYICIpOworCisJVENIRUNLKGlweC0+c3JjU2t0KTsKKwkodm9pZClwcmludGYoIiVzLiUwNHggPiAiLAorCQkgICAgIGlweGFkZHJfc3RyaW5nKEVYVFJBQ1RfMzJCSVRTKGlweC0+c3JjTmV0KSwgaXB4LT5zcmNOb2RlKSwKKwkJICAgICBFWFRSQUNUXzE2QklUUygmaXB4LT5zcmNTa3QpKTsKKworCSh2b2lkKXByaW50ZigiJXMuJTA0eDogIiwKKwkJICAgICBpcHhhZGRyX3N0cmluZyhFWFRSQUNUXzMyQklUUyhpcHgtPmRzdE5ldCksIGlweC0+ZHN0Tm9kZSksCisJCSAgICAgRVhUUkFDVF8xNkJJVFMoJmlweC0+ZHN0U2t0KSk7CisKKwkvKiB0YWtlIGxlbmd0aCBmcm9tIGlweCBoZWFkZXIgKi8KKwlUQ0hFQ0soaXB4LT5sZW5ndGgpOworCWxlbmd0aCA9IEVYVFJBQ1RfMTZCSVRTKCZpcHgtPmxlbmd0aCk7CisKKwlpcHhfZGVjb2RlKGlweCwgKHVfY2hhciAqKWlweCArIGlweFNpemUsIGxlbmd0aCAtIGlweFNpemUpOworCXJldHVybjsKK3RydW5jOgorCXByaW50ZigiW3xpcHggJWRdIiwgbGVuZ3RoKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgoraXB4YWRkcl9zdHJpbmcodV9pbnQzMl90IG5ldCwgY29uc3QgdV9jaGFyICpub2RlKQoreworICAgIHN0YXRpYyBjaGFyIGxpbmVbMjU2XTsKKworICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiUwOHguJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCSAgICBuZXQsIG5vZGVbMF0sIG5vZGVbMV0sIG5vZGVbMl0sIG5vZGVbM10sIG5vZGVbNF0sIG5vZGVbNV0pOworCisgICAgcmV0dXJuIGxpbmU7Cit9CisKK3ZvaWQKK2lweF9kZWNvZGUoY29uc3Qgc3RydWN0IGlweEhkciAqaXB4LCBjb25zdCB1X2NoYXIgKmRhdGFwLCB1X2ludCBsZW5ndGgpCit7CisgICAgcmVnaXN0ZXIgdV9zaG9ydCBkc3RTa3Q7CisKKyAgICBkc3RTa3QgPSBFWFRSQUNUXzE2QklUUygmaXB4LT5kc3RTa3QpOworICAgIHN3aXRjaCAoZHN0U2t0KSB7CisgICAgICBjYXNlIElQWF9TS1RfTkNQOgorCSh2b2lkKXByaW50ZigiaXB4LW5jcCAlZCIsIGxlbmd0aCk7CisJYnJlYWs7CisgICAgICBjYXNlIElQWF9TS1RfU0FQOgorCWlweF9zYXBfcHJpbnQoKHVfc2hvcnQgKilkYXRhcCwgbGVuZ3RoKTsKKwlicmVhazsKKyAgICAgIGNhc2UgSVBYX1NLVF9SSVA6CisJaXB4X3JpcF9wcmludCgodV9zaG9ydCAqKWRhdGFwLCBsZW5ndGgpOworCWJyZWFrOworICAgICAgY2FzZSBJUFhfU0tUX05FVEJJT1M6CisJKHZvaWQpcHJpbnRmKCJpcHgtbmV0YmlvcyAlZCIsIGxlbmd0aCk7CisjaWZkZWYgVENQRFVNUF9ET19TTUIKKwlpcHhfbmV0Ymlvc19wcmludChkYXRhcCwgbGVuZ3RoKTsKKyNlbmRpZgorCWJyZWFrOworICAgICAgY2FzZSBJUFhfU0tUX0RJQUdOT1NUSUNTOgorCSh2b2lkKXByaW50ZigiaXB4LWRpYWdzICVkIiwgbGVuZ3RoKTsKKwlicmVhazsKKyAgICAgIGNhc2UgSVBYX1NLVF9OV0xJTktfREdNOgorCSh2b2lkKXByaW50ZigiaXB4LW53bGluay1kZ20gJWQiLCBsZW5ndGgpOworI2lmZGVmIFRDUERVTVBfRE9fU01CCisJaXB4X25ldGJpb3NfcHJpbnQoZGF0YXAsIGxlbmd0aCk7CisjZW5kaWYKKwlicmVhazsKKyAgICAgIGNhc2UgSVBYX1NLVF9FSUdSUDoKKwllaWdycF9wcmludChkYXRhcCwgbGVuZ3RoKTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJKHZvaWQpcHJpbnRmKCJpcHgtIyV4ICVkIiwgZHN0U2t0LCBsZW5ndGgpOworCWJyZWFrOworICAgIH0KK30KKwordm9pZAoraXB4X3NhcF9wcmludChjb25zdCB1X3Nob3J0ICppcHgsIHVfaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgY29tbWFuZCwgaTsKKworICAgIFRDSEVDSyhpcHhbMF0pOworICAgIGNvbW1hbmQgPSBFWFRSQUNUXzE2QklUUyhpcHgpOworICAgIGlweCsrOworICAgIGxlbmd0aCAtPSAyOworCisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDM6CisJaWYgKGNvbW1hbmQgPT0gMSkKKwkgICAgKHZvaWQpcHJpbnRmKCJpcHgtc2FwLXJlcSIpOworCWVsc2UKKwkgICAgKHZvaWQpcHJpbnRmKCJpcHgtc2FwLW5lYXJlc3QtcmVxIik7CisKKwlUQ0hFQ0soaXB4WzBdKTsKKwkodm9pZClwcmludGYoIiAlcyIsIGlweHNhcF9zdHJpbmcoaHRvbnMoRVhUUkFDVF8xNkJJVFMoJmlweFswXSkpKSk7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgNDoKKwlpZiAoY29tbWFuZCA9PSAyKQorCSAgICAodm9pZClwcmludGYoImlweC1zYXAtcmVzcCIpOworCWVsc2UKKwkgICAgKHZvaWQpcHJpbnRmKCJpcHgtc2FwLW5lYXJlc3QtcmVzcCIpOworCisJZm9yIChpID0gMDsgaSA8IDggJiYgbGVuZ3RoID4gMDsgaSsrKSB7CisJICAgIFRDSEVDSyhpcHhbMF0pOworCSAgICAodm9pZClwcmludGYoIiAlcyAnIiwgaXB4c2FwX3N0cmluZyhodG9ucyhFWFRSQUNUXzE2QklUUygmaXB4WzBdKSkpKTsKKwkgICAgaWYgKGZuX3ByaW50enAoKHVfY2hhciAqKSZpcHhbMV0sIDQ4LCBzbmFwZW5kKSkgeworCQlwcmludGYoIiciKTsKKwkJZ290byB0cnVuYzsKKwkgICAgfQorCSAgICBUQ0hFQ0syKGlweFsyNV0sIDEwKTsKKwkgICAgcHJpbnRmKCInIGFkZHIgJXMiLAorCQlpcHhhZGRyX3N0cmluZyhFWFRSQUNUXzMyQklUUygmaXB4WzI1XSksICh1X2NoYXIgKikmaXB4WzI3XSkpOworCSAgICBpcHggKz0gMzI7CisJICAgIGxlbmd0aCAtPSA2NDsKKwl9CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSh2b2lkKXByaW50ZigiaXB4LXNhcC0/JXgiLCBjb21tYW5kKTsKKwlicmVhazsKKyAgICB9CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgcHJpbnRmKCJbfGlweCAlZF0iLCBsZW5ndGgpOworfQorCit2b2lkCitpcHhfcmlwX3ByaW50KGNvbnN0IHVfc2hvcnQgKmlweCwgdV9pbnQgbGVuZ3RoKQoreworICAgIGludCBjb21tYW5kLCBpOworCisgICAgVENIRUNLKGlweFswXSk7CisgICAgY29tbWFuZCA9IEVYVFJBQ1RfMTZCSVRTKGlweCk7CisgICAgaXB4Kys7CisgICAgbGVuZ3RoIC09IDI7CisKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgIGNhc2UgMToKKwkodm9pZClwcmludGYoImlweC1yaXAtcmVxIik7CisJaWYgKGxlbmd0aCA+IDApIHsKKwkgICAgVENIRUNLKGlweFszXSk7CisJICAgICh2b2lkKXByaW50ZigiICV1LyVkLiVkIiwgRVhUUkFDVF8zMkJJVFMoJmlweFswXSksCisJCQkgRVhUUkFDVF8xNkJJVFMoJmlweFsyXSksIEVYVFJBQ1RfMTZCSVRTKCZpcHhbM10pKTsKKwl9CisJYnJlYWs7CisgICAgICBjYXNlIDI6CisJKHZvaWQpcHJpbnRmKCJpcHgtcmlwLXJlc3AiKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTAgJiYgbGVuZ3RoID4gMDsgaSsrKSB7CisJICAgIFRDSEVDSyhpcHhbM10pOworCSAgICAodm9pZClwcmludGYoIiAldS8lZC4lZCIsIEVYVFJBQ1RfMzJCSVRTKCZpcHhbMF0pLAorCQkJIEVYVFJBQ1RfMTZCSVRTKCZpcHhbMl0pLCBFWFRSQUNUXzE2QklUUygmaXB4WzNdKSk7CisKKwkgICAgaXB4ICs9IDQ7CisJICAgIGxlbmd0aCAtPSA4OworCX0KKwlicmVhazsKKyAgICAgIGRlZmF1bHQ6CisJKHZvaWQpcHJpbnRmKCJpcHgtcmlwLT8leCIsIGNvbW1hbmQpOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICBwcmludGYoIlt8aXB4ICVkXSIsIGxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9wcmludC1pc2FrbXAuYyBiL3ByaW50LWlzYWttcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDhkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pc2FrbXAuYwpAQCAtMCwwICsxLDE0NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pc2FrbXAuYyx2IDEuNTEgMjAwNS8wNC8wNyAwMDoyODoxNyBtY3IgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpc2FrbXAuaCIKKyNpbmNsdWRlICJpcHNlY19kb2kuaCIKKyNpbmNsdWRlICJvYWtsZXkuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIiAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKyNpbmNsdWRlICJpcC5oIgorI2lmZGVmIElORVQ2CisjaW5jbHVkZSAiaXA2LmgiCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKKyNkZWZpbmUgc29ja2FkZHJfc3RvcmFnZSBzb2NrYWRkcgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9zYV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9wX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCisJdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOworc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3RfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKKwl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfa2VfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKKwl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfaWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKKwl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfY2VydF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9jcl9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9zaWdfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKKwl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfaGFzaF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9ub25jZV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9uX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCisJdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOworc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX2RfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKKwl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfdmlkX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCisJdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOworc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3N1YjBfcHJpbnQodV9jaGFyLCBjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAorCWNvbnN0IHVfY2hhciAqLAl1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOworc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3N1Yl9wcmludCh1X2NoYXIsIGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCisJY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY2hhciAqbnVtc3RyKGludCk7CitzdGF0aWMgdm9pZCBzYWZlbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworCisjZGVmaW5lIE1BWElOSVRJQVRPUlMJMjAKK2ludCBuaW5pdGlhdG9yID0gMDsKK3N0cnVjdCB7CisJY29va2llX3QgaW5pdGlhdG9yOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGlhZGRyOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHJhZGRyOworfSBjb29raWVjYWNoZVtNQVhJTklUSUFUT1JTXTsKKworLyogcHJvdG9jb2wgaWQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwcm90b2lkc3RyW10gPSB7CisJTlVMTCwgImlzYWttcCIsICJpcHNlYy1haCIsICJpcHNlYy1lc3AiLCAiaXBjb21wIiwKK307CisKKy8qIGlzYWttcC0+bnAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpucHN0cltdID0geworCSJub25lIiwgInNhIiwgInAiLCAidCIsICJrZSIsICJpZCIsICJjZXJ0IiwgImNyIiwgImhhc2giLAorCSJzaWciLCAibm9uY2UiLCAibiIsICJkIiwgInZpZCIKK307CisKKy8qIGlzYWttcC0+bnAgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgKigqbnBmdW5jW10pKGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosIHVfaW50LAorCQljb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KSA9IHsKKwlOVUxMLAorCWlzYWttcF9zYV9wcmludCwKKwlpc2FrbXBfcF9wcmludCwKKwlpc2FrbXBfdF9wcmludCwKKwlpc2FrbXBfa2VfcHJpbnQsCisJaXNha21wX2lkX3ByaW50LAorCWlzYWttcF9jZXJ0X3ByaW50LAorCWlzYWttcF9jcl9wcmludCwKKwlpc2FrbXBfaGFzaF9wcmludCwKKwlpc2FrbXBfc2lnX3ByaW50LAorCWlzYWttcF9ub25jZV9wcmludCwKKwlpc2FrbXBfbl9wcmludCwKKwlpc2FrbXBfZF9wcmludCwKKwlpc2FrbXBfdmlkX3ByaW50LAorfTsKKworLyogaXNha21wLT5ldHlwZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmV0eXBlc3RyW10gPSB7CisJIm5vbmUiLCAiYmFzZSIsICJpZGVudCIsICJhdXRoIiwgImFnZyIsICJpbmYiLCBOVUxMLCBOVUxMLAorCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCSJvYWtsZXktcXVpY2siLCAib2FrbGV5LW5ld2dyb3VwIiwKK307CisKKyNkZWZpbmUgU1RSX09SX0lEKHgsIHRhYikgXAorCSgoKHgpIDwgc2l6ZW9mKHRhYikvc2l6ZW9mKHRhYlswXSkgJiYgdGFiWyh4KV0pCT8gdGFiWyh4KV0gOiBudW1zdHIoeCkpCisjZGVmaW5lIFBST1RPSURTVFIoeCkJU1RSX09SX0lEKHgsIHByb3RvaWRzdHIpCisjZGVmaW5lIE5QU1RSKHgpCVNUUl9PUl9JRCh4LCBucHN0cikKKyNkZWZpbmUgRVRZUEVTVFIoeCkJU1RSX09SX0lEKHgsIGV0eXBlc3RyKQorCisjZGVmaW5lIE5QRlVOQyh4KSBcCisJKCgoeCkgPCBzaXplb2YobnBmdW5jKS9zaXplb2YobnBmdW5jWzBdKSAmJiBucGZ1bmNbKHgpXSkgXAorCQk/IG5wZnVuY1soeCldIDogTlVMTCkKKworc3RhdGljIGludAoraXN6ZXJvKHVfY2hhciAqcCwgc2l6ZV90IGwpCit7CisJd2hpbGUgKGwtLSkgeworCQlpZiAoKnArKykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogZmluZCBjb29raWUgZnJvbSBpbml0aWF0b3IgY2FjaGUgKi8KK3N0YXRpYyBpbnQKK2Nvb2tpZV9maW5kKGNvb2tpZV90ICppbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhJTklUSUFUT1JTOyBpKyspIHsKKwkJaWYgKG1lbWNtcChpbiwgJmNvb2tpZWNhY2hlW2ldLmluaXRpYXRvciwgc2l6ZW9mKCppbikpID09IDApCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHJlY29yZCBpbml0aWF0b3IgKi8KK3N0YXRpYyB2b2lkCitjb29raWVfcmVjb3JkKGNvb2tpZV90ICppbiwgY29uc3QgdV9jaGFyICpicDIpCit7CisJaW50IGk7CisJc3RydWN0IGlwICppcDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZmRlZiBJTkVUNgorCXN0cnVjdCBpcDZfaGRyICppcDY7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKyNlbmRpZgorCisJaSA9IGNvb2tpZV9maW5kKGluKTsKKwlpZiAoMCA8PSBpKSB7CisJCW5pbml0aWF0b3IgPSAoaSArIDEpICUgTUFYSU5JVElBVE9SUzsKKwkJcmV0dXJuOworCX0KKworCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKKwlzd2l0Y2ggKElQX1YoaXApKSB7CisJY2FzZSA0OgorCQltZW1zZXQoJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyLCAwLAorCQkJc2l6ZW9mKGNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyKSk7CisJCW1lbXNldCgmY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHIsIDAsCisJCQlzaXplb2YoY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHIpKTsKKworCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyOworI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisJCXNpbi0+c2luX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworI2VuZGlmCisJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCW1lbWNweSgmc2luLT5zaW5fYWRkciwgJmlwLT5pcF9zcmMsIHNpemVvZihpcC0+aXBfc3JjKSk7CisJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHI7CisjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KKwkJc2luLT5zaW5fbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisjZW5kaWYKKwkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLCAmaXAtPmlwX2RzdCwgc2l6ZW9mKGlwLT5pcF9kc3QpKTsKKwkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwljYXNlIDY6CisJCW1lbXNldCgmY29va2llY2FjaGVbbmluaXRpYXRvcl0uaWFkZHIsIDAsCisJCQlzaXplb2YoY29va2llY2FjaGVbbmluaXRpYXRvcl0uaWFkZHIpKTsKKwkJbWVtc2V0KCZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkciwgMCwKKwkJCXNpemVvZihjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkcikpOworCisJCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyOworI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisJCXNpbjYtPnNpbjZfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworI2VuZGlmCisJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLCAmaXA2LT5pcDZfc3JjLCBzaXplb2YoaXA2LT5pcDZfc3JjKSk7CisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkcjsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCQlzaW42LT5zaW42X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNlbmRpZgorCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwNi0+aXA2X2RzdCwgc2l6ZW9mKGlwNi0+aXA2X2RzdCkpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJbWVtY3B5KCZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5pbml0aWF0b3IsIGluLCBzaXplb2YoKmluKSk7CisJbmluaXRpYXRvciA9IChuaW5pdGlhdG9yICsgMSkgJSBNQVhJTklUSUFUT1JTOworfQorCisjZGVmaW5lIGNvb2tpZV9pc2luaXRpYXRvcih4LCB5KQljb29raWVfc2lkZWNoZWNrKCh4KSwgKHkpLCAxKQorI2RlZmluZSBjb29raWVfaXNyZXNwb25kZXIoeCwgeSkJY29va2llX3NpZGVjaGVjaygoeCksICh5KSwgMCkKK3N0YXRpYyBpbnQKK2Nvb2tpZV9zaWRlY2hlY2soaW50IGksIGNvbnN0IHVfY2hhciAqYnAyLCBpbnQgaW5pdGlhdG9yKQoreworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCXN0cnVjdCBzb2NrYWRkciAqc2E7CisJc3RydWN0IGlwICppcDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKyNpZmRlZiBJTkVUNgorCXN0cnVjdCBpcDZfaGRyICppcDY7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKyNlbmRpZgorCWludCBzYWxlbjsKKworCW1lbXNldCgmc3MsIDAsIHNpemVvZihzcykpOworCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKKwlzd2l0Y2ggKElQX1YoaXApKSB7CisJY2FzZSA0OgorCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNzOworI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisJCXNpbi0+c2luX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworI2VuZGlmCisJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCW1lbWNweSgmc2luLT5zaW5fYWRkciwgJmlwLT5pcF9zcmMsIHNpemVvZihpcC0+aXBfc3JjKSk7CisJCWJyZWFrOworI2lmZGVmIElORVQ2CisJY2FzZSA2OgorCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7CisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzczsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCQlzaW42LT5zaW42X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNlbmRpZgorCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwNi0+aXA2X3NyYywgc2l6ZW9mKGlwNi0+aXA2X3NyYykpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzczsKKwlpZiAoaW5pdGlhdG9yKSB7CisJCWlmIChzYS0+c2FfZmFtaWx5ICE9ICgoc3RydWN0IHNvY2thZGRyICopJmNvb2tpZWNhY2hlW2ldLmlhZGRyKS0+c2FfZmFtaWx5KQorCQkJcmV0dXJuIDA7CisjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KKwkJc2FsZW4gPSBzYS0+c2FfbGVuOworI2Vsc2UKKyNpZmRlZiBJTkVUNgorCQlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQllbHNlCisJCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOworI2Vsc2UKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKKyNlbmRpZgorI2VuZGlmCisJCWlmIChtZW1jbXAoJnNzLCAmY29va2llY2FjaGVbaV0uaWFkZHIsIHNhbGVuKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKHNhLT5zYV9mYW1pbHkgIT0gKChzdHJ1Y3Qgc29ja2FkZHIgKikmY29va2llY2FjaGVbaV0ucmFkZHIpLT5zYV9mYW1pbHkpCisJCQlyZXR1cm4gMDsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCQlzYWxlbiA9IHNhLT5zYV9sZW47CisjZWxzZQorI2lmZGVmIElORVQ2CisJCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCWVsc2UKKwkJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7CisjZWxzZQorCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOworI2VuZGlmCisjZW5kaWYKKwkJaWYgKG1lbWNtcCgmc3MsICZjb29raWVjYWNoZVtpXS5yYWRkciwgc2FsZW4pID09IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Jhd3ByaW50KGNhZGRyX3QgbG9jLCBzaXplX3QgbGVuKQoreworCXN0YXRpYyB1X2NoYXIgKnA7CisJc2l6ZV90IGk7CisKKwlUQ0hFQ0syKCpsb2MsIGxlbik7CisJCisJcCA9ICh1X2NoYXIgKilsb2M7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGYoIiUwMngiLCBwW2ldICYgMHhmZik7CisJcmV0dXJuIDE7Cit0cnVuYzoKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGF0dHJtYXAgeworCWNvbnN0IGNoYXIgKnR5cGU7CisJdV9pbnQgbnZhbHVlOworCWNvbnN0IGNoYXIgKnZhbHVlWzMwXTsJLypYWFgqLworfTsKKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfYXR0cm1hcF9wcmludChjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHVfY2hhciAqZXAsCisJY29uc3Qgc3RydWN0IGF0dHJtYXAgKm1hcCwgc2l6ZV90IG5tYXApCit7CisJdV9pbnQxNl90ICpxOworCWludCB0b3RsZW47CisJdV9pbnQzMl90IHQsIHY7CisKKwlxID0gKHVfaW50MTZfdCAqKXA7CisJaWYgKHBbMF0gJiAweDgwKQorCQl0b3RsZW4gPSA0OworCWVsc2UKKwkJdG90bGVuID0gNCArIEVYVFJBQ1RfMTZCSVRTKCZxWzFdKTsKKwlpZiAoZXAgPCBwICsgdG90bGVuKSB7CisJCXByaW50ZigiW3xhdHRyXSIpOworCQlyZXR1cm4gZXAgKyAxOworCX0KKworCXByaW50ZigiKCIpOworCXQgPSBFWFRSQUNUXzE2QklUUygmcVswXSkgJiAweDdmZmY7CisJaWYgKG1hcCAmJiB0IDwgbm1hcCAmJiBtYXBbdF0udHlwZSkKKwkJcHJpbnRmKCJ0eXBlPSVzICIsIG1hcFt0XS50eXBlKTsKKwllbHNlCisJCXByaW50ZigidHlwZT0jJWQgIiwgdCk7CisJaWYgKHBbMF0gJiAweDgwKSB7CisJCXByaW50ZigidmFsdWU9Iik7CisJCXYgPSBFWFRSQUNUXzE2QklUUygmcVsxXSk7CisJCWlmIChtYXAgJiYgdCA8IG5tYXAgJiYgdiA8IG1hcFt0XS5udmFsdWUgJiYgbWFwW3RdLnZhbHVlW3ZdKQorCQkJcHJpbnRmKCIlcyIsIG1hcFt0XS52YWx1ZVt2XSk7CisJCWVsc2UKKwkJCXJhd3ByaW50KChjYWRkcl90KSZxWzFdLCAyKTsKKwl9IGVsc2UgeworCQlwcmludGYoImxlbj0lZCB2YWx1ZT0iLCBFWFRSQUNUXzE2QklUUygmcVsxXSkpOworCQlyYXdwcmludCgoY2FkZHJfdCkmcFs0XSwgRVhUUkFDVF8xNkJJVFMoJnFbMV0pKTsKKwl9CisJcHJpbnRmKCIpIik7CisJcmV0dXJuIHAgKyB0b3RsZW47Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgoraXNha21wX2F0dHJfcHJpbnQoY29uc3QgdV9jaGFyICpwLCBjb25zdCB1X2NoYXIgKmVwKQoreworCXVfaW50MTZfdCAqcTsKKwlpbnQgdG90bGVuOworCXVfaW50MzJfdCB0OworCisJcSA9ICh1X2ludDE2X3QgKilwOworCWlmIChwWzBdICYgMHg4MCkKKwkJdG90bGVuID0gNDsKKwllbHNlCisJCXRvdGxlbiA9IDQgKyBFWFRSQUNUXzE2QklUUygmcVsxXSk7CisJaWYgKGVwIDwgcCArIHRvdGxlbikgeworCQlwcmludGYoIlt8YXR0cl0iKTsKKwkJcmV0dXJuIGVwICsgMTsKKwl9CisKKwlwcmludGYoIigiKTsKKwl0ID0gRVhUUkFDVF8xNkJJVFMoJnFbMF0pICYgMHg3ZmZmOworCXByaW50ZigidHlwZT0jJWQgIiwgdCk7CisJaWYgKHBbMF0gJiAweDgwKSB7CisJCXByaW50ZigidmFsdWU9Iik7CisJCXQgPSBxWzFdOworCQlyYXdwcmludCgoY2FkZHJfdCkmcVsxXSwgMik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJsZW49JWQgdmFsdWU9IiwgRVhUUkFDVF8xNkJJVFMoJnFbMV0pKTsKKwkJcmF3cHJpbnQoKGNhZGRyX3QpJnBbMl0sIEVYVFJBQ1RfMTZCSVRTKCZxWzFdKSk7CisJfQorCXByaW50ZigiKSIpOworCXJldHVybiBwICsgdG90bGVuOworfQorCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK2lzYWttcF9zYV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LAorCQl1X2ludCBpdGVtX2xlbiBfVV8sCisJCWNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaTAgX1VfLAorCQl1X2ludDMyX3QgcHJvdG8wLCBpbnQgZGVwdGgpCit7CisJY29uc3Qgc3RydWN0IGlzYWttcF9wbF9zYSAqcDsKKwlzdHJ1Y3QgaXNha21wX3BsX3NhIHNhOworCWNvbnN0IHVfaW50MzJfdCAqcTsKKwl1X2ludDMyX3QgZG9pLCBzaXQsIGlkZW50OworCWNvbnN0IHVfY2hhciAqY3AsICpucDsKKwlpbnQgdDsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9TQSkpOworCisJcCA9IChzdHJ1Y3QgaXNha21wX3BsX3NhICopZXh0OworCVRDSEVDSygqcCk7CisJc2FmZW1lbWNweSgmc2EsIGV4dCwgc2l6ZW9mKHNhKSk7CisJZG9pID0gbnRvaGwoc2EuZG9pKTsKKwlzaXQgPSBudG9obChzYS5zaXQpOworCWlmIChkb2kgIT0gMSkgeworCQlwcmludGYoIiBkb2k9JWQiLCBkb2kpOworCQlwcmludGYoIiBzaXR1YXRpb249JXUiLCAodV9pbnQzMl90KW50b2hsKHNhLnNpdCkpOworCQlyZXR1cm4gKHVfY2hhciAqKShwICsgMSk7CisJfQorCisJcHJpbnRmKCIgZG9pPWlwc2VjIik7CisJcSA9ICh1X2ludDMyX3QgKikmc2Euc2l0OworCXByaW50ZigiIHNpdHVhdGlvbj0iKTsKKwl0ID0gMDsKKwlpZiAoc2l0ICYgMHgwMSkgeworCQlwcmludGYoImlkZW50aXR5Iik7CisJCXQrKzsKKwl9CisJaWYgKHNpdCAmIDB4MDIpIHsKKwkJcHJpbnRmKCIlc3NlY3JlY3kiLCB0ID8gIisiIDogIiIpOworCQl0Kys7CisJfQorCWlmIChzaXQgJiAweDA0KQorCQlwcmludGYoIiVzaW50ZWdyaXR5IiwgdCA/ICIrIiA6ICIiKTsKKworCW5wID0gKHVfY2hhciAqKWV4dCArIHNpemVvZihzYSk7CisJaWYgKHNpdCAhPSAweDAxKSB7CisJCVRDSEVDSzIoKihleHQgKyAxKSwgc2l6ZW9mKGlkZW50KSk7CisJCXNhZmVtZW1jcHkoJmlkZW50LCBleHQgKyAxLCBzaXplb2YoaWRlbnQpKTsKKwkJcHJpbnRmKCIgaWRlbnQ9JXUiLCAodV9pbnQzMl90KW50b2hsKGlkZW50KSk7CisJCW5wICs9IHNpemVvZihpZGVudCk7CisJfQorCisJZXh0ID0gKHN0cnVjdCBpc2FrbXBfZ2VuICopbnA7CisJVENIRUNLKCpleHQpOworCisJY3AgPSBpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfUCwgZXh0LCBlcCwgcGhhc2UsIGRvaSwgcHJvdG8wLAorCQlkZXB0aCk7CisKKwlyZXR1cm4gY3A7Cit0cnVuYzoKKwlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfU0EpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfcF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiBfVV8sCisJICAgICAgIGNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaTAsCisJICAgICAgIHVfaW50MzJfdCBwcm90bzAgX1VfLCBpbnQgZGVwdGgpCit7CisJY29uc3Qgc3RydWN0IGlzYWttcF9wbF9wICpwOworCXN0cnVjdCBpc2FrbXBfcGxfcCBwcm9wOworCWNvbnN0IHVfY2hhciAqY3A7CisKKwlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfUCkpOworCisJcCA9IChzdHJ1Y3QgaXNha21wX3BsX3AgKilleHQ7CisJVENIRUNLKCpwKTsKKwlzYWZlbWVtY3B5KCZwcm9wLCBleHQsIHNpemVvZihwcm9wKSk7CisJcHJpbnRmKCIgIyVkIHByb3RvaWQ9JXMgdHJhbnNmb3JtPSVkIiwKKwkJcHJvcC5wX25vLCBQUk9UT0lEU1RSKHByb3AucHJvdF9pZCksIHByb3AubnVtX3QpOworCWlmIChwcm9wLnNwaV9zaXplKSB7CisJCXByaW50ZigiIHNwaT0iKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBwcm9wLnNwaV9zaXplKSkKKwkJCWdvdG8gdHJ1bmM7CisJfQorCisJZXh0ID0gKHN0cnVjdCBpc2FrbXBfZ2VuICopKCh1X2NoYXIgKikocCArIDEpICsgcHJvcC5zcGlfc2l6ZSk7CisJVENIRUNLKCpleHQpOworCisJY3AgPSBpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfVCwgZXh0LCBlcCwgcGhhc2UsIGRvaTAsCisJCXByb3AucHJvdF9pZCwgZGVwdGgpOworCisJcmV0dXJuIGNwOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX1ApKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlzYWttcF9wX21hcFtdID0geworCU5VTEwsICJpa2UiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFoX3BfbWFwW10gPSB7CisJTlVMTCwgIihyZXNlcnZlZCkiLCAibWQ1IiwgInNoYSIsICIxZGVzIiwKKwkic2hhMi0yNTYiLCAic2hhMi0zODQiLCAic2hhMi01MTIiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVzcF9wX21hcFtdID0geworCU5VTEwsICIxZGVzLWl2NjQiLCAiMWRlcyIsICIzZGVzIiwgInJjNSIsICJpZGVhIiwgImNhc3QiLAorCSJibG93ZmlzaCIsICIzaWRlYSIsICIxZGVzLWl2MzIiLCAicmM0IiwgIm51bGwiLCAiYWVzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwY29tcF9wX21hcFtdID0geworCU5VTEwsICJvdWkiLCAiZGVmbGF0ZSIsICJsenMiLAorfTsKKworY29uc3Qgc3RydWN0IGF0dHJtYXAgaXBzZWNfdF9tYXBbXSA9IHsKKwl7IE5VTEwsCTAsIHsgTlVMTCB9IH0sCisJeyAibGlmZXR5cGUiLCAzLCB7IE5VTEwsICJzZWMiLCAia2IiLCB9LCB9LAorCXsgImxpZmUiLCAwLCB7IE5VTEwgfSB9LAorCXsgImdyb3VwIGRlc2MiLCA1LAl7IE5VTEwsICJtb2RwNzY4IiwgIm1vZHAxMDI0IiwgIkVDMk4gMl4xNTUiLAorCQkJCSAgIkVDMk4gMl4xODUiLCB9LCB9LAorCXsgImVuYyBtb2RlIiwgMywgeyBOVUxMLCAidHVubmVsIiwgInRyYW5zcG9ydCIsIH0sIH0sCisJeyAiYXV0aCIsIDUsIHsgTlVMTCwgImhtYWMtbWQ1IiwgImhtYWMtc2hhMSIsICIxZGVzLW1hYyIsICJrZXllZCIsIH0sIH0sCisJeyAia2V5bGVuIiwgMCwgeyBOVUxMIH0gfSwKKwl7ICJyb3VuZHMiLCAwLCB7IE5VTEwgfSB9LAorCXsgImRpY3RzaXplIiwgMCwgeyBOVUxMIH0gfSwKKwl7ICJwcml2YWxnIiwgMCwgeyBOVUxMIH0gfSwKK307CisKK2NvbnN0IHN0cnVjdCBhdHRybWFwIG9ha2xleV90X21hcFtdID0geworCXsgTlVMTCwJMCwgeyBOVUxMIH0gfSwKKwl7ICJlbmMiLCA4LAl7IE5VTEwsICIxZGVzIiwgImlkZWEiLCAiYmxvd2Zpc2giLCAicmM1IiwKKwkJIAkgICIzZGVzIiwgImNhc3QiLCAiYWVzIiwgfSwgfSwKKwl7ICJoYXNoIiwgNywJeyBOVUxMLCAibWQ1IiwgInNoYTEiLCAidGlnZXIiLAorCQkJICAic2hhMi0yNTYiLCAic2hhMi0zODQiLCAic2hhMi01MTIiLCB9LCB9LAorCXsgImF1dGgiLCA2LAl7IE5VTEwsICJwcmVzaGFyZWQiLCAiZHNzIiwgInJzYSBzaWciLCAicnNhIGVuYyIsCisJCQkgICJyc2EgZW5jIHJldmlzZWQiLCB9LCB9LAorCXsgImdyb3VwIGRlc2MiLCA1LAl7IE5VTEwsICJtb2RwNzY4IiwgIm1vZHAxMDI0IiwgIkVDMk4gMl4xNTUiLAorCQkJCSAgIkVDMk4gMl4xODUiLCB9LCB9LAorCXsgImdyb3VwIHR5cGUiLCA0LAl7IE5VTEwsICJNT0RQIiwgIkVDUCIsICJFQzJOIiwgfSwgfSwKKwl7ICJncm91cCBwcmltZSIsIDAsIHsgTlVMTCB9IH0sCisJeyAiZ3JvdXAgZ2VuMSIsIDAsIHsgTlVMTCB9IH0sCisJeyAiZ3JvdXAgZ2VuMiIsIDAsIHsgTlVMTCB9IH0sCisJeyAiZ3JvdXAgY3VydmUgQSIsIDAsIHsgTlVMTCB9IH0sCisJeyAiZ3JvdXAgY3VydmUgQiIsIDAsIHsgTlVMTCB9IH0sCisJeyAibGlmZXR5cGUiLCAzLAl7IE5VTEwsICJzZWMiLCAia2IiLCB9LCB9LAorCXsgImxpZmVkdXJhdGlvbiIsIDAsIHsgTlVMTCB9IH0sCisJeyAicHJmIiwgMCwgeyBOVUxMIH0gfSwKKwl7ICJrZXlsZW4iLCAwLCB7IE5VTEwgfSB9LAorCXsgImZpZWxkIiwgMCwgeyBOVUxMIH0gfSwKKwl7ICJvcmRlciIsIDAsIHsgTlVMTCB9IH0sCit9OworCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK2lzYWttcF90X3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuLAorCWNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kgX1VfLAorCXVfaW50MzJfdCBwcm90bywgaW50IGRlcHRoIF9VXykKK3sKKwljb25zdCBzdHJ1Y3QgaXNha21wX3BsX3QgKnA7CisJc3RydWN0IGlzYWttcF9wbF90IHQ7CisJY29uc3QgdV9jaGFyICpjcDsKKwljb25zdCBjaGFyICppZHN0cjsKKwljb25zdCBzdHJ1Y3QgYXR0cm1hcCAqbWFwOworCXNpemVfdCBubWFwOworCWNvbnN0IHVfY2hhciAqZXAyOworCisJcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX1QpKTsKKworCXAgPSAoc3RydWN0IGlzYWttcF9wbF90ICopZXh0OworCVRDSEVDSygqcCk7CisJc2FmZW1lbWNweSgmdCwgZXh0LCBzaXplb2YodCkpOworCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgMToKKwkJaWRzdHIgPSBTVFJfT1JfSUQodC50X2lkLCBpc2FrbXBfcF9tYXApOworCQltYXAgPSBvYWtsZXlfdF9tYXA7CisJCW5tYXAgPSBzaXplb2Yob2FrbGV5X3RfbWFwKS9zaXplb2Yob2FrbGV5X3RfbWFwWzBdKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZHN0ciA9IFNUUl9PUl9JRCh0LnRfaWQsIGFoX3BfbWFwKTsKKwkJbWFwID0gaXBzZWNfdF9tYXA7CisJCW5tYXAgPSBzaXplb2YoaXBzZWNfdF9tYXApL3NpemVvZihpcHNlY190X21hcFswXSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaWRzdHIgPSBTVFJfT1JfSUQodC50X2lkLCBlc3BfcF9tYXApOworCQltYXAgPSBpcHNlY190X21hcDsKKwkJbm1hcCA9IHNpemVvZihpcHNlY190X21hcCkvc2l6ZW9mKGlwc2VjX3RfbWFwWzBdKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpZHN0ciA9IFNUUl9PUl9JRCh0LnRfaWQsIGlwY29tcF9wX21hcCk7CisJCW1hcCA9IGlwc2VjX3RfbWFwOworCQlubWFwID0gc2l6ZW9mKGlwc2VjX3RfbWFwKS9zaXplb2YoaXBzZWNfdF9tYXBbMF0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZHN0ciA9IE5VTEw7CisJCW1hcCA9IE5VTEw7CisJCW5tYXAgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAoaWRzdHIpCisJCXByaW50ZigiICMlZCBpZD0lcyAiLCB0LnRfbm8sIGlkc3RyKTsKKwllbHNlCisJCXByaW50ZigiICMlZCBpZD0lZCAiLCB0LnRfbm8sIHQudF9pZCk7CisJY3AgPSAodV9jaGFyICopKHAgKyAxKTsKKwllcDIgPSAodV9jaGFyICopcCArIGl0ZW1fbGVuOworCXdoaWxlIChjcCA8IGVwICYmIGNwIDwgZXAyKSB7CisJCWlmIChtYXAgJiYgbm1hcCkgeworCQkJY3AgPSBpc2FrbXBfYXR0cm1hcF9wcmludChjcCwgKGVwIDwgZXAyKSA/IGVwIDogZXAyLAorCQkJCW1hcCwgbm1hcCk7CisJCX0gZWxzZQorCQkJY3AgPSBpc2FrbXBfYXR0cl9wcmludChjcCwgKGVwIDwgZXAyKSA/IGVwIDogZXAyKTsKKwl9CisJaWYgKGVwIDwgZXAyKQorCQlwcmludGYoIi4uLiIpOworCXJldHVybiBjcDsKK3RydW5jOgorCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9UKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgoraXNha21wX2tlX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKKwkJY29uc3QgdV9jaGFyICplcCBfVV8sIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kgX1VfLAorCQl1X2ludDMyX3QgcHJvdG8gX1VfLCBpbnQgZGVwdGggX1VfKQoreworCXN0cnVjdCBpc2FrbXBfZ2VuIGU7CisKKwlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfS0UpKTsKKworCVRDSEVDSygqZXh0KTsKKwlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7CisJcHJpbnRmKCIga2V5IGxlbj0lZCIsIG50b2hzKGUubGVuKSAtIDQpOworCWlmICgyIDwgdmZsYWcgJiYgNCA8IG50b2hzKGUubGVuKSkgeworCQlwcmludGYoIiAiKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIG50b2hzKGUubGVuKSAtIDQpKQorCQkJZ290byB0cnVuYzsKKwl9CisJcmV0dXJuICh1X2NoYXIgKilleHQgKyBudG9ocyhlLmxlbik7Cit0cnVuYzoKKwlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfS0UpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfaWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAorCQljb25zdCB1X2NoYXIgKmVwIF9VXywgdV9pbnQzMl90IHBoYXNlLCB1X2ludDMyX3QgZG9pIF9VXywKKwkJdV9pbnQzMl90IHByb3RvIF9VXywgaW50IGRlcHRoIF9VXykKK3sKKyNkZWZpbmUgVVNFX0lQU0VDRE9JX0lOX1BIQVNFMQkxCisJY29uc3Qgc3RydWN0IGlzYWttcF9wbF9pZCAqcDsKKwlzdHJ1Y3QgaXNha21wX3BsX2lkIGlkOworCXN0YXRpYyBjb25zdCBjaGFyICppZHR5cGVzdHJbXSA9IHsKKwkJIklQdjQiLCAiSVB2NG5ldCIsICJJUHY2IiwgIklQdjZuZXQiLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKmlwc2VjaWR0eXBlc3RyW10gPSB7CisJCU5VTEwsICJJUHY0IiwgIkZRRE4iLCAidXNlciBGUUROIiwgIklQdjRuZXQiLCAiSVB2NiIsCisJCSJJUHY2bmV0IiwgIklQdjRyYW5nZSIsICJJUHY2cmFuZ2UiLCAiQVNOMSBETiIsICJBU04xIEdOIiwKKwkJImtleWlkIiwKKwl9OworCWludCBsZW47CisJY29uc3QgdV9jaGFyICpkYXRhOworCisJcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX0lEKSk7CisKKwlwID0gKHN0cnVjdCBpc2FrbXBfcGxfaWQgKilleHQ7CisJVENIRUNLKCpwKTsKKwlzYWZlbWVtY3B5KCZpZCwgZXh0LCBzaXplb2YoaWQpKTsKKwlpZiAoc2l6ZW9mKCpwKSA8IGl0ZW1fbGVuKSB7CisJCWRhdGEgPSAodV9jaGFyICopKHAgKyAxKTsKKwkJbGVuID0gaXRlbV9sZW4gLSBzaXplb2YoKnApOworCX0gZWxzZSB7CisJCWRhdGEgPSBOVUxMOworCQlsZW4gPSAwOworCX0KKworI2lmIDAgLypkZWJ1ZyovCisJcHJpbnRmKCIgW3BoYXNlPSVkIGRvaT0lZCBwcm90bz0lZF0iLCBwaGFzZSwgZG9pLCBwcm90byk7CisjZW5kaWYKKwlzd2l0Y2ggKHBoYXNlKSB7CisjaWZuZGVmIFVTRV9JUFNFQ0RPSV9JTl9QSEFTRTEKKwljYXNlIDE6CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGYoIiBpZHR5cGU9JXMiLCBTVFJfT1JfSUQoaWQuZC5pZF90eXBlLCBpZHR5cGVzdHIpKTsKKwkJcHJpbnRmKCIgZG9pX2RhdGE9JXUiLAorCQkJKHVfaW50MzJfdCkobnRvaGwoaWQuZC5kb2lfZGF0YSkgJiAweGZmZmZmZikpOworCQlicmVhazsKKworI2lmZGVmIFVTRV9JUFNFQ0RPSV9JTl9QSEFTRTEKKwljYXNlIDE6CisjZW5kaWYKKwljYXNlIDI6CisJICAgIHsKKwkJY29uc3Qgc3RydWN0IGlwc2VjZG9pX2lkICpwOworCQlzdHJ1Y3QgaXBzZWNkb2lfaWQgaWQ7CisJCXN0cnVjdCBwcm90b2VudCAqcGU7CisKKwkJcCA9IChzdHJ1Y3QgaXBzZWNkb2lfaWQgKilleHQ7CisJCVRDSEVDSygqcCk7CisJCXNhZmVtZW1jcHkoJmlkLCBleHQsIHNpemVvZihpZCkpOworCQlwcmludGYoIiBpZHR5cGU9JXMiLCBTVFJfT1JfSUQoaWQudHlwZSwgaXBzZWNpZHR5cGVzdHIpKTsKKwkJaWYgKGlkLnByb3RvX2lkKSB7CisjaWZuZGVmIFdJTjMyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIG9uIGFuZHJvaWQKKwkJCS8vc2V0cHJvdG9lbnQoMSk7CisjZW5kaWYgLyogV0lOMzIgKi8KKwkJCXBlID0gZ2V0cHJvdG9ieW51bWJlcihpZC5wcm90b19pZCk7CisJCQlpZiAocGUpCisJCQkJcHJpbnRmKCIgcHJvdG9pZD0lcyIsIHBlLT5wX25hbWUpOworI2lmbmRlZiBXSU4zMgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBvbiBhbmRyb2lkCisJCQkvL2VuZHByb3RvZW50KCk7CisjZW5kaWYgLyogV0lOMzIgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIGl0IERPRVMgTk9UIG1lYW4gSVBQUk9UT19JUCEgKi8KKwkJCXByaW50ZigiIHByb3RvaWQ9JXMiLCAiMCIpOworCQl9CisJCXByaW50ZigiIHBvcnQ9JWQiLCBudG9ocyhpZC5wb3J0KSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChkYXRhID09IE5VTEwpCisJCQlnb3RvIHRydW5jOworCQlUQ0hFQ0syKCpkYXRhLCBsZW4pOworCQlzd2l0Y2ggKGlkLnR5cGUpIHsKKwkJY2FzZSBJUFNFQ0RPSV9JRF9JUFY0X0FERFI6CisJCQlpZiAobGVuIDwgNCkKKwkJCQlwcmludGYoIiBsZW49JWQgW2JhZDogPCA0XSIsIGxlbik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIgbGVuPSVkICVzIiwgbGVuLCBpcGFkZHJfc3RyaW5nKGRhdGEpKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBJUFNFQ0RPSV9JRF9GUUROOgorCQljYXNlIElQU0VDRE9JX0lEX1VTRVJfRlFETjoKKwkJICAgIHsKKwkJCWludCBpOworCQkJcHJpbnRmKCIgbGVuPSVkICIsIGxlbik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQkJc2FmZXB1dGNoYXIoZGF0YVtpXSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCSAgICB9CisJCWNhc2UgSVBTRUNET0lfSURfSVBWNF9BRERSX1NVQk5FVDoKKwkJICAgIHsKKwkJCWNvbnN0IHVfY2hhciAqbWFzazsKKwkJCWlmIChsZW4gPCA4KQorCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDhdIiwgbGVuKTsKKwkJCWVsc2UgeworCQkJCW1hc2sgPSBkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCQlwcmludGYoIiBsZW49JWQgJXMvJXUuJXUuJXUuJXUiLCBsZW4sCisJCQkJCWlwYWRkcl9zdHJpbmcoZGF0YSksCisJCQkJCW1hc2tbMF0sIG1hc2tbMV0sIG1hc2tbMl0sIG1hc2tbM10pOworCQkJfQorCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQkgICAgfQorI2lmZGVmIElORVQ2CisJCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSOgorCQkJaWYgKGxlbiA8IDE2KQorCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDE2XSIsIGxlbik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIgbGVuPSVkICVzIiwgbGVuLCBpcDZhZGRyX3N0cmluZyhkYXRhKSk7CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSX1NVQk5FVDoKKwkJICAgIHsKKwkJCWNvbnN0IHVfaW50MzJfdCAqbWFzazsKKwkJCWlmIChsZW4gPCAyMCkKKwkJCQlwcmludGYoIiBsZW49JWQgW2JhZDogPCAyMF0iLCBsZW4pOworCQkJZWxzZSB7CisJCQkJbWFzayA9ICh1X2ludDMyX3QgKikoZGF0YSArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQkvKlhYWCovCisJCQkJcHJpbnRmKCIgbGVuPSVkICVzLzB4JTA4eCUwOHglMDh4JTA4eCIsIGxlbiwKKwkJCQkJaXA2YWRkcl9zdHJpbmcoZGF0YSksCisJCQkJCW1hc2tbMF0sIG1hc2tbMV0sIG1hc2tbMl0sIG1hc2tbM10pOworCQkJfQorCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQkgICAgfQorI2VuZGlmIC8qSU5FVDYqLworCQljYXNlIElQU0VDRE9JX0lEX0lQVjRfQUREUl9SQU5HRToKKwkJCWlmIChsZW4gPCA4KQorCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDhdIiwgbGVuKTsKKwkJCWVsc2UgeworCQkJCXByaW50ZigiIGxlbj0lZCAlcy0lcyIsIGxlbiwKKwkJCQkJaXBhZGRyX3N0cmluZyhkYXRhKSwKKwkJCQkJaXBhZGRyX3N0cmluZyhkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpOworCQkJfQorCQkJbGVuID0gMDsKKwkJCWJyZWFrOworI2lmZGVmIElORVQ2CisJCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSX1JBTkdFOgorCQkJaWYgKGxlbiA8IDMyKQorCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDMyXSIsIGxlbik7CisJCQllbHNlIHsKKwkJCQlwcmludGYoIiBsZW49JWQgJXMtJXMiLCBsZW4sCisJCQkJCWlwNmFkZHJfc3RyaW5nKGRhdGEpLAorCQkJCQlpcDZhZGRyX3N0cmluZyhkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKTsKKwkJCX0KKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKyNlbmRpZiAvKklORVQ2Ki8KKwkJY2FzZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9ETjoKKwkJY2FzZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9HTjoKKwkJY2FzZSBJUFNFQ0RPSV9JRF9LRVlfSUQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCX0KKwlpZiAoZGF0YSAmJiBsZW4pIHsKKwkJcHJpbnRmKCIgbGVuPSVkIiwgbGVuKTsKKwkJaWYgKDIgPCB2ZmxhZykgeworCQkJcHJpbnRmKCIgIik7CisJCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KWRhdGEsIGxlbikpCisJCQkJZ290byB0cnVuYzsKKwkJfQorCX0KKwlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0lEKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgoraXNha21wX2NlcnRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAorCQkgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLAorCQkgIHVfaW50MzJfdCBkb2kwIF9VXywKKwkJICB1X2ludDMyX3QgcHJvdG8wIF9VXywgaW50IGRlcHRoIF9VXykKK3sKKwljb25zdCBzdHJ1Y3QgaXNha21wX3BsX2NlcnQgKnA7CisJc3RydWN0IGlzYWttcF9wbF9jZXJ0IGNlcnQ7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNlcnRzdHJbXSA9IHsKKwkJIm5vbmUiLAkicGtjczciLCAicGdwIiwgImRucyIsCisJCSJ4NTA5c2lnbiIsICJ4NTA5a2UiLCAia2VyYmVyb3MiLCAiY3JsIiwKKwkJImFybCIsICJzcGtpIiwgIng1MDlhdHRyIiwKKwl9OworCisJcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX0NFUlQpKTsKKworCXAgPSAoc3RydWN0IGlzYWttcF9wbF9jZXJ0ICopZXh0OworCVRDSEVDSygqcCk7CisJc2FmZW1lbWNweSgmY2VydCwgZXh0LCBzaXplb2YoY2VydCkpOworCXByaW50ZigiIGxlbj0lZCIsIGl0ZW1fbGVuIC0gNCk7CisJcHJpbnRmKCIgdHlwZT0lcyIsIFNUUl9PUl9JRCgoY2VydC5lbmNvZGUpLCBjZXJ0c3RyKSk7CisJaWYgKDIgPCB2ZmxhZyAmJiA0IDwgaXRlbV9sZW4pIHsKKwkJcHJpbnRmKCIgIik7CisJCWlmICghcmF3cHJpbnQoKGNhZGRyX3QpKGV4dCArIDEpLCBpdGVtX2xlbiAtIDQpKQorCQkJZ290byB0cnVuYzsKKwl9CisJcmV0dXJuICh1X2NoYXIgKilleHQgKyBpdGVtX2xlbjsKK3RydW5jOgorCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9DRVJUKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgoraXNha21wX2NyX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKKwkJY29uc3QgdV9jaGFyICplcCBfVV8sIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kwIF9VXywKKwkJdV9pbnQzMl90IHByb3RvMCBfVV8sIGludCBkZXB0aCBfVV8pCit7CisJY29uc3Qgc3RydWN0IGlzYWttcF9wbF9jZXJ0ICpwOworCXN0cnVjdCBpc2FrbXBfcGxfY2VydCBjZXJ0OworCXN0YXRpYyBjb25zdCBjaGFyICpjZXJ0c3RyW10gPSB7CisJCSJub25lIiwJInBrY3M3IiwgInBncCIsICJkbnMiLAorCQkieDUwOXNpZ24iLCAieDUwOWtlIiwgImtlcmJlcm9zIiwgImNybCIsCisJCSJhcmwiLCAic3BraSIsICJ4NTA5YXR0ciIsCisJfTsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9DUikpOworCisJcCA9IChzdHJ1Y3QgaXNha21wX3BsX2NlcnQgKilleHQ7CisJVENIRUNLKCpwKTsKKwlzYWZlbWVtY3B5KCZjZXJ0LCBleHQsIHNpemVvZihjZXJ0KSk7CisJcHJpbnRmKCIgbGVuPSVkIiwgaXRlbV9sZW4gLSA0KTsKKwlwcmludGYoIiB0eXBlPSVzIiwgU1RSX09SX0lEKChjZXJ0LmVuY29kZSksIGNlcnRzdHIpKTsKKwlpZiAoMiA8IHZmbGFnICYmIDQgPCBpdGVtX2xlbikgeworCQlwcmludGYoIiAiKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIGl0ZW1fbGVuIC0gNCkpCisJCQlnb3RvIHRydW5jOworCX0KKwlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0NSKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgoraXNha21wX2hhc2hfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAorCQkgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKKwkJICB1X2ludDMyX3QgcHJvdG8gX1VfLCBpbnQgZGVwdGggX1VfKQoreworCXN0cnVjdCBpc2FrbXBfZ2VuIGU7CisKKwlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfSEFTSCkpOworCisJVENIRUNLKCpleHQpOworCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKKwlwcmludGYoIiBsZW49JWQiLCBudG9ocyhlLmxlbikgLSA0KTsKKwlpZiAoMiA8IHZmbGFnICYmIDQgPCBudG9ocyhlLmxlbikpIHsKKwkJcHJpbnRmKCIgIik7CisJCWlmICghcmF3cHJpbnQoKGNhZGRyX3QpKGV4dCArIDEpLCBudG9ocyhlLmxlbikgLSA0KSkKKwkJCWdvdG8gdHJ1bmM7CisJfQorCXJldHVybiAodV9jaGFyICopZXh0ICsgbnRvaHMoZS5sZW4pOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0hBU0gpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfc2lnX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKKwkJIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKKwkJIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCit7CisJc3RydWN0IGlzYWttcF9nZW4gZTsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9TSUcpKTsKKworCVRDSEVDSygqZXh0KTsKKwlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7CisJcHJpbnRmKCIgbGVuPSVkIiwgbnRvaHMoZS5sZW4pIC0gNCk7CisJaWYgKDIgPCB2ZmxhZyAmJiA0IDwgbnRvaHMoZS5sZW4pKSB7CisJCXByaW50ZigiICIpOworCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KShleHQgKyAxKSwgbnRvaHMoZS5sZW4pIC0gNCkpCisJCQlnb3RvIHRydW5jOworCX0KKwlyZXR1cm4gKHVfY2hhciAqKWV4dCArIG50b2hzKGUubGVuKTsKK3RydW5jOgorCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9TSUcpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfbm9uY2VfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwKKwkJICAgdV9pbnQgaXRlbV9sZW4gX1VfLAorCQkgICBjb25zdCB1X2NoYXIgKmVwIF9VXywKKwkJICAgdV9pbnQzMl90IHBoYXNlIF9VXywgdV9pbnQzMl90IGRvaSBfVV8sCisJCSAgIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCit7CisJc3RydWN0IGlzYWttcF9nZW4gZTsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9OT05DRSkpOworCisJVENIRUNLKCpleHQpOworCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKKwlwcmludGYoIiBuIGxlbj0lZCIsIG50b2hzKGUubGVuKSAtIDQpOworCWlmICgyIDwgdmZsYWcgJiYgNCA8IG50b2hzKGUubGVuKSkgeworCQlwcmludGYoIiAiKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIG50b2hzKGUubGVuKSAtIDQpKQorCQkJZ290byB0cnVuYzsKKwl9CisJcmV0dXJuICh1X2NoYXIgKilleHQgKyBudG9ocyhlLmxlbik7Cit0cnVuYzoKKwlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfTk9OQ0UpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfbl9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiwKKwljb25zdCB1X2NoYXIgKmVwLCB1X2ludDMyX3QgcGhhc2UsIHVfaW50MzJfdCBkb2kwIF9VXywKKwl1X2ludDMyX3QgcHJvdG8wIF9VXywgaW50IGRlcHRoKQoreworCXN0cnVjdCBpc2FrbXBfcGxfbiAqcCwgbjsKKwljb25zdCB1X2NoYXIgKmNwOworCXVfY2hhciAqZXAyOworCXVfaW50MzJfdCBkb2k7CisJdV9pbnQzMl90IHByb3RvOworCXN0YXRpYyBjb25zdCBjaGFyICpub3RpZnlfZXJyb3Jfc3RyW10gPSB7CisJCU5VTEwsCQkJCSJJTlZBTElELVBBWUxPQUQtVFlQRSIsCisJCSJET0ktTk9ULVNVUFBPUlRFRCIsCQkiU0lUVUFUSU9OLU5PVC1TVVBQT1JURUQiLAorCQkiSU5WQUxJRC1DT09LSUUiLAkJIklOVkFMSUQtTUFKT1ItVkVSU0lPTiIsCisJCSJJTlZBTElELU1JTk9SLVZFUlNJT04iLAkiSU5WQUxJRC1FWENIQU5HRS1UWVBFIiwKKwkJIklOVkFMSUQtRkxBR1MiLAkJIklOVkFMSUQtTUVTU0FHRS1JRCIsCisJCSJJTlZBTElELVBST1RPQ09MLUlEIiwJCSJJTlZBTElELVNQSSIsCisJCSJJTlZBTElELVRSQU5TRk9STS1JRCIsCQkiQVRUUklCVVRFUy1OT1QtU1VQUE9SVEVEIiwKKwkJIk5PLVBST1BPU0FMLUNIT1NFTiIsCQkiQkFELVBST1BPU0FMLVNZTlRBWCIsCisJCSJQQVlMT0FELU1BTEZPUk1FRCIsCQkiSU5WQUxJRC1LRVktSU5GT1JNQVRJT04iLAorCQkiSU5WQUxJRC1JRC1JTkZPUk1BVElPTiIsCSJJTlZBTElELUNFUlQtRU5DT0RJTkciLAorCQkiSU5WQUxJRC1DRVJUSUZJQ0FURSIsCQkiQ0VSVC1UWVBFLVVOU1VQUE9SVEVEIiwKKwkJIklOVkFMSUQtQ0VSVC1BVVRIT1JJVFkiLAkiSU5WQUxJRC1IQVNILUlORk9STUFUSU9OIiwKKwkJIkFVVEhFTlRJQ0FUSU9OLUZBSUxFRCIsCSJJTlZBTElELVNJR05BVFVSRSIsCisJCSJBRERSRVNTLU5PVElGSUNBVElPTiIsCQkiTk9USUZZLVNBLUxJRkVUSU1FIiwKKwkJIkNFUlRJRklDQVRFLVVOQVZBSUxBQkxFIiwJIlVOU1VQUE9SVEVELUVYQ0hBTkdFLVRZUEUiLAorCQkiVU5FUVVBTC1QQVlMT0FELUxFTkdUSFMiLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKmlwc2VjX25vdGlmeV9lcnJvcl9zdHJbXSA9IHsKKwkJIlJFU0VSVkVEIiwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICpub3RpZnlfc3RhdHVzX3N0cltdID0geworCQkiQ09OTkVDVEVEIiwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICppcHNlY19ub3RpZnlfc3RhdHVzX3N0cltdID0geworCQkiUkVTUE9OREVSLUxJRkVUSU1FIiwJCSJSRVBMQVktU1RBVFVTIiwKKwkJIklOSVRJQUwtQ09OVEFDVCIsCisJfTsKKy8qIE5PVEU6IHRoZXNlIG1hY3JvIG11c3QgYmUgY2FsbGVkIHdpdGggeCBpbiBwcm9wZXIgcmFuZ2UgKi8KKworLyogMCAtIDgxOTEgKi8KKyNkZWZpbmUgTk9USUZZX0VSUk9SX1NUUih4KSBcCisJU1RSX09SX0lEKCh4KSwgbm90aWZ5X2Vycm9yX3N0cikKKworLyogODE5MiAtIDE2MzgzICovCisjZGVmaW5lIElQU0VDX05PVElGWV9FUlJPUl9TVFIoeCkgXAorCVNUUl9PUl9JRCgodV9pbnQpKCh4KSAtIDgxOTIpLCBpcHNlY19ub3RpZnlfZXJyb3Jfc3RyKQorCisvKiAxNjM4NCAtIDI0NTc1ICovCisjZGVmaW5lIE5PVElGWV9TVEFUVVNfU1RSKHgpIFwKKwlTVFJfT1JfSUQoKHVfaW50KSgoeCkgLSAxNjM4NCksIG5vdGlmeV9zdGF0dXNfc3RyKQorCisvKiAyNDU3NiAtIDMyNzY3ICovCisjZGVmaW5lIElQU0VDX05PVElGWV9TVEFUVVNfU1RSKHgpIFwKKwlTVFJfT1JfSUQoKHVfaW50KSgoeCkgLSAyNDU3NiksIGlwc2VjX25vdGlmeV9zdGF0dXNfc3RyKQorCisJcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX04pKTsKKworCXAgPSAoc3RydWN0IGlzYWttcF9wbF9uICopZXh0OworCVRDSEVDSygqcCk7CisJc2FmZW1lbWNweSgmbiwgZXh0LCBzaXplb2YobikpOworCWRvaSA9IG50b2hsKG4uZG9pKTsKKwlwcm90byA9IG4ucHJvdF9pZDsKKwlpZiAoZG9pICE9IDEpIHsKKwkJcHJpbnRmKCIgZG9pPSVkIiwgZG9pKTsKKwkJcHJpbnRmKCIgcHJvdG89JWQiLCBwcm90byk7CisJCWlmIChudG9ocyhuLnR5cGUpIDwgODE5MikKKwkJCXByaW50ZigiIHR5cGU9JXMiLCBOT1RJRllfRVJST1JfU1RSKG50b2hzKG4udHlwZSkpKTsKKwkJZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDE2Mzg0KQorCQkJcHJpbnRmKCIgdHlwZT0lcyIsIG51bXN0cihudG9ocyhuLnR5cGUpKSk7CisJCWVsc2UgaWYgKG50b2hzKG4udHlwZSkgPCAyNDU3NikKKwkJCXByaW50ZigiIHR5cGU9JXMiLCBOT1RJRllfU1RBVFVTX1NUUihudG9ocyhuLnR5cGUpKSk7CisJCWVsc2UKKwkJCXByaW50ZigiIHR5cGU9JXMiLCBudW1zdHIobnRvaHMobi50eXBlKSkpOworCQlpZiAobi5zcGlfc2l6ZSkgeworCQkJcHJpbnRmKCIgc3BpPSIpOworCQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBuLnNwaV9zaXplKSkKKwkJCQlnb3RvIHRydW5jOworCQl9CisJCXJldHVybiAodV9jaGFyICopKHAgKyAxKSArIG4uc3BpX3NpemU7CisJfQorCisJcHJpbnRmKCIgZG9pPWlwc2VjIik7CisJcHJpbnRmKCIgcHJvdG89JXMiLCBQUk9UT0lEU1RSKHByb3RvKSk7CisJaWYgKG50b2hzKG4udHlwZSkgPCA4MTkyKQorCQlwcmludGYoIiB0eXBlPSVzIiwgTk9USUZZX0VSUk9SX1NUUihudG9ocyhuLnR5cGUpKSk7CisJZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDE2Mzg0KQorCQlwcmludGYoIiB0eXBlPSVzIiwgSVBTRUNfTk9USUZZX0VSUk9SX1NUUihudG9ocyhuLnR5cGUpKSk7CisJZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDI0NTc2KQorCQlwcmludGYoIiB0eXBlPSVzIiwgTk9USUZZX1NUQVRVU19TVFIobnRvaHMobi50eXBlKSkpOworCWVsc2UgaWYgKG50b2hzKG4udHlwZSkgPCAzMjc2OCkKKwkJcHJpbnRmKCIgdHlwZT0lcyIsIElQU0VDX05PVElGWV9TVEFUVVNfU1RSKG50b2hzKG4udHlwZSkpKTsKKwllbHNlCisJCXByaW50ZigiIHR5cGU9JXMiLCBudW1zdHIobnRvaHMobi50eXBlKSkpOworCWlmIChuLnNwaV9zaXplKSB7CisJCXByaW50ZigiIHNwaT0iKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBuLnNwaV9zaXplKSkKKwkJCWdvdG8gdHJ1bmM7CisJfQorCisJY3AgPSAodV9jaGFyICopKHAgKyAxKSArIG4uc3BpX3NpemU7CisJZXAyID0gKHVfY2hhciAqKXAgKyBpdGVtX2xlbjsKKworCWlmIChjcCA8IGVwKSB7CisJCXByaW50ZigiIG9yaWc9KCIpOworCQlzd2l0Y2ggKG50b2hzKG4udHlwZSkpIHsKKwkJY2FzZSBJUFNFQ0RPSV9OVFlQRV9SRVNQT05ERVJfTElGRVRJTUU6CisJCSAgICB7CisJCQljb25zdCBzdHJ1Y3QgYXR0cm1hcCAqbWFwID0gb2FrbGV5X3RfbWFwOworCQkJc2l6ZV90IG5tYXAgPSBzaXplb2Yob2FrbGV5X3RfbWFwKS9zaXplb2Yob2FrbGV5X3RfbWFwWzBdKTsKKwkJCXdoaWxlIChjcCA8IGVwICYmIGNwIDwgZXAyKSB7CisJCQkJY3AgPSBpc2FrbXBfYXR0cm1hcF9wcmludChjcCwKKwkJCQkJKGVwIDwgZXAyKSA/IGVwIDogZXAyLCBtYXAsIG5tYXApOworCQkJfQorCQkJYnJlYWs7CisJCSAgICB9CisJCWNhc2UgSVBTRUNET0lfTlRZUEVfUkVQTEFZX1NUQVRVUzoKKwkJCXByaW50ZigicmVwbGF5IGRldGVjdGlvbiAlc2FibGVkIiwKKwkJCQkoKih1X2ludDMyX3QgKiljcCkgPyAiZW4iIDogImRpcyIpOworCQkJYnJlYWs7CisJCWNhc2UgSVNBS01QX05UWVBFX05PX1BST1BPU0FMX0NIT1NFTjoKKwkJCWlmIChpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfU0EsCisJCQkgICAgKHN0cnVjdCBpc2FrbXBfZ2VuICopY3AsIGVwLCBwaGFzZSwgZG9pLCBwcm90bywKKwkJCSAgICBkZXB0aCkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogTlVMTCBpcyBkdW1teSAqLworCQkJaXNha21wX3ByaW50KGduZG8sIGNwLAorCQkJCSAgICAgaXRlbV9sZW4gLSBzaXplb2YoKnApIC0gbi5zcGlfc2l6ZSwKKwkJCQkgICAgIE5VTEwpOworCQl9CisJCXByaW50ZigiKSIpOworCX0KKwlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX04pKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfZF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiBfVV8sCisJICAgICAgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pMCBfVV8sCisJICAgICAgIHVfaW50MzJfdCBwcm90bzAgX1VfLCBpbnQgZGVwdGggX1VfKQoreworCWNvbnN0IHN0cnVjdCBpc2FrbXBfcGxfZCAqcDsKKwlzdHJ1Y3QgaXNha21wX3BsX2QgZDsKKwljb25zdCB1X2ludDhfdCAqcTsKKwl1X2ludDMyX3QgZG9pOworCXVfaW50MzJfdCBwcm90bzsKKwlpbnQgaTsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9EKSk7CisKKwlwID0gKHN0cnVjdCBpc2FrbXBfcGxfZCAqKWV4dDsKKwlUQ0hFQ0soKnApOworCXNhZmVtZW1jcHkoJmQsIGV4dCwgc2l6ZW9mKGQpKTsKKwlkb2kgPSBudG9obChkLmRvaSk7CisJcHJvdG8gPSBkLnByb3RfaWQ7CisJaWYgKGRvaSAhPSAxKSB7CisJCXByaW50ZigiIGRvaT0ldSIsIGRvaSk7CisJCXByaW50ZigiIHByb3RvPSV1IiwgcHJvdG8pOworCX0gZWxzZSB7CisJCXByaW50ZigiIGRvaT1pcHNlYyIpOworCQlwcmludGYoIiBwcm90bz0lcyIsIFBST1RPSURTVFIocHJvdG8pKTsKKwl9CisJcHJpbnRmKCIgc3BpbGVuPSV1IiwgZC5zcGlfc2l6ZSk7CisJcHJpbnRmKCIgbnNwaT0ldSIsIG50b2hzKGQubnVtX3NwaSkpOworCXByaW50ZigiIHNwaT0iKTsKKwlxID0gKHVfaW50OF90ICopKHAgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnRvaHMoZC5udW1fc3BpKTsgaSsrKSB7CisJCWlmIChpICE9IDApCisJCQlwcmludGYoIiwiKTsKKwkJaWYgKCFyYXdwcmludCgoY2FkZHJfdClxLCBkLnNwaV9zaXplKSkKKwkJCWdvdG8gdHJ1bmM7CisJCXEgKz0gZC5zcGlfc2l6ZTsKKwl9CisJcmV0dXJuIHE7Cit0cnVuYzoKKwlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfRCkpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK2lzYWttcF92aWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwKKwkJIHVfaW50IGl0ZW1fbGVuIF9VXywgY29uc3QgdV9jaGFyICplcCBfVV8sCisJCSB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKKwkJIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCit7CisJc3RydWN0IGlzYWttcF9nZW4gZTsKKworCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9WSUQpKTsKKworCVRDSEVDSygqZXh0KTsKKwlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7CisJcHJpbnRmKCIgbGVuPSVkIiwgbnRvaHMoZS5sZW4pIC0gNCk7CisJaWYgKDIgPCB2ZmxhZyAmJiA0IDwgbnRvaHMoZS5sZW4pKSB7CisJCXByaW50ZigiICIpOworCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KShleHQgKyAxKSwgbnRvaHMoZS5sZW4pIC0gNCkpCisJCQlnb3RvIHRydW5jOworCX0KKwlyZXR1cm4gKHVfY2hhciAqKWV4dCArIG50b2hzKGUubGVuKTsKK3RydW5jOgorCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9WSUQpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitpc2FrbXBfc3ViMF9wcmludCh1X2NoYXIgbnAsIGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIGNvbnN0IHVfY2hhciAqZXAsCisJdV9pbnQzMl90IHBoYXNlLCB1X2ludDMyX3QgZG9pLCB1X2ludDMyX3QgcHJvdG8sIGludCBkZXB0aCkKK3sKKwljb25zdCB1X2NoYXIgKmNwOworCXN0cnVjdCBpc2FrbXBfZ2VuIGU7CisJdV9pbnQgaXRlbV9sZW47CisKKwljcCA9ICh1X2NoYXIgKilleHQ7CisJVENIRUNLKCpleHQpOworCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKKworCS8qCisJICogU2luY2Ugd2UgY2FuJ3QgaGF2ZSBhIHBheWxvYWQgbGVuZ3RoIG9mIGxlc3MgdGhhbiA0IGJ5dGVzLAorCSAqIHdlIG5lZWQgdG8gYmFpbCBvdXQgaGVyZSBpZiB0aGUgZ2VuZXJpYyBoZWFkZXIgaXMgbm9uc2Vuc2ljYWwKKwkgKiBvciB0cnVuY2F0ZWQsIG90aGVyd2lzZSB3ZSBjb3VsZCBsb29wIGZvcmV2ZXIgcHJvY2Vzc2luZworCSAqIHplcm8tbGVuZ3RoIGl0ZW1zIG9yIG90aGVyd2lzZSBtaXNkaXNzZWN0IHRoZSBwYWNrZXQuCisJICovCisJaXRlbV9sZW4gPSBudG9ocyhlLmxlbik7CisJaWYgKGl0ZW1fbGVuIDw9IDQpCisJCXJldHVybiBOVUxMOworCisJaWYgKE5QRlVOQyhucCkpIHsKKwkJLyoKKwkJICogWFhYIC0gd2hhdCBpZiBpdGVtX2xlbiBpcyB0b28gc2hvcnQsIG9yIHRvbyBsb25nLAorCQkgKiBmb3IgdGhpcyBwYXlsb2FkIHR5cGU/CisJCSAqLworCQljcCA9ICgqbnBmdW5jW25wXSkoZXh0LCBpdGVtX2xlbiwgZXAsIHBoYXNlLCBkb2ksIHByb3RvLCBkZXB0aCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIlcyIsIE5QU1RSKG5wKSk7CisJCWNwICs9IGl0ZW1fbGVuOworCX0KKworCXJldHVybiBjcDsKK3RydW5jOgorCXByaW50ZigiIFt8aXNha21wXSIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK2lzYWttcF9zdWJfcHJpbnQodV9jaGFyIG5wLCBjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCBjb25zdCB1X2NoYXIgKmVwLAorCXVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaSwgdV9pbnQzMl90IHByb3RvLCBpbnQgZGVwdGgpCit7CisJY29uc3QgdV9jaGFyICpjcDsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXNha21wX2dlbiBlOworCisJY3AgPSAoY29uc3QgdV9jaGFyICopZXh0OworCisJd2hpbGUgKG5wKSB7CisJCVRDSEVDSygqZXh0KTsKKwkJCisJCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKKworCQlUQ0hFQ0syKCpleHQsIG50b2hzKGUubGVuKSk7CisKKwkJZGVwdGgrKzsKKwkJcHJpbnRmKCJcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKKwkJCXByaW50ZigiICAgICIpOworCQlwcmludGYoIigiKTsKKwkJY3AgPSBpc2FrbXBfc3ViMF9wcmludChucCwgZXh0LCBlcCwgcGhhc2UsIGRvaSwgcHJvdG8sIGRlcHRoKTsKKwkJcHJpbnRmKCIpIik7CisJCWRlcHRoLS07CisKKwkJaWYgKGNwID09IE5VTEwpIHsKKwkJCS8qIFplcm8tbGVuZ3RoIHN1Yml0ZW0gKi8KKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJbnAgPSBlLm5wOworCQlleHQgPSAoc3RydWN0IGlzYWttcF9nZW4gKiljcDsKKwl9CisJcmV0dXJuIGNwOwordHJ1bmM6CisJcHJpbnRmKCIgW3wlc10iLCBOUFNUUihucCkpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqCitudW1zdHIoaW50IHgpCit7CisJc3RhdGljIGNoYXIgYnVmWzIwXTsKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIyVkIiwgeCk7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIHNvbWUgY29tcGlsZXIgdHJpZXMgdG8gb3B0aW1pemUgbWVtY3B5KCksIHVzaW5nIHRoZSBhbGlnbm1lbnQgY29uc3RyYWludAorICogb24gdGhlIGFyZ3VtZW50IHBvaW50ZXIgdHlwZS4gIGJ5IHVzaW5nIHRoaXMgZnVuY3Rpb24sIHdlIHRyeSB0byBhdm9pZCB0aGUKKyAqIG9wdGltaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3NhZmVtZW1jcHkodm9pZCAqcCwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IGwpCit7CisJbWVtY3B5KHAsIHEsIGwpOworfQorCit2b2lkCitpc2FrbXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJICAgICBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsCisJICAgICBjb25zdCB1X2NoYXIgKmJwMikKK3sKKwljb25zdCBzdHJ1Y3QgaXNha21wICpwOworCXN0cnVjdCBpc2FrbXAgYmFzZTsKKwljb25zdCB1X2NoYXIgKmVwOworCXVfY2hhciBucDsKKwlpbnQgaTsKKwlpbnQgcGhhc2U7CisJaW50IG1ham9yLCBtaW5vcjsKKworCXAgPSAoY29uc3Qgc3RydWN0IGlzYWttcCAqKWJwOworCWVwID0gbmRvLT5uZG9fc25hcGVuZDsKKworCWlmICgoc3RydWN0IGlzYWttcCAqKWVwIDwgcCArIDEpIHsKKwkJcHJpbnRmKCJbfGlzYWttcF0iKTsKKwkJcmV0dXJuOworCX0KKworCXNhZmVtZW1jcHkoJmJhc2UsIHAsIHNpemVvZihiYXNlKSk7CisKKwlwcmludGYoImlzYWttcCIpOworCWlmICh2ZmxhZykgeworCQltYWpvciA9IChiYXNlLnZlcnMgJiBJU0FLTVBfVkVSU19NQUpPUikKKwkJCQk+PiBJU0FLTVBfVkVSU19NQUpPUl9TSElGVDsKKwkJbWlub3IgPSAoYmFzZS52ZXJzICYgSVNBS01QX1ZFUlNfTUlOT1IpCisJCQkJPj4gSVNBS01QX1ZFUlNfTUlOT1JfU0hJRlQ7CisJCXByaW50ZigiICVkLiVkIiwgbWFqb3IsIG1pbm9yKTsKKwl9CisKKwlpZiAodmZsYWcpIHsKKwkJcHJpbnRmKCIgbXNnaWQgIik7CisJCXJhd3ByaW50KChjYWRkcl90KSZiYXNlLm1zZ2lkLCBzaXplb2YoYmFzZS5tc2dpZCkpOworCX0KKworCWlmICgxIDwgdmZsYWcpIHsKKwkJcHJpbnRmKCIgY29va2llICIpOworCQlyYXdwcmludCgoY2FkZHJfdCkmYmFzZS5pX2NrLCBzaXplb2YoYmFzZS5pX2NrKSk7CisJCXByaW50ZigiLT4iKTsKKwkJcmF3cHJpbnQoKGNhZGRyX3QpJmJhc2Uucl9jaywgc2l6ZW9mKGJhc2Uucl9jaykpOworCX0KKwlwcmludGYoIjoiKTsKKworCXBoYXNlID0gKCoodV9pbnQzMl90ICopYmFzZS5tc2dpZCA9PSAwKSA/IDEgOiAyOworCWlmIChwaGFzZSA9PSAxKQorCQlwcmludGYoIiBwaGFzZSAlZCIsIHBoYXNlKTsKKwllbHNlCisJCXByaW50ZigiIHBoYXNlICVkL290aGVycyIsIHBoYXNlKTsKKworCWkgPSBjb29raWVfZmluZCgmYmFzZS5pX2NrKTsKKwlpZiAoaSA8IDApIHsKKwkJaWYgKGlzemVybygodV9jaGFyICopJmJhc2Uucl9jaywgc2l6ZW9mKGJhc2Uucl9jaykpKSB7CisJCQkvKiB0aGUgZmlyc3QgcGFja2V0ICovCisJCQlwcmludGYoIiBJIik7CisJCQlpZiAoYnAyKQorCQkJCWNvb2tpZV9yZWNvcmQoJmJhc2UuaV9jaywgYnAyKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIiA/Iik7CisJfSBlbHNlIHsKKwkJaWYgKGJwMiAmJiBjb29raWVfaXNpbml0aWF0b3IoaSwgYnAyKSkKKwkJCXByaW50ZigiIEkiKTsKKwkJZWxzZSBpZiAoYnAyICYmIGNvb2tpZV9pc3Jlc3BvbmRlcihpLCBicDIpKQorCQkJcHJpbnRmKCIgUiIpOworCQllbHNlCisJCQlwcmludGYoIiA/Iik7CisJfQorCisJcHJpbnRmKCIgJXMiLCBFVFlQRVNUUihiYXNlLmV0eXBlKSk7CisJaWYgKGJhc2UuZmxhZ3MpIHsKKwkJcHJpbnRmKCJbJXMlc10iLCBiYXNlLmZsYWdzICYgSVNBS01QX0ZMQUdfRSA/ICJFIiA6ICIiLAorCQkJYmFzZS5mbGFncyAmIElTQUtNUF9GTEFHX0MgPyAiQyIgOiAiIik7CisJfQorCisJaWYgKHZmbGFnKSB7CisJCWNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQ7CisJCWludCBucGFyZW47CisKKyNkZWZpbmUgQ0hFQ0tMRU4ocCwgbnApIFwKKwkJaWYgKGVwIDwgKHVfY2hhciAqKShwKSkgewkJCQlcCisJCQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKG5wKSk7CQkJXAorCQkJZ290byBkb25lOwkJCQkJXAorCQl9CisKKwkJcHJpbnRmKCI6Iik7CisKKwkJLyogcmVnYXJkbGVzcyBvZiBwaGFzZS4uLiAqLworCQlpZiAoYmFzZS5mbGFncyAmIElTQUtNUF9GTEFHX0UpIHsKKwkJCS8qCisJCQkgKiBlbmNyeXB0ZWQsIG5vdGhpbmcgd2UgY2FuIGRvIHJpZ2h0IG5vdy4KKwkJCSAqIHdlIGhvcGUgdG8gZGVjcnlwdCB0aGUgcGFja2V0IGluIHRoZSBmdXR1cmUuLi4KKwkJCSAqLworCQkJcHJpbnRmKCIgW2VuY3J5cHRlZCAlc10iLCBOUFNUUihiYXNlLm5wKSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlucGFyZW4gPSAwOworCQlDSEVDS0xFTihwICsgMSwgYmFzZS5ucCkKKworCQlucCA9IGJhc2UubnA7CisJCWV4dCA9IChzdHJ1Y3QgaXNha21wX2dlbiAqKShwICsgMSk7CisJCWlzYWttcF9zdWJfcHJpbnQobnAsIGV4dCwgZXAsIHBoYXNlLCAwLCAwLCAwKTsKKwl9CisKK2RvbmU6CisJaWYgKHZmbGFnKSB7CisJCWlmIChudG9obChiYXNlLmxlbikgIT0gbGVuZ3RoKSB7CisJCQlwcmludGYoIiAobGVuIG1pc21hdGNoOiBpc2FrbXAgJXUvaXAgJXUpIiwKKwkJCQkodV9pbnQzMl90KW50b2hsKGJhc2UubGVuKSwgbGVuZ3RoKTsKKwkJfQorCX0KK30KKwordm9pZAoraXNha21wX3JmYzM5NDhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCisJCSAgICAgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLAorCQkgICAgIGNvbnN0IHVfY2hhciAqYnAyKQoreworCWNvbnN0IHVfY2hhciAqZXA7CisJZXAgPSBuZG8tPm5kb19zbmFwZW5kOworCisJaWYobGVuZ3RoID09IDEgJiYgYnBbMF09PTB4ZmYpIHsKKwkJTkRfUFJJTlQoKG5kbywgImlzYWttcC1uYXQta2VlcC1hbGl2ZSIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmKGxlbmd0aCA8IDQpIHsKKwkJZ290byB0cnVuYzsKKwl9CisKKwkvKgorCSAqIHNlZSBpZiB0aGlzIGlzIGFuIElLRSBwYWNrZXQKKwkgKi8KKwlpZihicFswXT09MCAmJiBicFsxXT09MCAmJiBicFsyXT09MCAmJiBicFszXT09MCkgeworCQlORF9QUklOVCgobmRvLCAiTk9ORVNQLWVuY2FwOiAiKSk7CisJCWlzYWttcF9wcmludChuZG8sIGJwKzQsIGxlbmd0aC00LCBicDIpOworCQlyZXR1cm47CisJfQorCisJLyogbXVzdCBiZSBhbiBFU1AgcGFja2V0ICovCisJeworCQlpbnQgbmgsIGVuaCwgcGFkbGVuOworCQlpbnQgYWR2YW5jZTsKKworCQlORF9QUklOVCgobmRvLCAiVURQLWVuY2FwOiAiKSk7CisKKwkJYWR2YW5jZSA9IGVzcF9wcmludChuZG8sIGJwLCBsZW5ndGgsIGJwMiwgJmVuaCwgJnBhZGxlbik7CisJCWlmKGFkdmFuY2UgPD0gMCkKKwkJCXJldHVybjsKKworCQlicCArPSBhZHZhbmNlOworCQlsZW5ndGggLT0gYWR2YW5jZSArIHBhZGxlbjsKKwkJbmggPSBlbmggJiAweGZmOworCSAgICAgCisJCWlwX3ByaW50X2lubmVyKG5kbywgYnAsIGxlbmd0aCwgbmgsIGJwMik7CisJCXJldHVybjsKKwl9CisKK3RydW5jOgorCXByaW50ZigiW3xpc2FrbXBdIik7CisJcmV0dXJuOworfQorCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaXNvY2xucy5jIGIvcHJpbnQtaXNvY2xucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTM1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1pc29jbG5zLmMKQEAgLTAsMCArMSwyNzA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBNYXR0IFRob21hcywgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KKyAqCisgKiBFeHRlbnNpdmVseSBtb2RpZmllZCBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KSBmb3IgbW9yZQorICogY29tcGxldGUgSVMtSVMgJiBDTE5QIHN1cHBvcnQuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXNvY2xucy5jLHYgMS4xMzMuMi4yNSAyMDA3LzAzLzAyIDA5OjIwOjI3IGhhbm5lcyBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisjaW5jbHVkZSAiZXRoZXIuaCIKKyNpbmNsdWRlICJubHBpZC5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJnbXBscy5oIgorI2luY2x1ZGUgIm91aS5oIgorCisjZGVmaW5lIElQVjQgICAgICAgICAgICAxICAgICAgIC8qIEFGSSB2YWx1ZSAqLworI2RlZmluZSBJUFY2ICAgICAgICAgICAgMiAgICAgICAvKiBBRkkgdmFsdWUgKi8KKworLyoKKyAqIElTLUlTIGlzIGRlZmluZWQgaW4gSVNPIDEwNTg5LiAgTG9vayB0aGVyZSBmb3IgcHJvdG9jb2wgZGVmaW5pdGlvbnMuCisgKi8KKworI2RlZmluZSBTWVNURU1fSURfTEVOCUVUSEVSX0FERFJfTEVOCisjZGVmaW5lIE5PREVfSURfTEVOICAgICBTWVNURU1fSURfTEVOKzEKKyNkZWZpbmUgTFNQX0lEX0xFTiAgICAgIFNZU1RFTV9JRF9MRU4rMgorCisjZGVmaW5lIElTSVNfVkVSU0lPTgkxCisjZGVmaW5lIEVTSVNfVkVSU0lPTgkxCisjZGVmaW5lIENMTlBfVkVSU0lPTgkxCisKKyNkZWZpbmUgSVNJU19QRFVfVFlQRV9NQVNLICAgICAgMHgxRgorI2RlZmluZSBFU0lTX1BEVV9UWVBFX01BU0sgICAgICAweDFGCisjZGVmaW5lIENMTlBfUERVX1RZUEVfTUFTSyAgICAgIDB4MUYKKyNkZWZpbmUgQ0xOUF9GTEFHX01BU0sgICAgICAgICAgMHhFMAorI2RlZmluZSBJU0lTX0xBTl9QUklPUklUWV9NQVNLICAweDdGCisKKyNkZWZpbmUgSVNJU19QRFVfTDFfTEFOX0lJSAkxNQorI2RlZmluZSBJU0lTX1BEVV9MMl9MQU5fSUlICTE2CisjZGVmaW5lIElTSVNfUERVX1BUUF9JSUgJMTcKKyNkZWZpbmUgSVNJU19QRFVfTDFfTFNQICAgICAgIAkxOAorI2RlZmluZSBJU0lTX1BEVV9MMl9MU1AgICAgICAgCTIwCisjZGVmaW5lIElTSVNfUERVX0wxX0NTTlAgIAkyNAorI2RlZmluZSBJU0lTX1BEVV9MMl9DU05QICAJMjUKKyNkZWZpbmUgSVNJU19QRFVfTDFfUFNOUCAgICAgICAgMjYKKyNkZWZpbmUgSVNJU19QRFVfTDJfUFNOUCAgICAgICAgMjcKKworc3RhdGljIHN0cnVjdCB0b2sgaXNpc19wZHVfdmFsdWVzW10gPSB7CisgICAgeyBJU0lTX1BEVV9MMV9MQU5fSUlILCAgICAgICAiTDEgTGFuIElJSCJ9LAorICAgIHsgSVNJU19QRFVfTDJfTEFOX0lJSCwgICAgICAgIkwyIExhbiBJSUgifSwKKyAgICB7IElTSVNfUERVX1BUUF9JSUgsICAgICAgICAgICJwMnAgSUlIIn0sCisgICAgeyBJU0lTX1BEVV9MMV9MU1AsICAgICAgICAgICAiTDEgTFNQIn0sCisgICAgeyBJU0lTX1BEVV9MMl9MU1AsICAgICAgICAgICAiTDIgTFNQIn0sCisgICAgeyBJU0lTX1BEVV9MMV9DU05QLCAgICAgICAgICAiTDEgQ1NOUCJ9LAorICAgIHsgSVNJU19QRFVfTDJfQ1NOUCwgICAgICAgICAgIkwyIENTTlAifSwKKyAgICB7IElTSVNfUERVX0wxX1BTTlAsICAgICAgICAgICJMMSBQU05QIn0sCisgICAgeyBJU0lTX1BEVV9MMl9QU05QLCAgICAgICAgICAiTDIgUFNOUCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKKy8qCisgKiBBIFRMViBpcyBhIHR1cGxlIG9mIGEgdHlwZSwgbGVuZ3RoIGFuZCBhIHZhbHVlIGFuZCBpcyBub3JtYWxseSB1c2VkIGZvcgorICogZW5jb2RpbmcgaW5mb3JtYXRpb24gaW4gYWxsIHNvcnRzIG9mIHBsYWNlcy4gIFRoaXMgaXMgYW4gZW51bWVyYXRpb24gb2YKKyAqIHRoZSB3ZWxsIGtub3duIHR5cGVzLgorICoKKyAqIGxpc3QgdGFrZW4gZnJvbSByZmMzMzU5IHBsdXMgc29tZSBtZW1vcnkgZnJvbSB2ZXRlcmFucyA7LSkKKyAqLworCisjZGVmaW5lIElTSVNfVExWX0FSRUFfQUREUiAgICAgICAgICAgMSAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0lTX1JFQUNIICAgICAgICAgICAgMiAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0VTTkVJR0ggICAgICAgICAgICAgMyAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX1BBUlRfRElTICAgICAgICAgICAgNCAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX1BSRUZJWF9ORUlHSCAgICAgICAgNSAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0lTTkVJR0ggICAgICAgICAgICAgNiAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0lTTkVJR0hfVkFSTEVOICAgICAgNyAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX1BBRERJTkcgICAgICAgICAgICAgOCAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0xTUCAgICAgICAgICAgICAgICAgOSAgIC8qIGlzbzEwNTg5ICovCisjZGVmaW5lIElTSVNfVExWX0FVVEggICAgICAgICAgICAgICAgMTAgIC8qIGlzbzEwNTg5LCByZmMzNTY3ICovCisjZGVmaW5lIElTSVNfVExWX0NIRUNLU1VNICAgICAgICAgICAgMTIgIC8qIHJmYzMzNTggKi8KKyNkZWZpbmUgSVNJU19UTFZfQ0hFQ0tTVU1fTUlOTEVOIDIKKyNkZWZpbmUgSVNJU19UTFZfTFNQX0JVRkZFUlNJWkUgICAgICAxNCAgLyogaXNvMTA1ODkgcmV2MiAqLworI2RlZmluZSBJU0lTX1RMVl9MU1BfQlVGRkVSU0laRV9NSU5MRU4gMgorI2RlZmluZSBJU0lTX1RMVl9FWFRfSVNfUkVBQ0ggICAgICAgIDIyICAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLworI2RlZmluZSBJU0lTX1RMVl9JU19BTElBU19JRCAgICAgICAgIDI0ICAvKiBkcmFmdC1pZXRmLWlzaXMtZXh0LWxzcC1mcmFncy0wMiAqLworI2RlZmluZSBJU0lTX1RMVl9ERUNORVRfUEhBU0U0ICAgICAgIDQyCisjZGVmaW5lIElTSVNfVExWX0xVQ0VOVF9QUklWQVRFICAgICAgNjYKKyNkZWZpbmUgSVNJU19UTFZfSU5UX0lQX1JFQUNIICAgICAgICAxMjggLyogcmZjMTE5NSwgcmZjMjk2NiAqLworI2RlZmluZSBJU0lTX1RMVl9QUk9UT0NPTFMgICAgICAgICAgIDEyOSAvKiByZmMxMTk1ICovCisjZGVmaW5lIElTSVNfVExWX0VYVF9JUF9SRUFDSCAgICAgICAgMTMwIC8qIHJmYzExOTUsIHJmYzI5NjYgKi8KKyNkZWZpbmUgSVNJU19UTFZfSURSUF9JTkZPICAgICAgICAgICAxMzEgLyogcmZjMTE5NSAqLworI2RlZmluZSBJU0lTX1RMVl9JRFJQX0lORk9fTUlOTEVOICAgICAgMQorI2RlZmluZSBJU0lTX1RMVl9JUEFERFIgICAgICAgICAgICAgIDEzMiAvKiByZmMxMTk1ICovCisjZGVmaW5lIElTSVNfVExWX0lQQVVUSCAgICAgICAgICAgICAgMTMzIC8qIHJmYzExOTUgKi8KKyNkZWZpbmUgSVNJU19UTFZfVEVfUk9VVEVSX0lEICAgICAgICAxMzQgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KKyNkZWZpbmUgSVNJU19UTFZfRVhURF9JUF9SRUFDSCAgICAgICAxMzUgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KKyNkZWZpbmUgSVNJU19UTFZfSE9TVE5BTUUgICAgICAgICAgICAxMzcgLyogcmZjMjc2MyAqLworI2RlZmluZSBJU0lTX1RMVl9TSEFSRURfUklTS19HUk9VUCAgIDEzOCAvKiBkcmFmdC1pZXRmLWlzaXMtZ21wbHMtZXh0ZW5zaW9ucyAqLworI2RlZmluZSBJU0lTX1RMVl9OT1JURUxfUFJJVkFURTEgICAgIDE3NgorI2RlZmluZSBJU0lTX1RMVl9OT1JURUxfUFJJVkFURTIgICAgIDE3NworI2RlZmluZSBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElORyAgIDIxMSAvKiByZmMzODQ3ICovCisjZGVmaW5lIElTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0ZMQUdMRU4gMQorI2RlZmluZSBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19IT0xEVElNRUxFTiAyCisjZGVmaW5lIElTSVNfVExWX01UX0lTX1JFQUNIICAgICAgICAgMjIyIC8qIGRyYWZ0LWlldGYtaXNpcy13Zy1tdWx0aS10b3BvbG9neS0wNSAqLworI2RlZmluZSBJU0lTX1RMVl9NVF9TVVBQT1JURUQgICAgICAgIDIyOSAvKiBkcmFmdC1pZXRmLWlzaXMtd2ctbXVsdGktdG9wb2xvZ3ktMDUgKi8KKyNkZWZpbmUgSVNJU19UTFZfTVRfU1VQUE9SVEVEX01JTkxFTiAyCisjZGVmaW5lIElTSVNfVExWX0lQNkFERFIgICAgICAgICAgICAgMjMyIC8qIGRyYWZ0LWlldGYtaXNpcy1pcHY2LTAyICovCisjZGVmaW5lIElTSVNfVExWX01UX0lQX1JFQUNIICAgICAgICAgMjM1IC8qIGRyYWZ0LWlldGYtaXNpcy13Zy1tdWx0aS10b3BvbG9neS0wNSAqLworI2RlZmluZSBJU0lTX1RMVl9JUDZfUkVBQ0ggICAgICAgICAgIDIzNiAvKiBkcmFmdC1pZXRmLWlzaXMtaXB2Ni0wMiAqLworI2RlZmluZSBJU0lTX1RMVl9NVF9JUDZfUkVBQ0ggICAgICAgIDIzNyAvKiBkcmFmdC1pZXRmLWlzaXMtd2ctbXVsdGktdG9wb2xvZ3ktMDUgKi8KKyNkZWZpbmUgSVNJU19UTFZfUFRQX0FESiAgICAgICAgICAgICAyNDAgLyogcmZjMzM3MyAqLworI2RlZmluZSBJU0lTX1RMVl9JSUhfU0VRTlIgICAgICAgICAgIDI0MSAvKiBkcmFmdC1zaGVuLWlzaXMtaWloLXNlcXVlbmNlLTAwICovCisjZGVmaW5lIElTSVNfVExWX0lJSF9TRVFOUl9NSU5MRU4gNAorI2RlZmluZSBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURSAgICAgIDI1MCAvKiBkcmFmdC1pZXRmLWlzaXMtZXhwZXJpbWVudGFsLXRsdi0wMSAqLworI2RlZmluZSBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURV9NSU5MRU4gMworCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX3Rsdl92YWx1ZXNbXSA9IHsKKyAgICB7IElTSVNfVExWX0FSRUFfQUREUiwJICAgIkFyZWEgYWRkcmVzcyhlcykifSwKKyAgICB7IElTSVNfVExWX0lTX1JFQUNILCAgICAgICAgICAgIklTIFJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfRVNORUlHSCwgICAgICAgICAgICAiRVMgTmVpZ2hib3IocykifSwKKyAgICB7IElTSVNfVExWX1BBUlRfRElTLCAgICAgICAgICAgIlBhcnRpdGlvbiBESVMifSwKKyAgICB7IElTSVNfVExWX1BSRUZJWF9ORUlHSCwgICAgICAgIlByZWZpeCBOZWlnaGJvcnMifSwKKyAgICB7IElTSVNfVExWX0lTTkVJR0gsICAgICAgICAgICAgIklTIE5laWdoYm9yKHMpIn0sCisgICAgeyBJU0lTX1RMVl9JU05FSUdIX1ZBUkxFTiwgICAgICJJUyBOZWlnaGJvcihzKSAodmFyaWFibGUgbGVuZ3RoKSJ9LAorICAgIHsgSVNJU19UTFZfUEFERElORywgICAgICAgICAgICAiUGFkZGluZyJ9LAorICAgIHsgSVNJU19UTFZfTFNQLCAgICAgICAgICAgICAgICAiTFNQIGVudHJpZXMifSwKKyAgICB7IElTSVNfVExWX0FVVEgsICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIn0sCisgICAgeyBJU0lTX1RMVl9DSEVDS1NVTSwgICAgICAgICAgICJDaGVja3N1bSJ9LAorICAgIHsgSVNJU19UTFZfTFNQX0JVRkZFUlNJWkUsICAgICAiTFNQIEJ1ZmZlcnNpemUifSwKKyAgICB7IElTSVNfVExWX0VYVF9JU19SRUFDSCwgICAgICAgIkV4dGVuZGVkIElTIFJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfSVNfQUxJQVNfSUQsICAgICAgICAiSVMgQWxpYXMgSUQifSwKKyAgICB7IElTSVNfVExWX0RFQ05FVF9QSEFTRTQsICAgICAgIkRFQ25ldCBQaGFzZSBJViJ9LAorICAgIHsgSVNJU19UTFZfTFVDRU5UX1BSSVZBVEUsICAgICAiTHVjZW50IFByb3ByaWV0YXJ5In0sCisgICAgeyBJU0lTX1RMVl9JTlRfSVBfUkVBQ0gsICAgICAgICJJUHY0IEludGVybmFsIFJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfUFJPVE9DT0xTLCAgICAgICAgICAiUHJvdG9jb2xzIHN1cHBvcnRlZCJ9LAorICAgIHsgSVNJU19UTFZfRVhUX0lQX1JFQUNILCAgICAgICAiSVB2NCBFeHRlcm5hbCBSZWFjaGFiaWxpdHkifSwKKyAgICB7IElTSVNfVExWX0lEUlBfSU5GTywgICAgICAgICAgIkludGVyLURvbWFpbiBJbmZvcm1hdGlvbiBUeXBlIn0sCisgICAgeyBJU0lTX1RMVl9JUEFERFIsICAgICAgICAgICAgICJJUHY0IEludGVyZmFjZSBhZGRyZXNzKGVzKSJ9LAorICAgIHsgSVNJU19UTFZfSVBBVVRILCAgICAgICAgICAgICAiSVB2NCBhdXRoZW50aWNhdGlvbiAoZGVwcmVjYXRlZCkifSwKKyAgICB7IElTSVNfVExWX1RFX1JPVVRFUl9JRCwgICAgICAgIlRyYWZmaWMgRW5naW5lZXJpbmcgUm91dGVyIElEIn0sCisgICAgeyBJU0lTX1RMVl9FWFREX0lQX1JFQUNILCAgICAgICJFeHRlbmRlZCBJUHY0IFJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfU0hBUkVEX1JJU0tfR1JPVVAsICAiU2hhcmVkIFJpc2sgTGluayBHcm91cCJ9LAorICAgIHsgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUxLCAgICAiTm9ydGVsIFByb3ByaWV0YXJ5In0sCisgICAgeyBJU0lTX1RMVl9OT1JURUxfUFJJVkFURTIsICAgICJOb3J0ZWwgUHJvcHJpZXRhcnkifSwKKyAgICB7IElTSVNfVExWX0hPU1ROQU1FLCAgICAgICAgICAgIkhvc3RuYW1lIn0sCisgICAgeyBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElORywgICJSZXN0YXJ0IFNpZ25hbGluZyJ9LAorICAgIHsgSVNJU19UTFZfTVRfSVNfUkVBQ0gsICAgICAgICAiTXVsdGkgVG9wb2xvZ3kgSVMgUmVhY2hhYmlsaXR5In0sCisgICAgeyBJU0lTX1RMVl9NVF9TVVBQT1JURUQsICAgICAgICJNdWx0aSBUb3BvbG9neSJ9LAorICAgIHsgSVNJU19UTFZfSVA2QUREUiwgICAgICAgICAgICAiSVB2NiBJbnRlcmZhY2UgYWRkcmVzcyhlcykifSwKKyAgICB7IElTSVNfVExWX01UX0lQX1JFQUNILCAgICAgICAgIk11bHRpLVRvcG9sb2d5IElQdjQgUmVhY2hhYmlsaXR5In0sCisgICAgeyBJU0lTX1RMVl9JUDZfUkVBQ0gsICAgICAgICAgICJJUHY2IHJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfTVRfSVA2X1JFQUNILCAgICAgICAiTXVsdGktVG9wb2xvZ3kgSVA2IFJlYWNoYWJpbGl0eSJ9LAorICAgIHsgSVNJU19UTFZfUFRQX0FESiwgICAgICAgICAgICAiUG9pbnQtdG8tcG9pbnQgQWRqYWNlbmN5IFN0YXRlIn0sCisgICAgeyBJU0lTX1RMVl9JSUhfU0VRTlIsICAgICAgICAgICJIZWxsbyBQRFUgU2VxdWVuY2UgTnVtYmVyIn0sCisgICAgeyBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURSwgICAgICJWZW5kb3IgUHJpdmF0ZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lIEVTSVNfT1BUSU9OX1BST1RPQ09MUyAgICAgICAgMTI5CisjZGVmaW5lIEVTSVNfT1BUSU9OX1FPU19NQUlOVEVOQU5DRSAgMTk1IC8qIGlzbzk1NDIgKi8KKyNkZWZpbmUgRVNJU19PUFRJT05fU0VDVVJJVFkgICAgICAgICAxOTcgLyogaXNvOTU0MiAqLworI2RlZmluZSBFU0lTX09QVElPTl9FU19DT05GX1RJTUUgICAgIDE5OCAvKiBpc285NTQyICovCisjZGVmaW5lIEVTSVNfT1BUSU9OX1BSSU9SSVRZICAgICAgICAgMjA1IC8qIGlzbzk1NDIgKi8KKyNkZWZpbmUgRVNJU19PUFRJT05fQUREUkVTU19NQVNLICAgICAyMjUgLyogaXNvOTU0MiAqLworI2RlZmluZSBFU0lTX09QVElPTl9TTlBBX01BU0sgICAgICAgIDIyNiAvKiBpc285NTQyICovCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGVzaXNfb3B0aW9uX3ZhbHVlc1tdID0geworICAgIHsgRVNJU19PUFRJT05fUFJPVE9DT0xTLCAgICAgICAiUHJvdG9jb2xzIHN1cHBvcnRlZCJ9LAorICAgIHsgRVNJU19PUFRJT05fUU9TX01BSU5URU5BTkNFLCAiUW9TIE1haW50ZW5hbmNlIiB9LAorICAgIHsgRVNJU19PUFRJT05fU0VDVVJJVFksICAgICAgICAiU2VjdXJpdHkiIH0sCisgICAgeyBFU0lTX09QVElPTl9FU19DT05GX1RJTUUsICAgICJFUyBDb25maWd1cmF0aW9uIFRpbWUiIH0sCisgICAgeyBFU0lTX09QVElPTl9QUklPUklUWSwgICAgICAgICJQcmlvcml0eSIgfSwKKyAgICB7IEVTSVNfT1BUSU9OX0FERFJFU1NfTUFTSywgICAgIkFkZHJlc3NrIE1hc2siIH0sCisgICAgeyBFU0lTX09QVElPTl9TTlBBX01BU0ssICAgICAgICJTTlBBIE1hc2siIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKyNkZWZpbmUgQ0xOUF9PUFRJT05fRElTQ0FSRF9SRUFTT04gICAxOTMKKyNkZWZpbmUgQ0xOUF9PUFRJT05fUU9TX01BSU5URU5BTkNFICAxOTUgLyogaXNvODQ3MyAqLworI2RlZmluZSBDTE5QX09QVElPTl9TRUNVUklUWSAgICAgICAgIDE5NyAvKiBpc284NDczICovCisjZGVmaW5lIENMTlBfT1BUSU9OX1NPVVJDRV9ST1VUSU5HICAgMjAwIC8qIGlzbzg0NzMgKi8KKyNkZWZpbmUgQ0xOUF9PUFRJT05fUk9VVEVfUkVDT1JESU5HICAyMDMgLyogaXNvODQ3MyAqLworI2RlZmluZSBDTE5QX09QVElPTl9QQURESU5HICAgICAgICAgIDIwNCAvKiBpc284NDczICovCisjZGVmaW5lIENMTlBfT1BUSU9OX1BSSU9SSVRZICAgICAgICAgMjA1IC8qIGlzbzg0NzMgKi8KKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fdmFsdWVzW10gPSB7CisgICAgeyBDTE5QX09QVElPTl9ESVNDQVJEX1JFQVNPTiwgICJEaXNjYXJkIFJlYXNvbiJ9LAorICAgIHsgQ0xOUF9PUFRJT05fUFJJT1JJVFksICAgICAgICAiUHJpb3JpdHkifSwKKyAgICB7IENMTlBfT1BUSU9OX1FPU19NQUlOVEVOQU5DRSwgIlFvUyBNYWludGVuYW5jZSJ9LAorICAgIHsgQ0xOUF9PUFRJT05fU0VDVVJJVFksICJTZWN1cml0eSJ9LAorICAgIHsgQ0xOUF9PUFRJT05fU09VUkNFX1JPVVRJTkcsICJTb3VyY2UgUm91dGluZyJ9LAorICAgIHsgQ0xOUF9PUFRJT05fUk9VVEVfUkVDT1JESU5HLCAiUm91dGUgUmVjb3JkaW5nIn0sCisgICAgeyBDTE5QX09QVElPTl9QQURESU5HLCAiUGFkZGluZyJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBjbG5wX29wdGlvbl9yZmRfY2xhc3NfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJHZW5lcmFsIn0sCisgICAgeyAweDgsICJBZGRyZXNzIn0sCisgICAgeyAweDksICJTb3VyY2UgUm91dGVpbmcifSwKKyAgICB7IDB4YSwgIkxpZmV0aW1lIn0sCisgICAgeyAweGIsICJQRFUgRGlzY2FyZGVkIn0sCisgICAgeyAweGMsICJSZWFzc2VtYmx5In0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3JmZF9nZW5lcmFsX3ZhbHVlc1tdID0geworICAgIHsgMHgwLCAiUmVhc29uIG5vdCBzcGVjaWZpZWQifSwKKyAgICB7IDB4MSwgIlByb3RvY29sIHByb2NlZHVyZSBlcnJvciJ9LAorICAgIHsgMHgyLCAiSW5jb3JyZWN0IGNoZWNrc3VtIn0sCisgICAgeyAweDMsICJQRFUgZGlzY2FyZGVkIGR1ZSB0byBjb25nZXN0aW9uIn0sCisgICAgeyAweDQsICJIZWFkZXIgc3ludGF4IGVycm9yIChjYW5ub3QgYmUgcGFyc2VkKSJ9LAorICAgIHsgMHg1LCAiU2VnbWVudGF0aW9uIG5lZWRlZCBidXQgbm90IHBlcm1pdHRlZCJ9LAorICAgIHsgMHg2LCAiSW5jb21wbGV0ZSBQRFUgcmVjZWl2ZWQifSwKKyAgICB7IDB4NywgIkR1cGxpY2F0ZSBvcHRpb24ifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcmZkX2FkZHJlc3NfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJEZXN0aW5hdGlvbiBhZGRyZXNzIHVucmVhY2hhYmxlIn0sCisgICAgeyAweDEsICJEZXN0aW5hdGlvbiBhZGRyZXNzIHVua25vd24ifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcmZkX3NvdXJjZV9yb3V0ZWluZ192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MCwgIlVuc3BlY2lmaWVkIHNvdXJjZSByb3V0ZWluZyBlcnJvciJ9LAorICAgIHsgMHgxLCAiU3ludGF4IGVycm9yIGluIHNvdXJjZSByb3V0ZWluZyBmaWVsZCJ9LAorICAgIHsgMHgyLCAiVW5rbm93biBhZGRyZXNzIGluIHNvdXJjZSByb3V0ZWluZyBmaWVsZCJ9LAorICAgIHsgMHgzLCAiUGF0aCBub3QgYWNjZXB0YWJsZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBjbG5wX29wdGlvbl9yZmRfbGlmZXRpbWVfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJMaWZldGltZSBleHBpcmVkIHdoaWxlIGRhdGEgdW5pdCBpbiB0cmFuc2l0In0sCisgICAgeyAweDEsICJMaWZldGltZSBleHBpcmVkIGR1cmluZyByZWFzc2VtYmx5In0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3JmZF9wZHVfZGlzY2FyZF92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MCwgIlVuc3VwcG9ydGVkIG9wdGlvbiBub3Qgc3BlY2lmaWVkIn0sCisgICAgeyAweDEsICJVbnN1cHBvcnRlZCBwcm90b2NvbCB2ZXJzaW9uIn0sCisgICAgeyAweDIsICJVbnN1cHBvcnRlZCBzZWN1cml0eSBvcHRpb24ifSwKKyAgICB7IDB4MywgIlVuc3VwcG9ydGVkIHNvdXJjZSByb3V0ZWluZyBvcHRpb24ifSwKKyAgICB7IDB4NCwgIlVuc3VwcG9ydGVkIHJlY29yZGluZyBvZiByb3V0ZSBvcHRpb24ifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcmZkX3JlYXNzZW1ibHlfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJSZWFzc2VtYmx5IGludGVyZmVyZW5jZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisvKiBhcnJheSBvZiAxNiBlcnJvci1jbGFzc2VzICovCitzdGF0aWMgc3RydWN0IHRvayAqY2xucF9vcHRpb25fcmZkX2Vycm9yX2NsYXNzW10gPSB7CisgICAgY2xucF9vcHRpb25fcmZkX2dlbmVyYWxfdmFsdWVzLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgY2xucF9vcHRpb25fcmZkX2FkZHJlc3NfdmFsdWVzLAorICAgIGNsbnBfb3B0aW9uX3JmZF9zb3VyY2Vfcm91dGVpbmdfdmFsdWVzLAorICAgIGNsbnBfb3B0aW9uX3JmZF9saWZldGltZV92YWx1ZXMsCisgICAgY2xucF9vcHRpb25fcmZkX3BkdV9kaXNjYXJkX3ZhbHVlcywKKyAgICBjbG5wX29wdGlvbl9yZmRfcmVhc3NlbWJseV92YWx1ZXMsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwKK307CisKKyNkZWZpbmUgQ0xOUF9PUFRJT05fT1BUSU9OX1FPU19NQVNLIDB4M2YKKyNkZWZpbmUgQ0xOUF9PUFRJT05fU0NPUEVfTUFTSyAgICAgIDB4YzAKKyNkZWZpbmUgQ0xOUF9PUFRJT05fU0NPUEVfU0FfU1BFQyAgIDB4NDAKKyNkZWZpbmUgQ0xOUF9PUFRJT05fU0NPUEVfREFfU1BFQyAgIDB4ODAKKyNkZWZpbmUgQ0xOUF9PUFRJT05fU0NPUEVfR0xPQkFMICAgIDB4YzAKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fc2NvcGVfdmFsdWVzW10gPSB7CisgICAgeyBDTE5QX09QVElPTl9TQ09QRV9TQV9TUEVDLCAiU291cmNlIEFkZHJlc3MgU3BlY2lmaWMifSwKKyAgICB7IENMTlBfT1BUSU9OX1NDT1BFX0RBX1NQRUMsICJEZXN0aW5hdGlvbiBBZGRyZXNzIFNwZWNpZmljIn0sCisgICAgeyBDTE5QX09QVElPTl9TQ09QRV9HTE9CQUwsICJHbG9iYWxseSB1bmlxdWUifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fc3JfcnJfdmFsdWVzW10gPSB7CisgICAgeyAweDAsICJwYXJ0aWFsIn0sCisgICAgeyAweDEsICJjb21wbGV0ZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBjbG5wX29wdGlvbl9zcl9ycl9zdHJpbmdfdmFsdWVzW10gPSB7CisgICAgeyBDTE5QX09QVElPTl9TT1VSQ0VfUk9VVElORywgInNvdXJjZSByb3V0aW5nIn0sCisgICAgeyBDTE5QX09QVElPTl9ST1VURV9SRUNPUkRJTkcsICJyZWNvcmRpbmcgb2Ygcm91dGUgaW4gcHJvZ3Jlc3MifSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcW9zX2dsb2JhbF92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MjAsICJyZXNlcnZlZCJ9LAorICAgIHsgMHgxMCwgInNlcXVlbmNpbmcgdnMuIGRlbGF5In0sCisgICAgeyAweDA4LCAiY29uZ2VzdGVkIn0sCisgICAgeyAweDA0LCAiZGVsYXkgdnMuIGNvc3QifSwKKyAgICB7IDB4MDIsICJlcnJvciB2cy4gZGVsYXkifSwKKyAgICB7IDB4MDEsICJlcnJvciB2cy4gY29zdCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9BRE1JTl9HUk9VUCAgICAgICAgICAgMyAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19MT0NBTF9SRU1PVEVfSUQgIDQgLyogZHJhZnQtaWV0Zi1pc2lzLWdtcGxzLWV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfUkVNT1RFX0lEICAgICAgICA1IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCisjZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9JUFY0X0lOVEZfQUREUiAgICAgICAgNiAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSVBWNF9ORUlHSEJPUl9BRERSICAgIDggLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KKyNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX01BWF9MSU5LX0JXICAgICAgICAgICA5IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCisjZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9SRVNFUlZBQkxFX0JXICAgICAgICAxMCAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfVU5SRVNFUlZFRF9CVyAgICAgICAgMTEgLyogcmZjNDEyNCAqLworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfQldfQ09OU1RSQUlOVFNfT0xEICAgMTIgLyogZHJhZnQtaWV0Zi10ZXdnLWRpZmYtdGUtcHJvdG8tMDYgKi8KKyNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1RFX01FVFJJQyAgICAgICAgICAgIDE4IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCisjZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9MSU5LX1BST1RFQ1RJT05fVFlQRSAyMCAvKiBkcmFmdC1pZXRmLWlzaXMtZ21wbHMtZXh0ZW5zaW9ucyAqLworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSU5URl9TV19DQVBfREVTQ1IgICAgMjEgLyogZHJhZnQtaWV0Zi1pc2lzLWdtcGxzLWV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0JXX0NPTlNUUkFJTlRTICAgICAgIDIyIC8qIHJmYzQxMjQgKi8KKworc3RhdGljIHN0cnVjdCB0b2sgaXNpc19leHRfaXNfcmVhY2hfc3VidGx2X3ZhbHVlc1tdID0geworICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0FETUlOX0dST1VQLCAgICAgICAgICAgICJBZG1pbmlzdHJhdGl2ZSBncm91cHMiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19MT0NBTF9SRU1PVEVfSUQsICAgIkxpbmsgTG9jYWwvUmVtb3RlIElkZW50aWZpZXIiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19SRU1PVEVfSUQsICAgICAgICAgIkxpbmsgUmVtb3RlIElkZW50aWZpZXIiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSVBWNF9JTlRGX0FERFIsICAgICAgICAgIklQdjQgaW50ZXJmYWNlIGFkZHJlc3MiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSVBWNF9ORUlHSEJPUl9BRERSLCAgICAgIklQdjQgbmVpZ2hib3IgYWRkcmVzcyIgfSwKKyAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9NQVhfTElOS19CVywgICAgICAgICAgICAiTWF4aW11bSBsaW5rIGJhbmR3aWR0aCIgfSwKKyAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9SRVNFUlZBQkxFX0JXLCAgICAgICAgICAiUmVzZXJ2YWJsZSBsaW5rIGJhbmR3aWR0aCIgfSwKKyAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9VTlJFU0VSVkVEX0JXLCAgICAgICAgICAiVW5yZXNlcnZlZCBiYW5kd2lkdGgiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfVEVfTUVUUklDLCAgICAgICAgICAgICAgIlRyYWZmaWMgRW5naW5lZXJpbmcgTWV0cmljIiB9LAorICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfUFJPVEVDVElPTl9UWVBFLCAgICJMaW5rIFByb3RlY3Rpb24gVHlwZSIgfSwKKyAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9JTlRGX1NXX0NBUF9ERVNDUiwgICAgICAiSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5IiB9LAorICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0JXX0NPTlNUUkFJTlRTX09MRCwgICAgICJCYW5kd2lkdGggQ29uc3RyYWludHMgKG9sZCkiIH0sCisgICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfQldfQ09OU1RSQUlOVFMsICAgICAgICAgIkJhbmR3aWR0aCBDb25zdHJhaW50cyIgfSwKKyAgICB7IDI1MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIGNpc2NvIHNwZWNpZmljIGV4dGVuc2lvbnMiIH0sCisgICAgeyAyNTEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBjaXNjbyBzcGVjaWZpYyBleHRlbnNpb25zIiB9LAorICAgIHsgMjUyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlcnZlZCBmb3IgY2lzY28gc3BlY2lmaWMgZXh0ZW5zaW9ucyIgfSwKKyAgICB7IDI1MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIGNpc2NvIHNwZWNpZmljIGV4dGVuc2lvbnMiIH0sCisgICAgeyAyNTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBjaXNjbyBzcGVjaWZpYyBleHRlbnNpb25zIiB9LAorICAgIHsgMjU1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworI2RlZmluZSBJU0lTX1NVQlRMVl9FWFREX0lQX1JFQUNIX0FETUlOX1RBRzMyICAgICAgICAgIDEgLyogZHJhZnQtaWV0Zi1pc2lzLWFkbWluLXRhZ3MtMDEgKi8KKyNkZWZpbmUgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9BRE1JTl9UQUc2NCAgICAgICAgICAyIC8qIGRyYWZ0LWlldGYtaXNpcy1hZG1pbi10YWdzLTAxICovCisjZGVmaW5lIElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfTUdNVF9QUkVGSVhfQ09MT1IgIDExNyAvKiBkcmFmdC1pZXRmLWlzaXMtd2ctbXVsdGktdG9wb2xvZ3ktMDUgKi8KKworc3RhdGljIHN0cnVjdCB0b2sgaXNpc19leHRfaXBfcmVhY2hfc3VidGx2X3ZhbHVlc1tdID0geworICAgIHsgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9BRE1JTl9UQUczMiwgICAgICAgICAgICIzMi1CaXQgQWRtaW5pc3RyYXRpdmUgdGFnIiB9LAorICAgIHsgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9BRE1JTl9UQUc2NCwgICAgICAgICAgICI2NC1CaXQgQWRtaW5pc3RyYXRpdmUgdGFnIiB9LAorICAgIHsgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9NR01UX1BSRUZJWF9DT0xPUiwgICAgICJNYW5hZ2VtZW50IFByZWZpeCBDb2xvciIgfSwKKyAgICB7IDAsIE5VTEwgfQorfTsKKworI2RlZmluZSBJU0lTX1NVQlRMVl9BVVRIX1NJTVBMRSAgICAgICAgMQorI2RlZmluZSBJU0lTX1NVQlRMVl9BVVRIX01ENSAgICAgICAgICA1NAorI2RlZmluZSBJU0lTX1NVQlRMVl9BVVRIX01ENV9MRU4gICAgICAxNgorI2RlZmluZSBJU0lTX1NVQlRMVl9BVVRIX1BSSVZBVEUgICAgIDI1NQorCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX3N1YnRsdl9hdXRoX3ZhbHVlc1tdID0geworICAgIHsgSVNJU19TVUJUTFZfQVVUSF9TSU1QTEUsCSJzaW1wbGUgdGV4dCBwYXNzd29yZCJ9LAorICAgIHsgSVNJU19TVUJUTFZfQVVUSF9NRDUsCSJITUFDLU1ENSBwYXNzd29yZCJ9LAorICAgIHsgSVNJU19TVUJUTFZfQVVUSF9QUklWQVRFLAkiUm91dGluZyBEb21haW4gcHJpdmF0ZSBwYXNzd29yZCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lIElTSVNfU1VCVExWX0lEUlBfUkVTICAgICAgICAgICAwCisjZGVmaW5lIElTSVNfU1VCVExWX0lEUlBfTE9DQUwgICAgICAgICAxCisjZGVmaW5lIElTSVNfU1VCVExWX0lEUlBfQVNOICAgICAgICAgICAyCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfc3VidGx2X2lkcnBfdmFsdWVzW10gPSB7CisgICAgeyBJU0lTX1NVQlRMVl9JRFJQX1JFUywgICAgICAgICAiUmVzZXJ2ZWQifSwKKyAgICB7IElTSVNfU1VCVExWX0lEUlBfTE9DQUwsICAgICAgICJSb3V0aW5nLURvbWFpbiBTcGVjaWZpYyJ9LAorICAgIHsgSVNJU19TVUJUTFZfSURSUF9BU04sICAgICAgICAgIkFTIE51bWJlciBUYWcifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIENMTlBfU0VHTUVOVF9QQVJUICAweDgwCisjZGVmaW5lIENMTlBfTU9SRV9TRUdNRU5UUyAweDQwCisjZGVmaW5lIENMTlBfUkVRVUVTVF9FUiAgICAweDIwCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IENMTlBfU0VHTUVOVF9QQVJULCAiU2VnbWVudGF0aW9uIHBlcm1pdHRlZCJ9LAorICAgIHsgQ0xOUF9NT1JFX1NFR01FTlRTLCAibW9yZSBTZWdtZW50cyJ9LAorICAgIHsgQ0xOUF9SRVFVRVNUX0VSLCAicmVxdWVzdCBFcnJvciBSZXBvcnQifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIElTSVNfTUFTS19MU1BfT0xfQklUKHgpICAgICAgICAgICAgKCh4KSYweDQpCisjZGVmaW5lIElTSVNfTUFTS19MU1BfSVNUWVBFX0JJVFMoeCkgICAgICAgKCh4KSYweDMpCisjZGVmaW5lIElTSVNfTUFTS19MU1BfUEFSVElUSU9OX0JJVCh4KSAgICAgKCh4KSYweDgwKQorI2RlZmluZSBJU0lTX01BU0tfTFNQX0FUVF9CSVRTKHgpICAgICAgICAgICgoeCkmMHg3OCkKKyNkZWZpbmUgSVNJU19NQVNLX0xTUF9BVFRfRVJST1JfQklUKHgpICAgICAoKHgpJjB4NDApCisjZGVmaW5lIElTSVNfTUFTS19MU1BfQVRUX0VYUEVOU0VfQklUKHgpICAgKCh4KSYweDIwKQorI2RlZmluZSBJU0lTX01BU0tfTFNQX0FUVF9ERUxBWV9CSVQoeCkgICAgICgoeCkmMHgxMCkKKyNkZWZpbmUgSVNJU19NQVNLX0xTUF9BVFRfREVGQVVMVF9CSVQoeCkgICAoKHgpJjB4OCkKKworI2RlZmluZSBJU0lTX01BU0tfTVRJRCh4KSAgICAgICAgICAgICAgICAgICgoeCkmMHgwZmZmKQorI2RlZmluZSBJU0lTX01BU0tfTVRGTEFHUyh4KSAgICAgICAgICAgICAgICgoeCkmMHhmMDAwKQorCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX210X2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDQwMDAsICAgICAgICAgICAgICAgICAgInN1Yi1UTFZzIHByZXNlbnQifSwKKyAgICB7IDB4ODAwMCwgICAgICAgICAgICAgICAgICAiQVRUIGJpdCBzZXQifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIElTSVNfTUFTS19UTFZfRVhURF9JUF9VUERPV04oeCkgICAgICgoeCkmMHg4MCkKKyNkZWZpbmUgSVNJU19NQVNLX1RMVl9FWFREX0lQX1NVQlRMVih4KSAgICAgKCh4KSYweDQwKQorCisjZGVmaW5lIElTSVNfTUFTS19UTFZfRVhURF9JUDZfSUUoeCkgICAgICAgICgoeCkmMHg0MCkKKyNkZWZpbmUgSVNJU19NQVNLX1RMVl9FWFREX0lQNl9TVUJUTFYoeCkgICAgKCh4KSYweDIwKQorCisjZGVmaW5lIElTSVNfTFNQX1RMVl9NRVRSSUNfU1VQUE9SVEVEKHgpICAgKCh4KSYweDgwKQorI2RlZmluZSBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKHgpICAgICAgICAgICgoeCkmMHg0MCkKKyNkZWZpbmUgSVNJU19MU1BfVExWX01FVFJJQ19VUERPV04oeCkgICAgICAoKHgpJjB4ODApCisjZGVmaW5lIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUoeCkJICAgKCh4KSYweDNmKQorCisjZGVmaW5lIElTSVNfTUFTS19UTFZfU0hBUkVEX1JJU0tfR1JPVVAoeCkgKCh4KSYweDEpCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfbXRfdmFsdWVzW10gPSB7CisgICAgeyAwLCAgICAiSVB2NCB1bmljYXN0In0sCisgICAgeyAxLCAgICAiSW4tQmFuZCBNYW5hZ2VtZW50In0sCisgICAgeyAyLCAgICAiSVB2NiB1bmljYXN0In0sCisgICAgeyAzLCAgICAiTXVsdGljYXN0In0sCisgICAgeyA0MDk1LCAiRGV2ZWxvcG1lbnQsIEV4cGVyaW1lbnRhbCBvciBQcm9wcmlldGFyeSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX2lpaF9jaXJjdWl0X3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyAxLCAgICAiTGV2ZWwgMSBvbmx5In0sCisgICAgeyAyLCAgICAiTGV2ZWwgMiBvbmx5In0sCisgICAgeyAzLCAgICAiTGV2ZWwgMSwgTGV2ZWwgMiJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUgSVNJU19MU1BfVFlQRV9VTlVTRUQwICAgMAorI2RlZmluZSBJU0lTX0xTUF9UWVBFX0xFVkVMXzEgICAxCisjZGVmaW5lIElTSVNfTFNQX1RZUEVfVU5VU0VEMiAgIDIKKyNkZWZpbmUgSVNJU19MU1BfVFlQRV9MRVZFTF8yICAgMworCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX2xzcF9pc3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyBJU0lTX0xTUF9UWVBFX1VOVVNFRDAsCSJVbnVzZWQgMHgwIChpbnZhbGlkKSJ9LAorICAgIHsgSVNJU19MU1BfVFlQRV9MRVZFTF8xLAkiTDEgSVMifSwKKyAgICB7IElTSVNfTFNQX1RZUEVfVU5VU0VEMiwJIlVudXNlZCAweDIgKGludmFsaWQpIn0sCisgICAgeyBJU0lTX0xTUF9UWVBFX0xFVkVMXzIsCSJMMiBJUyJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCisvKgorICogS2F0eidzIHBvaW50IHRvIHBvaW50IGFkamFjZW5jeSBUTFYgdXNlcyBjb2RlcyB0byB0ZWxsIHVzIHRoZSBzdGF0ZSBvZgorICogdGhlIHJlbW90ZSBhZGphY2VuY3kuICBFbnVtZXJhdGUgdGhlbS4KKyAqLworCisjZGVmaW5lIElTSVNfUFRQX0FESl9VUCAgIDAKKyNkZWZpbmUgSVNJU19QVFBfQURKX0lOSVQgMQorI2RlZmluZSBJU0lTX1BUUF9BREpfRE9XTiAyCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfcHRwX2FkamFuY2V5X3ZhbHVlc1tdID0geworICAgIHsgSVNJU19QVFBfQURKX1VQLCAgICAiVXAiIH0sCisgICAgeyBJU0lTX1BUUF9BREpfSU5JVCwgICJJbml0aWFsaXppbmciIH0sCisgICAgeyBJU0lTX1BUUF9BREpfRE9XTiwgICJEb3duIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCBpc2lzX3Rsdl9wdHBfYWRqIHsKKyAgICB1X2ludDhfdCBhZGphY2VuY3lfc3RhdGU7CisgICAgdV9pbnQ4X3QgZXh0ZF9sb2NhbF9jaXJjdWl0X2lkWzRdOworICAgIHVfaW50OF90IG5laWdoYm9yX3N5c2lkW1NZU1RFTV9JRF9MRU5dOworICAgIHVfaW50OF90IG5laWdoYm9yX2V4dGRfbG9jYWxfY2lyY3VpdF9pZFs0XTsKK307CisKK3N0YXRpYyBpbnQgb3NpX2Nrc3VtKGNvbnN0IHVfaW50OF90ICosIHVfaW50KTsKK3N0YXRpYyBpbnQgY2xucF9wcmludChjb25zdCB1X2ludDhfdCAqLCB1X2ludCk7CitzdGF0aWMgdm9pZCBlc2lzX3ByaW50KGNvbnN0IHVfaW50OF90ICosIHVfaW50KTsKK3N0YXRpYyBpbnQgaXNpc19wcmludChjb25zdCB1X2ludDhfdCAqLCB1X2ludCk7CisKK3N0cnVjdCBpc2lzX21ldHJpY19ibG9jayB7CisgICAgdV9pbnQ4X3QgbWV0cmljX2RlZmF1bHQ7CisgICAgdV9pbnQ4X3QgbWV0cmljX2RlbGF5OworICAgIHVfaW50OF90IG1ldHJpY19leHBlbnNlOworICAgIHVfaW50OF90IG1ldHJpY19lcnJvcjsKK307CisKK3N0cnVjdCBpc2lzX3Rsdl9pc19yZWFjaCB7CisgICAgc3RydWN0IGlzaXNfbWV0cmljX2Jsb2NrIGlzaXNfbWV0cmljX2Jsb2NrOworICAgIHVfaW50OF90IG5laWdoYm9yX25vZGVpZFtOT0RFX0lEX0xFTl07Cit9OworCitzdHJ1Y3QgaXNpc190bHZfZXNfcmVhY2ggeworICAgIHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayBpc2lzX21ldHJpY19ibG9jazsKKyAgICB1X2ludDhfdCBuZWlnaGJvcl9zeXNpZFtTWVNURU1fSURfTEVOXTsKK307CisKK3N0cnVjdCBpc2lzX3Rsdl9pcF9yZWFjaCB7CisgICAgc3RydWN0IGlzaXNfbWV0cmljX2Jsb2NrIGlzaXNfbWV0cmljX2Jsb2NrOworICAgIHVfaW50OF90IHByZWZpeFs0XTsKKyAgICB1X2ludDhfdCBtYXNrWzRdOworfTsKKworc3RhdGljIHN0cnVjdCB0b2sgaXNpc19pc19yZWFjaF92aXJ0dWFsX3ZhbHVlc1tdID0geworICAgIHsgMCwgICAgIklzTm90VmlydHVhbCJ9LAorICAgIHsgMSwgICAgIklzVmlydHVhbCJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBpc2lzX3Jlc3RhcnRfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MSwgICJSZXN0YXJ0IFJlcXVlc3QifSwKKyAgICB7IDB4MiwgICJSZXN0YXJ0IEFja25vd2xlZGdlbWVudCJ9LAorICAgIHsgMHg0LCAgIlN1cHByZXNzIGFkamFjZW5jeSBhZHZlcnRpc2VtZW50In0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBpc2lzX2NvbW1vbl9oZWFkZXIgeworICAgIHVfaW50OF90IG5scGlkOworICAgIHVfaW50OF90IGZpeGVkX2xlbjsKKyAgICB1X2ludDhfdCB2ZXJzaW9uOwkJCS8qIFByb3RvY29sIHZlcnNpb24gKi8KKyAgICB1X2ludDhfdCBpZF9sZW5ndGg7CisgICAgdV9pbnQ4X3QgcGR1X3R5cGU7CQkgICAgICAgIC8qIDMgTVNiaXRzIGFyZSByZXNlcnZlZCAqLworICAgIHVfaW50OF90IHBkdV92ZXJzaW9uOwkJLyogUGFja2V0IGZvcm1hdCB2ZXJzaW9uICovCisgICAgdV9pbnQ4X3QgcmVzZXJ2ZWQ7CisgICAgdV9pbnQ4X3QgbWF4X2FyZWE7Cit9OworCitzdHJ1Y3QgaXNpc19paWhfbGFuX2hlYWRlciB7CisgICAgdV9pbnQ4X3QgY2lyY3VpdF90eXBlOworICAgIHVfaW50OF90IHNvdXJjZV9pZFtTWVNURU1fSURfTEVOXTsKKyAgICB1X2ludDhfdCBob2xkaW5nX3RpbWVbMl07CisgICAgdV9pbnQ4X3QgcGR1X2xlblsyXTsKKyAgICB1X2ludDhfdCBwcmlvcml0eTsKKyAgICB1X2ludDhfdCBsYW5faWRbTk9ERV9JRF9MRU5dOworfTsKKworc3RydWN0IGlzaXNfaWloX3B0cF9oZWFkZXIgeworICAgIHVfaW50OF90IGNpcmN1aXRfdHlwZTsKKyAgICB1X2ludDhfdCBzb3VyY2VfaWRbU1lTVEVNX0lEX0xFTl07CisgICAgdV9pbnQ4X3QgaG9sZGluZ190aW1lWzJdOworICAgIHVfaW50OF90IHBkdV9sZW5bMl07CisgICAgdV9pbnQ4X3QgY2lyY3VpdF9pZDsKK307CisKK3N0cnVjdCBpc2lzX2xzcF9oZWFkZXIgeworICAgIHVfaW50OF90IHBkdV9sZW5bMl07CisgICAgdV9pbnQ4X3QgcmVtYWluaW5nX2xpZmV0aW1lWzJdOworICAgIHVfaW50OF90IGxzcF9pZFtMU1BfSURfTEVOXTsKKyAgICB1X2ludDhfdCBzZXF1ZW5jZV9udW1iZXJbNF07CisgICAgdV9pbnQ4X3QgY2hlY2tzdW1bMl07CisgICAgdV9pbnQ4X3QgdHlwZWJsb2NrOworfTsKKworc3RydWN0IGlzaXNfY3NucF9oZWFkZXIgeworICAgIHVfaW50OF90IHBkdV9sZW5bMl07CisgICAgdV9pbnQ4X3Qgc291cmNlX2lkW05PREVfSURfTEVOXTsKKyAgICB1X2ludDhfdCBzdGFydF9sc3BfaWRbTFNQX0lEX0xFTl07CisgICAgdV9pbnQ4X3QgZW5kX2xzcF9pZFtMU1BfSURfTEVOXTsKK307CisKK3N0cnVjdCBpc2lzX3BzbnBfaGVhZGVyIHsKKyAgICB1X2ludDhfdCBwZHVfbGVuWzJdOworICAgIHVfaW50OF90IHNvdXJjZV9pZFtOT0RFX0lEX0xFTl07Cit9OworCitzdHJ1Y3QgaXNpc190bHZfbHNwIHsKKyAgICB1X2ludDhfdCByZW1haW5pbmdfbGlmZXRpbWVbMl07CisgICAgdV9pbnQ4X3QgbHNwX2lkW0xTUF9JRF9MRU5dOworICAgIHVfaW50OF90IHNlcXVlbmNlX251bWJlcls0XTsKKyAgICB1X2ludDhfdCBjaGVja3N1bVsyXTsKK307CisKKyNkZWZpbmUgSVNJU19DT01NT05fSEVBREVSX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyKSkKKyNkZWZpbmUgSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFIChzaXplb2Yoc3RydWN0IGlzaXNfaWloX2xhbl9oZWFkZXIpKQorI2RlZmluZSBJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXNpc19paWhfcHRwX2hlYWRlcikpCisjZGVmaW5lIElTSVNfTFNQX0hFQURFUl9TSVpFIChzaXplb2Yoc3RydWN0IGlzaXNfbHNwX2hlYWRlcikpCisjZGVmaW5lIElTSVNfQ1NOUF9IRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBpc2lzX2NzbnBfaGVhZGVyKSkKKyNkZWZpbmUgSVNJU19QU05QX0hFQURFUl9TSVpFIChzaXplb2Yoc3RydWN0IGlzaXNfcHNucF9oZWFkZXIpKQorCit2b2lkIGlzb2NsbnNfcHJpbnQoY29uc3QgdV9pbnQ4X3QgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWNvbnN0IHN0cnVjdCBpc2lzX2NvbW1vbl9oZWFkZXIgKmhlYWRlcjsKKworCWhlYWRlciA9IChjb25zdCBzdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyICopcDsKKworICAgICAgICBpZiAoY2FwbGVuIDw9IDEpIHsgLyogZW5vdWdoIGJ5dGVzIG9uIHRoZSB3aXJlID8gKi8KKyAgICAgICAgICAgIHByaW50ZigifE9TSSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJPU0kgTkxQSUQgJXMgKDB4JTAyeCk6ICIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihubHBpZF92YWx1ZXMsIlVua25vd24iLCpwKSwKKyAgICAgICAgICAgICAgICAgICAqcCk7CisgICAgICAgIAorCXN3aXRjaCAoKnApIHsKKworCWNhc2UgTkxQSURfQ0xOUDoKKwkJaWYgKCFjbG5wX3ByaW50KHAsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocCwiXG5cdCIsY2FwbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIE5MUElEX0VTSVM6CisJCWVzaXNfcHJpbnQocCwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCisJY2FzZSBOTFBJRF9JU0lTOgorCQlpZiAoIWlzaXNfcHJpbnQocCwgbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwLCJcblx0IixjYXBsZW4pOworCQlicmVhazsKKworCWNhc2UgTkxQSURfTlVMTE5TOgorCQkodm9pZClwcmludGYoIiVzbGVuZ3RoOiAldSIsCisJCSAgICAgICAgICAgICBlZmxhZyA/ICIiIDogIiwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBOTFBJRF9ROTMzOgorICAgICAgICAgICAgICAgIHE5MzNfcHJpbnQocCsxLCBsZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBOTFBJRF9JUDoKKwkJaXBfcHJpbnQoZ25kbywgcCsxLCBsZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBJTkVUNgorICAgICAgICBjYXNlIE5MUElEX0lQNjoKKyAgICAgICAgICAgICAgICBpcDZfcHJpbnQocCsxLCBsZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICBjYXNlIE5MUElEX1BQUDoKKyAgICAgICAgICAgICAgICBwcHBfcHJpbnQocCsxLCBsZW5ndGgtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmICghZWZsYWcpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiT1NJIE5MUElEIDB4JTAyeCB1bmtub3duIiwqcCk7CisJCSh2b2lkKXByaW50ZigiJXNsZW5ndGg6ICV1IiwKKwkJICAgICAgICAgICAgIGVmbGFnID8gIiIgOiAiLCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworCQlpZiAoY2FwbGVuID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwLCJcblx0IixjYXBsZW4pOworCQlicmVhazsKKwl9Cit9CisKKyNkZWZpbmUJQ0xOUF9QRFVfRVIJIDEKKyNkZWZpbmUJQ0xOUF9QRFVfRFQJMjgKKyNkZWZpbmUJQ0xOUF9QRFVfTUQJMjkKKyNkZWZpbmUJQ0xOUF9QRFVfRVJRCTMwCisjZGVmaW5lCUNMTlBfUERVX0VSUAkzMQorCitzdGF0aWMgc3RydWN0IHRvayBjbG5wX3BkdV92YWx1ZXNbXSA9IHsKKyAgICB7IENMTlBfUERVX0VSLCAgIkVycm9yIFJlcG9ydCJ9LAorICAgIHsgQ0xOUF9QRFVfTUQsICAiTUQifSwKKyAgICB7IENMTlBfUERVX0RULCAgIkRhdGEifSwKKyAgICB7IENMTlBfUERVX0VSUSwgIkVjaG8gUmVxdWVzdCJ9LAorICAgIHsgQ0xOUF9QRFVfRVJQLCAiRWNobyBSZXNwb25zZSJ9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdHJ1Y3QgY2xucF9oZWFkZXJfdCB7CisgICAgdV9pbnQ4X3QgbmxwaWQ7CisgICAgdV9pbnQ4X3QgbGVuZ3RoX2luZGljYXRvcjsKKyAgICB1X2ludDhfdCB2ZXJzaW9uOworICAgIHVfaW50OF90IGxpZmV0aW1lOyAvKiB1bml0cyBvZiA1MDBtcyAqLworICAgIHVfaW50OF90IHR5cGU7CisgICAgdV9pbnQ4X3Qgc2VnbWVudF9sZW5ndGhbMl07CisgICAgdV9pbnQ4X3QgY2tzdW1bMl07Cit9OworCitzdHJ1Y3QgY2xucF9zZWdtZW50X2hlYWRlcl90IHsKKyAgICB1X2ludDhfdCBkYXRhX3VuaXRfaWRbMl07CisgICAgdV9pbnQ4X3Qgc2VnbWVudF9vZmZzZXRbMl07CisgICAgdV9pbnQ4X3QgdG90YWxfbGVuZ3RoWzJdOworfTsKKworLyoKKyAqIGNsbnBfcHJpbnQKKyAqIERlY29kZSBDTE5QIHBhY2tldHMuICBSZXR1cm4gMCBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgaW50IGNsbnBfcHJpbnQgKGNvbnN0IHVfaW50OF90ICpwcHRyLCB1X2ludCBsZW5ndGgpCit7CisJY29uc3QgdV9pbnQ4X3QgKm9wdHIsKnNvdXJjZV9hZGRyZXNzLCpkZXN0X2FkZHJlc3M7CisgICAgICAgIHVfaW50IGxpLHRsZW4sbnNhcF9vZmZzZXQsc291cmNlX2FkZHJlc3NfbGVuZ3RoLGRlc3RfYWRkcmVzc19sZW5ndGgsIGNsbnBfcGR1X3R5cGUsIGNsbnBfZmxhZ3M7CisJY29uc3Qgc3RydWN0IGNsbnBfaGVhZGVyX3QgKmNsbnBfaGVhZGVyOworCWNvbnN0IHN0cnVjdCBjbG5wX3NlZ21lbnRfaGVhZGVyX3QgKmNsbnBfc2VnbWVudF9oZWFkZXI7CisgICAgICAgIHVfaW50OF90IHJmZF9lcnJvcl9tYWpvcixyZmRfZXJyb3JfbWlub3I7CisKKwljbG5wX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgY2xucF9oZWFkZXJfdCAqKSBwcHRyOworICAgICAgICBUQ0hFQ0soKmNsbnBfaGVhZGVyKTsKKworICAgICAgICBsaSA9IGNsbnBfaGVhZGVyLT5sZW5ndGhfaW5kaWNhdG9yOworICAgICAgICBvcHRyID0gcHB0cjsKKworICAgICAgICBpZiAoIWVmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJDTE5QIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCisgICAgICAgICAqLworCisgICAgICAgIGlmIChjbG5wX2hlYWRlci0+dmVyc2lvbiAhPSBDTE5QX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIHByaW50ZigidmVyc2lvbiAlZCBwYWNrZXQgbm90IHN1cHBvcnRlZCIsIGNsbnBfaGVhZGVyLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGSVhNRSBmdXJ0aGVyIGhlYWRlciBzYW5pdHkgY2hlY2tpbmcgKi8KKworICAgICAgICBjbG5wX3BkdV90eXBlID0gY2xucF9oZWFkZXItPnR5cGUgJiBDTE5QX1BEVV9UWVBFX01BU0s7CisgICAgICAgIGNsbnBfZmxhZ3MgPSBjbG5wX2hlYWRlci0+dHlwZSAmIENMTlBfRkxBR19NQVNLOworCisgICAgICAgIHBwdHIgKz0gc2l6ZW9mKHN0cnVjdCBjbG5wX2hlYWRlcl90KTsKKyAgICAgICAgbGkgLT0gc2l6ZW9mKHN0cnVjdCBjbG5wX2hlYWRlcl90KTsKKyAgICAgICAgZGVzdF9hZGRyZXNzX2xlbmd0aCA9ICpwcHRyOworICAgICAgICBkZXN0X2FkZHJlc3MgPSBwcHRyICsgMTsKKworICAgICAgICBwcHRyICs9ICgxICsgZGVzdF9hZGRyZXNzX2xlbmd0aCk7CisgICAgICAgIGxpIC09ICgxICsgZGVzdF9hZGRyZXNzX2xlbmd0aCk7CisgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCA9ICpwcHRyOworICAgICAgICBzb3VyY2VfYWRkcmVzcyA9IHBwdHIgKzE7CisKKyAgICAgICAgcHB0ciArPSAoMSArIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCk7CisgICAgICAgIGxpIC09ICgxICsgc291cmNlX2FkZHJlc3NfbGVuZ3RoKTsKKworICAgICAgICBpZiAodmZsYWcgPCAxKSB7CisgICAgICAgICAgICBwcmludGYoIiVzJXMgPiAlcywgJXMsIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgICAgZWZsYWcgPyAiIiA6ICIsICIsCisgICAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoc291cmNlX2FkZHJlc3MsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCksCisgICAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoZGVzdF9hZGRyZXNzLCBkZXN0X2FkZHJlc3NfbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfcGR1X3ZhbHVlcywidW5rbm93biAoJXUpIixjbG5wX3BkdV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuICgxKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIiVzbGVuZ3RoICV1IixlZmxhZyA/ICIiIDogIiwgIixsZW5ndGgpOworCisgICAgICAgIHByaW50ZigiXG5cdCVzIFBEVSwgaGxlbjogJXUsIHY6ICV1LCBsaWZldGltZTogJXUuJXVzLCBTZWdtZW50IFBEVSBsZW5ndGg6ICV1LCBjaGVja3N1bTogMHglMDR4ICIsCisgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfcGR1X3ZhbHVlcywgInVua25vd24gKCV1KSIsY2xucF9wZHVfdHlwZSksCisgICAgICAgICAgICAgICBjbG5wX2hlYWRlci0+bGVuZ3RoX2luZGljYXRvciwKKyAgICAgICAgICAgICAgIGNsbnBfaGVhZGVyLT52ZXJzaW9uLAorICAgICAgICAgICAgICAgY2xucF9oZWFkZXItPmxpZmV0aW1lLzIsCisgICAgICAgICAgICAgICAoY2xucF9oZWFkZXItPmxpZmV0aW1lJTIpKjUsCisgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhjbG5wX2hlYWRlci0+c2VnbWVudF9sZW5ndGgpLAorICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoY2xucF9oZWFkZXItPmNrc3VtKSk7CisKKyAgICAgICAgLyogZG8gbm90IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBpZiBpdCBpcyB6ZXJvICovCisgICAgICAgIGlmIChFWFRSQUNUXzE2QklUUyhjbG5wX2hlYWRlci0+Y2tzdW0pID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIodW52ZXJpZmllZCkiKTsKKyAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIoJXMpIiwgb3NpX2Nrc3VtKG9wdHIsIGNsbnBfaGVhZGVyLT5sZW5ndGhfaW5kaWNhdG9yKSA/ICJpbmNvcnJlY3QiIDogImNvcnJlY3QiKTsKKworICAgICAgICBwcmludGYoIlxuXHRGbGFncyBbJXNdIiwKKyAgICAgICAgICAgICAgIGJpdHRvazJzdHIoY2xucF9mbGFnX3ZhbHVlcywibm9uZSIsY2xucF9mbGFncykpOworCisgICAgICAgIHByaW50ZigiXG5cdHNvdXJjZSBhZGRyZXNzIChsZW5ndGggJXUpOiAlc1xuXHRkZXN0ICAgYWRkcmVzcyAobGVuZ3RoICV1KTogJXMiLAorICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3NfbGVuZ3RoLAorICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoc291cmNlX2FkZHJlc3MsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCksCisgICAgICAgICAgICAgICBkZXN0X2FkZHJlc3NfbGVuZ3RoLAorICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoZGVzdF9hZGRyZXNzLGRlc3RfYWRkcmVzc19sZW5ndGgpKTsKKworICAgICAgICBpZiAoY2xucF9mbGFncyAmIENMTlBfU0VHTUVOVF9QQVJUKSB7CisgICAgICAgICAgICAJY2xucF9zZWdtZW50X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgY2xucF9zZWdtZW50X2hlYWRlcl90ICopIHBwdHI7CisgICAgICAgICAgICAgICAgVENIRUNLKCpjbG5wX3NlZ21lbnRfaGVhZGVyKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHREYXRhIFVuaXQgSUQ6IDB4JTA0eCwgU2VnbWVudCBPZmZzZXQ6ICV1LCBUb3RhbCBQRFUgTGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGNsbnBfc2VnbWVudF9oZWFkZXItPmRhdGFfdW5pdF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGNsbnBfc2VnbWVudF9oZWFkZXItPnNlZ21lbnRfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoY2xucF9zZWdtZW50X2hlYWRlci0+dG90YWxfbGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgcHB0cis9c2l6ZW9mKGNvbnN0IHN0cnVjdCBjbG5wX3NlZ21lbnRfaGVhZGVyX3QpOworICAgICAgICAgICAgICAgIGxpLT1zaXplb2YoY29uc3Qgc3RydWN0IGNsbnBfc2VnbWVudF9oZWFkZXJfdCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3cgd2FsayB0aGUgb3B0aW9ucyAqLworICAgICAgICB3aGlsZSAobGkgPj0gMikgeworICAgICAgICAgICAgdV9pbnQgb3AsIG9wbGk7CisgICAgICAgICAgICBjb25zdCB1X2ludDhfdCAqdHB0cjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgVENIRUNLMigqcHB0ciwgMik7CisgICAgICAgICAgICBpZiAobGkgPCAyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBvcHRzL2xpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wID0gKnBwdHIrKzsKKyAgICAgICAgICAgIG9wbGkgPSAqcHB0cisrOworICAgICAgICAgICAgbGkgLT0gMjsKKyAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIG9wbGkpOworICAgICAgICAgICAgaWYgKG9wbGkgPiBsaSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiLCBvcHQgKCVkKSB0b28gbG9uZyIsIG9wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGkgLT0gb3BsaTsKKyAgICAgICAgICAgIHRwdHIgPSBwcHRyOworICAgICAgICAgICAgdGxlbiA9IG9wbGk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICMldSwgbGVuZ3RoICV1LCB2YWx1ZTogIiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfb3B0aW9uX3ZhbHVlcywiVW5rbm93biIsb3ApLAorICAgICAgICAgICAgICAgICAgIG9wLAorICAgICAgICAgICAgICAgICAgIG9wbGkpOworCisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisKKworICAgICAgICAgICAgY2FzZSBDTE5QX09QVElPTl9ST1VURV9SRUNPUkRJTkc6IC8qIHRob3NlIHR3byBvcHRpb25zIHNoYXJlIHRoZSBmb3JtYXQgKi8KKyAgICAgICAgICAgIGNhc2UgQ0xOUF9PUFRJT05fU09VUkNFX1JPVVRJTkc6ICAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfb3B0aW9uX3NyX3JyX3ZhbHVlcywiVW5rbm93biIsKnRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX29wdGlvbl9zcl9ycl9zdHJpbmdfdmFsdWVzLCJVbmtub3duIE9wdGlvbiAldSIsb3ApKTsKKyAgICAgICAgICAgICAgICAgICAgbnNhcF9vZmZzZXQ9Kih0cHRyKzEpOworICAgICAgICAgICAgICAgICAgICBpZiAobnNhcF9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIEJhZCBOU0FQIG9mZnNldCAoMCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuc2FwX29mZnNldC09MTsgLyogb2Zmc2V0IHRvIG5zYXAgbGlzdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAobnNhcF9vZmZzZXQgPiB0bGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgQmFkIE5TQVAgb2Zmc2V0IChwYXN0IGVuZCBvZiBvcHRpb24pIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHB0cis9bnNhcF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHRsZW4tPW5zYXBfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19sZW5ndGg9KnRwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW4gPCBzb3VyY2VfYWRkcmVzc19sZW5ndGgrMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE5TQVAgYWRkcmVzcyBnb2VzIHBhc3QgZW5kIG9mIG9wdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfYWRkcmVzc19sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz0odHB0cisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKnNvdXJjZV9hZGRyZXNzLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE5TQVAgYWRkcmVzcyAobGVuZ3RoICV1KTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyhzb3VyY2VfYWRkcmVzcywgc291cmNlX2FkZHJlc3NfbGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4tPXNvdXJjZV9hZGRyZXNzX2xlbmd0aCsxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENMTlBfT1BUSU9OX1BSSU9SSVRZOgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIjB4JTF4IiwgKnRwdHImMHgwZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENMTlBfT1BUSU9OX1FPU19NQUlOVEVOQU5DRToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEZvcm1hdCBDb2RlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfb3B0aW9uX3Njb3BlX3ZhbHVlcywiUmVzZXJ2ZWQiLCp0cHRyJkNMTlBfT1BUSU9OX1NDT1BFX01BU0spKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKCp0cHRyJkNMTlBfT1BUSU9OX1NDT1BFX01BU0spID09IENMTlBfT1BUSU9OX1NDT1BFX0dMT0JBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgUW9TIEZsYWdzIFslc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGNsbnBfb3B0aW9uX3Fvc19nbG9iYWxfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0ciZDTE5QX09QVElPTl9PUFRJT05fUU9TX01BU0spKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ0xOUF9PUFRJT05fU0VDVVJJVFk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBGb3JtYXQgQ29kZTogJXMsIFNlY3VyaXR5LUxldmVsICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2xucF9vcHRpb25fc2NvcGVfdmFsdWVzLCJSZXNlcnZlZCIsKnRwdHImQ0xOUF9PUFRJT05fU0NPUEVfTUFTSyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHRwdHIrMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDTE5QX09QVElPTl9ESVNDQVJEX1JFQVNPTjoKKyAgICAgICAgICAgICAgICByZmRfZXJyb3JfbWFqb3IgPSAoKnRwdHImMHhmMCkgPj4gNDsKKyAgICAgICAgICAgICAgICByZmRfZXJyb3JfbWlub3IgPSAqdHB0ciYweDBmOworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBDbGFzczogJXMgRXJyb3IgKDB4JTAxeCksICVzICgweCUwMXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX29wdGlvbl9yZmRfY2xhc3NfdmFsdWVzLCJVbmtub3duIixyZmRfZXJyb3JfbWFqb3IpLAorICAgICAgICAgICAgICAgICAgICAgICByZmRfZXJyb3JfbWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2xucF9vcHRpb25fcmZkX2Vycm9yX2NsYXNzW3JmZF9lcnJvcl9tYWpvcl0sIlVua25vd24iLHJmZF9lcnJvcl9taW5vciksCisgICAgICAgICAgICAgICAgICAgICAgIHJmZF9lcnJvcl9taW5vcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ0xOUF9PUFRJT05fUEFERElORzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJwYWRkaW5nIGRhdGEiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIE9wdGlvbnMgdGhhdCBsYWNrIGEgZGVjb2RlcgorICAgICAgICAgICAgICAgICAqIHlvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIGNvZGUgOy0pCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICIsb3BsaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmZsYWcgPiAxKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLG9wbGkpOworICAgICAgICAgICAgcHB0ciArPSBvcGxpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjbG5wX3BkdV90eXBlKSB7CisKKyAgICAgICAgY2FzZSAgICBDTE5QX1BEVV9FUjogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgCUNMTlBfUERVX0VSUDoKKyAgICAgICAgICAgIFRDSEVDSygqcHB0cik7CisgICAgICAgICAgICBpZiAoKihwcHRyKSA9PSBOTFBJRF9DTE5QKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0LS0tLS1vcmlnaW5hbCBwYWNrZXQtLS0tLVxuXHQiKTsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSByZWN1cnNpb24gcHJvdGVjdGlvbiAqLworICAgICAgICAgICAgICAgIGNsbnBfcHJpbnQocHB0ciwgbGVuZ3RoLWNsbnBfaGVhZGVyLT5sZW5ndGhfaW5kaWNhdG9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gCisKKyAgICAgICAgY2FzZSAJQ0xOUF9QRFVfRFQ6CisgICAgICAgIGNhc2UgCUNMTlBfUERVX01EOgorICAgICAgICBjYXNlIAlDTE5QX1BEVV9FUlE6CisgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIGR1bXAgdGhlIFBEVSBzcGVjaWZpYyBkYXRhICovCisgICAgICAgICAgICBpZiAobGVuZ3RoLShwcHRyLW9wdHIpID4gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgdW5kZWNvZGVkIG5vbi1oZWFkZXIgZGF0YSwgbGVuZ3RoICV1IixsZW5ndGgtY2xucF9oZWFkZXItPmxlbmd0aF9pbmRpY2F0b3IpOworICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLGxlbmd0aC0ocHB0ci1vcHRyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKDEpOworCisgdHJ1bmM6CisgICAgZnB1dHMoIlt8Y2xucF0iLCBzdGRvdXQpOworICAgIHJldHVybiAoMSk7CisKK30KKworCisjZGVmaW5lCUVTSVNfUERVX1JFRElSRUNUCTYKKyNkZWZpbmUJRVNJU19QRFVfRVNICSAgICAgICAgMgorI2RlZmluZQlFU0lTX1BEVV9JU0gJICAgICAgICA0CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGVzaXNfcGR1X3ZhbHVlc1tdID0geworICAgIHsgRVNJU19QRFVfUkVESVJFQ1QsICJyZWRpcmVjdCJ9LAorICAgIHsgRVNJU19QRFVfRVNILCAgICAgICJFU0gifSwKKyAgICB7IEVTSVNfUERVX0lTSCwgICAgICAiSVNIIn0sCisgICAgeyAwLCBOVUxMIH0KK307CisKK3N0cnVjdCBlc2lzX2hlYWRlcl90IHsKKwl1X2ludDhfdCBubHBpZDsKKwl1X2ludDhfdCBsZW5ndGhfaW5kaWNhdG9yOworCXVfaW50OF90IHZlcnNpb247CisJdV9pbnQ4X3QgcmVzZXJ2ZWQ7CisJdV9pbnQ4X3QgdHlwZTsKKwl1X2ludDhfdCBob2xkdGltZVsyXTsKKwl1X2ludDhfdCBja3N1bVsyXTsKK307CisKK3N0YXRpYyB2b2lkCitlc2lzX3ByaW50KGNvbnN0IHVfaW50OF90ICpwcHRyLCB1X2ludCBsZW5ndGgpCit7CisJY29uc3QgdV9pbnQ4X3QgKm9wdHI7CisJdV9pbnQgbGksZXNpc19wZHVfdHlwZSxzb3VyY2VfYWRkcmVzc19sZW5ndGgsIHNvdXJjZV9hZGRyZXNzX251bWJlcjsKKwljb25zdCBzdHJ1Y3QgZXNpc19oZWFkZXJfdCAqZXNpc19oZWFkZXI7CisKKyAgICAgICAgaWYgKCFlZmxhZykKKyAgICAgICAgICAgIHByaW50ZigiRVMtSVMiKTsKKworCWlmIChsZW5ndGggPD0gMikgeworCQlpZiAocWZsYWcpCisJCQlwcmludGYoImJhZCBwa3QhIik7CisJCWVsc2UKKwkJCXByaW50Zigibm8gaGVhZGVyIGF0IGFsbCEiKTsKKwkJcmV0dXJuOworCX0KKworCWVzaXNfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBlc2lzX2hlYWRlcl90ICopIHBwdHI7CisgICAgICAgIFRDSEVDSygqZXNpc19oZWFkZXIpOworICAgICAgICBsaSA9IGVzaXNfaGVhZGVyLT5sZW5ndGhfaW5kaWNhdG9yOworICAgICAgICBvcHRyID0gcHB0cjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTYW5pdHkgY2hlY2tpbmcgb2YgdGhlIGhlYWRlci4KKyAgICAgICAgICovCisKKyAgICAgICAgaWYgKGVzaXNfaGVhZGVyLT5ubHBpZCAhPSBOTFBJRF9FU0lTKSB7CisgICAgICAgICAgICBwcmludGYoIiBubHBpZCAweCUwMnggcGFja2V0IG5vdCBzdXBwb3J0ZWQiLCBlc2lzX2hlYWRlci0+bmxwaWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVzaXNfaGVhZGVyLT52ZXJzaW9uICE9IEVTSVNfVkVSU0lPTikgeworICAgICAgICAgICAgcHJpbnRmKCIgdmVyc2lvbiAlZCBwYWNrZXQgbm90IHN1cHBvcnRlZCIsIGVzaXNfaGVhZGVyLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAgICAgICAgIAorCWlmIChsaSA+IGxlbmd0aCkgeworICAgICAgICAgICAgcHJpbnRmKCIgbGVuZ3RoIGluZGljYXRvciglZCkgPiBQRFUgc2l6ZSAoJWQpISIsIGxpLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworCX0KKworCWlmIChsaSA8IHNpemVvZihzdHJ1Y3QgZXNpc19oZWFkZXJfdCkgKyAyKSB7CisgICAgICAgICAgICBwcmludGYoIiBsZW5ndGggaW5kaWNhdG9yIDwgbWluIFBEVSBzaXplICVkOiIsIGxpKTsKKyAgICAgICAgICAgIHdoaWxlICgtLWxlbmd0aCAhPSAwKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsICpwcHRyKyspOworICAgICAgICAgICAgcmV0dXJuOworCX0KKworICAgICAgICBlc2lzX3BkdV90eXBlID0gZXNpc19oZWFkZXItPnR5cGUgJiBFU0lTX1BEVV9UWVBFX01BU0s7CisKKyAgICAgICAgaWYgKHZmbGFnIDwgMSkgeworICAgICAgICAgICAgcHJpbnRmKCIlcyVzLCBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgICAgIGVmbGFnID8gIiIgOiAiLCAiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXNpc19wZHVfdmFsdWVzLCJ1bmtub3duIHR5cGUgKCV1KSIsZXNpc19wZHVfdHlwZSksCisgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmludGYoIiVzbGVuZ3RoICV1XG5cdCVzICgldSkiLAorICAgICAgICAgICAgICAgICAgIGVmbGFnID8gIiIgOiAiLCAiLAorICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGVzaXNfcGR1X3ZhbHVlcywidW5rbm93biB0eXBlOiAldSIsIGVzaXNfcGR1X3R5cGUpLAorICAgICAgICAgICAgICAgICAgIGVzaXNfcGR1X3R5cGUpOworCisgICAgICAgIHByaW50ZigiLCB2OiAldSVzIiwgZXNpc19oZWFkZXItPnZlcnNpb24sIGVzaXNfaGVhZGVyLT52ZXJzaW9uID09IEVTSVNfVkVSU0lPTiA/ICIiIDogInVuc3VwcG9ydGVkIiApOworICAgICAgICBwcmludGYoIiwgY2hlY2tzdW06IDB4JTA0eCAiLCBFWFRSQUNUXzE2QklUUyhlc2lzX2hlYWRlci0+Y2tzdW0pKTsKKyAgICAgICAgLyogZG8gbm90IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBpZiBpdCBpcyB6ZXJvICovCisgICAgICAgIGlmIChFWFRSQUNUXzE2QklUUyhlc2lzX2hlYWRlci0+Y2tzdW0pID09IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIodW52ZXJpZmllZCkiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiKCVzKSIsIG9zaV9ja3N1bShwcHRyLCBsaSkgPyAiaW5jb3JyZWN0IiA6ICJjb3JyZWN0Iik7CisKKyAgICAgICAgcHJpbnRmKCIsIGhvbGRpbmcgdGltZTogJXVzLCBsZW5ndGggaW5kaWNhdG9yOiAldSIsRVhUUkFDVF8xNkJJVFMoZXNpc19oZWFkZXItPmhvbGR0aW1lKSxsaSk7CisKKyAgICAgICAgaWYgKHZmbGFnID4gMSkKKyAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShvcHRyLCJcblx0IixzaXplb2Yoc3RydWN0IGVzaXNfaGVhZGVyX3QpKTsKKworCXBwdHIgKz0gc2l6ZW9mKHN0cnVjdCBlc2lzX2hlYWRlcl90KTsKKwlsaSAtPSBzaXplb2Yoc3RydWN0IGVzaXNfaGVhZGVyX3QpOworCisJc3dpdGNoIChlc2lzX3BkdV90eXBlKSB7CisJY2FzZSBFU0lTX1BEVV9SRURJUkVDVDogeworCQljb25zdCB1X2ludDhfdCAqZHN0LCAqc25wYSwgKm5ldGE7CisJCXVfaW50IGRzdGwsIHNucGFsLCBuZXRhbDsKKworCQlUQ0hFQ0soKnBwdHIpOworCQlpZiAobGkgPCAxKSB7CisJCQlwcmludGYoIiwgYmFkIHJlZGlyZWN0L2xpIik7CisJCQlyZXR1cm47CisJCX0KKwkJZHN0bCA9ICpwcHRyOworCQlwcHRyKys7CisJCWxpLS07CisJCVRDSEVDSzIoKnBwdHIsIGRzdGwpOworCQlpZiAobGkgPCBkc3RsKSB7CisJCQlwcmludGYoIiwgYmFkIHJlZGlyZWN0L2xpIik7CisJCQlyZXR1cm47CisJCX0KKwkJZHN0ID0gcHB0cjsKKwkJcHB0ciArPSBkc3RsOworICAgICAgICAgICAgICAgIGxpIC09IGRzdGw7CisJCXByaW50ZigiXG5cdCAgJXMiLCBpc29uc2FwX3N0cmluZyhkc3QsZHN0bCkpOworCisJCVRDSEVDSygqcHB0cik7CisJCWlmIChsaSA8IDEpIHsKKwkJCXByaW50ZigiLCBiYWQgcmVkaXJlY3QvbGkiKTsKKwkJCXJldHVybjsKKwkJfQorCQlzbnBhbCA9ICpwcHRyOworCQlwcHRyKys7CisJCWxpLS07CisJCVRDSEVDSzIoKnBwdHIsIHNucGFsKTsKKwkJaWYgKGxpIDwgc25wYWwpIHsKKwkJCXByaW50ZigiLCBiYWQgcmVkaXJlY3QvbGkiKTsKKwkJCXJldHVybjsKKwkJfQorCQlzbnBhID0gcHB0cjsKKwkJcHB0ciArPSBzbnBhbDsKKyAgICAgICAgICAgICAgICBsaSAtPSBzbnBhbDsKKwkJVENIRUNLKCpwcHRyKTsKKwkJaWYgKGxpIDwgMSkgeworCQkJcHJpbnRmKCIsIGJhZCByZWRpcmVjdC9saSIpOworCQkJcmV0dXJuOworCQl9CisJCW5ldGFsID0gKnBwdHI7CisJCXBwdHIrKzsKKwkJVENIRUNLMigqcHB0ciwgbmV0YWwpOworCQlpZiAobGkgPCBuZXRhbCkgeworCQkJcHJpbnRmKCIsIGJhZCByZWRpcmVjdC9saSIpOworCQkJcmV0dXJuOworCQl9CisJCW5ldGEgPSBwcHRyOworCQlwcHRyICs9IG5ldGFsOworICAgICAgICAgICAgICAgIGxpIC09IG5ldGFsOworCisJCWlmIChuZXRhbCA9PSAwKQorCQkJcHJpbnRmKCJcblx0ICAlcyIsIGV0aGVyYWRkcl9zdHJpbmcoc25wYSkpOworCQllbHNlCisJCQlwcmludGYoIlxuXHQgICVzIiwgaXNvbnNhcF9zdHJpbmcobmV0YSxuZXRhbCkpOworCQlicmVhazsKKwl9CisKKwljYXNlIEVTSVNfUERVX0VTSDoKKyAgICAgICAgICAgIFRDSEVDSygqcHB0cik7CisgICAgICAgICAgICBpZiAobGkgPCAxKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBlc2gvbGkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19udW1iZXIgPSAqcHB0cjsKKyAgICAgICAgICAgIHBwdHIrKzsKKyAgICAgICAgICAgIGxpLS07CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgTnVtYmVyIG9mIFNvdXJjZSBBZGRyZXNzZXM6ICV1Iiwgc291cmNlX2FkZHJlc3NfbnVtYmVyKTsKKyAgICAgICAgICAgCisgICAgICAgICAgICB3aGlsZSAoc291cmNlX2FkZHJlc3NfbnVtYmVyID4gMCkgeworICAgICAgICAgICAgICAgIFRDSEVDSygqcHB0cik7CisgICAgICAgICAgICAJaWYgKGxpIDwgMSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgYmFkIGVzaC9saSIpOworICAgICAgICAgICAgCSAgICByZXR1cm47CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCA9ICpwcHRyOworICAgICAgICAgICAgICAgIHBwdHIrKzsKKyAgICAgICAgICAgIAlsaS0tOworCisgICAgICAgICAgICAgICAgVENIRUNLMigqcHB0ciwgc291cmNlX2FkZHJlc3NfbGVuZ3RoKTsKKyAgICAgICAgICAgIAlpZiAobGkgPCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBlc2gvbGkiKTsKKyAgICAgICAgICAgIAkgICAgcmV0dXJuOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIE5FVCAobGVuZ3RoOiAldSk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3NfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyhwcHRyLHNvdXJjZV9hZGRyZXNzX2xlbmd0aCkpOworICAgICAgICAgICAgICAgIHBwdHIgKz0gc291cmNlX2FkZHJlc3NfbGVuZ3RoOworICAgICAgICAgICAgICAgIGxpIC09IHNvdXJjZV9hZGRyZXNzX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19udW1iZXItLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKwljYXNlIEVTSVNfUERVX0lTSDogeworICAgICAgICAgICAgVENIRUNLKCpwcHRyKTsKKyAgICAgICAgICAgIGlmIChsaSA8IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgYmFkIGlzaC9saSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCA9ICpwcHRyOworICAgICAgICAgICAgcHB0cisrOworICAgICAgICAgICAgbGktLTsKKyAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCk7CisgICAgICAgICAgICBpZiAobGkgPCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgYmFkIGlzaC9saSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgTkVUIChsZW5ndGg6ICV1KTogJXMiLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgsIGlzb25zYXBfc3RyaW5nKHBwdHIsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCkpOworICAgICAgICAgICAgcHB0ciArPSBzb3VyY2VfYWRkcmVzc19sZW5ndGg7CisgICAgICAgICAgICBsaSAtPSBzb3VyY2VfYWRkcmVzc19sZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKwl9CisKKwlkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpIHsKKwkJICAgIGlmIChwcHRyIDwgc25hcGVuZCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsc25hcGVuZC1wcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKwl9CisKKyAgICAgICAgLyogbm93IHdhbGsgdGhlIG9wdGlvbnMgKi8KKyAgICAgICAgd2hpbGUgKGxpID49IDIpIHsKKyAgICAgICAgICAgIHVfaW50IG9wLCBvcGxpOworICAgICAgICAgICAgY29uc3QgdV9pbnQ4X3QgKnRwdHI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIDIpOworICAgICAgICAgICAgaWYgKGxpIDwgMikgeworICAgICAgICAgICAgICAgIHByaW50ZigiLCBiYWQgb3B0cy9saSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wID0gKnBwdHIrKzsKKyAgICAgICAgICAgIG9wbGkgPSAqcHB0cisrOworICAgICAgICAgICAgbGkgLT0gMjsKKyAgICAgICAgICAgIGlmIChvcGxpID4gbGkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgb3B0ICglZCkgdG9vIGxvbmciLCBvcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGkgLT0gb3BsaTsKKyAgICAgICAgICAgIHRwdHIgPSBwcHRyOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAjJXUsIGxlbmd0aCAldSwgdmFsdWU6ICIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihlc2lzX29wdGlvbl92YWx1ZXMsIlVua25vd24iLG9wKSwKKyAgICAgICAgICAgICAgICAgICBvcCwKKyAgICAgICAgICAgICAgICAgICBvcGxpKTsKKworICAgICAgICAgICAgc3dpdGNoIChvcCkgeworCisgICAgICAgICAgICBjYXNlIEVTSVNfT1BUSU9OX0VTX0NPTkZfVElNRToKKyAgICAgICAgICAgICAgICBUQ0hFQ0syKCpwcHRyLCAyKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiV1cyIsIEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9QUk9UT0NPTFM6CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wbGk+MCkgeworICAgICAgICAgICAgICAgICAgICBUQ0hFQ0soKnBwdHIpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICgweCUwMngpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobmxwaWRfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wbGk+MSkgLyogZnVydGhlciBOUExJRHMgPyAtIHB1dCBjb21tYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICAgICAgICAgICAgICB0cHRyKys7CisgICAgICAgICAgICAgICAgICAgIG9wbGktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBPcHRpb25zIHRoYXQgbGFjayBhIGRlY29kZXIKKyAgICAgICAgICAgICAgICAgKiB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQorICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBjYXNlIEVTSVNfT1BUSU9OX1FPU19NQUlOVEVOQU5DRToKKyAgICAgICAgICAgIGNhc2UgRVNJU19PUFRJT05fU0VDVVJJVFk6CisgICAgICAgICAgICBjYXNlIEVTSVNfT1BUSU9OX1BSSU9SSVRZOgorICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9BRERSRVNTX01BU0s6CisgICAgICAgICAgICBjYXNlIEVTSVNfT1BUSU9OX1NOUEFfTUFTSzoKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgIixvcGxpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2ZmxhZyA+IDEpCisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsb3BsaSk7CisgICAgICAgICAgICBwcHRyICs9IG9wbGk7CisgICAgICAgIH0KK3RydW5jOgorCXJldHVybjsKK30gICAKKworLyogc2hhcmVkIHJvdXRpbmUgZm9yIHByaW50aW5nIHN5c3RlbSwgbm9kZSBhbmQgbHNwLWlkcyAqLworc3RhdGljIGNoYXIgKgoraXNpc19wcmludF9pZChjb25zdCB1X2ludDhfdCAqY3AsIGludCBpZF9sZW4pCit7CisgICAgaW50IGk7CisgICAgc3RhdGljIGNoYXIgaWRbc2l6ZW9mKCJ4eHh4Lnh4eHgueHh4eC55eS16eiIpXTsKKyAgICBjaGFyICpwb3MgPSBpZDsKKworICAgIGZvciAoaSA9IDE7IGkgPD0gU1lTVEVNX0lEX0xFTjsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKHBvcywgc2l6ZW9mKGlkKSAtIChwb3MgLSBpZCksICIlMDJ4IiwgKmNwKyspOworCXBvcyArPSBzdHJsZW4ocG9zKTsKKwlpZiAoaSA9PSAyIHx8IGkgPT0gNCkKKwkgICAgKnBvcysrID0gJy4nOworCX0KKyAgICBpZiAoaWRfbGVuID49IE5PREVfSURfTEVOKSB7CisgICAgICAgIHNucHJpbnRmKHBvcywgc2l6ZW9mKGlkKSAtIChwb3MgLSBpZCksICIuJTAyeCIsICpjcCsrKTsKKwlwb3MgKz0gc3RybGVuKHBvcyk7CisgICAgfQorICAgIGlmIChpZF9sZW4gPT0gTFNQX0lEX0xFTikKKyAgICAgICAgc25wcmludGYocG9zLCBzaXplb2YoaWQpIC0gKHBvcyAtIGlkKSwgIi0lMDJ4IiwgKmNwKTsKKyAgICByZXR1cm4gKGlkKTsKK30KKworLyogcHJpbnQgdGhlIDQtYnl0ZSBtZXRyaWMgYmxvY2sgd2hpY2ggaXMgY29tbW9uIGZvdW5kIGluIHRoZSBvbGQtc3R5bGUgVExWcyAqLworc3RhdGljIGludAoraXNpc19wcmludF9tZXRyaWNfYmxvY2sgKGNvbnN0IHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayAqaXNpc19tZXRyaWNfYmxvY2spCit7CisgICAgcHJpbnRmKCIsIERlZmF1bHQgTWV0cmljOiAlZCwgJXMiLAorICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZGVmYXVsdCksCisgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19kZWZhdWx0KSA/ICJFeHRlcm5hbCIgOiAiSW50ZXJuYWwiKTsKKyAgICBpZiAoIUlTSVNfTFNQX1RMVl9NRVRSSUNfU1VQUE9SVEVEKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZGVsYXkpKQorICAgICAgICBwcmludGYoIlxuXHRcdCAgRGVsYXkgTWV0cmljOiAlZCwgJXMiLAorICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRShpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2RlbGF5KSwKKyAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19kZWxheSkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisgICAgaWYgKCFJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRChpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2V4cGVuc2UpKQorICAgICAgICBwcmludGYoIlxuXHRcdCAgRXhwZW5zZSBNZXRyaWM6ICVkLCAlcyIsCisgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZXhwZW5zZSksCisgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZXhwZW5zZSkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisgICAgaWYgKCFJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRChpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2Vycm9yKSkKKyAgICAgICAgcHJpbnRmKCJcblx0XHQgIEVycm9yIE1ldHJpYzogJWQsICVzIiwKKyAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19lcnJvciksCisgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZXJyb3IpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOworCisgICAgcmV0dXJuKDEpOyAvKiBldmVyeXRoaW5nIGlzIG9rICovCit9CisKK3N0YXRpYyBpbnQKK2lzaXNfcHJpbnRfdGx2X2lwX3JlYWNoIChjb25zdCB1X2ludDhfdCAqY3AsIGNvbnN0IGNoYXIgKmlkZW50LCBpbnQgbGVuZ3RoKQoreworCWludCBwcmVmaXhfbGVuOworCWNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9pcF9yZWFjaCAqdGx2X2lwX3JlYWNoOworCisJdGx2X2lwX3JlYWNoID0gKGNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9pcF9yZWFjaCAqKWNwOworCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJaWYgKChzaXplX3QpbGVuZ3RoIDwgc2l6ZW9mKCp0bHZfaXBfcmVhY2gpKSB7CisJCQlwcmludGYoInNob3J0IElQdjQgUmVhY2hhYmlsaXR5ICglZCB2cyAlbHUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKCp0bHZfaXBfcmVhY2gpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQlpZiAoIVRURVNUKCp0bHZfaXBfcmVhY2gpKQorCQkgICAgcmV0dXJuICgwKTsKKworCQlwcmVmaXhfbGVuID0gbWFzazJwbGVuKEVYVFJBQ1RfMzJCSVRTKHRsdl9pcF9yZWFjaC0+bWFzaykpOworCisJCWlmIChwcmVmaXhfbGVuID09IC0xKQorCQkJcHJpbnRmKCIlc0lQdjQgcHJlZml4OiAlcyBtYXNrICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKwkJCSAgICAgICBpcGFkZHJfc3RyaW5nKCh0bHZfaXBfcmVhY2gtPnByZWZpeCkpLAorCQkJICAgICAgIGlwYWRkcl9zdHJpbmcoKHRsdl9pcF9yZWFjaC0+bWFzaykpKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlc0lQdjQgcHJlZml4OiAlMTVzLyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKwkJCSAgICAgICBpcGFkZHJfc3RyaW5nKCh0bHZfaXBfcmVhY2gtPnByZWZpeCkpLAorCQkJICAgICAgIHByZWZpeF9sZW4pOworCisJCXByaW50ZigiLCBEaXN0cmlidXRpb246ICVzLCBNZXRyaWM6ICV1LCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVVBET1dOKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2RlZmF1bHQpID8gImRvd24iIDogInVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRSh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19kZWZhdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19JRSh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19kZWZhdWx0KSA/ICJFeHRlcm5hbCIgOiAiSW50ZXJuYWwiKTsKKworCQlpZiAoIUlTSVNfTFNQX1RMVl9NRVRSSUNfU1VQUE9SVEVEKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2RlbGF5KSkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRGVsYXkgTWV0cmljOiAldSwgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2RlbGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZGVsYXkpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOworICAgICAgICAgICAgICAgIAorCQlpZiAoIUlTSVNfTFNQX1RMVl9NRVRSSUNfU1VQUE9SVEVEKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2V4cGVuc2UpKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBFeHBlbnNlIE1ldHJpYzogJXUsICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRSh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19leHBlbnNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZXhwZW5zZSkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisgICAgICAgICAgICAgICAgCisJCWlmICghSVNJU19MU1BfVExWX01FVFJJQ19TVVBQT1JURUQodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZXJyb3IpKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBFcnJvciBNZXRyaWM6ICV1LCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19JRSh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19lcnJvcikgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7CisKKwkJbGVuZ3RoIC09IHNpemVvZihzdHJ1Y3QgaXNpc190bHZfaXBfcmVhY2gpOworCQl0bHZfaXBfcmVhY2grKzsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIHRoaXMgaXMgdGhlIGNvbW1vbiBJUC1SRUFDSCBzdWJUTFYgZGVjb2RlciBpdCBpcyBjYWxsZWQKKyAqIGZyb20gdmFyaW91cyBFWFRELUlQIFJFQUNIIFRMVnMgKDEzNSwyMzUsMjM2LDIzNykKKyAqLworCitzdGF0aWMgaW50Citpc2lzX3ByaW50X2lwX3JlYWNoX3N1YnRsdiAoY29uc3QgdV9pbnQ4X3QgKnRwdHIsaW50IHN1YnQsaW50IHN1YmwsY29uc3QgY2hhciAqaWRlbnQpIHsKKworICAgICAgICAvKiBmaXJzdCBsZXRzIHNlZSBpZiB3ZSBrbm93IHRoZSBzdWJUTFZzIG5hbWUqLworCXByaW50ZigiJXMlcyBzdWJUTFYgIyV1LCBsZW5ndGg6ICV1IiwKKwkgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfZXh0X2lwX3JlYWNoX3N1YnRsdl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VidCksCisgICAgICAgICAgICAgICBzdWJ0LAorICAgICAgICAgICAgICAgc3VibCk7CisKKwlpZiAoIVRURVNUMigqdHB0cixzdWJsKSkKKwkgICAgZ290byB0cnVuY3RsdjsKKworICAgIHN3aXRjaChzdWJ0KSB7CisgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFREX0lQX1JFQUNIX01HTVRfUFJFRklYX0NPTE9SOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfQURNSU5fVEFHMzI6CisgICAgICAgIHdoaWxlIChzdWJsID49IDQpIHsKKwkgICAgcHJpbnRmKCIsIDB4JTA4eCAoPSV1KSIsCisJCSAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIpLAorCQkgICBFWFRSQUNUXzMyQklUUyh0cHRyKSk7CisJICAgIHRwdHIrPTQ7CisJICAgIHN1YmwtPTQ7CisJfQorCWJyZWFrOworICAgIGNhc2UgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9BRE1JTl9UQUc2NDoKKyAgICAgICAgd2hpbGUgKHN1YmwgPj0gOCkgeworCSAgICBwcmludGYoIiwgMHglMDh4JTA4eCIsCisJCSAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIpLAorCQkgICBFWFRSQUNUXzMyQklUUyh0cHRyKzQpKTsKKwkgICAgdHB0cis9ODsKKwkgICAgc3VibC09ODsKKwl9CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHRcdCAgICAiLAorCQkJICAgICAgIHN1YmwpKQorCSAgcmV0dXJuKDApOworCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4oMSk7CisJCit0cnVuY3RsdjoKKyAgICBwcmludGYoIiVzcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90IixpZGVudCk7CisgICAgcmV0dXJuKDApOworfQorCisvKgorICogdGhpcyBpcyB0aGUgY29tbW9uIElTLVJFQUNIIHN1YlRMViBkZWNvZGVyIGl0IGlzIGNhbGxlZAorICogZnJvbSBpc2lzX3ByaW50X2V4dF9pc19yZWFjaCgpCisgKi8KKworc3RhdGljIGludAoraXNpc19wcmludF9pc19yZWFjaF9zdWJ0bHYgKGNvbnN0IHVfaW50OF90ICp0cHRyLHVfaW50IHN1YnQsdV9pbnQgc3VibCxjb25zdCBjaGFyICppZGVudCkgeworCisgICAgICAgIHVfaW50IHRlX2NsYXNzLHByaW9yaXR5X2xldmVsOworICAgICAgICB1bmlvbiB7IC8qIGludCB0byBmbG9hdCBjb252ZXJzaW9uIGJ1ZmZlciBmb3Igc2V2ZXJhbCBzdWJUTFZzICovCisgICAgICAgICAgICBmbG9hdCBmOyAKKyAgICAgICAgICAgIHVfaW50MzJfdCBpOworICAgICAgICB9IGJ3OworCisgICAgICAgIC8qIGZpcnN0IGxldHMgc2VlIGlmIHdlIGtub3cgdGhlIHN1YlRMVnMgbmFtZSovCisJcHJpbnRmKCIlcyVzIHN1YlRMViAjJXUsIGxlbmd0aDogJXUiLAorCSAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgIHRvazJzdHIoaXNpc19leHRfaXNfcmVhY2hfc3VidGx2X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICBzdWJ0KSwKKyAgICAgICAgICAgICAgIHN1YnQsCisgICAgICAgICAgICAgICBzdWJsKTsKKworCWlmICghVFRFU1QyKCp0cHRyLHN1YmwpKQorCSAgICBnb3RvIHRydW5jdGx2OworCisgICAgICAgIHN3aXRjaChzdWJ0KSB7CisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0FETUlOX0dST1VQOiAgICAgIAorICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9MSU5LX0xPQ0FMX1JFTU9URV9JRDoKKyAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19SRU1PVEVfSUQ6CisJICAgIGlmIChzdWJsID49IDQpIHsKKwkgICAgICBwcmludGYoIiwgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworCSAgICAgIGlmIChzdWJsID09IDgpIC8qIGRyYWZ0LWlldGYtaXNpcy1nbXBscy1leHRlbnNpb25zICovCisJICAgICAgICBwcmludGYoIiwgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lQVjRfSU5URl9BRERSOgorICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9JUFY0X05FSUdIQk9SX0FERFI6CisgICAgICAgICAgICBpZiAoc3VibCA+PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKQorICAgICAgICAgICAgICBwcmludGYoIiwgJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9NQVhfTElOS19CVyA6CisJY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfUkVTRVJWQUJMRV9CVzogIAorICAgICAgICAgICAgaWYgKHN1YmwgPj0gNCkgeworICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cik7CisgICAgICAgICAgICAgIHByaW50ZigiLCAlLjNmIE1icHMiLCBidy5mKjgvMTAwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1VOUkVTRVJWRURfQlcgOgorICAgICAgICAgICAgaWYgKHN1YmwgPj0gMzIpIHsKKyAgICAgICAgICAgICAgZm9yICh0ZV9jbGFzcyA9IDA7IHRlX2NsYXNzIDwgODsgdGVfY2xhc3MrKykgeworICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBURS1DbGFzcyAldTogJS4zZiBNYnBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRlX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCApOworCQl0cHRyKz00OworCSAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9CV19DT05TVFJBSU5UUzogLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0JXX0NPTlNUUkFJTlRTX09MRDoKKyAgICAgICAgICAgIHByaW50ZigiJXNCYW5kd2lkdGggQ29uc3RyYWludHMgTW9kZWwgSUQ6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZGlmZnNlcnZfdGVfYmNfdmFsdWVzLCAidW5rbm93biIsICp0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAqdHB0cik7CisgICAgICAgICAgICB0cHRyKys7CisgICAgICAgICAgICAvKiBkZWNvZGUgQkNzIHVudGlsIHRoZSBzdWJUTFYgZW5kcyAqLworICAgICAgICAgICAgZm9yICh0ZV9jbGFzcyA9IDA7IHRlX2NsYXNzIDwgKHN1YmwtMSkvNDsgdGVfY2xhc3MrKykgeworICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBCYW5kd2lkdGggY29uc3RyYWludCBDVCV1OiAlLjNmIE1icHMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwICk7CisJCXRwdHIrPTQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfVEVfTUVUUklDOgorICAgICAgICAgICAgaWYgKHN1YmwgPj0gMykKKyAgICAgICAgICAgICAgcHJpbnRmKCIsICV1IiwgRVhUUkFDVF8yNEJJVFModHB0cikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfUFJPVEVDVElPTl9UWVBFOgorICAgICAgICAgICAgaWYgKHN1YmwgPj0gMikgeworICAgICAgICAgICAgICBwcmludGYoIiwgJXMsIFByaW9yaXR5ICV1IiwKKwkJICAgYml0dG9rMnN0cihnbXBsc19saW5rX3Byb3RfdmFsdWVzLCAibm9uZSIsICp0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAqKHRwdHIrMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lOVEZfU1dfQ0FQX0RFU0NSOgorICAgICAgICAgICAgaWYgKHN1YmwgPj0gMzYpIHsKKyAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5OiVzIiwKKyAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX3N3aXRjaF9jYXBfdmFsdWVzLCAiVW5rbm93biIsICoodHB0cikpKTsKKyAgICAgICAgICAgICAgcHJpbnRmKCIsIExTUCBFbmNvZGluZzogJXMiLAorICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZ21wbHNfZW5jb2RpbmdfdmFsdWVzLCAiVW5rbm93biIsICoodHB0cisxKSkpOworCSAgICAgIHRwdHIrPTQ7CisgICAgICAgICAgICAgIHByaW50ZigiJXMgIE1heCBMU1AgQmFuZHdpZHRoOiIsaWRlbnQpOworICAgICAgICAgICAgICBmb3IgKHByaW9yaXR5X2xldmVsID0gMDsgcHJpb3JpdHlfbGV2ZWwgPCA4OyBwcmlvcml0eV9sZXZlbCsrKSB7CisgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgICAgcHJpb3JpdHkgbGV2ZWwgJWQ6ICUuM2YgTWJwcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDAgKTsKKwkJdHB0cis9NDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdWJsLT0zNjsKKyAgICAgICAgICAgICAgLyogdGhlcmUgaXMgc29tZSBvcHRpb25hbCBzdHVmZiBsZWZ0IHRvIGRlY29kZSBidXQgdGhpcyBpcyBhcyBvZiB5ZXQKKyAgICAgICAgICAgICAgICAgbm90IHNwZWNpZmllZCBzbyBqdXN0IGxldHMgaGV4ZHVtcCB3aGF0IGlzIGxlZnQgKi8KKyAgICAgICAgICAgICAgaWYoc3VibD4wKXsKKyAgICAgICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHRcdCAgICAiLAorCQkJCSAgICAgICBzdWJsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdFx0ICAgICIsCisJCQkJICAgc3VibCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuKDEpOworCit0cnVuY3RsdjoKKyAgICBwcmludGYoIiVzcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90IixpZGVudCk7CisgICAgcmV0dXJuKDApOworfQorCisKKy8qCisgKiB0aGlzIGlzIHRoZSBjb21tb24gSVMtUkVBQ0ggZGVjb2RlciBpdCBpcyBjYWxsZWQKKyAqIGZyb20gdmFyaW91cyBFWFRELUlTIFJFQUNIIHN0eWxlIFRMVnMgKDIyLDI0LDIyMikKKyAqLworCitzdGF0aWMgaW50Citpc2lzX3ByaW50X2V4dF9pc19yZWFjaCAoY29uc3QgdV9pbnQ4X3QgKnRwdHIsY29uc3QgY2hhciAqaWRlbnQsIGludCB0bHZfdHlwZSkgeworCisgICAgY2hhciBpZGVudF9idWZmZXJbMjBdOworICAgIGludCBzdWJ0bHZfdHlwZSxzdWJ0bHZfbGVuLHN1YnRsdl9zdW1fbGVuOworICAgIGludCBwcm9jX2J5dGVzID0gMDsgLyogaG93IG1hbnkgYnl0ZXMgZGlkIHdlIHByb2Nlc3MgPyAqLworICAgIAorICAgIGlmICghVFRFU1QyKCp0cHRyLCBOT0RFX0lEX0xFTikpCisgICAgICAgIHJldHVybigwKTsKKworICAgIHByaW50ZigiJXNJUyBOZWlnaGJvcjogJXMiLCBpZGVudCwgaXNpc19wcmludF9pZCh0cHRyLCBOT0RFX0lEX0xFTikpOworICAgIHRwdHIrPShOT0RFX0lEX0xFTik7CisKKyAgICBpZiAodGx2X3R5cGUgIT0gSVNJU19UTFZfSVNfQUxJQVNfSUQpIHsgLyogdGhlIEFsaWFzIFRMViBNZXRyaWMgZmllbGQgaXMgaW1wbGljaXQgMCAqLworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMykpICAgIC8qIGFuZCBpcyB0aGVyZWZvcmUgc2tpcHBlZCAqLworCSAgICByZXR1cm4oMCk7CisJcHJpbnRmKCIsIE1ldHJpYzogJWQiLEVYVFJBQ1RfMjRCSVRTKHRwdHIpKTsKKwl0cHRyKz0zOworICAgIH0KKyAgICAgICAgCisgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQorICAgICAgICByZXR1cm4oMCk7CisgICAgc3VidGx2X3N1bV9sZW49Kih0cHRyKyspOyAvKiByZWFkIG91dCBzdWJUTFYgbGVuZ3RoICovCisgICAgcHJvY19ieXRlcz1OT0RFX0lEX0xFTiszKzE7CisgICAgcHJpbnRmKCIsICVzc3ViLVRMVnMgcHJlc2VudCIsc3VidGx2X3N1bV9sZW4gPyAiIiA6ICJubyAiKTsKKyAgICBpZiAoc3VidGx2X3N1bV9sZW4pIHsKKyAgICAgICAgcHJpbnRmKCIgKCV1KSIsc3VidGx2X3N1bV9sZW4pOworICAgICAgICB3aGlsZSAoc3VidGx2X3N1bV9sZW4+MCkgeworICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsMikpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgc3VidGx2X3R5cGU9Kih0cHRyKyspOworICAgICAgICAgICAgc3VidGx2X2xlbj0qKHRwdHIrKyk7CisgICAgICAgICAgICAvKiBwcmVwZW5kIHRoZSBpZGVudCBzdHJpbmcgKi8KKyAgICAgICAgICAgIHNucHJpbnRmKGlkZW50X2J1ZmZlciwgc2l6ZW9mKGlkZW50X2J1ZmZlciksICIlcyAgIixpZGVudCk7CisgICAgICAgICAgICBpZighaXNpc19wcmludF9pc19yZWFjaF9zdWJ0bHYodHB0cixzdWJ0bHZfdHlwZSxzdWJ0bHZfbGVuLGlkZW50X2J1ZmZlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgdHB0cis9c3VidGx2X2xlbjsKKyAgICAgICAgICAgIHN1YnRsdl9zdW1fbGVuLT0oc3VidGx2X2xlbisyKTsKKyAgICAgICAgICAgIHByb2NfYnl0ZXMrPShzdWJ0bHZfbGVuKzIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybihwcm9jX2J5dGVzKTsKK30KKworLyoKKyAqIHRoaXMgaXMgdGhlIGNvbW1vbiBNdWx0aSBUb3BvbG9neSBJRCBkZWNvZGVyCisgKiBpdCBpcyBjYWxsZWQgZnJvbSB2YXJpb3VzIE1ULVRMVnMgKDIyMiwyMjksMjM1LDIzNykKKyAqLworCitzdGF0aWMgaW50Citpc2lzX3ByaW50X210aWQgKGNvbnN0IHVfaW50OF90ICp0cHRyLGNvbnN0IGNoYXIgKmlkZW50KSB7CisgICAgCisgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDIpKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICBwcmludGYoIiVzJXMiLAorICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgdG9rMnN0cihpc2lzX210X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIElFVEYgQ29uc2Vuc3VzIiwKKyAgICAgICAgICAgICAgICAgICBJU0lTX01BU0tfTVRJRChFWFRSQUNUXzE2QklUUyh0cHRyKSkpKTsKKworICAgIHByaW50ZigiIFRvcG9sb2d5ICgweCUwM3gpLCBGbGFnczogWyVzXSIsCisgICAgICAgICAgIElTSVNfTUFTS19NVElEKEVYVFJBQ1RfMTZCSVRTKHRwdHIpKSwKKyAgICAgICAgICAgYml0dG9rMnN0cihpc2lzX210X2ZsYWdfdmFsdWVzLCAibm9uZSIsSVNJU19NQVNLX01URkxBR1MoRVhUUkFDVF8xNkJJVFModHB0cikpKSk7CisKKyAgICByZXR1cm4oMik7Cit9CisKKy8qCisgKiB0aGlzIGlzIHRoZSBjb21tb24gZXh0ZW5kZWQgSVAgcmVhY2ggZGVjb2RlcgorICogaXQgaXMgY2FsbGVkIGZyb20gVExWcyAoMTM1LDIzNSwyMzYsMjM3KQorICogd2UgcHJvY2VzcyB0aGUgVExWIGFuZCBvcHRpb25hbCBzdWJUTFZzIGFuZCByZXR1cm4KKyAqIHRoZSBhbW91bnQgb2YgcHJvY2Vzc2VkIGJ5dGVzCisgKi8KKworc3RhdGljIGludAoraXNpc19wcmludF9leHRkX2lwX3JlYWNoIChjb25zdCB1X2ludDhfdCAqdHB0ciwgY29uc3QgY2hhciAqaWRlbnQsIHVfaW50MTZfdCBhZmkpIHsKKworICAgIGNoYXIgaWRlbnRfYnVmZmVyWzIwXTsKKyNpZmRlZiBJTkVUNgorICAgIHVfaW50OF90IHByZWZpeFtzaXplb2Yoc3RydWN0IGluNl9hZGRyKV07IC8qIHNoYXJlZCBjb3B5IGJ1ZmZlciBmb3IgSVB2NCBhbmQgSVB2NiBwcmVmaXhlcyAqLworI2Vsc2UKKyAgICB1X2ludDhfdCBwcmVmaXhbc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKV07IC8qIHNoYXJlZCBjb3B5IGJ1ZmZlciBmb3IgSVB2NCBwcmVmaXhlcyAqLworI2VuZGlmCisgICAgdV9pbnQgbWV0cmljLCBzdGF0dXNfYnl0ZSwgYml0X2xlbmd0aCwgYnl0ZV9sZW5ndGgsIHN1YmxlbiwgcHJvY2Vzc2VkLCBzdWJ0bHZ0eXBlLCBzdWJ0bHZsZW47CisKKyAgICBpZiAoIVRURVNUMigqdHB0ciwgNCkpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgbWV0cmljID0gRVhUUkFDVF8zMkJJVFModHB0cik7CisgICAgcHJvY2Vzc2VkPTQ7CisgICAgdHB0cis9NDsKKyAgICAKKyAgICBpZiAoYWZpID09IElQVjQpIHsKKyAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKSAvKiBmZXRjaCBzdGF0dXMgYnl0ZSAqLworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgc3RhdHVzX2J5dGU9Kih0cHRyKyspOworICAgICAgICBiaXRfbGVuZ3RoID0gc3RhdHVzX2J5dGUmMHgzZjsKKyAgICAgICAgaWYgKGJpdF9sZW5ndGggPiAzMikgeworICAgICAgICAgICAgcHJpbnRmKCIlc0lQdjQgcHJlZml4OiBiYWQgYml0IGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgYml0X2xlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NlZCsrOworI2lmZGVmIElORVQ2CisgICAgfSBlbHNlIGlmIChhZmkgPT0gSVBWNikgeworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMSkpIC8qIGZldGNoIHN0YXR1cyAmIHByZWZpeF9sZW4gYnl0ZSAqLworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgc3RhdHVzX2J5dGU9Kih0cHRyKyspOworICAgICAgICBiaXRfbGVuZ3RoPSoodHB0cisrKTsKKyAgICAgICAgaWYgKGJpdF9sZW5ndGggPiAxMjgpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNJUHY2IHByZWZpeDogYmFkIGJpdCBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgIGJpdF9sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzZWQrPTI7CisjZW5kaWYKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuICgwKTsgLyogc29tZWJvZHkgaXMgZm9vbGluZyB1cyAqLworCisgICAgYnl0ZV9sZW5ndGggPSAoYml0X2xlbmd0aCArIDcpIC8gODsgLyogcHJlZml4IGhhcyB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcgKi8KKyAgIAorICAgIGlmICghVFRFU1QyKCp0cHRyLCBieXRlX2xlbmd0aCkpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgbWVtc2V0KHByZWZpeCwgMCwgc2l6ZW9mIHByZWZpeCk7ICAgLyogY2xlYXIgdGhlIGNvcHkgYnVmZmVyICovCisgICAgbWVtY3B5KHByZWZpeCx0cHRyLGJ5dGVfbGVuZ3RoKTsgICAgLyogY29weSBhcyBtdWNoIGFzIGlzIHN0b3JlZCBpbiB0aGUgVExWICovCisgICAgdHB0cis9Ynl0ZV9sZW5ndGg7CisgICAgcHJvY2Vzc2VkKz1ieXRlX2xlbmd0aDsKKworICAgIGlmIChhZmkgPT0gSVBWNCkKKyAgICAgICAgcHJpbnRmKCIlc0lQdjQgcHJlZml4OiAlMTVzLyV1IiwKKyAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhwcmVmaXgpLAorICAgICAgICAgICAgICAgYml0X2xlbmd0aCk7CisjaWZkZWYgSU5FVDYKKyAgICBpZiAoYWZpID09IElQVjYpCisgICAgICAgIHByaW50ZigiJXNJUHY2IHByZWZpeDogJXMvJXUiLAorICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhwcmVmaXgpLAorICAgICAgICAgICAgICAgYml0X2xlbmd0aCk7CisjZW5kaWYgCisgICAKKyAgICBwcmludGYoIiwgRGlzdHJpYnV0aW9uOiAlcywgTWV0cmljOiAldSIsCisgICAgICAgICAgIElTSVNfTUFTS19UTFZfRVhURF9JUF9VUERPV04oc3RhdHVzX2J5dGUpID8gImRvd24iIDogInVwIiwKKyAgICAgICAgICAgbWV0cmljKTsKKworICAgIGlmIChhZmkgPT0gSVBWNCAmJiBJU0lTX01BU0tfVExWX0VYVERfSVBfU1VCVExWKHN0YXR1c19ieXRlKSkKKyAgICAgICAgcHJpbnRmKCIsIHN1Yi1UTFZzIHByZXNlbnQiKTsKKyNpZmRlZiBJTkVUNgorICAgIGlmIChhZmkgPT0gSVBWNikKKyAgICAgICAgcHJpbnRmKCIsICVzJXMiLAorICAgICAgICAgICAgICAgSVNJU19NQVNLX1RMVl9FWFREX0lQNl9JRShzdGF0dXNfYnl0ZSkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIiwKKyAgICAgICAgICAgICAgIElTSVNfTUFTS19UTFZfRVhURF9JUDZfU1VCVExWKHN0YXR1c19ieXRlKSA/ICIsIHN1Yi1UTFZzIHByZXNlbnQiIDogIiIpOworI2VuZGlmCisgICAgCisgICAgaWYgKChJU0lTX01BU0tfVExWX0VYVERfSVBfU1VCVExWKHN0YXR1c19ieXRlKSAgJiYgYWZpID09IElQVjQpIHx8CisgICAgICAgIChJU0lTX01BU0tfVExWX0VYVERfSVA2X1NVQlRMVihzdGF0dXNfYnl0ZSkgJiYgYWZpID09IElQVjYpKSB7CisgICAgICAgIC8qIGFzc3VtZSB0aGF0IG9uZSBwcmVmaXggY2FuIGhvbGQgbW9yZQorICAgICAgICAgICB0aGFuIG9uZSBzdWJUTFYgLSB0aGVyZWZvcmUgdGhlIGZpcnN0IGJ5dGUgbXVzdCByZWZsZWN0CisgICAgICAgICAgIHRoZSBhZ2dyZWdhdGUgYnl0ZWNvdW50IG9mIHRoZSBzdWJUTFZzIGZvciB0aGlzIHByZWZpeAorICAgICAgICAqLworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMSkpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICBzdWJsZW49Kih0cHRyKyspOworICAgICAgICBwcm9jZXNzZWQrPXN1YmxlbisxOworICAgICAgICBwcmludGYoIiAoJXUpIixzdWJsZW4pOyAgIC8qIHByaW50IG91dCBzdWJUTFYgbGVuZ3RoICovCisgICAgICAgIAorICAgICAgICB3aGlsZSAoc3VibGVuPjApIHsKKyAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLDIpKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICBzdWJ0bHZ0eXBlPSoodHB0cisrKTsKKyAgICAgICAgICAgIHN1YnRsdmxlbj0qKHRwdHIrKyk7CisgICAgICAgICAgICAvKiBwcmVwZW5kIHRoZSBpZGVudCBzdHJpbmcgKi8KKyAgICAgICAgICAgIHNucHJpbnRmKGlkZW50X2J1ZmZlciwgc2l6ZW9mKGlkZW50X2J1ZmZlciksICIlcyAgIixpZGVudCk7CisgICAgICAgICAgICBpZighaXNpc19wcmludF9pcF9yZWFjaF9zdWJ0bHYodHB0cixzdWJ0bHZ0eXBlLHN1YnRsdmxlbixpZGVudF9idWZmZXIpKQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgICAgIHRwdHIrPXN1YnRsdmxlbjsKKyAgICAgICAgICAgIHN1Ymxlbi09KHN1YnRsdmxlbisyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHByb2Nlc3NlZCk7Cit9CisKKy8qCisgKiBpc2lzX3ByaW50CisgKiBEZWNvZGUgSVMtSVMgcGFja2V0cy4gIFJldHVybiAwIG9uIGVycm9yLgorICovCisKK3N0YXRpYyBpbnQgaXNpc19wcmludCAoY29uc3QgdV9pbnQ4X3QgKnAsIHVfaW50IGxlbmd0aCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyICppc2lzX2hlYWRlcjsKKworICAgIGNvbnN0IHN0cnVjdCBpc2lzX2lpaF9sYW5faGVhZGVyICpoZWFkZXJfaWloX2xhbjsKKyAgICBjb25zdCBzdHJ1Y3QgaXNpc19paWhfcHRwX2hlYWRlciAqaGVhZGVyX2lpaF9wdHA7CisgICAgY29uc3Qgc3RydWN0IGlzaXNfbHNwX2hlYWRlciAqaGVhZGVyX2xzcDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNpc19jc25wX2hlYWRlciAqaGVhZGVyX2NzbnA7CisgICAgY29uc3Qgc3RydWN0IGlzaXNfcHNucF9oZWFkZXIgKmhlYWRlcl9wc25wOworCisgICAgY29uc3Qgc3RydWN0IGlzaXNfdGx2X2xzcCAqdGx2X2xzcDsKKyAgICBjb25zdCBzdHJ1Y3QgaXNpc190bHZfcHRwX2FkaiAqdGx2X3B0cF9hZGo7CisgICAgY29uc3Qgc3RydWN0IGlzaXNfdGx2X2lzX3JlYWNoICp0bHZfaXNfcmVhY2g7CisgICAgY29uc3Qgc3RydWN0IGlzaXNfdGx2X2VzX3JlYWNoICp0bHZfZXNfcmVhY2g7CisKKyAgICB1X2ludDhfdCBwZHVfdHlwZSwgbWF4X2FyZWEsIGlkX2xlbmd0aCwgdGx2X3R5cGUsIHRsdl9sZW4sIHRtcCwgYWxlbiwgbGFuX2FsZW4sIHByZWZpeF9sZW47CisgICAgdV9pbnQ4X3QgZXh0X2lzX2xlbiwgZXh0X2lwX2xlbiwgbXRfbGVuOworICAgIGNvbnN0IHVfaW50OF90ICpvcHRyLCAqcHB0ciwgKnRwdHI7CisgICAgdV9zaG9ydCBwYWNrZXRfbGVuLHBkdV9sZW47CisgICAgdV9pbnQgaSx2ZW5kb3JfaWQ7CisKKyAgICBwYWNrZXRfbGVuPWxlbmd0aDsKKyAgICBvcHRyID0gcDsgLyogaW5pdGlhbGl6ZSB0aGUgX29fcmlnaW5hbCBwb2ludGVyIHRvIHRoZSBwYWNrZXQgc3RhcnQgLQorICAgICAgICAgICAgICAgICBuZWVkIGl0IGZvciBwYXJzaW5nIHRoZSBjaGVja3N1bSBUTFYgKi8KKyAgICBpc2lzX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyICopcDsKKyAgICBUQ0hFQ0soKmlzaXNfaGVhZGVyKTsKKyAgICBwcHRyID0gcCsoSVNJU19DT01NT05fSEVBREVSX1NJWkUpOworICAgIGhlYWRlcl9paWhfbGFuID0gKGNvbnN0IHN0cnVjdCBpc2lzX2lpaF9sYW5faGVhZGVyICopcHB0cjsKKyAgICBoZWFkZXJfaWloX3B0cCA9IChjb25zdCBzdHJ1Y3QgaXNpc19paWhfcHRwX2hlYWRlciAqKXBwdHI7CisgICAgaGVhZGVyX2xzcCA9IChjb25zdCBzdHJ1Y3QgaXNpc19sc3BfaGVhZGVyICopcHB0cjsKKyAgICBoZWFkZXJfY3NucCA9IChjb25zdCBzdHJ1Y3QgaXNpc19jc25wX2hlYWRlciAqKXBwdHI7CisgICAgaGVhZGVyX3BzbnAgPSAoY29uc3Qgc3RydWN0IGlzaXNfcHNucF9oZWFkZXIgKilwcHRyOworCisgICAgaWYgKCFlZmxhZykKKyAgICAgICAgcHJpbnRmKCJJUy1JUyIpOworCisgICAgLyoKKyAgICAgKiBTYW5pdHkgY2hlY2tpbmcgb2YgdGhlIGhlYWRlci4KKyAgICAgKi8KKworICAgIGlmIChpc2lzX2hlYWRlci0+dmVyc2lvbiAhPSBJU0lTX1ZFUlNJT04pIHsKKwlwcmludGYoInZlcnNpb24gJWQgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLCBpc2lzX2hlYWRlci0+dmVyc2lvbik7CisJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBpZiAoKGlzaXNfaGVhZGVyLT5pZF9sZW5ndGggIT0gU1lTVEVNX0lEX0xFTikgJiYgKGlzaXNfaGVhZGVyLT5pZF9sZW5ndGggIT0gMCkpIHsKKwlwcmludGYoInN5c3RlbSBJRCBsZW5ndGggb2YgJWQgaXMgbm90IHN1cHBvcnRlZCIsCisJICAgICAgIGlzaXNfaGVhZGVyLT5pZF9sZW5ndGgpOworCXJldHVybiAoMCk7CisgICAgfQorCisgICAgaWYgKGlzaXNfaGVhZGVyLT5wZHVfdmVyc2lvbiAhPSBJU0lTX1ZFUlNJT04pIHsKKwlwcmludGYoInZlcnNpb24gJWQgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLCBpc2lzX2hlYWRlci0+cGR1X3ZlcnNpb24pOworCXJldHVybiAoMCk7CisgICAgfQorCisgICAgbWF4X2FyZWEgPSBpc2lzX2hlYWRlci0+bWF4X2FyZWE7CisgICAgc3dpdGNoKG1heF9hcmVhKSB7CisgICAgY2FzZSAwOgorCW1heF9hcmVhID0gMzsJIC8qIHNpbGx5IHNoaXQgKi8KKwlicmVhazsKKyAgICBjYXNlIDI1NToKKwlwcmludGYoImJhZCBwYWNrZXQgLS0gMjU1IGFyZWFzIik7CisJcmV0dXJuICgwKTsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKworICAgIGlkX2xlbmd0aCA9IGlzaXNfaGVhZGVyLT5pZF9sZW5ndGg7CisgICAgc3dpdGNoKGlkX2xlbmd0aCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWRfbGVuZ3RoID0gNjsJIC8qIHNpbGx5IHNoaXQgYWdhaW4gKi8KKwlicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICAgICAvKiAxLTggYXJlIHZhbGlkIHN5cy1JRCBsZW5naHRzICovCisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgY2FzZSA4OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI1NToKKyAgICAgICAgaWRfbGVuZ3RoID0gMDsgICAvKiBlbnRpcmVseSB1c2VsZXNzICovCisJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogdG9zcyBhbnkgbm9uIDYtYnl0ZSBzeXMtSUQgbGVuIFBEVXMgKi8KKyAgICBpZiAoaWRfbGVuZ3RoICE9IDYgKSB7IAorCXByaW50ZigiYmFkIHBhY2tldCAtLSBpbGxlZ2FsIHN5cy1JRCBsZW5ndGggKCV1KSIsIGlkX2xlbmd0aCk7CisJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICBwZHVfdHlwZT1pc2lzX2hlYWRlci0+cGR1X3R5cGU7CisKKyAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIHByaW50IHRoZSBiYXNpYyBQRFUgVHlwZSBwbHVzIFBEVSBzcGVjaWZpYyBicmllZiBpbmZvcm1hdGlvbiovCisgICAgaWYgKHZmbGFnIDwgMSkgeworICAgICAgICBwcmludGYoIiVzJXMiLAorICAgICAgICAgICAgICAgZWZsYWcgPyAiIiA6ICIsICIsCisgICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfcGR1X3ZhbHVlcywidW5rbm93biBQRFUtVHlwZSAldSIscGR1X3R5cGUpKTsKKworCXN3aXRjaCAocGR1X3R5cGUpIHsKKworCWNhc2UgSVNJU19QRFVfTDFfTEFOX0lJSDoKKwljYXNlIElTSVNfUERVX0wyX0xBTl9JSUg6CisJICAgIHByaW50ZigiLCBzcmMtaWQgJXMiLAorICAgICAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2lpaF9sYW4tPnNvdXJjZV9pZCxTWVNURU1fSURfTEVOKSk7CisJICAgIHByaW50ZigiLCBsYW4taWQgJXMsIHByaW8gJXUiLAorICAgICAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2lpaF9sYW4tPmxhbl9pZCxOT0RFX0lEX0xFTiksCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX2lpaF9sYW4tPnByaW9yaXR5KTsKKwkgICAgYnJlYWs7CisJY2FzZSBJU0lTX1BEVV9QVFBfSUlIOgorCSAgICBwcmludGYoIiwgc3JjLWlkICVzIiwgaXNpc19wcmludF9pZChoZWFkZXJfaWloX3B0cC0+c291cmNlX2lkLFNZU1RFTV9JRF9MRU4pKTsKKwkgICAgYnJlYWs7CisJY2FzZSBJU0lTX1BEVV9MMV9MU1A6CisJY2FzZSBJU0lTX1BEVV9MMl9MU1A6CisJICAgIHByaW50ZigiLCBsc3AtaWQgJXMsIHNlcSAweCUwOHgsIGxpZmV0aW1lICU1dXMiLAorCQkgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9sc3AtPmxzcF9pZCwgTFNQX0lEX0xFTiksCisJCSAgIEVYVFJBQ1RfMzJCSVRTKGhlYWRlcl9sc3AtPnNlcXVlbmNlX251bWJlciksCisJCSAgIEVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9sc3AtPnJlbWFpbmluZ19saWZldGltZSkpOworCSAgICBicmVhazsKKwljYXNlIElTSVNfUERVX0wxX0NTTlA6CisJY2FzZSBJU0lTX1BEVV9MMl9DU05QOgorCSAgICBwcmludGYoIiwgc3JjLWlkICVzIiwgaXNpc19wcmludF9pZChoZWFkZXJfY3NucC0+c291cmNlX2lkLE5PREVfSURfTEVOKSk7CisJICAgIGJyZWFrOworCWNhc2UgSVNJU19QRFVfTDFfUFNOUDoKKwljYXNlIElTSVNfUERVX0wyX1BTTlA6CisJICAgIHByaW50ZigiLCBzcmMtaWQgJXMiLCBpc2lzX3ByaW50X2lkKGhlYWRlcl9wc25wLT5zb3VyY2VfaWQsTk9ERV9JRF9MRU4pKTsKKwkgICAgYnJlYWs7CisKKwl9CisJcHJpbnRmKCIsIGxlbmd0aCAldSIsIGxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKworICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCisgICAgcHJpbnRmKCIlc2xlbmd0aCAldSIsIGVmbGFnID8gIiIgOiAiLCAiLGxlbmd0aCk7CisKKyAgICBwcmludGYoIlxuXHQlcywgaGxlbjogJXUsIHY6ICV1LCBwZHUtdjogJXUsIHN5cy1pZC1sZW46ICV1ICgldSksIG1heC1hcmVhOiAldSAoJXUpIiwKKyAgICAgICAgICAgdG9rMnN0cihpc2lzX3BkdV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgInVua25vd24sIHR5cGUgJXUiLAorICAgICAgICAgICAgICAgICAgIHBkdV90eXBlKSwKKyAgICAgICAgICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwKKyAgICAgICAgICAgaXNpc19oZWFkZXItPnZlcnNpb24sCisgICAgICAgICAgIGlzaXNfaGVhZGVyLT5wZHVfdmVyc2lvbiwKKwkgICBpZF9sZW5ndGgsCisJICAgaXNpc19oZWFkZXItPmlkX2xlbmd0aCwKKyAgICAgICAgICAgbWF4X2FyZWEsCisgICAgICAgICAgIGlzaXNfaGVhZGVyLT5tYXhfYXJlYSk7CisKKyAgICBpZiAodmZsYWcgPiAxKSB7CisgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEob3B0ciwiXG5cdCIsOCkpIC8qIHByb3ZpZGUgdGhlIF9vX3JpZ2luYWwgcG9pbnRlciAqLworICAgICAgICAgICAgcmV0dXJuKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3Igb3B0aW9uYWxseSBkZWJ1Z2dpbmcgdGhlIGNvbW1vbiBoZWFkZXIgKi8KKyAgICB9CisKKyAgICBzd2l0Y2ggKHBkdV90eXBlKSB7CisKKyAgICBjYXNlIElTSVNfUERVX0wxX0xBTl9JSUg6CisgICAgY2FzZSBJU0lTX1BEVV9MMl9MQU5fSUlIOgorCWlmIChpc2lzX2hlYWRlci0+Zml4ZWRfbGVuICE9IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0lJSF9MQU5fSEVBREVSX1NJWkUpKSB7CisJICAgIHByaW50ZigiLCBib2d1cyBmaXhlZCBoZWFkZXIgbGVuZ3RoICV1IHNob3VsZCBiZSAlbHUiLAorCQkgICBpc2lzX2hlYWRlci0+Zml4ZWRfbGVuLCAodW5zaWduZWQgbG9uZylJU0lTX0lJSF9MQU5fSEVBREVSX1NJWkUpOworCSAgICByZXR1cm4gKDApOworCX0KKworCXBkdV9sZW49RVhUUkFDVF8xNkJJVFMoaGVhZGVyX2lpaF9sYW4tPnBkdV9sZW4pOworCWlmIChwYWNrZXRfbGVuPnBkdV9sZW4pIHsKKyAgICAgICAgICAgIHBhY2tldF9sZW49cGR1X2xlbjsgLyogZG8gVExWIGRlY29kaW5nIGFzIGxvbmcgYXMgaXQgbWFrZXMgc2Vuc2UgKi8KKyAgICAgICAgICAgIGxlbmd0aD1wZHVfbGVuOworCX0KKworCVRDSEVDSygqaGVhZGVyX2lpaF9sYW4pOworCXByaW50ZigiXG5cdCAgc291cmNlLWlkOiAlcywgIGhvbGRpbmcgdGltZTogJXVzLCBGbGFnczogWyVzXSIsCisgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9paWhfbGFuLT5zb3VyY2VfaWQsU1lTVEVNX0lEX0xFTiksCisgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhoZWFkZXJfaWloX2xhbi0+aG9sZGluZ190aW1lKSwKKyAgICAgICAgICAgICAgIHRvazJzdHIoaXNpc19paWhfY2lyY3VpdF90eXBlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gY2lyY3VpdCB0eXBlIDB4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9paWhfbGFuLT5jaXJjdWl0X3R5cGUpKTsKKworCXByaW50ZigiXG5cdCAgbGFuLWlkOiAgICAlcywgUHJpb3JpdHk6ICV1LCBQRFUgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9paWhfbGFuLT5sYW5faWQsIE5PREVfSURfTEVOKSwKKyAgICAgICAgICAgICAgIChoZWFkZXJfaWloX2xhbi0+cHJpb3JpdHkpICYgSVNJU19MQU5fUFJJT1JJVFlfTUFTSywKKyAgICAgICAgICAgICAgIHBkdV9sZW4pOworCisgICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKKyAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixJU0lTX0lJSF9MQU5fSEVBREVSX1NJWkUpKQorICAgICAgICAgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorCisJcGFja2V0X2xlbiAtPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFKTsKKwlwcHRyID0gcCArIChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0lJSF9MQU5fSEVBREVSX1NJWkUpOworCWJyZWFrOworCisgICAgY2FzZSBJU0lTX1BEVV9QVFBfSUlIOgorCWlmIChpc2lzX2hlYWRlci0+Zml4ZWRfbGVuICE9IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUpKSB7CisJICAgIHByaW50ZigiLCBib2d1cyBmaXhlZCBoZWFkZXIgbGVuZ3RoICV1IHNob3VsZCBiZSAlbHUiLAorCQkgICBpc2lzX2hlYWRlci0+Zml4ZWRfbGVuLCAodW5zaWduZWQgbG9uZylJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUpOworCSAgICByZXR1cm4gKDApOworCX0KKworCXBkdV9sZW49RVhUUkFDVF8xNkJJVFMoaGVhZGVyX2lpaF9wdHAtPnBkdV9sZW4pOworCWlmIChwYWNrZXRfbGVuPnBkdV9sZW4pIHsKKyAgICAgICAgICAgIHBhY2tldF9sZW49cGR1X2xlbjsgLyogZG8gVExWIGRlY29kaW5nIGFzIGxvbmcgYXMgaXQgbWFrZXMgc2Vuc2UgKi8KKyAgICAgICAgICAgIGxlbmd0aD1wZHVfbGVuOworCX0KKworCVRDSEVDSygqaGVhZGVyX2lpaF9wdHApOworCXByaW50ZigiXG5cdCAgc291cmNlLWlkOiAlcywgaG9sZGluZyB0aW1lOiAldXMsIEZsYWdzOiBbJXNdIiwKKyAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2lpaF9wdHAtPnNvdXJjZV9pZCxTWVNURU1fSURfTEVOKSwKKyAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9paWhfcHRwLT5ob2xkaW5nX3RpbWUpLAorICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX2lpaF9jaXJjdWl0X3R5cGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBjaXJjdWl0IHR5cGUgMHglMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2lpaF9wdHAtPmNpcmN1aXRfdHlwZSkpOworCisJcHJpbnRmKCJcblx0ICBjaXJjdWl0LWlkOiAweCUwMngsIFBEVSBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgIGhlYWRlcl9paWhfcHRwLT5jaXJjdWl0X2lkLAorICAgICAgICAgICAgICAgcGR1X2xlbik7CisKKyAgICAgICAgaWYgKHZmbGFnID4gMSkgeworICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLElTSVNfSUlIX1BUUF9IRUFERVJfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKwlwYWNrZXRfbGVuIC09IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUpOworCXBwdHIgPSBwICsgKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfSUlIX1BUUF9IRUFERVJfU0laRSk7CisJYnJlYWs7CisKKyAgICBjYXNlIElTSVNfUERVX0wxX0xTUDoKKyAgICBjYXNlIElTSVNfUERVX0wyX0xTUDoKKwlpZiAoaXNpc19oZWFkZXItPmZpeGVkX2xlbiAhPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19MU1BfSEVBREVSX1NJWkUpKSB7CisJICAgIHByaW50ZigiLCBib2d1cyBmaXhlZCBoZWFkZXIgbGVuZ3RoICV1IHNob3VsZCBiZSAlbHUiLAorCQkgICBpc2lzX2hlYWRlci0+Zml4ZWRfbGVuLCAodW5zaWduZWQgbG9uZylJU0lTX0xTUF9IRUFERVJfU0laRSk7CisJICAgIHJldHVybiAoMCk7CisJfQorCisJcGR1X2xlbj1FWFRSQUNUXzE2QklUUyhoZWFkZXJfbHNwLT5wZHVfbGVuKTsKKwlpZiAocGFja2V0X2xlbj5wZHVfbGVuKSB7CisgICAgICAgICAgICBwYWNrZXRfbGVuPXBkdV9sZW47IC8qIGRvIFRMViBkZWNvZGluZyBhcyBsb25nIGFzIGl0IG1ha2VzIHNlbnNlICovCisgICAgICAgICAgICBsZW5ndGg9cGR1X2xlbjsKKwl9CisKKwlUQ0hFQ0soKmhlYWRlcl9sc3ApOworCXByaW50ZigiXG5cdCAgbHNwLWlkOiAlcywgc2VxOiAweCUwOHgsIGxpZmV0aW1lOiAlNXVzXG5cdCAgY2hrc3VtOiAweCUwNHgiLAorICAgICAgICAgICAgICAgaXNpc19wcmludF9pZChoZWFkZXJfbHNwLT5sc3BfaWQsIExTUF9JRF9MRU4pLAorICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoaGVhZGVyX2xzcC0+c2VxdWVuY2VfbnVtYmVyKSwKKyAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9sc3AtPnJlbWFpbmluZ19saWZldGltZSksCisgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhoZWFkZXJfbHNwLT5jaGVja3N1bSkpOworCisgICAgICAgIC8qIGlmIHRoaXMgaXMgYSBwdXJnZSBkbyBub3QgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCisgICAgICAgIGlmICggRVhUUkFDVF8xNkJJVFMoaGVhZGVyX2xzcC0+cmVtYWluaW5nX2xpZmV0aW1lKSA9PSAwICYmCisgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoaGVhZGVyX2xzcC0+Y2hlY2tzdW0pID09IDApCisgICAgICAgICAgICBwcmludGYoIiAocHVyZ2VkKSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtIC0KKyAgICAgICAgICAgICAqIGNoZWNraW5nIHN0YXJ0cyBhdCB0aGUgbHNwLWlkIGZpZWxkIGF0IGJ5dGUgcG9zaXRpb24gWzEyXQorICAgICAgICAgICAgICogaGVuY2UgdGhlIGxlbmd0aCBuZWVkcyB0byBiZSByZWR1Y2VkIGJ5IDEyIGJ5dGVzICovCisgICAgICAgICAgICBwcmludGYoIiAoJXMpIiwgKG9zaV9ja3N1bSgodV9pbnQ4X3QgKiloZWFkZXJfbHNwLT5sc3BfaWQsIGxlbmd0aC0xMikpID8gImluY29ycmVjdCIgOiAiY29ycmVjdCIpOworCisJcHJpbnRmKCIsIFBEVSBsZW5ndGg6ICV1LCBGbGFnczogWyAlcyIsCisgICAgICAgICAgICAgICBwZHVfbGVuLAorICAgICAgICAgICAgICAgSVNJU19NQVNLX0xTUF9PTF9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJPdmVybG9hZCBiaXQgc2V0LCAiIDogIiIpOworCisJaWYgKElTSVNfTUFTS19MU1BfQVRUX0JJVFMoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSkgeworCSAgICBwcmludGYoIiVzIiwgSVNJU19NQVNLX0xTUF9BVFRfREVGQVVMVF9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJkZWZhdWx0ICIgOiAiIik7CisJICAgIHByaW50ZigiJXMiLCBJU0lTX01BU0tfTFNQX0FUVF9ERUxBWV9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJkZWxheSAiIDogIiIpOworCSAgICBwcmludGYoIiVzIiwgSVNJU19NQVNLX0xTUF9BVFRfRVhQRU5TRV9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJleHBlbnNlICIgOiAiIik7CisJICAgIHByaW50ZigiJXMiLCBJU0lTX01BU0tfTFNQX0FUVF9FUlJPUl9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJlcnJvciAiIDogIiIpOworCSAgICBwcmludGYoIkFUVCBiaXQgc2V0LCAiKTsKKwl9CisJcHJpbnRmKCIlcyIsIElTSVNfTUFTS19MU1BfUEFSVElUSU9OX0JJVChoZWFkZXJfbHNwLT50eXBlYmxvY2spID8gIlAgYml0IHNldCwgIiA6ICIiKTsKKwlwcmludGYoIiVzIF0iLCB0b2syc3RyKGlzaXNfbHNwX2lzdHlwZV92YWx1ZXMsIlVua25vd24oMHgleCkiLElTSVNfTUFTS19MU1BfSVNUWVBFX0JJVFMoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSkpOworCisgICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKKyAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixJU0lTX0xTUF9IRUFERVJfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKwlwYWNrZXRfbGVuIC09IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0xTUF9IRUFERVJfU0laRSk7CisJcHB0ciA9IHAgKyAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19MU1BfSEVBREVSX1NJWkUpOworCWJyZWFrOworCisgICAgY2FzZSBJU0lTX1BEVV9MMV9DU05QOgorICAgIGNhc2UgSVNJU19QRFVfTDJfQ1NOUDoKKwlpZiAoaXNpc19oZWFkZXItPmZpeGVkX2xlbiAhPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19DU05QX0hFQURFUl9TSVpFKSkgeworCSAgICBwcmludGYoIiwgYm9ndXMgZml4ZWQgaGVhZGVyIGxlbmd0aCAldSBzaG91bGQgYmUgJWx1IiwKKwkJICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwgKHVuc2lnbmVkIGxvbmcpSVNJU19DU05QX0hFQURFUl9TSVpFKTsKKwkgICAgcmV0dXJuICgwKTsKKwl9CisKKwlwZHVfbGVuPUVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9jc25wLT5wZHVfbGVuKTsKKwlpZiAocGFja2V0X2xlbj5wZHVfbGVuKSB7CisgICAgICAgICAgICBwYWNrZXRfbGVuPXBkdV9sZW47IC8qIGRvIFRMViBkZWNvZGluZyBhcyBsb25nIGFzIGl0IG1ha2VzIHNlbnNlICovCisgICAgICAgICAgICBsZW5ndGg9cGR1X2xlbjsKKwl9CisKKwlUQ0hFQ0soKmhlYWRlcl9jc25wKTsKKwlwcmludGYoIlxuXHQgIHNvdXJjZS1pZDogICAgJXMsIFBEVSBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2NzbnAtPnNvdXJjZV9pZCwgTk9ERV9JRF9MRU4pLAorICAgICAgICAgICAgICAgcGR1X2xlbik7CisJcHJpbnRmKCJcblx0ICBzdGFydCBsc3AtaWQ6ICVzIiwKKyAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2NzbnAtPnN0YXJ0X2xzcF9pZCwgTFNQX0lEX0xFTikpOworCXByaW50ZigiXG5cdCAgZW5kIGxzcC1pZDogICAlcyIsCisgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9jc25wLT5lbmRfbHNwX2lkLCBMU1BfSURfTEVOKSk7CisKKyAgICAgICAgaWYgKHZmbGFnID4gMSkgeworICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLElTSVNfQ1NOUF9IRUFERVJfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKwlwYWNrZXRfbGVuIC09IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0NTTlBfSEVBREVSX1NJWkUpOworCXBwdHIgPSBwICsgKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfQ1NOUF9IRUFERVJfU0laRSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBJU0lTX1BEVV9MMV9QU05QOgorICAgIGNhc2UgSVNJU19QRFVfTDJfUFNOUDoKKwlpZiAoaXNpc19oZWFkZXItPmZpeGVkX2xlbiAhPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19QU05QX0hFQURFUl9TSVpFKSkgeworCSAgICBwcmludGYoIi0gYm9ndXMgZml4ZWQgaGVhZGVyIGxlbmd0aCAldSBzaG91bGQgYmUgJWx1IiwKKwkJICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwgKHVuc2lnbmVkIGxvbmcpSVNJU19QU05QX0hFQURFUl9TSVpFKTsKKwkgICAgcmV0dXJuICgwKTsKKwl9CisKKwlwZHVfbGVuPUVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9wc25wLT5wZHVfbGVuKTsKKwlpZiAocGFja2V0X2xlbj5wZHVfbGVuKSB7CisgICAgICAgICAgICBwYWNrZXRfbGVuPXBkdV9sZW47IC8qIGRvIFRMViBkZWNvZGluZyBhcyBsb25nIGFzIGl0IG1ha2VzIHNlbnNlICovCisgICAgICAgICAgICBsZW5ndGg9cGR1X2xlbjsKKwl9CisKKwlUQ0hFQ0soKmhlYWRlcl9wc25wKTsKKwlwcmludGYoIlxuXHQgIHNvdXJjZS1pZDogICAgJXMsIFBEVSBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX3BzbnAtPnNvdXJjZV9pZCwgTk9ERV9JRF9MRU4pLAorICAgICAgICAgICAgICAgcGR1X2xlbik7CisKKyAgICAgICAgaWYgKHZmbGFnID4gMSkgeworICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLElTSVNfUFNOUF9IRUFERVJfU0laRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9CisKKwlwYWNrZXRfbGVuIC09IChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX1BTTlBfSEVBREVSX1NJWkUpOworCXBwdHIgPSBwICsgKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfUFNOUF9IRUFERVJfU0laRSk7CisJYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCWlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixsZW5ndGgpKQorCSAgICByZXR1cm4oMCk7CisJcmV0dXJuICgwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE5vdyBwcmludCB0aGUgVExWJ3MuCisgICAgICovCisKKyAgICB3aGlsZSAocGFja2V0X2xlbiA+PSAyKSB7CisgICAgICAgIGlmIChwcHRyID09IHNuYXBlbmQpIHsKKwkgICAgcmV0dXJuICgxKTsKKyAgICAgICAgfQorCisJaWYgKCFUVEVTVDIoKnBwdHIsIDIpKSB7CisJICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCAoJWxkKSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcpKHBwdHItc25hcGVuZCkpOworCSAgICByZXR1cm4gKDEpOworCX0KKwl0bHZfdHlwZSA9ICpwcHRyKys7CisJdGx2X2xlbiA9ICpwcHRyKys7CisgICAgICAgIHRtcCA9dGx2X2xlbjsgLyogY29weSB0ZW1wb3JhcnkgbGVuICYgcG9pbnRlciB0byBwYWNrZXQgZGF0YSAqLworICAgICAgICB0cHRyID0gcHB0cjsKKwlwYWNrZXRfbGVuIC09IDI7CisJaWYgKHRsdl9sZW4gPiBwYWNrZXRfbGVuKSB7CisJICAgIGJyZWFrOworCX0KKworICAgICAgICAvKiBmaXJzdCBsZXRzIHNlZSBpZiB3ZSBrbm93IHRoZSBUTFZzIG5hbWUqLworCXByaW50ZigiXG5cdCAgICAlcyBUTFYgIyV1LCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgIHRvazJzdHIoaXNpc190bHZfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlKSwKKyAgICAgICAgICAgICAgIHRsdl90eXBlLAorICAgICAgICAgICAgICAgdGx2X2xlbik7CisKKyAgICAgICAgaWYgKHRsdl9sZW4gPT0gMCkgLyogc29tZXRoaW5nIGlzIG1hbGZvcm1lZCAqLworCSAgICBjb250aW51ZTsKKworICAgICAgICAvKiBub3cgY2hlY2sgaWYgd2UgaGF2ZSBhIGRlY29kZXIgb3RoZXJ3aXNlIGRvIGEgaGV4ZHVtcCBhdCB0aGUgZW5kKi8KKwlzd2l0Y2ggKHRsdl90eXBlKSB7CisJY2FzZSBJU0lTX1RMVl9BUkVBX0FERFI6CisJICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSkKKwkJZ290byB0cnVuY3RsdjsKKwkgICAgYWxlbiA9ICp0cHRyKys7CisJICAgIHdoaWxlICh0bXAgJiYgYWxlbiA8IHRtcCkgeworCQlwcmludGYoIlxuXHQgICAgICBBcmVhIGFkZHJlc3MgKGxlbmd0aDogJXUpOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKHRwdHIsYWxlbikpOworCQl0cHRyICs9IGFsZW47CisJCXRtcCAtPSBhbGVuICsgMTsKKwkJaWYgKHRtcD09MCkgLyogaWYgdGhpcyBpcyB0aGUgbGFzdCBhcmVhIGFkZHJlc3MgZG8gbm90IGF0dGVtdCBhIGJvdW5kYXJ5IGNoZWNrICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQlpZiAoIVRURVNUMigqdHB0ciwgMSkpCisJCSAgICBnb3RvIHRydW5jdGx2OworCQlhbGVuID0gKnRwdHIrKzsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlIElTSVNfVExWX0lTTkVJR0g6CisJICAgIHdoaWxlICh0bXAgPj0gRVRIRVJfQUREUl9MRU4pIHsKKyAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgRVRIRVJfQUREUl9MRU4pKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIFNOUEE6ICVzIixpc2lzX3ByaW50X2lkKHRwdHIsRVRIRVJfQUREUl9MRU4pKTsKKyAgICAgICAgICAgICAgICB0bXAgLT0gRVRIRVJfQUREUl9MRU47CisgICAgICAgICAgICAgICAgdHB0ciArPSBFVEhFUl9BRERSX0xFTjsKKwkgICAgfQorCSAgICBicmVhazsKKworICAgICAgICBjYXNlIElTSVNfVExWX0lTTkVJR0hfVkFSTEVOOgorICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpIHx8IHRtcCA8IDMpIC8qIG1pbi4gVExWIGxlbmd0aCAqLworCQlnb3RvIHRydW5jdGx2OworCSAgICBsYW5fYWxlbiA9ICp0cHRyKys7IC8qIExBTiBhZGRyZXNzIGxlbmd0aCAqLworCSAgICBpZiAobGFuX2FsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIExBTiBhZGRyZXNzIGxlbmd0aCAwIGJ5dGVzIChpbnZhbGlkKSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wIC0tOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgTEFOIGFkZHJlc3MgbGVuZ3RoICV1IGJ5dGVzICIsbGFuX2FsZW4pOworCSAgICB3aGlsZSAodG1wID49IGxhbl9hbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIGxhbl9hbGVuKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdElTIE5laWdoYm9yOiAlcyIsaXNpc19wcmludF9pZCh0cHRyLGxhbl9hbGVuKSk7CisgICAgICAgICAgICAgICAgdG1wIC09IGxhbl9hbGVuOworICAgICAgICAgICAgICAgIHRwdHIgKz1sYW5fYWxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisJY2FzZSBJU0lTX1RMVl9QQURESU5HOgorCSAgICBicmVhazsKKworICAgICAgICBjYXNlIElTSVNfVExWX01UX0lTX1JFQUNIOgorICAgICAgICAgICAgd2hpbGUgKHRtcCA+PSAyK05PREVfSURfTEVOKzMrMSkgeworICAgICAgICAgICAgICAgIG10X2xlbiA9IGlzaXNfcHJpbnRfbXRpZCh0cHRyLCAiXG5cdCAgICAgICIpOworICAgICAgICAgICAgICAgIGlmIChtdF9sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7CisgICAgICAgICAgICAgICAgdHB0cis9bXRfbGVuOworICAgICAgICAgICAgICAgIHRtcC09bXRfbGVuOworCisgICAgICAgICAgICAgICAgZXh0X2lzX2xlbiA9IGlzaXNfcHJpbnRfZXh0X2lzX3JlYWNoKHRwdHIsIlxuXHQgICAgICAiLHRsdl90eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0X2lzX2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0bXAtPWV4dF9pc19sZW47CisgICAgICAgICAgICAgICAgdHB0cis9ZXh0X2lzX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSVNJU19UTFZfSVNfQUxJQVNfSUQ6CisJICAgIHdoaWxlICh0bXAgPj0gTk9ERV9JRF9MRU4rMSkgeyAvKiBpcyBpdCB3b3J0aCBhdHRlbXB0aW5nIGEgZGVjb2RlID8gKi8KKwkgICAgICAgIGV4dF9pc19sZW4gPSBpc2lzX3ByaW50X2V4dF9pc19yZWFjaCh0cHRyLCJcblx0ICAgICAgIix0bHZfdHlwZSk7CisJCWlmIChleHRfaXNfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLworCSAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7CisJCXRtcC09ZXh0X2lzX2xlbjsKKwkJdHB0cis9ZXh0X2lzX2xlbjsKKwkgICAgfQorCSAgICBicmVhazsKKworICAgICAgICBjYXNlIElTSVNfVExWX0VYVF9JU19SRUFDSDoKKyAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gTk9ERV9JRF9MRU4rMysxKSB7IC8qIGlzIGl0IHdvcnRoIGF0dGVtcHRpbmcgYSBkZWNvZGUgPyAqLworICAgICAgICAgICAgICAgIGV4dF9pc19sZW4gPSBpc2lzX3ByaW50X2V4dF9pc19yZWFjaCh0cHRyLCJcblx0ICAgICAgIix0bHZfdHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9pc19sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7ICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRtcC09ZXh0X2lzX2xlbjsKKyAgICAgICAgICAgICAgICB0cHRyKz1leHRfaXNfbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNJU19UTFZfSVNfUkVBQ0g6CisJICAgIGlmICghVFRFU1QyKCp0cHRyLDEpKSAgLyogY2hlY2sgaWYgdGhlcmUgaXMgb25lIGJ5dGUgbGVmdCB0byByZWFkIG91dCB0aGUgdmlydHVhbCBmbGFnICovCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfaXNfcmVhY2hfdmlydHVhbF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9ndXMgdmlydHVhbCBmbGFnIDB4JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cisrKSk7CisJICAgIHRsdl9pc19yZWFjaCA9IChjb25zdCBzdHJ1Y3QgaXNpc190bHZfaXNfcmVhY2ggKil0cHRyOworICAgICAgICAgICAgd2hpbGUgKHRtcCA+PSBzaXplb2Yoc3RydWN0IGlzaXNfdGx2X2lzX3JlYWNoKSkgeworCQlpZiAoIVRURVNUKCp0bHZfaXNfcmVhY2gpKQorCQkgICAgZ290byB0cnVuY3RsdjsKKwkJcHJpbnRmKCJcblx0ICAgICAgSVMgTmVpZ2hib3I6ICVzIiwKKwkJICAgICAgIGlzaXNfcHJpbnRfaWQodGx2X2lzX3JlYWNoLT5uZWlnaGJvcl9ub2RlaWQsIE5PREVfSURfTEVOKSk7CisgICAgICAgICAgICAgICAgaXNpc19wcmludF9tZXRyaWNfYmxvY2soJnRsdl9pc19yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2spOworCQl0bXAgLT0gc2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9pc19yZWFjaCk7CisJCXRsdl9pc19yZWFjaCsrOworCSAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElTSVNfVExWX0VTTkVJR0g6CisJICAgIHRsdl9lc19yZWFjaCA9IChjb25zdCBzdHJ1Y3QgaXNpc190bHZfZXNfcmVhY2ggKil0cHRyOworICAgICAgICAgICAgd2hpbGUgKHRtcCA+PSBzaXplb2Yoc3RydWN0IGlzaXNfdGx2X2VzX3JlYWNoKSkgeworCQlpZiAoIVRURVNUKCp0bHZfZXNfcmVhY2gpKQorCQkgICAgZ290byB0cnVuY3RsdjsKKwkJcHJpbnRmKCJcblx0ICAgICAgRVMgTmVpZ2hib3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNpc19wcmludF9pZCh0bHZfZXNfcmVhY2gtPm5laWdoYm9yX3N5c2lkLFNZU1RFTV9JRF9MRU4pKTsKKyAgICAgICAgICAgICAgICBpc2lzX3ByaW50X21ldHJpY19ibG9jaygmdGx2X2VzX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jayk7CisJCXRtcCAtPSBzaXplb2Yoc3RydWN0IGlzaXNfdGx2X2VzX3JlYWNoKTsKKwkJdGx2X2VzX3JlYWNoKys7CisJICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiB0aG9zZSB0d28gVExWcyBzaGFyZSB0aGUgc2FtZSBmb3JtYXQgKi8KKwljYXNlIElTSVNfVExWX0lOVF9JUF9SRUFDSDoKKwljYXNlIElTSVNfVExWX0VYVF9JUF9SRUFDSDoKKwkgICAgaWYgKCFpc2lzX3ByaW50X3Rsdl9pcF9yZWFjaChwcHRyLCAiXG5cdCAgICAgICIsIHRsdl9sZW4pKQorCQlyZXR1cm4gKDEpOworCSAgICBicmVhazsKKworCWNhc2UgSVNJU19UTFZfRVhURF9JUF9SRUFDSDoKKwkgICAgd2hpbGUgKHRtcD4wKSB7CisgICAgICAgICAgICAgICAgZXh0X2lwX2xlbiA9IGlzaXNfcHJpbnRfZXh0ZF9pcF9yZWFjaCh0cHRyLCAiXG5cdCAgICAgICIsIElQVjQpOworICAgICAgICAgICAgICAgIGlmIChleHRfaXBfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgICAgIHRwdHIrPWV4dF9pcF9sZW47CisJCXRtcC09ZXh0X2lwX2xlbjsKKwkgICAgfQorCSAgICBicmVhazsKKworICAgICAgICBjYXNlIElTSVNfVExWX01UX0lQX1JFQUNIOgorICAgICAgICAgICAgbXRfbGVuID0gaXNpc19wcmludF9tdGlkKHRwdHIsICJcblx0ICAgICAgIik7CisgICAgICAgICAgICBpZiAobXRfbGVuID09IDApIHsgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRwdHIrPW10X2xlbjsKKyAgICAgICAgICAgIHRtcC09bXRfbGVuOworCisgICAgICAgICAgICB3aGlsZSAodG1wPjApIHsKKyAgICAgICAgICAgICAgICBleHRfaXBfbGVuID0gaXNpc19wcmludF9leHRkX2lwX3JlYWNoKHRwdHIsICJcblx0ICAgICAgIiwgSVBWNCk7CisgICAgICAgICAgICAgICAgaWYgKGV4dF9pcF9sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7CisgICAgICAgICAgICAgICAgdHB0cis9ZXh0X2lwX2xlbjsKKwkJdG1wLT1leHRfaXBfbGVuOworCSAgICB9CisJICAgIGJyZWFrOworCisjaWZkZWYgSU5FVDYKKwljYXNlIElTSVNfVExWX0lQNl9SRUFDSDoKKwkgICAgd2hpbGUgKHRtcD4wKSB7CisgICAgICAgICAgICAgICAgZXh0X2lwX2xlbiA9IGlzaXNfcHJpbnRfZXh0ZF9pcF9yZWFjaCh0cHRyLCAiXG5cdCAgICAgICIsIElQVjYpOworICAgICAgICAgICAgICAgIGlmIChleHRfaXBfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgICAgIHRwdHIrPWV4dF9pcF9sZW47CisJCXRtcC09ZXh0X2lwX2xlbjsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgSVNJU19UTFZfTVRfSVA2X1JFQUNIOgorICAgICAgICAgICAgbXRfbGVuID0gaXNpc19wcmludF9tdGlkKHRwdHIsICJcblx0ICAgICAgIik7CisgICAgICAgICAgICBpZiAobXRfbGVuID09IDApIHsgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRwdHIrPW10X2xlbjsKKyAgICAgICAgICAgIHRtcC09bXRfbGVuOworCisJICAgIHdoaWxlICh0bXA+MCkgeworICAgICAgICAgICAgICAgIGV4dF9pcF9sZW4gPSBpc2lzX3ByaW50X2V4dGRfaXBfcmVhY2godHB0ciwgIlxuXHQgICAgICAiLCBJUFY2KTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0X2lwX2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICB0cHRyKz1leHRfaXBfbGVuOworCQl0bXAtPWV4dF9pcF9sZW47CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX0lQNkFERFI6CisJICAgIHdoaWxlICh0bXA+PXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7CisJCWlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkpCisJCSAgICBnb3RvIHRydW5jdGx2OworCisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NiBpbnRlcmZhY2UgYWRkcmVzczogJXMiLAorCQkgICAgICAgaXA2YWRkcl9zdHJpbmcodHB0cikpOworCisJCXRwdHIgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCXRtcCAtPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZgorCWNhc2UgSVNJU19UTFZfQVVUSDoKKwkgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQorCQlnb3RvIHRydW5jdGx2OworCisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlczogIiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfc3VidGx2X2F1dGhfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gQXV0aGVudGljYXRpb24gdHlwZSAweCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIpKTsKKworCSAgICBzd2l0Y2ggKCp0cHRyKSB7CisJICAgIGNhc2UgSVNJU19TVUJUTFZfQVVUSF9TSU1QTEU6CisJCWZvcihpPTE7aTx0bHZfbGVuO2krKykgeworCQkgICAgaWYgKCFUVEVTVDIoKih0cHRyK2kpLCAxKSkKKwkJCWdvdG8gdHJ1bmN0bHY7CisJCSAgICBwcmludGYoIiVjIiwqKHRwdHIraSkpOworCQl9CisJCWJyZWFrOworCSAgICBjYXNlIElTSVNfU1VCVExWX0FVVEhfTUQ1OgorCQlmb3IoaT0xO2k8dGx2X2xlbjtpKyspIHsKKwkJICAgIGlmICghVFRFU1QyKCoodHB0citpKSwgMSkpCisJCQlnb3RvIHRydW5jdGx2OworCQkgICAgcHJpbnRmKCIlMDJ4IiwqKHRwdHIraSkpOworCQl9CisJCWlmICh0bHZfbGVuICE9IElTSVNfU1VCVExWX0FVVEhfTUQ1X0xFTisxKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgKG1hbGZvcm1lZCBzdWJUTFYpICIpOworCQlicmVhazsKKwkgICAgY2FzZSBJU0lTX1NVQlRMVl9BVVRIX1BSSVZBVEU6CisJICAgIGRlZmF1bHQ6CisJCWlmKCFwcmludF91bmtub3duX2RhdGEodHB0cisxLCJcblx0XHQgICIsdGx2X2xlbi0xKSkKKwkJICAgIHJldHVybigwKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX1BUUF9BREo6CisJICAgIHRsdl9wdHBfYWRqID0gKGNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9wdHBfYWRqICopdHB0cjsKKwkgICAgaWYodG1wPj0xKSB7CisJCWlmICghVFRFU1QyKCp0cHRyLCAxKSkKKwkJICAgIGdvdG8gdHJ1bmN0bHY7CisJCXByaW50ZigiXG5cdCAgICAgIEFkamFjZW5jeSBTdGF0ZTogJXMgKCV1KSIsCisJCSAgICAgICB0b2syc3RyKGlzaXNfcHRwX2FkamFuY2V5X3ZhbHVlcywgInVua25vd24iLCAqdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cik7CisJCXRtcC0tOworCSAgICB9CisJICAgIGlmKHRtcD5zaXplb2YodGx2X3B0cF9hZGotPmV4dGRfbG9jYWxfY2lyY3VpdF9pZCkpIHsKKwkJaWYgKCFUVEVTVDIodGx2X3B0cF9hZGotPmV4dGRfbG9jYWxfY2lyY3VpdF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGx2X3B0cF9hZGotPmV4dGRfbG9jYWxfY2lyY3VpdF9pZCkpKQorCQkgICAgZ290byB0cnVuY3RsdjsKKwkJcHJpbnRmKCJcblx0ICAgICAgRXh0ZW5kZWQgTG9jYWwgY2lyY3VpdC1JRDogMHglMDh4IiwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRsdl9wdHBfYWRqLT5leHRkX2xvY2FsX2NpcmN1aXRfaWQpKTsKKwkJdG1wLT1zaXplb2YodGx2X3B0cF9hZGotPmV4dGRfbG9jYWxfY2lyY3VpdF9pZCk7CisJICAgIH0KKwkgICAgaWYodG1wPj1TWVNURU1fSURfTEVOKSB7CisJCWlmICghVFRFU1QyKHRsdl9wdHBfYWRqLT5uZWlnaGJvcl9zeXNpZCwgU1lTVEVNX0lEX0xFTikpCisJCSAgICBnb3RvIHRydW5jdGx2OworCQlwcmludGYoIlxuXHQgICAgICBOZWlnaGJvciBTeXN0ZW0tSUQ6ICVzIiwKKwkJICAgICAgIGlzaXNfcHJpbnRfaWQodGx2X3B0cF9hZGotPm5laWdoYm9yX3N5c2lkLFNZU1RFTV9JRF9MRU4pKTsKKwkJdG1wLT1TWVNURU1fSURfTEVOOworCSAgICB9CisJICAgIGlmKHRtcD49c2l6ZW9mKHRsdl9wdHBfYWRqLT5uZWlnaGJvcl9leHRkX2xvY2FsX2NpcmN1aXRfaWQpKSB7CisJCWlmICghVFRFU1QyKHRsdl9wdHBfYWRqLT5uZWlnaGJvcl9leHRkX2xvY2FsX2NpcmN1aXRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRsdl9wdHBfYWRqLT5uZWlnaGJvcl9leHRkX2xvY2FsX2NpcmN1aXRfaWQpKSkKKwkJICAgIGdvdG8gdHJ1bmN0bHY7CisJCXByaW50ZigiXG5cdCAgICAgIE5laWdoYm9yIEV4dGVuZGVkIExvY2FsIGNpcmN1aXQtSUQ6IDB4JTA4eCIsCisJCSAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRwX2Fkai0+bmVpZ2hib3JfZXh0ZF9sb2NhbF9jaXJjdWl0X2lkKSk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX1BST1RPQ09MUzoKKwkgICAgcHJpbnRmKCJcblx0ICAgICAgTkxQSUQocyk6ICIpOworCSAgICB3aGlsZSAodG1wPjApIHsKKwkJaWYgKCFUVEVTVDIoKih0cHRyKSwgMSkpCisJCSAgICBnb3RvIHRydW5jdGx2OworCQlwcmludGYoIiVzICgweCUwMngpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihubHBpZF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIpOworCQlpZiAodG1wPjEpIC8qIGZ1cnRoZXIgTlBMSURzID8gLSBwdXQgY29tbWEgKi8KKwkJICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgICAgICAgICB0cHRyKys7CisgICAgICAgICAgICAgICAgdG1wLS07CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX1RFX1JPVVRFUl9JRDoKKwkgICAgaWYgKCFUVEVTVDIoKnBwdHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQorCQlnb3RvIHRydW5jdGx2OworCSAgICBwcmludGYoIlxuXHQgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIFJvdXRlciBJRDogJXMiLCBpcGFkZHJfc3RyaW5nKHBwdHIpKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX0lQQUREUjoKKwkgICAgd2hpbGUgKHRtcD49c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQlpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCisJCSAgICBnb3RvIHRydW5jdGx2OworCQlwcmludGYoIlxuXHQgICAgICBJUHY0IGludGVyZmFjZSBhZGRyZXNzOiAlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOworCQl0cHRyICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCXRtcCAtPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBJU0lTX1RMVl9IT1NUTkFNRToKKwkgICAgcHJpbnRmKCJcblx0ICAgICAgSG9zdG5hbWU6ICIpOworCSAgICB3aGlsZSAodG1wPjApIHsKKwkJaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQorCQkgICAgZ290byB0cnVuY3RsdjsKKwkJcHJpbnRmKCIlYyIsKnRwdHIrKyk7CisgICAgICAgICAgICAgICAgdG1wLS07CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX1NIQVJFRF9SSVNLX0dST1VQOgorCSAgICBpZiAodG1wIDwgTk9ERV9JRF9MRU4pCisJICAgICAgICBicmVhazsKKwkgICAgaWYgKCFUVEVTVDIoKnRwdHIsIE5PREVfSURfTEVOKSkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworCSAgICBwcmludGYoIlxuXHQgICAgICBJUyBOZWlnaGJvcjogJXMiLCBpc2lzX3ByaW50X2lkKHRwdHIsIE5PREVfSURfTEVOKSk7CisJICAgIHRwdHIrPShOT0RFX0lEX0xFTik7CisJICAgIHRtcC09KE5PREVfSURfTEVOKTsKKworCSAgICBpZiAodG1wIDwgMSkKKwkgICAgICAgIGJyZWFrOworCSAgICBpZiAoIVRURVNUMigqdHB0ciwgMSkpCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKwkgICAgcHJpbnRmKCIsIEZsYWdzOiBbJXNdIiwgSVNJU19NQVNLX1RMVl9TSEFSRURfUklTS19HUk9VUCgqdHB0cisrKSA/ICJudW1iZXJlZCIgOiAidW5udW1iZXJlZCIpOworCSAgICB0bXAtLTsKKworCSAgICBpZiAodG1wIDwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkKKwkgICAgICAgIGJyZWFrOworCSAgICBpZiAoIVRURVNUMigqdHB0cixzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworCSAgICBwcmludGYoIlxuXHQgICAgICBJUHY0IGludGVyZmFjZSBhZGRyZXNzOiAlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOworCSAgICB0cHRyKz1zaXplb2Yoc3RydWN0IGluX2FkZHIpOworCSAgICB0bXAtPXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisKKwkgICAgaWYgKHRtcCA8IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCisJICAgICAgICBicmVhazsKKwkgICAgaWYgKCFUVEVTVDIoKnRwdHIsc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKwkgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NCBuZWlnaGJvciBhZGRyZXNzOiAlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOworCSAgICB0cHRyKz1zaXplb2Yoc3RydWN0IGluX2FkZHIpOworCSAgICB0bXAtPXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisKKwkgICAgd2hpbGUgKHRtcD49NCkgeworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCA0KSkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBMaW5rLUlEOiAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7CisgICAgICAgICAgICAgICAgdHB0cis9NDsKKyAgICAgICAgICAgICAgICB0bXAtPTQ7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX0xTUDoKKwkgICAgdGx2X2xzcCA9IChjb25zdCBzdHJ1Y3QgaXNpc190bHZfbHNwICopdHB0cjsKKwkgICAgd2hpbGUodG1wPj1zaXplb2Yoc3RydWN0IGlzaXNfdGx2X2xzcCkpIHsKKwkJaWYgKCFUVEVTVCgodGx2X2xzcC0+bHNwX2lkKVtMU1BfSURfTEVOLTFdKSkKKwkJICAgIGdvdG8gdHJ1bmN0bHY7CisJCXByaW50ZigiXG5cdCAgICAgIGxzcC1pZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKHRsdl9sc3AtPmxzcF9pZCwgTFNQX0lEX0xFTikpOworCQlpZiAoIVRURVNUMih0bHZfbHNwLT5zZXF1ZW5jZV9udW1iZXIsIDQpKQorCQkgICAgZ290byB0cnVuY3RsdjsKKwkJcHJpbnRmKCIsIHNlcTogMHglMDh4IixFWFRSQUNUXzMyQklUUyh0bHZfbHNwLT5zZXF1ZW5jZV9udW1iZXIpKTsKKwkJaWYgKCFUVEVTVDIodGx2X2xzcC0+cmVtYWluaW5nX2xpZmV0aW1lLCAyKSkKKwkJICAgIGdvdG8gdHJ1bmN0bHY7CisJCXByaW50ZigiLCBsaWZldGltZTogJTVkcyIsRVhUUkFDVF8xNkJJVFModGx2X2xzcC0+cmVtYWluaW5nX2xpZmV0aW1lKSk7CisJCWlmICghVFRFU1QyKHRsdl9sc3AtPmNoZWNrc3VtLCAyKSkKKwkJICAgIGdvdG8gdHJ1bmN0bHY7CisJCXByaW50ZigiLCBjaGtzdW06IDB4JTA0eCIsRVhUUkFDVF8xNkJJVFModGx2X2xzcC0+Y2hlY2tzdW0pKTsKKwkJdG1wLT1zaXplb2Yoc3RydWN0IGlzaXNfdGx2X2xzcCk7CisJCXRsdl9sc3ArKzsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgSVNJU19UTFZfQ0hFQ0tTVU06CisJICAgIGlmICh0bXAgPCBJU0lTX1RMVl9DSEVDS1NVTV9NSU5MRU4pCisJICAgICAgICBicmVhazsKKwkgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX0NIRUNLU1VNX01JTkxFTikpCisJCWdvdG8gdHJ1bmN0bHY7CisJICAgIHByaW50ZigiXG5cdCAgICAgIGNoZWNrc3VtOiAweCUwNHggIiwgRVhUUkFDVF8xNkJJVFModHB0cikpOworICAgICAgICAgICAgLyogZG8gbm90IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSBpZiBpdCBpcyB6ZXJvCisgICAgICAgICAgICAgKiBtb3N0IGxpa2VseSBhIEhNQUMtTUQ1IFRMViBpcyBhbHNvIHByZXNlbnQgYW5kCisgICAgICAgICAgICAgKiB0byBhdm9pZCBjb25mbGljdHMgdGhlIGNoZWNrc3VtIFRMViBpcyB6ZXJvZWQuCisgICAgICAgICAgICAgKiBzZWUgcmZjMzM1OCBmb3IgZGV0YWlscworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFModHB0cikgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludGYoIih1bnZlcmlmaWVkKSIpOworICAgICAgICAgICAgZWxzZSBwcmludGYoIiglcykiLCBvc2lfY2tzdW0ob3B0ciwgbGVuZ3RoKSA/ICJpbmNvcnJlY3QiIDogImNvcnJlY3QiKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX01UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGlmICh0bXAgPCBJU0lTX1RMVl9NVF9TVVBQT1JURURfTUlOTEVOKQorICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICB3aGlsZSAodG1wPjEpIHsKKwkJLyogbGVuZ3RoIGNhbiBvbmx5IGJlIGEgbXVsdGlwbGUgb2YgMiwgb3RoZXJ3aXNlIHRoZXJlIGlzCisJCSAgIHNvbWV0aGluZyBicm9rZW4gLT4gc28gZGVjb2RlIGRvd24gdW50aWwgbGVuZ3RoIGlzIDEgKi8KKwkJaWYgKHRtcCE9MSkgeworICAgICAgICAgICAgICAgICAgICBtdF9sZW4gPSBpc2lzX3ByaW50X210aWQodHB0ciwgIlxuXHQgICAgICAiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG10X2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7CisgICAgICAgICAgICAgICAgICAgIHRwdHIrPW10X2xlbjsKKyAgICAgICAgICAgICAgICAgICAgdG1wLT1tdF9sZW47CisJCX0gZWxzZSB7CisJCSAgICBwcmludGYoIlxuXHQgICAgICBtYWxmb3JtZWQgTVQtSUQiKTsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIElTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HOgorICAgICAgICAgICAgLyogZmlyc3QgYXR0ZW1wdCB0byBkZWNvZGUgdGhlIGZsYWdzICovCisgICAgICAgICAgICBpZiAodG1wIDwgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfRkxBR0xFTikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19GTEFHTEVOKSkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgRmxhZ3MgWyVzXSIsCisgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihpc2lzX3Jlc3RhcnRfZmxhZ192YWx1ZXMsICJub25lIiwgKnRwdHIpKTsKKyAgICAgICAgICAgIHRwdHIrPUlTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0ZMQUdMRU47CisgICAgICAgICAgICB0bXAtPUlTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0ZMQUdMRU47CisKKyAgICAgICAgICAgIC8qIGlzIHRoZXJlIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIGZsYWdzIGZpZWxkPyAqLworICAgICAgICAgICAgaWYgKHRtcCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAodG1wIDwgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfSE9MRFRJTUVMRU4pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfSE9MRFRJTUVMRU4pKQorICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7CisKKyAgICAgICAgICAgIHByaW50ZigiLCBSZW1haW5pbmcgaG9sZGluZyB0aW1lICV1cyIsIEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgIHRwdHIrPUlTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0hPTERUSU1FTEVOOworICAgICAgICAgICAgdG1wLT1JU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19IT0xEVElNRUxFTjsKKworICAgICAgICAgICAgLyogaXMgdGhlcmUgYW4gYWRkaXRpb25hbCBzeXNpZCBmaWVsZCBwcmVzZW50ID8qLworICAgICAgICAgICAgaWYgKHRtcCA9PSBTWVNURU1fSURfTEVOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBTWVNURU1fSURfTEVOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgZm9yICVzIixpc2lzX3ByaW50X2lkKHRwdHIsU1lTVEVNX0lEX0xFTikpOworICAgICAgICAgICAgfSAKKwkgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9JRFJQX0lORk86CisJICAgIGlmICh0bXAgPCBJU0lTX1RMVl9JRFJQX0lORk9fTUlOTEVOKQorCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgSVNJU19UTFZfSURSUF9JTkZPX01JTkxFTikpCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIEludGVyLURvbWFpbiBJbmZvcm1hdGlvbiBUeXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX3N1YnRsdl9pZHJwX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duICgweCUwMngpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKSk7CisgICAgICAgICAgICBzd2l0Y2ggKCp0cHRyKyspIHsKKyAgICAgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfSURSUF9BU046CisgICAgICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDIpKSAvKiBmZXRjaCBBUyBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICBwcmludGYoIkFTIE51bWJlcjogJXUiLEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfSURSUF9MT0NBTDoKKyAgICAgICAgICAgIGNhc2UgSVNJU19TVUJUTFZfSURSUF9SRVM6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X2xlbi0xKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9MU1BfQlVGRkVSU0laRToKKwkgICAgaWYgKHRtcCA8IElTSVNfVExWX0xTUF9CVUZGRVJTSVpFX01JTkxFTikKKwkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX0xTUF9CVUZGRVJTSVpFX01JTkxFTikpCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIExTUCBCdWZmZXJzaXplOiAldSIsRVhUUkFDVF8xNkJJVFModHB0cikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9QQVJUX0RJUzoKKyAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gU1lTVEVNX0lEX0xFTikgeworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBTWVNURU1fSURfTEVOKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsaXNpc19wcmludF9pZCh0cHRyLFNZU1RFTV9JRF9MRU4pKTsKKyAgICAgICAgICAgICAgICB0cHRyKz1TWVNURU1fSURfTEVOOworICAgICAgICAgICAgICAgIHRtcC09U1lTVEVNX0lEX0xFTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSVNJU19UTFZfUFJFRklYX05FSUdIOgorCSAgICBpZiAodG1wIDwgc2l6ZW9mKHN0cnVjdCBpc2lzX21ldHJpY19ibG9jaykpCisJICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IGlzaXNfbWV0cmljX2Jsb2NrKSkpCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIE1ldHJpYyBCbG9jayIpOworICAgICAgICAgICAgaXNpc19wcmludF9tZXRyaWNfYmxvY2soKGNvbnN0IHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayAqKXRwdHIpOworICAgICAgICAgICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayk7CisgICAgICAgICAgICB0bXAtPXNpemVvZihzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2spOworCisgICAgICAgICAgICB3aGlsZSh0bXA+MCkgeworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgICAgICBwcmVmaXhfbGVuPSp0cHRyKys7IC8qIHJlYWQgb3V0IHByZWZpeCBsZW5ndGggaW4gc2VtaW9jdGV0cyovCisgICAgICAgICAgICAgICAgaWYgKHByZWZpeF9sZW4gPCAyKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0QWRkcmVzczogcHJlZml4IGxlbmd0aCAldSA8IDIiLCBwcmVmaXhfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcC0tOworICAgICAgICAgICAgICAgIGlmICh0bXAgPCBwcmVmaXhfbGVuLzIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBwcmVmaXhfbGVuLzIpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0QWRkcmVzczogJXMvJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyh0cHRyLHByZWZpeF9sZW4vMiksCisgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9sZW4qNCk7CisgICAgICAgICAgICAgICAgdHB0cis9cHJlZml4X2xlbi8yOworICAgICAgICAgICAgICAgIHRtcC09cHJlZml4X2xlbi8yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9JSUhfU0VRTlI6CisJICAgIGlmICh0bXAgPCBJU0lTX1RMVl9JSUhfU0VRTlJfTUlOTEVOKQorCSAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgSVNJU19UTFZfSUlIX1NFUU5SX01JTkxFTikpIC8qIGNoZWNrIGlmIGZvdXIgYnl0ZXMgYXJlIG9uIHRoZSB3aXJlICovCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIFNlcXVlbmNlIG51bWJlcjogJXUiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURToKKwkgICAgaWYgKHRtcCA8IElTSVNfVExWX1ZFTkRPUl9QUklWQVRFX01JTkxFTikKKwkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX1ZFTkRPUl9QUklWQVRFX01JTkxFTikpIC8qIGNoZWNrIGlmIGVub3VnaCBieXRlIGZvciBhIGZ1bGwgb3VpICovCisgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKKyAgICAgICAgICAgIHZlbmRvcl9pZCA9IEVYVFJBQ1RfMjRCSVRTKHRwdHIpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgVmVuZG9yOiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKG91aV92YWx1ZXMsIlVua25vd24iLHZlbmRvcl9pZCksCisgICAgICAgICAgICAgICAgICAgdmVuZG9yX2lkKTsKKyAgICAgICAgICAgIHRwdHIrPTM7CisgICAgICAgICAgICB0bXAtPTM7CisgICAgICAgICAgICBpZiAodG1wID4gMCkgLyogaGV4ZHVtcCB0aGUgcmVzdCAqLworICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdFx0Iix0bXApKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgVExWcyB0aGF0IGxhY2sgYSBkZWNvZGVyCisgICAgICAgICAgICAgKiB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQorICAgICAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9ERUNORVRfUEhBU0U0OgorICAgICAgICBjYXNlIElTSVNfVExWX0xVQ0VOVF9QUklWQVRFOgorICAgICAgICBjYXNlIElTSVNfVExWX0lQQVVUSDoKKyAgICAgICAgY2FzZSBJU0lTX1RMVl9OT1JURUxfUFJJVkFURTE6CisgICAgICAgIGNhc2UgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUyOgorCisJZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7CisgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0XHQiLHRsdl9sZW4pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICAgICB9CisJICAgIGJyZWFrOworCX0KKyAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLworICAgICAgICBpZiAodmZsYWc+IDEpIHsKKwkgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAgICAgIix0bHZfbGVuKSkKKwkgICAgICAgIHJldHVybigwKTsKKyAgICAgICAgfQorCisJcHB0ciArPSB0bHZfbGVuOworCXBhY2tldF9sZW4gLT0gdGx2X2xlbjsKKyAgICB9CisKKyAgICBpZiAocGFja2V0X2xlbiAhPSAwKSB7CisJcHJpbnRmKCJcblx0ICAgICAgJXUgc3RyYWdnbGVyIGJ5dGVzIiwgcGFja2V0X2xlbik7CisgICAgfQorICAgIHJldHVybiAoMSk7CisKKyB0cnVuYzoKKyAgICBmcHV0cygiW3xpc2lzXSIsIHN0ZG91dCk7CisgICAgcmV0dXJuICgxKTsKKworIHRydW5jdGx2OgorICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOworICAgIHJldHVybigxKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGUgY2hlY2tzdW0uICBTZWUgODQ3My0xLCBBcHBlbmRpeCBDLCBzZWN0aW9uIEMuNC4KKyAqLworCitzdGF0aWMgaW50Citvc2lfY2tzdW0oY29uc3QgdV9pbnQ4X3QgKnRwdHIsIHVfaW50IGxlbikKK3sKKwlpbnQzMl90IGMwID0gMCwgYzEgPSAwOworCisJd2hpbGUgKChpbnQpLS1sZW4gPj0gMCkgeworCQljMCArPSAqdHB0cisrOworCQljMCAlPSAyNTU7CisJCWMxICs9IGMwOworCQljMSAlPSAyNTU7CisJfQorCXJldHVybiAoYzAgfCBjMSk7Cit9CisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LWp1bmlwZXIuYyBiL3ByaW50LWp1bmlwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTgzN2UzCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtanVuaXBlci5jCkBAIC0wLDAgKzEsMTAzMiBAQAorLyogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWp1bmlwZXIuYyx2IDEuOC4yLjIyIDIwMDYvMDUvMTAgMjI6NDI6NDYgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgInBwcC5oIgorI2luY2x1ZGUgImxsYy5oIgorI2luY2x1ZGUgIm5scGlkLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisjaW5jbHVkZSAiYXRtLmgiCisKKyNkZWZpbmUgSlVOSVBFUl9CUEZfT1VUICAgICAgICAgICAwICAgICAgIC8qIE91dGdvaW5nIHBhY2tldCAqLworI2RlZmluZSBKVU5JUEVSX0JQRl9JTiAgICAgICAgICAgIDEgICAgICAgLyogSW5jb21pbmcgcGFja2V0ICovCisjZGVmaW5lIEpVTklQRVJfQlBGX1BLVF9JTiAgICAgICAgMHgxICAgICAvKiBJbmNvbWluZyBwYWNrZXQgKi8KKyNkZWZpbmUgSlVOSVBFUl9CUEZfTk9fTDIgICAgICAgICAweDIgICAgIC8qIEwyIGhlYWRlciBzdHJpcHBlZCAqLworI2RlZmluZSBKVU5JUEVSX0JQRl9FWFQgICAgICAgICAgIDB4ODAgICAgLyogZXh0ZW5zaW9ucyBwcmVzZW50ICovCisjZGVmaW5lIEpVTklQRVJfTUdDX05VTUJFUiAgICAgICAgMHg0ZDQ3NDMgLyogPSAiTUdDIiAqLworCisjZGVmaW5lIEpVTklQRVJfTFNRX0NPT0tJRV9SRSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEpVTklQRVJfTFNRX0NPT0tJRV9ESVIgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEpVTklQRVJfTFNRX0wzX1BST1RPX1NISUZUICAgICA0CisjZGVmaW5lIEpVTklQRVJfTFNRX0wzX1BST1RPX01BU0sgICAgICgweDE3IDw8IEpVTklQRVJfTFNRX0wzX1BST1RPX1NISUZUKQorI2RlZmluZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JUFY0ICAgICAoMCA8PCBKVU5JUEVSX0xTUV9MM19QUk9UT19TSElGVCkKKyNkZWZpbmUgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVBWNiAgICAgKDEgPDwgSlVOSVBFUl9MU1FfTDNfUFJPVE9fU0hJRlQpCisjZGVmaW5lIEpVTklQRVJfTFNRX0wzX1BST1RPX01QTFMgICAgICgyIDw8IEpVTklQRVJfTFNRX0wzX1BST1RPX1NISUZUKQorI2RlZmluZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JU08gICAgICAoMyA8PCBKVU5JUEVSX0xTUV9MM19QUk9UT19TSElGVCkKKyNkZWZpbmUgQVNfUElDX0NPT0tJRV9MRU4gOAorCisjZGVmaW5lIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVF9FU1BfQVVUSEVOX1RZUEUgMQorI2RlZmluZSBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRfQUhfQVVUSEVOX1RZUEUgMgorI2RlZmluZSBKVU5JUEVSX0lQU0VDX09fRVNQX0FVVEhFTlRJQ0FUSU9OX1RZUEUgMworI2RlZmluZSBKVU5JUEVSX0lQU0VDX09fQUhfQVVUSEVOVElDQVRJT05fVFlQRSA0CisjZGVmaW5lIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVElPTl9UWVBFIDUKKworc3RhdGljIHN0cnVjdCB0b2sganVuaXBlcl9pcHNlY190eXBlX3ZhbHVlc1tdID0geworICAgIHsgSlVOSVBFUl9JUFNFQ19PX0VTUF9FTkNSWVBUX0VTUF9BVVRIRU5fVFlQRSwgIkVTUCBFTkNSLUFVVEgiIH0sCisgICAgeyBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRfQUhfQVVUSEVOX1RZUEUsICJFU1AgRU5DUi1BSCBBVVRIIiB9LAorICAgIHsgSlVOSVBFUl9JUFNFQ19PX0VTUF9BVVRIRU5USUNBVElPTl9UWVBFLCAiRVNQIEFVVEgiIH0sCisgICAgeyBKVU5JUEVSX0lQU0VDX09fQUhfQVVUSEVOVElDQVRJT05fVFlQRSwgIkFIIEFVVEgiIH0sCisgICAgeyBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRJT05fVFlQRSwgIkVTUCBFTkNSIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGp1bmlwZXJfZGlyZWN0aW9uX3ZhbHVlc1tdID0geworICAgIHsgSlVOSVBFUl9CUEZfSU4sICAiSW4ifSwKKyAgICB7IEpVTklQRVJfQlBGX09VVCwgIk91dCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCBqdW5pcGVyX2Nvb2tpZV90YWJsZV90IHsKKyAgICB1X2ludDMyX3QgcGljdHlwZTsJCS8qIHBpYyB0eXBlICovCisgICAgdV9pbnQ4X3QgIGNvb2tpZV9sZW47ICAgICAgIC8qIGNvb2tpZSBsZW4gKi8KKyAgICBjb25zdCBjaGFyICpzOwkJLyogcGljIG5hbWUgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QganVuaXBlcl9jb29raWVfdGFibGVfdCBqdW5pcGVyX2Nvb2tpZV90YWJsZVtdID0geworI2lmZGVmIERMVF9KVU5JUEVSX0FUTTEKKyAgICB7IERMVF9KVU5JUEVSX0FUTTEsICA0LCAiQVRNMSJ9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfQVRNMgorICAgIHsgRExUX0pVTklQRVJfQVRNMiwgIDgsICJBVE0yIn0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NTFBQUAorICAgIHsgRExUX0pVTklQRVJfTUxQUFAsIDIsICJNTFBQUCJ9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfTUxGUgorICAgIHsgRExUX0pVTklQRVJfTUxGUiwgIDIsICJNTEZSIn0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NRlIKKyAgICB7IERMVF9KVU5JUEVSX01GUiwgICA0LCAiTUZSIn0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9QUFBPRQorICAgIHsgRExUX0pVTklQRVJfUFBQT0UsIDAsICJQUFBvRSJ9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfUFBQT0VfQVRNCisgICAgeyBETFRfSlVOSVBFUl9QUFBPRV9BVE0sIDAsICJQUFBvRSBBVE0ifSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0dHU04KKyAgICB7IERMVF9KVU5JUEVSX0dHU04sIDgsICJHR1NOIn0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NT05JVE9SCisgICAgeyBETFRfSlVOSVBFUl9NT05JVE9SLCA4LCAiTU9OSVRPUiJ9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfU0VSVklDRVMKKyAgICB7IERMVF9KVU5JUEVSX1NFUlZJQ0VTLCA4LCAiQVMifSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0VTCisgICAgeyBETFRfSlVOSVBFUl9FUywgMCwgIkVTIn0sCisjZW5kaWYKKyAgICB7IDAsIDAsIE5VTEwgfQorfTsKKworc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgeworICAgIHVfaW50MzJfdCBsZW5ndGg7CisgICAgdV9pbnQzMl90IGNhcGxlbjsKKyAgICB1X2ludDMyX3QgcGljdHlwZTsKKyAgICB1X2ludDhfdCBkaXJlY3Rpb247CisgICAgdV9pbnQ4X3QgaGVhZGVyX2xlbjsKKyAgICB1X2ludDhfdCBjb29raWVfbGVuOworICAgIHVfaW50OF90IGNvb2tpZV90eXBlOworICAgIHVfaW50OF90IGNvb2tpZVs4XTsKKyAgICB1X2ludDhfdCBidW5kbGU7CisgICAgdV9pbnQxNl90IHByb3RvOworfTsKKworI2RlZmluZSBMU19DT09LSUVfSUQgICAgICAgICAgICAweDU0CisjZGVmaW5lIEFTX0NPT0tJRV9JRCAgICAgICAgICAgIDB4NDcKKyNkZWZpbmUgTFNfTUxGUl9DT09LSUVfTEVOCTQKKyNkZWZpbmUgTUxfTUxGUl9DT09LSUVfTEVOCTIKKyNkZWZpbmUgTFNfTUZSX0NPT0tJRV9MRU4JNgorI2RlZmluZSBBVE0xX0NPT0tJRV9MRU4gICAgICAgICA0CisjZGVmaW5lIEFUTTJfQ09PS0lFX0xFTiAgICAgICAgIDgKKworI2RlZmluZSBBVE0yX1BLVF9UWVBFX01BU0sgIDB4NzAKKyNkZWZpbmUgQVRNMl9HQVBfQ09VTlRfTUFTSyAweDNGCisKKyNkZWZpbmUgSlVOSVBFUl9QUk9UT19OVUxMICAgICAgICAgIDEKKyNkZWZpbmUgSlVOSVBFUl9QUk9UT19JUFY0ICAgICAgICAgIDIKKyNkZWZpbmUgSlVOSVBFUl9QUk9UT19JUFY2ICAgICAgICAgIDYKKworI2RlZmluZSBNRlJfQkVfTUFTSyAweGMwCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGp1bmlwZXJfcHJvdG9jb2xfdmFsdWVzW10gPSB7CisgICAgeyBKVU5JUEVSX1BST1RPX05VTEwsICJOdWxsIiB9LAorICAgIHsgSlVOSVBFUl9QUk9UT19JUFY0LCAiSVB2NCIgfSwKKyAgICB7IEpVTklQRVJfUFJPVE9fSVBWNiwgIklQdjYiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworaW50IGlwX2hldXJpc3RpY19ndWVzcyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworaW50IGp1bmlwZXJfcHBwX2hldXJpc3RpY19ndWVzcyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOworc3RhdGljIGludCBqdW5pcGVyX3BhcnNlX2hlYWRlciAoY29uc3QgdV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCAqKTsKKworI2lmZGVmIERMVF9KVU5JUEVSX0dHU04KK3VfaW50CitqdW5pcGVyX2dnc25fcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKyAgICAgICAgc3RydWN0IGp1bmlwZXJfZ2dzbl9oZWFkZXIgeworICAgICAgICAgICAgdV9pbnQ4X3Qgc3ZjX2lkOworICAgICAgICAgICAgdV9pbnQ4X3QgZmxhZ3NfbGVuOworICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG87CisgICAgICAgICAgICB1X2ludDhfdCBmbGFnczsKKyAgICAgICAgICAgIHVfaW50OF90IHZsYW5faWRbMl07CisgICAgICAgICAgICB1X2ludDhfdCByZXNbMl07CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHN0cnVjdCBqdW5pcGVyX2dnc25faGVhZGVyICpnaDsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0dHU047CisgICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIGdoID0gKHN0cnVjdCBqdW5pcGVyX2dnc25faGVhZGVyICopcDsKKworICAgICAgICBpZiAoZWZsYWcpCisgICAgICAgICAgICBwcmludGYoInByb3RvICVzICgldSksIHZsYW4gJXU6ICIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihqdW5pcGVyX3Byb3RvY29sX3ZhbHVlcywiVW5rbm93biIsZ2gtPnByb3RvKSwKKyAgICAgICAgICAgICAgICAgICBnaC0+cHJvdG8sCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmdoLT52bGFuX2lkWzBdKSk7CisKKyAgICAgICAgc3dpdGNoIChnaC0+cHJvdG8pIHsKKyAgICAgICAgY2FzZSBKVU5JUEVSX1BST1RPX0lQVjQ6CisgICAgICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsMmluZm8ubGVuZ3RoKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIElORVQ2CisgICAgICAgIGNhc2UgSlVOSVBFUl9QUk9UT19JUFY2OgorICAgICAgICAgICAgaXA2X3ByaW50KHAsIGwyaW5mby5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSU5FVDYgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghZWZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJ1bmtub3duIEdHU04gcHJvdG8gKCV1KSIsIGdoLT5wcm90byk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworI2lmZGVmIERMVF9KVU5JUEVSX0VTCit1X2ludAoranVuaXBlcl9lc19wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKyAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOworICAgICAgICBzdHJ1Y3QganVuaXBlcl9pcHNlY19oZWFkZXIgeworICAgICAgICAgICAgdV9pbnQ4X3Qgc2FfaW5kZXhbMl07CisgICAgICAgICAgICB1X2ludDhfdCB0dGw7CisgICAgICAgICAgICB1X2ludDhfdCB0eXBlOworICAgICAgICAgICAgdV9pbnQ4X3Qgc3BpWzRdOworICAgICAgICAgICAgdV9pbnQ4X3Qgc3JjX2lwWzRdOworICAgICAgICAgICAgdV9pbnQ4X3QgZHN0X2lwWzRdOworICAgICAgICB9OworICAgICAgICB1X2ludCByZXdyaXRlX2xlbixlc190eXBlX2J1bmRsZTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGp1bmlwZXJfaXBzZWNfaGVhZGVyICppaDsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0VTOworICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICBpaCA9IChzdHJ1Y3QganVuaXBlcl9pcHNlY19oZWFkZXIgKilwOworCisgICAgICAgIHN3aXRjaCAoaWgtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRfRVNQX0FVVEhFTl9UWVBFOgorICAgICAgICBjYXNlIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVF9BSF9BVVRIRU5fVFlQRToKKyAgICAgICAgICAgIHJld3JpdGVfbGVuID0gMDsKKyAgICAgICAgICAgIGVzX3R5cGVfYnVuZGxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpVTklQRVJfSVBTRUNfT19FU1BfQVVUSEVOVElDQVRJT05fVFlQRToKKyAgICAgICAgY2FzZSBKVU5JUEVSX0lQU0VDX09fQUhfQVVUSEVOVElDQVRJT05fVFlQRToKKyAgICAgICAgY2FzZSBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRJT05fVFlQRToKKyAgICAgICAgICAgIHJld3JpdGVfbGVuID0gMTY7CisgICAgICAgICAgICBlc190eXBlX2J1bmRsZSA9IDA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIkVTIEludmFsaWQgdHlwZSAldSwgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICBpaC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICBsMmluZm8ubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGwyaW5mby5sZW5ndGgtPXJld3JpdGVfbGVuOworICAgICAgICBwKz1yZXdyaXRlX2xlbjsKKworICAgICAgICBpZiAoZWZsYWcpIHsKKyAgICAgICAgICAgIGlmICghZXNfdHlwZV9idW5kbGUpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVTIFNBLCBpbmRleCAldSwgdHRsICV1IHR5cGUgJXMgKCV1KSwgc3BpICV1LCBUdW5uZWwgJXMgPiAlcywgbGVuZ3RoICV1XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmloLT5zYV9pbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgIGloLT50dGwsIAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGp1bmlwZXJfaXBzZWNfdHlwZV92YWx1ZXMsIlVua25vd24iLGloLT50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaWgtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZpaC0+c3BpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhFWFRSQUNUXzMyQklUUygmaWgtPnNyY19pcCkpLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKEVYVFJBQ1RfMzJCSVRTKCZpaC0+ZHN0X2lwKSksCisgICAgICAgICAgICAgICAgICAgICAgIGwyaW5mby5sZW5ndGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVTIFNBLCBpbmRleCAldSwgdHRsICV1IHR5cGUgJXMgKCV1KSwgbGVuZ3RoICV1XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmloLT5zYV9pbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgIGloLT50dGwsIAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGp1bmlwZXJfaXBzZWNfdHlwZV92YWx1ZXMsIlVua25vd24iLGloLT50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaWgtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGwyaW5mby5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfTU9OSVRPUgordV9pbnQKK2p1bmlwZXJfbW9uaXRvcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKyAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOworICAgICAgICBzdHJ1Y3QganVuaXBlcl9tb25pdG9yX2hlYWRlciB7CisgICAgICAgICAgICB1X2ludDhfdCBwa3RfdHlwZTsKKyAgICAgICAgICAgIHVfaW50OF90IHBhZGRpbmc7CisgICAgICAgICAgICB1X2ludDhfdCBpaWZbMl07CisgICAgICAgICAgICB1X2ludDhfdCBzZXJ2aWNlX2lkWzRdOworICAgICAgICB9OworICAgICAgICBjb25zdCBzdHJ1Y3QganVuaXBlcl9tb25pdG9yX2hlYWRlciAqbWg7CisKKyAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9NT05JVE9SOworICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICBtaCA9IChzdHJ1Y3QganVuaXBlcl9tb25pdG9yX2hlYWRlciAqKXA7CisKKyAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJzZXJ2aWNlLWlkICV1LCBpaWYgJXUsIHBrdC10eXBlICV1OiAiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZtaC0+c2VydmljZV9pZCksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJm1oLT5paWYpLAorICAgICAgICAgICAgICAgICAgIG1oLT5wa3RfdHlwZSk7CisKKyAgICAgICAgLyogbm8gcHJvdG8gZmllbGQgLSBsZXRzIGd1ZXNzIGJ5IGZpcnN0IGJ5dGUgb2YgSVAgaGVhZGVyKi8KKyAgICAgICAgaXBfaGV1cmlzdGljX2d1ZXNzKHAsIGwyaW5mby5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfU0VSVklDRVMKK3VfaW50CitqdW5pcGVyX3NlcnZpY2VzX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX3NlcnZpY2VzX2hlYWRlciB7CisgICAgICAgICAgICB1X2ludDhfdCBzdmNfaWQ7CisgICAgICAgICAgICB1X2ludDhfdCBmbGFnc19sZW47CisgICAgICAgICAgICB1X2ludDhfdCBzdmNfc2V0X2lkWzJdOworICAgICAgICAgICAgdV9pbnQ4X3QgZGlyX2lpZls0XTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc3RydWN0IGp1bmlwZXJfc2VydmljZXNfaGVhZGVyICpzaDsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX1NFUlZJQ0VTOworICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICBzaCA9IChzdHJ1Y3QganVuaXBlcl9zZXJ2aWNlc19oZWFkZXIgKilwOworCisgICAgICAgIGlmIChlZmxhZykKKyAgICAgICAgICAgIHByaW50Zigic2VydmljZS1pZCAldSBmbGFncyAweCUwMnggc2VydmljZS1zZXQtaWQgMHglMDR4IGlpZiAldTogIiwKKyAgICAgICAgICAgICAgICAgICBzaC0+c3ZjX2lkLAorICAgICAgICAgICAgICAgICAgIHNoLT5mbGFnc19sZW4sCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnNoLT5zdmNfc2V0X2lkKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUygmc2gtPmRpcl9paWZbMV0pKTsKKworICAgICAgICAvKiBubyBwcm90byBmaWVsZCAtIGxldHMgZ3Vlc3MgYnkgZmlyc3QgYnl0ZSBvZiBJUCBoZWFkZXIqLworICAgICAgICBpcF9oZXVyaXN0aWNfZ3Vlc3MocCwgbDJpbmZvLmxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworfQorI2VuZGlmCisKKyNpZmRlZiBETFRfSlVOSVBFUl9QUFBPRQordV9pbnQKK2p1bmlwZXJfcHBwb2VfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX1BQUE9FOworICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICAvKiB0aGlzIERMVCBjb250YWlucyBub3RoaW5nIGJ1dCByYXcgZXRoZXJuZXQgZnJhbWVzICovCisgICAgICAgIGV0aGVyX3ByaW50KHAsIGwyaW5mby5sZW5ndGgsIGwyaW5mby5jYXBsZW4pOworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworI2lmZGVmIERMVF9KVU5JUEVSX0VUSEVSCit1X2ludAoranVuaXBlcl9ldGhlcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKyAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOworCisgICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfRVRIRVI7CisgICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIC8qIHRoaXMgRExUIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHJhdyBFdGhlcm5ldCBmcmFtZXMgKi8KKyAgICAgICAgZXRoZXJfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCwgbDJpbmZvLmNhcGxlbik7CisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfUFBQCit1X2ludAoranVuaXBlcl9wcHBfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX1BQUDsKKyAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgLyogdGhpcyBETFQgY29udGFpbnMgbm90aGluZyBidXQgcmF3IHBwcCBmcmFtZXMgKi8KKyAgICAgICAgcHBwX3ByaW50KHAsIGwyaW5mby5sZW5ndGgpOworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworI2lmZGVmIERMVF9KVU5JUEVSX0ZSRUxBWQordV9pbnQKK2p1bmlwZXJfZnJlbGF5X3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87CisKKyAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9GUkVMQVk7CisgICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIC8qIHRoaXMgRExUIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHJhdyBmcmFtZS1yZWxheSBmcmFtZXMgKi8KKyAgICAgICAgZnJfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfQ0hETEMKK3VfaW50CitqdW5pcGVyX2NoZGxjX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87CisKKyAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9DSERMQzsKKyAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgLyogdGhpcyBETFQgY29udGFpbnMgbm90aGluZyBidXQgcmF3IGMtaGRsYyBmcmFtZXMgKi8KKyAgICAgICAgY2hkbGNfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfUFBQT0VfQVRNCit1X2ludAoranVuaXBlcl9wcHBvZV9hdG1fcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKwl1X2ludDE2X3QgZXh0cmFjdGVkX2V0aGVydHlwZTsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX1BQUE9FX0FUTTsKKyAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKKworICAgICAgICBleHRyYWN0ZWRfZXRoZXJ0eXBlID0gRVhUUkFDVF8xNkJJVFMocCk7CisgICAgICAgIC8qIHRoaXMgRExUIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHJhdyBQUFBvRSBmcmFtZXMsCisgICAgICAgICAqIHByZXBlbmRlZCB3aXRoIGEgdHlwZSBmaWVsZCovCisgICAgICAgIGlmIChldGhlcl9lbmNhcF9wcmludChleHRyYWN0ZWRfZXRoZXJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCtFVEhFUlRZUEVfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJpbmZvLmxlbmd0aC1FVEhFUlRZUEVfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJpbmZvLmNhcGxlbi1FVEhFUlRZUEVfTEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApCisgICAgICAgICAgICAvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJvYmFibHkgaXQgd2Fzbid0IG9uZSAqLworICAgICAgICAgICAgcHJpbnRmKCJ1bmtub3duIGV0aGVydHlwZSAweCUwNHgiLCBleHRyYWN0ZWRfZXRoZXJ0eXBlKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgRExUX0pVTklQRVJfTUxQUFAKK3VfaW50CitqdW5pcGVyX21scHBwX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87CisKKyAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9NTFBQUDsKKyAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworICAgICAgICAvKiBzdXBwcmVzcyBCdW5kbGUtSUQgaWYgZnJhbWUgd2FzIGNhcHR1cmVkIG9uIGEgY2hpbGQtbGluaworICAgICAgICAgKiBiZXN0IGluZGljYXRvciBpZiB0aGUgY29va2llIGxvb2tzIGxpa2UgYSBwcm90byAqLworICAgICAgICBpZiAoZWZsYWcgJiYKKyAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsMmluZm8uY29va2llKSAhPSBQUFBfT1NJICYmCisgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbDJpbmZvLmNvb2tpZSkgIT0gIChQUFBfQUREUkVTUyA8PCA4IHwgUFBQX0NPTlRST0wpKQorICAgICAgICAgICAgcHJpbnRmKCJCdW5kbGUtSUQgJXU6ICIsbDJpbmZvLmJ1bmRsZSk7CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgLyogZmlyc3QgdHJ5IHRoZSBMU1EgcHJvdG9zICovCisgICAgICAgIHN3aXRjaChsMmluZm8ucHJvdG8pIHsKKyAgICAgICAgY2FzZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JUFY0OgorICAgICAgICAgICAgLyogSVAgdHJhZmZpYyBnb2luZyB0byB0aGUgUkUgd291bGQgbm90IGhhdmUgYSBjb29raWUKKyAgICAgICAgICAgICAqIC0+IHRoaXMgbXVzdCBiZSBpbmNvbWluZyBJUy1JUyBvdmVyIFBQUAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobDJpbmZvLmNvb2tpZVs0XSA9PSAoSlVOSVBFUl9MU1FfQ09PS0lFX1JFfEpVTklQRVJfTFNRX0NPT0tJRV9ESVIpKQorICAgICAgICAgICAgICAgIHBwcF9wcmludChwLCBsMmluZm8ubGVuZ3RoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsMmluZm8ubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyNpZmRlZiBJTkVUNgorICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX0lQVjY6CisgICAgICAgICAgICBpcDZfcHJpbnQocCxsMmluZm8ubGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyNlbmRpZgorICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX01QTFM6CisgICAgICAgICAgICBtcGxzX3ByaW50KHAsbDJpbmZvLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVNPOgorICAgICAgICAgICAgaXNvY2xuc19wcmludChwLGwyaW5mby5sZW5ndGgsbDJpbmZvLmNhcGxlbik7CisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHplcm8gbGVuZ3RoIGNvb2tpZSA/ICovCisgICAgICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJmwyaW5mby5jb29raWUpKSB7CisgICAgICAgIGNhc2UgUFBQX09TSToKKyAgICAgICAgICAgIHBwcF9wcmludChwLTIsbDJpbmZvLmxlbmd0aCsyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChQUFBfQUREUkVTUyA8PCA4IHwgUFBQX0NPTlRST0wpOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBwcF9wcmludChwLGwyaW5mby5sZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworCisjaWZkZWYgRExUX0pVTklQRVJfTUZSCit1X2ludAoranVuaXBlcl9tZnJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX01GUjsKKyAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIC8qIGNoaWxkLWxpbmsgPyAqLworICAgICAgICBpZiAobDJpbmZvLmNvb2tpZV9sZW4gPT0gMCkgeworICAgICAgICAgICAgbWZyX3ByaW50KHAsbDJpbmZvLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBmaXJzdCB0cnkgdGhlIExTUSBwcm90b3MgKi8KKyAgICAgICAgaWYgKGwyaW5mby5jb29raWVfbGVuID09IEFTX1BJQ19DT09LSUVfTEVOKSB7CisgICAgICAgICAgICBzd2l0Y2gobDJpbmZvLnByb3RvKSB7CisgICAgICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX0lQVjQ6CisgICAgICAgICAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworI2lmZGVmIElORVQ2CisgICAgICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX0lQVjY6CisgICAgICAgICAgICAgICAgaXA2X3ByaW50KHAsbDJpbmZvLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX01QTFM6CisgICAgICAgICAgICAgICAgbXBsc19wcmludChwLGwyaW5mby5sZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVNPOgorICAgICAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCxsMmluZm8ubGVuZ3RoLGwyaW5mby5jYXBsZW4pOworICAgICAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBzdXBwcmVzcyBCdW5kbGUtSUQgaWYgZnJhbWUgd2FzIGNhcHR1cmVkIG9uIGEgY2hpbGQtbGluayAqLworICAgICAgICBpZiAoZWZsYWcgJiYgRVhUUkFDVF8zMkJJVFMobDJpbmZvLmNvb2tpZSkgIT0gMSkgcHJpbnRmKCJCdW5kbGUtSUQgJXUsICIsbDJpbmZvLmJ1bmRsZSk7CisgICAgICAgIHN3aXRjaCAobDJpbmZvLnByb3RvKSB7CisgICAgICAgIGNhc2UgKExMQ1NBUF9JU09OUzw8OCB8IExMQ1NBUF9JU09OUyk6CisgICAgICAgICAgICBpc29jbG5zX3ByaW50KHArMSwgbDJpbmZvLmxlbmd0aC0xLCBsMmluZm8uY2FwbGVuLTEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKExMQ19VSTw8OCB8IE5MUElEX1E5MzMpOgorICAgICAgICBjYXNlIChMTENfVUk8PDggfCBOTFBJRF9JUCk6CisgICAgICAgIGNhc2UgKExMQ19VSTw8OCB8IE5MUElEX0lQNik6CisgICAgICAgICAgICAvKiBwYXNzIElQezQsNn0gdG8gdGhlIE9TSSBsYXllciBmb3IgcHJvcGVyIGxpbmstbGF5ZXIgcHJpbnRpbmcgKi8KKyAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocC0xLCBsMmluZm8ubGVuZ3RoKzEsIGwyaW5mby5jYXBsZW4rMSk7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoInVua25vd24gcHJvdG9jb2wgMHglMDR4LCBsZW5ndGggJXUiLGwyaW5mby5wcm90bywgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworI2lmZGVmIERMVF9KVU5JUEVSX01MRlIKK3VfaW50CitqdW5pcGVyX21sZnJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX01MRlI7CisgICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgLyogc3VwcHJlc3MgQnVuZGxlLUlEIGlmIGZyYW1lIHdhcyBjYXB0dXJlZCBvbiBhIGNoaWxkLWxpbmsgKi8KKyAgICAgICAgaWYgKGVmbGFnICYmIEVYVFJBQ1RfMzJCSVRTKGwyaW5mby5jb29raWUpICE9IDEpIHByaW50ZigiQnVuZGxlLUlEICV1LCAiLGwyaW5mby5idW5kbGUpOworICAgICAgICBzd2l0Y2ggKGwyaW5mby5wcm90bykgeworICAgICAgICBjYXNlIChMTENfVUkpOgorICAgICAgICBjYXNlIChMTENfVUk8PDgpOgorICAgICAgICAgICAgaXNvY2xuc19wcmludChwLCBsMmluZm8ubGVuZ3RoLCBsMmluZm8uY2FwbGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIChMTENfVUk8PDggfCBOTFBJRF9ROTMzKToKKyAgICAgICAgY2FzZSAoTExDX1VJPDw4IHwgTkxQSURfSVApOgorICAgICAgICBjYXNlIChMTENfVUk8PDggfCBOTFBJRF9JUDYpOgorICAgICAgICAgICAgLyogcGFzcyBJUHs0LDZ9IHRvIHRoZSBPU0kgbGF5ZXIgZm9yIHByb3BlciBsaW5rLWxheWVyIHByaW50aW5nICovCisgICAgICAgICAgICBpc29jbG5zX3ByaW50KHAtMSwgbDJpbmZvLmxlbmd0aCsxLCBsMmluZm8uY2FwbGVuKzEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoInVua25vd24gcHJvdG9jb2wgMHglMDR4LCBsZW5ndGggJXUiLGwyaW5mby5wcm90bywgbDJpbmZvLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Cit9CisjZW5kaWYKKworLyoKKyAqICAgICBBVE0xIFBJQyBjb29raWUgZm9ybWF0CisgKgorICogICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICAgfGZtdGlkfCAgICAgdmMgaW5kZXggICAgICAgICAgICB8ICBjaGFubmVsICBJRCAgICAgICAgICAgICAgICAgIHwKKyAqICAgICArLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICovCisKKyNpZmRlZiBETFRfSlVOSVBFUl9BVE0xCit1X2ludAoranVuaXBlcl9hdG0xX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQoreworICAgICAgICB1X2ludDE2X3QgZXh0cmFjdGVkX2V0aGVydHlwZTsKKworICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87CisKKyAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9BVE0xOworICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOworCisgICAgICAgIGlmIChsMmluZm8uY29va2llWzBdID09IDB4ODApIHsgLyogT0FNIGNlbGwgPyAqLworICAgICAgICAgICAgb2FtX3ByaW50KHAsbDJpbmZvLmxlbmd0aCxBVE1fT0FNX05PSEVDKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFWFRSQUNUXzI0QklUUyhwKSA9PSAweGZlZmUwMyB8fCAvKiBOTFBJRCBlbmNhcHMgPyAqLworICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocCkgPT0gMHhhYWFhMDMpIHsgLyogU05BUCBlbmNhcHMgPyAqLworCisgICAgICAgICAgICBpZiAobGxjX3ByaW50KHAsIGwyaW5mby5sZW5ndGgsIGwyaW5mby5jYXBsZW4sIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwWzBdID09IDB4MDMpIHsgLyogQ2lzY28gc3R5bGUgTkxQSUQgZW5jYXBzID8gKi8KKyAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCArIDEsIGwyaW5mby5sZW5ndGggLSAxLCBsMmluZm8uY2FwbGVuIC0gMSk7CisgICAgICAgICAgICAvKiBGSVhNRSBjaGVjayBpZiBmcmFtZSB3YXMgcmVjb2duaXplZCAqLworICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYoaXBfaGV1cmlzdGljX2d1ZXNzKHAsIGwyaW5mby5sZW5ndGgpICE9IDApIC8qIGxhc3QgdHJ5IC0gdmNtdXggZW5jYXBzID8gKi8KKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworCXJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisvKgorICogICAgIEFUTTIgUElDIGNvb2tpZSBmb3JtYXQKKyAqCisgKiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLSstLS0tLSstLS0tLS0tLS0tLSsKKyAqICAgICB8ICAgICBjaGFubmVsIElEICAgICAgICAgICAgICAgIHwgIHJlc2VydiB8QUFMfCBDQ1JRfCBnYXAgY250ICAgfAorICogICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0rLS0tLS0rLS0tLS0tLS0tLS0rCisgKi8KKworI2lmZGVmIERMVF9KVU5JUEVSX0FUTTIKK3VfaW50CitqdW5pcGVyX2F0bTJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisgICAgICAgIHVfaW50MTZfdCBleHRyYWN0ZWRfZXRoZXJ0eXBlOworCisgICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKKworICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0FUTTI7CisgICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgaWYgKGwyaW5mby5jb29raWVbN10gJiBBVE0yX1BLVF9UWVBFX01BU0spIHsgLyogT0FNIGNlbGwgPyAqLworICAgICAgICAgICAgb2FtX3ByaW50KHAsbDJpbmZvLmxlbmd0aCxBVE1fT0FNX05PSEVDKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFWFRSQUNUXzI0QklUUyhwKSA9PSAweGZlZmUwMyB8fCAvKiBOTFBJRCBlbmNhcHMgPyAqLworICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocCkgPT0gMHhhYWFhMDMpIHsgLyogU05BUCBlbmNhcHMgPyAqLworCisgICAgICAgICAgICBpZiAobGxjX3ByaW50KHAsIGwyaW5mby5sZW5ndGgsIGwyaW5mby5jYXBsZW4sIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsMmluZm8uZGlyZWN0aW9uICE9IEpVTklQRVJfQlBGX1BLVF9JTiAmJiAvKiBldGhlci1vdmVyLTE0ODMgZW5jYXBzID8gKi8KKyAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUyhsMmluZm8uY29va2llKSAmIEFUTTJfR0FQX0NPVU5UX01BU0spKSB7CisgICAgICAgICAgICBldGhlcl9wcmludChwLCBsMmluZm8ubGVuZ3RoLCBsMmluZm8uY2FwbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwWzBdID09IDB4MDMpIHsgLyogQ2lzY28gc3R5bGUgTkxQSUQgZW5jYXBzID8gKi8KKyAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCArIDEsIGwyaW5mby5sZW5ndGggLSAxLCBsMmluZm8uY2FwbGVuIC0gMSk7CisgICAgICAgICAgICAvKiBGSVhNRSBjaGVjayBpZiBmcmFtZSB3YXMgcmVjb2duaXplZCAqLworICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYoanVuaXBlcl9wcHBfaGV1cmlzdGljX2d1ZXNzKHAsIGwyaW5mby5sZW5ndGgpICE9IDApIC8qIFBQUG9BIHZjbXV4IGVuY2FwcyA/ICovCisgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47CisKKyAgICAgICAgaWYoaXBfaGV1cmlzdGljX2d1ZXNzKHAsIGwyaW5mby5sZW5ndGgpICE9IDApIC8qIGxhc3QgdHJ5IC0gdmNtdXggZW5jYXBzID8gKi8KKyAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKKworCXJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKK30KKyNlbmRpZgorCisKKy8qIHRyeSB0byBndWVzcywgYmFzZWQgb24gYWxsIFBQUCBwcm90b3MgdGhhdCBhcmUgc3VwcG9ydGVkIGluCisgKiBhIGp1bmlwZXIgcm91dGVyIGlmIHRoZSBwYXlsb2FkIGRhdGEgaXMgZW5jYXBzdWxhdGVkIHVzaW5nIFBQUCAqLworaW50CitqdW5pcGVyX3BwcF9oZXVyaXN0aWNfZ3Vlc3MocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpIHsKKworICAgIHN3aXRjaChFWFRSQUNUXzE2QklUUyhwKSkgeworICAgIGNhc2UgUFBQX0lQIDoKKyAgICBjYXNlIFBQUF9PU0kgOgorICAgIGNhc2UgUFBQX01QTFNfVUNBU1QgOgorICAgIGNhc2UgUFBQX01QTFNfTUNBU1QgOgorICAgIGNhc2UgUFBQX0lQQ1AgOgorICAgIGNhc2UgUFBQX09TSUNQIDoKKyAgICBjYXNlIFBQUF9NUExTQ1AgOgorICAgIGNhc2UgUFBQX0xDUCA6CisgICAgY2FzZSBQUFBfUEFQIDoKKyAgICBjYXNlIFBQUF9DSEFQIDoKKyAgICBjYXNlIFBQUF9NTCA6CisjaWZkZWYgSU5FVDYKKyAgICBjYXNlIFBQUF9JUFY2IDoKKyAgICBjYXNlIFBQUF9JUFY2Q1AgOgorI2VuZGlmCisgICAgICAgIHBwcF9wcmludChwLCBsZW5ndGgpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOyAvKiBkaWQgbm90IGZpbmQgYSBwcHAgaGVhZGVyICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsgLyogd2UgcHJpbnRlZCBhIHBwcCBwYWNrZXQgKi8KK30KKworaW50CitpcF9oZXVyaXN0aWNfZ3Vlc3MocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpIHsKKworICAgIHN3aXRjaChwWzBdKSB7CisgICAgY2FzZSAweDQ1OgorICAgIGNhc2UgMHg0NjoKKyAgICBjYXNlIDB4NDc6CisgICAgY2FzZSAweDQ4OgorICAgIGNhc2UgMHg0OToKKyAgICBjYXNlIDB4NGE6CisgICAgY2FzZSAweDRiOgorICAgIGNhc2UgMHg0YzoKKyAgICBjYXNlIDB4NGQ6CisgICAgY2FzZSAweDRlOgorICAgIGNhc2UgMHg0ZjoKKwkgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKKwkgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICBjYXNlIDB4NjA6CisgICAgY2FzZSAweDYxOgorICAgIGNhc2UgMHg2MjoKKyAgICBjYXNlIDB4NjM6CisgICAgY2FzZSAweDY0OgorICAgIGNhc2UgMHg2NToKKyAgICBjYXNlIDB4NjY6CisgICAgY2FzZSAweDY3OgorICAgIGNhc2UgMHg2ODoKKyAgICBjYXNlIDB4Njk6CisgICAgY2FzZSAweDZhOgorICAgIGNhc2UgMHg2YjoKKyAgICBjYXNlIDB4NmM6CisgICAgY2FzZSAweDZkOgorICAgIGNhc2UgMHg2ZToKKyAgICBjYXNlIDB4NmY6CisgICAgICAgIGlwNl9wcmludChwLCBsZW5ndGgpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOyAvKiBkaWQgbm90IGZpbmQgYSBpcCBoZWFkZXIgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOyAvKiB3ZSBwcmludGVkIGFuIHY0L3Y2IHBhY2tldCAqLworfQorCitzdGF0aWMgaW50CitqdW5pcGVyX3BhcnNlX2hlYWRlciAoY29uc3QgdV9jaGFyICpwLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190ICpsMmluZm8pIHsKKworICAgIHN0cnVjdCBqdW5pcGVyX2Nvb2tpZV90YWJsZV90ICpscCA9IGp1bmlwZXJfY29va2llX3RhYmxlOworICAgIHVfaW50IGlkeCwgb2Zmc2V0OworI2lmZGVmIERMVF9KVU5JUEVSX0FUTTIKKyAgICB1X2ludDMyX3QgY29udHJvbF93b3JkOworI2VuZGlmCisKKyAgICBsMmluZm8tPmhlYWRlcl9sZW4gPSAwOworICAgIGwyaW5mby0+Y29va2llX2xlbiA9IDA7CisgICAgbDJpbmZvLT5wcm90byA9IDA7CisKKworICAgIGwyaW5mby0+bGVuZ3RoID0gaC0+bGVuOworICAgIGwyaW5mby0+Y2FwbGVuID0gaC0+Y2FwbGVuOworICAgIGwyaW5mby0+ZGlyZWN0aW9uID0gcFszXSZKVU5JUEVSX0JQRl9QS1RfSU47CisgICAgCisgICAgVENIRUNLMihwWzBdLDQpOworICAgIGlmIChFWFRSQUNUXzI0QklUUyhwKSAhPSBKVU5JUEVSX01HQ19OVU1CRVIpIHsgLyogbWFnaWMgbnVtYmVyIGZvdW5kID8gKi8KKyAgICAgICAgcHJpbnRmKCJubyBtYWdpYy1udW1iZXIgZm91bmQhIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0gCisKKyAgICBpZiAoZWZsYWcpIC8qIHByaW50IGRpcmVjdGlvbiAqLworICAgICAgICBwcmludGYoIiUzcyAiLHRvazJzdHIoanVuaXBlcl9kaXJlY3Rpb25fdmFsdWVzLCItLS0iLGwyaW5mby0+ZGlyZWN0aW9uKSk7CisKKyAgICAvKiBleHRlbnNpb25zIHByZXNlbnQgPyAgLSBjYWxjdWxhdGUgaG93IG11Y2ggYnl0ZXMgdG8gc2tpcCAqLworICAgIGlmICgocFszXSAmIEpVTklQRVJfQlBGX0VYVCApID09IEpVTklQRVJfQlBGX0VYVCApIHsKKyAgICAgICAgb2Zmc2V0ID0gNiArIEVYVFJBQ1RfMTZCSVRTKHArNCk7CisgICAgICAgIGlmIChlZmxhZz4xKQorICAgICAgICAgICAgcHJpbnRmKCJleHQtbGVuICV1LCAiLEVYVFJBQ1RfMTZCSVRTKHArNCkpOworICAgIH0gZWxzZQorICAgICAgICBvZmZzZXQgPSA0OworCisgICAgaWYgKChwWzNdICYgSlVOSVBFUl9CUEZfTk9fTDIgKSA9PSBKVU5JUEVSX0JQRl9OT19MMiApIHsgICAgICAgICAgICAKKyAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgcHJpbnRmKCJuby1MMi1oZHIsICIpOworCisgICAgICAgIC8qIHRoZXJlIGlzIG5vIGxpbmstbGF5ZXIgcHJlc2VudCAtCisgICAgICAgICAqIHBlcmZvcm0gdGhlIHY0L3Y2IGhldXJpc3RpY3MKKyAgICAgICAgICogdG8gZmlndXJlIG91dCB3aGF0IGl0IGlzCisgICAgICAgICAqLworICAgICAgICBUQ0hFQ0syKHBbb2Zmc2V0KzRdLDEpOworICAgICAgICBpZihpcF9oZXVyaXN0aWNfZ3Vlc3MocCtvZmZzZXQrNCxsMmluZm8tPmxlbmd0aC0ob2Zmc2V0KzQpKSA9PSAwKQorICAgICAgICAgICAgcHJpbnRmKCJubyBJUC1oZHIgZm91bmQhIik7CisKKyAgICAgICAgbDJpbmZvLT5oZWFkZXJfbGVuPW9mZnNldCs0OworICAgICAgICByZXR1cm4gMDsgLyogc3RvcCBwYXJzaW5nIHRoZSBvdXRwdXQgZnVydGhlciAqLworICAgICAgICAKKyAgICB9CisgICAgbDJpbmZvLT5oZWFkZXJfbGVuID0gb2Zmc2V0OworICAgIHArPWwyaW5mby0+aGVhZGVyX2xlbjsKKyAgICBsMmluZm8tPmxlbmd0aCAtPSBsMmluZm8tPmhlYWRlcl9sZW47CisgICAgbDJpbmZvLT5jYXBsZW4gLT0gbDJpbmZvLT5oZWFkZXJfbGVuOworCisgICAgLyogc2VhcmNoIHRocm91Z2ggdGhlIGNvb2tpZSB0YWJsZSBhbmQgY29weSB2YWx1ZXMgbWF0Y2hpbmcgZm9yIG91ciBQSUMgdHlwZSAqLworICAgIHdoaWxlIChscC0+cyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChscC0+cGljdHlwZSA9PSBsMmluZm8tPnBpY3R5cGUpIHsKKworICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfbGVuICs9IGxwLT5jb29raWVfbGVuOworCisgICAgICAgICAgICBzd2l0Y2ggKHBbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgTFNfQ09PS0lFX0lEOgorICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llX3R5cGUgPSBMU19DT09LSUVfSUQ7CisgICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfbGVuICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFTX0NPT0tJRV9JRDoKKyAgICAgICAgICAgICAgICBsMmluZm8tPmNvb2tpZV90eXBlID0gQVNfQ09PS0lFX0lEOworICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llX2xlbiA9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbDJpbmZvLT5idW5kbGUgPSBsMmluZm8tPmNvb2tpZVswXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworCisjaWZkZWYgRExUX0pVTklQRVJfTUZSCisgICAgICAgICAgICAvKiBNRlIgY2hpbGQgbGlua3MgZG9uJ3QgY2FycnkgY29va2llcyAqLworICAgICAgICAgICAgaWYgKGwyaW5mby0+cGljdHlwZSA9PSBETFRfSlVOSVBFUl9NRlIgJiYKKyAgICAgICAgICAgICAgICAocFswXSAmIE1GUl9CRV9NQVNLKSA9PSBNRlJfQkVfTUFTSykgeworICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llX2xlbiA9IDA7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgbDJpbmZvLT5oZWFkZXJfbGVuICs9IGwyaW5mby0+Y29va2llX2xlbjsKKyAgICAgICAgICAgIGwyaW5mby0+bGVuZ3RoIC09IGwyaW5mby0+Y29va2llX2xlbjsKKyAgICAgICAgICAgIGwyaW5mby0+Y2FwbGVuIC09IGwyaW5mby0+Y29va2llX2xlbjsKKworICAgICAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiJXMtUElDLCBjb29raWUtbGVuICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgbHAtPnMsCisgICAgICAgICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llX2xlbik7CisKKyAgICAgICAgICAgIGlmIChsMmluZm8tPmNvb2tpZV9sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgVENIRUNLMihwWzBdLGwyaW5mby0+Y29va2llX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgY29va2llIDB4Iik7CisgICAgICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBsMmluZm8tPmNvb2tpZV9sZW47IGlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llW2lkeF0gPSBwW2lkeF07IC8qIGNvcHkgY29va2llIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVmbGFnKSBwcmludGYoIiUwMngiLHBbaWR4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZWZsYWcpIHByaW50ZigiOiAiKTsgLyogcHJpbnQgZGVtYXJjIGIvdyBMMi9MMyovCisgICAgICAgICAgICAKKworICAgICAgICAgICAgbDJpbmZvLT5wcm90byA9IEVYVFJBQ1RfMTZCSVRTKHArbDJpbmZvLT5jb29raWVfbGVuKTsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2xwOworICAgIH0KKyAgICBwKz1sMmluZm8tPmNvb2tpZV9sZW47CisKKyAgICAvKiBETFRfIHNwZWNpZmljIHBhcnNpbmcgKi8KKyAgICBzd2l0Y2gobDJpbmZvLT5waWN0eXBlKSB7CisjaWZkZWYgRExUX0pVTklQRVJfTUxQUFAKKyAgICBjYXNlIERMVF9KVU5JUEVSX01MUFBQOgorICAgICAgICBzd2l0Y2ggKGwyaW5mby0+Y29va2llX3R5cGUpIHsKKyAgICAgICAgY2FzZSBMU19DT09LSUVfSUQ6CisgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IGwyaW5mby0+Y29va2llWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNfQ09PS0lFX0lEOgorICAgICAgICAgICAgbDJpbmZvLT5idW5kbGUgPSAoRVhUUkFDVF8xNkJJVFMoJmwyaW5mby0+Y29va2llWzZdKT4+MykmMHhmZmY7CisgICAgICAgICAgICBsMmluZm8tPnByb3RvID0gKGwyaW5mby0+Y29va2llWzVdKSZKVU5JUEVSX0xTUV9MM19QUk9UT19NQVNLOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IGwyaW5mby0+Y29va2llWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NTEZSCisgICAgY2FzZSBETFRfSlVOSVBFUl9NTEZSOgorICAgICAgICBzd2l0Y2ggKGwyaW5mby0+Y29va2llX3R5cGUpIHsKKyAgICAgICAgY2FzZSBMU19DT09LSUVfSUQ6CisgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IGwyaW5mby0+Y29va2llWzFdOworICAgICAgICAgICAgbDJpbmZvLT5wcm90byA9IEVYVFJBQ1RfMTZCSVRTKHApOyAgICAgICAgCisgICAgICAgICAgICBsMmluZm8tPmhlYWRlcl9sZW4gKz0gMjsKKyAgICAgICAgICAgIGwyaW5mby0+bGVuZ3RoIC09IDI7CisgICAgICAgICAgICBsMmluZm8tPmNhcGxlbiAtPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVNfQ09PS0lFX0lEOgorICAgICAgICAgICAgbDJpbmZvLT5idW5kbGUgPSAoRVhUUkFDVF8xNkJJVFMoJmwyaW5mby0+Y29va2llWzZdKT4+MykmMHhmZmY7CisgICAgICAgICAgICBsMmluZm8tPnByb3RvID0gKGwyaW5mby0+Y29va2llWzVdKSZKVU5JUEVSX0xTUV9MM19QUk9UT19NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IGwyaW5mby0+Y29va2llWzBdOworICAgICAgICAgICAgbDJpbmZvLT5oZWFkZXJfbGVuICs9IDI7CisgICAgICAgICAgICBsMmluZm8tPmxlbmd0aCAtPSAyOworICAgICAgICAgICAgbDJpbmZvLT5jYXBsZW4gLT0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfTUZSCisgICAgY2FzZSBETFRfSlVOSVBFUl9NRlI6CisgICAgICAgIHN3aXRjaCAobDJpbmZvLT5jb29raWVfdHlwZSkgeworICAgICAgICBjYXNlIExTX0NPT0tJRV9JRDoKKyAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMV07CisgICAgICAgICAgICBsMmluZm8tPnByb3RvID0gRVhUUkFDVF8xNkJJVFMocCk7ICAgICAgICAKKyAgICAgICAgICAgIGwyaW5mby0+aGVhZGVyX2xlbiArPSAyOworICAgICAgICAgICAgbDJpbmZvLT5sZW5ndGggLT0gMjsKKyAgICAgICAgICAgIGwyaW5mby0+Y2FwbGVuIC09IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBU19DT09LSUVfSUQ6CisgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IChFWFRSQUNUXzE2QklUUygmbDJpbmZvLT5jb29raWVbNl0pPj4zKSYweGZmZjsKKyAgICAgICAgICAgIGwyaW5mby0+cHJvdG8gPSAobDJpbmZvLT5jb29raWVbNV0pJkpVTklQRVJfTFNRX0wzX1BST1RPX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0FUTTIKKyAgICBjYXNlIERMVF9KVU5JUEVSX0FUTTI6CisgICAgICAgIFRDSEVDSzIocFswXSw0KTsKKyAgICAgICAgLyogQVRNIGNlbGwgcmVsYXkgY29udHJvbCB3b3JkIHByZXNlbnQgPyAqLworICAgICAgICBpZiAobDJpbmZvLT5jb29raWVbN10gJiBBVE0yX1BLVF9UWVBFX01BU0spIHsKKyAgICAgICAgICAgIGNvbnRyb2xfd29yZCA9IEVYVFJBQ1RfMzJCSVRTKHApOworICAgICAgICAgICAgLyogc29tZSBjb250cm9sIHdvcmQgaGV1cmlzdGljcyAqLworICAgICAgICAgICAgc3dpdGNoKGNvbnRyb2xfd29yZCkgeworICAgICAgICAgICAgY2FzZSAwOiAvKiB6ZXJvIGNvbnRyb2wgd29yZCAqLworICAgICAgICAgICAgY2FzZSAweDA4MDAwMDAwOiAvKiA8IEpVTk9TIDcuNCBjb250cm9sLXdvcmQgKi8KKyAgICAgICAgICAgIGNhc2UgMHgwODM4MDAwMDogLyogY250bCB3b3JkIHBsdXMgY2VsbCBsZW5ndGggKDU2KSA+PSBKVU5PUyA3LjQqLworICAgICAgICAgICAgICAgIGwyaW5mby0+aGVhZGVyX2xlbiArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgICAgIHByaW50ZigiY29udHJvbC13b3JkIDB4JTA4eCAiLCBjb250cm9sX3dvcmQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfQVRNMQorICAgIGNhc2UgRExUX0pVTklQRVJfQVRNMToKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9QUFAKKyAgICBjYXNlIERMVF9KVU5JUEVSX1BQUDoKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9DSERMQworICAgIGNhc2UgRExUX0pVTklQRVJfQ0hETEM6CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfRVRIRVIKKyAgICBjYXNlIERMVF9KVU5JUEVSX0VUSEVSOgorICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0ZSRUxBWQorICAgIGNhc2UgRExUX0pVTklQRVJfRlJFTEFZOgorICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJVbmtub3duIEp1bmlwZXIgRExUXyB0eXBlICV1OiAiLCBsMmluZm8tPnBpY3R5cGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgaWYgKGVmbGFnID4gMSkKKyAgICAgICAgcHJpbnRmKCJobGVuICV1LCBwcm90byAweCUwNHgsICIsbDJpbmZvLT5oZWFkZXJfbGVuLGwyaW5mby0+cHJvdG8pOworCisgICAgcmV0dXJuIDE7IC8qIGV2ZXJ5dGhpbmcgd2VudCBvayBzbyBmYXIuIGNvbnRpbnVlIHBhcnNpbmcgKi8KKyB0cnVuYzoKKyAgICBwcmludGYoIlt8anVuaXBlcl9oZHJdLCBsZW5ndGggJXUiLGgtPmxlbik7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LWtyYi5jIGIvcHJpbnQta3JiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjOGUxNAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LWtyYi5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogSW5pdGlhbCBjb250cmlidXRpb24gZnJvbSBKb2huIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQta3JiLmMsdiAxLjIzIDIwMDMvMTEvMTYgMDk6MzY6MjYgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyBjb25zdCB1X2NoYXIgKmtyYjRfcHJpbnRfaGRyKGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIGtyYjRfcHJpbnQoY29uc3QgdV9jaGFyICopOworCisjZGVmaW5lIEFVVEhfTVNHX0tEQ19SRVFVRVNUCQkJMTw8MQorI2RlZmluZSBBVVRIX01TR19LRENfUkVQTFkJCQkyPDwxCisjZGVmaW5lIEFVVEhfTVNHX0FQUExfUkVRVUVTVAkJCTM8PDEKKyNkZWZpbmUgQVVUSF9NU0dfQVBQTF9SRVFVRVNUX01VVFVBTAkJNDw8MQorI2RlZmluZSBBVVRIX01TR19FUlJfUkVQTFkJCQk1PDwxCisjZGVmaW5lIEFVVEhfTVNHX1BSSVZBVEUJCQk2PDwxCisjZGVmaW5lIEFVVEhfTVNHX1NBRkUJCQkJNzw8MQorI2RlZmluZSBBVVRIX01TR19BUFBMX0VSUgkJCTg8PDEKKyNkZWZpbmUgQVVUSF9NU0dfRElFCQkJCTYzPDwxCisKKyNkZWZpbmUgS0VSQl9FUlJfT0sJCQkJMAorI2RlZmluZSBLRVJCX0VSUl9OQU1FX0VYUAkJCTEKKyNkZWZpbmUgS0VSQl9FUlJfU0VSVklDRV9FWFAJCQkyCisjZGVmaW5lIEtFUkJfRVJSX0FVVEhfRVhQCQkJMworI2RlZmluZSBLRVJCX0VSUl9QS1RfVkVSCQkJNAorI2RlZmluZSBLRVJCX0VSUl9OQU1FX01BU1RfS0VZX1ZFUgkJNQorI2RlZmluZSBLRVJCX0VSUl9TRVJWX01BU1RfS0VZX1ZFUgkJNgorI2RlZmluZSBLRVJCX0VSUl9CWVRFX09SREVSCQkJNworI2RlZmluZSBLRVJCX0VSUl9QUklOQ0lQQUxfVU5LTk9XTgkJOAorI2RlZmluZSBLRVJCX0VSUl9QUklOQ0lQQUxfTk9UX1VOSVFVRQkJOQorI2RlZmluZSBLRVJCX0VSUl9OVUxMX0tFWQkJCTEwCisKK3N0cnVjdCBrcmIgeworCXVfaW50OF90IHB2bm87CQkvKiBQcm90b2NvbCBWZXJzaW9uICovCisJdV9pbnQ4X3QgdHlwZTsJCS8qIFR5cGUrQiAqLworfTsKKworc3RhdGljIGNoYXIgdHN0cltdID0gIiBbfGtlcmJlcm9zXSI7CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7CisJeyBBVVRIX01TR19LRENfUkVRVUVTVCwJCSJLRENfUkVRVUVTVCIgfSwKKwl7IEFVVEhfTVNHX0tEQ19SRVBMWSwJCSJLRENfUkVQTFkiIH0sCisJeyBBVVRIX01TR19BUFBMX1JFUVVFU1QsCSJBUFBMX1JFUVVFU1QiIH0sCisJeyBBVVRIX01TR19BUFBMX1JFUVVFU1RfTVVUVUFMLAkiQVBQTF9SRVFVRVNUX01VVFVBTCIgfSwKKwl7IEFVVEhfTVNHX0VSUl9SRVBMWSwJCSJFUlJfUkVQTFkiIH0sCisJeyBBVVRIX01TR19QUklWQVRFLAkJIlBSSVZBVEUiIH0sCisJeyBBVVRIX01TR19TQUZFLAkJIlNBRkUiIH0sCisJeyBBVVRIX01TR19BUFBMX0VSUiwJCSJBUFBMX0VSUiIgfSwKKwl7IEFVVEhfTVNHX0RJRSwJCQkiRElFIiB9LAorCXsgMCwJCQkJTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBrZXJyMnN0cltdID0geworCXsgS0VSQl9FUlJfT0ssCQkJIk9LIiB9LAorCXsgS0VSQl9FUlJfTkFNRV9FWFAsCQkiTkFNRV9FWFAiIH0sCisJeyBLRVJCX0VSUl9TRVJWSUNFX0VYUCwJCSJTRVJWSUNFX0VYUCIgfSwKKwl7IEtFUkJfRVJSX0FVVEhfRVhQLAkJIkFVVEhfRVhQIiB9LAorCXsgS0VSQl9FUlJfUEtUX1ZFUiwJCSJQS1RfVkVSIiB9LAorCXsgS0VSQl9FUlJfTkFNRV9NQVNUX0tFWV9WRVIsCSJOQU1FX01BU1RfS0VZX1ZFUiIgfSwKKwl7IEtFUkJfRVJSX1NFUlZfTUFTVF9LRVlfVkVSLAkiU0VSVl9NQVNUX0tFWV9WRVIiIH0sCisJeyBLRVJCX0VSUl9CWVRFX09SREVSLAkJIkJZVEVfT1JERVIiIH0sCisJeyBLRVJCX0VSUl9QUklOQ0lQQUxfVU5LTk9XTiwJIlBSSU5DSVBBTF9VTktOT1dOIiB9LAorCXsgS0VSQl9FUlJfUFJJTkNJUEFMX05PVF9VTklRVUUsIlBSSU5DSVBBTF9OT1RfVU5JUVVFIiB9LAorCXsgS0VSQl9FUlJfTlVMTF9LRVksCQkiTlVMTF9LRVkifSwKKwl7IDAsCQkJCU5VTEx9Cit9OworCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK2NfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpzLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQoreworCXJlZ2lzdGVyIHVfY2hhciBjOworCXJlZ2lzdGVyIGludCBmbGFnOworCisJZmxhZyA9IDE7CisJd2hpbGUgKHMgPCBlcCkgeworCQljID0gKnMrKzsKKwkJaWYgKGMgPT0gJ1wwJykgeworCQkJZmxhZyA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWlzYXNjaWkoYykpIHsKKwkJCWMgPSB0b2FzY2lpKGMpOworCQkJcHV0Y2hhcignTScpOworCQkJcHV0Y2hhcignLScpOworCQl9CisJCWlmICghaXNwcmludChjKSkgeworCQkJYyBePSAweDQwOwkvKiBERUwgdG8gPywgb3RoZXJzIHRvIGFscGhhICovCisJCQlwdXRjaGFyKCdeJyk7CisJCX0KKwkJcHV0Y2hhcihjKTsKKwl9CisJaWYgKGZsYWcpCisJCXJldHVybiBOVUxMOworCXJldHVybiAocyk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgora3JiNF9wcmludF9oZHIoY29uc3QgdV9jaGFyICpjcCkKK3sKKwljcCArPSAyOworCisjZGVmaW5lIFBSSU5UCQlpZiAoKGNwID0gY19wcmludChjcCwgc25hcGVuZCkpID09IE5VTEwpIGdvdG8gdHJ1bmMKKworCVBSSU5UOworCXB1dGNoYXIoJy4nKTsKKwlQUklOVDsKKwlwdXRjaGFyKCdAJyk7CisJUFJJTlQ7CisJcmV0dXJuIChjcCk7CisKK3RydW5jOgorCWZwdXRzKHRzdHIsIHN0ZG91dCk7CisJcmV0dXJuIChOVUxMKTsKKworI3VuZGVmIFBSSU5UCit9CisKK3N0YXRpYyB2b2lkCitrcmI0X3ByaW50KGNvbnN0IHVfY2hhciAqY3ApCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGtyYiAqa3A7CisJdV9jaGFyIHR5cGU7CisJdV9zaG9ydCBsZW47CisKKyNkZWZpbmUgUFJJTlQJCWlmICgoY3AgPSBjX3ByaW50KGNwLCBzbmFwZW5kKSkgPT0gTlVMTCkgZ290byB0cnVuYworLyogIFRydWUgaWYgc3RydWN0IGtyYiBpcyBsaXR0bGUgZW5kaWFuICovCisjZGVmaW5lIElTX0xFTkRJQU4oa3ApCSgoKGtwKS0+dHlwZSAmIDB4MDEpICE9IDApCisjZGVmaW5lIEtUT0hTUChrcCwgY3ApCShJU19MRU5ESUFOKGtwKSA/IEVYVFJBQ1RfTEVfMTZCSVRTKGNwKSA6IEVYVFJBQ1RfMTZCSVRTKGNwKSkKKworCWtwID0gKHN0cnVjdCBrcmIgKiljcDsKKworCWlmICgoJmtwLT50eXBlKSA+PSBzbmFwZW5kKSB7CisJCWZwdXRzKHRzdHIsIHN0ZG91dCk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlID0ga3AtPnR5cGUgJiAoMHhGRiA8PCAxKTsKKworCXByaW50ZigiICVzICVzOiAiLAorCSAgICBJU19MRU5ESUFOKGtwKSA/ICJsZSIgOiAiYmUiLCB0b2syc3RyKHR5cGUyc3RyLCBOVUxMLCB0eXBlKSk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKworCWNhc2UgQVVUSF9NU0dfS0RDX1JFUVVFU1Q6CisJCWlmICgoY3AgPSBrcmI0X3ByaW50X2hkcihjcCkpID09IE5VTEwpCisJCQlyZXR1cm47CisJCWNwICs9IDQ7CS8qIGN0aW1lICovCisJCVRDSEVDSygqY3ApOworCQlwcmludGYoIiAlZG1pbiAiLCAqY3ArKyAqIDUpOworCQlQUklOVDsKKwkJcHV0Y2hhcignLicpOworCQlQUklOVDsKKwkJYnJlYWs7CisKKwljYXNlIEFVVEhfTVNHX0FQUExfUkVRVUVTVDoKKwkJY3AgKz0gMjsKKwkJVENIRUNLKCpjcCk7CisJCXByaW50ZigidiVkICIsICpjcCsrKTsKKwkJUFJJTlQ7CisJCVRDSEVDSygqY3ApOworCQlwcmludGYoIiAoJWQpIiwgKmNwKyspOworCQlUQ0hFQ0soKmNwKTsKKwkJcHJpbnRmKCIgKCVkKSIsICpjcCk7CisJCWJyZWFrOworCisJY2FzZSBBVVRIX01TR19LRENfUkVQTFk6CisJCWlmICgoY3AgPSBrcmI0X3ByaW50X2hkcihjcCkpID09IE5VTEwpCisJCQlyZXR1cm47CisJCWNwICs9IDEwOwkvKiB0aW1lc3RhbXAgKyBuICsgZXhwICsga3ZubyAqLworCQlUQ0hFQ0syKCpjcCwgc2l6ZW9mKHNob3J0KSk7CisJCWxlbiA9IEtUT0hTUChrcCwgY3ApOworCQlwcmludGYoIiAoJWQpIiwgbGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIEFVVEhfTVNHX0VSUl9SRVBMWToKKwkJaWYgKChjcCA9IGtyYjRfcHJpbnRfaGRyKGNwKSkgPT0gTlVMTCkKKwkJCXJldHVybjsKKwkJY3AgKz0gNDsgCSAgLyogdGltZXN0YW1wICovCisJCVRDSEVDSzIoKmNwLCBzaXplb2Yoc2hvcnQpKTsKKwkJcHJpbnRmKCIgJXMgIiwgdG9rMnN0cihrZXJyMnN0ciwgTlVMTCwgS1RPSFNQKGtwLCBjcCkpKTsKKwkJY3AgKz0gNDsKKwkJUFJJTlQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZnB1dHMoIih1bmtub3duKSIsIHN0ZG91dCk7CisJCWJyZWFrOworCX0KKworCXJldHVybjsKK3RydW5jOgorCWZwdXRzKHRzdHIsIHN0ZG91dCk7Cit9CisKK3ZvaWQKK2tyYl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qga3JiICprcDsKKworCWtwID0gKHN0cnVjdCBrcmIgKilkYXQ7CisKKwlpZiAoZGF0ID49IHNuYXBlbmQpIHsKKwkJZnB1dHModHN0ciwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoa3AtPnB2bm8pIHsKKworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCQlwcmludGYoIiB2JWQiLCBrcC0+cHZubyk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCQlwcmludGYoIiB2JWQiLCBrcC0+cHZubyk7CisJCWtyYjRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWtwKTsKKwkJYnJlYWs7CisKKwljYXNlIDEwNjoKKwljYXNlIDEwNzoKKwkJZnB1dHMoIiB2NSIsIHN0ZG91dCk7CisJCS8qIERlY29kZSBBU04uMSBoZXJlICJzb21lZGF5IiAqLworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtbDJ0cC5jIGIvcHJpbnQtbDJ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWFiNDMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1sMnRwLmMKQEAgLTAsMCArMSw3MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEwyVFAgc3VwcG9ydCBjb250cmlidXRlZCBieSBNb3Rvbm9yaSBTaGluZG8gKG1zaGluZG9AbXNoaW5kby5uZXQpCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbDJ0cC5jLHYgMS4xNy4yLjMgMjAwNi8wNi8yMyAwMjowNzoyNyBoYW5uZXMgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibDJ0cC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworc3RhdGljIGNoYXIgdHN0cltdID0gIiBbfGwydHBdIjsKKworI2RlZmluZQlMMlRQX01TR1RZUEVfU0NDUlEJMSAgLyogU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLVJlcXVlc3QgKi8KKyNkZWZpbmUJTDJUUF9NU0dUWVBFX1NDQ1JQCTIgIC8qIFN0YXJ0LUNvbnRyb2wtQ29ubmVjdGlvbi1SZXBseSAqLworI2RlZmluZQlMMlRQX01TR1RZUEVfU0NDQ04JMyAgLyogU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLUNvbm5lY3RlZCAqLworI2RlZmluZQlMMlRQX01TR1RZUEVfU1RPUENDTgk0ICAvKiBTdG9wLUNvbnRyb2wtQ29ubmVjdGlvbi1Ob3RpZmljYXRpb24gKi8KKyNkZWZpbmUJTDJUUF9NU0dUWVBFX0hFTExPCTYgIC8qIEhlbGxvICovCisjZGVmaW5lCUwyVFBfTVNHVFlQRV9PQ1JRCTcgIC8qIE91dGdvaW5nLUNhbGwtUmVxdWVzdCAqLworI2RlZmluZQlMMlRQX01TR1RZUEVfT0NSUAk4ICAvKiBPdXRnb2luZy1DYWxsLVJlcGx5ICovCisjZGVmaW5lCUwyVFBfTVNHVFlQRV9PQ0NOCTkgIC8qIE91dGdvaW5nLUNhbGwtQ29ubmVjdGVkICovCisjZGVmaW5lCUwyVFBfTVNHVFlQRV9JQ1JRCTEwIC8qIEluY29taW5nLUNhbGwtUmVxdWVzdCAqLworI2RlZmluZQlMMlRQX01TR1RZUEVfSUNSUAkxMSAvKiBJbmNvbWluZy1DYWxsLVJlcGx5ICovCisjZGVmaW5lCUwyVFBfTVNHVFlQRV9JQ0NOCTEyIC8qIEluY29taW5nLUNhbGwtQ29ubmVjdGVkICovCisjZGVmaW5lCUwyVFBfTVNHVFlQRV9DRE4JMTQgLyogQ2FsbC1EaXNjb25uZWN0LU5vdGlmeSAqLworI2RlZmluZQlMMlRQX01TR1RZUEVfV0VOCTE1IC8qIFdBTi1FcnJvci1Ob3RpZnkgKi8KKyNkZWZpbmUJTDJUUF9NU0dUWVBFX1NMSQkxNiAvKiBTZXQtTGluay1JbmZvICovCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGwydHBfbXNndHlwZTJzdHJbXSA9IHsKKwl7IEwyVFBfTVNHVFlQRV9TQ0NSUSwgCSJTQ0NSUSIgfSwKKwl7IEwyVFBfTVNHVFlQRV9TQ0NSUCwJIlNDQ1JQIiB9LAorCXsgTDJUUF9NU0dUWVBFX1NDQ0NOLAkiU0NDQ04iIH0sCisJeyBMMlRQX01TR1RZUEVfU1RPUENDTiwJIlN0b3BDQ04iIH0sCisJeyBMMlRQX01TR1RZUEVfSEVMTE8sCSJIRUxMTyIgfSwKKwl7IEwyVFBfTVNHVFlQRV9PQ1JRLAkiT0NSUSIgfSwKKwl7IEwyVFBfTVNHVFlQRV9PQ1JQLAkiT0NSUCIgfSwKKwl7IEwyVFBfTVNHVFlQRV9PQ0NOLAkiT0NDTiIgfSwKKwl7IEwyVFBfTVNHVFlQRV9JQ1JRLAkiSUNSUSIgfSwKKwl7IEwyVFBfTVNHVFlQRV9JQ1JQLAkiSUNSUCIgfSwKKwl7IEwyVFBfTVNHVFlQRV9JQ0NOLAkiSUNDTiIgfSwKKwl7IEwyVFBfTVNHVFlQRV9DRE4sCSJDRE4iIH0sCisJeyBMMlRQX01TR1RZUEVfV0VOLAkiV0VOIiB9LAorCXsgTDJUUF9NU0dUWVBFX1NMSSwJIlNMSSIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCisjZGVmaW5lIEwyVFBfQVZQX01TR1RZUEUJCTAgIC8qIE1lc3NhZ2UgVHlwZSAqLworI2RlZmluZSBMMlRQX0FWUF9SRVNVTFRfQ09ERQkJMSAgLyogUmVzdWx0IENvZGUgKi8KKyNkZWZpbmUgTDJUUF9BVlBfUFJPVE9fVkVSCQkyICAvKiBQcm90b2NvbCBWZXJzaW9uICovCisjZGVmaW5lIEwyVFBfQVZQX0ZSQU1JTkdfQ0FQCQkzICAvKiBGcmFtaW5nIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBMMlRQX0FWUF9CRUFSRVJfQ0FQCQk0ICAvKiBCZWFyZXIgQ2FwYWJpbGl0aWVzICovCisjZGVmaW5lIEwyVFBfQVZQX1RJRV9CUkVBS0VSCQk1ICAvKiBUaWUgQnJlYWtlciAqLworI2RlZmluZSBMMlRQX0FWUF9GSVJNX1ZFUgkJNiAgLyogRmlybXdhcmUgUmV2aXNpb24gKi8KKyNkZWZpbmUgTDJUUF9BVlBfSE9TVF9OQU1FCQk3ICAvKiBIb3N0IE5hbWUgKi8KKyNkZWZpbmUgTDJUUF9BVlBfVkVORE9SX05BTUUJCTggIC8qIFZlbmRvciBOYW1lICovCisjZGVmaW5lIEwyVFBfQVZQX0FTU05EX1RVTl9JRCAJCTkgIC8qIEFzc2lnbmVkIFR1bm5lbCBJRCAqLworI2RlZmluZSBMMlRQX0FWUF9SRUNWX1dJTl9TSVpFCQkxMCAvKiBSZWNlaXZlIFdpbmRvdyBTaXplICovCisjZGVmaW5lIEwyVFBfQVZQX0NIQUxMRU5HRQkJMTEgLyogQ2hhbGxlbmdlICovCisjZGVmaW5lIEwyVFBfQVZQX1E5MzFfQ0MJCTEyIC8qIFEuOTMxIENhdXNlIENvZGUgKi8KKyNkZWZpbmUgTDJUUF9BVlBfQ0hBTExFTkdFX1JFU1AJCTEzIC8qIENoYWxsZW5nZSBSZXNwb25zZSAqLworI2RlZmluZSBMMlRQX0FWUF9BU1NORF9TRVNTX0lEICAJMTQgLyogQXNzaWduZWQgU2Vzc2lvbiBJRCAqLworI2RlZmluZSBMMlRQX0FWUF9DQUxMX1NFUl9OVU0gCQkxNSAvKiBDYWxsIFNlcmlhbCBOdW1iZXIgKi8KKyNkZWZpbmUgTDJUUF9BVlBfTUlOSU1VTV9CUFMJCTE2IC8qIE1pbmltdW0gQlBTICovCisjZGVmaW5lIEwyVFBfQVZQX01BWElNVU1fQlBTCQkxNyAvKiBNYXhpbXVtIEJQUyAqLworI2RlZmluZSBMMlRQX0FWUF9CRUFSRVJfVFlQRQkJMTggLyogQmVhcmVyIFR5cGUgKi8KKyNkZWZpbmUgTDJUUF9BVlBfRlJBTUlOR19UWVBFIAkJMTkgLyogRnJhbWluZyBUeXBlICovCisjZGVmaW5lIEwyVFBfQVZQX1BBQ0tFVF9QUk9DX0RFTEFZCTIwIC8qIFBhY2tldCBQcm9jZXNzaW5nIERlbGF5IChPQlNPTEVURSkgKi8KKyNkZWZpbmUgTDJUUF9BVlBfQ0FMTEVEX05VTUJFUgkJMjEgLyogQ2FsbGVkIE51bWJlciAqLworI2RlZmluZSBMMlRQX0FWUF9DQUxMSU5HX05VTUJFUgkJMjIgLyogQ2FsbGluZyBOdW1iZXIgKi8KKyNkZWZpbmUgTDJUUF9BVlBfU1VCX0FERFJFU1MJCTIzIC8qIFN1Yi1BZGRyZXNzICovCisjZGVmaW5lIEwyVFBfQVZQX1RYX0NPTk5fU1BFRUQJCTI0IC8qIChUeCkgQ29ubmVjdCBTcGVlZCAqLworI2RlZmluZSBMMlRQX0FWUF9QSFlfQ0hBTk5FTF9JRAkJMjUgLyogUGh5c2ljYWwgQ2hhbm5lbCBJRCAqLworI2RlZmluZSBMMlRQX0FWUF9JTklfUkVDVl9MQ1AJCTI2IC8qIEluaXRpYWwgUmVjZWl2ZWQgTENQIENPTkZSRVEgKi8KKyNkZWZpbmUgTDJUUF9BVlBfTEFTVF9TRU5UX0xDUAkJMjcgLyogTGFzdCBTZW50IExDUCBDT05GUkVRICovCisjZGVmaW5lIEwyVFBfQVZQX0xBU1RfUkVDVl9MQ1AJCTI4IC8qIExhc3QgUmVjZWl2ZWQgTENQIENPTkZSRVEgKi8KKyNkZWZpbmUgTDJUUF9BVlBfUFJPWFlfQVVUSF9UWVBFCTI5IC8qIFByb3h5IEF1dGhlbiBUeXBlICovCisjZGVmaW5lIEwyVFBfQVZQX1BST1hZX0FVVEhfTkFNRQkzMCAvKiBQcm94eSBBdXRoZW4gTmFtZSAqLworI2RlZmluZSBMMlRQX0FWUF9QUk9YWV9BVVRIX0NIQUwJMzEgLyogUHJveHkgQXV0aGVuIENoYWxsZW5nZSAqLworI2RlZmluZSBMMlRQX0FWUF9QUk9YWV9BVVRIX0lECQkzMiAvKiBQcm94eSBBdXRoZW4gSUQgKi8KKyNkZWZpbmUgTDJUUF9BVlBfUFJPWFlfQVVUSF9SRVNQCTMzIC8qIFByb3h5IEF1dGhlbiBSZXNwb25zZSAqLworI2RlZmluZSBMMlRQX0FWUF9DQUxMX0VSUk9SUwkJMzQgLyogQ2FsbCBFcnJvcnMgKi8KKyNkZWZpbmUgTDJUUF9BVlBfQUNDTQkJCTM1IC8qIEFDQ00gKi8KKyNkZWZpbmUgTDJUUF9BVlBfUkFORE9NX1ZFQ1RPUgkJMzYgLyogUmFuZG9tIFZlY3RvciAqLworI2RlZmluZSBMMlRQX0FWUF9QUklWQVRFX0dSUF9JRAkJMzcgLyogUHJpdmF0ZSBHcm91cCBJRCAqLworI2RlZmluZSBMMlRQX0FWUF9SWF9DT05OX1NQRUVECQkzOCAvKiAoUngpIENvbm5lY3QgU3BlZWQgKi8KKyNkZWZpbmUgTDJUUF9BVlBfU0VRX1JFUVVJUkVEIAkJMzkgLyogU2VxdWVuY2luZyBSZXF1aXJlZCAqLworI2RlZmluZSBMMlRQX0FWUF9QUFBfRElTQ09OX0NDCQk0NiAvKiBQUFAgRGlzY29ubmVjdCBDYXVzZSBDb2RlICovCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGwydHBfYXZwMnN0cltdID0geworCXsgTDJUUF9BVlBfTVNHVFlQRSwJCSJNU0dUWVBFIiB9LAorCXsgTDJUUF9BVlBfUkVTVUxUX0NPREUsCQkiUkVTVUxUX0NPREUiIH0sCisJeyBMMlRQX0FWUF9QUk9UT19WRVIsCQkiUFJPVE9fVkVSIiB9LAorCXsgTDJUUF9BVlBfRlJBTUlOR19DQVAsCQkiRlJBTUlOR19DQVAiIH0sCisJeyBMMlRQX0FWUF9CRUFSRVJfQ0FQLAkJIkJFQVJFUl9DQVAiIH0sCisJeyBMMlRQX0FWUF9USUVfQlJFQUtFUiwJCSJUSUVfQlJFQUtFUiIgfSwKKwl7IEwyVFBfQVZQX0ZJUk1fVkVSLAkJIkZJUk1fVkVSIiB9LAorCXsgTDJUUF9BVlBfSE9TVF9OQU1FLAkJIkhPU1RfTkFNRSIgfSwKKwl7IEwyVFBfQVZQX1ZFTkRPUl9OQU1FLAkJIlZFTkRPUl9OQU1FIiB9LAorCXsgTDJUUF9BVlBfQVNTTkRfVFVOX0lELAkiQVNTTkRfVFVOX0lEIiB9LAorCXsgTDJUUF9BVlBfUkVDVl9XSU5fU0laRSwJIlJFQ1ZfV0lOX1NJWkUiIH0sCisJeyBMMlRQX0FWUF9DSEFMTEVOR0UsCQkiQ0hBTExFTkdFIiB9LAorCXsgTDJUUF9BVlBfUTkzMV9DQywJCSJROTMxX0NDIiwgfSwKKwl7IEwyVFBfQVZQX0NIQUxMRU5HRV9SRVNQLAkiQ0hBTExFTkdFX1JFU1AiIH0sCisJeyBMMlRQX0FWUF9BU1NORF9TRVNTX0lELAkiQVNTTkRfU0VTU19JRCIgfSwKKwl7IEwyVFBfQVZQX0NBTExfU0VSX05VTSwJIkNBTExfU0VSX05VTSIgfSwKKwl7IEwyVFBfQVZQX01JTklNVU1fQlBTLAkJIk1JTklNVU1fQlBTIiB9LAorCXsgTDJUUF9BVlBfTUFYSU1VTV9CUFMsCQkiTUFYSU1VTV9CUFMiIH0sCisJeyBMMlRQX0FWUF9CRUFSRVJfVFlQRSwJCSJCRUFSRVJfVFlQRSIgfSwKKwl7IEwyVFBfQVZQX0ZSQU1JTkdfVFlQRSwJIkZSQU1JTkdfVFlQRSIgfSwKKwl7IEwyVFBfQVZQX1BBQ0tFVF9QUk9DX0RFTEFZLAkiUEFDS0VUX1BST0NfREVMQVkiIH0sCisJeyBMMlRQX0FWUF9DQUxMRURfTlVNQkVSLAkiQ0FMTEVEX05VTUJFUiIgfSwKKwl7IEwyVFBfQVZQX0NBTExJTkdfTlVNQkVSLAkiQ0FMTElOR19OVU1CRVIiIH0sCisJeyBMMlRQX0FWUF9TVUJfQUREUkVTUywJCSJTVUJfQUREUkVTUyIgfSwKKwl7IEwyVFBfQVZQX1RYX0NPTk5fU1BFRUQsCSJUWF9DT05OX1NQRUVEIiB9LAorCXsgTDJUUF9BVlBfUEhZX0NIQU5ORUxfSUQsCSJQSFlfQ0hBTk5FTF9JRCIgfSwKKwl7IEwyVFBfQVZQX0lOSV9SRUNWX0xDUCwJIklOSV9SRUNWX0xDUCIgfSwKKwl7IEwyVFBfQVZQX0xBU1RfU0VOVF9MQ1AsCSJMQVNUX1NFTlRfTENQIiB9LAorCXsgTDJUUF9BVlBfTEFTVF9SRUNWX0xDUCwJIkxBU1RfUkVDVl9MQ1AiIH0sCisJeyBMMlRQX0FWUF9QUk9YWV9BVVRIX1RZUEUsCSJQUk9YWV9BVVRIX1RZUEUiIH0sCisJeyBMMlRQX0FWUF9QUk9YWV9BVVRIX05BTUUsCSJQUk9YWV9BVVRIX05BTUUiIH0sCisJeyBMMlRQX0FWUF9QUk9YWV9BVVRIX0NIQUwsCSJQUk9YWV9BVVRIX0NIQUwiIH0sCisJeyBMMlRQX0FWUF9QUk9YWV9BVVRIX0lELAkiUFJPWFlfQVVUSF9JRCIgfSwKKwl7IEwyVFBfQVZQX1BST1hZX0FVVEhfUkVTUCwJIlBST1hZX0FVVEhfUkVTUCIgfSwKKwl7IEwyVFBfQVZQX0NBTExfRVJST1JTLAkJIkNBTExfRVJST1JTIiB9LAorCXsgTDJUUF9BVlBfQUNDTSwJCSJBQ0NNIiB9LAorCXsgTDJUUF9BVlBfUkFORE9NX1ZFQ1RPUiwJIlJBTkRPTV9WRUNUT1IiIH0sCisJeyBMMlRQX0FWUF9QUklWQVRFX0dSUF9JRCwJIlBSSVZBVEVfR1JQX0lEIiB9LAorCXsgTDJUUF9BVlBfUlhfQ09OTl9TUEVFRCwJIlJYX0NPTk5fU1BFRUQiIH0sCisJeyBMMlRQX0FWUF9TRVFfUkVRVUlSRUQsCSJTRVFfUkVRVUlSRUQiIH0sCisJeyBMMlRQX0FWUF9QUFBfRElTQ09OX0NDLAkiUFBQX0RJU0NPTl9DQyIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgbDJ0cF9hdXRoZW50eXBlMnN0cltdID0geworCXsgTDJUUF9BVVRIRU5fVFlQRV9SRVNFUlZFRCwJIlJlc2VydmVkIiB9LAorCXsgTDJUUF9BVVRIRU5fVFlQRV9URVhUVUFMLAkiVGV4dHVhbCIgfSwKKwl7IEwyVFBfQVVUSEVOX1RZUEVfQ0hBUCwJIkNIQVAiIH0sCisJeyBMMlRQX0FVVEhFTl9UWVBFX1BBUCwJCSJQQVAiIH0sCisJeyBMMlRQX0FVVEhFTl9UWVBFX05PX0FVVEgsCSJObyBBdXRoIiB9LAorCXsgTDJUUF9BVVRIRU5fVFlQRV9NU0NIQVB2MSwJIk1TLUNIQVB2MSIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworI2RlZmluZSBMMlRQX1BQUF9ESVNDT05fQ0NfRElSRUNUSU9OX0dMT0JBTAkwCisjZGVmaW5lIEwyVFBfUFBQX0RJU0NPTl9DQ19ESVJFQ1RJT05fQVRfUEVFUgkxCisjZGVmaW5lIEwyVFBfUFBQX0RJU0NPTl9DQ19ESVJFQ1RJT05fQVRfTE9DQUwJMgorCitzdGF0aWMgc3RydWN0IHRvayBsMnRwX2NjX2RpcmVjdGlvbjJzdHJbXSA9IHsKKwl7IEwyVFBfUFBQX0RJU0NPTl9DQ19ESVJFQ1RJT05fR0xPQkFMLAkiZ2xvYmFsIGVycm9yIiB9LAorCXsgTDJUUF9QUFBfRElTQ09OX0NDX0RJUkVDVElPTl9BVF9QRUVSLAkiYXQgcGVlciIgfSwKKwl7IEwyVFBfUFBQX0RJU0NPTl9DQ19ESVJFQ1RJT05fQVRfTE9DQUwsImF0IGxvY2FsIiB9LAorCXsgMCwJCQkJCU5VTEwgfQorfTsKKworI2lmIDAKK3N0YXRpYyBjaGFyICpsMnRwX3Jlc3VsdF9jb2RlX1N0b3BDQ05bXSA9IHsKKyAgICAgICAgICJSZXNlcnZlZCIsCisgICAgICAgICAiR2VuZXJhbCByZXF1ZXN0IHRvIGNsZWFyIGNvbnRyb2wgY29ubmVjdGlvbiIsCisgICAgICAgICAiR2VuZXJhbCBlcnJvci0tRXJyb3IgQ29kZSBpbmRpY2F0ZXMgdGhlIHByb2JsZW0iLAorICAgICAgICAgIkNvbnRyb2wgY2hhbm5lbCBhbHJlYWR5IGV4aXN0cyIsCisgICAgICAgICAiUmVxdWVzdGVyIGlzIG5vdCBhdXRob3JpemVkIHRvIGVzdGFibGlzaCBhIGNvbnRyb2wgY2hhbm5lbCIsCisgICAgICAgICAiVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3RlciBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICJSZXF1ZXN0ZXIgaXMgYmVpbmcgc2h1dCBkb3duIiwKKyAgICAgICAgICJGaW5pdGUgU3RhdGUgTWFjaGluZSBlcnJvciIKKyNkZWZpbmUgTDJUUF9NQVhfUkVTVUxUX0NPREVfU1RPUENDX0lOREVYCTgKK307CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBjaGFyICpsMnRwX3Jlc3VsdF9jb2RlX0NETltdID0geworCSJSZXNlcnZlZCIsCisJIkNhbGwgZGlzY29ubmVjdGVkIGR1ZSB0byBsb3NzIG9mIGNhcnJpZXIiLAorCSJDYWxsIGRpc2Nvbm5lY3RlZCBmb3IgdGhlIHJlYXNvbiBpbmRpY2F0ZWQgaW4gZXJyb3IgY29kZSIsCisJIkNhbGwgZGlzY29ubmVjdGVkIGZvciBhZG1pbmlzdHJhdGl2ZSByZWFzb25zIiwKKwkiQ2FsbCBmYWlsZWQgZHVlIHRvIGxhY2sgb2YgYXBwcm9wcmlhdGUgZmFjaWxpdGllcyBiZWluZyAiIFwKKwkiYXZhaWxhYmxlICh0ZW1wb3JhcnkgY29uZGl0aW9uKSIsCisJIkNhbGwgZmFpbGVkIGR1ZSB0byBsYWNrIG9mIGFwcHJvcHJpYXRlIGZhY2lsaXRpZXMgYmVpbmcgIiBcCisJImF2YWlsYWJsZSAocGVybWFuZW50IGNvbmRpdGlvbikiLAorCSJJbnZhbGlkIGRlc3RpbmF0aW9uIiwKKwkiQ2FsbCBmYWlsZWQgZHVlIHRvIG5vIGNhcnJpZXIgZGV0ZWN0ZWQiLAorCSJDYWxsIGZhaWxlZCBkdWUgdG8gZGV0ZWN0aW9uIG9mIGEgYnVzeSBzaWduYWwiLAorCSJDYWxsIGZhaWxlZCBkdWUgdG8gbGFjayBvZiBhIGRpYWwgdG9uZSIsCisJIkNhbGwgd2FzIG5vdCBlc3RhYmxpc2hlZCB3aXRoaW4gdGltZSBhbGxvdHRlZCBieSBMQUMiLAorCSJDYWxsIHdhcyBjb25uZWN0ZWQgYnV0IG5vIGFwcHJvcHJpYXRlIGZyYW1pbmcgd2FzIGRldGVjdGVkIgorI2RlZmluZSBMMlRQX01BWF9SRVNVTFRfQ09ERV9DRE5fSU5ERVgJMTIKK307CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBjaGFyICpsMnRwX2Vycm9yX2NvZGVfZ2VuZXJhbFtdID0geworCSJObyBnZW5lcmFsIGVycm9yIiwKKwkiTm8gY29udHJvbCBjb25uZWN0aW9uIGV4aXN0cyB5ZXQgZm9yIHRoaXMgTEFDLUxOUyBwYWlyIiwKKwkiTGVuZ3RoIGlzIHdyb25nIiwKKwkiT25lIG9mIHRoZSBmaWVsZCB2YWx1ZXMgd2FzIG91dCBvZiByYW5nZSBvciAiIFwKKwkicmVzZXJ2ZWQgZmllbGQgd2FzIG5vbi16ZXJvIgorCSJJbnN1ZmZpY2llbnQgcmVzb3VyY2VzIHRvIGhhbmRsZSB0aGlzIG9wZXJhdGlvbiBub3ciLAorCSJUaGUgU2Vzc2lvbiBJRCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dCIsCisJIkEgZ2VuZXJpYyB2ZW5kb3Itc3BlY2lmaWMgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIExBQyIsCisJIlRyeSBhbm90aGVyIgorI2RlZmluZSBMMlRQX01BWF9FUlJPUl9DT0RFX0dFTkVSQUxfSU5ERVgJOAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZ2VuZXJpYyBwcmludCBvdXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcHJpbnRfc3RyaW5nKGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCit7CisJdV9pbnQgaTsKKwlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQlwcmludGYoIiVjIiwgKmRhdCsrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9vY3RldHMoY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludCBpOworCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrKSB7CisJCXByaW50ZigiJTAyeCIsICpkYXQrKyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfMTZiaXRzX3ZhbChjb25zdCB1X2ludDE2X3QgKmRhdCkKK3sKKwlwcmludGYoIiV1IiwgRVhUUkFDVF8xNkJJVFMoZGF0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF8zMmJpdHNfdmFsKGNvbnN0IHVfaW50MzJfdCAqZGF0KQoreworCXByaW50ZigiJWx1IiwgKHVfbG9uZylFWFRSQUNUXzMyQklUUyhkYXQpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQVZQLXNwZWNpZmljIHByaW50IG91dCByb3V0aW5lcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2wydHBfbXNndHlwZV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwl1X2ludDE2X3QgKnB0ciA9ICh1X2ludDE2X3QqKWRhdDsKKworCXByaW50ZigiJXMiLCB0b2syc3RyKGwydHBfbXNndHlwZTJzdHIsICJNU0dUWVBFLSMldSIsCisJICAgIEVYVFJBQ1RfMTZCSVRTKHB0cikpKTsKK30KKworc3RhdGljIHZvaWQKK2wydHBfcmVzdWx0X2NvZGVfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKK3sKKwl1X2ludDE2X3QgKnB0ciA9ICh1X2ludDE2X3QgKilkYXQ7CisKKwlwcmludGYoIiV1IiwgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOwkvKiBSZXN1bHQgQ29kZSAqLworCWlmIChsZW5ndGggPiAyKSB7CQkJCS8qIEVycm9yIENvZGUgKG9wdCkgKi8KKwkgICAgICAgIHByaW50ZigiLyV1IiwgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOworCX0KKwlpZiAobGVuZ3RoID4gNCkgewkJCQkvKiBFcnJvciBNZXNzYWdlIChvcHQpICovCisJCXByaW50ZigiICIpOworCQlwcmludF9zdHJpbmcoKHVfY2hhciAqKXB0ciwgbGVuZ3RoIC0gNCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbDJ0cF9wcm90b192ZXJfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpkYXQpCit7CisJcHJpbnRmKCIldS4ldSIsIChFWFRSQUNUXzE2QklUUyhkYXQpID4+IDgpLAorCSAgICAoRVhUUkFDVF8xNkJJVFMoZGF0KSAmIDB4ZmYpKTsKK30KKworc3RhdGljIHZvaWQKK2wydHBfZnJhbWluZ19jYXBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJdV9pbnQzMl90ICpwdHIgPSAodV9pbnQzMl90ICopZGF0OworCisJaWYgKEVYVFJBQ1RfMzJCSVRTKHB0cikgJiAgTDJUUF9GUkFNSU5HX0NBUF9BU1lOQ19NQVNLKSB7CisJCXByaW50ZigiQSIpOworCX0KKwlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0ZSQU1JTkdfQ0FQX1NZTkNfTUFTSykgeworCQlwcmludGYoIlMiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitsMnRwX2JlYXJlcl9jYXBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJdV9pbnQzMl90ICpwdHIgPSAodV9pbnQzMl90ICopZGF0OworCisJaWYgKEVYVFJBQ1RfMzJCSVRTKHB0cikgJiAgTDJUUF9CRUFSRVJfQ0FQX0FOQUxPR19NQVNLKSB7CisJCXByaW50ZigiQSIpOworCX0KKwlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0JFQVJFUl9DQVBfRElHSVRBTF9NQVNLKSB7CisJCXByaW50ZigiRCIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2wydHBfcTkzMV9jY19wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQoreworCXByaW50XzE2Yml0c192YWwoKHVfaW50MTZfdCAqKWRhdCk7CisJcHJpbnRmKCIsICUwMngiLCBkYXRbMl0pOworCWlmIChsZW5ndGggPiAzKSB7CisJCXByaW50ZigiICIpOworCQlwcmludF9zdHJpbmcoZGF0KzMsIGxlbmd0aC0zKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitsMnRwX2JlYXJlcl90eXBlX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXVfaW50MzJfdCAqcHRyID0gKHVfaW50MzJfdCAqKWRhdDsKKworCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfQkVBUkVSX1RZUEVfQU5BTE9HX01BU0spIHsKKwkJcHJpbnRmKCJBIik7CisJfQorCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfQkVBUkVSX1RZUEVfRElHSVRBTF9NQVNLKSB7CisJCXByaW50ZigiRCIpOworCX0KK30KKworc3RhdGljIHZvaWQKK2wydHBfZnJhbWluZ190eXBlX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXVfaW50MzJfdCAqcHRyID0gKHVfaW50MzJfdCAqKWRhdDsKKworCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfRlJBTUlOR19UWVBFX0FTWU5DX01BU0spIHsKKwkJcHJpbnRmKCJBIik7CisJfQorCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfRlJBTUlOR19UWVBFX1NZTkNfTUFTSykgeworCQlwcmludGYoIlMiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitsMnRwX3BhY2tldF9wcm9jX2RlbGF5X3ByaW50KHZvaWQpCit7CisJcHJpbnRmKCJvYnNvbGV0ZSIpOworfQorCitzdGF0aWMgdm9pZAorbDJ0cF9wcm94eV9hdXRoX3R5cGVfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OworCisJcHJpbnRmKCIlcyIsIHRvazJzdHIobDJ0cF9hdXRoZW50eXBlMnN0ciwKKwkJCSAgICAgIkF1dGhUeXBlLSMldSIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpKTsKK30KKworc3RhdGljIHZvaWQKK2wydHBfcHJveHlfYXV0aF9pZF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwl1X2ludDE2X3QgKnB0ciA9ICh1X2ludDE2X3QgKilkYXQ7CisKKwlwcmludGYoIiV1IiwgRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfUFJPWFlfQVVUSF9JRF9NQVNLKTsKK30KKworc3RhdGljIHZvaWQKK2wydHBfY2FsbF9lcnJvcnNfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OworCXVfaW50MTZfdCB2YWxfaCwgdmFsX2w7CisKKwlwdHIrKzsJCS8qIHNraXAgIlJlc2VydmVkIiAqLworCisJdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXByaW50ZigiQ1JDRXJyPSV1ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOworCisJdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXByaW50ZigiRnJhbWVFcnI9JXUgIiwgKHZhbF9oPDwxNikgKyB2YWxfbCk7CisKKwl2YWxfaCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXZhbF9sID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7CisJcHJpbnRmKCJIYXJkT3Zlcj0ldSAiLCAodmFsX2g8PDE2KSArIHZhbF9sKTsKKworCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7CisJdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwlwcmludGYoIkJ1Zk92ZXI9JXUgIiwgKHZhbF9oPDwxNikgKyB2YWxfbCk7CisKKwl2YWxfaCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXZhbF9sID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7CisJcHJpbnRmKCJUaW1lb3V0PSV1ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOworCisJdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXByaW50ZigiQWxpZ25FcnI9JXUgIiwgKHZhbF9oPDwxNikgKyB2YWxfbCk7Cit9CisKK3N0YXRpYyB2b2lkCitsMnRwX2FjY21fcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OworCXVfaW50MTZfdCB2YWxfaCwgdmFsX2w7CisKKwlwdHIrKzsJCS8qIHNraXAgIlJlc2VydmVkIiAqLworCisJdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXByaW50Zigic2VuZD0lMDh4ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOworCisJdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOworCXByaW50ZigicmVjdj0lMDh4ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOworfQorCitzdGF0aWMgdm9pZAorbDJ0cF9wcHBfZGlzY29uX2NjX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCit7CisJdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OworCisJcHJpbnRmKCIlMDR4LCAiLCBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7CS8qIERpc2Nvbm5lY3QgQ29kZSAqLworCXByaW50ZigiJTA0eCAiLCAgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOwkvKiBDb250cm9sIFByb3RvY29sIE51bWJlciAqLworCXByaW50ZigiJXMiLCB0b2syc3RyKGwydHBfY2NfZGlyZWN0aW9uMnN0ciwKKwkJCSAgICAgIkRpcmVjdGlvbi0jJXUiLCAqKCh1X2NoYXIgKilwdHIrKykpKTsKKworCWlmIChsZW5ndGggPiA1KSB7CisJCXByaW50ZigiICIpOworCQlwcmludF9zdHJpbmcoKGNvbnN0IHVfY2hhciAqKXB0ciwgbGVuZ3RoLTUpOworCX0KK30KKworc3RhdGljIHZvaWQKK2wydHBfYXZwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCBpbnQgbGVuZ3RoKQoreworCXVfaW50IGxlbjsKKwljb25zdCB1X2ludDE2X3QgKnB0ciA9ICh1X2ludDE2X3QgKilkYXQ7CisJdV9pbnQxNl90IGF0dHJfdHlwZTsKKwlpbnQgaGlkZGVuID0gRkFMU0U7CisKKwlpZiAobGVuZ3RoIDw9IDApIHsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiICIpOworCisJVENIRUNLKCpwdHIpOwkvKiBGbGFncyAmIExlbmd0aCAqLworCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX0FWUF9IRFJfTEVOX01BU0s7CisKKwkvKiBJZiBpdCBpcyBub3QgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgaGVhZGVyLCB3ZSdsbCBnaXZlIHVwLiAqLworCWlmIChsZW4gPCA2KQorCQlnb3RvIHRydW5jOworCisJLyogSWYgaXQgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIHBhY2tldCwKKwkgICB3ZSdsbCBnaXZlIHVwLiAqLworCWlmIChsZW4gPiAodV9pbnQpbGVuZ3RoKQorCQlnb3RvIHRydW5jOworCisJLyogSWYgaXQgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIHJlbWFpbmluZyBsZW5ndGggb2YgdGhlIGNhcHR1cmVkCisJICAgZGF0YSwgd2UnbGwgZ2l2ZSB1cC4gKi8KKwlUQ0hFQ0syKCpwdHIsIGxlbik7CisJLyogQWZ0ZXIgdGhpcyBwb2ludCwgbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0cnVuY2F0aW9uICovCisKKwlpZiAoRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfQVZQX0hEUl9GTEFHX01BTkRBVE9SWSkgeworCQlwcmludGYoIioiKTsKKwl9CisJaWYgKEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX0FWUF9IRFJfRkxBR19ISURERU4pIHsKKwkJaGlkZGVuID0gVFJVRTsKKwkJcHJpbnRmKCI/Iik7CisJfQorCXB0cisrOworCisJaWYgKEVYVFJBQ1RfMTZCSVRTKHB0cikpIHsKKwkJLyogVmVuZG9yIFNwZWNpZmljIEF0dHJpYnV0ZSAqLworCSAgICAgICAgcHJpbnRmKCJWRU5ET1IlMDR4OiIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsKKwkJcHJpbnRmKCJBVFRSJTA0eCIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsKKwkJcHJpbnRmKCIoIik7CisJCXByaW50X29jdGV0cygodV9jaGFyICopcHRyLCBsZW4tNik7CisJCXByaW50ZigiKSIpOworCX0gZWxzZSB7CisJCS8qIElFVEYtZGVmaW5lZCBBdHRyaWJ1dGVzICovCisJCXB0cisrOworCQlhdHRyX3R5cGUgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKKwkJcHJpbnRmKCIlcyIsIHRvazJzdHIobDJ0cF9hdnAyc3RyLCAiQVZQLSMldSIsIGF0dHJfdHlwZSkpOworCQlwcmludGYoIigiKTsKKwkJaWYgKGhpZGRlbikgeworCQkJcHJpbnRmKCI/Pz8iKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoYXR0cl90eXBlKSB7CisJCQljYXNlIEwyVFBfQVZQX01TR1RZUEU6CisJCQkJbDJ0cF9tc2d0eXBlX3ByaW50KCh1X2NoYXIgKilwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9SRVNVTFRfQ09ERToKKwkJCQlsMnRwX3Jlc3VsdF9jb2RlX3ByaW50KCh1X2NoYXIgKilwdHIsIGxlbi02KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfUFJPVE9fVkVSOgorCQkJCWwydHBfcHJvdG9fdmVyX3ByaW50KHB0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX0ZSQU1JTkdfQ0FQOgorCQkJCWwydHBfZnJhbWluZ19jYXBfcHJpbnQoKHVfY2hhciAqKXB0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX0JFQVJFUl9DQVA6CisJCQkJbDJ0cF9iZWFyZXJfY2FwX3ByaW50KCh1X2NoYXIgKilwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9USUVfQlJFQUtFUjoKKwkJCQlwcmludF9vY3RldHMoKHVfY2hhciAqKXB0ciwgOCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX0ZJUk1fVkVSOgorCQkJY2FzZSBMMlRQX0FWUF9BU1NORF9UVU5fSUQ6CisJCQljYXNlIEwyVFBfQVZQX1JFQ1ZfV0lOX1NJWkU6CisJCQljYXNlIEwyVFBfQVZQX0FTU05EX1NFU1NfSUQ6CisJCQkJcHJpbnRfMTZiaXRzX3ZhbChwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9IT1NUX05BTUU6CisJCQljYXNlIEwyVFBfQVZQX1ZFTkRPUl9OQU1FOgorCQkJY2FzZSBMMlRQX0FWUF9DQUxMSU5HX05VTUJFUjoKKwkJCWNhc2UgTDJUUF9BVlBfQ0FMTEVEX05VTUJFUjoKKwkJCWNhc2UgTDJUUF9BVlBfU1VCX0FERFJFU1M6CisJCQljYXNlIEwyVFBfQVZQX1BST1hZX0FVVEhfTkFNRToKKwkJCWNhc2UgTDJUUF9BVlBfUFJJVkFURV9HUlBfSUQ6CisJCQkJcHJpbnRfc3RyaW5nKCh1X2NoYXIgKilwdHIsIGxlbi02KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfQ0hBTExFTkdFOgorCQkJY2FzZSBMMlRQX0FWUF9JTklfUkVDVl9MQ1A6CisJCQljYXNlIEwyVFBfQVZQX0xBU1RfU0VOVF9MQ1A6CisJCQljYXNlIEwyVFBfQVZQX0xBU1RfUkVDVl9MQ1A6CisJCQljYXNlIEwyVFBfQVZQX1BST1hZX0FVVEhfQ0hBTDoKKwkJCWNhc2UgTDJUUF9BVlBfUFJPWFlfQVVUSF9SRVNQOgorCQkJY2FzZSBMMlRQX0FWUF9SQU5ET01fVkVDVE9SOgorCQkJCXByaW50X29jdGV0cygodV9jaGFyICopcHRyLCBsZW4tNik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX1E5MzFfQ0M6CisJCQkJbDJ0cF9xOTMxX2NjX3ByaW50KCh1X2NoYXIgKilwdHIsIGxlbi02KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfQ0hBTExFTkdFX1JFU1A6CisJCQkJcHJpbnRfb2N0ZXRzKCh1X2NoYXIgKilwdHIsIDE2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfQ0FMTF9TRVJfTlVNOgorCQkJY2FzZSBMMlRQX0FWUF9NSU5JTVVNX0JQUzoKKwkJCWNhc2UgTDJUUF9BVlBfTUFYSU1VTV9CUFM6CisJCQljYXNlIEwyVFBfQVZQX1RYX0NPTk5fU1BFRUQ6CisJCQljYXNlIEwyVFBfQVZQX1BIWV9DSEFOTkVMX0lEOgorCQkJY2FzZSBMMlRQX0FWUF9SWF9DT05OX1NQRUVEOgorCQkJCXByaW50XzMyYml0c192YWwoKHVfaW50MzJfdCAqKXB0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX0JFQVJFUl9UWVBFOgorCQkJCWwydHBfYmVhcmVyX3R5cGVfcHJpbnQoKHVfY2hhciAqKXB0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX0ZSQU1JTkdfVFlQRToKKwkJCQlsMnRwX2ZyYW1pbmdfdHlwZV9wcmludCgodV9jaGFyICopcHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfUEFDS0VUX1BST0NfREVMQVk6CisJCQkJbDJ0cF9wYWNrZXRfcHJvY19kZWxheV9wcmludCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9QUk9YWV9BVVRIX1RZUEU6CisJCQkJbDJ0cF9wcm94eV9hdXRoX3R5cGVfcHJpbnQoKHVfY2hhciAqKXB0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIEwyVFBfQVZQX1BST1hZX0FVVEhfSUQ6CisJCQkJbDJ0cF9wcm94eV9hdXRoX2lkX3ByaW50KCh1X2NoYXIgKilwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9DQUxMX0VSUk9SUzoKKwkJCQlsMnRwX2NhbGxfZXJyb3JzX3ByaW50KCh1X2NoYXIgKilwdHIpOworCQkJCWJyZWFrOworCQkJY2FzZSBMMlRQX0FWUF9BQ0NNOgorCQkJCWwydHBfYWNjbV9wcmludCgodV9jaGFyICopcHRyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTDJUUF9BVlBfU0VRX1JFUVVJUkVEOgorCQkJCWJyZWFrOwkvKiBObyBBdHRyaWJ1dGUgVmFsdWUgKi8KKwkJCWNhc2UgTDJUUF9BVlBfUFBQX0RJU0NPTl9DQzoKKwkJCQlsMnRwX3BwcF9kaXNjb25fY2NfcHJpbnQoKHVfY2hhciAqKXB0ciwgbGVuLTYpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcmludGYoIikiKTsKKwl9CisKKwlsMnRwX2F2cF9wcmludChkYXQrbGVuLCBsZW5ndGgtbGVuKTsKKwlyZXR1cm47CisKKyB0cnVuYzoKKwlwcmludGYoInwuLi4iKTsKK30KKworCit2b2lkCitsMnRwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCit7CisJY29uc3QgdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OworCXVfaW50IGNudCA9IDA7CQkJLyogdG90YWwgb2N0ZXRzIGNvbnN1bWVkICovCisJdV9pbnQxNl90IHBhZDsKKwlpbnQgZmxhZ190LCBmbGFnX2wsIGZsYWdfcywgZmxhZ19vOworCXVfaW50MTZfdCBsMnRwX2xlbjsKKworCWZsYWdfdCA9IGZsYWdfbCA9IGZsYWdfcyA9IGZsYWdfbyA9IEZBTFNFOworCisJVENIRUNLKCpwdHIpOwkvKiBGbGFncyAmIFZlcnNpb24gKi8KKwlpZiAoKEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX1ZFUlNJT05fTUFTSykgPT0gTDJUUF9WRVJTSU9OX0wyVFApIHsKKwkJcHJpbnRmKCIgbDJ0cDoiKTsKKwl9IGVsc2UgaWYgKChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9WRVJTSU9OX01BU0spID09IEwyVFBfVkVSU0lPTl9MMkYpIHsKKwkJcHJpbnRmKCIgbDJmOiIpOworCQlyZXR1cm47CQkvKiBub3RoaW5nIHRvIGRvICovCisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgVW5rbm93biBWZXJzaW9uLCBuZWl0aGVyIEwyRigxKSBub3IgTDJUUCgyKSIpOworCQlyZXR1cm47CQkvKiBub3RoaW5nIHdlIGNhbiBkbyAqLworCX0KKworCXByaW50ZigiWyIpOworCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9GTEFHX1RZUEUpIHsKKwkJZmxhZ190ID0gVFJVRTsKKwkJcHJpbnRmKCJUIik7CisJfQorCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9GTEFHX0xFTkdUSCkgeworCQlmbGFnX2wgPSBUUlVFOworCQlwcmludGYoIkwiKTsKKwl9CisJaWYgKEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX0ZMQUdfU0VRVUVOQ0UpIHsKKwkJZmxhZ19zID0gVFJVRTsKKwkJcHJpbnRmKCJTIik7CisJfQorCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9GTEFHX09GRlNFVCkgeworCQlmbGFnX28gPSBUUlVFOworCQlwcmludGYoIk8iKTsKKwl9CisJaWYgKEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX0ZMQUdfUFJJT1JJVFkpCisJCXByaW50ZigiUCIpOworCXByaW50ZigiXSIpOworCisJcHRyKys7CisJY250ICs9IDI7CisKKwlpZiAoZmxhZ19sKSB7CisJCVRDSEVDSygqcHRyKTsJLyogTGVuZ3RoICovCisJCWwydHBfbGVuID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7CisJCWNudCArPSAyOworCX0gZWxzZSB7CisJCWwydHBfbGVuID0gMDsKKwl9CisKKwlUQ0hFQ0soKnB0cik7CQkvKiBUdW5uZWwgSUQgKi8KKwlwcmludGYoIigldS8iLCBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7CisJY250ICs9IDI7CisJVENIRUNLKCpwdHIpOwkJLyogU2Vzc2lvbiBJRCAqLworCXByaW50ZigiJXUpIiwgIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsKKwljbnQgKz0gMjsKKworCWlmIChmbGFnX3MpIHsKKwkJVENIRUNLKCpwdHIpOwkvKiBOcyAqLworCQlwcmludGYoIk5zPSV1LCIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsKKwkJY250ICs9IDI7CisJCVRDSEVDSygqcHRyKTsJLyogTnIgKi8KKwkJcHJpbnRmKCJOcj0ldSIsICBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7CisJCWNudCArPSAyOworCX0KKworCWlmIChmbGFnX28pIHsKKwkJVENIRUNLKCpwdHIpOwkvKiBPZmZzZXQgU2l6ZSAqLworCQlwYWQgPSAgRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7CisJCXB0ciArPSBwYWQgLyBzaXplb2YoKnB0cik7CisJCWNudCArPSAoMiArIHBhZCk7CisJfQorCisJaWYgKGZsYWdfbCkgeworCQlpZiAobGVuZ3RoIDwgbDJ0cF9sZW4pIHsKKwkJCXByaW50ZigiIExlbmd0aCAldSBsYXJnZXIgdGhhbiBwYWNrZXQiLCBsMnRwX2xlbik7CisJCQlyZXR1cm47CisJCX0KKwkJbGVuZ3RoID0gbDJ0cF9sZW47CisJfQorCWlmIChsZW5ndGggPCBjbnQpIHsKKwkJcHJpbnRmKCIgTGVuZ3RoICV1IHNtYWxsZXIgdGhhbiBoZWFkZXIgbGVuZ3RoIiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZmxhZ190KSB7CisJCWlmICghZmxhZ19sKSB7CisJCQlwcmludGYoIiBObyBsZW5ndGgiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAobGVuZ3RoIC0gY250ID09IDApIHsKKwkJCXByaW50ZigiIFpMQiIpOworCQl9IGVsc2UgeworCQkJbDJ0cF9hdnBfcHJpbnQoKHVfY2hhciAqKXB0ciwgbGVuZ3RoIC0gY250KTsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiIHsiKTsKKwkJcHBwX3ByaW50KCh1X2NoYXIgKilwdHIsIGxlbmd0aCAtIGNudCk7CisJCXByaW50ZigifSIpOworCX0KKworCXJldHVybjsKKworIHRydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LWxhbmUuYyBiL3ByaW50LWxhbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNjMmMyCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbGFuZS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogTWFya28gS2lpc2tpbGEgY2FybmlsQGNzLnR1dC5maQorICoKKyAqIFRhbXBlcmUgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5IC0gVGVsZWNvbW11bmljYXRpb25zIExhYm9yYXRvcnkKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMKKyAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCwKKyAqIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcworICogcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLAorICogZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucworICogdGhlcmVvZiwgdGhhdCBib3RoIG5vdGljZXMgYXBwZWFyIGluIHN1cHBvcnRpbmcKKyAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcworICogYWNrbm93bGVkZ2VkIGluIGFueSBwdWJsaWNhdGlvbnMgcmVzdWx0aW5nIGZyb20gdXNpbmcKKyAqIHRoZSBzb2Z0d2FyZS4KKyAqCisgKiBUVVQgQUxMT1dTIEZSRUUgVVNFIE9GIFRISVMgU09GVFdBUkUgSU4gSVRTICJBUyBJUyIKKyAqIENPTkRJVElPTiBBTkQgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgT0YgQU5ZIEtJTkQgRk9SCisgKiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxhbmUuYyx2IDEuMjMuMi4yIDIwMDUvMTEvMTMgMTI6MTI6NTkgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxwY2FwLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImV0aGVyLmgiCisjaW5jbHVkZSAibGFuZS5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZWNvcDJzdHJbXSA9IHsKKwl7IDB4MDAwMSwJImNvbmZpZ3VyZSByZXF1ZXN0IiB9LAorCXsgMHgwMTAxLAkiY29uZmlndXJlIHJlc3BvbnNlIiB9LAorCXsgMHgwMDAyLAkiam9pbiByZXF1ZXN0IiB9LAorCXsgMHgwMTAyLAkiam9pbiByZXNwb25zZSIgfSwKKwl7IDB4MDAwMywJInJlYWR5IHF1ZXJ5IiB9LAorCXsgMHgwMTAzLAkicmVhZHkgaW5kaWNhdGlvbiIgfSwKKwl7IDB4MDAwNCwJInJlZ2lzdGVyIHJlcXVlc3QiIH0sCisJeyAweDAxMDQsCSJyZWdpc3RlciByZXNwb25zZSIgfSwKKwl7IDB4MDAwNSwJInVucmVnaXN0ZXIgcmVxdWVzdCIgfSwKKwl7IDB4MDEwNSwJInVucmVnaXN0ZXIgcmVzcG9uc2UiIH0sCisJeyAweDAwMDYsCSJBUlAgcmVxdWVzdCIgfSwKKwl7IDB4MDEwNiwJIkFSUCByZXNwb25zZSIgfSwKKwl7IDB4MDAwNywJImZsdXNoIHJlcXVlc3QiIH0sCisJeyAweDAxMDcsCSJmbHVzaCByZXNwb25zZSIgfSwKKwl7IDB4MDAwOCwJIk5BUlAgcmVxdWVzdCIgfSwKKwl7IDB4MDAwOSwJInRvcG9sb2d5IHJlcXVlc3QiIH0sCisJeyAwLAkJTlVMTCB9Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK2xhbmVfaGRyX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxlY2RhdGFoZHJfODAyMyAqZXA7CisKKwllcCA9IChjb25zdCBzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICopYnA7CisJaWYgKHFmbGFnKQorCQkodm9pZClwcmludGYoImxlY2lkOiV4ICVzICVzICVkOiAiLAorCQkJICAgICBFWFRSQUNUXzE2QklUUygmZXAtPmxlX2hlYWRlciksCisJCQkgICAgIGV0aGVyYWRkcl9zdHJpbmcoZXAtPmhfc291cmNlKSwKKwkJCSAgICAgZXRoZXJhZGRyX3N0cmluZyhlcC0+aF9kZXN0KSwKKwkJCSAgICAgbGVuZ3RoKTsKKwllbHNlCisJCSh2b2lkKXByaW50ZigibGVjaWQ6JXggJXMgJXMgJXMgJWQ6ICIsCisJCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZlcC0+bGVfaGVhZGVyKSwKKwkJCSAgICAgZXRoZXJhZGRyX3N0cmluZyhlcC0+aF9zb3VyY2UpLAorCQkJICAgICBldGhlcmFkZHJfc3RyaW5nKGVwLT5oX2Rlc3QpLAorCQkJICAgICBldGhlcnByb3RvX3N0cmluZyhlcC0+aF90eXBlKSwKKwkJCSAgICAgbGVuZ3RoKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cworICogdG8gdGhlIExBTkUgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqCisgKiBUaGlzIGFzc3VtZXMgODAyLjMsIG5vdCA4MDIuNSwgTEFOIGVtdWxhdGlvbi4KKyAqLwordm9pZAorbGFuZV9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCXN0cnVjdCBsYW5lX2NvbnRyb2xoZHIgKmxlYzsKKwlzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICplcDsKKwl1X3Nob3J0IGV0aGVyX3R5cGU7CisJdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOworCisJaWYgKGNhcGxlbiA8IHNpemVvZihzdHJ1Y3QgbGFuZV9jb250cm9saGRyKSkgeworCQlwcmludGYoIlt8bGFuZV0iKTsKKwkJcmV0dXJuOworCX0KKworCWxlYyA9IChzdHJ1Y3QgbGFuZV9jb250cm9saGRyICopcDsKKwlpZiAoRVhUUkFDVF8xNkJJVFMoJmxlYy0+bGVjX2hlYWRlcikgPT0gMHhmZjAwKSB7CisJCS8qCisJCSAqIExFIENvbnRyb2wuCisJCSAqLworCQlwcmludGYoImxlYzogcHJvdG8gJXggdmVycyAleCAlcyIsCisJCSAgICBsZWMtPmxlY19wcm90bywgbGVjLT5sZWNfdmVycywKKwkJICAgIHRvazJzdHIobGVjb3Ayc3RyLCAib3Bjb2RlLSMldSIsIEVYVFJBQ1RfMTZCSVRTKCZsZWMtPmxlY19vcGNvZGUpKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2FwbGVuIDwgc2l6ZW9mKHN0cnVjdCBsZWNkYXRhaGRyXzgwMjMpKSB7CisJCXByaW50ZigiW3xsYW5lXSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGVmbGFnKQorCQlsYW5lX2hkcl9wcmludChwLCBsZW5ndGgpOworCisJLyoKKwkgKiBHbyBwYXN0IHRoZSBMQU5FIGhlYWRlci4KKwkgKi8KKwlsZW5ndGggLT0gc2l6ZW9mKHN0cnVjdCBsZWNkYXRhaGRyXzgwMjMpOworCWNhcGxlbiAtPSBzaXplb2Yoc3RydWN0IGxlY2RhdGFoZHJfODAyMyk7CisJZXAgPSAoc3RydWN0IGxlY2RhdGFoZHJfODAyMyAqKXA7CisJcCArPSBzaXplb2Yoc3RydWN0IGxlY2RhdGFoZHJfODAyMyk7CisKKwlldGhlcl90eXBlID0gRVhUUkFDVF8xNkJJVFMoJmVwLT5oX3R5cGUpOworCisJLyoKKwkgKiBJcyBpdCAoZ2FnKSBhbiA4MDIuMyBlbmNhcHN1bGF0aW9uPworCSAqLworCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7CisJCS8qIFRyeSB0byBwcmludCB0aGUgTExDLWxheWVyIGhlYWRlciAmIGhpZ2hlciBsYXllcnMgKi8KKwkJaWYgKGxsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbiwgZXAtPmhfc291cmNlLCBlcC0+aF9kZXN0LAorCQkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApIHsKKwkJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCQlpZiAoIWVmbGFnKQorCQkJCWxhbmVfaGRyX3ByaW50KCh1X2NoYXIgKillcCwgbGVuZ3RoICsgc2l6ZW9mKCplcCkpOworCQkJaWYgKGV4dHJhY3RlZF9ldGhlcnR5cGUpIHsKKwkJCQlwcmludGYoIihMTEMgJXMpICIsCisJCQkgICAgICAgZXRoZXJwcm90b19zdHJpbmcoaHRvbnMoZXh0cmFjdGVkX2V0aGVydHlwZSkpKTsKKwkJCX0KKwkJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJCX0KKwl9IGVsc2UgaWYgKGV0aGVyX2VuY2FwX3ByaW50KGV0aGVyX3R5cGUsIHAsIGxlbmd0aCwgY2FwbGVuLAorCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkgeworCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLworCQlpZiAoIWVmbGFnKQorCQkJbGFuZV9oZHJfcHJpbnQoKHVfY2hhciAqKWVwLCBsZW5ndGggKyBzaXplb2YoKmVwKSk7CisJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwl9Cit9CisKK3VfaW50CitsYW5lX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCWxhbmVfcHJpbnQocCwgaC0+bGVuLCBoLT5jYXBsZW4pOworCisJcmV0dXJuIChzaXplb2Yoc3RydWN0IGxlY2RhdGFoZHJfODAyMykpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtbGRwLmMgYi9wcmludC1sZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjgwZDhjCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbGRwLmMKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICogIGFuZCBTdGVpbmFyIEhhdWcgKHN0aGF1Z0BuZXRoZWxwLm5vKQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxkcC5jLHYgMS44LjIuMTAgMjAwNy8wMi8yNiAxMzozMTozMyBoYW5uZXMgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZGVjb2RlX3ByZWZpeC5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiYWYuaCIKKworI2luY2x1ZGUgImwydnBuLmgiCisKKy8qCisgKiBsZHAgY29tbW9uIGhlYWRlcgorICoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgUERVIExlbmd0aCAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExEUCBJZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKgorICovCisKK3N0cnVjdCBsZHBfY29tbW9uX2hlYWRlciB7CisgICAgdV9pbnQ4X3QgdmVyc2lvblsyXTsKKyAgICB1X2ludDhfdCBwZHVfbGVuZ3RoWzJdOworICAgIHVfaW50OF90IGxzcl9pZFs0XTsKKyAgICB1X2ludDhfdCBsYWJlbF9zcGFjZVsyXTsKK307CisKKyNkZWZpbmUgTERQX1ZFUlNJT04gMQorCisvKgorICogbGRwIG1lc3NhZ2UgaGVhZGVyCisgKgorICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8VXwgICBNZXNzYWdlIFR5cGUgICAgICAgICAgICAgIHwgICAgICBNZXNzYWdlIExlbmd0aCAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgKiB8ICAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5IFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgfAorICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgKiB8ICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgfAorICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisKK3N0cnVjdCBsZHBfbXNnX2hlYWRlciB7CisgICAgdV9pbnQ4X3QgdHlwZVsyXTsKKyAgICB1X2ludDhfdCBsZW5ndGhbMl07CisgICAgdV9pbnQ4X3QgaWRbNF07Cit9OworCisjZGVmaW5lCUxEUF9NQVNLX01TR19UWVBFKHgpICAoKHgpJjB4N2ZmZikgCisjZGVmaW5lCUxEUF9NQVNLX1VfQklUKHgpICAgICAoKHgpJjB4ODAwMCkgCisKKyNkZWZpbmUJTERQX01TR19OT1RJRiAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUJTERQX01TR19IRUxMTyAgICAgICAgICAgICAgICAweDAxMDAKKyNkZWZpbmUJTERQX01TR19JTklUICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUJTERQX01TR19LRUVQQUxJVkUgICAgICAgICAgICAweDAyMDEKKyNkZWZpbmUJTERQX01TR19BRERSRVNTICAgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUJTERQX01TR19BRERSRVNTX1dJVEhEUkFXICAgICAweDAzMDEKKyNkZWZpbmUJTERQX01TR19MQUJFTF9NQVBQSU5HICAgICAgICAweDA0MDAKKyNkZWZpbmUJTERQX01TR19MQUJFTF9SRVFVRVNUICAgICAgICAweDA0MDEKKyNkZWZpbmUJTERQX01TR19MQUJFTF9XSVRIRFJBVyAgICAgICAweDA0MDIKKyNkZWZpbmUJTERQX01TR19MQUJFTF9SRUxFQVNFICAgICAgICAweDA0MDMKKyNkZWZpbmUJTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNUICAweDA0MDQKKworI2RlZmluZQlMRFBfVkVORE9SX1BSSVZBVEVfTUlOICAgICAgIDB4M2UwMAorI2RlZmluZQlMRFBfVkVORE9SX1BSSVZBVEVfTUFYICAgICAgIDB4M2VmZgorI2RlZmluZQlMRFBfRVhQRVJJTUVOVEFMX01JTiAgICAgICAgIDB4M2YwMAorI2RlZmluZQlMRFBfRVhQRVJJTUVOVEFMX01BWCAgICAgICAgIDB4M2ZmZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfbXNnX3ZhbHVlc1tdID0geworICAgIHsgTERQX01TR19OT1RJRiwJICAgICAgICAgICAgICJOb3RpZmljYXRpb24iIH0sCisgICAgeyBMRFBfTVNHX0hFTExPLAkgICAgICAgICAgICAgIkhlbGxvIiB9LAorICAgIHsgTERQX01TR19JTklULAkgICAgICAgICAgICAgIkluaXRpYWxpemF0aW9uIiB9LAorICAgIHsgTERQX01TR19LRUVQQUxJVkUsICAgICAgICAgICAgICJLZWVwYWxpdmUiIH0sCisgICAgeyBMRFBfTVNHX0FERFJFU1MsCSAgICAgICAgICAgICAiQWRkcmVzcyIgfSwKKyAgICB7IExEUF9NU0dfQUREUkVTU19XSVRIRFJBVywJICAgICAiQWRkcmVzcyBXaXRoZHJhdyIgfSwKKyAgICB7IExEUF9NU0dfTEFCRUxfTUFQUElORywJICAgICAiTGFiZWwgTWFwcGluZyIgfSwKKyAgICB7IExEUF9NU0dfTEFCRUxfUkVRVUVTVCwJICAgICAiTGFiZWwgUmVxdWVzdCIgfSwKKyAgICB7IExEUF9NU0dfTEFCRUxfV0lUSERSQVcsCSAgICAgIkxhYmVsIFdpdGhkcmF3IiB9LAorICAgIHsgTERQX01TR19MQUJFTF9SRUxFQVNFLAkgICAgICJMYWJlbCBSZWxlYXNlIiB9LAorICAgIHsgTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNULCAgICJMYWJlbCBBYm9ydCBSZXF1ZXN0IiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUJTERQX01BU0tfVExWX1RZUEUoeCkgICgoeCkmMHgzZmZmKSAKKyNkZWZpbmUJTERQX01BU0tfRl9CSVQoeCkgKCh4KSYweDQwMDApIAorCisjZGVmaW5lCUxEUF9UTFZfRkVDICAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lCUxEUF9UTFZfQUREUkVTU19MSVNUICAgICAgICAgMHgwMTAxCisjZGVmaW5lCUxEUF9UTFZfSE9QX0NPVU5UICAgICAgICAgICAgMHgwMTAzCisjZGVmaW5lCUxEUF9UTFZfUEFUSF9WRUNUT1IgICAgICAgICAgMHgwMTA0CisjZGVmaW5lCUxEUF9UTFZfR0VORVJJQ19MQUJFTCAgICAgICAgMHgwMjAwCisjZGVmaW5lCUxEUF9UTFZfQVRNX0xBQkVMICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lCUxEUF9UTFZfRlJfTEFCRUwgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lCUxEUF9UTFZfU1RBVFVTICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lCUxEUF9UTFZfRVhURF9TVEFUVVMgICAgICAgICAgMHgwMzAxCisjZGVmaW5lCUxEUF9UTFZfUkVUVVJORURfUERVICAgICAgICAgMHgwMzAyCisjZGVmaW5lCUxEUF9UTFZfUkVUVVJORURfTVNHICAgICAgICAgMHgwMzAzCisjZGVmaW5lCUxEUF9UTFZfQ09NTU9OX0hFTExPICAgICAgICAgMHgwNDAwCisjZGVmaW5lCUxEUF9UTFZfSVBWNF9UUkFOU1BPUlRfQUREUiAgMHgwNDAxCisjZGVmaW5lCUxEUF9UTFZfQ09ORklHX1NFUV9OVU1CRVIgICAgMHgwNDAyCisjZGVmaW5lCUxEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUiAgMHgwNDAzCisjZGVmaW5lCUxEUF9UTFZfQ09NTU9OX1NFU1NJT04gICAgICAgMHgwNTAwCisjZGVmaW5lCUxEUF9UTFZfQVRNX1NFU1NJT05fUEFSTSAgICAgMHgwNTAxCisjZGVmaW5lCUxEUF9UTFZfRlJfU0VTU0lPTl9QQVJNICAgICAgMHgwNTAyCisjZGVmaW5lIExEUF9UTFZfRlRfU0VTU0lPTgkgICAgIDB4MDUwMworI2RlZmluZQlMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lEIDB4MDYwMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfdGx2X3ZhbHVlc1tdID0geworICAgIHsgTERQX1RMVl9GRUMsCSAgICAgICAgICAgICAiRkVDIiB9LAorICAgIHsgTERQX1RMVl9BRERSRVNTX0xJU1QsICAgICAgICAgICJBZGRyZXNzIExpc3QiIH0sCisgICAgeyBMRFBfVExWX0hPUF9DT1VOVCwgICAgICAgICAgICAgIkhvcCBDb3VudCIgfSwKKyAgICB7IExEUF9UTFZfUEFUSF9WRUNUT1IsICAgICAgICAgICAiUGF0aCBWZWN0b3IiIH0sCisgICAgeyBMRFBfVExWX0dFTkVSSUNfTEFCRUwsICAgICAgICAgIkdlbmVyaWMgTGFiZWwiIH0sCisgICAgeyBMRFBfVExWX0FUTV9MQUJFTCwgICAgICAgICAgICAgIkFUTSBMYWJlbCIgfSwKKyAgICB7IExEUF9UTFZfRlJfTEFCRUwsICAgICAgICAgICAgICAiRnJhbWUtUmVsYXkgTGFiZWwiIH0sCisgICAgeyBMRFBfVExWX1NUQVRVUywgICAgICAgICAgICAgICAgIlN0YXR1cyIgfSwKKyAgICB7IExEUF9UTFZfRVhURF9TVEFUVVMsICAgICAgICAgICAiRXh0ZW5kZWQgU3RhdHVzIiB9LAorICAgIHsgTERQX1RMVl9SRVRVUk5FRF9QRFUsICAgICAgICAgICJSZXR1cm5lZCBQRFUiIH0sCisgICAgeyBMRFBfVExWX1JFVFVSTkVEX01TRywgICAgICAgICAgIlJldHVybmVkIE1lc3NhZ2UiIH0sCisgICAgeyBMRFBfVExWX0NPTU1PTl9IRUxMTywgICAgICAgICAgIkNvbW1vbiBIZWxsbyBQYXJhbWV0ZXJzIiB9LAorICAgIHsgTERQX1RMVl9JUFY0X1RSQU5TUE9SVF9BRERSLCAgICJJUHY0IFRyYW5zcG9ydCBBZGRyZXNzIiB9LAorICAgIHsgTERQX1RMVl9DT05GSUdfU0VRX05VTUJFUiwgICAgICJDb25maWd1cmF0aW9uIFNlcXVlbmNlIE51bWJlciIgfSwKKyAgICB7IExEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUiwgICAiSVB2NiBUcmFuc3BvcnQgQWRkcmVzcyIgfSwKKyAgICB7IExEUF9UTFZfQ09NTU9OX1NFU1NJT04sICAgICAgICAiQ29tbW9uIFNlc3Npb24gUGFyYW1ldGVycyIgfSwKKyAgICB7IExEUF9UTFZfQVRNX1NFU1NJT05fUEFSTSwgICAgICAiQVRNIFNlc3Npb24gUGFyYW1ldGVycyIgfSwKKyAgICB7IExEUF9UTFZfRlJfU0VTU0lPTl9QQVJNLCAgICAgICAiRnJhbWUtUmVsYXkgU2Vzc2lvbiBQYXJhbWV0ZXJzIiB9LAorICAgIHsgTERQX1RMVl9GVF9TRVNTSU9OLCAgICAgICAgICAgICJGYXVsdC1Ub2xlcmFudCBTZXNzaW9uIFBhcmFtZXRlcnMiIH0sCisgICAgeyBMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lELCAgIkxhYmVsIFJlcXVlc3QgTWVzc2FnZSBJRCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIExEUF9GRUNfV0lMRENBUkQJMHgwMQorI2RlZmluZSBMRFBfRkVDX1BSRUZJWAkJMHgwMgorI2RlZmluZSBMRFBfRkVDX0hPU1RBRERSRVNTCTB4MDMKKy8qIEZyb20gZHJhZnQtbWFydGluaS1sMmNpcmN1aXQtdHJhbnMtbXBscy0xMy50eHQgKi8KKyNkZWZpbmUgTERQX0ZFQ19NQVJUSU5JX1ZDCTB4ODAKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbGRwX2ZlY192YWx1ZXNbXSA9IHsKKyAgICB7IExEUF9GRUNfV0lMRENBUkQsCQkiV2lsZGNhcmQiIH0sCisgICAgeyBMRFBfRkVDX1BSRUZJWCwJCSJQcmVmaXgiIH0sCisgICAgeyBMRFBfRkVDX0hPU1RBRERSRVNTLAkiSG9zdCBhZGRyZXNzIiB9LAorICAgIHsgTERQX0ZFQ19NQVJUSU5JX1ZDLAkiTWFydGluaSBWQyIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fTVRVICAweDAxCisjZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fREVTQyAweDAzCisjZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fVkNDViAweDBjCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxkcF9mZWNfbWFydGluaV9pZnBhcm1fdmFsdWVzW10gPSB7CisgICAgeyBMRFBfRkVDX01BUlRJTklfSUZQQVJNX01UVSwgIk1UVSIgfSwKKyAgICB7IExEUF9GRUNfTUFSVElOSV9JRlBBUk1fREVTQywgIkRlc2NyaXB0aW9uIiB9LAorICAgIHsgTERQX0ZFQ19NQVJUSU5JX0lGUEFSTV9WQ0NWLCAiVkNDViIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBkcmFmdC1pZXRmLXB3ZTMtdmNjdi0wNC50eHQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxkcF9mZWNfbWFydGluaV9pZnBhcm1fdmNjdl9jY192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJQV0UzIGNvbnRyb2wgd29yZCIgfSwKKyAgICB7IDB4MDIsICJNUExTIFJvdXRlciBBbGVydCBMYWJlbCIgfSwKKyAgICB7IDB4MDQsICJNUExTIGlubmVyIGxhYmVsIFRUTCA9IDEiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogZHJhZnQtaWV0Zi1wd2UzLXZjY3YtMDQudHh0ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfZmVjX21hcnRpbmlfaWZwYXJtX3ZjY3ZfY3ZfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAiSUNNUCBQaW5nIiB9LAorICAgIHsgMHgwMiwgIkxTUCBQaW5nIiB9LAorICAgIHsgMHgwNCwgIkJGRCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIEFGTlVNX0xFTiAgICAgICAyIAorCitpbnQgbGRwX21zZ19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7CitpbnQgbGRwX3Rsdl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7CisgICAKKy8qIAorICogbGRwIHRsdiBoZWFkZXIKKyAqCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHxVfEZ8ICAgICAgICBUeXBlICAgICAgICAgICAgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfgorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisKK2ludAorbGRwX3Rsdl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnRwdHIpIHsKKworICAgIHN0cnVjdCBsZHBfdGx2X2hlYWRlciB7CisgICAgICAgIHVfaW50OF90IHR5cGVbMl07CisgICAgICAgIHVfaW50OF90IGxlbmd0aFsyXTsKKyAgICB9OworCisgICAgY29uc3Qgc3RydWN0IGxkcF90bHZfaGVhZGVyICpsZHBfdGx2X2hlYWRlcjsKKyAgICB1X3Nob3J0IHRsdl90eXBlLHRsdl9sZW4sdGx2X3RsZW4sYWYsZnRfZmxhZ3M7CisgICAgdV9jaGFyIGZlY190eXBlOworICAgIHVfaW50IHVpLHZjX2luZm9fbGVuLCB2Y19pbmZvX3Rsdl90eXBlLCB2Y19pbmZvX3Rsdl9sZW4saWR4OworICAgIGNoYXIgYnVmWzEwMF07CisgICAgaW50IGk7CisKKyAgICBsZHBfdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbGRwX3Rsdl9oZWFkZXIgKil0cHRyOyAgICAKKyAgICB0bHZfbGVuPUVYVFJBQ1RfMTZCSVRTKGxkcF90bHZfaGVhZGVyLT5sZW5ndGgpOworICAgIHRsdl90bGVuPXRsdl9sZW47CisgICAgdGx2X3R5cGU9TERQX01BU0tfVExWX1RZUEUoRVhUUkFDVF8xNkJJVFMobGRwX3Rsdl9oZWFkZXItPnR5cGUpKTsKKworICAgIC8qIEZJWE1FIHZlbmRvciBwcml2YXRlIC8gZXhwZXJpbWVudGFsIGNoZWNrICovCisgICAgcHJpbnRmKCJcblx0ICAgICVzIFRMViAoMHglMDR4KSwgbGVuZ3RoOiAldSwgRmxhZ3M6IFslcyBhbmQgJXMgZm9yd2FyZCBpZiB1bmtub3duXSIsCisgICAgICAgICAgIHRvazJzdHIobGRwX3Rsdl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgIHRsdl90eXBlKSwKKyAgICAgICAgICAgdGx2X3R5cGUsCisgICAgICAgICAgIHRsdl9sZW4sCisgICAgICAgICAgIExEUF9NQVNLX1VfQklUKEVYVFJBQ1RfMTZCSVRTKCZsZHBfdGx2X2hlYWRlci0+dHlwZSkpID8gImNvbnRpbnVlIHByb2Nlc3NpbmciIDogImlnbm9yZSIsCisgICAgICAgICAgIExEUF9NQVNLX0ZfQklUKEVYVFJBQ1RfMTZCSVRTKCZsZHBfdGx2X2hlYWRlci0+dHlwZSkpID8gImRvIiA6ICJkb24ndCIpOworCisgICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBsZHBfdGx2X2hlYWRlcik7CisKKyAgICBzd2l0Y2godGx2X3R5cGUpIHsKKworICAgIGNhc2UgTERQX1RMVl9DT01NT05fSEVMTE86CisgICAgICAgIHByaW50ZigiXG5cdCAgICAgIEhvbGQgVGltZTogJXVzLCBGbGFnczogWyVzIEhlbGxvJXNdIiwKKyAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIpLAorICAgICAgICAgICAgICAgKEVYVFJBQ1RfMTZCSVRTKHRwdHIrMikmMHg4MDAwKSA/ICJUYXJnZXRlZCIgOiAiTGluayIsCisgICAgICAgICAgICAgICAoRVhUUkFDVF8xNkJJVFModHB0cisyKSYweDQwMDApID8gIiwgUmVxdWVzdCBmb3IgdGFyZ2V0ZWQgSGVsbG9zIiA6ICIiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExEUF9UTFZfSVBWNF9UUkFOU1BPUlRfQUREUjoKKyAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzczogJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICBjYXNlIExEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUjoKKyAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NiBUcmFuc3BvcnQgQWRkcmVzczogJXMiLCBpcDZhZGRyX3N0cmluZyh0cHRyKSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBMRFBfVExWX0NPTkZJR19TRVFfTlVNQkVSOgorICAgICAgICBwcmludGYoIlxuXHQgICAgICBTZXF1ZW5jZSBOdW1iZXI6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTERQX1RMVl9BRERSRVNTX0xJU1Q6CisJYWYgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKKwl0cHRyKz1BRk5VTV9MRU47CisgICAgICAgIHRsdl90bGVuIC09IEFGTlVNX0xFTjsKKwlwcmludGYoIlxuXHQgICAgICBBZGRyZXNzIEZhbWlseTogIik7CisJaWYgKGFmID09IEFGTlVNX0lORVQpIHsKKwkgICAgcHJpbnRmKCJJUHY0LCBhZGRyZXNzZXM6Iik7CisJICAgIHdoaWxlKHRsdl90bGVuID49IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJcHJpbnRmKCIgJXMiLGlwYWRkcl9zdHJpbmcodHB0cikpOworCQl0bHZfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsgICAgICAgICAgICAgICAgCisJICAgIH0KKwl9CisjaWZkZWYgSU5FVDYKKwllbHNlIGlmIChhZiA9PSBBRk5VTV9JTkVUNikgeworCSAgICBwcmludGYoIklQdjYsIGFkZHJlc3NlczoiKTsKKwkgICAgd2hpbGUodGx2X3RsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKKwkJcHJpbnRmKCIgJXMiLGlwNmFkZHJfc3RyaW5nKHRwdHIpKTsKKwkJdGx2X3RsZW4tPXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQl0cHRyKz1zaXplb2Yoc3RydWN0IGluNl9hZGRyKTsgICAgICAgICAgICAgICAgCisJICAgIH0KKwl9CisjZW5kaWYKKwlicmVhazsKKworICAgIGNhc2UgTERQX1RMVl9DT01NT05fU0VTU0lPTjoKKwlwcmludGYoIlxuXHQgICAgICBWZXJzaW9uOiAldSwgS2VlcGFsaXZlOiAldXMsIEZsYWdzOiBbRG93bnN0cmVhbSAlcywgTG9vcCBEZXRlY3Rpb24gJXNdIiwKKwkgICAgICAgRVhUUkFDVF8xNkJJVFModHB0ciksIEVYVFJBQ1RfMTZCSVRTKHRwdHIrMiksCisJICAgICAgIChFWFRSQUNUXzE2QklUUyh0cHRyKzYpJjB4ODAwMCkgPyAiT24gRGVtYW5kIiA6ICJVbnNvbGljaXRlZCIsCisJICAgICAgIChFWFRSQUNUXzE2QklUUyh0cHRyKzYpJjB4NDAwMCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiCisJICAgICAgICk7CisJYnJlYWs7CisKKyAgICBjYXNlIExEUF9UTFZfRkVDOgorICAgICAgICBmZWNfdHlwZSA9ICp0cHRyOworCXByaW50ZigiXG5cdCAgICAgICVzIEZFQyAoMHglMDJ4KSIsCisJICAgICAgIHRvazJzdHIobGRwX2ZlY192YWx1ZXMsICJVbmtub3duIiwgZmVjX3R5cGUpLAorCSAgICAgICBmZWNfdHlwZSk7CisKKwl0cHRyKz0xOworCXN3aXRjaChmZWNfdHlwZSkgeworCisJY2FzZSBMRFBfRkVDX1dJTERDQVJEOgorCSAgICBicmVhazsKKwljYXNlIExEUF9GRUNfUFJFRklYOgorCSAgICBhZiA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOworCSAgICB0cHRyKz0yOworCSAgICBpZiAoYWYgPT0gQUZOVU1fSU5FVCkgeworCQlpPWRlY29kZV9wcmVmaXg0KHRwdHIsYnVmLHNpemVvZihidWYpKTsKKwkJcHJpbnRmKCI6IElQdjQgcHJlZml4ICVzIixidWYpOworCSAgICB9CisjaWZkZWYgSU5FVDYKKwkgICAgZWxzZSBpZiAoYWYgPT0gQUZOVU1fSU5FVDYpIHsKKwkJaT1kZWNvZGVfcHJlZml4Nih0cHRyLGJ1ZixzaXplb2YoYnVmKSk7CisJCXByaW50ZigiOiBJUHY2IHByZWZpeCAlcyIsYnVmKTsKKwkgICAgfQorI2VuZGlmCisJICAgIGJyZWFrOworCWNhc2UgTERQX0ZFQ19IT1NUQUREUkVTUzoKKwkgICAgYnJlYWs7CisJY2FzZSBMRFBfRkVDX01BUlRJTklfVkM6CisgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMTEpKQorICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICB2Y19pbmZvX2xlbiA9ICoodHB0cisyKTsKKworCSAgICBwcmludGYoIjogJXMsICVzY29udHJvbCB3b3JkLCBncm91cC1JRCAldSwgVkMtSUQgJXUsIFZDLWluZm8tbGVuZ3RoOiAldSIsCisJCSAgIHRvazJzdHIobDJ2cG5fZW5jYXBzX3ZhbHVlcywgIlVua25vd24iLCBFWFRSQUNUXzE2QklUUyh0cHRyKSYweDdmZmYpLAorCQkgICBFWFRSQUNUXzE2QklUUyh0cHRyKSYweDgwMDAgPyAiIiA6ICJubyAiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrMyksCisJCSAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNyksCisgICAgICAgICAgICAgICAgICAgdmNfaW5mb19sZW4pOworCisgICAgICAgICAgICBpZiAodmNfaW5mb19sZW4gPT0gMCkgLyogaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHRwdHIrPTExOworICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHZjX2luZm9fbGVuKSkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgICAgICB3aGlsZSAodmNfaW5mb19sZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgdmNfaW5mb190bHZfdHlwZSA9ICp0cHRyOworICAgICAgICAgICAgICAgIHZjX2luZm9fdGx2X2xlbiA9ICoodHB0cisxKTsKKyAgICAgICAgICAgICAgICBpZiAodmNfaW5mb190bHZfbGVuIDwgMikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKHZjX2luZm9fbGVuIDwgdmNfaW5mb190bHZfbGVuKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0SW50ZXJmYWNlIFBhcmFtZXRlcjogJXMgKDB4JTAyeCksIGxlbiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGRwX2ZlY19tYXJ0aW5pX2lmcGFybV92YWx1ZXMsIlVua25vd24iLHZjX2luZm9fdGx2X3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICB2Y19pbmZvX3Rsdl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICB2Y19pbmZvX3Rsdl9sZW4pOworCisgICAgICAgICAgICAgICAgc3dpdGNoKHZjX2luZm9fdGx2X3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fTVRVOgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogJXUiLEVYVFJBQ1RfMTZCSVRTKHRwdHIrMikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTERQX0ZFQ19NQVJUSU5JX0lGUEFSTV9ERVNDOgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMjsgaWR4IDwgdmNfaW5mb190bHZfbGVuOyBpZHgrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVwdXRjaGFyKCoodHB0citpZHgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fVkNDVjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQgIENvbnRyb2wgQ2hhbm5lbHMgKDB4JTAyeCkgPSBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0cisyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIobGRwX2ZlY19tYXJ0aW5pX2lmcGFybV92Y2N2X2NjX3ZhbHVlcywibm9uZSIsKih0cHRyKzIpKSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0ICBDViBUeXBlcyAoMHglMDJ4KSA9IFslc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cHRyKzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihsZHBfZmVjX21hcnRpbmlfaWZwYXJtX3ZjY3ZfY3ZfdmFsdWVzLCJub25lIiwqKHRwdHIrMykpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0cisyLCJcblx0XHQgICIsdmNfaW5mb190bHZfbGVuLTIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2Y19pbmZvX2xlbiAtPSB2Y19pbmZvX3Rsdl9sZW47CisgICAgICAgICAgICAgICAgdHB0ciArPSB2Y19pbmZvX3Rsdl9sZW47CisgICAgICAgICAgICB9CisJICAgIGJyZWFrOworCX0KKworCWJyZWFrOworCisgICAgY2FzZSBMRFBfVExWX0dFTkVSSUNfTEFCRUw6CisJcHJpbnRmKCJcblx0ICAgICAgTGFiZWw6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikgJiAweGZmZmZmKTsKKwlicmVhazsKKworICAgIGNhc2UgTERQX1RMVl9TVEFUVVM6CisJdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKwl0cHRyKz00OworCXByaW50ZigiXG5cdCAgICAgIFN0YXR1czogMHglMDJ4LCBGbGFnczogWyVzIGFuZCAlcyBmb3J3YXJkXSIsCisJICAgICAgIHVpJjB4M2ZmZmZmZmYsCisJICAgICAgIHVpJjB4ODAwMDAwMDAgPyAiRmF0YWwgZXJyb3IiIDogIkFkdmlzb3J5IE5vdGlmaWNhdGlvbiIsCisJICAgICAgIHVpJjB4NDAwMDAwMDAgPyAiZG8iIDogImRvbid0Iik7CisJdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKwl0cHRyKz00OworCWlmICh1aSkKKwkgICAgcHJpbnRmKCIsIGNhdXNpbmcgTWVzc2FnZSBJRDogMHglMDh4IiwgdWkpOworCWJyZWFrOworCisgICAgY2FzZSBMRFBfVExWX0ZUX1NFU1NJT046CisJZnRfZmxhZ3MgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKKwlwcmludGYoIlxuXHQgICAgICBGbGFnczogWyVzUmVjb25uZWN0LCAlc1NhdmUgU3RhdGUsICVzQWxsLUxhYmVsIFByb3RlY3Rpb24sICVzIENoZWNrcG9pbnQsICVzUmUtTGVhcm4gU3RhdGVdIiwKKwkgICAgICAgZnRfZmxhZ3MmMHg4MDAwID8gIiIgOiAiTm8gIiwKKwkgICAgICAgZnRfZmxhZ3MmMHg4ID8gIiIgOiAiRG9uJ3QgIiwKKwkgICAgICAgZnRfZmxhZ3MmMHg0ID8gIiIgOiAiTm8gIiwKKwkgICAgICAgZnRfZmxhZ3MmMHgyID8gIlNlcXVlbmNlIE51bWJlcmVkIExhYmVsIiA6ICJBbGwgTGFiZWxzIiwKKwkgICAgICAgZnRfZmxhZ3MmMHgxID8gIiIgOiAiRG9uJ3QgIik7CisJdHB0cis9NDsKKwl1aSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOworCWlmICh1aSkKKwkgICAgcHJpbnRmKCIsIFJlY29ubmVjdCBUaW1lb3V0OiAldW1zIiwgdWkpOworCXRwdHIrPTQ7CisJdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKKwlpZiAodWkpCisJICAgIHByaW50ZigiLCBSZWNvdmVyeSBUaW1lOiAldW1zIiwgdWkpOworCWJyZWFrOworCisKKyAgICAvKgorICAgICAqICBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgVExWcyB0aGF0IGxhY2sgYSBkZWNvZGVyCisgICAgICogIHlvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIGNvZGUgOy0pCisgICAgICovCisKKyAgICBjYXNlIExEUF9UTFZfSE9QX0NPVU5UOgorICAgIGNhc2UgTERQX1RMVl9QQVRIX1ZFQ1RPUjoKKyAgICBjYXNlIExEUF9UTFZfQVRNX0xBQkVMOgorICAgIGNhc2UgTERQX1RMVl9GUl9MQUJFTDoKKyAgICBjYXNlIExEUF9UTFZfRVhURF9TVEFUVVM6CisgICAgY2FzZSBMRFBfVExWX1JFVFVSTkVEX1BEVToKKyAgICBjYXNlIExEUF9UTFZfUkVUVVJORURfTVNHOgorICAgIGNhc2UgTERQX1RMVl9BVE1fU0VTU0lPTl9QQVJNOgorICAgIGNhc2UgTERQX1RMVl9GUl9TRVNTSU9OX1BBUk06CisgICAgY2FzZSBMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lEOgorCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHZmbGFnIDw9IDEpCisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X3RsZW4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuKHRsdl9sZW4rNCk7IC8qIFR5cGUgJiBMZW5ndGggZmllbGRzIG5vdCBpbmNsdWRlZCAqLworIAordHJ1bmM6CisgICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2xkcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikgeworCisgICAgaW50IHByb2Nlc3NlZDsKKyAgICB3aGlsZSAobGVuID4gKHNpemVvZihzdHJ1Y3QgbGRwX2NvbW1vbl9oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpKSB7CisgICAgICAgIHByb2Nlc3NlZCA9IGxkcF9tc2dfcHJpbnQocHB0cik7CisgICAgICAgIGlmIChwcm9jZXNzZWQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbGVuIC09IHByb2Nlc3NlZDsKKyAgICAgICAgcHB0ciArPSBwcm9jZXNzZWQ7CisgICAgfQorfQorCisKK2ludAorbGRwX21zZ19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIpIHsKKworICAgIGNvbnN0IHN0cnVjdCBsZHBfY29tbW9uX2hlYWRlciAqbGRwX2NvbV9oZWFkZXI7CisgICAgY29uc3Qgc3RydWN0IGxkcF9tc2dfaGVhZGVyICpsZHBfbXNnX2hlYWRlcjsKKyAgICBjb25zdCB1X2NoYXIgKnRwdHIsKm1zZ190cHRyOworICAgIHVfc2hvcnQgdGxlbjsKKyAgICB1X3Nob3J0IHBkdV9sZW4sbXNnX2xlbixtc2dfdHlwZSxtc2dfdGxlbjsKKyAgICBpbnQgaGV4ZHVtcCxwcm9jZXNzZWQ7CisKKyAgICB0cHRyPXBwdHI7CisgICAgbGRwX2NvbV9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGxkcF9jb21tb25faGVhZGVyICopcHB0cjsKKyAgICBUQ0hFQ0soKmxkcF9jb21faGVhZGVyKTsKKworICAgIC8qCisgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCisgICAgICovCisgICAgaWYgKEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+dmVyc2lvbikgIT0gTERQX1ZFUlNJT04pIHsKKwlwcmludGYoIiVzTERQIHZlcnNpb24gJXUgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgKHZmbGFnIDwgMSkgPyAiIiA6ICJcblx0IiwKKyAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+dmVyc2lvbikpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIHByaW50IHRoZSBMU1ItSUQsIGxhYmVsLXNwYWNlICYgbGVuZ3RoICovCisgICAgcGR1X2xlbiA9IEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+cGR1X2xlbmd0aCk7CisgICAgcHJpbnRmKCIlc0xEUCwgTGFiZWwtU3BhY2UtSUQ6ICVzOiV1LCBwZHUtbGVuZ3RoOiAldSIsCisgICAgICAgICAgICh2ZmxhZyA8IDEpID8gIiIgOiAiXG5cdCIsCisgICAgICAgICAgIGlwYWRkcl9zdHJpbmcoJmxkcF9jb21faGVhZGVyLT5sc3JfaWQpLAorICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbGRwX2NvbV9oZWFkZXItPmxhYmVsX3NwYWNlKSwKKyAgICAgICAgICAgcGR1X2xlbik7CisKKyAgICAvKiBiYWlsIG91dCBpZiBub24tdmVyYm9zZSAqLyAKKyAgICBpZiAodmZsYWcgPCAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCisgICAgdGxlbj1wZHVfbGVuOworCisgICAgdHB0ciArPSBzaXplb2YoY29uc3Qgc3RydWN0IGxkcF9jb21tb25faGVhZGVyKTsKKyAgICB0bGVuIC09IHNpemVvZihjb25zdCBzdHJ1Y3QgbGRwX2NvbW1vbl9oZWFkZXIpLTQ7CS8qIFR5cGUgJiBMZW5ndGggZmllbGRzIG5vdCBpbmNsdWRlZCAqLworCisgICAgd2hpbGUodGxlbj4wKSB7CisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG1zZyBoZWFkZXIgPyAqLworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpKQorICAgICAgICAgICAgZ290byB0cnVuYzsKKworICAgICAgICBsZHBfbXNnX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbGRwX21zZ19oZWFkZXIgKil0cHRyOworICAgICAgICBtc2dfbGVuPUVYVFJBQ1RfMTZCSVRTKGxkcF9tc2dfaGVhZGVyLT5sZW5ndGgpOworICAgICAgICBtc2dfdHlwZT1MRFBfTUFTS19NU0dfVFlQRShFWFRSQUNUXzE2QklUUyhsZHBfbXNnX2hlYWRlci0+dHlwZSkpOworCisgICAgICAgIC8qIEZJWE1FIHZlbmRvciBwcml2YXRlIC8gZXhwZXJpbWVudGFsIGNoZWNrICovCisgICAgICAgIHByaW50ZigiXG5cdCAgJXMgTWVzc2FnZSAoMHglMDR4KSwgbGVuZ3RoOiAldSwgTWVzc2FnZSBJRDogMHglMDh4LCBGbGFnczogWyVzIGlmIHVua25vd25dIiwKKyAgICAgICAgICAgICAgIHRvazJzdHIobGRwX21zZ192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbXNnX3R5cGUpLAorICAgICAgICAgICAgICAgbXNnX3R5cGUsCisgICAgICAgICAgICAgICBtc2dfbGVuLAorICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmxkcF9tc2dfaGVhZGVyLT5pZCksCisgICAgICAgICAgICAgICBMRFBfTUFTS19VX0JJVChFWFRSQUNUXzE2QklUUygmbGRwX21zZ19oZWFkZXItPnR5cGUpKSA/ICJjb250aW51ZSBwcm9jZXNzaW5nIiA6ICJpZ25vcmUiKTsKKworICAgICAgICBpZiAobXNnX2xlbiA9PSAwKSAvKiBpbmZpbml0ZSBsb29wIHByb3RlY3Rpb24gKi8KKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIG1zZ190cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcik7CisgICAgICAgIG1zZ190bGVuPW1zZ19sZW4tc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikrNDsgLyogVHlwZSAmIExlbmd0aCBmaWVsZHMgbm90IGluY2x1ZGVkICovCisKKyAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgbWVzc2FnZSA/ICovCisgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBtc2dfbGVuKSkKKyAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgIGhleGR1bXA9RkFMU0U7CisKKyAgICAgICAgc3dpdGNoKG1zZ190eXBlKSB7CisgCisgICAgICAgIGNhc2UgTERQX01TR19OT1RJRjoKKyAgICAgICAgY2FzZSBMRFBfTVNHX0hFTExPOgorICAgICAgICBjYXNlIExEUF9NU0dfSU5JVDoKKyAgICAgICAgY2FzZSBMRFBfTVNHX0tFRVBBTElWRToKKyAgICAgICAgY2FzZSBMRFBfTVNHX0FERFJFU1M6CisgICAgICAgIGNhc2UgTERQX01TR19MQUJFTF9NQVBQSU5HOgorICAgICAgICBjYXNlIExEUF9NU0dfQUREUkVTU19XSVRIRFJBVzoKKyAgICAgICAgY2FzZSBMRFBfTVNHX0xBQkVMX1dJVEhEUkFXOgorICAgICAgICAgICAgd2hpbGUobXNnX3RsZW4gPj0gNCkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NlZCA9IGxkcF90bHZfcHJpbnQobXNnX3RwdHIpOworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbXNnX3RsZW4tPXByb2Nlc3NlZDsKKyAgICAgICAgICAgICAgICBtc2dfdHB0cis9cHJvY2Vzc2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBtZXNzYWdlcyB0aGF0IGxhY2sgYSBkZWNvZGVyCisgICAgICAgICAqICB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQorICAgICAgICAgKi8KKworICAgICAgICBjYXNlIExEUF9NU0dfTEFCRUxfUkVRVUVTVDoKKyAgICAgICAgY2FzZSBMRFBfTVNHX0xBQkVMX1JFTEVBU0U6CisgICAgICAgIGNhc2UgTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNUOgorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKKyAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEobXNnX3RwdHIsIlxuXHQgICIsbXNnX3RsZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLworICAgICAgICBpZiAodmZsYWcgPiAxIHx8IGhleGR1bXA9PVRSVUUpCisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpLCJcblx0ICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19sZW4pOworCisgICAgICAgIHRwdHIgKz0gbXNnX2xlbis0OworICAgICAgICB0bGVuIC09IG1zZ19sZW4rNDsKKyAgICB9CisgICAgcmV0dXJuIHBkdV9sZW4rNDsKK3RydW5jOgorICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9wcmludC1sbGMuYyBiL3ByaW50LWxsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDE5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1sbGMuYwpAQCAtMCwwICsxLDUzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIENvZGUgYnkgTWF0dCBUaG9tYXMsIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCisgKgl3aXRoIGFuIGF3ZnVsIGxvdCBvZiBoYWNraW5nIGJ5IEplZmZyZXkgTW9ndWwsIERFQ1dSTAorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxsYy5jLHYgMS42MS4yLjEwIDIwMDcvMDIvMDggMDc6MDc6NTEgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKyNpbmNsdWRlICJsbGMuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJvdWkuaCIKKworc3RhdGljIHN0cnVjdCB0b2sgbGxjX3ZhbHVlc1tdID0geworICAgICAgICB7IExMQ1NBUF9OVUxMLCAgICAgIk51bGwiIH0sCisgICAgICAgIHsgTExDU0FQX0dMT0JBTCwgICAiR2xvYmFsIiB9LAorICAgICAgICB7IExMQ1NBUF84MDIxQl9JLCAgIjgwMi4xQiBJIiB9LAorICAgICAgICB7IExMQ1NBUF84MDIxQl9HLCAgIjgwMi4xQiBHIiB9LAorICAgICAgICB7IExMQ1NBUF9JUCwgICAgICAgIklQIiB9LAorICAgICAgICB7IExMQ1NBUF9TTkEsICAgICAgIlNOQSIgfSwKKyAgICAgICAgeyBMTENTQVBfUFJPV0FZTk0sICJQcm9XYXkgTk0iIH0sCisgICAgICAgIHsgTExDU0FQXzgwMjFELCAgICAiU1RQIiB9LAorICAgICAgICB7IExMQ1NBUF9SUzUxMSwgICAgIlJTNTExIiB9LAorICAgICAgICB7IExMQ1NBUF9JU084MjA4LCAgIklTTzgyMDgiIH0sCisgICAgICAgIHsgTExDU0FQX1BST1dBWSwgICAiUHJvV2F5IiB9LAorICAgICAgICB7IExMQ1NBUF9TTkFQLCAgICAgIlNOQVAiIH0sCisgICAgICAgIHsgTExDU0FQX0lQWCwgICAgICAiSVBYIiB9LAorICAgICAgICB7IExMQ1NBUF9ORVRCRVVJLCAgIk5ldEJldWkiIH0sCisgICAgICAgIHsgTExDU0FQX0lTT05TLCAgICAiT1NJIiB9LAorICAgICAgICB7IDAsICAgICAgICAgICAgICAgTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgbGxjX2NtZF92YWx1ZXNbXSA9IHsKKwl7IExMQ19VSSwJInVpIiB9LAorCXsgTExDX1RFU1QsCSJ0ZXN0IiB9LAorCXsgTExDX1hJRCwJInhpZCIgfSwKKwl7IExMQ19VQSwJInVhIiB9LAorCXsgTExDX0RJU0MsCSJkaXNjIiB9LAorCXsgTExDX0RNLAkiZG0iIH0sCisJeyBMTENfU0FCTUUsCSJzYWJtZSIgfSwKKwl7IExMQ19GUk1SLAkiZnJtciIgfSwKKwl7IDAsCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxsY19mbGFnX3ZhbHVlc1tdID0geyAKKyAgICAgICAgeyAwLCAiQ29tbWFuZCIgfSwKKyAgICAgICAgeyBMTENfR1NBUCwgIlJlc3BvbnNlIiB9LAorICAgICAgICB7IExMQ19VX1BPTEwsICJQb2xsIiB9LAorICAgICAgICB7IExMQ19HU0FQfExMQ19VX1BPTEwsICJGaW5hbCIgfSwKKyAgICAgICAgeyBMTENfSVNfUE9MTCwgIlBvbGwiIH0sCisgICAgICAgIHsgTExDX0dTQVB8TExDX0lTX1BPTEwsICJGaW5hbCIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbGNfaWdfZmxhZ192YWx1ZXNbXSA9IHsgCisgICAgICAgIHsgMCwgIkluZGl2aWR1YWwiIH0sCisgICAgICAgIHsgTExDX0lHLCAiR3JvdXAiIH0sCisJeyAwLCBOVUxMIH0KK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbGxjX3N1cGVydmlzb3J5X3ZhbHVlc1tdID0geyAKKyAgICAgICAgeyAwLCAiUmVjZWl2ZXIgUmVhZHkiIH0sCisgICAgICAgIHsgMSwgIlJlY2VpdmVyIG5vdCBSZWFkeSIgfSwKKyAgICAgICAgeyAyLCAiUmVqZWN0IiB9LAorCXsgMCwgICAgICAgICAgICAgTlVMTCB9Cit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGNpc2NvX3ZhbHVlc1tdID0geyAKKwl7IFBJRF9DSVNDT19DRFAsICJDRFAiIH0sCisJeyBQSURfQ0lTQ09fVlRQLCAiVlRQIiB9LAorCXsgUElEX0NJU0NPX0RUUCwgIkRUUCIgfSwKKwl7IDAsICAgICAgICAgICAgIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYnJpZGdlZF92YWx1ZXNbXSA9IHsgCisJeyBQSURfUkZDMjY4NF9FVEhfRkNTLCAgICAgIkV0aGVybmV0ICsgRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfRVRIX05PRkNTLCAgICJFdGhlcm5ldCB3L28gRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfODAyXzRfRkNTLCAgICI4MDIuNCArIEZDUyIgfSwKKwl7IFBJRF9SRkMyNjg0XzgwMl80X05PRkNTLCAiODAyLjQgdy9vIEZDUyIgfSwKKwl7IFBJRF9SRkMyNjg0XzgwMl81X0ZDUywgICAiVG9rZW4gUmluZyArIEZDUyIgfSwKKwl7IFBJRF9SRkMyNjg0XzgwMl81X05PRkNTLCAiVG9rZW4gUmluZyB3L28gRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfRkRESV9GQ1MsICAgICJGRERJICsgRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfRkRESV9OT0ZDUywgICJGRERJIHcvbyBGQ1MiIH0sCisJeyBQSURfUkZDMjY4NF84MDJfNl9GQ1MsICAgIjgwMi42ICsgRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfODAyXzZfTk9GQ1MsICI4MDIuNiB3L28gRkNTIiB9LAorCXsgUElEX1JGQzI2ODRfQlBEVSwgICAgICAgICJCUERVIiB9LAorCXsgMCwgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIG51bGxfdmFsdWVzW10gPSB7IAorCXsgMCwgICAgICAgICAgICAgTlVMTCB9Cit9OworCitzdHJ1Y3Qgb3VpX3RvayB7CisJdV9pbnQzMl90CW91aTsKKwljb25zdCBzdHJ1Y3QgdG9rICp0b2s7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG91aV90b2sgb3VpX3RvX3Rva1tdID0geworCXsgT1VJX0VOQ0FQX0VUSEVSLCBldGhlcnR5cGVfdmFsdWVzIH0sCisJeyBPVUlfQ0lTQ09fOTAsIGV0aGVydHlwZV92YWx1ZXMgfSwJLyogdXNlcyBzb21lIEV0aGVydHlwZSB2YWx1ZXMgKi8KKwl7IE9VSV9BUFBMRVRBTEssIGV0aGVydHlwZV92YWx1ZXMgfSwJLyogdXNlcyBzb21lIEV0aGVydHlwZSB2YWx1ZXMgKi8KKwl7IE9VSV9DSVNDTywgY2lzY29fdmFsdWVzIH0sCisJeyBPVUlfUkZDMjY4NCwgYnJpZGdlZF92YWx1ZXMgfSwJLyogYnJpZGdlZCwgUkZDIDI0MjcgRlIgb3IgUkZDIDI4NjQgQVRNICovCisJeyAwLCBOVUxMIH0KK307CisKKy8qCisgKiBSZXR1cm5zIG5vbi16ZXJvIElGRiBpdCBzdWNjZWVkcyBpbiBwcmludGluZyB0aGUgaGVhZGVyCisgKi8KK2ludAorbGxjX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4sCisJICBjb25zdCB1X2NoYXIgKmVzcmMsIGNvbnN0IHVfY2hhciAqZWRzdCwgdV9zaG9ydCAqZXh0cmFjdGVkX2V0aGVydHlwZSkKK3sKKwl1X2ludDhfdCBkc2FwX2ZpZWxkLCBkc2FwLCBzc2FwX2ZpZWxkLCBzc2FwOworCXVfaW50MTZfdCBjb250cm9sOworCWludCBpc191OworCXJlZ2lzdGVyIGludCByZXQ7CisKKwkqZXh0cmFjdGVkX2V0aGVydHlwZSA9IDA7CisKKwlpZiAoY2FwbGVuIDwgMykgeworCQkodm9pZClwcmludGYoIlt8bGxjXSIpOworCQlkZWZhdWx0X3ByaW50KCh1X2NoYXIgKilwLCBjYXBsZW4pOworCQlyZXR1cm4oMCk7CisJfQorCisJZHNhcF9maWVsZCA9ICpwOworCXNzYXBfZmllbGQgPSAqKHAgKyAxKTsKKworCS8qCisJICogT0ssIHdoYXQgdHlwZSBvZiBMTEMgZnJhbWUgaXMgdGhpcz8gIFRoZSBsZW5ndGgKKwkgKiBvZiB0aGUgY29udHJvbCBmaWVsZCBkZXBlbmRzIG9uIHRoYXQgLSBJIGZyYW1lcworCSAqIGhhdmUgYSB0d28tYnl0ZSBjb250cm9sIGZpZWxkLCBhbmQgVSBmcmFtZXMgaGF2ZQorCSAqIGEgb25lLWJ5dGUgY29udHJvbCBmaWVsZC4KKwkgKi8KKwljb250cm9sID0gKihwICsgMik7CisJaWYgKChjb250cm9sICYgTExDX1VfRk1UKSA9PSBMTENfVV9GTVQpIHsKKwkJLyoKKwkJICogVSBmcmFtZS4KKwkJICovCisJCWlzX3UgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBjb250cm9sIGZpZWxkIGluIEkgYW5kIFMgZnJhbWVzIGlzCisJCSAqIDIgYnl0ZXMuLi4KKwkJICovCisJCWlmIChjYXBsZW4gPCA0KSB7CisJCQkodm9pZClwcmludGYoIlt8bGxjXSIpOworCQkJZGVmYXVsdF9wcmludCgodV9jaGFyICopcCwgY2FwbGVuKTsKKwkJCXJldHVybigwKTsKKwkJfQorCisJCS8qCisJCSAqIC4uLmFuZCBpcyBsaXR0bGUtZW5kaWFuLgorCQkgKi8KKwkJY29udHJvbCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHAgKyAyKTsKKwkJaXNfdSA9IDA7CisJfQorCisJaWYgKHNzYXBfZmllbGQgPT0gTExDU0FQX0dMT0JBTCAmJiBkc2FwX2ZpZWxkID09IExMQ1NBUF9HTE9CQUwpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhbiBFdGhlcm5ldF84MDIuMyBJUFggZnJhbWU7IGl0IGhhcyBhbgorCQkgKiA4MDIuMyBoZWFkZXIgKGkuZS4sIGFuIEV0aGVybmV0IGhlYWRlciB3aGVyZSB0aGUKKwkJICogdHlwZS9sZW5ndGggZmllbGQgaXMgPD0gRVRIRVJNVFUsIGkuZS4gaXQncyBhIGxlbmd0aAorCQkgKiBmaWVsZCwgbm90IGEgdHlwZSBmaWVsZCksIGJ1dCBoYXMgbm8gODAyLjIgaGVhZGVyIC0KKwkJICogdGhlIElQWCBwYWNrZXQgc3RhcnRzIHJpZ2h0IGFmdGVyIHRoZSBFdGhlcm5ldCBoZWFkZXIsCisJCSAqIHdpdGggYSBzaWduYXR1cmUgb2YgdHdvIGJ5dGVzIG9mIDB4RkYgKHdoaWNoIGlzCisJCSAqIExMQ1NBUF9HTE9CQUwpLgorCQkgKgorCQkgKiAoSXQgbWlnaHQgYWxzbyBoYXZlIGJlZW4gYW4gRXRoZXJuZXRfODAyLjMgSVBYIGF0CisJCSAqIG9uZSB0aW1lLCBidXQgZ290IGJyaWRnZWQgb250byBhbm90aGVyIG5ldHdvcmssCisJCSAqIHN1Y2ggYXMgYW4gODAyLjExIG5ldHdvcms7IHRoaXMgaGFzIGFwcGVhcmVkIGluIGF0CisJCSAqIGxlYXN0IG9uZSBjYXB0dXJlIGZpbGUuKQorCQkgKi8KKworICAgICAgICAgICAgaWYgKGVmbGFnKQorCQlwcmludGYoIklQWCA4MDIuMzogIik7CisKKyAgICAgICAgICAgIGlweF9wcmludChwLCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuICgxKTsKKwl9CisKKwlkc2FwID0gZHNhcF9maWVsZCAmIH5MTENfSUc7CisJc3NhcCA9IHNzYXBfZmllbGQgJiB+TExDX0dTQVA7CisKKwlpZiAoZWZsYWcpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkxMQywgZHNhcCAlcyAoMHglMDJ4KSAlcywgc3NhcCAlcyAoMHglMDJ4KSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24iLCBkc2FwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZHNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsbGNfaWdfZmxhZ192YWx1ZXMsICJVbmtub3duIiwgZHNhcF9maWVsZCAmIExMQ19JRyksCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24iLCBzc2FwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsbGNfZmxhZ192YWx1ZXMsICJVbmtub3duIiwgc3NhcF9maWVsZCAmIExMQ19HU0FQKSk7CisKKwkJaWYgKGlzX3UpIHsKKwkJCXByaW50ZigiLCBjdHJsIDB4JTAyeDogIiwgY29udHJvbCk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiwgY3RybCAweCUwNHg6ICIsIGNvbnRyb2wpOworCQl9CisJfQorCisJaWYgKHNzYXAgPT0gTExDU0FQXzgwMjFEICYmIGRzYXAgPT0gTExDU0FQXzgwMjFEICYmCisJICAgIGNvbnRyb2wgPT0gTExDX1VJKSB7CisJCXN0cF9wcmludChwKzMsIGxlbmd0aC0zKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlpZiAoc3NhcCA9PSBMTENTQVBfSVAgJiYgZHNhcCA9PSBMTENTQVBfSVAgJiYKKwkgICAgY29udHJvbCA9PSBMTENfVUkpIHsKKwkJaXBfcHJpbnQoZ25kbywgcCs0LCBsZW5ndGgtNCk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKHNzYXAgPT0gTExDU0FQX0lQWCAmJiBkc2FwID09IExMQ1NBUF9JUFggJiYKKwkgICAgY29udHJvbCA9PSBMTENfVUkpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhbiBFdGhlcm5ldF84MDIuMiBJUFggZnJhbWUsIHdpdGggYW4gODAyLjMKKwkJICogaGVhZGVyIGFuZCBhbiA4MDIuMiBMTEMgaGVhZGVyIHdpdGggdGhlIHNvdXJjZSBhbmQKKwkJICogZGVzdGluYXRpb24gU0FQcyBiZWluZyB0aGUgSVBYIFNBUC4KKwkJICoKKwkJICogU2tpcCBEU0FQLCBMU0FQLCBhbmQgY29udHJvbCBmaWVsZC4KKwkJICovCisgICAgICAgICAgICAgICAgaWYgKGVmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJUFggODAyLjI6ICIpOworCisJCWlweF9wcmludChwKzMsIGxlbmd0aC0zKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKyNpZmRlZiBUQ1BEVU1QX0RPX1NNQgorCWlmIChzc2FwID09IExMQ1NBUF9ORVRCRVVJICYmIGRzYXAgPT0gTExDU0FQX05FVEJFVUkKKwkgICAgJiYgKCEoY29udHJvbCAmIExMQ19TX0ZNVCkgfHwgY29udHJvbCA9PSBMTENfVV9GTVQpKSB7CisJCS8qCisJCSAqIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBmdWxsIG5ldGJldWkgcGFyc2VyIHlldCwgYnV0IHRoZQorCQkgKiBzbWIgcGFyc2VyIGNhbiBoYW5kbGUgbWFueSBzbWItaW4tbmV0YmV1aSBwYWNrZXRzLCB3aGljaAorCQkgKiBpcyB2ZXJ5IHVzZWZ1bCwgc28gd2UgY2FsbCB0aGF0CisJCSAqCisJCSAqIFdlIGRvbid0IGNhbGwgaXQgZm9yIFMgZnJhbWVzLCBob3dldmVyLCBqdXN0IEkgZnJhbWVzCisJCSAqICh3aGljaCBhcmUgZnJhbWVzIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgbG93LW9yZGVyIGJpdCwKKwkJICogTExDX1NfRk1ULCBzZXQgaW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGNvbnRyb2wgZmllbGQpCisJCSAqIGFuZCBVSSBmcmFtZXMgKHdob3NlIGNvbnRyb2wgZmllbGQgaXMganVzdCAzLCBMTENfVV9GTVQpLgorCQkgKi8KKworCQkvKgorCQkgKiBTa2lwIHRoZSBMTEMgaGVhZGVyLgorCQkgKi8KKwkJaWYgKGlzX3UpIHsKKwkJCXAgKz0gMzsKKwkJCWxlbmd0aCAtPSAzOworCQkJY2FwbGVuIC09IDM7CisJCX0gZWxzZSB7CisJCQlwICs9IDQ7CisJCQlsZW5ndGggLT0gNDsKKwkJCWNhcGxlbiAtPSA0OworCQl9CisJCW5ldGJldWlfcHJpbnQoY29udHJvbCwgcCwgbGVuZ3RoKTsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYKKwlpZiAoc3NhcCA9PSBMTENTQVBfSVNPTlMgJiYgZHNhcCA9PSBMTENTQVBfSVNPTlMKKwkgICAgJiYgY29udHJvbCA9PSBMTENfVUkpIHsKKwkJaXNvY2xuc19wcmludChwICsgMywgbGVuZ3RoIC0gMywgY2FwbGVuIC0gMyk7CisJCXJldHVybiAoMSk7CisJfQorCisJaWYgKHNzYXAgPT0gTExDU0FQX1NOQVAgJiYgZHNhcCA9PSBMTENTQVBfU05BUAorCSAgICAmJiBjb250cm9sID09IExMQ19VSSkgeworCQkvKgorCQkgKiBYWFggLSB3aGF0ICppcyogdGhlIHJpZ2h0IGJyaWRnZSBwYWQgdmFsdWUgaGVyZT8KKwkJICogRG9lcyBhbnlib2R5IGV2ZXIgYnJpZGdlIG9uZSBmb3JtIG9mIExBTiB0cmFmZmljCisJCSAqIG92ZXIgYSBuZXR3b3JraW5nIHR5cGUgdGhhdCB1c2VzIDgwMi4yIExMQz8KKwkJICovCisJCXJldCA9IHNuYXBfcHJpbnQocCszLCBsZW5ndGgtMywgY2FwbGVuLTMsIGV4dHJhY3RlZF9ldGhlcnR5cGUsCisJCSAgICAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAocmV0KTsKKwl9CisKKwlpZiAoIWVmbGFnKSB7CisJCWlmIChzc2FwID09IGRzYXApIHsKKwkJCWlmIChlc3JjID09IE5VTEwgfHwgZWRzdCA9PSBOVUxMKQorCQkJCSh2b2lkKXByaW50ZigiJXMgIiwgdG9rMnN0cihsbGNfdmFsdWVzLCAiVW5rbm93biBEU0FQIDB4JTAyeCIsIGRzYXApKTsKKwkJCWVsc2UKKwkJCQkodm9pZClwcmludGYoIiVzID4gJXMgJXMgIiwKKwkJCQkJCWV0aGVyYWRkcl9zdHJpbmcoZXNyYyksCisJCQkJCQlldGhlcmFkZHJfc3RyaW5nKGVkc3QpLAorCQkJCQkJdG9rMnN0cihsbGNfdmFsdWVzLCAiVW5rbm93biBEU0FQIDB4JTAyeCIsIGRzYXApKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChlc3JjID09IE5VTEwgfHwgZWRzdCA9PSBOVUxMKQorCQkJCSh2b2lkKXByaW50ZigiJXMgPiAlcyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24gU1NBUCAweCUwMngiLCBzc2FwKSwKKwkJCQkJdG9rMnN0cihsbGNfdmFsdWVzLCAiVW5rbm93biBEU0FQIDB4JTAyeCIsIGRzYXApKTsKKwkJCWVsc2UKKwkJCQkodm9pZClwcmludGYoIiVzICVzID4gJXMgJXMgIiwKKwkJCQkJZXRoZXJhZGRyX3N0cmluZyhlc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY192YWx1ZXMsICJVbmtub3duIFNTQVAgMHglMDJ4Iiwgc3NhcCksCisJCQkJCWV0aGVyYWRkcl9zdHJpbmcoZWRzdCksCisJCQkJCXRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24gRFNBUCAweCUwMngiLCBkc2FwKSk7CisJCX0KKwl9CisKKwlpZiAoaXNfdSkgeworCQlwcmludGYoIlVubnVtYmVyZWQsICVzLCBGbGFncyBbJXNdLCBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY19jbWRfdmFsdWVzLCAiJTAyeCIsIExMQ19VX0NNRChjb250cm9sKSksCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX2ZsYWdfdmFsdWVzLCI/Iiwoc3NhcF9maWVsZCAmIExMQ19HU0FQKSB8IChjb250cm9sICYgTExDX1VfUE9MTCkpLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworCisJCXAgKz0gMzsKKwkJbGVuZ3RoIC09IDM7CisJCWNhcGxlbiAtPSAzOworCisJCWlmICgoY29udHJvbCAmIH5MTENfVV9QT0xMKSA9PSBMTENfWElEKSB7CisJCQlpZiAoKnAgPT0gTExDX1hJRF9GSSkgeworCQkJCXByaW50ZigiOiAlMDJ4ICUwMngiLCBwWzFdLCBwWzJdKTsKKwkJCQlwICs9IDM7CisJCQkJbGVuZ3RoIC09IDM7CisJCQkJY2FwbGVuIC09IDM7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGNvbnRyb2wgJiBMTENfU19GTVQpID09IExMQ19TX0ZNVCkgeworCQkJKHZvaWQpcHJpbnRmKCJTdXBlcnZpc29yeSwgJXMsIHJjdiBzZXEgJXUsIEZsYWdzIFslc10sIGxlbmd0aCAldSIsCisJCQkJdG9rMnN0cihsbGNfc3VwZXJ2aXNvcnlfdmFsdWVzLCI/IixMTENfU19DTUQoY29udHJvbCkpLAorCQkJCUxMQ19JU19OUihjb250cm9sKSwKKwkJCQl0b2syc3RyKGxsY19mbGFnX3ZhbHVlcywiPyIsKHNzYXBfZmllbGQgJiBMTENfR1NBUCkgfCAoY29udHJvbCAmIExMQ19JU19QT0xMKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisJCX0gZWxzZSB7CisJCQkodm9pZClwcmludGYoIkluZm9ybWF0aW9uLCBzZW5kIHNlcSAldSwgcmN2IHNlcSAldSwgRmxhZ3MgWyVzXSwgbGVuZ3RoICV1IiwKKwkJCQlMTENfSV9OUyhjb250cm9sKSwKKwkJCQlMTENfSVNfTlIoY29udHJvbCksCisJCQkJdG9rMnN0cihsbGNfZmxhZ192YWx1ZXMsIj8iLChzc2FwX2ZpZWxkICYgTExDX0dTQVApIHwgKGNvbnRyb2wgJiBMTENfSVNfUE9MTCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworCQl9CisJCXAgKz0gNDsKKwkJbGVuZ3RoIC09IDQ7CisJCWNhcGxlbiAtPSA0OworCX0KKwlyZXR1cm4oMSk7Cit9CisKK2ludAorc25hcF9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuLAorICAgIHVfc2hvcnQgKmV4dHJhY3RlZF9ldGhlcnR5cGUsIHVfaW50IGJyaWRnZV9wYWQpCit7CisJdV9pbnQzMl90IG9yZ2NvZGU7CisJcmVnaXN0ZXIgdV9zaG9ydCBldDsKKwlyZWdpc3RlciBpbnQgcmV0OworCisJVENIRUNLMigqcCwgNSk7CisJb3JnY29kZSA9IEVYVFJBQ1RfMjRCSVRTKHApOworCWV0ID0gRVhUUkFDVF8xNkJJVFMocCArIDMpOworCisJaWYgKGVmbGFnKSB7CisJCWNvbnN0IHN0cnVjdCB0b2sgKnRvayA9IG51bGxfdmFsdWVzOworCQljb25zdCBzdHJ1Y3Qgb3VpX3RvayAqb3RwOworCisJCWZvciAob3RwID0gJm91aV90b190b2tbMF07IG90cC0+dG9rICE9IE5VTEw7IG90cCsrKSB7CisJCQlpZiAob3RwLT5vdWkgPT0gb3JnY29kZSkgeworCQkJCXRvayA9IG90cC0+dG9rOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCSh2b2lkKXByaW50Zigib3VpICVzICgweCUwNngpLCAlcyAlcyAoMHglMDR4KTogIiwKKwkJICAgICB0b2syc3RyKG91aV92YWx1ZXMsICJVbmtub3duIiwgb3JnY29kZSksCisJCSAgICAgb3JnY29kZSwKKwkJICAgICAob3JnY29kZSA9PSAweDAwMDAwMCA/ICJldGhlcnR5cGUiIDogInBpZCIpLAorCQkgICAgIHRvazJzdHIodG9rLCAiVW5rbm93biIsIGV0KSwKKwkJICAgICBldCk7CisJfQorCXAgKz0gNTsKKwlsZW5ndGggLT0gNTsKKwljYXBsZW4gLT0gNTsKKworCXN3aXRjaCAob3JnY29kZSkgeworCWNhc2UgT1VJX0VOQ0FQX0VUSEVSOgorCWNhc2UgT1VJX0NJU0NPXzkwOgorCQkvKgorCQkgKiBUaGlzIGlzIGFuIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCBwYWNrZXQsCisJCSAqIG9yIGEgcGFja2V0IGJyaWRnZWQgYnkgc29tZSBwaWVjZSBvZgorCQkgKiBDaXNjbyBoYXJkd2FyZTsgdGhlIHByb3RvY29sIElEIGlzCisJCSAqIGFuIEV0aGVybmV0IHByb3RvY29sIHR5cGUuCisJCSAqLworCQlyZXQgPSBldGhlcl9lbmNhcF9wcmludChldCwgcCwgbGVuZ3RoLCBjYXBsZW4sCisJCSAgICBleHRyYWN0ZWRfZXRoZXJ0eXBlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAocmV0KTsKKwkJYnJlYWs7CisKKwljYXNlIE9VSV9BUFBMRVRBTEs6CisJCWlmIChldCA9PSBFVEhFUlRZUEVfQVRBTEspIHsKKwkJCS8qCisJCQkgKiBObywgSSBoYXZlIG5vIGlkZWEgd2h5IEFwcGxlIHVzZWQgb25lCisJCQkgKiBvZiB0aGVpciBvd24gT1VJcywgcmF0aGVyIHRoYW4KKwkJCSAqIDB4MDAwMDAwLCBhbmQgYW4gRXRoZXJuZXQgcGFja2V0CisJCQkgKiB0eXBlLCBmb3IgQXBwbGV0YWxrIGRhdGEgcGFja2V0cywKKwkJCSAqIGJ1dCB1c2VkIDB4MDAwMDAwIGFuZCBhbiBFdGhlcm5ldAorCQkJICogcGFja2V0IHR5cGUgZm9yIEFBUlAgcGFja2V0cy4KKwkJCSAqLworCQkJcmV0ID0gZXRoZXJfZW5jYXBfcHJpbnQoZXQsIHAsIGxlbmd0aCwgY2FwbGVuLAorCQkJICAgIGV4dHJhY3RlZF9ldGhlcnR5cGUpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gKHJldCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9VSV9DSVNDTzoKKwkJaWYgKGV0ID09IFBJRF9DSVNDT19DRFApIHsKKwkJCWNkcF9wcmludChwLCBsZW5ndGgsIGNhcGxlbik7CisJCQlyZXR1cm4gKDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBPVUlfUkZDMjY4NDoKKwkJc3dpdGNoIChldCkgeworCisJCWNhc2UgUElEX1JGQzI2ODRfRVRIX0ZDUzoKKwkJY2FzZSBQSURfUkZDMjY4NF9FVEhfTk9GQ1M6CisJCQkvKgorCQkJICogWFhYIC0gcmVtb3ZlIHRoZSBsYXN0IHR3byBieXRlcyBmb3IKKwkJCSAqIFBJRF9SRkMyNjg0X0VUSF9GQ1M/CisJCQkgKi8KKwkJCS8qCisJCQkgKiBTa2lwIHRoZSBwYWRkaW5nLgorCQkJICovCisJCQlUQ0hFQ0syKCpwLCBicmlkZ2VfcGFkKTsKKwkJCWNhcGxlbiAtPSBicmlkZ2VfcGFkOworCQkJbGVuZ3RoIC09IGJyaWRnZV9wYWQ7CisJCQlwICs9IGJyaWRnZV9wYWQ7CisKKwkJCS8qCisJCQkgKiBXaGF0IHJlbWFpbnMgaXMgYW4gRXRoZXJuZXQgcGFja2V0LgorCQkJICovCisJCQlldGhlcl9wcmludChwLCBsZW5ndGgsIGNhcGxlbik7CisJCQlyZXR1cm4gKDEpOworCisJCWNhc2UgUElEX1JGQzI2ODRfODAyXzVfRkNTOgorCQljYXNlIFBJRF9SRkMyNjg0XzgwMl81X05PRkNTOgorCQkJLyoKKwkJCSAqIFhYWCAtIHJlbW92ZSB0aGUgbGFzdCB0d28gYnl0ZXMgZm9yCisJCQkgKiBQSURfUkZDMjY4NF9FVEhfRkNTPworCQkJICovCisJCQkvKgorCQkJICogU2tpcCB0aGUgcGFkZGluZywgYnV0IG5vdCB0aGUgQWNjZXNzCisJCQkgKiBDb250cm9sIGZpZWxkLgorCQkJICovCisJCQlUQ0hFQ0syKCpwLCBicmlkZ2VfcGFkKTsKKwkJCWNhcGxlbiAtPSBicmlkZ2VfcGFkOworCQkJbGVuZ3RoIC09IGJyaWRnZV9wYWQ7CisJCQlwICs9IGJyaWRnZV9wYWQ7CisKKwkJCS8qCisJCQkgKiBXaGF0IHJlbWFpbnMgaXMgYW4gODAyLjUgVG9rZW4gUmluZworCQkJICogcGFja2V0LgorCQkJICovCisJCQl0b2tlbl9wcmludChwLCBsZW5ndGgsIGNhcGxlbik7CisJCQlyZXR1cm4gKDEpOworCisJCWNhc2UgUElEX1JGQzI2ODRfRkRESV9GQ1M6CisJCWNhc2UgUElEX1JGQzI2ODRfRkRESV9OT0ZDUzoKKwkJCS8qCisJCQkgKiBYWFggLSByZW1vdmUgdGhlIGxhc3QgdHdvIGJ5dGVzIGZvcgorCQkJICogUElEX1JGQzI2ODRfRVRIX0ZDUz8KKwkJCSAqLworCQkJLyoKKwkJCSAqIFNraXAgdGhlIHBhZGRpbmcuCisJCQkgKi8KKwkJCVRDSEVDSzIoKnAsIGJyaWRnZV9wYWQgKyAxKTsKKwkJCWNhcGxlbiAtPSBicmlkZ2VfcGFkICsgMTsKKwkJCWxlbmd0aCAtPSBicmlkZ2VfcGFkICsgMTsKKwkJCXAgKz0gYnJpZGdlX3BhZCArIDE7CisKKwkJCS8qCisJCQkgKiBXaGF0IHJlbWFpbnMgaXMgYW4gRkRESSBwYWNrZXQuCisJCQkgKi8KKwkJCWZkZGlfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4pOworCQkJcmV0dXJuICgxKTsKKworCQljYXNlIFBJRF9SRkMyNjg0X0JQRFU6CisJCQlzdHBfcHJpbnQocCwgbGVuZ3RoKTsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKKwordHJ1bmM6CisJKHZvaWQpcHJpbnRmKCJbfHNuYXBdIik7CisJcmV0dXJuICgxKTsKK30KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtbG1wLmMgYi9wcmludC1sbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQxNjZmCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbG1wLmMKQEAgLTAsMCArMSw4ODEgQEAKKy8qCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICogU3VwcG9ydCBmb3IgTE1QIHNlcnZpY2UgZGlzY292ZXJ5IGV4dGVuc2lvbnMgKGRlZmluZWQgYnkgVU5JIDEuMCkgYWRkZWQKKyAqIGJ5IE1hbnUgUGF0aGFrIChtYXBhdGhha0BjaXNjby5jb20pLCBNYXkgMjAwNQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxtcC5jLHYgMS41LjIuNCAyMDA2LzA2LzIzIDAyOjA3OjI3IGhhbm5lcyBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImdtcGxzLmgiCisKKy8qCisgKiBMTVAgY29tbW9uIGhlYWRlcgorICoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBWZXJzICB8ICAgICAgKFJlc2VydmVkKSAgICAgICB8ICAgIEZsYWdzICAgICAgfCAgICBNc2cgVHlwZSAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgIExNUCBMZW5ndGggICAgICAgICAgIHwgICAgICAgICAgKFJlc2VydmVkKSAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworCitzdHJ1Y3QgbG1wX2NvbW1vbl9oZWFkZXIgeworICAgIHVfaW50OF90IHZlcnNpb25fcmVzWzJdOworICAgIHVfaW50OF90IGZsYWdzOyAgIAorICAgIHVfaW50OF90IG1zZ190eXBlOworICAgIHVfaW50OF90IGxlbmd0aFsyXTsKKyAgICB1X2ludDhfdCByZXNlcnZlZFsyXTsKK307CisKKyNkZWZpbmUgTE1QX1ZFUlNJT04gICAgICAgICAgICAxCisjZGVmaW5lCUxNUF9FWFRSQUNUX1ZFUlNJT04oeCkgKCgoeCkmMHhmMCk+PjQpIAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfaGVhZGVyX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAiQ29udHJvbCBDaGFubmVsIERvd24ifSwKKyAgICB7IDB4MDIsICJMTVAgcmVzdGFydCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfdGVfbGlua19mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIkZhdWx0IE1hbmFnZW1lbnQgU3VwcG9ydGVkIn0sCisgICAgeyAweDAyLCAiTGluayBWZXJpZmljYXRpb24gU3VwcG9ydGVkIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9kYXRhX2xpbmtfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJEYXRhIExpbmsgUG9ydCJ9LAorICAgIHsgMHgwMiwgIkFsbG9jYXRlZCBmb3IgdXNlciB0cmFmZmljIn0sCisgICAgeyAweDA0LCAiRmFpbGVkIGxpbmsifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX2NoYW5uZWxfc3RhdHVzX3ZhbHVlc1tdID0geworICAgIHsgMSwgIlNpZ25hbCBPa2F5In0sCisgICAgeyAyLCAiU2lnbmFsIERlZ3JhZGVkIn0sCisgICAgeyAzLCAiU2lnbmFsIEZhaWwifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX2JlZ2luX3ZlcmlmeV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMDAxLCAiVmVyaWZ5IGFsbCBsaW5rcyJ9LAorICAgIHsgMHgwMDAyLCAiRGF0YSBsaW5rIHR5cGUifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX2JlZ2luX3ZlcmlmeV9lcnJvcl92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJcblx0XHRMaW5rIFZlcmlmaWNhdGlvbiBQcm9jZWR1cmUgTm90IHN1cHBvcnRlZCJ9LAorICAgIHsgMHgwMiwgIlxuXHRcdFVud2lsbGluZyB0byB2ZXJpZnkifSwKKyAgICB7IDB4MDQsICJcblx0XHRVbnN1cHBvcnRlZCB2ZXJpZmljYXRpb24gdHJhbnNwb3J0IG1lY2hhbmlzbSJ9LAorICAgIHsgMHgwOCwgIlxuXHRcdExpbmtfSWQgY29uZmlndXJhdGlvbiBlcnJvciJ9LAorICAgIHsgMHgxMCwgIlxuXHRcdFVua25vd24gb2JqZWN0IGMtdHlwZSJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfbGlua19zdW1tYXJ5X2Vycm9yX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIlxuXHRcdFVuYWNjZXB0YWJsZSBub24tbmVnb3RpYWJsZSBMSU5LX1NVTU1BUlkgcGFyYW1ldGVycyJ9LAorICAgIHsgMHgwMiwgIlxuXHRcdFJlbmVnb3RpYXRlIExJTktfU1VNTUFSWSBwYXJhbWV0ZXJzIn0sCisgICAgeyAweDA0LCAiXG5cdFx0SW52YWxpZCBURS1MSU5LIE9iamVjdCJ9LAorICAgIHsgMHgwOCwgIlxuXHRcdEludmFsaWQgREFUQS1MSU5LIE9iamVjdCJ9LAorICAgIHsgMHgxMCwgIlxuXHRcdFVua25vd24gVEUtTElOSyBPYmplY3QgYy10eXBlIn0sCisgICAgeyAweDIwLCAiXG5cdFx0VW5rbm93biBEQVRBLUxJTksgT2JqZWN0IGMtdHlwZSJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKKy8qIFNlcnZpY2UgQ29uZmlnIFN1cHBvcnRlZCBQcm90b2NvbHMgRmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfc2VydmljZV9jb25maWdfc3BfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJSU1ZQIFN1cHBvcnRlZCJ9LAorICAgIHsgMHgwMiwgIkxEUCBTdXBwb3J0ZWQifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBTZXJ2aWNlIENvbmZpZyBDbGllbnQgUG9ydCBTZXJ2aWNlIEF0dHJpYnV0ZSBUcmFuc3BhcmVuY3kgRmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfc2VydmljZV9jb25maWdfY3BzYV90cF9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIlBhdGgvVkMgT3ZlcmhlYWQgVHJhbnNwYXJlbmN5IFN1cHBvcnRlZCJ9LAorICAgIHsgMHgwMiwgIkxpbmUvTVMgT3ZlcmhlYWQgVHJhbnNwYXJlbmN5IFN1cHBvcnRlZCJ9LAorICAgIHsgMHgwNCwgIlNlY3Rpb24vUlMgT3ZlcmhlYWQgVHJhbnNwYXJlbmN5IFN1cHBvcnRlZCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKKy8qIFNlcnZpY2UgQ29uZmlnIENsaWVudCBQb3J0IFNlcnZpY2UgQXR0cmlidXRlIENvbnRpZ3VvdXMgQ29uY2F0ZW5hdGlvbiBUeXBlcyBGbGFncyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19jcHNhX2NjdF9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIkNvbnRpZ3VvdXMgQ29uY2F0ZW5hdGlvbiBUeXBlcyBTdXBwb3J0ZWQifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBTZXJ2aWNlIENvbmZpZyBOZXR3b3JrIFNlcnZpY2UgQXR0cmlidXRlcyBUcmFuc3BhcmVuY3kgRmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX3RyYW5zcGFyZW5jeV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIlN0YW5kYXJkIFNPSC9SU09IIFRyYW5zcGFyZW5jeSBTdXBwb3J0ZWQifSwKKyAgICB7IDB4MDIsICJTdGFuZGFyZCBMT0gvTVNPSCBUcmFuc3BhcmVuY3kgU3VwcG9ydGVkIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogU2VydmljZSBDb25maWcgTmV0d29yayBTZXJ2aWNlIEF0dHJpYnV0ZXMgVENNIE1vbml0b3JpbmcgRmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX3RjbV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIlRyYW5zcGFyZW50IFRhbmRlbSBDb25uZWN0aW9uIE1vbml0b3JpbmcgU3VwcG9ydGVkIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogTmV0d29yayBTZXJ2aWNlIEF0dHJpYnV0ZXMgTmV0d29yayBEaXZlcnNpdHkgRmxhZ3MgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX25ldHdvcmtfZGl2ZXJzaXR5X2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLCAiTm9kZSBEaXZlcnNpdHkgU3VwcG9ydGVkIn0sCisgICAgeyAweDAyLCAiTGluayBEaXZlcnNpdHkgU3VwcG9ydGVkIn0sCisgICAgeyAweDA0LCAiU1JMRyBEaXZlcnNpdHkgU3VwcG9ydGVkIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZQlMTVBfTVNHVFlQRV9DT05GSUcgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUJTE1QX01TR1RZUEVfQ09ORklHX0FDSyAgICAgICAgICAgICAyCisjZGVmaW5lCUxNUF9NU0dUWVBFX0NPTkZJR19OQUNLICAgICAgICAgICAgMworI2RlZmluZQlMTVBfTVNHVFlQRV9IRUxMTyAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUJTE1QX01TR1RZUEVfVkVSSUZZX0JFR0lOICAgICAgICAgICA1CisjZGVmaW5lCUxNUF9NU0dUWVBFX1ZFUklGWV9CRUdJTl9BQ0sgICAgICAgNgorI2RlZmluZQlMTVBfTVNHVFlQRV9WRVJJRllfQkVHSU5fTkFDSyAgICAgIDcKKyNkZWZpbmUgTE1QX01TR1RZUEVfVkVSSUZZX0VORCAgICAgICAgICAgICA4CisjZGVmaW5lIExNUF9NU0dUWVBFX1ZFUklGWV9FTkRfQUNLICAgICAgICAgOQorI2RlZmluZSBMTVBfTVNHVFlQRV9URVNUICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTE1QX01TR1RZUEVfVEVTVF9TVEFUVVNfU1VDQ0VTUyAgIDExCisjZGVmaW5lCUxNUF9NU0dUWVBFX1RFU1RfU1RBVFVTX0ZBSUxVUkUgICAxMgorI2RlZmluZQlMTVBfTVNHVFlQRV9URVNUX1NUQVRVU19BQ0sgICAgICAgMTMKKyNkZWZpbmUJTE1QX01TR1RZUEVfTElOS19TVU1NQVJZICAgICAgICAgIDE0CisjZGVmaW5lCUxNUF9NU0dUWVBFX0xJTktfU1VNTUFSWV9BQ0sgICAgICAxNQorI2RlZmluZQlMTVBfTVNHVFlQRV9MSU5LX1NVTU1BUllfTkFDSyAgICAgMTYKKyNkZWZpbmUJTE1QX01TR1RZUEVfQ0hBTk5FTF9TVEFUVVMgICAgICAgIDE3CisjZGVmaW5lCUxNUF9NU0dUWVBFX0NIQU5ORUxfU1RBVFVTX0FDSyAgICAxOAorI2RlZmluZQlMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVU19SRVEgICAgMTkKKyNkZWZpbmUJTE1QX01TR1RZUEVfQ0hBTk5FTF9TVEFUVVNfUkVTUCAgIDIwCisvKiBMTVAgU2VydmljZSBEaXNjb3ZlcnkgbWVzc2FnZSB0eXBlcyBkZWZpbmVkIGJ5IFVOSSAxLjAgKi8KKyNkZWZpbmUgTE1QX01TR1RZUEVfU0VSVklDRV9DT05GSUcgICAgICAgIDUwCisjZGVmaW5lIExNUF9NU0dUWVBFX1NFUlZJQ0VfQ09ORklHX0FDSyAgICA1MQorI2RlZmluZSBMTVBfTVNHVFlQRV9TRVJWSUNFX0NPTkZJR19OQUNLICAgNTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX21zZ190eXBlX3ZhbHVlc1tdID0geworICAgIHsgTE1QX01TR1RZUEVfQ09ORklHLCAiQ29uZmlnIn0sCisgICAgeyBMTVBfTVNHVFlQRV9DT05GSUdfQUNLLCAiQ29uZmlnIEFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfQ09ORklHX05BQ0ssICJDb25maWcgTkFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfSEVMTE8sICJIZWxsbyJ9LAorICAgIHsgTE1QX01TR1RZUEVfVkVSSUZZX0JFR0lOLCAiQmVnaW4gVmVyaWZ5In0sCisgICAgeyBMTVBfTVNHVFlQRV9WRVJJRllfQkVHSU5fQUNLLCAiQmVnaW4gVmVyaWZ5IEFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfVkVSSUZZX0JFR0lOX05BQ0ssICJCZWdpbiBWZXJpZnkgTkFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfVkVSSUZZX0VORCwgIkVuZCBWZXJpZnkifSwKKyAgICB7IExNUF9NU0dUWVBFX1ZFUklGWV9FTkRfQUNLLCAiRW5kIFZlcmlmeSBBQ0sifSwKKyAgICB7IExNUF9NU0dUWVBFX1RFU1QsICJUZXN0In0sCisgICAgeyBMTVBfTVNHVFlQRV9URVNUX1NUQVRVU19TVUNDRVNTLCAiVGVzdCBTdGF0dXMgU3VjY2VzcyJ9LAorICAgIHsgTE1QX01TR1RZUEVfVEVTVF9TVEFUVVNfRkFJTFVSRSwgIlRlc3QgU3RhdHVzIEZhaWx1cmUifSwKKyAgICB7IExNUF9NU0dUWVBFX1RFU1RfU1RBVFVTX0FDSywgIlRlc3QgU3RhdHVzIEFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfTElOS19TVU1NQVJZLCAiTGluayBTdW1tYXJ5In0sCisgICAgeyBMTVBfTVNHVFlQRV9MSU5LX1NVTU1BUllfQUNLLCAiTGluayBTdW1tYXJ5IEFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfTElOS19TVU1NQVJZX05BQ0ssICJMaW5rIFN1bW1hcnkgTkFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfQ0hBTk5FTF9TVEFUVVMsICJDaGFubmVsIFN0YXR1cyJ9LAorICAgIHsgTE1QX01TR1RZUEVfQ0hBTk5FTF9TVEFUVVNfQUNLLCAiQ2hhbm5lbCBTdGF0dXMgQUNLIn0sCisgICAgeyBMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVU19SRVEsICJDaGFubmVsIFN0YXR1cyBSZXF1ZXN0In0sCisgICAgeyBMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVU19SRVNQLCAiQ2hhbm5lbCBTdGF0dXMgUmVzcG9uc2UifSwKKyAgICB7IExNUF9NU0dUWVBFX1NFUlZJQ0VfQ09ORklHLCAiU2VydmljZSBDb25maWcifSwKKyAgICB7IExNUF9NU0dUWVBFX1NFUlZJQ0VfQ09ORklHX0FDSywgIlNlcnZpY2UgQ29uZmlnIEFDSyJ9LAorICAgIHsgTE1QX01TR1RZUEVfU0VSVklDRV9DT05GSUdfTkFDSywgIlNlcnZpY2UgQ29uZmlnIE5BQ0sifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiAKKyAqIExNUCBvYmplY3QgaGVhZGVyCisgKgorICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8TnwgICBDLVR5cGUgICAgfCAgICAgQ2xhc3MgICAgIHwgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAvLyAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdCBjb250ZW50cykgICAgICAgICAgICAgICAgICAgICAvLworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rIAorICovCisKK3N0cnVjdCBsbXBfb2JqZWN0X2hlYWRlciB7CisgICAgdV9pbnQ4X3QgY3R5cGU7CisgICAgdV9pbnQ4X3QgY2xhc3NfbnVtOworICAgIHVfaW50OF90IGxlbmd0aFsyXTsKK307CisKKyNkZWZpbmUJTE1QX09CSl9DQ19JRCAgICAgICAgICAgICAgICAgMQorI2RlZmluZQlMTVBfT0JKX05PREVfSUQgICAgICAgICAgICAgICAyCisjZGVmaW5lCUxNUF9PQkpfTElOS19JRCAgICAgICAgICAgICAgIDMKKyNkZWZpbmUJTE1QX09CSl9JTlRFUkZBQ0VfSUQgICAgICAgICAgNAorI2RlZmluZQlMTVBfT0JKX01FU1NBR0VfSUQgICAgICAgICAgICA1IAorI2RlZmluZQlMTVBfT0JKX0NPTkZJRyAgICAgICAgICAgICAgICA2CisjZGVmaW5lCUxNUF9PQkpfSEVMTE8gICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUJTE1QX09CSl9WRVJJRllfQkVHSU4gICAgICAgICAgOAorI2RlZmluZSBMTVBfT0JKX1ZFUklGWV9CRUdJTl9BQ0sgICAgICA5CisjZGVmaW5lIExNUF9PQkpfVkVSSUZZX0lEICAgICAgICAgICAgMTAKKyNkZWZpbmUgTE1QX09CSl9URV9MSU5LICAgICAgICAgICAgICAxMQorI2RlZmluZSBMTVBfT0JKX0RBVEFfTElOSyAgICAgICAgICAgIDEyCisjZGVmaW5lIExNUF9PQkpfQ0hBTk5FTF9TVEFUVVMgICAgICAgMTMKKyNkZWZpbmUgTE1QX09CSl9DSEFOTkVMX1NUQVRVU19SRVEgICAxNAorI2RlZmluZSBMTVBfT0JKX0VSUk9SX0NPREUgICAgICAgICAgIDIwCisKKyNkZWZpbmUgTE1QX09CSl9TRVJWSUNFX0NPTkZJRyAgICAgICA1MSAvKiBkZWZpbmVkIGluIFVOSSAxLjAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial92YWx1ZXNbXSA9IHsKKyAgICB7IExNUF9PQkpfQ0NfSUQsICJDb250cm9sIENoYW5uZWwgSUQiIH0sCisgICAgeyBMTVBfT0JKX05PREVfSUQsICJOb2RlIElEIiB9LAorICAgIHsgTE1QX09CSl9MSU5LX0lELCAiTGluayBJRCIgfSwKKyAgICB7IExNUF9PQkpfSU5URVJGQUNFX0lELCAiSW50ZXJmYWNlIElEIiB9LAorICAgIHsgTE1QX09CSl9NRVNTQUdFX0lELCAiTWVzc2FnZSBJRCIgfSwKKyAgICB7IExNUF9PQkpfQ09ORklHLCAiQ29uZmlndXJhdGlvbiIgfSwKKyAgICB7IExNUF9PQkpfSEVMTE8sICJIZWxsbyIgfSwKKyAgICB7IExNUF9PQkpfVkVSSUZZX0JFR0lOLCAiVmVyaWZ5IEJlZ2luIiB9LAorICAgIHsgTE1QX09CSl9WRVJJRllfQkVHSU5fQUNLLCAiVmVyaWZ5IEJlZ2luIEFDSyIgfSwKKyAgICB7IExNUF9PQkpfVkVSSUZZX0lELCAiVmVyaWZ5IElEIiB9LAorICAgIHsgTE1QX09CSl9URV9MSU5LLCAiVEUgTGluayIgfSwKKyAgICB7IExNUF9PQkpfREFUQV9MSU5LLCAiRGF0YSBMaW5rIiB9LAorICAgIHsgTE1QX09CSl9DSEFOTkVMX1NUQVRVUywgIkNoYW5uZWwgU3RhdHVzIiB9LAorICAgIHsgTE1QX09CSl9DSEFOTkVMX1NUQVRVU19SRVEsICJDaGFubmVsIFN0YXR1cyBSZXF1ZXN0IiB9LAorICAgIHsgTE1QX09CSl9FUlJPUl9DT0RFLCAiRXJyb3IgQ29kZSIgfSwKKyAgICB7IExNUF9PQkpfU0VSVklDRV9DT05GSUcsICJTZXJ2aWNlIENvbmZpZyIgfSwKKworICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUgSU5UX1NXSVRDSElOR19UWVBFX1NVQk9CSiAxCisjZGVmaW5lIFdBVkVMRU5HVEhfU1VCT0JKICAgICAgICAgMgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfZGF0YV9saW5rX3N1Ym9ialtdID0geworICAgIHsgSU5UX1NXSVRDSElOR19UWVBFX1NVQk9CSiwgIkludGVyZmFjZSBTd2l0Y2hpbmcgVHlwZSIgfSwKKyAgICB7IFdBVkVMRU5HVEhfU1VCT0JKICAgICAgICAsICJXYXZlbGVuZ3RoIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUJTE1QX0NUWVBFX0lQVjQgICAgICAgMQorI2RlZmluZQlMTVBfQ1RZUEVfSVBWNiAgICAgICAyCisKKyNkZWZpbmUJTE1QX0NUWVBFX0xPQyAgICAgICAgMQorI2RlZmluZQlMTVBfQ1RZUEVfUk1UICAgICAgICAyCisjZGVmaW5lCUxNUF9DVFlQRV9VTk1EICAgICAgIDMKKyAKKyNkZWZpbmUJTE1QX0NUWVBFX0lQVjRfTE9DICAgMQorI2RlZmluZQlMTVBfQ1RZUEVfSVBWNF9STVQgICAyCisjZGVmaW5lCUxNUF9DVFlQRV9JUFY2X0xPQyAgIDMKKyNkZWZpbmUJTE1QX0NUWVBFX0lQVjZfUk1UICAgNAorI2RlZmluZQlMTVBfQ1RZUEVfVU5NRF9MT0MgICA1ICAKKyNkZWZpbmUJTE1QX0NUWVBFX1VOTURfUk1UICAgNiAKKworI2RlZmluZQlMTVBfQ1RZUEVfMSAgICAgICAgICAxCisjZGVmaW5lCUxNUF9DVFlQRV8yICAgICAgICAgIDIKKworI2RlZmluZSBMTVBfQ1RZUEVfSEVMTE9fQ09ORklHICAxCisjZGVmaW5lIExNUF9DVFlQRV9IRUxMTyAgICAgICAgIDEKKworI2RlZmluZSBMTVBfQ1RZUEVfQkVHSU5fVkVSSUZZX0VSUk9SIDEKKyNkZWZpbmUgTE1QX0NUWVBFX0xJTktfU1VNTUFSWV9FUlJPUiAyCisKKy8qIEMtVHlwZXMgZm9yIFNlcnZpY2UgQ29uZmlnIE9iamVjdCAqLworI2RlZmluZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfU1AgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfQ1BTQSAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfVFJBTlNQQVJFTkNZX1RDTSAgICAgMworI2RlZmluZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfTkVUV09SS19ESVZFUlNJVFkgICAgNAorCisvKiAKKyAqIERpZmZlcmVudCBsaW5rIHR5cGVzIGFsbG93ZWQgaW4gdGhlIENsaWVudCBQb3J0IFNlcnZpY2UgQXR0cmlidXRlcworICogc3Vib2JqZWN0IGRlZmluZWQgZm9yIExNUCBTZXJ2aWNlIERpc2NvdmVyeSBpbiB0aGUgVU5JIDEuMCBzcGVjCisgKi8KKyNkZWZpbmUgTE1QX1NEX1NFUlZJQ0VfQ09ORklHX0NQU0FfTElOS19UWVBFX1NESCAgICAgNSAvKiBVTkkgMS4wIFNlYyA5LjQuMiAqLworI2RlZmluZSBMTVBfU0RfU0VSVklDRV9DT05GSUdfQ1BTQV9MSU5LX1RZUEVfU09ORVQgICA2IC8qIFVOSSAxLjAgU2VjIDkuNC4yICovCisKKy8qCisgKiB0aGUgY3R5cGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlIHNvIGZvcgorICogdHJhbnNsYXRpbmcgaXQgdG8gc3RyaW5ncyB3ZSBidWlsZCBhIHRhYmxlIGJhc2VkCisgKiBvbiBvYmplY3RzIG9mZnNldHRlZCBieSB0aGUgY3R5cGUKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfY3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyAyNTYqTE1QX09CSl9DQ19JRCtMTVBfQ1RZUEVfTE9DLCAiTG9jYWwiIH0sCisgICAgeyAyNTYqTE1QX09CSl9DQ19JRCtMTVBfQ1RZUEVfUk1ULCAiUmVtb3RlIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfTk9ERV9JRCtMTVBfQ1RZUEVfTE9DLCAiTG9jYWwiIH0sCisgICAgeyAyNTYqTE1QX09CSl9OT0RFX0lEK0xNUF9DVFlQRV9STVQsICJSZW1vdGUiIH0sCisgICAgeyAyNTYqTE1QX09CSl9MSU5LX0lEK0xNUF9DVFlQRV9JUFY0X0xPQywgIklQdjQgTG9jYWwiIH0sCisgICAgeyAyNTYqTE1QX09CSl9MSU5LX0lEK0xNUF9DVFlQRV9JUFY0X1JNVCwgIklQdjQgUmVtb3RlIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfTElOS19JRCtMTVBfQ1RZUEVfSVBWNl9MT0MsICJJUHY2IExvY2FsIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfTElOS19JRCtMTVBfQ1RZUEVfSVBWNl9STVQsICJJUHY2IFJlbW90ZSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0xJTktfSUQrTE1QX0NUWVBFX1VOTURfTE9DLCAiVW5udW1iZXJlZCBMb2NhbCIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0xJTktfSUQrTE1QX0NUWVBFX1VOTURfUk1ULCAiVW5udW1iZXJlZCBSZW1vdGUiIH0sCisgICAgeyAyNTYqTE1QX09CSl9JTlRFUkZBQ0VfSUQrTE1QX0NUWVBFX0lQVjRfTE9DLCAiSVB2NCBMb2NhbCIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0lOVEVSRkFDRV9JRCtMTVBfQ1RZUEVfSVBWNF9STVQsICJJUHY0IFJlbW90ZSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0lOVEVSRkFDRV9JRCtMTVBfQ1RZUEVfSVBWNl9MT0MsICJJUHY2IExvY2FsIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfSU5URVJGQUNFX0lEK0xNUF9DVFlQRV9JUFY2X1JNVCwgIklQdjYgUmVtb3RlIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfSU5URVJGQUNFX0lEK0xNUF9DVFlQRV9VTk1EX0xPQywgIlVubnVtYmVyZWQgTG9jYWwiIH0sCisgICAgeyAyNTYqTE1QX09CSl9JTlRFUkZBQ0VfSUQrTE1QX0NUWVBFX1VOTURfUk1ULCAiVW5udW1iZXJlZCBSZW1vdGUiIH0sCisgICAgeyAyNTYqTE1QX09CSl9NRVNTQUdFX0lEK0xNUF9DVFlQRV8xLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX01FU1NBR0VfSUQrTE1QX0NUWVBFXzIsICIyIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfQ09ORklHK0xNUF9DVFlQRV8xLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0hFTExPK0xNUF9DVFlQRV8xLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1ZFUklGWV9CRUdJTitMTVBfQ1RZUEVfMSwgIjEiIH0sCisgICAgeyAyNTYqTE1QX09CSl9WRVJJRllfQkVHSU5fQUNLK0xNUF9DVFlQRV8xLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1ZFUklGWV9JRCtMTVBfQ1RZUEVfMSwgIjEiIH0sCisgICAgeyAyNTYqTE1QX09CSl9URV9MSU5LK0xNUF9DVFlQRV9JUFY0LCAiSVB2NCIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1RFX0xJTksrTE1QX0NUWVBFX0lQVjYsICJJUHY2IiB9LAorICAgIHsgMjU2KkxNUF9PQkpfVEVfTElOSytMTVBfQ1RZUEVfVU5NRCwgIlVubnVtYmVyZWQiIH0sCisgICAgeyAyNTYqTE1QX09CSl9EQVRBX0xJTksrTE1QX0NUWVBFX0lQVjQsICJJUHY0IiB9LAorICAgIHsgMjU2KkxNUF9PQkpfREFUQV9MSU5LK0xNUF9DVFlQRV9JUFY2LCAiSVB2NiIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0RBVEFfTElOSytMTVBfQ1RZUEVfVU5NRCwgIlVubnVtYmVyZWQiIH0sCisgICAgeyAyNTYqTE1QX09CSl9DSEFOTkVMX1NUQVRVUytMTVBfQ1RZUEVfSVBWNCwgIklQdjQiIH0sCisgICAgeyAyNTYqTE1QX09CSl9DSEFOTkVMX1NUQVRVUytMTVBfQ1RZUEVfSVBWNiwgIklQdjYiIH0sCisgICAgeyAyNTYqTE1QX09CSl9DSEFOTkVMX1NUQVRVUytMTVBfQ1RZUEVfVU5NRCwgIlVubnVtYmVyZWQiIH0sCisgICAgeyAyNTYqTE1QX09CSl9DSEFOTkVMX1NUQVRVU19SRVErTE1QX0NUWVBFX0lQVjQsICJJUHY0IiB9LAorICAgIHsgMjU2KkxNUF9PQkpfQ0hBTk5FTF9TVEFUVVNfUkVRK0xNUF9DVFlQRV9JUFY2LCAiSVB2NiIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0NIQU5ORUxfU1RBVFVTX1JFUStMTVBfQ1RZUEVfVU5NRCwgIlVubnVtYmVyZWQiIH0sCisgICAgeyAyNTYqTE1QX09CSl9FUlJPUl9DT0RFK0xNUF9DVFlQRV8xLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX0VSUk9SX0NPREUrTE1QX0NUWVBFXzIsICIyIiB9LAorICAgIHsgMjU2KkxNUF9PQkpfU0VSVklDRV9DT05GSUcrTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX1NQLCAiMSIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1NFUlZJQ0VfQ09ORklHK0xNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19DUFNBLCAiMiIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1NFUlZJQ0VfQ09ORklHK0xNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19UUkFOU1BBUkVOQ1lfVENNLCAiMyIgfSwKKyAgICB7IDI1NipMTVBfT0JKX1NFUlZJQ0VfQ09ORklHK0xNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19ORVRXT1JLX0RJVkVSU0lUWSwgIjQiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKwordm9pZAorbG1wX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKSB7CisKKyAgICBjb25zdCBzdHJ1Y3QgbG1wX2NvbW1vbl9oZWFkZXIgKmxtcF9jb21faGVhZGVyOworICAgIGNvbnN0IHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlciAqbG1wX29ial9oZWFkZXI7CisgICAgY29uc3QgdV9jaGFyICp0cHRyLCpvYmpfdHB0cjsKKyAgICBpbnQgdGxlbixsbXBfb2JqX2xlbixsbXBfb2JqX2N0eXBlLG9ial90bGVuOworICAgIGludCBoZXhkdW1wOworICAgIGludCBvZmZzZXQsc3Vib2JqX3R5cGUsc3Vib2JqX2xlbix0b3RhbF9zdWJvYmpfbGVuOworICAgIGludCBsaW5rX3R5cGU7CisKKyAgICB1bmlvbiB7IC8qIGludCB0byBmbG9hdCBjb252ZXJzaW9uIGJ1ZmZlciAqLworICAgICAgICBmbG9hdCBmOyAKKyAgICAgICAgdV9pbnQzMl90IGk7CisgICAgfSBidzsKKworICAgIHRwdHI9cHB0cjsKKyAgICBsbXBfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbG1wX2NvbW1vbl9oZWFkZXIgKilwcHRyOworICAgIFRDSEVDSygqbG1wX2NvbV9oZWFkZXIpOworCisgICAgLyoKKyAgICAgKiBTYW5pdHkgY2hlY2tpbmcgb2YgdGhlIGhlYWRlci4KKyAgICAgKi8KKyAgICBpZiAoTE1QX0VYVFJBQ1RfVkVSU0lPTihsbXBfY29tX2hlYWRlci0+dmVyc2lvbl9yZXNbMF0pICE9IExNUF9WRVJTSU9OKSB7CisJcHJpbnRmKCJMTVAgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICBMTVBfRVhUUkFDVF9WRVJTSU9OKGxtcF9jb21faGVhZGVyLT52ZXJzaW9uX3Jlc1swXSkpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgbGV0cyBwcmludCB0aGUgYmFzaWMgTWVzc2FnZSBUeXBlKi8KKyAgICBpZiAodmZsYWcgPCAxKSB7CisgICAgICAgIHByaW50ZigiTE1QdiV1ICVzIE1lc3NhZ2UsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgTE1QX0VYVFJBQ1RfVkVSU0lPTihsbXBfY29tX2hlYWRlci0+dmVyc2lvbl9yZXNbMF0pLAorICAgICAgICAgICAgICAgdG9rMnN0cihsbXBfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biAoJXUpIixsbXBfY29tX2hlYWRlci0+bXNnX3R5cGUpLAorICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCisKKyAgICB0bGVuPUVYVFJBQ1RfMTZCSVRTKGxtcF9jb21faGVhZGVyLT5sZW5ndGgpOworCisgICAgcHJpbnRmKCJcblx0TE1QdiV1LCBtc2ctdHlwZTogJXMsIEZsYWdzOiBbJXNdLCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgTE1QX0VYVFJBQ1RfVkVSU0lPTihsbXBfY29tX2hlYWRlci0+dmVyc2lvbl9yZXNbMF0pLAorICAgICAgICAgICB0b2syc3RyKGxtcF9tc2dfdHlwZV92YWx1ZXMsICJ1bmtub3duLCB0eXBlOiAldSIsbG1wX2NvbV9oZWFkZXItPm1zZ190eXBlKSwKKyAgICAgICAgICAgYml0dG9rMnN0cihsbXBfaGVhZGVyX2ZsYWdfdmFsdWVzLCJub25lIixsbXBfY29tX2hlYWRlci0+ZmxhZ3MpLAorICAgICAgICAgICB0bGVuKTsKKworICAgIHRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3QgbG1wX2NvbW1vbl9oZWFkZXIpOworICAgIHRsZW4tPXNpemVvZihjb25zdCBzdHJ1Y3QgbG1wX2NvbW1vbl9oZWFkZXIpOworCisgICAgd2hpbGUodGxlbj4wKSB7CisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG9iamVjdCBoZWFkZXIgPyAqLworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcikpKQorICAgICAgICAgICAgZ290byB0cnVuYzsKKworICAgICAgICBsbXBfb2JqX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbG1wX29iamVjdF9oZWFkZXIgKil0cHRyOworICAgICAgICBsbXBfb2JqX2xlbj1FWFRSQUNUXzE2QklUUyhsbXBfb2JqX2hlYWRlci0+bGVuZ3RoKTsKKyAgICAgICAgbG1wX29ial9jdHlwZT0obG1wX29ial9oZWFkZXItPmN0eXBlKSYweDdmOworCisgICAgICAgIGlmKGxtcF9vYmpfbGVuICUgNCB8fCBsbXBfb2JqX2xlbiA8IDQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBPYmplY3QgKCV1KSwgQ2xhc3MtVHlwZTogJXMgKCV1KSBGbGFnczogWyVzbmVnb3RpYWJsZV0sIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihsbXBfb2JqX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICBsbXBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSwKKyAgICAgICAgICAgICAgIGxtcF9vYmpfaGVhZGVyLT5jbGFzc19udW0sCisgICAgICAgICAgICAgICB0b2syc3RyKGxtcF9jdHlwZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKChsbXBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKTw8OCkrbG1wX29ial9jdHlwZSksCisgICAgICAgICAgICAgICBsbXBfb2JqX2N0eXBlLAorICAgICAgICAgICAgICAgKGxtcF9vYmpfaGVhZGVyLT5jdHlwZSkmMHg4MCA/ICIiIDogIm5vbi0iLAorICAgICAgICAgICAgICAgbG1wX29ial9sZW4pOworCisgICAgICAgIG9ial90cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcik7CisgICAgICAgIG9ial90bGVuPWxtcF9vYmpfbGVuLXNpemVvZihzdHJ1Y3QgbG1wX29iamVjdF9oZWFkZXIpOworCisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG9iamVjdCA/ICovCisgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBsbXBfb2JqX2xlbikpCisgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICBoZXhkdW1wPUZBTFNFOworCisgICAgICAgIHN3aXRjaChsbXBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSB7CisKKyAgICAgICAgY2FzZSBMTVBfT0JKX0NDX0lEOgorICAgICAgICAgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0xPQzoKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX1JNVDoKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQ29udHJvbCBDaGFubmVsIElEOiAldSAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExNUF9PQkpfTElOS19JRDoKKyAgICAgICAgY2FzZSBMTVBfT0JKX0lOVEVSRkFDRV9JRDoKKyAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9JUFY0X0xPQzoKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0lQVjRfUk1UOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBJUHY0IExpbmsgSUQ6ICVzICgweCUwOHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0lQVjZfTE9DOgorICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNl9STVQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIElQdjYgTGluayBJRDogJXMgKDB4JTA4eCkiLAorICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX1VOTURfTE9DOgorICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfVU5NRF9STVQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIExpbmsgSUQ6ICV1ICgweCUwOHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExNUF9PQkpfTUVTU0FHRV9JRDoKKyAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIExNUF9DVFlQRV8xOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBNZXNzYWdlIElEOiAldSAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFXzI6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE1lc3NhZ2UgSUQgQWNrOiAldSAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMTVBfT0JKX05PREVfSUQ6CisgICAgICAgICAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfTE9DOgorICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfUk1UOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBOb2RlIElEOiAlcyAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTE1QX09CSl9DT05GSUc6CisgICAgICAgICAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfSEVMTE9fQ09ORklHOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBIZWxsbyBJbnRlcnZhbDogJXVcblx0ICAgIEhlbGxvIERlYWQgSW50ZXJ2YWw6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJCisgICAgICAgIGNhc2UgTE1QX09CSl9IRUxMTzoKKyAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7CisJICAgIGNhc2UgTE1QX0NUWVBFX0hFTExPOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBUeFNlcU51bTogJXVcblx0ICAgIFJjdlNlcU51bTogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgICAgICAKKwkgICAgCisgICAgICAgIGNhc2UgTE1QX09CSl9URV9MSU5LOgorCQlwcmludGYoIlxuXHQgICAgRmxhZ3M6IFslc10iLAorCQliaXR0b2syc3RyKGxtcF9vYmpfdGVfbGlua19mbGFnX3ZhbHVlcywKKwkJCSJub25lIiwKKwkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKT4+OCkpOworICAgICAgICAgICAgCisJICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7CisJICAgIGNhc2UgTE1QX0NUWVBFX0lQVjQ6CisJCXByaW50ZigiXG5cdCAgICBMb2NhbCBMaW5rLUlEOiAlcyAoMHglMDh4KSBcCisJCQlcblx0ICAgIFJlbW90ZSBMaW5rLUlEOiAlcyAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrNCksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKzgpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis4KSk7CisJCWJyZWFrOworCQkKKyNpZmRlZiBJTkVUNgorCSAgICBjYXNlIExNUF9DVFlQRV9JUFY2OgorI2VuZGlmCisJICAgIGNhc2UgTE1QX0NUWVBFX1VOTUQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCQorICAgICAgICBjYXNlIExNUF9PQkpfREFUQV9MSU5LOgorCQlwcmludGYoIlxuXHQgICAgRmxhZ3M6IFslc10iLAorCQliaXR0b2syc3RyKGxtcF9vYmpfZGF0YV9saW5rX2ZsYWdfdmFsdWVzLAorCQkJIm5vbmUiLAorCQkJRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpPj44KSk7CisgICAgICAgICAgICAKKwkgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKKwkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNDoKKwkgICAgY2FzZSBMTVBfQ1RZUEVfVU5NRDoKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgTG9jYWwgSW50ZXJmYWNlIElEOiAlcyAoMHglMDh4KSBcCisJCQlcblx0ICAgIFJlbW90ZSBJbnRlcmZhY2UgSUQ6ICVzICgweCUwOHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cis0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCksCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrOCksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzgpKTsKKwkJCisJCXRvdGFsX3N1Ym9ial9sZW4gPSBsbXBfb2JqX2xlbiAtIDE2OwkgCisJCW9mZnNldCA9IDEyOworCQl3aGlsZSAodG90YWxfc3Vib2JqX2xlbiA+IDAgJiYgaGV4ZHVtcCA9PSBGQUxTRSApIHsKKwkJCXN1Ym9ial90eXBlID0gRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrb2Zmc2V0KT4+ODsKKwkJCXN1Ym9ial9sZW4gID0gRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrb2Zmc2V0KSYweDAwRkY7CisJCQlwcmludGYoIlxuXHQgICAgU3Vib2JqZWN0LCBUeXBlOiAlcyAoJXUpLCBMZW5ndGg6ICV1IiwKKwkJCQl0b2syc3RyKGxtcF9kYXRhX2xpbmtfc3Vib2JqLAorCQkJCQkiVW5rbm93biIsCisJCQkJCXN1Ym9ial90eXBlKSwKKwkJCQkJc3Vib2JqX3R5cGUsCisJCQkJCXN1Ym9ial9sZW4pOworCQkJc3dpdGNoKHN1Ym9ial90eXBlKSB7CisJCQljYXNlIElOVF9TV0lUQ0hJTkdfVFlQRV9TVUJPQko6CisJCQkJcHJpbnRmKCJcblx0ICAgICAgU3dpdGNoaW5nIFR5cGU6ICVzICgldSkiLAorCQkJCQl0b2syc3RyKGdtcGxzX3N3aXRjaF9jYXBfdmFsdWVzLCAKKwkJCQkJCSJVbmtub3duIiwgCisJCQkJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0citvZmZzZXQrMik+PjgpLAorCQkJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0citvZmZzZXQrMik+PjgpOworCQkJCXByaW50ZigiXG5cdCAgICAgIEVuY29kaW5nIFR5cGU6ICVzICgldSkiLAorCQkJCQl0b2syc3RyKGdtcGxzX2VuY29kaW5nX3ZhbHVlcywgCisJCQkJCQkiVW5rbm93biIsIAorCQkJCQkJRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrb2Zmc2V0KzIpJjB4MDBGRiksCisJCQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyK29mZnNldCsyKSYweDAwRkYpOworCQkJCWJ3LmkgPSBFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCk7CisJCQkJcHJpbnRmKCJcblx0ICAgICAgTWluIFJlc2VydmFibGUgQmFuZHdpZHRoOiAlLjNmIE1icHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDApOworCQkJCWJ3LmkgPSBFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrOCk7CisJCQkJcHJpbnRmKCJcblx0ICAgICAgTWF4IFJlc2VydmFibGUgQmFuZHdpZHRoOiAlLjNmIE1icHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDApOworCQkJCWJyZWFrOwkKKwkJCWNhc2UgV0FWRUxFTkdUSF9TVUJPQko6CisJCQkJcHJpbnRmKCJcblx0ICAgICAgV2F2ZWxlbmd0aDogJXUiLAorCQkJCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBBbnkgVW5rbm93biBTdWJvYmplY3QgPT0+IEV4aXQgbG9vcCAqLworCQkJCWhleGR1bXA9VFJVRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRvdGFsX3N1Ym9ial9sZW4tPXN1Ym9ial9sZW47CisJCQlvZmZzZXQrPXN1Ym9ial9sZW47CisJCX0KKwkJCisJCWJyZWFrOworI2lmZGVmIElORVQ2ICAgCisJICAgIGNhc2UgTE1QX0NUWVBFX0lQVjY6CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAgICAgCisJICAgIAorICAgICAgICBjYXNlIExNUF9PQkpfVkVSSUZZX0JFR0lOOgorCSAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfMToKKwkJcHJpbnRmKCJcblx0ICAgIEZsYWdzOiAlcyIsCisJCWJpdHRvazJzdHIobG1wX29ial9iZWdpbl92ZXJpZnlfZmxhZ192YWx1ZXMsCisJCQkibm9uZSIsCisJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cikpKTsKKwkJcHJpbnRmKCJcblx0ICAgIFZlcmlmeSBJbnRlcnZhbDogJXUiLAorCQkJRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpOworCQlwcmludGYoIlxuXHQgICAgRGF0YSBsaW5rczogJXUiLAorCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpOworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBFbmNvZGluZyB0eXBlOiAlcyIsCisJCQl0b2syc3RyKGdtcGxzX2VuY29kaW5nX3ZhbHVlcywgIlVua25vd24iLCAqKG9ial90cHRyKzgpKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFZlcmlmeSBUcmFucG9ydCBNZWNoYW5pc206ICV1ICgweCV4KSAlcyIsCisJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxMCksCisJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxMCksCisJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxMCkmODAwMCA/ICIoUGF5bG9hZCB0ZXN0IG1lc3NhZ2VzIGNhcGFibGUpIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrMTIpOworCQlwcmludGYoIlxuXHQgICAgVHJhbnNtaXNzaW9uIFJhdGU6ICUuM2YgTWJwcyIsYncuZio4LzEwMDAwMDApOworCQlwcmludGYoIlxuXHQgICAgV2F2ZWxlbmd0aDogJXUiLAorCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrMTYpKTsKKwkJYnJlYWs7CisJCQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgICAgICAKKwkKKyAgICAgICAgY2FzZSBMTVBfT0JKX1ZFUklGWV9CRUdJTl9BQ0s6CisJICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIExNUF9DVFlQRV8xOgorICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBWZXJpZnkgRGVhZCBJbnRlcnZhbDogJXUgCVwKKwkJCVxuXHQgICAgVmVyaWZ5IFRyYW5zcG9ydCBSZXNwb25zZTogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorICAgICAgICAKKwljYXNlIExNUF9PQkpfVkVSSUZZX0lEOgorCSAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfMToKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgVmVyaWZ5IElEOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJCQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgICAgICAKKyAgICAgICAgCisJY2FzZSBMTVBfT0JKX0NIQU5ORUxfU1RBVFVTOgorICAgICAgICAgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKKwkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNDoKKwkgICAgY2FzZSBMTVBfQ1RZUEVfVU5NRDoKKwkJb2Zmc2V0ID0gMDsKKwkJLyogRGVjb2RlIHBhaXJzOiA8SW50ZXJmYWNlX0lEICg0IGJ5dGVzKSwgQ2hhbm5lbF9zdGF0dXMgKDQgYnl0ZXMpPiAqLworCQl3aGlsZSAob2Zmc2V0IDwgKGxtcF9vYmpfbGVuLShpbnQpc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcikpICkgeworCQkJcHJpbnRmKCJcblx0ICAgIEludGVyZmFjZSBJRDogJXMgKDB4JTA4eCkiLAorCQkJaXBhZGRyX3N0cmluZyhvYmpfdHB0citvZmZzZXQpLAorCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KSk7CisJCQkKKwkJCXByaW50ZigiXG5cdFx0ICAgIEFjdGl2ZTogJXMgKCV1KSIsIAkJKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KT4+MzEpID8gCisJCQkJCQkiQWxsb2NhdGVkIiA6ICJOb24tYWxsb2NhdGVkIiwKKwkJCQkoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KzQpPj4zMSkpOworCQkJCisJCQlwcmludGYoIlxuXHRcdCAgICBEaXJlY3Rpb246ICVzICgldSkiLCAoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KzQpPj4zMCkmMHgxID8gCisJCQkJCQkiVHJhbnNtaXQiIDogIlJlY2VpdmUiLAorCQkJCShFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCk+PjMwKSYweDEpOwkKKwkJCQkJCQorCQkJcHJpbnRmKCJcblx0XHQgICAgQ2hhbm5lbCBTdGF0dXM6ICVzICgldSkiLAorCQkJCQl0b2syc3RyKGxtcF9vYmpfY2hhbm5lbF9zdGF0dXNfdmFsdWVzLAorCQkJIAkJIlVua25vd24iLAorCQkJCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCkmMHgzRkZGRkZGKSwKKwkJCUVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KSYweDNGRkZGRkYpOworCQkJb2Zmc2V0Kz04OworCQl9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYgICAgICAgCisJICAgIGNhc2UgTE1QX0NUWVBFX0lQVjY6CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAgICAgCisgICAgICAgIAorCWNhc2UgTE1QX09CSl9DSEFOTkVMX1NUQVRVU19SRVE6CisgICAgICAgICAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgeworCSAgICBjYXNlIExNUF9DVFlQRV9JUFY0OgorCSAgICBjYXNlIExNUF9DVFlQRV9VTk1EOgorCQlvZmZzZXQgPSAwOworCQl3aGlsZSAob2Zmc2V0IDwgKGxtcF9vYmpfbGVuLShpbnQpc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcikpICkgeworCQkJcHJpbnRmKCJcblx0ICAgIEludGVyZmFjZSBJRDogJXMgKDB4JTA4eCkiLAorCQkJaXBhZGRyX3N0cmluZyhvYmpfdHB0citvZmZzZXQpLAorCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KSk7CisJCQlvZmZzZXQrPTQ7CisJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNiAgICAgICAKKwkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNjoKKyNlbmRpZgorCSAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorCQorICAgICAgICBjYXNlIExNUF9PQkpfRVJST1JfQ09ERToKKwkgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0JFR0lOX1ZFUklGWV9FUlJPUjoKKwkJcHJpbnRmKCJcblx0ICAgIEVycm9yIENvZGU6ICVzIiwKKwkJYml0dG9rMnN0cihsbXBfb2JqX2JlZ2luX3ZlcmlmeV9lcnJvcl92YWx1ZXMsCisJCQkibm9uZSIsCisJCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwkJCisgICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9MSU5LX1NVTU1BUllfRVJST1I6CisJCXByaW50ZigiXG5cdCAgICBFcnJvciBDb2RlOiAlcyIsCisJCWJpdHRvazJzdHIobG1wX29ial9saW5rX3N1bW1hcnlfZXJyb3JfdmFsdWVzLAorCQkJIm5vbmUiLAorCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOyAgICAgIAorCisJY2FzZSBMTVBfT0JKX1NFUlZJQ0VfQ09ORklHOgorCSAgICBzd2l0Y2ggKGxtcF9vYmpfY3R5cGUpIHsKKwkgICAgY2FzZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfU1A6CisJCQorCQlwcmludGYoIlxuXHQgRmxhZ3M6ICVzIiwKKwkJICAgICAgIGJpdHRvazJzdHIobG1wX29ial9zZXJ2aWNlX2NvbmZpZ19zcF9mbGFnX3ZhbHVlcywKKwkJCQkgICJub25lIiwgCisJCQkJICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cik+PjgpKTsKKworCQlwcmludGYoIlxuXHQgIFVOSSBWZXJzaW9uOiAldSIsCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cikgJiAweDAwRkYpOworCisJCWJyZWFrOworCQkKKyAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX0NQU0E6CisJCQorCQlsaW5rX3R5cGUgPSBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cik+Pjg7CisJCQorCQlwcmludGYoIlxuXHQgTGluayBUeXBlOiAlcyAoJXUpIiwKKwkJICAgICAgIHRvazJzdHIobG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2FfbGlua190eXBlX3ZhbHVlcywKKwkJCSAgICAgICAiVW5rbm93biIsIGxpbmtfdHlwZSksCisJCSAgICAgICBsaW5rX3R5cGUpOworCQkKKwkJaWYgKGxpbmtfdHlwZSA9PSBMTVBfU0RfU0VSVklDRV9DT05GSUdfQ1BTQV9MSU5LX1RZUEVfU0RIKSB7CisJCSAgICBwcmludGYoIlxuXHQgU2lnbmFsIFR5cGU6ICVzICgldSkiLAorCQkJICAgdG9rMnN0cihsbXBfc2Rfc2VydmljZV9jb25maWdfY3BzYV9zaWduYWxfdHlwZV9zZGhfdmFsdWVzLAorCQkJCSAgICJVbmtub3duIiwKKwkJCQkgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cikgJiAweDAwRkYpLAorCQkJICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpICYgMHgwMEZGKTsKKwkJfQorCQkKKwkJaWYgKGxpbmtfdHlwZSA9PSBMTVBfU0RfU0VSVklDRV9DT05GSUdfQ1BTQV9MSU5LX1RZUEVfU09ORVQpIHsKKwkJICAgIHByaW50ZigiXG5cdCBTaWduYWwgVHlwZTogJXMgKCV1KSIsCisJCQkgICB0b2syc3RyKGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NvbmV0X3ZhbHVlcywKKwkJCQkgICAiVW5rbm93biIsCisJCQkJICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpICYgMHgwMEZGKSwKKwkJCSAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSAmIDB4MDBGRik7CisJCX0KKwkJCisJCXByaW50ZigiXG5cdCBUcmFuc3BhcmVuY3k6ICVzIiwKKwkJICAgICAgIGJpdHRvazJzdHIobG1wX29ial9zZXJ2aWNlX2NvbmZpZ19jcHNhX3RwX2ZsYWdfdmFsdWVzLAorCQkJCSAgIm5vbmUiLAorCQkJCSAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMik+PjgpKTsKKwkJCisJCXByaW50ZigiXG5cdCBDb250aWd1b3VzIENvbmNhdGVuYXRpb24gVHlwZXM6ICVzIiwKKwkJICAgICAgIGJpdHRvazJzdHIobG1wX29ial9zZXJ2aWNlX2NvbmZpZ19jcHNhX2NjdF9mbGFnX3ZhbHVlcywKKwkJCQkgICJub25lIiwKKwkJCQkgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpPj44ICYgMHgwMEZGKSk7CisJCQorCQlwcmludGYoIlxuXHQgTWluaW11bSBOQ0M6ICV1IiwKKwkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzQpKTsKKwkJCisJCXByaW50ZigiXG5cdCBNYXhpbXVtIE5DQzogJXUiLAorCQkgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOworCQkKKwkJcHJpbnRmKCJcblx0IE1pbmltdW0gTlZDOiV1IiwKKwkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzgpKTsKKwkJCisJCXByaW50ZigiXG5cdCBNYXhpbXVtIE5WQzoldSIsCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxMCkpOworCQkKKwkJcHJpbnRmKCJcblx0ICAgIExvY2FsIEludGVyZmFjZSBJRDogJXMgKDB4JTA4eCkiLAorCQkgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cisxMiksCisJCSAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cisxMikpOworCQkKKwkJYnJlYWs7CisJCQorCSAgICBjYXNlIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19UUkFOU1BBUkVOQ1lfVENNOgorCQkKKwkJcHJpbnRmKCJcblx0IFRyYW5zcGFyZW5jeSBGbGFnczogJXMiLAorCQkgICAgICAgYml0dG9rMnN0cigKKwkJCSAgIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX3RyYW5zcGFyZW5jeV9mbGFnX3ZhbHVlcywKKwkJCSAgICJub25lIiwKKwkJCSAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSkpOworCisJCXByaW50ZigiXG5cdCBUQ00gTW9uaXRvcmluZyBGbGFnczogJXMiLAorCQkgICAgICAgYml0dG9rMnN0cigKKwkJCSAgIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX3RjbV9mbGFnX3ZhbHVlcywKKwkJCSAgICJub25lIiwKKwkJCSAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpICYgMHgwMEZGKSk7CisJCQorCQlicmVhazsKKwkJCisJICAgIGNhc2UgTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX05FVFdPUktfRElWRVJTSVRZOgorCQkKKwkJcHJpbnRmKCJcblx0IERpdmVyc2l0eTogRmxhZ3M6ICVzIiwKKwkJICAgICAgIGJpdHRvazJzdHIoCisJCQkgICBsbXBfb2JqX3NlcnZpY2VfY29uZmlnX25zYV9uZXR3b3JrX2RpdmVyc2l0eV9mbGFnX3ZhbHVlcywKKwkJCSAgICJub25lIiwKKwkJCSAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpICYgMHgwMEZGKSk7CisJCWJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJCWhleGR1bXAgPSBUUlVFOworCSAgICB9OworCisJYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShvYmpfdHB0ciwiXG5cdCAgICAiLG9ial90bGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KKyAgICAgICAgaWYgKHZmbGFnID4gMSB8fCBoZXhkdW1wPT1UUlVFKQorICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrc2l6ZW9mKHNpemVvZihzdHJ1Y3QgbG1wX29iamVjdF9oZWFkZXIpKSwiXG5cdCAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtcF9vYmpfbGVuLXNpemVvZihzdHJ1Y3QgbG1wX29iamVjdF9oZWFkZXIpKTsKKworICAgICAgICB0cHRyKz1sbXBfb2JqX2xlbjsKKyAgICAgICAgdGxlbi09bG1wX29ial9sZW47CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtbHNwcGluZy5jIGIvcHJpbnQtbHNwcGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MGNkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1sc3BwaW5nLmMKQEAgLTAsMCArMSw4NjcgQEAKKy8qCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxzcHBpbmcuYyx2IDEuMTIuMi42IDIwMDYvMDYvMjMgMDI6MDc6MjcgaGFubmVzIEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKyNpbmNsdWRlICJiZ3AuaCIKKyNpbmNsdWRlICJsMnZwbi5oIgorCisvKgorICogTFNQUElORyBjb21tb24gaGVhZGVyCisgKgorICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgVmVyc2lvbiBOdW1iZXIgICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgIE1lc3NhZ2UgVHlwZSB8ICAgUmVwbHkgbW9kZSAgfCAgUmV0dXJuIENvZGUgIHwgUmV0dXJuIFN1YmNvZGV8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRlcidzIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgIFRpbWVTdGFtcCBTZW50IChzZWNvbmRzKSAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgIFRpbWVTdGFtcCBTZW50IChtaWNyb3NlY29uZHMpICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgVGltZVN0YW1wIFJlY2VpdmVkIChzZWNvbmRzKSAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgVGltZVN0YW1wIFJlY2VpdmVkIChtaWNyb3NlY29uZHMpICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTFZzIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqLworCitzdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyIHsKKyAgICB1X2ludDhfdCB2ZXJzaW9uWzJdOworICAgIHVfaW50OF90IHJlc2VydmVkWzJdOworICAgIHVfaW50OF90IG1zZ190eXBlOworICAgIHVfaW50OF90IHJlcGx5X21vZGU7ICAgCisgICAgdV9pbnQ4X3QgcmV0dXJuX2NvZGU7ICAgCisgICAgdV9pbnQ4X3QgcmV0dXJuX3N1YmNvZGU7ICAgCisgICAgdV9pbnQ4X3Qgc2VuZGVyX2hhbmRsZVs0XTsKKyAgICB1X2ludDhfdCBzZXFfbnVtYmVyWzRdOworICAgIHVfaW50OF90IHRzX3NlbnRfc2VjWzRdOworICAgIHVfaW50OF90IHRzX3NlbnRfdXNlY1s0XTsKKyAgICB1X2ludDhfdCB0c19yY3ZkX3NlY1s0XTsKKyAgICB1X2ludDhfdCB0c19yY3ZkX3VzZWNbNF07Cit9OworCisjZGVmaW5lIExTUFBJTkdfVkVSU0lPTiAgICAgICAgICAgIDEKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ19tc2dfdHlwZV92YWx1ZXNbXSA9IHsKKyAgICB7IDEsICJNUExTIEVjaG8gUmVxdWVzdCJ9LAorICAgIHsgMiwgIk1QTFMgRWNobyBSZXBseSJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfcmVwbHlfbW9kZV92YWx1ZXNbXSA9IHsKKyAgICB7IDEsICJEbyBub3QgcmVwbHkifSwKKyAgICB7IDIsICJSZXBseSB2aWEgYW4gSVB2NC9JUHY2IFVEUCBwYWNrZXQifSwKKyAgICB7IDMsICJSZXBseSB2aWEgYW4gSVB2NC9JUHY2IFVEUCBwYWNrZXQgd2l0aCBSb3V0ZXIgQWxlcnQifSwKKyAgICB7IDQsICJSZXBseSB2aWEgYXBwbGljYXRpb24gbGV2ZWwgY29udHJvbCBjaGFubmVsIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ19yZXR1cm5fY29kZV92YWx1ZXNbXSA9IHsKKyAgICB7ICAwLCAiTm8gcmV0dXJuIGNvZGUgb3IgcmV0dXJuIGNvZGUgY29udGFpbmVkIGluIHRoZSBFcnJvciBDb2RlIFRMViJ9LAorICAgIHsgIDEsICJNYWxmb3JtZWQgZWNobyByZXF1ZXN0IHJlY2VpdmVkIn0sCisgICAgeyAgMiwgIk9uZSBvciBtb3JlIG9mIHRoZSBUTFZzIHdhcyBub3QgdW5kZXJzdG9vZCJ9LAorICAgIHsgIDMsICJSZXBseWluZyByb3V0ZXIgaXMgYW4gZWdyZXNzIGZvciB0aGUgRkVDIGF0IHN0YWNrIGRlcHRoIn0sCisgICAgeyAgNCwgIlJlcGx5aW5nIHJvdXRlciBoYXMgbm8gbWFwcGluZyBmb3IgdGhlIEZFQyBhdCBzdGFjayBkZXB0aCJ9LAorICAgIHsgIDUsICJSZXNlcnZlZCJ9LAorICAgIHsgIDYsICJSZXNlcnZlZCJ9LAorICAgIHsgIDcsICJSZXNlcnZlZCJ9LAorICAgIHsgIDgsICJMYWJlbCBzd2l0Y2hlZCBhdCBzdGFjay1kZXB0aCJ9LAorICAgIHsgIDksICJMYWJlbCBzd2l0Y2hlZCBidXQgbm8gTVBMUyBmb3J3YXJkaW5nIGF0IHN0YWNrLWRlcHRoIn0sCisgICAgeyAxMCwgIk1hcHBpbmcgZm9yIHRoaXMgRkVDIGlzIG5vdCB0aGUgZ2l2ZW4gbGFiZWwgYXQgc3RhY2sgZGVwdGgifSwKKyAgICB7IDExLCAiTm8gbGFiZWwgZW50cnkgYXQgc3RhY2stZGVwdGgifSwKKyAgICB7IDEyLCAiUHJvdG9jb2wgbm90IGFzc29jaWF0ZWQgd2l0aCBpbnRlcmZhY2UgYXQgRkVDIHN0YWNrIGRlcHRoIn0sCit9OworCisKKy8qIAorICogTFNQUElORyBUTFYgaGVhZGVyCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisKK3N0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgeworICAgIHVfaW50OF90IHR5cGVbMl07CisgICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOworfTsKKworI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRfRkVDX1NUQUNLICAgICAgMQorI2RlZmluZQlMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkcgICAgMgorI2RlZmluZQlMU1BQSU5HX1RMVl9QQUQgICAgICAgICAgICAgICAgICAgMworI2RlZmluZQlMU1BQSU5HX1RMVl9FUlJPUl9DT0RFICAgICAgICAgICAgNAorI2RlZmluZQlMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUiAgICAgMTUgLyogZHJhZnQtaWV0Zi1iZmQtbXBscy0wMiAqLworI2RlZmluZSBMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUl9MRU4gNAorI2RlZmluZQlMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURSAgICAgICAgMHhmYzAwCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfdGx2X3ZhbHVlc1tdID0geworICAgIHsgTFNQUElOR19UTFZfVEFSR0VUX0ZFQ19TVEFDSywgIlRhcmdldCBGRUMgU3RhY2siIH0sCisgICAgeyBMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkcsICJEb3duc3RyZWFtIE1hcHBpbmciIH0sCisgICAgeyBMU1BQSU5HX1RMVl9QQUQsICJQYWQiIH0sCisgICAgeyBMU1BQSU5HX1RMVl9FUlJPUl9DT0RFLCAiRXJyb3IgQ29kZSIgfSwKKyAgICB7IExTUFBJTkdfVExWX0JGRF9ESVNDUklNSU5BVE9SLCAiQkZEIERpc2NyaW1pbmF0b3IiIH0sCisgICAgeyBMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURSwgIlZlbmRvciBFbnRlcnByaXNlIENvZGUiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY0ICAgICAgMQorI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY2ICAgICAgMgorI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX1JTVlBfSVBWNCAgICAgMworI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX1JTVlBfSVBWNiAgICAgNAorI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjQgICAgNgorI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjYgICAgNworI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX0VORFBUICAgOAorI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX1ZDSURfT0xEIDkKKyNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEICAgMTAKKyNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNCAgICAgMTEKKyNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNiAgICAgMTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ190bHZ0YXJnZXRmZWNfc3VidGx2X3ZhbHVlc1tdID0geworICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MRFBfSVBWNCwgIkxEUCBJUHY0IHByZWZpeCJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MRFBfSVBWNiwgIkxEUCBJUHY2IHByZWZpeCJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjQsICJSU1ZQIElQdjQgU2Vzc2lvbiBRdWVyeSJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjYsICJSU1ZQIElQdjYgU2Vzc2lvbiBRdWVyeSJ9LAorICAgIHsgNSwgIlJlc2VydmVkIn0sCisgICAgeyBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjQsICJWUE4gSVB2NCBwcmVmaXgifSwKKyAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTDNWUE5fSVBWNiwgIlZQTiBJUHY2IHByZWZpeCJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9FTkRQVCwgIkwyIFZQTiBlbmRwb2ludCJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEX09MRCwgIkwyIGNpcmN1aXQgSUQgKG9sZCkifSwKKyAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTDJWUE5fVkNJRCwgIkwyIGNpcmN1aXQgSUQifSwKKyAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjQsICJCR1AgbGFiZWxlZCBJUHY0IHByZWZpeCJ9LAorICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNiwgIkJHUCBsYWJlbGVkIElQdjYgcHJlZml4In0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCB7CisgICAgdV9pbnQ4X3QgcHJlZml4IFs0XTsKKyAgICB1X2ludDhfdCBwcmVmaXhfbGVuOworfTsKKworLyoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICgxNiBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjZfdCB7CisgICAgdV9pbnQ4X3QgcHJlZml4IFsxNl07CisgICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKK307CisKKy8qCisgKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICBTZW5kZXIgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY0X3QgeworICAgIHVfaW50OF90IHNlbmRlcl9pZCBbNF07CisgICAgdV9pbnQ4X3QgcHJlZml4IFs0XTsKKyAgICB1X2ludDhfdCBwcmVmaXhfbGVuOworfTsKKworLyoKKyAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgIFNlbmRlciBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICgxNiBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgICAgICAgICAgTXVzdCBCZSBaZXJvICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjZfdCB7CisgICAgdV9pbnQ4X3Qgc2VuZGVyX2lkIFsxNl07CisgICAgdV9pbnQ4X3QgcHJlZml4IFsxNl07CisgICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKK307CisKKy8qCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgIElQdjQgdHVubmVsIGVuZCBwb2ludCBhZGRyZXNzICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICBUdW5uZWwgSUQgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBUdW5uZWwgSUQgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgSVB2NCB0dW5uZWwgc2VuZGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2NF90IHsKKyAgICB1X2ludDhfdCB0dW5uZWxfZW5kcG9pbnQgWzRdOworICAgIHVfaW50OF90IHJlc1syXTsKKyAgICB1X2ludDhfdCB0dW5uZWxfaWRbMl07CisgICAgdV9pbnQ4X3QgZXh0ZW5kZWRfdHVubmVsX2lkWzRdOworICAgIHVfaW50OF90IHR1bm5lbF9zZW5kZXIgWzRdOworICAgIHVfaW50OF90IHJlczJbMl07CisgICAgdV9pbnQ4X3QgbHNwX2lkIFsyXTsKK307CisKKy8qCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgIElQdjYgdHVubmVsIGVuZCBwb2ludCBhZGRyZXNzICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgIFR1bm5lbCBJRCAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBUdW5uZWwgSUQgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgSVB2NiB0dW5uZWwgc2VuZGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Nl90IHsKKyAgICB1X2ludDhfdCB0dW5uZWxfZW5kcG9pbnQgWzE2XTsKKyAgICB1X2ludDhfdCByZXNbMl07CisgICAgdV9pbnQ4X3QgdHVubmVsX2lkWzJdOworICAgIHVfaW50OF90IGV4dGVuZGVkX3R1bm5lbF9pZFsxNl07CisgICAgdV9pbnQ4X3QgdHVubmVsX3NlbmRlciBbMTZdOworICAgIHVfaW50OF90IHJlczJbMl07CisgICAgdV9pbnQ4X3QgbHNwX2lkIFsyXTsKK307CisKKy8qCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgUm91dGUgRGlzdGluZ3Vpc2hlciAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoOCBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjRfdCB7CisgICAgdV9pbnQ4X3QgcmQgWzhdOworICAgIHVfaW50OF90IHByZWZpeCBbNF07CisgICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKK307CisKKy8qCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgUm91dGUgRGlzdGluZ3Vpc2hlciAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoOCBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgcHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjZfdCB7CisgICAgdV9pbnQ4X3QgcmQgWzhdOworICAgIHVfaW50OF90IHByZWZpeCBbMTZdOworICAgIHVfaW50OF90IHByZWZpeF9sZW47Cit9OworCisvKgorICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIFJvdXRlIERpc3Rpbmd1aXNoZXIgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgKDggb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgU2VuZGVyJ3MgQ0UgSUQgICAgICAgIHwgICAgICAgUmVjZWl2ZXIncyBDRSBJRCAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICBFbmNhcHN1bGF0aW9uIFR5cGUgICAgICAgfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCB7CisgICAgdV9pbnQ4X3QgcmQgWzhdOworICAgIHVfaW50OF90IHNlbmRlcl9jZV9pZCBbMl07CisgICAgdV9pbnQ4X3QgcmVjZWl2ZXJfY2VfaWQgWzJdOworICAgIHVfaW50OF90IGVuY2Fwc3VsYXRpb25bMl07Cit9OworCisvKgorICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFBFIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgRW5jYXBzdWxhdGlvbiBUeXBlICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGRfdCB7CisgICAgdV9pbnQ4X3QgcmVtb3RlX3BlX2FkZHJlc3MgWzRdOworICAgIHVfaW50OF90IHZjX2lkIFs0XTsKKyAgICB1X2ludDhfdCBlbmNhcHN1bGF0aW9uWzJdOworfTsKKworLyoKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgU2VuZGVyJ3MgUEUgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFBFIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgRW5jYXBzdWxhdGlvbiBUeXBlICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqLworc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF90IHsKKyAgICB1X2ludDhfdCBzZW5kZXJfcGVfYWRkcmVzcyBbNF07CisgICAgdV9pbnQ4X3QgcmVtb3RlX3BlX2FkZHJlc3MgWzRdOworICAgIHVfaW50OF90IHZjX2lkIFs0XTsKKyAgICB1X2ludDhfdCBlbmNhcHN1bGF0aW9uWzJdOworfTsKKworLyoKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgIE1UVSAgICAgICAgICAgICB8IEFkZHJlc3MgVHlwZSAgfCAgUmVzdmQgKFNCWikgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgIERvd25zdHJlYW0gSVAgQWRkcmVzcyAoNCBvciAxNiBvY3RldHMpICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICBEb3duc3RyZWFtIEludGVyZmFjZSBBZGRyZXNzICg0IG9yIDE2IG9jdGV0cykgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBIYXNoIEtleSBUeXBlIHwgRGVwdGggTGltaXQgICB8ICAgICAgICBNdWx0aXBhdGggTGVuZ3RoICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgIChNdWx0aXBhdGggSW5mb3JtYXRpb24pICAgICAgICAgICAgICAgICAgIC4KKyAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgIERvd25zdHJlYW0gTGFiZWwgICAgICAgICAgICAgICAgfCAgICBQcm90b2NvbCAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgIERvd25zdHJlYW0gTGFiZWwgICAgICAgICAgICAgICAgfCAgICBQcm90b2NvbCAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgeworICAgIHVfaW50OF90IG10dSBbMl07CisgICAgdV9pbnQ4X3QgYWRkcmVzc190eXBlOworICAgIHVfaW50OF90IHJlczsKKyAgICB1X2ludDhfdCBkb3duc3RyZWFtX2lwWzRdOworICAgIHVfaW50OF90IGRvd25zdHJlYW1faW50ZXJmYWNlWzRdOworfTsKKworc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjZfdCB7CisgICAgdV9pbnQ4X3QgbXR1IFsyXTsKKyAgICB1X2ludDhfdCBhZGRyZXNzX3R5cGU7CisgICAgdV9pbnQ4X3QgcmVzOworICAgIHVfaW50OF90IGRvd25zdHJlYW1faXBbMTZdOworICAgIHVfaW50OF90IGRvd25zdHJlYW1faW50ZXJmYWNlWzE2XTsKK307CisKK3N0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgeworICAgIHVfaW50OF90IGhhc2hfa2V5X3R5cGU7CisgICAgdV9pbnQ4X3QgZGVwdGhfbGltaXQ7CisgICAgdV9pbnQ4X3QgbXVsdGlwYXRoX2xlbmd0aCBbMl07Cit9OworCisjZGVmaW5lIExTUFBJTkdfQUZJX0lQVjQgMQorI2RlZmluZSBMU1BQSU5HX0FGSV9VTk1CIDIKKyNkZWZpbmUgTFNQUElOR19BRklfSVBWNiAzCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fYWRkcl92YWx1ZXNbXSA9IHsKKyAgICB7IExTUFBJTkdfQUZJX0lQVjQsICJJUHY0In0sCisgICAgeyBMU1BQSU5HX0FGSV9JUFY2LCAiSVB2NiJ9LAorICAgIHsgTFNQUElOR19BRklfVU5NQiwgIlVubnVtYmVyZWQifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCit2b2lkCitsc3BwaW5nX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKSB7CisKKyAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyICpsc3BwaW5nX2NvbV9oZWFkZXI7CisgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlciAqbHNwcGluZ190bHZfaGVhZGVyOworICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgKmxzcHBpbmdfc3VidGx2X2hlYWRlcjsKKyAgICBjb25zdCB1X2NoYXIgKnRwdHIsKnRsdl90cHRyLCpzdWJ0bHZfdHB0cjsKKyAgICBpbnQgdGxlbixsc3BwaW5nX3Rsdl9sZW4sbHNwcGluZ190bHZfdHlwZSx0bHZfdGxlbjsKKyAgICBpbnQgdGx2X2hleGR1bXAsc3VidGx2X2hleGR1bXA7CisgICAgaW50IGxzcHBpbmdfc3VidGx2X2xlbixsc3BwaW5nX3N1YnRsdl90eXBlOworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsgCisKKyAgICB1bmlvbiB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgKmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQ7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY2X3QgKmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjY7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgICpsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvOworICAgIH0gdGx2X3B0cjsKKworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjZfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NjsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0OworICAgICAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjZfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjY7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0OworICAgICAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDN2cG5faXB2NjsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF90ICpsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQ7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY0X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQ7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjY7CisgICAgfSBzdWJ0bHZfcHRyOworCisgICAgdHB0cj1wcHRyOworICAgIGxzcHBpbmdfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyICopcHB0cjsKKyAgICBUQ0hFQ0soKmxzcHBpbmdfY29tX2hlYWRlcik7CisKKyAgICAvKgorICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgorICAgICAqLworICAgIGlmIChFWFRSQUNUXzE2QklUUygmbHNwcGluZ19jb21faGVhZGVyLT52ZXJzaW9uWzBdKSAhPSBMU1BQSU5HX1ZFUlNJT04pIHsKKwlwcmludGYoIkxTUC1QSU5HIHZlcnNpb24gJXUgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmxzcHBpbmdfY29tX2hlYWRlci0+dmVyc2lvblswXSkpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgbGV0cyBwcmludCB0aGUgYmFzaWMgTWVzc2FnZSBUeXBlKi8KKyAgICBpZiAodmZsYWcgPCAxKSB7CisgICAgICAgIHByaW50ZigiTFNQLVBJTkd2JXUsICVzLCBzZXEgJXUsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmxzcHBpbmdfY29tX2hlYWRlci0+dmVyc2lvblswXSksCisgICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biAoJXUpIixsc3BwaW5nX2NvbV9oZWFkZXItPm1zZ190eXBlKSwKKyAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VxX251bWJlciksCisgICAgICAgICAgICAgICBsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogb2sgdGhleSBzZWVtIHRvIHdhbnQgdG8ga25vdyBldmVyeXRoaW5nIC0gbGV0cyBmdWxseSBkZWNvZGUgaXQgKi8KKworICAgIHRsZW49bGVuOworCisgICAgcHJpbnRmKCJcblx0TFNQLVBJTkd2JXUsIG1zZy10eXBlOiAlcyAoJXUpLCBsZW5ndGg6ICV1XG5cdCAgcmVwbHktbW9kZTogJXMgKCV1KSIsCisgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsc3BwaW5nX2NvbV9oZWFkZXItPnZlcnNpb25bMF0pLAorICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5tc2dfdHlwZSksCisgICAgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+bXNnX3R5cGUsCisgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgdG9rMnN0cihsc3BwaW5nX3JlcGx5X21vZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXBseV9tb2RlKSwKKyAgICAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXBseV9tb2RlKTsKKworICAgIC8qCisgICAgICogIHRoZSBmb2xsb3dpbmcgcmV0dXJuIGNvZGVzIHJlcXVpcmUgdGhhdCB0aGUgc3ViY29kZSBpcyBhdHRhY2hlZAorICAgICAqICBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc2xhdGVkIHRva2VuIG91dHB1dAorICAgICAqLworICAgIGlmIChsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlID09IDMgfHwKKyAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSA9PSA0IHx8CisgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUgPT0gOCB8fAorICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlID09IDEwIHx8CisgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUgPT0gMTEgfHwKKyAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSA9PSAxMiApCisgICAgICAgIHByaW50ZigiXG5cdCAgUmV0dXJuIENvZGU6ICVzICV1ICgldSlcblx0ICBSZXR1cm4gU3ViY29kZTogKCV1KSIsCisgICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfcmV0dXJuX2NvZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSksCisgICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9zdWJjb2RlLCAgICAKKyAgICAgICAgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUsCisgICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9zdWJjb2RlKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiXG5cdCAgUmV0dXJuIENvZGU6ICVzICgldSlcblx0ICBSZXR1cm4gU3ViY29kZTogKCV1KSIsCisgICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfcmV0dXJuX2NvZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSksICAgCisgICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlLAorICAgICAgICAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fc3ViY29kZSk7CisgCisgICAgcHJpbnRmKCJcblx0ICBTZW5kZXIgSGFuZGxlOiAweCUwOHgsIFNlcXVlbmNlOiAldSIsCisgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VuZGVyX2hhbmRsZSksCisgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VxX251bWJlcikpOworCisgICAgdGltZXN0YW1wLnR2X3NlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3NlbnRfc2VjKTsKKyAgICB0aW1lc3RhbXAudHZfdXNlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3NlbnRfdXNlYyk7ICAgICAKKyAgICBwcmludGYoIlxuXHQgIFNlbmRlciBUaW1lc3RhbXA6ICIpOworICAgIHRzX3ByaW50KCZ0aW1lc3RhbXApOworCisgICAgdGltZXN0YW1wLnR2X3NlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3JjdmRfc2VjKTsKKyAgICB0aW1lc3RhbXAudHZfdXNlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3JjdmRfdXNlYyk7IAorICAgIHByaW50ZigiUmVjZWl2ZXIgVGltZXN0YW1wOiAiKTsKKyAgICBpZiAoKHRpbWVzdGFtcC50dl9zZWMgIT0gMCkgJiYgKHRpbWVzdGFtcC50dl91c2VjICE9IDApKQorICAgICAgICB0c19wcmludCgmdGltZXN0YW1wKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50Zigibm8gdGltZXN0YW1wIik7CisKKyAgICB0cHRyKz1zaXplb2YoY29uc3Qgc3RydWN0IGxzcHBpbmdfY29tbW9uX2hlYWRlcik7CisgICAgdGxlbi09c2l6ZW9mKGNvbnN0IHN0cnVjdCBsc3BwaW5nX2NvbW1vbl9oZWFkZXIpOworCisgICAgd2hpbGUodGxlbj4oaW50KXNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKSkgeworICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSB0bHYgaGVhZGVyID8gKi8KKyAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKSkpCisgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgIGxzcHBpbmdfdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyICopdHB0cjsKKyAgICAgICAgbHNwcGluZ190bHZfdHlwZT1FWFRSQUNUXzE2QklUUyhsc3BwaW5nX3Rsdl9oZWFkZXItPnR5cGUpOworICAgICAgICBsc3BwaW5nX3Rsdl9sZW49RVhUUkFDVF8xNkJJVFMobHNwcGluZ190bHZfaGVhZGVyLT5sZW5ndGgpOworCisgICAgICAgIGlmIChsc3BwaW5nX3Rsdl9sZW4gPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZihsc3BwaW5nX3Rsdl9sZW4gJSA0IHx8IGxzcHBpbmdfdGx2X2xlbiA8IDQpIHsgLyogYWxpZ25lZCB0byBmb3VyIG9jdGV0IGJvdW5kYXJ5ICovCisgICAgICAgICAgICBwcmludGYoIlxuXHQgIEVSUk9SOiBUTFYgJXUgYm9ndXMgc2l6ZSAldSIsbHNwcGluZ190bHZfdHlwZSxsc3BwaW5nX3Rsdl9sZW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBUTFYgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfdGx2X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICBsc3BwaW5nX3Rsdl90eXBlKSwKKyAgICAgICAgICAgICAgIGxzcHBpbmdfdGx2X3R5cGUsCisgICAgICAgICAgICAgICBsc3BwaW5nX3Rsdl9sZW4pOworCisgICAgICAgIHRsdl90cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpOworICAgICAgICB0bHZfdGxlbj1sc3BwaW5nX3Rsdl9sZW47IC8qIGhlYWRlciBub3QgaW5jbHVkZWQgLT4gbm8gYWRqdXN0bWVudCAqLworCisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIHRsdiA/ICovCisgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBsc3BwaW5nX3Rsdl9sZW4pKQorICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgdGx2X2hleGR1bXA9RkFMU0U7CisKKyAgICAgICAgc3dpdGNoKGxzcHBpbmdfdGx2X3R5cGUpIHsKKyAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRfRkVDX1NUQUNLOgorICAgICAgICAgICAgd2hpbGUodGx2X3RsZW4+KGludClzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcikpIHsKKworICAgICAgICAgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIHN1YnRsdiBoZWFkZXIgPyAqLworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcikpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgICAgIHN1YnRsdl9oZXhkdW1wPUZBTFNFOworCisgICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgKil0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICBsc3BwaW5nX3N1YnRsdl90eXBlPUVYVFJBQ1RfMTZCSVRTKGxzcHBpbmdfc3VidGx2X2hlYWRlci0+dHlwZSk7CisgICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfbGVuPUVYVFJBQ1RfMTZCSVRTKGxzcHBpbmdfc3VidGx2X2hlYWRlci0+bGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzdWJ0bHZfdHB0cj10bHZfdHB0citzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGxzcHBpbmdfc3VidGx2X2xlbiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBzdWJUTFYgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNwcGluZ190bHZ0YXJnZXRmZWNfc3VidGx2X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X2xlbik7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2gobHNwcGluZ19zdWJ0bHZfdHlwZSkgeworCisgICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY0OgorICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCAqKXN1YnRsdl90cHRyOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcy8ldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NC0+cHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NC0+cHJlZml4X2xlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTERQX0lQVjY6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Nl90ICopc3VidGx2X3RwdHI7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Ni0+cHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Ni0+cHJlZml4X2xlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjQ6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NF90ICopc3VidGx2X3RwdHI7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1LCBzZW5kZXItaWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQtPnByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQtPnByZWZpeF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NC0+c2VuZGVyX2lkKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjY6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2Nl90ICopc3VidGx2X3RwdHI7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1LCBzZW5kZXItaWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5wcmVmaXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5zZW5kZXJfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjQ6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0X3QgKilzdWJ0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgdHVubmVsIGVuZC1wb2ludCAlcywgdHVubmVsIHNlbmRlciAlcywgbHNwLWlkIDB4JTA0eCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICB0dW5uZWwtaWQgMHglMDR4LCBleHRlbmRlZCB0dW5uZWwtaWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfZW5kcG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfc2VuZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjQtPmxzcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT5leHRlbmRlZF90dW5uZWxfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjY6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY2X3QgKilzdWJ0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgdHVubmVsIGVuZC1wb2ludCAlcywgdHVubmVsIHNlbmRlciAlcywgbHNwLWlkIDB4JTA0eCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICB0dW5uZWwtaWQgMHglMDR4LCBleHRlbmRlZCB0dW5uZWwtaWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Ni0+dHVubmVsX2VuZHBvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYtPnR1bm5lbF9zZW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Ni0+bHNwX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYtPnR1bm5lbF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY2LT5leHRlbmRlZF90dW5uZWxfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MM1ZQTl9JUFY0OgorICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDN2cG5faXB2NCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0X3QgKilzdWJ0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgUkQ6ICVzLCAlcy8ldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0LT5yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0LT5wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjQtPnByZWZpeF9sZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIElORVQ2CisgICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjY6CisgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2ID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjZfdCAqKXN1YnRsdl90cHRyOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBSRDogJXMsICVzLyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjYtPnJkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2LT5wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjYtPnByZWZpeF9sZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX0VORFBUOgorICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCAqKXN1YnRsdl90cHRyOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBSRDogJXMsIFNlbmRlciBDRS1JRDogJXUsIFJlY2VpdmVyIENFLUlEOiAldSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHQtPnJkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+c2VuZGVyX2NlX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+cmVjZWl2ZXJfY2VfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsMnZwbl9lbmNhcHNfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+ZW5jYXBzdWxhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX2VuZHB0LT5lbmNhcHN1bGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAvKiB0aGUgb2xkIEwyVlBOIFZDSUQgc3ViVExWIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgdGhlIHNlbmRlciBmaWVsZCAqLworICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEX09MRDoKKyAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkX3QgKilzdWJ0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgUmVtb3RlIFBFOiAlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBWQy1JRDogMHglMDh4LCBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGQtPnJlbW90ZV9wZV9hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZC0+dmNfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsMnZwbl9lbmNhcHNfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZC0+ZW5jYXBzdWxhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkLT5lbmNhcHN1bGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEOgorICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX3QgKilzdWJ0bHZfdHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgU2VuZGVyIFBFOiAlcywgUmVtb3RlIFBFOiAlcyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBWQy1JRDogMHglMDh4LCBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+c2VuZGVyX3BlX2FkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+cmVtb3RlX3BlX2FkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQtPnZjX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobDJ2cG5fZW5jYXBzX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+ZW5jYXBzdWxhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQtPmVuY2Fwc3VsYXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3VidGx2X2hleGR1bXA9VFJVRTsgLyogdW5rbm93biBzdWJUTFYganVzdCBoZXhkdW1wIGl0ICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgc3VidGx2IGhleGR1bXAgPyAqLworICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA+IDEgfHwgc3VidGx2X2hleGR1bXA9PVRSVUUpCisgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0citzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlciksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0ICAgICAgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X2xlbik7CisKKyAgICAgICAgICAgICAgICB0bHZfdHB0cis9bHNwcGluZ19zdWJ0bHZfbGVuOworICAgICAgICAgICAgICAgIHRsdl90bGVuLT1sc3BwaW5nX3N1YnRsdl9sZW4rc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkc6CisgICAgICAgICAgICAvKiB0aGF0IHN0cmFuZ2UgdGhpbmcgd2l0aCB0aGUgZG93bnN0cmVhbSBtYXAgVExWIGlzIHRoYXQgdW50aWwgbm93CisgICAgICAgICAgICAgKiB3ZSBkbyBub3Qga25vdyBpZiBpdHMgSVB2NCBvciBJUHY2ICwgYWZ0ZXIgd2UgZm91bmQgdGhlIGFkcmVzcy10eXBlCisgICAgICAgICAgICAgKiBsZXRzIHJlY2FzdCB0aGUgdGx2X3RwdHIgYW5kIG1vdmUgb24gKi8KKworICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0PSBcCisgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgKil0bHZfdHB0cjsKKyAgICAgICAgICAgIHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Nj0gXAorICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Nl90ICopdGx2X3RwdHI7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgTVRVOiAldSwgQWRkcmVzcy1UeXBlOiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQtPm10dSksCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX2FkZHJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5hZGRyZXNzX3R5cGUpLAorICAgICAgICAgICAgICAgICAgIHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+YWRkcmVzc190eXBlKTsKKworICAgICAgICAgICAgc3dpdGNoKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+YWRkcmVzc190eXBlKSB7CisKKyAgICAgICAgICAgIGNhc2UgTFNQUElOR19BRklfSVBWNDoKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgRG93bnN0cmVhbSBJUDogJXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgRG93bnN0cmVhbSBJbnRlcmZhY2UgSVA6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyh0bHZfcHRyLmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQtPmRvd25zdHJlYW1faXApLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+ZG93bnN0cmVhbV9pbnRlcmZhY2UpKTsKKyAgICAgICAgICAgICAgICB0bHZfdHB0cis9c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QpOworICAgICAgICAgICAgICAgIHRsdl90bGVuLT1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjRfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICBjYXNlIExTUFBJTkdfQUZJX0lQVjY6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIERvd25zdHJlYW0gSVA6ICVzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICJcblx0ICAgIERvd25zdHJlYW0gSW50ZXJmYWNlIElQOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Ni0+ZG93bnN0cmVhbV9pcCksCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Ni0+ZG93bnN0cmVhbV9pbnRlcmZhY2UpKTsKKyAgICAgICAgICAgICAgICB0bHZfdHB0cis9c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY2X3QpOworICAgICAgICAgICAgICAgIHRsdl90bGVuLT1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjZfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgTFNQUElOR19BRklfVU5NQjoKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgRG93bnN0cmVhbSBJUDogJXMiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgRG93bnN0cmVhbSBJbnRlcmZhY2UgSW5kZXg6IDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcodGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5kb3duc3RyZWFtX2lwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5kb3duc3RyZWFtX2ludGVyZmFjZSkpOworICAgICAgICAgICAgICAgIHRsdl90cHRyKz1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjRfdCk7CisgICAgICAgICAgICAgICAgdGx2X3RsZW4tPXNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NF90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IGhhcHBlbiAhIC0gbm8gZXJyb3IgbWVzc2FnZSAtIHRvazJzdHIoKSBoYXMgYmFya2VkIGFscmVhZHkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvPSBcCisgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgKil0bHZfdHB0cjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogRklYTUUgYWRkIGhhc2gta2V5IHR5cGUsIGRlcHRoIGxpbWl0LCBtdWx0aXBhdGggcHJvY2Vzc2luZyAqLworCisKKyAgICAgICAgICAgIHRsdl90cHRyKz1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2luZm9fdCk7CisgICAgICAgICAgICB0bHZfdGxlbi09c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QpOworCisgICAgICAgICAgICAvKiBGSVhNRSBwcmludCBkb3duc3RyZWFtIGxhYmVscyAqLworCisKKyAgICAgICAgICAgIHRsdl9oZXhkdW1wPVRSVUU7IC8qIGR1bXAgdGhlIFRMViB1bnRpbCBjb2RlIGNvbXBsZXRlICovCisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTFNQUElOR19UTFZfQkZEX0RJU0NSSU1JTkFUT1I6CisgICAgICAgICAgICB0cHRyICs9IHNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKKyAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUl9MRU4pKQorICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQkZEIERpc2NyaW1pbmF0b3IgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBUTFZzIHRoYXQgbGFjayBhIGRlY29kZXIKKyAgICAgICAgICAgICAqICB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQorICAgICAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9QQUQ6CisgICAgICAgIGNhc2UgTFNQUElOR19UTFZfRVJST1JfQ09ERToKKyAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURToKKyAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0ciwiXG5cdCAgICAiLHRsdl90bGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSB0bHYgaGV4ZHVtcCA/ICovCisgICAgICAgIGlmICh2ZmxhZyA+IDEgfHwgdGx2X2hleGR1bXA9PVRSVUUpCisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpKSwiXG5cdCAgICAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfdGx2X2xlbik7CisKKyAgICAgICAgdHB0cis9bHNwcGluZ190bHZfbGVuK3NpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKKyAgICAgICAgdGxlbi09bHNwcGluZ190bHZfbGVuK3NpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKKyAgICB9CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1sd3Jlcy5jIGIvcHJpbnQtbHdyZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQ2ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbHdyZXMuYwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1sd3Jlcy5jLHYgMS4xMyAyMDA0LzAzLzI0IDAxOjU0OjI5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgIm5hbWVzZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIiAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKy8qIEJJTkQ5IGxpYi9sd3Jlcy9pbmNsdWRlL2x3cmVzICovCit0eXBlZGVmIHVfaW50MzJfdCBsd3Jlc191aW50MzJfdDsKK3R5cGVkZWYgdV9pbnQxNl90IGx3cmVzX3VpbnQxNl90OwordHlwZWRlZiB1X2ludDhfdCBsd3Jlc191aW50OF90OworCitzdHJ1Y3QgbHdyZXNfbHdwYWNrZXQgeworCWx3cmVzX3VpbnQzMl90CQlsZW5ndGg7CisJbHdyZXNfdWludDE2X3QJCXZlcnNpb247CisJbHdyZXNfdWludDE2X3QJCXBrdGZsYWdzOworCWx3cmVzX3VpbnQzMl90CQlzZXJpYWw7CisJbHdyZXNfdWludDMyX3QJCW9wY29kZTsKKwlsd3Jlc191aW50MzJfdAkJcmVzdWx0OworCWx3cmVzX3VpbnQzMl90CQlyZWN2bGVuZ3RoOworCWx3cmVzX3VpbnQxNl90CQlhdXRodHlwZTsKKwlsd3Jlc191aW50MTZfdAkJYXV0aGxlbmd0aDsKK307CisKKyNkZWZpbmUgTFdSRVNfTFdQQUNLRVRGTEFHX1JFU1BPTlNFCTB4MDAwMVUJLyogaWYgc2V0LCBwa3QgaXMgYSByZXNwb25zZSAqLworCisjZGVmaW5lIExXUkVTX0xXUEFDS0VUVkVSU0lPTl8wCQkwCisKKyNkZWZpbmUgTFdSRVNfRkxBR19UUlVTVE5PVFJFUVVJUkVECTB4MDAwMDAwMDFVCisjZGVmaW5lIExXUkVTX0ZMQUdfU0VDVVJFREFUQQkJMHgwMDAwMDAwMlUKKworLyoKKyAqIG5vLW9wCisgKi8KKyNkZWZpbmUgTFdSRVNfT1BDT0RFX05PT1AJCTB4MDAwMDAwMDBVCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwdWJsaWMgKi8KKwlsd3Jlc191aW50MTZfdAkJCWRhdGFsZW5ndGg7CisJLyogZGF0YSBmb2xsb3dzICovCit9IGx3cmVzX25vb3ByZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwdWJsaWMgKi8KKwlsd3Jlc191aW50MTZfdAkJCWRhdGFsZW5ndGg7CisJLyogZGF0YSBmb2xsb3dzICovCit9IGx3cmVzX25vb3ByZXNwb25zZV90OworCisvKgorICogZ2V0IGFkZHJlc3NlcyBieSBuYW1lCisgKi8KKyNkZWZpbmUgTFdSRVNfT1BDT0RFX0dFVEFERFJTQllOQU1FCTB4MDAwMTAwMDFVCisKK3R5cGVkZWYgc3RydWN0IGx3cmVzX2FkZHIgbHdyZXNfYWRkcl90OworCitzdHJ1Y3QgbHdyZXNfYWRkciB7CisJbHdyZXNfdWludDMyX3QJCQlmYW1pbHk7CisJbHdyZXNfdWludDE2X3QJCQlsZW5ndGg7CisJLyogYWRkcmVzcyBmb2xvd3MgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwdWJsaWMgKi8KKwlsd3Jlc191aW50MzJfdAkJCWZsYWdzOworCWx3cmVzX3VpbnQzMl90CQkJYWRkcnR5cGVzOworCWx3cmVzX3VpbnQxNl90CQkJbmFtZWxlbjsKKwkvKiBuYW1lIGZvbGxvd3MgKi8KK30gbHdyZXNfZ2FibnJlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHB1YmxpYyAqLworCWx3cmVzX3VpbnQzMl90CQkJZmxhZ3M7CisJbHdyZXNfdWludDE2X3QJCQluYWxpYXNlczsKKwlsd3Jlc191aW50MTZfdAkJCW5hZGRyczsKKwlsd3Jlc191aW50MTZfdAkJCXJlYWxuYW1lbGVuOworCS8qIGFsaWFzZXMgZm9sbG93cyAqLworCS8qIGFkZHJzIGZvbGxvd3MgKi8KKwkvKiByZWFsbmFtZSBmb2xsb3dzICovCit9IGx3cmVzX2dhYm5yZXNwb25zZV90OworCisvKgorICogZ2V0IG5hbWUgYnkgYWRkcmVzcworICovCisjZGVmaW5lIExXUkVTX09QQ09ERV9HRVROQU1FQllBRERSCTB4MDAwMTAwMDJVCit0eXBlZGVmIHN0cnVjdCB7CisJLyogcHVibGljICovCisJbHdyZXNfdWludDMyX3QJCQlmbGFnczsKKwlsd3Jlc19hZGRyX3QJCQlhZGRyOworCS8qIGFkZHIgYm9keSBmb2xsb3dzICovCit9IGx3cmVzX2duYmFyZXF1ZXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBwdWJsaWMgKi8KKwlsd3Jlc191aW50MzJfdAkJCWZsYWdzOworCWx3cmVzX3VpbnQxNl90CQkJbmFsaWFzZXM7CisJbHdyZXNfdWludDE2X3QJCQlyZWFsbmFtZWxlbjsKKwkvKiBhbGlhc2VzIGZvbGxvd3MgKi8KKwkvKiByZWFsbmFtZSBmb2xsb3dzICovCit9IGx3cmVzX2duYmFyZXNwb25zZV90OworCisvKgorICogZ2V0IHJkYXRhIGJ5IG5hbWUKKyAqLworI2RlZmluZSBMV1JFU19PUENPREVfR0VUUkRBVEFCWU5BTUUJMHgwMDAxMDAwM1UKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHB1YmxpYyAqLworCWx3cmVzX3VpbnQzMl90CQkJZmxhZ3M7CisJbHdyZXNfdWludDE2X3QJCQlyZGNsYXNzOworCWx3cmVzX3VpbnQxNl90CQkJcmR0eXBlOworCWx3cmVzX3VpbnQxNl90CQkJbmFtZWxlbjsKKwkvKiBuYW1lIGZvbGxvd3MgKi8KK30gbHdyZXNfZ3JibnJlcXVlc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIHB1YmxpYyAqLworCWx3cmVzX3VpbnQzMl90CQkJZmxhZ3M7CisJbHdyZXNfdWludDE2X3QJCQlyZGNsYXNzOworCWx3cmVzX3VpbnQxNl90CQkJcmR0eXBlOworCWx3cmVzX3VpbnQzMl90CQkJdHRsOworCWx3cmVzX3VpbnQxNl90CQkJbnJkYXRhczsKKwlsd3Jlc191aW50MTZfdAkJCW5zaWdzOworCS8qIHJlYWxuYW1lIGhlcmUgKGxlbiArIG5hbWUpICovCisJLyogcmRhdGEgaGVyZSAobGVuICsgbmFtZSkgKi8KKwkvKiBzaWduYXR1cmVzIGhlcmUgKGxlbiArIG5hbWUpICovCit9IGx3cmVzX2dyYm5yZXNwb25zZV90OworCisjZGVmaW5lIExXUkRBVEFfVkFMSURBVEVECTB4MDAwMDAwMDEKKworI2RlZmluZSBMV1JFU19BRERSVFlQRV9WNAkJMHgwMDAwMDAwMVUJLyogaXB2NCAqLworI2RlZmluZSBMV1JFU19BRERSVFlQRV9WNgkJMHgwMDAwMDAwMlUJLyogaXB2NiAqLworCisjZGVmaW5lIExXUkVTX01BWF9BTElBU0VTCQkxNgkJLyogbWF4ICMgb2YgYWxpYXNlcyAqLworI2RlZmluZSBMV1JFU19NQVhfQUREUlMJCQk2NAkJLyogbWF4ICMgb2YgYWRkcnMgKi8KKworc3RydWN0IHRvayBvcGNvZGVbXSA9IHsKKwl7IExXUkVTX09QQ09ERV9OT09QLAkJIm5vb3AiLCB9LAorCXsgTFdSRVNfT1BDT0RFX0dFVEFERFJTQllOQU1FLAkiZ2V0YWRkcnNieW5hbWUiLCB9LAorCXsgTFdSRVNfT1BDT0RFX0dFVE5BTUVCWUFERFIsCSJnZXRuYW1lYnlhZGRyIiwgfSwKKwl7IExXUkVTX09QQ09ERV9HRVRSREFUQUJZTkFNRSwJImdldHJkYXRhYnluYW1lIiwgfSwKKwl7IDAsIAkJCQlOVUxMLCB9LAorfTsKKworLyogcHJpbnQtZG9tYWluLmMgKi8KK2V4dGVybiBzdHJ1Y3QgdG9rIG5zX3R5cGUyc3RyW107CitleHRlcm4gc3RydWN0IHRvayBuc19jbGFzczJzdHJbXTsKKworc3RhdGljIGludCBsd3Jlc19wcmludG5hbWUoc2l6ZV90LCBjb25zdCBjaGFyICopOworc3RhdGljIGludCBsd3Jlc19wcmludG5hbWVsZW4oY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgbHdyZXNfcHJpbnRiaW5sZW4oY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgbHdyZXNfcHJpbnRhZGRyKGx3cmVzX2FkZHJfdCAqKTsKKworc3RhdGljIGludAorbHdyZXNfcHJpbnRuYW1lKHNpemVfdCBsLCBjb25zdCBjaGFyICpwMCkKK3sKKwljb25zdCBjaGFyICpwOworCXNpemVfdCBpOworCisJcCA9IHAwOworCS8qICsgMSBmb3IgdGVybWluYXRpbmcgXDAgKi8KKwlpZiAocCArIGwgKyAxID4gKGNvbnN0IGNoYXIgKilzbmFwZW5kKQorCQlnb3RvIHRydW5jOworCisJcHJpbnRmKCIgIik7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwkJc2FmZXB1dGNoYXIoKnArKyk7CisJcCsrOwkvKiBza2lwIHRlcm1pbmF0aW5nIFwwICovCisKKwlyZXR1cm4gcCAtIHAwOworCisgIHRydW5jOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorbHdyZXNfcHJpbnRuYW1lbGVuKGNvbnN0IGNoYXIgKnApCit7CisJdV9pbnQxNl90IGw7CisJaW50IGFkdmFuY2U7CisKKwlpZiAocCArIDIgPiAoY29uc3QgY2hhciAqKXNuYXBlbmQpCisJCWdvdG8gdHJ1bmM7CisJbCA9IEVYVFJBQ1RfMTZCSVRTKHApOworCWFkdmFuY2UgPSBsd3Jlc19wcmludG5hbWUobCwgcCArIDIpOworCWlmIChhZHZhbmNlIDwgMCkKKwkJZ290byB0cnVuYzsKKwlyZXR1cm4gMiArIGFkdmFuY2U7CisKKyAgdHJ1bmM6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citsd3Jlc19wcmludGJpbmxlbihjb25zdCBjaGFyICpwMCkKK3sKKwljb25zdCBjaGFyICpwOworCXVfaW50MTZfdCBsOworCWludCBpOworCisJcCA9IHAwOworCWlmIChwICsgMiA+IChjb25zdCBjaGFyICopc25hcGVuZCkKKwkJZ290byB0cnVuYzsKKwlsID0gRVhUUkFDVF8xNkJJVFMocCk7CisJaWYgKHAgKyAyICsgbCA+IChjb25zdCBjaGFyICopc25hcGVuZCkKKwkJZ290byB0cnVuYzsKKwlwICs9IDI7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwkJcHJpbnRmKCIlMDJ4IiwgKnArKyk7CisJcmV0dXJuIHAgLSBwMDsKKworICB0cnVuYzoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2x3cmVzX3ByaW50YWRkcihsd3Jlc19hZGRyX3QgKmFwKQoreworCXVfaW50MTZfdCBsOworCWNvbnN0IGNoYXIgKnA7CisJaW50IGk7CisKKwlUQ0hFQ0soYXAtPmxlbmd0aCk7CisJbCA9IEVYVFJBQ1RfMTZCSVRTKCZhcC0+bGVuZ3RoKTsKKwkvKiBYWFggYXAgcG9pbnRzIHRvIHBhY2tlZCBzdHJ1Y3QgKi8KKwlwID0gKGNvbnN0IGNoYXIgKikmYXAtPmxlbmd0aCArIHNpemVvZihhcC0+bGVuZ3RoKTsKKwlUQ0hFQ0syKCpwLCBsKTsKKworCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJmFwLT5mYW1pbHkpKSB7CisJY2FzZSAxOgkvKiBJUHY0ICovCisJCWlmIChsIDwgNCkKKwkJCXJldHVybiAtMTsKKwkJcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKHApKTsKKwkJcCArPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgMjoJLyogSVB2NiAqLworCQlpZiAobCA8IDE2KQorCQkJcmV0dXJuIC0xOworCQlwcmludGYoIiAlcyIsIGlwNmFkZHJfc3RyaW5nKHApKTsKKwkJcCArPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGYoIiAldS8iLCBFWFRSQUNUXzMyQklUUygmYXAtPmZhbWlseSkpOworCQlmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQorCQkJcHJpbnRmKCIlMDJ4IiwgKnArKyk7CisJfQorCisJcmV0dXJuIHAgLSAoY29uc3QgY2hhciAqKWFwOworCisgIHRydW5jOgorCXJldHVybiAtMTsKK30KKwordm9pZAorbHdyZXNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCWNvbnN0IHN0cnVjdCBsd3Jlc19sd3BhY2tldCAqbnA7CisJdV9pbnQzMl90IHY7CisJY29uc3QgY2hhciAqczsKKwlpbnQgcmVzcG9uc2U7CisJaW50IGFkdmFuY2U7CisJaW50IHVuc3VwcG9ydGVkID0gMDsKKworCW5wID0gKGNvbnN0IHN0cnVjdCBsd3Jlc19sd3BhY2tldCAqKWJwOworCVRDSEVDSyhucC0+YXV0aGxlbmd0aCk7CisKKwlwcmludGYoIiBsd3JlcyIpOworCXYgPSBFWFRSQUNUXzE2QklUUygmbnAtPnZlcnNpb24pOworCWlmICh2ZmxhZyB8fCB2ICE9IExXUkVTX0xXUEFDS0VUVkVSU0lPTl8wKQorCQlwcmludGYoIiB2JXUiLCB2KTsKKwlpZiAodiAhPSBMV1JFU19MV1BBQ0tFVFZFUlNJT05fMCkgeworCQlzID0gKGNvbnN0IGNoYXIgKilucCArIEVYVFJBQ1RfMzJCSVRTKCZucC0+bGVuZ3RoKTsKKwkJZ290byB0YWlsOworCX0KKworCXJlc3BvbnNlID0gRVhUUkFDVF8xNkJJVFMoJm5wLT5wa3RmbGFncykgJiBMV1JFU19MV1BBQ0tFVEZMQUdfUkVTUE9OU0U7CisKKwkvKiBvcGNvZGUgYW5kIHBrdGZsYWdzICovCisJdiA9IEVYVFJBQ1RfMzJCSVRTKCZucC0+b3Bjb2RlKTsKKwlzID0gdG9rMnN0cihvcGNvZGUsICIjMHgleCIsIHYpOworCXByaW50ZigiICVzJXMiLCBzLCByZXNwb25zZSA/ICIiIDogIj8iKTsKKworCS8qIHBrdGZsYWdzICovCisJdiA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+cGt0ZmxhZ3MpOworCWlmICh2ICYgfkxXUkVTX0xXUEFDS0VURkxBR19SRVNQT05TRSkKKwkJcHJpbnRmKCJbMHgleF0iLCB2KTsKKworCWlmICh2ZmxhZyA+IDEpIHsKKwkJcHJpbnRmKCIgKCIpOwkvKikqLworCQlwcmludGYoInNlcmlhbDoweCV4IiwgRVhUUkFDVF8zMkJJVFMoJm5wLT5zZXJpYWwpKTsKKwkJcHJpbnRmKCIgcmVzdWx0OjB4JXgiLCBFWFRSQUNUXzMyQklUUygmbnAtPnJlc3VsdCkpOworCQlwcmludGYoIiByZWN2bGVuOiV1IiwgRVhUUkFDVF8zMkJJVFMoJm5wLT5yZWN2bGVuZ3RoKSk7CisJCS8qIEJJTkQ5MTA6IG5vdCB1c2VkICovCisJCWlmICh2ZmxhZyA+IDIpIHsKKwkJCXByaW50ZigiIGF1dGh0eXBlOjB4JXgiLCBFWFRSQUNUXzE2QklUUygmbnAtPmF1dGh0eXBlKSk7CisJCQlwcmludGYoIiBhdXRobGVuOiV1IiwgRVhUUkFDVF8xNkJJVFMoJm5wLT5hdXRobGVuZ3RoKSk7CisJCX0KKwkJLyooKi8KKwkJcHJpbnRmKCIpIik7CisJfQorCisJLyogcGVyLW9wY29kZSBjb250ZW50ICovCisJaWYgKCFyZXNwb25zZSkgeworCQkvKgorCQkgKiBxdWVyaWVzCisJCSAqLworCQlsd3Jlc19nYWJucmVxdWVzdF90ICpnYWJuOworCQlsd3Jlc19nbmJhcmVxdWVzdF90ICpnbmJhOworCQlsd3Jlc19ncmJucmVxdWVzdF90ICpncmJuOworCQl1X2ludDMyX3QgbDsKKworCQlnYWJuID0gTlVMTDsKKwkJZ25iYSA9IE5VTEw7CisJCWdyYm4gPSBOVUxMOworCisJCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJm5wLT5vcGNvZGUpKSB7CisJCWNhc2UgTFdSRVNfT1BDT0RFX05PT1A6CisJCQlicmVhazsKKwkJY2FzZSBMV1JFU19PUENPREVfR0VUQUREUlNCWU5BTUU6CisJCQlnYWJuID0gKGx3cmVzX2dhYm5yZXF1ZXN0X3QgKikobnAgKyAxKTsKKwkJCVRDSEVDSyhnYWJuLT5uYW1lbGVuKTsKKwkJCS8qIFhYWCBnYWJuIHBvaW50cyB0byBwYWNrZWQgc3RydWN0ICovCisJCQlzID0gKGNvbnN0IGNoYXIgKikmZ2Fibi0+bmFtZWxlbiArCisJCQkgICAgc2l6ZW9mKGdhYm4tPm5hbWVsZW4pOworCQkJbCA9IEVYVFJBQ1RfMTZCSVRTKCZnYWJuLT5uYW1lbGVuKTsKKworCQkJLyogQklORDkxMDogbm90IHVzZWQgKi8KKwkJCWlmICh2ZmxhZyA+IDIpIHsKKwkJCQlwcmludGYoIiBmbGFnczoweCV4IiwKKwkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmdhYm4tPmZsYWdzKSk7CisJCQl9CisKKwkJCXYgPSBFWFRSQUNUXzMyQklUUygmZ2Fibi0+YWRkcnR5cGVzKTsKKwkJCXN3aXRjaCAodiAmIChMV1JFU19BRERSVFlQRV9WNCB8IExXUkVTX0FERFJUWVBFX1Y2KSkgeworCQkJY2FzZSBMV1JFU19BRERSVFlQRV9WNDoKKwkJCQlwcmludGYoIiBJUHY0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIExXUkVTX0FERFJUWVBFX1Y2OgorCQkJCXByaW50ZigiIElQdjYiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTFdSRVNfQUREUlRZUEVfVjQgfCBMV1JFU19BRERSVFlQRV9WNjoKKwkJCQlwcmludGYoIiBJUHY0LzYiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICh2ICYgfihMV1JFU19BRERSVFlQRV9WNCB8IExXUkVTX0FERFJUWVBFX1Y2KSkKKwkJCQlwcmludGYoIlsweCV4XSIsIHYpOworCisJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lKGwsIHMpOworCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlzICs9IGFkdmFuY2U7CisJCQlicmVhazsKKwkJY2FzZSBMV1JFU19PUENPREVfR0VUTkFNRUJZQUREUjoKKwkJCWduYmEgPSAobHdyZXNfZ25iYXJlcXVlc3RfdCAqKShucCArIDEpOworCQkJVENIRUNLKGduYmEtPmFkZHIpOworCisJCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLworCQkJaWYgKHZmbGFnID4gMikgeworCQkJCXByaW50ZigiIGZsYWdzOjB4JXgiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZ25iYS0+ZmxhZ3MpKTsKKwkJCX0KKworCQkJcyA9IChjb25zdCBjaGFyICopJmduYmEtPmFkZHI7CisKKwkJCWFkdmFuY2UgPSBsd3Jlc19wcmludGFkZHIoJmduYmEtPmFkZHIpOworCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlzICs9IGFkdmFuY2U7CisJCQlicmVhazsKKwkJY2FzZSBMV1JFU19PUENPREVfR0VUUkRBVEFCWU5BTUU6CisJCQkvKiBYWFggbm8gdHJhY2UsIG5vdCB0ZXN0ZWQgKi8KKwkJCWdyYm4gPSAobHdyZXNfZ3JibnJlcXVlc3RfdCAqKShucCArIDEpOworCQkJVENIRUNLKGdyYm4tPm5hbWVsZW4pOworCisJCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLworCQkJaWYgKHZmbGFnID4gMikgeworCQkJCXByaW50ZigiIGZsYWdzOjB4JXgiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZ3Jibi0+ZmxhZ3MpKTsKKwkJCX0KKworCQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX3R5cGUyc3RyLCAiVHlwZSVkIiwKKwkJCSAgICBFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmR0eXBlKSkpOworCQkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZncmJuLT5yZGNsYXNzKSAhPSBDX0lOKSB7CisJCQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX2NsYXNzMnN0ciwgIkNsYXNzJWQiLAorCQkJCSAgICBFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmRjbGFzcykpKTsKKwkJCX0KKworCQkJLyogWFhYIGdyYm4gcG9pbnRzIHRvIHBhY2tlZCBzdHJ1Y3QgKi8KKwkJCXMgPSAoY29uc3QgY2hhciAqKSZncmJuLT5uYW1lbGVuICsKKwkJCSAgICBzaXplb2YoZ3Jibi0+bmFtZWxlbik7CisJCQlsID0gRVhUUkFDVF8xNkJJVFMoJmdyYm4tPm5hbWVsZW4pOworCisJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lKGwsIHMpOworCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlzICs9IGFkdmFuY2U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVuc3VwcG9ydGVkKys7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIHJlc3BvbnNlcworCQkgKi8KKwkJbHdyZXNfZ2FibnJlc3BvbnNlX3QgKmdhYm47CisJCWx3cmVzX2duYmFyZXNwb25zZV90ICpnbmJhOworCQlsd3Jlc19ncmJucmVzcG9uc2VfdCAqZ3JibjsKKwkJdV9pbnQzMl90IGwsIG5hOworCQl1X2ludDMyX3QgaTsKKworCQlnYWJuID0gTlVMTDsKKwkJZ25iYSA9IE5VTEw7CisJCWdyYm4gPSBOVUxMOworCisJCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJm5wLT5vcGNvZGUpKSB7CisJCWNhc2UgTFdSRVNfT1BDT0RFX05PT1A6CisJCQlicmVhazsKKwkJY2FzZSBMV1JFU19PUENPREVfR0VUQUREUlNCWU5BTUU6CisJCQlnYWJuID0gKGx3cmVzX2dhYm5yZXNwb25zZV90ICopKG5wICsgMSk7CisJCQlUQ0hFQ0soZ2Fibi0+cmVhbG5hbWVsZW4pOworCQkJLyogWFhYIGdhYm4gcG9pbnRzIHRvIHBhY2tlZCBzdHJ1Y3QgKi8KKwkJCXMgPSAoY29uc3QgY2hhciAqKSZnYWJuLT5yZWFsbmFtZWxlbiArCisJCQkgICAgc2l6ZW9mKGdhYm4tPnJlYWxuYW1lbGVuKTsKKwkJCWwgPSBFWFRSQUNUXzE2QklUUygmZ2Fibi0+cmVhbG5hbWVsZW4pOworCisJCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLworCQkJaWYgKHZmbGFnID4gMikgeworCQkJCXByaW50ZigiIGZsYWdzOjB4JXgiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZ2Fibi0+ZmxhZ3MpKTsKKwkJCX0KKworCQkJcHJpbnRmKCIgJXUvJXUiLCBFWFRSQUNUXzE2QklUUygmZ2Fibi0+bmFsaWFzZXMpLAorCQkJICAgIEVYVFJBQ1RfMTZCSVRTKCZnYWJuLT5uYWRkcnMpKTsKKworCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZShsLCBzKTsKKwkJCWlmIChhZHZhbmNlIDwgMCkKKwkJCQlnb3RvIHRydW5jOworCQkJcyArPSBhZHZhbmNlOworCisJCQkvKiBhbGlhc2VzICovCisJCQluYSA9IEVYVFJBQ1RfMTZCSVRTKCZnYWJuLT5uYWxpYXNlcyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmE7IGkrKykgeworCQkJCWFkdmFuY2UgPSBsd3Jlc19wcmludG5hbWVsZW4ocyk7CisJCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCQlnb3RvIHRydW5jOworCQkJCXMgKz0gYWR2YW5jZTsKKwkJCX0KKworCQkJLyogYWRkcnMgKi8KKwkJCW5hID0gRVhUUkFDVF8xNkJJVFMoJmdhYm4tPm5hZGRycyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmE7IGkrKykgeworCQkJCWFkdmFuY2UgPSBsd3Jlc19wcmludGFkZHIoKGx3cmVzX2FkZHJfdCAqKXMpOworCQkJCWlmIChhZHZhbmNlIDwgMCkKKwkJCQkJZ290byB0cnVuYzsKKwkJCQlzICs9IGFkdmFuY2U7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBMV1JFU19PUENPREVfR0VUTkFNRUJZQUREUjoKKwkJCWduYmEgPSAobHdyZXNfZ25iYXJlc3BvbnNlX3QgKikobnAgKyAxKTsKKwkJCVRDSEVDSyhnbmJhLT5yZWFsbmFtZWxlbik7CisJCQkvKiBYWFggZ25iYSBwb2ludHMgdG8gcGFja2VkIHN0cnVjdCAqLworCQkJcyA9IChjb25zdCBjaGFyICopJmduYmEtPnJlYWxuYW1lbGVuICsKKwkJCSAgICBzaXplb2YoZ25iYS0+cmVhbG5hbWVsZW4pOworCQkJbCA9IEVYVFJBQ1RfMTZCSVRTKCZnbmJhLT5yZWFsbmFtZWxlbik7CisKKwkJCS8qIEJJTkQ5MTA6IG5vdCB1c2VkICovCisJCQlpZiAodmZsYWcgPiAyKSB7CisJCQkJcHJpbnRmKCIgZmxhZ3M6MHgleCIsCisJCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZnbmJhLT5mbGFncykpOworCQkJfQorCisJCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMTZCSVRTKCZnbmJhLT5uYWxpYXNlcykpOworCisJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lKGwsIHMpOworCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlzICs9IGFkdmFuY2U7CisKKwkJCS8qIGFsaWFzZXMgKi8KKwkJCW5hID0gRVhUUkFDVF8xNkJJVFMoJmduYmEtPm5hbGlhc2VzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBuYTsgaSsrKSB7CisJCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZWxlbihzKTsKKwkJCQlpZiAoYWR2YW5jZSA8IDApCisJCQkJCWdvdG8gdHJ1bmM7CisJCQkJcyArPSBhZHZhbmNlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgTFdSRVNfT1BDT0RFX0dFVFJEQVRBQllOQU1FOgorCQkJLyogWFhYIG5vIHRyYWNlLCBub3QgdGVzdGVkICovCisJCQlncmJuID0gKGx3cmVzX2dyYm5yZXNwb25zZV90ICopKG5wICsgMSk7CisJCQlUQ0hFQ0soZ3Jibi0+bnNpZ3MpOworCisJCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLworCQkJaWYgKHZmbGFnID4gMikgeworCQkJCXByaW50ZigiIGZsYWdzOjB4JXgiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZ3Jibi0+ZmxhZ3MpKTsKKwkJCX0KKworCQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX3R5cGUyc3RyLCAiVHlwZSVkIiwKKwkJCSAgICBFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmR0eXBlKSkpOworCQkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZncmJuLT5yZGNsYXNzKSAhPSBDX0lOKSB7CisJCQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX2NsYXNzMnN0ciwgIkNsYXNzJWQiLAorCQkJCSAgICBFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmRjbGFzcykpKTsKKwkJCX0KKwkJCXByaW50ZigiIFRUTCAiKTsKKwkJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMzJCSVRTKCZncmJuLT50dGwpKTsKKwkJCXByaW50ZigiICV1LyV1IiwgRVhUUkFDVF8xNkJJVFMoJmdyYm4tPm5yZGF0YXMpLAorCQkJICAgIEVYVFJBQ1RfMTZCSVRTKCZncmJuLT5uc2lncykpOworCisJCQkvKiBYWFggZ3JibiBwb2ludHMgdG8gcGFja2VkIHN0cnVjdCAqLworCQkJcyA9IChjb25zdCBjaGFyICopJmdyYm4tPm5zaWdzKyBzaXplb2YoZ3Jibi0+bnNpZ3MpOworCisJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lbGVuKHMpOworCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCWdvdG8gdHJ1bmM7CisJCQlzICs9IGFkdmFuY2U7CisKKwkJCS8qIHJkYXRhcyAqLworCQkJbmEgPSBFWFRSQUNUXzE2QklUUygmZ3Jibi0+bnJkYXRhcyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmE7IGkrKykgeworCQkJCS8qIFhYWCBzaG91bGQgZGVjb2RlIHJlc291cmNlIGRhdGEgKi8KKwkJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRiaW5sZW4ocyk7CisJCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCQlnb3RvIHRydW5jOworCQkJCXMgKz0gYWR2YW5jZTsKKwkJCX0KKworCQkJLyogc2lncyAqLworCQkJbmEgPSBFWFRSQUNUXzE2QklUUygmZ3Jibi0+bnNpZ3MpOworCQkJZm9yIChpID0gMDsgaSA8IG5hOyBpKyspIHsKKwkJCQkvKiBYWFggaG93IHNob3VsZCB3ZSBwcmludCBpdD8gKi8KKwkJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRiaW5sZW4ocyk7CisJCQkJaWYgKGFkdmFuY2UgPCAwKQorCQkJCQlnb3RvIHRydW5jOworCQkJCXMgKz0gYWR2YW5jZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdW5zdXBwb3J0ZWQrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCisgIHRhaWw6CisJLyogbGVuZ3RoIG1pc21hdGNoICovCisJaWYgKEVYVFJBQ1RfMzJCSVRTKCZucC0+bGVuZ3RoKSAhPSBsZW5ndGgpIHsKKwkJcHJpbnRmKCIgW2xlbjogJXUgIT0gJXVdIiwgRVhUUkFDVF8zMkJJVFMoJm5wLT5sZW5ndGgpLAorCQkgICAgbGVuZ3RoKTsKKwl9CisJaWYgKCF1bnN1cHBvcnRlZCAmJiBzIDwgKGNvbnN0IGNoYXIgKilucCArIEVYVFJBQ1RfMzJCSVRTKCZucC0+bGVuZ3RoKSkKKwkJcHJpbnRmKCJbZXh0cmFdIik7CisJcmV0dXJuOworCisgIHRydW5jOgorCXByaW50ZigiW3xsd3Jlc10iKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9wcmludC1tb2JpbGUuYyBiL3ByaW50LW1vYmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmYwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1tb2JpbGUuYwpAQCAtMCwwICsxLDEwOSBAQAorLyoJJE5ldEJTRDogcHJpbnQtbW9iaWxlLmMsdiAxLjIgMTk5OC8wOS8zMCAwODo1NzowMSBod3IgRXhwICQgKi8KKworLyoKKyAqIChjKSAxOTk4IFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgorICogYnkgSGVpa28gVy5SdXBwIDxod3JAcGlsaHVobi5kZT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE5ldEJTRAorICogICAgICAgIEZvdW5kYXRpb24sIEluYy4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBOZXRCU0QgRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgTkVUQlNEIEZPVU5EQVRJT04sIElOQy4gQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBGT1VOREFUSU9OIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbW9iaWxlLmMsdiAxLjE1IDIwMDQvMDMvMjQgMDE6NTg6MTQgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKKyNkZWZpbmUgTU9CSUxFX1NJWkUgKDgpCisKK3N0cnVjdCBtb2JpbGVfaXAgeworCXVfaW50MTZfdCBwcm90bzsKKwl1X2ludDE2X3QgaGNoZWNrOworCXVfaW50MzJfdCBvZHN0OworCXVfaW50MzJfdCBvc3JjOworfTsKKworI2RlZmluZSBPU1JDX1BSRVMJMHgwMDgwCS8qIG9sZCBzb3VyY2UgaXMgcHJlc2VudCAqLworCisvKgorICogRGVlbmNhcHN1bGF0ZSBhbmQgcHJpbnQgYSBtb2JpbGUtdHVubmVsZWQgSVAgZGF0YWdyYW0KKyAqLwordm9pZAorbW9iaWxlX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwljb25zdCB1X2NoYXIgKmNwID0gYnAgKzggOworCWNvbnN0IHN0cnVjdCBtb2JpbGVfaXAgKm1vYjsKKwl1X3Nob3J0IHByb3RvLGNyYzsKKwl1X2NoYXIgb3NwID0wOwkJCS8qIG9sZCBzb3VyY2UgYWRkcmVzcyBwcmVzZW50ICovCisKKwltb2IgPSAoY29uc3Qgc3RydWN0IG1vYmlsZV9pcCAqKWJwOworCisJaWYgKGxlbmd0aCA8IE1PQklMRV9TSVpFIHx8ICFUVEVTVCgqbW9iKSkgeworCQlmcHV0cygiW3xtb2JpbGVdIiwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlmcHV0cygibW9iaWxlOiAiLCBzdGRvdXQpOworCisJcHJvdG8gPSBFWFRSQUNUXzE2QklUUygmbW9iLT5wcm90byk7CisJY3JjID0gIEVYVFJBQ1RfMTZCSVRTKCZtb2ItPmhjaGVjayk7CisJaWYgKHByb3RvICYgT1NSQ19QUkVTKSB7CisJCW9zcD0xOworCQljcCArPTQgOworCX0KKworCWlmIChvc3ApICB7CisJCWZwdXRzKCJbU10gIixzdGRvdXQpOworCQlpZiAodmZsYWcpCisJCQkodm9pZClwcmludGYoIiVzICIsaXBhZGRyX3N0cmluZygmbW9iLT5vc3JjKSk7CisJfSBlbHNlIHsKKwkJZnB1dHMoIltdICIsc3Rkb3V0KTsKKwl9CisJaWYgKHZmbGFnKSB7CisJCSh2b2lkKXByaW50ZigiPiAlcyAiLGlwYWRkcl9zdHJpbmcoJm1vYi0+b2RzdCkpOworCQkodm9pZClwcmludGYoIihvcHJvdG89JWQpIixwcm90bz4+OCk7CisJfQorCWlmIChpbl9ja3N1bSgodV9zaG9ydCAqKW1vYiwgb3NwID8gMTIgOiA4LCAwKSE9MCkgeworCQkodm9pZClwcmludGYoIiAoYmFkIGNoZWNrc3VtICVkKSIsY3JjKTsKKwl9CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9wcmludC1tb2JpbGl0eS5jIGIvcHJpbnQtbW9iaWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjljYmVlCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbW9iaWxpdHkuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW1vYmlsaXR5LmMsdiAxLjExLjIuMSAyMDA1LzA0LzIwIDIyOjIxOjE2IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIElORVQ2CisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpcDYuaCIKKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KKworLyogTW9iaWxpdHkgaGVhZGVyICovCitzdHJ1Y3QgaXA2X21vYmlsaXR5IHsKKwl1X2ludDhfdCBpcDZtX3Bwcm90bzsJLyogZm9sbG93aW5nIHBheWxvYWQgcHJvdG9jb2wgKGZvciBQRykgKi8KKwl1X2ludDhfdCBpcDZtX2xlbjsJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCisJdV9pbnQ4X3QgaXA2bV90eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwl1X2ludDhfdCByZXNlcnZlZDsJLyogcmVzZXJ2ZWQgKi8KKwl1X2ludDE2X3QgaXA2bV9ja3N1bTsJLyogc3VtIG9mIElQdjYgcHNldWRvLWhlYWRlciBhbmQgTUggKi8KKwl1bmlvbiB7CisJCXVfaW50MTZfdAlpcDZtX3VuX2RhdGExNlsxXTsgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLworCQl1X2ludDhfdAlpcDZtX3VuX2RhdGE4WzJdOyAgLyogdHlwZS1zcGVjaWZpYyBmaWVkbCAqLworCX0gaXA2bV9kYXRhdW47Cit9OworCisjZGVmaW5lIGlwNm1fZGF0YTE2CWlwNm1fZGF0YXVuLmlwNm1fdW5fZGF0YTE2CisjZGVmaW5lIGlwNm1fZGF0YTgJaXA2bV9kYXRhdW4uaXA2bV91bl9kYXRhOAorCisjZGVmaW5lIElQNk1fTUlOTEVOCTgKKworLyogbWVzc2FnZSB0eXBlICovCisjZGVmaW5lIElQNk1fQklORElOR19SRVFVRVNUCTAJLyogQmluZGluZyBSZWZyZXNoIFJlcXVlc3QgKi8KKyNkZWZpbmUgSVA2TV9IT01FX1RFU1RfSU5JVAkxCS8qIEhvbWUgVGVzdCBJbml0ICovCisjZGVmaW5lIElQNk1fQ0FSRU9GX1RFU1RfSU5JVAkyCS8qIENhcmUtb2YgVGVzdCBJbml0ICovCisjZGVmaW5lIElQNk1fSE9NRV9URVNUCQkzCS8qIEhvbWUgVGVzdCAqLworI2RlZmluZSBJUDZNX0NBUkVPRl9URVNUCTQJLyogQ2FyZS1vZiBUZXN0ICovCisjZGVmaW5lIElQNk1fQklORElOR19VUERBVEUJNQkvKiBCaW5kaW5nIFVwZGF0ZSAqLworI2RlZmluZSBJUDZNX0JJTkRJTkdfQUNLCTYJLyogQmluZGluZyBBY2tub3dsZWRnZW1lbnQgKi8KKyNkZWZpbmUgSVA2TV9CSU5ESU5HX0VSUk9SCTcJLyogQmluZGluZyBFcnJvciAqLworCisvKiBNb2JpbGl0eSBIZWFkZXIgT3B0aW9ucyAqLworI2RlZmluZSBJUDZNT1BUX01JTkxFTgkJMgorI2RlZmluZSBJUDZNT1BUX1BBRDEgICAgICAgICAgMHgwCS8qIFBhZDEgKi8KKyNkZWZpbmUgSVA2TU9QVF9QQUROICAgICAgICAgIDB4MQkvKiBQYWROICovCisjZGVmaW5lIElQNk1PUFRfUkVGUkVTSAkgICAgICAweDIJLyogQmluZGluZyBSZWZyZXNoIEFkdmljZSAqLworI2RlZmluZSBJUDZNT1BUX1JFRlJFU0hfTUlOTEVOICA0CisjZGVmaW5lIElQNk1PUFRfQUxUQ09BICAgICAgICAweDMJLyogQWx0ZXJuYXRlIENhcmUtb2YgQWRkcmVzcyAqLworI2RlZmluZSBJUDZNT1BUX0FMVENPQV9NSU5MRU4gIDE4CisjZGVmaW5lIElQNk1PUFRfTk9OQ0VJRCAgICAgICAweDQJLyogTm9uY2UgSW5kaWNlcyAqLworI2RlZmluZSBJUDZNT1BUX05PTkNFSURfTUlOTEVOICA2CisjZGVmaW5lIElQNk1PUFRfQVVUSCAgICAgICAgICAweDUJLyogQmluZGluZyBBdXRob3JpemF0aW9uIERhdGEgKi8KKyNkZWZpbmUgSVA2TU9QVF9BVVRIX01JTkxFTiAgICAxMgorCitzdGF0aWMgdm9pZAorbW9iaWxpdHlfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW4pCit7CisJaW50IGk7CisJaW50IG9wdGxlbjsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gb3B0bGVuKSB7CisJCWlmIChicFtpXSA9PSBJUDZNT1BUX1BBRDEpCisJCQlvcHRsZW4gPSAxOworCQllbHNlIHsKKwkJCWlmIChpICsgMSA8IGxlbikKKwkJCQlvcHRsZW4gPSBicFtpICsgMV0gKyAyOworCQkJZWxzZQorCQkJCWdvdG8gdHJ1bmM7CisJCX0KKwkJaWYgKGkgKyBvcHRsZW4gPiBsZW4pCisJCQlnb3RvIHRydW5jOworCisJCXN3aXRjaCAoYnBbaV0pIHsKKwkJY2FzZSBJUDZNT1BUX1BBRDE6CisJCQlwcmludGYoIihwYWQxKSIpOworCQkJYnJlYWs7CisJCWNhc2UgSVA2TU9QVF9QQUROOgorCQkJaWYgKGxlbiAtIGkgPCBJUDZNT1BUX01JTkxFTikgeworCQkJCXByaW50ZigiKHBhZG46IHRydW5jKSIpOworCQkJCWdvdG8gdHJ1bmM7CisJCQl9CisJCQlwcmludGYoIihwYWRuKSIpOworCQkJYnJlYWs7CisJCWNhc2UgSVA2TU9QVF9SRUZSRVNIOgorCQkJaWYgKGxlbiAtIGkgPCBJUDZNT1BUX1JFRlJFU0hfTUlOTEVOKSB7CisJCQkJcHJpbnRmKCIocmVmcmVzaDogdHJ1bmMpIik7CisJCQkJZ290byB0cnVuYzsKKwkJCX0KKwkJCS8qIHVuaXRzIG9mIDQgc2VjcyAqLworCQkJcHJpbnRmKCIocmVmcmVzaDogJWQpIiwKKwkJCQlFWFRSQUNUXzE2QklUUygmYnBbaSsyXSkgPDwgMik7CisJCQlicmVhazsKKwkJY2FzZSBJUDZNT1BUX0FMVENPQToKKwkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9BTFRDT0FfTUlOTEVOKSB7CisJCQkJcHJpbnRmKCIoYWx0Y29hOiB0cnVuYykiKTsKKwkJCQlnb3RvIHRydW5jOworCQkJfQorCQkJcHJpbnRmKCIoYWx0LUNvQTogJXMpIiwgaXA2YWRkcl9zdHJpbmcoJmJwW2krMl0pKTsKKwkJCWJyZWFrOworCQljYXNlIElQNk1PUFRfTk9OQ0VJRDoKKwkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9OT05DRUlEX01JTkxFTikgeworCQkJCXByaW50ZigiKG5pOiB0cnVuYykiKTsKKwkJCQlnb3RvIHRydW5jOworCQkJfQorCQkJcHJpbnRmKCIobmk6IGhvPTB4JTA0eCBjbz0weCUwNHgpIiwKKwkJCQlFWFRSQUNUXzE2QklUUygmYnBbaSsyXSksCisJCQkJRVhUUkFDVF8xNkJJVFMoJmJwW2krNF0pKTsKKwkJCWJyZWFrOworCQljYXNlIElQNk1PUFRfQVVUSDoKKwkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9BVVRIX01JTkxFTikgeworCQkJCXByaW50ZigiKGF1dGg6IHRydW5jKSIpOworCQkJCWdvdG8gdHJ1bmM7CisJCQl9CisJCQlwcmludGYoIihhdXRoKSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAobGVuIC0gaSA8IElQNk1PUFRfTUlOTEVOKSB7CisJCQkJcHJpbnRmKCIoc29wdF90eXBlICVkOiB0cnVuYykiLCBicFtpXSk7CisJCQkJZ290byB0cnVuYzsKKwkJCX0KKwkJCXByaW50ZigiKHR5cGUtMHglMDJ4OiBsZW49JWQpIiwgYnBbaV0sIGJwW2kgKyAxXSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiW3RydW5jXSAiKTsKK30KKworLyoKKyAqIE1vYmlsaXR5IEhlYWRlcgorICovCitpbnQKK21vYmlsaXR5X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IHVfY2hhciAqYnAyIF9VXykKK3sKKwljb25zdCBzdHJ1Y3QgaXA2X21vYmlsaXR5ICptaDsKKwljb25zdCB1X2NoYXIgKmVwOworCWludCBtaGxlbiwgaGxlbiwgdHlwZTsKKworCW1oID0gKHN0cnVjdCBpcDZfbW9iaWxpdHkgKilicDsKKworCS8qICdlcCcgcG9pbnRzIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIGRhdGEuICovCisJZXAgPSBzbmFwZW5kOworCisJaWYgKCFUVEVTVChtaC0+aXA2bV9sZW4pKSB7CisJCS8qCisJCSAqIFRoZXJlJ3Mgbm90IGVub3VnaCBjYXB0dXJlZCBkYXRhIHRvIGluY2x1ZGUgdGhlCisJCSAqIG1vYmlsaXR5IGhlYWRlciBsZW5ndGguCisJCSAqCisJCSAqIE91ciBjYWxsZXIgZXhwZWN0cyB1cyB0byByZXR1cm4gdGhlIGxlbmd0aCwgaG93ZXZlciwKKwkJICogc28gcmV0dXJuIGEgdmFsdWUgdGhhdCB3aWxsIHJ1biB0byB0aGUgZW5kIG9mIHRoZQorCQkgKiBjYXB0dXJlZCBkYXRhLgorCQkgKgorCQkgKiBYWFggLSAiaXA2X3ByaW50KCkiIGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUKKwkJICogcmV0dXJuZWQgbGVuZ3RoLCBob3dldmVyLCBhcyBpdCBicmVha3Mgb3V0IG9mIHRoZQorCQkgKiBoZWFkZXItcHJvY2Vzc2luZyBsb29wLgorCQkgKi8KKwkJbWhsZW4gPSBlcCAtIGJwOworCQlnb3RvIHRydW5jOworCX0KKwltaGxlbiA9IChpbnQpKChtaC0+aXA2bV9sZW4gKyAxKSA8PCAzKTsKKworCS8qIFhYWCBpcDZtX2Nrc3VtICovCisKKwlUQ0hFQ0sobWgtPmlwNm1fdHlwZSk7CisJdHlwZSA9IG1oLT5pcDZtX3R5cGU7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUDZNX0JJTkRJTkdfUkVRVUVTVDoKKwkJcHJpbnRmKCJtb2JpbGl0eTogQlJSIik7CisJCWhsZW4gPSBJUDZNX01JTkxFTjsKKwkJYnJlYWs7CisJY2FzZSBJUDZNX0hPTUVfVEVTVF9JTklUOgorCWNhc2UgSVA2TV9DQVJFT0ZfVEVTVF9JTklUOgorCQlwcmludGYoIm1vYmlsaXR5OiAlc29USSIsCisJCQl0eXBlID09IElQNk1fSE9NRV9URVNUX0lOSVQgPyAiSCIgOiAiQyIpOworCQlobGVuID0gSVA2TV9NSU5MRU47CisgICAgCQlpZiAodmZsYWcpIHsKKwkJCVRDSEVDSzIoKm1oLCBobGVuICsgOCk7CisJCQlwcmludGYoIiAlcyBJbml0IENvb2tpZT0lMDh4OiUwOHgiLAorCQkJICAgICAgIHR5cGUgPT0gSVA2TV9IT01FX1RFU1RfSU5JVCA/ICJIb21lIiA6ICJDYXJlLW9mIiwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmYnBbaGxlbl0pLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZicFtobGVuICsgNF0pKTsKKwkJfQorCQlobGVuICs9IDg7CisJCWJyZWFrOworCWNhc2UgSVA2TV9IT01FX1RFU1Q6CisJY2FzZSBJUDZNX0NBUkVPRl9URVNUOgorCQlwcmludGYoIm1vYmlsaXR5OiAlc29UIiwKKwkJCXR5cGUgPT0gSVA2TV9IT01FX1RFU1QgPyAiSCIgOiAiQyIpOworCQlUQ0hFQ0sobWgtPmlwNm1fZGF0YTE2WzBdKTsKKwkJcHJpbnRmKCIgbm9uY2UgaWQ9MHgleCIsIEVYVFJBQ1RfMTZCSVRTKCZtaC0+aXA2bV9kYXRhMTZbMF0pKTsKKwkJaGxlbiA9IElQNk1fTUlOTEVOOworICAgIAkJaWYgKHZmbGFnKSB7CisJCQlUQ0hFQ0syKCptaCwgaGxlbiArIDgpOworCQkJcHJpbnRmKCIgJXMgSW5pdCBDb29raWU9JTA4eDolMDh4IiwKKwkJCSAgICAgICB0eXBlID09IElQNk1fSE9NRV9URVNUID8gIkhvbWUiIDogIkNhcmUtb2YiLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZicFtobGVuXSksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmJwW2hsZW4gKyA0XSkpOworCQl9CisJCWhsZW4gKz0gODsKKyAgICAJCWlmICh2ZmxhZykgeworCQkJVENIRUNLMigqbWgsIGhsZW4gKyA4KTsKKwkJCXByaW50ZigiICVzIEtleWdlbiBUb2tlbj0lMDh4OiUwOHgiLAorCQkJICAgICAgIHR5cGUgPT0gSVA2TV9IT01FX1RFU1QgPyAiSG9tZSIgOiAiQ2FyZS1vZiIsCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmJwW2hsZW5dKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmYnBbaGxlbiArIDRdKSk7CisJCX0KKwkJaGxlbiArPSA4OworCQlicmVhazsKKwljYXNlIElQNk1fQklORElOR19VUERBVEU6CisJCXByaW50ZigibW9iaWxpdHk6IEJVIik7CisJCVRDSEVDSyhtaC0+aXA2bV9kYXRhMTZbMF0pOworCQlwcmludGYoIiBzZXEjPSVkIiwgRVhUUkFDVF8xNkJJVFMoJm1oLT5pcDZtX2RhdGExNlswXSkpOworCQlobGVuID0gSVA2TV9NSU5MRU47CisJCVRDSEVDSzIoKm1oLCBobGVuICsgMSk7CisJCWlmIChicFtobGVuXSAmIDB4ZjApCisJCQlwcmludGYoIiAiKTsKKwkJaWYgKGJwW2hsZW5dICYgMHg4MCkKKwkJCXByaW50ZigiQSIpOworCQlpZiAoYnBbaGxlbl0gJiAweDQwKQorCQkJcHJpbnRmKCJIIik7CisJCWlmIChicFtobGVuXSAmIDB4MjApCisJCQlwcmludGYoIkwiKTsKKwkJaWYgKGJwW2hsZW5dICYgMHgxMCkKKwkJCXByaW50ZigiSyIpOworCQkvKiBSZXNlcnZlZCAoNGJpdHMpICovCisJCWhsZW4gKz0gMTsKKwkJLyogUmVzZXJ2ZWQgKDhiaXRzKSAqLworCQlobGVuICs9IDE7CisJCVRDSEVDSzIoKm1oLCBobGVuICsgMik7CisJCS8qIHVuaXRzIG9mIDQgc2VjcyAqLworCQlwcmludGYoIiBsaWZldGltZT0lZCIsIEVYVFJBQ1RfMTZCSVRTKCZicFtobGVuXSkgPDwgMik7CisJCWhsZW4gKz0gMjsKKwkJYnJlYWs7CisJY2FzZSBJUDZNX0JJTkRJTkdfQUNLOgorCQlwcmludGYoIm1vYmlsaXR5OiBCQSIpOworCQlUQ0hFQ0sobWgtPmlwNm1fZGF0YThbMF0pOworCQlwcmludGYoIiBzdGF0dXM9JWQiLCBtaC0+aXA2bV9kYXRhOFswXSk7CisJCWlmIChtaC0+aXA2bV9kYXRhOFsxXSAmIDB4ODApCisJCQlwcmludGYoIiBLIik7CisJCS8qIFJlc2VydmVkICg3Yml0cykgKi8KKwkJaGxlbiA9IElQNk1fTUlOTEVOOworCQlUQ0hFQ0syKCptaCwgaGxlbiArIDIpOworCQlwcmludGYoIiBzZXEjPSVkIiwgRVhUUkFDVF8xNkJJVFMoJmJwW2hsZW5dKSk7CisJCWhsZW4gKz0gMjsKKwkJVENIRUNLMigqbWgsIGhsZW4gKyAyKTsKKwkJLyogdW5pdHMgb2YgNCBzZWNzICovCisJCXByaW50ZigiIGxpZmV0aW1lPSVkIiwgRVhUUkFDVF8xNkJJVFMoJmJwW2hsZW5dKSA8PCAyKTsKKwkJaGxlbiArPSAyOworCQlicmVhazsKKwljYXNlIElQNk1fQklORElOR19FUlJPUjoKKwkJcHJpbnRmKCJtb2JpbGl0eTogQkUiKTsKKwkJVENIRUNLKG1oLT5pcDZtX2RhdGE4WzBdKTsKKwkJcHJpbnRmKCIgc3RhdHVzPSVkIiwgbWgtPmlwNm1fZGF0YThbMF0pOworCQkvKiBSZXNlcnZlZCAqLworCQlobGVuID0gSVA2TV9NSU5MRU47CisJCVRDSEVDSzIoKm1oLCBobGVuICsgMTYpOworCQlwcmludGYoIiBob21lYWRkciAlcyIsIGlwNmFkZHJfc3RyaW5nKCZicFtobGVuXSkpOworCQlobGVuICs9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIm1vYmlsaXR5OiB0eXBlLSMlZCBsZW49JWQiLCB0eXBlLCBtaC0+aXA2bV9sZW4pOworCQlyZXR1cm4obWhsZW4pOworCQlicmVhazsKKwl9CisgICAgCWlmICh2ZmxhZykKKwkJbW9iaWxpdHlfb3B0X3ByaW50KCZicFtobGVuXSwgbWhsZW4gLSBobGVuKTsKKworCXJldHVybihtaGxlbik7CisKKyB0cnVuYzoKKwlmcHV0cygiW3xNT0JJTElUWV0iLCBzdGRvdXQpOworCXJldHVybihtaGxlbik7Cit9CisjZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL3ByaW50LW1wbHMuYyBiL3ByaW50LW1wbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDU0NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbXBscy5jCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFdJREUgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW1wbHMuYyx2IDEuMTMuMi4xIDIwMDUvMDcvMDUgMDk6Mzk6MjkgaGFubmVzIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisjaW5jbHVkZSAibXBscy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqbXBsc19sYWJlbG5hbWVbXSA9IHsKKy8qMCovCSJJUHY0IGV4cGxpY2l0IE5VTEwiLCAicm91dGVyIGFsZXJ0IiwgIklQdjYgZXhwbGljaXQgTlVMTCIsCisJImltcGxpY2l0IE5VTEwiLCAicnN2ZCIsCisvKjUqLwkicnN2ZCIsICJyc3ZkIiwgInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwKKy8qMTAqLwkicnN2ZCIsICJyc3ZkIiwgInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwKKy8qMTUqLwkicnN2ZCIsCit9OworCisvKgorICogUkZDMzAzMjogTVBMUyBsYWJlbCBzdGFjayBlbmNvZGluZworICovCit2b2lkCittcGxzX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwljb25zdCB1X2NoYXIgKnA7CisJdV9pbnQzMl90IGxhYmVsX2VudHJ5OworICAgICAgICB1X2ludDE2X3QgbGFiZWxfc3RhY2tfZGVwdGggPSAwOworCisJcCA9IGJwOworCXByaW50ZigiTVBMUyIpOworCWRvIHsKKwkJVENIRUNLMigqcCwgc2l6ZW9mKGxhYmVsX2VudHJ5KSk7CisJCWxhYmVsX2VudHJ5ID0gRVhUUkFDVF8zMkJJVFMocCk7CisJCXByaW50ZigiJXMobGFiZWwgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zdGFja19kZXB0aCA/ICJcblx0IiA6ICIgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTVBMU19MQUJFTChsYWJlbF9lbnRyeSkpOworICAgICAgICAgICAgICAgIGxhYmVsX3N0YWNrX2RlcHRoKys7CisJCWlmICh2ZmxhZyAmJgorCQkgICAgTVBMU19MQUJFTChsYWJlbF9lbnRyeSkgPCBzaXplb2YobXBsc19sYWJlbG5hbWUpIC8gc2l6ZW9mKG1wbHNfbGFiZWxuYW1lWzBdKSkKKwkJCXByaW50ZigiICglcykiLCBtcGxzX2xhYmVsbmFtZVtNUExTX0xBQkVMKGxhYmVsX2VudHJ5KV0pOworCQlwcmludGYoIiwgZXhwICV1IiwgTVBMU19FWFAobGFiZWxfZW50cnkpKTsKKwkJaWYgKE1QTFNfU1RBQ0sobGFiZWxfZW50cnkpKQorCQkJcHJpbnRmKCIsIFtTXSIpOworCQlwcmludGYoIiwgdHRsICV1KSIsIE1QTFNfVFRMKGxhYmVsX2VudHJ5KSk7CisKKwkJcCArPSBzaXplb2YobGFiZWxfZW50cnkpOworCX0gd2hpbGUgKCFNUExTX1NUQUNLKGxhYmVsX2VudHJ5KSk7CisKKwlzd2l0Y2ggKE1QTFNfTEFCRUwobGFiZWxfZW50cnkpKSB7CisJY2FzZSAwOgkvKiBJUHY0IGV4cGxpY2l0IE5VTEwgbGFiZWwgKi8KKyAgICAgICAgY2FzZSAzOgkvKiBJUHY0IGltcGxpY2l0IE5VTEwgbGFiZWwgKi8KKyAgICAgICAgICAgICAgICBpZiAodmZsYWc+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGggLSAocCAtIGJwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIsIElQLCBsZW5ndGg6ICV1IixsZW5ndGgpOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgMjoJLyogSVB2NiBleHBsaWNpdCBOVUxMIGxhYmVsICovCisgICAgICAgICAgICAgICAgaWYgKHZmbGFnPjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaXA2X3ByaW50KHAsIGxlbmd0aCAtIChwIC0gYnApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBwcmludGYoIiwgSVB2NiwgbGVuZ3RoOiAldSIsbGVuZ3RoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBHZW5lcmFsbHkgdGhlcmUncyBubyBpbmRpY2F0aW9uIG9mIHByb3RvY29sIGluIE1QTFMgbGFiZWwKKwkJICogZW5jb2RpbmcsIGhvd2V2ZXIgZHJhZnQtaHNtaXQtaXNpcy1hYWw1bXV4LTAwLnR4dCBkZXNjcmliZXMKKyAgICAgICAgICAgICAgICAgKiBhIHRlY2huaXF1ZSB0aGF0IGxvb2tzIGF0IHRoZSBmaXJzdCBwYXlsb2FkIGJ5dGUgaWYgdGhlIEJPUyAoYm90dG9tIG9mIHN0YWNrKQorICAgICAgICAgICAgICAgICAqIGJpdCBpcyBzZXQgYW5kIHRyaWVzIHRvIGRldGVybWluZSB0aGUgbmV0d29yayBsYXllciBwcm90b2NvbAorICAgICAgICAgICAgICAgICAqIDB4NDUtMHg0ZiBpcyBJUHY0CisgICAgICAgICAgICAgICAgICogMHg2MC0weDZmIGlzIElQdjYKKyAgICAgICAgICAgICAgICAgKiAweDgxLTB4ODMgaXMgT1NJIChDTE5QLEVTLUlTLElTLUlTKQorICAgICAgICAgICAgICAgICAqIHRoaXMgdGVjaG5pcXVlIGlzIHNvbWV0aW1lcyBrbm93biBhcyBOVUxMIGVuY2Fwc3VsYXRpb24KKyAgICAgICAgICAgICAgICAgKiBhbmQgZGVjb2RpbmcgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY29udHJvbC1wbGFuZSB0cmFmZmljIFtCR1BdCisgICAgICAgICAgICAgICAgICogd2hpY2ggY2lzY28gYnkgZGVmYXVsdCBzZW5kcyBNUExTIGVuY2Fwc3VsYXRlZAorCQkgKi8KKworICAgICAgICAgICAgICAgIGlmIChNUExTX1NUQUNLKGxhYmVsX2VudHJ5KSkgeyAvKiBvbmx5IGRvIHRoaXMgaWYgdGhlIHN0YWNrIGJpdCBpcyBzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCpwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDQ2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDQ5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NGE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0YjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRjOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NGQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0ZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRmOgorCQkgICAgICAgIGlmICh2ZmxhZz4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoIC0gKHAgLSBicCkpOworCQkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIsIElQLCBsZW5ndGg6ICV1IixsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDYwOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDYzOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2NToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4Njc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY5OgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2YjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDZjOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2ZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDZmOgorCQkgICAgICAgIGlmICh2ZmxhZz4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2X3ByaW50KHAsIGxlbmd0aCAtIChwIC0gYnApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQllbHNlIHByaW50ZigiLCBJUHY2LCBsZW5ndGg6ICV1IixsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDgxOgorICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4MzoKKwkJICAgICAgICBpZiAodmZsYWc+MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCwgbGVuZ3RoIC0gKHAgLSBicCksIGxlbmd0aCAtIChwIC0gYnApKTsKKwkJCSAgICB9CisJCQllbHNlIHByaW50ZigiLCBPU0ksIGxlbmd0aDogJXUiLGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9rIGJhaWwgb3V0IC0gd2UgZGlkIG5vdCBmaWd1cmUgb3V0IHdoYXQgaXQgaXMqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworCX0KKwordHJ1bmM6CisJcHJpbnRmKCJbfE1QTFNdIik7Cit9CisKKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LW1zZHAuYyBiL3ByaW50LW1zZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc5YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtbXNkcC5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIFdpbGxpYW0gQy4gRmVubmVyLgorICogICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUaGUgbmFtZSBvZiBXaWxsaWFtIEMuIEZlbm5lciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgorICogcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW1zZHAuYyx2IDEuNyAyMDA1LzA0LzA2IDIxOjMyOjQxIG1jciBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisjZGVmaW5lIE1TRFBfVFlQRV9NQVgJNworCit2b2lkCittc2RwX3ByaW50KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNwLCB1X2ludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IHR5cGUsIGxlbjsKKworCVRDSEVDSzIoKnNwLCAzKTsKKwkvKiBTZWUgaWYgd2UgdGhpbmsgd2UncmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbXBvdW5kIHBhY2tldCAqLworCXR5cGUgPSAqc3A7CisJbGVuID0gRVhUUkFDVF8xNkJJVFMoc3AgKyAxKTsKKwlpZiAobGVuID4gMTUwMCB8fCBsZW4gPCAzIHx8IHR5cGUgPT0gMCB8fCB0eXBlID4gTVNEUF9UWVBFX01BWCkKKwkJZ290byB0cnVuYzsJLyogbm90IHJlYWxseSB0cnVuY2F0ZWQsIGJ1dCBzdGlsbCBub3QgZGVjb2RhYmxlICovCisJKHZvaWQpcHJpbnRmKCIgbXNkcDoiKTsKKwl3aGlsZSAobGVuZ3RoID4gMCkgeworCQlUQ0hFQ0syKCpzcCwgMyk7CisJCXR5cGUgPSAqc3A7CisJCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKHNwICsgMSk7CisJCWlmIChsZW4gPiAxNDAwIHx8IHZmbGFnKQorCQkJcHJpbnRmKCIgW2xlbiAldV0iLCBsZW4pOworCQlpZiAobGVuIDwgMykKKwkJCWdvdG8gdHJ1bmM7CisJCXNwICs9IDM7CisJCWxlbmd0aCAtPSAzOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSAxOgkvKiBJUHY0IFNvdXJjZS1BY3RpdmUgKi8KKwkJY2FzZSAzOiAvKiBJUHY0IFNvdXJjZS1BY3RpdmUgUmVzcG9uc2UgKi8KKwkJCWlmICh0eXBlID09IDEpCisJCQkJKHZvaWQpcHJpbnRmKCIgU0EiKTsKKwkJCWVsc2UKKwkJCQkodm9pZClwcmludGYoIiBTQS1SZXNwb25zZSIpOworCQkJVENIRUNLKCpzcCk7CisJCQkodm9pZClwcmludGYoIiAldSBlbnRyaWVzIiwgKnNwKTsKKwkJCWlmICgodV9pbnQpKCgqc3AgKiAxMikgKyA4KSA8IGxlbikgeworCQkJCSh2b2lkKXByaW50ZigiIFt3L2RhdGFdIik7CisJCQkJaWYgKHZmbGFnID4gMSkgeworCQkJCQkodm9pZClwcmludGYoIiAiKTsKKwkJCQkJaXBfcHJpbnQoZ25kbywgc3AgKyAqc3AgKiAxMiArIDggLSAzLAorCQkJCQkgICAgICAgICBsZW4gLSAoKnNwICogMTIgKyA4KSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCSh2b2lkKXByaW50ZigiIFNBLVJlcXVlc3QiKTsKKwkJCVRDSEVDSzIoKnNwLCA1KTsKKwkJCSh2b2lkKXByaW50ZigiIGZvciAlcyIsIGlwYWRkcl9zdHJpbmcoc3AgKyAxKSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJKHZvaWQpcHJpbnRmKCIgS2VlcGFsaXZlIik7CisJCQlpZiAobGVuICE9IDMpCisJCQkJKHZvaWQpcHJpbnRmKCJbbGVuPSVkXSAiLCBsZW4pOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCSh2b2lkKXByaW50ZigiIE5vdGlmaWNhdGlvbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkodm9pZClwcmludGYoIiBbdHlwZT0lZCBsZW49JWRdIiwgdHlwZSwgbGVuKTsKKwkJCWJyZWFrOworCQl9CisJCXNwICs9IChsZW4gLSAzKTsKKwkJbGVuZ3RoIC09IChsZW4gLSAzKTsKKwl9CisJcmV0dXJuOwordHJ1bmM6CisJKHZvaWQpcHJpbnRmKCIgW3xtc2RwXSIpOworfQorCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtbmV0Ymlvcy5jIGIvcHJpbnQtbmV0Ymlvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTk1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1uZXRiaW9zLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZvcm1hdCBhbmQgcHJpbnQgTkVUQklPUyBwYWNrZXRzLgorICogQ29udHJpYnV0ZWQgYnkgQnJhZCBQYXJrZXIgKGJyYWRAZmNyLmNvbSkuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbmV0Ymlvcy5jLHYgMS4yMCAyMDAzLzExLzE2IDA5OjM2OjI5IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAibmV0Ymlvcy5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworLyoKKyAqIFByaW50IE5FVEJJT1MgcGFja2V0cy4KKyAqLwordm9pZAorbmV0Ymlvc19wcmludChzdHJ1Y3QgcDgwMjJIZHIgKm5iLCB1X2ludCBsZW5ndGgpCit7CisJaWYgKGxlbmd0aCA8IHA4MDIyU2l6ZSkgeworCQkodm9pZClwcmludGYoIiB0cnVuY2F0ZWQtbmV0YmlvcyAlZCIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobmItPmZsYWdzID09IFVJKSB7CisJICAgICh2b2lkKXByaW50ZigiODAyLjEgVUkgIik7CisJfSBlbHNlIHsKKwkgICAgKHZvaWQpcHJpbnRmKCI4MDIuMSBDT05OICIpOworCX0KKworCWlmICgodV9jaGFyICopKG5iICsgMSkgPiBzbmFwZW5kKSB7CisJCXByaW50ZigiIFt8bmV0Ymlvc10iKTsKKwkJcmV0dXJuOworCX0KKworLyoKKwluZXRiaW9zX2RlY29kZShuYiwgKHVfY2hhciAqKW5iICsgcDgwMjJTaXplLCBsZW5ndGggLSBwODAyMlNpemUpOworKi8KK30KKworI2lmZGVmIG5ldmVyCisJKHZvaWQpcHJpbnRmKCIlcy4lZCA+ICIsCisJCSAgICAgaXB4YWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoaXB4LT5zcmNOZXQpLCBpcHgtPnNyY05vZGUpLAorCQkgICAgIEVYVFJBQ1RfMTZCSVRTKGlweC0+c3JjU2t0KSk7CisKKwkodm9pZClwcmludGYoIiVzLiVkOiIsCisJCSAgICAgaXB4YWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoaXB4LT5kc3ROZXQpLCBpcHgtPmRzdE5vZGUpLAorCQkgICAgIEVYVFJBQ1RfMTZCSVRTKGlweC0+ZHN0U2t0KSk7CisKKwlpZiAoKHVfY2hhciAqKShpcHggKyAxKSA+IHNuYXBlbmQpIHsKKwkJcHJpbnRmKCIgW3xpcHhdIik7CisJCXJldHVybjsKKwl9CisKKwkvKiB0YWtlIGxlbmd0aCBmcm9tIGlweCBoZWFkZXIgKi8KKwlsZW5ndGggPSBFWFRSQUNUXzE2QklUUygmaXB4LT5sZW5ndGgpOworCisJaXB4X2RlY29kZShpcHgsICh1X2NoYXIgKilpcHggKyBpcHhTaXplLCBsZW5ndGggLSBpcHhTaXplKTsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9wcmludC1uZnMuYyBiL3ByaW50LW5mcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTg4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1uZnMuYwpAQCAtMCwwICsxLDE4MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1uZnMuYyx2IDEuMTA2LjIuNCAyMDA3LzA2LzE1IDIzOjE3OjQwIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgIm5mcy5oIgorI2luY2x1ZGUgIm5mc2ZoLmgiCisKKyNpbmNsdWRlICJpcC5oIgorI2lmZGVmIElORVQ2CisjaW5jbHVkZSAiaXA2LmgiCisjZW5kaWYKKyNpbmNsdWRlICJycGNfYXV0aC5oIgorI2luY2x1ZGUgInJwY19tc2cuaCIKKworc3RhdGljIHZvaWQgbmZzX3ByaW50ZmgoY29uc3QgdV9pbnQzMl90ICosIGNvbnN0IHVfaW50KTsKK3N0YXRpYyB2b2lkIHhpZF9tYXBfZW50ZXIoY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKiwgY29uc3QgdV9jaGFyICopOworc3RhdGljIGludDMyX3QgeGlkX21hcF9maW5kKGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICosIGNvbnN0IHVfY2hhciAqLAorCQkJICAgIHVfaW50MzJfdCAqLCB1X2ludDMyX3QgKik7CitzdGF0aWMgdm9pZCBpbnRlcnBfcmVwbHkoY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7CitzdGF0aWMgY29uc3QgdV9pbnQzMl90ICpwYXJzZV9wb3N0X29wX2F0dHIoY29uc3QgdV9pbnQzMl90ICosIGludCk7CitzdGF0aWMgdm9pZCBwcmludF9zYXR0cjMoY29uc3Qgc3RydWN0IG5mc3YzX3NhdHRyICpzYTMsIGludCB2ZXJib3NlKTsKK3N0YXRpYyB2b2lkIHByaW50X25mc2FkZHIoY29uc3QgdV9jaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworLyoKKyAqIE1hcHBpbmcgb2Ygb2xkIE5GUyBWZXJzaW9uIDIgUlBDIG51bWJlcnMgdG8gZ2VuZXJpYyBudW1iZXJzLgorICovCit1X2ludDMyX3QgbmZzdjNfcHJvY2lkW05GU19OUFJPQ1NdID0geworCU5GU1BST0NfTlVMTCwKKwlORlNQUk9DX0dFVEFUVFIsCisJTkZTUFJPQ19TRVRBVFRSLAorCU5GU1BST0NfTk9PUCwKKwlORlNQUk9DX0xPT0tVUCwKKwlORlNQUk9DX1JFQURMSU5LLAorCU5GU1BST0NfUkVBRCwKKwlORlNQUk9DX05PT1AsCisJTkZTUFJPQ19XUklURSwKKwlORlNQUk9DX0NSRUFURSwKKwlORlNQUk9DX1JFTU9WRSwKKwlORlNQUk9DX1JFTkFNRSwKKwlORlNQUk9DX0xJTkssCisJTkZTUFJPQ19TWU1MSU5LLAorCU5GU1BST0NfTUtESVIsCisJTkZTUFJPQ19STURJUiwKKwlORlNQUk9DX1JFQURESVIsCisJTkZTUFJPQ19GU1NUQVQsCisJTkZTUFJPQ19OT09QLAorCU5GU1BST0NfTk9PUCwKKwlORlNQUk9DX05PT1AsCisJTkZTUFJPQ19OT09QLAorCU5GU1BST0NfTk9PUCwKKwlORlNQUk9DX05PT1AsCisJTkZTUFJPQ19OT09QLAorCU5GU1BST0NfTk9PUAorfTsKKworLyoKKyAqIE5GUyBWMiBhbmQgVjMgc3RhdHVzIHZhbHVlcy4KKyAqCisgKiBTb21lIG9mIHRoZXNlIGNvbWUgZnJvbSB0aGUgUkZDcyBmb3IgTkZTIFYyIGFuZCBWMywgd2l0aCB0aGUgbWVzc2FnZQorICogc3RyaW5ncyB0YWtlbiBmcm9tIHRoZSBGcmVlQlNEIEMgbGlicmFyeSAiZXJybHN0LmMiLgorICoKKyAqIE90aGVycyBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBpbiB0aGUgUkZDIGJ1dCB0aGF0IEkgc3VzcGVjdCBzb21lCisgKiBORlMgc2VydmVycyBjb3VsZCByZXR1cm47IHRoZSB2YWx1ZXMgYXJlIEZyZWVCU0QgZXJybm8gdmFsdWVzLCBhcworICogdGhlIGZpcnN0IE5GUyBzZXJ2ZXIgd2FzIHRoZSBTdW5PUyAyLjAgb25lLCBhbmQgdW50aWwgNS4wIFN1bk9TCisgKiB3YXMgcHJpbWFyaWx5IEJTRC1kZXJpdmVkLgorICovCitzdGF0aWMgc3RydWN0IHRvayBzdGF0dXMyc3RyW10gPSB7CisJeyAxLCAgICAgIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIiB9LAkvKiBFUEVSTSAqLworCXsgMiwgICAgICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiB9LAkvKiBFTk9FTlQgKi8KKwl7IDUsICAgICAiSW5wdXQvb3V0cHV0IGVycm9yIiB9LAkvKiBFSU8gKi8KKwl7IDYsICAgICAiRGV2aWNlIG5vdCBjb25maWd1cmVkIiB9LAkvKiBFTlhJTyAqLworCXsgMTEsICAgICJSZXNvdXJjZSBkZWFkbG9jayBhdm9pZGVkIiB9LAkvKiBFREVBRExLICovCisJeyAxMiwgICAgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiIH0sCS8qIEVOT01FTSAqLworCXsgMTMsICAgICJQZXJtaXNzaW9uIGRlbmllZCIgfSwJCS8qIEVBQ0NFUyAqLworCXsgMTcsICAgICJGaWxlIGV4aXN0cyIgfSwJCS8qIEVFWElTVCAqLworCXsgMTgsICAgICJDcm9zcy1kZXZpY2UgbGluayIgfSwJCS8qIEVYREVWICovCisJeyAxOSwgICAgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IGRldmljZSIgfSwgLyogRU5PREVWICovCisJeyAyMCwgICAgIk5vdCBhIGRpcmVjdG9yeSIgfSwJCS8qIEVOT1RESVIgKi8KKwl7IDIxLCAgICAiSXMgYSBkaXJlY3RvcnkiIH0sCQkvKiBFSVNESVIgKi8KKwl7IDIyLCAgICAiSW52YWxpZCBhcmd1bWVudCIgfSwJCS8qIEVJTlZBTCAqLworCXsgMjYsICAgICJUZXh0IGZpbGUgYnVzeSIgfSwJCS8qIEVUWFRCU1kgKi8KKwl7IDI3LCAgICAiRmlsZSB0b28gbGFyZ2UiIH0sCQkvKiBFRkJJRyAqLworCXsgMjgsICAgICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIgfSwJLyogRU5PU1BDICovCisJeyAzMCwgICAgIlJlYWQtb25seSBmaWxlIHN5c3RlbSIgfSwJLyogRVJPRlMgKi8KKwl7IDMxLCAgICAiVG9vIG1hbnkgbGlua3MiIH0sCQkvKiBFTUxJTksgKi8KKwl7IDQ1LCAgICAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQiIH0sCS8qIEVPUE5PVFNVUFAgKi8KKwl7IDYyLCAgICAiVG9vIG1hbnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzIiB9LCAvKiBFTE9PUCAqLworCXsgNjMsICAgICJGaWxlIG5hbWUgdG9vIGxvbmciIH0sCS8qIEVOQU1FVE9PTE9ORyAqLworCXsgNjYsICAgICJEaXJlY3Rvcnkgbm90IGVtcHR5IiB9LAkvKiBFTk9URU1QVFkgKi8KKwl7IDY5LCAgICAiRGlzYyBxdW90YSBleGNlZWRlZCIgfSwJLyogRURRVU9UICovCisJeyA3MCwgICAgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIgfSwJLyogRVNUQUxFICovCisJeyA3MSwgICAgIlRvbyBtYW55IGxldmVscyBvZiByZW1vdGUgaW4gcGF0aCIgfSwgLyogRVJFTU9URSAqLworCXsgOTksICAgICJXcml0ZSBjYWNoZSBmbHVzaGVkIHRvIGRpc2siIH0sIC8qIE5GU0VSUl9XRkxVU0ggKG5vdCB1c2VkKSAqLworCXsgMTAwMDEsICJJbGxlZ2FsIE5GUyBmaWxlIGhhbmRsZSIgfSwJLyogTkZTM0VSUl9CQURIQU5ETEUgKi8KKwl7IDEwMDAyLCAiVXBkYXRlIHN5bmNocm9uaXphdGlvbiBtaXNtYXRjaCIgfSwgLyogTkZTM0VSUl9OT1RfU1lOQyAqLworCXsgMTAwMDMsICJSRUFERElSL1JFQURESVJQTFVTIGNvb2tpZSBpcyBzdGFsZSIgfSwgLyogTkZTM0VSUl9CQURfQ09PS0lFICovCisJeyAxMDAwNCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAkvKiBORlMzRVJSX05PVFNVUFAgKi8KKwl7IDEwMDA1LCAiQnVmZmVyIG9yIHJlcXVlc3QgaXMgdG9vIHNtYWxsIiB9LCAvKiBORlMzRVJSX1RPT1NNQUxMICovCisJeyAxMDAwNiwgIlVuc3BlY2lmaWVkIGVycm9yIG9uIHNlcnZlciIgfSwgLyogTkZTM0VSUl9TRVJWRVJGQVVMVCAqLworCXsgMTAwMDcsICJPYmplY3Qgb2YgdGhhdCB0eXBlIG5vdCBzdXBwb3J0ZWQiIH0sIC8qIE5GUzNFUlJfQkFEVFlQRSAqLworCXsgMTAwMDgsICJSZXF1ZXN0IGNvdWxkbid0IGJlIGNvbXBsZXRlZCBpbiB0aW1lIiB9LCAvKiBORlMzRVJSX0pVS0VCT1ggKi8KKwl7IDAsICAgICBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIG5mc3YzX3dyaXRlbW9kZXNbXSA9IHsKKwl7IDAsCQkidW5zdGFibGUiIH0sCisJeyAxLAkJImRhdGFzeW5jIiB9LAorCXsgMiwJCSJmaWxlc3luYyIgfSwKKwl7IDAsCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7CisJeyBORk5PTiwJIk5PTiIgfSwKKwl7IE5GUkVHLAkiUkVHIiB9LAorCXsgTkZESVIsCSJESVIiIH0sCisJeyBORkJMSywJIkJMSyIgfSwKKwl7IE5GQ0hSLAkiQ0hSIiB9LAorCXsgTkZMTkssCSJMTksiIH0sCisJeyBORkZJRk8sCSJGSUZPIiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworc3RhdGljIHZvaWQKK3ByaW50X25mc2FkZHIoY29uc3QgdV9jaGFyICpicCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZCkKK3sKKwlzdHJ1Y3QgaXAgKmlwOworI2lmZGVmIElORVQ2CisJc3RydWN0IGlwNl9oZHIgKmlwNjsKKwljaGFyIHNyY2FkZHJbSU5FVDZfQUREUlNUUkxFTl0sIGRzdGFkZHJbSU5FVDZfQUREUlNUUkxFTl07CisjZWxzZQorI2lmbmRlZiBJTkVUX0FERFJTVFJMRU4KKyNkZWZpbmUgSU5FVF9BRERSU1RSTEVOCTE2CisjZW5kaWYKKwljaGFyIHNyY2FkZHJbSU5FVF9BRERSU1RSTEVOXSwgZHN0YWRkcltJTkVUX0FERFJTVFJMRU5dOworI2VuZGlmCisKKwlzcmNhZGRyWzBdID0gZHN0YWRkclswXSA9ICdcMCc7CisJc3dpdGNoIChJUF9WKChzdHJ1Y3QgaXAgKilicCkpIHsKKwljYXNlIDQ6CisJCWlwID0gKHN0cnVjdCBpcCAqKWJwOworCQlzdHJsY3B5KHNyY2FkZHIsIGlwYWRkcl9zdHJpbmcoJmlwLT5pcF9zcmMpLCBzaXplb2Yoc3JjYWRkcikpOworCQlzdHJsY3B5KGRzdGFkZHIsIGlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpLCBzaXplb2YoZHN0YWRkcikpOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgNjoKKwkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnA7CisJCXN0cmxjcHkoc3JjYWRkciwgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCisJCSAgICBzaXplb2Yoc3JjYWRkcikpOworCQlzdHJsY3B5KGRzdGFkZHIsIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLAorCQkgICAgc2l6ZW9mKGRzdGFkZHIpKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlzdHJsY3B5KHNyY2FkZHIsICI/Iiwgc2l6ZW9mKHNyY2FkZHIpKTsKKwkJc3RybGNweShkc3RhZGRyLCAiPyIsIHNpemVvZihkc3RhZGRyKSk7CisJCWJyZWFrOworCX0KKworCSh2b2lkKXByaW50ZigiJXMuJXMgPiAlcy4lczogIiwgc3JjYWRkciwgcywgZHN0YWRkciwgZCk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2Vfc2F0dHIzKGNvbnN0IHVfaW50MzJfdCAqZHAsIHN0cnVjdCBuZnN2M19zYXR0ciAqc2EzKQoreworCVRDSEVDSyhkcFswXSk7CisJc2EzLT5zYV9tb2Rlc2V0ID0gRVhUUkFDVF8zMkJJVFMoZHApOworCWRwKys7CisJaWYgKHNhMy0+c2FfbW9kZXNldCkgeworCQlUQ0hFQ0soZHBbMF0pOworCQlzYTMtPnNhX21vZGUgPSBFWFRSQUNUXzMyQklUUyhkcCk7CisJCWRwKys7CisJfQorCisJVENIRUNLKGRwWzBdKTsKKwlzYTMtPnNhX3VpZHNldCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKKwlkcCsrOworCWlmIChzYTMtPnNhX3VpZHNldCkgeworCQlUQ0hFQ0soZHBbMF0pOworCQlzYTMtPnNhX3VpZCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKKwkJZHArKzsKKwl9CisKKwlUQ0hFQ0soZHBbMF0pOworCXNhMy0+c2FfZ2lkc2V0ID0gRVhUUkFDVF8zMkJJVFMoZHApOworCWRwKys7CisJaWYgKHNhMy0+c2FfZ2lkc2V0KSB7CisJCVRDSEVDSyhkcFswXSk7CisJCXNhMy0+c2FfZ2lkID0gRVhUUkFDVF8zMkJJVFMoZHApOworCQlkcCsrOworCX0KKworCVRDSEVDSyhkcFswXSk7CisJc2EzLT5zYV9zaXplc2V0ID0gRVhUUkFDVF8zMkJJVFMoZHApOworCWRwKys7CisJaWYgKHNhMy0+c2Ffc2l6ZXNldCkgeworCQlUQ0hFQ0soZHBbMF0pOworCQlzYTMtPnNhX3NpemUgPSBFWFRSQUNUXzMyQklUUyhkcCk7CisJCWRwKys7CisJfQorCisJVENIRUNLKGRwWzBdKTsKKwlzYTMtPnNhX2F0aW1ldHlwZSA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKKwlkcCsrOworCWlmIChzYTMtPnNhX2F0aW1ldHlwZSA9PSBORlNWM1NBVFRSVElNRV9UT0NMSUVOVCkgeworCQlUQ0hFQ0soZHBbMV0pOworCQlzYTMtPnNhX2F0aW1lLm5mc3YzX3NlYyA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKKwkJZHArKzsKKwkJc2EzLT5zYV9hdGltZS5uZnN2M19uc2VjID0gRVhUUkFDVF8zMkJJVFMoZHApOworCQlkcCsrOworCX0KKworCVRDSEVDSyhkcFswXSk7CisJc2EzLT5zYV9tdGltZXR5cGUgPSBFWFRSQUNUXzMyQklUUyhkcCk7CisJZHArKzsKKwlpZiAoc2EzLT5zYV9tdGltZXR5cGUgPT0gTkZTVjNTQVRUUlRJTUVfVE9DTElFTlQpIHsKKwkJVENIRUNLKGRwWzFdKTsKKwkJc2EzLT5zYV9tdGltZS5uZnN2M19zZWMgPSBFWFRSQUNUXzMyQklUUyhkcCk7CisJCWRwKys7CisJCXNhMy0+c2FfbXRpbWUubmZzdjNfbnNlYyA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKKwkJZHArKzsKKwl9CisKKwlyZXR1cm4gZHA7Cit0cnVuYzoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBuZnNlcnI7CQkvKiB0cnVlIGlmIHdlIGVycm9yIHJhdGhlciB0aGFuIHRydW5jICovCisKK3N0YXRpYyB2b2lkCitwcmludF9zYXR0cjMoY29uc3Qgc3RydWN0IG5mc3YzX3NhdHRyICpzYTMsIGludCB2ZXJib3NlKQoreworCWlmIChzYTMtPnNhX21vZGVzZXQpCisJCXByaW50ZigiIG1vZGUgJW8iLCBzYTMtPnNhX21vZGUpOworCWlmIChzYTMtPnNhX3VpZHNldCkKKwkJcHJpbnRmKCIgdWlkICV1Iiwgc2EzLT5zYV91aWQpOworCWlmIChzYTMtPnNhX2dpZHNldCkKKwkJcHJpbnRmKCIgZ2lkICV1Iiwgc2EzLT5zYV9naWQpOworCWlmICh2ZXJib3NlID4gMSkgeworCQlpZiAoc2EzLT5zYV9hdGltZXR5cGUgPT0gTkZTVjNTQVRUUlRJTUVfVE9DTElFTlQpCisJCQlwcmludGYoIiBhdGltZSAldS4lMDZ1Iiwgc2EzLT5zYV9hdGltZS5uZnN2M19zZWMsCisJCQkgICAgICAgc2EzLT5zYV9hdGltZS5uZnN2M19uc2VjKTsKKwkJaWYgKHNhMy0+c2FfbXRpbWV0eXBlID09IE5GU1YzU0FUVFJUSU1FX1RPQ0xJRU5UKQorCQkJcHJpbnRmKCIgbXRpbWUgJXUuJTA2dSIsIHNhMy0+c2FfbXRpbWUubmZzdjNfc2VjLAorCQkJICAgICAgIHNhMy0+c2FfbXRpbWUubmZzdjNfbnNlYyk7CisJfQorfQorCit2b2lkCituZnNyZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsCisJICAgICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAyKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycDsKKwl1X2ludDMyX3QgcHJvYywgdmVycywgcmVwbHlfc3RhdDsKKwljaGFyIHNyY2lkWzIwXSwgZHN0aWRbMjBdOwkvKmZpdHMgMzJiaXQqLworCWVudW0gc3VucnBjX3JlamVjdF9zdGF0IHJzdGF0OworCXVfaW50MzJfdCBybG93OworCXVfaW50MzJfdCByaGlnaDsKKwllbnVtIHN1bnJwY19hdXRoX3N0YXQgcndoeTsKKworCW5mc2VyciA9IDA7CQkvKiBhc3N1bWUgbm8gZXJyb3IgKi8KKwlycCA9IChjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqKWJwOworCisJaWYgKCFuZmxhZykgeworCQlzdHJsY3B5KHNyY2lkLCAibmZzIiwgc2l6ZW9mKHNyY2lkKSk7CisJCXNucHJpbnRmKGRzdGlkLCBzaXplb2YoZHN0aWQpLCAiJXUiLAorCQkgICAgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV94aWQpKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihzcmNpZCwgc2l6ZW9mKHNyY2lkKSwgIiV1IiwgTkZTX1BPUlQpOworCQlzbnByaW50Zihkc3RpZCwgc2l6ZW9mKGRzdGlkKSwgIiV1IiwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1feGlkKSk7CisJfQorCXByaW50X25mc2FkZHIoYnAyLCBzcmNpZCwgZHN0aWQpOworCXJlcGx5X3N0YXQgPSBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3JlcGx5LnJwX3N0YXQpOworCXN3aXRjaCAocmVwbHlfc3RhdCkgeworCisJY2FzZSBTVU5SUENfTVNHX0FDQ0VQVEVEOgorCQkodm9pZClwcmludGYoInJlcGx5IG9rICV1IiwgbGVuZ3RoKTsKKwkJaWYgKHhpZF9tYXBfZmluZChycCwgYnAyLCAmcHJvYywgJnZlcnMpID49IDApCisJCQlpbnRlcnBfcmVwbHkocnAsIHByb2MsIHZlcnMsIGxlbmd0aCk7CisJCWJyZWFrOworCisJY2FzZSBTVU5SUENfTVNHX0RFTklFRDoKKwkJKHZvaWQpcHJpbnRmKCJyZXBseSBFUlIgJXU6ICIsIGxlbmd0aCk7CisJCXJzdGF0ID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9yZXBseS5ycF9yZWplY3Qucmpfc3RhdCk7CisJCXN3aXRjaCAocnN0YXQpIHsKKworCQljYXNlIFNVTlJQQ19SUENfTUlTTUFUQ0g6CisJCQlybG93ID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9yZXBseS5ycF9yZWplY3QucmpfdmVycy5sb3cpOworCQkJcmhpZ2ggPSBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3JlcGx5LnJwX3JlamVjdC5yal92ZXJzLmhpZ2gpOworCQkJKHZvaWQpcHJpbnRmKCJSUEMgVmVyc2lvbiBtaXNtYXRjaCAoJXUtJXUpIiwKKwkJCSAgICBybG93LCByaGlnaCk7CisJCQlicmVhazsKKworCQljYXNlIFNVTlJQQ19BVVRIX0VSUk9SOgorCQkJcndoeSA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fcmVwbHkucnBfcmVqZWN0LnJqX3doeSk7CisJCQkodm9pZClwcmludGYoIkF1dGggIik7CisJCQlzd2l0Y2ggKHJ3aHkpIHsKKworCQkJY2FzZSBTVU5SUENfQVVUSF9PSzoKKwkJCQkodm9pZClwcmludGYoIk9LIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VOUlBDX0FVVEhfQkFEQ1JFRDoKKwkJCQkodm9pZClwcmludGYoIkJvZ3VzIENyZWRlbnRpYWxzIChzZWFsIGJyb2tlbikiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVU5SUENfQVVUSF9SRUpFQ1RFRENSRUQ6CisJCQkJKHZvaWQpcHJpbnRmKCJSZWplY3RlZCBDcmVkZW50aWFscyAoY2xpZW50IHNob3VsZCBiZWdpbiBuZXcgc2Vzc2lvbikiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVU5SUENfQVVUSF9CQURWRVJGOgorCQkJCSh2b2lkKXByaW50ZigiQm9ndXMgVmVyaWZpZXIgKHNlYWwgYnJva2VuKSIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVTlJQQ19BVVRIX1JFSkVDVEVEVkVSRjoKKwkJCQkodm9pZClwcmludGYoIlZlcmlmaWVyIGV4cGlyZWQgb3Igd2FzIHJlcGxheWVkIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU1VOUlBDX0FVVEhfVE9PV0VBSzoKKwkJCQkodm9pZClwcmludGYoIkNyZWRlbnRpYWxzIGFyZSB0b28gd2VhayIpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNVTlJQQ19BVVRIX0lOVkFMSURSRVNQOgorCQkJCSh2b2lkKXByaW50ZigiQm9ndXMgcmVzcG9uc2UgdmVyaWZpZXIiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTVU5SUENfQVVUSF9GQUlMRUQ6CisJCQkJKHZvaWQpcHJpbnRmKCJVbmtub3duIGZhaWx1cmUiKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkodm9pZClwcmludGYoIkludmFsaWQgZmFpbHVyZSBjb2RlICV1IiwKKwkJCQkgICAgKHVuc2lnbmVkIGludClyd2h5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkodm9pZClwcmludGYoIlVua25vd24gcmVhc29uIGZvciByZWplY3RpbmcgcnBjIG1lc3NhZ2UgJXUiLAorCQkJICAgICh1bnNpZ25lZCBpbnQpcnN0YXQpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkodm9pZClwcmludGYoInJlcGx5IFVua25vd24gcnBjIHJlc3BvbnNlIGNvZGU9JXUgJXUiLAorCQkgICAgcmVwbHlfc3RhdCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZmlsZSBoYW5kbGUgaW4gdGhlIHBhY2tldC4KKyAqIElmIHRoZSBwYWNrZXQgd2FzIHRydW5jYXRlZCwgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2VyZXEocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKnJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpkcDsKKwlyZWdpc3RlciB1X2ludCBsZW47CisKKwkvKgorCSAqIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSByZXEgZGF0YSAoaWYgd2UgY2FwdHVyZWQgaXQpCisJICovCisJZHAgPSAodV9pbnQzMl90ICopJnJwLT5ybV9jYWxsLmNiX2NyZWQ7CisJVENIRUNLKGRwWzFdKTsKKwlsZW4gPSBFWFRSQUNUXzMyQklUUygmZHBbMV0pOworCWlmIChsZW4gPCBsZW5ndGgpIHsKKwkJZHAgKz0gKGxlbiArICgyICogc2l6ZW9mKCpkcCkgKyAzKSkgLyBzaXplb2YoKmRwKTsKKwkJVENIRUNLKGRwWzFdKTsKKwkJbGVuID0gRVhUUkFDVF8zMkJJVFMoJmRwWzFdKTsKKwkJaWYgKGxlbiA8IGxlbmd0aCkgeworCQkJZHAgKz0gKGxlbiArICgyICogc2l6ZW9mKCpkcCkgKyAzKSkgLyBzaXplb2YoKmRwKTsKKwkJCVRDSEVDSzIoZHBbMF0sIDApOworCQkJcmV0dXJuIChkcCk7CisJCX0KKwl9Cit0cnVuYzoKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICogUHJpbnQgb3V0IGFuIE5GUyBmaWxlIGhhbmRsZSBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBmb2xsb3dpbmcgd29yZC4KKyAqIElmIHBhY2tldCB3YXMgdHJ1bmNhdGVkLCByZXR1cm4gMC4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCitwYXJzZWZoKHJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2MykKK3sKKwl1X2ludCBsZW47CisKKwlpZiAodjMpIHsKKwkJVENIRUNLKGRwWzBdKTsKKwkJbGVuID0gRVhUUkFDVF8zMkJJVFMoZHApIC8gNDsKKwkJZHArKzsKKwl9IGVsc2UKKwkJbGVuID0gTkZTWF9WMkZIIC8gNDsKKworCWlmIChUVEVTVDIoKmRwLCBsZW4gKiBzaXplb2YoKmRwKSkpIHsKKwkJbmZzX3ByaW50ZmgoZHAsIGxlbik7CisJCXJldHVybiAoZHAgKyBsZW4pOworCX0KK3RydW5jOgorCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBQcmludCBvdXQgYSBmaWxlIG5hbWUgYW5kIHJldHVybiBwb2ludGVyIHRvIDMyLWJpdCB3b3JkIHBhc3QgaXQuCisgKiBJZiBwYWNrZXQgd2FzIHRydW5jYXRlZCwgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2VmbihyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwKQoreworCXJlZ2lzdGVyIHVfaW50MzJfdCBsZW47CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcDsKKworCS8qIEJhaWwgaWYgd2UgZG9uJ3QgaGF2ZSB0aGUgc3RyaW5nIGxlbmd0aCAqLworCVRDSEVDSygqZHApOworCisJLyogRmV0Y2ggc3RyaW5nIGxlbmd0aDsgY29udmVydCB0byBob3N0IG9yZGVyICovCisJbGVuID0gKmRwKys7CisJTlRPSEwobGVuKTsKKworCVRDSEVDSzIoKmRwLCAoKGxlbiArIDMpICYgfjMpKTsKKworCWNwID0gKHVfY2hhciAqKWRwOworCS8qIFVwZGF0ZSAzMi1iaXQgcG9pbnRlciAoTkZTIGZpbGVuYW1lcyBwYWRkZWQgdG8gMzItYml0IGJvdW5kYXJpZXMpICovCisJZHAgKz0gKChsZW4gKyAzKSAmIH4zKSAvIHNpemVvZigqZHApOworCXB1dGNoYXIoJyInKTsKKwlpZiAoZm5fcHJpbnRuKGNwLCBsZW4sIHNuYXBlbmQpKSB7CisJCXB1dGNoYXIoJyInKTsKKwkJZ290byB0cnVuYzsKKwl9CisJcHV0Y2hhcignIicpOworCisJcmV0dXJuIChkcCk7Cit0cnVuYzoKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFByaW50IG91dCBmaWxlIGhhbmRsZSBhbmQgZmlsZSBuYW1lLgorICogUmV0dXJuIHBvaW50ZXIgdG8gMzItYml0IHdvcmQgcGFzdCBmaWxlIG5hbWUuCisgKiBJZiBwYWNrZXQgd2FzIHRydW5jYXRlZCAob3IgdGhlcmUgd2FzIHNvbWUgb3RoZXIgZXJyb3IpLCByZXR1cm4gMC4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCitwYXJzZWZobihyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdjMpCit7CisJZHAgPSBwYXJzZWZoKGRwLCB2Myk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJcHV0Y2hhcignICcpOworCXJldHVybiAocGFyc2VmbihkcCkpOworfQorCit2b2lkCituZnNyZXFfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLAorICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAyKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycDsKKwlyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwOworCW5mc190eXBlIHR5cGU7CisJaW50IHYzOworCXVfaW50MzJfdCBwcm9jOworCXN0cnVjdCBuZnN2M19zYXR0ciBzYTM7CisJY2hhciBzcmNpZFsyMF0sIGRzdGlkWzIwXTsJLypmaXRzIDMyYml0Ki8KKworCW5mc2VyciA9IDA7CQkvKiBhc3N1bWUgbm8gZXJyb3IgKi8KKwlycCA9IChjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqKWJwOworCWlmICghbmZsYWcpIHsKKwkJc25wcmludGYoc3JjaWQsIHNpemVvZihzcmNpZCksICIldSIsCisJCSAgICBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3hpZCkpOworCQlzdHJsY3B5KGRzdGlkLCAibmZzIiwgc2l6ZW9mKGRzdGlkKSk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoc3JjaWQsIHNpemVvZihzcmNpZCksICIldSIsCisJCSAgICBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3hpZCkpOworCQlzbnByaW50Zihkc3RpZCwgc2l6ZW9mKGRzdGlkKSwgIiV1IiwgTkZTX1BPUlQpOworCX0KKwlwcmludF9uZnNhZGRyKGJwMiwgc3JjaWQsIGRzdGlkKTsKKwkodm9pZClwcmludGYoIiVkIiwgbGVuZ3RoKTsKKworCXhpZF9tYXBfZW50ZXIocnAsIGJwMik7CS8qIHJlY29yZCBwcm9jIG51bWJlciBmb3IgbGF0ZXIgb24gKi8KKworCXYzID0gKEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl92ZXJzKSA9PSBORlNfVkVSMyk7CisJcHJvYyA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl9wcm9jKTsKKworCWlmICghdjMgJiYgcHJvYyA8IE5GU19OUFJPQ1MpCisJCXByb2MgPSAgbmZzdjNfcHJvY2lkW3Byb2NdOworCisJc3dpdGNoIChwcm9jKSB7CisJY2FzZSBORlNQUk9DX05PT1A6CisJCXByaW50ZigiIG5vcCIpOworCQlyZXR1cm47CisJY2FzZSBORlNQUk9DX05VTEw6CisJCXByaW50ZigiIG51bGwiKTsKKwkJcmV0dXJuOworCisJY2FzZSBORlNQUk9DX0dFVEFUVFI6CisJCXByaW50ZigiIGdldGF0dHIiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICBwYXJzZWZoKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfU0VUQVRUUjoKKwkJcHJpbnRmKCIgc2V0YXR0ciIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIHBhcnNlZmgoZHAsIHYzKSAhPSBOVUxMKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19MT09LVVA6CisJCXByaW50ZigiIGxvb2t1cCIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfQUNDRVNTOgorCQlwcmludGYoIiBhY2Nlc3MiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICAoZHAgPSBwYXJzZWZoKGRwLCB2MykpICE9IE5VTEwpIHsKKwkJCVRDSEVDSyhkcFswXSk7CisJCQlwcmludGYoIiAlMDR4IiwgRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUkVBRExJTks6CisJCXByaW50ZigiIHJlYWRsaW5rIik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgorCQkgICAgcGFyc2VmaChkcCwgdjMpICE9IE5VTEwpCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1JFQUQ6CisJCXByaW50ZigiIHJlYWQiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICAoZHAgPSBwYXJzZWZoKGRwLCB2MykpICE9IE5VTEwpIHsKKwkJCWlmICh2MykgeworCQkJCVRDSEVDSyhkcFsyXSk7CisJCQkJcHJpbnRmKCIgJXUgYnl0ZXMgQCAlIiBQUkl1NjQsCisJCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFsyXSksCisJCQkJICAgICAgIEVYVFJBQ1RfNjRCSVRTKCZkcFswXSkpOworCQkJfSBlbHNlIHsKKwkJCQlUQ0hFQ0soZHBbMV0pOworCQkJCXByaW50ZigiICV1IGJ5dGVzIEAgJXUiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZHBbMV0pLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZHBbMF0pKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19XUklURToKKwkJcHJpbnRmKCIgd3JpdGUiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICAoZHAgPSBwYXJzZWZoKGRwLCB2MykpICE9IE5VTEwpIHsKKwkJCWlmICh2MykgeworCQkJCVRDSEVDSyhkcFsyXSk7CisJCQkJcHJpbnRmKCIgJXUgKCV1KSBieXRlcyBAICUiIFBSSXU2NCwKKwkJCQkJCUVYVFJBQ1RfMzJCSVRTKCZkcFs0XSksCisJCQkJCQlFWFRSQUNUXzMyQklUUygmZHBbMl0pLAorCQkJCQkJRVhUUkFDVF82NEJJVFMoJmRwWzBdKSk7CisJCQkJaWYgKHZmbGFnKSB7CisJCQkJCWRwICs9IDM7CisJCQkJCVRDSEVDSyhkcFswXSk7CisJCQkJCXByaW50ZigiIDwlcz4iLAorCQkJCQkJdG9rMnN0cihuZnN2M193cml0ZW1vZGVzLAorCQkJCQkJCU5VTEwsIEVYVFJBQ1RfMzJCSVRTKGRwKSkpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJVENIRUNLKGRwWzNdKTsKKwkJCQlwcmludGYoIiAldSAoJXUpIGJ5dGVzIEAgJXUgKCV1KSIsCisJCQkJCQlFWFRSQUNUXzMyQklUUygmZHBbM10pLAorCQkJCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzJdKSwKKwkJCQkJCUVYVFJBQ1RfMzJCSVRTKCZkcFsxXSksCisJCQkJCQlFWFRSQUNUXzMyQklUUygmZHBbMF0pKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19DUkVBVEU6CisJCXByaW50ZigiIGNyZWF0ZSIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfTUtESVI6CisJCXByaW50ZigiIG1rZGlyIik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gMCAmJiBwYXJzZWZobihkcCwgdjMpICE9IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1NZTUxJTks6CisJCXByaW50ZigiIHN5bWxpbmsiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSAwICYmCisJCSAgICAoZHAgPSBwYXJzZWZobihkcCwgdjMpKSAhPSAwKSB7CisJCQlmcHV0cygiIC0+Iiwgc3Rkb3V0KTsKKwkJCWlmICh2MyAmJiAoZHAgPSBwYXJzZV9zYXR0cjMoZHAsICZzYTMpKSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHBhcnNlZm4oZHApID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAodjMgJiYgdmZsYWcpCisJCQkJcHJpbnRfc2F0dHIzKCZzYTMsIHZmbGFnKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19NS05PRDoKKwkJcHJpbnRmKCIgbWtub2QiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSAwICYmCisJCSAgICAoZHAgPSBwYXJzZWZobihkcCwgdjMpKSAhPSAwKSB7CisJCQlUQ0hFQ0soKmRwKTsKKwkJCXR5cGUgPSAobmZzX3R5cGUpRVhUUkFDVF8zMkJJVFMoZHApOworCQkJZHArKzsKKwkJCWlmICgoZHAgPSBwYXJzZV9zYXR0cjMoZHAsICZzYTMpKSA9PSAwKQorCQkJCWJyZWFrOworCQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKHR5cGUyc3RyLCAidW5rLWZ0ICVkIiwgdHlwZSkpOworCQkJaWYgKHZmbGFnICYmICh0eXBlID09IE5GQ0hSIHx8IHR5cGUgPT0gTkZCTEspKSB7CisJCQkJVENIRUNLKGRwWzFdKTsKKwkJCQlwcmludGYoIiAldS8ldSIsCisJCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSksCisJCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSkpOworCQkJCWRwICs9IDI7CisJCQl9CisJCQlpZiAodmZsYWcpCisJCQkJcHJpbnRfc2F0dHIzKCZzYTMsIHZmbGFnKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19SRU1PVkU6CisJCXByaW50ZigiIHJlbW92ZSIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUk1ESVI6CisJCXByaW50ZigiIHJtZGlyIik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgorCQkgICAgcGFyc2VmaG4oZHAsIHYzKSAhPSBOVUxMKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19SRU5BTUU6CisJCXByaW50ZigiIHJlbmFtZSIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIChkcCA9IHBhcnNlZmhuKGRwLCB2MykpICE9IE5VTEwpIHsKKwkJCWZwdXRzKCIgLT4iLCBzdGRvdXQpOworCQkJaWYgKHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfTElOSzoKKwkJcHJpbnRmKCIgbGluayIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIChkcCA9IHBhcnNlZmgoZHAsIHYzKSkgIT0gTlVMTCkgeworCQkJZnB1dHMoIiAtPiIsIHN0ZG91dCk7CisJCQlpZiAocGFyc2VmaG4oZHAsIHYzKSAhPSBOVUxMKQorCQkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19SRUFERElSOgorCQlwcmludGYoIiByZWFkZGlyIik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgorCQkgICAgKGRwID0gcGFyc2VmaChkcCwgdjMpKSAhPSBOVUxMKSB7CisJCQlpZiAodjMpIHsKKwkJCQlUQ0hFQ0soZHBbNF0pOworCQkJCS8qCisJCQkJICogV2Ugc2hvdWxkbid0IHJlYWxseSB0cnkgdG8gaW50ZXJwcmV0IHRoZQorCQkJCSAqIG9mZnNldCBjb29raWUgaGVyZS4KKwkJCQkgKi8KKwkJCQlwcmludGYoIiAldSBieXRlcyBAICUiIFBSSWQ2NCwKKwkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmRwWzRdKSwKKwkJCQkgICAgRVhUUkFDVF82NEJJVFMoJmRwWzBdKSk7CisJCQkJaWYgKHZmbGFnKQorCQkJCQlwcmludGYoIiB2ZXJmICUwOHglMDh4IiwgZHBbMl0sCisJCQkJCSAgICAgICBkcFszXSk7CisJCQl9IGVsc2UgeworCQkJCVRDSEVDSyhkcFsxXSk7CisJCQkJLyoKKwkJCQkgKiBQcmludCB0aGUgb2Zmc2V0IGFzIHNpZ25lZCwgc2luY2UgLTEgaXMKKwkJCQkgKiBjb21tb24sIGJ1dCBvZmZzZXRzID4gMl4zMSBhcmVuJ3QuCisJCQkJICovCisJCQkJcHJpbnRmKCIgJXUgYnl0ZXMgQCAlZCIsCisJCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSksCisJCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1JFQURESVJQTFVTOgorCQlwcmludGYoIiByZWFkZGlycGx1cyIpOworCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKKwkJICAgIChkcCA9IHBhcnNlZmgoZHAsIHYzKSkgIT0gTlVMTCkgeworCQkJVENIRUNLKGRwWzRdKTsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB0cnkgdG8gaW50ZXJwcmV0IHRoZSBvZmZzZXQKKwkJCSAqIGNvb2tpZSBoZXJlLgorCQkJICovCisJCQlwcmludGYoIiAldSBieXRlcyBAICUiIFBSSWQ2NCwKKwkJCQlFWFRSQUNUXzMyQklUUygmZHBbNF0pLAorCQkJCUVYVFJBQ1RfNjRCSVRTKCZkcFswXSkpOworCQkJaWYgKHZmbGFnKSB7CisJCQkJVENIRUNLKGRwWzVdKTsKKwkJCQlwcmludGYoIiBtYXggJXUgdmVyZiAlMDh4JTA4eCIsCisJCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFs1XSksIGRwWzJdLCBkcFszXSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfRlNTVEFUOgorCQlwcmludGYoIiBmc3N0YXQiKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICBwYXJzZWZoKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfRlNJTkZPOgorCQlwcmludGYoIiBmc2luZm8iKTsKKwkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCisJCSAgICBwYXJzZWZoKGRwLCB2MykgIT0gTlVMTCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUEFUSENPTkY6CisJCXByaW50ZigiIHBhdGhjb25mIik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgorCQkgICAgcGFyc2VmaChkcCwgdjMpICE9IE5VTEwpCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX0NPTU1JVDoKKwkJcHJpbnRmKCIgY29tbWl0Iik7CisJCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgorCQkgICAgKGRwID0gcGFyc2VmaChkcCwgdjMpKSAhPSBOVUxMKSB7CisJCQlUQ0hFQ0soZHBbMl0pOworCQkJcHJpbnRmKCIgJXUgYnl0ZXMgQCAlIiBQUkl1NjQsCisJCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzJdKSwKKwkJCQlFWFRSQUNUXzY0QklUUygmZHBbMF0pKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiIHByb2MtJXUiLCBFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfcHJvYykpOworCQlyZXR1cm47CisJfQorCit0cnVuYzoKKwlpZiAoIW5mc2VycikKKwkJZnB1dHMoIiBbfG5mc10iLCBzdGRvdXQpOworfQorCisvKgorICogUHJpbnQgb3V0IGFuIE5GUyBmaWxlIGhhbmRsZS4KKyAqIFdlIGFzc3VtZSBwYWNrZXQgd2FzIG5vdCB0cnVuY2F0ZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlCisgKiBmaWxlIGhhbmRsZSBwb2ludGVkIHRvIGJ5IGRwLgorICoKKyAqIE5vdGU6IG5ldyB2ZXJzaW9uICh1c2luZyBwb3J0YWJsZSBmaWxlLWhhbmRsZSBwYXJzZXIpIGRvZXNuJ3QgcHJvZHVjZQorICogZ2VuZXJhdGlvbiBudW1iZXIuICBJdCBwcm9iYWJseSBjb3VsZCBiZSBtYWRlIHRvIGRvIHRoYXQsIHdpdGggc29tZQorICogYWRkaXRpb25hbCBoYWNraW5nIG9uIHRoZSBwYXJzZXIgY29kZS4KKyAqLworc3RhdGljIHZvaWQKK25mc19wcmludGZoKHJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqZHAsIGNvbnN0IHVfaW50IGxlbikKK3sKKwlteV9mc2lkIGZzaWQ7CisJaW5vX3QgaW5vOworCWNvbnN0IGNoYXIgKnNmc25hbWUgPSBOVUxMOworCWNoYXIgKnNwYWNlcDsKKworCWlmICh1ZmxhZykgeworCQl1X2ludCBpOworCQljaGFyIGNvbnN0ICpzZXAgPSAiIjsKKworCQlwcmludGYoIiBmaFsiKTsKKwkJZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKwkJCSh2b2lkKXByaW50ZigiJXMleCIsIHNlcCwgZHBbaV0pOworCQkJc2VwID0gIjoiOworCQl9CisJCXByaW50ZigiXSIpOworCQlyZXR1cm47CisJfQorCisJUGFyc2VfZmgoKGNvbnN0IHVfY2hhciAqKWRwLCBsZW4sICZmc2lkLCAmaW5vLCBOVUxMLCAmc2ZzbmFtZSwgMCk7CisKKwlpZiAoc2ZzbmFtZSkgeworCQkvKiBmaWxlIHN5c3RlbSBJRCBpcyBBU0NJSSwgbm90IG51bWVyaWMsIGZvciB0aGlzIHNlcnZlciBPUyAqLworCQlzdGF0aWMgY2hhciB0ZW1wW05GU1hfVjNGSE1BWCsxXTsKKworCQkvKiBNYWtlIHN1cmUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAqLworCQlzdHJuY3B5KHRlbXAsIHNmc25hbWUsIE5GU1hfVjNGSE1BWCk7CisJCXRlbXBbc2l6ZW9mKHRlbXApIC0gMV0gPSAnXDAnOworCQkvKiBSZW1vdmUgdHJhaWxpbmcgc3BhY2VzICovCisJCXNwYWNlcCA9IHN0cmNocih0ZW1wLCAnICcpOworCQlpZiAoc3BhY2VwKQorCQkJKnNwYWNlcCA9ICdcMCc7CisKKwkJKHZvaWQpcHJpbnRmKCIgZmggJXMvIiwgdGVtcCk7CisJfSBlbHNlIHsKKwkJKHZvaWQpcHJpbnRmKCIgZmggJWQsJWQvIiwKKwkJCSAgICAgZnNpZC5Gc2lkX2Rldi5NYWpvciwgZnNpZC5Gc2lkX2Rldi5NaW5vcik7CisJfQorCisJaWYoZnNpZC5Gc2lkX2Rldi5NaW5vciA9PSAyNTcpCisJCS8qIFByaW50IHRoZSB1bmRlY29kZWQgaGFuZGxlICovCisJCSh2b2lkKXByaW50ZigiJXMiLCBmc2lkLk9wYXF1ZV9IYW5kbGUpOworCWVsc2UKKwkJKHZvaWQpcHJpbnRmKCIlbGQiLCAobG9uZykgaW5vKTsKK30KKworLyoKKyAqIE1haW50YWluIGEgc21hbGwgY2FjaGUgb2YgcmVjZW50IGNsaWVudC5YSUQuc2VydmVyL3Byb2MgcGFpcnMsIHRvIGFsbG93CisgKiB1cyB0byBtYXRjaCB1cCByZXBsaWVzIHdpdGggcmVxdWVzdHMgYW5kIHRodXMgdG8ga25vdyBob3cgdG8gcGFyc2UKKyAqIHRoZSByZXBseS4KKyAqLworCitzdHJ1Y3QgeGlkX21hcF9lbnRyeSB7CisJdV9pbnQzMl90CXhpZDsJCS8qIHRyYW5zYWN0aW9uIElEIChuZXQgb3JkZXIpICovCisJaW50IGlwdmVyOwkJCS8qIElQIHZlcnNpb24gKDQgb3IgNikgKi8KKyNpZmRlZiBJTkVUNgorCXN0cnVjdCBpbjZfYWRkcgljbGllbnQ7CQkvKiBjbGllbnQgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLworCXN0cnVjdCBpbjZfYWRkcglzZXJ2ZXI7CQkvKiBzZXJ2ZXIgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLworI2Vsc2UKKwlzdHJ1Y3QgaW5fYWRkcgljbGllbnQ7CQkvKiBjbGllbnQgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLworCXN0cnVjdCBpbl9hZGRyCXNlcnZlcjsJCS8qIHNlcnZlciBJUCBhZGRyZXNzIChuZXQgb3JkZXIpICovCisjZW5kaWYKKwl1X2ludDMyX3QJcHJvYzsJCS8qIGNhbGwgcHJvYyBudW1iZXIgKGhvc3Qgb3JkZXIpICovCisJdV9pbnQzMl90CXZlcnM7CQkvKiBwcm9ncmFtIHZlcnNpb24gKGhvc3Qgb3JkZXIpICovCit9OworCisvKgorICogTWFwIGVudHJpZXMgYXJlIGtlcHQgaW4gYW4gYXJyYXkgdGhhdCB3ZSBtYW5hZ2UgYXMgYSByaW5nOworICogbmV3IGVudHJpZXMgYXJlIGFsd2F5cyBhZGRlZCBhdCB0aGUgdGFpbCBvZiB0aGUgcmluZy4gIEluaXRpYWxseSwKKyAqIGFsbCB0aGUgZW50cmllcyBhcmUgemVybyBhbmQgaGVuY2UgZG9uJ3QgbWF0Y2ggYW55dGhpbmcuCisgKi8KKworI2RlZmluZQlYSURNQVBTSVpFCTY0CisKK3N0cnVjdCB4aWRfbWFwX2VudHJ5IHhpZF9tYXBbWElETUFQU0laRV07CisKK2ludAl4aWRfbWFwX25leHQgPSAwOworaW50CXhpZF9tYXBfaGludCA9IDA7CisKK3N0YXRpYyB2b2lkCit4aWRfbWFwX2VudGVyKGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycCwgY29uc3QgdV9jaGFyICpicCkKK3sKKwlzdHJ1Y3QgaXAgKmlwID0gTlVMTDsKKyNpZmRlZiBJTkVUNgorCXN0cnVjdCBpcDZfaGRyICppcDYgPSBOVUxMOworI2VuZGlmCisJc3RydWN0IHhpZF9tYXBfZW50cnkgKnhtZXA7CisKKwlzd2l0Y2ggKElQX1YoKHN0cnVjdCBpcCAqKWJwKSkgeworCWNhc2UgNDoKKwkJaXAgPSAoc3RydWN0IGlwICopYnA7CisJCWJyZWFrOworI2lmZGVmIElORVQ2CisJY2FzZSA2OgorCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJeG1lcCA9ICZ4aWRfbWFwW3hpZF9tYXBfbmV4dF07CisKKwlpZiAoKyt4aWRfbWFwX25leHQgPj0gWElETUFQU0laRSkKKwkJeGlkX21hcF9uZXh0ID0gMDsKKworCXhtZXAtPnhpZCA9IHJwLT5ybV94aWQ7CisJaWYgKGlwKSB7CisJCXhtZXAtPmlwdmVyID0gNDsKKwkJbWVtY3B5KCZ4bWVwLT5jbGllbnQsICZpcC0+aXBfc3JjLCBzaXplb2YoaXAtPmlwX3NyYykpOworCQltZW1jcHkoJnhtZXAtPnNlcnZlciwgJmlwLT5pcF9kc3QsIHNpemVvZihpcC0+aXBfZHN0KSk7CisJfQorI2lmZGVmIElORVQ2CisJZWxzZSBpZiAoaXA2KSB7CisJCXhtZXAtPmlwdmVyID0gNjsKKwkJbWVtY3B5KCZ4bWVwLT5jbGllbnQsICZpcDYtPmlwNl9zcmMsIHNpemVvZihpcDYtPmlwNl9zcmMpKTsKKwkJbWVtY3B5KCZ4bWVwLT5zZXJ2ZXIsICZpcDYtPmlwNl9kc3QsIHNpemVvZihpcDYtPmlwNl9kc3QpKTsKKwl9CisjZW5kaWYKKwl4bWVwLT5wcm9jID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3Byb2MpOworCXhtZXAtPnZlcnMgPSBFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfdmVycyk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDAgYW5kIHB1dHMgTkZTUFJPQ194eHggaW4gcHJvYyByZXR1cm4gYW5kCisgKiB2ZXJzaW9uIGluIHZlcnMgcmV0dXJuLCBvciByZXR1cm5zIC0xIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludAoreGlkX21hcF9maW5kKGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycCwgY29uc3QgdV9jaGFyICpicCwgdV9pbnQzMl90ICpwcm9jLAorCSAgICAgdV9pbnQzMl90ICp2ZXJzKQoreworCWludCBpOworCXN0cnVjdCB4aWRfbWFwX2VudHJ5ICp4bWVwOworCXVfaW50MzJfdCB4aWQgPSBycC0+cm1feGlkOworCXN0cnVjdCBpcCAqaXAgPSAoc3RydWN0IGlwICopYnA7CisjaWZkZWYgSU5FVDYKKwlzdHJ1Y3QgaXA2X2hkciAqaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnA7CisjZW5kaWYKKwlpbnQgY21wOworCisJLyogU3RhcnQgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgbGFzdCBsZWZ0IG9mZiAqLworCWkgPSB4aWRfbWFwX2hpbnQ7CisJZG8geworCQl4bWVwID0gJnhpZF9tYXBbaV07CisJCWNtcCA9IDE7CisJCWlmICh4bWVwLT5pcHZlciAhPSBJUF9WKGlwKSB8fCB4bWVwLT54aWQgIT0geGlkKQorCQkJZ290byBuZXh0aXRlbTsKKwkJc3dpdGNoICh4bWVwLT5pcHZlcikgeworCQljYXNlIDQ6CisJCQlpZiAobWVtY21wKCZpcC0+aXBfc3JjLCAmeG1lcC0+c2VydmVyLAorCQkJCSAgIHNpemVvZihpcC0+aXBfc3JjKSkgIT0gMCB8fAorCQkJICAgIG1lbWNtcCgmaXAtPmlwX2RzdCwgJnhtZXAtPmNsaWVudCwKKwkJCQkgICBzaXplb2YoaXAtPmlwX2RzdCkpICE9IDApIHsKKwkJCQljbXAgPSAwOworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJY2FzZSA2OgorCQkJaWYgKG1lbWNtcCgmaXA2LT5pcDZfc3JjLCAmeG1lcC0+c2VydmVyLAorCQkJCSAgIHNpemVvZihpcDYtPmlwNl9zcmMpKSAhPSAwIHx8CisJCQkgICAgbWVtY21wKCZpcDYtPmlwNl9kc3QsICZ4bWVwLT5jbGllbnQsCisJCQkJICAgc2l6ZW9mKGlwNi0+aXA2X2RzdCkpICE9IDApIHsKKwkJCQljbXAgPSAwOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCWNtcCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY21wKSB7CisJCQkvKiBtYXRjaCAqLworCQkJeGlkX21hcF9oaW50ID0gaTsKKwkJCSpwcm9jID0geG1lcC0+cHJvYzsKKwkJCSp2ZXJzID0geG1lcC0+dmVyczsKKwkJCXJldHVybiAwOworCQl9CisJbmV4dGl0ZW06CisJCWlmICgrK2kgPj0gWElETUFQU0laRSkKKwkJCWkgPSAwOworCX0gd2hpbGUgKGkgIT0geGlkX21hcF9oaW50KTsKKworCS8qIHNlYXJjaCBmYWlsZWQgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFJvdXRpbmVzIGZvciBwYXJzaW5nIHJlcGx5IHBhY2tldHMKKyAqLworCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhY3R1YWwgcmVzdWx0cy4KKyAqIElmIHRoZSBwYWNrZXQgd2FzIHRydW5jYXRlZCwgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2VyZXAocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKnJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpkcDsKKwl1X2ludCBsZW47CisJZW51bSBzdW5ycGNfYWNjZXB0X3N0YXQgYXN0YXQ7CisKKwkvKgorCSAqIFBvcnRhYmlsaXR5IG5vdGU6CisJICogSGVyZSB3ZSBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBhcl92ZXJmIGNyZWRlbnRpYWxzLgorCSAqIE9yaWdpbmFsbHksIHRoaXMgY2FsY3VsYXRpb24gd2FzCisJICoJZHAgPSAodV9pbnQzMl90ICopJnJwLT5ybV9yZXBseS5ycF9hY3B0LmFyX3ZlcmYKKwkgKiBPbiB0aGUgd2lyZSwgdGhlIHJwX2FjcHQgZmllbGQgc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyCisJICogdGhlICgzMiBiaXQpIHJwX3N0YXQgZmllbGQuICBIb3dldmVyLCBycF9hY3B0ICh3aGljaCBpcyBhCisJICogInN0cnVjdCBhY2NlcHRlZF9yZXBseSIpIGNvbnRhaW5zIGEgInN0cnVjdCBvcGFxdWVfYXV0aCIsCisJICogd2hvc2UgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gY29udGFpbnMgYSBwb2ludGVyLCBzbyBvbiBhCisJICogNjQtYml0IG1hY2hpbmUgdGhlIGNvbXBpbGVyIGluc2VydHMgMzIgYml0cyBvZiBwYWRkaW5nCisJICogYmVmb3JlIHJwLT5ybV9yZXBseS5ycF9hY3B0LmFyX3ZlcmYuICBTbywgd2UgY2Fubm90IHVzZQorCSAqIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB0byBwYXJzZSB0aGUgb24tdGhlLXdpcmUKKwkgKiByZXByZXNlbnRhdGlvbi4gIEluc3RlYWQsIHdlIHNraXAgcGFzdCB0aGUgcnBfc3RhdCBmaWVsZCwKKwkgKiB3aGljaCBpcyBhbiAiZW51bSIgYW5kIHNvIG9jY3VwaWVzIG9uZSAzMi1iaXQgd29yZC4KKwkgKi8KKwlkcCA9ICgoY29uc3QgdV9pbnQzMl90ICopJnJwLT5ybV9yZXBseSkgKyAxOworCVRDSEVDSyhkcFsxXSk7CisJbGVuID0gRVhUUkFDVF8zMkJJVFMoJmRwWzFdKTsKKwlpZiAobGVuID49IGxlbmd0aCkKKwkJcmV0dXJuIChOVUxMKTsKKwkvKgorCSAqIHNraXAgcGFzdCB0aGUgYXJfdmVyZiBjcmVkZW50aWFscy4KKwkgKi8KKwlkcCArPSAobGVuICsgKDIqc2l6ZW9mKHVfaW50MzJfdCkgKyAzKSkgLyBzaXplb2YodV9pbnQzMl90KTsKKwlUQ0hFQ0syKGRwWzBdLCAwKTsKKworCS8qCisJICogbm93IHdlIGNhbiBjaGVjayB0aGUgYXJfc3RhdCBmaWVsZAorCSAqLworCWFzdGF0ID0gKGVudW0gc3VucnBjX2FjY2VwdF9zdGF0KSBFWFRSQUNUXzMyQklUUyhkcCk7CisJc3dpdGNoIChhc3RhdCkgeworCisJY2FzZSBTVU5SUENfU1VDQ0VTUzoKKwkJYnJlYWs7CisKKwljYXNlIFNVTlJQQ19QUk9HX1VOQVZBSUw6CisJCXByaW50ZigiIFBST0dfVU5BVkFJTCIpOworCQluZnNlcnIgPSAxOwkJLyogc3VwcHJlc3MgdHJ1bmMgc3RyaW5nICovCisJCXJldHVybiAoTlVMTCk7CisKKwljYXNlIFNVTlJQQ19QUk9HX01JU01BVENIOgorCQlwcmludGYoIiBQUk9HX01JU01BVENIIik7CisJCW5mc2VyciA9IDE7CQkvKiBzdXBwcmVzcyB0cnVuYyBzdHJpbmcgKi8KKwkJcmV0dXJuIChOVUxMKTsKKworCWNhc2UgU1VOUlBDX1BST0NfVU5BVkFJTDoKKwkJcHJpbnRmKCIgUFJPQ19VTkFWQUlMIik7CisJCW5mc2VyciA9IDE7CQkvKiBzdXBwcmVzcyB0cnVuYyBzdHJpbmcgKi8KKwkJcmV0dXJuIChOVUxMKTsKKworCWNhc2UgU1VOUlBDX0dBUkJBR0VfQVJHUzoKKwkJcHJpbnRmKCIgR0FSQkFHRV9BUkdTIik7CisJCW5mc2VyciA9IDE7CQkvKiBzdXBwcmVzcyB0cnVuYyBzdHJpbmcgKi8KKwkJcmV0dXJuIChOVUxMKTsKKworCWNhc2UgU1VOUlBDX1NZU1RFTV9FUlI6CisJCXByaW50ZigiIFNZU1RFTV9FUlIiKTsKKwkJbmZzZXJyID0gMTsJCS8qIHN1cHByZXNzIHRydW5jIHN0cmluZyAqLworCQlyZXR1cm4gKE5VTEwpOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgYXJfc3RhdCAlZCIsIGFzdGF0KTsKKwkJbmZzZXJyID0gMTsJCS8qIHN1cHByZXNzIHRydW5jIHN0cmluZyAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBzdWNjZXNzZnVsIHJldHVybiAqLworCVRDSEVDSzIoKmRwLCBzaXplb2YoYXN0YXQpKTsKKwlyZXR1cm4gKCh1X2ludDMyX3QgKikgKHNpemVvZihhc3RhdCkgKyAoKGNoYXIgKilkcCkpKTsKK3RydW5jOgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2VzdGF0dXMoY29uc3QgdV9pbnQzMl90ICpkcCwgaW50ICplcikKK3sKKwlpbnQgZXJybnVtOworCisJVENIRUNLKGRwWzBdKTsKKworCWVycm51bSA9IEVYVFJBQ1RfMzJCSVRTKCZkcFswXSk7CisJaWYgKGVyKQorCQkqZXIgPSBlcnJudW07CisJaWYgKGVycm51bSAhPSAwKSB7CisJCWlmICghcWZsYWcpCisJCQlwcmludGYoIiBFUlJPUjogJXMiLAorCQkJICAgIHRvazJzdHIoc3RhdHVzMnN0ciwgInVuayAlZCIsIGVycm51bSkpOworCQluZnNlcnIgPSAxOworCX0KKwlyZXR1cm4gKGRwICsgMSk7Cit0cnVuYzoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCitwYXJzZWZhdHRyKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlLCBpbnQgdjMpCit7CisJY29uc3Qgc3RydWN0IG5mc19mYXR0ciAqZmFwOworCisJZmFwID0gKGNvbnN0IHN0cnVjdCBuZnNfZmF0dHIgKilkcDsKKwlUQ0hFQ0soZmFwLT5mYV9naWQpOworCWlmICh2ZXJib3NlKSB7CisJCXByaW50ZigiICVzICVvIGlkcyAlZC8lZCIsCisJCSAgICB0b2syc3RyKHR5cGUyc3RyLCAidW5rLWZ0ICVkICIsCisJCSAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV90eXBlKSksCisJCSAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV9tb2RlKSwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhX3VpZCksCisJCSAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV9naWQpKTsKKwkJaWYgKHYzKSB7CisJCQlUQ0hFQ0soZmFwLT5mYTNfc2l6ZSk7CisJCQlwcmludGYoIiBzeiAlIiBQUkl1NjQsCisJCQkJRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZmYXAtPmZhM19zaXplKSk7CisJCX0gZWxzZSB7CisJCQlUQ0hFQ0soZmFwLT5mYTJfc2l6ZSk7CisJCQlwcmludGYoIiBzeiAlZCIsIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9zaXplKSk7CisJCX0KKwl9CisJLyogcHJpbnQgbG90cyBtb3JlIHN0dWZmICovCisJaWYgKHZlcmJvc2UgPiAxKSB7CisJCWlmICh2MykgeworCQkJVENIRUNLKGZhcC0+ZmEzX2N0aW1lKTsKKwkJCXByaW50ZigiIG5saW5rICVkIHJkZXYgJWQvJWQiLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhX25saW5rKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfcmRldi5zcGVjZGF0YTEpLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhM19yZGV2LnNwZWNkYXRhMikpOworCQkJcHJpbnRmKCIgZnNpZCAlIiBQUkl4NjQsCisJCQkJRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZmYXAtPmZhM19mc2lkKSk7CisJCQlwcmludGYoIiBmaWxlaWQgJSIgUFJJeDY0LAorCQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmZmFwLT5mYTNfZmlsZWlkKSk7CisJCQlwcmludGYoIiBhL20vY3RpbWUgJXUuJTA2dSIsCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEzX2F0aW1lLm5mc3YzX3NlYyksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEzX2F0aW1lLm5mc3YzX25zZWMpKTsKKwkJCXByaW50ZigiICV1LiUwNnUiLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhM19tdGltZS5uZnN2M19zZWMpLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhM19tdGltZS5uZnN2M19uc2VjKSk7CisJCQlwcmludGYoIiAldS4lMDZ1IiwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfY3RpbWUubmZzdjNfc2VjKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfY3RpbWUubmZzdjNfbnNlYykpOworCQl9IGVsc2UgeworCQkJVENIRUNLKGZhcC0+ZmEyX2N0aW1lKTsKKwkJCXByaW50ZigiIG5saW5rICVkIHJkZXYgJXggZnNpZCAleCBub2RlaWQgJXggYS9tL2N0aW1lIiwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV9ubGluayksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX3JkZXYpLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9mc2lkKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfZmlsZWlkKSk7CisJCQlwcmludGYoIiAldS4lMDZ1IiwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfYXRpbWUubmZzdjJfc2VjKSwKKwkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfYXRpbWUubmZzdjJfdXNlYykpOworCQkJcHJpbnRmKCIgJXUuJTA2dSIsCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX210aW1lLm5mc3YyX3NlYyksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX210aW1lLm5mc3YyX3VzZWMpKTsKKwkJCXByaW50ZigiICV1LiUwNnUiLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9jdGltZS5uZnN2Ml9zZWMpLAorCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9jdGltZS5uZnN2Ml91c2VjKSk7CisJCX0KKwl9CisJcmV0dXJuICgoY29uc3QgdV9pbnQzMl90ICopKCh1bnNpZ25lZCBjaGFyICopZHAgKworCQkodjMgPyBORlNYX1YzRkFUVFIgOiBORlNYX1YyRkFUVFIpKSk7Cit0cnVuYzoKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgaW50CitwYXJzZWF0dHJzdGF0KGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlLCBpbnQgdjMpCit7CisJaW50IGVyOworCisJZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKTsKKwlpZiAoZHAgPT0gTlVMTCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoZXIpCisJCXJldHVybiAoMSk7CisKKwlyZXR1cm4gKHBhcnNlZmF0dHIoZHAsIHZlcmJvc2UsIHYzKSAhPSBOVUxMKTsKK30KKworc3RhdGljIGludAorcGFyc2VkaXJvcHJlcyhjb25zdCB1X2ludDMyX3QgKmRwKQoreworCWludCBlcjsKKworCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQorCQlyZXR1cm4gKDApOworCWlmIChlcikKKwkJcmV0dXJuICgxKTsKKworCWRwID0gcGFyc2VmaChkcCwgMCk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKHBhcnNlZmF0dHIoZHAsIHZmbGFnLCAwKSAhPSBOVUxMKTsKK30KKworc3RhdGljIGludAorcGFyc2VsaW5rcmVzKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2MykKK3sKKwlpbnQgZXI7CisKKwlkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpOworCWlmIChkcCA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisJaWYgKGVyKQorCQlyZXR1cm4oMSk7CisJaWYgKHYzICYmICEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCisJCXJldHVybiAoMCk7CisJcHV0Y2hhcignICcpOworCXJldHVybiAocGFyc2VmbihkcCkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlc3RhdGZzKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2MykKK3sKKwljb25zdCBzdHJ1Y3QgbmZzX3N0YXRmcyAqc2ZzcDsKKwlpbnQgZXI7CisKKwlkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpOworCWlmIChkcCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWlmICghdjMgJiYgZXIpCisJCXJldHVybiAoMSk7CisKKwlpZiAocWZsYWcpCisJCXJldHVybigxKTsKKworCWlmICh2MykgeworCQlpZiAodmZsYWcpCisJCQlwcmludGYoIiBQT1NUOiIpOworCQlpZiAoIShkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmZsYWcpKSkKKwkJCXJldHVybiAoMCk7CisJfQorCisJVENIRUNLMigqZHAsICh2MyA/IE5GU1hfVjNTVEFURlMgOiBORlNYX1YyU1RBVEZTKSk7CisKKwlzZnNwID0gKGNvbnN0IHN0cnVjdCBuZnNfc3RhdGZzICopZHA7CisKKwlpZiAodjMpIHsKKwkJcHJpbnRmKCIgdGJ5dGVzICUiIFBSSXU2NCAiIGZieXRlcyAlIiBQUkl1NjQgIiBhYnl0ZXMgJSIgUFJJdTY0LAorCQkJRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnNwLT5zZl90Ynl0ZXMpLAorCQkJRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnNwLT5zZl9mYnl0ZXMpLAorCQkJRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnNwLT5zZl9hYnl0ZXMpKTsKKwkJaWYgKHZmbGFnKSB7CisJCQlwcmludGYoIiB0ZmlsZXMgJSIgUFJJdTY0ICIgZmZpbGVzICUiIFBSSXU2NCAiIGFmaWxlcyAlIiBQUkl1NjQgIiBpbnZhciAldSIsCisJCQkgICAgICAgRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnNwLT5zZl90ZmlsZXMpLAorCQkJICAgICAgIEVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZzcC0+c2ZfZmZpbGVzKSwKKwkJCSAgICAgICBFWFRSQUNUXzY0QklUUygodV9pbnQzMl90ICopJnNmc3AtPnNmX2FmaWxlcyksCisJCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmc3AtPnNmX2ludmFyc2VjKSk7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIiB0c2l6ZSAlZCBic2l6ZSAlZCBibG9ja3MgJWQgYmZyZWUgJWQgYmF2YWlsICVkIiwKKwkJCUVYVFJBQ1RfMzJCSVRTKCZzZnNwLT5zZl90c2l6ZSksCisJCQlFWFRSQUNUXzMyQklUUygmc2ZzcC0+c2ZfYnNpemUpLAorCQkJRVhUUkFDVF8zMkJJVFMoJnNmc3AtPnNmX2Jsb2NrcyksCisJCQlFWFRSQUNUXzMyQklUUygmc2ZzcC0+c2ZfYmZyZWUpLAorCQkJRVhUUkFDVF8zMkJJVFMoJnNmc3AtPnNmX2JhdmFpbCkpOworCX0KKworCXJldHVybiAoMSk7Cit0cnVuYzoKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwYXJzZXJkZGlyZXMoY29uc3QgdV9pbnQzMl90ICpkcCkKK3sKKwlpbnQgZXI7CisKKwlkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpOworCWlmIChkcCA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWlmIChlcikKKwkJcmV0dXJuICgxKTsKKwlpZiAocWZsYWcpCisJCXJldHVybiAoMSk7CisKKwlUQ0hFQ0soZHBbMl0pOworCXByaW50ZigiIG9mZnNldCAleCBzaXplICVkICIsCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSksIEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSkpOworCWlmIChkcFsyXSAhPSAwKQorCQlwcmludGYoIiBlb2YiKTsKKworCXJldHVybiAoMSk7Cit0cnVuYzoKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKK3BhcnNlX3djY19hdHRyKGNvbnN0IHVfaW50MzJfdCAqZHApCit7CisJcHJpbnRmKCIgc3ogJSIgUFJJdTY0LCBFWFRSQUNUXzY0QklUUygmZHBbMF0pKTsKKwlwcmludGYoIiBtdGltZSAldS4lMDZ1IGN0aW1lICV1LiUwNnUiLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbMl0pLCBFWFRSQUNUXzMyQklUUygmZHBbM10pLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbNF0pLCBFWFRSQUNUXzMyQklUUygmZHBbNV0pKTsKKwlyZXR1cm4gKGRwICsgNik7Cit9CisKKy8qCisgKiBQcmUgb3BlcmF0aW9uIGF0dHJpYnV0ZXMuIFByaW50IG9ubHkgaWYgdmZsYWcgPiAxLgorICovCitzdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKK3BhcnNlX3ByZV9vcF9hdHRyKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlKQoreworCVRDSEVDSyhkcFswXSk7CisJaWYgKCFFWFRSQUNUXzMyQklUUygmZHBbMF0pKQorCQlyZXR1cm4gKGRwICsgMSk7CisJZHArKzsKKwlUQ0hFQ0syKCpkcCwgMjQpOworCWlmICh2ZXJib3NlID4gMSkgeworCQlyZXR1cm4gcGFyc2Vfd2NjX2F0dHIoZHApOworCX0gZWxzZSB7CisJCS8qIElmIG5vdCB2ZXJib3NlIGVub3VnaCwganVzdCBza2lwIG92ZXIgd2NjX2F0dHIgKi8KKwkJcmV0dXJuIChkcCArIDYpOworCX0KK3RydW5jOgorCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBQb3N0IG9wZXJhdGlvbiBhdHRyaWJ1dGVzIGFyZSBwcmludGVkIGlmIHZmbGFnID49IDEKKyAqLworc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCitwYXJzZV9wb3N0X29wX2F0dHIoY29uc3QgdV9pbnQzMl90ICpkcCwgaW50IHZlcmJvc2UpCit7CisJVENIRUNLKGRwWzBdKTsKKwlpZiAoIUVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpCisJCXJldHVybiAoZHAgKyAxKTsKKwlkcCsrOworCWlmICh2ZXJib3NlKSB7CisJCXJldHVybiBwYXJzZWZhdHRyKGRwLCB2ZXJib3NlLCAxKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChkcCArIChORlNYX1YzRkFUVFIgLyBzaXplb2YgKHVfaW50MzJfdCkpKTsKK3RydW5jOgorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2Vfd2NjX2RhdGEoY29uc3QgdV9pbnQzMl90ICpkcCwgaW50IHZlcmJvc2UpCit7CisJaWYgKHZlcmJvc2UgPiAxKQorCQlwcmludGYoIiBQUkU6Iik7CisJaWYgKCEoZHAgPSBwYXJzZV9wcmVfb3BfYXR0cihkcCwgdmVyYm9zZSkpKQorCQlyZXR1cm4gKDApOworCisJaWYgKHZlcmJvc2UpCisJCXByaW50ZigiIFBPU1Q6Iik7CisJcmV0dXJuIHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmVyYm9zZSk7Cit9CisKK3N0YXRpYyBjb25zdCB1X2ludDMyX3QgKgorcGFyc2VjcmVhdGVvcHJlcyhjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgZXI7CisKKwlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKKwkJcmV0dXJuICgwKTsKKwlpZiAoZXIpCisJCWRwID0gcGFyc2Vfd2NjX2RhdGEoZHAsIHZlcmJvc2UpOworCWVsc2UgeworCQlUQ0hFQ0soZHBbMF0pOworCQlpZiAoIUVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpCisJCQlyZXR1cm4gKGRwICsgMSk7CisJCWRwKys7CisJCWlmICghKGRwID0gcGFyc2VmaChkcCwgMSkpKQorCQkJcmV0dXJuICgwKTsKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCWlmICghKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZXJib3NlKSkpCisJCQkJcmV0dXJuICgwKTsKKwkJCWlmICh2ZmxhZyA+IDEpIHsKKwkJCQlwcmludGYoIiBkaXIgYXR0cjoiKTsKKwkJCQlkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZXJib3NlKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKGRwKTsKK3RydW5jOgorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNld2NjcmVzKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlKQoreworCWludCBlcjsKKworCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQorCQlyZXR1cm4gKDApOworCXJldHVybiBwYXJzZV93Y2NfZGF0YShkcCwgdmVyYm9zZSkgIT0gMDsKK30KKworc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCitwYXJzZXYzcmRkaXJyZXMoY29uc3QgdV9pbnQzMl90ICpkcCwgaW50IHZlcmJvc2UpCit7CisJaW50IGVyOworCisJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCisJCXJldHVybiAoMCk7CisJaWYgKHZmbGFnKQorCQlwcmludGYoIiBQT1NUOiIpOworCWlmICghKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZXJib3NlKSkpCisJCXJldHVybiAoMCk7CisJaWYgKGVyKQorCQlyZXR1cm4gZHA7CisJaWYgKHZmbGFnKSB7CisJCVRDSEVDSyhkcFsxXSk7CisJCXByaW50ZigiIHZlcmYgJTA4eCUwOHgiLCBkcFswXSwgZHBbMV0pOworCQlkcCArPSAyOworCX0KKwlyZXR1cm4gZHA7Cit0cnVuYzoKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgaW50CitwYXJzZWZzaW5mbyhjb25zdCB1X2ludDMyX3QgKmRwKQoreworCXN0cnVjdCBuZnN2M19mc2luZm8gKnNmcDsKKwlpbnQgZXI7CisKKwlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKKwkJcmV0dXJuICgwKTsKKwlpZiAodmZsYWcpCisJCXByaW50ZigiIFBPU1Q6Iik7CisJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCisJCXJldHVybiAoMCk7CisJaWYgKGVyKQorCQlyZXR1cm4gKDEpOworCisJc2ZwID0gKHN0cnVjdCBuZnN2M19mc2luZm8gKilkcDsKKwlUQ0hFQ0soKnNmcCk7CisJcHJpbnRmKCIgcnRtYXggJXUgcnRwcmVmICV1IHd0bWF4ICV1IHd0cHJlZiAldSBkdHByZWYgJXUiLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc19ydG1heCksCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3J0cHJlZiksCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3d0bWF4KSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmcC0+ZnNfd3RwcmVmKSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmcC0+ZnNfZHRwcmVmKSk7CisJaWYgKHZmbGFnKSB7CisJCXByaW50ZigiIHJ0bXVsdCAldSB3dG11bHQgJXUgbWF4ZnN6ICUiIFBSSXU2NCwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3J0bXVsdCksCisJCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc193dG11bHQpLAorCQkgICAgICAgRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnAtPmZzX21heGZpbGVzaXplKSk7CisJCXByaW50ZigiIGRlbHRhICV1LiUwNnUgIiwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3RpbWVkZWx0YS5uZnN2M19zZWMpLAorCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmcC0+ZnNfdGltZWRlbHRhLm5mc3YzX25zZWMpKTsKKwl9CisJcmV0dXJuICgxKTsKK3RydW5jOgorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlcGF0aGNvbmYoY29uc3QgdV9pbnQzMl90ICpkcCkKK3sKKwlpbnQgZXI7CisJc3RydWN0IG5mc3YzX3BhdGhjb25mICpzcHA7CisKKwlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKKwkJcmV0dXJuICgwKTsKKwlpZiAodmZsYWcpCisJCXByaW50ZigiIFBPU1Q6Iik7CisJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCisJCXJldHVybiAoMCk7CisJaWYgKGVyKQorCQlyZXR1cm4gKDEpOworCisJc3BwID0gKHN0cnVjdCBuZnN2M19wYXRoY29uZiAqKWRwOworCVRDSEVDSygqc3BwKTsKKworCXByaW50ZigiIGxpbmttYXggJXUgbmFtZW1heCAldSAlcyAlcyAlcyAlcyIsCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzcHAtPnBjX2xpbmttYXgpLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmc3BwLT5wY19uYW1lbWF4KSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwcC0+cGNfbm90cnVuYykgPyAibm90cnVuYyIgOiAiIiwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwcC0+cGNfY2hvd25yZXN0cmljdGVkKSA/ICJjaG93bnJlcyIgOiAiIiwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwcC0+cGNfY2FzZWluc2Vuc2l0aXZlKSA/ICJpZ25jYXNlIiA6ICIiLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmc3BwLT5wY19jYXNlcHJlc2VydmluZykgPyAia2VlcGNhc2UiIDogIiIpOworCXJldHVybiAoMSk7Cit0cnVuYzoKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgdm9pZAoraW50ZXJwX3JlcGx5KGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycCwgdV9pbnQzMl90IHByb2MsIHVfaW50MzJfdCB2ZXJzLCBpbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqZHA7CisJcmVnaXN0ZXIgaW50IHYzOworCWludCBlcjsKKworCXYzID0gKHZlcnMgPT0gTkZTX1ZFUjMpOworCisJaWYgKCF2MyAmJiBwcm9jIDwgTkZTX05QUk9DUykKKwkJcHJvYyA9IG5mc3YzX3Byb2NpZFtwcm9jXTsKKworCXN3aXRjaCAocHJvYykgeworCisJY2FzZSBORlNQUk9DX05PT1A6CisJCXByaW50ZigiIG5vcCIpOworCQlyZXR1cm47CisKKwljYXNlIE5GU1BST0NfTlVMTDoKKwkJcHJpbnRmKCIgbnVsbCIpOworCQlyZXR1cm47CisKKwljYXNlIE5GU1BST0NfR0VUQVRUUjoKKwkJcHJpbnRmKCIgZ2V0YXR0ciIpOworCQlkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpOworCQlpZiAoZHAgIT0gTlVMTCAmJiBwYXJzZWF0dHJzdGF0KGRwLCAhcWZsYWcsIHYzKSAhPSAwKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19TRVRBVFRSOgorCQlwcmludGYoIiBzZXRhdHRyIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJcmV0dXJuOworCQlpZiAodjMpIHsKKwkJCWlmIChwYXJzZXdjY3JlcyhkcCwgdmZsYWcpKQorCQkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZWF0dHJzdGF0KGRwLCAhcWZsYWcsIDApICE9IDApCisJCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX0xPT0tVUDoKKwkJcHJpbnRmKCIgbG9va3VwIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmICh2MykgeworCQkJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCisJCQkJYnJlYWs7CisJCQlpZiAoZXIpIHsKKwkJCQlpZiAodmZsYWcgPiAxKSB7CisJCQkJCXByaW50ZigiIHBvc3QgZGF0dHI6Iik7CisJCQkJCWRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShkcCA9IHBhcnNlZmgoZHAsIHYzKSkpCisJCQkJCWJyZWFrOworCQkJCWlmICgoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkgJiYKKwkJCQkgICAgdmZsYWcgPiAxKSB7CisJCQkJCXByaW50ZigiIHBvc3QgZGF0dHI6Iik7CisJCQkJCWRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGRwKQorCQkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZWRpcm9wcmVzKGRwKSAhPSAwKQorCQkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19BQ0NFU1M6CisJCXByaW50ZigiIGFjY2VzcyIpOworCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKKwkJCWJyZWFrOworCQlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKKwkJCWJyZWFrOworCQlpZiAodmZsYWcpCisJCQlwcmludGYoIiBhdHRyOiIpOworCQlpZiAoIShkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmZsYWcpKSkKKwkJCWJyZWFrOworCQlpZiAoIWVyKQorCQkJcHJpbnRmKCIgYyAlMDR4IiwgRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSk7CisJCXJldHVybjsKKworCWNhc2UgTkZTUFJPQ19SRUFETElOSzoKKwkJcHJpbnRmKCIgcmVhZGxpbmsiKTsKKwkJZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKTsKKwkJaWYgKGRwICE9IE5VTEwgJiYgcGFyc2VsaW5rcmVzKGRwLCB2MykgIT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUkVBRDoKKwkJcHJpbnRmKCIgcmVhZCIpOworCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKKwkJCWJyZWFrOworCQlpZiAodjMpIHsKKwkJCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQorCQkJCWJyZWFrOworCQkJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCisJCQkJYnJlYWs7CisJCQlpZiAoZXIpCisJCQkJcmV0dXJuOworCQkJaWYgKHZmbGFnKSB7CisJCQkJVENIRUNLKGRwWzFdKTsKKwkJCQlwcmludGYoIiAldSBieXRlcyIsIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpOworCQkJCWlmIChFWFRSQUNUXzMyQklUUygmZHBbMV0pKQorCQkJCQlwcmludGYoIiBFT0YiKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZWF0dHJzdGF0KGRwLCB2ZmxhZywgMCkgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfV1JJVEU6CisJCXByaW50ZigiIHdyaXRlIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmICh2MykgeworCQkJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCisJCQkJYnJlYWs7CisJCQlpZiAoIShkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZmxhZykpKQorCQkJCWJyZWFrOworCQkJaWYgKGVyKQorCQkJCXJldHVybjsKKwkJCWlmICh2ZmxhZykgeworCQkJCVRDSEVDSyhkcFswXSk7CisJCQkJcHJpbnRmKCIgJXUgYnl0ZXMiLCBFWFRSQUNUXzMyQklUUygmZHBbMF0pKTsKKwkJCQlpZiAodmZsYWcgPiAxKSB7CisJCQkJCVRDSEVDSyhkcFsxXSk7CisJCQkJCXByaW50ZigiIDwlcz4iLAorCQkJCQkJdG9rMnN0cihuZnN2M193cml0ZW1vZGVzLAorCQkJCQkJCU5VTEwsIEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSkpKTsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlYXR0cnN0YXQoZHAsIHZmbGFnLCB2MykgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfQ1JFQVRFOgorCQlwcmludGYoIiBjcmVhdGUiKTsKKwkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCisJCQlicmVhazsKKwkJaWYgKHYzKSB7CisJCQlpZiAocGFyc2VjcmVhdGVvcHJlcyhkcCwgdmZsYWcpICE9IDApCisJCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlZGlyb3ByZXMoZHApICE9IDApCisJCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX01LRElSOgorCQlwcmludGYoIiBta2RpciIpOworCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKKwkJCWJyZWFrOworCQlpZiAodjMpIHsKKwkJCWlmIChwYXJzZWNyZWF0ZW9wcmVzKGRwLCB2ZmxhZykgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAocGFyc2VkaXJvcHJlcyhkcCkgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfU1lNTElOSzoKKwkJcHJpbnRmKCIgc3ltbGluayIpOworCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKKwkJCWJyZWFrOworCQlpZiAodjMpIHsKKwkJCWlmIChwYXJzZWNyZWF0ZW9wcmVzKGRwLCB2ZmxhZykgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAocGFyc2VzdGF0dXMoZHAsICZlcikgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfTUtOT0Q6CisJCXByaW50ZigiIG1rbm9kIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmIChwYXJzZWNyZWF0ZW9wcmVzKGRwLCB2ZmxhZykgIT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUkVNT1ZFOgorCQlwcmludGYoIiByZW1vdmUiKTsKKwkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCisJCQlicmVhazsKKwkJaWYgKHYzKSB7CisJCQlpZiAocGFyc2V3Y2NyZXMoZHAsIHZmbGFnKSkKKwkJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlpZiAocGFyc2VzdGF0dXMoZHAsICZlcikgIT0gMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfUk1ESVI6CisJCXByaW50ZigiIHJtZGlyIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmICh2MykgeworCQkJaWYgKHBhcnNld2NjcmVzKGRwLCB2ZmxhZykpCisJCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlc3RhdHVzKGRwLCAmZXIpICE9IDApCisJCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1JFTkFNRToKKwkJcHJpbnRmKCIgcmVuYW1lIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmICh2MykgeworCQkJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCisJCQkJYnJlYWs7CisJCQlpZiAodmZsYWcpIHsKKwkJCQlwcmludGYoIiBmcm9tOiIpOworCQkJCWlmICghKGRwID0gcGFyc2Vfd2NjX2RhdGEoZHAsIHZmbGFnKSkpCisJCQkJCWJyZWFrOworCQkJCXByaW50ZigiIHRvOiIpOworCQkJCWlmICghKGRwID0gcGFyc2Vfd2NjX2RhdGEoZHAsIHZmbGFnKSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlc3RhdHVzKGRwLCAmZXIpICE9IDApCisJCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX0xJTks6CisJCXByaW50ZigiIGxpbmsiKTsKKwkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCisJCQlicmVhazsKKwkJaWYgKHYzKSB7CisJCQlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKKwkJCQlicmVhazsKKwkJCWlmICh2ZmxhZykgeworCQkJCXByaW50ZigiIGZpbGUgUE9TVDoiKTsKKwkJCQlpZiAoIShkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmZsYWcpKSkKKwkJCQkJYnJlYWs7CisJCQkJcHJpbnRmKCIgZGlyOiIpOworCQkJCWlmICghKGRwID0gcGFyc2Vfd2NjX2RhdGEoZHAsIHZmbGFnKSkpCisJCQkJCWJyZWFrOworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZXN0YXR1cyhkcCwgJmVyKSAhPSAwKQorCQkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19SRUFERElSOgorCQlwcmludGYoIiByZWFkZGlyIik7CisJCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQorCQkJYnJlYWs7CisJCWlmICh2MykgeworCQkJaWYgKHBhcnNldjNyZGRpcnJlcyhkcCwgdmZsYWcpKQorCQkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwYXJzZXJkZGlyZXMoZHApICE9IDApCisJCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1JFQURESVJQTFVTOgorCQlwcmludGYoIiByZWFkZGlycGx1cyIpOworCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKKwkJCWJyZWFrOworCQlpZiAocGFyc2V2M3JkZGlycmVzKGRwLCB2ZmxhZykpCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX0ZTU1RBVDoKKwkJcHJpbnRmKCIgZnNzdGF0Iik7CisJCWRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCk7CisJCWlmIChkcCAhPSBOVUxMICYmIHBhcnNlc3RhdGZzKGRwLCB2MykgIT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIE5GU1BST0NfRlNJTkZPOgorCQlwcmludGYoIiBmc2luZm8iKTsKKwkJZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKTsKKwkJaWYgKGRwICE9IE5VTEwgJiYgcGFyc2Vmc2luZm8oZHApICE9IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBORlNQUk9DX1BBVEhDT05GOgorCQlwcmludGYoIiBwYXRoY29uZiIpOworCQlkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpOworCQlpZiAoZHAgIT0gTlVMTCAmJiBwYXJzZXBhdGhjb25mKGRwKSAhPSAwKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgTkZTUFJPQ19DT01NSVQ6CisJCXByaW50ZigiIGNvbW1pdCIpOworCQlkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpOworCQlpZiAoZHAgIT0gTlVMTCAmJiBwYXJzZXdjY3JlcyhkcCwgdmZsYWcpICE9IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgcHJvYy0ldSIsIHByb2MpOworCQlyZXR1cm47CisJfQordHJ1bmM6CisJaWYgKCFuZnNlcnIpCisJCWZwdXRzKCIgW3xuZnNdIiwgc3Rkb3V0KTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LW50cC5jIGIvcHJpbnQtbnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2YTY1NAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LW50cC5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRm9ybWF0IGFuZCBwcmludCBudHAgcGFja2V0cy4KKyAqCUJ5IEplZmZyZXkgTW9ndWwvREVDV1JMCisgKglsb29zZWx5IGJhc2VkIG9uIHByaW50LWJvb3RwLmMKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1udHAuYyx2IDEuNDEuMi4xIDIwMDUvMDUvMDYgMDc6NTc6MTggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX1NUUkZUSU1FCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2lmZGVmIE1PREVNQVNLCisjdW5kZWYgTU9ERU1BU0sJCQkJCS8qIFNvbGFyaXMgc3Vja3MgKi8KKyNlbmRpZgorI2luY2x1ZGUgIm50cC5oIgorCitzdGF0aWMgdm9pZCBwX3NmaXgoY29uc3Qgc3RydWN0IHNfZml4ZWRwdCAqKTsKK3N0YXRpYyB2b2lkIHBfbnRwX3RpbWUoY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqKTsKK3N0YXRpYyB2b2lkIHBfbnRwX2RlbHRhKGNvbnN0IHN0cnVjdCBsX2ZpeGVkcHQgKiwgY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqKTsKKworc3RhdGljIHN0cnVjdCB0b2sgbnRwX21vZGVfdmFsdWVzW10gPSB7CisgICAgeyBNT0RFX1VOU1BFQywgICAgInVuc3BlY2lmaWVkIiB9LAorICAgIHsgTU9ERV9TWU1fQUNULCAgICJzeW1tZXRyaWMgYWN0aXZlIiB9LAorICAgIHsgTU9ERV9TWU1fUEFTLCAgICJzeW1tZXRyaWMgcGFzc2l2ZSIgfSwKKyAgICB7IE1PREVfQ0xJRU5ULCAgICAiQ2xpZW50IiB9LAorICAgIHsgTU9ERV9TRVJWRVIsICAgICJTZXJ2ZXIiIH0sCisgICAgeyBNT0RFX0JST0FEQ0FTVCwgIkJyb2FkY2FzdCIgfSwKKyAgICB7IE1PREVfUkVTMSwgICAgICAiUmVzZXJ2ZWQiIH0sCisgICAgeyBNT0RFX1JFUzIsICAgICAgIlJlc2VydmVkIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBudHBfbGVhcGluZF92YWx1ZXNbXSA9IHsKKyAgICB7IE5PX1dBUk5JTkcsICAgICAiIiB9LAorICAgIHsgUExVU19TRUMsICAgICAgICIrMXMiIH0sCisgICAgeyBNSU5VU19TRUMsICAgICAgIi0xcyIgfSwKKyAgICB7IEFMQVJNLCAgICAgICAgICAiY2xvY2sgdW5zeW5jaHJvbml6ZWQiIH0sCisgICAgeyAwLCBOVUxMIH0KK307CisKKy8qCisgKiBQcmludCBudHAgcmVxdWVzdHMKKyAqLwordm9pZAorbnRwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbnRwZGF0YSAqYnA7CisJaW50IG1vZGUsIHZlcnNpb24sIGxlYXBpbmQ7CisKKwlicCA9IChzdHJ1Y3QgbnRwZGF0YSAqKWNwOworCisJVENIRUNLKGJwLT5zdGF0dXMpOworCisJdmVyc2lvbiA9IChpbnQpKGJwLT5zdGF0dXMgJiBWRVJTSU9OTUFTSykgPj4gMzsKKwlwcmludGYoIk5UUHYlZCIsIHZlcnNpb24pOworCisJbW9kZSA9IGJwLT5zdGF0dXMgJiBNT0RFTUFTSzsKKyAgICAgICAgaWYgKCF2ZmxhZykgeworICAgICAgICAgICAgcHJpbnRmICgiLCAlcywgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihudHBfbW9kZV92YWx1ZXMsICJVbmtub3duIG1vZGUiLCBtb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHJpbnRmICgiLCBsZW5ndGggJXVcblx0JXMiLAorICAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICB0b2syc3RyKG50cF9tb2RlX3ZhbHVlcywgIlVua25vd24gbW9kZSIsIG1vZGUpKTsgICAgICAgIAorCisJbGVhcGluZCA9IGJwLT5zdGF0dXMgJiBMRUFQTUFTSzsKKyAgICAgICAgcHJpbnRmICgiLCBMZWFwIGluZGljYXRvcjogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgdG9rMnN0cihudHBfbGVhcGluZF92YWx1ZXMsICJVbmtub3duIiwgbGVhcGluZCksCisgICAgICAgICAgICAgICAgbGVhcGluZCk7CisKKwlUQ0hFQ0soYnAtPnN0cmF0dW0pOworCXByaW50ZigiLCBTdHJhdHVtICV1IiwgYnAtPnN0cmF0dW0pOworCisJVENIRUNLKGJwLT5wcG9sbCk7CisJcHJpbnRmKCIsIHBvbGwgJXVzIiwgYnAtPnBwb2xsKTsKKworCS8qIENhbid0IFRDSEVDSyBicC0+cHJlY2lzaW9uIGJpdGZpZWxkIHNvIGJwLT5kaXN0YW5jZSArIDAgaW5zdGVhZCAqLworCVRDSEVDSzIoYnAtPnJvb3RfZGVsYXksIDApOworCXByaW50ZigiLCBwcmVjaXNpb24gJWQiLCBicC0+cHJlY2lzaW9uKTsKKworCVRDSEVDSyhicC0+cm9vdF9kZWxheSk7CisJZnB1dHMoIlxuXHRSb290IERlbGF5OiAiLCBzdGRvdXQpOworCXBfc2ZpeCgmYnAtPnJvb3RfZGVsYXkpOworCisJVENIRUNLKGJwLT5yb290X2Rpc3BlcnNpb24pOworCWZwdXRzKCIsIFJvb3QgZGlzcGVyc2lvbjogIiwgc3Rkb3V0KTsKKwlwX3NmaXgoJmJwLT5yb290X2Rpc3BlcnNpb24pOworCisJVENIRUNLKGJwLT5yZWZpZCk7CisJZnB1dHMoIiwgUmVmZXJlbmNlLUlEOiAiLCBzdGRvdXQpOworCS8qIEludGVycHJldGF0aW9uIGRlcGVuZHMgb24gc3RyYXR1bSAqLworCXN3aXRjaCAoYnAtPnN0cmF0dW0pIHsKKworCWNhc2UgVU5TUEVDSUZJRUQ6CisJCXByaW50ZigiKHVuc3BlYykiKTsKKwkJYnJlYWs7CisKKwljYXNlIFBSSU1fUkVGOgorCQlpZiAoZm5fcHJpbnRuKCh1X2NoYXIgKikmKGJwLT5yZWZpZCksIDQsIHNuYXBlbmQpKQorCQkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisKKwljYXNlIElORk9fUVVFUlk6CisJCXByaW50ZigiJXMgSU5GT19RVUVSWSIsIGlwYWRkcl9zdHJpbmcoJihicC0+cmVmaWQpKSk7CisJCS8qIHRoaXMgZG9lc24ndCBoYXZlIG1vcmUgY29udGVudCAqLworCQlyZXR1cm47CisKKwljYXNlIElORk9fUkVQTFk6CisJCXByaW50ZigiJXMgSU5GT19SRVBMWSIsIGlwYWRkcl9zdHJpbmcoJihicC0+cmVmaWQpKSk7CisJCS8qIHRoaXMgaXMgdG9vIGNvbXBsZXggdG8gYmUgd29ydGggcHJpbnRpbmcgKi8KKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIlcyIsIGlwYWRkcl9zdHJpbmcoJihicC0+cmVmaWQpKSk7CisJCWJyZWFrOworCX0KKworCVRDSEVDSyhicC0+cmVmX3RpbWVzdGFtcCk7CisJZnB1dHMoIlxuXHQgIFJlZmVyZW5jZSBUaW1lc3RhbXA6ICAiLCBzdGRvdXQpOworCXBfbnRwX3RpbWUoJihicC0+cmVmX3RpbWVzdGFtcCkpOworCisJVENIRUNLKGJwLT5vcmdfdGltZXN0YW1wKTsKKwlmcHV0cygiXG5cdCAgT3JpZ2luYXRvciBUaW1lc3RhbXA6ICIsIHN0ZG91dCk7CisJcF9udHBfdGltZSgmKGJwLT5vcmdfdGltZXN0YW1wKSk7CisKKwlUQ0hFQ0soYnAtPnJlY190aW1lc3RhbXApOworCWZwdXRzKCJcblx0ICBSZWNlaXZlIFRpbWVzdGFtcDogICAgIiwgc3Rkb3V0KTsKKwlwX250cF90aW1lKCYoYnAtPnJlY190aW1lc3RhbXApKTsKKworCVRDSEVDSyhicC0+eG10X3RpbWVzdGFtcCk7CisJZnB1dHMoIlxuXHQgIFRyYW5zbWl0IFRpbWVzdGFtcDogICAiLCBzdGRvdXQpOworCXBfbnRwX3RpbWUoJihicC0+eG10X3RpbWVzdGFtcCkpOworCisJZnB1dHMoIlxuXHQgICAgT3JpZ2luYXRvciAtIFJlY2VpdmUgVGltZXN0YW1wOiAgIiwgc3Rkb3V0KTsKKwlwX250cF9kZWx0YSgmKGJwLT5vcmdfdGltZXN0YW1wKSwgJihicC0+cmVjX3RpbWVzdGFtcCkpOworCisJZnB1dHMoIlxuXHQgICAgT3JpZ2luYXRvciAtIFRyYW5zbWl0IFRpbWVzdGFtcDogIiwgc3Rkb3V0KTsKKwlwX250cF9kZWx0YSgmKGJwLT5vcmdfdGltZXN0YW1wKSwgJihicC0+eG10X3RpbWVzdGFtcCkpOworCisgICAgICAgIC8qIEZJWE1FIGtleS1pZCwgYXV0aGVudGljYXRpb24gKi8KKworCXJldHVybjsKKwordHJ1bmM6CisJZnB1dHMoIiBbfG50cF0iLCBzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZAorcF9zZml4KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzX2ZpeGVkcHQgKnNmcCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBpbnQgZjsKKwlyZWdpc3RlciBmbG9hdCBmZjsKKworCWkgPSBFWFRSQUNUXzE2QklUUygmc2ZwLT5pbnRfcGFydCk7CisJZiA9IEVYVFJBQ1RfMTZCSVRTKCZzZnAtPmZyYWN0aW9uKTsKKwlmZiA9IGYgLyA2NTUzNi4wOwkvKiBzaGlmdCByYWRpeCBwb2ludCBieSAxNiBiaXRzICovCisJZiA9IGZmICogMTAwMDAwMC4wOwkvKiBUcmVhdCBmcmFjdGlvbiBhcyBwYXJ0cyBwZXIgbWlsbGlvbiAqLworCXByaW50ZigiJWQuJTA2ZCIsIGksIGYpOworfQorCisjZGVmaW5lCUZNQVhJTlQJKDQyOTQ5NjcyOTYuMCkJLyogZmxvYXRpbmcgcG9pbnQgcmVwLiBvZiBNQVhJTlQgKi8KKworc3RhdGljIHZvaWQKK3BfbnRwX3RpbWUocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqbGZwKQoreworCXJlZ2lzdGVyIGludDMyX3QgaTsKKwlyZWdpc3RlciB1X2ludDMyX3QgdWY7CisJcmVnaXN0ZXIgdV9pbnQzMl90IGY7CisJcmVnaXN0ZXIgZmxvYXQgZmY7CisKKwlpID0gRVhUUkFDVF8zMkJJVFMoJmxmcC0+aW50X3BhcnQpOworCXVmID0gRVhUUkFDVF8zMkJJVFMoJmxmcC0+ZnJhY3Rpb24pOworCWZmID0gdWY7CisJaWYgKGZmIDwgMC4wKQkJLyogc29tZSBjb21waWxlcnMgYXJlIGJ1Z2d5ICovCisJCWZmICs9IEZNQVhJTlQ7CisJZmYgPSBmZiAvIEZNQVhJTlQ7CS8qIHNoaWZ0IHJhZGl4IHBvaW50IGJ5IDMyIGJpdHMgKi8KKwlmID0gZmYgKiAxMDAwMDAwMDAwLjA7CS8qIHRyZWF0IGZyYWN0aW9uIGFzIHBhcnRzIHBlciBiaWxsaW9uICovCisJcHJpbnRmKCIldS4lMDlkIiwgaSwgZik7CisKKyNpZmRlZiBIQVZFX1NUUkZUSU1FCisJLyoKKwkgKiBwcmludCB0aGUgdGltZSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCisJICovCisJaWYgKGkpIHsKKwkgICAgdGltZV90IHNlY29uZHMgPSBpIC0gSkFOXzE5NzA7CisJICAgIHN0cnVjdCB0bSAqdG07CisJICAgIGNoYXIgdGltZV9idWZbMTI4XTsKKworCSAgICB0bSA9IGxvY2FsdGltZSgmc2Vjb25kcyk7CisJICAgIHN0cmZ0aW1lKHRpbWVfYnVmLCBzaXplb2YgKHRpbWVfYnVmKSwgIiVZLyVtLyVkICVIOiVNOiVTIiwgdG0pOworCSAgICBwcmludGYgKCIgKCVzKSIsIHRpbWVfYnVmKTsKKwl9CisjZW5kaWYKK30KKworLyogUHJpbnRzIHRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuICpsZnAgYW5kICpvbGZwICovCitzdGF0aWMgdm9pZAorcF9udHBfZGVsdGEocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqb2xmcCwKKwkgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqbGZwKQoreworCXJlZ2lzdGVyIGludDMyX3QgaTsKKwlyZWdpc3RlciB1X2ludDMyX3QgdSwgdWY7CisJcmVnaXN0ZXIgdV9pbnQzMl90IG91LCBvdWY7CisJcmVnaXN0ZXIgdV9pbnQzMl90IGY7CisJcmVnaXN0ZXIgZmxvYXQgZmY7CisJaW50IHNpZ25iaXQ7CisKKwl1ID0gRVhUUkFDVF8zMkJJVFMoJmxmcC0+aW50X3BhcnQpOworCW91ID0gRVhUUkFDVF8zMkJJVFMoJm9sZnAtPmludF9wYXJ0KTsKKwl1ZiA9IEVYVFJBQ1RfMzJCSVRTKCZsZnAtPmZyYWN0aW9uKTsKKwlvdWYgPSBFWFRSQUNUXzMyQklUUygmb2xmcC0+ZnJhY3Rpb24pOworCWlmIChvdSA9PSAwICYmIG91ZiA9PSAwKSB7CisJCXBfbnRwX3RpbWUobGZwKTsKKwkJcmV0dXJuOworCX0KKworCWkgPSB1IC0gb3U7CisKKwlpZiAoaSA+IDApIHsJCS8qIG5ldyBpcyBkZWZpbml0ZWx5IGdyZWF0ZXIgdGhhbiBvbGQgKi8KKwkJc2lnbmJpdCA9IDA7CisJCWYgPSB1ZiAtIG91ZjsKKwkJaWYgKG91ZiA+IHVmKQkvKiBtdXN0IGJvcnJvdyBmcm9tIGhpZ2gtb3JkZXIgYml0cyAqLworCQkJaSAtPSAxOworCX0gZWxzZSBpZiAoaSA8IDApIHsJLyogbmV3IGlzIGRlZmluaXRlbHkgbGVzcyB0aGFuIG9sZCAqLworCQlzaWduYml0ID0gMTsKKwkJZiA9IG91ZiAtIHVmOworCQlpZiAodWYgPiBvdWYpCS8qIG11c3QgY2FycnkgaW50byB0aGUgaGlnaC1vcmRlciBiaXRzICovCisJCQlpICs9IDE7CisJCWkgPSAtaTsKKwl9IGVsc2UgewkJLyogaW50X3BhcnQgaXMgemVybyAqLworCQlpZiAodWYgPiBvdWYpIHsKKwkJCXNpZ25iaXQgPSAwOworCQkJZiA9IHVmIC0gb3VmOworCQl9IGVsc2UgeworCQkJc2lnbmJpdCA9IDE7CisJCQlmID0gb3VmIC0gdWY7CisJCX0KKwl9CisKKwlmZiA9IGY7CisJaWYgKGZmIDwgMC4wKQkJLyogc29tZSBjb21waWxlcnMgYXJlIGJ1Z2d5ICovCisJCWZmICs9IEZNQVhJTlQ7CisJZmYgPSBmZiAvIEZNQVhJTlQ7CS8qIHNoaWZ0IHJhZGl4IHBvaW50IGJ5IDMyIGJpdHMgKi8KKwlmID0gZmYgKiAxMDAwMDAwMDAwLjA7CS8qIHRyZWF0IGZyYWN0aW9uIGFzIHBhcnRzIHBlciBiaWxsaW9uICovCisJaWYgKHNpZ25iaXQpCisJCXB1dGNoYXIoJy0nKTsKKwllbHNlCisJCXB1dGNoYXIoJysnKTsKKwlwcmludGYoIiVkLiUwOWQiLCBpLCBmKTsKK30KKwpkaWZmIC0tZ2l0IGEvcHJpbnQtbnVsbC5jIGIvcHJpbnQtbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjAzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1udWxsLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1udWxsLmMsdiAxLjUzLjIuNCAyMDA3LzAyLzI2IDEzOjMxOjMzIGhhbm5lcyBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImFmLmgiCisKKyNpbmNsdWRlICJpcC5oIgorI2lmZGVmIElORVQ2CisjaW5jbHVkZSAiaXA2LmgiCisjZW5kaWYKKworLyoKKyAqIFRoZSBETFRfTlVMTCBwYWNrZXQgaGVhZGVyIGlzIDQgYnl0ZXMgbG9uZy4gSXQgY29udGFpbnMgYSBob3N0LWJ5dGUtb3JkZXIKKyAqIDMyLWJpdCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBmYW1pbHksIGUuZy4gQUZfSU5FVC4KKyAqCisgKiBOb3RlIGhlcmUgdGhhdCAiaG9zdCIgcmVmZXJzIHRvIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBwYWNrZXRzIHdlcmUKKyAqIGNhcHR1cmVkOyB0aGF0IGlzbid0IG5lY2Vzc2FyaWx5ICp0aGlzKiBob3N0LgorICoKKyAqIFRoZSBPcGVuQlNEIERMVF9MT09QIHBhY2tldCBoZWFkZXIgaXMgdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IHRoZSBpbnRlZ2VyCisgKiBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisgKi8KKyNkZWZpbmUJTlVMTF9IRFJMRU4gNAorCisKKy8qCisgKiBCeXRlLXN3YXAgYSAzMi1iaXQgbnVtYmVyLgorICogKCJodG9ubCgpIiBvciAibnRvaGwoKSIgd29uJ3Qgd29yayAtIHdlIHdhbnQgdG8gYnl0ZS1zd2FwIGV2ZW4gb24KKyAqIGJpZy1lbmRpYW4gcGxhdGZvcm1zLikKKyAqLworI2RlZmluZQlTV0FQTE9ORyh5KSBcCisoKCgoeSkmMHhmZik8PDI0KSB8ICgoKHkpJjB4ZmYwMCk8PDgpIHwgKCgoeSkmMHhmZjAwMDApPj44KSB8ICgoKHkpPj4yNCkmMHhmZikpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbnVsbF9oZHJfcHJpbnQodV9pbnQgZmFtaWx5LCB1X2ludCBsZW5ndGgpCit7CisJaWYgKCFxZmxhZykgeworCQkodm9pZClwcmludGYoIkFGICVzICgldSkiLAorCQkJdG9rMnN0cihic2RfYWZfdmFsdWVzLCJVbmtub3duIixmYW1pbHkpLGZhbWlseSk7CisJfSBlbHNlIHsKKwkJKHZvaWQpcHJpbnRmKCIlcyIsCisJCQl0b2syc3RyKGJzZF9hZl92YWx1ZXMsIlVua25vd24gQUYgJXUiLGZhbWlseSkpOworCX0KKworCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBldGhlciBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgorICovCit1X2ludAorbnVsbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBsZW5ndGggPSBoLT5sZW47CisJdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCXVfaW50IGZhbWlseTsKKworCWlmIChjYXBsZW4gPCBOVUxMX0hEUkxFTikgeworCQlwcmludGYoIlt8bnVsbF0iKTsKKwkJcmV0dXJuIChOVUxMX0hEUkxFTik7CisJfQorCisJbWVtY3B5KChjaGFyICopJmZhbWlseSwgKGNoYXIgKilwLCBzaXplb2YoZmFtaWx5KSk7CisKKwkvKgorCSAqIFRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgaW4gb3VyIGhvc3QgYnl0ZSBvcmRlcjsgaWYgdGhpcyBpcworCSAqIGEgRExUX0xPT1AgY2FwdHVyZSwgaXQncyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIGFuZCBpZgorCSAqIHRoaXMgaXMgYSBETFRfTlVMTCBjYXB0dXJlIGZyb20gYSBtYWNoaW5lIHdpdGggdGhlIG9wcG9zaXRlCisJICogYnl0ZS1vcmRlciwgaXQncyBpbiB0aGUgb3Bwb3NpdGUgYnl0ZSBvcmRlciBmcm9tIG91cnMuCisJICoKKwkgKiBJZiB0aGUgdXBwZXIgMTYgYml0cyBhcmVuJ3QgYWxsIHplcm8sIGFzc3VtZSBpdCdzIGJ5dGUtc3dhcHBlZC4KKwkgKi8KKwlpZiAoKGZhbWlseSAmIDB4RkZGRjAwMDApICE9IDApCisJCWZhbWlseSA9IFNXQVBMT05HKGZhbWlseSk7CisKKwlpZiAoZWZsYWcpCisJCW51bGxfaGRyX3ByaW50KGZhbWlseSwgbGVuZ3RoKTsKKworCWxlbmd0aCAtPSBOVUxMX0hEUkxFTjsKKwljYXBsZW4gLT0gTlVMTF9IRFJMRU47CisJcCArPSBOVUxMX0hEUkxFTjsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisKKwljYXNlIEJTRF9BRk5VTV9JTkVUOgorCQlpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOworCQlicmVhazsKKworI2lmZGVmIElORVQ2CisJY2FzZSBCU0RfQUZOVU1fSU5FVDZfQlNEOgorCWNhc2UgQlNEX0FGTlVNX0lORVQ2X0ZSRUVCU0Q6CisJY2FzZSBCU0RfQUZOVU1fSU5FVDZfREFSV0lOOgorCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgQlNEX0FGTlVNX0lTTzoKKwkJaXNvY2xuc19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7CisJCWJyZWFrOworCisJY2FzZSBCU0RfQUZOVU1fQVBQTEVUQUxLOgorCQlhdGFsa19wcmludChwLCBsZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgQlNEX0FGTlVNX0lQWDoKKwkJaXB4X3ByaW50KHAsIGxlbmd0aCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogdW5rbm93biBBRl8gdmFsdWUgKi8KKwkJaWYgKCFlZmxhZykKKwkJCW51bGxfaGRyX3ByaW50KGZhbWlseSwgbGVuZ3RoICsgTlVMTF9IRFJMRU4pOworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfQorCisJcmV0dXJuIChOVUxMX0hEUkxFTik7Cit9CisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC1vbHNyLmMgYi9wcmludC1vbHNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0YTUxZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LW9sc3IuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBUQ1BEVU1QIHByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogT3B0aW1pemVkIExpbmsgU3RhdGUgUHJvdG9jbCAoT0xTUikgYXMgcGVyIHJmYzM2MjYKKyAqCisgKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCisjaW5jbHVkZSAiaXAuaCIKKworLyoKKyAqIFJGQyAzNjI2IGNvbW1vbiBoZWFkZXIKKyAqCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICBQYWNrZXQgTGVuZ3RoICAgICAgICAgfCAgICBQYWNrZXQgU2VxdWVuY2UgTnVtYmVyICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgTWVzc2FnZSBUeXBlIHwgICAgIFZ0aW1lICAgICB8ICAgICAgICAgTWVzc2FnZSBTaXplICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIE9yaWdpbmF0b3IgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgIFRpbWUgVG8gTGl2ZSB8ICAgSG9wIENvdW50ICAgfCAgICBNZXNzYWdlIFNlcXVlbmNlIE51bWJlciAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgIE1lc3NhZ2UgVHlwZSB8ICAgICBWdGltZSAgICAgfCAgICAgICAgIE1lc3NhZ2UgU2l6ZSAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hdG9yIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICBUaW1lIFRvIExpdmUgfCAgIEhvcCBDb3VudCAgIHwgICAgTWVzc2FnZSBTZXF1ZW5jZSBOdW1iZXIgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICovCisKK3N0cnVjdCBvbHNyX2NvbW1vbiB7CisgICAgdV9pbnQ4X3QgcGFja2V0X2xlblsyXTsKKyAgICB1X2ludDhfdCBwYWNrZXRfc2VxWzJdOworfTsKKworI2RlZmluZSBPTFNSX0hFTExPX01TRyAgICAgICAgIDEgLyogcmZjMzYyNiAqLworI2RlZmluZSBPTFNSX1RDX01TRyAgICAgICAgICAgIDIgLyogcmZjMzYyNiAqLworI2RlZmluZSBPTFNSX01JRF9NU0cgICAgICAgICAgIDMgLyogcmZjMzYyNiAqLworI2RlZmluZSBPTFNSX0hOQV9NU0cgICAgICAgICAgIDQgLyogcmZjMzYyNiAqLworI2RlZmluZSBPTFNSX1BPV0VSSU5GT19NU0cgICAxMjgKKyNkZWZpbmUgT0xTUl9OQU1FU0VSVklDRV9NU0cgMTMwCisjZGVmaW5lIE9MU1JfSEVMTE9fTFFfTVNHICAgIDIwMSAvKiBMUSBleHRlbnNpb25zIG9sc3Iub3JnICovCisjZGVmaW5lIE9MU1JfVENfTFFfTVNHICAgICAgIDIwMiAvKiBMUSBleHRlbnNpb25zIG9sc3Iub3JnICovCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIG9sc3JfbXNnX3ZhbHVlc1tdID0geworICAgIHsgT0xTUl9IRUxMT19NU0csICJIZWxsbyIgfSwKKyAgICB7IE9MU1JfVENfTVNHLCAiVEMiIH0sCisgICAgeyBPTFNSX01JRF9NU0csICJNSUQiIH0sCisgICAgeyBPTFNSX0hOQV9NU0csICJITkEiIH0sCisgICAgeyBPTFNSX1BPV0VSSU5GT19NU0csICJQb3dlcmluZm8iIH0sCisgICAgeyBPTFNSX05BTUVTRVJWSUNFX01TRywgIk5hbWVzZXJ2aWNlIiB9LAorICAgIHsgT0xTUl9IRUxMT19MUV9NU0csICJIZWxsby1MUSIgfSwKKyAgICB7IE9MU1JfVENfTFFfTVNHLCAiVEMtTFEiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RydWN0IG9sc3JfbXNnIHsKKyAgICB1X2ludDhfdCBtc2dfdHlwZTsKKyAgICB1X2ludDhfdCB2dGltZTsKKyAgICB1X2ludDhfdCBtc2dfbGVuWzJdOworICAgIHVfaW50OF90IG9yaWdpbmF0b3JbNF07CisgICAgdV9pbnQ4X3QgdHRsOworICAgIHVfaW50OF90IGhvcGNvdW50OworICAgIHVfaW50OF90IG1zZ19zZXFbMl07Cit9OworCitzdHJ1Y3Qgb2xzcl9oZWxsbyB7CisgICAgdV9pbnQ4X3QgcmVzWzJdOworICAgIHVfaW50OF90IGh0aW1lOworICAgIHVfaW50OF90IHdpbGw7Cit9OworCitzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rIHsKKyAgICB1X2ludDhfdCBsaW5rX2NvZGU7CisgICAgdV9pbnQ4X3QgcmVzOworICAgIHVfaW50OF90IGxlblsyXTsKK307CisKK3N0cnVjdCBvbHNyX3RjIHsKKyAgICB1X2ludDhfdCBhbnNfc2VxWzJdOworICAgIHVfaW50OF90IHJlc1syXTsKK307CisKK3N0cnVjdCBvbHNyX2huYSB7CisgICAgdV9pbnQ4X3QgbmV0d29ya1s0XTsKKyAgICB1X2ludDhfdCBtYXNrWzRdOworfTsKKworCisjZGVmaW5lIE9MU1JfRVhUUkFDVF9MSU5LX1RZUEUobGlua19jb2RlKSAobGlua19jb2RlICYgMHgzKQorI2RlZmluZSBPTFNSX0VYVFJBQ1RfTkVJR0hCT1JfVFlQRShsaW5rX2NvZGUpIChsaW5rX2NvZGUgPj4gMikKKworc3RhdGljIHN0cnVjdCB0b2sgb2xzcl9saW5rX3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyAwLCAiVW5zcGVjaWZpZWQiIH0sCisgICAgeyAxLCAiQXN5bW1ldHJpYyIgfSwKKyAgICB7IDIsICJTeW1tZXRyaWMiIH0sCisgICAgeyAzLCAiTG9zdCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBvbHNyX25laWdoYm9yX3R5cGVfdmFsdWVzW10gPSB7CisgICAgeyAwLCAiTm90LU5laWdoYm9yIiB9LAorICAgIHsgMSwgIlN5bW1ldHJpYyIgfSwKKyAgICB7IDIsICJTeW1tZXRyaWMtTVBSIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCBvbHNyX2xxX25laWdoYm9yIHsKKyAgICB1X2ludDhfdCBuZWlnaGJvcls0XTsKKyAgICB1X2ludDhfdCBsaW5rX3F1YWxpdHk7CisgICAgdV9pbnQ4X3QgbmVpZ2hib3JfbGlua19xdWFsaXR5OworICAgIHVfaW50OF90IHJlc1syXTsKK307CisKKy8qCisgKiBtYWNybyB0byBjb252ZXJ0IHRoZSA4LWJpdCBtYW50aXNzYS9leHBvbmVudCB0byBhIGRvdWJsZSBmbG9hdAorICogdGFrZW4gZnJvbSBvbHNyLm9yZy4KKyAqLworI2RlZmluZSBWVElNRV9TQ0FMRV9GQUNUT1IgICAgMC4wNjI1CisjZGVmaW5lIE1FX1RPX0RPVUJMRShtZSkgXAorICAoZG91YmxlKShWVElNRV9TQ0FMRV9GQUNUT1IqKDErKGRvdWJsZSkobWU+PjQpLzE2KSooZG91YmxlKSgxPDwobWUmMHgwRikpKQorCisvKgorICogcHJpbnQgYSBuZWlnaGJvciBsaXN0IHdpdGggTFEgZXh0ZW5zaW9ucy4KKyAqLworc3RhdGljIHZvaWQKK29sc3JfcHJpbnRfbHFfbmVpZ2hib3IgKGNvbnN0IHVfY2hhciAqbXNnX2RhdGEsIHVfaW50IGhlbGxvX2xlbikKK3sKKyAgICBzdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvciAqbHFfbmVpZ2hib3I7CisKKyAgICB3aGlsZSAoaGVsbG9fbGVuID49IHNpemVvZihzdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvcikpIHsKKworICAgICAgICBscV9uZWlnaGJvciA9IChzdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvciAqKW1zZ19kYXRhOworCisgICAgICAgIHByaW50ZigiXG5cdCAgICAgIG5laWdoYm9yICVzLCBsaW5rLXF1YWxpdHkgJS4ybGYlJSIKKyAgICAgICAgICAgICAgICIsIG5laWdoYm9yLWxpbmstcXVhbGl0eSAlLjJsZiUlIiwKKyAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcobHFfbmVpZ2hib3ItPm5laWdoYm9yKSwKKyAgICAgICAgICAgICAgICgoZG91YmxlKWxxX25laWdoYm9yLT5saW5rX3F1YWxpdHkvMi41NSksCisgICAgICAgICAgICAgICAoKGRvdWJsZSlscV9uZWlnaGJvci0+bmVpZ2hib3JfbGlua19xdWFsaXR5LzIuNTUpKTsKKworICAgICAgICBtc2dfZGF0YSArPSBzaXplb2Yoc3RydWN0IG9sc3JfbHFfbmVpZ2hib3IpOworICAgICAgICBoZWxsb19sZW4gLT0gc2l6ZW9mKHN0cnVjdCBvbHNyX2xxX25laWdoYm9yKTsKKyAgICB9Cit9CisKKy8qCisgKiBwcmludCBhIG5laWdoYm9yIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCitvbHNyX3ByaW50X25laWdoYm9yIChjb25zdCB1X2NoYXIgKm1zZ19kYXRhLCB1X2ludCBoZWxsb19sZW4pCit7CisgICAgaW50IG5laWdoYm9yOworCisgICAgcHJpbnRmKCJcblx0ICAgICAgbmVpZ2hib3Jcblx0XHQiKTsKKyAgICBuZWlnaGJvciA9IDE7CisKKyAgICB3aGlsZSAoaGVsbG9fbGVuID49IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKworICAgICAgICAvKiBwcmludCA0IG5laWdoYm9ycyBwZXIgbGluZSAqLworCisgICAgICAgIHByaW50ZigiJXMlcyIsIGlwYWRkcl9zdHJpbmcobXNnX2RhdGEpLAorICAgICAgICAgICAgICAgbmVpZ2hib3IgJSA0ID09IDAgPyAiXG5cdFx0IiA6ICIgIik7CisKKyAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKyAgICAgICAgaGVsbG9fbGVuIC09IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisgICAgfQorfQorCisKK3ZvaWQKK29sc3JfcHJpbnQgKGNvbnN0IHVfY2hhciAqcHB0ciwgdV9pbnQgbGVuZ3RoKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IG9sc3JfY29tbW9uICpjb21tb247CisgICAgICAgIGNvbnN0IHN0cnVjdCBvbHNyX21zZyAqbXNnOworICAgICAgICBjb25zdCBzdHJ1Y3Qgb2xzcl9oZWxsbyAqaGVsbG87CisgICAgICAgIGNvbnN0IHN0cnVjdCBvbHNyX2hlbGxvX2xpbmsgKmhlbGxvX2xpbms7CisgICAgICAgIGNvbnN0IHN0cnVjdCBvbHNyX2xxX25laWdoYm9yICpscV9uZWlnaGJvcjsKKyAgICAgICAgY29uc3Qgc3RydWN0IG9sc3JfdGMgKnRjOworICAgICAgICBjb25zdCBzdHJ1Y3Qgb2xzcl9obmEgKmhuYTsKKyAgICB9IHB0cjsKKworICAgIHVfaW50IG1zZ190eXBlLCBtc2dfbGVuLCBtc2dfdGxlbiwgaGVsbG9fbGVuLCBwcmVmaXg7CisgICAgdV9pbnQ4X3QgbGlua190eXBlLCBuZWlnaGJvcl90eXBlOworICAgIGNvbnN0IHVfY2hhciAqdHB0ciwgKm1zZ19kYXRhOworCisgICAgdHB0ciA9IHBwdHI7IAorCisgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgb2xzcl9jb21tb24pKSB7CisgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgfQorCisgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHNpemVvZihzdHJ1Y3Qgb2xzcl9jb21tb24pKSkgeworCWdvdG8gdHJ1bmM7CisgICAgfQorCisgICAgcHRyLmNvbW1vbiA9IChzdHJ1Y3Qgb2xzcl9jb21tb24gKil0cHRyOworICAgIGxlbmd0aCA9IE1JTihsZW5ndGgsIEVYVFJBQ1RfMTZCSVRTKHB0ci5jb21tb24tPnBhY2tldF9sZW4pKTsKKworICAgIHByaW50ZigiT0xTUiwgc2VxIDB4JTA0eCwgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocHRyLmNvbW1vbi0+cGFja2V0X3NlcSksCisgICAgICAgICAgIGxlbmd0aCk7CisKKyAgICB0cHRyICs9IHNpemVvZihzdHJ1Y3Qgb2xzcl9jb21tb24pOworCisgICAgLyoKKyAgICAgKiBJbiBub24tdmVyYm9zZSBtb2RlLCBqdXN0IHByaW50IHZlcnNpb24uCisgICAgICovCisgICAgaWYgKHZmbGFnIDwgMSkgeworCXJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAodHB0ciA8IChwcHRyK2xlbmd0aCkpIHsKKworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBvbHNyX21zZykpKQkKKyAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgcHRyLm1zZyA9IChzdHJ1Y3Qgb2xzcl9tc2cgKil0cHRyOworCisgICAgICAgIG1zZ190eXBlID0gcHRyLm1zZy0+bXNnX3R5cGU7CisgICAgICAgIG1zZ19sZW4gPSBFWFRSQUNUXzE2QklUUyhwdHIubXNnLT5tc2dfbGVuKTsKKworICAgICAgICAvKiBpbmZpbml0ZSBsb29wIGNoZWNrICovCisgICAgICAgIGlmIChtc2dfdHlwZSA9PSAwIHx8IG1zZ19sZW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJcblx0JXMgTWVzc2FnZSAoJXUpLCBvcmlnaW5hdG9yICVzLCB0dGwgJXUsIGhvcCAldSIKKyAgICAgICAgICAgICAgICJcblx0ICB2dGltZSAlLjNsZnMsIG1zZy1zZXEgMHglMDR4LCBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihvbHNyX21zZ192YWx1ZXMsICJVbmtub3duIiwgbXNnX3R5cGUpLAorICAgICAgICAgICAgICAgbXNnX3R5cGUsIGlwYWRkcl9zdHJpbmcocHRyLm1zZy0+b3JpZ2luYXRvciksCisgICAgICAgICAgICAgICBwdHIubXNnLT50dGwsCisgICAgICAgICAgICAgICBwdHIubXNnLT5ob3Bjb3VudCwKKyAgICAgICAgICAgICAgIE1FX1RPX0RPVUJMRShwdHIubXNnLT52dGltZSksCisgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhwdHIubXNnLT5tc2dfc2VxKSwKKyAgICAgICAgICAgICAgIG1zZ19sZW4pOworCisgICAgICAgIG1zZ190bGVuID0gbXNnX2xlbiAtIHNpemVvZihzdHJ1Y3Qgb2xzcl9tc2cpOworICAgICAgICBtc2dfZGF0YSA9IHRwdHIgKyBzaXplb2Yoc3RydWN0IG9sc3JfbXNnKTsKKworICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKSB7CisgICAgICAgIGNhc2UgT0xTUl9IRUxMT19NU0c6CisgICAgICAgIGNhc2UgT0xTUl9IRUxMT19MUV9NU0c6CisgICAgICAgICAgICBpZiAoIVRURVNUMigqbXNnX2RhdGEsIHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsbykpKQkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgICAgICBwdHIuaGVsbG8gPSAoc3RydWN0IG9sc3JfaGVsbG8gKiltc2dfZGF0YTsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgaGVsbG8tdGltZSAlLjNsZnMsIE1QUiB3aWxsaW5nbmVzcyAldSIsCisgICAgICAgICAgICAgICAgICAgTUVfVE9fRE9VQkxFKHB0ci5oZWxsby0+aHRpbWUpLCBwdHIuaGVsbG8tPndpbGwpOworICAgICAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvbHNyX2hlbGxvKTsKKyAgICAgICAgICAgIG1zZ190bGVuIC09IHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsbyk7CisKKyAgICAgICAgICAgIHdoaWxlIChtc2dfdGxlbiA+PSBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG9fbGluaykpIHsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogbGluay10eXBlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCptc2dfZGF0YSwgc2l6ZW9mKHN0cnVjdCBvbHNyX2hlbGxvX2xpbmspKSkJCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgICAgICAgICBwdHIuaGVsbG9fbGluayA9IChzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rICopbXNnX2RhdGE7CisKKyAgICAgICAgICAgICAgICBoZWxsb19sZW4gPSBFWFRSQUNUXzE2QklUUyhwdHIuaGVsbG9fbGluay0+bGVuKTsKKyAgICAgICAgICAgICAgICBsaW5rX3R5cGUgPSBPTFNSX0VYVFJBQ1RfTElOS19UWVBFKHB0ci5oZWxsb19saW5rLT5saW5rX2NvZGUpOworICAgICAgICAgICAgICAgIG5laWdoYm9yX3R5cGUgPSBPTFNSX0VYVFJBQ1RfTkVJR0hCT1JfVFlQRShwdHIuaGVsbG9fbGluay0+bGlua19jb2RlKTsKKworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBsaW5rLXR5cGUgJXMsIG5laWdoYm9yLXR5cGUgJXMsIGxlbiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIob2xzcl9saW5rX3R5cGVfdmFsdWVzLCAiVW5rbm93biIsIGxpbmtfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIob2xzcl9uZWlnaGJvcl90eXBlX3ZhbHVlcywgIlVua25vd24iLCBuZWlnaGJvcl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVsbG9fbGVuKTsKKworICAgICAgICAgICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rKTsKKyAgICAgICAgICAgICAgICBtc2dfdGxlbiAtPSBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG9fbGluayk7CisgICAgICAgICAgICAgICAgaGVsbG9fbGVuIC09IHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rKTsKKworICAgICAgICAgICAgICAgIGlmIChtc2dfdHlwZSA9PSBPTFNSX0hFTExPX01TRykgeworICAgICAgICAgICAgICAgICAgICBvbHNyX3ByaW50X25laWdoYm9yKG1zZ19kYXRhLCBoZWxsb19sZW4pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9sc3JfcHJpbnRfbHFfbmVpZ2hib3IobXNnX2RhdGEsIGhlbGxvX2xlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXNnX2RhdGEgKz0gaGVsbG9fbGVuOworICAgICAgICAgICAgICAgIG1zZ190bGVuIC09IGhlbGxvX2xlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT0xTUl9UQ19NU0c6CisgICAgICAgIGNhc2UgT0xTUl9UQ19MUV9NU0c6CisgICAgICAgICAgICBpZiAoIVRURVNUMigqbXNnX2RhdGEsIHNpemVvZihzdHJ1Y3Qgb2xzcl90YykpKQkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgICAgICBwdHIudGMgPSAoc3RydWN0IG9sc3JfdGMgKiltc2dfZGF0YTsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBhZHZlcnRpc2VkIG5laWdoYm9yIHNlcSAweCUwNHgiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHB0ci50Yy0+YW5zX3NlcSkpOworICAgICAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvbHNyX3RjKTsKKyAgICAgICAgICAgIG1zZ190bGVuIC09IHNpemVvZihzdHJ1Y3Qgb2xzcl90Yyk7CisKKyAgICAgICAgICAgIGlmIChtc2dfdHlwZSA9PSBPTFNSX1RDX01TRykgeworICAgICAgICAgICAgICAgIG9sc3JfcHJpbnRfbmVpZ2hib3IobXNnX2RhdGEsIG1zZ190bGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2xzcl9wcmludF9scV9uZWlnaGJvcihtc2dfZGF0YSwgbXNnX3RsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPTFNSX01JRF9NU0c6CisgICAgICAgICAgICBpZiAoIVRURVNUMigqbXNnX2RhdGEsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgICAgICB3aGlsZSAobXNnX3RsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgaW50ZXJmYWNlIGFkZHJlc3MgJXMiLCBpcGFkZHJfc3RyaW5nKG1zZ19kYXRhKSk7CisgICAgICAgICAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKyAgICAgICAgICAgICAgICBtc2dfdGxlbiAtPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPTFNSX0hOQV9NU0c6CisgICAgICAgICAgICBwcmVmaXggPSAxOworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBhZHZlcnRpc2VkIG5ldHdvcmtzXG5cdCAgICAiKTsKKyAgICAgICAgICAgIHdoaWxlIChtc2dfdGxlbiA+PSBzaXplb2Yoc3RydWN0IG9sc3JfaG5hKSkgeworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCptc2dfZGF0YSwgc2l6ZW9mKHN0cnVjdCBvbHNyX2huYSkpKQkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKworICAgICAgICAgICAgICAgIHB0ci5obmEgPSAoc3RydWN0IG9sc3JfaG5hICopbXNnX2RhdGE7CisKKyAgICAgICAgICAgICAgICAvKiBwcmludCA0IHByZWZpeGVzIHBlciBsaW5lICovCisKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzLyV1JXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHB0ci5obmEtPm5ldHdvcmspLAorICAgICAgICAgICAgICAgICAgICAgICBtYXNrMnBsZW4oRVhUUkFDVF8zMkJJVFMocHRyLmhuYS0+bWFzaykpLCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCAlIDQgPT0gMCA/ICJcblx0ICAgICIgOiAiICIpOworCisgICAgICAgICAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvbHNyX2huYSk7CisgICAgICAgICAgICAgICAgbXNnX3RsZW4gLT0gc2l6ZW9mKHN0cnVjdCBvbHNyX2huYSk7CisgICAgICAgICAgICAgICAgcHJlZml4ICsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgbWVzc2FnZXMgdGhhdCBsYWNrIGEgZGVjb2RlcgorICAgICAgICAgICAgICogeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKKyAgICAgICAgICAgICAqLworCisgICAgICAgIGNhc2UgT0xTUl9QT1dFUklORk9fTVNHOgorICAgICAgICBjYXNlIE9MU1JfTkFNRVNFUlZJQ0VfTVNHOgorICAgICAgICBkZWZhdWx0OgorCSAgICBwcmludF91bmtub3duX2RhdGEobXNnX2RhdGEsICJcblx0ICAgICIsIG1zZ190bGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CQorICAgICAgICB0cHRyICs9IG1zZ19sZW47CisgICAgfQorCisgICAgcmV0dXJuOworCisgdHJ1bmM6CisgICAgcHJpbnRmKCJbfG9sc3JdIik7Cit9CisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC1vc3BmLmMgYi9wcmludC1vc3BmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4ZjExMQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LW9zcGYuYwpAQCAtMCwwICsxLDk2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9TUEYgc3VwcG9ydCBjb250cmlidXRlZCBieSBKZWZmcmV5IEhvbmlnIChqY2hAbWl0Y2hlbGwuY2l0LmNvcm5lbGwuZWR1KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW9zcGYuYyx2IDEuNTYuMi40IDIwMDYvMTIvMTMgMDg6MjQ6MjcgaGFubmVzIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAiZ21wbHMuaCIKKworI2luY2x1ZGUgIm9zcGYuaCIKKworI2luY2x1ZGUgImlwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIG9zcGZfb3B0aW9uX3ZhbHVlc1tdID0geworCXsgT1NQRl9PUFRJT05fVCwJIlRPUyIgfSwKKwl7IE9TUEZfT1BUSU9OX0UsCSJFeHRlcm5hbCIgfSwKKwl7IE9TUEZfT1BUSU9OX01DLAkiTXVsdGljYXN0IiB9LAorCXsgT1NQRl9PUFRJT05fTlAsCSJOU1NBIiB9LAorCXsgT1NQRl9PUFRJT05fRUEsCSJBZHZlcnRpc2UgRXh0ZXJuYWwiIH0sCisJeyBPU1BGX09QVElPTl9EQywJIkRlbWFuZCBDaXJjdWl0IiB9LAorCXsgT1NQRl9PUFRJT05fTywJIk9wYXF1ZSIgfSwKKwl7IE9TUEZfT1BUSU9OX0ROLAkiVXAvRG93biIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBvc3BmX2F1dGh0eXBlX3ZhbHVlc1tdID0geworCXsgT1NQRl9BVVRIX05PTkUsCSJub25lIiB9LAorCXsgT1NQRl9BVVRIX1NJTVBMRSwJInNpbXBsZSIgfSwKKwl7IE9TUEZfQVVUSF9NRDUsCSJNRDUiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgb3NwZl9ybGFfZmxhZ192YWx1ZXNbXSA9IHsKKwl7IFJMQV9GTEFHX0IsCQkiQUJSIiB9LAorCXsgUkxBX0ZMQUdfRSwJCSJBU0JSIiB9LAorCXsgUkxBX0ZMQUdfVzEsCQkiVmlydHVhbCIgfSwKKwl7IFJMQV9GTEFHX1cyLAkJIlcyIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7CisJeyBPU1BGX1RZUEVfVU1ELAkiVU1EIiB9LAorCXsgT1NQRl9UWVBFX0hFTExPLAkiSGVsbG8iIH0sCisJeyBPU1BGX1RZUEVfREQsCQkiRGF0YWJhc2UgRGVzY3JpcHRpb24iIH0sCisJeyBPU1BGX1RZUEVfTFNfUkVRLAkiTFMtUmVxdWVzdCIgfSwKKwl7IE9TUEZfVFlQRV9MU19VUERBVEUsCSJMUy1VcGRhdGUiIH0sCisJeyBPU1BGX1RZUEVfTFNfQUNLLAkiTFMtQWNrIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGxzYV92YWx1ZXNbXSA9IHsKKwl7IExTX1RZUEVfUk9VVEVSLCAgICAgICAiUm91dGVyIiB9LAorCXsgTFNfVFlQRV9ORVRXT1JLLCAgICAgICJOZXR3b3JrIiB9LAorCXsgTFNfVFlQRV9TVU1fSVAsICAgICAgICJTdW1tYXJ5IiB9LAorCXsgTFNfVFlQRV9TVU1fQUJSLCAgICAgICJBU0JSIFN1bW1hcnkiIH0sCisJeyBMU19UWVBFX0FTRSwgICAgICAgICAgIkV4dGVybmFsIiB9LAorCXsgTFNfVFlQRV9HUk9VUCwgICAgICAgICJNdWx0aWNhc3QgR3JvdXAiIH0sCisJeyBMU19UWVBFX05TU0EsICAgICAgICAgIk5TU0EiIH0sCisJeyBMU19UWVBFX09QQVFVRV9MTCwgICAgIkxpbmsgTG9jYWwgT3BhcXVlIiB9LAorCXsgTFNfVFlQRV9PUEFRVUVfQUwsICAgICJBcmVhIExvY2FsIE9wYXF1ZSIgfSwKKwl7IExTX1RZUEVfT1BBUVVFX0RXLCAgICAiRG9tYWluIFdpZGUgT3BhcXVlIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIG9zcGZfZGRfZmxhZ192YWx1ZXNbXSA9IHsKKwl7IE9TUEZfREJfSU5JVCwJICAgICAgICAiSW5pdCIgfSwKKwl7IE9TUEZfREJfTU9SRSwJICAgICAgICAiTW9yZSIgfSwKKwl7IE9TUEZfREJfTUFTVEVSLAkiTWFzdGVyIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfdmFsdWVzW10gPSB7CisJeyBMU19PUEFRVUVfVFlQRV9URSwgICAgIlRyYWZmaWMgRW5naW5lZXJpbmciIH0sCisJeyBMU19PUEFRVUVfVFlQRV9HUkFDRSwgIkdyYWNlZnVsIHJlc3RhcnQiIH0sCisJeyBMU19PUEFRVUVfVFlQRV9SSSwgICAgIlJvdXRlciBJbmZvcm1hdGlvbiIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBsc2Ffb3BhcXVlX3RlX3Rsdl92YWx1ZXNbXSA9IHsKKwl7IExTX09QQVFVRV9URV9UTFZfUk9VVEVSLCAiUm91dGVyIEFkZHJlc3MiIH0sCisJeyBMU19PUEFRVUVfVEVfVExWX0xJTkssICAgIkxpbmsiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgbHNhX29wYXF1ZV90ZV9saW5rX3Rsdl9zdWJ0bHZfdmFsdWVzW10gPSB7CisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFLCAgICAgICAgICAgICJMaW5rIFR5cGUiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19JRCwgICAgICAgICAgICAgICJMaW5rIElEIiB9LAorCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xPQ0FMX0lQLCAgICAgICAgICAgICAiTG9jYWwgSW50ZXJmYWNlIElQIGFkZHJlc3MiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfUkVNT1RFX0lQLCAgICAgICAgICAgICJSZW1vdGUgSW50ZXJmYWNlIElQIGFkZHJlc3MiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfVEVfTUVUUklDLCAgICAgICAgICAgICJUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyIgfSwKKwl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9NQVhfQlcsICAgICAgICAgICAgICAgIk1heGltdW0gQmFuZHdpZHRoIiB9LAorCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX01BWF9SRVNfQlcsICAgICAgICAgICAiTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCIgfSwKKwl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9VTlJFU19CVywgICAgICAgICAgICAgIlVucmVzZXJ2ZWQgQmFuZHdpZHRoIiB9LAorCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0FETUlOX0dST1VQLCAgICAgICAgICAiQWRtaW5pc3RyYXRpdmUgR3JvdXAiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19MT0NBTF9SRU1PVEVfSUQsICJMaW5rIExvY2FsL1JlbW90ZSBJZGVudGlmaWVyIiB9LAorCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfUFJPVEVDVElPTl9UWVBFLCAiTGluayBQcm90ZWN0aW9uIFR5cGUiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfSU5URl9TV19DQVBfREVTQ1IsICAgICJJbnRlcmZhY2UgU3dpdGNoaW5nIENhcGFiaWxpdHkiIH0sCisJeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfU0hBUkVEX1JJU0tfR1JPVVAsICAgICJTaGFyZWQgUmlzayBMaW5rIEdyb3VwIiB9LAorCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0JXX0NPTlNUUkFJTlRTLCAgICAgICAiQmFuZHdpZHRoIENvbnN0cmFpbnRzIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfZ3JhY2VfdGx2X3ZhbHVlc1tdID0geworCXsgTFNfT1BBUVVFX0dSQUNFX1RMVl9QRVJJT0QsICAgICAgICAgICAgICJHcmFjZSBQZXJpb2QiIH0sCisJeyBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTiwgICAgICAgICAgICAgIkdyYWNlZnVsIHJlc3RhcnQgUmVhc29uIiB9LAorCXsgTFNfT1BBUVVFX0dSQUNFX1RMVl9JTlRfQUREUkVTUywgICAgICAgICJJUHY0IGludGVyZmFjZSBhZGRyZXNzIiB9LAorCXsgMCwJCSAgICAgICAgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBsc2Ffb3BhcXVlX2dyYWNlX3Rsdl9yZWFzb25fdmFsdWVzW10gPSB7CisJeyBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9VTktOT1dOLCAgICAgIlVua25vd24iIH0sCisJeyBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9TV19SRVNUQVJULCAgIlNvZnR3YXJlIFJlc3RhcnQiIH0sCisJeyBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9TV19VUEdSQURFLCAgIlNvZnR3YXJlIFJlbG9hZC9VcGdyYWRlIiB9LAorCXsgTFNfT1BBUVVFX0dSQUNFX1RMVl9SRUFTT05fQ1BfU1dJVENILCAgICJDb250cm9sIFByb2Nlc3NvciBTd2l0Y2giIH0sCisJeyAwLAkJICAgICAgICBOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfdGVfdGx2X2xpbmtfdHlwZV9zdWJfdGx2X3ZhbHVlc1tdID0geworCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfVFlQRV9QVFAsICJQb2ludC10by1wb2ludCIgfSwKKwl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEVfTUEsICAiTXVsdGktQWNjZXNzIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfcmlfdGx2X3ZhbHVlc1tdID0geworCXsgTFNfT1BBUVVFX1JJX1RMVl9DQVAsICJSb3V0ZXIgQ2FwYWJpbGl0aWVzIiB9LAorCXsgMCwJCSAgICAgICAgTlVMTCB9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBsc2Ffb3BhcXVlX3JpX3Rsdl9jYXBfdmFsdWVzW10gPSB7CisJeyAxLCAiUmVzZXJ2ZWQiIH0sCisJeyAyLCAiUmVzZXJ2ZWQiIH0sCisJeyA0LCAiUmVzZXJ2ZWQiIH0sCisJeyA4LCAiUmVzZXJ2ZWQiIH0sCisJeyAxNiwgImdyYWNlZnVsIHJlc3RhcnQgY2FwYWJsZSIgfSwKKwl7IDMyLCAiZ3JhY2VmdWwgcmVzdGFydCBoZWxwZXIiIH0sCisJeyA2NCwgIlN0dWIgcm91dGVyIHN1cHBvcnQiIH0sCisJeyAxMjgsICJUcmFmZmljIGVuZ2luZWVyaW5nIiB9LAorCXsgMjU2LCAicDJwIG92ZXIgTEFOIiB9LAorCXsgNTEyLCAicGF0aCBjb21wdXRhdGlvbiBzZXJ2ZXIiIH0sCisJeyAwLAkJICAgICAgICBOVUxMIH0KK307CisKK3N0YXRpYyBjaGFyIHRzdHJbXSA9ICIgW3xvc3BmXSI7CisKKyNpZmRlZiBXSU4zMgorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZiAvKiBXSU4zMiAqLworCitzdGF0aWMgaW50IG9zcGZfcHJpbnRfbHNoZHIoY29uc3Qgc3RydWN0IGxzYV9oZHIgKik7CitzdGF0aWMgY29uc3QgdV9jaGFyICpvc3BmX3ByaW50X2xzYShjb25zdCBzdHJ1Y3QgbHNhICopOworc3RhdGljIGludCBvc3BmX2RlY29kZV92Mihjb25zdCBzdHJ1Y3Qgb3NwZmhkciAqLCBjb25zdCB1X2NoYXIgKik7CisKK3N0YXRpYyBpbnQKK29zcGZfcHJpbnRfbHNoZHIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYV9oZHIgKmxzaHApCit7CisgICAgICAgIHVfaW50IGxzX2xlbmd0aDsKKworICAgICAgICBUQ0hFQ0sobHNocC0+bHNfbGVuZ3RoKTsKKyAgICAgICAgbHNfbGVuZ3RoID0gRVhUUkFDVF8xNkJJVFMoJmxzaHAtPmxzX2xlbmd0aCk7CisgICAgICAgIGlmIChsc19sZW5ndGggPCBzaXplb2Yoc3RydWN0IGxzYV9oZHIpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSA8ICVsdSIsIGxzX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHN0cnVjdCBsc2FfaGRyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIFRDSEVDSyhsc2hwLT5sc19zZXEpOwkvKiBYWFggLSBsc19sZW5ndGggY2hlY2sgY2hlY2tlZCB0aGlzICovCisJcHJpbnRmKCJcblx0ICBBZHZlcnRpc2luZyBSb3V0ZXI6ICVzLCBzZXEgMHglMDh4LCBhZ2UgJXVzLCBsZW5ndGg6ICV1IiwKKwkgICAgICAgaXBhZGRyX3N0cmluZygmbHNocC0+bHNfcm91dGVyKSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmxzaHAtPmxzX3NlcSksCisJICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsc2hwLT5sc19hZ2UpLAorICAgICAgICAgICAgICAgbHNfbGVuZ3RoLSh1X2ludClzaXplb2Yoc3RydWN0IGxzYV9oZHIpKTsKKworCVRDSEVDSyhsc2hwLT5sc190eXBlKTsJLyogWFhYIC0gbHNfbGVuZ3RoIGNoZWNrIGNoZWNrZWQgdGhpcyAqLworICAgICAgICBzd2l0Y2ggKGxzaHAtPmxzX3R5cGUpIHsKKwkvKiB0aGUgTFNBIGhlYWRlciBmb3Igb3BhcXVlIExTQXMgd2FzIHNsaWdodGx5IGNoYW5nZWQgKi8KKyAgICAgICAgY2FzZSBMU19UWVBFX09QQVFVRV9MTDoKKyAgICAgICAgY2FzZSBMU19UWVBFX09QQVFVRV9BTDoKKyAgICAgICAgY2FzZSBMU19UWVBFX09QQVFVRV9EVzoKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBMU0EgKCVkKSwgT3BhcXVlLVR5cGU6ICVzIExTQSAoJXUpLCBPcGFxdWUtSUQ6ICV1IiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV92YWx1ZXMsInVua25vd24iLGxzaHAtPmxzX3R5cGUpLAorICAgICAgICAgICAgICAgICAgIGxzaHAtPmxzX3R5cGUsCisKKwkJICAgdG9rMnN0cihsc2Ffb3BhcXVlX3ZhbHVlcywKKwkJCSAgICJ1bmtub3duIiwKKwkJCSAgICooJmxzaHAtPnVuX2xzYV9pZC5vcGFxdWVfZmllbGQub3BhcXVlX3R5cGUpKSwKKwkJICAgKigmbHNocC0+dW5fbHNhX2lkLm9wYXF1ZV9maWVsZC5vcGFxdWVfdHlwZSksCisJCSAgIEVYVFJBQ1RfMjRCSVRTKCZsc2hwLT51bl9sc2FfaWQub3BhcXVlX2ZpZWxkLm9wYXF1ZV9pZCkKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CisKKwkvKiBhbGwgb3RoZXIgTFNBIHR5cGVzIHVzZSByZWd1bGFyIHN0eWxlIExTQSBoZWFkZXJzICovCisJZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBMU0EgKCVkKSwgTFNBLUlEOiAlcyIsCisgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2FfdmFsdWVzLCJ1bmtub3duIixsc2hwLT5sc190eXBlKSwKKyAgICAgICAgICAgICAgICAgICBsc2hwLT5sc190eXBlLAorICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcoJmxzaHAtPnVuX2xzYV9pZC5sc2FfaWQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKwlUQ0hFQ0sobHNocC0+bHNfb3B0aW9ucyk7CS8qIFhYWCAtIGxzX2xlbmd0aCBjaGVjayBjaGVja2VkIHRoaXMgKi8KKyAgICAgICAgcHJpbnRmKCJcblx0ICAgIE9wdGlvbnM6IFslc10iLCBiaXR0b2syc3RyKG9zcGZfb3B0aW9uX3ZhbHVlcywibm9uZSIsbHNocC0+bHNfb3B0aW9ucykpOworCisgICAgICAgIHJldHVybiAobHNfbGVuZ3RoKTsKK3RydW5jOgorCXJldHVybiAoLTEpOworfQorCisvKgorICogUHJpbnQgYSBzaW5nbGUgbGluayBzdGF0ZSBhZHZlcnRpc2VtZW50LiAgSWYgdHJ1bmNhdGVkIG9yIGlmIExTQSBsZW5ndGgKKyAqIGZpZWxkIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBMU0EgaGVhZGVyLCByZXR1cm4gTlVMbCwgZWxzZQorICogcmV0dXJuIHBvaW50ZXIgdG8gZGF0YSBwYXN0IGVuZCBvZiBMU0EuCisgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCAqCitvc3BmX3ByaW50X2xzYShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhICpsc2FwKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfaW50OF90ICpsc19lbmQ7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJsYWxpbmsgKnJscDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9zX21ldHJpYyAqdG9zcDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYXA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGFzbGFtZXRyaWMgKmFsbXA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1jbGEgKm1jcDsKKwlyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmxwOworCXJlZ2lzdGVyIGludCBqLCBrLCB0bHZfdHlwZSwgdGx2X2xlbmd0aCwgc3VidGx2X3R5cGUsIHN1YnRsdl9sZW5ndGgsIHByaW9yaXR5X2xldmVsLCB0ZV9jbGFzczsKKwlyZWdpc3RlciBpbnQgbHNfbGVuZ3RoOworCWNvbnN0IHVfaW50OF90ICp0cHRyOworCWludCBjb3VudF9zcmxnOworICAgICAgICB1bmlvbiB7IC8qIGludCB0byBmbG9hdCBjb252ZXJzaW9uIGJ1ZmZlciBmb3Igc2V2ZXJhbCBzdWJUTFZzICovCisgICAgICAgICAgICBmbG9hdCBmOyAKKyAgICAgICAgICAgIHVfaW50MzJfdCBpOworICAgICAgICB9IGJ3OworCisJdHB0ciA9ICh1X2ludDhfdCAqKWxzYXAtPmxzYV91bi51bl91bmtub3duOyAvKiBzcXVlbGNoIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgICAgIGxzX2xlbmd0aCA9IG9zcGZfcHJpbnRfbHNoZHIoJmxzYXAtPmxzX2hkcik7CisgICAgICAgIGlmIChsc19sZW5ndGggPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuKE5VTEwpOworCWxzX2VuZCA9ICh1X2ludDhfdCAqKWxzYXAgKyBsc19sZW5ndGg7CisJbHNfbGVuZ3RoIC09IHNpemVvZihzdHJ1Y3QgbHNhX2hkcik7CisKKwlzd2l0Y2ggKGxzYXAtPmxzX2hkci5sc190eXBlKSB7CisKKwljYXNlIExTX1RZUEVfUk9VVEVSOgorCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfZmxhZ3MpOworICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBSb3V0ZXIgTFNBIE9wdGlvbnM6IFslc10iLCBiaXR0b2syc3RyKG9zcGZfcmxhX2ZsYWdfdmFsdWVzLCJub25lIixsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9mbGFncykpOworCisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9jb3VudCk7CisJCWogPSBFWFRSQUNUXzE2QklUUygmbHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfY291bnQpOworCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfbGluayk7CisJCXJscCA9IGxzYXAtPmxzYV91bi51bl9ybGEucmxhX2xpbms7CisJCXdoaWxlIChqLS0pIHsKKwkJCVRDSEVDSygqcmxwKTsKKwkJCXN3aXRjaCAocmxwLT5saW5rX3R5cGUpIHsKKworCQkJY2FzZSBSTEFfVFlQRV9WSVJUVUFMOgorCQkJCXByaW50ZigiXG5cdCAgICAgIFZpcnR1YWwgTGluazogTmVpZ2hib3IgUm91dGVyLUlEOiAlcywgSW50ZXJmYWNlIEFkZHJlc3M6ICVzIiwKKwkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2lkKSwKKwkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2RhdGEpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQljYXNlIFJMQV9UWVBFX1JPVVRFUjoKKwkJCQlwcmludGYoIlxuXHQgICAgICBOZWlnaGJvciBSb3V0ZXItSUQ6ICVzLCBJbnRlcmZhY2UgQWRkcmVzczogJXMiLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfaWQpLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfZGF0YSkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFJMQV9UWVBFX1RSQU5TSVQ6CisJCQkJcHJpbnRmKCJcblx0ICAgICAgTmVpZ2hib3IgTmV0d29yay1JRDogJXMsIEludGVyZmFjZSBBZGRyZXNzOiAlcyIsCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19pZCksCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19kYXRhKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkxBX1RZUEVfU1RVQjoKKwkJCQlwcmludGYoIlxuXHQgICAgICBTdHViIE5ldHdvcms6ICVzLCBNYXNrOiAlcyIsCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19pZCksCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19kYXRhKSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCJcblx0ICAgICAgVW5rbm93biBSb3V0ZXIgTGluayBUeXBlICgldSkiLAorCQkJCSAgICBybHAtPmxpbmtfdHlwZSk7CisJCQkJcmV0dXJuIChsc19lbmQpOworCQkJfQorCQkJcHJpbnRmKCIsIHRvcyAwLCBtZXRyaWM6ICVkIiwgRVhUUkFDVF8xNkJJVFMoJnJscC0+bGlua190b3MwbWV0cmljKSk7CisJCQl0b3NwID0gKHN0cnVjdCB0b3NfbWV0cmljICopCisJCQkgICAgKChzaXplb2YgcmxwLT5saW5rX3RvczBtZXRyaWMpICsgKHVfY2hhciAqKSBybHApOworCQkJZm9yIChrID0gMDsgayA8IChpbnQpIHJscC0+bGlua190b3Njb3VudDsgKytrLCArK3Rvc3ApIHsKKwkJCQlUQ0hFQ0soKnRvc3ApOworCQkJCXByaW50ZigiLCB0b3MgJWQsIG1ldHJpYzogJWQiLAorCQkJCSAgICB0b3NwLT50b3NfdHlwZSwKKwkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJnRvc3AtPnRvc19tZXRyaWMpKTsKKwkJCX0KKwkJCXJscCA9IChzdHJ1Y3QgcmxhbGluayAqKSgodV9jaGFyICopKHJscCArIDEpICsKKwkJCSAgICAoKHJscC0+bGlua190b3Njb3VudCkgKiBzaXplb2YoKnRvc3ApKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfTkVUV09SSzoKKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9ubGEubmxhX21hc2spOworCQlwcmludGYoIlxuXHQgICAgTWFzayAlc1xuXHQgICAgQ29ubmVjdGVkIFJvdXRlcnM6IiwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmxzYXAtPmxzYV91bi51bl9ubGEubmxhX21hc2spKTsKKwkJYXAgPSBsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9yb3V0ZXI7CisJCXdoaWxlICgodV9jaGFyICopYXAgPCBsc19lbmQpIHsKKwkJCVRDSEVDSygqYXApOworCQkJcHJpbnRmKCJcblx0ICAgICAgJXMiLCBpcGFkZHJfc3RyaW5nKGFwKSk7CisJCQkrK2FwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMU19UWVBFX1NVTV9JUDoKKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9ubGEubmxhX21hc2spOworCQlwcmludGYoIlxuXHQgICAgTWFzayAlcyIsCisJCSAgICBpcGFkZHJfc3RyaW5nKCZsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV9tYXNrKSk7CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV90b3NtZXRyaWMpOworCQlscCA9IGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYzsKKyAgICAgICAgICAgICAgICAvKiBzdXBwcmVzcyB0b3MgaWYgaXRzIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgICAgICBpZighKChsc2FwLT5sc19oZHIubHNfb3B0aW9ucykmT1NQRl9PUFRJT05fVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIG1ldHJpYzogJXUiLCBFWFRSQUNUXzMyQklUUyhscCkmU0xBX01BU0tfTUVUUklDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCQl3aGlsZSAoKHVfY2hhciAqKWxwIDwgbHNfZW5kKSB7CisJCQlyZWdpc3RlciB1X2ludDMyX3QgdWw7CisKKwkJCVRDSEVDSygqbHApOworCQkJdWwgPSBFWFRSQUNUXzMyQklUUyhscCk7CisJCQlwcmludGYoIiwgdG9zICVkIG1ldHJpYyAlZCIsCisJCQkgICAgKHVsICYgU0xBX01BU0tfVE9TKSA+PiBTTEFfU0hJRlRfVE9TLAorCQkJICAgIHVsICYgU0xBX01BU0tfTUVUUklDKTsKKwkJCSsrbHA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfU1VNX0FCUjoKKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYyk7CisJCWxwID0gbHNhcC0+bHNhX3VuLnVuX3NsYS5zbGFfdG9zbWV0cmljOworICAgICAgICAgICAgICAgIC8qIHN1cHByZXNzIHRvcyBpZiBpdHMgbm90IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgICAgIGlmKCEoKGxzYXAtPmxzX2hkci5sc19vcHRpb25zKSZPU1BGX09QVElPTl9UKSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgbWV0cmljOiAldSIsIEVYVFJBQ1RfMzJCSVRTKGxwKSZTTEFfTUFTS19NRVRSSUMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisJCXdoaWxlICgodV9jaGFyICopbHAgPCBsc19lbmQpIHsKKwkJCXJlZ2lzdGVyIHVfaW50MzJfdCB1bDsKKworCQkJVENIRUNLKCpscCk7CisJCQl1bCA9IEVYVFJBQ1RfMzJCSVRTKGxwKTsKKwkJCXByaW50ZigiLCB0b3MgJWQgbWV0cmljICVkIiwKKwkJCSAgICAodWwgJiBTTEFfTUFTS19UT1MpID4+IFNMQV9TSElGVF9UT1MsCisJCQkgICAgdWwgJiBTTEFfTUFTS19NRVRSSUMpOworCQkJKytscDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTFNfVFlQRV9BU0U6CisgICAgICAgIGNhc2UgTFNfVFlQRV9OU1NBOiAvKiBmYWxsIHRocm91Z2ggLSB0aG9zZSBMU0FzIHNoYXJlIHRoZSBzYW1lIGZvcm1hdCAqLworCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX25sYS5ubGFfbWFzayk7CisJCXByaW50ZigiXG5cdCAgICBNYXNrICVzIiwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmxzYXAtPmxzYV91bi51bl9hc2xhLmFzbGFfbWFzaykpOworCisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV90b3NtZXRyaWMpOworCQlhbG1wID0gbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9tZXRyaWM7CisJCXdoaWxlICgodV9jaGFyICopYWxtcCA8IGxzX2VuZCkgeworCQkJcmVnaXN0ZXIgdV9pbnQzMl90IHVsOworCisJCQlUQ0hFQ0soYWxtcC0+YXNsYV90b3NtZXRyaWMpOworCQkJdWwgPSBFWFRSQUNUXzMyQklUUygmYWxtcC0+YXNsYV90b3NtZXRyaWMpOworCQkJcHJpbnRmKCIsIHR5cGUgJWQsIHRvcyAlZCBtZXRyaWM6IiwKKwkJCSAgICAodWwgJiBBU0xBX0ZMQUdfRVhURVJOQUwpID8gMiA6IDEsCisJCQkgICAgKHVsICYgQVNMQV9NQVNLX1RPUykgPj4gQVNMQV9TSElGVF9UT1MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1bCAmIEFTTEFfTUFTS19NRVRSSUMpPT0weGZmZmZmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBpbmZpbml0ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVkIiwgKHVsICYgQVNMQV9NQVNLX01FVFJJQykpOworCisJCQlUQ0hFQ0soYWxtcC0+YXNsYV9mb3J3YXJkKTsKKwkJCWlmIChhbG1wLT5hc2xhX2ZvcndhcmQuc19hZGRyKSB7CisJCQkJcHJpbnRmKCIsIGZvcndhcmQgJXMiLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZhbG1wLT5hc2xhX2ZvcndhcmQpKTsKKwkJCX0KKwkJCVRDSEVDSyhhbG1wLT5hc2xhX3RhZyk7CisJCQlpZiAoYWxtcC0+YXNsYV90YWcuc19hZGRyKSB7CisJCQkJcHJpbnRmKCIsIHRhZyAlcyIsCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJmFsbXAtPmFzbGFfdGFnKSk7CisJCQl9CisJCQkrK2FsbXA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfR1JPVVA6CisJCS8qIE11bHRpY2FzdCBleHRlbnNpb25zIGFzIG9mIDIzIEp1bHkgMTk5MSAqLworCQltY3AgPSBsc2FwLT5sc2FfdW4udW5fbWNsYTsKKwkJd2hpbGUgKCh1X2NoYXIgKiltY3AgPCBsc19lbmQpIHsKKwkJCVRDSEVDSyhtY3AtPm1jbGFfdmlkKTsKKwkJCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJm1jcC0+bWNsYV92dHlwZSkpIHsKKworCQkJY2FzZSBNQ0xBX1ZFUlRFWF9ST1VURVI6CisJCQkJcHJpbnRmKCJcblx0ICAgIFJvdXRlciBSb3V0ZXItSUQgJXMiLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZtY3AtPm1jbGFfdmlkKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTUNMQV9WRVJURVhfTkVUV09SSzoKKwkJCQlwcmludGYoIlxuXHQgICAgTmV0d29yayBEZXNpZ25hdGVkIFJvdXRlciAlcyIsCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJm1jcC0+bWNsYV92aWQpKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIlxuXHQgICAgdW5rbm93biBWZXJ0ZXhUeXBlICgldSkiLAorCQkJCSAgICBFWFRSQUNUXzMyQklUUygmbWNwLT5tY2xhX3Z0eXBlKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCSsrbWNwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMU19UWVBFX09QQVFVRV9MTDogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBMU19UWVBFX09QQVFVRV9BTDogCisJY2FzZSBMU19UWVBFX09QQVFVRV9EVzoKKworCSAgICBzd2l0Y2ggKCooJmxzYXAtPmxzX2hkci51bl9sc2FfaWQub3BhcXVlX2ZpZWxkLm9wYXF1ZV90eXBlKSkgeworICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVFlQRV9SSToKKwkJdHB0ciA9ICh1X2ludDhfdCAqKSgmbHNhcC0+bHNhX3VuLnVuX3JpX3Rsdi50eXBlKTsKKworCQl3aGlsZSAobHNfbGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgNCk7CisJCSAgICBpZiAobHNfbGVuZ3RoIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFJlbWFpbmluZyBMUyBsZW5ndGggJXUgPCA0IiwgbHNfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisgICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGggPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpOworICAgICAgICAgICAgICAgICAgICB0cHRyKz00OworICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgtPTQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgJXMgVExWICgldSksIGxlbmd0aDogJXUsIHZhbHVlOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX3JpX3Rsdl92YWx1ZXMsInVua25vd24iLHRsdl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRsdl9sZW5ndGggPiBsc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBCb2d1cyBsZW5ndGggJXUgPiAldSIsIHRsdl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aC09dGx2X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgdGx2X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0bHZfdHlwZSkgeworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1JJX1RMVl9DQVA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCAhPSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSAhPSA0IiwgdGx2X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNhcGFiaWxpdGllczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIobHNhX29wYXF1ZV9yaV90bHZfY2FwX3ZhbHVlcywgIlVua25vd24iLCBFWFRSQUNUXzMyQklUUyh0cHRyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cHRyKz10bHZfbGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVFlQRV9HUkFDRToKKwkJdHB0ciA9ICh1X2ludDhfdCAqKSgmbHNhcC0+bHNhX3VuLnVuX2dyYWNlX3Rsdi50eXBlKTsKKworCQl3aGlsZSAobHNfbGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgNCk7CisJCSAgICBpZiAobHNfbGVuZ3RoIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFJlbWFpbmluZyBMUyBsZW5ndGggJXUgPCA0IiwgbHNfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisgICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGggPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpOworICAgICAgICAgICAgICAgICAgICB0cHRyKz00OworICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgtPTQ7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgJXMgVExWICgldSksIGxlbmd0aDogJXUsIHZhbHVlOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX2dyYWNlX3Rsdl92YWx1ZXMsInVua25vd24iLHRsdl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRsdl9sZW5ndGggPiBsc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBCb2d1cyBsZW5ndGggJXUgPiAldSIsIHRsdl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aC09dGx2X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgdGx2X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0bHZfdHlwZSkgeworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX0dSQUNFX1RMVl9QRVJJT0Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCAhPSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSAhPSA0IiwgdGx2X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiV1cyIsRVhUUkFDVF8zMkJJVFModHB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX0dSQUNFX1RMVl9SRUFTT046CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSAhPSAxIiwgdGx2X2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNhX29wYXF1ZV9ncmFjZV90bHZfcmVhc29uX3ZhbHVlcywgIlVua25vd24iLCAqdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX0dSQUNFX1RMVl9JTlRfQUREUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1ICE9IDQiLCB0bHZfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICAgICAiLHRsdl9sZW5ndGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHB0cis9dGx2X2xlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBMU19PUEFRVUVfVFlQRV9URToKKwkJdHB0ciA9ICh1X2ludDhfdCAqKSgmbHNhcC0+bHNhX3VuLnVuX3RlX2xzYV90bHYudHlwZSk7CisKKwkJd2hpbGUgKGxzX2xlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKnRwdHIsIDQpOworCQkgICAgaWYgKGxzX2xlbmd0aCA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBSZW1haW5pbmcgTFMgbGVuZ3RoICV1IDwgNCIsIGxzX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0bHZfdHlwZSA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOworICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoID0gRVhUUkFDVF8xNkJJVFModHB0cisyKTsKKyAgICAgICAgICAgICAgICAgICAgdHB0cis9NDsKKyAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoLT00OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICVzIFRMViAoJXUpLCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNhX29wYXF1ZV90ZV90bHZfdmFsdWVzLCJ1bmtub3duIix0bHZfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoID4gbHNfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1ID4gJXUiLCB0bHZfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgtPXRsdl9sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0bHZfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9UTFZfTElOSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0bHZfbGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCA8IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFJlbWFpbmluZyBUTFYgbGVuZ3RoICV1IDwgNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKnRwdHIsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl90eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X2xlbmd0aCA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIrMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0cis9NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoLT00OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIHN1YlRMViAoJXUpLCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX3RlX2xpbmtfdGx2X3N1YnRsdl92YWx1ZXMsInVua25vd24iLHN1YnRsdl90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKnRwdHIsIHN1YnRsdl9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChzdWJ0bHZfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0FETUlOX0dST1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfTE9DQUxfUkVNT1RFX0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgJXMgKDB4JTA4eCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyh0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRsdl9sZW5ndGggPT0gOCkgLyogZHJhZnQtaWV0Zi1jY2FtcC1vc3BmLWdtcGxzLWV4dGVuc2lvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyAoMHglMDh4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyh0cHRyKzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MT0NBTF9JUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9SRU1PVEVfSVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9NQVhfQlc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTUFYX1JFU19CVzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgJS4zZiBNYnBzIiwgYncuZio4LzEwMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfVU5SRVNfQlc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodGVfY2xhc3MgPSAwOyB0ZV9jbGFzcyA8IDg7IHRlX2NsYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyK3RlX2NsYXNzKjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRURS1DbGFzcyAldTogJS4zZiBNYnBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZV9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0JXX0NPTlNUUkFJTlRTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdEJhbmR3aWR0aCBDb25zdHJhaW50cyBNb2RlbCBJRDogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGRpZmZzZXJ2X3RlX2JjX3ZhbHVlcywgInVua25vd24iLCAqdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlY29kZSBCQ3MgdW50aWwgdGhlIHN1YlRMViBlbmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodGVfY2xhc3MgPSAwOyB0ZV9jbGFzcyA8IChzdWJ0bHZfbGVuZ3RoLTQpLzQ7IHRlX2NsYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKzQrdGVfY2xhc3MqNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdCAgQmFuZHdpZHRoIGNvbnN0cmFpbnQgQ1QldTogJS4zZiBNYnBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZV9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX1RFX01FVFJJQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIE1ldHJpYyAldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19QUk9URUNUSU9OX1RZUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcywgUHJpb3JpdHkgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihnbXBsc19saW5rX3Byb3RfdmFsdWVzLCAibm9uZSIsICp0cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0cisxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0lOVEZfU1dfQ0FQX0RFU0NSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdEludGVyZmFjZSBTd2l0Y2hpbmcgQ2FwYWJpbGl0eTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihnbXBsc19zd2l0Y2hfY2FwX3ZhbHVlcywgIlVua25vd24iLCAqKHRwdHIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0TFNQIEVuY29kaW5nOiAlc1xuXHRcdE1heCBMU1AgQmFuZHdpZHRoOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX2VuY29kaW5nX3ZhbHVlcywgIlVua25vd24iLCAqKHRwdHIrMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmlvcml0eV9sZXZlbCA9IDA7IHByaW9yaXR5X2xldmVsIDwgODsgcHJpb3JpdHlfbGV2ZWwrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCsocHJpb3JpdHlfbGV2ZWwqNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQgIHByaW9yaXR5IGxldmVsICVkOiAlLjNmIE1icHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV9vcGFxdWVfdGVfdGx2X2xpbmtfdHlwZV9zdWJfdGx2X3ZhbHVlcywidW5rbm93biIsKnRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX1NIQVJFRF9SSVNLX0dST1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9zcmxnID0gc3VidGx2X2xlbmd0aCAvIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudF9zcmxnICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQgIFNoYXJlZCByaXNrIGdyb3VwOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50X3NybGcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLGJ3LmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIrPTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfc3JsZy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudF9zcmxnID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdFx0IixzdWJ0bHZfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gT1NQRiBldmVyeXRoaW5nIGhhcyB0byBiZSAzMi1iaXQgYWxpZ25lZCwgaW5jbHVkaW5nIFRMVnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGx2X2xlbmd0aCU0ICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9sZW5ndGgrPTQtKHN1YnRsdl9sZW5ndGglNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aC09c3VidGx2X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyKz1zdWJ0bHZfbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfVExWX1JPVVRFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBUTFYgbGVuZ3RoICV1IDwgNCIsIHRsdl9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHB0cis9dGx2X2xlbmd0aDsKKwkJfQorICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKCh1X2ludDhfdCAqKWxzYXAtPmxzYV91bi51bl91bmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgIiwgbHNfbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7CisgICAgICAgICAgICB9IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgaGV4ZHVtcCA/ICovCisgICAgICAgIGlmICh2ZmxhZz4gMSkKKyAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEoKHVfaW50OF90ICopbHNhcC0+bHNhX3VuLnVuX3Vua25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0ICAgICIsIGxzX2xlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisJcmV0dXJuIChsc19lbmQpOwordHJ1bmM6CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludAorb3NwZl9kZWNvZGVfdjIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IG9zcGZoZHIgKm9wLAorICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZGF0YWVuZCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYXA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzciAqbHNycDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhX2hkciAqbHNocDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhICpsc2FwOworCXJlZ2lzdGVyIHVfaW50MzJfdCBsc2FfY291bnQsbHNhX2NvdW50X21heDsKKworCXN3aXRjaCAob3AtPm9zcGZfdHlwZSkgeworCisJY2FzZSBPU1BGX1RZUEVfVU1EOgorCQkvKgorCQkgKiBSb2IgQ29sdHVuJ3Mgc3BlY2lhbCBtb25pdG9yaW5nIHBhY2tldHM7CisJCSAqIGRvIG5vdGhpbmcKKwkJICovCisJCWJyZWFrOworCisJY2FzZSBPU1BGX1RZUEVfSEVMTE86CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0T3B0aW9uczogWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIob3NwZl9vcHRpb25fdmFsdWVzLCJub25lIixvcC0+b3NwZl9oZWxsby5oZWxsb19vcHRpb25zKSk7CisKKyAgICAgICAgICAgICAgICBUQ0hFQ0sob3AtPm9zcGZfaGVsbG8uaGVsbG9fZGVhZGludCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBIZWxsbyBUaW1lcjogJXVzLCBEZWFkIFRpbWVyICV1cywgTWFzazogJXMsIFByaW9yaXR5OiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9oZWxsby5oZWxsb19oZWxsb2ludCksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZl9oZWxsby5oZWxsb19kZWFkaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZygmb3AtPm9zcGZfaGVsbG8uaGVsbG9fbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgIG9wLT5vc3BmX2hlbGxvLmhlbGxvX3ByaW9yaXR5KTsKKworCQlUQ0hFQ0sob3AtPm9zcGZfaGVsbG8uaGVsbG9fZHIpOworCQlpZiAob3AtPm9zcGZfaGVsbG8uaGVsbG9fZHIuc19hZGRyICE9IDApCisJCQlwcmludGYoIlxuXHQgIERlc2lnbmF0ZWQgUm91dGVyICVzIiwKKwkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZl9oZWxsby5oZWxsb19kcikpOworCisJCVRDSEVDSyhvcC0+b3NwZl9oZWxsby5oZWxsb19iZHIpOworCQlpZiAob3AtPm9zcGZfaGVsbG8uaGVsbG9fYmRyLnNfYWRkciAhPSAwKQorCQkJcHJpbnRmKCIsIEJhY2t1cCBEZXNpZ25hdGVkIFJvdXRlciAlcyIsCisJCQkgICAgaXBhZGRyX3N0cmluZygmb3AtPm9zcGZfaGVsbG8uaGVsbG9fYmRyKSk7CisKKyAgICAgICAgICAgICAgICBhcCA9IG9wLT5vc3BmX2hlbGxvLmhlbGxvX25laWdoYm9yOworICAgICAgICAgICAgICAgIGlmICgodV9jaGFyICopYXAgPCBkYXRhZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBOZWlnaGJvciBMaXN0OiIpOworICAgICAgICAgICAgICAgIHdoaWxlICgodV9jaGFyICopYXAgPCBkYXRhZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0soKmFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyIsIGlwYWRkcl9zdHJpbmcoYXApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrYXA7CisgICAgICAgICAgICAgICAgfQorCQlicmVhazsJLyogSEVMTE8gKi8KKworCWNhc2UgT1NQRl9UWVBFX0REOgorCQlUQ0hFQ0sob3AtPm9zcGZfZGIuZGJfb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0T3B0aW9uczogWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIob3NwZl9vcHRpb25fdmFsdWVzLCJub25lIixvcC0+b3NwZl9kYi5kYl9vcHRpb25zKSk7CisJCVRDSEVDSyhvcC0+b3NwZl9kYi5kYl9mbGFncyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsIEREIEZsYWdzOiBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihvc3BmX2RkX2ZsYWdfdmFsdWVzLCJub25lIixvcC0+b3NwZl9kYi5kYl9mbGFncykpOworCisJCWlmICh2ZmxhZykgeworCQkJLyogUHJpbnQgYWxsIHRoZSBMUyBhZHYncyAqLworCQkJbHNocCA9IG9wLT5vc3BmX2RiLmRiX2xzaGRyOworCQkJd2hpbGUgKG9zcGZfcHJpbnRfbHNoZHIobHNocCkgIT0gLTEpIHsKKwkJCQkrK2xzaHA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9TUEZfVFlQRV9MU19SRVE6CisgICAgICAgICAgICAgICAgbHNycCA9IG9wLT5vc3BmX2xzcjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHVfY2hhciAqKWxzcnAgPCBkYXRhZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIFRDSEVDSygqbHNycCk7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBBZHZlcnRpc2luZyBSb3V0ZXI6ICVzLCAlcyBMU0EgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZsc3JwLT5sc19yb3V0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2FfdmFsdWVzLCJ1bmtub3duIixFWFRSQUNUXzMyQklUUyhsc3JwLT5sc190eXBlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmbHNycC0+bHNfdHlwZSkpOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoRVhUUkFDVF8zMkJJVFMobHNycC0+bHNfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBMU0EgaGVhZGVyIGZvciBvcGFxdWUgTFNBcyB3YXMgc2xpZ2h0bHkgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0xMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0FMOgorICAgICAgICAgICAgICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0RXOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIE9wYXF1ZS1UeXBlOiAlcyBMU0EgKCV1KSwgT3BhcXVlLUlEOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX3ZhbHVlcywgInVua25vd24iLGxzcnAtPnVuX2xzX3N0YXRlaWQub3BhcXVlX2ZpZWxkLm9wYXF1ZV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3JwLT51bl9sc19zdGF0ZWlkLm9wYXF1ZV9maWVsZC5vcGFxdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUygmbHNycC0+dW5fbHNfc3RhdGVpZC5vcGFxdWVfZmllbGQub3BhcXVlX2lkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBMU0EtSUQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZsc3JwLT51bl9sc19zdGF0ZWlkLmxzX3N0YXRlaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICArK2xzcnA7CisgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKworCWNhc2UgT1NQRl9UWVBFX0xTX1VQREFURToKKyAgICAgICAgICAgICAgICBsc2FwID0gb3AtPm9zcGZfbHN1LmxzdV9sc2E7CisgICAgICAgICAgICAgICAgVENIRUNLKG9wLT5vc3BmX2xzdS5sc3VfY291bnQpOworICAgICAgICAgICAgICAgIGxzYV9jb3VudF9tYXggPSBFWFRSQUNUXzMyQklUUygmb3AtPm9zcGZfbHN1LmxzdV9jb3VudCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVkIExTQSVzIixsc2FfY291bnRfbWF4LCBsc2FfY291bnRfbWF4ID4gMSA/ICJzIiA6ICIiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGxzYV9jb3VudD0xO2xzYV9jb3VudCA8PSBsc2FfY291bnRfbWF4O2xzYV9jb3VudCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgTFNBICMldSIsbHNhX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxzYXAgPSAoY29uc3Qgc3RydWN0IGxzYSAqKW9zcGZfcHJpbnRfbHNhKGxzYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxzYXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCisJY2FzZSBPU1BGX1RZUEVfTFNfQUNLOgorICAgICAgICAgICAgICAgIGxzaHAgPSBvcC0+b3NwZl9sc2EubHNhX2xzaGRyOworICAgICAgICAgICAgICAgIHdoaWxlIChvc3BmX3ByaW50X2xzaGRyKGxzaHApICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICsrbHNocDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoInYyIHR5cGUgKCVkKSIsIG9wLT5vc3BmX3R5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK29zcGZfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAorICAgIGNvbnN0IHVfY2hhciAqYnAyIF9VXykKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgb3NwZmhkciAqb3A7CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpkYXRhZW5kOworCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOworCisJb3AgPSAoc3RydWN0IG9zcGZoZHIgKilicDsKKworICAgICAgICAvKiBYWFggQmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UsIHN0cmlwIG9mZiB0aGUgTUQ1IHRyYWlsZXIgKi8KKyAgICAgICAgVENIRUNLKG9wLT5vc3BmX2F1dGh0eXBlKTsKKyAgICAgICAgaWYgKEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9hdXRodHlwZSkgPT0gT1NQRl9BVVRIX01ENSkgeworICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBPU1BGX0FVVEhfTUQ1X0xFTjsKKyAgICAgICAgICAgICAgICBzbmFwZW5kIC09IE9TUEZfQVVUSF9NRDVfTEVOOworICAgICAgICB9CisKKwkvKiBJZiB0aGUgdHlwZSBpcyB2YWxpZCB0cmFuc2xhdGUgaXQsIG9yIGp1c3QgcHJpbnQgdGhlIHR5cGUgKi8KKwkvKiB2YWx1ZS4gIElmIGl0J3Mgbm90IHZhbGlkLCBzYXkgc28gYW5kIHJldHVybiAqLworCVRDSEVDSyhvcC0+b3NwZl90eXBlKTsKKwljcCA9IHRvazJzdHIodHlwZTJzdHIsICJ1bmtub3duIExTLXR5cGUiLCBvcC0+b3NwZl90eXBlKTsKKwlwcmludGYoIk9TUEZ2JXUsICVzLCBsZW5ndGg6ICV1IiwKKwkgICAgICAgb3AtPm9zcGZfdmVyc2lvbiwKKwkgICAgICAgY3AsCisJICAgICAgIGxlbmd0aCk7CisJaWYgKCpjcCA9PSAndScpCisJCXJldHVybjsKKworICAgICAgICBpZighdmZsYWcpIC8qIG5vbiB2ZXJib3NlIC0gc28gbGV0cyBiYWlsIG91dCBoZXJlICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJVENIRUNLKG9wLT5vc3BmX2xlbik7CisJaWYgKGxlbmd0aCAhPSBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGZfbGVuKSkgeworCQlwcmludGYoIiBbbGVuICVkXSIsIEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9sZW4pKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhZW5kID0gYnAgKyBsZW5ndGg7CisKKwlUQ0hFQ0sob3AtPm9zcGZfcm91dGVyaWQpOworICAgICAgICBwcmludGYoIlxuXHRSb3V0ZXItSUQ6ICVzIiwgaXBhZGRyX3N0cmluZygmb3AtPm9zcGZfcm91dGVyaWQpKTsKKworCVRDSEVDSyhvcC0+b3NwZl9hcmVhaWQpOworCWlmIChvcC0+b3NwZl9hcmVhaWQuc19hZGRyICE9IDApCisJCXByaW50ZigiLCBBcmVhICVzIiwgaXBhZGRyX3N0cmluZygmb3AtPm9zcGZfYXJlYWlkKSk7CisJZWxzZQorCQlwcmludGYoIiwgQmFja2JvbmUgQXJlYSIpOworCisJaWYgKHZmbGFnKSB7CisJCS8qIFByaW50IGF1dGhlbnRpY2F0aW9uIGRhdGEgKHNob3VsZCB3ZSByZWFsbHkgZG8gdGhpcz8pICovCisJCVRDSEVDSzIob3AtPm9zcGZfYXV0aGRhdGFbMF0sIHNpemVvZihvcC0+b3NwZl9hdXRoZGF0YSkpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCIsIEF1dGhlbnRpY2F0aW9uIFR5cGU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG9zcGZfYXV0aHR5cGVfdmFsdWVzLCJ1bmtub3duIixFWFRSQUNUXzE2QklUUygmb3AtPm9zcGZfYXV0aHR5cGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmX2F1dGh0eXBlKSk7CisKKwkJc3dpdGNoIChFWFRSQUNUXzE2QklUUygmb3AtPm9zcGZfYXV0aHR5cGUpKSB7CisKKwkJY2FzZSBPU1BGX0FVVEhfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgT1NQRl9BVVRIX1NJTVBMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFNpbXBsZSB0ZXh0IHBhc3N3b3JkOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVwdXRzKG9wLT5vc3BmX2F1dGhkYXRhLCBPU1BGX0FVVEhfU0lNUExFX0xFTik7CisJCQlicmVhazsKKworCQljYXNlIE9TUEZfQVVUSF9NRDU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRLZXktSUQ6ICV1LCBBdXRoLUxlbmd0aDogJXUsIENyeXB0byBTZXF1ZW5jZSBOdW1iZXI6IDB4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigob3AtPm9zcGZfYXV0aGRhdGEpKzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKG9wLT5vc3BmX2F1dGhkYXRhKSszKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygob3AtPm9zcGZfYXV0aGRhdGEpKzQpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogRG8gcmVzdCBhY2NvcmRpbmcgdG8gdmVyc2lvbi4JICovCisJc3dpdGNoIChvcC0+b3NwZl92ZXJzaW9uKSB7CisKKwljYXNlIDI6CisJCS8qIG9zcGYgdmVyc2lvbiAyICovCisJCWlmIChvc3BmX2RlY29kZV92MihvcCwgZGF0YWVuZCkpCisJCQlnb3RvIHRydW5jOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiIG9zcGYgW3ZlcnNpb24gJWRdIiwgb3AtPm9zcGZfdmVyc2lvbik7CisJCWJyZWFrOworCX0JCQkvKiBlbmQgc3dpdGNoIG9uIHZlcnNpb24gKi8KKworCXJldHVybjsKK3RydW5jOgorCWZwdXRzKHRzdHIsIHN0ZG91dCk7Cit9CmRpZmYgLS1naXQgYS9wcmludC1vc3BmNi5jIGIvcHJpbnQtb3NwZjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzI1YTIxCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtb3NwZjYuYwpAQCAtMCwwICsxLDY4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9TUEYgc3VwcG9ydCBjb250cmlidXRlZCBieSBKZWZmcmV5IEhvbmlnIChqY2hAbWl0Y2hlbGwuY2l0LmNvcm5lbGwuZWR1KQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW9zcGY2LmMsdiAxLjEzIDIwMDMvMTEvMTYgMDk6MzY6MzEgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisKKyNpbmNsdWRlICJvc3BmNi5oIgorCitzdHJ1Y3QgYml0cyB7CisJdV9pbnQzMl90IGJpdDsKKwljb25zdCBjaGFyICpzdHI7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJpdHMgb3NwZjZfb3B0aW9uX2JpdHNbXSA9IHsKKwl7IE9TUEY2X09QVElPTl9WNiwJIlY2IiB9LAorCXsgT1NQRjZfT1BUSU9OX0UsCSJFIiB9LAorCXsgT1NQRjZfT1BUSU9OX01DLAkiTUMiIH0sCisJeyBPU1BGNl9PUFRJT05fTiwJIk4iIH0sCisJeyBPU1BGNl9PUFRJT05fUiwJIlIiIH0sCisJeyBPU1BGNl9PUFRJT05fREMsCSJEQyIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJpdHMgb3NwZjZfcmxhX2ZsYWdfYml0c1tdID0geworCXsgUkxBX0ZMQUdfQiwJCSJCIiB9LAorCXsgUkxBX0ZMQUdfRSwJCSJFIiB9LAorCXsgUkxBX0ZMQUdfViwJCSJWIiB9LAorCXsgUkxBX0ZMQUdfVywJCSJXIiB9LAorCXsgMCwJCQlOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYml0cyBvc3BmNl9hc2xhX2ZsYWdfYml0c1tdID0geworCXsgQVNMQV9GTEFHX0VYVEVSTkFMLAkiRSIgfSwKKwl7IEFTTEFfRkxBR19GV0RBRERSLAkiRiIgfSwKKwl7IEFTTEFfRkxBR19ST1VURVRBRywJIlQiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgdHlwZTJzdHJbXSA9IHsKKwl7IE9TUEZfVFlQRV9VTUQsCSJ1bWQiIH0sCisJeyBPU1BGX1RZUEVfSEVMTE8sCSJoZWxsbyIgfSwKKwl7IE9TUEZfVFlQRV9EQiwJCSJkZCIgfSwKKwl7IE9TUEZfVFlQRV9MU1IsCSJsc19yZXEiIH0sCisJeyBPU1BGX1RZUEVfTFNVLAkibHNfdXBkIiB9LAorCXsgT1NQRl9UWVBFX0xTQSwJImxzX2FjayIgfSwKKwl7IDAsCQkJTlVMTCB9Cit9OworCitzdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8b3NwZl0iOworCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgaW5saW5lIF9faW5saW5lCisjZW5kaWYgLyogV0lOMzIgKi8KKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvc3BmNl9wcmludF9zZXFhZ2UodV9pbnQzMl90LCB0aW1lX3QpOworc3RhdGljIGlubGluZSB2b2lkIG9zcGY2X3ByaW50X2JpdHMoY29uc3Qgc3RydWN0IGJpdHMgKiwgdV9jaGFyKTsKK3N0YXRpYyB2b2lkIG9zcGY2X3ByaW50X2xzX3R5cGUodV9pbnQsIGNvbnN0IHJ0cmlkX3QgKiwKKyAgICBjb25zdCBydHJpZF90ICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IG9zcGY2X3ByaW50X2xzaGRyKGNvbnN0IHN0cnVjdCBsc2FfaGRyICopOworc3RhdGljIGludCBvc3BmNl9wcmludF9sc2EoY29uc3Qgc3RydWN0IGxzYSAqKTsKK3N0YXRpYyBpbnQgb3NwZjZfZGVjb2RlX3YzKGNvbnN0IHN0cnVjdCBvc3BmNmhkciAqLCBjb25zdCB1X2NoYXIgKik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorb3NwZjZfcHJpbnRfc2VxYWdlKHJlZ2lzdGVyIHVfaW50MzJfdCBzZXEsIHJlZ2lzdGVyIHRpbWVfdCB1cykKK3sKKwlyZWdpc3RlciB0aW1lX3Qgc2VjID0gdXMgJSA2MDsKKwlyZWdpc3RlciB0aW1lX3QgbWlucyA9ICh1cyAvIDYwKSAlIDYwOworCXJlZ2lzdGVyIHRpbWVfdCBob3VyID0gdXMgLyAzNjAwOworCisJcHJpbnRmKCIgUyAlWCBhZ2UgIiwgc2VxKTsKKwlpZiAoaG91cikKKwkJcHJpbnRmKCIldTolMDJ1OiUwMnUiLAorCQkgICAgKHVfaW50MzJfdCkgaG91ciwgKHVfaW50MzJfdCkgbWlucywgKHVfaW50MzJfdCkgc2VjKTsKKwllbHNlIGlmIChtaW5zKQorCQlwcmludGYoIiV1OiUwMnUiLCAodV9pbnQzMl90KSBtaW5zLCAodV9pbnQzMl90KSBzZWMpOworCWVsc2UKKwkJcHJpbnRmKCIldSIsICh1X2ludDMyX3QpIHNlYyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitvc3BmNl9wcmludF9iaXRzKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBiaXRzICpicCwgcmVnaXN0ZXIgdV9jaGFyIG9wdGlvbnMpCit7CisJcmVnaXN0ZXIgY2hhciBzZXAgPSAnICc7CisKKwlkbyB7CisJCWlmIChvcHRpb25zICYgYnAtPmJpdCkgeworCQkJcHJpbnRmKCIlYyVzIiwgc2VwLCBicC0+c3RyKTsKKwkJCXNlcCA9ICcvJzsKKwkJfQorCX0gd2hpbGUgKCgrK2JwKS0+Yml0KTsKK30KKworc3RhdGljIHZvaWQKK29zcGY2X3ByaW50X2xzX3R5cGUocmVnaXN0ZXIgdV9pbnQgbHNfdHlwZSwKKyAgICByZWdpc3RlciBjb25zdCBydHJpZF90ICpsc19zdGF0ZWlkLAorICAgIHJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmxzX3JvdXRlciwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10KQoreworCWNvbnN0IGNoYXIgKnNjb3BlOworCisJc3dpdGNoIChsc190eXBlICYgTFNfU0NPUEVfTUFTSykgeworCWNhc2UgTFNfU0NPUEVfTElOS0xPQ0FMOgorCQlzY29wZSA9ICJsaW5rbG9jYWwtIjsKKwkJYnJlYWs7CisJY2FzZSBMU19TQ09QRV9BUkVBOgorCQlzY29wZSA9ICJhcmVhLSI7CisJCWJyZWFrOworCWNhc2UgTFNfU0NPUEVfQVM6CisJCXNjb3BlID0gIkFTLSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNjb3BlID0gIiI7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAobHNfdHlwZSAmIExTX1RZUEVfTUFTSykgeworCWNhc2UgTFNfVFlQRV9ST1VURVI6CisJCXByaW50ZigiICVzcnRyICVzIiwgc2NvcGUsIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7CisJCWJyZWFrOworCisJY2FzZSBMU19UWVBFX05FVFdPUks6CisJCXByaW50ZigiICVzbmV0IGRyICVzIGlmICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3JvdXRlciksCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfSU5URVJfQVA6CisJCXByaW50ZigiICVzaW50ZXItYXJlYS1wcmVmaXggJXMgYWJyICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfSU5URVJfQVI6CisJCXByaW50ZigiICVzaW50ZXItYXJlYS1yb3V0ZXIgJXMgcnRyICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3JvdXRlciksCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfQVNFOgorCQlwcmludGYoIiAlc2FzZSAlcyBhc2JyICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfR1JPVVA6CisJCXByaW50ZigiICVzZ3JvdXAgJXMgcnRyICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfVFlQRTc6CisJCXByaW50ZigiICVzdHlwZTcgJXMgcnRyICVzIiwgc2NvcGUsCisJCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfTElOSzoKKwkJcHJpbnRmKCIgJXNsaW5rICVzIHJ0ciAlcyIsIHNjb3BlLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19zdGF0ZWlkKSwKKwkJICAgIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7CisJCWJyZWFrOworCisJY2FzZSBMU19UWVBFX0lOVFJBX0FQOgorCQlwcmludGYoIiAlc2ludHJhLWFyZWEtcHJlZml4ICVzIHJ0ciAlcyIsIHNjb3BlLAorCQkgICAgaXBhZGRyX3N0cmluZyhsc19zdGF0ZWlkKSwKKwkJICAgIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgJXMiLCBzY29wZSk7CisJCXByaW50ZihmbXQsIGxzX3R5cGUpOworCQlicmVhazsKKwl9CisKK30KKworc3RhdGljIGludAorb3NwZjZfcHJpbnRfbHNoZHIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYV9oZHIgKmxzaHApCit7CisKKwlUQ0hFQ0sobHNocC0+bHNfdHlwZSk7CisJcHJpbnRmKCIgeyIpOwkJCQkJCS8qIH0gKGN0YWdzKSAqLworCisJVENIRUNLKGxzaHAtPmxzX3NlcSk7CisJb3NwZjZfcHJpbnRfc2VxYWdlKEVYVFJBQ1RfMzJCSVRTKCZsc2hwLT5sc19zZXEpLCBFWFRSQUNUXzE2QklUUygmbHNocC0+bHNfYWdlKSk7CisJb3NwZjZfcHJpbnRfbHNfdHlwZShFWFRSQUNUXzE2QklUUygmbHNocC0+bHNfdHlwZSksICZsc2hwLT5sc19zdGF0ZWlkLAorCQkmbHNocC0+bHNfcm91dGVyLCAibHNfdHlwZSAlZCIpOworCisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQKK29zcGY2X3ByaW50X2xzYXByZWZpeChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhX3ByZWZpeCAqbHNhcHApCit7CisJdV9pbnQgazsKKwlzdHJ1Y3QgaW42X2FkZHIgcHJlZml4OworCisJVENIRUNLKCpsc2FwcCk7CisJayA9IChsc2FwcC0+bHNhX3BfbGVuICsgMzEpIC8gMzI7CisJaWYgKGsgKiA0ID4gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKKwkJcHJpbnRmKCI/P3ByZWZpeGxlbiAlZD8/IiwgbHNhcHAtPmxzYV9wX2xlbik7CisJCWdvdG8gdHJ1bmM7CisJfQorCW1lbXNldCgmcHJlZml4LCAwLCBzaXplb2YocHJlZml4KSk7CisJbWVtY3B5KCZwcmVmaXgsIGxzYXBwLT5sc2FfcF9wcmVmaXgsIGsgKiA0KTsKKwlwcmludGYoIiAlcy8lZCIsIGlwNmFkZHJfc3RyaW5nKCZwcmVmaXgpLAorCQlsc2FwcC0+bHNhX3BfbGVuKTsKKwlpZiAobHNhcHAtPmxzYV9wX29wdCkKKwkJcHJpbnRmKCIob3B0PSV4KSIsIGxzYXBwLT5sc2FfcF9vcHQpOworCWlmIChsc2FwcC0+bHNhX3BfbWJ6KQorCQlwcmludGYoIihtYno9JXgpIiwgRVhUUkFDVF8xNkJJVFMoJmxzYXBwLT5sc2FfcF9tYnopKTsgLyogWFhYICovCisJcmV0dXJuIHNpemVvZigqbHNhcHApIC0gNCArIGsgKiA0OworCit0cnVuYzoKKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFByaW50IGEgc2luZ2xlIGxpbmsgc3RhdGUgYWR2ZXJ0aXNlbWVudC4gIElmIHRydW5jYXRlZCByZXR1cm4gMSwgZWxzZSAwLgorICovCitzdGF0aWMgaW50Citvc3BmNl9wcmludF9sc2EocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYSAqbHNhcCkKK3sKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmxzX2VuZCwgKmxzX29wdDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmxhbGluayAqcmxwOworI2lmIDAKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9zX21ldHJpYyAqdG9zcDsKKyNlbmRpZgorCXJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmFwOworI2lmIDAKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXNsYW1ldHJpYyAqYWxtcDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWNsYSAqbWNwOworI2VuZGlmCisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxsc2EgKmxsc2FwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc2FfcHJlZml4ICpsc2FwcDsKKyNpZiAwCisJcmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpscDsKKyNlbmRpZgorCXJlZ2lzdGVyIHVfaW50IGo7CisJcmVnaXN0ZXIgaW50IGs7CisJdV9pbnQzMl90IGZsYWdzMzI7CisKKwlpZiAob3NwZjZfcHJpbnRfbHNoZHIoJmxzYXAtPmxzX2hkcikpCisJCXJldHVybiAoMSk7CisJVENIRUNLKGxzYXAtPmxzX2hkci5sc19sZW5ndGgpOworCWxzX2VuZCA9ICh1X2NoYXIgKilsc2FwICsgRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc19sZW5ndGgpOworCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc190eXBlKSkgeworCWNhc2UgTFNfVFlQRV9ST1VURVIgfCBMU19TQ09QRV9BUkVBOgorCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfZmxhZ3MpOworCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X3JsYV9mbGFnX2JpdHMsCisJCQlsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9mbGFncyk7CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9vcHRpb25zKTsKKwkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKKwkJCUVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9vcHRpb25zKSk7CisKKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9ybGEucmxhX2xpbmspOworCQlybHAgPSBsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9saW5rOworCQl3aGlsZSAocmxwICsgc2l6ZW9mKCpybHApIDw9IChzdHJ1Y3QgcmxhbGluayAqKWxzX2VuZCkgeworCQkJVENIRUNLKCpybHApOworCQkJcHJpbnRmKCIgeyIpOwkJCQkvKiB9IChjdGFncykgKi8KKwkJCXN3aXRjaCAocmxwLT5saW5rX3R5cGUpIHsKKworCQkJY2FzZSBSTEFfVFlQRV9WSVJUVUFMOgorCQkJCXByaW50ZigiIHZpcnQiKTsKKwkJCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCQkJY2FzZSBSTEFfVFlQRV9ST1VURVI6CisJCQkJcHJpbnRmKCIgbmJyaWQgJXMgbmJyaWYgJXMgaWYgJXMiLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfbnJ0aWQpLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfbmlmaWQpLAorCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfaWZpZCkpOworCQkJCWJyZWFrOworCisJCQljYXNlIFJMQV9UWVBFX1RSQU5TSVQ6CisJCQkJcHJpbnRmKCIgZHIgJXMgZHJpZiAlcyBpZiAlcyIsCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19ucnRpZCksCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19uaWZpZCksCisJCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19pZmlkKSk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJCQkJCS8qIHsgKGN0YWdzKSAqLworCQkJCXByaW50ZigiID8/Um91dGVyTGlua3NUeXBlIDB4JTAyeD8/IH0iLAorCQkJCSAgICBybHAtPmxpbmtfdHlwZSk7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCXByaW50ZigiIG1ldHJpYyAlZCIsIEVYVFJBQ1RfMTZCSVRTKCZybHAtPmxpbmtfbWV0cmljKSk7CisJCQkJCQkJCS8qIHsgKGN0YWdzKSAqLworCQkJcHJpbnRmKCIgfSIpOworCQkJcmxwKys7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfTkVUV09SSyB8IExTX1NDT1BFX0FSRUE6CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9vcHRpb25zKTsKKwkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKKwkJCUVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9vcHRpb25zKSk7CisJCXByaW50ZigiIHJ0cnMiKTsKKwkJYXAgPSBsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9yb3V0ZXI7CisJCXdoaWxlICgodV9jaGFyICopYXAgPCBsc19lbmQpIHsKKwkJCVRDSEVDSygqYXApOworCQkJcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKGFwKSk7CisJCQkrK2FwOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMU19UWVBFX0lOVEVSX0FQIHwgTFNfU0NPUEVfQVJFQToKKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9pbnRlcl9hcC5pbnRlcl9hcF9tZXRyaWMpOworCQlwcmludGYoIiBtZXRyaWMgJXUiLAorCQkJRVhUUkFDVF8zMkJJVFMoJmxzYXAtPmxzYV91bi51bl9pbnRlcl9hcC5pbnRlcl9hcF9tZXRyaWMpICYgU0xBX01BU0tfTUVUUklDKTsKKwkJbHNhcHAgPSBsc2FwLT5sc2FfdW4udW5faW50ZXJfYXAuaW50ZXJfYXBfcHJlZml4OworCQl3aGlsZSAobHNhcHAgKyBzaXplb2YobHNhcHApIDw9IChzdHJ1Y3QgbHNhX3ByZWZpeCAqKWxzX2VuZCkgeworCQkJayA9IG9zcGY2X3ByaW50X2xzYXByZWZpeChsc2FwcCk7CisJCQlpZiAoaykKKwkJCQlnb3RvIHRydW5jOworCQkJbHNhcHAgPSAoc3RydWN0IGxzYV9wcmVmaXggKikoKCh1X2NoYXIgKilsc2FwcCkgKyBrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExTX1NDT1BFX0FTIHwgTFNfVFlQRV9BU0U6CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fYXNsYS5hc2xhX21ldHJpYyk7CisJCWZsYWdzMzIgPSBFWFRSQUNUXzMyQklUUygmbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9tZXRyaWMpOworCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X2FzbGFfZmxhZ19iaXRzLCBmbGFnczMyKTsKKwkJcHJpbnRmKCIgbWV0cmljICV1IiwKKwkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fYXNsYS5hc2xhX21ldHJpYykgJgorCQkgICAgICAgQVNMQV9NQVNLX01FVFJJQyk7CisJCWxzYXBwID0gbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9wcmVmaXg7CisJCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOworCQlpZiAoayA8IDApCisJCQlnb3RvIHRydW5jOworCQlpZiAoKGxzX29wdCA9ICh1X2NoYXIgKikoKCh1X2NoYXIgKilsc2FwcCkgKyBrKSkgPCBsc19lbmQpIHsKKwkJCXN0cnVjdCBpbjZfYWRkciAqZndkYWRkcjY7CisKKwkJCWlmICgoZmxhZ3MzMiAmIEFTTEFfRkxBR19GV0RBRERSKSAhPSAwKSB7CisJCQkJZndkYWRkcjYgPSAoc3RydWN0IGluNl9hZGRyICopbHNfb3B0OworCQkJCVRDSEVDSygqZndkYWRkcjYpOworCQkJCXByaW50ZigiIGZvcndhcmQgJXMiLAorCQkJCSAgICAgICBpcDZhZGRyX3N0cmluZyhmd2RhZGRyNikpOworCisJCQkJbHNfb3B0ICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQkJfQorCisJCQlpZiAoKGZsYWdzMzIgJiBBU0xBX0ZMQUdfUk9VVEVUQUcpICE9IDApIHsKKwkJCQlUQ0hFQ0soKih1X2ludDMyX3QgKilsc19vcHQpOworCQkJCXByaW50ZigiIHRhZyAlcyIsCisJCQkJICAgICAgIGlwYWRkcl9zdHJpbmcoKHVfaW50MzJfdCAqKWxzX29wdCkpOworCisJCQkJbHNfb3B0ICs9IHNpemVvZih1X2ludDMyX3QpOworCQkJfQorCisJCQlpZiAobHNhcHAtPmxzYV9wX21ieikgeworCQkJCVRDSEVDSygqKHVfaW50MzJfdCAqKWxzX29wdCk7CisJCQkJcHJpbnRmKCIgUmVmTFNJRDogJXMiLAorCQkJCSAgICAgICBpcGFkZHJfc3RyaW5nKCh1X2ludDMyX3QgKilsc19vcHQpKTsKKworCQkJCWxzX29wdCArPSBzaXplb2YodV9pbnQzMl90KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKyNpZiAwCisJY2FzZSBMU19UWVBFX1NVTV9BQlI6CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV90b3NtZXRyaWMpOworCQlscCA9IGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYzsKKwkJd2hpbGUgKCh1X2NoYXIgKilscCA8IGxzX2VuZCkgeworCQkJcmVnaXN0ZXIgdV9pbnQzMl90IHVsOworCisJCQlUQ0hFQ0soKmxwKTsKKwkJCXVsID0gRVhUUkFDVF8zMkJJVFMobHApOworCQkJcHJpbnRmKCIgdG9zICVkIG1ldHJpYyAlZCIsCisJCQkgICAgKHVsICYgU0xBX01BU0tfVE9TKSA+PiBTTEFfU0hJRlRfVE9TLAorCQkJICAgIHVsICYgU0xBX01BU0tfTUVUUklDKTsKKwkJCSsrbHA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfR1JPVVA6CisJCS8qIE11bHRpY2FzdCBleHRlbnNpb25zIGFzIG9mIDIzIEp1bHkgMTk5MSAqLworCQltY3AgPSBsc2FwLT5sc2FfdW4udW5fbWNsYTsKKwkJd2hpbGUgKCh1X2NoYXIgKiltY3AgPCBsc19lbmQpIHsKKwkJCVRDSEVDSyhtY3AtPm1jbGFfdmlkKTsKKwkJCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJm1jcC0+bWNsYV92dHlwZSkpIHsKKworCQkJY2FzZSBNQ0xBX1ZFUlRFWF9ST1VURVI6CisJCQkJcHJpbnRmKCIgcnRyIHJ0cmlkICVzIiwKKwkJCQkgICAgaXBhZGRyX3N0cmluZygmbWNwLT5tY2xhX3ZpZCkpOworCQkJCWJyZWFrOworCisJCQljYXNlIE1DTEFfVkVSVEVYX05FVFdPUks6CisJCQkJcHJpbnRmKCIgbmV0IGRyICVzIiwKKwkJCQkgICAgaXBhZGRyX3N0cmluZygmbWNwLT5tY2xhX3ZpZCkpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiID8/VmVydGV4VHlwZSAldT8/IiwKKwkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJm1jcC0+bWNsYV92dHlwZSkpOworCQkJCWJyZWFrOworCQkJfQorCQkrK21jcDsKKwkJfQorI2VuZGlmCisKKwljYXNlIExTX1RZUEVfTElOSzoKKwkJLyogTGluayBMU0EgKi8KKwkJbGxzYXAgPSAmbHNhcC0+bHNhX3VuLnVuX2xsc2E7CisJCVRDSEVDSyhsbHNhcC0+bGxzYV9vcHRpb25zKTsKKwkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywgRVhUUkFDVF8zMkJJVFMoJmxsc2FwLT5sbHNhX29wdGlvbnMpKTsKKwkJVENIRUNLKGxsc2FwLT5sbHNhX25wcmVmaXgpOworCQlwcmludGYoIiBwcmkgJWQgbGxhZGRyICVzIG5wcmVmICVkIiwgbGxzYXAtPmxsc2FfcHJpb3JpdHksCisJCQlpcDZhZGRyX3N0cmluZygmbGxzYXAtPmxsc2FfbGxhZGRyKSwKKwkJCUVYVFJBQ1RfMzJCSVRTKCZsbHNhcC0+bGxzYV9ucHJlZml4KSk7CisJCWxzYXBwID0gbGxzYXAtPmxsc2FfcHJlZml4OworCQlmb3IgKGogPSAwOyBqIDwgRVhUUkFDVF8zMkJJVFMoJmxsc2FwLT5sbHNhX25wcmVmaXgpOyBqKyspIHsKKwkJCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOworCQkJaWYgKGspCisJCQkJZ290byB0cnVuYzsKKwkJCWxzYXBwID0gKHN0cnVjdCBsc2FfcHJlZml4ICopKCgodV9jaGFyICopbHNhcHApICsgayk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIExTX1RZUEVfSU5UUkFfQVAgfCBMU19TQ09QRV9BUkVBOgorCQkvKiBJbnRyYS1BcmVhLVByZWZpeCBMU0EgKi8KKwkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9pbnRyYV9hcC5pbnRyYV9hcF9ydGlkKTsKKwkJb3NwZjZfcHJpbnRfbHNfdHlwZSgKKwkJCUVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbHN0eXBlKSwKKwkJCSZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbHNpZCwKKwkJCSZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfcnRpZCwKKwkJCSJMaW5rU3RhdGVUeXBlICVkIik7CisJCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbnByZWZpeCk7CisJCXByaW50ZigiIG5wcmVmICVkIiwKKwkJCUVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbnByZWZpeCkpOworCisJCWxzYXBwID0gbHNhcC0+bHNhX3VuLnVuX2ludHJhX2FwLmludHJhX2FwX3ByZWZpeDsKKwkJZm9yIChqID0gMDsKKwkJICAgICBqIDwgRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzYV91bi51bl9pbnRyYV9hcC5pbnRyYV9hcF9ucHJlZml4KTsKKwkJICAgICBqKyspIHsKKwkJCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOworCQkJaWYgKGspCisJCQkJZ290byB0cnVuYzsKKwkJCWxzYXBwID0gKHN0cnVjdCBsc2FfcHJlZml4ICopKCgodV9jaGFyICopbHNhcHApICsgayk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIiA/P0xpbmtTdGF0ZVR5cGUgMHglMDR4Pz8iLAorCQkJRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc190eXBlKSk7CisJfQorCisJCQkJCQkJCS8qIHsgKGN0YWdzKSAqLworCWZwdXRzKCIgfSIsIHN0ZG91dCk7CisJcmV0dXJuICgwKTsKK3RydW5jOgorCWZwdXRzKCIgfSIsIHN0ZG91dCk7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorb3NwZjZfZGVjb2RlX3YzKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBvc3BmNmhkciAqb3AsCisgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpkYXRhZW5kKQoreworCXJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmFwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc3IgKmxzcnA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYV9oZHIgKmxzaHA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYSAqbHNhcDsKKwlyZWdpc3RlciBjaGFyIHNlcDsKKwlyZWdpc3RlciBpbnQgaTsKKworCXN3aXRjaCAob3AtPm9zcGY2X3R5cGUpIHsKKworCWNhc2UgT1NQRl9UWVBFX1VNRDoKKwkJLyoKKwkJICogUm9iIENvbHR1bidzIHNwZWNpYWwgbW9uaXRvcmluZyBwYWNrZXRzOworCQkgKiBkbyBub3RoaW5nCisJCSAqLworCQlicmVhazsKKworCWNhc2UgT1NQRl9UWVBFX0hFTExPOgorCQlpZiAodmZsYWcpIHsKKwkJCVRDSEVDSyhvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZGVhZGludCk7CisJCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X29wdGlvbl9iaXRzLAorCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fb3B0aW9ucykpOworCQkJcHJpbnRmKCIgaWZpZCAlcyBwcmkgJWQgaW50ICVkIGRlYWQgJXUiLAorCQkJICAgIGlwYWRkcl9zdHJpbmcoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19pZmlkKSwKKwkJCSAgICBvcC0+b3NwZjZfaGVsbG8uaGVsbG9fcHJpb3JpdHksCisJCQkgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19oZWxsb2ludCksCisJCQkgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19kZWFkaW50KSk7CisJCX0KKwkJVENIRUNLKG9wLT5vc3BmNl9oZWxsby5oZWxsb19kcik7CisJCWlmIChvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZHIgIT0gMCkKKwkJCXByaW50ZigiIGRyICVzIiwKKwkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZHIpKTsKKwkJVENIRUNLKG9wLT5vc3BmNl9oZWxsby5oZWxsb19iZHIpOworCQlpZiAob3AtPm9zcGY2X2hlbGxvLmhlbGxvX2JkciAhPSAwKQorCQkJcHJpbnRmKCIgYmRyICVzIiwKKwkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fYmRyKSk7CisJCWlmICh2ZmxhZykgeworCQkJcHJpbnRmKCIgbmJycyIpOworCQkJYXAgPSBvcC0+b3NwZjZfaGVsbG8uaGVsbG9fbmVpZ2hib3I7CisJCQl3aGlsZSAoKHVfY2hhciAqKWFwIDwgZGF0YWVuZCkgeworCQkJCVRDSEVDSygqYXApOworCQkJCXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZyhhcCkpOworCQkJCSsrYXA7CisJCQl9CisJCX0KKwkJYnJlYWs7CS8qIEhFTExPICovCisKKwljYXNlIE9TUEZfVFlQRV9EQjoKKwkJVENIRUNLKG9wLT5vc3BmNl9kYi5kYl9vcHRpb25zKTsKKwkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKKwkJCUVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZjZfZGIuZGJfb3B0aW9ucykpOworCQlzZXAgPSAnICc7CisJCVRDSEVDSyhvcC0+b3NwZjZfZGIuZGJfZmxhZ3MpOworCQlpZiAob3AtPm9zcGY2X2RiLmRiX2ZsYWdzICYgT1NQRjZfREJfSU5JVCkgeworCQkJcHJpbnRmKCIlY0kiLCBzZXApOworCQkJc2VwID0gJy8nOworCQl9CisJCWlmIChvcC0+b3NwZjZfZGIuZGJfZmxhZ3MgJiBPU1BGNl9EQl9NT1JFKSB7CisJCQlwcmludGYoIiVjTSIsIHNlcCk7CisJCQlzZXAgPSAnLyc7CisJCX0KKwkJaWYgKG9wLT5vc3BmNl9kYi5kYl9mbGFncyAmIE9TUEY2X0RCX01BU1RFUikgeworCQkJcHJpbnRmKCIlY01TIiwgc2VwKTsKKwkJCXNlcCA9ICcvJzsKKwkJfQorCQlUQ0hFQ0sob3AtPm9zcGY2X2RiLmRiX3NlcSk7CisJCXByaW50ZigiIG10dSAldSBTICVYIiwgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9kYi5kYl9tdHUpLAorCQkJRVhUUkFDVF8zMkJJVFMoJm9wLT5vc3BmNl9kYi5kYl9zZXEpKTsKKworCQlpZiAodmZsYWcpIHsKKwkJCS8qIFByaW50IGFsbCB0aGUgTFMgYWR2J3MgKi8KKwkJCWxzaHAgPSBvcC0+b3NwZjZfZGIuZGJfbHNoZHI7CisKKwkJCXdoaWxlICghb3NwZjZfcHJpbnRfbHNoZHIobHNocCkpIHsKKwkJCQkJCQkvKiB7IChjdGFncykgKi8KKwkJCQlwcmludGYoIiB9Iik7CisJCQkJKytsc2hwOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBPU1BGX1RZUEVfTFNSOgorCQlpZiAodmZsYWcpIHsKKwkJCWxzcnAgPSBvcC0+b3NwZjZfbHNyOworCQkJd2hpbGUgKCh1X2NoYXIgKilsc3JwIDwgZGF0YWVuZCkgeworCQkJCVRDSEVDSygqbHNycCk7CisJCQkJcHJpbnRmKCIgeyIpOwkJLyogfSAoY3RhZ3MpICovCisJCQkJb3NwZjZfcHJpbnRfbHNfdHlwZShFWFRSQUNUXzE2QklUUygmbHNycC0+bHNfdHlwZSksCisJCQkJICAgICZsc3JwLT5sc19zdGF0ZWlkLAorCQkJCSAgICAmbHNycC0+bHNfcm91dGVyLAorCQkJCSAgICAiTGlua1N0YXRlVHlwZSAlZCIpOworCQkJCQkJCS8qIHsgKGN0YWdzKSAqLworCQkJCXByaW50ZigiIH0iKTsKKwkJCQkrK2xzcnA7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9TUEZfVFlQRV9MU1U6CisJCWlmICh2ZmxhZykgeworCQkJbHNhcCA9IG9wLT5vc3BmNl9sc3UubHN1X2xzYTsKKwkJCVRDSEVDSyhvcC0+b3NwZjZfbHN1LmxzdV9jb3VudCk7CisJCQlpID0gRVhUUkFDVF8zMkJJVFMoJm9wLT5vc3BmNl9sc3UubHN1X2NvdW50KTsKKwkJCXdoaWxlIChpLS0pIHsKKwkJCQlpZiAob3NwZjZfcHJpbnRfbHNhKGxzYXApKQorCQkJCQlnb3RvIHRydW5jOworCQkJCWxzYXAgPSAoc3RydWN0IGxzYSAqKSgodV9jaGFyICopbHNhcCArCisJCQkJICAgIEVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc19oZHIubHNfbGVuZ3RoKSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKworCWNhc2UgT1NQRl9UWVBFX0xTQToKKwkJaWYgKHZmbGFnKSB7CisJCQlsc2hwID0gb3AtPm9zcGY2X2xzYS5sc2FfbHNoZHI7CisKKwkJCXdoaWxlICghb3NwZjZfcHJpbnRfbHNoZHIobHNocCkpIHsKKwkJCQkJCQkvKiB7IChjdGFncykgKi8KKwkJCQlwcmludGYoIiB9Iik7CisJCQkJKytsc2hwOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCJ2MyB0eXBlICVkIiwgb3AtPm9zcGY2X3R5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK3RydW5jOgorCXJldHVybiAoMSk7Cit9CisKK3ZvaWQKK29zcGY2X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgb3NwZjZoZHIgKm9wOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZGF0YWVuZDsKKwlyZWdpc3RlciBjb25zdCBjaGFyICpjcDsKKworCW9wID0gKHN0cnVjdCBvc3BmNmhkciAqKWJwOworCisJLyogSWYgdGhlIHR5cGUgaXMgdmFsaWQgdHJhbnNsYXRlIGl0LCBvciBqdXN0IHByaW50IHRoZSB0eXBlICovCisJLyogdmFsdWUuICBJZiBpdCdzIG5vdCB2YWxpZCwgc2F5IHNvIGFuZCByZXR1cm4gKi8KKwlUQ0hFQ0sob3AtPm9zcGY2X3R5cGUpOworCWNwID0gdG9rMnN0cih0eXBlMnN0ciwgInR5cGUlZCIsIG9wLT5vc3BmNl90eXBlKTsKKwlwcmludGYoIk9TUEZ2JWQtJXMgJWQ6Iiwgb3AtPm9zcGY2X3ZlcnNpb24sIGNwLCBsZW5ndGgpOworCWlmICgqY3AgPT0gJ3QnKQorCQlyZXR1cm47CisKKwlUQ0hFQ0sob3AtPm9zcGY2X2xlbik7CisJaWYgKGxlbmd0aCAhPSBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGY2X2xlbikpIHsKKwkJcHJpbnRmKCIgW2xlbiAlZF0iLCBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGY2X2xlbikpOworCQlyZXR1cm47CisJfQorCWRhdGFlbmQgPSBicCArIGxlbmd0aDsKKworCS8qIFByaW50IHRoZSByb3V0ZXJpZCBpZiBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHNvdXJjZSAqLworCVRDSEVDSyhvcC0+b3NwZjZfcm91dGVyaWQpOworCXByaW50ZigiIHJ0cmlkICVzIiwgaXBhZGRyX3N0cmluZygmb3AtPm9zcGY2X3JvdXRlcmlkKSk7CisKKwlUQ0hFQ0sob3AtPm9zcGY2X2FyZWFpZCk7CisJaWYgKG9wLT5vc3BmNl9hcmVhaWQgIT0gMCkKKwkJcHJpbnRmKCIgYXJlYSAlcyIsIGlwYWRkcl9zdHJpbmcoJm9wLT5vc3BmNl9hcmVhaWQpKTsKKwllbHNlCisJCXByaW50ZigiIGJhY2tib25lIik7CisJVENIRUNLKG9wLT5vc3BmNl9pbnN0YW5jZWlkKTsKKwlpZiAob3AtPm9zcGY2X2luc3RhbmNlaWQpCisJCXByaW50ZigiIGluc3RhbmNlICV1Iiwgb3AtPm9zcGY2X2luc3RhbmNlaWQpOworCisJLyogRG8gcmVzdCBhY2NvcmRpbmcgdG8gdmVyc2lvbi4JICovCisJc3dpdGNoIChvcC0+b3NwZjZfdmVyc2lvbikgeworCisJY2FzZSAzOgorCQkvKiBvc3BmIHZlcnNpb24gMyAqLworCQlpZiAob3NwZjZfZGVjb2RlX3YzKG9wLCBkYXRhZW5kKSkKKwkJCWdvdG8gdHJ1bmM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgb3NwZiBbdmVyc2lvbiAlZF0iLCBvcC0+b3NwZjZfdmVyc2lvbik7CisJCWJyZWFrOworCX0JCQkvKiBlbmQgc3dpdGNoIG9uIHZlcnNpb24gKi8KKworCXJldHVybjsKK3RydW5jOgorCWZwdXRzKHRzdHIsIHN0ZG91dCk7Cit9CmRpZmYgLS1naXQgYS9wcmludC1wZmxvZy5jIGIvcHJpbnQtcGZsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDliYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtcGZsb2cuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXBmbG9nLmMsdiAxLjEzLjIuNCAyMDA3LzA5LzEzIDE3OjE4OjEwIGdpYW5sdWNhIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9ORVRfUEZWQVJfSAorI2Vycm9yICJObyBwZiBoZWFkZXJzIGF2YWlsYWJsZSIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L3BmdmFyLmg+CisjaW5jbHVkZSA8bmV0L2lmX3BmbG9nLmg+CisKKworCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorCitzdGF0aWMgc3RydWN0IHRvayBwZl9yZWFzb25zW10gPSB7CisJeyAwLAkiMChtYXRjaCkiIH0sCisJeyAxLAkiMShiYWQtb2Zmc2V0KSIgfSwKKwl7IDIsCSIyKGZyYWdtZW50KSIgfSwKKwl7IDMsCSIzKHNob3J0KSIgfSwKKwl7IDQsCSI0KG5vcm1hbGl6ZSkiIH0sCisJeyA1LAkiNShtZW1vcnkpIiB9LAorCXsgNiwJIjYoYmFkLXRpbWVzdGFtcCkiIH0sCisJeyA3LAkiNyhjb25nZXN0aW9uKSIgfSwKKwl7IDgsCSI4KGlwLW9wdGlvbikiIH0sCisJeyA5LAkiOShwcm90by1ja3N1bSkiIH0sCisJeyAxMCwJIjEwKHN0YXRlLW1pc21hdGNoKSIgfSwKKwl7IDExLAkiMTEoc3RhdGUtaW5zZXJ0KSIgfSwKKwl7IDEyLAkiMTIoc3RhdGUtbGltaXQpIiB9LAorCXsgMTMsCSIxMyhzcmMtbGltaXQpIiB9LAorCXsgMTQsCSIxNChzeW5wcm94eSkiIH0sCisJeyAwLAlOVUxMIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHBmX2FjdGlvbnNbXSA9IHsKKwl7IFBGX1BBU1MsCQkicGFzcyIgfSwKKwl7IFBGX0RST1AsCQkiYmxvY2siIH0sCisJeyBQRl9TQ1JVQiwJCSJzY3J1YiIgfSwKKwl7IFBGX05BVCwJCSJuYXQiIH0sCisJeyBQRl9OT05BVCwJCSJuYXQiIH0sCisJeyBQRl9CSU5BVCwJCSJiaW5hdCIgfSwKKwl7IFBGX05PQklOQVQsCQkiYmluYXQiIH0sCisJeyBQRl9SRFIsCQkicmRyIiB9LAorCXsgUEZfTk9SRFIsCQkicmRyIiB9LAorCXsgUEZfU1lOUFJPWFlfRFJPUCwJInN5bnByb3h5LWRyb3AiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgcGZfZGlyZWN0aW9uc1tdID0geworCXsgUEZfSU5PVVQsCSJpbi9vdXQiIH0sCisJeyBQRl9JTiwJImluIiB9LAorCXsgUEZfT1VULAkib3V0IiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworLyogRm9yIHJlYWRpbmcgY2FwdHVyZSBmaWxlcyBvbiBvdGhlciBzeXN0ZW1zICovCisjZGVmaW5lCU9QRU5CU0RfQUZfSU5FVAkJMgorI2RlZmluZQlPUEVOQlNEX0FGX0lORVQ2CTI0CisKK3N0YXRpYyB2b2lkCitwZmxvZ19wcmludChjb25zdCBzdHJ1Y3QgcGZsb2doZHIgKmhkcikKK3sKKwl1X2ludDMyX3QgcnVsZW5yLCBzdWJydWxlbnI7CisKKwlydWxlbnIgPSBudG9obChoZHItPnJ1bGVucik7CisJc3VicnVsZW5yID0gbnRvaGwoaGRyLT5zdWJydWxlbnIpOworCWlmIChzdWJydWxlbnIgPT0gKHVfaW50MzJfdCktMSkKKwkJcHJpbnRmKCJydWxlICV1LyIsIHJ1bGVucik7CisJZWxzZQorCQlwcmludGYoInJ1bGUgJXUuJXMuJXUvIiwgcnVsZW5yLCBoZHItPnJ1bGVzZXQsIHN1YnJ1bGVucik7CisKKwlwcmludGYoIiVzOiAlcyAlcyBvbiAlczogIiwKKwkgICAgdG9rMnN0cihwZl9yZWFzb25zLCAidW5rbigldSkiLCBoZHItPnJlYXNvbiksCisJICAgIHRvazJzdHIocGZfYWN0aW9ucywgInVua24oJXUpIiwgaGRyLT5hY3Rpb24pLAorCSAgICB0b2syc3RyKHBmX2RpcmVjdGlvbnMsICJ1bmtuKCV1KSIsIGhkci0+ZGlyKSwKKwkgICAgaGRyLT5pZm5hbWUpOworfQorCit1X2ludAorcGZsb2dfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXVfaW50IGhkcmxlbjsKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJY29uc3Qgc3RydWN0IHBmbG9naGRyICpoZHI7CisJdV9pbnQ4X3QgYWY7CisKKwkvKiBjaGVjayBsZW5ndGggKi8KKwlpZiAoY2FwbGVuIDwgc2l6ZW9mKHVfaW50OF90KSkgeworCQlwcmludGYoIlt8cGZsb2ddIik7CisJCXJldHVybiAoY2FwbGVuKTsKKwl9CisKKyNkZWZpbmUgTUlOX1BGTE9HX0hEUkxFTgk0NQorCWhkciA9IChzdHJ1Y3QgcGZsb2doZHIgKilwOworCWlmIChoZHItPmxlbmd0aCA8IE1JTl9QRkxPR19IRFJMRU4pIHsKKwkJcHJpbnRmKCJbcGZsb2c6IGludmFsaWQgaGVhZGVyIGxlbmd0aCFdIik7CisJCXJldHVybiAoaGRyLT5sZW5ndGgpOwkvKiBYWFg6IG5vdCByZWFsbHkgKi8KKwl9CisJaGRybGVuID0gQlBGX1dPUkRBTElHTihoZHItPmxlbmd0aCk7CisKKwlpZiAoY2FwbGVuIDwgaGRybGVuKSB7CisJCXByaW50ZigiW3xwZmxvZ10iKTsKKwkJcmV0dXJuIChoZHJsZW4pOwkvKiBYWFg6IHRydWU/ICovCisJfQorCisJLyogcHJpbnQgd2hhdCB3ZSBrbm93ICovCisJaGRyID0gKHN0cnVjdCBwZmxvZ2hkciAqKXA7CisJVENIRUNLKCpoZHIpOworCWlmIChlZmxhZykKKwkJcGZsb2dfcHJpbnQoaGRyKTsKKwkKKwkvKiBza2lwIHRvIHRoZSByZWFsIHBhY2tldCAqLworCWFmID0gaGRyLT5hZjsKKwlsZW5ndGggLT0gaGRybGVuOworCWNhcGxlbiAtPSBoZHJsZW47CisJcCArPSBoZHJsZW47CisJc3dpdGNoIChhZikgeworCisJCWNhc2UgQUZfSU5FVDoKKyNpZiBPUEVOQlNEX0FGX0lORVQgIT0gQUZfSU5FVAorCQljYXNlIE9QRU5CU0RfQUZfSU5FVDoJCS8qIFhYWDogcmVhZCBwY2FwIGZpbGVzICovCisjZW5kaWYKKwkJICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOworCQkJYnJlYWs7CisKKyNpZmRlZiBJTkVUNgorCQljYXNlIEFGX0lORVQ2OgorI2lmIE9QRU5CU0RfQUZfSU5FVDYgIT0gQUZfSU5FVDYKKwkJY2FzZSBPUEVOQlNEX0FGX0lORVQ2OgkJLyogWFhYOiByZWFkIHBjYXAgZmlsZXMgKi8KKyNlbmRpZgorCQkJaXA2X3ByaW50KHAsIGxlbmd0aCk7CisJCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJLyogYWRkcmVzcyBmYW1pbHkgbm90IGhhbmRsZWQsIHByaW50IHJhdyBwYWNrZXQgKi8KKwkJaWYgKCFlZmxhZykKKwkJCXBmbG9nX3ByaW50KGhkcik7CisJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwl9CisJCisJcmV0dXJuIChoZHJsZW4pOwordHJ1bmM6CisJcHJpbnRmKCJbfHBmbG9nXSIpOworCXJldHVybiAoaGRybGVuKTsKK30KKworLyoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGMtc3R5bGU6IHdoaXRlc21pdGgKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3ByaW50LXBnbS5jIGIvcHJpbnQtcGdtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZjkzMwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXBnbS5jCkBAIC0wLDAgKzEsNzU5IEBACisvKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgQW5keSBIZWZmZXJuYW4gKGFoaEBqdW5pcGVyLm5ldCkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1wZ20uYyx2IDEuMS4yLjUgMjAwNS8wNi8wNyAyMjowNjoxNiBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworI2luY2x1ZGUgImlwLmgiCisjaWZkZWYgSU5FVDYKKyNpbmNsdWRlICJpcDYuaCIKKyNlbmRpZgorI2luY2x1ZGUgImlwcHJvdG8uaCIKKworLyoKKyAqIFBHTSBoZWFkZXIgKFJGQyAzMjA4KQorICovCitzdHJ1Y3QgcGdtX2hlYWRlciB7CisgICAgdV9pbnQxNl90CXBnbV9zcG9ydDsKKyAgICB1X2ludDE2X3QJcGdtX2Rwb3J0OworICAgIHVfaW50OF90CXBnbV90eXBlOworICAgIHVfaW50OF90CXBnbV9vcHRpb25zOworICAgIHVfaW50MTZfdAlwZ21fc3VtOworICAgIHVfaW50OF90CXBnbV9nc2lkWzZdOworICAgIHVfaW50MTZfdAlwZ21fbGVuZ3RoOworfTsKKworc3RydWN0IHBnbV9zcG0geworICAgIHVfaW50MzJfdAlwZ21zX3NlcTsKKyAgICB1X2ludDMyX3QJcGdtc190cmFpbHNlcTsKKyAgICB1X2ludDMyX3QJcGdtc19sZWFkc2VxOworICAgIHVfaW50MTZfdAlwZ21zX25sYV9hZmk7CisgICAgdV9pbnQxNl90CXBnbXNfcmVzZXJ2ZWQ7CisgICAgLyogLi4uIHVfaW50OF90CXBnbXNfbmxhWzBdOyAqLworICAgIC8qIC4uLiBvcHRpb25zICovCit9OworCitzdHJ1Y3QgcGdtX25hayB7CisgICAgdV9pbnQzMl90CXBnbW5fc2VxOworICAgIHVfaW50MTZfdAlwZ21uX3NvdXJjZV9hZmk7CisgICAgdV9pbnQxNl90CXBnbW5fcmVzZXJ2ZWQ7CisgICAgLyogLi4uIHVfaW50OF90CXBnbW5fc291cmNlWzBdOyAqLworICAgIC8qIC4uLiB1X2ludDE2X3QJcGdtbl9ncm91cF9hZmkgKi8KKyAgICAvKiAuLi4gdV9pbnQxNl90CXBnbW5fcmVzZXJ2ZWQyOyAqLworICAgIC8qIC4uLiB1X2ludDhfdAlwZ21uX2dyb3VwWzBdOyAqLworICAgIC8qIC4uLiBvcHRpb25zICovCit9OworCitzdHJ1Y3QgcGdtX3BvbGwgeworICAgIHVfaW50MzJfdAlwZ21wX3NlcTsKKyAgICB1X2ludDE2X3QJcGdtcF9yb3VuZDsKKyAgICB1X2ludDE2X3QJcGdtcF9yZXNlcnZlZDsKKyAgICAvKiAuLi4gb3B0aW9ucyAqLworfTsKKworc3RydWN0IHBnbV9wb2xyIHsKKyAgICB1X2ludDMyX3QJcGdtcF9zZXE7CisgICAgdV9pbnQxNl90CXBnbXBfcm91bmQ7CisgICAgdV9pbnQxNl90CXBnbXBfc3VidHlwZTsKKyAgICB1X2ludDE2X3QJcGdtcF9ubGFfYWZpOworICAgIHVfaW50MTZfdAlwZ21wX3Jlc2VydmVkOworICAgIC8qIC4uLiB1X2ludDhfdAlwZ21wX25sYVswXTsgKi8KKyAgICAvKiAuLi4gb3B0aW9ucyAqLworfTsKKworc3RydWN0IHBnbV9kYXRhIHsKKyAgICB1X2ludDMyX3QJcGdtZF9zZXE7CisgICAgdV9pbnQzMl90CXBnbWRfdHJhaWxzZXE7CisgICAgLyogLi4uIG9wdGlvbnMgKi8KK307CisKK3R5cGVkZWYgZW51bSBfcGdtX3R5cGUgeworICAgIFBHTV9TUE0gPSAwLAkJLyogc291cmNlIHBhdGggbWVzc2FnZSAqLworICAgIFBHTV9QT0xMID0gMSwJCS8qIFBPTEwgUmVxdWVzdCAqLworICAgIFBHTV9QT0xSID0gMiwJCS8qIFBPTEwgUmVzcG9uc2UgKi8KKyAgICBQR01fT0RBVEEgPSA0LAkJLyogb3JpZ2luYWwgZGF0YSAqLworICAgIFBHTV9SREFUQSA9IDUsCQkvKiByZXBhaXIgZGF0YSAqLworICAgIFBHTV9OQUsgPSA4LAkJLyogTkFLICovCisgICAgUEdNX05VTExOQUsgPSA5LAkJLyogTnVsbCBOQUsgKi8KKyAgICBQR01fTkNGID0gMTAsCQkvKiBOQUsgQ29uZmlybWF0aW9uICovCisgICAgUEdNX0FDSyA9IDExLAkJLyogQUNLIGZvciBjb25nZXN0aW9uIGNvbnRyb2wgKi8KKyAgICBQR01fU1BNUiA9IDEyLAkJLyogU1BNIHJlcXVlc3QgKi8KKyAgICBQR01fTUFYID0gMjU1Cit9IHBnbV90eXBlOworCisjZGVmaW5lIFBHTV9PUFRfQklUX1BSRVNFTlQJMHgwMQorI2RlZmluZSBQR01fT1BUX0JJVF9ORVRXT1JLCTB4MDIKKyNkZWZpbmUgUEdNX09QVF9CSVRfVkFSX1BLVExFTgkweDQwCisjZGVmaW5lIFBHTV9PUFRfQklUX1BBUklUWQkweDgwCisKKyNkZWZpbmUgUEdNX09QVF9MRU5HVEgJCTB4MDAKKyNkZWZpbmUgUEdNX09QVF9GUkFHTUVOVCAgICAgICAgMHgwMQorI2RlZmluZSBQR01fT1BUX05BS19MSVNUICAgICAgICAweDAyCisjZGVmaW5lIFBHTV9PUFRfSk9JTiAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUEdNX09QVF9OQUtfQk9fSVZMCTB4MDQKKyNkZWZpbmUgUEdNX09QVF9OQUtfQk9fUk5HCTB4MDUKKworI2RlZmluZSBQR01fT1BUX1JFRElSRUNUICAgICAgICAweDA3CisjZGVmaW5lIFBHTV9PUFRfUEFSSVRZX1BSTSAgICAgIDB4MDgKKyNkZWZpbmUgUEdNX09QVF9QQVJJVFlfR1JQICAgICAgMHgwOQorI2RlZmluZSBQR01fT1BUX0NVUlJfVEdTSVpFICAgICAweDBBCisjZGVmaW5lIFBHTV9PUFRfTkJSX1VOUkVBQ0gJMHgwQgorI2RlZmluZSBQR01fT1BUX1BBVEhfTkxBCTB4MEMKKworI2RlZmluZSBQR01fT1BUX1NZTiAgICAgICAgICAgICAweDBECisjZGVmaW5lIFBHTV9PUFRfRklOICAgICAgICAgICAgIDB4MEUKKyNkZWZpbmUgUEdNX09QVF9SU1QgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBQR01fT1BUX0NSCQkweDEwCisjZGVmaW5lIFBHTV9PUFRfQ1JRU1QJCTB4MTEKKyAgICAgCisjZGVmaW5lIFBHTV9PUFRfTUFTSwkJMHg3ZgorCisjZGVmaW5lIFBHTV9PUFRfRU5ECQkweDgwICAgIC8qIGVuZCBvZiBvcHRpb25zIG1hcmtlciAqLworCisjZGVmaW5lIFBHTV9NSU5fT1BUX0xFTgkJNAorCisjaWZuZGVmIEFGSV9JUAorI2RlZmluZSBBRklfSVAJCTEKKyNkZWZpbmUgQUZJX0lQNgkgICAgICAgIDIKKyNlbmRpZgorCit2b2lkCitwZ21fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAorCSAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicDIpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHBnbV9oZWFkZXIgKnBnbTsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXAgKmlwOworCXJlZ2lzdGVyIGNoYXIgY2g7CisJdV9pbnQxNl90IHNwb3J0LCBkcG9ydDsKKwlpbnQgYWRkcl9zaXplOworCWNvbnN0IHZvaWQgKm5sYTsKKwlpbnQgbmxhX2FmOworI2lmZGVmIElORVQ2CisJY2hhciBubGFfYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDY7CisjZWxzZQorCWNoYXIgbmxhX2J1ZltJTkVUX0FERFJTVFJMRU5dOworI2VuZGlmCisJdV9pbnQ4X3Qgb3B0X3R5cGUsIG9wdF9sZW4sIGZsYWdzMSwgZmxhZ3MyOworCXVfaW50MzJfdCBzZXEsIG9wdHNfbGVuLCBsZW4sIG9mZnNldDsKKworCXBnbSA9IChzdHJ1Y3QgcGdtX2hlYWRlciAqKWJwOworCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKKyNpZmRlZiBJTkVUNgorCWlmIChJUF9WKGlwKSA9PSA2KQorCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7CisJZWxzZQorCQlpcDYgPSBOVUxMOworI2Vsc2UgLyogSU5FVDYgKi8KKwlpZiAoSVBfVihpcCkgPT0gNikgeworCQkodm9pZClwcmludGYoIkNhbid0IGhhbmRsZSBJUHY2Iik7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogSU5FVDYgKi8KKwljaCA9ICdcMCc7CisJaWYgKCFUVEVTVChwZ20tPnBnbV9kcG9ydCkpIHsKKyNpZmRlZiBJTkVUNgorCQlpZiAoaXA2KSB7CisJCQkodm9pZClwcmludGYoIiVzID4gJXM6IFt8cGdtXSIsCisJCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCisJCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X2RzdCkpOworCQkJcmV0dXJuOworCQl9IGVsc2UKKyNlbmRpZiAvKiBJTkVUNiAqLworCQl7CisJCQkodm9pZClwcmludGYoIiVzID4gJXM6IFt8cGdtXSIsCisJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksCisJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCkpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJc3BvcnQgPSBFWFRSQUNUXzE2QklUUygmcGdtLT5wZ21fc3BvcnQpOworCWRwb3J0ID0gRVhUUkFDVF8xNkJJVFMoJnBnbS0+cGdtX2Rwb3J0KTsKKworI2lmZGVmIElORVQ2CisJaWYgKGlwNikgeworCQlpZiAoaXA2LT5pcDZfbnh0ID09IElQUFJPVE9fUEdNKSB7CisJCQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsCisJCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCisJCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLAorCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLAorCQkJCXRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCX0gZWxzZSB7CisJCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsCisJCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLCB0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOworCQl9CisJfSBlbHNlCisjZW5kaWYgLypJTkVUNiovCisJeworCQlpZiAoaXAtPmlwX3AgPT0gSVBQUk9UT19QR00pIHsKKwkJCSh2b2lkKXByaW50ZigiJXMuJXMgPiAlcy4lczogIiwKKwkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKKwkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksCisJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCksCisJCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKKwkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksIHRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCX0KKwl9CisKKwlUQ0hFQ0soKnBnbSk7CisKKyAgICAgICAgKHZvaWQpcHJpbnRmKCJQR00sIGxlbmd0aCAldSIsIHBnbS0+cGdtX2xlbmd0aCk7CisKKyAgICAgICAgaWYgKCF2ZmxhZykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobGVuZ3RoID4gcGdtLT5wZ21fbGVuZ3RoKQorICAgICAgICAgICAgbGVuZ3RoID0gcGdtLT5wZ21fbGVuZ3RoOworCisJKHZvaWQpcHJpbnRmKCIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIiwKKwkJICAgICBwZ20tPnBnbV9nc2lkWzBdLAorICAgICAgICAgICAgICAgICAgICAgcGdtLT5wZ21fZ3NpZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIHBnbS0+cGdtX2dzaWRbMl0sCisJCSAgICAgcGdtLT5wZ21fZ3NpZFszXSwKKyAgICAgICAgICAgICAgICAgICAgIHBnbS0+cGdtX2dzaWRbNF0sCisgICAgICAgICAgICAgICAgICAgICBwZ20tPnBnbV9nc2lkWzVdKTsKKwlzd2l0Y2ggKHBnbS0+cGdtX3R5cGUpIHsKKwljYXNlIFBHTV9TUE06IHsKKwkgICAgc3RydWN0IHBnbV9zcG0gKnNwbTsKKworCSAgICBzcG0gPSAoc3RydWN0IHBnbV9zcG0gKikocGdtICsgMSk7CisJICAgIFRDSEVDSygqc3BtKTsKKworCSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKCZzcG0tPnBnbXNfbmxhX2FmaSkpIHsKKwkgICAgY2FzZSBBRklfSVA6CisJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCW5sYV9hZiA9IEFGX0lORVQ7CisJCWJyZWFrOworI2lmZGVmIElORVQ2CisJICAgIGNhc2UgQUZJX0lQNjoKKwkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCW5sYV9hZiA9IEFGX0lORVQ2OworCQlicmVhazsKKyNlbmRpZgorCSAgICBkZWZhdWx0OgorCQlnb3RvIHRydW5jOworCQlicmVhazsKKwkgICAgfQorCSAgICBicCA9ICh1X2NoYXIgKikgKHNwbSArIDEpOworCSAgICBUQ0hFQ0syKCpicCwgYWRkcl9zaXplKTsKKwkgICAgbmxhID0gYnA7CisJICAgIGJwICs9IGFkZHJfc2l6ZTsKKworCSAgICBpbmV0X250b3AobmxhX2FmLCBubGEsIG5sYV9idWYsIHNpemVvZihubGFfYnVmKSk7CisJICAgICh2b2lkKXByaW50ZigiU1BNIHNlcSAldSB0cmFpbCAldSBsZWFkICV1IG5sYSAlcyIsCisJCQkgRVhUUkFDVF8zMkJJVFMoJnNwbS0+cGdtc19zZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzcG0tPnBnbXNfdHJhaWxzZXEpLAorCQkJIEVYVFJBQ1RfMzJCSVRTKCZzcG0tPnBnbXNfbGVhZHNlcSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmxhX2J1Zik7CisJICAgIGJyZWFrOworCX0KKworCWNhc2UgUEdNX1BPTEw6IHsKKwkgICAgc3RydWN0IHBnbV9wb2xsICpwb2xsOworCisJICAgIHBvbGwgPSAoc3RydWN0IHBnbV9wb2xsICopKHBnbSArIDEpOworCSAgICBUQ0hFQ0soKnBvbGwpOworCSAgICAodm9pZClwcmludGYoIlBPTEwgc2VxICV1IHJvdW5kICV1IiwKKwkJCSBFWFRSQUNUXzMyQklUUygmcG9sbC0+cGdtcF9zZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZwb2xsLT5wZ21wX3JvdW5kKSk7CisJICAgIGJwID0gKHVfY2hhciAqKSAocG9sbCArIDEpOworCSAgICBicmVhazsKKwl9CisJY2FzZSBQR01fUE9MUjogeworCSAgICBzdHJ1Y3QgcGdtX3BvbHIgKnBvbHI7CisJICAgIHVfaW50MzJfdCBpdmwsIHJuZCwgbWFzazsKKworCSAgICBwb2xyID0gKHN0cnVjdCBwZ21fcG9sciAqKShwZ20gKyAxKTsKKwkgICAgVENIRUNLKCpwb2xyKTsKKworCSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKCZwb2xyLT5wZ21wX25sYV9hZmkpKSB7CisJICAgIGNhc2UgQUZJX0lQOgorCQlhZGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQlubGFfYWYgPSBBRl9JTkVUOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCSAgICBjYXNlIEFGSV9JUDY6CisJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQlubGFfYWYgPSBBRl9JTkVUNjsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgZGVmYXVsdDoKKwkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnAgPSAodV9jaGFyICopIChwb2xyICsgMSk7CisJICAgIFRDSEVDSzIoKmJwLCBhZGRyX3NpemUpOworCSAgICBubGEgPSBicDsKKwkgICAgYnAgKz0gYWRkcl9zaXplOworCisJICAgIGluZXRfbnRvcChubGFfYWYsIG5sYSwgbmxhX2J1Ziwgc2l6ZW9mKG5sYV9idWYpKTsKKworCSAgICBUQ0hFQ0syKCpicCwgc2l6ZW9mKHVfaW50MzJfdCkpOworCSAgICBpdmwgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOworCisJICAgIFRDSEVDSzIoKmJwLCBzaXplb2YodV9pbnQzMl90KSk7CisJICAgIHJuZCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisKKwkgICAgVENIRUNLMigqYnAsIHNpemVvZih1X2ludDMyX3QpKTsKKwkgICAgbWFzayA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisKKwkgICAgKHZvaWQpcHJpbnRmKCJQT0xSIHNlcSAldSByb3VuZCAldSBubGEgJXMgaXZsICV1IHJuZCAweCUwOHggIgorCQkJICJtYXNrIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKCZwb2xyLT5wZ21wX3NlcSksCisJCQkgRVhUUkFDVF8xNkJJVFMoJnBvbHItPnBnbXBfcm91bmQpLCBubGFfYnVmLCBpdmwsIHJuZCwgbWFzayk7CisJICAgIGJyZWFrOworCX0KKwljYXNlIFBHTV9PREFUQTogeworCSAgICBzdHJ1Y3QgcGdtX2RhdGEgKm9kYXRhOworCisJICAgIG9kYXRhID0gKHN0cnVjdCBwZ21fZGF0YSAqKShwZ20gKyAxKTsKKwkgICAgVENIRUNLKCpvZGF0YSk7CisJICAgICh2b2lkKXByaW50ZigiT0RBVEEgdHJhaWwgJXUgc2VxICV1IiwKKwkJCSBFWFRSQUNUXzMyQklUUygmb2RhdGEtPnBnbWRfdHJhaWxzZXEpLAorCQkJIEVYVFJBQ1RfMzJCSVRTKCZvZGF0YS0+cGdtZF9zZXEpKTsKKwkgICAgYnAgPSAodV9jaGFyICopIChvZGF0YSArIDEpOworCSAgICBicmVhazsKKwl9CisKKwljYXNlIFBHTV9SREFUQTogeworCSAgICBzdHJ1Y3QgcGdtX2RhdGEgKnJkYXRhOworCisJICAgIHJkYXRhID0gKHN0cnVjdCBwZ21fZGF0YSAqKShwZ20gKyAxKTsKKwkgICAgVENIRUNLKCpyZGF0YSk7CisJICAgICh2b2lkKXByaW50ZigiUkRBVEEgdHJhaWwgJXUgc2VxICV1IiwKKwkJCSBFWFRSQUNUXzMyQklUUygmcmRhdGEtPnBnbWRfdHJhaWxzZXEpLAorCQkJIEVYVFJBQ1RfMzJCSVRTKCZyZGF0YS0+cGdtZF9zZXEpKTsKKwkgICAgYnAgPSAodV9jaGFyICopIChyZGF0YSArIDEpOworCSAgICBicmVhazsKKwl9CisKKwljYXNlIFBHTV9OQUs6CisJY2FzZSBQR01fTlVMTE5BSzoKKwljYXNlIFBHTV9OQ0Y6IHsKKwkgICAgc3RydWN0IHBnbV9uYWsgKm5hazsKKwkgICAgY29uc3Qgdm9pZCAqc291cmNlLCAqZ3JvdXA7CisJICAgIGludCBzb3VyY2VfYWYsIGdyb3VwX2FmOworI2lmZGVmIElORVQ2CisJICAgIGNoYXIgc291cmNlX2J1ZltJTkVUNl9BRERSU1RSTEVOXSwgZ3JvdXBfYnVmW0lORVQ2X0FERFJTVFJMRU5dOworI2Vsc2UKKwkgICAgY2hhciBzb3VyY2VfYnVmW0lORVRfQUREUlNUUkxFTl0sIGdyb3VwX2J1ZltJTkVUX0FERFJTVFJMRU5dOworI2VuZGlmCisKKwkgICAgbmFrID0gKHN0cnVjdCBwZ21fbmFrICopKHBnbSArIDEpOworCSAgICBUQ0hFQ0soKm5hayk7CisKKwkgICAgLyoKKwkgICAgICogU2tpcCBwYXN0IHRoZSBzb3VyY2UsIHNhdmluZyBpbmZvIGFsb25nIHRoZSB3YXkKKwkgICAgICogYW5kIHN0b3BwaW5nIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoLgorCSAgICAgKi8KKwkgICAgc3dpdGNoIChFWFRSQUNUXzE2QklUUygmbmFrLT5wZ21uX3NvdXJjZV9hZmkpKSB7CisJICAgIGNhc2UgQUZJX0lQOgorCQlhZGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQlzb3VyY2VfYWYgPSBBRl9JTkVUOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCSAgICBjYXNlIEFGSV9JUDY6CisJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQlzb3VyY2VfYWYgPSBBRl9JTkVUNjsKKwkJYnJlYWs7CisjZW5kaWYKKwkgICAgZGVmYXVsdDoKKwkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnAgPSAodV9jaGFyICopIChuYWsgKyAxKTsKKwkgICAgVENIRUNLMigqYnAsIGFkZHJfc2l6ZSk7CisJICAgIHNvdXJjZSA9IGJwOworCSAgICBicCArPSBhZGRyX3NpemU7CisKKwkgICAgLyoKKwkgICAgICogU2tpcCBwYXN0IHRoZSBncm91cCwgc2F2aW5nIGluZm8gYWxvbmcgdGhlIHdheQorCSAgICAgKiBhbmQgc3RvcHBpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2guCisJICAgICAqLworCSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKGJwKSkgeworCSAgICBjYXNlIEFGSV9JUDoKKwkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJZ3JvdXBfYWYgPSBBRl9JTkVUOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCSAgICBjYXNlIEFGSV9JUDY6CisJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQlncm91cF9hZiA9IEFGX0lORVQ2OworCQlicmVhazsKKyNlbmRpZgorCSAgICBkZWZhdWx0OgorCQlnb3RvIHRydW5jOworCQlicmVhazsKKwkgICAgfQorCSAgICBicCArPSAoMiAqIHNpemVvZih1X2ludDE2X3QpKTsKKwkgICAgVENIRUNLMigqYnAsIGFkZHJfc2l6ZSk7CisJICAgIGdyb3VwID0gYnA7CisJICAgIGJwICs9IGFkZHJfc2l6ZTsKKworCSAgICAvKgorCSAgICAgKiBPcHRpb25zIGRlY29kaW5nIGNhbiBnbyBoZXJlLgorCSAgICAgKi8KKwkgICAgaW5ldF9udG9wKHNvdXJjZV9hZiwgc291cmNlLCBzb3VyY2VfYnVmLCBzaXplb2Yoc291cmNlX2J1ZikpOworCSAgICBpbmV0X250b3AoZ3JvdXBfYWYsIGdyb3VwLCBncm91cF9idWYsIHNpemVvZihncm91cF9idWYpKTsKKwkgICAgc3dpdGNoIChwZ20tPnBnbV90eXBlKSB7CisJCWNhc2UgUEdNX05BSzoKKwkJICAgICh2b2lkKXByaW50ZigiTkFLICIpOworCQkgICAgYnJlYWs7CisJCWNhc2UgUEdNX05VTExOQUs6CisJCSAgICAodm9pZClwcmludGYoIk5OQUsgIik7CisJCSAgICBicmVhazsKKwkJY2FzZSBQR01fTkNGOgorCQkgICAgKHZvaWQpcHJpbnRmKCJOQ0YgIik7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJICAgIH0KKwkgICAgKHZvaWQpcHJpbnRmKCIoJXMgLT4gJXMpLCBzZXEgJXUiLAorCQkJIHNvdXJjZV9idWYsIGdyb3VwX2J1ZiwgRVhUUkFDVF8zMkJJVFMoJm5hay0+cGdtbl9zZXEpKTsKKwkgICAgYnJlYWs7CisJfQorCisJY2FzZSBQR01fU1BNUjoKKwkgICAgKHZvaWQpcHJpbnRmKCJTUE1SIik7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgKHZvaWQpcHJpbnRmKCJVTktOT1dOIHR5cGUgJTB4MDJ4IiwgcGdtLT5wZ21fdHlwZSk7CisJICAgIGJyZWFrOworCisJfQorCWlmIChwZ20tPnBnbV9vcHRpb25zICYgUEdNX09QVF9CSVRfUFJFU0VOVCkgeyAgICAgIAorCisJICAgIC8qCisJICAgICAqIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCBmb3IgdGhlIGZpcnN0IG9wdGlvbiBoZWFkZXIKKwkgICAgICovCisJICAgIGlmICghVFRFU1QyKCpicCwgUEdNX01JTl9PUFRfTEVOKSkgeworCQkodm9pZClwcmludGYoIlt8T1BUXSIpOworCQlyZXR1cm47CisJICAgIH0gCisKKwkgICAgLyoKKwkgICAgICogVGhhdCBvcHRpb24gaGVhZGVyIE1VU1QgYmUgYW4gT1BUX0xFTkdUSCBvcHRpb24KKwkgICAgICogKHNlZSB0aGUgZmlyc3QgcGFyYWdyYXBoIG9mIHNlY3Rpb24gOS4xIGluIFJGQyAzMjA4KS4KKwkgICAgICovCisJICAgIG9wdF90eXBlID0gKmJwKys7CisJICAgIGlmICgob3B0X3R5cGUgJiBQR01fT1BUX01BU0spICE9IFBHTV9PUFRfTEVOR1RIKSB7CisJCSh2b2lkKXByaW50ZigiW0ZpcnN0IG9wdGlvbiBiYWQsIHNob3VsZCBiZSBQR01fT1BUX0xFTkdUSCwgaXMgJXVdIiwgb3B0X3R5cGUgJiBQR01fT1BUX01BU0spOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgb3B0X2xlbiA9ICpicCsrOworCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7CisJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfTEVOR1RIIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDRdIiwgb3B0X2xlbik7CisJCXJldHVybjsKKwkgICAgfQorCSAgICBvcHRzX2xlbiA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKKwkgICAgaWYgKG9wdHNfbGVuIDwgNCkgeworCQkodm9pZClwcmludGYoIltCYWQgdG90YWwgb3B0aW9uIGxlbmd0aCAldSA8IDRdIiwgb3B0c19sZW4pOworCQlyZXR1cm47CisJICAgIH0KKwkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MTZfdCk7CisJICAgICh2b2lkKXByaW50ZigiIE9QVFMgTEVOICVkIiwgb3B0c19sZW4pOworCSAgICBvcHRzX2xlbiAtPSA0OworCisJICAgIHdoaWxlIChvcHRzX2xlbikgeworCQlpZiAob3B0c19sZW4gPCBQR01fTUlOX09QVF9MRU4pIHsKKwkJICAgICh2b2lkKXByaW50ZigiW1RvdGFsIG9wdGlvbiBsZW5ndGggbGVhdmVzIG5vIHJvb20gZm9yIGZpbmFsIG9wdGlvbl0iKTsKKwkJICAgIHJldHVybjsKKwkJfQorCQlvcHRfdHlwZSA9ICpicCsrOworCQlvcHRfbGVuID0gKmJwKys7CisJCWlmIChvcHRfbGVuIDwgUEdNX01JTl9PUFRfTEVOKSB7CisJCSAgICAodm9pZClwcmludGYoIltCYWQgb3B0aW9uLCBsZW5ndGggJXUgPCAldV0iLCBvcHRfbGVuLAorCQkgICAgICAgIFBHTV9NSU5fT1BUX0xFTik7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAob3B0c19sZW4gPCBvcHRfbGVuKSB7CisJCSAgICAodm9pZClwcmludGYoIltUb3RhbCBvcHRpb24gbGVuZ3RoIGxlYXZlcyBubyByb29tIGZvciBmaW5hbCBvcHRpb25dIik7CisJCSAgICByZXR1cm47CisJCX0KKwkJaWYgKCFUVEVTVDIoKmJwLCBvcHRfbGVuIC0gMikpIHsKKwkJICAgICh2b2lkKXByaW50ZigiIFt8T1BUXSIpOworCQkgICAgcmV0dXJuOworCQl9IAorCisJCXN3aXRjaCAob3B0X3R5cGUgJiBQR01fT1BUX01BU0spIHsKKwkJY2FzZSBQR01fT1BUX0xFTkdUSDoKKwkJICAgIGlmIChvcHRfbGVuICE9IDQpIHsKKwkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfTEVOR1RIIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDRdIiwgb3B0X2xlbik7CisJCQlyZXR1cm47CisJCSAgICB9CisJCSAgICAodm9pZClwcmludGYoIiBPUFRTIExFTiAoZXh0cmE/KSAlZCIsIEVYVFJBQ1RfMTZCSVRTKGJwKSk7CisJCSAgICBicCArPSBzaXplb2YodV9pbnQxNl90KTsKKwkJICAgIG9wdHNfbGVuIC09IDQ7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfRlJBR01FTlQ6CisJCSAgICBpZiAob3B0X2xlbiAhPSAxNikgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9GUkFHTUVOVCBvcHRpb24sIGxlbmd0aCAldSAhPSAxNl0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICBzZXEgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKKwkJICAgIG9mZnNldCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOworCQkgICAgbGVuID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisJCSAgICAodm9pZClwcmludGYoIiBGUkFHIHNlcSAldSBvZmYgJXUgbGVuICV1Iiwgc2VxLCBvZmZzZXQsIGxlbik7CisJCSAgICBvcHRzX2xlbiAtPSAxNjsKKwkJICAgIGJyZWFrOworCisJCWNhc2UgUEdNX09QVF9OQUtfTElTVDoKKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICBvcHRfbGVuIC09IHNpemVvZih1X2ludDMyX3QpOwkvKiBvcHRpb24gaGVhZGVyICovCisJCSAgICAodm9pZClwcmludGYoIiBOQUsgTElTVCIpOworCQkgICAgd2hpbGUgKG9wdF9sZW4pIHsKKwkJCWlmIChvcHRfbGVuIDwgc2l6ZW9mKHVfaW50MzJfdCkpIHsKKwkJCSAgICAodm9pZClwcmludGYoIltPcHRpb24gbGVuZ3RoIG5vdCBhIG11bHRpcGxlIG9mIDRdIik7CisJCQkgICAgcmV0dXJuOworCQkJfQorCQkJVENIRUNLMigqYnAsIHNpemVvZih1X2ludDMyX3QpKTsKKwkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKKwkJCWJwICs9IHNpemVvZih1X2ludDMyX3QpOworCQkJb3B0X2xlbiAtPSBzaXplb2YodV9pbnQzMl90KTsKKwkJCW9wdHNfbGVuIC09IHNpemVvZih1X2ludDMyX3QpOworCQkgICAgfQorCQkgICAgYnJlYWs7CisKKwkJY2FzZSBQR01fT1BUX0pPSU46CisJCSAgICBpZiAob3B0X2xlbiAhPSA4KSB7CisJCQkodm9pZClwcmludGYoIltCYWQgT1BUX0pPSU4gb3B0aW9uLCBsZW5ndGggJXUgIT0gOF0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICBzZXEgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKKwkJICAgICh2b2lkKXByaW50ZigiIEpPSU4gJXUiLCBzZXEpOworCQkgICAgb3B0c19sZW4gLT0gODsKKwkJICAgIGJyZWFrOworCisJCWNhc2UgUEdNX09QVF9OQUtfQk9fSVZMOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gMTIpIHsKKwkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfTkFLX0JPX0lWTCBvcHRpb24sIGxlbmd0aCAldSAhPSAxMl0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICBvZmZzZXQgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKKwkJICAgIHNlcSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOworCQkgICAgKHZvaWQpcHJpbnRmKCIgQkFDS09GRiBpdmwgJXUgaXZsc2VxICV1Iiwgb2Zmc2V0LCBzZXEpOworCQkgICAgb3B0c19sZW4gLT0gMTI7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfTkFLX0JPX1JORzoKKwkJICAgIGlmIChvcHRfbGVuICE9IDEyKSB7CisJCQkodm9pZClwcmludGYoIltCYWQgT1BUX05BS19CT19STkcgb3B0aW9uLCBsZW5ndGggJXUgIT0gMTJdIiwgb3B0X2xlbik7CisJCQlyZXR1cm47CisJCSAgICB9CisJCSAgICBmbGFnczEgPSAqYnArKzsKKwkJICAgIGZsYWdzMiA9ICpicCsrOworCQkgICAgb2Zmc2V0ID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisJCSAgICBzZXEgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKKwkJICAgICh2b2lkKXByaW50ZigiIEJBQ0tPRkYgbWF4ICV1IG1pbiAldSIsIG9mZnNldCwgc2VxKTsKKwkJICAgIG9wdHNfbGVuIC09IDEyOworCQkgICAgYnJlYWs7CisKKwkJY2FzZSBQR01fT1BUX1JFRElSRUNUOgorCQkgICAgZmxhZ3MxID0gKmJwKys7CisJCSAgICBmbGFnczIgPSAqYnArKzsKKwkJICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoYnApKSB7CisJCSAgICBjYXNlIEFGSV9JUDoKKwkJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCQlubGFfYWYgPSBBRl9JTkVUOworCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJICAgIGNhc2UgQUZJX0lQNjoKKwkJCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworCQkJbmxhX2FmID0gQUZfSU5FVDY7CisJCQlicmVhazsKKyNlbmRpZgorCQkgICAgZGVmYXVsdDoKKwkJCWdvdG8gdHJ1bmM7CisJCQlicmVhazsKKwkJICAgIH0KKwkJICAgIGJwICs9ICgyICogc2l6ZW9mKHVfaW50MTZfdCkpOworCQkgICAgaWYgKG9wdF9sZW4gIT0gNCArIGFkZHJfc2l6ZSkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9SRURJUkVDVCBvcHRpb24sIGxlbmd0aCAldSAhPSA0ICsgYWRkcmVzcyBzaXplXSIsIG9wdF9sZW4pOworCQkJcmV0dXJuOworCQkgICAgfQorCQkgICAgVENIRUNLMigqYnAsIGFkZHJfc2l6ZSk7CisJCSAgICBubGEgPSBicDsKKwkJICAgIGJwICs9IGFkZHJfc2l6ZTsKKworCQkgICAgaW5ldF9udG9wKG5sYV9hZiwgbmxhLCBubGFfYnVmLCBzaXplb2YobmxhX2J1ZikpOworCQkgICAgKHZvaWQpcHJpbnRmKCIgUkVESVJFQ1QgJXMiLCAgKGNoYXIgKilubGEpOworCQkgICAgb3B0c19sZW4gLT0gNCArIGFkZHJfc2l6ZTsKKwkJICAgIGJyZWFrOworCisJCWNhc2UgUEdNX09QVF9QQVJJVFlfUFJNOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gOCkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9QQVJJVFlfUFJNIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDhdIiwgb3B0X2xlbik7CisJCQlyZXR1cm47CisJCSAgICB9CisJCSAgICBmbGFnczEgPSAqYnArKzsKKwkJICAgIGZsYWdzMiA9ICpicCsrOworCQkgICAgbGVuID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisJCSAgICAodm9pZClwcmludGYoIiBQQVJJVFkgTUFYVEdTICV1IiwgbGVuKTsKKwkJICAgIG9wdHNfbGVuIC09IDg7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfUEFSSVRZX0dSUDoKKwkJICAgIGlmIChvcHRfbGVuICE9IDgpIHsKKwkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfUEFSSVRZX0dSUCBvcHRpb24sIGxlbmd0aCAldSAhPSA4XSIsIG9wdF9sZW4pOworCQkJcmV0dXJuOworCQkgICAgfQorCQkgICAgZmxhZ3MxID0gKmJwKys7CisJCSAgICBmbGFnczIgPSAqYnArKzsKKwkJICAgIHNlcSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOworCQkgICAgKHZvaWQpcHJpbnRmKCIgUEFSSVRZIEdST1VQICV1Iiwgc2VxKTsKKwkJICAgIG9wdHNfbGVuIC09IDg7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfQ1VSUl9UR1NJWkU6CisJCSAgICBpZiAob3B0X2xlbiAhPSA4KSB7CisJCQkodm9pZClwcmludGYoIltCYWQgT1BUX0NVUlJfVEdTSVpFIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDhdIiwgb3B0X2xlbik7CisJCQlyZXR1cm47CisJCSAgICB9CisJCSAgICBmbGFnczEgPSAqYnArKzsKKwkJICAgIGZsYWdzMiA9ICpicCsrOworCQkgICAgbGVuID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7CisJCSAgICAodm9pZClwcmludGYoIiBQQVJJVFkgQVRHUyAldSIsIGxlbik7CisJCSAgICBvcHRzX2xlbiAtPSA4OworCQkgICAgYnJlYWs7CisKKwkJY2FzZSBQR01fT1BUX05CUl9VTlJFQUNIOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gNCkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9OQlJfVU5SRUFDSCBvcHRpb24sIGxlbmd0aCAldSAhPSA0XSIsIG9wdF9sZW4pOworCQkJcmV0dXJuOworCQkgICAgfQorCQkgICAgZmxhZ3MxID0gKmJwKys7CisJCSAgICBmbGFnczIgPSAqYnArKzsKKwkJICAgICh2b2lkKXByaW50ZigiIE5CUl9VTlJFQUNIIik7CisJCSAgICBvcHRzX2xlbiAtPSA0OworCQkgICAgYnJlYWs7CisKKwkJY2FzZSBQR01fT1BUX1BBVEhfTkxBOgorCQkgICAgKHZvaWQpcHJpbnRmKCIgUEFUSF9OTEEgWyVkXSIsIG9wdF9sZW4pOworCQkgICAgYnAgKz0gb3B0X2xlbjsKKwkJICAgIG9wdHNfbGVuIC09IG9wdF9sZW47CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfU1lOOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gNCkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9TWU4gb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICAodm9pZClwcmludGYoIiBTWU4iKTsKKwkJICAgIG9wdHNfbGVuIC09IDQ7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfRklOOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gNCkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9GSU4gb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICAodm9pZClwcmludGYoIiBGSU4iKTsKKwkJICAgIG9wdHNfbGVuIC09IDQ7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfUlNUOgorCQkgICAgaWYgKG9wdF9sZW4gIT0gNCkgeworCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9SU1Qgb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKKwkJCXJldHVybjsKKwkJICAgIH0KKwkJICAgIGZsYWdzMSA9ICpicCsrOworCQkgICAgZmxhZ3MyID0gKmJwKys7CisJCSAgICAodm9pZClwcmludGYoIiBSU1QiKTsKKwkJICAgIG9wdHNfbGVuIC09IDQ7CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfQ1I6CisJCSAgICAodm9pZClwcmludGYoIiBDUiIpOworCQkgICAgYnAgKz0gb3B0X2xlbjsKKwkJICAgIG9wdHNfbGVuIC09IG9wdF9sZW47CisJCSAgICBicmVhazsKKworCQljYXNlIFBHTV9PUFRfQ1JRU1Q6CisJCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7CisJCQkodm9pZClwcmludGYoIltCYWQgT1BUX0NSUVNUIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDRdIiwgb3B0X2xlbik7CisJCQlyZXR1cm47CisJCSAgICB9CisJCSAgICBmbGFnczEgPSAqYnArKzsKKwkJICAgIGZsYWdzMiA9ICpicCsrOworCQkgICAgKHZvaWQpcHJpbnRmKCIgQ1JRU1QiKTsKKwkJICAgIG9wdHNfbGVuIC09IDQ7CisJCSAgICBicmVhazsKKworCQlkZWZhdWx0OgorCQkgICAgKHZvaWQpcHJpbnRmKCIgT1BUXyUwMlggWyVkXSAiLCBvcHRfdHlwZSwgb3B0X2xlbik7CisJCSAgICBicCArPSBvcHRfbGVuOworCQkgICAgb3B0c19sZW4gLT0gb3B0X2xlbjsKKwkJICAgIGJyZWFrOworCQl9CisKKwkJaWYgKG9wdF90eXBlICYgUEdNX09QVF9FTkQpCisJCSAgICBicmVhazsKKwkgICAgIH0KKwl9CisKKwkodm9pZClwcmludGYoIiBbJXVdIiwgRVhUUkFDVF8xNkJJVFMoJnBnbS0+cGdtX2xlbmd0aCkpOworCisJcmV0dXJuOworCit0cnVuYzoKKwlmcHV0cygiW3xwZ21dIiwgc3Rkb3V0KTsKKwlpZiAoY2ggIT0gJ1wwJykKKwkJcHV0Y2hhcignPicpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcGltLmMgYi9wcmludC1waW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM0ZTRkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtcGltLmMKQEAgLTAsMCArMSwxMDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcGltLmMsdiAxLjQ1LjIuNCAyMDA2LzAyLzEzIDAxOjMyOjM0IGhhbm5lcyBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworI2RlZmluZSBQSU1WMl9UWVBFX0hFTExPICAgICAgICAgMAorI2RlZmluZSBQSU1WMl9UWVBFX1JFR0lTVEVSICAgICAgMQorI2RlZmluZSBQSU1WMl9UWVBFX1JFR0lTVEVSX1NUT1AgMgorI2RlZmluZSBQSU1WMl9UWVBFX0pPSU5fUFJVTkUgICAgMworI2RlZmluZSBQSU1WMl9UWVBFX0JPT1RTVFJBUCAgICAgNAorI2RlZmluZSBQSU1WMl9UWVBFX0FTU0VSVCAgICAgICAgNQorI2RlZmluZSBQSU1WMl9UWVBFX0dSQUZUICAgICAgICAgNgorI2RlZmluZSBQSU1WMl9UWVBFX0dSQUZUX0FDSyAgICAgNworI2RlZmluZSBQSU1WMl9UWVBFX0NBTkRJREFURV9SUCAgOAorI2RlZmluZSBQSU1WMl9UWVBFX1BSVU5FX1JFRlJFU0ggOQorCitzdGF0aWMgc3RydWN0IHRvayBwaW12Ml90eXBlX3ZhbHVlc1tdID0geworICAgIHsgUElNVjJfVFlQRV9IRUxMTywgICAgICAgICAiSGVsbG8iIH0sCisgICAgeyBQSU1WMl9UWVBFX1JFR0lTVEVSLCAgICAgICJSZWdpc3RlciIgfSwKKyAgICB7IFBJTVYyX1RZUEVfUkVHSVNURVJfU1RPUCwgIlJlZ2lzdGVyIFN0b3AiIH0sCisgICAgeyBQSU1WMl9UWVBFX0pPSU5fUFJVTkUsICAgICJKb2luIC8gUHJ1bmUiIH0sCisgICAgeyBQSU1WMl9UWVBFX0JPT1RTVFJBUCwgICAgICJCb290c3RyYXAiIH0sCisgICAgeyBQSU1WMl9UWVBFX0FTU0VSVCwgICAgICAgICJBc3NlcnQiIH0sCisgICAgeyBQSU1WMl9UWVBFX0dSQUZULCAgICAgICAgICJHcmFmdCIgfSwKKyAgICB7IFBJTVYyX1RZUEVfR1JBRlRfQUNLLCAgICAgIkdyYWZ0IEFja25vd2xlZGdlbWVudCIgfSwKKyAgICB7IFBJTVYyX1RZUEVfQ0FORElEQVRFX1JQLCAgIkNhbmRpZGF0ZSBSUCBBZHZlcnRpc2VtZW50IiB9LAorICAgIHsgUElNVjJfVFlQRV9QUlVORV9SRUZSRVNILCAiUHJ1bmUgUmVmcmVzaCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9IT0xEVElNRSAgICAgICAgICAgICAxCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9MQU5QUlVORURFTEFZICAgICAgICAyCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWV9PTEQgICAgIDE4CisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWSAgICAgICAgIDE5CisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9HRU5JRCAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9SRUZSRVNIX0NBUCAgICAgICAgIDIxCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9CSURJUl9DQVAgICAgICAgICAgIDIyCisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1QgICAgICAgIDI0CisjZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1RfT0xEIDY1MDAxCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHBpbXYyX2hlbGxvX29wdGlvbl92YWx1ZXNbXSA9IHsKKyAgICB7IFBJTVYyX0hFTExPX09QVElPTl9IT0xEVElNRSwgICAgICAgICAiSG9sZCBUaW1lIiB9LAorICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0xBTlBSVU5FREVMQVksICAgICJMQU4gUHJ1bmUgRGVsYXkiIH0sCisgICAgeyBQSU1WMl9IRUxMT19PUFRJT05fRFJfUFJJT1JJVFlfT0xELCAgIkRSIFByaW9yaXR5IChPbGQpIiB9LAorICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0RSX1BSSU9SSVRZLCAgICAgICJEUiBQcmlvcml0eSIgfSwKKyAgICB7IFBJTVYyX0hFTExPX09QVElPTl9HRU5JRCwgICAgICAgICAgICAiR2VuZXJhdGlvbiBJRCIgfSwKKyAgICB7IFBJTVYyX0hFTExPX09QVElPTl9SRUZSRVNIX0NBUCwgICAgICAiU3RhdGUgUmVmcmVzaCBDYXBhYmlsaXR5IiB9LAorICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0JJRElSX0NBUCwgICAgICAgICJCaS1EaXJlY3Rpb25hbCBDYXBhYmlsaXR5IiB9LAorICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0FERFJFU1NfTElTVCwgICAgICJBZGRyZXNzIExpc3QiIH0sCisgICAgeyBQSU1WMl9IRUxMT19PUFRJT05fQUREUkVTU19MSVNUX09MRCwgIkFkZHJlc3MgTGlzdCAoT2xkKSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTEVOICAgICAgNAorI2RlZmluZSBQSU1WMl9SRUdJU1RFUl9GTEFHX0JPUkRFUiAweDgwMDAwMDAwCisjZGVmaW5lIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTlVMTCAgIDB4NDAwMDAwMDAKKworc3RhdGljIHN0cnVjdCB0b2sgcGltdjJfcmVnaXN0ZXJfZmxhZ192YWx1ZXNbXSA9IHsKKyAgICB7IFBJTVYyX1JFR0lTVEVSX0ZMQUdfQk9SREVSLCAiQm9yZGVyIiB9LAorICAgIHsgUElNVjJfUkVHSVNURVJfRkxBR19OVUxMLCAiTnVsbCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OyAgICAKKworLyoKKyAqIFhYWDogV2UgY29uc2lkZXIgYSBjYXNlIHdoZXJlIElQdjYgaXMgbm90IHJlYWR5IHlldCBmb3IgcG9ydGFiaWxpdHksCisgKiBidXQgUElNIGRlcGVuZGVudCBkZWZpbnRpb25zIHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBJUHY2Li4uCisgKi8KKworc3RydWN0IHBpbSB7CisJdV9pbnQ4X3QgcGltX3R5cGV2ZXI7CisJCQkvKiB1cHBlciA0Yml0OiBQSU0gdmVyc2lvbiBudW1iZXI7IDIgZm9yIFBJTXYyICovCisJCQkvKiBsb3dlciA0Yml0OiB0aGUgUElNIG1lc3NhZ2UgdHlwZSwgY3VycmVudGx5IHRoZXkgYXJlOgorCQkJICogSGVsbG8sIFJlZ2lzdGVyLCBSZWdpc3Rlci1TdG9wLCBKb2luL1BydW5lLAorCQkJICogQm9vdHN0cmFwLCBBc3NlcnQsIEdyYWZ0IChQSU0tRE0gb25seSksCisJCQkgKiBHcmFmdC1BY2sgKFBJTS1ETSBvbmx5KSwgQy1SUC1BZHYKKwkJCSAqLworI2RlZmluZSBQSU1fVkVSKHgpCSgoKHgpICYgMHhmMCkgPj4gNCkKKyNkZWZpbmUgUElNX1RZUEUoeCkJKCh4KSAmIDB4MGYpCisJdV9jaGFyICBwaW1fcnN2OwkvKiBSZXNlcnZlZCAqLworCXVfc2hvcnQJcGltX2Nrc3VtOwkvKiBJUCBzdHlsZSBjaGVjayBzdW0gKi8KK307CisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisjaW5jbHVkZSAiaXAuaCIKKworc3RhdGljIHZvaWQgcGltdjJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKTsKKworc3RhdGljIHZvaWQKK3BpbXYxX2pvaW5fcHJ1bmVfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCWludCBtYWRkcmxlbiwgYWRkcmxlbiwgbmdyb3VwcywgbmpvaW4sIG5wcnVuZTsKKwlpbnQgbmpwOworCisJLyogSWYgaXQncyBhIHNpbmdsZSBncm91cCBhbmQgYSBzaW5nbGUgc291cmNlLCB1c2UgMS1saW5lIG91dHB1dC4gKi8KKwlpZiAoVFRFU1QyKGJwWzBdLCAzMCkgJiYgYnBbMTFdID09IDEgJiYKKwkgICAgKChuam9pbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyMF0pKSArIEVYVFJBQ1RfMTZCSVRTKCZicFsyMl0pKSA9PSAxKSB7CisJCWludCBob2xkOworCisJCSh2b2lkKXByaW50ZigiIFJQRiAlcyAiLCBpcGFkZHJfc3RyaW5nKGJwKSk7CisJCWhvbGQgPSBFWFRSQUNUXzE2QklUUygmYnBbNl0pOworCQlpZiAoaG9sZCAhPSAxODApIHsKKwkJCSh2b2lkKXByaW50ZigiSG9sZCAiKTsKKwkJCXJlbHRzX3ByaW50KGhvbGQpOworCQl9CisJCSh2b2lkKXByaW50ZigiJXMgKCVzLyVkLCAlcyIsIG5qb2luID8gIkpvaW4iIDogIlBydW5lIiwKKwkJaXBhZGRyX3N0cmluZygmYnBbMjZdKSwgYnBbMjVdICYgMHgzZiwKKwkJaXBhZGRyX3N0cmluZygmYnBbMTJdKSk7CisJCWlmIChFWFRSQUNUXzMyQklUUygmYnBbMTZdKSAhPSAweGZmZmZmZmZmKQorCQkJKHZvaWQpcHJpbnRmKCIvJXMiLCBpcGFkZHJfc3RyaW5nKCZicFsxNl0pKTsKKwkJKHZvaWQpcHJpbnRmKCIpICVzJXMgJXMiLAorCQkgICAgKGJwWzI0XSAmIDB4MDEpID8gIlNwYXJzZSIgOiAiRGVuc2UiLAorCQkgICAgKGJwWzI1XSAmIDB4ODApID8gIiBXQyIgOiAiIiwKKwkJICAgIChicFsyNV0gJiAweDQwKSA/ICJSUCIgOiAiU1BUIik7CisJCXJldHVybjsKKwl9CisKKwlUQ0hFQ0syKGJwWzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwlpZiAodmZsYWcgPiAxKQorCQkodm9pZClwcmludGYoIlxuIik7CisJKHZvaWQpcHJpbnRmKCIgVXBzdHJlYW0gTmJyOiAlcyIsIGlwYWRkcl9zdHJpbmcoYnApKTsKKwlUQ0hFQ0syKGJwWzZdLCAyKTsKKwlpZiAodmZsYWcgPiAxKQorCQkodm9pZClwcmludGYoIlxuIik7CisJKHZvaWQpcHJpbnRmKCIgSG9sZCB0aW1lOiAiKTsKKwlyZWx0c19wcmludChFWFRSQUNUXzE2QklUUygmYnBbNl0pKTsKKwlpZiAodmZsYWcgPCAyKQorCQlyZXR1cm47CisJYnAgKz0gODsKKwlsZW4gLT0gODsKKworCVRDSEVDSzIoYnBbMF0sIDQpOworCW1hZGRybGVuID0gYnBbMV07CisJYWRkcmxlbiA9IGJwWzJdOworCW5ncm91cHMgPSBicFszXTsKKwlicCArPSA0OworCWxlbiAtPSA0OworCXdoaWxlIChuZ3JvdXBzLS0pIHsKKwkJLyoKKwkJICogWFhYIC0gZG9lcyB0aGUgYWRkcmVzcyBoYXZlIGxlbmd0aCAiYWRkcmxlbiIgYW5kIHRoZQorCQkgKiBtYXNrIGxlbmd0aCAibWFkZHJsZW4iPworCQkgKi8KKwkJVENIRUNLMihicFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCSh2b2lkKXByaW50ZigiXG5cdEdyb3VwOiAlcyIsIGlwYWRkcl9zdHJpbmcoYnApKTsKKwkJVENIRUNLMihicFs0XSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWlmIChFWFRSQUNUXzMyQklUUygmYnBbNF0pICE9IDB4ZmZmZmZmZmYpCisJCQkodm9pZClwcmludGYoIi8lcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzRdKSk7CisJCVRDSEVDSzIoYnBbOF0sIDQpOworCQluam9pbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFs4XSk7CisJCW5wcnVuZSA9IEVYVFJBQ1RfMTZCSVRTKCZicFsxMF0pOworCQkodm9pZClwcmludGYoIiBqb2luZWQ6ICVkIHBydW5lZDogJWQiLCBuam9pbiwgbnBydW5lKTsKKwkJYnAgKz0gMTI7CisJCWxlbiAtPSAxMjsKKwkJZm9yIChuanAgPSAwOyBuanAgPCAobmpvaW4gKyBucHJ1bmUpOyBuanArKykgeworCQkJY29uc3QgY2hhciAqdHlwZTsKKworCQkJaWYgKG5qcCA8IG5qb2luKQorCQkJCXR5cGUgPSAiSm9pbiAiOworCQkJZWxzZQorCQkJCXR5cGUgPSAiUHJ1bmUiOworCQkJVENIRUNLMihicFswXSwgNik7CisJCQkodm9pZClwcmludGYoIlxuXHQlcyAlcyVzJXMlcy8lZCIsIHR5cGUsCisJCQkgICAgKGJwWzBdICYgMHgwMSkgPyAiU3BhcnNlICIgOiAiRGVuc2UgIiwKKwkJCSAgICAoYnBbMV0gJiAweDgwKSA/ICJXQyAiIDogIiIsCisJCQkgICAgKGJwWzFdICYgMHg0MCkgPyAiUlAgIiA6ICJTUFQgIiwKKwkJCWlwYWRkcl9zdHJpbmcoJmJwWzJdKSwgYnBbMV0gJiAweDNmKTsKKwkJCWJwICs9IDY7CisJCQlsZW4gLT0gNjsKKwkJfQorCX0KKwlyZXR1cm47Cit0cnVuYzoKKwkodm9pZClwcmludGYoIlt8cGltXSIpOworCXJldHVybjsKK30KKwordm9pZAorcGltdjFfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7CisJcmVnaXN0ZXIgdV9jaGFyIHR5cGU7CisKKwllcCA9IChjb25zdCB1X2NoYXIgKilzbmFwZW5kOworCWlmIChicCA+PSBlcCkKKwkJcmV0dXJuOworCisJVENIRUNLKGJwWzFdKTsKKwl0eXBlID0gYnBbMV07CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIDA6CisJCSh2b2lkKXByaW50ZigiIFF1ZXJ5Iik7CisJCWlmIChUVEVTVChicFs4XSkpIHsKKwkJCXN3aXRjaCAoYnBbOF0gPj4gNCkgeworCQkJY2FzZSAwOgorCQkJCSh2b2lkKXByaW50ZigiIERlbnNlLW1vZGUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQkodm9pZClwcmludGYoIiBTcGFyc2UtbW9kZSIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCSh2b2lkKXByaW50ZigiIFNwYXJzZS1EZW5zZS1tb2RlIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCSh2b2lkKXByaW50ZigiIG1vZGUtJWQiLCBicFs4XSA+PiA0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmZsYWcpIHsKKwkJCVRDSEVDSzIoYnBbMTBdLDIpOworCQkJKHZvaWQpcHJpbnRmKCIgKEhvbGQtdGltZSAiKTsKKwkJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKCZicFsxMF0pKTsKKwkJCSh2b2lkKXByaW50ZigiKSIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAxOgorCQkodm9pZClwcmludGYoIiBSZWdpc3RlciIpOworCQlUQ0hFQ0syKGJwWzhdLCAyMCk7CQkJLyogaXAgaGVhZGVyICovCisJCSh2b2lkKXByaW50ZigiIGZvciAlcyA+ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbMjBdKSwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzI0XSkpOworCQlicmVhazsKKwljYXNlIDI6CisJCSh2b2lkKXByaW50ZigiIFJlZ2lzdGVyLVN0b3AiKTsKKwkJVENIRUNLMihicFsxMl0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQkodm9pZClwcmludGYoIiBmb3IgJXMgPiAlcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzhdKSwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzEyXSkpOworCQlicmVhazsKKwljYXNlIDM6CisJCSh2b2lkKXByaW50ZigiIEpvaW4vUHJ1bmUiKTsKKwkJaWYgKHZmbGFnKQorCQkJcGltdjFfam9pbl9wcnVuZV9wcmludCgmYnBbOF0sIGxlbiAtIDgpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSh2b2lkKXByaW50ZigiIFJQLXJlYWNoYWJsZSIpOworCQlpZiAodmZsYWcpIHsKKwkJCVRDSEVDSzIoYnBbMjJdLCAyKTsKKwkJCSh2b2lkKXByaW50ZigiIGdyb3VwICVzIiwKKwkJCWlwYWRkcl9zdHJpbmcoJmJwWzhdKSk7CisJCQlpZiAoRVhUUkFDVF8zMkJJVFMoJmJwWzEyXSkgIT0gMHhmZmZmZmZmZikKKwkJCQkodm9pZClwcmludGYoIi8lcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzEyXSkpOworCQkJKHZvaWQpcHJpbnRmKCIgUlAgJXMgaG9sZCAiLCBpcGFkZHJfc3RyaW5nKCZicFsxNl0pKTsKKwkJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKCZicFsyMl0pKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDU6CisJCSh2b2lkKXByaW50ZigiIEFzc2VydCIpOworCQlUQ0hFQ0syKGJwWzE2XSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCSh2b2lkKXByaW50ZigiIGZvciAlcyA+ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbMTZdKSwKKwkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzhdKSk7CisJCWlmIChFWFRSQUNUXzMyQklUUygmYnBbMTJdKSAhPSAweGZmZmZmZmZmKQorCQkJKHZvaWQpcHJpbnRmKCIvJXMiLCBpcGFkZHJfc3RyaW5nKCZicFsxMl0pKTsKKwkJVENIRUNLMihicFsyNF0sIDQpOworCQkodm9pZClwcmludGYoIiAlcyBwcmVmICVkIG1ldHJpYyAlZCIsCisJCSAgICAoYnBbMjBdICYgMHg4MCkgPyAiUlAtdHJlZSIgOiAiU1BUIiwKKwkJRVhUUkFDVF8zMkJJVFMoJmJwWzIwXSkgJiAweDdmZmZmZmZmLAorCQlFWFRSQUNUXzMyQklUUygmYnBbMjRdKSk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJKHZvaWQpcHJpbnRmKCIgR3JhZnQiKTsKKwkJaWYgKHZmbGFnKQorCQkJcGltdjFfam9pbl9wcnVuZV9wcmludCgmYnBbOF0sIGxlbiAtIDgpOworCQlicmVhazsKKwljYXNlIDc6CisJCSh2b2lkKXByaW50ZigiIEdyYWZ0LUFDSyIpOworCQlpZiAodmZsYWcpCisJCQlwaW12MV9qb2luX3BydW5lX3ByaW50KCZicFs4XSwgbGVuIC0gOCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJKHZvaWQpcHJpbnRmKCIgTW9kZSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkodm9pZClwcmludGYoIiBbdHlwZSAlZF0iLCB0eXBlKTsKKwkJYnJlYWs7CisJfQorCWlmICgoYnBbNF0gPj4gNCkgIT0gMSkKKwkJKHZvaWQpcHJpbnRmKCIgW3YlZF0iLCBicFs0XSA+PiA0KTsKKwlyZXR1cm47CisKK3RydW5jOgorCSh2b2lkKXByaW50ZigiW3xwaW1dIik7CisJcmV0dXJuOworfQorCisvKgorICogYXV0by1SUCBpcyBhIGNpc2NvIHByb3RvY29sLCBkb2N1bWVudGVkIGF0CisgKiBmdHA6Ly9mdHBlbmcuY2lzY28uY29tL2lwbXVsdGljYXN0L3NwZWNzL3BpbS1hdXRvcnAtc3BlYzAxLnR4dAorICoKKyAqIFRoaXMgaW1wbGVtZW50cyB2ZXJzaW9uIDErLCBkYXRlZCBTZXB0IDksIDE5OTguCisgKi8KK3ZvaWQKK2Npc2NvX2F1dG9ycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisJaW50IHR5cGU7CisJaW50IG51bXJwczsKKwlpbnQgaG9sZDsKKworCVRDSEVDSyhicFswXSk7CisJKHZvaWQpcHJpbnRmKCIgYXV0by1ycCAiKTsKKwl0eXBlID0gYnBbMF07CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAweDExOgorCQkodm9pZClwcmludGYoImNhbmRpZGF0ZS1hZHZlcnQiKTsKKwkJYnJlYWs7CisJY2FzZSAweDEyOgorCQkodm9pZClwcmludGYoIm1hcHBpbmciKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKHZvaWQpcHJpbnRmKCJ0eXBlLTB4JTAyeCIsIHR5cGUpOworCQlicmVhazsKKwl9CisKKwlUQ0hFQ0soYnBbMV0pOworCW51bXJwcyA9IGJwWzFdOworCisJVENIRUNLMihicFsyXSwgMik7CisJKHZvaWQpcHJpbnRmKCIgSG9sZCAiKTsKKwlob2xkID0gRVhUUkFDVF8xNkJJVFMoJmJwWzJdKTsKKwlpZiAoaG9sZCkKKwkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoJmJwWzJdKSk7CisJZWxzZQorCQlwcmludGYoIkZPUkVWRVIiKTsKKworCS8qIE5leHQgNCBieXRlcyBhcmUgcmVzZXJ2ZWQuICovCisKKwlicCArPSA4OyBsZW4gLT0gODsKKworCS8qWFhYIHNraXAgdW5sZXNzIC12PyAqLworCisJLyoKKwkgKiBSZXN0IG9mIHBhY2tldDoKKwkgKiBudW1ycHMgZW50cmllcyBvZiB0aGUgZm9ybToKKwkgKiAzMiBiaXRzOiBSUAorCSAqIDYgYml0czogcmVzZXJ2ZWQKKwkgKiAyIGJpdHM6IFBJTSB2ZXJzaW9uIHN1cHBvcnRlZCwgYml0IDAgaXMgInN1cHBvcnRzIHYxIiwgMSBpcyAidjIiLgorCSAqIDggYml0czogIyBvZiBlbnRyaWVzIGZvciB0aGlzIFJQCisJICogZWFjaCBlbnRyeTogNyBiaXRzOiByZXNlcnZlZCwgMSBiaXQ6IG5lZ2F0aXZlLAorCSAqCSAgICAgICA4IGJpdHM6IG1hc2sgMzIgYml0czogc291cmNlCisJICogbGF0aGVyLCByaW5zZSwgcmVwZWF0LgorCSAqLworCXdoaWxlIChudW1ycHMtLSkgeworCQlpbnQgbmVudHJpZXM7CisJCWNoYXIgczsKKworCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJKHZvaWQpcHJpbnRmKCIgUlAgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSk7CisJCVRDSEVDSyhicFs0XSk7CisJCXN3aXRjaCAoYnBbNF0gJiAweDMpIHsKKwkJY2FzZSAwOiBwcmludGYoIiBQSU12PyIpOworCQkJYnJlYWs7CisJCWNhc2UgMToJcHJpbnRmKCIgUElNdjEiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CXByaW50ZigiIFBJTXYyIik7CisJCQlicmVhazsKKwkJY2FzZSAzOglwcmludGYoIiBQSU12MSsyIik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYnBbNF0gJiAweGZjKQorCQkJKHZvaWQpcHJpbnRmKCIgW3JzdmQ9MHglMDJ4XSIsIGJwWzRdICYgMHhmYyk7CisJCVRDSEVDSyhicFs1XSk7CisJCW5lbnRyaWVzID0gYnBbNV07CisJCWJwICs9IDY7IGxlbiAtPSA2OworCQlzID0gJyAnOworCQlmb3IgKDsgbmVudHJpZXM7IG5lbnRyaWVzLS0pIHsKKwkJCVRDSEVDSzIoYnBbMF0sIDYpOworCQkJKHZvaWQpcHJpbnRmKCIlYyVzJXMvJWQiLCBzLCBicFswXSAmIDEgPyAiISIgOiAiIiwKKwkJCSAgICBpcGFkZHJfc3RyaW5nKCZicFsyXSksIGJwWzFdKTsKKwkJCWlmIChicFswXSAmIDB4ZmUpCisJCQkJKHZvaWQpcHJpbnRmKCJbcnN2ZD0weCUwMnhdIiwgYnBbMF0gJiAweGZlKTsKKwkJCXMgPSAnLCc7CisJCQlicCArPSA2OyBsZW4gLT0gNjsKKwkJfQorCX0KKwlyZXR1cm47CisKK3RydW5jOgorCSh2b2lkKXByaW50ZigiW3xhdXRvcnBdIik7CisJcmV0dXJuOworfQorCit2b2lkCitwaW1fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7CisJcmVnaXN0ZXIgc3RydWN0IHBpbSAqcGltID0gKHN0cnVjdCBwaW0gKilicDsKKworCWVwID0gKGNvbnN0IHVfY2hhciAqKXNuYXBlbmQ7CisJaWYgKGJwID49IGVwKQorCQlyZXR1cm47CisjaWZkZWYgbm90eWV0CQkJLyogY3VycmVudGx5IHdlIHNlZSBvbmx5IHZlcnNpb24gYW5kIHR5cGUgKi8KKwlUQ0hFQ0socGltLT5waW1fcnN2KTsKKyNlbmRpZgorCisJc3dpdGNoIChQSU1fVkVSKHBpbS0+cGltX3R5cGV2ZXIpKSB7CisJY2FzZSAyOgorICAgICAgICAgICAgaWYgKCF2ZmxhZykgeworICAgICAgICAgICAgICAgIHByaW50ZigiUElNdiV1LCAlcywgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihwaW12Ml90eXBlX3ZhbHVlcywiVW5rbm93biBUeXBlIixQSU1fVFlQRShwaW0tPnBpbV90eXBldmVyKSksCisgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlBJTXYldSwgbGVuZ3RoICV1XG5cdCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHBpbXYyX3R5cGVfdmFsdWVzLCJVbmtub3duIFR5cGUiLFBJTV9UWVBFKHBpbS0+cGltX3R5cGV2ZXIpKSk7CisgICAgICAgICAgICAgICAgcGltdjJfcHJpbnQoYnAsIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlBJTXYldSwgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFBJTXYyIHVzZXMgZW5jb2RlZCBhZGRyZXNzIHJlcHJlc2VudGF0aW9ucy4KKyAqCisgKiBUaGUgbGFzdCBQSU0tU00gSS1EIGJlZm9yZSBSRkMyMTE3IHdhcyBwdWJsaXNoZWQgc3BlY2lmaWVkIHRoZQorICogZm9sbG93aW5nIHJlcHJlc2VudGF0aW9uIGZvciB1bmljYXN0IGFkZHJlc3Nlcy4gIEhvd2V2ZXIsIFJGQzIxMTcKKyAqIHNwZWNpZmllZCBubyBlbmNvZGluZyBmb3IgdW5pY2FzdCBhZGRyZXNzZXMgd2l0aCB0aGUgdW5pY2FzdAorICogYWRkcmVzcyBsZW5ndGggc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIuICBUaGVyZWZvcmUsIHdlIGhhdmUgdG8KKyAqIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGlzIGJlaW5nIHVzZWQgKENpc2NvJ3MgUElNdjIgaW1wbGVtZW50YXRpb24KKyAqIHVzZXMgdGhlIG5vbi1SRkMgZW5jb2RpbmcpLiAgUkZDMjExNyB0dXJucyBhIHByZXZpb3VzbHkgIlJlc2VydmVkIgorICogZmllbGQgaW50byBhICd1bmljYXN0LWFkZHJlc3MtbGVuZ3RoLWluLWJ5dGVzJyBmaWVsZC4gIFdlIGd1ZXNzCisgKiB0aGF0IGl0J3MgdGhlIGRyYWZ0IGVuY29kaW5nIGlmIHRoaXMgcmVzZXJ2ZWQgZmllbGQgaXMgemVyby4KKyAqCisgKiBSRkMyMzYyIGdvZXMgYmFjayB0byB0aGUgZW5jb2RlZCBmb3JtYXQsIGFuZCBjYWxscyB0aGUgYWRkciBsZW5ndGgKKyAqIGZpZWxkICJyZXNlcnZlZCIgYWdhaW4uCisgKgorICogVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGFkZHJlc3MgZmFtaWx5LCBmcm9tOgorICoKKyAqICAgIDAgICAgUmVzZXJ2ZWQKKyAqICAgIDEgICAgSVAgKElQIHZlcnNpb24gNCkKKyAqICAgIDIgICAgSVA2IChJUCB2ZXJzaW9uIDYpCisgKiAgICAzICAgIE5TQVAKKyAqICAgIDQgICAgSERMQyAoOC1iaXQgbXVsdGlkcm9wKQorICogICAgNSAgICBCQk4gMTgyMgorICogICAgNiAgICA4MDIgKGluY2x1ZGVzIGFsbCA4MDIgbWVkaWEgcGx1cyBFdGhlcm5ldCAiY2Fub25pY2FsIGZvcm1hdCIpCisgKiAgICA3ICAgIEUuMTYzCisgKiAgICA4ICAgIEUuMTY0IChTTURTLCBGcmFtZSBSZWxheSwgQVRNKQorICogICAgOSAgICBGLjY5IChUZWxleCkKKyAqICAgMTAgICAgWC4xMjEgKFguMjUsIEZyYW1lIFJlbGF5KQorICogICAxMSAgICBJUFgKKyAqICAgMTIgICAgQXBwbGV0YWxrCisgKiAgIDEzICAgIERlY25ldCBJVgorICogICAxNCAgICBCYW55YW4gVmluZXMKKyAqICAgMTUgICAgRS4xNjQgd2l0aCBOU0FQIGZvcm1hdCBzdWJhZGRyZXNzCisgKgorICogSW4gYWRkaXRpb24sIHRoZSBzZWNvbmQgYnl0ZSBpcyBhbiAiRW5jb2RpbmciLiAgMCBpcyB0aGUgZGVmYXVsdAorICogZW5jb2RpbmcgZm9yIHRoZSBhZGRyZXNzIGZhbWlseSwgYW5kIG5vIG90aGVyIGVuY29kaW5ncyBhcmUgY3VycmVudGx5CisgKiBzcGVjaWZpZWQuCisgKgorICovCisKK3N0YXRpYyBpbnQgcGltdjJfYWRkcl9sZW47CisKK2VudW0gcGltdjJfYWRkcnR5cGUgeworCXBpbXYyX3VuaWNhc3QsIHBpbXYyX2dyb3VwLCBwaW12Ml9zb3VyY2UKK307CisKKy8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBBZGRyIEZhbWlseSAgIHwgRW5jb2RpbmcgVHlwZSB8ICAgICBVbmljYXN0IEFkZHJlc3MgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rKysrKysrCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgQWRkciBGYW1pbHkgICB8IEVuY29kaW5nIFR5cGUgfCAgIFJlc2VydmVkICAgIHwgIE1hc2sgTGVuICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICBHcm91cCBtdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgQWRkciBGYW1pbHkgICB8IEVuY29kaW5nIFR5cGUgfCBSc3J2ZCAgIHxTfFd8UnwgIE1hc2sgTGVuICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KK3N0YXRpYyBpbnQKK3BpbXYyX2FkZHJfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgZW51bSBwaW12Ml9hZGRydHlwZSBhdCwgaW50IHNpbGVudCkKK3sKKwlpbnQgYWY7CisJaW50IGxlbiwgaGRybGVuOworCisJVENIRUNLKGJwWzBdKTsKKworCWlmIChwaW12Ml9hZGRyX2xlbiA9PSAwKSB7CisJCVRDSEVDSyhicFsxXSk7CisJCXN3aXRjaCAoYnBbMF0pIHsKKwkJY2FzZSAxOgorCQkJYWYgPSBBRl9JTkVUOworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCWJyZWFrOworI2lmZGVmIElORVQ2CisJCWNhc2UgMjoKKwkJCWFmID0gQUZfSU5FVDY7CisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGJwWzFdICE9IDApCisJCQlyZXR1cm4gLTE7CisJCWhkcmxlbiA9IDI7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChwaW12Ml9hZGRyX2xlbikgeworCQljYXNlIHNpemVvZihzdHJ1Y3QgaW5fYWRkcik6CisJCQlhZiA9IEFGX0lORVQ7CisJCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCQljYXNlIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOgorCQkJYWYgPSBBRl9JTkVUNjsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwkJfQorCQlsZW4gPSBwaW12Ml9hZGRyX2xlbjsKKwkJaGRybGVuID0gMDsKKwl9CisKKwlicCArPSBoZHJsZW47CisJc3dpdGNoIChhdCkgeworCWNhc2UgcGltdjJfdW5pY2FzdDoKKwkJVENIRUNLMihicFswXSwgbGVuKTsKKwkJaWYgKGFmID09IEFGX0lORVQpIHsKKwkJCWlmICghc2lsZW50KQorCQkJCSh2b2lkKXByaW50ZigiJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSk7CisJCX0KKyNpZmRlZiBJTkVUNgorCQllbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgeworCQkJaWYgKCFzaWxlbnQpCisJCQkJKHZvaWQpcHJpbnRmKCIlcyIsIGlwNmFkZHJfc3RyaW5nKGJwKSk7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gaGRybGVuICsgbGVuOworCWNhc2UgcGltdjJfZ3JvdXA6CisJY2FzZSBwaW12Ml9zb3VyY2U6CisJCVRDSEVDSzIoYnBbMF0sIGxlbiArIDIpOworCQlpZiAoYWYgPT0gQUZfSU5FVCkgeworCQkJaWYgKCFzaWxlbnQpIHsKKwkJCQkodm9pZClwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZyhicCArIDIpKTsKKwkJCQlpZiAoYnBbMV0gIT0gMzIpCisJCQkJCSh2b2lkKXByaW50ZigiLyV1IiwgYnBbMV0pOworCQkJfQorCQl9CisjaWZkZWYgSU5FVDYKKwkJZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKwkJCWlmICghc2lsZW50KSB7CisJCQkJKHZvaWQpcHJpbnRmKCIlcyIsIGlwNmFkZHJfc3RyaW5nKGJwICsgMikpOworCQkJCWlmIChicFsxXSAhPSAxMjgpCisJCQkJCSh2b2lkKXByaW50ZigiLyV1IiwgYnBbMV0pOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKGJwWzBdICYmICFzaWxlbnQpIHsKKwkJCWlmIChhdCA9PSBwaW12Ml9ncm91cCkgeworCQkJCSh2b2lkKXByaW50ZigiKDB4JTAyeCkiLCBicFswXSk7CisJCQl9IGVsc2UgeworCQkJCSh2b2lkKXByaW50ZigiKCVzJXMlcyIsCisJCQkJCWJwWzBdICYgMHgwNCA/ICJTIiA6ICIiLAorCQkJCQlicFswXSAmIDB4MDIgPyAiVyIgOiAiIiwKKwkJCQkJYnBbMF0gJiAweDAxID8gIlIiIDogIiIpOworCQkJCWlmIChicFswXSAmIDB4ZjgpIHsKKwkJCQkJKHZvaWQpIHByaW50ZigiKzB4JTAyeCIsIGJwWzBdICYgMHhmOCk7CisJCQkJfQorCQkJCSh2b2lkKXByaW50ZigiKSIpOworCQkJfQorCQl9CisJCXJldHVybiBoZHJsZW4gKyAyICsgbGVuOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit0cnVuYzoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitwaW12Ml9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcDsKKwlyZWdpc3RlciBzdHJ1Y3QgcGltICpwaW0gPSAoc3RydWN0IHBpbSAqKWJwOworCWludCBhZHZhbmNlOworCisJZXAgPSAoY29uc3QgdV9jaGFyICopc25hcGVuZDsKKwlpZiAoYnAgPj0gZXApCisJCXJldHVybjsKKwlpZiAoZXAgPiBicCArIGxlbikKKwkJZXAgPSBicCArIGxlbjsKKwlUQ0hFQ0socGltLT5waW1fcnN2KTsKKwlwaW12Ml9hZGRyX2xlbiA9IHBpbS0+cGltX3JzdjsKKwlpZiAocGltdjJfYWRkcl9sZW4gIT0gMCkKKwkJKHZvaWQpcHJpbnRmKCIsIFJGQzIxMTctZW5jb2RpbmciKTsKKworICAgICAgICBwcmludGYoIiwgY2tzdW0gMHglMDR4ICIsIEVYVFJBQ1RfMTZCSVRTKCZwaW0tPnBpbV9ja3N1bSkpOworICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJnBpbS0+cGltX2Nrc3VtKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIodW52ZXJpZmllZCkiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiglc2NvcnJlY3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgVFRFU1QyKGJwWzBdLCBsZW4pICYmCisgICAgICAgICAgICAgICAgICAgICAgIGluX2Nrc3VtKChjb25zdCB1X3Nob3J0KilicCwgbGVuLCAwKSA/ICJpbiIgOiAiIiApOworICAgICAgICB9CisKKwlzd2l0Y2ggKFBJTV9UWVBFKHBpbS0+cGltX3R5cGV2ZXIpKSB7CisJY2FzZSBQSU1WMl9UWVBFX0hFTExPOgorCSAgICB7CisJCXVfaW50MTZfdCBvdHlwZSwgb2xlbjsKKwkJYnAgKz0gNDsKKwkJd2hpbGUgKGJwIDwgZXApIHsKKwkJCVRDSEVDSzIoYnBbMF0sIDQpOworCQkJb3R5cGUgPSBFWFRSQUNUXzE2QklUUygmYnBbMF0pOworCQkJb2xlbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyXSk7CisJCQlUQ0hFQ0syKGJwWzBdLCA0ICsgb2xlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgldSksIGxlbmd0aCAldSwgVmFsdWU6ICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0ciggcGltdjJfaGVsbG9fb3B0aW9uX3ZhbHVlcywiVW5rbm93biIsb3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZW4pOworCQkJYnAgKz0gNDsKKworCQkJc3dpdGNoIChvdHlwZSkgeworCQkJY2FzZSBQSU1WMl9IRUxMT19PUFRJT05fSE9MRFRJTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKGJwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9MQU5QUlVORURFTEFZOgorCQkJCWlmIChvbGVuICE9IDQpIHsKKwkJCQkJKHZvaWQpcHJpbnRmKCJFUlJPUjogT3B0aW9uIExlbmdodCAhPSA0IEJ5dGVzICgldSkiLCBvbGVuKTsKKwkJCQl9IGVsc2UgeworCQkJCQljaGFyIHRfYml0OworCQkJCQl1X2ludDE2X3QgbGFuX2RlbGF5LCBvdmVycmlkZV9pbnRlcnZhbDsKKwkJCQkJbGFuX2RlbGF5ID0gRVhUUkFDVF8xNkJJVFMoYnApOworCQkJCQlvdmVycmlkZV9pbnRlcnZhbCA9IEVYVFJBQ1RfMTZCSVRTKGJwKzIpOworCQkJCQl0X2JpdCA9IChsYW5fZGVsYXkgJiAweDgwMDApPyAxIDogMDsKKwkJCQkJbGFuX2RlbGF5ICY9IH4weDgwMDA7CisJCQkJCSh2b2lkKXByaW50ZigiXG5cdCAgICBULWJpdD0lZCwgTEFOIGRlbGF5ICVkbXMsIE92ZXJyaWRlIGludGVydmFsICVkbXMiLAorCQkJCQl0X2JpdCwgbGFuX2RlbGF5LCBvdmVycmlkZV9pbnRlcnZhbCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWV9PTEQ6CisJCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQmktRGlyZWN0aW9uYWwgQ2FwYWJpbGl0eSAoT2xkKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXUiLCBFWFRSQUNUXzMyQklUUyhicCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBPcHRpb24gTGVuZ2h0ICE9IDQgQnl0ZXMgKCV1KSIsIG9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkJCWNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX0dFTklEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIjB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJwKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX1JFRlJFU0hfQ0FQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoInYlZCIsICpicCk7CisJCQkJaWYgKCooYnArMSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIGludGVydmFsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsdHNfcHJpbnQoKihicCsxKSk7CisJCQkJfQorCQkJCWlmIChFWFRSQUNUXzE2QklUUyhicCsyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiA/MHglMDR4PyIsIEVYVFJBQ1RfMTZCSVRTKGJwKzIpKTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgIFBJTVYyX0hFTExPX09QVElPTl9CSURJUl9DQVA6CisJCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX0FERFJFU1NfTElTVF9PTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1Q6CisJCQkJaWYgKHZmbGFnID4gMSkgeworCQkJCQljb25zdCB1X2NoYXIgKnB0ciA9IGJwOworCQkJCQl3aGlsZSAocHRyIDwgKGJwK29sZW4pKSB7CisJCQkJCQlpbnQgYWR2YW5jZTsKKworCQkJCQkJcHJpbnRmKCJcblx0ICAgICIpOworCQkJCQkJYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQocHRyLCBwaW12Ml91bmljYXN0LCAwKTsKKwkJCQkJCWlmIChhZHZhbmNlIDwgMCkgeworCQkJCQkJCXByaW50ZigiLi4uIik7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlwdHIgKz0gYWR2YW5jZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0ICAgICIsb2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShicCwiXG5cdCAgICAiLG9sZW4pOworCQkJYnAgKz0gb2xlbjsKKwkJfQorCQlicmVhazsKKwkgICAgfQorCisJY2FzZSBQSU1WMl9UWVBFX1JFR0lTVEVSOgorCXsKKwkJc3RydWN0IGlwICppcDsKKworICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCooYnArNCksIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTEVOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyAlcyBdXG5cdCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocGltdjJfcmVnaXN0ZXJfZmxhZ192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGJwKzQpKSk7CisKKwkJYnAgKz0gODsgbGVuIC09IDg7CisJCS8qIGVuY2Fwc3VsYXRlZCBtdWx0aWNhc3QgcGFja2V0ICovCisJCWlwID0gKHN0cnVjdCBpcCAqKWJwOworCQlzd2l0Y2ggKElQX1YoaXApKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBOdWxsIGhlYWRlciAqLworCQkJKHZvaWQpcHJpbnRmKCJJUC1OdWxsLWhlYWRlciAlcyA+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSk7CisJCQlicmVhazsKKworCQljYXNlIDQ6CS8qIElQdjQgKi8KKwkJCWlwX3ByaW50KGduZG8sIGJwLCBsZW4pOworCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJY2FzZSA2OgkvKiBJUHY2ICovCisJCQlpcDZfcHJpbnQoYnAsIGxlbik7CisJCQlicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIklQIHZlciAlZCIsIElQX1YoaXApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgUElNVjJfVFlQRV9SRUdJU1RFUl9TVE9QOgorCQlicCArPSA0OyBsZW4gLT0gNDsKKwkJaWYgKGJwID49IGVwKQorCQkJYnJlYWs7CisJCSh2b2lkKXByaW50ZigiIGdyb3VwPSIpOworCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpIDwgMCkgeworCQkJKHZvaWQpcHJpbnRmKCIuLi4iKTsKKwkJCWJyZWFrOworCQl9CisJCWJwICs9IGFkdmFuY2U7IGxlbiAtPSBhZHZhbmNlOworCQlpZiAoYnAgPj0gZXApCisJCQlicmVhazsKKwkJKHZvaWQpcHJpbnRmKCIgc291cmNlPSIpOworCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml91bmljYXN0LCAwKSkgPCAwKSB7CisJCQkodm9pZClwcmludGYoIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7CisJCWJyZWFrOworCisJY2FzZSBQSU1WMl9UWVBFX0pPSU5fUFJVTkU6CisJY2FzZSBQSU1WMl9UWVBFX0dSQUZUOgorCWNhc2UgUElNVjJfVFlQRV9HUkFGVF9BQ0s6CisKKworICAgICAgICAvKgorICAgICAgICAgKiAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgICAgICAqICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfFBJTSBWZXJ8IFR5cGUgIHwgQWRkciBsZW5ndGggICB8ICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqICB8ICAgICAgICAgICAgIFVuaWNhc3QtVXBzdHJlYW0gTmVpZ2hib3IgQWRkcmVzcyAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogIHwgIFJlc2VydmVkICAgICB8IE51bSBncm91cHMgICAgfCAgICAgICAgICBIb2xkdGltZSAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgICAgICAgICAgIEVuY29kZWQtTXVsdGljYXN0IEdyb3VwIEFkZHJlc3MtMSAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqICB8ICAgTnVtYmVyIG9mIEpvaW5lZCAgU291cmNlcyAgIHwgICBOdW1iZXIgb2YgUHJ1bmVkIFNvdXJjZXMgICAgfAorICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICBFbmNvZGVkLUpvaW5lZCBTb3VyY2UgQWRkcmVzcy0xICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgICAgICAgICAgICAgIEVuY29kZWQtSm9pbmVkIFNvdXJjZSBBZGRyZXNzLW4gICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqICB8ICAgICAgICAgICAgICAgRW5jb2RlZC1QcnVuZWQgU291cmNlIEFkZHJlc3MtMSAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICBFbmNvZGVkLVBydW5lZCBTb3VyY2UgQWRkcmVzcy1uICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICBFbmNvZGVkLU11bHRpY2FzdCBHcm91cCBBZGRyZXNzLW4gICAgICAgICAgICAgIHwKKyAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAqLworCisJICAgIHsKKwkJdV9pbnQ4X3Qgbmdyb3VwOworCQl1X2ludDE2X3QgaG9sZHRpbWU7CisJCXVfaW50MTZfdCBuam9pbjsKKwkJdV9pbnQxNl90IG5wcnVuZTsKKwkJaW50IGksIGo7CisKKwkJYnAgKz0gNDsgbGVuIC09IDQ7CisJCWlmIChQSU1fVFlQRShwaW0tPnBpbV90eXBldmVyKSAhPSA3KSB7CS8qbm90IGZvciBHcmFmdC1BQ0sqLworCQkJaWYgKGJwID49IGVwKQorCQkJCWJyZWFrOworCQkJKHZvaWQpcHJpbnRmKCIsIHVwc3RyZWFtLW5laWdoYm9yOiAiKTsKKwkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKKwkJCQkodm9pZClwcmludGYoIi4uLiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7CisJCX0KKwkJaWYgKGJwICsgNCA+IGVwKQorCQkJYnJlYWs7CisJCW5ncm91cCA9IGJwWzFdOworCQlob2xkdGltZSA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyXSk7CisJCSh2b2lkKXByaW50ZigiXG5cdCAgJXUgZ3JvdXAocykiLCBuZ3JvdXApOworCQlpZiAoUElNX1RZUEUocGltLT5waW1fdHlwZXZlcikgIT0gNykgewkvKm5vdCBmb3IgR3JhZnQtQUNLKi8KKwkJCSh2b2lkKXByaW50ZigiLCBob2xkdGltZTogIik7CisJCQlpZiAoaG9sZHRpbWUgPT0gMHhmZmZmKQorCQkJCSh2b2lkKXByaW50ZigiaW5maW5pdGUiKTsKKwkJCWVsc2UKKwkJCQlyZWx0c19wcmludChob2xkdGltZSk7CisJCX0KKwkJYnAgKz0gNDsgbGVuIC09IDQ7CisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXA7IGkrKykgeworCQkJaWYgKGJwID49IGVwKQorCQkJCWdvdG8ganBfZG9uZTsKKwkJCSh2b2lkKXByaW50ZigiXG5cdCAgICBncm91cCAjJXU6ICIsIGkrMSk7CisJCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpIDwgMCkgeworCQkJCSh2b2lkKXByaW50ZigiLi4uKSIpOworCQkJCWdvdG8ganBfZG9uZTsKKwkJCX0KKwkJCWJwICs9IGFkdmFuY2U7IGxlbiAtPSBhZHZhbmNlOworCQkJaWYgKGJwICsgNCA+IGVwKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJZ290byBqcF9kb25lOworCQkJfQorCQkJbmpvaW4gPSBFWFRSQUNUXzE2QklUUygmYnBbMF0pOworCQkJbnBydW5lID0gRVhUUkFDVF8xNkJJVFMoJmJwWzJdKTsKKwkJCSh2b2lkKXByaW50ZigiLCBqb2luZWQgc291cmNlczogJXUsIHBydW5lZCBzb3VyY2VzOiAldSIsIG5qb2luLG5wcnVuZSk7CisJCQlicCArPSA0OyBsZW4gLT0gNDsKKwkJCWZvciAoaiA9IDA7IGogPCBuam9pbjsgaisrKSB7CisJCQkJKHZvaWQpcHJpbnRmKCJcblx0ICAgICAgam9pbmVkIHNvdXJjZSAjJXU6ICIsaisxKTsKKwkJCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9zb3VyY2UsIDApKSA8IDApIHsKKwkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJCWdvdG8ganBfZG9uZTsKKwkJCQl9CisJCQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7CisJCQl9CisJCQlmb3IgKGogPSAwOyBqIDwgbnBydW5lOyBqKyspIHsKKwkJCQkodm9pZClwcmludGYoIlxuXHQgICAgICBwcnVuZWQgc291cmNlICMldTogIixqKzEpOworCQkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3NvdXJjZSwgMCkpIDwgMCkgeworCQkJCQkodm9pZClwcmludGYoIi4uLikiKTsKKwkJCQkJZ290byBqcF9kb25lOworCQkJCX0KKwkJCQlicCArPSBhZHZhbmNlOyBsZW4gLT0gYWR2YW5jZTsKKwkJCX0KKwkJfQorCWpwX2RvbmU6CisJCWJyZWFrOworCSAgICB9CisKKwljYXNlIFBJTVYyX1RZUEVfQk9PVFNUUkFQOgorCXsKKwkJaW50IGksIGosIGZycGNudDsKKwkJYnAgKz0gNDsKKworCQkvKiBGcmFnbWVudCBUYWcsIEhhc2ggTWFzayBsZW4sIGFuZCBCU1ItcHJpb3JpdHkgKi8KKwkJaWYgKGJwICsgc2l6ZW9mKHVfaW50MTZfdCkgPj0gZXApIGJyZWFrOworCQkodm9pZClwcmludGYoIiB0YWc9JXgiLCBFWFRSQUNUXzE2QklUUyhicCkpOworCQlicCArPSBzaXplb2YodV9pbnQxNl90KTsKKwkJaWYgKGJwID49IGVwKSBicmVhazsKKwkJKHZvaWQpcHJpbnRmKCIgaGFzaG1sZW49JWQiLCBicFswXSk7CisJCWlmIChicCArIDEgPj0gZXApIGJyZWFrOworCQkodm9pZClwcmludGYoIiBCU1JwcmlvPSVkIiwgYnBbMV0pOworCQlicCArPSAyOworCisJCS8qIEVuY29kZWQtVW5pY2FzdC1CU1ItQWRkcmVzcyAqLworCQlpZiAoYnAgPj0gZXApIGJyZWFrOworCQkodm9pZClwcmludGYoIiBCU1I9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKKwkJCSh2b2lkKXByaW50ZigiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlicCArPSBhZHZhbmNlOworCisJCWZvciAoaSA9IDA7IGJwIDwgZXA7IGkrKykgeworCQkJLyogRW5jb2RlZC1Hcm91cCBBZGRyZXNzICovCisJCQkodm9pZClwcmludGYoIiAoZ3JvdXAlZDogIiwgaSk7CisJCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpCisJCQkgICAgPCAwKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJZ290byBic19kb25lOworCQkJfQorCQkJYnAgKz0gYWR2YW5jZTsKKworCQkJLyogUlAtQ291bnQsIEZyYWcgUlAtQ250LCBhbmQgcnN2ZCAqLworCQkJaWYgKGJwID49IGVwKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJZ290byBic19kb25lOworCQkJfQorCQkJKHZvaWQpcHJpbnRmKCIgUlBjbnQ9JWQiLCBicFswXSk7CisJCQlpZiAoYnAgKyAxID49IGVwKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJZ290byBic19kb25lOworCQkJfQorCQkJKHZvaWQpcHJpbnRmKCIgRlJQY250PSVkIiwgZnJwY250ID0gYnBbMV0pOworCQkJYnAgKz0gNDsKKworCQkJZm9yIChqID0gMDsgaiA8IGZycGNudCAmJiBicCA8IGVwOyBqKyspIHsKKwkJCQkvKiBlYWNoIFJQIGluZm8gKi8KKwkJCQkodm9pZClwcmludGYoIiBSUCVkPSIsIGopOworCQkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsCisJCQkJCQkJCXBpbXYyX3VuaWNhc3QsCisJCQkJCQkJCTApKSA8IDApIHsKKwkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJCWdvdG8gYnNfZG9uZTsKKwkJCQl9CisJCQkJYnAgKz0gYWR2YW5jZTsKKworCQkJCWlmIChicCArIDEgPj0gZXApIHsKKwkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7CisJCQkJCWdvdG8gYnNfZG9uZTsKKwkJCQl9CisJCQkJKHZvaWQpcHJpbnRmKCIsaG9sZHRpbWU9Iik7CisJCQkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoYnApKTsKKwkJCQlpZiAoYnAgKyAyID49IGVwKSB7CisJCQkJCSh2b2lkKXByaW50ZigiLi4uKSIpOworCQkJCQlnb3RvIGJzX2RvbmU7CisJCQkJfQorCQkJCSh2b2lkKXByaW50ZigiLHByaW89JWQiLCBicFsyXSk7CisJCQkJYnAgKz0gNDsKKwkJCX0KKwkJCSh2b2lkKXByaW50ZigiKSIpOworCQl9CisJICAgYnNfZG9uZToKKwkJYnJlYWs7CisJfQorCWNhc2UgUElNVjJfVFlQRV9BU1NFUlQ6CisJCWJwICs9IDQ7IGxlbiAtPSA0OworCQlpZiAoYnAgPj0gZXApCisJCQlicmVhazsKKwkJKHZvaWQpcHJpbnRmKCIgZ3JvdXA9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX2dyb3VwLCAwKSkgPCAwKSB7CisJCQkodm9pZClwcmludGYoIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7CisJCWlmIChicCA+PSBlcCkKKwkJCWJyZWFrOworCQkodm9pZClwcmludGYoIiBzcmM9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKKwkJCSh2b2lkKXByaW50ZigiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlicCArPSBhZHZhbmNlOyBsZW4gLT0gYWR2YW5jZTsKKwkJaWYgKGJwICsgOCA+IGVwKQorCQkJYnJlYWs7CisJCWlmIChicFswXSAmIDB4ODApCisJCQkodm9pZClwcmludGYoIiBSUFQiKTsKKwkJKHZvaWQpcHJpbnRmKCIgcHJlZj0ldSIsIEVYVFJBQ1RfMzJCSVRTKCZicFswXSkgJiAweDdmZmZmZmZmKTsKKwkJKHZvaWQpcHJpbnRmKCIgbWV0cmljPSV1IiwgRVhUUkFDVF8zMkJJVFMoJmJwWzRdKSk7CisJCWJyZWFrOworCisJY2FzZSBQSU1WMl9UWVBFX0NBTkRJREFURV9SUDoKKwl7CisJCWludCBpLCBwZnhjbnQ7CisJCWJwICs9IDQ7CisKKwkJLyogUHJlZml4LUNudCwgUHJpb3JpdHksIGFuZCBIb2xkdGltZSAqLworCQlpZiAoYnAgPj0gZXApIGJyZWFrOworCQkodm9pZClwcmludGYoIiBwcmVmaXgtY250PSVkIiwgYnBbMF0pOworCQlwZnhjbnQgPSBicFswXTsKKwkJaWYgKGJwICsgMSA+PSBlcCkgYnJlYWs7CisJCSh2b2lkKXByaW50ZigiIHByaW89JWQiLCBicFsxXSk7CisJCWlmIChicCArIDMgPj0gZXApIGJyZWFrOworCQkodm9pZClwcmludGYoIiBob2xkdGltZT0iKTsKKwkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoJmJwWzJdKSk7CisJCWJwICs9IDQ7CisKKwkJLyogRW5jb2RlZC1VbmljYXN0LVJQLUFkZHJlc3MgKi8KKwkJaWYgKGJwID49IGVwKSBicmVhazsKKwkJKHZvaWQpcHJpbnRmKCIgUlA9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKKwkJCSh2b2lkKXByaW50ZigiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlicCArPSBhZHZhbmNlOworCisJCS8qIEVuY29kZWQtR3JvdXAgQWRkcmVzc2VzICovCisJCWZvciAoaSA9IDA7IGkgPCBwZnhjbnQgJiYgYnAgPCBlcDsgaSsrKSB7CisJCQkodm9pZClwcmludGYoIiBHcm91cCVkPSIsIGkpOworCQkJaWYgKChhZHZhbmNlID0gcGltdjJfYWRkcl9wcmludChicCwgcGltdjJfZ3JvdXAsIDApKQorCQkJICAgIDwgMCkgeworCQkJCSh2b2lkKXByaW50ZigiLi4uIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicCArPSBhZHZhbmNlOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgUElNVjJfVFlQRV9QUlVORV9SRUZSRVNIOgorCQkodm9pZClwcmludGYoIiBzcmM9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKKwkJCSh2b2lkKXByaW50ZigiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlicCArPSBhZHZhbmNlOworCQkodm9pZClwcmludGYoIiBncnA9Iik7CisJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX2dyb3VwLCAwKSkgPCAwKSB7CisJCQkodm9pZClwcmludGYoIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJYnAgKz0gYWR2YW5jZTsKKwkJKHZvaWQpcHJpbnRmKCIgZm9yd2FyZGVyPSIpOworCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml91bmljYXN0LCAwKSkgPCAwKSB7CisJCQkodm9pZClwcmludGYoIi4uLiIpOworCQkJYnJlYWs7CisJCX0KKwkJYnAgKz0gYWR2YW5jZTsKKwkJVENIRUNLMihicFswXSwgMik7CisJCSh2b2lkKXByaW50ZigiIFRVTlIgIik7CisJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKGJwKSk7CisJCWJyZWFrOworCisKKwkgZGVmYXVsdDoKKwkJKHZvaWQpcHJpbnRmKCIgW3R5cGUgJWRdIiwgUElNX1RZUEUocGltLT5waW1fdHlwZXZlcikpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCSh2b2lkKXByaW50ZigiW3xwaW1dIik7Cit9CisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC1wcHAuYyBiL3ByaW50LXBwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTljMTUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1wcHAuYwpAQCAtMCwwICsxLDE3NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBFeHRlbnNpdmVseSBtb2RpZmllZCBieSBNb3Rvbm9yaSBTaGluZG8gKG1zaGluZG9AbXNoaW5kby5uZXQpIGZvciBtb3JlCisgKiBjb21wbGV0ZSBQUFAgc3VwcG9ydC4KKyAqLworCisvKgorICogVE9ETzoKKyAqIG8gcmVzb2x2ZSBYWFggYXMgbXVjaCBhcyBwb3NzaWJsZQorICogbyBNUCBzdXBwb3J0CisgKiBvIEJBUCBzdXBwb3J0CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcHBwLmMsdiAxLjEwOC4yLjYgMjAwNS8xMi8wNSAxMTo0MDozNiBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpZmRlZiBfX2JzZGlfXworI2luY2x1ZGUgPG5ldC9zbGNvbXByZXNzLmg+CisjaW5jbHVkZSA8bmV0L2lmX3BwcC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAicHBwLmgiCisjaW5jbHVkZSAiY2hkbGMuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJvdWkuaCIKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgY29uc3RhdG5zIGFyZSBkZWZpbmVkIGJ5IElBTkEuIFBsZWFzZSByZWZlciB0bworICogICAgaHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvcHBwLW51bWJlcnMKKyAqIGZvciB0aGUgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBQcm90b2NvbCBDb2RlcyBkZWZpbmVkIGluIHBwcC5oICovCisKK3N0cnVjdCB0b2sgcHBwdHlwZTJzdHJbXSA9IHsKKyAgICAgICAgeyBQUFBfSVAsCSAgIklQIiB9LAorICAgICAgICB7IFBQUF9PU0ksCSAgIk9TSSIgfSwKKyAgICAgICAgeyBQUFBfTlMsCSAgIk5TIiB9LAorICAgICAgICB7IFBQUF9ERUNORVQsCSAgIkRFQ05FVCIgfSwKKyAgICAgICAgeyBQUFBfQVBQTEUsCSAgIkFQUExFIiB9LAorCXsgUFBQX0lQWCwJICAiSVBYIiB9LAorCXsgUFBQX1ZKQywJICAiVkpDIElQIiB9LAorCXsgUFBQX1ZKTkMsCSAgIlZKTkMgSVAiIH0sCisJeyBQUFBfQlJQRFUsCSAgIkJSUERVIiB9LAorCXsgUFBQX1NUSUksCSAgIlNUSUkiIH0sCisJeyBQUFBfVklORVMsCSAgIlZJTkVTIiB9LAorCXsgUFBQX01QTFNfVUNBU1QsICJNUExTIiB9LAorCXsgUFBQX01QTFNfTUNBU1QsICJNUExTIiB9LAorICAgICAgICB7IFBQUF9DT01QLCAgICAgICAiQ29tcHJlc3NlZCJ9LAorICAgICAgICB7IFBQUF9NTCwgICAgICAgICAiTUxQUFAifSwKKyAgICAgICAgeyBQUFBfSVBWNiwgICAgICAgIklQNiJ9LAorCisJeyBQUFBfSEVMTE8sCSAgIkhFTExPIiB9LAorCXsgUFBQX0xVWENPTSwJICAiTFVYQ09NIiB9LAorCXsgUFBQX1NOUywJICAiU05TIiB9LAorCXsgUFBQX0lQQ1AsCSAgIklQQ1AiIH0sCisJeyBQUFBfT1NJQ1AsCSAgIk9TSUNQIiB9LAorCXsgUFBQX05TQ1AsCSAgIk5TQ1AiIH0sCisJeyBQUFBfREVDTkVUQ1AsICAgIkRFQ05FVENQIiB9LAorCXsgUFBQX0FQUExFQ1AsCSAgIkFQUExFQ1AiIH0sCisJeyBQUFBfSVBYQ1AsCSAgIklQWENQIiB9LAorCXsgUFBQX1NUSUlDUCwJICAiU1RJSUNQIiB9LAorCXsgUFBQX1ZJTkVTQ1AsCSAgIlZJTkVTQ1AiIH0sCisgICAgICAgIHsgUFBQX0lQVjZDUCwgICAgICJJUDZDUCIgfSwKKwl7IFBQUF9NUExTQ1AsCSAgIk1QTFNDUCIgfSwKKworCXsgUFBQX0xDUCwJICAiTENQIiB9LAorCXsgUFBQX1BBUCwJICAiUEFQIiB9LAorCXsgUFBQX0xRTSwJICAiTFFNIiB9LAorCXsgUFBQX0NIQVAsCSAgIkNIQVAiIH0sCisJeyBQUFBfRUFQLAkgICJFQVAiIH0sCisJeyBQUFBfU1BBUCwJICAiU1BBUCIgfSwKKwl7IFBQUF9TUEFQX09MRCwJICAiT2xkLVNQQVAiIH0sCisJeyBQUFBfQkFDUCwJICAiQkFDUCIgfSwKKwl7IFBQUF9CQVAsCSAgIkJBUCIgfSwKKwl7IFBQUF9NUENQLAkgICJNTFBQUC1DUCIgfSwKKwl7IDAsCQkgIE5VTEwgfQorfTsKKworLyogQ29udHJvbCBQcm90b2NvbHMgKExDUC9JUENQL0NDUCBldGMuKSBDb2RlcyBkZWZpbmVkIGluIFJGQyAxNjYxICovCisKKyNkZWZpbmUgQ1BDT0RFU19WRVhUCQkwCS8qIFZlbmRvci1TcGVjaWZpYyAoUkZDMjE1MykgKi8KKyNkZWZpbmUgQ1BDT0RFU19DT05GX1JFUQkxCS8qIENvbmZpZ3VyZS1SZXF1ZXN0ICovCisjZGVmaW5lIENQQ09ERVNfQ09ORl9BQ0sJMgkvKiBDb25maWd1cmUtQWNrICovCisjZGVmaW5lIENQQ09ERVNfQ09ORl9OQUsJMwkvKiBDb25maWd1cmUtTmFrICovCisjZGVmaW5lIENQQ09ERVNfQ09ORl9SRUoJNAkvKiBDb25maWd1cmUtUmVqZWN0ICovCisjZGVmaW5lIENQQ09ERVNfVEVSTV9SRVEJNQkvKiBUZXJtaW5hdGUtUmVxdWVzdCAqLworI2RlZmluZSBDUENPREVTX1RFUk1fQUNLCTYJLyogVGVybWluYXRlLUFjayAqLworI2RlZmluZSBDUENPREVTX0NPREVfUkVKCTcJLyogQ29kZS1SZWplY3QgKi8KKyNkZWZpbmUgQ1BDT0RFU19QUk9UX1JFSgk4CS8qIFByb3RvY29sLVJlamVjdCAoTENQIG9ubHkpICovCisjZGVmaW5lIENQQ09ERVNfRUNIT19SRVEJOQkvKiBFY2hvLVJlcXVlc3QgKExDUCBvbmx5KSAqLworI2RlZmluZSBDUENPREVTX0VDSE9fUlBMCTEwCS8qIEVjaG8tUmVwbHkgKExDUCBvbmx5KSAqLworI2RlZmluZSBDUENPREVTX0RJU0NfUkVRCTExCS8qIERpc2NhcmQtUmVxdWVzdCAoTENQIG9ubHkpICovCisjZGVmaW5lIENQQ09ERVNfSUQJCTEyCS8qIElkZW50aWZpY2F0aW9uIChMQ1Agb25seSkgUkZDMTU3MCAqLworI2RlZmluZSBDUENPREVTX1RJTUVfUkVNCTEzCS8qIFRpbWUtUmVtYWluaW5nIChMQ1Agb25seSkgUkZDMTU3MCAqLworI2RlZmluZSBDUENPREVTX1JFU0VUX1JFUQkxNAkvKiBSZXNldC1SZXF1ZXN0IChDQ1Agb25seSkgUkZDMTk2MiAqLworI2RlZmluZSBDUENPREVTX1JFU0VUX1JFUAkxNQkvKiBSZXNldC1SZXBseSAoQ0NQIG9ubHkpICovCisKK3N0cnVjdCB0b2sgY3Bjb2Rlc1tdID0geworCXtDUENPREVTX1ZFWFQsICAgICAgIlZlbmRvci1FeHRlbnNpb24ifSwgLyogUkZDMjE1MyAqLworCXtDUENPREVTX0NPTkZfUkVRLCAgIkNvbmYtUmVxdWVzdCJ9LAorICAgICAgICB7Q1BDT0RFU19DT05GX0FDSywgICJDb25mLUFjayJ9LAorCXtDUENPREVTX0NPTkZfTkFLLCAgIkNvbmYtTmFjayJ9LAorCXtDUENPREVTX0NPTkZfUkVKLCAgIkNvbmYtUmVqZWN0In0sCisJe0NQQ09ERVNfVEVSTV9SRVEsICAiVGVybS1SZXF1ZXN0In0sCisJe0NQQ09ERVNfVEVSTV9BQ0ssICAiVGVybS1BY2sifSwKKwl7Q1BDT0RFU19DT0RFX1JFSiwgICJDb2RlLVJlamVjdCJ9LAorCXtDUENPREVTX1BST1RfUkVKLCAgIlByb3QtUmVqZWN0In0sCisJe0NQQ09ERVNfRUNIT19SRVEsICAiRWNoby1SZXF1ZXN0In0sCisJe0NQQ09ERVNfRUNIT19SUEwsICAiRWNoby1SZXBseSJ9LAorCXtDUENPREVTX0RJU0NfUkVRLCAgIkRpc2MtUmVxIn0sCisJe0NQQ09ERVNfSUQsICAgICAgICAiSWRlbnQifSwgICAgICAgICAgICAvKiBSRkMxNTcwICovCisJe0NQQ09ERVNfVElNRV9SRU0sICAiVGltZS1SZW0ifSwgICAgICAgICAvKiBSRkMxNTcwICovCisJe0NQQ09ERVNfUkVTRVRfUkVRLCAiUmVzZXQtUmVxIn0sICAgICAgICAvKiBSRkMxOTYyICovCisJe0NQQ09ERVNfUkVTRVRfUkVQLCAiUmVzZXQtQWNrIn0sICAgICAgICAvKiBSRkMxOTYyICovCisgICAgICAgIHswLCAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKy8qIExDUCBDb25maWcgT3B0aW9ucyAqLworCisjZGVmaW5lIExDUE9QVF9WRVhUCTAKKyNkZWZpbmUgTENQT1BUX01SVQkxCisjZGVmaW5lIExDUE9QVF9BQ0NNCTIKKyNkZWZpbmUgTENQT1BUX0FQCTMKKyNkZWZpbmUgTENQT1BUX1FQCTQKKyNkZWZpbmUgTENQT1BUX01OCTUKKyNkZWZpbmUgTENQT1BUX0RFUDYJNgorI2RlZmluZSBMQ1BPUFRfUEZDCTcKKyNkZWZpbmUgTENQT1BUX0FDRkMJOAorI2RlZmluZSBMQ1BPUFRfRkNTQUxUCTkKKyNkZWZpbmUgTENQT1BUX1NEUAkxMAorI2RlZmluZSBMQ1BPUFRfTlVNTU9ERQkxMQorI2RlZmluZSBMQ1BPUFRfREVQMTIJMTIKKyNkZWZpbmUgTENQT1BUX0NCQUNLCTEzCisjZGVmaW5lIExDUE9QVF9ERVAxNAkxNAorI2RlZmluZSBMQ1BPUFRfREVQMTUJMTUKKyNkZWZpbmUgTENQT1BUX0RFUDE2CTE2CisjZGVmaW5lIExDUE9QVF9NTE1SUlUJMTcKKyNkZWZpbmUgTENQT1BUX01MU1NOSEYJMTgKKyNkZWZpbmUgTENQT1BUX01MRUQJMTkKKyNkZWZpbmUgTENQT1BUX1BST1AJMjAKKyNkZWZpbmUgTENQT1BUX0RDRUlECTIxCisjZGVmaW5lIExDUE9QVF9NUFAJMjIKKyNkZWZpbmUgTENQT1BUX0xECTIzCisjZGVmaW5lIExDUE9QVF9MQ1BBT1BUCTI0CisjZGVmaW5lIExDUE9QVF9DT0JTCTI1CisjZGVmaW5lIExDUE9QVF9QRQkyNgorI2RlZmluZSBMQ1BPUFRfTUxIRgkyNworI2RlZmluZSBMQ1BPUFRfSTE4TgkyOAorI2RlZmluZSBMQ1BPUFRfU0RMT1MJMjkKKyNkZWZpbmUgTENQT1BUX1BQUE1VWAkzMAorCisjZGVmaW5lIExDUE9QVF9NSU4gTENQT1BUX1ZFWFQKKyNkZWZpbmUgTENQT1BUX01BWCBMQ1BPUFRfUFBQTVVYCisKK3N0YXRpYyBjb25zdCBjaGFyICpsY3Bjb25mb3B0c1tdID0geworCSJWZW5kLUV4dCIsCQkvKiAoMCkgKi8KKwkiTVJVIiwJCQkvKiAoMSkgKi8KKwkiQUNDTSIsCQkJLyogKDIpICovCisJIkF1dGgtUHJvdCIsCQkvKiAoMykgKi8KKwkiUXVhbC1Qcm90IiwJCS8qICg0KSAqLworCSJNYWdpYy1OdW0iLAkJLyogKDUpICovCisJImRlcHJlY2F0ZWQoNikiLAkvKiB1c2VkIHRvIGJlIGEgUXVhbGl0eSBQcm90b2NvbCAqLworCSJQRkMiLAkJCS8qICg3KSAqLworCSJBQ0ZDIiwJCQkvKiAoOCkgKi8KKwkiRkNTLUFsdCIsCQkvKiAoOSkgKi8KKwkiU0RQIiwJCQkvKiAoMTApICovCisJIk51bS1Nb2RlIiwJCS8qICgxMSkgKi8KKwkiZGVwcmVjYXRlZCgxMikiLAkvKiB1c2VkIHRvIGJlIGEgTXVsdGktTGluay1Qcm9jZWR1cmUqLworCSJDYWxsLUJhY2siLAkJLyogKDEzKSAqLworCSJkZXByZWNhdGVkKDE0KSIsCS8qIHVzZWQgdG8gYmUgYSBDb25uZWN0LVRpbWUgKi8KKwkiZGVwcmVjYXRlZCgxNSkiLAkvKiB1c2VkIHRvIGJlIGEgQ29tcHVuZC1GcmFtZXMgKi8KKwkiZGVwcmVjYXRlZCgxNikiLAkvKiB1c2VkIHRvIGJlIGEgTm9taW5hbC1EYXRhLUVuY2FwICovCisJIk1SUlUiLAkJCS8qICgxNykgKi8KKwkiMTItQml0IHNlcSAjIiwJCS8qICgxOCkgKi8KKwkiRW5kLURpc2MiLAkJLyogKDE5KSAqLworCSJQcm9wcmlldGFyeSIsCQkvKiAoMjApICovCisJIkRDRS1JZCIsCQkvKiAoMjEpICovCisJIk1QKyIsCQkJLyogKDIyKSAqLworCSJMaW5rLURpc2MiLAkJLyogKDIzKSAqLworCSJMQ1AtQXV0aC1PcHQiLAkJLyogKDI0KSAqLworCSJDT0JTIiwJCQkvKiAoMjUpICovCisJIlByZWZpeC1lbGlzaW9uIiwJLyogKDI2KSAqLworCSJNdWx0aWxpbmstaGVhZGVyLUZvcm0iLC8qICgyNykgKi8KKwkiSTE4TiIsCQkJLyogKDI4KSAqLworCSJTREwtb3Zlci1TT05FVC9TREgiLAkvKiAoMjkpICovCisJIlBQUC1NdXhpbmciLAkJLyogKDMwKSAqLworfTsKKworLyogRUNQIC0gdG8gYmUgc3VwcG9ydGVkICovCisKKy8qIENDUCBDb25maWcgT3B0aW9ucyAqLworCisjZGVmaW5lIENDUE9QVF9PVUkJMAkvKiBSRkMxOTYyICovCisjZGVmaW5lIENDUE9QVF9QUkVEMQkxCS8qIFJGQzE5NjIgKi8KKyNkZWZpbmUgQ0NQT1BUX1BSRUQyCTIJLyogUkZDMTk2MiAqLworI2RlZmluZSBDQ1BPUFRfUEpVTVAJMwkvKiBSRkMxOTYyICovCisvKiA0LTE1IHVuYXNzaWduZWQgKi8KKyNkZWZpbmUgQ0NQT1BUX0hQUFBDCTE2CS8qIFJGQzE5NjIgKi8KKyNkZWZpbmUgQ0NQT1BUX1NUQUNMWlMJMTcJLyogUkZDMTk3NCAqLworI2RlZmluZSBDQ1BPUFRfTVBQQwkxOAkvKiBSRkMyMTE4ICovCisjZGVmaW5lIENDUE9QVF9HRlpBCTE5CS8qIFJGQzE5NjIgKi8KKyNkZWZpbmUgQ0NQT1BUX1Y0MkJJUwkyMAkvKiBSRkMxOTYyICovCisjZGVmaW5lIENDUE9QVF9CU0RDT01QCTIxCS8qIFJGQzE5NzcgKi8KKy8qIDIyIHVuYXNzaWduZWQgKi8KKyNkZWZpbmUgQ0NQT1BUX0xaU0RDUAkyMwkvKiBSRkMxOTY3ICovCisjZGVmaW5lIENDUE9QVF9NVlJDQQkyNAkvKiBSRkMxOTc1ICovCisjZGVmaW5lIENDUE9QVF9ERUMJMjUJLyogUkZDMTk3NiAqLworI2RlZmluZSBDQ1BPUFRfREVGTEFURQkyNgkvKiBSRkMxOTc5ICovCisvKiAyNy0yNTQgdW5hc3NpZ25lZCAqLworI2RlZmluZSBDQ1BPUFRfUkVTVgkyNTUJLyogUkZDMTk2MiAqLworCitjb25zdCBzdHJ1Y3QgdG9rIGNjcGNvbmZvcHRzX3ZhbHVlc1tdID0geworICAgICAgICB7IENDUE9QVF9PVUksICJPVUkiIH0sCisgICAgICAgIHsgQ0NQT1BUX1BSRUQxLCAiUHJlZC0xIiB9LAorICAgICAgICB7IENDUE9QVF9QUkVEMiwgIlByZWQtMiIgfSwKKyAgICAgICAgeyBDQ1BPUFRfUEpVTVAsICJQdWRkbGUiIH0sCisgICAgICAgIHsgQ0NQT1BUX0hQUFBDLCAiSFAtUFBDIiB9LAorICAgICAgICB7IENDUE9QVF9TVEFDTFpTLCAiU3RhYy1MWlMiIH0sCisgICAgICAgIHsgQ0NQT1BUX01QUEMsICJNUFBDIiB9LAorICAgICAgICB7IENDUE9QVF9HRlpBLCAiR2FuZC1GWkEiIH0sCisgICAgICAgIHsgQ0NQT1BUX1Y0MkJJUywgIlYuNDJiaXMiIH0sCisgICAgICAgIHsgQ0NQT1BUX0JTRENPTVAsICJCU0QtQ29tcCIgfSwKKyAgICAgICAgeyBDQ1BPUFRfTFpTRENQLCAiTFpTLURDUCIgfSwKKyAgICAgICAgeyBDQ1BPUFRfTVZSQ0EsICJNVlJDQSIgfSwKKyAgICAgICAgeyBDQ1BPUFRfREVDLCAiREVDIiB9LAorICAgICAgICB7IENDUE9QVF9ERUZMQVRFLCAiRGVmbGF0ZSIgfSwKKyAgICAgICAgeyBDQ1BPUFRfUkVTViwgIlJlc2VydmVkIn0sCisgICAgICAgIHswLCAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKy8qIEJBQ1AgQ29uZmlnIE9wdGlvbnMgKi8KKworI2RlZmluZSBCQUNQT1BUX0ZQRUVSCTEJLyogUkZDMjEyNSAqLworCitjb25zdCBzdHJ1Y3QgdG9rIGJhY2NvbmZvcHRzX3ZhbHVlc1tdID0geworICAgICAgICB7IEJBQ1BPUFRfRlBFRVIsICJGYXZvcmVkLVBlZXIiIH0sCisgICAgICAgIHswLCAgICAgICAgICAgICAgICAgTlVMTH0KK307CisKKworLyogU0RDUCAtIHRvIGJlIHN1cHBvcnRlZCAqLworCisvKiBJUENQIENvbmZpZyBPcHRpb25zICovCisjZGVmaW5lIElQQ1BPUFRfMkFERFIJMQkvKiBSRkMxMTcyLCBSRkMxMzMyIChkZXByZWNhdGVkKSAqLworI2RlZmluZSBJUENQT1BUX0lQQ09NUAkyCS8qIFJGQzEzMzIgKi8KKyNkZWZpbmUgSVBDUE9QVF9BRERSCTMJLyogUkZDMTMzMiAqLworI2RlZmluZSBJUENQT1BUX01PQklMRTQJNAkvKiBSRkMyMjkwICovCisjZGVmaW5lIElQQ1BPUFRfUFJJRE5TCTEyOQkvKiBSRkMxODc3ICovCisjZGVmaW5lIElQQ1BPUFRfUFJJTkJOUwkxMzAJLyogUkZDMTg3NyAqLworI2RlZmluZSBJUENQT1BUX1NFQ0ROUwkxMzEJLyogUkZDMTg3NyAqLworI2RlZmluZSBJUENQT1BUX1NFQ05CTlMJMTMyCS8qIFJGQzE4NzcgKi8KKworc3RydWN0IHRvayBpcGNwb3B0X3ZhbHVlc1tdID0geworICAgICAgICB7IElQQ1BPUFRfMkFERFIsICJJUC1BZGRycyIgfSwKKyAgICAgICAgeyBJUENQT1BUX0lQQ09NUCwgIklQLUNvbXAiIH0sCisgICAgICAgIHsgSVBDUE9QVF9BRERSLCAiSVAtQWRkciIgfSwKKyAgICAgICAgeyBJUENQT1BUX01PQklMRTQsICJIb21lLUFkZHIiIH0sCisgICAgICAgIHsgSVBDUE9QVF9QUklETlMsICJQcmktRE5TIiB9LAorICAgICAgICB7IElQQ1BPUFRfUFJJTkJOUywgIlByaS1OQk5TIiB9LAorICAgICAgICB7IElQQ1BPUFRfU0VDRE5TLCAiU2VjLUROUyIgfSwKKyAgICAgICAgeyBJUENQT1BUX1NFQ05CTlMsICJTZWMtTkJOUyIgfSwKKwl7IDAsCQkgIE5VTEwgfQorfTsKKworI2RlZmluZSBJUENQT1BUX0lQQ09NUF9IRFJDT01QIDB4NjEgIC8qIHJmYzM1NDQgKi8KKyNkZWZpbmUgSVBDUE9QVF9JUENPTVBfTUlOTEVOICAgIDE0CisKK3N0cnVjdCB0b2sgaXBjcG9wdF9jb21wcHJvdG9fdmFsdWVzW10gPSB7CisgICAgICAgIHsgUFBQX1ZKQywgIlZKLUNvbXAiIH0sCisgICAgICAgIHsgSVBDUE9QVF9JUENPTVBfSERSQ09NUCwgIklQIEhlYWRlciBDb21wcmVzc2lvbiIgfSwKKwl7IDAsCQkgIE5VTEwgfQorfTsKKworc3RydWN0IHRvayBpcGNwb3B0X2NvbXBwcm90b19zdWJvcHRfdmFsdWVzW10gPSB7CisgICAgICAgIHsgMSwgIlJUUC1Db21wcmVzc2lvbiIgfSwKKyAgICAgICAgeyAyLCAiRW5oYW5jZWQgUlRQLUNvbXByZXNzaW9uIiB9LAorCXsgMCwJCSAgTlVMTCB9Cit9OworCisvKiBJUDZDUCBDb25maWcgT3B0aW9ucyAqLworI2RlZmluZSBJUDZDUF9JRklEICAgICAgMQorCitzdHJ1Y3QgdG9rIGlwNmNwb3B0X3ZhbHVlc1tdID0geworICAgICAgICB7IElQNkNQX0lGSUQsICJJbnRlcmZhY2UtSUQiIH0sCisJeyAwLAkJICBOVUxMIH0KK307CisKKy8qIEFUQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KKy8qIE9TSU5MQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KKy8qIEJWQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KKy8qIEJDUCAtIHRvIGJlIHN1cHBvcnRlZCAqLworLyogSVBYQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KKy8qIE1QTFNDUCAtIHRvIGJlIHN1cHBvcnRlZCAqLworCisvKiBBdXRoIEFsZ29yaXRobXMgKi8KKworLyogMC00IFJlc2VydmVkIChSRkMxOTk0KSAqLworI2RlZmluZSBBVVRIQUxHX0NIQVBNRDUJNQkvKiBSRkMxOTk0ICovCisjZGVmaW5lIEFVVEhBTEdfTVNDSEFQMQkxMjgJLyogUkZDMjQzMyAqLworI2RlZmluZSBBVVRIQUxHX01TQ0hBUDIJMTI5CS8qIFJGQzI3OTUgKi8KKworc3RydWN0IHRvayBhdXRoYWxnX3ZhbHVlc1tdID0geworICAgICAgICB7IEFVVEhBTEdfQ0hBUE1ENSwgIk1ENSIgfSwKKyAgICAgICAgeyBBVVRIQUxHX01TQ0hBUDEsICJNUy1DSEFQdjEiIH0sCisgICAgICAgIHsgQVVUSEFMR19NU0NIQVAyLCAiTVMtQ0hBUHYyIiB9LAorCXsgMCwJCSAgTlVMTCB9Cit9OworCisvKiBGQ1MgQWx0ZXJuYXRpdmVzIC0gdG8gYmUgc3VwcG9ydGVkICovCisKKy8qIE11bHRpbGluayBFbmRwb2ludCBEaXNjcmltaW5hdG9yIChSRkMxNzE3KSAqLworI2RlZmluZSBNRURDTEFTU19OVUxMCTAJLyogTnVsbCBDbGFzcyAqLworI2RlZmluZSBNRURDTEFTU19MT0NBTAkxCS8qIExvY2FsbHkgQXNzaWduZWQgKi8KKyNkZWZpbmUgTUVEQ0xBU1NfSVBWNAkyCS8qIEludGVybmV0IFByb3RvY29sIChJUHY0KSAqLworI2RlZmluZSBNRURDTEFTU19NQUMJMwkvKiBJRUVFIDgwMi4xIGdsb2JhbCBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBNRURDTEFTU19NTkIJNAkvKiBQUFAgTWFnaWMgTnVtYmVyIEJsb2NrICovCisjZGVmaW5lIE1FRENMQVNTX1BTTkROCTUJLyogUHVibGljIFN3aXRjaGVkIE5ldHdvcmsgRGlyZWN0b3IgTnVtYmVyICovCisKKy8qIFBQUCBMQ1AgQ2FsbGJhY2sgKi8KKyNkZWZpbmUgQ0FMTEJBQ0tfQVVUSAkwCS8qIExvY2F0aW9uIGRldGVybWluZWQgYnkgdXNlciBhdXRoICovCisjZGVmaW5lIENBTExCQUNLX0RTVFIJMQkvKiBEaWFsaW5nIHN0cmluZyAqLworI2RlZmluZSBDQUxMQkFDS19MSUQJMgkvKiBMb2NhdGlvbiBpZGVudGlmaWVyICovCisjZGVmaW5lIENBTExCQUNLX0UxNjQJMwkvKiBFLjE2NCBudW1iZXIgKi8KKyNkZWZpbmUgQ0FMTEJBQ0tfWDUwMAk0CS8qIFguNTAwIGRpc3Rpbmd1aXNoZWQgbmFtZSAqLworI2RlZmluZSBDQUxMQkFDS19DQkNQCTYJLyogTG9jYXRpb24gaXMgZGV0ZXJtaW5lZCBkdXJpbmcgQ0JDUCBuZWdvICovCisKK3N0cnVjdCB0b2sgcHBwX2NhbGxiYWNrX3ZhbHVlc1tdID0geworICAgICAgICB7IENBTExCQUNLX0FVVEgsICJVc2VyQXV0aCIgfSwKKyAgICAgICAgeyBDQUxMQkFDS19EU1RSLCAiRGlhbFN0cmluZyIgfSwKKyAgICAgICAgeyBDQUxMQkFDS19MSUQsICJMb2NhbElEIiB9LAorICAgICAgICB7IENBTExCQUNLX0UxNjQsICJFLjE2NCIgfSwKKyAgICAgICAgeyBDQUxMQkFDS19YNTAwLCAiWC41MDAiIH0sCisgICAgICAgIHsgQ0FMTEJBQ0tfQ0JDUCwgIkNCQ1AiIH0sCisJeyAwLAkJICBOVUxMIH0KK307CisKKy8qIENIQVAgKi8KKworI2RlZmluZSBDSEFQX0NIQUwJMQorI2RlZmluZSBDSEFQX1JFU1AJMgorI2RlZmluZSBDSEFQX1NVQ0MJMworI2RlZmluZSBDSEFQX0ZBSUwJNAorCitzdHJ1Y3QgdG9rIGNoYXBjb2RlX3ZhbHVlc1tdID0geworCXsgQ0hBUF9DSEFMLCAiQ2hhbGxlbmdlIiB9LAorCXsgQ0hBUF9SRVNQLCAiUmVzcG9uc2UiIH0sCisJeyBDSEFQX1NVQ0MsICJTdWNjZXNzIiB9LAorCXsgQ0hBUF9GQUlMLCAiRmFpbCIgfSwKKyAgICAgICAgeyAwLCBOVUxMfQorfTsKKworLyogUEFQICovCisKKyNkZWZpbmUgUEFQX0FSRVEJMQorI2RlZmluZSBQQVBfQUFDSwkyCisjZGVmaW5lIFBBUF9BTkFLCTMKKworc3RydWN0IHRvayBwYXBjb2RlX3ZhbHVlc1tdID0geworICAgICAgICB7IFBBUF9BUkVRLCAiQXV0aC1SZXEiIH0sCisgICAgICAgIHsgUEFQX0FBQ0ssICJBdXRoLUFDSyIgfSwKKyAgICAgICAgeyBQQVBfQU5BSywgIkF1dGgtTkFDSyIgfSwKKyAgICAgICAgeyAwLCBOVUxMIH0KK307CisKKy8qIEJBUCAqLworI2RlZmluZSBCQVBfQ0FMTFJFUQkxCisjZGVmaW5lIEJBUF9DQUxMUkVTCTIKKyNkZWZpbmUgQkFQX0NCUkVRCTMKKyNkZWZpbmUgQkFQX0NCUkVTCTQKKyNkZWZpbmUgQkFQX0xEUVJFUQk1CisjZGVmaW5lIEJBUF9MRFFSRVMJNgorI2RlZmluZSBCQVBfQ1NJTkQJNworI2RlZmluZSBCQVBfQ1NSRVMJOAorCitzdGF0aWMgdm9pZCBoYW5kbGVfY3RybF9wcm90byAodV9pbnQgcHJvdG8sY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9jaGFwIChjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgaGFuZGxlX3BhcCAoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9iYXAgKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCk7CitzdGF0aWMgdm9pZCBoYW5kbGVfbWxwcHAoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyBpbnQgcHJpbnRfbGNwX2NvbmZpZ19vcHRpb25zIChjb25zdCB1X2NoYXIgKnAsIGludCk7CitzdGF0aWMgaW50IHByaW50X2lwY3BfY29uZmlnX29wdGlvbnMgKGNvbnN0IHVfY2hhciAqcCwgaW50KTsKK3N0YXRpYyBpbnQgcHJpbnRfaXA2Y3BfY29uZmlnX29wdGlvbnMgKGNvbnN0IHVfY2hhciAqcCwgaW50KTsKK3N0YXRpYyBpbnQgcHJpbnRfY2NwX2NvbmZpZ19vcHRpb25zIChjb25zdCB1X2NoYXIgKnAsIGludCk7CitzdGF0aWMgaW50IHByaW50X2JhY3BfY29uZmlnX29wdGlvbnMgKGNvbnN0IHVfY2hhciAqcCwgaW50KTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9wcHAgKHVfaW50IHByb3RvLCBjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpOworc3RhdGljIHZvaWQgcHBwX2hkbGMoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKKworLyogZ2VuZXJpYyBDb250cm9sIFByb3RvY29sIChlLmcuIExDUCwgSVBDUCwgQ0NQLCBldGMuKSBoYW5kbGVyICovCitzdGF0aWMgdm9pZAoraGFuZGxlX2N0cmxfcHJvdG8odV9pbnQgcHJvdG8sIGNvbnN0IHVfY2hhciAqcHB0ciwgaW50IGxlbmd0aCkKK3sKKwljb25zdCBjaGFyICp0eXBlc3RyOworCXVfaW50IGNvZGUsIGxlbjsKKwlpbnQgKCpwZnVuYykoY29uc3QgdV9jaGFyICosIGludCk7CisJaW50IHgsIGo7CisgICAgICAgIGNvbnN0IHVfY2hhciAqdHB0cjsKKworICAgICAgICB0cHRyPXBwdHI7CisKKyAgICAgICAgdHlwZXN0ciA9IHRvazJzdHIocHBwdHlwZTJzdHIsICJ1bmtub3duIGN0cmwtcHJvdG8gKDB4JTA0eCkiLCBwcm90byk7CisgICAgICAgIHByaW50ZigiJXMsICIsdHlwZXN0cik7CisKKwlpZiAobGVuZ3RoIDwgNCkgLyogRklYTUUgd2VhayBib3VuZGFyeSBjaGVja2luZyAqLworCQlnb3RvIHRydW5jOworCVRDSEVDSzIoKnRwdHIsIDIpOworCisJY29kZSA9ICp0cHRyKys7CisJCisgICAgICAgIHByaW50ZigiJXMgKDB4JTAyeCksIGlkICV1LCBsZW5ndGggJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihjcGNvZGVzLCAiVW5rbm93biBPcGNvZGUiLGNvZGUpLAorICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICp0cHRyKyssIC8qIElEICovCisgICAgICAgICAgICAgICBsZW5ndGgrMik7CisKKyAgICAgICAgaWYgKCF2ZmxhZykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKwlpZiAobGVuZ3RoIDw9IDQpCisJCXJldHVybjsgICAgLyogdGhlcmUgbWF5IGJlIGEgTlVMTCBjb25mcmVxIGV0Yy4gKi8KKworCVRDSEVDSzIoKnRwdHIsIDIpOworCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOworCXRwdHIgKz0gMjsKKworICAgICAgICBwcmludGYoIlxuXHRlbmNvZGVkIGxlbmd0aCAldSAoPU9wdGlvbihzKSBsZW5ndGggJXUpIixsZW4sbGVuLTQpOworCisgICAgICAgIGlmICh2ZmxhZz4xKQorICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHItMiwiXG5cdCIsNik7CisKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQ1BDT0RFU19WRVhUOgorCQlpZiAobGVuZ3RoIDwgMTEpCisJCQlicmVhazsKKwkJVENIRUNLMigqdHB0ciwgNCk7CisJCXByaW50ZigiXG5cdCAgTWFnaWMtTnVtIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKKwkJdHB0ciArPSA0OworCQlUQ0hFQ0syKCp0cHRyLCAzKTsKKwkJcHJpbnRmKCIgVmVuZG9yOiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihvdWlfdmFsdWVzLCJVbmtub3duIixFWFRSQUNUXzI0QklUUyh0cHRyKSksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKHRwdHIpKTsKKwkJLyogWFhYOiBuZWVkIHRvIGRlY29kZSBLaW5kIGFuZCBWYWx1ZShzKT8gKi8KKwkJYnJlYWs7CisJY2FzZSBDUENPREVTX0NPTkZfUkVROgorCWNhc2UgQ1BDT0RFU19DT05GX0FDSzoKKwljYXNlIENQQ09ERVNfQ09ORl9OQUs6CisJY2FzZSBDUENPREVTX0NPTkZfUkVKOgorCQl4ID0gbGVuIC0gNDsJLyogQ29kZSgxKSwgSWRlbnRpZmllcigxKSBhbmQgTGVuZ3RoKDIpICovCisJCWRvIHsKKwkJCXN3aXRjaCAocHJvdG8pIHsKKwkJCWNhc2UgUFBQX0xDUDoKKwkJCQlwZnVuYyA9IHByaW50X2xjcF9jb25maWdfb3B0aW9uczsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFBQX0lQQ1A6CisJCQkJcGZ1bmMgPSBwcmludF9pcGNwX2NvbmZpZ19vcHRpb25zOworCQkJCWJyZWFrOworCQkJY2FzZSBQUFBfSVBWNkNQOgorCQkJCXBmdW5jID0gcHJpbnRfaXA2Y3BfY29uZmlnX29wdGlvbnM7CisJCQkJYnJlYWs7CisJCQljYXNlIFBQUF9DQ1A6CisJCQkJcGZ1bmMgPSBwcmludF9jY3BfY29uZmlnX29wdGlvbnM7CisJCQkJYnJlYWs7CisJCQljYXNlIFBQUF9CQUNQOgorCQkJCXBmdW5jID0gcHJpbnRfYmFjcF9jb25maWdfb3B0aW9uczsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyoKKwkJCQkgKiBObyBwcmludCByb3V0aW5lIGZvciB0aGUgb3B0aW9ucyBmb3IKKwkJCQkgKiB0aGlzIHByb3RvY29sLgorCQkJCSAqLworCQkJCXBmdW5jID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBmdW5jID09IE5VTEwpIC8qIGNhdGNoIHRoZSBhYm92ZSBudWxsIHBvaW50ZXIgaWYgdW5rbm93biBDUCAqLworCQkJCWJyZWFrOworIAorCQkJaWYgKChqID0gKCpwZnVuYykodHB0ciwgbGVuKSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXggLT0gajsKKwkJCXRwdHIgKz0gajsKKwkJfSB3aGlsZSAoeCA+IDApOworCQlicmVhazsKKworCWNhc2UgQ1BDT0RFU19URVJNX1JFUToKKwljYXNlIENQQ09ERVNfVEVSTV9BQ0s6CisJCS8qIFhYWDogbmVlZCB0byBkZWNvZGUgRGF0YT8gKi8KKwkJYnJlYWs7CisJY2FzZSBDUENPREVTX0NPREVfUkVKOgorCQkvKiBYWFg6IG5lZWQgdG8gZGVjb2RlIFJlamVjdGVkLVBhY2tldD8gKi8KKwkJYnJlYWs7CisJY2FzZSBDUENPREVTX1BST1RfUkVKOgorCQlpZiAobGVuZ3RoIDwgNikKKwkJCWJyZWFrOworCQlUQ0hFQ0syKCp0cHRyLCAyKTsKKwkJcHJpbnRmKCJcblx0ICBSZWplY3RlZCAlcyBQcm90b2NvbCAoMHglMDR4KSIsCisJCSAgICAgICB0b2syc3RyKHBwcHR5cGUyc3RyLCJ1bmtub3duIiwgRVhUUkFDVF8xNkJJVFModHB0cikpLAorCQkgICAgICAgRVhUUkFDVF8xNkJJVFModHB0cikpOworCQkvKiBYWFg6IG5lZWQgdG8gZGVjb2RlIFJlamVjdGVkLUluZm9ybWF0aW9uPyAtIGhleGR1bXAgZm9yIG5vdyAqLworICAgICAgICAgICAgICAgIGlmIChsZW4gPiA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIFJlamVjdGVkIFBhY2tldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrMiwiXG5cdCAgICAiLGxlbi0yKTsKKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCWNhc2UgQ1BDT0RFU19FQ0hPX1JFUToKKwljYXNlIENQQ09ERVNfRUNIT19SUEw6CisJY2FzZSBDUENPREVTX0RJU0NfUkVROgorCQlpZiAobGVuZ3RoIDwgOCkKKwkJCWJyZWFrOworCQlUQ0hFQ0syKCp0cHRyLCA0KTsKKwkJcHJpbnRmKCJcblx0ICBNYWdpYy1OdW0gMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOworCQkvKiBYWFg6IG5lZWQgdG8gZGVjb2RlIERhdGE/IC0gaGV4ZHVtcCBmb3Igbm93ICovCisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgLS0tLS10cmFpbGluZyBkYXRhLS0tLS0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0cls0XSwgbGVuLTgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrNCwiXG5cdCAgIixsZW4tOCk7CisgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKwljYXNlIENQQ09ERVNfSUQ6CisJCWlmIChsZW5ndGggPCA4KQorCQkJYnJlYWs7CisJCVRDSEVDSzIoKnRwdHIsIDQpOworCQlwcmludGYoIlxuXHQgIE1hZ2ljLU51bSAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7CisJCS8qIFJGQyAxNjYxIHNheXMgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBodW1hbiByZWFkYWJsZSAqLworICAgICAgICAgICAgICAgIGlmIChsZW4gPiA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIE1lc3NhZ2Vcblx0ICAgICIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm5fcHJpbnRuKHRwdHIrNCxsZW4tNCxzbmFwZW5kKTsKKyAgICAgICAgICAgICAgICB9CisJCWJyZWFrOworCWNhc2UgQ1BDT0RFU19USU1FX1JFTToKKwkJaWYgKGxlbmd0aCA8IDEyKQorCQkJYnJlYWs7CisJCVRDSEVDSzIoKnRwdHIsIDQpOworCQlwcmludGYoIlxuXHQgIE1hZ2ljLU51bSAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7CisJCVRDSEVDSzIoKih0cHRyICsgNCksIDQpOworCQlwcmludGYoIiwgU2Vjb25kcy1SZW1haW5pbmcgJXVzIiwgRVhUUkFDVF8zMkJJVFModHB0ciArIDQpKTsKKwkJLyogWFhYOiBuZWVkIHRvIGRlY29kZSBNZXNzYWdlPyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgLyogWFhYIHRoaXMgaXMgZGlydHkgYnV0IHdlIGRvIG5vdCBnZXQgdGhlCisgICAgICAgICAgICAgKiBvcmlnaW5hbCBwb2ludGVyIHBhc3NlZCB0byB0aGUgYmVnaW4KKyAgICAgICAgICAgICAqIHRoZSBQUFAgcGFja2V0ICovCisgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCisgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLTIsIlxuXHQgICIsbGVuZ3RoKzIpOworCQlicmVhazsKKwl9CisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIlt8JXNdIiwgdHlwZXN0cik7Cit9CisKKy8qIExDUCBjb25maWcgb3B0aW9ucyAqLworc3RhdGljIGludAorcHJpbnRfbGNwX2NvbmZpZ19vcHRpb25zKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuLCBvcHQ7CisKKwlpZiAobGVuZ3RoIDwgMikKKwkJcmV0dXJuIDA7CisJVENIRUNLMigqcCwgMik7CisJbGVuID0gcFsxXTsKKwlvcHQgPSBwWzBdOworCWlmIChsZW5ndGggPCBsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPCAyKSB7CisJCWlmICgob3B0ID49IExDUE9QVF9NSU4pICYmIChvcHQgPD0gTENQT1BUX01BWCkpCisJCQlwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1IChib2d1cywgc2hvdWxkIGJlID49IDIpIiwgbGNwY29uZm9wdHNbb3B0XSxvcHQsbGVuKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJcblx0dW5rbm93biBMQ1Agb3B0aW9uIDB4JTAyeCIsIG9wdCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKG9wdCA+PSBMQ1BPUFRfTUlOKSAmJiAob3B0IDw9IExDUE9QVF9NQVgpKQorCQlwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1OiAiLCBsY3Bjb25mb3B0c1tvcHRdLG9wdCxsZW4pOworCWVsc2UgeworCQlwcmludGYoIlxuXHR1bmtub3duIExDUCBvcHRpb24gMHglMDJ4Iiwgb3B0KTsKKwkJcmV0dXJuIGxlbjsKKwl9CisKKwlzd2l0Y2ggKG9wdCkgeworCWNhc2UgTENQT1BUX1ZFWFQ6CisJCWlmIChsZW4gPj0gNikgeworCQkJVENIRUNLMigqKHAgKyAyKSwgMyk7CisJCQlwcmludGYoIlZlbmRvcjogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihvdWlfdmFsdWVzLCJVbmtub3duIixFWFRSQUNUXzI0QklUUyhwKzIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwKzIpKTsKKyNpZiAwCisJCQlUQ0hFQ0socFs1XSk7CisJCQlwcmludGYoIiwga2luZDogMHglMDJ4IiwgcFs1XSk7CisJCQlwcmludGYoIiwgVmFsdWU6IDB4IikKKwkJCWZvciAoaSA9IDA7IGkgPCBsZW4gLSA2OyBpKyspIHsKKwkJCQlUQ0hFQ0socFs2ICsgaV0pOworCQkJCXByaW50ZigiJTAyeCIsIHBbNiArIGldKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgTENQT1BUX01SVToKKwkJaWYgKGxlbiA9PSA0KSB7CisJCQlUQ0hFQ0syKCoocCArIDIpLCAyKTsKKwkJCXByaW50ZigiJXUiLCBFWFRSQUNUXzE2QklUUyhwICsgMikpOworCQl9CisJCWJyZWFrOworCWNhc2UgTENQT1BUX0FDQ006CisJCWlmIChsZW4gPT0gNikgeworCQkJVENIRUNLMigqKHAgKyAyKSwgNCk7CisJCQlwcmludGYoIjB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHAgKyAyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMQ1BPUFRfQVA6CisJCWlmIChsZW4gPj0gNCkgeworCQkgICAgVENIRUNLMigqKHAgKyAyKSwgMik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCB0b2syc3RyKHBwcHR5cGUyc3RyLCJVbmtub3duIEF1dGggUHJvdG8gKDB4MDR4KSIsRVhUUkFDVF8xNkJJVFMocCsyKSkpOworCisJCSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKHArMikpIHsKKwkJICAgIGNhc2UgUFBQX0NIQVA6CisJCSAgICAgICAgVENIRUNLKHBbNF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzIix0b2syc3RyKGF1dGhhbGdfdmFsdWVzLCJVbmtub3duIEF1dGggQWxnICV1IixwWzRdKSk7CisJCQlicmVhazsKKwkJICAgIGNhc2UgUFBQX1BBUDogLyogZmFsbCB0aHJvdWdoICovCisJCSAgICBjYXNlIFBQUF9FQVA6CisJCSAgICBjYXNlIFBQUF9TUEFQOgorCQkgICAgY2FzZSBQUFBfU1BBUF9PTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocCwiXG5cdCIsbGVuKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKwljYXNlIExDUE9QVF9RUDoKKwkJaWYgKGxlbiA+PSA0KSB7CisJCQlUQ0hFQ0syKCoocCArIDIpLCAyKTsKKwkJICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMocCsyKSA9PSBQUFBfTFFNKQorCQkJCXByaW50ZigiIExRUiIpOworCQkJZWxzZQorCQkJCXByaW50ZigiIHVua25vd24iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUE9QVF9NTjoKKwkJaWYgKGxlbiA9PSA2KSB7CisJCQlUQ0hFQ0syKCoocCArIDIpLCA0KTsKKwkJCXByaW50ZigiMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMocCArIDIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUE9QVF9QRkM6CisJCWJyZWFrOworCWNhc2UgTENQT1BUX0FDRkM6CisJCWJyZWFrOworCWNhc2UgTENQT1BUX0xEOgorCQlpZiAobGVuID09IDQpIHsKKwkJCVRDSEVDSzIoKihwICsgMiksIDIpOworCQkJcHJpbnRmKCIweCUwNHgiLCBFWFRSQUNUXzE2QklUUyhwICsgMikpOworCQl9CisJCWJyZWFrOworCWNhc2UgTENQT1BUX0NCQUNLOgorCQlpZiAobGVuIDwgMykKKwkJCWJyZWFrOworCQlUQ0hFQ0socFsyXSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDYWxsYmFjayBPcGVyYXRpb24gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocHBwX2NhbGxiYWNrX3ZhbHVlcywiVW5rbm93biIscFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgIHBbMl0pOworCQlicmVhazsKKwljYXNlIExDUE9QVF9NTE1SUlU6CisJCWlmIChsZW4gPT0gNCkgeworCQkJVENIRUNLMigqKHAgKyAyKSwgMik7CisJCQlwcmludGYoIiV1IiwgRVhUUkFDVF8xNkJJVFMocCArIDIpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIExDUE9QVF9NTEVEOgorCQlpZiAobGVuIDwgMykKKwkJCWJyZWFrOworCQlUQ0hFQ0socFsyXSk7CisJCXN3aXRjaCAocFsyXSkgewkJLyogY2xhc3MgKi8KKwkJY2FzZSBNRURDTEFTU19OVUxMOgorCQkJcHJpbnRmKCJOdWxsIik7CisJCQlicmVhazsKKwkJY2FzZSBNRURDTEFTU19MT0NBTDoKKwkJCXByaW50ZigiTG9jYWwiKTsgLyogWFhYICovCisJCQlicmVhazsKKwkJY2FzZSBNRURDTEFTU19JUFY0OgorCQkJaWYgKGxlbiAhPSA3KQorCQkJCWJyZWFrOworCQkJVENIRUNLMigqKHAgKyAzKSwgNCk7CisJCQlwcmludGYoIklQdjQgJXMiLCBpcGFkZHJfc3RyaW5nKHAgKyAzKSk7CisJCQlicmVhazsKKwkJY2FzZSBNRURDTEFTU19NQUM6CisJCQlpZiAobGVuICE9IDkpCisJCQkJYnJlYWs7CisJCQlUQ0hFQ0socFs4XSk7CisJCQlwcmludGYoIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkgICAgICAgcFszXSwgcFs0XSwgcFs1XSwgcFs2XSwgcFs3XSwgcFs4XSk7CisJCQlicmVhazsKKwkJY2FzZSBNRURDTEFTU19NTkI6CisJCQlwcmludGYoIk1hZ2ljLU51bS1CbG9jayIpOyAvKiBYWFggKi8KKwkJCWJyZWFrOworCQljYXNlIE1FRENMQVNTX1BTTkROOgorCQkJcHJpbnRmKCJQU05ETiIpOyAvKiBYWFggKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisvKiBYWFg6IHRvIGJlIHN1cHBvcnRlZCAqLworI2lmIDAKKwljYXNlIExDUE9QVF9ERVA2OgorCWNhc2UgTENQT1BUX0ZDU0FMVDoKKwljYXNlIExDUE9QVF9TRFA6CisJY2FzZSBMQ1BPUFRfTlVNTU9ERToKKwljYXNlIExDUE9QVF9ERVAxMjoKKwljYXNlIExDUE9QVF9ERVAxNDoKKwljYXNlIExDUE9QVF9ERVAxNToKKwljYXNlIExDUE9QVF9ERVAxNjoKKyAgICAgICAgY2FzZSBMQ1BPUFRfTUxTU05IRjoKKwljYXNlIExDUE9QVF9QUk9QOgorCWNhc2UgTENQT1BUX0RDRUlEOgorCWNhc2UgTENQT1BUX01QUDoKKwljYXNlIExDUE9QVF9MQ1BBT1BUOgorCWNhc2UgTENQT1BUX0NPQlM6CisJY2FzZSBMQ1BPUFRfUEU6CisJY2FzZSBMQ1BPUFRfTUxIRjoKKwljYXNlIExDUE9QVF9JMThOOgorCWNhc2UgTENQT1BUX1NETE9TOgorCWNhc2UgTENQT1BUX1BQUE1VWDoKKwkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZih2ZmxhZzwyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCX0KKyAgICAgICAgIAorICAgICAgICBpZiAodmZsYWc+MSkKKyAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7IC8qIGV4Y2x1ZGUgVExWIGhlYWRlciAqLworCisJcmV0dXJuIGxlbjsKKwordHJ1bmM6CisJcHJpbnRmKCJbfGxjcF0iKTsKKwlyZXR1cm4gMDsKK30KKworLyogTUwtUFBQKi8KK3N0cnVjdCB0b2sgcHBwX21sX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDgwLCAiYmVnaW4iIH0sCisgICAgeyAweDQwLCAiZW5kIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgdm9pZAoraGFuZGxlX21scHBwKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkgeworCisgICAgaWYgKCFlZmxhZykKKyAgICAgICAgcHJpbnRmKCJNTFBQUCwgIik7CisKKyAgICBwcmludGYoInNlcSAweCUwM3gsIEZsYWdzIFslc10sIGxlbmd0aCAldSIsCisgICAgICAgICAgIChFWFRSQUNUXzE2QklUUyhwKSkmMHgwZmZmLCAvKiBvbmx5IHN1cHBvcnQgMTItQml0IHNlcXVlbmNlIHNwYWNlIGZvciBub3cgKi8KKyAgICAgICAgICAgYml0dG9rMnN0cihwcHBfbWxfZmxhZ192YWx1ZXMsICJub25lIiwgKnAgJiAweGMwKSwKKyAgICAgICAgICAgbGVuZ3RoKTsKKworICAgIHJldHVybjsKK30KKworLyogQ0hBUCAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9jaGFwKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKK3sKKwl1X2ludCBjb2RlLCBsZW47CisJaW50IHZhbF9zaXplLCBuYW1lX3NpemUsIG1zZ19zaXplOworCWNvbnN0IHVfY2hhciAqcDA7CisJaW50IGk7CisKKwlwMCA9IHA7CisJaWYgKGxlbmd0aCA8IDEpIHsKKwkJcHJpbnRmKCJbfGNoYXBdIik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGxlbmd0aCA8IDQpIHsKKwkJVENIRUNLKCpwKTsKKwkJcHJpbnRmKCJbfGNoYXAgMHglMDJ4XSIsICpwKTsKKwkJcmV0dXJuOworCX0KKworCVRDSEVDSygqcCk7CisJY29kZSA9ICpwOworICAgICAgICBwcmludGYoIkNIQVAsICVzICgweCUwMngpIiwKKyAgICAgICAgICAgICAgIHRvazJzdHIoY2hhcGNvZGVfdmFsdWVzLCJ1bmtub3duIixjb2RlKSwKKyAgICAgICAgICAgICAgIGNvZGUpOworCXArKzsKKworCVRDSEVDSygqcCk7CisJcHJpbnRmKCIsIGlkICV1IiwgKnApOwkJLyogSUQgKi8KKwlwKys7CisKKwlUQ0hFQ0syKCpwLCAyKTsKKwlsZW4gPSBFWFRSQUNUXzE2QklUUyhwKTsKKwlwICs9IDI7CisKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgZ2VuZXJpYyBDSEFQIGRlY29kaW5nIHJvdXRpbmUuIFNpbmNlIHdlCisJICogZG9uJ3Qga25vdyB3aGljaCBmbGF2b3Igb2YgQ0hBUCAoaS5lLiBDSEFQLU1ENSwgTVMtQ0hBUHYxLAorCSAqIE1TLUNIQVB2MikgaXMgdXNlZCBhdCB0aGlzIHBvaW50LCB3ZSBjYW4ndCBkZWNvZGUgcGFja2V0CisJICogc3BlY2lmaWNhbGx5IHRvIGVhY2ggYWxnb3JpdGhtcy4gSW5zdGVhZCwgd2Ugc2ltcGx5IGRlY29kZQorCSAqIHRoZSBHQ0QgKEdyYXRlc3QgQ29tbW9uIERlbm9taW5hdG9yKSBmb3IgYWxsIGFsZ29yaXRobXMuCisJICovCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBDSEFQX0NIQUw6CisJY2FzZSBDSEFQX1JFU1A6CisJCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IDEpCisJCQlyZXR1cm47CisJCVRDSEVDSygqcCk7CisJCXZhbF9zaXplID0gKnA7CQkvKiB2YWx1ZSBzaXplICovCisJCXArKzsKKwkJaWYgKGxlbmd0aCAtIChwIC0gcDApIDwgdmFsX3NpemUpCisJCQlyZXR1cm47CisJCXByaW50ZigiLCBWYWx1ZSAiKTsKKwkJZm9yIChpID0gMDsgaSA8IHZhbF9zaXplOyBpKyspIHsKKwkJCVRDSEVDSygqcCk7CisJCQlwcmludGYoIiUwMngiLCAqcCsrKTsKKwkJfQorCQluYW1lX3NpemUgPSBsZW4gLSAocCAtIHAwKTsKKwkJcHJpbnRmKCIsIE5hbWUgIik7CisJCWZvciAoaSA9IDA7IGkgPCBuYW1lX3NpemU7IGkrKykgeworCQkJVENIRUNLKCpwKTsKKwkJCXNhZmVwdXRjaGFyKCpwKyspOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0hBUF9TVUNDOgorCWNhc2UgQ0hBUF9GQUlMOgorCQltc2dfc2l6ZSA9IGxlbiAtIChwIC0gcDApOworCQlwcmludGYoIiwgTXNnICIpOworCQlmb3IgKGkgPSAwOyBpPCBtc2dfc2l6ZTsgaSsrKSB7CisJCQlUQ0hFQ0soKnApOworCQkJc2FmZXB1dGNoYXIoKnArKyk7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCJbfGNoYXBdIik7Cit9CisKKy8qIFBBUCAoc2VlIFJGQyAxMzM0KSAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9wYXAoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKQoreworCXVfaW50IGNvZGUsIGxlbjsKKwlpbnQgcGVlcmlkX2xlbiwgcGFzc3dkX2xlbiwgbXNnX2xlbjsKKwljb25zdCB1X2NoYXIgKnAwOworCWludCBpOworCisJcDAgPSBwOworCWlmIChsZW5ndGggPCAxKSB7CisJCXByaW50ZigiW3xwYXBdIik7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKGxlbmd0aCA8IDQpIHsKKwkJVENIRUNLKCpwKTsKKwkJcHJpbnRmKCJbfHBhcCAweCUwMnhdIiwgKnApOworCQlyZXR1cm47CisJfQorCisJVENIRUNLKCpwKTsKKwljb2RlID0gKnA7CisgICAgICAgIHByaW50ZigiUEFQLCAlcyAoMHglMDJ4KSIsCisgICAgICAgICAgICAgICB0b2syc3RyKHBhcGNvZGVfdmFsdWVzLCJ1bmtub3duIixjb2RlKSwKKyAgICAgICAgICAgICAgIGNvZGUpOworCXArKzsKKworCVRDSEVDSygqcCk7CisJcHJpbnRmKCIsIGlkICV1IiwgKnApOwkJLyogSUQgKi8KKwlwKys7CisKKwlUQ0hFQ0syKCpwLCAyKTsKKwlsZW4gPSBFWFRSQUNUXzE2QklUUyhwKTsKKwlwICs9IDI7CisKKwlpZiAoKGludClsZW4gPiBsZW5ndGgpIHsKKwkJcHJpbnRmKCIsIGxlbmd0aCAldSA+IHBhY2tldCBzaXplIiwgbGVuKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggPSBsZW47CisJaWYgKGxlbmd0aCA8IChwIC0gcDApKSB7CisJCXByaW50ZigiLCBsZW5ndGggJXUgPCBQQVAgaGVhZGVyIGxlbmd0aCIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFBBUF9BUkVROgorCQlpZiAobGVuZ3RoIC0gKHAgLSBwMCkgPCAxKQorCQkJcmV0dXJuOworCQlUQ0hFQ0soKnApOworCQlwZWVyaWRfbGVuID0gKnA7CS8qIFBlZXItSUQgTGVuZ3RoICovCisJCXArKzsKKwkJaWYgKGxlbmd0aCAtIChwIC0gcDApIDwgcGVlcmlkX2xlbikKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIsIFBlZXIgIik7CisJCWZvciAoaSA9IDA7IGkgPCBwZWVyaWRfbGVuOyBpKyspIHsKKwkJCVRDSEVDSygqcCk7CisJCQlzYWZlcHV0Y2hhcigqcCsrKTsKKwkJfQorCisJCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IDEpCisJCQlyZXR1cm47CisJCVRDSEVDSygqcCk7CisJCXBhc3N3ZF9sZW4gPSAqcDsJLyogUGFzc3dvcmQgTGVuZ3RoICovCisJCXArKzsKKwkJaWYgKGxlbmd0aCAtIChwIC0gcDApIDwgcGFzc3dkX2xlbikKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIsIE5hbWUgIik7CisJCWZvciAoaSA9IDA7IGkgPCBwYXNzd2RfbGVuOyBpKyspIHsKKwkJCVRDSEVDSygqcCk7CisJCQlzYWZlcHV0Y2hhcigqcCsrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFBBUF9BQUNLOgorCWNhc2UgUEFQX0FOQUs6CisJCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IDEpCisJCQlyZXR1cm47CisJCVRDSEVDSygqcCk7CisJCW1zZ19sZW4gPSAqcDsJCS8qIE1zZy1MZW5ndGggKi8KKwkJcCsrOworCQlpZiAobGVuZ3RoIC0gKHAgLSBwMCkgPCBtc2dfbGVuKQorCQkJcmV0dXJuOworCQlwcmludGYoIiwgTXNnICIpOworCQlmb3IgKGkgPSAwOyBpPCBtc2dfbGVuOyBpKyspIHsKKwkJCVRDSEVDSygqcCk7CisJCQlzYWZlcHV0Y2hhcigqcCsrKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIlt8cGFwXSIpOworfQorCisvKiBCQVAgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfYmFwKGNvbnN0IHVfY2hhciAqcCBfVV8sIGludCBsZW5ndGggX1VfKQoreworCS8qIFhYWDogdG8gYmUgc3VwcG9ydGVkISEgKi8KK30KKworCisvKiBJUENQIGNvbmZpZyBvcHRpb25zICovCitzdGF0aWMgaW50CitwcmludF9pcGNwX2NvbmZpZ19vcHRpb25zKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuLCBvcHQ7CisgICAgICAgIHVfaW50IGNvbXBwcm90bywgaXBjb21wX3N1Ym9wdHRvdGFsbGVuLCBpcGNvbXBfc3Vib3B0LCBpcGNvbXBfc3Vib3B0bGVuOworCisJaWYgKGxlbmd0aCA8IDIpCisJCXJldHVybiAwOworCVRDSEVDSzIoKnAsIDIpOworCWxlbiA9IHBbMV07CisJb3B0ID0gcFswXTsKKwlpZiAobGVuZ3RoIDwgbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAobGVuIDwgMikgeworCQlwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1IChib2d1cywgc2hvdWxkIGJlID49IDIpIiwKKwkJICAgICAgIHRvazJzdHIoaXBjcG9wdF92YWx1ZXMsInVua25vd24iLG9wdCksCisJCSAgICAgICBvcHQsCisgICAgICAgIAkgICAgICAgbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRmKCJcblx0ICAlcyBPcHRpb24gKDB4JTAyeCksIGxlbmd0aCAldTogIiwKKwkgICAgICAgdG9rMnN0cihpcGNwb3B0X3ZhbHVlcywidW5rbm93biIsb3B0KSwKKwkgICAgICAgb3B0LAorICAgICAgICAgICAgICAgbGVuKTsKKworCXN3aXRjaCAob3B0KSB7CisJY2FzZSBJUENQT1BUXzJBRERSOgkJLyogZGVwcmVjYXRlZCAqLworCQlpZiAobGVuICE9IDEwKQorCQkJZ290byBpbnZsZW47CisJCVRDSEVDSzIoKihwICsgNiksIDQpOworCQlwcmludGYoInNyYyAlcywgZHN0ICVzIiwKKwkJICAgICAgIGlwYWRkcl9zdHJpbmcocCArIDIpLAorCQkgICAgICAgaXBhZGRyX3N0cmluZyhwICsgNikpOworCQlicmVhazsKKwljYXNlIElQQ1BPUFRfSVBDT01QOgorCQlpZiAobGVuIDwgNCkKKwkJCWdvdG8gaW52bGVuOworCQlUQ0hFQ0syKCoocCArIDIpLCAyKTsKKyAgICAgICAgICAgICAgICBjb21wcHJvdG8gPSBFWFRSQUNUXzE2QklUUyhwKzIpOworCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAoMHglMDJ4KToiLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGlwY3BvcHRfY29tcHByb3RvX3ZhbHVlcywiVW5rbm93biIsY29tcHByb3RvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcHByb3RvKTsKKworCQlzd2l0Y2ggKGNvbXBwcm90bykgeworICAgICAgICAgICAgICAgIGNhc2UgUFBQX1ZKQzoKKwkJCS8qIFhYWDogVkotQ29tcCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBkZWNvZGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElQQ1BPUFRfSVBDT01QX0hEUkNPTVA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDwgSVBDUE9QVF9JUENPTVBfTUlOTEVOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGludmxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqKHAgKyAyKSwgSVBDUE9QVF9JUENPTVBfTUlOTEVOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBUQ1AgU3BhY2UgJXUsIG5vbi1UQ1AgU3BhY2UgJXUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBtYXhQZXJpb2QgJXUsIG1heFRpbWUgJXUsIG1heEhkciAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocCs0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhwKzYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHArOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocCsxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocCsxMikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWJvcHRpb25zIHByZXNlbnQgPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IElQQ1BPUFRfSVBDT01QX01JTkxFTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNvbXBfc3Vib3B0dG90YWxsZW4gPSBsZW4gLSBJUENQT1BUX0lQQ09NUF9NSU5MRU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gSVBDUE9QVF9JUENPTVBfTUlOTEVOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgU3Vib3B0aW9ucywgbGVuZ3RoICV1IiwgaXBjb21wX3N1Ym9wdHRvdGFsbGVuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXBjb21wX3N1Ym9wdHRvdGFsbGVuID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCpwLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNvbXBfc3Vib3B0ID0gKnA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjb21wX3N1Ym9wdGxlbiA9ICoocCsxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXBjb21wX3N1Ym9wdCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHRsZW4gPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWDoganVzdCBkaXNwbGF5IHRoZSBzdWJvcHRpb25zIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdCVzIFN1Ym9wdGlvbiAjJXUsIGxlbmd0aCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaXBjcG9wdF9jb21wcHJvdG9fc3Vib3B0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjb21wX3N1Ym9wdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHRsZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjb21wX3N1Ym9wdHRvdGFsbGVuIC09IGlwY29tcF9zdWJvcHRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBpcGNvbXBfc3Vib3B0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElQQ1BPUFRfQUREUjogICAgIC8qIHRob3NlIG9wdGlvbnMgc2hhcmUgdGhlIHNhbWUgZm9ybWF0IC0gZmFsbCB0aHJvdWdoICovCisJY2FzZSBJUENQT1BUX01PQklMRTQ6CisJY2FzZSBJUENQT1BUX1BSSUROUzoKKwljYXNlIElQQ1BPUFRfUFJJTkJOUzoKKwljYXNlIElQQ1BPUFRfU0VDRE5TOgorCWNhc2UgSVBDUE9QVF9TRUNOQk5TOgorCQlpZiAobGVuICE9IDYpCisJCQlnb3RvIGludmxlbjsKKwkJVENIRUNLMigqKHAgKyAyKSwgNCk7CisJCXByaW50ZigiJXMiLCBpcGFkZHJfc3RyaW5nKHAgKyAyKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYodmZsYWc8MikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsKKwkJYnJlYWs7CisJfQorICAgICAgICBpZiAodmZsYWc+MSkKKyAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7IC8qIGV4Y2x1ZGUgVExWIGhlYWRlciAqLworCXJldHVybiBsZW47CisKK2ludmxlbjoKKwlwcmludGYoIiwgaW52YWxpZC1sZW5ndGgtJWQiLCBvcHQpOworCXJldHVybiAwOworCit0cnVuYzoKKwlwcmludGYoIlt8aXBjcF0iKTsKKwlyZXR1cm4gMDsKK30KKworLyogSVA2Q1AgY29uZmlnIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQKK3ByaW50X2lwNmNwX2NvbmZpZ19vcHRpb25zKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuLCBvcHQ7CisKKwlpZiAobGVuZ3RoIDwgMikKKwkJcmV0dXJuIDA7CisJVENIRUNLMigqcCwgMik7CisJbGVuID0gcFsxXTsKKwlvcHQgPSBwWzBdOworCWlmIChsZW5ndGggPCBsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPCAyKSB7CisJCXByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXUgKGJvZ3VzLCBzaG91bGQgYmUgPj0gMikiLAorCQkgICAgICAgdG9rMnN0cihpcDZjcG9wdF92YWx1ZXMsInVua25vd24iLG9wdCksCisJCSAgICAgICBvcHQsCisJICAgICAgICAgICAgICAgbGVuKTsKKwkgICAgICAgIHJldHVybiAwOworCX0KKworCXByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXU6ICIsCisJICAgICAgIHRvazJzdHIoaXA2Y3BvcHRfdmFsdWVzLCJ1bmtub3duIixvcHQpLAorCSAgICAgICBvcHQsCisgICAgICAgICAgICAgICBsZW4pOworCisJc3dpdGNoIChvcHQpIHsKKwljYXNlIElQNkNQX0lGSUQ6CisJCWlmIChsZW4gIT0gMTApCisJCQlnb3RvIGludmxlbjsKKwkJVENIRUNLMigqKHAgKyAyKSwgOCk7CisJCXByaW50ZigiJTA0eDolMDR4OiUwNHg6JTA0eCIsCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhwICsgMiksCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhwICsgNCksCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhwICsgNiksCisJCSAgICAgICBFWFRSQUNUXzE2QklUUyhwICsgOCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKHZmbGFnPDIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7CisJCWJyZWFrOworCX0KKyAgICAgICAgaWYgKHZmbGFnPjEpCisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOyAvKiBleGNsdWRlIFRMViBoZWFkZXIgKi8KKworCXJldHVybiBsZW47CisKK2ludmxlbjoKKwlwcmludGYoIiwgaW52YWxpZC1sZW5ndGgtJWQiLCBvcHQpOworCXJldHVybiAwOworCit0cnVuYzoKKwlwcmludGYoIlt8aXA2Y3BdIik7CisJcmV0dXJuIDA7Cit9CisKKworLyogQ0NQIGNvbmZpZyBvcHRpb25zICovCitzdGF0aWMgaW50CitwcmludF9jY3BfY29uZmlnX29wdGlvbnMoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKQoreworCWludCBsZW4sIG9wdDsKKworCWlmIChsZW5ndGggPCAyKQorCQlyZXR1cm4gMDsKKwlUQ0hFQ0syKCpwLCAyKTsKKwlsZW4gPSBwWzFdOworCW9wdCA9IHBbMF07CisJaWYgKGxlbmd0aCA8IGxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA8IDIpIHsKKwkgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXUgKGJvZ3VzLCBzaG91bGQgYmUgPj0gMikiLAorICAgICAgICAJICAgICAgIHRvazJzdHIoY2NwY29uZm9wdHNfdmFsdWVzLCAiVW5rbm93biIsIG9wdCksCisJICAgICAgICAgICAgICAgb3B0LAorICAgICAgICAJICAgICAgIGxlbik7CisgICAgICAgIAlyZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXU6IiwKKyAgICAgICAgICAgICAgIHRvazJzdHIoY2NwY29uZm9wdHNfdmFsdWVzLCAiVW5rbm93biIsIG9wdCksCisgICAgICAgICAgICAgICBvcHQsCisgICAgICAgICAgICAgICBsZW4pOworCisJc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggLS0+IGRlZmF1bHQ6IG5vdGhpbmcgc3VwcG9ydGVkIHlldCAqLworCWNhc2UgQ0NQT1BUX09VSToKKwljYXNlIENDUE9QVF9QUkVEMToKKwljYXNlIENDUE9QVF9QUkVEMjoKKwljYXNlIENDUE9QVF9QSlVNUDoKKwljYXNlIENDUE9QVF9IUFBQQzoKKwljYXNlIENDUE9QVF9TVEFDTFpTOgorCWNhc2UgQ0NQT1BUX01QUEM6CisJY2FzZSBDQ1BPUFRfR0ZaQToKKwljYXNlIENDUE9QVF9WNDJCSVM6CisJY2FzZSBDQ1BPUFRfQlNEQ09NUDoKKwljYXNlIENDUE9QVF9MWlNEQ1A6CisJY2FzZSBDQ1BPUFRfTVZSQ0E6CisJY2FzZSBDQ1BPUFRfREVDOgorCWNhc2UgQ0NQT1BUX0RFRkxBVEU6CisJY2FzZSBDQ1BPUFRfUkVTVjoKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmKHZmbGFnPDIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7CisJCWJyZWFrOworCX0KKyAgICAgICAgaWYgKHZmbGFnPjEpCisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOyAvKiBleGNsdWRlIFRMViBoZWFkZXIgKi8KKworCXJldHVybiBsZW47CisKK3RydW5jOgorCXByaW50ZigiW3xjY3BdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEJBQ1AgY29uZmlnIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQKK3ByaW50X2JhY3BfY29uZmlnX29wdGlvbnMoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKQoreworCWludCBsZW4sIG9wdDsKKworCWlmIChsZW5ndGggPCAyKQorCQlyZXR1cm4gMDsKKwlUQ0hFQ0syKCpwLCAyKTsKKwlsZW4gPSBwWzFdOworCW9wdCA9IHBbMF07CisJaWYgKGxlbmd0aCA8IGxlbikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA8IDIpIHsKKwkgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXUgKGJvZ3VzLCBzaG91bGQgYmUgPj0gMikiLAorICAgICAgICAJICAgICAgIHRvazJzdHIoYmFjY29uZm9wdHNfdmFsdWVzLCAiVW5rbm93biIsIG9wdCksCisJICAgICAgICAgICAgICAgb3B0LAorICAgICAgICAJICAgICAgIGxlbik7CisgICAgICAgIAlyZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXU6IiwKKyAgICAgICAgICAgICAgIHRvazJzdHIoYmFjY29uZm9wdHNfdmFsdWVzLCAiVW5rbm93biIsIG9wdCksCisgICAgICAgICAgICAgICBvcHQsCisgICAgICAgICAgICAgICBsZW4pOworCisJc3dpdGNoIChvcHQpIHsKKwljYXNlIEJBQ1BPUFRfRlBFRVI6CisJCVRDSEVDSzIoKihwICsgMiksIDQpOworCQlwcmludGYoIiwgTWFnaWMtTnVtIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHAgKyAyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZih2ZmxhZzwyKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOworCQlicmVhazsKKwl9CisgICAgICAgIGlmICh2ZmxhZz4xKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsgLyogZXhjbHVkZSBUTFYgaGVhZGVyICovCisKKwlyZXR1cm4gbGVuOworCit0cnVuYzoKKwlwcmludGYoIlt8YmFjcF0iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAorcHBwX2hkbGMoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKQoreworCXVfY2hhciAqYiwgKnMsICp0LCBjOworCWludCBpLCBwcm90bzsKKwljb25zdCB2b2lkICpzZTsKKworCWIgPSAodV9pbnQ4X3QgKiltYWxsb2MobGVuZ3RoKTsKKwlpZiAoYiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFVuZXNjYXBlIGFsbCB0aGUgZGF0YSBpbnRvIGEgdGVtcG9yYXJ5LCBwcml2YXRlLCBidWZmZXIuCisJICogRG8gdGhpcyBzbyB0aGF0IHdlIGRvbnQgb3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBwYWNrZXQKKwkgKiBjb250ZW50cy4KKwkgKi8KKwlmb3IgKHMgPSAodV9jaGFyICopcCwgdCA9IGIsIGkgPSBsZW5ndGg7IGkgPiAwOyBpLS0pIHsKKwkJYyA9ICpzKys7CisJCWlmIChjID09IDB4N2QpIHsKKwkJCWlmIChpID4gMSkgeworCQkJCWktLTsKKwkJCQljID0gKnMrKyBeIDB4MjA7CisJCQl9IGVsc2UKKwkJCQljb250aW51ZTsKKwkJfQorCQkqdCsrID0gYzsKKwl9CisKKwlzZSA9IHNuYXBlbmQ7CisJc25hcGVuZCA9IHQ7CisKKyAgICAgICAgLyogbm93IGxldHMgZ3Vlc3MgYWJvdXQgdGhlIHBheWxvYWQgY29kZXBvaW50IGZvcm1hdCAqLworICAgICAgICBwcm90byA9ICpiOyAvKiBzdGFydCB3aXRoIGEgb25lLW9jdGV0IGNvZGVwb2ludCBndWVzcyAqLworICAgICAgICAKKyAgICAgICAgc3dpdGNoIChwcm90bykgeworICAgICAgICBjYXNlIFBQUF9JUDoKKwkJaXBfcHJpbnQoZ25kbywgYisxLCB0IC0gYiAtIDEpOworCQlnb3RvIGNsZWFudXA7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgY2FzZSBQUFBfSVBWNjoKKyAgICAgICAgICAgIGlwNl9wcmludChiKzEsIHQgLSBiIC0gMSk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDogLyogbm8gbHVjayAtIHRyeSBuZXh0IGd1ZXNzICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RvID0gRVhUUkFDVF8xNkJJVFMoYik7IC8qIG5leHQgZ3Vlc3MgLSBsb2FkIHR3byBvY3RldHMgKi8KKworICAgICAgICBzd2l0Y2ggKHByb3RvKSB7CisgICAgICAgIGNhc2UgKFBQUF9BRERSRVNTIDw8IDggfCBQUFBfQ09OVFJPTCk6IC8qIGxvb2tzIGxpa2UgYSBQUFAgZnJhbWUgKi8KKyAgICAgICAgICAgIHByb3RvID0gRVhUUkFDVF8xNkJJVFMoYisyKTsgLyogbG9hZCB0aGUgUFBQIHByb3RvLWlkICovCisgICAgICAgICAgICBoYW5kbGVfcHBwKHByb3RvLCBiKzQsIHQgLSBiIC0gNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogbGFzdCBndWVzcyAtIHByb3RvIG11c3QgYmUgYSBQUFAgcHJvdG8taWQgKi8KKyAgICAgICAgICAgIGhhbmRsZV9wcHAocHJvdG8sIGIrMiwgdCAtIGIgLSAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKK2NsZWFudXA6CisgICAgICAgIHNuYXBlbmQgPSBzZTsKKwlmcmVlKGIpOworICAgICAgICByZXR1cm47Cit9CisKKworLyogUFBQICovCitzdGF0aWMgdm9pZAoraGFuZGxlX3BwcCh1X2ludCBwcm90bywgY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKQoreworICAgICAgICBpZiAoKHByb3RvICYgMHhmZjAwKSA9PSAweDdlMDApIHsvKiBpcyB0aGlzIGFuIGVzY2FwZSBjb2RlID8gKi8KKyAgICAgICAgICAgIHBwcF9oZGxjKHAtMSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisJc3dpdGNoIChwcm90bykgeworCWNhc2UgUFBQX0xDUDogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBQUFBfSVBDUDoKKwljYXNlIFBQUF9PU0lDUDoKKwljYXNlIFBQUF9NUExTQ1A6CisJY2FzZSBQUFBfSVBWNkNQOgorCWNhc2UgUFBQX0NDUDoKKwljYXNlIFBQUF9CQUNQOgorCQloYW5kbGVfY3RybF9wcm90byhwcm90bywgcCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgUFBQX01MOgorICAgICAgICAgICAgICAgIGhhbmRsZV9tbHBwcChwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgUFBQX0NIQVA6CisJCWhhbmRsZV9jaGFwKHAsIGxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgUFBQX1BBUDoKKwkJaGFuZGxlX3BhcChwLCBsZW5ndGgpOworCQlicmVhazsKKwljYXNlIFBQUF9CQVA6CQkvKiBYWFg6IG5vdCB5ZXQgY29tcGxldGVkICovCisJCWhhbmRsZV9iYXAocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhFUlRZUEVfSVA6CS8qWFhYKi8KKyAgICAgICAgY2FzZSBQUFBfVkpOQzoKKwljYXNlIFBQUF9JUDoKKwkJaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwljYXNlIEVUSEVSVFlQRV9JUFY2OgkvKlhYWCovCisJY2FzZSBQUFBfSVBWNjoKKwkJaXA2X3ByaW50KHAsIGxlbmd0aCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBFVEhFUlRZUEVfSVBYOgkvKlhYWCovCisJY2FzZSBQUFBfSVBYOgorCQlpcHhfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBQUFBfT1NJOgorCSAgICAgICAgaXNvY2xuc19wcmludChwLCBsZW5ndGgsIGxlbmd0aCk7CisJICAgICAgICBicmVhazsKKwljYXNlIFBQUF9NUExTX1VDQVNUOgorCWNhc2UgUFBQX01QTFNfTUNBU1Q6CisJCW1wbHNfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSBQUFBfQ09NUDoKKwkJcHJpbnRmKCJjb21wcmVzc2VkIFBQUCBkYXRhIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZigiJXMgIiwgdG9rMnN0cihwcHB0eXBlMnN0ciwgInVua25vd24gUFBQIHByb3RvY29sICgweCUwNHgpIiwgcHJvdG8pKTsKKwkJcHJpbnRfdW5rbm93bl9kYXRhKHAsIlxuXHQiLGxlbmd0aCk7CisJCWJyZWFrOworCX0KK30KKworLyogU3RhbmRhcmQgUFBQIHByaW50ZXIgKi8KK3VfaW50CitwcHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpCit7CisJdV9pbnQgcHJvdG8scHBwX2hlYWRlcjsKKyAgICAgICAgdV9pbnQgb2xlbiA9IGxlbmd0aDsgLyogX29fcmlnaW5hbCBsZW5ndGggKi8KKwl1X2ludCBoZHJfbGVuID0gMDsKKworCS8qCisJICogSGVyZSwgd2UgYXNzdW1lIHRoYXQgcCBwb2ludHMgdG8gdGhlIEFkZHJlc3MgYW5kIENvbnRyb2wKKwkgKiBmaWVsZCAoaWYgdGhleSBwcmVzZW50KS4KKwkgKi8KKwlpZiAobGVuZ3RoIDwgMikKKwkJZ290byB0cnVuYzsKKwlUQ0hFQ0syKCpwLCAyKTsKKyAgICAgICAgcHBwX2hlYWRlciA9IEVYVFJBQ1RfMTZCSVRTKHApOworCisgICAgICAgIHN3aXRjaChwcHBfaGVhZGVyKSB7CisgICAgICAgIGNhc2UgKFBQUF9XSVRIRElSRUNUSU9OX0lOICA8PCA4IHwgUFBQX0NPTlRST0wpOgorICAgICAgICAgICAgaWYgKGVmbGFnKSBwcmludGYoIkluICAiKTsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgaGRyX2xlbiArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFBQUF9XSVRIRElSRUNUSU9OX09VVCA8PCA4IHwgUFBQX0NPTlRST0wpOgorICAgICAgICAgICAgaWYgKGVmbGFnKSBwcmludGYoIk91dCAiKTsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIGxlbmd0aCAtPSAyOworICAgICAgICAgICAgaGRyX2xlbiArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgKFBQUF9BRERSRVNTIDw8IDggfCBQUFBfQ09OVFJPTCk6CisgICAgICAgICAgICBwICs9IDI7CQkJLyogQUNGQyBub3QgdXNlZCAqLworICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBoZHJfbGVuICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworCWlmIChsZW5ndGggPCAyKQorCQlnb3RvIHRydW5jOworCVRDSEVDSygqcCk7CisJaWYgKCpwICUgMikgeworCQlwcm90byA9ICpwOwkJLyogUEZDIGlzIHVzZWQgKi8KKwkJcCsrOworCQlsZW5ndGgtLTsKKwkJaGRyX2xlbisrOworCX0gZWxzZSB7CisJCVRDSEVDSzIoKnAsIDIpOworCQlwcm90byA9IEVYVFJBQ1RfMTZCSVRTKHApOworCQlwICs9IDI7CisJCWxlbmd0aCAtPSAyOworCQloZHJfbGVuICs9IDI7CisJfQorCisgICAgICAgIGlmIChlZmxhZykKKyAgICAgICAgICAgIHByaW50ZigiJXMgKDB4JTA0eCksIGxlbmd0aCAldTogIiwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKHBwcHR5cGUyc3RyLCAidW5rbm93biIsIHByb3RvKSwKKyAgICAgICAgICAgICAgICAgICBwcm90bywKKyAgICAgICAgICAgICAgICAgICBvbGVuKTsKKworCWhhbmRsZV9wcHAocHJvdG8sIHAsIGxlbmd0aCk7CisJcmV0dXJuIChoZHJfbGVuKTsKK3RydW5jOgorCXByaW50ZigiW3xwcHBdIik7CisJcmV0dXJuICgwKTsKK30KKworCisvKiBQUFAgSS9GIHByaW50ZXIgKi8KK3VfaW50CitwcHBfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisJcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKworCWlmIChjYXBsZW4gPCBQUFBfSERSTEVOKSB7CisJCXByaW50ZigiW3xwcHBdIik7CisJCXJldHVybiAoY2FwbGVuKTsKKwl9CisKKyNpZiAwCisJLyoKKwkgKiBYWFg6IHNlZW1zIHRvIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSAyIG9jdGV0cyBwcmVwZW5kZWQgdG8gYW4KKwkgKiBhY3R1YWwgUFBQIGZyYW1lLiBUaGUgMXN0IG9jdGV0IGxvb2tzIGxpa2UgSW5wdXQvT3V0cHV0IGZsYWcKKwkgKiB3aGlsZSAybmQgb2N0ZXQgaXMgdW5rbm93biwgYXQgbGVhc3QgdG8gbWUKKwkgKiAobXNoaW5kb0Btc2hpbmRvLm5ldCkuCisJICoKKwkgKiBUaGF0IHdhcyB3aGF0IHRoZSBvcmlnaW5hbCB0Y3BkdW1wIGNvZGUgZGlkLgorCSAqCisJICogRnJlZUJTRCdzICJpZl9wcHAuYyIgKmRvZXMqIHNldCB0aGUgZmlyc3Qgb2N0ZXQgdG8gMSBmb3Igb3V0Ym91bmQKKwkgKiBwYWNrZXRzIGFuZCAwIGZvciBpbmJvdW5kIHBhY2tldHMgLSBidXQgb25seSBpZiB0aGUKKwkgKiBwcm90b2NvbCBmaWVsZCBoYXMgdGhlIDB4ODAwMCBiaXQgc2V0IChpLmUuLCBpdCdzIGEgbmV0d29yaworCSAqIGNvbnRyb2wgcHJvdG9jb2wpOyBpdCBkb2VzIHNvIGJlZm9yZSBydW5uaW5nIHRoZSBwYWNrZXQgdGhyb3VnaAorCSAqICJicGZfZmlsdGVyIiB0byBzZWUgaWYgaXQgc2hvdWxkIGJlIGRpc2NhcmRlZCwgYW5kIHRvIHNlZQorCSAqIGlmIHdlIHNob3VsZCB1cGRhdGUgdGhlIHRpbWUgd2Ugc2VudCB0aGUgbW9zdCByZWNlbnQgcGFja2V0Li4uCisJICoKKwkgKiAuLi5idXQgaXQgcHV0cyB0aGUgb3JpZ2luYWwgYWRkcmVzcyBmaWVsZCBiYWNrIGFmdGVyIGRvaW5nCisJICogc28uCisJICoKKwkgKiBOZXRCU0QncyAiaWZfcHBwLmMiIGRvZXNuJ3Qgc2V0IHRoZSBmaXJzdCBvY3RldCBpbiB0aGF0IGZhc2hpb24uCisJICoKKwkgKiBJIGRvbid0IGtub3cgaWYgYW55IFBQUCBpbXBsZW1lbnRhdGlvbiBoYW5kZWQgdXAgdG8gYSBCUEYKKwkgKiBkZXZpY2UgcGFja2V0cyB3aXRoIHRoZSBmaXJzdCBvY3RldCBiZWluZyAxIGZvciBvdXRib3VuZCBhbmQKKwkgKiAwIGZvciBpbmJvdW5kIHBhY2tldHMsIHNvIEkgKGd1eUBhbHVtLm1pdC5lZHUpIGRvbid0IGtub3cKKwkgKiB3aGV0aGVyIHRoYXQgZXZlciBuZWVkcyB0byBiZSBjaGVja2VkIG9yIG5vdC4KKwkgKgorCSAqIE5vdGUgdGhhdCBOZXRCU0QgaGFzIGEgRExUX1BQUF9TRVJJQUwsIHdoaWNoIGl0IHVzZXMgZm9yIFBQUCwKKwkgKiBhbmQgaXRzIHRjcGR1bXAgYXBwZWFycyB0byBhc3N1bWUgdGhhdCB0aGUgZnJhbWUgYWx3YXlzCisJICogYmVnaW5zIHdpdGggYW4gYWRkcmVzcyBmaWVsZCBhbmQgYSBjb250cm9sIGZpZWxkLCBhbmQgdGhhdAorCSAqIHRoZSBhZGRyZXNzIGZpZWxkIG1pZ2h0IGJlIDB4MGYgb3IgMHg4ZiwgZm9yIENpc2NvCisJICogcG9pbnQtdG8tcG9pbnQgd2l0aCBIRExDIGZyYW1pbmcgYXMgcGVyIHNlY3Rpb24gNC4zLjEgb2YgUkZDCisJICogMTU0NywgYXMgd2VsbCBhcyAweGZmLCBmb3IgUFBQIGluIEhETEMtbGlrZSBmcmFtaW5nIGFzIHBlcgorCSAqIFJGQyAxNjYyLgorCSAqCisJICogKElzIHRoZSBDaXNjbyBmcmFtaW5nIGluIHF1ZXN0aW9uIHdoYXQgRExUX0NfSERMQywgaW4KKwkgKiBCU0QvT1MsIGlzPykKKwkgKi8KKwlpZiAoZWZsYWcpCisJCXByaW50ZigiJWMgJTRkICUwMnggIiwgcFswXSA/ICdPJyA6ICdJJywgbGVuZ3RoLCBwWzFdKTsKKyNlbmRpZgorCisJcHBwX3ByaW50KHAsIGxlbmd0aCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogUFBQIEkvRiBwcmludGVyIHRvIHVzZSBpZiB3ZSBrbm93IHRoYXQgUkZDIDE2NjItc3R5bGUgUFBQIGluIEhETEMtbGlrZQorICogZnJhbWluZywgb3IgQ2lzY28gUFBQIHdpdGggSERMQyBmcmFtaW5nIGFzIHBlciBzZWN0aW9uIDQuMy4xIG9mIFJGQyAxNTQ3LAorICogaXMgYmVpbmcgdXNlZCAoaS5lLiwgd2UgZG9uJ3QgY2hlY2sgZm9yIFBQUF9BRERSRVNTIGFuZCBQUFBfQ09OVFJPTCwKKyAqIGRpc2NhcmQgdGhlbSAqaWYqIHRob3NlIGFyZSB0aGUgZmlyc3QgdHdvIG9jdGV0cywgYW5kIHBhcnNlIHRoZSByZW1haW5pbmcKKyAqIHBhY2tldCBhcyBhIFBQUCBwYWNrZXQsIGFzICJwcHBfcHJpbnQoKSIgZG9lcykuCisgKgorICogVGhpcyBoYW5kbGVzLCBmb3IgZXhhbXBsZSwgRExUX1BQUF9TRVJJQUwgaW4gTmV0QlNELgorICovCit1X2ludAorcHBwX2hkbGNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCit7CisJcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwl1X2ludCBwcm90bzsKKwl1X2ludCBoZHJsZW4gPSAwOworCisJaWYgKGNhcGxlbiA8IDIpIHsKKwkJcHJpbnRmKCJbfHBwcF0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCXN3aXRjaCAocFswXSkgeworCisJY2FzZSBQUFBfQUREUkVTUzoKKwkJaWYgKGNhcGxlbiA8IDQpIHsKKwkJCXByaW50ZigiW3xwcHBdIik7CisJCQlyZXR1cm4gKGNhcGxlbik7CisJCX0KKworCQlpZiAoZWZsYWcpCisJCQlwcmludGYoIiUwMnggJTAyeCAlZCAiLCBwWzBdLCBwWzFdLCBsZW5ndGgpOworCQlwICs9IDI7CisJCWxlbmd0aCAtPSAyOworCQloZHJsZW4gKz0gMjsKKworCQlwcm90byA9IEVYVFJBQ1RfMTZCSVRTKHApOworCQlwICs9IDI7CisJCWxlbmd0aCAtPSAyOworCQloZHJsZW4gKz0gMjsKKwkJcHJpbnRmKCIlczogIiwgdG9rMnN0cihwcHB0eXBlMnN0ciwgInVua25vd24gUFBQIHByb3RvY29sICgweCUwNHgpIiwgcHJvdG8pKTsKKworCQloYW5kbGVfcHBwKHByb3RvLCBwLCBsZW5ndGgpOworCQlicmVhazsKKworCWNhc2UgQ0hETENfVU5JQ0FTVDoKKwljYXNlIENIRExDX0JDQVNUOgorCQlyZXR1cm4gKGNoZGxjX2lmX3ByaW50KGgsIHApKTsKKworCWRlZmF1bHQ6CisJCWlmIChlZmxhZykKKwkJCXByaW50ZigiJTAyeCAlMDJ4ICVkICIsIHBbMF0sIHBbMV0sIGxlbmd0aCk7CisJCXAgKz0gMjsKKwkJbGVuZ3RoIC09IDI7CisJCWhkcmxlbiArPSAyOworCisJCS8qCisJCSAqIFhYWCAtIE5ldEJTRCdzICJwcHBfbmV0YnNkX3NlcmlhbF9pZl9wcmludCgpIiB0cmVhdHMKKwkJICogdGhlIG5leHQgdHdvIG9jdGV0cyBhcyBhbiBFdGhlcm5ldCB0eXBlOyBkb2VzIHRoYXQKKwkJICogZXZlciBoYXBwZW4/CisJCSAqLworCQlwcmludGYoInVua25vd24gYWRkciAlMDJ4OyBjdHJsICUwMngiLCBwWzBdLCBwWzFdKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChoZHJsZW4pOworfQorCisjZGVmaW5lIFBQUF9CU0RJX0hEUkxFTiAyNAorCisvKiBCU0QvT1Mgc3BlY2lmaWMgUFBQIHByaW50ZXIgKi8KK3VfaW50CitwcHBfYnNkb3NfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoIF9VXywgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwIF9VXykKK3sKKwlyZWdpc3RlciBpbnQgaGRybGVuZ3RoOworI2lmZGVmIF9fYnNkaV9fCisJcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwl1X2ludDE2X3QgcHR5cGU7CisJY29uc3QgdV9jaGFyICpxOworCWludCBpOworCisJaWYgKGNhcGxlbiA8IFBQUF9CU0RJX0hEUkxFTikgeworCQlwcmludGYoIlt8cHBwXSIpOworCQlyZXR1cm4gKGNhcGxlbikKKwl9CisKKwloZHJsZW5ndGggPSAwOworCisjaWYgMAorCWlmIChwWzBdID09IFBQUF9BRERSRVNTICYmIHBbMV0gPT0gUFBQX0NPTlRST0wpIHsKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIlMDJ4ICUwMnggIiwgcFswXSwgcFsxXSk7CisJCXAgKz0gMjsKKwkJaGRybGVuZ3RoID0gMjsKKwl9CisKKwlpZiAoZWZsYWcpCisJCXByaW50ZigiJWQgIiwgbGVuZ3RoKTsKKwkvKiBSZXRyaWV2ZSB0aGUgcHJvdG9jb2wgdHlwZSAqLworCWlmICgqcCAmIDAxKSB7CisJCS8qIENvbXByZXNzZWQgcHJvdG9jb2wgZmllbGQgKi8KKwkJcHR5cGUgPSAqcDsKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIlMDJ4ICIsIHB0eXBlKTsKKwkJcCsrOworCQloZHJsZW5ndGggKz0gMTsKKwl9IGVsc2UgeworCQkvKiBVbi1jb21wcmVzc2VkIHByb3RvY29sIGZpZWxkICovCisJCXB0eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKilwKTsKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIlMDR4ICIsIHB0eXBlKTsKKwkJcCArPSAyOworCQloZHJsZW5ndGggKz0gMjsKKwl9CisjZWxzZQorCXB0eXBlID0gMDsJLypYWFgqLworCWlmIChlZmxhZykKKwkJcHJpbnRmKCIlYyAiLCBwW1NMQ19ESVJdID8gJ08nIDogJ0knKTsKKwlpZiAocFtTTENfTExITF0pIHsKKwkJLyogbGluayBsZXZlbCBoZWFkZXIgKi8KKwkJc3RydWN0IHBwcF9oZWFkZXIgKnBoOworCisJCXEgPSBwICsgU0xDX0JQRkhEUkxFTjsKKwkJcGggPSAoc3RydWN0IHBwcF9oZWFkZXIgKilxOworCQlpZiAocGgtPnBoZHJfYWRkciA9PSBQUFBfQUREUkVTUworCQkgJiYgcGgtPnBoZHJfY3RsID09IFBQUF9DT05UUk9MKSB7CisJCQlpZiAoZWZsYWcpCisJCQkJcHJpbnRmKCIlMDJ4ICUwMnggIiwgcVswXSwgcVsxXSk7CisJCQlwdHlwZSA9IG50b2hzKHBoLT5waGRyX3R5cGUpOworCQkJaWYgKGVmbGFnICYmIChwdHlwZSA9PSBQUFBfVkpDIHx8IHB0eXBlID09IFBQUF9WSk5DKSkgeworCQkJCXByaW50ZigiJXMgIiwgdG9rMnN0cihwcHB0eXBlMnN0ciwKKwkJCQkJCSJwcm90by0jJWQiLCBwdHlwZSkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGVmbGFnKSB7CisJCQkJcHJpbnRmKCJMTEg9WyIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBwW1NMQ19MTEhMXTsgaSsrKQorCQkJCQlwcmludGYoIiUwMngiLCBxW2ldKTsKKwkJCQlwcmludGYoIl0gIik7CisJCQl9CisJCX0KKwl9CisJaWYgKGVmbGFnKQorCQlwcmludGYoIiVkICIsIGxlbmd0aCk7CisJaWYgKHBbU0xDX0NITF0pIHsKKwkJcSA9IHAgKyBTTENfQlBGSERSTEVOICsgcFtTTENfTExITF07CisKKwkJc3dpdGNoIChwdHlwZSkgeworCQljYXNlIFBQUF9WSkM6CisJCQlwdHlwZSA9IHZqY19wcmludChxLCBwdHlwZSk7CisJCQloZHJsZW5ndGggPSBQUFBfQlNESV9IRFJMRU47CisJCQlwICs9IGhkcmxlbmd0aDsKKwkJCXN3aXRjaCAocHR5cGUpIHsKKwkJCWNhc2UgUFBQX0lQOgorCQkJCWlwX3ByaW50KHAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJCWNhc2UgUFBQX0lQVjY6CisJCQkJaXA2X3ByaW50KHAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgUFBQX01QTFNfVUNBU1Q6CisJCQljYXNlIFBQUF9NUExTX01DQVNUOgorCQkJCW1wbHNfcHJpbnQocCwgbGVuZ3RoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gcHJpbnR4OworCQljYXNlIFBQUF9WSk5DOgorCQkJcHR5cGUgPSB2amNfcHJpbnQocSwgcHR5cGUpOworCQkJaGRybGVuZ3RoID0gUFBQX0JTRElfSERSTEVOOworCQkJcCArPSBoZHJsZW5ndGg7CisJCQlzd2l0Y2ggKHB0eXBlKSB7CisJCQljYXNlIFBQUF9JUDoKKwkJCQlpcF9wcmludChwLCBsZW5ndGgpOworCQkJCWJyZWFrOworI2lmZGVmIElORVQ2CisJCQljYXNlIFBQUF9JUFY2OgorCQkJCWlwNl9wcmludChwLCBsZW5ndGgpOworCQkJCWJyZWFrOworI2VuZGlmCisJCQljYXNlIFBQUF9NUExTX1VDQVNUOgorCQkJY2FzZSBQUFBfTVBMU19NQ0FTVDoKKwkJCQltcGxzX3ByaW50KHAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlnb3RvIHByaW50eDsKKwkJZGVmYXVsdDoKKwkJCWlmIChlZmxhZykgeworCQkJCXByaW50ZigiQ0g9WyIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBwW1NMQ19MTEhMXTsgaSsrKQorCQkJCQlwcmludGYoIiUwMngiLCBxW2ldKTsKKwkJCQlwcmludGYoIl0gIik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWhkcmxlbmd0aCA9IFBQUF9CU0RJX0hEUkxFTjsKKyNlbmRpZgorCisJbGVuZ3RoIC09IGhkcmxlbmd0aDsKKwlwICs9IGhkcmxlbmd0aDsKKworCXN3aXRjaCAocHR5cGUpIHsKKwljYXNlIFBQUF9JUDoKKwkJaXBfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwljYXNlIFBQUF9JUFY2OgorCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBQUFBfTVBMU19VQ0FTVDoKKyAgICAgICAgY2FzZSBQUFBfTVBMU19NQ0FTVDoKKyAgICAgICAgICAgICAgICBtcGxzX3ByaW50KHAsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIlcyAiLCB0b2syc3RyKHBwcHR5cGUyc3RyLCAidW5rbm93biBQUFAgcHJvdG9jb2wgKDB4JTA0eCkiLCBwdHlwZSkpOworCX0KKworcHJpbnR4OgorI2Vsc2UgLyogX19ic2RpICovCisJaGRybGVuZ3RoID0gMDsKKyNlbmRpZiAvKiBfX2JzZGlfXyAqLworCXJldHVybiAoaGRybGVuZ3RoKTsKK30KKworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogYy1zdHlsZTogd2hpdGVzbWl0aAorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtcHBwb2UuYyBiL3ByaW50LXBwcG9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5YjVlZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXBwcG9lLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIAorICogT3JpZ2luYWwgY29kZSBieSBHcmVnIFN0YXJrIDxnc3N0YXJrQG1pdC5lZHU+IAorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcHBwb2UuYyx2IDEuMzAuMi4xIDIwMDUvMDQvMjYgMTk6NDg6NTYgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJldGhlci5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIJCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KKworLyogQ29kZXMgKi8KK2VudW0geworCVBQUE9FX1BBREkgPSAweDA5LAorCVBQUE9FX1BBRE8gPSAweDA3LAorCVBQUE9FX1BBRFIgPSAweDE5LAorCVBQUE9FX1BBRFMgPSAweDY1LAorCVBQUE9FX1BBRFQgPSAweGE3Cit9OworCitzdGF0aWMgc3RydWN0IHRvayBwcHBvZWNvZGUyc3RyW10gPSB7CisJeyBQUFBPRV9QQURJLCAiUEFESSIgfSwKKwl7IFBQUE9FX1BBRE8sICJQQURPIiB9LAorCXsgUFBQT0VfUEFEUiwgIlBBRFIiIH0sCisJeyBQUFBPRV9QQURTLCAiUEFEUyIgfSwKKwl7IFBQUE9FX1BBRFQsICJQQURUIiB9LAorCXsgMCwgIiIgfSwgLyogUFBQIERhdGEgKi8KKwl7IDAsIE5VTEwgfQorfTsKKworLyogVGFncyAqLworZW51bSB7CisJUFBQT0VfRU9MID0gMCwKKwlQUFBPRV9TRVJWSUNFX05BTUUgPSAweDAxMDEsCisJUFBQT0VfQUNfTkFNRSA9IDB4MDEwMiwKKwlQUFBPRV9IT1NUX1VOSVEgPSAweDAxMDMsCisJUFBQT0VfQUNfQ09PS0lFID0gMHgwMTA0LAorCVBQUE9FX1ZFTkRPUiA9IDB4MDEwNSwKKwlQUFBPRV9SRUxBWV9TSUQgPSAweDAxMTAsCisJUFBQT0VfU0VSVklDRV9OQU1FX0VSUk9SID0gMHgwMjAxLAorCVBQUE9FX0FDX1NZU1RFTV9FUlJPUiA9IDB4MDIwMiwKKwlQUFBPRV9HRU5FUklDX0VSUk9SID0gMHgwMjAzCit9OworCitzdGF0aWMgc3RydWN0IHRvayBwcHBvZXRhZzJzdHJbXSA9IHsKKwl7IFBQUE9FX0VPTCwgIkVPTCIgfSwKKwl7IFBQUE9FX1NFUlZJQ0VfTkFNRSwgIlNlcnZpY2UtTmFtZSIgfSwKKwl7IFBQUE9FX0FDX05BTUUsICJBQy1OYW1lIiB9LAorCXsgUFBQT0VfSE9TVF9VTklRLCAiSG9zdC1VbmlxIiB9LAorCXsgUFBQT0VfQUNfQ09PS0lFLCAiQUMtQ29va2llIiB9LAorCXsgUFBQT0VfVkVORE9SLCAiVmVuZG9yLVNwZWNpZmljIiB9LAorCXsgUFBQT0VfUkVMQVlfU0lELCAiUmVsYXktU2Vzc2lvbi1JRCIgfSwKKwl7IFBQUE9FX1NFUlZJQ0VfTkFNRV9FUlJPUiwgIlNlcnZpY2UtTmFtZS1FcnJvciIgfSwKKwl7IFBQUE9FX0FDX1NZU1RFTV9FUlJPUiwgIkFDLVN5c3RlbS1FcnJvciIgfSwKKwl7IFBQUE9FX0dFTkVSSUNfRVJST1IsICJHZW5lcmljLUVycm9yIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCisjZGVmaW5lIFBQUE9FX0hEUkxFTiA2CisjZGVmaW5lIE1BWFRBR1BSSU5UIDgwCisKK3VfaW50CitwcHBvZV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKK3sKKwlyZXR1cm4gKHBwcG9lX3ByaW50KHAsIGgtPmxlbikpOworfQorCit1X2ludAorcHBwb2VfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXVfaW50MTZfdCBwcHBvZV92ZXIsIHBwcG9lX3R5cGUsIHBwcG9lX2NvZGUsIHBwcG9lX3Nlc3Npb25pZDsKKwl1X2ludCBwcHBvZV9sZW5ndGg7CisJY29uc3QgdV9jaGFyICpwcHBvZV9wYWNrZXQsICpwcHBvZV9wYXlsb2FkOworCisJaWYgKGxlbmd0aCA8IFBQUE9FX0hEUkxFTikgeworCQkodm9pZClwcmludGYoInRydW5jYXRlZC1wcHBvZSAldSIsIGxlbmd0aCk7CisJCXJldHVybiAobGVuZ3RoKTsKKwl9CisJbGVuZ3RoIC09IFBQUE9FX0hEUkxFTjsKKwlwcHBvZV9wYWNrZXQgPSBicDsKKwlUQ0hFQ0syKCpwcHBvZV9wYWNrZXQsIFBQUE9FX0hEUkxFTik7CisJcHBwb2VfdmVyICA9IChwcHBvZV9wYWNrZXRbMF0gJiAweEYwKSA+PiA0OworCXBwcG9lX3R5cGUgID0gKHBwcG9lX3BhY2tldFswXSAmIDB4MEYpOworCXBwcG9lX2NvZGUgPSBwcHBvZV9wYWNrZXRbMV07CisJcHBwb2Vfc2Vzc2lvbmlkID0gRVhUUkFDVF8xNkJJVFMocHBwb2VfcGFja2V0ICsgMik7CisJcHBwb2VfbGVuZ3RoICAgID0gRVhUUkFDVF8xNkJJVFMocHBwb2VfcGFja2V0ICsgNCk7CisJcHBwb2VfcGF5bG9hZCA9IHBwcG9lX3BhY2tldCArIFBQUE9FX0hEUkxFTjsKKworCWlmIChwcHBvZV92ZXIgIT0gMSkgeworCQlwcmludGYoIiBbdmVyICVkXSIscHBwb2VfdmVyKTsKKwl9CisJaWYgKHBwcG9lX3R5cGUgIT0gMSkgeworCQlwcmludGYoIiBbdHlwZSAlZF0iLHBwcG9lX3R5cGUpOworCX0KKworCXByaW50ZigiUFBQb0UgJXMiLCB0b2syc3RyKHBwcG9lY29kZTJzdHIsICJQQUQtJXgiLCBwcHBvZV9jb2RlKSk7CisJaWYgKHBwcG9lX2NvZGUgPT0gUFBQT0VfUEFESSAmJiBwcHBvZV9sZW5ndGggPiAxNDg0IC0gUFBQT0VfSERSTEVOKSB7CisJCXByaW50ZigiIFtsZW4gJXUhXSIscHBwb2VfbGVuZ3RoKTsKKwl9CisJaWYgKHBwcG9lX2xlbmd0aCA+IGxlbmd0aCkgeworCQlwcmludGYoIiBbbGVuICV1ID4gJXUhXSIsIHBwcG9lX2xlbmd0aCwgbGVuZ3RoKTsKKwkJcHBwb2VfbGVuZ3RoID0gbGVuZ3RoOworCX0KKwlpZiAocHBwb2Vfc2Vzc2lvbmlkKSB7CisJCXByaW50ZigiIFtzZXMgMHgleF0iLCBwcHBvZV9zZXNzaW9uaWQpOworCX0KKworCWlmIChwcHBvZV9jb2RlKSB7CisJCS8qIFBQUCBzZXNzaW9uIHBhY2tldHMgZG9uJ3QgY29udGFpbiB0YWdzICovCisJCXVfc2hvcnQgdGFnX3R5cGUgPSAweGZmZmYsIHRhZ19sZW47CisJCWNvbnN0IHVfY2hhciAqcCA9IHBwcG9lX3BheWxvYWQ7CisKKwkJLyoKKwkJICogbG9vcCBpbnZhcmlhbnQ6CisJCSAqIHAgcG9pbnRzIHRvIGN1cnJlbnQgdGFnLAorCQkgKiB0YWdfdHlwZSBpcyBwcmV2aW91cyB0YWcgb3IgMHhmZmZmIGZvciBmaXJzdCBpdGVyYXRpb24KKwkJICovCisJCXdoaWxlICh0YWdfdHlwZSAmJiBwIDwgcHBwb2VfcGF5bG9hZCArIHBwcG9lX2xlbmd0aCkgeworCQkJVENIRUNLMigqcCwgNCk7CisJCQl0YWdfdHlwZSA9IEVYVFJBQ1RfMTZCSVRTKHApOworCQkJdGFnX2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHAgKyAyKTsKKwkJCXAgKz0gNDsKKwkJCS8qIHAgcG9pbnRzIHRvIHRhZ192YWx1ZSAqLworCisJCQlpZiAodGFnX2xlbikgeworCQkJCXVuc2lnbmVkIGlzYXNjaWkgPSAwLCBpc2dhcmJhZ2UgPSAwOworCQkJCWNvbnN0IHVfY2hhciAqdiA9IHA7CisJCQkJY2hhciB0YWdfc3RyW01BWFRBR1BSSU5UXTsKKwkJCQl1bnNpZ25lZCB0YWdfc3RyX2xlbiA9IDA7CisKKwkJCQkvKiBUT0RPIHByaW50IFVURi04IGRlY29kZWQgdGV4dCAqLworCQkJCVRDSEVDSzIoKnAsIHRhZ19sZW4pOworCQkJCWZvciAodiA9IHA7IHYgPCBwICsgdGFnX2xlbiAmJiB0YWdfc3RyX2xlbiA8IE1BWFRBR1BSSU5ULTE7IHYrKykKKwkJCQkJaWYgKCp2ID49IDMyICYmICp2IDwgMTI3KSB7CisJCQkJCQl0YWdfc3RyW3RhZ19zdHJfbGVuKytdID0gKnY7CisJCQkJCQlpc2FzY2lpKys7CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0YWdfc3RyW3RhZ19zdHJfbGVuKytdID0gJy4nOworCQkJCQkJaXNnYXJiYWdlKys7CisJCQkJCX0KKwkJCQl0YWdfc3RyW3RhZ19zdHJfbGVuXSA9IDA7CisKKwkJCQlpZiAoaXNhc2NpaSA+IGlzZ2FyYmFnZSkgeworCQkJCQlwcmludGYoIiBbJXMgXCIlKi4qc1wiXSIsCisJCQkJCSAgICAgICB0b2syc3RyKHBwcG9ldGFnMnN0ciwgIlRBRy0weCV4IiwgdGFnX3R5cGUpLAorCQkJCQkgICAgICAgKGludCl0YWdfc3RyX2xlbiwKKwkJCQkJICAgICAgIChpbnQpdGFnX3N0cl9sZW4sCisJCQkJCSAgICAgICB0YWdfc3RyKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBQcmludCBoZXgsIG5vdCBmYXN0IHRvIGFidXNlIHByaW50ZiBidXQgdGhpcyBkb2Vzbid0IGdldCB1c2VkIG11Y2ggKi8KKwkJCQkJcHJpbnRmKCIgWyVzIDB4IiwgdG9rMnN0cihwcHBvZXRhZzJzdHIsICJUQUctMHgleCIsIHRhZ190eXBlKSk7CisJCQkJCWZvciAodj1wOyB2PHArdGFnX2xlbjsgdisrKSB7CisJCQkJCQlwcmludGYoIiUwMlgiLCAqdik7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCJdIik7CisJCQkJfQorCQkJCQorCisJCQl9IGVsc2UKKwkJCQlwcmludGYoIiBbJXNdIiwgdG9rMnN0cihwcHBvZXRhZzJzdHIsCisJCQkJICAgICJUQUctMHgleCIsIHRhZ190eXBlKSk7CisKKwkJCXAgKz0gdGFnX2xlbjsKKwkJCS8qIHAgcG9pbnRzIHRvIG5leHQgdGFnICovCisJCX0KKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQkvKiBQUFBvRSBkYXRhICovCisJCXByaW50ZigiICIpOworCQlyZXR1cm4gKFBQUE9FX0hEUkxFTiArIHBwcF9wcmludChwcHBvZV9wYXlsb2FkLCBwcHBvZV9sZW5ndGgpKTsKKwl9CisKK3RydW5jOgorCXByaW50ZigiW3xwcHBvZV0iKTsKKwlyZXR1cm4gKFBQUE9FX0hEUkxFTik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1wcHRwLmMgYi9wcmludC1wcHRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwMDU4OQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXBwdHAuYwpAQCAtMCwwICsxLDEwNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFBQVFAgc3VwcG9ydCBjb250cmlidXRlZCBieSBNb3Rvbm9yaSBTaGluZG8gKG1zaGluZG9AbXNoaW5kby5uZXQpCisgKi8KKworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcHB0cC5jLHYgMS4xMS4yLjEgMjAwNi8wNi8yMyAwMjowNzoyNyBoYW5uZXMgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCitzdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8cHB0cF0iOworCisjZGVmaW5lIFBQVFBfTVNHX1RZUEVfQ1RSTAkxCS8qIENvbnRyb2wgTWVzc2FnZSAqLworI2RlZmluZSBQUFRQX01TR19UWVBFX01HTVQJMgkvKiBNYW5hZ2VtZW50IE1lc3NhZ2UgKGN1cnJlbnRseSBub3QgdXNlZCAqLworI2RlZmluZSBQUFRQX01BR0lDX0NPT0tJRQkweDFhMmIzYzRkCS8qIGZvciBzYW5pdHkgY2hlY2sgKi8KKworI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0NDUlEJMQorI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0NDUlAJMgorI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU3RvcENDUlEJMworI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU3RvcENDUlAJNAorI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JRCTUKKyNkZWZpbmUgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUAk2CisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JRCQk3CisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JQCQk4CisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JRCQk5CisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JQCQkxMAorI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNDTgkJMTEKKyNkZWZpbmUgUFBUUF9DVFJMX01TR19UWVBFX0NDUlEJCTEyCisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE4JCTEzCisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9XRU4JCTE0CisjZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9TTEkJCTE1CisKKyNkZWZpbmUgUFBUUF9GUkFNSU5HX0NBUF9BU1lOQ19NQVNLCTB4MDAwMDAwMDEgICAgICAvKiBBeW5jaHJvbm91cyAqLworI2RlZmluZSBQUFRQX0ZSQU1JTkdfQ0FQX1NZTkNfTUFTSwkweDAwMDAwMDAyICAgICAgLyogU3luY2hyb25vdXMgKi8KKworI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfQU5BTE9HX01BU0sJMHgwMDAwMDAwMSAgICAgIC8qIEFuYWxvZyAqLworI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfRElHSVRBTF9NQVNLCTB4MDAwMDAwMDIgICAgICAvKiBEaWdpdGFsICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpwcHRwX21lc3NhZ2VfdHlwZV9zdHJpbmdbXSA9IHsKKwkiTk9UX0RFRklORUQiLAkJLyogMCAgTm90IGRlZmluZWQgaW4gdGhlIFJGQzI2MzcgKi8KKwkiU0NDUlEiLAkJLyogMSAgU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLVJlcXVlc3QgKi8KKwkiU0NDUlAiLAkJLyogMiAgU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLVJlcGx5ICovCisJIlN0b3BDQ1JRIiwJCS8qIDMgIFN0b3AtQ29udHJvbC1Db25uZWN0aW9uLVJlcXVlc3QgKi8KKwkiU3RvcENDUlAiLAkJLyogNCAgU3RvcC1Db250cm9sLUNvbm5lY3Rpb24tUmVwbHkgKi8KKwkiRUNIT1JRIiwJCS8qIDUgIEVjaG8gUmVxdWVzdCAqLworCSJFQ0hPUlAiLAkJLyogNiAgRWNobyBSZXBseSAqLworCisJIk9DUlEiLAkJCS8qIDcgIE91dGdvaW5nLUNhbGwtUmVxdWVzdCAqLworCSJPQ1JQIiwJCQkvKiA4ICBPdXRnb2luZy1DYWxsLVJlcGx5ICovCisJIklDUlEiLAkJCS8qIDkgIEluY29taW5nLUNhbGwtUmVxdWVzdCAqLworCSJJQ1JQIiwJCQkvKiAxMCBJbmNvbWluZy1DYWxsLVJlcGx5ICovCisJIklDQ04iLAkJCS8qIDExIEluY29taW5nLUNhbGwtQ29ubmVjdGVkICovCisJIkNDUlEiLAkJCS8qIDEyIENhbGwtQ2xlYXItUmVxdWVzdCAqLworCSJDRE4iLAkJCS8qIDEzIENhbGwtRGlzY29ubmVjdC1Ob3RpZnkgKi8KKworCSJXRU4iLAkJCS8qIDE0IFdBTi1FcnJvci1Ob3RpZnkgKi8KKworCSJTTEkiCQkJLyogMTUgU2V0LUxpbmstSW5mbyAqLworI2RlZmluZSBQUFRQX01BWF9NU0dUWVBFX0lOREVYCTE2Cit9OworCisvKiBjb21tb24gZm9yIGFsbCBQUFRQIGNvbnRyb2wgbWVzc2FnZXMgKi8KK3N0cnVjdCBwcHRwX2hkciB7CisJdV9pbnQxNl90IGxlbmd0aDsKKwl1X2ludDE2X3QgbXNnX3R5cGU7CisJdV9pbnQzMl90IG1hZ2ljX2Nvb2tpZTsKKwl1X2ludDE2X3QgY3RybF9tc2dfdHlwZTsKKwl1X2ludDE2X3QgcmVzZXJ2ZWQwOworfTsKKworc3RydWN0IHBwdHBfbXNnX3NjY3JxIHsKKwl1X2ludDE2X3QgcHJvdG9fdmVyOworCXVfaW50MTZfdCByZXNlcnZlZDE7CisJdV9pbnQzMl90IGZyYW1pbmdfY2FwOworCXVfaW50MzJfdCBiZWFyZXJfY2FwOworCXVfaW50MTZfdCBtYXhfY2hhbm5lbDsKKwl1X2ludDE2X3QgZmlybV9yZXY7CisJdV9jaGFyIGhvc3RuYW1lWzY0XTsKKwl1X2NoYXIgdmVuZG9yWzY0XTsKK307CisKK3N0cnVjdCBwcHRwX21zZ19zY2NycCB7CisJdV9pbnQxNl90IHByb3RvX3ZlcjsKKwl1X2ludDhfdCByZXN1bHRfY29kZTsKKwl1X2ludDhfdCBlcnJfY29kZTsKKwl1X2ludDMyX3QgZnJhbWluZ19jYXA7CisJdV9pbnQzMl90IGJlYXJlcl9jYXA7CisJdV9pbnQxNl90IG1heF9jaGFubmVsOworCXVfaW50MTZfdCBmaXJtX3JldjsKKwl1X2NoYXIgaG9zdG5hbWVbNjRdOworCXVfY2hhciB2ZW5kb3JbNjRdOworfTsKKworc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JxIHsKKwl1X2ludDhfdCByZWFzb247CisJdV9pbnQ4X3QgcmVzZXJ2ZWQxOworCXVfaW50MTZfdCByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfc3RvcGNjcnAgeworCXVfaW50OF90IHJlc3VsdF9jb2RlOworCXVfaW50OF90IGVycl9jb2RlOworCXVfaW50MTZfdCByZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfZWNob3JxIHsKKwl1X2ludDMyX3QgaWQ7Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfZWNob3JwIHsKKwl1X2ludDMyX3QgaWQ7CisJdV9pbnQ4X3QgcmVzdWx0X2NvZGU7CisJdV9pbnQ4X3QgZXJyX2NvZGU7CisJdV9pbnQxNl90IHJlc2VydmVkMTsKK307CisKK3N0cnVjdCBwcHRwX21zZ19vY3JxIHsKKwl1X2ludDE2X3QgY2FsbF9pZDsKKwl1X2ludDE2X3QgY2FsbF9zZXI7CisJdV9pbnQzMl90IG1pbl9icHM7CisJdV9pbnQzMl90IG1heF9icHM7CisJdV9pbnQzMl90IGJlYXJlcl90eXBlOworCXVfaW50MzJfdCBmcmFtaW5nX3R5cGU7CisJdV9pbnQxNl90IHJlY3Zfd2luc2l6OworCXVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKKwl1X2ludDE2X3QgcGhvbmVfbm9fbGVuOworCXVfaW50MTZfdCByZXNlcnZlZDE7CisJdV9jaGFyIHBob25lX25vWzY0XTsKKwl1X2NoYXIgc3ViYWRkcls2NF07Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfb2NycCB7CisJdV9pbnQxNl90IGNhbGxfaWQ7CisJdV9pbnQxNl90IHBlZXJfY2FsbF9pZDsKKwl1X2ludDhfdCByZXN1bHRfY29kZTsKKwl1X2ludDhfdCBlcnJfY29kZTsKKwl1X2ludDE2X3QgY2F1c2VfY29kZTsKKwl1X2ludDMyX3QgY29ubl9zcGVlZDsKKwl1X2ludDE2X3QgcmVjdl93aW5zaXo7CisJdV9pbnQxNl90IHBrdF9wcm9jX2RlbGF5OworCXVfaW50MzJfdCBwaHlfY2hhbl9pZDsKK307CisKK3N0cnVjdCBwcHRwX21zZ19pY3JxIHsKKwl1X2ludDE2X3QgY2FsbF9pZDsKKwl1X2ludDE2X3QgY2FsbF9zZXI7CisJdV9pbnQzMl90IGJlYXJlcl90eXBlOworCXVfaW50MzJfdCBwaHlfY2hhbl9pZDsKKwl1X2ludDE2X3QgZGlhbGVkX25vX2xlbjsKKwl1X2ludDE2X3QgZGlhbGluZ19ub19sZW47CisJdV9jaGFyIGRpYWxlZF9ub1s2NF07CQkvKiBETklTICovCisJdV9jaGFyIGRpYWxpbmdfbm9bNjRdOwkJLyogQ0xJRCAqLworCXVfY2hhciBzdWJhZGRyWzY0XTsKK307CisKK3N0cnVjdCBwcHRwX21zZ19pY3JwIHsKKwl1X2ludDE2X3QgY2FsbF9pZDsKKwl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOworCXVfaW50OF90IHJlc3VsdF9jb2RlOworCXVfaW50OF90IGVycl9jb2RlOworCXVfaW50MTZfdCByZWN2X3dpbnNpejsKKwl1X2ludDE2X3QgcGt0X3Byb2NfZGVsYXk7CisJdV9pbnQxNl90IHJlc2VydmVkMTsKK307CisKK3N0cnVjdCBwcHRwX21zZ19pY2NuIHsKKwl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOworCXVfaW50MTZfdCByZXNlcnZlZDE7CisJdV9pbnQzMl90IGNvbm5fc3BlZWQ7CisJdV9pbnQxNl90IHJlY3Zfd2luc2l6OworCXVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKKwl1X2ludDMyX3QgZnJhbWluZ190eXBlOworfTsKKworc3RydWN0IHBwdHBfbXNnX2NjcnEgeworCXVfaW50MTZfdCBjYWxsX2lkOworCXVfaW50MTZfdCByZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfY2RuIHsKKwl1X2ludDE2X3QgY2FsbF9pZDsKKwl1X2ludDhfdCByZXN1bHRfY29kZTsKKwl1X2ludDhfdCBlcnJfY29kZTsKKwl1X2ludDE2X3QgY2F1c2VfY29kZTsKKwl1X2ludDE2X3QgcmVzZXJ2ZWQxOworCXVfY2hhciBjYWxsX3N0YXRzWzEyOF07Cit9OworCitzdHJ1Y3QgcHB0cF9tc2dfd2VuIHsKKwl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOworCXVfaW50MTZfdCByZXNlcnZlZDE7CisJdV9pbnQzMl90IGNyY19lcnI7CisJdV9pbnQzMl90IGZyYW1pbmdfZXJyOworCXVfaW50MzJfdCBoYXJkd2FyZV9vdmVycnVuOworCXVfaW50MzJfdCBidWZmZXJfb3ZlcnJ1bjsKKwl1X2ludDMyX3QgdGltZW91dF9lcnI7CisJdV9pbnQzMl90IGFsaWduX2VycjsKK307CisKK3N0cnVjdCBwcHRwX21zZ19zbGkgeworCXVfaW50MTZfdCBwZWVyX2NhbGxfaWQ7CisJdV9pbnQxNl90IHJlc2VydmVkMTsKKwl1X2ludDMyX3Qgc2VuZF9hY2NtOworCXVfaW50MzJfdCByZWN2X2FjY207Cit9OworCisvKiBhdHRyaWJ1dGVzIHRoYXQgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGFib3ZlIG1lc3NhZ2VzOgorCisgICBOdW1iZXIgb2YKKyAgIG9jY3VyZW5jZSAgICBhdHRyaWJ1dGVzCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAyICAgICAgICAgdV9pbnQzMl90IGJlYXJlcl9jYXA7CisgICAgICAyICAgICAgICAgdV9pbnQzMl90IGJlYXJlcl90eXBlOworICAgICAgNiAgICAgICAgIHVfaW50MTZfdCBjYWxsX2lkOworICAgICAgMiAgICAgICAgIHVfaW50MTZfdCBjYWxsX3NlcjsKKyAgICAgIDIgICAgICAgICB1X2ludDE2X3QgY2F1c2VfY29kZTsKKyAgICAgIDIgICAgICAgICB1X2ludDMyX3QgY29ubl9zcGVlZDsKKyAgICAgIDYgICAgICAgICB1X2ludDhfdCBlcnJfY29kZTsKKyAgICAgIDIgICAgICAgICB1X2ludDE2X3QgZmlybV9yZXY7CisgICAgICAyICAgICAgICAgdV9pbnQzMl90IGZyYW1pbmdfY2FwOworICAgICAgMiAgICAgICAgIHVfaW50MzJfdCBmcmFtaW5nX3R5cGU7CisgICAgICAyICAgICAgICAgdV9jaGFyIGhvc3RuYW1lWzY0XTsKKyAgICAgIDIgICAgICAgICB1X2ludDMyX3QgaWQ7CisgICAgICAyICAgICAgICAgdV9pbnQxNl90IG1heF9jaGFubmVsOworICAgICAgNSAgICAgICAgIHVfaW50MTZfdCBwZWVyX2NhbGxfaWQ7CisgICAgICAyICAgICAgICAgdV9pbnQzMl90IHBoeV9jaGFuX2lkOworICAgICAgNCAgICAgICAgIHVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKKyAgICAgIDIgICAgICAgICB1X2ludDE2X3QgcHJvdG9fdmVyOworICAgICAgNCAgICAgICAgIHVfaW50MTZfdCByZWN2X3dpbnNpejsKKyAgICAgIDIgICAgICAgICB1X2ludDhfdCByZXNlcnZlZDE7CisgICAgICA5ICAgICAgICAgdV9pbnQxNl90IHJlc2VydmVkMTsKKyAgICAgIDYgICAgICAgICB1X2ludDhfdCByZXN1bHRfY29kZTsKKyAgICAgIDIgICAgICAgICB1X2NoYXIgc3ViYWRkcls2NF07CisgICAgICAyICAgICAgICAgdV9jaGFyIHZlbmRvcls2NF07CisKKyAgc28gSSB3aWxsIHByZXBhcmUgcHJpbnQgb3V0IGZ1bmN0aW9ucyBmb3IgdGhlc2UgYXR0cmlidXRlcyAoZXhjZXB0IGZvcgorICByZXNlcnZlZCopLgorKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEF0dHJpYnV0ZS1zcGVjaWZpYyBwcmludCBvdXQgZnVuY3Rpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbiB0aGVzZSBhdHRyaWJ1dGUtc3BlY2lmaWMgcHJpbnQtb3V0IGZ1bmN0aW9ucywgaXQndCBub3QgbmVjZXNzYXJ5CisgICB0byBkbyBUQ0hFQ0sgYmVjYXVzZSB0aGV5IGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gdGhlIGNhbGxlciBvZgorICAgdGhlc2UgZnVuY3Rpb25zLiAqLworCitzdGF0aWMgdm9pZAorcHB0cF9iZWFyZXJfY2FwX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqYmVhcmVyX2NhcCkKK3sKKwlwcmludGYoIiBCRUFSRVJfQ0FQKCIpOworCWlmIChFWFRSQUNUXzMyQklUUyhiZWFyZXJfY2FwKSAmIFBQVFBfQkVBUkVSX0NBUF9ESUdJVEFMX01BU0spIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoYmVhcmVyX2NhcCkgJiBQUFRQX0JFQVJFUl9DQVBfQU5BTE9HX01BU0spIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkEiKTsKKyAgICAgICAgfQorCXByaW50ZigiKSIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9iZWFyZXJfdHlwZV9wcmludChjb25zdCB1X2ludDMyX3QgKmJlYXJlcl90eXBlKQoreworCXByaW50ZigiIEJFQVJFUl9UWVBFKCIpOworCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoYmVhcmVyX3R5cGUpKSB7CisJY2FzZSAxOgorCQlwcmludGYoIkEiKTsJLyogQW5hbG9nICovCisJCWJyZWFrOworCWNhc2UgMjoKKwkJcHJpbnRmKCJEIik7CS8qIERpZ2l0YWwgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwcmludGYoIkFueSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIj8iKTsKKwkJYnJlYWs7CisgICAgICAgIH0KKwlwcmludGYoIikiKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfY2FsbF9pZF9wcmludChjb25zdCB1X2ludDE2X3QgKmNhbGxfaWQpCit7CisJcHJpbnRmKCIgQ0FMTF9JRCgldSkiLCBFWFRSQUNUXzE2QklUUyhjYWxsX2lkKSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2NhbGxfc2VyX3ByaW50KGNvbnN0IHVfaW50MTZfdCAqY2FsbF9zZXIpCit7CisJcHJpbnRmKCIgQ0FMTF9TRVJfTlVNKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKGNhbGxfc2VyKSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2NhdXNlX2NvZGVfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpjYXVzZV9jb2RlKQoreworCXByaW50ZigiIENBVVNFX0NPREUoJXUpIiwgRVhUUkFDVF8xNkJJVFMoY2F1c2VfY29kZSkpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9jb25uX3NwZWVkX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqY29ubl9zcGVlZCkKK3sKKwlwcmludGYoIiBDT05OX1NQRUVEKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKGNvbm5fc3BlZWQpKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfZXJyX2NvZGVfcHJpbnQoY29uc3QgdV9pbnQ4X3QgKmVycl9jb2RlKQoreworCXByaW50ZigiIEVSUl9DT0RFKCV1IiwgKmVycl9jb2RlKTsKKwlpZiAodmZsYWcpIHsKKwkJc3dpdGNoICgqZXJyX2NvZGUpIHsKKwkJY2FzZSAwOgorCQkJcHJpbnRmKCI6Tm9uZSIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXByaW50ZigiOk5vdC1Db25uZWN0ZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcmludGYoIjpCYWQtRm9ybWF0Iik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHJpbnRmKCI6QmFkLVZhbHVkZSIpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXByaW50ZigiOk5vLVJlc291cmNlIik7CisJCQlicmVhazsKKwkJY2FzZSA1OgorCQkJcHJpbnRmKCI6QmFkLUNhbGwtSUQiKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlwcmludGYoIjpQQUMtRXJyb3IiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCI6PyIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcHJpbnRmKCIpIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2Zpcm1fcmV2X3ByaW50KGNvbnN0IHVfaW50MTZfdCAqZmlybV9yZXYpCit7CisJcHJpbnRmKCIgRklSTV9SRVYoJXUpIiwgRVhUUkFDVF8xNkJJVFMoZmlybV9yZXYpKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfZnJhbWluZ19jYXBfcHJpbnQoY29uc3QgdV9pbnQzMl90ICpmcmFtaW5nX2NhcCkKK3sKKwlwcmludGYoIiBGUkFNRV9DQVAoIik7CisJaWYgKEVYVFJBQ1RfMzJCSVRTKGZyYW1pbmdfY2FwKSAmIFBQVFBfRlJBTUlOR19DQVBfQVNZTkNfTUFTSykgeworICAgICAgICAgICAgICAgIHByaW50ZigiQSIpOwkJLyogQXN5bmMgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoZnJhbWluZ19jYXApICYgUFBUUF9GUkFNSU5HX0NBUF9TWU5DX01BU0spIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlMiKTsJCS8qIFN5bmMgKi8KKyAgICAgICAgfQorCXByaW50ZigiKSIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9mcmFtaW5nX3R5cGVfcHJpbnQoY29uc3QgdV9pbnQzMl90ICpmcmFtaW5nX3R5cGUpCit7CisJcHJpbnRmKCIgRlJBTUVfVFlQRSgiKTsKKwlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKGZyYW1pbmdfdHlwZSkpIHsKKwljYXNlIDE6CisJCXByaW50ZigiQSIpOwkJLyogQXN5bmMgKi8KKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcmludGYoIlMiKTsJCS8qIFN5bmMgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQlwcmludGYoIkUiKTsJCS8qIEVpdGhlciAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIj8iKTsKKwkJYnJlYWs7CisJfQorCXByaW50ZigiKSIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9ob3N0bmFtZV9wcmludChjb25zdCB1X2NoYXIgKmhvc3RuYW1lKQoreworCXByaW50ZigiIEhPU1ROQU1FKCUuNjRzKSIsIGhvc3RuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfaWRfcHJpbnQoY29uc3QgdV9pbnQzMl90ICppZCkKK3sKKwlwcmludGYoIiBJRCgldSkiLCBFWFRSQUNUXzMyQklUUyhpZCkpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9tYXhfY2hhbm5lbF9wcmludChjb25zdCB1X2ludDE2X3QgKm1heF9jaGFubmVsKQoreworCXByaW50ZigiIE1BWF9DSEFOKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKG1heF9jaGFubmVsKSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX3BlZXJfY2FsbF9pZF9wcmludChjb25zdCB1X2ludDE2X3QgKnBlZXJfY2FsbF9pZCkKK3sKKwlwcmludGYoIiBQRUVSX0NBTExfSUQoJXUpIiwgRVhUUkFDVF8xNkJJVFMocGVlcl9jYWxsX2lkKSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX3BoeV9jaGFuX2lkX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqcGh5X2NoYW5faWQpCit7CisJcHJpbnRmKCIgUEhZX0NIQU5fSUQoJXUpIiwgRVhUUkFDVF8zMkJJVFMocGh5X2NoYW5faWQpKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpwa3RfcHJvY19kZWxheSkKK3sKKwlwcmludGYoIiBQUk9DX0RFTEFZKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKHBrdF9wcm9jX2RlbGF5KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX3Byb3RvX3Zlcl9wcmludChjb25zdCB1X2ludDE2X3QgKnByb3RvX3ZlcikKK3sKKwlwcmludGYoIiBQUk9UT19WRVIoJXUuJXUpIiwJLyogVmVyc2lvbi5SZXZpc2lvbiAqLworCSAgICAgICBFWFRSQUNUXzE2QklUUyhwcm90b192ZXIpID4+IDgsCisJICAgICAgIEVYVFJBQ1RfMTZCSVRTKHByb3RvX3ZlcikgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfcmVjdl93aW5zaXpfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpyZWN2X3dpbnNpeikKK3sKKwlwcmludGYoIiBSRUNWX1dJTigldSkiLCBFWFRSQUNUXzE2QklUUyhyZWN2X3dpbnNpeikpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9yZXN1bHRfY29kZV9wcmludChjb25zdCB1X2ludDhfdCAqcmVzdWx0X2NvZGUsIGludCBjdHJsX21zZ190eXBlKQoreworCXByaW50ZigiIFJFU1VMVF9DT0RFKCV1IiwgKnJlc3VsdF9jb2RlKTsKKwlpZiAodmZsYWcpIHsKKwkJc3dpdGNoIChjdHJsX21zZ190eXBlKSB7CisJCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JQOgorCQkJc3dpdGNoICgqcmVzdWx0X2NvZGUpIHsKKwkJCWNhc2UgMToKKwkJCQlwcmludGYoIjpTdWNjZXNzZnVsIGNoYW5uZWwgZXN0YWJsaXNobWVudCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXByaW50ZigiOkdlbmVyYWwgZXJyb3IiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcmludGYoIjpDb21tYW5kIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlwcmludGYoIjpSZXF1ZXN0ZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gZXN0YWJsaXNoIGEgY29tbWFuZCBjaGFubmVsIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDU6CisJCQkJcHJpbnRmKCI6VGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3RlciBpcyBub3Qgc3VwcG9ydGVkIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiOj8iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9TdG9wQ0NSUDoKKwkJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JQOgorCQkJc3dpdGNoICgqcmVzdWx0X2NvZGUpIHsKKwkJCWNhc2UgMToKKwkJCQlwcmludGYoIjpPSyIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCI6PyIpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX09DUlA6CisJCQlzd2l0Y2ggKCpyZXN1bHRfY29kZSkgeworCQkJY2FzZSAxOgorCQkJCXByaW50ZigiOkNvbm5lY3RlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcmludGYoIjpObyBDYXJyaWVyIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcHJpbnRmKCI6QnVzeSIpOworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXByaW50ZigiOk5vIERpYWwgVG9uZSIpOworCQkJCWJyZWFrOworCQkJY2FzZSA2OgorCQkJCXByaW50ZigiOlRpbWUtb3V0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJcHJpbnRmKCI6RG8gTm90IEFjY2VwdCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIjo/Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNSUDoKKwkJCXN3aXRjaCAoKnJlc3VsdF9jb2RlKSB7CisJCQljYXNlIDE6CisJCQkJcHJpbnRmKCI6Q29ubmVjdCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcmludGYoIjpEbyBOb3QgQWNjZXB0Iik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ZigiOj8iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE46CisJCQlzd2l0Y2ggKCpyZXN1bHRfY29kZSkgeworCQkJY2FzZSAxOgorCQkJCXByaW50ZigiOkxvc3QgQ2FycmllciIpOworCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcmludGYoIjpBZG1pbiBTaHV0ZG93biIpOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXByaW50ZigiOlJlcXVlc3QiKTsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRmKCI6PyIpOworCQkJCWJyZWFrOworCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQkvKiBhc3NlcnRpb24gZXJyb3IgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCXByaW50ZigiKSIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9zdWJhZGRyX3ByaW50KGNvbnN0IHVfY2hhciAqc3ViYWRkcikKK3sKKwlwcmludGYoIiBTVUJfQUREUiglLjY0cykiLCBzdWJhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfdmVuZG9yX3ByaW50KGNvbnN0IHVfY2hhciAqdmVuZG9yKQoreworCXByaW50ZigiIFZFTkRPUiglLjY0cykiLCB2ZW5kb3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUFBUUCBtZXNzYWdlIHByaW50IG91dCBmdW5jdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorcHB0cF9zY2NycV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfc2NjcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2NjcnEgKilkYXQ7CisKKwlUQ0hFQ0socHRyLT5wcm90b192ZXIpOworCXBwdHBfcHJvdG9fdmVyX3ByaW50KCZwdHItPnByb3RvX3Zlcik7CisJVENIRUNLKHB0ci0+cmVzZXJ2ZWQxKTsKKwlUQ0hFQ0socHRyLT5mcmFtaW5nX2NhcCk7CisJcHB0cF9mcmFtaW5nX2NhcF9wcmludCgmcHRyLT5mcmFtaW5nX2NhcCk7CisJVENIRUNLKHB0ci0+YmVhcmVyX2NhcCk7CisJcHB0cF9iZWFyZXJfY2FwX3ByaW50KCZwdHItPmJlYXJlcl9jYXApOworCVRDSEVDSyhwdHItPm1heF9jaGFubmVsKTsKKwlwcHRwX21heF9jaGFubmVsX3ByaW50KCZwdHItPm1heF9jaGFubmVsKTsKKwlUQ0hFQ0socHRyLT5maXJtX3Jldik7CisJcHB0cF9maXJtX3Jldl9wcmludCgmcHRyLT5maXJtX3Jldik7CisJVENIRUNLKHB0ci0+aG9zdG5hbWUpOworCXBwdHBfaG9zdG5hbWVfcHJpbnQoJnB0ci0+aG9zdG5hbWVbMF0pOworCVRDSEVDSyhwdHItPnZlbmRvcik7CisJcHB0cF92ZW5kb3JfcHJpbnQoJnB0ci0+dmVuZG9yWzBdKTsKKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIlcyIsIHRzdHIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9zY2NycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfc2NjcnAgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2NjcnAgKilkYXQ7CisKKwlUQ0hFQ0socHRyLT5wcm90b192ZXIpOworCXBwdHBfcHJvdG9fdmVyX3ByaW50KCZwdHItPnByb3RvX3Zlcik7CisJVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOworCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9TQ0NSUCk7CisJVENIRUNLKHB0ci0+ZXJyX2NvZGUpOworCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOworCVRDSEVDSyhwdHItPmZyYW1pbmdfY2FwKTsKKwlwcHRwX2ZyYW1pbmdfY2FwX3ByaW50KCZwdHItPmZyYW1pbmdfY2FwKTsKKwlUQ0hFQ0socHRyLT5iZWFyZXJfY2FwKTsKKwlwcHRwX2JlYXJlcl9jYXBfcHJpbnQoJnB0ci0+YmVhcmVyX2NhcCk7CisJVENIRUNLKHB0ci0+bWF4X2NoYW5uZWwpOworCXBwdHBfbWF4X2NoYW5uZWxfcHJpbnQoJnB0ci0+bWF4X2NoYW5uZWwpOworCVRDSEVDSyhwdHItPmZpcm1fcmV2KTsKKwlwcHRwX2Zpcm1fcmV2X3ByaW50KCZwdHItPmZpcm1fcmV2KTsKKwlUQ0hFQ0socHRyLT5ob3N0bmFtZSk7CisJcHB0cF9ob3N0bmFtZV9wcmludCgmcHRyLT5ob3N0bmFtZVswXSk7CisJVENIRUNLKHB0ci0+dmVuZG9yKTsKKwlwcHRwX3ZlbmRvcl9wcmludCgmcHRyLT52ZW5kb3JbMF0pOworCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiVzIiwgdHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX3N0b3BjY3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXN0cnVjdCBwcHRwX21zZ19zdG9wY2NycSAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19zdG9wY2NycSAqKWRhdDsKKworCVRDSEVDSyhwdHItPnJlYXNvbik7CisJcHJpbnRmKCIgUkVBU09OKCV1IiwgcHRyLT5yZWFzb24pOworCWlmICh2ZmxhZykgeworCQlzd2l0Y2ggKHB0ci0+cmVhc29uKSB7CisJCWNhc2UgMToKKwkJCXByaW50ZigiOk5vbmUiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcmludGYoIjpTdG9wLVByb3RvY29sIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJcHJpbnRmKCI6U3RvcC1Mb2NhbC1TaHV0ZG93biIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIjo/Iik7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcmludGYoIikiKTsKKwlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMik7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfc3RvcGNjcnBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JwICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JwICopZGF0OworCisJVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOworCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9TdG9wQ0NSUCk7CisJVENIRUNLKHB0ci0+ZXJyX2NvZGUpOworCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfZWNob3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXN0cnVjdCBwcHRwX21zZ19lY2hvcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfZWNob3JxICopZGF0OworCisJVENIRUNLKHB0ci0+aWQpOworCXBwdHBfaWRfcHJpbnQoJnB0ci0+aWQpOworCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiVzIiwgdHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2VjaG9ycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfZWNob3JwICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2VjaG9ycCAqKWRhdDsKKworCVRDSEVDSyhwdHItPmlkKTsKKwlwcHRwX2lkX3ByaW50KCZwdHItPmlkKTsKKwlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7CisJcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUCk7CisJVENIRUNLKHB0ci0+ZXJyX2NvZGUpOworCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfb2NycV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfb2NycSAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19vY3JxICopZGF0OworCisJVENIRUNLKHB0ci0+Y2FsbF9pZCk7CisJcHB0cF9jYWxsX2lkX3ByaW50KCZwdHItPmNhbGxfaWQpOworCVRDSEVDSyhwdHItPmNhbGxfc2VyKTsKKwlwcHRwX2NhbGxfc2VyX3ByaW50KCZwdHItPmNhbGxfc2VyKTsKKwlUQ0hFQ0socHRyLT5taW5fYnBzKTsKKwlwcmludGYoIiBNSU5fQlBTKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPm1pbl9icHMpKTsKKwlUQ0hFQ0socHRyLT5tYXhfYnBzKTsKKwlwcmludGYoIiBNQVhfQlBTKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPm1heF9icHMpKTsKKwlUQ0hFQ0socHRyLT5iZWFyZXJfdHlwZSk7CisJcHB0cF9iZWFyZXJfdHlwZV9wcmludCgmcHRyLT5iZWFyZXJfdHlwZSk7CisJVENIRUNLKHB0ci0+ZnJhbWluZ190eXBlKTsKKwlwcHRwX2ZyYW1pbmdfdHlwZV9wcmludCgmcHRyLT5mcmFtaW5nX3R5cGUpOworCVRDSEVDSyhwdHItPnJlY3Zfd2luc2l6KTsKKwlwcHRwX3JlY3Zfd2luc2l6X3ByaW50KCZwdHItPnJlY3Zfd2luc2l6KTsKKwlUQ0hFQ0socHRyLT5wa3RfcHJvY19kZWxheSk7CisJcHB0cF9wa3RfcHJvY19kZWxheV9wcmludCgmcHRyLT5wa3RfcHJvY19kZWxheSk7CisJVENIRUNLKHB0ci0+cGhvbmVfbm9fbGVuKTsKKwlwcmludGYoIiBQSE9ORV9OT19MRU4oJXUpIiwgRVhUUkFDVF8xNkJJVFMoJnB0ci0+cGhvbmVfbm9fbGVuKSk7CisJVENIRUNLKHB0ci0+cmVzZXJ2ZWQxKTsKKwlUQ0hFQ0socHRyLT5waG9uZV9ubyk7CisJcHJpbnRmKCIgUEhPTkVfTk8oJS42NHMpIiwgcHRyLT5waG9uZV9ubyk7CisJVENIRUNLKHB0ci0+c3ViYWRkcik7CisJcHB0cF9zdWJhZGRyX3ByaW50KCZwdHItPnN1YmFkZHJbMF0pOworCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiVzIiwgdHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX29jcnBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJc3RydWN0IHBwdHBfbXNnX29jcnAgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfb2NycCAqKWRhdDsKKworCVRDSEVDSyhwdHItPmNhbGxfaWQpOworCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKKwlUQ0hFQ0socHRyLT5wZWVyX2NhbGxfaWQpOworCXBwdHBfcGVlcl9jYWxsX2lkX3ByaW50KCZwdHItPnBlZXJfY2FsbF9pZCk7CisJVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOworCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JQKTsKKwlUQ0hFQ0socHRyLT5lcnJfY29kZSk7CisJcHB0cF9lcnJfY29kZV9wcmludCgmcHRyLT5lcnJfY29kZSk7CisJVENIRUNLKHB0ci0+Y2F1c2VfY29kZSk7CisJcHB0cF9jYXVzZV9jb2RlX3ByaW50KCZwdHItPmNhdXNlX2NvZGUpOworCVRDSEVDSyhwdHItPmNvbm5fc3BlZWQpOworCXBwdHBfY29ubl9zcGVlZF9wcmludCgmcHRyLT5jb25uX3NwZWVkKTsKKwlUQ0hFQ0socHRyLT5yZWN2X3dpbnNpeik7CisJcHB0cF9yZWN2X3dpbnNpel9wcmludCgmcHRyLT5yZWN2X3dpbnNpeik7CisJVENIRUNLKHB0ci0+cGt0X3Byb2NfZGVsYXkpOworCXBwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoJnB0ci0+cGt0X3Byb2NfZGVsYXkpOworCVRDSEVDSyhwdHItPnBoeV9jaGFuX2lkKTsKKwlwcHRwX3BoeV9jaGFuX2lkX3ByaW50KCZwdHItPnBoeV9jaGFuX2lkKTsKKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIlcyIsIHRzdHIpOworfQorCitzdGF0aWMgdm9pZAorcHB0cF9pY3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXN0cnVjdCBwcHRwX21zZ19pY3JxICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2ljcnEgKilkYXQ7CisKKwlUQ0hFQ0socHRyLT5jYWxsX2lkKTsKKwlwcHRwX2NhbGxfaWRfcHJpbnQoJnB0ci0+Y2FsbF9pZCk7CisJVENIRUNLKHB0ci0+Y2FsbF9zZXIpOworCXBwdHBfY2FsbF9zZXJfcHJpbnQoJnB0ci0+Y2FsbF9zZXIpOworCVRDSEVDSyhwdHItPmJlYXJlcl90eXBlKTsKKwlwcHRwX2JlYXJlcl90eXBlX3ByaW50KCZwdHItPmJlYXJlcl90eXBlKTsKKwlUQ0hFQ0socHRyLT5waHlfY2hhbl9pZCk7CisJcHB0cF9waHlfY2hhbl9pZF9wcmludCgmcHRyLT5waHlfY2hhbl9pZCk7CisJVENIRUNLKHB0ci0+ZGlhbGVkX25vX2xlbik7CisJcHJpbnRmKCIgRElBTEVEX05PX0xFTigldSkiLCBFWFRSQUNUXzE2QklUUygmcHRyLT5kaWFsZWRfbm9fbGVuKSk7CisJVENIRUNLKHB0ci0+ZGlhbGluZ19ub19sZW4pOworCXByaW50ZigiIERJQUxJTkdfTk9fTEVOKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKCZwdHItPmRpYWxpbmdfbm9fbGVuKSk7CisJVENIRUNLKHB0ci0+ZGlhbGVkX25vKTsKKwlwcmludGYoIiBESUFMRURfTk8oJS42NHMpIiwgcHRyLT5kaWFsZWRfbm8pOworCVRDSEVDSyhwdHItPmRpYWxpbmdfbm8pOworCXByaW50ZigiIERJQUxJTkdfTk8oJS42NHMpIiwgcHRyLT5kaWFsaW5nX25vKTsKKwlUQ0hFQ0socHRyLT5zdWJhZGRyKTsKKwlwcHRwX3N1YmFkZHJfcHJpbnQoJnB0ci0+c3ViYWRkclswXSk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfaWNycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfaWNycCAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19pY3JwICopZGF0OworCisJVENIRUNLKHB0ci0+Y2FsbF9pZCk7CisJcHB0cF9jYWxsX2lkX3ByaW50KCZwdHItPmNhbGxfaWQpOworCVRDSEVDSyhwdHItPnBlZXJfY2FsbF9pZCk7CisJcHB0cF9wZWVyX2NhbGxfaWRfcHJpbnQoJnB0ci0+cGVlcl9jYWxsX2lkKTsKKwlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7CisJcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0lDUlApOworCVRDSEVDSyhwdHItPmVycl9jb2RlKTsKKwlwcHRwX2Vycl9jb2RlX3ByaW50KCZwdHItPmVycl9jb2RlKTsKKwlUQ0hFQ0socHRyLT5yZWN2X3dpbnNpeik7CisJcHB0cF9yZWN2X3dpbnNpel9wcmludCgmcHRyLT5yZWN2X3dpbnNpeik7CisJVENIRUNLKHB0ci0+cGt0X3Byb2NfZGVsYXkpOworCXBwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoJnB0ci0+cGt0X3Byb2NfZGVsYXkpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfaWNjbl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfaWNjbiAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19pY2NuICopZGF0OworCisJVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKKwlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisJVENIRUNLKHB0ci0+Y29ubl9zcGVlZCk7CisJcHB0cF9jb25uX3NwZWVkX3ByaW50KCZwdHItPmNvbm5fc3BlZWQpOworCVRDSEVDSyhwdHItPnJlY3Zfd2luc2l6KTsKKwlwcHRwX3JlY3Zfd2luc2l6X3ByaW50KCZwdHItPnJlY3Zfd2luc2l6KTsKKwlUQ0hFQ0socHRyLT5wa3RfcHJvY19kZWxheSk7CisJcHB0cF9wa3RfcHJvY19kZWxheV9wcmludCgmcHRyLT5wa3RfcHJvY19kZWxheSk7CisJVENIRUNLKHB0ci0+ZnJhbWluZ190eXBlKTsKKwlwcHRwX2ZyYW1pbmdfdHlwZV9wcmludCgmcHRyLT5mcmFtaW5nX3R5cGUpOworCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiVzIiwgdHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2NjcnFfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCit7CisJc3RydWN0IHBwdHBfbXNnX2NjcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfY2NycSAqKWRhdDsKKworCVRDSEVDSyhwdHItPmNhbGxfaWQpOworCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKKwlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOworCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiVzIiwgdHN0cik7Cit9CisKK3N0YXRpYyB2b2lkCitwcHRwX2Nkbl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKK3sKKwlzdHJ1Y3QgcHB0cF9tc2dfY2RuICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2NkbiAqKWRhdDsKKworCVRDSEVDSyhwdHItPmNhbGxfaWQpOworCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKKwlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7CisJcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0NETik7CisJVENIRUNLKHB0ci0+ZXJyX2NvZGUpOworCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOworCVRDSEVDSyhwdHItPmNhdXNlX2NvZGUpOworCXBwdHBfY2F1c2VfY29kZV9wcmludCgmcHRyLT5jYXVzZV9jb2RlKTsKKwlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOworCVRDSEVDSyhwdHItPmNhbGxfc3RhdHMpOworCXByaW50ZigiIENBTExfU1RBVFMoJS4xMjhzKSIsIHB0ci0+Y2FsbF9zdGF0cyk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfd2VuX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXN0cnVjdCBwcHRwX21zZ193ZW4gKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfd2VuICopZGF0OworCisJVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKKwlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisJVENIRUNLKHB0ci0+Y3JjX2Vycik7CisJcHJpbnRmKCIgQ1JDX0VSUigldSkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5jcmNfZXJyKSk7CisJVENIRUNLKHB0ci0+ZnJhbWluZ19lcnIpOworCXByaW50ZigiIEZSQU1JTkdfRVJSKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPmZyYW1pbmdfZXJyKSk7CisJVENIRUNLKHB0ci0+aGFyZHdhcmVfb3ZlcnJ1bik7CisJcHJpbnRmKCIgSEFSRFdBUkVfT1ZFUlJVTigldSkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5oYXJkd2FyZV9vdmVycnVuKSk7CisJVENIRUNLKHB0ci0+YnVmZmVyX292ZXJydW4pOworCXByaW50ZigiIEJVRkZFUl9PVkVSUlVOKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPmJ1ZmZlcl9vdmVycnVuKSk7CisJVENIRUNLKHB0ci0+dGltZW91dF9lcnIpOworCXByaW50ZigiIFRJTUVPVVRfRVJSKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPnRpbWVvdXRfZXJyKSk7CisJVENIRUNLKHB0ci0+YWxpZ25fZXJyKTsKKwlwcmludGYoIiBBTElHTl9FUlIoJXUpIiwgRVhUUkFDVF8zMkJJVFMoJnB0ci0+YWxpZ25fZXJyKSk7CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiJXMiLCB0c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3BwdHBfc2xpX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCXN0cnVjdCBwcHRwX21zZ19zbGkgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2xpICopZGF0OworCisJVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKKwlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOworCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7CisJVENIRUNLKHB0ci0+c2VuZF9hY2NtKTsKKwlwcmludGYoIiBTRU5EX0FDQ00oMHglMDh4KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPnNlbmRfYWNjbSkpOworCVRDSEVDSyhwdHItPnJlY3ZfYWNjbSk7CisJcHJpbnRmKCIgUkVDVl9BQ0NNKDB4JTA4eCkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5yZWN2X2FjY20pKTsKKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIlcyIsIHRzdHIpOworfQorCit2b2lkCitwcHRwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQoreworCWNvbnN0IHN0cnVjdCBwcHRwX2hkciAqaGRyOworCXVfaW50MzJfdCBtYzsKKwl1X2ludDE2X3QgY3RybF9tc2dfdHlwZTsKKworCXByaW50ZigiOiBwcHRwIik7CisKKwloZHIgPSAoc3RydWN0IHBwdHBfaGRyICopZGF0OworCisJVENIRUNLKGhkci0+bGVuZ3RoKTsKKwlpZiAodmZsYWcpIHsKKwkJcHJpbnRmKCIgTGVuZ3RoPSV1IiwgRVhUUkFDVF8xNkJJVFMoJmhkci0+bGVuZ3RoKSk7CisJfQorCVRDSEVDSyhoZHItPm1zZ190eXBlKTsKKwlpZiAodmZsYWcpIHsKKwkJc3dpdGNoKEVYVFJBQ1RfMTZCSVRTKCZoZHItPm1zZ190eXBlKSkgeworCQljYXNlIFBQVFBfTVNHX1RZUEVfQ1RSTDoKKwkJCXByaW50ZigiIENUUkwtTVNHIik7CisJCQlicmVhazsKKwkJY2FzZSBQUFRQX01TR19UWVBFX01HTVQ6CisJCQlwcmludGYoIiBNR01ULU1TRyIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiBVTktOT1dOLU1TRy1UWVBFIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCVRDSEVDSyhoZHItPm1hZ2ljX2Nvb2tpZSk7CisJbWMgPSBFWFRSQUNUXzMyQklUUygmaGRyLT5tYWdpY19jb29raWUpOworCWlmIChtYyAhPSBQUFRQX01BR0lDX0NPT0tJRSkgeworCQlwcmludGYoIiBVTkVYUEVDVEVEIE1hZ2ljLUNvb2tpZSEhKCUwOHgpIiwgbWMpOworCX0KKwlpZiAodmZsYWcgfHwgbWMgIT0gUFBUUF9NQUdJQ19DT09LSUUpIHsKKwkJcHJpbnRmKCIgTWFnaWMtQ29va2llPSUwOHgiLCBtYyk7CisJfQorCVRDSEVDSyhoZHItPmN0cmxfbXNnX3R5cGUpOworCWN0cmxfbXNnX3R5cGUgPSBFWFRSQUNUXzE2QklUUygmaGRyLT5jdHJsX21zZ190eXBlKTsKKwlpZiAoY3RybF9tc2dfdHlwZSA8IFBQVFBfTUFYX01TR1RZUEVfSU5ERVgpIHsKKwkJcHJpbnRmKCIgQ1RSTF9NU0dUWVBFPSVzIiwKKwkJICAgICAgIHBwdHBfbWVzc2FnZV90eXBlX3N0cmluZ1tjdHJsX21zZ190eXBlXSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgVU5LTk9XTl9DVFJMX01TR1RZUEUoJXUpIiwgY3RybF9tc2dfdHlwZSk7CisJfQorCVRDSEVDSyhoZHItPnJlc2VydmVkMCk7CisKKwlkYXQgKz0gMTI7CisKKwlzd2l0Y2goY3RybF9tc2dfdHlwZSkgeworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JROgorCQlwcHRwX3NjY3JxX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JQOgorCQlwcHRwX3NjY3JwX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1N0b3BDQ1JROgorCQlwcHRwX3N0b3BjY3JxX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1N0b3BDQ1JQOgorCQlwcHRwX3N0b3BjY3JwX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUToKKwkJcHB0cF9lY2hvcnFfcHJpbnQoZGF0KTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JQOgorCQlwcHRwX2VjaG9ycF9wcmludChkYXQpOworCQlicmVhazsKKwljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JROgorCQlwcHRwX29jcnFfcHJpbnQoZGF0KTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfT0NSUDoKKwkJcHB0cF9vY3JwX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0lDUlE6CisJCXBwdHBfaWNycV9wcmludChkYXQpOworCQlicmVhazsKKwljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JQOgorCQlwcHRwX2ljcnBfcHJpbnQoZGF0KTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNDTjoKKwkJcHB0cF9pY2NuX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0NDUlE6CisJCXBwdHBfY2NycV9wcmludChkYXQpOworCQlicmVhazsKKwljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE46CisJCXBwdHBfY2RuX3ByaW50KGRhdCk7CisJCWJyZWFrOworCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1dFTjoKKwkJcHB0cF93ZW5fcHJpbnQoZGF0KTsKKwkJYnJlYWs7CisJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0xJOgorCQlwcHRwX3NsaV9wcmludChkYXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIlcyIsIHRzdHIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcmFkaXVzLmMgYi9wcmludC1yYWRpdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNjNTBiCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtcmFkaXVzLmMKQEAgLTAsMCArMSw5MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQWxmcmVkbyBBbmRyZXMgT21lbGxhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICAgZGlzdHJpYnV0aW9uLgorICogICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworLyoKKyAqIFJhZGl1cyBwcmludGVyIHJvdXRpbmVzIGFzIHNwZWNpZmllZCBvbjoKKyAqCisgKiBSRkMgMjg2NToKKyAqICAgICAgIlJlbW90ZSBBdXRoZW50aWNhdGlvbiBEaWFsIEluIFVzZXIgU2VydmljZSAoUkFESVVTKSIKKyAqCisgKiBSRkMgMjg2NjoKKyAqICAgICAgIlJBRElVUyBBY2NvdW50aW5nIgorICoKKyAqIFJGQyAyODY3OgorICogICAgICAiUkFESVVTIEFjY291bnRpbmcgTW9kaWZpY2F0aW9ucyBmb3IgVHVubmVsIFByb3RvY29sIFN1cHBvcnQiCisgKgorICogUkZDIDI4Njg6CisgKiAgICAgICJSQURJVVMgQXR0cmlidXRlcyBmb3IgVHVubmVsIFByb3RvY29sIFN1cHBvcnQiCisgKgorICogUkZDIDI4Njk6CisgKiAgICAgICJSQURJVVMgRXh0ZW5zaW9ucyIKKyAqCisgKiBBbGZyZWRvIEFuZHJlcyBPbWVsbGEgKGFhbmRyZXNAczIxc2VjLmNvbSkgdjAuMSAyMDAwLzA5LzE1CisgKgorICogVE9ETzogQW1vbmcgb3RoZXIgdGhpbmdzIHRvIHByaW50IG9rIE1hY0ludG9zaCBhbmQgVmVuZG9yIHZhbHVlcworICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICIkSWQ6IHByaW50LXJhZGl1cy5jLHYgMS4yNy4yLjEgMjAwNS8wOS8yNiAwMTowMjo0MCBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgIm91aS5oIgorCisjZGVmaW5lIFRBTV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pICkKKworI2RlZmluZSBQUklOVF9IRVgoYnl0ZXNfbGVuLCBwdHJfZGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB3aGlsZShieXRlc19sZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCAqcHRyX2RhdGEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBwdHJfZGF0YSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBieXRlc19sZW4tLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9CisKKworLyogUmFkaXVzIHBhY2tldCBjb2RlcyAqLworI2RlZmluZSBSQURDTURfQUNDRVNTX1JFUSAgIDEgLyogQWNjZXNzLVJlcXVlc3QgICAgICAqLworI2RlZmluZSBSQURDTURfQUNDRVNTX0FDQyAgIDIgLyogQWNjZXNzLUFjY2VwdCAgICAgICAqLworI2RlZmluZSBSQURDTURfQUNDRVNTX1JFSiAgIDMgLyogQWNjZXNzLVJlamVjdCAgICAgICAqLworI2RlZmluZSBSQURDTURfQUNDT1VOX1JFUSAgIDQgLyogQWNjb3VudGluZy1SZXF1ZXN0ICAqLworI2RlZmluZSBSQURDTURfQUNDT1VOX1JFUyAgIDUgLyogQWNjb3VudGluZy1SZXNwb25zZSAqLworI2RlZmluZSBSQURDTURfQUNDRVNTX0NIQSAgMTEgLyogQWNjZXNzLUNoYWxsZW5nZSAgICAqLworI2RlZmluZSBSQURDTURfU1RBVFVTX1NFUiAgMTIgLyogU3RhdHVzLVNlcnZlciAgICAgICAqLworI2RlZmluZSBSQURDTURfU1RBVFVTX0NMSSAgMTMgLyogU3RhdHVzLUNsaWVudCAgICAgICAqLworI2RlZmluZSBSQURDTURfUkVTRVJWRUQgICAyNTUgLyogUmVzZXJ2ZWQgICAgICAgICAgICAqLworCitzdGF0aWMgc3RydWN0IHRvayByYWRpdXNfY29tbWFuZF92YWx1ZXNbXSA9IHsKKyAgICB7IFJBRENNRF9BQ0NFU1NfUkVRLCAiQWNjZXNzIFJlcXVlc3QiIH0sCisgICAgeyBSQURDTURfQUNDRVNTX0FDQywgIkFjY2VzcyBBY2NlcHQiIH0sCisgICAgeyBSQURDTURfQUNDRVNTX1JFSiwgIkFjY2VzcyBSZWplY3QiIH0sCisgICAgeyBSQURDTURfQUNDT1VOX1JFUSwgIkFjY291bnRpbmcgUmVxdWVzdCIgfSwKKyAgICB7IFJBRENNRF9BQ0NPVU5fUkVTLCAiQWNjb3VudGluZyBSZXNwb25zZSIgfSwKKyAgICB7IFJBRENNRF9BQ0NFU1NfQ0hBLCAiQWNjZXNzIENoYWxsZW5nZSIgfSwKKyAgICB7IFJBRENNRF9TVEFUVVNfU0VSLCAiU3RhdHVzIFNlcnZlciIgfSwKKyAgICB7IFJBRENNRF9TVEFUVVNfQ0xJLCAiU3RhdHVzIENsaWVudCIgfSwKKyAgICB7IFJBRENNRF9SRVNFUlZFRCwgICAiUmVzZXJ2ZWQiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQmVnaW4gUmFkaXVzIEF0dHJpYnV0ZSB0eXBlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRVJWX1RZUEUgICAgNgorI2RlZmluZSBGUk1fSVBBRERSICAgOAorI2RlZmluZSBMT0dfSVBIT1NUICAxNAorI2RlZmluZSBMT0dfU0VSVklDRSAxNQorI2RlZmluZSBGUk1fSVBYICAgICAyMworI2RlZmluZSBTRVNTSU9OX1RJTUVPVVQgICAyNworI2RlZmluZSBJRExFX1RJTUVPVVQgICAgICAyOAorI2RlZmluZSBGUk1fQVRBTEtfTElOSyAgICAzNworI2RlZmluZSBGUk1fQVRBTEtfTkVUV09SSyAzOAorCisjZGVmaW5lIEFDQ1RfREVMQVkgICAgICAgIDQxCisjZGVmaW5lIEFDQ1RfU0VTU0lPTl9USU1FIDQ2CisKKyNkZWZpbmUgVFVOTkVMX1RZUEUgICAgICAgIDY0CisjZGVmaW5lIFRVTk5FTF9NRURJVU0gICAgICA2NQorI2RlZmluZSBUVU5ORUxfQ0xJRU5UX0VORCAgNjYKKyNkZWZpbmUgVFVOTkVMX1NFUlZFUl9FTkQgIDY3CisjZGVmaW5lIFRVTk5FTF9QQVNTICAgICAgICA2OQorCisjZGVmaW5lIEFSQVBfUEFTUyAgICAgICAgICA3MAorI2RlZmluZSBBUkFQX0ZFQVRVUkVTICAgICAgNzEKKworI2RlZmluZSBUVU5ORUxfUFJJVl9HUk9VUCAgODEKKyNkZWZpbmUgVFVOTkVMX0FTU0lHTl9JRCAgIDgyCisjZGVmaW5lIFRVTk5FTF9QUkVGRVJFTkNFICA4MworCisjZGVmaW5lIEFSQVBfQ0hBTExFTkdFX1JFU1AgODQKKyNkZWZpbmUgQUNDVF9JTlRfSU5URVJWQUwgICA4NQorCisjZGVmaW5lIFRVTk5FTF9DTElFTlRfQVVUSCA5MAorI2RlZmluZSBUVU5ORUxfU0VSVkVSX0FVVEggOTEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEVuZCBSYWRpdXMgQXR0cmlidXRlIHR5cGVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHZvaWQgcHJpbnRfYXR0cl9zdHJpbmcocmVnaXN0ZXIgdV9jaGFyICosIHVfaW50LCB1X3Nob3J0ICk7CitzdGF0aWMgdm9pZCBwcmludF9hdHRyX251bShyZWdpc3RlciB1X2NoYXIgKiwgdV9pbnQsIHVfc2hvcnQgKTsKK3N0YXRpYyB2b2lkIHByaW50X3ZlbmRvcl9hdHRyKHJlZ2lzdGVyIHVfY2hhciAqLCB1X2ludCwgdV9zaG9ydCApOworc3RhdGljIHZvaWQgcHJpbnRfYXR0cl9hZGRyZXNzKHJlZ2lzdGVyIHVfY2hhciAqLCB1X2ludCwgdV9zaG9ydCk7CitzdGF0aWMgdm9pZCBwcmludF9hdHRyX3RpbWUocmVnaXN0ZXIgdV9jaGFyICosIHVfaW50LCB1X3Nob3J0KTsKK3N0YXRpYyB2b2lkIHByaW50X2F0dHJfc3RyYW5nZShyZWdpc3RlciB1X2NoYXIgKiwgdV9pbnQsIHVfc2hvcnQpOworCisKK3N0cnVjdCByYWRpdXNfaGRyIHsgdV9pbnQ4X3QgIGNvZGU7IC8qIFJhZGl1cyBwYWNrZXQgY29kZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgIGlkOyAgIC8qIFJhZGl1cyBwYWNrZXQgaWQgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdV9pbnQxNl90IGxlbjsgIC8qIFJhZGl1cyB0b3RhbCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgIGF1dGhbMTZdOyAvKiBBdXRoZW50aWNhdG9yICAgKi8KKyAgICAgICAgICAgICAgICAgIH07CisKKyNkZWZpbmUgTUlOX1JBRElVU19MRU4JMjAKKworc3RydWN0IHJhZGl1c19hdHRyIHsgdV9pbnQ4X3QgdHlwZTsgLyogQXR0cmlidXRlIHR5cGUgICAqLworICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgbGVuOyAgLyogQXR0cmlidXRlIGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgIH07CisKKworLyogU2VydmljZS1UeXBlIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzZXJ2X3R5cGVbXT17IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2dpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbGJhY2sgTG9naW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbGJhY2sgRnJhbWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk91dGJvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkbWluaXN0cmF0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BUyBQcm9tcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRlIE9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbGJhY2sgTkFTIFByb21wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsIENoZWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxiYWNrIEFkbWluaXN0cmF0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBGcmFtZWQtUHJvdG9jb2wgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmZybV9wcm90b1tdPXsgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUFAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNMSVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFSQVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdhbmRhbGYgcHJvcHJpZXRhcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlh5bG9naWNzIElQWC9TTElQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLjc1IFN5bmNocm9ub3VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBGcmFtZWQtUm91dGluZyBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqZnJtX3JvdXRpbmdbXT17ICJOb25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGlzdGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmQmTGlzdGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIEZyYW1lZC1Db21wcmVzc2lvbiBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqZnJtX2NvbXBbXT17ICJOb25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZKIFRDUC9JUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUFgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhYy1MWlMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyogTG9naW4tU2VydmljZSBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqbG9naW5fc2VydltdPXsgIlRlbG5ldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJsb2dpbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBDbGVhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnRNYXN0ZXIocHJvcHJpZXRhcnkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC4yNS1QQUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLjI1LVQzUE9TIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hc3NpZ25lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDUCBDbGVhciBRdWlldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKworLyogVGVybWluYXRpb24tQWN0aW9uIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICp0ZXJtX2FjdGlvbltdPXsgIkRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkFESVVTLVJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyogTkFTLVBvcnQtVHlwZSBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqbmFzX3BvcnRfdHlwZVtdPXsgIkFzeW5jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3luYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklTRE4gU3luYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklTRE4gQXN5bmMgVi4xMjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU0ROIEFzeW5jIFYuMTEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmlydHVhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJQUZTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSERMQyBDbGVhciBDaGFubmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC4yNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlguNzUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHLjMgRmF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0RTTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFEU0wtQ0FQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQURTTC1ETVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU0ROLURTTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV0aGVybmV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieERTTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2lyZWxlc3MgLSBPdGhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpcmVsZXNzIC0gSUVFRSA4MDIuMTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBBY2N0LVN0YXR1cy1UeXBlIEFjY291bnRpbmcgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFjY3Rfc3RhdHVzW109eyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmltLVVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFzc2lnbmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYXNzaWduZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hc3NpZ25lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NvdW50aW5nLU9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY291bnRpbmctT2ZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1bm5lbC1TdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdW5uZWwtU3RvcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdW5uZWwtUmVqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1bm5lbC1MaW5rLVN0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1bm5lbC1MaW5rLVN0b3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHVubmVsLUxpbmstUmVqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBBY2N0LUF1dGhlbnRpYyBBY2NvdW50aW5nIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphY2N0X2F1dGhbXT17IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkFESVVTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBBY2N0LVRlcm1pbmF0ZS1DYXVzZSBBY2NvdW50aW5nIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphY2N0X3Rlcm1bXT17IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlciBSZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3N0IENhcnJpZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvc3QgU2VydmljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWRsZSBUaW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXNzaW9uIFRpbWVvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkbWluIFJlc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZG1pbiBSZWJvb3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnQgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BUyBFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkFTIFJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BUyBSZWJvb3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnQgVW5uZWVkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcnQgUHJlZW1wdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IFN1c3BlbmRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBVbmF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvc3QgUmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyogVHVubmVsLVR5cGUgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnR1bm5lbF90eXBlW109eyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFBUUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMMkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTDJUUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBVE1QIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZUUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUC1JUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNSU4tSVAtSVAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRVNQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEVlMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVAtaW4tSVAgVHVubmVsaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIFR1bm5lbC1NZWRpdW0tVHlwZSBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqdHVubmVsX21lZGl1bVtdPXsgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVB2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQdjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOU0FQIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSERMQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJCTiAxODIyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS4xNjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLjE2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYuNjkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLjEyMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQWCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcGxldGFsayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY25ldCBJViIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhbnlhbiBWaW5lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuMTY0IHdpdGggTlNBUCBzdWJhZGRyZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyogQVJBUC1ab25lLUFjY2VzcyBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCitzdGF0aWMgY29uc3QgY2hhciAqYXJhcF96b25lW109eyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgYWNjZXNzIHRvIGRmbCB6b25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugem9uZSBmaWx0ZXIgaW5jLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IHVzZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSB6b25lIGZpbHRlciBleGMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCitzdGF0aWMgY29uc3QgY2hhciAqcHJvbXB0W109eyAiTm8gRWNobyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWNobyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCitzdHJ1Y3QgYXR0cnR5cGUgeyBjb25zdCBjaGFyICpuYW1lOyAgICAgIC8qIEF0dHJpYnV0ZSBuYW1lICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnN1YnR5cGVzOyAvKiBTdGFuZGFyZCBWYWx1ZXMgKGlmIGFueSkgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgIHVfY2hhciBzaXpfc3VidHlwZXM7ICAgLyogU2l6ZSBvZiB0b3RhbCBzdGFuZGFyZCB2YWx1ZXMgICovCisgICAgICAgICAgICAgICAgICB1X2NoYXIgZmlyc3Rfc3VidHlwZTsgIC8qIEZpcnN0IHN0YW5kYXJkIHZhbHVlIGlzIDAgb3IgMSAqLworICAgICAgICAgICAgICAgICAgdm9pZCAoKnByaW50X2Z1bmMpKHJlZ2lzdGVyIHVfY2hhciAqLCB1X2ludCwgdV9zaG9ydCApOworICAgICAgICAgICAgICAgIH0gYXR0cl90eXBlW109CisgIHsKKyAgICAgeyBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgICAgICAgICAgICAgICB9LAorICAgICB7ICJVc2VybmFtZSIsICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgIH0sCisgICAgIHsgIlBhc3N3b3JkIiwgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMICAgICAgICAgICAgICAgfSwKKyAgICAgeyAiQ0hBUCBQYXNzd29yZCIsICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgICAgICAgICAgICAgICB9LAorICAgICB7ICJOQVMgSVAgQWRkcmVzcyIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9hZGRyZXNzIH0sCisgICAgIHsgIk5BUyBQb3J0IiwgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICAgfSwKKyAgICAgeyAiU2VydmljZSBUeXBlIiwgICAgICAgICAgICAgICAgICAgIHNlcnZfdHlwZSwgVEFNX1NJWkUoc2Vydl90eXBlKS0xLCAxLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJGcmFtZWQgUHJvdG9jb2wiLCAgICAgICAgICAgICAgICAgZnJtX3Byb3RvLCBUQU1fU0laRShmcm1fcHJvdG8pLTEsIDEsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIkZyYW1lZCBJUCBBZGRyZXNzIiwgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX2FkZHJlc3MgfSwKKyAgICAgeyAiRnJhbWVkIElQIE5ldHdvcmsiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfYWRkcmVzcyB9LAorICAgICB7ICJGcmFtZWQgUm91dGluZyIsICAgICAgICAgICAgICAgICAgZnJtX3JvdXRpbmcsIFRBTV9TSVpFKGZybV9yb3V0aW5nKSwgMCwgcHJpbnRfYXR0cl9udW0gfSwKKyAgICAgeyAiRmlsdGVyIElEIiwgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICB9LAorICAgICB7ICJGcmFtZWQgTVRVIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgIH0sCisgICAgIHsgIkZyYW1lZCBDb21wcmVzc2lvbiIsICAgICAgICAgICAgICBmcm1fY29tcCwgVEFNX1NJWkUoZnJtX2NvbXApLCAgIDAsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIkxvZ2luIElQIEhvc3QiLCAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX2FkZHJlc3MgfSwKKyAgICAgeyAiTG9naW4gU2VydmljZSIsICAgICAgICAgICAgICAgICAgIGxvZ2luX3NlcnYsIFRBTV9TSVpFKGxvZ2luX3NlcnYpLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJMb2dpbiBUQ1AgUG9ydCIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgIH0sCisgICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sIC8qMTcqLworICAgICB7ICJSZXBseSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQ2FsbGJhY2stbnVtYmVyIiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIkNhbGxiYWNrLUlEIiwgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJVbmFzc2lnbmVkIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCB9LCAvKjIxKi8KKyAgICAgeyAiRnJhbWVkIFJvdXRlIiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIkZyYW1lZCBJUFggTmV0d29yayIsICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAorICAgICB7ICJTdGF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQ2xhc3MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIlZlbmRvciBTcGVjaWZpYyIsICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF92ZW5kb3JfYXR0ciB9LAorICAgICB7ICJTZXNzaW9uIFRpbWVvdXQiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKKyAgICAgeyAiSWRsZSBUaW1lb3V0IiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCisgICAgIHsgIlRlcm1pbmF0aW9uIEFjdGlvbiIsICAgICAgICAgICAgICB0ZXJtX2FjdGlvbiwgVEFNX1NJWkUodGVybV9hY3Rpb24pLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJDYWxsZWQgU3RhdGlvbiIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQ2FsbGluZyBTdGF0aW9uIiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIk5BUyBJRCIsICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJQcm94eSBTdGF0ZSIsICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiTG9naW4gTEFUIFNlcnZpY2UiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIkxvZ2luIExBVCBOb2RlIiwgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJMb2dpbiBMQVQgR3JvdXAiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiRnJhbWVkIEFwcGxldGFsayBMaW5rIiwgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCisgICAgIHsgIkZyYW1lZCBBcHBsdGFsayBOZXQiLCAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAorICAgICB7ICJGcmFtZWQgQXBwbGV0YWxrIFpvbmUiLCAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQWNjb3VudGluZyBTdGF0dXMiLCAgICAgICAgICAgICAgIGFjY3Rfc3RhdHVzLCBUQU1fU0laRShhY2N0X3N0YXR1cyktMSwgMSwgcHJpbnRfYXR0cl9udW0gfSwKKyAgICAgeyAiQWNjb3VudGluZyBEZWxheSIsICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCisgICAgIHsgIkFjY291bnRpbmcgSW5wdXQgT2N0ZXRzIiwgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAorICAgICB7ICJBY2NvdW50aW5nIE91dHB1dCBPY3RldHMiLCAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKKyAgICAgeyAiQWNjb3VudGluZyBTZXNzaW9uIElEIiwgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIkFjY291bnRpbmcgQXV0aGVudGljYXRpb24iLCAgICAgICBhY2N0X2F1dGgsIFRBTV9TSVpFKGFjY3RfYXV0aCktMSwgMSwgcHJpbnRfYXR0cl9udW0gfSwKKyAgICAgeyAiQWNjb3VudGluZyBTZXNzaW9uIFRpbWUiLCAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIkFjY291bnRpbmcgSW5wdXQgUGFja2V0cyIsICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJBY2NvdW50aW5nIE91dHB1dCBQYWNrZXRzIiwgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwKKyAgICAgeyAiQWNjb3VudGluZyBUZXJtaW5hdGlvbiBDYXVzZSIsICAgIGFjY3RfdGVybSwgVEFNX1NJWkUoYWNjdF90ZXJtKS0xLCAxLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJBY2NvdW50aW5nIE11bHRpbGluayBTZXNzaW9uIElEIiwgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQWNjb3VudGluZyBMaW5rIENvdW50IiwgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIkFjY291bnRpbmcgSW5wdXQgR2lnYSIsICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJBY2NvdW50aW5nIE91dHB1dCBHaWdhIiwgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwKKyAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyo1NCovCisgICAgIHsgIkV2ZW50IFRpbWVzdGFtcCIsICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3RpbWUgfSwKKyAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyo1NiovCisgICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sIC8qNTcqLworICAgICB7ICJVbmFzc2lnbmVkIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCB9LCAvKjU4Ki8KKyAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyo1OSovCisgICAgIHsgIkNIQVAgY2hhbGxlbmdlIiwgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJOQVMgUG9ydCBUeXBlIiwgICAgICAgICAgICAgICAgICAgbmFzX3BvcnRfdHlwZSwgVEFNX1NJWkUobmFzX3BvcnRfdHlwZSksIDAsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIlBvcnQgTGltaXQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJMb2dpbiBMQVQgUG9ydCIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwgLyo2MyovCisgICAgIHsgIlR1bm5lbCBUeXBlIiwgICAgICAgICAgICAgICAgICAgICB0dW5uZWxfdHlwZSwgVEFNX1NJWkUodHVubmVsX3R5cGUpLTEsIDEsIHByaW50X2F0dHJfbnVtIH0sCisgICAgIHsgIlR1bm5lbCBNZWRpdW0iLCAgICAgICAgICAgICAgICAgICB0dW5uZWxfbWVkaXVtLCBUQU1fU0laRSh0dW5uZWxfbWVkaXVtKS0xLCAxLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJUdW5uZWwgQ2xpZW50IEVuZCIsICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiVHVubmVsIFNlcnZlciBFbmQiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIkFjY291bnRpbmcgVHVubmVsIGNvbm5lY3QiLCAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJUdW5uZWwgUGFzc3dvcmQiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgIH0sCisgICAgIHsgIkFSQVAgUGFzc3dvcmQiLCAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmFuZ2UgfSwKKyAgICAgeyAiQVJBUCBGZWF0dXJlIiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyYW5nZSB9LAorICAgICB7ICJBUkFQIFpvbmUgQWNjZXMiLCAgICAgICAgICAgICAgICAgYXJhcF96b25lLCBUQU1fU0laRShhcmFwX3pvbmUpLTEsIDEsIHByaW50X2F0dHJfbnVtIH0sIC8qNzIqLworICAgICB7ICJBUkFQIFNlY3VyaXR5IiwgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiQVJBUCBTZWN1cml0eSBEYXRhIiwgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIlBhc3N3b3JkIFJldHJ5IiwgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAorICAgICB7ICJQcm9tcHQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0LCBUQU1fU0laRShwcm9tcHQpLCAwLCBwcmludF9hdHRyX251bSB9LAorICAgICB7ICJDb25uZWN0IEluZm8iLCAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgICB9LAorICAgICB7ICJDb25maWcgVG9rZW4iLCAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgICB9LAorICAgICB7ICJFQVAgTWVzc2FnZSIsICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgICB9LAorICAgICB7ICJNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIiwgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwgLyo4MCovCisgICAgIHsgIlR1bm5lbCBQcml2YXRlIEdyb3VwIiwgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJUdW5uZWwgQXNzaWduZWQgSUQiLCAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiVHVubmVsIFByZWZlcmVuY2UiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCisgICAgIHsgIkFSQVAgQ2hhbGxlbmdlIFJlc3BvbnNlIiwgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmFuZ2UgfSwKKyAgICAgeyAiQWNjb3VudGluZyBJbnRlcmltIEludGVydmFsIiwgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgICB9LAorICAgICB7ICJBY2NvdW50aW5nIFR1bm5lbCBwYWNrZXRzIGxvc3QiLCAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwgLyo4NiovCisgICAgIHsgIk5BUyBQb3J0IElEIiwgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJGcmFtZWQgUG9vbCIsICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKKyAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwKKyAgICAgeyAiVHVubmVsIENsaWVudCBBdXRoZW50aWNhdGlvbiBJRCIsIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCisgICAgIHsgIlR1bm5lbCBTZXJ2ZXIgQXV0aGVudGljYXRpb24gSUQiLCBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAorICAgICB7ICJVbmFzc2lnbmVkIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCB9LCAvKjkyKi8KKyAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSAgLyo5MyovCisgIH07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUHJpbnQgYW4gYXR0cmlidXRlIHN0cmluZyAqLworLyogdmFsdWUgcG9pbnRlZCBieSAnZGF0YScgICAqLworLyogYW5kICdsZW5ndGgnIHNpemUuICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUmV0dXJucyBub3RoaW5nLiAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3ByaW50X2F0dHJfc3RyaW5nKHJlZ2lzdGVyIHVfY2hhciAqZGF0YSwgdV9pbnQgbGVuZ3RoLCB1X3Nob3J0IGF0dHJfY29kZSApCit7CisgICByZWdpc3RlciB1X2ludCBpOworCisgICBUQ0hFQ0syKGRhdGFbMF0sbGVuZ3RoKTsKKworICAgc3dpdGNoKGF0dHJfY29kZSkKKyAgIHsKKyAgICAgIGNhc2UgVFVOTkVMX1BBU1M6CisgICAgICAgICAgIGlmIChsZW5ndGggPCAzKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIHByaW50ZigiIFt8cmFkaXVzXSIpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaWYgKCpkYXRhICYmICgqZGF0YSA8PTB4MUYpICkKKyAgICAgICAgICAgICAgcHJpbnRmKCJUYWcgJXUsICIsKmRhdGEpOworICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICBwcmludGYoIlNhbHQgJXUgIixFWFRSQUNUXzE2QklUUyhkYXRhKSApOworICAgICAgICAgICBkYXRhKz0yOworICAgICAgICAgICBsZW5ndGgtPTI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUVU5ORUxfQ0xJRU5UX0VORDoKKyAgICAgIGNhc2UgVFVOTkVMX1NFUlZFUl9FTkQ6CisgICAgICBjYXNlIFRVTk5FTF9QUklWX0dST1VQOgorICAgICAgY2FzZSBUVU5ORUxfQVNTSUdOX0lEOgorICAgICAgY2FzZSBUVU5ORUxfQ0xJRU5UX0FVVEg6CisgICAgICBjYXNlIFRVTk5FTF9TRVJWRVJfQVVUSDoKKyAgICAgICAgICAgaWYgKCpkYXRhIDw9IDB4MUYpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDEpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgcHJpbnRmKCIgW3xyYWRpdXNdIik7CisgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBwcmludGYoIlRhZyAldSIsKmRhdGEpOworICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICAgIGxlbmd0aC0tOworICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgfQorCisgICBmb3IgKGk9MDsgKmRhdGEgJiYgaSA8IGxlbmd0aCA7IGkrKywgZGF0YSsrKQorICAgICAgIHByaW50ZigiJWMiLCgqZGF0YSA8IDMyIHx8ICpkYXRhID4gMTI4KSA/ICcuJyA6ICpkYXRhICk7CisKKyAgIHJldHVybjsKKworICAgdHJ1bmM6CisgICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKK30KKworLyoKKyAqIHByaW50IHZlbmRvciBzcGVjaWZpYyBhdHRyaWJ1dGVzCisgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X3ZlbmRvcl9hdHRyKHJlZ2lzdGVyIHVfY2hhciAqZGF0YSwgdV9pbnQgbGVuZ3RoLCB1X3Nob3J0IGF0dHJfY29kZSBfVV8pCit7CisgICAgdV9pbnQgaWR4OworICAgIHVfaW50IHZlbmRvcl9pZDsKKyAgICB1X2ludCB2ZW5kb3JfdHlwZTsKKyAgICB1X2ludCB2ZW5kb3JfbGVuZ3RoOworCisgICAgaWYgKGxlbmd0aCA8IDQpCisgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgVENIRUNLMigqZGF0YSwgNCk7CisgICAgdmVuZG9yX2lkID0gRVhUUkFDVF8zMkJJVFMoZGF0YSk7CisgICAgZGF0YSs9NDsKKyAgICBsZW5ndGgtPTQ7CisKKyAgICBwcmludGYoIlZlbmRvcjogJXMgKCV1KSIsCisgICAgICAgICAgIHRvazJzdHIoc21pX3ZhbHVlcywiVW5rbm93biIsdmVuZG9yX2lkKSwKKyAgICAgICAgICAgdmVuZG9yX2lkKTsKKworICAgIHdoaWxlIChsZW5ndGggPj0gMikgeworCVRDSEVDSzIoKmRhdGEsIDIpOworCisgICAgICAgIHZlbmRvcl90eXBlID0gKihkYXRhKTsKKyAgICAgICAgdmVuZG9yX2xlbmd0aCA9ICooZGF0YSsxKTsKKworICAgICAgICBpZiAodmVuZG9yX2xlbmd0aCA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBWZW5kb3IgQXR0cmlidXRlOiAldSwgTGVuZ3RoOiAldSAoYm9ndXMsIG11c3QgYmUgPj0gMikiLAorICAgICAgICAgICAgICAgICAgIHZlbmRvcl90eXBlLAorICAgICAgICAgICAgICAgICAgIHZlbmRvcl9sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2ZW5kb3JfbGVuZ3RoID4gbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgVmVuZG9yIEF0dHJpYnV0ZTogJXUsIExlbmd0aDogJXUgKGJvZ3VzLCBnb2VzIHBhc3QgZW5kIG9mIHZlbmRvci1zcGVjaWZpYyBhdHRyaWJ1dGUpIiwKKyAgICAgICAgICAgICAgICAgICB2ZW5kb3JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICB2ZW5kb3JfbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBkYXRhKz0yOworICAgICAgICB2ZW5kb3JfbGVuZ3RoLT0yOworICAgICAgICBsZW5ndGgtPTI7CisJVENIRUNLMigqZGF0YSwgdmVuZG9yX2xlbmd0aCk7CisKKyAgICAgICAgcHJpbnRmKCJcblx0ICAgIFZlbmRvciBBdHRyaWJ1dGU6ICV1LCBMZW5ndGg6ICV1LCBWYWx1ZTogIiwKKyAgICAgICAgICAgICAgIHZlbmRvcl90eXBlLAorICAgICAgICAgICAgICAgdmVuZG9yX2xlbmd0aCk7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmVuZG9yX2xlbmd0aCA7IGlkeCsrLCBkYXRhKyspCisgICAgICAgICAgICBwcmludGYoIiVjIiwoKmRhdGEgPCAzMiB8fCAqZGF0YSA+IDEyOCkgPyAnLicgOiAqZGF0YSApOworICAgICAgICBsZW5ndGgtPXZlbmRvcl9sZW5ndGg7CisgICAgfQorICAgIHJldHVybjsKKworICAgdHJ1bmM6CisgICAgIHByaW50ZigiIFt8cmFkaXVzXSIpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaW50IGFuIGF0dHJpYnV0ZSBudW1lcmljICovCisvKiB2YWx1ZSBwb2ludGVkIGJ5ICdkYXRhJyAgICAqLworLyogYW5kICdsZW5ndGgnIHNpemUuICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZXR1cm5zIG5vdGhpbmcuICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwcmludF9hdHRyX251bShyZWdpc3RlciB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCwgdV9zaG9ydCBhdHRyX2NvZGUgKQoreworICAgdV9pbnQ4X3QgdGFnOworICAgdV9pbnQzMl90IHRpbWVvdXQ7CisKKyAgIGlmIChsZW5ndGggIT0gNCkKKyAgIHsKKyAgICAgICBwcmludGYoIkVSUk9SOiBsZW5ndGggJXUgIT0gNCIsIGxlbmd0aCk7CisgICAgICAgcmV0dXJuOworICAgfQorCisgICBUQ0hFQ0syKGRhdGFbMF0sNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYXR0cmlidXRlIGhhcyBzdGFuZGFyZCB2YWx1ZXMgKi8KKyAgIGlmIChhdHRyX3R5cGVbYXR0cl9jb2RlXS5zaXpfc3VidHlwZXMpCisgICB7CisgICAgICBzdGF0aWMgY29uc3QgY2hhciAqKnRhYmxlOworICAgICAgdV9pbnQzMl90IGRhdGFfdmFsdWU7CisgICAgICB0YWJsZSA9IGF0dHJfdHlwZVthdHRyX2NvZGVdLnN1YnR5cGVzOworCisgICAgICBpZiAoIChhdHRyX2NvZGUgPT0gVFVOTkVMX1RZUEUpIHx8IChhdHRyX2NvZGUgPT0gVFVOTkVMX01FRElVTSkgKQorICAgICAgeworICAgICAgICAgaWYgKCEqZGF0YSkKKyAgICAgICAgICAgIHByaW50ZigiVGFnW1VudXNlZF0iKTsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiVGFnWyVkXSIsICpkYXRhKTsKKyAgICAgICAgIGRhdGErKzsKKyAgICAgICAgIGRhdGFfdmFsdWUgPSBFWFRSQUNUXzI0QklUUyhkYXRhKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGRhdGFfdmFsdWUgPSBFWFRSQUNUXzMyQklUUyhkYXRhKTsKKyAgICAgIH0KKyAgICAgIGlmICggZGF0YV92YWx1ZSA8PSAodV9pbnQzMl90KShhdHRyX3R5cGVbYXR0cl9jb2RlXS5zaXpfc3VidHlwZXMgLSAxICsKKyAgICAgICAgICAgIGF0dHJfdHlwZVthdHRyX2NvZGVdLmZpcnN0X3N1YnR5cGUpICYmCisJICAgZGF0YV92YWx1ZSA+PSBhdHRyX3R5cGVbYXR0cl9jb2RlXS5maXJzdF9zdWJ0eXBlICkKKyAgICAgICAgIHByaW50ZigiJXMiLHRhYmxlW2RhdGFfdmFsdWVdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgIHByaW50ZigiIyV1IixkYXRhX3ZhbHVlKTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHN3aXRjaChhdHRyX2NvZGUpIC8qIEJlIGF3YXJlIG9mIHNwZWNpYWwgY2FzZXMuLi4gKi8KKyAgICAgIHsKKyAgICAgICAgY2FzZSBGUk1fSVBYOgorICAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyggZGF0YSkgPT0gMHhGRkZGRkZGRSApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJOQVMgU2VsZWN0Iik7CisgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLEVYVFJBQ1RfMzJCSVRTKCBkYXRhKSApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0VTU0lPTl9USU1FT1VUOgorICAgICAgICBjYXNlIElETEVfVElNRU9VVDoKKyAgICAgICAgY2FzZSBBQ0NUX0RFTEFZOgorICAgICAgICBjYXNlIEFDQ1RfU0VTU0lPTl9USU1FOgorICAgICAgICBjYXNlIEFDQ1RfSU5UX0lOVEVSVkFMOgorICAgICAgICAgICAgIHRpbWVvdXQgPSBFWFRSQUNUXzMyQklUUyggZGF0YSk7CisgICAgICAgICAgICAgaWYgKCB0aW1lb3V0IDwgNjAgKQorICAgICAgICAgICAgICAgIHByaW50ZiggIiUwMmQgc2VjcyIsIHRpbWVvdXQpOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCB0aW1lb3V0IDwgMzYwMCApCisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJTAyZDolMDJkIG1pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgLyA2MCwgdGltZW91dCAlIDYwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJTAyZDolMDJkOiUwMmQgaG91cnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IC8gMzYwMCwgKHRpbWVvdXQgJSAzNjAwKSAvIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ICUgNjApOworICAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEZSTV9BVEFMS19MSU5LOgorICAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyhkYXRhKSApCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsRVhUUkFDVF8zMkJJVFMoZGF0YSkgKTsKKyAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbm51bWJlcmVkIiApOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRlJNX0FUQUxLX05FVFdPUks6CisgICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMzJCSVRTKGRhdGEpICkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkIixFWFRSQUNUXzMyQklUUyhkYXRhKSApOworICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIk5BUyBhc3NpZ25lZCIgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRVTk5FTF9QUkVGRVJFTkNFOgorICAgICAgICAgICAgdGFnID0gKmRhdGE7CisgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICBpZiAodGFnID09IDApCisgICAgICAgICAgICAgICBwcmludGYoIlRhZyAoVW51c2VkKSAlZCIsRVhUUkFDVF8yNEJJVFMoZGF0YSkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIHByaW50ZigiVGFnICglZCkgJWQiLCB0YWcsIEVYVFJBQ1RfMjRCSVRTKGRhdGEpICk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICBwcmludGYoIiVkIixFWFRSQUNUXzMyQklUUyggZGF0YSkgKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgfSAvKiBzd2l0Y2ggKi8KKworICAgfSAvKiBpZi1lbHNlICovCisKKyAgIHJldHVybjsKKworICAgdHJ1bmM6CisgICAgIHByaW50ZigiIFt8cmFkaXVzXSIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaW50IGFuIGF0dHJpYnV0ZSBJUHY0ICAgKi8KKy8qIGFkZHJlc3MgdmFsdWUgcG9pbnRlZCBieSAgKi8KKy8qICdkYXRhJyBhbmQgJ2xlbmd0aCcgc2l6ZS4gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJldHVybnMgbm90aGluZy4gICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitwcmludF9hdHRyX2FkZHJlc3MocmVnaXN0ZXIgdV9jaGFyICpkYXRhLCB1X2ludCBsZW5ndGgsIHVfc2hvcnQgYXR0cl9jb2RlICkKK3sKKyAgIGlmIChsZW5ndGggIT0gNCkKKyAgIHsKKyAgICAgICBwcmludGYoIkVSUk9SOiBsZW5ndGggJXUgIT0gNCIsIGxlbmd0aCk7CisgICAgICAgcmV0dXJuOworICAgfQorCisgICBUQ0hFQ0syKGRhdGFbMF0sNCk7CisKKyAgIHN3aXRjaChhdHRyX2NvZGUpCisgICB7CisgICAgICBjYXNlIEZSTV9JUEFERFI6CisgICAgICBjYXNlIExPR19JUEhPU1Q6CisgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyhkYXRhKSA9PSAweEZGRkZGRkZGICkKKyAgICAgICAgICAgICAgcHJpbnRmKCJVc2VyIFNlbGVjdGVkIik7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMzJCSVRTKGRhdGEpID09IDB4RkZGRkZGRkUgKQorICAgICAgICAgICAgICAgICBwcmludGYoIk5BUyBTZWxlY3QiKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICBwcmludGYoIiVzIixpcGFkZHJfc3RyaW5nKGRhdGEpKTsKKyAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICAgIHByaW50ZigiJXMiLGlwYWRkcl9zdHJpbmcoZGF0YSkgKTsKKyAgICAgIGJyZWFrOworICAgfQorCisgICByZXR1cm47CisKKyAgIHRydW5jOgorICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaW50IGFuIGF0dHJpYnV0ZSBvZiAnc2VjcyBzaW5jZSAqLworLyogSmFudWFyeSAxLCAxOTcwIDAwOjAwIFVUQycgdmFsdWUgICovCisvKiBwb2ludGVkIGJ5ICdkYXRhJyBhbmQgJ2xlbmd0aCcgICAgKi8KKy8qIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBSZXR1cm5zIG5vdGhpbmcuICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgcHJpbnRfYXR0cl90aW1lKHJlZ2lzdGVyIHVfY2hhciAqZGF0YSwgdV9pbnQgbGVuZ3RoLCB1X3Nob3J0IGF0dHJfY29kZSBfVV8pCit7CisgICB0aW1lX3QgYXR0cl90aW1lOworICAgY2hhciBzdHJpbmdbMjZdOworCisgICBpZiAobGVuZ3RoICE9IDQpCisgICB7CisgICAgICAgcHJpbnRmKCJFUlJPUjogbGVuZ3RoICV1ICE9IDQiLCBsZW5ndGgpOworICAgICAgIHJldHVybjsKKyAgIH0KKworICAgVENIRUNLMihkYXRhWzBdLDQpOworCisgICBhdHRyX3RpbWUgPSBFWFRSQUNUXzMyQklUUyhkYXRhKTsKKyAgIHN0cmxjcHkoc3RyaW5nLCBjdGltZSgmYXR0cl90aW1lKSwgc2l6ZW9mKHN0cmluZykpOworICAgLyogR2V0IHJpZCBvZiB0aGUgbmV3bGluZSAqLworICAgc3RyaW5nWzI0XSA9ICdcMCc7CisgICBwcmludGYoIiUuMjRzIiwgc3RyaW5nKTsKKyAgIHJldHVybjsKKworICAgdHJ1bmM6CisgICAgIHByaW50ZigiIFt8cmFkaXVzXSIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFByaW50IGFuIGF0dHJpYnV0ZSBvZiAnc3RyYW5nZScgKi8KKy8qIGRhdGEgZm9ybWF0IHBvaW50ZWQgYnkgJ2RhdGEnICAgKi8KKy8qIGFuZCAnbGVuZ3RoJyBzaXplLiAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJldHVybnMgbm90aGluZy4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHByaW50X2F0dHJfc3RyYW5nZShyZWdpc3RlciB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCwgdV9zaG9ydCBhdHRyX2NvZGUpCit7CisgICB1X3Nob3J0IGxlbl9kYXRhOworCisgICBzd2l0Y2goYXR0cl9jb2RlKQorICAgeworICAgICAgY2FzZSBBUkFQX1BBU1M6CisgICAgICAgICAgIGlmIChsZW5ndGggIT0gMTYpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGxlbmd0aCAldSAhPSAxNiIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcHJpbnRmKCJVc2VyX2NoYWxsZW5nZSAoIik7CisgICAgICAgICAgIFRDSEVDSzIoZGF0YVswXSw4KTsKKyAgICAgICAgICAgbGVuX2RhdGEgPSA4OworICAgICAgICAgICBQUklOVF9IRVgobGVuX2RhdGEsIGRhdGEpOworICAgICAgICAgICBwcmludGYoIikgVXNlcl9yZXNwKCIpOworICAgICAgICAgICBUQ0hFQ0syKGRhdGFbMF0sOCk7CisgICAgICAgICAgIGxlbl9kYXRhID0gODsKKyAgICAgICAgICAgUFJJTlRfSEVYKGxlbl9kYXRhLCBkYXRhKTsKKyAgICAgICAgICAgcHJpbnRmKCIpIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEFSQVBfRkVBVFVSRVM6CisgICAgICAgICAgIGlmIChsZW5ndGggIT0gMTQpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGxlbmd0aCAldSAhPSAxNCIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgIH0KKyAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDEpOworICAgICAgICAgICBpZiAoKmRhdGEpCisgICAgICAgICAgICAgIHByaW50ZigiVXNlciBjYW4gY2hhbmdlIHBhc3N3b3JkIik7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcHJpbnRmKCJVc2VyIGNhbm5vdCBjaGFuZ2UgcGFzc3dvcmQiKTsKKyAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICBUQ0hFQ0syKGRhdGFbMF0sMSk7CisgICAgICAgICAgIHByaW50ZigiLCBNaW4gcGFzc3dvcmQgbGVuZ3RoOiAlZCIsKmRhdGEpOworICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgIHByaW50ZigiLCBjcmVhdGVkIGF0OiAiKTsKKyAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDQpOworICAgICAgICAgICBsZW5fZGF0YSA9IDQ7CisgICAgICAgICAgIFBSSU5UX0hFWChsZW5fZGF0YSwgZGF0YSk7CisgICAgICAgICAgIHByaW50ZigiLCBleHBpcmVzIGluOiAiKTsKKyAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDQpOworICAgICAgICAgICBsZW5fZGF0YSA9IDQ7CisgICAgICAgICAgIFBSSU5UX0hFWChsZW5fZGF0YSwgZGF0YSk7CisgICAgICAgICAgIHByaW50ZigiLCBDdXJyZW50IFRpbWU6ICIpOworICAgICAgICAgICBUQ0hFQ0syKGRhdGFbMF0sNCk7CisgICAgICAgICAgIGxlbl9kYXRhID0gNDsKKyAgICAgICAgICAgUFJJTlRfSEVYKGxlbl9kYXRhLCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQVJBUF9DSEFMTEVOR0VfUkVTUDoKKyAgICAgICAgICAgaWYgKGxlbmd0aCA8IDgpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGxlbmd0aCAldSAhPSA4IiwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgfQorICAgICAgICAgICBUQ0hFQ0syKGRhdGFbMF0sOCk7CisgICAgICAgICAgIGxlbl9kYXRhID0gODsKKyAgICAgICAgICAgUFJJTlRfSEVYKGxlbl9kYXRhLCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICB9CisgICByZXR1cm47CisKKyAgIHRydW5jOgorICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKK30KKworCisKK3N0YXRpYyB2b2lkCityYWRpdXNfYXR0cnNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICphdHRyLCB1X2ludCBsZW5ndGgpCit7CisgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmFkaXVzX2F0dHIgKnJhZF9hdHRyID0gKHN0cnVjdCByYWRpdXNfYXR0ciAqKWF0dHI7CisgICBjb25zdCBjaGFyICphdHRyX3N0cmluZzsKKworICAgd2hpbGUgKGxlbmd0aCA+IDApCisgICB7CisgICAgIGlmIChsZW5ndGggPCAyKQorICAgICAgICBnb3RvIHRydW5jOworICAgICBUQ0hFQ0soKnJhZF9hdHRyKTsKKyAgICAgCisgICAgIGlmIChyYWRfYXR0ci0+dHlwZSA+IDAgJiYgcmFkX2F0dHItPnR5cGUgPCBUQU1fU0laRShhdHRyX3R5cGUpKQorCWF0dHJfc3RyaW5nID0gYXR0cl90eXBlW3JhZF9hdHRyLT50eXBlXS5uYW1lOworICAgICBlbHNlCisJYXR0cl9zdHJpbmcgPSAiVW5rbm93biI7CisgICAgIGlmIChyYWRfYXR0ci0+bGVuIDwgMikKKyAgICAgeworCXByaW50ZigiXG5cdCAgJXMgQXR0cmlidXRlICgldSksIGxlbmd0aDogJXUgKGJvZ3VzLCBtdXN0IGJlID49IDIpIiwKKyAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nLAorICAgICAgICAgICAgICAgcmFkX2F0dHItPnR5cGUsCisgICAgICAgICAgICAgICByYWRfYXR0ci0+bGVuKTsKKwlyZXR1cm47CisgICAgIH0KKyAgICAgaWYgKHJhZF9hdHRyLT5sZW4gPiBsZW5ndGgpCisgICAgIHsKKwlwcmludGYoIlxuXHQgICVzIEF0dHJpYnV0ZSAoJXUpLCBsZW5ndGg6ICV1IChib2d1cywgZ29lcyBwYXN0IGVuZCBvZiBwYWNrZXQpIiwKKyAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nLAorICAgICAgICAgICAgICAgcmFkX2F0dHItPnR5cGUsCisgICAgICAgICAgICAgICByYWRfYXR0ci0+bGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIHByaW50ZigiXG5cdCAgJXMgQXR0cmlidXRlICgldSksIGxlbmd0aDogJXUsIFZhbHVlOiAiLAorICAgICAgICAgICAgYXR0cl9zdHJpbmcsCisgICAgICAgICAgICByYWRfYXR0ci0+dHlwZSwKKyAgICAgICAgICAgIHJhZF9hdHRyLT5sZW4pOworCisgICAgIGlmIChyYWRfYXR0ci0+dHlwZSA8IFRBTV9TSVpFKGF0dHJfdHlwZSkpCisgICAgIHsKKyAgICAgICAgIGlmIChyYWRfYXR0ci0+bGVuID4gMikKKyAgICAgICAgIHsKKyAgICAgICAgICAgICBpZiAoIGF0dHJfdHlwZVtyYWRfYXR0ci0+dHlwZV0ucHJpbnRfZnVuYyApCisgICAgICAgICAgICAgICAgICgqYXR0cl90eXBlW3JhZF9hdHRyLT50eXBlXS5wcmludF9mdW5jKSgKKyAgICAgICAgICAgICAgICAgICAgICgodV9jaGFyICopKHJhZF9hdHRyKzEpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJhZF9hdHRyLT5sZW4gLSAyLCByYWRfYXR0ci0+dHlwZSk7CisgICAgICAgICB9CisgICAgIH0KKyAgICAgLyogZG8gd2UgYWxzbyB3YW50IHRvIHNlZSBhIGhleCBkdW1wID8gKi8KKyAgICAgaWYgKHZmbGFnPiAxKQorICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCh1X2NoYXIgKilyYWRfYXR0cisyLCJcblx0ICAgICIsKHJhZF9hdHRyLT5sZW4pLTIpOworCisgICAgIGxlbmd0aC09KHJhZF9hdHRyLT5sZW4pOworICAgICByYWRfYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHIgKikoICgoY2hhciAqKShyYWRfYXR0cikpK3JhZF9hdHRyLT5sZW4pOworICAgfQorICAgcmV0dXJuOworCit0cnVuYzoKKyAgIHByaW50ZigiIFt8cmFkaXVzXSIpOworfQorCisKK3ZvaWQKK3JhZGl1c19wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQoreworICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJhZGl1c19oZHIgKnJhZDsKKyAgIHVfaW50IGxlbiwgYXV0aF9pZHg7CisKKyAgIFRDSEVDSzIoKmRhdCwgTUlOX1JBRElVU19MRU4pOworICAgcmFkID0gKHN0cnVjdCByYWRpdXNfaGRyICopZGF0OworICAgbGVuID0gRVhUUkFDVF8xNkJJVFMoJnJhZC0+bGVuKTsKKworICAgaWYgKGxlbiA8IE1JTl9SQURJVVNfTEVOKQorICAgeworCSAgcHJpbnRmKCIgW3xyYWRpdXNdIik7CisJICByZXR1cm47CisgICB9CisKKyAgIGlmIChsZW4gPiBsZW5ndGgpCisJICBsZW4gPSBsZW5ndGg7CisKKyAgIGlmICh2ZmxhZyA8IDEpIHsKKyAgICAgICBwcmludGYoIlJBRElVUywgJXMgKCV1KSwgaWQ6IDB4JTAyeCBsZW5ndGg6ICV1IiwKKyAgICAgICAgICAgICAgdG9rMnN0cihyYWRpdXNfY29tbWFuZF92YWx1ZXMsIlVua25vd24gQ29tbWFuZCIscmFkLT5jb2RlKSwKKyAgICAgICAgICAgICAgcmFkLT5jb2RlLAorICAgICAgICAgICAgICByYWQtPmlkLAorICAgICAgICAgICAgICBsZW4pOworICAgICAgIHJldHVybjsKKyAgIH0KKyAgIGVsc2UgeworICAgICAgIHByaW50ZigiUkFESVVTLCBsZW5ndGg6ICV1XG5cdCVzICgldSksIGlkOiAweCUwMngsIEF1dGhlbnRpY2F0b3I6ICIsCisgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgdG9rMnN0cihyYWRpdXNfY29tbWFuZF92YWx1ZXMsIlVua25vd24gQ29tbWFuZCIscmFkLT5jb2RlKSwKKyAgICAgICAgICAgICAgcmFkLT5jb2RlLAorICAgICAgICAgICAgICByYWQtPmlkKTsKKworICAgICAgIGZvcihhdXRoX2lkeD0wOyBhdXRoX2lkeCA8IDE2OyBhdXRoX2lkeCsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4IiwgcmFkLT5hdXRoW2F1dGhfaWR4XSApOworICAgfQorCisgICBpZiAobGVuID4gTUlOX1JBRElVU19MRU4pCisgICAgICByYWRpdXNfYXR0cnNfcHJpbnQoIGRhdCArIE1JTl9SQURJVVNfTEVOLCBsZW4gLSBNSU5fUkFESVVTX0xFTik7CisgICByZXR1cm47CisKK3RydW5jOgorICAgcHJpbnRmKCIgW3xyYWRpdXNdIik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1yYXcuYyBiL3ByaW50LXJhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTZkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1yYXcuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcmF3LmMsdiAxLjQxIDIwMDMvMTEvMTYgMDk6MzY6MzQgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKKy8qCisgKiBUaGUgRExUX1JBVyBwYWNrZXQgaGFzIG5vIGhlYWRlci4gSXQgY29udGFpbnMgYSByYXcgSVAgcGFja2V0LgorICovCisKK3VfaW50CityYXdfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJaWYgKGVmbGFnKQorCQlwcmludGYoImlwOiAiKTsKKworCWlwTl9wcmludChwLCBoLT5sZW4pOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LXJpcC5jIGIvcHJpbnQtcmlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyYTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXJpcC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcmlwLmMsdiAxLjU3IDIwMDMvMTEvMTYgMDk6MzY6MzQgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisKK3N0cnVjdCByaXAgeworCXVfaW50OF90IHJpcF9jbWQ7CQkvKiByZXF1ZXN0L3Jlc3BvbnNlICovCisJdV9pbnQ4X3QgcmlwX3ZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICMgKi8KKwl1X2ludDhfdCB1bnVzZWRbMl07CQkvKiB1bnVzZWQgKi8KK307CisKKyNkZWZpbmUJUklQQ01EX1JFUVVFU1QJCTEJLyogd2FudCBpbmZvICovCisjZGVmaW5lCVJJUENNRF9SRVNQT05TRQkJMgkvKiByZXNwb25kaW5nIHRvIHJlcXVlc3QgKi8KKyNkZWZpbmUJUklQQ01EX1RSQUNFT04JCTMJLyogdHVybiB0cmFjaW5nIG9uICovCisjZGVmaW5lCVJJUENNRF9UUkFDRU9GRgkJNAkvKiB0dXJuIGl0IG9mZiAqLworI2RlZmluZQlSSVBDTURfUE9MTAkJNQkvKiB3YW50IGluZm8gZnJvbSBldmVyeWJvZHkgKi8KKyNkZWZpbmUJUklQQ01EX1BPTExFTlRSWQk2CS8qIHBvbGwgZm9yIGVudHJ5ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJpcF9jbWRfdmFsdWVzW10gPSB7CisgICAgeyBSSVBDTURfUkVRVUVTVCwJICAgICAgICAiUmVxdWVzdCIgfSwKKyAgICB7IFJJUENNRF9SRVNQT05TRSwJICAgICAgICAiUmVzcG9uc2UiIH0sCisgICAgeyBSSVBDTURfVFJBQ0VPTiwJICAgICAgICAiVHJhY2Ugb24iIH0sCisgICAgeyBSSVBDTURfVFJBQ0VPRkYsCSAgICAgICAgIlRyYWNlIG9mZiIgfSwKKyAgICB7IFJJUENNRF9QT0xMLAkgICAgICAgICJQb2xsIiB9LAorICAgIHsgUklQQ01EX1BPTExFTlRSWSwJICAgICAgICAiUG9sbCBFbnRyeSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIFJJUF9BVVRITEVOICAxNgorI2RlZmluZSBSSVBfUk9VVEVMRU4gMjAKKworLyoKKyAqIHJmYyAxNzIzCisgKiAKKyAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzIDMKKyAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8IENvbW1hbmQgKDEpICAgfCBWZXJzaW9uICgxKSAgIHwgICAgICAgICAgIHVudXNlZCAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgQWRkcmVzcyBGYW1pbHkgSWRlbnRpZmllciAoMikgfCAgICAgICAgUm91dGUgVGFnICgyKSAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICBJUCBBZGRyZXNzICg0KSAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym5ldCBNYXNrICg0KSAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBIb3AgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWMgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICovCisKK3N0cnVjdCByaXBfbmV0aW5mbyB7CisJdV9pbnQxNl90IHJpcF9mYW1pbHk7CisJdV9pbnQxNl90IHJpcF90YWc7CisJdV9pbnQzMl90IHJpcF9kZXN0OworCXVfaW50MzJfdCByaXBfZGVzdF9tYXNrOworCXVfaW50MzJfdCByaXBfcm91dGVyOworCXVfaW50MzJfdCByaXBfbWV0cmljOwkJLyogY29zdCBvZiByb3V0ZSAqLworfTsKKworc3RhdGljIHZvaWQKK3JpcF9lbnRyeV9wcmludF92MShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmlwX25ldGluZm8gKm5pKQoreworCXJlZ2lzdGVyIHVfc2hvcnQgZmFtaWx5OworCisJLyogUkZDIDEwNTggKi8KKwlmYW1pbHkgPSBFWFRSQUNUXzE2QklUUygmbmktPnJpcF9mYW1pbHkpOworCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkgeworCQlwcmludGYoIlxuXHQgQUZJOiAldToiLCBmYW1pbHkpOworICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmbmktPnJpcF9mYW1pbHksIlxuXHQgICIsUklQX1JPVVRFTEVOKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSB8fAorCSAgICBFWFRSQUNUXzMyQklUUygmbmktPnJpcF9kZXN0X21hc2spIHx8CisJICAgIEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX3JvdXRlcikpIHsKKwkJLyogTUJaIGZpZWxkcyBub3QgemVybyAqLworICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmbmktPnJpcF9mYW1pbHksIlxuXHQgICIsUklQX1JPVVRFTEVOKTsKKwkJcmV0dXJuOworCX0gLyogQUZfSU5FVCAqLworCXByaW50ZigiXG5cdCAgJXMsIG1ldHJpYzogJXUiLAorICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZygmbmktPnJpcF9kZXN0KSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5pLT5yaXBfbWV0cmljKSk7Cit9CisKK3N0YXRpYyB2b2lkCityaXBfZW50cnlfcHJpbnRfdjIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcF9uZXRpbmZvICpuaSkKK3sKKwlyZWdpc3RlciB1X2NoYXIgKnA7CisJcmVnaXN0ZXIgdV9zaG9ydCBmYW1pbHk7CisJdV9jaGFyIGJ1ZltSSVBfQVVUSExFTl07CisKKwlmYW1pbHkgPSBFWFRSQUNUXzE2QklUUygmbmktPnJpcF9mYW1pbHkpOworCWlmIChmYW1pbHkgPT0gMHhGRkZGKSB7IC8qIDE2IGJ5dGVzIGF1dGhlbnRpY2F0aW9uID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSA9PSAyKSB7IC8qIHNpbXBsZSB0ZXh0IGF1dGhlbnRpY2F0aW9uID8gKi8KKwkJCW1lbWNweShidWYsICZuaS0+cmlwX2Rlc3QsIHNpemVvZihidWYpKTsKKwkJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJCQlmb3IgKHAgPSBidWY7ICpwOyBwKyspIHsKKwkJCQlpZiAoIWlzcHJpbnQoKnApKQorCQkJCQlicmVhazsKKwkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgU2ltcGxlIFRleHQgQXV0aGVudGljYXRpb24gZGF0YTogJXMiLCBidWYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisJCQlwcmludGYoIlxuXHQgIFVua25vd24gKCV1KSBBdXRoZW50aWNhdGlvbiBkYXRhOiIsCisJCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoKHVfaW50OF90ICopJm5pLT5yaXBfZGVzdCwiXG5cdCAgIixSSVBfQVVUSExFTik7CisJCX0KKwl9IGVsc2UgaWYgKGZhbWlseSAhPSBBRl9JTkVUKSB7CisJCXByaW50ZigiXG5cdCAgQUZJOiAldSIsIGZhbWlseSk7CisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCh1X2ludDhfdCAqKSZuaS0+cmlwX3RhZywiXG5cdCAgIixSSVBfUk9VVEVMRU4tMik7CisJCXJldHVybjsKKwl9IGVsc2UgeyAvKiBBRl9JTkVUICovCisJCXByaW50ZigiXG5cdCAgQUZJOiBJUHY0OiAlMTVzLyUtMmQsIHRhZyAweCUwNHgsIG1ldHJpYzogJXUsIG5leHQtaG9wOiAiLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZuaS0+cmlwX2Rlc3QpLAorCQkgICAgICAgbWFzazJwbGVuKEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX2Rlc3RfbWFzaykpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbmktPnJpcF90YWcpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmbmktPnJpcF9tZXRyaWMpKTsKKwkJaWYgKEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX3JvdXRlcikpCisJCQlwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZygmbmktPnJpcF9yb3V0ZXIpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByaW50Zigic2VsZiIpOworCX0KK30KKwordm9pZAorcmlwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcCAqcnA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcF9uZXRpbmZvICpuaTsKKwlyZWdpc3RlciB1X2ludCBpLCBqOworCXJlZ2lzdGVyIGludCB0cnVuYzsKKworCWlmIChzbmFwZW5kIDwgZGF0KSB7CisJCXByaW50ZigiIFt8cmlwXSIpOworCQlyZXR1cm47CisJfQorCWkgPSBzbmFwZW5kIC0gZGF0OworCWlmIChpID4gbGVuZ3RoKQorCQlpID0gbGVuZ3RoOworCWlmIChpIDwgc2l6ZW9mKCpycCkpIHsKKwkJcHJpbnRmKCIgW3xyaXBdIik7CisJCXJldHVybjsKKwl9CisJaSAtPSBzaXplb2YoKnJwKTsKKworCXJwID0gKHN0cnVjdCByaXAgKilkYXQ7CisKKyAgICAgICAgcHJpbnRmKCIlc1JJUHYldSIsCisgICAgICAgICAgICAgICAodmZsYWcgPj0gMSkgPyAiXG5cdCIgOiAiIiwKKyAgICAgICAgICAgICAgIHJwLT5yaXBfdmVycyk7CisKKwlzd2l0Y2ggKHJwLT5yaXBfdmVycykgeworCWNhc2UgMDoKKwkJLyoKKwkJICogUkZDIDEwNTguCisJCSAqCisJCSAqIFhYWCAtIFJGQyAxMDU4IHNheXMKKwkJICoKKwkJICogMCAgRGF0YWdyYW1zIHdob3NlIHZlcnNpb24gbnVtYmVyIGlzIHplcm8gYXJlIHRvIGJlIGlnbm9yZWQuCisJCSAqICAgIFRoZXNlIGFyZSBmcm9tIGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wsIHdob3NlCisJCSAqICAgIHBhY2tldCBmb3JtYXQgd2FzIG1hY2hpbmUtc3BlY2lmaWMuCisJCSAqCisJCSAqIHNvIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgZHVtcCB0aGUgcGFja2V0LCBpbiBoZXguCisJCSAqLworICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmcnAtPnJpcF9jbWQsIlxuXHQiLGxlbmd0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogZHVtcCB2ZXJzaW9uIGFuZCBsZXRzIHNlZSBpZiB3ZSBrbm93IHRoZSBjb21tYW5kcyBuYW1lKi8KKyAgICAgICAgICAgICAgICBwcmludGYoIiwgJXMsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJpcF9jbWRfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGNvbW1hbmQgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPnJpcF9jbWQpLAorICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworCisgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDwgMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisJCXN3aXRjaCAocnAtPnJpcF9jbWQpIHsKKwkJY2FzZSBSSVBDTURfUkVTUE9OU0U6CisJCQlqID0gbGVuZ3RoIC8gc2l6ZW9mKCpuaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcm91dGVzOiAldSIsaik7CisJCQl0cnVuYyA9IChpIC8gc2l6ZW9mKCpuaSkpICE9IGo7CisJCQluaSA9IChzdHJ1Y3QgcmlwX25ldGluZm8gKikocnAgKyAxKTsKKwkJCWZvciAoOyBpID49IHNpemVvZigqbmkpOyArK25pKSB7CisJCQkJaWYgKHJwLT5yaXBfdmVycyA9PSAxKQorCQkJCQlyaXBfZW50cnlfcHJpbnRfdjEobmkpOworCQkJCWVsc2UgaWYgKHJwLT5yaXBfdmVycyA9PSAyKQorCQkJCQlyaXBfZW50cnlfcHJpbnRfdjIobmkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQlpIC09IHNpemVvZigqbmkpOworCQkJfQorCQkJaWYgKHRydW5jKQorCQkJCXByaW50ZigiW3xyaXBdIik7CisJCQlicmVhazsKKworCQljYXNlIFJJUENNRF9SRVFVRVNUOgorCQljYXNlIFJJUENNRF9UUkFDRU9GRjoKKwkJY2FzZSBSSVBDTURfUE9MTDoKKwkJY2FzZSBSSVBDTURfUE9MTEVOVFJZOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSSVBDTURfVFJBQ0VPTjoKKyAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKilycCwiXG5cdCIsbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KKyAgICAgICAgICAgICAgICBpZiAodmZsYWc+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKilycCwiXG5cdCIsbGVuZ3RoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9wcmludC1yaXBuZy5jIGIvcHJpbnQtcmlwbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdhMDJlCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtcmlwbmcuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXJpcG5nLmMsdiAxLjE4IDIwMDUvMDEvMDQgMDA6MTU6NTQgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBJTkVUNgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAicm91dGU2ZC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisKKyNpZiAhZGVmaW5lZChJTjZfSVNfQUREUl9VTlNQRUNJRklFRCkgJiYgIWRlZmluZWQoX01TQ19WRVIpIC8qIE1TVkMgaW5saW5lICovCitzdGF0aWMgaW50IElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGluNl9hZGRyIGluNmFkZHJfYW55OyAgICAgICAgLyogOjogKi8KKyAgICByZXR1cm4gKG1lbWNtcChhZGRyLCAmaW42YWRkcl9hbnksIHNpemVvZigqYWRkcikpID09IDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3JpcDZfZW50cnlfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IG5ldGluZm82ICpuaSwgaW50IG1ldHJpYykKK3sKKwlpbnQgbDsKKwlsID0gcHJpbnRmKCIlcy8lZCIsIGlwNmFkZHJfc3RyaW5nKCZuaS0+cmlwNl9kZXN0KSwgbmktPnJpcDZfcGxlbik7CisJaWYgKG5pLT5yaXA2X3RhZykKKwkJbCArPSBwcmludGYoIiBbJWRdIiwgRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXA2X3RhZykpOworCWlmIChtZXRyaWMpCisJCWwgKz0gcHJpbnRmKCIgKCVkKSIsIG5pLT5yaXA2X21ldHJpYyk7CisJcmV0dXJuIGw7Cit9CisKK3ZvaWQKK3JpcG5nX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCByaXA2ICpycCA9IChzdHJ1Y3QgcmlwNiAqKWRhdDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbmV0aW5mbzYgKm5pOworCXJlZ2lzdGVyIHVfaW50IGFtdDsKKwlyZWdpc3RlciB1X2ludCBpOworCWludCBqOworCWludCB0cnVuYzsKKworCWlmIChzbmFwZW5kIDwgZGF0KQorCQlyZXR1cm47CisJYW10ID0gc25hcGVuZCAtIGRhdDsKKwlpID0gbWluKGxlbmd0aCwgYW10KTsKKwlpZiAoaSA8IChzaXplb2Yoc3RydWN0IHJpcDYpIC0gc2l6ZW9mKHN0cnVjdCBuZXRpbmZvNikpKQorCQlyZXR1cm47CisJaSAtPSAoc2l6ZW9mKHN0cnVjdCByaXA2KSAtIHNpemVvZihzdHJ1Y3QgbmV0aW5mbzYpKTsKKworCXN3aXRjaCAocnAtPnJpcDZfY21kKSB7CisKKwljYXNlIFJJUDZfUkVRVUVTVDoKKwkJaiA9IGxlbmd0aCAvIHNpemVvZigqbmkpOworCQlpZiAoaiA9PSAxCisJCSAgICAmJiAgcnAtPnJpcDZfbmV0cy0+cmlwNl9tZXRyaWMgPT0gSE9QQ05UX0lORklOSVRZNgorCQkgICAgJiYgIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZycC0+cmlwNl9uZXRzLT5yaXA2X2Rlc3QpKSB7CisJCQlwcmludGYoIiByaXBuZy1yZXEgZHVtcCIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogKiBzaXplb2YoKm5pKSAhPSBsZW5ndGggLSA0KQorCQkJcHJpbnRmKCIgcmlwbmctcmVxICVkWyV1XToiLCBqLCBsZW5ndGgpOworCQllbHNlCisJCQlwcmludGYoIiByaXBuZy1yZXEgJWQ6Iiwgaik7CisJCXRydW5jID0gKChpIC8gc2l6ZW9mKCpuaSkpICogc2l6ZW9mKCpuaSkgIT0gaSk7CisJCWZvciAobmkgPSBycC0+cmlwNl9uZXRzOyBpID49IHNpemVvZigqbmkpOworCQkgICAgaSAtPSBzaXplb2YoKm5pKSwgKytuaSkgeworCQkJaWYgKHZmbGFnID4gMSkKKwkJCQlwcmludGYoIlxuXHQiKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiAiKTsKKwkJCXJpcDZfZW50cnlfcHJpbnQobmksIDApOworCQl9CisJCWJyZWFrOworCWNhc2UgUklQNl9SRVNQT05TRToKKwkJaiA9IGxlbmd0aCAvIHNpemVvZigqbmkpOworCQlpZiAoaiAqIHNpemVvZigqbmkpICE9IGxlbmd0aCAtIDQpCisJCQlwcmludGYoIiByaXBuZy1yZXNwICVkWyV1XToiLCBqLCBsZW5ndGgpOworCQllbHNlCisJCQlwcmludGYoIiByaXBuZy1yZXNwICVkOiIsIGopOworCQl0cnVuYyA9ICgoaSAvIHNpemVvZigqbmkpKSAqIHNpemVvZigqbmkpICE9IGkpOworCQlmb3IgKG5pID0gcnAtPnJpcDZfbmV0czsgaSA+PSBzaXplb2YoKm5pKTsKKwkJICAgIGkgLT0gc2l6ZW9mKCpuaSksICsrbmkpIHsKKwkJCWlmICh2ZmxhZyA+IDEpCisJCQkJcHJpbnRmKCJcblx0Iik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIgIik7CisJCQlyaXA2X2VudHJ5X3ByaW50KG5pLCBuaS0+cmlwNl9tZXRyaWMpOworCQl9CisJCWlmICh0cnVuYykKKwkJCXByaW50ZigiW3xyaXBuZ10iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCIgcmlwbmctJWQgPz8gJXUiLCBycC0+cmlwNl9jbWQsIGxlbmd0aCk7CisJCWJyZWFrOworCX0KKwlpZiAocnAtPnJpcDZfdmVycyAhPSBSSVA2X1ZFUlNJT04pCisJCXByaW50ZigiIFt2ZXJzICVkXSIsIHJwLT5yaXA2X3ZlcnMpOworfQorI2VuZGlmIC8qIElORVQ2ICovCmRpZmYgLS1naXQgYS9wcmludC1yc3ZwLmMgYi9wcmludC1yc3ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ1MTkzMAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXJzdnAuYwpAQCAtMCwwICsxLDE3NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgVENQRFVNUCBwcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1yc3ZwLmMsdiAxLjMzLjIuMTUgMjAwNy8wOS8xMyAxNzozMzo1NCBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKyNpbmNsdWRlICJnbXBscy5oIgorI2luY2x1ZGUgImFmLmgiCisKKy8qCisgKiBSRkMgMjIwNSBjb21tb24gaGVhZGVyCisgKgorICogICAgICAgICAgICAgICAwICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDIgICAgICAgICAgICAgMworICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogICAgICAgIHwgVmVycyB8IEZsYWdzfCAgTXNnIFR5cGUgICB8ICAgICAgIFJTVlAgQ2hlY2tzdW0gICAgICAgfAorICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogICAgICAgIHwgIFNlbmRfVFRMICAgfCAoUmVzZXJ2ZWQpICB8ICAgICAgICBSU1ZQIExlbmd0aCAgICAgICAgfAorICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICoKKyAqLworCitzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyIHsKKyAgICB1X2ludDhfdCB2ZXJzaW9uX2ZsYWdzOworICAgIHVfaW50OF90IG1zZ190eXBlOworICAgIHVfaW50OF90IGNoZWNrc3VtWzJdOworICAgIHVfaW50OF90IHR0bDsKKyAgICB1X2ludDhfdCByZXNlcnZlZDsKKyAgICB1X2ludDhfdCBsZW5ndGhbMl07Cit9OworCisvKiAKKyAqIFJGQzIyMDUgb2JqZWN0IGhlYWRlcgorICoKKyAqIAorICogICAgICAgICAgICAgICAwICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDIgICAgICAgICAgICAgMworICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogICAgICAgIHwgICAgICAgTGVuZ3RoIChieXRlcykgICAgICB8ICBDbGFzcy1OdW0gIHwgICBDLVR5cGUgICAgfAorICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgIC8vICAgICAgICAgICAgICAgICAgKE9iamVjdCBjb250ZW50cykgICAgICAgICAgICAgICAgICAgLy8KKyAqICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSsKKyAqLworCitzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyIHsKKyAgICB1X2ludDhfdCBsZW5ndGhbMl07CisgICAgdV9pbnQ4X3QgY2xhc3NfbnVtOworICAgIHVfaW50OF90IGN0eXBlOworfTsKKworI2RlZmluZSBSU1ZQX1ZFUlNJT04gICAgICAgICAgICAxCisjZGVmaW5lCVJTVlBfRVhUUkFDVF9WRVJTSU9OKHgpICgoKHgpJjB4ZjApPj40KSAKKyNkZWZpbmUJUlNWUF9FWFRSQUNUX0ZMQUdTKHgpICAgKCh4KSYweDBmKQorCisjZGVmaW5lCVJTVlBfTVNHVFlQRV9QQVRIICAgICAgIDEKKyNkZWZpbmUJUlNWUF9NU0dUWVBFX1JFU1YgICAgICAgMgorI2RlZmluZQlSU1ZQX01TR1RZUEVfUEFUSEVSUiAgICAzCisjZGVmaW5lCVJTVlBfTVNHVFlQRV9SRVNWRVJSICAgIDQKKyNkZWZpbmUJUlNWUF9NU0dUWVBFX1BBVEhURUFSICAgNQorI2RlZmluZQlSU1ZQX01TR1RZUEVfUkVTVlRFQVIgICA2CisjZGVmaW5lCVJTVlBfTVNHVFlQRV9SRVNWQ09ORiAgIDcKKyNkZWZpbmUgUlNWUF9NU0dUWVBFX0FHR1JFR0FURSAgMTIKKyNkZWZpbmUgUlNWUF9NU0dUWVBFX0FDSyAgICAgICAgMTMKKyNkZWZpbmUgUlNWUF9NU0dUWVBFX0hFTExPX09MRCAgMTQgICAgICAvKiBhbmNpZW50IEhlbGxvcyAqLworI2RlZmluZSBSU1ZQX01TR1RZUEVfU1JFRlJFU0ggICAxNQorI2RlZmluZQlSU1ZQX01TR1RZUEVfSEVMTE8gICAgICAyMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX21zZ190eXBlX3ZhbHVlc1tdID0geworICAgIHsgUlNWUF9NU0dUWVBFX1BBVEgsCSJQYXRoIiB9LAorICAgIHsgUlNWUF9NU0dUWVBFX1JFU1YsCSJSZXN2IiB9LAorICAgIHsgUlNWUF9NU0dUWVBFX1BBVEhFUlIsCSJQYXRoRXJyIiB9LAorICAgIHsgUlNWUF9NU0dUWVBFX1JFU1ZFUlIsCSJSZXN2RXJyIiB9LAorICAgIHsgUlNWUF9NU0dUWVBFX1BBVEhURUFSLAkiUGF0aFRlYXIiIH0sCisgICAgeyBSU1ZQX01TR1RZUEVfUkVTVlRFQVIsCSJSZXN2VGVhciIgfSwKKyAgICB7IFJTVlBfTVNHVFlQRV9SRVNWQ09ORiwJIlJlc3ZDb25mIiB9LAorICAgIHsgUlNWUF9NU0dUWVBFX0FHR1JFR0FURSwJIkFnZ3JlZ2F0ZSIgfSwKKyAgICB7IFJTVlBfTVNHVFlQRV9BQ0ssCSAgICAgICAgIkFja25vd2xlZGdlbWVudCIgfSwKKyAgICB7IFJTVlBfTVNHVFlQRV9IRUxMT19PTEQsCSJIZWxsbyAoT2xkKSIgfSwKKyAgICB7IFJTVlBfTVNHVFlQRV9TUkVGUkVTSCwJIlJlZnJlc2giIH0sCisgICAgeyBSU1ZQX01TR1RZUEVfSEVMTE8sCSJIZWxsbyIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX2hlYWRlcl9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwJICAgICAgICAgICAgICAiUmVmcmVzaCByZWR1Y3Rpb24gY2FwYWJsZSIgfSwgLyogcmZjMjk2MSAqLworICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUJUlNWUF9PQkpfU0VTU0lPTiAgICAgICAgICAgIDEgICAvKiByZmMyMjA1ICovCisjZGVmaW5lCVJTVlBfT0JKX1JTVlBfSE9QICAgICAgICAgICAzICAgLyogcmZjMjIwNSwgcmZjMzQ3MyAqLworI2RlZmluZQlSU1ZQX09CSl9JTlRFR1JJVFkgICAgICAgICAgNCAgIC8qIHJmYzI3NDcgKi8KKyNkZWZpbmUJUlNWUF9PQkpfVElNRV9WQUxVRVMgICAgICAgIDUgICAvKiByZmMyMjA1ICovCisjZGVmaW5lCVJTVlBfT0JKX0VSUk9SX1NQRUMgICAgICAgICA2IAorI2RlZmluZQlSU1ZQX09CSl9TQ09QRSAgICAgICAgICAgICAgNworI2RlZmluZQlSU1ZQX09CSl9TVFlMRSAgICAgICAgICAgICAgOCAgIC8qIHJmYzIyMDUgKi8KKyNkZWZpbmUJUlNWUF9PQkpfRkxPV1NQRUMgICAgICAgICAgIDkgICAvKiByZmMyMjE1ICovCisjZGVmaW5lCVJTVlBfT0JKX0ZJTFRFUlNQRUMgICAgICAgICAxMCAgLyogcmZjMjIxNSAqLworI2RlZmluZQlSU1ZQX09CSl9TRU5ERVJfVEVNUExBVEUgICAgMTEKKyNkZWZpbmUJUlNWUF9PQkpfU0VOREVSX1RTUEVDICAgICAgIDEyICAvKiByZmMyMjE1ICovCisjZGVmaW5lCVJTVlBfT0JKX0FEU1BFQyAgICAgICAgICAgICAxMyAgLyogcmZjMjIxNSAqLworI2RlZmluZQlSU1ZQX09CSl9QT0xJQ1lfREFUQSAgICAgICAgMTQKKyNkZWZpbmUJUlNWUF9PQkpfQ09ORklSTSAgICAgICAgICAgIDE1ICAvKiByZmMyMjA1ICovCisjZGVmaW5lCVJTVlBfT0JKX0xBQkVMICAgICAgICAgICAgICAxNiAgLyogcmZjMzIwOSAqLworI2RlZmluZQlSU1ZQX09CSl9MQUJFTF9SRVEgICAgICAgICAgMTkgIC8qIHJmYzMyMDkgKi8KKyNkZWZpbmUJUlNWUF9PQkpfRVJPICAgICAgICAgICAgICAgIDIwICAvKiByZmMzMjA5ICovCisjZGVmaW5lCVJTVlBfT0JKX1JSTyAgICAgICAgICAgICAgICAyMSAgLyogcmZjMzIwOSAqLworI2RlZmluZQlSU1ZQX09CSl9IRUxMTyAgICAgICAgICAgICAgMjIgIC8qIHJmYzMyMDkgKi8KKyNkZWZpbmUJUlNWUF9PQkpfTUVTU0FHRV9JRCAgICAgICAgIDIzICAvKiByZmMyOTYxICovCisjZGVmaW5lCVJTVlBfT0JKX01FU1NBR0VfSURfQUNLICAgICAyNCAgLyogcmZjMjk2MSAqLworI2RlZmluZQlSU1ZQX09CSl9NRVNTQUdFX0lEX0xJU1QgICAgMjUgIC8qIHJmYzI5NjEgKi8KKyNkZWZpbmUJUlNWUF9PQkpfUkVDT1ZFUllfTEFCRUwgICAgIDM0ICAvKiByZmMzNDczICovCisjZGVmaW5lCVJTVlBfT0JKX1VQU1RSRUFNX0xBQkVMICAgICAzNSAgLyogcmZjMzQ3MyAqLworI2RlZmluZQlSU1ZQX09CSl9MQUJFTF9TRVQgICAgICAgICAgMzYgIC8qIHJmYzM0NzMgKi8KKyNkZWZpbmUJUlNWUF9PQkpfUFJPVEVDVElPTiAgICAgICAgIDM3ICAvKiByZmMzNDczICovCisjZGVmaW5lCVJTVlBfT0JKX0RFVE9VUiAgICAgICAgICAgICA2MyAgLyogZHJhZnQtaWV0Zi1tcGxzLXJzdnAtbHNwLWZhc3RyZXJvdXRlLTA3ICovCisjZGVmaW5lCVJTVlBfT0JKX0NMQVNTVFlQRSAgICAgICAgICA2NiAgLyogcmZjNDEyNCAqLworI2RlZmluZSBSU1ZQX09CSl9DTEFTU1RZUEVfT0xEICAgICAgMTI1IC8qIGRyYWZ0LWlldGYtdGV3Zy1kaWZmLXRlLXByb3RvLTA3ICovCisjZGVmaW5lCVJTVlBfT0JKX1NVR0dFU1RFRF9MQUJFTCAgICAxMjkgLyogcmZjMzQ3MyAqLworI2RlZmluZQlSU1ZQX09CSl9BQ0NFUFRfTEFCRUxfU0VUICAgMTMwIC8qIHJmYzM0NzMgKi8KKyNkZWZpbmUJUlNWUF9PQkpfUkVTVEFSVF9DQVBBQklMSVRZIDEzMSAvKiByZmMzNDczICovCisjZGVmaW5lCVJTVlBfT0JKX05PVElGWV9SRVEgICAgICAgICAxOTUgLyogcmZjMzQ3MyAqLworI2RlZmluZQlSU1ZQX09CSl9BRE1JTl9TVEFUVVMgICAgICAgMTk2IC8qIHJmYzM0NzMgKi8KKyNkZWZpbmUJUlNWUF9PQkpfUFJPUEVSVElFUyAgICAgICAgIDIwNCAvKiBqdW5pcGVyIHByb3ByaWV0YXJ5ICovCisjZGVmaW5lCVJTVlBfT0JKX0ZBU1RSRVJPVVRFICAgICAgICAyMDUgLyogZHJhZnQtaWV0Zi1tcGxzLXJzdnAtbHNwLWZhc3RyZXJvdXRlLTA3ICovCisjZGVmaW5lCVJTVlBfT0JKX1NFU1NJT05fQVRUUklCVVRFICAyMDcgLyogcmZjMzIwOSAqLworI2RlZmluZSBSU1ZQX09CSl9HRU5FUkFMSVpFRF9VTkkgICAgMjI5IC8qIE9JRiBSU1ZQIGV4dGVuc2lvbnMgVU5JIDEuMCBTaWduYWxpbmcsIFJlbC4gMiAqLworI2RlZmluZSBSU1ZQX09CSl9DQUxMX0lEICAgICAgICAgICAgMjMwIC8qIHJmYzM0NzQgKi8KKyNkZWZpbmUgUlNWUF9PQkpfQ0FMTF9PUFMgICAgICAgICAgIDIzNiAvKiByZmMzNDc0ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfb2JqX3ZhbHVlc1tdID0geworICAgIHsgUlNWUF9PQkpfU0VTU0lPTiwgICAgICAgICAgICAiU2Vzc2lvbiIgfSwKKyAgICB7IFJTVlBfT0JKX1JTVlBfSE9QLCAgICAgICAgICAgIlJTVlAgSG9wIiB9LAorICAgIHsgUlNWUF9PQkpfSU5URUdSSVRZLCAgICAgICAgICAiSW50ZWdyaXR5IiB9LAorICAgIHsgUlNWUF9PQkpfVElNRV9WQUxVRVMsICAgICAgICAiVGltZSBWYWx1ZXMiIH0sCisgICAgeyBSU1ZQX09CSl9FUlJPUl9TUEVDLCAgICAgICAgICJFcnJvciBTcGVjIiB9LAorICAgIHsgUlNWUF9PQkpfU0NPUEUsICAgICAgICAgICAgICAiU2NvcGUiIH0sCisgICAgeyBSU1ZQX09CSl9TVFlMRSwgICAgICAgICAgICAgICJTdHlsZSIgfSwKKyAgICB7IFJTVlBfT0JKX0ZMT1dTUEVDLCAgICAgICAgICAgIkZsb3dzcGVjIiB9LAorICAgIHsgUlNWUF9PQkpfRklMVEVSU1BFQywgICAgICAgICAiRmlsdGVyU3BlYyIgfSwKKyAgICB7IFJTVlBfT0JKX1NFTkRFUl9URU1QTEFURSwgICAgIlNlbmRlciBUZW1wbGF0ZSIgfSwKKyAgICB7IFJTVlBfT0JKX1NFTkRFUl9UU1BFQywgICAgICAgIlNlbmRlciBUU3BlYyIgfSwKKyAgICB7IFJTVlBfT0JKX0FEU1BFQywgICAgICAgICAgICAgIkFkc3BlYyIgfSwKKyAgICB7IFJTVlBfT0JKX1BPTElDWV9EQVRBLCAgICAgICAgIlBvbGljeSBEYXRhIiB9LAorICAgIHsgUlNWUF9PQkpfQ09ORklSTSwgICAgICAgICAgICAiQ29uZmlybSIgfSwKKyAgICB7IFJTVlBfT0JKX0xBQkVMLCAgICAgICAgICAgICAgIkxhYmVsIiB9LAorICAgIHsgUlNWUF9PQkpfTEFCRUxfUkVRLCAgICAgICAgICAiTGFiZWwgUmVxdWVzdCIgfSwKKyAgICB7IFJTVlBfT0JKX0VSTywgICAgICAgICAgICAgICAgIkVSTyIgfSwKKyAgICB7IFJTVlBfT0JKX1JSTywgICAgICAgICAgICAgICAgIlJSTyIgfSwKKyAgICB7IFJTVlBfT0JKX0hFTExPLCAgICAgICAgICAgICAgIkhlbGxvIiB9LAorICAgIHsgUlNWUF9PQkpfTUVTU0FHRV9JRCwgICAgICAgICAiTWVzc2FnZSBJRCIgfSwKKyAgICB7IFJTVlBfT0JKX01FU1NBR0VfSURfQUNLLCAgICAgIk1lc3NhZ2UgSUQgQWNrIiB9LAorICAgIHsgUlNWUF9PQkpfTUVTU0FHRV9JRF9MSVNULCAgICAiTWVzc2FnZSBJRCBMaXN0IiB9LAorICAgIHsgUlNWUF9PQkpfUkVDT1ZFUllfTEFCRUwsICAgICAiUmVjb3ZlcnkgTGFiZWwiIH0sCisgICAgeyBSU1ZQX09CSl9VUFNUUkVBTV9MQUJFTCwgICAgICJVcHN0cmVhbSBMYWJlbCIgfSwKKyAgICB7IFJTVlBfT0JKX0xBQkVMX1NFVCwgICAgICAgICAgIkxhYmVsIFNldCIgfSwKKyAgICB7IFJTVlBfT0JKX0FDQ0VQVF9MQUJFTF9TRVQsICAgIkFjY2VwdGFibGUgTGFiZWwgU2V0IiB9LAorICAgIHsgUlNWUF9PQkpfREVUT1VSLCAgICAgICAgICAgICAiRGV0b3VyIiB9LAorICAgIHsgUlNWUF9PQkpfQ0xBU1NUWVBFLCAgICAgICAgICAiQ2xhc3MgVHlwZSIgfSwKKyAgICB7IFJTVlBfT0JKX0NMQVNTVFlQRV9PTEQsICAgICAgIkNsYXNzIFR5cGUgKG9sZCkiIH0sCisgICAgeyBSU1ZQX09CSl9TVUdHRVNURURfTEFCRUwsICAgICJTdWdnZXN0ZWQgTGFiZWwiIH0sCisgICAgeyBSU1ZQX09CSl9QUk9QRVJUSUVTLCAgICAgICAgICJQcm9wZXJ0aWVzIiB9LAorICAgIHsgUlNWUF9PQkpfRkFTVFJFUk9VVEUsICAgICAgICAiRmFzdCBSZS1Sb3V0ZSIgfSwKKyAgICB7IFJTVlBfT0JKX1NFU1NJT05fQVRUUklCVVRFLCAgIlNlc3Npb24gQXR0cmlidXRlIiB9LAorICAgIHsgUlNWUF9PQkpfR0VORVJBTElaRURfVU5JLCAgICAiR2VuZXJhbGl6ZWQgVU5JIiB9LAorICAgIHsgUlNWUF9PQkpfQ0FMTF9JRCwgICAgICAgICAgICAiQ2FsbC1JRCIgfSwKKyAgICB7IFJTVlBfT0JKX0NBTExfT1BTLCAgICAgICAgICAgIkNhbGwgQ2FwYWJpbGl0eSIgfSwKKyAgICB7IFJTVlBfT0JKX1JFU1RBUlRfQ0FQQUJJTElUWSwgIlJlc3RhcnQgQ2FwYWJpbGl0eSIgfSwKKyAgICB7IFJTVlBfT0JKX05PVElGWV9SRVEsICAgICAgICAgIk5vdGlmeSBSZXF1ZXN0IiB9LAorICAgIHsgUlNWUF9PQkpfUFJPVEVDVElPTiwgICAgICAgICAiUHJvdGVjdGlvbiIgfSwKKyAgICB7IFJTVlBfT0JKX0FETUlOX1NUQVRVUywgICAgICAgIkFkbWluaXN0cmF0aXZlIFN0YXR1cyIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lCVJTVlBfQ1RZUEVfSVBWNCAgICAgICAgMQorI2RlZmluZQlSU1ZQX0NUWVBFX0lQVjYgICAgICAgIDIKKyNkZWZpbmUJUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCA3CisjZGVmaW5lCVJTVlBfQ1RZUEVfVFVOTkVMX0lQVjYgOAorI2RlZmluZQlSU1ZQX0NUWVBFX1VOSV9JUFY0ICAgIDExIC8qIE9JRiBSU1ZQIGV4dGVuc2lvbnMgVU5JIDEuMCBTaWduYWxpbmcgUmVsLiAyICovCisjZGVmaW5lIFJTVlBfQ1RZUEVfMSAgICAgICAgICAgMQorI2RlZmluZSBSU1ZQX0NUWVBFXzIgICAgICAgICAgIDIKKyNkZWZpbmUgUlNWUF9DVFlQRV8zICAgICAgICAgICAzCisjZGVmaW5lIFJTVlBfQ1RZUEVfNCAgICAgICAgICAgNAorCisvKgorICogdGhlIGN0eXBlcyBhcmUgbm90IGdsb2JhbGx5IHVuaXF1ZSBzbyBmb3IKKyAqIHRyYW5zbGF0aW5nIGl0IHRvIHN0cmluZ3Mgd2UgYnVpbGQgYSB0YWJsZSBiYXNlZAorICogb24gb2JqZWN0cyBvZmZzZXR0ZWQgYnkgdGhlIGN0eXBlCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9jdHlwZV92YWx1ZXNbXSA9IHsKKyAgICB7IDI1NipSU1ZQX09CSl9SU1ZQX0hPUCtSU1ZQX0NUWVBFX0lQVjQsCSAgICAgICAgICAgICAiSVB2NCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9SU1ZQX0hPUCtSU1ZQX0NUWVBFX0lQVjYsCSAgICAgICAgICAgICAiSVB2NiIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9SU1ZQX0hPUCtSU1ZQX0NUWVBFXzMsCSAgICAgICAgICAgICAiSVB2NCBwbHVzIG9wdC4gVExWcyIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9SU1ZQX0hPUCtSU1ZQX0NUWVBFXzQsCSAgICAgICAgICAgICAiSVB2NiBwbHVzIG9wdC4gVExWcyIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9OT1RJRllfUkVRK1JTVlBfQ1RZUEVfSVBWNCwJICAgICAgICAgICAgICJJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX05PVElGWV9SRVErUlNWUF9DVFlQRV9JUFY2LAkgICAgICAgICAgICAgIklQdjYiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfQ09ORklSTStSU1ZQX0NUWVBFX0lQVjQsCSAgICAgICAgICAgICAiSVB2NCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9DT05GSVJNK1JTVlBfQ1RZUEVfSVBWNiwJICAgICAgICAgICAgICJJUHY2IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1RJTUVfVkFMVUVTK1JTVlBfQ1RZUEVfMSwJICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0ZMT1dTUEVDK1JTVlBfQ1RZUEVfMSwJICAgICAgICAgICAgICJvYnNvbGV0ZSIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9GTE9XU1BFQytSU1ZQX0NUWVBFXzIsCSAgICAgICAgICAgICAiSW50U2VydiIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9TRU5ERVJfVFNQRUMrUlNWUF9DVFlQRV8yLAkgICAgICAgICAgICAgIkludFNlcnYiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfQURTUEVDK1JTVlBfQ1RZUEVfMiwJICAgICAgICAgICAgICAgICAgICAgIkludFNlcnYiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRklMVEVSU1BFQytSU1ZQX0NUWVBFX0lQVjQsCSAgICAgICAgICAgICAiSVB2NCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9GSUxURVJTUEVDK1JTVlBfQ1RZUEVfSVBWNiwJICAgICAgICAgICAgICJJUHY2IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0ZJTFRFUlNQRUMrUlNWUF9DVFlQRV8zLAkgICAgICAgICAgICAgIklQdjYgRmxvdy1sYWJlbCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9GSUxURVJTUEVDK1JTVlBfQ1RZUEVfVFVOTkVMX0lQVjQsCSAgICAgIlR1bm5lbCBJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1NFU1NJT04rUlNWUF9DVFlQRV9JUFY0LAkgICAgICAgICAgICAgIklQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfU0VTU0lPTitSU1ZQX0NUWVBFX0lQVjYsCSAgICAgICAgICAgICAiSVB2NiIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9TRVNTSU9OK1JTVlBfQ1RZUEVfVFVOTkVMX0lQVjQsICAgICAgICAgICAiVHVubmVsIElQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfU0VTU0lPTitSU1ZQX0NUWVBFX1VOSV9JUFY0LCAgICAgICAgICAgICAgIlVOSSBJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1NFTkRFUl9URU1QTEFURStSU1ZQX0NUWVBFX0lQVjQsICAgICAgICAgICJJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1NFTkRFUl9URU1QTEFURStSU1ZQX0NUWVBFX0lQVjYsICAgICAgICAgICJJUHY2IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1NFTkRFUl9URU1QTEFURStSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0LCAgICJUdW5uZWwgSVB2NCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9NRVNTQUdFX0lEK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAiMSIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9NRVNTQUdFX0lEX0FDSytSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAiTWVzc2FnZSBpZCBhY2siIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfTUVTU0FHRV9JRF9BQ0srUlNWUF9DVFlQRV8yLCAgICAgICAgICAgICAgIk1lc3NhZ2UgaWQgbmFjayIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9NRVNTQUdFX0lEX0xJU1QrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAiMSIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9TVFlMRStSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgICAgICAiMSIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9IRUxMTytSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gUmVxdWVzdCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9IRUxMTytSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gQWNrIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMX1JFUStSU1ZQX0NUWVBFXzEsCSAgICAgICAgICAgICAid2l0aG91dCBsYWJlbCByYW5nZSIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9MQUJFTF9SRVErUlNWUF9DVFlQRV8yLAkgICAgICAgICAgICAgIndpdGggQVRNIGxhYmVsIHJhbmdlIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMX1JFUStSU1ZQX0NUWVBFXzMsICAgICAgICAgICAgICAgICAgICJ3aXRoIEZSIGxhYmVsIHJhbmdlIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMX1JFUStSU1ZQX0NUWVBFXzQsICAgICAgICAgICAgICAgICAgICJHZW5lcmFsaXplZCBMYWJlbCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9MQUJFTCtSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgICAgICAiTGFiZWwiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfTEFCRUwrUlNWUF9DVFlQRV8yLCAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYWxpemVkIExhYmVsIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMK1JTVlBfQ1RZUEVfMywgICAgICAgICAgICAgICAgICAgICAgICJXYXZlYmFuZCBTd2l0Y2hpbmciIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfU1VHR0VTVEVEX0xBQkVMK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgIkxhYmVsIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1NVR0dFU1RFRF9MQUJFTCtSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICJHZW5lcmFsaXplZCBMYWJlbCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9TVUdHRVNURURfTEFCRUwrUlNWUF9DVFlQRV8zLCAgICAgICAgICAgICAiV2F2ZWJhbmQgU3dpdGNoaW5nIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1VQU1RSRUFNX0xBQkVMK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICJMYWJlbCIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9VUFNUUkVBTV9MQUJFTCtSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICAiR2VuZXJhbGl6ZWQgTGFiZWwiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfVVBTVFJFQU1fTEFCRUwrUlNWUF9DVFlQRV8zLCAgICAgICAgICAgICAgIldhdmViYW5kIFN3aXRjaGluZyIgfSwKKyAgICB7IDI1NipSU1ZQX09CSl9SRUNPVkVSWV9MQUJFTCtSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAiTGFiZWwiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfUkVDT1ZFUllfTEFCRUwrUlNWUF9DVFlQRV8yLCAgICAgICAgICAgICAgIkdlbmVyYWxpemVkIExhYmVsIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1JFQ09WRVJZX0xBQkVMK1JTVlBfQ1RZUEVfMywgICAgICAgICAgICAgICJXYXZlYmFuZCBTd2l0Y2hpbmciIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRVJPK1JTVlBfQ1RZUEVfSVBWNCwgICAgICAgICAgICAgICAgICAgICAgIklQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfUlJPK1JTVlBfQ1RZUEVfSVBWNCwgICAgICAgICAgICAgICAgICAgICAgIklQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRVJST1JfU1BFQytSU1ZQX0NUWVBFX0lQVjQsICAgICAgICAgICAgICAgIklQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRVJST1JfU1BFQytSU1ZQX0NUWVBFX0lQVjYsICAgICAgICAgICAgICAgIklQdjYiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRVJST1JfU1BFQytSU1ZQX0NUWVBFXzMsICAgICAgICAgICAgICAgICAgIklQdjQgcGx1cyBvcHQuIFRMVnMiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfRVJST1JfU1BFQytSU1ZQX0NUWVBFXzQsICAgICAgICAgICAgICAgICAgIklQdjYgcGx1cyBvcHQuIFRMVnMiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfUkVTVEFSVF9DQVBBQklMSVRZK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgIklQdjQiIH0sCisgICAgeyAyNTYqUlNWUF9PQkpfU0VTU0lPTl9BVFRSSUJVVEUrUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCwgIlR1bm5lbCBJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0ZBU1RSRVJPVVRFK1JTVlBfQ1RZUEVfVFVOTkVMX0lQVjQsICAgICAgICJUdW5uZWwgSVB2NCIgfSwgLyogb2xkIHN0eWxlKi8KKyAgICB7IDI1NipSU1ZQX09CSl9GQVNUUkVST1VURStSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAiMSIgfSwgLyogbmV3IHN0eWxlICovCisgICAgeyAyNTYqUlNWUF9PQkpfREVUT1VSK1JTVlBfQ1RZUEVfVFVOTkVMX0lQVjQsICAgICAgICAgICAgIlR1bm5lbCBJUHY0IiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX1BST1BFUlRJRVMrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0FETUlOX1NUQVRVUytSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0NMQVNTVFlQRStSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0NMQVNTVFlQRV9PTEQrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMX1NFVCtSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMjU2KlJTVlBfT0JKX0dFTkVSQUxJWkVEX1VOSStSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICIxIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCByc3ZwX29ial9pbnRlZ3JpdHlfdCB7CisgICAgdV9pbnQ4X3QgZmxhZ3M7CisgICAgdV9pbnQ4X3QgcmVzOworICAgIHVfaW50OF90IGtleV9pZFs2XTsKKyAgICB1X2ludDhfdCBzZXF1ZW5jZVs4XTsKKyAgICB1X2ludDhfdCBkaWdlc3RbMTZdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfaW50ZWdyaXR5X2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDgwLCAiSGFuZHNoYWtlIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCByc3ZwX29ial9mcnJfdCB7CisgICAgdV9pbnQ4X3Qgc2V0dXBfcHJpbzsKKyAgICB1X2ludDhfdCBob2xkX3ByaW87CisgICAgdV9pbnQ4X3QgaG9wX2xpbWl0OworICAgIHVfaW50OF90IGZsYWdzOworICAgIHVfaW50OF90IGJhbmR3aWR0aFs0XTsKKyAgICB1X2ludDhfdCBpbmNsdWRlX2FueVs0XTsKKyAgICB1X2ludDhfdCBleGNsdWRlX2FueVs0XTsKKyAgICB1X2ludDhfdCBpbmNsdWRlX2FsbFs0XTsKK307CisKKworI2RlZmluZSBSU1ZQX09CSl9YUk9fTUFTS19TVUJPQkooeCkgICAoKHgpJjB4N2YpCisjZGVmaW5lIFJTVlBfT0JKX1hST19NQVNLX0xPT1NFKHgpICAgICgoeCkmMHg4MCkKKworI2RlZmluZQlSU1ZQX09CSl9YUk9fUkVTICAgICAgIDAKKyNkZWZpbmUJUlNWUF9PQkpfWFJPX0lQVjQgICAgICAxCisjZGVmaW5lCVJTVlBfT0JKX1hST19JUFY2ICAgICAgMgorI2RlZmluZQlSU1ZQX09CSl9YUk9fQVNOICAgICAgIDMyCisjZGVmaW5lCVJTVlBfT0JKX1hST19NUExTICAgICAgNjQKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfeHJvX3ZhbHVlc1tdID0geworICAgIHsgUlNWUF9PQkpfWFJPX1JFUywJICAgICAgIlJlc2VydmVkIiB9LAorICAgIHsgUlNWUF9PQkpfWFJPX0lQVjQsICAgICAgIklQdjQgcHJlZml4IiB9LAorICAgIHsgUlNWUF9PQkpfWFJPX0lQVjYsICAgICAgIklQdjYgcHJlZml4IiB9LAorICAgIHsgUlNWUF9PQkpfWFJPX0FTTiwgICAgICAgIkF1dG9ub21vdXMgc3lzdGVtIG51bWJlciIgfSwKKyAgICB7IFJTVlBfT0JKX1hST19NUExTLCAgICAgICJNUExTIGxhYmVsIHN3aXRjaGVkIHBhdGggdGVybWluYXRpb24iIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogZHJhZnQtaWV0Zi1tcGxzLXJzdnAtbHNwLWZhc3RyZXJvdXRlLTA3LnR4dCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfcnJvX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLAkgICAgICAgICAgICAgICJMb2NhbCBwcm90ZWN0aW9uIGF2YWlsYWJsZSIgfSwKKyAgICB7IDB4MDIsICAgICAgICAgICAgICAgICAgICJMb2NhbCBwcm90ZWN0aW9uIGluIHVzZSIgfSwKKyAgICB7IDB4MDQsICAgICAgICAgICAgICAgICAgICJCYW5kd2lkdGggcHJvdGVjdGlvbiIgfSwKKyAgICB7IDB4MDgsICAgICAgICAgICAgICAgICAgICJOb2RlIHByb3RlY3Rpb24iIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9yZXNzdHlsZV92YWx1ZXNbXSA9IHsKKyAgICB7IDE3LAkgICAgICAgICAgICAgICJXaWxkY2FyZCBGaWx0ZXIiIH0sCisgICAgeyAxMCwgICAgICAgICAgICAgICAgICAgICAiRml4ZWQgRmlsdGVyIiB9LAorICAgIHsgMTgsICAgICAgICAgICAgICAgICAgICAgIlNoYXJlZCBFeHBsaWNpdCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIFJTVlBfT0JKX0lOVFNFUlZfR1VBUkFOVEVFRF9TRVJWIDIKKyNkZWZpbmUgUlNWUF9PQkpfSU5UU0VSVl9DT05UUk9MTEVEX0xPQUQgNQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX2ludHNlcnZfc2VydmljZV90eXBlX3ZhbHVlc1tdID0geworICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0L0dsb2JhbCBJbmZvcm1hdGlvbiIgfSwKKyAgICB7IFJTVlBfT0JKX0lOVFNFUlZfR1VBUkFOVEVFRF9TRVJWLCAiR3VhcmFudGVlZCBTZXJ2aWNlIiB9LAorICAgIHsgUlNWUF9PQkpfSU5UU0VSVl9DT05UUk9MTEVEX0xPQUQsCSJDb250cm9sbGVkIExvYWQiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9pbnRzZXJ2X3BhcmFtZXRlcl9pZF92YWx1ZXNbXSA9IHsKKyAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgIklTIGhvcCBjbnQiIH0sCisgICAgeyA2LCAgICAgICAgICAgICAgICAgICAgICJQYXRoIGIvdyBlc3RpbWF0ZSIgfSwKKyAgICB7IDgsICAgICAgICAgICAgICAgICAgICAgIk1pbmltdW0gcGF0aCBsYXRlbmN5IiB9LAorICAgIHsgMTAsICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZWQgTVRVIiB9LAorICAgIHsgMTI3LCAgICAgICAgICAgICAgICAgICAiVG9rZW4gQnVja2V0IFRTcGVjIiB9LAorICAgIHsgMTMwLCAgICAgICAgICAgICAgICAgICAiR3VhcmFudGVlZCBTZXJ2aWNlIFJTcGVjIiB9LAorICAgIHsgMTMzLCAgICAgICAgICAgICAgICAgICAiRW5kLXRvLWVuZCBjb21wb3NlZCB2YWx1ZSBmb3IgQyIgfSwKKyAgICB7IDEzNCwgICAgICAgICAgICAgICAgICAgIkVuZC10by1lbmQgY29tcG9zZWQgdmFsdWUgZm9yIEQiIH0sCisgICAgeyAxMzUsICAgICAgICAgICAgICAgICAgICJTaW5jZS1sYXN0LXJlc2hhcGluZyBwb2ludCBjb21wb3NlZCBDIiB9LAorICAgIHsgMTM2LCAgICAgICAgICAgICAgICAgICAiU2luY2UtbGFzdC1yZXNoYXBpbmcgcG9pbnQgY29tcG9zZWQgRCIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IHRvayByc3ZwX3Nlc3Npb25fYXR0cmlidXRlX2ZsYWdfdmFsdWVzW10gPSB7CisgICAgeyAweDAxLAkgICAgICAgICAgICAgICJMb2NhbCBQcm90ZWN0aW9uIGRlc2lyZWQiIH0sCisgICAgeyAweDAyLCAgICAgICAgICAgICAgICAgICAiTGFiZWwgUmVjb3JkaW5nIGRlc2lyZWQiIH0sCisgICAgeyAweDA0LCAgICAgICAgICAgICAgICAgICAiU0UgU3R5bGUgZGVzaXJlZCIgfSwKKyAgICB7IDB4MDgsICAgICAgICAgICAgICAgICAgICJCYW5kd2lkdGggcHJvdGVjdGlvbiBkZXNpcmVkIiB9LCAvKiBkcmFmdC1pZXRmLW1wbHMtcnN2cC1sc3AtZmFzdHJlcm91dGUtMDIudHh0ICovCisgICAgeyAweDEwLCAgICAgICAgICAgICAgICAgICAiTm9kZSBwcm90ZWN0aW9uIGRlc2lyZWQiIH0sICAgICAgLyogZHJhZnQtaWV0Zi1tcGxzLXJzdnAtbHNwLWZhc3RyZXJvdXRlLTAyLnR4dCAqLworICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHJzdnBfb2JqX3Byb3BfdGx2X3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgICAgICAgICAgICAgICAgICAgIkNvcyIgfSwKKyAgICB7IDB4MDIsICAgICAgICAgICAgICAgICAgICJNZXRyaWMgMSIgfSwKKyAgICB7IDB4MDQsICAgICAgICAgICAgICAgICAgICJNZXRyaWMgMiIgfSwKKyAgICB7IDB4MDgsICAgICAgICAgICAgICAgICAgICJDQ0MgU3RhdHVzIiB9LAorICAgIHsgMHgxMCwgICAgICAgICAgICAgICAgICAgIlBhdGggVHlwZSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisjZGVmaW5lIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ST1VUSU5HIDI0CisjZGVmaW5lIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9OT1RJRlkgIDI1CisjZGVmaW5lIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ESUZGU0VSVl9URSAyOAorI2RlZmluZSBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfRElGRlNFUlZfVEVfT0xEIDEyNQorCitzdGF0aWMgc3RydWN0IHRvayByc3ZwX29ial9lcnJvcl9jb2RlX3ZhbHVlc1tdID0geworICAgIHsgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX1JPVVRJTkcsICJSb3V0aW5nIFByb2JsZW0iIH0sCisgICAgeyBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfTk9USUZZLCAgIk5vdGlmeSBFcnJvciIgfSwKKyAgICB7IFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ESUZGU0VSVl9URSwgIkRpZmZzZXJ2IFRFIEVycm9yIiB9LAorICAgIHsgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX0RJRkZTRVJWX1RFX09MRCwgIkRpZmZzZXJ2IFRFIEVycm9yIChPbGQpIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2Vycm9yX2NvZGVfcm91dGluZ192YWx1ZXNbXSA9IHsKKyAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICJCYWQgRVhQTElDSVRfUk9VVEUgb2JqZWN0IiB9LAorICAgIHsgMiwgICAgICAgICAgICAgICAgICAgICAgIkJhZCBzdHJpY3Qgbm9kZSIgfSwKKyAgICB7IDMsICAgICAgICAgICAgICAgICAgICAgICJCYWQgbG9vc2Ugbm9kZSIgfSwKKyAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICJCYWQgaW5pdGlhbCBzdWJvYmplY3QiIH0sCisgICAgeyA1LCAgICAgICAgICAgICAgICAgICAgICAiTm8gcm91dGUgYXZhaWxhYmxlIHRvd2FyZCBkZXN0aW5hdGlvbiIgfSwKKyAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgICJVbmFjY2VwdGFibGUgbGFiZWwgdmFsdWUiIH0sCisgICAgeyA3LCAgICAgICAgICAgICAgICAgICAgICAiUlJPIGluZGljYXRlZCByb3V0aW5nIGxvb3BzIiB9LAorICAgIHsgOCwgICAgICAgICAgICAgICAgICAgICAgIm5vbi1SU1ZQLWNhcGFibGUgcm91dGVyIGluIHRoZSBwYXRoIiB9LAorICAgIHsgOSwgICAgICAgICAgICAgICAgICAgICAgIk1QTFMgbGFiZWwgYWxsb2NhdGlvbiBmYWlsdXJlIiB9LAorICAgIHsgMTAsICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIEwzUElEIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2Vycm9yX2NvZGVfZGlmZnNlcnZfdGVfdmFsdWVzW10gPSB7CisgICAgeyAxLCAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBDVCBvYmplY3QiIH0sCisgICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgQ1QiIH0sCisgICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDVCB2YWx1ZSIgfSwKKyAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICJDVC9zZXR1cCBwcmlvcml0eSBkbyBub3QgZm9ybSBhIGNvbmZpZ3VyZWQgVEUtQ2xhc3MiIH0sCisgICAgeyA1LCAgICAgICAgICAgICAgICAgICAgICAiQ1QvaG9sZGluZyBwcmlvcml0eSBkbyBub3QgZm9ybSBhIGNvbmZpZ3VyZWQgVEUtQ2xhc3MiIH0sCisgICAgeyA2LCAgICAgICAgICAgICAgICAgICAgICAiQ1Qvc2V0dXAgcHJpb3JpdHkgYW5kIENUL2hvbGRpbmcgcHJpb3JpdHkgZG8gbm90IGZvcm0gYSBjb25maWd1cmVkIFRFLUNsYXNzIiB9LAorICAgIHsgNywgICAgICAgICAgICAgICAgICAgICAgIkluY29uc2lzdGVuY3kgYmV0d2VlbiBzaWduYWxlZCBQU0MgYW5kIHNpZ25hbGVkIENUIiB9LCAKKyAgICB7IDgsICAgICAgICAgICAgICAgICAgICAgICJJbmNvbnNpc3RlbmN5IGJldHdlZW4gc2lnbmFsZWQgUEhCcyBhbmQgc2lnbmFsZWQgQ1QiIH0sCisgICB7IDAsIE5VTEx9Cit9OworCisvKiByZmMzNDczIC8gcmZjIDM0NzEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2FkbWluX3N0YXR1c19mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHg4MDAwMDAwMCwgIlJlZmxlY3QiIH0sCisgICAgeyAweDAwMDAwMDA0LCAiVGVzdGluZyIgfSwKKyAgICB7IDB4MDAwMDAwMDIsICJBZG1pbi1kb3duIiB9LAorICAgIHsgMHgwMDAwMDAwMSwgIkRlbGV0ZS1pbi1wcm9ncmVzcyIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCisvKiBsYWJlbCBzZXQgYWN0aW9ucyAtIHJmYzM0NzEgKi8KKyNkZWZpbmUgTEFCRUxfU0VUX0lOQ0xVU0lWRV9MSVNUICAwCisjZGVmaW5lIExBQkVMX1NFVF9FWENMVVNJVkVfTElTVCAgMQorI2RlZmluZSBMQUJFTF9TRVRfSU5DTFVTSVZFX1JBTkdFIDIKKyNkZWZpbmUgTEFCRUxfU0VUX0VYQ0xVU0lWRV9SQU5HRSAzCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2xhYmVsX3NldF9hY3Rpb25fdmFsdWVzW10gPSB7CisgICAgeyBMQUJFTF9TRVRfSU5DTFVTSVZFX0xJU1QsICJJbmNsdXNpdmUgbGlzdCIgfSwKKyAgICB7IExBQkVMX1NFVF9FWENMVVNJVkVfTElTVCwgIkV4Y2x1c2l2ZSBsaXN0IiB9LAorICAgIHsgTEFCRUxfU0VUX0lOQ0xVU0lWRV9SQU5HRSwgIkluY2x1c2l2ZSByYW5nZSIgfSwKKyAgICB7IExBQkVMX1NFVF9FWENMVVNJVkVfUkFOR0UsICJFeGNsdXNpdmUgcmFuZ2UiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworLyogT0lGIFJTVlAgZXh0ZW5zaW9ucyBVTkkgMS4wIFNpZ25hbGluZywgcmVsZWFzZSAyICovCisjZGVmaW5lIFJTVlBfR0VOX1VOSV9TVUJPQkpfU09VUkNFX1ROQV9BRERSRVNTCSAgICAxCisjZGVmaW5lIFJTVlBfR0VOX1VOSV9TVUJPQkpfREVTVElOQVRJT05fVE5BX0FERFJFU1MgMgorI2RlZmluZSBSU1ZQX0dFTl9VTklfU1VCT0JKX0RJVkVSU0lUWQkJICAgIDMKKyNkZWZpbmUgUlNWUF9HRU5fVU5JX1NVQk9CSl9FR1JFU1NfTEFCRUwgICAgICAgICAgICA0CisjZGVmaW5lIFJTVlBfR0VOX1VOSV9TVUJPQkpfU0VSVklDRV9MRVZFTCAgICAgICAgICAgNQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX29ial9nZW5lcmFsaXplZF91bmlfdmFsdWVzW10gPSB7CisgICAgeyBSU1ZQX0dFTl9VTklfU1VCT0JKX1NPVVJDRV9UTkFfQUREUkVTUywgIlNvdXJjZSBUTkEgYWRkcmVzcyIgfSwKKyAgICB7IFJTVlBfR0VOX1VOSV9TVUJPQkpfREVTVElOQVRJT05fVE5BX0FERFJFU1MsICJEZXN0aW5hdGlvbiBUTkEgYWRkcmVzcyIgfSwKKyAgICB7IFJTVlBfR0VOX1VOSV9TVUJPQkpfRElWRVJTSVRZLCAiRGl2ZXJzaXR5IiB9LAorICAgIHsgUlNWUF9HRU5fVU5JX1NVQk9CSl9FR1JFU1NfTEFCRUwsICJFZ3Jlc3MgbGFiZWwiIH0sCisgICAgeyBSU1ZQX0dFTl9VTklfU1VCT0JKX1NFUlZJQ0VfTEVWRUwsICJTZXJ2aWNlIGxldmVsIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgcnN2cF9pbnRzZXJ2X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X3Nob3J0KTsKKworLyogCisgKiB0aGlzIGlzIGEgZGlzc2VjdG9yIGZvciBhbGwgdGhlIGludHNlcnYgZGVmaW5lZAorICogc3BlY3MgYXMgZGVmaW5lZCBwZXIgcmZjMjIxNQorICogaXQgaXMgY2FsbGVkIGZyb20gdmFyaW91cyByc3ZwIG9iamVjdHM7CisgKiByZXR1cm5zIHRoZSBhbW91bnQgb2YgYnl0ZXMgYmVpbmcgcHJvY2Vzc2VkCisgKi8KK3N0YXRpYyBpbnQKK3JzdnBfaW50c2Vydl9wcmludChjb25zdCB1X2NoYXIgKnRwdHIsIHVfc2hvcnQgb2JqX3RsZW4pIHsKKworICAgIGludCBwYXJhbWV0ZXJfaWQscGFyYW1ldGVyX2xlbmd0aDsKKyAgICB1bmlvbiB7CisJZmxvYXQgZjsKKwl1X2ludDMyX3QgaTsKKyAgICB9IGJ3OworCisgICAgaWYgKG9ial90bGVuIDwgNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcGFyYW1ldGVyX2lkID0gKih0cHRyKTsKKyAgICBwYXJhbWV0ZXJfbGVuZ3RoID0gRVhUUkFDVF8xNkJJVFModHB0cisyKTw8MjsgLyogY29udmVydCB3b3JkY291bnQgdG8gYnl0ZWNvdW50ICovCisKKyAgICBwcmludGYoIlxuXHQgICAgICBQYXJhbWV0ZXIgSUQ6ICVzICgldSksIGxlbmd0aDogJXUsIEZsYWdzOiBbMHglMDJ4XSIsCisgICAgICAgICAgIHRvazJzdHIocnN2cF9pbnRzZXJ2X3BhcmFtZXRlcl9pZF92YWx1ZXMsInVua25vd24iLHBhcmFtZXRlcl9pZCksCisgICAgICAgICAgIHBhcmFtZXRlcl9pZCwKKyAgICAgICAgICAgcGFyYW1ldGVyX2xlbmd0aCwKKyAgICAgICAgICAgKih0cHRyKzEpKTsKKworICAgIGlmIChvYmpfdGxlbiA8IHBhcmFtZXRlcl9sZW5ndGgrNCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3dpdGNoKHBhcmFtZXRlcl9pZCkgeyAvKiBwYXJhbWV0ZXJfaWQgKi8KKworICAgIGNhc2UgNDoKKyAgICAgICAvKgorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgICA0IChlKSAgICAgIHwgICAgKGYpICAgICAgICB8ICAgICAgICAgICAxIChnKSAgICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqIHwgICAgICAgIElTIGhvcCBjbnQgKDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyKSAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhcmFtZXRlcl9sZW5ndGggPT0gNCkKKyAgICAgICAgICAgIHByaW50ZigiXG5cdFx0SVMgaG9wIGNvdW50OiAldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNjoKKyAgICAgICAvKgorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgICA2IChoKSAgICAgIHwgICAgKGkpICAgICAgICB8ICAgICAgICAgICAxIChqKSAgICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqIHwgIFBhdGggYi93IGVzdGltYXRlICAoMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyKSAgICAgICB8CisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhcmFtZXRlcl9sZW5ndGggPT0gNCkgeworICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCk7CisgICAgICAgICAgICBwcmludGYoIlxuXHRcdFBhdGggYi93IGVzdGltYXRlOiAlLjEwZyBNYnBzIiwgYncuZi8xMjUwMDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA4OgorICAgICAgIC8qCisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKiB8ICAgICA4IChrKSAgICAgfCAgICAobCkgICAgICAgIHwgICAgICAgICAgIDEgKG0pICAgICAgICAgICAgICAgfAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgICAgICAgTWluaW11bSBwYXRoIGxhdGVuY3kgKDMyLWJpdCBpbnRlZ2VyKSAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqLworICAgICAgICBpZiAocGFyYW1ldGVyX2xlbmd0aCA9PSA0KSB7CisgICAgICAgICAgICBwcmludGYoIlxuXHRcdE1pbmltdW0gcGF0aCBsYXRlbmN5OiAiKTsKKyAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyh0cHRyKzQpID09IDB4ZmZmZmZmZmYpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJkb24ndCBjYXJlIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCIldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxMDoKKworICAgICAgIC8qCisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKiB8ICAgICAxMCAobikgICAgfCAgICAgIChvKSAgICAgIHwgICAgICAgICAgIDEgKHApICAgICAgICAgICAgICAgfAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgICAgIENvbXBvc2VkIE1UVSAoMzItYml0IHVuc2lnbmVkIGludGVnZXIpICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqLworICAgICAgICBpZiAocGFyYW1ldGVyX2xlbmd0aCA9PSA0KQorICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRDb21wb3NlZCBNVFU6ICV1IGJ5dGVzIiwgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI3OgorICAgICAgIC8qIAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgIDEyNyAoZSkgICAgIHwgICAgMCAoZikgICAgICB8ICAgICAgICAgICAgIDUgKGcpICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqIHwgIFRva2VuIEJ1Y2tldCBSYXRlIFtyXSAoMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyKSAgICB8CisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKiB8ICBUb2tlbiBCdWNrZXQgU2l6ZSBbYl0gKDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcikgICAgfAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgUGVhayBEYXRhIFJhdGUgW3BdICgzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCBudW1iZXIpICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqIHwgIE1pbmltdW0gUG9saWNlZCBVbml0IFttXSAoMzItYml0IGludGVnZXIpICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKiB8ICBNYXhpbXVtIFBhY2tldCBTaXplIFtNXSAgKDMyLWJpdCBpbnRlZ2VyKSAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICovCisKKyAgICAgICAgaWYgKHBhcmFtZXRlcl9sZW5ndGggPT0gMjApIHsKKyAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKzQpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRUb2tlbiBCdWNrZXQgUmF0ZTogJS4xMGcgTWJwcyIsIGJ3LmYvMTI1MDAwKTsKKyAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKzgpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRUb2tlbiBCdWNrZXQgU2l6ZTogJS4xMGcgYnl0ZXMiLCBidy5mKTsKKyAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKzEyKTsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdFx0UGVhayBEYXRhIFJhdGU6ICUuMTBnIE1icHMiLCBidy5mLzEyNTAwMCk7CisgICAgICAgICAgICBwcmludGYoIlxuXHRcdE1pbmltdW0gUG9saWNlZCBVbml0OiAldSBieXRlcyIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrMTYpKTsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdFx0TWF4aW11bSBQYWNrZXQgU2l6ZTogJXUgYnl0ZXMiLCBFWFRSQUNUXzMyQklUUyh0cHRyKzIwKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDEzMDoKKyAgICAgICAvKiAKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqIHwgICAgIDEzMCAoaCkgICB8ICAgIDAgKGkpICAgICAgfCAgICAgICAgICAgIDIgKGopICAgICAgICAgICAgICB8CisgICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgKiB8ICBSYXRlIFtSXSAgKDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcikgICAgICAgICAgICAgICAgfAorICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICogfCAgU2xhY2sgVGVybSBbU10gICgzMi1iaXQgaW50ZWdlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAqLworCisgICAgICAgIGlmIChwYXJhbWV0ZXJfbGVuZ3RoID09IDgpIHsKKyAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKzQpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRSYXRlOiAlLjEwZyBNYnBzIiwgYncuZi8xMjUwMDApOworICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRTbGFjayBUZXJtOiAldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrOCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxMzM6CisgICAgY2FzZSAxMzQ6CisgICAgY2FzZSAxMzU6CisgICAgY2FzZSAxMzY6CisgICAgICAgIGlmIChwYXJhbWV0ZXJfbGVuZ3RoID09IDQpCisgICAgICAgICAgICBwcmludGYoIlxuXHRcdFZhbHVlOiAldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrNCwiXG5cdFx0IixwYXJhbWV0ZXJfbGVuZ3RoKTsKKyAgICB9CisgICAgcmV0dXJuIChwYXJhbWV0ZXJfbGVuZ3RoKzQpOyAvKiBoZWFkZXIgbGVuZ3RoIDQgYnl0ZXMgKi8KK30KKworc3RhdGljIGludAorcnN2cF9vYmpfcHJpbnQgKGNvbnN0IHVfY2hhciAqdHB0ciwgY29uc3QgY2hhciAqaWRlbnQsIHVfaW50IHRsZW4pIHsKKworICAgIGNvbnN0IHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIgKnJzdnBfb2JqX2hlYWRlcjsKKyAgICBjb25zdCB1X2NoYXIgKm9ial90cHRyOworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IHJzdnBfb2JqX2ludGVncml0eV90ICpyc3ZwX29ial9pbnRlZ3JpdHk7CisgICAgICAgIGNvbnN0IHN0cnVjdCByc3ZwX29ial9mcnJfdCAqcnN2cF9vYmpfZnJyOworICAgIH0gb2JqX3B0cjsKKworICAgIHVfc2hvcnQgcnN2cF9vYmpfbGVuLHJzdnBfb2JqX2N0eXBlLG9ial90bGVuLGludHNlcnZfc2Vydl90bGVuOworICAgIGludCBoZXhkdW1wLHByb2Nlc3NlZCxwYWRieXRlcyxlcnJvcl9jb2RlLGVycm9yX3ZhbHVlLGk7CisgICAgdW5pb24geworCWZsb2F0IGY7CisJdV9pbnQzMl90IGk7CisgICAgfSBidzsKKyAgICB1X2ludDhfdCBuYW1lbGVuOworCisgICAgdV9pbnQgYWN0aW9uLCBzdWJjaGFubmVsOworCisgICAgd2hpbGUodGxlbj49c2l6ZW9mKHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIpKSB7CisgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG9iamVjdCBoZWFkZXIgPyAqLworICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIpKSkKKyAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgcnN2cF9vYmpfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIgKil0cHRyOworICAgICAgICByc3ZwX29ial9sZW49RVhUUkFDVF8xNkJJVFMocnN2cF9vYmpfaGVhZGVyLT5sZW5ndGgpOworICAgICAgICByc3ZwX29ial9jdHlwZT1yc3ZwX29ial9oZWFkZXItPmN0eXBlOworCisgICAgICAgIGlmKHJzdnBfb2JqX2xlbiAlIDQpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNFUlJPUjogb2JqZWN0IGhlYWRlciBzaXplICV1IG5vdCBhIG11bHRpcGxlIG9mIDQiLCBpZGVudCwgcnN2cF9vYmpfbGVuKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZihyc3ZwX29ial9sZW4gPCBzaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcikpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNFUlJPUjogb2JqZWN0IGhlYWRlciB0b28gc2hvcnQgJXUgPCAlbHUiLCBpZGVudCwgcnN2cF9vYmpfbGVuLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwcmludGYoIiVzJXMgT2JqZWN0ICgldSkgRmxhZ3M6IFslcyIsCisgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgIHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSwKKyAgICAgICAgICAgICAgIHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtLAorICAgICAgICAgICAgICAgKChyc3ZwX29ial9oZWFkZXItPmNsYXNzX251bSkmMHg4MCkgPyAiaWdub3JlIiA6ICJyZWplY3QiKTsKKworICAgICAgICBpZiAocnN2cF9vYmpfaGVhZGVyLT5jbGFzc19udW0gPiAxMjgpCisgICAgICAgICAgICBwcmludGYoIiAlcyIsCisgICAgICAgICAgICAgICAgICAgKChyc3ZwX29ial9oZWFkZXItPmNsYXNzX251bSkmMHg0MCkgPyAiYW5kIGZvcndhcmQiIDogInNpbGVudGx5Iik7CisKKyAgICAgICAgcHJpbnRmKCIgaWYgdW5rbm93bl0sIENsYXNzLVR5cGU6ICVzICgldSksIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX2N0eXBlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAoKHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKTw8OCkrcnN2cF9vYmpfY3R5cGUpLAorICAgICAgICAgICAgICAgcnN2cF9vYmpfY3R5cGUsCisgICAgICAgICAgICAgICByc3ZwX29ial9sZW4pOworICAgIAorICAgICAgICBpZih0bGVuIDwgcnN2cF9vYmpfbGVuKSB7CisgICAgICAgICAgICBwcmludGYoIiVzRVJST1I6IG9iamVjdCBnb2VzIHBhc3QgZW5kIG9mIG9iamVjdHMgVExWIiwgaWRlbnQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgb2JqX3RwdHI9dHB0citzaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcik7CisgICAgICAgIG9ial90bGVuPXJzdnBfb2JqX2xlbi1zaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcik7CisKKyAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0ID8gKi8KKyAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHJzdnBfb2JqX2xlbikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGhleGR1bXA9RkFMU0U7CisKKyAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSB7CisgICAgICAgIGNhc2UgUlNWUF9PQkpfU0VTU0lPTjoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjQgRGVzdEFkZHJlc3M6ICVzLCBQcm90b2NvbCBJRDogMHglMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyK3NpemVvZihzdHJ1Y3QgaW5fYWRkcikpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBGbGFnczogWzB4JTAyeF0sIERlc3RQb3J0ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrNSksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY2OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDIwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NiBEZXN0QWRkcmVzczogJXMsIFByb3RvY29sIElEOiAweCUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyK3NpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRmxhZ3M6IFsweCUwMnhdLCBEZXN0UG9ydCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyK3NpemVvZihzdHJ1Y3QgaW42X2FkZHIpKzEpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0citzaXplb2Yoc3RydWN0IGluNl9hZGRyKSsyKSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTIwOworICAgICAgICAgICAgICAgIG9ial90cHRyKz0yMDsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9UVU5ORUxfSVBWNjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAzNikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjYgVHVubmVsIEVuZFBvaW50OiAlcywgVHVubmVsIElEOiAweCUwNHgsIEV4dGVuZGVkIFR1bm5lbCBJRDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxOCksCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKzIwKSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTM2OworICAgICAgICAgICAgICAgIG9ial90cHRyKz0zNjsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9UVU5ORUxfSVBWNDoKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9VTklfSVBWNDoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAxMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjQgVHVubmVsIEVuZFBvaW50OiAlcywgVHVubmVsIElEOiAweCUwNHgsIEV4dGVuZGVkIFR1bm5lbCBJRDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpLAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKzgpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09MTI7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTEyOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9DT05GSVJNOgorICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNDoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NCBSZWNlaXZlciBBZGRyZXNzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIElORVQ2CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjYgUmVjZWl2ZXIgQWRkcmVzczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX05PVElGWV9SRVE6CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY0OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJUHY0IE5vdGlmeSBOb2RlIEFkZHJlc3M6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgSU5FVDYKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY2OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJUHY2IE5vdGlmeSBOb2RlIEFkZHJlc3M6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOworICAgICAgICAgICAgICAgIG9ial90cHRyKz1zaXplb2Yoc3RydWN0IGluNl9hZGRyKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9TVUdHRVNURURfTEFCRUw6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFJTVlBfT0JKX1VQU1RSRUFNX0xBQkVMOiAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgUlNWUF9PQkpfUkVDT1ZFUllfTEFCRUw6ICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBSU1ZQX09CSl9MQUJFTDoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6CisgICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTGFiZWw6ICV1IiwgaWRlbnQsIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBHZW5lcmFsaXplZCBMYWJlbDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8zOgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDEyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBXYXZlYmFuZCBJRDogJXUlcyAgU3RhcnQgTGFiZWw6ICV1LCBTdG9wIExhYmVsOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrOCkpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT0xMjsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9MTI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlNWUF9PQkpfU1RZTEU6CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFJlc2VydmF0aW9uIFN0eWxlOiAlcywgRmxhZ3M6IFsweCUwMnhdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9yZXNzdHlsZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKG9ial90cHRyKzEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cikpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgIG9ial90cHRyKz00OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX1NFTkRFUl9URU1QTEFURToKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBTb3VyY2UgUG9ydDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjY6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBBZGRyZXNzOiAlcywgU291cmNlIFBvcnQ6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMTgpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09MjA7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTIwOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfVFVOTkVMX0lQVjQ6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NCBUdW5uZWwgU2VuZGVyIEFkZHJlc3M6ICVzLCBMU1AtSUQ6IDB4JTA0eCIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT04OworICAgICAgICAgICAgICAgIG9ial90cHRyKz04OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX0xBQkVMX1JFUToKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6CisgICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTDMgUHJvdG9jb2wgSUQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBQcm90b2NvbCAoMHglMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpKSk7CisgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAxMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTDMgUHJvdG9jb2wgSUQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBQcm90b2NvbCAoMHglMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiwlcyBtZXJnZSBjYXBhYmlsaXR5IiwoKCoob2JqX3RwdHIrNCkpJjB4ODApID8gIm5vIiA6ICIiICk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTWluaW11bSBWUEkvVkNJOiAldS8ldSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNCkpJjB4ZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpJjB4ZmZmKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBNYXhpbXVtIFZQSS9WQ0k6ICV1LyV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cis4KSkmMHhmZmYsCisgICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxMCkpJjB4ZmZmKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09MTI7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTEyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzM6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMTIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEwzIFByb3RvY29sIElEOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gUHJvdG9jb2wgKDB4JTA0eCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTWluaW11bS9NYXhpbXVtIERMQ0k6ICV1LyV1LCAlcyVzIGJpdCBETENJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSkmMHg3ZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis4KSkmMHg3ZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICgoKEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzQpPj43KSYzKSA9PSAwICkgPyAiMTAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICgoKEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzQpPj43KSYzKSA9PSAyICkgPyAiMjMiIDogIiIpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT0xMjsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9MTI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfNDoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBMU1AgRW5jb2RpbmcgVHlwZTogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX2VuY29kaW5nX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9ial90cHRyKSwKKwkJICAgICAgICpvYmpfdHB0cik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU3dpdGNoaW5nIFR5cGU6ICVzICgldSksIFBheWxvYWQgSUQ6ICVzICgweCUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZ21wbHNfc3dpdGNoX2NhcF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrMSkpLAorCQkgICAgICAgKihvYmpfdHB0cisxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihnbXBsc19wYXlsb2FkX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpLAorCQkgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgIG9ial90cHRyKz00OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX1JSTzoKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9FUk86CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY0OgorICAgICAgICAgICAgICAgIHdoaWxlKG9ial90bGVuID49IDQgKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFN1Ym9iamVjdCBUeXBlOiAlcywgbGVuZ3RoICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial94cm9fdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTVlBfT0JKX1hST19NQVNLX1NVQk9CSigqb2JqX3RwdHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrMSkpOyAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgICAgICBpZiAoKihvYmpfdHB0cisxKSA9PSAwKSB7IC8qIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEVSUk9SOiB6ZXJvIGxlbmd0aCBFUk8gc3VidHlwZSIsaWRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goUlNWUF9PQkpfWFJPX01BU0tfU1VCT0JKKCpvYmpfdHB0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1ZQX09CSl9YUk9fSVBWNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcywgJXMvJXUsIEZsYWdzOiBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU1ZQX09CSl9YUk9fTUFTS19MT09TRSgqb2JqX3RwdHIpID8gIkxvb3NlIiA6ICJTdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cis2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKHJzdnBfb2JqX3Jyb19mbGFnX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKzcpKSk7IC8qIHJmYzMyMDkgc2F5cyB0aGF0IHRoaXMgZmllbGQgaXMgcnN2ZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbi09KihvYmpfdHB0cisxKTsKKyAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPSoob2JqX3RwdHIrMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX0hFTExPOgorICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8yOgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBJbnN0YW5jZTogMHglMDh4LCBEZXN0aW5hdGlvbiBJbnN0YW5jZTogMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT04OworICAgICAgICAgICAgICAgIG9ial90cHRyKz04OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX1JFU1RBUlRfQ0FQQUJJTElUWToKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgUmVzdGFydCAgVGltZTogJXVtcywgUmVjb3ZlcnkgVGltZTogJXVtcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9TRVNTSU9OX0FUVFJJQlVURToKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIG5hbWVsZW4gPSAqKG9ial90cHRyKzMpOworICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQrbmFtZWxlbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU2Vzc2lvbiBOYW1lOiAiLCBpZGVudCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hbWVsZW47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgc2FmZXB1dGNoYXIoKihvYmpfdHB0cis0K2kpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTZXR1cCBQcmlvcml0eTogJXUsIEhvbGRpbmcgUHJpb3JpdHk6ICV1LCBGbGFnczogWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KSpvYmpfdHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludCkqKG9ial90cHRyKzEpLAorICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfc2Vzc2lvbl9hdHRyaWJ1dGVfZmxhZ192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrMikpKTsKKworICAgICAgICAgICAgICAgIG9ial90bGVuLT00Kyoob2JqX3RwdHIrMyk7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQrKihvYmpfdHB0ciszKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKwljYXNlIFJTVlBfT0JKX0dFTkVSQUxJWkVEX1VOSToKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworCQlpbnQgc3Vib2JqX3R5cGUsYWYsc3Vib2JqX2xlbix0b3RhbF9zdWJvYmpfbGVuOworCisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMTogCisKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKworCQkvKiByZWFkIHZhcmlhYmxlIGxlbmd0aCBzdWJvYmplY3RzICovCisJCXRvdGFsX3N1Ym9ial9sZW4gPSBvYmpfdGxlbjsKKyAgICAgICAgICAgICAgICB3aGlsZSh0b3RhbF9zdWJvYmpfbGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdWJvYmpfbGVuICA9IEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3Vib2JqX3R5cGUgPSAoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpPj44OworICAgICAgICAgICAgICAgICAgICBhZiA9IChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSkmMHgwMEZGOworCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFN1Ym9iamVjdCBUeXBlOiAlcyAoJXUpLCBBRjogJXMgKCV1KSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfZ2VuZXJhbGl6ZWRfdW5pX3ZhbHVlcywgIlVua25vd24iLCBzdWJvYmpfdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJvYmpfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYWZfdmFsdWVzLCAiVW5rbm93biIsIGFmKSwgYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJvYmpfbGVuKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc3Vib2JqX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1ZQX0dFTl9VTklfU1VCT0JKX1NPVVJDRV9UTkFfQUREUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1ZQX0dFTl9VTklfU1VCT0JKX0RFU1RJTkFUSU9OX1ROQV9BRERSRVNTOgorCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goYWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUZOVU1fSU5FVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbiA8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIFVOSSBJUHY0IFROQSBhZGRyZXNzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCBpcGFkZHJfc3RyaW5nKG9ial90cHRyKzQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBRk5VTV9JTkVUNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbiA8IDIwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgICBVTkkgSVB2NiBUTkEgYWRkcmVzczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIrNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFGTlVNX05TQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ym9ial9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5sZXNzIHdlIGhhdmUgYSBUTFYgcGFyc2VyIGxldHMganVzdCBoZXhkdW1wICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFJTVlBfR0VOX1VOSV9TVUJPQkpfRElWRVJTSVRZOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ym9ial9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmxlc3Mgd2UgaGF2ZSBhIFRMViBwYXJzZXIgbGV0cyBqdXN0IGhleGR1bXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIFJTVlBfR0VOX1VOSV9TVUJPQkpfRUdSRVNTX0xBQkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ym9ial9sZW4gPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgICBVLWJpdDogJXgsIExhYmVsIHR5cGU6ICV1LCBMb2dpY2FsIHBvcnQgaWQ6ICV1LCBMYWJlbDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpPj4zMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSkmMHhGRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrMTIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9HRU5fVU5JX1NVQk9CSl9TRVJWSUNFX0xFVkVMOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Ym9ial9sZW4gPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIFNlcnZpY2UgbGV2ZWw6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwgKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKT4+MjQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdGFsX3N1Ym9ial9sZW4tPXN1Ym9ial9sZW47CisgICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz1zdWJvYmpfbGVuOworICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbis9c3Vib2JqX2xlbjsKKwkJfQorCisgICAgICAgICAgICAgICAgaWYgKHRvdGFsX3N1Ym9ial9sZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdW5sZXNzIHdlIGhhdmUgYSBUTFYgcGFyc2VyIGxldHMganVzdCBoZXhkdW1wICovCisgICAgICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9SU1ZQX0hPUDoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzM6IC8qIGZhbGwgdGhyb3VnaCAtIEZJWE1FIGFkZCBUTFYgcGFyc2VyICovCisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNDoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBQcmV2aW91cy9OZXh0IEludGVyZmFjZTogJXMsIExvZ2ljYWwgSW50ZXJmYWNlIEhhbmRsZTogMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTg7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTg7CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuKQorICAgICAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7IC8qIHVubGVzcyB3ZSBoYXZlIGEgVExWIHBhcnNlciBsZXRzIGp1c3QgaGV4ZHVtcCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIElORVQ2CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfNDogLyogZmFsbCB0aHJvdWdoIC0gRklYTUUgYWRkIFRMViBwYXJzZXIgKi8KKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY2OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDIwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBQcmV2aW91cy9OZXh0IEludGVyZmFjZTogJXMsIExvZ2ljYWwgSW50ZXJmYWNlIEhhbmRsZTogMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrMTYpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09MjA7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTIwOworICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsgLyogdW5sZXNzIHdlIGhhdmUgYSBUTFYgcGFyc2VyIGxldHMganVzdCBoZXhkdW1wICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9USU1FX1ZBTFVFUzoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgUmVmcmVzaCBQZXJpb2Q6ICV1bXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogdGhvc2UgdGhyZWUgb2JqZWN0cyBkbyBzaGFyZSB0aGUgc2FtZSBzZW1hbnRpY3MgKi8KKyAgICAgICAgY2FzZSBSU1ZQX09CSl9TRU5ERVJfVFNQRUM6CisgICAgICAgIGNhc2UgUlNWUF9PQkpfQURTUEVDOgorICAgICAgICBjYXNlIFJTVlBfT0JKX0ZMT1dTUEVDOgorICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBNc2ctVmVyc2lvbjogJXUsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpvYmpfdHB0ciAmIDB4ZjApID4+IDQsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpPDwyKTsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsgLyogZ2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VydmljZSBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKworICAgICAgICAgICAgICAgIHdoaWxlIChvYmpfdGxlbiA+PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGludHNlcnZfc2Vydl90bGVuPUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpPDwyOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTZXJ2aWNlIFR5cGU6ICVzICgldSksIGJyZWFrIGJpdCAlcyBzZXQsIFNlcnZpY2UgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9pbnRzZXJ2X3NlcnZpY2VfdHlwZV92YWx1ZXMsInVua25vd24iLCoob2JqX3RwdHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoob2JqX3RwdHIrMSkmMHg4MCkgPyAiIiA6ICJub3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50c2Vydl9zZXJ2X3RsZW4pOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7IC8qIGdldCB0byB0aGUgc3RhcnQgb2YgdGhlIHBhcmFtZXRlciBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbnRzZXJ2X3NlcnZfdGxlbj49NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkID0gcnN2cF9pbnRzZXJ2X3ByaW50KG9ial90cHRyLCBvYmpfdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbi09cHJvY2Vzc2VkOworICAgICAgICAgICAgICAgICAgICAgICAgaW50c2Vydl9zZXJ2X3RsZW4tPXByb2Nlc3NlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz1wcm9jZXNzZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlNWUF9PQkpfRklMVEVSU1BFQzoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBTb3VyY2UgUG9ydDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjY6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBBZGRyZXNzOiAlcywgU291cmNlIFBvcnQ6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMTgpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09MjA7CisgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTIwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzM6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBBZGRyZXNzOiAlcywgRmxvdyBMYWJlbDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhvYmpfdHB0cisxNykpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT0yMDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9MjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfVFVOTkVMX0lQVjY6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBBZGRyZXNzOiAlcywgTFNQLUlEOiAweCUwNHgiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzE4KSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTIwOworICAgICAgICAgICAgICAgIG9ial90cHRyKz0yMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNvdXJjZSBBZGRyZXNzOiAlcywgTFNQLUlEOiAweCUwNHgiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9GQVNUUkVST1VURToKKyAgICAgICAgICAgIC8qIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGMtdHlwZSAxIGFuZCA3IGFyZSBtaW5vciAqLworICAgICAgICAgICAgb2JqX3B0ci5yc3ZwX29ial9mcnIgPSAoY29uc3Qgc3RydWN0IHJzdnBfb2JqX2Zycl90ICopb2JqX3RwdHI7CisgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmJhbmR3aWR0aCk7CisKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6IC8qIG5ldyBzdHlsZSAqLworICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgcnN2cF9vYmpfZnJyX3QpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTZXR1cCBQcmlvcml0eTogJXUsIEhvbGRpbmcgUHJpb3JpdHk6ICV1LCBIb3AtbGltaXQ6ICV1LCBCYW5kd2lkdGg6ICUuMTBnIE1icHMiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGludClvYmpfcHRyLnJzdnBfb2JqX2Zyci0+c2V0dXBfcHJpbywKKyAgICAgICAgICAgICAgICAgICAgICAgKGludClvYmpfcHRyLnJzdnBfb2JqX2Zyci0+aG9sZF9wcmlvLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KW9ial9wdHIucnN2cF9vYmpfZnJyLT5ob3BfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJbmNsdWRlLWFueTogMHglMDh4LCBFeGNsdWRlLWFueTogMHglMDh4LCBJbmNsdWRlLWFsbDogMHglMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfZnJyLT5pbmNsdWRlX2FueSksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfZnJyLT5leGNsdWRlX2FueSksCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfZnJyLT5pbmNsdWRlX2FsbCkpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT1zaXplb2Yoc3RydWN0IHJzdnBfb2JqX2Zycl90KTsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9c2l6ZW9mKHN0cnVjdCByc3ZwX29ial9mcnJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9UVU5ORUxfSVBWNDogLyogb2xkIHN0eWxlICovCisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMTYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNldHVwIFByaW9yaXR5OiAldSwgSG9sZGluZyBQcmlvcml0eTogJXUsIEhvcC1saW1pdDogJXUsIEJhbmR3aWR0aDogJS4xMGcgTWJwcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KW9ial9wdHIucnN2cF9vYmpfZnJyLT5zZXR1cF9wcmlvLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KW9ial9wdHIucnN2cF9vYmpfZnJyLT5ob2xkX3ByaW8sCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpb2JqX3B0ci5yc3ZwX29ial9mcnItPmhvcF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwKTsgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEluY2x1ZGUgQ29sb3JzOiAweCUwOHgsIEV4Y2x1ZGUgQ29sb3JzOiAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmluY2x1ZGVfYW55KSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmV4Y2x1ZGVfYW55KSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTE2OworICAgICAgICAgICAgICAgIG9ial90cHRyKz0xNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJTVlBfT0JKX0RFVE9VUjoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0OgorICAgICAgICAgICAgICAgIHdoaWxlKG9ial90bGVuID49IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgUExSLUlEOiAlcywgQXZvaWQtTm9kZS1JRDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrNCkpOyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT04OworICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlNWUF9PQkpfQ0xBU1NUWVBFOgorICAgICAgICBjYXNlIFJTVlBfT0JKX0NMQVNTVFlQRV9PTEQ6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBDVDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpJjB4Nyk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9FUlJPUl9TUEVDOgorICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMzogLyogZmFsbCB0aHJvdWdoIC0gRklYTUUgYWRkIFRMViBwYXJzZXIgKi8KKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY0OgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIGVycm9yX2NvZGU9KihvYmpfdHB0cis1KTsKKyAgICAgICAgICAgICAgICBlcnJvcl92YWx1ZT1FWFRSQUNUXzE2QklUUyhvYmpfdHB0cis2KTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBFcnJvciBOb2RlIEFkZHJlc3M6ICVzLCBGbGFnczogWzB4JTAyeF0lcyAgRXJyb3IgQ29kZTogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cis0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfZXJyb3JfY29kZV92YWx1ZXMsInVua25vd24iLGVycm9yX2NvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ST1VUSU5HOgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRXJyb3IgVmFsdWU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9lcnJvcl9jb2RlX3JvdXRpbmdfdmFsdWVzLCJ1bmtub3duIixlcnJvcl92YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX0RJRkZTRVJWX1RFOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ESUZGU0VSVl9URV9PTEQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBFcnJvciBWYWx1ZTogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX2Vycm9yX2NvZGVfZGlmZnNlcnZfdGVfdmFsdWVzLCJ1bmtub3duIixlcnJvcl92YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBVbmtub3duIEVycm9yIFZhbHVlICgldSkiLCBlcnJvcl92YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBJTkVUNgorICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzQ6IC8qIGZhbGwgdGhyb3VnaCAtIEZJWE1FIGFkZCBUTFYgcGFyc2VyICovCisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNjoKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAyMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgZXJyb3JfY29kZT0qKG9ial90cHRyKzE3KTsKKyAgICAgICAgICAgICAgICBlcnJvcl92YWx1ZT1FWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxOCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRXJyb3IgTm9kZSBBZGRyZXNzOiAlcywgRmxhZ3M6IFsweCUwMnhdJXMgIEVycm9yIENvZGU6ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKzE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfZXJyb3JfY29kZV92YWx1ZXMsInVua25vd24iLGVycm9yX2NvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX1JPVVRJTkc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBFcnJvciBWYWx1ZTogJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX2Vycm9yX2NvZGVfcm91dGluZ192YWx1ZXMsInVua25vd24iLGVycm9yX3ZhbHVlKSwKKwkJCSAgIGVycm9yX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9ial90bGVuLT0yMDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9MjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBwYWRieXRlcyA9IEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFRMViBjb3VudDogJXUsIHBhZGRpbmcgYnl0ZXM6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFkYnl0ZXMpOworICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgIG9ial90cHRyKz00OworICAgICAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhcyBsb25nIHRoZXJlIGlzIGFueXRoaW5nIGxvbmdlciB0aGFuIHRoZSBUTFYgaGVhZGVyICgyKSAqLworICAgICAgICAgICAgICAgIHdoaWxlKG9ial90bGVuID49IDIgKyBwYWRieXRlcykgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgICVzIFRMViAoMHglMDJ4KSwgbGVuZ3RoOiAldSIsIC8qIGxlbmd0aCBpbmNsdWRlcyBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9wcm9wX3Rsdl92YWx1ZXMsInVua25vd24iLCpvYmpfdHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX3RwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgKihvYmpfdHB0cisxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgICAgICBpZiAoKihvYmpfdHB0cisxKSA8IDIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShvYmpfdHB0cisyLCJcblx0XHQiLCoob2JqX3RwdHIrMSktMik7CisgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT0qKG9ial90cHRyKzEpOworICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9KihvYmpfdHB0cisxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlNWUF9PQkpfTUVTU0FHRV9JRDogICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFJTVlBfT0JKX01FU1NBR0VfSURfQUNLOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBSU1ZQX09CSl9NRVNTQUdFX0lEX0xJU1Q6CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgorICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzI6CisgICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRmxhZ3MgWzB4JTAyeF0sIGVwb2NoOiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAqb2JqX3RwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKG9ial90cHRyKzEpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICAvKiBsb29wIHRocm91Z2ggYXMgbG9uZyB0aGVyZSBhcmUgbm8gbWVzc2FnZXMgbGVmdCAqLworICAgICAgICAgICAgICAgIHdoaWxlKG9ial90bGVuID49IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgICBNZXNzYWdlLUlEIDB4JTA4eCAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7CisgICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9JTlRFR1JJVFk6CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgcnN2cF9vYmpfaW50ZWdyaXR5X3QpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eSA9IChjb25zdCBzdHJ1Y3QgcnN2cF9vYmpfaW50ZWdyaXR5X3QgKilvYmpfdHB0cjsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzICBLZXktSUQgMHglMDR4JTA4eCwgU2VxdWVuY2UgMHglMDh4JTA4eCwgRmxhZ3MgWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+a2V5X2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9pbnRlZ3JpdHktPmtleV9pZCsyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9pbnRlZ3JpdHktPnNlcXVlbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9pbnRlZ3JpdHktPnNlcXVlbmNlKzQpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKHJzdnBfb2JqX2ludGVncml0eV9mbGFnX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX3B0ci5yc3ZwX29ial9pbnRlZ3JpdHktPmZsYWdzKSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTUQ1LXN1bSAweCUwOHglMDh4JTA4eCUwOHggKHVudmVyaWZpZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5LT5kaWdlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+ZGlnZXN0KzQpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+ZGlnZXN0KzgpLAorICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+ZGlnZXN0KzEyKSk7CisgICAgICAgICAgICAgICAgb2JqX3RsZW4rPXNpemVvZihzdHJ1Y3QgcnN2cF9vYmpfaW50ZWdyaXR5X3QpOworICAgICAgICAgICAgICAgIG9ial90cHRyKz1zaXplb2Yoc3RydWN0IHJzdnBfb2JqX2ludGVncml0eV90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAKKworICAgICAgICBjYXNlIFJTVlBfT0JKX0FETUlOX1NUQVRVUzoKKyAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgeworICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6IAorICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybi0xOworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEZsYWdzIFslc10iLCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihyc3ZwX29ial9hZG1pbl9zdGF0dXNfZmxhZ192YWx1ZXMsICJub25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpKTsKKyAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKKyAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9MQUJFTF9TRVQ6CisgICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOiAKKyAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSAoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpPj44KTsKKworICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEFjdGlvbjogJXMgKCV1KSwgTGFiZWwgdHlwZTogJXUiLCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9sYWJlbF9zZXRfYWN0aW9uX3ZhbHVlcywgIlVua25vd24iLCBhY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sICgoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpICYgMHg3RikpKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBMQUJFTF9TRVRfSU5DTFVTSVZFX1JBTkdFOgorICAgICAgICAgICAgICAgIGNhc2UgTEFCRUxfU0VUX0VYQ0xVU0lWRV9SQU5HRTogLyogZmFsbCB0aHJvdWdoICovCisKKwkJICAgIC8qIG9ubHkgYSBjb3VwbGUgb2Ygc3ViY2hhbm5lbHMgYXJlIGV4cGVjdGVkICovCisJCSAgICBpZiAob2JqX3RsZW4gPCAxMikKKwkJCXJldHVybiAtMTsKKwkJICAgIHByaW50ZigiJXMgIFN0YXJ0IHJhbmdlOiAldSwgRW5kIHJhbmdlOiAldSIsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis4KSk7CisJCSAgICBvYmpfdGxlbi09MTI7CisJCSAgICBvYmpfdHB0cis9MTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7CisgICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz00OworICAgICAgICAgICAgICAgICAgICBzdWJjaGFubmVsID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFN1YmNoYW5uZWwgIyV1OiAldSIsIGlkZW50LCBzdWJjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT00OworICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2hhbm5lbCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBvYmplY3RzIHRoYXQgbGFjayBhIGRlY29kZXIKKyAgICAgICAgICogIHlvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIGNvZGUgOy0pCisgICAgICAgICAqLworCisgICAgICAgIGNhc2UgUlNWUF9PQkpfU0NPUEU6CisgICAgICAgIGNhc2UgUlNWUF9PQkpfUE9MSUNZX0RBVEE6CisgICAgICAgIGNhc2UgUlNWUF9PQkpfQUNDRVBUX0xBQkVMX1NFVDoKKyAgICAgICAgY2FzZSBSU1ZQX09CSl9QUk9URUNUSU9OOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCisgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKG9ial90cHRyLCJcblx0ICAgICIsb2JqX3RsZW4pOyAvKiBGSVhNRSBpbmRlbnRhdGlvbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZG8gd2UgYWxzbyB3YW50IHRvIHNlZSBhIGhleCBkdW1wID8gKi8KKyAgICAgICAgaWYgKHZmbGFnID4gMSB8fCBoZXhkdW1wPT1UUlVFKQorICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrc2l6ZW9mKHNpemVvZihzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyKSksIlxuXHQgICAgIiwgLyogRklYTUUgaW5kZW50YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3ZwX29ial9sZW4tc2l6ZW9mKHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIpKTsKKworICAgICAgICB0cHRyKz1yc3ZwX29ial9sZW47CisgICAgICAgIHRsZW4tPXJzdnBfb2JqX2xlbjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit0cnVuYzoKKyAgICBwcmludGYoIlxuXHRcdCBwYWNrZXQgZXhjZWVkZWQgc25hcHNob3QiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKwordm9pZAorcnN2cF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikgeworCisgICAgY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlciAqcnN2cF9jb21faGVhZGVyOworICAgIGNvbnN0IHVfY2hhciAqdHB0ciwqc3VidHB0cjsKKyAgICB1X3Nob3J0IHRsZW4sc3VidGxlbjsKKworICAgIHRwdHI9cHB0cjsKKworICAgIHJzdnBfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyICopcHB0cjsKKyAgICBUQ0hFQ0soKnJzdnBfY29tX2hlYWRlcik7CisKKyAgICAvKgorICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgorICAgICAqLworICAgIGlmIChSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpICE9IFJTVlBfVkVSU0lPTikgeworCXByaW50ZigiRVJST1I6IFJTVlAgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICBSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogaW4gbm9uLXZlcmJvc2UgbW9kZSBqdXN0IGxldHMgcHJpbnQgdGhlIGJhc2ljIE1lc3NhZ2UgVHlwZSovCisgICAgaWYgKHZmbGFnIDwgMSkgeworICAgICAgICBwcmludGYoIlJTVlB2JXUgJXMgTWVzc2FnZSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgICAgICBSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpLAorICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX21zZ190eXBlX3ZhbHVlcywgInVua25vd24gKCV1KSIscnN2cF9jb21faGVhZGVyLT5tc2dfdHlwZSksCisgICAgICAgICAgICAgICBsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogb2sgdGhleSBzZWVtIHRvIHdhbnQgdG8ga25vdyBldmVyeXRoaW5nIC0gbGV0cyBmdWxseSBkZWNvZGUgaXQgKi8KKworICAgIHRsZW49RVhUUkFDVF8xNkJJVFMocnN2cF9jb21faGVhZGVyLT5sZW5ndGgpOworCisgICAgcHJpbnRmKCJcblx0UlNWUHYldSAlcyBNZXNzYWdlICgldSksIEZsYWdzOiBbJXNdLCBsZW5ndGg6ICV1LCB0dGw6ICV1LCBjaGVja3N1bTogMHglMDR4IiwKKyAgICAgICAgICAgUlNWUF9FWFRSQUNUX1ZFUlNJT04ocnN2cF9jb21faGVhZGVyLT52ZXJzaW9uX2ZsYWdzKSwKKyAgICAgICAgICAgdG9rMnN0cihyc3ZwX21zZ190eXBlX3ZhbHVlcywgInVua25vd24sIHR5cGU6ICV1Iixyc3ZwX2NvbV9oZWFkZXItPm1zZ190eXBlKSwKKyAgICAgICAgICAgcnN2cF9jb21faGVhZGVyLT5tc2dfdHlwZSwKKyAgICAgICAgICAgYml0dG9rMnN0cihyc3ZwX2hlYWRlcl9mbGFnX3ZhbHVlcywibm9uZSIsUlNWUF9FWFRSQUNUX0ZMQUdTKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykpLAorICAgICAgICAgICB0bGVuLAorICAgICAgICAgICByc3ZwX2NvbV9oZWFkZXItPnR0bCwKKyAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocnN2cF9jb21faGVhZGVyLT5jaGVja3N1bSkpOworCisgICAgaWYgKHRsZW4gPCBzaXplb2YoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlcikpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUjogY29tbW9uIGhlYWRlciB0b28gc2hvcnQgJXUgPCAlbHUiLCB0bGVuLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKTsKKyAgICB0bGVuLT1zaXplb2YoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlcik7CisKKyAgICBzd2l0Y2gocnN2cF9jb21faGVhZGVyLT5tc2dfdHlwZSkgeworCisgICAgY2FzZSBSU1ZQX01TR1RZUEVfQUdHUkVHQVRFOgorICAgICAgICB3aGlsZSh0bGVuID4gMCkgeworICAgICAgICAgICAgc3VidHB0cj10cHRyOworICAgICAgICAgICAgcnN2cF9jb21faGVhZGVyID0gKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIgKilzdWJ0cHRyOworICAgICAgICAgICAgVENIRUNLKCpyc3ZwX2NvbV9oZWFkZXIpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpICE9IFJTVlBfVkVSU0lPTikgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IFJTVlAgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIFJTVlBfRVhUUkFDVF9WRVJTSU9OKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1YnRsZW49RVhUUkFDVF8xNkJJVFMocnN2cF9jb21faGVhZGVyLT5sZW5ndGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGYoIlxuXHQgIFJTVlB2JXUgJXMgTWVzc2FnZSAoJXUpLCBGbGFnczogWyVzXSwgbGVuZ3RoOiAldSwgdHRsOiAldSwgY2hlY2tzdW06IDB4JTA0eCIsCisgICAgICAgICAgICAgICAgICAgUlNWUF9FWFRSQUNUX1ZFUlNJT04ocnN2cF9jb21faGVhZGVyLT52ZXJzaW9uX2ZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biwgdHlwZTogJXUiLHJzdnBfY29tX2hlYWRlci0+bXNnX3R5cGUpLAorICAgICAgICAgICAgICAgICAgIHJzdnBfY29tX2hlYWRlci0+bXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihyc3ZwX2hlYWRlcl9mbGFnX3ZhbHVlcywibm9uZSIsUlNWUF9FWFRSQUNUX0ZMQUdTKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykpLAorICAgICAgICAgICAgICAgICAgIHN1YnRsZW4sCisgICAgICAgICAgICAgICAgICAgcnN2cF9jb21faGVhZGVyLT50dGwsCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocnN2cF9jb21faGVhZGVyLT5jaGVja3N1bSkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc3VidGxlbiA8IHNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGNvbW1vbiBoZWFkZXIgdG9vIHNob3J0ICV1IDwgJWx1Iiwgc3VidGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0bGVuIDwgc3VidGxlbikgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGNvbW1vbiBoZWFkZXIgdG9vIGxhcmdlICV1ID4gJXUiLCBzdWJ0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICB0bGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1YnRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKTsKKyAgICAgICAgICAgIHN1YnRsZW4tPXNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKTsKKworICAgICAgICAgICAgaWYgKHJzdnBfb2JqX3ByaW50KHN1YnRwdHIsIlxuXHQgICAgIiwgc3VidGxlbikgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB0cHRyKz1zdWJ0bGVuK3NpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKTsKKyAgICAgICAgICAgIHRsZW4tPXN1YnRsZW4rc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJTVlBfTVNHVFlQRV9QQVRIOgorICAgIGNhc2UgUlNWUF9NU0dUWVBFX1JFU1Y6CisgICAgY2FzZSBSU1ZQX01TR1RZUEVfUEFUSEVSUjoKKyAgICBjYXNlIFJTVlBfTVNHVFlQRV9SRVNWRVJSOgorICAgIGNhc2UgUlNWUF9NU0dUWVBFX1BBVEhURUFSOgorICAgIGNhc2UgUlNWUF9NU0dUWVBFX1JFU1ZURUFSOgorICAgIGNhc2UgUlNWUF9NU0dUWVBFX1JFU1ZDT05GOgorICAgIGNhc2UgUlNWUF9NU0dUWVBFX0hFTExPX09MRDoKKyAgICBjYXNlIFJTVlBfTVNHVFlQRV9IRUxMTzoKKyAgICBjYXNlIFJTVlBfTVNHVFlQRV9BQ0s6CisgICAgY2FzZSBSU1ZQX01TR1RZUEVfU1JFRlJFU0g6CisgICAgICAgIGlmIChyc3ZwX29ial9wcmludCh0cHRyLCJcblx0ICAiLCB0bGVuKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OiAKKyAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICAgIix0bGVuKTsgIAorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICBwcmludGYoIlxuXHRcdCBwYWNrZXQgZXhjZWVkZWQgc25hcHNob3QiKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LXJ0Ni5jIGIvcHJpbnQtcnQ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllMjJhZQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXJ0Ni5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcnQ2LmMsdiAxLjI2LjIuMSAyMDA1LzA0LzIwIDIyOjM1OjExIGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgSU5FVDYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaXA2LmgiCisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCitpbnQKK3J0Nl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBjb25zdCB1X2NoYXIgKmJwMiBfVV8pCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9ydGhkciAqZHA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9ydGhkcjAgKmRwMDsKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwOworCWludCBpLCBsZW47CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyOworCisJZHAgPSAoc3RydWN0IGlwNl9ydGhkciAqKWJwOworCWxlbiA9IGRwLT5pcDZyX2xlbjsKKworCS8qICdlcCcgcG9pbnRzIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIGRhdGEuICovCisJZXAgPSBzbmFwZW5kOworCisJVENIRUNLKGRwLT5pcDZyX3NlZ2xlZnQpOworCisJcHJpbnRmKCJzcmNydCAobGVuPSVkIiwgZHAtPmlwNnJfbGVuKTsJLyopKi8KKwlwcmludGYoIiwgdHlwZT0lZCIsIGRwLT5pcDZyX3R5cGUpOworCXByaW50ZigiLCBzZWdsZWZ0PSVkIiwgZHAtPmlwNnJfc2VnbGVmdCk7CisKKwlzd2l0Y2ggKGRwLT5pcDZyX3R5cGUpIHsKKyNpZm5kZWYgSVBWNl9SVEhEUl9UWVBFXzAKKyNkZWZpbmUgSVBWNl9SVEhEUl9UWVBFXzAgMAorI2VuZGlmCisjaWZuZGVmIElQVjZfUlRIRFJfVFlQRV8yCisjZGVmaW5lIElQVjZfUlRIRFJfVFlQRV8yIDIKKyNlbmRpZgorCWNhc2UgSVBWNl9SVEhEUl9UWVBFXzA6CisJY2FzZSBJUFY2X1JUSERSX1RZUEVfMjoJCQkvKiBNb2JpbGUgSVB2NiBJRC0yMCAqLworCQlkcDAgPSAoc3RydWN0IGlwNl9ydGhkcjAgKilkcDsKKworCQlUQ0hFQ0soZHAwLT5pcDZyMF9yZXNlcnZlZCk7CisJCWlmIChkcDAtPmlwNnIwX3Jlc2VydmVkIHx8IHZmbGFnKSB7CisJCQlwcmludGYoIiwgcnN2PTB4JTB4IiwKKwkJCSAgICBFWFRSQUNUXzMyQklUUygmZHAwLT5pcDZyMF9yZXNlcnZlZCkpOworCQl9CisKKwkJaWYgKGxlbiAlIDIgPT0gMSkKKwkJCWdvdG8gdHJ1bmM7CisJCWxlbiA+Pj0gMTsKKwkJYWRkciA9ICZkcDAtPmlwNnIwX2FkZHJbMF07CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJaWYgKCh1X2NoYXIgKikoYWRkciArIDEpID4gZXApCisJCQkJZ290byB0cnVuYzsKKworCQkJcHJpbnRmKCIsIFslZF0lcyIsIGksIGlwNmFkZHJfc3RyaW5nKGFkZHIpKTsKKwkJCWFkZHIrKzsKKwkJfQorCQkvKigqLworCQlwcmludGYoIikgIik7CisJCXJldHVybigoZHAwLT5pcDZyMF9sZW4gKyAxKSA8PCAzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisJfQorCisgdHJ1bmM6CisJZnB1dHMoIlt8c3JjcnRdIiwgc3Rkb3V0KTsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL3ByaW50LXJ4LmMgYi9wcmludC1yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1yeC5jCkBAIC0wLDAgKzEsMjQ5MCBAQAorLyoKKyAqIENvcHlyaWdodDogKGMpIDIwMDAgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50IGFzIHJlcHJlc2VudGVkIGJ5IHRoZQorICoJU2VjcmV0YXJ5IG9mIHRoZSBOYXZ5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgICBkaXN0cmlidXRpb24uCisgKiAgIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisvKgorICogVGhpcyBjb2RlIHVubWFuZ2xlcyBSWCBwYWNrZXRzLiAgUlggaXMgdGhlIG11dGFudCBmb3JtIG9mIFJQQyB0aGF0IEFGUworICogdXNlcyB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIGNsaWVudHMgYW5kIHNlcnZlcnMuCisgKgorICogSW4gdGhpcyBjb2RlLCBJIG1haW5seSBjb25jZXJuIG15c2VsZiB3aXRoIGRlY29kaW5nIHRoZSBBRlMgY2FsbHMsIG5vdAorICogd2l0aCB0aGUgZ3V0cyBvZiBSWCwgcGVyIHNlLgorICoKKyAqIEJhaC4gIElmIEkgbmV2ZXIgbG9vayBhdCByeF9wYWNrZXQuaCBhZ2FpbiwgaXQgd2lsbCBiZSB0b28gc29vbi4KKyAqCisgKiBLZW4gSG9ybnN0ZWluIDxrZW5oQGNtZi5ucmwubmF2eS5taWw+CisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcnguYyx2IDEuMzcuMi4yIDIwMDcvMDYvMTUgMTk6NDM6MTUgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisjaW5jbHVkZSAicnguaCIKKworI2luY2x1ZGUgImlwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHJ4X3R5cGVzW10gPSB7CisJeyBSWF9QQUNLRVRfVFlQRV9EQVRBLAkJImRhdGEiIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9BQ0ssCQkiYWNrIiB9LAorCXsgUlhfUEFDS0VUX1RZUEVfQlVTWSwJCSJidXN5IiB9LAorCXsgUlhfUEFDS0VUX1RZUEVfQUJPUlQsCQkiYWJvcnQiIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9BQ0tBTEwsCSJhY2thbGwiIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9DSEFMTEVOR0UsCSJjaGFsbGVuZ2UiIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9SRVNQT05TRSwJInJlc3BvbnNlIiB9LAorCXsgUlhfUEFDS0VUX1RZUEVfREVCVUcsCQkiZGVidWciIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9QQVJBTVMsCSJwYXJhbXMiIH0sCisJeyBSWF9QQUNLRVRfVFlQRV9WRVJTSU9OLAkidmVyc2lvbiIgfSwKKwl7IDAsCQkJCU5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG91YmxlX3RvayB7CisJaW50IGZsYWc7CQkvKiBSeCBmbGFnICovCisJaW50IHBhY2tldFR5cGU7CQkvKiBQYWNrZXQgdHlwZSAqLworCWNvbnN0IGNoYXIgKnM7CQkvKiBGbGFnIHN0cmluZyAqLworfSByeF9mbGFnc1tdID0geworCXsgUlhfQ0xJRU5UX0lOSVRJQVRFRCwJMCwJCQkiY2xpZW50LWluaXQiIH0sCisJeyBSWF9SRVFVRVNUX0FDSywJMCwJCQkicmVxLWFjayIgfSwKKwl7IFJYX0xBU1RfUEFDS0VULAkwLAkJCSJsYXN0LXBja3QiIH0sCisJeyBSWF9NT1JFX1BBQ0tFVFMsCTAsCQkJIm1vcmUtcGNrdHMiIH0sCisJeyBSWF9GUkVFX1BBQ0tFVCwJMCwJCQkiZnJlZS1wY2t0IiB9LAorCXsgUlhfU0xPV19TVEFSVF9PSywJUlhfUEFDS0VUX1RZUEVfQUNLLAkic2xvdy1zdGFydCIgfSwKKwl7IFJYX0pVTUJPX1BBQ0tFVCwJUlhfUEFDS0VUX1RZUEVfREFUQSwJImp1bWJvZ3JhbSIgfQorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgZnNfcmVxW10gPSB7CisJeyAxMzAsCQkiZmV0Y2gtZGF0YSIgfSwKKwl7IDEzMSwJCSJmZXRjaC1hY2wiIH0sCisJeyAxMzIsCQkiZmV0Y2gtc3RhdHVzIiB9LAorCXsgMTMzLAkJInN0b3JlLWRhdGEiIH0sCisJeyAxMzQsCQkic3RvcmUtYWNsIiB9LAorCXsgMTM1LAkJInN0b3JlLXN0YXR1cyIgfSwKKwl7IDEzNiwJCSJyZW1vdmUtZmlsZSIgfSwKKwl7IDEzNywJCSJjcmVhdGUtZmlsZSIgfSwKKwl7IDEzOCwJCSJyZW5hbWUiIH0sCisJeyAxMzksCQkic3ltbGluayIgfSwKKwl7IDE0MCwJCSJsaW5rIiB9LAorCXsgMTQxLAkJIm1ha2VkaXIiIH0sCisJeyAxNDIsCQkicm1kaXIiIH0sCisJeyAxNDMsCQkib2xkc2V0bG9jayIgfSwKKwl7IDE0NCwJCSJvbGRleHRsb2NrIiB9LAorCXsgMTQ1LAkJIm9sZHJlbGxvY2siIH0sCisJeyAxNDYsCQkiZ2V0LXN0YXRzIiB9LAorCXsgMTQ3LAkJImdpdmUtY2JzIiB9LAorCXsgMTQ4LAkJImdldC12bGluZm8iIH0sCisJeyAxNDksCQkiZ2V0LXZsc3RhdHMiIH0sCisJeyAxNTAsCQkic2V0LXZsc3RhdHMiIH0sCisJeyAxNTEsCQkiZ2V0LXJvb3R2bCIgfSwKKwl7IDE1MiwJCSJjaGVjay10b2tlbiIgfSwKKwl7IDE1MywJCSJnZXQtdGltZSIgfSwKKwl7IDE1NCwJCSJuZ2V0LXZsaW5mbyIgfSwKKwl7IDE1NSwJCSJidWxrLXN0YXQiIH0sCisJeyAxNTYsCQkic2V0bG9jayIgfSwKKwl7IDE1NywJCSJleHRsb2NrIiB9LAorCXsgMTU4LAkJInJlbGxvY2siIH0sCisJeyAxNTksCQkieHN0YXQtdmVyIiB9LAorCXsgMTYwLAkJImdldC14c3RhdCIgfSwKKwl7IDE2MSwJCSJkZnMtbG9va3VwIiB9LAorCXsgMTYyLAkJImRmcy1mbHVzaGNwcyIgfSwKKwl7IDE2MywJCSJkZnMtc3ltbGluayIgfSwKKwl7IDIyMCwJCSJyZXNpZGVuY3kiIH0sCisJeyAwLAkJTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgY2JfcmVxW10gPSB7CisJeyAyMDQsCQkiY2FsbGJhY2siIH0sCisJeyAyMDUsCQkiaW5pdGNiIiB9LAorCXsgMjA2LAkJInByb2JlIiB9LAorCXsgMjA3LAkJImdldGxvY2siIH0sCisJeyAyMDgsCQkiZ2V0Y2UiIH0sCisJeyAyMDksCQkieHN0YXR2ZXIiIH0sCisJeyAyMTAsCQkiZ2V0eHN0YXQiIH0sCisJeyAyMTEsCQkiaW5pdGNiMiIgfSwKKwl7IDIxMiwJCSJ3aG9hcmV5b3UiIH0sCisJeyAyMTMsCQkiaW5pdGNiMyIgfSwKKwl7IDIxNCwJCSJwcm9iZXV1aWQiIH0sCisJeyAyMTUsCQkiZ2V0c3J2cHJlZnMiIH0sCisJeyAyMTYsCQkiZ2V0Y2VsbHNlcnZkYiIgfSwKKwl7IDIxNywJCSJnZXRsb2NhbGNlbGwiIH0sCisJeyAyMTgsCQkiZ2V0Y2FjaGVjb25mIiB9LAorCXsgMCwJCU5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHB0X3JlcVtdID0geworCXsgNTAwLAkJIm5ldy11c2VyIiB9LAorCXsgNTAxLAkJIndoZXJlLWlzLWl0IiB9LAorCXsgNTAyLAkJImR1bXAtZW50cnkiIH0sCisJeyA1MDMsCQkiYWRkLXRvLWdyb3VwIiB9LAorCXsgNTA0LAkJIm5hbWUtdG8taWQiIH0sCisJeyA1MDUsCQkiaWQtdG8tbmFtZSIgfSwKKwl7IDUwNiwJCSJkZWxldGUiIH0sCisJeyA1MDcsCQkicmVtb3ZlLWZyb20tZ3JvdXAiIH0sCisJeyA1MDgsCQkiZ2V0LWNwcyIgfSwKKwl7IDUwOSwJCSJuZXctZW50cnkiIH0sCisJeyA1MTAsCQkibGlzdC1tYXgiIH0sCisJeyA1MTEsCQkic2V0LW1heCIgfSwKKwl7IDUxMiwJCSJsaXN0LWVudHJ5IiB9LAorCXsgNTEzLAkJImNoYW5nZS1lbnRyeSIgfSwKKwl7IDUxNCwJCSJsaXN0LWVsZW1lbnRzIiB9LAorCXsgNTE1LAkJInNhbWUtbWJyLW9mIiB9LAorCXsgNTE2LAkJInNldC1mbGQtc2VudHJ5IiB9LAorCXsgNTE3LAkJImxpc3Qtb3duZWQiIH0sCisJeyA1MTgsCQkiZ2V0LWNwczIiIH0sCisJeyA1MTksCQkiZ2V0LWhvc3QtY3BzIiB9LAorCXsgNTIwLAkJInVwZGF0ZS1lbnRyeSIgfSwKKwl7IDUyMSwJCSJsaXN0LWVudHJpZXMiIH0sCisJeyAwLAkJTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgdmxkYl9yZXFbXSA9IHsKKwl7IDUwMSwJCSJjcmVhdGUtZW50cnkiIH0sCisJeyA1MDIsCQkiZGVsZXRlLWVudHJ5IiB9LAorCXsgNTAzLAkJImdldC1lbnRyeS1ieS1pZCIgfSwKKwl7IDUwNCwJCSJnZXQtZW50cnktYnktbmFtZSIgfSwKKwl7IDUwNSwJCSJnZXQtbmV3LXZvbHVtZS1pZCIgfSwKKwl7IDUwNiwJCSJyZXBsYWNlLWVudHJ5IiB9LAorCXsgNTA3LAkJInVwZGF0ZS1lbnRyeSIgfSwKKwl7IDUwOCwJCSJzZXRsb2NrIiB9LAorCXsgNTA5LAkJInJlbGVhc2Vsb2NrIiB9LAorCXsgNTEwLAkJImxpc3QtZW50cnkiIH0sCisJeyA1MTEsCQkibGlzdC1hdHRyaWIiIH0sCisJeyA1MTIsCQkibGlua2VkLWxpc3QiIH0sCisJeyA1MTMsCQkiZ2V0LXN0YXRzIiB9LAorCXsgNTE0LAkJInByb2JlIiB9LAorCXsgNTE1LAkJImdldC1hZGRycyIgfSwKKwl7IDUxNiwJCSJjaGFuZ2UtYWRkciIgfSwKKwl7IDUxNywJCSJjcmVhdGUtZW50cnktbiIgfSwKKwl7IDUxOCwJCSJnZXQtZW50cnktYnktaWQtbiIgfSwKKwl7IDUxOSwJCSJnZXQtZW50cnktYnktbmFtZS1uIiB9LAorCXsgNTIwLAkJInJlcGxhY2UtZW50cnktbiIgfSwKKwl7IDUyMSwJCSJsaXN0LWVudHJ5LW4iIH0sCisJeyA1MjIsCQkibGlzdC1hdHRyaWItbiIgfSwKKwl7IDUyMywJCSJsaW5rZWQtbGlzdC1uIiB9LAorCXsgNTI0LAkJInVwZGF0ZS1lbnRyeS1ieS1uYW1lIiB9LAorCXsgNTI1LAkJImNyZWF0ZS1lbnRyeS11IiB9LAorCXsgNTI2LAkJImdldC1lbnRyeS1ieS1pZC11IiB9LAorCXsgNTI3LAkJImdldC1lbnRyeS1ieS1uYW1lLXUiIH0sCisJeyA1MjgsCQkicmVwbGFjZS1lbnRyeS11IiB9LAorCXsgNTI5LAkJImxpc3QtZW50cnktdSIgfSwKKwl7IDUzMCwJCSJsaXN0LWF0dHJpYi11IiB9LAorCXsgNTMxLAkJImxpbmtlZC1saXN0LXUiIH0sCisJeyA1MzIsCQkicmVnYWRkciIgfSwKKwl7IDUzMywJCSJnZXQtYWRkcnMtdSIgfSwKKwl7IDUzNCwJCSJsaXN0LWF0dHJpYi1uMiIgfSwKKwl7IDAsCQlOVUxMIH0sCit9OworCitzdGF0aWMgc3RydWN0IHRvayBrYXV0aF9yZXFbXSA9IHsKKwl7IDEsCQkiYXV0aC1vbGQiIH0sCisJeyAyMSwJCSJhdXRoZW50aWNhdGUiIH0sCisJeyAyMiwJCSJhdXRoZW50aWNhdGUtdjIiIH0sCisJeyAyLAkJImNoYW5nZS1wdyIgfSwKKwl7IDMsCQkiZ2V0LXRpY2tldC1vbGQiIH0sCisJeyAyMywJCSJnZXQtdGlja2V0IiB9LAorCXsgNCwJCSJzZXQtcHciIH0sCisJeyA1LAkJInNldC1maWVsZHMiIH0sCisJeyA2LAkJImNyZWF0ZS11c2VyIiB9LAorCXsgNywJCSJkZWxldGUtdXNlciIgfSwKKwl7IDgsCQkiZ2V0LWVudHJ5IiB9LAorCXsgOSwJCSJsaXN0LWVudHJ5IiB9LAorCXsgMTAsCQkiZ2V0LXN0YXRzIiB9LAorCXsgMTEsCQkiZGVidWciIH0sCisJeyAxMiwJCSJnZXQtcHciIH0sCisJeyAxMywJCSJnZXQtcmFuZG9tLWtleSIgfSwKKwl7IDE0LAkJInVubG9jayIgfSwKKwl7IDE1LAkJImxvY2stc3RhdHVzIiB9LAorCXsgMCwJCU5VTEwgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHZvbF9yZXFbXSA9IHsKKwl7IDEwMCwJCSJjcmVhdGUtdm9sdW1lIiB9LAorCXsgMTAxLAkJImRlbGV0ZS12b2x1bWUiIH0sCisJeyAxMDIsCQkicmVzdG9yZSIgfSwKKwl7IDEwMywJCSJmb3J3YXJkIiB9LAorCXsgMTA0LAkJImVuZC10cmFucyIgfSwKKwl7IDEwNSwJCSJjbG9uZSIgfSwKKwl7IDEwNiwJCSJzZXQtZmxhZ3MiIH0sCisJeyAxMDcsCQkiZ2V0LWZsYWdzIiB9LAorCXsgMTA4LAkJInRyYW5zLWNyZWF0ZSIgfSwKKwl7IDEwOSwJCSJkdW1wIiB9LAorCXsgMTEwLAkJImdldC1udGgtdm9sdW1lIiB9LAorCXsgMTExLAkJInNldC1mb3J3YXJkaW5nIiB9LAorCXsgMTEyLAkJImdldC1uYW1lIiB9LAorCXsgMTEzLAkJImdldC1zdGF0dXMiIH0sCisJeyAxMTQsCQkic2lnLXJlc3RvcmUiIH0sCisJeyAxMTUsCQkibGlzdC1wYXJ0aXRpb25zIiB9LAorCXsgMTE2LAkJImxpc3Qtdm9sdW1lcyIgfSwKKwl7IDExNywJCSJzZXQtaWQtdHlwZXMiIH0sCisJeyAxMTgsCQkibW9uaXRvciIgfSwKKwl7IDExOSwJCSJwYXJ0aXRpb24taW5mbyIgfSwKKwl7IDEyMCwJCSJyZWNsb25lIiB9LAorCXsgMTIxLAkJImxpc3Qtb25lLXZvbHVtZSIgfSwKKwl7IDEyMiwJCSJudWtlIiB9LAorCXsgMTIzLAkJInNldC1kYXRlIiB9LAorCXsgMTI0LAkJIngtbGlzdC12b2x1bWVzIiB9LAorCXsgMTI1LAkJIngtbGlzdC1vbmUtdm9sdW1lIiB9LAorCXsgMTI2LAkJInNldC1pbmZvIiB9LAorCXsgMTI3LAkJIngtbGlzdC1wYXJ0aXRpb25zIiB9LAorCXsgMTI4LAkJImZvcndhcmQtbXVsdGlwbGUiIH0sCisJeyAwLAkJTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgYm9zX3JlcVtdID0geworCXsgODAsCQkiY3JlYXRlLWJub2RlIiB9LAorCXsgODEsCQkiZGVsZXRlLWJub2RlIiB9LAorCXsgODIsCQkic2V0LXN0YXR1cyIgfSwKKwl7IDgzLAkJImdldC1zdGF0dXMiIH0sCisJeyA4NCwJCSJlbnVtZXJhdGUtaW5zdGFuY2UiIH0sCisJeyA4NSwJCSJnZXQtaW5zdGFuY2UtaW5mbyIgfSwKKwl7IDg2LAkJImdldC1pbnN0YW5jZS1wYXJtIiB9LAorCXsgODcsCQkiYWRkLXN1cGVydXNlciIgfSwKKwl7IDg4LAkJImRlbGV0ZS1zdXBlcnVzZXIiIH0sCisJeyA4OSwJCSJsaXN0LXN1cGVydXNlcnMiIH0sCisJeyA5MCwJCSJsaXN0LWtleXMiIH0sCisJeyA5MSwJCSJhZGQta2V5IiB9LAorCXsgOTIsCQkiZGVsZXRlLWtleSIgfSwKKwl7IDkzLAkJInNldC1jZWxsLW5hbWUiIH0sCisJeyA5NCwJCSJnZXQtY2VsbC1uYW1lIiB9LAorCXsgOTUsCQkiZ2V0LWNlbGwtaG9zdCIgfSwKKwl7IDk2LAkJImFkZC1jZWxsLWhvc3QiIH0sCisJeyA5NywJCSJkZWxldGUtY2VsbC1ob3N0IiB9LAorCXsgOTgsCQkic2V0LXQtc3RhdHVzIiB9LAorCXsgOTksCQkic2h1dGRvd24tYWxsIiB9LAorCXsgMTAwLAkJInJlc3RhcnQtYWxsIiB9LAorCXsgMTAxLAkJInN0YXJ0dXAtYWxsIiB9LAorCXsgMTAyLAkJInNldC1ub2F1dGgtZmxhZyIgfSwKKwl7IDEwMywJCSJyZS1ib3pvIiB9LAorCXsgMTA0LAkJInJlc3RhcnQiIH0sCisJeyAxMDUsCQkic3RhcnQtYm96by1pbnN0YWxsIiB9LAorCXsgMTA2LAkJInVuaW5zdGFsbCIgfSwKKwl7IDEwNywJCSJnZXQtZGF0ZXMiIH0sCisJeyAxMDgsCQkiZXhlYyIgfSwKKwl7IDEwOSwJCSJwcnVuZSIgfSwKKwl7IDExMCwJCSJzZXQtcmVzdGFydC10aW1lIiB9LAorCXsgMTExLAkJImdldC1yZXN0YXJ0LXRpbWUiIH0sCisJeyAxMTIsCQkic3RhcnQtYm96by1sb2ciIH0sCisJeyAxMTMsCQkid2FpdC1hbGwiIH0sCisJeyAxMTQsCQkiZ2V0LWluc3RhbmNlLXN0cmluZ3MiIH0sCisJeyAxMTUsCQkiZ2V0LXJlc3RyaWN0ZWQiIH0sCisJeyAxMTYsCQkic2V0LXJlc3RyaWN0ZWQiIH0sCisJeyAwLAkJTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgdWJpa19yZXFbXSA9IHsKKwl7IDEwMDAwLAkidm90ZS1iZWFjb24iIH0sCisJeyAxMDAwMSwJInZvdGUtZGVidWctb2xkIiB9LAorCXsgMTAwMDIsCSJ2b3RlLXNkZWJ1Zy1vbGQiIH0sCisJeyAxMDAwMywJInZvdGUtZ2V0c3luY3NpdGUiIH0sCisJeyAxMDAwNCwJInZvdGUtZGVidWciIH0sCisJeyAxMDAwNSwJInZvdGUtc2RlYnVnIiB9LAorCXsgMjAwMDAsCSJkaXNrLWJlZ2luIiB9LAorCXsgMjAwMDEsCSJkaXNrLWNvbW1pdCIgfSwKKwl7IDIwMDAyLAkiZGlzay1sb2NrIiB9LAorCXsgMjAwMDMsCSJkaXNrLXdyaXRlIiB9LAorCXsgMjAwMDQsCSJkaXNrLWdldHZlcnNpb24iIH0sCisJeyAyMDAwNSwJImRpc2stZ2V0ZmlsZSIgfSwKKwl7IDIwMDA2LAkiZGlzay1zZW5kZmlsZSIgfSwKKwl7IDIwMDA3LAkiZGlzay1hYm9ydCIgfSwKKwl7IDIwMDA4LAkiZGlzay1yZWxlYXNlbG9ja3MiIH0sCisJeyAyMDAwOSwJImRpc2stdHJ1bmNhdGUiIH0sCisJeyAyMDAxMCwJImRpc2stcHJvYmUiIH0sCisJeyAyMDAxMSwJImRpc2std3JpdGV2IiB9LAorCXsgMjAwMTIsCSJkaXNrLWludGVyZmFjZWFkZHIiIH0sCisJeyAyMDAxMywJImRpc2stc2V0dmVyc2lvbiIgfSwKKwl7IDAsCQlOVUxMIH0sCit9OworCisjZGVmaW5lIFZPVEVfTE9XCTEwMDAwCisjZGVmaW5lIFZPVEVfSElHSAkxMDAwNQorI2RlZmluZSBESVNLX0xPVwkyMDAwMAorI2RlZmluZSBESVNLX0hJR0gJMjAwMTMKKworc3RhdGljIHN0cnVjdCB0b2sgY2JfdHlwZXNbXSA9IHsKKwl7IDEsCQkiZXhjbHVzaXZlIiB9LAorCXsgMiwJCSJzaGFyZWQiIH0sCisJeyAzLAkJImRyb3BwZWQiIH0sCisJeyAwLAkJTlVMTCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0b2sgdWJpa19sb2NrX3R5cGVzW10gPSB7CisJeyAxLAkJInJlYWQiIH0sCisJeyAyLAkJIndyaXRlIiB9LAorCXsgMywJCSJ3YWl0IiB9LAorCXsgMCwJCU5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp2b2x0eXBlW10gPSB7ICJyZWFkLXdyaXRlIiwgInJlYWQtb25seSIsICJiYWNrdXAiIH07CisKK3N0YXRpYyBzdHJ1Y3QgdG9rIGFmc19mc19lcnJvcnNbXSA9IHsKKwl7IDEwMSwJCSJzYWx2YWdlIHZvbHVtZSIgfSwKKwl7IDEwMiwgCQkibm8gc3VjaCB2bm9kZSIgfSwKKwl7IDEwMywgCQkibm8gc3VjaCB2b2x1bWUiIH0sCisJeyAxMDQsIAkJInZvbHVtZSBleGlzdCIgfSwKKwl7IDEwNSwgCQkibm8gc2VydmljZSIgfSwKKwl7IDEwNiwgCQkidm9sdW1lIG9mZmxpbmUiIH0sCisJeyAxMDcsIAkJInZvbGluZSBvbmxpbmUiIH0sCisJeyAxMDgsIAkJImRpc2tmdWxsIiB9LAorCXsgMTA5LCAJCSJkaXNrcXVvdGEgZXhjZWVkZWQiIH0sCisJeyAxMTAsIAkJInZvbHVtZSBidXN5IiB9LAorCXsgMTExLCAJCSJ2b2x1bWUgbW92ZWQiIH0sCisJeyAxMTIsIAkJIkFGUyBJTyBlcnJvciIgfSwKKwl7IC0xMDAsCQkicmVzdGFydGluZyBmaWxlc2VydmVyIiB9LAorCXsgMCwJCU5VTEwgfQorfTsKKworLyoKKyAqIFJlYXNvbnMgZm9yIGFja25vd2xlZGdpbmcgYSBwYWNrZXQKKyAqLworCitzdGF0aWMgc3RydWN0IHRvayByeF9hY2tfcmVhc29uc1tdID0geworCXsgMSwJCSJhY2sgcmVxdWVzdGVkIiB9LAorCXsgMiwJCSJkdXBsaWNhdGUgcGFja2V0IiB9LAorCXsgMywJCSJvdXQgb2Ygc2VxdWVuY2UiIH0sCisJeyA0LAkJImV4Y2VlZHMgd2luZG93IiB9LAorCXsgNSwJCSJubyBidWZmZXIgc3BhY2UiIH0sCisJeyA2LAkJInBpbmciIH0sCisJeyA3LAkJInBpbmcgcmVzcG9uc2UiIH0sCisJeyA4LAkJImRlbGF5IiB9LAorCXsgOSwJCSJpZGxlIiB9LAorCXsgMCwJCU5VTEwgfSwKK307CisKKy8qCisgKiBDYWNoZSBlbnRyaWVzIHdlIGtlZXAgYXJvdW5kIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSBSWCBvcGNvZGUKKyAqIG51bWJlcnMgZm9yIHJlcGxpZXMuICBUaGlzIGFsbG93cyB1cyB0byBtYWtlIHNlbnNlIG9mIFJYIHJlcGx5IHBhY2tldHMuCisgKi8KKworc3RydWN0IHJ4X2NhY2hlX2VudHJ5IHsKKwl1X2ludDMyX3QJY2FsbG51bTsJLyogQ2FsbCBudW1iZXIgKG5ldCBvcmRlcikgKi8KKwlzdHJ1Y3QgaW5fYWRkcgljbGllbnQ7CQkvKiBjbGllbnQgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLworCXN0cnVjdCBpbl9hZGRyCXNlcnZlcjsJCS8qIHNlcnZlciBJUCBhZGRyZXNzIChuZXQgb3JkZXIpICovCisJaW50CQlkcG9ydDsJCS8qIHNlcnZlciBwb3J0IChob3N0IG9yZGVyKSAqLworCXVfc2hvcnQJCXNlcnZpY2VJZDsJLyogU2VydmljZSBpZGVudGlmaWVyIChuZXQgb3JkZXIpICovCisJdV9pbnQzMl90CW9wY29kZTsJCS8qIFJYIG9wY29kZSAoaG9zdCBvcmRlcikgKi8KK307CisKKyNkZWZpbmUgUlhfQ0FDSEVfU0laRQk2NAorCitzdGF0aWMgc3RydWN0IHJ4X2NhY2hlX2VudHJ5CXJ4X2NhY2hlW1JYX0NBQ0hFX1NJWkVdOworCitzdGF0aWMgaW50CXJ4X2NhY2hlX25leHQgPSAwOworc3RhdGljIGludAlyeF9jYWNoZV9oaW50ID0gMDsKK3N0YXRpYyB2b2lkCXJ4X2NhY2hlX2luc2VydChjb25zdCB1X2NoYXIgKiwgY29uc3Qgc3RydWN0IGlwICosIGludCk7CitzdGF0aWMgaW50CXJ4X2NhY2hlX2ZpbmQoY29uc3Qgc3RydWN0IHJ4X2hlYWRlciAqLCBjb25zdCBzdHJ1Y3QgaXAgKiwKKwkJCSAgICAgIGludCwgaW50MzJfdCAqKTsKKworc3RhdGljIHZvaWQgZnNfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBmc19yZXBseV9wcmludChjb25zdCB1X2NoYXIgKiwgaW50LCBpbnQzMl90KTsKK3N0YXRpYyB2b2lkIGFjbF9wcmludCh1X2NoYXIgKiwgaW50LCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCBjYl9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGNiX3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOworc3RhdGljIHZvaWQgcHJvdF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIHByb3RfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7CitzdGF0aWMgdm9pZCB2bGRiX3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgdmxkYl9yZXBseV9wcmludChjb25zdCB1X2NoYXIgKiwgaW50LCBpbnQzMl90KTsKK3N0YXRpYyB2b2lkIGthdXRoX3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQga2F1dGhfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7CitzdGF0aWMgdm9pZCB2b2xfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCB2b2xfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7CitzdGF0aWMgdm9pZCBib3NfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgdm9pZCBib3NfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7CitzdGF0aWMgdm9pZCB1YmlrX3ByaW50KGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIHViaWtfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7CisKK3N0YXRpYyB2b2lkIHJ4X2Fja19wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKKworc3RhdGljIGludCBpc191YmlrKHVfaW50MzJfdCk7CisKKy8qCisgKiBIYW5kbGUgdGhlIHJ4LWxldmVsIHBhY2tldC4gIFNlZSBpZiB3ZSBrbm93IHdoYXQgcG9ydCBpdCdzIGdvaW5nIHRvIHNvCisgKiB3ZSBjYW4gcGVlayBhdCB0aGUgYWZzIGNhbGwgaW5zaWRlCisgKi8KKwordm9pZAorcnhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50IHNwb3J0LCBpbnQgZHBvcnQsCisJIHVfY2hhciAqYnAyKQoreworCXJlZ2lzdGVyIHN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKKwlpbnQgaTsKKwlpbnQzMl90IG9wY29kZTsKKworCWlmIChzbmFwZW5kIC0gYnAgPCAoaW50KXNpemVvZiAoc3RydWN0IHJ4X2hlYWRlcikpIHsKKwkJcHJpbnRmKCIgW3xyeF0gKCVkKSIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisKKwlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCXByaW50ZigiIHJ4ICVzIiwgdG9rMnN0cihyeF90eXBlcywgInR5cGUgJWQiLCByeGgtPnR5cGUpKTsKKworCWlmICh2ZmxhZykgeworCQlpbnQgZmlyc3RmbGFnID0gMDsKKworCQlpZiAodmZsYWcgPiAxKQorCQkJcHJpbnRmKCIgY2lkICUwOHggY2FsbCMgJWQiLAorCQkJICAgICAgIChpbnQpIEVYVFJBQ1RfMzJCSVRTKCZyeGgtPmNpZCksCisJCQkgICAgICAgKGludCkgRVhUUkFDVF8zMkJJVFMoJnJ4aC0+Y2FsbE51bWJlcikpOworCisJCXByaW50ZigiIHNlcSAlZCBzZXIgJWQiLAorCQkgICAgICAgKGludCkgRVhUUkFDVF8zMkJJVFMoJnJ4aC0+c2VxKSwKKwkJICAgICAgIChpbnQpIEVYVFJBQ1RfMzJCSVRTKCZyeGgtPnNlcmlhbCkpOworCisJCWlmICh2ZmxhZyA+IDIpCisJCQlwcmludGYoIiBzZWNpbmRleCAlZCBzZXJ2aWNlaWQgJWh1IiwKKwkJCQkoaW50KSByeGgtPnNlY3VyaXR5SW5kZXgsCisJCQkJRVhUUkFDVF8xNkJJVFMoJnJ4aC0+c2VydmljZUlkKSk7CisKKwkJaWYgKHZmbGFnID4gMSkKKwkJCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfRkxBR1M7IGkrKykgeworCQkJCWlmIChyeGgtPmZsYWdzICYgcnhfZmxhZ3NbaV0uZmxhZyAmJgorCQkJCSAgICAoIXJ4X2ZsYWdzW2ldLnBhY2tldFR5cGUgfHwKKwkJCQkgICAgIHJ4aC0+dHlwZSA9PSByeF9mbGFnc1tpXS5wYWNrZXRUeXBlKSkgeworCQkJCQlpZiAoIWZpcnN0ZmxhZykgeworCQkJCQkJZmlyc3RmbGFnID0gMTsKKwkJCQkJCXByaW50ZigiICIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcHJpbnRmKCIsIik7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCI8JXM+IiwgcnhfZmxhZ3NbaV0ucyk7CisJCQkJfQorCQkJfQorCX0KKworCS8qCisJICogVHJ5IHRvIGhhbmRsZSBBRlMgY2FsbHMgdGhhdCB3ZSBrbm93IGFib3V0LiAgQ2hlY2sgdGhlIGRlc3RpbmF0aW9uCisJICogcG9ydCBhbmQgbWFrZSBzdXJlIGl0J3MgYSBkYXRhIHBhY2tldC4gIEFsc28sIG1ha2Ugc3VyZSB0aGUKKwkgKiBzZXEgbnVtYmVyIGlzIDEgKGJlY2F1c2Ugb3RoZXJ3aXNlIGl0J3MgYSBjb250aW51YXRpb24gcGFja2V0LAorCSAqIGFuZCB3ZSBjYW4ndCBpbnRlcnByZXQgdGhhdCkuICBBbHNvLCBzZWVtcyB0aGF0IHJlcGx5IHBhY2tldHMKKwkgKiBkbyBub3QgaGF2ZSB0aGUgY2xpZW50LWluaXQgZmxhZyBzZXQsIHNvIHdlIGNoZWNrIGZvciB0aGF0CisJICogYXMgd2VsbC4KKwkgKi8KKworCWlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSAmJgorCSAgICBFWFRSQUNUXzMyQklUUygmcnhoLT5zZXEpID09IDEgJiYKKwkgICAgcnhoLT5mbGFncyAmIFJYX0NMSUVOVF9JTklUSUFURUQpIHsKKworCQkvKgorCQkgKiBJbnNlcnQgdGhpcyBjYWxsIGludG8gdGhlIGNhbGwgY2FjaGUgdGFibGUsIHNvIHdlCisJCSAqIGhhdmUgYSBjaGFuY2UgdG8gcHJpbnQgb3V0IHJlcGxpZXMKKwkJICovCisKKwkJcnhfY2FjaGVfaW5zZXJ0KGJwLCAoY29uc3Qgc3RydWN0IGlwICopIGJwMiwgZHBvcnQpOworCisJCXN3aXRjaCAoZHBvcnQpIHsKKwkJCWNhc2UgRlNfUlhfUE9SVDoJLyogQUZTIGZpbGUgc2VydmljZSAqLworCQkJCWZzX3ByaW50KGJwLCBsZW5ndGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBDQl9SWF9QT1JUOgkvKiBBRlMgY2FsbGJhY2sgc2VydmljZSAqLworCQkJCWNiX3ByaW50KGJwLCBsZW5ndGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBQUk9UX1JYX1BPUlQ6CS8qIEFGUyBwcm90ZWN0aW9uIHNlcnZpY2UgKi8KKwkJCQlwcm90X3ByaW50KGJwLCBsZW5ndGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBWTERCX1JYX1BPUlQ6CS8qIEFGUyBWTERCIHNlcnZpY2UgKi8KKwkJCQl2bGRiX3ByaW50KGJwLCBsZW5ndGgpOworCQkJCWJyZWFrOworCQkJY2FzZSBLQVVUSF9SWF9QT1JUOgkvKiBBRlMgS2VyYmVyb3MgYXV0aCBzZXJ2aWNlICovCisJCQkJa2F1dGhfcHJpbnQoYnAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZPTF9SWF9QT1JUOgkvKiBBRlMgVm9sdW1lIHNlcnZpY2UgKi8KKwkJCQl2b2xfcHJpbnQoYnAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEJPU19SWF9QT1JUOgkvKiBBRlMgQk9TIHNlcnZpY2UgKi8KKwkJCQlib3NfcHJpbnQoYnAsIGxlbmd0aCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJfQorCisJLyoKKwkgKiBJZiBpdCdzIGEgcmVwbHkgKGNsaWVudC1pbml0IGlzIF9ub3RfIHNldCwgYnV0IHNlcSBpcyBvbmUpCisJICogdGhlbiBsb29rIGl0IHVwIGluIHRoZSBjYWNoZS4gIElmIHdlIGZpbmQgaXQsIGNhbGwgdGhlIHJlcGx5CisJICogcHJpbnRpbmcgZnVuY3Rpb25zICBOb3RlIHRoYXQgd2UgaGFuZGxlIGFib3J0IHBhY2tldHMgaGVyZSwKKwkgKiBiZWNhdXNlIHByaW50aW5nIG91dCB0aGUgcmV0dXJuIGNvZGUgY2FuIGJlIHVzZWZ1bCBhdCB0aW1lcy4KKwkgKi8KKworCX0gZWxzZSBpZiAoKChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSAmJgorCQkJCQlFWFRSQUNUXzMyQklUUygmcnhoLT5zZXEpID09IDEpIHx8CisJCSAgICByeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfQUJPUlQpICYmCisJCSAgIChyeGgtPmZsYWdzICYgUlhfQ0xJRU5UX0lOSVRJQVRFRCkgPT0gMCAmJgorCQkgICByeF9jYWNoZV9maW5kKHJ4aCwgKGNvbnN0IHN0cnVjdCBpcCAqKSBicDIsCisJCQkJIHNwb3J0LCAmb3Bjb2RlKSkgeworCisJCXN3aXRjaCAoc3BvcnQpIHsKKwkJCWNhc2UgRlNfUlhfUE9SVDoJLyogQUZTIGZpbGUgc2VydmljZSAqLworCQkJCWZzX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENCX1JYX1BPUlQ6CS8qIEFGUyBjYWxsYmFjayBzZXJ2aWNlICovCisJCQkJY2JfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFJPVF9SWF9QT1JUOgkvKiBBRlMgUFQgc2VydmljZSAqLworCQkJCXByb3RfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVkxEQl9SWF9QT1JUOgkvKiBBRlMgVkxEQiBzZXJ2aWNlICovCisJCQkJdmxkYl9yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBLQVVUSF9SWF9QT1JUOgkvKiBBRlMgS2VyYmVyb3MgYXV0aCBzZXJ2aWNlICovCisJCQkJa2F1dGhfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVk9MX1JYX1BPUlQ6CS8qIEFGUyBWb2x1bWUgc2VydmljZSAqLworCQkJCXZvbF9yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOworCQkJCWJyZWFrOworCQkJY2FzZSBCT1NfUlhfUE9SVDoJLyogQUZTIEJPUyBzZXJ2aWNlICovCisJCQkJYm9zX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJfQorCisJLyoKKwkgKiBJZiBpdCdzIGFuIFJYIGFjayBwYWNrZXQsIHRoZW4gdXNlIHRoZSBhcHByb3ByaWF0ZSBhY2sgZGVjb2RpbmcKKwkgKiBmdW5jdGlvbiAodGhlcmUgaXNuJ3QgYW55IHNlcnZpY2Utc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlCisJICogYWNrIHBhY2tldCwgc28gd2UgY2FuIHVzZSBvbmUgZm9yIGFsbCBBRlMgc2VydmljZXMpCisJICovCisKKwl9IGVsc2UgaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9BQ0spCisJCXJ4X2Fja19wcmludChicCwgbGVuZ3RoKTsKKworCisJcHJpbnRmKCIgKCVkKSIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBJbnNlcnQgYW4gZW50cnkgaW50byB0aGUgY2FjaGUuICBUYWtlbiBmcm9tIHByaW50LW5mcy5jCisgKi8KKworc3RhdGljIHZvaWQKK3J4X2NhY2hlX2luc2VydChjb25zdCB1X2NoYXIgKmJwLCBjb25zdCBzdHJ1Y3QgaXAgKmlwLCBpbnQgZHBvcnQpCit7CisJc3RydWN0IHJ4X2NhY2hlX2VudHJ5ICpyeGVudDsKKwljb25zdCBzdHJ1Y3QgcnhfaGVhZGVyICpyeGggPSAoY29uc3Qgc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCWlmIChzbmFwZW5kIC0gYnAgKyAxIDw9IChpbnQpKHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIHNpemVvZihpbnQzMl90KSkpCisJCXJldHVybjsKKworCXJ4ZW50ID0gJnJ4X2NhY2hlW3J4X2NhY2hlX25leHRdOworCisJaWYgKCsrcnhfY2FjaGVfbmV4dCA+PSBSWF9DQUNIRV9TSVpFKQorCQlyeF9jYWNoZV9uZXh0ID0gMDsKKworCXJ4ZW50LT5jYWxsbnVtID0gcnhoLT5jYWxsTnVtYmVyOworCXJ4ZW50LT5jbGllbnQgPSBpcC0+aXBfc3JjOworCXJ4ZW50LT5zZXJ2ZXIgPSBpcC0+aXBfZHN0OworCXJ4ZW50LT5kcG9ydCA9IGRwb3J0OworCXJ4ZW50LT5zZXJ2aWNlSWQgPSByeGgtPnNlcnZpY2VJZDsKKwlyeGVudC0+b3Bjb2RlID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOworfQorCisvKgorICogTG9va3VwIGFuIGVudHJ5IGluIHRoZSBjYWNoZS4gIEFsc28gdGFrZW4gZnJvbSBwcmludC1uZnMuYworICoKKyAqIE5vdGUgdGhhdCBiZWNhdXNlIHRoaXMgaXMgYSByZXBseSwgd2UncmUgbG9va2luZyBhdCB0aGUgX3NvdXJjZV8KKyAqIHBvcnQuCisgKi8KKworc3RhdGljIGludAorcnhfY2FjaGVfZmluZChjb25zdCBzdHJ1Y3QgcnhfaGVhZGVyICpyeGgsIGNvbnN0IHN0cnVjdCBpcCAqaXAsIGludCBzcG9ydCwKKwkgICAgICBpbnQzMl90ICpvcGNvZGUpCit7CisJaW50IGk7CisJc3RydWN0IHJ4X2NhY2hlX2VudHJ5ICpyeGVudDsKKwl1X2ludDMyX3QgY2xpcCA9IGlwLT5pcF9kc3Quc19hZGRyOworCXVfaW50MzJfdCBzaXAgPSBpcC0+aXBfc3JjLnNfYWRkcjsKKworCS8qIFN0YXJ0IHRoZSBzZWFyY2ggd2hlcmUgd2UgbGFzdCBsZWZ0IG9mZiAqLworCisJaSA9IHJ4X2NhY2hlX2hpbnQ7CisJZG8geworCQlyeGVudCA9ICZyeF9jYWNoZVtpXTsKKwkJaWYgKHJ4ZW50LT5jYWxsbnVtID09IHJ4aC0+Y2FsbE51bWJlciAmJgorCQkgICAgcnhlbnQtPmNsaWVudC5zX2FkZHIgPT0gY2xpcCAmJgorCQkgICAgcnhlbnQtPnNlcnZlci5zX2FkZHIgPT0gc2lwICYmCisJCSAgICByeGVudC0+c2VydmljZUlkID09IHJ4aC0+c2VydmljZUlkICYmCisJCSAgICByeGVudC0+ZHBvcnQgPT0gc3BvcnQpIHsKKworCQkJLyogV2UgZ290IGEgbWF0Y2ghICovCisKKwkJCXJ4X2NhY2hlX2hpbnQgPSBpOworCQkJKm9wY29kZSA9IHJ4ZW50LT5vcGNvZGU7CisJCQlyZXR1cm4oMSk7CisJCX0KKwkJaWYgKCsraSA+IFJYX0NBQ0hFX1NJWkUpCisJCQlpID0gMDsKKwl9IHdoaWxlIChpICE9IHJ4X2NhY2hlX2hpbnQpOworCisJLyogT3VyIHNlYXJjaCBmYWlsZWQgKi8KKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBUaGVzZSBleHRyZW1lbWx5IGdyb2R5IG1hY3JvcyBoYW5kbGUgdGhlIHByaW50aW5nIG9mIHZhcmlvdXMgQUZTIHN0dWZmLgorICovCisKKyNkZWZpbmUgRklET1VUKCkgeyB1bnNpZ25lZCBsb25nIG4xLCBuMiwgbjM7IFwKKwkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSAqIDMpOyBcCisJCQluMSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCQluMiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCQluMyA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCQlwcmludGYoIiBmaWQgJWQvJWQvJWQiLCAoaW50KSBuMSwgKGludCkgbjIsIChpbnQpIG4zKTsgXAorCQl9CisKKyNkZWZpbmUgU1RST1VUKE1BWCkgeyB1bnNpZ25lZCBpbnQgaTsgXAorCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsgXAorCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJaWYgKGkgPiAoTUFYKSkgXAorCQkJCWdvdG8gdHJ1bmM7IFwKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkJcHJpbnRmKCIgXCIiKTsgXAorCQkJaWYgKGZuX3ByaW50bihicCwgaSwgc25hcGVuZCkpIFwKKwkJCQlnb3RvIHRydW5jOyBcCisJCQlwcmludGYoIlwiIik7IFwKKwkJCWJwICs9ICgoaSArIHNpemVvZihpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpKSAqIHNpemVvZihpbnQzMl90KTsgXAorCQl9CisKKyNkZWZpbmUgSU5UT1VUKCkgeyBpbnQgaTsgXAorCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsgXAorCQkJaSA9IChpbnQpIEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCQlwcmludGYoIiAlZCIsIGkpOyBcCisJCX0KKworI2RlZmluZSBVSU5UT1VUKCkgeyB1bnNpZ25lZCBsb25nIGk7IFwKKwkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7IFwKKwkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkJcHJpbnRmKCIgJWx1IiwgaSk7IFwKKwkJfQorCisjZGVmaW5lIERBVEVPVVQoKSB7IHRpbWVfdCB0OyBzdHJ1Y3QgdG0gKnRtOyBjaGFyIHN0clsyNTZdOyBcCisJCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOyBcCisJCQl0ID0gKHRpbWVfdCkgRVhUUkFDVF8zMkJJVFMoYnApOyBcCisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKKwkJCXRtID0gbG9jYWx0aW1lKCZ0KTsgXAorCQkJc3RyZnRpbWUoc3RyLCAyNTYsICIlWS8lbS8lZCAlVCIsIHRtKTsgXAorCQkJcHJpbnRmKCIgJXMiLCBzdHIpOyBcCisJCX0KKworI2RlZmluZSBTVE9SRUFUVFJPVVQoKSB7IHVuc2lnbmVkIGxvbmcgbWFzaywgaTsgXAorCQkJVENIRUNLMihicFswXSwgKHNpemVvZihpbnQzMl90KSo2KSk7IFwKKwkJCW1hc2sgPSBFWFRSQUNUXzMyQklUUyhicCk7IGJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkJaWYgKG1hc2spIHByaW50ZiAoIiBTdG9yZVN0YXR1cyIpOyBcCisJCSAgICAgICAgaWYgKG1hc2sgJiAxKSB7IHByaW50ZigiIGRhdGUiKTsgREFURU9VVCgpOyB9IFwKKwkJCWVsc2UgYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOyBicCArPSBzaXplb2YoaW50MzJfdCk7IFwKKwkJICAgICAgICBpZiAobWFzayAmIDIpIHByaW50ZigiIG93bmVyICVsdSIsIGkpOyAgXAorCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCSAgICAgICAgaWYgKG1hc2sgJiA0KSBwcmludGYoIiBncm91cCAlbHUiLCBpKTsgXAorCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCisJCSAgICAgICAgaWYgKG1hc2sgJiA4KSBwcmludGYoIiBtb2RlICVsbyIsIGkgJiAwNzc3Nyk7IFwKKwkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7IGJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkgICAgICAgIGlmIChtYXNrICYgMTYpIHByaW50ZigiIHNlZ3NpemUgJWx1IiwgaSk7IFwKKwkJCS8qIHVuZG9jdW1lbnRlZCBpbiAzLjMgZG9jdSAqLyBcCisJCSAgICAgICAgaWYgKG1hc2sgJiAxMDI0KSBwcmludGYoIiBmc3luYyIpOyAgXAorCQl9CisKKyNkZWZpbmUgVUJJS19WRVJTSU9OT1VUKCkge2ludDMyX3QgZXBvY2g7IGludDMyX3QgY291bnRlcjsgXAorCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpICogMik7IFwKKwkJCWVwb2NoID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKKwkJCWNvdW50ZXIgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkJcHJpbnRmKCIgJWQuJWQiLCBlcG9jaCwgY291bnRlcik7IFwKKwkJfQorCisjZGVmaW5lIEFGU1VVSURPVVQoKSB7dV9pbnQzMl90IHRlbXA7IGludCBpOyBcCisJCQlUQ0hFQ0syKGJwWzBdLCAxMSpzaXplb2YodV9pbnQzMl90KSk7IFwKKwkJCXRlbXAgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKKwkJCWJwICs9IHNpemVvZih1X2ludDMyX3QpOyBcCisJCQlwcmludGYoIiAlMDh4IiwgdGVtcCk7IFwKKwkJCXRlbXAgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKKwkJCWJwICs9IHNpemVvZih1X2ludDMyX3QpOyBcCisJCQlwcmludGYoIiUwNHgiLCB0ZW1wKTsgXAorCQkJdGVtcCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7IFwKKwkJCXByaW50ZigiJTA0eCIsIHRlbXApOyBcCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7IFwKKwkJCQl0ZW1wID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCisJCQkJYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7IFwKKwkJCQlwcmludGYoIiUwMngiLCAodW5zaWduZWQgY2hhcikgdGVtcCk7IFwKKwkJCX0gXAorCQl9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzaWNrZXN0IG9uZSBvZiBhbGwKKyAqLworCisjZGVmaW5lIFZFQ09VVChNQVgpIHsgdV9jaGFyICpzcDsgXAorCQkJdV9jaGFyIHNbQUZTTkFNRU1BWF07IFwKKwkJCWludCBrOyBcCisJCQlpZiAoKE1BWCkgKyAxID4gc2l6ZW9mKHMpKSBcCisJCQkJZ290byB0cnVuYzsgXAorCQkJVENIRUNLMihicFswXSwgKE1BWCkgKiBzaXplb2YoaW50MzJfdCkpOyBcCisJCQlzcCA9IHM7IFwKKwkJCWZvciAoayA9IDA7IGsgPCAoTUFYKTsgaysrKSB7IFwKKwkJCQkqc3ArKyA9ICh1X2NoYXIpIEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAorCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAorCQkJfSBcCisJCQlzWyhNQVgpXSA9ICdcMCc7IFwKKwkJCXByaW50ZigiIFwiIik7IFwKKwkJCWZuX3ByaW50KHMsIE5VTEwpOyBcCisJCQlwcmludGYoIlwiIik7IFwKKwkJfQorCisvKgorICogSGFuZGxlIGNhbGxzIHRvIHRoZSBBRlMgZmlsZSBzZXJ2aWNlIChmcykKKyAqLworCitzdGF0aWMgdm9pZAorZnNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgZnNfb3A7CisJdW5zaWduZWQgbG9uZyBpOworCisJaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKKwkJcmV0dXJuOworCisJaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgeworCQlnb3RvIHRydW5jOworCX0KKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIGZzaW50L2Fmc2ludC54ZworCSAqLworCisJZnNfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7CisKKwlwcmludGYoIiBmcyBjYWxsICVzIiwgdG9rMnN0cihmc19yZXEsICJvcCMlZCIsIGZzX29wKSk7CisKKwkvKgorCSAqIFByaW50IG91dCBhcmd1bWVudHMgdG8gc29tZSBvZiB0aGUgQUZTIGNhbGxzLiAgVGhpcyBzdHVmZiBpcworCSAqIGFsbCBmcm9tIGFmc2ludC54ZworCSAqLworCisJYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgNDsKKworCS8qCisJICogU2lnaC4gIFRoaXMgaXMgZ3Jvc3MuICBSaXRjaGllIGZvcmdpdmUgbWUuCisJICovCisKKwlzd2l0Y2ggKGZzX29wKSB7CisJCWNhc2UgMTMwOgkvKiBGZXRjaCBkYXRhICovCisJCQlGSURPVVQoKTsKKwkJCXByaW50ZigiIG9mZnNldCIpOworCQkJVUlOVE9VVCgpOworCQkJcHJpbnRmKCIgbGVuZ3RoIik7CisJCQlVSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxMzE6CS8qIEZldGNoIEFDTCAqLworCQljYXNlIDEzMjoJLyogRmV0Y2ggU3RhdHVzICovCisJCWNhc2UgMTQzOgkvKiBPbGQgc2V0IGxvY2sgKi8KKwkJY2FzZSAxNDQ6CS8qIE9sZCBleHRlbmQgbG9jayAqLworCQljYXNlIDE0NToJLyogT2xkIHJlbGVhc2UgbG9jayAqLworCQljYXNlIDE1NjoJLyogU2V0IGxvY2sgKi8KKwkJY2FzZSAxNTc6CS8qIEV4dGVuZCBsb2NrICovCisJCWNhc2UgMTU4OgkvKiBSZWxlYXNlIGxvY2sgKi8KKwkJCUZJRE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgMTM1OgkvKiBTdG9yZSBzdGF0dXMgKi8KKwkJCUZJRE9VVCgpOworCQkJU1RPUkVBVFRST1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxMzM6CS8qIFN0b3JlIGRhdGEgKi8KKwkJCUZJRE9VVCgpOworCQkJU1RPUkVBVFRST1VUKCk7CisJCQlwcmludGYoIiBvZmZzZXQiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCXByaW50ZigiIGxlbmd0aCIpOworCQkJVUlOVE9VVCgpOworCQkJcHJpbnRmKCIgZmxlbiIpOworCQkJVUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgMTM0OgkvKiBTdG9yZSBBQ0wgKi8KKwkJeworCQkJY2hhciBhW0FGU09QQVFVRU1BWCsxXTsKKwkJCUZJRE9VVCgpOworCQkJVENIRUNLMihicFswXSwgNCk7CisJCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJVENIRUNLMihicFswXSwgaSk7CisJCQlpID0gbWluKEFGU09QQVFVRU1BWCwgaSk7CisJCQlzdHJuY3B5KGEsIChjaGFyICopIGJwLCBpKTsKKwkJCWFbaV0gPSAnXDAnOworCQkJYWNsX3ByaW50KCh1X2NoYXIgKikgYSwgc2l6ZW9mKGEpLCAodV9jaGFyICopIGEgKyBpKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTM3OgkvKiBDcmVhdGUgZmlsZSAqLworCQljYXNlIDE0MToJLyogTWFrZURpciAqLworCQkJRklET1VUKCk7CisJCQlTVFJPVVQoQUZTTkFNRU1BWCk7CisJCQlTVE9SRUFUVFJPVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDEzNjoJLyogUmVtb3ZlIGZpbGUgKi8KKwkJY2FzZSAxNDI6CS8qIFJlbW92ZSBkaXJlY3RvcnkgKi8KKwkJCUZJRE9VVCgpOworCQkJU1RST1VUKEFGU05BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgMTM4OgkvKiBSZW5hbWUgZmlsZSAqLworCQkJcHJpbnRmKCIgb2xkIik7CisJCQlGSURPVVQoKTsKKwkJCVNUUk9VVChBRlNOQU1FTUFYKTsKKwkJCXByaW50ZigiIG5ldyIpOworCQkJRklET1VUKCk7CisJCQlTVFJPVVQoQUZTTkFNRU1BWCk7CisJCQlicmVhazsKKwkJY2FzZSAxMzk6CS8qIFN5bWxpbmsgKi8KKwkJCUZJRE9VVCgpOworCQkJU1RST1VUKEFGU05BTUVNQVgpOworCQkJcHJpbnRmKCIgbGluayB0byIpOworCQkJU1RST1VUKEFGU05BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgMTQwOgkvKiBMaW5rICovCisJCQlGSURPVVQoKTsKKwkJCVNUUk9VVChBRlNOQU1FTUFYKTsKKwkJCXByaW50ZigiIGxpbmsgdG8iKTsKKwkJCUZJRE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgMTQ4OgkvKiBHZXQgdm9sdW1lIGluZm8gKi8KKwkJCVNUUk9VVChBRlNOQU1FTUFYKTsKKwkJCWJyZWFrOworCQljYXNlIDE0OToJLyogR2V0IHZvbHVtZSBzdGF0cyAqLworCQljYXNlIDE1MDoJLyogU2V0IHZvbHVtZSBzdGF0cyAqLworCQkJcHJpbnRmKCIgdm9saWQiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDE1NDoJLyogTmV3IGdldCB2b2x1bWUgaW5mbyAqLworCQkJcHJpbnRmKCIgdm9sbmFtZSIpOworCQkJU1RST1VUKEFGU05BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgMTU1OgkvKiBCdWxrIHN0YXQgKi8KKwkJeworCQkJdW5zaWduZWQgbG9uZyBqOworCQkJVENIRUNLMihicFswXSwgNCk7CisJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQkJRklET1VUKCk7CisJCQkJaWYgKGkgIT0gaiAtIDEpCisJCQkJCXByaW50ZigiLCIpOworCQkJfQorCQkJaWYgKGogPT0gMCkKKwkJCQlwcmludGYoIiA8bm9uZSE+Iik7CisJCX0KKwkJZGVmYXVsdDoKKwkJCTsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8ZnNdIik7Cit9CisKKy8qCisgKiBIYW5kbGUgcmVwbGllcyB0byB0aGUgQUZTIGZpbGUgc2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCitmc19yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJc3RydWN0IHJ4X2hlYWRlciAqcnhoOworCisJaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKKwkJcmV0dXJuOworCisJcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7CisKKwkvKgorCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcworCSAqIGdsZWFuZWQgZnJvbSBmc2ludC9hZnNpbnQueGcKKwkgKi8KKworCXByaW50ZigiIGZzIHJlcGx5ICVzIiwgdG9rMnN0cihmc19yZXEsICJvcCMlZCIsIG9wY29kZSkpOworCisJYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgaW50ZXJwcmV0IHRoZSByZXNwb25zZQorCSAqLworCisJaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKSB7CisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgMTMxOgkvKiBGZXRjaCBBQ0wgKi8KKwkJeworCQkJY2hhciBhW0FGU09QQVFVRU1BWCsxXTsKKwkJCVRDSEVDSzIoYnBbMF0sIDQpOworCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKwkJCVRDSEVDSzIoYnBbMF0sIGkpOworCQkJaSA9IG1pbihBRlNPUEFRVUVNQVgsIGkpOworCQkJc3RybmNweShhLCAoY2hhciAqKSBicCwgaSk7CisJCQlhW2ldID0gJ1wwJzsKKwkJCWFjbF9wcmludCgodV9jaGFyICopIGEsIHNpemVvZihhKSwgKHVfY2hhciAqKSBhICsgaSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDEzNzoJLyogQ3JlYXRlIGZpbGUgKi8KKwkJY2FzZSAxNDE6CS8qIE1ha2VEaXIgKi8KKwkJCXByaW50ZigiIG5ldyIpOworCQkJRklET1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxNTE6CS8qIEdldCByb290IHZvbHVtZSAqLworCQkJcHJpbnRmKCIgcm9vdCB2b2x1bWUiKTsKKwkJCVNUUk9VVChBRlNOQU1FTUFYKTsKKwkJCWJyZWFrOworCQljYXNlIDE1MzoJLyogR2V0IHRpbWUgKi8KKwkJCURBVEVPVVQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfSBlbHNlIGlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfQUJPUlQpIHsKKwkJaW50IGk7CisKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBqdXN0IHByaW50IG91dCB0aGUgcmV0dXJuIGNvZGUKKwkJICovCisJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7CisJCWkgPSAoaW50KSBFWFRSQUNUXzMyQklUUyhicCk7CisJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKworCQlwcmludGYoIiBlcnJvciAlcyIsIHRvazJzdHIoYWZzX2ZzX2Vycm9ycywgIiMlZCIsIGkpKTsKKwl9IGVsc2UgeworCQlwcmludGYoIiBzdHJhbmdlIGZzIHJlcGx5IG9mIHR5cGUgJWQiLCByeGgtPnR5cGUpOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xmc10iKTsKK30KKworLyoKKyAqIFByaW50IG91dCBhbiBBRlMgQUNMIHN0cmluZy4gIEFuIEFGUyBBQ0wgaXMgYSBzdHJpbmcgdGhhdCBoYXMgdGhlCisgKiBmb2xsb3dpbmcgZm9ybWF0OgorICoKKyAqIDxwb3NpdGl2ZT4gPG5lZ2F0aXZlPgorICogPHVpZDE+IDxhY2xiaXRzMT4KKyAqIC4uLi4KKyAqCisgKiAicG9zaXRpdmUiIGFuZCAibmVnYXRpdmUiIGFyZSBpbnRlZ2VycyB3aGljaCBjb250YWluIHRoZSBudW1iZXIgb2YKKyAqIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBBQ0wncyBpbiB0aGUgc3RyaW5nLiAgVGhlIHVpZC9hY2xiaXRzIHBhaXIgYXJlCisgKiBBU0NJSSBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIFVJRC9QVFMgcmVjb3JkIGFuZCBhbmQgYSBhc2NpaSBudW1iZXIKKyAqIHJlcHJlc2VudGluZyBhIGxvZ2ljYWwgT1Igb2YgYWxsIHRoZSBBQ0wgcGVybWlzc2lvbiBiaXRzCisgKi8KKworc3RhdGljIHZvaWQKK2FjbF9wcmludCh1X2NoYXIgKnMsIGludCBtYXhzaXplLCB1X2NoYXIgKmVuZCkKK3sKKwlpbnQgcG9zLCBuZWcsIGFjbDsKKwlpbnQgbiwgaTsKKwljaGFyICp1c2VyOworCWNoYXIgZm10WzEwMjRdOworCisJaWYgKCh1c2VyID0gKGNoYXIgKiltYWxsb2MobWF4c2l6ZSkpID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChzc2NhbmYoKGNoYXIgKikgcywgIiVkICVkXG4lbiIsICZwb3MsICZuZWcsICZuKSAhPSAyKQorCQlnb3RvIGZpbmlzaDsKKworCXMgKz0gbjsKKworCWlmIChzID4gZW5kKQorCQlnb3RvIGZpbmlzaDsKKworCS8qCisJICogVGhpcyB3YWNreSBvcmRlciBwcmVzZXJ2ZXMgdGhlIG9yZGVyIHVzZWQgYnkgdGhlICJmcyIgY29tbWFuZAorCSAqLworCisjZGVmaW5lIEFDTE9VVChhY2wpIFwKKwlpZiAoYWNsICYgUFJTRlNfUkVBRCkgXAorCQlwcmludGYoInIiKTsgXAorCWlmIChhY2wgJiBQUlNGU19MT09LVVApIFwKKwkJcHJpbnRmKCJsIik7IFwKKwlpZiAoYWNsICYgUFJTRlNfSU5TRVJUKSBcCisJCXByaW50ZigiaSIpOyBcCisJaWYgKGFjbCAmIFBSU0ZTX0RFTEVURSkgXAorCQlwcmludGYoImQiKTsgXAorCWlmIChhY2wgJiBQUlNGU19XUklURSkgXAorCQlwcmludGYoInciKTsgXAorCWlmIChhY2wgJiBQUlNGU19MT0NLKSBcCisJCXByaW50ZigiayIpOyBcCisJaWYgKGFjbCAmIFBSU0ZTX0FETUlOSVNURVIpIFwKKwkJcHJpbnRmKCJhIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9zOyBpKyspIHsKKwkJc25wcmludGYoZm10LCBzaXplb2YoZm10KSwgIiUlJWRzICUlZFxuJSVuIiwgbWF4c2l6ZSAtIDEpOworCQlpZiAoc3NjYW5mKChjaGFyICopIHMsIGZtdCwgdXNlciwgJmFjbCwgJm4pICE9IDIpCisJCQlnb3RvIGZpbmlzaDsKKwkJcyArPSBuOworCQlwcmludGYoIiAreyIpOworCQlmbl9wcmludCgodV9jaGFyICopdXNlciwgTlVMTCk7CisJCXByaW50ZigiICIpOworCQlBQ0xPVVQoYWNsKTsKKwkJcHJpbnRmKCJ9Iik7CisJCWlmIChzID4gZW5kKQorCQkJZ290byBmaW5pc2g7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5lZzsgaSsrKSB7CisJCXNucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlJSVkcyAlJWRcbiUlbiIsIG1heHNpemUgLSAxKTsKKwkJaWYgKHNzY2FuZigoY2hhciAqKSBzLCBmbXQsIHVzZXIsICZhY2wsICZuKSAhPSAyKQorCQkJZ290byBmaW5pc2g7CisJCXMgKz0gbjsKKwkJcHJpbnRmKCIgLXsiKTsKKwkJZm5fcHJpbnQoKHVfY2hhciAqKXVzZXIsIE5VTEwpOworCQlwcmludGYoIiAiKTsKKwkJQUNMT1VUKGFjbCk7CisJCXByaW50ZigifSIpOworCQlpZiAocyA+IGVuZCkKKwkJCWdvdG8gZmluaXNoOworCX0KKworZmluaXNoOgorCWZyZWUodXNlcik7CisJcmV0dXJuOworfQorCisjdW5kZWYgQUNMT1VUCisKKy8qCisgKiBIYW5kbGUgY2FsbHMgdG8gdGhlIEFGUyBjYWxsYmFjayBzZXJ2aWNlCisgKi8KKworc3RhdGljIHZvaWQKK2NiX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCit7CisJaW50IGNiX29wOworCXVuc2lnbmVkIGxvbmcgaTsKKworCWlmIChsZW5ndGggPD0gKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCisJCXJldHVybjsKKworCWlmIChzbmFwZW5kIC0gYnAgKyAxIDw9IChpbnQpKHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIHNpemVvZihpbnQzMl90KSkpIHsKKwkJZ290byB0cnVuYzsKKwl9CisKKwkvKgorCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcworCSAqIGdsZWFuZWQgZnJvbSBmc2ludC9hZnNjYmludC54ZworCSAqLworCisJY2Jfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7CisKKwlwcmludGYoIiBjYiBjYWxsICVzIiwgdG9rMnN0cihjYl9yZXEsICJvcCMlZCIsIGNiX29wKSk7CisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyA0OworCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gZnNpbnQvYWZzY2JpbnQueGcKKwkgKi8KKworCXN3aXRjaCAoY2Jfb3ApIHsKKwkJY2FzZSAyMDQ6CQkvKiBDYWxsYmFjayAqLworCQl7CisJCQl1bnNpZ25lZCBsb25nIGosIHQ7CisJCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJCWogPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKwkJCQlGSURPVVQoKTsKKwkJCQlpZiAoaSAhPSBqIC0gMSkKKwkJCQkJcHJpbnRmKCIsIik7CisJCQl9CisKKwkJCWlmIChqID09IDApCisJCQkJcHJpbnRmKCIgPG5vbmUhPiIpOworCisJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCisJCQlpZiAoaiAhPSAwKQorCQkJCXByaW50ZigiOyIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQkJcHJpbnRmKCIgdmVyIik7CisJCQkJSU5UT1VUKCk7CisJCQkJcHJpbnRmKCIgZXhwaXJlcyIpOworCQkJCURBVEVPVVQoKTsKKwkJCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJCQl0ID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKwkJCQl0b2syc3RyKGNiX3R5cGVzLCAidHlwZSAlZCIsIHQpOworCQkJfQorCQl9CisJCWNhc2UgMjE0OiB7CisJCQlwcmludGYoIiBhZnN1dWlkIik7CisJCQlBRlNVVUlET1VUKCk7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xjYl0iKTsKK30KKworLyoKKyAqIEhhbmRsZSByZXBsaWVzIHRvIHRoZSBBRlMgQ2FsbGJhY2sgU2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCitjYl9yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKK3sKKwlzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIGZzaW50L2Fmc2NiaW50LnhnCisJICovCisKKwlwcmludGYoIiBjYiByZXBseSAlcyIsIHRvazJzdHIoY2JfcmVxLCAib3AjJWQiLCBvcGNvZGUpKTsKKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKTsKKworCS8qCisJICogSWYgaXQgd2FzIGEgZGF0YSBwYWNrZXQsIGludGVycHJldCB0aGUgcmVzcG9uc2UuCisJICovCisKKwlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEpCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgMjEzOgkvKiBJbml0Q2FsbEJhY2tTdGF0ZTMgKi8KKwkJCUFGU1VVSURPVVQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQk7CisJCX0KKwllbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBqdXN0IHByaW50IG91dCB0aGUgcmV0dXJuIGNvZGUKKwkJICovCisJCXByaW50ZigiIGVycmNvZGUiKTsKKwkJSU5UT1VUKCk7CisJfQorCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiBbfGNiXSIpOworfQorCisvKgorICogSGFuZGxlIGNhbGxzIHRvIHRoZSBBRlMgcHJvdGVjdGlvbiBkYXRhYmFzZSBzZXJ2ZXIKKyAqLworCitzdGF0aWMgdm9pZAorcHJvdF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlpbnQgcHRfb3A7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKSB7CisJCWdvdG8gdHJ1bmM7CisJfQorCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gcHRzZXJ2ZXIvcHRpbnQueGcKKwkgKi8KKworCXB0X29wID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOworCisJcHJpbnRmKCIgcHQiKTsKKworCWlmIChpc191YmlrKHB0X29wKSkgeworCQl1YmlrX3ByaW50KGJwKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiIGNhbGwgJXMiLCB0b2syc3RyKHB0X3JlcSwgIm9wIyVkIiwgcHRfb3ApKTsKKworCS8qCisJICogRGVjb2RlIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgUFQgY2FsbHMKKwkgKi8KKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIDQ7CisKKwlzd2l0Y2ggKHB0X29wKSB7CisJCWNhc2UgNTAwOgkvKiBJIE5ldyBVc2VyICovCisJCQlTVFJPVVQoUFJOQU1FTUFYKTsKKwkJCXByaW50ZigiIGlkIik7CisJCQlJTlRPVVQoKTsKKwkJCXByaW50ZigiIG9sZGlkIik7CisJCQlJTlRPVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDUwMToJLyogV2hlcmUgaXMgaXQgKi8KKwkJY2FzZSA1MDY6CS8qIERlbGV0ZSAqLworCQljYXNlIDUwODoJLyogR2V0IENQUyAqLworCQljYXNlIDUxMjoJLyogTGlzdCBlbnRyeSAqLworCQljYXNlIDUxNDoJLyogTGlzdCBlbGVtZW50cyAqLworCQljYXNlIDUxNzoJLyogTGlzdCBvd25lZCAqLworCQljYXNlIDUxODoJLyogR2V0IENQUzIgKi8KKwkJY2FzZSA1MTk6CS8qIEdldCBob3N0IENQUyAqLworCQkJcHJpbnRmKCIgaWQiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgNTAyOgkvKiBEdW1wIGVudHJ5ICovCisJCQlwcmludGYoIiBwb3MiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgNTAzOgkvKiBBZGQgdG8gZ3JvdXAgKi8KKwkJY2FzZSA1MDc6CS8qIFJlbW92ZSBmcm9tIGdyb3VwICovCisJCWNhc2UgNTE1OgkvKiBJcyBhIG1lbWJlciBvZj8gKi8KKwkJCXByaW50ZigiIHVpZCIpOworCQkJSU5UT1VUKCk7CisJCQlwcmludGYoIiBnaWQiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgNTA0OgkvKiBOYW1lIHRvIElEICovCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgajsKKwkJCVRDSEVDSzIoYnBbMF0sIDQpOworCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKworCQkJLyoKKwkJCSAqIFdobyBkZXNpZ25lZCB0aGlzIGNoaWNrZW4tc2hpdCBwcm90b2NvbD8KKwkJCSAqCisJCQkgKiBFYWNoIGNoYXJhY3RlciBpcyBzdG9yZWQgYXMgYSAzMi1iaXQKKwkJCSAqIGludGVnZXIhCisJCQkgKi8KKworCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQkJCVZFQ09VVChQUk5BTUVNQVgpOworCQkJfQorCQkJaWYgKGogPT0gMCkKKwkJCQlwcmludGYoIiA8bm9uZSE+Iik7CisJCX0KKwkJCWJyZWFrOworCQljYXNlIDUwNToJLyogSWQgdG8gbmFtZSAqLworCQl7CisJCQl1bnNpZ25lZCBsb25nIGo7CisJCQlwcmludGYoIiBpZHM6Iik7CisJCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCUlOVE9VVCgpOworCQkJaWYgKGogPT0gMCkKKwkJCQlwcmludGYoIiA8bm9uZSE+Iik7CisJCX0KKwkJCWJyZWFrOworCQljYXNlIDUwOToJLyogTmV3IGVudHJ5ICovCisJCQlTVFJPVVQoUFJOQU1FTUFYKTsKKwkJCXByaW50ZigiIGZsYWciKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgb2lkIik7CisJCQlJTlRPVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDUxMToJLyogU2V0IG1heCAqLworCQkJcHJpbnRmKCIgaWQiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgZ2ZsYWciKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgNTEzOgkvKiBDaGFuZ2UgZW50cnkgKi8KKwkJCXByaW50ZigiIGlkIik7CisJCQlJTlRPVVQoKTsKKwkJCVNUUk9VVChQUk5BTUVNQVgpOworCQkJcHJpbnRmKCIgb2xkaWQiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgbmV3aWQiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgNTIwOgkvKiBVcGRhdGUgZW50cnkgKi8KKwkJCXByaW50ZigiIGlkIik7CisJCQlJTlRPVVQoKTsKKwkJCVNUUk9VVChQUk5BTUVNQVgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQk7CisJfQorCisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8cHRdIik7Cit9CisKKy8qCisgKiBIYW5kbGUgcmVwbGllcyB0byB0aGUgQUZTIHByb3RlY3Rpb24gc2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCitwcm90X3JlcGx5X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgsIGludDMyX3Qgb3Bjb2RlKQoreworCXN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAobGVuZ3RoIDwgKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCisJCXJldHVybjsKKworCXJ4aCA9IChzdHJ1Y3QgcnhfaGVhZGVyICopIGJwOworCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gcHRzZXJ2ZXIvcHRpbnQueGcuICBDaGVjayB0byBzZWUgaWYgaXQncyBhCisJICogVWJpayBjYWxsLCBob3dldmVyLgorCSAqLworCisJcHJpbnRmKCIgcHQiKTsKKworCWlmIChpc191YmlrKG9wY29kZSkpIHsKKwkJdWJpa19yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCIgcmVwbHkgJXMiLCB0b2syc3RyKHB0X3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7CisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7CisKKwkvKgorCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBpbnRlcnByZXQgdGhlIHJlc3BvbnNlCisJICovCisKKwlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEpCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgNTA0OgkJLyogTmFtZSB0byBJRCAqLworCQl7CisJCQl1bnNpZ25lZCBsb25nIGo7CisJCQlwcmludGYoIiBpZHM6Iik7CisJCQlUQ0hFQ0syKGJwWzBdLCA0KTsKKwkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCUlOVE9VVCgpOworCQkJaWYgKGogPT0gMCkKKwkJCQlwcmludGYoIiA8bm9uZSE+Iik7CisJCX0KKwkJCWJyZWFrOworCQljYXNlIDUwNToJCS8qIElEIHRvIG5hbWUgKi8KKwkJeworCQkJdW5zaWduZWQgbG9uZyBqOworCQkJVENIRUNLMihicFswXSwgNCk7CisJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCisJCQkvKgorCQkJICogV2hvIGRlc2lnbmVkIHRoaXMgY2hpY2tlbi1zaGl0IHByb3RvY29sPworCQkJICoKKwkJCSAqIEVhY2ggY2hhcmFjdGVyIGlzIHN0b3JlZCBhcyBhIDMyLWJpdAorCQkJICogaW50ZWdlciEKKwkJCSAqLworCisJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQkJVkVDT1VUKFBSTkFNRU1BWCk7CisJCQl9CisJCQlpZiAoaiA9PSAwKQorCQkJCXByaW50ZigiIDxub25lIT4iKTsKKwkJfQorCQkJYnJlYWs7CisJCWNhc2UgNTA4OgkJLyogR2V0IENQUyAqLworCQljYXNlIDUxNDoJCS8qIExpc3QgZWxlbWVudHMgKi8KKwkJY2FzZSA1MTc6CQkvKiBMaXN0IG93bmVkICovCisJCWNhc2UgNTE4OgkJLyogR2V0IENQUzIgKi8KKwkJY2FzZSA1MTk6CQkvKiBHZXQgaG9zdCBDUFMgKi8KKwkJeworCQkJdW5zaWduZWQgbG9uZyBqOworCQkJVENIRUNLMihicFswXSwgNCk7CisJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQkJCUlOVE9VVCgpOworCQkJfQorCQkJaWYgKGogPT0gMCkKKwkJCQlwcmludGYoIiA8bm9uZSE+Iik7CisJCX0KKwkJCWJyZWFrOworCQljYXNlIDUxMDoJCS8qIExpc3QgbWF4ICovCisJCQlwcmludGYoIiBtYXh1aWQiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgbWF4Z2lkIik7CisJCQlJTlRPVVQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJZWxzZSB7CisJCS8qCisJCSAqIE90aGVyd2lzZSwganVzdCBwcmludCBvdXQgdGhlIHJldHVybiBjb2RlCisJCSAqLworCQlwcmludGYoIiBlcnJjb2RlIik7CisJCUlOVE9VVCgpOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xwdF0iKTsKK30KKworLyoKKyAqIEhhbmRsZSBjYWxscyB0byB0aGUgQUZTIHZvbHVtZSBsb2NhdGlvbiBkYXRhYmFzZSBzZXJ2aWNlCisgKi8KKworc3RhdGljIHZvaWQKK3ZsZGJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgdmxkYl9vcDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKSB7CisJCWdvdG8gdHJ1bmM7CisJfQorCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gdmxzZXJ2ZXIvdmxkYmludC54ZworCSAqLworCisJdmxkYl9vcCA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKKworCXByaW50ZigiIHZsZGIiKTsKKworCWlmIChpc191YmlrKHZsZGJfb3ApKSB7CisJCXViaWtfcHJpbnQoYnApOworCQlyZXR1cm47CisJfQorCXByaW50ZigiIGNhbGwgJXMiLCB0b2syc3RyKHZsZGJfcmVxLCAib3AjJWQiLCB2bGRiX29wKSk7CisKKwkvKgorCSAqIERlY29kZSBzb21lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIFZMREIgY2FsbHMKKwkgKi8KKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIDQ7CisKKwlzd2l0Y2ggKHZsZGJfb3ApIHsKKwkJY2FzZSA1MDE6CS8qIENyZWF0ZSBuZXcgdm9sdW1lICovCisJCWNhc2UgNTE3OgkvKiBDcmVhdGUgZW50cnkgTiAqLworCQkJVkVDT1VUKFZMTkFNRU1BWCk7CisJCQlicmVhazsKKwkJY2FzZSA1MDI6CS8qIERlbGV0ZSBlbnRyeSAqLworCQljYXNlIDUwMzoJLyogR2V0IGVudHJ5IGJ5IElEICovCisJCWNhc2UgNTA3OgkvKiBVcGRhdGUgZW50cnkgKi8KKwkJY2FzZSA1MDg6CS8qIFNldCBsb2NrICovCisJCWNhc2UgNTA5OgkvKiBSZWxlYXNlIGxvY2sgKi8KKwkJY2FzZSA1MTg6CS8qIEdldCBlbnRyeSBieSBJRCBOICovCisJCQlwcmludGYoIiB2b2xpZCIpOworCQkJSU5UT1VUKCk7CisJCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOworCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKwkJCWlmIChpIDw9IDIpCisJCQkJcHJpbnRmKCIgdHlwZSAlcyIsIHZvbHR5cGVbaV0pOworCQkJYnJlYWs7CisJCWNhc2UgNTA0OgkvKiBHZXQgZW50cnkgYnkgbmFtZSAqLworCQljYXNlIDUxOToJLyogR2V0IGVudHJ5IGJ5IG5hbWUgTiAqLworCQljYXNlIDUyNDoJLyogVXBkYXRlIGVudHJ5IGJ5IG5hbWUgKi8KKwkJY2FzZSA1Mjc6CS8qIEdldCBlbnRyeSBieSBuYW1lIFUgKi8KKwkJCVNUUk9VVChWTE5BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgNTA1OgkvKiBHZXQgbmV3IHZvbCBpZCAqLworCQkJcHJpbnRmKCIgYnVtcCIpOworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSA1MDY6CS8qIFJlcGxhY2UgZW50cnkgKi8KKwkJY2FzZSA1MjA6CS8qIFJlcGxhY2UgZW50cnkgTiAqLworCQkJcHJpbnRmKCIgdm9saWQiKTsKKwkJCUlOVE9VVCgpOworCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQlpZiAoaSA8PSAyKQorCQkJCXByaW50ZigiIHR5cGUgJXMiLCB2b2x0eXBlW2ldKTsKKwkJCVZFQ09VVChWTE5BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgNTEwOgkvKiBMaXN0IGVudHJ5ICovCisJCWNhc2UgNTIxOgkvKiBMaXN0IGVudHJ5IE4gKi8KKwkJCXByaW50ZigiIGluZGV4Iik7CisJCQlJTlRPVVQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3x2bGRiXSIpOworfQorCisvKgorICogSGFuZGxlIHJlcGxpZXMgdG8gdGhlIEFGUyB2b2x1bWUgbG9jYXRpb24gZGF0YWJhc2Ugc2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCit2bGRiX3JlcGx5X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgsIGludDMyX3Qgb3Bjb2RlKQoreworCXN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpZiAobGVuZ3RoIDwgKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCisJCXJldHVybjsKKworCXJ4aCA9IChzdHJ1Y3QgcnhfaGVhZGVyICopIGJwOworCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gdmxzZXJ2ZXIvdmxkYmludC54Zy4gIENoZWNrIHRvIHNlZSBpZiBpdCdzIGEKKwkgKiBVYmlrIGNhbGwsIGhvd2V2ZXIuCisJICovCisKKwlwcmludGYoIiB2bGRiIik7CisKKwlpZiAoaXNfdWJpayhvcGNvZGUpKSB7CisJCXViaWtfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZigiIHJlcGx5ICVzIiwgdG9rMnN0cih2bGRiX3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7CisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7CisKKwkvKgorCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBpbnRlcnByZXQgdGhlIHJlc3BvbnNlCisJICovCisKKwlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEpCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgNTEwOgkvKiBMaXN0IGVudHJ5ICovCisJCQlwcmludGYoIiBjb3VudCIpOworCQkJSU5UT1VUKCk7CisJCQlwcmludGYoIiBuZXh0aW5kZXgiKTsKKwkJCUlOVE9VVCgpOworCQljYXNlIDUwMzoJLyogR2V0IGVudHJ5IGJ5IGlkICovCisJCWNhc2UgNTA0OgkvKiBHZXQgZW50cnkgYnkgbmFtZSAqLworCQl7CXVuc2lnbmVkIGxvbmcgbnNlcnZlcnMsIGo7CisJCQlWRUNPVVQoVkxOQU1FTUFYKTsKKwkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQlwcmludGYoIiBudW1zZXJ2ZXJzIik7CisJCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOworCQkJbnNlcnZlcnMgPSBFWFRSQUNUXzMyQklUUyhicCk7CisJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQlwcmludGYoIiAlbHUiLCBuc2VydmVycyk7CisJCQlwcmludGYoIiBzZXJ2ZXJzIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCQlpZiAoaSA8IG5zZXJ2ZXJzKQorCQkJCQlwcmludGYoIiAlcyIsCisJCQkJCSAgIGludG9hKCgoc3RydWN0IGluX2FkZHIgKikgYnApLT5zX2FkZHIpKTsKKwkJCQlicCArPSBzaXplb2YoaW50MzJfdCk7CisJCQl9CisJCQlwcmludGYoIiBwYXJ0aXRpb25zIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJCWlmIChpIDwgbnNlcnZlcnMgJiYgaiA8PSAyNikKKwkJCQkJcHJpbnRmKCIgJWMiLCAnYScgKyAoaW50KWopOworCQkJCWVsc2UgaWYgKGkgPCBuc2VydmVycykKKwkJCQkJcHJpbnRmKCIgJWx1Iiwgaik7CisJCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJfQorCQkJVENIRUNLMihicFswXSwgOCAqIHNpemVvZihpbnQzMl90KSk7CisJCQlicCArPSA4ICogc2l6ZW9mKGludDMyX3QpOworCQkJcHJpbnRmKCIgcnd2b2wiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCXByaW50ZigiIHJvdm9sIik7CisJCQlVSU5UT1VUKCk7CisJCQlwcmludGYoIiBiYWNrdXAiKTsKKwkJCVVJTlRPVVQoKTsKKwkJfQorCQkJYnJlYWs7CisJCWNhc2UgNTA1OgkvKiBHZXQgbmV3IHZvbHVtZSBJRCAqLworCQkJcHJpbnRmKCIgbmV3dm9sIik7CisJCQlVSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSA1MjE6CS8qIExpc3QgZW50cnkgKi8KKwkJY2FzZSA1Mjk6CS8qIExpc3QgZW50cnkgVSAqLworCQkJcHJpbnRmKCIgY291bnQiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgbmV4dGluZGV4Iik7CisJCQlJTlRPVVQoKTsKKwkJY2FzZSA1MTg6CS8qIEdldCBlbnRyeSBieSBJRCBOICovCisJCWNhc2UgNTE5OgkvKiBHZXQgZW50cnkgYnkgbmFtZSBOICovCisJCXsJdW5zaWduZWQgbG9uZyBuc2VydmVycywgajsKKwkJCVZFQ09VVChWTE5BTUVNQVgpOworCQkJcHJpbnRmKCIgbnVtc2VydmVycyIpOworCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCW5zZXJ2ZXJzID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJcHJpbnRmKCIgJWx1IiwgbnNlcnZlcnMpOworCQkJcHJpbnRmKCIgc2VydmVycyIpOworCQkJZm9yIChpID0gMDsgaSA8IDEzOyBpKyspIHsKKwkJCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOworCQkJCWlmIChpIDwgbnNlcnZlcnMpCisJCQkJCXByaW50ZigiICVzIiwKKwkJCQkJICAgaW50b2EoKChzdHJ1Y3QgaW5fYWRkciAqKSBicCktPnNfYWRkcikpOworCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKwkJCX0KKwkJCXByaW50ZigiIHBhcnRpdGlvbnMiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7CisJCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJCWlmIChpIDwgbnNlcnZlcnMgJiYgaiA8PSAyNikKKwkJCQkJcHJpbnRmKCIgJWMiLCAnYScgKyAoaW50KWopOworCQkJCWVsc2UgaWYgKGkgPCBuc2VydmVycykKKwkJCQkJcHJpbnRmKCIgJWx1Iiwgaik7CisJCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJfQorCQkJVENIRUNLMihicFswXSwgMTMgKiBzaXplb2YoaW50MzJfdCkpOworCQkJYnAgKz0gMTMgKiBzaXplb2YoaW50MzJfdCk7CisJCQlwcmludGYoIiByd3ZvbCIpOworCQkJVUlOVE9VVCgpOworCQkJcHJpbnRmKCIgcm92b2wiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCXByaW50ZigiIGJhY2t1cCIpOworCQkJVUlOVE9VVCgpOworCQl9CisJCQlicmVhazsKKwkJY2FzZSA1MjY6CS8qIEdldCBlbnRyeSBieSBJRCBVICovCisJCWNhc2UgNTI3OgkvKiBHZXQgZW50cnkgYnkgbmFtZSBVICovCisJCXsJdW5zaWduZWQgbG9uZyBuc2VydmVycywgajsKKwkJCVZFQ09VVChWTE5BTUVNQVgpOworCQkJcHJpbnRmKCIgbnVtc2VydmVycyIpOworCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCW5zZXJ2ZXJzID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJcHJpbnRmKCIgJWx1IiwgbnNlcnZlcnMpOworCQkJcHJpbnRmKCIgc2VydmVycyIpOworCQkJZm9yIChpID0gMDsgaSA8IDEzOyBpKyspIHsKKwkJCQlpZiAoaSA8IG5zZXJ2ZXJzKSB7CisJCQkJCXByaW50ZigiIGFmc3V1aWQiKTsKKwkJCQkJQUZTVVVJRE9VVCgpOworCQkJCX0gZWxzZSB7CisJCQkJCVRDSEVDSzIoYnBbMF0sIDQ0KTsKKwkJCQkJYnAgKz0gNDQ7CisJCQkJfQorCQkJfQorCQkJVENIRUNLMihicFswXSwgNCAqIDEzKTsKKwkJCWJwICs9IDQgKiAxMzsKKwkJCXByaW50ZigiIHBhcnRpdGlvbnMiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7CisJCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKKwkJCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJCWlmIChpIDwgbnNlcnZlcnMgJiYgaiA8PSAyNikKKwkJCQkJcHJpbnRmKCIgJWMiLCAnYScgKyAoaW50KWopOworCQkJCWVsc2UgaWYgKGkgPCBuc2VydmVycykKKwkJCQkJcHJpbnRmKCIgJWx1Iiwgaik7CisJCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJfQorCQkJVENIRUNLMihicFswXSwgMTMgKiBzaXplb2YoaW50MzJfdCkpOworCQkJYnAgKz0gMTMgKiBzaXplb2YoaW50MzJfdCk7CisJCQlwcmludGYoIiByd3ZvbCIpOworCQkJVUlOVE9VVCgpOworCQkJcHJpbnRmKCIgcm92b2wiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCXByaW50ZigiIGJhY2t1cCIpOworCQkJVUlOVE9VVCgpOworCQl9CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKworCWVsc2UgeworCQkvKgorCQkgKiBPdGhlcndpc2UsIGp1c3QgcHJpbnQgb3V0IHRoZSByZXR1cm4gY29kZQorCQkgKi8KKwkJcHJpbnRmKCIgZXJyY29kZSIpOworCQlJTlRPVVQoKTsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8dmxkYl0iKTsKK30KKworLyoKKyAqIEhhbmRsZSBjYWxscyB0byB0aGUgQUZTIEtlcmJlcm9zIEF1dGhlbnRpY2F0aW9uIHNlcnZpY2UKKyAqLworCitzdGF0aWMgdm9pZAora2F1dGhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKK3sKKwlpbnQga2F1dGhfb3A7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKSB7CisJCWdvdG8gdHJ1bmM7CisJfQorCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20ga2F1dGgva2F1dGgucmcKKwkgKi8KKworCWthdXRoX29wID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOworCisJcHJpbnRmKCIga2F1dGgiKTsKKworCWlmIChpc191YmlrKGthdXRoX29wKSkgeworCQl1YmlrX3ByaW50KGJwKTsKKwkJcmV0dXJuOworCX0KKworCisJcHJpbnRmKCIgY2FsbCAlcyIsIHRvazJzdHIoa2F1dGhfcmVxLCAib3AjJWQiLCBrYXV0aF9vcCkpOworCisJLyoKKwkgKiBEZWNvZGUgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBLQSBjYWxscworCSAqLworCisJYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgNDsKKworCXN3aXRjaCAoa2F1dGhfb3ApIHsKKwkJY2FzZSAxOgkJLyogQXV0aGVudGljYXRlIG9sZCAqLzsKKwkJY2FzZSAyMToJLyogQXV0aGVudGljYXRlICovCisJCWNhc2UgMjI6CS8qIEF1dGhlbnRpY2F0ZS1WMiAqLworCQljYXNlIDI6CQkvKiBDaGFuZ2UgUFcgKi8KKwkJY2FzZSA1OgkJLyogU2V0IGZpZWxkcyAqLworCQljYXNlIDY6CQkvKiBDcmVhdGUgdXNlciAqLworCQljYXNlIDc6CQkvKiBEZWxldGUgdXNlciAqLworCQljYXNlIDg6CQkvKiBHZXQgZW50cnkgKi8KKwkJY2FzZSAxNDoJLyogVW5sb2NrICovCisJCWNhc2UgMTU6CS8qIExvY2sgc3RhdHVzICovCisJCQlwcmludGYoIiBwcmluY2lwYWwiKTsKKwkJCVNUUk9VVChLQU5BTUVNQVgpOworCQkJU1RST1VUKEtBTkFNRU1BWCk7CisJCQlicmVhazsKKwkJY2FzZSAzOgkJLyogR2V0VGlja2V0LW9sZCAqLworCQljYXNlIDIzOgkvKiBHZXRUaWNrZXQgKi8KKwkJeworCQkJaW50IGk7CisJCQlwcmludGYoIiBrdm5vIik7CisJCQlJTlRPVVQoKTsKKwkJCXByaW50ZigiIGRvbWFpbiIpOworCQkJU1RST1VUKEtBTkFNRU1BWCk7CisJCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOworCQkJaSA9IChpbnQpIEVYVFJBQ1RfMzJCSVRTKGJwKTsKKwkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKKwkJCVRDSEVDSzIoYnBbMF0sIGkpOworCQkJYnAgKz0gaTsKKwkJCXByaW50ZigiIHByaW5jaXBhbCIpOworCQkJU1RST1VUKEtBTkFNRU1BWCk7CisJCQlTVFJPVVQoS0FOQU1FTUFYKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgNDoJCS8qIFNldCBQYXNzd29yZCAqLworCQkJcHJpbnRmKCIgcHJpbmNpcGFsIik7CisJCQlTVFJPVVQoS0FOQU1FTUFYKTsKKwkJCVNUUk9VVChLQU5BTUVNQVgpOworCQkJcHJpbnRmKCIga3ZubyIpOworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxMjoJLyogR2V0IHBhc3N3b3JkICovCisJCQlwcmludGYoIiBuYW1lIik7CisJCQlTVFJPVVQoS0FOQU1FTUFYKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xrYXV0aF0iKTsKK30KKworLyoKKyAqIEhhbmRsZSByZXBsaWVzIHRvIHRoZSBBRlMgS2VyYmVyb3MgQXV0aGVudGljYXRpb24gU2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCitrYXV0aF9yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKK3sKKwlzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIGthdXRoL2thdXRoLnJnCisJICovCisKKwlwcmludGYoIiBrYXV0aCIpOworCisJaWYgKGlzX3ViaWsob3Bjb2RlKSkgeworCQl1YmlrX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIiByZXBseSAlcyIsIHRvazJzdHIoa2F1dGhfcmVxLCAib3AjJWQiLCBvcGNvZGUpKTsKKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKTsKKworCS8qCisJICogSWYgaXQgd2FzIGEgZGF0YSBwYWNrZXQsIGludGVycHJldCB0aGUgcmVzcG9uc2UuCisJICovCisKKwlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEpCisJCS8qIFdlbGwsIG5vLCBub3QgcmVhbGx5LiAgTGVhdmUgdGhpcyBmb3IgbGF0ZXIgKi8KKwkJOworCWVsc2UgeworCQkvKgorCQkgKiBPdGhlcndpc2UsIGp1c3QgcHJpbnQgb3V0IHRoZSByZXR1cm4gY29kZQorCQkgKi8KKwkJcHJpbnRmKCIgZXJyY29kZSIpOworCQlJTlRPVVQoKTsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8a2F1dGhdIik7Cit9CisKKy8qCisgKiBIYW5kbGUgY2FsbHMgdG8gdGhlIEFGUyBWb2x1bWUgbG9jYXRpb24gc2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCit2b2xfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgdm9sX29wOworCisJaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKKwkJcmV0dXJuOworCisJaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgeworCQlnb3RvIHRydW5jOworCX0KKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIHZvbHNlci92b2xpbnQueGcKKwkgKi8KKworCXZvbF9vcCA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKKworCXByaW50ZigiIHZvbCBjYWxsICVzIiwgdG9rMnN0cih2b2xfcmVxLCAib3AjJWQiLCB2b2xfb3ApKTsKKworCS8qCisJICogTm9ybWFsbHkgdGhlcmUgd291bGQgYmUgYSBzd2l0Y2ggc3RhdGVtZW50IGhlcmUgdG8gZGVjb2RlIHRoZQorCSAqIGFyZ3VtZW50cyB0byB0aGUgQUZTIGNhbGwsIGJ1dCBzaW5jZSBJIGRvbid0IGhhdmUgYWNjZXNzIHRvCisJICogYW4gQUZTIHNlcnZlciAoeWV0KSBhbmQgSSdtIG5vdCBhbiBBRlMgYWRtaW4sIEkgY2FuJ3QKKwkgKiB0ZXN0IGFueSBvZiB0aGVzZSBjYWxscy4gIExlYXZlIHRoaXMgYmxhbmsgZm9yIG5vdy4KKwkgKi8KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3x2b2xdIik7Cit9CisKKy8qCisgKiBIYW5kbGUgcmVwbGllcyB0byB0aGUgQUZTIFZvbHVtZSBTZXJ2aWNlCisgKi8KKworc3RhdGljIHZvaWQKK3ZvbF9yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKK3sKKwlzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIHZvbHNlci92b2xpbnQueGcKKwkgKi8KKworCXByaW50ZigiIHZvbCByZXBseSAlcyIsIHRvazJzdHIodm9sX3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7CisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7CisKKwkvKgorCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBpbnRlcnByZXQgdGhlIHJlc3BvbnNlLgorCSAqLworCisJaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQorCQkvKiBXZWxsLCBubywgbm90IHJlYWxseS4gIExlYXZlIHRoaXMgZm9yIGxhdGVyICovCisJCTsKKwllbHNlIHsKKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBqdXN0IHByaW50IG91dCB0aGUgcmV0dXJuIGNvZGUKKwkJICovCisJCXByaW50ZigiIGVycmNvZGUiKTsKKwkJSU5UT1VUKCk7CisJfQorCisJcmV0dXJuOworCit0cnVuYzoKKwlwcmludGYoIiBbfHZvbF0iKTsKK30KKworLyoKKyAqIEhhbmRsZSBjYWxscyB0byB0aGUgQUZTIEJPUyBzZXJ2aWNlCisgKi8KKworc3RhdGljIHZvaWQKK2Jvc19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoKQoreworCWludCBib3Nfb3A7CisKKwlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKSB7CisJCWdvdG8gdHJ1bmM7CisJfQorCisJLyoKKwkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKKwkgKiBnbGVhbmVkIGZyb20gYm96by9ib3NpbnQueGcKKwkgKi8KKworCWJvc19vcCA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKKworCXByaW50ZigiIGJvcyBjYWxsICVzIiwgdG9rMnN0cihib3NfcmVxLCAib3AjJWQiLCBib3Nfb3ApKTsKKworCS8qCisJICogRGVjb2RlIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgQk9TIGNhbGxzCisJICovCisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyA0OworCisJc3dpdGNoIChib3Nfb3ApIHsKKwkJY2FzZSA4MDoJLyogQ3JlYXRlIEIgbm9kZSAqLworCQkJcHJpbnRmKCIgdHlwZSIpOworCQkJU1RST1VUKEJPU05BTUVNQVgpOworCQkJcHJpbnRmKCIgaW5zdGFuY2UiKTsKKwkJCVNUUk9VVChCT1NOQU1FTUFYKTsKKwkJCWJyZWFrOworCQljYXNlIDgxOgkvKiBEZWxldGUgQiBub2RlICovCisJCWNhc2UgODM6CS8qIEdldCBzdGF0dXMgKi8KKwkJY2FzZSA4NToJLyogR2V0IGluc3RhbmNlIGluZm8gKi8KKwkJY2FzZSA4NzoJLyogQWRkIHN1cGVyIHVzZXIgKi8KKwkJY2FzZSA4ODoJLyogRGVsZXRlIHN1cGVyIHVzZXIgKi8KKwkJY2FzZSA5MzoJLyogU2V0IGNlbGwgbmFtZSAqLworCQljYXNlIDk2OgkvKiBBZGQgY2VsbCBob3N0ICovCisJCWNhc2UgOTc6CS8qIERlbGV0ZSBjZWxsIGhvc3QgKi8KKwkJY2FzZSAxMDQ6CS8qIFJlc3RhcnQgKi8KKwkJY2FzZSAxMDY6CS8qIFVuaW5zdGFsbCAqLworCQljYXNlIDEwODoJLyogRXhlYyAqLworCQljYXNlIDExMjoJLyogR2V0bG9nICovCisJCWNhc2UgMTE0OgkvKiBHZXQgaW5zdGFuY2Ugc3RyaW5ncyAqLworCQkJU1RST1VUKEJPU05BTUVNQVgpOworCQkJYnJlYWs7CisJCWNhc2UgODI6CS8qIFNldCBzdGF0dXMgKi8KKwkJY2FzZSA5ODoJLyogU2V0IFQgc3RhdHVzICovCisJCQlTVFJPVVQoQk9TTkFNRU1BWCk7CisJCQlwcmludGYoIiBzdGF0dXMiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgODY6CS8qIEdldCBpbnN0YW5jZSBwYXJtICovCisJCQlTVFJPVVQoQk9TTkFNRU1BWCk7CisJCQlwcmludGYoIiBudW0iKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgODQ6CS8qIEVudW1lcmF0ZSBpbnN0YW5jZSAqLworCQljYXNlIDg5OgkvKiBMaXN0IHN1cGVyIHVzZXJzICovCisJCWNhc2UgOTA6CS8qIExpc3Qga2V5cyAqLworCQljYXNlIDkxOgkvKiBBZGQga2V5ICovCisJCWNhc2UgOTI6CS8qIERlbGV0ZSBrZXkgKi8KKwkJY2FzZSA5NToJLyogR2V0IGNlbGwgaG9zdCAqLworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxMDU6CS8qIEluc3RhbGwgKi8KKwkJCVNUUk9VVChCT1NOQU1FTUFYKTsKKwkJCXByaW50ZigiIHNpemUiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgZmxhZ3MiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgZGF0ZSIpOworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCTsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8Ym9zXSIpOworfQorCisvKgorICogSGFuZGxlIHJlcGxpZXMgdG8gdGhlIEFGUyBCT1MgU2VydmljZQorICovCisKK3N0YXRpYyB2b2lkCitib3NfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCit7CisJc3RydWN0IHJ4X2hlYWRlciAqcnhoOworCisJaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKKwkJcmV0dXJuOworCisJcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7CisKKwkvKgorCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcworCSAqIGdsZWFuZWQgZnJvbSB2b2xzZXIvdm9saW50LnhnCisJICovCisKKwlwcmludGYoIiBib3MgcmVwbHkgJXMiLCB0b2syc3RyKGJvc19yZXEsICJvcCMlZCIsIG9wY29kZSkpOworCisJYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOworCisJLyoKKwkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgaW50ZXJwcmV0IHRoZSByZXNwb25zZS4KKwkgKi8KKworCWlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSkKKwkJLyogV2VsbCwgbm8sIG5vdCByZWFsbHkuICBMZWF2ZSB0aGlzIGZvciBsYXRlciAqLworCQk7CisJZWxzZSB7CisJCS8qCisJCSAqIE90aGVyd2lzZSwganVzdCBwcmludCBvdXQgdGhlIHJldHVybiBjb2RlCisJCSAqLworCQlwcmludGYoIiBlcnJjb2RlIik7CisJCUlOVE9VVCgpOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3xib3NdIik7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIFViaWsgb3Bjb2RlLgorICovCisKK3N0YXRpYyBpbnQKK2lzX3ViaWsodV9pbnQzMl90IG9wY29kZSkKK3sKKwlpZiAoKG9wY29kZSA+PSBWT1RFX0xPVyAmJiBvcGNvZGUgPD0gVk9URV9ISUdIKSB8fAorCSAgICAob3Bjb2RlID49IERJU0tfTE9XICYmIG9wY29kZSA8PSBESVNLX0hJR0gpKQorCQlyZXR1cm4oMSk7CisJZWxzZQorCQlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBIYW5kbGUgVWJpayBvcGNvZGVzIHRvIGFueSBvbmUgb2YgdGhlIHJlcGxpY2F0ZWQgZGF0YWJhc2Ugc2VydmljZXMKKyAqLworCitzdGF0aWMgdm9pZAordWJpa19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwKQoreworCWludCB1YmlrX29wOworCWludDMyX3QgdGVtcDsKKworCS8qCisJICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCisJICogZ2xlYW5lZCBmcm9tIHViaWsvdWJpa19pbnQueGcKKwkgKi8KKworCXViaWtfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7CisKKwlwcmludGYoIiB1YmlrIGNhbGwgJXMiLCB0b2syc3RyKHViaWtfcmVxLCAib3AjJWQiLCB1YmlrX29wKSk7CisKKwkvKgorCSAqIERlY29kZSBzb21lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIFViaWsgY2FsbHMKKwkgKi8KKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIDQ7CisKKwlzd2l0Y2ggKHViaWtfb3ApIHsKKwkJY2FzZSAxMDAwMDoJCS8qIEJlYWNvbiAqLworCQkJVENIRUNLMihicFswXSwgNCk7CisJCQl0ZW1wID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJcHJpbnRmKCIgc3luY3NpdGUgJXMiLCB0ZW1wID8gInllcyIgOiAibm8iKTsKKwkJCXByaW50ZigiIHZvdGVzdGFydCIpOworCQkJREFURU9VVCgpOworCQkJcHJpbnRmKCIgZGJ2ZXJzaW9uIik7CisJCQlVQklLX1ZFUlNJT05PVVQoKTsKKwkJCXByaW50ZigiIHRpZCIpOworCQkJVUJJS19WRVJTSU9OT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwMzoJCS8qIEdldCBzeW5jIHNpdGUgKi8KKwkJCXByaW50ZigiIHNpdGUiKTsKKwkJCVVJTlRPVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDIwMDAwOgkJLyogQmVnaW4gKi8KKwkJY2FzZSAyMDAwMToJCS8qIENvbW1pdCAqLworCQljYXNlIDIwMDA3OgkJLyogQWJvcnQgKi8KKwkJY2FzZSAyMDAwODoJCS8qIFJlbGVhc2UgbG9ja3MgKi8KKwkJY2FzZSAyMDAxMDoJCS8qIFdyaXRldiAqLworCQkJcHJpbnRmKCIgdGlkIik7CisJCQlVQklLX1ZFUlNJT05PVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDIwMDAyOgkJLyogTG9jayAqLworCQkJcHJpbnRmKCIgdGlkIik7CisJCQlVQklLX1ZFUlNJT05PVVQoKTsKKwkJCXByaW50ZigiIGZpbGUiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgcG9zIik7CisJCQlJTlRPVVQoKTsKKwkJCXByaW50ZigiIGxlbmd0aCIpOworCQkJSU5UT1VUKCk7CisJCQl0ZW1wID0gRVhUUkFDVF8zMkJJVFMoYnApOworCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOworCQkJdG9rMnN0cih1YmlrX2xvY2tfdHlwZXMsICJ0eXBlICVkIiwgdGVtcCk7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwMzoJCS8qIFdyaXRlICovCisJCQlwcmludGYoIiB0aWQiKTsKKwkJCVVCSUtfVkVSU0lPTk9VVCgpOworCQkJcHJpbnRmKCIgZmlsZSIpOworCQkJSU5UT1VUKCk7CisJCQlwcmludGYoIiBwb3MiKTsKKwkJCUlOVE9VVCgpOworCQkJYnJlYWs7CisJCWNhc2UgMjAwMDU6CQkvKiBHZXQgZmlsZSAqLworCQkJcHJpbnRmKCIgZmlsZSIpOworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwNjoJCS8qIFNlbmQgZmlsZSAqLworCQkJcHJpbnRmKCIgZmlsZSIpOworCQkJSU5UT1VUKCk7CisJCQlwcmludGYoIiBsZW5ndGgiKTsKKwkJCUlOVE9VVCgpOworCQkJcHJpbnRmKCIgZGJ2ZXJzaW9uIik7CisJCQlVQklLX1ZFUlNJT05PVVQoKTsKKwkJCWJyZWFrOworCQljYXNlIDIwMDA5OgkJLyogVHJ1bmNhdGUgKi8KKwkJCXByaW50ZigiIHRpZCIpOworCQkJVUJJS19WRVJTSU9OT1VUKCk7CisJCQlwcmludGYoIiBmaWxlIik7CisJCQlJTlRPVVQoKTsKKwkJCXByaW50ZigiIGxlbmd0aCIpOworCQkJSU5UT1VUKCk7CisJCQlicmVhazsKKwkJY2FzZSAyMDAxMjoJCS8qIFNldCB2ZXJzaW9uICovCisJCQlwcmludGYoIiB0aWQiKTsKKwkJCVVCSUtfVkVSU0lPTk9VVCgpOworCQkJcHJpbnRmKCIgb2xkdmVyc2lvbiIpOworCQkJVUJJS19WRVJTSU9OT1VUKCk7CisJCQlwcmludGYoIiBuZXd2ZXJzaW9uIik7CisJCQlVQklLX1ZFUlNJT05PVVQoKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCX0KKworCXJldHVybjsKKwordHJ1bmM6CisJcHJpbnRmKCIgW3x1YmlrXSIpOworfQorCisvKgorICogSGFuZGxlIFViaWsgcmVwbGllcyB0byBhbnkgb25lIG9mIHRoZSByZXBsaWNhdGVkIGRhdGFiYXNlIHNlcnZpY2VzCisgKi8KKworc3RhdGljIHZvaWQKK3ViaWtfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCit7CisJc3RydWN0IHJ4X2hlYWRlciAqcnhoOworCisJaWYgKGxlbmd0aCA8IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQorCQlyZXR1cm47CisKKwlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKKworCS8qCisJICogUHJpbnQgb3V0IHRoZSB1YmlrIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGlzIHRhYmxlIHdhcyBnbGVhbmVkCisJICogZnJvbSB1YmlrL3ViaWtfaW50LnhnCisJICovCisKKwlwcmludGYoIiB1YmlrIHJlcGx5ICVzIiwgdG9rMnN0cih1YmlrX3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7CisKKwlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7CisKKwkvKgorCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBwcmludCBvdXQgdGhlIGFyZ3VtZW50cyB0byB0aGUgVWJpayBjYWxscworCSAqLworCisJaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQorCQlzd2l0Y2ggKG9wY29kZSkgeworCQljYXNlIDEwMDAwOgkJLyogQmVhY29uICovCisJCQlwcmludGYoIiB2b3RlIG5vIik7CisJCQlicmVhazsKKwkJY2FzZSAyMDAwNDoJCS8qIEdldCB2ZXJzaW9uICovCisJCQlwcmludGYoIiBkYnZlcnNpb24iKTsKKwkJCVVCSUtfVkVSU0lPTk9VVCgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKworCS8qCisJICogT3RoZXJ3aXNlLCBwcmludCBvdXQgInllcyIgaXQgaXQgd2FzIGEgYmVhY29uIHBhY2tldCAoYmVjYXVzZQorCSAqIHRoYXQncyBob3cgeWVzIHZvdGVzIGFyZSByZXR1cm5lZCwgZ28gZmlndXJlKSwgb3RoZXJ3aXNlCisJICoganVzdCBwcmludCBvdXQgdGhlIGVycm9yIGNvZGUuCisJICovCisKKwllbHNlCisJCXN3aXRjaCAob3Bjb2RlKSB7CisJCWNhc2UgMTAwMDA6CQkvKiBCZWFjb24gKi8KKwkJCXByaW50ZigiIHZvdGUgeWVzIHVudGlsIik7CisJCQlEQVRFT1VUKCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiIGVycmNvZGUiKTsKKwkJCUlOVE9VVCgpOworCQl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8dWJpa10iKTsKK30KKworLyoKKyAqIEhhbmRsZSBSWCBBQ0sgcGFja2V0cy4KKyAqLworCitzdGF0aWMgdm9pZAorcnhfYWNrX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCit7CisJc3RydWN0IHJ4X2Fja1BhY2tldCAqcnhhOworCWludCBpLCBzdGFydCwgbGFzdDsKKwl1X2ludDMyX3QgZmlyc3RQYWNrZXQ7CisKKwlpZiAobGVuZ3RoIDwgKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCisJCXJldHVybjsKKworCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKTsKKworCS8qCisJICogVGhpcyBtYXkgc2VlbSBhIGxpdHRsZSBvZGQgLi4uLiB0aGUgcnhfYWNrUGFja2V0IHN0cnVjdHVyZQorCSAqIGNvbnRhaW5zIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgcGFja2V0IGFja25vd2xlZGdlbWVudHMKKwkgKiAodXNlZCBmb3Igc2VsZWN0aXZlIGFjay9uYWNrKSwgYnV0IHNpbmNlIGl0J3MgdmFyaWFibGUgaW4gc2l6ZSwKKwkgKiB3ZSBkb24ndCB3YW50IHRvIHRydW5jYXRlIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSB3aG9sZQorCSAqIHJ4X2Fja1BhY2tldCBzdHJ1Y3R1cmUuCisJICovCisKKwlUQ0hFQ0syKGJwWzBdLCBzaXplb2Yoc3RydWN0IHJ4X2Fja1BhY2tldCkgLSBSWF9NQVhBQ0tTKTsKKworCXJ4YSA9IChzdHJ1Y3QgcnhfYWNrUGFja2V0ICopIGJwOworCWJwICs9IChzaXplb2Yoc3RydWN0IHJ4X2Fja1BhY2tldCkgLSBSWF9NQVhBQ0tTKTsKKworCS8qCisJICogUHJpbnQgb3V0IGEgZmV3IHVzZWZ1bCB0aGluZ3MgZnJvbSB0aGUgYWNrIHBhY2tldCBzdHJ1Y3R1cmUKKwkgKi8KKworCWlmICh2ZmxhZyA+IDIpCisJCXByaW50ZigiIGJ1ZnNwYWNlICVkIG1heHNrZXcgJWQiLAorCQkgICAgICAgKGludCkgRVhUUkFDVF8xNkJJVFMoJnJ4YS0+YnVmZmVyU3BhY2UpLAorCQkgICAgICAgKGludCkgRVhUUkFDVF8xNkJJVFMoJnJ4YS0+bWF4U2tldykpOworCisJZmlyc3RQYWNrZXQgPSBFWFRSQUNUXzMyQklUUygmcnhhLT5maXJzdFBhY2tldCk7CisJcHJpbnRmKCIgZmlyc3QgJWQgc2VyaWFsICVkIHJlYXNvbiAlcyIsCisJICAgICAgIGZpcnN0UGFja2V0LCBFWFRSQUNUXzMyQklUUygmcnhhLT5zZXJpYWwpLAorCSAgICAgICB0b2syc3RyKHJ4X2Fja19yZWFzb25zLCAiIyVkIiwgKGludCkgcnhhLT5yZWFzb24pKTsKKworCS8qCisJICogT2theSwgbm93IHdlIHByaW50IG91dCB0aGUgYWNrIGFycmF5LiAgVGhlIHdheSBfdGhpc18gd29ya3MKKwkgKiBpcyB0aGF0IHdlIHN0YXJ0IGF0ICJmaXJzdCIsIGFuZCBzdGVwIHRocm91Z2ggdGhlIGFjayBhcnJheS4KKwkgKiBJZiB3ZSBoYXZlIGEgY29udGlndW91cyByYW5nZSBvZiBhY2tzL25hY2tzLCB0cnkgdG8KKwkgKiBjb2xsYXBzZSB0aGVtIGludG8gYSByYW5nZS4KKwkgKgorCSAqIElmIHlvdSdyZSByZWFsbHkgY2xldmVyLCB5b3UgbWlnaHQgaGF2ZSBub3RpY2VkIHRoYXQgdGhpcworCSAqIGRvZXNuJ3Qgc2VlbSBxdWl0ZSBjb3JyZWN0LiAgU3BlY2lmaWNhbGx5LCBkdWUgdG8gc3RydWN0dXJlCisJICogcGFkZGluZywgc2l6ZW9mKHN0cnVjdCByeF9hY2tQYWNrZXQpIC0gUlhfTUFYQUNLUyB3b24ndCBhY3R1YWxseQorCSAqIHlpZWxkIHRoZSBzdGFydCBvZiB0aGUgYWNrIGFycmF5IChiZWNhdXNlIFJYX01BWEFDS1MgaXMgMjU1CisJICogYW5kIHRoZSBzdHJ1Y3R1cmUgd2lsbCBsaWtlbHkgZ2V0IHBhZGRlZCB0byBhIDIgb3IgNCBieXRlCisJICogYm91bmRhcnkpLiAgSG93ZXZlciwgdGhpcyBpcyB0aGUgd2F5IGl0J3MgaW1wbGVtZW50ZWQgaW5zaWRlCisJICogb2YgQUZTIC0gdGhlIHN0YXJ0IG9mIHRoZSBleHRyYSBmaWVsZHMgYXJlIGF0CisJICogc2l6ZW9mKHN0cnVjdCByeF9hY2tQYWNrZXQpIC0gUlhfTUFYQUNLUyArIG5BY2tzLCB3aGljaCBfaXNuJ3RfCisJICogdGhlIGV4YWN0IHN0YXJ0IG9mIHRoZSBhY2sgYXJyYXkuICBTaWdoLiAgVGhhdCdzIHdoeSB3ZSBhcmVuJ3QKKwkgKiB1c2luZyBicCwgYnV0IGluc3RlYWQgdXNlIHJ4YS0+YWNrc1tdLiAgQnV0IG5BY2tzIGdldHMgYWRkZWQKKwkgKiB0byBicCBhZnRlciB0aGlzLCBzbyBicCBlbmRzIHVwIGF0IHRoZSByaWdodCBzcG90LiAgR28gZmlndXJlLgorCSAqLworCisJaWYgKHJ4YS0+bkFja3MgIT0gMCkgeworCisJCVRDSEVDSzIoYnBbMF0sIHJ4YS0+bkFja3MpOworCisJCS8qCisJCSAqIFNpZ2gsIHRoaXMgaXMgZ3Jvc3MsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIHRvIGNvbGxhcHNlCisJCSAqIHJhbmdlcyBjb3JyZWN0bHkuCisJCSAqLworCisJCWZvciAoaSA9IDAsIHN0YXJ0ID0gbGFzdCA9IC0yOyBpIDwgcnhhLT5uQWNrczsgaSsrKQorCQkJaWYgKHJ4YS0+YWNrc1tpXSA9PSBSWF9BQ0tfVFlQRV9BQ0spIHsKKworCQkJCS8qCisJCQkJICogSSBmaWd1cmVkIHRoaXMgZGVzZXJ2ZWQgX3NvbWVfIGV4cGxhbmF0aW9uLgorCQkJCSAqIEZpcnN0LCBwcmludCAiYWNrZWQiIGFuZCB0aGUgcGFja2V0IHNlcQorCQkJCSAqIG51bWJlciBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlCisJCQkJICogc2VlbiBhbiBhY2tlZCBwYWNrZXQuCisJCQkJICovCisKKwkJCQlpZiAobGFzdCA9PSAtMikgeworCQkJCQlwcmludGYoIiBhY2tlZCAlZCIsCisJCQkJCSAgICAgICBmaXJzdFBhY2tldCArIGkpOworCQkJCQlzdGFydCA9IGk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBPdGhlcndpc2UsIGlmIHRoZSB0aGVyZSBpcyBhIHNraXAgaW4KKwkJCQkgKiB0aGUgcmFuZ2UgKHN1Y2ggYXMgYW4gbmFja2VkIHBhY2tldCBpbgorCQkJCSAqIHRoZSBtaWRkbGUgb2Ygc29tZSBhY2tlZCBwYWNrZXRzKSwKKwkJCQkgKiB0aGVuIHByaW50IHRoZSBjdXJyZW50IHBhY2tldCBudW1iZXIKKwkJCQkgKiBzZXBlcmF0ZWQgZnJvbSB0aGUgbGFzdCBudW1iZXIgYnkKKwkJCQkgKiBhIGNvbW1hLgorCQkJCSAqLworCisJCQkJZWxzZSBpZiAobGFzdCAhPSBpIC0gMSkgeworCQkJCQlwcmludGYoIiwlZCIsIGZpcnN0UGFja2V0ICsgaSk7CisJCQkJCXN0YXJ0ID0gaTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFdlIGFsd2F5cyBzZXQgbGFzdCB0byB0aGUgdmFsdWUgb2YKKwkJCQkgKiB0aGUgbGFzdCBhY2sgd2Ugc2F3LiAgQ29udmVyc2VseSwgc3RhcnQKKwkJCQkgKiBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBhY2sKKwkJCQkgKiB3ZSBzYXcgaW4gYSByYW5nZS4KKwkJCQkgKi8KKworCQkJCWxhc3QgPSBpOworCisJCQkJLyoKKwkJCQkgKiBPa2F5LCB0aGlzIGJpdCBhIGNvZGUgZ2V0cyBleGVjdXRlZCB3aGVuCisJCQkJICogd2UgaGl0IGEgbmFjayAuLi4gaW4gX3RoaXNfIGNhc2Ugd2UKKwkJCQkgKiB3YW50IHRvIHByaW50IG91dCB0aGUgcmFuZ2Ugb2YgcGFja2V0cworCQkJCSAqIHRoYXQgd2VyZSBhY2tlZCwgc28gd2UgbmVlZCB0byBwcmludAorCQkJCSAqIHRoZSBfcHJldmlvdXNfIHBhY2tldCBudW1iZXIgc2VwZXJhdGVkCisJCQkJICogZnJvbSB0aGUgZmlyc3QgYnkgYSBkYXNoICgtKS4gIFNpbmNlIHdlCisJCQkJICogYWxyZWFkeSBwcmludGVkIHRoZSBmaXJzdCBwYWNrZXQgYWJvdmUsCisJCQkJICoganVzdCBwcmludCB0aGUgZmluYWwgcGFja2V0LiAgRG9uJ3QKKwkJCQkgKiBkbyB0aGlzIGlmIHRoZXJlIHdpbGwgYmUgYSBzaW5nbGUtbGVuZ3RoCisJCQkJICogcmFuZ2UuCisJCQkJICovCisJCQl9IGVsc2UgaWYgKGxhc3QgPT0gaSAtIDEgJiYgc3RhcnQgIT0gbGFzdCkKKwkJCQlwcmludGYoIi0lZCIsIGZpcnN0UGFja2V0ICsgaSAtIDEpOworCisJCS8qCisJCSAqIFNvLCB3aGF0J3MgZ29pbmcgb24gaGVyZT8gIFdlIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUKKwkJICogYWNrIGxpc3QsIGFuZCBpZiB3ZSBnb3QgYSByYW5nZSB3ZSBuZWVkIHRvIGZpbmlzaCBpdCB1cC4KKwkJICogU28gd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGxhc3QgcGFja2V0IGluIHRoZSBsaXN0CisJCSAqIHdhcyBhbiBhY2sgKGlmIHNvLCB0aGVuIGxhc3Qgd2lsbCBiZSBzZXQgdG8gaXQpIGFuZAorCQkgKiB3ZSBuZWVkIHRvIHNlZSBpZiB0aGUgbGFzdCByYW5nZSBkaWRuJ3Qgc3RhcnQgd2l0aCB0aGUKKwkJICogbGFzdCBwYWNrZXQgKGJlY2F1c2UgaWYgaXQgX2RpZF8sIHRoZW4gdGhhdCB3b3VsZCBtZWFuCisJCSAqIHRoYXQgdGhlIHBhY2tldCBudW1iZXIgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkIGFuZAorCQkgKiB3ZSBkb24ndCBuZWVkIHRvIHByaW50IGl0IGFnYWluKS4KKwkJICovCisKKwkJaWYgKGxhc3QgPT0gaSAtIDEgJiYgc3RhcnQgIT0gbGFzdCkKKwkJCXByaW50ZigiLSVkIiwgZmlyc3RQYWNrZXQgKyBpIC0gMSk7CisKKwkJLyoKKwkJICogU2FtZSBhcyBhYm92ZSwganVzdCB3aXRob3V0IGNvbW1lbnRzCisJCSAqLworCisJCWZvciAoaSA9IDAsIHN0YXJ0ID0gbGFzdCA9IC0yOyBpIDwgcnhhLT5uQWNrczsgaSsrKQorCQkJaWYgKHJ4YS0+YWNrc1tpXSA9PSBSWF9BQ0tfVFlQRV9OQUNLKSB7CisJCQkJaWYgKGxhc3QgPT0gLTIpIHsKKwkJCQkJcHJpbnRmKCIgbmFja2VkICVkIiwKKwkJCQkJICAgICAgIGZpcnN0UGFja2V0ICsgaSk7CisJCQkJCXN0YXJ0ID0gaTsKKwkJCQl9IGVsc2UgaWYgKGxhc3QgIT0gaSAtIDEpIHsKKwkJCQkJcHJpbnRmKCIsJWQiLCBmaXJzdFBhY2tldCArIGkpOworCQkJCQlzdGFydCA9IGk7CisJCQkJfQorCQkJCWxhc3QgPSBpOworCQkJfSBlbHNlIGlmIChsYXN0ID09IGkgLSAxICYmIHN0YXJ0ICE9IGxhc3QpCisJCQkJcHJpbnRmKCItJWQiLCBmaXJzdFBhY2tldCArIGkgLSAxKTsKKworCQlpZiAobGFzdCA9PSBpIC0gMSAmJiBzdGFydCAhPSBsYXN0KQorCQkJcHJpbnRmKCItJWQiLCBmaXJzdFBhY2tldCArIGkgLSAxKTsKKworCQlicCArPSByeGEtPm5BY2tzOworCX0KKworCisJLyoKKwkgKiBUaGVzZSBhcmUgb3B0aW9uYWwgZmllbGRzOyBkZXBlbmRpbmcgb24geW91ciB2ZXJzaW9uIG9mIEFGUywKKwkgKiB5b3UgbWF5IG9yIG1heSBub3Qgc2VlIHRoZW0KKwkgKi8KKworI2RlZmluZSBUUlVOQ1JFVChuKQlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSBuKSByZXR1cm47CisKKwlpZiAodmZsYWcgPiAxKSB7CisJCVRSVU5DUkVUKDQpOworCQlwcmludGYoIiBpZm10dSIpOworCQlJTlRPVVQoKTsKKworCQlUUlVOQ1JFVCg0KTsKKwkJcHJpbnRmKCIgbWF4bXR1Iik7CisJCUlOVE9VVCgpOworCisJCVRSVU5DUkVUKDQpOworCQlwcmludGYoIiByd2luZCIpOworCQlJTlRPVVQoKTsKKworCQlUUlVOQ1JFVCg0KTsKKwkJcHJpbnRmKCIgbWF4cGFja2V0cyIpOworCQlJTlRPVVQoKTsKKwl9CisKKwlyZXR1cm47CisKK3RydW5jOgorCXByaW50ZigiIFt8YWNrXSIpOworfQorI3VuZGVmIFRSVU5DUkVUCmRpZmYgLS1naXQgYS9wcmludC1zY3RwLmMgYi9wcmludC1zY3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExODk3OAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXNjdHAuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDAxIE5FVExBQiwgVGVtcGxlIFVuaXZlcnNpdHkKKyAqIENvcHlyaWdodCAoYykgMjAwMSBQcm90b2NvbCBFbmdpbmVlcmluZyBMYWIsIFVuaXZlcnNpdHkgb2YgRGVsYXdhcmUKKyAqCisgKiBKZXJyeSBIZWlueiA8Z2hlaW56QGFzdHJvLnRlbXBsZS5lZHU+CisgKiBKb2huIEZpb3JlIDxqZmlvcmVAam9kYS5jaXMudGVtcGxlLmVkdT4KKyAqIEFybWFuZG8gTC4gQ2FybyBKci4gPGFjYXJvQGNpcy51ZGVsLmVkdT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zY3RwLmMsdiAxLjE2LjIuNSAyMDA3LzA5LzEzIDE4OjA0OjU4IGd1eSBFeHAgJCAoTkVUTEFCL1BFTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlICJzY3RwSGVhZGVyLmgiCisjaW5jbHVkZSAic2N0cENvbnN0YW50cy5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCisjaW5jbHVkZSAiaXAuaCIKKyNpZmRlZiBJTkVUNgorI2luY2x1ZGUgImlwNi5oIgorI2VuZGlmCisKK3ZvaWQgc2N0cF9wcmludChjb25zdCB1X2NoYXIgKmJwLCAgICAgICAgLyogYmVnaW5uaW5nIG9mIHNjdHAgcGFja2V0ICovCisJCWNvbnN0IHVfY2hhciAqYnAyLCAgICAgICAvKiBiZWdpbm5pbmcgb2YgZW5jbG9zaW5nICovCisJCXVfaW50IHNjdHBQYWNrZXRMZW5ndGgpICAvKiBpcCBwYWNrZXQgKi8KK3sKKyAgY29uc3Qgc3RydWN0IHNjdHBIZWFkZXIgKnNjdHBQa3RIZHI7CisgIGNvbnN0IHN0cnVjdCBpcCAqaXA7CisjaWZkZWYgSU5FVDYKKyAgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKKyNlbmRpZgorICBjb25zdCB2b2lkICplbmRQYWNrZXRQdHI7CisgIHVfc2hvcnQgc291cmNlUG9ydCwgZGVzdFBvcnQ7CisgIGludCBjaHVua0NvdW50OworICBjb25zdCBzdHJ1Y3Qgc2N0cENodW5rRGVzYyAqY2h1bmtEZXNjUHRyOworICBjb25zdCB2b2lkICpuZXh0Q2h1bms7CisgIGNvbnN0IGNoYXIgKnNlcDsKKworICBzY3RwUGt0SGRyID0gKGNvbnN0IHN0cnVjdCBzY3RwSGVhZGVyKikgYnA7CisgIGVuZFBhY2tldFB0ciA9IChjb25zdCB1X2NoYXIqKXNjdHBQa3RIZHIrc2N0cFBhY2tldExlbmd0aDsKKworICBpZiggKHVfbG9uZykgZW5kUGFja2V0UHRyID4gKHVfbG9uZykgc25hcGVuZCkKKyAgICBlbmRQYWNrZXRQdHIgPSAoY29uc3Qgdm9pZCAqKSBzbmFwZW5kOworICBpcCA9IChzdHJ1Y3QgaXAgKilicDI7CisjaWZkZWYgSU5FVDYKKyAgaWYgKElQX1YoaXApID09IDYpCisgICAgaXA2ID0gKGNvbnN0IHN0cnVjdCBpcDZfaGRyICopYnAyOworICBlbHNlCisgICAgaXA2ID0gTlVMTDsKKyNlbmRpZiAvKklORVQ2Ki8KKyAgVENIRUNLKCpzY3RwUGt0SGRyKTsKKworICBpZiAoc2N0cFBhY2tldExlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc2N0cEhlYWRlcikpCisgICAgeworICAgICAgKHZvaWQpcHJpbnRmKCJ0cnVuY2F0ZWQtc2N0cCAtICVsZCBieXRlcyBtaXNzaW5nISIsCisJCSAgIChsb25nKXNjdHBQYWNrZXRMZW5ndGgtc2l6ZW9mKHN0cnVjdCBzY3RwSGVhZGVyKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qICAgIHNjdHBQYWNrZXRMZW5ndGggLT0gc2l6ZW9mKHN0cnVjdCBzY3RwSGVhZGVyKTsgIHBhY2tldCBsZW5ndGggICovCisgIC8qICAJCQkgICAgICBpcyBub3cgb25seSBhcyBsb25nIGFzIHRoZSBwYXlsb2FkICAqLworCisgIHNvdXJjZVBvcnQgPSBFWFRSQUNUXzE2QklUUygmc2N0cFBrdEhkci0+c291cmNlKTsKKyAgZGVzdFBvcnQgPSBFWFRSQUNUXzE2QklUUygmc2N0cFBrdEhkci0+ZGVzdGluYXRpb24pOworCisjaWZkZWYgSU5FVDYKKyAgaWYgKGlwNikgeworICAgICh2b2lkKXByaW50ZigiJXMuJWQgPiAlcy4lZDogc2N0cCIsCisgICAgICBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwKKyAgICAgIHNvdXJjZVBvcnQsCisgICAgICBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSwKKyAgICAgIGRlc3RQb3J0KTsKKyAgfSBlbHNlCisjZW5kaWYgLypJTkVUNiovCisgIHsKKyAgICAodm9pZClwcmludGYoIiVzLiVkID4gJXMuJWQ6IHNjdHAiLAorICAgICAgaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksCisgICAgICBzb3VyY2VQb3J0LAorICAgICAgaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCksCisgICAgICBkZXN0UG9ydCk7CisgIH0KKyAgZmZsdXNoKHN0ZG91dCk7CisKKyAgaWYgKHZmbGFnID49IDIpCisgICAgc2VwID0gIlxuXHQiOworICBlbHNlCisgICAgc2VwID0gIiAoIjsKKyAgLyogY3ljbGUgdGhyb3VnaCBhbGwgY2h1bmtzLCBwcmludGluZyBpbmZvcm1hdGlvbiBvbiBlYWNoIG9uZSAqLworICBmb3IgKGNodW5rQ291bnQgPSAwLAorCSBjaHVua0Rlc2NQdHIgPSAoY29uc3Qgc3RydWN0IHNjdHBDaHVua0Rlc2MgKikKKwkgICAgKChjb25zdCB1X2NoYXIqKSBzY3RwUGt0SGRyICsgc2l6ZW9mKHN0cnVjdCBzY3RwSGVhZGVyKSk7CisgICAgICAgY2h1bmtEZXNjUHRyICE9IE5VTEwgJiYKKwkgKCAoY29uc3Qgdm9pZCAqKQorCSAgICAoKGNvbnN0IHVfY2hhciAqKSBjaHVua0Rlc2NQdHIgKyBzaXplb2Yoc3RydWN0IHNjdHBDaHVua0Rlc2MpKQorCSAgIDw9IGVuZFBhY2tldFB0cik7CisKKyAgICAgICBjaHVua0Rlc2NQdHIgPSAoY29uc3Qgc3RydWN0IHNjdHBDaHVua0Rlc2MgKikgbmV4dENodW5rLCBjaHVua0NvdW50KyspCisgICAgeworICAgICAgdV9pbnQxNl90IGNodW5rTGVuZ3RoOworICAgICAgY29uc3QgdV9jaGFyICpjaHVua0VuZDsKKyAgICAgIHVfaW50MTZfdCBhbGlnbjsKKworICAgICAgVENIRUNLKCpjaHVua0Rlc2NQdHIpOworICAgICAgY2h1bmtMZW5ndGggPSBFWFRSQUNUXzE2QklUUygmY2h1bmtEZXNjUHRyLT5jaHVua0xlbmd0aCk7CisgICAgICBpZiAoY2h1bmtMZW5ndGggPCBzaXplb2YoKmNodW5rRGVzY1B0cikpIHsKKyAgICAgIAlwcmludGYoIiVzJWQpIFtCYWQgY2h1bmsgbGVuZ3RoICV1XSIsIHNlcCwgY2h1bmtDb3VudCsxLCBjaHVua0xlbmd0aCk7CisgICAgICAJYnJlYWs7CisgICAgICB9CisKKyAgICAgIFRDSEVDSzIoKigodV9pbnQ4X3QgKiljaHVua0Rlc2NQdHIpLCBjaHVua0xlbmd0aCk7CisgICAgICBjaHVua0VuZCA9ICgoY29uc3QgdV9jaGFyKiljaHVua0Rlc2NQdHIgKyBjaHVua0xlbmd0aCk7CisKKyAgICAgIGFsaWduPWNodW5rTGVuZ3RoICUgNDsKKyAgICAgIGlmIChhbGlnbiAhPSAwKQorCWFsaWduID0gNCAtIGFsaWduOworCisgICAgICBuZXh0Q2h1bmsgPSAoY29uc3Qgdm9pZCAqKSAoY2h1bmtFbmQgKyBhbGlnbik7CisKKyAgICAgIHByaW50ZigiJXMlZCkgIiwgc2VwLCBjaHVua0NvdW50KzEpOworICAgICAgc3dpdGNoIChjaHVua0Rlc2NQdHItPmNodW5rSUQpCisJeworCWNhc2UgU0NUUF9EQVRBIDoKKwkgIHsKKwkgICAgY29uc3Qgc3RydWN0IHNjdHBEYXRhUGFydCAqZGF0YUhkclB0cjsKKworCSAgICBwcmludGYoIltEQVRBXSAiKTsKKworCSAgICBpZiAoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCQk9PSBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCSAgICAgIHByaW50ZigiKFUpIik7CisKKwkgICAgaWYgKChjaHVua0Rlc2NQdHItPmNodW5rRmxnICYgU0NUUF9EQVRBX0ZJUlNUX0ZSQUcpCisJCT09IFNDVFBfREFUQV9GSVJTVF9GUkFHKQorCSAgICAgIHByaW50ZigiKEIpIik7CisKKwkgICAgaWYgKChjaHVua0Rlc2NQdHItPmNodW5rRmxnICYgU0NUUF9EQVRBX0xBU1RfRlJBRykKKwkJPT0gU0NUUF9EQVRBX0xBU1RfRlJBRykKKwkgICAgICBwcmludGYoIihFKSIpOworCisJICAgIGlmKCAoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfVU5PUkRFUkVEKQorCQkgPT0gU0NUUF9EQVRBX1VOT1JERVJFRCkKKwkJfHwKKwkJKChjaHVua0Rlc2NQdHItPmNodW5rRmxnICYgU0NUUF9EQVRBX0ZJUlNUX0ZSQUcpCisJCSA9PSBTQ1RQX0RBVEFfRklSU1RfRlJBRykKKwkJfHwKKwkJKChjaHVua0Rlc2NQdHItPmNodW5rRmxnICYgU0NUUF9EQVRBX0xBU1RfRlJBRykKKwkJID09IFNDVFBfREFUQV9MQVNUX0ZSQUcpICkKKwkgICAgICBwcmludGYoIiAiKTsKKworCSAgICBkYXRhSGRyUHRyPShjb25zdCBzdHJ1Y3Qgc2N0cERhdGFQYXJ0KikoY2h1bmtEZXNjUHRyKzEpOworCisJICAgIHByaW50ZigiW1RTTjogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZkYXRhSGRyUHRyLT5UU04pKTsKKwkgICAgcHJpbnRmKCJbU0lEOiAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmRhdGFIZHJQdHItPnN0cmVhbUlkKSk7CisJICAgIHByaW50ZigiW1NTRVEgJXVdICIsIEVYVFJBQ1RfMTZCSVRTKCZkYXRhSGRyUHRyLT5zZXF1ZW5jZSkpOworCSAgICBwcmludGYoIltQUElEIDB4JXhdICIsIEVYVFJBQ1RfMzJCSVRTKCZkYXRhSGRyUHRyLT5wYXlsb2FkdHlwZSkpOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKworCSAgICBpZiAodmZsYWcgPj0gMikJICAgLyogaWYgdmVyYm9zZSBvdXRwdXQgaXMgc3BlY2lmaWVkICovCisJICAgICAgewkJICAgICAgICAgICAvKiBhdCB0aGUgY29tbWFuZCBsaW5lICovCisJCWNvbnN0IHVfY2hhciAqcGF5bG9hZFB0cjsKKworCQlwcmludGYoIltQYXlsb2FkIik7CisKKwkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KSB7CisJCQlwYXlsb2FkUHRyID0gKGNvbnN0IHVfY2hhciAqKSAoKytkYXRhSGRyUHRyKTsKKwkJCXByaW50ZigiOiIpOworCQkJaWYgKGh0b25zKGNodW5rRGVzY1B0ci0+Y2h1bmtMZW5ndGgpIDwKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBEYXRhUGFydCkrCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwQ2h1bmtEZXNjKSsxKSB7CisJCQkJLyogTGVzcyB0aGFuIDEgYnl0ZSBvZiBjaHVuayBwYXlsb2FkICovCisJCQkJcHJpbnRmKCJib2d1cyBjaHVuayBsZW5ndGggJXVdIiwKKwkJCQkgICAgaHRvbnMoY2h1bmtEZXNjUHRyLT5jaHVua0xlbmd0aCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWRlZmF1bHRfcHJpbnQocGF5bG9hZFB0ciwKKwkJCSAgICAgIGh0b25zKGNodW5rRGVzY1B0ci0+Y2h1bmtMZW5ndGgpIC0KKwkJCSAgICAgIChzaXplb2Yoc3RydWN0IHNjdHBEYXRhUGFydCkrCisJCQkgICAgICBzaXplb2Yoc3RydWN0IHNjdHBDaHVua0Rlc2MpKSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJdIik7CisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwljYXNlIFNDVFBfSU5JVElBVElPTiA6CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCBzY3RwSW5pdGlhdGlvbiAqaW5pdDsKKworCSAgICBwcmludGYoIltJTklUXSAiKTsKKwkgICAgaW5pdD0oY29uc3Qgc3RydWN0IHNjdHBJbml0aWF0aW9uKikoY2h1bmtEZXNjUHRyKzEpOworCSAgICBwcmludGYoIltpbml0IHRhZzogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5pbml0VGFnKSk7CisJICAgIHByaW50ZigiW3J3bmQ6ICV1XSAiLCBFWFRSQUNUXzMyQklUUygmaW5pdC0+cmN2V2luZG93Q3JlZGl0KSk7CisJICAgIHByaW50ZigiW09TOiAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmluaXQtPk51bVByZW9wZW5TdHJlYW1zKSk7CisJICAgIHByaW50ZigiW01JUzogJXVdICIsIEVYVFJBQ1RfMTZCSVRTKCZpbml0LT5NYXhJbmJvdW5kU3RyZWFtcykpOworCSAgICBwcmludGYoIltpbml0IFRTTjogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5pbml0aWFsVFNOKSk7CisKKyNpZigwKSAvKiBBTEMgeW91IGNhbiBhZGQgY29kZSBmb3Igb3B0aW9uYWwgcGFyYW1zIGhlcmUgKi8KKwkgICAgaWYoIChpbml0KzEpIDwgY2h1bmtFbmQgKQorCSAgICAgIHByaW50ZigiIEBAQEBAIFVORklOSVNIRUQgQEBAQEBAJXNcbiIsCisJCSAgICAgIk9wdGlvbmFsIHBhcmFtcyBwcmVzZW50LCBidXQgbm90IHByaW50ZWQuIik7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBTQ1RQX0lOSVRJQVRJT05fQUNLIDoKKwkgIHsKKwkgICAgY29uc3Qgc3RydWN0IHNjdHBJbml0aWF0aW9uICppbml0OworCisJICAgIHByaW50ZigiW0lOSVQgQUNLXSAiKTsKKwkgICAgaW5pdD0oY29uc3Qgc3RydWN0IHNjdHBJbml0aWF0aW9uKikoY2h1bmtEZXNjUHRyKzEpOworCSAgICBwcmludGYoIltpbml0IHRhZzogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5pbml0VGFnKSk7CisJICAgIHByaW50ZigiW3J3bmQ6ICV1XSAiLCBFWFRSQUNUXzMyQklUUygmaW5pdC0+cmN2V2luZG93Q3JlZGl0KSk7CisJICAgIHByaW50ZigiW09TOiAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmluaXQtPk51bVByZW9wZW5TdHJlYW1zKSk7CisJICAgIHByaW50ZigiW01JUzogJXVdICIsIEVYVFJBQ1RfMTZCSVRTKCZpbml0LT5NYXhJbmJvdW5kU3RyZWFtcykpOworCSAgICBwcmludGYoIltpbml0IFRTTjogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5pbml0aWFsVFNOKSk7CisKKyNpZigwKSAvKiBBTEMgeW91IGNhbiBhZGQgY29kZSBmb3Igb3B0aW9uYWwgcGFyYW1zIGhlcmUgKi8KKwkgICAgaWYoIChpbml0KzEpIDwgY2h1bmtFbmQgKQorCSAgICAgIHByaW50ZigiIEBAQEBAIFVORklOSVNIRUQgQEBAQEBAJXNcbiIsCisJCSAgICAgIk9wdGlvbmFsIHBhcmFtcyBwcmVzZW50LCBidXQgbm90IHByaW50ZWQuIik7CisjZW5kaWYKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBTQ1RQX1NFTEVDVElWRV9BQ0s6CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCBzY3RwU2VsZWN0aXZlQWNrICpzYWNrOworCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cFNlbGVjdGl2ZUZyYWcgKmZyYWc7CisJICAgIGludCBmcmFnTm8sIHRzbk5vOworCSAgICBjb25zdCB1X2NoYXIgKmR1cFRTTjsKKworCSAgICBwcmludGYoIltTQUNLXSAiKTsKKwkgICAgc2Fjaz0oY29uc3Qgc3RydWN0IHNjdHBTZWxlY3RpdmVBY2sqKShjaHVua0Rlc2NQdHIrMSk7CisJICAgIHByaW50ZigiW2N1bSBhY2sgJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZzYWNrLT5oaWdoZXN0Q29uc2VxVFNOKSk7CisJICAgIHByaW50ZigiW2FfcnduZCAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJnNhY2stPnVwZGF0ZWRSd25kKSk7CisJICAgIHByaW50ZigiWyNnYXAgYWNrcyAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJnNhY2stPm51bWJlck9mZGVzYykpOworCSAgICBwcmludGYoIlsjZHVwIHRzbnMgJXVdICIsIEVYVFJBQ1RfMTZCSVRTKCZzYWNrLT5udW1EdXBUc25zKSk7CisKKworCSAgICAvKiBwcmludCBnYXBzICovCisJICAgIGZvciAoZnJhZyA9ICggKGNvbnN0IHN0cnVjdCBzY3RwU2VsZWN0aXZlRnJhZyAqKQorCQkJICAoKGNvbnN0IHN0cnVjdCBzY3RwU2VsZWN0aXZlQWNrICopIHNhY2srMSkpLAorCQkgICBmcmFnTm89MDsKKwkJIChjb25zdCB2b2lkICopZnJhZyA8IG5leHRDaHVuayAmJiBmcmFnTm8gPCBFWFRSQUNUXzE2QklUUygmc2Fjay0+bnVtYmVyT2ZkZXNjKTsKKwkJIGZyYWcrKywgZnJhZ05vKyspCisJICAgICAgcHJpbnRmKCJcblx0XHRbZ2FwIGFjayBibG9jayAjJWQ6IHN0YXJ0ID0gJXUsIGVuZCA9ICV1XSAiLAorCQkgICAgIGZyYWdObysxLAorCQkgICAgIEVYVFJBQ1RfMzJCSVRTKCZzYWNrLT5oaWdoZXN0Q29uc2VxVFNOKSArIEVYVFJBQ1RfMTZCSVRTKCZmcmFnLT5mcmFnbWVudFN0YXJ0KSwKKwkJICAgICBFWFRSQUNUXzMyQklUUygmc2Fjay0+aGlnaGVzdENvbnNlcVRTTikgKyBFWFRSQUNUXzE2QklUUygmZnJhZy0+ZnJhZ21lbnRFbmQpKTsKKworCisJICAgIC8qIHByaW50IGR1cGxpY2F0ZSBUU05zICovCisJICAgIGZvciAoZHVwVFNOID0gKGNvbnN0IHVfY2hhciAqKWZyYWcsIHRzbk5vPTA7CisJCSAoY29uc3Qgdm9pZCAqKSBkdXBUU04gPCBuZXh0Q2h1bmsgJiYgdHNuTm88RVhUUkFDVF8xNkJJVFMoJnNhY2stPm51bUR1cFRzbnMpOworCQkgZHVwVFNOICs9IDQsIHRzbk5vKyspCisJICAgICAgcHJpbnRmKCJcblx0XHRbZHVwIFRTTiAjJXU6ICV1XSAiLCB0c25ObysxLAorCSAgICAgICAgICBFWFRSQUNUXzMyQklUUyhkdXBUU04pKTsKKworCSAgICBicmVhazsKKwkgIH0KKwljYXNlIFNDVFBfSEVBUlRCRUFUX1JFUVVFU1QgOgorCSAgeworCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cEhCc2VuZGVyICpoYjsKKworCSAgICBoYj0oY29uc3Qgc3RydWN0IHNjdHBIQnNlbmRlciopY2h1bmtEZXNjUHRyOworCisJICAgIHByaW50ZigiW0hCIFJFUV0gIik7CisKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSBTQ1RQX0hFQVJUQkVBVF9BQ0sgOgorCSAgcHJpbnRmKCJbSEIgQUNLXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9BQk9SVF9BU1NPQ0lBVElPTiA6CisJICBwcmludGYoIltBQk9SVF0gIik7CisJICBicmVhazsKKwljYXNlIFNDVFBfU0hVVERPV04gOgorCSAgcHJpbnRmKCJbU0hVVERPV05dICIpOworCSAgYnJlYWs7CisJY2FzZSBTQ1RQX1NIVVRET1dOX0FDSyA6CisJICBwcmludGYoIltTSFVURE9XTiBBQ0tdICIpOworCSAgYnJlYWs7CisJY2FzZSBTQ1RQX09QRVJBVElPTl9FUlIgOgorCSAgcHJpbnRmKCJbT1AgRVJSXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9DT09LSUVfRUNITyA6CisJICBwcmludGYoIltDT09LSUUgRUNIT10gIik7CisJICBicmVhazsKKwljYXNlIFNDVFBfQ09PS0lFX0FDSyA6CisJICBwcmludGYoIltDT09LSUUgQUNLXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9FQ05fRUNITyA6CisJICBwcmludGYoIltFQ04gRUNIT10gIik7CisJICBicmVhazsKKwljYXNlIFNDVFBfRUNOX0NXUiA6CisJICBwcmludGYoIltFQ04gQ1dSXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9TSFVURE9XTl9DT01QTEVURSA6CisJICBwcmludGYoIltTSFVURE9XTiBDT01QTEVURV0gIik7CisJICBicmVhazsKKwljYXNlIFNDVFBfRk9SV0FSRF9DVU1fVFNOIDoKKwkgIHByaW50ZigiW0ZPUiBDVU0gVFNOXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9SRUxJQUJMRV9DTlRMIDoKKwkgIHByaW50ZigiW1JFTCBDVFJMXSAiKTsKKwkgIGJyZWFrOworCWNhc2UgU0NUUF9SRUxJQUJMRV9DTlRMX0FDSyA6CisJICBwcmludGYoIltSRUwgQ1RSTCBBQ0tdICIpOworCSAgYnJlYWs7CisJZGVmYXVsdCA6CisJICBwcmludGYoIltVbmtub3duIGNodW5rIHR5cGU6IDB4JXhdIiwgY2h1bmtEZXNjUHRyLT5jaHVua0lEKTsKKwkgIHJldHVybjsKKwl9CisKKwlpZiAodmZsYWcgPCAyKQorCSAgc2VwID0gIiwgKCI7CisgICAgfQorICAgIHJldHVybjsKKwordHJ1bmM6CisgICAgcHJpbnRmKCJbfHNjdHBdIik7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtc2lwLmMgYi9wcmludC1zaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQxM2IxCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtc2lwLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQorICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCisgKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAorICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAorICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc2lwLmMsdiAxLjEgMjAwNC8wNy8yNyAxNzowNDoyMCBoYW5uZXMgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisjaW5jbHVkZSAidWRwLmgiCisKK3ZvaWQKK3NpcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikKK3sKKyAgICB1X2ludCBpZHg7CisKKyAgICBwcmludGYoIlNJUCwgbGVuZ3RoOiAldSVzIiwgbGVuLCB2ZmxhZyA/ICJcblx0IiA6ICIiKTsKKworICAgIC8qIGluIG5vbi12ZXJib3NlIG1vZGUganVzdCBsZXRzIHByaW50IHRoZSBwcm90b2NvbCBhbmQgbGVuZ3RoICovCisgICAgaWYgKHZmbGFnIDwgMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgIGlmIChFWFRSQUNUXzE2QklUUyhwcHRyK2lkeCkgIT0gMHgwZDBhKSB7IC8qIGxpbmVmZWVkID8gKi8KKyAgICAgICAgICAgIHNhZmVwdXRjaGFyKCoocHB0citpZHgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOworICAgICAgICAgICAgaWR4Kz0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLworICAgIGlmICh2ZmxhZz4gMSkKKyAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQiLGxlbik7CisKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9wcmludC1zbC5jIGIvcHJpbnQtc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhhMjFhCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtc2wuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXNsLmMsdiAxLjY1IDIwMDUvMDQvMDYgMjE6MzI6NDIgbWNyIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLworCisjaW5jbHVkZSAiaXAuaCIKKyNpbmNsdWRlICJ0Y3AuaCIKKyNpbmNsdWRlICJzbGlwLmgiCisjaW5jbHVkZSAic2xjb21wcmVzcy5oIgorCitzdGF0aWMgdV9pbnQgbGFzdGxlblsyXVsyNTZdOworc3RhdGljIHVfaW50IGxhc3Rjb25uID0gMjU1OworCitzdGF0aWMgdm9pZCBzbGlwbGlua19wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3Qgc3RydWN0IGlwICosIHVfaW50KTsKK3N0YXRpYyB2b2lkIGNvbXByZXNzZWRfc2xfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHN0cnVjdCBpcCAqLCB1X2ludCwgaW50KTsKKwordV9pbnQKK3NsX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwlyZWdpc3RlciB1X2ludCBsZW5ndGggPSBoLT5sZW47CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwICppcDsKKworCWlmIChjYXBsZW4gPCBTTElQX0hEUkxFTikgeworCQlwcmludGYoIlt8c2xpcF0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCWxlbmd0aCAtPSBTTElQX0hEUkxFTjsKKworCWlwID0gKHN0cnVjdCBpcCAqKShwICsgU0xJUF9IRFJMRU4pOworCisJaWYgKGVmbGFnKQorCQlzbGlwbGlua19wcmludChwLCBpcCwgbGVuZ3RoKTsKKworCXN3aXRjaCAoSVBfVihpcCkpIHsKKwljYXNlIDQ6CisJICAgICAgICBpcF9wcmludChnbmRvLCAodV9jaGFyICopaXAsIGxlbmd0aCk7CisJCWJyZWFrOworI2lmZGVmIElORVQ2CisJY2FzZSA2OgorCQlpcDZfcHJpbnQoKHVfY2hhciAqKWlwLCBsZW5ndGgpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXByaW50ZiAoImlwIHYlZCIsIElQX1YoaXApKTsKKwl9CisKKwlyZXR1cm4gKFNMSVBfSERSTEVOKTsKK30KKwordV9pbnQKK3NsX2JzZG9zX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwlyZWdpc3RlciB1X2ludCBsZW5ndGggPSBoLT5sZW47CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwICppcDsKKworCWlmIChjYXBsZW4gPCBTTElQX0hEUkxFTikgeworCQlwcmludGYoIlt8c2xpcF0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCWxlbmd0aCAtPSBTTElQX0hEUkxFTjsKKworCWlwID0gKHN0cnVjdCBpcCAqKShwICsgU0xJUF9IRFJMRU4pOworCisjaWZkZWYgbm90ZGVmCisJaWYgKGVmbGFnKQorCQlzbGlwbGlua19wcmludChwLCBpcCwgbGVuZ3RoKTsKKyNlbmRpZgorCisJaXBfcHJpbnQoZ25kbywgKHVfY2hhciAqKWlwLCBsZW5ndGgpOworCisJcmV0dXJuIChTTElQX0hEUkxFTik7Cit9CisKK3N0YXRpYyB2b2lkCitzbGlwbGlua19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXAsCisJICAgICAgIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKK3sKKwlpbnQgZGlyOworCXVfaW50IGhsZW47CisKKwlkaXIgPSBwW1NMWF9ESVJdOworCXB1dGNoYXIoZGlyID09IFNMSVBESVJfSU4gPyAnSScgOiAnTycpOworCXB1dGNoYXIoJyAnKTsKKworCWlmIChuZmxhZykgeworCQkvKiBYWFgganVzdCBkdW1wIHRoZSBoZWFkZXIgKi8KKwkJcmVnaXN0ZXIgaW50IGk7CisKKwkJZm9yIChpID0gU0xYX0NIRFI7IGkgPCBTTFhfQ0hEUiArIENIRFJfTEVOIC0gMTsgKytpKQorCQkJcHJpbnRmKCIlMDJ4LiIsIHBbaV0pOworCQlwcmludGYoIiUwMng6ICIsIHBbU0xYX0NIRFIgKyBDSERSX0xFTiAtIDFdKTsKKwkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHBbU0xYX0NIRFJdICYgMHhmMCkgeworCisJY2FzZSBUWVBFX0lQOgorCQlwcmludGYoImlwICVkOiAiLCBsZW5ndGggKyBTTElQX0hEUkxFTik7CisJCWJyZWFrOworCisJY2FzZSBUWVBFX1VOQ09NUFJFU1NFRF9UQ1A6CisJCS8qCisJCSAqIFRoZSBjb25uZWN0aW9uIGlkIGlzIHN0b3JlZCBpbiB0aGUgSVAgcHJvdG9jb2wgZmllbGQuCisJCSAqIEdldCBpdCBmcm9tIHRoZSBsaW5rIGxheWVyIHNpbmNlIHNsX3VuY29tcHJlc3NfdGNwKCkKKwkJICogaGFzIHJlc3RvcmVkIHRoZSBJUCBoZWFkZXIgY29weSB0byBJUFBST1RPX1RDUC4KKwkJICovCisJCWxhc3Rjb25uID0gKChzdHJ1Y3QgaXAgKikmcFtTTFhfQ0hEUl0pLT5pcF9wOworCQlobGVuID0gSVBfSEwoaXApOworCQlobGVuICs9IFRIX09GRigoc3RydWN0IHRjcGhkciAqKSYoKGludCAqKWlwKVtobGVuXSk7CisJCWxhc3RsZW5bZGlyXVtsYXN0Y29ubl0gPSBsZW5ndGggLSAoaGxlbiA8PCAyKTsKKwkJcHJpbnRmKCJ1dGNwICVkOiAiLCBsYXN0Y29ubik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKHBbU0xYX0NIRFJdICYgVFlQRV9DT01QUkVTU0VEX1RDUCkgeworCQkJY29tcHJlc3NlZF9zbF9wcmludCgmcFtTTFhfQ0hEUl0sIGlwLAorCQkJICAgIGxlbmd0aCwgZGlyKTsKKwkJCXByaW50ZigiOiAiKTsKKwkJfSBlbHNlCisJCQlwcmludGYoInNsaXAtJWQhOiAiLCBwW1NMWF9DSERSXSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK3ByaW50X3NsX2NoYW5nZShjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3ApCit7CisJcmVnaXN0ZXIgdV9pbnQgaTsKKworCWlmICgoaSA9ICpjcCsrKSA9PSAwKSB7CisJCWkgPSBFWFRSQUNUXzE2QklUUyhjcCk7CisJCWNwICs9IDI7CisJfQorCXByaW50ZigiICVzJWQiLCBzdHIsIGkpOworCXJldHVybiAoY3ApOworfQorCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK3ByaW50X3NsX3dpbmNoYW5nZShyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwKQoreworCXJlZ2lzdGVyIHNob3J0IGk7CisKKwlpZiAoKGkgPSAqY3ArKykgPT0gMCkgeworCQlpID0gRVhUUkFDVF8xNkJJVFMoY3ApOworCQljcCArPSAyOworCX0KKwlpZiAoaSA+PSAwKQorCQlwcmludGYoIiBXKyVkIiwgaSk7CisJZWxzZQorCQlwcmludGYoIiBXJWQiLCBpKTsKKwlyZXR1cm4gKGNwKTsKK30KKworc3RhdGljIHZvaWQKK2NvbXByZXNzZWRfc2xfcHJpbnQoY29uc3QgdV9jaGFyICpjaGRyLCBjb25zdCBzdHJ1Y3QgaXAgKmlwLAorCQkgICAgdV9pbnQgbGVuZ3RoLCBpbnQgZGlyKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AgPSBjaGRyOworCXJlZ2lzdGVyIHVfaW50IGZsYWdzLCBobGVuOworCisJZmxhZ3MgPSAqY3ArKzsKKwlpZiAoZmxhZ3MgJiBORVdfQykgeworCQlsYXN0Y29ubiA9ICpjcCsrOworCQlwcmludGYoImN0Y3AgJWQiLCBsYXN0Y29ubik7CisJfSBlbHNlCisJCXByaW50ZigiY3RjcCAqIik7CisKKwkvKiBza2lwIHRjcCBjaGVja3N1bSAqLworCWNwICs9IDI7CisKKwlzd2l0Y2ggKGZsYWdzICYgU1BFQ0lBTFNfTUFTSykgeworCWNhc2UgU1BFQ0lBTF9JOgorCQlwcmludGYoIiAqU0ErJWQiLCBsYXN0bGVuW2Rpcl1bbGFzdGNvbm5dKTsKKwkJYnJlYWs7CisKKwljYXNlIFNQRUNJQUxfRDoKKwkJcHJpbnRmKCIgKlMrJWQiLCBsYXN0bGVuW2Rpcl1bbGFzdGNvbm5dKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoZmxhZ3MgJiBORVdfVSkKKwkJCWNwID0gcHJpbnRfc2xfY2hhbmdlKCJVPSIsIGNwKTsKKwkJaWYgKGZsYWdzICYgTkVXX1cpCisJCQljcCA9IHByaW50X3NsX3dpbmNoYW5nZShjcCk7CisJCWlmIChmbGFncyAmIE5FV19BKQorCQkJY3AgPSBwcmludF9zbF9jaGFuZ2UoIkErIiwgY3ApOworCQlpZiAoZmxhZ3MgJiBORVdfUykKKwkJCWNwID0gcHJpbnRfc2xfY2hhbmdlKCJTKyIsIGNwKTsKKwkJYnJlYWs7CisJfQorCWlmIChmbGFncyAmIE5FV19JKQorCQljcCA9IHByaW50X3NsX2NoYW5nZSgiSSsiLCBjcCk7CisKKwkvKgorCSAqICdobGVuJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB1bmNvbXByZXNzZWQgVENQL0lQIGhlYWRlciAoaW4gd29yZHMpLgorCSAqICdjcCAtIGNoZHInIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgaGVhZGVyLgorCSAqICdsZW5ndGggLSBobGVuJyBpcyB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHBhY2tldC4KKwkgKi8KKwlobGVuID0gSVBfSEwoaXApOworCWhsZW4gKz0gVEhfT0ZGKChzdHJ1Y3QgdGNwaGRyICopJigoaW50MzJfdCAqKWlwKVtobGVuXSk7CisJbGFzdGxlbltkaXJdW2xhc3Rjb25uXSA9IGxlbmd0aCAtIChobGVuIDw8IDIpOworCXByaW50ZigiICVkICglbGQpIiwgbGFzdGxlbltkaXJdW2xhc3Rjb25uXSwgKGxvbmcpKGNwIC0gY2hkcikpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtc2xsLmMgYi9wcmludC1zbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzM1ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtc2xsLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc2xsLmMsdiAxLjE2LjIuMyAyMDA1LzExLzEzIDEyOjEzOjAwIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImV0aGVyLmgiCisjaW5jbHVkZSAic2xsLmgiCisKK2NvbnN0IHN0cnVjdCB0b2sgc2xsX3BrdHR5cGVfdmFsdWVzW10gPSB7CisgICAgeyBMSU5VWF9TTExfSE9TVCwgIkluIiB9LAorICAgIHsgTElOVVhfU0xMX0JST0FEQ0FTVCwgIkIiIH0sCisgICAgeyBMSU5VWF9TTExfTVVMVElDQVNULCAiTSIgfSwKKyAgICB7IExJTlVYX1NMTF9PVEhFUkhPU1QsICJQIiB9LAorICAgIHsgTElOVVhfU0xMX09VVEdPSU5HLCAiT3V0IiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2xsX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzbGxfaGVhZGVyICpzbGxwLCB1X2ludCBsZW5ndGgpCit7CisJdV9zaG9ydCBldGhlcl90eXBlOworCisgICAgICAgIHByaW50ZigiJTNzICIsdG9rMnN0cihzbGxfcGt0dHlwZV92YWx1ZXMsIj8iLEVYVFJBQ1RfMTZCSVRTKCZzbGxwLT5zbGxfcGt0dHlwZSkpKTsKKworCS8qCisJICogWFhYIC0gY2hlY2sgdGhlIGxpbmstbGF5ZXIgYWRkcmVzcyB0eXBlIHZhbHVlPworCSAqIEZvciBub3csIHdlIGp1c3QgYXNzdW1lIDYgbWVhbnMgRXRoZXJuZXQuCisJICogWFhYIC0gcHJpbnQgb3RoZXJzIGFzIHN0cmluZ3Mgb2YgaGV4PworCSAqLworCWlmIChFWFRSQUNUXzE2QklUUygmc2xscC0+c2xsX2hhbGVuKSA9PSA2KQorCQkodm9pZClwcmludGYoIiVzICIsIGV0aGVyYWRkcl9zdHJpbmcoc2xscC0+c2xsX2FkZHIpKTsKKworCWlmICghcWZsYWcpIHsKKwkJZXRoZXJfdHlwZSA9IEVYVFJBQ1RfMTZCSVRTKCZzbGxwLT5zbGxfcHJvdG9jb2wpOworCQorCQlpZiAoZXRoZXJfdHlwZSA8PSBFVEhFUk1UVSkgeworCQkJLyoKKwkJCSAqIE5vdCBhbiBFdGhlcm5ldCB0eXBlOyB3aGF0IHR5cGUgaXMgaXQ/CisJCQkgKi8KKwkJCXN3aXRjaCAoZXRoZXJfdHlwZSkgeworCisJCQljYXNlIExJTlVYX1NMTF9QXzgwMl8zOgorCQkJCS8qCisJCQkJICogRXRoZXJuZXRfODAyLjMgSVBYIGZyYW1lLgorCQkJCSAqLworCQkJCSh2b2lkKXByaW50ZigiODAyLjMiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBMSU5VWF9TTExfUF84MDJfMjoKKwkJCQkvKgorCQkJCSAqIDgwMi4yLgorCQkJCSAqLworCQkJCSh2b2lkKXByaW50ZigiODAyLjMiKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKgorCQkJCSAqIFdoYXQgaXMgaXQ/CisJCQkJICovCisJCQkJKHZvaWQpcHJpbnRmKCJldGhlcnR5cGUgVW5rbm93biAoMHglMDR4KSIsCisJCQkJICAgIGV0aGVyX3R5cGUpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJKHZvaWQpcHJpbnRmKCJldGhlcnR5cGUgJXMgKDB4JTA0eCkiLAorCQkJICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywgIlVua25vd24iLCBldGhlcl90eXBlKSwKKwkJCSAgICBldGhlcl90eXBlKTsKKwkJfQorCQkodm9pZClwcmludGYoIiwgbGVuZ3RoICV1OiAiLCBsZW5ndGgpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cyB0byB0aGUKKyAqIExpbnV4ICJjb29rZWQgY2FwdHVyZSIgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqLwordV9pbnQKK3NsbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKK3sKKwl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzbGxfaGVhZGVyICpzbGxwOworCXVfc2hvcnQgZXRoZXJfdHlwZTsKKwl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7CisKKwlpZiAoY2FwbGVuIDwgU0xMX0hEUl9MRU4pIHsKKwkJLyoKKwkJICogWFhYIC0gdGhpcyAiY2FuJ3QgaGFwcGVuIiBiZWNhdXNlICJwY2FwLWxpbnV4LmMiIGFsd2F5cworCQkgKiBhZGRzIHRoaXMgbWFueSBieXRlcyBvZiBoZWFkZXIgdG8gZXZlcnkgcGFja2V0IGluIGEKKwkJICogY29va2VkIHNvY2tldCBjYXB0dXJlLgorCQkgKi8KKwkJcHJpbnRmKCJbfHNsbF0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCXNsbHAgPSAoY29uc3Qgc3RydWN0IHNsbF9oZWFkZXIgKilwOworCisJaWYgKGVmbGFnKQorCQlzbGxfcHJpbnQoc2xscCwgbGVuZ3RoKTsKKworCS8qCisJICogR28gcGFzdCB0aGUgY29va2VkLW1vZGUgaGVhZGVyLgorCSAqLworCWxlbmd0aCAtPSBTTExfSERSX0xFTjsKKwljYXBsZW4gLT0gU0xMX0hEUl9MRU47CisJcCArPSBTTExfSERSX0xFTjsKKworCWV0aGVyX3R5cGUgPSBudG9ocyhzbGxwLT5zbGxfcHJvdG9jb2wpOworCisJLyoKKwkgKiBJcyBpdCAoZ2FnKSBhbiA4MDIuMyBlbmNhcHN1bGF0aW9uLCBvciBzb21lIG5vbi1FdGhlcm5ldAorCSAqIHBhY2tldCB0eXBlPworCSAqLworCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7CisJCS8qCisJCSAqIFllcyAtIHdoYXQgdHlwZSBpcyBpdD8KKwkJICovCisJCXN3aXRjaCAoZXRoZXJfdHlwZSkgeworCisJCWNhc2UgTElOVVhfU0xMX1BfODAyXzM6CisJCQkvKgorCQkJICogRXRoZXJuZXRfODAyLjMgSVBYIGZyYW1lLgorCQkJICovCisJCQlpcHhfcHJpbnQocCwgbGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTElOVVhfU0xMX1BfODAyXzI6CisJCQkvKgorCQkJICogODAyLjIuCisJCQkgKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzLgorCQkJICovCisJCQlpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBOVUxMLCBOVUxMLAorCQkJICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKQorCQkJCWdvdG8gdW5rbm93bjsJLyogdW5rbm93biBMTEMgdHlwZSAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWV4dHJhY3RlZF9ldGhlcnR5cGUgPSAwOworCQkJLypGQUxMVEhST1VHSCovCisKKwkJdW5rbm93bjoKKwkJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCQlpZiAoIWVmbGFnKQorCQkJCXNsbF9wcmludChzbGxwLCBsZW5ndGggKyBTTExfSERSX0xFTik7CisJCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgeworCQkJCXByaW50ZigiKExMQyAlcykgIiwKKwkJCSAgICAgICBldGhlcnByb3RvX3N0cmluZyhodG9ucyhleHRyYWN0ZWRfZXRoZXJ0eXBlKSkpOworCQkJfQorCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQorCQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChldGhlcl9lbmNhcF9wcmludChldGhlcl90eXBlLCBwLCBsZW5ndGgsIGNhcGxlbiwKKwkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApIHsKKwkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KKwkJaWYgKCFlZmxhZykKKwkJCXNsbF9wcmludChzbGxwLCBsZW5ndGggKyBTTExfSERSX0xFTik7CisJCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKKwkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKKwl9CisKKwlyZXR1cm4gKFNMTF9IRFJfTEVOKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LXNsb3cuYyBiL3ByaW50LXNsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA5OTIyCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtc2xvdy5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIFRDUERVTVAgcHJvamVjdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQorICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCisgKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAorICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAorICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBzdXBwb3J0IGZvciB0aGUgSUVFRSAic2xvdyBwcm90b2NvbHMiIExBQ1AsIE1BUktFUiBhcyBwZXIgODAyLjNhZAorICoKKyAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbG93LmMsdiAxLjEuMi4xIDIwMDUvMDcvMTAgMTQ6NDc6NTYgaGFubmVzIEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXIuaCIKKworc3RydWN0IHNsb3dfY29tbW9uX2hlYWRlciB7CisgICAgdV9pbnQ4X3QgcHJvdG9fc3VidHlwZTsKKyAgICB1X2ludDhfdCB2ZXJzaW9uOworfTsKKworI2RlZmluZQlTTE9XX1BST1RPX0xBQ1AgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lCVNMT1dfUFJPVE9fTUFSS0VSICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZQlMQUNQX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lCU1BUktFUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgIDEKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgc2xvd19wcm90b192YWx1ZXNbXSA9IHsKKyAgICB7IFNMT1dfUFJPVE9fTEFDUCwgIkxBQ1AiIH0sCisgICAgeyBTTE9XX1BST1RPX01BUktFUiwgIk1BUktFUiIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdHJ1Y3QgdGx2X2hlYWRlcl90IHsKKyAgICB1X2ludDhfdCB0eXBlOworICAgIHVfaW50OF90IGxlbmd0aDsKK307CisKKyNkZWZpbmUgTEFDUF9UTFZfVEVSTUlOQVRPUiAgICAgMHgwMAorI2RlZmluZSBMQUNQX1RMVl9BQ1RPUl9JTkZPICAgICAweDAxCisjZGVmaW5lIExBQ1BfVExWX1BBUlRORVJfSU5GTyAgIDB4MDIKKyNkZWZpbmUgTEFDUF9UTFZfQ09MTEVDVE9SX0lORk8gMHgwMworCisjZGVmaW5lIE1BUktFUl9UTFZfVEVSTUlOQVRPUiAgIDB4MDAKKyNkZWZpbmUgTUFSS0VSX1RMVl9NQVJLRVJfSU5GTyAgMHgwMQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBzbG93X3Rsdl92YWx1ZXNbXSA9IHsKKyAgICB7IChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9URVJNSU5BVE9SLCAiVGVybWluYXRvciJ9LAorICAgIHsgKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX0FDVE9SX0lORk8sICJBY3RvciBJbmZvcm1hdGlvbiJ9LAorICAgIHsgKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX1BBUlRORVJfSU5GTywgIlBhcnRuZXIgSW5mb3JtYXRpb24ifSwKKyAgICB7IChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9DT0xMRUNUT1JfSU5GTywgIkNvbGxlY3RvciBJbmZvcm1hdGlvbiJ9LAorCisgICAgeyAoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX1RFUk1JTkFUT1IsICJUZXJtaW5hdG9yIn0sCisgICAgeyAoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX01BUktFUl9JTkZPLCAiTWFya2VyIEluZm9ybWF0aW9uIn0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RydWN0IGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb190IHsKKyAgICB1X2ludDhfdCBzeXNfcHJpWzJdOworICAgIHVfaW50OF90IHN5c1tFVEhFUl9BRERSX0xFTl07CisgICAgdV9pbnQ4X3Qga2V5WzJdOworICAgIHVfaW50OF90IHBvcnRfcHJpWzJdOworICAgIHVfaW50OF90IHBvcnRbMl07CisgICAgdV9pbnQ4X3Qgc3RhdGU7CisgICAgdV9pbnQ4X3QgcGFkWzNdOworfTsgICAgICAgICAgCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb19zdGF0ZV92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDEsICJBY3Rpdml0eSJ9LAorICAgIHsgMHgwMiwgIlRpbWVvdXQifSwKKyAgICB7IDB4MDQsICJBZ2dyZWdhdGlvbiJ9LAorICAgIHsgMHgwOCwgIlN5bmNocm9uaXphdGlvbiJ9LAorICAgIHsgMHgxMCwgIkNvbGxlY3RpbmcifSwKKyAgICB7IDB4MjAsICJEaXN0cmlidXRpbmcifSwKKyAgICB7IDB4NDAsICJEZWZhdWx0In0sCisgICAgeyAweDgwLCAiRXhwaXJlZCJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCBsYWNwX3Rsdl9jb2xsZWN0b3JfaW5mb190IHsKKyAgICB1X2ludDhfdCBtYXhfZGVsYXlbMl07CisgICAgdV9pbnQ4X3QgcGFkWzEyXTsKK307IAorCitzdHJ1Y3QgbWFya2VyX3Rsdl9tYXJrZXJfaW5mb190IHsKKyAgICB1X2ludDhfdCByZXFfcG9ydFsyXTsKKyAgICB1X2ludDhfdCByZXFfc3lzW0VUSEVSX0FERFJfTEVOXTsKKyAgICB1X2ludDhfdCByZXFfdHJhbnNfaWRbNF07CisgICAgdV9pbnQ4X3QgcGFkWzJdOworfTsgCisKK3N0cnVjdCBsYWNwX21hcmtlcl90bHZfdGVybWluYXRvcl90IHsKKyAgICB1X2ludDhfdCBwYWRbNTBdOworfTsgCisKK3ZvaWQKK3Nsb3dfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwcHRyLCByZWdpc3RlciB1X2ludCBsZW4pIHsKKworICAgIGNvbnN0IHN0cnVjdCBzbG93X2NvbW1vbl9oZWFkZXIgKnNsb3dfY29tX2hlYWRlcjsKKyAgICBjb25zdCBzdHJ1Y3QgdGx2X2hlYWRlcl90ICp0bHZfaGVhZGVyOworICAgIGNvbnN0IHVfY2hhciAqdHB0ciwqdGx2X3RwdHI7CisgICAgdV9pbnQgdGx2X2xlbix0bGVuLHRsdl90bGVuOworCisgICAgdW5pb24geworICAgICAgICBjb25zdCBzdHJ1Y3QgbGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3JfdCAqbGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3I7CisgICAgICAgIGNvbnN0IHN0cnVjdCBsYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm9fdCAqbGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvOworICAgICAgICBjb25zdCBzdHJ1Y3QgbGFjcF90bHZfY29sbGVjdG9yX2luZm9fdCAqbGFjcF90bHZfY29sbGVjdG9yX2luZm87CisgICAgICAgIGNvbnN0IHN0cnVjdCBtYXJrZXJfdGx2X21hcmtlcl9pbmZvX3QgKm1hcmtlcl90bHZfbWFya2VyX2luZm87CisgICAgfSB0bHZfcHRyOworCisgICAgdHB0cj1wcHRyOworICAgIHNsb3dfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3Qgc2xvd19jb21tb25faGVhZGVyICopcHB0cjsKKyAgICBUQ0hFQ0soKnNsb3dfY29tX2hlYWRlcik7CisKKyAgICAvKgorICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgorICAgICAqLworICAgIGlmIChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPT0gU0xPV19QUk9UT19MQUNQICYmCisgICAgICAgIHNsb3dfY29tX2hlYWRlci0+dmVyc2lvbiAhPSBMQUNQX1ZFUlNJT04pIHsKKwlwcmludGYoIkxBQ1AgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsc2xvd19jb21faGVhZGVyLT52ZXJzaW9uKTsKKwlyZXR1cm47CisgICAgfQorICAgIGlmIChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPT0gU0xPV19QUk9UT19NQVJLRVIgJiYKKyAgICAgICAgc2xvd19jb21faGVhZGVyLT52ZXJzaW9uICE9IE1BUktFUl9WRVJTSU9OKSB7CisJcHJpbnRmKCJNQVJLRVIgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsc2xvd19jb21faGVhZGVyLT52ZXJzaW9uKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCIlc3YldSwgbGVuZ3RoOiAldSIsCisgICAgICAgICAgIHRvazJzdHIoc2xvd19wcm90b192YWx1ZXMsICJ1bmtub3duICgldSkiLHNsb3dfY29tX2hlYWRlci0+cHJvdG9fc3VidHlwZSksCisgICAgICAgICAgIHNsb3dfY29tX2hlYWRlci0+dmVyc2lvbiwKKyAgICAgICAgICAgbGVuKTsKKworICAgIGlmICghdmZsYWcpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCisgICAgdGxlbj1sZW4tc2l6ZW9mKHN0cnVjdCBzbG93X2NvbW1vbl9oZWFkZXIpOworICAgIHRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3Qgc2xvd19jb21tb25faGVhZGVyKTsKKworICAgIHdoaWxlKHRsZW4+MCkgeworICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSB0bHYgaGVhZGVyID8gKi8KKyAgICAgICAgVENIRUNLMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpKTsKKyAgICAgICAgdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgdGx2X2hlYWRlcl90ICopdHB0cjsKKyAgICAgICAgdGx2X2xlbiA9IHRsdl9oZWFkZXItPmxlbmd0aDsKKworICAgICAgICBwcmludGYoIlxuXHQlcyBUTFYgKDB4JTAyeCksIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihzbG93X3Rsdl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHNsb3dfY29tX2hlYWRlci0+cHJvdG9fc3VidHlwZSA8PCA4KSArIHRsdl9oZWFkZXItPnR5cGUpLAorICAgICAgICAgICAgICAgdGx2X2hlYWRlci0+dHlwZSwKKyAgICAgICAgICAgICAgIHRsdl9sZW4pOworCisgICAgICAgIGlmICgodGx2X2xlbiA8IHNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSB8fAorICAgICAgICAgICAgdGx2X2xlbiA+IHRsZW4pICYmCisgICAgICAgICAgICB0bHZfaGVhZGVyLT50eXBlICE9IExBQ1BfVExWX1RFUk1JTkFUT1IgJiYKKyAgICAgICAgICAgIHRsdl9oZWFkZXItPnR5cGUgIT0gTUFSS0VSX1RMVl9URVJNSU5BVE9SKSB7CisgICAgICAgICAgICBwcmludGYoIlxuXHQtLS0tLXRyYWlsaW5nIGRhdGEtLS0tLSIpOworICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrc2l6ZW9mKHNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSksIlxuXHQgICIsdGxlbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0bHZfdHB0cj10cHRyK3NpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KTsKKyAgICAgICAgdGx2X3RsZW49dGx2X2xlbi1zaXplb2Yoc3RydWN0IHRsdl9oZWFkZXJfdCk7CisKKyAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgdGx2ID8gKi8KKyAgICAgICAgVENIRUNLMigqdHB0ciwgdGx2X2xlbik7CisKKyAgICAgICAgc3dpdGNoKChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPDwgOCkgKyB0bHZfaGVhZGVyLT50eXBlKSB7CisKKyAgICAgICAgICAgIC8qIHRob3NlIHR3byBUTFZzIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIC0+IGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlICgoU0xPV19QUk9UT19MQUNQIDw8IDgpICsgTEFDUF9UTFZfQUNUT1JfSU5GTyk6CisgICAgICAgIGNhc2UgKChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9QQVJUTkVSX0lORk8pOgorICAgICAgICAgICAgdGx2X3B0ci5sYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm8gPSAoY29uc3Qgc3RydWN0IGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb190ICopdGx2X3RwdHI7CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgU3lzdGVtICVzLCBTeXN0ZW0gUHJpb3JpdHkgJXUsIEtleSAldSIgXAorICAgICAgICAgICAgICAgICAgICIsIFBvcnQgJXUsIFBvcnQgUHJpb3JpdHkgJXVcblx0ICBTdGF0ZSBGbGFncyBbJXNdIiwKKyAgICAgICAgICAgICAgICAgICBldGhlcmFkZHJfc3RyaW5nKHRsdl9wdHIubGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvLT5zeXMpLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIubGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvLT5zeXNfcHJpKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+a2V5KSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+cG9ydCksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModGx2X3B0ci5sYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm8tPnBvcnRfcHJpKSwKKyAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb19zdGF0ZV92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+c3RhdGUpKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAoKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX0NPTExFQ1RPUl9JTkZPKToKKyAgICAgICAgICAgIHRsdl9wdHIubGFjcF90bHZfY29sbGVjdG9yX2luZm8gPSAoY29uc3Qgc3RydWN0IGxhY3BfdGx2X2NvbGxlY3Rvcl9pbmZvX3QgKil0bHZfdHB0cjsKKworICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBNYXggRGVsYXkgJXUiLAorICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIubGFjcF90bHZfY29sbGVjdG9yX2luZm8tPm1heF9kZWxheSkpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICgoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX01BUktFUl9JTkZPKToKKyAgICAgICAgICAgIHRsdl9wdHIubWFya2VyX3Rsdl9tYXJrZXJfaW5mbyA9IChjb25zdCBzdHJ1Y3QgbWFya2VyX3Rsdl9tYXJrZXJfaW5mb190ICopdGx2X3RwdHI7CisKKyAgICAgICAgICAgIHByaW50ZigiXG5cdCAgUmVxdWVzdCBTeXN0ZW0gJXMsIFJlcXVlc3QgUG9ydCAldSwgUmVxdWVzdCBUcmFuc2FjdGlvbiBJRCAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgIGV0aGVyYWRkcl9zdHJpbmcodGx2X3B0ci5tYXJrZXJfdGx2X21hcmtlcl9pbmZvLT5yZXFfc3lzKSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLm1hcmtlcl90bHZfbWFya2VyX2luZm8tPnJlcV9wb3J0KSwKKyAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLm1hcmtlcl90bHZfbWFya2VyX2luZm8tPnJlcV90cmFuc19pZCkpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLyogdGhvc2UgdHdvIFRMVnMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgLT4gZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgKChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9URVJNSU5BVE9SKToKKyAgICAgICAgY2FzZSAoKFNMT1dfUFJPVE9fTUFSS0VSIDw8IDgpICsgTEFDUF9UTFZfVEVSTUlOQVRPUik6CisgICAgICAgICAgICB0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yID0gKGNvbnN0IHN0cnVjdCBsYWNwX21hcmtlcl90bHZfdGVybWluYXRvcl90ICopdGx2X3RwdHI7CisgICAgICAgICAgICBpZiAodGx2X2xlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGx2X2xlbiA9IHNpemVvZih0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yLT5wYWQpICsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpOworICAgICAgICAgICAgICAgIC8qIHRlbGwgdGhlIHVzZXIgdGhhdCB3ZSBtb2RpZmllZCB0aGUgbGVuZ3RoIGZpZWxkICAqLworICAgICAgICAgICAgICAgIGlmICh2ZmxhZz4xKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAoPSV1KSIsdGx2X2xlbik7CisgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBtZXNzZWQgYXJvdW5kIHdpdGggdGhlIGxlbmd0aCBmaWVsZCAtIG5vdyB3ZSBuZWVkIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgICogYWdhaW4gaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBvbiB0aGUgd2lyZSBmb3IgdGhlIGhleGR1bXAgKi8KKyAgICAgICAgICAgICAgICBUQ0hFQ0syKHRsdl9wdHIubGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3ItPnBhZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yLT5wYWQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQorICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0ciwiXG5cdCAgIix0bHZfdGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgaGV4ZHVtcCA/ICovCisgICAgICAgIGlmICh2ZmxhZyA+IDEpCisgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpKSwiXG5cdCAgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuLXNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSk7CisKKyAgICAgICAgdHB0cis9dGx2X2xlbjsKKyAgICAgICAgdGxlbi09dGx2X2xlbjsKKyAgICB9CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1zbWIuYyBiL3ByaW50LXNtYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOTYzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1zbWIuYwpAQCAtMCwwICsxLDE0NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAxOTk1LTE5OTkKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0Y3BkdW1wIG9yIHRoZSBHTlUgR1BMIHZlcnNpb24gMgorICogb3IgbGF0ZXIKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbWIuYyx2IDEuNDEuMi40IDIwMDcvMDcvMTQgMjI6Mjk6MDUgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAic21iLmgiCisKK3N0YXRpYyBpbnQgcmVxdWVzdCA9IDA7CitzdGF0aWMgaW50IHVuaWNvZGVzdHIgPSAwOworCitjb25zdCB1X2NoYXIgKnN0YXJ0YnVmID0gTlVMTDsKKworc3RydWN0IHNtYmRlc2NyaXB0IHsKKyAgICBjb25zdCBjaGFyICpyZXFfZjE7CisgICAgY29uc3QgY2hhciAqcmVxX2YyOworICAgIGNvbnN0IGNoYXIgKnJlcF9mMTsKKyAgICBjb25zdCBjaGFyICpyZXBfZjI7CisgICAgdm9pZCAoKmZuKShjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7Cit9OworCitzdHJ1Y3Qgc21iZGVzY3JpcHRpbnQgeworICAgIGNvbnN0IGNoYXIgKnJlcV9mMTsKKyAgICBjb25zdCBjaGFyICpyZXFfZjI7CisgICAgY29uc3QgY2hhciAqcmVwX2YxOworICAgIGNvbnN0IGNoYXIgKnJlcF9mMjsKKyAgICB2b2lkICgqZm4pKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgaW50LCBpbnQpOworfTsKKworc3RydWN0IHNtYmZucworeworICAgIGludCBpZDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCBmbGFnczsKKyAgICBzdHJ1Y3Qgc21iZGVzY3JpcHQgZGVzY3JpcHQ7Cit9OworCitzdHJ1Y3Qgc21iZm5zaW50Cit7CisgICAgaW50IGlkOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IGZsYWdzOworICAgIHN0cnVjdCBzbWJkZXNjcmlwdGludCBkZXNjcmlwdDsKK307CisKKyNkZWZpbmUgREVGREVTQ1JJUFQJeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KKworI2RlZmluZSBGTEdfQ0hBSU4JKDEgPDwgMCkKKworc3RhdGljIHN0cnVjdCBzbWJmbnMgKgorc21iZmluZChpbnQgaWQsIHN0cnVjdCBzbWJmbnMgKmxpc3QpCit7CisgICAgaW50IHNpbmRleDsKKworICAgIGZvciAoc2luZGV4ID0gMDsgbGlzdFtzaW5kZXhdLm5hbWU7IHNpbmRleCsrKQorCWlmIChsaXN0W3NpbmRleF0uaWQgPT0gaWQpCisJICAgIHJldHVybigmbGlzdFtzaW5kZXhdKTsKKworICAgIHJldHVybigmbGlzdFswXSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc21iZm5zaW50ICoKK3NtYmZpbmRpbnQoaW50IGlkLCBzdHJ1Y3Qgc21iZm5zaW50ICpsaXN0KQoreworICAgIGludCBzaW5kZXg7CisKKyAgICBmb3IgKHNpbmRleCA9IDA7IGxpc3Rbc2luZGV4XS5uYW1lOyBzaW5kZXgrKykKKwlpZiAobGlzdFtzaW5kZXhdLmlkID09IGlkKQorCSAgICByZXR1cm4oJmxpc3Rbc2luZGV4XSk7CisKKyAgICByZXR1cm4oJmxpc3RbMF0pOworfQorCitzdGF0aWMgdm9pZAordHJhbnMyX2ZpbmRmaXJzdChjb25zdCB1X2NoYXIgKnBhcmFtLCBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBwY250LCBpbnQgZGNudCkKK3sKKyAgICBjb25zdCBjaGFyICpmbXQ7CisKKyAgICBpZiAocmVxdWVzdCkKKwlmbXQgPSAiQXR0cmlidXRlPVtBXVxuU2VhcmNoQ291bnQ9W2RdXG5GbGFncz1bd11cbkxldmVsPVtkUDRdXG5GaWxlPVtTXVxuIjsKKyAgICBlbHNlCisJZm10ID0gIkhhbmRsZT1bd11cbkNvdW50PVtkXVxuRU9TPVt3XVxuRW9mZnNldD1bZF1cbkxhc3ROYW1lT2ZzPVt3XVxuIjsKKworICAgIHNtYl9mZGF0YShwYXJhbSwgZm10LCBwYXJhbSArIHBjbnQsIHVuaWNvZGVzdHIpOworICAgIGlmIChkY250KSB7CisJcHJpbnRmKCJkYXRhOlxuIik7CisJcHJpbnRfZGF0YShkYXRhLCBkY250KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0cmFuczJfcWZzaW5mbyhjb25zdCB1X2NoYXIgKnBhcmFtLCBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBwY250LCBpbnQgZGNudCkKK3sKKyAgICBzdGF0aWMgaW50IGxldmVsID0gMDsKKyAgICBjb25zdCBjaGFyICpmbXQ9IiI7CisKKyAgICBpZiAocmVxdWVzdCkgeworCVRDSEVDSzIoKnBhcmFtLCAyKTsKKwlsZXZlbCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHBhcmFtKTsKKwlmbXQgPSAiSW5mb0xldmVsPVtkXVxuIjsKKwlzbWJfZmRhdGEocGFyYW0sIGZtdCwgcGFyYW0gKyBwY250LCB1bmljb2Rlc3RyKTsKKyAgICB9IGVsc2UgeworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIDE6CisJICAgIGZtdCA9ICJpZEZpbGVTeXN0ZW09W1ddXG5TZWN0b3JVbml0PVtEXVxuVW5pdD1bRF1cbkF2YWlsPVtEXVxuU2VjdG9yU2l6ZT1bZF1cbiI7CisJICAgIGJyZWFrOworCWNhc2UgMjoKKwkgICAgZm10ID0gIkNyZWF0aW9uVGltZT1bVDJdVm9sTmFtZUxlbmd0aD1bbGJdXG5Wb2x1bWVMYWJlbD1bY11cbiI7CisJICAgIGJyZWFrOworCWNhc2UgMHgxMDU6CisJICAgIGZtdCA9ICJDYXBhYmlsaXRpZXM9W1ddXG5NYXhGaWxlTGVuPVtEXVxuVm9sTmFtZUxlbj1bbERdXG5Wb2x1bWU9W0NdXG4iOworCSAgICBicmVhazsKKwlkZWZhdWx0OgorCSAgICBmbXQgPSAiVW5rbm93bkxldmVsXG4iOworCSAgICBicmVhazsKKwl9CisJc21iX2ZkYXRhKGRhdGEsIGZtdCwgZGF0YSArIGRjbnQsIHVuaWNvZGVzdHIpOworICAgIH0KKyAgICBpZiAoZGNudCkgeworCXByaW50ZigiZGF0YTpcbiIpOworCXByaW50X2RhdGEoZGF0YSwgZGNudCk7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCitzdHJ1Y3Qgc21iZm5zaW50IHRyYW5zMl9mbnNbXSA9IHsKKyAgICB7IDAsICJUUkFOU0FDVDJfT1BFTiIsIDAsCisJeyAiRmxhZ3MyPVt3XVxuTW9kZT1bd11cblNlYXJjaEF0dHJpYj1bQV1cbkF0dHJpYj1bQV1cblRpbWU9W1QyXVxuT0Z1bj1bd11cblNpemU9W0RdXG5SZXM9KFt3LCB3LCB3LCB3LCB3XSlcblBhdGg9W1NdIiwKKwkgIE5VTEwsCisJICAiSGFuZGxlPVtkXVxuQXR0cmliPVtBXVxuVGltZT1bVDJdXG5TaXplPVtEXVxuQWNjZXNzPVt3XVxuVHlwZT1bd11cblN0YXRlPVt3XVxuQWN0aW9uPVt3XVxuSW5vZGU9W1ddXG5PZmZFcnI9W2RdXG58RUFMZW5ndGg9W2RdXG4iLAorCSAgTlVMTCwgTlVMTCB9fSwKKyAgICB7IDEsICJUUkFOU0FDVDJfRklOREZJUlNUIiwgMCwKKwl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHRyYW5zMl9maW5kZmlyc3QgfX0sCisgICAgeyAyLCAiVFJBTlNBQ1QyX0ZJTkRORVhUIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IDMsICJUUkFOU0FDVDJfUUZTSU5GTyIsIDAsCisJeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCB0cmFuczJfcWZzaW5mbyB9fSwKKyAgICB7IDQsICJUUkFOU0FDVDJfU0VURlNJTkZPIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IDUsICJUUkFOU0FDVDJfUVBBVEhJTkZPIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IDYsICJUUkFOU0FDVDJfU0VUUEFUSElORk8iLCAwLCBERUZERVNDUklQVCB9LAorICAgIHsgNywgIlRSQU5TQUNUMl9RRklMRUlORk8iLCAwLCBERUZERVNDUklQVCB9LAorICAgIHsgOCwgIlRSQU5TQUNUMl9TRVRGSUxFSU5GTyIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyA5LCAiVFJBTlNBQ1QyX0ZTQ1RMIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IDEwLCAiVFJBTlNBQ1QyX0lPQ1RMIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IDExLCAiVFJBTlNBQ1QyX0ZJTkROT1RJRllGSVJTVCIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyAxMiwgIlRSQU5TQUNUMl9GSU5ETk9USUZZTkVYVCIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyAxMywgIlRSQU5TQUNUMl9NS0RJUiIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyAtMSwgTlVMTCwgMCwgREVGREVTQ1JJUFQgfQorfTsKKworCitzdGF0aWMgdm9pZAorcHJpbnRfdHJhbnMyKGNvbnN0IHVfY2hhciAqd29yZHMsIGNvbnN0IHVfY2hhciAqZGF0LCBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyICptYXhidWYpCit7CisgICAgdV9pbnQgYmNjOworICAgIHN0YXRpYyBzdHJ1Y3Qgc21iZm5zaW50ICpmbiA9ICZ0cmFuczJfZm5zWzBdOworICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgKnBhcmFtOworICAgIGNvbnN0IHVfY2hhciAqdyA9IHdvcmRzICsgMTsKKyAgICBjb25zdCBjaGFyICpmMSA9IE5VTEwsICpmMiA9IE5VTEw7CisgICAgaW50IHBjbnQsIGRjbnQ7CisKKyAgICBUQ0hFQ0sod29yZHNbMF0pOworICAgIGlmIChyZXF1ZXN0KSB7CisJVENIRUNLMih3WzE0ICogMl0sIDIpOworCXBjbnQgPSBFWFRSQUNUX0xFXzE2QklUUyh3ICsgOSAqIDIpOworCXBhcmFtID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDEwICogMik7CisJZGNudCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyAxMSAqIDIpOworCWRhdGEgPSBidWYgKyBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMTIgKiAyKTsKKwlmbiA9IHNtYmZpbmRpbnQoRVhUUkFDVF9MRV8xNkJJVFModyArIDE0ICogMiksIHRyYW5zMl9mbnMpOworICAgIH0gZWxzZSB7CisJaWYgKHdvcmRzWzBdID09IDApIHsKKwkgICAgcHJpbnRmKCIlc1xuIiwgZm4tPm5hbWUpOworCSAgICBwcmludGYoIlRyYW5zMkludGVyaW1cbiIpOworCSAgICByZXR1cm47CisJfQorCVRDSEVDSzIod1s3ICogMl0sIDIpOworCXBjbnQgPSBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMyAqIDIpOworCXBhcmFtID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDQgKiAyKTsKKwlkY250ID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDYgKiAyKTsKKwlkYXRhID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDcgKiAyKTsKKyAgICB9CisKKyAgICBwcmludGYoIiVzIHBhcmFtX2xlbmd0aD0lZCBkYXRhX2xlbmd0aD0lZFxuIiwgZm4tPm5hbWUsIHBjbnQsIGRjbnQpOworCisgICAgaWYgKHJlcXVlc3QpIHsKKwlpZiAod29yZHNbMF0gPT0gOCkgeworCSAgICBzbWJfZmRhdGEod29yZHMgKyAxLAorCQkiVHJhbnMyU2Vjb25kYXJ5XG5Ub3RQYXJhbT1bZF1cblRvdERhdGE9W2RdXG5QYXJhbUNudD1bZF1cblBhcmFtT2ZmPVtkXVxuUGFyYW1EaXNwPVtkXVxuRGF0YUNudD1bZF1cbkRhdGFPZmY9W2RdXG5EYXRhRGlzcD1bZF1cbkhhbmRsZT1bZF1cbiIsCisJCW1heGJ1ZiwgdW5pY29kZXN0cik7CisJICAgIHJldHVybjsKKwl9IGVsc2UgeworCSAgICBzbWJfZmRhdGEod29yZHMgKyAxLAorCQkiVG90UGFyYW09W2RdXG5Ub3REYXRhPVtkXVxuTWF4UGFyYW09W2RdXG5NYXhEYXRhPVtkXVxuTWF4U2V0dXA9W2JdW1AxXVxuRmxhZ3M9W3ddXG5UaW1lT3V0PVtEXVxuUmVzMT1bd11cblBhcmFtQ250PVtkXVxuUGFyYW1PZmY9W2RdXG5EYXRhQ250PVtkXVxuRGF0YU9mZj1bZF1cblNldHVwQ250PVtiXVtQMV1cbiIsCisJCXdvcmRzICsgMSArIDE0ICogMiwgdW5pY29kZXN0cik7CisJfQorCWYxID0gZm4tPmRlc2NyaXB0LnJlcV9mMTsKKwlmMiA9IGZuLT5kZXNjcmlwdC5yZXFfZjI7CisgICAgfSBlbHNlIHsKKwlzbWJfZmRhdGEod29yZHMgKyAxLAorCSAgICAiVG90UGFyYW09W2RdXG5Ub3REYXRhPVtkXVxuUmVzMT1bd11cblBhcmFtQ250PVtkXVxuUGFyYW1PZmY9W2RdXG5QYXJhbURpc3BbZF1cbkRhdGFDbnQ9W2RdXG5EYXRhT2ZmPVtkXVxuRGF0YURpc3A9W2RdXG5TZXR1cENudD1bYl1bUDFdXG4iLAorCSAgICB3b3JkcyArIDEgKyAxMCAqIDIsIHVuaWNvZGVzdHIpOworCWYxID0gZm4tPmRlc2NyaXB0LnJlcF9mMTsKKwlmMiA9IGZuLT5kZXNjcmlwdC5yZXBfZjI7CisgICAgfQorCisgICAgVENIRUNLMigqZGF0LCAyKTsKKyAgICBiY2MgPSBFWFRSQUNUX0xFXzE2QklUUyhkYXQpOworICAgIHByaW50Zigic21iX2JjYz0ldVxuIiwgYmNjKTsKKyAgICBpZiAoZm4tPmRlc2NyaXB0LmZuKQorCSgqZm4tPmRlc2NyaXB0LmZuKShwYXJhbSwgZGF0YSwgcGNudCwgZGNudCk7CisgICAgZWxzZSB7CisJc21iX2ZkYXRhKHBhcmFtLCBmMSA/IGYxIDogIlBhcmFtZXRlcnM9XG4iLCBwYXJhbSArIHBjbnQsIHVuaWNvZGVzdHIpOworCXNtYl9mZGF0YShkYXRhLCBmMiA/IGYyIDogIkRhdGE9XG4iLCBkYXRhICsgZGNudCwgdW5pY29kZXN0cik7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9icm93c2UoY29uc3QgdV9jaGFyICpwYXJhbSwgaW50IHBhcmFtbGVuLCBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBkYXRhbGVuKQoreworICAgIGNvbnN0IHVfY2hhciAqbWF4YnVmID0gZGF0YSArIGRhdGFsZW47CisgICAgaW50IGNvbW1hbmQ7CisKKyAgICBUQ0hFQ0soZGF0YVswXSk7CisgICAgY29tbWFuZCA9IGRhdGFbMF07CisKKyAgICBzbWJfZmRhdGEocGFyYW0sICJCUk9XU0UgUEFDS0VUXG58UGFyYW0gIiwgcGFyYW0rcGFyYW1sZW4sIHVuaWNvZGVzdHIpOworCisgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgY2FzZSAweEY6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLAorCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChMb2NhbE1hc3RlckFubm91bmNlbWVudClcblVwZGF0ZUNvdW50PVt3XVxuUmVzMT1bQl1cbkFubm91bmNlSW50ZXJ2YWw9W2RdXG5OYW1lPVtuMl1cbk1ham9yVmVyc2lvbj1bQl1cbk1pbm9yVmVyc2lvbj1bQl1cblNlcnZlclR5cGU9W1ddXG5FbGVjdGlvblZlcnNpb249W3ddXG5Ccm93c2VyQ29uc3RhbnQ9W3ddXG4iLAorCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOworCWJyZWFrOworCisgICAgY2FzZSAweDE6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLAorCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChIb3N0QW5ub3VuY2VtZW50KVxuVXBkYXRlQ291bnQ9W3ddXG5SZXMxPVtCXVxuQW5ub3VuY2VJbnRlcnZhbD1bZF1cbk5hbWU9W24yXVxuTWFqb3JWZXJzaW9uPVtCXVxuTWlub3JWZXJzaW9uPVtCXVxuU2VydmVyVHlwZT1bV11cbkVsZWN0aW9uVmVyc2lvbj1bd11cbkJyb3dzZXJDb25zdGFudD1bd11cbiIsCisJICAgIG1heGJ1ZiwgdW5pY29kZXN0cik7CisJYnJlYWs7CisKKyAgICBjYXNlIDB4MjoKKwlkYXRhID0gc21iX2ZkYXRhKGRhdGEsCisJICAgICJCUk9XU0UgUEFDS0VUOlxuVHlwZT1bQl0gKEFubm91bmNlbWVudFJlcXVlc3QpXG5GbGFncz1bQl1cblJlcGx5U3lzdGVtTmFtZT1bU11cbiIsCisJICAgIG1heGJ1ZiwgdW5pY29kZXN0cik7CisJYnJlYWs7CisKKyAgICBjYXNlIDB4YzoKKwlkYXRhID0gc21iX2ZkYXRhKGRhdGEsCisJICAgICJCUk9XU0UgUEFDS0VUOlxuVHlwZT1bQl0gKFdvcmtncm91cEFubm91bmNlbWVudClcblVwZGF0ZUNvdW50PVt3XVxuUmVzMT1bQl1cbkFubm91bmNlSW50ZXJ2YWw9W2RdXG5OYW1lPVtuMl1cbk1ham9yVmVyc2lvbj1bQl1cbk1pbm9yVmVyc2lvbj1bQl1cblNlcnZlclR5cGU9W1ddXG5Db21tZW50UG9pbnRlcj1bV11cblNlcnZlck5hbWU9W1NdXG4iLAorCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOworCWJyZWFrOworCisgICAgY2FzZSAweDg6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLAorCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChFbGVjdGlvbkZyYW1lKVxuRWxlY3Rpb25WZXJzaW9uPVtCXVxuT1NTdW1tYXJ5PVtXXVxuVXB0aW1lPVsoVywgVyldXG5TZXJ2ZXJOYW1lPVtTXVxuIiwKKwkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKKwlicmVhazsKKworICAgIGNhc2UgMHhiOgorCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKKwkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoQmVjb21lQmFja3VwQnJvd3Nlcilcbk5hbWU9W1NdXG4iLAorCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOworCWJyZWFrOworCisgICAgY2FzZSAweDk6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLAorCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChHZXRCYWNrdXBMaXN0KVxuTGlzdENvdW50Pz1bQl1cblRva2VuPVtXXVxuIiwKKwkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKKwlicmVhazsKKworICAgIGNhc2UgMHhhOgorCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKKwkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoQmFja3VwTGlzdFJlc3BvbnNlKVxuU2VydmVyQ291bnQ/PVtCXVxuVG9rZW49W1ddXG4qTmFtZT1bU11cbiIsCisJICAgIG1heGJ1ZiwgdW5pY29kZXN0cik7CisJYnJlYWs7CisKKyAgICBjYXNlIDB4ZDoKKwlkYXRhID0gc21iX2ZkYXRhKGRhdGEsCisJICAgICJCUk9XU0UgUEFDS0VUOlxuVHlwZT1bQl0gKE1hc3RlckFubm91bmNlbWVudClcbk1hc3Rlck5hbWU9W1NdXG4iLAorCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOworCWJyZWFrOworCisgICAgY2FzZSAweGU6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLAorCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChSZXNldEJyb3dzZXIpXG5PcHRpb25zPVtCXVxuIiwgbWF4YnVmLCB1bmljb2Rlc3RyKTsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiVW5rbm93biBCcm93c2VyIEZyYW1lICIsIG1heGJ1ZiwgdW5pY29kZXN0cik7CisJYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9pcGMoY29uc3QgdV9jaGFyICpwYXJhbSwgaW50IHBhcmFtbGVuLCBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBkYXRhbGVuKQoreworICAgIGlmIChwYXJhbWxlbikKKwlzbWJfZmRhdGEocGFyYW0sICJDb21tYW5kPVt3XVxuU3RyMT1bU11cblN0cjI9W1NdXG4iLCBwYXJhbSArIHBhcmFtbGVuLAorCSAgICB1bmljb2Rlc3RyKTsKKyAgICBpZiAoZGF0YWxlbikKKwlzbWJfZmRhdGEoZGF0YSwgIklQQyAiLCBkYXRhICsgZGF0YWxlbiwgdW5pY29kZXN0cik7Cit9CisKKworc3RhdGljIHZvaWQKK3ByaW50X3RyYW5zKGNvbnN0IHVfY2hhciAqd29yZHMsIGNvbnN0IHVfY2hhciAqZGF0YTEsIGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCB1X2NoYXIgKm1heGJ1ZikKK3sKKyAgICB1X2ludCBiY2M7CisgICAgY29uc3QgY2hhciAqZjEsICpmMiwgKmYzLCAqZjQ7CisgICAgY29uc3QgdV9jaGFyICpkYXRhLCAqcGFyYW07CisgICAgY29uc3QgdV9jaGFyICp3ID0gd29yZHMgKyAxOworICAgIGludCBkYXRhbGVuLCBwYXJhbWxlbjsKKworICAgIGlmIChyZXF1ZXN0KSB7CisJVENIRUNLMih3WzEyICogMl0sIDIpOworCXBhcmFtbGVuID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDkgKiAyKTsKKwlwYXJhbSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyAxMCAqIDIpOworCWRhdGFsZW4gPSBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMTEgKiAyKTsKKwlkYXRhID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDEyICogMik7CisJZjEgPSAiVG90UGFyYW1DbnQ9W2RdIFxuVG90RGF0YUNudD1bZF0gXG5NYXhQYXJtQ250PVtkXSBcbk1heERhdGFDbnQ9W2RdXG5NYXhTQ250PVtkXSBcblRyYW5zRmxhZ3M9W3ddIFxuUmVzMT1bd10gXG5SZXMyPVt3XSBcblJlczM9W3ddXG5QYXJhbUNudD1bZF0gXG5QYXJhbU9mZj1bZF0gXG5EYXRhQ250PVtkXSBcbkRhdGFPZmY9W2RdIFxuU1VDbnQ9W2RdXG4iOworCWYyID0gInxOYW1lPVtTXVxuIjsKKwlmMyA9ICJ8UGFyYW0gIjsKKwlmNCA9ICJ8RGF0YSAiOworICAgIH0gZWxzZSB7CisJVENIRUNLMih3WzcgKiAyXSwgMik7CisJcGFyYW1sZW4gPSBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMyAqIDIpOworCXBhcmFtID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDQgKiAyKTsKKwlkYXRhbGVuID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDYgKiAyKTsKKwlkYXRhID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDcgKiAyKTsKKwlmMSA9ICJUb3RQYXJhbUNudD1bZF0gXG5Ub3REYXRhQ250PVtkXSBcblJlczE9W2RdXG5QYXJhbUNudD1bZF0gXG5QYXJhbU9mZj1bZF0gXG5SZXMyPVtkXSBcbkRhdGFDbnQ9W2RdIFxuRGF0YU9mZj1bZF0gXG5SZXMzPVtkXVxuTHNldHVwPVtkXVxuIjsKKwlmMiA9ICJ8VW5rbm93biAiOworCWYzID0gInxQYXJhbSAiOworCWY0ID0gInxEYXRhICI7CisgICAgfQorCisgICAgc21iX2ZkYXRhKHdvcmRzICsgMSwgZjEsIFNNQk1JTih3b3JkcyArIDEgKyAyICogd29yZHNbMF0sIG1heGJ1ZiksCisgICAgICAgIHVuaWNvZGVzdHIpOworCisgICAgVENIRUNLMigqZGF0YTEsIDIpOworICAgIGJjYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGExKTsKKyAgICBwcmludGYoInNtYl9iY2M9JXVcbiIsIGJjYyk7CisgICAgaWYgKGJjYyA+IDApIHsKKwlzbWJfZmRhdGEoZGF0YTEgKyAyLCBmMiwgbWF4YnVmIC0gKHBhcmFtbGVuICsgZGF0YWxlbiksIHVuaWNvZGVzdHIpOworCisJaWYgKHN0cmNtcCgoY29uc3QgY2hhciAqKShkYXRhMSArIDIpLCAiXFxNQUlMU0xPVFxcQlJPV1NFIikgPT0gMCkgeworCSAgICBwcmludF9icm93c2UocGFyYW0sIHBhcmFtbGVuLCBkYXRhLCBkYXRhbGVuKTsKKwkgICAgcmV0dXJuOworCX0KKworCWlmIChzdHJjbXAoKGNvbnN0IGNoYXIgKikoZGF0YTEgKyAyKSwgIlxcUElQRVxcTEFOTUFOIikgPT0gMCkgeworCSAgICBwcmludF9pcGMocGFyYW0sIHBhcmFtbGVuLCBkYXRhLCBkYXRhbGVuKTsKKwkgICAgcmV0dXJuOworCX0KKworCWlmIChwYXJhbWxlbikKKwkgICAgc21iX2ZkYXRhKHBhcmFtLCBmMywgU01CTUlOKHBhcmFtICsgcGFyYW1sZW4sIG1heGJ1ZiksIHVuaWNvZGVzdHIpOworCWlmIChkYXRhbGVuKQorCSAgICBzbWJfZmRhdGEoZGF0YSwgZjQsIFNNQk1JTihkYXRhICsgZGF0YWxlbiwgbWF4YnVmKSwgdW5pY29kZXN0cik7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkCitwcmludF9uZWdwcm90KGNvbnN0IHVfY2hhciAqd29yZHMsIGNvbnN0IHVfY2hhciAqZGF0YSwgY29uc3QgdV9jaGFyICpidWYgX1VfLCBjb25zdCB1X2NoYXIgKm1heGJ1ZikKK3sKKyAgICB1X2ludCB3Y3QsIGJjYzsKKyAgICBjb25zdCBjaGFyICpmMSA9IE5VTEwsICpmMiA9IE5VTEw7CisKKyAgICBUQ0hFQ0sod29yZHNbMF0pOworICAgIHdjdCA9IHdvcmRzWzBdOworICAgIGlmIChyZXF1ZXN0KQorCWYyID0gIip8RGlhbGVjdD1bWV1cbiI7CisgICAgZWxzZSB7CisJaWYgKHdjdCA9PSAxKQorCSAgICBmMSA9ICJDb3JlIFByb3RvY29sXG5EaWFsZWN0SW5kZXg9W2RdIjsKKwllbHNlIGlmICh3Y3QgPT0gMTcpCisJICAgIGYxID0gIk5UMSBQcm90b2NvbFxuRGlhbGVjdEluZGV4PVtkXVxuU2VjTW9kZT1bQl1cbk1heE11eD1bZF1cbk51bVZjcz1bZF1cbk1heEJ1ZmZlcj1bRF1cblJhd1NpemU9W0RdXG5TZXNzaW9uS2V5PVtXXVxuQ2FwYWJpbGl0aWVzPVtXXVxuU2VydmVyVGltZT1bVDNdVGltZVpvbmU9W2RdXG5DcnlwdEtleT0iOworCWVsc2UgaWYgKHdjdCA9PSAxMykKKwkgICAgZjEgPSAiQ29yZXBsdXMvTGFubWFuMS9MYW5tYW4yIFByb3RvY29sXG5EaWFsZWN0SW5kZXg9W2RdXG5TZWNNb2RlPVt3XVxuTWF4WE1pdD1bZF1cbk1heE11eD1bZF1cbk1heFZjcz1bZF1cbkJsa01vZGU9W3ddXG5TZXNzaW9uS2V5PVtXXVxuU2VydmVyVGltZT1bVDFdVGltZVpvbmU9W2RdXG5SZXM9W1ddXG5DcnlwdEtleT0iOworICAgIH0KKworICAgIGlmIChmMSkKKwlzbWJfZmRhdGEod29yZHMgKyAxLCBmMSwgU01CTUlOKHdvcmRzICsgMSArIHdjdCAqIDIsIG1heGJ1ZiksCisJICAgIHVuaWNvZGVzdHIpOworICAgIGVsc2UKKwlwcmludF9kYXRhKHdvcmRzICsgMSwgU01CTUlOKHdjdCAqIDIsIFBUUl9ESUZGKG1heGJ1Ziwgd29yZHMgKyAxKSkpOworCisgICAgVENIRUNLMigqZGF0YSwgMik7CisgICAgYmNjID0gRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSk7CisgICAgcHJpbnRmKCJzbWJfYmNjPSV1XG4iLCBiY2MpOworICAgIGlmIChiY2MgPiAwKSB7CisJaWYgKGYyKQorCSAgICBzbWJfZmRhdGEoZGF0YSArIDIsIGYyLCBTTUJNSU4oZGF0YSArIDIgKyBFWFRSQUNUX0xFXzE2QklUUyhkYXRhKSwKKwkJbWF4YnVmKSwgdW5pY29kZXN0cik7CisJZWxzZQorCSAgICBwcmludF9kYXRhKGRhdGEgKyAyLCBTTUJNSU4oRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSksIFBUUl9ESUZGKG1heGJ1ZiwgZGF0YSArIDIpKSk7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc2Vzc3NldHVwKGNvbnN0IHVfY2hhciAqd29yZHMsIGNvbnN0IHVfY2hhciAqZGF0YSwgY29uc3QgdV9jaGFyICpidWYgX1VfLCBjb25zdCB1X2NoYXIgKm1heGJ1ZikKK3sKKyAgICB1X2ludCB3Y3QsIGJjYzsKKyAgICBjb25zdCBjaGFyICpmMSA9IE5VTEwsICpmMiA9IE5VTEw7CisKKyAgICBUQ0hFQ0sod29yZHNbMF0pOworICAgIHdjdCA9IHdvcmRzWzBdOworICAgIGlmIChyZXF1ZXN0KSB7CisJaWYgKHdjdCA9PSAxMCkKKwkgICAgZjEgPSAiQ29tMj1bd11cbk9mZjI9W2RdXG5CdWZTaXplPVtkXVxuTXB4TWF4PVtkXVxuVmNOdW09W2RdXG5TZXNzaW9uS2V5PVtXXVxuUGFzc0xlbj1bZF1cbkNyeXB0TGVuPVtkXVxuQ3J5cHRPZmY9W2RdXG5QYXNzJk5hbWU9XG4iOworCWVsc2UKKwkgICAgZjEgPSAiQ29tMj1bQl1cblJlczE9W0JdXG5PZmYyPVtkXVxuTWF4QnVmZmVyPVtkXVxuTWF4TXB4PVtkXVxuVmNOdW1iZXI9W2RdXG5TZXNzaW9uS2V5PVtXXVxuQ2FzZUluc2Vuc2l0aXZlUGFzc3dvcmRMZW5ndGg9W2RdXG5DYXNlU2Vuc2l0aXZlUGFzc3dvcmRMZW5ndGg9W2RdXG5SZXM9W1ddXG5DYXBhYmlsaXRpZXM9W1ddXG5QYXNzMSZQYXNzMiZBY2NvdW50JkRvbWFpbiZPUyZMYW5NYW49XG4iOworICAgIH0gZWxzZSB7CisJaWYgKHdjdCA9PSAzKSB7CisJICAgIGYxID0gIkNvbTI9W3ddXG5PZmYyPVtkXVxuQWN0aW9uPVt3XVxuIjsKKwl9IGVsc2UgaWYgKHdjdCA9PSAxMykgeworCSAgICBmMSA9ICJDb20yPVtCXVxuUmVzPVtCXVxuT2ZmMj1bZF1cbkFjdGlvbj1bd11cbiI7CisJICAgIGYyID0gIk5hdGl2ZU9TPVtTXVxuTmF0aXZlTGFuTWFuPVtTXVxuUHJpbWFyeURvbWFpbj1bU11cbiI7CisJfQorICAgIH0KKworICAgIGlmIChmMSkKKwlzbWJfZmRhdGEod29yZHMgKyAxLCBmMSwgU01CTUlOKHdvcmRzICsgMSArIHdjdCAqIDIsIG1heGJ1ZiksCisJICAgIHVuaWNvZGVzdHIpOworICAgIGVsc2UKKwlwcmludF9kYXRhKHdvcmRzICsgMSwgU01CTUlOKHdjdCAqIDIsIFBUUl9ESUZGKG1heGJ1Ziwgd29yZHMgKyAxKSkpOworCisgICAgVENIRUNLMigqZGF0YSwgMik7CisgICAgYmNjID0gRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSk7CisgICAgcHJpbnRmKCJzbWJfYmNjPSV1XG4iLCBiY2MpOworICAgIGlmIChiY2MgPiAwKSB7CisJaWYgKGYyKQorCSAgICBzbWJfZmRhdGEoZGF0YSArIDIsIGYyLCBTTUJNSU4oZGF0YSArIDIgKyBFWFRSQUNUX0xFXzE2QklUUyhkYXRhKSwKKwkJbWF4YnVmKSwgdW5pY29kZXN0cik7CisJZWxzZQorCSAgICBwcmludF9kYXRhKGRhdGEgKyAyLCBTTUJNSU4oRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSksIFBUUl9ESUZGKG1heGJ1ZiwgZGF0YSArIDIpKSk7CisgICAgfQorICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfbG9ja2luZ2FuZHgoY29uc3QgdV9jaGFyICp3b3JkcywgY29uc3QgdV9jaGFyICpkYXRhLCBjb25zdCB1X2NoYXIgKmJ1ZiBfVV8sIGNvbnN0IHVfY2hhciAqbWF4YnVmKQoreworICAgIHVfaW50IHdjdCwgYmNjOworICAgIGNvbnN0IHVfY2hhciAqbWF4d29yZHM7CisgICAgY29uc3QgY2hhciAqZjEgPSBOVUxMLCAqZjIgPSBOVUxMOworCisgICAgVENIRUNLKHdvcmRzWzBdKTsKKyAgICB3Y3QgPSB3b3Jkc1swXTsKKyAgICBpZiAocmVxdWVzdCkgeworCWYxID0gIkNvbTI9W3ddXG5PZmYyPVtkXVxuSGFuZGxlPVtkXVxuTG9ja1R5cGU9W3ddXG5UaW1lT3V0PVtEXVxuVW5sb2NrQ291bnQ9W2RdXG5Mb2NrQ291bnQ9W2RdXG4iOworCVRDSEVDSyh3b3Jkc1s3XSk7CisJaWYgKHdvcmRzWzddICYgMHgxMCkKKwkgICAgZjIgPSAiKlByb2Nlc3M9W2RdXG5bUDJdT2Zmc2V0PVtNXVxuTGVuZ3RoPVtNXVxuIjsKKwllbHNlCisJICAgIGYyID0gIipQcm9jZXNzPVtkXVxuT2Zmc2V0PVtEXVxuTGVuZ3RoPVtEXVxuIjsKKyAgICB9IGVsc2UgeworCWYxID0gIkNvbTI9W3ddXG5PZmYyPVtkXVxuIjsKKyAgICB9CisKKyAgICBtYXh3b3JkcyA9IFNNQk1JTih3b3JkcyArIDEgKyB3Y3QgKiAyLCBtYXhidWYpOworICAgIGlmICh3Y3QpCisJc21iX2ZkYXRhKHdvcmRzICsgMSwgZjEsIG1heHdvcmRzLCB1bmljb2Rlc3RyKTsKKworICAgIFRDSEVDSzIoKmRhdGEsIDIpOworICAgIGJjYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpOworICAgIHByaW50Zigic21iX2JjYz0ldVxuIiwgYmNjKTsKKyAgICBpZiAoYmNjID4gMCkgeworCWlmIChmMikKKwkgICAgc21iX2ZkYXRhKGRhdGEgKyAyLCBmMiwgU01CTUlOKGRhdGEgKyAyICsgRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSksCisJCW1heGJ1ZiksIHVuaWNvZGVzdHIpOworCWVsc2UKKwkgICAgcHJpbnRfZGF0YShkYXRhICsgMiwgU01CTUlOKEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpLCBQVFJfRElGRihtYXhidWYsIGRhdGEgKyAyKSkpOworICAgIH0KKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICBwcmludGYoIlt8U01CXSIpOworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgc3RydWN0IHNtYmZucyBzbWJfZm5zW10gPSB7CisgICAgeyAtMSwgIlNNQnVua25vd24iLCAwLCBERUZERVNDUklQVCB9LAorCisgICAgeyBTTUJ0Y29uLCAiU01CdGNvbiIsIDAsCisJeyBOVUxMLCAiUGF0aD1bWl1cblBhc3N3b3JkPVtaXVxuRGV2aWNlPVtaXVxuIiwKKwkgICJNYXhYbWl0PVtkXVxuVHJlZUlkPVtkXVxuIiwgTlVMTCwKKwkgIE5VTEwgfSB9LAorCisgICAgeyBTTUJ0ZGlzLCAiU01CdGRpcyIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyBTTUJleGl0LCAgIlNNQmV4aXQiLCAwLCBERUZERVNDUklQVCB9LAorICAgIHsgU01CaW9jdGwsICJTTUJpb2N0bCIsIDAsIERFRkRFU0NSSVBUIH0sCisKKyAgICB7IFNNQmVjaG8sICJTTUJlY2hvIiwgMCwKKwl7ICJSZXZlcmJDb3VudD1bZF1cbiIsIE5VTEwsCisJICAiU2VxdWVuY2VOdW09W2RdXG4iLCBOVUxMLAorCSAgTlVMTCB9IH0sCisKKyAgICB7IFNNQnVsb2dvZmZYLCAiU01CdWxvZ29mZlgiLCBGTEdfQ0hBSU4sIERFRkRFU0NSSVBUIH0sCisKKyAgICB7IFNNQmdldGF0ciwgIlNNQmdldGF0ciIsIDAsCisJeyBOVUxMLCAiUGF0aD1bWl1cbiIsCisJICAiQXR0cmlidXRlPVtBXVxuVGltZT1bVDJdU2l6ZT1bRF1cblJlcz0oW3csdyx3LHcsd10pXG4iLCBOVUxMLAorCSAgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNldGF0ciwgIlNNQnNldGF0ciIsIDAsCisJeyAiQXR0cmlidXRlPVtBXVxuVGltZT1bVDJdUmVzPShbdyx3LHcsdyx3XSlcbiIsICJQYXRoPVtaXVxuIiwKKwkgIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJjaGtwdGgsICJTTUJjaGtwdGgiLCAwLAorICAgICAgIHsgTlVMTCwgIlBhdGg9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cc2VhcmNoLCAiU01Cc2VhcmNoIiwgMCwKKwl7ICJDb3VudD1bZF1cbkF0dHJpYj1bQV1cbiIsCisJICAiUGF0aD1bWl1cbkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG58UmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG5SZXMyPVtXXVxuIiwKKwkgICJDb3VudD1bZF1cbiIsCisJICAiQmxrVHlwZT1bQl1cbkJsa0xlbj1bZF1cbipcblJlczE9W0JdXG5NYXNrPVtzMTFdXG5TcnYxPVtCXVxuRGlySW5kZXg9W2RdXG5TcnYyPVt3XVxuUmVzMj1bV11cbkF0dHJpYj1bYV1cblRpbWU9W1QxXVNpemU9W0RdXG5OYW1lPVtzMTNdXG4iLAorCSAgTlVMTCB9IH0sCisKKyAgICB7IFNNQm9wZW4sICJTTUJvcGVuIiwgMCwKKwl7ICJNb2RlPVt3XVxuQXR0cmlidXRlPVtBXVxuIiwgIlBhdGg9W1pdXG4iLAorCSAgIkhhbmRsZT1bZF1cbk9BdHRyaWI9W0FdXG5UaW1lPVtUMl1TaXplPVtEXVxuQWNjZXNzPVt3XVxuIiwKKwkgIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJjcmVhdGUsICJTTUJjcmVhdGUiLCAwLAorCXsgIkF0dHJpYj1bQV1cblRpbWU9W1QyXSIsICJQYXRoPVtaXVxuIiwgIkhhbmRsZT1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJta25ldywgIlNNQm1rbmV3IiwgMCwKKwl7ICJBdHRyaWI9W0FdXG5UaW1lPVtUMl0iLCAiUGF0aD1bWl1cbiIsICJIYW5kbGU9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CdW5saW5rLCAiU01CdW5saW5rIiwgMCwKKwl7ICJBdHRyaWI9W0FdXG4iLCAiUGF0aD1bWl1cbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJyZWFkLCAiU01CcmVhZCIsIDAsCisJeyAiSGFuZGxlPVtkXVxuQnl0ZUNvdW50PVtkXVxuT2Zmc2V0PVtEXVxuQ291bnRMZWZ0PVtkXVxuIiwgTlVMTCwKKwkgICJDb3VudD1bZF1cblJlcz0oW3csdyx3LHddKVxuIiwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQndyaXRlLCAiU01Cd3JpdGUiLCAwLAorCXsgIkhhbmRsZT1bZF1cbkJ5dGVDb3VudD1bZF1cbk9mZnNldD1bRF1cbkNvdW50TGVmdD1bZF1cbiIsIE5VTEwsCisJICAiQ291bnQ9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CY2xvc2UsICJTTUJjbG9zZSIsIDAsCisJeyAiSGFuZGxlPVtkXVxuVGltZT1bVDJdIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQm1rZGlyLCAiU01CbWtkaXIiLCAwLAorCXsgTlVMTCwgIlBhdGg9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Ccm1kaXIsICJTTUJybWRpciIsIDAsCisJeyBOVUxMLCAiUGF0aD1bWl1cbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJkc2thdHRyLCAiU01CZHNrYXR0ciIsIDAsCisJeyBOVUxMLCBOVUxMLAorCSAgIlRvdGFsVW5pdHM9W2RdXG5CbG9ja3NQZXJVbml0PVtkXVxuQmxvY2tTaXplPVtkXVxuRnJlZVVuaXRzPVtkXVxuTWVkaWE9W3ddXG4iLAorCSAgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQm12LCAiU01CbXYiLCAwLAorCXsgIkF0dHJpYj1bQV1cbiIsICJPbGRQYXRoPVtaXVxuTmV3UGF0aD1bWl1cbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgLyoKKyAgICAgKiB0aGlzIGlzIGEgUGF0aHdvcmtzIHNwZWNpZmljIGNhbGwsIGFsbG93aW5nIHRoZQorICAgICAqIGNoYW5naW5nIG9mIHRoZSByb290IHBhdGgKKyAgICAgKi8KKyAgICB7IHBTRVRESVIsICJTTUJzZXRkaXIiLCAwLCB7IE5VTEwsICJQYXRoPVtaXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQmxzZWVrLCAiU01CbHNlZWsiLCAwLAorCXsgIkhhbmRsZT1bZF1cbk1vZGU9W3ddXG5PZmZzZXQ9W0RdXG4iLCAiT2Zmc2V0PVtEXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQmZsdXNoLCAiU01CZmx1c2giLCAwLCB7ICJIYW5kbGU9W2RdXG4iLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cc3Bsb3BlbiwgIlNNQnNwbG9wZW4iLCAwLAorCXsgIlNldHVwTGVuPVtkXVxuTW9kZT1bd11cbiIsICJJZGVudD1bWl1cbiIsICJIYW5kbGU9W2RdXG4iLAorCSAgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNwbGNsb3NlLCAiU01Cc3BsY2xvc2UiLCAwLAorCXsgIkhhbmRsZT1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJzcGxyZXRxLCAiU01Cc3BscmV0cSIsIDAsCisJeyAiTWF4Q291bnQ9W2RdXG5TdGFydEluZGV4PVtkXVxuIiwgTlVMTCwKKwkgICJDb3VudD1bZF1cbkluZGV4PVtkXVxuIiwKKwkgICIqVGltZT1bVDJdU3RhdHVzPVtCXVxuSm9iSUQ9W2RdXG5TaXplPVtEXVxuUmVzPVtCXU5hbWU9W3MxNl1cbiIsCisJICBOVUxMIH0gfSwKKworICAgIHsgU01Cc3Bsd3IsICJTTUJzcGx3ciIsIDAsCisJeyAiSGFuZGxlPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQmxvY2ssICJTTUJsb2NrIiwgMCwKKwl7ICJIYW5kbGU9W2RdXG5Db3VudD1bRF1cbk9mZnNldD1bRF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJ1bmxvY2ssICJTTUJ1bmxvY2siLCAwLAorCXsgIkhhbmRsZT1bZF1cbkNvdW50PVtEXVxuT2Zmc2V0PVtEXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICAvKiBDT1JFKyBQUk9UT0NPTCBGT0xMT1dTICovCisKKyAgICB7IFNNQnJlYWRicmF3LCAiU01CcmVhZGJyYXciLCAwLAorCXsgIkhhbmRsZT1bZF1cbk9mZnNldD1bRF1cbk1heENvdW50PVtkXVxuTWluQ291bnQ9W2RdXG5UaW1lT3V0PVtEXVxuUmVzPVtkXVxuIiwKKwkgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJ3cml0ZWJyYXcsICJTTUJ3cml0ZWJyYXciLCAwLAorCXsgIkhhbmRsZT1bZF1cblRvdGFsQ291bnQ9W2RdXG5SZXM9W3ddXG5PZmZzZXQ9W0RdXG5UaW1lT3V0PVtEXVxuV01vZGU9W3ddXG5SZXMyPVtXXVxufERhdGFTaXplPVtkXVxuRGF0YU9mZj1bZF1cbiIsCisJICBOVUxMLCAiV3JpdGVSYXdBY2siLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cd3JpdGVjLCAiU01Cd3JpdGVjIiwgMCwKKwl7IE5VTEwsIE5VTEwsICJDb3VudD1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJ3cml0ZWNsb3NlLCAiU01Cd3JpdGVjbG9zZSIsIDAsCisJeyAiSGFuZGxlPVtkXVxuQ291bnQ9W2RdXG5PZmZzZXQ9W0RdXG5UaW1lPVtUMl1SZXM9KFt3LHcsdyx3LHcsd10pIiwKKwkgIE5VTEwsICJDb3VudD1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJsb2NrcmVhZCwgIlNNQmxvY2tyZWFkIiwgMCwKKwl7ICJIYW5kbGU9W2RdXG5CeXRlQ291bnQ9W2RdXG5PZmZzZXQ9W0RdXG5Db3VudExlZnQ9W2RdXG4iLCBOVUxMLAorCSAgIkNvdW50PVtkXVxuUmVzPShbdyx3LHcsd10pXG4iLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cd3JpdGV1bmxvY2ssICJTTUJ3cml0ZXVubG9jayIsIDAsCisJeyAiSGFuZGxlPVtkXVxuQnl0ZUNvdW50PVtkXVxuT2Zmc2V0PVtEXVxuQ291bnRMZWZ0PVtkXVxuIiwgTlVMTCwKKwkgICJDb3VudD1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJyZWFkQm1weCwgIlNNQnJlYWRCbXB4IiwgMCwKKwl7ICJIYW5kbGU9W2RdXG5PZmZzZXQ9W0RdXG5NYXhDb3VudD1bZF1cbk1pbkNvdW50PVtkXVxuVGltZU91dD1bRF1cblJlcz1bd11cbiIsCisJICBOVUxMLAorCSAgIk9mZnNldD1bRF1cblRvdENvdW50PVtkXVxuUmVtYWluaW5nPVtkXVxuUmVzPShbdyx3XSlcbkRhdGFTaXplPVtkXVxuRGF0YU9mZj1bZF1cbiIsCisJICBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cd3JpdGVCbXB4LCAiU01Cd3JpdGVCbXB4IiwgMCwKKwl7ICJIYW5kbGU9W2RdXG5Ub3RDb3VudD1bZF1cblJlcz1bd11cbk9mZnNldD1bRF1cblRpbWVPdXQ9W0RdXG5XTW9kZT1bd11cblJlczI9W1ddXG5EYXRhU2l6ZT1bZF1cbkRhdGFPZmY9W2RdXG4iLCBOVUxMLAorCSAgIlJlbWFpbmluZz1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJ3cml0ZUJzLCAiU01Cd3JpdGVCcyIsIDAsCisJeyAiSGFuZGxlPVtkXVxuVG90Q291bnQ9W2RdXG5PZmZzZXQ9W0RdXG5SZXM9W1ddXG5EYXRhU2l6ZT1bZF1cbkRhdGFPZmY9W2RdXG4iLAorCSAgTlVMTCwgIkNvdW50PVtkXVxuIiwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNldGF0dHJFLCAiU01Cc2V0YXR0ckUiLCAwLAorCXsgIkhhbmRsZT1bZF1cbkNyZWF0aW9uVGltZT1bVDJdQWNjZXNzVGltZT1bVDJdTW9kaWZ5VGltZT1bVDJdIiwgTlVMTCwKKwkgIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJnZXRhdHRyRSwgIlNNQmdldGF0dHJFIiwgMCwKKwl7ICJIYW5kbGU9W2RdXG4iLCBOVUxMLAorCSAgIkNyZWF0aW9uVGltZT1bVDJdQWNjZXNzVGltZT1bVDJdTW9kaWZ5VGltZT1bVDJdU2l6ZT1bRF1cbkFsbG9jU2l6ZT1bRF1cbkF0dHJpYnV0ZT1bQV1cbiIsCisJICBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CdHJhbnNzLCAiU01CdHJhbnNzIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IFNNQmlvY3RscywgIlNNQmlvY3RscyIsIDAsIERFRkRFU0NSSVBUIH0sCisKKyAgICB7IFNNQmNvcHksICJTTUJjb3B5IiwgMCwKKwl7ICJUcmVlSUQyPVtkXVxuT0Z1bj1bd11cbkZsYWdzPVt3XVxuIiwgIlBhdGg9W1NdXG5OZXdQYXRoPVtTXVxuIiwKKwkgICJDb3B5Q291bnQ9W2RdXG4iLCAgInxFcnJTdHI9W1NdXG4iLCAgTlVMTCB9IH0sCisKKyAgICB7IFNNQm1vdmUsICJTTUJtb3ZlIiwgMCwKKwl7ICJUcmVlSUQyPVtkXVxuT0Z1bj1bd11cbkZsYWdzPVt3XVxuIiwgIlBhdGg9W1NdXG5OZXdQYXRoPVtTXVxuIiwKKwkgICJNb3ZlQ291bnQ9W2RdXG4iLCAgInxFcnJTdHI9W1NdXG4iLCAgTlVMTCB9IH0sCisKKyAgICB7IFNNQm9wZW5YLCAiU01Cb3BlblgiLCBGTEdfQ0hBSU4sCisJeyAiQ29tMj1bd11cbk9mZjI9W2RdXG5GbGFncz1bd11cbk1vZGU9W3ddXG5TZWFyY2hBdHRyaWI9W0FdXG5BdHRyaWI9W0FdXG5UaW1lPVtUMl1PRnVuPVt3XVxuU2l6ZT1bRF1cblRpbWVPdXQ9W0RdXG5SZXM9W1ddXG4iLAorCSAgIlBhdGg9W1NdXG4iLAorCSAgIkNvbTI9W3ddXG5PZmYyPVtkXVxuSGFuZGxlPVtkXVxuQXR0cmliPVtBXVxuVGltZT1bVDJdU2l6ZT1bRF1cbkFjY2Vzcz1bd11cblR5cGU9W3ddXG5TdGF0ZT1bd11cbkFjdGlvbj1bd11cbkZpbGVJRD1bV11cblJlcz1bd11cbiIsCisJICBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CcmVhZFgsICJTTUJyZWFkWCIsIEZMR19DSEFJTiwKKwl7ICJDb20yPVt3XVxuT2ZmMj1bZF1cbkhhbmRsZT1bZF1cbk9mZnNldD1bRF1cbk1heENvdW50PVtkXVxuTWluQ291bnQ9W2RdXG5UaW1lT3V0PVtEXVxuQ291bnRMZWZ0PVtkXVxuIiwKKwkgIE5VTEwsCisJICAiQ29tMj1bd11cbk9mZjI9W2RdXG5SZW1haW5pbmc9W2RdXG5SZXM9W1ddXG5EYXRhU2l6ZT1bZF1cbkRhdGFPZmY9W2RdXG5SZXM9KFt3LHcsdyx3XSlcbiIsCisJICBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cd3JpdGVYLCAiU01Cd3JpdGVYIiwgRkxHX0NIQUlOLAorCXsgIkNvbTI9W3ddXG5PZmYyPVtkXVxuSGFuZGxlPVtkXVxuT2Zmc2V0PVtEXVxuVGltZU91dD1bRF1cbldNb2RlPVt3XVxuQ291bnRMZWZ0PVtkXVxuUmVzPVt3XVxuRGF0YVNpemU9W2RdXG5EYXRhT2ZmPVtkXVxuIiwKKwkgIE5VTEwsCisJICAiQ29tMj1bd11cbk9mZjI9W2RdXG5Db3VudD1bZF1cblJlbWFpbmluZz1bZF1cblJlcz1bV11cbiIsCisJICBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CZmZpcnN0LCAiU01CZmZpcnN0IiwgMCwKKwl7ICJDb3VudD1bZF1cbkF0dHJpYj1bQV1cbiIsCisJICAiUGF0aD1bWl1cbkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG58UmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG4iLAorCSAgIkNvdW50PVtkXVxuIiwKKwkgICJCbGtUeXBlPVtCXVxuQmxrTGVuPVtkXVxuKlxuUmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG5SZXMyPVtXXVxuQXR0cmliPVthXVxuVGltZT1bVDFdU2l6ZT1bRF1cbk5hbWU9W3MxM11cbiIsCisJICBOVUxMIH0gfSwKKworICAgIHsgU01CZnVuaXF1ZSwgIlNNQmZ1bmlxdWUiLCAwLAorCXsgIkNvdW50PVtkXVxuQXR0cmliPVtBXVxuIiwKKwkgICJQYXRoPVtaXVxuQmxrVHlwZT1bQl1cbkJsa0xlbj1bZF1cbnxSZXMxPVtCXVxuTWFzaz1bczExXVxuU3J2MT1bQl1cbkRpckluZGV4PVtkXVxuU3J2Mj1bd11cbiIsCisJICAiQ291bnQ9W2RdXG4iLAorCSAgIkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG4qXG5SZXMxPVtCXVxuTWFzaz1bczExXVxuU3J2MT1bQl1cbkRpckluZGV4PVtkXVxuU3J2Mj1bd11cblJlczI9W1ddXG5BdHRyaWI9W2FdXG5UaW1lPVtUMV1TaXplPVtEXVxuTmFtZT1bczEzXVxuIiwKKwkgIE5VTEwgfSB9LAorCisgICAgeyBTTUJmY2xvc2UsICJTTUJmY2xvc2UiLCAwLAorCXsgIkNvdW50PVtkXVxuQXR0cmliPVtBXVxuIiwKKwkgICJQYXRoPVtaXVxuQmxrVHlwZT1bQl1cbkJsa0xlbj1bZF1cbnxSZXMxPVtCXVxuTWFzaz1bczExXVxuU3J2MT1bQl1cbkRpckluZGV4PVtkXVxuU3J2Mj1bd11cbiIsCisJICAiQ291bnQ9W2RdXG4iLAorCSAgIkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG4qXG5SZXMxPVtCXVxuTWFzaz1bczExXVxuU3J2MT1bQl1cbkRpckluZGV4PVtkXVxuU3J2Mj1bd11cblJlczI9W1ddXG5BdHRyaWI9W2FdXG5UaW1lPVtUMV1TaXplPVtEXVxuTmFtZT1bczEzXVxuIiwKKwkgIE5VTEwgfSB9LAorCisgICAgeyBTTUJmaW5kbmNsb3NlLCAiU01CZmluZG5jbG9zZSIsIDAsCisJeyAiSGFuZGxlPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQmZpbmRjbG9zZSwgIlNNQmZpbmRjbG9zZSIsIDAsCisJeyAiSGFuZGxlPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNlbmRzLCAiU01Cc2VuZHMiLCAwLAorCXsgTlVMTCwgIlNvdXJjZT1bWl1cbkRlc3Q9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01Cc2VuZHN0cnQsICJTTUJzZW5kc3RydCIsIDAsCisJeyBOVUxMLCAiU291cmNlPVtaXVxuRGVzdD1bWl1cbiIsICJHcm91cElEPVtkXVxuIiwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNlbmRlbmQsICJTTUJzZW5kZW5kIiwgMCwKKwl7ICJHcm91cElEPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNlbmR0eHQsICJTTUJzZW5kdHh0IiwgMCwKKwl7ICJHcm91cElEPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCisKKyAgICB7IFNNQnNlbmRiLCAiU01Cc2VuZGIiLCAwLAorCXsgTlVMTCwgIlNvdXJjZT1bWl1cbkRlc3Q9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKKworICAgIHsgU01CZndkbmFtZSwgIlNNQmZ3ZG5hbWUiLCAwLCBERUZERVNDUklQVCB9LAorICAgIHsgU01CY2FuY2VsZiwgIlNNQmNhbmNlbGYiLCAwLCBERUZERVNDUklQVCB9LAorICAgIHsgU01CZ2V0bWFjLCAiU01CZ2V0bWFjIiwgMCwgREVGREVTQ1JJUFQgfSwKKworICAgIHsgU01CbmVncHJvdCwgIlNNQm5lZ3Byb3QiLCAwLAorCXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcHJpbnRfbmVncHJvdCB9IH0sCisKKyAgICB7IFNNQnNlc3NzZXR1cFgsICJTTUJzZXNzc2V0dXBYIiwgRkxHX0NIQUlOLAorCXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcHJpbnRfc2Vzc3NldHVwIH0gfSwKKworICAgIHsgU01CdGNvblgsICJTTUJ0Y29uWCIsIEZMR19DSEFJTiwKKwl7ICJDb20yPVt3XVxuT2ZmMj1bZF1cbkZsYWdzPVt3XVxuUGFzc0xlbj1bZF1cblBhc3N3ZCZQYXRoJkRldmljZT1cbiIsCisJICBOVUxMLCAiQ29tMj1bd11cbk9mZjI9W2RdXG4iLCAiU2VydmljZVR5cGU9W1JdXG4iLCBOVUxMIH0gfSwKKworICAgIHsgU01CbG9ja2luZ1gsICJTTUJsb2NraW5nWCIsIEZMR19DSEFJTiwKKwl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHByaW50X2xvY2tpbmdhbmR4IH0gfSwKKworICAgIHsgU01CdHJhbnMyLCAiU01CdHJhbnMyIiwgMCwgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBwcmludF90cmFuczIgfSB9LAorCisgICAgeyBTTUJ0cmFuc3MyLCAiU01CdHJhbnNzMiIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyBTTUJjdGVtcCwgIlNNQmN0ZW1wIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IFNNQnJlYWRCcywgIlNNQnJlYWRCcyIsIDAsIERFRkRFU0NSSVBUIH0sCisgICAgeyBTTUJ0cmFucywgIlNNQnRyYW5zIiwgMCwgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBwcmludF90cmFucyB9IH0sCisKKyAgICB7IFNNQm50dHJhbnMsICJTTUJudHRyYW5zIiwgMCwgREVGREVTQ1JJUFQgfSwKKyAgICB7IFNNQm50dHJhbnNzLCAiU01CbnR0cmFuc3MiLCAwLCBERUZERVNDUklQVCB9LAorCisgICAgeyBTTUJudGNyZWF0ZVgsICJTTUJudGNyZWF0ZVgiLCBGTEdfQ0hBSU4sCisJeyAiQ29tMj1bd11cbk9mZjI9W2RdXG5SZXM9W2JdXG5OYW1lTGVuPVtsZF1cbkZsYWdzPVtXXVxuUm9vdERpcmVjdG9yeUZpZD1bRF1cbkFjY2Vzc01hc2s9W1ddXG5BbGxvY2F0aW9uU2l6ZT1bTF1cbkV4dEZpbGVBdHRyaWJ1dGVzPVtXXVxuU2hhcmVBY2Nlc3M9W1ddXG5DcmVhdGVEaXNwb3NpdGlvbj1bV11cbkNyZWF0ZU9wdGlvbnM9W1ddXG5JbXBlcnNvbmF0aW9uTGV2ZWw9W1ddXG5TZWN1cml0eUZsYWdzPVtiXVxuIiwKKwkgICJQYXRoPVtDXVxuIiwKKwkgICJDb20yPVt3XVxuT2ZmMj1bZF1cbk9wbG9ja0xldmVsPVtiXVxuRmlkPVtkXVxuQ3JlYXRlQWN0aW9uPVtXXVxuQ3JlYXRlVGltZT1bVDNdTGFzdEFjY2Vzc1RpbWU9W1QzXUxhc3RXcml0ZVRpbWU9W1QzXUNoYW5nZVRpbWU9W1QzXUV4dEZpbGVBdHRyaWJ1dGVzPVtXXVxuQWxsb2NhdGlvblNpemU9W0xdXG5FbmRPZkZpbGU9W0xdXG5GaWxlVHlwZT1bd11cbkRldmljZVN0YXRlPVt3XVxuRGlyZWN0b3J5PVtiXVxuIiwKKwkgIE5VTEwsIE5VTEwgfSB9LAorCisgICAgeyBTTUJudGNhbmNlbCwgIlNNQm50Y2FuY2VsIiwgMCwgREVGREVTQ1JJUFQgfSwKKworICAgIHsgLTEsIE5VTEwsIDAsIERFRkRFU0NSSVBUIH0KK307CisKKworLyoKKyAqIHByaW50IGEgU01CIG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQKK3ByaW50X3NtYihjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyICptYXhidWYpCit7CisgICAgdV9pbnQxNl90IGZsYWdzMjsKKyAgICBpbnQgbnRlcnJjb2RlczsKKyAgICBpbnQgY29tbWFuZDsKKyAgICB1X2ludDMyX3QgbnRlcnJvcjsKKyAgICBjb25zdCB1X2NoYXIgKndvcmRzLCAqbWF4d29yZHMsICpkYXRhOworICAgIHN0cnVjdCBzbWJmbnMgKmZuOworICAgIGNvbnN0IGNoYXIgKmZtdF9zbWJoZWFkZXIgPQorICAgICAgICAiW1A0XVNNQiBDb21tYW5kICAgPSAgW0JdXG5FcnJvciBjbGFzcyAgID0gIFtCUDFdXG5FcnJvciBjb2RlICAgID0gIFtkXVxuRmxhZ3MxICAgICAgICA9ICBbQl1cbkZsYWdzMiAgICAgICAgPSAgW0JdW1AxM11cblRyZWUgSUQgICAgICAgPSAgW2RdXG5Qcm9jIElEICAgICAgID0gIFtkXVxuVUlEICAgICAgICAgICA9ICBbZF1cbk1JRCAgICAgICAgICAgPSAgW2RdXG5Xb3JkIENvdW50ICAgID0gIFtiXVxuIjsKKyAgICBpbnQgc21ib2Zmc2V0OworCisgICAgVENIRUNLKGJ1Zls5XSk7CisgICAgcmVxdWVzdCA9IChidWZbOV0gJiAweDgwKSA/IDAgOiAxOworICAgIGZsYWdzMiA9IEVYVFJBQ1RfTEVfMTZCSVRTKCZidWZbMTBdKTsKKyAgICB1bmljb2Rlc3RyID0gZmxhZ3MyICYgMHg4MDAwOworICAgIG50ZXJyY29kZXMgPSBmbGFnczIgJiAweDQwMDA7CisgICAgc3RhcnRidWYgPSBidWY7CisKKyAgICBjb21tYW5kID0gYnVmWzRdOworCisgICAgZm4gPSBzbWJmaW5kKGNvbW1hbmQsIHNtYl9mbnMpOworCisgICAgaWYgKHZmbGFnID4gMSkKKwlwcmludGYoIlxuIik7CisKKyAgICBwcmludGYoIlNNQiBQQUNLRVQ6ICVzICglcylcbiIsIGZuLT5uYW1lLCByZXF1ZXN0ID8gIlJFUVVFU1QiIDogIlJFUExZIik7CisKKyAgICBpZiAodmZsYWcgPCAyKQorCXJldHVybjsKKworICAgIC8qIHByaW50IG91dCB0aGUgaGVhZGVyICovCisgICAgc21iX2ZkYXRhKGJ1ZiwgZm10X3NtYmhlYWRlciwgYnVmICsgMzMsIHVuaWNvZGVzdHIpOworCisgICAgaWYgKG50ZXJyY29kZXMpIHsKKyAgICAJbnRlcnJvciA9IEVYVFJBQ1RfTEVfMzJCSVRTKCZidWZbNV0pOworCWlmIChudGVycm9yKQorCSAgICBwcmludGYoIk5URXJyb3IgPSAlc1xuIiwgbnRfZXJyc3RyKG50ZXJyb3IpKTsKKyAgICB9IGVsc2UgeworCWlmIChidWZbNV0pCisJICAgIHByaW50ZigiU01CRXJyb3IgPSAlc1xuIiwgc21iX2VycnN0cihidWZbNV0sIEVYVFJBQ1RfTEVfMTZCSVRTKCZidWZbN10pKSk7CisgICAgfQorCisgICAgc21ib2Zmc2V0ID0gMzI7CisKKyAgICBmb3IgKDs7KSB7CisJY29uc3QgY2hhciAqZjEsICpmMjsKKwlpbnQgd2N0OworCXVfaW50IGJjYzsKKwlpbnQgbmV3c21ib2Zmc2V0OworCisJd29yZHMgPSBidWYgKyBzbWJvZmZzZXQ7CisJVENIRUNLKHdvcmRzWzBdKTsKKwl3Y3QgPSB3b3Jkc1swXTsKKwlkYXRhID0gd29yZHMgKyAxICsgd2N0ICogMjsKKwltYXh3b3JkcyA9IFNNQk1JTihkYXRhLCBtYXhidWYpOworCisJaWYgKHJlcXVlc3QpIHsKKwkgICAgZjEgPSBmbi0+ZGVzY3JpcHQucmVxX2YxOworCSAgICBmMiA9IGZuLT5kZXNjcmlwdC5yZXFfZjI7CisJfSBlbHNlIHsKKwkgICAgZjEgPSBmbi0+ZGVzY3JpcHQucmVwX2YxOworCSAgICBmMiA9IGZuLT5kZXNjcmlwdC5yZXBfZjI7CisJfQorCisJaWYgKGZuLT5kZXNjcmlwdC5mbikKKwkgICAgKCpmbi0+ZGVzY3JpcHQuZm4pKHdvcmRzLCBkYXRhLCBidWYsIG1heGJ1Zik7CisJZWxzZSB7CisJICAgIGlmICh3Y3QpIHsKKwkJaWYgKGYxKQorCQkgICAgc21iX2ZkYXRhKHdvcmRzICsgMSwgZjEsIHdvcmRzICsgMSArIHdjdCAqIDIsIHVuaWNvZGVzdHIpOworCQllbHNlIHsKKwkJICAgIGludCBpOworCQkgICAgaW50IHY7CisKKwkJICAgIGZvciAoaSA9IDA7ICZ3b3Jkc1sxICsgMiAqIGldIDwgbWF4d29yZHM7IGkrKykgeworCQkJVENIRUNLMih3b3Jkc1sxICsgMiAqIGldLCAyKTsKKwkJCXYgPSBFWFRSQUNUX0xFXzE2QklUUyh3b3JkcyArIDEgKyAyICogaSk7CisJCQlwcmludGYoInNtYl92d3ZbJWRdPSVkICgweCVYKVxuIiwgaSwgdiwgdik7CisJCSAgICB9CisJCX0KKwkgICAgfQorCisJICAgIFRDSEVDSzIoKmRhdGEsIDIpOworCSAgICBiY2MgPSBFWFRSQUNUX0xFXzE2QklUUyhkYXRhKTsKKwkgICAgcHJpbnRmKCJzbWJfYmNjPSV1XG4iLCBiY2MpOworCSAgICBpZiAoZjIpIHsKKwkJaWYgKGJjYyA+IDApCisJCSAgICBzbWJfZmRhdGEoZGF0YSArIDIsIGYyLCBkYXRhICsgMiArIGJjYywgdW5pY29kZXN0cik7CisJICAgIH0gZWxzZSB7CisJCWlmIChiY2MgPiAwKSB7CisJCSAgICBwcmludGYoInNtYl9idWZbXT1cbiIpOworCQkgICAgcHJpbnRfZGF0YShkYXRhICsgMiwgU01CTUlOKGJjYywgUFRSX0RJRkYobWF4YnVmLCBkYXRhICsgMikpKTsKKwkJfQorCSAgICB9CisJfQorCisJaWYgKChmbi0+ZmxhZ3MgJiBGTEdfQ0hBSU4pID09IDApCisJICAgIGJyZWFrOworCWlmICh3Y3QgPT0gMCkKKwkgICAgYnJlYWs7CisJVENIRUNLKHdvcmRzWzFdKTsKKwljb21tYW5kID0gd29yZHNbMV07CisJaWYgKGNvbW1hbmQgPT0gMHhGRikKKwkgICAgYnJlYWs7CisJVENIRUNLMih3b3Jkc1szXSwgMik7CisJbmV3c21ib2Zmc2V0ID0gRVhUUkFDVF9MRV8xNkJJVFMod29yZHMgKyAzKTsgCisKKwlmbiA9IHNtYmZpbmQoY29tbWFuZCwgc21iX2Zucyk7CisKKwlwcmludGYoIlxuU01CIFBBQ0tFVDogJXMgKCVzKSAoQ0hBSU5FRClcbiIsCisJICAgIGZuLT5uYW1lLCByZXF1ZXN0ID8gIlJFUVVFU1QiIDogIlJFUExZIik7CisJaWYgKG5ld3NtYm9mZnNldCA8PSBzbWJvZmZzZXQpIHsKKwkgICAgcHJpbnRmKCJCYWQgYW5kWCBvZmZzZXQ6ICV1IDw9ICV1XG4iLCBuZXdzbWJvZmZzZXQsIHNtYm9mZnNldCk7CisJICAgIGJyZWFrOworCX0KKwlzbWJvZmZzZXQgPSBuZXdzbWJvZmZzZXQ7CisgICAgfQorCisgICAgcHJpbnRmKCJcbiIpOworICAgIHJldHVybjsKK3RydW5jOgorICAgIHByaW50ZigiW3xTTUJdIik7CisgICAgcmV0dXJuOworfQorCisKKy8qCisgKiBwcmludCBhIE5CVCBwYWNrZXQgcmVjZWl2ZWQgYWNyb3NzIHRjcCBvbiBwb3J0IDEzOQorICovCit2b2lkCituYnRfdGNwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgY2FwbGVuOworICAgIGludCB0eXBlOworICAgIHVfaW50IG5idF9sZW47CisgICAgY29uc3QgdV9jaGFyICptYXhidWY7CisKKyAgICBpZiAobGVuZ3RoIDwgNCkKKwlnb3RvIHRydW5jOworICAgIGlmIChzbmFwZW5kIDwgZGF0YSkKKwlnb3RvIHRydW5jOworICAgIGNhcGxlbiA9IHNuYXBlbmQgLSBkYXRhOworICAgIGlmIChjYXBsZW4gPCA0KQorCWdvdG8gdHJ1bmM7CisgICAgbWF4YnVmID0gZGF0YSArIGNhcGxlbjsKKyAgICB0eXBlID0gZGF0YVswXTsKKyAgICBuYnRfbGVuID0gRVhUUkFDVF8xNkJJVFMoZGF0YSArIDIpOworICAgIGxlbmd0aCAtPSA0OworICAgIGNhcGxlbiAtPSA0OworCisgICAgc3RhcnRidWYgPSBkYXRhOworCisgICAgaWYgKHZmbGFnIDwgMikgeworCXByaW50ZigiIE5CVCBTZXNzaW9uIFBhY2tldDogIik7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAweDAwOgorCSAgICBwcmludGYoIlNlc3Npb24gTWVzc2FnZSIpOworCSAgICBicmVhazsKKworCWNhc2UgMHg4MToKKwkgICAgcHJpbnRmKCJTZXNzaW9uIFJlcXVlc3QiKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4ODI6CisJICAgIHByaW50ZigiU2Vzc2lvbiBHcmFudGVkIik7CisJICAgIGJyZWFrOworCisJY2FzZSAweDgzOgorCSAgeworCSAgICBpbnQgZWNvZGU7CisKKwkgICAgaWYgKG5idF9sZW4gPCA0KQorCQlnb3RvIHRydW5jOworCSAgICBpZiAobGVuZ3RoIDwgNCkKKwkJZ290byB0cnVuYzsKKwkgICAgaWYgKGNhcGxlbiA8IDQpCisJCWdvdG8gdHJ1bmM7CisJICAgIGVjb2RlID0gZGF0YVs0XTsKKworCSAgICBwcmludGYoIlNlc3Npb24gUmVqZWN0LCAiKTsKKwkgICAgc3dpdGNoIChlY29kZSkgeworCSAgICBjYXNlIDB4ODA6CisJCXByaW50ZigiTm90IGxpc3RlbmluZyBvbiBjYWxsZWQgbmFtZSIpOworCQlicmVhazsKKwkgICAgY2FzZSAweDgxOgorCQlwcmludGYoIk5vdCBsaXN0ZW5pbmcgZm9yIGNhbGxpbmcgbmFtZSIpOworCQlicmVhazsKKwkgICAgY2FzZSAweDgyOgorCQlwcmludGYoIkNhbGxlZCBuYW1lIG5vdCBwcmVzZW50Iik7CisJCWJyZWFrOworCSAgICBjYXNlIDB4ODM6CisJCXByaW50ZigiQ2FsbGVkIG5hbWUgcHJlc2VudCwgYnV0IGluc3VmZmljaWVudCByZXNvdXJjZXMiKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCXByaW50ZigiVW5zcGVjaWZpZWQgZXJyb3IgMHglWCIsIGVjb2RlKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIDB4ODU6CisJICAgIHByaW50ZigiU2Vzc2lvbiBLZWVwYWxpdmUiKTsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJVbmtub3duIHBhY2tldCB0eXBlIFtyQl0iLCBtYXhidWYsIDApOworCSAgICBicmVhazsKKwl9CisgICAgfSBlbHNlIHsKKwlwcmludGYgKCJcbj4+PiBOQlQgU2Vzc2lvbiBQYWNrZXRcbiIpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMHgwMDoKKwkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiW1AxXU5CVCBTZXNzaW9uIE1lc3NhZ2VcbkZsYWdzPVtCXVxuTGVuZ3RoPVtyZF1cbiIsCisJCWRhdGEgKyA0LCAwKTsKKwkgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGlmIChuYnRfbGVuID49IDQgJiYgY2FwbGVuID49IDQgJiYgbWVtY21wKGRhdGEsIlwzNzdTTUIiLDQpID09IDApIHsKKwkJaWYgKChpbnQpbmJ0X2xlbiA+IGNhcGxlbikgeworCQkgICAgaWYgKChpbnQpbmJ0X2xlbiA+IGxlbmd0aCkKKwkJCXByaW50ZigiV0FSTklORzogUGFja2V0IGlzIGNvbnRpbnVlZCBpbiBsYXRlciBUQ1Agc2VnbWVudHNcbiIpOworCQkgICAgZWxzZQorCQkJcHJpbnRmKCJXQVJOSU5HOiBTaG9ydCBwYWNrZXQuIFRyeSBpbmNyZWFzaW5nIHRoZSBzbmFwIGxlbmd0aCBieSAlZFxuIiwKKwkJCSAgICBuYnRfbGVuIC0gY2FwbGVuKTsKKwkJfQorCQlwcmludF9zbWIoZGF0YSwgbWF4YnVmID4gZGF0YSArIG5idF9sZW4gPyBkYXRhICsgbmJ0X2xlbiA6IG1heGJ1Zik7CisJICAgIH0gZWxzZQorCQlwcmludGYoIlNlc3Npb24gcGFja2V0OihyYXcgZGF0YSBvciBjb250aW51YXRpb24/KVxuIik7CisJICAgIGJyZWFrOworCisJY2FzZSAweDgxOgorCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsCisJCSJbUDFdTkJUIFNlc3Npb24gUmVxdWVzdFxuRmxhZ3M9W0JdXG5MZW5ndGg9W3JkXVxuRGVzdGluYXRpb249W24xXVxuU291cmNlPVtuMV1cbiIsCisJCW1heGJ1ZiwgMCk7CisJICAgIGJyZWFrOworCisJY2FzZSAweDgyOgorCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJbUDFdTkJUIFNlc3Npb24gR3JhbnRlZFxuRmxhZ3M9W0JdXG5MZW5ndGg9W3JkXVxuIiwgbWF4YnVmLCAwKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIDB4ODM6CisJICB7CisJICAgIGNvbnN0IHVfY2hhciAqb3JpZ2RhdGE7CisJICAgIGludCBlY29kZTsKKworCSAgICBvcmlnZGF0YSA9IGRhdGE7CisJICAgIGRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIltQMV1OQlQgU2Vzc2lvblJlamVjdFxuRmxhZ3M9W0JdXG5MZW5ndGg9W3JkXVxuUmVhc29uPVtCXVxuIiwKKwkJbWF4YnVmLCAwKTsKKwkgICAgaWYgKGRhdGEgPT0gTlVMTCkKKwkJYnJlYWs7CisJICAgIGlmIChuYnRfbGVuID49IDEgJiYgY2FwbGVuID49IDEpIHsKKwkJZWNvZGUgPSBvcmlnZGF0YVs0XTsKKwkJc3dpdGNoIChlY29kZSkgeworCQljYXNlIDB4ODA6CisJCSAgICBwcmludGYoIk5vdCBsaXN0ZW5pbmcgb24gY2FsbGVkIG5hbWVcbiIpOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHg4MToKKwkJICAgIHByaW50ZigiTm90IGxpc3RlbmluZyBmb3IgY2FsbGluZyBuYW1lXG4iKTsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4ODI6CisJCSAgICBwcmludGYoIkNhbGxlZCBuYW1lIG5vdCBwcmVzZW50XG4iKTsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4ODM6CisJCSAgICBwcmludGYoIkNhbGxlZCBuYW1lIHByZXNlbnQsIGJ1dCBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzXG4iKTsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgcHJpbnRmKCJVbnNwZWNpZmllZCBlcnJvciAweCVYXG4iLCBlY29kZSk7CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICB9CisJICAgIGJyZWFrOworCisJY2FzZSAweDg1OgorCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJbUDFdTkJUIFNlc3Npb24gS2VlcGFsaXZlXG5GbGFncz1bQl1cbkxlbmd0aD1bcmRdXG4iLCBtYXhidWYsIDApOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIGRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIk5CVCAtIFVua25vd24gcGFja2V0IHR5cGVcblR5cGU9W0JdXG4iLCBtYXhidWYsIDApOworCSAgICBicmVhazsKKwl9CisJcHJpbnRmKCJcbiIpOworCWZmbHVzaChzdGRvdXQpOworICAgIH0KKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICBwcmludGYoIlt8U01CXSIpOworICAgIHJldHVybjsKK30KKworCisvKgorICogcHJpbnQgYSBOQlQgcGFja2V0IHJlY2VpdmVkIGFjcm9zcyB1ZHAgb24gcG9ydCAxMzcKKyAqLwordm9pZAorbmJ0X3VkcDEzN19wcmludChjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgpCit7CisgICAgY29uc3QgdV9jaGFyICptYXhidWYgPSBkYXRhICsgbGVuZ3RoOworICAgIGludCBuYW1lX3Rybl9pZCwgcmVzcG9uc2UsIG9wY29kZSwgbm1fZmxhZ3MsIHJjb2RlOworICAgIGludCBxZGNvdW50LCBhbmNvdW50LCBuc2NvdW50LCBhcmNvdW50OworICAgIGNvbnN0IGNoYXIgKm9wY29kZXN0cjsKKyAgICBjb25zdCB1X2NoYXIgKnA7CisgICAgaW50IHRvdGFsLCBpOworCisgICAgVENIRUNLMihkYXRhWzEwXSwgMik7CisgICAgbmFtZV90cm5faWQgPSBFWFRSQUNUXzE2QklUUyhkYXRhKTsKKyAgICByZXNwb25zZSA9IChkYXRhWzJdID4+IDcpOworICAgIG9wY29kZSA9IChkYXRhWzJdID4+IDMpICYgMHhGOworICAgIG5tX2ZsYWdzID0gKChkYXRhWzJdICYgMHg3KSA8PCA0KSArIChkYXRhWzNdID4+IDQpOworICAgIHJjb2RlID0gZGF0YVszXSAmIDB4RjsKKyAgICBxZGNvdW50ID0gRVhUUkFDVF8xNkJJVFMoZGF0YSArIDQpOworICAgIGFuY291bnQgPSBFWFRSQUNUXzE2QklUUyhkYXRhICsgNik7CisgICAgbnNjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKGRhdGEgKyA4KTsKKyAgICBhcmNvdW50ID0gRVhUUkFDVF8xNkJJVFMoZGF0YSArIDEwKTsKKyAgICBzdGFydGJ1ZiA9IGRhdGE7CisKKyAgICBpZiAobWF4YnVmIDw9IGRhdGEpCisJcmV0dXJuOworCisgICAgaWYgKHZmbGFnID4gMSkKKwlwcmludGYoIlxuPj4+ICIpOworCisgICAgcHJpbnRmKCJOQlQgVURQIFBBQ0tFVCgxMzcpOiAiKTsKKworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgY2FzZSAwOiBvcGNvZGVzdHIgPSAiUVVFUlkiOyBicmVhazsKKyAgICBjYXNlIDU6IG9wY29kZXN0ciA9ICJSRUdJU1RSQVRJT04iOyBicmVhazsKKyAgICBjYXNlIDY6IG9wY29kZXN0ciA9ICJSRUxFQVNFIjsgYnJlYWs7CisgICAgY2FzZSA3OiBvcGNvZGVzdHIgPSAiV0FDSyI7IGJyZWFrOworICAgIGNhc2UgODogb3Bjb2Rlc3RyID0gIlJFRlJFU0goOCkiOyBicmVhazsKKyAgICBjYXNlIDk6IG9wY29kZXN0ciA9ICJSRUZSRVNIIjsgYnJlYWs7CisgICAgY2FzZSAxNTogb3Bjb2Rlc3RyID0gIk1VTFRJSE9NRUQgUkVHSVNUUkFUSU9OIjsgYnJlYWs7CisgICAgZGVmYXVsdDogb3Bjb2Rlc3RyID0gIk9QVU5LTk9XTiI7IGJyZWFrOworICAgIH0KKyAgICBwcmludGYoIiVzIiwgb3Bjb2Rlc3RyKTsKKyAgICBpZiAocmVzcG9uc2UpIHsKKwlpZiAocmNvZGUpCisJICAgIHByaW50ZigiOyBORUdBVElWRSIpOworCWVsc2UKKwkgICAgcHJpbnRmKCI7IFBPU0lUSVZFIik7CisgICAgfQorCisgICAgaWYgKHJlc3BvbnNlKQorCXByaW50ZigiOyBSRVNQT05TRSIpOworICAgIGVsc2UKKwlwcmludGYoIjsgUkVRVUVTVCIpOworCisgICAgaWYgKG5tX2ZsYWdzICYgMSkKKwlwcmludGYoIjsgQlJPQURDQVNUIik7CisgICAgZWxzZQorCXByaW50ZigiOyBVTklDQVNUIik7CisKKyAgICBpZiAodmZsYWcgPCAyKQorCXJldHVybjsKKworICAgIHByaW50ZigiXG5Ucm5JRD0weCVYXG5PcENvZGU9JWRcbk5tRmxhZ3M9MHglWFxuUmNvZGU9JWRcblF1ZXJ5Q291bnQ9JWRcbkFuc3dlckNvdW50PSVkXG5BdXRob3JpdHlDb3VudD0lZFxuQWRkcmVzc1JlY0NvdW50PSVkXG4iLAorCW5hbWVfdHJuX2lkLCBvcGNvZGUsIG5tX2ZsYWdzLCByY29kZSwgcWRjb3VudCwgYW5jb3VudCwgbnNjb3VudCwKKwlhcmNvdW50KTsKKworICAgIHAgPSBkYXRhICsgMTI7CisKKyAgICB0b3RhbCA9IGFuY291bnQgKyBuc2NvdW50ICsgYXJjb3VudDsKKworICAgIGlmIChxZGNvdW50ID4gMTAwIHx8IHRvdGFsID4gMTAwKSB7CisJcHJpbnRmKCJDb3JydXB0IHBhY2tldD8/XG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHFkY291bnQpIHsKKwlwcmludGYoIlF1ZXN0aW9uUmVjb3JkczpcbiIpOworCWZvciAoaSA9IDA7IGkgPCBxZGNvdW50OyBpKyspIHsKKwkgICAgcCA9IHNtYl9mZGF0YShwLAorCQkifE5hbWU9W24xXVxuUXVlc3Rpb25UeXBlPVtyd11cblF1ZXN0aW9uQ2xhc3M9W3J3XVxuIyIsCisJCW1heGJ1ZiwgMCk7CisJICAgIGlmIChwID09IE5VTEwpCisJCWdvdG8gb3V0OworCX0KKyAgICB9CisKKyAgICBpZiAodG90YWwpIHsKKwlwcmludGYoIlxuUmVzb3VyY2VSZWNvcmRzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKKwkgICAgaW50IHJkbGVuOworCSAgICBpbnQgcmVzdHlwZTsKKworCSAgICBwID0gc21iX2ZkYXRhKHAsICJOYW1lPVtuMV1cbiMiLCBtYXhidWYsIDApOworCSAgICBpZiAocCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwkgICAgcmVzdHlwZSA9IEVYVFJBQ1RfMTZCSVRTKHApOworCSAgICBwID0gc21iX2ZkYXRhKHAsICJSZXNUeXBlPVtyd11cblJlc0NsYXNzPVtyd11cblRUTD1bckRdXG4iLCBwICsgOCwgMCk7CisJICAgIGlmIChwID09IE5VTEwpCisJCWdvdG8gb3V0OworCSAgICByZGxlbiA9IEVYVFJBQ1RfMTZCSVRTKHApOworCSAgICBwcmludGYoIlJlc291cmNlTGVuZ3RoPSVkXG5SZXNvdXJjZURhdGE9XG4iLCByZGxlbik7CisJICAgIHAgKz0gMjsKKwkgICAgaWYgKHJkbGVuID09IDYpIHsKKwkJcCA9IHNtYl9mZGF0YShwLCAiQWRkclR5cGU9W3J3XVxuQWRkcmVzcz1bYi5iLmIuYl1cbiIsIHAgKyByZGxlbiwgMCk7CisJCWlmIChwID09IE5VTEwpCisJCSAgICBnb3RvIG91dDsKKwkgICAgfSBlbHNlIHsKKwkJaWYgKHJlc3R5cGUgPT0gMHgyMSkgeworCQkgICAgaW50IG51bW5hbWVzOworCisJCSAgICBUQ0hFQ0soKnApOworCQkgICAgbnVtbmFtZXMgPSBwWzBdOworCQkgICAgcCA9IHNtYl9mZGF0YShwLCAiTnVtTmFtZXM9W0JdXG4iLCBwICsgMSwgMCk7CisJCSAgICBpZiAocCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCSAgICB3aGlsZSAobnVtbmFtZXMtLSkgeworCQkJcCA9IHNtYl9mZGF0YShwLCAiTmFtZT1bbjJdXHQjIiwgbWF4YnVmLCAwKTsKKwkJCWlmIChwID09IE5VTEwpCisJCQkgICAgZ290byBvdXQ7CisJCQlUQ0hFQ0soKnApOworCQkJaWYgKHBbMF0gJiAweDgwKQorCQkJICAgIHByaW50ZigiPEdST1VQPiAiKTsKKwkJCXN3aXRjaCAocFswXSAmIDB4NjApIHsKKwkJCWNhc2UgMHgwMDogcHJpbnRmKCJCICIpOyBicmVhazsKKwkJCWNhc2UgMHgyMDogcHJpbnRmKCJQICIpOyBicmVhazsKKwkJCWNhc2UgMHg0MDogcHJpbnRmKCJNICIpOyBicmVhazsKKwkJCWNhc2UgMHg2MDogcHJpbnRmKCJfICIpOyBicmVhazsKKwkJCX0KKwkJCWlmIChwWzBdICYgMHgxMCkKKwkJCSAgICBwcmludGYoIjxERVJFR0lTVEVSSU5HPiAiKTsKKwkJCWlmIChwWzBdICYgMHgwOCkKKwkJCSAgICBwcmludGYoIjxDT05GTElDVD4gIik7CisJCQlpZiAocFswXSAmIDB4MDQpCisJCQkgICAgcHJpbnRmKCI8QUNUSVZFPiAiKTsKKwkJCWlmIChwWzBdICYgMHgwMikKKwkJCSAgICBwcmludGYoIjxQRVJNQU5FTlQ+ICIpOworCQkJcHJpbnRmKCJcbiIpOworCQkJcCArPSAyOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgcHJpbnRfZGF0YShwLCBtaW4ocmRsZW4sIGxlbmd0aCAtIChwIC0gZGF0YSkpKTsKKwkJICAgIHAgKz0gcmRsZW47CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisKKyAgICBpZiAocCA8IG1heGJ1ZikKKwlzbWJfZmRhdGEocCwgIkFkZGl0aW9uYWxEYXRhOlxuIiwgbWF4YnVmLCAwKTsKKworb3V0OgorICAgIHByaW50ZigiXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm47Cit0cnVuYzoKKyAgICBwcmludGYoIlt8U01CXSIpOworICAgIHJldHVybjsKK30KKworCisKKy8qCisgKiBwcmludCBhIE5CVCBwYWNrZXQgcmVjZWl2ZWQgYWNyb3NzIHVkcCBvbiBwb3J0IDEzOAorICovCit2b2lkCituYnRfdWRwMTM4X3ByaW50KGNvbnN0IHVfY2hhciAqZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICBjb25zdCB1X2NoYXIgKm1heGJ1ZiA9IGRhdGEgKyBsZW5ndGg7CisKKyAgICBpZiAobWF4YnVmID4gc25hcGVuZCkKKwltYXhidWYgPSBzbmFwZW5kOworICAgIGlmIChtYXhidWYgPD0gZGF0YSkKKwlyZXR1cm47CisgICAgc3RhcnRidWYgPSBkYXRhOworCisgICAgaWYgKHZmbGFnIDwgMikgeworCXByaW50ZigiTkJUIFVEUCBQQUNLRVQoMTM4KSIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsCisJIlxuPj4+IE5CVCBVRFAgUEFDS0VUKDEzOCkgUmVzPVtyd10gSUQ9W3J3XSBJUD1bYi5iLmIuYl0gUG9ydD1bcmRdIExlbmd0aD1bcmRdIFJlczI9W3J3XVxuU291cmNlTmFtZT1bbjFdXG5EZXN0TmFtZT1bbjFdXG4jIiwKKwltYXhidWYsIDApOworCisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworCS8qIElmIHRoZXJlIGlzbid0IGVub3VnaCBkYXRhIGZvciAiXDM3N1NNQiIsIGRvbid0IGNoZWNrIGZvciBpdC4gKi8KKwlpZiAoJmRhdGFbM10gPj0gbWF4YnVmKQorCSAgICBnb3RvIG91dDsKKworCWlmIChtZW1jbXAoZGF0YSwgIlwzNzdTTUIiLDQpID09IDApCisJICAgIHByaW50X3NtYihkYXRhLCBtYXhidWYpOworICAgIH0KK291dDoKKyAgICBwcmludGYoIlxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKKworLyoKKyAgIHByaW50IG5ldGJldWkgZnJhbWVzCisqLworc3RydWN0IG5iZl9zdHJpbmdzIHsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKm5vbnZlcmJvc2U7CisJY29uc3QgY2hhcgkqdmVyYm9zZTsKK30gbmJmX3N0cmluZ3NbMHgyMF0gPSB7CisJeyAiQWRkIEdyb3VwIE5hbWUgUXVlcnkiLCAiLCBbUDIzXU5hbWUgdG8gYWRkPVtuMl0jIiwKKwkgICJbUDVdUmVzcG9uc2VDb3JyZWxhdG9yPVt3XVxuW1AxNl1OYW1lIHRvIGFkZD1bbjJdXG4iIH0sCisJeyAiQWRkIE5hbWUgUXVlcnkiLCAiLCBbUDIzXU5hbWUgdG8gYWRkPVtuMl0jIiwKKwkgICJbUDVdUmVzcG9uc2VDb3JyZWxhdG9yPVt3XVxuW1AxNl1OYW1lIHRvIGFkZD1bbjJdXG4iIH0sCisJeyAiTmFtZSBJbiBDb25mbGljdCIsIE5VTEwsIE5VTEwgfSwKKwl7ICJTdGF0dXMgUXVlcnkiLCBOVUxMLCBOVUxMIH0sCisJeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCisJeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCisJeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCisJeyAiVGVybWluYXRlIFRyYWNlIiwgTlVMTCwgTlVMTCB9LAorCXsgIkRhdGFncmFtIiwgTlVMTCwKKwkgICJbUDddRGVzdGluYXRpb249W24yXVxuU291cmNlPVtuMl1cbiIgfSwKKwl7ICJCcm9hZGNhc3QgRGF0YWdyYW0iLCBOVUxMLAorCSAgIltQN11EZXN0aW5hdGlvbj1bbjJdXG5Tb3VyY2U9W24yXVxuIiB9LAorCXsgIk5hbWUgUXVlcnkiLCAiLCBbUDddTmFtZT1bbjJdIyIsCisJICAiW1AxXVNlc3Npb25OdW1iZXI9W0JdXG5OYW1lVHlwZT1bQl1bUDJdXG5SZXNwb25zZUNvcnJlbGF0b3I9W3ddXG5OYW1lPVtuMl1cbk5hbWUgb2Ygc2VuZGVyPVtuMl1cbiIgfSwKKwl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KKwl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KKwl7ICJBZGQgTmFtZSBSZXNwb25zZSIsICIsIFtQMV1Hcm91cE5hbWU9W3ddIFtQNF1EZXN0aW5hdGlvbj1bbjJdIFNvdXJjZT1bbjJdIyIsCisJICAiQWRkTmFtZUluUHJvY2Vzcz1bQl1cbkdyb3VwTmFtZT1bd11cblRyYW5zbWl0Q29ycmVsYXRvcj1bd11bUDJdXG5EZXN0aW5hdGlvbj1bbjJdXG5Tb3VyY2U9W24yXVxuIiB9LAorCXsgIk5hbWUgUmVjb2duaXplZCIsIE5VTEwsCisJICAiW1AxXURhdGEyPVt3XVxuVHJhbnNtaXRDb3JyZWxhdG9yPVt3XVxuUmVzcG9uc2VDb3JlbGF0b3I9W3ddXG5EZXN0aW5hdGlvbj1bbjJdXG5Tb3VyY2U9W24yXVxuIiB9LAorCXsgIlN0YXR1cyBSZXNwb25zZSIsIE5VTEwsIE5VTEwgfSwKKwl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KKwl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KKwl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KKwl7ICJUZXJtaW5hdGUgVHJhY2UiLCBOVUxMLCBOVUxMIH0sCisJeyAiRGF0YSBBY2siLCBOVUxMLAorCSAgIltQM11UcmFuc21pdENvcnJlbGF0b3I9W3ddW1AyXVxuUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKKwl7ICJEYXRhIEZpcnN0L01pZGRsZSIsIE5VTEwsCisJICAiRmxhZ3M9W3tSRUNFSVZFX0NPTlRJTlVFfE5PX0FDS3x8UElHR1lCQUNLX0FDS19JTkNMVURFRHx9XVxuUmVzeW5jSW5kaWNhdG9yPVt3XVtQMl1cblJlc3BvbnNlQ29yZWxhdG9yPVt3XVxuUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKKwl7ICJEYXRhIE9ubHkvTGFzdCIsIE5VTEwsCisJICAiRmxhZ3M9W3t8Tk9fQUNLfFBJR0dZQkFDS19BQ0tfQUxMT1dFRHxQSUdHWUJBQ0tfQUNLX0lOQ0xVREVEfH1dXG5SZXN5bmNJbmRpY2F0b3I9W3ddW1AyXVxuUmVzcG9uc2VDb3JlbGF0b3I9W3ddXG5SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAorCXsgIlNlc3Npb24gQ29uZmlybSIsIE5VTEwsCisJICAiRGF0YTE9W0JdXG5EYXRhMj1bd11cblRyYW5zbWl0Q29ycmVsYXRvcj1bd11cblJlc3BvbnNlQ29yZWxhdG9yPVt3XVxuUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKKwl7ICJTZXNzaW9uIEVuZCIsIE5VTEwsCisJICAiW1AxXURhdGEyPVt3XVtQNF1cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCisJeyAiU2Vzc2lvbiBJbml0aWFsaXplIiwgTlVMTCwKKwkgICJEYXRhMT1bQl1cbkRhdGEyPVt3XVxuVHJhbnNtaXRDb3JyZWxhdG9yPVt3XVxuUmVzcG9uc2VDb3JlbGF0b3I9W3ddXG5SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAorCXsgIk5vIFJlY2VpdmUiLCBOVUxMLAorCSAgIkZsYWdzPVt7fFNFTkRfTk9fQUNLfV1cbkRhdGFCeXRlc0FjY2VwdGVkPVtiXVtQNF1cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCisJeyAiUmVjZWl2ZSBPdXRzdGFuZGluZyIsIE5VTEwsCisJICAiW1AxXURhdGFCeXRlc0FjY2VwdGVkPVtiXVtQNF1cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCisJeyAiUmVjZWl2ZSBDb250aW51ZSIsIE5VTEwsCisJICAiW1AyXVRyYW5zbWl0Q29ycmVsYXRvcj1bd11cbltQMl1SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAorCXsgTlVMTCwgTlVMTCwgTlVMTCB9LAkvKiBub3QgdXNlZCAqLworCXsgTlVMTCwgTlVMTCwgTlVMTCB9LAkvKiBub3QgdXNlZCAqLworCXsgIlNlc3Npb24gQWxpdmUiLCBOVUxMLCBOVUxMIH0KK307CisKK3ZvaWQKK25ldGJldWlfcHJpbnQodV9zaG9ydCBjb250cm9sLCBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgpCit7CisgICAgY29uc3QgdV9jaGFyICptYXhidWYgPSBkYXRhICsgbGVuZ3RoOworICAgIGludCBsZW47CisgICAgaW50IGNvbW1hbmQ7CisgICAgY29uc3QgdV9jaGFyICpkYXRhMjsKKyAgICBpbnQgaXNfdHJ1bmNhdGVkID0gMDsKKworICAgIGlmIChtYXhidWYgPiBzbmFwZW5kKQorCW1heGJ1ZiA9IHNuYXBlbmQ7CisgICAgVENIRUNLKGRhdGFbNF0pOworICAgIGxlbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpOworICAgIGNvbW1hbmQgPSBkYXRhWzRdOworICAgIGRhdGEyID0gZGF0YSArIGxlbjsKKyAgICBpZiAoZGF0YTIgPj0gbWF4YnVmKSB7CisJZGF0YTIgPSBtYXhidWY7CisJaXNfdHJ1bmNhdGVkID0gMTsKKyAgICB9CisKKyAgICBzdGFydGJ1ZiA9IGRhdGE7CisKKyAgICBpZiAodmZsYWcgPCAyKSB7CisJcHJpbnRmKCJOQkYgUGFja2V0OiAiKTsKKwlkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJbUDVdIyIsIG1heGJ1ZiwgMCk7CisgICAgfSBlbHNlIHsKKwlwcmludGYoIlxuPj4+IE5CRiBQYWNrZXRcblR5cGU9MHglWCAiLCBjb250cm9sKTsKKwlkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJMZW5ndGg9W2RdIFNpZ25hdHVyZT1bd10gQ29tbWFuZD1bQl1cbiMiLCBtYXhidWYsIDApOworICAgIH0KKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorCWdvdG8gb3V0OworCisgICAgaWYgKGNvbW1hbmQgPiAweDFmIHx8IG5iZl9zdHJpbmdzW2NvbW1hbmRdLm5hbWUgPT0gTlVMTCkgeworCWlmICh2ZmxhZyA8IDIpCisJICAgIGRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIlVua25vd24gTkJGIENvbW1hbmQjIiwgZGF0YTIsIDApOworCWVsc2UKKwkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiVW5rbm93biBOQkYgQ29tbWFuZFxuIiwgZGF0YTIsIDApOworICAgIH0gZWxzZSB7CisJaWYgKHZmbGFnIDwgMikgeworCSAgICBwcmludGYoIiVzIiwgbmJmX3N0cmluZ3NbY29tbWFuZF0ubmFtZSk7CisJICAgIGlmIChuYmZfc3RyaW5nc1tjb21tYW5kXS5ub252ZXJib3NlICE9IE5VTEwpCisJCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgbmJmX3N0cmluZ3NbY29tbWFuZF0ubm9udmVyYm9zZSwgZGF0YTIsIDApOworCX0gZWxzZSB7CisJICAgIHByaW50ZigiJXM6XG4iLCBuYmZfc3RyaW5nc1tjb21tYW5kXS5uYW1lKTsKKwkgICAgaWYgKG5iZl9zdHJpbmdzW2NvbW1hbmRdLnZlcmJvc2UgIT0gTlVMTCkKKwkJZGF0YSA9IHNtYl9mZGF0YShkYXRhLCBuYmZfc3RyaW5nc1tjb21tYW5kXS52ZXJib3NlLCBkYXRhMiwgMCk7CisJICAgIGVsc2UKKwkJcHJpbnRmKCJcbiIpOworCX0KKyAgICB9CisKKyAgICBpZiAodmZsYWcgPCAyKQorCXJldHVybjsKKworICAgIGlmIChkYXRhID09IE5VTEwpCisJZ290byBvdXQ7CisKKyAgICBpZiAoaXNfdHJ1bmNhdGVkKSB7CisJLyogZGF0YTIgd2FzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJZ290byBvdXQ7CisgICAgfQorCisgICAgLyogSWYgdGhpcyBpc24ndCBhIGNvbW1hbmQgdGhhdCB3b3VsZCBjb250YWluIGFuIFNNQiBtZXNzYWdlLCBxdWl0LiAqLworICAgIGlmIChjb21tYW5kICE9IDB4MDggJiYgY29tbWFuZCAhPSAweDA5ICYmIGNvbW1hbmQgIT0gMHgxNSAmJgorICAgICAgICBjb21tYW5kICE9IDB4MTYpCisJZ290byBvdXQ7CisKKyAgICAvKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBmb3IgIlwzNzdTTUIiLCBkb24ndCBsb29rIGZvciBpdC4gKi8KKyAgICBpZiAoJmRhdGEyWzNdID49IG1heGJ1ZikKKwlnb3RvIG91dDsKKworICAgIGlmIChtZW1jbXAoZGF0YTIsICJcMzc3U01CIiw0KSA9PSAwKQorCXByaW50X3NtYihkYXRhMiwgbWF4YnVmKTsKKyAgICBlbHNlIHsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkgICAgaWYgKCZkYXRhMltpICsgM10gPj0gbWF4YnVmKQorCQlicmVhazsKKwkgICAgaWYgKG1lbWNtcCgmZGF0YTJbaV0sICJcMzc3U01CIiwgNCkgPT0gMCkgeworCQlwcmludGYoImZvdW5kIFNNQiBwYWNrZXQgYXQgJWRcbiIsIGkpOworCQlwcmludF9zbWIoJmRhdGEyW2ldLCBtYXhidWYpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKK291dDoKKyAgICBwcmludGYoIlxuIik7CisgICAgcmV0dXJuOwordHJ1bmM6CisgICAgcHJpbnRmKCJbfFNNQl0iKTsKKyAgICByZXR1cm47Cit9CisKKworLyoKKyAqIHByaW50IElQWC1OZXRiaW9zIGZyYW1lcworICovCit2b2lkCitpcHhfbmV0Ymlvc19wcmludChjb25zdCB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCkKK3sKKyAgICAvKgorICAgICAqIHRoaXMgaXMgYSBoYWNrIHRpbGwgSSB3b3JrIG91dCBob3cgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogTmV0QklPUy1vdmVyLUlQWCBzdHVmZgorICAgICAqLworICAgIGludCBpOworICAgIGNvbnN0IHVfY2hhciAqbWF4YnVmOworCisgICAgbWF4YnVmID0gZGF0YSArIGxlbmd0aDsKKyAgICAvKiBEb24ndCBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGNhcHR1cmVkIGRhdGEgaW4gdGhlIHBhY2tldC4gKi8KKyAgICBpZiAobWF4YnVmID4gc25hcGVuZCkKKwltYXhidWYgPSBzbmFwZW5kOworICAgIHN0YXJ0YnVmID0gZGF0YTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwlpZiAoJmRhdGFbaSArIDRdID4gbWF4YnVmKQorCSAgICBicmVhazsKKwlpZiAobWVtY21wKCZkYXRhW2ldLCAiXDM3N1NNQiIsIDQpID09IDApIHsKKwkgICAgc21iX2ZkYXRhKGRhdGEsICJcbj4+PiBJUFggdHJhbnNwb3J0ICIsICZkYXRhW2ldLCAwKTsKKwkgICAgaWYgKGRhdGEgIT0gTlVMTCkKKwkJcHJpbnRfc21iKCZkYXRhW2ldLCBtYXhidWYpOworCSAgICBwcmludGYoIlxuIik7CisJICAgIGZmbHVzaChzdGRvdXQpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChpID09IDEyOCkKKwlzbWJfZmRhdGEoZGF0YSwgIlxuPj4+IFVua25vd24gSVBYICIsIG1heGJ1ZiwgMCk7Cit9CmRpZmYgLS1naXQgYS9wcmludC1zbm1wLmMgYi9wcmludC1zbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NmI2MgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXNubXAuYwpAQCAtMCwwICsxLDE5MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqICAgICBKb2huIFJvYmVydCBMb1ZlcnNvLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGluZmx1ZW5jZWQgYnkgdGhlIENNVSBTTk1QIHJlbGVhc2UsCisgKiBieSBTdGV2ZSBXYWxkYnVzc2VyLiAgSG93ZXZlciwgdGhpcyBzaGFyZXMgbm8gY29kZSB3aXRoIHRoYXQgc3lzdGVtLgorICogQWRkaXRpb25hbCBBU04uMSBpbnNpZ2h0IGdhaW5lZCBmcm9tIE1hcnNoYWxsIFQuIFJvc2UncyBfVGhlX09wZW5fQm9va18uCisgKiBFYXJsaWVyIGZvcm1zIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gd2VyZSBkZXJpdmVkIGFuZC9vciBpbnNwaXJlZCBieSBhbgorICogYXdrIHNjcmlwdCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQy4gUGhpbGlwIFdvb2Qgb2YgTEFOTCAoYnV0IGxhdGVyCisgKiBoZWF2aWx5IG1vZGlmaWVkIGJ5IEpvaG4gUm9iZXJ0IExvVmVyc28pLiAgVGhlIGNvcHlyaWdodCBub3RpY2UgZm9yCisgKiB0aGF0IHdvcmsgaXMgcHJlc2VydmVkIGJlbG93LCBldmVuIHRob3VnaCBpdCBtYXkgbm90IHJpZ2h0bHkgYXBwbHkKKyAqIHRvIHRoaXMgZmlsZS4KKyAqCisgKiBTdXBwb3J0IGZvciBTTk1QdjJjL1NOTVB2MyBhbmQgdGhlIGFiaWxpdHkgdG8gbGluayB0aGUgbW9kdWxlIGFnYWluc3QKKyAqIHRoZSBsaWJzbWkgd2FzIGFkZGVkIGJ5IEouIFNjaG9lbndhZWxkZXIsIENvcHlyaWdodCAoYykgMTk5OS4KKyAqCisgKiBUaGlzIHN0YXJ0ZWQgb3V0IGFzIGEgdmVyeSBzaW1wbGUgcHJvZ3JhbSwgYnV0IHRoZSBpbmNyZW1lbnRhbCBkZWNvZGluZworICogKGludG8gdGhlIEJFIHN0cnVjdHVyZSkgY29tcGxpY2F0ZWQgdGhpbmdzLgorICoKKyAjCQkJTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5CisgIworICMJQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgIwlUaGlzIHNvZnR3YXJlIHdhcyBwcm9kdWNlZCB1bmRlciBhIFUuUy4gR292ZXJubWVudCBjb250cmFjdAorICMJKFctNzQwNS1FTkctMzYpIGJ5IExvcyBBbGFtb3MgTmF0aW9uYWwgTGFib3JhdG9yeSwgd2hpY2ggaXMKKyAjCW9wZXJhdGVkIGJ5IHRoZQlVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgZm9yIHRoZSBVLlMuIERlcGFydG1lbnQKKyAjCW9mIEVuZXJneS4gIFRoZSBVLlMuIEdvdmVybm1lbnQgaXMgbGljZW5zZWQgdG8gdXNlLCByZXByb2R1Y2UsCisgIwlhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLiAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHRoZQorICMJcHVibGljIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgY2hhcmdlLCBwcm92aWRlZAorICMJdGhhdCB0aGlzIE5vdGljZSBhbmQgYW55IHN0YXRlbWVudCBvZiBhdXRob3JzaGlwIGFyZSByZXByb2R1Y2VkCisgIwlvbiBhbGwgY29waWVzLiAgTmVpdGhlciB0aGUgR292ZXJubWVudCBub3IgdGhlIFVuaXZlcnNpdHkgbWFrZXMKKyAjCWFueSB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLCBvciBhc3N1bWVzIGFueSBsaWFiaWxpdHkgb3IKKyAjCXJlc3BvbnNpYmlsaXR5IGZvciB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisgIwlAKCMpc25tcC5hd2sueAkxLjEgKExBTkwpIDEvMTUvOTAKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbm1wLmMsdiAxLjYyLjIuMiAyMDA1LzA1LzA2IDA3OjU3OjE5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1NNSV9ICisjaW5jbHVkZSA8c21pLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworI3VuZGVmIE9QQVFVRSAgLyogZGVmaW5lZCBpbiA8d2luZ2RpLmg+ICovCisKKy8qCisgKiBVbml2ZXJzYWwgQVNOLjEgdHlwZXMKKyAqICh3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHRhZyB2YWx1ZXMgZm9yIHRob3NlIGFsbG93ZWQgaW4gdGhlIEludGVybmV0IFNNSSkKKyAqLworY29uc3QgY2hhciAqVW5pdmVyc2FsW10gPSB7CisJIlUtMCIsCisJIkJvb2xlYW4iLAorCSJJbnRlZ2VyIiwKKyNkZWZpbmUgSU5URUdFUiAyCisJIkJpdHN0cmluZyIsCisJIlN0cmluZyIsCisjZGVmaW5lIFNUUklORyA0CisJIk51bGwiLAorI2RlZmluZSBBU05fTlVMTCA1CisJIk9iaklEIiwKKyNkZWZpbmUgT0JKRUNUSUQgNgorCSJPYmplY3REZXMiLAorCSJVLTgiLCJVLTkiLCJVLTEwIiwiVS0xMSIsCS8qIDgtMTEgKi8KKwkiVS0xMiIsIlUtMTMiLCJVLTE0IiwiVS0xNSIsCS8qIDEyLTE1ICovCisJIlNlcXVlbmNlIiwKKyNkZWZpbmUgU0VRVUVOQ0UgMTYKKwkiU2V0IgorfTsKKworLyoKKyAqIEFwcGxpY2F0aW9uLXdpZGUgQVNOLjEgdHlwZXMgZnJvbSB0aGUgSW50ZXJuZXQgU01JIGFuZCB0aGVpciB0YWdzCisgKi8KK2NvbnN0IGNoYXIgKkFwcGxpY2F0aW9uW10gPSB7CisJIklwQWRkcmVzcyIsCisjZGVmaW5lIElQQUREUiAwCisJIkNvdW50ZXIiLAorI2RlZmluZSBDT1VOVEVSIDEKKwkiR2F1Z2UiLAorI2RlZmluZSBHQVVHRSAyCisJIlRpbWVUaWNrcyIsCisjZGVmaW5lIFRJTUVUSUNLUyAzCisJIk9wYXF1ZSIsCisjZGVmaW5lIE9QQVFVRSA0CisJIkMtNSIsCisJIkNvdW50ZXI2NCIKKyNkZWZpbmUgQ09VTlRFUjY0IDYKK307CisKKy8qCisgKiBDb250ZXh0LXNwZWNpZmljIEFTTi4xIHR5cGVzIGZvciB0aGUgU05NUCBQRFVzIGFuZCB0aGVpciB0YWdzCisgKi8KK2NvbnN0IGNoYXIgKkNvbnRleHRbXSA9IHsKKwkiR2V0UmVxdWVzdCIsCisjZGVmaW5lIEdFVFJFUSAwCisJIkdldE5leHRSZXF1ZXN0IiwKKyNkZWZpbmUgR0VUTkVYVFJFUSAxCisJIkdldFJlc3BvbnNlIiwKKyNkZWZpbmUgR0VUUkVTUCAyCisJIlNldFJlcXVlc3QiLAorI2RlZmluZSBTRVRSRVEgMworCSJUcmFwIiwKKyNkZWZpbmUgVFJBUCA0CisJIkdldEJ1bGsiLAorI2RlZmluZSBHRVRCVUxLUkVRIDUKKwkiSW5mb3JtIiwKKyNkZWZpbmUgSU5GT1JNUkVRIDYKKwkiVjJUcmFwIiwKKyNkZWZpbmUgVjJUUkFQIDcKKwkiUmVwb3J0IgorI2RlZmluZSBSRVBPUlQgOAorfTsKKworI2RlZmluZSBOT1RJRllfQ0xBU1MoeCkJICAgICh4ID09IFRSQVAgfHwgeCA9PSBWMlRSQVAgfHwgeCA9PSBJTkZPUk1SRVEpCisjZGVmaW5lIFJFQURfQ0xBU1MoeCkgICAgICAgKHggPT0gR0VUUkVRIHx8IHggPT0gR0VUTkVYVFJFUSB8fCB4ID09IEdFVEJVTEtSRVEpCisjZGVmaW5lIFdSSVRFX0NMQVNTKHgpCSAgICAoeCA9PSBTRVRSRVEpCisjZGVmaW5lIFJFU1BPTlNFX0NMQVNTKHgpICAgKHggPT0gR0VUUkVTUCkKKyNkZWZpbmUgSU5URVJOQUxfQ0xBU1MoeCkgICAoeCA9PSBSRVBPUlQpCisKKy8qCisgKiBDb250ZXh0LXNwZWNpZmljIEFTTi4xIHR5cGVzIGZvciB0aGUgU05NUCBFeGNlcHRpb25zIGFuZCB0aGVpciB0YWdzCisgKi8KK2NvbnN0IGNoYXIgKkV4Y2VwdGlvbnNbXSA9IHsKKwkibm9TdWNoT2JqZWN0IiwKKyNkZWZpbmUgTk9TVUNIT0JKRUNUIDAKKwkibm9TdWNoSW5zdGFuY2UiLAorI2RlZmluZSBOT1NVQ0hJTlNUQU5DRSAxCisJImVuZE9mTWliVmlldyIsCisjZGVmaW5lIEVORE9GTUlCVklFVyAyCit9OworCisvKgorICogUHJpdmF0ZSBBU04uMSB0eXBlcworICogVGhlIEludGVybmV0IFNNSSBkb2VzIG5vdCBzcGVjaWZ5IGFueQorICovCitjb25zdCBjaGFyICpQcml2YXRlW10gPSB7CisJIlAtMCIKK307CisKKy8qCisgKiBlcnJvci1zdGF0dXMgdmFsdWVzIGZvciBhbnkgU05NUCBQRFUKKyAqLworY29uc3QgY2hhciAqRXJyb3JTdGF0dXNbXSA9IHsKKwkibm9FcnJvciIsCisJInRvb0JpZyIsCisJIm5vU3VjaE5hbWUiLAorCSJiYWRWYWx1ZSIsCisJInJlYWRPbmx5IiwKKwkiZ2VuRXJyIiwKKwkibm9BY2Nlc3MiLAorCSJ3cm9uZ1R5cGUiLAorCSJ3cm9uZ0xlbmd0aCIsCisJIndyb25nRW5jb2RpbmciLAorCSJ3cm9uZ1ZhbHVlIiwKKwkibm9DcmVhdGlvbiIsCisJImluY29uc2lzdGVudFZhbHVlIiwKKwkicmVzb3VyY2VVbmF2YWlsYWJsZSIsCisJImNvbW1pdEZhaWxlZCIsCisJInVuZG9GYWlsZWQiLAorCSJhdXRob3JpemF0aW9uRXJyb3IiLAorCSJub3RXcml0YWJsZSIsCisJImluY29uc2lzdGVudE5hbWUiCit9OworI2RlZmluZSBERUNPREVfRXJyb3JTdGF0dXMoZSkgXAorCSggZSA+PSAwICYmIChzaXplX3QpZSA8IHNpemVvZihFcnJvclN0YXR1cykvc2l6ZW9mKEVycm9yU3RhdHVzWzBdKSBcCisJCT8gRXJyb3JTdGF0dXNbZV0gXAorCQk6IChzbnByaW50ZihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiZXJyPSV1IiwgZSksIGVycmJ1ZikpCisKKy8qCisgKiBnZW5lcmljLXRyYXAgdmFsdWVzIGluIHRoZSBTTk1QIFRyYXAtUERVCisgKi8KK2NvbnN0IGNoYXIgKkdlbmVyaWNUcmFwW10gPSB7CisJImNvbGRTdGFydCIsCisJIndhcm1TdGFydCIsCisJImxpbmtEb3duIiwKKwkibGlua1VwIiwKKwkiYXV0aGVudGljYXRpb25GYWlsdXJlIiwKKwkiZWdwTmVpZ2hib3JMb3NzIiwKKwkiZW50ZXJwcmlzZVNwZWNpZmljIgorI2RlZmluZSBHVF9FTlRFUlBSSVNFIDYKK307CisjZGVmaW5lIERFQ09ERV9HZW5lcmljVHJhcCh0KSBcCisJKCB0ID49IDAgJiYgKHNpemVfdCl0IDwgc2l6ZW9mKEdlbmVyaWNUcmFwKS9zaXplb2YoR2VuZXJpY1RyYXBbMF0pIFwKKwkJPyBHZW5lcmljVHJhcFt0XSBcCisJCTogKHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJndD0lZCIsIHQpLCBidWYpKQorCisvKgorICogQVNOLjEgdHlwZSBjbGFzcyB0YWJsZQorICogVGllcyB0b2dldGhlciB0aGUgcHJlY2VkaW5nIFVuaXZlcnNhbCwgQXBwbGljYXRpb24sIENvbnRleHQsIGFuZCBQcml2YXRlCisgKiB0eXBlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIGRlZmluZUNMQVNTKHgpIHsgIngiLCB4LCBzaXplb2YoeCkvc2l6ZW9mKHhbMF0pIH0gLyogbm90IEFOU0ktQyAqLworc3RydWN0IHsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IGNoYXIJKipJZDsKKwkgICAgaW50CW51bUlEczsKKyAgICB9IENsYXNzW10gPSB7CisJZGVmaW5lQ0xBU1MoVW5pdmVyc2FsKSwKKyNkZWZpbmUJVU5JVkVSU0FMCTAKKwlkZWZpbmVDTEFTUyhBcHBsaWNhdGlvbiksCisjZGVmaW5lCUFQUExJQ0FUSU9OCTEKKwlkZWZpbmVDTEFTUyhDb250ZXh0KSwKKyNkZWZpbmUJQ09OVEVYVAkJMgorCWRlZmluZUNMQVNTKFByaXZhdGUpLAorI2RlZmluZQlQUklWQVRFCQkzCisJZGVmaW5lQ0xBU1MoRXhjZXB0aW9ucyksCisjZGVmaW5lIEVYQ0VQVElPTlMJNAorfTsKKworLyoKKyAqIGRlZmluZWQgZm9ybXMgZm9yIEFTTi4xIHR5cGVzCisgKi8KK2NvbnN0IGNoYXIgKkZvcm1bXSA9IHsKKwkiUHJpbWl0aXZlIiwKKyNkZWZpbmUgUFJJTUlUSVZFCTAKKwkiQ29uc3RydWN0ZWQiLAorI2RlZmluZSBDT05TVFJVQ1RFRAkxCit9OworCisvKgorICogQSBzdHJ1Y3R1cmUgZm9yIHRoZSBPSUQgdHJlZSBmb3IgdGhlIGNvbXBpbGVkLWluIE1JQi4KKyAqIFRoaXMgaXMgc3RvcmVkIGFzIGEgZ2VuZXJhbC1vcmRlciB0cmVlLgorICovCitzdHJ1Y3Qgb2JqIHsKKwljb25zdCBjaGFyCSpkZXNjOwkJLyogbmFtZSBvZiBvYmplY3QgKi8KKwl1X2NoYXIJb2lkOwkJCS8qIHN1Yi1pZCBmb2xsb3dpbmcgcGFyZW50ICovCisJdV9jaGFyCXR5cGU7CQkJLyogb2JqZWN0IHR5cGUgKHVudXNlZCkgKi8KKwlzdHJ1Y3Qgb2JqICpjaGlsZCwgKm5leHQ7CS8qIGNoaWxkIGFuZCBuZXh0IHNpYmxpbmcgcG9pbnRlcnMgKi8KK30gKm9ianAgPSBOVUxMOworCisvKgorICogSW5jbHVkZSB0aGUgY29tcGlsZWQgaW4gU05NUCBNSUIuICAibWliLmgiIGlzIHByb2R1Y2VkIGJ5IGZlZWRpbmcKKyAqIFJGQy0xMTU2IGZvcm1hdCBmaWxlcyBpbnRvICJtYWtlbWliIi4gICJtaWIuaCIgTVVTVCBkZWZpbmUgYXQgbGVhc3QKKyAqIGEgdmFsdWUgZm9yIGBtaWJyb290Jy4KKyAqCisgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIGdyb3NzLCBhcyB0aGlzIGlzIGluY2x1ZGluZyBpbml0aWFsaXplZCBzdHJ1Y3R1cmVzLAorICogYW5kIGJ5IHJpZ2h0IHNob3VsZG4ndCBiZSBhbiAiaW5jbHVkZSIgZmlsZS4KKyAqLworI2luY2x1ZGUgIm1pYi5oIgorCisvKgorICogVGhpcyBkZWZpbmVzIGEgbGlzdCBvZiBPSURzIHdoaWNoIHdpbGwgYmUgYWJicmV2aWF0ZWQgb24gb3V0cHV0LgorICogQ3VycmVudGx5LCB0aGlzIGluY2x1ZGVzIHRoZSBwcmVmaXhlcyBmb3IgdGhlIEludGVybmV0IE1JQiwgdGhlCisgKiBwcml2YXRlIGVudGVycHJpc2VzIHRyZWUsIGFuZCB0aGUgZXhwZXJpbWVudGFsIHRyZWUuCisgKi8KK3N0cnVjdCBvYmpfYWJyZXYgeworCWNvbnN0IGNoYXIgKnByZWZpeDsJCS8qIHByZWZpeCBmb3IgdGhpcyBhYnJldiAqLworCXN0cnVjdCBvYmogKm5vZGU7CQkvKiBwb2ludGVyIGludG8gb2JqZWN0IHRhYmxlICovCisJY29uc3QgY2hhciAqb2lkOwkJLyogQVNOLjEgZW5jb2RlZCBPSUQgKi8KK30gb2JqX2FicmV2X2xpc3RbXSA9IHsKKyNpZm5kZWYgTk9fQUJSRVZfTUlCCisJLyogLmlzby5vcmcuZG9kLmludGVybmV0Lm1nbXQubWliICovCisJeyAiIiwJJl9taWJfb2JqLAkJIlw1M1w2XDFcMlwxIiB9LAorI2VuZGlmCisjaWZuZGVmIE5PX0FCUkVWX0VOVEVSCisJLyogLmlzby5vcmcuZG9kLmludGVybmV0LnByaXZhdGUuZW50ZXJwcmlzZXMgKi8KKwl7ICJFOiIsCSZfZW50ZXJwcmlzZXNfb2JqLAkiXDUzXDZcMVw0XDEiIH0sCisjZW5kaWYKKyNpZm5kZWYgTk9fQUJSRVZfRVhQRVJJCisJLyogLmlzby5vcmcuZG9kLmludGVybmV0LmV4cGVyaW1lbnRhbCAqLworCXsgIlg6IiwJJl9leHBlcmltZW50YWxfb2JqLAkiXDUzXDZcMVwzIiB9LAorI2VuZGlmCisjaWZuZGVmIE5PX0FCQlJFVl9TTk1QTU9EUworCS8qIC5pc28ub3JnLmRvZC5pbnRlcm5ldC5zbm1wVjIuc25tcE1vZHVsZXMgKi8KKyAgICAgICAgeyAiUzoiLCAmX3NubXBNb2R1bGVzX29iaiwgICAgICAiXDUzXDZcMVw2XDMiIH0sCisjZW5kaWYKKwl7IDAsMCwwIH0KK307CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgaW4gdGhlIE9JRCBwcmludCByb3V0aW5lIHRvIHdhbGsgZG93biB0aGUgb2JqZWN0IHRyZWUKKyAqIHJvb3RlZCBhdCBgbWlicm9vdCcuCisgKi8KKyNkZWZpbmUgT0JKX1BSSU5UKG8sIHN1cHByZXNzZG90KSBcCit7IFwKKwlpZiAob2JqcCkgeyBcCisJCWRvIHsgXAorCQkJaWYgKChvKSA9PSBvYmpwLT5vaWQpIFwKKwkJCQlicmVhazsgXAorCQl9IHdoaWxlICgob2JqcCA9IG9ianAtPm5leHQpICE9IE5VTEwpOyBcCisJfSBcCisJaWYgKG9ianApIHsgXAorCQlwcmludGYoc3VwcHJlc3Nkb3Q/IiVzIjoiLiVzIiwgb2JqcC0+ZGVzYyk7IFwKKwkJb2JqcCA9IG9ianAtPmNoaWxkOyBcCisJfSBlbHNlIFwKKwkJcHJpbnRmKHN1cHByZXNzZG90PyIldSI6Ii4ldSIsIChvKSk7IFwKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBBbnktRGF0YS1UeXBlIHN0b3JhZ2UgdXNlZCBwdXJlbHkgZm9yCisgKiB0ZW1wb3JhcnkgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gd2hpbGUgZGVjb2RpbmcgYW4gQVNOLjEgZGF0YSBzdHJlYW0uCisgKi8KK3N0cnVjdCBiZSB7CisJdV9pbnQzMl90IGFzbmxlbjsKKwl1bmlvbiB7CisJCWNhZGRyX3QgcmF3OworCQlpbnQzMl90IGludGVnZXI7CisJCXVfaW50MzJfdCB1bnM7CisJCWNvbnN0IHVfY2hhciAqc3RyOworCSAgICAgICAgc3RydWN0IHsKKwkJICAgICAgICB1X2ludDMyX3QgaGlnaDsKKwkJICAgICAgICB1X2ludDMyX3QgbG93OworCQl9IHVuczY0OworCX0gZGF0YTsKKwl1X3Nob3J0IGlkOworCXVfY2hhciBmb3JtLCBjbGFzczsJCS8qIHRhZyBpbmZvICovCisJdV9jaGFyIHR5cGU7CisjZGVmaW5lIEJFX0FOWQkJMjU1CisjZGVmaW5lIEJFX05PTkUJCTAKKyNkZWZpbmUgQkVfTlVMTAkJMQorI2RlZmluZSBCRV9PQ1RFVAkyCisjZGVmaW5lIEJFX09JRAkJMworI2RlZmluZSBCRV9JTlQJCTQKKyNkZWZpbmUgQkVfVU5TCQk1CisjZGVmaW5lIEJFX1NUUgkJNgorI2RlZmluZSBCRV9TRVEJCTcKKyNkZWZpbmUgQkVfSU5FVEFERFIJOAorI2RlZmluZSBCRV9QRFUJCTkKKyNkZWZpbmUgQkVfVU5TNjQJMTAKKyNkZWZpbmUgQkVfTk9TVUNIT0JKRUNUCTEyOAorI2RlZmluZSBCRV9OT1NVQ0hJTlNUCTEyOQorI2RlZmluZSBCRV9FTkRPRk1JQlZJRVcJMTMwCit9OworCisvKgorICogU05NUCB2ZXJzaW9ucyByZWNvZ25pemVkIGJ5IHRoaXMgbW9kdWxlCisgKi8KK2NvbnN0IGNoYXIgKlNubXBWZXJzaW9uW10gPSB7CisJIlNOTVB2MSIsCisjZGVmaW5lIFNOTVBfVkVSU0lPTl8xCTAKKwkiU05NUHYyYyIsCisjZGVmaW5lIFNOTVBfVkVSU0lPTl8yCTEKKwkiU05NUHYydSIsCisjZGVmaW5lIFNOTVBfVkVSU0lPTl8yVQkyCisJIlNOTVB2MyIKKyNkZWZpbmUgU05NUF9WRVJTSU9OXzMJMworfTsKKworLyoKKyAqIERlZmF1bHRzIGZvciBTTk1QIFBEVSBjb21wb25lbnRzCisgKi8KKyNkZWZpbmUgREVGX0NPTU1VTklUWSAicHVibGljIgorCisvKgorICogY29uc3RhbnRzIGZvciBBU04uMSBkZWNvZGluZworICovCisjZGVmaW5lIE9JRE1VWCA0MAorI2RlZmluZSBBU05MRU5fSU5FVEFERFIgNAorI2RlZmluZSBBU05fU0hJRlQ3IDcKKyNkZWZpbmUgQVNOX1NISUZUOCA4CisjZGVmaW5lIEFTTl9CSVQ4IDB4ODAKKyNkZWZpbmUgQVNOX0xPTkdMRU4gMHg4MAorCisjZGVmaW5lIEFTTl9JRF9CSVRTIDB4MWYKKyNkZWZpbmUgQVNOX0ZPUk1fQklUUyAweDIwCisjZGVmaW5lIEFTTl9GT1JNX1NISUZUIDUKKyNkZWZpbmUgQVNOX0NMQVNTX0JJVFMgMHhjMAorI2RlZmluZSBBU05fQ0xBU1NfU0hJRlQgNgorCisjZGVmaW5lIEFTTl9JRF9FWFQgMHgxZgkJLyogZXh0ZW5zaW9uIElEIGluIHRhZyBmaWVsZCAqLworCisvKgorICogVGhpcyBkZWNvZGVzIHRoZSBuZXh0IEFTTi4xIG9iamVjdCBpbiB0aGUgc3RyZWFtIHBvaW50ZWQgdG8gYnkgInAiCisgKiAoYW5kIG9mIHJlYWwtbGVuZ3RoICJsZW4iKSBhbmQgc3RvcmVzIHRoZSBpbnRlcm1lZGlhdGUgZGF0YSBpbiB0aGUKKyAqIHByb3ZpZGVkIEJFIG9iamVjdC4KKyAqCisgKiBUaGlzIHJldHVybnMgLWwgaWYgaXQgZmFpbHMgKGkuZS4sIHRoZSBBU04uMSBzdHJlYW0gaXMgbm90IHZhbGlkKS4KKyAqIE8vdywgdGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGFyc2VkIGZyb20gInAiLgorICovCitzdGF0aWMgaW50Cithc24xX3BhcnNlKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuLCBzdHJ1Y3QgYmUgKmVsZW0pCit7CisJdV9jaGFyIGZvcm0sIGNsYXNzLCBpZDsKKwlpbnQgaSwgaGRyOworCisJZWxlbS0+YXNubGVuID0gMDsKKwllbGVtLT50eXBlID0gQkVfQU5ZOworCWlmIChsZW4gPCAxKSB7CisJCWZwdXRzKCJbbm90aGluZyB0byBwYXJzZV0iLCBzdGRvdXQpOworCQlyZXR1cm4gLTE7CisJfQorCVRDSEVDSygqcCk7CisKKwkvKgorCSAqIGl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIGEgYml0IGZpZWxkLCBidXQgeW91IGNhbid0IGRlcGVuZCBvbiB0aGVtLgorCSAqICArLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKwkgKiAgKyBjbGFzcyB8ZnJtfCAgICAgICAgaWQgICAgICAgICB8CisJICogICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworCSAqICAgIDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwCisJICovCisJaWQgPSAqcCAmIEFTTl9JRF9CSVRTOwkJLyogbG93ZXIgNSBiaXRzLCByYW5nZSAwMC0xZiAqLworI2lmZGVmIG5vdGRlZgorCWZvcm0gPSAoKnAgJiAweGUwKSA+PiA1OwkvKiBtb3ZlIHVwcGVyIDMgYml0cyB0byBsb3dlciAzICovCisJY2xhc3MgPSBmb3JtID4+IDE7CQkvKiBiaXRzIDcmNiAtPiBiaXRzIDEmMCwgcmFuZ2UgMC0zICovCisJZm9ybSAmPSAweDE7CQkJLyogYml0IDUgLT4gYml0IDAsIHJhbmdlIDAtMSAqLworI2Vsc2UKKwlmb3JtID0gKHVfY2hhcikoKnAgJiBBU05fRk9STV9CSVRTKSA+PiBBU05fRk9STV9TSElGVDsKKwljbGFzcyA9ICh1X2NoYXIpKCpwICYgQVNOX0NMQVNTX0JJVFMpID4+IEFTTl9DTEFTU19TSElGVDsKKyNlbmRpZgorCWVsZW0tPmZvcm0gPSBmb3JtOworCWVsZW0tPmNsYXNzID0gY2xhc3M7CisJZWxlbS0+aWQgPSBpZDsKKwlwKys7IGxlbi0tOyBoZHIgPSAxOworCS8qIGV4dGVuZGVkIHRhZyBmaWVsZCAqLworCWlmIChpZCA9PSBBU05fSURfRVhUKSB7CisJCS8qCisJCSAqIFRoZSBJRCBmb2xsb3dzLCBhcyBhIHNlcXVlbmNlIG9mIG9jdGV0cyB3aXRoIHRoZQorCQkgKiA4dGggYml0IHNldCBhbmQgdGhlIHJlbWFpbmluZyA3IGJpdHMgYmVpbmcKKwkJICogdGhlIG5leHQgNyBiaXRzIG9mIHRoZSB2YWx1ZSwgdGVybWluYXRlZCB3aXRoCisJCSAqIGFuIG9jdGV0IHdpdGggdGhlIDh0aCBiaXQgbm90IHNldC4KKwkJICoKKwkJICogRmlyc3QsIGFzc2VtYmxlIGFsbCB0aGUgb2N0ZXRzIHdpdGggdGhlIDh0aAorCQkgKiBiaXQgc2V0LiAgWFhYIC0gdGhpcyBkb2Vzbid0IGhhbmRsZSBhIHZhbHVlCisJCSAqIHRoYXQgd29uJ3QgZml0IGluIDMyIGJpdHMuCisJCSAqLworCQlmb3IgKGlkID0gMDsgKnAgJiBBU05fQklUODsgbGVuLS0sIGhkcisrLCBwKyspIHsKKwkJCWlmIChsZW4gPCAxKSB7CisJCQkJZnB1dHMoIltYdGFnZmllbGQ/XSIsIHN0ZG91dCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJVENIRUNLKCpwKTsKKwkJCWlkID0gKGlkIDw8IDcpIHwgKCpwICYgfkFTTl9CSVQ4KTsKKwkJfQorCQlpZiAobGVuIDwgMSkgeworCQkJZnB1dHMoIltYdGFnZmllbGQ/XSIsIHN0ZG91dCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJVENIRUNLKCpwKTsKKwkJZWxlbS0+aWQgPSBpZCA9IChpZCA8PCA3KSB8ICpwOworCQktLWxlbjsKKwkJKytoZHI7CisJCSsrcDsKKwl9CisJaWYgKGxlbiA8IDEpIHsKKwkJZnB1dHMoIltubyBhc25sZW5dIiwgc3Rkb3V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlUQ0hFQ0soKnApOworCWVsZW0tPmFzbmxlbiA9ICpwOworCXArKzsgbGVuLS07IGhkcisrOworCWlmIChlbGVtLT5hc25sZW4gJiBBU05fQklUOCkgeworCQl1X2ludDMyX3Qgbm9jdCA9IGVsZW0tPmFzbmxlbiAlIEFTTl9CSVQ4OworCQllbGVtLT5hc25sZW4gPSAwOworCQlpZiAobGVuIDwgbm9jdCkgeworCQkJcHJpbnRmKCJbYXNubGVuPyAlZDwlZF0iLCBsZW4sIG5vY3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCVRDSEVDSzIoKnAsIG5vY3QpOworCQlmb3IgKDsgbm9jdC0tID4gMDsgbGVuLS0sIGhkcisrKQorCQkJZWxlbS0+YXNubGVuID0gKGVsZW0tPmFzbmxlbiA8PCBBU05fU0hJRlQ4KSB8ICpwKys7CisJfQorCWlmIChsZW4gPCBlbGVtLT5hc25sZW4pIHsKKwkJcHJpbnRmKCJbbGVuJWQ8YXNubGVuJXVdIiwgbGVuLCBlbGVtLT5hc25sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChmb3JtID49IHNpemVvZihGb3JtKS9zaXplb2YoRm9ybVswXSkpIHsKKwkJcHJpbnRmKCJbZm9ybT8lZF0iLCBmb3JtKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoY2xhc3MgPj0gc2l6ZW9mKENsYXNzKS9zaXplb2YoQ2xhc3NbMF0pKSB7CisJCXByaW50ZigiW2NsYXNzPyVjLyVkXSIsICpGb3JtW2Zvcm1dLCBjbGFzcyk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKChpbnQpaWQgPj0gQ2xhc3NbY2xhc3NdLm51bUlEcykgeworCQlwcmludGYoIltpZD8lYy8lcy8lZF0iLCAqRm9ybVtmb3JtXSwgQ2xhc3NbY2xhc3NdLm5hbWUsIGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXN3aXRjaCAoZm9ybSkgeworCWNhc2UgUFJJTUlUSVZFOgorCQlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgVU5JVkVSU0FMOgorCQkJc3dpdGNoIChpZCkgeworCQkJY2FzZSBTVFJJTkc6CisJCQkJZWxlbS0+dHlwZSA9IEJFX1NUUjsKKwkJCQllbGVtLT5kYXRhLnN0ciA9IHA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU5URUdFUjogeworCQkJCXJlZ2lzdGVyIGludDMyX3QgZGF0YTsKKwkJCQllbGVtLT50eXBlID0gQkVfSU5UOworCQkJCWRhdGEgPSAwOworCisJCQkJVENIRUNLMigqcCwgZWxlbS0+YXNubGVuKTsKKwkJCQlpZiAoKnAgJiBBU05fQklUOCkJLyogbmVnYXRpdmUgKi8KKwkJCQkJZGF0YSA9IC0xOworCQkJCWZvciAoaSA9IGVsZW0tPmFzbmxlbjsgaS0tID4gMDsgcCsrKQorCQkJCQlkYXRhID0gKGRhdGEgPDwgQVNOX1NISUZUOCkgfCAqcDsKKwkJCQllbGVtLT5kYXRhLmludGVnZXIgPSBkYXRhOworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXNlIE9CSkVDVElEOgorCQkJCWVsZW0tPnR5cGUgPSBCRV9PSUQ7CisJCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJCWJyZWFrOworCisJCQljYXNlIEFTTl9OVUxMOgorCQkJCWVsZW0tPnR5cGUgPSBCRV9OVUxMOworCQkJCWVsZW0tPmRhdGEucmF3ID0gTlVMTDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQllbGVtLT50eXBlID0gQkVfT0NURVQ7CisJCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJCXByaW50ZigiW1AvVS8lc10iLAorCQkJCQlDbGFzc1tjbGFzc10uSWRbaWRdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQVBQTElDQVRJT046CisJCQlzd2l0Y2ggKGlkKSB7CisJCQljYXNlIElQQUREUjoKKwkJCQllbGVtLT50eXBlID0gQkVfSU5FVEFERFI7CisJCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJCWJyZWFrOworCisJCQljYXNlIENPVU5URVI6CisJCQljYXNlIEdBVUdFOgorCQkJY2FzZSBUSU1FVElDS1M6IHsKKwkJCQlyZWdpc3RlciB1X2ludDMyX3QgZGF0YTsKKwkJCQlUQ0hFQ0syKCpwLCBlbGVtLT5hc25sZW4pOworCQkJCWVsZW0tPnR5cGUgPSBCRV9VTlM7CisJCQkJZGF0YSA9IDA7CisJCQkJZm9yIChpID0gZWxlbS0+YXNubGVuOyBpLS0gPiAwOyBwKyspCisJCQkJCWRhdGEgPSAoZGF0YSA8PCA4KSArICpwOworCQkJCWVsZW0tPmRhdGEudW5zID0gZGF0YTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY2FzZSBDT1VOVEVSNjQ6IHsKKwkJCQlyZWdpc3RlciB1X2ludDMyX3QgaGlnaCwgbG93OworCQkJCVRDSEVDSzIoKnAsIGVsZW0tPmFzbmxlbik7CisJCQkgICAgICAgIGVsZW0tPnR5cGUgPSBCRV9VTlM2NDsKKwkJCQloaWdoID0gMCwgbG93ID0gMDsKKwkJCQlmb3IgKGkgPSBlbGVtLT5hc25sZW47IGktLSA+IDA7IHArKykgeworCQkJCSAgICAgICAgaGlnaCA9IChoaWdoIDw8IDgpIHwKKwkJCQkJICAgICgobG93ICYgMHhGRjAwMDAwMCkgPj4gMjQpOworCQkJCQlsb3cgPSAobG93IDw8IDgpIHwgKnA7CisJCQkJfQorCQkJCWVsZW0tPmRhdGEudW5zNjQuaGlnaCA9IGhpZ2g7CisJCQkJZWxlbS0+ZGF0YS51bnM2NC5sb3cgPSBsb3c7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRlZmF1bHQ6CisJCQkJZWxlbS0+dHlwZSA9IEJFX09DVEVUOworCQkJCWVsZW0tPmRhdGEucmF3ID0gKGNhZGRyX3QpcDsKKwkJCQlwcmludGYoIltQL0EvJXNdIiwKKwkJCQkJQ2xhc3NbY2xhc3NdLklkW2lkXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENPTlRFWFQ6CisJCQlzd2l0Y2ggKGlkKSB7CisJCQljYXNlIE5PU1VDSE9CSkVDVDoKKwkJCQllbGVtLT50eXBlID0gQkVfTk9TVUNIT0JKRUNUOworCQkJCWVsZW0tPmRhdGEucmF3ID0gTlVMTDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBOT1NVQ0hJTlNUQU5DRToKKwkJCQllbGVtLT50eXBlID0gQkVfTk9TVUNISU5TVDsKKwkJCQllbGVtLT5kYXRhLnJhdyA9IE5VTEw7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRU5ET0ZNSUJWSUVXOgorCQkJCWVsZW0tPnR5cGUgPSBCRV9FTkRPRk1JQlZJRVc7CisJCQkJZWxlbS0+ZGF0YS5yYXcgPSBOVUxMOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiW1AvJXMvJXNdIiwKKwkJCQlDbGFzc1tjbGFzc10ubmFtZSwgQ2xhc3NbY2xhc3NdLklkW2lkXSk7CisJCQlUQ0hFQ0syKCpwLCBlbGVtLT5hc25sZW4pOworCQkJZWxlbS0+dHlwZSA9IEJFX09DVEVUOworCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIENPTlNUUlVDVEVEOgorCQlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgVU5JVkVSU0FMOgorCQkJc3dpdGNoIChpZCkgeworCQkJY2FzZSBTRVFVRU5DRToKKwkJCQllbGVtLT50eXBlID0gQkVfU0VROworCQkJCWVsZW0tPmRhdGEucmF3ID0gKGNhZGRyX3QpcDsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQllbGVtLT50eXBlID0gQkVfT0NURVQ7CisJCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJCXByaW50ZigiQy9VLyVzIiwgQ2xhc3NbY2xhc3NdLklkW2lkXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENPTlRFWFQ6CisJCQllbGVtLT50eXBlID0gQkVfUERVOworCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVsZW0tPnR5cGUgPSBCRV9PQ1RFVDsKKwkJCWVsZW0tPmRhdGEucmF3ID0gKGNhZGRyX3QpcDsKKwkJCXByaW50ZigiQy8lcy8lcyIsCisJCQkJQ2xhc3NbY2xhc3NdLm5hbWUsIENsYXNzW2NsYXNzXS5JZFtpZF0pOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCXAgKz0gZWxlbS0+YXNubGVuOworCWxlbiAtPSBlbGVtLT5hc25sZW47CisJcmV0dXJuIGVsZW0tPmFzbmxlbiArIGhkcjsKKwordHJ1bmM6CisJZnB1dHMoIlt8c25tcF0iLCBzdGRvdXQpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIERpc3BsYXkgdGhlIEFTTi4xIG9iamVjdCByZXByZXNlbnRlZCBieSB0aGUgQkUgb2JqZWN0LgorICogVGhpcyB1c2VkIHRvIGJlIGFuIGludGVncmFsIHBhcnQgb2YgYXNuMV9wYXJzZSgpIGJlZm9yZSB0aGUgaW50ZXJtZWRpYXRlCisgKiBCRSBmb3JtIHdhcyBhZGRlZC4KKyAqLworc3RhdGljIGludAorYXNuMV9wcmludChzdHJ1Y3QgYmUgKmVsZW0pCit7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKWVsZW0tPmRhdGEucmF3OworCXVfaW50MzJfdCBhc25sZW4gPSBlbGVtLT5hc25sZW47CisJdV9pbnQzMl90IGk7CisKKwlzd2l0Y2ggKGVsZW0tPnR5cGUpIHsKKworCWNhc2UgQkVfT0NURVQ6CisJCVRDSEVDSzIoKnAsIGFzbmxlbik7CisJCWZvciAoaSA9IGFzbmxlbjsgaS0tID4gMDsgcCsrKQorCQkJcHJpbnRmKCJfJS4yeCIsICpwKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFX05VTEw6CisJCWJyZWFrOworCisJY2FzZSBCRV9PSUQ6IHsKKwkJaW50IG8gPSAwLCBmaXJzdCA9IC0xLCBpID0gYXNubGVuOworCisJCWlmICghc2ZsYWcgJiYgIW5mbGFnICYmIGFzbmxlbiA+IDIpIHsKKwkJCXN0cnVjdCBvYmpfYWJyZXYgKmEgPSAmb2JqX2FicmV2X2xpc3RbMF07CisJCQlzaXplX3QgYV9sZW4gPSBzdHJsZW4oYS0+b2lkKTsKKwkJCWZvciAoOyBhLT5ub2RlOyBhKyspIHsKKwkJCQlUQ0hFQ0syKCpwLCBhX2xlbik7CisJCQkJaWYgKG1lbWNtcChhLT5vaWQsIChjaGFyICopcCwgYV9sZW4pID09IDApIHsKKwkJCQkJb2JqcCA9IGEtPm5vZGUtPmNoaWxkOworCQkJCQlpIC09IHN0cmxlbihhLT5vaWQpOworCQkJCQlwICs9IHN0cmxlbihhLT5vaWQpOworCQkJCQlmcHV0cyhhLT5wcmVmaXgsIHN0ZG91dCk7CisJCQkJCWZpcnN0ID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yICg7ICFzZmxhZyAmJiBpLS0gPiAwOyBwKyspIHsKKwkJCVRDSEVDSygqcCk7CisJCQlvID0gKG8gPDwgQVNOX1NISUZUNykgKyAoKnAgJiB+QVNOX0JJVDgpOworCQkJaWYgKCpwICYgQVNOX0xPTkdMRU4pCisJCQkgICAgICAgIGNvbnRpbnVlOworCisJCQkvKgorCQkJICogZmlyc3Qgc3ViaXRlbSBlbmNvZGVzIHR3byBpdGVtcyB3aXRoIDFzdCpPSURNVVgrMm5kCisJCQkgKiAoc2VlIFguNjkwOjE5OTcgY2xhdXNlIDguMTkgZm9yIHRoZSBkZXRhaWxzKQorCQkJICovCisJCQlpZiAoZmlyc3QgPCAwKSB7CisJCQkgICAgICAgIGludCBzOworCQkJCWlmICghbmZsYWcpCisJCQkJCW9ianAgPSBtaWJyb290OworCQkJCWZpcnN0ID0gMDsKKwkJCQlzID0gbyAvIE9JRE1VWDsKKwkJCQlpZiAocyA+IDIpIHMgPSAyOworCQkJCU9CSl9QUklOVChzLCBmaXJzdCk7CisJCQkJbyAtPSBzICogT0lETVVYOworCQkJfQorCQkJT0JKX1BSSU5UKG8sIGZpcnN0KTsKKwkJCWlmICgtLWZpcnN0IDwgMCkKKwkJCQlmaXJzdCA9IDA7CisJCQlvID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIEJFX0lOVDoKKwkJcHJpbnRmKCIlZCIsIGVsZW0tPmRhdGEuaW50ZWdlcik7CisJCWJyZWFrOworCisJY2FzZSBCRV9VTlM6CisJCXByaW50ZigiJXUiLCBlbGVtLT5kYXRhLnVucyk7CisJCWJyZWFrOworCisJY2FzZSBCRV9VTlM2NDogewkvKiBpZGVhIGJvcnJvd2VkIGZyb20gYnkgTWFyc2hhbGwgUm9zZSAqLworCSAgICAgICAgZG91YmxlIGQ7CisJCWludCBqLCBjYXJyeTsKKwkJY2hhciAqY3BmLCAqY3BsLCBsYXN0WzZdLCBmaXJzdFszMF07CisJCWlmIChlbGVtLT5kYXRhLnVuczY0LmhpZ2ggPT0gMCkgeworCQkgICAgICAgIHByaW50ZigiJXUiLCBlbGVtLT5kYXRhLnVuczY0Lmxvdyk7CisJCSAgICAgICAgYnJlYWs7CisJCX0KKwkJZCA9IGVsZW0tPmRhdGEudW5zNjQuaGlnaCAqIDQyOTQ5NjcyOTYuMDsJLyogMl4zMiAqLworCQlpZiAoZWxlbS0+ZGF0YS51bnM2NC5oaWdoIDw9IDB4MWZmZmZmKSB7CisJCSAgICAgICAgZCArPSBlbGVtLT5kYXRhLnVuczY0LmxvdzsKKyNpZiAwIC8qaXMgbG9va3MgaWxsZWdhbCwgYnV0IHdoYXQgaXMgdGhlIGludGVudGlvbj8qLworCQkJcHJpbnRmKCIlLmYiLCBkKTsKKyNlbHNlCisJCQlwcmludGYoIiVmIiwgZCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWQgKz0gKGVsZW0tPmRhdGEudW5zNjQubG93ICYgMHhmZmZmZjAwMCk7CisjaWYgMCAvKmlzIGxvb2tzIGlsbGVnYWwsIGJ1dCB3aGF0IGlzIHRoZSBpbnRlbnRpb24/Ki8KKwkJc25wcmludGYoZmlyc3QsIHNpemVvZihmaXJzdCksICIlLmYiLCBkKTsKKyNlbHNlCisJCXNucHJpbnRmKGZpcnN0LCBzaXplb2YoZmlyc3QpLCAiJWYiLCBkKTsKKyNlbmRpZgorCQlzbnByaW50ZihsYXN0LCBzaXplb2YobGFzdCksICIlNS41ZCIsCisJCSAgICBlbGVtLT5kYXRhLnVuczY0LmxvdyAmIDB4ZmZmKTsKKwkJZm9yIChjYXJyeSA9IDAsIGNwZiA9IGZpcnN0K3N0cmxlbihmaXJzdCktMSwgY3BsID0gbGFzdCs0OworCQkgICAgIGNwbCA+PSBsYXN0OworCQkgICAgIGNwZi0tLCBjcGwtLSkgeworCQkgICAgICAgIGogPSBjYXJyeSArICgqY3BmIC0gJzAnKSArICgqY3BsIC0gJzAnKTsKKwkJCWlmIChqID4gOSkgeworCQkJICAgICAgICBqIC09IDEwOworCQkJCWNhcnJ5ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkgICAgICAgIGNhcnJ5ID0gMDsKKwkJICAgICAgICB9CisJCQkqY3BmID0gaiArICcwJzsKKwkJfQorCQlmcHV0cyhmaXJzdCwgc3Rkb3V0KTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBCRV9TVFI6IHsKKwkJcmVnaXN0ZXIgaW50IHByaW50YWJsZSA9IDEsIGZpcnN0ID0gMTsKKwkJY29uc3QgdV9jaGFyICpwID0gZWxlbS0+ZGF0YS5zdHI7CisJCVRDSEVDSzIoKnAsIGFzbmxlbik7CisJCWZvciAoaSA9IGFzbmxlbjsgcHJpbnRhYmxlICYmIGktLSA+IDA7IHArKykKKwkJCXByaW50YWJsZSA9IGlzcHJpbnQoKnApIHx8IGlzc3BhY2UoKnApOworCQlwID0gZWxlbS0+ZGF0YS5zdHI7CisJCWlmIChwcmludGFibGUpIHsKKwkJCXB1dGNoYXIoJyInKTsKKwkJCWlmIChmbl9wcmludG4ocCwgYXNubGVuLCBzbmFwZW5kKSkgeworCQkJCXB1dGNoYXIoJyInKTsKKwkJCQlnb3RvIHRydW5jOworCQkJfQorCQkJcHV0Y2hhcignIicpOworCQl9IGVsc2UKKwkJCWZvciAoaSA9IGFzbmxlbjsgaS0tID4gMDsgcCsrKSB7CisJCQkJcHJpbnRmKGZpcnN0ID8gIiUuMngiIDogIl8lLjJ4IiwgKnApOworCQkJCWZpcnN0ID0gMDsKKwkJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSBCRV9TRVE6CisJCXByaW50ZigiU2VxKCV1KSIsIGVsZW0tPmFzbmxlbik7CisJCWJyZWFrOworCisJY2FzZSBCRV9JTkVUQUREUjoKKwkJaWYgKGFzbmxlbiAhPSBBU05MRU5fSU5FVEFERFIpCisJCQlwcmludGYoIltpbmV0YWRkciBsZW4hPSVkXSIsIEFTTkxFTl9JTkVUQUREUik7CisJCVRDSEVDSzIoKnAsIGFzbmxlbik7CisJCWZvciAoaSA9IGFzbmxlbjsgaS0tICE9IDA7IHArKykgeworCQkJcHJpbnRmKChpID09IGFzbmxlbi0xKSA/ICIldSIgOiAiLiV1IiwgKnApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBCRV9OT1NVQ0hPQkpFQ1Q6CisJY2FzZSBCRV9OT1NVQ0hJTlNUOgorCWNhc2UgQkVfRU5ET0ZNSUJWSUVXOgorCSAgICAgICAgcHJpbnRmKCJbJXNdIiwgQ2xhc3NbRVhDRVBUSU9OU10uSWRbZWxlbS0+aWRdKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFX1BEVToKKwkJcHJpbnRmKCIlcygldSkiLAorCQkJQ2xhc3NbQ09OVEVYVF0uSWRbZWxlbS0+aWRdLCBlbGVtLT5hc25sZW4pOworCQlicmVhazsKKworCWNhc2UgQkVfQU5ZOgorCQlmcHV0cygiW0JFX0FOWSE/XSIsIHN0ZG91dCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZnB1dHMoIltiZSE/XSIsIHN0ZG91dCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKKwordHJ1bmM6CisJZnB1dHMoIlt8c25tcF0iLCBzdGRvdXQpOworCXJldHVybiAtMTsKK30KKworI2lmZGVmIG5vdGRlZgorLyoKKyAqIFRoaXMgaXMgYSBicnV0ZSBmb3JjZSBBU04uMSBwcmludGVyOiByZWN1cnNlcyB0byBkdW1wIGFuIGVudGlyZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIHdpbGwgd29yayBmb3IgYW55IEFTTi4xIHN0cmVhbSwgbm90IGp1c3QgYW4gU05NUCBQRFUuCisgKgorICogQnkgYWRkaW5nIG5ld2xpbmVzIGFuZCBzcGFjZXMgYXQgdGhlIGNvcnJlY3QgcGxhY2VzLCB0aGlzIHdvdWxkIHByaW50IGluCisgKiBSb3NlLU5vcm1hbC1Gb3JtLgorICoKKyAqIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLgorICovCitzdGF0aWMgdm9pZAorYXNuMV9kZWNvZGUodV9jaGFyICpwLCB1X2ludCBsZW5ndGgpCit7CisJc3RydWN0IGJlIGVsZW07CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPj0gMCAmJiBsZW5ndGggPiAwKSB7CisJCWkgPSBhc24xX3BhcnNlKHAsIGxlbmd0aCwgJmVsZW0pOworCQlpZiAoaSA+PSAwKSB7CisJCQlmcHV0cygiICIsIHN0ZG91dCk7CisJCQlpZiAoYXNuMV9wcmludCgmZWxlbSkgPCAwKQorCQkJCXJldHVybjsKKwkJCWlmIChlbGVtLnR5cGUgPT0gQkVfU0VRIHx8IGVsZW0udHlwZSA9PSBCRV9QRFUpIHsKKwkJCQlmcHV0cygiIHsiLCBzdGRvdXQpOworCQkJCWFzbjFfZGVjb2RlKGVsZW0uZGF0YS5yYXcsIGVsZW0uYXNubGVuKTsKKwkJCQlmcHV0cygiIH0iLCBzdGRvdXQpOworCQkJfQorCQkJbGVuZ3RoIC09IGk7CisJCQlwICs9IGk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIExJQlNNSQorCitzdHJ1Y3Qgc21pMmJlIHsKKyAgICBTbWlCYXNldHlwZSBiYXNldHlwZTsKKyAgICBpbnQgYmU7Cit9OworCitzdGF0aWMgc3RydWN0IHNtaTJiZSBzbWkyYmV0YWJbXSA9IHsKKyAgICB7IFNNSV9CQVNFVFlQRV9JTlRFR0VSMzIsCQlCRV9JTlQgfSwKKyAgICB7IFNNSV9CQVNFVFlQRV9PQ1RFVFNUUklORywJCUJFX1NUUiB9LAorICAgIHsgU01JX0JBU0VUWVBFX09DVEVUU1RSSU5HLAkJQkVfSU5FVEFERFIgfSwKKyAgICB7IFNNSV9CQVNFVFlQRV9PQkpFQ1RJREVOVElGSUVSLAlCRV9PSUQgfSwKKyAgICB7IFNNSV9CQVNFVFlQRV9VTlNJR05FRDMyLAkJQkVfVU5TIH0sCisgICAgeyBTTUlfQkFTRVRZUEVfSU5URUdFUjY0LAkJQkVfTk9ORSB9LAorICAgIHsgU01JX0JBU0VUWVBFX1VOU0lHTkVENjQsCQlCRV9VTlM2NCB9LAorICAgIHsgU01JX0JBU0VUWVBFX0ZMT0FUMzIsCQlCRV9OT05FIH0sCisgICAgeyBTTUlfQkFTRVRZUEVfRkxPQVQ2NCwJCUJFX05PTkUgfSwKKyAgICB7IFNNSV9CQVNFVFlQRV9GTE9BVDEyOCwJCUJFX05PTkUgfSwKKyAgICB7IFNNSV9CQVNFVFlQRV9FTlVNLAkJQkVfSU5UIH0sCisgICAgeyBTTUlfQkFTRVRZUEVfQklUUywJCUJFX1NUUiB9LAorICAgIHsgU01JX0JBU0VUWVBFX1VOS05PV04sCQlCRV9OT05FIH0KK307CisKK3N0YXRpYyBpbnQKK3NtaV9kZWNvZGVfb2lkKHN0cnVjdCBiZSAqZWxlbSwgdW5zaWduZWQgaW50ICpvaWQsCisJICAgICAgIHVuc2lnbmVkIGludCBvaWRzaXplLCB1bnNpZ25lZCBpbnQgKm9pZGxlbikKK3sKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopZWxlbS0+ZGF0YS5yYXc7CisJdV9pbnQzMl90IGFzbmxlbiA9IGVsZW0tPmFzbmxlbjsKKwlpbnQgbyA9IDAsIGZpcnN0ID0gLTEsIGkgPSBhc25sZW47CisKKwlmb3IgKCpvaWRsZW4gPSAwOyBzZmxhZyAmJiBpLS0gPiAwOyBwKyspIHsKKwkJVENIRUNLKCpwKTsKKwkgICAgICAgIG8gPSAobyA8PCBBU05fU0hJRlQ3KSArICgqcCAmIH5BU05fQklUOCk7CisJCWlmICgqcCAmIEFTTl9MT05HTEVOKQorCQkgICAgY29udGludWU7CisKKwkJLyoKKwkJICogZmlyc3Qgc3ViaXRlbSBlbmNvZGVzIHR3byBpdGVtcyB3aXRoIDFzdCpPSURNVVgrMm5kCisJCSAqIChzZWUgWC42OTA6MTk5NyBjbGF1c2UgOC4xOSBmb3IgdGhlIGRldGFpbHMpCisJCSAqLworCQlpZiAoZmlyc3QgPCAwKSB7CisJCSAgICAgICAgZmlyc3QgPSAwOworCQkJaWYgKCpvaWRsZW4gPCBvaWRzaXplKSB7CisJCQkgICAgb2lkWypvaWRsZW5dID0gbyAvIE9JRE1VWDsKKwkJCSAgICBpZiAob2lkWypvaWRsZW5dID4gMikgb2lkWypvaWRsZW5dID0gMjsKKwkJCX0KKwkJCW8gLT0gb2lkWypvaWRsZW5dICogT0lETVVYOworCQkJaWYgKCpvaWRsZW4gPCBvaWRzaXplKSAoKm9pZGxlbikrKzsKKwkJfQorCQlpZiAoKm9pZGxlbiA8IG9pZHNpemUpIHsKKwkJCW9pZFsoKm9pZGxlbikrK10gPSBvOworCQl9CisJCW8gPSAwOworCX0KKwlyZXR1cm4gMDsKKwordHJ1bmM6CisJZnB1dHMoIlt8c25tcF0iLCBzdGRvdXQpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzbWlfY2hlY2tfdHlwZShTbWlCYXNldHlwZSBiYXNldHlwZSwgaW50IGJlKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgc21pMmJldGFiW2ldLmJhc2V0eXBlICE9IFNNSV9CQVNFVFlQRV9VTktOT1dOOyBpKyspIHsKKwlpZiAoc21pMmJldGFiW2ldLmJhc2V0eXBlID09IGJhc2V0eXBlICYmIHNtaTJiZXRhYltpXS5iZSA9PSBiZSkgeworCSAgICByZXR1cm4gMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21pX2NoZWNrX2FfcmFuZ2UoU21pVHlwZSAqc21pVHlwZSwgU21pUmFuZ2UgKnNtaVJhbmdlLAorCQkJICAgICBzdHJ1Y3QgYmUgKmVsZW0pCit7CisgICAgaW50IG9rID0gMTsKKworICAgIHN3aXRjaCAoc21pVHlwZS0+YmFzZXR5cGUpIHsKKyAgICBjYXNlIFNNSV9CQVNFVFlQRV9PQkpFQ1RJREVOVElGSUVSOgorICAgIGNhc2UgU01JX0JBU0VUWVBFX09DVEVUU1RSSU5HOgorCWlmIChzbWlSYW5nZS0+bWluVmFsdWUudmFsdWUudW5zaWduZWQzMgorCSAgICA9PSBzbWlSYW5nZS0+bWF4VmFsdWUudmFsdWUudW5zaWduZWQzMikgeworCSAgICBvayA9IChlbGVtLT5hc25sZW4gPT0gc21pUmFuZ2UtPm1pblZhbHVlLnZhbHVlLnVuc2lnbmVkMzIpOworCX0gZWxzZSB7CisJICAgIG9rID0gKGVsZW0tPmFzbmxlbiA+PSBzbWlSYW5nZS0+bWluVmFsdWUudmFsdWUudW5zaWduZWQzMgorCQkgICYmIGVsZW0tPmFzbmxlbiA8PSBzbWlSYW5nZS0+bWF4VmFsdWUudmFsdWUudW5zaWduZWQzMik7CisJfQorCWJyZWFrOworCisgICAgY2FzZSBTTUlfQkFTRVRZUEVfSU5URUdFUjMyOgorCW9rID0gKGVsZW0tPmRhdGEuaW50ZWdlciA+PSBzbWlSYW5nZS0+bWluVmFsdWUudmFsdWUuaW50ZWdlcjMyCisJICAgICAgJiYgZWxlbS0+ZGF0YS5pbnRlZ2VyIDw9IHNtaVJhbmdlLT5tYXhWYWx1ZS52YWx1ZS5pbnRlZ2VyMzIpOworCWJyZWFrOworCisgICAgY2FzZSBTTUlfQkFTRVRZUEVfVU5TSUdORUQzMjoKKwlvayA9IChlbGVtLT5kYXRhLnVucyA+PSBzbWlSYW5nZS0+bWluVmFsdWUudmFsdWUudW5zaWduZWQzMgorCSAgICAgICYmIGVsZW0tPmRhdGEudW5zIDw9IHNtaVJhbmdlLT5tYXhWYWx1ZS52YWx1ZS51bnNpZ25lZDMyKTsKKwlicmVhazsKKworICAgIGNhc2UgU01JX0JBU0VUWVBFX1VOU0lHTkVENjQ6CisJLyogWFhYICovCisJYnJlYWs7CisKKwkvKiBjYXNlIFNNSV9CQVNFVFlQRV9JTlRFR0VSNjQ6IFNNSW5nICovCisJLyogY2FzZSBTTUlfQkFTRVRZUEVfRkxPQVQzMjogU01JbmcgKi8KKwkvKiBjYXNlIFNNSV9CQVNFVFlQRV9GTE9BVDY0OiBTTUluZyAqLworCS8qIGNhc2UgU01JX0JBU0VUWVBFX0ZMT0FUMTI4OiBTTUluZyAqLworCisgICAgY2FzZSBTTUlfQkFTRVRZUEVfRU5VTToKKyAgICBjYXNlIFNNSV9CQVNFVFlQRV9CSVRTOgorICAgIGNhc2UgU01JX0JBU0VUWVBFX1VOS05PV046CisJb2sgPSAxOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwlvayA9IDA7CisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IHNtaV9jaGVja19yYW5nZShTbWlUeXBlICpzbWlUeXBlLCBzdHJ1Y3QgYmUgKmVsZW0pCit7CisgICAgICAgIFNtaVJhbmdlICpzbWlSYW5nZTsKKwlpbnQgb2sgPSAxOworCisJZm9yIChzbWlSYW5nZSA9IHNtaUdldEZpcnN0UmFuZ2Uoc21pVHlwZSk7CisJICAgICBzbWlSYW5nZTsKKwkgICAgIHNtaVJhbmdlID0gc21pR2V0TmV4dFJhbmdlKHNtaVJhbmdlKSkgeworCisJICAgIG9rID0gc21pX2NoZWNrX2FfcmFuZ2Uoc21pVHlwZSwgc21pUmFuZ2UsIGVsZW0pOworCisJICAgIGlmIChvaykgeworCQlicmVhazsKKwkgICAgfQorCX0KKworCWlmIChvaykgeworCSAgICBTbWlUeXBlICpwYXJlbnRUeXBlOworCSAgICBwYXJlbnRUeXBlID0gc21pR2V0UGFyZW50VHlwZShzbWlUeXBlKTsKKwkgICAgaWYgKHBhcmVudFR5cGUpIHsKKwkJb2sgPSBzbWlfY2hlY2tfcmFuZ2UocGFyZW50VHlwZSwgZWxlbSk7CisJICAgIH0KKwl9CisKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBTbWlOb2RlICpzbWlfcHJpbnRfdmFyaWFibGUoc3RydWN0IGJlICplbGVtLCBpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpbnQgb2lkWzEyOF0sIG9pZGxlbjsKKwlTbWlOb2RlICpzbWlOb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCSpzdGF0dXMgPSBzbWlfZGVjb2RlX29pZChlbGVtLCBvaWQsIHNpemVvZihvaWQpL3NpemVvZih1bnNpZ25lZCBpbnQpLAorCSAgICAmb2lkbGVuKTsKKwlpZiAoKnN0YXR1cyA8IDApCisJCXJldHVybiBOVUxMOworCXNtaU5vZGUgPSBzbWlHZXROb2RlQnlPSUQob2lkbGVuLCBvaWQpOworCWlmICghIHNtaU5vZGUpIHsKKwkJKnN0YXR1cyA9IGFzbjFfcHJpbnQoZWxlbSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAodmZsYWcpIHsKKwkJZnB1dHMoc21pR2V0Tm9kZU1vZHVsZShzbWlOb2RlKS0+bmFtZSwgc3Rkb3V0KTsKKwkJZnB1dHMoIjo6Iiwgc3Rkb3V0KTsKKwl9CisJZnB1dHMoc21pTm9kZS0+bmFtZSwgc3Rkb3V0KTsKKwlpZiAoc21pTm9kZS0+b2lkbGVuIDwgb2lkbGVuKSB7CisJICAgICAgICBmb3IgKGkgPSBzbWlOb2RlLT5vaWRsZW47IGkgPCBvaWRsZW47IGkrKykgeworCQkgICAgICAgIHByaW50ZigiLiV1Iiwgb2lkW2ldKTsKKwkJfQorCX0KKwkqc3RhdHVzID0gMDsKKwlyZXR1cm4gc21pTm9kZTsKK30KKworc3RhdGljIGludAorc21pX3ByaW50X3ZhbHVlKFNtaU5vZGUgKnNtaU5vZGUsIHVfY2hhciBwZHVpZCwgc3RydWN0IGJlICplbGVtKQoreworCXVuc2lnbmVkIGludCBpLCBvaWRbMTI4XSwgb2lkbGVuOworCVNtaVR5cGUgKnNtaVR5cGU7CisJU21pTmFtZWROdW1iZXIgKm5uOworCWludCBkb25lID0gMDsKKworCWlmICghIHNtaU5vZGUgfHwgISAoc21pTm9kZS0+bm9kZWtpbmQKKwkJCSAgICAmIChTTUlfTk9ERUtJTkRfU0NBTEFSIHwgU01JX05PREVLSU5EX0NPTFVNTikpKSB7CisJICAgIHJldHVybiBhc24xX3ByaW50KGVsZW0pOworCX0KKworCWlmIChlbGVtLT50eXBlID09IEJFX05PU1VDSE9CSkVDVAorCSAgICB8fCBlbGVtLT50eXBlID09IEJFX05PU1VDSElOU1QKKwkgICAgfHwgZWxlbS0+dHlwZSA9PSBCRV9FTkRPRk1JQlZJRVcpIHsKKwkgICAgcmV0dXJuIGFzbjFfcHJpbnQoZWxlbSk7CisJfQorCisJaWYgKE5PVElGWV9DTEFTUyhwZHVpZCkgJiYgc21pTm9kZS0+YWNjZXNzIDwgU01JX0FDQ0VTU19OT1RJRlkpIHsKKwkgICAgZnB1dHMoIltub3ROb3RpZnlhYmxlXSIsIHN0ZG91dCk7CisJfQorCisJaWYgKFJFQURfQ0xBU1MocGR1aWQpICYmIHNtaU5vZGUtPmFjY2VzcyA8IFNNSV9BQ0NFU1NfUkVBRF9PTkxZKSB7CisJICAgIGZwdXRzKCJbbm90UmVhZGFibGVdIiwgc3Rkb3V0KTsKKwl9CisKKwlpZiAoV1JJVEVfQ0xBU1MocGR1aWQpICYmIHNtaU5vZGUtPmFjY2VzcyA8IFNNSV9BQ0NFU1NfUkVBRF9XUklURSkgeworCSAgICBmcHV0cygiW25vdFdyaXRhYmxlXSIsIHN0ZG91dCk7CisJfQorCisJaWYgKFJFU1BPTlNFX0NMQVNTKHBkdWlkKQorCSAgICAmJiBzbWlOb2RlLT5hY2Nlc3MgPT0gU01JX0FDQ0VTU19OT1RfQUNDRVNTSUJMRSkgeworCSAgICBmcHV0cygiW25vQWNjZXNzXSIsIHN0ZG91dCk7CisJfQorCisJc21pVHlwZSA9IHNtaUdldE5vZGVUeXBlKHNtaU5vZGUpOworCWlmICghIHNtaVR5cGUpIHsKKwkgICAgcmV0dXJuIGFzbjFfcHJpbnQoZWxlbSk7CisJfQorCisJaWYgKCEgc21pX2NoZWNrX3R5cGUoc21pVHlwZS0+YmFzZXR5cGUsIGVsZW0tPnR5cGUpKSB7CisJICAgIGZwdXRzKCJbd3JvbmdUeXBlXSIsIHN0ZG91dCk7CisJfQorCisJaWYgKCEgc21pX2NoZWNrX3JhbmdlKHNtaVR5cGUsIGVsZW0pKSB7CisJICAgIGZwdXRzKCJbb3V0T2ZSYW5nZV0iLCBzdGRvdXQpOworCX0KKworCS8qIHJlc29sdmUgYml0cyB0byBuYW1lZCBiaXRzICovCisKKwkvKiBjaGVjayB3aGV0aGVyIGluc3RhbmNlIGlkZW50aWZpZXIgaXMgdmFsaWQgKi8KKworCS8qIGFwcGx5IGRpc3BsYXkgaGludHMgKGludGVnZXIsIG9jdGV0c3RyaW5nKSAqLworCisJLyogY29udmVydCBpbnN0YW5jZSBpZGVudGlmaWVyIHRvIGluZGV4IHR5cGUgdmFsdWVzICovCisKKwlzd2l0Y2ggKGVsZW0tPnR5cGUpIHsKKwljYXNlIEJFX09JRDoKKwkgICAgICAgIGlmIChzbWlUeXBlLT5iYXNldHlwZSA9PSBTTUlfQkFTRVRZUEVfQklUUykgeworCQkgICAgICAgIC8qIHByaW50IGJpdCBsYWJlbHMgKi8KKwkJfSBlbHNlIHsKKwkJICAgICAgICBzbWlfZGVjb2RlX29pZChlbGVtLCBvaWQsCisJCQkJICAgICAgIHNpemVvZihvaWQpL3NpemVvZih1bnNpZ25lZCBpbnQpLAorCQkJCSAgICAgICAmb2lkbGVuKTsKKwkJCXNtaU5vZGUgPSBzbWlHZXROb2RlQnlPSUQob2lkbGVuLCBvaWQpOworCQkJaWYgKHNtaU5vZGUpIHsKKwkJCSAgICAgICAgaWYgKHZmbGFnKSB7CisJCQkJCWZwdXRzKHNtaUdldE5vZGVNb2R1bGUoc21pTm9kZSktPm5hbWUsIHN0ZG91dCk7CisJCQkJCWZwdXRzKCI6OiIsIHN0ZG91dCk7CisJCQkJfQorCQkJCWZwdXRzKHNtaU5vZGUtPm5hbWUsIHN0ZG91dCk7CisJCQkJaWYgKHNtaU5vZGUtPm9pZGxlbiA8IG9pZGxlbikgeworCQkJCSAgICAgICAgZm9yIChpID0gc21pTm9kZS0+b2lkbGVuOworCQkJCQkgICAgIGkgPCBvaWRsZW47IGkrKykgeworCQkJCQkgICAgICAgIHByaW50ZigiLiV1Iiwgb2lkW2ldKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlkb25lKys7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJFX0lOVDoKKwkgICAgICAgIGlmIChzbWlUeXBlLT5iYXNldHlwZSA9PSBTTUlfQkFTRVRZUEVfRU5VTSkgeworCQkgICAgICAgIGZvciAobm4gPSBzbWlHZXRGaXJzdE5hbWVkTnVtYmVyKHNtaVR5cGUpOworCQkJICAgICBubjsKKwkJCSAgICAgbm4gPSBzbWlHZXROZXh0TmFtZWROdW1iZXIobm4pKSB7CisJCQkgICAgICAgICBpZiAobm4tPnZhbHVlLnZhbHVlLmludGVnZXIzMgorCQkJCSAgICAgPT0gZWxlbS0+ZGF0YS5pbnRlZ2VyKSB7CisJCQkJICAgICAgICAgZnB1dHMobm4tPm5hbWUsIHN0ZG91dCk7CisJCQkJCSBwcmludGYoIiglZCkiLCBlbGVtLT5kYXRhLmludGVnZXIpOworCQkJCQkgZG9uZSsrOworCQkJCQkgYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCWlmICghIGRvbmUpIHsKKwkJcmV0dXJuIGFzbjFfcHJpbnQoZWxlbSk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBHZW5lcmFsIFNOTVAgaGVhZGVyCisgKglTRVFVRU5DRSB7CisgKgkJdmVyc2lvbiBJTlRFR0VSIHt2ZXJzaW9uLTEoMCl9LAorICoJCWNvbW11bml0eSBPQ1RFVCBTVFJJTkcsCisgKgkJZGF0YSBBTlkJLS0gUERVcworICoJfQorICogUERVcyBmb3IgYWxsIGJ1dCBUcmFwOiAoc2VlIHJmYzExNTcgZnJvbSBwYWdlIDE1IG9uKQorICoJU0VRVUVOQ0UgeworICoJCXJlcXVlc3QtaWQgSU5URUdFUiwKKyAqCQllcnJvci1zdGF0dXMgSU5URUdFUiwKKyAqCQllcnJvci1pbmRleCBJTlRFR0VSLAorICoJCXZhcmJpbmRsaXN0IFNFUVVFTkNFIE9GCisgKgkJCVNFUVVFTkNFIHsKKyAqCQkJCW5hbWUgT2JqZWN0TmFtZSwKKyAqCQkJCXZhbHVlIE9iamVjdFZhbHVlCisgKgkJCX0KKyAqCX0KKyAqIFBEVSBmb3IgVHJhcDoKKyAqCVNFUVVFTkNFIHsKKyAqCQllbnRlcnByaXNlIE9CSkVDVCBJREVOVElGSUVSLAorICoJCWFnZW50LWFkZHIgTmV0d29ya0FkZHJlc3MsCisgKgkJZ2VuZXJpYy10cmFwIElOVEVHRVIsCisgKgkJc3BlY2lmaWMtdHJhcCBJTlRFR0VSLAorICoJCXRpbWUtc3RhbXAgVGltZVRpY2tzLAorICoJCXZhcmJpbmRsaXN0IFNFUVVFTkNFIE9GCisgKgkJCVNFUVVFTkNFIHsKKyAqCQkJCW5hbWUgT2JqZWN0TmFtZSwKKyAqCQkJCXZhbHVlIE9iamVjdFZhbHVlCisgKgkJCX0KKyAqCX0KKyAqLworCisvKgorICogRGVjb2RlIFNOTVAgdmFyQmluZAorICovCitzdGF0aWMgdm9pZAordmFyYmluZF9wcmludCh1X2NoYXIgcGR1aWQsIGNvbnN0IHVfY2hhciAqbnAsIHVfaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmUgZWxlbTsKKwlpbnQgY291bnQgPSAwLCBpbmQ7CisjaWZkZWYgTElCU01JCisJU21pTm9kZSAqc21pTm9kZSA9IE5VTEw7CisjZW5kaWYKKwlpbnQgc3RhdHVzOworCisJLyogU2VxdWVuY2Ugb2YgdmFyQmluZCAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9TRVEpIHsKKwkJZnB1dHMoIlshU0VRIG9mIHZhcmJpbmRdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJaWYgKCh1X2ludCljb3VudCA8IGxlbmd0aCkKKwkJcHJpbnRmKCJbJWQgZXh0cmEgYWZ0ZXIgU0VRIG9mIHZhcmJpbmRdIiwgbGVuZ3RoIC0gY291bnQpOworCS8qIGRlc2NlbmQgKi8KKwlsZW5ndGggPSBlbGVtLmFzbmxlbjsKKwlucCA9ICh1X2NoYXIgKillbGVtLmRhdGEucmF3OworCisJZm9yIChpbmQgPSAxOyBsZW5ndGggPiAwOyBpbmQrKykgeworCQljb25zdCB1X2NoYXIgKnZiZW5kOworCQl1X2ludCB2Ymxlbmd0aDsKKworCQlmcHV0cygiICIsIHN0ZG91dCk7CisKKwkJLyogU2VxdWVuY2UgKi8KKwkJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCQlyZXR1cm47CisJCWlmIChlbGVtLnR5cGUgIT0gQkVfU0VRKSB7CisJCQlmcHV0cygiWyF2YXJiaW5kXSIsIHN0ZG91dCk7CisJCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJCXJldHVybjsKKwkJfQorCQl2YmVuZCA9IG5wICsgY291bnQ7CisJCXZibGVuZ3RoID0gbGVuZ3RoIC0gY291bnQ7CisJCS8qIGRlc2NlbmQgKi8KKwkJbGVuZ3RoID0gZWxlbS5hc25sZW47CisJCW5wID0gKHVfY2hhciAqKWVsZW0uZGF0YS5yYXc7CisKKwkJLyogb2JqTmFtZSAoT0lEKSAqLworCQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKGVsZW0udHlwZSAhPSBCRV9PSUQpIHsKKwkJCWZwdXRzKCJbb2JqTmFtZSE9T0lEXSIsIHN0ZG91dCk7CisJCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJCXJldHVybjsKKwkJfQorI2lmZGVmIExJQlNNSQorCQlzbWlOb2RlID0gc21pX3ByaW50X3ZhcmlhYmxlKCZlbGVtLCAmc3RhdHVzKTsKKyNlbHNlCisJCXN0YXR1cyA9IGFzbjFfcHJpbnQoJmVsZW0pOworI2VuZGlmCisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuOworCQlsZW5ndGggLT0gY291bnQ7CisJCW5wICs9IGNvdW50OworCisJCWlmIChwZHVpZCAhPSBHRVRSRVEgJiYgcGR1aWQgIT0gR0VUTkVYVFJFUQorCQkgICAgJiYgcGR1aWQgIT0gR0VUQlVMS1JFUSkKKwkJCWZwdXRzKCI9Iiwgc3Rkb3V0KTsKKworCQkvKiBvYmpWYWwgKEFOWSkgKi8KKwkJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCQlyZXR1cm47CisJCWlmIChwZHVpZCA9PSBHRVRSRVEgfHwgcGR1aWQgPT0gR0VUTkVYVFJFUQorCQkgICAgfHwgcGR1aWQgPT0gR0VUQlVMS1JFUSkgeworCQkJaWYgKGVsZW0udHlwZSAhPSBCRV9OVUxMKSB7CisJCQkJZnB1dHMoIltvYmpWYWwhPU5VTExdIiwgc3Rkb3V0KTsKKwkJCQlpZiAoYXNuMV9wcmludCgmZWxlbSkgPCAwKQorCQkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSB7CisJCSAgICAgICAgaWYgKGVsZW0udHlwZSAhPSBCRV9OVUxMKSB7CisjaWZkZWYgTElCU01JCisJCQkJc3RhdHVzID0gc21pX3ByaW50X3ZhbHVlKHNtaU5vZGUsIHBkdWlkLCAmZWxlbSk7CisjZWxzZQorCQkJCXN0YXR1cyA9IGFzbjFfcHJpbnQoJmVsZW0pOworI2VuZGlmCisJCQl9CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlyZXR1cm47CisJCX0KKwkJbGVuZ3RoID0gdmJsZW5ndGg7CisJCW5wID0gdmJlbmQ7CisJfQorfQorCisvKgorICogRGVjb2RlIFNOTVAgUERVczogR2V0UmVxdWVzdCwgR2V0TmV4dFJlcXVlc3QsIEdldFJlc3BvbnNlLCBTZXRSZXF1ZXN0LAorICogR2V0QnVsaywgSW5mb3JtLCBWMlRyYXAsIGFuZCBSZXBvcnQKKyAqLworc3RhdGljIHZvaWQKK3NubXBwZHVfcHJpbnQodV9zaG9ydCBwZHVpZCwgY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoKQoreworCXN0cnVjdCBiZSBlbGVtOworCWludCBjb3VudCA9IDAsIGVycm9yOworCisJLyogcmVxSWQgKEludGVnZXIpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgeworCQlmcHV0cygiW3JlcUlkIT1JTlRdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJaWYgKHZmbGFnKQorCQlwcmludGYoIlI9JWQgIiwgZWxlbS5kYXRhLmludGVnZXIpOworCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCS8qIGVycm9yU3RhdHVzIChJbnRlZ2VyKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIltlcnJvclN0YXR1cyE9SU5UXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWVycm9yID0gMDsKKwlpZiAoKHBkdWlkID09IEdFVFJFUSB8fCBwZHVpZCA9PSBHRVRORVhUUkVRIHx8IHBkdWlkID09IFNFVFJFUQorCSAgICB8fCBwZHVpZCA9PSBJTkZPUk1SRVEgfHwgcGR1aWQgPT0gVjJUUkFQIHx8IHBkdWlkID09IFJFUE9SVCkKKwkgICAgJiYgZWxlbS5kYXRhLmludGVnZXIgIT0gMCkgeworCQljaGFyIGVycmJ1ZlsyMF07CisJCXByaW50ZigiW2Vycm9yU3RhdHVzKCVzKSE9MF0iLAorCQkJREVDT0RFX0Vycm9yU3RhdHVzKGVsZW0uZGF0YS5pbnRlZ2VyKSk7CisJfSBlbHNlIGlmIChwZHVpZCA9PSBHRVRCVUxLUkVRKSB7CisJICAgICAgICBwcmludGYoIiBOPSVkIiwgZWxlbS5kYXRhLmludGVnZXIpOworCX0gZWxzZSBpZiAoZWxlbS5kYXRhLmludGVnZXIgIT0gMCkgeworCQljaGFyIGVycmJ1ZlsyMF07CisJCXByaW50ZigiICVzIiwgREVDT0RFX0Vycm9yU3RhdHVzKGVsZW0uZGF0YS5pbnRlZ2VyKSk7CisJCWVycm9yID0gZWxlbS5kYXRhLmludGVnZXI7CisJfQorCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCS8qIGVycm9ySW5kZXggKEludGVnZXIpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgeworCQlmcHV0cygiW2Vycm9ySW5kZXghPUlOVF0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHBkdWlkID09IEdFVFJFUSB8fCBwZHVpZCA9PSBHRVRORVhUUkVRIHx8IHBkdWlkID09IFNFVFJFUQorCSAgICB8fCBwZHVpZCA9PSBJTkZPUk1SRVEgfHwgcGR1aWQgPT0gVjJUUkFQIHx8IHBkdWlkID09IFJFUE9SVCkKKwkgICAgJiYgZWxlbS5kYXRhLmludGVnZXIgIT0gMCkKKwkJcHJpbnRmKCJbZXJyb3JJbmRleCglZCkhPTBdIiwgZWxlbS5kYXRhLmludGVnZXIpOworCWVsc2UgaWYgKHBkdWlkID09IEdFVEJVTEtSRVEpCisJICAgICAgICBwcmludGYoIiBNPSVkIiwgZWxlbS5kYXRhLmludGVnZXIpOworCWVsc2UgaWYgKGVsZW0uZGF0YS5pbnRlZ2VyICE9IDApIHsKKwkJaWYgKCFlcnJvcikKKwkJCXByaW50ZigiW2Vycm9ySW5kZXgoJWQpIHcvbyBlcnJvclN0YXR1c10iLAorCQkJCWVsZW0uZGF0YS5pbnRlZ2VyKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIkAlZCIsIGVsZW0uZGF0YS5pbnRlZ2VyKTsKKwkJCWVycm9yID0gZWxlbS5kYXRhLmludGVnZXI7CisJCX0KKwl9IGVsc2UgaWYgKGVycm9yKSB7CisJCWZwdXRzKCJbZXJyb3JJbmRleD09MF0iLCBzdGRvdXQpOworCQllcnJvciA9IDA7CisJfQorCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCXZhcmJpbmRfcHJpbnQocGR1aWQsIG5wLCBsZW5ndGgpOworCXJldHVybjsKK30KKworLyoKKyAqIERlY29kZSBTTk1QIFRyYXAgUERVCisgKi8KK3N0YXRpYyB2b2lkCit0cmFwcGR1X3ByaW50KGNvbnN0IHVfY2hhciAqbnAsIHVfaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgYmUgZWxlbTsKKwlpbnQgY291bnQgPSAwLCBnZW5lcmljOworCisJcHV0Y2hhcignICcpOworCisJLyogZW50ZXJwcmlzZSAob2lkKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9PSUQpIHsKKwkJZnB1dHMoIltlbnRlcnByaXNlIT1PSURdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJaWYgKGFzbjFfcHJpbnQoJmVsZW0pIDwgMCkKKwkJcmV0dXJuOworCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCXB1dGNoYXIoJyAnKTsKKworCS8qIGFnZW50LWFkZHIgKGluZXRhZGRyKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTkVUQUREUikgeworCQlmcHV0cygiW2FnZW50LWFkZHIhPUlORVRBRERSXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWlmIChhc24xX3ByaW50KCZlbGVtKSA8IDApCisJCXJldHVybjsKKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwkvKiBnZW5lcmljLXRyYXAgKEludGVnZXIpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgeworCQlmcHV0cygiW2dlbmVyaWMtdHJhcCE9SU5UXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWdlbmVyaWMgPSBlbGVtLmRhdGEuaW50ZWdlcjsKKwl7CisJCWNoYXIgYnVmWzIwXTsKKwkJcHJpbnRmKCIgJXMiLCBERUNPREVfR2VuZXJpY1RyYXAoZ2VuZXJpYykpOworCX0KKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwkvKiBzcGVjaWZpYy10cmFwIChJbnRlZ2VyKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIltzcGVjaWZpYy10cmFwIT1JTlRdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJaWYgKGdlbmVyaWMgIT0gR1RfRU5URVJQUklTRSkgeworCQlpZiAoZWxlbS5kYXRhLmludGVnZXIgIT0gMCkKKwkJCXByaW50ZigiW3NwZWNpZmljLXRyYXAoJWQpIT0wXSIsIGVsZW0uZGF0YS5pbnRlZ2VyKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCIgcz0lZCIsIGVsZW0uZGF0YS5pbnRlZ2VyKTsKKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwlwdXRjaGFyKCcgJyk7CisKKwkvKiB0aW1lLXN0YW1wIChUaW1lVGlja3MpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX1VOUykgewkJCS8qIFhYWCAqLworCQlmcHV0cygiW3RpbWUtc3RhbXAhPVRJTUVUSUNLU10iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoYXNuMV9wcmludCgmZWxlbSkgPCAwKQorCQlyZXR1cm47CisJbGVuZ3RoIC09IGNvdW50OworCW5wICs9IGNvdW50OworCisJdmFyYmluZF9wcmludCAoVFJBUCwgbnAsIGxlbmd0aCk7CisJcmV0dXJuOworfQorCisvKgorICogRGVjb2RlIGFyYml0cmFyeSBTTk1QIFBEVXMuCisgKi8KK3N0YXRpYyB2b2lkCitwZHVfcHJpbnQoY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoLCBpbnQgdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYmUgcGR1OworCWludCBjb3VudCA9IDA7CisKKwkvKiBQRFUgKENvbnRleHQpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJnBkdSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChwZHUudHlwZSAhPSBCRV9QRFUpIHsKKwkJZnB1dHMoIltubyBQRFVdIiwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHVfaW50KWNvdW50IDwgbGVuZ3RoKQorCQlwcmludGYoIlslZCBleHRyYSBhZnRlciBQRFVdIiwgbGVuZ3RoIC0gY291bnQpOworCWlmICh2ZmxhZykgeworCQlmcHV0cygieyAiLCBzdGRvdXQpOworCX0KKwlpZiAoYXNuMV9wcmludCgmcGR1KSA8IDApCisJCXJldHVybjsKKwlmcHV0cygiICIsIHN0ZG91dCk7CisJLyogZGVzY2VuZCBpbnRvIFBEVSAqLworCWxlbmd0aCA9IHBkdS5hc25sZW47CisJbnAgPSAodV9jaGFyICopcGR1LmRhdGEucmF3OworCisJaWYgKHZlcnNpb24gPT0gU05NUF9WRVJTSU9OXzEgJiYKKwkgICAgKHBkdS5pZCA9PSBHRVRCVUxLUkVRIHx8IHBkdS5pZCA9PSBJTkZPUk1SRVEgfHwKKwkgICAgIHBkdS5pZCA9PSBWMlRSQVAgfHwgcGR1LmlkID09IFJFUE9SVCkpIHsKKwkgICAgICAgIHByaW50ZigiW3YyIFBEVSBpbiB2MSBtZXNzYWdlXSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZlcnNpb24gPT0gU05NUF9WRVJTSU9OXzIgJiYgcGR1LmlkID09IFRSQVApIHsKKwkgICAgICAgIHByaW50ZigiW3YxIFBEVSBpbiB2MiBtZXNzYWdlXSIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChwZHUuaWQpIHsKKwljYXNlIFRSQVA6CisJCXRyYXBwZHVfcHJpbnQobnAsIGxlbmd0aCk7CisJCWJyZWFrOworCWNhc2UgR0VUUkVROgorCWNhc2UgR0VUTkVYVFJFUToKKwljYXNlIEdFVFJFU1A6CisJY2FzZSBTRVRSRVE6CisJY2FzZSBHRVRCVUxLUkVROgorCWNhc2UgSU5GT1JNUkVROgorCWNhc2UgVjJUUkFQOgorCWNhc2UgUkVQT1JUOgorCQlzbm1wcGR1X3ByaW50KHBkdS5pZCwgbnAsIGxlbmd0aCk7CisJCWJyZWFrOworCX0KKworCWlmICh2ZmxhZykgeworCQlmcHV0cygiIH0gIiwgc3Rkb3V0KTsKKwl9Cit9CisKKy8qCisgKiBEZWNvZGUgYSBzY29wZWQgU05NUCBQRFUuCisgKi8KK3N0YXRpYyB2b2lkCitzY29wZWRwZHVfcHJpbnQoY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoLCBpbnQgdmVyc2lvbikKK3sKKwlzdHJ1Y3QgYmUgZWxlbTsKKwlpbnQgaSwgY291bnQgPSAwOworCisJLyogU2VxdWVuY2UgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU0VRKSB7CisJCWZwdXRzKCJbIXNjb3BlZCBQRFVdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gZWxlbS5hc25sZW47CisJbnAgPSAodV9jaGFyICopZWxlbS5kYXRhLnJhdzsKKworCS8qIGNvbnRleHRFbmdpbmVJRCAoT0NURVQgU1RSSU5HKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKKwkJZnB1dHMoIltjb250ZXh0RW5naW5lSUQhPVNUUl0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwlmcHV0cygiRT0gIiwgc3Rkb3V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgKGludCllbGVtLmFzbmxlbjsgaSsrKSB7CisgICAgICAgICAgICBwcmludGYoIjB4JTAyWCIsIGVsZW0uZGF0YS5zdHJbaV0pOworICAgICAgICB9CisJZnB1dHMoIiAiLCBzdGRvdXQpOworCisJLyogY29udGV4dE5hbWUgKE9DVEVUIFNUUklORykgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7CisJCWZwdXRzKCJbY29udGV4dE5hbWUhPVNUUl0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwlwcmludGYoIkM9JS4qcyAiLCAoaW50KWVsZW0uYXNubGVuLCBlbGVtLmRhdGEuc3RyKTsKKworCXBkdV9wcmludChucCwgbGVuZ3RoLCB2ZXJzaW9uKTsKK30KKworLyoKKyAqIERlY29kZSBTTk1QIENvbW11bml0eSBIZWFkZXIgKFNOTVB2MSBhbmQgU05NUHYyYykKKyAqLworc3RhdGljIHZvaWQKK2NvbW11bml0eV9wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgsIGludCB2ZXJzaW9uKQoreworCXN0cnVjdCBiZSBlbGVtOworCWludCBjb3VudCA9IDA7CisKKwkvKiBDb21tdW5pdHkgKFN0cmluZykgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7CisJCWZwdXRzKCJbY29tbSE9U1RSXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCS8qIGRlZmF1bHQgY29tbXVuaXR5ICovCisJaWYgKCEoZWxlbS5hc25sZW4gPT0gc2l6ZW9mKERFRl9DT01NVU5JVFkpIC0gMSAmJgorCSAgICBzdHJuY21wKChjaGFyICopZWxlbS5kYXRhLnN0ciwgREVGX0NPTU1VTklUWSwKKwkgICAgICAgICAgICBzaXplb2YoREVGX0NPTU1VTklUWSkgLSAxKSA9PSAwKSkKKwkJLyogISAicHVibGljIiAqLworCQlwcmludGYoIkM9JS4qcyAiLCAoaW50KWVsZW0uYXNubGVuLCBlbGVtLmRhdGEuc3RyKTsKKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwlwZHVfcHJpbnQobnAsIGxlbmd0aCwgdmVyc2lvbik7Cit9CisKKy8qCisgKiBEZWNvZGUgU05NUHYzIFVzZXItYmFzZWQgU2VjdXJpdHkgTWVzc2FnZSBIZWFkZXIgKFNOTVB2MykKKyAqLworc3RhdGljIHZvaWQKK3VzbV9wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgpCit7CisgICAgICAgIHN0cnVjdCBiZSBlbGVtOworCWludCBjb3VudCA9IDA7CisKKwkvKiBTZXF1ZW5jZSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9TRVEpIHsKKwkJZnB1dHMoIlshdXNtXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWxlbmd0aCA9IGVsZW0uYXNubGVuOworCW5wID0gKHVfY2hhciAqKWVsZW0uZGF0YS5yYXc7CisKKwkvKiBtc2dBdXRob3JpdGF0aXZlRW5naW5lSUQgKE9DVEVUIFNUUklORykgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7CisJCWZwdXRzKCJbbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIT1TVFJdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoIC09IGNvdW50OworCW5wICs9IGNvdW50OworCisJLyogbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIChJTlRFR0VSKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIlttc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMhPUlOVF0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmZsYWcpCisJICAgICAgICBwcmludGYoIkI9JWQgIiwgZWxlbS5kYXRhLmludGVnZXIpOworCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCS8qIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIChJTlRFR0VSKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIlttc2dBdXRob3JpdGF0aXZlRW5naW5lVGltZSE9SU5UXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWlmICh2ZmxhZykKKwkgICAgICAgIHByaW50ZigiVD0lZCAiLCBlbGVtLmRhdGEuaW50ZWdlcik7CisJbGVuZ3RoIC09IGNvdW50OworCW5wICs9IGNvdW50OworCisJLyogbXNnVXNlck5hbWUgKE9DVEVUIFNUUklORykgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7CisJCWZwdXRzKCJbbXNnVXNlck5hbWUhPVNUUl0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggLT0gY291bnQ7CisgICAgICAgIG5wICs9IGNvdW50OworCisJcHJpbnRmKCJVPSUuKnMgIiwgKGludCllbGVtLmFzbmxlbiwgZWxlbS5kYXRhLnN0cik7CisKKwkvKiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMgKE9DVEVUIFNUUklORykgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7CisJCWZwdXRzKCJbbXNnQXV0aGVudGljYXRpb25QYXJhbWV0ZXJzIT1TVFJdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoIC09IGNvdW50OworICAgICAgICBucCArPSBjb3VudDsKKworCS8qIG1zZ1ByaXZhY3lQYXJhbWV0ZXJzIChPQ1RFVCBTVFJJTkcpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX1NUUikgeworCQlmcHV0cygiW21zZ1ByaXZhY3lQYXJhbWV0ZXJzIT1TVFJdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoIC09IGNvdW50OworICAgICAgICBucCArPSBjb3VudDsKKworCWlmICgodV9pbnQpY291bnQgPCBsZW5ndGgpCisJCXByaW50ZigiWyVkIGV4dHJhIGFmdGVyIHVzbSBTRVFdIiwgbGVuZ3RoIC0gY291bnQpOworfQorCisvKgorICogRGVjb2RlIFNOTVB2MyBNZXNzYWdlIEhlYWRlciAoU05NUHYzKQorICovCitzdGF0aWMgdm9pZAordjNtc2dfcHJpbnQoY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoKQoreworCXN0cnVjdCBiZSBlbGVtOworCWludCBjb3VudCA9IDA7CisJdV9jaGFyIGZsYWdzOworCWludCBtb2RlbDsKKwljb25zdCB1X2NoYXIgKnhucCA9IG5wOworCWludCB4bGVuZ3RoID0gbGVuZ3RoOworCisJLyogU2VxdWVuY2UgKi8KKwlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKKwkJcmV0dXJuOworCWlmIChlbGVtLnR5cGUgIT0gQkVfU0VRKSB7CisJCWZwdXRzKCJbIW1lc3NhZ2VdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoID0gZWxlbS5hc25sZW47CisJbnAgPSAodV9jaGFyICopZWxlbS5kYXRhLnJhdzsKKworCWlmICh2ZmxhZykgeworCQlmcHV0cygieyAiLCBzdGRvdXQpOworCX0KKworCS8qIG1zZ0lEIChJTlRFR0VSKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIlttc2dJRCE9SU5UXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCS8qIG1zZ01heFNpemUgKElOVEVHRVIpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgeworCQlmcHV0cygiW21zZ01heFNpemUhPUlOVF0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwkvKiBtc2dGbGFncyAoT0NURVQgU1RSSU5HKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKKwkJZnB1dHMoIlttc2dGbGFncyE9U1RSXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWlmIChlbGVtLmFzbmxlbiAhPSAxKSB7CisJICAgICAgICBwcmludGYoIlttc2dGbGFncyBzaXplICVkXSIsIGVsZW0uYXNubGVuKTsKKwkJcmV0dXJuOworCX0KKwlmbGFncyA9IGVsZW0uZGF0YS5zdHJbMF07CisJaWYgKGZsYWdzICE9IDB4MDAgJiYgZmxhZ3MgIT0gMHgwMSAmJiBmbGFncyAhPSAweDAzCisJICAgICYmIGZsYWdzICE9IDB4MDQgJiYgZmxhZ3MgIT0gMHgwNSAmJiBmbGFncyAhPSAweDA3KSB7CisJCXByaW50ZigiW21zZ0ZsYWdzPTB4JTAyWF0iLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoIC09IGNvdW50OworCW5wICs9IGNvdW50OworCisJZnB1dHMoIkY9Iiwgc3Rkb3V0KTsKKwlpZiAoZmxhZ3MgJiAweDAxKSBmcHV0cygiYSIsIHN0ZG91dCk7CisJaWYgKGZsYWdzICYgMHgwMikgZnB1dHMoInAiLCBzdGRvdXQpOworCWlmIChmbGFncyAmIDB4MDQpIGZwdXRzKCJyIiwgc3Rkb3V0KTsKKwlmcHV0cygiICIsIHN0ZG91dCk7CisKKwkvKiBtc2dTZWN1cml0eU1vZGVsIChJTlRFR0VSKSAqLworCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQorCQlyZXR1cm47CisJaWYgKGVsZW0udHlwZSAhPSBCRV9JTlQpIHsKKwkJZnB1dHMoIlttc2dTZWN1cml0eU1vZGVsIT1JTlRdIiwgc3Rkb3V0KTsKKwkJYXNuMV9wcmludCgmZWxlbSk7CisJCXJldHVybjsKKwl9CisJbW9kZWwgPSBlbGVtLmRhdGEuaW50ZWdlcjsKKwlsZW5ndGggLT0gY291bnQ7CisJbnAgKz0gY291bnQ7CisKKwlpZiAoKHVfaW50KWNvdW50IDwgbGVuZ3RoKQorCQlwcmludGYoIlslZCBleHRyYSBhZnRlciBtZXNzYWdlIFNFUV0iLCBsZW5ndGggLSBjb3VudCk7CisKKwlpZiAodmZsYWcpIHsKKwkJZnB1dHMoIn0gIiwgc3Rkb3V0KTsKKwl9CisKKwlpZiAobW9kZWwgPT0gMykgeworCSAgICBpZiAodmZsYWcpIHsKKwkJZnB1dHMoInsgVVNNICIsIHN0ZG91dCk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwcmludGYoIltzZWN1cml0eSBtb2RlbCAlZF0iLCBtb2RlbCk7CisgICAgICAgICAgICByZXR1cm47CisJfQorCisJbnAgPSB4bnAgKyAobnAgLSB4bnApOworCWxlbmd0aCA9IHhsZW5ndGggLSAobnAgLSB4bnApOworCisJLyogbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIChPQ1RFVCBTVFJJTkcpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX1NUUikgeworCQlmcHV0cygiW21zZ1NlY3VyaXR5UGFyYW1ldGVycyE9U1RSXSIsIHN0ZG91dCk7CisJCWFzbjFfcHJpbnQoJmVsZW0pOworCQlyZXR1cm47CisJfQorCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCWlmIChtb2RlbCA9PSAzKSB7CisJICAgIHVzbV9wcmludChlbGVtLmRhdGEuc3RyLCBlbGVtLmFzbmxlbik7CisJICAgIGlmICh2ZmxhZykgeworCQlmcHV0cygifSAiLCBzdGRvdXQpOworCSAgICB9CisJfQorCisJaWYgKHZmbGFnKSB7CisJICAgIGZwdXRzKCJ7IFNjb3BlZFBEVSAiLCBzdGRvdXQpOworCX0KKworCXNjb3BlZHBkdV9wcmludChucCwgbGVuZ3RoLCAzKTsKKworCWlmICh2ZmxhZykgeworCQlmcHV0cygifSAiLCBzdGRvdXQpOworCX0KK30KKworLyoKKyAqIERlY29kZSBTTk1QIGhlYWRlciBhbmQgcGFzcyBvbiB0byBQRFUgcHJpbnRpbmcgcm91dGluZXMKKyAqLwordm9pZAorc25tcF9wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgpCit7CisJc3RydWN0IGJlIGVsZW07CisJaW50IGNvdW50ID0gMDsKKwlpbnQgdmVyc2lvbiA9IDA7CisKKwlwdXRjaGFyKCcgJyk7CisKKwkvKiBpbml0aWFsIFNlcXVlbmNlICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX1NFUSkgeworCQlmcHV0cygiWyFpbml0IFNFUV0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHVfaW50KWNvdW50IDwgbGVuZ3RoKQorCQlwcmludGYoIlslZCBleHRyYSBhZnRlciBpU0VRXSIsIGxlbmd0aCAtIGNvdW50KTsKKwkvKiBkZXNjZW5kICovCisJbGVuZ3RoID0gZWxlbS5hc25sZW47CisJbnAgPSAodV9jaGFyICopZWxlbS5kYXRhLnJhdzsKKworCS8qIFZlcnNpb24gKElOVEVHRVIpICovCisJaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCisJCXJldHVybjsKKwlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgeworCQlmcHV0cygiW3ZlcnNpb24hPUlOVF0iLCBzdGRvdXQpOworCQlhc24xX3ByaW50KCZlbGVtKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZWxlbS5kYXRhLmludGVnZXIpIHsKKwljYXNlIFNOTVBfVkVSU0lPTl8xOgorCWNhc2UgU05NUF9WRVJTSU9OXzI6CisJY2FzZSBTTk1QX1ZFUlNJT05fMzoKKwkgICAgICAgIGlmICh2ZmxhZykKKwkJICAgICAgICBwcmludGYoInsgJXMgIiwgU25tcFZlcnNpb25bZWxlbS5kYXRhLmludGVnZXJdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgICAgIHByaW50ZigiW3ZlcnNpb24gPSAlZF0iLCBlbGVtLmRhdGEuaW50ZWdlcik7CisJCXJldHVybjsKKwl9CisJdmVyc2lvbiA9IGVsZW0uZGF0YS5pbnRlZ2VyOworCWxlbmd0aCAtPSBjb3VudDsKKwlucCArPSBjb3VudDsKKworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgU05NUF9WRVJTSU9OXzE6CisgICAgICAgIGNhc2UgU05NUF9WRVJTSU9OXzI6CisJCWNvbW11bml0eV9wcmludChucCwgbGVuZ3RoLCB2ZXJzaW9uKTsKKwkJYnJlYWs7CisJY2FzZSBTTk1QX1ZFUlNJT05fMzoKKwkJdjNtc2dfcHJpbnQobnAsIGxlbmd0aCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJICAgICAgICBwcmludGYoIlt2ZXJzaW9uID0gJWRdIiwgZWxlbS5kYXRhLmludGVnZXIpOworCQlicmVhazsKKwl9CisKKwlpZiAodmZsYWcpIHsKKwkJZnB1dHMoIn0gIiwgc3Rkb3V0KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wcmludC1zdHAuYyBiL3ByaW50LXN0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDhhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1zdHAuYwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBMZW5uZXJ0IEJ1eXRlbmhlaworICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICoKKyAqIEZvcm1hdCBhbmQgcHJpbnQgSUVFRSA4MDIuMWQgc3Bhbm5pbmcgdHJlZSBwcm90b2NvbCBwYWNrZXRzLgorICogQ29udHJpYnV0ZWQgYnkgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAZ251Lm9yZz4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXN0cC5jLHYgMS4xMy4yLjcgMjAwNy8wMy8xOCAxNzoxMjozNiBoYW5uZXMgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2RlZmluZQlSU1RQX0VYVFJBQ1RfUE9SVF9ST0xFKHgpICgoKHgpJjB4MEMpPj4yKSAKKy8qIFNUUCB0aW1lcnMgYXJlIGV4cHJlc3NlZCBpbiBtdWx0aXBsZXMgb2YgMS8yNTZ0aCBzZWNvbmQgKi8KKyNkZWZpbmUgU1RQX1RJTUVfQkFTRSAyNTYKKyNkZWZpbmUgU1RQX0JQRFVfTVNUUF9NSU5fTEVOIDEwMgorCitzdHJ1Y3Qgc3RwX2JwZHVfIHsKKyAgICB1X2ludDhfdCBwcm90b2NvbF9pZFsyXTsKKyAgICB1X2ludDhfdCBwcm90b2NvbF92ZXJzaW9uOworICAgIHVfaW50OF90IGJwZHVfdHlwZTsKKyAgICB1X2ludDhfdCBmbGFnczsKKyAgICB1X2ludDhfdCByb290X2lkWzhdOworICAgIHVfaW50OF90IHJvb3RfcGF0aF9jb3N0WzRdOworICAgIHVfaW50OF90IGJyaWRnZV9pZFs4XTsKKyAgICB1X2ludDhfdCBwb3J0X2lkWzJdOworICAgIHVfaW50OF90IG1lc3NhZ2VfYWdlWzJdOworICAgIHVfaW50OF90IG1heF9hZ2VbMl07CisgICAgdV9pbnQ4X3QgaGVsbG9fdGltZVsyXTsKKyAgICB1X2ludDhfdCBmb3J3YXJkX2RlbGF5WzJdOworICAgIHVfaW50OF90IHYxX2xlbmd0aDsKK307CisKKyNkZWZpbmUgU1RQX1BST1RPX1JFR1VMQVIgMHgwMAorI2RlZmluZSBTVFBfUFJPVE9fUkFQSUQgICAweDAyCisjZGVmaW5lIFNUUF9QUk9UT19NU1RQICAgIDB4MDMKKworc3RydWN0IHRvayBzdHBfcHJvdG9fdmFsdWVzW10gPSB7CisgICAgeyBTVFBfUFJPVE9fUkVHVUxBUiwgIjgwMi4xZCIgfSwKKyAgICB7IFNUUF9QUk9UT19SQVBJRCwgIjgwMi4xdyIgfSwKKyAgICB7IFNUUF9QUk9UT19NU1RQLCAiODAyLjFzIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKKyNkZWZpbmUgU1RQX0JQRFVfVFlQRV9DT05GSUcgICAgICAweDAwCisjZGVmaW5lIFNUUF9CUERVX1RZUEVfUlNUUCAgICAgICAgMHgwMgorI2RlZmluZSBTVFBfQlBEVV9UWVBFX1RPUE9fQ0hBTkdFIDB4ODAKKworc3RydWN0IHRvayBzdHBfYnBkdV9mbGFnX3ZhbHVlc1tdID0geworICAgIHsgMHgwMSwgIlRvcG9sb2d5IGNoYW5nZSIgfSwKKyAgICB7IDB4MDIsICJQcm9wb3NhbCIgfSwKKyAgICB7IDB4MTAsICJMZWFybiIgfSwKKyAgICB7IDB4MjAsICJGb3J3YXJkIiB9LAorICAgIHsgMHg0MCwgIkFncmVlbWVudCIgfSwKKyAgICB7IDB4ODAsICJUb3BvbG9neSBjaGFuZ2UgQUNLIiB9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0cnVjdCB0b2sgc3RwX2JwZHVfdHlwZV92YWx1ZXNbXSA9IHsKKyAgICB7IFNUUF9CUERVX1RZUEVfQ09ORklHLCAiQ29uZmlnIiB9LAorICAgIHsgU1RQX0JQRFVfVFlQRV9SU1RQLCAiUmFwaWQgU1RQIiB9LAorICAgIHsgU1RQX0JQRFVfVFlQRV9UT1BPX0NIQU5HRSwgIlRvcG9sb2d5IENoYW5nZSIgfSwKKyAgICB7IDAsIE5VTEx9Cit9OworCitzdHJ1Y3QgdG9rIHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXNbXSA9IHsKKyAgICB7IDB4MDAsICJVbmtub3duIiB9LAorICAgIHsgMHgwMSwgIkFsdGVybmF0ZSIgfSwKKyAgICB7IDB4MDIsICJSb290IiB9LAorICAgIHsgMHgwMywgIkRlc2lnbmF0ZWQiIH0sCisgICAgeyAwLCBOVUxMfQorfTsKKworc3RhdGljIGNoYXIgKgorc3RwX3ByaW50X2JyaWRnZV9pZChjb25zdCB1X2NoYXIgKnApCit7CisgICAgc3RhdGljIGNoYXIgYnJpZGdlX2lkX3N0cltzaXplb2YoInBwcHAuYWE6YmI6Y2M6ZGQ6ZWU6ZmYiKV07CisKKyAgICBzbnByaW50ZihicmlkZ2VfaWRfc3RyLCBzaXplb2YoYnJpZGdlX2lkX3N0ciksCisgICAgICAgICAgICAgIiUuMnglLjJ4LiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4IiwKKyAgICAgICAgICAgICBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdLCBwWzddKTsKKworICAgIHJldHVybiBicmlkZ2VfaWRfc3RyOworfQorCitzdGF0aWMgdm9pZAorc3RwX3ByaW50X2NvbmZpZ19icGR1KGNvbnN0IHN0cnVjdCBzdHBfYnBkdV8gKnN0cF9icGR1LCB1X2ludCBsZW5ndGgpCit7CisgICAgcHJpbnRmKCIsIEZsYWdzIFslc10iLAorICAgICAgICAgICBiaXR0b2syc3RyKHN0cF9icGR1X2ZsYWdfdmFsdWVzLCAibm9uZSIsIHN0cF9icGR1LT5mbGFncykpOworCisgICAgcHJpbnRmKCIsIGJyaWRnZS1pZCAlcy4lMDR4LCBsZW5ndGggJXUiLAorICAgICAgICAgICBzdHBfcHJpbnRfYnJpZGdlX2lkKChjb25zdCB1X2NoYXIgKikmc3RwX2JwZHUtPmJyaWRnZV9pZCksCisgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+cG9ydF9pZCksIGxlbmd0aCk7CisKKyAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgcHJpbnQgdGhlIGJyaWRnZS1pZCAqLworICAgIGlmICghdmZsYWcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaW50ZigiXG5cdG1lc3NhZ2UtYWdlICUuMmZzLCBtYXgtYWdlICUuMmZzIgorICAgICAgICAgICAiLCBoZWxsby10aW1lICUuMmZzLCBmb3J3YXJkaW5nLWRlbGF5ICUuMmZzIiwKKyAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+bWVzc2FnZV9hZ2UpIC8gU1RQX1RJTUVfQkFTRSwKKyAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+bWF4X2FnZSkgLyBTVFBfVElNRV9CQVNFLAorICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5oZWxsb190aW1lKSAvIFNUUF9USU1FX0JBU0UsCisgICAgICAgICAgIChmbG9hdClFWFRSQUNUXzE2QklUUygmc3RwX2JwZHUtPmZvcndhcmRfZGVsYXkpIC8gU1RQX1RJTUVfQkFTRSk7CisKKyAgICBwcmludGYoIlxuXHRyb290LWlkICVzLCByb290LXBhdGhjb3N0ICV1IiwKKyAgICAgICAgICAgc3RwX3ByaW50X2JyaWRnZV9pZCgoY29uc3QgdV9jaGFyICopJnN0cF9icGR1LT5yb290X2lkKSwKKyAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnN0cF9icGR1LT5yb290X3BhdGhfY29zdCkpOworCisgICAgLyogUG9ydCByb2xlIGlzIG9ubHkgdmFsaWQgZm9yIDgwMi4xdyAqLworICAgIGlmIChzdHBfYnBkdS0+cHJvdG9jb2xfdmVyc2lvbiA9PSBTVFBfUFJPVE9fUkFQSUQpIHsKKyAgICAgICAgcHJpbnRmKCIsIHBvcnQtcm9sZSAlcyIsCisgICAgICAgICAgICAgICB0b2syc3RyKHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXMsICJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUlNUUF9FWFRSQUNUX1BPUlRfUk9MRShzdHBfYnBkdS0+ZmxhZ3MpKSk7CisgICAgfQorfQorCisvKgorICogTVNUUCBwYWNrZXQgZm9ybWF0CisgKiBSZWYuIElFRUUgODAyLjFRIDIwMDMgRWQuIFNlY3Rpb24gMTQKKyAqCisgKiBNU1RQIEJQRFUKKyAqCisgKiAyIC0gIGJ5dGVzIFByb3RvY29sIElkCisgKiAxIC0gIGJ5dGUgIFByb3RvY29sIFZlci4gCisgKiAxIC0gIGJ5dGUgIEJQRFUgdHllCisgKiAxIC0gIGJ5dGUgIEZsYWdzCisgKiA4IC0gIGJ5dGVzIENJU1QgUm9vdCBJZGVudGlmaWVyCisgKiA0IC0gIGJ5dGVzIENJU1QgRXh0ZXJuYWwgUGF0aCBDb3N0CisgKiA4IC0gIGJ5dGVzIENJU1QgUmVnaW9uYWwgUm9vdCBJZGVudGlmaWVyCisgKiAyIC0gIGJ5dGVzIENJU1QgUG9ydCBJZGVudGlmaWVyCisgKiAyIC0gIGJ5dGVzIE1lc3NhZ2UgQWdlCisgKiAyIC0gIGJ5dGVzIE1heCBhZ2UKKyAqIDIgLSAgYnl0ZXMgSGVsbG8gVGltZQorICogMiAtICBieXRlcyBGb3J3YXJkIGRlbGF5CisgKiAxIC0gIGJ5dGUgIFZlcnNpb24gMSBsZW5ndGguIE11c3QgYmUgMAorICogMiAtICBieXRlcyBWZXJzaW9uIDMgbGVuZ3RoCisgKiAxIC0gIGJ5dGUgIENvbmZpZyBJZGVudGlmaWVyCisgKiAzMiAtIGJ5dGVzIENvbmZpZyBOYW1lCisgKiAyIC0gIGJ5dGVzIFJldmlzaW9uIGxldmVsCisgKiAxNiAtIGJ5dGVzIENvbmZpZyBEaWdlc3QgW01ENV0KKyAqIDQgLSAgYnl0ZXMgQ0lTVCBJbnRlcm5hbCBSb290IFBhdGggQ29zdAorICogOCAtICBieXRlcyBDSVNUIEJyaWRnZSBJZGVudGlmaWVyCisgKiAxIC0gIGJ5dGUgIENJU1QgUmVtYWluaW5nIEhvcHMKKyAqIDE2IC0gYnl0ZXMgTVNUSSBpbmZvcm1hdGlvbiBbTWF4IDY0IE1TVEksIGVhY2ggMTYgYnl0ZXNdCisgKgorICogTVNUSSBQYXlsb2FkCisgKgorICogMSAtIGJ5dGUgIE1TVEkgZmxhZworICogOCAtIGJ5dGVzIE1TVEkgUmVnaW9uYWwgUm9vdCBJZGVudGlmaWVyCisgKiA0IC0gYnl0ZXMgTVNUSSBSZWdpb25hbCBQYXRoIENvc3QKKyAqIDEgLSBieXRlICBNU1RJIEJyaWRnZSBQcmlvcml0eQorICogMSAtIGJ5dGUgIE1TVEkgUG9ydCBQcmlvcml0eQorICogMSAtIGJ5dGUgIE1TVEkgUmVtYWluaW5nIEhvcHMKKyAqLworCisjZGVmaW5lIE1TVF9CUERVX01TVElfTEVOR1RICQkgICAgMTYKKyNkZWZpbmUgTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RICSAgICA2NAorCisvKiBPZmZzZXRzIG9mIGZpZWxkcyBmcm9tIHRoZSBiZWdnaW5uaW5nIGZvciB0aGUgcGFja2V0ICovCisjZGVmaW5lIE1TVF9CUERVX1ZFUjNfTEVOX09GRlNFVAkgICAgMzYKKyNkZWZpbmUgTVNUX0JQRFVfQ09ORklHX05BTUVfT0ZGU0VUCSAgICAzOQorI2RlZmluZSBNU1RfQlBEVV9DT05GSUdfRElHRVNUX09GRlNFVAkgICAgNzMKKyNkZWZpbmUgTVNUX0JQRFVfQ0lTVF9JTlRfUEFUSF9DT1NUX09GRlNFVCAgODkKKyNkZWZpbmUgTVNUX0JQRFVfQ0lTVF9CUklER0VfSURfT0ZGU0VUCSAgICA5MworI2RlZmluZSBNU1RfQlBEVV9DSVNUX1JFTUFJTl9IT1BTX09GRlNFVCAgICAxMDEKKyNkZWZpbmUgTVNUX0JQRFVfTVNUSV9PRkZTRVQJCSAgICAxMDIKKy8qIE9mZnNldHMgd2l0aGluICBhbiBNU1RJICovCisjZGVmaW5lIE1TVF9CUERVX01TVElfUk9PVF9QUklPX09GRlNFVAkgICAgMQorI2RlZmluZSBNU1RfQlBEVV9NU1RJX1JPT1RfUEFUSF9DT1NUX09GRlNFVCA5CisjZGVmaW5lIE1TVF9CUERVX01TVElfQlJJREdFX1BSSU9fT0ZGU0VUICAgIDEzCisjZGVmaW5lIE1TVF9CUERVX01TVElfUE9SVF9QUklPX09GRlNFVAkgICAgMTQKKyNkZWZpbmUgTVNUX0JQRFVfTVNUSV9SRU1BSU5fSE9QU19PRkZTRVQgICAgMTUKKworc3RhdGljIHZvaWQKK3N0cF9wcmludF9tc3RwX2JwZHUoY29uc3Qgc3RydWN0IHN0cF9icGR1XyAqc3RwX2JwZHUsIHVfaW50IGxlbmd0aCkKK3sKKyAgICBjb25zdCB1X2NoYXIgICAgKnB0cjsKKyAgICB1X2ludDE2X3QJICAgIHYzbGVuOworICAgIHVfaW50MTZfdAkgICAgbGVuOworICAgIHVfaW50MTZfdAkgICAgbXN0aTsKKyAgICB1X2ludDE2X3QJICAgIG9mZnNldDsKKworICAgIHB0ciA9IChjb25zdCB1X2NoYXIgKilzdHBfYnBkdTsKKyAgICBwcmludGYoIiwgQ0lTVCBGbGFncyBbJXNdIiwKKyAgICAgICAgICAgYml0dG9rMnN0cihzdHBfYnBkdV9mbGFnX3ZhbHVlcywgIm5vbmUiLCBzdHBfYnBkdS0+ZmxhZ3MpKTsKKworICAgIC8qCisgICAgICogaW4gbm9uLXZlcmJvc2UgbW9kZSBqdXN0IHByaW50IHRoZSBmbGFncy4gV2UgZG9udCByZWFkIHRoYXQgbXVjaAorICAgICAqIG9mIHRoZSBwYWNrZXQgKERFRkFVTFRfU05BUExFTikgdG8gcHJpbnQgb3V0IGNpc3QgYnJpZGdlLWlkCisgICAgICovCisgICAgaWYgKCF2ZmxhZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCIsIENJU1QgYnJpZGdlLWlkICVzLiUwNHgsIGxlbmd0aCAldSIsCisgICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQocHRyICsgTVNUX0JQRFVfQ0lTVF9CUklER0VfSURfT0ZGU0VUKSwKKyAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5wb3J0X2lkKSwgbGVuZ3RoKTsKKworCisgICAgcHJpbnRmKCJcblx0bWVzc2FnZS1hZ2UgJS4yZnMsIG1heC1hZ2UgJS4yZnMiCisgICAgICAgICAgICIsIGhlbGxvLXRpbWUgJS4yZnMsIGZvcndhcmRpbmctZGVsYXkgJS4yZnMiLAorICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5tZXNzYWdlX2FnZSkgLyBTVFBfVElNRV9CQVNFLAorICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5tYXhfYWdlKSAvIFNUUF9USU1FX0JBU0UsCisgICAgICAgICAgIChmbG9hdClFWFRSQUNUXzE2QklUUygmc3RwX2JwZHUtPmhlbGxvX3RpbWUpIC8gU1RQX1RJTUVfQkFTRSwKKyAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+Zm9yd2FyZF9kZWxheSkgLyBTVFBfVElNRV9CQVNFKTsKKworICAgIHByaW50ZigiXG5cdENJU1Qgcm9vdC1pZCAlcywgZXh0LXBhdGhjb3N0ICV1IGludC1wYXRoY29zdCAldSIsCisgICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQoKGNvbnN0IHVfY2hhciAqKSZzdHBfYnBkdS0+cm9vdF9pZCksCisgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzdHBfYnBkdS0+cm9vdF9wYXRoX2Nvc3QpLAorICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhwdHIgKyBNU1RfQlBEVV9DSVNUX0lOVF9QQVRIX0NPU1RfT0ZGU0VUKSk7CisKKyAgICBwcmludGYoIiwgcG9ydC1yb2xlICVzIiwKKyAgICAgICAgICAgdG9rMnN0cihyc3RwX29ial9wb3J0X3JvbGVfdmFsdWVzLCAiVW5rbm93biIsCisgICAgICAgICAgICAgICAgICAgUlNUUF9FWFRSQUNUX1BPUlRfUk9MRShzdHBfYnBkdS0+ZmxhZ3MpKSk7CisKKyAgICBwcmludGYoIlxuXHRDSVNUIHJlZ2lvbmFsLXJvb3QtaWQgJXMiLAorICAgICAgICAgICBzdHBfcHJpbnRfYnJpZGdlX2lkKChjb25zdCB1X2NoYXIgKikmc3RwX2JwZHUtPmJyaWRnZV9pZCkpOworCisgICAgcHJpbnRmKCJcblx0TVNUUCBDb25maWd1cmF0aW9uIE5hbWUgJXMsIHJldmlzaW9uICV1LCBkaWdlc3QgJTA4eCUwOHglMDh4JTA4eCIsCisgICAgICAgICAgIHB0ciArIE1TVF9CUERVX0NPTkZJR19OQU1FX09GRlNFVCwKKwkgICBFWFRSQUNUXzE2QklUUyhwdHIgKyBNU1RfQlBEVV9DT05GSUdfTkFNRV9PRkZTRVQgKyAzMiksCisJICAgRVhUUkFDVF8zMkJJVFMocHRyICsgTVNUX0JQRFVfQ09ORklHX0RJR0VTVF9PRkZTRVQpLAorCSAgIEVYVFJBQ1RfMzJCSVRTKHB0ciArIE1TVF9CUERVX0NPTkZJR19ESUdFU1RfT0ZGU0VUICsgNCksCisJICAgRVhUUkFDVF8zMkJJVFMocHRyICsgTVNUX0JQRFVfQ09ORklHX0RJR0VTVF9PRkZTRVQgKyA4KSwKKwkgICBFWFRSQUNUXzMyQklUUyhwdHIgKyBNU1RfQlBEVV9DT05GSUdfRElHRVNUX09GRlNFVCArIDEyKSk7CisKKyAgICBwcmludGYoIlxuXHRDSVNUIHJlbWFpbmluZy1ob3BzICVkIiwgcHRyW01TVF9CUERVX0NJU1RfUkVNQUlOX0hPUFNfT0ZGU0VUXSk7CisKKyAgICAvKiBEdW1wIGFsbCBNU1RJJ3MgKi8KKyAgICB2M2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHB0ciArIE1TVF9CUERVX1ZFUjNfTEVOX09GRlNFVCk7CisgICAgaWYgKHYzbGVuID4gTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RIKSB7CisgICAgICAgIGxlbiA9IHYzbGVuIC0gTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RIOworICAgICAgICBvZmZzZXQgPSBNU1RfQlBEVV9NU1RJX09GRlNFVDsKKyAgICAgICAgd2hpbGUgKGxlbiA+PSBNU1RfQlBEVV9NU1RJX0xFTkdUSCkgeworICAgICAgICAgICAgbXN0aSA9IEVYVFJBQ1RfMTZCSVRTKHB0ciArIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNUX0JQRFVfTVNUSV9ST09UX1BSSU9fT0ZGU0VUKTsKKyAgICAgICAgICAgIG1zdGkgPSBtc3RpICYgMHgwRkZGOworCisgICAgICAgICAgICBwcmludGYoIlxuXHRNU1RJICVkLCBGbGFncyBbJXNdLCBwb3J0LXJvbGUgJXMiLCAKKyAgICAgICAgICAgICAgICAgICBtc3RpLCBiaXR0b2syc3RyKHN0cF9icGR1X2ZsYWdfdmFsdWVzLCAibm9uZSIsIHB0cltvZmZzZXRdKSwKKyAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXMsICJVbmtub3duIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTVFBfRVhUUkFDVF9QT1JUX1JPTEUocHRyW29mZnNldF0pKSk7CisgICAgICAgICAgICBwcmludGYoIlxuXHRcdE1TVEkgcmVnaW9uYWwtcm9vdC1pZCAlcywgcGF0aGNvc3QgJXUiLAorICAgICAgICAgICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQocHRyICsgb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVF9CUERVX01TVElfUk9PVF9QUklPX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMocHRyICsgb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1RfQlBEVV9NU1RJX1JPT1RfUEFUSF9DT1NUX09GRlNFVCkpOworICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRNU1RJIGJyaWRnZS1wcmlvICVkLCBwb3J0LXByaW8gJWQsIGhvcHMgJWQiLAorICAgICAgICAgICAgICAgICAgIHB0cltvZmZzZXQgKyBNU1RfQlBEVV9NU1RJX0JSSURHRV9QUklPX09GRlNFVF0gPj4gNCwKKyAgICAgICAgICAgICAgICAgICBwdHJbb2Zmc2V0ICsgTVNUX0JQRFVfTVNUSV9QT1JUX1BSSU9fT0ZGU0VUXSA+PiA0LAorICAgICAgICAgICAgICAgICAgIHB0cltvZmZzZXQgKyBNU1RfQlBEVV9NU1RJX1JFTUFJTl9IT1BTX09GRlNFVF0pOworCisgICAgICAgICAgICBsZW4gLT0gTVNUX0JQRFVfTVNUSV9MRU5HVEg7CisgICAgICAgICAgICBvZmZzZXQgKz0gTVNUX0JQRFVfTVNUSV9MRU5HVEg7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBQcmludCA4MDIuMWQgLyA4MDIuMXcgLyA4MDIuMXEgKG1zdHApIHBhY2tldHMuCisgKi8KK3ZvaWQKK3N0cF9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc3RwX2JwZHVfICpzdHBfYnBkdTsKKyAgICB1X2ludDE2X3QgICAgICAgICAgICAgIG1zdHBfbGVuOworICAgIAorICAgIHN0cF9icGR1ID0gKHN0cnVjdCBzdHBfYnBkdV8qKXA7CisKKyAgICAvKiBNaW5pbXVtIFNUUCBGcmFtZSBzaXplLiAqLworICAgIGlmIChsZW5ndGggPCA0KQorICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAKKyAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5wcm90b2NvbF9pZCkpIHsKKyAgICAgICAgcHJpbnRmKCJ1bmtub3duIFNUUCB2ZXJzaW9uLCBsZW5ndGggJXUiLCBsZW5ndGgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJpbnRmKCJTVFAgJXMiLCB0b2syc3RyKHN0cF9wcm90b192YWx1ZXMsICJVbmtub3duIFNUUCBwcm90b2NvbCAoMHglMDJ4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24pKTsKKworICAgIHN3aXRjaCAoc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24pIHsKKyAgICBjYXNlIFNUUF9QUk9UT19SRUdVTEFSOgorICAgIGNhc2UgU1RQX1BST1RPX1JBUElEOgorICAgIGNhc2UgU1RQX1BST1RPX01TVFA6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIiwgJXMiLCB0b2syc3RyKHN0cF9icGR1X3R5cGVfdmFsdWVzLCAiVW5rbm93biBCUERVIFR5cGUgKDB4JTAyeCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwX2JwZHUtPmJwZHVfdHlwZSkpOworCisgICAgc3dpdGNoIChzdHBfYnBkdS0+YnBkdV90eXBlKSB7CisgICAgY2FzZSBTVFBfQlBEVV9UWVBFX0NPTkZJRzoKKyAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc3RwX2JwZHVfKSAtIDEpIHsKKyAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgIH0KKyAgICAgICAgc3RwX3ByaW50X2NvbmZpZ19icGR1KHN0cF9icGR1LCBsZW5ndGgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RQX0JQRFVfVFlQRV9SU1RQOgorICAgICAgICBpZiAoc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24gPT0gU1RQX1BST1RPX1JBUElEKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzdHBfYnBkdV8pKSB7CisgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cF9wcmludF9jb25maWdfYnBkdShzdHBfYnBkdSwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHBfYnBkdS0+cHJvdG9jb2xfdmVyc2lvbiA9PSBTVFBfUFJPVE9fTVNUUCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IFNUUF9CUERVX01TVFBfTUlOX0xFTikgeworICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RwX2JwZHUtPnYxX2xlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogRklYIE1FOiBFbWl0IGEgbWVzc2FnZSBoZXJlID8gKi8KKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVmFsaWRhdGUgdjMgbGVuZ3RoICovCisgICAgICAgICAgICBtc3RwX2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHAgKyBNU1RfQlBEVV9WRVIzX0xFTl9PRkZTRVQpOworICAgICAgICAgICAgbXN0cF9sZW4gKz0gMjsgIC8qIGxlbmd0aCBlbmNvZGluZyBpdHNlbGYgaXMgMiBieXRlcyAqLworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IChzaXplb2Yoc3RydWN0IHN0cF9icGR1XykgKyBtc3RwX2xlbikpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RwX3ByaW50X21zdHBfYnBkdShzdHBfYnBkdSwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RQX0JQRFVfVFlQRV9UT1BPX0NIQU5HRToKKyAgICAgICAgLyogYWx3YXlzIGVtcHR5IG1lc3NhZ2UgLSBqdXN0IGJyZWFrIG91dCAqLworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybjsKKyB0cnVuYzoKKyAgICBwcmludGYoIlt8c3RwICVkXSIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC1zdW5hdG0uYyBiL3ByaW50LXN1bmF0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDM4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1zdW5hdG0uYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBZZW4gWWVuIExpbSBhbmQgTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBZZW4gWWVuIExpbSBhbmQKKwlOb3J0aCBEYWtvdGEgU3RhdGUgVW5pdmVyc2l0eQorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc3VuYXRtLmMsdiAxLjggMjAwNC8wMy8xNyAyMzoyNDozOCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisgCitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworIAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKKworI2luY2x1ZGUgImF0bS5oIgorI2luY2x1ZGUgImF0bXVuaTMxLmgiCisKKy8qIFN1bkFUTSBoZWFkZXIgZm9yIEFUTSBwYWNrZXQgKi8KKyNkZWZpbmUgRElSX1BPUwkJMAkvKiBEaXJlY3Rpb24gKDB4ODAgPSB0cmFuc21pdCwgMHgwMCA9IHJlY2VpdmUpICovCisjZGVmaW5lIFZQSV9QT1MJCTEJLyogVlBJICovCisjZGVmaW5lIFZDSV9QT1MJCTIJLyogVkNJICovCisjZGVmaW5lIFBLVF9CRUdJTl9QT1MgICA0CS8qIFN0YXJ0IG9mIHRoZSBBVE0gcGFja2V0ICovCisKKy8qIFByb3RvY29sIHR5cGUgdmFsdWVzIGluIHRoZSBib3R0b20gZm9yIGJpdHMgb2YgdGhlIGJ5dGUgYXQgU1VOQVRNX0RJUl9QT1MuICovCisjZGVmaW5lIFBUX0xBTkUJCTB4MDEJLyogTEFORSAqLworI2RlZmluZSBQVF9MTEMJCTB4MDIJLyogTExDIGVuY2Fwc3VsYXRpb24gKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cworICogdG8gdGhlIFN1bkFUTSBwc2V1ZG8taGVhZGVyIGZvciB0aGUgcGFja2V0LCAnaC0+dHMnIGlzIHRoZSB0aW1lc3RhbXAsCisgKiAnaC0+bGVuJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb2ZmIHRoZSB3aXJlLCBhbmQgJ2gtPmNhcGxlbicKKyAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgY2FwdHVyZWQuCisgKi8KK3VfaW50CitzdW5hdG1faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOworCXVfaW50IGxlbmd0aCA9IGgtPmxlbjsKKwl1X3Nob3J0IHZjaTsKKwl1X2NoYXIgdnBpOworCXVfaW50IHRyYWZ0eXBlOworCisJaWYgKGNhcGxlbiA8IFBLVF9CRUdJTl9QT1MpIHsKKwkJcHJpbnRmKCJbfGF0bV0iKTsKKwkJcmV0dXJuIChjYXBsZW4pOworCX0KKworCWlmIChlZmxhZykgeworCQlpZiAocFtESVJfUE9TXSAmIDB4ODApCisJCQlwcmludGYoIlR4OiAiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJSeDogIik7CisJfQorCisJc3dpdGNoIChwW0RJUl9QT1NdICYgMHgwZikgeworCisJY2FzZSBQVF9MQU5FOgorCQl0cmFmdHlwZSA9IEFUTV9MQU5FOworCQlicmVhazsKKworCWNhc2UgUFRfTExDOgorCQl0cmFmdHlwZSA9IEFUTV9MTEM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdHJhZnR5cGUgPSBBVE1fVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJdmNpID0gRVhUUkFDVF8xNkJJVFMoJnBbVkNJX1BPU10pOworCXZwaSA9IHBbVlBJX1BPU107CisKKwlwICs9IFBLVF9CRUdJTl9QT1M7CisJY2FwbGVuIC09IFBLVF9CRUdJTl9QT1M7CisJbGVuZ3RoIC09IFBLVF9CRUdJTl9QT1M7CisJYXRtX3ByaW50KHZwaSwgdmNpLCB0cmFmdHlwZSwgcCwgbGVuZ3RoLCBjYXBsZW4pOworCisJcmV0dXJuIChQS1RfQkVHSU5fUE9TKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LXN1bnJwYy5jIGIvcHJpbnQtc3VucnBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMjhhNAotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXN1bnJwYy5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc3VucnBjLmMsdiAxLjQ2LjIuMSAyMDA1LzA0LzI3IDIxOjQ0OjA2IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2lmZGVmIEhBVkVfR0VUUlBDQllOVU1CRVIKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaWZkZWYgSEFWRV9SUENfUlBDRU5UX0gKKyNpbmNsdWRlIDxycGMvcnBjZW50Lmg+CisjZW5kaWYgLyogSEFWRV9SUENfUlBDRU5UX0ggKi8KKyNlbmRpZiAvKiBIQVZFX0dFVFJQQ0JZTlVNQkVSICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgImlwLmgiCisjaWZkZWYgSU5FVDYKKyNpbmNsdWRlICJpcDYuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicnBjX2F1dGguaCIKKyNpbmNsdWRlICJycGNfbXNnLmgiCisjaW5jbHVkZSAicG1hcF9wcm90LmgiCisKK3N0YXRpYyBzdHJ1Y3QgdG9rIHByb2Myc3RyW10gPSB7CisJeyBTVU5SUENfUE1BUFBST0NfTlVMTCwJCSJudWxsIiB9LAorCXsgU1VOUlBDX1BNQVBQUk9DX1NFVCwJCSJzZXQiIH0sCisJeyBTVU5SUENfUE1BUFBST0NfVU5TRVQsCSJ1bnNldCIgfSwKKwl7IFNVTlJQQ19QTUFQUFJPQ19HRVRQT1JULAkiZ2V0cG9ydCIgfSwKKwl7IFNVTlJQQ19QTUFQUFJPQ19EVU1QLAkJImR1bXAiIH0sCisJeyBTVU5SUENfUE1BUFBST0NfQ0FMTElULAkiY2FsbCIgfSwKKwl7IDAsCQkJCU5VTEwgfQorfTsKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBjaGFyICpwcm9nc3RyKHVfaW50MzJfdCk7CisKK3ZvaWQKK3N1bnJwY3JlcXVlc3RfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAorCQkgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicDIpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKnJwOworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7CisjaWZkZWYgSU5FVDYKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OworI2VuZGlmCisJdV9pbnQzMl90IHg7CisJY2hhciBzcmNpZFsyMF0sIGRzdGlkWzIwXTsJLypmaXRzIDMyYml0Ki8KKworCXJwID0gKHN0cnVjdCBzdW5ycGNfbXNnICopYnA7CisKKwlpZiAoIW5mbGFnKSB7CisJCXNucHJpbnRmKHNyY2lkLCBzaXplb2Yoc3JjaWQpLCAiMHgleCIsCisJCSAgICBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3hpZCkpOworCQlzdHJsY3B5KGRzdGlkLCAic3VucnBjIiwgc2l6ZW9mKGRzdGlkKSk7CisJfSBlbHNlIHsKKwkJc25wcmludGYoc3JjaWQsIHNpemVvZihzcmNpZCksICIweCV4IiwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1feGlkKSk7CisJCXNucHJpbnRmKGRzdGlkLCBzaXplb2YoZHN0aWQpLCAiMHgleCIsIFNVTlJQQ19QTUFQUE9SVCk7CisJfQorCisJc3dpdGNoIChJUF9WKChzdHJ1Y3QgaXAgKilicDIpKSB7CisJY2FzZSA0OgorCQlpcCA9IChzdHJ1Y3QgaXAgKilicDI7CisJCXByaW50ZigiJXMuJXMgPiAlcy4lczogJWQiLAorCQkgICAgaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksIHNyY2lkLAorCQkgICAgaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCksIGRzdGlkLCBsZW5ndGgpOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgNjoKKwkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnAyOworCQlwcmludGYoIiVzLiVzID4gJXMuJXM6ICVkIiwKKwkJICAgIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLCBzcmNpZCwKKwkJICAgIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLCBkc3RpZCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlwcmludGYoIiVzLiVzID4gJXMuJXM6ICVkIiwgIj8iLCBzcmNpZCwgIj8iLCBkc3RpZCwgbGVuZ3RoKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRmKCIgJXMiLCB0b2syc3RyKHByb2Myc3RyLCAiIHByb2MgIyV1IiwKKwkgICAgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3Byb2MpKSk7CisJeCA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl9ycGN2ZXJzKTsKKwlpZiAoeCAhPSAyKQorCQlwcmludGYoIiBbcnBjdmVyICV1XSIsIHgpOworCisJc3dpdGNoIChFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfcHJvYykpIHsKKworCWNhc2UgU1VOUlBDX1BNQVBQUk9DX1NFVDoKKwljYXNlIFNVTlJQQ19QTUFQUFJPQ19VTlNFVDoKKwljYXNlIFNVTlJQQ19QTUFQUFJPQ19HRVRQT1JUOgorCWNhc2UgU1VOUlBDX1BNQVBQUk9DX0NBTExJVDoKKwkJeCA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl9wcm9nKTsKKwkJaWYgKCFuZmxhZykKKwkJCXByaW50ZigiICVzIiwgcHJvZ3N0cih4KSk7CisJCWVsc2UKKwkJCXByaW50ZigiICV1IiwgeCk7CisJCXByaW50ZigiLiV1IiwgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3ZlcnMpKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY2hhciAqCitwcm9nc3RyKHByb2cpCisJdV9pbnQzMl90IHByb2c7Cit7CisjaWZkZWYgSEFWRV9HRVRSUENCWU5VTUJFUgorCXJlZ2lzdGVyIHN0cnVjdCBycGNlbnQgKnJwOworI2VuZGlmCisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKwlzdGF0aWMgdV9pbnQzMl90IGxhc3Rwcm9nID0gMDsKKworCWlmIChsYXN0cHJvZyAhPSAwICYmIHByb2cgPT0gbGFzdHByb2cpCisJCXJldHVybiAoYnVmKTsKKyNpZmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSCisJcnAgPSBnZXRycGNieW51bWJlcihwcm9nKTsKKwlpZiAocnAgPT0gTlVMTCkKKyNlbmRpZgorCQkodm9pZCkgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiMldSIsIHByb2cpOworI2lmZGVmIEhBVkVfR0VUUlBDQllOVU1CRVIKKwllbHNlCisJCXN0cmxjcHkoYnVmLCBycC0+cl9uYW1lLCBzaXplb2YoYnVmKSk7CisjZW5kaWYKKwlyZXR1cm4gKGJ1Zik7Cit9CmRpZmYgLS1naXQgYS9wcmludC1zeW1hbnRlYy5jIGIvcHJpbnQtc3ltYW50ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjcyMTgwCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtc3ltYW50ZWMuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zeW1hbnRlYy5jLHYgMS40LjIuMSAyMDA1LzA3LzA3IDAxOjI0OjM5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGNhcC5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV0aGVydHlwZS5oIgorCisjaW5jbHVkZSAiZXRoZXIuaCIKKworc3RydWN0IHN5bWFudGVjX2hlYWRlciB7CisJdV9pbnQ4X3QgIHN0dWZmMVs2XTsKKwl1X2ludDE2X3QgZXRoZXJfdHlwZTsKKwl1X2ludDhfdCAgc3R1ZmYyWzM2XTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3ltYW50ZWNfaGRyX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICpzcDsKKwl1X2ludDE2X3QgZXR5cGU7CisKKwlzcCA9IChjb25zdCBzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICopYnA7CisKKwlldHlwZSA9IG50b2hzKHNwLT5ldGhlcl90eXBlKTsKKwlpZiAoIXFmbGFnKSB7CisJICAgICAgICBpZiAoZXR5cGUgPD0gRVRIRVJNVFUpCisJCSAgICAgICAgICAodm9pZClwcmludGYoImludmFsaWQgZXRoZXJ0eXBlICV1IiwgZXR5cGUpOworICAgICAgICAgICAgICAgIGVsc2UgCisJCSAgICAgICAgICAodm9pZClwcmludGYoImV0aGVydHlwZSAlcyAoMHglMDR4KSIsCisJCQkJICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biIsIGV0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZXR5cGUgPD0gRVRIRVJNVFUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiaW52YWxpZCBldGhlcnR5cGUgJXUiLCBldHlwZSk7CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIlcyIsIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biBFdGhlcnR5cGUgKDB4JTA0eCkiLCBldHlwZSkpOyAgCisgICAgICAgIH0KKworCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKKyAqIHRvIHRoZSBldGhlciBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAorICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCisgKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgorICovCit1X2ludAorc3ltYW50ZWNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCit7CisJdV9pbnQgbGVuZ3RoID0gaC0+bGVuOworCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKKwlzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICpzcDsKKwl1X3Nob3J0IGV0aGVyX3R5cGU7CisJdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJfdHlwZTsKKworCWlmIChjYXBsZW4gPCBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKSB7CisJCXByaW50ZigiW3xzeW1hbnRlY10iKTsKKwkJcmV0dXJuIGNhcGxlbjsKKwl9CisKKwlpZiAoZWZsYWcpCisJCXN5bWFudGVjX2hkcl9wcmludChwLCBsZW5ndGgpOworCisJbGVuZ3RoIC09IHNpemVvZiAoc3RydWN0IHN5bWFudGVjX2hlYWRlcik7CisJY2FwbGVuIC09IHNpemVvZiAoc3RydWN0IHN5bWFudGVjX2hlYWRlcik7CisJc3AgPSAoc3RydWN0IHN5bWFudGVjX2hlYWRlciAqKXA7CisJcCArPSBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpOworCisJZXRoZXJfdHlwZSA9IG50b2hzKHNwLT5ldGhlcl90eXBlKTsKKworCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7CisJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCWlmICghZWZsYWcpCisJCQlzeW1hbnRlY19oZHJfcHJpbnQoKHVfY2hhciAqKXNwLCBsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKTsKKworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfSBlbHNlIGlmIChldGhlcl9lbmNhcF9wcmludChldGhlcl90eXBlLCBwLCBsZW5ndGgsIGNhcGxlbiwKKwkgICAgJmV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7CisJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCisJCWlmICghZWZsYWcpCisJCQlzeW1hbnRlY19oZHJfcHJpbnQoKHVfY2hhciAqKXNwLCBsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKTsKKworCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7CisJfSAKKworCXJldHVybiAoc2l6ZW9mIChzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyKSk7Cit9CmRpZmYgLS1naXQgYS9wcmludC1zeXNsb2cuYyBiL3ByaW50LXN5c2xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5OWQwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC1zeXNsb2cuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0ICBIYW5uZXMgR3JlZGxlciA8aGFubmVzQHRjcGR1bXAub3JnPgorICogICAgICBUaGUgVENQRFVNUCBwcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCisgKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKKyAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCisgKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECisgKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCisgKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXN5c2xvZy5jLHYgMS4xIDIwMDQvMTAvMjkgMTE6NDI6NTMgaGFubmVzIEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKy8qIAorICogdG9rZW5saXN0cyBhbmQgI2RlZmluZXMgdGFrZW4gZnJvbSBFdGhlcmVhbCAtIE5ldHdvcmsgdHJhZmZpYyBhbmFseXplcgorICogYnkgR2VyYWxkIENvbWJzIDxnZXJhbGRAZXRoZXJlYWwuY29tPgorICovCisKKyNkZWZpbmUgU1lTTE9HX1NFVkVSSVRZX01BU0sgMHgwMDA3ICAvKiAwMDAwIDAwMDAgMDAwMCAwMTExICovCisjZGVmaW5lIFNZU0xPR19GQUNJTElUWV9NQVNLIDB4MDNmOCAgLyogMDAwMCAwMDExIDExMTEgMTAwMCAqLworI2RlZmluZSBTWVNMT0dfTUFYX0RJR0lUUyAzIC8qIFRoZSBtYXhpbXVtIG51bWJlciBpZiBwcmlvcml0eSBkaWdpdHMgdG8gcmVhZCBpbi4gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgc3lzbG9nX3NldmVyaXR5X3ZhbHVlc1tdID0geworICB7IDAsICAgICAgImVtZXJnZW5jeSIgfSwKKyAgeyAxLCAgICAgICJhbGVydCIgfSwKKyAgeyAyLCAgICAgICJjcml0aWNhbCIgfSwKKyAgeyAzLCAgICAgICJlcnJvciIgfSwKKyAgeyA0LCAgICAgICJ3YXJuaW5nIiB9LAorICB7IDUsICAgICAgIm5vdGljZSIgfSwKKyAgeyA2LCAgICAgICJpbmZvIiB9LAorICB7IDcsICAgICAgImRlYnVnIiB9LAorICB7IDAsIE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHN5c2xvZ19mYWNpbGl0eV92YWx1ZXNbXSA9IHsKKyAgeyAwLCAgICAgImtlcm5lbCIgfSwKKyAgeyAxLCAgICAgInVzZXIiIH0sCisgIHsgMiwgICAgICJtYWlsIiB9LAorICB7IDMsICAgICAiZGFlbW9uIiB9LAorICB7IDQsICAgICAiYXV0aCIgfSwKKyAgeyA1LCAgICAgInN5c2xvZyIgfSwKKyAgeyA2LCAgICAgImxwciIgfSwKKyAgeyA3LCAgICAgIm5ld3MiIH0sCisgIHsgOCwgICAgICJ1dWNwIiB9LAorICB7IDksICAgICAiY3JvbiIgfSwKKyAgeyAxMCwgICAgImF1dGhwcml2IiB9LAorICB7IDExLCAgICAiZnRwIiB9LAorICB7IDEyLCAgICAibnRwIiB9LAorICB7IDEzLCAgICAic2VjdXJpdHkiIH0sCisgIHsgMTQsICAgICJjb25zb2xlIiB9LAorICB7IDE1LCAgICAiY3JvbiIgfSwKKyAgeyAxNiwgICAgImxvY2FsMCIgfSwKKyAgeyAxNywgICAgImxvY2FsMSIgfSwKKyAgeyAxOCwgICAgImxvY2FsMiIgfSwKKyAgeyAxOSwgICAgImxvY2FsMyIgfSwKKyAgeyAyMCwgICAgImxvY2FsNCIgfSwKKyAgeyAyMSwgICAgImxvY2FsNSIgfSwKKyAgeyAyMiwgICAgImxvY2FsNiIgfSwKKyAgeyAyMywgICAgImxvY2FsNyIgfSwKKyAgeyAwLCBOVUxMIH0sCit9OworCit2b2lkCitzeXNsb2dfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwcHRyLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisgICAgdV9pbnQxNl90IG1zZ19vZmYgPSAwOworICAgIHVfaW50MTZfdCBwcmkgPSAwOworICAgIHVfaW50MTZfdCBmYWNpbGl0eSxzZXZlcml0eTsKKworICAgIC8qIGV4dHJhY3QgZGVjaW1hbCBmaWd1cmVzIHRoYXQgYXJlCisgICAgICogZW5jYXBzdWxhdGVkIHdpdGhpbiA8ID4gdGFncworICAgICAqIGJhc2VkIG9uIHRoaXMgZGVjaW1hbCBmaWd1cmUgZXh0cmFjdCB0aGUKKyAgICAgKiBzZXZlcml0eSBhbmQgZmFjaWxpdHkgdmFsdWVzCisgICAgICovCisKKyAgICBpZiAoIVRURVNUMigqcHB0ciwgMSkpCisgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICBpZiAoKihwcHRyK21zZ19vZmYpID09ICc8JykgeworICAgICAgICBtc2dfb2ZmKys7CisKKyAgICAgICAgaWYgKCFUVEVTVDIoKihwcHRyK21zZ19vZmYpLCAxKSkKKyAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgd2hpbGUgKCAqKHBwdHIrbXNnX29mZikgPj0gJzAnICYmCisgICAgICAgICAgICAgICAgKihwcHRyK21zZ19vZmYpIDw9ICc5JyAmJgorICAgICAgICAgICAgICAgIG1zZ19vZmYgPD0gU1lTTE9HX01BWF9ESUdJVFMpIHsKKworICAgICAgICAgICAgaWYgKCFUVEVTVDIoKihwcHRyK21zZ19vZmYpLCAxKSkKKyAgICAgICAgICAgICAgICBnb3RvIHRydW5jOworCisgICAgICAgICAgICBwcmkgPSBwcmkgKiAxMCArICgqKHBwdHIrbXNnX29mZikgLSAnMCcpOworICAgICAgICAgICAgbXNnX29mZisrOworCisgICAgICAgICAgICBpZiAoIVRURVNUMigqKHBwdHIrbXNnX29mZiksIDEpKQorICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7CisKKyAgICAgICAgaWYgKCoocHB0cittc2dfb2ZmKSA9PSAnPicpCisgICAgICAgICAgICBtc2dfb2ZmKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlt8c3lzbG9nXSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmFjaWxpdHkgPSAocHJpICYgU1lTTE9HX0ZBQ0lMSVRZX01BU0spID4+IDM7CisgICAgc2V2ZXJpdHkgPSBwcmkgJiBTWVNMT0dfU0VWRVJJVFlfTUFTSzsKKworICAgIAorICAgIGlmICh2ZmxhZyA8IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJTWVNMT0cgJXMuJXMsIGxlbmd0aDogJXUiLAorICAgICAgICAgICAgICAgdG9rMnN0cihzeXNsb2dfZmFjaWxpdHlfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgZmFjaWxpdHkpLAorICAgICAgICAgICAgICAgdG9rMnN0cihzeXNsb2dfc2V2ZXJpdHlfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgc2V2ZXJpdHkpLAorICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgICAKKyAgICBwcmludGYoIlNZU0xPRywgbGVuZ3RoOiAldVxuXHRGYWNpbGl0eSAlcyAoJXUpLCBTZXZlcml0eSAlcyAoJXUpXG5cdE1zZzogIiwKKyAgICAgICAgICAgbGVuLAorICAgICAgICAgICB0b2syc3RyKHN5c2xvZ19mYWNpbGl0eV92YWx1ZXMsICJ1bmtub3duICgldSkiLCBmYWNpbGl0eSksCisgICAgICAgICAgIGZhY2lsaXR5LAorICAgICAgICAgICB0b2syc3RyKHN5c2xvZ19zZXZlcml0eV92YWx1ZXMsICJ1bmtub3duICgldSkiLCBzZXZlcml0eSksCisgICAgICAgICAgIHNldmVyaXR5KTsKKworICAgIC8qIHByaW50IHRoZSBzeXNsb2cgdGV4dCBpbiB2ZXJib3NlIG1vZGUgKi8KKyAgICBmb3IgKDsgbXNnX29mZiA8IGxlbjsgbXNnX29mZisrKSB7CisgICAgICAgIGlmICghVFRFU1QyKCoocHB0cittc2dfb2ZmKSwgMSkpCisgICAgICAgICAgICBnb3RvIHRydW5jOworICAgICAgICBzYWZlcHV0Y2hhcigqKHBwdHIrbXNnX29mZikpOyAgICAgICAgCisgICAgfQorCisgICAgaWYgKHZmbGFnID4gMSkgeworICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQiLGxlbikpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHJldHVybjsKKwordHJ1bmM6CisgICAgICAgIHByaW50ZigiW3xzeXNsb2ddIik7Cit9CmRpZmYgLS1naXQgYS9wcmludC10Y3AuYyBiL3ByaW50LXRjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmQ2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC10Y3AuYwpAQCAtMCwwICsxLDgwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIHRjcGR1bXAub3JnIHByb2plY3QKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdGNwLmMsdiAxLjEyMC4yLjMgMjAwNS8xMC8xNiAwNjowNTo0NiBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKworI2luY2x1ZGUgInRjcC5oIgorCisjaW5jbHVkZSAiaXAuaCIKKyNpZmRlZiBJTkVUNgorI2luY2x1ZGUgImlwNi5oIgorI2VuZGlmCisjaW5jbHVkZSAiaXBwcm90by5oIgorI2luY2x1ZGUgInJwY19hdXRoLmgiCisjaW5jbHVkZSAicnBjX21zZy5oIgorCisjaW5jbHVkZSAibmFtZXNlci5oIgorCisjaWZkZWYgSEFWRV9MSUJDUllQVE8KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCisjZGVmaW5lIFNJR05BVFVSRV9WQUxJRAkJMAorI2RlZmluZSBTSUdOQVRVUkVfSU5WQUxJRAkxCisjZGVmaW5lIENBTlRfQ0hFQ0tfU0lHTkFUVVJFCTIKKworc3RhdGljIGludCB0Y3BfdmVyaWZ5X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgaXAgKmlwLCBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0cCwKKyAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgsIGNvbnN0IHVfY2hhciAqcmN2c2lnKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcmludF90Y3BfcnN0X2RhdGEocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpzcCwgdV9pbnQgbGVuZ3RoKTsKKworI2RlZmluZSBNQVhfUlNUX0RBVEFfTEVOCTMwCisKKworc3RydWN0IHRoYSB7CisjaWZuZGVmIElORVQ2CisJc3RydWN0IGluX2FkZHIgc3JjOworCXN0cnVjdCBpbl9hZGRyIGRzdDsKKyNlbHNlCisJc3RydWN0IGluNl9hZGRyIHNyYzsKKwlzdHJ1Y3QgaW42X2FkZHIgZHN0OworI2VuZGlmIC8qSU5FVDYqLworCXVfaW50IHBvcnQ7Cit9OworCitzdHJ1Y3QgdGNwX3NlcV9oYXNoIHsKKwlzdHJ1Y3QgdGNwX3NlcV9oYXNoICpueHQ7CisJc3RydWN0IHRoYSBhZGRyOworCXRjcF9zZXEgc2VxOworCXRjcF9zZXEgYWNrOworfTsKKworI2RlZmluZSBUU0VRX0hBU0hTSVpFIDkxOQorCisvKiBUaGVzZSB0Y3Agb3B0aW5vcyBkbyBub3QgaGF2ZSB0aGUgc2l6ZSBvY3RldCAqLworI2RlZmluZSBaRVJPTEVOT1BUKG8pICgobykgPT0gVENQT1BUX0VPTCB8fCAobykgPT0gVENQT1BUX05PUCkKKworc3RhdGljIHN0cnVjdCB0Y3Bfc2VxX2hhc2ggdGNwX3NlcV9oYXNoW1RTRVFfSEFTSFNJWkVdOworCisKKyNpZm5kZWYgVEVMTkVUX1BPUlQKKyNkZWZpbmUgVEVMTkVUX1BPUlQJMjMKKyNlbmRpZgorI2lmbmRlZiBCR1BfUE9SVAorI2RlZmluZSBCR1BfUE9SVAkxNzkKKyNlbmRpZgorI2RlZmluZSBORVRCSU9TX1NTTl9QT1JUIDEzOQorI2lmbmRlZiBQUFRQX1BPUlQKKyNkZWZpbmUgUFBUUF9QT1JUCTE3MjMKKyNlbmRpZgorI2RlZmluZSBCRUVQX1BPUlQgICAgICAgIDEwMjg4CisjaWZuZGVmIE5GU19QT1JUCisjZGVmaW5lIE5GU19QT1JUCTIwNDkKKyNlbmRpZgorI2RlZmluZSBNU0RQX1BPUlQJNjM5CisjZGVmaW5lIExEUF9QT1JUICAgICAgICA2NDYKKworc3RhdGljIGludCB0Y3BfY2tzdW0ocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwICppcCwKKwkJICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0cCwKKwkJICAgICByZWdpc3RlciB1X2ludCBsZW4pCit7CisJdW5pb24gcGh1IHsKKwkJc3RydWN0IHBoZHIgeworCQkJdV9pbnQzMl90IHNyYzsKKwkJCXVfaW50MzJfdCBkc3Q7CisJCQl1X2NoYXIgbWJ6OworCQkJdV9jaGFyIHByb3RvOworCQkJdV9pbnQxNl90IGxlbjsKKwkJfSBwaDsKKwkJdV9pbnQxNl90IHBhWzZdOworCX0gcGh1OworCWNvbnN0IHVfaW50MTZfdCAqc3A7CisKKwkvKiBwc2V1ZG8taGVhZGVyLi4gKi8KKwlwaHUucGgubGVuID0gaHRvbnMoKHVfaW50MTZfdClsZW4pOworCXBodS5waC5tYnogPSAwOworCXBodS5waC5wcm90byA9IElQUFJPVE9fVENQOworCW1lbWNweSgmcGh1LnBoLnNyYywgJmlwLT5pcF9zcmMuc19hZGRyLCBzaXplb2YodV9pbnQzMl90KSk7CisJaWYgKElQX0hMKGlwKSA9PSA1KQorCQltZW1jcHkoJnBodS5waC5kc3QsICZpcC0+aXBfZHN0LnNfYWRkciwgc2l6ZW9mKHVfaW50MzJfdCkpOworCWVsc2UKKwkJcGh1LnBoLmRzdCA9IGlwX2ZpbmRkc3QoaXApOworCisJc3AgPSAmcGh1LnBhWzBdOworCXJldHVybiBpbl9ja3N1bSgodV9zaG9ydCAqKXRwLCBsZW4sCisJCQlzcFswXStzcFsxXStzcFsyXStzcFszXStzcFs0XStzcFs1XSk7Cit9CisKKyNpZmRlZiBJTkVUNgorc3RhdGljIGludCB0Y3A2X2Nrc3VtKGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDYsIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRwLAorCXVfaW50IGxlbikKK3sKKwlzaXplX3QgaTsKKwlyZWdpc3RlciBjb25zdCB1X2ludDE2X3QgKnNwOworCXVfaW50MzJfdCBzdW07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGluNl9hZGRyIHBoX3NyYzsKKwkJCXN0cnVjdCBpbjZfYWRkciBwaF9kc3Q7CisJCQl1X2ludDMyX3QJcGhfbGVuOworCQkJdV9pbnQ4X3QJcGhfemVyb1szXTsKKwkJCXVfaW50OF90CXBoX254dDsKKwkJfSBwaDsKKwkJdV9pbnQxNl90IHBhWzIwXTsKKwl9IHBodTsKKworCS8qIHBzZXVkby1oZWFkZXIgKi8KKwltZW1zZXQoJnBodSwgMCwgc2l6ZW9mKHBodSkpOworCXBodS5waC5waF9zcmMgPSBpcDYtPmlwNl9zcmM7CisJcGh1LnBoLnBoX2RzdCA9IGlwNi0+aXA2X2RzdDsKKwlwaHUucGgucGhfbGVuID0gaHRvbmwobGVuKTsKKwlwaHUucGgucGhfbnh0ID0gSVBQUk9UT19UQ1A7CisKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocGh1LnBhKSAvIHNpemVvZihwaHUucGFbMF0pOyBpKyspCisJCXN1bSArPSBwaHUucGFbaV07CisKKwlzcCA9IChjb25zdCB1X2ludDE2X3QgKil0cDsKKworCWZvciAoaSA9IDA7IGkgPCAobGVuICYgfjEpOyBpICs9IDIpCisJCXN1bSArPSAqc3ArKzsKKworCWlmIChsZW4gJiAxKQorCQlzdW0gKz0gaHRvbnMoKCooY29uc3QgdV9pbnQ4X3QgKilzcCkgPDwgOCk7CisKKwl3aGlsZSAoc3VtID4gMHhmZmZmKQorCQlzdW0gPSAoc3VtICYgMHhmZmZmKSArIChzdW0gPj4gMTYpOworCXN1bSA9IH5zdW0gJiAweGZmZmY7CisKKwlyZXR1cm4gKHN1bSk7Cit9CisjZW5kaWYKKwordm9pZAordGNwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCwKKwkgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAyLCBpbnQgZnJhZ21lbnRlZCkKK3sKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0cDsKKwlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXAgKmlwOworCXJlZ2lzdGVyIHVfY2hhciBmbGFnczsKKwlyZWdpc3RlciB1X2ludCBobGVuOworCXJlZ2lzdGVyIGNoYXIgY2g7CisJdV9pbnQxNl90IHNwb3J0LCBkcG9ydCwgd2luLCB1cnA7CisJdV9pbnQzMl90IHNlcSwgYWNrLCB0aHNlcSwgdGhhY2s7CisJaW50IHRocmV2OworI2lmZGVmIElORVQ2CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKKyNlbmRpZgorCisJdHAgPSAoc3RydWN0IHRjcGhkciAqKWJwOworCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKKyNpZmRlZiBJTkVUNgorCWlmIChJUF9WKGlwKSA9PSA2KQorCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7CisJZWxzZQorCQlpcDYgPSBOVUxMOworI2VuZGlmIC8qSU5FVDYqLworCWNoID0gJ1wwJzsKKwlpZiAoIVRURVNUKHRwLT50aF9kcG9ydCkpIHsKKwkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiBbfHRjcF0iLAorCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksCisJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSk7CisJCXJldHVybjsKKwl9CisKKwlzcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfc3BvcnQpOworCWRwb3J0ID0gRVhUUkFDVF8xNkJJVFMoJnRwLT50aF9kcG9ydCk7CisKKwlobGVuID0gVEhfT0ZGKHRwKSAqIDQ7CisKKwkvKgorCSAqIElmIGRhdGEgcHJlc2VudCwgaGVhZGVyIGxlbmd0aCB2YWxpZCwgYW5kIE5GUyBwb3J0IHVzZWQsCisJICogYXNzdW1lIE5GUy4KKwkgKiBQYXNzIG9mZnNldCBvZiBkYXRhIHBsdXMgNCBieXRlcyBmb3IgUlBDIFRDUCBtc2cgbGVuZ3RoCisJICogdG8gTkZTIHByaW50IHJvdXRpbmVzLgorCSAqLworCWlmICghcWZsYWcgJiYgaGxlbiA+PSBzaXplb2YoKnRwKSAmJiBobGVuIDw9IGxlbmd0aCkgeworCQlpZiAoKHVfY2hhciAqKXRwICsgNCArIHNpemVvZihzdHJ1Y3Qgc3VucnBjX21zZykgPD0gc25hcGVuZCAmJgorCQkgICAgZHBvcnQgPT0gTkZTX1BPUlQpIHsKKwkJCW5mc3JlcV9wcmludCgodV9jaGFyICopdHAgKyBobGVuICsgNCwgbGVuZ3RoIC0gaGxlbiwKKwkJCQkgICAgICh1X2NoYXIgKilpcCk7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoKHVfY2hhciAqKXRwICsgNCArIHNpemVvZihzdHJ1Y3Qgc3VucnBjX21zZykKKwkJCSAgIDw9IHNuYXBlbmQgJiYKKwkJCSAgIHNwb3J0ID09IE5GU19QT1JUKSB7CisJCQluZnNyZXBseV9wcmludCgodV9jaGFyICopdHAgKyBobGVuICsgNCwgbGVuZ3RoIC0gaGxlbiwKKwkJCQkgICAgICAgKHVfY2hhciAqKWlwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNpZmRlZiBJTkVUNgorCWlmIChpcDYpIHsKKwkJaWYgKGlwNi0+aXA2X254dCA9PSBJUFBST1RPX1RDUCkgeworCQkJKHZvaWQpcHJpbnRmKCIlcy4lcyA+ICVzLiVzOiAiLAorCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLAorCQkJCXRjcHBvcnRfc3RyaW5nKHNwb3J0KSwKKwkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSwKKwkJCQl0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOworCQl9IGVsc2UgeworCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAorCQkJCXRjcHBvcnRfc3RyaW5nKHNwb3J0KSwgdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKKwkJfQorCX0gZWxzZQorI2VuZGlmIC8qSU5FVDYqLworCXsKKwkJaWYgKGlwLT5pcF9wID09IElQUFJPVE9fVENQKSB7CisJCQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsCisJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksCisJCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLAorCQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpLAorCQkJCXRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCX0gZWxzZSB7CisJCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsCisJCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLCB0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOworCQl9CisJfQorCisJaWYgKGhsZW4gPCBzaXplb2YoKnRwKSkgeworCQkodm9pZClwcmludGYoIiB0Y3AgJWQgW2JhZCBoZHIgbGVuZ3RoICV1IC0gdG9vIHNob3J0LCA8ICVsdV0iLAorCQkgICAgbGVuZ3RoIC0gaGxlbiwgaGxlbiwgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKCp0cCkpOworCQlyZXR1cm47CisJfQorCisJVENIRUNLKCp0cCk7CisKKwlzZXEgPSBFWFRSQUNUXzMyQklUUygmdHAtPnRoX3NlcSk7CisJYWNrID0gRVhUUkFDVF8zMkJJVFMoJnRwLT50aF9hY2spOworCXdpbiA9IEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfd2luKTsKKwl1cnAgPSBFWFRSQUNUXzE2QklUUygmdHAtPnRoX3VycCk7CisKKwlpZiAocWZsYWcpIHsKKwkJKHZvaWQpcHJpbnRmKCJ0Y3AgJWQiLCBsZW5ndGggLSBobGVuKTsKKwkJaWYgKGhsZW4gPiBsZW5ndGgpIHsKKwkJCSh2b2lkKXByaW50ZigiIFtiYWQgaGRyIGxlbmd0aCAldSAtIHRvbyBsb25nLCA+ICV1XSIsCisJCQkgICAgaGxlbiwgbGVuZ3RoKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmICgoZmxhZ3MgPSB0cC0+dGhfZmxhZ3MpICYgKFRIX1NZTnxUSF9GSU58VEhfUlNUfFRIX1BVU0h8CisJCQkJICAgICAgVEhfRUNORUNIT3xUSF9DV1IpKSB7CisJCWlmIChmbGFncyAmIFRIX1NZTikKKwkJCXB1dGNoYXIoJ1MnKTsKKwkJaWYgKGZsYWdzICYgVEhfRklOKQorCQkJcHV0Y2hhcignRicpOworCQlpZiAoZmxhZ3MgJiBUSF9SU1QpCisJCQlwdXRjaGFyKCdSJyk7CisJCWlmIChmbGFncyAmIFRIX1BVU0gpCisJCQlwdXRjaGFyKCdQJyk7CisJCWlmIChmbGFncyAmIFRIX0NXUikKKwkJCXB1dGNoYXIoJ1cnKTsJLyogY29uZ2VzdGlvbiBfV19pbmRvdyByZWR1Y2VkIChFQ04pICovCisJCWlmIChmbGFncyAmIFRIX0VDTkVDSE8pCisJCQlwdXRjaGFyKCdFJyk7CS8qIGVjbiBfRV9jaG8gc2VudCAoRUNOKSAqLworCX0gZWxzZQorCQlwdXRjaGFyKCcuJyk7CisKKwlpZiAoIVNmbGFnICYmIChmbGFncyAmIFRIX0FDSykpIHsKKwkJcmVnaXN0ZXIgc3RydWN0IHRjcF9zZXFfaGFzaCAqdGg7CisJCWNvbnN0IHZvaWQgKnNyYywgKmRzdDsKKwkJcmVnaXN0ZXIgaW50IHJldjsKKwkJc3RydWN0IHRoYSB0aGE7CisJCS8qCisJCSAqIEZpbmQgKG9yIHJlY29yZCkgdGhlIGluaXRpYWwgc2VxdWVuY2UgbnVtYmVycyBmb3IKKwkJICogdGhpcyBjb252ZXJzYXRpb24uICAod2UgcGljayBhbiBhcmJpdHJhcnkKKwkJICogY29sbGF0aW5nIG9yZGVyIHNvIHRoZXJlJ3Mgb25seSBvbmUgZW50cnkgZm9yCisJCSAqIGJvdGggZGlyZWN0aW9ucykuCisJCSAqLworI2lmZGVmIElORVQ2CisJCW1lbXNldCgmdGhhLCAwLCBzaXplb2YodGhhKSk7CisJCXJldiA9IDA7CisJCWlmIChpcDYpIHsKKwkJCXNyYyA9ICZpcDYtPmlwNl9zcmM7CisJCQlkc3QgPSAmaXA2LT5pcDZfZHN0OworCQkJaWYgKHNwb3J0ID4gZHBvcnQpCisJCQkJcmV2ID0gMTsKKwkJCWVsc2UgaWYgKHNwb3J0ID09IGRwb3J0KSB7CisJCQkJaWYgKG1lbWNtcChzcmMsIGRzdCwgc2l6ZW9mIGlwNi0+aXA2X2RzdCkgPiAwKQorCQkJCQlyZXYgPSAxOworCQkJfQorCQkJaWYgKHJldikgeworCQkJCW1lbWNweSgmdGhhLnNyYywgZHN0LCBzaXplb2YgaXA2LT5pcDZfZHN0KTsKKwkJCQltZW1jcHkoJnRoYS5kc3QsIHNyYywgc2l6ZW9mIGlwNi0+aXA2X3NyYyk7CisJCQkJdGhhLnBvcnQgPSBkcG9ydCA8PCAxNiB8IHNwb3J0OworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoJnRoYS5kc3QsIGRzdCwgc2l6ZW9mIGlwNi0+aXA2X2RzdCk7CisJCQkJbWVtY3B5KCZ0aGEuc3JjLCBzcmMsIHNpemVvZiBpcDYtPmlwNl9zcmMpOworCQkJCXRoYS5wb3J0ID0gc3BvcnQgPDwgMTYgfCBkcG9ydDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNyYyA9ICZpcC0+aXBfc3JjOworCQkJZHN0ID0gJmlwLT5pcF9kc3Q7CisJCQlpZiAoc3BvcnQgPiBkcG9ydCkKKwkJCQlyZXYgPSAxOworCQkJZWxzZSBpZiAoc3BvcnQgPT0gZHBvcnQpIHsKKwkJCQlpZiAobWVtY21wKHNyYywgZHN0LCBzaXplb2YgaXAtPmlwX2RzdCkgPiAwKQorCQkJCQlyZXYgPSAxOworCQkJfQorCQkJaWYgKHJldikgeworCQkJCW1lbWNweSgmdGhhLnNyYywgZHN0LCBzaXplb2YgaXAtPmlwX2RzdCk7CisJCQkJbWVtY3B5KCZ0aGEuZHN0LCBzcmMsIHNpemVvZiBpcC0+aXBfc3JjKTsKKwkJCQl0aGEucG9ydCA9IGRwb3J0IDw8IDE2IHwgc3BvcnQ7CisJCQl9IGVsc2UgeworCQkJCW1lbWNweSgmdGhhLmRzdCwgZHN0LCBzaXplb2YgaXAtPmlwX2RzdCk7CisJCQkJbWVtY3B5KCZ0aGEuc3JjLCBzcmMsIHNpemVvZiBpcC0+aXBfc3JjKTsKKwkJCQl0aGEucG9ydCA9IHNwb3J0IDw8IDE2IHwgZHBvcnQ7CisJCQl9CisJCX0KKyNlbHNlCisJCXJldiA9IDA7CisJCXNyYyA9ICZpcC0+aXBfc3JjOworCQlkc3QgPSAmaXAtPmlwX2RzdDsKKwkJaWYgKHNwb3J0ID4gZHBvcnQpCisJCQlyZXYgPSAxOworCQllbHNlIGlmIChzcG9ydCA9PSBkcG9ydCkgeworCQkJaWYgKG1lbWNtcChzcmMsIGRzdCwgc2l6ZW9mIGlwLT5pcF9kc3QpID4gMCkKKwkJCQlyZXYgPSAxOworCQl9CisJCWlmIChyZXYpIHsKKwkJCW1lbWNweSgmdGhhLnNyYywgZHN0LCBzaXplb2YgaXAtPmlwX2RzdCk7CisJCQltZW1jcHkoJnRoYS5kc3QsIHNyYywgc2l6ZW9mIGlwLT5pcF9zcmMpOworCQkJdGhhLnBvcnQgPSBkcG9ydCA8PCAxNiB8IHNwb3J0OworCQl9IGVsc2UgeworCQkJbWVtY3B5KCZ0aGEuZHN0LCBkc3QsIHNpemVvZiBpcC0+aXBfZHN0KTsKKwkJCW1lbWNweSgmdGhhLnNyYywgc3JjLCBzaXplb2YgaXAtPmlwX3NyYyk7CisJCQl0aGEucG9ydCA9IHNwb3J0IDw8IDE2IHwgZHBvcnQ7CisJCX0KKyNlbmRpZgorCisJCXRocmV2ID0gcmV2OworCQlmb3IgKHRoID0gJnRjcF9zZXFfaGFzaFt0aGEucG9ydCAlIFRTRVFfSEFTSFNJWkVdOworCQkgICAgIHRoLT5ueHQ7IHRoID0gdGgtPm54dCkKKwkJCWlmIChtZW1jbXAoKGNoYXIgKikmdGhhLCAoY2hhciAqKSZ0aC0+YWRkciwKKwkJCQkgIHNpemVvZih0aC0+YWRkcikpID09IDApCisJCQkJYnJlYWs7CisKKwkJaWYgKCF0aC0+bnh0IHx8IChmbGFncyAmIFRIX1NZTikpIHsKKwkJCS8qIGRpZG4ndCBmaW5kIGl0IG9yIG5ldyBjb252ZXJzYXRpb24gKi8KKwkJCWlmICh0aC0+bnh0ID09IE5VTEwpIHsKKwkJCQl0aC0+bnh0ID0gKHN0cnVjdCB0Y3Bfc2VxX2hhc2ggKikKKwkJCQkJY2FsbG9jKDEsIHNpemVvZigqdGgpKTsKKwkJCQlpZiAodGgtPm54dCA9PSBOVUxMKQorCQkJCQllcnJvcigidGNwX3ByaW50OiBjYWxsb2MiKTsKKwkJCX0KKwkJCXRoLT5hZGRyID0gdGhhOworCQkJaWYgKHJldikKKwkJCQl0aC0+YWNrID0gc2VxLCB0aC0+c2VxID0gYWNrIC0gMTsKKwkJCWVsc2UKKwkJCQl0aC0+c2VxID0gc2VxLCB0aC0+YWNrID0gYWNrIC0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXYpCisJCQkJc2VxIC09IHRoLT5hY2ssIGFjayAtPSB0aC0+c2VxOworCQkJZWxzZQorCQkJCXNlcSAtPSB0aC0+c2VxLCBhY2sgLT0gdGgtPmFjazsKKwkJfQorCisJCXRoc2VxID0gdGgtPnNlcTsKKwkJdGhhY2sgPSB0aC0+YWNrOworCX0gZWxzZSB7CisJCS8qZm9vbCBnY2MqLworCQl0aHNlcSA9IHRoYWNrID0gdGhyZXYgPSAwOworCX0KKwlpZiAoaGxlbiA+IGxlbmd0aCkgeworCQkodm9pZClwcmludGYoIiBbYmFkIGhkciBsZW5ndGggJXUgLSB0b28gbG9uZywgPiAldV0iLAorCQkgICAgaGxlbiwgbGVuZ3RoKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChJUF9WKGlwKSA9PSA0ICYmIHZmbGFnICYmICFmcmFnbWVudGVkKSB7CisJCXVfaW50MTZfdCBzdW0sIHRjcF9zdW07CisJCWlmIChUVEVTVDIodHAtPnRoX3Nwb3J0LCBsZW5ndGgpKSB7CisJCQlzdW0gPSB0Y3BfY2tzdW0oaXAsIHRwLCBsZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiwgY2tzdW0gMHglMDR4IixFWFRSQUNUXzE2QklUUygmdHAtPnRoX3N1bSkpOworCQkJaWYgKHN1bSAhPSAwKSB7CisJCQkJdGNwX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfc3VtKTsKKwkJCQkodm9pZClwcmludGYoIiAoaW5jb3JyZWN0ICgtPiAweCUwNHgpLCIsaW5fY2tzdW1fc2hvdWxkYmUodGNwX3N1bSwgc3VtKSk7CisJCQl9IGVsc2UKKwkJCQkodm9pZClwcmludGYoIiAoY29ycmVjdCksIik7CisJCX0KKwl9CisjaWZkZWYgSU5FVDYKKwlpZiAoSVBfVihpcCkgPT0gNiAmJiBpcDYtPmlwNl9wbGVuICYmIHZmbGFnICYmICFmcmFnbWVudGVkKSB7CisJCXVfaW50MTZfdCBzdW0sdGNwX3N1bTsKKwkJaWYgKFRURVNUMih0cC0+dGhfc3BvcnQsIGxlbmd0aCkpIHsKKwkJCXN1bSA9IHRjcDZfY2tzdW0oaXA2LCB0cCwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiLCBja3N1bSAweCUwNHgiLEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfc3VtKSk7CisJCQlpZiAoc3VtICE9IDApIHsKKwkJCQl0Y3Bfc3VtID0gRVhUUkFDVF8xNkJJVFMoJnRwLT50aF9zdW0pOworCQkJCSh2b2lkKXByaW50ZigiIChpbmNvcnJlY3QgKC0+IDB4JTA0eCksIixpbl9ja3N1bV9zaG91bGRiZSh0Y3Bfc3VtLCBzdW0pKTsKKwkJCX0gZWxzZQorCQkJCSh2b2lkKXByaW50ZigiIChjb3JyZWN0KSwiKTsKKworCQl9CisJfQorI2VuZGlmCisKKwlsZW5ndGggLT0gaGxlbjsKKwlpZiAodmZsYWcgPiAxIHx8IGxlbmd0aCA+IDAgfHwgZmxhZ3MgJiAoVEhfU1lOIHwgVEhfRklOIHwgVEhfUlNUKSkKKwkJKHZvaWQpcHJpbnRmKCIgJXU6JXUoJXUpIiwgc2VxLCBzZXEgKyBsZW5ndGgsIGxlbmd0aCk7CisJaWYgKGZsYWdzICYgVEhfQUNLKQorCQkodm9pZClwcmludGYoIiBhY2sgJXUiLCBhY2spOworCisJKHZvaWQpcHJpbnRmKCIgd2luICVkIiwgd2luKTsKKworCWlmIChmbGFncyAmIFRIX1VSRykKKwkJKHZvaWQpcHJpbnRmKCIgdXJnICVkIiwgdXJwKTsKKwkvKgorCSAqIEhhbmRsZSBhbnkgb3B0aW9ucy4KKwkgKi8KKwlpZiAoaGxlbiA+IHNpemVvZigqdHApKSB7CisJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3A7CisJCXJlZ2lzdGVyIHVfaW50IGksIG9wdCwgZGF0YWxlbjsKKwkJcmVnaXN0ZXIgdV9pbnQgbGVuOworCisJCWhsZW4gLT0gc2l6ZW9mKCp0cCk7CisJCWNwID0gKGNvbnN0IHVfY2hhciAqKXRwICsgc2l6ZW9mKCp0cCk7CisJCXB1dGNoYXIoJyAnKTsKKwkJY2ggPSAnPCc7CisJCXdoaWxlIChobGVuID4gMCkgeworCQkJcHV0Y2hhcihjaCk7CisJCQlUQ0hFQ0soKmNwKTsKKwkJCW9wdCA9ICpjcCsrOworCQkJaWYgKFpFUk9MRU5PUFQob3B0KSkKKwkJCQlsZW4gPSAxOworCQkJZWxzZSB7CisJCQkJVENIRUNLKCpjcCk7CisJCQkJbGVuID0gKmNwKys7CS8qIHRvdGFsIGluY2x1ZGluZyB0eXBlLCBsZW4gKi8KKwkJCQlpZiAobGVuIDwgMiB8fCBsZW4gPiBobGVuKQorCQkJCQlnb3RvIGJhZDsKKwkJCQktLWhsZW47CQkvKiBhY2NvdW50IGZvciBsZW5ndGggYnl0ZSAqLworCQkJfQorCQkJLS1obGVuOwkJCS8qIGFjY291bnQgZm9yIHR5cGUgYnl0ZSAqLworCQkJZGF0YWxlbiA9IDA7CisKKy8qIEJhaWwgaWYgImwiIGJ5dGVzIG9mIGRhdGEgYXJlIG5vdCBsZWZ0IG9yIHdlcmUgbm90IGNhcHR1cmVkICAqLworI2RlZmluZSBMRU5DSEVDSyhsKSB7IGlmICgobCkgPiBobGVuKSBnb3RvIGJhZDsgVENIRUNLMigqY3AsIGwpOyB9CisKKwkJCXN3aXRjaCAob3B0KSB7CisKKwkJCWNhc2UgVENQT1BUX01BWFNFRzoKKwkJCQkodm9pZClwcmludGYoIm1zcyIpOworCQkJCWRhdGFsZW4gPSAyOworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKKworCQkJCWJyZWFrOworCisJCQljYXNlIFRDUE9QVF9FT0w6CisJCQkJKHZvaWQpcHJpbnRmKCJlb2wiKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQ1BPUFRfTk9QOgorCQkJCSh2b2lkKXByaW50Zigibm9wIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX1dTQ0FMRToKKwkJCQkodm9pZClwcmludGYoIndzY2FsZSIpOworCQkJCWRhdGFsZW4gPSAxOworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworCQkJCSh2b2lkKXByaW50ZigiICV1IiwgKmNwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQ1BPUFRfU0FDS09LOgorCQkJCSh2b2lkKXByaW50Zigic2Fja09LIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX1NBQ0s6CisJCQkJZGF0YWxlbiA9IGxlbiAtIDI7CisJCQkJaWYgKGRhdGFsZW4gJSA4ICE9IDApIHsKKwkJCQkJKHZvaWQpcHJpbnRmKCJtYWxmb3JtZWQgc2FjayIpOworCQkJCX0gZWxzZSB7CisJCQkJCXVfaW50MzJfdCBzLCBlOworCisJCQkJCSh2b2lkKXByaW50Zigic2FjayAlZCAiLCBkYXRhbGVuIC8gOCk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBkYXRhbGVuOyBpICs9IDgpIHsKKwkJCQkJCUxFTkNIRUNLKGkgKyA0KTsKKwkJCQkJCXMgPSBFWFRSQUNUXzMyQklUUyhjcCArIGkpOworCQkJCQkJTEVOQ0hFQ0soaSArIDgpOworCQkJCQkJZSA9IEVYVFJBQ1RfMzJCSVRTKGNwICsgaSArIDQpOworCQkJCQkJaWYgKHRocmV2KSB7CisJCQkJCQkJcyAtPSB0aHNlcTsKKwkJCQkJCQllIC09IHRoc2VxOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlzIC09IHRoYWNrOworCQkJCQkJCWUgLT0gdGhhY2s7CisJCQkJCQl9CisJCQkJCQkodm9pZClwcmludGYoInsldToldX0iLCBzLCBlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBUQ1BPUFRfRUNITzoKKwkJCQkodm9pZClwcmludGYoImVjaG8iKTsKKwkJCQlkYXRhbGVuID0gNDsKKwkJCQlMRU5DSEVDSyhkYXRhbGVuKTsKKwkJCQkodm9pZClwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX0VDSE9SRVBMWToKKwkJCQkodm9pZClwcmludGYoImVjaG9yZXBseSIpOworCQkJCWRhdGFsZW4gPSA0OworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQ1BPUFRfVElNRVNUQU1QOgorCQkJCSh2b2lkKXByaW50ZigidGltZXN0YW1wIik7CisJCQkJZGF0YWxlbiA9IDg7CisJCQkJTEVOQ0hFQ0soNCk7CisJCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3AgKyA0KSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX0NDOgorCQkJCSh2b2lkKXByaW50ZigiY2MiKTsKKwkJCQlkYXRhbGVuID0gNDsKKwkJCQlMRU5DSEVDSyhkYXRhbGVuKTsKKwkJCQkodm9pZClwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX0NDTkVXOgorCQkJCSh2b2lkKXByaW50ZigiY2NuZXciKTsKKwkJCQlkYXRhbGVuID0gNDsKKwkJCQlMRU5DSEVDSyhkYXRhbGVuKTsKKwkJCQkodm9pZClwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVENQT1BUX0NDRUNITzoKKwkJCQkodm9pZClwcmludGYoImNjZWNobyIpOworCQkJCWRhdGFsZW4gPSA0OworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBUQ1BPUFRfU0lHTkFUVVJFOgorCQkJCSh2b2lkKXByaW50ZigibWQ1OiIpOworCQkJCWRhdGFsZW4gPSBUQ1BfU0lHTEVOOworCQkJCUxFTkNIRUNLKGRhdGFsZW4pOworI2lmZGVmIEhBVkVfTElCQ1JZUFRPCisJCQkJc3dpdGNoICh0Y3BfdmVyaWZ5X3NpZ25hdHVyZShpcCwgdHAsCisJCQkJICAgIGJwICsgVEhfT0ZGKHRwKSAqIDQsIGxlbmd0aCwgY3ApKSB7CisKKwkJCQljYXNlIFNJR05BVFVSRV9WQUxJRDoKKwkJCQkJKHZvaWQpcHJpbnRmKCJ2YWxpZCIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU0lHTkFUVVJFX0lOVkFMSUQ6CisJCQkJCSh2b2lkKXByaW50ZigiaW52YWxpZCIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgQ0FOVF9DSEVDS19TSUdOQVRVUkU6CisJCQkJCSh2b2lkKXByaW50ZigiY2FuJ3QgY2hlY2sgLSAiKTsKKwkJCQkJZm9yIChpID0gMDsgaSA8IFRDUF9TSUdMRU47ICsraSkKKwkJCQkJCSh2b2lkKXByaW50ZigiJTAyeCIsIGNwW2ldKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2Vsc2UKKwkJCQlmb3IgKGkgPSAwOyBpIDwgVENQX1NJR0xFTjsgKytpKQorCQkJCQkodm9pZClwcmludGYoIiUwMngiLCBjcFtpXSk7CisjZW5kaWYKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkodm9pZClwcmludGYoIm9wdC0ldToiLCBvcHQpOworCQkJCWRhdGFsZW4gPSBsZW4gLSAyOworCQkJCWZvciAoaSA9IDA7IGkgPCBkYXRhbGVuOyArK2kpIHsKKwkJCQkJTEVOQ0hFQ0soaSk7CisJCQkJCSh2b2lkKXByaW50ZigiJTAyeCIsIGNwW2ldKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIEFjY291bnQgZm9yIGRhdGEgcHJpbnRlZCAqLworCQkJY3AgKz0gZGF0YWxlbjsKKwkJCWhsZW4gLT0gZGF0YWxlbjsKKworCQkJLyogQ2hlY2sgc3BlY2lmaWNhdGlvbiBhZ2FpbnN0IG9ic2VydmVkIGxlbmd0aCAqLworCQkJKytkYXRhbGVuOwkJCS8qIG9wdGlvbiBvY3RldCAqLworCQkJaWYgKCFaRVJPTEVOT1BUKG9wdCkpCisJCQkJKytkYXRhbGVuOwkJLyogc2l6ZSBvY3RldCAqLworCQkJaWYgKGRhdGFsZW4gIT0gbGVuKQorCQkJCSh2b2lkKXByaW50ZigiW2xlbiAlZF0iLCBsZW4pOworCQkJY2ggPSAnLCc7CisJCQlpZiAob3B0ID09IFRDUE9QVF9FT0wpCisJCQkJYnJlYWs7CisJCX0KKwkJcHV0Y2hhcignPicpOworCX0KKworCWlmIChsZW5ndGggPD0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEZWNvZGUgcGF5bG9hZCBpZiBuZWNlc3NhcnkuCisJICovCisJYnAgKz0gVEhfT0ZGKHRwKSAqIDQ7CisJaWYgKGZsYWdzICYgVEhfUlNUKSB7CisJCWlmICh2ZmxhZykKKwkJCXByaW50X3RjcF9yc3RfZGF0YShicCwgbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlpZiAoc3BvcnQgPT0gVEVMTkVUX1BPUlQgfHwgZHBvcnQgPT0gVEVMTkVUX1BPUlQpIHsKKwkJCWlmICghcWZsYWcgJiYgdmZsYWcpCisJCQkJdGVsbmV0X3ByaW50KGJwLCBsZW5ndGgpOworCQl9IGVsc2UgaWYgKHNwb3J0ID09IEJHUF9QT1JUIHx8IGRwb3J0ID09IEJHUF9QT1JUKQorCQkJYmdwX3ByaW50KGJwLCBsZW5ndGgpOworCQllbHNlIGlmIChzcG9ydCA9PSBQUFRQX1BPUlQgfHwgZHBvcnQgPT0gUFBUUF9QT1JUKQorCQkJcHB0cF9wcmludChicCk7CisjaWZkZWYgVENQRFVNUF9ET19TTUIKKwkJZWxzZSBpZiAoc3BvcnQgPT0gTkVUQklPU19TU05fUE9SVCB8fCBkcG9ydCA9PSBORVRCSU9TX1NTTl9QT1JUKQorCQkJbmJ0X3RjcF9wcmludChicCwgbGVuZ3RoKTsKKyNlbmRpZgorCQllbHNlIGlmIChzcG9ydCA9PSBCRUVQX1BPUlQgfHwgZHBvcnQgPT0gQkVFUF9QT1JUKQorCQkJYmVlcF9wcmludChicCwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAobGVuZ3RoID4gMiAmJgorCQkgICAgKHNwb3J0ID09IE5BTUVTRVJWRVJfUE9SVCB8fCBkcG9ydCA9PSBOQU1FU0VSVkVSX1BPUlQgfHwKKwkJICAgICBzcG9ydCA9PSBNVUxUSUNBU1RETlNfUE9SVCB8fCBkcG9ydCA9PSBNVUxUSUNBU1RETlNfUE9SVCkpIHsKKwkJCS8qCisJCQkgKiBUQ1AgRE5TIHF1ZXJ5IGhhcyAyYnl0ZSBsZW5ndGggYXQgdGhlIGhlYWQuCisJCQkgKiBYWFggcGFja2V0IGNvdWxkIGJlIHVuYWxpZ25lZCwgaXQgY2FuIGdvIHN0cmFuZ2UKKwkJCSAqLworCQkJbnNfcHJpbnQoYnAgKyAyLCBsZW5ndGggLSAyLCAwKTsKKwkJfSBlbHNlIGlmIChzcG9ydCA9PSBNU0RQX1BPUlQgfHwgZHBvcnQgPT0gTVNEUF9QT1JUKSB7CisJCQltc2RwX3ByaW50KGJwLCBsZW5ndGgpOworCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobGVuZ3RoID4gMCAmJiAoc3BvcnQgPT0gTERQX1BPUlQgfHwgZHBvcnQgPT0gTERQX1BPUlQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZHBfcHJpbnQoYnAsIGxlbmd0aCk7CisJCX0KKwl9CisJcmV0dXJuOworYmFkOgorCWZwdXRzKCJbYmFkIG9wdF0iLCBzdGRvdXQpOworCWlmIChjaCAhPSAnXDAnKQorCQlwdXRjaGFyKCc+Jyk7CisJcmV0dXJuOwordHJ1bmM6CisJZnB1dHMoIlt8dGNwXSIsIHN0ZG91dCk7CisJaWYgKGNoICE9ICdcMCcpCisJCXB1dGNoYXIoJz4nKTsKK30KKworLyoKKyAqIFJGQzExMjIgc2F5cyB0aGUgZm9sbG93aW5nIG9uIGRhdGEgaW4gUlNUIHNlZ21lbnRzOgorICoKKyAqICAgICAgICAgNC4yLjIuMTIgIFJTVCBTZWdtZW50OiBSRkMtNzkzIFNlY3Rpb24gMy40CisgKgorICogICAgICAgICAgICBBIFRDUCBTSE9VTEQgYWxsb3cgYSByZWNlaXZlZCBSU1Qgc2VnbWVudCB0byBpbmNsdWRlIGRhdGEuCisgKgorICogICAgICAgICAgICBESVNDVVNTSU9OCisgKiAgICAgICAgICAgICAgICAgSXQgaGFzIGJlZW4gc3VnZ2VzdGVkIHRoYXQgYSBSU1Qgc2VnbWVudCBjb3VsZCBjb250YWluCisgKiAgICAgICAgICAgICAgICAgQVNDSUkgdGV4dCB0aGF0IGVuY29kZWQgYW5kIGV4cGxhaW5lZCB0aGUgY2F1c2Ugb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgUlNULiAgTm8gc3RhbmRhcmQgaGFzIHlldCBiZWVuIGVzdGFibGlzaGVkIGZvciBzdWNoCisgKiAgICAgICAgICAgICAgICAgZGF0YS4KKyAqCisgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X3RjcF9yc3RfZGF0YShyZWdpc3RlciBjb25zdCB1X2NoYXIgKnNwLCB1X2ludCBsZW5ndGgpCit7CisJaW50IGM7CisKKwlpZiAoVFRFU1QyKCpzcCwgbGVuZ3RoKSkKKwkJcHJpbnRmKCIgW1JTVCIpOworCWVsc2UKKwkJcHJpbnRmKCIgWyFSU1QiKTsKKwlpZiAobGVuZ3RoID4gTUFYX1JTVF9EQVRBX0xFTikgeworCQlsZW5ndGggPSBNQVhfUlNUX0RBVEFfTEVOOwkvKiBjYW4gdXNlIC1YIGZvciBsb25nZXIgKi8KKwkJcHV0Y2hhcignKycpOwkJCS8qIGluZGljYXRlIHdlIHRydW5jYXRlICovCisJfQorCXB1dGNoYXIoJyAnKTsKKwl3aGlsZSAobGVuZ3RoLS0gJiYgc3AgPD0gc25hcGVuZCkgeworCQljID0gKnNwKys7CisJCXNhZmVwdXRjaGFyKGMpOworCX0KKwlwdXRjaGFyKCddJyk7Cit9CisKKyNpZmRlZiBIQVZFX0xJQkNSWVBUTworc3RhdGljIGludAordGNwX3ZlcmlmeV9zaWduYXR1cmUoY29uc3Qgc3RydWN0IGlwICppcCwgY29uc3Qgc3RydWN0IHRjcGhkciAqdHAsCisgICAgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgbGVuZ3RoLCBjb25zdCB1X2NoYXIgKnJjdnNpZykKK3sKKyAgICAgICAgc3RydWN0IHRjcGhkciB0cDE7CisJdV9jaGFyIHNpZ1tUQ1BfU0lHTEVOXTsKKwljaGFyIHplcm9fcHJvdG8gPSAwOworCU1ENV9DVFggY3R4OworCXVfaW50MTZfdCBzYXZlY3N1bSwgdGxlbjsKKyNpZmRlZiBJTkVUNgorCXN0cnVjdCBpcDZfaGRyICppcDY7CisjZW5kaWYKKwl1X2ludDMyX3QgbGVuMzI7CisJdV9pbnQ4X3Qgbnh0OworCisJdHAxID0gKnRwOworCisJaWYgKHRjcG1kNXNlY3JldCA9PSBOVUxMKQorCQlyZXR1cm4gKENBTlRfQ0hFQ0tfU0lHTkFUVVJFKTsKKworCU1ENV9Jbml0KCZjdHgpOworCS8qCisJICogU3RlcCAxOiBVcGRhdGUgTUQ1IGhhc2ggd2l0aCBJUCBwc2V1ZG8taGVhZGVyLgorCSAqLworCWlmIChJUF9WKGlwKSA9PSA0KSB7CisJCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmaXAtPmlwX3NyYywgc2l6ZW9mKGlwLT5pcF9zcmMpKTsKKwkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZpcC0+aXBfZHN0LCBzaXplb2YoaXAtPmlwX2RzdCkpOworCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJnplcm9fcHJvdG8sIHNpemVvZih6ZXJvX3Byb3RvKSk7CisJCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmaXAtPmlwX3AsIHNpemVvZihpcC0+aXBfcCkpOworCQl0bGVuID0gRVhUUkFDVF8xNkJJVFMoJmlwLT5pcF9sZW4pIC0gSVBfSEwoaXApICogNDsKKwkJdGxlbiA9IGh0b25zKHRsZW4pOworCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJnRsZW4sIHNpemVvZih0bGVuKSk7CisjaWZkZWYgSU5FVDYKKwl9IGVsc2UgaWYgKElQX1YoaXApID09IDYpIHsKKwkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopaXA7CisJCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmaXA2LT5pcDZfc3JjLCBzaXplb2YoaXA2LT5pcDZfc3JjKSk7CisJCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmaXA2LT5pcDZfZHN0LCBzaXplb2YoaXA2LT5pcDZfZHN0KSk7CisJCWxlbjMyID0gaHRvbmwobnRvaHMoaXA2LT5pcDZfcGxlbikpOworCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJmxlbjMyLCBzaXplb2YobGVuMzIpKTsKKwkJbnh0ID0gMDsKKwkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZueHQsIHNpemVvZihueHQpKTsKKwkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZueHQsIHNpemVvZihueHQpKTsKKwkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZueHQsIHNpemVvZihueHQpKTsKKwkJbnh0ID0gSVBQUk9UT19UQ1A7CisJCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmbnh0LCBzaXplb2Yobnh0KSk7CisjZW5kaWYKKwl9IGVsc2UKKwkJcmV0dXJuIChDQU5UX0NIRUNLX1NJR05BVFVSRSk7CisKKwkvKgorCSAqIFN0ZXAgMjogVXBkYXRlIE1ENSBoYXNoIHdpdGggVENQIGhlYWRlciwgZXhjbHVkaW5nIG9wdGlvbnMuCisJICogVGhlIFRDUCBjaGVja3N1bSBtdXN0IGJlIHNldCB0byB6ZXJvLgorCSAqLworCXNhdmVjc3VtID0gdHAxLnRoX3N1bTsKKwl0cDEudGhfc3VtID0gMDsKKwlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJnRwMSwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwl0cDEudGhfc3VtID0gc2F2ZWNzdW07CisJLyoKKwkgKiBTdGVwIDM6IFVwZGF0ZSBNRDUgaGFzaCB3aXRoIFRDUCBzZWdtZW50IGRhdGEsIGlmIHByZXNlbnQuCisJICovCisJaWYgKGxlbmd0aCA+IDApCisJCU1ENV9VcGRhdGUoJmN0eCwgZGF0YSwgbGVuZ3RoKTsKKwkvKgorCSAqIFN0ZXAgNDogVXBkYXRlIE1ENSBoYXNoIHdpdGggc2hhcmVkIHNlY3JldC4KKwkgKi8KKwlNRDVfVXBkYXRlKCZjdHgsIHRjcG1kNXNlY3JldCwgc3RybGVuKHRjcG1kNXNlY3JldCkpOworCU1ENV9GaW5hbChzaWcsICZjdHgpOworCisJaWYgKG1lbWNtcChyY3ZzaWcsIHNpZywgVENQX1NJR0xFTikgPT0gMCkKKwkJcmV0dXJuIChTSUdOQVRVUkVfVkFMSUQpOworCWVsc2UKKwkJcmV0dXJuIChTSUdOQVRVUkVfSU5WQUxJRCk7Cit9CisjZW5kaWYgLyogSEFWRV9MSUJDUllQVE8gKi8KZGlmZiAtLWdpdCBhL3ByaW50LXRlbG5ldC5jIGIvcHJpbnQtdGVsbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4ODcyNwotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXRlbG5ldC5jCkBAIC0wLDAgKzEsMjY3IEBACisvKgkkTmV0QlNEOiBwcmludC10ZWxuZXQuYyx2IDEuMiAxOTk5LzEwLzExIDEyOjQwOjEyIHNqZyBFeHAgJCAJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCisgKiBieSBTaW1vbiBKLiBHZXJyYXR5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECisgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworLyoKKyAqICAgICAgQCgjKUNvcHlyaWdodCAoYykgMTk5NCwgU2ltb24gSi4gR2VycmF0eS4KKyAqCisgKiAgICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gIEl0IGNvbWVzIHdpdGggTk8gV0FSUkFOVFkuCisgKiAgICAgIFBlcm1pc3Npb24gdG8gdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb3VyY2UgY29kZQorICogICAgICBpcyBncmFudGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zLgorICogICAgICAxLyB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZQorICogICAgICBhcmUgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdGVsbmV0LmMsdiAxLjI0IDIwMDMvMTIvMjkgMTE6MDU6MTAgaGFubmVzIEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisKKyNkZWZpbmUgVEVMQ01EUworI2RlZmluZSBURUxPUFRTCisjaW5jbHVkZSAidGVsbmV0LmgiCisKKy8qIG5vcm1hbCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNtZHNbXSA9IHsKKwkiSVMiLCAiU0VORCIsICJJTkZPIiwKK307CisKKy8qIDM3OiBBdXRoZW50aWNhdGlvbiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF1dGhjbWRbXSA9IHsKKwkiSVMiLCAiU0VORCIsICJSRVBMWSIsICJOQU1FIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqYXV0aHR5cGVbXSA9IHsKKwkiTlVMTCIsICJLRVJCRVJPU19WNCIsICJLRVJCRVJPU19WNSIsICJTUFgiLCAiTUlOSyIsCisJIlNSUCIsICJSU0EiLCAiU1NMIiwgTlVMTCwgTlVMTCwKKwkiTE9LSSIsICJTU0EiLCAiS0VBX1NKIiwgIktFQV9TSl9JTlRFRyIsICJEU1MiLAorCSJOVExNIiwKK307CisKKy8qIDM4OiBFbmNyeXB0aW9uICovCitzdGF0aWMgY29uc3QgY2hhciAqZW5jY21kW10gPSB7CisJIklTIiwgIlNVUFBPUlQiLCAiUkVQTFkiLCAiU1RBUlQiLCAiRU5EIiwKKwkiUkVRVUVTVC1TVEFSVCIsICJSRVFVRVNULUVORCIsICJFTkRfS0VZSUQiLCAiREVDX0tFWUlEIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqZW5jdHlwZVtdID0geworCSJOVUxMIiwgIkRFU19DRkI2NCIsICJERVNfT0ZCNjQiLCAiREVTM19DRkI2NCIsICJERVMzX09GQjY0IiwKKwlOVUxMLCAiQ0FTVDVfNDBfQ0ZCNjQiLCAiQ0FTVDVfNDBfT0ZCNjQiLCAiQ0FTVDEyOF9DRkI2NCIsICJDQVNUMTI4X09GQjY0IiwKK307CisKKyNkZWZpbmUgU1RSX09SX0lEKHgsIHRhYikgXAorCSgoKHgpIDwgc2l6ZW9mKHRhYikvc2l6ZW9mKHRhYlswXSkgJiYgdGFiWyh4KV0pID8gdGFiWyh4KV0gOiBudW1zdHIoeCkpCisKK3N0YXRpYyBjaGFyICoKK251bXN0cihpbnQgeCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjBdOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUjeCIsIHgpOworCXJldHVybiBidWY7Cit9CisKKy8qIHNwIHBvaW50cyB0byBJQUMgYnl0ZSAqLworc3RhdGljIGludAordGVsbmV0X3BhcnNlKGNvbnN0IHVfY2hhciAqc3AsIHVfaW50IGxlbmd0aCwgaW50IHByaW50KQoreworCWludCBpLCB4OworCXVfaW50IGM7CisJY29uc3QgdV9jaGFyICpvc3AsICpwOworI2RlZmluZSBGRVRDSChjLCBzcCwgbGVuZ3RoKSBcCisJZG8geyBcCisJCWlmIChsZW5ndGggPCAxKSBcCisJCQlnb3RvIHBrdGVuZDsgXAorCQlUQ0hFQ0soKnNwKTsgXAorCQljID0gKnNwKys7IFwKKwkJbGVuZ3RoLS07IFwKKwl9IHdoaWxlICgwKQorCisJb3NwID0gc3A7CisKKwlGRVRDSChjLCBzcCwgbGVuZ3RoKTsKKwlpZiAoYyAhPSBJQUMpCisJCWdvdG8gcGt0ZW5kOworCUZFVENIKGMsIHNwLCBsZW5ndGgpOworCWlmIChjID09IElBQykgewkJLyogPElBQz48SUFDPiEgKi8KKwkJaWYgKHByaW50KQorCQkJcHJpbnRmKCJJQUMgSUFDIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpID0gYyAtIFRFTENNRF9GSVJTVDsKKwlpZiAoaSA8IDAgfHwgaSA+IElBQyAtIFRFTENNRF9GSVJTVCkKKwkJZ290byBwa3RlbmQ7CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIERPTlQ6CisJY2FzZSBETzoKKwljYXNlIFdPTlQ6CisJY2FzZSBXSUxMOgorCWNhc2UgU0I6CisJCS8qIERPTlQvRE8vV09OVC9XSUxMIHggKi8KKwkJRkVUQ0goeCwgc3AsIGxlbmd0aCk7CisJCWlmICh4ID49IDAgJiYgeCA8IE5URUxPUFRTKSB7CisJCQlpZiAocHJpbnQpCisJCQkJKHZvaWQpcHJpbnRmKCIlcyAlcyIsIHRlbGNtZHNbaV0sIHRlbG9wdHNbeF0pOworCQl9IGVsc2UgeworCQkJaWYgKHByaW50KQorCQkJCSh2b2lkKXByaW50ZigiJXMgJSN4IiwgdGVsY21kc1tpXSwgeCk7CisJCX0KKwkJaWYgKGMgIT0gU0IpCisJCQlicmVhazsKKwkJLyogSUFDIFNCIC4uLi4gSUFDIFNFICovCisJCXAgPSBzcDsKKwkJd2hpbGUgKGxlbmd0aCA+ICh1X2ludCkocCArIDEgLSBzcCkpIHsKKwkJCWlmIChwWzBdID09IElBQyAmJiBwWzFdID09IFNFKQorCQkJCWJyZWFrOworCQkJcCsrOworCQl9CisJCWlmICgqcCAhPSBJQUMpCisJCQlnb3RvIHBrdGVuZDsKKworCQlzd2l0Y2ggKHgpIHsKKwkJY2FzZSBURUxPUFRfQVVUSEVOVElDQVRJT046CisJCQlpZiAocCA8PSBzcCkKKwkJCQlicmVhazsKKwkJCUZFVENIKGMsIHNwLCBsZW5ndGgpOworCQkJaWYgKHByaW50KQorCQkJCSh2b2lkKXByaW50ZigiICVzIiwgU1RSX09SX0lEKGMsIGF1dGhjbWQpKTsKKwkJCWlmIChwIDw9IHNwKQorCQkJCWJyZWFrOworCQkJRkVUQ0goYywgc3AsIGxlbmd0aCk7CisJCQlpZiAocHJpbnQpCisJCQkJKHZvaWQpcHJpbnRmKCIgJXMiLCBTVFJfT1JfSUQoYywgYXV0aHR5cGUpKTsKKwkJCWJyZWFrOworCQljYXNlIFRFTE9QVF9FTkNSWVBUOgorCQkJaWYgKHAgPD0gc3ApCisJCQkJYnJlYWs7CisJCQlGRVRDSChjLCBzcCwgbGVuZ3RoKTsKKwkJCWlmIChwcmludCkKKwkJCQkodm9pZClwcmludGYoIiAlcyIsIFNUUl9PUl9JRChjLCBlbmNjbWQpKTsKKwkJCWlmIChwIDw9IHNwKQorCQkJCWJyZWFrOworCQkJRkVUQ0goYywgc3AsIGxlbmd0aCk7CisJCQlpZiAocHJpbnQpCisJCQkJKHZvaWQpcHJpbnRmKCIgJXMiLCBTVFJfT1JfSUQoYywgZW5jdHlwZSkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocCA8PSBzcCkKKwkJCQlicmVhazsKKwkJCUZFVENIKGMsIHNwLCBsZW5ndGgpOworCQkJaWYgKHByaW50KQorCQkJCSh2b2lkKXByaW50ZigiICVzIiwgU1RSX09SX0lEKGMsIGNtZHMpKTsKKwkJCWJyZWFrOworCQl9CisJCXdoaWxlIChwID4gc3ApIHsKKwkJCUZFVENIKHgsIHNwLCBsZW5ndGgpOworCQkJaWYgKHByaW50KQorCQkJCSh2b2lkKXByaW50ZigiICUjeCIsIHgpOworCQl9CisJCS8qIHRlcm1pbmF0aW5nIElBQyBTRSAqLworCQlpZiAocHJpbnQpCisJCQkodm9pZClwcmludGYoIiBTRSIpOworCQlzcCArPSAyOworCQlsZW5ndGggLT0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHByaW50KQorCQkJKHZvaWQpcHJpbnRmKCIlcyIsIHRlbGNtZHNbaV0pOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCXJldHVybiBzcCAtIG9zcDsKKwordHJ1bmM6CisJKHZvaWQpcHJpbnRmKCJbfHRlbG5ldF0iKTsKK3BrdGVuZDoKKwlyZXR1cm4gLTE7CisjdW5kZWYgRkVUQ0gKK30KKwordm9pZAordGVsbmV0X3ByaW50KGNvbnN0IHVfY2hhciAqc3AsIHVfaW50IGxlbmd0aCkKK3sKKwlpbnQgZmlyc3QgPSAxOworCWNvbnN0IHVfY2hhciAqb3NwOworCWludCBsOworCisJb3NwID0gc3A7CisKKwl3aGlsZSAobGVuZ3RoID4gMCAmJiAqc3AgPT0gSUFDKSB7CisJCWwgPSB0ZWxuZXRfcGFyc2Uoc3AsIGxlbmd0aCwgMCk7CisJCWlmIChsIDwgMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIG5vdyBwcmludCBpdAorCQkgKi8KKwkJaWYgKFhmbGFnICYmIDIgPCB2ZmxhZykgeworCQkJaWYgKGZpcnN0KQorCQkJCXByaW50ZigiXG5UZWxuZXQ6Iik7CisJCQloZXhfcHJpbnRfd2l0aF9vZmZzZXQoIlxuIiwgc3AsIGwsIHNwIC0gb3NwKTsKKwkJCWlmIChsID4gOCkKKwkJCQlwcmludGYoIlxuXHRcdFx0XHQiKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUqc1x0IiwgKDggLSBsKSAqIDMsICIiKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIiVzIiwgKGZpcnN0KSA/ICIgW3RlbG5ldCAiIDogIiwgIik7CisKKwkJKHZvaWQpdGVsbmV0X3BhcnNlKHNwLCBsZW5ndGgsIDEpOworCQlmaXJzdCA9IDA7CisKKwkJc3AgKz0gbDsKKwkJbGVuZ3RoIC09IGw7CisJfQorCWlmICghZmlyc3QpIHsKKwkJaWYgKFhmbGFnICYmIDIgPCB2ZmxhZykKKwkJCXByaW50ZigiXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJdIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdGZ0cC5jIGIvcHJpbnQtdGZ0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MTc4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC10ZnRwLmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGb3JtYXQgYW5kIHByaW50IHRyaXZpYWwgZmlsZSB0cmFuc2ZlciBwcm90b2NvbCBwYWNrZXRzLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXRmdHAuYyx2IDEuMzcuMi4xIDIwMDcvMDkvMTQgMDE6MDM6MTIgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaWZkZWYgU0VHU0laRQorI3VuZGVmIFNFR1NJWkUJCQkJCS8qIFNJTklYIHN1Y2tzICovCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorI2luY2x1ZGUgInRmdHAuaCIKKworLyogb3AgY29kZSB0byBzdHJpbmcgbWFwcGluZyAqLworc3RhdGljIHN0cnVjdCB0b2sgb3Ayc3RyW10gPSB7CisJeyBSUlEsCQkiUlJRIiB9LAkvKiByZWFkIHJlcXVlc3QgKi8KKwl7IFdSUSwJCSJXUlEiIH0sCS8qIHdyaXRlIHJlcXVlc3QgKi8KKwl7IERBVEEsCQkiREFUQSIgfSwJLyogZGF0YSBwYWNrZXQgKi8KKwl7IEFDSywJCSJBQ0siIH0sCS8qIGFja25vd2xlZGdlbWVudCAqLworCXsgRVJST1IsCSJFUlJPUiIgfSwJLyogZXJyb3IgY29kZSAqLworCXsgT0FDSywJCSJPQUNLIiB9LAkvKiBvcHRpb24gYWNrbm93bGVkZ2VtZW50ICovCisJeyAwLAkJTlVMTCB9Cit9OworCisvKiBlcnJvciBjb2RlIHRvIHN0cmluZyBtYXBwaW5nICovCitzdGF0aWMgc3RydWN0IHRvayBlcnIyc3RyW10gPSB7CisJeyBFVU5ERUYsCSJFVU5ERUYiIH0sCS8qIG5vdCBkZWZpbmVkICovCisJeyBFTk9URk9VTkQsCSJFTk9URk9VTkQiIH0sCS8qIGZpbGUgbm90IGZvdW5kICovCisJeyBFQUNDRVNTLAkiRUFDQ0VTUyIgfSwJLyogYWNjZXNzIHZpb2xhdGlvbiAqLworCXsgRU5PU1BBQ0UsCSJFTk9TUEFDRSIgfSwJLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKwl7IEVCQURPUCwJIkVCQURPUCIgfSwJLyogaWxsZWdhbCBURlRQIG9wZXJhdGlvbiAqLworCXsgRUJBRElELAkiRUJBRElEIiB9LAkvKiB1bmtub3duIHRyYW5zZmVyIElEICovCisJeyBFRVhJU1RTLAkiRUVYSVNUUyIgfSwJLyogZmlsZSBhbHJlYWR5IGV4aXN0cyAqLworCXsgRU5PVVNFUiwJIkVOT1VTRVIiIH0sCS8qIG5vIHN1Y2ggdXNlciAqLworCXsgMCwJCU5VTEwgfQorfTsKKworLyoKKyAqIFByaW50IHRyaXZpYWwgZmlsZSB0cmFuc2ZlciBwcm9ncmFtIHJlcXVlc3RzCisgKi8KK3ZvaWQKK3RmdHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0ZnRwaGRyICp0cDsKKwlyZWdpc3RlciBjb25zdCBjaGFyICpjcDsKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKnA7CisJcmVnaXN0ZXIgaW50IG9wY29kZSwgaTsKKwlzdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8dGZ0cF0iOworCisJdHAgPSAoY29uc3Qgc3RydWN0IHRmdHBoZHIgKilicDsKKworCS8qIFByaW50IGxlbmd0aCAqLworCXByaW50ZigiICVkIiwgbGVuZ3RoKTsKKworCS8qIFByaW50IHRmdHAgcmVxdWVzdCB0eXBlICovCisJVENIRUNLKHRwLT50aF9vcGNvZGUpOworCW9wY29kZSA9IEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfb3Bjb2RlKTsKKwljcCA9IHRvazJzdHIob3Ayc3RyLCAidGZ0cC0jJWQiLCBvcGNvZGUpOworCXByaW50ZigiICVzIiwgY3ApOworCS8qIEJhaWwgaWYgYm9ndXMgb3Bjb2RlICovCisJaWYgKCpjcCA9PSAndCcpCisJCXJldHVybjsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisKKwljYXNlIFJSUToKKwljYXNlIFdSUToKKwljYXNlIE9BQ0s6CisJCS8qCisJCSAqIFhYWCBOb3QgYWxsIGFycGEvdGZ0cC5oJ3Mgc3BlY2lmeSB0aF9zdHVmZiBhcyBhbnkKKwkJICogYXJyYXk7IHVzZSBhZGRyZXNzIG9mIHRoX2Jsb2NrIGluc3RlYWQKKwkJICovCisjaWZkZWYgbm90ZGVmCisJCXAgPSAodV9jaGFyICopdHAtPnRoX3N0dWZmOworI2Vsc2UKKwkJcCA9ICh1X2NoYXIgKikmdHAtPnRoX2Jsb2NrOworI2VuZGlmCisJCXB1dGNoYXIoJyAnKTsKKwkJLyogUHJpbnQgZmlsZW5hbWUgb3IgZmlyc3Qgb3B0aW9uICovCisJCWlmIChvcGNvZGUgIT0gT0FDSykKKwkJCXB1dGNoYXIoJyInKTsKKwkJaSA9IGZuX3ByaW50KHAsIHNuYXBlbmQpOworCQlpZiAob3Bjb2RlICE9IE9BQ0spCisJCQlwdXRjaGFyKCciJyk7CisKKwkJLyogUHJpbnQgdGhlIG1vZGUgKFJSUSBhbmQgV1JRIG9ubHkpIGFuZCBhbnkgb3B0aW9ucyAqLworCQl3aGlsZSAoKHAgPSAoY29uc3QgdV9jaGFyICopc3RyY2hyKChjb25zdCBjaGFyICopcCwgJ1wwJykpICE9IE5VTEwpIHsKKwkJCWlmIChsZW5ndGggPD0gKHVfaW50KShwIC0gKGNvbnN0IHVfY2hhciAqKSZ0cC0+dGhfYmxvY2spKQorCQkJCWJyZWFrOworCQkJcCsrOworCQkJaWYgKCpwICE9ICdcMCcpIHsKKwkJCQlwdXRjaGFyKCcgJyk7CisJCQkJZm5fcHJpbnQocCwgc25hcGVuZCk7CisJCQl9CisJCX0KKwkJCisJCWlmIChpKQorCQkJZ290byB0cnVuYzsKKwkJYnJlYWs7CisKKwljYXNlIEFDSzoKKwljYXNlIERBVEE6CisJCVRDSEVDSyh0cC0+dGhfYmxvY2spOworCQlwcmludGYoIiBibG9jayAlZCIsIEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfYmxvY2spKTsKKwkJYnJlYWs7CisKKwljYXNlIEVSUk9SOgorCQkvKiBQcmludCBlcnJvciBjb2RlIHN0cmluZyAqLworCQlUQ0hFQ0sodHAtPnRoX2NvZGUpOworCQlwcmludGYoIiAlcyBcIiIsIHRvazJzdHIoZXJyMnN0ciwgInRmdHAtZXJyLSMlZCBcIiIsCisJCQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfY29kZSkpKTsKKwkJLyogUHJpbnQgZXJyb3IgbWVzc2FnZSBzdHJpbmcgKi8KKwkJaSA9IGZuX3ByaW50KChjb25zdCB1X2NoYXIgKil0cC0+dGhfZGF0YSwgc25hcGVuZCk7CisJCXB1dGNoYXIoJyInKTsKKwkJaWYgKGkpCisJCQlnb3RvIHRydW5jOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFdlIHNob3VsZG4ndCBnZXQgaGVyZSAqLworCQlwcmludGYoIih1bmtub3duICMlZCkiLCBvcGNvZGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuOwordHJ1bmM6CisJZnB1dHModHN0ciwgc3Rkb3V0KTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9wcmludC10aW1lZC5jIGIvcHJpbnQtdGltZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGYyMjQxCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnQtdGltZWQuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBCZW4gU21pdGh1cnN0IDxiZW5Ac2NpZW50aWEuZGVtb24uY28udWs+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC10aW1lZC5jLHYgMS45IDIwMDMvMTEvMTYgMDk6MzY6NDAgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRpbWVkLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqdHNwdHlwZVtUU1BUWVBFTlVNQkVSXSA9CisgIHsgIkFOWSIsICJBREpUSU1FIiwgIkFDSyIsICJNQVNURVJSRVEiLCAiTUFTVEVSQUNLIiwgIlNFVFRJTUUiLCAiTUFTVEVSVVAiLAorICAiU0xBVkVVUCIsICJFTEVDVElPTiIsICJBQ0NFUFQiLCAiUkVGVVNFIiwgIkNPTkZMSUNUIiwgIlJFU09MVkUiLCAiUVVJVCIsCisgICJEQVRFIiwgIkRBVEVSRVEiLCAiREFURUFDSyIsICJUUkFDRU9OIiwgIlRSQUNFT0ZGIiwgIk1TSVRFIiwgIk1TSVRFUkVRIiwKKyAgIlRFU1QiLCAiU0VUREFURSIsICJTRVREQVRFUkVRIiwgIkxPT1AiIH07CisKK3ZvaWQKK3RpbWVkX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCit7CisjZGVmaW5lIGVuZG9mKHgpICgodV9jaGFyICopJih4KSArIHNpemVvZiAoeCkpCisJc3RydWN0IHRzcCAqdHNwID0gKHN0cnVjdCB0c3AgKilicDsKKwlsb25nIHNlYywgdXNlYzsKKwljb25zdCB1X2NoYXIgKmVuZDsKKworCWlmIChlbmRvZih0c3AtPnRzcF90eXBlKSA+IHNuYXBlbmQpIHsKKwkJZnB1dHMoIlt8dGltZWRdIiwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHNwLT50c3BfdHlwZSA8IFRTUFRZUEVOVU1CRVIpCisJCXByaW50ZigiVFNQXyVzIiwgdHNwdHlwZVt0c3AtPnRzcF90eXBlXSk7CisJZWxzZQorCQlwcmludGYoIih0c3BfdHlwZSAlI3gpIiwgdHNwLT50c3BfdHlwZSk7CisKKwlpZiAoZW5kb2YodHNwLT50c3BfdmVycykgPiBzbmFwZW5kKSB7CisJCWZwdXRzKCIgW3x0aW1lZF0iLCBzdGRvdXQpOworCQlyZXR1cm47CisJfQorCXByaW50ZigiIHZlcnMgJWQiLCB0c3AtPnRzcF92ZXJzKTsKKworCWlmIChlbmRvZih0c3AtPnRzcF9zZXEpID4gc25hcGVuZCkgeworCQlmcHV0cygiIFt8dGltZWRdIiwgc3Rkb3V0KTsKKwkJcmV0dXJuOworCX0KKwlwcmludGYoIiBzZXEgJWQiLCB0c3AtPnRzcF9zZXEpOworCisJaWYgKHRzcC0+dHNwX3R5cGUgPT0gVFNQX0xPT1ApIHsKKwkJaWYgKGVuZG9mKHRzcC0+dHNwX2hvcGNudCkgPiBzbmFwZW5kKSB7CisJCQlmcHV0cygiIFt8dGltZWRdIiwgc3Rkb3V0KTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmludGYoIiBob3BjbnQgJWQiLCB0c3AtPnRzcF9ob3BjbnQpOworCX0gZWxzZSBpZiAodHNwLT50c3BfdHlwZSA9PSBUU1BfU0VUVElNRSB8fAorCSAgdHNwLT50c3BfdHlwZSA9PSBUU1BfQURKVElNRSB8fAorCSAgdHNwLT50c3BfdHlwZSA9PSBUU1BfU0VUREFURSB8fAorCSAgdHNwLT50c3BfdHlwZSA9PSBUU1BfU0VUREFURVJFUSkgeworCQlpZiAoZW5kb2YodHNwLT50c3BfdGltZSkgPiBzbmFwZW5kKSB7CisJCQlmcHV0cygiIFt8dGltZWRdIiwgc3Rkb3V0KTsKKwkJCXJldHVybjsKKwkJfQorCQlzZWMgPSBFWFRSQUNUXzMyQklUUygmdHNwLT50c3BfdGltZS50dl9zZWMpOworCQl1c2VjID0gRVhUUkFDVF8zMkJJVFMoJnRzcC0+dHNwX3RpbWUudHZfdXNlYyk7CisJCWlmICh1c2VjIDwgMCkKKwkJCS8qIGNvcnJ1cHQsIHNraXAgdGhlIHJlc3Qgb2YgdGhlIHBhY2tldCAqLworCQkJcmV0dXJuOworCQlmcHV0cygiIHRpbWUgIiwgc3Rkb3V0KTsKKwkJaWYgKHNlYyA8IDAgJiYgdXNlYyAhPSAwKSB7CisJCQlzZWMrKzsKKwkJCWlmIChzZWMgPT0gMCkKKwkJCQlmcHV0YygnLScsIHN0ZG91dCk7CisJCQl1c2VjID0gMTAwMDAwMCAtIHVzZWM7CisJCX0KKwkJcHJpbnRmKCIlbGQuJTA2bGQiLCBzZWMsIHVzZWMpOworCX0KKworCWVuZCA9IG1lbWNocih0c3AtPnRzcF9uYW1lLCAnXDAnLCBzbmFwZW5kIC0gKHVfY2hhciAqKXRzcC0+dHNwX25hbWUpOworCWlmIChlbmQgPT0gTlVMTCkKKwkJZnB1dHMoIiBbfHRpbWVkXSIsIHN0ZG91dCk7CisJZWxzZSB7CisJCWZwdXRzKCIgbmFtZSAiLCBzdGRvdXQpOworCQlmd3JpdGUodHNwLT50c3BfbmFtZSwgZW5kIC0gKHVfY2hhciAqKXRzcC0+dHNwX25hbWUsIDEsIHN0ZG91dCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdG9rZW4uYyBiL3ByaW50LXRva2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmY2NhNgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXRva2VuLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBIYWNrZWQgdmVyc2lvbiBvZiBwcmludC1ldGhlci5jICBMYXJyeSBMaWxlIDxsaWxlQHN0ZGlvLmNvbT4KKyAqCisgKiBGdXJ0aGVyIHR3ZWFrZWQgdG8gbW9yZSBjbG9zZWx5IHJlc2VtYmxlIHByaW50LWZkZGkuYworICoJR3V5IEhhcnJpcyA8Z3V5QGFsdW0ubWl0LmVkdT4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdG9rZW4uYyx2IDEuMjUuMi4yIDIwMDUvMTEvMTMgMTI6MTM6MDEgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisKKyNpbmNsdWRlICJldGhlci5oIgorI2luY2x1ZGUgInRva2VuLmgiCisKKy8qIEV4dHJhY3Qgc3JjLCBkc3QgYWRkcmVzc2VzICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dHJhY3RfdG9rZW5fYWRkcnMoY29uc3Qgc3RydWN0IHRva2VuX2hlYWRlciAqdHJwLCBjaGFyICpmc3JjLCBjaGFyICpmZHN0KQoreworCW1lbWNweShmZHN0LCAoY29uc3QgY2hhciAqKXRycC0+dG9rZW5fZGhvc3QsIDYpOworCW1lbWNweShmc3JjLCAoY29uc3QgY2hhciAqKXRycC0+dG9rZW5fc2hvc3QsIDYpOworfQorCisvKgorICogUHJpbnQgdGhlIFRSIE1BQyBoZWFkZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit0b2tlbl9oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRva2VuX2hlYWRlciAqdHJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCisJICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpmc3JjLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmZkc3QpCit7CisJY29uc3QgY2hhciAqc3JjbmFtZSwgKmRzdG5hbWU7CisKKwlzcmNuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmc3JjKTsKKwlkc3RuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmZHN0KTsKKworCWlmICh2ZmxhZykKKwkJKHZvaWQpIHByaW50ZigiJTAyeCAlMDJ4ICVzICVzICVkOiAiLAorCQkgICAgICAgdHJwLT50b2tlbl9hYywKKwkJICAgICAgIHRycC0+dG9rZW5fZmMsCisJCSAgICAgICBzcmNuYW1lLCBkc3RuYW1lLAorCQkgICAgICAgbGVuZ3RoKTsKKwllbHNlCisJCXByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpicm9hZGNhc3RfaW5kaWNhdG9yW10gPSB7CisJIk5vbi1Ccm9hZGNhc3QiLCAiTm9uLUJyb2FkY2FzdCIsCisJIk5vbi1Ccm9hZGNhc3QiLCAiTm9uLUJyb2FkY2FzdCIsCisJIkFsbC1yb3V0ZXMiLCAgICAiQWxsLXJvdXRlcyIsCisJIlNpbmdsZS1yb3V0ZSIsICAiU2luZ2xlLXJvdXRlIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRpcmVjdGlvbltdID0geworCSJGb3J3YXJkIiwgIkJhY2t3YXJkIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxhcmdlc3RfZnJhbWVbXSA9IHsKKwkiNTE2IiwKKwkiMTUwMCIsCisJIjIwNTIiLAorCSI0NDcyIiwKKwkiODE0NCIsCisJIjExNDA3IiwKKwkiMTc4MDAiLAorCSI/PyIKK307CisKK3VfaW50Cit0b2tlbl9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQoreworCWNvbnN0IHN0cnVjdCB0b2tlbl9oZWFkZXIgKnRycDsKKwl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7CisJc3RydWN0IGV0aGVyX2hlYWRlciBlaGRyOworCXVfaW50IHJvdXRlX2xlbiA9IDAsIGhkcl9sZW4gPSBUT0tFTl9IRFJMRU47CisJaW50IHNlZzsKKworCXRycCA9IChjb25zdCBzdHJ1Y3QgdG9rZW5faGVhZGVyICopcDsKKworCWlmIChjYXBsZW4gPCBUT0tFTl9IRFJMRU4pIHsKKwkJcHJpbnRmKCJbfHRva2VuLXJpbmddIik7CisJCXJldHVybiBoZHJfbGVuOworCX0KKworCS8qCisJICogR2V0IHRoZSBUUiBhZGRyZXNzZXMgaW50byBhIGNhbm9uaWNhbCBmb3JtCisJICovCisJZXh0cmFjdF90b2tlbl9hZGRycyh0cnAsIChjaGFyKilFU1JDKCZlaGRyKSwgKGNoYXIqKUVEU1QoJmVoZHIpKTsKKworCS8qIEFkanVzdCBmb3Igc291cmNlIHJvdXRpbmcgaW5mb3JtYXRpb24gaW4gdGhlIE1BQyBoZWFkZXIgKi8KKwlpZiAoSVNfU09VUkNFX1JPVVRFRCh0cnApKSB7CisJCS8qIENsZWFyIHNvdXJjZS1yb3V0ZWQgYml0ICovCisJCSpFU1JDKCZlaGRyKSAmPSAweDdmOworCisJCWlmIChlZmxhZykKKwkJCXRva2VuX2hkcl9wcmludCh0cnAsIGxlbmd0aCwgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKKworCQlyb3V0ZV9sZW4gPSBSSUZfTEVOR1RIKHRycCk7CisJCWlmICh2ZmxhZykgeworCQkJcHJpbnRmKCIlcyAiLCBicm9hZGNhc3RfaW5kaWNhdG9yW0JST0FEQ0FTVCh0cnApXSk7CisJCQlwcmludGYoIiVzIiwgZGlyZWN0aW9uW0RJUkVDVElPTih0cnApXSk7CisKKwkJCWZvciAoc2VnID0gMDsgc2VnIDwgU0VHTUVOVF9DT1VOVCh0cnApOyBzZWcrKykKKwkJCQlwcmludGYoIiBbJWQ6JWRdIiwgUklOR19OVU1CRVIodHJwLCBzZWcpLAorCQkJCSAgICBCUklER0VfTlVNQkVSKHRycCwgc2VnKSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoInJ0ID0gJXgiLCBudG9ocyh0cnAtPnRva2VuX3JjZikpOworCisJCQlmb3IgKHNlZyA9IDA7IHNlZyA8IFNFR01FTlRfQ09VTlQodHJwKTsgc2VnKyspCisJCQkJcHJpbnRmKCI6JXgiLCBudG9ocyh0cnAtPnRva2VuX3JzZWdbc2VnXSkpOworCQl9CisJCXByaW50ZigiICglcykgIiwgbGFyZ2VzdF9mcmFtZVtMQVJHRVNUX0ZSQU1FKHRycCldKTsKKwl9IGVsc2UgeworCQlpZiAoZWZsYWcpCisJCQl0b2tlbl9oZHJfcHJpbnQodHJwLCBsZW5ndGgsIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7CisJfQorCisJLyogU2tpcCBvdmVyIHRva2VuIHJpbmcgTUFDIGhlYWRlciBhbmQgcm91dGluZyBpbmZvcm1hdGlvbiAqLworCWhkcl9sZW4gKz0gcm91dGVfbGVuOworCWxlbmd0aCAtPSBoZHJfbGVuOworCXAgKz0gaGRyX2xlbjsKKwljYXBsZW4gLT0gaGRyX2xlbjsKKworCS8qIEZyYW1lIENvbnRyb2wgZmllbGQgZGV0ZXJtaW5lcyBpbnRlcnByZXRhdGlvbiBvZiBwYWNrZXQgKi8KKwlpZiAoRlJBTUVfVFlQRSh0cnApID09IFRPS0VOX0ZDX0xMQykgeworCQkvKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzICovCisJCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSwKKwkJICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7CisJCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLworCQkJaWYgKCFlZmxhZykKKwkJCQl0b2tlbl9oZHJfcHJpbnQodHJwLAorCQkJCSAgICBsZW5ndGggKyBUT0tFTl9IRFJMRU4gKyByb3V0ZV9sZW4sCisJCQkJICAgIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7CisJCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgeworCQkJCXByaW50ZigiKExMQyAlcykgIiwKKwkJCWV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7CisJCQl9CisJCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCisJCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOworCQl9CisJfSBlbHNlIHsKKwkJLyogU29tZSBraW5kcyBvZiBUUiBwYWNrZXQgd2UgY2Fubm90IGhhbmRsZSBpbnRlbGxpZ2VudGx5ICovCisJCS8qIFhYWCAtIGRpc3NlY3QgTUFDIHBhY2tldHMgaWYgZnJhbWUgdHlwZSBpcyAwICovCisJCWlmICghZWZsYWcpCisJCQl0b2tlbl9oZHJfcHJpbnQodHJwLCBsZW5ndGggKyBUT0tFTl9IRFJMRU4gKyByb3V0ZV9sZW4sCisJCQkgICAgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKKwkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQorCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOworCX0KKwlyZXR1cm4gKGhkcl9sZW4pOworfQorCisvKgorICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCisgKiB0byB0aGUgVFIgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKKyAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJworICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KKyAqLwordV9pbnQKK3Rva2VuX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQoreworCXJldHVybiAodG9rZW5fcHJpbnQocCwgaC0+bGVuLCBoLT5jYXBsZW4pKTsKK30KZGlmZiAtLWdpdCBhL3ByaW50LXVkcC5jIGIvcHJpbnQtdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5ODNiNgotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXVkcC5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdWRwLmMsdiAxLjEzOC4yLjEgMjAwNy8wMy8yOCAwNzo0NTo0NiBoYW5uZXMgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpZmRlZiBTRUdTSVpFCisjdW5kZWYgU0VHU0laRQorI2VuZGlmCisvLyNpbmNsdWRlIDxhcnBhL3RmdHAuaD4KKyNpbmNsdWRlICJ0ZnRwLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgImV4dHJhY3QuaCIKKyNpbmNsdWRlICJhcHBsZXRhbGsuaCIKKworI2luY2x1ZGUgInVkcC5oIgorCisjaW5jbHVkZSAiaXAuaCIKKyNpZmRlZiBJTkVUNgorI2luY2x1ZGUgImlwNi5oIgorI2VuZGlmCisjaW5jbHVkZSAiaXBwcm90by5oIgorI2luY2x1ZGUgInJwY19hdXRoLmgiCisjaW5jbHVkZSAicnBjX21zZy5oIgorCisjaW5jbHVkZSAibmFtZXNlci5oIgorI2luY2x1ZGUgIm5mcy5oIgorI2luY2x1ZGUgImJvb3RwLmgiCisKK3N0cnVjdCBydGNwaGRyIHsKKwl1X2ludDE2X3QgcmhfZmxhZ3M7CS8qIFQ6MiBQOjEgQ05UOjUgUFQ6OCAqLworCXVfaW50MTZfdCByaF9sZW47CS8qIGxlbmd0aCBvZiBtZXNzYWdlIChpbiB3b3JkcykgKi8KKwl1X2ludDMyX3Qgcmhfc3NyYzsJLyogc3luY2hyb25pemF0aW9uIHNyYyBpZCAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVfaW50MzJfdCB1cHBlcjsJLyogbW9yZSBzaWduaWZpY2FudCAzMiBiaXRzICovCisJdV9pbnQzMl90IGxvd2VyOwkvKiBsZXNzIHNpZ25pZmljYW50IDMyIGJpdHMgKi8KK30gbnRwNjQ7CisKKy8qCisgKiBTZW5kZXIgcmVwb3J0LgorICovCitzdHJ1Y3QgcnRjcF9zciB7CisJbnRwNjQgc3JfbnRwOwkJLyogNjQtYml0IG50cCB0aW1lc3RhbXAgKi8KKwl1X2ludDMyX3Qgc3JfdHM7CS8qIHJlZmVyZW5jZSBtZWRpYSB0aW1lc3RhbXAgKi8KKwl1X2ludDMyX3Qgc3JfbnA7CS8qIG5vLiBwYWNrZXRzIHNlbnQgKi8KKwl1X2ludDMyX3Qgc3JfbmI7CS8qIG5vLiBieXRlcyBzZW50ICovCit9OworCisvKgorICogUmVjZWl2ZXIgcmVwb3J0LgorICogVGltZSBzdGFtcHMgYXJlIG1pZGRsZSAzMi1iaXRzIG9mIG50cCB0aW1lc3RhbXAuCisgKi8KK3N0cnVjdCBydGNwX3JyIHsKKwl1X2ludDMyX3QgcnJfc3JjaWQ7CS8qIHNlbmRlciBiZWluZyByZXBvcnRlZCAqLworCXVfaW50MzJfdCBycl9ubDsJLyogbm8uIHBhY2tldHMgbG9zdCAqLworCXVfaW50MzJfdCBycl9sczsJLyogZXh0ZW5kZWQgbGFzdCBzZXEgbnVtYmVyIHJlY2VpdmVkICovCisJdV9pbnQzMl90IHJyX2R2OwkvKiBqaXR0ZXIgKGRlbGF5IHZhcmlhbmNlKSAqLworCXVfaW50MzJfdCBycl9sc3I7CS8qIG9yaWcuIHRzIGZyb20gbGFzdCByciBmcm9tIHRoaXMgc3JjICAqLworCXVfaW50MzJfdCBycl9kbHNyOwkvKiB0aW1lIGZyb20gcmVjcHQgb2YgbGFzdCByciB0byB4bWl0IHRpbWUgKi8KK307CisKKy8qWFhYKi8KKyNkZWZpbmUgUlRDUF9QVF9TUgkyMDAKKyNkZWZpbmUgUlRDUF9QVF9SUgkyMDEKKyNkZWZpbmUgUlRDUF9QVF9TREVTCTIwMgorI2RlZmluZSAJUlRDUF9TREVTX0NOQU1FCTEKKyNkZWZpbmUgCVJUQ1BfU0RFU19OQU1FCTIKKyNkZWZpbmUgCVJUQ1BfU0RFU19FTUFJTAkzCisjZGVmaW5lIAlSVENQX1NERVNfUEhPTkUJNAorI2RlZmluZSAJUlRDUF9TREVTX0xPQwk1CisjZGVmaW5lIAlSVENQX1NERVNfVE9PTAk2CisjZGVmaW5lIAlSVENQX1NERVNfTk9URQk3CisjZGVmaW5lIAlSVENQX1NERVNfUFJJVgk4CisjZGVmaW5lIFJUQ1BfUFRfQllFCTIwMworI2RlZmluZSBSVENQX1BUX0FQUAkyMDQKKworc3RhdGljIHZvaWQKK3ZhdF9wcmludChjb25zdCB2b2lkICpoZHIsIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVwKQoreworCS8qIHZhdC92dCBhdWRpbyAqLworCXVfaW50IHRzID0gKih1X2ludDE2X3QgKiloZHI7CisJaWYgKCh0cyAmIDB4ZjA2MCkgIT0gMCkgeworCQkvKiBwcm9iYWJseSB2dCAqLworCQkodm9pZClwcmludGYoInVkcC92dCAldSAlZCAvICVkIiwKKwkJCSAgICAgKHVfaW50MzJfdCkoRVhUUkFDVF8xNkJJVFMoJnVwLT51aF91bGVuKSAtIHNpemVvZigqdXApKSwKKwkJCSAgICAgdHMgJiAweDNmZiwgdHMgPj4gMTApOworCX0gZWxzZSB7CisJCS8qIHByb2JhYmx5IHZhdCAqLworCQl1X2ludDMyX3QgaTAgPSBFWFRSQUNUXzMyQklUUygmKCh1X2ludCAqKWhkcilbMF0pOworCQl1X2ludDMyX3QgaTEgPSBFWFRSQUNUXzMyQklUUygmKCh1X2ludCAqKWhkcilbMV0pOworCQlwcmludGYoInVkcC92YXQgJXUgYyVkICV1JXMiLAorCQkJKHVfaW50MzJfdCkoRVhUUkFDVF8xNkJJVFMoJnVwLT51aF91bGVuKSAtIHNpemVvZigqdXApIC0gOCksCisJCQlpMCAmIDB4ZmZmZiwKKwkJCWkxLCBpMCAmIDB4ODAwMDAwPyAiKiIgOiAiIik7CisJCS8qIGF1ZGlvIGZvcm1hdCAqLworCQlpZiAoaTAgJiAweDFmMDAwMCkKKwkJCXByaW50ZigiIGYlZCIsIChpMCA+PiAxNikgJiAweDFmKTsKKwkJaWYgKGkwICYgMHgzZjAwMDAwMCkKKwkJCXByaW50ZigiIHMlZCIsIChpMCA+PiAyNCkgJiAweDNmKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitydHBfcHJpbnQoY29uc3Qgdm9pZCAqaGRyLCB1X2ludCBsZW4sIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVwKQoreworCS8qIHJ0cCB2MSBvciB2MiAqLworCXVfaW50ICppcCA9ICh1X2ludCAqKWhkcjsKKwl1X2ludCBoYXNvcHQsIGhhc2V4dCwgY29udHlwZSwgaGFzbWFya2VyOworCXVfaW50MzJfdCBpMCA9IEVYVFJBQ1RfMzJCSVRTKCYoKHVfaW50ICopaGRyKVswXSk7CisJdV9pbnQzMl90IGkxID0gRVhUUkFDVF8zMkJJVFMoJigodV9pbnQgKiloZHIpWzFdKTsKKwl1X2ludCBkbGVuID0gRVhUUkFDVF8xNkJJVFMoJnVwLT51aF91bGVuKSAtIHNpemVvZigqdXApIC0gODsKKwljb25zdCBjaGFyICogcHR5cGU7CisKKwlpcCArPSAyOworCWxlbiA+Pj0gMjsKKwlsZW4gLT0gMjsKKwloYXNvcHQgPSAwOworCWhhc2V4dCA9IDA7CisJaWYgKChpMCA+PiAzMCkgPT0gMSkgeworCQkvKiBydHAgdjEgKi8KKwkJaGFzb3B0ID0gaTAgJiAweDgwMDAwMDsKKwkJY29udHlwZSA9IChpMCA+PiAxNikgJiAweDNmOworCQloYXNtYXJrZXIgPSBpMCAmIDB4NDAwMDAwOworCQlwdHlwZSA9ICJydHB2MSI7CisJfSBlbHNlIHsKKwkJLyogcnRwIHYyICovCisJCWhhc2V4dCA9IGkwICYgMHgxMDAwMDAwMDsKKwkJY29udHlwZSA9IChpMCA+PiAxNikgJiAweDdmOworCQloYXNtYXJrZXIgPSBpMCAmIDB4ODAwMDAwOworCQlkbGVuIC09IDQ7CisJCXB0eXBlID0gInJ0cCI7CisJCWlwICs9IDE7CisJCWxlbiAtPSAxOworCX0KKwlwcmludGYoInVkcC8lcyAlZCBjJWQgJXMlcyAlZCAldSIsCisJCXB0eXBlLAorCQlkbGVuLAorCQljb250eXBlLAorCQkoaGFzb3B0IHx8IGhhc2V4dCk/ICIrIiA6ICIiLAorCQloYXNtYXJrZXI/ICIqIiA6ICIiLAorCQlpMCAmIDB4ZmZmZiwKKwkJaTEpOworCWlmICh2ZmxhZykgeworCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKCYoKHVfaW50ICopaGRyKVsyXSkpOworCQlpZiAoaGFzb3B0KSB7CisJCQl1X2ludCBpMiwgb3B0bGVuOworCQkJZG8geworCQkJCWkyID0gaXBbMF07CisJCQkJb3B0bGVuID0gKGkyID4+IDE2KSAmIDB4ZmY7CisJCQkJaWYgKG9wdGxlbiA9PSAwIHx8IG9wdGxlbiA+IGxlbikgeworCQkJCQlwcmludGYoIiAhb3B0Iik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaXAgKz0gb3B0bGVuOworCQkJCWxlbiAtPSBvcHRsZW47CisJCQl9IHdoaWxlICgoaW50KWkyID49IDApOworCQl9CisJCWlmIChoYXNleHQpIHsKKwkJCXVfaW50IGkyLCBleHRsZW47CisJCQlpMiA9IGlwWzBdOworCQkJZXh0bGVuID0gKGkyICYgMHhmZmZmKSArIDE7CisJCQlpZiAoZXh0bGVuID4gbGVuKSB7CisJCQkJcHJpbnRmKCIgIWV4dCIpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlwICs9IGV4dGxlbjsKKwkJfQorCQlpZiAoY29udHlwZSA9PSAweDFmKSAvKlhYWCBILjI2MSAqLworCQkJcHJpbnRmKCIgMHglMDR4IiwgaXBbMF0gPj4gMTYpOworCX0KK30KKworc3RhdGljIGNvbnN0IHVfY2hhciAqCitydGNwX3ByaW50KGNvbnN0IHVfY2hhciAqaGRyLCBjb25zdCB1X2NoYXIgKmVwKQoreworCS8qIHJ0cCB2MiBjb250cm9sIChydGNwKSAqLworCXN0cnVjdCBydGNwX3JyICpyciA9IDA7CisJc3RydWN0IHJ0Y3Bfc3IgKnNyOworCXN0cnVjdCBydGNwaGRyICpyaCA9IChzdHJ1Y3QgcnRjcGhkciAqKWhkcjsKKwl1X2ludCBsZW47CisJdV9pbnQxNl90IGZsYWdzOworCWludCBjbnQ7CisJZG91YmxlIHRzLCBkdHM7CisJaWYgKCh1X2NoYXIgKikocmggKyAxKSA+IGVwKSB7CisJCXByaW50ZigiIFt8cnRjcF0iKTsKKwkJcmV0dXJuIChlcCk7CisJfQorCWxlbiA9IChFWFRSQUNUXzE2QklUUygmcmgtPnJoX2xlbikgKyAxKSAqIDQ7CisJZmxhZ3MgPSBFWFRSQUNUXzE2QklUUygmcmgtPnJoX2ZsYWdzKTsKKwljbnQgPSAoZmxhZ3MgPj4gOCkgJiAweDFmOworCXN3aXRjaCAoZmxhZ3MgJiAweGZmKSB7CisJY2FzZSBSVENQX1BUX1NSOgorCQlzciA9IChzdHJ1Y3QgcnRjcF9zciAqKShyaCArIDEpOworCQlwcmludGYoIiBzciIpOworCQlpZiAobGVuICE9IGNudCAqIHNpemVvZigqcnIpICsgc2l6ZW9mKCpzcikgKyBzaXplb2YoKnJoKSkKKwkJCXByaW50ZigiIFslZF0iLCBsZW4pOworCQlpZiAodmZsYWcpCisJCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZyaC0+cmhfc3NyYykpOworCQlpZiAoKHVfY2hhciAqKShzciArIDEpID4gZXApIHsKKwkJCXByaW50ZigiIFt8cnRjcF0iKTsKKwkJCXJldHVybiAoZXApOworCQl9CisJCXRzID0gKGRvdWJsZSkoRVhUUkFDVF8zMkJJVFMoJnNyLT5zcl9udHAudXBwZXIpKSArCisJCSAgICAoKGRvdWJsZSkoRVhUUkFDVF8zMkJJVFMoJnNyLT5zcl9udHAubG93ZXIpKSAvCisJCSAgICA0Mjk0OTY3Mjk2LjApOworCQlwcmludGYoIiBAJS4yZiAldSAldXAgJXViIiwgdHMsIEVYVFJBQ1RfMzJCSVRTKCZzci0+c3JfdHMpLAorCQkgICAgRVhUUkFDVF8zMkJJVFMoJnNyLT5zcl9ucCksIEVYVFJBQ1RfMzJCSVRTKCZzci0+c3JfbmIpKTsKKwkJcnIgPSAoc3RydWN0IHJ0Y3BfcnIgKikoc3IgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSBSVENQX1BUX1JSOgorCQlwcmludGYoIiByciIpOworCQlpZiAobGVuICE9IGNudCAqIHNpemVvZigqcnIpICsgc2l6ZW9mKCpyaCkpCisJCQlwcmludGYoIiBbJWRdIiwgbGVuKTsKKwkJcnIgPSAoc3RydWN0IHJ0Y3BfcnIgKikocmggKyAxKTsKKwkJaWYgKHZmbGFnKQorCQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUygmcmgtPnJoX3NzcmMpKTsKKwkJYnJlYWs7CisJY2FzZSBSVENQX1BUX1NERVM6CisJCXByaW50ZigiIHNkZXMgJWQiLCBsZW4pOworCQlpZiAodmZsYWcpCisJCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZyaC0+cmhfc3NyYykpOworCQljbnQgPSAwOworCQlicmVhazsKKwljYXNlIFJUQ1BfUFRfQllFOgorCQlwcmludGYoIiBieWUgJWQiLCBsZW4pOworCQlpZiAodmZsYWcpCisJCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZyaC0+cmhfc3NyYykpOworCQljbnQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiB0eXBlLTB4JXggJWQiLCBmbGFncyAmIDB4ZmYsIGxlbik7CisJCWNudCA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAoY250ID4gMSkKKwkJcHJpbnRmKCIgYyVkIiwgY250KTsKKwl3aGlsZSAoLS1jbnQgPj0gMCkgeworCQlpZiAoKHVfY2hhciAqKShyciArIDEpID4gZXApIHsKKwkJCXByaW50ZigiIFt8cnRjcF0iKTsKKwkJCXJldHVybiAoZXApOworCQl9CisJCWlmICh2ZmxhZykKKwkJCXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoJnJyLT5ycl9zcmNpZCkpOworCQl0cyA9IChkb3VibGUpKEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfbHNyKSkgLyA2NTUzNi47CisJCWR0cyA9IChkb3VibGUpKEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfZGxzcikpIC8gNjU1MzYuOworCQlwcmludGYoIiAldWwgJXVzICV1aiBAJS4yZislLjJmIiwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfbmwpICYgMHgwMGZmZmZmZiwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfbHMpLAorCQkgICAgRVhUUkFDVF8zMkJJVFMoJnJyLT5ycl9kdiksIHRzLCBkdHMpOworCX0KKwlyZXR1cm4gKGhkciArIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgdWRwX2Nrc3VtKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXAsCisJCSAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHVkcGhkciAqdXAsCisJCSAgICAgcmVnaXN0ZXIgdV9pbnQgbGVuKQoreworCXVuaW9uIHBodSB7CisJCXN0cnVjdCBwaGRyIHsKKwkJCXVfaW50MzJfdCBzcmM7CisJCQl1X2ludDMyX3QgZHN0OworCQkJdV9jaGFyIG1iejsKKwkJCXVfY2hhciBwcm90bzsKKwkJCXVfaW50MTZfdCBsZW47CisJCX0gcGg7CisJCXVfaW50MTZfdCBwYVs2XTsKKwl9IHBodTsKKwlyZWdpc3RlciBjb25zdCB1X2ludDE2X3QgKnNwOworCisJLyogcHNldWRvLWhlYWRlci4uICovCisJcGh1LnBoLmxlbiA9IGh0b25zKCh1X2ludDE2X3QpbGVuKTsKKwlwaHUucGgubWJ6ID0gMDsKKwlwaHUucGgucHJvdG8gPSBJUFBST1RPX1VEUDsKKwltZW1jcHkoJnBodS5waC5zcmMsICZpcC0+aXBfc3JjLnNfYWRkciwgc2l6ZW9mKHVfaW50MzJfdCkpOworCWlmIChJUF9ITChpcCkgPT0gNSkKKwkJbWVtY3B5KCZwaHUucGguZHN0LCAmaXAtPmlwX2RzdC5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKKwllbHNlCisJCXBodS5waC5kc3QgPSBpcF9maW5kZHN0KGlwKTsKKworCXNwID0gJnBodS5wYVswXTsKKwlyZXR1cm4gaW5fY2tzdW0oKHVfc2hvcnQgKil1cCwgbGVuLAorCQkJc3BbMF0rc3BbMV0rc3BbMl0rc3BbM10rc3BbNF0rc3BbNV0pOworfQorCisjaWZkZWYgSU5FVDYKK3N0YXRpYyBpbnQgdWRwNl9ja3N1bShjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2LCBjb25zdCBzdHJ1Y3QgdWRwaGRyICp1cCwKKwl1X2ludCBsZW4pCit7CisJc2l6ZV90IGk7CisJcmVnaXN0ZXIgY29uc3QgdV9pbnQxNl90ICpzcDsKKwl1X2ludDMyX3Qgc3VtOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbjZfYWRkciBwaF9zcmM7CisJCQlzdHJ1Y3QgaW42X2FkZHIgcGhfZHN0OworCQkJdV9pbnQzMl90CXBoX2xlbjsKKwkJCXVfaW50OF90CXBoX3plcm9bM107CisJCQl1X2ludDhfdAlwaF9ueHQ7CisJCX0gcGg7CisJCXVfaW50MTZfdCBwYVsyMF07CisJfSBwaHU7CisKKwkvKiBwc2V1ZG8taGVhZGVyICovCisJbWVtc2V0KCZwaHUsIDAsIHNpemVvZihwaHUpKTsKKwlwaHUucGgucGhfc3JjID0gaXA2LT5pcDZfc3JjOworCXBodS5waC5waF9kc3QgPSBpcDYtPmlwNl9kc3Q7CisJcGh1LnBoLnBoX2xlbiA9IGh0b25sKGxlbik7CisJcGh1LnBoLnBoX254dCA9IElQUFJPVE9fVURQOworCisJc3VtID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBodS5wYSkgLyBzaXplb2YocGh1LnBhWzBdKTsgaSsrKQorCQlzdW0gKz0gcGh1LnBhW2ldOworCisJc3AgPSAoY29uc3QgdV9pbnQxNl90ICopdXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIH4xKTsgaSArPSAyKQorCQlzdW0gKz0gKnNwKys7CisKKwlpZiAobGVuICYgMSkKKwkJc3VtICs9IGh0b25zKCgqKGNvbnN0IHVfaW50OF90ICopc3ApIDw8IDgpOworCisJd2hpbGUgKHN1bSA+IDB4ZmZmZikKKwkJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKKwlzdW0gPSB+c3VtICYgMHhmZmZmOworCisJcmV0dXJuIChzdW0pOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1ZHBpcGFkZHJfcHJpbnQoY29uc3Qgc3RydWN0IGlwICppcCwgaW50IHNwb3J0LCBpbnQgZHBvcnQpCit7CisjaWZkZWYgSU5FVDYKKwljb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OworCisJaWYgKElQX1YoaXApID09IDYpCisJCWlwNiA9IChjb25zdCBzdHJ1Y3QgaXA2X2hkciAqKWlwOworCWVsc2UKKwkJaXA2ID0gTlVMTDsKKworCWlmIChpcDYpIHsKKwkJaWYgKGlwNi0+aXA2X254dCA9PSBJUFBST1RPX1VEUCkgeworCQkJaWYgKHNwb3J0ID09IC0xKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAorCQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwKKwkJCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X2RzdCkpOworCQkJfSBlbHNlIHsKKwkJCQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsCisJCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhzcG9ydCksCisJCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhkcG9ydCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHNwb3J0ICE9IC0xKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhzcG9ydCksCisJCQkJCXVkcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCQl9CisJCX0KKwl9IGVsc2UKKyNlbmRpZiAvKklORVQ2Ki8KKwl7CisJCWlmIChpcC0+aXBfcCA9PSBJUFBST1RPX1VEUCkgeworCQkJaWYgKHNwb3J0ID09IC0xKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAorCQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKKwkJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCkpOworCQkJfSBlbHNlIHsKKwkJCQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsCisJCQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9zcmMpLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhzcG9ydCksCisJCQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhkcG9ydCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHNwb3J0ICE9IC0xKSB7CisJCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAorCQkJCQl1ZHBwb3J0X3N0cmluZyhzcG9ydCksCisJCQkJCXVkcHBvcnRfc3RyaW5nKGRwb3J0KSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQKK3VkcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsCisJICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMiwgaW50IGZyYWdtZW50ZWQpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHVkcGhkciAqdXA7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwICppcDsKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXAgPSBicCArIGxlbmd0aDsKKwl1X2ludDE2X3Qgc3BvcnQsIGRwb3J0LCB1bGVuOworI2lmZGVmIElORVQ2CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKKyNlbmRpZgorCisJaWYgKGVwID4gc25hcGVuZCkKKwkJZXAgPSBzbmFwZW5kOworCXVwID0gKHN0cnVjdCB1ZHBoZHIgKilicDsKKwlpcCA9IChzdHJ1Y3QgaXAgKilicDI7CisjaWZkZWYgSU5FVDYKKwlpZiAoSVBfVihpcCkgPT0gNikKKwkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnAyOworCWVsc2UKKwkJaXA2ID0gTlVMTDsKKyNlbmRpZiAvKklORVQ2Ki8KKwljcCA9ICh1X2NoYXIgKikodXAgKyAxKTsKKwlpZiAoIVRURVNUKHVwLT51aF9kcG9ydCkpIHsKKwkJdWRwaXBhZGRyX3ByaW50KGlwLCAtMSwgLTEpOworCQkodm9pZClwcmludGYoIlt8dWRwXSIpOworCQlyZXR1cm47CisJfQorCisJc3BvcnQgPSBFWFRSQUNUXzE2QklUUygmdXAtPnVoX3Nwb3J0KTsKKwlkcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZ1cC0+dWhfZHBvcnQpOworCisJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSkgeworCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7CisJCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLXVkcCAlZCIsIGxlbmd0aCk7CisJCXJldHVybjsKKwl9CisJbGVuZ3RoIC09IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworCWlmIChjcCA+IHNuYXBlbmQpIHsKKwkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOworCQkodm9pZClwcmludGYoIlt8dWRwXSIpOworCQlyZXR1cm47CisJfQorCisJdWxlbiA9IEVYVFJBQ1RfMTZCSVRTKCZ1cC0+dWhfdWxlbik7CisJaWYgKHVsZW4gPCA4KSB7CisJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKKwkJKHZvaWQpcHJpbnRmKCJ0cnVuY2F0ZWQtdWRwbGVuZ3RoICVkIiwgdWxlbik7CisJCXJldHVybjsKKwl9CisJaWYgKHBhY2tldHR5cGUpIHsKKwkJcmVnaXN0ZXIgc3RydWN0IHN1bnJwY19tc2cgKnJwOworCQllbnVtIHN1bnJwY19tc2dfdHlwZSBkaXJlY3Rpb247CisKKwkJc3dpdGNoIChwYWNrZXR0eXBlKSB7CisKKwkJY2FzZSBQVF9WQVQ6CisJCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7CisJCQl2YXRfcHJpbnQoKHZvaWQgKikodXAgKyAxKSwgdXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVF9XQjoKKwkJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKKwkJCXdiX3ByaW50KCh2b2lkICopKHVwICsgMSksIGxlbmd0aCk7CisJCQlicmVhazsKKworCQljYXNlIFBUX1JQQzoKKwkJCXJwID0gKHN0cnVjdCBzdW5ycGNfbXNnICopKHVwICsgMSk7CisJCQlkaXJlY3Rpb24gPSAoZW51bSBzdW5ycGNfbXNnX3R5cGUpRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9kaXJlY3Rpb24pOworCQkJaWYgKGRpcmVjdGlvbiA9PSBTVU5SUENfQ0FMTCkKKwkJCQlzdW5ycGNyZXF1ZXN0X3ByaW50KCh1X2NoYXIgKilycCwgbGVuZ3RoLAorCQkJCSAgICAodV9jaGFyICopaXApOworCQkJZWxzZQorCQkJCW5mc3JlcGx5X3ByaW50KCh1X2NoYXIgKilycCwgbGVuZ3RoLAorCQkJCSAgICAodV9jaGFyICopaXApOwkJCS8qWFhYKi8KKwkJCWJyZWFrOworCisJCWNhc2UgUFRfUlRQOgorCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOworCQkJcnRwX3ByaW50KCh2b2lkICopKHVwICsgMSksIGxlbmd0aCwgdXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVF9SVENQOgorCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOworCQkJd2hpbGUgKGNwIDwgZXApCisJCQkJY3AgPSBydGNwX3ByaW50KGNwLCBlcCk7CisJCQlicmVhazsKKworCQljYXNlIFBUX1NOTVA6CisJCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7CisJCQlzbm1wX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRfQ05GUDoKKwkJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKKwkJCWNuZnBfcHJpbnQoY3AsIChjb25zdCB1X2NoYXIgKilpcCk7CisJCQlicmVhazsKKworCQljYXNlIFBUX1RGVFA6CisJCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7CisJCQl0ZnRwX3ByaW50KGNwLCBsZW5ndGgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQVF9BT0RWOgorCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOworCQkJYW9kdl9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCwKKyNpZmRlZiBJTkVUNgorCQkJICAgIGlwNiAhPSBOVUxMKTsKKyNlbHNlCisJCQkgICAgMCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXFmbGFnKSB7CisJCXJlZ2lzdGVyIHN0cnVjdCBzdW5ycGNfbXNnICpycDsKKwkJZW51bSBzdW5ycGNfbXNnX3R5cGUgZGlyZWN0aW9uOworCisJCXJwID0gKHN0cnVjdCBzdW5ycGNfbXNnICopKHVwICsgMSk7CisJCWlmIChUVEVTVChycC0+cm1fZGlyZWN0aW9uKSkgeworCQkJZGlyZWN0aW9uID0gKGVudW0gc3VucnBjX21zZ190eXBlKUVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fZGlyZWN0aW9uKTsKKwkJCWlmIChkcG9ydCA9PSBORlNfUE9SVCAmJiBkaXJlY3Rpb24gPT0gU1VOUlBDX0NBTEwpIHsKKwkJCQluZnNyZXFfcHJpbnQoKHVfY2hhciAqKXJwLCBsZW5ndGgsCisJCQkJICAgICh1X2NoYXIgKilpcCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKHNwb3J0ID09IE5GU19QT1JUICYmIGRpcmVjdGlvbiA9PSBTVU5SUENfUkVQTFkpIHsKKwkJCQluZnNyZXBseV9wcmludCgodV9jaGFyICopcnAsIGxlbmd0aCwKKwkJCQkgICAgKHVfY2hhciAqKWlwKTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWZkZWYgbm90ZGVmCisJCQlpZiAoZHBvcnQgPT0gU1VOUlBDX1BPUlQgJiYgZGlyZWN0aW9uID09IFNVTlJQQ19DQUxMKSB7CisJCQkJc3VucnBjcmVxdWVzdF9wcmludCgodV9jaGFyICopcnAsIGxlbmd0aCwgKHVfY2hhciAqKWlwKTsKKwkJCQlyZXR1cm47CisJCQl9CisjZW5kaWYKKwkJfQorCQlpZiAoVFRFU1QoKChzdHJ1Y3QgTEFQICopY3ApLT50eXBlKSAmJgorCQkgICAgKChzdHJ1Y3QgTEFQICopY3ApLT50eXBlID09IGxhcEREUCAmJgorCQkgICAgKGF0YWxrX3BvcnQoc3BvcnQpIHx8IGF0YWxrX3BvcnQoZHBvcnQpKSkgeworCQkJaWYgKHZmbGFnKQorCQkJCWZwdXRzKCJraXAgIiwgc3Rkb3V0KTsKKwkJCWxsYXBfcHJpbnQoY3AsIGxlbmd0aCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOworCisJaWYgKElQX1YoaXApID09IDQgJiYgKHZmbGFnID4gMSkgJiYgIWZyYWdtZW50ZWQpIHsKKwkJaW50IHN1bSA9IHVwLT51aF9zdW07CisJCWlmIChzdW0gPT0gMCkgeworCQkJKHZvaWQpcHJpbnRmKCJbbm8gY2tzdW1dICIpOworCQl9IGVsc2UgaWYgKFRURVNUMihjcFswXSwgbGVuZ3RoKSkgeworCQkJc3VtID0gdWRwX2Nrc3VtKGlwLCB1cCwgbGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwkJCWlmIChzdW0gIT0gMCkKKwkJCQkodm9pZClwcmludGYoIltiYWQgdWRwIGNrc3VtICV4IV0gIiwgc3VtKTsKKwkJCWVsc2UKKwkJCQkodm9pZClwcmludGYoIlt1ZHAgc3VtIG9rXSAiKTsKKwkJfQorCX0KKyNpZmRlZiBJTkVUNgorCWlmIChJUF9WKGlwKSA9PSA2ICYmIGlwNi0+aXA2X3BsZW4gJiYgdmZsYWcgJiYgIWZyYWdtZW50ZWQpIHsKKwkJaW50IHN1bSA9IHVwLT51aF9zdW07CisJCS8qIGZvciBJUHY2LCBVRFAgY2hlY2tzdW0gaXMgbWFuZGF0b3J5ICovCisJCWlmIChUVEVTVDIoY3BbMF0sIGxlbmd0aCkpIHsKKwkJCXN1bSA9IHVkcDZfY2tzdW0oaXA2LCB1cCwgbGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwkJCWlmIChzdW0gIT0gMCkKKwkJCQkodm9pZClwcmludGYoIltiYWQgdWRwIGNrc3VtICV4IV0gIiwgc3VtKTsKKwkJCWVsc2UKKwkJCQkodm9pZClwcmludGYoIlt1ZHAgc3VtIG9rXSAiKTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKCFxZmxhZykgeworI2RlZmluZSBJU1BPUlQocCkgKGRwb3J0ID09IChwKSB8fCBzcG9ydCA9PSAocCkpCisJCWlmIChJU1BPUlQoTkFNRVNFUlZFUl9QT1JUKSkKKwkJCW5zX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoLCAwKTsKKwkJZWxzZSBpZiAoSVNQT1JUKE1VTFRJQ0FTVEROU19QT1JUKSkKKwkJCW5zX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoLCAxKTsKKwkJZWxzZSBpZiAoSVNQT1JUKFRJTUVEX1BPUlQpKQorCQkJdGltZWRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpKTsKKwkJZWxzZSBpZiAoSVNQT1JUKFRGVFBfUE9SVCkpCisJCQl0ZnRwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoSVNQT1JUKElQUE9SVF9CT09UUEMpIHx8IElTUE9SVChJUFBPUlRfQk9PVFBTKSkKKwkJCWJvb3RwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoSVNQT1JUKFJJUF9QT1JUKSkKKwkJCXJpcF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7CisJCWVsc2UgaWYgKElTUE9SVChBT0RWX1BPUlQpKQorCQkJYW9kdl9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCwKKyNpZmRlZiBJTkVUNgorCQkJICAgIGlwNiAhPSBOVUxMKTsKKyNlbHNlCisJCQkgICAgMCk7CisjZW5kaWYKKwkgICAgICAgIGVsc2UgaWYgKElTUE9SVChJU0FLTVBfUE9SVCkpCisJCQkgaXNha21wX3ByaW50KGduZG8sIChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoLCBicDIpOworICAJICAgICAgICBlbHNlIGlmIChJU1BPUlQoSVNBS01QX1BPUlRfTkFUVCkpCisJCQkgaXNha21wX3JmYzM5NDhfcHJpbnQoZ25kbywgKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgsIGJwMik7CisjaWYgMSAvKj8/PyovCisgICAJICAgICAgICBlbHNlIGlmIChJU1BPUlQoSVNBS01QX1BPUlRfVVNFUjEpIHx8IElTUE9SVChJU0FLTVBfUE9SVF9VU0VSMikpCisJCQlpc2FrbXBfcHJpbnQoZ25kbywgKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgsIGJwMik7CisjZW5kaWYKKwkJZWxzZSBpZiAoSVNQT1JUKFNOTVBfUE9SVCkgfHwgSVNQT1JUKFNOTVBUUkFQX1BPUlQpKQorCQkJc25tcF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7CisJCWVsc2UgaWYgKElTUE9SVChOVFBfUE9SVCkpCisJCQludHBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworCQllbHNlIGlmIChJU1BPUlQoS0VSQkVST1NfUE9SVCkgfHwgSVNQT1JUKEtFUkJFUk9TX1NFQ19QT1JUKSkKKwkJCWtyYl9wcmludCgoY29uc3Qgdm9pZCAqKSh1cCArIDEpKTsKKwkJZWxzZSBpZiAoSVNQT1JUKEwyVFBfUE9SVCkpCisJCQlsMnRwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKyNpZmRlZiBUQ1BEVU1QX0RPX1NNQgorCQllbHNlIGlmIChJU1BPUlQoTkVUQklPU19OU19QT1JUKSkKKwkJCW5idF91ZHAxMzdfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworCQllbHNlIGlmIChJU1BPUlQoTkVUQklPU19ER1JBTV9QT1JUKSkKKwkJCW5idF91ZHAxMzhfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworI2VuZGlmCisJCWVsc2UgaWYgKGRwb3J0ID09IDM0NTYpCisJCQl2YXRfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSwgdXApOworCQllbHNlIGlmIChJU1BPUlQoWkVQSFlSX1NSVl9QT1JUKSB8fCBJU1BPUlQoWkVQSFlSX0NMVF9QT1JUKSkKKwkJCXplcGh5cl9wcmludCgoY29uc3Qgdm9pZCAqKSh1cCArIDEpLCBsZW5ndGgpOworCQkvKgorCQkgKiBTaW5jZSB0aGVyZSBhcmUgMTAgcG9zc2libGUgcG9ydHMgdG8gY2hlY2ssIEkgdGhpbmsKKwkJICogYSA8PiB0ZXN0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50CisJCSAqLworCQllbHNlIGlmICgoc3BvcnQgPj0gUlhfUE9SVF9MT1cgJiYgc3BvcnQgPD0gUlhfUE9SVF9ISUdIKSB8fAorCQkJIChkcG9ydCA+PSBSWF9QT1JUX0xPVyAmJiBkcG9ydCA8PSBSWF9QT1JUX0hJR0gpKQorCQkJcnhfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSwgbGVuZ3RoLCBzcG9ydCwgZHBvcnQsCisJCQkJICh1X2NoYXIgKikgaXApOworI2lmZGVmIElORVQ2CisJCWVsc2UgaWYgKElTUE9SVChSSVBOR19QT1JUKSkKKwkJCXJpcG5nX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoSVNQT1JUKERIQ1A2X1NFUlZfUE9SVCkgfHwgSVNQT1JUKERIQ1A2X0NMSV9QT1JUKSkgeworCQkJZGhjcDZfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworCQl9CisjZW5kaWYgLypJTkVUNiovCisJCS8qCisJCSAqIEtsdWRnZSBpbiB0ZXN0IGZvciB3aGl0ZWJvYXJkIHBhY2tldHMuCisJCSAqLworCQllbHNlIGlmIChkcG9ydCA9PSA0NTY3KQorCQkJd2JfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoSVNQT1JUKENJU0NPX0FVVE9SUF9QT1JUKSkKKwkJCWNpc2NvX2F1dG9ycF9wcmludCgoY29uc3Qgdm9pZCAqKSh1cCArIDEpLCBsZW5ndGgpOworCQllbHNlIGlmIChJU1BPUlQoUkFESVVTX1BPUlQpIHx8CisJCQkgSVNQT1JUKFJBRElVU19ORVdfUE9SVCkgfHwKKwkJCSBJU1BPUlQoUkFESVVTX0FDQ09VTlRJTkdfUE9SVCkgfHwKKwkJCSBJU1BPUlQoUkFESVVTX05FV19BQ0NPVU5USU5HX1BPUlQpICkKKwkJCXJhZGl1c19wcmludCgoY29uc3QgdV9jaGFyICopKHVwKzEpLCBsZW5ndGgpOworCQllbHNlIGlmIChkcG9ydCA9PSBIU1JQX1BPUlQpCisJCQloc3JwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoSVNQT1JUKExXUkVTX1BPUlQpKQorCQkJbHdyZXNfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChMRFBfUE9SVCkpCisJCQlsZHBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChPTFNSX1BPUlQpKQorCQkJb2xzcl9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNQT1JUKE1QTFNfTFNQX1BJTkdfUE9SVCkpCisJCQlsc3BwaW5nX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKKwkJZWxzZSBpZiAoZHBvcnQgPT0gQkZEX0NPTlRST0xfUE9SVCB8fAorCQkJIGRwb3J0ID09IEJGRF9FQ0hPX1BPUlQgKQorCQkJYmZkX3ByaW50KChjb25zdCB1X2NoYXIgKikodXArMSksIGxlbmd0aCwgZHBvcnQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChMTVBfUE9SVCkpCisJCQlsbXBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChTSVBfUE9SVCkpCisJCQlzaXBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChTWVNMT0dfUE9SVCkpCisJCQlzeXNsb2dfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOworCQllbHNlCisJCQkodm9pZClwcmludGYoIlVEUCwgbGVuZ3RoICV1IiwKKwkJCSAgICAodV9pbnQzMl90KSh1bGVuIC0gc2l6ZW9mKCp1cCkpKTsKKyN1bmRlZiBJU1BPUlQKKwl9IGVsc2UKKwkJKHZvaWQpcHJpbnRmKCJVRFAsIGxlbmd0aCAldSIsICh1X2ludDMyX3QpKHVsZW4gLSBzaXplb2YoKnVwKSkpOworfQorCisKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9wcmludC12amMuYyBiL3ByaW50LXZqYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjdkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC12amMuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdmpjLmMsdiAxLjE1IDIwMDQvMDMvMjUgMDM6MzE6MTcgbWNyIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorCisjaW5jbHVkZSAic2xjb21wcmVzcy5oIgorI2luY2x1ZGUgInBwcC5oIgorCisvKgorICogWFhYIC0gZm9yIEJTRC9PUyBQUFAsIHdoYXQgcGFja2V0cyBnZXQgc3VwcGxpZWQgd2l0aCBhIFBQUCBoZWFkZXIgdHlwZQorICogb2YgUFBQX1ZKQyBhbmQgd2hhdCBwYWNrZXRzIGdldCBzdXBwbGllZCB3aXRoIGEgUFBQIGhlYWRlciB0eXBlIG9mCisgKiBQUFBfVkpOQz8gIFBQUF9WSk5DIGlzIGZvciAiVU5DT01QUkVTU0VEX1RDUCIgcGFja2V0cywgYW5kIFBQUF9WSkMKKyAqIGlzIGZvciBDT01QUkVTU0VEX1RDUCBwYWNrZXRzIChQUFBfSVAgaXMgdXNlZCBmb3IgVFlQRV9JUCBwYWNrZXRzKS4KKyAqCisgKiBSRkMgMTE0NCBpbXBsaWVzIHRoYXQsIG9uIHRoZSB3aXJlLCB0aGUgcGFja2V0IHR5cGUgaXMgKm5vdCogbmVlZGVkCisgKiBmb3IgUFBQLCBhcyBkaWZmZXJlbnQgUFBQIHByb3RvY29sIHR5cGVzIGNhbiBiZSB1c2VkOyBpdCBvbmx5IG5lZWRzCisgKiB0byBiZSBwdXQgb24gdGhlIHdpcmUgZm9yIFNMSVAuCisgKgorICogSXQgYWxzbyBpbmRpY2F0ZXMgdGhhdCwgZm9yIGNvbXByZXNzZWQgU0xJUDoKKyAqCisgKglJZiB0aGUgQ09NUFJFU1NFRF9UQ1AgYml0IGlzIHNldCBpbiB0aGUgZmlyc3QgYnl0ZSwgaXQncworICoJYSBDT01QUkVTU0VEX1RDUCBwYWNrZXQ7IHRoYXQgYnl0ZSBpcyB0aGUgY2hhbmdlIGJ5dGUsIGFuZAorICoJdGhlIENPTVBSRVNTRURfVENQIGJpdCwgMHg4MCwgaXNuJ3QgdXNlZCBpbiB0aGUgY2hhbmdlIGJ5dGUuCisgKgorICoJSWYgdGhlIHVwcGVyIDQgYml0cyBvZiB0aGUgZmlyc3QgYnl0ZSBhcmUgNywgaXQncyBhbgorICoJVU5DT01QUkVTU0VEX1RDUCBwYWNrZXQ7IHRoYXQgYnl0ZSBpcyB0aGUgZmlyc3QgYnl0ZSBvZgorICoJdGhlIFVOQ09NUFJFU1NFRF9UQ1AgbW9kaWZpZWQgSVAgaGVhZGVyLCB3aXRoIGEgY29ubmVjdGlvbgorICoJbnVtYmVyIGluIHRoZSBwcm90b2NvbCBmaWVsZCwgYW5kIHdpdGggdGhlIHZlcnNpb24gZmllbGQKKyAqCWJlaW5nIDcsIG5vdCA0LgorICoKKyAqCU90aGVyd2lzZSwgdGhlIHBhY2tldCBpcyBhbiBJUHY0IHBhY2tldCAod2hlcmUgdGhlIHVwcGVyIDQgYml0cworICoJb2YgdGhlIHBhY2tldCBhcmUgNCkuCisgKgorICogU28gdGhpcyByb3V0aW5lIGxvb2tzIGFzIGlmIGl0J3Mgc29ydC1vZiBpbnRlbmRlZCB0byBoYW5kbGUKKyAqIGNvbXByZXNzZWQgU0xJUCwgYWx0aG91Z2ggaXQgZG9lc24ndCBoYW5kbGUgVU5DT01QUkVTU0VEX1RDUAorICogY29ycmVjdGx5IGZvciB0aGF0IChpdCBkb2Vzbid0IGZpeCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGRvZXNuJ3QKKyAqIGRvIGFueXRoaW5nIHRvIHRoZSBwcm90b2NvbCBmaWVsZCksIGFuZCBkb2Vzbid0IGNoZWNrIGZvciBDT01QUkVTU0VEX1RDUAorICogcGFja2V0cyBjb3JyZWN0bHkgZm9yIHRoYXQgKHlvdSBvbmx5IGNoZWNrIHRoZSBmaXJzdCBiaXQgLSBzZWUKKyAqIEIuMSBpbiBSRkMgMTE0NCkuCisgKgorICogQnV0IGl0J3MgY2FsbGVkIGZvciBCU0QvT1MgUFBQLCBub3QgU0xJUCAtIHBlcmhhcHMgQlNEL09TIGRvZXMgd2VpcmQKKyAqIHRoaW5ncyB3aXRoIHRoZSBoZWFkZXJzPworICoKKyAqIFdpdGhvdXQgYSBCU0QvT1MgVkpDLWNvbXByZXNzZWQgUFBQIHRyYWNlLCBvciBrbm93bGVkZ2Ugb2Ygd2hhdCB0aGUKKyAqIEJTRC9PUyBWSkMgY29kZSBkb2VzLCB3ZSBjYW4ndCBzYXkgd2hhdCdzIHRoZSBjYXNlLgorICoKKyAqIFdlIHRoZXJlZm9yZSBsZWF2ZSAicHJvdG8iIC0gd2hpY2ggaXMgdGhlIFBQUCBwcm90b2NvbCB0eXBlIC0gaW4gcGxhY2UsCisgKiAqbm90KiBtYXJrZWQgYXMgdW51c2VkLCBmb3Igbm93LCBzbyB0aGF0IEdDQyB3YXJuaW5ncyBhYm91dCB0aGUKKyAqIHVudXNlZCBhcmd1bWVudCByZW1pbmQgdXMgdGhhdCB3ZSBzaG91bGQgZml4IHRoaXMgc29tZSBkYXkuCisgKi8KK2ludAordmpjX3ByaW50KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmJwLCB1X3Nob3J0IHByb3RvIF9VXykKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoYnBbMF0gJiAweGYwKSB7CisJY2FzZSBUWVBFX0lQOgorCQlpZiAoZWZsYWcpCisJCQlwcmludGYoIih2amMgdHlwZT1JUCkgIik7CisJCXJldHVybiBQUFBfSVA7CisJY2FzZSBUWVBFX1VOQ09NUFJFU1NFRF9UQ1A6CisJCWlmIChlZmxhZykKKwkJCXByaW50ZigiKHZqYyB0eXBlPXJhdyBUQ1ApICIpOworCQlyZXR1cm4gUFBQX0lQOworCWNhc2UgVFlQRV9DT01QUkVTU0VEX1RDUDoKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIodmpjIHR5cGU9Y29tcHJlc3NlZCBUQ1ApICIpOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAoYnBbMV0gJiAoMHg4MCA+PiBpKSkKKwkJCQlwcmludGYoIiVjIiwgIj9DST9TQVdVIltpXSk7CisJCX0KKwkJaWYgKGJwWzFdKQorCQkJcHJpbnRmKCIgIik7CisJCXByaW50ZigiQz0weCUwMnggIiwgYnBbMl0pOworCQlwcmludGYoInN1bT0weCUwNHggIiwgKih1X3Nob3J0ICopJmJwWzNdKTsKKwkJcmV0dXJuIC0xOworCWNhc2UgVFlQRV9FUlJPUjoKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIodmpjIHR5cGU9ZXJyb3IpICIpOworCQlyZXR1cm4gLTE7CisJZGVmYXVsdDoKKwkJaWYgKGVmbGFnKQorCQkJcHJpbnRmKCIodmpjIHR5cGU9MHglMDJ4KSAiLCBicFswXSAmIDB4ZjApOworCQlyZXR1cm4gLTE7CisJfQorfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdnJycC5jIGIvcHJpbnQtdnJycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODdhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC12cnJwLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgV2lsbGlhbSBDLiBGZW5uZXIuCisgKiAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEtldmluIFN0ZXZlcyA8a3NAaHAuc2U+IEp1bHkgMjAwMAorICogTW9kaWZpZWQgdG86CisgKiAtIHByaW50IHZlcnNpb24sIHR5cGUgc3RyaW5nIGFuZCBwYWNrZXQgbGVuZ3RoCisgKiAtIHByaW50IElQIGFkZHJlc3MgY291bnQgaWYgPiAxICgtdikKKyAqIC0gdmVyaWZ5IGNoZWNrc3VtICgtdikKKyAqIC0gcHJpbnQgYXV0aGVudGljYXRpb24gc3RyaW5nICgtdikKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUaGUgbmFtZSBvZiBXaWxsaWFtIEMuIEZlbm5lciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgorICogcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKKyAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKKyAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdnJycC5jLHYgMS45LjIuMSAyMDA1LzA1LzA2IDA3OjU3OjIwIGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorCisvKgorICogUkZDIDIzMzg6CisgKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHxWZXJzaW9ufCBUeXBlICB8IFZpcnR1YWwgUnRyIElEfCAgIFByaW9yaXR5ICAgIHwgQ291bnQgSVAgQWRkcnN8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgIEF1dGggVHlwZSAgIHwgICBBZHZlciBJbnQgICB8ICAgICAgICAgIENoZWNrc3VtICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQIEFkZHJlc3MgKDEpICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQIEFkZHJlc3MgKG4pICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiBEYXRhICgxKSAgICAgICAgICAgICAgICAgICB8CisgKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogICAgfCAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIERhdGEgKDIpICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KKworLyogVHlwZSAqLworI2RlZmluZQlWUlJQX1RZUEVfQURWRVJUSVNFTUVOVAkxCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7CisJeyBWUlJQX1RZUEVfQURWRVJUSVNFTUVOVCwJIkFkdmVydGlzZW1lbnQiCX0sCisJeyAwLAkJCQlOVUxMCQl9Cit9OworCisvKiBBdXRoIFR5cGUgKi8KKyNkZWZpbmUJVlJSUF9BVVRIX05PTkUJCTAKKyNkZWZpbmUJVlJSUF9BVVRIX1NJTVBMRQkxCisjZGVmaW5lCVZSUlBfQVVUSF9BSAkJMgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBhdXRoMnN0cltdID0geworCXsgVlJSUF9BVVRIX05PTkUsCQkibm9uZSIJCX0sCisJeyBWUlJQX0FVVEhfU0lNUExFLAkJInNpbXBsZSIJfSwKKwl7IFZSUlBfQVVUSF9BSCwJCQkiYWgiCQl9LAorCXsgMCwJCQkJTlVMTAkJfQorfTsKKwordm9pZAordnJycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4sIGludCB0dGwpCit7CisJaW50IHZlcnNpb24sIHR5cGUsIGF1dGhfdHlwZTsKKwljb25zdCBjaGFyICp0eXBlX3M7CisKKwlUQ0hFQ0soYnBbMF0pOworCXZlcnNpb24gPSAoYnBbMF0gJiAweGYwKSA+PiA0OworCXR5cGUgPSBicFswXSAmIDB4MGY7CisJdHlwZV9zID0gdG9rMnN0cih0eXBlMnN0ciwgInVua25vd24gdHlwZSAoJXUpIiwgdHlwZSk7CisJcHJpbnRmKCJWUlJQdiV1LCAlcyIsIHZlcnNpb24sIHR5cGVfcyk7CisJaWYgKHR0bCAhPSAyNTUpCisJCXByaW50ZigiLCAodHRsICV1KSIsIHR0bCk7CisJaWYgKHZlcnNpb24gIT0gMiB8fCB0eXBlICE9IFZSUlBfVFlQRV9BRFZFUlRJU0VNRU5UKQorCQlyZXR1cm47CisJVENIRUNLKGJwWzJdKTsKKwlwcmludGYoIiwgdnJpZCAldSwgcHJpbyAldSIsIGJwWzFdLCBicFsyXSk7CisJVENIRUNLKGJwWzVdKTsKKwlhdXRoX3R5cGUgPSBicFs0XTsKKwlwcmludGYoIiwgYXV0aHR5cGUgJXMiLCB0b2syc3RyKGF1dGgyc3RyLCBOVUxMLCBhdXRoX3R5cGUpKTsKKwlwcmludGYoIiwgaW50dmwgJXVzLCBsZW5ndGggJXUiLCBicFs1XSxsZW4pOworCWlmICh2ZmxhZykgeworCQlpbnQgbmFkZHJzID0gYnBbM107CisJCWludCBpOworCQljaGFyIGM7CisKKwkJaWYgKFRURVNUMihicFswXSwgbGVuKSAmJiBpbl9ja3N1bSgoY29uc3QgdV9zaG9ydCopYnAsIGxlbiwgMCkpCisJCQlwcmludGYoIiwgKGJhZCB2cnJwIGNrc3VtICV4KSIsCisJCQkJRVhUUkFDVF8xNkJJVFMoJmJwWzZdKSk7CisJCXByaW50ZigiLCBhZGRycyIpOworCQlpZiAobmFkZHJzID4gMSkKKwkJCXByaW50ZigiKCVkKSIsIG5hZGRycyk7CisJCXByaW50ZigiOiIpOworCQljID0gJyAnOworCQlicCArPSA4OworCQlmb3IgKGkgPSAwOyBpIDwgbmFkZHJzOyBpKyspIHsKKwkJCVRDSEVDSyhicFszXSk7CisJCQlwcmludGYoIiVjJXMiLCBjLCBpcGFkZHJfc3RyaW5nKGJwKSk7CisJCQljID0gJywnOworCQkJYnAgKz0gNDsKKwkJfQorCQlpZiAoYXV0aF90eXBlID09IFZSUlBfQVVUSF9TSU1QTEUpIHsgLyogc2ltcGxlIHRleHQgcGFzc3dvcmQgKi8KKwkJCVRDSEVDSyhicFs3XSk7CisJCQlwcmludGYoIiBhdXRoIFwiIik7CisJCQlpZiAoZm5fcHJpbnRuKGJwLCA4LCBzbmFwZW5kKSkgeworCQkJCXByaW50ZigiXCIiKTsKKwkJCQlnb3RvIHRydW5jOworCQkJfQorCQkJcHJpbnRmKCJcIiIpOworCQl9CisJfQorCXJldHVybjsKK3RydW5jOgorCXByaW50ZigiW3x2cnJwXSIpOworfQpkaWZmIC0tZ2l0IGEvcHJpbnQtd2IuYyBiL3ByaW50LXdiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4Njk3YQotLS0gL2Rldi9udWxsCisrKyBiL3ByaW50LXdiLmMKQEAgLTAsMCArMSw0NDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC13Yi5jLHYgMS4zMyAyMDA0LzAzLzI0IDA0OjA2OjI4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJhZGRydG9uYW1lLmgiCisjaW5jbHVkZSAiZXh0cmFjdC5oIgorCisvKiBYWFggbmVlZCB0byBhZGQgYnl0ZS1zd2FwcGluZyBtYWNyb3MhICovCisvKiBYWFggLSB5b3UgbWVhbiBsaWtlIHRoZSBvbmVzIGluICJleHRyYWN0LmgiPyAqLworCisvKgorICogTGFyZ2VzdCBwYWNrZXQgc2l6ZS4gIEV2ZXJ5dGhpbmcgc2hvdWxkIGZpdCB3aXRoaW4gdGhpcyBzcGFjZS4KKyAqIEZvciBpbnN0YW5jZSwgbXVsdGlsaW5lIG9iamVjdHMgYXJlIHNlbnQgcGllY2V3aXNlLgorICovCisjZGVmaW5lIE1BWEZSQU1FU0laRSAxMDI0CisKKy8qCisgKiBNdWx0aXBsZSBkcmF3aW5nIG9wcyBjYW4gYmUgc2VudCBpbiBvbmUgcGFja2V0LiAgRWFjaCBvbmUgc3RhcnRzIG9uIGEKKyAqIGFuIGV2ZW4gbXVsdGlwbGUgb2YgRE9QX0FMSUdOIGJ5dGVzLCB3aGljaCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorICovCisjZGVmaW5lIERPUF9BTElHTiA0CisjZGVmaW5lIERPUF9ST1VORFVQKHgpCSgoKChpbnQpKHgpKSArIChET1BfQUxJR04gLSAxKSkgJiB+KERPUF9BTElHTiAtIDEpKQorI2RlZmluZSBET1BfTkVYVChkKVwKKwkoKHN0cnVjdCBkb3BoZHIgKikoKHVfY2hhciAqKShkKSArIFwKKwkJCSAgRE9QX1JPVU5EVVAoRVhUUkFDVF8xNkJJVFMoJihkKS0+ZGhfbGVuKSArIHNpemVvZigqKGQpKSkpKQorCisvKgorICogRm9ybWF0IG9mIHRoZSB3aGl0ZWJvYXJkIHBhY2tldCBoZWFkZXIuCisgKiBUaGUgdHJhbnNwb3J0IGxldmVsIGhlYWRlci4KKyAqLworc3RydWN0IHBrdF9oZHIgeworCXVfaW50MzJfdCBwaF9zcmM7CQkvKiBzaXRlIGlkIG9mIHNvdXJjZSAqLworCXVfaW50MzJfdCBwaF90czsJCS8qIHRpbWUgc3RhbXAgKGZvciBza2V3IGNvbXB1dGF0aW9uKSAqLworCXVfaW50MTZfdCBwaF92ZXJzaW9uOwkvKiB2ZXJzaW9uIG51bWJlciAqLworCXVfY2hhciBwaF90eXBlOwkJLyogbWVzc2FnZSB0eXBlICovCisJdV9jaGFyIHBoX2ZsYWdzOwkvKiBtZXNzYWdlIGZsYWdzICovCit9OworCisvKiBQYWNrZXQgdHlwZXMgKi8KKyNkZWZpbmUgUFRfRFJBV09QCTAJLyogZHJhd2luZyBvcGVyYXRpb24gKi8KKyNkZWZpbmUgUFRfSUQJCTEJLyogYW5ub3VuY2VtZW50IHBhY2tldCAqLworI2RlZmluZSBQVF9SUkVRCQkyCS8qIHJlcGFpciByZXF1ZXN0ICovCisjZGVmaW5lIFBUX1JSRVAJCTMJLyogcmVwYWlyIHJlcGx5ICovCisjZGVmaW5lIFBUX0tJTEwJCTQJLyogdGVybWluYXRlIHBhcnRpY2lwYXRpb24gKi8KKyNkZWZpbmUgUFRfUFJFUSAgICAgICAgIDUgICAgICAgLyogcGFnZSB2ZWN0b3IgcmVxdWVzdCAqLworI2RlZmluZSBQVF9QUkVQICAgICAgICAgNyAgICAgICAvKiBwYWdlIHZlY3RvciByZXBseSAqLworCisjaWZkZWYgUEZfVVNFUgorI3VuZGVmIFBGX1VTRVIJCQkvKiB7RGlnaXRhbCxUcnU2NH0gVU5JWCBkZWZpbmUgdGhpcywgYWxhcyAqLworI2VuZGlmCisKKy8qIGZsYWdzICovCisjZGVmaW5lIFBGX1VTRVIJCTB4MDEJLyogaGludCB0aGF0IHBhY2tldCBoYXMgaW50ZXJhY3RpdmUgZGF0YSAqLworI2RlZmluZSBQRl9WSVMJCTB4MDIJLyogb25seSB2aXNpYmxlIG9wcyB3YW50ZWQgKi8KKworc3RydWN0IFBhZ2VJRCB7CisJdV9pbnQzMl90IHBfc2lkOwkJLyogc2Vzc2lvbiBpZCBvZiBpbml0aWF0b3IgKi8KKwl1X2ludDMyX3QgcF91aWQ7CQkvKiBwYWdlIG51bWJlciAqLworfTsKKworc3RydWN0IGRvcGhkciB7CisJdV9pbnQzMl90ICBkaF90czsJCS8qIHNlbmRlcidzIHRpbWVzdGFtcCAqLworCXVfaW50MTZfdAlkaF9sZW47CQkvKiBib2R5IGxlbmd0aCAqLworCXVfY2hhcglkaF9mbGFnczsKKwl1X2NoYXIJZGhfdHlwZTsJLyogYm9keSB0eXBlICovCisJLyogYm9keSBmb2xsb3dzICovCit9OworLyoKKyAqIERyYXdpbmcgb3Agc3ViLXR5cGVzLgorICovCisjZGVmaW5lIERUX1JFQ1QgICAgICAgICAyCisjZGVmaW5lIERUX0xJTkUgICAgICAgICAzCisjZGVmaW5lIERUX01MICAgICAgICAgICA0CisjZGVmaW5lIERUX0RFTCAgICAgICAgICA1CisjZGVmaW5lIERUX1hGT1JNICAgICAgICA2CisjZGVmaW5lIERUX0VMTCAgICAgICAgICA3CisjZGVmaW5lIERUX0NIQVIgICAgICAgICA4CisjZGVmaW5lIERUX1NUUiAgICAgICAgICA5CisjZGVmaW5lIERUX05PUCAgICAgICAgICAxMAorI2RlZmluZSBEVF9QU0NPREUgICAgICAgMTEKKyNkZWZpbmUgRFRfUFNDT01QICAgICAgIDEyCisjZGVmaW5lIERUX1JFRiAgICAgICAgICAxMworI2RlZmluZSBEVF9TS0lQICAgICAgICAgMTQKKyNkZWZpbmUgRFRfSE9MRSAgICAgICAgIDE1CisjZGVmaW5lIERUX01BWFRZUEUgICAgICAxNQorCisvKgorICogQSBkcmF3aW5nIG9wZXJhdGlvbi4KKyAqLworc3RydWN0IHBrdF9kb3AgeworCXN0cnVjdCBQYWdlSUQgcGRfcGFnZTsJLyogcGFnZSB0aGF0IG9wZXJhdGlvbnMgYXBwbHkgdG8gKi8KKwl1X2ludDMyX3QJcGRfc3NlcTsJLyogc3RhcnQgc2VxdWVuY2UgbnVtYmVyICovCisJdV9pbnQzMl90CXBkX2VzZXE7CS8qIGVuZCBzZXF1ZW5jZSBudW1iZXIgKi8KKwkvKiBkcmF3aW5nIG9wcyBmb2xsb3cgKi8KK307CisKKy8qCisgKiBBIHJlcGFpciByZXF1ZXN0LgorICovCitzdHJ1Y3QgcGt0X3JyZXEgeworICAgICAgICB1X2ludDMyX3QgcHJfaWQ7ICAgICAgICAgICAvKiBzb3VyY2UgaWQgb2YgZHJhd29wcyB0byBiZSByZXBhaXJlZCAqLworICAgICAgICBzdHJ1Y3QgUGFnZUlEIHByX3BhZ2U7ICAgICAgICAgICAvKiBwYWdlIG9mIGRyYXdvcHMgKi8KKyAgICAgICAgdV9pbnQzMl90IHByX3NzZXE7ICAgICAgICAgLyogc3RhcnQgc2Vxbm8gKi8KKyAgICAgICAgdV9pbnQzMl90IHByX2VzZXE7ICAgICAgICAgLyogZW5kIHNlcW5vICovCit9OworCisvKgorICogQSByZXBhaXIgcmVwbHkuCisgKi8KK3N0cnVjdCBwa3RfcnJlcCB7CisJdV9pbnQzMl90IHByX2lkOwkvKiBvcmlnaW5hbCBzaXRlIGlkIG9mIG9wcyAgKi8KKwlzdHJ1Y3QgcGt0X2RvcCBwcl9kb3A7CisJLyogZHJhd2luZyBvcHMgZm9sbG93ICovCit9OworCitzdHJ1Y3QgaWRfb2ZmIHsKKyAgICAgICAgdV9pbnQzMl90IGlkOworICAgICAgICB1X2ludDMyX3Qgb2ZmOworfTsKKworc3RydWN0IHBnc3RhdGUgeworCXVfaW50MzJfdCBzbG90OworCXN0cnVjdCBQYWdlSUQgcGFnZTsKKwl1X2ludDE2X3QgbmlkOworCXVfaW50MTZfdCByc3ZkOworICAgICAgICAvKiBzZXFwdHIncyAqLworfTsKKworLyoKKyAqIEFuIGFubm91bmNlbWVudCBwYWNrZXQuCisgKi8KK3N0cnVjdCBwa3RfaWQgeworCXVfaW50MzJfdCBwaV9tc2xvdDsKKyAgICAgICAgc3RydWN0IFBhZ2VJRCAgICBwaV9tcGFnZTsgICAgICAgIC8qIGN1cnJlbnQgcGFnZSAqLworCXN0cnVjdCBwZ3N0YXRlIHBpX3BzOworICAgICAgICAvKiBzZXFwdHIncyAqLworICAgICAgICAvKiBudWxsLXRlcm1pbmF0ZWQgc2l0ZSBuYW1lICovCit9OworCitzdHJ1Y3QgcGt0X3ByZXEgeworICAgICAgICBzdHJ1Y3QgUGFnZUlEICBwcF9wYWdlOworICAgICAgICB1X2ludDMyX3QgIHBwX2xvdzsKKyAgICAgICAgdV9pbnQzMl90ICBwcF9oaWdoOworfTsKKworc3RydWN0IHBrdF9wcmVwIHsKKyAgICAgICAgdV9pbnQzMl90ICBwcF9uOyAgICAgICAgICAgLyogc2l6ZSBvZiBwYWdlaWQgYXJyYXkgKi8KKyAgICAgICAgLyogcGdzdGF0ZSdzIGZvbGxvdyAqLworfTsKKworc3RhdGljIGludAord2JfaWQoY29uc3Qgc3RydWN0IHBrdF9pZCAqaWQsIHVfaW50IGxlbikKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpjcDsKKwljb25zdCBzdHJ1Y3QgaWRfb2ZmICppbzsKKwljaGFyIGM7CisJaW50IG5pZDsKKworCXByaW50ZigiIHdiLWlkOiIpOworCWlmIChsZW4gPCBzaXplb2YoKmlkKSB8fCAodV9jaGFyICopKGlkICsgMSkgPiBzbmFwZW5kKQorCQlyZXR1cm4gKC0xKTsKKwlsZW4gLT0gc2l6ZW9mKCppZCk7CisKKwlwcmludGYoIiAldS8lczoldSAobWF4ICV1LyVzOiV1KSAiLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmaWQtPnBpX3BzLnNsb3QpLAorCSAgICAgICBpcGFkZHJfc3RyaW5nKCZpZC0+cGlfcHMucGFnZS5wX3NpZCksCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZpZC0+cGlfcHMucGFnZS5wX3VpZCksCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZpZC0+cGlfbXNsb3QpLAorCSAgICAgICBpcGFkZHJfc3RyaW5nKCZpZC0+cGlfbXBhZ2UucF9zaWQpLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmaWQtPnBpX21wYWdlLnBfdWlkKSk7CisKKwluaWQgPSBFWFRSQUNUXzE2QklUUygmaWQtPnBpX3BzLm5pZCk7CisJbGVuIC09IHNpemVvZigqaW8pICogbmlkOworCWlvID0gKHN0cnVjdCBpZF9vZmYgKikoaWQgKyAxKTsKKwljcCA9IChjaGFyICopKGlvICsgbmlkKTsKKwlpZiAoKHVfY2hhciAqKWNwICsgbGVuIDw9IHNuYXBlbmQpIHsKKwkJcHV0Y2hhcignIicpOworCQkodm9pZClmbl9wcmludCgodV9jaGFyICopY3AsICh1X2NoYXIgKiljcCArIGxlbik7CisJCXB1dGNoYXIoJyInKTsKKwl9CisKKwljID0gJzwnOworCWZvciAoaSA9IDA7IGkgPCBuaWQgJiYgKHVfY2hhciAqKShpbyArIDEpIDw9IHNuYXBlbmQ7ICsraW8sICsraSkgeworCQlwcmludGYoIiVjJXM6JXUiLAorCQkgICAgYywgaXBhZGRyX3N0cmluZygmaW8tPmlkKSwgRVhUUkFDVF8zMkJJVFMoJmlvLT5vZmYpKTsKKwkJYyA9ICcsJzsKKwl9CisJaWYgKGkgPj0gbmlkKSB7CisJCXByaW50ZigiPiIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAord2JfcnJlcShjb25zdCBzdHJ1Y3QgcGt0X3JyZXEgKnJyZXEsIHVfaW50IGxlbikKK3sKKwlwcmludGYoIiB3Yi1ycmVxOiIpOworCWlmIChsZW4gPCBzaXplb2YoKnJyZXEpIHx8ICh1X2NoYXIgKikocnJlcSArIDEpID4gc25hcGVuZCkKKwkJcmV0dXJuICgtMSk7CisKKwlwcmludGYoIiBwbGVhc2UgcmVwYWlyICVzICVzOiV1PCV1OiV1PiIsCisJICAgICAgIGlwYWRkcl9zdHJpbmcoJnJyZXEtPnByX2lkKSwKKwkgICAgICAgaXBhZGRyX3N0cmluZygmcnJlcS0+cHJfcGFnZS5wX3NpZCksCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZycmVxLT5wcl9wYWdlLnBfdWlkKSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnJyZXEtPnByX3NzZXEpLAorCSAgICAgICBFWFRSQUNUXzMyQklUUygmcnJlcS0+cHJfZXNlcSkpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3diX3ByZXEoY29uc3Qgc3RydWN0IHBrdF9wcmVxICpwcmVxLCB1X2ludCBsZW4pCit7CisJcHJpbnRmKCIgd2ItcHJlcToiKTsKKwlpZiAobGVuIDwgc2l6ZW9mKCpwcmVxKSB8fCAodV9jaGFyICopKHByZXEgKyAxKSA+IHNuYXBlbmQpCisJCXJldHVybiAoLTEpOworCisJcHJpbnRmKCIgbmVlZCAldS8lczoldSIsCisJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZwcmVxLT5wcF9sb3cpLAorCSAgICAgICBpcGFkZHJfc3RyaW5nKCZwcmVxLT5wcF9wYWdlLnBfc2lkKSwKKwkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnByZXEtPnBwX3BhZ2UucF91aWQpKTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit3Yl9wcmVwKGNvbnN0IHN0cnVjdCBwa3RfcHJlcCAqcHJlcCwgdV9pbnQgbGVuKQoreworCWludCBuOworCWNvbnN0IHN0cnVjdCBwZ3N0YXRlICpwczsKKwljb25zdCB1X2NoYXIgKmVwID0gc25hcGVuZDsKKworCXByaW50ZigiIHdiLXByZXA6Iik7CisJaWYgKGxlbiA8IHNpemVvZigqcHJlcCkpIHsKKwkJcmV0dXJuICgtMSk7CisJfQorCW4gPSBFWFRSQUNUXzMyQklUUygmcHJlcC0+cHBfbik7CisJcHMgPSAoY29uc3Qgc3RydWN0IHBnc3RhdGUgKikocHJlcCArIDEpOworCXdoaWxlICgtLW4gPj0gMCAmJiAodV9jaGFyICopKHBzICsgMSkgPD0gZXApIHsKKwkJY29uc3Qgc3RydWN0IGlkX29mZiAqaW8sICppZTsKKwkJY2hhciBjID0gJzwnOworCisJCXByaW50ZigiICV1LyVzOiV1IiwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZwcy0+c2xvdCksCisJCSAgICBpcGFkZHJfc3RyaW5nKCZwcy0+cGFnZS5wX3NpZCksCisJCSAgICBFWFRSQUNUXzMyQklUUygmcHMtPnBhZ2UucF91aWQpKTsKKwkJaW8gPSAoc3RydWN0IGlkX29mZiAqKShwcyArIDEpOworCQlmb3IgKGllID0gaW8gKyBwcy0+bmlkOyBpbyA8IGllICYmICh1X2NoYXIgKikoaW8gKyAxKSA8PSBlcDsgKytpbykgeworCQkJcHJpbnRmKCIlYyVzOiV1IiwgYywgaXBhZGRyX3N0cmluZygmaW8tPmlkKSwKKwkJCSAgICBFWFRSQUNUXzMyQklUUygmaW8tPm9mZikpOworCQkJYyA9ICcsJzsKKwkJfQorCQlwcmludGYoIj4iKTsKKwkJcHMgPSAoc3RydWN0IHBnc3RhdGUgKilpbzsKKwl9CisJcmV0dXJuICgodV9jaGFyICopcHMgPD0gZXA/IDAgOiAtMSk7Cit9CisKKworY29uc3QgY2hhciAqZG9wc3RyW10gPSB7CisJImRvcC0wISIsCisJImRvcC0xISIsCisJIlJFQ1QiLAorCSJMSU5FIiwKKwkiTUwiLAorCSJERUwiLAorCSJYRk9STSIsCisJIkVMTCIsCisJIkNIQVIiLAorCSJTVFIiLAorCSJOT1AiLAorCSJQU0NPREUiLAorCSJQU0NPTVAiLAorCSJSRUYiLAorCSJTS0lQIiwKKwkiSE9MRSIsCit9OworCitzdGF0aWMgaW50Cit3Yl9kb3BzKGNvbnN0IHN0cnVjdCBkb3BoZHIgKmRoLCB1X2ludDMyX3Qgc3MsIHVfaW50MzJfdCBlcykKK3sKKwlwcmludGYoIiA8Iik7CisJZm9yICggOyBzcyA8PSBlczsgKytzcykgeworCQlyZWdpc3RlciBpbnQgdCA9IGRoLT5kaF90eXBlOworCisJCWlmICh0ID4gRFRfTUFYVFlQRSkKKwkJCXByaW50ZigiIGRvcC0lZCEiLCB0KTsKKwkJZWxzZSB7CisJCQlwcmludGYoIiAlcyIsIGRvcHN0clt0XSk7CisJCQlpZiAodCA9PSBEVF9TS0lQIHx8IHQgPT0gRFRfSE9MRSkgeworCQkJCXVfaW50MzJfdCB0cyA9IEVYVFJBQ1RfMzJCSVRTKCZkaC0+ZGhfdHMpOworCQkJCXByaW50ZigiJWQiLCB0cyAtIHNzICsgMSk7CisJCQkJaWYgKHNzID4gdHMgfHwgdHMgPiBlcykgeworCQkJCQlwcmludGYoIlt8XSIpOworCQkJCQlpZiAodHMgPCBzcykKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJCXNzID0gdHM7CisJCQl9CisJCX0KKwkJZGggPSBET1BfTkVYVChkaCk7CisJCWlmICgodV9jaGFyICopZGggPiBzbmFwZW5kKSB7CisJCQlwcmludGYoIlt8d2JdIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcmludGYoIiA+Iik7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2JfcnJlcChjb25zdCBzdHJ1Y3QgcGt0X3JyZXAgKnJyZXAsIHVfaW50IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgcGt0X2RvcCAqZG9wID0gJnJyZXAtPnByX2RvcDsKKworCXByaW50ZigiIHdiLXJyZXA6Iik7CisJaWYgKGxlbiA8IHNpemVvZigqcnJlcCkgfHwgKHVfY2hhciAqKShycmVwICsgMSkgPiBzbmFwZW5kKQorCQlyZXR1cm4gKC0xKTsKKwlsZW4gLT0gc2l6ZW9mKCpycmVwKTsKKworCXByaW50ZigiIGZvciAlcyAlczoldTwldToldT4iLAorCSAgICBpcGFkZHJfc3RyaW5nKCZycmVwLT5wcl9pZCksCisJICAgIGlwYWRkcl9zdHJpbmcoJmRvcC0+cGRfcGFnZS5wX3NpZCksCisJICAgIEVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX3BhZ2UucF91aWQpLAorCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9zc2VxKSwKKwkgICAgRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfZXNlcSkpOworCisJaWYgKHZmbGFnKQorCQlyZXR1cm4gKHdiX2RvcHMoKGNvbnN0IHN0cnVjdCBkb3BoZHIgKikoZG9wICsgMSksCisJCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9zc2VxKSwKKwkJICAgIEVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX2VzZXEpKSk7CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2JfZHJhd29wKGNvbnN0IHN0cnVjdCBwa3RfZG9wICpkb3AsIHVfaW50IGxlbikKK3sKKwlwcmludGYoIiB3Yi1kb3A6Iik7CisJaWYgKGxlbiA8IHNpemVvZigqZG9wKSB8fCAodV9jaGFyICopKGRvcCArIDEpID4gc25hcGVuZCkKKwkJcmV0dXJuICgtMSk7CisJbGVuIC09IHNpemVvZigqZG9wKTsKKworCXByaW50ZigiICVzOiV1PCV1OiV1PiIsCisJICAgIGlwYWRkcl9zdHJpbmcoJmRvcC0+cGRfcGFnZS5wX3NpZCksCisJICAgIEVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX3BhZ2UucF91aWQpLAorCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9zc2VxKSwKKwkgICAgRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfZXNlcSkpOworCisJaWYgKHZmbGFnKQorCQlyZXR1cm4gKHdiX2RvcHMoKGNvbnN0IHN0cnVjdCBkb3BoZHIgKikoZG9wICsgMSksCisJCQkJRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfc3NlcSksCisJCQkJRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfZXNlcSkpKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogUHJpbnQgd2hpdGVib2FyZCBtdWx0aWNhc3QgcGFja2V0cy4KKyAqLwordm9pZAord2JfcHJpbnQocmVnaXN0ZXIgY29uc3Qgdm9pZCAqaGRyLCByZWdpc3RlciB1X2ludCBsZW4pCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHBrdF9oZHIgKnBoOworCisJcGggPSAoY29uc3Qgc3RydWN0IHBrdF9oZHIgKiloZHI7CisJaWYgKGxlbiA8IHNpemVvZigqcGgpIHx8ICh1X2NoYXIgKikocGggKyAxKSA+IHNuYXBlbmQpIHsKKwkJcHJpbnRmKCJbfHdiXSIpOworCQlyZXR1cm47CisJfQorCWxlbiAtPSBzaXplb2YoKnBoKTsKKworCWlmIChwaC0+cGhfZmxhZ3MpCisJCXByaW50ZigiKiIpOworCXN3aXRjaCAocGgtPnBoX3R5cGUpIHsKKworCWNhc2UgUFRfS0lMTDoKKwkJcHJpbnRmKCIgd2Ita2lsbCIpOworCQlyZXR1cm47CisKKwljYXNlIFBUX0lEOgorCQlpZiAod2JfaWQoKHN0cnVjdCBwa3RfaWQgKikocGggKyAxKSwgbGVuKSA+PSAwKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgUFRfUlJFUToKKwkJaWYgKHdiX3JyZXEoKHN0cnVjdCBwa3RfcnJlcSAqKShwaCArIDEpLCBsZW4pID49IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBQVF9SUkVQOgorCQlpZiAod2JfcnJlcCgoc3RydWN0IHBrdF9ycmVwICopKHBoICsgMSksIGxlbikgPj0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwljYXNlIFBUX0RSQVdPUDoKKwkJaWYgKHdiX2RyYXdvcCgoc3RydWN0IHBrdF9kb3AgKikocGggKyAxKSwgbGVuKSA+PSAwKQorCQkJcmV0dXJuOworCQlicmVhazsKKworCWNhc2UgUFRfUFJFUToKKwkJaWYgKHdiX3ByZXEoKHN0cnVjdCBwa3RfcHJlcSAqKShwaCArIDEpLCBsZW4pID49IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCisJY2FzZSBQVF9QUkVQOgorCQlpZiAod2JfcHJlcCgoc3RydWN0IHBrdF9wcmVwICopKHBoICsgMSksIGxlbikgPj0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIiB3Yi0lZCEiLCBwaC0+cGhfdHlwZSk7CisJCXJldHVybjsKKwl9Cit9CmRpZmYgLS1naXQgYS9wcmludC16ZXBoeXIuYyBiL3ByaW50LXplcGh5ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGZhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludC16ZXBoeXIuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIERlY29kZSBhbmQgcHJpbnQgWmVwaHlyIHBhY2tldHMuCisgKgorICoJaHR0cDovL3dlYi5taXQuZWR1L3plcGh5ci9kb2MvcHJvdG9jb2wKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTmlja29sYWkgWmVsZG92aWNoIDxrb2x5YUBNSVQuRURVPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKKyAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAorICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KKyAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yKHMpIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC16ZXBoeXIuYyx2IDEuOC4yLjEgMjAwNS8wNC8yMSAwNjo1MToyNCBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKK3N0cnVjdCB6X3BhY2tldCB7CisgICAgY2hhciAqdmVyc2lvbjsKKyAgICBpbnQgbnVtZmllbGRzOworICAgIGludCBraW5kOworICAgIGNoYXIgKnVpZDsKKyAgICBpbnQgcG9ydDsKKyAgICBpbnQgYXV0aDsKKyAgICBpbnQgYXV0aGxlbjsKKyAgICBjaGFyICphdXRoZGF0YTsKKyAgICBjaGFyICpjbGFzczsKKyAgICBjaGFyICppbnN0OworICAgIGNoYXIgKm9wY29kZTsKKyAgICBjaGFyICpzZW5kZXI7CisgICAgY29uc3QgY2hhciAqcmVjaXBpZW50OworICAgIGNoYXIgKmZvcm1hdDsKKyAgICBpbnQgY2tzdW07CisgICAgaW50IG11bHRpOworICAgIGNoYXIgKm11bHRpX3VpZDsKKyAgICAvKiBPdGhlciBmaWVsZHMgZm9sbG93IGhlcmUuLiAqLworfTsKKworZW51bSB6X3BhY2tldF90eXBlIHsKKyAgICBaX1BBQ0tFVF9VTlNBRkUgPSAwLAorICAgIFpfUEFDS0VUX1VOQUNLRUQsCisgICAgWl9QQUNLRVRfQUNLRUQsCisgICAgWl9QQUNLRVRfSE1BQ0ssCisgICAgWl9QQUNLRVRfSE1DVEwsCisgICAgWl9QQUNLRVRfU0VSVkFDSywKKyAgICBaX1BBQ0tFVF9TRVJWTkFLLAorICAgIFpfUEFDS0VUX0NMSUVOVEFDSywKKyAgICBaX1BBQ0tFVF9TVEFUCit9OworCitzdGF0aWMgc3RydWN0IHRvayB6X3R5cGVzW10gPSB7CisgICAgeyBaX1BBQ0tFVF9VTlNBRkUsCQkidW5zYWZlIiB9LAorICAgIHsgWl9QQUNLRVRfVU5BQ0tFRCwJCSJ1bmFja2VkIiB9LAorICAgIHsgWl9QQUNLRVRfQUNLRUQsCQkiYWNrZWQiIH0sCisgICAgeyBaX1BBQ0tFVF9ITUFDSywJCSJobS1hY2siIH0sCisgICAgeyBaX1BBQ0tFVF9ITUNUTCwJCSJobS1jdGwiIH0sCisgICAgeyBaX1BBQ0tFVF9TRVJWQUNLLAkJInNlcnYtYWNrIiB9LAorICAgIHsgWl9QQUNLRVRfU0VSVk5BSywJCSJzZXJ2LW5hayIgfSwKKyAgICB7IFpfUEFDS0VUX0NMSUVOVEFDSywJImNsaWVudC1hY2siIH0sCisgICAgeyBaX1BBQ0tFVF9TVEFULAkJInN0YXQiIH0KK307CisKK2NoYXIgel9idWZbMjU2XTsKKworc3RhdGljIGNoYXIgKgorcGFyc2VfZmllbGQoY2hhciAqKnBwdHIsIGludCAqbGVuKQoreworICAgIGNoYXIgKnM7CisKKyAgICBpZiAoKmxlbiA8PSAwIHx8ICFwcHRyIHx8ICEqcHB0cikKKwlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKnBwdHIgPiAoY2hhciAqKSBzbmFwZW5kKQorCXJldHVybiBOVUxMOworCisgICAgcyA9ICpwcHRyOworICAgIHdoaWxlICgqcHB0ciA8PSAoY2hhciAqKSBzbmFwZW5kICYmICpsZW4gPj0gMCAmJiAqKnBwdHIpIHsKKwkoKnBwdHIpKys7CisJKCpsZW4pLS07CisgICAgfQorICAgICgqcHB0cikrKzsKKyAgICAoKmxlbiktLTsKKyAgICBpZiAoKmxlbiA8IDAgfHwgKnBwdHIgPiAoY2hhciAqKSBzbmFwZW5kKQorCXJldHVybiBOVUxMOworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCit6X3RyaXBsZShjaGFyICpjbGFzcywgY2hhciAqaW5zdCwgY29uc3QgY2hhciAqcmVjaXBpZW50KQoreworICAgIGlmICghKnJlY2lwaWVudCkKKwlyZWNpcGllbnQgPSAiKiI7CisgICAgc25wcmludGYoel9idWYsIHNpemVvZih6X2J1ZiksICI8JXMsJXMsJXM+IiwgY2xhc3MsIGluc3QsIHJlY2lwaWVudCk7CisgICAgel9idWZbc2l6ZW9mKHpfYnVmKS0xXSA9ICdcMCc7CisgICAgcmV0dXJuIHpfYnVmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitzdHJfdG9fbG93ZXIoY2hhciAqc3RyaW5nKQoreworICAgIHN0cm5jcHkoel9idWYsIHN0cmluZywgc2l6ZW9mKHpfYnVmKSk7CisgICAgel9idWZbc2l6ZW9mKHpfYnVmKS0xXSA9ICdcMCc7CisKKyAgICBzdHJpbmcgPSB6X2J1ZjsKKyAgICB3aGlsZSAoKnN0cmluZykgeworCSpzdHJpbmcgPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSgqc3RyaW5nKSk7CisJc3RyaW5nKys7CisgICAgfQorCisgICAgcmV0dXJuIHpfYnVmOworfQorCit2b2lkCit6ZXBoeXJfcHJpbnQoY29uc3QgdV9jaGFyICpjcCwgaW50IGxlbmd0aCkKK3sKKyAgICBzdHJ1Y3Qgel9wYWNrZXQgejsKKyAgICBjaGFyICpwYXJzZSA9IChjaGFyICopIGNwOworICAgIGludCBwYXJzZWxlbiA9IGxlbmd0aDsKKyAgICBjaGFyICpzOworICAgIGludCBsb3NlID0gMDsKKworI2RlZmluZSBQQVJTRV9TVFJJTkcJCQkJXAorCXMgPSBwYXJzZV9maWVsZCgmcGFyc2UsICZwYXJzZWxlbik7CVwKKwlpZiAoIXMpIGxvc2UgPSAxOworCisjZGVmaW5lIFBBUlNFX0ZJRUxEX0lOVChmaWVsZCkJCQlcCisJUEFSU0VfU1RSSU5HCQkJCVwKKwlpZiAoIWxvc2UpIGZpZWxkID0gc3RydG9sKHMsIDAsIDE2KTsKKworI2RlZmluZSBQQVJTRV9GSUVMRF9TVFIoZmllbGQpCQkJXAorCVBBUlNFX1NUUklORwkJCQlcCisJaWYgKCFsb3NlKSBmaWVsZCA9IHM7CisKKyAgICBQQVJTRV9GSUVMRF9TVFIoei52ZXJzaW9uKTsKKyAgICBpZiAobG9zZSkgcmV0dXJuOworICAgIGlmIChzdHJuY21wKHoudmVyc2lvbiwgIlpFUEgiLCA0KSkKKwlyZXR1cm47CisKKyAgICBQQVJTRV9GSUVMRF9JTlQoei5udW1maWVsZHMpOworICAgIFBBUlNFX0ZJRUxEX0lOVCh6LmtpbmQpOworICAgIFBBUlNFX0ZJRUxEX1NUUih6LnVpZCk7CisgICAgUEFSU0VfRklFTERfSU5UKHoucG9ydCk7CisgICAgUEFSU0VfRklFTERfSU5UKHouYXV0aCk7CisgICAgUEFSU0VfRklFTERfSU5UKHouYXV0aGxlbik7CisgICAgUEFSU0VfRklFTERfU1RSKHouYXV0aGRhdGEpOworICAgIFBBUlNFX0ZJRUxEX1NUUih6LmNsYXNzKTsKKyAgICBQQVJTRV9GSUVMRF9TVFIoei5pbnN0KTsKKyAgICBQQVJTRV9GSUVMRF9TVFIoei5vcGNvZGUpOworICAgIFBBUlNFX0ZJRUxEX1NUUih6LnNlbmRlcik7CisgICAgUEFSU0VfRklFTERfU1RSKHoucmVjaXBpZW50KTsKKyAgICBQQVJTRV9GSUVMRF9TVFIoei5mb3JtYXQpOworICAgIFBBUlNFX0ZJRUxEX0lOVCh6LmNrc3VtKTsKKyAgICBQQVJTRV9GSUVMRF9JTlQoei5tdWx0aSk7CisgICAgUEFSU0VfRklFTERfU1RSKHoubXVsdGlfdWlkKTsKKworICAgIGlmIChsb3NlKSB7CisJcHJpbnRmKCIgW3x6ZXBoeXJdICglZCkiLCBsZW5ndGgpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIiB6ZXBoeXIiKTsKKyAgICBpZiAoc3RybmNtcCh6LnZlcnNpb24rNCwgIjAuMiIsIDMpKSB7CisJcHJpbnRmKCIgdiVzIiwgei52ZXJzaW9uKzQpOworCXJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIiAlcyIsIHRvazJzdHIoel90eXBlcywgInR5cGUgJWQiLCB6LmtpbmQpKTsKKyAgICBpZiAoei5raW5kID09IFpfUEFDS0VUX1NFUlZBQ0spIHsKKwkvKiBJbml0aWFsaXphdGlvbiB0byBzaWxlbmNlIHdhcm5pbmdzICovCisJY2hhciAqYWNrZGF0YSA9IE5VTEw7CisJUEFSU0VfRklFTERfU1RSKGFja2RhdGEpOworCWlmICghbG9zZSAmJiBzdHJjbXAoYWNrZGF0YSwgIlNFTlQiKSkKKwkgICAgcHJpbnRmKCIvJXMiLCBzdHJfdG9fbG93ZXIoYWNrZGF0YSkpOworICAgIH0KKyAgICBpZiAoKnouc2VuZGVyKSBwcmludGYoIiAlcyIsIHouc2VuZGVyKTsKKworICAgIGlmICghc3RyY21wKHouY2xhc3MsICJVU0VSX0xPQ0FURSIpKSB7CisJaWYgKCFzdHJjbXAoei5vcGNvZGUsICJVU0VSX0hJREUiKSkKKwkgICAgcHJpbnRmKCIgaGlkZSIpOworCWVsc2UgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJVU0VSX1VOSElERSIpKQorCSAgICBwcmludGYoIiB1bmhpZGUiKTsKKwllbHNlCisJICAgIHByaW50ZigiIGxvY2F0ZSAlcyIsIHouaW5zdCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3RyY21wKHouY2xhc3MsICJaRVBIWVJfQURNSU4iKSkgeworCXByaW50ZigiIHplcGh5ci1hZG1pbiAlcyIsIHN0cl90b19sb3dlcih6Lm9wY29kZSkpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcCh6LmNsYXNzLCAiWkVQSFlSX0NUTCIpKSB7CisJaWYgKCFzdHJjbXAoei5pbnN0LCAiQ0xJRU5UIikpIHsKKwkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJTVUJTQ1JJQkUiKSB8fAorCQkhc3RyY21wKHoub3Bjb2RlLCAiU1VCU0NSSUJFX05PREVGUyIpIHx8CisJCSFzdHJjbXAoei5vcGNvZGUsICJVTlNVQlNDUklCRSIpKSB7CisKKwkJcHJpbnRmKCIgJXNzdWIlcyIsIHN0cmNtcCh6Lm9wY29kZSwgIlNVQlNDUklCRSIpID8gInVuIiA6ICIiLAorCQkJCSAgIHN0cmNtcCh6Lm9wY29kZSwgIlNVQlNDUklCRV9OT0RFRlMiKSA/ICIiIDoKKwkJCQkJCQkJICAgIi1ub2RlZnMiKTsKKwkJaWYgKHoua2luZCAhPSBaX1BBQ0tFVF9TRVJWQUNLKSB7CisJCSAgICAvKiBJbml0aWFsaXphdGlvbiB0byBzaWxlbmNlIHdhcm5pbmdzICovCisJCSAgICBjaGFyICpjID0gTlVMTCwgKmkgPSBOVUxMLCAqciA9IE5VTEw7CisJCSAgICBQQVJTRV9GSUVMRF9TVFIoYyk7CisJCSAgICBQQVJTRV9GSUVMRF9TVFIoaSk7CisJCSAgICBQQVJTRV9GSUVMRF9TVFIocik7CisJCSAgICBpZiAoIWxvc2UpIHByaW50ZigiICVzIiwgel90cmlwbGUoYywgaSwgcikpOworCQl9CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIGlmICghc3RyY21wKHoub3Bjb2RlLCAiR0lNTUUiKSkgeworCQlwcmludGYoIiByZXQiKTsKKwkJcmV0dXJuOworCSAgICB9CisKKwkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJHSU1NRURFRlMiKSkgeworCQlwcmludGYoIiBnaW1tZS1kZWZzIik7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIGlmICghc3RyY21wKHoub3Bjb2RlLCAiQ0xFQVJTVUIiKSkgeworCQlwcmludGYoIiBjbGVhci1zdWJzIik7CisJCXJldHVybjsKKwkgICAgfQorCisJICAgIHByaW50ZigiICVzIiwgc3RyX3RvX2xvd2VyKHoub3Bjb2RlKSk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoIXN0cmNtcCh6Lmluc3QsICJITSIpKSB7CisJICAgIHByaW50ZigiICVzIiwgc3RyX3RvX2xvd2VyKHoub3Bjb2RlKSk7CisJICAgIHJldHVybjsKKwl9CisKKwlpZiAoIXN0cmNtcCh6Lmluc3QsICJSRUFMTSIpKSB7CisJICAgIGlmICghc3RyY21wKHoub3Bjb2RlLCAiQUREX1NVQlNDUklCRSIpKQorCQlwcmludGYoIiByZWFsbSBhZGQtc3VicyIpOworCSAgICBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlJFUV9TVUJTQ1JJQkUiKSkKKwkJcHJpbnRmKCIgcmVhbG0gcmVxLXN1YnMiKTsKKwkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJSTE1fU1VCU0NSSUJFIikpCisJCXByaW50ZigiIHJlYWxtIHJsbS1zdWIiKTsKKwkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJSTE1fVU5TVUJTQ1JJQkUiKSkKKwkJcHJpbnRmKCIgcmVhbG0gcmxtLXVuc3ViIik7CisJICAgIHJldHVybjsKKwl9CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoei5jbGFzcywgIkhNX0NUTCIpKSB7CisJcHJpbnRmKCIgaG1fY3RsICVzIiwgc3RyX3RvX2xvd2VyKHouaW5zdCkpOworCXByaW50ZigiICVzIiwgc3RyX3RvX2xvd2VyKHoub3Bjb2RlKSk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3RyY21wKHouY2xhc3MsICJITV9TVEFUIikpIHsKKwlpZiAoIXN0cmNtcCh6Lmluc3QsICJITVNUX0NMSUVOVCIpICYmICFzdHJjbXAoei5vcGNvZGUsICJHSU1NRVNUQVRTIikpIHsKKwkgICAgcHJpbnRmKCIgZ2V0LWNsaWVudC1zdGF0cyIpOworCSAgICByZXR1cm47CisJfQorICAgIH0KKworICAgIGlmICghc3RyY21wKHouY2xhc3MsICJXR19DVEwiKSkgeworCXByaW50ZigiIHdnX2N0bCAlcyIsIHN0cl90b19sb3dlcih6Lmluc3QpKTsKKwlwcmludGYoIiAlcyIsIHN0cl90b19sb3dlcih6Lm9wY29kZSkpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcCh6LmNsYXNzLCAiTE9HSU4iKSkgeworCWlmICghc3RyY21wKHoub3Bjb2RlLCAiVVNFUl9GTFVTSCIpKSB7CisJICAgIHByaW50ZigiIGZsdXNoX2xvY3MiKTsKKwkgICAgcmV0dXJuOworCX0KKworCWlmICghc3RyY21wKHoub3Bjb2RlLCAiTk9ORSIpIHx8CisJICAgICFzdHJjbXAoei5vcGNvZGUsICJPUFNUQUZGIikgfHwKKwkgICAgIXN0cmNtcCh6Lm9wY29kZSwgIlJFQUxNLVZJU0lCTEUiKSB8fAorCSAgICAhc3RyY21wKHoub3Bjb2RlLCAiUkVBTE0tQU5OT1VOQ0VEIikgfHwKKwkgICAgIXN0cmNtcCh6Lm9wY29kZSwgIk5FVC1WSVNJQkxFIikgfHwKKwkgICAgIXN0cmNtcCh6Lm9wY29kZSwgIk5FVC1BTk5PVU5DRUQiKSkgeworCSAgICBwcmludGYoIiBzZXQtZXhwb3N1cmUgJXMiLCBzdHJfdG9fbG93ZXIoei5vcGNvZGUpKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICBpZiAoISp6LnJlY2lwaWVudCkKKwl6LnJlY2lwaWVudCA9ICIqIjsKKworICAgIHByaW50ZigiIHRvICVzIiwgel90cmlwbGUoei5jbGFzcywgei5pbnN0LCB6LnJlY2lwaWVudCkpOworICAgIGlmICgqei5vcGNvZGUpCisJcHJpbnRmKCIgb3AgJXMiLCB6Lm9wY29kZSk7CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvcm91dGU2ZC5oIGIvcm91dGU2ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9yb3V0ZTZkLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBhbmQgMTk5OCBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworLyoKKyAqICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3JvdXRlNmQuaCx2IDEuNSAyMDAyLzEyLzExIDA3OjE0OjEwIGd1eSBFeHAgJAorICovCisKKyNkZWZpbmUJUklQNl9WRVJTSU9OCTEKKworI2RlZmluZQlSSVA2X1JFUVVFU1QJMQorI2RlZmluZQlSSVA2X1JFU1BPTlNFCTIKKworc3RydWN0IG5ldGluZm82IHsKKwlzdHJ1Y3QgaW42X2FkZHIJcmlwNl9kZXN0OworCXVfaW50MTZfdAlyaXA2X3RhZzsKKwl1X2ludDhfdAlyaXA2X3BsZW47CisJdV9pbnQ4X3QJcmlwNl9tZXRyaWM7Cit9OworCitzdHJ1Y3QJcmlwNiB7CisJdV9pbnQ4X3QJcmlwNl9jbWQ7CisJdV9pbnQ4X3QJcmlwNl92ZXJzOworCXVfaW50OF90CXJpcDZfcmVzMVsyXTsKKwl1bmlvbiB7CisJCXN0cnVjdAluZXRpbmZvNglydTZfbmV0c1sxXTsKKwkJY2hhcglydTZfdHJhY2VmaWxlWzFdOworCX0gcmlwNnVuOworI2RlZmluZQlyaXA2X25ldHMJcmlwNnVuLnJ1Nl9uZXRzCisjZGVmaW5lCXJpcDZfdHJhY2VmaWxlCXJpcDZ1bi5ydTZfdHJhY2VmaWxlCit9OworCisjZGVmaW5lCUhPUENOVF9JTkZJTklUWTYJMTYKKyNkZWZpbmUJTUFYUlRFCQkJMjQKKyNkZWZpbmUJTkVYVEhPUF9NRVRSSUMJCTB4ZmYKKworI2lmbmRlZglERUJVRworI2RlZmluZQlTVVBQTFlfSU5URVJWQUw2CTMwCisjZGVmaW5lCVJJUF9MSUZFVElNRQkJMTgwCisjZGVmaW5lCVJJUF9IT0xERE9XTgkJMTIwCisjZGVmaW5lCVJJUF9UUklHX0lOVEVSVkFMNgk1CisjZGVmaW5lCVJJUF9UUklHX0lOVEVSVkFMNl9NSU4JMQorI2Vsc2UKKy8qIG9ubHkgZm9yIGRlYnVnZ2luZzsgY2FuIG5vdCB3YWl0IGZvciAzMHNlYyB0byBhcHBlYXIgYSBidWcgKi8KKyNkZWZpbmUJU1VQUExZX0lOVEVSVkFMNgkxMAorI2RlZmluZQlSSVBfTElGRVRJTUUJCTYwCisjZGVmaW5lCVJJUF9IT0xERE9XTgkJNDAKKyNkZWZpbmUJUklQX1RSSUdfSU5URVJWQUw2CTUKKyNkZWZpbmUJUklQX1RSSUdfSU5URVJWQUw2X01JTgkxCisjZW5kaWYKKworI2RlZmluZQlSSVA2X1BPUlQJCTUyMQorI2RlZmluZQlSSVA2X0RFU1QJCSJmZjAyOjo5IgpkaWZmIC0tZ2l0IGEvcnBjX2F1dGguaCBiL3JwY19hdXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkNDI3ZQotLS0gL2Rldi9udWxsCisrKyBiL3JwY19hdXRoLmgKQEAgLTAsMCArMSw3OSBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ycGNfYXV0aC5oLHYgMS4xLjIuMSAyMDA1LzA0LzI3IDIxOjQ0OjA3IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIFN1biBSUEMgaXMgYSBwcm9kdWN0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYW5kIGlzIHByb3ZpZGVkIGZvcgorICogdW5yZXN0cmljdGVkIHVzZSBwcm92aWRlZCB0aGF0IHRoaXMgbGVnZW5kIGlzIGluY2x1ZGVkIG9uIGFsbCB0YXBlCisgKiBtZWRpYSBhbmQgYXMgYSBwYXJ0IG9mIHRoZSBzb2Z0d2FyZSBwcm9ncmFtIGluIHdob2xlIG9yIHBhcnQuICBVc2VycworICogbWF5IGNvcHkgb3IgbW9kaWZ5IFN1biBSUEMgd2l0aG91dCBjaGFyZ2UsIGJ1dCBhcmUgbm90IGF1dGhvcml6ZWQKKyAqIHRvIGxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSBpdCB0byBhbnlvbmUgZWxzZSBleGNlcHQgYXMgcGFydCBvZiBhIHByb2R1Y3Qgb3IKKyAqIHByb2dyYW0gZGV2ZWxvcGVkIGJ5IHRoZSB1c2VyLgorICoKKyAqIFNVTiBSUEMgSVMgUFJPVklERUQgQVMgSVMgV0lUSCBOTyBXQVJSQU5USUVTIE9GIEFOWSBLSU5EIElOQ0xVRElORyBUSEUKKyAqIFdBUlJBTlRJRVMgT0YgREVTSUdOLCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSwgT1IgQVJJU0lORyBGUk9NIEEgQ09VUlNFIE9GIERFQUxJTkcsIFVTQUdFIE9SIFRSQURFIFBSQUNUSUNFLgorICoKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICoKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4gU0hBTEwgSEFWRSBOTyBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRQorICogSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVFMsIFRSQURFIFNFQ1JFVFMgT1IgQU5ZIFBBVEVOVFMgQlkgU1VOIFJQQworICogT1IgQU5ZIFBBUlQgVEhFUkVPRi4KKyAqCisgKiBJbiBubyBldmVudCB3aWxsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYmUgbGlhYmxlIGZvciBhbnkgbG9zdCByZXZlbnVlCisgKiBvciBwcm9maXRzIG9yIG90aGVyIHNwZWNpYWwsIGluZGlyZWN0IGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIGV2ZW4gaWYKKyAqIFN1biBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKgorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICoKKyAqCWZyb206IEAoIylhdXRoLmggMS4xNyA4OC8wMi8wOCBTTUkKKyAqCWZyb206IEAoIylhdXRoLmgJMi4zIDg4LzA4LzA3IDQuMCBSUENTUkMKKyAqICRGcmVlQlNEOiBzcmMvaW5jbHVkZS9ycGMvYXV0aC5oLHYgMS4xNC4yLjEgMTk5OS8wOC8yOSAxNDozOTowMiBwZXRlciBFeHAgJAorICovCisKKy8qCisgKiBhdXRoLmgsIEF1dGhlbnRpY2F0aW9uIGludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb21wbGV0ZWx5IG9wYXF1ZSB0byB0aGUgY2xpZW50LiAgVGhlIGNsaWVudAorICogaXMgcmVxdWlyZWQgdG8gcGFzcyBhIEFVVEggKiB0byByb3V0aW5lcyB0aGF0IGNyZWF0ZSBycGMKKyAqICJzZXNzaW9ucyIuCisgKi8KKworLyoKKyAqIFN0YXR1cyByZXR1cm5lZCBmcm9tIGF1dGhlbnRpY2F0aW9uIGNoZWNrCisgKi8KK2VudW0gc3VucnBjX2F1dGhfc3RhdCB7CisJU1VOUlBDX0FVVEhfT0s9MCwKKwkvKgorCSAqIGZhaWxlZCBhdCByZW1vdGUgZW5kCisJICovCisJU1VOUlBDX0FVVEhfQkFEQ1JFRD0xLAkJLyogYm9ndXMgY3JlZGVudGlhbHMgKHNlYWwgYnJva2VuKSAqLworCVNVTlJQQ19BVVRIX1JFSkVDVEVEQ1JFRD0yLAkvKiBjbGllbnQgc2hvdWxkIGJlZ2luIG5ldyBzZXNzaW9uICovCisJU1VOUlBDX0FVVEhfQkFEVkVSRj0zLAkJLyogYm9ndXMgdmVyaWZpZXIgKHNlYWwgYnJva2VuKSAqLworCVNVTlJQQ19BVVRIX1JFSkVDVEVEVkVSRj00LAkvKiB2ZXJpZmllciBleHBpcmVkIG9yIHdhcyByZXBsYXllZCAqLworCVNVTlJQQ19BVVRIX1RPT1dFQUs9NSwJCS8qIHJlamVjdGVkIGR1ZSB0byBzZWN1cml0eSByZWFzb25zICovCisJLyoKKwkgKiBmYWlsZWQgbG9jYWxseQorCSovCisJU1VOUlBDX0FVVEhfSU5WQUxJRFJFU1A9NiwJLyogYm9ndXMgcmVzcG9uc2UgdmVyaWZpZXIgKi8KKwlTVU5SUENfQVVUSF9GQUlMRUQ9NwkJLyogc29tZSB1bmtub3duIHJlYXNvbiAqLworfTsKKworLyoKKyAqIEF1dGhlbnRpY2F0aW9uIGluZm8uICBPcGFxdWUgdG8gY2xpZW50LgorICovCitzdHJ1Y3Qgc3VucnBjX29wYXF1ZV9hdXRoIHsKKwl1X2ludDMyX3Qgb2FfZmxhdm9yOwkJLyogZmxhdm9yIG9mIGF1dGggKi8KKwl1X2ludDMyX3Qgb2FfbGVuOwkJLyogbGVuZ3RoIG9mIG9wYXF1ZSBib2R5ICovCisJLyogemVybyBvciBtb3JlIGJ5dGVzIG9mIGJvZHkgKi8KK307CisKKyNkZWZpbmUgU1VOUlBDX0FVVEhfTk9ORQkwCS8qIG5vIGF1dGhlbnRpY2F0aW9uICovCisjZGVmaW5lCVNVTlJQQ19BVVRIX05VTEwJMAkvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lCVNVTlJQQ19BVVRIX1VOSVgJMQkvKiB1bml4IHN0eWxlICh1aWQsIGdpZHMpICovCisjZGVmaW5lCVNVTlJQQ19BVVRIX1NZUwkJMQkvKiBmb3J3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUJU1VOUlBDX0FVVEhfU0hPUlQJMgkvKiBzaG9ydCBoYW5kIHVuaXggc3R5bGUgKi8KKyNkZWZpbmUgU1VOUlBDX0FVVEhfREVTCQkzCS8qIGRlcyBzdHlsZSAoZW5jcnlwdGVkIHRpbWVzdGFtcHMpICovCmRpZmYgLS1naXQgYS9ycGNfbXNnLmggYi9ycGNfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmM2M0MgotLS0gL2Rldi9udWxsCisrKyBiL3JwY19tc2cuaApAQCAtMCwwICsxLDEyOCBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ycGNfbXNnLmgsdiAxLjEuMi4xIDIwMDUvMDQvMjcgMjE6NDQ6MDcgZ3V5IEV4cCAkIChMQkwpICovCisvKgorICogU3VuIFJQQyBpcyBhIHByb2R1Y3Qgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBhbmQgaXMgcHJvdmlkZWQgZm9yCisgKiB1bnJlc3RyaWN0ZWQgdXNlIHByb3ZpZGVkIHRoYXQgdGhpcyBsZWdlbmQgaXMgaW5jbHVkZWQgb24gYWxsIHRhcGUKKyAqIG1lZGlhIGFuZCBhcyBhIHBhcnQgb2YgdGhlIHNvZnR3YXJlIHByb2dyYW0gaW4gd2hvbGUgb3IgcGFydC4gIFVzZXJzCisgKiBtYXkgY29weSBvciBtb2RpZnkgU3VuIFJQQyB3aXRob3V0IGNoYXJnZSwgYnV0IGFyZSBub3QgYXV0aG9yaXplZAorICogdG8gbGljZW5zZSBvciBkaXN0cmlidXRlIGl0IHRvIGFueW9uZSBlbHNlIGV4Y2VwdCBhcyBwYXJ0IG9mIGEgcHJvZHVjdCBvcgorICogcHJvZ3JhbSBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisgKgorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKgorICogU3VuIFJQQyBpcyBwcm92aWRlZCB3aXRoIG5vIHN1cHBvcnQgYW5kIHdpdGhvdXQgYW55IG9ibGlnYXRpb24gb24gdGhlCisgKiBwYXJ0IG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gdG8gYXNzaXN0IGluIGl0cyB1c2UsIGNvcnJlY3Rpb24sCisgKiBtb2RpZmljYXRpb24gb3IgZW5oYW5jZW1lbnQuCisgKgorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiBTSEFMTCBIQVZFIE5PIExJQUJJTElUWSBXSVRIIFJFU1BFQ1QgVE8gVEhFCisgKiBJTkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hUUywgVFJBREUgU0VDUkVUUyBPUiBBTlkgUEFURU5UUyBCWSBTVU4gUlBDCisgKiBPUiBBTlkgUEFSVCBUSEVSRU9GLgorICoKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqCisgKiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiAyNTUwIEdhcmNpYSBBdmVudWUKKyAqIE1vdW50YWluIFZpZXcsIENhbGlmb3JuaWEgIDk0MDQzCisgKgorICoJZnJvbTogQCgjKXJwY19tc2cuaCAxLjcgODYvMDcvMTYgU01JCisgKglmcm9tOiBAKCMpcnBjX21zZy5oCTIuMSA4OC8wNy8yOSA0LjAgUlBDU1JDCisgKiAkRnJlZUJTRDogc3JjL2luY2x1ZGUvcnBjL3JwY19tc2cuaCx2IDEuMTEuMi4xIDE5OTkvMDgvMjkgMTQ6Mzk6MDcgcGV0ZXIgRXhwICQKKyAqLworCisvKgorICogcnBjX21zZy5oCisgKiBycGMgbWVzc2FnZSBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKi8KKworI2RlZmluZSBTVU5SUENfTVNHX1ZFUlNJT04JKCh1X2ludDMyX3QpIDIpCisKKy8qCisgKiBCb3R0b20gdXAgZGVmaW5pdGlvbiBvZiBhbiBycGMgbWVzc2FnZS4KKyAqIE5PVEU6IGNhbGwgYW5kIHJlcGx5IHVzZSB0aGUgc2FtZSBvdmVyYWxsIHN0dWN0IGJ1dAorICogZGlmZmVyZW50IHBhcnRzIG9mIHVuaW9ucyB3aXRoaW4gaXQuCisgKi8KKworZW51bSBzdW5ycGNfbXNnX3R5cGUgeworCVNVTlJQQ19DQUxMPTAsCisJU1VOUlBDX1JFUExZPTEKK307CisKK2VudW0gc3VucnBjX3JlcGx5X3N0YXQgeworCVNVTlJQQ19NU0dfQUNDRVBURUQ9MCwKKwlTVU5SUENfTVNHX0RFTklFRD0xCit9OworCitlbnVtIHN1bnJwY19hY2NlcHRfc3RhdCB7CisJU1VOUlBDX1NVQ0NFU1M9MCwKKwlTVU5SUENfUFJPR19VTkFWQUlMPTEsCisJU1VOUlBDX1BST0dfTUlTTUFUQ0g9MiwKKwlTVU5SUENfUFJPQ19VTkFWQUlMPTMsCisJU1VOUlBDX0dBUkJBR0VfQVJHUz00LAorCVNVTlJQQ19TWVNURU1fRVJSPTUKK307CisKK2VudW0gc3VucnBjX3JlamVjdF9zdGF0IHsKKwlTVU5SUENfUlBDX01JU01BVENIPTAsCisJU1VOUlBDX0FVVEhfRVJST1I9MQorfTsKKworLyoKKyAqIFJlcGx5IHBhcnQgb2YgYW4gcnBjIGV4Y2hhbmdlCisgKi8KKworLyoKKyAqIFJlcGx5IHRvIGFuIHJwYyByZXF1ZXN0IHRoYXQgd2FzIHJlamVjdGVkIGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK3N0cnVjdCBzdW5ycGNfcmVqZWN0ZWRfcmVwbHkgeworCXVfaW50MzJfdAkJIHJqX3N0YXQ7CS8qIGVudW0gcmVqZWN0X3N0YXQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1X2ludDMyX3QgbG93OworCQkJdV9pbnQzMl90IGhpZ2g7CisJCX0gUkpfdmVyc2lvbnM7CisJCXVfaW50MzJfdCBSSl93aHk7ICAvKiBlbnVtIGF1dGhfc3RhdCAtIHdoeSBhdXRoZW50aWNhdGlvbiBkaWQgbm90IHdvcmsgKi8KKwl9IHJ1OworI2RlZmluZQlyal92ZXJzCXJ1LlJKX3ZlcnNpb25zCisjZGVmaW5lCXJqX3doeQlydS5SSl93aHkKK307CisKKy8qCisgKiBCb2R5IG9mIGEgcmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QuCisgKi8KK3N0cnVjdCBzdW5ycGNfcmVwbHlfYm9keSB7CisJdV9pbnQzMl90CXJwX3N0YXQ7CQkvKiBlbnVtIHJlcGx5X3N0YXQgKi8KKwlzdHJ1Y3Qgc3VucnBjX3JlamVjdGVkX3JlcGx5IHJwX3JlamVjdDsJLyogaWYgcmVqZWN0ZWQgKi8KK307CisKKy8qCisgKiBCb2R5IG9mIGFuIHJwYyByZXF1ZXN0IGNhbGwuCisgKi8KK3N0cnVjdCBzdW5ycGNfY2FsbF9ib2R5IHsKKwl1X2ludDMyX3QgY2JfcnBjdmVyczsJLyogbXVzdCBiZSBlcXVhbCB0byB0d28gKi8KKwl1X2ludDMyX3QgY2JfcHJvZzsKKwl1X2ludDMyX3QgY2JfdmVyczsKKwl1X2ludDMyX3QgY2JfcHJvYzsKKwlzdHJ1Y3Qgc3VucnBjX29wYXF1ZV9hdXRoIGNiX2NyZWQ7CisJLyogZm9sbG93ZWQgYnkgb3BhcXVlIHZlcmlmaWVyICovCit9OworCisvKgorICogVGhlIHJwYyBtZXNzYWdlCisgKi8KK3N0cnVjdCBzdW5ycGNfbXNnIHsKKwl1X2ludDMyX3QJCXJtX3hpZDsKKwl1X2ludDMyX3QJCXJtX2RpcmVjdGlvbjsJLyogZW51bSBtc2dfdHlwZSAqLworCXVuaW9uIHsKKwkJc3RydWN0IHN1bnJwY19jYWxsX2JvZHkgUk1fY21iOworCQlzdHJ1Y3Qgc3VucnBjX3JlcGx5X2JvZHkgUk1fcm1iOworCX0gcnU7CisjZGVmaW5lCXJtX2NhbGwJCXJ1LlJNX2NtYgorI2RlZmluZQlybV9yZXBseQlydS5STV9ybWIKK307CisjZGVmaW5lCWFjcHRlZF9ycGx5CXJ1LlJNX3JtYi5ydS5SUF9hcgorI2RlZmluZQlyamN0ZWRfcnBseQlydS5STV9ybWIucnUuUlBfZHIKZGlmZiAtLWdpdCBhL3J4LmggYi9yeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTJlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yeC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0OiAoYykgMjAwMCBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCisgKglTZWNyZXRhcnkgb2YgdGhlIE5hdnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKy8qCisgKiBSeCBwcm90b2NvbCBmb3JtYXQKKyAqCisgKiAkSWQ6IHJ4LmgsdiAxLjggMjAwMi8xMi8xMSAwNzoxNDoxMSBndXkgRXhwICQKKyAqLworCisjZGVmaW5lIEZTX1JYX1BPUlQJNzAwMAorI2RlZmluZSBDQl9SWF9QT1JUCTcwMDEKKyNkZWZpbmUgUFJPVF9SWF9QT1JUCTcwMDIKKyNkZWZpbmUgVkxEQl9SWF9QT1JUCTcwMDMKKyNkZWZpbmUgS0FVVEhfUlhfUE9SVAk3MDA0CisjZGVmaW5lIFZPTF9SWF9QT1JUCTcwMDUKKyNkZWZpbmUgRVJST1JfUlhfUE9SVAk3MDA2CQkvKiBEb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCAqLworI2RlZmluZSBCT1NfUlhfUE9SVAk3MDA3CisKKyNpZm5kZWYgQUZTTkFNRU1BWAorI2RlZmluZSBBRlNOQU1FTUFYIDI1NgorI2VuZGlmCisKKyNpZm5kZWYgQUZTT1BBUVVFTUFYCisjZGVmaW5lIEFGU09QQVFVRU1BWCAxMDI0CisjZW5kaWYKKworI2RlZmluZSBQUk5BTUVNQVggNjQKKyNkZWZpbmUgVkxOQU1FTUFYIDY1CisjZGVmaW5lIEtBTkFNRU1BWCA2NAorI2RlZmluZSBCT1NOQU1FTUFYIDI1NgorCisjZGVmaW5lCVBSU0ZTX1JFQUQJCTEgLyogUmVhZCBmaWxlcyAqLworI2RlZmluZQlQUlNGU19XUklURQkJMiAvKiBXcml0ZSBmaWxlcyAqLworI2RlZmluZQlQUlNGU19JTlNFUlQJCTQgLyogSW5zZXJ0IGZpbGVzIGludG8gYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUJUFJTRlNfTE9PS1VQCQk4IC8qIExvb2t1cCBmaWxlcyBpbnRvIGEgZGlyZWN0b3J5ICovCisjZGVmaW5lCVBSU0ZTX0RFTEVURQkJMTYgLyogRGVsZXRlIGZpbGVzICovCisjZGVmaW5lCVBSU0ZTX0xPQ0sJCTMyIC8qIExvY2sgZmlsZXMgKi8KKyNkZWZpbmUJUFJTRlNfQURNSU5JU1RFUgk2NCAvKiBDaGFuZ2UgQUNMJ3MgKi8KKworc3RydWN0IHJ4X2hlYWRlciB7CisJdV9pbnQzMl90IGVwb2NoOworCXVfaW50MzJfdCBjaWQ7CisJdV9pbnQzMl90IGNhbGxOdW1iZXI7CisJdV9pbnQzMl90IHNlcTsKKwl1X2ludDMyX3Qgc2VyaWFsOworCXVfaW50OF90IHR5cGU7CisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0RBVEEJCTEKKyNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUNLCQkyCisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0JVU1kJCTMKKyNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUJPUlQJCTQKKyNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUNLQUxMCQk1CisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0NIQUxMRU5HRQk2CisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX1JFU1BPTlNFCQk3CisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0RFQlVHCQk4CisjZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX1BBUkFNUwkJOQorI2RlZmluZSBSWF9QQUNLRVRfVFlQRV9WRVJTSU9OCQkxMworCXVfaW50OF90IGZsYWdzOworI2RlZmluZSBSWF9DTElFTlRfSU5JVElBVEVECTEKKyNkZWZpbmUgUlhfUkVRVUVTVF9BQ0sJCTIKKyNkZWZpbmUgUlhfTEFTVF9QQUNLRVQJCTQKKyNkZWZpbmUgUlhfTU9SRV9QQUNLRVRTCQk4CisjZGVmaW5lIFJYX0ZSRUVfUEFDS0VUCQkxNgorI2RlZmluZSBSWF9TTE9XX1NUQVJUX09LCTMyCisjZGVmaW5lIFJYX0pVTUJPX1BBQ0tFVAkJMzIKKwl1X2ludDhfdCB1c2VyU3RhdHVzOworCXVfaW50OF90IHNlY3VyaXR5SW5kZXg7CisJdV9pbnQxNl90IHNwYXJlOwkJLyogSG93IGNsZXZlcjogZXZlbiB0aG91Z2ggdGhlIEFGUyAqLworCXVfaW50MTZfdCBzZXJ2aWNlSWQ7CQkvKiBoZWFkZXIgZmlsZXMgaW5kaWNhdGUgdGhhdCB0aGUgKi8KK307CQkJCQkvKiBzZXJ2aWNlSWQgaXMgZmlyc3QsIGl0J3MgcmVhbGx5ICovCisJCQkJCS8qIGVuY29kZWQgX2FmdGVyXyB0aGUgc3BhcmUgZmllbGQgKi8KKwkJCQkJLyogSSB3YXN0ZWQgYSBkYXkgZmlndXJpbmcgdGhhdCBvdXQhICovCisKKyNkZWZpbmUgTlVNX1JYX0ZMQUdTIDcKKworI2RlZmluZSBSWF9NQVhBQ0tTIDI1NQorCitzdHJ1Y3QgcnhfYWNrUGFja2V0IHsKKwl1X2ludDE2X3QgYnVmZmVyU3BhY2U7CQkvKiBOdW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCisJdV9pbnQxNl90IG1heFNrZXc7CQkvKiBNYXggZGlmZiBiZXR3ZWVuIGFjaydkIHBhY2tldCBhbmQgKi8KKwkJCQkJLyogaGlnaGVzdCBwYWNrZXQgcmVjZWl2ZWQgKi8KKwl1X2ludDMyX3QgZmlyc3RQYWNrZXQ7CQkvKiBUaGUgZmlyc3QgcGFja2V0IGluIGFjayBsaXN0ICovCisJdV9pbnQzMl90IHByZXZpb3VzUGFja2V0OwkvKiBQcmV2aW91cyBwYWNrZXQgcmVjdidkIChvYnNvbGV0ZSkgKi8KKwl1X2ludDMyX3Qgc2VyaWFsOwkJLyogIyBvZiBwYWNrZXQgdGhhdCBwcm9tcHRlZCB0aGUgYWNrICovCisJdV9pbnQ4X3QgcmVhc29uOwkJLyogUmVhc29uIGZvciBhY2tub3dsZWRnZW1lbnQgKi8KKwl1X2ludDhfdCBuQWNrczsJCQkvKiBOdW1iZXIgb2YgYWNrbm93bGVkZ2VtZW50cyAqLworCXVfaW50OF90IGFja3NbUlhfTUFYQUNLU107CS8qIFVwIHRvIFJYX01BWEFDS1MgYWNrbm93bGVkZ2VtZW50cyAqLworfTsKKworLyoKKyAqIFZhbHVlcyBmb3IgdGhlIGFja3MgYXJyYXkKKyAqLworCisjZGVmaW5lIFJYX0FDS19UWVBFX05BQ0sJMAkvKiBEb24ndCBoYXZlIHRoaXMgcGFja2V0ICovCisjZGVmaW5lIFJYX0FDS19UWVBFX0FDSwkJMQkvKiBJIGhhdmUgdGhpcyBwYWNrZXQgKi8KZGlmZiAtLWdpdCBhL3NjdHBDb25zdGFudHMuaCBiL3NjdHBDb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAyMjZiCi0tLSAvZGV2L251bGwKKysrIGIvc2N0cENvbnN0YW50cy5oCkBAIC0wLDAgKzEsNTcxIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NjdHBDb25zdGFudHMuaCx2IDEuNCAyMDAzLzA2LzAzIDIzOjQ5OjIzIGd1eSBFeHAgJCAoTEJMKSAqLworCisvKiBTQ1RQIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBDb3B5cmlnaHQgKEMpIDE5OTkgQ2lzY28gQW5kIE1vdG9yb2xhCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIENpc2NvIG5vciBvZiBNb3Rvcm9sYSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgZW1haWwKKyAqIGFkZHJlc3NlczoKKyAqCisgKiByc3Rld2FyMUBlbWFpbC5tb3QuY29tCisgKiBrbW9ybmVhdUBjaXNjby5jb20KKyAqIHF4aWUxQGVtYWlsLm1vdC5jb20KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBlcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworCisjaWZuZGVmIF9fc2N0cENvbnN0YW50c19oX18KKyNkZWZpbmUgX19zY3RwQ29uc3RhbnRzX2hfXworCisKKyAgLyogSWYgeW91IHdpc2ggdG8gdXNlIE1ENSBpbnN0ZWFkIG9mIFNMQSB1bmNvbW1lbnQgdGhlIGxpbmUKKyAgICogYmVsb3cuIFdoeSB5b3Ugd291bGQgbGlrZSB0byBkbyB0aGlzOgorICAgKiBhKSBUaGVyZSBtYXkgYmUgSVBSIG9uIFNIQS0xLCBvciBzbyB0aGUgRklQLTE4MC0xIHBhZ2Ugc2F5cywKKyAgICogYikgTUQ1IGlzIDMgdGltZXMgZmFzdGVyIChoYXMgY29kZWQgaGVyZSkuCisgICAqCisgICAqIFRoZSBkaXNhZHZhbnRhZ2UgaXMsIGl0IGlzIHRob3VnaHQgdGhhdCBNRDUgaGFzIGJlZW4KKyAgICogY3JhY2tlZC4uLiBzZWUgUkZDMjEwNC4KKyAgICovCisvKiNkZWZpbmUgVVNFX01ENSAxKi8KKworLyogdGhlIFNDVFAgcHJvdG9jb2wgc2lnbmF0dXJlCisgKiB0aGlzIGluY2x1ZGVzIHRoZSB2ZXJzaW9uIG51bWJlcgorICogZW5jb2RlZCBpbiB0aGUgbGFzdCA0IGJpdHMgb2YgdGhlCisgKiBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgUFJPVE9fU0lHTkFUVVJFX0EgMHgzMDAwMDAwMAorCisjZGVmaW5lIFNDVFBfVkVSU0lPTl9OVU1CRVIgMHgzCisKKyNkZWZpbmUgTUFYX1RTTiAweGZmZmZmZmZmCisjZGVmaW5lIE1BWF9TRVEgMHhmZmZmCisKKy8qIG9wdGlvbjoKKyAqIElmIHlvdSBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIHlvdSB3aWxsCisgKiByZWNlaXZlIHRoZSBvbGQgYmVoYXZpb3Igb2Ygb2JleWluZyBjd25kIGZvcgorICogdGhlIGZhc3QgcmV0cmFuc21pdCBhbGdvcml0aG0uIFdpdGggdGhpcyBkZWZpbmVkCisgKiBhIEZSIGhhcHBlbnMgcmlnaHQgYXdheSB3aXRoLW91dCB3YWl0aW5nIGZvciB0aGUKKyAqIGZsaWdodHNpemUgdG8gZHJvcCBiZWxvdyB0aGUgY3duZCB2YWx1ZSAod2hpY2gKKyAqIGlzIHJlZHVjZWQgYnkgdGhlIEZSIHRvIDEvMiB0aGUgaW5mbGlnaHQgcGFja2V0cykuCisgKi8KKyNkZWZpbmUgU0NUUF9JR05PUkVfQ1dORF9PTl9GUiAxCisvKiBkZWZhdWx0IG1heCBJIGNhbiBidXJzdCBvdXQgYWZ0ZXIgYSBmYXN0IHJldHJhbnNtaXQgKi8KKyNkZWZpbmUgU0NUUF9ERUZfTUFYX0JVUlNUIDQKKworLyogUGFja2V0IHRyYW5zbWl0IHN0YXRlcyBpbiB0aGUgc2VudAorICogZmllbGQgaW4gdGhlIFNDVFBfdHJhbnNtaXRPblF1ZXVlIHN0cnVjdAorICovCisjZGVmaW5lIFNDVFBfREFUQUdSQU1fVU5TRU5UIAkJMAorI2RlZmluZSBTQ1RQX0RBVEFHUkFNX1NFTlQgICAJCTEKKyNkZWZpbmUgU0NUUF9EQVRBR1JBTV9SRVNFTkQxCQkyIC8qIG5vdCB1c2VkICovCisjZGVmaW5lIFNDVFBfREFUQUdSQU1fUkVTRU5EMgkJMyAvKiBub3QgdXNlZCAqLworI2RlZmluZSBTQ1RQX0RBVEFHUkFNX1JFU0VORDMJCTQgLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgU0NUUF9EQVRBR1JBTV9SRVNFTkQJCTUKKyNkZWZpbmUgU0NUUF9EQVRBR1JBTV9BQ0tFRAkJMTAwMTAKKyNkZWZpbmUgU0NUUF9EQVRBR1JBTV9JTkJPVU5ECQkxMDAxMQorI2RlZmluZSBTQ1RQX1JFQURZX1RPX1RSQU5TTUlUCQkxMDAxMgorI2RlZmluZSBTQ1RQX0RBVEFHUkFNX01BUktFRAkJMjAwMTAKKworI2RlZmluZSBNQVhfRlNJRCA2NAkvKiBkZWJ1ZyA1IGludHMgdXNlZCBmb3IgY2MgZHluYW1pYyB0cmFja2luZyAqLworCisvKiBUaGUgdmFsaWQgZGVmaW5lcyBmb3IgYWxsIG1lc3NhZ2UKKyAqIHR5cGVzIGtub3cgdG8gU0NUUC4gMCBpcyByZXNlcnZlZAorICovCisjZGVmaW5lIFNDVFBfTVNHVFlQRV9NQVNLCTB4ZmYKKworI2RlZmluZSBTQ1RQX0RBVEEJCTB4MDAKKyNkZWZpbmUgU0NUUF9JTklUSUFUSU9OCQkweDAxCisjZGVmaW5lIFNDVFBfSU5JVElBVElPTl9BQ0sJMHgwMgorI2RlZmluZSBTQ1RQX1NFTEVDVElWRV9BQ0sJMHgwMworI2RlZmluZSBTQ1RQX0hFQVJUQkVBVF9SRVFVRVNUCTB4MDQKKyNkZWZpbmUgU0NUUF9IRUFSVEJFQVRfQUNLCTB4MDUKKyNkZWZpbmUgU0NUUF9BQk9SVF9BU1NPQ0lBVElPTgkweDA2CisjZGVmaW5lIFNDVFBfU0hVVERPV04JCTB4MDcKKyNkZWZpbmUgU0NUUF9TSFVURE9XTl9BQ0sJMHgwOAorI2RlZmluZSBTQ1RQX09QRVJBVElPTl9FUlIJMHgwOQorI2RlZmluZSBTQ1RQX0NPT0tJRV9FQ0hPCTB4MGEKKyNkZWZpbmUgU0NUUF9DT09LSUVfQUNLICAgICAgICAgMHgwYgorI2RlZmluZSBTQ1RQX0VDTl9FQ0hPCQkweDBjCisjZGVmaW5lIFNDVFBfRUNOX0NXUgkJMHgwZAorI2RlZmluZSBTQ1RQX1NIVVRET1dOX0NPTVBMRVRFCTB4MGUKKyNkZWZpbmUgU0NUUF9GT1JXQVJEX0NVTV9UU04gICAgMHhjMAorI2RlZmluZSBTQ1RQX1JFTElBQkxFX0NOVEwgICAgICAweGMxCisjZGVmaW5lIFNDVFBfUkVMSUFCTEVfQ05UTF9BQ0sgIDB4YzIKKworLyogQUJPUlQgYW5kIFNIVVRET1dOIENPTVBMRVRFIEZMQUcgKi8KKyNkZWZpbmUgU0NUUF9IQURfTk9fVENCCQkweDAxCisKKy8qIERhdGEgQ2h1Y2sgU3BlY2lmaWMgRmxhZ3MgKi8KKyNkZWZpbmUgU0NUUF9EQVRBX0ZSQUdfTUFTSwkweDAzCisjZGVmaW5lIFNDVFBfREFUQV9NSURETEVfRlJBRwkweDAwCisjZGVmaW5lIFNDVFBfREFUQV9MQVNUX0ZSQUcJMHgwMQorI2RlZmluZSBTQ1RQX0RBVEFfRklSU1RfRlJBRwkweDAyCisjZGVmaW5lIFNDVFBfREFUQV9OT1RfRlJBRwkweDAzCisjZGVmaW5lIFNDVFBfREFUQV9VTk9SREVSRUQJMHgwNAorCisjZGVmaW5lIFNDVFBfQ1JDX0VOQUJMRV9CSVQJMHgwMQkvKiBsb3dlciBiaXQgb2YgcmVzZXJ2ZWQgKi8KKworI2RlZmluZSBpc1NDVFBDb250cm9sKGEpIChhLT5jaHVua0lEICE9IFNDVFBfREFUQSkKKyNkZWZpbmUgaXNTQ1RQRGF0YShhKSAoYS0+Y2h1bmtJRCA9PSBTQ1RQX0RBVEEpCisKKy8qIHNjdHAgcGFyYW1ldGVyIHR5cGVzIGZvciBpbml0L2luaXQtYWNrICovCisKKyNkZWZpbmUgU0NUUF9JUFY0X1BBUkFNX1RZUEUgICAgMHgwMDA1CisjZGVmaW5lIFNDVFBfSVBWNl9QQVJBTV9UWVBFICAgIDB4MDAwNgorI2RlZmluZSBTQ1RQX1JFU1BPTkRFUl9DT09LSUUgICAweDAwMDcKKyNkZWZpbmUgU0NUUF9VTlJFQ09HX1BBUkFNCTB4MDAwOAorI2RlZmluZSBTQ1RQX0NPT0tJRV9QUkVTRVJWRSAgICAweDAwMDkKKyNkZWZpbmUgU0NUUF9IT1NUTkFNRV9WSUFfRE5TICAgMHgwMDBiCisjZGVmaW5lIFNDVFBfUkVTVFJJQ1RfQUREUl9UTwkweDAwMGMKKworI2RlZmluZSBTQ1RQX0VDTl9JX0NBTl9ET19FQ04JMHg4MDAwCisjZGVmaW5lIFNDVFBfT1BFUkFUSU9OX1NVQ0NFRUQJMHg0MDAxCisjZGVmaW5lIFNDVFBfRVJST1JfTk9UX0VYRUNVVEVECTB4NDAwMgorCisjZGVmaW5lIFNDVFBfVU5SRUxJQUJMRV9TVFJNICAgIDB4YzAwMAorI2RlZmluZSBTQ1RQX0FERF9JUF9BRERSRVNTICAgICAweGMwMDEKKyNkZWZpbmUgU0NUUF9ERUxfSVBfQUREUkVTUyAgICAgMHhjMDAyCisjZGVmaW5lIFNDVFBfU1RSTV9GTE9XX0xJTUlUICAgIDB4YzAwMworI2RlZmluZSBTQ1RQX1BBUlRJQUxfQ1NVTSAgICAgICAweGMwMDQKKyNkZWZpbmUgU0NUUF9FUlJPUl9DQVVTRV9UTFYJMHhjMDA1CisjZGVmaW5lIFNDVFBfTUlUX1NUQUNLX05BTUUJMHhjMDA2CisjZGVmaW5lIFNDVFBfU0VUQUREUkVTU19QUklNQVJZIDB4YzAwNworCisvKiBiaXRzIGZvciBUT1MgZmllbGQgKi8KKyNkZWZpbmUgU0NUUF9FQ1RfQklUCQkweDAyCisjZGVmaW5lIFNDVFBfQ0VfQklUCQkweDAxCisKKy8qIGVycm9yIGNvZGVzICovCisjZGVmaW5lIFNDVFBfT1BfRVJST1JfTk9fRVJST1IJCTB4MDAwMAorI2RlZmluZSBTQ1RQX09QX0VSUk9SX0lOVl9TVFJNCQkweDAwMDEKKyNkZWZpbmUgU0NUUF9PUF9FUlJPUl9NSVNTX1BBUkFNCTB4MDAwMgorI2RlZmluZSBTQ1RQX09QX0VSUk9SX1NUQUxFX0NPT0tJRQkweDAwMDMKKyNkZWZpbmUgU0NUUF9PUF9FUlJPUl9OT19SRVNPVVJDRSAJMHgwMDA0CisjZGVmaW5lIFNDVFBfT1BfRVJST1JfRE5TX0ZBSUxFRCAgIAkweDAwMDUKKyNkZWZpbmUgU0NUUF9PUF9FUlJPUl9VTktfQ0hVTksJICAgCTB4MDAwNgorI2RlZmluZSBTQ1RQX09QX0VSUk9SX0lOVl9QQVJBTQkJMHgwMDA3CisjZGVmaW5lIFNDVFBfT1BfRVJST1JfVU5LX1BBUkFNCSAgICAgICAJMHgwMDA4CisjZGVmaW5lIFNDVFBfT1BfRVJST1JfTk9fVVNFUkQgICAgCTB4MDAwOQorI2RlZmluZSBTQ1RQX09QX0VSUk9SX0NPT0tJRV9TSFVUCTB4MDAwYQorI2RlZmluZSBTQ1RQX09QX0VSUk9SX0RFTEVURV9MQVNUCTB4MDAwYgorI2RlZmluZSBTQ1RQX09QX0VSUk9SX1JFU09VUkNFX1NIT1JUIAkweDAwMGMKKworI2RlZmluZSBTQ1RQX01BWF9FUlJPUl9DQVVTRSAgMTIKKworLyogZW1wdHkgZXJyb3IgY2F1c2VzIGkuZS4gbm90aGluZyBidXQgdGhlIGNhdXNlCisgKiBhcmUgU0NUUF9PUF9FUlJPUl9OT19SRVNPVVJDRSwgU0NUUF9PUF9FUlJPUl9JTlZfUEFSQU0sCisgKiBTQ1RQX09QX0VSUk9SX0NPT0tJRV9TSFVULgorICovCisKKy8qIHBhcmFtZXRlciBmb3IgSGVhcnQgQmVhdCAqLworI2RlZmluZSBIRUFSVF9CRUFUX1BBUkFNIDB4MDAwMQorCisKKworLyogc2VuZCBvcHRpb25zIGZvciBTQ1RQCisgKi8KKyNkZWZpbmUgU0NUUF9PUkRFUkVEX0RFTElWRVJZCQkweDAxCisjZGVmaW5lIFNDVFBfTk9OX09SREVSRURfREVMSVZFUlkJMHgwMgorI2RlZmluZSBTQ1RQX0RPX0NSQzE2CQkJMHgwOAorI2RlZmluZSBTQ1RQX01ZX0FERFJFU1NfT05MWQkJMHgxMAorCisvKiBiZWxvdyB0dXJucyBvZmYgYWJvdmUgKi8KKyNkZWZpbmUgU0NUUF9GTEVYSUJMRV9BRERSRVNTCQkweDIwCisjZGVmaW5lIFNDVFBfTk9fSEVBUlRCRUFUCQkweDQwCisKKy8qIG1hc2sgdG8gZ2V0IHN0aWNreSAqLworI2RlZmluZSBTQ1RQX1NUSUNLWV9PUFRJT05TX01BU0sgICAgICAgIDB4MGMKKworLyogTVRVIGRpc2NvdmVyeSBmbGFncyAqLworI2RlZmluZSBTQ1RQX0RPTlRfRlJBR01FTlQJCTB4MDEwMAorI2RlZmluZSBTQ1RQX0ZSQUdNRU5UX09LCQkweDAyMDAKKworCisvKiBTQ1RQIHN0YXRlIGRlZmluZXMgZm9yIGludGVybmFsIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgU0NUUF9TVEFURV9FTVBUWQkJMHgwMDAwCisjZGVmaW5lIFNDVFBfU1RBVEVfSU5VU0UJCTB4MDAwMQorI2RlZmluZSBTQ1RQX1NUQVRFX0NPT0tJRV9XQUlUCQkweDAwMDIKKyNkZWZpbmUgU0NUUF9TVEFURV9DT09LSUVfU0VOVAkJMHgwMDA0CisjZGVmaW5lIFNDVFBfU1RBVEVfT1BFTgkJCTB4MDAwOAorI2RlZmluZSBTQ1RQX1NUQVRFX1NIVVRET1dOCQkweDAwMTAKKyNkZWZpbmUgU0NUUF9TVEFURV9TSFVURE9XTl9SRUNWCTB4MDAyMAorI2RlZmluZSBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UCTB4MDA0MAorI2RlZmluZSBTQ1RQX1NUQVRFX1NIVVRET1dOX1BFTkQJMHgwMDgwCisjZGVmaW5lIFNDVFBfU1RBVEVfTUFTSwkJCTB4MDA3ZgorLyogU0NUUCByZWFjaGFiaWxpdHkgc3RhdGUgZm9yIGVhY2ggYWRkcmVzcyAqLworI2RlZmluZSBTQ1RQX0FERFJfTk9UX1JFQUNIQUJMRQkJMQorI2RlZmluZSBTQ1RQX0FERFJfUkVBQ0hBQkxFCQkyCisjZGVmaW5lIFNDVFBfQUREUl9OT0hCCQkJNAorI2RlZmluZSBTQ1RQX0FERFJfQkVJTkdfREVMRVRFRAkJOAorCisvKiBIb3cgbG9uZyBhIGNvb2tpZSBsaXZlcyAqLworI2RlZmluZSBTQ1RQX0RFRkFVTFRfQ09PS0lFX0xJRkUgNjAgLyogc2Vjb25kcyAqLworCisvKiByZXNvdXJjZSBsaW1pdCBvZiBzdHJlYW1zICovCisjZGVmaW5lIE1BWF9TQ1RQX1NUUkVBTVMgMjA0OAorCisKKy8qIGd1ZXNzIGF0IGhvdyBiaWcgdG8gbWFrZSB0aGUgVFNOIG1hcHBpbmcgYXJyYXkgKi8KKyNkZWZpbmUgU0NUUF9TVEFSVElOR19NQVBBUlJBWSAxMDAwMAorCisvKiBIZXJlIHdlIGRlZmluZSB0aGUgdGltZXIgdHlwZXMgdXNlZAorICogYnkgdGhlIGltcGxlbWVudGF0aW9uIGhhcworICogYXJndW1lbnRzIGluIHRoZSBzZXQvZ2V0IHRpbWVyIHR5cGUgY2FsbHMuCisgKi8KKyNkZWZpbmUgU0NUUF9USU1FUl9JTklUIAkwCisjZGVmaW5lIFNDVFBfVElNRVJfUkVDViAJMQorI2RlZmluZSBTQ1RQX1RJTUVSX1NFTkQgCTIKKyNkZWZpbmUgU0NUUF9USU1FUl9TSFVURE9XTgkzCisjZGVmaW5lIFNDVFBfVElNRVJfSEVBUlRCRUFUCTQKKyNkZWZpbmUgU0NUUF9USU1FUl9QTVRVCQk1CisvKiBudW1iZXIgb2YgdGltZXIgdHlwZXMgaW4gdGhlIGJhc2UgU0NUUAorICogc3RydWN0dXJlIHVzZWQgaW4gdGhlIHNldC9nZXQgYW5kIGhhcworICogdGhlIGJhc2UgZGVmYXVsdC4KKyAqLworI2RlZmluZSBTQ1RQX05VTV9UTVJTIDYKKworCisKKyNkZWZpbmUgU0NUUF9JUFY0X0FERFJFU1MJMgorI2RlZmluZSBTQ1RQX0lQVjZfQUREUkVTUwk0CisKKy8qIHRpbWVyIHR5cGVzICovCisjZGVmaW5lIFNjdHBUaW1lclR5cGVOb25lCQkwCisjZGVmaW5lIFNjdHBUaW1lclR5cGVTZW5kCQkxCisjZGVmaW5lIFNjdHBUaW1lclR5cGVJbml0CQkyCisjZGVmaW5lIFNjdHBUaW1lclR5cGVSZWN2CQkzCisjZGVmaW5lIFNjdHBUaW1lclR5cGVTaHV0ZG93bgkJNAorI2RlZmluZSBTY3RwVGltZXJUeXBlSGVhcnRiZWF0CQk1CisjZGVmaW5lIFNjdHBUaW1lclR5cGVDb29raWUJCTYKKyNkZWZpbmUgU2N0cFRpbWVyVHlwZU5ld0Nvb2tpZQkJNworI2RlZmluZSBTY3RwVGltZXJUeXBlUGF0aE10dVJhaXNlCTgKKyNkZWZpbmUgU2N0cFRpbWVyVHlwZVNodXRkb3duQWNrCTkKKyNkZWZpbmUgU2N0cFRpbWVyVHlwZVJlbFJlcQkJMTAKKworLyogSGVyZSBhcmUgdGhlIHRpbWVyIGRpcmVjdGl2ZXMgZ2l2ZW4gdG8gdGhlCisgKiB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgU0NUUF9USU1FUl9TVEFSVAkxCisjZGVmaW5lIFNDVFBfVElNRVJfU1RPUAkJMgorCisvKiBydW5uaW5nIGZsYWcgc3RhdGVzIGluIHRpbWVyIHN0cnVjdHVyZSAqLworI2RlZmluZSBTQ1RQX1RJTUVSX0lETEUJCTB4MAorI2RlZmluZSBTQ1RQX1RJTUVSX0VYUElSRUQJMHgxCisjZGVmaW5lIFNDVFBfVElNRVJfUlVOTklORwkweDIKKworCisvKiBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHRpbWVycyBydW5uaW5nICovCisjZGVmaW5lIFNDVFBfTUFYX05FVF9USU1FUlMgICAgIDYJLyogYmFzZSBvZiB3aGVyZSBuZXQgdGltZXJzIHN0YXJ0ICovCisjZGVmaW5lIFNDVFBfTlVNQkVSX1RJTUVSUwkxMgkvKiBhbGxvd3MgdXAgdG8gNiBkZXN0aW5hdGlvbnMgKi8KKworCisvKiBPZiBjb3Vyc2Ugd2UgcmVhbGx5IGRvbid0IGNvbGxlY3Qgc3RhbGUgY29va2llcywgYmVpbmcKKyAqIGZvbGtzIG9mIGRlY2VybmluZyB0YXN0ZS4gSG93ZXZlciB3ZSBkbyBjb3VudCB0aGVtLCBpZgorICogd2UgZ2V0IHRvIG1hbnkgYmVmb3JlIHRoZSBhc3NvY2lhdGlvbiBjb21lcyB1cC4uIHdlCisgKiBnaXZlIHVwLiBCZWxvdyBpcyB0aGUgY29uc3RhbnQgdGhhdCBkaWN0YXRlcyB3aGVuCisgKiB3ZSBnaXZlIGl0IHVwLi4udGhpcyBpcyBhIGltcGxlbWVuYXRpb24gZGVwZW5kYW50CisgKiB0cmVhdG1lbnQuIEluIG91cnMgd2UgZG8gbm90IGFzayBmb3IgYSBleHRlbnNpb24gb2YKKyAqIHRpbWUsIGJ1dCBqdXN0IHJldHJ5IHRoaXMgbWFueSB0aW1lcy4uLgorICovCisjZGVmaW5lIFNDVFBfTUFYX1NUQUxFX0NPT0tJRVNfSV9DT0xMRUNUIDEwCisKKy8qIG1heCBudW1iZXIgb2YgVFNOJ3MgZHVwJ2QgdGhhdCBJIHdpbGwgaG9sZCAqLworI2RlZmluZSBTQ1RQX01BWF9EVVBfVFNOUyAgICAgIDIwCisKKy8qIEhlcmUgd2UgZGVmaW5lIHRoZSB0eXBlcyB1c2VkIHdoZW4KKyAqIHNldHRpbmcgdGhlIHJldHJ5IGFtbW91bnRzLgorICovCisvKiBjb25zdGFudHMgZm9yIHR5cGUgb2Ygc2V0ICovCisjZGVmaW5lIFNDVFBfTUFYQVRURU1QVF9JTklUIDIKKyNkZWZpbmUgU0NUUF9NQVhBVFRFTVBUX1NFTkQgMworCisvKiBIZXJlIHdlIGRlZmluZSB0aGUgZGVmYXVsdCB0aW1lcnMgYW5kIHRoZQorICogZGVmYXVsdCBudW1iZXIgb2YgYXR0ZW10cyB3ZSBtYWtlIGZvcgorICogZWFjaCByZXNwZWN0aXZlIHNpZGUgKHNlbmQvaW5pdCkuCisgKi8KKworLyogaW5pdCB0aW1lciBkZWYgPSAzc2VjICAqLworI2RlZmluZSBTQ1RQX0lOSVRfU0VDCTMKKyNkZWZpbmUgU0NUUF9JTklUX05TRUMJMAorCisvKiBzZW5kIHRpbWVyIGRlZiA9IDMgc2Vjb25kcyAqLworI2RlZmluZSBTQ1RQX1NFTkRfU0VDCTEKKyNkZWZpbmUgU0NUUF9TRU5EX05TRUMJMAorCisvKiByZWN2IHRpbWVyIGRlZiA9IDIwMG1zIChpbiBuc2VjKSAqLworI2RlZmluZSBTQ1RQX1JFQ1ZfU0VDCTAKKyNkZWZpbmUgU0NUUF9SRUNWX05TRUMJMjAwMDAwMDAwCisKKy8qIDMwIHNlY29uZHMgKyBSVE8gKi8KKyNkZWZpbmUgU0NUUF9IQl9TRUMJMzAKKyNkZWZpbmUgU0NUUF9IQl9OU0VDCTAKKworCisvKiAzMDAgbXMgKi8KKyNkZWZpbmUgU0NUUF9TSFVURE9XTl9TRUMJMAorI2RlZmluZSBTQ1RQX1NIVVRET1dOX05TRUMJMzAwMDAwMDAwCisKKyNkZWZpbmUgU0NUUF9SVE9fVVBQRVJfQk9VTkQgNjAwMDAwMDAgLyogNjAgc2VjIGluIG1pY3JvLXNlY29uZCdzICovCisjZGVmaW5lIFNDVFBfUlRPX1VQUEVSX0JPVU5EX1NFQyA2MCAgLyogZm9yIHRoZSBpbml0IHRpbWVyICovCisjZGVmaW5lIFNDVFBfUlRPX0xPV0VSX0JPVU5EICAxMDAwMDAwIC8qIDEgc2VjIGluIG1pY3JvLXNlYydzICovCisKKyNkZWZpbmUgU0NUUF9ERUZfTUFYX0lOSVQgOAorI2RlZmluZSBTQ1RQX0RFRl9NQVhfU0VORCAxMAorCisjZGVmaW5lIFNDVFBfREVGX1BNVFVfUkFJU0UgNjAwICAvKiAxMCBNaW51dGVzIGJldHdlZW4gcmFpc2UgYXR0ZW1wdHMgKi8KKyNkZWZpbmUgU0NUUF9ERUZfUE1UVV9NSU4gICA2MDAKKworI2RlZmluZSBTQ1RQX01TRUNfSU5fQV9TRUMgIDEwMDAKKyNkZWZpbmUgU0NUUF9VU0VDX0lOX0FfU0VDICAxMDAwMDAwCisjZGVmaW5lIFNDVFBfTlNFQ19JTl9BX1NFQyAgMTAwMDAwMDAwMAorCisKKy8qIEV2ZW50cyB0aGF0IFNDVFAgd2lsbCBsb29rIGZvciwgdGhlc2UKKyAqIGFyZSBvcidkIHRvZ2V0aGVyIHRvIGRlY2xhcmUgd2hhdCBTQ1RQCisgKiB3YW50cy4gRWFjaCBzZWxlY3QgbWFzay9wb2xsIGxpc3Qgc2hvdWxkIGJlCisgKiBzZXQgZm9yIHRoZSBmZCwgaWYgdGhlIGJpdCBpcyBvbi4KKyAqLworI2RlZmluZSBTQ1RQX0VWRU5UX1JFQUQJCTB4MDAwMDAxCisjZGVmaW5lIFNDVFBfRVZFTlRfV1JJVEUJMHgwMDAwMDIKKyNkZWZpbmUgU0NUUF9FVkVOVF9FWENFUFQJMHgwMDAwMDQKKworLyogVGhlIGZvbGxvd2luZyBjb25zdGFudCBpcyBhIHZhbHVlIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIGltcGxlbWVuYXRpb24uIEl0IGlzIHF1aXRlIGFyYml0cmFyeSBhbmQKKyAqIGlzIHVzZWQgdG8gbGltaXQgaG93IG11Y2ggZGF0YSB3aWxsIGJlIHF1ZXVlZCB1cCB0bworICogYSBzZW5kZXIsIHdhaXRpbmcgZm9yIGN3bmQgdG8gYmUgbGFyZ2VyIHRoYW4gZmxpZ2h0U2l6ZS4KKyAqIEFsbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRoaXMgcHJvdGVjdGlvbiBpcyBzb21lCisgKiB3YXkgZHVlIHRvIGJ1ZmZlciBzaXplIGNvbnN0cmFpbnRzLgorICovCisKKyNkZWZpbmUgU0NUUF9NQVhfT1VUU1RBTkRJTkdfREcJMTAwMDAKKworCisKKy8qIFRoaXMgY29uc3RhbnQgKFNDVFBfTUFYX1JFQURCVUZGRVIpIGRlZmluZQorICogaG93IGJpZyB0aGUgcmVhZC93cml0ZSBidWZmZXIgaXMKKyAqIHdoZW4gd2UgZW50ZXIgdGhlIGZkIGV2ZW50IG5vdGlmaWNhdGlvbgorICogdGhlIGJ1ZmZlciBpcyBwdXQgb24gdGhlIHN0YWNrLCBzbyB0aGUgYmlnZ2VyCisgKiBpdCBpcyB0aGUgbW9yZSBzdGFjayB5b3UgY2hldyB1cCwgaG93ZXZlciBpdAorICogaGFzIGdvdCB0byBiZSBiaWcgZW5vdWdoIHRvIGhhbmRsZSB0aGUgYmlnZXN0CisgKiBtZXNzYWdlIHRoaXMgTy9TIHdpbGwgc2VuZCB5b3UuIEluIHNvbGFyaXMKKyAqIHdpdGggc29ja2V0cyAobm90IFRMSSkgd2UgZW5kIHVwIGF0IGEgdmFsdWUKKyAqIG9mIDY0ay4gSW4gVExJIHdlIGNvdWxkIGRvIHBhcnRpYWwgcmVhZHMgdG8KKyAqIGdldCBpdCBhbGwgaW4gd2l0aCBsZXNzIGhhc3NlbC4uIGJ1dCB3ZQorICogd3JpdGUgdG8gc29ja2V0cyBmb3IgZ2VuZXJhbGl0eS4KKyAqLworI2RlZmluZSBTQ1RQX01BWF9SRUFEQlVGRkVSIDY1NTM2CisjZGVmaW5lIFNDVFBfQUREUk1BWCA2MAorCisvKiBhbW91bnQgcGVlciBpcyBvYmxpZ2F0ZWQgdG8gaGF2ZSBpbiByd25kIG9yCisgKiBJIHdpbGwgYWJvcnQKKyAqLworI2RlZmluZSBTQ1RQX01JTl9SV05ECTE1MDAKKworI2RlZmluZSBTQ1RQX1dJTkRPV19NSU4JMTUwMAkvKiBzbWFsbGVzdCByd25kIGNhbiBiZSAqLworI2RlZmluZSBTQ1RQX1dJTkRPV19NQVggMTA0ODU3NgkvKiBiaWdnZXN0IEkgY2FuIGdyb3cgcnduZCB0bworCQkJCSAqIE15IHBsYXlpbmcgYXJvdW5kIHN1Z2dlc3RzIGEKKwkJCQkgKiB2YWx1ZSBncmVhdGVyIHRoYW4gNjRrIGRvZXMgbm90CisJCQkJICogZG8gbXVjaCwgSSBndWVzcyB2aWEgdGhlIGtlcm5lbAorCQkJCSAqIGxpbWl0YXRpb25zIG9uIHRoZSBzdHJlYW0vc29ja2V0LgorCQkJCSAqLworCisjZGVmaW5lIFNDVFBfTUFYX0JVTkRMRV9VUCAyNTYJLyogbWF4IG51bWJlciBvZiBjaHVua3MgSSBjYW4gYnVuZGxlICovCisKKy8qICBJIGNhbiBoYW5kbGUgYSAxbWVnIHJlLWFzc2VtYmx5ICovCisjZGVmaW5lIFNDVFBfREVGQVVMVF9NQVhNU0dSRUFTTSAxMDQ4NTc2CisKKworI2RlZmluZSBTQ1RQX0RFRkFVTFRfTUFYV0lORE9XCTMyNzY4CS8qIGRlZmF1bHQgcnduZCBzaXplICovCisjZGVmaW5lIFNDVFBfREVGQVVMVF9NQVhTRUdNRU5UIDE1MDAJLyogTVRVIHNpemUsIHRoaXMgaXMgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byB3aGljaCB3ZSBzZXQgdGhlIHNtYWxsZXN0TVRVCisJCQkJCSAqIHNpemUgdG8uIFRoaXMgZ292ZXJucyB3aGF0IGlzIHRoZQorCQkJCQkgKiBsYXJnZXN0IHNpemUgd2Ugd2lsbCB1c2UsIG9mIGNvdXJzZQorCQkJCQkgKiBQTVRVIHdpbGwgcmFpc2UgdGhpcyB1cCB0bworCQkJCQkgKiB0aGUgbGFyZ2VzdCBpbnRlcmZhY2UgTVRVIG9yIHRoZQorCQkJCQkgKiBjZWlsaW5nIGJlbG93IGlmIHRoZXJlIGlzIG5vCisJCQkJCSAqIFNJT0NHSUZNVFUuCisJCQkJCSAqLworI2lmZGVmIExZTlgKKyNkZWZpbmUgREVGQVVMVF9NVFVfQ0VJTElORyAgMTUwMCAJLyogU2luY2UgTHlueCBPL1MgaXMgYnJhaW4gZGVhZAorCQkJCQkgKiBpbiB0aGUgd2F5IGl0IGhhbmRsZXMgdGhlCisJCQkJCSAqIHJhdyBJUCBzb2NrZXQsIGluc2lzdGluZworCQkJCQkgKiBvbiBtYWtlaW5nIGl0cyBvd24gSVAKKwkJCQkJICogaGVhZGVyLCB3ZSBsaW1pdCB0aGUgZ3Jvd3RoCisJCQkJCSAqIHRvIHRoYXQgb2YgdGhlIGUtbmV0IHNpemUKKwkJCQkJICovCisjZWxzZQorI2RlZmluZSBERUZBVUxUX01UVV9DRUlMSU5HICAyMDQ4CS8qIElmIG5vIFNJT0NHSUZNVFUsIGhpZ2hlc3QgdmFsdWUKKwkJCQkJICogdG8gcmFpc2UgdGhlIFBNVFUgdG8sIGkuZS4KKwkJCQkJICogZG9uJ3QgdHJ5IHRvIHJhaXNlIGFib3ZlIHRoaXMKKwkJCQkJICogdmFsdWUuIFR1bmUgdGhpcyBwZXIgeW91cgorCQkJCQkgKiBsYXJnZXN0IE1UVSBpbnRlcmZhY2UgaWYgeW91cgorCQkJCQkgKiBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUKKwkJCQkJICogU0lPQ0dJRk1UVSBpb2N0bC4KKwkJCQkJICovCisjZW5kaWYKKyNkZWZpbmUgU0NUUF9ERUZBVUxUX01JTlNFR01FTlQgNTEyCS8qIE1UVSBzaXplIC4uLiBpZiBubyBtdHUgZGlzYyAqLworI2RlZmluZSBTQ1RQX0hPV19NQU5ZX1NFQ1JFVFMgMgkJLyogaG93IG1hbnkgc2VjcmV0cyBJIGtlZXAgKi8KKy8qIFRoaXMgaXMgaG93IGxvbmcgYSBzZWNyZXQgbGl2ZXMsIE5PVCBob3cgbG9uZyBhIGNvb2tpZSBsaXZlcyAqLworI2RlZmluZSBTQ1RQX0hPV19MT05HX0NPT0tJRV9MSVZFIDM2MDAJLyogaG93IG1hbnkgc2Vjb25kcyB0aGUgY3VycmVudCBzZWNyZXQgd2lsbCBsaXZlICovCisKKyNkZWZpbmUgU0NUUF9OVU1CRVJfT0ZfU0VDUkVUUwk4CS8qIG9yIDggKiA0ID0gMzIgb2N0ZXRzICovCisjZGVmaW5lIFNDVFBfU0VDUkVUX1NJWkUgMzIJCS8qIG51bWJlciBvZiBvY3RldHMgaW4gYSAyNTYgYml0cyAqLworCisjaWZkZWYgVVNFX01ENQorI2RlZmluZSBTQ1RQX1NJR05BVFVSRV9TSVpFIDE2CS8qIHNpemUgb2YgYSBNRDUgc2lnbmF0dXJlICovCisjZWxzZQorI2RlZmluZSBTQ1RQX1NJR05BVFVSRV9TSVpFIDIwCS8qIHNpemUgb2YgYSBTTEEtMSBzaWduYXR1cmUgKi8KKyNlbmRpZgorLyogSGVyZSBhcmUgdGhlIG5vdGlmaWNhdGlvbiBjb25zdGFudHMKKyAqIHRoYXQgdGhlIGNvZGUgYW5kIHVwcGVyIGxheWVyIHdpbGwgZ2V0CisgKi8KKworLyogYXNzb2NpYXRpb24gaXMgdXAgKi8KKyNkZWZpbmUgU0NUUF9OT1RJRllfQVNTT0NfVVAJCTEKKworLyogYXNzb2NpYXRpb24gaXMgZG93biAqLworI2RlZmluZSBTQ1RQX05PVElGWV9BU1NPQ19ET1dOCQkyCisKKy8qIGludGVyZmFjZSBvbiBhIGFzc29jaWF0aW9uIGlzIGRvd24KKyAqIGFuZCBvdXQgb2YgY29uc2lkZXJhdGlvbiBmb3Igc2VsZWN0aW9uLgorICovCisjZGVmaW5lIFNDVFBfTk9USUZZX0lOVEZfRE9XTgkJMworCisvKiBpbnRlcmZhY2Ugb24gYSBhc3NvY2lhdGlvbiBpcyB1cAorICogYW5kIG5vdyBiYWNrIGluIGNvbnNpZGVyYXRpb24gZm9yIHNlbGVjdGlvbi4KKyAqLworI2RlZmluZSBTQ1RQX05PVElGWV9JTlRGX1VQCQk0CisKKy8qIFRoZSBnaXZlbiBkYXRhZ3JhbSBjYW5ub3QgYmUgZGVsaXZlcmVkCisgKiB0byB0aGUgcGVlciwgdGhpcyB3aWxsIHByb2JhYmx5IGJlIGZvbGxvd2VkCisgKiBieSBhIFNDVFBfTk9URklZX0FTU09DX0RPV04uCisgKi8KKyNkZWZpbmUgU0NUUF9OT1RJRllfREdfRkFJTAkJNQorCisvKiBTZW50IGRnIG9uIG5vbi1vcGVuIHN0cmVhbSBleHRyZW1lIGNvZGUgZXJyb3IhCisgKi8KKyNkZWZpbmUgU0NUUF9OT1RJRllfU1RSREFUQV9FUlIgCTYKKworI2RlZmluZSBTQ1RQX05PVElGWV9BU1NPQ19BQk9SVEVECTcKKworLyogVGhlIHN0cmVhbSBvbmVzIGFyZSBub3QgdXNlZCB5ZXQsIGJ1dCBjb3VsZAorICogYmUgd2hlbiBhIGFzc29jaWF0aW9uIG9wZW5zLgorICovCisjZGVmaW5lIFNDVFBfTk9USUZZX1BFRVJfT1BFTkVEX1NUUgk4CisjZGVmaW5lIFNDVFBfTk9USUZZX1NUUkVBTV9PUEVORURfT0sJOQorCisvKiBhc3NvY2lhdGlvbiBzZWVzIGEgcmVzdGFydCBldmVudCAqLworI2RlZmluZSBTQ1RQX05PVElGWV9BU1NPQ19SRVNUQVJUCTEwCisKKy8qIGEgdXNlciByZXF1ZXN0ZWQgSEIgcmV0dXJuZWQgKi8KKyNkZWZpbmUgU0NUUF9OT1RJRllfSEJfUkVTUCAgICAgICAgICAgICAxMQorCisvKiBhIHJlc3VsdCBmcm9tIGEgUkVMLVJFUSAqLworI2RlZmluZSBTQ1RQX05PVElGWV9SRUxSRVFfUkVTVUxUX09LCQkxMgorI2RlZmluZSBTQ1RQX05PVElGWV9SRUxSRVFfUkVTVUxUX0ZBSUxFRAkxMworCisvKiBjbG9jayB2YXJpYW5jZSBpcyAxMG1zIG9yIDEwLDAwMCB1cydzICovCisjZGVmaW5lIFNDVFBfQ0xPQ0tfR1JBSU5VTEFSSVRZIDEwMDAwCisKKyNkZWZpbmUgSVBfSERSX1NJWkUgNDAJCS8qIHdlIHVzZSB0aGUgc2l6ZSBvZiBhIElQNiBoZWFkZXIgaGVyZQorCQkJCSAqIHRoaXMgZGV0cmFjdHMgYSBzbWFsbCBhbW91bnQgZm9yIGlwdjQKKwkJCQkgKiBidXQgaXQgc2ltcGxpZmllcyB0aGUgaXB2NiBhZGRpdGlvbgorCQkJCSAqLworCisjZGVmaW5lIFNDVFBfTlVNX0ZEUyAzCisKKy8qIHJhdyBJUCBmaWxlZGVzY3JpcHRvciAqLworI2RlZmluZSBTQ1RQX0ZEX0lQICAgMAorLyogcmF3IElDTVAgZmlsZWRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgU0NUUF9GRF9JQ01QIDEKKy8qIHByb2Nlc3NlcyBjb250YWN0IG1lIGZvciByZXF1ZXN0cyBoZXJlICovCisjZGVmaW5lIFNDVFBfUkVRVUVTVCAyCisKKworI2RlZmluZSBTQ1RQX0RFQU1PTl9QT1JUIDk4OTkKKworLyogRGVhbW9uIHJlZ2lzdHJhdGlvbiBtZXNzYWdlIHR5cGVzL3Jlc3BvbnNlcyAqLworI2RlZmluZSBERUFNT05fUkVHSVNURVIgICAgICAgMHgwMQorI2RlZmluZSBERUFNT05fUkVHSVNURVJfQUNLICAgMHgwMgorI2RlZmluZSBERUFNT05fREVSRUdJU1RFUiAgICAgMHgwMworI2RlZmluZSBERUFNT05fREVSRUdJU1RFUl9BQ0sgMHgwNAorI2RlZmluZSBERUFNT05fQ0hFQ0tBRERSX0xJU1QgMHgwNQorCisjZGVmaW5lIERFQU1PTl9NQUdJQ19WRVJfTEVOIDB4ZmYKKworLyogbWF4IHRpbWVzIEkgd2lsbCBhdHRlbXB0IHRvIHNlbmQgYSBtZXNzYWdlIHRvIGRlYW1vbiAqLworI2RlZmluZSBTQ1RQX01BWF9BVFRFTVBUU19BVF9ERUFNT04gNQorI2RlZmluZSBTQ1RQX1RJTUVPVVRfSU5fUE9MTF9GT1JfREVBTU9OIDE1MDAgLyogMS41IHNlY29uZHMgKi8KKworLyogbW9kdWxhciBjb21wYXJpc29uICovCisvKiBUcnVlIGlmIGEgPiBiIChtb2QgPSBNKSAqLworI2RlZmluZSBjb21wYXJlX3dpdGhfd3JhcChhLCBiLCBNKSAoKGEgPiBiKSAmJiAoKGEgLSBiKSA8IChNID4+IDEpKSkgfHwgXAorICAgICAgICAgICAgICAoKGIgPiBhKSAmJiAoKGIgLSBhKSA+IChNID4+IDEpKSkKKworI2lmbmRlZiBUSU1FVkFMX1RPX1RJTUVTUEVDCisjZGVmaW5lIFRJTUVWQUxfVE9fVElNRVNQRUModHYsIHRzKQkJCVwKK3sJCQkJCQkJXAorICAgICh0cyktPnR2X3NlYyAgPSAodHYpLT50dl9zZWM7CQkJXAorICAgICh0cyktPnR2X25zZWMgPSAodHYpLT50dl91c2VjICogMTAwMDsJCVwKK30KKyNlbmRpZgorCisvKiBwZWdzICovCisjZGVmaW5lIFNDVFBfTlVNQkVSX09GX1BFR1MgMjEKKy8qIHBlZyBpbmRleCdzICovCisjZGVmaW5lIFNDVFBfUEVHX1NBQ0tTX1NFRU4gMAorI2RlZmluZSBTQ1RQX1BFR19TQUNLU19TRU5UIDEKKyNkZWZpbmUgU0NUUF9QRUdfVFNOU19TRU5UICAyCisjZGVmaW5lIFNDVFBfUEVHX1RTTlNfUkNWRCAgMworI2RlZmluZSBTQ1RQX0RBVEFHUkFNU19TRU5UIDQKKyNkZWZpbmUgU0NUUF9EQVRBR1JBTVNfUkNWRCA1CisjZGVmaW5lIFNDVFBfUkVUUkFOVFNOX1NFTlQgNgorI2RlZmluZSBTQ1RQX0RVUFRTTl9SRUNWRCAgIDcKKyNkZWZpbmUgU0NUUF9IQlJfUkVDVgkgICAgOAorI2RlZmluZSBTQ1RQX0hCQV9SRUNWICAgICAgIDkKKyNkZWZpbmUgU0NUUF9IQl9TRU5UCSAgIDEwCisjZGVmaW5lIFNDVFBfREFUQV9ER19TRU5UICAxMQorI2RlZmluZSBTQ1RQX0RBVEFfREdfUkVDViAgMTIKKyNkZWZpbmUgU0NUUF9UTUlUX1RJTUVSICAgIDEzCisjZGVmaW5lIFNDVFBfUkVDVl9USU1FUiAgICAxNAorI2RlZmluZSBTQ1RQX0hCX1RJTUVSICAgICAgMTUKKyNkZWZpbmUgU0NUUF9GQVNUX1JFVFJBTiAgIDE2CisjZGVmaW5lIFNDVFBfUEVHX1RTTlNfUkVBRCAxNworI2RlZmluZSBTQ1RQX05PTkVfTEZUX1RPICAgMTgKKyNkZWZpbmUgU0NUUF9OT05FX0xGVF9SV05EIDE5CisjZGVmaW5lIFNDVFBfTk9ORV9MRlRfQ1dORCAyMAorCisKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NjdHBIZWFkZXIuaCBiL3NjdHBIZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI2MDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2N0cEhlYWRlci5oCkBAIC0wLDAgKzEsMzIzIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NjdHBIZWFkZXIuaCx2IDEuNiAyMDAyLzEyLzExIDA3OjE0OjExIGd1eSBFeHAgJCAoTEJMKSAqLworCisvKiBTQ1RQIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBDb3B5cmlnaHQgKEMpIDE5OTkgQ2lzY28gQW5kIE1vdG9yb2xhCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIENpc2NvIG5vciBvZiBNb3Rvcm9sYSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTQ1RQIHJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbgorICoKKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgZW1haWwKKyAqIGFkZHJlc3NlczoKKyAqCisgKiByc3Rld2FyMUBlbWFpbC5tb3QuY29tCisgKiBrbW9ybmVhdUBjaXNjby5jb20KKyAqIHF4aWUxQGVtYWlsLm1vdC5jb20KKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBlcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKworCisjaWZuZGVmIF9fc2N0cEhlYWRlcl9oX18KKyNkZWZpbmUgX19zY3RwSGVhZGVyX2hfXworCisjaW5jbHVkZSA8c2N0cENvbnN0YW50cy5oPgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIHRoZSBzY3RwIGNvbW1vbiBoZWFkZXIgKi8KKworI2lmZGVmIFRSVTY0CisgI2RlZmluZSBfNjRCSVRTIDEKKyNlbmRpZgorCitzdHJ1Y3Qgc2N0cEhlYWRlcnsKKyAgdV9pbnQxNl90IHNvdXJjZTsKKyAgdV9pbnQxNl90IGRlc3RpbmF0aW9uOworICB1X2ludDMyX3QgdmVyaWZpY2F0aW9uVGFnOworICB1X2ludDMyX3QgYWRsZXIzMjsKK307CisKKy8qIHZhcmlvdXMgZGVzY3JpcHRvciBwYXJzZXJzICovCisKK3N0cnVjdCBzY3RwQ2h1bmtEZXNjeworICB1X2ludDhfdCBjaHVua0lEOworICB1X2ludDhfdCBjaHVua0ZsZzsKKyAgdV9pbnQxNl90IGNodW5rTGVuZ3RoOworfTsKKworc3RydWN0IHNjdHBQYXJhbURlc2N7CisgIHVfaW50MTZfdCBwYXJhbVR5cGU7CisgIHVfaW50MTZfdCBwYXJhbUxlbmd0aDsKK307CisKKworc3RydWN0IHNjdHBSZWxDaHVua0Rlc2N7CisgIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIGNoazsKKyAgdV9pbnQzMl90IHNlcmlhbE51bWJlcjsKK307CisKK3N0cnVjdCBzY3RwVmVuZG9yU3BlY2lmaWNQYXJhbSB7CisgIHN0cnVjdCBzY3RwUGFyYW1EZXNjIHA7ICAvKiB0eXBlIG11c3QgYmUgMHhmZmZlICovCisgIHVfaW50MzJfdCB2ZW5kb3JJZDsJICAgLyogdmVuZG9yIElEIGZyb20gUkZDIDE3MDAgKi8KKyAgdV9pbnQxNl90IHZlbmRvclNwZWNpZmljVHlwZTsKKyAgdV9pbnQxNl90IHZlbmRvclNwZWNpZmljTGVuOworfTsKKworCisvKiBTdHJ1Y3R1cmVzIGZvciB0aGUgY29udHJvbCBwYXJ0cyAqLworCisKKworLyogU2N0cCBhc3NvY2lhdGlvbiBpbml0IHJlcXVlc3QvYWNrICovCisKKy8qIHRoaXMgaXMgdXNlZCBmb3IgaW5pdCBhY2ssIHRvbyAqLworc3RydWN0IHNjdHBJbml0aWF0aW9ueworICB1X2ludDMyX3QgaW5pdFRhZzsJCS8qIHRhZyBvZiBtaW5lICovCisgIHVfaW50MzJfdCByY3ZXaW5kb3dDcmVkaXQ7CS8qIHJ3bmQgKi8KKyAgdV9pbnQxNl90IE51bVByZW9wZW5TdHJlYW1zOwkvKiBPUyAqLworICB1X2ludDE2X3QgTWF4SW5ib3VuZFN0cmVhbXM7ICAgICAvKiBNSVMgKi8KKyAgdV9pbnQzMl90IGluaXRpYWxUU047CisgIC8qIG9wdGlvbmFsIHBhcmFtJ3MgZm9sbG93IGluIHNjdHBQYXJhbURlc2MgZm9ybSAqLworfTsKKworc3RydWN0IHNjdHBWNElwQWRkcmVzc3sKKyAgc3RydWN0IHNjdHBQYXJhbURlc2MgcDsJLyogdHlwZSBpcyBzZXQgdG8gU0NUUF9JUFY0X1BBUkFNX1RZUEUsIGxlbj0xMCAqLworICB1X2ludDMyX3QgIGlwQWRkcmVzczsKK307CisKKworc3RydWN0IHNjdHBWNklwQWRkcmVzc3sKKyAgc3RydWN0IHNjdHBQYXJhbURlc2MgcDsJLyogdHlwZSBpcyBzZXQgdG8gU0NUUF9JUFY2X1BBUkFNX1RZUEUsIGxlbj0yMiAqLworICB1X2ludDhfdCAgaXBBZGRyZXNzWzE2XTsKK307CisKK3N0cnVjdCBzY3RwRE5TTmFtZXsKKyAgc3RydWN0IHNjdHBQYXJhbURlc2MgcGFyYW07CisgIHVfaW50OF90IG5hbWVbMV07Cit9OworCisKK3N0cnVjdCBzY3RwQ29va2llUHJlc2VydmV7CisgIHN0cnVjdCBzY3RwUGFyYW1EZXNjIHA7CS8qIHR5cGUgaXMgc2V0IHRvIFNDVFBfQ09PS0lFX1BSRVNFUlZFLCBsZW49OCAqLworICB1X2ludDMyX3QgZXh0cmFUaW1lOworfTsKKworCitzdHJ1Y3Qgc2N0cFRpbWVTdGFtcHsKKyAgdV9pbnQzMl90IHRzX3NlYzsKKyAgdV9pbnQzMl90IHRzX3VzZWM7Cit9OworCisvKiB3aXJlIHN0cnVjdHVyZSBvZiBteSBjb29raWUgKi8KK3N0cnVjdCBjb29raWVNZXNzYWdleworICB1X2ludDMyX3QgVGllVGFnX2N1clRhZzsJCS8qIGNvcGllZCBmcm9tIGFzc29jIGlmIHByZXNlbnQgKi8KKyAgdV9pbnQzMl90IFRpZVRhZ19oaXNUYWc7IAkJLyogY29waWVkIGZyb20gYXNzb2MgaWYgcHJlc2VudCAqLworICBpbnQzMl90IGNvb2tpZUxpZmU7CQkJLyogbGlmZSBJIHdpbGwgYXdhcmQgdGhpcyBjb29raWUgKi8KKyAgc3RydWN0IHNjdHBUaW1lU3RhbXAgdGltZUVudGVyaW5nU3RhdGU7IC8qIHRoZSB0aW1lIEkgYnVpbHQgY29va2llICovCisgIHN0cnVjdCBzY3RwSW5pdGlhdGlvbiBpbml0QWNrSVNlbnQ7CS8qIHRoZSBJTklULUFDSyB0aGF0IEkgc2VudCB0byBteSBwZWVyICovCisgIHVfaW50MzJfdCBhZGRyZXNzV2hlcmVJU2VudFs0XTsJLyogSSBtYWtlIHRoaXMgNCBpbnRzIHNvIEkgZ2V0IDEyOGJpdHMgZm9yIGZ1dHVyZSAqLworICBpbnQzMl90IGFkZHJ0eXBlOwkJCS8qIGFkZHJlc3MgdHlwZSAqLworICB1X2ludDE2X3QgbG9jU2NvcGU7CQkJLyogVjYgbG9jYWwgc2NvcGUgZmxhZyAqLworICB1X2ludDE2X3Qgc2l0ZVNjb3BlOwkJCS8qIFY2IHNpdGUgc2NvcGUgZmxhZyAqLworICAvKiBhdCB0aGUgZW5kIGlzIHRhY2tlZCBvbiB0aGUgSU5JVCBjaHVuayBzZW50IGluCisgICAqIGl0cyBlbnRpcmV0eSBhbmQgb2YgY291cnNlIG91cgorICAgKiBzaWduYXR1cmUuCisgICAqLworfTsKKworCisvKiB0aGlzIGd1eSBpcyBmb3IgdXNlIHdoZW4KKyAqIEkgaGF2ZSBhIGluaXRpYXRlIG1lc3NhZ2UgZ2xvbWluZyB0aGUKKyAqIHRoaW5ncyB0b2dldGhlci4KKworICovCitzdHJ1Y3Qgc2N0cFVuaWZpZWRJbml0eworICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKKyAgc3RydWN0IHNjdHBJbml0aWF0aW9uIGluaXRtOworfTsKKworc3RydWN0IHNjdHBTZW5kYWJsZUluaXR7CisgIHN0cnVjdCBzY3RwSGVhZGVyIG1oOworICBzdHJ1Y3Qgc2N0cFVuaWZpZWRJbml0IG1zZzsKK307CisKKworLyogU2VsZWN0aXZlIEFja25vd2xlZGdlbWVudAorICogaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHdpdGgKKyAqIGEgb3B0aW9uYWwgYW1tb3VudCBvZiB0cmFpbGluZyBpbnQncworICogb24gdGhlIGxhc3QgcGFydCAoYmFzZWQgb24gdGhlIG51bWJlck9mRGVzYworICogZmllbGQpLgorICovCisKK3N0cnVjdCBzY3RwU2VsZWN0aXZlQWNreworICB1X2ludDMyX3QgaGlnaGVzdENvbnNlcVRTTjsKKyAgdV9pbnQzMl90IHVwZGF0ZWRSd25kOworICB1X2ludDE2X3QgbnVtYmVyT2ZkZXNjOworICB1X2ludDE2X3QgbnVtRHVwVHNuczsKK307CisKK3N0cnVjdCBzY3RwU2VsZWN0aXZlRnJhZ3sKKyAgdV9pbnQxNl90IGZyYWdtZW50U3RhcnQ7CisgIHVfaW50MTZfdCBmcmFnbWVudEVuZDsKK307CisKKworc3RydWN0IHNjdHBVbmlmaWVkU2Fja3sKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHN0cnVjdCBzY3RwU2VsZWN0aXZlQWNrIHNhY2s7Cit9OworCisvKiBmb3IgYm90aCBSVFQgcmVxdWVzdC9yZXNwb25zZSB0aGUKKyAqIGZvbGxvd2luZyBpcyBzZW50CisgKi8KKworc3RydWN0IHNjdHBIQnJlcXVlc3QgeworICB1X2ludDMyX3QgdGltZV92YWx1ZV8xOworICB1X2ludDMyX3QgdGltZV92YWx1ZV8yOworfTsKKworLyogaGVyZSBpcyB3aGF0IEkgcmVhZCBhbmQgcmVzcG9uZCB3aXRoIHRvLiAqLworc3RydWN0IHNjdHBIQnVuaWZpZWR7CisgIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIGhkcjsKKyAgc3RydWN0IHNjdHBQYXJhbURlc2MgaGI7Cit9OworCisKKy8qIGhlcmUgaXMgd2hhdCBJIHNlbmQgKi8KK3N0cnVjdCBzY3RwSEJzZW5kZXJ7CisgIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIGhkcjsKKyAgc3RydWN0IHNjdHBQYXJhbURlc2MgaGI7CisgIHN0cnVjdCBzY3RwSEJyZXF1ZXN0IHJ0dDsKKyAgaW50OF90IGFkZHJGbXRbU0NUUF9BRERSTUFYXTsKKyAgdV9pbnQxNl90IHVzZXJyZXE7Cit9OworCisKKworLyogZm9yIHRoZSBhYm9ydCBhbmQgc2h1dGRvd24gQUNLCisgKiB3ZSBtdXN0IGNhcnJ5IHRoZSBpbml0IHRhZyBpbiB0aGUgY29tbW9uIGhlYWRlci4gSnVzdCB0aGUKKyAqIGNvbW1vbiBoZWFkZXIgaXMgYWxsIHRoYXQgaXMgbmVlZGVkIHdpdGggYSBjaHVuayBkZXNjcmlwdG9yLgorICovCitzdHJ1Y3Qgc2N0cFVuaWZpZWRBYm9ydHsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7Cit9OworCitzdHJ1Y3Qgc2N0cFVuaWZpZWRBYm9ydExpZ2h0eworICBzdHJ1Y3Qgc2N0cEhlYWRlciBtaDsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7Cit9OworCitzdHJ1Y3Qgc2N0cFVuaWZpZWRBYm9ydEhlYXZ5eworICBzdHJ1Y3Qgc2N0cEhlYWRlciBtaDsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHVfaW50MTZfdCBjYXVzZUNvZGU7CisgIHVfaW50MTZfdCBjYXVzZUxlbjsKK307CisKKy8qIEZvciB0aGUgZ3JhY2VmdWwgc2h1dGRvd24gd2UgbXVzdCBjYXJyeQorICogdGhlIHRhZyAoaW4gY29tbW9uIGhlYWRlcikgIGFuZCB0aGUgaGlnaGVzdCBjb25zZXF1aXRpdmUgYWNraW5nIHZhbHVlCisgKi8KK3N0cnVjdCBzY3RwU2h1dGRvd24geworICB1X2ludDMyX3QgVFNOX1NlZW47Cit9OworCitzdHJ1Y3Qgc2N0cFVuaWZpZWRTaHV0ZG93bnsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHN0cnVjdCBzY3RwU2h1dGRvd24gc2h1dDsKK307CisKKy8qIGluIHRoZSB1bmlmaWVkIG1lc3NhZ2Ugd2UgYWRkIHRoZSB0cmFpbGluZworICogc3RyZWFtIGlkIHNpbmNlIGl0IGlzIHRoZSBvbmx5IG1lc3NhZ2UKKyAqIHRoYXQgaXMgZGVmaW5lZCBhcyBhIG9wZXJhdGlvbiBlcnJvci4KKyAqLworc3RydWN0IHNjdHBPcEVycm9yQ2F1c2V7CisgIHVfaW50MTZfdCBjYXVzZTsKKyAgdV9pbnQxNl90IGNhdXNlTGVuOworfTsKKworc3RydWN0IHNjdHBVbmlmaWVkT3BFcnJvcnsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHN0cnVjdCBzY3RwT3BFcnJvckNhdXNlIGM7Cit9OworCitzdHJ1Y3Qgc2N0cFVuaWZpZWRTdHJlYW1FcnJvcnsKKyAgc3RydWN0IHNjdHBIZWFkZXIgbWg7CisgIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIHVoOworICBzdHJ1Y3Qgc2N0cE9wRXJyb3JDYXVzZSBjOworICB1X2ludDE2X3Qgc3RybU51bTsKKyAgdV9pbnQxNl90IHJlc2VydmVkOworfTsKKworc3RydWN0IHN0YWxlQ29va2llTXNneworICBzdHJ1Y3Qgc2N0cEhlYWRlciBtaDsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHN0cnVjdCBzY3RwT3BFcnJvckNhdXNlIGM7CisgIHVfaW50MzJfdCBtb3JldGltZTsKK307CisKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdXNlZCBpbiBhbGwgc2VuZHMKKyAqIHdoZXJlIG5vdGhpbmcgaXMgbmVlZGVkIGV4Y2VwdCB0aGUKKyAqIGNodW5rL3R5cGUgaS5lLiBzaHV0ZG93bkFjayBBYm9ydCAqLworCitzdHJ1Y3Qgc2N0cFVuaWZpZWRTaW5nbGVNc2d7CisgIHN0cnVjdCBzY3RwSGVhZGVyIG1oOworICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKK307CisKK3N0cnVjdCBzY3RwRGF0YVBhcnR7CisgIHVfaW50MzJfdCBUU047CisgIHVfaW50MTZfdCBzdHJlYW1JZDsKKyAgdV9pbnQxNl90IHNlcXVlbmNlOworICB1X2ludDMyX3QgcGF5bG9hZHR5cGU7Cit9OworCitzdHJ1Y3Qgc2N0cFVuaWZpZWREYXRhZ3JhbXsKKyAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7CisgIHN0cnVjdCBzY3RwRGF0YVBhcnQgZHA7Cit9OworCitzdHJ1Y3Qgc2N0cEVDTl9lY2hveworICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKKyAgdV9pbnQzMl90IExvd2VzdF9UU047Cit9OworCisKK3N0cnVjdCBzY3RwQ1dSeworICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKKyAgdV9pbnQzMl90IFRTTl9yZWR1Y2VkX2F0OworfTsKKworI2lmZGVmCV9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZW5kLWFjay5hd2sgYi9zZW5kLWFjay5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1YjdjMgotLS0gL2Rldi9udWxsCisrKyBiL3NlbmQtYWNrLmF3awpAQCAtMCwwICsxLDY4IEBACitCRUdJTgl7CisJIyB3ZSBuZWVkIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBwYWNrZXQgdG8gZG8gdGhlIG91dHB1dAorCSMgaW4gcGFja2V0IG51bWJlcnMgcmF0aGVyIHRoYW4gYnl0ZSBudW1iZXJzLgorCWlmIChwYWNrZXRzaXplIDw9IDApCisJCXBhY2tldHNpemUgPSA1MTIKKwlleHBlY3ROZXh0ID0gMQorCWxhc3R3aW4gPSAtMQorCX0KKwl7CisJIyBjb252ZXJ0IHRjcCB0cmFjZSB0byBzZW5kL2FjayBmb3JtLgorCW4gPSBzcGxpdCAoJDEsdCwiOiIpCisJdGltID0gdFsxXSozNjAwICsgdFsyXSo2MCArIHRbM10KKwlpZiAoTlIgPD0gMSkgeworCQl0emVybyA9IHRpbQorCQlsdGltID0gdGltCisJCU9GUyA9ICJcdCIKKwl9CisJaWYgKCQ2ICE9ICJhY2siKSB7CisJCSMgd2UgaGF2ZSBhIGRhdGEgcGFja2V0IHJlY29yZDoKKwkJIyBpZ25vcmUgZ3V5cyB3aXRoIHN5biwgZmluIG9yIHJlc2V0ICdjYXVzZSB3ZQorCQkjIGNhbid0IGhhbmRsZSB0aGVpciBzZXF1ZW5jZSBudW1iZXJzLiAgVHJ5IHRvCisJCSMgZGV0ZWN0IGFuZCBhZGQgYSBmbGFnIGNoYXJhY3RlciBmb3IgJ2Fub21hbGllcyc6CisJCSMgICAqIC0+IHJlLXNlbnQgcGFja2V0CisJCSMgICAtIC0+IHBhY2tldCBhZnRlciBob2xlIChtaXNzaW5nIHBhY2tldChzKSkKKwkJIyAgICMgLT4gb2RkIHNpemUgcGFja2V0CisJCWlmICgkNSAhfiAvW1NGUl0vKSB7CisJCQlpID0gaW5kZXgoJDYsIjoiKQorCQkJaiA9IGluZGV4KCQ2LCIoIikKKwkJCXN0cnRTZXEgPSBzdWJzdHIoJDYsMSxpLTEpCisJCQllbmRTZXEgPSBzdWJzdHIoJDYsaSsxLGotaS0xKQorCQkJbGVuID0gZW5kU2VxIC0gc3RydFNlcQorCQkJaWQgPSBlbmRTZXEKKwkJCWlmICghIHRpbWVPZltpZF0pCisJCQkJdGltZU9mW2lkXSA9IHRpbQorCQkJaWYgKGVuZFNlcSAtIGV4cGVjdE5leHQgPCAwKQorCQkJCWZsYWcgPSAiKiIKKwkJCWVsc2UgeworCQkJCWlmIChzdHJ0U2VxIC0gZXhwZWN0TmV4dCA+IDApCisJCQkJCWZsYWcgPSAiLSIKKwkJCQllbHNlIGlmIChsZW4gIT0gcGFja2V0c2l6ZSkKKwkJCQkJZmxhZyA9ICIjIgorCQkJCWVsc2UKKwkJCQkJZmxhZyA9ICIgIgorCQkJCWV4cGVjdE5leHQgPSBlbmRTZXEKKwkJCX0KKwkJCXByaW50ZiAiJTcuMmZcdCU3LjJmXHQlcyBzZW5kICVzICVkIiwgdGltLXR6ZXJvLCB0aW0tbHRpbSxcCisJCQkJZmxhZywgJDUsIHN0cnRTZXEKKwkJCWlmICgrK3RpbWVzU2VudFtpZF0gPiAxKQorCQkJCXByaW50ZiAiICAoJS4yZikgWyVkXSIsIHRpbSAtIHRpbWVPZltpZF0sIHRpbWVzU2VudFtpZF0KKwkJCWlmIChsZW4gIT0gcGFja2V0c2l6ZSkKKwkJCQlwcmludGYgIiA8JWQ+IiwgbGVuCisJCX0KKwl9IGVsc2UgeworCQlpZCA9ICQ3CisKKwkJcHJpbnRmICIlNy4yZlx0JTcuMmZcdCVzICBhY2sgJXMgJWQiLCB0aW0tdHplcm8sIHRpbS1sdGltLFwKKwkJCWZsYWcsICQ1LCBpZAorCQlpZiAoJDkgIT0gbGFzdHdpbikgeworCQkJcHJpbnRmICIgIHdpbiAlZCIsICQ5CisJCQlsYXN0d2luID0gJDkKKwkJfQorCQlwcmludGYgIiAgKCUuMmYpIiwgdGltIC0gdGltZU9mW2lkXQorCQlpZiAoKyt0aW1lc0Fja2VkW2lkXSA+IDEpCisJCQlwcmludGYgIiBbJWRdIiwgdGltZXNBY2tlZFtpZF0KKwl9CisJcHJpbnRmICJcbiIKKwlsdGltID0gdGltCisJfQpkaWZmIC0tZ2l0IGEvc2V0c2lnbmFsLmMgYi9zZXRzaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI4Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0c2lnbmFsLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NldHNpZ25hbC5jLHYgMS4xMSAyMDAzLzExLzE2IDA5OjM2OjQyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNldHNpZ25hbC5oIgorCisvKgorICogQW4gT1MtaW5kZXBlbmRlbnQgc2lnbmFsKCkgd2l0aCwgd2hlbmV2ZXIgcG9zc2libGUsIHBhcnRpYWwgQlNECisgKiBzZW1hbnRpY3MsIGkuZS4gdGhlIHNpZ25hbCBoYW5kbGVyIGlzIHJlc3RvcmVkIGZvbGxvd2luZyBzZXJ2aWNlCisgKiBvZiB0aGUgc2lnbmFsLCBidXQgc3lzdGVtIGNhbGxzIGFyZSAqbm90KiByZXN0YXJ0ZWQsIHNvIHRoYXQgaWYKKyAqICJwY2FwX2JyZWFrbG9vcCgpIiBpcyBjYWxsZWQgaW4gYSBzaWduYWwgaGFuZGxlciBpbiBhIGxpdmUgY2FwdHVyZSwKKyAqIHRoZSByZWFkL3JlY3Zmcm9tL3doYXRldmVyIGluIHRoZSBsaXZlIGNhcHR1cmUgZG9lc24ndCBnZXQgcmVzdGFydGVkLAorICogaXQgcmV0dXJucyAtMSBhbmQgc2V0cyAiZXJybm8iIHRvIEVJTlRSLCBzbyB3ZSBjYW4gYnJlYWsgb3V0IG9mIHRoZQorICogbGl2ZSBjYXB0dXJlIGxvb3AuCisgKgorICogV2UgdXNlICJzaWdhY3Rpb24oKSIgaWYgYXZhaWxhYmxlLiAgV2UgZG9uJ3Qgc3BlY2lmeSB0aGF0IHRoZSBzaWduYWwKKyAqIHNob3VsZCByZXN0YXJ0IHN5c3RlbSBjYWxscywgc28gdGhhdCBzaG91bGQgYWx3YXlzIGRvIHdoYXQgd2Ugd2FudC4KKyAqCisgKiBPdGhlcndpc2UsIGlmICJzaWdzZXQoKSIgaXMgYXZhaWxhYmxlLCBpdCBwcm9iYWJseSBoYXMgQlNEIHNlbWFudGljcworICogd2hpbGUgInNpZ25hbCgpIiBoYXMgdHJhZGl0aW9uYWwgc2VtYW50aWNzLCBzbyB3ZSB1c2UgInNpZ3NldCgpIjsgaXQKKyAqIG1pZ2h0IGNhdXNlIHN5c3RlbSBjYWxscyB0byBiZSByZXN0YXJ0ZWQgZm9yIHRoZSBzaWduYWwsIGhvd2V2ZXIuCisgKiBJIGRvbid0IGtub3cgd2hldGhlciwgaW4gYW55IHN5c3RlbXMgd2hlcmUgaXQgZGlkIGNhdXNlIHN5c3RlbSBjYWxscyB0bworICogYmUgcmVzdGFydGVkLCB0aGVyZSB3YXMgYSB3YXkgdG8gYXNrIGl0IG5vdCB0byBkbyBzbzsgdGhlcmUgbWF5IG5vCisgKiBsb25nZXIgYmUgYW55IGludGVyZXN0aW5nIHN5c3RlbXMgd2l0aG91dCAic2lnYWN0aW9uKCkiLCBob3dldmVyLAorICogYW5kLCBpZiB0aGVyZSBhcmUsIHRoZXkgbWlnaHQgaGF2ZSAic2lndmVjKCkiIHdpdGggU1ZfSU5URVJSVVBUCisgKiAod2hpY2ggSSB0aGluayBmaXJzdCBhcHBlYXJlZCBpbiA0LjNCU0QpLgorICoKKyAqIE90aGVyd2lzZSwgd2UgdXNlICJzaWduYWwoKSIgLSB3aGljaCBtZWFucyB3ZSBtaWdodCBnZXQgdHJhZGl0aW9uYWwKKyAqIHNlbWFudGljcywgd2hlcmVpbiBzeXN0ZW0gY2FsbHMgZG9uJ3QgZ2V0IHJlc3RhcnRlZCAqYnV0KiB0aGUKKyAqIHNpZ25hbCBoYW5kbGVyIGlzIHJlc2V0IHRvIFNJR19ERkwgYW5kIHRoZSBzaWduYWwgaXMgbm90IGJsb2NrZWQsCisgKiBzbyB0aGF0IGEgc3Vic2VxdWVudCBzaWduYWwgd291bGQga2lsbCB0aGUgcHJvY2VzcyBpbW1lZGlhdGVseS4KKyAqCisgKiBEaWQgSSBtZW50aW9uIHRoYXQgc2lnbmFscyBzdWNrPyAgQXQgbGVhc3QgaW4gUE9TSVgtY29tcGxpYW50IHN5c3RlbXMKKyAqIHRoZXkgc3VjayBmYXIgbGVzcywgYXMgdGhvc2Ugc3lzdGVtcyBoYXZlICJzaWdhY3Rpb24oKSIuCisgKi8KK1JFVFNJR1RZUEUKKygqc2V0c2lnbmFsIChpbnQgc2lnLCBSRVRTSUdUWVBFICgqZnVuYykoaW50KSkpKGludCkKK3sKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorCXN0cnVjdCBzaWdhY3Rpb24gb2xkLCBuZXc7CisKKwltZW1zZXQoJm5ldywgMCwgc2l6ZW9mKG5ldykpOworCW5ldy5zYV9oYW5kbGVyID0gZnVuYzsKKwlpZiAoc2lnYWN0aW9uKHNpZywgJm5ldywgJm9sZCkgPCAwKQorCQlyZXR1cm4gKFNJR19FUlIpOworCXJldHVybiAob2xkLnNhX2hhbmRsZXIpOworCisjZWxzZQorI2lmZGVmIEhBVkVfU0lHU0VUCisJcmV0dXJuIChzaWdzZXQoc2lnLCBmdW5jKSk7CisjZWxzZQorCXJldHVybiAoc2lnbmFsKHNpZywgZnVuYykpOworI2VuZGlmCisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvc2V0c2lnbmFsLmggYi9zZXRzaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZiMmE3Ci0tLSAvZGV2L251bGwKKysrIGIvc2V0c2lnbmFsLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc2V0c2lnbmFsLmgsdiAxLjIuMS4xIDE5OTkvMTAvMDcgMjM6NDc6MTMgbWNyIEV4cCAkIChMQkwpCisgKi8KKyNpZm5kZWYgc2V0c2lnbmFsX2gKKyNkZWZpbmUgc2V0c2lnbmFsX2gKKworUkVUU0lHVFlQRSAoKnNldHNpZ25hbChpbnQsIFJFVFNJR1RZUEUgKCopKGludCkpKShpbnQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zbGNvbXByZXNzLmggYi9zbGNvbXByZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhNTk2YwotLS0gL2Rldi9udWxsCisrKyBiL3NsY29tcHJlc3MuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogRGVmaW5pdGlvbnMgZm9yIHRjcCBjb21wcmVzc2lvbiByb3V0aW5lcy4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NsY29tcHJlc3MuaCx2IDEuMiAyMDAwLzEwLzA5IDAyOjAzOjQ0IGd1eSBFeHAgJCAoTEJMKQorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MiwgMTk5MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCisgKiBDYWxpZm9ybmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCisgKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAorICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAorICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAorICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKglWYW4gSmFjb2Jzb24gKHZhbkBlZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgorICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KKyAqLworCisvKgorICogQ29tcHJlc3NlZCBwYWNrZXQgZm9ybWF0OgorICoKKyAqIFRoZSBmaXJzdCBvY3RldCBjb250YWlucyB0aGUgcGFja2V0IHR5cGUgKHRvcCAzIGJpdHMpLCBUQ1AKKyAqICdwdXNoJyBiaXQsIGFuZCBmbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIG9mIHRoZSA0IFRDUCBzZXF1ZW5jZQorICogbnVtYmVycyBoYXZlIGNoYW5nZWQgKGJvdHRvbSA1IGJpdHMpLiAgVGhlIG5leHQgb2N0ZXQgaXMgYQorICogY29udmVyc2F0aW9uIG51bWJlciB0aGF0IGFzc29jaWF0ZXMgYSBzYXZlZCBJUC9UQ1AgaGVhZGVyIHdpdGgKKyAqIHRoZSBjb21wcmVzc2VkIHBhY2tldC4gIFRoZSBuZXh0IHR3byBvY3RldHMgYXJlIHRoZSBUQ1AgY2hlY2tzdW0KKyAqIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFncmFtLiAgVGhlIG5leHQgMCB0byAxNSBvY3RldHMgYXJlCisgKiBzZXF1ZW5jZSBudW1iZXIgY2hhbmdlcywgb25lIGNoYW5nZSBwZXIgYml0IHNldCBpbiB0aGUgaGVhZGVyCisgKiAodGhlcmUgbWF5IGJlIG5vIGNoYW5nZXMgYW5kIHRoZXJlIGFyZSB0d28gc3BlY2lhbCBjYXNlcyB3aGVyZQorICogdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkga25vd3Mgd2hhdCBjaGFuZ2VkIC0tIHNlZSBiZWxvdykuCisgKgorICogVGhlcmUgYXJlIDUgbnVtYmVycyB3aGljaCBjYW4gY2hhbmdlICh0aGV5IGFyZSBhbHdheXMgaW5zZXJ0ZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIpOiBUQ1AgdXJnZW50IHBvaW50ZXIsIHdpbmRvdywKKyAqIGFja25vd2xlZ2VtZW50LCBzZXF1ZW5jZSBudW1iZXIgYW5kIElQIElELiAgKFRoZSB1cmdlbnQgcG9pbnRlcgorICogaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVycyBpbiB0aGF0IGl0cyB2YWx1ZSBpcyBzZW50LCBub3QgdGhlCisgKiBjaGFuZ2UgaW4gdmFsdWUuKSAgU2luY2UgdHlwaWNhbCB1c2Ugb2YgU0xJUCBsaW5rcyBpcyBiaWFzZWQKKyAqIHRvd2FyZCBzbWFsbCBwYWNrZXRzIChzZWUgY29tbWVudHMgb24gTVRVL01TUyBiZWxvdyksIGNoYW5nZXMKKyAqIHVzZSBhIHZhcmlhYmxlIGxlbmd0aCBjb2Rpbmcgd2l0aCBvbmUgb2N0ZXQgZm9yIG51bWJlcnMgaW4gdGhlCisgKiByYW5nZSAxIC0gMjU1IGFuZCAzIG9jdGV0cyAoMCwgTVNCLCBMU0IpIGZvciBudW1iZXJzIGluIHRoZQorICogcmFuZ2UgMjU2IC0gNjU1MzUgb3IgMC4gIChJZiB0aGUgY2hhbmdlIGluIHNlcXVlbmNlIG51bWJlciBvcgorICogYWNrIGlzIG1vcmUgdGhhbiA2NTUzNSwgYW4gdW5jb21wcmVzc2VkIHBhY2tldCBpcyBzZW50LikKKyAqLworCisvKgorICogUGFja2V0IHR5cGVzIChtdXN0IG5vdCBjb25mbGljdCB3aXRoIElQIHByb3RvY29sIHZlcnNpb24pCisgKgorICogVGhlIHRvcCBuaWJibGUgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBwYWNrZXQgdHlwZS4gIFRoZXJlIGFyZQorICogdGhyZWUgcG9zc2libGUgdHlwZXM6IElQIChub3QgcHJvdG8gVENQIG9yIHRjcCB3aXRoIG9uZSBvZiB0aGUKKyAqIGNvbnRyb2wgZmxhZ3Mgc2V0KTsgdW5jb21wcmVzc2VkIFRDUCAoYSBub3JtYWwgSVAvVENQIHBhY2tldCBidXQKKyAqIHdpdGggdGhlIDgtYml0IHByb3RvY29sIGZpZWxkIHJlcGxhY2VkIGJ5IGFuIDgtYml0IGNvbm5lY3Rpb24gaWQgLS0KKyAqIHRoaXMgdHlwZSBvZiBwYWNrZXQgc3luY3MgdGhlIHNlbmRlciAmIHJlY2VpdmVyKTsgYW5kIGNvbXByZXNzZWQKKyAqIFRDUCAoZGVzY3JpYmVkIGFib3ZlKS4KKyAqCisgKiBMU0Igb2YgNC1iaXQgZmllbGQgaXMgVENQICJQVVNIIiBiaXQgKGEgd29ydGhsZXNzIGFuYWNocm9uaXNtKSBhbmQKKyAqIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSA0LWJpdCAiY2hhbmdlcyIgZmllbGQgdGhhdCBmb2xsb3dzLiAgVG9wCisgKiB0aHJlZSBiaXRzIGFyZSBhY3R1YWwgcGFja2V0IHR5cGUuICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICogYW5kIGluIHRoZSBpbnRlcmVzdCBvZiBjb25zZXJ2aW5nIGJpdHMsIG51bWJlcnMgYXJlIGNob3NlbiBzbyB0aGUKKyAqIElQIHByb3RvY29sIHZlcnNpb24gbnVtYmVyICg0KSB3aGljaCBub3JtYWxseSBhcHBlYXJzIGluIHRoaXMgbmliYmxlCisgKiBtZWFucyAiSVAgcGFja2V0Ii4KKyAqLworCisvKiBwYWNrZXQgdHlwZXMgKi8KKyNkZWZpbmUgVFlQRV9JUCAweDQwCisjZGVmaW5lIFRZUEVfVU5DT01QUkVTU0VEX1RDUCAweDcwCisjZGVmaW5lIFRZUEVfQ09NUFJFU1NFRF9UQ1AgMHg4MAorI2RlZmluZSBUWVBFX0VSUk9SIDB4MDAKKworLyogQml0cyBpbiBmaXJzdCBvY3RldCBvZiBjb21wcmVzc2VkIHBhY2tldCAqLworI2RlZmluZSBORVdfQwkweDQwCS8qIGZsYWcgYml0cyBmb3Igd2hhdCBjaGFuZ2VkIGluIGEgcGFja2V0ICovCisjZGVmaW5lIE5FV19JCTB4MjAKKyNkZWZpbmUgTkVXX1MJMHgwOAorI2RlZmluZSBORVdfQQkweDA0CisjZGVmaW5lIE5FV19XCTB4MDIKKyNkZWZpbmUgTkVXX1UJMHgwMQorCisvKiByZXNlcnZlZCwgc3BlY2lhbC1jYXNlIHZhbHVlcyBvZiBhYm92ZSAqLworI2RlZmluZSBTUEVDSUFMX0kgKE5FV19TfE5FV19XfE5FV19VKQkJLyogZWNob2VkIGludGVyYWN0aXZlIHRyYWZmaWMgKi8KKyNkZWZpbmUgU1BFQ0lBTF9EIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkJLyogdW5pZGlyZWN0aW9uYWwgZGF0YSAqLworI2RlZmluZSBTUEVDSUFMU19NQVNLIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkKKworI2RlZmluZSBUQ1BfUFVTSF9CSVQgMHgxMApkaWZmIC0tZ2l0IGEvc2xpcC5oIGIvc2xpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGYzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zbGlwLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIERlZmluaXRpb25zIHRoYXQgdXNlciBsZXZlbCBwcm9ncmFtcyBtaWdodCBuZWVkIHRvIGtub3cgdG8gaW50ZXJhY3QKKyAqIHdpdGggc2VyaWFsIGxpbmUgSVAgKHNsaXApIGxpbmVzLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc2xpcC5oLHYgMS4xIDIwMDAvMTAvMDkgMDE6NTM6MjEgZ3V5IEV4cCAkCisgKgorICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qCisgKiBkZWZpbml0aW9ucyBvZiB0aGUgcHNldWRvLSBsaW5rLWxldmVsIGhlYWRlciBhdHRhY2hlZCB0byBzbGlwCisgKiBwYWNrZXRzIGdyYWJiZWQgYnkgdGhlIHBhY2tldCBmaWx0ZXIgKGJwZikgdHJhZmZpYyBtb25pdG9yLgorICovCisjZGVmaW5lIFNMSVBfSERSTEVOIDE2CisKKyNkZWZpbmUgU0xYX0RJUiAwCisjZGVmaW5lIFNMWF9DSERSIDEKKyNkZWZpbmUgQ0hEUl9MRU4gMTUKKworI2RlZmluZSBTTElQRElSX0lOIDAKKyNkZWZpbmUgU0xJUERJUl9PVVQgMQpkaWZmIC0tZ2l0IGEvc2xsLmggYi9zbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTNmMDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2xsLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBTdGFuZm9yZC9DTVUgZW5ldCBwYWNrZXQgZmlsdGVyLAorICogKG5ldC9lbmV0LmMpIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgNC4zQlNELCBhbmQgY29kZSBjb250cmlidXRlZAorICogdG8gQmVya2VsZXkgYnkgU3RldmVuIE1jQ2FubmUgYW5kIFZhbiBKYWNvYnNvbiBib3RoIG9mIExhd3JlbmNlCisgKiBCZXJrZWxleSBMYWJvcmF0b3J5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc2xsLmgsdiAxLjcgMjAwMi8xMi8xMSAwNzoxNDoxMSBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogRm9yIGNhcHR1cmVzIG9uIExpbnV4IGNvb2tlZCBzb2NrZXRzLCB3ZSBjb25zdHJ1Y3QgYSBmYWtlIGhlYWRlcgorICogdGhhdCBpbmNsdWRlczoKKyAqCisgKglhIDItYnl0ZSAicGFja2V0IHR5cGUiIHdoaWNoIGlzIG9uZSBvZjoKKyAqCisgKgkJTElOVVhfU0xMX0hPU1QJCXBhY2tldCB3YXMgc2VudCB0byB1cworICoJCUxJTlVYX1NMTF9CUk9BRENBU1QJcGFja2V0IHdhcyBicm9hZGNhc3QKKyAqCQlMSU5VWF9TTExfTVVMVElDQVNUCXBhY2tldCB3YXMgbXVsdGljYXN0CisgKgkJTElOVVhfU0xMX09USEVSSE9TVAlwYWNrZXQgd2FzIHNlbnQgdG8gc29tZWJvZHkgZWxzZQorICoJCUxJTlVYX1NMTF9PVVRHT0lORwlwYWNrZXQgd2FzIHNlbnQgKmJ5KiB1czsKKyAqCisgKglhIDItYnl0ZSBFdGhlcm5ldCBwcm90b2NvbCBmaWVsZDsKKyAqCisgKglhIDItYnl0ZSBsaW5rLWxheWVyIHR5cGU7CisgKgorICoJYSAyLWJ5dGUgbGluay1sYXllciBhZGRyZXNzIGxlbmd0aDsKKyAqCisgKglhbiA4LWJ5dGUgc291cmNlIGxpbmstbGF5ZXIgYWRkcmVzcywgd2hvc2UgYWN0dWFsIGxlbmd0aCBpcworICoJc3BlY2lmaWVkIGJ5IHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAqCisgKiBBbGwgZmllbGRzIGV4Y2VwdCBmb3IgdGhlIGxpbmstbGF5ZXIgYWRkcmVzcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorICoKKyAqIERPIE5PVCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSwgb3IgY2hhbmdlIGFueSBvZiB0aGUKKyAqIExJTlVYX1NMTF8gdmFsdWVzIGJlbG93LiAgSWYgeW91IG11c3QgY2hhbmdlIHRoZSBsaW5rLWxheWVyIGhlYWRlcgorICogZm9yIGEgImNvb2tlZCIgTGludXggY2FwdHVyZSwgaW50cm9kdWNlIGEgbmV3IERMVF8gdHlwZSAoYXNrCisgKiAidGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIiBmb3Igb25lLCBzbyB0aGF0IHlvdSBkb24ndCBnaXZlIGl0IGEKKyAqIHZhbHVlIHRoYXQgY29sbGlkZXMgd2l0aCBhIHZhbHVlIGFscmVhZHkgYmVpbmcgdXNlZCksIGFuZCB1c2UgdGhlCisgKiBuZXcgaGVhZGVyIGluIGNhcHR1cmVzIG9mIHRoYXQgdHlwZSwgc28gdGhhdCBwcm9ncmFtcyB0aGF0IGNhbgorICogaGFuZGxlIERMVF9MSU5VWF9TTEwgY2FwdHVyZXMgd2lsbCBjb250aW51ZSB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkKKyAqIHdpdGhvdXQgYW55IGNoYW5nZSwgYW5kIHNvIHRoYXQgY2FwdHVyZSBmaWxlcyB3aXRoIGRpZmZlcmVudCBoZWFkZXJzCisgKiBjYW4gYmUgdG9sZCBhcGFydCBhbmQgcHJvZ3JhbXMgdGhhdCByZWFkIHRoZW0gY2FuIGRpc3NlY3QgdGhlCisgKiBwYWNrZXRzIGluIHRoZW0uCisgKgorICogVGhpcyBzdHJ1Y3R1cmUsIGFuZCB0aGUgI2RlZmluZXMgYmVsb3csIG11c3QgYmUgdGhlIHNhbWUgaW4gdGhlCisgKiBsaWJwY2FwIGFuZCB0Y3BkdW1wIHZlcnNpb25zIG9mICJzbGwuaCIuCisgKi8KKworLyoKKyAqIEEgRExUX0xJTlVYX1NMTCBmYWtlIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCisjZGVmaW5lIFNMTF9IRFJfTEVOCTE2CQkvKiB0b3RhbCBoZWFkZXIgbGVuZ3RoICovCisjZGVmaW5lIFNMTF9BRERSTEVOCTgJCS8qIGxlbmd0aCBvZiBhZGRyZXNzIGZpZWxkICovCisKK3N0cnVjdCBzbGxfaGVhZGVyIHsKKwl1X2ludDE2X3QJc2xsX3BrdHR5cGU7CS8qIHBhY2tldCB0eXBlICovCisJdV9pbnQxNl90CXNsbF9oYXR5cGU7CS8qIGxpbmstbGF5ZXIgYWRkcmVzcyB0eXBlICovCisJdV9pbnQxNl90CXNsbF9oYWxlbjsJLyogbGluay1sYXllciBhZGRyZXNzIGxlbmd0aCAqLworCXVfaW50OF90CXNsbF9hZGRyW1NMTF9BRERSTEVOXTsJLyogbGluay1sYXllciBhZGRyZXNzICovCisJdV9pbnQxNl90CXNsbF9wcm90b2NvbDsJLyogcHJvdG9jb2wgKi8KK307CisKKy8qCisgKiBUaGUgTElOVVhfU0xMXyB2YWx1ZXMgZm9yICJzbGxfcGt0dHlwZSI7IHRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlCisgKiBQQUNLRVRfIHZhbHVlcyBvbiBMaW51eCwgYnV0IGFyZSBkZWZpbmVkIGhlcmUgc28gdGhhdCB0aGV5J3JlCisgKiBhdmFpbGFibGUgZXZlbiBvbiBzeXN0ZW1zIG90aGVyIHRoYW4gTGludXgsIGFuZCBzbyB0aGF0IHRoZXkKKyAqIGRvbid0IGNoYW5nZSBldmVuIGlmIHRoZSBQQUNLRVRfIHZhbHVlcyBjaGFuZ2UuCisgKi8KKyNkZWZpbmUgTElOVVhfU0xMX0hPU1QJCTAKKyNkZWZpbmUgTElOVVhfU0xMX0JST0FEQ0FTVAkxCisjZGVmaW5lIExJTlVYX1NMTF9NVUxUSUNBU1QJMgorI2RlZmluZSBMSU5VWF9TTExfT1RIRVJIT1NUCTMKKyNkZWZpbmUgTElOVVhfU0xMX09VVEdPSU5HCTQKKworLyoKKyAqIFRoZSBMSU5VWF9TTExfIHZhbHVlcyBmb3IgInNsbF9wcm90b2NvbCI7IHRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlCisgKiBFVEhfUF8gdmFsdWVzIG9uIExpbnV4LCBidXQgYXJlIGRlZmluZWQgaGVyZSBzbyB0aGF0IHRoZXkncmUKKyAqIGF2YWlsYWJsZSBldmVuIG9uIHN5c3RlbXMgb3RoZXIgdGhhbiBMaW51eC4gIFdlIGFzc3VtZSwgZm9yIG5vdywKKyAqIHRoYXQgdGhlIEVUSF9QXyB2YWx1ZXMgd29uJ3QgY2hhbmdlIGluIExpbnV4OyBpZiB0aGV5IGRvLCB0aGVuOgorICoKKyAqCWlmIHdlIGRvbid0IHRyYW5zbGF0ZSB0aGVtIGluICJwY2FwLWxpbnV4LmMiLCBjYXB0dXJlIGZpbGVzCisgKgl3b24ndCBuZWNlc3NhcmlseSBiZSByZWFkYWJsZSBpZiBjYXB0dXJlZCBvbiBhIHN5c3RlbSB0aGF0CisgKglkZWZpbmVzIEVUSF9QXyB2YWx1ZXMgdGhhdCBkb24ndCBtYXRjaCB0aGVzZSB2YWx1ZXM7CisgKgorICoJaWYgd2UgZG8gdHJhbnNsYXRlIHRoZW0gaW4gInBjYXAtbGludXguYyIsIHRoYXQgbWFrZXMgbGlmZQorICoJdW5wbGVhc2FudCBmb3IgdGhlIEJQRiBjb2RlIGdlbmVyYXRvciwgYXMgdGhlIHZhbHVlcyB5b3UgdGVzdAorICoJZm9yIGluIHRoZSBrZXJuZWwgYXJlbid0IHRoZSB2YWx1ZXMgdGhhdCB5b3UgdGVzdCBmb3Igd2hlbgorICoJcmVhZGluZyBhIGNhcHR1cmUgZmlsZSwgc28gdGhlIGZpeHVwIGNvZGUgcnVuIG9uIEJQRiBwcm9ncmFtcworICoJaGFuZGVkIHRvIHRoZSBrZXJuZWwgZW5kcyB1cCBoYXZpbmcgdG8gZG8gbW9yZSB3b3JrLgorICoKKyAqIEFkZCBvdGhlciB2YWx1ZXMgaGVyZSBhcyBuZWNlc3NhcnksIGZvciBoYW5kbGluZyBwYWNrZXQgdHlwZXMgdGhhdAorICogbWlnaHQgc2hvdyB1cCBvbiBub24tRXRoZXJuZXQsIG5vbi04MDIueCBuZXR3b3Jrcy4gIChOb3QgYWxsIHRoZSBvbmVzCisgKiBpbiB0aGUgTGludXggImlmX2V0aGVyLmgiIHdpbGwsIEkgc3VzcGVjdCwgYWN0dWFsbHkgc2hvdyB1cCBpbgorICogY2FwdHVyZXMuKQorICovCisjZGVmaW5lIExJTlVYX1NMTF9QXzgwMl8zCTB4MDAwMQkvKiBOb3ZlbGwgODAyLjMgZnJhbWVzIHdpdGhvdXQgODAyLjIgTExDIGhlYWRlciAqLworI2RlZmluZSBMSU5VWF9TTExfUF84MDJfMgkweDAwMDQJLyogODAyLjIgZnJhbWVzIChub3QgRC9JL1ggRXRoZXJuZXQpICovCmRpZmYgLS1naXQgYS9zbWIuaCBiL3NtYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDUyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zbWIuaApAQCAtMCwwICsxLDEyMiBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zbWIuaCx2IDEuOSAyMDA0LzEyLzI4IDIyOjI5OjQ0IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTUtMTk5OQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdGhlIEdOVSBHUEwgdmVyc2lvbiAyCisgKiBvciBsYXRlcgorICovCisKKyNkZWZpbmUgU01CTUlOKGEsYikgKChhKTwoYik/KGEpOihiKSkKKworLyogdGhlIGNvbXBsZXRlICovCisjZGVmaW5lIFNNQm1rZGlyICAgICAgMHgwMCAgIC8qIGNyZWF0ZSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgU01Ccm1kaXIgICAgICAweDAxICAgLyogZGVsZXRlIGRpcmVjdG9yeSAqLworI2RlZmluZSBTTUJvcGVuICAgICAgIDB4MDIgICAvKiBvcGVuIGZpbGUgKi8KKyNkZWZpbmUgU01CY3JlYXRlICAgICAweDAzICAgLyogY3JlYXRlIGZpbGUgKi8KKyNkZWZpbmUgU01CY2xvc2UgICAgICAweDA0ICAgLyogY2xvc2UgZmlsZSAqLworI2RlZmluZSBTTUJmbHVzaCAgICAgIDB4MDUgICAvKiBmbHVzaCBmaWxlICovCisjZGVmaW5lIFNNQnVubGluayAgICAgMHgwNiAgIC8qIGRlbGV0ZSBmaWxlICovCisjZGVmaW5lIFNNQm12ICAgICAgICAgMHgwNyAgIC8qIHJlbmFtZSBmaWxlICovCisjZGVmaW5lIFNNQmdldGF0ciAgICAgMHgwOCAgIC8qIGdldCBmaWxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgU01Cc2V0YXRyICAgICAweDA5ICAgLyogc2V0IGZpbGUgYXR0cmlidXRlcyAqLworI2RlZmluZSBTTUJyZWFkICAgICAgIDB4MEEgICAvKiByZWFkIGZyb20gZmlsZSAqLworI2RlZmluZSBTTUJ3cml0ZSAgICAgIDB4MEIgICAvKiB3cml0ZSB0byBmaWxlICovCisjZGVmaW5lIFNNQmxvY2sgICAgICAgMHgwQyAgIC8qIGxvY2sgYnl0ZSByYW5nZSAqLworI2RlZmluZSBTTUJ1bmxvY2sgICAgIDB4MEQgICAvKiB1bmxvY2sgYnl0ZSByYW5nZSAqLworI2RlZmluZSBTTUJjdGVtcCAgICAgIDB4MEUgICAvKiBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgKi8KKyNkZWZpbmUgU01CbWtuZXcgICAgICAweDBGICAgLyogbWFrZSBuZXcgZmlsZSAqLworI2RlZmluZSBTTUJjaGtwdGggICAgIDB4MTAgICAvKiBjaGVjayBkaXJlY3RvcnkgcGF0aCAqLworI2RlZmluZSBTTUJleGl0ICAgICAgIDB4MTEgICAvKiBwcm9jZXNzIGV4aXQgKi8KKyNkZWZpbmUgU01CbHNlZWsgICAgICAweDEyICAgLyogc2VlayAqLworI2RlZmluZSBTTUJ0Y29uICAgICAgIDB4NzAgICAvKiB0cmVlIGNvbm5lY3QgKi8KKyNkZWZpbmUgU01CdGNvblggICAgICAweDc1ICAgLyogdHJlZSBjb25uZWN0IGFuZCBYKi8KKyNkZWZpbmUgU01CdGRpcyAgICAgICAweDcxICAgLyogdHJlZSBkaXNjb25uZWN0ICovCisjZGVmaW5lIFNNQm5lZ3Byb3QgICAgMHg3MiAgIC8qIG5lZ290aWF0ZSBwcm90b2NvbCAqLworI2RlZmluZSBTTUJkc2thdHRyICAgIDB4ODAgICAvKiBnZXQgZGlzayBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNNQnNlYXJjaCAgICAgMHg4MSAgIC8qIHNlYXJjaCBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgU01Cc3Bsb3BlbiAgICAweEMwICAgLyogb3BlbiBwcmludCBzcG9vbCBmaWxlICovCisjZGVmaW5lIFNNQnNwbHdyICAgICAgMHhDMSAgIC8qIHdyaXRlIHRvIHByaW50IHNwb29sIGZpbGUgKi8KKyNkZWZpbmUgU01Cc3BsY2xvc2UgICAweEMyICAgLyogY2xvc2UgcHJpbnQgc3Bvb2wgZmlsZSAqLworI2RlZmluZSBTTUJzcGxyZXRxICAgIDB4QzMgICAvKiByZXR1cm4gcHJpbnQgcXVldWUgKi8KKyNkZWZpbmUgU01Cc2VuZHMgICAgICAweEQwICAgLyogc2VuZCBzaW5nbGUgYmxvY2sgbWVzc2FnZSAqLworI2RlZmluZSBTTUJzZW5kYiAgICAgIDB4RDEgICAvKiBzZW5kIGJyb2FkY2FzdCBtZXNzYWdlICovCisjZGVmaW5lIFNNQmZ3ZG5hbWUgICAgMHhEMiAgIC8qIGZvcndhcmQgdXNlciBuYW1lICovCisjZGVmaW5lIFNNQmNhbmNlbGYgICAgMHhEMyAgIC8qIGNhbmNlbCBmb3J3YXJkICovCisjZGVmaW5lIFNNQmdldG1hYyAgICAgMHhENCAgIC8qIGdldCBtYWNoaW5lIG5hbWUgKi8KKyNkZWZpbmUgU01Cc2VuZHN0cnQgICAweEQ1ICAgLyogc2VuZCBzdGFydCBvZiBtdWx0aS1ibG9jayBtZXNzYWdlICovCisjZGVmaW5lIFNNQnNlbmRlbmQgICAgMHhENiAgIC8qIHNlbmQgZW5kIG9mIG11bHRpLWJsb2NrIG1lc3NhZ2UgKi8KKyNkZWZpbmUgU01Cc2VuZHR4dCAgICAweEQ3ICAgLyogc2VuZCB0ZXh0IG9mIG11bHRpLWJsb2NrIG1lc3NhZ2UgKi8KKworLyogQ29yZSsgcHJvdG9jb2wgKi8KKyNkZWZpbmUgU01CbG9ja3JlYWQJICAweDEzICAgLyogTG9jayBhIHJhbmdlIGFuZCByZWFkICovCisjZGVmaW5lIFNNQndyaXRldW5sb2NrIDB4MTQgLyogVW5sb2NrIGEgcmFuZ2UgdGhlbiB3cml0ZSAqLworI2RlZmluZSBTTUJyZWFkYnJhdyAgIDB4MWEgIC8qIHJlYWQgYSBibG9jayBvZiBkYXRhIHdpdGggbm8gc21iIGhlYWRlciAqLworI2RlZmluZSBTTUJ3cml0ZWJyYXcgIDB4MWQgIC8qIHdyaXRlIGEgYmxvY2sgb2YgZGF0YSB3aXRoIG5vIHNtYiBoZWFkZXIgKi8KKyNkZWZpbmUgU01Cd3JpdGVjICAgICAweDIwICAvKiBzZWNvbmRhcnkgd3JpdGUgcmVxdWVzdCAqLworI2RlZmluZSBTTUJ3cml0ZWNsb3NlIDB4MmMgIC8qIHdyaXRlIGEgZmlsZSB0aGVuIGNsb3NlIGl0ICovCisKKy8qIGRvcyBleHRlbmRlZCBwcm90b2NvbCAqLworI2RlZmluZSBTTUJyZWFkQnJhdyAgICAgIDB4MUEgICAvKiByZWFkIGJsb2NrIHJhdyAqLworI2RlZmluZSBTTUJyZWFkQm1weCAgICAgIDB4MUIgICAvKiByZWFkIGJsb2NrIG11bHRpcGxleGVkICovCisjZGVmaW5lIFNNQnJlYWRCcyAgICAgICAgMHgxQyAgIC8qIHJlYWQgYmxvY2sgKHNlY29uZGFyeSByZXNwb25zZSkgKi8KKyNkZWZpbmUgU01Cd3JpdGVCcmF3ICAgICAweDFEICAgLyogd3JpdGUgYmxvY2sgcmF3ICovCisjZGVmaW5lIFNNQndyaXRlQm1weCAgICAgMHgxRSAgIC8qIHdyaXRlIGJsb2NrIG11bHRpcGxleGVkICovCisjZGVmaW5lIFNNQndyaXRlQnMgICAgICAgMHgxRiAgIC8qIHdyaXRlIGJsb2NrIChzZWNvbmRhcnkgcmVxdWVzdCkgKi8KKyNkZWZpbmUgU01Cd3JpdGVDICAgICAgICAweDIwICAgLyogd3JpdGUgY29tcGxldGUgcmVzcG9uc2UgKi8KKyNkZWZpbmUgU01Cc2V0YXR0ckUgICAgICAweDIyICAgLyogc2V0IGZpbGUgYXR0cmlidXRlcyBleHBhbmRlZCAqLworI2RlZmluZSBTTUJnZXRhdHRyRSAgICAgIDB4MjMgICAvKiBnZXQgZmlsZSBhdHRyaWJ1dGVzIGV4cGFuZGVkICovCisjZGVmaW5lIFNNQmxvY2tpbmdYICAgICAgMHgyNCAgIC8qIGxvY2svdW5sb2NrIGJ5dGUgcmFuZ2VzIGFuZCBYICovCisjZGVmaW5lIFNNQnRyYW5zICAgICAgICAgMHgyNSAgIC8qIHRyYW5zYWN0aW9uIC0gbmFtZSwgYnl0ZXMgaW4vb3V0ICovCisjZGVmaW5lIFNNQnRyYW5zcyAgICAgICAgMHgyNiAgIC8qIHRyYW5zYWN0aW9uIChzZWNvbmRhcnkgcmVxdWVzdC9yZXNwb25zZSkgKi8KKyNkZWZpbmUgU01CaW9jdGwgICAgICAgICAweDI3ICAgLyogSU9DVEwgKi8KKyNkZWZpbmUgU01CaW9jdGxzICAgICAgICAweDI4ICAgLyogSU9DVEwgIChzZWNvbmRhcnkgcmVxdWVzdC9yZXNwb25zZSkgKi8KKyNkZWZpbmUgU01CY29weSAgICAgICAgICAweDI5ICAgLyogY29weSAqLworI2RlZmluZSBTTUJtb3ZlICAgICAgICAgIDB4MkEgICAvKiBtb3ZlICovCisjZGVmaW5lIFNNQmVjaG8gICAgICAgICAgMHgyQiAgIC8qIGVjaG8gKi8KKyNkZWZpbmUgU01Cb3BlblggICAgICAgICAweDJEICAgLyogb3BlbiBhbmQgWCAqLworI2RlZmluZSBTTUJyZWFkWCAgICAgICAgIDB4MkUgICAvKiByZWFkIGFuZCBYICovCisjZGVmaW5lIFNNQndyaXRlWCAgICAgICAgMHgyRiAgIC8qIHdyaXRlIGFuZCBYICovCisjZGVmaW5lIFNNQnNlc3NzZXR1cFggICAgMHg3MyAgIC8qIFNlc3Npb24gU2V0IFVwICYgWCAoaW5jbHVkaW5nIFVzZXIgTG9nb24pICovCisjZGVmaW5lIFNNQmZmaXJzdCAgICAgICAgMHg4MiAgIC8qIGZpbmQgZmlyc3QgKi8KKyNkZWZpbmUgU01CZnVuaXF1ZSAgICAgICAweDgzICAgLyogZmluZCB1bmlxdWUgKi8KKyNkZWZpbmUgU01CZmNsb3NlICAgICAgICAweDg0ICAgLyogZmluZCBjbG9zZSAqLworI2RlZmluZSBTTUJpbnZhbGlkICAgICAgIDB4RkUgICAvKiBpbnZhbGlkIGNvbW1hbmQgKi8KKworLyogRXh0ZW5kZWQgMi4wIHByb3RvY29sICovCisjZGVmaW5lIFNNQnRyYW5zMiAgICAgICAgMHgzMiAgIC8qIFRSQU5TMiBwcm90b2NvbCBzZXQgKi8KKyNkZWZpbmUgU01CdHJhbnNzMiAgICAgICAweDMzICAgLyogVFJBTlMyIHByb3RvY29sIHNldCwgc2Vjb25kYXJ5IGNvbW1hbmQgKi8KKyNkZWZpbmUgU01CZmluZGNsb3NlICAgICAweDM0ICAgLyogVGVybWluYXRlIGEgVFJBTlNBQ1QyX0ZJTkRGSVJTVCAqLworI2RlZmluZSBTTUJmaW5kbmNsb3NlICAgIDB4MzUgICAvKiBUZXJtaW5hdGUgYSBUUkFOU0FDVDJfRklORE5PVElGWUZJUlNUICovCisjZGVmaW5lIFNNQnVsb2dvZmZYICAgICAgMHg3NCAgIC8qIHVzZXIgbG9nb2ZmICovCisKKy8qIE5UIFNNQiBleHRlbnNpb25zLiAqLworI2RlZmluZSBTTUJudHRyYW5zICAgICAgIDB4QTAgICAvKiBOVCB0cmFuc2FjdCAqLworI2RlZmluZSBTTUJudHRyYW5zcyAgICAgIDB4QTEgICAvKiBOVCB0cmFuc2FjdCBzZWNvbmRhcnkgKi8KKyNkZWZpbmUgU01CbnRjcmVhdGVYICAgICAweEEyICAgLyogTlQgY3JlYXRlIGFuZCBYICovCisjZGVmaW5lIFNNQm50Y2FuY2VsICAgICAgMHhBNCAgIC8qIE5UIGNhbmNlbCAqLworCisvKiBwYXRod29ya3Mgc3BlY2lhbCAqLworI2RlZmluZSBwU0VURElSICdcMzc3JworCisKKy8qIHRoZXNlIGFyZSB0aGUgVFJBTlMyIHN1YiBjb21tYW5kcyAqLworI2RlZmluZSBUUkFOU0FDVDJfT1BFTiAgICAgICAgICAwCisjZGVmaW5lIFRSQU5TQUNUMl9GSU5ERklSU1QgICAgIDEKKyNkZWZpbmUgVFJBTlNBQ1QyX0ZJTkRORVhUICAgICAgMgorI2RlZmluZSBUUkFOU0FDVDJfUUZTSU5GTyAgICAgICAzCisjZGVmaW5lIFRSQU5TQUNUMl9TRVRGU0lORk8gICAgIDQKKyNkZWZpbmUgVFJBTlNBQ1QyX1FQQVRISU5GTyAgICAgNQorI2RlZmluZSBUUkFOU0FDVDJfU0VUUEFUSElORk8gICA2CisjZGVmaW5lIFRSQU5TQUNUMl9RRklMRUlORk8gICAgIDcKKyNkZWZpbmUgVFJBTlNBQ1QyX1NFVEZJTEVJTkZPICAgOAorI2RlZmluZSBUUkFOU0FDVDJfRlNDVEwgICAgICAgICA5CisjZGVmaW5lIFRSQU5TQUNUMl9JT0NUTCAgICAgICAgICAgMTAKKyNkZWZpbmUgVFJBTlNBQ1QyX0ZJTkROT1RJRllGSVJTVCAxMQorI2RlZmluZSBUUkFOU0FDVDJfRklORE5PVElGWU5FWFQgIDEyCisjZGVmaW5lIFRSQU5TQUNUMl9NS0RJUiAgICAgICAgICAgMTMKKworI2RlZmluZSBQVFJfRElGRihwMSwgcDIpICgoc2l6ZV90KSgoKGNoYXIgKikocDEpKSAtIChjaGFyICopKHAyKSkpCisKKy8qIHNvbWUgcHJvdG9zICovCitjb25zdCB1X2NoYXIgKnNtYl9mZGF0YShjb25zdCB1X2NoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL3NtYnV0aWwuYyBiL3NtYnV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJjYjRjCi0tLSAvZGV2L251bGwKKysrIGIvc21idXRpbC5jCkBAIC0wLDAgKzEsMTg4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTUtMTk5OQorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdGhlIEdOVSBHUEwgdmVyc2lvbiAyCisgKiBvciBsYXRlcgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NtYnV0aWwuYyx2IDEuMzYuMi4zIDIwMDcvMDcvMTUgMTk6MDg6MjUgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleHRyYWN0LmgiCisjaW5jbHVkZSAic21iLmgiCisKK3N0YXRpYyB1X2ludDMyX3Qgc3RyaW5nbGVuOworZXh0ZXJuIGNvbnN0IHVfY2hhciAqc3RhcnRidWY7CisKKy8qCisgKiBpbnRlcnByZXQgYSAzMiBiaXQgZG9zIHBhY2tlZCBkYXRlL3RpbWUgdG8gc29tZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkCitpbnRlcnByZXRfZG9zX2RhdGUodV9pbnQzMl90IGRhdGUsIHN0cnVjdCB0bSAqdHApCit7CisgICAgdV9pbnQzMl90IHAwLCBwMSwgcDIsIHAzOworCisgICAgcDAgPSBkYXRlICYgMHhGRjsKKyAgICBwMSA9ICgoZGF0ZSAmIDB4RkYwMCkgPj4gOCkgJiAweEZGOworICAgIHAyID0gKChkYXRlICYgMHhGRjAwMDApID4+IDE2KSAmIDB4RkY7CisgICAgcDMgPSAoKGRhdGUgJiAweEZGMDAwMDAwKSA+PiAyNCkgJiAweEZGOworCisgICAgdHAtPnRtX3NlYyA9IDIgKiAocDAgJiAweDFGKTsKKyAgICB0cC0+dG1fbWluID0gKChwMCA+PiA1KSAmIDB4RkYpICsgKChwMSAmIDB4NykgPDwgMyk7CisgICAgdHAtPnRtX2hvdXIgPSAocDEgPj4gMykgJiAweEZGOworICAgIHRwLT50bV9tZGF5ID0gKHAyICYgMHgxRik7CisgICAgdHAtPnRtX21vbiA9ICgocDIgPj4gNSkgJiAweEZGKSArICgocDMgJiAweDEpIDw8IDMpIC0gMTsKKyAgICB0cC0+dG1feWVhciA9ICgocDMgPj4gMSkgJiAweEZGKSArIDgwOworfQorCisvKgorICogY29tbW9uIHBvcnRpb246CisgKiBjcmVhdGUgYSB1bml4IGRhdGUgZnJvbSBhIGRvcyBkYXRlCisgKi8KK3N0YXRpYyB0aW1lX3QKK2ludF91bml4X2RhdGUodV9pbnQzMl90IGRvc19kYXRlKQoreworICAgIHN0cnVjdCB0bSB0OworCisgICAgaWYgKGRvc19kYXRlID09IDApCisJcmV0dXJuKDApOworCisgICAgaW50ZXJwcmV0X2Rvc19kYXRlKGRvc19kYXRlLCAmdCk7CisgICAgdC50bV93ZGF5ID0gMTsKKyAgICB0LnRtX3lkYXkgPSAxOworICAgIHQudG1faXNkc3QgPSAwOworCisgICAgcmV0dXJuIChta3RpbWUoJnQpKTsKK30KKworLyoKKyAqIGNyZWF0ZSBhIHVuaXggZGF0ZSBmcm9tIGEgZG9zIGRhdGUKKyAqIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICovCitzdGF0aWMgdGltZV90CittYWtlX3VuaXhfZGF0ZShjb25zdCB1X2NoYXIgKmRhdGVfcHRyKQoreworICAgIHVfaW50MzJfdCBkb3NfZGF0ZSA9IDA7CisKKyAgICBkb3NfZGF0ZSA9IEVYVFJBQ1RfTEVfMzJCSVRTKGRhdGVfcHRyKTsKKworICAgIHJldHVybiBpbnRfdW5peF9kYXRlKGRvc19kYXRlKTsKK30KKworLyoKKyAqIGNyZWF0ZSBhIHVuaXggZGF0ZSBmcm9tIGEgZG9zIGRhdGUKKyAqIGluIGhhbGZ3b3JkLXN3YXBwZWQgbmV0d29yayBieXRlIG9yZGVyIQorICovCitzdGF0aWMgdGltZV90CittYWtlX3VuaXhfZGF0ZTIoY29uc3QgdV9jaGFyICpkYXRlX3B0cikKK3sKKyAgICB1X2ludDMyX3QgeCwgeDI7CisKKyAgICB4ID0gRVhUUkFDVF9MRV8zMkJJVFMoZGF0ZV9wdHIpOworICAgIHgyID0gKCh4ICYgMHhGRkZGKSA8PCAxNikgfCAoKHggJiAweEZGRkYwMDAwKSA+PiAxNik7CisgICAgcmV0dXJuIGludF91bml4X2RhdGUoeDIpOworfQorCisvKgorICogaW50ZXJwcmV0IGFuIDggYnl0ZSAiZmlsZXRpbWUiIHN0cnVjdHVyZSB0byBhIHRpbWVfdAorICogSXQncyBvcmlnaW5hbGx5IGluICIxMDBucyB1bml0cyBzaW5jZSBqYW4gMXN0IDE2MDEiCisgKi8KK3N0YXRpYyB0aW1lX3QKK2ludGVycHJldF9sb25nX2RhdGUoY29uc3QgdV9jaGFyICpwKQoreworICAgIGRvdWJsZSBkOworICAgIHRpbWVfdCByZXQ7CisKKyAgICAvKiB0aGlzIGdpdmVzIHVzIHNlY29uZHMgc2luY2UgamFuIDFzdCAxNjAxIChhcHByb3gpICovCisgICAgZCA9IChFWFRSQUNUX0xFXzMyQklUUyhwICsgNCkgKiAyNTYuMCArIHBbM10pICogKDEuMGUtNyAqICgxIDw8IDI0KSk7CisKKyAgICAvKiBub3cgYWRqdXN0IGJ5IDM2OSB5ZWFycyB0byBtYWtlIHRoZSBzZWNzIHNpbmNlIDE5NzAgKi8KKyAgICBkIC09IDM2OS4wICogMzY1LjI1ICogMjQgKiA2MCAqIDYwOworCisgICAgLyogYW5kIGEgZnVkZ2UgZmFjdG9yIGFzIHdlIGdvdCBpdCB3cm9uZyBieSBhIGZldyBkYXlzICovCisgICAgZCArPSAoMyAqIDI0ICogNjAgKiA2MCArIDYgKiA2MCAqIDYwICsgMik7CisKKyAgICBpZiAoZCA8IDApCisJcmV0dXJuKDApOworCisgICAgcmV0ID0gKHRpbWVfdClkOworCisgICAgcmV0dXJuKHJldCk7Cit9CisKKy8qCisgKiBpbnRlcnByZXQgdGhlIHdlaXJkIG5ldGJpb3MgIm5hbWUiLiBSZXR1cm4gdGhlIG5hbWUgdHlwZSwgb3IgLTEgaWYKKyAqIHdlIHJ1biBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICovCitzdGF0aWMgaW50CituYW1lX2ludGVycHJldChjb25zdCB1X2NoYXIgKmluLCBjb25zdCB1X2NoYXIgKm1heGJ1ZiwgY2hhciAqb3V0KQoreworICAgIGludCByZXQ7CisgICAgaW50IGxlbjsKKworICAgIGlmIChpbiA+PSBtYXhidWYpCisJcmV0dXJuKC0xKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisgICAgVENIRUNLMigqaW4sIDEpOworICAgIGxlbiA9ICgqaW4rKykgLyAyOworCisgICAgKm91dD0wOworCisgICAgaWYgKGxlbiA+IDMwIHx8IGxlbiA8IDEpCisJcmV0dXJuKDApOworCisgICAgd2hpbGUgKGxlbi0tKSB7CisJVENIRUNLMigqaW4sIDIpOworCWlmIChpbiArIDEgPj0gbWF4YnVmKQorCSAgICByZXR1cm4oLTEpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwlpZiAoaW5bMF0gPCAnQScgfHwgaW5bMF0gPiAnUCcgfHwgaW5bMV0gPCAnQScgfHwgaW5bMV0gPiAnUCcpIHsKKwkgICAgKm91dCA9IDA7CisJICAgIHJldHVybigwKTsKKwl9CisJKm91dCA9ICgoaW5bMF0gLSAnQScpIDw8IDQpICsgKGluWzFdIC0gJ0EnKTsKKwlpbiArPSAyOworCW91dCsrOworICAgIH0KKyAgICAqb3V0ID0gMDsKKyAgICByZXQgPSBvdXRbLTFdOworCisgICAgcmV0dXJuKHJldCk7CisKK3RydW5jOgorICAgIHJldHVybigtMSk7Cit9CisKKy8qCisgKiBmaW5kIGEgcG9pbnRlciB0byBhIG5ldGJpb3MgbmFtZQorICovCitzdGF0aWMgY29uc3QgdV9jaGFyICoKK25hbWVfcHRyKGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgb2ZzLCBjb25zdCB1X2NoYXIgKm1heGJ1ZikKK3sKKyAgICBjb25zdCB1X2NoYXIgKnA7CisgICAgdV9jaGFyIGM7CisKKyAgICBwID0gYnVmICsgb2ZzOworICAgIGlmIChwID49IG1heGJ1ZikKKwlyZXR1cm4oTlVMTCk7CS8qIG5hbWUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworICAgIFRDSEVDSzIoKnAsIDEpOworCisgICAgYyA9ICpwOworCisgICAgLyogWFhYIC0gdGhpcyBzaG91bGQgdXNlIHRoZSBzYW1lIGNvZGUgdGhhdCB0aGUgRE5TIGRpc3NlY3RvciBkb2VzICovCisgICAgaWYgKChjICYgMHhDMCkgPT0gMHhDMCkgeworCXVfaW50MTZfdCBsOworCisJVENIRUNLMigqcCwgMik7CisJaWYgKChwICsgMSkgPj0gbWF4YnVmKQorCSAgICByZXR1cm4oTlVMTCk7CS8qIG5hbWUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworCWwgPSBFWFRSQUNUXzE2QklUUyhwKSAmIDB4M0ZGRjsKKwlpZiAobCA9PSAwKSB7CisJICAgIC8qIFdlIGhhdmUgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGl0c2VsZi4gKi8KKwkgICAgcmV0dXJuKE5VTEwpOworCX0KKwlwID0gYnVmICsgbDsKKwlpZiAocCA+PSBtYXhidWYpCisJICAgIHJldHVybihOVUxMKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJVENIRUNLMigqcCwgMSk7CisgICAgfQorICAgIHJldHVybihwKTsKKwordHJ1bmM6CisgICAgcmV0dXJuKE5VTEwpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KK30KKworLyoKKyAqIGV4dHJhY3QgYSBuZXRiaW9zIG5hbWUgZnJvbSBhIGJ1ZgorICovCitzdGF0aWMgaW50CituYW1lX2V4dHJhY3QoY29uc3QgdV9jaGFyICpidWYsIGludCBvZnMsIGNvbnN0IHVfY2hhciAqbWF4YnVmLCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IHVfY2hhciAqcCA9IG5hbWVfcHRyKGJ1Ziwgb2ZzLCBtYXhidWYpOworICAgIGlmIChwID09IE5VTEwpCisJcmV0dXJuKC0xKTsJLyogZXJyb3IgKHByb2JhYmx5IG5hbWUgZ29pbmcgcGFzdCBlbmQgb2YgYnVmZmVyKSAqLworICAgIG5hbWVbMF0gPSAnXDAnOworICAgIHJldHVybihuYW1lX2ludGVycHJldChwLCBtYXhidWYsIG5hbWUpKTsKK30KKworCisvKgorICogcmV0dXJuIHRoZSB0b3RhbCBzdG9yYWdlIGxlbmd0aCBvZiBhIG1hbmdsZWQgbmFtZQorICovCitzdGF0aWMgaW50CituYW1lX2xlbihjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICptYXhidWYpCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqczAgPSBzOworICAgIHVuc2lnbmVkIGNoYXIgYzsKKworICAgIGlmIChzID49IG1heGJ1ZikKKwlyZXR1cm4oLTEpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICBUQ0hFQ0syKCpzLCAxKTsKKyAgICBjID0gKnM7CisgICAgaWYgKChjICYgMHhDMCkgPT0gMHhDMCkKKwlyZXR1cm4oMik7CisgICAgd2hpbGUgKCpzKSB7CisJaWYgKHMgPj0gbWF4YnVmKQorCSAgICByZXR1cm4oLTEpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwlUQ0hFQ0syKCpzLCAxKTsKKwlzICs9ICgqcykgKyAxOworICAgIH0KKyAgICByZXR1cm4oUFRSX0RJRkYocywgczApICsgMSk7CisKK3RydW5jOgorICAgIHJldHVybigtMSk7CS8qIG5hbWUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfYXNjKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJc2FmZXB1dGNoYXIoYnVmW2ldKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorbmFtZV90eXBlX3N0cihpbnQgbmFtZV90eXBlKQoreworICAgIGNvbnN0IGNoYXIgKmYgPSBOVUxMOworCisgICAgc3dpdGNoIChuYW1lX3R5cGUpIHsKKyAgICBjYXNlIDA6ICAgIGYgPSAiV29ya3N0YXRpb24iOyBicmVhazsKKyAgICBjYXNlIDB4MDM6IGYgPSAiQ2xpZW50PyI7IGJyZWFrOworICAgIGNhc2UgMHgyMDogZiA9ICJTZXJ2ZXIiOyBicmVhazsKKyAgICBjYXNlIDB4MWQ6IGYgPSAiTWFzdGVyIEJyb3dzZXIiOyBicmVhazsKKyAgICBjYXNlIDB4MWI6IGYgPSAiRG9tYWluIENvbnRyb2xsZXIiOyBicmVhazsKKyAgICBjYXNlIDB4MWU6IGYgPSAiQnJvd3NlciBTZXJ2ZXIiOyBicmVhazsKKyAgICBkZWZhdWx0OiAgIGYgPSAiVW5rbm93biI7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4oZik7Cit9CisKK3ZvaWQKK3ByaW50X2RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCBpID0gMDsKKworICAgIGlmIChsZW4gPD0gMCkKKwlyZXR1cm47CisgICAgcHJpbnRmKCJbJTAzWF0gIiwgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgLypub3RoaW5nKi8pIHsKKyAgICAgICAgVENIRUNLKGJ1ZltpXSk7CisJcHJpbnRmKCIlMDJYICIsIGJ1ZltpXSAmIDB4ZmYpOworCWkrKzsKKwlpZiAoaSU4ID09IDApCisJICAgIHByaW50ZigiICIpOworCWlmIChpICUgMTYgPT0gMCkgeworCSAgICBwcmludF9hc2MoJmJ1ZltpIC0gMTZdLCA4KTsKKwkgICAgcHJpbnRmKCIgIik7CisJICAgIHByaW50X2FzYygmYnVmW2kgLSA4XSwgOCk7CisJICAgIHByaW50ZigiXG4iKTsKKwkgICAgaWYgKGkgPCBsZW4pCisJCXByaW50ZigiWyUwM1hdICIsIGkpOworCX0KKyAgICB9CisgICAgaWYgKGkgJSAxNikgeworCWludCBuOworCisJbiA9IDE2IC0gKGkgJSAxNik7CisJcHJpbnRmKCIgIik7CisJaWYgKG4+OCkKKwkgICAgcHJpbnRmKCIgIik7CisJd2hpbGUgKG4tLSkKKwkgICAgcHJpbnRmKCIgICAiKTsKKworCW4gPSBTTUJNSU4oOCwgaSAlIDE2KTsKKwlwcmludF9hc2MoJmJ1ZltpIC0gKGkgJSAxNildLCBuKTsKKwlwcmludGYoIiAiKTsKKwluID0gKGkgJSAxNikgLSBuOworCWlmIChuID4gMCkKKwkgICAgcHJpbnRfYXNjKCZidWZbaSAtIG5dLCBuKTsKKwlwcmludGYoIlxuIik7CisgICAgfQorICAgIHJldHVybjsKKwordHJ1bmM6CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiV0FSTklORzogU2hvcnQgcGFja2V0LiBUcnkgaW5jcmVhc2luZyB0aGUgc25hcCBsZW5ndGhcbiIpOworfQorCisKK3N0YXRpYyB2b2lkCit3cml0ZV9iaXRzKHVuc2lnbmVkIGludCB2YWwsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKyAgICBjb25zdCBjaGFyICpwID0gZm10OworICAgIGludCBpID0gMDsKKworICAgIHdoaWxlICgocCA9IHN0cmNocihmbXQsICd8JykpKSB7CisJc2l6ZV90IGwgPSBQVFJfRElGRihwLCBmbXQpOworCWlmIChsICYmICh2YWwgJiAoMSA8PCBpKSkpCisJICAgIHByaW50ZigiJS4qcyAiLCAoaW50KWwsIGZtdCk7CisJZm10ID0gcCArIDE7CisJaSsrOworICAgIH0KK30KKworLyogY29udmVydCBhIFVDUzIgc3RyaW5nIGludG8gaXNvLTg4NTktMSBzdHJpbmcgKi8KKyNkZWZpbmUgTUFYX1VOSVNUUl9TSVpFCTEwMDAKK3N0YXRpYyBjb25zdCBjaGFyICoKK3VuaXN0cihjb25zdCB1X2NoYXIgKnMsIHVfaW50MzJfdCAqbGVuLCBpbnQgdXNlX3VuaWNvZGUpCit7CisgICAgc3RhdGljIGNoYXIgYnVmW01BWF9VTklTVFJfU0laRSsxXTsKKyAgICBzaXplX3QgbCA9IDA7CisgICAgdV9pbnQzMl90IHN0cnNpemU7CisgICAgY29uc3QgdV9jaGFyICpzcDsKKworICAgIGlmICh1c2VfdW5pY29kZSkgeworCS8qCisJICogU2tpcCBwYWRkaW5nIHRoYXQgcHV0cyB0aGUgc3RyaW5nIG9uIGFuIGV2ZW4gYm91bmRhcnkuCisJICovCisJaWYgKCgocyAtIHN0YXJ0YnVmKSAlIDIpICE9IDApIHsKKwkgICAgVENIRUNLKHNbMF0pOworCSAgICBzKys7CisJfQorICAgIH0KKyAgICBpZiAoKmxlbiA9PSAwKSB7CisJLyoKKwkgKiBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorCSAqLworCXN0cnNpemUgPSAwOworCXNwID0gczsKKwlpZiAoIXVzZV91bmljb2RlKSB7CisJICAgIGZvciAoOzspIHsKKwkJVENIRUNLKHNwWzBdKTsKKwkJKmxlbiArPSAxOworCQlpZiAoc3BbMF0gPT0gMCkKKwkJICAgIGJyZWFrOworCQlzcCsrOworCSAgICB9CisJICAgIHN0cnNpemUgPSAqbGVuIC0gMTsKKwl9IGVsc2UgeworCSAgICBmb3IgKDs7KSB7CisJCVRDSEVDSzIoc3BbMF0sIDIpOworCQkqbGVuICs9IDI7CisJCWlmIChzcFswXSA9PSAwICYmIHNwWzFdID09IDApCisJCSAgICBicmVhazsKKwkJc3AgKz0gMjsKKwkgICAgfQorCSAgICBzdHJzaXplID0gKmxlbiAtIDI7CisJfQorICAgIH0gZWxzZSB7CisJLyoKKwkgKiBDb3VudGVkIHN0cmluZy4KKwkgKi8KKwlzdHJzaXplID0gKmxlbjsKKyAgICB9CisgICAgaWYgKCF1c2VfdW5pY29kZSkgeworICAgIAl3aGlsZSAoc3Ryc2l6ZSAhPSAwKSB7CisgICAgCSAgICBUQ0hFQ0soc1swXSk7CisJICAgIGlmIChsID49IE1BWF9VTklTVFJfU0laRSkKKwkJYnJlYWs7CisJICAgIGlmIChpc3ByaW50KHNbMF0pKQorCQlidWZbbF0gPSBzWzBdOworCSAgICBlbHNlIHsKKwkJaWYgKHNbMF0gPT0gMCkKKwkJICAgIGJyZWFrOworCQlidWZbbF0gPSAnLic7CisJICAgIH0KKwkgICAgbCsrOworCSAgICBzKys7CisJICAgIHN0cnNpemUtLTsKKwl9CisgICAgfSBlbHNlIHsKKwl3aGlsZSAoc3Ryc2l6ZSAhPSAwKSB7CisJICAgIFRDSEVDSzIoc1swXSwgMik7CisJICAgIGlmIChsID49IE1BWF9VTklTVFJfU0laRSkKKwkJYnJlYWs7CisJICAgIGlmIChzWzFdID09IDAgJiYgaXNwcmludChzWzBdKSkgeworCQkvKiBJdCdzIGEgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlciAqLworCQlidWZbbF0gPSBzWzBdOworCSAgICB9IGVsc2UgeworCQkvKiBJdCdzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhIG5vbi1wcmludGFibGUgQVNDSUkgY2hhcmFjdGVyICovCisJCWlmIChzWzBdID09IDAgJiYgc1sxXSA9PSAwKQorCQkgICAgYnJlYWs7CisJCWJ1ZltsXSA9ICcuJzsKKwkgICAgfQorCSAgICBsKys7CisJICAgIHMgKz0gMjsKKwkgICAgaWYgKHN0cnNpemUgPT0gMSkKKwkJYnJlYWs7CisJICAgIHN0cnNpemUgLT0gMjsKKwl9CisgICAgfQorICAgIGJ1ZltsXSA9IDA7CisgICAgcmV0dXJuIGJ1ZjsKKwordHJ1bmM6CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgKgorc21iX2ZkYXRhMShjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCBjb25zdCB1X2NoYXIgKm1heGJ1ZiwKKyAgICBpbnQgdW5pY29kZXN0cikKK3sKKyAgICBpbnQgcmV2ZXJzZSA9IDA7CisgICAgY29uc3QgY2hhciAqYXR0cmliX2ZtdCA9ICJSRUFET05MWXxISURERU58U1lTVEVNfFZPTFVNRXxESVJ8QVJDSElWRXwiOworCisgICAgd2hpbGUgKCpmbXQgJiYgYnVmPG1heGJ1ZikgeworCXN3aXRjaCAoKmZtdCkgeworCWNhc2UgJ2EnOgorCSAgICBUQ0hFQ0soYnVmWzBdKTsKKwkgICAgd3JpdGVfYml0cyhidWZbMF0sIGF0dHJpYl9mbXQpOworCSAgICBidWYrKzsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCisJY2FzZSAnQSc6CisJICAgIFRDSEVDSzIoYnVmWzBdLCAyKTsKKwkgICAgd3JpdGVfYml0cyhFWFRSQUNUX0xFXzE2QklUUyhidWYpLCBhdHRyaWJfZm10KTsKKwkgICAgYnVmICs9IDI7CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKworCWNhc2UgJ3snOgorCSAgeworCSAgICBjaGFyIGJpdGZtdFsxMjhdOworCSAgICBjaGFyICpwOworCSAgICBpbnQgbDsKKworCSAgICBwID0gc3RyY2hyKCsrZm10LCAnfScpOworCSAgICBsID0gUFRSX0RJRkYocCwgZm10KTsKKworCSAgICBpZiAoKHVuc2lnbmVkIGludClsID4gc2l6ZW9mKGJpdGZtdCkgLSAxKQorCQkgICAgbCA9IHNpemVvZihiaXRmbXQpLTE7CisKKwkgICAgc3RybmNweShiaXRmbXQsIGZtdCwgbCk7CisJICAgIGJpdGZtdFtsXSA9ICdcMCc7CisJICAgIGZtdCA9IHAgKyAxOworCSAgICBUQ0hFQ0soYnVmWzBdKTsKKwkgICAgd3JpdGVfYml0cyhidWZbMF0sIGJpdGZtdCk7CisJICAgIGJ1ZisrOworCSAgICBicmVhazsKKwkgIH0KKworCWNhc2UgJ1AnOgorCSAgeworCSAgICBpbnQgbCA9IGF0b2koZm10ICsgMSk7CisJICAgIFRDSEVDSzIoYnVmWzBdLCBsKTsKKwkgICAgYnVmICs9IGw7CisJICAgIGZtdCsrOworCSAgICB3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqZm10KSkKKwkJZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ3InOgorCSAgICByZXZlcnNlID0gIXJldmVyc2U7CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKwljYXNlICdiJzoKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IHg7CisJICAgIFRDSEVDSyhidWZbMF0pOworCSAgICB4ID0gYnVmWzBdOworCSAgICBwcmludGYoIiV1ICgweCV4KSIsIHgsIHgpOworCSAgICBidWYgKz0gMTsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ2QnOgorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgeDsKKwkgICAgVENIRUNLMihidWZbMF0sIDIpOworCSAgICB4ID0gcmV2ZXJzZSA/IEVYVFJBQ1RfMTZCSVRTKGJ1ZikgOgorCQkJICBFWFRSQUNUX0xFXzE2QklUUyhidWYpOworCSAgICBwcmludGYoIiVkICgweCV4KSIsIHgsIHgpOworCSAgICBidWYgKz0gMjsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ0QnOgorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgeDsKKwkgICAgVENIRUNLMihidWZbMF0sIDQpOworCSAgICB4ID0gcmV2ZXJzZSA/IEVYVFJBQ1RfMzJCSVRTKGJ1ZikgOgorCQkJICBFWFRSQUNUX0xFXzMyQklUUyhidWYpOworCSAgICBwcmludGYoIiVkICgweCV4KSIsIHgsIHgpOworCSAgICBidWYgKz0gNDsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ0wnOgorCSAgeworCSAgICB1X2ludDY0X3QgeDsKKwkgICAgVENIRUNLMihidWZbMF0sIDgpOworCSAgICB4ID0gcmV2ZXJzZSA/IEVYVFJBQ1RfNjRCSVRTKGJ1ZikgOgorCQkJICBFWFRSQUNUX0xFXzY0QklUUyhidWYpOworCSAgICBwcmludGYoIiUiIFBSSXU2NCAiICgweCUiIFBSSXg2NCAiKSIsIHgsIHgpOworCSAgICBidWYgKz0gODsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ00nOgorCSAgeworCSAgICAvKiBXZWlyZCBtaXhlZC1lbmRpYW4gbGVuZ3RoIHZhbHVlcyBpbiA2NC1iaXQgbG9ja3MgKi8KKwkgICAgdV9pbnQzMl90IHgxLCB4MjsKKwkgICAgdV9pbnQ2NF90IHg7CisJICAgIFRDSEVDSzIoYnVmWzBdLCA4KTsKKwkgICAgeDEgPSByZXZlcnNlID8gRVhUUkFDVF8zMkJJVFMoYnVmKSA6CisJCQkgICBFWFRSQUNUX0xFXzMyQklUUyhidWYpOworCSAgICB4MiA9IHJldmVyc2UgPyBFWFRSQUNUXzMyQklUUyhidWYgKyA0KSA6CisJCQkgICBFWFRSQUNUX0xFXzMyQklUUyhidWYgKyA0KTsKKwkgICAgeCA9ICgoKHVfaW50NjRfdCl4MSkgPDwgMzIpIHwgeDI7CisJICAgIHByaW50ZigiJSIgUFJJdTY0ICIgKDB4JSIgUFJJeDY0ICIpIiwgeCwgeCk7CisJICAgIGJ1ZiArPSA4OworCSAgICBmbXQrKzsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSAnQic6CisJICB7CisJICAgIHVuc2lnbmVkIGludCB4OworCSAgICBUQ0hFQ0soYnVmWzBdKTsKKwkgICAgeCA9IGJ1ZlswXTsKKwkgICAgcHJpbnRmKCIweCVYIiwgeCk7CisJICAgIGJ1ZiArPSAxOworCSAgICBmbXQrKzsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSAndyc6CisJICB7CisJICAgIHVuc2lnbmVkIGludCB4OworCSAgICBUQ0hFQ0syKGJ1ZlswXSwgMik7CisJICAgIHggPSByZXZlcnNlID8gRVhUUkFDVF8xNkJJVFMoYnVmKSA6CisJCQkgIEVYVFJBQ1RfTEVfMTZCSVRTKGJ1Zik7CisJICAgIHByaW50ZigiMHglWCIsIHgpOworCSAgICBidWYgKz0gMjsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ1cnOgorCSAgeworCSAgICB1bnNpZ25lZCBpbnQgeDsKKwkgICAgVENIRUNLMihidWZbMF0sIDQpOworCSAgICB4ID0gcmV2ZXJzZSA/IEVYVFJBQ1RfMzJCSVRTKGJ1ZikgOgorCQkJICBFWFRSQUNUX0xFXzMyQklUUyhidWYpOworCSAgICBwcmludGYoIjB4JVgiLCB4KTsKKwkgICAgYnVmICs9IDQ7CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlICdsJzoKKwkgIHsKKwkgICAgZm10Kys7CisJICAgIHN3aXRjaCAoKmZtdCkgeworCisJICAgIGNhc2UgJ2InOgorCQlUQ0hFQ0soYnVmWzBdKTsKKwkJc3RyaW5nbGVuID0gYnVmWzBdOworCQlwcmludGYoIiV1Iiwgc3RyaW5nbGVuKTsKKwkJYnVmICs9IDE7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ2QnOgorCQlUQ0hFQ0syKGJ1ZlswXSwgMik7CisJCXN0cmluZ2xlbiA9IHJldmVyc2UgPyBFWFRSQUNUXzE2QklUUyhidWYpIDoKKwkJCQkgICAgICBFWFRSQUNUX0xFXzE2QklUUyhidWYpOworCQlwcmludGYoIiV1Iiwgc3RyaW5nbGVuKTsKKwkJYnVmICs9IDI7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ0QnOgorCQlUQ0hFQ0syKGJ1ZlswXSwgNCk7CisJCXN0cmluZ2xlbiA9IHJldmVyc2UgPyBFWFRSQUNUXzMyQklUUyhidWYpIDoKKwkJCQkgICAgICBFWFRSQUNUX0xFXzMyQklUUyhidWYpOworCQlwcmludGYoIiV1Iiwgc3RyaW5nbGVuKTsKKwkJYnVmICs9IDQ7CisJCWJyZWFrOworCSAgICB9CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlICdTJzoKKwljYXNlICdSJzoJLyogbGlrZSAnUycsIGJ1dCBhbHdheXMgQVNDSUkgKi8KKwkgIHsKKwkgICAgLypYWFggdW5pc3RyKCkgKi8KKwkgICAgY29uc3QgY2hhciAqczsKKwkgICAgdV9pbnQzMl90IGxlbjsKKworCSAgICBsZW4gPSAwOworCSAgICBzID0gdW5pc3RyKGJ1ZiwgJmxlbiwgKCpmbXQgPT0gJ1InKSA/IDAgOiB1bmljb2Rlc3RyKTsKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkJZ290byB0cnVuYzsKKwkgICAgcHJpbnRmKCIlcyIsIHMpOworCSAgICBidWYgKz0gbGVuOworCSAgICBmbXQrKzsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSAnWic6CisJY2FzZSAnWSc6CS8qIGxpa2UgJ1onLCBidXQgYWx3YXlzIEFTQ0lJICovCisJICB7CisJICAgIGNvbnN0IGNoYXIgKnM7CisJICAgIHVfaW50MzJfdCBsZW47CisKKwkgICAgVENIRUNLKCpidWYpOworCSAgICBpZiAoKmJ1ZiAhPSA0ICYmICpidWYgIT0gMikgeworCQlwcmludGYoIkVycm9yISBBU0NJSVogYnVmZmVyIG9mIHR5cGUgJXUiLCAqYnVmKTsKKwkJcmV0dXJuIG1heGJ1ZjsJLyogZ2l2ZSB1cCAqLworCSAgICB9CisJICAgIGxlbiA9IDA7CisJICAgIHMgPSB1bmlzdHIoYnVmICsgMSwgJmxlbiwgKCpmbXQgPT0gJ1knKSA/IDAgOiB1bmljb2Rlc3RyKTsKKwkgICAgaWYgKHMgPT0gTlVMTCkKKwkJZ290byB0cnVuYzsKKwkgICAgcHJpbnRmKCIlcyIsIHMpOworCSAgICBidWYgKz0gbGVuICsgMTsKKwkgICAgZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ3MnOgorCSAgeworCSAgICBpbnQgbCA9IGF0b2koZm10ICsgMSk7CisJICAgIFRDSEVDSzIoKmJ1ZiwgbCk7CisJICAgIHByaW50ZigiJS0qLipzIiwgbCwgbCwgYnVmKTsKKwkgICAgYnVmICs9IGw7CisJICAgIGZtdCsrOworCSAgICB3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqZm10KSkKKwkJZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWNhc2UgJ2MnOgorCSAgeworCSAgICBUQ0hFQ0syKCpidWYsIHN0cmluZ2xlbik7CisJICAgIHByaW50ZigiJS0qLipzIiwgKGludClzdHJpbmdsZW4sIChpbnQpc3RyaW5nbGVuLCBidWYpOworCSAgICBidWYgKz0gc3RyaW5nbGVuOworCSAgICBmbXQrKzsKKwkgICAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmZtdCkpCisJCWZtdCsrOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlICdDJzoKKwkgIHsKKwkgICAgY29uc3QgY2hhciAqczsKKwkgICAgcyA9IHVuaXN0cihidWYsICZzdHJpbmdsZW4sIHVuaWNvZGVzdHIpOworCSAgICBpZiAocyA9PSBOVUxMKQorCQlnb3RvIHRydW5jOworCSAgICBwcmludGYoIiVzIiwgcyk7CisJICAgIGJ1ZiArPSBzdHJpbmdsZW47CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlICdoJzoKKwkgIHsKKwkgICAgaW50IGwgPSBhdG9pKGZtdCArIDEpOworCSAgICBUQ0hFQ0syKCpidWYsIGwpOworCSAgICB3aGlsZSAobC0tKQorCQlwcmludGYoIiUwMngiLCAqYnVmKyspOworCSAgICBmbXQrKzsKKwkgICAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmZtdCkpCisJCWZtdCsrOworCSAgICBicmVhazsKKwkgIH0KKwljYXNlICduJzoKKwkgIHsKKwkgICAgaW50IHQgPSBhdG9pKGZtdCsxKTsKKwkgICAgY2hhciBuYnVmWzI1NV07CisJICAgIGludCBuYW1lX3R5cGU7CisJICAgIGludCBsZW47CisKKwkgICAgc3dpdGNoICh0KSB7CisJICAgIGNhc2UgMToKKwkJbmFtZV90eXBlID0gbmFtZV9leHRyYWN0KHN0YXJ0YnVmLCBQVFJfRElGRihidWYsIHN0YXJ0YnVmKSwKKwkJICAgIG1heGJ1ZiwgbmJ1Zik7CisJCWlmIChuYW1lX3R5cGUgPCAwKQorCQkgICAgZ290byB0cnVuYzsKKwkJbGVuID0gbmFtZV9sZW4oYnVmLCBtYXhidWYpOworCQlpZiAobGVuIDwgMCkKKwkJICAgIGdvdG8gdHJ1bmM7CisJCWJ1ZiArPSBsZW47CisJCXByaW50ZigiJS0xNS4xNXMgTmFtZVR5cGU9MHglMDJYICglcykiLCBuYnVmLCBuYW1lX3R5cGUsCisJCSAgICBuYW1lX3R5cGVfc3RyKG5hbWVfdHlwZSkpOworCQlicmVhazsKKwkgICAgY2FzZSAyOgorCQlUQ0hFQ0soYnVmWzE1XSk7CisJCW5hbWVfdHlwZSA9IGJ1ZlsxNV07CisJCXByaW50ZigiJS0xNS4xNXMgTmFtZVR5cGU9MHglMDJYICglcykiLCBidWYsIG5hbWVfdHlwZSwKKwkJICAgIG5hbWVfdHlwZV9zdHIobmFtZV90eXBlKSk7CisJCWJ1ZiArPSAxNjsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgZm10Kys7CisJICAgIHdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpmbXQpKQorCQlmbXQrKzsKKwkgICAgYnJlYWs7CisJICB9CisJY2FzZSAnVCc6CisJICB7CisJICAgIHRpbWVfdCB0OworCSAgICBzdHJ1Y3QgdG0gKmx0OworCSAgICBjb25zdCBjaGFyICp0c3RyaW5nOworCSAgICB1X2ludDMyX3QgeDsKKworCSAgICBzd2l0Y2ggKGF0b2koZm10ICsgMSkpIHsKKwkgICAgY2FzZSAxOgorCQlUQ0hFQ0syKGJ1ZlswXSwgNCk7CisJCXggPSBFWFRSQUNUX0xFXzMyQklUUyhidWYpOworCQlpZiAoeCA9PSAwIHx8IHggPT0gMHhGRkZGRkZGRikKKwkJICAgIHQgPSAwOworCQllbHNlCisJCSAgICB0ID0gbWFrZV91bml4X2RhdGUoYnVmKTsKKwkJYnVmICs9IDQ7CisJCWJyZWFrOworCSAgICBjYXNlIDI6CisJCVRDSEVDSzIoYnVmWzBdLCA0KTsKKwkJeCA9IEVYVFJBQ1RfTEVfMzJCSVRTKGJ1Zik7CisJCWlmICh4ID09IDAgfHwgeCA9PSAweEZGRkZGRkZGKQorCQkgICAgdCA9IDA7CisJCWVsc2UKKwkJICAgIHQgPSBtYWtlX3VuaXhfZGF0ZTIoYnVmKTsKKwkJYnVmICs9IDQ7CisJCWJyZWFrOworCSAgICBjYXNlIDM6CisJCVRDSEVDSzIoYnVmWzBdLCA4KTsKKwkJdCA9IGludGVycHJldF9sb25nX2RhdGUoYnVmKTsKKwkJYnVmICs9IDg7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQl0ID0gMDsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKHQgIT0gMCkgeworCQlsdCA9IGxvY2FsdGltZSgmdCk7CisJCWlmIChsdCAhPSBOVUxMKQorCQkgICAgdHN0cmluZyA9IGFzY3RpbWUobHQpOworCQllbHNlCisJCSAgICB0c3RyaW5nID0gIihDYW4ndCBjb252ZXJ0IHRpbWUpXG4iOworCSAgICB9IGVsc2UKKwkJdHN0cmluZyA9ICJOVUxMXG4iOworCSAgICBwcmludGYoIiVzIiwgdHN0cmluZyk7CisJICAgIGZtdCsrOworCSAgICB3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqZm10KSkKKwkJZm10Kys7CisJICAgIGJyZWFrOworCSAgfQorCWRlZmF1bHQ6CisJICAgIHB1dGNoYXIoKmZtdCk7CisJICAgIGZtdCsrOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgaWYgKGJ1ZiA+PSBtYXhidWYgJiYgKmZtdCkKKwlwcmludGYoIkVORCBPRiBCVUZGRVJcbiIpOworCisgICAgcmV0dXJuKGJ1Zik7CisKK3RydW5jOgorICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIldBUk5JTkc6IFNob3J0IHBhY2tldC4gVHJ5IGluY3JlYXNpbmcgdGhlIHNuYXAgbGVuZ3RoXG4iKTsKKyAgICByZXR1cm4oTlVMTCk7Cit9CisKK2NvbnN0IHVfY2hhciAqCitzbWJfZmRhdGEoY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgdV9jaGFyICptYXhidWYsCisgICAgaW50IHVuaWNvZGVzdHIpCit7CisgICAgc3RhdGljIGludCBkZXB0aCA9IDA7CisgICAgY2hhciBzWzEyOF07CisgICAgY2hhciAqcDsKKworICAgIHdoaWxlICgqZm10KSB7CisJc3dpdGNoICgqZm10KSB7CisJY2FzZSAnKic6CisJICAgIGZtdCsrOworCSAgICB3aGlsZSAoYnVmIDwgbWF4YnVmKSB7CisJCWNvbnN0IHVfY2hhciAqYnVmMjsKKwkJZGVwdGgrKzsKKwkJYnVmMiA9IHNtYl9mZGF0YShidWYsIGZtdCwgbWF4YnVmLCB1bmljb2Rlc3RyKTsKKwkJZGVwdGgtLTsKKwkJaWYgKGJ1ZjIgPT0gTlVMTCkKKwkJICAgIHJldHVybihOVUxMKTsKKwkJaWYgKGJ1ZjIgPT0gYnVmKQorCQkgICAgcmV0dXJuKGJ1Zik7CisJCWJ1ZiA9IGJ1ZjI7CisJICAgIH0KKwkgICAgcmV0dXJuKGJ1Zik7CisKKwljYXNlICd8JzoKKwkgICAgZm10Kys7CisJICAgIGlmIChidWYgPj0gbWF4YnVmKQorCQlyZXR1cm4oYnVmKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICclJzoKKwkgICAgZm10Kys7CisJICAgIGJ1ZiA9IG1heGJ1ZjsKKwkgICAgYnJlYWs7CisKKwljYXNlICcjJzoKKwkgICAgZm10Kys7CisJICAgIHJldHVybihidWYpOworCSAgICBicmVhazsKKworCWNhc2UgJ1snOgorCSAgICBmbXQrKzsKKwkgICAgaWYgKGJ1ZiA+PSBtYXhidWYpCisJCXJldHVybihidWYpOworCSAgICBtZW1zZXQocywgMCwgc2l6ZW9mKHMpKTsKKwkgICAgcCA9IHN0cmNocihmbXQsICddJyk7CisJICAgIGlmICgoc2l6ZV90KShwIC0gZm10ICsgMSkgPiBzaXplb2YocykpIHsKKwkJLyogb3ZlcnJ1biAqLworCQlyZXR1cm4oYnVmKTsKKwkgICAgfQorCSAgICBzdHJuY3B5KHMsIGZtdCwgcCAtIGZtdCk7CisJICAgIHNbcCAtIGZtdF0gPSAnXDAnOworCSAgICBmbXQgPSBwICsgMTsKKwkgICAgYnVmID0gc21iX2ZkYXRhMShidWYsIHMsIG1heGJ1ZiwgdW5pY29kZXN0cik7CisJICAgIGlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIHB1dGNoYXIoKmZtdCk7CisJICAgIGZtdCsrOworCSAgICBmZmx1c2goc3Rkb3V0KTsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoIWRlcHRoICYmIGJ1ZiA8IG1heGJ1ZikgeworCXNpemVfdCBsZW4gPSBQVFJfRElGRihtYXhidWYsIGJ1Zik7CisJcHJpbnRmKCJEYXRhOiAoJWx1IGJ5dGVzKVxuIiwgKHVuc2lnbmVkIGxvbmcpbGVuKTsKKwlwcmludF9kYXRhKGJ1ZiwgbGVuKTsKKwlyZXR1cm4oYnVmICsgbGVuKTsKKyAgICB9CisgICAgcmV0dXJuKGJ1Zik7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCBjb2RlOworICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Cit9IGVycl9jb2RlX3N0cnVjdDsKKworLyogRE9TIEVycm9yIE1lc3NhZ2VzICovCitzdGF0aWMgY29uc3QgZXJyX2NvZGVfc3RydWN0IGRvc19tc2dzW10gPSB7CisgICAgeyAiRVJSYmFkZnVuYyIsIDEsICJJbnZhbGlkIGZ1bmN0aW9uLiIgfSwKKyAgICB7ICJFUlJiYWRmaWxlIiwgMiwgIkZpbGUgbm90IGZvdW5kLiIgfSwKKyAgICB7ICJFUlJiYWRwYXRoIiwgMywgIkRpcmVjdG9yeSBpbnZhbGlkLiIgfSwKKyAgICB7ICJFUlJub2ZpZHMiLCA0LCAiTm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUiIH0sCisgICAgeyAiRVJSbm9hY2Nlc3MiLCA1LCAiQWNjZXNzIGRlbmllZC4iIH0sCisgICAgeyAiRVJSYmFkZmlkIiwgNiwgIkludmFsaWQgZmlsZSBoYW5kbGUuIiB9LAorICAgIHsgIkVSUmJhZG1jYiIsIDcsICJNZW1vcnkgY29udHJvbCBibG9ja3MgZGVzdHJveWVkLiIgfSwKKyAgICB7ICJFUlJub21lbSIsIDgsICJJbnN1ZmZpY2llbnQgc2VydmVyIG1lbW9yeSB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIiB9LAorICAgIHsgIkVSUmJhZG1lbSIsIDksICJJbnZhbGlkIG1lbW9yeSBibG9jayBhZGRyZXNzLiIgfSwKKyAgICB7ICJFUlJiYWRlbnYiLCAxMCwgIkludmFsaWQgZW52aXJvbm1lbnQuIiB9LAorICAgIHsgIkVSUmJhZGZvcm1hdCIsIDExLCAiSW52YWxpZCBmb3JtYXQuIiB9LAorICAgIHsgIkVSUmJhZGFjY2VzcyIsIDEyLCAiSW52YWxpZCBvcGVuIG1vZGUuIiB9LAorICAgIHsgIkVSUmJhZGRhdGEiLCAxMywgIkludmFsaWQgZGF0YS4iIH0sCisgICAgeyAiRVJSIiwgMTQsICJyZXNlcnZlZC4iIH0sCisgICAgeyAiRVJSYmFkZHJpdmUiLCAxNSwgIkludmFsaWQgZHJpdmUgc3BlY2lmaWVkLiIgfSwKKyAgICB7ICJFUlJyZW1jZCIsIDE2LCAiQSBEZWxldGUgRGlyZWN0b3J5IHJlcXVlc3QgYXR0ZW1wdGVkIHRvIHJlbW92ZSB0aGUgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnkuIiB9LAorICAgIHsgIkVSUmRpZmZkZXZpY2UiLCAxNywgIk5vdCBzYW1lIGRldmljZS4iIH0sCisgICAgeyAiRVJSbm9maWxlcyIsIDE4LCAiQSBGaWxlIFNlYXJjaCBjb21tYW5kIGNhbiBmaW5kIG5vIG1vcmUgZmlsZXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBjcml0ZXJpYS4iIH0sCisgICAgeyAiRVJSYmFkc2hhcmUiLCAzMiwgIlRoZSBzaGFyaW5nIG1vZGUgc3BlY2lmaWVkIGZvciBhbiBPcGVuIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIEZJRHMgb24gdGhlIGZpbGUuIiB9LAorICAgIHsgIkVSUmxvY2siLCAzMywgIkEgTG9jayByZXF1ZXN0IGNvbmZsaWN0ZWQgd2l0aCBhbiBleGlzdGluZyBsb2NrIG9yIHNwZWNpZmllZCBhbiBpbnZhbGlkIG1vZGUsIG9yIGFuIFVubG9jayByZXF1ZXN0ZWQgYXR0ZW1wdGVkIHRvIHJlbW92ZSBhIGxvY2sgaGVsZCBieSBhbm90aGVyIHByb2Nlc3MuIiB9LAorICAgIHsgIkVSUmZpbGV4aXN0cyIsIDgwLCAiVGhlIGZpbGUgbmFtZWQgaW4gYSBDcmVhdGUgRGlyZWN0b3J5LCBNYWtlIE5ldyBGaWxlIG9yIExpbmsgcmVxdWVzdCBhbHJlYWR5IGV4aXN0cy4iIH0sCisgICAgeyAiRVJSYmFkcGlwZSIsIDIzMCwgIlBpcGUgaW52YWxpZC4iIH0sCisgICAgeyAiRVJScGlwZWJ1c3kiLCAyMzEsICJBbGwgaW5zdGFuY2VzIG9mIHRoZSByZXF1ZXN0ZWQgcGlwZSBhcmUgYnVzeS4iIH0sCisgICAgeyAiRVJScGlwZWNsb3NpbmciLCAyMzIsICJQaXBlIGNsb3NlIGluIHByb2dyZXNzLiIgfSwKKyAgICB7ICJFUlJub3Rjb25uZWN0ZWQiLCAyMzMsICJObyBwcm9jZXNzIG9uIG90aGVyIGVuZCBvZiBwaXBlLiIgfSwKKyAgICB7ICJFUlJtb3JlZGF0YSIsIDIzNCwgIlRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSByZXR1cm5lZC4iIH0sCisgICAgeyBOVUxMLCAtMSwgTlVMTCB9CisgfTsKKworLyogU2VydmVyIEVycm9yIE1lc3NhZ2VzICovCitlcnJfY29kZV9zdHJ1Y3Qgc2VydmVyX21zZ3NbXSA9IHsKKyAgICB7ICJFUlJlcnJvciIsIDEsICJOb24tc3BlY2lmaWMgZXJyb3IgY29kZS4iIH0sCisgICAgeyAiRVJSYmFkcHciLCAyLCAiQmFkIHBhc3N3b3JkIC0gbmFtZS9wYXNzd29yZCBwYWlyIGluIGEgVHJlZSBDb25uZWN0IG9yIFNlc3Npb24gU2V0dXAgYXJlIGludmFsaWQuIiB9LAorICAgIHsgIkVSUmJhZHR5cGUiLCAzLCAicmVzZXJ2ZWQuIiB9LAorICAgIHsgIkVSUmFjY2VzcyIsIDQsICJUaGUgcmVxdWVzdGVyIGRvZXMgbm90IGhhdmUgdGhlIG5lY2Vzc2FyeSBhY2Nlc3MgcmlnaHRzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZm9yIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZSBjb250ZXh0IGlzIGRlZmluZWQgYnkgdGhlIFRJRCBvciB0aGUgVUlELiIgfSwKKyAgICB7ICJFUlJpbnZuaWQiLCA1LCAiVGhlIHRyZWUgSUQgKFRJRCkgc3BlY2lmaWVkIGluIGEgY29tbWFuZCB3YXMgaW52YWxpZC4iIH0sCisgICAgeyAiRVJSaW52bmV0bmFtZSIsIDYsICJJbnZhbGlkIG5ldHdvcmsgbmFtZSBpbiB0cmVlIGNvbm5lY3QuIiB9LAorICAgIHsgIkVSUmludmRldmljZSIsIDcsICJJbnZhbGlkIGRldmljZSAtIHByaW50ZXIgcmVxdWVzdCBtYWRlIHRvIG5vbi1wcmludGVyIGNvbm5lY3Rpb24gb3Igbm9uLXByaW50ZXIgcmVxdWVzdCBtYWRlIHRvIHByaW50ZXIgY29ubmVjdGlvbi4iIH0sCisgICAgeyAiRVJScWZ1bGwiLCA0OSwgIlByaW50IHF1ZXVlIGZ1bGwgKGZpbGVzKSAtLSByZXR1cm5lZCBieSBvcGVuIHByaW50IGZpbGUuIiB9LAorICAgIHsgIkVSUnF0b29iaWciLCA1MCwgIlByaW50IHF1ZXVlIGZ1bGwgLS0gbm8gc3BhY2UuIiB9LAorICAgIHsgIkVSUnFlb2YiLCA1MSwgIkVPRiBvbiBwcmludCBxdWV1ZSBkdW1wLiIgfSwKKyAgICB7ICJFUlJpbnZwZmlkIiwgNTIsICJJbnZhbGlkIHByaW50IGZpbGUgRklELiIgfSwKKyAgICB7ICJFUlJzbWJjbWQiLCA2NCwgIlRoZSBzZXJ2ZXIgZGlkIG5vdCByZWNvZ25pemUgdGhlIGNvbW1hbmQgcmVjZWl2ZWQuIiB9LAorICAgIHsgIkVSUnNydmVycm9yIiwgNjUsICJUaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLCBlLmcuLCBzeXN0ZW0gZmlsZSB1bmF2YWlsYWJsZS4iIH0sCisgICAgeyAiRVJSZmlsZXNwZWNzIiwgNjcsICJUaGUgZmlsZSBoYW5kbGUgKEZJRCkgYW5kIHBhdGhuYW1lIHBhcmFtZXRlcnMgY29udGFpbmVkIGFuIGludmFsaWQgY29tYmluYXRpb24gb2YgdmFsdWVzLiIgfSwKKyAgICB7ICJFUlJyZXNlcnZlZCIsIDY4LCAicmVzZXJ2ZWQuIiB9LAorICAgIHsgIkVSUmJhZHBlcm1pdHMiLCA2OSwgIlRoZSBhY2Nlc3MgcGVybWlzc2lvbnMgc3BlY2lmaWVkIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5IGFyZSBub3QgYSB2YWxpZCBjb21iaW5hdGlvbi4gIFRoZSBzZXJ2ZXIgY2Fubm90IHNldCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZS4iIH0sCisgICAgeyAiRVJScmVzZXJ2ZWQiLCA3MCwgInJlc2VydmVkLiIgfSwKKyAgICB7ICJFUlJzZXRhdHRybW9kZSIsIDcxLCAiVGhlIGF0dHJpYnV0ZSBtb2RlIGluIHRoZSBTZXQgRmlsZSBBdHRyaWJ1dGUgcmVxdWVzdCBpcyBpbnZhbGlkLiIgfSwKKyAgICB7ICJFUlJwYXVzZWQiLCA4MSwgIlNlcnZlciBpcyBwYXVzZWQuIiB9LAorICAgIHsgIkVSUm1zZ29mZiIsIDgyLCAiTm90IHJlY2VpdmluZyBtZXNzYWdlcy4iIH0sCisgICAgeyAiRVJSbm9yb29tIiwgODMsICJObyByb29tIHRvIGJ1ZmZlciBtZXNzYWdlLiIgfSwKKyAgICB7ICJFUlJybXVucyIsIDg3LCAiVG9vIG1hbnkgcmVtb3RlIHVzZXIgbmFtZXMuIiB9LAorICAgIHsgIkVSUnRpbWVvdXQiLCA4OCwgIk9wZXJhdGlvbiB0aW1lZCBvdXQuIiB9LAorICAgIHsgIkVSUm5vcmVzb3VyY2UiLCA4OSwgIk5vIHJlc291cmNlcyBjdXJyZW50bHkgYXZhaWxhYmxlIGZvciByZXF1ZXN0LiIgfSwKKyAgICB7ICJFUlJ0b29tYW55dWlkcyIsIDkwLCAiVG9vIG1hbnkgVUlEcyBhY3RpdmUgb24gdGhpcyBzZXNzaW9uLiIgfSwKKyAgICB7ICJFUlJiYWR1aWQiLCA5MSwgIlRoZSBVSUQgaXMgbm90IGtub3duIGFzIGEgdmFsaWQgSUQgb24gdGhpcyBzZXNzaW9uLiIgfSwKKyAgICB7ICJFUlJ1c2VtcHgiLCAyNTAsICJUZW1wIHVuYWJsZSB0byBzdXBwb3J0IFJhdywgdXNlIE1QWCBtb2RlLiIgfSwKKyAgICB7ICJFUlJ1c2VzdGQiLCAyNTEsICJUZW1wIHVuYWJsZSB0byBzdXBwb3J0IFJhdywgdXNlIHN0YW5kYXJkIHJlYWQvd3JpdGUuIiB9LAorICAgIHsgIkVSUmNvbnRtcHgiLCAyNTIsICJDb250aW51ZSBpbiBNUFggbW9kZS4iIH0sCisgICAgeyAiRVJScmVzZXJ2ZWQiLCAyNTMsICJyZXNlcnZlZC4iIH0sCisgICAgeyAiRVJScmVzZXJ2ZWQiLCAyNTQsICJyZXNlcnZlZC4iIH0sCisgICAgeyAiRVJSbm9zdXBwb3J0IiwgMHhGRkZGLCAiRnVuY3Rpb24gbm90IHN1cHBvcnRlZC4iIH0sCisgICAgeyBOVUxMLCAtMSwgTlVMTCB9Cit9OworCisvKiBIYXJkIEVycm9yIE1lc3NhZ2VzICovCitlcnJfY29kZV9zdHJ1Y3QgaGFyZF9tc2dzW10gPSB7CisgICAgeyAiRVJSbm93cml0ZSIsIDE5LCAiQXR0ZW1wdCB0byB3cml0ZSBvbiB3cml0ZS1wcm90ZWN0ZWQgZGlza2V0dGUuIiB9LAorICAgIHsgIkVSUmJhZHVuaXQiLCAyMCwgIlVua25vd24gdW5pdC4iIH0sCisgICAgeyAiRVJSbm90cmVhZHkiLCAyMSwgIkRyaXZlIG5vdCByZWFkeS4iIH0sCisgICAgeyAiRVJSYmFkY21kIiwgMjIsICJVbmtub3duIGNvbW1hbmQuIiB9LAorICAgIHsgIkVSUmRhdGEiLCAyMywgIkRhdGEgZXJyb3IgKENSQykuIiB9LAorICAgIHsgIkVSUmJhZHJlcSIsIDI0LCAiQmFkIHJlcXVlc3Qgc3RydWN0dXJlIGxlbmd0aC4iIH0sCisgICAgeyAiRVJSc2VlayIsIDI1ICwgIlNlZWsgZXJyb3IuIiB9LAorICAgIHsgIkVSUmJhZG1lZGlhIiwgMjYsICJVbmtub3duIG1lZGlhIHR5cGUuIiB9LAorICAgIHsgIkVSUmJhZHNlY3RvciIsIDI3LCAiU2VjdG9yIG5vdCBmb3VuZC4iIH0sCisgICAgeyAiRVJSbm9wYXBlciIsIDI4LCAiUHJpbnRlciBvdXQgb2YgcGFwZXIuIiB9LAorICAgIHsgIkVSUndyaXRlIiwgMjksICJXcml0ZSBmYXVsdC4iIH0sCisgICAgeyAiRVJScmVhZCIsIDMwLCAiUmVhZCBmYXVsdC4iIH0sCisgICAgeyAiRVJSZ2VuZXJhbCIsIDMxLCAiR2VuZXJhbCBmYWlsdXJlLiIgfSwKKyAgICB7ICJFUlJiYWRzaGFyZSIsIDMyLCAiQSBvcGVuIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIG9wZW4uIiB9LAorICAgIHsgIkVSUmxvY2siLCAzMywgIkEgTG9jayByZXF1ZXN0IGNvbmZsaWN0ZWQgd2l0aCBhbiBleGlzdGluZyBsb2NrIG9yIHNwZWNpZmllZCBhbiBpbnZhbGlkIG1vZGUsIG9yIGFuIFVubG9jayByZXF1ZXN0ZWQgYXR0ZW1wdGVkIHRvIHJlbW92ZSBhIGxvY2sgaGVsZCBieSBhbm90aGVyIHByb2Nlc3MuIiB9LAorICAgIHsgIkVSUndyb25nZGlzayIsIDM0LCAiVGhlIHdyb25nIGRpc2sgd2FzIGZvdW5kIGluIGEgZHJpdmUuIiB9LAorICAgIHsgIkVSUkZDQlVuYXZhaWwiLCAzNSwgIk5vIEZDQnMgYXJlIGF2YWlsYWJsZSB0byBwcm9jZXNzIHJlcXVlc3QuIiB9LAorICAgIHsgIkVSUnNoYXJlYnVmZXhjIiwgMzYsICJBIHNoYXJpbmcgYnVmZmVyIGhhcyBiZWVuIGV4Y2VlZGVkLiIgfSwKKyAgICB7IE5VTEwsIC0xLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCBjb2RlOworICAgIGNvbnN0IGNoYXIgKmNsYXNzOworICAgIGNvbnN0IGVycl9jb2RlX3N0cnVjdCAqZXJyX21zZ3M7Cit9IGVycl9jbGFzc2VzW10gPSB7CisgICAgeyAwLCAiU1VDQ0VTUyIsIE5VTEwgfSwKKyAgICB7IDB4MDEsICJFUlJET1MiLCBkb3NfbXNncyB9LAorICAgIHsgMHgwMiwgIkVSUlNSViIsIHNlcnZlcl9tc2dzIH0sCisgICAgeyAweDAzLCAiRVJSSFJEIiwgaGFyZF9tc2dzIH0sCisgICAgeyAweDA0LCAiRVJSWE9TIiwgTlVMTCB9LAorICAgIHsgMHhFMSwgIkVSUlJNWDEiLCBOVUxMIH0sCisgICAgeyAweEUyLCAiRVJSUk1YMiIsIE5VTEwgfSwKKyAgICB7IDB4RTMsICJFUlJSTVgzIiwgTlVMTCB9LAorICAgIHsgMHhGRiwgIkVSUkNNRCIsIE5VTEwgfSwKKyAgICB7IC0xLCBOVUxMLCBOVUxMIH0KK307CisKKy8qCisgKiByZXR1cm4gYSBTTUIgZXJyb3Igc3RyaW5nIGZyb20gYSBTTUIgYnVmZmVyCisgKi8KK2NoYXIgKgorc21iX2VycnN0cihpbnQgY2xhc3MsIGludCBudW0pCit7CisgICAgc3RhdGljIGNoYXIgcmV0WzEyOF07CisgICAgaW50IGksIGo7CisKKyAgICByZXRbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgZXJyX2NsYXNzZXNbaV0uY2xhc3M7IGkrKykKKwlpZiAoZXJyX2NsYXNzZXNbaV0uY29kZSA9PSBjbGFzcykgeworCSAgICBpZiAoZXJyX2NsYXNzZXNbaV0uZXJyX21zZ3MpIHsKKwkJY29uc3QgZXJyX2NvZGVfc3RydWN0ICplcnIgPSBlcnJfY2xhc3Nlc1tpXS5lcnJfbXNnczsKKwkJZm9yIChqID0gMDsgZXJyW2pdLm5hbWU7IGorKykKKwkJICAgIGlmIChudW0gPT0gZXJyW2pdLmNvZGUpIHsKKwkJCXNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICIlcyAtICVzICglcykiLAorCQkJICAgIGVycl9jbGFzc2VzW2ldLmNsYXNzLCBlcnJbal0ubmFtZSwgZXJyW2pdLm1lc3NhZ2UpOworCQkJcmV0dXJuIHJldDsKKwkJICAgIH0KKwkgICAgfQorCisJICAgIHNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICIlcyAtICVkIiwgZXJyX2NsYXNzZXNbaV0uY2xhc3MsIG51bSk7CisJICAgIHJldHVybiByZXQ7CisJfQorCisgICAgc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgIkVSUk9SOiBVbmtub3duIGVycm9yICglZCwlZCkiLCBjbGFzcywgbnVtKTsKKyAgICByZXR1cm4ocmV0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVfaW50MzJfdCBjb2RlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IG50X2Vycl9jb2RlX3N0cnVjdDsKKworLyoKKyAqIE5UIEVycm9yIGNvZGVzCisgKi8KK3N0YXRpYyBjb25zdCBudF9lcnJfY29kZV9zdHJ1Y3QgbnRfZXJyb3JzW10gPSB7CisgIHsgMHgwMDAwMDAwMCwgIlNUQVRVU19TVUNDRVNTIiB9LAorICB7IDB4MDAwMDAwMDAsICJTVEFUVVNfV0FJVF8wIiB9LAorICB7IDB4MDAwMDAwMDEsICJTVEFUVVNfV0FJVF8xIiB9LAorICB7IDB4MDAwMDAwMDIsICJTVEFUVVNfV0FJVF8yIiB9LAorICB7IDB4MDAwMDAwMDMsICJTVEFUVVNfV0FJVF8zIiB9LAorICB7IDB4MDAwMDAwM0YsICJTVEFUVVNfV0FJVF82MyIgfSwKKyAgeyAweDAwMDAwMDgwLCAiU1RBVFVTX0FCQU5ET05FRCIgfSwKKyAgeyAweDAwMDAwMDgwLCAiU1RBVFVTX0FCQU5ET05FRF9XQUlUXzAiIH0sCisgIHsgMHgwMDAwMDBCRiwgIlNUQVRVU19BQkFORE9ORURfV0FJVF82MyIgfSwKKyAgeyAweDAwMDAwMEMwLCAiU1RBVFVTX1VTRVJfQVBDIiB9LAorICB7IDB4MDAwMDAxMDAsICJTVEFUVVNfS0VSTkVMX0FQQyIgfSwKKyAgeyAweDAwMDAwMTAxLCAiU1RBVFVTX0FMRVJURUQiIH0sCisgIHsgMHgwMDAwMDEwMiwgIlNUQVRVU19USU1FT1VUIiB9LAorICB7IDB4MDAwMDAxMDMsICJTVEFUVVNfUEVORElORyIgfSwKKyAgeyAweDAwMDAwMTA0LCAiU1RBVFVTX1JFUEFSU0UiIH0sCisgIHsgMHgwMDAwMDEwNSwgIlNUQVRVU19NT1JFX0VOVFJJRVMiIH0sCisgIHsgMHgwMDAwMDEwNiwgIlNUQVRVU19OT1RfQUxMX0FTU0lHTkVEIiB9LAorICB7IDB4MDAwMDAxMDcsICJTVEFUVVNfU09NRV9OT1RfTUFQUEVEIiB9LAorICB7IDB4MDAwMDAxMDgsICJTVEFUVVNfT1BMT0NLX0JSRUFLX0lOX1BST0dSRVNTIiB9LAorICB7IDB4MDAwMDAxMDksICJTVEFUVVNfVk9MVU1FX01PVU5URUQiIH0sCisgIHsgMHgwMDAwMDEwQSwgIlNUQVRVU19SWEFDVF9DT01NSVRURUQiIH0sCisgIHsgMHgwMDAwMDEwQiwgIlNUQVRVU19OT1RJRllfQ0xFQU5VUCIgfSwKKyAgeyAweDAwMDAwMTBDLCAiU1RBVFVTX05PVElGWV9FTlVNX0RJUiIgfSwKKyAgeyAweDAwMDAwMTBELCAiU1RBVFVTX05PX1FVT1RBU19GT1JfQUNDT1VOVCIgfSwKKyAgeyAweDAwMDAwMTBFLCAiU1RBVFVTX1BSSU1BUllfVFJBTlNQT1JUX0NPTk5FQ1RfRkFJTEVEIiB9LAorICB7IDB4MDAwMDAxMTAsICJTVEFUVVNfUEFHRV9GQVVMVF9UUkFOU0lUSU9OIiB9LAorICB7IDB4MDAwMDAxMTEsICJTVEFUVVNfUEFHRV9GQVVMVF9ERU1BTkRfWkVSTyIgfSwKKyAgeyAweDAwMDAwMTEyLCAiU1RBVFVTX1BBR0VfRkFVTFRfQ09QWV9PTl9XUklURSIgfSwKKyAgeyAweDAwMDAwMTEzLCAiU1RBVFVTX1BBR0VfRkFVTFRfR1VBUkRfUEFHRSIgfSwKKyAgeyAweDAwMDAwMTE0LCAiU1RBVFVTX1BBR0VfRkFVTFRfUEFHSU5HX0ZJTEUiIH0sCisgIHsgMHgwMDAwMDExNSwgIlNUQVRVU19DQUNIRV9QQUdFX0xPQ0tFRCIgfSwKKyAgeyAweDAwMDAwMTE2LCAiU1RBVFVTX0NSQVNIX0RVTVAiIH0sCisgIHsgMHgwMDAwMDExNywgIlNUQVRVU19CVUZGRVJfQUxMX1pFUk9TIiB9LAorICB7IDB4MDAwMDAxMTgsICJTVEFUVVNfUkVQQVJTRV9PQkpFQ1QiIH0sCisgIHsgMHgwMDAwMDQ1QywgIlNUQVRVU19OT19TSFVURE9XTl9JTl9QUk9HUkVTUyIgfSwKKyAgeyAweDQwMDAwMDAwLCAiU1RBVFVTX09CSkVDVF9OQU1FX0VYSVNUUyIgfSwKKyAgeyAweDQwMDAwMDAxLCAiU1RBVFVTX1RIUkVBRF9XQVNfU1VTUEVOREVEIiB9LAorICB7IDB4NDAwMDAwMDIsICJTVEFUVVNfV09SS0lOR19TRVRfTElNSVRfUkFOR0UiIH0sCisgIHsgMHg0MDAwMDAwMywgIlNUQVRVU19JTUFHRV9OT1RfQVRfQkFTRSIgfSwKKyAgeyAweDQwMDAwMDA0LCAiU1RBVFVTX1JYQUNUX1NUQVRFX0NSRUFURUQiIH0sCisgIHsgMHg0MDAwMDAwNSwgIlNUQVRVU19TRUdNRU5UX05PVElGSUNBVElPTiIgfSwKKyAgeyAweDQwMDAwMDA2LCAiU1RBVFVTX0xPQ0FMX1VTRVJfU0VTU0lPTl9LRVkiIH0sCisgIHsgMHg0MDAwMDAwNywgIlNUQVRVU19CQURfQ1VSUkVOVF9ESVJFQ1RPUlkiIH0sCisgIHsgMHg0MDAwMDAwOCwgIlNUQVRVU19TRVJJQUxfTU9SRV9XUklURVMiIH0sCisgIHsgMHg0MDAwMDAwOSwgIlNUQVRVU19SRUdJU1RSWV9SRUNPVkVSRUQiIH0sCisgIHsgMHg0MDAwMDAwQSwgIlNUQVRVU19GVF9SRUFEX1JFQ09WRVJZX0ZST01fQkFDS1VQIiB9LAorICB7IDB4NDAwMDAwMEIsICJTVEFUVVNfRlRfV1JJVEVfUkVDT1ZFUlkiIH0sCisgIHsgMHg0MDAwMDAwQywgIlNUQVRVU19TRVJJQUxfQ09VTlRFUl9USU1FT1VUIiB9LAorICB7IDB4NDAwMDAwMEQsICJTVEFUVVNfTlVMTF9MTV9QQVNTV09SRCIgfSwKKyAgeyAweDQwMDAwMDBFLCAiU1RBVFVTX0lNQUdFX01BQ0hJTkVfVFlQRV9NSVNNQVRDSCIgfSwKKyAgeyAweDQwMDAwMDBGLCAiU1RBVFVTX1JFQ0VJVkVfUEFSVElBTCIgfSwKKyAgeyAweDQwMDAwMDEwLCAiU1RBVFVTX1JFQ0VJVkVfRVhQRURJVEVEIiB9LAorICB7IDB4NDAwMDAwMTEsICJTVEFUVVNfUkVDRUlWRV9QQVJUSUFMX0VYUEVESVRFRCIgfSwKKyAgeyAweDQwMDAwMDEyLCAiU1RBVFVTX0VWRU5UX0RPTkUiIH0sCisgIHsgMHg0MDAwMDAxMywgIlNUQVRVU19FVkVOVF9QRU5ESU5HIiB9LAorICB7IDB4NDAwMDAwMTQsICJTVEFUVVNfQ0hFQ0tJTkdfRklMRV9TWVNURU0iIH0sCisgIHsgMHg0MDAwMDAxNSwgIlNUQVRVU19GQVRBTF9BUFBfRVhJVCIgfSwKKyAgeyAweDQwMDAwMDE2LCAiU1RBVFVTX1BSRURFRklORURfSEFORExFIiB9LAorICB7IDB4NDAwMDAwMTcsICJTVEFUVVNfV0FTX1VOTE9DS0VEIiB9LAorICB7IDB4NDAwMDAwMTgsICJTVEFUVVNfU0VSVklDRV9OT1RJRklDQVRJT04iIH0sCisgIHsgMHg0MDAwMDAxOSwgIlNUQVRVU19XQVNfTE9DS0VEIiB9LAorICB7IDB4NDAwMDAwMUEsICJTVEFUVVNfTE9HX0hBUkRfRVJST1IiIH0sCisgIHsgMHg0MDAwMDAxQiwgIlNUQVRVU19BTFJFQURZX1dJTjMyIiB9LAorICB7IDB4NDAwMDAwMUMsICJTVEFUVVNfV1g4Nl9VTlNJTVVMQVRFIiB9LAorICB7IDB4NDAwMDAwMUQsICJTVEFUVVNfV1g4Nl9DT05USU5VRSIgfSwKKyAgeyAweDQwMDAwMDFFLCAiU1RBVFVTX1dYODZfU0lOR0xFX1NURVAiIH0sCisgIHsgMHg0MDAwMDAxRiwgIlNUQVRVU19XWDg2X0JSRUFLUE9JTlQiIH0sCisgIHsgMHg0MDAwMDAyMCwgIlNUQVRVU19XWDg2X0VYQ0VQVElPTl9DT05USU5VRSIgfSwKKyAgeyAweDQwMDAwMDIxLCAiU1RBVFVTX1dYODZfRVhDRVBUSU9OX0xBU1RDSEFOQ0UiIH0sCisgIHsgMHg0MDAwMDAyMiwgIlNUQVRVU19XWDg2X0VYQ0VQVElPTl9DSEFJTiIgfSwKKyAgeyAweDQwMDAwMDIzLCAiU1RBVFVTX0lNQUdFX01BQ0hJTkVfVFlQRV9NSVNNQVRDSF9FWEUiIH0sCisgIHsgMHg0MDAwMDAyNCwgIlNUQVRVU19OT19ZSUVMRF9QRVJGT1JNRUQiIH0sCisgIHsgMHg0MDAwMDAyNSwgIlNUQVRVU19USU1FUl9SRVNVTUVfSUdOT1JFRCIgfSwKKyAgeyAweDgwMDAwMDAxLCAiU1RBVFVTX0dVQVJEX1BBR0VfVklPTEFUSU9OIiB9LAorICB7IDB4ODAwMDAwMDIsICJTVEFUVVNfREFUQVRZUEVfTUlTQUxJR05NRU5UIiB9LAorICB7IDB4ODAwMDAwMDMsICJTVEFUVVNfQlJFQUtQT0lOVCIgfSwKKyAgeyAweDgwMDAwMDA0LCAiU1RBVFVTX1NJTkdMRV9TVEVQIiB9LAorICB7IDB4ODAwMDAwMDUsICJTVEFUVVNfQlVGRkVSX09WRVJGTE9XIiB9LAorICB7IDB4ODAwMDAwMDYsICJTVEFUVVNfTk9fTU9SRV9GSUxFUyIgfSwKKyAgeyAweDgwMDAwMDA3LCAiU1RBVFVTX1dBS0VfU1lTVEVNX0RFQlVHR0VSIiB9LAorICB7IDB4ODAwMDAwMEEsICJTVEFUVVNfSEFORExFU19DTE9TRUQiIH0sCisgIHsgMHg4MDAwMDAwQiwgIlNUQVRVU19OT19JTkhFUklUQU5DRSIgfSwKKyAgeyAweDgwMDAwMDBDLCAiU1RBVFVTX0dVSURfU1VCU1RJVFVUSU9OX01BREUiIH0sCisgIHsgMHg4MDAwMDAwRCwgIlNUQVRVU19QQVJUSUFMX0NPUFkiIH0sCisgIHsgMHg4MDAwMDAwRSwgIlNUQVRVU19ERVZJQ0VfUEFQRVJfRU1QVFkiIH0sCisgIHsgMHg4MDAwMDAwRiwgIlNUQVRVU19ERVZJQ0VfUE9XRVJFRF9PRkYiIH0sCisgIHsgMHg4MDAwMDAxMCwgIlNUQVRVU19ERVZJQ0VfT0ZGX0xJTkUiIH0sCisgIHsgMHg4MDAwMDAxMSwgIlNUQVRVU19ERVZJQ0VfQlVTWSIgfSwKKyAgeyAweDgwMDAwMDEyLCAiU1RBVFVTX05PX01PUkVfRUFTIiB9LAorICB7IDB4ODAwMDAwMTMsICJTVEFUVVNfSU5WQUxJRF9FQV9OQU1FIiB9LAorICB7IDB4ODAwMDAwMTQsICJTVEFUVVNfRUFfTElTVF9JTkNPTlNJU1RFTlQiIH0sCisgIHsgMHg4MDAwMDAxNSwgIlNUQVRVU19JTlZBTElEX0VBX0ZMQUciIH0sCisgIHsgMHg4MDAwMDAxNiwgIlNUQVRVU19WRVJJRllfUkVRVUlSRUQiIH0sCisgIHsgMHg4MDAwMDAxNywgIlNUQVRVU19FWFRSQU5FT1VTX0lORk9STUFUSU9OIiB9LAorICB7IDB4ODAwMDAwMTgsICJTVEFUVVNfUlhBQ1RfQ09NTUlUX05FQ0VTU0FSWSIgfSwKKyAgeyAweDgwMDAwMDFBLCAiU1RBVFVTX05PX01PUkVfRU5UUklFUyIgfSwKKyAgeyAweDgwMDAwMDFCLCAiU1RBVFVTX0ZJTEVNQVJLX0RFVEVDVEVEIiB9LAorICB7IDB4ODAwMDAwMUMsICJTVEFUVVNfTUVESUFfQ0hBTkdFRCIgfSwKKyAgeyAweDgwMDAwMDFELCAiU1RBVFVTX0JVU19SRVNFVCIgfSwKKyAgeyAweDgwMDAwMDFFLCAiU1RBVFVTX0VORF9PRl9NRURJQSIgfSwKKyAgeyAweDgwMDAwMDFGLCAiU1RBVFVTX0JFR0lOTklOR19PRl9NRURJQSIgfSwKKyAgeyAweDgwMDAwMDIwLCAiU1RBVFVTX01FRElBX0NIRUNLIiB9LAorICB7IDB4ODAwMDAwMjEsICJTVEFUVVNfU0VUTUFSS19ERVRFQ1RFRCIgfSwKKyAgeyAweDgwMDAwMDIyLCAiU1RBVFVTX05PX0RBVEFfREVURUNURUQiIH0sCisgIHsgMHg4MDAwMDAyMywgIlNUQVRVU19SRURJUkVDVE9SX0hBU19PUEVOX0hBTkRMRVMiIH0sCisgIHsgMHg4MDAwMDAyNCwgIlNUQVRVU19TRVJWRVJfSEFTX09QRU5fSEFORExFUyIgfSwKKyAgeyAweDgwMDAwMDI1LCAiU1RBVFVTX0FMUkVBRFlfRElTQ09OTkVDVEVEIiB9LAorICB7IDB4ODAwMDAwMjYsICJTVEFUVVNfTE9OR0pVTVAiIH0sCisgIHsgMHg4MDA0MDExMSwgIk1BUElfRV9MT0dPTl9GQUlMRUQiIH0sCisgIHsgMHg4MDA5MDMwMCwgIlNFQ19FX0lOU1VGRklDSUVOVF9NRU1PUlkiIH0sCisgIHsgMHg4MDA5MDMwMSwgIlNFQ19FX0lOVkFMSURfSEFORExFIiB9LAorICB7IDB4ODAwOTAzMDIsICJTRUNfRV9VTlNVUFBPUlRFRF9GVU5DVElPTiIgfSwKKyAgeyAweDgwMDkwMzBCLCAiU0VDX0VfTk9fSU1QRVJTT05BVElPTiIgfSwKKyAgeyAweDgwMDkwMzBELCAiU0VDX0VfVU5LTk9XTl9DUkVERU5USUFMUyIgfSwKKyAgeyAweDgwMDkwMzBFLCAiU0VDX0VfTk9fQ1JFREVOVElBTFMiIH0sCisgIHsgMHg4MDA5MDMwRiwgIlNFQ19FX01FU1NBR0VfQUxURVJFRCIgfSwKKyAgeyAweDgwMDkwMzEwLCAiU0VDX0VfT1VUX09GX1NFUVVFTkNFIiB9LAorICB7IDB4ODAwOTAzMTEsICJTRUNfRV9OT19BVVRIRU5USUNBVElOR19BVVRIT1JJVFkiIH0sCisgIHsgMHhDMDAwMDAwMSwgIlNUQVRVU19VTlNVQ0NFU1NGVUwiIH0sCisgIHsgMHhDMDAwMDAwMiwgIlNUQVRVU19OT1RfSU1QTEVNRU5URUQiIH0sCisgIHsgMHhDMDAwMDAwMywgIlNUQVRVU19JTlZBTElEX0lORk9fQ0xBU1MiIH0sCisgIHsgMHhDMDAwMDAwNCwgIlNUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDAwMDA1LCAiU1RBVFVTX0FDQ0VTU19WSU9MQVRJT04iIH0sCisgIHsgMHhDMDAwMDAwNiwgIlNUQVRVU19JTl9QQUdFX0VSUk9SIiB9LAorICB7IDB4QzAwMDAwMDcsICJTVEFUVVNfUEFHRUZJTEVfUVVPVEEiIH0sCisgIHsgMHhDMDAwMDAwOCwgIlNUQVRVU19JTlZBTElEX0hBTkRMRSIgfSwKKyAgeyAweEMwMDAwMDA5LCAiU1RBVFVTX0JBRF9JTklUSUFMX1NUQUNLIiB9LAorICB7IDB4QzAwMDAwMEEsICJTVEFUVVNfQkFEX0lOSVRJQUxfUEMiIH0sCisgIHsgMHhDMDAwMDAwQiwgIlNUQVRVU19JTlZBTElEX0NJRCIgfSwKKyAgeyAweEMwMDAwMDBDLCAiU1RBVFVTX1RJTUVSX05PVF9DQU5DRUxFRCIgfSwKKyAgeyAweEMwMDAwMDBELCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSIiB9LAorICB7IDB4QzAwMDAwMEUsICJTVEFUVVNfTk9fU1VDSF9ERVZJQ0UiIH0sCisgIHsgMHhDMDAwMDAwRiwgIlNUQVRVU19OT19TVUNIX0ZJTEUiIH0sCisgIHsgMHhDMDAwMDAxMCwgIlNUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUIiB9LAorICB7IDB4QzAwMDAwMTEsICJTVEFUVVNfRU5EX09GX0ZJTEUiIH0sCisgIHsgMHhDMDAwMDAxMiwgIlNUQVRVU19XUk9OR19WT0xVTUUiIH0sCisgIHsgMHhDMDAwMDAxMywgIlNUQVRVU19OT19NRURJQV9JTl9ERVZJQ0UiIH0sCisgIHsgMHhDMDAwMDAxNCwgIlNUQVRVU19VTlJFQ09HTklaRURfTUVESUEiIH0sCisgIHsgMHhDMDAwMDAxNSwgIlNUQVRVU19OT05FWElTVEVOVF9TRUNUT1IiIH0sCisgIHsgMHhDMDAwMDAxNiwgIlNUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQiIH0sCisgIHsgMHhDMDAwMDAxNywgIlNUQVRVU19OT19NRU1PUlkiIH0sCisgIHsgMHhDMDAwMDAxOCwgIlNUQVRVU19DT05GTElDVElOR19BRERSRVNTRVMiIH0sCisgIHsgMHhDMDAwMDAxOSwgIlNUQVRVU19OT1RfTUFQUEVEX1ZJRVciIH0sCisgIHsgMHhDMDAwMDAxQSwgIlNUQVRVU19VTkFCTEVfVE9fRlJFRV9WTSIgfSwKKyAgeyAweEMwMDAwMDFCLCAiU1RBVFVTX1VOQUJMRV9UT19ERUxFVEVfU0VDVElPTiIgfSwKKyAgeyAweEMwMDAwMDFDLCAiU1RBVFVTX0lOVkFMSURfU1lTVEVNX1NFUlZJQ0UiIH0sCisgIHsgMHhDMDAwMDAxRCwgIlNUQVRVU19JTExFR0FMX0lOU1RSVUNUSU9OIiB9LAorICB7IDB4QzAwMDAwMUUsICJTVEFUVVNfSU5WQUxJRF9MT0NLX1NFUVVFTkNFIiB9LAorICB7IDB4QzAwMDAwMUYsICJTVEFUVVNfSU5WQUxJRF9WSUVXX1NJWkUiIH0sCisgIHsgMHhDMDAwMDAyMCwgIlNUQVRVU19JTlZBTElEX0ZJTEVfRk9SX1NFQ1RJT04iIH0sCisgIHsgMHhDMDAwMDAyMSwgIlNUQVRVU19BTFJFQURZX0NPTU1JVFRFRCIgfSwKKyAgeyAweEMwMDAwMDIyLCAiU1RBVFVTX0FDQ0VTU19ERU5JRUQiIH0sCisgIHsgMHhDMDAwMDAyMywgIlNUQVRVU19CVUZGRVJfVE9PX1NNQUxMIiB9LAorICB7IDB4QzAwMDAwMjQsICJTVEFUVVNfT0JKRUNUX1RZUEVfTUlTTUFUQ0giIH0sCisgIHsgMHhDMDAwMDAyNSwgIlNUQVRVU19OT05DT05USU5VQUJMRV9FWENFUFRJT04iIH0sCisgIHsgMHhDMDAwMDAyNiwgIlNUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OIiB9LAorICB7IDB4QzAwMDAwMjcsICJTVEFUVVNfVU5XSU5EIiB9LAorICB7IDB4QzAwMDAwMjgsICJTVEFUVVNfQkFEX1NUQUNLIiB9LAorICB7IDB4QzAwMDAwMjksICJTVEFUVVNfSU5WQUxJRF9VTldJTkRfVEFSR0VUIiB9LAorICB7IDB4QzAwMDAwMkEsICJTVEFUVVNfTk9UX0xPQ0tFRCIgfSwKKyAgeyAweEMwMDAwMDJCLCAiU1RBVFVTX1BBUklUWV9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMDJDLCAiU1RBVFVTX1VOQUJMRV9UT19ERUNPTU1JVF9WTSIgfSwKKyAgeyAweEMwMDAwMDJELCAiU1RBVFVTX05PVF9DT01NSVRURUQiIH0sCisgIHsgMHhDMDAwMDAyRSwgIlNUQVRVU19JTlZBTElEX1BPUlRfQVRUUklCVVRFUyIgfSwKKyAgeyAweEMwMDAwMDJGLCAiU1RBVFVTX1BPUlRfTUVTU0FHRV9UT09fTE9ORyIgfSwKKyAgeyAweEMwMDAwMDMwLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSX01JWCIgfSwKKyAgeyAweEMwMDAwMDMxLCAiU1RBVFVTX0lOVkFMSURfUVVPVEFfTE9XRVIiIH0sCisgIHsgMHhDMDAwMDAzMiwgIlNUQVRVU19ESVNLX0NPUlJVUFRfRVJST1IiIH0sCisgIHsgMHhDMDAwMDAzMywgIlNUQVRVU19PQkpFQ1RfTkFNRV9JTlZBTElEIiB9LAorICB7IDB4QzAwMDAwMzQsICJTVEFUVVNfT0JKRUNUX05BTUVfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAwMzUsICJTVEFUVVNfT0JKRUNUX05BTUVfQ09MTElTSU9OIiB9LAorICB7IDB4QzAwMDAwMzcsICJTVEFUVVNfUE9SVF9ESVNDT05ORUNURUQiIH0sCisgIHsgMHhDMDAwMDAzOCwgIlNUQVRVU19ERVZJQ0VfQUxSRUFEWV9BVFRBQ0hFRCIgfSwKKyAgeyAweEMwMDAwMDM5LCAiU1RBVFVTX09CSkVDVF9QQVRIX0lOVkFMSUQiIH0sCisgIHsgMHhDMDAwMDAzQSwgIlNUQVRVU19PQkpFQ1RfUEFUSF9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDAzQiwgIlNUQVRVU19PQkpFQ1RfUEFUSF9TWU5UQVhfQkFEIiB9LAorICB7IDB4QzAwMDAwM0MsICJTVEFUVVNfREFUQV9PVkVSUlVOIiB9LAorICB7IDB4QzAwMDAwM0QsICJTVEFUVVNfREFUQV9MQVRFX0VSUk9SIiB9LAorICB7IDB4QzAwMDAwM0UsICJTVEFUVVNfREFUQV9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMDNGLCAiU1RBVFVTX0NSQ19FUlJPUiIgfSwKKyAgeyAweEMwMDAwMDQwLCAiU1RBVFVTX1NFQ1RJT05fVE9PX0JJRyIgfSwKKyAgeyAweEMwMDAwMDQxLCAiU1RBVFVTX1BPUlRfQ09OTkVDVElPTl9SRUZVU0VEIiB9LAorICB7IDB4QzAwMDAwNDIsICJTVEFUVVNfSU5WQUxJRF9QT1JUX0hBTkRMRSIgfSwKKyAgeyAweEMwMDAwMDQzLCAiU1RBVFVTX1NIQVJJTkdfVklPTEFUSU9OIiB9LAorICB7IDB4QzAwMDAwNDQsICJTVEFUVVNfUVVPVEFfRVhDRUVERUQiIH0sCisgIHsgMHhDMDAwMDA0NSwgIlNUQVRVU19JTlZBTElEX1BBR0VfUFJPVEVDVElPTiIgfSwKKyAgeyAweEMwMDAwMDQ2LCAiU1RBVFVTX01VVEFOVF9OT1RfT1dORUQiIH0sCisgIHsgMHhDMDAwMDA0NywgIlNUQVRVU19TRU1BUEhPUkVfTElNSVRfRVhDRUVERUQiIH0sCisgIHsgMHhDMDAwMDA0OCwgIlNUQVRVU19QT1JUX0FMUkVBRFlfU0VUIiB9LAorICB7IDB4QzAwMDAwNDksICJTVEFUVVNfU0VDVElPTl9OT1RfSU1BR0UiIH0sCisgIHsgMHhDMDAwMDA0QSwgIlNUQVRVU19TVVNQRU5EX0NPVU5UX0VYQ0VFREVEIiB9LAorICB7IDB4QzAwMDAwNEIsICJTVEFUVVNfVEhSRUFEX0lTX1RFUk1JTkFUSU5HIiB9LAorICB7IDB4QzAwMDAwNEMsICJTVEFUVVNfQkFEX1dPUktJTkdfU0VUX0xJTUlUIiB9LAorICB7IDB4QzAwMDAwNEQsICJTVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQIiB9LAorICB7IDB4QzAwMDAwNEUsICJTVEFUVVNfU0VDVElPTl9QUk9URUNUSU9OIiB9LAorICB7IDB4QzAwMDAwNEYsICJTVEFUVVNfRUFTX05PVF9TVVBQT1JURUQiIH0sCisgIHsgMHhDMDAwMDA1MCwgIlNUQVRVU19FQV9UT09fTEFSR0UiIH0sCisgIHsgMHhDMDAwMDA1MSwgIlNUQVRVU19OT05FWElTVEVOVF9FQV9FTlRSWSIgfSwKKyAgeyAweEMwMDAwMDUyLCAiU1RBVFVTX05PX0VBU19PTl9GSUxFIiB9LAorICB7IDB4QzAwMDAwNTMsICJTVEFUVVNfRUFfQ09SUlVQVF9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMDU0LCAiU1RBVFVTX0ZJTEVfTE9DS19DT05GTElDVCIgfSwKKyAgeyAweEMwMDAwMDU1LCAiU1RBVFVTX0xPQ0tfTk9UX0dSQU5URUQiIH0sCisgIHsgMHhDMDAwMDA1NiwgIlNUQVRVU19ERUxFVEVfUEVORElORyIgfSwKKyAgeyAweEMwMDAwMDU3LCAiU1RBVFVTX0NUTF9GSUxFX05PVF9TVVBQT1JURUQiIH0sCisgIHsgMHhDMDAwMDA1OCwgIlNUQVRVU19VTktOT1dOX1JFVklTSU9OIiB9LAorICB7IDB4QzAwMDAwNTksICJTVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0giIH0sCisgIHsgMHhDMDAwMDA1QSwgIlNUQVRVU19JTlZBTElEX09XTkVSIiB9LAorICB7IDB4QzAwMDAwNUIsICJTVEFUVVNfSU5WQUxJRF9QUklNQVJZX0dST1VQIiB9LAorICB7IDB4QzAwMDAwNUMsICJTVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTiIgfSwKKyAgeyAweEMwMDAwMDVELCAiU1RBVFVTX0NBTlRfRElTQUJMRV9NQU5EQVRPUlkiIH0sCisgIHsgMHhDMDAwMDA1RSwgIlNUQVRVU19OT19MT0dPTl9TRVJWRVJTIiB9LAorICB7IDB4QzAwMDAwNUYsICJTVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OIiB9LAorICB7IDB4QzAwMDAwNjAsICJTVEFUVVNfTk9fU1VDSF9QUklWSUxFR0UiIH0sCisgIHsgMHhDMDAwMDA2MSwgIlNUQVRVU19QUklWSUxFR0VfTk9UX0hFTEQiIH0sCisgIHsgMHhDMDAwMDA2MiwgIlNUQVRVU19JTlZBTElEX0FDQ09VTlRfTkFNRSIgfSwKKyAgeyAweEMwMDAwMDYzLCAiU1RBVFVTX1VTRVJfRVhJU1RTIiB9LAorICB7IDB4QzAwMDAwNjQsICJTVEFUVVNfTk9fU1VDSF9VU0VSIiB9LAorICB7IDB4QzAwMDAwNjUsICJTVEFUVVNfR1JPVVBfRVhJU1RTIiB9LAorICB7IDB4QzAwMDAwNjYsICJTVEFUVVNfTk9fU1VDSF9HUk9VUCIgfSwKKyAgeyAweEMwMDAwMDY3LCAiU1RBVFVTX01FTUJFUl9JTl9HUk9VUCIgfSwKKyAgeyAweEMwMDAwMDY4LCAiU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVAiIH0sCisgIHsgMHhDMDAwMDA2OSwgIlNUQVRVU19MQVNUX0FETUlOIiB9LAorICB7IDB4QzAwMDAwNkEsICJTVEFUVVNfV1JPTkdfUEFTU1dPUkQiIH0sCisgIHsgMHhDMDAwMDA2QiwgIlNUQVRVU19JTExfRk9STUVEX1BBU1NXT1JEIiB9LAorICB7IDB4QzAwMDAwNkMsICJTVEFUVVNfUEFTU1dPUkRfUkVTVFJJQ1RJT04iIH0sCisgIHsgMHhDMDAwMDA2RCwgIlNUQVRVU19MT0dPTl9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAwNkUsICJTVEFUVVNfQUNDT1VOVF9SRVNUUklDVElPTiIgfSwKKyAgeyAweEMwMDAwMDZGLCAiU1RBVFVTX0lOVkFMSURfTE9HT05fSE9VUlMiIH0sCisgIHsgMHhDMDAwMDA3MCwgIlNUQVRVU19JTlZBTElEX1dPUktTVEFUSU9OIiB9LAorICB7IDB4QzAwMDAwNzEsICJTVEFUVVNfUEFTU1dPUkRfRVhQSVJFRCIgfSwKKyAgeyAweEMwMDAwMDcyLCAiU1RBVFVTX0FDQ09VTlRfRElTQUJMRUQiIH0sCisgIHsgMHhDMDAwMDA3MywgIlNUQVRVU19OT05FX01BUFBFRCIgfSwKKyAgeyAweEMwMDAwMDc0LCAiU1RBVFVTX1RPT19NQU5ZX0xVSURTX1JFUVVFU1RFRCIgfSwKKyAgeyAweEMwMDAwMDc1LCAiU1RBVFVTX0xVSURTX0VYSEFVU1RFRCIgfSwKKyAgeyAweEMwMDAwMDc2LCAiU1RBVFVTX0lOVkFMSURfU1VCX0FVVEhPUklUWSIgfSwKKyAgeyAweEMwMDAwMDc3LCAiU1RBVFVTX0lOVkFMSURfQUNMIiB9LAorICB7IDB4QzAwMDAwNzgsICJTVEFUVVNfSU5WQUxJRF9TSUQiIH0sCisgIHsgMHhDMDAwMDA3OSwgIlNUQVRVU19JTlZBTElEX1NFQ1VSSVRZX0RFU0NSIiB9LAorICB7IDB4QzAwMDAwN0EsICJTVEFUVVNfUFJPQ0VEVVJFX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMDdCLCAiU1RBVFVTX0lOVkFMSURfSU1BR0VfRk9STUFUIiB9LAorICB7IDB4QzAwMDAwN0MsICJTVEFUVVNfTk9fVE9LRU4iIH0sCisgIHsgMHhDMDAwMDA3RCwgIlNUQVRVU19CQURfSU5IRVJJVEFOQ0VfQUNMIiB9LAorICB7IDB4QzAwMDAwN0UsICJTVEFUVVNfUkFOR0VfTk9UX0xPQ0tFRCIgfSwKKyAgeyAweEMwMDAwMDdGLCAiU1RBVFVTX0RJU0tfRlVMTCIgfSwKKyAgeyAweEMwMDAwMDgwLCAiU1RBVFVTX1NFUlZFUl9ESVNBQkxFRCIgfSwKKyAgeyAweEMwMDAwMDgxLCAiU1RBVFVTX1NFUlZFUl9OT1RfRElTQUJMRUQiIH0sCisgIHsgMHhDMDAwMDA4MiwgIlNUQVRVU19UT09fTUFOWV9HVUlEU19SRVFVRVNURUQiIH0sCisgIHsgMHhDMDAwMDA4MywgIlNUQVRVU19HVUlEU19FWEhBVVNURUQiIH0sCisgIHsgMHhDMDAwMDA4NCwgIlNUQVRVU19JTlZBTElEX0lEX0FVVEhPUklUWSIgfSwKKyAgeyAweEMwMDAwMDg1LCAiU1RBVFVTX0FHRU5UU19FWEhBVVNURUQiIH0sCisgIHsgMHhDMDAwMDA4NiwgIlNUQVRVU19JTlZBTElEX1ZPTFVNRV9MQUJFTCIgfSwKKyAgeyAweEMwMDAwMDg3LCAiU1RBVFVTX1NFQ1RJT05fTk9UX0VYVEVOREVEIiB9LAorICB7IDB4QzAwMDAwODgsICJTVEFUVVNfTk9UX01BUFBFRF9EQVRBIiB9LAorICB7IDB4QzAwMDAwODksICJTVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDA4QSwgIlNUQVRVU19SRVNPVVJDRV9UWVBFX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMDhCLCAiU1RBVFVTX1JFU09VUkNFX05BTUVfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAwOEMsICJTVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEIiB9LAorICB7IDB4QzAwMDAwOEQsICJTVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORCIgfSwKKyAgeyAweEMwMDAwMDhFLCAiU1RBVFVTX0ZMT0FUX0RJVklERV9CWV9aRVJPIiB9LAorICB7IDB4QzAwMDAwOEYsICJTVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQiIH0sCisgIHsgMHhDMDAwMDA5MCwgIlNUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTiIgfSwKKyAgeyAweEMwMDAwMDkxLCAiU1RBVFVTX0ZMT0FUX09WRVJGTE9XIiB9LAorICB7IDB4QzAwMDAwOTIsICJTVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0siIH0sCisgIHsgMHhDMDAwMDA5MywgIlNUQVRVU19GTE9BVF9VTkRFUkZMT1ciIH0sCisgIHsgMHhDMDAwMDA5NCwgIlNUQVRVU19JTlRFR0VSX0RJVklERV9CWV9aRVJPIiB9LAorICB7IDB4QzAwMDAwOTUsICJTVEFUVVNfSU5URUdFUl9PVkVSRkxPVyIgfSwKKyAgeyAweEMwMDAwMDk2LCAiU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT04iIH0sCisgIHsgMHhDMDAwMDA5NywgIlNUQVRVU19UT09fTUFOWV9QQUdJTkdfRklMRVMiIH0sCisgIHsgMHhDMDAwMDA5OCwgIlNUQVRVU19GSUxFX0lOVkFMSUQiIH0sCisgIHsgMHhDMDAwMDA5OSwgIlNUQVRVU19BTExPVFRFRF9TUEFDRV9FWENFRURFRCIgfSwKKyAgeyAweEMwMDAwMDlBLCAiU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMiIH0sCisgIHsgMHhDMDAwMDA5QiwgIlNUQVRVU19ERlNfRVhJVF9QQVRIX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAwOUMsICJTVEFUVVNfREVWSUNFX0RBVEFfRVJST1IiIH0sCisgIHsgMHhDMDAwMDA5RCwgIlNUQVRVU19ERVZJQ0VfTk9UX0NPTk5FQ1RFRCIgfSwKKyAgeyAweEMwMDAwMDlFLCAiU1RBVFVTX0RFVklDRV9QT1dFUl9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAwOUYsICJTVEFUVVNfRlJFRV9WTV9OT1RfQVRfQkFTRSIgfSwKKyAgeyAweEMwMDAwMEEwLCAiU1RBVFVTX01FTU9SWV9OT1RfQUxMT0NBVEVEIiB9LAorICB7IDB4QzAwMDAwQTEsICJTVEFUVVNfV09SS0lOR19TRVRfUVVPVEEiIH0sCisgIHsgMHhDMDAwMDBBMiwgIlNUQVRVU19NRURJQV9XUklURV9QUk9URUNURUQiIH0sCisgIHsgMHhDMDAwMDBBMywgIlNUQVRVU19ERVZJQ0VfTk9UX1JFQURZIiB9LAorICB7IDB4QzAwMDAwQTQsICJTVEFUVVNfSU5WQUxJRF9HUk9VUF9BVFRSSUJVVEVTIiB9LAorICB7IDB4QzAwMDAwQTUsICJTVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUwiIH0sCisgIHsgMHhDMDAwMDBBNiwgIlNUQVRVU19DQU5UX09QRU5fQU5PTllNT1VTIiB9LAorICB7IDB4QzAwMDAwQTcsICJTVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1MiIH0sCisgIHsgMHhDMDAwMDBBOCwgIlNUQVRVU19CQURfVE9LRU5fVFlQRSIgfSwKKyAgeyAweEMwMDAwMEE5LCAiU1RBVFVTX0JBRF9NQVNURVJfQk9PVF9SRUNPUkQiIH0sCisgIHsgMHhDMDAwMDBBQSwgIlNUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlQiIH0sCisgIHsgMHhDMDAwMDBBQiwgIlNUQVRVU19JTlNUQU5DRV9OT1RfQVZBSUxBQkxFIiB9LAorICB7IDB4QzAwMDAwQUMsICJTVEFUVVNfUElQRV9OT1RfQVZBSUxBQkxFIiB9LAorICB7IDB4QzAwMDAwQUQsICJTVEFUVVNfSU5WQUxJRF9QSVBFX1NUQVRFIiB9LAorICB7IDB4QzAwMDAwQUUsICJTVEFUVVNfUElQRV9CVVNZIiB9LAorICB7IDB4QzAwMDAwQUYsICJTVEFUVVNfSUxMRUdBTF9GVU5DVElPTiIgfSwKKyAgeyAweEMwMDAwMEIwLCAiU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEIiB9LAorICB7IDB4QzAwMDAwQjEsICJTVEFUVVNfUElQRV9DTE9TSU5HIiB9LAorICB7IDB4QzAwMDAwQjIsICJTVEFUVVNfUElQRV9DT05ORUNURUQiIH0sCisgIHsgMHhDMDAwMDBCMywgIlNUQVRVU19QSVBFX0xJU1RFTklORyIgfSwKKyAgeyAweEMwMDAwMEI0LCAiU1RBVFVTX0lOVkFMSURfUkVBRF9NT0RFIiB9LAorICB7IDB4QzAwMDAwQjUsICJTVEFUVVNfSU9fVElNRU9VVCIgfSwKKyAgeyAweEMwMDAwMEI2LCAiU1RBVFVTX0ZJTEVfRk9SQ0VEX0NMT1NFRCIgfSwKKyAgeyAweEMwMDAwMEI3LCAiU1RBVFVTX1BST0ZJTElOR19OT1RfU1RBUlRFRCIgfSwKKyAgeyAweEMwMDAwMEI4LCAiU1RBVFVTX1BST0ZJTElOR19OT1RfU1RPUFBFRCIgfSwKKyAgeyAweEMwMDAwMEI5LCAiU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVQiIH0sCisgIHsgMHhDMDAwMDBCQSwgIlNUQVRVU19GSUxFX0lTX0FfRElSRUNUT1JZIiB9LAorICB7IDB4QzAwMDAwQkIsICJTVEFUVVNfTk9UX1NVUFBPUlRFRCIgfSwKKyAgeyAweEMwMDAwMEJDLCAiU1RBVFVTX1JFTU9URV9OT1RfTElTVEVOSU5HIiB9LAorICB7IDB4QzAwMDAwQkQsICJTVEFUVVNfRFVQTElDQVRFX05BTUUiIH0sCisgIHsgMHhDMDAwMDBCRSwgIlNUQVRVU19CQURfTkVUV09SS19QQVRIIiB9LAorICB7IDB4QzAwMDAwQkYsICJTVEFUVVNfTkVUV09SS19CVVNZIiB9LAorICB7IDB4QzAwMDAwQzAsICJTVEFUVVNfREVWSUNFX0RPRVNfTk9UX0VYSVNUIiB9LAorICB7IDB4QzAwMDAwQzEsICJTVEFUVVNfVE9PX01BTllfQ09NTUFORFMiIH0sCisgIHsgMHhDMDAwMDBDMiwgIlNUQVRVU19BREFQVEVSX0hBUkRXQVJFX0VSUk9SIiB9LAorICB7IDB4QzAwMDAwQzMsICJTVEFUVVNfSU5WQUxJRF9ORVRXT1JLX1JFU1BPTlNFIiB9LAorICB7IDB4QzAwMDAwQzQsICJTVEFUVVNfVU5FWFBFQ1RFRF9ORVRXT1JLX0VSUk9SIiB9LAorICB7IDB4QzAwMDAwQzUsICJTVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSIiB9LAorICB7IDB4QzAwMDAwQzYsICJTVEFUVVNfUFJJTlRfUVVFVUVfRlVMTCIgfSwKKyAgeyAweEMwMDAwMEM3LCAiU1RBVFVTX05PX1NQT09MX1NQQUNFIiB9LAorICB7IDB4QzAwMDAwQzgsICJTVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEIiB9LAorICB7IDB4QzAwMDAwQzksICJTVEFUVVNfTkVUV09SS19OQU1FX0RFTEVURUQiIH0sCisgIHsgMHhDMDAwMDBDQSwgIlNUQVRVU19ORVRXT1JLX0FDQ0VTU19ERU5JRUQiIH0sCisgIHsgMHhDMDAwMDBDQiwgIlNUQVRVU19CQURfREVWSUNFX1RZUEUiIH0sCisgIHsgMHhDMDAwMDBDQywgIlNUQVRVU19CQURfTkVUV09SS19OQU1FIiB9LAorICB7IDB4QzAwMDAwQ0QsICJTVEFUVVNfVE9PX01BTllfTkFNRVMiIH0sCisgIHsgMHhDMDAwMDBDRSwgIlNUQVRVU19UT09fTUFOWV9TRVNTSU9OUyIgfSwKKyAgeyAweEMwMDAwMENGLCAiU1RBVFVTX1NIQVJJTkdfUEFVU0VEIiB9LAorICB7IDB4QzAwMDAwRDAsICJTVEFUVVNfUkVRVUVTVF9OT1RfQUNDRVBURUQiIH0sCisgIHsgMHhDMDAwMDBEMSwgIlNUQVRVU19SRURJUkVDVE9SX1BBVVNFRCIgfSwKKyAgeyAweEMwMDAwMEQyLCAiU1RBVFVTX05FVF9XUklURV9GQVVMVCIgfSwKKyAgeyAweEMwMDAwMEQzLCAiU1RBVFVTX1BST0ZJTElOR19BVF9MSU1JVCIgfSwKKyAgeyAweEMwMDAwMEQ0LCAiU1RBVFVTX05PVF9TQU1FX0RFVklDRSIgfSwKKyAgeyAweEMwMDAwMEQ1LCAiU1RBVFVTX0ZJTEVfUkVOQU1FRCIgfSwKKyAgeyAweEMwMDAwMEQ2LCAiU1RBVFVTX1ZJUlRVQUxfQ0lSQ1VJVF9DTE9TRUQiIH0sCisgIHsgMHhDMDAwMDBENywgIlNUQVRVU19OT19TRUNVUklUWV9PTl9PQkpFQ1QiIH0sCisgIHsgMHhDMDAwMDBEOCwgIlNUQVRVU19DQU5UX1dBSVQiIH0sCisgIHsgMHhDMDAwMDBEOSwgIlNUQVRVU19QSVBFX0VNUFRZIiB9LAorICB7IDB4QzAwMDAwREEsICJTVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk8iIH0sCisgIHsgMHhDMDAwMDBEQiwgIlNUQVRVU19DQU5UX1RFUk1JTkFURV9TRUxGIiB9LAorICB7IDB4QzAwMDAwREMsICJTVEFUVVNfSU5WQUxJRF9TRVJWRVJfU1RBVEUiIH0sCisgIHsgMHhDMDAwMDBERCwgIlNUQVRVU19JTlZBTElEX0RPTUFJTl9TVEFURSIgfSwKKyAgeyAweEMwMDAwMERFLCAiU1RBVFVTX0lOVkFMSURfRE9NQUlOX1JPTEUiIH0sCisgIHsgMHhDMDAwMDBERiwgIlNUQVRVU19OT19TVUNIX0RPTUFJTiIgfSwKKyAgeyAweEMwMDAwMEUwLCAiU1RBVFVTX0RPTUFJTl9FWElTVFMiIH0sCisgIHsgMHhDMDAwMDBFMSwgIlNUQVRVU19ET01BSU5fTElNSVRfRVhDRUVERUQiIH0sCisgIHsgMHhDMDAwMDBFMiwgIlNUQVRVU19PUExPQ0tfTk9UX0dSQU5URUQiIH0sCisgIHsgMHhDMDAwMDBFMywgIlNUQVRVU19JTlZBTElEX09QTE9DS19QUk9UT0NPTCIgfSwKKyAgeyAweEMwMDAwMEU0LCAiU1RBVFVTX0lOVEVSTkFMX0RCX0NPUlJVUFRJT04iIH0sCisgIHsgMHhDMDAwMDBFNSwgIlNUQVRVU19JTlRFUk5BTF9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMEU2LCAiU1RBVFVTX0dFTkVSSUNfTk9UX01BUFBFRCIgfSwKKyAgeyAweEMwMDAwMEU3LCAiU1RBVFVTX0JBRF9ERVNDUklQVE9SX0ZPUk1BVCIgfSwKKyAgeyAweEMwMDAwMEU4LCAiU1RBVFVTX0lOVkFMSURfVVNFUl9CVUZGRVIiIH0sCisgIHsgMHhDMDAwMDBFOSwgIlNUQVRVU19VTkVYUEVDVEVEX0lPX0VSUk9SIiB9LAorICB7IDB4QzAwMDAwRUEsICJTVEFUVVNfVU5FWFBFQ1RFRF9NTV9DUkVBVEVfRVJSIiB9LAorICB7IDB4QzAwMDAwRUIsICJTVEFUVVNfVU5FWFBFQ1RFRF9NTV9NQVBfRVJST1IiIH0sCisgIHsgMHhDMDAwMDBFQywgIlNUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlIiIH0sCisgIHsgMHhDMDAwMDBFRCwgIlNUQVRVU19OT1RfTE9HT05fUFJPQ0VTUyIgfSwKKyAgeyAweEMwMDAwMEVFLCAiU1RBVFVTX0xPR09OX1NFU1NJT05fRVhJU1RTIiB9LAorICB7IDB4QzAwMDAwRUYsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMSIgfSwKKyAgeyAweEMwMDAwMEYwLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzIiIH0sCisgIHsgMHhDMDAwMDBGMSwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8zIiB9LAorICB7IDB4QzAwMDAwRjIsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNCIgfSwKKyAgeyAweEMwMDAwMEYzLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzUiIH0sCisgIHsgMHhDMDAwMDBGNCwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl82IiB9LAorICB7IDB4QzAwMDAwRjUsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNyIgfSwKKyAgeyAweEMwMDAwMEY2LCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzgiIH0sCisgIHsgMHhDMDAwMDBGNywgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl85IiB9LAorICB7IDB4QzAwMDAwRjgsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTAiIH0sCisgIHsgMHhDMDAwMDBGOSwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMSIgfSwKKyAgeyAweEMwMDAwMEZBLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzEyIiB9LAorICB7IDB4QzAwMDAwRkIsICJTVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRCIgfSwKKyAgeyAweEMwMDAwMEZDLCAiU1RBVFVTX1JFRElSRUNUT1JfU1RBUlRFRCIgfSwKKyAgeyAweEMwMDAwMEZELCAiU1RBVFVTX1NUQUNLX09WRVJGTE9XIiB9LAorICB7IDB4QzAwMDAwRkUsICJTVEFUVVNfTk9fU1VDSF9QQUNLQUdFIiB9LAorICB7IDB4QzAwMDAwRkYsICJTVEFUVVNfQkFEX0ZVTkNUSU9OX1RBQkxFIiB9LAorICB7IDB4QzAwMDAxMDAsICJTVEFUVVNfVkFSSUFCTEVfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAxMDEsICJTVEFUVVNfRElSRUNUT1JZX05PVF9FTVBUWSIgfSwKKyAgeyAweEMwMDAwMTAyLCAiU1RBVFVTX0ZJTEVfQ09SUlVQVF9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMTAzLCAiU1RBVFVTX05PVF9BX0RJUkVDVE9SWSIgfSwKKyAgeyAweEMwMDAwMTA0LCAiU1RBVFVTX0JBRF9MT0dPTl9TRVNTSU9OX1NUQVRFIiB9LAorICB7IDB4QzAwMDAxMDUsICJTVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT04iIH0sCisgIHsgMHhDMDAwMDEwNiwgIlNUQVRVU19OQU1FX1RPT19MT05HIiB9LAorICB7IDB4QzAwMDAxMDcsICJTVEFUVVNfRklMRVNfT1BFTiIgfSwKKyAgeyAweEMwMDAwMTA4LCAiU1RBVFVTX0NPTk5FQ1RJT05fSU5fVVNFIiB9LAorICB7IDB4QzAwMDAxMDksICJTVEFUVVNfTUVTU0FHRV9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDEwQSwgIlNUQVRVU19QUk9DRVNTX0lTX1RFUk1JTkFUSU5HIiB9LAorICB7IDB4QzAwMDAxMEIsICJTVEFUVVNfSU5WQUxJRF9MT0dPTl9UWVBFIiB9LAorICB7IDB4QzAwMDAxMEMsICJTVEFUVVNfTk9fR1VJRF9UUkFOU0xBVElPTiIgfSwKKyAgeyAweEMwMDAwMTBELCAiU1RBVFVTX0NBTk5PVF9JTVBFUlNPTkFURSIgfSwKKyAgeyAweEMwMDAwMTBFLCAiU1RBVFVTX0lNQUdFX0FMUkVBRFlfTE9BREVEIiB9LAorICB7IDB4QzAwMDAxMEYsICJTVEFUVVNfQUJJT1NfTk9UX1BSRVNFTlQiIH0sCisgIHsgMHhDMDAwMDExMCwgIlNUQVRVU19BQklPU19MSURfTk9UX0VYSVNUIiB9LAorICB7IDB4QzAwMDAxMTEsICJTVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUQiIH0sCisgIHsgMHhDMDAwMDExMiwgIlNUQVRVU19BQklPU19OT1RfTElEX09XTkVSIiB9LAorICB7IDB4QzAwMDAxMTMsICJTVEFUVVNfQUJJT1NfSU5WQUxJRF9DT01NQU5EIiB9LAorICB7IDB4QzAwMDAxMTQsICJTVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUQiIH0sCisgIHsgMHhDMDAwMDExNSwgIlNUQVRVU19BQklPU19TRUxFQ1RPUl9OT1RfQVZBSUxBQkxFIiB9LAorICB7IDB4QzAwMDAxMTYsICJTVEFUVVNfQUJJT1NfSU5WQUxJRF9TRUxFQ1RPUiIgfSwKKyAgeyAweEMwMDAwMTE3LCAiU1RBVFVTX05PX0xEVCIgfSwKKyAgeyAweEMwMDAwMTE4LCAiU1RBVFVTX0lOVkFMSURfTERUX1NJWkUiIH0sCisgIHsgMHhDMDAwMDExOSwgIlNUQVRVU19JTlZBTElEX0xEVF9PRkZTRVQiIH0sCisgIHsgMHhDMDAwMDExQSwgIlNUQVRVU19JTlZBTElEX0xEVF9ERVNDUklQVE9SIiB9LAorICB7IDB4QzAwMDAxMUIsICJTVEFUVVNfSU5WQUxJRF9JTUFHRV9ORV9GT1JNQVQiIH0sCisgIHsgMHhDMDAwMDExQywgIlNUQVRVU19SWEFDVF9JTlZBTElEX1NUQVRFIiB9LAorICB7IDB4QzAwMDAxMUQsICJTVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkUiIH0sCisgIHsgMHhDMDAwMDExRSwgIlNUQVRVU19NQVBQRURfRklMRV9TSVpFX1pFUk8iIH0sCisgIHsgMHhDMDAwMDExRiwgIlNUQVRVU19UT09fTUFOWV9PUEVORURfRklMRVMiIH0sCisgIHsgMHhDMDAwMDEyMCwgIlNUQVRVU19DQU5DRUxMRUQiIH0sCisgIHsgMHhDMDAwMDEyMSwgIlNUQVRVU19DQU5OT1RfREVMRVRFIiB9LAorICB7IDB4QzAwMDAxMjIsICJTVEFUVVNfSU5WQUxJRF9DT01QVVRFUl9OQU1FIiB9LAorICB7IDB4QzAwMDAxMjMsICJTVEFUVVNfRklMRV9ERUxFVEVEIiB9LAorICB7IDB4QzAwMDAxMjQsICJTVEFUVVNfU1BFQ0lBTF9BQ0NPVU5UIiB9LAorICB7IDB4QzAwMDAxMjUsICJTVEFUVVNfU1BFQ0lBTF9HUk9VUCIgfSwKKyAgeyAweEMwMDAwMTI2LCAiU1RBVFVTX1NQRUNJQUxfVVNFUiIgfSwKKyAgeyAweEMwMDAwMTI3LCAiU1RBVFVTX01FTUJFUlNfUFJJTUFSWV9HUk9VUCIgfSwKKyAgeyAweEMwMDAwMTI4LCAiU1RBVFVTX0ZJTEVfQ0xPU0VEIiB9LAorICB7IDB4QzAwMDAxMjksICJTVEFUVVNfVE9PX01BTllfVEhSRUFEUyIgfSwKKyAgeyAweEMwMDAwMTJBLCAiU1RBVFVTX1RIUkVBRF9OT1RfSU5fUFJPQ0VTUyIgfSwKKyAgeyAweEMwMDAwMTJCLCAiU1RBVFVTX1RPS0VOX0FMUkVBRFlfSU5fVVNFIiB9LAorICB7IDB4QzAwMDAxMkMsICJTVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUQiIH0sCisgIHsgMHhDMDAwMDEyRCwgIlNUQVRVU19DT01NSVRNRU5UX0xJTUlUIiB9LAorICB7IDB4QzAwMDAxMkUsICJTVEFUVVNfSU5WQUxJRF9JTUFHRV9MRV9GT1JNQVQiIH0sCisgIHsgMHhDMDAwMDEyRiwgIlNUQVRVU19JTlZBTElEX0lNQUdFX05PVF9NWiIgfSwKKyAgeyAweEMwMDAwMTMwLCAiU1RBVFVTX0lOVkFMSURfSU1BR0VfUFJPVEVDVCIgfSwKKyAgeyAweEMwMDAwMTMxLCAiU1RBVFVTX0lOVkFMSURfSU1BR0VfV0lOXzE2IiB9LAorICB7IDB4QzAwMDAxMzIsICJTVEFUVVNfTE9HT05fU0VSVkVSX0NPTkZMSUNUIiB9LAorICB7IDB4QzAwMDAxMzMsICJTVEFUVVNfVElNRV9ESUZGRVJFTkNFX0FUX0RDIiB9LAorICB7IDB4QzAwMDAxMzQsICJTVEFUVVNfU1lOQ0hST05JWkFUSU9OX1JFUVVJUkVEIiB9LAorICB7IDB4QzAwMDAxMzUsICJTVEFUVVNfRExMX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMTM2LCAiU1RBVFVTX09QRU5fRkFJTEVEIiB9LAorICB7IDB4QzAwMDAxMzcsICJTVEFUVVNfSU9fUFJJVklMRUdFX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTM4LCAiU1RBVFVTX09SRElOQUxfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAxMzksICJTVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDEzQSwgIlNUQVRVU19DT05UUk9MX0NfRVhJVCIgfSwKKyAgeyAweEMwMDAwMTNCLCAiU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1QiIH0sCisgIHsgMHhDMDAwMDEzQywgIlNUQVRVU19SRU1PVEVfRElTQ09OTkVDVCIgfSwKKyAgeyAweEMwMDAwMTNELCAiU1RBVFVTX1JFTU9URV9SRVNPVVJDRVMiIH0sCisgIHsgMHhDMDAwMDEzRSwgIlNUQVRVU19MSU5LX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTNGLCAiU1RBVFVTX0xJTktfVElNRU9VVCIgfSwKKyAgeyAweEMwMDAwMTQwLCAiU1RBVFVTX0lOVkFMSURfQ09OTkVDVElPTiIgfSwKKyAgeyAweEMwMDAwMTQxLCAiU1RBVFVTX0lOVkFMSURfQUREUkVTUyIgfSwKKyAgeyAweEMwMDAwMTQyLCAiU1RBVFVTX0RMTF9JTklUX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTQzLCAiU1RBVFVTX01JU1NJTkdfU1lTVEVNRklMRSIgfSwKKyAgeyAweEMwMDAwMTQ0LCAiU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT04iIH0sCisgIHsgMHhDMDAwMDE0NSwgIlNUQVRVU19BUFBfSU5JVF9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAxNDYsICJTVEFUVVNfUEFHRUZJTEVfQ1JFQVRFX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTQ3LCAiU1RBVFVTX05PX1BBR0VGSUxFIiB9LAorICB7IDB4QzAwMDAxNDgsICJTVEFUVVNfSU5WQUxJRF9MRVZFTCIgfSwKKyAgeyAweEMwMDAwMTQ5LCAiU1RBVFVTX1dST05HX1BBU1NXT1JEX0NPUkUiIH0sCisgIHsgMHhDMDAwMDE0QSwgIlNUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFQiIH0sCisgIHsgMHhDMDAwMDE0QiwgIlNUQVRVU19QSVBFX0JST0tFTiIgfSwKKyAgeyAweEMwMDAwMTRDLCAiU1RBVFVTX1JFR0lTVFJZX0NPUlJVUFQiIH0sCisgIHsgMHhDMDAwMDE0RCwgIlNUQVRVU19SRUdJU1RSWV9JT19GQUlMRUQiIH0sCisgIHsgMHhDMDAwMDE0RSwgIlNUQVRVU19OT19FVkVOVF9QQUlSIiB9LAorICB7IDB4QzAwMDAxNEYsICJTVEFUVVNfVU5SRUNPR05JWkVEX1ZPTFVNRSIgfSwKKyAgeyAweEMwMDAwMTUwLCAiU1RBVFVTX1NFUklBTF9OT19ERVZJQ0VfSU5JVEVEIiB9LAorICB7IDB4QzAwMDAxNTEsICJTVEFUVVNfTk9fU1VDSF9BTElBUyIgfSwKKyAgeyAweEMwMDAwMTUyLCAiU1RBVFVTX01FTUJFUl9OT1RfSU5fQUxJQVMiIH0sCisgIHsgMHhDMDAwMDE1MywgIlNUQVRVU19NRU1CRVJfSU5fQUxJQVMiIH0sCisgIHsgMHhDMDAwMDE1NCwgIlNUQVRVU19BTElBU19FWElTVFMiIH0sCisgIHsgMHhDMDAwMDE1NSwgIlNUQVRVU19MT0dPTl9OT1RfR1JBTlRFRCIgfSwKKyAgeyAweEMwMDAwMTU2LCAiU1RBVFVTX1RPT19NQU5ZX1NFQ1JFVFMiIH0sCisgIHsgMHhDMDAwMDE1NywgIlNUQVRVU19TRUNSRVRfVE9PX0xPTkciIH0sCisgIHsgMHhDMDAwMDE1OCwgIlNUQVRVU19JTlRFUk5BTF9EQl9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMTU5LCAiU1RBVFVTX0ZVTExTQ1JFRU5fTU9ERSIgfSwKKyAgeyAweEMwMDAwMTVBLCAiU1RBVFVTX1RPT19NQU5ZX0NPTlRFWFRfSURTIiB9LAorICB7IDB4QzAwMDAxNUIsICJTVEFUVVNfTE9HT05fVFlQRV9OT1RfR1JBTlRFRCIgfSwKKyAgeyAweEMwMDAwMTVDLCAiU1RBVFVTX05PVF9SRUdJU1RSWV9GSUxFIiB9LAorICB7IDB4QzAwMDAxNUQsICJTVEFUVVNfTlRfQ1JPU1NfRU5DUllQVElPTl9SRVFVSVJFRCIgfSwKKyAgeyAweEMwMDAwMTVFLCAiU1RBVFVTX0RPTUFJTl9DVFJMUl9DT05GSUdfRVJST1IiIH0sCisgIHsgMHhDMDAwMDE1RiwgIlNUQVRVU19GVF9NSVNTSU5HX01FTUJFUiIgfSwKKyAgeyAweEMwMDAwMTYwLCAiU1RBVFVTX0lMTF9GT1JNRURfU0VSVklDRV9FTlRSWSIgfSwKKyAgeyAweEMwMDAwMTYxLCAiU1RBVFVTX0lMTEVHQUxfQ0hBUkFDVEVSIiB9LAorICB7IDB4QzAwMDAxNjIsICJTVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVIiIH0sCisgIHsgMHhDMDAwMDE2MywgIlNUQVRVU19VTkRFRklORURfQ0hBUkFDVEVSIiB9LAorICB7IDB4QzAwMDAxNjQsICJTVEFUVVNfRkxPUFBZX1ZPTFVNRSIgfSwKKyAgeyAweEMwMDAwMTY1LCAiU1RBVFVTX0ZMT1BQWV9JRF9NQVJLX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMTY2LCAiU1RBVFVTX0ZMT1BQWV9XUk9OR19DWUxJTkRFUiIgfSwKKyAgeyAweEMwMDAwMTY3LCAiU1RBVFVTX0ZMT1BQWV9VTktOT1dOX0VSUk9SIiB9LAorICB7IDB4QzAwMDAxNjgsICJTVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlMiIH0sCisgIHsgMHhDMDAwMDE2OSwgIlNUQVRVU19ESVNLX1JFQ0FMSUJSQVRFX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTZBLCAiU1RBVFVTX0RJU0tfT1BFUkFUSU9OX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMTZCLCAiU1RBVFVTX0RJU0tfUkVTRVRfRkFJTEVEIiB9LAorICB7IDB4QzAwMDAxNkMsICJTVEFUVVNfU0hBUkVEX0lSUV9CVVNZIiB9LAorICB7IDB4QzAwMDAxNkQsICJTVEFUVVNfRlRfT1JQSEFOSU5HIiB9LAorICB7IDB4QzAwMDAxNkUsICJTVEFUVVNfQklPU19GQUlMRURfVE9fQ09OTkVDVF9JTlRFUlJVUFQiIH0sCisgIHsgMHhDMDAwMDE3MiwgIlNUQVRVU19QQVJUSVRJT05fRkFJTFVSRSIgfSwKKyAgeyAweEMwMDAwMTczLCAiU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIIiB9LAorICB7IDB4QzAwMDAxNzQsICJTVEFUVVNfREVWSUNFX05PVF9QQVJUSVRJT05FRCIgfSwKKyAgeyAweEMwMDAwMTc1LCAiU1RBVFVTX1VOQUJMRV9UT19MT0NLX01FRElBIiB9LAorICB7IDB4QzAwMDAxNzYsICJTVEFUVVNfVU5BQkxFX1RPX1VOTE9BRF9NRURJQSIgfSwKKyAgeyAweEMwMDAwMTc3LCAiU1RBVFVTX0VPTV9PVkVSRkxPVyIgfSwKKyAgeyAweEMwMDAwMTc4LCAiU1RBVFVTX05PX01FRElBIiB9LAorICB7IDB4QzAwMDAxN0EsICJTVEFUVVNfTk9fU1VDSF9NRU1CRVIiIH0sCisgIHsgMHhDMDAwMDE3QiwgIlNUQVRVU19JTlZBTElEX01FTUJFUiIgfSwKKyAgeyAweEMwMDAwMTdDLCAiU1RBVFVTX0tFWV9ERUxFVEVEIiB9LAorICB7IDB4QzAwMDAxN0QsICJTVEFUVVNfTk9fTE9HX1NQQUNFIiB9LAorICB7IDB4QzAwMDAxN0UsICJTVEFUVVNfVE9PX01BTllfU0lEUyIgfSwKKyAgeyAweEMwMDAwMTdGLCAiU1RBVFVTX0xNX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQiIH0sCisgIHsgMHhDMDAwMDE4MCwgIlNUQVRVU19LRVlfSEFTX0NISUxEUkVOIiB9LAorICB7IDB4QzAwMDAxODEsICJTVEFUVVNfQ0hJTERfTVVTVF9CRV9WT0xBVElMRSIgfSwKKyAgeyAweEMwMDAwMTgyLCAiU1RBVFVTX0RFVklDRV9DT05GSUdVUkFUSU9OX0VSUk9SIiB9LAorICB7IDB4QzAwMDAxODMsICJTVEFUVVNfRFJJVkVSX0lOVEVSTkFMX0VSUk9SIiB9LAorICB7IDB4QzAwMDAxODQsICJTVEFUVVNfSU5WQUxJRF9ERVZJQ0VfU1RBVEUiIH0sCisgIHsgMHhDMDAwMDE4NSwgIlNUQVRVU19JT19ERVZJQ0VfRVJST1IiIH0sCisgIHsgMHhDMDAwMDE4NiwgIlNUQVRVU19ERVZJQ0VfUFJPVE9DT0xfRVJST1IiIH0sCisgIHsgMHhDMDAwMDE4NywgIlNUQVRVU19CQUNLVVBfQ09OVFJPTExFUiIgfSwKKyAgeyAweEMwMDAwMTg4LCAiU1RBVFVTX0xPR19GSUxFX0ZVTEwiIH0sCisgIHsgMHhDMDAwMDE4OSwgIlNUQVRVU19UT09fTEFURSIgfSwKKyAgeyAweEMwMDAwMThBLCAiU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVQiIH0sCisgIHsgMHhDMDAwMDE4QiwgIlNUQVRVU19OT19UUlVTVF9TQU1fQUNDT1VOVCIgfSwKKyAgeyAweEMwMDAwMThDLCAiU1RBVFVTX1RSVVNURURfRE9NQUlOX0ZBSUxVUkUiIH0sCisgIHsgMHhDMDAwMDE4RCwgIlNUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAxOEUsICJTVEFUVVNfRVZFTlRMT0dfRklMRV9DT1JSVVBUIiB9LAorICB7IDB4QzAwMDAxOEYsICJTVEFUVVNfRVZFTlRMT0dfQ0FOVF9TVEFSVCIgfSwKKyAgeyAweEMwMDAwMTkwLCAiU1RBVFVTX1RSVVNUX0ZBSUxVUkUiIH0sCisgIHsgMHhDMDAwMDE5MSwgIlNUQVRVU19NVVRBTlRfTElNSVRfRVhDRUVERUQiIH0sCisgIHsgMHhDMDAwMDE5MiwgIlNUQVRVU19ORVRMT0dPTl9OT1RfU1RBUlRFRCIgfSwKKyAgeyAweEMwMDAwMTkzLCAiU1RBVFVTX0FDQ09VTlRfRVhQSVJFRCIgfSwKKyAgeyAweEMwMDAwMTk0LCAiU1RBVFVTX1BPU1NJQkxFX0RFQURMT0NLIiB9LAorICB7IDB4QzAwMDAxOTUsICJTVEFUVVNfTkVUV09SS19DUkVERU5USUFMX0NPTkZMSUNUIiB9LAorICB7IDB4QzAwMDAxOTYsICJTVEFUVVNfUkVNT1RFX1NFU1NJT05fTElNSVQiIH0sCisgIHsgMHhDMDAwMDE5NywgIlNUQVRVU19FVkVOVExPR19GSUxFX0NIQU5HRUQiIH0sCisgIHsgMHhDMDAwMDE5OCwgIlNUQVRVU19OT0xPR09OX0lOVEVSRE9NQUlOX1RSVVNUX0FDQ09VTlQiIH0sCisgIHsgMHhDMDAwMDE5OSwgIlNUQVRVU19OT0xPR09OX1dPUktTVEFUSU9OX1RSVVNUX0FDQ09VTlQiIH0sCisgIHsgMHhDMDAwMDE5QSwgIlNUQVRVU19OT0xPR09OX1NFUlZFUl9UUlVTVF9BQ0NPVU5UIiB9LAorICB7IDB4QzAwMDAxOUIsICJTVEFUVVNfRE9NQUlOX1RSVVNUX0lOQ09OU0lTVEVOVCIgfSwKKyAgeyAweEMwMDAwMTlDLCAiU1RBVFVTX0ZTX0RSSVZFUl9SRVFVSVJFRCIgfSwKKyAgeyAweEMwMDAwMjAyLCAiU1RBVFVTX05PX1VTRVJfU0VTU0lPTl9LRVkiIH0sCisgIHsgMHhDMDAwMDIwMywgIlNUQVRVU19VU0VSX1NFU1NJT05fREVMRVRFRCIgfSwKKyAgeyAweEMwMDAwMjA0LCAiU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAyMDUsICJTVEFUVVNfSU5TVUZGX1NFUlZFUl9SRVNPVVJDRVMiIH0sCisgIHsgMHhDMDAwMDIwNiwgIlNUQVRVU19JTlZBTElEX0JVRkZFUl9TSVpFIiB9LAorICB7IDB4QzAwMDAyMDcsICJTVEFUVVNfSU5WQUxJRF9BRERSRVNTX0NPTVBPTkVOVCIgfSwKKyAgeyAweEMwMDAwMjA4LCAiU1RBVFVTX0lOVkFMSURfQUREUkVTU19XSUxEQ0FSRCIgfSwKKyAgeyAweEMwMDAwMjA5LCAiU1RBVFVTX1RPT19NQU5ZX0FERFJFU1NFUyIgfSwKKyAgeyAweEMwMDAwMjBBLCAiU1RBVFVTX0FERFJFU1NfQUxSRUFEWV9FWElTVFMiIH0sCisgIHsgMHhDMDAwMDIwQiwgIlNUQVRVU19BRERSRVNTX0NMT1NFRCIgfSwKKyAgeyAweEMwMDAwMjBDLCAiU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEIiB9LAorICB7IDB4QzAwMDAyMEQsICJTVEFUVVNfQ09OTkVDVElPTl9SRVNFVCIgfSwKKyAgeyAweEMwMDAwMjBFLCAiU1RBVFVTX1RPT19NQU5ZX05PREVTIiB9LAorICB7IDB4QzAwMDAyMEYsICJTVEFUVVNfVFJBTlNBQ1RJT05fQUJPUlRFRCIgfSwKKyAgeyAweEMwMDAwMjEwLCAiU1RBVFVTX1RSQU5TQUNUSU9OX1RJTUVEX09VVCIgfSwKKyAgeyAweEMwMDAwMjExLCAiU1RBVFVTX1RSQU5TQUNUSU9OX05PX1JFTEVBU0UiIH0sCisgIHsgMHhDMDAwMDIxMiwgIlNUQVRVU19UUkFOU0FDVElPTl9OT19NQVRDSCIgfSwKKyAgeyAweEMwMDAwMjEzLCAiU1RBVFVTX1RSQU5TQUNUSU9OX1JFU1BPTkRFRCIgfSwKKyAgeyAweEMwMDAwMjE0LCAiU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfSUQiIH0sCisgIHsgMHhDMDAwMDIxNSwgIlNUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX1RZUEUiIH0sCisgIHsgMHhDMDAwMDIxNiwgIlNUQVRVU19OT1RfU0VSVkVSX1NFU1NJT04iIH0sCisgIHsgMHhDMDAwMDIxNywgIlNUQVRVU19OT1RfQ0xJRU5UX1NFU1NJT04iIH0sCisgIHsgMHhDMDAwMDIxOCwgIlNUQVRVU19DQU5OT1RfTE9BRF9SRUdJU1RSWV9GSUxFIiB9LAorICB7IDB4QzAwMDAyMTksICJTVEFUVVNfREVCVUdfQVRUQUNIX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMjFBLCAiU1RBVFVTX1NZU1RFTV9QUk9DRVNTX1RFUk1JTkFURUQiIH0sCisgIHsgMHhDMDAwMDIxQiwgIlNUQVRVU19EQVRBX05PVF9BQ0NFUFRFRCIgfSwKKyAgeyAweEMwMDAwMjFDLCAiU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORCIgfSwKKyAgeyAweEMwMDAwMjFELCAiU1RBVFVTX1ZETV9IQVJEX0VSUk9SIiB9LAorICB7IDB4QzAwMDAyMUUsICJTVEFUVVNfRFJJVkVSX0NBTkNFTF9USU1FT1VUIiB9LAorICB7IDB4QzAwMDAyMUYsICJTVEFUVVNfUkVQTFlfTUVTU0FHRV9NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDAwMjIwLCAiU1RBVFVTX01BUFBFRF9BTElHTk1FTlQiIH0sCisgIHsgMHhDMDAwMDIyMSwgIlNUQVRVU19JTUFHRV9DSEVDS1NVTV9NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDAwMjIyLCAiU1RBVFVTX0xPU1RfV1JJVEVCRUhJTkRfREFUQSIgfSwKKyAgeyAweEMwMDAwMjIzLCAiU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEIiB9LAorICB7IDB4QzAwMDAyMjQsICJTVEFUVVNfUEFTU1dPUkRfTVVTVF9DSEFOR0UiIH0sCisgIHsgMHhDMDAwMDIyNSwgIlNUQVRVU19OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDIyNiwgIlNUQVRVU19OT1RfVElOWV9TVFJFQU0iIH0sCisgIHsgMHhDMDAwMDIyNywgIlNUQVRVU19SRUNPVkVSWV9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAyMjgsICJTVEFUVVNfU1RBQ0tfT1ZFUkZMT1dfUkVBRCIgfSwKKyAgeyAweEMwMDAwMjI5LCAiU1RBVFVTX0ZBSUxfQ0hFQ0siIH0sCisgIHsgMHhDMDAwMDIyQSwgIlNUQVRVU19EVVBMSUNBVEVfT0JKRUNUSUQiIH0sCisgIHsgMHhDMDAwMDIyQiwgIlNUQVRVU19PQkpFQ1RJRF9FWElTVFMiIH0sCisgIHsgMHhDMDAwMDIyQywgIlNUQVRVU19DT05WRVJUX1RPX0xBUkdFIiB9LAorICB7IDB4QzAwMDAyMkQsICJTVEFUVVNfUkVUUlkiIH0sCisgIHsgMHhDMDAwMDIyRSwgIlNUQVRVU19GT1VORF9PVVRfT0ZfU0NPUEUiIH0sCisgIHsgMHhDMDAwMDIyRiwgIlNUQVRVU19BTExPQ0FURV9CVUNLRVQiIH0sCisgIHsgMHhDMDAwMDIzMCwgIlNUQVRVU19QUk9QU0VUX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMjMxLCAiU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XIiB9LAorICB7IDB4QzAwMDAyMzIsICJTVEFUVVNfSU5WQUxJRF9WQVJJQU5UIiB9LAorICB7IDB4QzAwMDAyMzMsICJTVEFUVVNfRE9NQUlOX0NPTlRST0xMRVJfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMDAyMzQsICJTVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUIiB9LAorICB7IDB4QzAwMDAyMzUsICJTVEFUVVNfSEFORExFX05PVF9DTE9TQUJMRSIgfSwKKyAgeyAweEMwMDAwMjM2LCAiU1RBVFVTX0NPTk5FQ1RJT05fUkVGVVNFRCIgfSwKKyAgeyAweEMwMDAwMjM3LCAiU1RBVFVTX0dSQUNFRlVMX0RJU0NPTk5FQ1QiIH0sCisgIHsgMHhDMDAwMDIzOCwgIlNUQVRVU19BRERSRVNTX0FMUkVBRFlfQVNTT0NJQVRFRCIgfSwKKyAgeyAweEMwMDAwMjM5LCAiU1RBVFVTX0FERFJFU1NfTk9UX0FTU09DSUFURUQiIH0sCisgIHsgMHhDMDAwMDIzQSwgIlNUQVRVU19DT05ORUNUSU9OX0lOVkFMSUQiIH0sCisgIHsgMHhDMDAwMDIzQiwgIlNUQVRVU19DT05ORUNUSU9OX0FDVElWRSIgfSwKKyAgeyAweEMwMDAwMjNDLCAiU1RBVFVTX05FVFdPUktfVU5SRUFDSEFCTEUiIH0sCisgIHsgMHhDMDAwMDIzRCwgIlNUQVRVU19IT1NUX1VOUkVBQ0hBQkxFIiB9LAorICB7IDB4QzAwMDAyM0UsICJTVEFUVVNfUFJPVE9DT0xfVU5SRUFDSEFCTEUiIH0sCisgIHsgMHhDMDAwMDIzRiwgIlNUQVRVU19QT1JUX1VOUkVBQ0hBQkxFIiB9LAorICB7IDB4QzAwMDAyNDAsICJTVEFUVVNfUkVRVUVTVF9BQk9SVEVEIiB9LAorICB7IDB4QzAwMDAyNDEsICJTVEFUVVNfQ09OTkVDVElPTl9BQk9SVEVEIiB9LAorICB7IDB4QzAwMDAyNDIsICJTVEFUVVNfQkFEX0NPTVBSRVNTSU9OX0JVRkZFUiIgfSwKKyAgeyAweEMwMDAwMjQzLCAiU1RBVFVTX1VTRVJfTUFQUEVEX0ZJTEUiIH0sCisgIHsgMHhDMDAwMDI0NCwgIlNUQVRVU19BVURJVF9GQUlMRUQiIH0sCisgIHsgMHhDMDAwMDI0NSwgIlNUQVRVU19USU1FUl9SRVNPTFVUSU9OX05PVF9TRVQiIH0sCisgIHsgMHhDMDAwMDI0NiwgIlNUQVRVU19DT05ORUNUSU9OX0NPVU5UX0xJTUlUIiB9LAorICB7IDB4QzAwMDAyNDcsICJTVEFUVVNfTE9HSU5fVElNRV9SRVNUUklDVElPTiIgfSwKKyAgeyAweEMwMDAwMjQ4LCAiU1RBVFVTX0xPR0lOX1dLU1RBX1JFU1RSSUNUSU9OIiB9LAorICB7IDB4QzAwMDAyNDksICJTVEFUVVNfSU1BR0VfTVBfVVBfTUlTTUFUQ0giIH0sCisgIHsgMHhDMDAwMDI1MCwgIlNUQVRVU19JTlNVRkZJQ0lFTlRfTE9HT05fSU5GTyIgfSwKKyAgeyAweEMwMDAwMjUxLCAiU1RBVFVTX0JBRF9ETExfRU5UUllQT0lOVCIgfSwKKyAgeyAweEMwMDAwMjUyLCAiU1RBVFVTX0JBRF9TRVJWSUNFX0VOVFJZUE9JTlQiIH0sCisgIHsgMHhDMDAwMDI1MywgIlNUQVRVU19MUENfUkVQTFlfTE9TVCIgfSwKKyAgeyAweEMwMDAwMjU0LCAiU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxIiB9LAorICB7IDB4QzAwMDAyNTUsICJTVEFUVVNfSVBfQUREUkVTU19DT05GTElDVDIiIH0sCisgIHsgMHhDMDAwMDI1NiwgIlNUQVRVU19SRUdJU1RSWV9RVU9UQV9MSU1JVCIgfSwKKyAgeyAweEMwMDAwMjU3LCAiU1RBVFVTX1BBVEhfTk9UX0NPVkVSRUQiIH0sCisgIHsgMHhDMDAwMDI1OCwgIlNUQVRVU19OT19DQUxMQkFDS19BQ1RJVkUiIH0sCisgIHsgMHhDMDAwMDI1OSwgIlNUQVRVU19MSUNFTlNFX1FVT1RBX0VYQ0VFREVEIiB9LAorICB7IDB4QzAwMDAyNUEsICJTVEFUVVNfUFdEX1RPT19TSE9SVCIgfSwKKyAgeyAweEMwMDAwMjVCLCAiU1RBVFVTX1BXRF9UT09fUkVDRU5UIiB9LAorICB7IDB4QzAwMDAyNUMsICJTVEFUVVNfUFdEX0hJU1RPUllfQ09ORkxJQ1QiIH0sCisgIHsgMHhDMDAwMDI1RSwgIlNUQVRVU19QTFVHUExBWV9OT19ERVZJQ0UiIH0sCisgIHsgMHhDMDAwMDI1RiwgIlNUQVRVU19VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiIgfSwKKyAgeyAweEMwMDAwMjYwLCAiU1RBVFVTX0lOVkFMSURfSFdfUFJPRklMRSIgfSwKKyAgeyAweEMwMDAwMjYxLCAiU1RBVFVTX0lOVkFMSURfUExVR1BMQVlfREVWSUNFX1BBVEgiIH0sCisgIHsgMHhDMDAwMDI2MiwgIlNUQVRVU19EUklWRVJfT1JESU5BTF9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDI2MywgIlNUQVRVU19EUklWRVJfRU5UUllQT0lOVF9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDI2NCwgIlNUQVRVU19SRVNPVVJDRV9OT1RfT1dORUQiIH0sCisgIHsgMHhDMDAwMDI2NSwgIlNUQVRVU19UT09fTUFOWV9MSU5LUyIgfSwKKyAgeyAweEMwMDAwMjY2LCAiU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UIiB9LAorICB7IDB4QzAwMDAyNjcsICJTVEFUVVNfRklMRV9JU19PRkZMSU5FIiB9LAorICB7IDB4QzAwMDAyNjgsICJTVEFUVVNfRVZBTFVBVElPTl9FWFBJUkFUSU9OIiB9LAorICB7IDB4QzAwMDAyNjksICJTVEFUVVNfSUxMRUdBTF9ETExfUkVMT0NBVElPTiIgfSwKKyAgeyAweEMwMDAwMjZBLCAiU1RBVFVTX0xJQ0VOU0VfVklPTEFUSU9OIiB9LAorICB7IDB4QzAwMDAyNkIsICJTVEFUVVNfRExMX0lOSVRfRkFJTEVEX0xPR09GRiIgfSwKKyAgeyAweEMwMDAwMjZDLCAiU1RBVFVTX0RSSVZFUl9VTkFCTEVfVE9fTE9BRCIgfSwKKyAgeyAweEMwMDAwMjZELCAiU1RBVFVTX0RGU19VTkFWQUlMQUJMRSIgfSwKKyAgeyAweEMwMDAwMjZFLCAiU1RBVFVTX1ZPTFVNRV9ESVNNT1VOVEVEIiB9LAorICB7IDB4QzAwMDAyNkYsICJTVEFUVVNfV1g4Nl9JTlRFUk5BTF9FUlJPUiIgfSwKKyAgeyAweEMwMDAwMjcwLCAiU1RBVFVTX1dYODZfRkxPQVRfU1RBQ0tfQ0hFQ0siIH0sCisgIHsgMHhDMDAwMDI3MSwgIlNUQVRVU19WQUxJREFURV9DT05USU5VRSIgfSwKKyAgeyAweEMwMDAwMjcyLCAiU1RBVFVTX05PX01BVENIIiB9LAorICB7IDB4QzAwMDAyNzMsICJTVEFUVVNfTk9fTU9SRV9NQVRDSEVTIiB9LAorICB7IDB4QzAwMDAyNzUsICJTVEFUVVNfTk9UX0FfUkVQQVJTRV9QT0lOVCIgfSwKKyAgeyAweEMwMDAwMjc2LCAiU1RBVFVTX0lPX1JFUEFSU0VfVEFHX0lOVkFMSUQiIH0sCisgIHsgMHhDMDAwMDI3NywgIlNUQVRVU19JT19SRVBBUlNFX1RBR19NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDAwMjc4LCAiU1RBVFVTX0lPX1JFUEFSU0VfREFUQV9JTlZBTElEIiB9LAorICB7IDB4QzAwMDAyNzksICJTVEFUVVNfSU9fUkVQQVJTRV9UQUdfTk9UX0hBTkRMRUQiIH0sCisgIHsgMHhDMDAwMDI4MCwgIlNUQVRVU19SRVBBUlNFX1BPSU5UX05PVF9SRVNPTFZFRCIgfSwKKyAgeyAweEMwMDAwMjgxLCAiU1RBVFVTX0RJUkVDVE9SWV9JU19BX1JFUEFSU0VfUE9JTlQiIH0sCisgIHsgMHhDMDAwMDI4MiwgIlNUQVRVU19SQU5HRV9MSVNUX0NPTkZMSUNUIiB9LAorICB7IDB4QzAwMDAyODMsICJTVEFUVVNfU09VUkNFX0VMRU1FTlRfRU1QVFkiIH0sCisgIHsgMHhDMDAwMDI4NCwgIlNUQVRVU19ERVNUSU5BVElPTl9FTEVNRU5UX0ZVTEwiIH0sCisgIHsgMHhDMDAwMDI4NSwgIlNUQVRVU19JTExFR0FMX0VMRU1FTlRfQUREUkVTUyIgfSwKKyAgeyAweEMwMDAwMjg2LCAiU1RBVFVTX01BR0FaSU5FX05PVF9QUkVTRU5UIiB9LAorICB7IDB4QzAwMDAyODcsICJTVEFUVVNfUkVJTklUSUFMSVpBVElPTl9ORUVERUQiIH0sCisgIHsgMHg4MDAwMDI4OCwgIlNUQVRVU19ERVZJQ0VfUkVRVUlSRVNfQ0xFQU5JTkciIH0sCisgIHsgMHg4MDAwMDI4OSwgIlNUQVRVU19ERVZJQ0VfRE9PUl9PUEVOIiB9LAorICB7IDB4QzAwMDAyOEEsICJTVEFUVVNfRU5DUllQVElPTl9GQUlMRUQiIH0sCisgIHsgMHhDMDAwMDI4QiwgIlNUQVRVU19ERUNSWVBUSU9OX0ZBSUxFRCIgfSwKKyAgeyAweEMwMDAwMjhDLCAiU1RBVFVTX1JBTkdFX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMjhELCAiU1RBVFVTX05PX1JFQ09WRVJZX1BPTElDWSIgfSwKKyAgeyAweEMwMDAwMjhFLCAiU1RBVFVTX05PX0VGUyIgfSwKKyAgeyAweEMwMDAwMjhGLCAiU1RBVFVTX1dST05HX0VGUyIgfSwKKyAgeyAweEMwMDAwMjkwLCAiU1RBVFVTX05PX1VTRVJfS0VZUyIgfSwKKyAgeyAweEMwMDAwMjkxLCAiU1RBVFVTX0ZJTEVfTk9UX0VOQ1JZUFRFRCIgfSwKKyAgeyAweEMwMDAwMjkyLCAiU1RBVFVTX05PVF9FWFBPUlRfRk9STUFUIiB9LAorICB7IDB4QzAwMDAyOTMsICJTVEFUVVNfRklMRV9FTkNSWVBURUQiIH0sCisgIHsgMHg0MDAwMDI5NCwgIlNUQVRVU19XQUtFX1NZU1RFTSIgfSwKKyAgeyAweEMwMDAwMjk1LCAiU1RBVFVTX1dNSV9HVUlEX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMjk2LCAiU1RBVFVTX1dNSV9JTlNUQU5DRV9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDI5NywgIlNUQVRVU19XTUlfSVRFTUlEX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDAwMjk4LCAiU1RBVFVTX1dNSV9UUllfQUdBSU4iIH0sCisgIHsgMHhDMDAwMDI5OSwgIlNUQVRVU19TSEFSRURfUE9MSUNZIiB9LAorICB7IDB4QzAwMDAyOUEsICJTVEFUVVNfUE9MSUNZX09CSkVDVF9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAwMDI5QiwgIlNUQVRVU19QT0xJQ1lfT05MWV9JTl9EUyIgfSwKKyAgeyAweEMwMDAwMjlDLCAiU1RBVFVTX1ZPTFVNRV9OT1RfVVBHUkFERUQiIH0sCisgIHsgMHhDMDAwMDI5RCwgIlNUQVRVU19SRU1PVEVfU1RPUkFHRV9OT1RfQUNUSVZFIiB9LAorICB7IDB4QzAwMDAyOUUsICJTVEFUVVNfUkVNT1RFX1NUT1JBR0VfTUVESUFfRVJST1IiIH0sCisgIHsgMHhDMDAwMDI5RiwgIlNUQVRVU19OT19UUkFDS0lOR19TRVJWSUNFIiB9LAorICB7IDB4QzAwMDAyQTAsICJTVEFUVVNfU0VSVkVSX1NJRF9NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDAwMkExLCAiU1RBVFVTX0RTX05PX0FUVFJJQlVURV9PUl9WQUxVRSIgfSwKKyAgeyAweEMwMDAwMkEyLCAiU1RBVFVTX0RTX0lOVkFMSURfQVRUUklCVVRFX1NZTlRBWCIgfSwKKyAgeyAweEMwMDAwMkEzLCAiU1RBVFVTX0RTX0FUVFJJQlVURV9UWVBFX1VOREVGSU5FRCIgfSwKKyAgeyAweEMwMDAwMkE0LCAiU1RBVFVTX0RTX0FUVFJJQlVURV9PUl9WQUxVRV9FWElTVFMiIH0sCisgIHsgMHhDMDAwMDJBNSwgIlNUQVRVU19EU19CVVNZIiB9LAorICB7IDB4QzAwMDAyQTYsICJTVEFUVVNfRFNfVU5BVkFJTEFCTEUiIH0sCisgIHsgMHhDMDAwMDJBNywgIlNUQVRVU19EU19OT19SSURTX0FMTE9DQVRFRCIgfSwKKyAgeyAweEMwMDAwMkE4LCAiU1RBVFVTX0RTX05PX01PUkVfUklEUyIgfSwKKyAgeyAweEMwMDAwMkE5LCAiU1RBVFVTX0RTX0lOQ09SUkVDVF9ST0xFX09XTkVSIiB9LAorICB7IDB4QzAwMDAyQUEsICJTVEFUVVNfRFNfUklETUdSX0lOSVRfRVJST1IiIH0sCisgIHsgMHhDMDAwMDJBQiwgIlNUQVRVU19EU19PQkpfQ0xBU1NfVklPTEFUSU9OIiB9LAorICB7IDB4QzAwMDAyQUMsICJTVEFUVVNfRFNfQ0FOVF9PTl9OT05fTEVBRiIgfSwKKyAgeyAweEMwMDAwMkFELCAiU1RBVFVTX0RTX0NBTlRfT05fUkROIiB9LAorICB7IDB4QzAwMDAyQUUsICJTVEFUVVNfRFNfQ0FOVF9NT0RfT0JKX0NMQVNTIiB9LAorICB7IDB4QzAwMDAyQUYsICJTVEFUVVNfRFNfQ1JPU1NfRE9NX01PVkVfRkFJTEVEIiB9LAorICB7IDB4QzAwMDAyQjAsICJTVEFUVVNfRFNfR0NfTk9UX0FWQUlMQUJMRSIgfSwKKyAgeyAweEMwMDAwMkIxLCAiU1RBVFVTX0RJUkVDVE9SWV9TRVJWSUNFX1JFUVVJUkVEIiB9LAorICB7IDB4QzAwMDAyQjIsICJTVEFUVVNfUkVQQVJTRV9BVFRSSUJVVEVfQ09ORkxJQ1QiIH0sCisgIHsgMHhDMDAwMDJCMywgIlNUQVRVU19DQU5UX0VOQUJMRV9ERU5ZX09OTFkiIH0sCisgIHsgMHhDMDAwMDJCNCwgIlNUQVRVU19GTE9BVF9NVUxUSVBMRV9GQVVMVFMiIH0sCisgIHsgMHhDMDAwMDJCNSwgIlNUQVRVU19GTE9BVF9NVUxUSVBMRV9UUkFQUyIgfSwKKyAgeyAweEMwMDAwMkI2LCAiU1RBVFVTX0RFVklDRV9SRU1PVkVEIiB9LAorICB7IDB4QzAwMDAyQjcsICJTVEFUVVNfSk9VUk5BTF9ERUxFVEVfSU5fUFJPR1JFU1MiIH0sCisgIHsgMHhDMDAwMDJCOCwgIlNUQVRVU19KT1VSTkFMX05PVF9BQ1RJVkUiIH0sCisgIHsgMHhDMDAwMDJCOSwgIlNUQVRVU19OT0lOVEVSRkFDRSIgfSwKKyAgeyAweEMwMDAwMkMxLCAiU1RBVFVTX0RTX0FETUlOX0xJTUlUX0VYQ0VFREVEIiB9LAorICB7IDB4QzAwMDAyQzIsICJTVEFUVVNfRFJJVkVSX0ZBSUxFRF9TTEVFUCIgfSwKKyAgeyAweEMwMDAwMkMzLCAiU1RBVFVTX01VVFVBTF9BVVRIRU5USUNBVElPTl9GQUlMRUQiIH0sCisgIHsgMHhDMDAwMDJDNCwgIlNUQVRVU19DT1JSVVBUX1NZU1RFTV9GSUxFIiB9LAorICB7IDB4QzAwMDAyQzUsICJTVEFUVVNfREFUQVRZUEVfTUlTQUxJR05NRU5UX0VSUk9SIiB9LAorICB7IDB4QzAwMDAyQzYsICJTVEFUVVNfV01JX1JFQURfT05MWSIgfSwKKyAgeyAweEMwMDAwMkM3LCAiU1RBVFVTX1dNSV9TRVRfRkFJTFVSRSIgfSwKKyAgeyAweEMwMDAwMkM4LCAiU1RBVFVTX0NPTU1JVE1FTlRfTUlOSU1VTSIgfSwKKyAgeyAweEMwMDAwMkM5LCAiU1RBVFVTX1JFR19OQVRfQ09OU1VNUFRJT04iIH0sCisgIHsgMHhDMDAwMDJDQSwgIlNUQVRVU19UUkFOU1BPUlRfRlVMTCIgfSwKKyAgeyAweEMwMDAwMkNCLCAiU1RBVFVTX0RTX1NBTV9JTklUX0ZBSUxVUkUiIH0sCisgIHsgMHhDMDAwMDJDQywgIlNUQVRVU19PTkxZX0lGX0NPTk5FQ1RFRCIgfSwKKyAgeyAweEMwMDAwMkNELCAiU1RBVFVTX0RTX1NFTlNJVElWRV9HUk9VUF9WSU9MQVRJT04iIH0sCisgIHsgMHhDMDAwMDJDRSwgIlNUQVRVU19QTlBfUkVTVEFSVF9FTlVNRVJBVElPTiIgfSwKKyAgeyAweEMwMDAwMkNGLCAiU1RBVFVTX0pPVVJOQUxfRU5UUllfREVMRVRFRCIgfSwKKyAgeyAweEMwMDAwMkQwLCAiU1RBVFVTX0RTX0NBTlRfTU9EX1BSSU1BUllHUk9VUElEIiB9LAorICB7IDB4QzAwMDAyRDEsICJTVEFUVVNfU1lTVEVNX0lNQUdFX0JBRF9TSUdOQVRVUkUiIH0sCisgIHsgMHhDMDAwMDJEMiwgIlNUQVRVU19QTlBfUkVCT09UX1JFUVVJUkVEIiB9LAorICB7IDB4QzAwMDAyRDMsICJTVEFUVVNfUE9XRVJfU1RBVEVfSU5WQUxJRCIgfSwKKyAgeyAweEMwMDAwMkQ0LCAiU1RBVFVTX0RTX0lOVkFMSURfR1JPVVBfVFlQRSIgfSwKKyAgeyAweEMwMDAwMkQ1LCAiU1RBVFVTX0RTX05PX05FU1RfR0xPQkFMR1JPVVBfSU5fTUlYRURET01BSU4iIH0sCisgIHsgMHhDMDAwMDJENiwgIlNUQVRVU19EU19OT19ORVNUX0xPQ0FMR1JPVVBfSU5fTUlYRURET01BSU4iIH0sCisgIHsgMHhDMDAwMDJENywgIlNUQVRVU19EU19HTE9CQUxfQ0FOVF9IQVZFX0xPQ0FMX01FTUJFUiIgfSwKKyAgeyAweEMwMDAwMkQ4LCAiU1RBVFVTX0RTX0dMT0JBTF9DQU5UX0hBVkVfVU5JVkVSU0FMX01FTUJFUiIgfSwKKyAgeyAweEMwMDAwMkQ5LCAiU1RBVFVTX0RTX1VOSVZFUlNBTF9DQU5UX0hBVkVfTE9DQUxfTUVNQkVSIiB9LAorICB7IDB4QzAwMDAyREEsICJTVEFUVVNfRFNfR0xPQkFMX0NBTlRfSEFWRV9DUk9TU0RPTUFJTl9NRU1CRVIiIH0sCisgIHsgMHhDMDAwMDJEQiwgIlNUQVRVU19EU19MT0NBTF9DQU5UX0hBVkVfQ1JPU1NET01BSU5fTE9DQUxfTUVNQkVSIiB9LAorICB7IDB4QzAwMDAyREMsICJTVEFUVVNfRFNfSEFWRV9QUklNQVJZX01FTUJFUlMiIH0sCisgIHsgMHhDMDAwMDJERCwgIlNUQVRVU19XTUlfTk9UX1NVUFBPUlRFRCIgfSwKKyAgeyAweEMwMDAwMkRFLCAiU1RBVFVTX0lOU1VGRklDSUVOVF9QT1dFUiIgfSwKKyAgeyAweEMwMDAwMkRGLCAiU1RBVFVTX1NBTV9ORUVEX0JPT1RLRVlfUEFTU1dPUkQiIH0sCisgIHsgMHhDMDAwMDJFMCwgIlNUQVRVU19TQU1fTkVFRF9CT09US0VZX0ZMT1BQWSIgfSwKKyAgeyAweEMwMDAwMkUxLCAiU1RBVFVTX0RTX0NBTlRfU1RBUlQiIH0sCisgIHsgMHhDMDAwMDJFMiwgIlNUQVRVU19EU19JTklUX0ZBSUxVUkUiIH0sCisgIHsgMHhDMDAwMDJFMywgIlNUQVRVU19TQU1fSU5JVF9GQUlMVVJFIiB9LAorICB7IDB4QzAwMDAyRTQsICJTVEFUVVNfRFNfR0NfUkVRVUlSRUQiIH0sCisgIHsgMHhDMDAwMDJFNSwgIlNUQVRVU19EU19MT0NBTF9NRU1CRVJfT0ZfTE9DQUxfT05MWSIgfSwKKyAgeyAweEMwMDAwMkU2LCAiU1RBVFVTX0RTX05PX0ZQT19JTl9VTklWRVJTQUxfR1JPVVBTIiB9LAorICB7IDB4QzAwMDAyRTcsICJTVEFUVVNfRFNfTUFDSElORV9BQ0NPVU5UX1FVT1RBX0VYQ0VFREVEIiB9LAorICB7IDB4QzAwMDAyRTgsICJTVEFUVVNfTVVMVElQTEVfRkFVTFRfVklPTEFUSU9OIiB9LAorICB7IDB4QzAwMDAzMDAsICJTVEFUVVNfTk9UX1NVUFBPUlRFRF9PTl9TQlMiIH0sCisgIHsgMHhDMDAwOTg5OCwgIlNUQVRVU19XT1dfQVNTRVJUSU9OIiB9LAorICB7IDB4QzAwMjAwMDEsICJSUENfTlRfSU5WQUxJRF9TVFJJTkdfQklORElORyIgfSwKKyAgeyAweEMwMDIwMDAyLCAiUlBDX05UX1dST05HX0tJTkRfT0ZfQklORElORyIgfSwKKyAgeyAweEMwMDIwMDAzLCAiUlBDX05UX0lOVkFMSURfQklORElORyIgfSwKKyAgeyAweEMwMDIwMDA0LCAiUlBDX05UX1BST1RTRVFfTk9UX1NVUFBPUlRFRCIgfSwKKyAgeyAweEMwMDIwMDA1LCAiUlBDX05UX0lOVkFMSURfUlBDX1BST1RTRVEiIH0sCisgIHsgMHhDMDAyMDAwNiwgIlJQQ19OVF9JTlZBTElEX1NUUklOR19VVUlEIiB9LAorICB7IDB4QzAwMjAwMDcsICJSUENfTlRfSU5WQUxJRF9FTkRQT0lOVF9GT1JNQVQiIH0sCisgIHsgMHhDMDAyMDAwOCwgIlJQQ19OVF9JTlZBTElEX05FVF9BRERSIiB9LAorICB7IDB4QzAwMjAwMDksICJSUENfTlRfTk9fRU5EUE9JTlRfRk9VTkQiIH0sCisgIHsgMHhDMDAyMDAwQSwgIlJQQ19OVF9JTlZBTElEX1RJTUVPVVQiIH0sCisgIHsgMHhDMDAyMDAwQiwgIlJQQ19OVF9PQkpFQ1RfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMjAwMEMsICJSUENfTlRfQUxSRUFEWV9SRUdJU1RFUkVEIiB9LAorICB7IDB4QzAwMjAwMEQsICJSUENfTlRfVFlQRV9BTFJFQURZX1JFR0lTVEVSRUQiIH0sCisgIHsgMHhDMDAyMDAwRSwgIlJQQ19OVF9BTFJFQURZX0xJU1RFTklORyIgfSwKKyAgeyAweEMwMDIwMDBGLCAiUlBDX05UX05PX1BST1RTRVFTX1JFR0lTVEVSRUQiIH0sCisgIHsgMHhDMDAyMDAxMCwgIlJQQ19OVF9OT1RfTElTVEVOSU5HIiB9LAorICB7IDB4QzAwMjAwMTEsICJSUENfTlRfVU5LTk9XTl9NR1JfVFlQRSIgfSwKKyAgeyAweEMwMDIwMDEyLCAiUlBDX05UX1VOS05PV05fSUYiIH0sCisgIHsgMHhDMDAyMDAxMywgIlJQQ19OVF9OT19CSU5ESU5HUyIgfSwKKyAgeyAweEMwMDIwMDE0LCAiUlBDX05UX05PX1BST1RTRVFTIiB9LAorICB7IDB4QzAwMjAwMTUsICJSUENfTlRfQ0FOVF9DUkVBVEVfRU5EUE9JTlQiIH0sCisgIHsgMHhDMDAyMDAxNiwgIlJQQ19OVF9PVVRfT0ZfUkVTT1VSQ0VTIiB9LAorICB7IDB4QzAwMjAwMTcsICJSUENfTlRfU0VSVkVSX1VOQVZBSUxBQkxFIiB9LAorICB7IDB4QzAwMjAwMTgsICJSUENfTlRfU0VSVkVSX1RPT19CVVNZIiB9LAorICB7IDB4QzAwMjAwMTksICJSUENfTlRfSU5WQUxJRF9ORVRXT1JLX09QVElPTlMiIH0sCisgIHsgMHhDMDAyMDAxQSwgIlJQQ19OVF9OT19DQUxMX0FDVElWRSIgfSwKKyAgeyAweEMwMDIwMDFCLCAiUlBDX05UX0NBTExfRkFJTEVEIiB9LAorICB7IDB4QzAwMjAwMUMsICJSUENfTlRfQ0FMTF9GQUlMRURfRE5FIiB9LAorICB7IDB4QzAwMjAwMUQsICJSUENfTlRfUFJPVE9DT0xfRVJST1IiIH0sCisgIHsgMHhDMDAyMDAxRiwgIlJQQ19OVF9VTlNVUFBPUlRFRF9UUkFOU19TWU4iIH0sCisgIHsgMHhDMDAyMDAyMSwgIlJQQ19OVF9VTlNVUFBPUlRFRF9UWVBFIiB9LAorICB7IDB4QzAwMjAwMjIsICJSUENfTlRfSU5WQUxJRF9UQUciIH0sCisgIHsgMHhDMDAyMDAyMywgIlJQQ19OVF9JTlZBTElEX0JPVU5EIiB9LAorICB7IDB4QzAwMjAwMjQsICJSUENfTlRfTk9fRU5UUllfTkFNRSIgfSwKKyAgeyAweEMwMDIwMDI1LCAiUlBDX05UX0lOVkFMSURfTkFNRV9TWU5UQVgiIH0sCisgIHsgMHhDMDAyMDAyNiwgIlJQQ19OVF9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWCIgfSwKKyAgeyAweEMwMDIwMDI4LCAiUlBDX05UX1VVSURfTk9fQUREUkVTUyIgfSwKKyAgeyAweEMwMDIwMDI5LCAiUlBDX05UX0RVUExJQ0FURV9FTkRQT0lOVCIgfSwKKyAgeyAweEMwMDIwMDJBLCAiUlBDX05UX1VOS05PV05fQVVUSE5fVFlQRSIgfSwKKyAgeyAweEMwMDIwMDJCLCAiUlBDX05UX01BWF9DQUxMU19UT09fU01BTEwiIH0sCisgIHsgMHhDMDAyMDAyQywgIlJQQ19OVF9TVFJJTkdfVE9PX0xPTkciIH0sCisgIHsgMHhDMDAyMDAyRCwgIlJQQ19OVF9QUk9UU0VRX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDIwMDJFLCAiUlBDX05UX1BST0NOVU1fT1VUX09GX1JBTkdFIiB9LAorICB7IDB4QzAwMjAwMkYsICJSUENfTlRfQklORElOR19IQVNfTk9fQVVUSCIgfSwKKyAgeyAweEMwMDIwMDMwLCAiUlBDX05UX1VOS05PV05fQVVUSE5fU0VSVklDRSIgfSwKKyAgeyAweEMwMDIwMDMxLCAiUlBDX05UX1VOS05PV05fQVVUSE5fTEVWRUwiIH0sCisgIHsgMHhDMDAyMDAzMiwgIlJQQ19OVF9JTlZBTElEX0FVVEhfSURFTlRJVFkiIH0sCisgIHsgMHhDMDAyMDAzMywgIlJQQ19OVF9VTktOT1dOX0FVVEhaX1NFUlZJQ0UiIH0sCisgIHsgMHhDMDAyMDAzNCwgIkVQVF9OVF9JTlZBTElEX0VOVFJZIiB9LAorICB7IDB4QzAwMjAwMzUsICJFUFRfTlRfQ0FOVF9QRVJGT1JNX09QIiB9LAorICB7IDB4QzAwMjAwMzYsICJFUFRfTlRfTk9UX1JFR0lTVEVSRUQiIH0sCisgIHsgMHhDMDAyMDAzNywgIlJQQ19OVF9OT1RISU5HX1RPX0VYUE9SVCIgfSwKKyAgeyAweEMwMDIwMDM4LCAiUlBDX05UX0lOQ09NUExFVEVfTkFNRSIgfSwKKyAgeyAweEMwMDIwMDM5LCAiUlBDX05UX0lOVkFMSURfVkVSU19PUFRJT04iIH0sCisgIHsgMHhDMDAyMDAzQSwgIlJQQ19OVF9OT19NT1JFX01FTUJFUlMiIH0sCisgIHsgMHhDMDAyMDAzQiwgIlJQQ19OVF9OT1RfQUxMX09CSlNfVU5FWFBPUlRFRCIgfSwKKyAgeyAweEMwMDIwMDNDLCAiUlBDX05UX0lOVEVSRkFDRV9OT1RfRk9VTkQiIH0sCisgIHsgMHhDMDAyMDAzRCwgIlJQQ19OVF9FTlRSWV9BTFJFQURZX0VYSVNUUyIgfSwKKyAgeyAweEMwMDIwMDNFLCAiUlBDX05UX0VOVFJZX05PVF9GT1VORCIgfSwKKyAgeyAweEMwMDIwMDNGLCAiUlBDX05UX05BTUVfU0VSVklDRV9VTkFWQUlMQUJMRSIgfSwKKyAgeyAweEMwMDIwMDQwLCAiUlBDX05UX0lOVkFMSURfTkFGX0lEIiB9LAorICB7IDB4QzAwMjAwNDEsICJSUENfTlRfQ0FOTk9UX1NVUFBPUlQiIH0sCisgIHsgMHhDMDAyMDA0MiwgIlJQQ19OVF9OT19DT05URVhUX0FWQUlMQUJMRSIgfSwKKyAgeyAweEMwMDIwMDQzLCAiUlBDX05UX0lOVEVSTkFMX0VSUk9SIiB9LAorICB7IDB4QzAwMjAwNDQsICJSUENfTlRfWkVST19ESVZJREUiIH0sCisgIHsgMHhDMDAyMDA0NSwgIlJQQ19OVF9BRERSRVNTX0VSUk9SIiB9LAorICB7IDB4QzAwMjAwNDYsICJSUENfTlRfRlBfRElWX1pFUk8iIH0sCisgIHsgMHhDMDAyMDA0NywgIlJQQ19OVF9GUF9VTkRFUkZMT1ciIH0sCisgIHsgMHhDMDAyMDA0OCwgIlJQQ19OVF9GUF9PVkVSRkxPVyIgfSwKKyAgeyAweEMwMDIxMDA3LCAiUlBDX1BfUkVDRUlWRV9BTEVSVEVEIiB9LAorICB7IDB4QzAwMjEwMDgsICJSUENfUF9DT05ORUNUSU9OX0NMT1NFRCIgfSwKKyAgeyAweEMwMDIxMDA5LCAiUlBDX1BfUkVDRUlWRV9GQUlMRUQiIH0sCisgIHsgMHhDMDAyMTAwQSwgIlJQQ19QX1NFTkRfRkFJTEVEIiB9LAorICB7IDB4QzAwMjEwMEIsICJSUENfUF9USU1FT1VUIiB9LAorICB7IDB4QzAwMjEwMEMsICJSUENfUF9TRVJWRVJfVFJBTlNQT1JUX0VSUk9SIiB9LAorICB7IDB4QzAwMjEwMEUsICJSUENfUF9FWENFUFRJT05fT0NDVVJFRCIgfSwKKyAgeyAweEMwMDIxMDEyLCAiUlBDX1BfQ09OTkVDVElPTl9TSFVURE9XTiIgfSwKKyAgeyAweEMwMDIxMDE1LCAiUlBDX1BfVEhSRUFEX0xJU1RFTklORyIgfSwKKyAgeyAweEMwMDMwMDAxLCAiUlBDX05UX05PX01PUkVfRU5UUklFUyIgfSwKKyAgeyAweEMwMDMwMDAyLCAiUlBDX05UX1NTX0NIQVJfVFJBTlNfT1BFTl9GQUlMIiB9LAorICB7IDB4QzAwMzAwMDMsICJSUENfTlRfU1NfQ0hBUl9UUkFOU19TSE9SVF9GSUxFIiB9LAorICB7IDB4QzAwMzAwMDQsICJSUENfTlRfU1NfSU5fTlVMTF9DT05URVhUIiB9LAorICB7IDB4QzAwMzAwMDUsICJSUENfTlRfU1NfQ09OVEVYVF9NSVNNQVRDSCIgfSwKKyAgeyAweEMwMDMwMDA2LCAiUlBDX05UX1NTX0NPTlRFWFRfREFNQUdFRCIgfSwKKyAgeyAweEMwMDMwMDA3LCAiUlBDX05UX1NTX0hBTkRMRVNfTUlTTUFUQ0giIH0sCisgIHsgMHhDMDAzMDAwOCwgIlJQQ19OVF9TU19DQU5OT1RfR0VUX0NBTExfSEFORExFIiB9LAorICB7IDB4QzAwMzAwMDksICJSUENfTlRfTlVMTF9SRUZfUE9JTlRFUiIgfSwKKyAgeyAweEMwMDMwMDBBLCAiUlBDX05UX0VOVU1fVkFMVUVfT1VUX09GX1JBTkdFIiB9LAorICB7IDB4QzAwMzAwMEIsICJSUENfTlRfQllURV9DT1VOVF9UT09fU01BTEwiIH0sCisgIHsgMHhDMDAzMDAwQywgIlJQQ19OVF9CQURfU1RVQl9EQVRBIiB9LAorICB7IDB4QzAwMjAwNDksICJSUENfTlRfQ0FMTF9JTl9QUk9HUkVTUyIgfSwKKyAgeyAweEMwMDIwMDRBLCAiUlBDX05UX05PX01PUkVfQklORElOR1MiIH0sCisgIHsgMHhDMDAyMDA0QiwgIlJQQ19OVF9HUk9VUF9NRU1CRVJfTk9UX0ZPVU5EIiB9LAorICB7IDB4QzAwMjAwNEMsICJFUFRfTlRfQ0FOVF9DUkVBVEUiIH0sCisgIHsgMHhDMDAyMDA0RCwgIlJQQ19OVF9JTlZBTElEX09CSkVDVCIgfSwKKyAgeyAweEMwMDIwMDRGLCAiUlBDX05UX05PX0lOVEVSRkFDRVMiIH0sCisgIHsgMHhDMDAyMDA1MCwgIlJQQ19OVF9DQUxMX0NBTkNFTExFRCIgfSwKKyAgeyAweEMwMDIwMDUxLCAiUlBDX05UX0JJTkRJTkdfSU5DT01QTEVURSIgfSwKKyAgeyAweEMwMDIwMDUyLCAiUlBDX05UX0NPTU1fRkFJTFVSRSIgfSwKKyAgeyAweEMwMDIwMDUzLCAiUlBDX05UX1VOU1VQUE9SVEVEX0FVVEhOX0xFVkVMIiB9LAorICB7IDB4QzAwMjAwNTQsICJSUENfTlRfTk9fUFJJTkNfTkFNRSIgfSwKKyAgeyAweEMwMDIwMDU1LCAiUlBDX05UX05PVF9SUENfRVJST1IiIH0sCisgIHsgMHg0MDAyMDA1NiwgIlJQQ19OVF9VVUlEX0xPQ0FMX09OTFkiIH0sCisgIHsgMHhDMDAyMDA1NywgIlJQQ19OVF9TRUNfUEtHX0VSUk9SIiB9LAorICB7IDB4QzAwMjAwNTgsICJSUENfTlRfTk9UX0NBTkNFTExFRCIgfSwKKyAgeyAweEMwMDMwMDU5LCAiUlBDX05UX0lOVkFMSURfRVNfQUNUSU9OIiB9LAorICB7IDB4QzAwMzAwNUEsICJSUENfTlRfV1JPTkdfRVNfVkVSU0lPTiIgfSwKKyAgeyAweEMwMDMwMDVCLCAiUlBDX05UX1dST05HX1NUVUJfVkVSU0lPTiIgfSwKKyAgeyAweEMwMDMwMDVDLCAiUlBDX05UX0lOVkFMSURfUElQRV9PQkpFQ1QiIH0sCisgIHsgMHhDMDAzMDA1RCwgIlJQQ19OVF9JTlZBTElEX1BJUEVfT1BFUkFUSU9OIiB9LAorICB7IDB4QzAwMzAwNUUsICJSUENfTlRfV1JPTkdfUElQRV9WRVJTSU9OIiB9LAorICB7IDB4NDAwMjAwQUYsICJSUENfTlRfU0VORF9JTkNPTVBMRVRFIiB9LAorICB7IDAsICAgICAgICAgIE5VTEwgfQorfTsKKworLyoKKyAqIHJldHVybiBhbiBOVCBlcnJvciBzdHJpbmcgZnJvbSBhIFNNQiBidWZmZXIKKyAqLworY29uc3QgY2hhciAqCitudF9lcnJzdHIodV9pbnQzMl90IGVycikKK3sKKyAgICBzdGF0aWMgY2hhciByZXRbMTI4XTsKKyAgICBpbnQgaTsKKworICAgIHJldFswXSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBudF9lcnJvcnNbaV0ubmFtZTsgaSsrKSB7CisJaWYgKGVyciA9PSBudF9lcnJvcnNbaV0uY29kZSkKKwkgICAgcmV0dXJuIG50X2Vycm9yc1tpXS5uYW1lOworICAgIH0KKworICAgIHNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICIweCUwOHgiLCBlcnIpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zdGltZS5hd2sgYi9zdGltZS5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE4OTFmMgotLS0gL2Rldi9udWxsCisrKyBiL3N0aW1lLmF3awpAQCAtMCwwICsxLDE5IEBACiskNiAhfiAvXmFjay8gJiYgJDUgIX4gL1tTRlJdLyAJeworCSMgZ2l2ZW4gYSB0Y3BkdW1wIGZ0cCB0cmFjZSwgb3V0cHV0IG9uZSBsaW5lIGZvciBlYWNoIHNlbmQKKwkjIGluIHRoZSBmb3JtCisJIyAgIDxzZW5kIHRpbWU+IDxzZXEgbm8+CisJIyB3aGVyZSA8c2VuZCB0aW1lPiBpcyB0aGUgdGltZSBwYWNrZXQgd2FzIHNlbnQgKGluIHNlY29uZHMgd2l0aAorCSMgemVybyBhdCB0aW1lIG9mIGZpcnN0IHBhY2tldCkgYW5kIDxzZXEgbm8+IGlzIHRoZSB0Y3Agc2VxdWVuY2UKKwkjIG51bWJlciBvZiB0aGUgcGFja2V0IGRpdmlkZWQgYnkgMTAyNCAoaS5lLiwgS2J5dGVzIHNlbnQpLgorCSMKKwkjIGNvbnZlcnQgdGltZSB0byBzZWNvbmRzCisJbiA9IHNwbGl0ICgkMSx0LCI6IikKKwl0aW0gPSB0WzFdKjM2MDAgKyB0WzJdKjYwICsgdFszXQorCWlmICghIHR6ZXJvKSB7CisJCXR6ZXJvID0gdGltCisJCU9GUyA9ICJcdCIKKwl9CisJIyBnZXQgcGFja2V0IHNlcXVlbmNlIG51bWJlcgorCWkgPSBpbmRleCgkNiwiOiIpCisJcHJpbnRmICIlNy4yZlx0JWdcbiIsIHRpbS10emVybywgc3Vic3RyKCQ2LDEsaS0xKS8xMDI0CisJfQpkaWZmIC0tZ2l0IGEvc3RyY2FzZWNtcC5jIGIvc3RyY2FzZWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zdHJjYXNlY21wLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAorICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgorICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKKyAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCisgKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc3RyY2FzZWNtcC5jLHYgMS42IDIwMDMvMTEvMTYgMDk6MzY6NDMgZ3V5IEV4cCAkIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisvKgorICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKKyAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKKyAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KKyAqLworc3RhdGljIHVfY2hhciBjaGFybWFwW10gPSB7CisJJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCisJJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCisJJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCisJJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCisJJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCisJJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCisJJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCisJJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCisJJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCisJJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCisJJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCisJJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCisJJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCisJJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCisJJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCisJJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCisJJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCisJJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCisJJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCisJJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCisJJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCisJJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCisJJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCisJJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCisJJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCisJJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCisJJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCisJJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCisJJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCisJJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCisJJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCisJJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCit9OworCitpbnQKK3N0cmNhc2VjbXAoczEsIHMyKQorCWNvbnN0IGNoYXIgKnMxLCAqczI7Cit7CisJcmVnaXN0ZXIgdV9jaGFyCSpjbSA9IGNoYXJtYXAsCisJCQkqdXMxID0gKHVfY2hhciAqKXMxLAorCQkJKnVzMiA9ICh1X2NoYXIgKilzMjsKKworCXdoaWxlIChjbVsqdXMxXSA9PSBjbVsqdXMyKytdKQorCQlpZiAoKnVzMSsrID09ICdcMCcpCisJCQlyZXR1cm4oMCk7CisJcmV0dXJuKGNtWyp1czFdIC0gY21bKi0tdXMyXSk7Cit9CisKK2ludAorc3RybmNhc2VjbXAoczEsIHMyLCBuKQorCWNvbnN0IGNoYXIgKnMxLCAqczI7CisJcmVnaXN0ZXIgaW50IG47Cit7CisJcmVnaXN0ZXIgdV9jaGFyCSpjbSA9IGNoYXJtYXAsCisJCQkqdXMxID0gKHVfY2hhciAqKXMxLAorCQkJKnVzMiA9ICh1X2NoYXIgKilzMjsKKworCXdoaWxlICgtLW4gPj0gMCAmJiBjbVsqdXMxXSA9PSBjbVsqdXMyKytdKQorCQlpZiAoKnVzMSsrID09ICdcMCcpCisJCQlyZXR1cm4oMCk7CisJcmV0dXJuKG4gPCAwID8gMCA6IGNtWyp1czFdIC0gY21bKi0tdXMyXSk7Cit9CmRpZmYgLS1naXQgYS90Y3AuaCBiL3RjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzRjZDYKLS0tIC9kZXYvbnVsbAorKysgYi90Y3AuaApAQCAtMCwwICsxLDg0IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RjcC5oLHYgMS4xMS4yLjEgMjAwNS8xMS8yOSAwOTowOToyNiBoYW5uZXMgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCit0eXBlZGVmCXVfaW50MzJfdAl0Y3Bfc2VxOworLyoKKyAqIFRDUCBoZWFkZXIuCisgKiBQZXIgUkZDIDc5MywgU2VwdGVtYmVyLCAxOTgxLgorICovCitzdHJ1Y3QgdGNwaGRyIHsKKwl1X2ludDE2X3QJdGhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworCXVfaW50MTZfdAl0aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwl0Y3Bfc2VxCQl0aF9zZXE7CQkJLyogc2VxdWVuY2UgbnVtYmVyICovCisJdGNwX3NlcQkJdGhfYWNrOwkJCS8qIGFja25vd2xlZGdlbWVudCBudW1iZXIgKi8KKwl1X2ludDhfdAl0aF9vZmZ4MjsJCS8qIGRhdGEgb2Zmc2V0LCByc3ZkICovCisjZGVmaW5lIFRIX09GRih0aCkJKCgodGgpLT50aF9vZmZ4MiAmIDB4ZjApID4+IDQpCisJdV9pbnQ4X3QJdGhfZmxhZ3M7CisjZGVmaW5lCVRIX0ZJTgkweDAxCisjZGVmaW5lCVRIX1NZTgkweDAyCisjZGVmaW5lCVRIX1JTVAkweDA0CisjZGVmaW5lCVRIX1BVU0gJMHgwOAorI2RlZmluZQlUSF9BQ0sJMHgxMAorI2RlZmluZQlUSF9VUkcJMHgyMAorI2RlZmluZSBUSF9FQ05FQ0hPCTB4NDAJLyogRUNOIEVjaG8gKi8KKyNkZWZpbmUgVEhfQ1dSCQkweDgwCS8qIEVDTiBDd25kIFJlZHVjZWQgKi8KKwl1X2ludDE2X3QJdGhfd2luOwkJCS8qIHdpbmRvdyAqLworCXVfaW50MTZfdAl0aF9zdW07CQkJLyogY2hlY2tzdW0gKi8KKwl1X2ludDE2X3QJdGhfdXJwOwkJCS8qIHVyZ2VudCBwb2ludGVyICovCit9OworCisjZGVmaW5lCVRDUE9QVF9FT0wJCTAKKyNkZWZpbmUJVENQT1BUX05PUAkJMQorI2RlZmluZQlUQ1BPUFRfTUFYU0VHCQkyCisjZGVmaW5lICAgIFRDUE9MRU5fTUFYU0VHCQk0CisjZGVmaW5lCVRDUE9QVF9XU0NBTEUJCTMJLyogd2luZG93IHNjYWxlIGZhY3RvciAocmZjMTMyMykgKi8KKyNkZWZpbmUJVENQT1BUX1NBQ0tPSwkJNAkvKiBzZWxlY3RpdmUgYWNrIG9rIChyZmMyMDE4KSAqLworI2RlZmluZQlUQ1BPUFRfU0FDSwkJNQkvKiBzZWxlY3RpdmUgYWNrIChyZmMyMDE4KSAqLworI2RlZmluZQlUQ1BPUFRfRUNITwkJNgkvKiBlY2hvIChyZmMxMDcyKSAqLworI2RlZmluZQlUQ1BPUFRfRUNIT1JFUExZCTcJLyogZWNobyAocmZjMTA3MikgKi8KKyNkZWZpbmUgVENQT1BUX1RJTUVTVEFNUAk4CS8qIHRpbWVzdGFtcCAocmZjMTMyMykgKi8KKyNkZWZpbmUgICAgVENQT0xFTl9USU1FU1RBTVAJCTEwCisjZGVmaW5lICAgIFRDUE9MRU5fVFNUQU1QX0FQUEEJCShUQ1BPTEVOX1RJTUVTVEFNUCsyKSAvKiBhcHBlbmRpeCBBICovCisjZGVmaW5lIFRDUE9QVF9DQwkJMTEJLyogVC9UQ1AgQ0Mgb3B0aW9ucyAocmZjMTY0NCkgKi8KKyNkZWZpbmUgVENQT1BUX0NDTkVXCQkxMgkvKiBUL1RDUCBDQyBvcHRpb25zIChyZmMxNjQ0KSAqLworI2RlZmluZSBUQ1BPUFRfQ0NFQ0hPCQkxMwkvKiBUL1RDUCBDQyBvcHRpb25zIChyZmMxNjQ0KSAqLworI2RlZmluZSBUQ1BPUFRfU0lHTkFUVVJFCTE5CS8qIEtleWVkIE1ENSAocmZjMjM4NSkgKi8KKyNkZWZpbmUgICAgVENQT0xFTl9TSUdOQVRVUkUJCTE4CisjZGVmaW5lIFRDUF9TSUdMRU4gMTYJCQkvKiBsZW5ndGggb2YgYW4gb3B0aW9uIDE5IGRpZ2VzdCAqLworI2RlZmluZSBUQ1BPUFRfQVVUSCAgICAgICAgICAgICAyMCAgICAgIC8qIEVuaGFuY2VkIEFVVEggb3B0aW9uICovCisKKyNkZWZpbmUgVENQT1BUX1RTVEFNUF9IRFIJXAorICAgIChUQ1BPUFRfTk9QPDwyNHxUQ1BPUFRfTk9QPDwxNnxUQ1BPUFRfVElNRVNUQU1QPDw4fFRDUE9MRU5fVElNRVNUQU1QKQpkaWZmIC0tZ2l0IGEvdGNwZHVtcC1zdGRpbmMuaCBiL3RjcGR1bXAtc3RkaW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QwNGQwOQotLS0gL2Rldi9udWxsCisrKyBiL3RjcGR1bXAtc3RkaW5jLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgLSAyMDAzCisgKiBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUG9saXRlY25pY28gZGkgVG9yaW5vIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RjcGR1bXAtc3RkaW5jLmgsdiAxLjEyLjIuNSAyMDA2LzA2LzIzIDAyOjA3OjI3IGhhbm5lcyBFeHAgJCAoTEJMKQorICovCisKKy8qCisgKiBJbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBPUyBoZWFkZXIgZmlsZXMgb24gV2luZG93cyBhbmQgdmFyaW91cyBmbGF2b3JzCisgKiBvZiBVTklYLCBhbmQgYWxzbyBkZWZpbmUgc29tZSBhZGRpdGlvbmFsIGl0ZW1zIGFuZCBpbmNsdWRlIHZhcmlvdXMKKyAqIG5vbi1PUyBoZWFkZXIgZmlsZXMgb24gV2luZG93cywgYW5kOyB0aGlzIGlzb2xhdGVzIG1vc3Qgb2YgdGhlIHBsYXRmb3JtCisgKiBkaWZmZXJlbmNlcyB0byB0aGlzIG9uZSBmaWxlLgorICovCisKKyNpZm5kZWYgdGNwZHVtcF9zdGRpbmNfaAorI2RlZmluZSB0Y3BkdW1wX3N0ZGluY19oCisKKyNpZmRlZiBXSU4zMgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPFdzMnRjcGlwLmg+CisjaW5jbHVkZSAiYml0dHlwZXMuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGRiLmg+ICAvKiBpbiB3cGNhcCdzIFdpbjMyL2luY2x1ZGUgKi8KKworI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiAhZGVmaW5lZChfX1dBVENPTUNfXykKKyN1bmRlZiB0b2FzY2lpCisjZGVmaW5lIGlzYXNjaWkgX19pc2FzY2lpCisjZGVmaW5lIHRvYXNjaWkgX190b2FzY2lpCisjZGVmaW5lIHN0YXQgX3N0YXQKKyNkZWZpbmUgb3BlbiBfb3BlbgorI2RlZmluZSBmc3RhdCBfZnN0YXQKKyNkZWZpbmUgcmVhZCBfcmVhZAorI2RlZmluZSBjbG9zZSBfY2xvc2UKKyNkZWZpbmUgT19SRE9OTFkgX09fUkRPTkxZCisKK3R5cGVkZWYgc2hvcnQgaW5vX3Q7CisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KKworI2lmZGVmIF9fTUlOR1czMl9fCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworLyogUHJvdG9zIGZvciBtaXNzaW5nL3guYyBmdW5jdGlvbnMgKGlkZWFsbHkgPG1pc3NpbmcvYWRkcmluZm8uaD4KKyAqIHNob3VsZCBiZSB1c2VkLCBidXQgaXQgY2xhc2hlcyB3aXRoIDx3czJ0Y3BpcC5oPikuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyICppbmV0X250b3AgKGludCwgY29uc3Qgdm9pZCAqLCBjaGFyICosIHNpemVfdCk7CitleHRlcm4gaW50IGluZXRfcHRvbiAoaW50LCBjb25zdCBjaGFyICosIHZvaWQgKik7CitleHRlcm4gaW50IGluZXRfYXRvbiAoY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICphZGRyKTsKKworI2lmbmRlZiBJTkVUNl9BRERSU1RSTEVOCisjZGVmaW5lIElORVQ2X0FERFJTVFJMRU4gNDYKKyNlbmRpZgorCisjaWZuZGVmIHRvYXNjaWkKKyNkZWZpbmUgdG9hc2NpaShjKSAoKGMpICYgMHg3ZikKKyNlbmRpZgorCisjaWZuZGVmIGNhZGRyX3QKK3R5cGVkZWYgY2hhciogY2FkZHJfdDsKKyNlbmRpZiAvKiBjYWRkcl90ICovCisKKyNkZWZpbmUgTUFYSE9TVE5BTUVMRU4JNjQKKyNkZWZpbmUJTklfTUFYSE9TVAkxMDI1CisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2RlZmluZSBSRVRTSUdUWVBFIHZvaWQKKworI2Vsc2UgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCQkvKiBjb25jZXNzaW9uIHRvIEFJWCAqLworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaWZkZWYgSU5FVDYKKyNpbmNsdWRlICJpcDYuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChNU0RPUykKKyAgI2RlZmluZSBGT1BFTl9SRUFEX1RYVCAgICJydCIKKyAgI2RlZmluZSBGT1BFTl9SRUFEX0JJTiAgICJyYiIKKyAgI2RlZmluZSBGT1BFTl9XUklURV9UWFQgICJ3dCIKKyAgI2RlZmluZSBGT1BFTl9XUklURV9CSU4gICJ3YiIKKyNlbHNlCisgICNkZWZpbmUgRk9QRU5fUkVBRF9UWFQgICAiciIKKyAgI2RlZmluZSBGT1BFTl9SRUFEX0JJTiAgIEZPUEVOX1JFQURfVFhUCisgICNkZWZpbmUgRk9QRU5fV1JJVEVfVFhUICAidyIKKyAgI2RlZmluZSBGT1BFTl9XUklURV9CSU4gIEZPUEVOX1dSSVRFX1RYVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAhZGVmaW5lZChfX250b2hsKQorICAjdW5kZWYgbnRvaGwKKyAgI3VuZGVmIG50b2hzCisgICN1bmRlZiBodG9ubAorICAjdW5kZWYgaHRvbnMKKworICBleHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fbnRvaGwgKHVuc2lnbmVkIGxvbmcgeCk7CisgIGV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IF9fbnRvaHMgKHVuc2lnbmVkIHNob3J0IHgpOworCisgICNkZWZpbmUgbnRvaGwoeCkgIF9fbnRvaGwoeCkKKyAgI2RlZmluZSBudG9ocyh4KSAgX19udG9ocyh4KQorICAjZGVmaW5lIGh0b25sKHgpICBfX250b2hsKHgpCisgICNkZWZpbmUgaHRvbnMoeCkgIF9fbnRvaHMoeCkKKworICBleHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9fbnRvaGwgKHVuc2lnbmVkIGxvbmcgeCkKKyAgeworICAgIF9fYXNtX18gKCJ4Y2hnYiAlYjAsICVoMFxuXHQiICAgLyogc3dhcCBsb3dlciBieXRlcyAgKi8KKyAgICAgICAgICAgICAicm9ybCAgJDE2LCAlMFxuXHQiICAgIC8qIHN3YXAgd29yZHMgICAgICAgICovCisgICAgICAgICAgICAgInhjaGdiICViMCwgJWgwIiAgICAgICAvKiBzd2FwIGhpZ2hlciBieXRlcyAqLworICAgICAgICAgICAgOiAiPXEiICh4KSA6ICIwIiAoeCkpOworICAgIHJldHVybiAoeCk7CisgIH0KKworICBleHRlcm4gX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBfX250b2hzICh1bnNpZ25lZCBzaG9ydCB4KQorICB7CisgICAgX19hc21fXyAoInhjaGdiICViMCwgJWgwIiAgICAgICAvKiBzd2FwIGJ5dGVzICovCisgICAgICAgICAgICA6ICI9cSIgKHgpIDogIjAiICh4KSk7CisgICAgcmV0dXJuICh4KTsKKyAgfQorI2VuZGlmCisKKyNpZm5kZWYgSU5FVF9BRERSU1RSTEVOCisjZGVmaW5lIElORVRfQUREUlNUUkxFTiAxNgorI2VuZGlmCisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZW5kaWYgLyogdGNwZHVtcF9zdGRpbmNfaCAqLwpkaWZmIC0tZ2l0IGEvdGNwZHVtcC4xIGIvdGNwZHVtcC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxM2I0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90Y3BkdW1wLjEKQEAgLTAsMCArMSwyMzU5IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90Y3BkdW1wLjEsdiAxLjE2Ny4yLjExIDIwMDcvMDYvMTUgMjA6MTM6NDkgZ3V5IEV4cCAkIChMQkwpCisuXCIKKy5cIgkkTmV0QlNEOiB0Y3BkdW1wLjgsdiAxLjkgMjAwMy8wMy8zMSAwMDoxODoxNyBwZXJyeSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggVENQRFVNUCAxICAiMTggQXByaWwgMjAwNSIKKy5TSCBOQU1FCit0Y3BkdW1wIFwtIGR1bXAgdHJhZmZpYyBvbiBhIG5ldHdvcmsKKy5TSCBTWU5PUFNJUworLm5hCisuQiB0Y3BkdW1wCitbCisuQiBcLUFkRGVmbExuTk9wcVJTdHVVdnhYCitdIFsKKy5CIFwtYworLkkgY291bnQKK10KKy5icgorLnRpICs4CitbCisuQiBcLUMKKy5JIGZpbGVfc2l6ZQorXSBbCisuQiBcLUYKKy5JIGZpbGUKK10KKy5icgorLnRpICs4CitbCisuQiBcLWkKKy5JIGludGVyZmFjZQorXQorWworLkIgXC1tCisuSSBtb2R1bGUKK10KK1sKKy5CIFwtTQorLkkgc2VjcmV0CitdCisuYnIKKy50aSArOAorWworLkIgXC1yCisuSSBmaWxlCitdCitbCisuQiBcLXMKKy5JIHNuYXBsZW4KK10KK1sKKy5CIFwtVAorLkkgdHlwZQorXQorWworLkIgXC13CisuSSBmaWxlCitdCisuYnIKKy50aSArOAorWworLkIgXC1XCisuSSBmaWxlY291bnQKK10KKy5icgorLnRpICs4CitbCisuQiBcLUUKKy5JIHNwaUBpcGFkZHIgYWxnbzpzZWNyZXQsLi4uCitdCisuYnIKKy50aSArOAorWworLkIgXC15CisuSSBkYXRhbGlua3R5cGUKK10KK1sKKy5CIFwtWgorLkkgdXNlcgorXQorLnRpICs4CitbCisuSSBleHByZXNzaW9uCitdCisuYnIKKy5hZAorLlNIIERFU0NSSVBUSU9OCisuTFAKK1xmSVRjcGR1bXBcZlAgcHJpbnRzIG91dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBwYWNrZXRzIG9uIGEKK25ldHdvcmsgaW50ZXJmYWNlIHRoYXQgbWF0Y2ggdGhlIGJvb2xlYW4gXGZJZXhwcmVzc2lvblxmUC4gIEl0IGNhbiBhbHNvCitiZSBydW4gd2l0aCB0aGUKKy5CIFwtdworZmxhZywgd2hpY2ggY2F1c2VzIGl0IHRvIHNhdmUgdGhlIHBhY2tldCBkYXRhIHRvIGEgZmlsZSBmb3IgbGF0ZXIKK2FuYWx5c2lzLCBhbmQvb3Igd2l0aCB0aGUKKy5CIFwtcgorZmxhZywgd2hpY2ggY2F1c2VzIGl0IHRvIHJlYWQgZnJvbSBhIHNhdmVkIHBhY2tldCBmaWxlIHJhdGhlciB0aGFuIHRvCityZWFkIHBhY2tldHMgZnJvbSBhIG5ldHdvcmsgaW50ZXJmYWNlLiAgSW4gYWxsIGNhc2VzLCBvbmx5IHBhY2tldHMgdGhhdAorbWF0Y2gKKy5JIGV4cHJlc3Npb24KK3dpbGwgYmUgcHJvY2Vzc2VkIGJ5CisuSVIgdGNwZHVtcCAuCisuTFAKKy5JIFRjcGR1bXAKK3dpbGwsIGlmIG5vdCBydW4gd2l0aCB0aGUKKy5CIFwtYworZmxhZywgY29udGludWUgY2FwdHVyaW5nIHBhY2tldHMgdW50aWwgaXQgaXMgaW50ZXJydXB0ZWQgYnkgYSBTSUdJTlQKK3NpZ25hbCAoZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgYnkgdHlwaW5nIHlvdXIgaW50ZXJydXB0IGNoYXJhY3RlciwKK3R5cGljYWxseSBjb250cm9sLUMpIG9yIGEgU0lHVEVSTSBzaWduYWwgKHR5cGljYWxseSBnZW5lcmF0ZWQgd2l0aCB0aGUKKy5CUiBraWxsICgxKQorY29tbWFuZCk7IGlmIHJ1biB3aXRoIHRoZQorLkIgXC1jCitmbGFnLCBpdCB3aWxsIGNhcHR1cmUgcGFja2V0cyB1bnRpbCBpdCBpcyBpbnRlcnJ1cHRlZCBieSBhIFNJR0lOVCBvcgorU0lHVEVSTSBzaWduYWwgb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGFja2V0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgorLkxQCitXaGVuCisuSSB0Y3BkdW1wCitmaW5pc2hlcyBjYXB0dXJpbmcgcGFja2V0cywgaXQgd2lsbCByZXBvcnQgY291bnRzIG9mOgorLklQCitwYWNrZXRzIGBgY2FwdHVyZWQnJyAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdAorLkkgdGNwZHVtcAoraGFzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQpOworLklQCitwYWNrZXRzIGBgcmVjZWl2ZWQgYnkgZmlsdGVyJycgKHRoZSBtZWFuaW5nIG9mIHRoaXMgZGVwZW5kcyBvbiB0aGUgT1Mgb24KK3doaWNoIHlvdSdyZSBydW5uaW5nCisuSVIgdGNwZHVtcCAsCithbmQgcG9zc2libHkgb24gdGhlIHdheSB0aGUgT1Mgd2FzIGNvbmZpZ3VyZWQgLSBpZiBhIGZpbHRlciB3YXMKK3NwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvbiBzb21lIE9TZXMgaXQgY291bnRzIHBhY2tldHMgcmVnYXJkbGVzcworb2Ygd2hldGhlciB0aGV5IHdlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gYW5kLCBldmVuIGlmIHRoZXkKK3dlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorLkkgdGNwZHVtcAoraGFzIHJlYWQgYW5kIHByb2Nlc3NlZCB0aGVtIHlldCwgb24gb3RoZXIgT1NlcyBpdCBjb3VudHMgb25seSBwYWNrZXRzIHRoYXQgd2VyZQorbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisuSSB0Y3BkdW1wCitoYXMgcmVhZCBhbmQgcHJvY2Vzc2VkIHRoZW0geWV0LCBhbmQgb24gb3RoZXIgT1NlcyBpdCBjb3VudHMgb25seQorcGFja2V0cyB0aGF0IHdlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gYW5kIHdlcmUgcHJvY2Vzc2VkIGJ5CisuSVIgdGNwZHVtcCApOworLklQCitwYWNrZXRzIGBgZHJvcHBlZCBieSBrZXJuZWwnJyAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlCitkcm9wcGVkLCBkdWUgdG8gYSBsYWNrIG9mIGJ1ZmZlciBzcGFjZSwgYnkgdGhlIHBhY2tldCBjYXB0dXJlIG1lY2hhbmlzbQoraW4gdGhlIE9TIG9uIHdoaWNoCisuSSB0Y3BkdW1wCitpcyBydW5uaW5nLCBpZiB0aGUgT1MgcmVwb3J0cyB0aGF0IGluZm9ybWF0aW9uIHRvIGFwcGxpY2F0aW9uczsgaWYgbm90LAoraXQgd2lsbCBiZSByZXBvcnRlZCBhcyAwKS4KKy5MUAorT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUgU0lHSU5GTyBzaWduYWwsIHN1Y2ggYXMgbW9zdCBCU0RzCisoaW5jbHVkaW5nIE1hYyBPUyBYKSBhbmQgRGlnaXRhbC9UcnU2NCBVTklYLCBpdCB3aWxsIHJlcG9ydCB0aG9zZSBjb3VudHMKK3doZW4gaXQgcmVjZWl2ZXMgYSBTSUdJTkZPIHNpZ25hbCAoZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgYnkgdHlwaW5nCit5b3VyIGBgc3RhdHVzJycgY2hhcmFjdGVyLCB0eXBpY2FsbHkgY29udHJvbC1ULCBhbHRob3VnaCBvbiBzb21lCitwbGF0Zm9ybXMsIHN1Y2ggYXMgTWFjIE9TIFgsIHRoZSBgYHN0YXR1cycnIGNoYXJhY3RlciBpcyBub3Qgc2V0IGJ5CitkZWZhdWx0LCBzbyB5b3UgbXVzdCBzZXQgaXQgd2l0aAorLkJSIHN0dHkgKDEpCitpbiBvcmRlciB0byB1c2UgaXQpIGFuZCB3aWxsIGNvbnRpbnVlIGNhcHR1cmluZyBwYWNrZXRzLgorLkxQCitSZWFkaW5nIHBhY2tldHMgZnJvbSBhIG5ldHdvcmsgaW50ZXJmYWNlIG1heSByZXF1aXJlIHRoYXQgeW91IGhhdmUKK3NwZWNpYWwgcHJpdmlsZWdlczoKKy5UUAorLkIgVW5kZXIgU3VuT1MgMy54IG9yIDQueCB3aXRoIE5JVCBvciBCUEY6CitZb3UgbXVzdCBoYXZlIHJlYWQgYWNjZXNzIHRvCisuSSAvZGV2L25pdAorb3IKKy5JUiAvZGV2L2JwZiogLgorLlRQCisuQiBVbmRlciBTb2xhcmlzIHdpdGggRExQSToKK1lvdSBtdXN0IGhhdmUgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIG5ldHdvcmsgcHNldWRvIGRldmljZSwgZS5nLgorLklSIC9kZXYvbGUgLgorT24gYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCBob3dldmVyLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IHRvCithbGxvdworLkkgdGNwZHVtcAordG8gY2FwdHVyZSBpbiBwcm9taXNjdW91cyBtb2RlOyBvbiB0aG9zZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCB5b3UgbXVzdAorYmUgcm9vdCwgb3IKKy5JIHRjcGR1bXAKK211c3QgYmUgaW5zdGFsbGVkIHNldHVpZCB0byByb290LCBpbiBvcmRlciB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzCittb2RlLiAgTm90ZSB0aGF0LCBvbiBtYW55IChwZXJoYXBzIGFsbCkgaW50ZXJmYWNlcywgaWYgeW91IGRvbid0IGNhcHR1cmUKK2luIHByb21pc2N1b3VzIG1vZGUsIHlvdSB3aWxsIG5vdCBzZWUgYW55IG91dGdvaW5nIHBhY2tldHMsIHNvIGEgY2FwdHVyZQorbm90IGRvbmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBtYXkgbm90IGJlIHZlcnkgdXNlZnVsLgorLlRQCisuQiBVbmRlciBIUC1VWCB3aXRoIERMUEk6CitZb3UgbXVzdCBiZSByb290IG9yCisuSSB0Y3BkdW1wCittdXN0IGJlIGluc3RhbGxlZCBzZXR1aWQgdG8gcm9vdC4KKy5UUAorLkIgVW5kZXIgSVJJWCB3aXRoIHNub29wOgorWW91IG11c3QgYmUgcm9vdCBvcgorLkkgdGNwZHVtcAorbXVzdCBiZSBpbnN0YWxsZWQgc2V0dWlkIHRvIHJvb3QuCisuVFAKKy5CIFVuZGVyIExpbnV4OgorWW91IG11c3QgYmUgcm9vdCBvcgorLkkgdGNwZHVtcAorbXVzdCBiZSBpbnN0YWxsZWQgc2V0dWlkIHRvIHJvb3QgKHVubGVzcyB5b3VyIGRpc3RyaWJ1dGlvbiBoYXMgYSBrZXJuZWwKK3RoYXQgc3VwcG9ydHMgY2FwYWJpbGl0eSBiaXRzIHN1Y2ggYXMgQ0FQX05FVF9SQVcgYW5kIGNvZGUgdG8gYWxsb3cKK3Rob3NlIGNhcGFiaWxpdHkgYml0cyB0byBiZSBnaXZlbiB0byBwYXJ0aWN1bGFyIGFjY291bnRzIGFuZCB0byBjYXVzZQordGhvc2UgYml0cyB0byBiZSBzZXQgb24gYSB1c2VyJ3MgaW5pdGlhbCBwcm9jZXNzZXMgd2hlbiB0aGV5IGxvZyBpbiwgaW4KK3doaWNoIGNhc2UgeW91ICBtdXN0IGhhdmUgQ0FQX05FVF9SQVcgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbmQKK0NBUF9ORVRfQURNSU4gdG8gZW51bWVyYXRlIG5ldHdvcmsgZGV2aWNlcyB3aXRoLCBmb3IgZXhhbXBsZSwgdGhlCisuQiBcLUQKK2ZsYWcpLgorLlRQCisuQiBVbmRlciBVTFRSSVggYW5kIERpZ2l0YWwgVU5JWC9UcnU2NCBVTklYOgorQW55IHVzZXIgbWF5IGNhcHR1cmUgbmV0d29yayB0cmFmZmljIHdpdGgKKy5JUiB0Y3BkdW1wIC4KK0hvd2V2ZXIsIG5vIHVzZXIgKG5vdCBldmVuIHRoZSBzdXBlci11c2VyKSBjYW4gY2FwdHVyZSBpbiBwcm9taXNjdW91cworbW9kZSBvbiBhbiBpbnRlcmZhY2UgdW5sZXNzIHRoZSBzdXBlci11c2VyIGhhcyBlbmFibGVkIHByb21pc2N1b3VzLW1vZGUKK29wZXJhdGlvbiBvbiB0aGF0IGludGVyZmFjZSB1c2luZworLklSIHBmY29uZmlnICg4KSwKK2FuZCBubyB1c2VyIChub3QgZXZlbiB0aGUgc3VwZXItdXNlcikgY2FuIGNhcHR1cmUgdW5pY2FzdCB0cmFmZmljCityZWNlaXZlZCBieSBvciBzZW50IGJ5IHRoZSBtYWNoaW5lIG9uIGFuIGludGVyZmFjZSB1bmxlc3MgdGhlIHN1cGVyLXVzZXIKK2hhcyBlbmFibGVkIGNvcHktYWxsLW1vZGUgb3BlcmF0aW9uIG9uIHRoYXQgaW50ZXJmYWNlIHVzaW5nCisuSVIgcGZjb25maWcgLAorc28KKy5JIHVzZWZ1bAorcGFja2V0IGNhcHR1cmUgb24gYW4gaW50ZXJmYWNlIHByb2JhYmx5IHJlcXVpcmVzIHRoYXQgZWl0aGVyCitwcm9taXNjdW91cy1tb2RlIG9yIGNvcHktYWxsLW1vZGUgb3BlcmF0aW9uLCBvciBib3RoIG1vZGVzIG9mCitvcGVyYXRpb24sIGJlIGVuYWJsZWQgb24gdGhhdCBpbnRlcmZhY2UuCisuVFAKKy5CIFVuZGVyIEJTRCAodGhpcyBpbmNsdWRlcyBNYWMgT1MgWCk6CitZb3UgbXVzdCBoYXZlIHJlYWQgYWNjZXNzIHRvCisuSSAvZGV2L2JwZioKK29uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgY2xvbmluZyBCUEYgZGV2aWNlLCBvciB0bworLkkgL2Rldi9icGYKK29uIHN5c3RlbXMgdGhhdCBkby4KK09uIEJTRHMgd2l0aCBhIGRldmZzICh0aGlzIGluY2x1ZGVzIE1hYyBPUyBYKSwgdGhpcyBtaWdodCBpbnZvbHZlIG1vcmUKK3RoYW4ganVzdCBoYXZpbmcgc29tZWJvZHkgd2l0aCBzdXBlci11c2VyIGFjY2VzcyBzZXR0aW5nIHRoZSBvd25lcnNoaXAKK29yIHBlcm1pc3Npb25zIG9uIHRoZSBCUEYgZGV2aWNlcyAtIGl0IG1pZ2h0IGludm9sdmUgY29uZmlndXJpbmcgZGV2ZnMKK3RvIHNldCB0aGUgb3duZXJzaGlwIG9yIHBlcm1pc3Npb25zIGV2ZXJ5IHRpbWUgdGhlIHN5c3RlbSBpcyBib290ZWQsCitpZiB0aGUgc3lzdGVtIGV2ZW4gc3VwcG9ydHMgdGhhdDsgaWYgaXQgZG9lc24ndCBzdXBwb3J0IHRoYXQsIHlvdSBtaWdodAoraGF2ZSB0byBmaW5kIHNvbWUgb3RoZXIgd2F5IHRvIG1ha2UgdGhhdCBoYXBwZW4gYXQgYm9vdCB0aW1lLgorLkxQCitSZWFkaW5nIGEgc2F2ZWQgcGFja2V0IGZpbGUgZG9lc24ndCByZXF1aXJlIHNwZWNpYWwgcHJpdmlsZWdlcy4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtQQorUHJpbnQgZWFjaCBwYWNrZXQgKG1pbnVzIGl0cyBsaW5rIGxldmVsIGhlYWRlcikgaW4gQVNDSUkuICBIYW5keSBmb3IKK2NhcHR1cmluZyB3ZWIgcGFnZXMuCisuVFAKKy5CIFwtYworRXhpdCBhZnRlciByZWNlaXZpbmcgXGZJY291bnRcZlAgcGFja2V0cy4KKy5UUAorLkIgXC1DCitCZWZvcmUgd3JpdGluZyBhIHJhdyBwYWNrZXQgdG8gYSBzYXZlZmlsZSwgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcworY3VycmVudGx5IGxhcmdlciB0aGFuIFxmSWZpbGVfc2l6ZVxmUCBhbmQsIGlmIHNvLCBjbG9zZSB0aGUgY3VycmVudAorc2F2ZWZpbGUgYW5kIG9wZW4gYSBuZXcgb25lLiAgU2F2ZWZpbGVzIGFmdGVyIHRoZSBmaXJzdCBzYXZlZmlsZSB3aWxsCitoYXZlIHRoZSBuYW1lIHNwZWNpZmllZCB3aXRoIHRoZQorLkIgXC13CitmbGFnLCB3aXRoIGEgbnVtYmVyIGFmdGVyIGl0LCBzdGFydGluZyBhdCAxIGFuZCBjb250aW51aW5nIHVwd2FyZC4KK1RoZSB1bml0cyBvZiBcZklmaWxlX3NpemVcZlAgYXJlIG1pbGxpb25zIG9mIGJ5dGVzICgxLDAwMCwwMDAgYnl0ZXMsCitub3QgMSwwNDgsNTc2IGJ5dGVzKS4KKy5UUAorLkIgXC1kCitEdW1wIHRoZSBjb21waWxlZCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gdG8KK3N0YW5kYXJkIG91dHB1dCBhbmQgc3RvcC4KKy5UUAorLkIgXC1kZAorRHVtcCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBhcyBhCisuQiBDCitwcm9ncmFtIGZyYWdtZW50LgorLlRQCisuQiBcLWRkZAorRHVtcCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBhcyBkZWNpbWFsIG51bWJlcnMgKHByZWNlZGVkIHdpdGggYSBjb3VudCkuCisuVFAKKy5CIFwtRAorUHJpbnQgdGhlIGxpc3Qgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSBhbmQgb24KK3doaWNoCisuSSB0Y3BkdW1wCitjYW4gY2FwdHVyZSBwYWNrZXRzLiAgRm9yIGVhY2ggbmV0d29yayBpbnRlcmZhY2UsIGEgbnVtYmVyIGFuZCBhbgoraW50ZXJmYWNlIG5hbWUsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUKK2ludGVyZmFjZSwgaXMgcHJpbnRlZC4gIFRoZSBpbnRlcmZhY2UgbmFtZSBvciB0aGUgbnVtYmVyIGNhbiBiZSBzdXBwbGllZAordG8gdGhlCisuQiBcLWkKK2ZsYWcgdG8gc3BlY2lmeSBhbiBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gY2FwdHVyZS4KKy5JUAorVGhpcyBjYW4gYmUgdXNlZnVsIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgY29tbWFuZCB0byBsaXN0IHRoZW0KKyhlLmcuLCBXaW5kb3dzIHN5c3RlbXMsIG9yIFVOSVggc3lzdGVtcyBsYWNraW5nCisuQlIgImlmY29uZmlnIFwtYSIgKTsKK3RoZSBudW1iZXIgY2FuIGJlIHVzZWZ1bCBvbiBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyIHN5c3RlbXMsIHdoZXJlIHRoZQoraW50ZXJmYWNlIG5hbWUgaXMgYSBzb21ld2hhdCBjb21wbGV4IHN0cmluZy4KKy5JUAorVGhlCisuQiBcLUQKK2ZsYWcgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGlmCisuSSB0Y3BkdW1wCit3YXMgYnVpbHQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mCisuSSBsaWJwY2FwCit0aGF0IGxhY2tzIHRoZQorLkIgcGNhcF9maW5kYWxsZGV2cygpCitmdW5jdGlvbi4KKy5UUAorLkIgXC1lCitQcmludCB0aGUgbGluay1sZXZlbCBoZWFkZXIgb24gZWFjaCBkdW1wIGxpbmUuCisuVFAKKy5CIFwtRQorVXNlIFxmSXNwaUBpcGFkZHIgYWxnbzpzZWNyZXRcZlAgZm9yIGRlY3J5cHRpbmcgSVBzZWMgRVNQIHBhY2tldHMgdGhhdAorYXJlIGFkZHJlc3NlZCB0byBcZklhZGRyXGZQIGFuZCBjb250YWluIFNlY3VyaXR5IFBhcmFtZXRlciBJbmRleCB2YWx1ZQorXGZJc3BpXGZQLiBUaGlzIGNvbWJpbmF0aW9uIG1heSBiZSByZXBlYXRlZCB3aXRoIGNvbW1hIG9yIG5ld2xpbmUgc2VwZXJhdGlvbi4KKy5JUAorTm90ZSB0aGF0IHNldHRpbmcgdGhlIHNlY3JldCBmb3IgSVB2NCBFU1AgcGFja2V0cyBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgorLklQCitBbGdvcml0aG1zIG1heSBiZQorXGZCZGVzLWNiY1xmUCwKK1xmQjNkZXMtY2JjXGZQLAorXGZCYmxvd2Zpc2gtY2JjXGZQLAorXGZCcmMzLWNiY1xmUCwKK1xmQmNhc3QxMjgtY2JjXGZQLCBvcgorXGZCbm9uZVxmUC4KK1RoZSBkZWZhdWx0IGlzIFxmQmRlcy1jYmNcZlAuCitUaGUgYWJpbGl0eSB0byBkZWNyeXB0IHBhY2tldHMgaXMgb25seSBwcmVzZW50IGlmIFxmSXRjcGR1bXBcZlAgd2FzIGNvbXBpbGVkCit3aXRoIGNyeXB0b2dyYXBoeSBlbmFibGVkLgorLklQCitcZklzZWNyZXRcZlAgaXMgdGhlIEFTQ0lJIHRleHQgZm9yIEVTUCBzZWNyZXQga2V5LiAKK0lmIHByZWNlZWRlZCBieSAweCwgdGhlbiBhIGhleCB2YWx1ZSB3aWxsIGJlIHJlYWQuCisuSVAKK1RoZSBvcHRpb24gYXNzdW1lcyBSRkMyNDA2IEVTUCwgbm90IFJGQzE4MjcgRVNQLgorVGhlIG9wdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGFuZAordGhlIHVzZSBvZiB0aGlzIG9wdGlvbiB3aXRoIGEgdHJ1ZSBgc2VjcmV0JyBrZXkgaXMgZGlzY291cmFnZWQuCitCeSBwcmVzZW50aW5nIElQc2VjIHNlY3JldCBrZXkgb250byBjb21tYW5kIGxpbmUKK3lvdSBtYWtlIGl0IHZpc2libGUgdG8gb3RoZXJzLCB2aWEKKy5JUiBwcyAoMSkKK2FuZCBvdGhlciBvY2Nhc2lvbnMuCisuSVAKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBzeW50YXgsIHRoZSBzeW50YXggXGZJZmlsZSBuYW1lXGZQIG1heSBiZSB1c2VkCit0byBoYXZlIHRjcGR1bXAgcmVhZCB0aGUgcHJvdmlkZWQgZmlsZSBpbi4gVGhlIGZpbGUgaXMgb3BlbmVkIHVwb24gCityZWNlaXZpbmcgdGhlIGZpcnN0IEVTUCBwYWNrZXQsIHNvIGFueSBzcGVjaWFsIHBlcm1pc3Npb25zIHRoYXQgdGNwZHVtcAorbWF5IGhhdmUgYmVlbiBnaXZlbiBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gZ2l2ZW4gdXAuCisuVFAKKy5CIFwtZgorUHJpbnQgYGZvcmVpZ24nIElQdjQgYWRkcmVzc2VzIG51bWVyaWNhbGx5IHJhdGhlciB0aGFuIHN5bWJvbGljYWxseQorKHRoaXMgb3B0aW9uIGlzIGludGVuZGVkIHRvIGdldCBhcm91bmQgc2VyaW91cyBicmFpbiBkYW1hZ2UgaW4KK1N1bidzIE5JUyBzZXJ2ZXIgXChlbSB1c3VhbGx5IGl0IGhhbmdzIGZvcmV2ZXIgdHJhbnNsYXRpbmcgbm9uLWxvY2FsCitpbnRlcm5ldCBudW1iZXJzKS4KKy5JUAorVGhlIHRlc3QgZm9yIGBmb3JlaWduJyBJUHY0IGFkZHJlc3NlcyBpcyBkb25lIHVzaW5nIHRoZSBJUHY0IGFkZHJlc3MgYW5kCituZXRtYXNrIG9mIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZyBkb25lLiAgSWYgdGhhdAorYWRkcmVzcyBvciBuZXRtYXNrIGFyZSBub3QgYXZhaWxhYmxlLCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZQoraW50ZXJmYWNlIG9uIHdoaWNoIGNhcHR1cmUgaXMgYmVpbmcgZG9uZSBoYXMgbm8gYWRkcmVzcyBvciBuZXRtYXNrIG9yCitiZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4ICJhbnkiIGludGVyZmFjZSwgd2hpY2gKK2NhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCB3b3JrCitjb3JyZWN0bHkuCisuVFAKKy5CIFwtRgorVXNlIFxmSWZpbGVcZlAgYXMgaW5wdXQgZm9yIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbi4KK0FuIGFkZGl0aW9uYWwgZXhwcmVzc2lvbiBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGlnbm9yZWQuCisuVFAKKy5CIFwtaQorTGlzdGVuIG9uIFxmSWludGVyZmFjZVxmUC4KK0lmIHVuc3BlY2lmaWVkLCBcZkl0Y3BkdW1wXGZQIHNlYXJjaGVzIHRoZSBzeXN0ZW0gaW50ZXJmYWNlIGxpc3QgZm9yIHRoZQorbG93ZXN0IG51bWJlcmVkLCBjb25maWd1cmVkIHVwIGludGVyZmFjZSAoZXhjbHVkaW5nIGxvb3BiYWNrKS4KK1RpZXMgYXJlIGJyb2tlbiBieSBjaG9vc2luZyB0aGUgZWFybGllc3QgbWF0Y2guCisuSVAKK09uIExpbnV4IHN5c3RlbXMgd2l0aCAyLjIgb3IgbGF0ZXIga2VybmVscywgYW4KKy5JIGludGVyZmFjZQorYXJndW1lbnQgb2YgYGBhbnknJyBjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHBhY2tldHMgZnJvbSBhbGwgaW50ZXJmYWNlcy4KK05vdGUgdGhhdCBjYXB0dXJlcyBvbiB0aGUgYGBhbnknJyBkZXZpY2Ugd2lsbCBub3QgYmUgZG9uZSBpbiBwcm9taXNjdW91cworbW9kZS4KKy5JUAorSWYgdGhlCisuQiBcLUQKK2ZsYWcgaXMgc3VwcG9ydGVkLCBhbiBpbnRlcmZhY2UgbnVtYmVyIGFzIHByaW50ZWQgYnkgdGhhdCBmbGFnIGNhbiBiZQordXNlZCBhcyB0aGUKKy5JIGludGVyZmFjZQorYXJndW1lbnQuCisuVFAKKy5CIFwtbAorTWFrZSBzdGRvdXQgbGluZSBidWZmZXJlZC4KK1VzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIGRhdGEKK3doaWxlIGNhcHR1cmluZyBpdC4KK0UuZy4sCisuYnIKK2BgdGNwZHVtcFwgXCBcLWxcIFwgfFwgXCB0ZWUgZGF0Jycgb3IKK2BgdGNwZHVtcFwgXCBcLWwgXCBcID4gZGF0XCBcICZcIFwgdGFpbFwgXCBcLWZcIFwgZGF0JycuCisuVFAKKy5CIFwtTAorTGlzdCB0aGUga25vd24gZGF0YSBsaW5rIHR5cGVzIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBleGl0LgorLlRQCisuQiBcLW0KK0xvYWQgU01JIE1JQiBtb2R1bGUgZGVmaW5pdGlvbnMgZnJvbSBmaWxlIFxmSW1vZHVsZVxmUi4KK1RoaXMgb3B0aW9uCitjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzIHRvIGxvYWQgc2V2ZXJhbCBNSUIgbW9kdWxlcyBpbnRvIFxmSXRjcGR1bXBcZlAuCisuVFAKKy5CIFwtTQorVXNlIFxmSXNlY3JldFxmUCBhcyBhIHNoYXJlZCBzZWNyZXQgZm9yIHZhbGlkYXRpbmcgdGhlIGRpZ2VzdHMgZm91bmQgaW4KK1RDUCBzZWdtZW50cyB3aXRoIHRoZSBUQ1AtTUQ1IG9wdGlvbiAoUkZDIDIzODUpLCBpZiBwcmVzZW50LgorLlRQCisuQiBcLW4KK0Rvbid0IGNvbnZlcnQgYWRkcmVzc2VzIChpLmUuLCBob3N0IGFkZHJlc3NlcywgcG9ydCBudW1iZXJzLCBldGMuKSB0byBuYW1lcy4KKy5UUAorLkIgXC1OCitEb24ndCBwcmludCBkb21haW4gbmFtZSBxdWFsaWZpY2F0aW9uIG9mIGhvc3QgbmFtZXMuCitFLmcuLAoraWYgeW91IGdpdmUgdGhpcyBmbGFnIHRoZW4gXGZJdGNwZHVtcFxmUCB3aWxsIHByaW50IGBgbmljJycKK2luc3RlYWQgb2YgYGBuaWMuZGRuLm1pbCcnLgorLlRQCisuQiBcLU8KK0RvIG5vdCBydW4gdGhlIHBhY2tldC1tYXRjaGluZyBjb2RlIG9wdGltaXplci4KK1RoaXMgaXMgdXNlZnVsIG9ubHkKK2lmIHlvdSBzdXNwZWN0IGEgYnVnIGluIHRoZSBvcHRpbWl6ZXIuCisuVFAKKy5CIFwtcAorXGZJRG9uJ3RcZlAgcHV0IHRoZSBpbnRlcmZhY2UKK2ludG8gcHJvbWlzY3VvdXMgbW9kZS4KK05vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIG1pZ2h0IGJlIGluIHByb21pc2N1b3VzCittb2RlIGZvciBzb21lIG90aGVyIHJlYXNvbjsgaGVuY2UsIGAtcCcgY2Fubm90IGJlIHVzZWQgYXMgYW4gYWJicmV2aWF0aW9uIGZvcgorYGV0aGVyIGhvc3Qge2xvY2FsLWh3LWFkZHJ9IG9yIGV0aGVyIGJyb2FkY2FzdCcuCisuVFAKKy5CIFwtcQorUXVpY2sgKHF1aWV0Pykgb3V0cHV0LgorUHJpbnQgbGVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiBzbyBvdXRwdXQKK2xpbmVzIGFyZSBzaG9ydGVyLgorLlRQCisuQiBcLVIKK0Fzc3VtZSBFU1AvQUggcGFja2V0cyB0byBiZSBiYXNlZCBvbiBvbGQgc3BlY2lmaWNhdGlvbiAoUkZDMTgyNSB0byBSRkMxODI5KS4KK0lmIHNwZWNpZmllZCwgXGZJdGNwZHVtcFxmUCB3aWxsIG5vdCBwcmludCByZXBsYXkgcHJldmVudGlvbiBmaWVsZC4KK1NpbmNlIHRoZXJlIGlzIG5vIHByb3RvY29sIHZlcnNpb24gZmllbGQgaW4gRVNQL0FIIHNwZWNpZmljYXRpb24sCitcZkl0Y3BkdW1wXGZQIGNhbm5vdCBkZWR1Y2UgdGhlIHZlcnNpb24gb2YgRVNQL0FIIHByb3RvY29sLgorLlRQCisuQiBcLXIKK1JlYWQgcGFja2V0cyBmcm9tIFxmSWZpbGVcZlIgKHdoaWNoIHdhcyBjcmVhdGVkIHdpdGggdGhlCisuQiBcLXcKK29wdGlvbikuCitTdGFuZGFyZCBpbnB1dCBpcyB1c2VkIGlmIFxmSWZpbGVcZlIgaXMgYGAtJycuCisuVFAKKy5CIFwtUworUHJpbnQgYWJzb2x1dGUsIHJhdGhlciB0aGFuIHJlbGF0aXZlLCBUQ1Agc2VxdWVuY2UgbnVtYmVycy4KKy5UUAorLkIgXC1zCitTbmFyZiBcZklzbmFwbGVuXGZQIGJ5dGVzIG9mIGRhdGEgZnJvbSBlYWNoIHBhY2tldCByYXRoZXIgdGhhbiB0aGUKK2RlZmF1bHQgb2YgNjggKHdpdGggU3VuT1MncyBOSVQsIHRoZSBtaW5pbXVtIGlzIGFjdHVhbGx5IDk2KS4KKzY4IGJ5dGVzIGlzIGFkZXF1YXRlIGZvciBJUCwgSUNNUCwgVENQCithbmQgVURQIGJ1dCBtYXkgdHJ1bmNhdGUgcHJvdG9jb2wgaW5mb3JtYXRpb24gZnJvbSBuYW1lIHNlcnZlciBhbmQgTkZTCitwYWNrZXRzIChzZWUgYmVsb3cpLgorUGFja2V0cyB0cnVuY2F0ZWQgYmVjYXVzZSBvZiBhIGxpbWl0ZWQgc25hcHNob3QKK2FyZSBpbmRpY2F0ZWQgaW4gdGhlIG91dHB1dCB3aXRoIGBgW3xcZklwcm90b1xmUF0nJywgd2hlcmUgXGZJcHJvdG9cZlAKK2lzIHRoZSBuYW1lIG9mIHRoZSBwcm90b2NvbCBsZXZlbCBhdCB3aGljaCB0aGUgdHJ1bmNhdGlvbiBoYXMgb2NjdXJyZWQuCitOb3RlIHRoYXQgdGFraW5nIGxhcmdlciBzbmFwc2hvdHMgYm90aCBpbmNyZWFzZXMKK3RoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byBwcm9jZXNzIHBhY2tldHMgYW5kLCBlZmZlY3RpdmVseSwKK2RlY3JlYXNlcyB0aGUgYW1vdW50IG9mIHBhY2tldCBidWZmZXJpbmcuCitUaGlzIG1heSBjYXVzZSBwYWNrZXRzIHRvIGJlCitsb3N0LgorWW91IHNob3VsZCBsaW1pdCBcZklzbmFwbGVuXGZQIHRvIHRoZSBzbWFsbGVzdCBudW1iZXIgdGhhdCB3aWxsCitjYXB0dXJlIHRoZSBwcm90b2NvbCBpbmZvcm1hdGlvbiB5b3UncmUgaW50ZXJlc3RlZCBpbi4KK1NldHRpbmcKK1xmSXNuYXBsZW5cZlAgdG8gMCBtZWFucyB1c2UgdGhlIHJlcXVpcmVkIGxlbmd0aCB0byBjYXRjaCB3aG9sZSBwYWNrZXRzLgorLlRQCisuQiBcLVQKK0ZvcmNlIHBhY2tldHMgc2VsZWN0ZWQgYnkgIlxmSWV4cHJlc3Npb25cZlAiIHRvIGJlIGludGVycHJldGVkIHRoZQorc3BlY2lmaWVkIFxmSXR5cGVcZlIuCitDdXJyZW50bHkga25vd24gdHlwZXMgYXJlCitcZkJhb2R2XGZSIChBZC1ob2MgT24tZGVtYW5kIERpc3RhbmNlIFZlY3RvciBwcm90b2NvbCksCitcZkJjbmZwXGZSIChDaXNjbyBOZXRGbG93IHByb3RvY29sKSwKK1xmQnJwY1xmUiAoUmVtb3RlIFByb2NlZHVyZSBDYWxsKSwKK1xmQnJ0cFxmUiAoUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBwcm90b2NvbCksCitcZkJydGNwXGZSIChSZWFsLVRpbWUgQXBwbGljYXRpb25zIGNvbnRyb2wgcHJvdG9jb2wpLAorXGZCc25tcFxmUiAoU2ltcGxlIE5ldHdvcmsgTWFuYWdlbWVudCBQcm90b2NvbCksCitcZkJ0ZnRwXGZSIChUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wpLAorXGZCdmF0XGZSIChWaXN1YWwgQXVkaW8gVG9vbCksCithbmQKK1xmQndiXGZSIChkaXN0cmlidXRlZCBXaGl0ZSBCb2FyZCkuCisuVFAKKy5CIFwtdAorXGZJRG9uJ3RcZlAgcHJpbnQgYSB0aW1lc3RhbXAgb24gZWFjaCBkdW1wIGxpbmUuCisuVFAKKy5CIFwtdHQKK1ByaW50IGFuIHVuZm9ybWF0dGVkIHRpbWVzdGFtcCBvbiBlYWNoIGR1bXAgbGluZS4KKy5UUAorLkIgXC10dHQKK1ByaW50IGEgZGVsdGEgKGluIG1pY3JvLXNlY29uZHMpIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMgbGluZQorb24gZWFjaCBkdW1wIGxpbmUuCisuVFAKKy5CIFwtdHR0dAorUHJpbnQgYSB0aW1lc3RhbXAgaW4gZGVmYXVsdCBmb3JtYXQgcHJvY2VlZGVkIGJ5IGRhdGUgb24gZWFjaCBkdW1wIGxpbmUuCisuVFAKKy5CIFwtdQorUHJpbnQgdW5kZWNvZGVkIE5GUyBoYW5kbGVzLgorLlRQCisuQiBcLVUKK01ha2Ugb3V0cHV0IHNhdmVkIHZpYSB0aGUKKy5CIFwtdworb3B0aW9uIGBgcGFja2V0LWJ1ZmZlcmVkJyc7IGkuZS4sIGFzIGVhY2ggcGFja2V0IGlzIHNhdmVkLCBpdCB3aWxsIGJlCit3cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZSwgcmF0aGVyIHRoYW4gYmVpbmcgd3JpdHRlbiBvbmx5IHdoZW4gdGhlCitvdXRwdXQgYnVmZmVyIGZpbGxzLgorLklQCitUaGUKKy5CIFwtVQorZmxhZyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaWYKKy5JIHRjcGR1bXAKK3dhcyBidWlsdCB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YKKy5JIGxpYnBjYXAKK3RoYXQgbGFja3MgdGhlCisuQiBwY2FwX2R1bXBfZmx1c2goKQorZnVuY3Rpb24uCisuVFAKKy5CIFwtdgorV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywgcHJvZHVjZSAoc2xpZ2h0bHkgbW9yZSkgdmVyYm9zZSBvdXRwdXQuCitGb3IgZXhhbXBsZSwgdGhlIHRpbWUgdG8gbGl2ZSwKK2lkZW50aWZpY2F0aW9uLCB0b3RhbCBsZW5ndGggYW5kIG9wdGlvbnMgaW4gYW4gSVAgcGFja2V0IGFyZSBwcmludGVkLgorQWxzbyBlbmFibGVzIGFkZGl0aW9uYWwgcGFja2V0IGludGVncml0eSBjaGVja3Mgc3VjaCBhcyB2ZXJpZnlpbmcgdGhlCitJUCBhbmQgSUNNUCBoZWFkZXIgY2hlY2tzdW0uCisuSVAKK1doZW4gd3JpdGluZyB0byBhIGZpbGUgd2l0aCB0aGUKKy5CIFwtdworb3B0aW9uLCByZXBvcnQsIGV2ZXJ5IDEwIHNlY29uZHMsIHRoZSBudW1iZXIgb2YgcGFja2V0cyBjYXB0dXJlZC4KKy5UUAorLkIgXC12dgorRXZlbiBtb3JlIHZlcmJvc2Ugb3V0cHV0LgorRm9yIGV4YW1wbGUsIGFkZGl0aW9uYWwgZmllbGRzIGFyZQorcHJpbnRlZCBmcm9tIE5GUyByZXBseSBwYWNrZXRzLCBhbmQgU01CIHBhY2tldHMgYXJlIGZ1bGx5IGRlY29kZWQuCisuVFAKKy5CIFwtdnZ2CitFdmVuIG1vcmUgdmVyYm9zZSBvdXRwdXQuCitGb3IgZXhhbXBsZSwKK3RlbG5ldCBcZkJTQlxmUCAuLi4gXGZCU0VcZlAgb3B0aW9ucworYXJlIHByaW50ZWQgaW4gZnVsbC4KK1dpdGgKKy5CIFwtWAorVGVsbmV0IG9wdGlvbnMgYXJlIHByaW50ZWQgaW4gaGV4IGFzIHdlbGwuCisuVFAKKy5CIFwtdworV3JpdGUgdGhlIHJhdyBwYWNrZXRzIHRvIFxmSWZpbGVcZlIgcmF0aGVyIHRoYW4gcGFyc2luZyBhbmQgcHJpbnRpbmcKK3RoZW0gb3V0LgorVGhleSBjYW4gbGF0ZXIgYmUgcHJpbnRlZCB3aXRoIHRoZSBcLXIgb3B0aW9uLgorU3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgaWYgXGZJZmlsZVxmUiBpcyBgYC0nJy4KKy5UUAorLkIgXC1XCitVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIAorLkIgXC1DIAorb3B0aW9uLCB0aGlzIHdpbGwgbGltaXQgdGhlIG51bWJlcgorb2YgZmlsZXMgY3JlYXRlZCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciwgYW5kIGJlZ2luIG92ZXJ3cml0aW5nIGZpbGVzCitmcm9tIHRoZSBiZWdpbm5pbmcsIHRodXMgY3JlYXRpbmcgYSAncm90YXRpbmcnIGJ1ZmZlci4gCitJbiBhZGRpdGlvbiwgaXQgd2lsbCBuYW1lCit0aGUgZmlsZXMgd2l0aCBlbm91Z2ggbGVhZGluZyAwcyB0byBzdXBwb3J0IHRoZSBtYXhpbXVtIG51bWJlciBvZgorZmlsZXMsIGFsbG93aW5nIHRoZW0gdG8gc29ydCBjb3JyZWN0bHkuCisuVFAKKy5CIFwteAorV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywKK2luIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZSBoZWFkZXJzIG9mIGVhY2ggcGFja2V0LCBwcmludCB0aGUgZGF0YSBvZgorZWFjaCBwYWNrZXQgKG1pbnVzIGl0cyBsaW5rIGxldmVsIGhlYWRlcikgaW4gaGV4LiAKK1RoZSBzbWFsbGVyIG9mIHRoZSBlbnRpcmUgcGFja2V0IG9yCisuSSBzbmFwbGVuCitieXRlcyB3aWxsIGJlIHByaW50ZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZW50aXJlIGxpbmstbGF5ZXIKK3BhY2tldCwgc28gZm9yIGxpbmsgbGF5ZXJzIHRoYXQgcGFkIChlLmcuIEV0aGVybmV0KSwgdGhlIHBhZGRpbmcgYnl0ZXMKK3dpbGwgYWxzbyBiZSBwcmludGVkIHdoZW4gdGhlIGhpZ2hlciBsYXllciBwYWNrZXQgaXMgc2hvcnRlciB0aGFuIHRoZQorcmVxdWlyZWQgcGFkZGluZy4KKy5UUAorLkIgXC14eAorV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywKK2luIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZSBoZWFkZXJzIG9mIGVhY2ggcGFja2V0LCBwcmludCB0aGUgZGF0YSBvZgorZWFjaCBwYWNrZXQsCisuSSBpbmNsdWRpbmcKK2l0cyBsaW5rIGxldmVsIGhlYWRlciwgaW4gaGV4LgorLlRQCisuQiBcLVgKK1doZW4gcGFyc2luZyBhbmQgcHJpbnRpbmcsCitpbiBhZGRpdGlvbiB0byBwcmludGluZyB0aGUgaGVhZGVycyBvZiBlYWNoIHBhY2tldCwgcHJpbnQgdGhlIGRhdGEgb2YKK2VhY2ggcGFja2V0IChtaW51cyBpdHMgbGluayBsZXZlbCBoZWFkZXIpIGluIGhleCBhbmQgQVNDSUkuCitUaGlzIGlzIHZlcnkgaGFuZHkgZm9yIGFuYWx5c2luZyBuZXcgcHJvdG9jb2xzLgorLlRQCisuQiBcLVhYCitXaGVuIHBhcnNpbmcgYW5kIHByaW50aW5nLAoraW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgdGhlIGhlYWRlcnMgb2YgZWFjaCBwYWNrZXQsIHByaW50IHRoZSBkYXRhIG9mCitlYWNoIHBhY2tldCwKKy5JIGluY2x1ZGluZworaXRzIGxpbmsgbGV2ZWwgaGVhZGVyLCBpbiBoZXggYW5kIEFTQ0lJLgorLlRQCisuQiBcLXkKK1NldCB0aGUgZGF0YSBsaW5rIHR5cGUgdG8gdXNlIHdoaWxlIGNhcHR1cmluZyBwYWNrZXRzIHRvIFxmSWRhdGFsaW5rdHlwZVxmUC4KKy5UUAorLkIgXC1aCitEcm9wcyBwcml2aWxlZ2VzIChpZiByb290KSBhbmQgY2hhbmdlcyB1c2VyIElEIHRvCisuSSB1c2VyCithbmQgdGhlIGdyb3VwIElEIHRvIHRoZSBwcmltYXJ5IGdyb3VwIG9mCisuSVIgdXNlciAuCisuSVAKK1RoaXMgYmVoYXZpb3IgY2FuIGFsc28gYmUgZW5hYmxlZCBieSBkZWZhdWx0IGF0IGNvbXBpbGUgdGltZS4KKy5JUCAiXGZJIGV4cHJlc3Npb25cZlAiCisuUlMKK3NlbGVjdHMgd2hpY2ggcGFja2V0cyB3aWxsIGJlIGR1bXBlZC4KK0lmIG5vIFxmSWV4cHJlc3Npb25cZlAKK2lzIGdpdmVuLCBhbGwgcGFja2V0cyBvbiB0aGUgbmV0IHdpbGwgYmUgZHVtcGVkLgorT3RoZXJ3aXNlLAorb25seSBwYWNrZXRzIGZvciB3aGljaCBcZklleHByZXNzaW9uXGZQIGlzIGB0cnVlJyB3aWxsIGJlIGR1bXBlZC4KKy5MUAorVGhlIFxmSWV4cHJlc3Npb25cZlAgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUKKy5JIHByaW1pdGl2ZXMuCitQcmltaXRpdmVzIHVzdWFsbHkgY29uc2lzdCBvZiBhbgorLkkgaWQKKyhuYW1lIG9yIG51bWJlcikgcHJlY2VkZWQgYnkgb25lIG9yIG1vcmUgcXVhbGlmaWVycy4KK1RoZXJlIGFyZSB0aHJlZQorZGlmZmVyZW50IGtpbmRzIG9mIHF1YWxpZmllcjoKKy5JUCBcZkl0eXBlXGZQCitxdWFsaWZpZXJzIHNheSB3aGF0IGtpbmQgb2YgdGhpbmcgdGhlIGlkIG5hbWUgb3IgbnVtYmVyIHJlZmVycyB0by4KK1Bvc3NpYmxlIHR5cGVzIGFyZQorLkJSIGhvc3QgLAorLkIgbmV0ICwKKy5CIHBvcnQKK2FuZAorLkJSIHBvcnRyYW5nZSAuCitFLmcuLCBgaG9zdCBmb28nLCBgbmV0IDEyOC4zJywgYHBvcnQgMjAnLCBgcG9ydHJhbmdlIDYwMDAtNjAwOCcuCitJZiB0aGVyZSBpcyBubyB0eXBlCitxdWFsaWZpZXIsCisuQiBob3N0CitpcyBhc3N1bWVkLgorLklQIFxmSWRpclxmUAorcXVhbGlmaWVycyBzcGVjaWZ5IGEgcGFydGljdWxhciB0cmFuc2ZlciBkaXJlY3Rpb24gdG8gYW5kL29yIGZyb20KKy5JUiBpZCAuCitQb3NzaWJsZSBkaXJlY3Rpb25zIGFyZQorLkJSIHNyYyAsCisuQlIgZHN0ICwKKy5CICJzcmMgb3IgZHN0IgorYW5kCisuQiAic3JjIGFuZCIKKy5CUiBkc3QgLgorRS5nLiwgYHNyYyBmb28nLCBgZHN0IG5ldCAxMjguMycsIGBzcmMgb3IgZHN0IHBvcnQgZnRwLWRhdGEnLgorSWYKK3RoZXJlIGlzIG5vIGRpciBxdWFsaWZpZXIsCisuQiAic3JjIG9yIGRzdCIKK2lzIGFzc3VtZWQuCitGb3Igc29tZSBsaW5rIGxheWVycywgc3VjaCBhcyBTTElQIGFuZCB0aGUgYGBjb29rZWQnJyBMaW51eCBjYXB0dXJlIG1vZGUKK3VzZWQgZm9yIHRoZSBgYGFueScnIGRldmljZSBhbmQgZm9yIHNvbWUgb3RoZXIgZGV2aWNlIHR5cGVzLCB0aGUKKy5CIGluYm91bmQKK2FuZAorLkIgb3V0Ym91bmQKK3F1YWxpZmllcnMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRlc2lyZWQgZGlyZWN0aW9uLgorLklQIFxmSXByb3RvXGZQCitxdWFsaWZpZXJzIHJlc3RyaWN0IHRoZSBtYXRjaCB0byBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuCitQb3NzaWJsZQorcHJvdG9zIGFyZToKKy5CUiBldGhlciAsCisuQlIgZmRkaSAsCisuQlIgdHIgLAorLkJSIHdsYW4gLAorLkJSIGlwICwKKy5CUiBpcDYgLAorLkJSIGFycCAsCisuQlIgcmFycCAsCisuQlIgZGVjbmV0ICwKKy5CIHRjcAorYW5kCisuQlIgdWRwIC4KK0UuZy4sIGBldGhlciBzcmMgZm9vJywgYGFycCBuZXQgMTI4LjMnLCBgdGNwIHBvcnQgMjEnLCBgdWRwIHBvcnRyYW5nZQorNzAwMC03MDA5Jy4KK0lmIHRoZXJlIGlzCitubyBwcm90byBxdWFsaWZpZXIsIGFsbCBwcm90b2NvbHMgY29uc2lzdGVudCB3aXRoIHRoZSB0eXBlIGFyZQorYXNzdW1lZC4KK0UuZy4sIGBzcmMgZm9vJyBtZWFucyBgKGlwIG9yIGFycCBvciByYXJwKSBzcmMgZm9vJworKGV4Y2VwdCB0aGUgbGF0dGVyIGlzIG5vdCBsZWdhbCBzeW50YXgpLCBgbmV0IGJhcicgbWVhbnMgYChpcCBvcgorYXJwIG9yIHJhcnApIG5ldCBiYXInIGFuZCBgcG9ydCA1MycgbWVhbnMgYCh0Y3Agb3IgdWRwKSBwb3J0IDUzJy4KKy5MUAorW2BmZGRpJyBpcyBhY3R1YWxseSBhbiBhbGlhcyBmb3IgYGV0aGVyJzsgdGhlIHBhcnNlciB0cmVhdHMgdGhlbQoraWRlbnRpY2FsbHkgYXMgbWVhbmluZyBgYHRoZSBkYXRhIGxpbmsgbGV2ZWwgdXNlZCBvbiB0aGUgc3BlY2lmaWVkCituZXR3b3JrIGludGVyZmFjZS4nJyAgRkRESSBoZWFkZXJzIGNvbnRhaW4gRXRoZXJuZXQtbGlrZSBzb3VyY2UKK2FuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIGFuZCBvZnRlbiBjb250YWluIEV0aGVybmV0LWxpa2UgcGFja2V0Cit0eXBlcywgc28geW91IGNhbiBmaWx0ZXIgb24gdGhlc2UgRkRESSBmaWVsZHMganVzdCBhcyB3aXRoIHRoZQorYW5hbG9nb3VzIEV0aGVybmV0IGZpZWxkcy4KK0ZEREkgaGVhZGVycyBhbHNvIGNvbnRhaW4gb3RoZXIgZmllbGRzLAorYnV0IHlvdSBjYW5ub3QgbmFtZSB0aGVtIGV4cGxpY2l0bHkgaW4gYSBmaWx0ZXIgZXhwcmVzc2lvbi4KKy5MUAorU2ltaWxhcmx5LCBgdHInIGFuZCBgd2xhbicgYXJlIGFsaWFzZXMgZm9yIGBldGhlcic7IHRoZSBwcmV2aW91cworcGFyYWdyYXBoJ3Mgc3RhdGVtZW50cyBhYm91dCBGRERJIGhlYWRlcnMgYWxzbyBhcHBseSB0byBUb2tlbiBSaW5nCithbmQgODAyLjExIHdpcmVsZXNzIExBTiBoZWFkZXJzLiAgRm9yIDgwMi4xMSBoZWFkZXJzLCB0aGUgZGVzdGluYXRpb24KK2FkZHJlc3MgaXMgdGhlIERBIGZpZWxkIGFuZCB0aGUgc291cmNlIGFkZHJlc3MgaXMgdGhlIFNBIGZpZWxkOyB0aGUKK0JTU0lELCBSQSwgYW5kIFRBIGZpZWxkcyBhcmVuJ3QgdGVzdGVkLl0KKy5MUAorSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIGBwcmltaXRpdmUnIGtleXdvcmRzCit0aGF0IGRvbid0IGZvbGxvdyB0aGUgcGF0dGVybjoKKy5CUiBnYXRld2F5ICwKKy5CUiBicm9hZGNhc3QgLAorLkJSIGxlc3MgLAorLkIgZ3JlYXRlcgorYW5kIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuCitBbGwgb2YgdGhlc2UgYXJlIGRlc2NyaWJlZCBiZWxvdy4KKy5MUAorTW9yZSBjb21wbGV4IGZpbHRlciBleHByZXNzaW9ucyBhcmUgYnVpbHQgdXAgYnkgdXNpbmcgdGhlIHdvcmRzCisuQlIgYW5kICwKKy5CIG9yCithbmQKKy5CIG5vdAordG8gY29tYmluZSBwcmltaXRpdmVzLgorRS5nLiwgYGhvc3QgZm9vIGFuZCBub3QgcG9ydCBmdHAgYW5kIG5vdCBwb3J0IGZ0cC1kYXRhJy4KK1RvIHNhdmUgdHlwaW5nLCBpZGVudGljYWwgcXVhbGlmaWVyIGxpc3RzIGNhbiBiZSBvbWl0dGVkLgorRS5nLiwKK2B0Y3AgZHN0IHBvcnQgZnRwIG9yIGZ0cC1kYXRhIG9yIGRvbWFpbicgaXMgZXhhY3RseSB0aGUgc2FtZSBhcworYHRjcCBkc3QgcG9ydCBmdHAgb3IgdGNwIGRzdCBwb3J0IGZ0cC1kYXRhIG9yIHRjcCBkc3QgcG9ydCBkb21haW4nLgorLkxQCitBbGxvd2FibGUgcHJpbWl0aXZlcyBhcmU6CisuSVAgIlxmQmRzdCBob3N0IFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IGRlc3RpbmF0aW9uIGZpZWxkIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUCwKK3doaWNoIG1heSBiZSBlaXRoZXIgYW4gYWRkcmVzcyBvciBhIG5hbWUuCisuSVAgIlxmQnNyYyBob3N0IFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IHNvdXJjZSBmaWVsZCBvZiB0aGUgcGFja2V0IGlzIFxmSWhvc3RcZlAuCisuSVAgIlxmQmhvc3QgXGZJaG9zdFxmUAorVHJ1ZSBpZiBlaXRoZXIgdGhlIElQdjQvdjYgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUC4KKy5JUAorQW55IG9mIHRoZSBhYm92ZSBob3N0IGV4cHJlc3Npb25zIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCB0aGUga2V5d29yZHMsCitcZkJpcFxmUCwgXGZCYXJwXGZQLCBcZkJyYXJwXGZQLCBvciBcZkJpcDZcZlAgYXMgaW46CisuaW4gKy41aQorLm5mCitcZkJpcCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIGlzIGVxdWl2YWxlbnQgdG86CisuaW4gKy41aQorLm5mCitcZkJldGhlciBwcm90byBcZklcXGlwXGZCIGFuZCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK0lmIFxmSWhvc3RcZlIgaXMgYSBuYW1lIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBlYWNoIGFkZHJlc3Mgd2lsbAorYmUgY2hlY2tlZCBmb3IgYSBtYXRjaC4KKy5JUCAiXGZCZXRoZXIgZHN0IFxmSWVob3N0XGZQCitUcnVlIGlmIHRoZSBFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgorXGZJRWhvc3RcZlAKK21heSBiZSBlaXRoZXIgYSBuYW1lIGZyb20gL2V0Yy9ldGhlcnMgb3IgYSBudW1iZXIgKHNlZQorLklSIGV0aGVycyAoM04pCitmb3IgbnVtZXJpYyBmb3JtYXQpLgorLklQICJcZkJldGhlciBzcmMgXGZJZWhvc3RcZlAKK1RydWUgaWYgdGhlIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgorLklQICJcZkJldGhlciBob3N0IFxmSWVob3N0XGZQCitUcnVlIGlmIGVpdGhlciB0aGUgRXRoZXJuZXQgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgXGZJZWhvc3RcZlAuCisuSVAgIlxmQmdhdGV3YXlcZlAgXGZJaG9zdFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IHVzZWQgXGZJaG9zdFxmUCBhcyBhIGdhdGV3YXkuCitJLmUuLCB0aGUgRXRoZXJuZXQKK3NvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIHdhcyBcZklob3N0XGZQIGJ1dCBuZWl0aGVyIHRoZSBJUCBzb3VyY2UKK25vciB0aGUgSVAgZGVzdGluYXRpb24gd2FzIFxmSWhvc3RcZlAuCitcZklIb3N0XGZQIG11c3QgYmUgYSBuYW1lIGFuZAorbXVzdCBiZSBmb3VuZCBib3RoIGJ5IHRoZSBtYWNoaW5lJ3MgaG9zdC1uYW1lLXRvLUlQLWFkZHJlc3MgcmVzb2x1dGlvbgorbWVjaGFuaXNtcyAoaG9zdCBuYW1lIGZpbGUsIEROUywgTklTLCBldGMuKSBhbmQgYnkgdGhlIG1hY2hpbmUncworaG9zdC1uYW1lLXRvLUV0aGVybmV0LWFkZHJlc3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gKC9ldGMvZXRoZXJzLCBldGMuKS4KKyhBbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gaXMKKy5pbiArLjVpCisubmYKK1xmQmV0aGVyIGhvc3QgXGZJZWhvc3QgXGZCYW5kIG5vdCBob3N0IFxmSWhvc3RcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIG5hbWVzIG9yIG51bWJlcnMgZm9yIFxmSWhvc3QgLyBlaG9zdFxmUC4pCitUaGlzIHN5bnRheCBkb2VzIG5vdCB3b3JrIGluIElQdjYtZW5hYmxlZCBjb25maWd1cmF0aW9uIGF0IHRoaXMgbW9tZW50LgorLklQICJcZkJkc3QgbmV0IFxmSW5ldFxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCitcZklOZXRcZlAgbWF5IGJlIGVpdGhlciBhIG5hbWUgZnJvbSB0aGUgbmV0d29ya3MgZGF0YWJhc2UKKygvZXRjL25ldHdvcmtzLCBldGMuKSBvciBhIG5ldHdvcmsgbnVtYmVyLgorQW4gSVB2NCBuZXR3b3JrIG51bWJlciBjYW4gYmUgd3JpdHRlbiBhcyBhIGRvdHRlZCBxdWFkIChlLmcuLCAxOTIuMTY4LjEuMCksCitkb3R0ZWQgdHJpcGxlIChlLmcuLCAxOTIuMTY4LjEpLCBkb3R0ZWQgcGFpciAoZS5nLCAxNzIuMTYpLCBvciBzaW5nbGUKK251bWJlciAoZS5nLiwgMTApOyB0aGUgbmV0bWFzayBpcyAyNTUuMjU1LjI1NS4yNTUgZm9yIGEgZG90dGVkIHF1YWQKKyh3aGljaCBtZWFucyB0aGF0IGl0J3MgcmVhbGx5IGEgaG9zdCBtYXRjaCksIDI1NS4yNTUuMjU1LjAgZm9yIGEgZG90dGVkCit0cmlwbGUsIDI1NS4yNTUuMC4wIGZvciBhIGRvdHRlZCBwYWlyLCBvciAyNTUuMC4wLjAgZm9yIGEgc2luZ2xlIG51bWJlci4KK0FuIElQdjYgbmV0d29yayBudW1iZXIgbXVzdCBiZSB3cml0dGVuIG91dCBmdWxseTsgdGhlIG5ldG1hc2sgaXMKK2ZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmLCBzbyBJUHY2ICJuZXR3b3JrIiBtYXRjaGVzIGFyZSByZWFsbHkgYWx3YXlzCitob3N0IG1hdGNoZXMsIGFuZCBhIG5ldHdvcmsgbWF0Y2ggcmVxdWlyZXMgYSBuZXRtYXNrIGxlbmd0aC4KKy5JUCAiXGZCc3JjIG5ldCBcZkluZXRcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yaworbnVtYmVyIG9mIFxmSW5ldFxmUC4KKy5JUCAiXGZCbmV0IFxmSW5ldFxmUiIKK1RydWUgaWYgZWl0aGVyIHRoZSBJUHY0L3Y2IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yaworbnVtYmVyIG9mIFxmSW5ldFxmUC4KKy5JUCAiXGZCbmV0IFxmSW5ldFxmUiBcZkJtYXNrIFxmSW5ldG1hc2tcZlIiCitUcnVlIGlmIHRoZSBJUHY0IGFkZHJlc3MgbWF0Y2hlcyBcZkluZXRcZlIgd2l0aCB0aGUgc3BlY2lmaWMgXGZJbmV0bWFza1xmUi4KK01heSBiZSBxdWFsaWZpZWQgd2l0aCBcZkJzcmNcZlIgb3IgXGZCZHN0XGZSLgorTm90ZSB0aGF0IHRoaXMgc3ludGF4IGlzIG5vdCB2YWxpZCBmb3IgSVB2NiBcZkluZXRcZlIuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIvXGZJbGVuXGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBhZGRyZXNzIG1hdGNoZXMgXGZJbmV0XGZSIHdpdGggYSBuZXRtYXNrIFxmSWxlblxmUgorYml0cyB3aWRlLgorTWF5IGJlIHF1YWxpZmllZCB3aXRoIFxmQnNyY1xmUiBvciBcZkJkc3RcZlIuCisuSVAgIlxmQmRzdCBwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgaXAvdGNwLCBpcC91ZHAsIGlwNi90Y3Agb3IgaXA2L3VkcCBhbmQgaGFzIGEKK2Rlc3RpbmF0aW9uIHBvcnQgdmFsdWUgb2YgXGZJcG9ydFxmUC4KK1RoZSBcZklwb3J0XGZQIGNhbiBiZSBhIG51bWJlciBvciBhIG5hbWUgdXNlZCBpbiAvZXRjL3NlcnZpY2VzIChzZWUKKy5JUiB0Y3AgKDRQKQorYW5kCisuSVIgdWRwICg0UCkpLgorSWYgYSBuYW1lIGlzIHVzZWQsIGJvdGggdGhlIHBvcnQKK251bWJlciBhbmQgcHJvdG9jb2wgYXJlIGNoZWNrZWQuCitJZiBhIG51bWJlciBvciBhbWJpZ3VvdXMgbmFtZSBpcyB1c2VkLAorb25seSB0aGUgcG9ydCBudW1iZXIgaXMgY2hlY2tlZCAoZS5nLiwgXGZCZHN0IHBvcnQgNTEzXGZSIHdpbGwgcHJpbnQgYm90aAordGNwL2xvZ2luIHRyYWZmaWMgYW5kIHVkcC93aG8gdHJhZmZpYywgYW5kIFxmQnBvcnQgZG9tYWluXGZSIHdpbGwgcHJpbnQKK2JvdGggdGNwL2RvbWFpbiBhbmQgdWRwL2RvbWFpbiB0cmFmZmljKS4KKy5JUCAiXGZCc3JjIHBvcnQgXGZJcG9ydFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBzb3VyY2UgcG9ydCB2YWx1ZSBvZiBcZklwb3J0XGZQLgorLklQICJcZkJwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvcnQgb2YgdGhlIHBhY2tldCBpcyBcZklwb3J0XGZQLgorLklQICJcZkJkc3QgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGlwL3RjcCwgaXAvdWRwLCBpcDYvdGNwIG9yIGlwNi91ZHAgYW5kIGhhcyBhCitkZXN0aW5hdGlvbiBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgorLkkgcG9ydDEKK2FuZAorLkkgcG9ydDIKK2FyZSBpbnRlcnByZXRlZCBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIHRoZQorLkkgcG9ydAorcGFyYW1ldGVyIGZvcgorLkJSIHBvcnQgLgorLklQICJcZkJzcmMgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIHNvdXJjZSBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kCitcZklwb3J0MlxmUC4KKy5JUCAiXGZCcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgaXMgYmV0d2VlbgorXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgorLklQCitBbnkgb2YgdGhlIGFib3ZlIHBvcnQgb3IgcG9ydCByYW5nZSBleHByZXNzaW9ucyBjYW4gYmUgcHJlcGVuZGVkIHdpdGgKK3RoZSBrZXl3b3JkcywgXGZCdGNwXGZQIG9yIFxmQnVkcFxmUCwgYXMgaW46CisuaW4gKy41aQorLm5mCitcZkJ0Y3Agc3JjIHBvcnQgXGZJcG9ydFxmUgorLmZpCisuaW4gLS41aQord2hpY2ggbWF0Y2hlcyBvbmx5IHRjcCBwYWNrZXRzIHdob3NlIHNvdXJjZSBwb3J0IGlzIFxmSXBvcnRcZlAuCisuSVAgIlxmQmxlc3MgXGZJbGVuZ3RoXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXGZJbGVuZ3RoXGZQLgorVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorLmluICsuNWkKKy5uZgorXGZCbGVuIDw9IFxmSWxlbmd0aFxmUC4KKy5maQorLmluIC0uNWkKKy5JUCAiXGZCZ3JlYXRlciBcZklsZW5ndGhcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaGFzIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcZklsZW5ndGhcZlAuCitUaGlzIGlzIGVxdWl2YWxlbnQgdG86CisuaW4gKy41aQorLm5mCitcZkJsZW4gPj0gXGZJbGVuZ3RoXGZQLgorLmZpCisuaW4gLS41aQorLklQICJcZkJpcCBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY0IHBhY2tldCAoc2VlCisuSVIgaXAgKDRQKSkKK29mIHByb3RvY29sIHR5cGUgXGZJcHJvdG9jb2xcZlAuCitcZklQcm90b2NvbFxmUCBjYW4gYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBuYW1lcworXGZCaWNtcFxmUCwgXGZCaWNtcDZcZlAsIFxmQmlnbXBcZlAsIFxmQmlncnBcZlAsIFxmQnBpbVxmUCwgXGZCYWhcZlAsCitcZkJlc3BcZlAsIFxmQnZycnBcZlAsIFxmQnVkcFxmUCwgb3IgXGZCdGNwXGZQLgorTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVycyBcZkJ0Y3BcZlAsIFxmQnVkcFxmUCwgYW5kIFxmQmljbXBcZlAgYXJlIGFsc28KK2tleXdvcmRzIGFuZCBtdXN0IGJlIGVzY2FwZWQgdmlhIGJhY2tzbGFzaCAoXFwpLCB3aGljaCBpcyBcXFxcIGluIHRoZSBDLXNoZWxsLgorTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCisuSVAgIlxmQmlwNiBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IHBhY2tldCBvZiBwcm90b2NvbCB0eXBlIFxmSXByb3RvY29sXGZQLgorTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCisuSVAgIlxmQmlwNiBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIElQdjYgcGFja2V0LAorYW5kIGNvbnRhaW5zIHByb3RvY29sIGhlYWRlciB3aXRoIHR5cGUgXGZJcHJvdG9jb2xcZlIKK2luIGl0cyBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCitGb3IgZXhhbXBsZSwKKy5pbiArLjVpCisubmYKK1xmQmlwNiBwcm90b2NoYWluIDZcZlIKKy5maQorLmluIC0uNWkKK21hdGNoZXMgYW55IElQdjYgcGFja2V0IHdpdGggVENQIHByb3RvY29sIGhlYWRlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorVGhlIHBhY2tldCBtYXkgY29udGFpbiwgZm9yIGV4YW1wbGUsCithdXRoZW50aWNhdGlvbiBoZWFkZXIsIHJvdXRpbmcgaGVhZGVyLCBvciBob3AtYnktaG9wIG9wdGlvbiBoZWFkZXIsCitiZXR3ZWVuIElQdjYgaGVhZGVyIGFuZCBUQ1AgaGVhZGVyLgorVGhlIEJQRiBjb2RlIGVtaXR0ZWQgYnkgdGhpcyBwcmltaXRpdmUgaXMgY29tcGxleCBhbmQKK2Nhbm5vdCBiZSBvcHRpbWl6ZWQgYnkgQlBGIG9wdGltaXplciBjb2RlIGluIFxmSXRjcGR1bXBcZlAsCitzbyB0aGlzIGNhbiBiZSBzb21ld2hhdCBzbG93LgorLklQICJcZkJpcCBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorRXF1aXZhbGVudCB0byBcZkJpcDYgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiwgYnV0IHRoaXMgaXMgZm9yIElQdjQuCisuSVAgIlxmQmV0aGVyIGJyb2FkY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBicm9hZGNhc3QgcGFja2V0LgorVGhlIFxmSWV0aGVyXGZQCitrZXl3b3JkIGlzIG9wdGlvbmFsLgorLklQICJcZkJpcCBicm9hZGNhc3RcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBicm9hZGNhc3QgcGFja2V0LgorSXQgY2hlY2tzIGZvciBib3RoIHRoZSBhbGwtemVyb2VzIGFuZCBhbGwtb25lcyBicm9hZGNhc3QgY29udmVudGlvbnMsCithbmQgbG9va3MgdXAgdGhlIHN1Ym5ldCBtYXNrIG9uIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMKK2JlaW5nIGRvbmUuCisuSVAKK0lmIHRoZSBzdWJuZXQgbWFzayBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUKK2lzIG5vdCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZworZG9uZSBoYXMgbm8gbmV0bWFzayBvciBiZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4CisiYW55IiBpbnRlcmZhY2UsIHdoaWNoIGNhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzCitjaGVjayB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4KKy5JUCAiXGZCZXRoZXIgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEV0aGVybmV0IG11bHRpY2FzdCBwYWNrZXQuCitUaGUgXGZCZXRoZXJcZlAKK2tleXdvcmQgaXMgb3B0aW9uYWwuCitUaGlzIGlzIHNob3J0aGFuZCBmb3IgYFxmQmV0aGVyWzBdICYgMSAhPSAwXGZQJy4KKy5JUCAiXGZCaXAgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgbXVsdGljYXN0IHBhY2tldC4KKy5JUCAiXGZCaXA2IG11bHRpY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IG11bHRpY2FzdCBwYWNrZXQuCisuSVAgICJcZkJldGhlciBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBvZiBldGhlciB0eXBlIFxmSXByb3RvY29sXGZSLgorXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKK1xmQmlwXGZQLCBcZkJpcDZcZlAsIFxmQmFycFxmUCwgXGZCcmFycFxmUCwgXGZCYXRhbGtcZlAsIFxmQmFhcnBcZlAsCitcZkJkZWNuZXRcZlAsIFxmQnNjYVxmUCwgXGZCbGF0XGZQLCBcZkJtb3BkbFxmUCwgXGZCbW9wcmNcZlAsCitcZkJpc29cZlAsIFxmQnN0cFxmUCwgXGZCaXB4XGZQLCBvciBcZkJuZXRiZXVpXGZQLgorTm90ZSB0aGVzZSBpZGVudGlmaWVycyBhcmUgYWxzbyBrZXl3b3JkcworYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCkuCisuSVAKK1tJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90b2NvbCBhcnBcZlInKSwgVG9rZW4gUmluZworKGUuZy4sIGBcZkJ0ciBwcm90b2NvbCBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCitgXGZCd2xhbiBwcm90b2NvbCBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKK3Byb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbWVzIGZyb20gdGhlIDgwMi4yIExvZ2ljYWwgTGluayBDb250cm9sIChMTEMpCitoZWFkZXIsIHdoaWNoIGlzIHVzdWFsbHkgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIEZEREksIFRva2VuIFJpbmcsIG9yCis4MDIuMTEgaGVhZGVyLgorLklQCitXaGVuIGZpbHRlcmluZyBmb3IgbW9zdCBwcm90b2NvbCBpZGVudGlmaWVycyBvbiBGRERJLCBUb2tlbiBSaW5nLCBvcgorODAyLjExLCBcZkl0Y3BkdW1wXGZSIGNoZWNrcyBvbmx5IHRoZSBwcm90b2NvbCBJRCBmaWVsZCBvZiBhbiBMTEMgaGVhZGVyCitpbiBzby1jYWxsZWQgU05BUCBmb3JtYXQgd2l0aCBhbiBPcmdhbml6YXRpb25hbCBVbml0IElkZW50aWZpZXIgKE9VSSkgb2YKKzB4MDAwMDAwLCBmb3IgZW5jYXBzdWxhdGVkIEV0aGVybmV0OyBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldAoraXMgaW4gU05BUCBmb3JtYXQgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDAuCitUaGUgZXhjZXB0aW9ucyBhcmU6CisuUlMKKy5UUAorXGZCaXNvXGZQCitcZkl0Y3BkdW1wXGZSIGNoZWNrcyB0aGUgRFNBUCAoRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQpIGFuZAorU1NBUCAoU291cmNlIFNlcnZpY2UgQWNjZXNzIFBvaW50KSBmaWVsZHMgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQnN0cFxmUCBhbmQgXGZCbmV0YmV1aVxmUAorXGZJdGNwZHVtcFxmUiBjaGVja3MgdGhlIERTQVAgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQmF0YWxrXGZQCitcZkl0Y3BkdW1wXGZSIGNoZWNrcyBmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgd2l0aCBhbiBPVUkgb2YgMHgwODAwMDcKK2FuZCB0aGUgQXBwbGVUYWxrIGV0eXBlLgorLlJFCisuSVAKK0luIHRoZSBjYXNlIG9mIEV0aGVybmV0LCBcZkl0Y3BkdW1wXGZSIGNoZWNrcyB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZAorZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLiAgVGhlIGV4Y2VwdGlvbnMgYXJlOgorLlJTCisuVFAKK1xmQmlzb1xmUCwgXGZCc3RwXGZQLCBhbmQgXGZCbmV0YmV1aVxmUAorXGZJdGNwZHVtcFxmUiBjaGVja3MgZm9yIGFuIDgwMi4zIGZyYW1lIGFuZCB0aGVuIGNoZWNrcyB0aGUgTExDIGhlYWRlciBhcworaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYXRhbGtcZlAKK1xmSXRjcGR1bXBcZlIgY2hlY2tzIGJvdGggZm9yIHRoZSBBcHBsZVRhbGsgZXR5cGUgaW4gYW4gRXRoZXJuZXQgZnJhbWUgYW5kCitmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgYXMgaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYWFycFxmUAorXGZJdGNwZHVtcFxmUiBjaGVja3MgZm9yIHRoZSBBcHBsZVRhbGsgQVJQIGV0eXBlIGluIGVpdGhlciBhbiBFdGhlcm5ldAorZnJhbWUgb3IgYW4gODAyLjIgU05BUCBmcmFtZSB3aXRoIGFuIE9VSSBvZiAweDAwMDAwMDsKKy5UUAorXGZCaXB4XGZQCitcZkl0Y3BkdW1wXGZSIGNoZWNrcyBmb3IgdGhlIElQWCBldHlwZSBpbiBhbiBFdGhlcm5ldCBmcmFtZSwgdGhlIElQWAorRFNBUCBpbiB0aGUgTExDIGhlYWRlciwgdGhlIDgwMi4zLXdpdGgtbm8tTExDLWhlYWRlciBlbmNhcHN1bGF0aW9uIG9mCitJUFgsIGFuZCB0aGUgSVBYIGV0eXBlIGluIGEgU05BUCBmcmFtZS4KKy5SRQorLklQICJcZkJkZWNuZXQgc3JjIFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgc291cmNlIGFkZHJlc3MgaXMKKy5JUiBob3N0ICwKK3doaWNoIG1heSBiZSBhbiBhZGRyZXNzIG9mIHRoZSBmb3JtIGBgMTAuMTIzJycsIG9yIGEgREVDTkVUIGhvc3QKK25hbWUuCitbREVDTkVUIGhvc3QgbmFtZSBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIFVMVFJJWCBzeXN0ZW1zCit0aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBERUNORVQuXQorLklQICJcZkJkZWNuZXQgZHN0IFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQICJcZkJkZWNuZXQgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIERFQ05FVCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQICJcZkJpZm5hbWUgXGZJaW50ZXJmYWNlXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgY29taW5nIGZyb20gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgKGFwcGxpZXMKK29ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCb24gXGZJaW50ZXJmYWNlXGZSIgorU3lub255bW91cyB3aXRoIHRoZQorLkIgaWZuYW1lCittb2RpZmllci4KKy5JUCAiXGZCcm5yIFxmSW51bVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgUEYgcnVsZSBudW1iZXIKKyhhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCcnVsZW51bSBcZkludW1cZlIiCitTeW5vbm9tb3VzIHdpdGggdGhlCisuQiBybnIKK21vZGlmaWVyLgorLklQICJcZkJyZWFzb24gXGZJY29kZVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIHdpdGggdGhlIHNwZWNpZmllZCBQRiByZWFzb24gY29kZS4gIFRoZSBrbm93bgorY29kZXMgYXJlOgorLkJSIG1hdGNoICwKKy5CUiBiYWQtb2Zmc2V0ICwKKy5CUiBmcmFnbWVudCAsCisuQlIgc2hvcnQgLAorLkJSIG5vcm1hbGl6ZSAsCithbmQKKy5CIG1lbW9yeQorKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJyc2V0IFxmSW5hbWVcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFBGIHJ1bGVzZXQKK25hbWUgb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5CisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCcnVsZXNldCBcZkluYW1lXGZSIgorU3lub25vbW91cyB3aXRoIHRoZQorLkIgcnNldAorbW9kaWZpZXIuCisuSVAgIlxmQnNybnIgXGZJbnVtXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBQRiBydWxlIG51bWJlcgorb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5CisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCc3VicnVsZW51bSBcZkludW1cZlIiCitTeW5vbm9tb3VzIHdpdGggdGhlCisuQiBzcm5yCittb2RpZmllci4KKy5JUCAiXGZCYWN0aW9uIFxmSWFjdFxmUiIKK1RydWUgaWYgUEYgdG9vayB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aGVuIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZC4gIEtub3duIGFjdGlvbnMKK2FyZToKKy5CIHBhc3MKK2FuZAorLkIgYmxvY2sKKyhhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCaXBcZlIsIFxmQmlwNlxmUiwgXGZCYXJwXGZSLCBcZkJyYXJwXGZSLCBcZkJhdGFsa1xmUiwgXGZCYWFycFxmUiwgXGZCZGVjbmV0XGZSLCBcZkJpc29cZlIsIFxmQnN0cFxmUiwgXGZCaXB4XGZSLCBcZkluZXRiZXVpXGZQIgorQWJicmV2aWF0aW9ucyBmb3I6CisuaW4gKy41aQorLm5mCitcZkJldGhlciBwcm90byBcZklwXGZSCisuZmkKKy5pbiAtLjVpCit3aGVyZSBcZklwXGZSIGlzIG9uZSBvZiB0aGUgYWJvdmUgcHJvdG9jb2xzLgorLklQICJcZkJsYXRcZlIsIFxmQm1vcHJjXGZSLCBcZkJtb3BkbFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCZXRoZXIgcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KK05vdGUgdGhhdAorXGZJdGNwZHVtcFxmUCBkb2VzIG5vdCBjdXJyZW50bHkga25vdyBob3cgdG8gcGFyc2UgdGhlc2UgcHJvdG9jb2xzLgorLklQICJcZkJ2bGFuIFxmSVt2bGFuX2lkXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJRUVFIDgwMi4xUSBWTEFOIHBhY2tldC4KK0lmIFxmSVt2bGFuX2lkXVxmUiBpcyBzcGVjaWZpZWQsIG9ubHkgdHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyB0aGUgc3BlY2lmaWVkCitcZkl2bGFuX2lkXGZSLgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJ2bGFuXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCit0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBWTEFOIHBhY2tldC4gIFRoZSBcZkJ2bGFuCitcZklbdmxhbl9pZF1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8gZmlsdGVyIG9uIFZMQU4KK2hpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlIGZpbHRlciBvZmZzZXRzCitieSA0LgorLklQCitGb3IgZXhhbXBsZToKKy5pbiArLjVpCisubmYKK1xmQnZsYW4gMTAwICYmIHZsYW4gMjAwXGZSCisuZmkKKy5pbiAtLjVpCitmaWx0ZXJzIG9uIFZMQU4gMjAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gVkxBTiAxMDAsIGFuZAorLmluICsuNWkKKy5uZgorXGZCdmxhbiAmJiB2bGFuIDMwMCAmJiBpcFxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBJUHY0IHByb3RvY29scyBlbmNhcHN1bGF0ZWQgaW4gVkxBTiAzMDAgZW5jYXBzdWxhdGVkIHdpdGhpbiBhbnkKK2hpZ2hlciBvcmRlciBWTEFOLgorLklQICJcZkJtcGxzIFxmSVtsYWJlbF9udW1dXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE1QTFMgcGFja2V0LgorSWYgXGZJW2xhYmVsX251bV1cZlIgaXMgc3BlY2lmaWVkLCBvbmx5IHRydWUgaXMgdGhlIHBhY2tldCBoYXMgdGhlIHNwZWNpZmllZAorXGZJbGFiZWxfbnVtXGZSLgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJtcGxzXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCit0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBNUExTLWVuY2Fwc3VsYXRlZCBJUCBwYWNrZXQuICBUaGUKK1xmQm1wbHMgXGZJW2xhYmVsX251bV1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8KK2ZpbHRlciBvbiBNUExTIGhpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlCitmaWx0ZXIgb2Zmc2V0cyBieSA0LiAKKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJtcGxzIDEwMDAwMCAmJiBtcGxzIDEwMjRcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgcGFja2V0cyB3aXRoIGFuIG91dGVyIGxhYmVsIG9mIDEwMDAwMCBhbmQgYW4gaW5uZXIgbGFiZWwgb2YKKzEwMjQsIGFuZAorLmluICsuNWkKKy5uZgorXGZCbXBscyAmJiBtcGxzIDEwMjQgJiYgaG9zdCAxOTIuOS4yMDAuMVxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBwYWNrZXRzIHRvIG9yIGZyb20gMTkyLjkuMjAwLjEgd2l0aCBhbiBpbm5lciBsYWJlbCBvZiAxMDI0IGFuZAorYW55IG91dGVyIGxhYmVsLgorLklQIFxmQnBwcG9lZFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGEgUFBQLW92ZXItRXRoZXJuZXQgRGlzY292ZXJ5IHBhY2tldCAoRXRoZXJuZXQKK3R5cGUgMHg4ODYzKS4KKy5JUCBcZkJwcHBvZXNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhIFBQUC1vdmVyLUV0aGVybmV0IFNlc3Npb24gcGFja2V0IChFdGhlcm5ldAordHlwZSAweDg4NjQpLgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJwcHBvZXNcZlIga2V5d29yZCBlbmNvdW50ZXJlZCBpbiBcZklleHByZXNzaW9uXGZSCitjaGFuZ2VzIHRoZSBkZWNvZGluZyBvZmZzZXRzIGZvciB0aGUgcmVtYWluZGVyIG9mIFxmSWV4cHJlc3Npb25cZlIgb24KK3RoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBhIFBQUG9FIHNlc3Npb24gcGFja2V0LgorLklQCitGb3IgZXhhbXBsZToKKy5pbiArLjVpCisubmYKK1xmQnBwcG9lcyAmJiBpcFxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBJUHY0IHByb3RvY29scyBlbmNhcHN1bGF0ZWQgaW4gUFBQb0UuCisuSVAgICJcZkJ0Y3BcZlIsIFxmQnVkcFxmUiwgXGZCaWNtcFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCaXAgcHJvdG8gXGZJcFxmUlxmQiBvciBpcDYgcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KKy5JUCAiXGZCaXNvIHByb3RvIFxmSXByb3RvY29sXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE9TSSBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KK1xmSVByb3RvY29sXGZQIGNhbiBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIG5hbWVzCitcZkJjbG5wXGZQLCBcZkJlc2lzXGZQLCBvciBcZkJpc2lzXGZQLgorLklQICJcZkJjbG5wXGZSLCBcZkJlc2lzXGZSLCBcZkJpc2lzXGZSIgorQWJicmV2aWF0aW9ucyBmb3I6CisuaW4gKy41aQorLm5mCitcZkJpc28gcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KKy5JUCAiXGZCbDFcZlIsIFxmQmwyXGZSLCBcZkJpaWhcZlIsIFxmQmxzcFxmUiwgXGZCc25wXGZSLCBcZkJjc25wXGZSLCBcZkJwc25wXGZSIgorQWJicmV2aWF0aW9ucyBmb3IgSVMtSVMgUERVIHR5cGVzLgorLklQICJcZkJ2cGlcZlAgXGZJblxmUgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgd2l0aCBhCit2aXJ0dWFsIHBhdGggaWRlbnRpZmllciBvZgorLklSIG4gLgorLklQICJcZkJ2Y2lcZlAgXGZJblxmUgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgd2l0aCBhCit2aXJ0dWFsIGNoYW5uZWwgaWRlbnRpZmllciBvZgorLklSIG4gLgorLklQIFxmQmxhbmVcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYW4gQVRNIExBTkUgcGFja2V0LgorTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJsYW5lXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgdGVzdHMgZG9uZSBpbiB0aGUgcmVtYWluZGVyIG9mIFxmSWV4cHJlc3Npb25cZlIKK29uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBlaXRoZXIgYSBMQU5FIGVtdWxhdGVkIEV0aGVybmV0CitwYWNrZXQgb3IgYSBMQU5FIExFIENvbnRyb2wgcGFja2V0LiAgSWYgXGZCbGFuZVxmUiBpc24ndCBzcGVjaWZpZWQsIHRoZQordGVzdHMgYXJlIGRvbmUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGFuCitMTEMtZW5jYXBzdWxhdGVkIHBhY2tldC4KKy5JUCBcZkJsbGNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYW4gTExDLWVuY2Fwc3VsYXRlZCBwYWNrZXQuCisuSVAgXGZCb2FtZjRzXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2Egc2VnbWVudCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIFZDST0zKS4KKy5JUCBcZkJvYW1mNGVcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYW4gZW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIFZDST00KS4KKy5JUCBcZkJvYW1mNFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithIHNlZ21lbnQgb3IgZW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIChWQ0k9MyB8IFZDST00KSkuCisuSVAgXGZCb2FtXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2Egc2VnbWVudCBvciBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgKFZDST0zIHwgVkNJPTQpKS4KKy5JUCBcZkJtZXRhY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIG1ldGEgc2lnbmFsaW5nIGNpcmN1aXQgKFZQST0wICYgVkNJPTEpLgorLklQIFxmQmJjY1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIGJyb2FkY2FzdCBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9MikuCisuSVAgXGZCc2NcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9NSkuCisuSVAgXGZCaWxtaWNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYW4gSUxNSSBjaXJjdWl0IChWUEk9MCAmIFZDST0xNikuCisuSVAgXGZCY29ubmVjdG1zZ1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIHNpZ25hbGluZyBjaXJjdWl0IGFuZCBpcyBhIFEuMjkzMSBTZXR1cCwgQ2FsbCBQcm9jZWVkaW5nLCBDb25uZWN0LAorQ29ubmVjdCBBY2ssIFJlbGVhc2UsIG9yIFJlbGVhc2UgRG9uZSBtZXNzYWdlLgorLklQIFxmQm1ldGFjb25uZWN0XGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgbWV0YSBzaWduYWxpbmcgY2lyY3VpdCBhbmQgaXMgYSBRLjI5MzEgU2V0dXAsIENhbGwgUHJvY2VlZGluZywgQ29ubmVjdCwKK1JlbGVhc2UsIG9yIFJlbGVhc2UgRG9uZSBtZXNzYWdlLgorLklQICAiXGZJZXhwciByZWxvcCBleHByXGZSIgorVHJ1ZSBpZiB0aGUgcmVsYXRpb24gaG9sZHMsIHdoZXJlIFxmSXJlbG9wXGZSIGlzIG9uZSBvZiA+LCA8LCA+PSwgPD0sID0sCishPSwgYW5kIFxmSWV4cHJcZlIgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGludGVnZXIKK2NvbnN0YW50cyAoZXhwcmVzc2VkIGluIHN0YW5kYXJkIEMgc3ludGF4KSwgdGhlIG5vcm1hbCBiaW5hcnkgb3BlcmF0b3JzCitbKywgLSwgKiwgLywgJiwgfCwgPDwsID4+XSwgYSBsZW5ndGggb3BlcmF0b3IsIGFuZCBzcGVjaWFsIHBhY2tldCBkYXRhCithY2Nlc3NvcnMuICBOb3RlIHRoYXQgYWxsIGNvbXBhcmlzb25zIGFyZSB1bnNpZ25lZCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsCisweDgwMDAwMDAwIGFuZCAweGZmZmZmZmZmIGFyZSA+IDAuCitUbyBhY2Nlc3MKK2RhdGEgaW5zaWRlIHRoZSBwYWNrZXQsIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy5pbiArLjVpCisubmYKK1xmSXByb3RvXGZCIFsgXGZJZXhwclxmQiA6IFxmSXNpemVcZkIgXVxmUgorLmZpCisuaW4gLS41aQorXGZJUHJvdG9cZlIgaXMgb25lIG9mIFxmQmV0aGVyLCBmZGRpLCB0ciwgd2xhbiwgcHBwLCBzbGlwLCBsaW5rLAoraXAsIGFycCwgcmFycCwgdGNwLCB1ZHAsIGljbXAsIGlwNlxmUiBvciBcZkJyYWRpb1xmUiwgYW5kCitpbmRpY2F0ZXMgdGhlIHByb3RvY29sIGxheWVyIGZvciB0aGUgaW5kZXggb3BlcmF0aW9uLgorKFxmQmV0aGVyLCBmZGRpLCB3bGFuLCB0ciwgcHBwLCBzbGlwXGZSIGFuZCBcZkJsaW5rXGZSIGFsbCByZWZlciB0byB0aGUKK2xpbmsgbGF5ZXIuIFxmQnJhZGlvXGZSIHJlZmVycyB0byB0aGUgInJhZGlvIGhlYWRlciIgYWRkZWQgdG8gc29tZQorODAyLjExIGNhcHR1cmVzLikKK05vdGUgdGhhdCBcZkl0Y3AsIHVkcFxmUiBhbmQgb3RoZXIgdXBwZXItbGF5ZXIgcHJvdG9jb2wgdHlwZXMgb25seQorYXBwbHkgdG8gSVB2NCwgbm90IElQdjYgKHRoaXMgd2lsbCBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlKS4KK1RoZSBieXRlIG9mZnNldCwgcmVsYXRpdmUgdG8gdGhlIGluZGljYXRlZCBwcm90b2NvbCBsYXllciwgaXMKK2dpdmVuIGJ5IFxmSWV4cHJcZlIuCitcZklTaXplXGZSIGlzIG9wdGlvbmFsIGFuZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKK2ZpZWxkIG9mIGludGVyZXN0OyBpdCBjYW4gYmUgZWl0aGVyIG9uZSwgdHdvLCBvciBmb3VyLCBhbmQgZGVmYXVsdHMgdG8gb25lLgorVGhlIGxlbmd0aCBvcGVyYXRvciwgaW5kaWNhdGVkIGJ5IHRoZSBrZXl3b3JkIFxmQmxlblxmUCwgZ2l2ZXMgdGhlCitsZW5ndGggb2YgdGhlIHBhY2tldC4KKworRm9yIGV4YW1wbGUsIGBcZkJldGhlclswXSAmIDEgIT0gMFxmUCcgY2F0Y2hlcyBhbGwgbXVsdGljYXN0IHRyYWZmaWMuCitUaGUgZXhwcmVzc2lvbiBgXGZCaXBbMF0gJiAweGYgIT0gNVxmUCcKK2NhdGNoZXMgYWxsIElQdjQgcGFja2V0cyB3aXRoIG9wdGlvbnMuCitUaGUgZXhwcmVzc2lvbgorYFxmQmlwWzY6Ml0gJiAweDFmZmYgPSAwXGZQJworY2F0Y2hlcyBvbmx5IHVuZnJhZ21lbnRlZCBJUHY0IGRhdGFncmFtcyBhbmQgZnJhZyB6ZXJvIG9mIGZyYWdtZW50ZWQKK0lQdjQgZGF0YWdyYW1zLgorVGhpcyBjaGVjayBpcyBpbXBsaWNpdGx5IGFwcGxpZWQgdG8gdGhlIFxmQnRjcFxmUCBhbmQgXGZCdWRwXGZQCitpbmRleCBvcGVyYXRpb25zLgorRm9yIGluc3RhbmNlLCBcZkJ0Y3BbMF1cZlAgYWx3YXlzIG1lYW5zIHRoZSBmaXJzdAorYnl0ZSBvZiB0aGUgVENQIFxmSWhlYWRlclxmUCwgYW5kIG5ldmVyIG1lYW5zIHRoZSBmaXJzdCBieXRlIG9mIGFuCitpbnRlcnZlbmluZyBmcmFnbWVudC4KKworU29tZSBvZmZzZXRzIGFuZCBmaWVsZCB2YWx1ZXMgbWF5IGJlIGV4cHJlc3NlZCBhcyBuYW1lcyByYXRoZXIgdGhhbgorYXMgbnVtZXJpYyB2YWx1ZXMuCitUaGUgZm9sbG93aW5nIHByb3RvY29sIGhlYWRlciBmaWVsZCBvZmZzZXRzIGFyZQorYXZhaWxhYmxlOiBcZkJpY21wdHlwZVxmUCAoSUNNUCB0eXBlIGZpZWxkKSwgXGZCaWNtcGNvZGVcZlAgKElDTVAKK2NvZGUgZmllbGQpLCBhbmQgXGZCdGNwZmxhZ3NcZlAgKFRDUCBmbGFncyBmaWVsZCkuCisKK1RoZSBmb2xsb3dpbmcgSUNNUCB0eXBlIGZpZWxkIHZhbHVlcyBhcmUgYXZhaWxhYmxlOiBcZkJpY21wLWVjaG9yZXBseVxmUCwKK1xmQmljbXAtdW5yZWFjaFxmUCwgXGZCaWNtcC1zb3VyY2VxdWVuY2hcZlAsIFxmQmljbXAtcmVkaXJlY3RcZlAsCitcZkJpY21wLWVjaG9cZlAsIFxmQmljbXAtcm91dGVyYWR2ZXJ0XGZQLCBcZkJpY21wLXJvdXRlcnNvbGljaXRcZlAsCitcZkJpY21wLXRpbXhjZWVkXGZQLCBcZkJpY21wLXBhcmFtcHJvYlxmUCwgXGZCaWNtcC10c3RhbXBcZlAsCitcZkJpY21wLXRzdGFtcHJlcGx5XGZQLCBcZkJpY21wLWlyZXFcZlAsIFxmQmljbXAtaXJlcXJlcGx5XGZQLAorXGZCaWNtcC1tYXNrcmVxXGZQLCBcZkJpY21wLW1hc2tyZXBseVxmUC4KKworVGhlIGZvbGxvd2luZyBUQ1AgZmxhZ3MgZmllbGQgdmFsdWVzIGFyZSBhdmFpbGFibGU6IFxmQnRjcC1maW5cZlAsCitcZkJ0Y3Atc3luXGZQLCBcZkJ0Y3AtcnN0XGZQLCBcZkJ0Y3AtcHVzaFxmUCwKK1xmQnRjcC1hY2tcZlAsIFxmQnRjcC11cmdcZlAuCisuTFAKK1ByaW1pdGl2ZXMgbWF5IGJlIGNvbWJpbmVkIHVzaW5nOgorLklQCitBIHBhcmVudGhlc2l6ZWQgZ3JvdXAgb2YgcHJpbWl0aXZlcyBhbmQgb3BlcmF0b3JzCisocGFyZW50aGVzZXMgYXJlIHNwZWNpYWwgdG8gdGhlIFNoZWxsIGFuZCBtdXN0IGJlIGVzY2FwZWQpLgorLklQCitOZWdhdGlvbiAoYFxmQiFcZlAnIG9yIGBcZkJub3RcZlAnKS4KKy5JUAorQ29uY2F0ZW5hdGlvbiAoYFxmQiYmXGZQJyBvciBgXGZCYW5kXGZQJykuCisuSVAKK0FsdGVybmF0aW9uIChgXGZCfHxcZlAnIG9yIGBcZkJvclxmUCcpLgorLkxQCitOZWdhdGlvbiBoYXMgaGlnaGVzdCBwcmVjZWRlbmNlLgorQWx0ZXJuYXRpb24gYW5kIGNvbmNhdGVuYXRpb24gaGF2ZSBlcXVhbCBwcmVjZWRlbmNlIGFuZCBhc3NvY2lhdGUKK2xlZnQgdG8gcmlnaHQuCitOb3RlIHRoYXQgZXhwbGljaXQgXGZCYW5kXGZSIHRva2Vucywgbm90IGp1eHRhcG9zaXRpb24sCithcmUgbm93IHJlcXVpcmVkIGZvciBjb25jYXRlbmF0aW9uLgorLkxQCitJZiBhbiBpZGVudGlmaWVyIGlzIGdpdmVuIHdpdGhvdXQgYSBrZXl3b3JkLCB0aGUgbW9zdCByZWNlbnQga2V5d29yZAoraXMgYXNzdW1lZC4KK0ZvciBleGFtcGxlLAorLmluICsuNWkKKy5uZgorXGZCbm90IGhvc3QgdnMgYW5kIGFjZVxmUgorLmZpCisuaW4gLS41aQoraXMgc2hvcnQgZm9yCisuaW4gKy41aQorLm5mCitcZkJub3QgaG9zdCB2cyBhbmQgaG9zdCBhY2VcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aAorLmluICsuNWkKKy5uZgorXGZCbm90ICggaG9zdCB2cyBvciBhY2UgKVxmUgorLmZpCisuaW4gLS41aQorLkxQCitFeHByZXNzaW9uIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIFxmSXRjcGR1bXBcZlAgYXMgZWl0aGVyIGEgc2luZ2xlCithcmd1bWVudCBvciBhcyBtdWx0aXBsZSBhcmd1bWVudHMsIHdoaWNoZXZlciBpcyBtb3JlIGNvbnZlbmllbnQuCitHZW5lcmFsbHksIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIFNoZWxsIG1ldGFjaGFyYWN0ZXJzLCBpdCBpcworZWFzaWVyIHRvIHBhc3MgaXQgYXMgYSBzaW5nbGUsIHF1b3RlZCBhcmd1bWVudC4KK011bHRpcGxlIGFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIHdpdGggc3BhY2VzIGJlZm9yZSBiZWluZyBwYXJzZWQuCisuU0ggRVhBTVBMRVMKKy5MUAorVG8gcHJpbnQgYWxsIHBhY2tldHMgYXJyaXZpbmcgYXQgb3IgZGVwYXJ0aW5nIGZyb20gXGZJc3VuZG93blxmUDoKKy5SUworLm5mCitcZkJ0Y3BkdW1wIGhvc3Qgc3VuZG93blxmUAorLmZpCisuUkUKKy5MUAorVG8gcHJpbnQgdHJhZmZpYyBiZXR3ZWVuIFxmSWhlbGlvc1xmUiBhbmQgZWl0aGVyIFxmSWhvdFxmUiBvciBcZklhY2VcZlI6CisuUlMKKy5uZgorXGZCdGNwZHVtcCBob3N0IGhlbGlvcyBhbmQgXFwoIGhvdCBvciBhY2UgXFwpXGZQCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBhbGwgSVAgcGFja2V0cyBiZXR3ZWVuIFxmSWFjZVxmUiBhbmQgYW55IGhvc3QgZXhjZXB0IFxmSWhlbGlvc1xmUjoKKy5SUworLm5mCitcZkJ0Y3BkdW1wIGlwIGhvc3QgYWNlIGFuZCBub3QgaGVsaW9zXGZQCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBhbGwgdHJhZmZpYyBiZXR3ZWVuIGxvY2FsIGhvc3RzIGFuZCBob3N0cyBhdCBCZXJrZWxleToKKy5SUworLm5mCisuQgordGNwZHVtcCBuZXQgdWNiLWV0aGVyCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBhbGwgZnRwIHRyYWZmaWMgdGhyb3VnaCBpbnRlcm5ldCBnYXRld2F5IFxmSXNudXBcZlA6Cisobm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIGlzIHF1b3RlZCB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tCisobWlzLSlpbnRlcnByZXRpbmcgdGhlIHBhcmVudGhlc2VzKToKKy5SUworLm5mCisuQgordGNwZHVtcCAnZ2F0ZXdheSBzbnVwIGFuZCAocG9ydCBmdHAgb3IgZnRwLWRhdGEpJworLmZpCisuUkUKKy5MUAorVG8gcHJpbnQgdHJhZmZpYyBuZWl0aGVyIHNvdXJjZWQgZnJvbSBub3IgZGVzdGluZWQgZm9yIGxvY2FsIGhvc3RzCisoaWYgeW91IGdhdGV3YXkgdG8gb25lIG90aGVyIG5ldCwgdGhpcyBzdHVmZiBzaG91bGQgbmV2ZXIgbWFrZSBpdAorb250byB5b3VyIGxvY2FsIG5ldCkuCisuUlMKKy5uZgorLkIKK3RjcGR1bXAgaXAgYW5kIG5vdCBuZXQgXGZJbG9jYWxuZXRcZlAKKy5maQorLlJFCisuTFAKK1RvIHByaW50IHRoZSBzdGFydCBhbmQgZW5kIHBhY2tldHMgKHRoZSBTWU4gYW5kIEZJTiBwYWNrZXRzKSBvZiBlYWNoCitUQ1AgY29udmVyc2F0aW9uIHRoYXQgaW52b2x2ZXMgYSBub24tbG9jYWwgaG9zdC4KKy5SUworLm5mCisuQgordGNwZHVtcCAndGNwW3RjcGZsYWdzXSAmICh0Y3Atc3lufHRjcC1maW4pICE9IDAgYW5kIG5vdCBzcmMgYW5kIGRzdCBuZXQgXGZJbG9jYWxuZXRcZlAnCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBhbGwgSVB2NCBIVFRQIHBhY2tldHMgdG8gYW5kIGZyb20gcG9ydCA4MCwgaS5lLiBwcmludCBvbmx5CitwYWNrZXRzIHRoYXQgY29udGFpbiBkYXRhLCBub3QsIGZvciBleGFtcGxlLCBTWU4gYW5kIEZJTiBwYWNrZXRzIGFuZAorQUNLLW9ubHkgcGFja2V0cy4gIChJUHY2IGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuKQorLlJTCisubmYKKy5CCit0Y3BkdW1wICd0Y3AgcG9ydCA4MCBhbmQgKCgoaXBbMjoyXSAtICgoaXBbMF0mMHhmKTw8MikpIC0gKCh0Y3BbMTJdJjB4ZjApPj4yKSkgIT0gMCknCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBJUCBwYWNrZXRzIGxvbmdlciB0aGFuIDU3NiBieXRlcyBzZW50IHRocm91Z2ggZ2F0ZXdheSBcZklzbnVwXGZQOgorLlJTCisubmYKKy5CCit0Y3BkdW1wICdnYXRld2F5IHNudXAgYW5kIGlwWzI6Ml0gPiA1NzYnCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBJUCBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHBhY2tldHMgdGhhdCB3ZXJlCisuSSBub3QKK3NlbnQgdmlhIEV0aGVybmV0IGJyb2FkY2FzdCBvciBtdWx0aWNhc3Q6CisuUlMKKy5uZgorLkIKK3RjcGR1bXAgJ2V0aGVyWzBdICYgMSA9IDAgYW5kIGlwWzE2XSA+PSAyMjQnCisuZmkKKy5SRQorLkxQCitUbyBwcmludCBhbGwgSUNNUCBwYWNrZXRzIHRoYXQgYXJlIG5vdCBlY2hvIHJlcXVlc3RzL3JlcGxpZXMgKGkuZS4sIG5vdAorcGluZyBwYWNrZXRzKToKKy5SUworLm5mCisuQgordGNwZHVtcCAnaWNtcFtpY21wdHlwZV0gIT0gaWNtcC1lY2hvIGFuZCBpY21wW2ljbXB0eXBlXSAhPSBpY21wLWVjaG9yZXBseScKKy5maQorLlJFCisuU0ggT1VUUFVUIEZPUk1BVAorLkxQCitUaGUgb3V0cHV0IG9mIFxmSXRjcGR1bXBcZlAgaXMgcHJvdG9jb2wgZGVwZW5kZW50LgorVGhlIGZvbGxvd2luZworZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBhbmQgZXhhbXBsZXMgb2YgbW9zdCBvZiB0aGUgZm9ybWF0cy4KKy5kZSBIRAorLnNwIDEuNQorLkIKKy4uCisuSEQKK0xpbmsgTGV2ZWwgSGVhZGVycworLkxQCitJZiB0aGUgJy1lJyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rIGxldmVsIGhlYWRlciBpcyBwcmludGVkIG91dC4KK09uIEV0aGVybmV0cywgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBwcm90b2NvbCwKK2FuZCBwYWNrZXQgbGVuZ3RoIGFyZSBwcmludGVkLgorLkxQCitPbiBGRERJIG5ldHdvcmtzLCB0aGUgICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Cit0aGUgYGZyYW1lIGNvbnRyb2wnIGZpZWxkLCAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLAorYW5kIHRoZSBwYWNrZXQgbGVuZ3RoLgorKFRoZSBgZnJhbWUgY29udHJvbCcgZmllbGQgZ292ZXJucyB0aGUKK2ludGVycHJldGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuCitOb3JtYWwgcGFja2V0cyAoc3VjaAorYXMgdGhvc2UgY29udGFpbmluZyBJUCBkYXRhZ3JhbXMpIGFyZSBgYXN5bmMnIHBhY2tldHMsIHdpdGggYSBwcmlvcml0eQordmFsdWUgYmV0d2VlbiAwIGFuZCA3OyBmb3IgZXhhbXBsZSwgYFxmQmFzeW5jNFxmUicuCitTdWNoIHBhY2tldHMKK2FyZSBhc3N1bWVkIHRvIGNvbnRhaW4gYW4gODAyLjIgTG9naWNhbCBMaW5rIENvbnRyb2wgKExMQykgcGFja2V0OwordGhlIExMQyBoZWFkZXIgaXMgcHJpbnRlZCBpZiBpdCBpcyBcZklub3RcZlIgYW4gSVNPIGRhdGFncmFtIG9yIGEKK3NvLWNhbGxlZCBTTkFQIHBhY2tldC4KKy5MUAorT24gVG9rZW4gUmluZyBuZXR3b3JrcywgdGhlICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Cit0aGUgYGFjY2VzcyBjb250cm9sJyBhbmQgYGZyYW1lIGNvbnRyb2wnIGZpZWxkcywgdGhlIHNvdXJjZSBhbmQKK2Rlc3RpbmF0aW9uIGFkZHJlc3NlcywgYW5kIHRoZSBwYWNrZXQgbGVuZ3RoLgorQXMgb24gRkRESSBuZXR3b3JrcywKK3BhY2tldHMgYXJlIGFzc3VtZWQgdG8gY29udGFpbiBhbiBMTEMgcGFja2V0LgorUmVnYXJkbGVzcyBvZiB3aGV0aGVyCit0aGUgJy1lJyBvcHRpb24gaXMgc3BlY2lmaWVkIG9yIG5vdCwgdGhlIHNvdXJjZSByb3V0aW5nIGluZm9ybWF0aW9uIGlzCitwcmludGVkIGZvciBzb3VyY2Utcm91dGVkIHBhY2tldHMuCisuTFAKK09uIDgwMi4xMSBuZXR3b3JrcywgdGhlICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Cit0aGUgYGZyYW1lIGNvbnRyb2wnIGZpZWxkcywgYWxsIG9mIHRoZSBhZGRyZXNzZXMgaW4gdGhlIDgwMi4xMSBoZWFkZXIsCithbmQgdGhlIHBhY2tldCBsZW5ndGguCitBcyBvbiBGRERJIG5ldHdvcmtzLAorcGFja2V0cyBhcmUgYXNzdW1lZCB0byBjb250YWluIGFuIExMQyBwYWNrZXQuCisuTFAKK1xmSShOLkIuOiBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aAordGhlIFNMSVAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBSRkMtMTE0NC4pXGZQCisuTFAKK09uIFNMSVAgbGlua3MsIGEgZGlyZWN0aW9uIGluZGljYXRvciAoYGBJJycgZm9yIGluYm91bmQsIGBgTycnIGZvciBvdXRib3VuZCksCitwYWNrZXQgdHlwZSwgYW5kIGNvbXByZXNzaW9uIGluZm9ybWF0aW9uIGFyZSBwcmludGVkIG91dC4KK1RoZSBwYWNrZXQgdHlwZSBpcyBwcmludGVkIGZpcnN0LgorVGhlIHRocmVlIHR5cGVzIGFyZSBcZklpcFxmUCwgXGZJdXRjcFxmUCwgYW5kIFxmSWN0Y3BcZlAuCitObyBmdXJ0aGVyIGxpbmsgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBmb3IgXGZJaXBcZlIgcGFja2V0cy4KK0ZvciBUQ1AgcGFja2V0cywgdGhlIGNvbm5lY3Rpb24gaWRlbnRpZmllciBpcyBwcmludGVkIGZvbGxvd2luZyB0aGUgdHlwZS4KK0lmIHRoZSBwYWNrZXQgaXMgY29tcHJlc3NlZCwgaXRzIGVuY29kZWQgaGVhZGVyIGlzIHByaW50ZWQgb3V0LgorVGhlIHNwZWNpYWwgY2FzZXMgYXJlIHByaW50ZWQgb3V0IGFzCitcZkIqUytcZkluXGZSIGFuZCBcZkIqU0ErXGZJblxmUiwgd2hlcmUgXGZJblxmUiBpcyB0aGUgYW1vdW50IGJ5IHdoaWNoCit0aGUgc2VxdWVuY2UgbnVtYmVyIChvciBzZXF1ZW5jZSBudW1iZXIgYW5kIGFjaykgaGFzIGNoYW5nZWQuCitJZiBpdCBpcyBub3QgYSBzcGVjaWFsIGNhc2UsCit6ZXJvIG9yIG1vcmUgY2hhbmdlcyBhcmUgcHJpbnRlZC4KK0EgY2hhbmdlIGlzIGluZGljYXRlZCBieSBVICh1cmdlbnQgcG9pbnRlciksIFcgKHdpbmRvdyksIEEgKGFjayksCitTIChzZXF1ZW5jZSBudW1iZXIpLCBhbmQgSSAocGFja2V0IElEKSwgZm9sbG93ZWQgYnkgYSBkZWx0YSAoK24gb3IgLW4pLAorb3IgYSBuZXcgdmFsdWUgKD1uKS4KK0ZpbmFsbHksIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcGFja2V0IGFuZCBjb21wcmVzc2VkIGhlYWRlciBsZW5ndGgKK2FyZSBwcmludGVkLgorLkxQCitGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNob3dzIGFuIG91dGJvdW5kIGNvbXByZXNzZWQgVENQIHBhY2tldCwKK3dpdGggYW4gaW1wbGljaXQgY29ubmVjdGlvbiBpZGVudGlmaWVyOyB0aGUgYWNrIGhhcyBjaGFuZ2VkIGJ5IDYsCit0aGUgc2VxdWVuY2UgbnVtYmVyIGJ5IDQ5LCBhbmQgdGhlIHBhY2tldCBJRCBieSA2OyB0aGVyZSBhcmUgMyBieXRlcyBvZgorZGF0YSBhbmQgNiBieXRlcyBvZiBjb21wcmVzc2VkIGhlYWRlcjoKKy5SUworLm5mCitcZkJPIGN0Y3AgKiBBKzYgUys0OSBJKzYgMyAoNilcZlAKKy5maQorLlJFCisuSEQKK0FSUC9SQVJQIFBhY2tldHMKKy5MUAorQXJwL3JhcnAgb3V0cHV0IHNob3dzIHRoZSB0eXBlIG9mIHJlcXVlc3QgYW5kIGl0cyBhcmd1bWVudHMuCitUaGUKK2Zvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmIGV4cGxhbmF0b3J5LgorSGVyZSBpcyBhIHNob3J0IHNhbXBsZSB0YWtlbiBmcm9tIHRoZSBzdGFydCBvZiBhbiBgcmxvZ2luJyBmcm9tCitob3N0IFxmSXJ0c2dcZlAgdG8gaG9zdCBcZkljc2FtXGZQOgorLlJTCisubmYKKy5zcCAuNQorXGYoQ1dhcnAgd2hvLWhhcyBjc2FtIHRlbGwgcnRzZworYXJwIHJlcGx5IGNzYW0gaXMtYXQgQ1NBTVxmUgorLnNwIC41CisuZmkKKy5SRQorVGhlIGZpcnN0IGxpbmUgc2F5cyB0aGF0IHJ0c2cgc2VudCBhbiBhcnAgcGFja2V0IGFza2luZworZm9yIHRoZSBFdGhlcm5ldCBhZGRyZXNzIG9mIGludGVybmV0IGhvc3QgY3NhbS4KK0NzYW0KK3JlcGxpZXMgd2l0aCBpdHMgRXRoZXJuZXQgYWRkcmVzcyAoaW4gdGhpcyBleGFtcGxlLCBFdGhlcm5ldCBhZGRyZXNzZXMKK2FyZSBpbiBjYXBzIGFuZCBpbnRlcm5ldCBhZGRyZXNzZXMgaW4gbG93ZXIgY2FzZSkuCisuTFAKK1RoaXMgd291bGQgbG9vayBsZXNzIHJlZHVuZGFudCBpZiB3ZSBoYWQgZG9uZSBcZkl0Y3BkdW1wIFwtblxmUDoKKy5SUworLm5mCisuc3AgLjUKK1xmKENXYXJwIHdoby1oYXMgMTI4LjMuMjU0LjYgdGVsbCAxMjguMy4yNTQuNjgKK2FycCByZXBseSAxMjguMy4yNTQuNiBpcy1hdCAwMjowNzowMTowMDowMTpjNFxmUAorLmZpCisuUkUKKy5MUAorSWYgd2UgaGFkIGRvbmUgXGZJdGNwZHVtcCBcLWVcZlAsIHRoZSBmYWN0IHRoYXQgdGhlIGZpcnN0IHBhY2tldCBpcworYnJvYWRjYXN0IGFuZCB0aGUgc2Vjb25kIGlzIHBvaW50LXRvLXBvaW50IHdvdWxkIGJlIHZpc2libGU6CisuUlMKKy5uZgorLnNwIC41CitcZihDV1JUU0cgQnJvYWRjYXN0IDA4MDYgIDY0OiBhcnAgd2hvLWhhcyBjc2FtIHRlbGwgcnRzZworQ1NBTSBSVFNHIDA4MDYgIDY0OiBhcnAgcmVwbHkgY3NhbSBpcy1hdCBDU0FNXGZSCisuc3AgLjUKKy5maQorLlJFCitGb3IgdGhlIGZpcnN0IHBhY2tldCB0aGlzIHNheXMgdGhlIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGlzIFJUU0csIHRoZQorZGVzdGluYXRpb24gaXMgdGhlIEV0aGVybmV0IGJyb2FkY2FzdCBhZGRyZXNzLCB0aGUgdHlwZSBmaWVsZAorY29udGFpbmVkIGhleCAwODA2ICh0eXBlIEVUSEVSX0FSUCkgYW5kIHRoZSB0b3RhbCBsZW5ndGggd2FzIDY0IGJ5dGVzLgorLkhECitUQ1AgUGFja2V0cworLkxQCitcZkkoTi5CLjpUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aAordGhlIFRDUCBwcm90b2NvbCBkZXNjcmliZWQgaW4gUkZDLTc5My4KK0lmIHlvdSBhcmUgbm90IGZhbWlsaWFyCit3aXRoIHRoZSBwcm90b2NvbCwgbmVpdGhlciB0aGlzIGRlc2NyaXB0aW9uIG5vciBcZkl0Y3BkdW1wXGZQIHdpbGwKK2JlIG9mIG11Y2ggdXNlIHRvIHlvdS4pXGZQCisuTFAKK1RoZSBnZW5lcmFsIGZvcm1hdCBvZiBhIHRjcCBwcm90b2NvbCBsaW5lIGlzOgorLlJTCisubmYKKy5zcCAuNQorXGZJc3JjID4gZHN0OiBmbGFncyBkYXRhLXNlcW5vIGFjayB3aW5kb3cgdXJnZW50IG9wdGlvbnNcZlAKKy5zcCAuNQorLmZpCisuUkUKK1xmSVNyY1xmUCBhbmQgXGZJZHN0XGZQIGFyZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUAorYWRkcmVzc2VzIGFuZCBwb3J0cy4KK1xmSUZsYWdzXGZQIGFyZSBzb21lIGNvbWJpbmF0aW9uIG9mIFMgKFNZTiksCitGIChGSU4pLCBQIChQVVNIKSwgUiAoUlNUKSwgVyAoRUNOIENXUikgb3IgRSAoRUNOLUVjaG8pLCBvciBhIHNpbmdsZQorYC4nIChubyBmbGFncykuCitcZklEYXRhLXNlcW5vXGZQIGRlc2NyaWJlcyB0aGUgcG9ydGlvbiBvZiBzZXF1ZW5jZSBzcGFjZSBjb3ZlcmVkCitieSB0aGUgZGF0YSBpbiB0aGlzIHBhY2tldCAoc2VlIGV4YW1wbGUgYmVsb3cpLgorXGZJQWNrXGZQIGlzIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbmV4dCBkYXRhIGV4cGVjdGVkIHRoZSBvdGhlcgorZGlyZWN0aW9uIG9uIHRoaXMgY29ubmVjdGlvbi4KK1xmSVdpbmRvd1xmUCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHJlY2VpdmUgYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQordGhlIG90aGVyIGRpcmVjdGlvbiBvbiB0aGlzIGNvbm5lY3Rpb24uCitcZklVcmdcZlAgaW5kaWNhdGVzIHRoZXJlIGlzIGB1cmdlbnQnIGRhdGEgaW4gdGhlIHBhY2tldC4KK1xmSU9wdGlvbnNcZlAgYXJlIHRjcCBvcHRpb25zIGVuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzIChlLmcuLCA8bXNzIDEwMjQ+KS4KKy5MUAorXGZJU3JjLCBkc3RcZlAgYW5kIFxmSWZsYWdzXGZQIGFyZSBhbHdheXMgcHJlc2VudC4KK1RoZSBvdGhlciBmaWVsZHMKK2RlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCdzIHRjcCBwcm90b2NvbCBoZWFkZXIgYW5kCithcmUgb3V0cHV0IG9ubHkgaWYgYXBwcm9wcmlhdGUuCisuTFAKK0hlcmUgaXMgdGhlIG9wZW5pbmcgcG9ydGlvbiBvZiBhbiBybG9naW4gZnJvbSBob3N0IFxmSXJ0c2dcZlAgdG8KK2hvc3QgXGZJY3NhbVxmUC4KKy5SUworLm5mCisuc3AgLjUKK1xzLTJcZihDV3J0c2cuMTAyMyA+IGNzYW0ubG9naW46IFMgNzY4NTEyOjc2ODUxMigwKSB3aW4gNDA5NiA8bXNzIDEwMjQ+Citjc2FtLmxvZ2luID4gcnRzZy4xMDIzOiBTIDk0NzY0ODo5NDc2NDgoMCkgYWNrIDc2ODUxMyB3aW4gNDA5NiA8bXNzIDEwMjQ+CitydHNnLjEwMjMgPiBjc2FtLmxvZ2luOiAuIGFjayAxIHdpbiA0MDk2CitydHNnLjEwMjMgPiBjc2FtLmxvZ2luOiBQIDE6MigxKSBhY2sgMSB3aW4gNDA5NgorY3NhbS5sb2dpbiA+IHJ0c2cuMTAyMzogLiBhY2sgMiB3aW4gNDA5NgorcnRzZy4xMDIzID4gY3NhbS5sb2dpbjogUCAyOjIxKDE5KSBhY2sgMSB3aW4gNDA5NgorY3NhbS5sb2dpbiA+IHJ0c2cuMTAyMzogUCAxOjIoMSkgYWNrIDIxIHdpbiA0MDc3Citjc2FtLmxvZ2luID4gcnRzZy4xMDIzOiBQIDI6MygxKSBhY2sgMjEgd2luIDQwNzcgdXJnIDEKK2NzYW0ubG9naW4gPiBydHNnLjEwMjM6IFAgMzo0KDEpIGFjayAyMSB3aW4gNDA3NyB1cmcgMVxmUlxzKzIKKy5zcCAuNQorLmZpCisuUkUKK1RoZSBmaXJzdCBsaW5lIHNheXMgdGhhdCB0Y3AgcG9ydCAxMDIzIG9uIHJ0c2cgc2VudCBhIHBhY2tldAordG8gcG9ydCBcZklsb2dpblxmUAorb24gY3NhbS4KK1RoZSBcZkJTXGZQIGluZGljYXRlcyB0aGF0IHRoZSBcZklTWU5cZlAgZmxhZyB3YXMgc2V0LgorVGhlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgd2FzIDc2ODUxMiBhbmQgaXQgY29udGFpbmVkIG5vIGRhdGEuCisoVGhlIG5vdGF0aW9uIGlzIGBmaXJzdDpsYXN0KG5ieXRlcyknIHdoaWNoIG1lYW5zIGBzZXF1ZW5jZQorbnVtYmVycyBcZklmaXJzdFxmUAordXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgXGZJbGFzdFxmUCB3aGljaCBpcyBcZkluYnl0ZXNcZlAgYnl0ZXMgb2YgdXNlciBkYXRhJy4pCitUaGVyZSB3YXMgbm8gcGlnZ3ktYmFja2VkIGFjaywgdGhlIGF2YWlsYWJsZSByZWNlaXZlIHdpbmRvdyB3YXMgNDA5NgorYnl0ZXMgYW5kIHRoZXJlIHdhcyBhIG1heC1zZWdtZW50LXNpemUgb3B0aW9uIHJlcXVlc3RpbmcgYW4gbXNzIG9mCisxMDI0IGJ5dGVzLgorLkxQCitDc2FtIHJlcGxpZXMgd2l0aCBhIHNpbWlsYXIgcGFja2V0IGV4Y2VwdCBpdCBpbmNsdWRlcyBhIHBpZ2d5LWJhY2tlZAorYWNrIGZvciBydHNnJ3MgU1lOLgorUnRzZyB0aGVuIGFja3MgY3NhbSdzIFNZTi4KK1RoZSBgLicgbWVhbnMgbm8KK2ZsYWdzIHdlcmUgc2V0LgorVGhlIHBhY2tldCBjb250YWluZWQgbm8gZGF0YSBzbyB0aGVyZSBpcyBubyBkYXRhIHNlcXVlbmNlIG51bWJlci4KK05vdGUgdGhhdCB0aGUgYWNrIHNlcXVlbmNlCitudW1iZXIgaXMgYSBzbWFsbCBpbnRlZ2VyICgxKS4KK1RoZSBmaXJzdCB0aW1lIFxmSXRjcGR1bXBcZlAgc2VlcyBhCit0Y3AgYGNvbnZlcnNhdGlvbicsIGl0IHByaW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gdGhlIHBhY2tldC4KK09uIHN1YnNlcXVlbnQgcGFja2V0cyBvZiB0aGUgY29udmVyc2F0aW9uLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCit0aGUgY3VycmVudCBwYWNrZXQncyBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoaXMgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIKK2lzIHByaW50ZWQuCitUaGlzIG1lYW5zIHRoYXQgc2VxdWVuY2UgbnVtYmVycyBhZnRlciB0aGUKK2ZpcnN0IGNhbiBiZSBpbnRlcnByZXRlZAorYXMgcmVsYXRpdmUgYnl0ZSBwb3NpdGlvbnMgaW4gdGhlIGNvbnZlcnNhdGlvbidzIGRhdGEgc3RyZWFtICh3aXRoIHRoZQorZmlyc3QgZGF0YSBieXRlIGVhY2ggZGlyZWN0aW9uIGJlaW5nIGAxJykuCitgLVMnIHdpbGwgb3ZlcnJpZGUgdGhpcworZmVhdHVyZSwgY2F1c2luZyB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgbnVtYmVycyB0byBiZSBvdXRwdXQuCisuTFAKK09uIHRoZSA2dGggbGluZSwgcnRzZyBzZW5kcyBjc2FtIDE5IGJ5dGVzIG9mIGRhdGEgKGJ5dGVzIDIgdGhyb3VnaCAyMAoraW4gdGhlIHJ0c2cgXCgtPiBjc2FtIHNpZGUgb2YgdGhlIGNvbnZlcnNhdGlvbikuCitUaGUgUFVTSCBmbGFnIGlzIHNldCBpbiB0aGUgcGFja2V0LgorT24gdGhlIDd0aCBsaW5lLCBjc2FtIHNheXMgaXQncyByZWNlaXZlZCBkYXRhIHNlbnQgYnkgcnRzZyB1cCB0bworYnV0IG5vdCBpbmNsdWRpbmcgYnl0ZSAyMS4KK01vc3Qgb2YgdGhpcyBkYXRhIGlzIGFwcGFyZW50bHkgc2l0dGluZyBpbiB0aGUKK3NvY2tldCBidWZmZXIgc2luY2UgY3NhbSdzIHJlY2VpdmUgd2luZG93IGhhcyBnb3R0ZW4gMTkgYnl0ZXMgc21hbGxlci4KK0NzYW0gYWxzbyBzZW5kcyBvbmUgYnl0ZSBvZiBkYXRhIHRvIHJ0c2cgaW4gdGhpcyBwYWNrZXQuCitPbiB0aGUgOHRoIGFuZCA5dGggbGluZXMsCitjc2FtIHNlbmRzIHR3byBieXRlcyBvZiB1cmdlbnQsIHB1c2hlZCBkYXRhIHRvIHJ0c2cuCisuTFAKK0lmIHRoZSBzbmFwc2hvdCB3YXMgc21hbGwgZW5vdWdoIHRoYXQgXGZJdGNwZHVtcFxmUCBkaWRuJ3QgY2FwdHVyZQordGhlIGZ1bGwgVENQIGhlYWRlciwgaXQgaW50ZXJwcmV0cyBhcyBtdWNoIG9mIHRoZSBoZWFkZXIgYXMgaXQgY2FuCithbmQgdGhlbiByZXBvcnRzIGBgW3xcZkl0Y3BcZlBdJycgdG8gaW5kaWNhdGUgdGhlIHJlbWFpbmRlciBjb3VsZCBub3QKK2JlIGludGVycHJldGVkLgorSWYgdGhlIGhlYWRlciBjb250YWlucyBhIGJvZ3VzIG9wdGlvbiAob25lIHdpdGggYSBsZW5ndGgKK3RoYXQncyBlaXRoZXIgdG9vIHNtYWxsIG9yIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIpLCBcZkl0Y3BkdW1wXGZQCityZXBvcnRzIGl0IGFzIGBgW1xmSWJhZCBvcHRcZlBdJycgYW5kIGRvZXMgbm90IGludGVycHJldCBhbnkgZnVydGhlcgorb3B0aW9ucyAoc2luY2UgaXQncyBpbXBvc3NpYmxlIHRvIHRlbGwgd2hlcmUgdGhleSBzdGFydCkuCitJZiB0aGUgaGVhZGVyCitsZW5ndGggaW5kaWNhdGVzIG9wdGlvbnMgYXJlIHByZXNlbnQgYnV0IHRoZSBJUCBkYXRhZ3JhbSBsZW5ndGggaXMgbm90Citsb25nIGVub3VnaCBmb3IgdGhlIG9wdGlvbnMgdG8gYWN0dWFsbHkgYmUgdGhlcmUsIFxmSXRjcGR1bXBcZlAgcmVwb3J0cworaXQgYXMgYGBbXGZJYmFkIGhkciBsZW5ndGhcZlBdJycuCisuSEQKKy5CIENhcHR1cmluZyBUQ1AgcGFja2V0cyB3aXRoIHBhcnRpY3VsYXIgZmxhZyBjb21iaW5hdGlvbnMgKFNZTi1BQ0ssIFVSRy1BQ0ssIGV0Yy4pCisuUFAKK1RoZXJlIGFyZSA4IGJpdHMgaW4gdGhlIGNvbnRyb2wgYml0cyBzZWN0aW9uIG9mIHRoZSBUQ1AgaGVhZGVyOgorLklQCisuSSBDV1IgfCBFQ0UgfCBVUkcgfCBBQ0sgfCBQU0ggfCBSU1QgfCBTWU4gfCBGSU4KKy5QUAorTGV0J3MgYXNzdW1lIHRoYXQgd2Ugd2FudCB0byB3YXRjaCBwYWNrZXRzIHVzZWQgaW4gZXN0YWJsaXNoaW5nCithIFRDUCBjb25uZWN0aW9uLgorUmVjYWxsIHRoYXQgVENQIHVzZXMgYSAzLXdheSBoYW5kc2hha2UgcHJvdG9jb2wKK3doZW4gaXQgaW5pdGlhbGl6ZXMgYSBuZXcgY29ubmVjdGlvbjsgdGhlIGNvbm5lY3Rpb24gc2VxdWVuY2Ugd2l0aAorcmVnYXJkIHRvIHRoZSBUQ1AgY29udHJvbCBiaXRzIGlzCisuUFAKKy5SUworMSkgQ2FsbGVyIHNlbmRzIFNZTgorLlJFCisuUlMKKzIpIFJlY2lwaWVudCByZXNwb25kcyB3aXRoIFNZTiwgQUNLCisuUkUKKy5SUworMykgQ2FsbGVyIHNlbmRzIEFDSworLlJFCisuUFAKK05vdyB3ZSdyZSBpbnRlcmVzdGVkIGluIGNhcHR1cmluZyBwYWNrZXRzIHRoYXQgaGF2ZSBvbmx5IHRoZQorU1lOIGJpdCBzZXQgKFN0ZXAgMSkuCitOb3RlIHRoYXQgd2UgZG9uJ3Qgd2FudCBwYWNrZXRzIGZyb20gc3RlcCAyCisoU1lOLUFDSyksIGp1c3QgYSBwbGFpbiBpbml0aWFsIFNZTi4KK1doYXQgd2UgbmVlZCBpcyBhIGNvcnJlY3QgZmlsdGVyCitleHByZXNzaW9uIGZvciBcZkl0Y3BkdW1wXGZQLgorLlBQCitSZWNhbGwgdGhlIHN0cnVjdHVyZSBvZiBhIFRDUCBoZWFkZXIgd2l0aG91dCBvcHRpb25zOgorLlBQCisubmYKKyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8ICAgICAgICAgIHNvdXJjZSBwb3J0ICAgICAgICAgIHwgICAgICAgZGVzdGluYXRpb24gcG9ydCAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCAgICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdtZW50IG51bWJlciAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8ICBITCAgIHwgcnN2ZCAgfEN8RXxVfEF8UHxSfFN8RnwgICAgICAgIHdpbmRvdyBzaXplICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgICAgICAgICBUQ1AgY2hlY2tzdW0gICAgICAgICAgfCAgICAgICB1cmdlbnQgcG9pbnRlciAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLmZpCisuUFAKK0EgVENQIGhlYWRlciB1c3VhbGx5IGhvbGRzIDIwIG9jdGV0cyBvZiBkYXRhLCB1bmxlc3Mgb3B0aW9ucyBhcmUKK3ByZXNlbnQuCitUaGUgZmlyc3QgbGluZSBvZiB0aGUgZ3JhcGggY29udGFpbnMgb2N0ZXRzIDAgLSAzLCB0aGUKK3NlY29uZCBsaW5lIHNob3dzIG9jdGV0cyA0IC0gNyBldGMuCisuUFAKK1N0YXJ0aW5nIHRvIGNvdW50IHdpdGggMCwgdGhlIHJlbGV2YW50IFRDUCBjb250cm9sIGJpdHMgYXJlIGNvbnRhaW5lZAoraW4gb2N0ZXQgMTM6CisuUFAKKy5uZgorIDAgICAgICAgICAgICAgN3wgICAgICAgICAgICAgMTV8ICAgICAgICAgICAgIDIzfCAgICAgICAgICAgICAzMQorLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KK3wgIEhMICAgfCByc3ZkICB8Q3xFfFV8QXxQfFJ8U3xGfCAgICAgICAgd2luZG93IHNpemUgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQorfCAgICAgICAgICAgICAgIHwgIDEzdGggb2N0ZXQgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKy5maQorLlBQCitMZXQncyBoYXZlIGEgY2xvc2VyIGxvb2sgYXQgb2N0ZXQgbm8uIDEzOgorLlBQCisubmYKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgfEN8RXxVfEF8UHxSfFN8RnwKKyAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgIHw3ICAgNSAgIDMgICAgIDB8CisuZmkKKy5QUAorVGhlc2UgYXJlIHRoZSBUQ1AgY29udHJvbCBiaXRzIHdlIGFyZSBpbnRlcmVzdGVkCitpbi4KK1dlIGhhdmUgbnVtYmVyZWQgdGhlIGJpdHMgaW4gdGhpcyBvY3RldCBmcm9tIDAgdG8gNywgcmlnaHQgdG8KK2xlZnQsIHNvIHRoZSBQU0ggYml0IGlzIGJpdCBudW1iZXIgMywgd2hpbGUgdGhlIFVSRyBiaXQgaXMgbnVtYmVyIDUuCisuUFAKK1JlY2FsbCB0aGF0IHdlIHdhbnQgdG8gY2FwdHVyZSBwYWNrZXRzIHdpdGggb25seSBTWU4gc2V0LgorTGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB0byBvY3RldCAxMyBpZiBhIFRDUCBkYXRhZ3JhbSBhcnJpdmVzCit3aXRoIHRoZSBTWU4gYml0IHNldCBpbiBpdHMgaGVhZGVyOgorLlBQCisubmYKKyAgICAgICAgICAgICAgICB8Q3xFfFV8QXxQfFJ8U3xGfAorICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS18CisgICAgICAgICAgICAgICAgfDAgMCAwIDAgMCAwIDEgMHwKKyAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfAorICAgICAgICAgICAgICAgIHw3IDYgNSA0IDMgMiAxIDB8CisuZmkKKy5QUAorTG9va2luZyBhdCB0aGUKK2NvbnRyb2wgYml0cyBzZWN0aW9uIHdlIHNlZSB0aGF0IG9ubHkgYml0IG51bWJlciAxIChTWU4pIGlzIHNldC4KKy5QUAorQXNzdW1pbmcgdGhhdCBvY3RldCBudW1iZXIgMTMgaXMgYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbgorbmV0d29yayBieXRlIG9yZGVyLCB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoaXMgb2N0ZXQgaXMKKy5JUAorMDAwMDAwMTAKKy5QUAorYW5kIGl0cyBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGlzCisuUFAKKy5uZgorICAgNyAgICAgNiAgICAgNSAgICAgNCAgICAgMyAgICAgMiAgICAgMSAgICAgMAorMCoyICsgMCoyICsgMCoyICsgMCoyICsgMCoyICsgMCoyICsgMSoyICsgMCoyICA9ICAyCisuZmkKKy5QUAorV2UncmUgYWxtb3N0IGRvbmUsIGJlY2F1c2Ugbm93IHdlIGtub3cgdGhhdCBpZiBvbmx5IFNZTiBpcyBzZXQsCit0aGUgdmFsdWUgb2YgdGhlIDEzdGggb2N0ZXQgaW4gdGhlIFRDUCBoZWFkZXIsIHdoZW4gaW50ZXJwcmV0ZWQKK2FzIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIG11c3QgYmUgZXhhY3RseSAyLgorLlBQCitUaGlzIHJlbGF0aW9uc2hpcCBjYW4gYmUgZXhwcmVzc2VkIGFzCisuUlMKKy5CCit0Y3BbMTNdID09IDIKKy5SRQorLlBQCitXZSBjYW4gdXNlIHRoaXMgZXhwcmVzc2lvbiBhcyB0aGUgZmlsdGVyIGZvciBcZkl0Y3BkdW1wXGZQIGluIG9yZGVyCit0byB3YXRjaCBwYWNrZXRzIHdoaWNoIGhhdmUgb25seSBTWU4gc2V0OgorLlJTCisuQgordGNwZHVtcCAtaSB4bDAgdGNwWzEzXSA9PSAyCisuUkUKKy5QUAorVGhlIGV4cHJlc3Npb24gc2F5cyAibGV0IHRoZSAxM3RoIG9jdGV0IG9mIGEgVENQIGRhdGFncmFtIGhhdmUKK3RoZSBkZWNpbWFsIHZhbHVlIDIiLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KKy5QUAorTm93LCBsZXQncyBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGNhcHR1cmUgU1lOIHBhY2tldHMsIGJ1dCB3ZQorZG9uJ3QgY2FyZSBpZiBBQ0sgb3IgYW55IG90aGVyIFRDUCBjb250cm9sIGJpdCBpcyBzZXQgYXQgdGhlCitzYW1lIHRpbWUuCitMZXQncyBzZWUgd2hhdCBoYXBwZW5zIHRvIG9jdGV0IDEzIHdoZW4gYSBUQ1AgZGF0YWdyYW0KK3dpdGggU1lOLUFDSyBzZXQgYXJyaXZlczoKKy5QUAorLm5mCisgICAgIHxDfEV8VXxBfFB8UnxTfEZ8CisgICAgIHwtLS0tLS0tLS0tLS0tLS18CisgICAgIHwwIDAgMCAxIDAgMCAxIDB8CisgICAgIHwtLS0tLS0tLS0tLS0tLS18CisgICAgIHw3IDYgNSA0IDMgMiAxIDB8CisuZmkKKy5QUAorTm93IGJpdHMgMSBhbmQgNCBhcmUgc2V0IGluIHRoZSAxM3RoIG9jdGV0LgorVGhlIGJpbmFyeSB2YWx1ZSBvZgorb2N0ZXQgMTMgaXMKKy5JUAorICAgICAwMDAxMDAxMAorLlBQCit3aGljaCB0cmFuc2xhdGVzIHRvIGRlY2ltYWwKKy5QUAorLm5mCisgICA3ICAgICA2ICAgICA1ICAgICA0ICAgICAzICAgICAyICAgICAxICAgICAwCiswKjIgKyAwKjIgKyAwKjIgKyAxKjIgKyAwKjIgKyAwKjIgKyAxKjIgKyAwKjIgICA9IDE4CisuZmkKKy5QUAorTm93IHdlIGNhbid0IGp1c3QgdXNlICd0Y3BbMTNdID09IDE4JyBpbiB0aGUgXGZJdGNwZHVtcFxmUCBmaWx0ZXIKK2V4cHJlc3Npb24sIGJlY2F1c2UgdGhhdCB3b3VsZCBzZWxlY3Qgb25seSB0aG9zZSBwYWNrZXRzIHRoYXQgaGF2ZQorU1lOLUFDSyBzZXQsIGJ1dCBub3QgdGhvc2Ugd2l0aCBvbmx5IFNZTiBzZXQuCitSZW1lbWJlciB0aGF0IHdlIGRvbid0IGNhcmUKK2lmIEFDSyBvciBhbnkgb3RoZXIgY29udHJvbCBiaXQgaXMgc2V0IGFzIGxvbmcgYXMgU1lOIGlzIHNldC4KKy5QUAorSW4gb3JkZXIgdG8gYWNoaWV2ZSBvdXIgZ29hbCwgd2UgbmVlZCB0byBsb2dpY2FsbHkgQU5EIHRoZQorYmluYXJ5IHZhbHVlIG9mIG9jdGV0IDEzIHdpdGggc29tZSBvdGhlciB2YWx1ZSB0byBwcmVzZXJ2ZQordGhlIFNZTiBiaXQuCitXZSBrbm93IHRoYXQgd2Ugd2FudCBTWU4gdG8gYmUgc2V0IGluIGFueSBjYXNlLAorc28gd2UnbGwgbG9naWNhbGx5IEFORCB0aGUgdmFsdWUgaW4gdGhlIDEzdGggb2N0ZXQgd2l0aAordGhlIGJpbmFyeSB2YWx1ZSBvZiBhIFNZTjoKKy5QUAorLm5mCisKKyAgICAgICAgICAwMDAxMDAxMCBTWU4tQUNLICAgICAgICAgICAgICAwMDAwMDAxMCBTWU4KKyAgICAgQU5EICAwMDAwMDAxMCAod2Ugd2FudCBTWU4pICAgQU5EICAwMDAwMDAxMCAod2Ugd2FudCBTWU4pCisgICAgICAgICAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0KKyAgICAgPSAgICAwMDAwMDAxMCAgICAgICAgICAgICAgICAgPSAgICAwMDAwMDAxMAorLmZpCisuUFAKK1dlIHNlZSB0aGF0IHRoaXMgQU5EIG9wZXJhdGlvbiBkZWxpdmVycyB0aGUgc2FtZSByZXN1bHQKK3JlZ2FyZGxlc3Mgd2hldGhlciBBQ0sgb3IgYW5vdGhlciBUQ1AgY29udHJvbCBiaXQgaXMgc2V0LgorVGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFORCB2YWx1ZSBhcyB3ZWxsIGFzCit0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGlzIDIgKGJpbmFyeSAwMDAwMDAxMCksCitzbyB3ZSBrbm93IHRoYXQgZm9yIHBhY2tldHMgd2l0aCBTWU4gc2V0IHRoZSBmb2xsb3dpbmcKK3JlbGF0aW9uIG11c3QgaG9sZCB0cnVlOgorLklQCisoICggdmFsdWUgb2Ygb2N0ZXQgMTMgKSBBTkQgKCAyICkgKSA9PSAoIDIgKQorLlBQCitUaGlzIHBvaW50cyB1cyB0byB0aGUgXGZJdGNwZHVtcFxmUCBmaWx0ZXIgZXhwcmVzc2lvbgorLlJTCisuQgorICAgICB0Y3BkdW1wIC1pIHhsMCAndGNwWzEzXSAmIDIgPT0gMicKKy5SRQorLlBQCitOb3RlIHRoYXQgeW91IHNob3VsZCB1c2Ugc2luZ2xlIHF1b3RlcyBvciBhIGJhY2tzbGFzaAoraW4gdGhlIGV4cHJlc3Npb24gdG8gaGlkZSB0aGUgQU5EICgnJicpIHNwZWNpYWwgY2hhcmFjdGVyCitmcm9tIHRoZSBzaGVsbC4KKy5IRAorLkIKK1VEUCBQYWNrZXRzCisuTFAKK1VEUCBmb3JtYXQgaXMgaWxsdXN0cmF0ZWQgYnkgdGhpcyByd2hvIHBhY2tldDoKKy5SUworLm5mCisuc3AgLjUKK1xmKENXYWN0aW5pZGUud2hvID4gYnJvYWRjYXN0LndobzogdWRwIDg0XGZQCisuc3AgLjUKKy5maQorLlJFCitUaGlzIHNheXMgdGhhdCBwb3J0IFxmSXdob1xmUCBvbiBob3N0IFxmSWFjdGluaWRlXGZQIHNlbnQgYSB1ZHAKK2RhdGFncmFtIHRvIHBvcnQgXGZJd2hvXGZQIG9uIGhvc3QgXGZJYnJvYWRjYXN0XGZQLCB0aGUgSW50ZXJuZXQKK2Jyb2FkY2FzdCBhZGRyZXNzLgorVGhlIHBhY2tldCBjb250YWluZWQgODQgYnl0ZXMgb2YgdXNlciBkYXRhLgorLkxQCitTb21lIFVEUCBzZXJ2aWNlcyBhcmUgcmVjb2duaXplZCAoZnJvbSB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uCitwb3J0IG51bWJlcikgYW5kIHRoZSBoaWdoZXIgbGV2ZWwgcHJvdG9jb2wgaW5mb3JtYXRpb24gcHJpbnRlZC4KK0luIHBhcnRpY3VsYXIsIERvbWFpbiBOYW1lIHNlcnZpY2UgcmVxdWVzdHMgKFJGQy0xMDM0LzEwMzUpIGFuZCBTdW4KK1JQQyBjYWxscyAoUkZDLTEwNTApIHRvIE5GUy4KKy5IRAorVURQIE5hbWUgU2VydmVyIFJlcXVlc3RzCisuTFAKK1xmSShOLkIuOlRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gYXNzdW1lcyBmYW1pbGlhcml0eSB3aXRoCit0aGUgRG9tYWluIFNlcnZpY2UgcHJvdG9jb2wgZGVzY3JpYmVkIGluIFJGQy0xMDM1LgorSWYgeW91IGFyZSBub3QgZmFtaWxpYXIKK3dpdGggdGhlIHByb3RvY29sLCB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIHdpbGwgYXBwZWFyIHRvIGJlIHdyaXR0ZW4KK2luIGdyZWVrLilcZlAKKy5MUAorTmFtZSBzZXJ2ZXIgcmVxdWVzdHMgYXJlIGZvcm1hdHRlZCBhcworLlJTCisubmYKKy5zcCAuNQorXGZJc3JjID4gZHN0OiBpZCBvcD8gZmxhZ3MgcXR5cGUgcWNsYXNzIG5hbWUgKGxlbilcZlAKKy5zcCAuNQorXGYoQ1doMm9wb2xvLjE1MzggPiBoZWxpb3MuZG9tYWluOiAzKyBBPyB1Y2J2YXguYmVya2VsZXkuZWR1LiAoMzcpXGZSCisuc3AgLjUKKy5maQorLlJFCitIb3N0IFxmSWgyb3BvbG9cZlAgYXNrZWQgdGhlIGRvbWFpbiBzZXJ2ZXIgb24gXGZJaGVsaW9zXGZQIGZvciBhbgorYWRkcmVzcyByZWNvcmQgKHF0eXBlPUEpIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBcZkl1Y2J2YXguYmVya2VsZXkuZWR1LlxmUAorVGhlIHF1ZXJ5IGlkIHdhcyBgMycuCitUaGUgYCsnIGluZGljYXRlcyB0aGUgXGZJcmVjdXJzaW9uIGRlc2lyZWRcZlAgZmxhZword2FzIHNldC4KK1RoZSBxdWVyeSBsZW5ndGggd2FzIDM3IGJ5dGVzLCBub3QgaW5jbHVkaW5nIHRoZSBVRFAgYW5kCitJUCBwcm90b2NvbCBoZWFkZXJzLgorVGhlIHF1ZXJ5IG9wZXJhdGlvbiB3YXMgdGhlIG5vcm1hbCBvbmUsIFxmSVF1ZXJ5XGZQLAorc28gdGhlIG9wIGZpZWxkIHdhcyBvbWl0dGVkLgorSWYgdGhlIG9wIGhhZCBiZWVuIGFueXRoaW5nIGVsc2UsIGl0IHdvdWxkCitoYXZlIGJlZW4gcHJpbnRlZCBiZXR3ZWVuIHRoZSBgMycgYW5kIHRoZSBgKycuCitTaW1pbGFybHksIHRoZSBxY2xhc3Mgd2FzIHRoZSBub3JtYWwgb25lLAorXGZJQ19JTlxmUCwgYW5kIG9taXR0ZWQuCitBbnkgb3RoZXIgcWNsYXNzIHdvdWxkIGhhdmUgYmVlbiBwcmludGVkCitpbW1lZGlhdGVseSBhZnRlciB0aGUgYEEnLgorLkxQCitBIGZldyBhbm9tYWxpZXMgYXJlIGNoZWNrZWQgYW5kIG1heSByZXN1bHQgaW4gZXh0cmEgZmllbGRzIGVuY2xvc2VkIGluCitzcXVhcmUgYnJhY2tldHM6ICBJZiBhIHF1ZXJ5IGNvbnRhaW5zIGFuIGFuc3dlciwgYXV0aG9yaXR5IHJlY29yZHMgb3IKK2FkZGl0aW9uYWwgcmVjb3JkcyBzZWN0aW9uLAorLklSIGFuY291bnQgLAorLklSIG5zY291bnQgLAorb3IKKy5JIGFyY291bnQKK2FyZSBwcmludGVkIGFzIGBbXGZJblxmUGFdJywgYFtcZkluXGZQbl0nIG9yICBgW1xmSW5cZlBhdV0nIHdoZXJlIFxmSW5cZlAKK2lzIHRoZSBhcHByb3ByaWF0ZSBjb3VudC4KK0lmIGFueSBvZiB0aGUgcmVzcG9uc2UgYml0cyBhcmUgc2V0IChBQSwgUkEgb3IgcmNvZGUpIG9yIGFueSBvZiB0aGUKK2BtdXN0IGJlIHplcm8nIGJpdHMgYXJlIHNldCBpbiBieXRlcyB0d28gYW5kIHRocmVlLCBgW2IyJjM9XGZJeFxmUF0nCitpcyBwcmludGVkLCB3aGVyZSBcZkl4XGZQIGlzIHRoZSBoZXggdmFsdWUgb2YgaGVhZGVyIGJ5dGVzIHR3byBhbmQgdGhyZWUuCisuSEQKK1VEUCBOYW1lIFNlcnZlciBSZXNwb25zZXMKKy5MUAorTmFtZSBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBmb3JtYXR0ZWQgYXMKKy5SUworLm5mCisuc3AgLjUKK1xmSXNyYyA+IGRzdDogIGlkIG9wIHJjb2RlIGZsYWdzIGEvbi9hdSB0eXBlIGNsYXNzIGRhdGEgKGxlbilcZlAKKy5zcCAuNQorXGYoQ1doZWxpb3MuZG9tYWluID4gaDJvcG9sby4xNTM4OiAzIDMvMy83IEEgMTI4LjMyLjEzNy4zICgyNzMpCitoZWxpb3MuZG9tYWluID4gaDJvcG9sby4xNTM3OiAyIE5YRG9tYWluKiAwLzEvMCAoOTcpXGZSCisuc3AgLjUKKy5maQorLlJFCitJbiB0aGUgZmlyc3QgZXhhbXBsZSwgXGZJaGVsaW9zXGZQIHJlc3BvbmRzIHRvIHF1ZXJ5IGlkIDMgZnJvbSBcZkloMm9wb2xvXGZQCit3aXRoIDMgYW5zd2VyIHJlY29yZHMsIDMgbmFtZSBzZXJ2ZXIgcmVjb3JkcyBhbmQgNyBhZGRpdGlvbmFsIHJlY29yZHMuCitUaGUgZmlyc3QgYW5zd2VyIHJlY29yZCBpcyB0eXBlIEEgKGFkZHJlc3MpIGFuZCBpdHMgZGF0YSBpcyBpbnRlcm5ldAorYWRkcmVzcyAxMjguMzIuMTM3LjMuCitUaGUgdG90YWwgc2l6ZSBvZiB0aGUgcmVzcG9uc2Ugd2FzIDI3MyBieXRlcywKK2V4Y2x1ZGluZyBVRFAgYW5kIElQIGhlYWRlcnMuCitUaGUgb3AgKFF1ZXJ5KSBhbmQgcmVzcG9uc2UgY29kZQorKE5vRXJyb3IpIHdlcmUgb21pdHRlZCwgYXMgd2FzIHRoZSBjbGFzcyAoQ19JTikgb2YgdGhlIEEgcmVjb3JkLgorLkxQCitJbiB0aGUgc2Vjb25kIGV4YW1wbGUsIFxmSWhlbGlvc1xmUCByZXNwb25kcyB0byBxdWVyeSAyIHdpdGggYQorcmVzcG9uc2UgY29kZSBvZiBub24tZXhpc3RlbnQgZG9tYWluIChOWERvbWFpbikgd2l0aCBubyBhbnN3ZXJzLAorb25lIG5hbWUgc2VydmVyIGFuZCBubyBhdXRob3JpdHkgcmVjb3Jkcy4KK1RoZSBgKicgaW5kaWNhdGVzIHRoYXQKK3RoZSBcZklhdXRob3JpdGF0aXZlIGFuc3dlclxmUCBiaXQgd2FzIHNldC4KK1NpbmNlIHRoZXJlIHdlcmUgbm8KK2Fuc3dlcnMsIG5vIHR5cGUsIGNsYXNzIG9yIGRhdGEgd2VyZSBwcmludGVkLgorLkxQCitPdGhlciBmbGFnIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgYXJlIGBcLScgKHJlY3Vyc2lvbiBhdmFpbGFibGUsCitSQSwgXGZJbm90XGZQIHNldCkgYW5kIGB8JyAodHJ1bmNhdGVkIG1lc3NhZ2UsIFRDLCBzZXQpLgorSWYgdGhlCitgcXVlc3Rpb24nIHNlY3Rpb24gZG9lc24ndCBjb250YWluIGV4YWN0bHkgb25lIGVudHJ5LCBgW1xmSW5cZlBxXScKK2lzIHByaW50ZWQuCisuTFAKK05vdGUgdGhhdCBuYW1lIHNlcnZlciByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIHRlbmQgdG8gYmUgbGFyZ2UgYW5kIHRoZQorZGVmYXVsdCBcZklzbmFwbGVuXGZQIG9mIDY4IGJ5dGVzIG1heSBub3QgY2FwdHVyZSBlbm91Z2ggb2YgdGhlIHBhY2tldAordG8gcHJpbnQuCitVc2UgdGhlIFxmQlwtc1xmUCBmbGFnIHRvIGluY3JlYXNlIHRoZSBzbmFwbGVuIGlmIHlvdQorbmVlZCB0byBzZXJpb3VzbHkgaW52ZXN0aWdhdGUgbmFtZSBzZXJ2ZXIgdHJhZmZpYy4KK2BcZkJcLXMgMTI4XGZQJworaGFzIHdvcmtlZCB3ZWxsIGZvciBtZS4KKworLkhECitTTUIvQ0lGUyBkZWNvZGluZworLkxQCitcZkl0Y3BkdW1wXGZQIG5vdyBpbmNsdWRlcyBmYWlybHkgZXh0ZW5zaXZlIFNNQi9DSUZTL05CVCBkZWNvZGluZyBmb3IgZGF0YQorb24gVURQLzEzNywgVURQLzEzOCBhbmQgVENQLzEzOS4KK1NvbWUgcHJpbWl0aXZlIGRlY29kaW5nIG9mIElQWCBhbmQKK05ldEJFVUkgU01CIGRhdGEgaXMgYWxzbyBkb25lLgorCitCeSBkZWZhdWx0IGEgZmFpcmx5IG1pbmltYWwgZGVjb2RlIGlzIGRvbmUsIHdpdGggYSBtdWNoIG1vcmUgZGV0YWlsZWQKK2RlY29kZSBkb25lIGlmIC12IGlzIHVzZWQuCitCZSB3YXJuZWQgdGhhdCB3aXRoIC12IGEgc2luZ2xlIFNNQiBwYWNrZXQKK21heSB0YWtlIHVwIGEgcGFnZSBvciBtb3JlLCBzbyBvbmx5IHVzZSAtdiBpZiB5b3UgcmVhbGx5IHdhbnQgYWxsIHRoZQorZ29yeSBkZXRhaWxzLgorCitGb3IgaW5mb3JtYXRpb24gb24gU01CIHBhY2tldCBmb3JtYXRzIGFuZCB3aGF0IGFsbCB0ZSBmaWVsZHMgbWVhbiBzZWUKK3d3dy5jaWZzLm9yZyBvciB0aGUgcHViL3NhbWJhL3NwZWNzLyBkaXJlY3Rvcnkgb24geW91ciBmYXZvcml0ZQorc2FtYmEub3JnIG1pcnJvciBzaXRlLgorVGhlIFNNQiBwYXRjaGVzIHdlcmUgd3JpdHRlbiBieSBBbmRyZXcgVHJpZGdlbGwKKyh0cmlkZ2VAc2FtYmEub3JnKS4KKworLkhECitORlMgUmVxdWVzdHMgYW5kIFJlcGxpZXMKKy5MUAorU3VuIE5GUyAoTmV0d29yayBGaWxlIFN5c3RlbSkgcmVxdWVzdHMgYW5kIHJlcGxpZXMgYXJlIHByaW50ZWQgYXM6CisuUlMKKy5uZgorLnNwIC41CitcZklzcmMueGlkID4gZHN0Lm5mczogbGVuIG9wIGFyZ3NcZlAKK1xmSXNyYy5uZnMgPiBkc3QueGlkOiByZXBseSBzdGF0IGxlbiBvcCByZXN1bHRzXGZQCisuc3AgLjUKK1xmKENXCitzdXNoaS42NzA5ID4gd3JsLm5mczogMTEyIHJlYWRsaW5rIGZoIDIxLDI0LzEwLjczMTY1Cit3cmwubmZzID4gc3VzaGkuNjcwOTogcmVwbHkgb2sgNDAgcmVhZGxpbmsgIi4uL3ZhciIKK3N1c2hpLjIwMWIgPiB3cmwubmZzOgorCTE0NCBsb29rdXAgZmggOSw3NC80MDk2LjY4NzggInhjb2xvcnMiCit3cmwubmZzID4gc3VzaGkuMjAxYjoKKwlyZXBseSBvayAxMjggbG9va3VwIGZoIDksNzQvNDEzNC4zMTUwCitcZlIKKy5zcCAuNQorLmZpCisuUkUKK0luIHRoZSBmaXJzdCBsaW5lLCBob3N0IFxmSXN1c2hpXGZQIHNlbmRzIGEgdHJhbnNhY3Rpb24gd2l0aCBpZCBcZkk2NzA5XGZQCit0byBcZkl3cmxcZlAgKG5vdGUgdGhhdCB0aGUgbnVtYmVyIGZvbGxvd2luZyB0aGUgc3JjIGhvc3QgaXMgYQordHJhbnNhY3Rpb24gaWQsIFxmSW5vdFxmUCB0aGUgc291cmNlIHBvcnQpLgorVGhlIHJlcXVlc3Qgd2FzIDExMiBieXRlcywKK2V4Y2x1ZGluZyB0aGUgVURQIGFuZCBJUCBoZWFkZXJzLgorVGhlIG9wZXJhdGlvbiB3YXMgYSBcZklyZWFkbGlua1xmUAorKHJlYWQgc3ltYm9saWMgbGluaykgb24gZmlsZSBoYW5kbGUgKFxmSWZoXGZQKSAyMSwyNC8xMC43MzE2NTcxMTkuCisoSWYgb25lIGlzIGx1Y2t5LCBhcyBpbiB0aGlzIGNhc2UsIHRoZSBmaWxlIGhhbmRsZSBjYW4gYmUgaW50ZXJwcmV0ZWQKK2FzIGEgbWFqb3IsbWlub3IgZGV2aWNlIG51bWJlciBwYWlyLCBmb2xsb3dlZCBieSB0aGUgaW5vZGUgbnVtYmVyIGFuZAorZ2VuZXJhdGlvbiBudW1iZXIuKQorXGZJV3JsXGZQIHJlcGxpZXMgYG9rJyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbGluay4KKy5MUAorSW4gdGhlIHRoaXJkIGxpbmUsIFxmSXN1c2hpXGZQIGFza3MgXGZJd3JsXGZQIHRvIGxvb2t1cCB0aGUgbmFtZQorYFxmSXhjb2xvcnNcZlAnIGluIGRpcmVjdG9yeSBmaWxlIDksNzQvNDA5Ni42ODc4LgorTm90ZSB0aGF0IHRoZSBkYXRhIHByaW50ZWQKK2RlcGVuZHMgb24gdGhlIG9wZXJhdGlvbiB0eXBlLgorVGhlIGZvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmCitleHBsYW5hdG9yeSBpZiByZWFkIGluIGNvbmp1bmN0aW9uIHdpdGgKK2FuIE5GUyBwcm90b2NvbCBzcGVjLgorLkxQCitJZiB0aGUgXC12ICh2ZXJib3NlKSBmbGFnIGlzIGdpdmVuLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQuCitGb3IgZXhhbXBsZToKKy5SUworLm5mCisuc3AgLjUKK1xmKENXCitzdXNoaS4xMzcyYSA+IHdybC5uZnM6CisJMTQ4IHJlYWQgZmggMjEsMTEvMTIuMTk1IDgxOTIgYnl0ZXMgQCAyNDU3Ngord3JsLm5mcyA+IHN1c2hpLjEzNzJhOgorCXJlcGx5IG9rIDE0NzIgcmVhZCBSRUcgMTAwNjY0IGlkcyA0MTcvMCBzeiAyOTM4OAorXGZQCisuc3AgLjUKKy5maQorLlJFCisoXC12IGFsc28gcHJpbnRzIHRoZSBJUCBoZWFkZXIgVFRMLCBJRCwgbGVuZ3RoLCBhbmQgZnJhZ21lbnRhdGlvbiBmaWVsZHMsCit3aGljaCBoYXZlIGJlZW4gb21pdHRlZCBmcm9tIHRoaXMgZXhhbXBsZS4pICBJbiB0aGUgZmlyc3QgbGluZSwKK1xmSXN1c2hpXGZQIGFza3MgXGZJd3JsXGZQIHRvIHJlYWQgODE5MiBieXRlcyBmcm9tIGZpbGUgMjEsMTEvMTIuMTk1LAorYXQgYnl0ZSBvZmZzZXQgMjQ1NzYuCitcZklXcmxcZlAgcmVwbGllcyBgb2snOyB0aGUgcGFja2V0IHNob3duIG9uIHRoZQorc2Vjb25kIGxpbmUgaXMgdGhlIGZpcnN0IGZyYWdtZW50IG9mIHRoZSByZXBseSwgYW5kIGhlbmNlIGlzIG9ubHkgMTQ3MgorYnl0ZXMgbG9uZyAodGhlIG90aGVyIGJ5dGVzIHdpbGwgZm9sbG93IGluIHN1YnNlcXVlbnQgZnJhZ21lbnRzLCBidXQKK3RoZXNlIGZyYWdtZW50cyBkbyBub3QgaGF2ZSBORlMgb3IgZXZlbiBVRFAgaGVhZGVycyBhbmQgc28gbWlnaHQgbm90IGJlCitwcmludGVkLCBkZXBlbmRpbmcgb24gdGhlIGZpbHRlciBleHByZXNzaW9uIHVzZWQpLgorQmVjYXVzZSB0aGUgXC12IGZsYWcKK2lzIGdpdmVuLCBzb21lIG9mIHRoZSBmaWxlIGF0dHJpYnV0ZXMgKHdoaWNoIGFyZSByZXR1cm5lZCBpbiBhZGRpdGlvbgordG8gdGhlIGZpbGUgZGF0YSkgYXJlIHByaW50ZWQ6IHRoZSBmaWxlIHR5cGUgKGBgUkVHJycsIGZvciByZWd1bGFyIGZpbGUpLAordGhlIGZpbGUgbW9kZSAoaW4gb2N0YWwpLCB0aGUgdWlkIGFuZCBnaWQsIGFuZCB0aGUgZmlsZSBzaXplLgorLkxQCitJZiB0aGUgXC12IGZsYWcgaXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGV2ZW4gbW9yZSBkZXRhaWxzIGFyZSBwcmludGVkLgorLkxQCitOb3RlIHRoYXQgTkZTIHJlcXVlc3RzIGFyZSB2ZXJ5IGxhcmdlIGFuZCBtdWNoIG9mIHRoZSBkZXRhaWwgd29uJ3QgYmUgcHJpbnRlZAordW5sZXNzIFxmSXNuYXBsZW5cZlAgaXMgaW5jcmVhc2VkLgorVHJ5IHVzaW5nIGBcZkJcLXMgMTkyXGZQJyB0byB3YXRjaAorTkZTIHRyYWZmaWMuCisuTFAKK05GUyByZXBseSBwYWNrZXRzIGRvIG5vdCBleHBsaWNpdGx5IGlkZW50aWZ5IHRoZSBSUEMgb3BlcmF0aW9uLgorSW5zdGVhZCwKK1xmSXRjcGR1bXBcZlAga2VlcHMgdHJhY2sgb2YgYGByZWNlbnQnJyByZXF1ZXN0cywgYW5kIG1hdGNoZXMgdGhlbSB0byB0aGUKK3JlcGxpZXMgdXNpbmcgdGhlIHRyYW5zYWN0aW9uIElELgorSWYgYSByZXBseSBkb2VzIG5vdCBjbG9zZWx5IGZvbGxvdyB0aGUKK2NvcnJlc3BvbmRpbmcgcmVxdWVzdCwgaXQgbWlnaHQgbm90IGJlIHBhcnNhYmxlLgorLkhECitBRlMgUmVxdWVzdHMgYW5kIFJlcGxpZXMKKy5MUAorVHJhbnNhcmMgQUZTIChBbmRyZXcgRmlsZSBTeXN0ZW0pIHJlcXVlc3RzIGFuZCByZXBsaWVzIGFyZSBwcmludGVkCithczoKKy5IRAorLlJTCisubmYKKy5zcCAuNQorXGZJc3JjLnNwb3J0ID4gZHN0LmRwb3J0OiByeCBwYWNrZXQtdHlwZVxmUAorXGZJc3JjLnNwb3J0ID4gZHN0LmRwb3J0OiByeCBwYWNrZXQtdHlwZSBzZXJ2aWNlIGNhbGwgY2FsbC1uYW1lIGFyZ3NcZlAKK1xmSXNyYy5zcG9ydCA+IGRzdC5kcG9ydDogcnggcGFja2V0LXR5cGUgc2VydmljZSByZXBseSBjYWxsLW5hbWUgYXJnc1xmUAorLnNwIC41CitcZihDVworZWx2aXMuNzAwMSA+IHBpa2UuYWZzZnM6CisJcnggZGF0YSBmcyBjYWxsIHJlbmFtZSBvbGQgZmlkIDUzNjg3Njk2NC8xLzEgIi5uZXdzcmMubmV3IgorCW5ldyBmaWQgNTM2ODc2OTY0LzEvMSAiLm5ld3NyYyIKK3Bpa2UuYWZzZnMgPiBlbHZpcy43MDAxOiByeCBkYXRhIGZzIHJlcGx5IHJlbmFtZQorXGZSCisuc3AgLjUKKy5maQorLlJFCitJbiB0aGUgZmlyc3QgbGluZSwgaG9zdCBlbHZpcyBzZW5kcyBhIFJYIHBhY2tldCB0byBwaWtlLgorVGhpcyB3YXMKK2EgUlggZGF0YSBwYWNrZXQgdG8gdGhlIGZzIChmaWxlc2VydmVyKSBzZXJ2aWNlLCBhbmQgaXMgdGhlIHN0YXJ0IG9mCithbiBSUEMgY2FsbC4KK1RoZSBSUEMgY2FsbCB3YXMgYSByZW5hbWUsIHdpdGggdGhlIG9sZCBkaXJlY3RvcnkgZmlsZSBpZAorb2YgNTM2ODc2OTY0LzEvMSBhbmQgYW4gb2xkIGZpbGVuYW1lIG9mIGAubmV3c3JjLm5ldycsIGFuZCBhIG5ldyBkaXJlY3RvcnkKK2ZpbGUgaWQgb2YgNTM2ODc2OTY0LzEvMSBhbmQgYSBuZXcgZmlsZW5hbWUgb2YgYC5uZXdzcmMnLgorVGhlIGhvc3QgcGlrZQorcmVzcG9uZHMgd2l0aCBhIFJQQyByZXBseSB0byB0aGUgcmVuYW1lIGNhbGwgKHdoaWNoIHdhcyBzdWNjZXNzZnVsLCBiZWNhdXNlCitpdCB3YXMgYSBkYXRhIHBhY2tldCBhbmQgbm90IGFuIGFib3J0IHBhY2tldCkuCisuTFAKK0luIGdlbmVyYWwsIGFsbCBBRlMgUlBDcyBhcmUgZGVjb2RlZCBhdCBsZWFzdCBieSBSUEMgY2FsbCBuYW1lLgorTW9zdAorQUZTIFJQQ3MgaGF2ZSBhdCBsZWFzdCBzb21lIG9mIHRoZSBhcmd1bWVudHMgZGVjb2RlZCAoZ2VuZXJhbGx5IG9ubHkKK3RoZSBgaW50ZXJlc3RpbmcnIGFyZ3VtZW50cywgZm9yIHNvbWUgZGVmaW5pdGlvbiBvZiBpbnRlcmVzdGluZykuCisuTFAKK1RoZSBmb3JtYXQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZi1kZXNjcmliaW5nLCBidXQgaXQgd2lsbCBwcm9iYWJseQorbm90IGJlIHVzZWZ1bCB0byBwZW9wbGUgd2hvIGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUgd29ya2luZ3Mgb2YKK0FGUyBhbmQgUlguCisuTFAKK0lmIHRoZSAtdiAodmVyYm9zZSkgZmxhZyBpcyBnaXZlbiB0d2ljZSwgYWNrbm93bGVkZ2VtZW50IHBhY2tldHMgYW5kCithZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBwcmludGVkLCBzdWNoIGFzIHRoZSB0aGUgUlggY2FsbCBJRCwKK2NhbGwgbnVtYmVyLCBzZXF1ZW5jZSBudW1iZXIsIHNlcmlhbCBudW1iZXIsIGFuZCB0aGUgUlggcGFja2V0IGZsYWdzLgorLkxQCitJZiB0aGUgLXYgZmxhZyBpcyBnaXZlbiB0d2ljZSwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLAorc3VjaCBhcyB0aGUgdGhlIFJYIGNhbGwgSUQsIHNlcmlhbCBudW1iZXIsIGFuZCB0aGUgUlggcGFja2V0IGZsYWdzLgorVGhlIE1UVSBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbiBpcyBhbHNvIHByaW50ZWQgZnJvbSBSWCBhY2sgcGFja2V0cy4KKy5MUAorSWYgdGhlIC12IGZsYWcgaXMgZ2l2ZW4gdGhyZWUgdGltZXMsIHRoZSBzZWN1cml0eSBpbmRleCBhbmQgc2VydmljZSBpZAorYXJlIHByaW50ZWQuCisuTFAKK0Vycm9yIGNvZGVzIGFyZSBwcmludGVkIGZvciBhYm9ydCBwYWNrZXRzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgVWJpaworYmVhY29uIHBhY2tldHMgKGJlY2F1c2UgYWJvcnQgcGFja2V0cyBhcmUgdXNlZCB0byBzaWduaWZ5IGEgeWVzIHZvdGUKK2ZvciB0aGUgVWJpayBwcm90b2NvbCkuCisuTFAKK05vdGUgdGhhdCBBRlMgcmVxdWVzdHMgYXJlIHZlcnkgbGFyZ2UgYW5kIG1hbnkgb2YgdGhlIGFyZ3VtZW50cyB3b24ndAorYmUgcHJpbnRlZCB1bmxlc3MgXGZJc25hcGxlblxmUCBpcyBpbmNyZWFzZWQuCitUcnkgdXNpbmcgYFxmQi1zIDI1NlxmUCcKK3RvIHdhdGNoIEFGUyB0cmFmZmljLgorLkxQCitBRlMgcmVwbHkgcGFja2V0cyBkbyBub3QgZXhwbGljaXRseSBpZGVudGlmeSB0aGUgUlBDIG9wZXJhdGlvbi4KK0luc3RlYWQsCitcZkl0Y3BkdW1wXGZQIGtlZXBzIHRyYWNrIG9mIGBgcmVjZW50JycgcmVxdWVzdHMsIGFuZCBtYXRjaGVzIHRoZW0gdG8gdGhlCityZXBsaWVzIHVzaW5nIHRoZSBjYWxsIG51bWJlciBhbmQgc2VydmljZSBJRC4KK0lmIGEgcmVwbHkgZG9lcyBub3QgY2xvc2VseQorZm9sbG93IHRoZQorY29ycmVzcG9uZGluZyByZXF1ZXN0LCBpdCBtaWdodCBub3QgYmUgcGFyc2FibGUuCisKKy5IRAorS0lQIEFwcGxlVGFsayAoRERQIGluIFVEUCkKKy5MUAorQXBwbGVUYWxrIEREUCBwYWNrZXRzIGVuY2Fwc3VsYXRlZCBpbiBVRFAgZGF0YWdyYW1zIGFyZSBkZS1lbmNhcHN1bGF0ZWQKK2FuZCBkdW1wZWQgYXMgRERQIHBhY2tldHMgKGkuZS4sIGFsbCB0aGUgVURQIGhlYWRlciBpbmZvcm1hdGlvbiBpcworZGlzY2FyZGVkKS4KK1RoZSBmaWxlCisuSSAvZXRjL2F0YWxrLm5hbWVzCitpcyB1c2VkIHRvIHRyYW5zbGF0ZSBBcHBsZVRhbGsgbmV0IGFuZCBub2RlIG51bWJlcnMgdG8gbmFtZXMuCitMaW5lcyBpbiB0aGlzIGZpbGUgaGF2ZSB0aGUgZm9ybQorLlJTCisubmYKKy5zcCAuNQorXGZJbnVtYmVyCW5hbWVcZlAKKworXGYoQ1cxLjI1NAkJZXRoZXIKKzE2LjEJCWljc2QtbmV0CisxLjI1NC4xMTAJYWNlXGZSCisuc3AgLjUKKy5maQorLlJFCitUaGUgZmlyc3QgdHdvIGxpbmVzIGdpdmUgdGhlIG5hbWVzIG9mIEFwcGxlVGFsayBuZXR3b3Jrcy4KK1RoZSB0aGlyZAorbGluZSBnaXZlcyB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgaG9zdCAoYSBob3N0IGlzIGRpc3Rpbmd1aXNoZWQKK2Zyb20gYSBuZXQgYnkgdGhlIDNyZCBvY3RldCBpbiB0aGUgbnVtYmVyIFwtCithIG5ldCBudW1iZXIgXGZJbXVzdFxmUCBoYXZlIHR3byBvY3RldHMgYW5kIGEgaG9zdCBudW1iZXIgXGZJbXVzdFxmUAoraGF2ZSB0aHJlZSBvY3RldHMuKSAgVGhlIG51bWJlciBhbmQgbmFtZSBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5Cit3aGl0ZXNwYWNlIChibGFua3Mgb3IgdGFicykuCitUaGUKKy5JIC9ldGMvYXRhbGsubmFtZXMKK2ZpbGUgbWF5IGNvbnRhaW4gYmxhbmsgbGluZXMgb3IgY29tbWVudCBsaW5lcyAobGluZXMgc3RhcnRpbmcgd2l0aAorYSBgIycpLgorLkxQCitBcHBsZVRhbGsgYWRkcmVzc2VzIGFyZSBwcmludGVkIGluIHRoZSBmb3JtCisuUlMKKy5uZgorLnNwIC41CitcZkluZXQuaG9zdC5wb3J0XGZQCisKK1xmKENXMTQ0LjEuMjA5LjIgPiBpY3NkLW5ldC4xMTIuMjIwCitvZmZpY2UuMiA+IGljc2QtbmV0LjExMi4yMjAKK2pzc21hZy4xNDkuMjM1ID4gaWNzZC1uZXQuMlxmUgorLnNwIC41CisuZmkKKy5SRQorKElmIHRoZQorLkkgL2V0Yy9hdGFsay5uYW1lcworZG9lc24ndCBleGlzdCBvciBkb2Vzbid0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHNvbWUgQXBwbGVUYWxrCitob3N0L25ldCBudW1iZXIsIGFkZHJlc3NlcyBhcmUgcHJpbnRlZCBpbiBudW1lcmljIGZvcm0uKQorSW4gdGhlIGZpcnN0IGV4YW1wbGUsIE5CUCAoRERQIHBvcnQgMikgb24gbmV0IDE0NC4xIG5vZGUgMjA5CitpcyBzZW5kaW5nIHRvIHdoYXRldmVyIGlzIGxpc3RlbmluZyBvbiBwb3J0IDIyMCBvZiBuZXQgaWNzZCBub2RlIDExMi4KK1RoZSBzZWNvbmQgbGluZSBpcyB0aGUgc2FtZSBleGNlcHQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgc291cmNlIG5vZGUKK2lzIGtub3duIChgb2ZmaWNlJykuCitUaGUgdGhpcmQgbGluZSBpcyBhIHNlbmQgZnJvbSBwb3J0IDIzNSBvbgorbmV0IGpzc21hZyBub2RlIDE0OSB0byBicm9hZGNhc3Qgb24gdGhlIGljc2QtbmV0IE5CUCBwb3J0IChub3RlIHRoYXQKK3RoZSBicm9hZGNhc3QgYWRkcmVzcyAoMjU1KSBpcyBpbmRpY2F0ZWQgYnkgYSBuZXQgbmFtZSB3aXRoIG5vIGhvc3QKK251bWJlciBcLSBmb3IgdGhpcyByZWFzb24gaXQncyBhIGdvb2QgaWRlYSB0byBrZWVwIG5vZGUgbmFtZXMgYW5kCituZXQgbmFtZXMgZGlzdGluY3QgaW4gL2V0Yy9hdGFsay5uYW1lcykuCisuTFAKK05CUCAobmFtZSBiaW5kaW5nIHByb3RvY29sKSBhbmQgQVRQIChBcHBsZVRhbGsgdHJhbnNhY3Rpb24gcHJvdG9jb2wpCitwYWNrZXRzIGhhdmUgdGhlaXIgY29udGVudHMgaW50ZXJwcmV0ZWQuCitPdGhlciBwcm90b2NvbHMganVzdCBkdW1wCit0aGUgcHJvdG9jb2wgbmFtZSAob3IgbnVtYmVyIGlmIG5vIG5hbWUgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlCitwcm90b2NvbCkgYW5kIHBhY2tldCBzaXplLgorCitcZkJOQlAgcGFja2V0c1xmUCBhcmUgZm9ybWF0dGVkIGxpa2UgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKKy5SUworLm5mCisuc3AgLjUKK1xzLTJcZihDV2ljc2QtbmV0LjExMi4yMjAgPiBqc3NtYWcuMjogbmJwLWxrdXAgMTkwOiAiPTpMYXNlcldyaXRlckAqIgoranNzbWFnLjIwOS4yID4gaWNzZC1uZXQuMTEyLjIyMDogbmJwLXJlcGx5IDE5MDogIlJNMTE0MDpMYXNlcldyaXRlckAqIiAyNTAKK3RlY2hwaXQuMiA+IGljc2QtbmV0LjExMi4yMjA6IG5icC1yZXBseSAxOTA6ICJ0ZWNocGl0Okxhc2VyV3JpdGVyQCoiIDE4NlxmUlxzKzIKKy5zcCAuNQorLmZpCisuUkUKK1RoZSBmaXJzdCBsaW5lIGlzIGEgbmFtZSBsb29rdXAgcmVxdWVzdCBmb3IgbGFzZXJ3cml0ZXJzIHNlbnQgYnkgbmV0IGljc2QgaG9zdAorMTEyIGFuZCBicm9hZGNhc3Qgb24gbmV0IGpzc21hZy4KK1RoZSBuYnAgaWQgZm9yIHRoZSBsb29rdXAgaXMgMTkwLgorVGhlIHNlY29uZCBsaW5lIHNob3dzIGEgcmVwbHkgZm9yIHRoaXMgcmVxdWVzdCAobm90ZSB0aGF0IGl0IGhhcyB0aGUKK3NhbWUgaWQpIGZyb20gaG9zdCBqc3NtYWcuMjA5IHNheWluZyB0aGF0IGl0IGhhcyBhIGxhc2Vyd3JpdGVyCityZXNvdXJjZSBuYW1lZCAiUk0xMTQwIiByZWdpc3RlcmVkIG9uIHBvcnQgMjUwLgorVGhlIHRoaXJkIGxpbmUgaXMKK2Fub3RoZXIgcmVwbHkgdG8gdGhlIHNhbWUgcmVxdWVzdCBzYXlpbmcgaG9zdCB0ZWNocGl0IGhhcyBsYXNlcndyaXRlcgorInRlY2hwaXQiIHJlZ2lzdGVyZWQgb24gcG9ydCAxODYuCisKK1xmQkFUUCBwYWNrZXRcZlAgZm9ybWF0dGluZyBpcyBkZW1vbnN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorLlJTCisubmYKKy5zcCAuNQorXHMtMlxmKENXanNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVxICAxMjI2NjwwLTc+IDB4YWUwMzAwMDEKK2hlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MCAoNTEyKSAweGFlMDQwMDAwCitoZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjEgKDUxMikgMHhhZTA0MDAwMAoraGVsaW9zLjEzMiA+IGpzc21hZy4yMDkuMTY1OiBhdHAtcmVzcCAxMjI2NjoyICg1MTIpIDB4YWUwNDAwMDAKK2hlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MyAoNTEyKSAweGFlMDQwMDAwCitoZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjQgKDUxMikgMHhhZTA0MDAwMAoraGVsaW9zLjEzMiA+IGpzc21hZy4yMDkuMTY1OiBhdHAtcmVzcCAxMjI2Njo1ICg1MTIpIDB4YWUwNDAwMDAKK2hlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6NiAoNTEyKSAweGFlMDQwMDAwCitoZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwKjEyMjY2OjcgKDUxMikgMHhhZTA0MDAwMAoranNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVxICAxMjI2NjwzLDU+IDB4YWUwMzAwMDEKK2hlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MyAoNTEyKSAweGFlMDQwMDAwCitoZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjUgKDUxMikgMHhhZTA0MDAwMAoranNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVsICAxMjI2NjwwLTc+IDB4YWUwMzAwMDEKK2pzc21hZy4yMDkuMTMzID4gaGVsaW9zLjEzMjogYXRwLXJlcSogMTIyNjc8MC03PiAweGFlMDMwMDAyXGZSXHMrMgorLnNwIC41CisuZmkKKy5SRQorSnNzbWFnLjIwOSBpbml0aWF0ZXMgdHJhbnNhY3Rpb24gaWQgMTIyNjYgd2l0aCBob3N0IGhlbGlvcyBieSByZXF1ZXN0aW5nCit1cCB0byA4IHBhY2tldHMgKHRoZSBgPDAtNz4nKS4KK1RoZSBoZXggbnVtYmVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUKK2lzIHRoZSB2YWx1ZSBvZiB0aGUgYHVzZXJkYXRhJyBmaWVsZCBpbiB0aGUgcmVxdWVzdC4KKy5MUAorSGVsaW9zIHJlc3BvbmRzIHdpdGggOCA1MTItYnl0ZSBwYWNrZXRzLgorVGhlIGA6ZGlnaXQnIGZvbGxvd2luZyB0aGUKK3RyYW5zYWN0aW9uIGlkIGdpdmVzIHRoZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyIGluIHRoZSB0cmFuc2FjdGlvbgorYW5kIHRoZSBudW1iZXIgaW4gcGFyZW5zIGlzIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcGFja2V0LAorZXhjbHVkaW5nIHRoZSBhdHAgaGVhZGVyLgorVGhlIGAqJyBvbiBwYWNrZXQgNyBpbmRpY2F0ZXMgdGhhdCB0aGUKK0VPTSBiaXQgd2FzIHNldC4KKy5MUAorSnNzbWFnLjIwOSB0aGVuIHJlcXVlc3RzIHRoYXQgcGFja2V0cyAzICYgNSBiZSByZXRyYW5zbWl0dGVkLgorSGVsaW9zCityZXNlbmRzIHRoZW0gdGhlbiBqc3NtYWcuMjA5IHJlbGVhc2VzIHRoZSB0cmFuc2FjdGlvbi4KK0ZpbmFsbHksCitqc3NtYWcuMjA5IGluaXRpYXRlcyB0aGUgbmV4dCByZXF1ZXN0LgorVGhlIGAqJyBvbiB0aGUgcmVxdWVzdAoraW5kaWNhdGVzIHRoYXQgWE8gKGBleGFjdGx5IG9uY2UnKSB3YXMgXGZJbm90XGZQIHNldC4KKworLkhECitJUCBGcmFnbWVudGF0aW9uCisuTFAKK0ZyYWdtZW50ZWQgSW50ZXJuZXQgZGF0YWdyYW1zIGFyZSBwcmludGVkIGFzCisuUlMKKy5uZgorLnNwIC41CitcZkIoZnJhZyBcZklpZFxmQjpcZklzaXplXGZCQFxmSW9mZnNldFxmQispXGZSCitcZkIoZnJhZyBcZklpZFxmQjpcZklzaXplXGZCQFxmSW9mZnNldFxmQilcZlIKKy5zcCAuNQorLmZpCisuUkUKKyhUaGUgZmlyc3QgZm9ybSBpbmRpY2F0ZXMgdGhlcmUgYXJlIG1vcmUgZnJhZ21lbnRzLgorVGhlIHNlY29uZAoraW5kaWNhdGVzIHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQuKQorLkxQCitcZklJZFxmUCBpcyB0aGUgZnJhZ21lbnQgaWQuCitcZklTaXplXGZQIGlzIHRoZSBmcmFnbWVudAorc2l6ZSAoaW4gYnl0ZXMpIGV4Y2x1ZGluZyB0aGUgSVAgaGVhZGVyLgorXGZJT2Zmc2V0XGZQIGlzIHRoaXMKK2ZyYWdtZW50J3Mgb2Zmc2V0IChpbiBieXRlcykgaW4gdGhlIG9yaWdpbmFsIGRhdGFncmFtLgorLkxQCitUaGUgZnJhZ21lbnQgaW5mb3JtYXRpb24gaXMgb3V0cHV0IGZvciBlYWNoIGZyYWdtZW50LgorVGhlIGZpcnN0CitmcmFnbWVudCBjb250YWlucyB0aGUgaGlnaGVyIGxldmVsIHByb3RvY29sIGhlYWRlciBhbmQgdGhlIGZyYWcKK2luZm8gaXMgcHJpbnRlZCBhZnRlciB0aGUgcHJvdG9jb2wgaW5mby4KK0ZyYWdtZW50cworYWZ0ZXIgdGhlIGZpcnN0IGNvbnRhaW4gbm8gaGlnaGVyIGxldmVsIHByb3RvY29sIGhlYWRlciBhbmQgdGhlCitmcmFnIGluZm8gaXMgcHJpbnRlZCBhZnRlciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCitGb3IgZXhhbXBsZSwgaGVyZSBpcyBwYXJ0IG9mIGFuIGZ0cCBmcm9tIGFyaXpvbmEuZWR1IHRvIGxibC1ydHNnLmFycGEKK292ZXIgYSBDU05FVCBjb25uZWN0aW9uIHRoYXQgZG9lc24ndCBhcHBlYXIgdG8gaGFuZGxlIDU3NiBieXRlIGRhdGFncmFtczoKKy5SUworLm5mCisuc3AgLjUKK1xzLTJcZihDV2FyaXpvbmEuZnRwLWRhdGEgPiBydHNnLjExNzA6IC4gMTAyNDoxMzMyKDMwOCkgYWNrIDEgd2luIDQwOTYgKGZyYWcgNTk1YTozMjhAMCspCithcml6b25hID4gcnRzZzogKGZyYWcgNTk1YToyMDRAMzI4KQorcnRzZy4xMTcwID4gYXJpem9uYS5mdHAtZGF0YTogLiBhY2sgMTUzNiB3aW4gMjU2MFxmUFxzKzIKKy5zcCAuNQorLmZpCisuUkUKK1RoZXJlIGFyZSBhIGNvdXBsZSBvZiB0aGluZ3MgdG8gbm90ZSBoZXJlOiAgRmlyc3QsIGFkZHJlc3NlcyBpbiB0aGUKKzJuZCBsaW5lIGRvbid0IGluY2x1ZGUgcG9ydCBudW1iZXJzLgorVGhpcyBpcyBiZWNhdXNlIHRoZSBUQ1AKK3Byb3RvY29sIGluZm9ybWF0aW9uIGlzIGFsbCBpbiB0aGUgZmlyc3QgZnJhZ21lbnQgYW5kIHdlIGhhdmUgbm8gaWRlYQord2hhdCB0aGUgcG9ydCBvciBzZXF1ZW5jZSBudW1iZXJzIGFyZSB3aGVuIHdlIHByaW50IHRoZSBsYXRlciBmcmFnbWVudHMuCitTZWNvbmQsIHRoZSB0Y3Agc2VxdWVuY2UgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IGxpbmUgaXMgcHJpbnRlZCBhcyBpZiB0aGVyZQord2VyZSAzMDggYnl0ZXMgb2YgdXNlciBkYXRhIHdoZW4sIGluIGZhY3QsIHRoZXJlIGFyZSA1MTIgYnl0ZXMgKDMwOCBpbgordGhlIGZpcnN0IGZyYWcgYW5kIDIwNCBpbiB0aGUgc2Vjb25kKS4KK0lmIHlvdSBhcmUgbG9va2luZyBmb3IgaG9sZXMKK2luIHRoZSBzZXF1ZW5jZSBzcGFjZSBvciB0cnlpbmcgdG8gbWF0Y2ggdXAgYWNrcword2l0aCBwYWNrZXRzLCB0aGlzIGNhbiBmb29sIHlvdS4KKy5MUAorQSBwYWNrZXQgd2l0aCB0aGUgSVAgXGZJZG9uJ3QgZnJhZ21lbnRcZlAgZmxhZyBpcyBtYXJrZWQgd2l0aCBhCit0cmFpbGluZyBcZkIoREYpXGZQLgorLkhECitUaW1lc3RhbXBzCisuTFAKK0J5IGRlZmF1bHQsIGFsbCBvdXRwdXQgbGluZXMgYXJlIHByZWNlZGVkIGJ5IGEgdGltZXN0YW1wLgorVGhlIHRpbWVzdGFtcAoraXMgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSBpbiB0aGUgZm9ybQorLlJTCisubmYKK1xmSWhoOm1tOnNzLmZyYWNcZlAKKy5maQorLlJFCithbmQgaXMgYXMgYWNjdXJhdGUgYXMgdGhlIGtlcm5lbCdzIGNsb2NrLgorVGhlIHRpbWVzdGFtcCByZWZsZWN0cyB0aGUgdGltZSB0aGUga2VybmVsIGZpcnN0IHNhdyB0aGUgcGFja2V0LgorTm8gYXR0ZW1wdAoraXMgbWFkZSB0byBhY2NvdW50IGZvciB0aGUgdGltZSBsYWcgYmV0d2VlbiB3aGVuIHRoZQorRXRoZXJuZXQgaW50ZXJmYWNlIHJlbW92ZWQgdGhlIHBhY2tldCBmcm9tIHRoZSB3aXJlIGFuZCB3aGVuIHRoZSBrZXJuZWwKK3NlcnZpY2VkIHRoZSBgbmV3IHBhY2tldCcgaW50ZXJydXB0LgorLlNIICJTRUUgQUxTTyIKK3N0dHkoMSksIHBjYXAoMyksIGJwZig0KSwgbml0KDRQKSwgcGZjb25maWcoOCkKKy5TSCBBVVRIT1JTCitUaGUgb3JpZ2luYWwgYXV0aG9ycyBhcmU6CisuTFAKK1ZhbiBKYWNvYnNvbiwKK0NyYWlnIExlcmVzIGFuZAorU3RldmVuIE1jQ2FubmUsIGFsbCBvZiB0aGUKK0xhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnksIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXksIENBLgorLkxQCitJdCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB0Y3BkdW1wLm9yZy4KKy5MUAorVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhdmFpbGFibGUgdmlhIGh0dHA6CisuTFAKKy5SUworLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8KKy5SRQorLkxQCitUaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cDoKKy5MUAorLlJTCisuSSBmdHA6Ly9mdHAuZWUubGJsLmdvdi90Y3BkdW1wLnRhci5aCisuUkUKKy5MUAorSVB2Ni9JUHNlYyBzdXBwb3J0IGlzIGFkZGVkIGJ5IFdJREUvS0FNRSBwcm9qZWN0LgorVGhpcyBwcm9ncmFtIHVzZXMgRXJpYyBZb3VuZydzIFNTTGVheSBsaWJyYXJ5LCB1bmRlciBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorLlNIIEJVR1MKK1BsZWFzZSBzZW5kIHByb2JsZW1zLCBidWdzLCBxdWVzdGlvbnMsIGRlc2lyYWJsZSBlbmhhbmNlbWVudHMsIGV0Yy4gdG86CisuTFAKKy5SUwordGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnCisuUkUKKy5MUAorUGxlYXNlIHNlbmQgc291cmNlIGNvZGUgY29udHJpYnV0aW9ucywgZXRjLiB0bzoKKy5MUAorLlJTCitwYXRjaGVzQHRjcGR1bXAub3JnCisuUkUKKy5MUAorTklUIGRvZXNuJ3QgbGV0IHlvdSB3YXRjaCB5b3VyIG93biBvdXRib3VuZCB0cmFmZmljLCBCUEYgd2lsbC4KK1dlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGxhdHRlci4KKy5MUAorT24gTGludXggc3lzdGVtcyB3aXRoIDIuMFsueF0ga2VybmVsczoKKy5JUAorcGFja2V0cyBvbiB0aGUgbG9vcGJhY2sgZGV2aWNlIHdpbGwgYmUgc2VlbiB0d2ljZTsKKy5JUAorcGFja2V0IGZpbHRlcmluZyBjYW5ub3QgYmUgZG9uZSBpbiB0aGUga2VybmVsLCBzbyB0aGF0IGFsbCBwYWNrZXRzIG11c3QKK2JlIGNvcGllZCBmcm9tIHRoZSBrZXJuZWwgaW4gb3JkZXIgdG8gYmUgZmlsdGVyZWQgaW4gdXNlciBtb2RlOworLklQCithbGwgb2YgYSBwYWNrZXQsIG5vdCBqdXN0IHRoZSBwYXJ0IHRoYXQncyB3aXRoaW4gdGhlIHNuYXBzaG90IGxlbmd0aCwKK3dpbGwgYmUgY29waWVkIGZyb20gdGhlIGtlcm5lbCAodGhlIDIuMFsueF0gcGFja2V0IGNhcHR1cmUgbWVjaGFuaXNtLCBpZgorYXNrZWQgdG8gY29weSBvbmx5IHBhcnQgb2YgYSBwYWNrZXQgdG8gdXNlcmxhbmQsIHdpbGwgbm90IHJlcG9ydCB0aGUKK3RydWUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQ7IHRoaXMgd291bGQgY2F1c2UgbW9zdCBJUCBwYWNrZXRzIHRvIGdldCBhbgorZXJyb3IgZnJvbQorLkJSIHRjcGR1bXAgKTsKKy5JUAorY2FwdHVyaW5nIG9uIHNvbWUgUFBQIGRldmljZXMgd29uJ3Qgd29yayBjb3JyZWN0bHkuCisuTFAKK1dlIHJlY29tbWVuZCB0aGF0IHlvdSB1cGdyYWRlIHRvIGEgMi4yIG9yIGxhdGVyIGtlcm5lbC4KKy5MUAorU29tZSBhdHRlbXB0IHNob3VsZCBiZSBtYWRlIHRvIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzIG9yLCBhdCBsZWFzdAordG8gY29tcHV0ZSB0aGUgcmlnaHQgbGVuZ3RoIGZvciB0aGUgaGlnaGVyIGxldmVsIHByb3RvY29sLgorLkxQCitOYW1lIHNlcnZlciBpbnZlcnNlIHF1ZXJpZXMgYXJlIG5vdCBkdW1wZWQgY29ycmVjdGx5OiB0aGUgKGVtcHR5KQorcXVlc3Rpb24gc2VjdGlvbiBpcyBwcmludGVkIHJhdGhlciB0aGFuIHJlYWwgcXVlcnkgaW4gdGhlIGFuc3dlcgorc2VjdGlvbi4KK1NvbWUgYmVsaWV2ZSB0aGF0IGludmVyc2UgcXVlcmllcyBhcmUgdGhlbXNlbHZlcyBhIGJ1ZyBhbmQKK3ByZWZlciB0byBmaXggdGhlIHByb2dyYW0gZ2VuZXJhdGluZyB0aGVtIHJhdGhlciB0aGFuIFxmSXRjcGR1bXBcZlAuCisuTFAKK0EgcGFja2V0IHRyYWNlIHRoYXQgY3Jvc3NlcyBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBjaGFuZ2Ugd2lsbCBnaXZlCitza2V3ZWQgdGltZSBzdGFtcHMgKHRoZSB0aW1lIGNoYW5nZSBpcyBpZ25vcmVkKS4KKy5MUAorRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIFRva2VuIFJpbmcgaGVhZGVycyB3aWxsCitub3QgY29ycmVjdGx5IGhhbmRsZSBzb3VyY2Utcm91dGVkIFRva2VuIFJpbmcgcGFja2V0cy4KKy5MUAorRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIDgwMi4xMSBoZWFkZXJzIHdpbGwgbm90Citjb3JyZWN0bHkgaGFuZGxlIDgwMi4xMSBkYXRhIHBhY2tldHMgd2l0aCBib3RoIFRvIERTIGFuZCBGcm9tIERTIHNldC4KKy5MUAorLkJSICJpcDYgcHJvdG8iCitzaG91bGQgY2hhc2UgaGVhZGVyIGNoYWluLCBidXQgYXQgdGhpcyBtb21lbnQgaXQgZG9lcyBub3QuCisuQlIgImlwNiBwcm90b2NoYWluIgoraXMgc3VwcGxpZWQgZm9yIHRoaXMgYmVoYXZpb3IuCisuTFAKK0FyaXRobWV0aWMgZXhwcmVzc2lvbiBhZ2FpbnN0IHRyYW5zcG9ydCBsYXllciBoZWFkZXJzLCBsaWtlIFxmQnRjcFswXVxmUCwKK2RvZXMgbm90IHdvcmsgYWdhaW5zdCBJUHY2IHBhY2tldHMuCitJdCBvbmx5IGxvb2tzIGF0IElQdjQgcGFja2V0cy4KZGlmZiAtLWdpdCBhL3RjcGR1bXAuYyBiL3RjcGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTI0ZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGNwZHVtcC5jCkBAIC0wLDAgKzEsMTQ2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIFN1cHBvcnQgZm9yIHNwbGl0dGluZyBjYXB0dXJlcyBpbnRvIG11bHRpcGxlIGZpbGVzIHdpdGggYSBtYXhpbXVtCisgKiBmaWxlIHNpemU6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxCisgKglTZXRoIFdlYnN0ZXIgPHN3ZWJzdGVyQHNzdC5sbC5taXQuZWR1PgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gX1VfID0KKyAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKK1RoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90Y3BkdW1wLmMsdiAxLjI1My4yLjEzIDIwMDcvMDkvMTIgMTk6NDg6NTEgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisvKgorICogdGNwZHVtcCAtIG1vbml0b3IgdGNwL2lwIHRyYWZmaWMgb24gYW4gZXRoZXJuZXQuCisgKgorICogRmlyc3Qgd3JpdHRlbiBpbiAxOTg3IGJ5IFZhbiBKYWNvYnNvbiwgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIE1lcmNpbGVzc2x5IGhhY2tlZCBhbmQgb2NjYXNpb25hbGx5IGltcHJvdmVkIHNpbmNlIHRoZW4gdmlhIHRoZQorICogY29tYmluZWQgZWZmb3J0cyBvZiBWYW4sIFN0ZXZlIE1jQ2FubmUgYW5kIENyYWlnIExlcmVzIG9mIExCTC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJ3MzJfZnpzLmgiCitleHRlcm4gaW50IHN0cmNhc2VjbXAgKGNvbnN0IGNoYXIgKl9fczEsIGNvbnN0IGNoYXIgKl9fczIpOworZXh0ZXJuIGludCBTSVpFX0JVRjsKKyNkZWZpbmUgb2ZmX3QgbG9uZworI2RlZmluZSB1aW50IFVJTlQKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaWZkZWYgSEFWRV9TTUlfSAorI2luY2x1ZGUgPHNtaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgV0lOMzIKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgorI2luY2x1ZGUgIm1hY2hkZXAuaCIKKyNpbmNsdWRlICJzZXRzaWduYWwuaCIKKyNpbmNsdWRlICJnbXQybG9jYWwuaCIKKyNpbmNsdWRlICJwY2FwLW1pc3NpbmcuaCIKKworbmV0ZGlzc2VjdF9vcHRpb25zIEduZG87CituZXRkaXNzZWN0X29wdGlvbnMgKmduZG8gPSAmR25kbzsKKworLyoKKyAqIERlZmluZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZmlsZXMgZm9yIHRoZSAtQyBmbGFnLCBhbmQgaG93IG1hbnkKKyAqIGNoYXJhY3RlcnMgY2FuIGJlIGFkZGVkIHRvIGEgZmlsZW5hbWUgZm9yIHRoZSAtQyBmbGFnICh3aGljaAorICogc2hvdWxkIGJlIGVub3VnaCB0byBoYW5kbGUgTUFYX0NGTEFHIC0gMSkuCisgKi8KKyNkZWZpbmUgTUFYX0NGTEFHCTEwMDAwMDAKKyNkZWZpbmUgTUFYX0NGTEFHX0NIQVJTCTYKKworaW50IGRmbGFnOwkJCS8qIHByaW50IGZpbHRlciBjb2RlICovCitpbnQgTGZsYWc7CQkJLyogbGlzdCBhdmFpbGFibGUgZGF0YSBsaW5rIHR5cGVzIGFuZCBleGl0ICovCisKK3N0YXRpYyBpbnQgaW5mb2RlbGF5Oworc3RhdGljIGludCBpbmZvcHJpbnQ7CisKK2NoYXIgKnByb2dyYW1fbmFtZTsKKworaW50MzJfdCB0aGlzem9uZTsJCS8qIHNlY29uZHMgb2Zmc2V0IGZyb20gZ210IHRvIGxvY2FsIHRpbWUgKi8KKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBSRVRTSUdUWVBFIGNsZWFudXAoaW50KTsKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCBzaG93X2RsdHNfYW5kX2V4aXQocGNhcF90ICpwZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQgcHJpbnRfcGFja2V0KHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworc3RhdGljIHZvaWQgbmRvX2RlZmF1bHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7CitzdGF0aWMgdm9pZCBkdW1wX3BhY2tldF9hbmRfdHJ1bmModV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCBkdW1wX3BhY2tldCh1X2NoYXIgKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKK3N0YXRpYyB2b2lkIGRyb3Byb290KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3N0YXRpYyB2b2lkIG5kb19lcnJvcihuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywgY29uc3QgY2hhciAqZm10LCAuLi4pOworc3RhdGljIHZvaWQgbmRvX3dhcm5pbmcobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworI2lmZGVmIFNJR0lORk8KK1JFVFNJR1RZUEUgcmVxdWVzdGluZm8oaW50KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVU0VfV0lOMzJfTU1fVElNRVIpCisgICNpbmNsdWRlIDxNTXN5c3RlbS5oPgorICBzdGF0aWMgVUlOVCB0aW1lcl9pZDsKKyAgc3RhdGljIHZvaWQgQ0FMTEJBQ0sgdmVyYm9zZV9zdGF0c19kdW1wKFVJTlQsIFVJTlQsIERXT1JEX1BUUiwgRFdPUkRfUFRSLCBEV09SRF9QVFIpOworI2VsaWYgZGVmaW5lZChIQVZFX0FMQVJNKQorICBzdGF0aWMgdm9pZCB2ZXJib3NlX3N0YXRzX2R1bXAoaW50IHNpZyk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgaW5mbyhpbnQpOworc3RhdGljIHVfaW50IHBhY2tldHNfY2FwdHVyZWQ7CisKK3R5cGVkZWYgdV9pbnQgKCppZl9wcmludGVyKShjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworCitzdHJ1Y3QgcHJpbnRlciB7CisJaWZfcHJpbnRlciBmOworCWludCB0eXBlOworfTsKKworc3RhdGljIHN0cnVjdCBwcmludGVyIHByaW50ZXJzW10gPSB7CisJeyBhcmNuZXRfaWZfcHJpbnQsCURMVF9BUkNORVQgfSwKKyNpZmRlZiBETFRfQVJDTkVUX0xJTlVYCisJeyBhcmNuZXRfbGludXhfaWZfcHJpbnQsIERMVF9BUkNORVRfTElOVVggfSwKKyNlbmRpZgorCXsgZXRoZXJfaWZfcHJpbnQsCURMVF9FTjEwTUIgfSwKKwl7IHRva2VuX2lmX3ByaW50LAlETFRfSUVFRTgwMiB9LAorI2lmZGVmIERMVF9MQU5FODAyMworCXsgbGFuZV9pZl9wcmludCwgICAgICAgIERMVF9MQU5FODAyMyB9LAorI2VuZGlmCisjaWZkZWYgRExUX0NJUAorCXsgY2lwX2lmX3ByaW50LCAgICAgICAgIERMVF9DSVAgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9BVE1fQ0xJUAorCXsgY2lwX2lmX3ByaW50LCAgICAgICAgIERMVF9BVE1fQ0xJUCB9LAorI2VuZGlmCisJeyBzbF9pZl9wcmludCwJCURMVF9TTElQIH0sCisjaWZkZWYgRExUX1NMSVBfQlNET1MKKwl7IHNsX2JzZG9zX2lmX3ByaW50LAlETFRfU0xJUF9CU0RPUyB9LAorI2VuZGlmCisJeyBwcHBfaWZfcHJpbnQsCQlETFRfUFBQIH0sCisjaWZkZWYgRExUX1BQUF9XSVRIRElSRUNUSU9OCisJeyBwcHBfaWZfcHJpbnQsCQlETFRfUFBQX1dJVEhESVJFQ1RJT04gfSwKKyNlbmRpZgorI2lmZGVmIERMVF9QUFBfQlNET1MKKwl7IHBwcF9ic2Rvc19pZl9wcmludCwJRExUX1BQUF9CU0RPUyB9LAorI2VuZGlmCisJeyBmZGRpX2lmX3ByaW50LAlETFRfRkRESSB9LAorCXsgbnVsbF9pZl9wcmludCwJRExUX05VTEwgfSwKKyNpZmRlZiBETFRfTE9PUAorCXsgbnVsbF9pZl9wcmludCwJRExUX0xPT1AgfSwKKyNlbmRpZgorCXsgcmF3X2lmX3ByaW50LAkJRExUX1JBVyB9LAorCXsgYXRtX2lmX3ByaW50LAkJRExUX0FUTV9SRkMxNDgzIH0sCisjaWZkZWYgRExUX0NfSERMQworCXsgY2hkbGNfaWZfcHJpbnQsCURMVF9DX0hETEMgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9IRExDCisJeyBjaGRsY19pZl9wcmludCwJRExUX0hETEMgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9QUFBfU0VSSUFMCisJeyBwcHBfaGRsY19pZl9wcmludCwgICAgRExUX1BQUF9TRVJJQUwgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9QUFBfRVRIRVIKKwl7IHBwcG9lX2lmX3ByaW50LAlETFRfUFBQX0VUSEVSIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfTElOVVhfU0xMCisJeyBzbGxfaWZfcHJpbnQsCQlETFRfTElOVVhfU0xMIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSUVFRTgwMl8xMQorCXsgaWVlZTgwMl8xMV9pZl9wcmludCwJRExUX0lFRUU4MDJfMTF9LAorI2VuZGlmCisjaWZkZWYgRExUX0xUQUxLCisJeyBsdGFsa19pZl9wcmludCwJRExUX0xUQUxLIH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKERMVF9QRkxPRykgJiYgZGVmaW5lZChIQVZFX05FVF9QRlZBUl9IKQorCXsgcGZsb2dfaWZfcHJpbnQsIAlETFRfUEZMT0cgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9GUgorCXsgZnJfaWZfcHJpbnQsCQlETFRfRlIgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9GUkVMQVkKKwl7IGZyX2lmX3ByaW50LAkJRExUX0ZSRUxBWSB9LAorI2VuZGlmCisjaWZkZWYgRExUX1NVTkFUTQorCXsgc3VuYXRtX2lmX3ByaW50LAlETFRfU1VOQVRNIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSVBfT1ZFUl9GQworCXsgaXBmY19pZl9wcmludCwJRExUX0lQX09WRVJfRkMgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9QUklTTV9IRUFERVIKKwl7IHByaXNtX2lmX3ByaW50LAlETFRfUFJJU01fSEVBREVSIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSUVFRTgwMl8xMV9SQURJTworCXsgaWVlZTgwMl8xMV9yYWRpb19pZl9wcmludCwJRExUX0lFRUU4MDJfMTFfUkFESU8gfSwKKyNlbmRpZgorI2lmZGVmIERMVF9FTkMKKwl7IGVuY19pZl9wcmludCwgCURMVF9FTkMgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9TWU1BTlRFQ19GSVJFV0FMTAorCXsgc3ltYW50ZWNfaWZfcHJpbnQsIAlETFRfU1lNQU5URUNfRklSRVdBTEwgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9BUFBMRV9JUF9PVkVSX0lFRUUxMzk0CisJeyBhcDEzOTRfaWZfcHJpbnQsCURMVF9BUFBMRV9JUF9PVkVSX0lFRUUxMzk0IH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9BVE0xCisJeyBqdW5pcGVyX2F0bTFfcHJpbnQsCURMVF9KVU5JUEVSX0FUTTEgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0FUTTIKKwl7IGp1bmlwZXJfYXRtMl9wcmludCwJRExUX0pVTklQRVJfQVRNMiB9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfTUZSCisJeyBqdW5pcGVyX21mcl9wcmludCwJRExUX0pVTklQRVJfTUZSIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NTEZSCisJeyBqdW5pcGVyX21sZnJfcHJpbnQsCURMVF9KVU5JUEVSX01MRlIgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX01MUFBQCisJeyBqdW5pcGVyX21scHBwX3ByaW50LAlETFRfSlVOSVBFUl9NTFBQUCB9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfUFBQT0UKKwl7IGp1bmlwZXJfcHBwb2VfcHJpbnQsCURMVF9KVU5JUEVSX1BQUE9FIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9QUFBPRV9BVE0KKwl7IGp1bmlwZXJfcHBwb2VfYXRtX3ByaW50LCBETFRfSlVOSVBFUl9QUFBPRV9BVE0gfSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0dHU04KKwl7IGp1bmlwZXJfZ2dzbl9wcmludCwJRExUX0pVTklQRVJfR0dTTiB9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfRVMKKwl7IGp1bmlwZXJfZXNfcHJpbnQsCURMVF9KVU5JUEVSX0VTIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9NT05JVE9SCisJeyBqdW5pcGVyX21vbml0b3JfcHJpbnQsIERMVF9KVU5JUEVSX01PTklUT1IgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX1NFUlZJQ0VTCisJeyBqdW5pcGVyX3NlcnZpY2VzX3ByaW50LCBETFRfSlVOSVBFUl9TRVJWSUNFUyB9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfRVRIRVIKKwl7IGp1bmlwZXJfZXRoZXJfcHJpbnQsIERMVF9KVU5JUEVSX0VUSEVSIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfSlVOSVBFUl9QUFAKKwl7IGp1bmlwZXJfcHBwX3ByaW50LCBETFRfSlVOSVBFUl9QUFAgfSwKKyNlbmRpZgorI2lmZGVmIERMVF9KVU5JUEVSX0ZSRUxBWQorCXsganVuaXBlcl9mcmVsYXlfcHJpbnQsIERMVF9KVU5JUEVSX0ZSRUxBWSB9LAorI2VuZGlmCisjaWZkZWYgRExUX0pVTklQRVJfQ0hETEMKKwl7IGp1bmlwZXJfY2hkbGNfcHJpbnQsIERMVF9KVU5JUEVSX0NIRExDIH0sCisjZW5kaWYKKyNpZmRlZiBETFRfTUZSCisJeyBtZnJfaWZfcHJpbnQsIERMVF9NRlIgfSwKKyNlbmRpZgorCXsgTlVMTCwJCQkwIH0sCit9OworCitzdGF0aWMgaWZfcHJpbnRlcgorbG9va3VwX3ByaW50ZXIoaW50IHR5cGUpCit7CisJc3RydWN0IHByaW50ZXIgKnA7CisKKwlmb3IgKHAgPSBwcmludGVyczsgcC0+ZjsgKytwKQorCQlpZiAodHlwZSA9PSBwLT50eXBlKQorCQkJcmV0dXJuIHAtPmY7CisKKwlyZXR1cm4gTlVMTDsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyBwY2FwX3QgKnBkOworCitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBpbnQgb3B0ZXJyOworZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKworc3RydWN0IHByaW50X2luZm8geworCWlmX3ByaW50ZXIgcHJpbnRlcjsKK307CisKK3N0cnVjdCBkdW1wX2luZm8geworCWNoYXIJKldGaWxlTmFtZTsKKwlwY2FwX3QJKnBkOworCXBjYXBfZHVtcGVyX3QgKnA7Cit9OworCitzdGF0aWMgdm9pZAorc2hvd19kbHRzX2FuZF9leGl0KHBjYXBfdCAqcGQpCit7CisJaW50IG5fZGx0czsKKwlpbnQgKmRsdHMgPSAwOworCWNvbnN0IGNoYXIgKmRsdF9uYW1lOworCisJbl9kbHRzID0gcGNhcF9saXN0X2RhdGFsaW5rcyhwZCwgJmRsdHMpOworCWlmIChuX2RsdHMgPCAwKQorCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOworCWVsc2UgaWYgKG5fZGx0cyA9PSAwIHx8ICFkbHRzKQorCQllcnJvcigiTm8gZGF0YSBsaW5rIHR5cGVzLiIpOworCisJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiRGF0YSBsaW5rIHR5cGVzICh1c2Ugb3B0aW9uIC15IHRvIHNldCk6XG4iKTsKKworCXdoaWxlICgtLW5fZGx0cyA+PSAwKSB7CisJCWRsdF9uYW1lID0gcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShkbHRzW25fZGx0c10pOworCQlpZiAoZGx0X25hbWUgIT0gTlVMTCkgeworCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiICAlcyAoJXMpIiwgZGx0X25hbWUsCisJCQkgICAgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oZGx0c1tuX2RsdHNdKSk7CisKKwkJCS8qCisJCQkgKiBPSywgZG9lcyB0Y3BkdW1wIGhhbmRsZSB0aGF0IHR5cGU/CisJCQkgKi8KKwkJCWlmIChsb29rdXBfcHJpbnRlcihkbHRzW25fZGx0c10pID09IE5VTEwpCisJCQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiIChub3Qgc3VwcG9ydGVkKSIpOworCQkJcHV0Y2hhcignXG4nKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIiAgRExUICVkIChub3Qgc3VwcG9ydGVkKVxuIiwKKwkJCSAgICBkbHRzW25fZGx0c10pOworCQl9CisJfQorCWZyZWUoZGx0cyk7CisJZXhpdCgwKTsKK30KKworLyoKKyAqIFNldCB1cCBmbGFncyB0aGF0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgZGVwZW5kaW5nIG9uIHRoZQorICogdmVyc2lvbiBvZiBsaWJwY2FwIHdlJ3JlIHVzaW5nLgorICovCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgQl9GTEFHCQkiQjoiCisjZGVmaW5lIEJfRkxBR19VU0FHRQkiIFsgLUIgc2l6ZSBdIgorI2Vsc2UgLyogV0lOMzIgKi8KKyNkZWZpbmUgQl9GTEFHCisjZGVmaW5lIEJfRkxBR19VU0FHRQorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpZmRlZiBIQVZFX1BDQVBfRklOREFMTERFVlMKKyNpZm5kZWYgSEFWRV9QQ0FQX0lGX1QKKyN1bmRlZiBIQVZFX1BDQVBfRklOREFMTERFVlMKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BDQVBfRklOREFMTERFVlMKKyNkZWZpbmUgRF9GTEFHCSJEIgorI2Vsc2UKKyNkZWZpbmUgRF9GTEFHCisjZW5kaWYKKworI2lmZGVmIEhBVkVfUENBUF9EVU1QX0ZMVVNICisjZGVmaW5lIFVfRkxBRwkiVSIKKyNlbHNlCisjZGVmaW5lIFVfRkxBRworI2VuZGlmCisKKyNpZm5kZWYgV0lOMzIKKy8vIG5vdCBzdXBwb3J0ZWQgb24gYW5kcm9pZAoraW50IGluaXRncm91cHMoY29uc3QgY2hhciAqdXNlciwgZ2lkX3QgZ3JvdXApIHtyZXR1cm4gMDt9CisvKiBEcm9wIHJvb3QgcHJpdmlsZWdlcyBhbmQgY2hyb290IGlmIG5lY2Vzc2FyeSAqLworc3RhdGljIHZvaWQKK2Ryb3Byb290KGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpjaHJvb3RfZGlyKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gTlVMTDsKKworCWlmIChjaHJvb3RfZGlyICYmICF1c2VybmFtZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInRjcGR1bXA6IENocm9vdCB3aXRob3V0IGRyb3BwaW5nIHJvb3QgaXMgaW5zZWN1cmVcbiIpOworCQlleGl0KDEpOworCX0KKwkKKwlwdyA9IGdldHB3bmFtKHVzZXJuYW1lKTsKKwlpZiAocHcpIHsKKwkJaWYgKGNocm9vdF9kaXIpIHsKKwkJCWlmIChjaHJvb3QoY2hyb290X2RpcikgIT0gMCB8fCBjaGRpciAoIi8iKSAhPSAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiBDb3VsZG4ndCBjaHJvb3QvY2hkaXIgdG8gJyUuNjRzJzogJXNcbiIsCisJCQkJICAgIGNocm9vdF9kaXIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQl9CisJCWlmIChpbml0Z3JvdXBzKHB3LT5wd19uYW1lLCBwdy0+cHdfZ2lkKSAhPSAwIHx8CisJCSAgICBzZXRnaWQocHctPnB3X2dpZCkgIT0gMCB8fCBzZXR1aWQocHctPnB3X3VpZCkgIT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiBDb3VsZG4ndCBjaGFuZ2UgdG8gJyUuMzJzJyB1aWQ9JWx1IGdpZD0lbHU6ICVzXG4iLAorCQkJICAgIHVzZXJuYW1lLCAKKwkJCSAgICAodW5zaWduZWQgbG9uZylwdy0+cHdfdWlkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXB3LT5wd19naWQsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiBDb3VsZG4ndCBmaW5kIHVzZXIgJyUuMzJzJ1xuIiwKKwkJICAgIHVzZXJuYW1lKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisjZW5kaWYgLyogV0lOMzIgKi8KKworc3RhdGljIGludAorZ2V0V2ZsYWdDaGFycyhpbnQgeCkKK3sKKwlpbnQgYyA9IDA7CisKKwl4IC09IDE7CisJd2hpbGUgKHggPiAwKSB7CisJCWMgKz0gMTsKKwkJeCAvPSAxMDsKKwl9CisKKwlyZXR1cm4gYzsKK30KKworCitzdGF0aWMgdm9pZAorTWFrZUZpbGVuYW1lKGNoYXIgKmJ1ZmZlciwgY2hhciAqb3JpZ19uYW1lLCBpbnQgY250LCBpbnQgbWF4X2NoYXJzKQoreworCWlmIChjbnQgPT0gMCAmJiBtYXhfY2hhcnMgPT0gMCkKKwkJc3RyY3B5KGJ1ZmZlciwgb3JpZ19uYW1lKTsKKwllbHNlCisJCXNwcmludGYoYnVmZmVyLCAiJXMlMCpkIiwgb3JpZ19uYW1lLCBtYXhfY2hhcnMsIGNudCk7Cit9CisKK3N0YXRpYyBpbnQgdGNwZHVtcF9wcmludGYobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8gX1VfLAorCQkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgCisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHJldDsKKworICB2YV9zdGFydChhcmdzLCBmbXQpOworICByZXQ9dmZwcmludGYoc3Rkb3V0LCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisKKyAgcmV0dXJuIHJldDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBpbnQgY250LCBvcCwgaTsKKwlicGZfdV9pbnQzMiBsb2NhbG5ldCwgbmV0bWFzazsKKwlyZWdpc3RlciBjaGFyICpjcCwgKmluZmlsZSwgKmNtZGJ1ZiwgKmRldmljZSwgKlJGaWxlTmFtZSwgKldGaWxlTmFtZSwgKldGaWxlTmFtZUFsdDsKKwlwY2FwX2hhbmRsZXIgY2FsbGJhY2s7CisJaW50IHR5cGU7CisJc3RydWN0IGJwZl9wcm9ncmFtIGZjb2RlOworI2lmbmRlZiBXSU4zMgorCVJFVFNJR1RZUEUgKCpvbGRoYW5kbGVyKShpbnQpOworI2VuZGlmCisJc3RydWN0IHByaW50X2luZm8gcHJpbnRpbmZvOworCXN0cnVjdCBkdW1wX2luZm8gZHVtcGluZm87CisJdV9jaGFyICpwY2FwX3VzZXJkYXRhOworCWNoYXIgZWJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKwljaGFyICp1c2VybmFtZSA9IE5VTEw7CisJY2hhciAqY2hyb290X2RpciA9IE5VTEw7CisjaWZkZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCisJcGNhcF9pZl90ICpkZXZwb2ludGVyOworCWludCBkZXZudW07CisjZW5kaWYKKwlpbnQgc3RhdHVzOworI2lmZGVmIFdJTjMyCisJdV9pbnQgVXNlckJ1ZmZlclNpemUgPSAxMDAwMDAwOworCWlmKHdzb2NraW5pdCgpICE9IDApIHJldHVybiAxOworI2VuZGlmIC8qIFdJTjMyICovCisKKyAgICAgICAgZ25kby0+bmRvX09mbGFnPTE7CisJZ25kby0+bmRvX1JmbGFnPTE7CisJZ25kby0+bmRvX2RsdD0tMTsKKwlnbmRvLT5uZG9fZGVmYXVsdF9wcmludD1uZG9fZGVmYXVsdF9wcmludDsKKwlnbmRvLT5uZG9fcHJpbnRmPXRjcGR1bXBfcHJpbnRmOworCWduZG8tPm5kb19lcnJvcj1uZG9fZXJyb3I7CisJZ25kby0+bmRvX3dhcm5pbmc9bmRvX3dhcm5pbmc7CisJZ25kby0+bmRvX3NuYXBsZW4gPSBERUZBVUxUX1NOQVBMRU47CisgIAorCWNudCA9IC0xOworCWRldmljZSA9IE5VTEw7CisJaW5maWxlID0gTlVMTDsKKwlSRmlsZU5hbWUgPSBOVUxMOworCVdGaWxlTmFtZSA9IE5VTEw7CisJaWYgKChjcCA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCkKKwkJcHJvZ3JhbV9uYW1lID0gY3AgKyAxOworCWVsc2UKKwkJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworCWlmIChhYm9ydF9vbl9taXNhbGlnbm1lbnQoZWJ1Ziwgc2l6ZW9mKGVidWYpKSA8IDApCisJCWVycm9yKCIlcyIsIGVidWYpOworCisjaWZkZWYgTElCU01JCisJc21pSW5pdCgidGNwZHVtcCIpOworI2VuZGlmCisKKwlvcHRlcnIgPSAwOworCXdoaWxlICgKKwkgICAgKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhQSIgQl9GTEFHICJjOkM6ZCIgRF9GTEFHICJlRTpmRjppOmxMbTpNOm5OT3BxcjpSczpTdFQ6dSIgVV9GTEFHICJ2dzpXOnhYeTpZWjoiKSkgIT0gLTEpCisJCXN3aXRjaCAob3ApIHsKKworCQljYXNlICdhJzoKKwkJCS8qIGNvbXBhdGliaWxpdHkgZm9yIG9sZCAtYSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAnQSc6CisJCQkrK0FmbGFnOworCQkJYnJlYWs7CisKKyNpZmRlZiBXSU4zMgorCQljYXNlICdCJzoKKwkJCVVzZXJCdWZmZXJTaXplID0gYXRvaShvcHRhcmcpKjEwMjQ7CisJCQlpZiAoVXNlckJ1ZmZlclNpemUgPCAwKQorCQkJCWVycm9yKCJpbnZhbGlkIHBhY2tldCBidWZmZXIgc2l6ZSAlcyIsIG9wdGFyZyk7CisJCQlicmVhazsKKyNlbmRpZiAvKiBXSU4zMiAqLworCisJCWNhc2UgJ2MnOgorCQkJY250ID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGNudCA8PSAwKQorCQkJCWVycm9yKCJpbnZhbGlkIHBhY2tldCBjb3VudCAlcyIsIG9wdGFyZyk7CisJCQlicmVhazsKKworCQljYXNlICdDJzoKKwkJCUNmbGFnID0gYXRvaShvcHRhcmcpICogMTAwMDAwMDsKKwkJCWlmIChDZmxhZyA8IDApCisJCQkJZXJyb3IoImludmFsaWQgZmlsZSBzaXplICVzIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQkJKytkZmxhZzsKKwkJCWJyZWFrOworCisjaWZkZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCisJCWNhc2UgJ0QnOgorCQkJaWYgKHBjYXBfZmluZGFsbGRldnMoJmRldnBvaW50ZXIsIGVidWYpIDwgMCkKKwkJCQllcnJvcigiJXMiLCBlYnVmKTsKKwkJCWVsc2UgeworCQkJCWZvciAoaSA9IDA7IGRldnBvaW50ZXIgIT0gMDsgaSsrKSB7CisJCQkJCXByaW50ZigiJWQuJXMiLCBpKzEsIGRldnBvaW50ZXItPm5hbWUpOworCQkJCQlpZiAoZGV2cG9pbnRlci0+ZGVzY3JpcHRpb24gIT0gTlVMTCkKKwkJCQkJCXByaW50ZigiICglcykiLCBkZXZwb2ludGVyLT5kZXNjcmlwdGlvbik7CisJCQkJCXByaW50ZigiXG4iKTsKKwkJCQkJZGV2cG9pbnRlciA9IGRldnBvaW50ZXItPm5leHQ7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDA7CisjZW5kaWYgLyogSEFWRV9QQ0FQX0ZJTkRBTExERVZTICovCisKKwkJY2FzZSAnTCc6CisJCQlMZmxhZysrOworCQkJYnJlYWs7CisKKwkJY2FzZSAnZSc6CisJCQkrK2VmbGFnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRSc6CisjaWZuZGVmIEhBVkVfTElCQ1JZUFRPCisJCQl3YXJuaW5nKCJjcnlwdG8gY29kZSBub3QgY29tcGlsZWQgaW4iKTsKKyNlbmRpZgorCQkJZ25kby0+bmRvX2VzcHNlY3JldCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2YnOgorCQkJKytmZmxhZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ0YnOgorCQkJaW5maWxlID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCQlpZiAob3B0YXJnWzBdID09ICcwJyAmJiBvcHRhcmdbMV0gPT0gMCkKKwkJCQllcnJvcigiSW52YWxpZCBhZGFwdGVyIGluZGV4Iik7CisJCQkKKyNpZmRlZiBIQVZFX1BDQVBfRklOREFMTERFVlMKKwkJCS8qCisJCQkgKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIHRyZWF0IGl0IGFzCisJCQkgKiBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IG9mIGFkYXB0ZXJzLCBhcworCQkJICogcHJpbnRlZCBieSAidGNwZHVtcCAtRCIuCisJCQkgKgorCQkJICogVGhpcyBzaG91bGQgYmUgT0sgb24gVU5JWCBzeXN0ZW1zLCBhcyBpbnRlcmZhY2VzCisJCQkgKiBzaG91bGRuJ3QgaGF2ZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggZGlnaXRzLgorCQkJICogSXQgY2FuIGJlIHVzZWZ1bCBvbiBXaW5kb3dzLCB3aGVyZSBtb3JlIHRoYW4KKwkJCSAqIG9uZSBpbnRlcmZhY2UgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZS4KKwkJCSAqLworCQkJaWYgKChkZXZudW0gPSBhdG9pKG9wdGFyZykpICE9IDApIHsKKwkJCQlpZiAoZGV2bnVtIDwgMCkKKwkJCQkJZXJyb3IoIkludmFsaWQgYWRhcHRlciBpbmRleCIpOworCisJCQkJaWYgKHBjYXBfZmluZGFsbGRldnMoJmRldnBvaW50ZXIsIGVidWYpIDwgMCkKKwkJCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJCQkJZWxzZSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBkZXZudW0tMTsgaSsrKXsKKwkJCQkJCWRldnBvaW50ZXIgPSBkZXZwb2ludGVyLT5uZXh0OworCQkJCQkJaWYgKGRldnBvaW50ZXIgPT0gTlVMTCkKKwkJCQkJCQllcnJvcigiSW52YWxpZCBhZGFwdGVyIGluZGV4Iik7CisJCQkJCX0KKwkJCQl9CisJCQkJZGV2aWNlID0gZGV2cG9pbnRlci0+bmFtZTsKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvKiBIQVZFX1BDQVBfRklOREFMTERFVlMgKi8KKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2wnOgorI2lmZGVmIFdJTjMyCisJCQkvKgorCQkJICogX0lPTEJGIGlzIHRoZSBzYW1lIGFzIF9JT0ZCRiBpbiBNaWNyb3NvZnQncyBDCisJCQkgKiBsaWJyYXJpZXM7IHRoZSBvbmx5IGFsdGVybmF0aXZlIHRoZXkgb2ZmZXIKKwkJCSAqIGlzIF9JT05CRi4KKwkJCSAqCisJCQkgKiBYWFggLSB0aGlzIHNob3VsZCByZWFsbHkgYmUgY2hlY2tpbmcgZm9yIE1TVkMrKywKKwkJCSAqIG5vdCBXSU4zMiwgaWYsIGZvciBleGFtcGxlLCBNaW5HVyBoYXMgaXRzIG93bgorCQkJICogQyBsaWJyYXJ5IHRoYXQgaXMgbW9yZSBVTklYLWNvbXBhdGlibGUuCisJCQkgKi8KKwkJCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworI2Vsc2UgLyogV0lOMzIgKi8KKyNpZmRlZiBIQVZFX1NFVExJTkVCVUYKKwkJCXNldGxpbmVidWYoc3Rkb3V0KTsKKyNlbHNlCisJCQlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTEJGLCAwKTsKKyNlbmRpZgorI2VuZGlmIC8qIFdJTjMyICovCisJCQlicmVhazsKKworCQljYXNlICduJzoKKwkJCSsrbmZsYWc7CisJCQlicmVhazsKKworCQljYXNlICdOJzoKKwkJCSsrTmZsYWc7CisJCQlicmVhazsKKworCQljYXNlICdtJzoKKyNpZmRlZiBMSUJTTUkKKwkJICAgICAgICBpZiAoc21pTG9hZE1vZHVsZShvcHRhcmcpID09IDApIHsKKwkJCQllcnJvcigiY291bGQgbm90IGxvYWQgTUlCIG1vZHVsZSAlcyIsIG9wdGFyZyk7CisJCSAgICAgICAgfQorCQkJc2ZsYWcgPSAxOworI2Vsc2UKKwkJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IGlnbm9yaW5nIG9wdGlvbiBgLW0gJXMnICIsCisJCQkJICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOworCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIobm8gbGlic21pIHN1cHBvcnQpXG4iKTsKKyNlbmRpZgorCQkJYnJlYWs7CisKKwkJY2FzZSAnTSc6CisJCQkvKiBUQ1AtTUQ1IHNoYXJlZCBzZWNyZXQgKi8KKyNpZm5kZWYgSEFWRV9MSUJDUllQVE8KKwkJCXdhcm5pbmcoImNyeXB0byBjb2RlIG5vdCBjb21waWxlZCBpbiIpOworI2VuZGlmCisJCQl0Y3BtZDVzZWNyZXQgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdPJzoKKwkJCU9mbGFnID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3AnOgorCQkJKytwZmxhZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3EnOgorCQkJKytxZmxhZzsKKwkJCSsrc3VwcHJlc3NfZGVmYXVsdF9wcmludDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3InOgorCQkJUkZpbGVOYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnUic6CisJCQlSZmxhZyA9IDA7CisJCQlicmVhazsKKworCQljYXNlICdzJzogeworCQkJY2hhciAqZW5kOworCisJCQlzbmFwbGVuID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMCk7CisJCQlpZiAob3B0YXJnID09IGVuZCB8fCAqZW5kICE9ICdcMCcKKwkJCSAgICB8fCBzbmFwbGVuIDwgMCB8fCBzbmFwbGVuID4gNjU1MzUpCisJCQkJZXJyb3IoImludmFsaWQgc25hcGxlbiAlcyIsIG9wdGFyZyk7CisJCQllbHNlIGlmIChzbmFwbGVuID09IDApCisJCQkJc25hcGxlbiA9IDY1NTM1OworCQkJYnJlYWs7CisJCX0KKworCQljYXNlICdTJzoKKwkJCSsrU2ZsYWc7CisJCQlicmVhazsKKworCQljYXNlICd0JzoKKwkJCSsrdGZsYWc7CisJCQlicmVhazsKKworCQljYXNlICdUJzoKKwkJCWlmIChzdHJjYXNlY21wKG9wdGFyZywgInZhdCIpID09IDApCisJCQkJcGFja2V0dHlwZSA9IFBUX1ZBVDsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAid2IiKSA9PSAwKQorCQkJCXBhY2tldHR5cGUgPSBQVF9XQjsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAicnBjIikgPT0gMCkKKwkJCQlwYWNrZXR0eXBlID0gUFRfUlBDOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJydHAiKSA9PSAwKQorCQkJCXBhY2tldHR5cGUgPSBQVF9SVFA7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInJ0Y3AiKSA9PSAwKQorCQkJCXBhY2tldHR5cGUgPSBQVF9SVENQOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJzbm1wIikgPT0gMCkKKwkJCQlwYWNrZXR0eXBlID0gUFRfU05NUDsKKwkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiY25mcCIpID09IDApCisJCQkJcGFja2V0dHlwZSA9IFBUX0NORlA7CisJCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInRmdHAiKSA9PSAwKQorCQkJCXBhY2tldHR5cGUgPSBQVF9URlRQOworCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJhb2R2IikgPT0gMCkKKwkJCQlwYWNrZXR0eXBlID0gUFRfQU9EVjsKKwkJCWVsc2UKKwkJCQllcnJvcigidW5rbm93biBwYWNrZXQgdHlwZSBgJXMnIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3UnOgorCQkJKyt1ZmxhZzsKKwkJCWJyZWFrOworCisjaWZkZWYgSEFWRV9QQ0FQX0RVTVBfRkxVU0gKKwkJY2FzZSAnVSc6CisJCQkrK1VmbGFnOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlICd2JzoKKwkJCSsrdmZsYWc7CisJCQlicmVhazsKKworCQljYXNlICd3JzoKKwkJCVdGaWxlTmFtZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1cnOgorCQkJV2ZsYWcgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoV2ZsYWcgPCAwKSAKKwkJCQllcnJvcigiaW52YWxpZCBudW1iZXIgb2Ygb3V0cHV0IGZpbGVzICVzIiwgb3B0YXJnKTsKKwkJCVdmbGFnQ2hhcnMgPSBnZXRXZmxhZ0NoYXJzKFdmbGFnKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3gnOgorCQkJKyt4ZmxhZzsKKwkJCSsrc3VwcHJlc3NfZGVmYXVsdF9wcmludDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJKytYZmxhZzsKKwkJCSsrc3VwcHJlc3NfZGVmYXVsdF9wcmludDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3knOgorCQkJZ25kby0+bmRvX2RsdG5hbWUgPSBvcHRhcmc7CisJCQlnbmRvLT5uZG9fZGx0ID0KKwkJCSAgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChnbmRvLT5uZG9fZGx0bmFtZSk7CisJCQlpZiAoZ25kby0+bmRvX2RsdCA8IDApCisJCQkJZXJyb3IoImludmFsaWQgZGF0YSBsaW5rIHR5cGUgJXMiLCBnbmRvLT5uZG9fZGx0bmFtZSk7CisJCQlicmVhazsKKworI2lmIGRlZmluZWQoSEFWRV9QQ0FQX0RFQlVHKSB8fCBkZWZpbmVkKEhBVkVfWVlERUJVRykKKwkJY2FzZSAnWSc6CisJCQl7CisJCQkvKiBVbmRvY3VtZW50ZWQgZmxhZyAqLworI2lmZGVmIEhBVkVfUENBUF9ERUJVRworCQkJZXh0ZXJuIGludCBwY2FwX2RlYnVnOworCQkJcGNhcF9kZWJ1ZyA9IDE7CisjZWxzZQorCQkJZXh0ZXJuIGludCB5eWRlYnVnOworCQkJeXlkZWJ1ZyA9IDE7CisjZW5kaWYKKwkJCX0KKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgJ1onOgorCQkJaWYgKG9wdGFyZykgeworCQkJCXVzZXJuYW1lID0gc3RyZHVwKG9wdGFyZyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQl1c2FnZSgpOworCQkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisKKwlzd2l0Y2ggKHRmbGFnKSB7CisKKwljYXNlIDA6IC8qIERlZmF1bHQgKi8KKwljYXNlIDQ6IC8qIERlZmF1bHQgKyBEYXRlKi8KKwkJdGhpc3pvbmUgPSBnbXQybG9jYWwoMCk7CisJCWJyZWFrOworCisJY2FzZSAxOiAvKiBObyB0aW1lIHN0YW1wICovCisJY2FzZSAyOiAvKiBVbml4IHRpbWV2YWwgc3R5bGUgKi8KKwljYXNlIDM6IC8qIE1pY3Jvc2Vjb25kcyBzaW5jZSBwcmV2aW91cyBwYWNrZXQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OiAvKiBOb3Qgc3VwcG9ydGVkICovCisJCWVycm9yKCJvbmx5IC10LCAtdHQsIC10dHQsIGFuZCAtdHR0dCBhcmUgc3VwcG9ydGVkIik7CisJCWJyZWFrOworCX0KKworI2lmZGVmIFdJVEhfQ0hST09UCisJLyogaWYgcnVuIGFzIHJvb3QsIHByZXBhcmUgZm9yIGNocm9vdGluZyAqLworCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7CisJCS8qIGZ1dHVyZSBleHRlbnNpYmlsaXR5IGZvciBjbWQtbGluZSBhcmd1bWVudHMgKi8KKwkJaWYgKCFjaHJvb3RfZGlyKQorCQkJY2hyb290X2RpciA9IFdJVEhfQ0hST09UOworCX0KKyNlbmRpZgorCisjaWZkZWYgV0lUSF9VU0VSCisJLyogaWYgcnVuIGFzIHJvb3QsIHByZXBhcmUgZm9yIGRyb3BwaW5nIHJvb3QgcHJpdmlsZWdlcyAqLworCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7CisJCS8qIFJ1biB3aXRoICctWiByb290JyB0byByZXN0b3JlIG9sZCBiZWhhdmlvdXIgKi8gCisJCWlmICghdXNlcm5hbWUpCisJCQl1c2VybmFtZSA9IFdJVEhfVVNFUjsKKwl9CisjZW5kaWYKKworCWlmIChSRmlsZU5hbWUgIT0gTlVMTCkgeworCQlpbnQgZGx0OworCQljb25zdCBjaGFyICpkbHRfbmFtZTsKKworI2lmbmRlZiBXSU4zMgorCQkvKgorCQkgKiBXZSBkb24ndCBuZWVkIG5ldHdvcmsgYWNjZXNzLCBzbyByZWxpbnF1aXNoIGFueSBzZXQtVUlECisJCSAqIG9yIHNldC1HSUQgcHJpdmlsZWdlcyB3ZSBoYXZlIChpZiBhbnkpLgorCQkgKgorCQkgKiBXZSBkbyAqbm90KiB3YW50IHNldC1VSUQgcHJpdmlsZWdlcyB3aGVuIG9wZW5pbmcgYQorCQkgKiB0cmFjZSBmaWxlLCBhcyB0aGF0IG1pZ2h0IGxldCB0aGUgdXNlciByZWFkIG90aGVyCisJCSAqIHBlb3BsZSdzIHRyYWNlIGZpbGVzIChlc3BlY2lhbGx5IGlmIHdlJ3JlIHNldC1VSUQKKwkJICogcm9vdCkuCisJCSAqLworCQlpZiAoc2V0Z2lkKGdldGdpZCgpKSAhPSAwIHx8IHNldHVpZChnZXR1aWQoKSkgIT0gMCApCisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHNldGdpZC9zZXR1aWQgZmFpbGVkICFcbiIpOworI2VuZGlmIC8qIFdJTjMyICovCisJCXBkID0gcGNhcF9vcGVuX29mZmxpbmUoUkZpbGVOYW1lLCBlYnVmKTsKKwkJaWYgKHBkID09IE5VTEwpCisJCQllcnJvcigiJXMiLCBlYnVmKTsKKwkJZGx0ID0gcGNhcF9kYXRhbGluayhwZCk7CisJCWRsdF9uYW1lID0gcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShkbHQpOworCQlpZiAoZGx0X25hbWUgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJyZWFkaW5nIGZyb20gZmlsZSAlcywgbGluay10eXBlICV1XG4iLAorCQkJICAgIFJGaWxlTmFtZSwgZGx0KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJICAgICJyZWFkaW5nIGZyb20gZmlsZSAlcywgbGluay10eXBlICVzICglcylcbiIsCisJCQkgICAgUkZpbGVOYW1lLCBkbHRfbmFtZSwKKwkJCSAgICBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihkbHQpKTsKKwkJfQorCQlsb2NhbG5ldCA9IDA7CisJCW5ldG1hc2sgPSAwOworCQlpZiAoZmZsYWcgIT0gMCkKKwkJCWVycm9yKCItZiBhbmQgLXIgb3B0aW9ucyBhcmUgaW5jb21wYXRpYmxlIik7CisJfSBlbHNlIHsKKwkJaWYgKGRldmljZSA9PSBOVUxMKSB7CisJCQlkZXZpY2UgPSBwY2FwX2xvb2t1cGRldihlYnVmKTsKKwkJCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJCQllcnJvcigiJXMiLCBlYnVmKTsKKwkJfQorI2lmZGVmIFdJTjMyCisJCWlmKHN0cmxlbihkZXZpY2UpID09IDEpCS8vd2UgYXNzdW1lIHRoYXQgYW4gQVNDSUkgc3RyaW5nIGlzIGFsd2F5cyBsb25nZXIgdGhhbiAxIGNoYXIKKwkJewkJCQkJCS8vYSBVbmljb2RlIHN0cmluZyBoYXMgYSBcMCBhcyBzZWNvbmQgYnl0ZSAoc28gc3RybGVuKCkgaXMgMSkKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGxpc3RlbmluZyBvbiAld3NcbiIsIHByb2dyYW1fbmFtZSwgZGV2aWNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGxpc3RlbmluZyBvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBkZXZpY2UpOworCQl9CisKKwkJZmZsdXNoKHN0ZGVycik7CQorI2VuZGlmIC8qIFdJTjMyICovCisJCSplYnVmID0gJ1wwJzsKKwkJcGQgPSBwY2FwX29wZW5fbGl2ZShkZXZpY2UsIHNuYXBsZW4sICFwZmxhZywgMTAwMCwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJCWVsc2UgaWYgKCplYnVmKQorCQkJd2FybmluZygiJXMiLCBlYnVmKTsKKwkJLyoKKwkJICogTGV0IHVzZXIgb3duIHByb2Nlc3MgYWZ0ZXIgc29ja2V0IGhhcyBiZWVuIG9wZW5lZC4KKwkJICovCisjaWZuZGVmIFdJTjMyCisJCWlmIChzZXRnaWQoZ2V0Z2lkKCkpICE9IDAgfHwgc2V0dWlkKGdldHVpZCgpKSAhPSAwKQorCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBzZXRnaWQvc2V0dWlkIGZhaWxlZCAhXG4iKTsKKyNlbmRpZiAvKiBXSU4zMiAqLworI2lmZGVmIFdJTjMyCisJCWlmKFVzZXJCdWZmZXJTaXplICE9IDEwMDAwMDApCisJCQlpZihwY2FwX3NldGJ1ZmYocGQsIFVzZXJCdWZmZXJTaXplKT09LTEpeworCQkJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCQl9CisjZW5kaWYgLyogV0lOMzIgKi8KKwkJaWYgKExmbGFnKQorCQkJc2hvd19kbHRzX2FuZF9leGl0KHBkKTsKKwkJaWYgKGduZG8tPm5kb19kbHQgPj0gMCkgeworI2lmZGVmIEhBVkVfUENBUF9TRVRfREFUQUxJTksKKwkJCWlmIChwY2FwX3NldF9kYXRhbGluayhwZCwgZ25kby0+bmRvX2RsdCkgPCAwKQorCQkJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisjZWxzZQorCQkJLyoKKwkJCSAqIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgY2hhbmdpbmcgdGhlCisJCQkgKiBkYXRhIGxpbmsgdHlwZSwgc28gd2Ugb25seSBsZXQgdGhlbQorCQkJICogc2V0IGl0IHRvIHdoYXQgaXQgYWxyZWFkeSBpcy4KKwkJCSAqLworCQkJaWYgKGduZG8tPm5kb19kbHQgIT0gcGNhcF9kYXRhbGluayhwZCkpIHsKKwkJCQllcnJvcigiJXMgaXMgbm90IG9uZSBvZiB0aGUgRExUcyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2VcbiIsCisJCQkJICAgICAgZ25kby0+bmRvX2RsdG5hbWUpOworCQkJfQorI2VuZGlmCisJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBkYXRhIGxpbmsgdHlwZSAlc1xuIiwKKwkJCSAgICAgICAgICAgICAgcHJvZ3JhbV9uYW1lLCBnbmRvLT5uZG9fZGx0bmFtZSk7CisJCQkodm9pZClmZmx1c2goc3RkZXJyKTsKKwkJfQorCQlpID0gcGNhcF9zbmFwc2hvdChwZCk7CisJCWlmIChzbmFwbGVuIDwgaSkgeworCQkJd2FybmluZygic25hcGxlbiByYWlzZWQgZnJvbSAlZCB0byAlZCIsIHNuYXBsZW4sIGkpOworCQkJc25hcGxlbiA9IGk7CisJCX0KKwkJaWYgKHBjYXBfbG9va3VwbmV0KGRldmljZSwgJmxvY2FsbmV0LCAmbmV0bWFzaywgZWJ1ZikgPCAwKSB7CisJCQlsb2NhbG5ldCA9IDA7CisJCQluZXRtYXNrID0gMDsKKwkJCXdhcm5pbmcoIiVzIiwgZWJ1Zik7CisJCX0KKwl9CisJaWYgKGluZmlsZSkKKwkJY21kYnVmID0gcmVhZF9pbmZpbGUoaW5maWxlKTsKKwllbHNlCisJCWNtZGJ1ZiA9IGNvcHlfYXJndigmYXJndltvcHRpbmRdKTsKKworCWlmIChwY2FwX2NvbXBpbGUocGQsICZmY29kZSwgY21kYnVmLCBPZmxhZywgbmV0bWFzaykgPCAwKQorCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOworCWlmIChkZmxhZykgeworCQlicGZfZHVtcCgmZmNvZGUsIGRmbGFnKTsKKwkJcGNhcF9jbG9zZShwZCk7CisJCWV4aXQoMCk7CisJfQorCWluaXRfYWRkcnRvbmFtZShsb2NhbG5ldCwgbmV0bWFzayk7CisKKyNpZm5kZWYgV0lOMzIJCisJKHZvaWQpc2V0c2lnbmFsKFNJR1BJUEUsIGNsZWFudXApOworI2VuZGlmIC8qIFdJTjMyICovCisJKHZvaWQpc2V0c2lnbmFsKFNJR1RFUk0sIGNsZWFudXApOworCSh2b2lkKXNldHNpZ25hbChTSUdJTlQsIGNsZWFudXApOworCS8qIENvb3BlcmF0ZSB3aXRoIG5vaHVwKDEpICovCisjaWZuZGVmIFdJTjMyCQorCWlmICgob2xkaGFuZGxlciA9IHNldHNpZ25hbChTSUdIVVAsIGNsZWFudXApKSAhPSBTSUdfREZMKQorCQkodm9pZClzZXRzaWduYWwoU0lHSFVQLCBvbGRoYW5kbGVyKTsKKyNlbmRpZiAvKiBXSU4zMiAqLworCisJaWYgKHBjYXBfc2V0ZmlsdGVyKHBkLCAmZmNvZGUpIDwgMCkKKwkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKwlpZiAoV0ZpbGVOYW1lKSB7CisJCXBjYXBfZHVtcGVyX3QgKnA7CisKKwkJV0ZpbGVOYW1lQWx0ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKFdGaWxlTmFtZSkgKyBNQVhfQ0ZMQUdfQ0hBUlMgKyAxKTsKKwkJaWYgKFdGaWxlTmFtZUFsdCA9PSBOVUxMKQorCQkJZXJyb3IoIm1hbGxvYyBvZiBXRmlsZU5hbWVBbHQiKTsKKwkJTWFrZUZpbGVuYW1lKFdGaWxlTmFtZUFsdCwgV0ZpbGVOYW1lLCAwLCBXZmxhZ0NoYXJzKTsKKwkJcCA9IHBjYXBfZHVtcF9vcGVuKHBkLCBXRmlsZU5hbWVBbHQpOworCQlpZiAocCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKwkJaWYgKENmbGFnICE9IDApIHsKKwkJCWNhbGxiYWNrID0gZHVtcF9wYWNrZXRfYW5kX3RydW5jOworCQkJZHVtcGluZm8uV0ZpbGVOYW1lID0gV0ZpbGVOYW1lOworCQkJZHVtcGluZm8ucGQgPSBwZDsKKwkJCWR1bXBpbmZvLnAgPSBwOworCQkJcGNhcF91c2VyZGF0YSA9ICh1X2NoYXIgKikmZHVtcGluZm87CisJCX0gZWxzZSB7CisJCQljYWxsYmFjayA9IGR1bXBfcGFja2V0OworCQkJcGNhcF91c2VyZGF0YSA9ICh1X2NoYXIgKilwOworCQl9CisJfSBlbHNlIHsKKwkJdHlwZSA9IHBjYXBfZGF0YWxpbmsocGQpOworCQlwcmludGluZm8ucHJpbnRlciA9IGxvb2t1cF9wcmludGVyKHR5cGUpOworCQlpZiAocHJpbnRpbmZvLnByaW50ZXIgPT0gTlVMTCkgeworCQkJZ25kby0+bmRvX2RsdG5hbWUgPSBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKHR5cGUpOworCQkJaWYgKGduZG8tPm5kb19kbHRuYW1lICE9IE5VTEwpCisJCQkJZXJyb3IoInVuc3VwcG9ydGVkIGRhdGEgbGluayB0eXBlICVzIiwKKwkJCQkgICAgICBnbmRvLT5uZG9fZGx0bmFtZSk7CisJCQllbHNlCisJCQkJZXJyb3IoInVuc3VwcG9ydGVkIGRhdGEgbGluayB0eXBlICVkIiwgdHlwZSk7CisJCX0KKwkJY2FsbGJhY2sgPSBwcmludF9wYWNrZXQ7CisJCXBjYXBfdXNlcmRhdGEgPSAodV9jaGFyICopJnByaW50aW5mbzsKKwl9CisjaWZuZGVmIFdJTjMyCisJLyoKKwkgKiBXZSBjYW5ub3QgZG8gdGhpcyBlYXJsaWVyLCBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBvcGVuCisJICogdGhlIGZpbGUgKGlmIGRvbmUpIGZvciB3cml0aW5nIGJlZm9yZSBnaXZpbmcgdXAgcGVybWlzc2lvbnMuCisJICovCisJaWYgKGdldHVpZCgpID09IDAgfHwgZ2V0ZXVpZCgpID09IDApIHsKKwkJaWYgKHVzZXJuYW1lIHx8IGNocm9vdF9kaXIpCisJCQlkcm9wcm9vdCh1c2VybmFtZSwgY2hyb290X2Rpcik7CisJfQorI2VuZGlmIC8qIFdJTjMyICovCisjaWZkZWYgU0lHSU5GTworCSh2b2lkKXNldHNpZ25hbChTSUdJTkZPLCByZXF1ZXN0aW5mbyk7CisjZW5kaWYKKworCWlmICh2ZmxhZyA+IDAgJiYgV0ZpbGVOYW1lKSB7CisJCS8qCisJCSAqIFdoZW4gY2FwdHVyaW5nIHRvIGEgZmlsZSwgIi12IiBtZWFucyB0Y3BkdW1wIHNob3VsZCwKKwkJICogZXZlcnkgMTAgc2Vjb2RucywgInYiZXJib3NlbHkgcmVwb3J0IHRoZSBudW1iZXIgb2YKKwkJICogcGFja2V0cyBjYXB0dXJlZC4KKwkJICovCisjaWZkZWYgVVNFX1dJTjMyX01NX1RJTUVSCisJCS8qIGNhbGwgdmVyYm9zZV9zdGF0c19kdW1wKCkgZWFjaCAxMDAwICsvLTEwMG1zZWMgKi8KKwkJdGltZXJfaWQgPSB0aW1lU2V0RXZlbnQoMTAwMCwgMTAwLCB2ZXJib3NlX3N0YXRzX2R1bXAsIDAsIFRJTUVfUEVSSU9ESUMpOworCQlzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCAwKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9BTEFSTSkKKwkJKHZvaWQpc2V0c2lnbmFsKFNJR0FMUk0sIHZlcmJvc2Vfc3RhdHNfZHVtcCk7CisJCWFsYXJtKDEpOworI2VuZGlmCisJfQorCisjaWZuZGVmIFdJTjMyCisJaWYgKFJGaWxlTmFtZSA9PSBOVUxMKSB7CisJCWludCBkbHQ7CisJCWNvbnN0IGNoYXIgKmRsdF9uYW1lOworCisJCWlmICghdmZsYWcgJiYgIVdGaWxlTmFtZSkgeworCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsCisJCQkgICAgIiVzOiB2ZXJib3NlIG91dHB1dCBzdXBwcmVzc2VkLCB1c2UgLXYgb3IgLXZ2IGZvciBmdWxsIHByb3RvY29sIGRlY29kZVxuIiwKKwkJCSAgICBwcm9ncmFtX25hbWUpOworCQl9IGVsc2UKKwkJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisJCWRsdCA9IHBjYXBfZGF0YWxpbmsocGQpOworCQlkbHRfbmFtZSA9IHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoZGx0KTsKKwkJaWYgKGRsdF9uYW1lID09IE5VTEwpIHsKKwkJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAibGlzdGVuaW5nIG9uICVzLCBsaW5rLXR5cGUgJXUsIGNhcHR1cmUgc2l6ZSAldSBieXRlc1xuIiwKKwkJCSAgICBkZXZpY2UsIGRsdCwgc25hcGxlbik7CisJCX0gZWxzZSB7CisJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgImxpc3RlbmluZyBvbiAlcywgbGluay10eXBlICVzICglcyksIGNhcHR1cmUgc2l6ZSAldSBieXRlc1xuIiwKKwkJCSAgICBkZXZpY2UsIGRsdF9uYW1lLAorCQkJICAgIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKGRsdCksIHNuYXBsZW4pOworCQl9CisJCSh2b2lkKWZmbHVzaChzdGRlcnIpOworCX0KKyNlbmRpZiAvKiBXSU4zMiAqLworCXN0YXR1cyA9IHBjYXBfbG9vcChwZCwgY250LCBjYWxsYmFjaywgcGNhcF91c2VyZGF0YSk7CisJaWYgKFdGaWxlTmFtZSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFdlJ3JlIHByaW50aW5nIHBhY2tldHMuICBGbHVzaCB0aGUgcHJpbnRlZCBvdXRwdXQsCisJCSAqIHNvIGl0IGRvZXNuJ3QgZ2V0IGludGVybWluZ2xlZCB3aXRoIGVycm9yIG91dHB1dC4KKwkJICovCisJCWlmIChzdGF0dXMgPT0gLTIpIHsKKwkJCS8qCisJCQkgKiBXZSBnb3QgaW50ZXJydXB0ZWQsIHNvIHBlcmhhcHMgd2UgZGlkbid0CisJCQkgKiBtYW5hZ2UgdG8gZmluaXNoIGEgbGluZSB3ZSB3ZXJlIHByaW50aW5nLgorCQkJICogUHJpbnQgYW4gZXh0cmEgbmV3bGluZSwganVzdCBpbiBjYXNlLgorCQkJICovCisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJCSh2b2lkKWZmbHVzaChzdGRvdXQpOworCX0KKwlpZiAoc3RhdHVzID09IC0xKSB7CisJCS8qCisJCSAqIEVycm9yLiAgUmVwb3J0IGl0LgorCQkgKi8KKwkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogcGNhcF9sb29wOiAlc1xuIiwKKwkJICAgIHByb2dyYW1fbmFtZSwgcGNhcF9nZXRlcnIocGQpKTsKKwl9CisJaWYgKFJGaWxlTmFtZSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFdlJ3JlIGRvaW5nIGEgbGl2ZSBjYXB0dXJlLiAgUmVwb3J0IHRoZSBjYXB0dXJlCisJCSAqIHN0YXRpc3RpY3MuCisJCSAqLworCQlpbmZvKDEpOworCX0KKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KHN0YXR1cyA9PSAtMSA/IDEgOiAwKTsKK30KKworLyogbWFrZSBhIGNsZWFuIGV4aXQgb24gaW50ZXJydXB0cyAqLworc3RhdGljIFJFVFNJR1RZUEUKK2NsZWFudXAoaW50IHNpZ25vIF9VXykKK3sKKyNpZmRlZiBVU0VfV0lOMzJfTU1fVElNRVIKKwlpZiAodGltZXJfaWQpCisJCXRpbWVLaWxsRXZlbnQodGltZXJfaWQpOworCXRpbWVyX2lkID0gMDsKKyNlbGlmIGRlZmluZWQoSEFWRV9BTEFSTSkKKwlhbGFybSgwKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9QQ0FQX0JSRUFLTE9PUAorCS8qCisJICogV2UgaGF2ZSAicGNhcF9icmVha2xvb3AoKSI7IHVzZSBpdCwgc28gdGhhdCB3ZSBkbyBhcyBsaXR0bGUKKwkgKiBhcyBwb3NzaWJsZSBpbiB0aGUgc2lnbmFsIGhhbmRsZXIgKGl0J3MgcHJvYmFibHkgbm90IHNhZmUKKwkgKiB0byBkbyBhbnl0aGluZyB3aXRoIHN0YW5kYXJkIEkvTyBzdHJlYW1zIGluIGEgc2lnbmFsIGhhbmRsZXIgLQorCSAqIHRoZSBBTlNJIEMgc3RhbmRhcmQgZG9lc24ndCBzYXkgaXQgaXMpLgorCSAqLworCXBjYXBfYnJlYWtsb29wKHBkKTsKKyNlbHNlCisJLyoKKwkgKiBXZSBkb24ndCBoYXZlICJwY2FwX2JyZWFrbG9vcCgpIjsgdGhpcyBpc24ndCBzYWZlLCBidXQKKwkgKiBpdCdzIHRoZSBiZXN0IHdlIGNhbiBkby4gIFByaW50IHRoZSBzdW1tYXJ5IGlmIHdlJ3JlCisJICogbm90IHJlYWRpbmcgZnJvbSBhIHNhdmVmaWxlIC0gaS5lLiwgaWYgd2UncmUgZG9pbmcgYQorCSAqIGxpdmUgY2FwdHVyZSAtIGFuZCBleGl0LgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIHBjYXBfZmlsZShwZCkgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSBnb3QgaW50ZXJydXB0ZWQsIHNvIHBlcmhhcHMgd2UgZGlkbid0CisJCSAqIG1hbmFnZSB0byBmaW5pc2ggYSBsaW5lIHdlIHdlcmUgcHJpbnRpbmcuCisJCSAqIFByaW50IGFuIGV4dHJhIG5ld2xpbmUsIGp1c3QgaW4gY2FzZS4KKwkJICovCisJCXB1dGNoYXIoJ1xuJyk7CisJCSh2b2lkKWZmbHVzaChzdGRvdXQpOworCQlpbmZvKDEpOworCX0KKwlleGl0KDApOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitpbmZvKHJlZ2lzdGVyIGludCB2ZXJib3NlKQoreworCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKKworCWlmIChwY2FwX3N0YXRzKHBkLCAmc3RhdCkgPCAwKSB7CisJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAicGNhcF9zdGF0czogJXNcbiIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiV1IHBhY2tldHMgY2FwdHVyZWQiLCBwYWNrZXRzX2NhcHR1cmVkKTsKKwlpZiAoIXZlcmJvc2UpCisJCWZwdXRzKCIsICIsIHN0ZGVycik7CisJZWxzZQorCQlwdXRjKCdcbicsIHN0ZGVycik7CisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlZCBwYWNrZXRzIHJlY2VpdmVkIGJ5IGZpbHRlciIsIHN0YXQucHNfcmVjdik7CisJaWYgKCF2ZXJib3NlKQorCQlmcHV0cygiLCAiLCBzdGRlcnIpOworCWVsc2UKKwkJcHV0YygnXG4nLCBzdGRlcnIpOworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJWQgcGFja2V0cyBkcm9wcGVkIGJ5IGtlcm5lbFxuIiwgc3RhdC5wc19kcm9wKTsKKwlpbmZvcHJpbnQgPSAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9wYWNrZXRfYW5kX3RydW5jKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnNwKQoreworCXN0cnVjdCBkdW1wX2luZm8gKmR1bXBfaW5mbzsKKwljaGFyICpuYW1lOworCisJKytwYWNrZXRzX2NhcHR1cmVkOworCisJKytpbmZvZGVsYXk7CisKKwlkdW1wX2luZm8gPSAoc3RydWN0IGR1bXBfaW5mbyAqKXVzZXI7CisKKwkvKgorCSAqIFhYWCAtIHRoaXMgd29uJ3QgcHJldmVudCBjYXB0dXJlIGZpbGVzIGZyb20gZ2V0dGluZworCSAqIGxhcmdlciB0aGFuIENmbGFnIC0gdGhlIGxhc3QgcGFja2V0IHdyaXR0ZW4gdG8gdGhlCisJICogZmlsZSBjb3VsZCBwdXQgaXQgb3ZlciBDZmxhZy4KKwkgKi8KKwlpZiAocGNhcF9kdW1wX2Z0ZWxsKGR1bXBfaW5mby0+cCkgPiBDZmxhZykgeworCQkvKgorCQkgKiBDbG9zZSB0aGUgY3VycmVudCBmaWxlIGFuZCBvcGVuIGEgbmV3IG9uZS4KKwkJICovCisJCXBjYXBfZHVtcF9jbG9zZShkdW1wX2luZm8tPnApOworCQlDZmxhZ19jb3VudCsrOworCQlpZiAoV2ZsYWcgPiAwKSB7CisJCQlpZiAoQ2ZsYWdfY291bnQgPj0gV2ZsYWcpCisJCQkJQ2ZsYWdfY291bnQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKENmbGFnX2NvdW50ID49IE1BWF9DRkxBRykKKwkJCQllcnJvcigidG9vIG1hbnkgb3V0cHV0IGZpbGVzIik7CisJCX0KKwkJbmFtZSA9IChjaGFyICopbWFsbG9jKHN0cmxlbihkdW1wX2luZm8tPldGaWxlTmFtZSkgKyBNQVhfQ0ZMQUdfQ0hBUlMgKyAxKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkKKwkJCWVycm9yKCJkdW1wX3BhY2tldF9hbmRfdHJ1bmM6IG1hbGxvYyIpOworCQlNYWtlRmlsZW5hbWUobmFtZSwgZHVtcF9pbmZvLT5XRmlsZU5hbWUsIENmbGFnX2NvdW50LCBXZmxhZ0NoYXJzKTsKKwkJZHVtcF9pbmZvLT5wID0gcGNhcF9kdW1wX29wZW4oZHVtcF9pbmZvLT5wZCwgbmFtZSk7CisJCWZyZWUobmFtZSk7CisJCWlmIChkdW1wX2luZm8tPnAgPT0gTlVMTCkKKwkJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisJfQorCisJcGNhcF9kdW1wKCh1X2NoYXIgKilkdW1wX2luZm8tPnAsIGgsIHNwKTsKKyNpZmRlZiBIQVZFX1BDQVBfRFVNUF9GTFVTSAorCWlmIChVZmxhZykKKwkJcGNhcF9kdW1wX2ZsdXNoKGR1bXBfaW5mby0+cCk7CisjZW5kaWYKKworCS0taW5mb2RlbGF5OworCWlmIChpbmZvcHJpbnQpCisJCWluZm8oMCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX3BhY2tldCh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpzcCkKK3sKKwkrK3BhY2tldHNfY2FwdHVyZWQ7CisKKwkrK2luZm9kZWxheTsKKworCXBjYXBfZHVtcCh1c2VyLCBoLCBzcCk7CisjaWZkZWYgSEFWRV9QQ0FQX0RVTVBfRkxVU0gKKwlpZiAoVWZsYWcpCisJCXBjYXBfZHVtcF9mbHVzaCgocGNhcF9kdW1wZXJfdCAqKXVzZXIpOworI2VuZGlmCisKKwktLWluZm9kZWxheTsKKwlpZiAoaW5mb3ByaW50KQorCQlpbmZvKDApOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcGFja2V0KHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnNwKQoreworCXN0cnVjdCBwcmludF9pbmZvICpwcmludF9pbmZvOworCXVfaW50IGhkcmxlbjsKKworCSsrcGFja2V0c19jYXB0dXJlZDsKKworCSsraW5mb2RlbGF5OworCXRzX3ByaW50KCZoLT50cyk7CisKKwlwcmludF9pbmZvID0gKHN0cnVjdCBwcmludF9pbmZvICopdXNlcjsKKworCS8qCisJICogU29tZSBwcmludGVycyB3YW50IHRvIGNoZWNrIHRoYXQgdGhleSdyZSBub3Qgd2Fsa2luZyBvZmYgdGhlCisJICogZW5kIG9mIHRoZSBwYWNrZXQuCisJICogUmF0aGVyIHRoYW4gcGFzcyBpdCBhbGwgdGhlIHdheSBkb3duLCB3ZSBzZXQgdGhpcyBnbG9iYWwuCisJICovCisJc25hcGVuZCA9IHNwICsgaC0+Y2FwbGVuOworCisJaGRybGVuID0gKCpwcmludF9pbmZvLT5wcmludGVyKShoLCBzcCk7CisJaWYgKFhmbGFnKSB7CisJCS8qCisJCSAqIFByaW50IHRoZSByYXcgcGFja2V0IGRhdGEgaW4gaGV4IGFuZCBBU0NJSS4KKwkJICovCisJCWlmIChYZmxhZyA+IDEpIHsKKwkJCS8qCisJCQkgKiBJbmNsdWRlIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KKwkJCSAqLworCQkJaGV4X2FuZF9hc2NpaV9wcmludCgiXG5cdCIsIHNwLCBoLT5jYXBsZW4pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERvbid0IGluY2x1ZGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIC0gYW5kIGlmCisJCQkgKiB3ZSBoYXZlIG5vdGhpbmcgcGFzdCB0aGUgbGluay1sYXllciBoZWFkZXIsCisJCQkgKiBwcmludCBub3RoaW5nLgorCQkJICovCisJCQlpZiAoaC0+Y2FwbGVuID4gaGRybGVuKQorCQkJCWhleF9hbmRfYXNjaWlfcHJpbnQoIlxuXHQiLCBzcCArIGhkcmxlbiwKKwkJCQkgICAgaC0+Y2FwbGVuIC0gaGRybGVuKTsKKwkJfQorCX0gZWxzZSBpZiAoeGZsYWcpIHsKKwkJLyoKKwkJICogUHJpbnQgdGhlIHJhdyBwYWNrZXQgZGF0YSBpbiBoZXguCisJCSAqLworCQlpZiAoeGZsYWcgPiAxKSB7CisJCQkvKgorCQkJICogSW5jbHVkZSB0aGUgbGluay1sYXllciBoZWFkZXIuCisJCQkgKi8KKwkJCWhleF9wcmludCgiXG5cdCIsIHNwLCBoLT5jYXBsZW4pOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERvbid0IGluY2x1ZGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIC0gYW5kIGlmCisJCQkgKiB3ZSBoYXZlIG5vdGhpbmcgcGFzdCB0aGUgbGluay1sYXllciBoZWFkZXIsCisJCQkgKiBwcmludCBub3RoaW5nLgorCQkJICovCisJCQlpZiAoaC0+Y2FwbGVuID4gaGRybGVuKQorCQkJCWhleF9wcmludCgiXG5cdCIsIHNwICsgaGRybGVuLAorCQkJCSAgICBoLT5jYXBsZW4gLSBoZHJsZW4pOworCQl9CisJfSBlbHNlIGlmIChBZmxhZykgeworCQkvKgorCQkgKiBQcmludCB0aGUgcmF3IHBhY2tldCBkYXRhIGluIEFTQ0lJLgorCQkgKi8KKwkJaWYgKEFmbGFnID4gMSkgeworCQkJLyoKKwkJCSAqIEluY2x1ZGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorCQkJICovCisJCQlhc2NpaV9wcmludChzcCwgaC0+Y2FwbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEb24ndCBpbmNsdWRlIHRoZSBsaW5rLWxheWVyIGhlYWRlciAtIGFuZCBpZgorCQkJICogd2UgaGF2ZSBub3RoaW5nIHBhc3QgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLAorCQkJICogcHJpbnQgbm90aGluZy4KKwkJCSAqLworCQkJaWYgKGgtPmNhcGxlbiA+IGhkcmxlbikKKwkJCQlhc2NpaV9wcmludChzcCArIGhkcmxlbiwgaC0+Y2FwbGVuIC0gaGRybGVuKTsKKwkJfQorCX0KKworCXB1dGNoYXIoJ1xuJyk7CisKKwktLWluZm9kZWxheTsKKwlpZiAoaW5mb3ByaW50KQorCQlpbmZvKDApOworfQorCisjaWZkZWYgV0lOMzIKKwkvKgorCSAqIFhYWCAtIHRoZXJlIHNob3VsZCByZWFsbHkgYmUgbGlicGNhcCBjYWxscyB0byBnZXQgdGhlIHZlcnNpb24KKwkgKiBudW1iZXIgYXMgYSBzdHJpbmcgKHRoZSBzdHJpbmcgd291bGQgYmUgZ2VuZXJhdGVkIGZyb20gI2RlZmluZXMKKwkgKiBhdCBydW4gdGltZSwgc28gdGhhdCBpdCdzIG5vdCBnZW5lcmF0ZWQgZnJvbSBzdHJpbmcgY29uc3RhbnRzCisJICogaW4gdGhlIGxpYnJhcnksIGFzLCBvbiBtYW55IFVOSVggc3lzdGVtcywgdGhvc2UgY29uc3RhbnRzIHdvdWxkCisJICogYmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgYXBwbGljYXRpb24gZXhlY3V0YWJsZSBpbWFnZSwgYW5kCisJICogd291bGQgdGh1cyByZWZsZWN0IHRoZSB2ZXJzaW9uIG9mIGxpYnBjYXAgb24gdGhlIHN5c3RlbSBvbgorCSAqIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiB3YXMgKmxpbmtlZCosIG5vdCB0aGUgc3lzdGVtIG9uIHdoaWNoIGl0J3MKKwkgKiAqcnVubmluZyouCisJICoKKwkgKiBUaGF0IHJvdXRpbmUgc2hvdWxkIGJlIGRvY3VtZW50ZWQsIHVubGlrZSB0aGUgInZlcnNpb25bXSIKKwkgKiBzdHJpbmcsIHNvIHRoYXQgVU5JWCB2ZW5kb3JzIHByb3ZpZGluZyB0aGVpciBvd24gbGlicGNhcHMKKwkgKiBkb24ndCBvbWl0IGl0IChhcyBhIGNvdXBsZSBvZiB2ZW5kb3JzIGhhdmUuLi4pLgorCSAqCisJICogUGFja2V0LmRsbCBzaG91bGQgcGVyaGFwcyBhbHNvIGV4cG9ydCBhIHJvdXRpbmUgdG8gcmV0dXJuIHRoZQorCSAqIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBQYWNrZXQuZGxsIGNvZGUsIHRvIHN1cHBseSB0aGUKKwkgKiAiV3BjYXBfdmVyc2lvbiIgaW5mb3JtYXRpb24gb24gV2luZG93cy4KKwkgKi8KKwljaGFyIFdEdmVyc2lvbltdPSJjdXJyZW50LWN2cy50Y3BkdW1wLm9yZyI7CisjaWYgIWRlZmluZWQoSEFWRV9HRU5FUkFURURfVkVSU0lPTikKKwljaGFyIHZlcnNpb25bXT0iY3VycmVudC1jdnMudGNwZHVtcC5vcmciOworI2VuZGlmCisJY2hhciBwY2FwX3ZlcnNpb25bXT0iY3VycmVudC1jdnMudGNwZHVtcC5vcmciOworCWNoYXIgV3BjYXBfdmVyc2lvbltdPSIzLjEiOworI2VuZGlmCisKKy8qCisgKiBCeSBkZWZhdWx0LCBwcmludCB0aGUgc3BlY2lmaWVkIGRhdGEgb3V0IGluIGhleCBhbmQgQVNDSUkuCisgKi8KK3N0YXRpYyB2b2lkCituZG9fZGVmYXVsdF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbyBfVV8sIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKK3sKKwloZXhfYW5kX2FzY2lpX3ByaW50KCJcblx0IiwgYnAsIGxlbmd0aCk7IC8qIHBhc3Mgb24gbGYgYW5kIGlkZW50YXRpb24gc3RyaW5nICovCit9CisKK3ZvaWQKK2RlZmF1bHRfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQoreworCW5kb19kZWZhdWx0X3ByaW50KGduZG8sIGJwLCBsZW5ndGgpOworfQorCisjaWZkZWYgU0lHSU5GTworUkVUU0lHVFlQRSByZXF1ZXN0aW5mbyhpbnQgc2lnbm8gX1VfKQoreworCWlmIChpbmZvZGVsYXkpCisJCSsraW5mb3ByaW50OworCWVsc2UKKwkJaW5mbygwKTsKK30KKyNlbmRpZgorCisvKgorICogQ2FsbGVkIG9uY2UgZWFjaCBzZWNvbmQgaW4gdmVyYm9zZSBtb2RlIHdoaWxlIGR1bXBpbmcgdG8gZmlsZQorICovCisjaWZkZWYgVVNFX1dJTjMyX01NX1RJTUVSCit2b2lkIENBTExCQUNLIHZlcmJvc2Vfc3RhdHNfZHVtcCAoVUlOVCB0aW1lcl9pZCBfVV8sIFVJTlQgbXNnIF9VXywgRFdPUkRfUFRSIGFyZyBfVV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIGR3MSBfVV8sIERXT1JEX1BUUiBkdzIgX1VfKQoreworCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKKworCWlmIChpbmZvZGVsYXkgPT0gMCAmJiBwY2FwX3N0YXRzKHBkLCAmc3RhdCkgPj0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJHb3QgJXVcciIsIHBhY2tldHNfY2FwdHVyZWQpOworfQorI2VsaWYgZGVmaW5lZChIQVZFX0FMQVJNKQorc3RhdGljIHZvaWQgdmVyYm9zZV9zdGF0c19kdW1wKGludCBzaWcgX1VfKQoreworCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKKworCWlmIChpbmZvZGVsYXkgPT0gMCAmJiBwY2FwX3N0YXRzKHBkLCAmc3RhdCkgPj0gMCkKKwkJZnByaW50ZihzdGRlcnIsICJHb3QgJXVcciIsIHBhY2tldHNfY2FwdHVyZWQpOworCWFsYXJtKDEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWV4dGVybiBjaGFyIHZlcnNpb25bXTsKKyNpZm5kZWYgSEFWRV9QQ0FQX0xJQl9WRVJTSU9OCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChIQVZFX1BDQVBfVkVSU0lPTikKKwlleHRlcm4gY2hhciBwY2FwX3ZlcnNpb25bXTsKKyNlbHNlIC8qIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoSEFWRV9QQ0FQX1ZFUlNJT04pICovCisJc3RhdGljIGNoYXIgcGNhcF92ZXJzaW9uW10gPSAidW5rbm93biI7CisjZW5kaWYgLyogZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChIQVZFX1BDQVBfVkVSU0lPTikgKi8KKyNlbmRpZiAvKiBIQVZFX1BDQVBfTElCX1ZFUlNJT04gKi8KKworI2lmZGVmIEhBVkVfUENBUF9MSUJfVkVSU0lPTgorI2lmZGVmIFdJTjMyCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlcyB2ZXJzaW9uICVzLCBiYXNlZCBvbiB0Y3BkdW1wIHZlcnNpb24gJXNcbiIsIHByb2dyYW1fbmFtZSwgV0R2ZXJzaW9uLCB2ZXJzaW9uKTsKKyNlbHNlIC8qIFdJTjMyICovCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlcyB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIHZlcnNpb24pOworI2VuZGlmIC8qIFdJTjMyICovCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlc1xuIixwY2FwX2xpYl92ZXJzaW9uKCkpOworI2Vsc2UgLyogSEFWRV9QQ0FQX0xJQl9WRVJTSU9OICovCisjaWZkZWYgV0lOMzIKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzIHZlcnNpb24gJXMsIGJhc2VkIG9uIHRjcGR1bXAgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBXRHZlcnNpb24sIHZlcnNpb24pOworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiV2luUGNhcCB2ZXJzaW9uICVzLCBiYXNlZCBvbiBsaWJwY2FwIHZlcnNpb24gJXNcbiIsV3BjYXBfdmVyc2lvbiwgcGNhcF92ZXJzaW9uKTsKKyNlbHNlIC8qIFdJTjMyICovCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlcyB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIHZlcnNpb24pOworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAibGlicGNhcCB2ZXJzaW9uICVzXG4iLCBwY2FwX3ZlcnNpb24pOworI2VuZGlmIC8qIFdJTjMyICovCisjZW5kaWYgLyogSEFWRV9QQ0FQX0xJQl9WRVJTSU9OICovCisJKHZvaWQpZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6ICVzIFstYUFkIiBEX0ZMQUcgImVmbExuTk9wcVJTdHUiIFVfRkxBRyAidnhYXSIgQl9GTEFHX1VTQUdFICIgWy1jIGNvdW50XSBbIC1DIGZpbGVfc2l6ZSBdXG4iLCBwcm9ncmFtX25hbWUpOworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorIlx0XHRbIC1FIGFsZ286c2VjcmV0IF0gWyAtRiBmaWxlIF0gWyAtaSBpbnRlcmZhY2UgXSBbIC1NIHNlY3JldCBdXG4iKTsKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwKKyJcdFx0WyAtciBmaWxlIF0gWyAtcyBzbmFwbGVuIF0gWyAtVCB0eXBlIF0gWyAtdyBmaWxlIF1cbiIpOworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorIlx0XHRbIC1XIGZpbGVjb3VudCBdIFsgLXkgZGF0YWxpbmt0eXBlIF0gWyAtWiB1c2VyIF1cbiIpOworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorIlx0XHRbIGV4cHJlc3Npb24gXVxuIik7CisJZXhpdCgxKTsKK30KKworCisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCituZG9fZXJyb3IobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8gX1VfLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCituZG9fd2FybmluZyhuZXRkaXNzZWN0X29wdGlvbnMgKm5kbyBfVV8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBXQVJOSU5HOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KK30KZGlmZiAtLWdpdCBhL3RlbG5ldC5oIGIvdGVsbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExMTA0MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbG5ldC5oCkBAIC0wLDAgKzEsMzQ4IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RlbG5ldC5oLHYgMS40IDIwMDIvMDYvMTEgMTc6MDk6MDEgaXRvanVuIEV4cCAkIChMQkwpICovCisKKy8qCSROZXRCU0Q6IHRlbG5ldC5oLHYgMS45IDIwMDEvMDYvMTEgMDE6NTA6NTAgd2l6IEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRlbG5ldC5oCTguMiAoQmVya2VsZXkpIDEyLzE1LzkzCisgKi8KKworI2lmbmRlZiBfQVJQQV9URUxORVRfSF8KKyNkZWZpbmUJX0FSUEFfVEVMTkVUX0hfCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFRFTE5FVCBwcm90b2NvbC4KKyAqLworI2RlZmluZQlJQUMJMjU1CQkvKiBpbnRlcnByZXQgYXMgY29tbWFuZDogKi8KKyNkZWZpbmUJRE9OVAkyNTQJCS8qIHlvdSBhcmUgbm90IHRvIHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJRE8JMjUzCQkvKiBwbGVhc2UsIHlvdSB1c2Ugb3B0aW9uICovCisjZGVmaW5lCVdPTlQJMjUyCQkvKiBJIHdvbid0IHVzZSBvcHRpb24gKi8KKyNkZWZpbmUJV0lMTAkyNTEJCS8qIEkgd2lsbCB1c2Ugb3B0aW9uICovCisjZGVmaW5lCVNCCTI1MAkJLyogaW50ZXJwcmV0IGFzIHN1Ym5lZ290aWF0aW9uICovCisjZGVmaW5lCUdBCTI0OQkJLyogeW91IG1heSByZXZlcnNlIHRoZSBsaW5lICovCisjZGVmaW5lCUVMCTI0OAkJLyogZXJhc2UgdGhlIGN1cnJlbnQgbGluZSAqLworI2RlZmluZQlFQwkyNDcJCS8qIGVyYXNlIHRoZSBjdXJyZW50IGNoYXJhY3RlciAqLworI2RlZmluZQlBWVQJMjQ2CQkvKiBhcmUgeW91IHRoZXJlICovCisjZGVmaW5lCUFPCTI0NQkJLyogYWJvcnQgb3V0cHV0LS1idXQgbGV0IHByb2cgZmluaXNoICovCisjZGVmaW5lCUlQCTI0NAkJLyogaW50ZXJydXB0IHByb2Nlc3MtLXBlcm1hbmVudGx5ICovCisjZGVmaW5lCUJSRUFLCTI0MwkJLyogYnJlYWsgKi8KKyNkZWZpbmUJRE0JMjQyCQkvKiBkYXRhIG1hcmstLWZvciBjb25uZWN0LiBjbGVhbmluZyAqLworI2RlZmluZQlOT1AJMjQxCQkvKiBub3AgKi8KKyNkZWZpbmUJU0UJMjQwCQkvKiBlbmQgc3ViIG5lZ290aWF0aW9uICovCisjZGVmaW5lIEVPUiAgICAgMjM5ICAgICAgICAgICAgIC8qIGVuZCBvZiByZWNvcmQgKHRyYW5zcGFyZW50IG1vZGUpICovCisjZGVmaW5lCUFCT1JUCTIzOAkJLyogQWJvcnQgcHJvY2VzcyAqLworI2RlZmluZQlTVVNQCTIzNwkJLyogU3VzcGVuZCBwcm9jZXNzICovCisjZGVmaW5lCXhFT0YJMjM2CQkvKiBFbmQgb2YgZmlsZTogRU9GIGlzIGFscmVhZHkgdXNlZC4uLiAqLworCisjZGVmaW5lIFNZTkNICTI0MgkJLyogZm9yIHRlbGZ1bmMgY2FsbHMgKi8KKworI2lmZGVmIFRFTENNRFMKK2NvbnN0IGNoYXIgKnRlbGNtZHNbXSA9IHsKKwkiRU9GIiwgIlNVU1AiLCAiQUJPUlQiLCAiRU9SIiwKKwkiU0UiLCAiTk9QIiwgIkRNQVJLIiwgIkJSSyIsICJJUCIsICJBTyIsICJBWVQiLCAiRUMiLAorCSJFTCIsICJHQSIsICJTQiIsICJXSUxMIiwgIldPTlQiLCAiRE8iLCAiRE9OVCIsICJJQUMiLCAwLAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqdGVsY21kc1tdOworI2VuZGlmCisKKyNkZWZpbmUJVEVMQ01EX0ZJUlNUCXhFT0YKKyNkZWZpbmUJVEVMQ01EX0xBU1QJSUFDCisjZGVmaW5lCVRFTENNRF9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gVEVMQ01EX0xBU1QgJiYgXAorCQkJICh1bnNpZ25lZCBpbnQpKHgpID49IFRFTENNRF9GSVJTVCkKKyNkZWZpbmUJVEVMQ01EKHgpCXRlbGNtZHNbKHgpLVRFTENNRF9GSVJTVF0KKworLyogdGVsbmV0IG9wdGlvbnMgKi8KKyNkZWZpbmUgVEVMT1BUX0JJTkFSWQkwCS8qIDgtYml0IGRhdGEgcGF0aCAqLworI2RlZmluZSBURUxPUFRfRUNITwkxCS8qIGVjaG8gKi8KKyNkZWZpbmUJVEVMT1BUX1JDUAkyCS8qIHByZXBhcmUgdG8gcmVjb25uZWN0ICovCisjZGVmaW5lCVRFTE9QVF9TR0EJMwkvKiBzdXBwcmVzcyBnbyBhaGVhZCAqLworI2RlZmluZQlURUxPUFRfTkFNUwk0CS8qIGFwcHJveGltYXRlIG1lc3NhZ2Ugc2l6ZSAqLworI2RlZmluZQlURUxPUFRfU1RBVFVTCTUJLyogZ2l2ZSBzdGF0dXMgKi8KKyNkZWZpbmUJVEVMT1BUX1RNCTYJLyogdGltaW5nIG1hcmsgKi8KKyNkZWZpbmUJVEVMT1BUX1JDVEUJNwkvKiByZW1vdGUgY29udHJvbGxlZCB0cmFuc21pc3Npb24gYW5kIGVjaG8gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0wgCTgJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBsaW5lIHdpZHRoICovCisjZGVmaW5lIFRFTE9QVF9OQU9QIAk5CS8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgcGFnZSBzaXplICovCisjZGVmaW5lIFRFTE9QVF9OQU9DUkQJMTAJLyogbmVnb3RpYXRlIGFib3V0IENSIGRpc3Bvc2l0aW9uICovCisjZGVmaW5lIFRFTE9QVF9OQU9IVFMJMTEJLyogbmVnb3RpYXRlIGFib3V0IGhvcml6b250YWwgdGFic3RvcHMgKi8KKyNkZWZpbmUgVEVMT1BUX05BT0hURAkxMgkvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWIgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT0ZGRAkxMwkvKiBuZWdvdGlhdGUgYWJvdXQgZm9ybWZlZWQgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX05BT1ZUUwkxNAkvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIHN0b3BzICovCisjZGVmaW5lIFRFTE9QVF9OQU9WVEQJMTUJLyogbmVnb3RpYXRlIGFib3V0IHZlcnRpY2FsIHRhYiBkaXNwb3NpdGlvbiAqLworI2RlZmluZSBURUxPUFRfTkFPTEZECTE2CS8qIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgTEYgZGlzcG9zaXRpb24gKi8KKyNkZWZpbmUgVEVMT1BUX1hBU0NJSQkxNwkvKiBleHRlbmRlZCBhc2NpYyBjaGFyYWN0ZXIgc2V0ICovCisjZGVmaW5lCVRFTE9QVF9MT0dPVVQJMTgJLyogZm9yY2UgbG9nb3V0ICovCisjZGVmaW5lCVRFTE9QVF9CTQkxOQkvKiBieXRlIG1hY3JvICovCisjZGVmaW5lCVRFTE9QVF9ERVQJMjAJLyogZGF0YSBlbnRyeSB0ZXJtaW5hbCAqLworI2RlZmluZQlURUxPUFRfU1VQRFVQCTIxCS8qIHN1cGR1cCBwcm90b2NvbCAqLworI2RlZmluZQlURUxPUFRfU1VQRFVQT1VUUFVUIDIyCS8qIHN1cGR1cCBvdXRwdXQgKi8KKyNkZWZpbmUJVEVMT1BUX1NORExPQwkyMwkvKiBzZW5kIGxvY2F0aW9uICovCisjZGVmaW5lCVRFTE9QVF9UVFlQRQkyNAkvKiB0ZXJtaW5hbCB0eXBlICovCisjZGVmaW5lCVRFTE9QVF9FT1IJMjUJLyogZW5kIG9yIHJlY29yZCAqLworI2RlZmluZQlURUxPUFRfVFVJRAkyNgkvKiBUQUNBQ1MgdXNlciBpZGVudGlmaWNhdGlvbiAqLworI2RlZmluZQlURUxPUFRfT1VUTVJLCTI3CS8qIG91dHB1dCBtYXJraW5nICovCisjZGVmaW5lCVRFTE9QVF9UVFlMT0MJMjgJLyogdGVybWluYWwgbG9jYXRpb24gbnVtYmVyICovCisjZGVmaW5lCVRFTE9QVF8zMjcwUkVHSU1FIDI5CS8qIDMyNzAgcmVnaW1lICovCisjZGVmaW5lCVRFTE9QVF9YM1BBRAkzMAkvKiBYLjMgUEFEICovCisjZGVmaW5lCVRFTE9QVF9OQVdTCTMxCS8qIHdpbmRvdyBzaXplICovCisjZGVmaW5lCVRFTE9QVF9UU1BFRUQJMzIJLyogdGVybWluYWwgc3BlZWQgKi8KKyNkZWZpbmUJVEVMT1BUX0xGTE9XCTMzCS8qIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgVEVMT1BUX0xJTkVNT0RFCTM0CS8qIExpbmVtb2RlIG9wdGlvbiAqLworI2RlZmluZSBURUxPUFRfWERJU1BMT0MJMzUJLyogWCBEaXNwbGF5IExvY2F0aW9uICovCisjZGVmaW5lIFRFTE9QVF9PTERfRU5WSVJPTiAzNgkvKiBPbGQgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUJVEVMT1BUX0FVVEhFTlRJQ0FUSU9OIDM3LyogQXV0aGVudGljYXRlICovCisjZGVmaW5lCVRFTE9QVF9FTkNSWVBUCTM4CS8qIEVuY3J5cHRpb24gb3B0aW9uICovCisjZGVmaW5lIFRFTE9QVF9ORVdfRU5WSVJPTiAzOQkvKiBOZXcgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUJVEVMT1BUX0VYT1BMCTI1NQkvKiBleHRlbmRlZC1vcHRpb25zLWxpc3QgKi8KKworCisjZGVmaW5lCU5URUxPUFRTCSgxK1RFTE9QVF9ORVdfRU5WSVJPTikKKyNpZmRlZiBURUxPUFRTCitjb25zdCBjaGFyICp0ZWxvcHRzW05URUxPUFRTKzFdID0geworCSJCSU5BUlkiLCAiRUNITyIsICJSQ1AiLCAiU1VQUFJFU1MgR08gQUhFQUQiLCAiTkFNRSIsCisJIlNUQVRVUyIsICJUSU1JTkcgTUFSSyIsICJSQ1RFIiwgIk5BT0wiLCAiTkFPUCIsCisJIk5BT0NSRCIsICJOQU9IVFMiLCAiTkFPSFREIiwgIk5BT0ZGRCIsICJOQU9WVFMiLAorCSJOQU9WVEQiLCAiTkFPTEZEIiwgIkVYVEVORCBBU0NJSSIsICJMT0dPVVQiLCAiQllURSBNQUNSTyIsCisJIkRBVEEgRU5UUlkgVEVSTUlOQUwiLCAiU1VQRFVQIiwgIlNVUERVUCBPVVRQVVQiLAorCSJTRU5EIExPQ0FUSU9OIiwgIlRFUk1JTkFMIFRZUEUiLCAiRU5EIE9GIFJFQ09SRCIsCisJIlRBQ0FDUyBVSUQiLCAiT1VUUFVUIE1BUktJTkciLCAiVFRZTE9DIiwKKwkiMzI3MCBSRUdJTUUiLCAiWC4zIFBBRCIsICJOQVdTIiwgIlRTUEVFRCIsICJMRkxPVyIsCisJIkxJTkVNT0RFIiwgIlhESVNQTE9DIiwgIk9MRC1FTlZJUk9OIiwgIkFVVEhFTlRJQ0FUSU9OIiwKKwkiRU5DUllQVCIsICJORVctRU5WSVJPTiIsCisJMCwKK307CisjZGVmaW5lCVRFTE9QVF9GSVJTVAlURUxPUFRfQklOQVJZCisjZGVmaW5lCVRFTE9QVF9MQVNUCVRFTE9QVF9ORVdfRU5WSVJPTgorI2RlZmluZQlURUxPUFRfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDw9IFRFTE9QVF9MQVNUKQorI2RlZmluZQlURUxPUFQoeCkJdGVsb3B0c1soeCktVEVMT1BUX0ZJUlNUXQorI2VuZGlmCisKKy8qIHN1Yi1vcHRpb24gcXVhbGlmaWVycyAqLworI2RlZmluZQlURUxRVUFMX0lTCTAJLyogb3B0aW9uIGlzLi4uICovCisjZGVmaW5lCVRFTFFVQUxfU0VORAkxCS8qIHNlbmQgb3B0aW9uICovCisjZGVmaW5lCVRFTFFVQUxfSU5GTwkyCS8qIEVOVklST046IGluZm9ybWF0aW9uYWwgdmVyc2lvbiBvZiBJUyAqLworI2RlZmluZQlURUxRVUFMX1JFUExZCTIJLyogQVVUSEVOVElDQVRJT046IGNsaWVudCB2ZXJzaW9uIG9mIElTICovCisjZGVmaW5lCVRFTFFVQUxfTkFNRQkzCS8qIEFVVEhFTlRJQ0FUSU9OOiBjbGllbnQgdmVyc2lvbiBvZiBJUyAqLworCisjZGVmaW5lCUxGTE9XX09GRgkJMAkvKiBEaXNhYmxlIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJTEZMT1dfT04JCTEJLyogRW5hYmxlIHJlbW90ZSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUJTEZMT1dfUkVTVEFSVF9BTlkJMgkvKiBSZXN0YXJ0IG91dHB1dCBvbiBhbnkgY2hhciAqLworI2RlZmluZQlMRkxPV19SRVNUQVJUX1hPTgkzCS8qIFJlc3RhcnQgb3V0cHV0IG9ubHkgb24gWE9OICovCisKKy8qCisgKiBMSU5FTU9ERSBzdWJvcHRpb25zCisgKi8KKworI2RlZmluZQlMTV9NT0RFCQkxCisjZGVmaW5lCUxNX0ZPUldBUkRNQVNLCTIKKyNkZWZpbmUJTE1fU0xDCQkzCisKKyNkZWZpbmUJTU9ERV9FRElUCTB4MDEKKyNkZWZpbmUJTU9ERV9UUkFQU0lHCTB4MDIKKyNkZWZpbmUJTU9ERV9BQ0sJMHgwNAorI2RlZmluZSBNT0RFX1NPRlRfVEFCCTB4MDgKKyNkZWZpbmUgTU9ERV9MSVRfRUNITwkweDEwCisKKyNkZWZpbmUJTU9ERV9NQVNLCTB4MWYKKworLyogTm90IHBhcnQgb2YgcHJvdG9jb2wsIGJ1dCBuZWVkZWQgdG8gc2ltcGxpZnkgdGhpbmdzLi4uICovCisjZGVmaW5lIE1PREVfRkxPVwkJMHgwMTAwCisjZGVmaW5lIE1PREVfRUNITwkJMHgwMjAwCisjZGVmaW5lIE1PREVfSU5CSU4JCTB4MDQwMAorI2RlZmluZSBNT0RFX09VVEJJTgkJMHgwODAwCisjZGVmaW5lIE1PREVfRk9SQ0UJCTB4MTAwMAorCisjZGVmaW5lCVNMQ19TWU5DSAkxCisjZGVmaW5lCVNMQ19CUksJCTIKKyNkZWZpbmUJU0xDX0lQCQkzCisjZGVmaW5lCVNMQ19BTwkJNAorI2RlZmluZQlTTENfQVlUCQk1CisjZGVmaW5lCVNMQ19FT1IJCTYKKyNkZWZpbmUJU0xDX0FCT1JUCTcKKyNkZWZpbmUJU0xDX0VPRgkJOAorI2RlZmluZQlTTENfU1VTUAk5CisjZGVmaW5lCVNMQ19FQwkJMTAKKyNkZWZpbmUJU0xDX0VMCQkxMQorI2RlZmluZQlTTENfRVcJCTEyCisjZGVmaW5lCVNMQ19SUAkJMTMKKyNkZWZpbmUJU0xDX0xORVhUCTE0CisjZGVmaW5lCVNMQ19YT04JCTE1CisjZGVmaW5lCVNMQ19YT0ZGCTE2CisjZGVmaW5lCVNMQ19GT1JXMQkxNworI2RlZmluZQlTTENfRk9SVzIJMTgKKyNkZWZpbmUJU0xDX01DTCAgICAgICAgIDE5CisjZGVmaW5lCVNMQ19NQ1IgICAgICAgICAyMAorI2RlZmluZQlTTENfTUNXTCAgICAgICAgMjEKKyNkZWZpbmUJU0xDX01DV1IgICAgICAgIDIyCisjZGVmaW5lCVNMQ19NQ0JPTCAgICAgICAyMworI2RlZmluZQlTTENfTUNFT0wgICAgICAgMjQKKyNkZWZpbmUJU0xDX0lOU1JUICAgICAgIDI1CisjZGVmaW5lCVNMQ19PVkVSICAgICAgICAyNgorI2RlZmluZQlTTENfRUNSICAgICAgICAgMjcKKyNkZWZpbmUJU0xDX0VXUiAgICAgICAgIDI4CisjZGVmaW5lCVNMQ19FQk9MICAgICAgICAyOQorI2RlZmluZQlTTENfRUVPTCAgICAgICAgMzAKKworI2RlZmluZQlOU0xDCQkzMAorCisvKgorICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBkZWZpbmUgU0xDX05BTUVTIHRvIGJlIHRoZQorICogbGlzdCBvZiBuYW1lcyBpZiBTTENfTkFNRVMgaXMgbm90IGRlZmluZWQuCisgKi8KKyNkZWZpbmUJU0xDX05BTUVMSVNUCSIwIiwgIlNZTkNIIiwgIkJSSyIsICJJUCIsICJBTyIsICJBWVQiLCAiRU9SIiwJXAorCQkJIkFCT1JUIiwgIkVPRiIsICJTVVNQIiwgIkVDIiwgIkVMIiwgIkVXIiwgIlJQIiwJXAorCQkJIkxORVhUIiwgIlhPTiIsICJYT0ZGIiwgIkZPUlcxIiwgIkZPUlcyIiwJXAorCQkJIk1DTCIsICJNQ1IiLCAiTUNXTCIsICJNQ1dSIiwgIk1DQk9MIiwJCVwKKwkJCSJNQ0VPTCIsICJJTlNSVCIsICJPVkVSIiwgIkVDUiIsICJFV1IiLAkJXAorCQkJIkVCT0wiLCAiRUVPTCIsCQkJCQlcCisJCQkwLAorCisjaWZkZWYJU0xDX05BTUVTCitjb25zdCBjaGFyICpzbGNfbmFtZXNbXSA9IHsKKwlTTENfTkFNRUxJU1QKK307CisjZWxzZQorZXh0ZXJuIGNoYXIgKnNsY19uYW1lc1tdOworI2RlZmluZQlTTENfTkFNRVMgU0xDX05BTUVMSVNUCisjZW5kaWYKKworI2RlZmluZQlTTENfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gTlNMQykKKyNkZWZpbmUgU0xDX05BTUUoeCkJc2xjX25hbWVzW3hdCisKKyNkZWZpbmUJU0xDX05PU1VQUE9SVAkwCisjZGVmaW5lCVNMQ19DQU5UQ0hBTkdFCTEKKyNkZWZpbmUJU0xDX1ZBUklBQkxFCTIKKyNkZWZpbmUJU0xDX0RFRkFVTFQJMworI2RlZmluZQlTTENfTEVWRUxCSVRTCTB4MDMKKworI2RlZmluZQlTTENfRlVOQwkwCisjZGVmaW5lCVNMQ19GTEFHUwkxCisjZGVmaW5lCVNMQ19WQUxVRQkyCisKKyNkZWZpbmUJU0xDX0FDSwkJMHg4MAorI2RlZmluZQlTTENfRkxVU0hJTgkweDQwCisjZGVmaW5lCVNMQ19GTFVTSE9VVAkweDIwCisKKyNkZWZpbmUJT0xEX0VOVl9WQVIJMQorI2RlZmluZQlPTERfRU5WX1ZBTFVFCTAKKyNkZWZpbmUJTkVXX0VOVl9WQVIJMAorI2RlZmluZQlORVdfRU5WX1ZBTFVFCTEKKyNkZWZpbmUJRU5WX0VTQwkJMgorI2RlZmluZSBFTlZfVVNFUlZBUgkzCisKKy8qCisgKiBBVVRIRU5USUNBVElPTiBzdWJvcHRpb25zCisgKi8KKworLyoKKyAqIFdobyBpcyBhdXRoZW50aWNhdGluZyB3aG8gLi4uCisgKi8KKyNkZWZpbmUJQVVUSF9XSE9fQ0xJRU5UCQkwCS8qIENsaWVudCBhdXRoZW50aWNhdGluZyBzZXJ2ZXIgKi8KKyNkZWZpbmUJQVVUSF9XSE9fU0VSVkVSCQkxCS8qIFNlcnZlciBhdXRoZW50aWNhdGluZyBjbGllbnQgKi8KKyNkZWZpbmUJQVVUSF9XSE9fTUFTSwkJMQorCisvKgorICogYW1vdW50IG9mIGF1dGhlbnRpY2F0aW9uIGRvbmUKKyAqLworI2RlZmluZQlBVVRIX0hPV19PTkVfV0FZCTAKKyNkZWZpbmUJQVVUSF9IT1dfTVVUVUFMCQkyCisjZGVmaW5lCUFVVEhfSE9XX01BU0sJCTIKKworLyoKKyAqIHNob3VsZCB3ZSBiZSBlbmNyeXB0aW5nPyAobm90IHlldCBmb3JtYWxseSBzdGFuZGFyZGl6ZWQpCisgKi8KKyNkZWZpbmUgQVVUSF9FTkNSWVBUX09GRgkwCisjZGVmaW5lIEFVVEhfRU5DUllQVF9PTgkJNAorI2RlZmluZSBBVVRIX0VOQ1JZUFRfTUFTSwk0CisKKyNkZWZpbmUJQVVUSFRZUEVfTlVMTAkJMAorI2RlZmluZQlBVVRIVFlQRV9LRVJCRVJPU19WNAkxCisjZGVmaW5lCUFVVEhUWVBFX0tFUkJFUk9TX1Y1CTIKKyNkZWZpbmUJQVVUSFRZUEVfU1BYCQkzCisjZGVmaW5lCUFVVEhUWVBFX01JTksJCTQKKyNkZWZpbmUJQVVUSFRZUEVfQ05UCQk1CisKKyNkZWZpbmUJQVVUSFRZUEVfVEVTVAkJOTkKKworI2lmZGVmCUFVVEhfTkFNRVMKK2NvbnN0IGNoYXIgKmF1dGh0eXBlX25hbWVzW10gPSB7CisJIk5VTEwiLCAiS0VSQkVST1NfVjQiLCAiS0VSQkVST1NfVjUiLCAiU1BYIiwgIk1JTksiLCAwLAorfTsKKyNlbHNlCitleHRlcm4gY2hhciAqYXV0aHR5cGVfbmFtZXNbXTsKKyNlbmRpZgorCisjZGVmaW5lCUFVVEhUWVBFX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDwgQVVUSFRZUEVfQ05UKQorI2RlZmluZQlBVVRIVFlQRV9OQU1FKHgpCWF1dGh0eXBlX25hbWVzW3hdCisKKy8qCisgKiBFTkNSWVBUaW9uIHN1Ym9wdGlvbnMKKyAqLworI2RlZmluZQlFTkNSWVBUX0lTCQkwCS8qIEkgcGljayBlbmNyeXB0aW9uIHR5cGUgLi4uICovCisjZGVmaW5lCUVOQ1JZUFRfU1VQUE9SVAkJMQkvKiBJIHN1cHBvcnQgZW5jcnlwdGlvbiB0eXBlcyAuLi4gKi8KKyNkZWZpbmUJRU5DUllQVF9SRVBMWQkJMgkvKiBJbml0aWFsIHNldHVwIHJlc3BvbnNlICovCisjZGVmaW5lCUVOQ1JZUFRfU1RBUlQJCTMJLyogQW0gc3RhcnRpbmcgdG8gc2VuZCBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUJRU5DUllQVF9FTkQJCTQJLyogQW0gZW5kaW5nIGVuY3J5cHRlZCAqLworI2RlZmluZQlFTkNSWVBUX1JFUVNUQVJUCTUJLyogUmVxdWVzdCB5b3Ugc3RhcnQgZW5jcnlwdGluZyAqLworI2RlZmluZQlFTkNSWVBUX1JFUUVORAkJNgkvKiBSZXF1ZXN0IHlvdSBzZW5kIGVuY3J5cHRpbmcgKi8KKyNkZWZpbmUJRU5DUllQVF9FTkNfS0VZSUQJNworI2RlZmluZQlFTkNSWVBUX0RFQ19LRVlJRAk4CisjZGVmaW5lCUVOQ1JZUFRfQ05UCQk5CisKKyNkZWZpbmUJRU5DVFlQRV9BTlkJCTAKKyNkZWZpbmUJRU5DVFlQRV9ERVNfQ0ZCNjQJMQorI2RlZmluZQlFTkNUWVBFX0RFU19PRkI2NAkyCisjZGVmaW5lCUVOQ1RZUEVfQ05UCQkzCisKKyNpZmRlZglFTkNSWVBUX05BTUVTCitjb25zdCBjaGFyICplbmNyeXB0X25hbWVzW10gPSB7CisJIklTIiwgIlNVUFBPUlQiLCAiUkVQTFkiLCAiU1RBUlQiLCAiRU5EIiwKKwkiUkVRVUVTVC1TVEFSVCIsICJSRVFVRVNULUVORCIsICJFTkMtS0VZSUQiLCAiREVDLUtFWUlEIiwKKwkwLAorfTsKK2NvbnN0IGNoYXIgKmVuY3R5cGVfbmFtZXNbXSA9IHsKKwkiQU5ZIiwgIkRFU19DRkI2NCIsICAiREVTX09GQjY0IiwgIDAsCit9OworI2Vsc2UKK2V4dGVybiBjaGFyICplbmNyeXB0X25hbWVzW107CitleHRlcm4gY2hhciAqZW5jdHlwZV9uYW1lc1tdOworI2VuZGlmCisKKworI2RlZmluZQlFTkNSWVBUX05BTUVfT0soeCkJKCh1bnNpZ25lZCBpbnQpKHgpIDwgRU5DUllQVF9DTlQpCisjZGVmaW5lCUVOQ1JZUFRfTkFNRSh4KQkJZW5jcnlwdF9uYW1lc1t4XQorCisjZGVmaW5lCUVOQ1RZUEVfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNUWVBFX0NOVCkKKyNkZWZpbmUJRU5DVFlQRV9OQU1FKHgpCQllbmN0eXBlX25hbWVzW3hdCisKKyNlbmRpZiAvKiBfQVJQQV9URUxORVRfSF8gKi8KZGlmZiAtLWdpdCBhL3Rlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy8uY3ZzaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTdjOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy8uY3ZzaWdub3JlCkBAIC0wLDAgKzEsMTEgQEAKKyoubmV3CisqLnBjYXAKKzAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wY2FwCiswOC1zdW5yaXNlLXN1bnNldC1hZXMucGNhcAorMDgtc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAKKzA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcAoraXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wY2FwCitpc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucGNhcAoraXNha21wLXBvaW50ZXItbG9vcC5wY2FwCitydW4xLnBjYXAKK3J1bjIucGNhcApkaWZmIC0tZ2l0IGEvdGVzdHMvMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAgYi90ZXN0cy8wMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTJhZjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvMDItc3VucmlzZS1zdW5zZXQtZXNwLnB1dSBiL3Rlc3RzLzAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlZmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzLzAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wdXUKQEAgLTAsMCArMSwzNCBAQAorYmVnaW4gNjQ0IDAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wY2FwCitNVSwuUkgwKGAhYGBgYGBgYGBgYGBgYGAmYGBgIWBgYGBgYGBgYGBgYGBgIjZgYGBgRUBgYGAhYGBgJjFECitNMTFgYGAmMUQoUEBgMTBgYEIvXUdgYCFgLE86NVBgJCIlXGAhYEJUMi0lOVhgYGBgYDRQQDEyXFxMKSgxCitNVFo9KFM+NygkPi48M05AXF9JOkFZIksvVEtBWkpQNzE5Ik5DS1lQO1BUKDArJCJNJT1dLVgiYCo4Vi4nCitNLSckMUFdMDIiM04jT1pJIyYxUl1BKjE7YEc4U0BZRlFdPEg3UykpNDE3WTkhRTQ6PCQnQ1cpJVZaJl8zCitNX11UYEwrUDFeIWBQRVBgYGBgYGBgYGBgRUBgYGApOGBgYGAwYGAhRDkkNDBgYCFEOSIsKGAkNGBgKENfCitNOmBgYDAjK1ZFLGAhYEE/YGAwKE0kQzE2PmBgYGBgKDo8JCdDVyklVlonLDJLUU1CQENOPyciXkdKPD06CitNRC0wYCsuVl5KJzJBSykuJ1hRX0IiQjg6WyVBXytLWzZLUzInWFJbVU5gLFIiQkpQP15dLlpNIy9bJCkjCitNMTdeIUQiOF9bQlo+R1U0WiokN0kiTiRVKj5KNDc/Qy00O0k+I2AlNisjMCVdRDc1WUMnXSpaXGBgYGBgCitNYGBgYGApOGBgYCI2YGBgYCRgYGA5JjElJGBgYDkmMEMiYCElYGAiKF9WRGBgJGBSXUkvYGAwKDdQYCQiCitNKzEoVDVHQGBgYGAjNz9DLTQ7ST4jYCVAVyU4OT9RSiMkVEosNEdcRk8mSE89RissLCUxRShdKTtYSV1UCitNVjdXLlJZJDI9SloxJSFRQ05YWzteLkpENFc5MTs3KU5KV1YyTUY0PzdgPSZfM09XVyVWJjZSSVhLQjc1CitNIzsyVFdOTCJBOk1GIUlAXzVSXl1MNjtaYEw/RUAxOlQmNzFHYGBgYGBgYGBgYCI2YGBgYEVAYGBgIWBgCitNYCYxRDExYGBgJjFEKFBAYDEwYGBCL11KYGAhYCxPOjJQYCQiJVxgIWBCVDItJTlYYGBgYCEqTUYhSUBfCitNNVJeXSUnOzkqUTpTX0JdXU9fOEZWOjJLMUEhXS9TUUhJNz5PUzgxNSpJPzQlLzouPUJCSlVFR0ooWDhcCitNPFNaPlAxRS9AJlBcOU1SKURQM1tVQ1dJQCxNUiVBJFxDUl09RygoIltDRkI3QVVOJEFFTlpPTyZcOjclCitNMktMVzwnTlAsTChJPSE7OD0wYGBgYGBgYGBgYEVAYGBgKThgYGBgMGBgIUQ5JDQwYGAhRDkiLChgJDRgCitNYChDXzpQYGAwIytWRDxgIWBBP2BgMChNJEMxNj5gYGBgYDVOWk9PJlw6NyUySjEyLDk7TE9LIi1TLD0kCitNTzBdWCtKKE9KUUVEI1BMQlJZW1xeMzUyVVpLJjU3PFIwTDlKUTpLSDZgKUJVTiRgNV0xV1VAIkEhOFRNCitNT14pPDtgLVNXOzFIUU8kQ0VcI2BPW1dbMTdHV1swRyZNLF5UPzc+NixaPDolNzNBV1YzOjtZLzo9QChgCitNYGBgYGBgYGBgKThgYGAiNmBgYGAkYGBgOSYxJSRgYGA5JjBDImAhJWBgIihfVlBgYCRgUl1JI2BgMCg3CitNUGAkIisxKFQ1R0BgYGBgJk0sXlQ/Nz42LFo9Pk5fWVpRRlZbSDFeNlwhL0kqSU1BT0haRVxFME0uWiFYCitNI1swRUczIz4lXTdgXSoyRj9AUzRYMicnVEswOUpATkcvLkhFWENFLi8uLkteJy1AIjpYW1w/MEwrQmBTCitNUUFcSFRLXCdKXTpTXU42T2BdXClOUUQpOTtIMlBcS2BeTlgzN2BSNWBgYGBgYGBgYGAiNmBgYGBFQGBgCitNYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgQi9dTWBgIWAsTzovUGAkIiVcYCFgQlQyLSU5WGBgYGAhXjZPCitNYF1cKU5RRCk+QllaPmAvREE9TjtBMi4uLjMtN0ZaT0s/OjVLR1hCTmAvRT8kXFstMTEtJEcjRTsoPk4iCitNKzwkL1lQJ1NNJD4xNkxVMTgmUV05KSRdMCkvTV06MlojQTZdLSxTTSo+RkkvYFgqSy0qLTpLUzNJVzwiCitNTyg+KFAoSz06WDo6U0o7T1tKPjBLYGBgYGBgYGBgYGBFQGBgYCk4YGBgYDBgYCFEOSQ0MGBgIUQ5IiwoCitNYCQ0YGAoQ187QGBgMCMrVkNMYCFgQT9gYDAoTSRDMTY+YGBgYGBDM0lXPCJPKD4oUCctNDM7Q1tgTUNECitNYEJNWkFYXUYhPydaJDhRIjVIWU1WREM5IjhJXk8oWjQhLylgL0lWRC0oWkspXzUyLUgyWEsrLCgtTFIpCitNTSlLI1hMRiI+S1kwPkM/XFtNQSUzRiUkP09SSkA6Pk9dNUg+Py0kT1FIKUo8WkZPV18rSyVHPVVHMCJbCisiRydUYAorYAorZW5kCmRpZmYgLS1naXQgYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1hZXMucGNhcCBiL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWFlcy5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmUzZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1hZXMucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1hZXMucHV1IGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtYWVzLnB1dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg3OTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtYWVzLnB1dQpAQCAtMCwwICsxLDM2IEBACitiZWdpbiA2NDQgMDgtc3VucmlzZS1zdW5zZXQtYWVzLnBjYXAKK01VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCZgYGAhYGBgYGBgYGBgYGBgYGAiRmBgYGBJQGBgYCFgYGAmMUQKK00xMWBgYCYxRChQQGAxMGBgRi9TSmBgIWAsT0QiUGAkIiVcYCFgQlcxKFQ1R2BgYGBgPjpbJy5DMEooJVAKK01WRic+KFRVNiYqIjlBLGAsL0tTXDo+REg+T19MKDUxKV9bWVkiTDxII0xKLzsoQlEpPVsqJDxBUFkvQTEKK00tIlRAKGBfUSYpUyFDKSQqN1M/RzNRNEhcRj0pT1lGK1BAUyYxMSVeKl1TKU5ATCpUWkAhOiYmOlFGWlQKK01MJyM3PD45PzgnP0o0VjpfLl1CKzZVUlxUPjM5RCs9TkE7JGBgYGBgYGBgYGAqOGBgYCJGYGBgYCRgYGAKK005JjElJGBgYDkmMEMiYCElYGAiOF8uTGBgJGBSXjAnYGAwKDdQYCQiKz0kQzE2PGBgYGAiO0syUDwtPVEKK01ZRV1APV5JMzlLXFtWJDFIRFU5J0wsNkJWSy5eQjRdRTZRWSY6PzM/VClHPyJSU1U7WCFKXV03Uyk8YCwKK00qTCFTWU9eUlVXUj8hRUlKTVdVPTVCNDA2WUwtSWBdTEtgXjstMyUoTkVZI1JgU1Q9VzQwPToqW00kKjgKK00jPEtYKTE5QC5gLjRfNVlEXjpWO0dAMz5gR0xUSyg1WkNTIkJDQGBgYGBgYGBgYGBJQGBgYCo4YGBgYDAKK01gYCFEOSQ0MGBgIUQ5IiwoYCQ0YGApQ1xbYGBgMCMrWWAsYCFgQT9gYDAoTVQyLSU5UGBgYGAsLVJPQEUKK00lRmBYYFkzXTdGM1lLOU4+PTYtO1UmJzYiPl80SDgwRE1ZXlo5RTNaTDNbT05OKkw8IlpANyhWT11YVF4KK00vMkpQPCgvXjhOVE8tNFwvQjVBSkVDNE47LFwiNy0mKDs5QU1fMkc1QTFDLltMQkszJylQP0FFOyRJWykKK00hOE4mUkM/T1RENzxWKUFJVTQsKkU+N0VMVVJGWFJEL0pEKDpAUkVSYGBgYGBgYGBgYCJGYGBgYElAYGAKK01gIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBGL1NNYGAhYCxPQ19QYCQiJVxgIWBCVzEoVDVHYGBgYCEoOyoKK00tXl8yMT1TOEYmRzUwUEo1WT41SyVAUjspQShFPDVZRCdAODZAR1QiLSYmTUhQKi5BPT8lPTpGRFpIPTQKK00qOSI6Pl0nRydDQjQlMj9QSiIyXkgqNTFcOFAhOVRgWDMjO0YrSCRbPEdXNz0/Sy5SMzAtJzYnTDNBTzgKK01SPTpNM1MkR0laPjRaJDdaTDA8XFM9U1wlYDpCVzlVMidAVV5ARCwsOi5QYGBgYGBgYGBgYCo4YGBgIkYKK01gYGBgJGBgYDkmMSUkYGBgOSYwQyJgISVgYCI4Xy5YYGAkYFJeL1tgYDAoN1BgJCIrPSRDMTY8YGBgYCUKK00sMj5HSVkzSDE/SlEhU1MtVy9QNCFCVyYqJkFbJCFYR0s8Xk1ePl9YMTkzIkciMVFUV0c+USJDTzI1JCIKK01QTSsxKzhbNiYoMTdcRUVcUDo2LVdWUFQ9OTExP0AnLVosLC9VVloyIVFWKFg0NTEzVTldUDYyQ0pNUz4KK01eT0RCR0hVPSVULkgyJlo8NCw4KCE0LDJbJkE0Xkg9Ikw6K2A9NEc/Kig3LDJAYGBgYGBgYGBgYElAYGAKK01gKjhgYGBgMGBgIUQ5JDQwYGAhRDkiLChgJDRgYClDXFtQYGAwIytYXzxgIWBBP2BgMChNVDItJTlQYGAKK01gYDg3MFpBKDtJUTBRQEAlMFErTDolM1pAKkhRUFpBXTNTVFdEWSNDWUpHT0pIKUs8S1ZUOUc2MT4+SScKK01FSE1GIlghXkcsSEAsWVdUN149NjAuMy8kNz9BWUgpRzlHQkQlJSMsRF0hRURBXUIqP1VFPlU5NisiNVwKK01LPSIiLy5MTydfX147JE48RUAhLjImM15AVTpQX184XydEXllDITQxRSwhQCE2PEtgYGBgYGBgYGBgIkYKK01gYGBgSUBgYGAhYGBgJjFEMTFgYGAmMUQoUEBgMTBgYEYvU1BgYCFgLE9DXFBgJCIlXGAhYEJXMShUNUcKK01gYGBgIV9ZTDJZUjZgJFkoOS9aIzVLI19dQ19aSlUlN00/TDIzPklgTCNEXUAmRz9aN0IyTyNHST9OREsKK01GWzdKUE4sOFZcSD4lRyspJyslK0ZMKiZcOCtIMl5LRldGNVlROiQ0ViEsMT9HOz1PWUQ7ISwzWUQnVigKK01XW1khSShVPVg5W1w6TCkoNUdCSixCIS01TiQuQ0dWJFZMRF5SP1osS0xbQU1JKFpDLVBgYGBgYGBgYGAKK01gKjhgYGAiRmBgYGAkYGBgOSYxJSRgYGA5JjBDImAhJWBgIjhfLyRgYCRgUl4vT2BgMCg3UGAkIis9JEMKK00xNjxgYGBgKFBEQTY+KkhSKCRVNlgwWi4/ODM6UjtZMDxFLzRTTilVWDtROkQkRCVLKERaWjpeX1xLJCcKK01aUTgxTlQ0S0JHRCNaPV9eYEVeIUhTKktIRUohKSFLRT4mJzIwNjUvIipNJ0VMWEQ/MSUzXEwzVEMuVUsKK0hLV0IoQzVPQDc4PjlMUV48MFo2XUY9Ojw7QFs+TF47L1wtNldCODFbR1gpPE1TMEI9PkxHREBgYAorYAorZW5kCmRpZmYgLS1naXQgYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1lc3AyLnBjYXAgYi90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1lc3AyLnBjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNTRjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1lc3AyLnB1dSBiL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucHV1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ODVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1lc3AyLnB1dQpAQCAtMCwwICsxLDQzIEBACitiZWdpbiA2NDQgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwCitNVSwuUkgwKGAhYGBgYGBgYGBgYGBgYGAmYGBgIWBgYGBgYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFECitNMTFgYGAmMUQoUEBgMTBgYFAiRS1gYCFgLExRWFBgJCIlXGAhYEJUMi0lOVhgYGBgYDQ9IStcNStGOGArCitNW1tOT1UtIzk4KkFPNVw3ODBYW1ZEWEZAMlc4PDEwOkohJyFaIS1bN040Q0ZOUktJSDtQVUExU0wiWTlcCitNLT9fM05fLFcvQCpUK0MvIl09U1tgO0QhLztgU1I1LDMrPjw5Sy5eXDlOPjwxOFRZOVpcIUlcUy4vTDhSCitNRkU1MyxTNlk1WF9aXChUKVpJVVM/WCQ4PiYoX01UMSIhU1Y6VlBQIVxYVSRbM1MtNUwpNC1PIiY+XWBaCitNMTouLzYxPSVDNmA2VTEvNjUiQSZLVUU5MDJdKmBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgCitNYCYxRChQQGAxMGBgUCJFL2BgIWAsTFFWUGAkIiVcYCFgQlQyLSU5WGBgYGBgQ0lVXlNYJTtHXiFHVVNQCitNU0E8Py84Rlk/TC8nXjJdNicmM1tcLU5FUzNFXTMzWiRRXSM3RDkkOFRGUzUpOz9TPylaSk9QNDtaRC1NCitNKzBfL0AjKlU9N0E5O0ZZUio1Ji9eViVNU0ZFTWBEQVpZLDgnPDAuOU1eJzo6PE0rTTJHMExHNipTL1szCitNP1RgSUlKVUpbR1csTCsmUEg8QVImSyhdXj1bSzdJTUdEW2A4W09OTDhMRDNBTWBOQCRTISo/PTsqOD0+CitNTDdQNkZNODEpLE4+VC8xWiciUDdINTtgYGBgYGBgYGBgYCMuYGBgYFNAYGBgIWBgYCYxRDExYGBgJjFECitNKFBAYDEwYGBQIkUxYGAhYCxMUVRQYCQiJVxgIWBCVDItJTlYYGBgYGBSNCktUCZGPkhQSy8/XyRNVEZDCitNXlRPTz0vTCNXX0FQVEs2TUlIX0JDKkk3XEw8LDkoPy8wTSJISzNbVDNGOyhZMlY3MCRQNT9EJzdHRklCCitNSlovQyIsUy9CRCE5TjhHViJcLjtHVk1FW1AhQCFCMSJEVD0xVzBfNzVGTUkyM0ghVDJeQyk7NEdZPmBJCitNLTJUXk9fMF9XVSYkKSYrL1ApJVtUUVVRLVQ3RyVcUlhZSlQwSE88L14qKUZgXjI8VzhLVFkuVzxGSzRLCitNOFVDK0onLipYKU5IJTxVVEsrSytgYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgCitNMTBgYFAiRTNgYCFgLExRUlBgJCIlXGAhYEJUMi0lOVhgYGBgISlgOV1dU0hLSVtFR1c0TT9XOD5bJD08CitNYEBAVEwxIyhZOTgwXUUqLyFeMkBHYComUzlPXlFNUzFTPy9gVEw9NUY5QigxMj8oMTQ1PlkySSs7K1Q/CitNS1dVREAmLjdVMzZdSy0kWy4lOUNCKkZLXkU4Pk46Sy8pNCMkXVpPLzo9IztNUkgtKV8xMzlcLFc2TTRUCitNN1NRP0JCWCZHVCwrQTMjQkI1Xk89PitHS0lDLTRdNVZCUClELVM8WDJPKUhbXy8jTSpUKyYkXDdQTC5NCitNPjctKVxXJjs8QF9KQCwqIWBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgCitNUCJFNWBgIWAsTFFQUGAkIiVcYCFgQlQyLSU5WGBgYGAhME9JRkE7LEAyQzRIRjM+NSEtQygwPjVMUjAiCitNPScxXE9RLiEtP0BEKFUwITQ1MyI8US8hXCpDREsuJk9VJytXRTpeN0o4IkFNUzxAVVlYKiw8KCZZQTJRCitNR1EoLjMrMFwjYCErYC5URSw7XDM6LjwrRjo/PVRALktPQkwlVkFBWDlfUlkkL14lJEMrSSo0JlM8QU1dCitNUCpdU1oiUkQnRy5BSkg3Nj9TViYySFFMRishSi9RWjsuOjxMQjo6LV0rQUUxKyYpO01eXWBYWi1XMkNYCitNKyZDUFpJTlAqOT8+YGBgYGBgYGBgYCMuYGBgYFNAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBQIkU3CitNYGAhYCxMUU5QYCQiJVxgIWBCVDItJTlYYGBgYCFJME0iLVRIRUY9KyFMPT5BM04sXDErIidaNyhKP08wCitNLkI/KSgjWD0vNUYtLiI+JTMuWCcoPUpLSzpXPE1aRjJeOCM3M0NbVVMkLU8mWlorTDo5NFI5RTIjPUo9CitNMThIUD9BTmA1XilBK0hXNkVCKjVQPUFaKFMiXFRJQlonXC49XTRBLCMxOCcwL1JfI0M6NFhYXz8+Wk1OCitNPUIrXlEzIihLRVwxMjk5XT01RSwnLiZVKGBIOU4pKz45RlMvYENBKj5EXj5BVi4tQyhTXClCTSYpKlhNCitNXkJGX19ePF9gYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgMTBgYFAiRTlgYCFgCitNLExRTFBgJCIlXGAhYEJUMi0lOVhgYGBgIVIiU1EnWzYlKDtRPj5PK11DUzZEKitBRDNJTUNcXk1NSzhbCitNOlQzKUtNMDYhR14uSFw+JVVBVEApWDZKTDlcM1YuSFIiK19RXl9ULU8kWV9TIjpfVFA7VixMSVYxT11ICitNLUdARE9MJ1YtNSlPQCU8JSEjTyQyVixBU0BXNygmJElYLllLS11cSyM+RklUVSk8Pk80MlQyR0tGVyteCitNXC9bLD5FNFBbUSIrN08sWTEoUjIyTE5EW0grNDY5KCUzLFNOJjM6VTovSWAnJlJAPGA8VFIiLTQ6JjgrCitNUTVTWGBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgUCJFO2BgIWAsTFFKCitNUGAkIiVcYCFgQlQyLSU5WGBgYGAiKicsXUE2QSxRKCpCK109JjZYJlQqTF5cKVo2TiUsRykoLjs2WC1LCitNTUAmNDxGUkpdI0lKJVknLV5UKzRbJjswO18lN0hNODVMUjhXKD5IS0dPVixeI0w5LFFGJSlXXjkhVkZNCitNWEcnWFldQ1dJNVZGMzM/NywqUD82Oi5QUycmW1xOJDdXPCo9PSs7UCokLi80Kk9IJj1PLDZHIUpJTj5JCitNJ1pEUCpEJjRLPlNLLVwvITdcWiY8JjVKNCVOVT9OUk0mMjUnKl8iJ1VFM1ZIJj9VXS9WQDkzMlVZWlRcCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2FsbHRlc3RzLnNoIGIvdGVzdHMvYWxsdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmMjU5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2FsbHRlc3RzLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCitmb3IgaSBpbiAqLnNoCitkbworICBpZiBbICJYJGkiID0gIlhhbGx0ZXN0cy5zaCIgXSAKKyAgdGhlbiAKKyAgCWNvbnRpbnVlOworICBmaQorICBzaCAuLyRpCitkb25lIAorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2JncC1pbmZpbml0ZS1sb29wLnBjYXAgYi90ZXN0cy9iZ3AtaW5maW5pdGUtbG9vcC5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDdkNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iZ3AtaW5maW5pdGUtbG9vcC5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2JncF92cG5fYXR0cnNldC5vdXQgYi90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjEyYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQub3V0CkBAIC0wLDAgKzEsMTggQEAKK0lQICh0b3MgMHhjMCwgdHRsICA2MiwgaWQgNTg2MjgsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBUQ1AgKDYpLCBsZW5ndGg6IDE3MykgMTIuNC40LjQuMjA1MSA+IDEyLjEuMS4xLjE3OTogUCwgY2tzdW0gMHhjZjE4IChjb3JyZWN0KSwgMzI5MzA3NzU3MzozMjkzMDc3Njk0KDEyMSkgYWNrIDMzNDgxMDg1ODIgd2luIDE2Mzg0IDxub3Asbm9wLHRpbWVzdGFtcCAzODMxMzEgODkwMjk5PjogQkdQLCBsZW5ndGg6IDEyMQorCVVwZGF0ZSBNZXNzYWdlICgyKSwgbGVuZ3RoOiAxMjEKKwkgIE9yaWdpbiAoMSksIGxlbmd0aDogMSwgRmxhZ3MgW1RdOiBJR1AKKwkgIEFTIFBhdGggKDIpLCBsZW5ndGg6IDAsIEZsYWdzIFtUXTogZW1wdHkKKwkgIExvY2FsIFByZWZlcmVuY2UgKDUpLCBsZW5ndGg6IDQsIEZsYWdzIFtUXTogMTAwCisJICBFeHRlbmRlZCBDb21tdW5pdHkgKDE2KSwgbGVuZ3RoOiA4LCBGbGFncyBbT1RdOiAKKwkgICAgdGFyZ2V0ICgweDAwMDIpLCBGbGFncyBbbm9uZV06IDMwMDowLjAuMS40NAorCSAgQXR0cmlidXRlIFNldCAoMTI4KSwgbGVuZ3RoOiAzNiwgRmxhZ3MgW09UXTogCisJICAgIE9yaWdpbiBBUzogNjUwMDEKKwkgICAgICBPcmlnaW4gKDEpLCBsZW5ndGg6IDEsIEZsYWdzIFtUXTogSUdQCisJICAgICAgQVMgUGF0aCAoMiksIGxlbmd0aDogNCwgRmxhZ3MgW1RdOiA1NTU1IAorCSAgICAgIExvY2FsIFByZWZlcmVuY2UgKDUpLCBsZW5ndGg6IDQsIEZsYWdzIFtUXTogNDQKKwkgICAgICBPcmlnaW5hdG9yIElEICg5KSwgbGVuZ3RoOiA0LCBGbGFncyBbT106IDIyLjUuNS41CisJICAgICAgQ2x1c3RlciBMaXN0ICgxMCksIGxlbmd0aDogNCwgRmxhZ3MgW09dOiAyMi41LjUuNQorCSAgTXVsdGktUHJvdG9jb2wgUmVhY2ggTkxSSSAoMTQpLCBsZW5ndGg6IDMwLCBGbGFncyBbT0VdOiAKKwkgICAgQUZJOiBJUHY0ICgxKSwgU0FGSTogbGFiZWxlZCBWUE4gVW5pY2FzdCAoMTI4KQorCSAgICBuZXh0aG9wOiBSRDogMDowLjAuMC4wLCAxMi40LjQuNCwgbmgtbGVuZ3RoOiAxMiwgbm8gU05QQQorCSAgICAgIFJEOiA1MDA6MC4wLjEuMjQ0LCAxMzMuMC4wLjAvOCwgbGFiZWw6MTAwMjA4IChib3R0b20pCmRpZmYgLS1naXQgYS90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQucGNhcCBiL3Rlc3RzL2JncF92cG5fYXR0cnNldC5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGFmZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQuc2ggYi90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzMyODcyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2JncF92cG5fYXR0cnNldC5zaApAQCAtMCwwICsxLDExIEBACisjIS9iaW4vc2gKKworZWNobyAtbiB0ZXN0IGJncF92cG5fYXR0cnNldC4uLgoraWYgKC4uL3RjcGR1bXAgLXQgLW4gLXYgLXIgYmdwX3Zwbl9hdHRyc2V0LnBjYXAgfCBkaWZmIC13IC0gIGJncF92cG5fYXR0cnNldC5vdXQpCit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCQorCmRpZmYgLS1naXQgYS90ZXN0cy9jaGRsYy1zbGFycC1zaG9ydC5wY2FwIGIvdGVzdHMvY2hkbGMtc2xhcnAtc2hvcnQucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMxM2RjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hkbGMtc2xhcnAtc2hvcnQucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9jaGRsYy1zbGFycC5wY2FwIGIvdGVzdHMvY2hkbGMtc2xhcnAucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTIxNDQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hkbGMtc2xhcnAucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lYXBvbjEuZ2RiaW5pdCBiL3Rlc3RzL2VhcG9uMS5nZGJpbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lYXBvbjEuZ2RiaW5pdApAQCAtMCwwICsxIEBACitzZXQgYXJncyAtciBlYXBvbjEucGNhcApkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLm5ldyBiL3Rlc3RzL2VhcG9uMS5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNDJlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VhcG9uMS5uZXcKQEAgLTAsMCArMSwxMTQgQEAKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtZGdtID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLWRnbSA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCithcnAgd2hvLWhhcyAxOTIuMTY4LjEuMSB0ZWxsIDE5Mi4xNjguMS4yNDkKK2FycCByZXBseSAxOTIuMTY4LjEuMSBpcy1hdCAwMDowZDo4ODo0ZjoyNTo5MSAob3VpIFVua25vd24pCitJUCAxOTIuMTY4LjEuMjQ5LmJvb3RwYyA+IDE5Mi4xNjguMS4xLmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitJUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0VBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD03NiAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9ODAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTI4IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD00IAorRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD01NyAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NDQgCitJUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitFQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorSVAgMTY5LjI1NC42Ny4xOTQuNDI5OSA+IDIzOS4yNTUuMjU1LjI1MC4xOTAwOiBVRFAsIGxlbmd0aCAxMzMKK0lQIDE2OS4yNTQuNjcuMTk0ID4gSUdNUDogaWdtcCB2MyByZXBvcnQsIDEgZ3JvdXAgcmVjb3JkKHMpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NCA+IElHTVA6IGlnbXAgdjMgcmVwb3J0LCAxIGdyb3VwIHJlY29yZChzKQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitFQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0VBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IApkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLm91dCBiL3Rlc3RzL2VhcG9uMS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNDJlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VhcG9uMS5vdXQKQEAgLTAsMCArMSwxMTQgQEAKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtZGdtID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLWRnbSA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCithcnAgd2hvLWhhcyAxOTIuMTY4LjEuMSB0ZWxsIDE5Mi4xNjguMS4yNDkKK2FycCByZXBseSAxOTIuMTY4LjEuMSBpcy1hdCAwMDowZDo4ODo0ZjoyNTo5MSAob3VpIFVua25vd24pCitJUCAxOTIuMTY4LjEuMjQ5LmJvb3RwYyA+IDE5Mi4xNjguMS4xLmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitJUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0VBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD03NiAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9ODAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTI4IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD00IAorRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD01NyAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NDQgCitJUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitFQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAorSVAgMTY5LjI1NC42Ny4xOTQuNDI5OSA+IDIzOS4yNTUuMjU1LjI1MC4xOTAwOiBVRFAsIGxlbmd0aCAxMzMKK0lQIDE2OS4yNTQuNjcuMTk0ID4gSUdNUDogaWdtcCB2MyByZXBvcnQsIDEgZ3JvdXAgcmVjb3JkKHMpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NCA+IElHTVA6IGlnbXAgdjMgcmVwb3J0LCAxIGdyb3VwIHJlY29yZChzKQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitFQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0lQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCitJUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKK0lQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAorSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKK0VBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAorSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCitFQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAorRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKK0VBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKK0VBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCitFQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IApkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLnBjYXAgYi90ZXN0cy9lYXBvbjEucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTg3ZWQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZWFwb24xLnBjYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLnB1dSBiL3Rlc3RzL2VhcG9uMS5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjMTQzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VhcG9uMS5wdXUKQEAgLTAsMCArMSwzNjggQEAKK2JlZ2luIDY0NCBlYXBvbjEucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYCFgYGBgIiU1QDApKkAjQCM9YGBgYFcwYGBgL19fX19fXworTV9QYCQoVT5FPkBAYDEwYGBTU0InYGAiYCQ3US5QKkAhXjwiSGA/XGBCQCIqYCtNM1shJC5CMVdgSmAnWQorTWAoSGBJMGBgKCQ1JTE0TSYwNDEqMSQ5JjEkMSExNE0jMDQtITBUJSMwNC0hMFQlIzA0JSFgIiElMEQ5IworTTE0LSUxRDUqMUQ1JjEkNSgxRC0mMUQ5ITFEJSUxRC0hMFQlITAwI180VFUiKTBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYCEkYGBgTGBgYGBgYGBgYGBgI0hgUGBgYGBgYGBgYGAiUCE2YGAsYAorTWAwYCFgYChgJ2AhPDM0JSkzJS0sM1UxPDBFKS81VS0lYGAoYDEkSTAuMzUzLCRIYCIlNUAwLzJAI0AjPQorTWBgYGBXMGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgU1NCKGBgImAkN1EtUCpAIV48IkhgP1xgQkAiKgorTWArTCxcQSQuQjFbYEpgJ1lgKEhgSTBgYCgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtIQorTTBUJSMwNCUhYCIhITBEJSMxRSEmNCQ1LjFEMSUwVDkjMTUhJjIkOSQxNDkmNCQ5MDA0LSEwQCNfNFRVIgorTSkwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhJGBgYExgYGBgYGBgYGBgYCNIYFBgYAorTWBgYGBgYGBgIlAhNmBgLGBgMGAhYGAoYCdgITwzNCUpMyUtLDNVMTwwRSkvNVUtJWBgKGAxJEkwLjM1MworTSwkSGAiJTVAMCgiQyNAI1tgYGBgXlBgYGAvX19fX19fX1BgJChVPkU+QEBgMTBgYFszQilgYCJgJDdQTgorTVAqQCFePCJIYD9cYEJAIipgLUUjV0EkLkIxX2BKYCdZYChIYFBQYGAoJDUlMTRNJjA0MSoxJDkmMSQxIQorTTE0TSMwNC0hMFQlIzA0LSEwVCUjMDQlIWAiISEwRCUjMUUhJjQkNS4xRDElMFQ5IzE1ISYyJDkkMTQ5JgorTTQkOTAwNC0hMEAjXzRUVSIpMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISRgYCJEYAorTWBgYGBgYGBgYGAjSGBQYGBgYGBgYGBgYCowITZgYCxgYDBgIWBgKGAuQCE8MzQlKTMlLSwzVTE8MEUpLworTTVVLSVgYFBgOC5IYGAkJTIwRDUpNSUtJzRFNTA0JDRgYDBgIyJAYDBgKCEsX0AwIzEkSTAuMzUzLCRIYAorTSIlNUAwL0pJI0AhPGBgYGA3YGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgM0NCKmBgImAkN1MsUCpAIQorTV48IkhgP1xgQjAiKWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJgorTTFEOSExRCUlMUQtITBUJSIzYGBgKGBgISI1NUAwLy84IkAhPGBgYGA3YGBgYC9fX19fX19fUGAkKFU+RQorTT5AQGAxMGBgM0NCLWBgImAkN1MpUCpAIV48IkhgP1xgQjAiKWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJQorTTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSIzYGBgKGBgISJFNUAwKywpIVAhPAorTWBgYGA3YGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgM0NCLmBgImAkN1MoUCpAIV48IkhgP1xgQjAiKQorTWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtIQorTTBUJSIzYGBgKGBgISJFNUAwLEBOI2AjU2BgYGBcUGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgWTNCLworTWBgImAkN1BQUCpAIV48IkhgP1xgQkAiKmAtJ0dJQSQuQjIrYEpgJ1lgKEhgTlBgYCgkNSUxNE0mMDQxKgorTTEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNC0hYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJgorTTFEOSExRCUlMUQtITBUJSIzUCNfNFRVIikwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWAhJGBgIiRgYGBgYGBgYGBgYCNIYFBgYGBgYGBgYGBgKDAhNmBgLGBgMGBgYGAoYCxAITwzNCUpMyUtLAorTTNVMTwwRSkvNVUtJWBgXGBAL1AqYCQxKjQjRFU0UyEqYGAhUmAmXGA8UGAlYDAsMCEwYC9gNTZKYGBVNQorTTgkITUlMDxgN2BgYGAlUGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgJFhYRWBgYEAhJVxQTCJIYD9HYAorTUpgJ19gKERgQjBgWkBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JgorTTA0OSExNDkjMDQtITBEUGBgImBgYDBZNTgkYD4xMCxgN2BgYGAlUGBgYCNfX19fX19fXGAhIi03STdIKAorTWAkNGBgJFhYRTBgYEAhJVxQPCJIYD9HYEpgJ19gKERgQjBgWkBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJgorTTBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtITBEUGBgImBgYDBZNTgkITBOYFhgN2BgYAorTWAlUGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgJFhYRUBgYEAhJVxQLCJIYD9HYEpgJ19gKERgQjBgWgorTUBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtIQorTTBEUGBgImBgYDBdNTgkIyouYDxgKkBgYGAiSGBgYCNfX19fX19fXGAhIi03STdIKCFAYCEiYGAmIWBgIQorTWBgMEM1WjVaUCpAIV4wYGBgYGBgYCwiSGAwJC81NiFgJVVEJ2AjUGBgYGBcYGBgYGBgMEM1WjVaYGBWKAorTTNSNjEiYDhgYDBAYCFAMGBgQGAtQiRcRUQ8IkhgMCRgISItN0k3S2BKYCdZYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgI1U1QDAiRTkhUCE2YDBgYDVAJGBgYGAtQiRcRUQwYCQoVT5FPkBAYDEwYCEyI0I3YGAiYAorTSQ3UyNQKkAhXjwiSGAwJGAxYCEjYDMxWVZQJCEhQCMoKzI0XUNQJmBgLCJIYD9EYGBgYGBgYGBgYGBgYAorTWBgYGAhIi03STdIYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0ISFTOCRQKkAhYDNUJworTWAwYCQoVT5FPk9cYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYF01OCRgNkAwRGAvYGBgYCNQYGBgYGAhIi03STdIYCMsWigsOUooQ0AkYGBgNCFgMGAlYDBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgLzU2IWAiQkwqYCU4IQorTWBgITZgMGBgX19fX19fX19gYDBDNVo1WiJgISVgYCUoLilcYGAoYDFgMDxgYGBgYF9fX19fUCEkYCQsIQorTS0sJktgMCQmYClAN0FTUGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAkKFU+RT5AYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYCFDQEUtQy0wJCE9YCQhLzA8IWBgMEM1WjVaLEAzYEpgJ1kjYEEkMkVgWQorTS01LFAyQ1AoMzUtJjUiYFUrQ2BXIlAkL2BQOEwrQlw/KD9ES19QYGBgYGBgI1U1QDAhW14jYCE2YDBgYAorTTVAJGBgL19fX19fX19QYCQoVT5FPkBAYDEwYCEyI0JBYGAiYCQwJCVgYGBgYC9fX19fXGAxYCEjYDMyLgorTVMwJCEhQCM1YFdUTmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhIi03STdIYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0IWA3MCFgM1QnYDBgJChVPkU+QygkUCpAIV4wUCgxJEkwLjM1MworTSwkSFwiJFUzMUUwQC0yWFAtUEwhI1AsJisiWE8nUidZKl9cYGBgYGBgISE1OCQiJDhQKGAkUGBgYCEsYAorTWBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkIWBgYGAkJTVAMC5JS2BAYFxgYGBgL2BgYGBgYCQoVT5FPkBgLAorTVNIQFFGSEIuYDBgYCEwJCJgYDQhYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYCElNTgkIT5MYExgL1BgYGAjXGBgYGBgIyxaKCw5SGAhIi03STdKKENAJGBgIlQiYEBgTQorTWAzJFIuMzRQLEMsWCxDYFAsIzRTLjMlYDs2WUMsIyhTK0ZVQzhTKFktMllPPVZRQTtCWU88RjwxNTYhYAorTTgxYCxgI1BgYGBgXGBgYGBgYDBDNVo1WmBgUy5CIyY6QihYIWBgYDRgMWBgJSEoKmBgYC9gQGAiYGAkYAorTWAhJCFgMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCQ1NUAwLFZMI2AhPmBgYGA3QGBgYGBgLAorTVNIQFFGQGAkKFU+RT5IQi5gMGBgM2AoMGAkUDIiQGBgI0BMYCojJFIuMzRQLEMsWCxDYFAsIzRTLjMlYAorTTs2WUMsIyhTK0ZVQzhTKFktMllPPVZRQTtCWU88RjwnITBgYFhNK1k8TE8pJlgnVlFcJkVHKV8qWEFgIQorTWBgJDE1NiFgUD8oLGAmKGBgYCFCYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYGAhMGAxJGA0ISgrYGBgIQorTSMwYGAsYGBgYGBgYGBgYGBgYGBgYGBgYGAjJGBgYGBgYGBgYGBgYGBgYGBgYGBgUmBgYGBgYGBgYGBgYAorTWBgYGBgYGBgIlA0YGAuT1RDSCFCRVsvLipUVVhdSEIsOU84MjU2IWBMUUQqYCJYYGBgYE5gYGBgYGBTLgorTUIjJjpgYDBDNVo1WkIoWCFgYGA8YEEkYCchKCtgYGArITBgYCMqTllMWjJPN1UiJTYzNj9CLDVJW0EpNQorTTgkYEg9MEhgL2BgYGAjUGBgYGBgISItN0k3SGAjLFooLDlKKENAJGBgYDAjYGBgJGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYDI1NiFgJUdEKmAkTGBgYCErYGBgYAorTWBgMEM1WjVaYGBTLkIjJjpCKFghYFBgWWAwYC1gYCFgOCU0MWApTUpOQUIlI1I+TC4qWDpSSCkzQThcRgorTWBFVDEsNVUnUVdWJTFaYEBWLE49MjQuOlw9JTNUS0k8U1YvI0hCOlgkRTVAMCRZXCJAYF5gYGBgL0BgYAorTWBgYCQoVT5FPkBgLFNIQFFGSEIuYDAsYCtgJGAjMGBgMCYhNSQwIjxFP0BdK0tFM0lZNlJSIiQtPURBTworTTNILVFYN0g+PSZYW0Q9XV0+NDtXXixKRCRVNUAwKkAhIzAhNmAwYGA1QCRgYC9fX19fX19fUGAkKFU+RQorTT5AQGAxMGAhMiNCR2BgImAkMCNfYGBgYGAvX19fX1xgMWAhI2AzMEVTYCQhIUAjNWBXVE46MCRgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgISItN0k3SGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgOFgpMworTThTNCFgNzAhYDNUJ2AwYCQoVT5FPkMoJFAqQCFeMFAoMSRJMC4zNTMsJEhcIiRVMzFFMEAtMlhQLVBMIQorTSNQLCYrIlhPJ1InWSpfXGBgYGBgYCFJNTgkI09gQFRgNUAkYGAlOCFgYCNfX19fX19fXGAhIi03STdIKAorTWAkNGBgNEBYS1BgYEAhJGBdUGBgYGAjX19fX19gJDBgMFAkVCk8UCFgMDhgVTAtXStGRCFgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYDBDNVo1WmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgJi4iNFYsVQorTWAwJVRgMCRdIVAkYCEiLTdJN0hSISwiSGA/RCwiJDEqNCNEVTRTISovYEEtNFQ5NCgjNE4sIzwrYDBcIworTSFCUE4rUVxBXjJPX2BgYGBgYGBKNTYhYF5QKC1gJTghYGAhNmAwYGBfX19fX19fX2BgMEM1WjVaImAhJQorTWBgJSguKyhgYChgMWAvMGBgYGBgX19fX19QISRgJCwhLSI3LGAwJCZgLTQjPzJZSWAwYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYCQoVT5FPkBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgIUNARS1DLTAkIQorTT1gJCEvMDwhYGAwQzVaNVosQDNgSmAnWSNgQSQyRWBZLTUsUDJDUCgzNS0mNSJgVStDYFciUCQvYFA4TAorTStCXD8oP0RLX1BgYGBgYGAsJTVAMC5CJCJAYDNgYGBgJFBgYGBgYCxTSEBRRkBgJChVPkU+SEIuYDAkYAorTWBgYFA1NiFgXkokKmAjUGBgYGBcYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYGBgJWAwLGAhMCRgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgLCU1QDApU0EiQGBfYGBgYAorTS9QYGBgYGAsU0hAUUZAYCQoVT5FPkhCLmAwYGArMCgjYCJUISwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTQorTTtGLFAsQyxOOzYtQyxDRFUrRl1XOyYlTitGXVI5UyE1OCQjMCFgUGAvYGBgYCNQYGBgYGAhIi03STdIYAorTSMsWigsOUooQ0AkYGAhMCErUGA0JEBIYGBgXCJgYChgYDBgYCQwJCFgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgUjU2IWAtJCglYCVYYGBgIT5gYGBgYGBTLkIjJjpgYDBDNVo1WkIoWCFgYCEsYEJcYAorTTMhKCpgYGAuIlBgSCwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTTtGLFAsQyxOOzYtQyxDRFUrRl1XOyYlTgorTStGXVI5UDwlYGAjN0ghIVtcXFNFLFBbJiddJFc2QzwlJGAkYGAzKTU4JCMsLmA8YDhAYGBgJihgYGBgYAorTSEiLTdJN0hgIyxaKCw5SihDQCRgYCVgISxgITAkQExgYGAkLWBgYFBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTSwwYGBgYGBgYGBgYGBgYGBgYGBgYCMoYGBgYGBgYGBgYGBgYGBgYGBgYGArITBgYDBXTD8wRyElOzQ5RAorTTAoRExATUQnI0MtNTgkIVM0UChgK0BgYGAiWGBgYGBgIyxaKCw5SGAhIi03STdKKENAJGBgIVAiLGBgPAorTSRATGBgYEwlYGAhJVtfXFA4SCsmNlUhJEIjQCQpVC0iLFU1QDAiJzZgUGBcYGBgYC9gYGBgYGAkKFU+RQorTT5AYCxTSEBRRkhCLmAwYGAhYCxgYGAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGAjLTU4JCE9VkAsYDJQYGBgJExgYGBgYCEiLTdJN0hgIyxaKCw5SihDQCQjYCNEIQorTWBgVGBgJCFANTMkYEc3XSE8Kys/MC4zWT4jQTgzT1tZSEhUIjBUQCZOXClGTC82UDlOSEFUWCU8RT9bQAorTTQ1U0AiX0A+QklSSSVCYFM1NiFgRi1UI2AjWGBgYGBeYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYFBgTAorTWAwYC1gYCFgOCU0UWApW04kYCFSOyRLKi5YTEdgSk85TiJBI0BYSz41KltfOlUiQ11FW08/IiJJUiE1KworTTU2IWBdUSgtYCJIYGBgYEpgYGBgX19fX19fX19gYDBDNVo1WiJgOGBgMEBgIUAwYGAwYCQoVT5FPkpHXgorTTBcKGBgYGBgYGAiSV9ELyIyVTVAMCcmISMwYEpgYGBgKkBgYGAvX19fX19fX1BgJChVPkU+QEAmYGAkKAorTWBgOCRgYCRgISItN0k3SklfRC8iYGBgYGBgYGBKP1kjUERRNTgkYFhAQFRgKkBgYGAiSGBgYCNfX19fXworTV9fXGAhIi03STdIKCFAYCEiYGAmIWBgIWBgMEM1WjVaSj9ZI1BAYGBgYGBgYCpHXjBcKS01NiFgKj1ILQorTWAqXGBgYCJPYGBgYGAwIT4/X19aYGAwQzVaNVoiYCElYGAiQS4rWGBgYCQxSE0uSV9ELyJbX19fXkEjKworTSFWUGBDNitYMzJVMzE0JTIwVEBAKkIhKDUlMTArUyROLDBUKjImXVM9I0hSLFNETixDNFUrQyhVLTJYUgorTS0zYFosM0RQLGBUKjRVMFo9NylOLkctQzomNU04NyxNPTchTjwiVU88RjxaOSY1Vjo2LUUuREVOPSY1UgorTTtGNVQxViVUOTc9QT40MUU9RkVDOTNIUSMwSS04NlhaKEctUzknYFo5JkVTOFZdVjk3KEIjMEktNiNIUworTSMwSC0iRFU1OCQiXFlgVGAtQGBgYCM4YGBgYCFgJVhgYCE4YCEiLTdJN0goYCQ4YGAiQFhQYGBgYDAoPgorTS46R14wXCtAYGBgNkVgMGBgIihgWkAsYGBgYCEhYGBgYC5fX19fSS01NiFgT0s0LmAmWGBgYCFOYGBgYAorTV9fX19fX19fYGAwQzVaNVoiYCElYGAhQC4sKGBgKGAxOkBSSV9ELyJKP1tfX1AiKWAoRGAzKzQoQjJYSQorTSRgYCFgYGBgYGBgISgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNCUhYGBgQAorTWBgJ2AjYGBAYGAkYCEpL0BgYDlAYCpHXjBcKS41NiFgIUhcKmAjOGBgYGBWYGBgYGAwIT5gYGA2YGAwQworTTVaNVoiYCEmYGBgSC4sMGBgYCQiJ0M2SV9ELyJYYGBgJUkwJGBgYEJgLkgjYGBgYGAwMGBgYCNPX19fWgorTTNFNUAwITNFIkAhTmBgYGA7QGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgOCNDJWBgImAkNkgpSj9ZIworTVBKR15fX1xgQjAiKWAkUlUiKEROKjFgYGAwYGBgYGBgYDIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIworTTA0LSEwVCUjMDQtITBUJSEwMGBgKGBgIVBgUGAoYGAhYGAyM1hgYCY4YCJJX0QvIjNVNUAwIyw2IVAhTgorTWBgYGA7QGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgOCNDJmBgImAkNkgoSj9ZI1BKR15fX1xgQjAiKQorTWAkUlUiKEROKjFgYGAwYGBgYGBgYDIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIzA0LSEwVCUjMDQtIQorTTBUJSEwMGBgKGBgIVBgUGAoYGAhYGAyM1hgYCY4YCJJX0QvIjNVNUAwKl5VIzAhNmAwYGA1QCRgYC9fXworTV9fX19fUGAkKFU+RT5AQGAxMGAhMiNDJ2BgImAkMCM/YGBgYGAvX19fX1xgMWAhI2AzMjU6UCQhIUAiMgorTTEzRS5gYCJgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISItN0k3SGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgOFgpMzhTNCFgNzAhYDNUJ2AwYCQoVT5FPkMoJFAqQCFeMFAoMSRJMC4zNTMsJEhcIiRVMworTTFFMEAtMlhQLVBMISNQLCYrIlhPJ1InWSpfXGBgYGBgYCUhNTgkYFQxUCxgO0BgYGAmWGBgYCNfX19fXworTV9fXGAhIi03STdIKGAkNGBgJmBYUmBgYEAhJUohSkdeMFwqSV9PX19gKERgQjAhLE1AQikrQkAwYGAkYAorTWBgYGBgYCRAMTQ1JTJUOSExJEkkMUQ5JDEkJSUyVC0hMFQlIzA0LSEwVCUjMDQtITA0JGBgImBgYDxgLAorTWAiYGBgMGAkRF5gYCFGYGBKP1kjUEUhNTgkIixXUFRgS1BgYGAqXGBgYGAhYCVZX19fSGAhIi03STdIKAorTWAkNGBgKiRYUkBgYGAxJkJRWkdeMFwrT19fX1okLEwnO2AiLThPQS0rNS0lMDUpIzIiYEooJEE0NSVgTworTSwyWFEjMEkoO1ctVC5DKFMuMlhSLTM0TixDNFUrQyhVLCNIUS4zYFAjMEkzNSNJVTxGWFo8Vi1IOTZVQQorTTxSVVU8JllQKzZdUjlTSUQ5NzlJOFY0WjI2WVQ5NylOOTcxJzg3MUU9ViVZMSY1Vjo2LUUuQyQtIkRVQQorTTtDSEI8Vy1EPCNJRDo3LUM7VzlFPEIoLSJEVTguQywtIkBUKjQlNUAwYCJcI0AhTmBgYGA7QGBgYC9fXworTV9fX19fUGAkKFU+RT5AQGAxMGBgOCNDLGBgImAkNkgiSj9ZI1BKR15fX1xgQjAiKWAkUFBdOERPKjFgYAorTWAwYGBgYGBgYDIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSEwMGBgKGBgIQorTVBgUGAoYGAhYGAyM1hgYCZYYCJJX0QvIjQ1NUAwIy9BYFBgM2BgYGAkUGBgYGBgLFNIQFFGQGAkKFU+RQorTT5IQi5gMCRgYGAhMTU2IWA4PkQjYCNQYGBgYFxgYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgYGAlYDAwYAorTSEwJGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA0NTVAMCtUVQorTSFgYF9gYGBgL1BgYGBgYCxTSEBRRkBgJChVPkU+SEIuYDBgYCswKCRgIlQhLDMoWS0zYFIsU0BSLCNgUAorTS0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlVJTU4JCNZW0A0YC9gYGBgI1BgYGBgYAorTSEiLTdJN0hgIyxaKCw5SihDQCRgYCEwITRgYDQkQEhgYGBcImBgKGBgMGBgJDAkIWBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYCExNTYhYDkuTCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQorTWBgIUAuLFRgYChgMTpAJklfRC8iSj9bX19QIilgKERgMyMjVUIyXEkkYGAhYGBgYGBgYCEoJDUiMUQtJQorTTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQlIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QAorTWAqR14wXCkyNTYhYDcxUCdgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLFhgYChgMQorTTpAIklfRC8iSj9bX19QIilgKERgMyMjVUIyXEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JAorTTE0QSYwVDkmMUQlJjA0NSYwVCUjMDQlIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCkyNTYhYAorTTlbKC5gJVhgYGAhPmBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgISxgRWBgMyEoKmBgYC4iUGBILDMoWQorTS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlQPCVgYGBaKV1UTAorTT9WJ0pZT1ImOD9KKSlVXSUkYCRgYDUpNTgkYCIkUFxgOEBgYGAmKGBgYGBgISItN0k3SGAjLFooLDlKKAorTUNAJGBgJWAhNDAhMCRATGBgYCQtYGBgUGBgYGBgYGBgYGBgYGBgYGBgYGBgLDBgYGBgYGBgYGBgYGBgYAorTWBgYGBgIyhgYGBgYGBgYGBgYGBgYGBgYGBgYCshMGBgKklGSE9aJFw4W1RYIT4hRl0lUDY6JS01OCQhOAorTTMwLGA7QGBgYCZYYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAmYFhTUGBgQCElSV9aR14wXCpJX09fXworTWAoRGBCMCEsLD82KStSQDBgYCRgYGBgYGBgJEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQorTTE0OSMwNC0hMDQkYGAiYGBgPGAsYCJgYGAwYCREXmBgIU5gYEo/WSNQRS01OCQjTTNgSGArQGBgYCJYYAorTWBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkYGAhUCI0MGA8JEBMYGBgTCVgYCNCRShLPiQ8OV1NLEkoX0BHLAorTUMpLlk0VTVAMGAqPSJAYFxgYGBgL2BgYGBgYCQoVT5FPkBgLFNIQFFGSEIuYDBgYCFgLGBgYDBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCUtNTgkI0NIYEhgMlBgYAorTWAkTGBgYGBgISItN0k3SGAjLFooLDlKKENAJCNgI0QhYGBUYGAkIUA1NShgR1pOME1HT0VBOFtANFdPKgorTSZfMTFAJEAiJjJaSUhgLllIWT09OCkkXyU2I1I6VS9aIkYnMTRCTERLLFopSTolMzU2IWAmKjAqYCNYYAorTWBgYF5gYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgUGBMYDBgLWBgIWA4JTUyYCohJlVLMT9LPFJFQ0lUQAorTVknPE8jTkdaQFlKXk8sWUBKUDs/TSwwWy87TTE/UFkzNTYhYDkrSC1gJTghYGAhNmAwYGBfX19fX19fXworTWBgMEM1WjVaImAhJWBgJSguLWBgYChgMWAtOGBgYGBgX19fX19QISRgJCwhLSZRSmAwJCZgKSklLjRYSQorTWA4YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCQoVT5FPkBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgIUNARS1DLTAkIT1gJCEvMDwhYGAwQzVaNVosQDNgSmAnWSNgQSQyRWBZLTUsUDJDUCgzNS0mNSJgVQorTStDYFciUCQvYFA4TCtCXD8oP0RLX1BgYGBgYGA0VTVAMCk/QSMwIk9gYGBgS1BgYGBgJGA3R19fXkBgJAorTShVPkU+QEBgMTBgYEgzQzJgYGAhJDoqX0o/WSNQTl9fX19IMFJQPUxgKFVCXiRUTTRUNSE0RC0oKCJIQAorTTIlMTQ0IlxRK0MkLSJEQU88VzBaLEMsWStDKFUtMlhSLTM0TixDNFAuQyRZLCNgLSJFLTQuRzVSO0NJUworTThWQUU7NiVTKzc1UDtHYE07VylHLkYxRT1GRUM5M0kpO0cxRTxGWUU9JD1BPSY1Vzg3RSQ5NzlJOFY0WgorTSwwVCozNiVOLkIpUzxWMVAuRjFJPFYtTz1GNVIoQFQqMzVAWixQVCojMEkzNTYhYE48KC5gJlhgYGAhTgorTWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLTBgYChgMTo/SklfRC8iSj9bX19QIilgKERgMys0JAorTUIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIQorTWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QGAqR14wXCkzNTYhYFYsMC5gJlhgYGAhTmBgYGBfX19fX19fXworTWBgMEM1WjVaImAhJWBgIUAuLTRgYChgMTo/RklfRC8iSj9bX19QIilgKERgMyIrUkIzJEkkYGAhYGBgYAorTWBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQAorTWBgJGAhKS9AYGA7QGAqR14wXCk0NTYhYEMvJCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQorTWBgIUAuLUBgYChgMTo/OklfRC8iSj9bX19QIilgKERgMys0JEIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJgorTTA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QAorTWAqR14wXCk0NTYhYDQ/NCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLURgYChgMQorTTo/NklfRC8iSj9bX19QIilgKERgMyIrUkIzJEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JAorTTE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCk1NTYhYAorTUIyKCdgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLUhgYChgMTo/MklfRC8iSj9bXworTV9QIilgKERgMys0JEIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIworTTA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QGAqR14wXCk1NTYhYDMyOCdgJlhgYGAhTgorTWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLUxgYChgMTo/LklfRC8iSj9bX19QIilgKERgMyIrUgorTUIzJEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpLworTWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCk2NTYhYD8lLCNgJlhgYGAhTmBgYGBfX19fX19fXworTWBgMEM1WjVaImAhJWBgIUAuLVBgYChgMTo/KklfRC8iSj9bX19QIilgKERgMys4JEIzYEgkYGAhYGBgYAorTWBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQAorTWBgJGAhKS9AYGA5QGAqR14wXCk2NTYhYDFFPCNgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQorTWBgIUAuLVRgYChgMTo/JklfRC8iSj9bX19QIilgKERgMyIvUkIzJEgkYGAhYGBgYGBgYCEoJDUiMUQtJQorTTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QAorTWAqR14wXCk2NTYhYFI8UC5gLVRgYGAjPWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIy8uLixgYChgMQorTTo3UklfRC8iSj9bX19QIipgKEhgTlBFISQwWiksSkdeMFwoYEJAIkVgYGBAMTQ1JTJUOSExJEkkMUQ5JAorTTEkJSUyVC0hMFQlIzA0LSEwVCUjMDQtITA0JGAoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJgorTTA0NSYwVCUjMDQpLmAvXTMzNChFYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgJDBgYAorTSJQYGBgYGBgYGBgYGAuQCNgYGBgYGBgYGBgYCtgJThgYFBgIWBgJGBgQGA8YCVRLTA0RSw0VFEvNSVRIgorTTREXTc0VDRgYEAhJDJFYFktNSxQMkAhNjU2IWBXPFQuYC8sYGBgI1NgYGBgX19fX19fX19gYDBDNVo1WgorTSJgISVgYCNFLi4wYGAoYDE6NjZJX0QvIko/W19fUCIqYChIYFQxYCIkMFopLFpHXjBcKGBCQCJbYGBgQAorTTE0NSUyVDkhMSRJJDFEOSQxJCUlMlQtITBUJSMwNC0hMFQlIzA0LSEwVCRgKCQ1IjFELSUwVDUmMTRJJgorTTE0OSQxNEEmMFQ5JjFEJSYwNDUmMFQlIzA0KS5gL10zMzQoRWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYCQwYGAoMGBgYGBgYGBgYGBgLkAjYGBgYGBgYGBgYGBBYCU4YGBQYCFgYGBgYEBgUgorTWAlUS0wNEUsNFRRLzUlUSI0RF03NFQ0YGAwImBfYEhgMSRJMC4zNTMsJEhgYGBgYGBgYCFgYDQhYFFgIQorTWBgXCE1OkhgNiU1QDArXEwhUCM9YGBgYFcwYGBgL19fX19fX19QYCQoVT5FPkBAYDEwYGBTU0NGYGAiYAorTSQ2RVlKP1kjUEpHXl9fXGBCQCIqYCtMKS8xJC5CMzpJX0QvImAoSGBJMGBgKCQ1JTE0TSYwNDEqMSQ5JgorTTEkMSExNE0jMDQtITBUJSMwNC0hMFQlIzA0JSFgIiElMEQ5IzE0LSUxRDUqMUQ1JjEkNSgxRC0mMUQ5IQorTTFEJSUxRC0hMFQlIjNAI180VFUiKTBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCEkYAorTWBgTGBgYGBgYGBgYGBgI0hgUGBgYGBgYGBgYGAiUCE2YGAsYGAwYCFgYChgJ2AhPDM0JSkzJS0sM1UxPAorTTBFKS81VS0lYGAoYDEkSTAuMzUzLCRIYDY1NUAwLkswI0AjPWBgYGBXMGBgYC9fX19fX19fUGAkKFU+RQorTT5AQGAxMGBgU1NDR2BgImAkNkVYSj9ZI1BKR15fX1xgQkAiKmArTCkvISQuQjM+SV9ELyJgKEhgSTBgYAorTSgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNCUhYCIhJTBEOSMxNC0lMUQ1KgorTTFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSIzQCNfNFRVIikwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGAhJGBgYExgYGBgYGBgYGBgYCNIYFBgYGBgYGBgYGBgIlAhNmBgLGBgMGAhYGAoYAorTSdgITwzNCUpMyUtLDNVMTwwRSkvNVUtJWBgKGAxJEkwLjM1MywkSGA2VTVAMC1AUiFQIz1gYGBgVzBgYAorTWAvX19fX19fX1BgJChVPkU+QEBgMTBgYFNTQ0hgYCJgJDZFV0o/WSNQSkdeX19cYEJAIipgK0wpLlEkLgorTUIzQklfRC8iYChIYEkwYGAoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQlIQorTWAiISUwRDkjMTQtJTFENSoxRDUmMSQ1KDFELSYxRDkhMUQlJTFELSEwVCUiM0AjXzRUVSIpMGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISRgYGBMYGBgYGBgYGBgYGAjSGBQYGBgYGBgYGBgYAorTSJQITZgYCxgYDBgIWBgKGAnYCE8MzQlKTMlLSwzVTE8MEUpLzVVLSVgYChgMSRJMC4zNTMsJEhgNyU1QAorTTAiMl0jMCE2YDBgYDVAJGBgL19fX19fX19QYCQoVT5FPkBAYDEwYCEyI0NJYGAiYCQwIl1gYGBgYC9fXworTV9fXGAxYCEjYDMxTDpAJCEhQCIyMTNFLiowJmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhIi03STdIYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0IWA3MCFgM1QnYDBgJChVPkU+QygkUCpAIQorTV4wUCgxJEkwLjM1MywkSFwiJFUzMUUwQC0yWFAtUEwhI1AsJisiWE8nUidZKl9cYGBgYGBgJVE1OCRgIworTVVQWGBaMGBgYC5EYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAtTFhaQGBgQCElSTo6R14wXCpJX09fXworTWAoSGBCQCMnO0BMMSNIRFlKP1kjUEAiKmArJGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtIQorTTBUJSMwNC0hMFQlITAwYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERcYAorTV9VLS0wQjRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgN2BgYGBgYGBgYGBgYAorTVpgLGBgYGBgYGBgYGAhPGA1QGAjYGAkYGAwYCJgIkBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAoYDJgLworTWAxITlMMUQ1YGBgYGAkMSo0I0RVNFMhKmAlVTU4JCMvVVBYYFowYGBgLkRgYGAjX19fX19fX1xgISItNworTUk3SChgJDRgYC1MWFpQYGBAISVJOipHXjBcKklfT19fYChIYEJAIyc7QEgxI0hEWko/WSNQQCIqYCskYAorTWAiISUxNDUrMUQlJDJEMSYxRDEkMDQ1KzBUJSMwNC0hMFQlIzA0LSEwVCUhMDBgQDE0KSYwVDUjMTQ5JQorTTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFxgX1UtLTBCNGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYDFgYGA3YGBgYGBgYGBgYGBgWmAsYGBgYGBgYGBgYCE8YDVAYCNgYCRgYDBgIgorTWAiQGA3JFUhMjRRMzMkXTQ3JCkyM1U9MzEwYChgMmAvYDEhOUwxRDVgYGBgYCQxKjQjRFU0UyEqYCVZNQorTTgkIitWYFhgWjBgYGAuRGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLUxYW2BgYEAhJUk5WkdeMFwqSQorTV9PX19gKEhgQkAjJztARDEjSERbSj9ZI1BAIipgKyRgYCIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIworTTA0LSEwVCUjMDQtITBUJSEwMGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtIQorTTBEXGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMWBgYDdgYGBgYGBgYAorTWBgYGBaYCxgYGBgYGBgYGBgITxgNUBgI2BgJGBgMGAiYCJAYDckVSEyNFEzMyRdNDckKTIzVT0zMTBgKAorTWAyYC9gMSE5TDFENWBgYGBgJDEqNCNEVTRTISpgJV01OCQhKVYwWGBaMGBgYC5EYGBgI19fX19fX19cYAorTSEiLTdJN0goYCQ0YGAtTFhbMGBgQCElSTlKR14wXCpJX09fX2AoSGBCQCMnO0BAMSNIRFxKP1kjUEAiKgorTWArJGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtITBUJSMwNC0hMFQlITAwYEAxNCkmMFQ1IworTTE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERcYF9VLS0wQjRgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgN2BgYGBgYGBgYGBgYFpgLGBgYGBgYGBgYGAhPGA1QGAjYGAkYAorTWAwYCJgIkBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAoYDJgL2AxITlMMUQ1YGBgYGAkMSo0I0RVNFMhKgorTWAmITU4JCJDVkBYYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWFtAYGBAISVJWCpHXgorTTBcKklfT19fYChEYEIwISxIXjopLzJEMGBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IworTTFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGJTU4JCNGIkBMYAorTTtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWFtQYGBAISVJV1pHXjBcKklfT19fYChEYAorTUIwISxIXjopLzJEMGBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IworTTA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGKTU4JCM/LlA8YDtAYGBgJlhgYGAjXworTV9fX19fX1xgISItN0k3SChgJDRgYCZgWFxgYGBAISVJV0pHXjBcKklfT19fYChEYEIwISxIXjopLzJEMAorTWBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYAorTWA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGLTU4JCM5O2AsYDtAYGBgJlhgYGAjX19fX19fX1xgISItNworTUk3SChgJDRgYCZgWFxQYGBAISVJVlpHXjBcKklfT19fYChEYEIwISxJLjopLzJAMGBgJGBgYGBgYGAkQAorTTE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJAorTUReYGAhRmBgSj9ZI1BGLTU4JCInWGBYYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWAorTV1gYGBAISVJVkpHXjBcKklfT19fYChEYEIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJQorTTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZIworTVBGMTU4JGAvJDBMYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWF0wYGBAISVJVjpHXgorTTBcKklfT19fYChEYEIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MAorTTFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGNTU4JGAmMEA8YAorTTtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWF1AYGBAISVJVipHXjBcKklfT19fYChEYAorTUIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJgorTTQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGOTU4JCNePEAsYDtAYGBgJlhgYGAjXworTV9fX19fX1xgISItN0k3SChgJDRgYCZgWF1QYGBAISVJVVpHXjBcKklfT19fYChEYEIwISxaTlIpL0JAMAorTWBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYAorTWA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGOTU4JCFfWUBYYFcwYGBgLVRgYGAjX19fX19fX1xgISItNworTUk3SChgJDRgYCxcWF5gYGBAISVJOVpHXjBcKklfT19fYChIYEJAIlslQzQxI0hEX0o/WSNQQCIqYCo0YAorTWAiISUxNDUrMUQlJDJEMSYxRDEkMDQ1KzBUJSMwNC0hMFQlIzA0LSEwVCUhMDBgQDE0KSYwVDUjMTQ5JQorTTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwNCRgX1UtLTBCNGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYDFgYGArYGBgYGBgYGBgYGBgWmAsYGBgYGBgYGBgYGBMYDVAYCNgYCRgYDBgIgorTWAhUGA3JFUhMjRRMzMkXTQ3JCkyM1U9MzEwYCJgJDEqNCNEVTRTISpgJjk1OCQhQVlQWGBXMGBgYC1UYAorTWBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAsXFheMGBgQCElSTlKR14wXCpJX09fX2AoSGBCQCJbU1NIMQorTSNIRWBKP1kjUEAiKmAqNGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtITBUJSMwNC0hMFQlIQorTTAwYEAwNCkhMFQ5MDFFISUzRDkkMTQtJjBUNTAxREEmMSQ1JjFFISY0JCUjMDQoYF9VLS0wQjRgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgK2BgYGBgYGBgYGBgYFpgLGBgYGBgYGBgYAorTWBgTGA1QGAjYGAkYGAwYCJgIVBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAiYCQxKjQjRFU0UyEqYCY5NQorTTgkIVBaQFhgXlBgYGAvTGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLlRYXkBgYEAhJUkxWkdeMFwqSQorTV9PX19gKEhgQkAjOSkyLDEjSEUhSj9ZI1BAIipgLCxgYCIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIworTTA0LSEwVCUjMDQtITBUJSEwMGBAMDQpITBUOTAxRSElM0Q5JDE0LSYwVDUwMURBJjEkNSYxRSEmNCQlIworTTA0KGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMWBgYElgYGBgYGBgYAorTWBgYGBaYCxgYGBgYGBgYGBgIkRgNUBgI2BgJGBgMGAiYCNIYDckVSEyNFEzMyRdNDckKTIzVT0zMTBgLAorTWAmI0pgYCEhNEQpJTI1MTMxVSk1NCUhJWBgJGBgUEhgJGAiYDsvWyUhRDEqNCNEVTRTISpgJjk1OCQiNAorTVxgWGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFheUGBgQCElSVk6R14wXCpJX09fXworTWAoRGBCMGBaO11eKTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQorTTE0OSMwNC0hMERQYGAiYGBgNj01OCRgKCdQTGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YAorTWAkWFhfYGBgQCElSVkqR14wXCpJX09fX2AoRGBCMGBaO11eKTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IworTTE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNkE1OCRgJjRgPGA3YGBgYCVQYAorTWBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFhfMGBgQCElSVhaR14wXCpJX09fX2AoRGBCMGBaO11eKQorTTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYAorTWAiYGBgNk01OCQiSjZQPGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFlgMGBgQCElSQorTVdaR14wXCpJX09fX2AoRGBCMGBaO11OKTFQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJQorTTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNlE1OCRgLUJQLGA3YGBgYCVQYGBgI19fX19fX19cYAorTSEiLTdJN0goYCQ0YGAkWFlgQGBgQCElSVdKR14wXCpJX09fX2AoRGBCMGBaO11OKTFQJDBgYCRgYGBgYAorTWBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNlE1OCQhJQorTV9AWGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFkhYGBgQCElSVcqR14wXCpJX09fXworTWAoRGBCMGBaO11OKTFQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQorTTE0OSMwNC0hMERQYGAiYGBgNlU1OCRgN09AVGA1QCRgYCU4IWBgI19fX19fX19cYCEiLTdJN0goYCQ0YAorTWA0QFkhQGBgQCEkYEhgYGBgYCNfX19fX2AkMGAwUCRUOyZIIWAwOGBERDRZM0JEIUBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgMEM1WjVaYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAmLiI0VixVYDAlVAorTWAwJF0hUCRgISItN0k3SFIhLCJIYD9ELCIkMSo0I0RVNFMhKi9gQS00VDk0KCM0TiwjPCtgMFwjIUJQTgorTStRXEFeMk9fYGBgYGBgIVE1NiFgXTokKmAhLGBgYGAzYGBgYGBgUy5CIyY6YGAwQzVaNVpCKFghYDBgYAorTWAnJTU4JCElUGBIYC9gYGBgI1BgYGBgYCEiLTdJN0hgIyxaKCw5SihDQCRgYGA0ISEwYCVgMGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCFRNTYhYEM/NCpgI1xgYGBgXworTWBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgYE1gQDRgKzAkUSxDRFUsIyhTLiMoUCwjYFUsU0RRMCZVTgorTThTYFIsUllNOFYsUi4zNE47Vz1MODZYTjtXKUc8NTVAMC9YViJQYFxgYGBgL2BgYGBgYCQoVT5FPkBgLAorTVNIQFFGSEIuYDBgYCVgJVBgITAyIkBgYCNQKGBgQGAhYGBgMWAwJGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYCcpNTgkIz0uMFBgXFBgYGAvLGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLjRZI2BgYAorTUAhJUkvOkdeMFwqSV9PX19gKEhgQkAjMVxeRDEjSEUqSj9ZI1BAIipgK0xgYCIhJTE0NSsxRCUkMkQxJgorTTFEMSQwNDUrMFQlIzA0LSEwVCUjMDQtITBUJSMwMGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JgorTTA0OSExNDkjMDQtITBEXGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMQorTWBgYEFgYGBgYGBgYGBgYGBaYCxgYGBgYGBgYGBgIiRgNUBgI2BgJGBgYGAiYCMoYDckVSEyNFEzMyRdNAorTTckKTIzVT0zMTBgL2AoI1wiQCEkMkVgWS01LFAyQGBgNjAhPGAlNGAhMCQjJGA0YCNQJTVKQCFTNTYhYAorTUonTCRgJVhgYGAhPmBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgISxgR2BgMyEoKmBgYC4iUGBILDMoWQorTS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlQPCVgYGApW0ROVgorTV08VFlPSDg/Jj0qTGA8YCYkYCRgYDctNTgkIzNRYDBgOEBgYGAmKGBgYGBgISItN0k3SGAjLFooLDlKKAorTUNAJGBgJWAhPDAhMCRATGBgYCQtYGBgUGBgYGBgYGBgYGBgYGBgYGBgYGBgLDBgYGBgYGBgYGBgYGBgYAorTWBgYGBgIyhgYGBgYGBgYGBgYGBgYGBgYGBgYCshMGBgNCwxPToyOCxZW0E1JzshLS5XJj1BNy01OCQiIworTS4wXGArQGBgYCJYYGBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkYGAhUCI8MGA8JEBMYGBgTCVgYCMsRzNPKgorTShNRltaUCMuVSM4M05UOjE9JTVAMCMtN2BgYFxgYGBgL2BgYGBgYCQoVT5FPkBgLFNIQFFGSEIuYDBgYAorTSFgLGBgYDBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCcxNQorTTgkYEc2UGBgMlBgYGAkTGBgYGBgISItN0k3SGAjLFooLDlKKENAJCNgI0QhYGBUYGAkIUA1NyhgSDc9RworTUZdYDxVPTpRXy5PREYuMCFPXjwiUkYtJkwoPyI2XSQoR0ssJTkpSjQ7IidNUFJdQFkjPzoxQj87MCxVVAorTTU2IWA1NVhgYCNYYGBgYF5gYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgUGBMYDBgLWBgIWA4JTVSYCooSQorQDouNCJWRiM6QSpAUTsmQ1AjK1wkQF0zQyM9JTM8MFAmTVwjVldJS2BJTCRgCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2VhcG9uMS5zaCBiL3Rlc3RzL2VhcG9uMS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzhhYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZWFwb24xLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSBlYXBvbjEucHV1CisKK2VjaG8gLW4gdGVzdCBlYXBvbjEuLi4KKy4uL3RjcGR1bXAgLXQgLU4gLXIgZWFwb24xLnBjYXAgPiBlYXBvbjEubmV3CitpZiBkaWZmIGVhcG9uMS5uZXcgZWFwb24xLm91dAordGhlbgorCWVjaG8gcGFzc2VkLgorZWxzZQorCWVjaG8gZmFpbGVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24yLnB1dSBiL3Rlc3RzL2VhcG9uMi5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhYmIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VhcG9uMi5wdXUKQEAgLTAsMCArMSw2NiBAQAorYmVnaW4gNjQ0IGVhcG9uMi5wY2FwCitNVSwuUkgwKGAhYGBgYGBgYGBgYGBgJmBgYGBgIWBgYGBfRTFAMCgwYCNgISJgYGBgMEBgYGBgYCtWWSNdCitNYEAjQDNVUiQ4YEBgMTFgYC0iNTAwYGBXIU8kNFU4J18+TCY6RUtCTU5AYDYqNlkyP14uOkY+VmAkL0NACitNOUNAYGBgJCEiYEg5NzRGTUJNMTUrUSE1OCQhUUdgOGA4YGBgYC5MYGBgYGAiXU4wXzAoYFgkXTxBJmAoCitNYCQ0YGAtVEgnUGBgXUElTkg9NiFfV0shRkk6WDUoWCclYCMpIU0wISVgIyEsS0EwOFlBJTxeRS5ALldcCitNVkdFQUdAJEosMyhZLTNgUixTQFIsI2BQLTMsWSw0IU07RixQLEMsTjs2LUMsQ0RVK0ZcMDU2IWBgSjAmCitNYCZgYGBgIipgYGBgYGBgLCFaUiVgYE87RC9UIiJgISVgYCFcYGAhYGAkYDEjMishRkk6WFU4J18+QDw0CitNNShYYDopUC0iUTBgOCQkITxJM0w/LUlcXkNMWlo4VyZKJDwoIU9fX19fWCwhQGBgYERgJiFAYGBgYCkvCitNJUAkMGAhMDIiQGBgI1AoYGBAYCEkJTVAMC9OYCFQIUBgYGBgJ2AkYGBgYCtWWSNdYEAjQDNVUiQ4YEBgCitNMTBgISNCQEBgYCNWJDZZT1U4J18+TCY6RUtBNENAPDRgL0ksPGAkNWAvK001Ry9cYDA8MEc6PVFdUzQ8CitNTTxXMWAySFEsQ0RVLCMoUy4jKFAsI2BVLFNEUTAmVU44U2BSLFJZTThWLFIuMzROO1EhNTgkIj9BUDxgCitNOGBgYGAsOGBgYGBgYGBQJ0soNGAiXU4wXzAoKGAkNGBgK0BgYDRgYDAhJCxZPCY6RUtDNUA/XVohUTE0CitNQ0AiRCpAVCslMCI8R1pAU1Q/JkBYJjNEQVtQKy4hS1krQEAmX19fX19AUCZgYGAiMGA4JmBgYGBgRF0yCitNYDEkYDQhKCtgYGAhIzBgYCxgYDE1NiFgUVBgJWAmYGBgYCNMYGBgYGBgTztEL1QiYC4hLzcoMUAiYCElCitNYGAjPioiJGBgLzgxO0lbNUA/XVpQOUo2TiUyLiFRMGBSSExCYDE4YFBCKldHNFdeMDFMTV1CNFhOJmAnCitNNkUoISpDJFIuMzRQLEMsWCxDYFAsIzRTLjMlYDs2WUMsIyhTK0ZVQzhTKFktMllPJDU1QDAhUCYhMCFACitNYGBgYCFAJGBgYGBgI2A+TEEwYCtWWSNdYEBAYDEwYGBeYGAiMGAhYCQwUkRQOUo2Ti02IV9XSCclJTIuCitNYC4yPkRQKDZgLVAwNFROPiZPIlxXTCVALC5gMVYxNDIiYDtfX19fXiNgOGBgYClgIUA4YGBgYCImQ0hgCitNYGAkVyQzMmArVTwxO0xTNjJCXTU4JCE6SEA4YDhgYGBgLkxgYGBgYCJdTjBfMChgWCRdPEEmYChgJDRgCitNYC1USClgYGBdQSVORy02IV9XSyFGSTpYNShYJyVgIylHXyghJmAjIThJQFwsSjVERFJHRU0+QE0+QT1HCitNQjAkSiwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTTtGLFAsQyxOOzYtQyxDRFUrRlxPNTYhYEcqPCZgJmBgCitNYGAiKmBgYGBgYGAsIVpSJWBgTztEL1QiImAhJWBgIVxgYC1gYCRgMSMxXyFGSTpYVTgnXz5APDQ1KFhgCitNOiM8RiJRQGA4JFZYSlxaWydGJV5SQ0s/QjRDXig2VCghT19fX19YLCFAYGBgRGAmIUBgYGBgKS8lQCRPCitNYCEwMiJAYGAjUChgYEBgISw1NUAwLVMvYDAhQGBgYGAnYCRgYGBgK1ZZI11gQCNAM1VSJDhgQGAxMGAhCitNI0JARWBgI1YkNllKVTgnXz5MJjpFS0E0Q0A8NGAvSDIkUCQ5YC8pNkhQN0g4UjAoTzxPXTovIjRAMD0lCitNYDJIUSxDRFUsIyhTLiMoUCwjYFUsU0RRMCZVTjhTYFIsUllNOFYsUi4zNE47UyU1OCQhN1VAJGA4YGBgCitNYCw4YGBgYGBgYFAnSyg0YCJdTjBfMCgoYCQ0YGArQGAhJGBgMCEkLFhMJjpFS0M1QD9dWiFRMTRDQCJECitNWjIsKyYwIjwoWTNYUCFgQ15OVilKWy1RK1BVMyJAQCZfX19fX0BQJmBgYCIwYDgmYGBgYGBEXTJgM2BgCitNNCEoK2BgYCEjMGBgLGBgUTU2IWAkSlgtYCZgYGBgI0xgYGBgYGBPO0QvVCJgLiEvNygxQCJgISVgYCM+CitNKiI4YGAvODE7SUc1QD9dWlA5SjZOJTIuIVEwYFJAV0NgMUhgUENTLz8mUUhJVDhTWC5bMiM9W1M2OEghCitNKkMkUi4zNFAsQyxYLENgUCwjNFMuMyVgOzZZQywjKFMrRlVDOFMoWS0yWU8sNTVAMCNWUyMwIUBgYGBgCitNIUAkYGBgYGAjYD5MQTBgK1ZZI11gQEBgMTBgYF5gYCUwYCFgJDBSQVA5SjZOLTYhX1dIJyUlMi5gLjNCCitNTVAoOmAtUypaKD85SDM0KSZBQjAiOkQ5PCFPKSJgO19fX19eI2A4YGBgKWAhQDhgYGBgIiZDSGBgYCRXCitNJDMyMVA9VDNBREUtWFUhNTgkIiREQGBgOGBgYGAuTGBgYGBgIl1OMF8wKGBYJF08QSZgKGAkNGBgLVRICitNKmBgYF1BJU5GLTYhX1dLIUZJOlg1KFgnJWAjKVslSCEmUCMhUEI8VzcsOzEjJVVBRiItVipPUkM5MCRKCitNLDMoWS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXTA1NiFgOEk8YGAmYGBgYCIqCitNYGBgYGBgYCwhWlIlYGBPO0QvVCIiYCElYGAhXGBgOWBgJGAxIzFTIUZJOlhVOCdfPkA8NDUoWGA6IzAlCitNIlFMYDgoTjpeTjVMKEVLJiNINi0nOlUkWFYoKCFPX19fX1gsIUBgYGBEYCYhQGBgYGApLyVAJTBgITAyCitNIkBgYCNQKGBgQGAhNDU1QDAqVkwiMCFAYGBgYCdgJGBgYGArVlkjXWBAI0AzVVIkOGBAYDEwYCEjQkBJCitNYGAjViQ2WUZVOCdfPkwmOkVLQTRDQDw0YC9LREZQJDxgLytIJFI4UDkoQiJXW15HPDQhIkhLUStgMkhRCitNLENEVSwjKFMuIyhQLCNgVSxTRFEwJlVOOFNgUixSWU04VixSLjM0TjtVJTU4JCJaTEBEYDhgYGBgLDhgCitNYGBgYGBgUCdLKDRgIl1OMF8wKChgJDRgYCtAYCFUYGAwISQsV1wmOkVLQzVAP11aIVExNENAIkRJPUArCitNJ2AiPEdeJFA+OyohPiZGWTtDPzIvKVQ3NGBAJl9fX19fQFAmYGBgIjBgOCZgYGBgYERdMmA1JGA0ISgrCitNYGBgISMwYGAsYCEyNTYhYEBTTCVgJmBgYGAjTGBgYGBgYE87RC9UImAuIS83KDFAImAhJWBgIz4qIkhgCitNYC84MTtJNzVAP11aUDlKNk4lMi4hUTBgUkkiVGAxVGBQRTpeUDZKSEBdVSREKiFDIzhDTzBVUCEqQyRSCitNLjM0UCxDLFgsQ2BQLCM0Uy4zJWA7NllDLCMoUytGVUM4UyhZLTJZTzRFNUAwJ01gITAhQGBgYGAhQCRgCitNYGBgYCNgPkxBMGArVlkjXWBAQGAxMGBgXmBgKDBgIWAkMFI+UDlKNk4tNiFfV0gnJSUyLmAuMjwmQCg9CitNYC1QJl1XR0hOQisrWjBLJkEiXkI8MlMvImA7X19fX14jYDhgYGApYCFAOGBgYGAiJkNIYGBgJFckMzJGCitNPURUQCZcRFsvRyE1OCQhT1cwNGA4YGBgYC5MYGBgYGAiXU4wXzAoYFgkXTxBJmAoYCQ0YGAtVEgqUGBgCitNXUElTkU9NiFfV0shRkk6WDUoWCclYCMpKjpEISdAIyFJW0QrMz9DKy4vSy1gLz5BUyJXXlAwJEosMyhZCitNLTNgUixTQFIsI2BQLTMsWSw0IU07RixQLEMsTjs2LUMsQ0RVK0ZdUDU2IWBMPiglYCZgYGBgIipgYGBgCitNYGBgLCFaUiVgYE87RC9UIiJgISVgYCFcYGBFYGAkYDEjMUchRkk6WFU4J18+QDw0NShYYDpgLlYiUVhgCitNOCtQLyEqWSFSWj4oLzpDLiUvQTYyXCgoIU9fX19fWCwhQGBgYERgJiFAYGBgYCkvJUAlUGAhMDIiQGBgCitNI1AoYGBAYCE8NTVAMCkqSCNAIUBgYGBgJ2AkYGBgYCtWWSNdYEAjQDNVUiQ4YEBgMTBgISNCQExgYCNWCitNJDZZQ1U4J18+TCY6RUtBNENAPDRgL0pMSEAkP2AvKi5NIi5EPD5NNCxLTD0uKDoiWy1GO2AySFEsQ0RVCitNLCMoUy4jKFAsI2BVLFNEUTAmVU44U2BSLFJZTThWLFIuMzROO1clNTgkIyRLQFhgOGBgYGAsOGBgYGBgCitNYGBQJ0soNGAiXU4wXzAoKGAkNGBgK0BgIkRgYDAhJCxXLCY6RUtDNUA/XVohUTE0Q0AiREs3RCsnUCI8CitNTVdWUEpPOlhDYEpFWSMxNTw1VTBaQEAmX19fX19AUCZgYGAiMGA4JmBgYGBgRF0yYDckYDQhKCtgYGAhCitNIzBgYCxgIVI1NiFgUyM0KmAmYGBgYCNMYGBgYGBgTztEL1QiYC4hLzcoMUAiYCElYGAjPioiVGBgLzgxCitNO0krNUA/XVpQOUo2TiUyLiFRMGBSRT4xYDJgYFBLKyJdP1VDVl1HMUk8LStYMTY/MCtMISpDJFIuMzRQCitNLEMsWCxDYFAsIzRTLjMlYDs2WUMsIyhTK0ZVQzhTKFktMllPPEU1QDAsLFoiQCFAYGBgYCFAJGBgYGBgCitNI2A+TEEwYCtWWSNdYEBAYDEwYGBeYGArMGAhYCQwUjtQOUo2Ti02IV9XSCclJTIuYC4xTSVQKEBgLVBKCitNPT9IJzY8MT1VRCY6RlJWQSxWK1MiYDtfX19fXiNgOGBgYClgIUA4YGBgYCImQ0hgYGAkVyQzMlJWUkU9CiskSSVQXDAwYGAKK2AKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwLXNlY3JldHMudHh0IGIvdGVzdHMvZXNwLXNlY3JldHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODQ3YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3Atc2VjcmV0cy50eHQKQEAgLTAsMCArMSw1IEBACisjIGEgY29tbWVudAorCisweDEyMzQ1Njc4QDE5Mi4xLjIuNDUgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1ODQwCisweGFiY2RhYmNkQDE5Mi4wLjEuMSAgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MDQzCisweGQxMjM0NTY3QDE5Mi4xLjIuNDUgYWVzMjU2LWNiYy1obWFjOTY6MHhhYWFhYmJiYmNjY2NkZGRkNDA0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4CmRpZmYgLS1naXQgYS90ZXN0cy9lc3AwLm91dCBiL3Rlc3RzL2VzcDAub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGRmMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AwLm91dApAQCAtMCwwICsxLDggQEAKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxMTYKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTYKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDAuc2ggYi90ZXN0cy9lc3AwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjQwN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AwLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCitlY2hvIC1uIHRlc3QgZXNwMC4uLgordXVkZWNvZGUgMDItc3VucmlzZS1zdW5zZXQtZXNwLnB1dQoraWYgKC4uL3RjcGR1bXAgLXQgLW4gLXIgMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAgfCBkaWZmIC0gZXNwMC5vdXQpCit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCQorCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AxLmdkYmluaXQgYi90ZXN0cy9lc3AxLmdkYmluaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YWU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcDEuZ2RiaW5pdApAQCAtMCwwICsxIEBACitzZXQgYXJncyAtdCAtbiAtRSAiMHgxMjM0NTY3OEAxOTIuMS4yLjQ1IDNkZXMtY2JjLWhtYWM5NjoweDQwNDM0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1OCIgLXIgMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAgCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AxLm5ldyBiL3Rlc3RzL2VzcDEubmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjI5NjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AxLm5ldwpAQCAtMCwwICsxLDggQEAKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE1MzYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIzMDQsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDMwNzIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwMS5vdXQgYi90ZXN0cy9lc3AxLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWIyOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwMS5vdXQKQEAgLTAsMCArMSw4IEBACitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDEyODAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIwNDgsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg1KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI4MTYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg4KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDEuc2ggYi90ZXN0cy9lc3AxLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWUzYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AxLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSAwMi1zdW5yaXNlLXN1bnNldC1lc3AucHV1CisKK2VjaG8gLW4gdGVzdCBlc3AxLi4uCisuLi90Y3BkdW1wIC10IC1uIC1FICIweDEyMzQ1Njc4QDE5Mi4xLjIuNDUgM2Rlcy1jYmMtaG1hYzk2OjB4NDA0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4IiAtciAwMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcCA+ZXNwMS5uZXcKK2lmIGRpZmYgZXNwMS5uZXcgZXNwMS5vdXQKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIuZ2RiaW5pdCBiL3Rlc3RzL2VzcDIuZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzE4NDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwMi5nZGJpbml0CkBAIC0wLDAgKzEgQEAKK3NldCBhcmdzIC10IC1uIC1FICIweDEyMzQ1Njc4QDE5Mi4xLjIuNDUgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1ODQwLDB4YWJjZGFiY2RAMTkyLjAuMS4xIDNkZXMtY2JjLWhtYWM5NjoweDQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4NDA0MyIgLXIgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwIApkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwMi5uZXcgYi90ZXN0cy9lc3AyLm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwMi5uZXcKQEAgLTAsMCArMSw4IEBACitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4OCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AyLm91dCBiL3Rlc3RzL2VzcDIub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MjljOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AyLm91dApAQCAtMCwwICsxLDggQEAKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgxKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg0KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg1KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg4KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIuc2ggYi90ZXN0cy9lc3AyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTcwODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3AyLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSAwOC1zdW5yaXNlLXN1bnNldC1lc3AyLnB1dQorCitlY2hvIC1uIHRlc3QgZXNwMi4uLgorLi4vdGNwZHVtcCAtdCAtbiAtRSAiMHgxMjM0NTY3OEAxOTIuMS4yLjQ1IDNkZXMtY2JjLWhtYWM5NjoweDQzNDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MCwweGFiY2RhYmNkQDE5Mi4wLjEuMSAzZGVzLWNiYy1obWFjOTY6MHg0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1ODQwNDMiIC1yIDA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcCA+ZXNwMi5uZXcKK2lmIGRpZmYgZXNwMi5uZXcgZXNwMi5vdXQKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDMuZ2RiaW5pdCBiL3Rlc3RzL2VzcDMuZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTUwMTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwMy5nZGJpbml0CkBAIC0wLDAgKzEgQEAKK3NldCBhcmdzIC10IC1uIC1FICIzZGVzLWNiYy1obWFjOTY6MHg0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4NDAiIC1yIDA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcCAKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDMubmV3IGIvdGVzdHMvZXNwMy5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiMjk2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcDMubmV3CkBAIC0wLDAgKzEsOCBAQAorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgxKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE3OTIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg0KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI1NjAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AzLnNoIGIvdGVzdHMvZXNwMy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJiZWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwMy5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKwordXVkZWNvZGUgMDItc3VucmlzZS1zdW5zZXQtZXNwLnB1dQorZWNobyAtbiB0ZXN0IGVzcDMuLi4KKyAuLi90Y3BkdW1wIC10IC1uIC1FICIzZGVzLWNiYy1obWFjOTY6MHg0MDQzNDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTgiIC1yIDAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wY2FwID5lc3AzLm5ldworaWYgZGlmZiBlc3AzLm5ldyBlc3AxLm91dAordGhlbgorCWVjaG8gcGFzc2VkLgorZWxzZQorCWVjaG8gZmFpbGVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwNC5nZGJpbml0IGIvdGVzdHMvZXNwNC5nZGJpbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDc0NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3A0LmdkYmluaXQKQEAgLTAsMCArMSwyIEBACitzZXQgYXJncyAtdCAtbiAtRSAiZmlsZSBlc3Atc2VjcmV0cy50eHQiIC1yIDA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcCAKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwNC5uZXcgYi90ZXN0cy9lc3A0Lm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5YzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwNC5uZXcKQEAgLTAsMCArMSw4IEBACitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4OCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A0LnNoIGIvdGVzdHMvZXNwNC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmEyNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwNC5zaApAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKwordXVkZWNvZGUgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wdXUKKworZWNobyAtbiB0ZXN0IGVzcDQuLi4KKy4uL3RjcGR1bXAgLXQgLW4gLUUgImZpbGUgZXNwLXNlY3JldHMudHh0IiAtciAwOC1zdW5yaXNlLXN1bnNldC1lc3AyLnBjYXAgPmVzcDQubmV3CitpZiBkaWZmIGVzcDQubmV3IGVzcDIub3V0Cit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A1LmdkYmluaXQgYi90ZXN0cy9lc3A1LmdkYmluaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1NzhlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcDUuZ2RiaW5pdApAQCAtMCwwICsxLDMgQEAKK3NldCBhcmdzIC10IC1uIC1FICJmaWxlIGVzcC1zZWNyZXRzLnR4dCIgLXIgMDgtc3VucmlzZS1zdW5zZXQtYWVzLnBjYXAgCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwNS5uZXcgYi90ZXN0cy9lc3A1Lm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2YzNWUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwNS5uZXcKQEAgLTAsMCArMSw4IEBACitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDEpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDEyODAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHgyKSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4MyksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDQpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIwNDgsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg1KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4NiksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDcpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI4MTYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg4KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDUub3V0IGIvdGVzdHMvZXNwNS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmMzVlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcDUub3V0CkBAIC0wLDAgKzEsOCBAQAorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHgxKSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4MiksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDMpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE3OTIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg0KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4NSksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCitJUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDYpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI1NjAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQorSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg3KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKK0lQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4OCksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A1LnNoIGIvdGVzdHMvZXNwNS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDViNjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwNS5zaApAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKwordXVkZWNvZGUgMDgtc3VucmlzZS1zdW5zZXQtYWVzLnB1dQorCitlY2hvIC1uIHRlc3QgZXNwNS4uLgorLi4vdGNwZHVtcCAtdCAtbiAtRSAiZmlsZSBlc3Atc2VjcmV0cy50eHQiIC1yIDA4LXN1bnJpc2Utc3Vuc2V0LWFlcy5wY2FwID4gZXNwNS5uZXcKK2lmIGRpZmYgZXNwNS5uZXcgZXNwNS5vdXQKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEubmV3IGIvdGVzdHMvZXNwdWRwMS5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5OWZmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcHVkcDEubmV3CkBAIC0wLDAgKzEsOCBAQAorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgxKSwgbGVuZ3RoIDExNgorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogIGlwLXByb3RvLTIyNyA0OQorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogUElNdjEzLCBsZW5ndGg6IDEwCitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tMTgzIDI4CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tNzIgMzQKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTY6ICBpcC1wcm90by0yMjQgNTkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEub3V0IGIvdGVzdHMvZXNwdWRwMS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5OWZmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcHVkcDEub3V0CkBAIC0wLDAgKzEsOCBAQAorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgxKSwgbGVuZ3RoIDExNgorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogIGlwLXByb3RvLTIyNyA0OQorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogUElNdjEzLCBsZW5ndGg6IDEwCitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tMTgzIDI4CitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tNzIgMzQKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTY6ICBpcC1wcm90by0yMjQgNTkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEucGNhcCBiL3Rlc3RzL2VzcHVkcDEucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzg3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZXNwdWRwMS5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEucHV1IGIvdGVzdHMvZXNwdWRwMS5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzYzFjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2VzcHVkcDEucHV1CkBAIC0wLDAgKzEsMzUgQEAKK2JlZ2luIDY0NCBlc3B1ZHAxLnBjYXAKK01VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCZgYGAhYGBgYGBgYGBgYGBgYGAiPmBgYGBHQGBgYCFgYGAmMUQKK00xMWBgYCYxRChQQGAxMGBgRCo4LmBgIWAkNWAoUGAkIiVcYCFgQlQxRSEmNGAnUGBgIShUNUdAYGBgYCEKK01JUUkxV0FSWSoyLiwzKk4+XEU0LU1WMCJRMCZCOVJHXENIXVo/Ri5KMlUySjY/OSIlV0hJKSxQQ0M0LlQKK01QSFUxRDIsS1Q2Ii4zVEdgMVI6ViRFNydGRVtdUEclMSNcISdPPTE7OSJQWyNRKlU7RFUxMjw5Qk8kOi8KK00oQUkyUyosQks1SF9ZVktDLF1LJ0BbWV5gYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGBgJjFEMTFgYGAmMUQKK00oUEBgMTBgYEQqOC9gYCFgJDVgJ1BgJCIlXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGBgYGAiKjMkSCkqXksKK01HNjUhOT9VXltPPikvKkQxIiZXTlVOQD1CR0paViQ7RTEyPCRKJFNHT0FGSiE8NSlPJT1OWTpIWVxCJDMKK00hKlEuTi0tVS86X0ZeO0wtSDA+WyQ5QVUwXFFQImBGNUpEOEdZMzA3XFNERDU9WVxHQCUoJzc2UjVPYEcKK01BLzJgPSwkVldGXTBbTFwqYGBgYGBgYGBgYCI+YGBgYEdAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGAKK01EKjgwYGAhYCQ1YCZQYCQiJVxgIWBCVDFFISY0YCdQYGAhKFQ1R0BgYGBgI0NdIVxSO0skSC9ZWDc+VDYKK01aVDY+LzJJWytRNCYqXTdBYFZMQilbJUFfL01LUU1YLTpSIi0pREEuW0c+KVw1XUtGI1o1OjNMK0pDTUMKK01YREhLQkUlL1ElRDFWViM9P1wzSkVaPzgpJlszWyg0RiI0KjBXIkIpLiJbLj8wVSg3ISFaMl82OTowRFYKK005OEgkOFIlPWBgYGBgYGBgYGAiPmBgYGBHQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgRCo4MWBgIWAKK00kNWAlUGAkIiVcYCFgQlQxRSEmNGAnUGBgIShUNUdAYGBgYCRGVjg9XCpHUihAX1smVEYyJjMnQVo5KVEKK00qP0BbKE0hSTpJRSJALT80VzVURVotNUAoRlw2MTMlVjE5TCMlW1hDSkZKWV5HNEJWVyJPXC8qWFwhQTYKK01AMTxbNEooNSs2ME04XTlSPiQ9XFRVPlhYN0FCN1xUJzFXMUhBUFhbKEtQVFZOIipORUMpRS83QDVEXzEKK01gYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgMTBgYEQqODJgYCFgJDVgJFBgJCIKK00lXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGBgYGAlPUBDUkE0OU8wRDtBMUBUNVtXUiRRNT9ZKFxNWz5EQEMKK01SRksrJDVJJVk4Ojg1S2ApJkxaLlFARyZOKTgtUkdAMjtHTllKXDJPQzlaVj8sSVQ3SEpVN0smRE0vMV8KK006SystOEtYWTQ/MjIqOD0uMUBPPCwjUiY7XlIyUGA+UEFSOUU3Kj4hPjMqRDI0T0s0KkMxYGBgYGBgYGAKK01gYCI+YGBgYEdAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBEKjgzYGAhYCQ1YCNQYCQiJVxgIWBCVDEKK01FISY0YCdQYGAhKFQ1R0BgYGBgJk9URiskPVNNW1kuPVU4RT45ViY2OVI6TVwuMSZMQV0kIzlRXjorRTcKK01RRSNFXikxUl0tLT9PXVNXISU3XUtCPDdcTUxSNTZePEhULkQuIjRBNU0xTEJCN0ZOWDdEUC1DJCZBSF0KK00rJzpWTCQwVilbW0tTQ0FXW1lBLD5XWCkjPykvSUpSPF9AQzkxTkdgKFNeU2BgYGBgYGBgYGAiPmBgYGAKK01HQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgRCo4NGBgIWAkNWAiUGAkIiVcYCFgQlQxRSEmNGAnUGAKK01gIShUNUdAYGBgYCchMTI5MzNEVEMxUlNUTiouLzRaQ0UlQThHR1ZMOjtAYC4lJzhNRUEuQzcvNl1EW1MKK01PMUMoW0QvTjZdJVs/TklTUj4xVzFFRSwpPVxJOSYuUEYtJ1EqTFhaUVU3MTEwMC5bXCwtSEs0MUczL1IKK01HOURZJCxdLihNNThVMVwwWFRcNFJbPD1SQ0NYTTtfJUFWTSlgYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGAKK01gJjFEMTFgYGAmMUQoUEBgMTBgYEQqODVgYCFgJDVgIVBgJCIlXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGAKK01gYGAoKl8zTDYmREVgNjVRUVBBIkBCQVE1RllAPSUsK11AQzlLK08pQF0sL0dDSTQlLE1LSTI4MigwTTkKK00qPEAvPUwuREIiKipFTSI6KjJLSktgXkg9MFlNLCReW2A9TCUoUk8sT188NGBNTktKKjpeOVc4QDFCUCQKKzU5TEtgLTopVlEvPTJCOzEnNEZWM0I/TF0yO08hCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEuc2ggYi90ZXN0cy9lc3B1ZHAxLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGMwYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lc3B1ZHAxLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSBlc3B1ZHAxLnB1dQorCitlY2hvIC1uIHRlc3QgZXNwdWRwMS4uLgorLi4vdGNwZHVtcCAtdCAtbiAtRSAiZmlsZSBlc3Atc2VjcmV0cy50eHQiIC1yIGVzcHVkcDEucGNhcCA+ZXNwdWRwMS5uZXcKK2lmIGRpZmYgZXNwdWRwMS5uZXcgZXNwdWRwMS5vdXQKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1kZWxldGUtc2VnZmF1bHQucGNhcCBiL3Rlc3RzL2lzYWttcC1kZWxldGUtc2VnZmF1bHQucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzRhZGExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1kZWxldGUtc2VnZmF1bHQucHV1IGIvdGVzdHMvaXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1MTJiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcC1kZWxldGUtc2VnZmF1bHQucHV1CkBAIC0wLDAgKzEsMjAgQEAKK2JlZ2luIDY0NCBpc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAKK01VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCRgYGAhYGBgYEAiWGBgYGBgYGAiSWBAYGBKMChgYC9fX19fX18KK01fUCQhYDAkIWAwQGAxMGBgSUBgTzBgIWAkM1BBP1BgYGA3XGBgYCQhXWAnVGA8QGBgIU4zJCwrXC83S14KK00zU0YhRlInSDY/VCxPS1hOJllIPTVULEFFWUglUkAoQDcxK0M2NSNfX19cYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKK01gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKKyFgYGBgCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wY2FwIGIvdGVzdHMvaXNha21wLWlkZW50aWZpY2F0aW9uLXNlZ2ZhdWx0LnBjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZjA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wdXUgYi90ZXN0cy9pc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucHV1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMGFlMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucHV1CkBAIC0wLDAgKzEsMTEgQEAKK2JlZ2luIDY0NCBpc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYGBgYGBgSFYlQDAiXyojQGBcYDBgYC9gJGBgYChgYGAhJQorTWBgJFhIJlBgYC9cMSckOV9gYGAhP1BgYGAwJ1VgPzAhKSRLTCk5RVBDKDFaQlAoYGBgYGBgYGBgYGA0MAorTWBAYGBgYGBgYGBgISdgYGBgMGAiYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorSWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucGNhcCBiL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhkYTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucHV1IGIvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1ODI0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucHV1CkBAIC0wLDAgKzEsNiBAQAorYmVnaW4gNjQ0IGlzYWttcC1wb2ludGVyLWxvb3AucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYCFgYGBgRFI7NS9bX0AhMCEoYGBgYDJgYGBgYGAkNkRbSAorTUVgYCIrNl86XUBAYDEwYGAuSD1FMGAjUyQwSEJAOktZP0gmSl41PCFdYCdUYCI7Uj9AYGBgYGBgYGBgYAorNmBgYGBgYGBgYGBgKCRgJGBgYGBgYGBgYGBgYCpgYGBgCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDEub3V0IGIvdGVzdHMvaXNha21wMS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhNmVkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDEub3V0CkBAIC0wLDAgKzEgQEAKK0lQIDEyNy4wLjAuMS41MDAgPiAxMjcuMC4wLjEuNTAwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzID8gIzE5MFtDXQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wMS5zaCBiL3Rlc3RzL2lzYWttcDEuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyZGU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDEuc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisKK3V1ZGVjb2RlIGlzYWttcC1kZWxldGUtc2VnZmF1bHQucHV1CisKK2VjaG8gLW4gdGVzdCBpc2FrbXAxLi4uCitpZiAoLi4vdGNwZHVtcCAtdCAtbiAtciBpc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAgfCBkaWZmIC0gaXNha21wMS5vdXQpCit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAyLm91dCBiL3Rlc3RzL2lzYWttcDIub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzI4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pc2FrbXAyLm91dApAQCAtMCwwICsxIEBACitJUCAxMjkuMTcwLjI0OS4xMjYuNTAwID4gMTI5LjE3MC4yNDkuODcuNTAwOiBpc2FrbXA6IHBoYXNlIDEgPyBiYXNlCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAyLnNoIGIvdGVzdHMvaXNha21wMi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaXNha21wMi5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKwordXVkZWNvZGUgaXNha21wLXBvaW50ZXItbG9vcC5wdXUKKworZWNobyAtbiB0ZXN0IGlzYWttcDIuLi4KK2lmICguLi90Y3BkdW1wIC10IC1uIC1yIGlzYWttcC1wb2ludGVyLWxvb3AucGNhcCB8IGRpZmYgLSBpc2FrbXAyLm91dCkKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDMubmV3IGIvdGVzdHMvaXNha21wMy5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzN2I3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDMubmV3CkBAIC0wLDAgKzEsMiBAQAorSVAgKHRvcyAweDAsIHR0bCAyNTUsIGlkIDQxMDY4LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogMzEyKSAxMjcuMC4wLjEuNTAxID4gMTI3LjAuMC4xLjUwMDogaXNha21wIDEuMCBtc2dpZCA6IHBoYXNlIDEgSSBpZGVudDoKKyAgICAoaWQ6IGlkdHlwZT1GUUROIHByb3RvaWQ9MCBwb3J0PTAgbGVuPTI0OCBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDMub3V0IGIvdGVzdHMvaXNha21wMy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzN2I3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDMub3V0CkBAIC0wLDAgKzEsMiBAQAorSVAgKHRvcyAweDAsIHR0bCAyNTUsIGlkIDQxMDY4LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogMzEyKSAxMjcuMC4wLjEuNTAxID4gMTI3LjAuMC4xLjUwMDogaXNha21wIDEuMCBtc2dpZCA6IHBoYXNlIDEgSSBpZGVudDoKKyAgICAoaWQ6IGlkdHlwZT1GUUROIHByb3RvaWQ9MCBwb3J0PTAgbGVuPTI0OCBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDMuc2ggYi90ZXN0cy9pc2FrbXAzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDAzY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pc2FrbXAzLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSBpc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucHV1CisKK2VjaG8gLW4gdGVzdCBpc2FrbXAzLi4uCisuLi90Y3BkdW1wIC10IC12IC1uIC1yIGlzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wY2FwID4gaXNha21wMy5uZXcKK2lmIGRpZmYgaXNha21wMy5uZXcgaXNha21wMy5vdXQKK3RoZW4KKwllY2hvIHBhc3NlZC4KK2Vsc2UKKwllY2hvIGZhaWxlZC4KK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDQubmV3IGIvdGVzdHMvaXNha21wNC5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YjdkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDQubmV3CkBAIC0wLDAgKzEsMzUgQEAKK2FycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAorYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKK0lQIDE5Mi4xLjIuMjU0LjUwMCA+IDE5Mi4xLjIuMjMuNTAwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudAorSVAgMTkyLjEuMi4yMy41MDAgPiAxOTIuMS4yLjI1NC41MDA6IGlzYWttcDogcGhhc2UgMSBSIGlkZW50CitJUCAxOTIuMS4yLjI1NC41MDAgPiAxOTIuMS4yLjIzLjUwMDogaXNha21wOiBwaGFzZSAxIEkgaWRlbnQKK0lQIDE5Mi4xLjIuMjMuNTAwID4gMTkyLjEuMi4yNTQuNTAwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudAorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudFtFXQorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudFtFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MSksIGxlbmd0aCAxMzIKK2FycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMworYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MiksIGxlbmd0aCAxMzIKK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MyksIGxlbmd0aCAxMzIKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg0KSwgbGVuZ3RoIDEzMgorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogaXNha21wLW5hdC1rZWVwLWFsaXZlCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg1KSwgbGVuZ3RoIDEzMgorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NiksIGxlbmd0aCAxMzIKK2FycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAorYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NyksIGxlbmd0aCAxMzIKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4OCksIGxlbmd0aCAxMzIKK2FycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMworYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBpc2FrbXAtbmF0LWtlZXAtYWxpdmUKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIGluZltFXQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wNC5vdXQgYi90ZXN0cy9pc2FrbXA0Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzViN2RhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaXNha21wNC5vdXQKQEAgLTAsMCArMSwzNSBAQAorYXJwIHdoby1oYXMgMTkyLjEuMi4yMyB0ZWxsIDE5Mi4xLjIuMjU0CithcnAgcmVwbHkgMTkyLjEuMi4yMyBpcy1hdCAxMDowMDowMDo2NDo2NDoyMworSVAgMTkyLjEuMi4yNTQuNTAwID4gMTkyLjEuMi4yMy41MDA6IGlzYWttcDogcGhhc2UgMSBJIGlkZW50CitJUCAxOTIuMS4yLjIzLjUwMCA+IDE5Mi4xLjIuMjU0LjUwMDogaXNha21wOiBwaGFzZSAxIFIgaWRlbnQKK0lQIDE5Mi4xLjIuMjU0LjUwMCA+IDE5Mi4xLjIuMjMuNTAwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudAorSVAgMTkyLjEuMi4yMy41MDAgPiAxOTIuMS4yLjI1NC41MDA6IGlzYWttcDogcGhhc2UgMSBSIGlkZW50CitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMSBJIGlkZW50W0VdCitJUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMSBSIGlkZW50W0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgSSBvYWtsZXktcXVpY2tbRV0KK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHgxKSwgbGVuZ3RoIDEzMgorYXJwIHdoby1oYXMgMTkyLjEuMi4yNTQgdGVsbCAxOTIuMS4yLjIzCithcnAgcmVwbHkgMTkyLjEuMi4yNTQgaXMtYXQgMTA6MDA6MDA6ZGU6YWQ6YmEKK0lQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHgyKSwgbGVuZ3RoIDEzMgorSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogaXNha21wLW5hdC1rZWVwLWFsaXZlCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHgzKSwgbGVuZ3RoIDEzMgorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIFIgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgSSBvYWtsZXktcXVpY2tbRV0KK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weGY0ZGMwYWU1LHNlcT0weDQpLCBsZW5ndGggMTMyCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBpc2FrbXAtbmF0LWtlZXAtYWxpdmUKK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weGY0ZGMwYWU1LHNlcT0weDUpLCBsZW5ndGggMTMyCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg2KSwgbGVuZ3RoIDEzMgorYXJwIHdoby1oYXMgMTkyLjEuMi4yMyB0ZWxsIDE5Mi4xLjIuMjU0CithcnAgcmVwbHkgMTkyLjEuMi4yMyBpcy1hdCAxMDowMDowMDo2NDo2NDoyMworSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogaXNha21wLW5hdC1rZWVwLWFsaXZlCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg3KSwgbGVuZ3RoIDEzMgorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIFIgb2FrbGV5LXF1aWNrW0VdCitJUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg4KSwgbGVuZ3RoIDEzMgorYXJwIHdoby1oYXMgMTkyLjEuMi4yNTQgdGVsbCAxOTIuMS4yLjIzCithcnAgcmVwbHkgMTkyLjEuMi4yNTQgaXMtYXQgMTA6MDA6MDA6ZGU6YWQ6YmEKK0lQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQorSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIFIgaW5mW0VdCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXA0LnNoIGIvdGVzdHMvaXNha21wNC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdiZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaXNha21wNC5zaApAQCAtMCwwICsxLDEzIEBACisjIS9iaW4vc2gKKwordXVkZWNvZGUgaXNha21wNDUwMC5wdXUKKworZWNobyAtbiB0ZXN0IGlzYWttcDQuLi4KKy4uL3RjcGR1bXAgLXQgLW4gLUUgImZpbGUgZXNwLXNlY3JldHMudHh0IiAtciBpc2FrbXA0NTAwLnBjYXAgPmlzYWttcDQubmV3CitpZiBkaWZmIGlzYWttcDQubmV3IGlzYWttcDQub3V0Cit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXA0NTAwLnBjYXAgYi90ZXN0cy9pc2FrbXA0NTAwLnBjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmNWFiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2lzYWttcDQ1MDAucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXA0NTAwLnB1dSBiL3Rlc3RzL2lzYWttcDQ1MDAucHV1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTVkY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pc2FrbXA0NTAwLnB1dQpAQCAtMCwwICsxLDE1NSBAQAorYmVnaW4gNjQ0IGlzYWttcDQ1MDAucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYGBgJmBgYCFgYGBgYGBgYGBgYGBgYGBKYGBgYCpAYGBgL19fX19fXworTV9RYGBgLVpNTkBAJmBgJChgYDgkYGAkMGBgIz5LO0tgYDArXmBgYGBgYGBgUGAkIiVQYGBgYGBgYGBgYAorTSpAYGBgIkhgYGBgMGBgIz5LO0gwYGAhRDkiLCghQGAhImBgJiFgYCIkYGBgOSYwQ1BgJCIlUWBgYC1aTQorTU5MYCFgT1hgYGBgYGBgYGBgJFghYGAhLmAwYGAkYGBgOSYwQyRgYGBXSlZaImAhJWBgJWBgYCFgYCNcMQorTU05N2BgMCteUGAkIiVQJ1RgPzAhKyk2TEdIR1IuKF4wTyFYYGBgYGBgYGBgYGAkMGBAYGBgYGBgYGBgIQorTSlgVGBgKTBgYGBgIWBgYGBgMGBgYChAYGAwYCRgUGBgKGBgIWBgImAiUGAhQGBQLiQoYCFgYDZgYEBgIQorTUBgLGBgWGAkYGA0I2BgYEBgMCRgYChgK2BgJmAjYFgwQGAkYCE4YCJgYCpgYFBgI0BgMGAhMCxgYCJgIgorTWAwYGBAYExgYDhgLCNBImBgMGAlQGAoYGBIYCNgYC5gIWBgImBgYGAoYCwhYGAiYCJQYCFAYFAuJChgIQorTWBgNmBgQGAhQGAsYGBYYCRgYCgtYGBgMDNUNUs0RiknNiUpVjs1ISUjMGBgJSpfKlVRLUhIPycpOlg6NgorTV8nPTdgMGAtYGBgNDJBLDxAMDwjNiQ1PDVSQ1IjSTUlK1BUYGAhMV1FIUZGNFEjKjtSUDdHOSg1NElVNgorTSMwYGAlLFVAMUQsVVdSJ1g/L1ZSXyZCVkkkQGBgYGA0MSg0NSsxQlZOXFQrWipBJkU3Rz1TYGBgYGBgYAorTWBgYGBMQGBgYCsoYGBgYDBgYCM+SztIMGBgIUQ5IiwoYCQ0YGAqMGBgJGBgMCEmVSw8YCFgQT9gYDArXgorTWA/MCFdYCIwOCUuPkI/KFhDWSJcJ0BJVC03U0NUOjJfYDFgImBgYGBgYGBgYGAiKCMwYGAtYGBgYGAkYAorTWBgYCFgYGBgKmBgIWBgJGBgYGBAYGAkYGAoYCtgYCZgI2BYMEBgJGAhOGAiYGAmYGBQYCNAYDBgITBUYAorTWAhIS8xNk0yOEQ9ODRHOU00JDQtYGBgNEtcSzckVkJBXDxFS0FJO1w9VTwhYGBgYGAhMSokUVIhIVAtOAorTTE1UTcqLyguRTQ0T2BgYGBgYGBgYGAhJmAwYGAxQCRgYCFgYGAmMUQoUWBgYC1aTU5AQGAxMGAhLmBgYAorTTBgYF8kOzY9UGAkIl9MYCFgQTwhXWAnVGAyMDZMOVopXENCL0QrUD4iRzBVPy4vMUkrXCQkYChgYGBgYAorTWBgYGBgMVAqYGAjJE1dTidYNEUmQUVNVCo3KFVBKV0/WjpNYFJXPlRQUlBSLzJWLVVeLU8nU1Q3LDlLNworTUNRUUZRYCNeMi9QUDBHXkBdUUhSPTkhWTc/L0VMJ08oXEwoSScjNTFWNk4xPykxSis2UC1BNiZUMFlAIgorTS1LSlssX1dQQytXJUgnS1NWPkpfKFcjM2AzQTQmQV40USpUXjNRKjInXk0jOVtYSFctSVZXTy4jSj1NPworTURIVFg/L0RTI11DREpHOz9CQ19FOiRXOjNBRF1OOSshVSdbKzZVVS5gLCk0XiZBU0gyU09cQ1UuPTIhIworTUgnPFRANTRMOS0kWC81WlEqJl87OUJGNUUzUTclYGBgJSY7Nl1DKUk+VVkoRkkqMzk1Pkk/WkA0YGBgNAorTTtPWDJcJEtZIz9PL0w1VVFOJCZbR0BgYGAhMSRdMT9AL1suIV5gXiQrMTRYUy9eTGBgYGBgYGBgYGAhJgorTWAwYGAxQCRgYCFgYGAtWk1OQWBgYCYxRChQQGAxMGAhLmBgYDBgIWAkOzI9UGAkIiVcYCFgT1ghXWAnVAorTWAyMCFVWVopXENCL0QrUD4iRzBVPy4vMUkrXCQkYChgYGBgYGBgYGBgMVAqYGAjJFlZST9eI1ZbJVdPKgorTSssP1tYS1VcIllWRlowVUNNT0EnNlk6QzkzIzReTSYvKSczIiwxUS8iJjcqIkQwXzwxU1gjQCJLUlpEVgorTVxfWENCNE85WE5TMCJfTzgtJ1tDJkFHNU87R15HX04qIz80LCJPQSc/Uj48IldONjhRKEg8MUVPTk0zIQorTVMzPV1VXU1SWig0VUJNXSY6SVxLVyYzWDtMUSVNW0IwOiwvIl1EVE0xXko4KzhDRVNFJzZKRUZDRSwsJAorTT8kVzVQLF41PTFLMUFUQFlYMEotOSUvRV1gTVkmPCVDPypZKktcJzVYIzJCNU9ENitGVEdKKV5WMjk5IworTSo+SDYlYGBgJSZRXjdaUkoxNiRUJTw2VUpFPD9JUyQ0YGBgNC45LCRVMF5dMyovOydBRVpdXCQ+O1BgYAorTWAhMU5fQStQMk9ELV5cXlE3NyZYMDtOPmBgYGBgYGBgYGAhUmAwYGA8QCRgYCFgYGAmMUQoUWBgYC1aTQorTU5AQGAxMGAhOWBgYDBgYF8kOzVRUGAkIl9MYCFgQTwxRSEmNGA1IVJIMGBgYGAiPkI/KFhDWSJcJ0BJVAorTS03U0NUOjJfITFgImAwYGBgYGBgYGAlJEgiMUBXYFpUVzo0JidaPSFLKmBJUlROTEs6M0ovXiRERC9CNAorTT5RLEY/TTVgMz0oPyFIR1ckL00pYFxXOFovJ0ZYSzYkISg5ITdCTDkhQFFWPSheRTc+PFwpUjhFVkUzRgorTTZgLk9eOjJGISg+TEQ3JTcxTl1gTEE/QiEvITBcKkgyIllPSjBdX1c5IzlESllaKS5NLy47KzhBP0xbTworTWBKLSdIVl8wKicmJl5QXDg6JCdJXiIxM1NOXVZUJTVcOE84O1AyVlY9YCsmOSs0XSdNSCsvJjonUFIhSAorTTRPIyxHSSsxPSsqTVJOIjUuLThEJiQxNik8TyFgU0JaTVxBS0MmUF9YPDtTXUAvKTEpWVwuJldPWTdcSAorTTFWXFA3Lk5MPDkyPzE4WCxGKzpMYF5eRiNPMVk1MDVRMEg4NURMQzlERylCL1Y8XlxcJVdTNVRPO0UkOgorTSIxJEZgREcqPVI8P1pRWVROMVBeNFEjMV0uNjBHSzwuQUs9X1hPTV48SlNCIVA5XDpDMlgzUUlgTF1EYAorTWBgYGBgYGBgYCVIIWBgITpgMGBgJGBgYFdKVlokYGBgOSYwQyJgISVgYCUsYGAhYGAkYDFNKEdgYDAoNworTVBgJCJfQSY0JDkwIS4sPyRgYGBgYClaKVxDQi9EK1A+IkcwVT8uLzFJK1wlJGAoIWBgYGBgYGBgYDJTIgorTThaNV0rPF4tTThROVAmWDteJUpOMl4qTllDMSJBWiU0Si1QSU1aTTYxMVc8RCVdNkVUOURVQkY9VEguMAorTVFRU01IU1tGRjs9RT8kSEpQMVoyN0gwO0RSTmBAUUQrPS1ZIyY+QTpaJCo2SUJXQy4zLjkwMzcpPEI7OworTTBVJk0rSDlbJj1LIyNHWCsrQ1hHWChMOzdFXilCXFErJ18nTjUvNSwiWz9QOTZLJy0oNDsyNVwjRCVNLworTVZJTjZDIzcnUTowUEJGM1w9MSgkT0RBWigmOiQoKD1WMSxTVE0vTUlCKF1DO143VD1SJColWD8rTVRYXgorTUIqWCU2REowOUJDKFhVQCgsNElVMVFdTVZfOyVTQDhZOTZNQixXMy8hI001QlMpSkdBNSQoSjRINVdAOAorTTwqQjpHPDtRXj5MYFtBRFNIYEsmMCpeWzYpPiIpJEUzOyI0O1U9IkkiLDIqYDFUUF89NSslQiJJSTM+KAorTSdAYGBgYGBgYGBgYFZAJGBgLUghYGBgMGBgIUQ5IiwwYGAjPks7SChgJDRgYDxQYGAkYGAvUSZVIjxgIQorTWBPW2BgMCg3JDkwMUVgJlhXM0BgYGBgYEdIR1IuKF4wTyFYKj0jNVxYXSZET1BAMChgJis/SEUnYGBgIQorTUsnJ0kjW0gkPF8iPFlFR0cyKTgpITk3UEYlMC1fXDheWChWMVsoPSUrVUFNSjlBKDEvISxbNitXTTMyQworTSkqMElHOkVNL0MpU0YkUCQ9JFAiWV9SLkAvTUNRT1M7XFU+NFlRNVNBT2AxMClcODQmST9dLFIyLj81TQorTVovWV5ZIiMqJSswLjw5S1goL1okJyZNLC0pLzJJN1VeLCFHLCpHIUVfTy5EOzdGXztEXlYjJiYqKFIuKworTUg7WVNJJzFASThHViUrXCcqNiwxKDhgOEQoVlVQWywoUj9QUTcjLDVXUVkzW0hUK0lGRiIzPy4rOygqTQorTV8/QztKUSNdTyc5NTIyKlpPNz4nVEVEWUxMQWAqTCQ4KFhKJCFUPl9IWVM/Rz1XUjExRSgkLTAyMUZNUworTUJbTlhBSl5DUVZHTzg3W0JAXkk2VEhIVy0lWjglUFRIJkJDT14uW0BLX05TOFJWVEU3Q0UmTUFdNkNAPgorTUVESURNJlReLjQxP0YoXFgkWi01WzU0NyRIQz0nKlw+OGBgIls5LklIVCkrWyxeTFo/XzYoNklcTDMyIworTUYtSk03VSIuTDQ/WC84PUcqS0ZBPD5USEotNjIyVyw7SmBJVzJeTUxCST9fTzw8RUMpIVYxXjdcVSxZSworTTcnRSZSX10uYEMjJCM7WF1FXTFTWEAwOTJdWkUoQEMtMk0hWkFXLiMlTF5KW14nMTNCWSZTR0BgYGBgYAorTWBgYGBgKEghYGAiKmAwYGAkYGBgV0pWWiRgYGA5JjBDImAhJWBgJVxgYCFgYCRgMU0lR2BgMCg3UGAkIgorTV9BJjQkOTAhOixLTmBgYGBgKVopXENCL0QrUD4iRzBVPy4vMUkrXCgkImAhQldaKTFQYGBgNVJNOiZONAorTVExO1cxOSs7NzclSkUsLEgnOCZGNklUSk09UjVPPktMMSVbXSNFL0xKIyYuL1dGSmAjLDNDIUg9SV8nKgorTTM0LylfRSspKGAhQSZXMDAqVFwiOU85SlgwTiI+JCMnKFpMPCQnXFA9R0hCLjA6XEFYVC8hXl4qPFAyIQorTTwhQVw+JVUuJzUjJzJJWDxROzkrSTZHUlZSV18rVCxTPjo3LzJLWiQlXjNXOyVSNFsmMlQ+Jz8yKEBGRgorTSNULz0rMk9bP1E0LihcQFE7XTNWPUw1UTJYRkcpXkUpMEo6MUFYYEo0JUUzX1ldXjY9JyFSLUVOWSU5IworTTMhWEQ6NUs/L1YmLiEmWCM+SV8kOTZZO1BfITUnXTxHKEA8Okk5NF1bIiUxI0YzTVkqVTFWJVdRVkwxXworTVJUKlokXEtFVlc+MDcwKEQzTiMkNDchQVpeVkNXLT9JP0pUMkFMNVlPV0JPNVtEISJPVik0NihGSyk5IgorTSRDNDBHTko3KkEsU0U2JTZBKDQ+S1BFKC0kKT1MNj0yVlFMTz5ZMTJOOFFCSDNWJSg5MC5cNVlMYFIsTworTTFAYGBgYGBgYGBgYDhAYGBgJihgYGBgMGBgIUQ5IiwwYGAjPks7SChgJDRgYCUwYGAkYGAvUSZWQDxgIQorTWBPW2BgMCg3JDkwMUVgIWBLUTxgYGBgYEdIR1IuKF4wTyFYKj0jNVxYXSZET1BAMChgJis/SEUnYGBgYAorTS0iNFssODguOi5SJCU6MVM2Sy9YPEVIXVlaSCkuMjJEYEBgYGBgYGBgYGBgS0BgYGAqWGBgYGAwYGAhRAorTTkiLDBgYCM+SztIKGAkNGBgKiJKTWBgYC9RJStAPGAhYE9bYGAwKDckOTAxRWAiLGBgI1RXYEtFYGBgYAorTWA/U0QiPDExLVhfPUZCWDdKJl0nL0NbQj47QkEyM1giXkE7KEJBL0g7OF9cMCdVLEVATSY7Kz1SJipMWQorTUFGLk5UNjxQWFIzMSFaXE1YQFc0Pi8qSi5TTFtVUjIpK0heQTYjNTwzOFI7IUZZXDpBVl82WlYpRlEyIQorTTFUXEw6YEdQSzZVP18/VFZIU0tbNihXU0Y/USJYRjVLLzBVLEEuWStEXFJQXUcoYGBgYGBgYGBgYCJIYAorTWBgYEpgYGBgJGBgYFdKVlokYGBgOSYwQyJgOGBgMEBgIUAwYGAxYGBgJjFEKFxgIWBBPGBgYGBgYGAjYAorTWAwK15gYGBgYGBgYGBgYEpgYGBgKkBgYGAhYGBgJjFEKFFgYGAtWk1OQEAmYGAkKGBgOCRgYCgwYGAjPgorTUs7S2BgMCteJGBgYDkmMENQYCQiJVBgYGBgYGBgYGBgQkAkYGAoSCFgYGAwYGAjPks7SDBgYCFEOSIsKAorTWAkNGBgN1BgYCRgYDAhJlQ2PGAhYEE/YGAwK14kOTAxRWAlSFJOWGBgYGBgR0hHUi4oXjBPIVgqPSM1XAorTVhdJkRPUEAwKGAmKz9IRSdgYGAhNypVSDpZMyUlTz0lRE1NPTw2SjRQUkA9QDo5OkcySlVXKTZdWk5RJAorTTdPVC40XlJILDhYXz46SGAsUS4sJkFWR1w8SS0wXEdeNExEQGAmJDs9IWBLM1ApRl1GS0EiWClYMCw8QworTUpRUDA/UyFWPkIoWSFLUidDMFwnW1hJUyEoJVAmJ1FYNzRYPTQsPSpHQVMlTURORTo/KzsrP1xPMFMtWQorTUk8XSpPSDA3WS89TDcpM0w5KzFYPV0oQiI6OC8wXVRNKl9NXyUwWENSIyVPVS85VlE3JStCOjxHWjRFIgorTUlJJidAIkkwNjUvX0dXWTlUPCcoVjZbRDVELSwnQjFJNk1cXzg4WCQ7QC1aR1wxRTtFTyNcJTQ/VVI8QgorTSFRSkVFM1dMKDUkLjkuV0RLNSc4Nz8nOlEnXyswS0gzUk43Oz1ZIT1gQjEuWCwxMTwmJ0tbOi88VV5FXgorTUsxKiZRN0ZfPipdN04wJCpfOEUxOEI6TEVEKDItMSI+Wkk8SiRTLjU4NTokQTFaTyI0QFQwRVZROVUrOworTSZSXVtFJSpZQyYqQS84NEFFYFtRN0ZQIyhSXSZgYGBgYGBgYGBgIUJgYGBgOEBgYGAhYGBgJjFEKFFgYAorTWAtWk1OQEBgMTBgYDVgYGAwYGBfJDs6IVBgJCJfTGAhYEE8MUUhJjRgJCJPJVBgYGBgIj5CPyhYQ1kiXAorTSdASVQtN1NDVDoyXyIhYEBgOE1eQjQ8YGBgYFQpM0xRQUBZSFsoMDVJJy06TF9BUjZDV0dKQERZKSowIgorTWBgYGBgYGBgYGAiTmBgYGBLQGBgYCFgYGAmMUQoUWBgYC1aTU5AQGAxMGBgSCpKVWBgYF8kNE5gUGAkIgorTV9MYCFgQTwxRSEmNGAoUGBgLzM8Ik40YGBgYCI7NV9dXzM6Qy5PTThDPy45XyQrQjk7S1UvUitEIlVeLQorTUxHQik+IjQwWkNNVzorXkE0JVVJMVkpXC5PNEJdYDQ0VCgyWFNcUz0yW1tbWC42QS1QQ0RaUCozWEZBRAorTTI5ND4rVzpNJSUrXGApP1hQI1s6Nl1OSEc+IztGRkYtUk1BQTdEIktRLSZPWDxFKEdOUlMvNiolUDg/QgorTT4zWjVTJ0NCWUMiNzQwYGBgYGBgYGBgYCpQYGBgIkxgYGBgMGBgIUQ5IiwwYGAjPks7SChgJDRgYCFUYAorTWAkYGAvUSZWTixgIWBPW2BgMCg3JDkwMUVgYCk2KU9fYGBgYGBgYGBgYCJOYGBgYEtAYGBgIWBgYCYxRAorTShRYGBgLVpNTkBAYDEwYGBIKkpWYGBgXyQ0TV9QYCQiX0xgIWBBPDFFISY0YChQYGAvMzwiTjRgYGBgIworTTdEIktRLSZPWDxFKEdOUlMvNiolUDZNLURbTUpHVSlSSVtFQTMpTEQvV146UzJWITFQPDJZLzBJOl9gJQorTUYzLWBMU0EzJlFNOEREXlw+MUYwI0YkXklAMVY1RT4uYCohSD1aPygmKiwuTVNdRTRII1ArPEpCL0M9UQorTVMyNklCTj4yIl5NTUc/JUBZMypMJUQnNyQ+TExPQSxIVUVCM0lCOzg3LFw6LTBgYGBgYGBgYGBgQkAkYAorTWAoSCFgYGAwYGAjPks7SDBgYCFEOSIsKGAkNGBgN1BgYCRgYDAhJlQ2PGAhYEE/YGAwK14kOTAxRWAlSAorTVJOWGBgYGBgR0hHUi4oXjBPIVgqPSM1XFhdJkRPUEAwKGAmKz9IRSdgYGAhNypVSDpZMyUlTz0lRE1NPQorTTw2SjRQUkA9QDo5OkcySlVXKTZdWk5RJDdPVC40XlJILDhYXz46SGAsUS4sJkFWR1w8SS0wXEdeNExEQAorTWAmJDs9IWBLM1ApRl1GS0EiWClYMCw8Q0pRUDA/UyFWPkIoWSFLUidDMFwnW1hJUyEoJVAmJ1FYNzRYPQorTTQsPSpHQVMlTURORTo/KzsrP1xPMFMtWUk8XSpPSDA3WS89TDcpM0w5KzFYPV0oQiI6OC8wXVRNKl9NXworTSUwWENSIyVPVS85VlE3JStCOjxHWjRFIklJJidAIkkwNjUvX0dXWTlUPCcoVjZbRDVELSwnQjFJNk1cXworTTg4WCQ7QC1aR1wxRTtFTyNcJTQ/VVI8QiFRSkVFM1dMKDUkLjkuV0RLNSc4Nz8nOlEnXyswS0gzUk43OworTT1ZIT1gQjEuWCwxMTwmJ0tbOi88VV5FXksxKiZRN0ZfPipdN04wJCpfOEUxOEI6TEVEKDItMSI+Wkk8SgorTSRTLjU4NTokQTFaTyI0QFQwRVZROVUrOyZSXVtFJSpZQyYqQS84NEFFYFtRN0ZQIyhSXSZgYGBgYGBgYAorTWBgIUJgYGBgOEBgYGAhYGBgJjFEKFFgYGAtWk1OQEBgMTBgYDVgYGAwYGBfJDs6IVBgJCJfTGAhYEE8MQorTUUhJjRgJCJPJVBgYGBgIj5CPyhYQ1kiXCdASVQtN1NDVDoyXyIhYEBgOE1eQjQ8YGBgYFQpM0xRQUBZSAorTVsoMDVJJy06TF9BUjZDV0dKQERZKSowImBgYGBgYGBgYGAiTmBgYGBLQGBgYCFgYGAmMUQoUWBgYC1aTQorTU5AQGAxMGBgSCpKV2BgYF8kNE1eUGAkIl9MYCFgQTwxRSEmNGAoUGBgLzM8Ik40YGBgYCQiXk1NRz8lQAorTVkzKkwlRCc3JD5MTE9IRlhILDZCMzwnTS9dQV9VVCVYLk1QO0ZgWlRAPVw2MipdVycvWTVAMSwoOCtgVworTVRJWihDOzxNXiUpRy45UiROMSk2Sl83Wl8hR1QlXFVNUTpYUVBNOF0+OEcnVkM8IisnVk06JEsvPTpWSQorTUQjOktCXi9HJEJCQDorPVRTVlxTKVQ1LUUjVU9CS1oiRTVfLCVQYGBgYGBgYGBgYCpQYGBgIkxgYGBgMAorTWBgIUQ5IiwwYGAjPks7SChgJDRgYCFUYGAkYGAvUSZWTixgIWBPW2BgMCg3JDkwMUVgYCk2KU9fYGBgYAorTWBgYGBgYCJOYGBgYEtAYGBgIWBgYCYxRChRYGBgLVpNTkBAYDEwYGBIKkpYYGBgXyQ0TV1QYCQiX0xgIQorTWBBPDFFISY0YChQYGAvMzwiTjRgYGBgJUQjOktCXi9HJEJCQDorPVRTVlxTKVhaPlgsWUFPSS9XMV9CUworTTc6TiVNTz8zSisxXEk9Pk8tPFJeSElaVS0tIVgmNmAkXVUjKkpAO1JANjQlU0tRLkIvXl5JR0I8Jjg4VworTVs4KUZTO0g2JTQpTTlOVl1cI1ErM15eJy4sUFFZNzxTQzZPRzg+MzZOMUdCREQrSE1SXUQ4VSlHKE9KXQorTU1YIT48JDMnVTBgYGBgYGBgYGBgS0BgYGAqWGBgYGAwYGAhRDkiLDBgYCM+SztIKGAkNGBgKiJKTjBgYAorTS9RJSs/LGAhYE9bYGAwKDckOTAxRWAiLGBgI1RXYEtFYGBgYCFIVUtZVidEVUtEOVhJKSJaKzxPOSYsNQorTV9YMVInYDFAPkA+Mzo5NjM4XklIXzJcOENWRS1CTDImNDMsM1pBWTMnMUAzWjorXClYU1hEU09dTCxAPworTUNPTDY8STcuKl1MI04+QF0rJitYXiNIKEQuWD5COyk8JVtFNDpTOiMuRDcwOiEjPDhRXFFaRkhgPEMmXgorTUcnYEpRMF9GIktcTD9GXVxIVUckOEcsYGBgYGBgYGBgYCJIYGBgYEpgYGBgJGBgYDkmMEMkYGBgV0pWWgorTSJgOGBgMEBgIUAwYGAxYGBgLVpNTkxgIWBPWGBgYGBgYGAjYGAwKDdgYGBgYGBgYGBgYEpgYGBgKkBgYAorTWAhYGBgLVpNTkFgYGAmMUQoUEAmYGAkKGBgOCRgYCgwYGAhRDkiL2BgMCg3JGBgYFdKVlpQYCQiX0BgYAorTWBgYGBgYGBgKlBgYGAiTGBgYGAwYGAhRDkiLDBgYCM+SztIKGAkNGBgIVRgYCRgYC9RJlZOLGAhYE9bYAorTWAwKDckOTAxRWBgKTYpT19gYGBgYGBgYGBgIk5gYGBgS0BgYGAhYGBgJjFEKFFgYGAtWk1OQEBgMTBgYAorTUgqSlpgYGBfJDRNW1BgJCJfTGAhYEE8MUUhJjRgKFBgYC8zPCJONGBgYGAnJC1RQydTJ0o6QCFSLDtaPAorTTwiSyUjU1QhLThcTzI7RioqUi85WiVIQVpgMiNLUUlXKjknSEk5QzA2N1pLLUdeWEFMXk8wSTdaLydIKAorTTwuYDdQPFFHMzw8PzdSN1ohITNNUTFNWTVCPUY5TiIsSkBMLmBdP00hVTUpVEJgPCJdVzVDWyxgW1knMgorTVQ2XE4kQ0RANiciQ1AkM0ZgQUVFUj5AL1AnL0UwQGBgYGBgYGBgYGBCQCRgYChIIWBgYDBgYCM+SztIMAorTWBgIUQ5IiwoYCQ0YGA3UGBgJGBgMCEmVDY8YCFgQT9gYDArXiQ5MDFFYCVIUk5YYGBgYGBHSEdSLiheMAorTU8hWCo9IzVcWF0mRE9QQDAoYCYrP0hFJ2BgYCE3KlVIOlkzJSVPPSVETU09PDZKNFBSQD1AOjk6RzJKVQorTVcpNl1aTlEkN09ULjReUkgsOFhfPjpIYCxRLiwmQVZHXDxJLTBcR140TERAYCYkOz0hYEszUClGXUZLQQorTSJYKVgwLDxDSlFQMD9TIVY+QihZIUtSJ0MwXCdbWElTISglUCYnUVg3NFg9NCw9KkdBUyVNRE5FOj8rOworTSs/XE8wUy1ZSTxdKk9IMDdZLz1MNykzTDkrMVg9XShCIjo4LzBdVE0qX01fJTBYQ1IjJU9VLzlWUTclKworTUI6PEdaNEUiSUkmJ0AiSTA2NS9fR1dZOVQ8JyhWNltENUQtLCdCMUk2TVxfODhYJDtALVpHXDFFO0VPIworTVwlND9VUjxCIVFKRUUzV0woNSQuOS5XREs1Jzg3Pyc6USdfKzBLSDNSTjc7PVkhPWBCMS5YLDExPCYnSworTVs6LzxVXkVeSzEqJlE3Rl8+Kl03TjAkKl84RTE4QjpMRUQoMi0xIj5aSTxKJFMuNTg1OiRBMVpPIjRAVAorTTBFVlE5VSs7JlJdW0UlKllDJipBLzg0QUVgW1E3RlAjKFJdJmBgYGBgYGBgYGAiTmBgYGBLQGBgYCFgYAorTWAmMUQoUWBgYC1aTU5AQGAxMGBgSCpKW2BgYF8kNE1aUGAkIl9MYCFgQTwxRSEmNGAoUGBgLzM8Ik40YAorTWBgYChDWyxgW1knMlQ2XE4kQ0RANiciQ1AqQENCTkM5ISwsSEoqSyMoUjhONT8qJU4oPFhYKz5HVkorRgorTSNNL0dfRlAmTkFOTVtXQGApWTlcXFo/RjRTWCUnRS5eMkJDUFw5KyEvYDI1UEslK0cnVUAkJjErPUAlKAorTSM5UlZeVSJCOC01LEVYSjAtUVpUTE9KL0xeRlwpLkJDQCsrWFFHT0w4SkNfYEw7Jz1gYGBgYGBgYGBgYAorTSpAYGBgIkhgYGBgMGBgIz5LO0gwYGAhRDkiLCghQGAhImBgJiFgYCEkYGBgOSYwQ1BgJCIlUGBgYGBgYAorTWAsYCFgT1hgYGBgYGBgYGBgIkhgYGBgSmBgYGAkYGBgOSYwQyRgYGBXSlZaImA4YGAwQGAhQDBgYEFgYAorTWAtWk1OTGAhYE9YMGBgIUQ5Ii9gYDAoN2BgYGBgYGBgYGBgS2BgYGAqUGBgYCFgYGAmMUQoUWBgYC1aTQorTU5AQGAxMGBgJzBgYDBgYF8kOzpYUGAkIl9MYCFgQTwxRSEmNGBgRThGX1xgYGBgYGBgYGBgJ0hgYGAhWgorTWBgYGAkYGBgV0pWWiRgYGA5JjBDImAhJWBgIUxgYCFgYCRgMU02R2BgMCg3UGAkIl9BJjQkOTBgNixHIworTWBgYGBgKVopXENCL0QrUD4iRzBVPy4vMUkrXCgkYDQhYEtXJjNQYGBgJFNfVFxeMShcPyhJVkNRREFdSgorQzIwU0ZALl48Jl0yJzFEKF8zRkhIS1c3UEtRSichIS4wMVFWPj9dJDlLX0VOYE48YAorYAorZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9pc2lzLWluZmluaXRlLWxvb3AucGNhcCBiL3Rlc3RzL2lzaXMtaW5maW5pdGUtbG9vcC5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ODJmYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pc2lzLWluZmluaXRlLWxvb3AucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9sZHAtaW5maW5pdGUtbG9vcC5wY2FwIGIvdGVzdHMvbGRwLWluZmluaXRlLWxvb3AucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMxZjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGRwLWluZmluaXRlLWxvb3AucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9sbXAubmV3IGIvdGVzdHMvbG1wLm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM3YmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbG1wLm5ldwpAQCAtMCwwICsxLDE5MSBAQAorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTMwLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogODQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBCZWdpbiBWZXJpZnksIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDU2CisJICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCisJICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkgIFZlcmlmeSBCZWdpbiBPYmplY3QgKDgpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25lZ290aWFibGVdLCBsZW5ndGg6IDI0CisJICAgIEZsYWdzOiBub25lCisJICAgIFZlcmlmeSBJbnRlcnZhbDogMjAKKwkgICAgRGF0YSBsaW5rczogMzAKKwkgICAgRW5jb2RpbmcgdHlwZTogTGFtYmRhIChwaG90b25pYykKKwkgICAgVmVyaWZ5IFRyYW5wb3J0IE1lY2hhbmlzbTogMzI3NjggKDB4ODAwMCkgCisJICAgIFRyYW5zbWlzc2lvbiBSYXRlOiAxMDAuMDAwIE1icHMKKwkgICAgV2F2ZWxlbmd0aDogOAorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTMxLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTYpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBIZWxsbywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjgKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDEgKDB4MDAwMDAwMDEpCisJICBIZWxsbyBPYmplY3QgKDcpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAxMgorCSAgICBUeFNlcU51bTogNTAKKwkgICAgUmN2U2VxTnVtOiA2MAorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTMyLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogODQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBDb25maWcgTkFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNTYKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDEgKDB4MDAwMDAwMDEpCisJICBOb2RlIElEIE9iamVjdCAoMiksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE5vZGUgSUQ6IDEwLjAuNTAuMSAoMHgwYTAwMzIwMSkKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBSZW1vdGUgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgQ29udHJvbCBDaGFubmVsIElEOiAyICgweDAwMDAwMDAyKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQorCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBSZW1vdGUgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTm9kZSBJRDogMTAuMC41MC4yICgweDBhMDAzMjAyKQorCSAgQ29uZmlndXJhdGlvbiBPYmplY3QgKDYpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSGVsbG8gSW50ZXJ2YWw6IDUKKwkgICAgSGVsbG8gRGVhZCBJbnRlcnZhbDogMTUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMywgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDc2KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQ29uZmlnIEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNDgKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDEgKDB4MDAwMDAwMDEpCisJICBOb2RlIElEIE9iamVjdCAoMiksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE5vZGUgSUQ6IDEwLjAuNTAuMSAoMHgwYTAwMzIwMSkKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBSZW1vdGUgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgQ29udHJvbCBDaGFubmVsIElEOiAyICgweDAwMDAwMDAyKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQorCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBSZW1vdGUgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTm9kZSBJRDogMTAuMC41MC4yICgweDBhMDAzMjAyKQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM0LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjgpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBDb25maWcsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQwCisJICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCisJICBOb2RlIElEIE9iamVjdCAoMiksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE5vZGUgSUQ6IDEwLjAuNTAuMSAoMHgwYTAwMzIwMSkKKwkgIENvbmZpZ3VyYXRpb24gT2JqZWN0ICg2KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIEhlbGxvIEludGVydmFsOiA1CisJICAgIEhlbGxvIERlYWQgSW50ZXJ2YWw6IDE1CitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzUsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA0NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IExpbmsgU3VtbWFyeSBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDE2CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDEgKDB4MDAwMDAwMDEpCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzYsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiAxMjQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBMaW5rIFN1bW1hcnkgTkFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogOTYKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMSAoMHgwMDAwMDAwMSkKKwkgIEVycm9yIENvZGUgT2JqZWN0ICgyMCksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgRXJyb3IgQ29kZTogCisJCVVuYWNjZXB0YWJsZSBub24tbmVnb3RpYWJsZSBMSU5LX1NVTU1BUlkgcGFyYW1ldGVycywgCisJCVJlbmVnb3RpYXRlIExJTktfU1VNTUFSWSBwYXJhbWV0ZXJzLCAKKwkJSW52YWxpZCBEQVRBLUxJTksgT2JqZWN0LCAKKwkJVW5rbm93biBURS1MSU5LIE9iamVjdCBjLXR5cGUsIAorCQlVbmtub3duIERBVEEtTElOSyBPYmplY3QgYy10eXBlCisJICBEYXRhIExpbmsgT2JqZWN0ICgxMiksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDM2CisJICAgIEZsYWdzOiBbbm9uZV0KKwkgICAgTG9jYWwgSW50ZXJmYWNlIElEOiAxOTIuMTY4LjEuMSAoMHhjMGE4MDEwMSkgCQkJCisJICAgIFJlbW90ZSBJbnRlcmZhY2UgSUQ6IDE5Mi4xNjguMS4yICgweGMwYTgwMTAyKQorCSAgICBTdWJvYmplY3QsIFR5cGU6IEludGVyZmFjZSBTd2l0Y2hpbmcgVHlwZSAoMSksIExlbmd0aDogMTIKKwkJICAgIFN3aXRjaGluZyBUeXBlOiBMYW1iZGEtU3dpdGNoIENhcGFibGUgKDE1MCkKKwkJICAgIEVuY29kaW5nIFR5cGU6IExhbWJkYSAocGhvdG9uaWMpICg4KQorCQkgICAgTWluIFJlc2VydmFibGUgQmFuZHdpZHRoOiAxMDAuMDAwIE1icHMKKwkJICAgIE1heCBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTAwLjAwMCBNYnBzCisJICAgIFN1Ym9iamVjdCwgVHlwZTogV2F2ZWxlbmd0aCAoMiksIExlbmd0aDogOAorCQkgICAgV2F2ZWxlbmd0aDogNgorCSAgRGF0YSBMaW5rIE9iamVjdCAoMTIpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAzNgorCSAgICBGbGFnczogW25vbmVdCisJICAgIExvY2FsIEludGVyZmFjZSBJRDogMTAuMS4xLjEgKDB4MGEwMTAxMDEpIAkJCQorCSAgICBSZW1vdGUgSW50ZXJmYWNlIElEOiAxMC4xLjEuMiAoMHgwYTAxMDEwMikKKwkgICAgU3Vib2JqZWN0LCBUeXBlOiBJbnRlcmZhY2UgU3dpdGNoaW5nIFR5cGUgKDEpLCBMZW5ndGg6IDEyCisJCSAgICBTd2l0Y2hpbmcgVHlwZTogTGFtYmRhLVN3aXRjaCBDYXBhYmxlICgxNTApCisJCSAgICBFbmNvZGluZyBUeXBlOiBBTlNJL0VUU0kgUERIICgzKQorCQkgICAgTWluIFJlc2VydmFibGUgQmFuZHdpZHRoOiAxMjM0NzM2NzY4LjAwMCBNYnBzCisJCSAgICBNYXggUmVzZXJ2YWJsZSBCYW5kd2lkdGg6IDEyOTA2OTMzNzYuMDAwIE1icHMKKwkgICAgU3Vib2JqZWN0LCBUeXBlOiBXYXZlbGVuZ3RoICgyKSwgTGVuZ3RoOiA4CisJCSAgICBXYXZlbGVuZ3RoOiAzNTMKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzNywgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDY4KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQmVnaW4gVmVyaWZ5IEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNDAKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDEgKDB4MDAwMDAwMDEpCisJICBWZXJpZnkgQmVnaW4gQUNLIE9iamVjdCAoOSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgRGVhZCBJbnRlcnZhbDogNTAgCQkJCQorCSAgICBWZXJpZnkgVHJhbnNwb3J0IFJlc3BvbnNlOiAxMDAKKwkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgSUQ6IDUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzOCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDYwKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQmVnaW4gVmVyaWZ5IE5BQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDMyCisJICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSVB2NCBMaW5rIElEOiAxMC4wLjAuMCAoMHgwYTAwMDAwMCkKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKKwkgIEVycm9yIENvZGUgT2JqZWN0ICgyMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgRXJyb3IgQ29kZTogCisJCUxpbmsgVmVyaWZpY2F0aW9uIFByb2NlZHVyZSBOb3Qgc3VwcG9ydGVkLCAKKwkJVW53aWxsaW5nIHRvIHZlcmlmeSwgCisJCVVuc3VwcG9ydGVkIHZlcmlmaWNhdGlvbiB0cmFuc3BvcnQgbWVjaGFuaXNtCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzksIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IEVuZCBWZXJpZnksIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI0CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMyAoMHgwMDAwMDAwMykKKwkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgSUQ6IDUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0MCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDUyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogRW5kIFZlcmlmeSBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI0CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCisJICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgVmVyaWZ5IElEOiA1CitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDEsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IFRlc3QsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI0CisJICBJbnRlcmZhY2UgSUQgT2JqZWN0ICg0KSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgVmVyaWZ5IElEOiA1CitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDIsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IFRlc3QgU3RhdHVzIEZhaWx1cmUsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI0CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMSAoMHgwMDAwMDAwMSkKKwkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgSUQ6IDUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0Mywgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDUyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogVGVzdCBTdGF0dXMgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQorCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIFZlcmlmeSBJRDogNQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ0LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNDQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cyBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDE2CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDUsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IENoYW5uZWwgU3RhdHVzIFJlcXVlc3QsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDM2CisJICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCisJICBDaGFubmVsIFN0YXR1cyBSZXF1ZXN0IE9iamVjdCAoMTQpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAxMgorCSAgICBJbnRlcmZhY2UgSUQ6IDIuMC4wLjAgKDB4MDIwMDAwMDApCisJICAgIEludGVyZmFjZSBJRDogMi4wLjAuMCAoMHgwMjAwMDAwMCkKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0Niwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDcyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQ2hhbm5lbCBTdGF0dXMsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQ0CisJICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCisJICBDaGFubmVsIFN0YXR1cyBPYmplY3QgKDEzKSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMjAKKwkgICAgSW50ZXJmYWNlIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCQkgICAgQWN0aXZlOiBBbGxvY2F0ZWQgKDEpCisJCSAgICBEaXJlY3Rpb246IFRyYW5zbWl0ICgxKQorCQkgICAgQ2hhbm5lbCBTdGF0dXM6IFNpZ25hbCBGYWlsICgzKQorCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKKwkJICAgIERpcmVjdGlvbjogUmVjZWl2ZSAoMCkKKwkJICAgIENoYW5uZWwgU3RhdHVzOiBTaWduYWwgRGVncmFkZWQgKDIpCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDcsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IENoYW5uZWwgU3RhdHVzIFJlc3BvbnNlLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAzNgorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQorCSAgQ2hhbm5lbCBTdGF0dXMgT2JqZWN0ICgxMyksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDIwCisJICAgIEludGVyZmFjZSBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkJICAgIEFjdGl2ZTogQWxsb2NhdGVkICgxKQorCQkgICAgRGlyZWN0aW9uOiBUcmFuc21pdCAoMSkKKwkJICAgIENoYW5uZWwgU3RhdHVzOiBTaWduYWwgRGVncmFkZWQgKDIpCisJICAgIEludGVyZmFjZSBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkJICAgIEFjdGl2ZTogQWxsb2NhdGVkICgxKQorCQkgICAgRGlyZWN0aW9uOiBUcmFuc21pdCAoMSkKKwkJICAgIENoYW5uZWwgU3RhdHVzOiBTaWduYWwgT2theSAoMSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2xtcC5vdXQgYi90ZXN0cy9sbXAub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMzdiY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sbXAub3V0CkBAIC0wLDAgKzEsMTkxIEBACitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA4NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IEJlZ2luIFZlcmlmeSwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNTYKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMyAoMHgwMDAwMDAwMykKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBSZW1vdGUgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCSAgVmVyaWZ5IEJlZ2luIE9iamVjdCAoOCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbmVnb3RpYWJsZV0sIGxlbmd0aDogMjQKKwkgICAgRmxhZ3M6IG5vbmUKKwkgICAgVmVyaWZ5IEludGVydmFsOiAyMAorCSAgICBEYXRhIGxpbmtzOiAzMAorCSAgICBFbmNvZGluZyB0eXBlOiBMYW1iZGEgKHBob3RvbmljKQorCSAgICBWZXJpZnkgVHJhbnBvcnQgTWVjaGFuaXNtOiAzMjc2OCAoMHg4MDAwKSAKKwkgICAgVHJhbnNtaXNzaW9uIFJhdGU6IDEwMC4wMDAgTWJwcworCSAgICBXYXZlbGVuZ3RoOiA4CitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzEsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1NikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IEhlbGxvLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyOAorCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMSAoMHgwMDAwMDAwMSkKKwkgIEhlbGxvIE9iamVjdCAoNyksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDEyCisJICAgIFR4U2VxTnVtOiA1MAorCSAgICBSY3ZTZXFOdW06IDYwCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzIsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA4NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IENvbmZpZyBOQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA1NgorCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMSAoMHgwMDAwMDAwMSkKKwkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTm9kZSBJRDogMTAuMC41MC4xICgweDBhMDAzMjAxKQorCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDIgKDB4MDAwMDAwMDIpCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCisJICBOb2RlIElEIE9iamVjdCAoMiksIENsYXNzLVR5cGU6IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBOb2RlIElEOiAxMC4wLjUwLjIgKDB4MGEwMDMyMDIpCisJICBDb25maWd1cmF0aW9uIE9iamVjdCAoNiksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBIZWxsbyBJbnRlcnZhbDogNQorCSAgICBIZWxsbyBEZWFkIEludGVydmFsOiAxNQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTMzLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNzYpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBDb25maWcgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0OAorCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMSAoMHgwMDAwMDAwMSkKKwkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTm9kZSBJRDogMTAuMC41MC4xICgweDBhMDAzMjAxKQorCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDIgKDB4MDAwMDAwMDIpCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCisJICBOb2RlIElEIE9iamVjdCAoMiksIENsYXNzLVR5cGU6IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBOb2RlIElEOiAxMC4wLjUwLjIgKDB4MGEwMDMyMDIpCitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzQsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2OCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IENvbmZpZywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNDAKKwkgIENvbnRyb2wgQ2hhbm5lbCBJRCBPYmplY3QgKDEpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBDb250cm9sIENoYW5uZWwgSUQ6IDEgKDB4MDAwMDAwMDEpCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMyAoMHgwMDAwMDAwMykKKwkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTm9kZSBJRDogMTAuMC41MC4xICgweDBhMDAzMjAxKQorCSAgQ29uZmlndXJhdGlvbiBPYmplY3QgKDYpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgSGVsbG8gSW50ZXJ2YWw6IDUKKwkgICAgSGVsbG8gRGVhZCBJbnRlcnZhbDogMTUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzNSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDQ0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogTGluayBTdW1tYXJ5IEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMTYKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMSAoMHgwMDAwMDAwMSkKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzNiwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDEyNCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IExpbmsgU3VtbWFyeSBOQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA5NgorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQorCSAgRXJyb3IgQ29kZSBPYmplY3QgKDIwKSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBFcnJvciBDb2RlOiAKKwkJVW5hY2NlcHRhYmxlIG5vbi1uZWdvdGlhYmxlIExJTktfU1VNTUFSWSBwYXJhbWV0ZXJzLCAKKwkJUmVuZWdvdGlhdGUgTElOS19TVU1NQVJZIHBhcmFtZXRlcnMsIAorCQlJbnZhbGlkIERBVEEtTElOSyBPYmplY3QsIAorCQlVbmtub3duIFRFLUxJTksgT2JqZWN0IGMtdHlwZSwgCisJCVVua25vd24gREFUQS1MSU5LIE9iamVjdCBjLXR5cGUKKwkgIERhdGEgTGluayBPYmplY3QgKDEyKSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMzYKKwkgICAgRmxhZ3M6IFtub25lXQorCSAgICBMb2NhbCBJbnRlcmZhY2UgSUQ6IDE5Mi4xNjguMS4xICgweGMwYTgwMTAxKSAJCQkKKwkgICAgUmVtb3RlIEludGVyZmFjZSBJRDogMTkyLjE2OC4xLjIgKDB4YzBhODAxMDIpCisJICAgIFN1Ym9iamVjdCwgVHlwZTogSW50ZXJmYWNlIFN3aXRjaGluZyBUeXBlICgxKSwgTGVuZ3RoOiAxMgorCQkgICAgU3dpdGNoaW5nIFR5cGU6IExhbWJkYS1Td2l0Y2ggQ2FwYWJsZSAoMTUwKQorCQkgICAgRW5jb2RpbmcgVHlwZTogTGFtYmRhIChwaG90b25pYykgKDgpCisJCSAgICBNaW4gUmVzZXJ2YWJsZSBCYW5kd2lkdGg6IDEwMC4wMDAgTWJwcworCQkgICAgTWF4IFJlc2VydmFibGUgQmFuZHdpZHRoOiAxMDAuMDAwIE1icHMKKwkgICAgU3Vib2JqZWN0LCBUeXBlOiBXYXZlbGVuZ3RoICgyKSwgTGVuZ3RoOiA4CisJCSAgICBXYXZlbGVuZ3RoOiA2CisJICBEYXRhIExpbmsgT2JqZWN0ICgxMiksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDM2CisJICAgIEZsYWdzOiBbbm9uZV0KKwkgICAgTG9jYWwgSW50ZXJmYWNlIElEOiAxMC4xLjEuMSAoMHgwYTAxMDEwMSkgCQkJCisJICAgIFJlbW90ZSBJbnRlcmZhY2UgSUQ6IDEwLjEuMS4yICgweDBhMDEwMTAyKQorCSAgICBTdWJvYmplY3QsIFR5cGU6IEludGVyZmFjZSBTd2l0Y2hpbmcgVHlwZSAoMSksIExlbmd0aDogMTIKKwkJICAgIFN3aXRjaGluZyBUeXBlOiBMYW1iZGEtU3dpdGNoIENhcGFibGUgKDE1MCkKKwkJICAgIEVuY29kaW5nIFR5cGU6IEFOU0kvRVRTSSBQREggKDMpCisJCSAgICBNaW4gUmVzZXJ2YWJsZSBCYW5kd2lkdGg6IDEyMzQ3MzY3NjguMDAwIE1icHMKKwkJICAgIE1heCBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTI5MDY5MzM3Ni4wMDAgTWJwcworCSAgICBTdWJvYmplY3QsIFR5cGU6IFdhdmVsZW5ndGggKDIpLCBMZW5ndGg6IDgKKwkJICAgIFdhdmVsZW5ndGg6IDM1MworSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM3LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjgpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBCZWdpbiBWZXJpZnkgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0MAorCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMSAoMHgwMDAwMDAwMSkKKwkgIFZlcmlmeSBCZWdpbiBBQ0sgT2JqZWN0ICg5KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIFZlcmlmeSBEZWFkIEludGVydmFsOiA1MCAJCQkJCisJICAgIFZlcmlmeSBUcmFuc3BvcnQgUmVzcG9uc2U6IDEwMAorCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIFZlcmlmeSBJRDogNQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM4LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjApIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBCZWdpbiBWZXJpZnkgTkFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMzIKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEwLjAuMC4wICgweDBhMDAwMDAwKQorCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQorCSAgRXJyb3IgQ29kZSBPYmplY3QgKDIwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBFcnJvciBDb2RlOiAKKwkJTGluayBWZXJpZmljYXRpb24gUHJvY2VkdXJlIE5vdCBzdXBwb3J0ZWQsIAorCQlVbndpbGxpbmcgdG8gdmVyaWZ5LCAKKwkJVW5zdXBwb3J0ZWQgdmVyaWZpY2F0aW9uIHRyYW5zcG9ydCBtZWNoYW5pc20KK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzOSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDUyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogRW5kIFZlcmlmeSwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQorCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIFZlcmlmeSBJRDogNQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQwLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBFbmQgVmVyaWZ5IEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKKwkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgSUQ6IDUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0MSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDUyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogVGVzdCwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKKwkgIEludGVyZmFjZSBJRCBPYmplY3QgKDQpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBWZXJpZnkgSUQ6IDUKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0Miwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDUyKSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogVGVzdCBTdGF0dXMgRmFpbHVyZSwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEOiAxICgweDAwMDAwMDAxKQorCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4CisJICAgIFZlcmlmeSBJRDogNQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQzLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBUZXN0IFN0YXR1cyBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI0CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDEgKDB4MDAwMDAwMDEpCisJICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgVmVyaWZ5IElEOiA1CitJUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDQsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA0NCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKKwlMTVB2MSwgbXNnLXR5cGU6IENoYW5uZWwgU3RhdHVzIEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMTYKKwkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0NSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDY0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQ2hhbm5lbCBTdGF0dXMgUmVxdWVzdCwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMzYKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMyAoMHgwMDAwMDAwMykKKwkgIENoYW5uZWwgU3RhdHVzIFJlcXVlc3QgT2JqZWN0ICgxNCksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDEyCisJICAgIEludGVyZmFjZSBJRDogMi4wLjAuMCAoMHgwMjAwMDAwMCkKKwkgICAgSW50ZXJmYWNlIElEOiAyLjAuMC4wICgweDAyMDAwMDAwKQorSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNzIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCisJTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogNDQKKwkgIExpbmsgSUQgT2JqZWN0ICgzKSwgQ2xhc3MtVHlwZTogSVB2NCBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAorCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRDogMyAoMHgwMDAwMDAwMykKKwkgIENoYW5uZWwgU3RhdHVzIE9iamVjdCAoMTMpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAyMAorCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCisJCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKKwkJICAgIERpcmVjdGlvbjogVHJhbnNtaXQgKDEpCisJCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIEZhaWwgKDMpCisJICAgIEludGVyZmFjZSBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKKwkJICAgIEFjdGl2ZTogQWxsb2NhdGVkICgxKQorCQkgICAgRGlyZWN0aW9uOiBSZWNlaXZlICgwKQorCQkgICAgQ2hhbm5lbCBTdGF0dXM6IFNpZ25hbCBEZWdyYWRlZCAoMikKK0lQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0Nywgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDY0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAorCUxNUHYxLCBtc2ctdHlwZTogQ2hhbm5lbCBTdGF0dXMgUmVzcG9uc2UsIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDM2CisJICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKKwkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCisJICBDaGFubmVsIFN0YXR1cyBPYmplY3QgKDEzKSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMjAKKwkgICAgSW50ZXJmYWNlIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCQkgICAgQWN0aXZlOiBBbGxvY2F0ZWQgKDEpCisJCSAgICBEaXJlY3Rpb246IFRyYW5zbWl0ICgxKQorCQkgICAgQ2hhbm5lbCBTdGF0dXM6IFNpZ25hbCBEZWdyYWRlZCAoMikKKwkgICAgSW50ZXJmYWNlIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQorCQkgICAgQWN0aXZlOiBBbGxvY2F0ZWQgKDEpCisJCSAgICBEaXJlY3Rpb246IFRyYW5zbWl0ICgxKQorCQkgICAgQ2hhbm5lbCBTdGF0dXM6IFNpZ25hbCBPa2F5ICgxKQpkaWZmIC0tZ2l0IGEvdGVzdHMvbG1wLnBjYXAgYi90ZXN0cy9sbXAucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDdlM2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbG1wLnBjYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbG1wLnB1dSBiL3Rlc3RzL2xtcC5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0Y2Q1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xtcC5wdXUKQEAgLTAsMCArMSw0MiBAQAorYmVnaW4gNjQ0IGxtcC5wY2FwCitNVSwuUkgwKGAhYGBgYGBgYGBgYGBgL19fYGBgIWBgYGBJIUotMCY7SmBgIUJgYGBgOEBgYGBgYCU3NVNKCitNUUBgJD09IiYyQEBgMTBgYDUqV1JgYGAhJD1eRCJAYCxgMEhgI2ArIzNMLS5gJGBgYCFgYGBgNGAuYGBgCitNYDAsYCJgJGBgYGAhITBgKGBgYGBgUCgjYGBAIWBgYGBAMEBgJmBgYGAhMGBgYGA+IikqYGAkKyhgYGBgCitNYGBgKEkhSi0wI1NRYGAhJmBgYGAxQGBgYGBgJTc1U0pRQGAkPT0iJjJAQGAxMGBgLipXU2BgYCEkPV5fCitNIkBgLGAwSGAjYCsjM0wtLmAiMGBgIWBgYGAwYCdgYGBgMCRgImBgYGBgJCEhUGAsYGBgYCxAYGBgI1JECitNJkhVYEAvKGBgJihgYGAhQmBgYGBgYDU9Ny5LJmBgMVVUKDkqImAhJWBgITRLPzBgYGAkMVdaKCpgYFAhCitNIkBgLGBMLS5QVFhgMGBgYCRgYGBgUGBYYGBgIWAwYChgYGBgYDAkImBgQCpgIyghYEAkYCJgYGBgYCgiCitNITBgKGBgYGBgUCgiYGBAKmAjKCJAMDhgImBgJWBgXkQmSFVgP18sYGAlSGBgYCE6YGBgYGBgNT03LksmCitNYGAxVVQoOSoiYCElYGAhLEs/NGBgYCQxV1pEKmBgUCEiQGAsYEwtLlBUWGAuYGBgJGBgYGBAYFBgYGAhCitNYDBgKGBgYGBgMCQiYGBAKmAjKCFgQCRgImBgYGBgKCIhMGAoYGBgYGBQKCJgYEAqYCMoIkkhSi0wJytUCitNYGAhMmBgYGA0QGBgYGBgJTc1U0pRQGAkPT0iJjJAQGAxMGBgMSpXVmBgYCEkPV5QIkBgLGAwSGAjYCsjCitNM0wtLmAjYGBgIWBgYGAkYCpgYGBgMCRgImBgYGBgJCEhMGAoYGBgYGBQJCJgYEAqYCMoIUAwOGAiYGAlCitNYGBeRCZIVWAwXzRgYCNIYGBgYFpgYGBgYGA1PTcuSyZgYDFVVCg5KiJgISVgYGBMSz88YGBgJDFXXDwqCitNYGBQISJAYCxgTC0uUFRYYCZgYGAkYGBgI1BgMGBgYCIhMGAoYGBgYGA6MDpDNCJFXVBgYEJAYGBgKEhgCitNYGBgYCE1VTxaTDhgISc3MEFESChgJDRgYCdSTV5gYGBgMSc/PUBIYCNgJCpgYFAiUFRbIzNAIUhgYGAwCitNYGBgMGAmYGBgYCglYGBAYGBgYCFgQTBgImBgYGAjTCEjYGBEYGBgYGAsIkhgMCdgSmAkImAwUjYiJCsoCitNYGAhIlJgYGBgQEBgYGBgYGBgOCEjYGBEYGBgYGBgSCFgMCQqYDAkImAwUjZgVFozLDJVLkY9UzZgQEBgCitNYGBgYGA2JkQmSFVgQy9AYGAlKGBgYCEyYGBgYGBgNT03LksmYGAxVVQoOSoiYCElYGAhJEs/RGBgYCQxCitNV1pUKmBgUCEiQGAsYEwtLlBUWGAsYGBgJGBgYCFAYEhgYGAhYFBgKGAwYGBgYCglYGBAYGBgYCFAMERgCitNImBgUmAmMCEiQGAoYGBgYCE6MDpDNCFFXjBgYDJAYGBgJEhgYGBgYCE1VTxaTDhgISc3MEFESChgJDRgCitNYCNSTV5AYGBgMSc/TWBIYCNgJCpgYFAiUFRbIzNAYEhgYGAwYGBgJ2AiYGBgYCQjYGBAKmBgYGBgQDRgCitNImBgYGBgLCElYGAoYGBgYCFaMDpDNGBRXkBgYDBAYGBgJChgYGBgYCE1VTxaTDhgISc3MEFESChgJDRgCitNYCMyTV5QYGBgMSc/TlBIYCNgJCpgYFAiUFRbIzNAYEBgYGAwYGBgKGAhQGBgYCQlYGBAYGBgYCNgMEhgCitNImBgYGBgNkQmSFVgYF9MYGAkKGBgYCEiYGBgYGBgNT03LksmYGAxVVQoOSoiYCElYGBgVEs/UGBgYCQxCitNV1tIKmBgUCEiQGAsYEwtLlBUWGAoYGBgJGBgYCIwYDhgYGAiITBgKGBgYGBgUCQqYGBAYGBgYCVJIUotCitNMC0jW2BgISJgYGBgMEBgYGBgYCU3NVNKUUBgJD09IiYyQEBgMTBgYC0qV11gYGAhJD1eWSJAYCxgMEhgCitNI2ArIzNMLS5gImBgYCFgYGBgSGAmYGBgYDAwYCJgJGBgYGAhIkBgKGBgYGAhOjA6QzQiPV9gYGAwQGBgCitNYCQoYGBgYGAhNVU8Wkw4YCEnNzBBREgoYCQ0YGAjMk1fQGBgYDEnP05gSGAjYCQqYGBQIlBUWyMzQGBACitNYGBgMGBgYCxgIUBgYGAkJWBgQGBgYGAhYDBIYCJgYGBgYDZEJkhVYDo/VGBgJChgYGAhImBgYGBgYDU9CitNNy5LJmBgMVVUKDkqImAhJWBgYFRLP1xgYGAkMVdbPCpgYFAhIkBgLGBMLS5QVFhgKGBgYCRgYGAjMGA4CitNYGBgIiEwYChgYGBgYDAkKmBgQGBgYGAlSSFKLTAjQ15gYGBaYGBgYC5AYGBgYGAlNzVTSlFAYCQ9PSImCitNMkBAYDEwYGArKlhgYGBgISQ9Xl4iQGAsYDBIYCNgKyMzTC0uYCFAYGAhYGBgIShgJGBgYGBANGAiYGBgCitNYGAuRCZIVWApP1xgYCRYYGBgIS5gYGBgYGA1PTcuSyZgYDFVVCg5KiJgISVgYCFgS0AkYGBgJDFXWkQqCitNYGBQISJAYCxgTC0uUFRYYCtgYGAkYGBgJFBgRGBgYCFgUGAoYDBgYGBgJCVgYEBgYGBgI2AwWGAjYChgCitNYGBgImBgYGBJIUotMGA4YGAwITZgYGBgNUBgYGBgYCU3NVNKUUBgJD09IiYyQEBgMTBgYDIqWCJgYGAhCitNJD1eQCJAYCxgMEhgI2ArIzNMLS5gIzBgYCFgYGAhJGArYGBgYDAsYCJgJGBgYGAhITBgKGBgYGBgUCQtCitNYCEwIWBgYGBQYGBgYFAkYGBgImBgYGAiSSFKLTAtNGBgMCEuYGBgYDNAYGBgYGAlNzVTSlFAYCQ9PSImCitNMkBAYDEwYGAwKlgjYGBgISQ9XkciQGAsYDBIYCNgKyMzTC0uYCJQYGAhYGBgITBgKWBgYGBANGAiYGBgCis2YGAsISMwYDRgMGBgYCxgYGBgKCFgYGBgUGBgYGAwYGAKK2AKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdHMvbG1wLnNoIGIvdGVzdHMvbG1wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5MTkwNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sbXAuc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKK3V1ZGVjb2RlIGxtcC5wdXUKKworZWNobyAtbiB0ZXN0IGxtcCAuLi4KKy4uL3RjcGR1bXAgLXQgLW4gLXYgLXIgbG1wLnBjYXAgPmxtcC5uZXcKK2lmIGRpZmYgbG1wLm5ldyBsbXAub3V0Cit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCQorCmRpZmYgLS1naXQgYS90ZXN0cy9sc3BwaW5nLWZlYy1sZHAucGNhcCBiL3Rlc3RzL2xzcHBpbmctZmVjLWxkcC5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTg2YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sc3BwaW5nLWZlYy1sZHAucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9sc3BwaW5nLWZlYy1yc3ZwLnBjYXAgYi90ZXN0cy9sc3BwaW5nLWZlYy1yc3ZwLnBjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkY2Y1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xzcHBpbmctZmVjLXJzdnAucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5uZXcgYi90ZXN0cy9tcGxzLWxkcC1oZWxsby5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbHMtbGRwLWhlbGxvLm5ldwpAQCAtMCwwICsxLDkgQEAKK0lQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgMTU1NzksIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3MCkgMTAuMS4xLjMuNjQ2ID4gMjI0LjAuMC4yLjY0NjogCisJTERQLCBMYWJlbC1TcGFjZS1JRDogMTAuMS4wLjI6MCwgcGR1LWxlbmd0aDogMzgKKwkgIEhlbGxvIE1lc3NhZ2UgKDB4MDEwMCksIGxlbmd0aDogMjgsIE1lc3NhZ2UgSUQ6IDB4MDAwMTE5NzAsIEZsYWdzOiBbaWdub3JlIGlmIHVua25vd25dCisJICAgIENvbW1vbiBIZWxsbyBQYXJhbWV0ZXJzIFRMViAoMHgwNDAwKSwgbGVuZ3RoOiA0LCBGbGFnczogW2lnbm9yZSBhbmQgZG9uJ3QgZm9yd2FyZCBpZiB1bmtub3duXQorCSAgICAgIEhvbGQgVGltZTogMTVzLCBGbGFnczogW0xpbmsgSGVsbG9dCisJICAgIElQdjQgVHJhbnNwb3J0IEFkZHJlc3MgVExWICgweDA0MDEpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCisJICAgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzczogMTAuMS4wLjIKKwkgICAgQ29uZmlndXJhdGlvbiBTZXF1ZW5jZSBOdW1iZXIgVExWICgweDA0MDIpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCisJICAgICAgU2VxdWVuY2UgTnVtYmVyOiAxCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5vdXQgYi90ZXN0cy9tcGxzLWxkcC1oZWxsby5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbHMtbGRwLWhlbGxvLm91dApAQCAtMCwwICsxLDkgQEAKK0lQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgMTU1NzksIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3MCkgMTAuMS4xLjMuNjQ2ID4gMjI0LjAuMC4yLjY0NjogCisJTERQLCBMYWJlbC1TcGFjZS1JRDogMTAuMS4wLjI6MCwgcGR1LWxlbmd0aDogMzgKKwkgIEhlbGxvIE1lc3NhZ2UgKDB4MDEwMCksIGxlbmd0aDogMjgsIE1lc3NhZ2UgSUQ6IDB4MDAwMTE5NzAsIEZsYWdzOiBbaWdub3JlIGlmIHVua25vd25dCisJICAgIENvbW1vbiBIZWxsbyBQYXJhbWV0ZXJzIFRMViAoMHgwNDAwKSwgbGVuZ3RoOiA0LCBGbGFnczogW2lnbm9yZSBhbmQgZG9uJ3QgZm9yd2FyZCBpZiB1bmtub3duXQorCSAgICAgIEhvbGQgVGltZTogMTVzLCBGbGFnczogW0xpbmsgSGVsbG9dCisJICAgIElQdjQgVHJhbnNwb3J0IEFkZHJlc3MgVExWICgweDA0MDEpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCisJICAgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzczogMTAuMS4wLjIKKwkgICAgQ29uZmlndXJhdGlvbiBTZXF1ZW5jZSBOdW1iZXIgVExWICgweDA0MDIpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCisJICAgICAgU2VxdWVuY2UgTnVtYmVyOiAxCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5wY2FwIGIvdGVzdHMvbXBscy1sZHAtaGVsbG8ucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGE0MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBscy1sZHAtaGVsbG8ucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5wdXUgYi90ZXN0cy9tcGxzLWxkcC1oZWxsby5wdXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmM2I2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21wbHMtbGRwLWhlbGxvLnB1dQpAQCAtMCwwICsxLDYgQEAKK2JlZ2luIDY0NCBtcGxzLWxkcC1oZWxsby5wY2FwCitNVSwuUkgwKGAhYGBgYGBgYGBgYGBgLkglYGBgKWBgYGAxVUZaL0UyJyNgISpgYGBgMkBgYGAvXCNgIiUlCitNUGAhJi8tTGBgYCQxRDA4KmAwJCNYYGBgYEAqJmBIOGAsTTI+YGAkYClASCFgYChgYGAkYGAhUGBgMUVQCis4IWBgYCFgYC9gYGAkYDBgJCJAJGBgQDAiYGAwYGBgYCEKK2AKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdHMvbXBscy1sZHAtaGVsbG8uc2ggYi90ZXN0cy9tcGxzLWxkcC1oZWxsby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMWE1YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbXBscy1sZHAtaGVsbG8uc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKK3V1ZGVjb2RlIG1wbHMtbGRwLWhlbGxvLnB1dQorCitlY2hvIC1uIHRlc3QgbXBscy1sZHAtaGVsbG8gLi4uCisuLi90Y3BkdW1wIC10IC1uIC12IC1yIG1wbHMtbGRwLWhlbGxvLnBjYXAgPm1wbHMtbGRwLWhlbGxvLm5ldworaWYgZGlmZiBtcGxzLWxkcC1oZWxsby5uZXcgbXBscy1sZHAtaGVsbG8ub3V0Cit0aGVuCisJZWNobyBwYXNzZWQuCitlbHNlCisJZWNobyBmYWlsZWQuCitmaQorCQorCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLXRyYWNlcm91dGUucGNhcCBiL3Rlc3RzL21wbHMtdHJhY2Vyb3V0ZS5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGI2YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tcGxzLXRyYWNlcm91dGUucGNhcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vc3BmLWdtcGxzLm5ldyBiL3Rlc3RzL29zcGYtZ21wbHMubmV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc3BmLWdtcGxzLm5ldwpAQCAtMCwwICsxLDgzIEBACitJUCAodG9zIDB4YzAsIHR0bCAgIDEsIGlkIDQwNTIsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBPU1BGICg4OSksIGxlbmd0aDogMTcyKSA0MC4zNS4xLjIgPiAyMjQuMC4wLjU6IE9TUEZ2MiwgTFMtVXBkYXRlLCBsZW5ndGg6IDE1MgorCVJvdXRlci1JRDogMTAuMjU1LjI0NS4zNSwgQmFja2JvbmUgQXJlYSwgQXV0aGVudGljYXRpb24gVHlwZTogbm9uZSAoMCksIDEgTFNBCisJICBMU0EgIzEKKwkgIEFkdmVydGlzaW5nIFJvdXRlcjogMTAuMjU1LjI0NS4zNywgc2VxIDB4ODAwMDAwMDIsIGFnZSA5cywgbGVuZ3RoOiAxMDQKKwkgICAgQXJlYSBMb2NhbCBPcGFxdWUgTFNBICgxMCksIE9wYXF1ZS1UeXBlOiBUcmFmZmljIEVuZ2luZWVyaW5nIExTQSAoMSksIE9wYXF1ZS1JRDogOAorCSAgICBPcHRpb25zOiBbRXh0ZXJuYWxdCisJICAgIExpbmsgVExWICgyKSwgbGVuZ3RoOiAxMDAKKwkgICAgICBMaW5rIFR5cGUgc3ViVExWICgxKSwgbGVuZ3RoOiAxLCBQb2ludC10by1wb2ludCAoMSkKKwkgICAgICBMaW5rIElEIHN1YlRMViAoMiksIGxlbmd0aDogNCwgMTAuMjU1LjI0NS42OSAoMHgwYWZmZjU0NSkKKwkgICAgICBMb2NhbCBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDMpLCBsZW5ndGg6IDQsIDEwLjkuMTQyLjEKKwkgICAgICBSZW1vdGUgSW50ZXJmYWNlIElQIGFkZHJlc3Mgc3ViVExWICg0KSwgbGVuZ3RoOiA0LCAxMC45LjE0Mi4yCisJICAgICAgVHJhZmZpYyBFbmdpbmVlcmluZyBNZXRyaWMgc3ViVExWICg1KSwgbGVuZ3RoOiA0LCBNZXRyaWMgNjMKKwkgICAgICBNYXhpbXVtIEJhbmR3aWR0aCBzdWJUTFYgKDYpLCBsZW5ndGg6IDQsIDYyMi4wODAgTWJwcworCSAgICAgIE1heGltdW0gUmVzZXJ2YWJsZSBCYW5kd2lkdGggc3ViVExWICg3KSwgbGVuZ3RoOiA0LCA2MjIuMDgwIE1icHMKKwkgICAgICBVbnJlc2VydmVkIEJhbmR3aWR0aCBzdWJUTFYgKDgpLCBsZW5ndGg6IDMyCisJCVRFLUNsYXNzIDA6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyAxOiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgMjogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDM6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyA0OiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgNTogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDY6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyA3OiA2MjIuMDgwIE1icHMKKwkgICAgICBBZG1pbmlzdHJhdGl2ZSBHcm91cCBzdWJUTFYgKDkpLCBsZW5ndGg6IDQsIDB4MDAwMDAwMDAKK0lQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgNDEwNiwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IE9TUEYgKDg5KSwgbGVuZ3RoOiAxNzIpIDQwLjM1LjEuMiA+IDIyNC4wLjAuNTogT1NQRnYyLCBMUy1VcGRhdGUsIGxlbmd0aDogMTUyCisJUm91dGVyLUlEOiAxMC4yNTUuMjQ1LjM1LCBCYWNrYm9uZSBBcmVhLCBBdXRoZW50aWNhdGlvbiBUeXBlOiBub25lICgwKSwgMSBMU0EKKwkgIExTQSAjMQorCSAgQWR2ZXJ0aXNpbmcgUm91dGVyOiAxMC4yNTUuMjQ1LjM3LCBzZXEgMHg4MDAwMDAwMiwgYWdlIDlzLCBsZW5ndGg6IDEwNAorCSAgICBBcmVhIExvY2FsIE9wYXF1ZSBMU0EgKDEwKSwgT3BhcXVlLVR5cGU6IFRyYWZmaWMgRW5naW5lZXJpbmcgTFNBICgxKSwgT3BhcXVlLUlEOiA5CisJICAgIE9wdGlvbnM6IFtFeHRlcm5hbF0KKwkgICAgTGluayBUTFYgKDIpLCBsZW5ndGg6IDEwMAorCSAgICAgIExpbmsgVHlwZSBzdWJUTFYgKDEpLCBsZW5ndGg6IDEsIFBvaW50LXRvLXBvaW50ICgxKQorCSAgICAgIExpbmsgSUQgc3ViVExWICgyKSwgbGVuZ3RoOiA0LCAxMC4yNTUuMjQ1LjY5ICgweDBhZmZmNTQ1KQorCSAgICAgIExvY2FsIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoMyksIGxlbmd0aDogNCwgMTAuOS4xNDMuMQorCSAgICAgIFJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDQpLCBsZW5ndGg6IDQsIDEwLjkuMTQzLjIKKwkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyA2MworCSAgICAgIE1heGltdW0gQmFuZHdpZHRoIHN1YlRMViAoNiksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCisJICAgICAgTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCBzdWJUTFYgKDcpLCBsZW5ndGg6IDQsIDYyMi4wODAgTWJwcworCSAgICAgIFVucmVzZXJ2ZWQgQmFuZHdpZHRoIHN1YlRMViAoOCksIGxlbmd0aDogMzIKKwkJVEUtQ2xhc3MgMDogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDE6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyAyOiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgMzogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDQ6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyA1OiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgNjogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDc6IDYyMi4wODAgTWJwcworCSAgICAgIEFkbWluaXN0cmF0aXZlIEdyb3VwIHN1YlRMViAoOSksIGxlbmd0aDogNCwgMHgwMDAwMDAwMAorSVAgKHRvcyAweGMwLCB0dGwgICAxLCBpZCA0MTYwLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogT1NQRiAoODkpLCBsZW5ndGg6IDIxMikgNDAuMzUuMS4yID4gMjI0LjAuMC41OiBPU1BGdjIsIExTLVVwZGF0ZSwgbGVuZ3RoOiAxOTIKKwlSb3V0ZXItSUQ6IDEwLjI1NS4yNDUuMzUsIEJhY2tib25lIEFyZWEsIEF1dGhlbnRpY2F0aW9uIFR5cGU6IG5vbmUgKDApLCAxIExTQQorCSAgTFNBICMxCisJICBBZHZlcnRpc2luZyBSb3V0ZXI6IDEwLjI1NS4yNDUuMzUsIHNlcSAweDgwMDAwMDAzLCBhZ2UgM3MsIGxlbmd0aDogMTQ0CisJICAgIEFyZWEgTG9jYWwgT3BhcXVlIExTQSAoMTApLCBPcGFxdWUtVHlwZTogVHJhZmZpYyBFbmdpbmVlcmluZyBMU0EgKDEpLCBPcGFxdWUtSUQ6IDMKKwkgICAgT3B0aW9uczogW0V4dGVybmFsXQorCSAgICBMaW5rIFRMViAoMiksIGxlbmd0aDogMTQwCisJICAgICAgTGluayBUeXBlIHN1YlRMViAoMSksIGxlbmd0aDogMSwgUG9pbnQtdG8tcG9pbnQgKDEpCisJICAgICAgTGluayBJRCBzdWJUTFYgKDIpLCBsZW5ndGg6IDQsIDEwLjI1NS4yNDUuNDAgKDB4MGFmZmY1MjgpCisJICAgICAgTG9jYWwgSW50ZXJmYWNlIElQIGFkZHJlc3Mgc3ViVExWICgzKSwgbGVuZ3RoOiA0LCAxMC40MC4zNS4xNAorCSAgICAgIFJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDQpLCBsZW5ndGg6IDQsIDEwLjQwLjM1LjEzCisJICAgICAgVHJhZmZpYyBFbmdpbmVlcmluZyBNZXRyaWMgc3ViVExWICg1KSwgbGVuZ3RoOiA0LCBNZXRyaWMgMQorCSAgICAgIE1heGltdW0gQmFuZHdpZHRoIHN1YlRMViAoNiksIGxlbmd0aDogNCwgMTAwLjAwMCBNYnBzCisJICAgICAgTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCBzdWJUTFYgKDcpLCBsZW5ndGg6IDQsIDEwMC4wMDAgTWJwcworCSAgICAgIFVucmVzZXJ2ZWQgQmFuZHdpZHRoIHN1YlRMViAoOCksIGxlbmd0aDogMzIKKwkJVEUtQ2xhc3MgMDogMC4wMDAgTWJwcworCQlURS1DbGFzcyAxOiAwLjAwMCBNYnBzCisJCVRFLUNsYXNzIDI6IDAuMDAwIE1icHMKKwkJVEUtQ2xhc3MgMzogMC4wMDAgTWJwcworCQlURS1DbGFzcyA0OiAwLjAwMCBNYnBzCisJCVRFLUNsYXNzIDU6IDAuMDAwIE1icHMKKwkJVEUtQ2xhc3MgNjogMC4wMDAgTWJwcworCQlURS1DbGFzcyA3OiAwLjAwMCBNYnBzCisJICAgICAgSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5IHN1YlRMViAoMTUpLCBsZW5ndGg6IDQ0CisJCUludGVyZmFjZSBTd2l0Y2hpbmcgQ2FwYWJpbGl0eTogUGFja2V0LVN3aXRjaCBDYXBhYmxlLTEKKwkJTFNQIEVuY29kaW5nOiBFdGhlcm5ldCBWMi9ESVgKKwkJTWF4IExTUCBCYW5kd2lkdGg6CisJCSAgcHJpb3JpdHkgbGV2ZWwgMDogMC4wMDAgTWJwcworCQkgIHByaW9yaXR5IGxldmVsIDE6IDAuMDAwIE1icHMKKwkJICBwcmlvcml0eSBsZXZlbCAyOiAwLjAwMCBNYnBzCisJCSAgcHJpb3JpdHkgbGV2ZWwgMzogMC4wMDAgTWJwcworCQkgIHByaW9yaXR5IGxldmVsIDQ6IDAuMDAwIE1icHMKKwkJICBwcmlvcml0eSBsZXZlbCA1OiAwLjAwMCBNYnBzCisJCSAgcHJpb3JpdHkgbGV2ZWwgNjogMC4wMDAgTWJwcworCQkgIHByaW9yaXR5IGxldmVsIDc6IDAuMDAwIE1icHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29zcGYtZ21wbHMub3V0IGIvdGVzdHMvb3NwZi1nbXBscy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YWZmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zcGYtZ21wbHMub3V0CkBAIC0wLDAgKzEsODMgQEAKK0lQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgNDA1Miwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IE9TUEYgKDg5KSwgbGVuZ3RoOiAxNzIpIDQwLjM1LjEuMiA+IDIyNC4wLjAuNTogT1NQRnYyLCBMUy1VcGRhdGUsIGxlbmd0aDogMTUyCisJUm91dGVyLUlEOiAxMC4yNTUuMjQ1LjM1LCBCYWNrYm9uZSBBcmVhLCBBdXRoZW50aWNhdGlvbiBUeXBlOiBub25lICgwKSwgMSBMU0EKKwkgIExTQSAjMQorCSAgQWR2ZXJ0aXNpbmcgUm91dGVyOiAxMC4yNTUuMjQ1LjM3LCBzZXEgMHg4MDAwMDAwMiwgYWdlIDlzLCBsZW5ndGg6IDEwNAorCSAgICBBcmVhIExvY2FsIE9wYXF1ZSBMU0EgKDEwKSwgT3BhcXVlLVR5cGU6IFRyYWZmaWMgRW5naW5lZXJpbmcgTFNBICgxKSwgT3BhcXVlLUlEOiA4CisJICAgIE9wdGlvbnM6IFtFeHRlcm5hbF0KKwkgICAgTGluayBUTFYgKDIpLCBsZW5ndGg6IDEwMAorCSAgICAgIExpbmsgVHlwZSBzdWJUTFYgKDEpLCBsZW5ndGg6IDEsIFBvaW50LXRvLXBvaW50ICgxKQorCSAgICAgIExpbmsgSUQgc3ViVExWICgyKSwgbGVuZ3RoOiA0LCAxMC4yNTUuMjQ1LjY5ICgweDBhZmZmNTQ1KQorCSAgICAgIExvY2FsIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoMyksIGxlbmd0aDogNCwgMTAuOS4xNDIuMQorCSAgICAgIFJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDQpLCBsZW5ndGg6IDQsIDEwLjkuMTQyLjIKKwkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyA2MworCSAgICAgIE1heGltdW0gQmFuZHdpZHRoIHN1YlRMViAoNiksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCisJICAgICAgTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCBzdWJUTFYgKDcpLCBsZW5ndGg6IDQsIDYyMi4wODAgTWJwcworCSAgICAgIFVucmVzZXJ2ZWQgQmFuZHdpZHRoIHN1YlRMViAoOCksIGxlbmd0aDogMzIKKwkJVEUtQ2xhc3MgMDogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDE6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyAyOiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgMzogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDQ6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyA1OiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgNjogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDc6IDYyMi4wODAgTWJwcworCSAgICAgIEFkbWluaXN0cmF0aXZlIEdyb3VwIHN1YlRMViAoOSksIGxlbmd0aDogNCwgMHgwMDAwMDAwMAorSVAgKHRvcyAweGMwLCB0dGwgICAxLCBpZCA0MTA2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogT1NQRiAoODkpLCBsZW5ndGg6IDE3MikgNDAuMzUuMS4yID4gMjI0LjAuMC41OiBPU1BGdjIsIExTLVVwZGF0ZSwgbGVuZ3RoOiAxNTIKKwlSb3V0ZXItSUQ6IDEwLjI1NS4yNDUuMzUsIEJhY2tib25lIEFyZWEsIEF1dGhlbnRpY2F0aW9uIFR5cGU6IG5vbmUgKDApLCAxIExTQQorCSAgTFNBICMxCisJICBBZHZlcnRpc2luZyBSb3V0ZXI6IDEwLjI1NS4yNDUuMzcsIHNlcSAweDgwMDAwMDAyLCBhZ2UgOXMsIGxlbmd0aDogMTA0CisJICAgIEFyZWEgTG9jYWwgT3BhcXVlIExTQSAoMTApLCBPcGFxdWUtVHlwZTogVHJhZmZpYyBFbmdpbmVlcmluZyBMU0EgKDEpLCBPcGFxdWUtSUQ6IDkKKwkgICAgT3B0aW9uczogW0V4dGVybmFsXQorCSAgICBMaW5rIFRMViAoMiksIGxlbmd0aDogMTAwCisJICAgICAgTGluayBUeXBlIHN1YlRMViAoMSksIGxlbmd0aDogMSwgUG9pbnQtdG8tcG9pbnQgKDEpCisJICAgICAgTGluayBJRCBzdWJUTFYgKDIpLCBsZW5ndGg6IDQsIDEwLjI1NS4yNDUuNjkgKDB4MGFmZmY1NDUpCisJICAgICAgTG9jYWwgSW50ZXJmYWNlIElQIGFkZHJlc3Mgc3ViVExWICgzKSwgbGVuZ3RoOiA0LCAxMC45LjE0My4xCisJICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuOS4xNDMuMgorCSAgICAgIFRyYWZmaWMgRW5naW5lZXJpbmcgTWV0cmljIHN1YlRMViAoNSksIGxlbmd0aDogNCwgTWV0cmljIDYzCisJICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCA2MjIuMDgwIE1icHMKKwkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCisJICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgorCQlURS1DbGFzcyAwOiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgMTogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDI6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyAzOiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgNDogNjIyLjA4MCBNYnBzCisJCVRFLUNsYXNzIDU6IDYyMi4wODAgTWJwcworCQlURS1DbGFzcyA2OiA2MjIuMDgwIE1icHMKKwkJVEUtQ2xhc3MgNzogNjIyLjA4MCBNYnBzCisJICAgICAgQWRtaW5pc3RyYXRpdmUgR3JvdXAgc3ViVExWICg5KSwgbGVuZ3RoOiA0LCAweDAwMDAwMDAwCitJUCAodG9zIDB4YzAsIHR0bCAgIDEsIGlkIDQxNjAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBPU1BGICg4OSksIGxlbmd0aDogMjEyKSA0MC4zNS4xLjIgPiAyMjQuMC4wLjU6IE9TUEZ2MiwgTFMtVXBkYXRlLCBsZW5ndGg6IDE5MgorCVJvdXRlci1JRDogMTAuMjU1LjI0NS4zNSwgQmFja2JvbmUgQXJlYSwgQXV0aGVudGljYXRpb24gVHlwZTogbm9uZSAoMCksIDEgTFNBCisJICBMU0EgIzEKKwkgIEFkdmVydGlzaW5nIFJvdXRlcjogMTAuMjU1LjI0NS4zNSwgc2VxIDB4ODAwMDAwMDMsIGFnZSAzcywgbGVuZ3RoOiAxNDQKKwkgICAgQXJlYSBMb2NhbCBPcGFxdWUgTFNBICgxMCksIE9wYXF1ZS1UeXBlOiBUcmFmZmljIEVuZ2luZWVyaW5nIExTQSAoMSksIE9wYXF1ZS1JRDogMworCSAgICBPcHRpb25zOiBbRXh0ZXJuYWxdCisJICAgIExpbmsgVExWICgyKSwgbGVuZ3RoOiAxNDAKKwkgICAgICBMaW5rIFR5cGUgc3ViVExWICgxKSwgbGVuZ3RoOiAxLCBQb2ludC10by1wb2ludCAoMSkKKwkgICAgICBMaW5rIElEIHN1YlRMViAoMiksIGxlbmd0aDogNCwgMTAuMjU1LjI0NS40MCAoMHgwYWZmZjUyOCkKKwkgICAgICBMb2NhbCBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDMpLCBsZW5ndGg6IDQsIDEwLjQwLjM1LjE0CisJICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuNDAuMzUuMTMKKwkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyAxCisJICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCAxMDAuMDAwIE1icHMKKwkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgMTAwLjAwMCBNYnBzCisJICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgorCQlURS1DbGFzcyAwOiAwLjAwMCBNYnBzCisJCVRFLUNsYXNzIDE6IDAuMDAwIE1icHMKKwkJVEUtQ2xhc3MgMjogMC4wMDAgTWJwcworCQlURS1DbGFzcyAzOiAwLjAwMCBNYnBzCisJCVRFLUNsYXNzIDQ6IDAuMDAwIE1icHMKKwkJVEUtQ2xhc3MgNTogMC4wMDAgTWJwcworCQlURS1DbGFzcyA2OiAwLjAwMCBNYnBzCisJCVRFLUNsYXNzIDc6IDAuMDAwIE1icHMKKwkgICAgICBJbnRlcmZhY2UgU3dpdGNoaW5nIENhcGFiaWxpdHkgc3ViVExWICgxNSksIGxlbmd0aDogNDQKKwkJSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5OiBQYWNrZXQtU3dpdGNoIENhcGFibGUtMQorCQlMU1AgRW5jb2Rpbmc6IEV0aGVybmV0IFYyL0RJWAorCQlNYXggTFNQIEJhbmR3aWR0aDoKKwkJICBwcmlvcml0eSBsZXZlbCAwOiAwLjAwMCBNYnBzCisJCSAgcHJpb3JpdHkgbGV2ZWwgMTogMC4wMDAgTWJwcworCQkgIHByaW9yaXR5IGxldmVsIDI6IDAuMDAwIE1icHMKKwkJICBwcmlvcml0eSBsZXZlbCAzOiAwLjAwMCBNYnBzCisJCSAgcHJpb3JpdHkgbGV2ZWwgNDogMC4wMDAgTWJwcworCQkgIHByaW9yaXR5IGxldmVsIDU6IDAuMDAwIE1icHMKKwkJICBwcmlvcml0eSBsZXZlbCA2OiAwLjAwMCBNYnBzCisJCSAgcHJpb3JpdHkgbGV2ZWwgNzogMC4wMDAgTWJwcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5wY2FwIGIvdGVzdHMvb3NwZi1nbXBscy5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjk4MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc3BmLWdtcGxzLnBjYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5wdXUgYi90ZXN0cy9vc3BmLWdtcGxzLnB1dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTFlMzhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NwZi1nbXBscy5wdXUKQEAgLTAsMCArMSwxOCBAQAorYmVnaW4gNjQ0IG9zcGYtZ21wbHMucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYCc4MWBgYGBgYGBgS01FPC9fNkQhMCJQYGBgYExgYGBgYChgYGAhJQorTVBgIkwjXTBgYGAlOUdTTEgoUCQiWGBgYCEwKCRgKUAqX180Q2BgYGBgKkYqYGBgYGBgYGBgYGBgYGBgYAorTWBgJGAiMCgqYDBgYCJgS19dMjZgYGBgIj4jWGA/YGAiYCYwYGAwYCFgMGBgYGBgImBgMCpfXzUlYGAsYAorTSFgSClDQCRgIWBgJCJARi5gQGAlYGAwYGBgYF9gYDhgISRSNDQsYGAhUGAkMykxMFBgYChgIiEsRSUjYAorTTMpMTBQJFI0NCwhLEUlI2AzKTEwUCRSNDQsISxFJSNgMykxMFBgYClgYDBgYGBgYFktRTwvUDssIzAiUAorTWBgYGBMYGBgYGAoYGBgISVQYCJMJGBIYGBgJTlHUDRIKFAkIlhgYGAhMCgkYClAKl9fNENgYGBgYCZfJAorTWBgYGBgYGBgYGBgYGBgYGBgYCRgIjAoKmAwYGAiMEtfXTI2YGBgYCJMYCxgP2BgImAmMGBgMGAhYDBgYAorTWBgYCJgYDAqX181JWBgLGAhYEgpQ1AkYCFgYCQiQEYvYEBgJWBgMGBgYGBfYGA4YCEkUjQ0LGBgIVBgJAorTTMpMTBQYGAoYCIhLEUlI2AzKTEwUCRSNDQsISxFJSNgMykxMFAkUjQ0LCEsRSUjYDMpMTBQYGApYGAwYAorTWBgYGAmPUk8L1M0XCFAIzhgYGBgVmBgYGBgKGBgYCElUGAjNCQkYGBgYCU5R0o8SChQJCJYYGBgITAoJAorTWAsYCpfXzRDYGBgYGAtSFdgYGBgYGBgYGBgYGBgYGBgYGAkYGBQKCpgMGBgYFBLX10yLmBgYGAjKDAwYAorTUlgYCJgKFBgYDBgIWAwYGBgYGAiYGAwKl9fNEhgYCxgIWBISChQWGAhYGAkIkJAQyMwYCVgYDBgYGBgIQorTWBgOGAhJExeTyJgYCFQYCQyU1pcKGBgKGAiYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBgL2AiUCFgQGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAorKmBgISsvS1BAIkJAYGBgYGAKK2AKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5zaCBiL3Rlc3RzL29zcGYtZ21wbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGEyZGQzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zcGYtZ21wbHMuc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKK3V1ZGVjb2RlIG9zcGYtZ21wbHMucHV1IAorCitlY2hvIC1uIHRlc3Qgb3NwZi1nbXBscy4uLgorLi4vdGNwZHVtcCAtdCAtbiAtdiAtciBvc3BmLWdtcGxzLnBjYXAgPiBvc3BmLWdtcGxzLm5ldworaWYgZGlmZiBvc3BmLWdtcGxzLm5ldyBvc3BmLWdtcGxzLm91dAordGhlbgorCWVjaG8gcGFzc2VkLgorZWxzZQorCWVjaG8gZmFpbGVkLgorZmkKKwkKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtQS5uZXcgYi90ZXN0cy9wcmludC1BLm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNiYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQtQS5uZXcKQEAgLTAsMCArMSwxOTMgQEAKKzIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+CitFLi48LmhALkAuIVIuLi4uLi4uLi5wLlA3WC5+Li4uLi4uLi4uIS4uLi5ALi4uLgorTS4uLi4uLi4uLi4uCisyMzo1NzozNS45MzgxMjIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBTIDkzMDc3ODYwOTo5MzA3Nzg2MDkoMCkgYWNrIDkyODU0OTI0NyB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MCxub3Asd3NjYWxlIDI+CitFLi48Li5ALkAuPC4uLi4uLi4uLi5QLnA3ei4uN1guLi4uLi5uLi4uLi5ALi4uLgorTS4uLk0uLi4uLi4uCisyMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+CitFLi40LmpALkAuIVguLi4uLi4uLi5wLlA3WC4uN3ouLi4uIC43Li4uLi4uCitNLi4uTS4uLgorMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+CitFLi4uLmxALkAuIC4uLi4uLi4uLi5wLlA3WC4uN3ouLi4uIC4uLi4uLi4uCitNLi4uTS4uLkdFVCAvIEhUVFAvMS4xCitIb3N0OiBsb2NhbGhvc3QKK1VzZXItQWdlbnQ6IEVMaW5rcy8wLjEwLjQtNy1kZWJpYW4gKHRleHRtb2RlOyBMaW51eCAyLjYuMTEtMS02ODYtc21wIGk2ODY7IDEzMng1Ni0yKQorQWNjZXB0OiAqLyoKK0FjY2VwdC1FbmNvZGluZzogZ3ppcAorQWNjZXB0LUxhbmd1YWdlOiBlbgorQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQorCisKKzIzOjU3OjM1Ljk0MDQ3NCBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IC4gYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MiAxMzA2MzAwOTUxPgorRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkkuLiAuNy4uLi4uLgorTS4uLk0uLi4KKzIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KK0UuLi4uLkAuQC4uJS4uLi4uLi4uLlAucDd6Li43WC5JLi4gLi4uLi4uLi4KK00uLi5NLi4uSFRUUC8xLjEgMjAwIE9LCitEYXRlOiBXZWQsIDA2IEp1bCAyMDA1IDAzOjU3OjM1IEdNVAorU2VydmVyOiBBcGFjaGUvMS4zLjMzCitMYXN0LU1vZGlmaWVkOiBTdW4sIDE1IEF1ZyAyMDA0IDAwOjQzOjQxIEdNVAorRVRhZzogIjZlODBmMC0xNDhhLTQxMWViMWJkIgorQWNjZXB0LVJhbmdlczogYnl0ZXMKK0NvbnRlbnQtTGVuZ3RoOiA1MjU4CitLZWVwLUFsaXZlOiB0aW1lb3V0PTE1LCBtYXg9MTAwCitDb25uZWN0aW9uOiBLZWVwLUFsaXZlCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xCisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPEhUTUw+Cis8SEVBRD4KKyAgIDxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorICAgPE1FVEEgTkFNRT0iRGVzY3JpcHRpb24iIENPTlRFTlQ9IlRoZSBpbml0aWFsIGluc3RhbGxhdGlvbiBvZiBEZWJpYW4gYXBhY2hlLiI+CisgICA8VElUTEU+UGxhY2Vob2xkZXIgcGFnZTwvVElUTEU+Cis8L0hFQUQ+Cis8Qk9EWSBURVhUPSIjMDAwMDAwIiBCR0NPTE9SPSIjRkZGRkZGIiBMSU5LPSIjMDAwMEVGIiBWTElOSz0iIzU1MTg4QSIgQUxJTks9IiNGRjAwMDAiPgorCis8SDE+UGxhY2Vob2xkZXIgcGFnZTwvSDE+Cis8SDI+SWYgeW91IGFyZSBqdXN0IGJyb3dzaW5nIHRoZSB3ZWI8L2gyPgorCis8UD5UaGUgb3duZXIgb2YgdGhpcyB3ZWIgc2l0ZSBoYXMgbm90IHB1dCB1cCBhbnkgd2ViIHBhZ2VzIHlldC4KK1BsZWFzZSBjb21lIGJhY2sgbGF0ZXIuPC9QPgorCis8UD48U01BTEw+PENJVEU+TW92ZSBhbG9uZywgbm90aGluZyB0byBzZWUgaGVyZS4uLjwvQ0lURT4gOi0pPC9TTUFMTD48L1A+CisKKzxIMj5JZiB5b3UgYXJlIHRyeWluZyB0byBsb2NhdGUgdGhlIGFkbWluaXN0cmF0b3Igb2YgdGhpcyBtYWNoaW5lPC9IMj4KKworPFA+SWYgeW91IHdhbnQgdG8gcmVwb3J0IHNvbWV0aGluZyBhYm91dCB0aGlzIGhvc3QncyBiZWhhdmlvciwgcGxlYXNlCitjb250YWN0IHRoZSBJbnRlcm5ldCBTZXJ2aWNlIFByb3ZpZGVyIChJU1ApIGludm9sdmVkIGRpcmVjdGx5LjwvUD4KKworPFA+U2VlIHRoZSA8QSBocmVmPSJodHRwOi8vd3d3LmFidXNlLm5ldC8iPk5ldHdvcmsgQWJ1c2UKK0NsZWFyaW5naG91c2U8L0E+IGZvciBob3cgdG8gZG8gdGhpcy48L1A+CisKKzxIMj5JZiB5b3UgYXJlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+CisKKzxQPlRoZSBpbml0aWFsIGluc3RhbGxhdGlvbiBvZiA8QSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj5EZWJpYW4ncworYXBhY2hlPC9BPiB3ZWIgc2VydmVyIHBhY2thZ2Ugd2FzIHN1Y2Nlc3NmdWwuPC9QPgorCis8UD48U1RST05HPllvdSBzaG91bGQgcmVwbGFjZSB0aGlzIHBhZ2Ugd2l0aCB5b3VyIG93biB3ZWIgcGFnZXMgYXMKK3Nvb24gYXMgcG9zc2libGUuPC9TVFJPTkc+PC9QPgorCis8UD5Vbmxlc3MgeW91IGNoYW5nZWQgaXRzIGNvbmZpZ3VyYXRpb24sIHlvdXIgbmV3IHNlcnZlciBpcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Cis8VUw+Cis8TEk+CitDb25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiA8VFQ+L2V0Yy9hcGFjaGU8L1RUPi48L0xJPgorCis8TEk+CitUaGUgPFRUPkRvY3VtZW50Um9vdDwvVFQ+LCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIGFsbCB5b3VyCitIVE1MIGZpbGVzIHNob3VsZCBleGlzdCwgaXMgc2V0IHRvIDxUVD4vdmFyL3d3dzwvVFQ+LjwvTEk+CisKKzxMST4KK0NHSSBzY3JpcHRzIGFyZSBsb29rZWQgZm9yIGluIDxUVD4vdXNyL2xpYi9jZ2ktYmluPC9UVD4sIHdoaWNoIGlzIHdoZXJlCitEZWJpYW4gcGFja2FnZXMgd2lsbCBwbGFjZSB0aGVpciBzY3JpcHRzLjwvTEk+CisKKzxMST4KK0xvZyBmaWxlcyBhcmUgcGxhY2VkIGluIDxUVD4vdmFyL2xvZy9hcGFjaGU8L1RUPiwgYW5kIHdpbGwgYmUgcm90YXRlZAord2Vla2x5LiAgVGhlIGZyZXF1ZW5jeSBvZiByb3RhdGlvbiBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgYnkgZWRpdGluZworPFRUPi9ldGMvbG9ncm90YXRlLmQvYXBhY2hlPC9UVD4uPC9MST4KKworPExJPgorVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGluZGV4IGlzIDxUVD5pbmRleC5odG1sPC9UVD4sIG1lYW5pbmcgdGhhdCByZXF1ZXN0cworZm9yIGEgZGlyZWN0b3J5IDxUVD4vZm9vL2Jhci88L1RUPiB3aWxsIGdpdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIDxUVD4vdmFyL3d3dy9mb28vYmFyL2luZGV4Lmh0bWw8L1RUPgoraWYgaXQgZXhpc3RzIChhc3N1bWluZyB0aGF0IDxUVD4vdmFyL3d3dzwvVFQ+IGlzIHlvdXIgPFRUPkRvY3VtZW50Um9vdDwvVFQ+KS48L0xJPgorCis8TEk+CitVc2VyIGRpcmVjdG9yaWVzIGFyZSBlbmFibGVkLCBhbmQgdXNlciBkb2N1bWVudHMgd2lsbCBiZSBsb29rZWQgZm9yCitpbiB0aGUgPFRUPnB1YmxpY19odG1sPC9UVD4gZGlyZWN0b3J5IG9mIHRoZSB1c2VycycgaG9tZXMuICBUaGVzZSBkaXJzCitzaG91bGQgYmUgdW5kZXIgPFRUPi9ob21lPC9UVD4sIGFuZCB1c2VycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bWxpbmsKK3RvIGZpbGVzIHRoZXkgZG9uJ3Qgb3duLjwvTEk+CisKKzwvVUw+CitBbGwgdGhlIHN0YW5kYXJkIGFwYWNoZSBtb2R1bGVzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGlzIHJlbGVhc2UgYW5kIGFyZQorbm93IG1hbmFnZWQgd2l0aCBkZWJjb25mLiAgVHlwZSA8VFQ+ZHBrZy1yZWNvbmZpZ3VyZSBhcGFjaGU8L1RUPiB0bworc2VsZWN0IHdoaWNoIG1vZHVsZXMgeW91IHdhbnQgZW5hYmxlZC4gIE1hbnkgb3RoZXIgbW9kdWxlcyBhcmUgYXZhaWxhYmxlCit0aHJvdWdoIHRoZSBEZWJpYW4gcGFja2FnZSBzeXN0ZW0gd2l0aCB0aGUgbmFtZXMgPFRUPmxpYmFwYWNoZS1tb2QtKjwvVFQ+LgorSWYgeW91IG5lZWQgdG8gY29tcGlsZSBhIG1vZHVsZSB5b3Vyc2VsZiwgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZQorPFRUPmFwYWNoZS1kZXY8L1RUPiBwYWNrYWdlLgorCis8UD5Nb3JlIGRvY3VtZW50YXRpb24gb24gQXBhY2hlIGNhbiBiZSBmb3VuZCBvbjoKKzxVTD4KKzxMST4KK1RoZSA8QSBIUkVGPSIvZG9jL2FwYWNoZS1kb2MvbWFudWFsLyI+QXBhY2hlIGRvY3VtZW50YXRpb248L0E+IHN0b3JlZCBvbiB5b3VyIHNlcnZlci48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIFByb2plY3Q8L0E+IGhvbWUgc2l0ZS48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUtc3NsLm9yZy8iPkFwYWNoZS1TU0w8L0E+IGhvbWUgc2l0ZS48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3BlcmwuYXBhY2hlLm9yZy8iPm1vZCBwZXJsPC9BPiBob21lIHNpdGUuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hld2Vlay5jb20vIj5BcGFjaGVXZWVrPC9BPiBuZXdzbGV0dGVyLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jLyI+RGViaWFuIFByb2plY3QKK0RvY3VtZW50YXRpb248L0E+IHdoaWNoIGNvbnRhaW5zIEhPV1RPcywgRkFRcywgYW5kIHNvZnR3YXJlIHVwZGF0ZXMuPC9MST4KKzwvVUw+CisKKzxQPllvdSBjYW4gYWxzbyBjb25zdWx0IHRoZSBsaXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly93d3cuYm91dGVsbC5jb20vZmFxLyI+V29ybGQKK1dpZGUgV2ViIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9BPiBmb3IgaW5mb3JtYXRpb24uCisKKzxIMj5MZXQgb3RoZXIgcGVvcGxlIGtub3cgYWJvdXQgdGhpcyBzZXJ2ZXI8L0gyPgorCis8QSBIUkVGPSJodHRwOi8vbmV0Y3JhZnQuY29tLyI+TmV0Y3JhZnQ8L0E+IHByb3ZpZGVzIGFuIGludGVyZXN0aW5nIGZyZWUKK3NlcnZpY2UgZm9yIHdlYiBzaXRlIG1vbml0b3JpbmcgYW5kIHN0YXRpc3RpYyBjb2xsZWN0aW9uLgorWW91IGNhbiBsZXQgdGhlbSBrbm93IGFib3V0IHlvdXIgc2VydmVyIHVzaW5nIHRoZWlyCis8QSBIUkVGPSJodHRwOi8vdXB0aW1lLm5ldGNyYWZ0LmNvbS8iPmludGVyZmFjZTwvQT4uCitFbmFibGluZyB0aGUgbW9uaXRvcmluZyBvZiB5b3VyIHNlcnZlciB3aWxsIHByb3ZpZGUgYSBiZXR0ZXIgZ2xvYmFsIG92ZXJ2aWV3CitvZiB3aG8gaXMgdXNpbmcgd2hhdCBhbmQgd2hlcmUsIGFuZCBpdCB3b3VsZCBnaXZlIERlYmlhbiBhIGJldHRlcgorb3ZlcnZpZXcgb2YgdGhlIGFwYWNoZSBwYWNrYWdlIHVzYWdlLgorCis8SDI+QWJvdXQgdGhpcyBwYWdlPC9IMj4KKworPElNRyBBTElHTj0icmlnaHQiIEFMVD0iIiBIRUlHSFQ9IjI0NyIgV0lEVEg9IjI3OCIgU1JDPSJpY29ucy9qaGUwNjEucG5nIj4KKworPFA+VGhpcyBpcyBhIHBsYWNlaG9sZGVyIHBhZ2UgaW5zdGFsbGVkIGJ5IHRoZSA8QQorSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuPC9BPgorcmVsZWFzZSBvZiB0aGUgYXBhY2hlIFdlYiBzZXJ2ZXIgcGFja2FnZS4KKworPFA+VGhpcyBjb21wdXRlciBoYXMgaW5zdGFsbGVkIHRoZSBEZWJpYW4gR05VL0xpbnV4IG9wZXJhdGluZyBzeXN0ZW0sCitidXQgaXQgaGFzIDxzdHJvbmc+bm90aGluZyB0byBkbyB3aXRoIHRoZSBEZWJpYW4KK1Byb2plY3Q8L3N0cm9uZz4uIFBsZWFzZSBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBjb250YWN0IHRoZSBEZWJpYW4KK1Byb2plY3QgYWJvdXQgaXQuPC9QPgorCis8UD5JZiB5b3UgZmluZCBhIGJ1ZyBpbiB0aGlzIGFwYWNoZSBwYWNrYWdlLCBvciBpbiBBcGFjaGUgaXRzZWxmLAorcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IG9uIGl0LiAgSW5zdHJ1Y3Rpb25zIG9uIGRvaW5nIHRoaXMsIGFuZCB0aGUKK2xpc3Qgb2YgPEEgSFJFRj0iaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9zcmM6YXBhY2hlIj5rbm93biBidWdzPC9BPiBvZiB0aGlzCitwYWNrYWdlLCBjYW4gYmUgZm91bmQgaW4gdGhlIAorPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL0J1Z3MvUmVwb3J0aW5nIj5EZWJpYW4gQnVnIFRyYWNraW5nIFN5c3RlbTwvQT4uCisKKzxQPlRoYW5rcyBmb3IgdXNpbmcgdGhpcyBwYWNrYWdlLCBhbmQgY29uZ3JhdHVsYXRpb25zIGZvciB5b3VyIGNob2ljZSBvZgorYSBEZWJpYW4gc3lzdGVtITwvUD4KKworPERJViBhbGlnbj0iY2VudGVyIj4KKzxhIGhyZWY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPgorPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMwIiB3aWR0aD0iMjUiIHNyYz0iaWNvbnMvZGViaWFuL29wZW5sb2dvLTI1LmpwZyIgYWx0PSJEZWJpYW4iPgorPC9hPgorPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+Cis8SU1HIGFsaWduPSJtaWRkbGUiIGhlaWdodD0iMzIiIHdpZHRoPSIyNTkiIHNyYz0iaWNvbnMvYXBhY2hlX3BiLnBuZyIgYWx0PSJBcGFjaGUiPgorPC9hPgorPC9ESVY+CisKKzwhLS0KKyAgVGhpcyBwYWdlIHdhcyBpbml0aWFsbHkgY3JlYXRlZCBieSBKb2huaWUgSW5ncmFtIChodHRwOi8vbmV0Z29kLm5ldC8pCisgIEl0IHdhcyBsYXRlciBlZGl0ZWQgYnkgTWF0dGhldyBXaWxjb3ggYW5kIEpvc2lwIFJvZGluLgorICBMYXN0IG1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wNi8yMCAxNTozMzo1NyAkLgorICAtLT4KKworPC9CT0RZPgorPC9IVE1MPgorCisyMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgorRS4uNC5uQC5ALiFULi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgorTS4uLk0uLi4KKzIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KK0UuLjQucEAuQC4hUi4uLi4uLi4uLnAuUDdYLkk3ei4uLi4wXy4uLi4uLi4KK00uLiFNLi4uCisyMzo1NzozNy4yMzA4MzkgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBGIDU1NjA6NTU2MCgwKSBhY2sgMjA0IHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDE+CitFLi40Li5ALkAuLi4uLi4uLi4uLi5QLnA3ei4uN1guSi4uIC4uNS4uLi4uCitNLi4jTS4uIQorMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KK0UuLjQuckAuQC4hUC4uLi4uLi4uLnAuUDdYLko3ei4uLi4wXy4uLi4uLi4KK00uLiNNLi4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1BLm91dCBiL3Rlc3RzL3ByaW50LUEub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2JhNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wcmludC1BLm91dApAQCAtMCwwICsxLDE5MyBAQAorMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KK0UuLjwuaEAuQC4hUi4uLi4uLi4uLnAuUDdYLn4uLi4uLi4uLi4hLi4uLkAuLi4uCitNLi4uLi4uLi4uLi4KKzIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KK0UuLjwuLkAuQC48Li4uLi4uLi4uLlAucDd6Li43WC4uLi4uLm4uLi4uLkAuLi4uCitNLi4uTS4uLi4uLi4KKzIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KK0UuLjQuakAuQC4hWC4uLi4uLi4uLnAuUDdYLi43ei4uLi4gLjcuLi4uLi4KK00uLi5NLi4uCisyMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KK0UuLi4ubEAuQC4gLi4uLi4uLi4uLnAuUDdYLi43ei4uLi4gLi4uLi4uLi4KK00uLi5NLi4uR0VUIC8gSFRUUC8xLjEKK0hvc3Q6IGxvY2FsaG9zdAorVXNlci1BZ2VudDogRUxpbmtzLzAuMTAuNC03LWRlYmlhbiAodGV4dG1vZGU7IExpbnV4IDIuNi4xMS0xLTY4Ni1zbXAgaTY4NjsgMTMyeDU2LTIpCitBY2NlcHQ6ICovKgorQWNjZXB0LUVuY29kaW5nOiBnemlwCitBY2NlcHQtTGFuZ3VhZ2U6IGVuCitDb25uZWN0aW9uOiBLZWVwLUFsaXZlCisKKworMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+CitFLi40Li5ALkAuLi4uLi4uLi4uLi5QLnA3ei4uN1guSS4uIC43Li4uLi4uCitNLi4uTS4uLgorMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgorRS4uLi4uQC5ALi4lLi4uLi4uLi4uUC5wN3ouLjdYLkkuLiAuLi4uLi4uLgorTS4uLk0uLi5IVFRQLzEuMSAyMDAgT0sKK0RhdGU6IFdlZCwgMDYgSnVsIDIwMDUgMDM6NTc6MzUgR01UCitTZXJ2ZXI6IEFwYWNoZS8xLjMuMzMKK0xhc3QtTW9kaWZpZWQ6IFN1biwgMTUgQXVnIDIwMDQgMDA6NDM6NDEgR01UCitFVGFnOiAiNmU4MGYwLTE0OGEtNDExZWIxYmQiCitBY2NlcHQtUmFuZ2VzOiBieXRlcworQ29udGVudC1MZW5ndGg6IDUyNTgKK0tlZXAtQWxpdmU6IHRpbWVvdXQ9MTUsIG1heD0xMDAKK0Nvbm5lY3Rpb246IEtlZXAtQWxpdmUKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorICAgPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8TUVUQSBOQU1FPSJEZXNjcmlwdGlvbiIgQ09OVEVOVD0iVGhlIGluaXRpYWwgaW5zdGFsbGF0aW9uIG9mIERlYmlhbiBhcGFjaGUuIj4KKyAgIDxUSVRMRT5QbGFjZWhvbGRlciBwYWdlPC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IiMwMDAwMDAiIEJHQ09MT1I9IiNGRkZGRkYiIExJTks9IiMwMDAwRUYiIFZMSU5LPSIjNTUxODhBIiBBTElOSz0iI0ZGMDAwMCI+CisKKzxIMT5QbGFjZWhvbGRlciBwYWdlPC9IMT4KKzxIMj5JZiB5b3UgYXJlIGp1c3QgYnJvd3NpbmcgdGhlIHdlYjwvaDI+CisKKzxQPlRoZSBvd25lciBvZiB0aGlzIHdlYiBzaXRlIGhhcyBub3QgcHV0IHVwIGFueSB3ZWIgcGFnZXMgeWV0LgorUGxlYXNlIGNvbWUgYmFjayBsYXRlci48L1A+CisKKzxQPjxTTUFMTD48Q0lURT5Nb3ZlIGFsb25nLCBub3RoaW5nIHRvIHNlZSBoZXJlLi4uPC9DSVRFPiA6LSk8L1NNQUxMPjwvUD4KKworPEgyPklmIHlvdSBhcmUgdHJ5aW5nIHRvIGxvY2F0ZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgorCis8UD5JZiB5b3Ugd2FudCB0byByZXBvcnQgc29tZXRoaW5nIGFib3V0IHRoaXMgaG9zdCdzIGJlaGF2aW9yLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEludGVybmV0IFNlcnZpY2UgUHJvdmlkZXIgKElTUCkgaW52b2x2ZWQgZGlyZWN0bHkuPC9QPgorCis8UD5TZWUgdGhlIDxBIGhyZWY9Imh0dHA6Ly93d3cuYWJ1c2UubmV0LyI+TmV0d29yayBBYnVzZQorQ2xlYXJpbmdob3VzZTwvQT4gZm9yIGhvdyB0byBkbyB0aGlzLjwvUD4KKworPEgyPklmIHlvdSBhcmUgdGhlIGFkbWluaXN0cmF0b3Igb2YgdGhpcyBtYWNoaW5lPC9IMj4KKworPFA+VGhlIGluaXRpYWwgaW5zdGFsbGF0aW9uIG9mIDxBIGhyZWY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbidzCithcGFjaGU8L0E+IHdlYiBzZXJ2ZXIgcGFja2FnZSB3YXMgc3VjY2Vzc2Z1bC48L1A+CisKKzxQPjxTVFJPTkc+WW91IHNob3VsZCByZXBsYWNlIHRoaXMgcGFnZSB3aXRoIHlvdXIgb3duIHdlYiBwYWdlcyBhcworc29vbiBhcyBwb3NzaWJsZS48L1NUUk9ORz48L1A+CisKKzxQPlVubGVzcyB5b3UgY2hhbmdlZCBpdHMgY29uZmlndXJhdGlvbiwgeW91ciBuZXcgc2VydmVyIGlzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKKzxVTD4KKzxMST4KK0NvbmZpZ3VyYXRpb24gZmlsZXMgY2FuIGJlIGZvdW5kIGluIDxUVD4vZXRjL2FwYWNoZTwvVFQ+LjwvTEk+CisKKzxMST4KK1RoZSA8VFQ+RG9jdW1lbnRSb290PC9UVD4sIHdoaWNoIGlzIHRoZSBkaXJlY3RvcnkgdW5kZXIgd2hpY2ggYWxsIHlvdXIKK0hUTUwgZmlsZXMgc2hvdWxkIGV4aXN0LCBpcyBzZXQgdG8gPFRUPi92YXIvd3d3PC9UVD4uPC9MST4KKworPExJPgorQ0dJIHNjcmlwdHMgYXJlIGxvb2tlZCBmb3IgaW4gPFRUPi91c3IvbGliL2NnaS1iaW48L1RUPiwgd2hpY2ggaXMgd2hlcmUKK0RlYmlhbiBwYWNrYWdlcyB3aWxsIHBsYWNlIHRoZWlyIHNjcmlwdHMuPC9MST4KKworPExJPgorTG9nIGZpbGVzIGFyZSBwbGFjZWQgaW4gPFRUPi92YXIvbG9nL2FwYWNoZTwvVFQ+LCBhbmQgd2lsbCBiZSByb3RhdGVkCit3ZWVrbHkuICBUaGUgZnJlcXVlbmN5IG9mIHJvdGF0aW9uIGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBieSBlZGl0aW5nCis8VFQ+L2V0Yy9sb2dyb3RhdGUuZC9hcGFjaGU8L1RUPi48L0xJPgorCis8TEk+CitUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaW5kZXggaXMgPFRUPmluZGV4Lmh0bWw8L1RUPiwgbWVhbmluZyB0aGF0IHJlcXVlc3RzCitmb3IgYSBkaXJlY3RvcnkgPFRUPi9mb28vYmFyLzwvVFQ+IHdpbGwgZ2l2ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgPFRUPi92YXIvd3d3L2Zvby9iYXIvaW5kZXguaHRtbDwvVFQ+CitpZiBpdCBleGlzdHMgKGFzc3VtaW5nIHRoYXQgPFRUPi92YXIvd3d3PC9UVD4gaXMgeW91ciA8VFQ+RG9jdW1lbnRSb290PC9UVD4pLjwvTEk+CisKKzxMST4KK1VzZXIgZGlyZWN0b3JpZXMgYXJlIGVuYWJsZWQsIGFuZCB1c2VyIGRvY3VtZW50cyB3aWxsIGJlIGxvb2tlZCBmb3IKK2luIHRoZSA8VFQ+cHVibGljX2h0bWw8L1RUPiBkaXJlY3Rvcnkgb2YgdGhlIHVzZXJzJyBob21lcy4gIFRoZXNlIGRpcnMKK3Nob3VsZCBiZSB1bmRlciA8VFQ+L2hvbWU8L1RUPiwgYW5kIHVzZXJzIHdpbGwgbm90IGJlIGFibGUgdG8gc3ltbGluawordG8gZmlsZXMgdGhleSBkb24ndCBvd24uPC9MST4KKworPC9VTD4KK0FsbCB0aGUgc3RhbmRhcmQgYXBhY2hlIG1vZHVsZXMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoaXMgcmVsZWFzZSBhbmQgYXJlCitub3cgbWFuYWdlZCB3aXRoIGRlYmNvbmYuICBUeXBlIDxUVD5kcGtnLXJlY29uZmlndXJlIGFwYWNoZTwvVFQ+IHRvCitzZWxlY3Qgd2hpY2ggbW9kdWxlcyB5b3Ugd2FudCBlbmFibGVkLiAgTWFueSBvdGhlciBtb2R1bGVzIGFyZSBhdmFpbGFibGUKK3Rocm91Z2ggdGhlIERlYmlhbiBwYWNrYWdlIHN5c3RlbSB3aXRoIHRoZSBuYW1lcyA8VFQ+bGliYXBhY2hlLW1vZC0qPC9UVD4uCitJZiB5b3UgbmVlZCB0byBjb21waWxlIGEgbW9kdWxlIHlvdXJzZWxmLCB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlCis8VFQ+YXBhY2hlLWRldjwvVFQ+IHBhY2thZ2UuCisKKzxQPk1vcmUgZG9jdW1lbnRhdGlvbiBvbiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uOgorPFVMPgorPExJPgorVGhlIDxBIEhSRUY9Ii9kb2MvYXBhY2hlLWRvYy9tYW51YWwvIj5BcGFjaGUgZG9jdW1lbnRhdGlvbjwvQT4gc3RvcmVkIG9uIHlvdXIgc2VydmVyLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgUHJvamVjdDwvQT4gaG9tZSBzaXRlLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS1zc2wub3JnLyI+QXBhY2hlLVNTTDwvQT4gaG9tZSBzaXRlLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vcGVybC5hcGFjaGUub3JnLyI+bW9kIHBlcmw8L0E+IGhvbWUgc2l0ZS48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS8iPkFwYWNoZVdlZWs8L0E+IG5ld3NsZXR0ZXIuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvIj5EZWJpYW4gUHJvamVjdAorRG9jdW1lbnRhdGlvbjwvQT4gd2hpY2ggY29udGFpbnMgSE9XVE9zLCBGQVFzLCBhbmQgc29mdHdhcmUgdXBkYXRlcy48L0xJPgorPC9VTD4KKworPFA+WW91IGNhbiBhbHNvIGNvbnN1bHQgdGhlIGxpc3Qgb2YgPEEgSFJFRj0iaHR0cDovL3d3dy5ib3V0ZWxsLmNvbS9mYXEvIj5Xb3JsZAorV2lkZSBXZWIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0E+IGZvciBpbmZvcm1hdGlvbi4KKworPEgyPkxldCBvdGhlciBwZW9wbGUga25vdyBhYm91dCB0aGlzIHNlcnZlcjwvSDI+CisKKzxBIEhSRUY9Imh0dHA6Ly9uZXRjcmFmdC5jb20vIj5OZXRjcmFmdDwvQT4gcHJvdmlkZXMgYW4gaW50ZXJlc3RpbmcgZnJlZQorc2VydmljZSBmb3Igd2ViIHNpdGUgbW9uaXRvcmluZyBhbmQgc3RhdGlzdGljIGNvbGxlY3Rpb24uCitZb3UgY2FuIGxldCB0aGVtIGtub3cgYWJvdXQgeW91ciBzZXJ2ZXIgdXNpbmcgdGhlaXIKKzxBIEhSRUY9Imh0dHA6Ly91cHRpbWUubmV0Y3JhZnQuY29tLyI+aW50ZXJmYWNlPC9BPi4KK0VuYWJsaW5nIHRoZSBtb25pdG9yaW5nIG9mIHlvdXIgc2VydmVyIHdpbGwgcHJvdmlkZSBhIGJldHRlciBnbG9iYWwgb3ZlcnZpZXcKK29mIHdobyBpcyB1c2luZyB3aGF0IGFuZCB3aGVyZSwgYW5kIGl0IHdvdWxkIGdpdmUgRGViaWFuIGEgYmV0dGVyCitvdmVydmlldyBvZiB0aGUgYXBhY2hlIHBhY2thZ2UgdXNhZ2UuCisKKzxIMj5BYm91dCB0aGlzIHBhZ2U8L0gyPgorCis8SU1HIEFMSUdOPSJyaWdodCIgQUxUPSIiIEhFSUdIVD0iMjQ3IiBXSURUSD0iMjc4IiBTUkM9Imljb25zL2poZTA2MS5wbmciPgorCis8UD5UaGlzIGlzIGEgcGxhY2Vob2xkZXIgcGFnZSBpbnN0YWxsZWQgYnkgdGhlIDxBCitIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj5EZWJpYW48L0E+CityZWxlYXNlIG9mIHRoZSBhcGFjaGUgV2ViIHNlcnZlciBwYWNrYWdlLgorCis8UD5UaGlzIGNvbXB1dGVyIGhhcyBpbnN0YWxsZWQgdGhlIERlYmlhbiBHTlUvTGludXggb3BlcmF0aW5nIHN5c3RlbSwKK2J1dCBpdCBoYXMgPHN0cm9uZz5ub3RoaW5nIHRvIGRvIHdpdGggdGhlIERlYmlhbgorUHJvamVjdDwvc3Ryb25nPi4gUGxlYXNlIGRvIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNvbnRhY3QgdGhlIERlYmlhbgorUHJvamVjdCBhYm91dCBpdC48L1A+CisKKzxQPklmIHlvdSBmaW5kIGEgYnVnIGluIHRoaXMgYXBhY2hlIHBhY2thZ2UsIG9yIGluIEFwYWNoZSBpdHNlbGYsCitwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgb24gaXQuICBJbnN0cnVjdGlvbnMgb24gZG9pbmcgdGhpcywgYW5kIHRoZQorbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vYnVncy5kZWJpYW4ub3JnL3NyYzphcGFjaGUiPmtub3duIGJ1Z3M8L0E+IG9mIHRoaXMKK3BhY2thZ2UsIGNhbiBiZSBmb3VuZCBpbiB0aGUgCis8QSBIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvQnVncy9SZXBvcnRpbmciPkRlYmlhbiBCdWcgVHJhY2tpbmcgU3lzdGVtPC9BPi4KKworPFA+VGhhbmtzIGZvciB1c2luZyB0aGlzIHBhY2thZ2UsIGFuZCBjb25ncmF0dWxhdGlvbnMgZm9yIHlvdXIgY2hvaWNlIG9mCithIERlYmlhbiBzeXN0ZW0hPC9QPgorCis8RElWIGFsaWduPSJjZW50ZXIiPgorPGEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+Cis8SU1HIGFsaWduPSJtaWRkbGUiIGhlaWdodD0iMzAiIHdpZHRoPSIyNSIgc3JjPSJpY29ucy9kZWJpYW4vb3BlbmxvZ28tMjUuanBnIiBhbHQ9IkRlYmlhbiI+Cis8L2E+Cis8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj4KKzxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMiIgd2lkdGg9IjI1OSIgc3JjPSJpY29ucy9hcGFjaGVfcGIucG5nIiBhbHQ9IkFwYWNoZSI+Cis8L2E+Cis8L0RJVj4KKworPCEtLQorICBUaGlzIHBhZ2Ugd2FzIGluaXRpYWxseSBjcmVhdGVkIGJ5IEpvaG5pZSBJbmdyYW0gKGh0dHA6Ly9uZXRnb2QubmV0LykKKyAgSXQgd2FzIGxhdGVyIGVkaXRlZCBieSBNYXR0aGV3IFdpbGNveCBhbmQgSm9zaXAgUm9kaW4uCisgIExhc3QgbW9kaWZpZWQ6ICREYXRlOiAyMDA0LzA2LzIwIDE1OjMzOjU3ICQuCisgIC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CisKKzIzOjU3OjM1Ljk0MTI2MCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTM+CitFLi40Lm5ALkAuIVQuLi4uLi4uLi5wLlA3WC5JN3ouLi4uMF8uLi4uLi4uCitNLi4uTS4uLgorMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgorRS4uNC5wQC5ALiFSLi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgorTS4uIU0uLi4KKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KK0UuLjQuLkAuQC4uLi4uLi4uLi4uLlAucDd6Li43WC5KLi4gLi41Li4uLi4KK00uLiNNLi4hCisyMzo1NzozNy4yMzA5MDAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYxIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQzPgorRS4uNC5yQC5ALiFQLi4uLi4uLi4ucC5QN1guSjd6Li4uLjBfLi4uLi4uLgorTS4uI00uLiMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LUFBLm5ldyBiL3Rlc3RzL3ByaW50LUFBLm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk5YzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQtQUEubmV3CkBAIC0wLDAgKzEsMTkzIEBACisyMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgorLi4uLi4uLi4uLi4uLi5FLi48LmhALkAuIVIuLi4uLi4uLi5wLlA3WC5+Li4uLi4uLi4uIS4uLi5ALi4uLgorTS4uLi4uLi4uLi4uCisyMzo1NzozNS45MzgxMjIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBTIDkzMDc3ODYwOTo5MzA3Nzg2MDkoMCkgYWNrIDkyODU0OTI0NyB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MCxub3Asd3NjYWxlIDI+CisuLi4uLi4uLi4uLi4uLkUuLjwuLkAuQC48Li4uLi4uLi4uLlAucDd6Li43WC4uLi4uLm4uLi4uLkAuLi4uCitNLi4uTS4uLi4uLi4KKzIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KKy4uLi4uLi4uLi4uLi4uRS4uNC5qQC5ALiFYLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuNy4uLi4uLgorTS4uLk0uLi4KKzIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgorLi4uLi4uLi4uLi4uLi5FLi4uLmxALkAuIC4uLi4uLi4uLi5wLlA3WC4uN3ouLi4uIC4uLi4uLi4uCitNLi4uTS4uLkdFVCAvIEhUVFAvMS4xCitIb3N0OiBsb2NhbGhvc3QKK1VzZXItQWdlbnQ6IEVMaW5rcy8wLjEwLjQtNy1kZWJpYW4gKHRleHRtb2RlOyBMaW51eCAyLjYuMTEtMS02ODYtc21wIGk2ODY7IDEzMng1Ni0yKQorQWNjZXB0OiAqLyoKK0FjY2VwdC1FbmNvZGluZzogZ3ppcAorQWNjZXB0LUxhbmd1YWdlOiBlbgorQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQorCisKKzIzOjU3OjM1Ljk0MDQ3NCBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IC4gYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MiAxMzA2MzAwOTUxPgorLi4uLi4uLi4uLi4uLi5FLi40Li5ALkAuLi4uLi4uLi4uLi5QLnA3ei4uN1guSS4uIC43Li4uLi4uCitNLi4uTS4uLgorMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgorLi4uLi4uLi4uLi4uLi5FLi4uLi5ALkAuLiUuLi4uLi4uLi5QLnA3ei4uN1guSS4uIC4uLi4uLi4uCitNLi4uTS4uLkhUVFAvMS4xIDIwMCBPSworRGF0ZTogV2VkLCAwNiBKdWwgMjAwNSAwMzo1NzozNSBHTVQKK1NlcnZlcjogQXBhY2hlLzEuMy4zMworTGFzdC1Nb2RpZmllZDogU3VuLCAxNSBBdWcgMjAwNCAwMDo0Mzo0MSBHTVQKK0VUYWc6ICI2ZTgwZjAtMTQ4YS00MTFlYjFiZCIKK0FjY2VwdC1SYW5nZXM6IGJ5dGVzCitDb250ZW50LUxlbmd0aDogNTI1OAorS2VlcC1BbGl2ZTogdGltZW91dD0xNSwgbWF4PTEwMAorQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxIVE1MPgorPEhFQUQ+CisgICA8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKyAgIDxNRVRBIE5BTUU9IkRlc2NyaXB0aW9uIiBDT05URU5UPSJUaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgRGViaWFuIGFwYWNoZS4iPgorICAgPFRJVExFPlBsYWNlaG9sZGVyIHBhZ2U8L1RJVExFPgorPC9IRUFEPgorPEJPRFkgVEVYVD0iIzAwMDAwMCIgQkdDT0xPUj0iI0ZGRkZGRiIgTElOSz0iIzAwMDBFRiIgVkxJTks9IiM1NTE4OEEiIEFMSU5LPSIjRkYwMDAwIj4KKworPEgxPlBsYWNlaG9sZGVyIHBhZ2U8L0gxPgorPEgyPklmIHlvdSBhcmUganVzdCBicm93c2luZyB0aGUgd2ViPC9oMj4KKworPFA+VGhlIG93bmVyIG9mIHRoaXMgd2ViIHNpdGUgaGFzIG5vdCBwdXQgdXAgYW55IHdlYiBwYWdlcyB5ZXQuCitQbGVhc2UgY29tZSBiYWNrIGxhdGVyLjwvUD4KKworPFA+PFNNQUxMPjxDSVRFPk1vdmUgYWxvbmcsIG5vdGhpbmcgdG8gc2VlIGhlcmUuLi48L0NJVEU+IDotKTwvU01BTEw+PC9QPgorCis8SDI+SWYgeW91IGFyZSB0cnlpbmcgdG8gbG9jYXRlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+CisKKzxQPklmIHlvdSB3YW50IHRvIHJlcG9ydCBzb21ldGhpbmcgYWJvdXQgdGhpcyBob3N0J3MgYmVoYXZpb3IsIHBsZWFzZQorY29udGFjdCB0aGUgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlciAoSVNQKSBpbnZvbHZlZCBkaXJlY3RseS48L1A+CisKKzxQPlNlZSB0aGUgPEEgaHJlZj0iaHR0cDovL3d3dy5hYnVzZS5uZXQvIj5OZXR3b3JrIEFidXNlCitDbGVhcmluZ2hvdXNlPC9BPiBmb3IgaG93IHRvIGRvIHRoaXMuPC9QPgorCis8SDI+SWYgeW91IGFyZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgorCis8UD5UaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgPEEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuJ3MKK2FwYWNoZTwvQT4gd2ViIHNlcnZlciBwYWNrYWdlIHdhcyBzdWNjZXNzZnVsLjwvUD4KKworPFA+PFNUUk9ORz5Zb3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyBwYWdlIHdpdGggeW91ciBvd24gd2ViIHBhZ2VzIGFzCitzb29uIGFzIHBvc3NpYmxlLjwvU1RST05HPjwvUD4KKworPFA+VW5sZXNzIHlvdSBjaGFuZ2VkIGl0cyBjb25maWd1cmF0aW9uLCB5b3VyIG5ldyBzZXJ2ZXIgaXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgorPFVMPgorPExJPgorQ29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgZm91bmQgaW4gPFRUPi9ldGMvYXBhY2hlPC9UVD4uPC9MST4KKworPExJPgorVGhlIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPiwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBhbGwgeW91cgorSFRNTCBmaWxlcyBzaG91bGQgZXhpc3QsIGlzIHNldCB0byA8VFQ+L3Zhci93d3c8L1RUPi48L0xJPgorCis8TEk+CitDR0kgc2NyaXB0cyBhcmUgbG9va2VkIGZvciBpbiA8VFQ+L3Vzci9saWIvY2dpLWJpbjwvVFQ+LCB3aGljaCBpcyB3aGVyZQorRGViaWFuIHBhY2thZ2VzIHdpbGwgcGxhY2UgdGhlaXIgc2NyaXB0cy48L0xJPgorCis8TEk+CitMb2cgZmlsZXMgYXJlIHBsYWNlZCBpbiA8VFQ+L3Zhci9sb2cvYXBhY2hlPC9UVD4sIGFuZCB3aWxsIGJlIHJvdGF0ZWQKK3dlZWtseS4gIFRoZSBmcmVxdWVuY3kgb2Ygcm90YXRpb24gY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGJ5IGVkaXRpbmcKKzxUVD4vZXRjL2xvZ3JvdGF0ZS5kL2FwYWNoZTwvVFQ+LjwvTEk+CisKKzxMST4KK1RoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbmRleCBpcyA8VFQ+aW5kZXguaHRtbDwvVFQ+LCBtZWFuaW5nIHRoYXQgcmVxdWVzdHMKK2ZvciBhIGRpcmVjdG9yeSA8VFQ+L2Zvby9iYXIvPC9UVD4gd2lsbCBnaXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSA8VFQ+L3Zhci93d3cvZm9vL2Jhci9pbmRleC5odG1sPC9UVD4KK2lmIGl0IGV4aXN0cyAoYXNzdW1pbmcgdGhhdCA8VFQ+L3Zhci93d3c8L1RUPiBpcyB5b3VyIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPikuPC9MST4KKworPExJPgorVXNlciBkaXJlY3RvcmllcyBhcmUgZW5hYmxlZCwgYW5kIHVzZXIgZG9jdW1lbnRzIHdpbGwgYmUgbG9va2VkIGZvcgoraW4gdGhlIDxUVD5wdWJsaWNfaHRtbDwvVFQ+IGRpcmVjdG9yeSBvZiB0aGUgdXNlcnMnIGhvbWVzLiAgVGhlc2UgZGlycworc2hvdWxkIGJlIHVuZGVyIDxUVD4vaG9tZTwvVFQ+LCBhbmQgdXNlcnMgd2lsbCBub3QgYmUgYWJsZSB0byBzeW1saW5rCit0byBmaWxlcyB0aGV5IGRvbid0IG93bi48L0xJPgorCis8L1VMPgorQWxsIHRoZSBzdGFuZGFyZCBhcGFjaGUgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyByZWxlYXNlIGFuZCBhcmUKK25vdyBtYW5hZ2VkIHdpdGggZGViY29uZi4gIFR5cGUgPFRUPmRwa2ctcmVjb25maWd1cmUgYXBhY2hlPC9UVD4gdG8KK3NlbGVjdCB3aGljaCBtb2R1bGVzIHlvdSB3YW50IGVuYWJsZWQuICBNYW55IG90aGVyIG1vZHVsZXMgYXJlIGF2YWlsYWJsZQordGhyb3VnaCB0aGUgRGViaWFuIHBhY2thZ2Ugc3lzdGVtIHdpdGggdGhlIG5hbWVzIDxUVD5saWJhcGFjaGUtbW9kLSo8L1RUPi4KK0lmIHlvdSBuZWVkIHRvIGNvbXBpbGUgYSBtb2R1bGUgeW91cnNlbGYsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUKKzxUVD5hcGFjaGUtZGV2PC9UVD4gcGFja2FnZS4KKworPFA+TW9yZSBkb2N1bWVudGF0aW9uIG9uIEFwYWNoZSBjYW4gYmUgZm91bmQgb246Cis8VUw+Cis8TEk+CitUaGUgPEEgSFJFRj0iL2RvYy9hcGFjaGUtZG9jL21hbnVhbC8iPkFwYWNoZSBkb2N1bWVudGF0aW9uPC9BPiBzdG9yZWQgb24geW91ciBzZXJ2ZXIuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBQcm9qZWN0PC9BPiBob21lIHNpdGUuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmcvIj5BcGFjaGUtU1NMPC9BPiBob21lIHNpdGUuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly9wZXJsLmFwYWNoZS5vcmcvIj5tb2QgcGVybDwvQT4gaG9tZSBzaXRlLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tLyI+QXBhY2hlV2VlazwvQT4gbmV3c2xldHRlci48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy8iPkRlYmlhbiBQcm9qZWN0CitEb2N1bWVudGF0aW9uPC9BPiB3aGljaCBjb250YWlucyBIT1dUT3MsIEZBUXMsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzLjwvTEk+Cis8L1VMPgorCis8UD5Zb3UgY2FuIGFsc28gY29uc3VsdCB0aGUgbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2ZhcS8iPldvcmxkCitXaWRlIFdlYiBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvQT4gZm9yIGluZm9ybWF0aW9uLgorCis8SDI+TGV0IG90aGVyIHBlb3BsZSBrbm93IGFib3V0IHRoaXMgc2VydmVyPC9IMj4KKworPEEgSFJFRj0iaHR0cDovL25ldGNyYWZ0LmNvbS8iPk5ldGNyYWZ0PC9BPiBwcm92aWRlcyBhbiBpbnRlcmVzdGluZyBmcmVlCitzZXJ2aWNlIGZvciB3ZWIgc2l0ZSBtb25pdG9yaW5nIGFuZCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KK1lvdSBjYW4gbGV0IHRoZW0ga25vdyBhYm91dCB5b3VyIHNlcnZlciB1c2luZyB0aGVpcgorPEEgSFJFRj0iaHR0cDovL3VwdGltZS5uZXRjcmFmdC5jb20vIj5pbnRlcmZhY2U8L0E+LgorRW5hYmxpbmcgdGhlIG1vbml0b3Jpbmcgb2YgeW91ciBzZXJ2ZXIgd2lsbCBwcm92aWRlIGEgYmV0dGVyIGdsb2JhbCBvdmVydmlldworb2Ygd2hvIGlzIHVzaW5nIHdoYXQgYW5kIHdoZXJlLCBhbmQgaXQgd291bGQgZ2l2ZSBEZWJpYW4gYSBiZXR0ZXIKK292ZXJ2aWV3IG9mIHRoZSBhcGFjaGUgcGFja2FnZSB1c2FnZS4KKworPEgyPkFib3V0IHRoaXMgcGFnZTwvSDI+CisKKzxJTUcgQUxJR049InJpZ2h0IiBBTFQ9IiIgSEVJR0hUPSIyNDciIFdJRFRIPSIyNzgiIFNSQz0iaWNvbnMvamhlMDYxLnBuZyI+CisKKzxQPlRoaXMgaXMgYSBwbGFjZWhvbGRlciBwYWdlIGluc3RhbGxlZCBieSB0aGUgPEEKK0hSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbjwvQT4KK3JlbGVhc2Ugb2YgdGhlIGFwYWNoZSBXZWIgc2VydmVyIHBhY2thZ2UuCisKKzxQPlRoaXMgY29tcHV0ZXIgaGFzIGluc3RhbGxlZCB0aGUgRGViaWFuIEdOVS9MaW51eCBvcGVyYXRpbmcgc3lzdGVtLAorYnV0IGl0IGhhcyA8c3Ryb25nPm5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgRGViaWFuCitQcm9qZWN0PC9zdHJvbmc+LiBQbGVhc2UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY29udGFjdCB0aGUgRGViaWFuCitQcm9qZWN0IGFib3V0IGl0LjwvUD4KKworPFA+SWYgeW91IGZpbmQgYSBidWcgaW4gdGhpcyBhcGFjaGUgcGFja2FnZSwgb3IgaW4gQXBhY2hlIGl0c2VsZiwKK3BsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBvbiBpdC4gIEluc3RydWN0aW9ucyBvbiBkb2luZyB0aGlzLCBhbmQgdGhlCitsaXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvc3JjOmFwYWNoZSI+a25vd24gYnVnczwvQT4gb2YgdGhpcworcGFja2FnZSwgY2FuIGJlIGZvdW5kIGluIHRoZSAKKzxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9CdWdzL1JlcG9ydGluZyI+RGViaWFuIEJ1ZyBUcmFja2luZyBTeXN0ZW08L0E+LgorCis8UD5UaGFua3MgZm9yIHVzaW5nIHRoaXMgcGFja2FnZSwgYW5kIGNvbmdyYXR1bGF0aW9ucyBmb3IgeW91ciBjaG9pY2Ugb2YKK2EgRGViaWFuIHN5c3RlbSE8L1A+CisKKzxESVYgYWxpZ249ImNlbnRlciI+Cis8YSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj4KKzxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMCIgd2lkdGg9IjI1IiBzcmM9Imljb25zL2RlYmlhbi9vcGVubG9nby0yNS5qcGciIGFsdD0iRGViaWFuIj4KKzwvYT4KKzxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgorPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMyIiB3aWR0aD0iMjU5IiBzcmM9Imljb25zL2FwYWNoZV9wYi5wbmciIGFsdD0iQXBhY2hlIj4KKzwvYT4KKzwvRElWPgorCis8IS0tCisgIFRoaXMgcGFnZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgYnkgSm9obmllIEluZ3JhbSAoaHR0cDovL25ldGdvZC5uZXQvKQorICBJdCB3YXMgbGF0ZXIgZWRpdGVkIGJ5IE1hdHRoZXcgV2lsY294IGFuZCBKb3NpcCBSb2Rpbi4KKyAgTGFzdCBtb2RpZmllZDogJERhdGU6IDIwMDQvMDYvMjAgMTU6MzM6NTcgJC4KKyAgLS0+CisKKzwvQk9EWT4KKzwvSFRNTD4KKworMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KKy4uLi4uLi4uLi4uLi4uRS4uNC5uQC5ALiFULi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgorTS4uLk0uLi4KKzIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KKy4uLi4uLi4uLi4uLi4uRS4uNC5wQC5ALiFSLi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgorTS4uIU0uLi4KKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KKy4uLi4uLi4uLi4uLi4uRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkouLiAuLjUuLi4uLgorTS4uI00uLiEKKzIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+CisuLi4uLi4uLi4uLi4uLkUuLjQuckAuQC4hUC4uLi4uLi4uLnAuUDdYLko3ei4uLi4wXy4uLi4uLi4KK00uLiNNLi4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1BQS5vdXQgYi90ZXN0cy9wcmludC1BQS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5OWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ByaW50LUFBLm91dApAQCAtMCwwICsxLDE5MyBAQAorMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KKy4uLi4uLi4uLi4uLi4uRS4uPC5oQC5ALiFSLi4uLi4uLi4ucC5QN1gufi4uLi4uLi4uLiEuLi4uQC4uLi4KK00uLi4uLi4uLi4uLgorMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgorLi4uLi4uLi4uLi4uLi5FLi48Li5ALkAuPC4uLi4uLi4uLi5QLnA3ei4uN1guLi4uLi5uLi4uLi5ALi4uLgorTS4uLk0uLi4uLi4uCisyMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+CisuLi4uLi4uLi4uLi4uLkUuLjQuakAuQC4hWC4uLi4uLi4uLnAuUDdYLi43ei4uLi4gLjcuLi4uLi4KK00uLi5NLi4uCisyMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KKy4uLi4uLi4uLi4uLi4uRS4uLi5sQC5ALiAuLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuLi4uLi4uLgorTS4uLk0uLi5HRVQgLyBIVFRQLzEuMQorSG9zdDogbG9jYWxob3N0CitVc2VyLUFnZW50OiBFTGlua3MvMC4xMC40LTctZGViaWFuICh0ZXh0bW9kZTsgTGludXggMi42LjExLTEtNjg2LXNtcCBpNjg2OyAxMzJ4NTYtMikKK0FjY2VwdDogKi8qCitBY2NlcHQtRW5jb2Rpbmc6IGd6aXAKK0FjY2VwdC1MYW5ndWFnZTogZW4KK0Nvbm5lY3Rpb246IEtlZXAtQWxpdmUKKworCisyMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KKy4uLi4uLi4uLi4uLi4uRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkkuLiAuNy4uLi4uLgorTS4uLk0uLi4KKzIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KKy4uLi4uLi4uLi4uLi4uRS4uLi4uQC5ALi4lLi4uLi4uLi4uUC5wN3ouLjdYLkkuLiAuLi4uLi4uLgorTS4uLk0uLi5IVFRQLzEuMSAyMDAgT0sKK0RhdGU6IFdlZCwgMDYgSnVsIDIwMDUgMDM6NTc6MzUgR01UCitTZXJ2ZXI6IEFwYWNoZS8xLjMuMzMKK0xhc3QtTW9kaWZpZWQ6IFN1biwgMTUgQXVnIDIwMDQgMDA6NDM6NDEgR01UCitFVGFnOiAiNmU4MGYwLTE0OGEtNDExZWIxYmQiCitBY2NlcHQtUmFuZ2VzOiBieXRlcworQ29udGVudC1MZW5ndGg6IDUyNTgKK0tlZXAtQWxpdmU6IHRpbWVvdXQ9MTUsIG1heD0xMDAKK0Nvbm5lY3Rpb246IEtlZXAtQWxpdmUKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8SFRNTD4KKzxIRUFEPgorICAgPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CisgICA8TUVUQSBOQU1FPSJEZXNjcmlwdGlvbiIgQ09OVEVOVD0iVGhlIGluaXRpYWwgaW5zdGFsbGF0aW9uIG9mIERlYmlhbiBhcGFjaGUuIj4KKyAgIDxUSVRMRT5QbGFjZWhvbGRlciBwYWdlPC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZIFRFWFQ9IiMwMDAwMDAiIEJHQ09MT1I9IiNGRkZGRkYiIExJTks9IiMwMDAwRUYiIFZMSU5LPSIjNTUxODhBIiBBTElOSz0iI0ZGMDAwMCI+CisKKzxIMT5QbGFjZWhvbGRlciBwYWdlPC9IMT4KKzxIMj5JZiB5b3UgYXJlIGp1c3QgYnJvd3NpbmcgdGhlIHdlYjwvaDI+CisKKzxQPlRoZSBvd25lciBvZiB0aGlzIHdlYiBzaXRlIGhhcyBub3QgcHV0IHVwIGFueSB3ZWIgcGFnZXMgeWV0LgorUGxlYXNlIGNvbWUgYmFjayBsYXRlci48L1A+CisKKzxQPjxTTUFMTD48Q0lURT5Nb3ZlIGFsb25nLCBub3RoaW5nIHRvIHNlZSBoZXJlLi4uPC9DSVRFPiA6LSk8L1NNQUxMPjwvUD4KKworPEgyPklmIHlvdSBhcmUgdHJ5aW5nIHRvIGxvY2F0ZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgorCis8UD5JZiB5b3Ugd2FudCB0byByZXBvcnQgc29tZXRoaW5nIGFib3V0IHRoaXMgaG9zdCdzIGJlaGF2aW9yLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEludGVybmV0IFNlcnZpY2UgUHJvdmlkZXIgKElTUCkgaW52b2x2ZWQgZGlyZWN0bHkuPC9QPgorCis8UD5TZWUgdGhlIDxBIGhyZWY9Imh0dHA6Ly93d3cuYWJ1c2UubmV0LyI+TmV0d29yayBBYnVzZQorQ2xlYXJpbmdob3VzZTwvQT4gZm9yIGhvdyB0byBkbyB0aGlzLjwvUD4KKworPEgyPklmIHlvdSBhcmUgdGhlIGFkbWluaXN0cmF0b3Igb2YgdGhpcyBtYWNoaW5lPC9IMj4KKworPFA+VGhlIGluaXRpYWwgaW5zdGFsbGF0aW9uIG9mIDxBIGhyZWY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbidzCithcGFjaGU8L0E+IHdlYiBzZXJ2ZXIgcGFja2FnZSB3YXMgc3VjY2Vzc2Z1bC48L1A+CisKKzxQPjxTVFJPTkc+WW91IHNob3VsZCByZXBsYWNlIHRoaXMgcGFnZSB3aXRoIHlvdXIgb3duIHdlYiBwYWdlcyBhcworc29vbiBhcyBwb3NzaWJsZS48L1NUUk9ORz48L1A+CisKKzxQPlVubGVzcyB5b3UgY2hhbmdlZCBpdHMgY29uZmlndXJhdGlvbiwgeW91ciBuZXcgc2VydmVyIGlzIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKKzxVTD4KKzxMST4KK0NvbmZpZ3VyYXRpb24gZmlsZXMgY2FuIGJlIGZvdW5kIGluIDxUVD4vZXRjL2FwYWNoZTwvVFQ+LjwvTEk+CisKKzxMST4KK1RoZSA8VFQ+RG9jdW1lbnRSb290PC9UVD4sIHdoaWNoIGlzIHRoZSBkaXJlY3RvcnkgdW5kZXIgd2hpY2ggYWxsIHlvdXIKK0hUTUwgZmlsZXMgc2hvdWxkIGV4aXN0LCBpcyBzZXQgdG8gPFRUPi92YXIvd3d3PC9UVD4uPC9MST4KKworPExJPgorQ0dJIHNjcmlwdHMgYXJlIGxvb2tlZCBmb3IgaW4gPFRUPi91c3IvbGliL2NnaS1iaW48L1RUPiwgd2hpY2ggaXMgd2hlcmUKK0RlYmlhbiBwYWNrYWdlcyB3aWxsIHBsYWNlIHRoZWlyIHNjcmlwdHMuPC9MST4KKworPExJPgorTG9nIGZpbGVzIGFyZSBwbGFjZWQgaW4gPFRUPi92YXIvbG9nL2FwYWNoZTwvVFQ+LCBhbmQgd2lsbCBiZSByb3RhdGVkCit3ZWVrbHkuICBUaGUgZnJlcXVlbmN5IG9mIHJvdGF0aW9uIGNhbiBiZSBlYXNpbHkgY2hhbmdlZCBieSBlZGl0aW5nCis8VFQ+L2V0Yy9sb2dyb3RhdGUuZC9hcGFjaGU8L1RUPi48L0xJPgorCis8TEk+CitUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaW5kZXggaXMgPFRUPmluZGV4Lmh0bWw8L1RUPiwgbWVhbmluZyB0aGF0IHJlcXVlc3RzCitmb3IgYSBkaXJlY3RvcnkgPFRUPi9mb28vYmFyLzwvVFQ+IHdpbGwgZ2l2ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgPFRUPi92YXIvd3d3L2Zvby9iYXIvaW5kZXguaHRtbDwvVFQ+CitpZiBpdCBleGlzdHMgKGFzc3VtaW5nIHRoYXQgPFRUPi92YXIvd3d3PC9UVD4gaXMgeW91ciA8VFQ+RG9jdW1lbnRSb290PC9UVD4pLjwvTEk+CisKKzxMST4KK1VzZXIgZGlyZWN0b3JpZXMgYXJlIGVuYWJsZWQsIGFuZCB1c2VyIGRvY3VtZW50cyB3aWxsIGJlIGxvb2tlZCBmb3IKK2luIHRoZSA8VFQ+cHVibGljX2h0bWw8L1RUPiBkaXJlY3Rvcnkgb2YgdGhlIHVzZXJzJyBob21lcy4gIFRoZXNlIGRpcnMKK3Nob3VsZCBiZSB1bmRlciA8VFQ+L2hvbWU8L1RUPiwgYW5kIHVzZXJzIHdpbGwgbm90IGJlIGFibGUgdG8gc3ltbGluawordG8gZmlsZXMgdGhleSBkb24ndCBvd24uPC9MST4KKworPC9VTD4KK0FsbCB0aGUgc3RhbmRhcmQgYXBhY2hlIG1vZHVsZXMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoaXMgcmVsZWFzZSBhbmQgYXJlCitub3cgbWFuYWdlZCB3aXRoIGRlYmNvbmYuICBUeXBlIDxUVD5kcGtnLXJlY29uZmlndXJlIGFwYWNoZTwvVFQ+IHRvCitzZWxlY3Qgd2hpY2ggbW9kdWxlcyB5b3Ugd2FudCBlbmFibGVkLiAgTWFueSBvdGhlciBtb2R1bGVzIGFyZSBhdmFpbGFibGUKK3Rocm91Z2ggdGhlIERlYmlhbiBwYWNrYWdlIHN5c3RlbSB3aXRoIHRoZSBuYW1lcyA8VFQ+bGliYXBhY2hlLW1vZC0qPC9UVD4uCitJZiB5b3UgbmVlZCB0byBjb21waWxlIGEgbW9kdWxlIHlvdXJzZWxmLCB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlCis8VFQ+YXBhY2hlLWRldjwvVFQ+IHBhY2thZ2UuCisKKzxQPk1vcmUgZG9jdW1lbnRhdGlvbiBvbiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uOgorPFVMPgorPExJPgorVGhlIDxBIEhSRUY9Ii9kb2MvYXBhY2hlLWRvYy9tYW51YWwvIj5BcGFjaGUgZG9jdW1lbnRhdGlvbjwvQT4gc3RvcmVkIG9uIHlvdXIgc2VydmVyLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj5BcGFjaGUgUHJvamVjdDwvQT4gaG9tZSBzaXRlLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS1zc2wub3JnLyI+QXBhY2hlLVNTTDwvQT4gaG9tZSBzaXRlLjwvTEk+CisKKzxMST4KK1RoZSA8QSBIUkVGPSJodHRwOi8vcGVybC5hcGFjaGUub3JnLyI+bW9kIHBlcmw8L0E+IGhvbWUgc2l0ZS48L0xJPgorCis8TEk+CitUaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS8iPkFwYWNoZVdlZWs8L0E+IG5ld3NsZXR0ZXIuPC9MST4KKworPExJPgorVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvIj5EZWJpYW4gUHJvamVjdAorRG9jdW1lbnRhdGlvbjwvQT4gd2hpY2ggY29udGFpbnMgSE9XVE9zLCBGQVFzLCBhbmQgc29mdHdhcmUgdXBkYXRlcy48L0xJPgorPC9VTD4KKworPFA+WW91IGNhbiBhbHNvIGNvbnN1bHQgdGhlIGxpc3Qgb2YgPEEgSFJFRj0iaHR0cDovL3d3dy5ib3V0ZWxsLmNvbS9mYXEvIj5Xb3JsZAorV2lkZSBXZWIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0E+IGZvciBpbmZvcm1hdGlvbi4KKworPEgyPkxldCBvdGhlciBwZW9wbGUga25vdyBhYm91dCB0aGlzIHNlcnZlcjwvSDI+CisKKzxBIEhSRUY9Imh0dHA6Ly9uZXRjcmFmdC5jb20vIj5OZXRjcmFmdDwvQT4gcHJvdmlkZXMgYW4gaW50ZXJlc3RpbmcgZnJlZQorc2VydmljZSBmb3Igd2ViIHNpdGUgbW9uaXRvcmluZyBhbmQgc3RhdGlzdGljIGNvbGxlY3Rpb24uCitZb3UgY2FuIGxldCB0aGVtIGtub3cgYWJvdXQgeW91ciBzZXJ2ZXIgdXNpbmcgdGhlaXIKKzxBIEhSRUY9Imh0dHA6Ly91cHRpbWUubmV0Y3JhZnQuY29tLyI+aW50ZXJmYWNlPC9BPi4KK0VuYWJsaW5nIHRoZSBtb25pdG9yaW5nIG9mIHlvdXIgc2VydmVyIHdpbGwgcHJvdmlkZSBhIGJldHRlciBnbG9iYWwgb3ZlcnZpZXcKK29mIHdobyBpcyB1c2luZyB3aGF0IGFuZCB3aGVyZSwgYW5kIGl0IHdvdWxkIGdpdmUgRGViaWFuIGEgYmV0dGVyCitvdmVydmlldyBvZiB0aGUgYXBhY2hlIHBhY2thZ2UgdXNhZ2UuCisKKzxIMj5BYm91dCB0aGlzIHBhZ2U8L0gyPgorCis8SU1HIEFMSUdOPSJyaWdodCIgQUxUPSIiIEhFSUdIVD0iMjQ3IiBXSURUSD0iMjc4IiBTUkM9Imljb25zL2poZTA2MS5wbmciPgorCis8UD5UaGlzIGlzIGEgcGxhY2Vob2xkZXIgcGFnZSBpbnN0YWxsZWQgYnkgdGhlIDxBCitIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj5EZWJpYW48L0E+CityZWxlYXNlIG9mIHRoZSBhcGFjaGUgV2ViIHNlcnZlciBwYWNrYWdlLgorCis8UD5UaGlzIGNvbXB1dGVyIGhhcyBpbnN0YWxsZWQgdGhlIERlYmlhbiBHTlUvTGludXggb3BlcmF0aW5nIHN5c3RlbSwKK2J1dCBpdCBoYXMgPHN0cm9uZz5ub3RoaW5nIHRvIGRvIHdpdGggdGhlIERlYmlhbgorUHJvamVjdDwvc3Ryb25nPi4gUGxlYXNlIGRvIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNvbnRhY3QgdGhlIERlYmlhbgorUHJvamVjdCBhYm91dCBpdC48L1A+CisKKzxQPklmIHlvdSBmaW5kIGEgYnVnIGluIHRoaXMgYXBhY2hlIHBhY2thZ2UsIG9yIGluIEFwYWNoZSBpdHNlbGYsCitwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgb24gaXQuICBJbnN0cnVjdGlvbnMgb24gZG9pbmcgdGhpcywgYW5kIHRoZQorbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vYnVncy5kZWJpYW4ub3JnL3NyYzphcGFjaGUiPmtub3duIGJ1Z3M8L0E+IG9mIHRoaXMKK3BhY2thZ2UsIGNhbiBiZSBmb3VuZCBpbiB0aGUgCis8QSBIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvQnVncy9SZXBvcnRpbmciPkRlYmlhbiBCdWcgVHJhY2tpbmcgU3lzdGVtPC9BPi4KKworPFA+VGhhbmtzIGZvciB1c2luZyB0aGlzIHBhY2thZ2UsIGFuZCBjb25ncmF0dWxhdGlvbnMgZm9yIHlvdXIgY2hvaWNlIG9mCithIERlYmlhbiBzeXN0ZW0hPC9QPgorCis8RElWIGFsaWduPSJjZW50ZXIiPgorPGEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+Cis8SU1HIGFsaWduPSJtaWRkbGUiIGhlaWdodD0iMzAiIHdpZHRoPSIyNSIgc3JjPSJpY29ucy9kZWJpYW4vb3BlbmxvZ28tMjUuanBnIiBhbHQ9IkRlYmlhbiI+Cis8L2E+Cis8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIj4KKzxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMiIgd2lkdGg9IjI1OSIgc3JjPSJpY29ucy9hcGFjaGVfcGIucG5nIiBhbHQ9IkFwYWNoZSI+Cis8L2E+Cis8L0RJVj4KKworPCEtLQorICBUaGlzIHBhZ2Ugd2FzIGluaXRpYWxseSBjcmVhdGVkIGJ5IEpvaG5pZSBJbmdyYW0gKGh0dHA6Ly9uZXRnb2QubmV0LykKKyAgSXQgd2FzIGxhdGVyIGVkaXRlZCBieSBNYXR0aGV3IFdpbGNveCBhbmQgSm9zaXAgUm9kaW4uCisgIExhc3QgbW9kaWZpZWQ6ICREYXRlOiAyMDA0LzA2LzIwIDE1OjMzOjU3ICQuCisgIC0tPgorCis8L0JPRFk+Cis8L0hUTUw+CisKKzIzOjU3OjM1Ljk0MTI2MCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTM+CisuLi4uLi4uLi4uLi4uLkUuLjQubkAuQC4hVC4uLi4uLi4uLnAuUDdYLkk3ei4uLi4wXy4uLi4uLi4KK00uLi5NLi4uCisyMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+CisuLi4uLi4uLi4uLi4uLkUuLjQucEAuQC4hUi4uLi4uLi4uLnAuUDdYLkk3ei4uLi4wXy4uLi4uLi4KK00uLiFNLi4uCisyMzo1NzozNy4yMzA4MzkgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBGIDU1NjA6NTU2MCgwKSBhY2sgMjA0IHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDE+CisuLi4uLi4uLi4uLi4uLkUuLjQuLkAuQC4uLi4uLi4uLi4uLlAucDd6Li43WC5KLi4gLi41Li4uLi4KK00uLiNNLi4hCisyMzo1NzozNy4yMzA5MDAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYxIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQzPgorLi4uLi4uLi4uLi4uLi5FLi40LnJALkAuIVAuLi4uLi4uLi5wLlA3WC5KN3ouLi4uMF8uLi4uLi4uCitNLi4jTS4uIwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtWC5uZXcgYi90ZXN0cy9wcmludC1YLm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U0NGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQtWC5uZXcKQEAgLTAsMCArMSw0MDkgQEAKKzIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+CisJMHgwMDAwOiAgNDUwMCAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxICBFLi48LmhALkAuIVIuLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwICAuLi4uLnAuUDdYLn4uLi4uCisJMHgwMDIwOiAgYTAwMiA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhICAuLi4uLiEuLi4uQC4uLi4uCisJMHgwMDMwOiAgNGRkYyA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIgICAgICAgICAgICBNLi4uLi4uLi4uLi4KKzIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICA0NTAwIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgIEUuLjwuLkAuQC48Li4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgIC4uLi4uUC5wN3ouLjdYLi4KKwkweDAwMjA6ICBhMDEyIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgIC4uLi5uLi4uLi5ALi4uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMiAgICAgICAgICAgIE0uLi5NLi4uLi4uLgorMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZhIDQwMDAgNDAwNiAyMTU4IDdmMDAgMDAwMSAgRS4uNC5qQC5ALiFYLi4uLgorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMiAgLi4uLi5wLlA3WC4uN3ouLgorCTB4MDAyMDogIDgwMTAgMjAwMCAzN2QwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNiAgLi4uLjcuLi4uLi4uTS4uLgorCTB4MDAzMDogIDRkZGMgOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgorMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+CisJMHgwMDAwOiAgNDUwMCAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxICBFLi4uLmxALkAuLi4uLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyICAuLi4uLnAuUDdYLi43ei4uCisJMHgwMDIwOiAgODAxOCAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3ICAuLi4uLi4uLi4uLi5NLi4uCisJMHgwMDMwOiAgNGRkYyA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxICBNLi4uR0VULi8uSFRUUC8xCisJMHgwMDQwOiAgMmUzMSAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4ICAuMS4uSG9zdDoubG9jYWxoCisJMHgwMDUwOiAgNmY3MyA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhICBvc3QuLlVzZXItQWdlbnQ6CisJMHgwMDYwOiAgMjA0NSA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3ICAuRUxpbmtzLzAuMTAuNC03CisJMHgwMDcwOiAgMmQ2NCA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0ICAtZGViaWFuLih0ZXh0bW9kCisJMHgwMDgwOiAgNjUzYiAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkICBlOy5MaW51eC4yLjYuMTEtCisJMHgwMDkwOiAgMzEyZCAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwICAxLTY4Ni1zbXAuaTY4NjsuCisJMHgwMGEwOiAgMzEzMyAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwICAxMzJ4NTYtMikuLkFjY2VwCisJMHgwMGIwOiAgNzQzYSAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1ICB0Oi4qLyouLkFjY2VwdC1FCisJMHgwMGMwOiAgNmU2MyA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxICBuY29kaW5nOi5nemlwLi5BCisJMHgwMGQwOiAgNjM2MyA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwICBjY2VwdC1MYW5ndWFnZTouCisJMHgwMGUwOiAgNjU2ZSAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwICBlbi4uQ29ubmVjdGlvbjouCisJMHgwMGYwOiAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYSAgICAgICBLZWVwLUFsaXZlLi4uLgorMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgNDUwMCAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxICBFLi40Li5ALkAuLi4uLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5ICAuLi4uLlAucDd6Li43WC5JCisJMHgwMDIwOiAgODAxMCAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4ICAuLi4uNy4uLi4uLi5NLi4uCisJMHgwMDMwOiAgNGRkYyA5MjE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4uCisyMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgNDUwMCAxNWViIDFmZTYgNDAwMCA0MDA2IDA3MjUgN2YwMCAwMDAxICBFLi4uLi5ALkAuLiUuLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5ICAuLi4uLlAucDd6Li43WC5JCisJMHgwMDIwOiAgODAxOCAyMDAwIDEzZTAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5ICAuLi4uLi4uLi4uLi5NLi4uCisJMHgwMDMwOiAgNGRkYyA5MjE3IDQ4NTQgNTQ1MCAyZjMxIDJlMzEgMjAzMiAzMDMwICBNLi4uSFRUUC8xLjEuMjAwCisJMHgwMDQwOiAgMjA0ZiA0YjBkIDBhNDQgNjE3NCA2NTNhIDIwNTcgNjU2NCAyYzIwICAuT0suLkRhdGU6LldlZCwuCisJMHgwMDUwOiAgMzAzNiAyMDRhIDc1NmMgMjAzMiAzMDMwIDM1MjAgMzAzMyAzYTM1ICAwNi5KdWwuMjAwNS4wMzo1CisJMHgwMDYwOiAgMzczYSAzMzM1IDIwNDcgNGQ1NCAwZDBhIDUzNjUgNzI3NiA2NTcyICA3OjM1LkdNVC4uU2VydmVyCisJMHgwMDcwOiAgM2EyMCA0MTcwIDYxNjMgNjg2NSAyZjMxIDJlMzMgMmUzMyAzMzBkICA6LkFwYWNoZS8xLjMuMzMuCisJMHgwMDgwOiAgMGE0YyA2MTczIDc0MmQgNGQ2ZiA2NDY5IDY2NjkgNjU2NCAzYTIwICAuTGFzdC1Nb2RpZmllZDouCisJMHgwMDkwOiAgNTM3NSA2ZTJjIDIwMzEgMzUyMCA0MTc1IDY3MjAgMzIzMCAzMDM0ICBTdW4sLjE1LkF1Zy4yMDA0CisJMHgwMGEwOiAgMjAzMCAzMDNhIDM0MzMgM2EzNCAzMTIwIDQ3NGQgNTQwZCAwYTQ1ICAuMDA6NDM6NDEuR01ULi5FCisJMHgwMGIwOiAgNTQ2MSA2NzNhIDIwMjIgMzY2NSAzODMwIDY2MzAgMmQzMSAzNDM4ICBUYWc6LiI2ZTgwZjAtMTQ4CisJMHgwMGMwOiAgNjEyZCAzNDMxIDMxNjUgNjIzMSA2MjY0IDIyMGQgMGE0MSA2MzYzICBhLTQxMWViMWJkIi4uQWNjCisJMHgwMGQwOiAgNjU3MCA3NDJkIDUyNjEgNmU2NyA2NTczIDNhMjAgNjI3OSA3NDY1ICBlcHQtUmFuZ2VzOi5ieXRlCisJMHgwMGUwOiAgNzMwZCAwYTQzIDZmNmUgNzQ2NSA2ZTc0IDJkNGMgNjU2ZSA2Nzc0ICBzLi5Db250ZW50LUxlbmd0CisJMHgwMGYwOiAgNjgzYSAyMDM1IDMyMzUgMzgwZCAwYTRiIDY1NjUgNzAyZCA0MTZjICBoOi41MjU4Li5LZWVwLUFsCisJMHgwMTAwOiAgNjk3NiA2NTNhIDIwNzQgNjk2ZCA2NTZmIDc1NzQgM2QzMSAzNTJjICBpdmU6LnRpbWVvdXQ9MTUsCisJMHgwMTEwOiAgMjA2ZCA2MTc4IDNkMzEgMzAzMCAwZDBhIDQzNmYgNmU2ZSA2NTYzICAubWF4PTEwMC4uQ29ubmVjCisJMHgwMTIwOiAgNzQ2OSA2ZjZlIDNhMjAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1ICB0aW9uOi5LZWVwLUFsaXZlCisJMHgwMTMwOiAgMGQwYSA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAzYTIwICAuLkNvbnRlbnQtVHlwZTouCisJMHgwMTQwOiAgNzQ2NSA3ODc0IDJmNjggNzQ2ZCA2YzNiIDIwNjMgNjg2MSA3MjczICB0ZXh0L2h0bWw7LmNoYXJzCisJMHgwMTUwOiAgNjU3NCAzZDY5IDczNmYgMmQzOCAzODM1IDM5MmQgMzEwZCAwYTBkICBldD1pc28tODg1OS0xLi4uCisJMHgwMTYwOiAgMGEzYyAyMTQ0IDRmNDMgNTQ1OSA1MDQ1IDIwNDggNTQ0ZCA0YzIwICAuPCFET0NUWVBFLkhUTUwuCisJMHgwMTcwOiAgNTA1NSA0MjRjIDQ5NDMgMjAyMiAyZDJmIDJmNTcgMzM0MyAyZjJmICBQVUJMSUMuIi0vL1czQy8vCisJMHgwMTgwOiAgNDQ1NCA0NDIwIDQ4NTQgNGQ0YyAyMDM0IDJlMzAgMzEyMCA1NDcyICBEVEQuSFRNTC40LjAxLlRyCisJMHgwMTkwOiAgNjE2ZSA3MzY5IDc0NjkgNmY2ZSA2MTZjIDJmMmYgNDU0ZSAyMjNlICBhbnNpdGlvbmFsLy9FTiI+CisJMHgwMWEwOiAgMGEzYyA0ODU0IDRkNGMgM2UwYSAzYzQ4IDQ1NDEgNDQzZSAwYTIwICAuPEhUTUw+LjxIRUFEPi4uCisJMHgwMWIwOiAgMjAyMCAzYzRkIDQ1NTQgNDEyMCA0ODU0IDU0NTAgMmQ0NSA1MTU1ICAuLjxNRVRBLkhUVFAtRVFVCisJMHgwMWMwOiAgNDk1NiAzZDIyIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1ICBJVj0iQ29udGVudC1UeXBlCisJMHgwMWQwOiAgMjIyMCA0MzRmIDRlNTQgNDU0ZSA1NDNkIDIyNzQgNjU3OCA3NDJmICAiLkNPTlRFTlQ9InRleHQvCisJMHgwMWUwOiAgNjg3NCA2ZDZjIDNiMjAgNjM2OCA2MTcyIDczNjUgNzQzZCA2OTczICBodG1sOy5jaGFyc2V0PWlzCisJMHgwMWYwOiAgNmYyZCAzODM4IDM1MzkgMmQzMSAyMjNlIDBhMjAgMjAyMCAzYzRkICBvLTg4NTktMSI+Li4uLjxNCisJMHgwMjAwOiAgNDU1NCA0MTIwIDRlNDEgNGQ0NSAzZDIyIDQ0NjUgNzM2MyA3MjY5ICBFVEEuTkFNRT0iRGVzY3JpCisJMHgwMjEwOiAgNzA3NCA2OTZmIDZlMjIgMjA0MyA0ZjRlIDU0NDUgNGU1NCAzZDIyICBwdGlvbiIuQ09OVEVOVD0iCisJMHgwMjIwOiAgNTQ2OCA2NTIwIDY5NmUgNjk3NCA2OTYxIDZjMjAgNjk2ZSA3Mzc0ICBUaGUuaW5pdGlhbC5pbnN0CisJMHgwMjMwOiAgNjE2YyA2YzYxIDc0NjkgNmY2ZSAyMDZmIDY2MjAgNDQ2NSA2MjY5ICBhbGxhdGlvbi5vZi5EZWJpCisJMHgwMjQwOiAgNjE2ZSAyMDYxIDcwNjEgNjM2OCA2NTJlIDIyM2UgMGEyMCAyMDIwICBhbi5hcGFjaGUuIj4uLi4uCisJMHgwMjUwOiAgM2M1NCA0OTU0IDRjNDUgM2U1MCA2YzYxIDYzNjUgNjg2ZiA2YzY0ICA8VElUTEU+UGxhY2Vob2xkCisJMHgwMjYwOiAgNjU3MiAyMDcwIDYxNjcgNjUzYyAyZjU0IDQ5NTQgNGM0NSAzZTBhICBlci5wYWdlPC9USVRMRT4uCisJMHgwMjcwOiAgM2MyZiA0ODQ1IDQxNDQgM2UwYSAzYzQyIDRmNDQgNTkyMCA1NDQ1ICA8L0hFQUQ+LjxCT0RZLlRFCisJMHgwMjgwOiAgNTg1NCAzZDIyIDIzMzAgMzAzMCAzMDMwIDMwMjIgMjA0MiA0NzQzICBYVD0iIzAwMDAwMCIuQkdDCisJMHgwMjkwOiAgNGY0YyA0ZjUyIDNkMjIgMjM0NiA0NjQ2IDQ2NDYgNDYyMiAyMDRjICBPTE9SPSIjRkZGRkZGIi5MCisJMHgwMmEwOiAgNDk0ZSA0YjNkIDIyMjMgMzAzMCAzMDMwIDQ1NDYgMjIyMCA1NjRjICBJTks9IiMwMDAwRUYiLlZMCisJMHgwMmIwOiAgNDk0ZSA0YjNkIDIyMjMgMzUzNSAzMTM4IDM4NDEgMjIyMCA0MTRjICBJTks9IiM1NTE4OEEiLkFMCisJMHgwMmMwOiAgNDk0ZSA0YjNkIDIyMjMgNDY0NiAzMDMwIDMwMzAgMjIzZSAwYTBhICBJTks9IiNGRjAwMDAiPi4uCisJMHgwMmQwOiAgM2M0OCAzMTNlIDUwNmMgNjE2MyA2NTY4IDZmNmMgNjQ2NSA3MjIwICA8SDE+UGxhY2Vob2xkZXIuCisJMHgwMmUwOiAgNzA2MSA2NzY1IDNjMmYgNDgzMSAzZTBhIDNjNDggMzIzZSA0OTY2ICBwYWdlPC9IMT4uPEgyPklmCisJMHgwMmYwOiAgMjA3OSA2Zjc1IDIwNjEgNzI2NSAyMDZhIDc1NzMgNzQyMCA2MjcyICAueW91LmFyZS5qdXN0LmJyCisJMHgwMzAwOiAgNmY3NyA3MzY5IDZlNjcgMjA3NCA2ODY1IDIwNzcgNjU2MiAzYzJmICBvd3NpbmcudGhlLndlYjwvCisJMHgwMzEwOiAgNjgzMiAzZTBhIDBhM2MgNTAzZSA1NDY4IDY1MjAgNmY3NyA2ZTY1ICBoMj4uLjxQPlRoZS5vd25lCisJMHgwMzIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDc3NjUgNjIyMCA3MzY5ICByLm9mLnRoaXMud2ViLnNpCisJMHgwMzMwOiAgNzQ2NSAyMDY4IDYxNzMgMjA2ZSA2Zjc0IDIwNzAgNzU3NCAyMDc1ICB0ZS5oYXMubm90LnB1dC51CisJMHgwMzQwOiAgNzAyMCA2MTZlIDc5MjAgNzc2NSA2MjIwIDcwNjEgNjc2NSA3MzIwICBwLmFueS53ZWIucGFnZXMuCisJMHgwMzUwOiAgNzk2NSA3NDJlIDBhNTAgNmM2NSA2MTczIDY1MjAgNjM2ZiA2ZDY1ICB5ZXQuLlBsZWFzZS5jb21lCisJMHgwMzYwOiAgMjA2MiA2MTYzIDZiMjAgNmM2MSA3NDY1IDcyMmUgM2MyZiA1MDNlICAuYmFjay5sYXRlci48L1A+CisJMHgwMzcwOiAgMGEwYSAzYzUwIDNlM2MgNTM0ZCA0MTRjIDRjM2UgM2M0MyA0OTU0ICAuLjxQPjxTTUFMTD48Q0lUCisJMHgwMzgwOiAgNDUzZSA0ZDZmIDc2NjUgMjA2MSA2YzZmIDZlNjcgMmMyMCA2ZTZmICBFPk1vdmUuYWxvbmcsLm5vCisJMHgwMzkwOiAgNzQ2OCA2OTZlIDY3MjAgNzQ2ZiAyMDczIDY1NjUgMjA2OCA2NTcyICB0aGluZy50by5zZWUuaGVyCisJMHgwM2EwOiAgNjUyZSAyZTJlIDNjMmYgNDM0OSA1NDQ1IDNlMjAgM2EyZCAyOTNjICBlLi4uPC9DSVRFPi46LSk8CisJMHgwM2IwOiAgMmY1MyA0ZDQxIDRjNGMgM2UzYyAyZjUwIDNlMGEgMGEzYyA0ODMyICAvU01BTEw+PC9QPi4uPEgyCisJMHgwM2MwOiAgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgNzQ3MiA3OTY5ICA+SWYueW91LmFyZS50cnlpCisJMHgwM2QwOiAgNmU2NyAyMDc0IDZmMjAgNmM2ZiA2MzYxIDc0NjUgMjA3NCA2ODY1ICBuZy50by5sb2NhdGUudGhlCisJMHgwM2UwOiAgMjA2MSA2NDZkIDY5NmUgNjk3MyA3NDcyIDYxNzQgNmY3MiAyMDZmICAuYWRtaW5pc3RyYXRvci5vCisJMHgwM2YwOiAgNjYyMCA3NDY4IDY5NzMgMjA2ZCA2MTYzIDY4NjkgNmU2NSAzYzJmICBmLnRoaXMubWFjaGluZTwvCisJMHgwNDAwOiAgNDgzMiAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDc3ICBIMj4uLjxQPklmLnlvdS53CisJMHgwNDEwOiAgNjE2ZSA3NDIwIDc0NmYgMjA3MiA2NTcwIDZmNzIgNzQyMCA3MzZmICBhbnQudG8ucmVwb3J0LnNvCisJMHgwNDIwOiAgNmQ2NSA3NDY4IDY5NmUgNjcyMCA2MTYyIDZmNzUgNzQyMCA3NDY4ICBtZXRoaW5nLmFib3V0LnRoCisJMHgwNDMwOiAgNjk3MyAyMDY4IDZmNzMgNzQyNyA3MzIwIDYyNjUgNjg2MSA3NjY5ICBpcy5ob3N0J3MuYmVoYXZpCisJMHgwNDQwOiAgNmY3MiAyYzIwIDcwNmMgNjU2MSA3MzY1IDBhNjMgNmY2ZSA3NDYxICBvciwucGxlYXNlLmNvbnRhCisJMHgwNDUwOiAgNjM3NCAyMDc0IDY4NjUgMjA0OSA2ZTc0IDY1NzIgNmU2NSA3NDIwICBjdC50aGUuSW50ZXJuZXQuCisJMHgwNDYwOiAgNTM2NSA3Mjc2IDY5NjMgNjUyMCA1MDcyIDZmNzYgNjk2NCA2NTcyICBTZXJ2aWNlLlByb3ZpZGVyCisJMHgwNDcwOiAgMjAyOCA0OTUzIDUwMjkgMjA2OSA2ZTc2IDZmNmMgNzY2NSA2NDIwICAuKElTUCkuaW52b2x2ZWQuCisJMHgwNDgwOiAgNjQ2OSA3MjY1IDYzNzQgNmM3OSAyZTNjIDJmNTAgM2UwYSAwYTNjICBkaXJlY3RseS48L1A+Li48CisJMHgwNDkwOiAgNTAzZSA1MzY1IDY1MjAgNzQ2OCA2NTIwIDNjNDEgMjA2OCA3MjY1ICBQPlNlZS50aGUuPEEuaHJlCisJMHgwNGEwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTYyICBmPSJodHRwOi8vd3d3LmFiCisJMHgwNGIwOiAgNzU3MyA2NTJlIDZlNjUgNzQyZiAyMjNlIDRlNjUgNzQ3NyA2ZjcyICB1c2UubmV0LyI+TmV0d29yCisJMHgwNGMwOiAgNmIyMCA0MTYyIDc1NzMgNjUwYSA0MzZjIDY1NjEgNzI2OSA2ZTY3ICBrLkFidXNlLkNsZWFyaW5nCisJMHgwNGQwOiAgNjg2ZiA3NTczIDY1M2MgMmY0MSAzZTIwIDY2NmYgNzIyMCA2ODZmICBob3VzZTwvQT4uZm9yLmhvCisJMHgwNGUwOiAgNzcyMCA3NDZmIDIwNjQgNmYyMCA3NDY4IDY5NzMgMmUzYyAyZjUwICB3LnRvLmRvLnRoaXMuPC9QCisJMHgwNGYwOiAgM2UwYSAwYTNjIDQ4MzIgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyICA+Li48SDI+SWYueW91LmFyCisJMHgwNTAwOiAgNjUyMCA3NDY4IDY1MjAgNjE2NCA2ZDY5IDZlNjkgNzM3NCA3MjYxICBlLnRoZS5hZG1pbmlzdHJhCisJMHgwNTEwOiAgNzQ2ZiA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNmQ2MSA2MzY4ICB0b3Iub2YudGhpcy5tYWNoCisJMHgwNTIwOiAgNjk2ZSA2NTNjIDJmNDggMzIzZSAwYTBhIDNjNTAgM2U1NCA2ODY1ICBpbmU8L0gyPi4uPFA+VGhlCisJMHgwNTMwOiAgMjA2OSA2ZTY5IDc0NjkgNjE2YyAyMDY5IDZlNzMgNzQ2MSA2YzZjICAuaW5pdGlhbC5pbnN0YWxsCisJMHgwNTQwOiAgNjE3NCA2OTZmIDZlMjAgNmY2NiAyMDNjIDQxMjAgNjg3MiA2NTY2ICBhdGlvbi5vZi48QS5ocmVmCisJMHgwNTUwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyICA9Imh0dHA6Ly93d3cuZGViCisJMHgwNTYwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDQ0NjUgNjI2OSA2MTZlICBpYW4ub3JnLyI+RGViaWFuCisJMHgwNTcwOiAgMjc3MyAwYTYxIDcwNjEgNjM2OCA2NTNjIDJmNDEgM2UyMCA3NzY1ICAncy5hcGFjaGU8L0E+LndlCisJMHgwNTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1ICBiLnNlcnZlci5wYWNrYWdlCisJMHgwNTkwOiAgMjA3NyA2MTczIDIwNzMgNzU2MyA2MzY1IDczNzMgNjY3NSA2YzJlICAud2FzLnN1Y2Nlc3NmdWwuCisJMHgwNWEwOiAgM2MyZiA1MDNlIDBhMGEgM2M1MCAzZTNjIDUzNTQgNTI0ZiA0ZTQ3ICA8L1A+Li48UD48U1RST05HCisJMHgwNWIwOiAgM2U1OSA2Zjc1IDIwNzMgNjg2ZiA3NTZjIDY0MjAgNzI2NSA3MDZjICA+WW91LnNob3VsZC5yZXBsCisJMHgwNWMwOiAgNjE2MyA2NTIwIDc0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzY5ICBhY2UudGhpcy5wYWdlLndpCisJMHgwNWQwOiAgNzQ2OCAyMDc5IDZmNzUgNzIyMCA2Zjc3IDZlMjAgNzc2NSA2MjIwICB0aC55b3VyLm93bi53ZWIuCisJMHgwNWUwOiAgNzA2MSA2NzY1IDczMjAgNjE3MyAwYTczIDZmNmYgNmUyMCA2MTczICBwYWdlcy5hcy5zb29uLmFzCisJMHgwNWYwOiAgMjA3MCA2ZjczIDczNjkgNjI2YyA2NTJlIDNjMmYgNTM1NCA1MjRmICAucG9zc2libGUuPC9TVFJPCisJMHgwNjAwOiAgNGU0NyAzZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgNTU2ZSA2YzY1ICBORz48L1A+Li48UD5VbmxlCisJMHgwNjEwOiAgNzM3MyAyMDc5IDZmNzUgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDY5ICBzcy55b3UuY2hhbmdlZC5pCisJMHgwNjIwOiAgNzQ3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjEgNzQ2OSA2ZjZlICB0cy5jb25maWd1cmF0aW9uCisJMHgwNjMwOiAgMmMyMCA3OTZmIDc1NzIgMjA2ZSA2NTc3IDIwNzMgNjU3MiA3NjY1ICAsLnlvdXIubmV3LnNlcnZlCisJMHgwNjQwOiAgNzIyMCA2OTczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2NSA2NDIwICByLmlzLmNvbmZpZ3VyZWQuCisJMHgwNjUwOiAgNjE3MyAyMDY2IDZmNmMgNmM2ZiA3NzczIDNhMGEgM2M1NSA0YzNlICBhcy5mb2xsb3dzOi48VUw+CisJMHgwNjYwOiAgMGEzYyA0YzQ5IDNlMGEgNDM2ZiA2ZTY2IDY5NjcgNzU3MiA2MTc0ICAuPExJPi5Db25maWd1cmF0CisJMHgwNjcwOiAgNjk2ZiA2ZTIwIDY2NjkgNmM2NSA3MzIwIDYzNjEgNmUyMCA2MjY1ICBpb24uZmlsZXMuY2FuLmJlCisJMHgwNjgwOiAgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjY1ICAuZm91bmQuaW4uPFRUPi9lCisJMHgwNjkwOiAgNzQ2MyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjICB0Yy9hcGFjaGU8L1RUPi48CisJMHgwNmEwOiAgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjICAvTEk+Li48TEk+LlRoZS48CisJMHgwNmIwOiAgNTQ1NCAzZTQ0IDZmNjMgNzU2ZCA2NTZlIDc0NTIgNmY2ZiA3NDNjICBUVD5Eb2N1bWVudFJvb3Q8CisJMHgwNmMwOiAgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgNjk3MyAyMDc0ICAvVFQ+LC53aGljaC5pcy50CisJMHgwNmQwOiAgNjg2NSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA3NSA2ZTY0ICBoZS5kaXJlY3RvcnkudW5kCisJMHgwNmUwOiAgNjU3MiAyMDc3IDY4NjkgNjM2OCAyMDYxIDZjNmMgMjA3OSA2Zjc1ICBlci53aGljaC5hbGwueW91CisJMHgwNmYwOiAgNzIwYSA0ODU0IDRkNGMgMjA2NiA2OTZjIDY1NzMgMjA3MyA2ODZmICByLkhUTUwuZmlsZXMuc2hvCisJMHgwNzAwOiAgNzU2YyA2NDIwIDY1NzggNjk3MyA3NDJjIDIwNjkgNzMyMCA3MzY1ICB1bGQuZXhpc3QsLmlzLnNlCisJMHgwNzEwOiAgNzQyMCA3NDZmIDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3ICB0LnRvLjxUVD4vdmFyL3d3CisJMHgwNzIwOiAgNzczYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjICB3PC9UVD4uPC9MST4uLjxMCisJMHgwNzMwOiAgNDkzZSAwYTQzIDQ3NDkgMjA3MyA2MzcyIDY5NzAgNzQ3MyAyMDYxICBJPi5DR0kuc2NyaXB0cy5hCisJMHgwNzQwOiAgNzI2NSAyMDZjIDZmNmYgNmI2NSA2NDIwIDY2NmYgNzIyMCA2OTZlICByZS5sb29rZWQuZm9yLmluCisJMHgwNzUwOiAgMjAzYyA1NDU0IDNlMmYgNzU3MyA3MjJmIDZjNjkgNjIyZiA2MzY3ICAuPFRUPi91c3IvbGliL2NnCisJMHgwNzYwOiAgNjkyZCA2MjY5IDZlM2MgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzICBpLWJpbjwvVFQ+LC53aGljCisJMHgwNzcwOiAgNjgyMCA2OTczIDIwNzcgNjg2NSA3MjY1IDBhNDQgNjU2MiA2OTYxICBoLmlzLndoZXJlLkRlYmlhCisJMHgwNzgwOiAgNmUyMCA3MDYxIDYzNmIgNjE2NyA2NTczIDIwNzcgNjk2YyA2YzIwICBuLnBhY2thZ2VzLndpbGwuCisJMHgwNzkwOiAgNzA2YyA2MTYzIDY1MjAgNzQ2OCA2NTY5IDcyMjAgNzM2MyA3MjY5ICBwbGFjZS50aGVpci5zY3JpCisJMHgwN2EwOiAgNzA3NCA3MzJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhICBwdHMuPC9MST4uLjxMST4uCisJMHgwN2IwOiAgNGM2ZiA2NzIwIDY2NjkgNmM2NSA3MzIwIDYxNzIgNjUyMCA3MDZjICBMb2cuZmlsZXMuYXJlLnBsCisJMHgwN2MwOiAgNjE2MyA2NTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY3NiA2MTcyICBhY2VkLmluLjxUVD4vdmFyCisJMHgwN2QwOiAgMmY2YyA2ZjY3IDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlICAvbG9nL2FwYWNoZTwvVFQ+CisJMHgwN2UwOiAgMmMyMCA2MTZlIDY0MjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA3MjZmICAsLmFuZC53aWxsLmJlLnJvCisJMHgwN2YwOiAgNzQ2MSA3NDY1IDY0MGEgNzc2NSA2NTZiIDZjNzkgMmUyMCAyMDU0ICB0YXRlZC53ZWVrbHkuLi5UCisJMHgwODAwOiAgNjg2NSAyMDY2IDcyNjUgNzE3NSA2NTZlIDYzNzkgMjA2ZiA2NjIwICBoZS5mcmVxdWVuY3kub2YuCisJMHgwODEwOiAgNzI2ZiA3NDYxIDc0NjkgNmY2ZSAyMDYzIDYxNmUgMjA2MiA2NTIwICByb3RhdGlvbi5jYW4uYmUuCisJMHgwODIwOiAgNjU2MSA3MzY5IDZjNzkgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDYyICBlYXNpbHkuY2hhbmdlZC5iCisJMHgwODMwOiAgNzkyMCA2NTY0IDY5NzQgNjk2ZSA2NzBhIDNjNTQgNTQzZSAyZjY1ICB5LmVkaXRpbmcuPFRUPi9lCisJMHgwODQwOiAgNzQ2MyAyZjZjIDZmNjcgNzI2ZiA3NDYxIDc0NjUgMmU2NCAyZjYxICB0Yy9sb2dyb3RhdGUuZC9hCisJMHgwODUwOiAgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlICBwYWNoZTwvVFQ+LjwvTEk+CisJMHgwODYwOiAgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwNjQgNjU2NiA2MTc1ICAuLjxMST4uVGhlLmRlZmF1CisJMHgwODcwOiAgNmM3NCAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2OSA2ZTY0ICBsdC5kaXJlY3RvcnkuaW5kCisJMHgwODgwOiAgNjU3OCAyMDY5IDczMjAgM2M1NCA1NDNlIDY5NmUgNjQ2NSA3ODJlICBleC5pcy48VFQ+aW5kZXguCisJMHgwODkwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTJjIDIwNmQgNjU2MSA2ZTY5ICBodG1sPC9UVD4sLm1lYW5pCisJMHgwOGEwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCA3MjY1IDcxNzUgNjU3MyA3NDczICBuZy50aGF0LnJlcXVlc3RzCisJMHgwOGIwOiAgMGE2NiA2ZjcyIDIwNjEgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5ICAuZm9yLmEuZGlyZWN0b3J5CisJMHgwOGMwOiAgMjAzYyA1NDU0IDNlMmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiAzYzJmICAuPFRUPi9mb28vYmFyLzwvCisJMHgwOGQwOiAgNTQ1NCAzZTIwIDc3NjkgNmM2YyAyMDY3IDY5NzYgNjUyMCA3NDY4ICBUVD4ud2lsbC5naXZlLnRoCisJMHgwOGUwOiAgNjUyMCA2MzZmIDZlNzQgNjU2ZSA3NDczIDIwNmYgNjYyMCA3NDY4ICBlLmNvbnRlbnRzLm9mLnRoCisJMHgwOGYwOiAgNjUyMCA2NjY5IDZjNjUgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmICBlLmZpbGUuPFRUPi92YXIvCisJMHgwOTAwOiAgNzc3NyA3NzJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgNjk2ZSA2NDY1ICB3d3cvZm9vL2Jhci9pbmRlCisJMHgwOTEwOiAgNzgyZSA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMGEgNjk2NiAyMDY5ICB4Lmh0bWw8L1RUPi5pZi5pCisJMHgwOTIwOiAgNzQyMCA2NTc4IDY5NzMgNzQ3MyAyMDI4IDYxNzMgNzM3NSA2ZDY5ICB0LmV4aXN0cy4oYXNzdW1pCisJMHgwOTMwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCAzYzU0IDU0M2UgMmY3NiA2MTcyICBuZy50aGF0LjxUVD4vdmFyCisJMHgwOTQwOiAgMmY3NyA3Nzc3IDNjMmYgNTQ1NCAzZTIwIDY5NzMgMjA3OSA2Zjc1ICAvd3d3PC9UVD4uaXMueW91CisJMHgwOTUwOiAgNzIyMCAzYzU0IDU0M2UgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA1MjZmICByLjxUVD5Eb2N1bWVudFJvCisJMHgwOTYwOiAgNmY3NCAzYzJmIDU0NTQgM2UyOSAyZTNjIDJmNGMgNDkzZSAwYTBhICBvdDwvVFQ+KS48L0xJPi4uCisJMHgwOTcwOiAgM2M0YyA0OTNlIDBhNTUgNzM2NSA3MjIwIDY0NjkgNzI2NSA2Mzc0ICA8TEk+LlVzZXIuZGlyZWN0CisJMHgwOTgwOiAgNmY3MiA2OTY1IDczMjAgNjE3MiA2NTIwIDY1NmUgNjE2MiA2YzY1ICBvcmllcy5hcmUuZW5hYmxlCisJMHgwOTkwOiAgNjQyYyAyMDYxIDZlNjQgMjA3NSA3MzY1IDcyMjAgNjQ2ZiA2Mzc1ICBkLC5hbmQudXNlci5kb2N1CisJMHgwOWEwOiAgNmQ2NSA2ZTc0IDczMjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA2YzZmICBtZW50cy53aWxsLmJlLmxvCisJMHgwOWIwOiAgNmY2YiA2NTY0IDIwNjYgNmY3MiAwYTY5IDZlMjAgNzQ2OCA2NTIwICBva2VkLmZvci5pbi50aGUuCisJMHgwOWMwOiAgM2M1NCA1NDNlIDcwNzUgNjI2YyA2OTYzIDVmNjggNzQ2ZCA2YzNjICA8VFQ+cHVibGljX2h0bWw8CisJMHgwOWQwOiAgMmY1NCA1NDNlIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDZmICAvVFQ+LmRpcmVjdG9yeS5vCisJMHgwOWUwOiAgNjYyMCA3NDY4IDY1MjAgNzU3MyA2NTcyIDczMjcgMjA2OCA2ZjZkICBmLnRoZS51c2VycycuaG9tCisJMHgwOWYwOiAgNjU3MyAyZTIwIDIwNTQgNjg2NSA3MzY1IDIwNjQgNjk3MiA3MzBhICBlcy4uLlRoZXNlLmRpcnMuCisJMHgwYTAwOiAgNzM2OCA2Zjc1IDZjNjQgMjA2MiA2NTIwIDc1NmUgNjQ2NSA3MjIwICBzaG91bGQuYmUudW5kZXIuCisJMHgwYTEwOiAgM2M1NCA1NDNlIDJmNjggNmY2ZCA2NTNjIDJmNTQgNTQzZSAyYzIwICA8VFQ+L2hvbWU8L1RUPiwuCisJMHgwYTIwOiAgNjE2ZSA2NDIwIDc1NzMgNjU3MiA3MzIwIDc3NjkgNmM2YyAyMDZlICBhbmQudXNlcnMud2lsbC5uCisJMHgwYTMwOiAgNmY3NCAyMDYyIDY1MjAgNjE2MiA2YzY1IDIwNzQgNmYyMCA3Mzc5ICBvdC5iZS5hYmxlLnRvLnN5CisJMHgwYTQwOiAgNmQ2YyA2OTZlIDZiMGEgNzQ2ZiAyMDY2IDY5NmMgNjU3MyAyMDc0ICBtbGluay50by5maWxlcy50CisJMHgwYTUwOiAgNjg2NSA3OTIwIDY0NmYgNmUyNyA3NDIwIDZmNzcgNmUyZSAzYzJmICBoZXkuZG9uJ3Qub3duLjwvCisJMHgwYTYwOiAgNGM0OSAzZTBhIDBhM2MgMmY1NSA0YzNlIDBhNDEgNmM2YyAyMDc0ICBMST4uLjwvVUw+LkFsbC50CisJMHgwYTcwOiAgNjg2NSAyMDczIDc0NjEgNmU2NCA2MTcyIDY0MjAgNjE3MCA2MTYzICBoZS5zdGFuZGFyZC5hcGFjCisJMHgwYTgwOiAgNjg2NSAyMDZkIDZmNjQgNzU2YyA2NTczIDIwNjEgNzI2NSAyMDYxICBoZS5tb2R1bGVzLmFyZS5hCisJMHgwYTkwOiAgNzY2MSA2OTZjIDYxNjIgNmM2NSAyMDc3IDY5NzQgNjgyMCA3NDY4ICB2YWlsYWJsZS53aXRoLnRoCisJMHgwYWEwOiAgNjk3MyAyMDcyIDY1NmMgNjU2MSA3MzY1IDIwNjEgNmU2NCAyMDYxICBpcy5yZWxlYXNlLmFuZC5hCisJMHgwYWIwOiAgNzI2NSAwYTZlIDZmNzcgMjA2ZCA2MTZlIDYxNjcgNjU2NCAyMDc3ICByZS5ub3cubWFuYWdlZC53CisJMHgwYWMwOiAgNjk3NCA2ODIwIDY0NjUgNjI2MyA2ZjZlIDY2MmUgMjAyMCA1NDc5ICBpdGguZGViY29uZi4uLlR5CisJMHgwYWQwOiAgNzA2NSAyMDNjIDU0NTQgM2U2NCA3MDZiIDY3MmQgNzI2NSA2MzZmICBwZS48VFQ+ZHBrZy1yZWNvCisJMHgwYWUwOiAgNmU2NiA2OTY3IDc1NzIgNjUyMCA2MTcwIDYxNjMgNjg2NSAzYzJmICBuZmlndXJlLmFwYWNoZTwvCisJMHgwYWYwOiAgNTQ1NCAzZTIwIDc0NmYgMGE3MyA2NTZjIDY1NjMgNzQyMCA3NzY4ICBUVD4udG8uc2VsZWN0LndoCisJMHgwYjAwOiAgNjk2MyA2ODIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgNzk2ZiA3NTIwICBpY2gubW9kdWxlcy55b3UuCisJMHgwYjEwOiAgNzc2MSA2ZTc0IDIwNjUgNmU2MSA2MjZjIDY1NjQgMmUyMCAyMDRkICB3YW50LmVuYWJsZWQuLi5NCisJMHgwYjIwOiAgNjE2ZSA3OTIwIDZmNzQgNjg2NSA3MjIwIDZkNmYgNjQ3NSA2YzY1ICBhbnkub3RoZXIubW9kdWxlCisJMHgwYjMwOiAgNzMyMCA2MTcyIDY1MjAgNjE3NiA2MTY5IDZjNjEgNjI2YyA2NTBhICBzLmFyZS5hdmFpbGFibGUuCisJMHgwYjQwOiAgNzQ2OCA3MjZmIDc1NjcgNjgyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5ICB0aHJvdWdoLnRoZS5EZWJpCisJMHgwYjUwOiAgNjE2ZSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzMgNzk3MyA3NDY1ICBhbi5wYWNrYWdlLnN5c3RlCisJMHgwYjYwOiAgNmQyMCA3NzY5IDc0NjggMjA3NCA2ODY1IDIwNmUgNjE2ZCA2NTczICBtLndpdGgudGhlLm5hbWVzCisJMHgwYjcwOiAgMjAzYyA1NDU0IDNlNmMgNjk2MiA2MTcwIDYxNjMgNjg2NSAyZDZkICAuPFRUPmxpYmFwYWNoZS1tCisJMHgwYjgwOiAgNmY2NCAyZDJhIDNjMmYgNTQ1NCAzZTJlIDBhNDkgNjYyMCA3OTZmICBvZC0qPC9UVD4uLklmLnlvCisJMHgwYjkwOiAgNzUyMCA2ZTY1IDY1NjQgMjA3NCA2ZjIwIDYzNmYgNmQ3MCA2OTZjICB1Lm5lZWQudG8uY29tcGlsCisJMHgwYmEwOiAgNjUyMCA2MTIwIDZkNmYgNjQ3NSA2YzY1IDIwNzkgNmY3NSA3MjczICBlLmEubW9kdWxlLnlvdXJzCisJMHgwYmIwOiAgNjU2YyA2NjJjIDIwNzkgNmY3NSAyMDc3IDY5NmMgNmMyMCA2ZTY1ICBlbGYsLnlvdS53aWxsLm5lCisJMHgwYmMwOiAgNjU2NCAyMDc0IDZmMjAgNjk2ZSA3Mzc0IDYxNmMgNmMyMCA3NDY4ICBlZC50by5pbnN0YWxsLnRoCisJMHgwYmQwOiAgNjUwYSAzYzU0IDU0M2UgNjE3MCA2MTYzIDY4NjUgMmQ2NCA2NTc2ICBlLjxUVD5hcGFjaGUtZGV2CisJMHgwYmUwOiAgM2MyZiA1NDU0IDNlMjAgNzA2MSA2MzZiIDYxNjcgNjUyZSAwYTBhICA8L1RUPi5wYWNrYWdlLi4uCisJMHgwYmYwOiAgM2M1MCAzZTRkIDZmNzIgNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0ICA8UD5Nb3JlLmRvY3VtZW50CisJMHgwYzAwOiAgNjE3NCA2OTZmIDZlMjAgNmY2ZSAyMDQxIDcwNjEgNjM2OCA2NTIwICBhdGlvbi5vbi5BcGFjaGUuCisJMHgwYzEwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2ZiA2ZTNhICBjYW4uYmUuZm91bmQub246CisJMHgwYzIwOiAgMGEzYyA1NTRjIDNlMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjICAuPFVMPi48TEk+LlRoZS48CisJMHgwYzMwOiAgNDEyMCA0ODUyIDQ1NDYgM2QyMiAyZjY0IDZmNjMgMmY2MSA3MDYxICBBLkhSRUY9Ii9kb2MvYXBhCisJMHgwYzQwOiAgNjM2OCA2NTJkIDY0NmYgNjMyZiA2ZDYxIDZlNzUgNjE2YyAyZjIyICBjaGUtZG9jL21hbnVhbC8iCisJMHgwYzUwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0ICA+QXBhY2hlLmRvY3VtZW50CisJMHgwYzYwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDczNzQgNmY3MiA2NTY0ICBhdGlvbjwvQT4uc3RvcmVkCisJMHgwYzcwOiAgMjA2ZiA2ZTIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjJlICAub24ueW91ci5zZXJ2ZXIuCisJMHgwYzgwOiAgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwICA8L0xJPi4uPExJPi5UaGUuCisJMHgwYzkwOiAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmICA8QS5IUkVGPSJodHRwOi8vCisJMHgwY2EwOiAgNzc3NyA3NzJlIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyICB3d3cuYXBhY2hlLm9yZy8iCisJMHgwY2IwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA1MDcyIDZmNmEgNjU2MyA3NDNjICA+QXBhY2hlLlByb2plY3Q8CisJMHgwY2MwOiAgMmY0MSAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmICAvQT4uaG9tZS5zaXRlLjwvCisJMHgwY2QwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxICBMST4uLjxMST4uVGhlLjxBCisJMHgwY2UwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3ICAuSFJFRj0iaHR0cDovL3d3CisJMHgwY2YwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZDczIDczNmMgMmU2ZiA3MjY3ICB3LmFwYWNoZS1zc2wub3JnCisJMHgwZDAwOiAgMmYyMiAzZTQxIDcwNjEgNjM2OCA2NTJkIDUzNTMgNGMzYyAyZjQxICAvIj5BcGFjaGUtU1NMPC9BCisJMHgwZDEwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5ICA+LmhvbWUuc2l0ZS48L0xJCisJMHgwZDIwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4ICA+Li48TEk+LlRoZS48QS5ICisJMHgwZDMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzA2NSA3MjZjICBSRUY9Imh0dHA6Ly9wZXJsCisJMHgwZDQwOiAgMmU2MSA3MDYxIDYzNjggNjUyZSA2ZjcyIDY3MmYgMjIzZSA2ZDZmICAuYXBhY2hlLm9yZy8iPm1vCisJMHgwZDUwOiAgNjQyMCA3MDY1IDcyNmMgM2MyZiA0MTNlIDIwNjggNmY2ZCA2NTIwICBkLnBlcmw8L0E+LmhvbWUuCisJMHgwZDYwOiAgNzM2OSA3NDY1IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlICBzaXRlLjwvTEk+Li48TEk+CisJMHgwZDcwOiAgMGE1NCA2ODY1IDIwM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICAuVGhlLjxBLkhSRUY9Imh0CisJMHgwZDgwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYxIDcwNjEgNjM2OCA2NTc3ICB0cDovL3d3dy5hcGFjaGV3CisJMHgwZDkwOiAgNjU2NSA2YjJlIDYzNmYgNmQyZiAyMjNlIDQxNzAgNjE2MyA2ODY1ICBlZWsuY29tLyI+QXBhY2hlCisJMHgwZGEwOiAgNTc2NSA2NTZiIDNjMmYgNDEzZSAyMDZlIDY1NzcgNzM2YyA2NTc0ICBXZWVrPC9BPi5uZXdzbGV0CisJMHgwZGIwOiAgNzQ2NSA3MjJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhICB0ZXIuPC9MST4uLjxMST4uCisJMHgwZGMwOiAgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0ICBUaGUuPEEuSFJFRj0iaHR0CisJMHgwZGQwOiAgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1IDYyNjkgNjE2ZSAyZTZmICBwOi8vd3d3LmRlYmlhbi5vCisJMHgwZGUwOiAgNzI2NyAyZjY0IDZmNjMgMmYyMiAzZTQ0IDY1NjIgNjk2MSA2ZTIwICByZy9kb2MvIj5EZWJpYW4uCisJMHgwZGYwOiAgNTA3MiA2ZjZhIDY1NjMgNzQwYSA0NDZmIDYzNzUgNmQ2NSA2ZTc0ICBQcm9qZWN0LkRvY3VtZW50CisJMHgwZTAwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDc3NjggNjk2MyA2ODIwICBhdGlvbjwvQT4ud2hpY2guCisJMHgwZTEwOiAgNjM2ZiA2ZTc0IDYxNjkgNmU3MyAyMDQ4IDRmNTcgNTQ0ZiA3MzJjICBjb250YWlucy5IT1dUT3MsCisJMHgwZTIwOiAgMjA0NiA0MTUxIDczMmMgMjA2MSA2ZTY0IDIwNzMgNmY2NiA3NDc3ICAuRkFRcywuYW5kLnNvZnR3CisJMHgwZTMwOiAgNjE3MiA2NTIwIDc1NzAgNjQ2MSA3NDY1IDczMmUgM2MyZiA0YzQ5ICBhcmUudXBkYXRlcy48L0xJCisJMHgwZTQwOiAgM2UwYSAzYzJmIDU1NGMgM2UwYSAwYTNjIDUwM2UgNTk2ZiA3NTIwICA+LjwvVUw+Li48UD5Zb3UuCisJMHgwZTUwOiAgNjM2MSA2ZTIwIDYxNmMgNzM2ZiAyMDYzIDZmNmUgNzM3NSA2Yzc0ICBjYW4uYWxzby5jb25zdWx0CisJMHgwZTYwOiAgMjA3NCA2ODY1IDIwNmMgNjk3MyA3NDIwIDZmNjYgMjAzYyA0MTIwICAudGhlLmxpc3Qub2YuPEEuCisJMHgwZTcwOiAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3ICBIUkVGPSJodHRwOi8vd3d3CisJMHgwZTgwOiAgMmU2MiA2Zjc1IDc0NjUgNmM2YyAyZTYzIDZmNmQgMmY2NiA2MTcxICAuYm91dGVsbC5jb20vZmFxCisJMHgwZTkwOiAgMmYyMiAzZTU3IDZmNzIgNmM2NCAwYTU3IDY5NjQgNjUyMCA1NzY1ICAvIj5Xb3JsZC5XaWRlLldlCisJMHgwZWEwOiAgNjIyMCA0NjcyIDY1NzEgNzU2NSA2ZTc0IDZjNzkgMjA0MSA3MzZiICBiLkZyZXF1ZW50bHkuQXNrCisJMHgwZWIwOiAgNjU2NCAyMDUxIDc1NjUgNzM3NCA2OTZmIDZlNzMgM2MyZiA0MTNlICBlZC5RdWVzdGlvbnM8L0E+CisJMHgwZWMwOiAgMjA2NiA2ZjcyIDIwNjkgNmU2NiA2ZjcyIDZkNjEgNzQ2OSA2ZjZlICAuZm9yLmluZm9ybWF0aW9uCisJMHgwZWQwOiAgMmUwYSAwYTNjIDQ4MzIgM2U0YyA2NTc0IDIwNmYgNzQ2OCA2NTcyICAuLi48SDI+TGV0Lm90aGVyCisJMHgwZWUwOiAgMjA3MCA2NTZmIDcwNmMgNjUyMCA2YjZlIDZmNzcgMjA2MSA2MjZmICAucGVvcGxlLmtub3cuYWJvCisJMHgwZWYwOiAgNzU3NCAyMDc0IDY4NjkgNzMyMCA3MzY1IDcyNzYgNjU3MiAzYzJmICB1dC50aGlzLnNlcnZlcjwvCisJMHgwZjAwOiAgNDgzMiAzZTBhIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICBIMj4uLjxBLkhSRUY9Imh0CisJMHgwZjEwOiAgNzQ3MCAzYTJmIDJmNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmICB0cDovL25ldGNyYWZ0LmNvCisJMHgwZjIwOiAgNmQyZiAyMjNlIDRlNjUgNzQ2MyA3MjYxIDY2NzQgM2MyZiA0MTNlICBtLyI+TmV0Y3JhZnQ8L0E+CisJMHgwZjMwOiAgMjA3MCA3MjZmIDc2NjkgNjQ2NSA3MzIwIDYxNmUgMjA2OSA2ZTc0ICAucHJvdmlkZXMuYW4uaW50CisJMHgwZjQwOiAgNjU3MiA2NTczIDc0NjkgNmU2NyAyMDY2IDcyNjUgNjUwYSA3MzY1ICBlcmVzdGluZy5mcmVlLnNlCisJMHgwZjUwOiAgNzI3NiA2OTYzIDY1MjAgNjY2ZiA3MjIwIDc3NjUgNjIyMCA3MzY5ICBydmljZS5mb3Iud2ViLnNpCisJMHgwZjYwOiAgNzQ2NSAyMDZkIDZmNmUgNjk3NCA2ZjcyIDY5NmUgNjcyMCA2MTZlICB0ZS5tb25pdG9yaW5nLmFuCisJMHgwZjcwOiAgNjQyMCA3Mzc0IDYxNzQgNjk3MyA3NDY5IDYzMjAgNjM2ZiA2YzZjICBkLnN0YXRpc3RpYy5jb2xsCisJMHgwZjgwOiAgNjU2MyA3NDY5IDZmNmUgMmUwYSA1OTZmIDc1MjAgNjM2MSA2ZTIwICBlY3Rpb24uLllvdS5jYW4uCisJMHgwZjkwOiAgNmM2NSA3NDIwIDc0NjggNjU2ZCAyMDZiIDZlNmYgNzcyMCA2MTYyICBsZXQudGhlbS5rbm93LmFiCisJMHgwZmEwOiAgNmY3NSA3NDIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjIwICBvdXQueW91ci5zZXJ2ZXIuCisJMHgwZmIwOiAgNzU3MyA2OTZlIDY3MjAgNzQ2OCA2NTY5IDcyMGEgM2M0MSAyMDQ4ICB1c2luZy50aGVpci48QS5ICisJMHgwZmMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzU3MCA3NDY5ICBSRUY9Imh0dHA6Ly91cHRpCisJMHgwZmQwOiAgNmQ2NSAyZTZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmICBtZS5uZXRjcmFmdC5jb20vCisJMHgwZmUwOiAgMjIzZSA2OTZlIDc0NjUgNzI2NiA2MTYzIDY1M2MgMmY0MSAzZTJlICAiPmludGVyZmFjZTwvQT4uCisJMHgwZmYwOiAgMGE0NSA2ZTYxIDYyNmMgNjk2ZSA2NzIwIDc0NjggNjUyMCA2ZDZmICAuRW5hYmxpbmcudGhlLm1vCisJMHgxMDAwOiAgNmU2OSA3NDZmIDcyNjkgNmU2NyAyMDZmIDY2MjAgNzk2ZiA3NTcyICBuaXRvcmluZy5vZi55b3VyCisJMHgxMDEwOiAgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NzY5IDZjNmMgMjA3MCA3MjZmICAuc2VydmVyLndpbGwucHJvCisJMHgxMDIwOiAgNzY2OSA2NDY1IDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIyMCA2NzZjICB2aWRlLmEuYmV0dGVyLmdsCisJMHgxMDMwOiAgNmY2MiA2MTZjIDIwNmYgNzY2NSA3Mjc2IDY5NjUgNzcwYSA2ZjY2ICBvYmFsLm92ZXJ2aWV3Lm9mCisJMHgxMDQwOiAgMjA3NyA2ODZmIDIwNjkgNzMyMCA3NTczIDY5NmUgNjcyMCA3NzY4ICAud2hvLmlzLnVzaW5nLndoCisJMHgxMDUwOiAgNjE3NCAyMDYxIDZlNjQgMjA3NyA2ODY1IDcyNjUgMmMyMCA2MTZlICBhdC5hbmQud2hlcmUsLmFuCisJMHgxMDYwOiAgNjQyMCA2OTc0IDIwNzcgNmY3NSA2YzY0IDIwNjcgNjk3NiA2NTIwICBkLml0LndvdWxkLmdpdmUuCisJMHgxMDcwOiAgNDQ2NSA2MjY5IDYxNmUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjBhICBEZWJpYW4uYS5iZXR0ZXIuCisJMHgxMDgwOiAgNmY3NiA2NTcyIDc2NjkgNjU3NyAyMDZmIDY2MjAgNzQ2OCA2NTIwICBvdmVydmlldy5vZi50aGUuCisJMHgxMDkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc1ICBhcGFjaGUucGFja2FnZS51CisJMHgxMGEwOiAgNzM2MSA2NzY1IDJlMGEgMGEzYyA0ODMyIDNlNDEgNjI2ZiA3NTc0ICBzYWdlLi4uPEgyPkFib3V0CisJMHgxMGIwOiAgMjA3NCA2ODY5IDczMjAgNzA2MSA2NzY1IDNjMmYgNDgzMiAzZTBhICAudGhpcy5wYWdlPC9IMj4uCisJMHgxMGMwOiAgMGEzYyA0OTRkIDQ3MjAgNDE0YyA0OTQ3IDRlM2QgMjI3MiA2OTY3ICAuPElNRy5BTElHTj0icmlnCisJMHgxMGQwOiAgNjg3NCAyMjIwIDQxNGMgNTQzZCAyMjIyIDIwNDggNDU0OSA0NzQ4ICBodCIuQUxUPSIiLkhFSUdICisJMHgxMGUwOiAgNTQzZCAyMjMyIDM0MzcgMjIyMCA1NzQ5IDQ0NTQgNDgzZCAyMjMyICBUPSIyNDciLldJRFRIPSIyCisJMHgxMGYwOiAgMzczOCAyMjIwIDUzNTIgNDMzZCAyMjY5IDYzNmYgNmU3MyAyZjZhICA3OCIuU1JDPSJpY29ucy9qCisJMHgxMTAwOiAgNjg2NSAzMDM2IDMxMmUgNzA2ZSA2NzIyIDNlMGEgMGEzYyA1MDNlICBoZTA2MS5wbmciPi4uPFA+CisJMHgxMTEwOiAgNTQ2OCA2OTczIDIwNjkgNzMyMCA2MTIwIDcwNmMgNjE2MyA2NTY4ICBUaGlzLmlzLmEucGxhY2VoCisJMHgxMTIwOiAgNmY2YyA2NDY1IDcyMjAgNzA2MSA2NzY1IDIwNjkgNmU3MyA3NDYxICBvbGRlci5wYWdlLmluc3RhCisJMHgxMTMwOiAgNmM2YyA2NTY0IDIwNjIgNzkyMCA3NDY4IDY1MjAgM2M0MSAwYTQ4ICBsbGVkLmJ5LnRoZS48QS5ICisJMHgxMTQwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlICBSRUY9Imh0dHA6Ly93d3cuCisJMHgxMTUwOiAgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3IDJmMjIgM2U0NCA2NTYyICBkZWJpYW4ub3JnLyI+RGViCisJMHgxMTYwOiAgNjk2MSA2ZTNjIDJmNDEgM2UwYSA3MjY1IDZjNjUgNjE3MyA2NTIwICBpYW48L0E+LnJlbGVhc2UuCisJMHgxMTcwOiAgNmY2NiAyMDc0IDY4NjUgMjA2MSA3MDYxIDYzNjggNjUyMCA1NzY1ICBvZi50aGUuYXBhY2hlLldlCisJMHgxMTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1ICBiLnNlcnZlci5wYWNrYWdlCisJMHgxMTkwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2OTczIDIwNjMgNmY2ZCA3MDc1ICAuLi48UD5UaGlzLmNvbXB1CisJMHgxMWEwOiAgNzQ2NSA3MjIwIDY4NjEgNzMyMCA2OTZlIDczNzQgNjE2YyA2YzY1ICB0ZXIuaGFzLmluc3RhbGxlCisJMHgxMWIwOiAgNjQyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgMjA0NyA0ZTU1ICBkLnRoZS5EZWJpYW4uR05VCisJMHgxMWMwOiAgMmY0YyA2OTZlIDc1NzggMjA2ZiA3MDY1IDcyNjEgNzQ2OSA2ZTY3ICAvTGludXgub3BlcmF0aW5nCisJMHgxMWQwOiAgMjA3MyA3OTczIDc0NjUgNmQyYyAwYTYyIDc1NzQgMjA2OSA3NDIwICAuc3lzdGVtLC5idXQuaXQuCisJMHgxMWUwOiAgNjg2MSA3MzIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDY4ICBoYXMuPHN0cm9uZz5ub3RoCisJMHgxMWYwOiAgNjk2ZSA2NzIwIDc0NmYgMjA2NCA2ZjIwIDc3NjkgNzQ2OCAyMDc0ICBpbmcudG8uZG8ud2l0aC50CisJMHgxMjAwOiAgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSA2NTYzICBoZS5EZWJpYW4uUHJvamVjCisJMHgxMjEwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDJlMjAgNTA2YyA2NTYxICB0PC9zdHJvbmc+Li5QbGVhCisJMHgxMjIwOiAgNzM2NSAyMDY0IDZmMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmICBzZS5kby48c3Ryb25nPm5vCisJMHgxMjMwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDIwNjMgNmY2ZSA3NDYxICB0PC9zdHJvbmc+LmNvbnRhCisJMHgxMjQwOiAgNjM3NCAyMDc0IDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyICBjdC50aGUuRGViaWFuLlByCisJMHgxMjUwOiAgNmY2YSA2NTYzIDc0MjAgNjE2MiA2Zjc1IDc0MjAgNjk3NCAyZTNjICBvamVjdC5hYm91dC5pdC48CisJMHgxMjYwOiAgMmY1MCAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDY2ICAvUD4uLjxQPklmLnlvdS5mCisJMHgxMjcwOiAgNjk2ZSA2NDIwIDYxMjAgNjI3NSA2NzIwIDY5NmUgMjA3NCA2ODY5ICBpbmQuYS5idWcuaW4udGhpCisJMHgxMjgwOiAgNzMyMCA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1ICBzLmFwYWNoZS5wYWNrYWdlCisJMHgxMjkwOiAgMmMyMCA2ZjcyIDIwNjkgNmUyMCA0MTcwIDYxNjMgNjg2NSAyMDY5ICAsLm9yLmluLkFwYWNoZS5pCisJMHgxMmEwOiAgNzQ3MyA2NTZjIDY2MmMgMGE3MCA2YzY1IDYxNzMgNjUyMCA2NjY5ICB0c2VsZiwucGxlYXNlLmZpCisJMHgxMmIwOiAgNmM2NSAyMDYxIDIwNjIgNzU2NyAyMDcyIDY1NzAgNmY3MiA3NDIwICBsZS5hLmJ1Zy5yZXBvcnQuCisJMHgxMmMwOiAgNmY2ZSAyMDY5IDc0MmUgMjAyMCA0OTZlIDczNzQgNzI3NSA2Mzc0ICBvbi5pdC4uLkluc3RydWN0CisJMHgxMmQwOiAgNjk2ZiA2ZTczIDIwNmYgNmUyMCA2NDZmIDY5NmUgNjcyMCA3NDY4ICBpb25zLm9uLmRvaW5nLnRoCisJMHgxMmUwOiAgNjk3MyAyYzIwIDYxNmUgNjQyMCA3NDY4IDY1MGEgNmM2OSA3Mzc0ICBpcywuYW5kLnRoZS5saXN0CisJMHgxMmYwOiAgMjA2ZiA2NjIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0ICAub2YuPEEuSFJFRj0iaHR0CisJMHgxMzAwOiAgNzAzYSAyZjJmIDYyNzUgNjc3MyAyZTY0IDY1NjIgNjk2MSA2ZTJlICBwOi8vYnVncy5kZWJpYW4uCisJMHgxMzEwOiAgNmY3MiA2NzJmIDczNzIgNjMzYSA2MTcwIDYxNjMgNjg2NSAyMjNlICBvcmcvc3JjOmFwYWNoZSI+CisJMHgxMzIwOiAgNmI2ZSA2Zjc3IDZlMjAgNjI3NSA2NzczIDNjMmYgNDEzZSAyMDZmICBrbm93bi5idWdzPC9BPi5vCisJMHgxMzMwOiAgNjYyMCA3NDY4IDY5NzMgMGE3MCA2MTYzIDZiNjEgNjc2NSAyYzIwICBmLnRoaXMucGFja2FnZSwuCisJMHgxMzQwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwICBjYW4uYmUuZm91bmQuaW4uCisJMHgxMzUwOiAgNzQ2OCA2NTIwIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICB0aGUuLjxBLkhSRUY9Imh0CisJMHgxMzYwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSA2ZTJlICB0cDovL3d3dy5kZWJpYW4uCisJMHgxMzcwOiAgNmY3MiA2NzJmIDQyNzUgNjc3MyAyZjUyIDY1NzAgNmY3MiA3NDY5ICBvcmcvQnVncy9SZXBvcnRpCisJMHgxMzgwOiAgNmU2NyAyMjNlIDQ0NjUgNjI2OSA2MTZlIDIwNDIgNzU2NyAyMDU0ICBuZyI+RGViaWFuLkJ1Zy5UCisJMHgxMzkwOiAgNzI2MSA2MzZiIDY5NmUgNjcyMCA1Mzc5IDczNzQgNjU2ZCAzYzJmICByYWNraW5nLlN5c3RlbTwvCisJMHgxM2EwOiAgNDEzZSAyZTBhIDBhM2MgNTAzZSA1NDY4IDYxNmUgNmI3MyAyMDY2ICBBPi4uLjxQPlRoYW5rcy5mCisJMHgxM2IwOiAgNmY3MiAyMDc1IDczNjkgNmU2NyAyMDc0IDY4NjkgNzMyMCA3MDYxICBvci51c2luZy50aGlzLnBhCisJMHgxM2MwOiAgNjM2YiA2MTY3IDY1MmMgMjA2MSA2ZTY0IDIwNjMgNmY2ZSA2NzcyICBja2FnZSwuYW5kLmNvbmdyCisJMHgxM2QwOiAgNjE3NCA3NTZjIDYxNzQgNjk2ZiA2ZTczIDIwNjYgNmY3MiAyMDc5ICBhdHVsYXRpb25zLmZvci55CisJMHgxM2UwOiAgNmY3NSA3MjIwIDYzNjggNmY2OSA2MzY1IDIwNmYgNjYwYSA2MTIwICBvdXIuY2hvaWNlLm9mLmEuCisJMHgxM2YwOiAgNDQ2NSA2MjY5IDYxNmUgMjA3MyA3OTczIDc0NjUgNmQyMSAzYzJmICBEZWJpYW4uc3lzdGVtITwvCisJMHgxNDAwOiAgNTAzZSAwYTBhIDNjNDQgNDk1NiAyMDYxIDZjNjkgNjc2ZSAzZDIyICBQPi4uPERJVi5hbGlnbj0iCisJMHgxNDEwOiAgNjM2NSA2ZTc0IDY1NzIgMjIzZSAwYTNjIDYxMjAgNjg3MiA2NTY2ICBjZW50ZXIiPi48YS5ocmVmCisJMHgxNDIwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyICA9Imh0dHA6Ly93d3cuZGViCisJMHgxNDMwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDBhM2MgNDk0ZCA0NzIwICBpYW4ub3JnLyI+LjxJTUcuCisJMHgxNDQwOiAgNjE2YyA2OTY3IDZlM2QgMjI2ZCA2OTY0IDY0NmMgNjUyMiAyMDY4ICBhbGlnbj0ibWlkZGxlIi5oCisJMHgxNDUwOiAgNjU2OSA2NzY4IDc0M2QgMjIzMyAzMDIyIDIwNzcgNjk2NCA3NDY4ICBlaWdodD0iMzAiLndpZHRoCisJMHgxNDYwOiAgM2QyMiAzMjM1IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiA2ZTczICA9IjI1Ii5zcmM9Imljb25zCisJMHgxNDcwOiAgMmY2NCA2NTYyIDY5NjEgNmUyZiA2ZjcwIDY1NmUgNmM2ZiA2NzZmICAvZGViaWFuL29wZW5sb2dvCisJMHgxNDgwOiAgMmQzMiAzNTJlIDZhNzAgNjcyMiAyMDYxIDZjNzQgM2QyMiA0NDY1ICAtMjUuanBnIi5hbHQ9IkRlCisJMHgxNDkwOiAgNjI2OSA2MTZlIDIyM2UgMGEzYyAyZjYxIDNlMGEgM2M2MSAyMDY4ICBiaWFuIj4uPC9hPi48YS5oCisJMHgxNGEwOiAgNzI2NSA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlICByZWY9Imh0dHA6Ly93d3cuCisJMHgxNGIwOiAgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2UwYSAzYzQ5ICBhcGFjaGUub3JnLyI+LjxJCisJMHgxNGMwOiAgNGQ0NyAyMDYxIDZjNjkgNjc2ZSAzZDIyIDZkNjkgNjQ2NCA2YzY1ICBNRy5hbGlnbj0ibWlkZGxlCisJMHgxNGQwOiAgMjIyMCA2ODY1IDY5NjcgNjg3NCAzZDIyIDMzMzIgMjIyMCA3NzY5ICAiLmhlaWdodD0iMzIiLndpCisJMHgxNGUwOiAgNjQ3NCA2ODNkIDIyMzIgMzUzOSAyMjIwIDczNzIgNjMzZCAyMjY5ICBkdGg9IjI1OSIuc3JjPSJpCisJMHgxNGYwOiAgNjM2ZiA2ZTczIDJmNjEgNzA2MSA2MzY4IDY1NWYgNzA2MiAyZTcwICBjb25zL2FwYWNoZV9wYi5wCisJMHgxNTAwOiAgNmU2NyAyMjIwIDYxNmMgNzQzZCAyMjQxIDcwNjEgNjM2OCA2NTIyICBuZyIuYWx0PSJBcGFjaGUiCisJMHgxNTEwOiAgM2UwYSAzYzJmIDYxM2UgMGEzYyAyZjQ0IDQ5NTYgM2UwYSAwYTNjICA+LjwvYT4uPC9ESVY+Li48CisJMHgxNTIwOiAgMjEyZCAyZDBhIDIwMjAgNTQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwICAhLS0uLi5UaGlzLnBhZ2UuCisJMHgxNTMwOiAgNzc2MSA3MzIwIDY5NmUgNjk3NCA2OTYxIDZjNmMgNzkyMCA2MzcyICB3YXMuaW5pdGlhbGx5LmNyCisJMHgxNTQwOiAgNjU2MSA3NDY1IDY0MjAgNjI3OSAyMDRhIDZmNjggNmU2OSA2NTIwICBlYXRlZC5ieS5Kb2huaWUuCisJMHgxNTUwOiAgNDk2ZSA2NzcyIDYxNmQgMjAyOCA2ODc0IDc0NzAgM2EyZiAyZjZlICBJbmdyYW0uKGh0dHA6Ly9uCisJMHgxNTYwOiAgNjU3NCA2NzZmIDY0MmUgNmU2NSA3NDJmIDI5MGEgMjAyMCA0OTc0ICBldGdvZC5uZXQvKS4uLkl0CisJMHgxNTcwOiAgMjA3NyA2MTczIDIwNmMgNjE3NCA2NTcyIDIwNjUgNjQ2OSA3NDY1ICAud2FzLmxhdGVyLmVkaXRlCisJMHgxNTgwOiAgNjQyMCA2Mjc5IDIwNGQgNjE3NCA3NDY4IDY1NzcgMjA1NyA2OTZjICBkLmJ5Lk1hdHRoZXcuV2lsCisJMHgxNTkwOiAgNjM2ZiA3ODIwIDYxNmUgNjQyMCA0YTZmIDczNjkgNzAyMCA1MjZmICBjb3guYW5kLkpvc2lwLlJvCisJMHgxNWEwOiAgNjQ2OSA2ZTJlIDBhMjAgMjA0YyA2MTczIDc0MjAgNmQ2ZiA2NDY5ICBkaW4uLi4uTGFzdC5tb2RpCisJMHgxNWIwOiAgNjY2OSA2NTY0IDNhMjAgMjQ0NCA2MTc0IDY1M2EgMjAzMiAzMDMwICBmaWVkOi4kRGF0ZTouMjAwCisJMHgxNWMwOiAgMzQyZiAzMDM2IDJmMzIgMzAyMCAzMTM1IDNhMzMgMzMzYSAzNTM3ICA0LzA2LzIwLjE1OjMzOjU3CisJMHgxNWQwOiAgMjAyNCAyZTBhIDIwMjAgMmQyZCAzZTBhIDBhM2MgMmY0MiA0ZjQ0ICAuJC4uLi4tLT4uLjwvQk9ECisJMHgxNWUwOiAgNTkzZSAwYTNjIDJmNDggNTQ0ZCA0YzNlIDBhICAgICAgICAgICAgICBZPi48L0hUTUw+LgorMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI2ZSA0MDAwIDQwMDYgMjE1NCA3ZjAwIDAwMDEgIEUuLjQubkAuQC4hVC4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgIC4uLi4ucC5QN1guSTd6Li4KKwkweDAwMjA6ICA4MDEwIDMwNWYgMTBlYSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgIC4uMF8uLi4uLi4uLk0uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KKzIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgIEUuLjQucEAuQC4hUi4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgIC4uLi4ucC5QN1guSTd6Li4KKwkweDAwMjA6ICA4MDExIDMwNWYgMGJlMSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjEgIC4uMF8uLi4uLi4uLk0uLiEKKwkweDAwMzA6ICA0ZGRjIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgIEUuLjQuLkAuQC4uLi4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgIC4uLi4uUC5wN3ouLjdYLkoKKwkweDAwMjA6ICA4MDExIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgIC4uLi4uNS4uLi4uLk0uLiMKKwkweDAwMzA6ICA0ZGRjIDk3MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLiEKKzIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+CisJMHgwMDAwOiAgNDUwMCAwMDM0IDFiNzIgNDAwMCA0MDA2IDIxNTAgN2YwMCAwMDAxICBFLi40LnJALkAuIVAuLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNGEgMzc3YSBhM2FhICAuLi4uLnAuUDdYLko3ei4uCisJMHgwMDIwOiAgODAxMCAzMDVmIDA2ZDQgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzICAuLjBfLi4uLi4uLi5NLi4jCisJMHgwMDMwOiAgNGRkYyA5NzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1YWC5uZXcgYi90ZXN0cy9wcmludC1YWC5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMWEwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ByaW50LVhYLm5ldwpAQCAtMCwwICsxLDQxOSBAQAorMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxIDdmMDAgIC48LmhALkAuIVIuLi4uLi4KKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwIGEwMDIgIC4uLnAuUDdYLn4uLi4uLi4KKwkweDAwMzA6ICA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMgIC4uLiEuLi4uQC4uLi4uTS4KKwkweDAwNDA6ICA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIgICAgICAgICAgICAgICAgIC4uLi4uLi4uLi4KKzIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDNjIDAwMDAgNDAwMCA0MDA2IDNjYmEgN2YwMCAwMDAxIDdmMDAgIC48Li5ALkAuPC4uLi4uLi4KKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjEgMzc1OCA4OTdmIGEwMTIgIC4uLlAucDd6Li43WC4uLi4KKwkweDAwMzA6ICA3ZmZmIDZlYjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMgIC4ubi4uLi4uQC4uLi4uTS4KKwkweDAwNDA6ICA5MjE2IDRkZGMgOTIxNiAwMTAzIDAzMDIgICAgICAgICAgICAgICAgIC4uTS4uLi4uLi4KKzIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxIDdmMDAgIC40LmpALkAuIVguLi4uLi4KKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTAgIC4uLnAuUDdYLi43ei4uLi4KKwkweDAwMzA6ICAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2IDRkZGMgIC4uNy4uLi4uLi5NLi4uTS4KKwkweDAwNDA6ICA5MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCisyMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxIDdmMDAgIC4uLmxALkAuLi4uLi4uLi4KKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTggIC4uLnAuUDdYLi43ei4uLi4KKwkweDAwMzA6ICAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3IDRkZGMgIC4uLi4uLi4uLi5NLi4uTS4KKwkweDAwNDA6ICA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxIDJlMzEgIC4uR0VULi8uSFRUUC8xLjEKKwkweDAwNTA6ICAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4IDZmNzMgIC4uSG9zdDoubG9jYWxob3MKKwkweDAwNjA6ICA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhIDIwNDUgIHQuLlVzZXItQWdlbnQ6LkUKKwkweDAwNzA6ICA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3IDJkNjQgIExpbmtzLzAuMTAuNC03LWQKKwkweDAwODA6ICA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0IDY1M2IgIGViaWFuLih0ZXh0bW9kZTsKKwkweDAwOTA6ICAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkIDMxMmQgIC5MaW51eC4yLjYuMTEtMS0KKwkweDAwYTA6ICAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwIDMxMzMgIDY4Ni1zbXAuaTY4NjsuMTMKKwkweDAwYjA6ICAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwIDc0M2EgIDJ4NTYtMikuLkFjY2VwdDoKKwkweDAwYzA6ICAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1IDZlNjMgIC4qLyouLkFjY2VwdC1FbmMKKwkweDAwZDA6ICA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxIDYzNjMgIG9kaW5nOi5nemlwLi5BY2MKKwkweDAwZTA6ICA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwIDY1NmUgIGVwdC1MYW5ndWFnZTouZW4KKwkweDAwZjA6ICAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwIDRiNjUgIC4uQ29ubmVjdGlvbjouS2UKKwkweDAxMDA6ICA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYSAgICAgICAgICAgIGVwLUFsaXZlLi4uLgorMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCisJMHgwMDEwOiAgMDAzNCAxZmU0IDQwMDAgNDAwNiAxY2RlIDdmMDAgMDAwMSA3ZjAwICAuNC4uQC5ALi4uLi4uLi4uCisJMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDEwICAuLi5QLnA3ei4uN1guSS4uCisJMHgwMDMwOiAgMjAwMCAzNzAzIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOCA0ZGRjICAuLjcuLi4uLi4uTS4uLk0uCisJMHgwMDQwOiAgOTIxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLgorMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEgN2YwMCAgLi4uLkAuQC4uJS4uLi4uLgorCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgODAxOCAgLi4uUC5wN3ouLjdYLkkuLgorCTB4MDAzMDogIDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgNGRkYyAgLi4uLi4uLi4uLk0uLi5NLgorCTB4MDA0MDogIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAgMjA0ZiAgLi5IVFRQLzEuMS4yMDAuTworCTB4MDA1MDogIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAgMzAzNiAgSy4uRGF0ZTouV2VkLC4wNgorCTB4MDA2MDogIDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUgMzczYSAgLkp1bC4yMDA1LjAzOjU3OgorCTB4MDA3MDogIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIgM2EyMCAgMzUuR01ULi5TZXJ2ZXI6LgorCTB4MDA4MDogIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQgMGE0YyAgQXBhY2hlLzEuMy4zMy4uTAorCTB4MDA5MDogIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAgNTM3NSAgYXN0LU1vZGlmaWVkOi5TdQorCTB4MDBhMDogIDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQgMjAzMCAgbiwuMTUuQXVnLjIwMDQuMAorCTB4MDBiMDogIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUgNTQ2MSAgMDo0Mzo0MS5HTVQuLkVUYQorCTB4MDBjMDogIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzggNjEyZCAgZzouIjZlODBmMC0xNDhhLQorCTB4MDBkMDogIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMgNjU3MCAgNDExZWIxYmQiLi5BY2NlcAorCTB4MDBlMDogIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUgNzMwZCAgdC1SYW5nZXM6LmJ5dGVzLgorCTB4MDBmMDogIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQgNjgzYSAgLkNvbnRlbnQtTGVuZ3RoOgorCTB4MDEwMDogIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMgNjk3NiAgLjUyNTguLktlZXAtQWxpdgorCTB4MDExMDogIDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMgMjA2ZCAgZToudGltZW91dD0xNSwubQorCTB4MDEyMDogIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSAgYXg9MTAwLi5Db25uZWN0aQorCTB4MDEzMDogIDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAgb246LktlZXAtQWxpdmUuLgorCTB4MDE0MDogIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAgNzQ2NSAgQ29udGVudC1UeXBlOi50ZQorCTB4MDE1MDogIDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMgNjU3NCAgeHQvaHRtbDsuY2hhcnNldAorCTB4MDE2MDogIDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQgMGEzYyAgPWlzby04ODU5LTEuLi4uPAorCTB4MDE3MDogIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAgNTA1NSAgIURPQ1RZUEUuSFRNTC5QVQorCTB4MDE4MDogIDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYgNDQ1NCAgQkxJQy4iLS8vVzNDLy9EVAorCTB4MDE5MDogIDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIgNjE2ZSAgRC5IVE1MLjQuMDEuVHJhbgorCTB4MDFhMDogIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UgMGEzYyAgc2l0aW9uYWwvL0VOIj4uPAorCTB4MDFiMDogIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAgMjAyMCAgSFRNTD4uPEhFQUQ+Li4uLgorCTB4MDFjMDogIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUgNDk1NiAgPE1FVEEuSFRUUC1FUVVJVgorCTB4MDFkMDogIDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgMjIyMCAgPSJDb250ZW50LVR5cGUiLgorCTB4MDFlMDogIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYgNjg3NCAgQ09OVEVOVD0idGV4dC9odAorCTB4MDFmMDogIDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMgNmYyZCAgbWw7LmNoYXJzZXQ9aXNvLQorCTB4MDIwMDogIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQgNDU1NCAgODg1OS0xIj4uLi4uPE1FVAorCTB4MDIxMDogIDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkgNzA3NCAgQS5OQU1FPSJEZXNjcmlwdAorCTB4MDIyMDogIDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIgNTQ2OCAgaW9uIi5DT05URU5UPSJUaAorCTB4MDIzMDogIDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQgNjE2YyAgZS5pbml0aWFsLmluc3RhbAorCTB4MDI0MDogIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkgNjE2ZSAgbGF0aW9uLm9mLkRlYmlhbgorCTB4MDI1MDogIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAgM2M1NCAgLmFwYWNoZS4iPi4uLi48VAorCTB4MDI2MDogIDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQgNjU3MiAgSVRMRT5QbGFjZWhvbGRlcgorCTB4MDI3MDogIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEgM2MyZiAgLnBhZ2U8L1RJVExFPi48LworCTB4MDI4MDogIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUgNTg1NCAgSEVBRD4uPEJPRFkuVEVYVAorCTB4MDI5MDogIDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMgNGY0YyAgPSIjMDAwMDAwIi5CR0NPTAorCTB4MDJhMDogIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMgNDk0ZSAgT1I9IiNGRkZGRkYiLkxJTgorCTB4MDJiMDogIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMgNDk0ZSAgSz0iIzAwMDBFRiIuVkxJTgorCTB4MDJjMDogIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMgNDk0ZSAgSz0iIzU1MTg4QSIuQUxJTgorCTB4MDJkMDogIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEgM2M0OCAgSz0iI0ZGMDAwMCI+Li48SAorCTB4MDJlMDogIDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAgNzA2MSAgMT5QbGFjZWhvbGRlci5wYQorCTB4MDJmMDogIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYgMjA3OSAgZ2U8L0gxPi48SDI+SWYueQorCTB4MDMwMDogIDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIgNmY3NyAgb3UuYXJlLmp1c3QuYnJvdworCTB4MDMxMDogIDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYgNjgzMiAgc2luZy50aGUud2ViPC9oMgorCTB4MDMyMDogIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUgNzIyMCAgPi4uPFA+VGhlLm93bmVyLgorCTB4MDMzMDogIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkgNzQ2NSAgb2YudGhpcy53ZWIuc2l0ZQorCTB4MDM0MDogIDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUgNzAyMCAgLmhhcy5ub3QucHV0LnVwLgorCTB4MDM1MDogIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAgNzk2NSAgYW55LndlYi5wYWdlcy55ZQorCTB4MDM2MDogIDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUgMjA2MiAgdC4uUGxlYXNlLmNvbWUuYgorCTB4MDM3MDogIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UgMGEwYSAgYWNrLmxhdGVyLjwvUD4uLgorCTB4MDM4MDogIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQgNDUzZSAgPFA+PFNNQUxMPjxDSVRFPgorCTB4MDM5MDogIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYgNzQ2OCAgTW92ZS5hbG9uZywubm90aAorCTB4MDNhMDogIDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIgNjUyZSAgaW5nLnRvLnNlZS5oZXJlLgorCTB4MDNiMDogIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MgMmY1MyAgLi48L0NJVEU+LjotKTwvUworCTB4MDNjMDogIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIgM2U0OSAgTUFMTD48L1A+Li48SDI+SQorCTB4MDNkMDogIDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkgNmU2NyAgZi55b3UuYXJlLnRyeWluZworCTB4MDNlMDogIDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUgMjA2MSAgLnRvLmxvY2F0ZS50aGUuYQorCTB4MDNmMDogIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYgNjYyMCAgZG1pbmlzdHJhdG9yLm9mLgorCTB4MDQwMDogIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYgNDgzMiAgdGhpcy5tYWNoaW5lPC9IMgorCTB4MDQxMDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcgNjE2ZSAgPi4uPFA+SWYueW91LndhbgorCTB4MDQyMDogIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYgNmQ2NSAgdC50by5yZXBvcnQuc29tZQorCTB4MDQzMDogIDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjggNjk3MyAgdGhpbmcuYWJvdXQudGhpcworCTB4MDQ0MDogIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkgNmY3MiAgLmhvc3Qncy5iZWhhdmlvcgorCTB4MDQ1MDogIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEgNjM3NCAgLC5wbGVhc2UuY29udGFjdAorCTB4MDQ2MDogIDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAgNTM2NSAgLnRoZS5JbnRlcm5ldC5TZQorCTB4MDQ3MDogIDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIgMjAyOCAgcnZpY2UuUHJvdmlkZXIuKAorCTB4MDQ4MDogIDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAgNjQ2OSAgSVNQKS5pbnZvbHZlZC5kaQorCTB4MDQ5MDogIDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSAgcmVjdGx5LjwvUD4uLjxQPgorCTB4MDRhMDogIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUgNjYzZCAgU2VlLnRoZS48QS5ocmVmPQorCTB4MDRiMDogIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIgNzU3MyAgImh0dHA6Ly93d3cuYWJ1cworCTB4MDRjMDogIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIgNmIyMCAgZS5uZXQvIj5OZXR3b3JrLgorCTB4MDRkMDogIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcgNjg2ZiAgQWJ1c2UuQ2xlYXJpbmdobworCTB4MDRlMDogIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYgNzcyMCAgdXNlPC9BPi5mb3IuaG93LgorCTB4MDRmMDogIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAgM2UwYSAgdG8uZG8udGhpcy48L1A+LgorCTB4MDUwMDogIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCAgLjxIMj5JZi55b3UuYXJlLgorCTB4MDUxMDogIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEgNzQ2ZiAgdGhlLmFkbWluaXN0cmF0bworCTB4MDUyMDogIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjggNjk2ZSAgci5vZi50aGlzLm1hY2hpbgorCTB4MDUzMDogIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUgMjA2OSAgZTwvSDI+Li48UD5UaGUuaQorCTB4MDU0MDogIDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMgNjE3NCAgbml0aWFsLmluc3RhbGxhdAorCTB4MDU1MDogIDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYgM2QyMiAgaW9uLm9mLjxBLmhyZWY9IgorCTB4MDU2MDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSAgaHR0cDovL3d3dy5kZWJpYQorCTB4MDU3MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjc3MyAgbi5vcmcvIj5EZWJpYW4ncworCTB4MDU4MDogIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUgNjIyMCAgLmFwYWNoZTwvQT4ud2ViLgorCTB4MDU5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NyAgc2VydmVyLnBhY2thZ2UudworCTB4MDVhMDogIDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUgM2MyZiAgYXMuc3VjY2Vzc2Z1bC48LworCTB4MDViMDogIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcgM2U1OSAgUD4uLjxQPjxTVFJPTkc+WQorCTB4MDVjMDogIDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMgNjE2MyAgb3Uuc2hvdWxkLnJlcGxhYworCTB4MDVkMDogIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkgNzQ2OCAgZS50aGlzLnBhZ2Uud2l0aAorCTB4MDVlMDogIDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAgNzA2MSAgLnlvdXIub3duLndlYi5wYQorCTB4MDVmMDogIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMgMjA3MCAgZ2VzLmFzLnNvb24uYXMucAorCTB4MDYwMDogIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYgNGU0NyAgb3NzaWJsZS48L1NUUk9ORworCTB4MDYxMDogIDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUgNzM3MyAgPjwvUD4uLjxQPlVubGVzcworCTB4MDYyMDogIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkgNzQ3MyAgLnlvdS5jaGFuZ2VkLml0cworCTB4MDYzMDogIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUgMmMyMCAgLmNvbmZpZ3VyYXRpb24sLgorCTB4MDY0MDogIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUgNzIyMCAgeW91ci5uZXcuc2VydmVyLgorCTB4MDY1MDogIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAgNjE3MyAgaXMuY29uZmlndXJlZC5hcworCTB4MDY2MDogIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UgMGEzYyAgLmZvbGxvd3M6LjxVTD4uPAorCTB4MDY3MDogIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQgNjk2ZiAgTEk+LkNvbmZpZ3VyYXRpbworCTB4MDY4MDogIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUgMjA2NiAgbi5maWxlcy5jYW4uYmUuZgorCTB4MDY5MDogIDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUgNzQ2MyAgb3VuZC5pbi48VFQ+L2V0YworCTB4MDZhMDogIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyAgL2FwYWNoZTwvVFQ+LjwvTAorCTB4MDZiMDogIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNTQ1NCAgST4uLjxMST4uVGhlLjxUVAorCTB4MDZjMDogIDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MgMmY1NCAgPkRvY3VtZW50Um9vdDwvVAorCTB4MDZkMDogIDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQgNjg2NSAgVD4sLndoaWNoLmlzLnRoZQorCTB4MDZlMDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQgNjU3MiAgLmRpcmVjdG9yeS51bmRlcgorCTB4MDZmMDogIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUgNzIwYSAgLndoaWNoLmFsbC55b3VyLgorCTB4MDcwMDogIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYgNzU2YyAgSFRNTC5maWxlcy5zaG91bAorCTB4MDcxMDogIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUgNzQyMCAgZC5leGlzdCwuaXMuc2V0LgorCTB4MDcyMDogIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgNzczYyAgdG8uPFRUPi92YXIvd3d3PAorCTB4MDczMDogIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAgL1RUPi48L0xJPi4uPExJPgorCTB4MDc0MDogIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEgNzI2NSAgLkNHSS5zY3JpcHRzLmFyZQorCTB4MDc1MDogIDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUgMjAzYyAgLmxvb2tlZC5mb3IuaW4uPAorCTB4MDc2MDogIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcgNjkyZCAgVFQ+L3Vzci9saWIvY2dpLQorCTB4MDc3MDogIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCAgYmluPC9UVD4sLndoaWNoLgorCTB4MDc4MDogIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEgNmUyMCAgaXMud2hlcmUuRGViaWFuLgorCTB4MDc5MDogIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAgNzA2YyAgcGFja2FnZXMud2lsbC5wbAorCTB4MDdhMDogIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkgNzA3NCAgYWNlLnRoZWlyLnNjcmlwdAorCTB4MDdiMDogIDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNGM2ZiAgcy48L0xJPi4uPExJPi5MbworCTB4MDdjMDogIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMgNjE2MyAgZy5maWxlcy5hcmUucGxhYworCTB4MDdkMDogIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY2YyAgZWQuaW4uPFRUPi92YXIvbAorCTB4MDdlMDogIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmMyMCAgb2cvYXBhY2hlPC9UVD4sLgorCTB4MDdmMDogIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYgNzQ2MSAgYW5kLndpbGwuYmUucm90YQorCTB4MDgwMDogIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQgNjg2NSAgdGVkLndlZWtseS4uLlRoZQorCTB4MDgxMDogIDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAgNzI2ZiAgLmZyZXF1ZW5jeS5vZi5ybworCTB4MDgyMDogIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAgNjU2MSAgdGF0aW9uLmNhbi5iZS5lYQorCTB4MDgzMDogIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIgNzkyMCAgc2lseS5jaGFuZ2VkLmJ5LgorCTB4MDg0MDogIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUgNzQ2MyAgZWRpdGluZy48VFQ+L2V0YworCTB4MDg1MDogIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEgNzA2MSAgL2xvZ3JvdGF0ZS5kL2FwYQorCTB4MDg2MDogIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAgY2hlPC9UVD4uPC9MST4uLgorCTB4MDg3MDogIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUgNmM3NCAgPExJPi5UaGUuZGVmYXVsdAorCTB4MDg4MDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQgNjU3OCAgLmRpcmVjdG9yeS5pbmRleAorCTB4MDg5MDogIDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUgNjg3NCAgLmlzLjxUVD5pbmRleC5odAorCTB4MDhhMDogIDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkgNmU2NyAgbWw8L1RUPiwubWVhbmluZworCTB4MDhiMDogIDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMgMGE2NiAgLnRoYXQucmVxdWVzdHMuZgorCTB4MDhjMDogIDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjAzYyAgb3IuYS5kaXJlY3RvcnkuPAorCTB4MDhkMDogIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYgNTQ1NCAgVFQ+L2Zvby9iYXIvPC9UVAorCTB4MDhlMDogIDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjggNjUyMCAgPi53aWxsLmdpdmUudGhlLgorCTB4MDhmMDogIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjggNjUyMCAgY29udGVudHMub2YudGhlLgorCTB4MDkwMDogIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyAgZmlsZS48VFQ+L3Zhci93dworCTB4MDkxMDogIDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUgNzgyZSAgdy9mb28vYmFyL2luZGV4LgorCTB4MDkyMDogIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkgNzQyMCAgaHRtbDwvVFQ+LmlmLml0LgorCTB4MDkzMDogIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkgNmU2NyAgZXhpc3RzLihhc3N1bWluZworCTB4MDk0MDogIDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY3NyAgLnRoYXQuPFRUPi92YXIvdworCTB4MDk1MDogIDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUgNzIyMCAgd3c8L1RUPi5pcy55b3VyLgorCTB4MDk2MDogIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYgNmY3NCAgPFRUPkRvY3VtZW50Um9vdAorCTB4MDk3MDogIDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyAgPC9UVD4pLjwvTEk+Li48TAorCTB4MDk4MDogIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQgNmY3MiAgST4uVXNlci5kaXJlY3RvcgorCTB4MDk5MDogIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUgNjQyYyAgaWVzLmFyZS5lbmFibGVkLAorCTB4MDlhMDogIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUgNmQ2NSAgLmFuZC51c2VyLmRvY3VtZQorCTB4MDliMDogIDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYgNmY2YiAgbnRzLndpbGwuYmUubG9vaworCTB4MDljMDogIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAgM2M1NCAgZWQuZm9yLmluLnRoZS48VAorCTB4MDlkMDogIDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MgMmY1NCAgVD5wdWJsaWNfaHRtbDwvVAorCTB4MDllMDogIDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYgNjYyMCAgVD4uZGlyZWN0b3J5Lm9mLgorCTB4MDlmMDogIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQgNjU3MyAgdGhlLnVzZXJzJy5ob21lcworCTB4MGEwMDogIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEgNzM2OCAgLi4uVGhlc2UuZGlycy5zaAorCTB4MGExMDogIDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAgM2M1NCAgb3VsZC5iZS51bmRlci48VAorCTB4MGEyMDogIDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAgNjE2ZSAgVD4vaG9tZTwvVFQ+LC5hbgorCTB4MGEzMDogIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUgNmY3NCAgZC51c2Vycy53aWxsLm5vdAorCTB4MGE0MDogIDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkgNmQ2YyAgLmJlLmFibGUudG8uc3ltbAorCTB4MGE1MDogIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQgNjg2NSAgaW5rLnRvLmZpbGVzLnRoZQorCTB4MGE2MDogIDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYgNGM0OSAgeS5kb24ndC5vd24uPC9MSQorCTB4MGE3MDogIDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQgNjg2NSAgPi4uPC9VTD4uQWxsLnRoZQorCTB4MGE4MDogIDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMgNjg2NSAgLnN0YW5kYXJkLmFwYWNoZQorCTB4MGE5MDogIDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEgNzY2MSAgLm1vZHVsZXMuYXJlLmF2YQorCTB4MGFhMDogIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjggNjk3MyAgaWxhYmxlLndpdGgudGhpcworCTB4MGFiMDogIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEgNzI2NSAgLnJlbGVhc2UuYW5kLmFyZQorCTB4MGFjMDogIDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcgNjk3NCAgLm5vdy5tYW5hZ2VkLndpdAorCTB4MGFkMDogIDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkgNzA2NSAgaC5kZWJjb25mLi4uVHlwZQorCTB4MGFlMDogIDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYgNmU2NiAgLjxUVD5kcGtnLXJlY29uZgorCTB4MGFmMDogIDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYgNTQ1NCAgaWd1cmUuYXBhY2hlPC9UVAorCTB4MGIwMDogIDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjggNjk2MyAgPi50by5zZWxlY3Qud2hpYworCTB4MGIxMDogIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAgNzc2MSAgaC5tb2R1bGVzLnlvdS53YQorCTB4MGIyMDogIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQgNjE2ZSAgbnQuZW5hYmxlZC4uLk1hbgorCTB4MGIzMDogIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCAgeS5vdGhlci5tb2R1bGVzLgorCTB4MGI0MDogIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEgNzQ2OCAgYXJlLmF2YWlsYWJsZS50aAorCTB4MGI1MDogIDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAgcm91Z2gudGhlLkRlYmlhbgorCTB4MGI2MDogIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUgNmQyMCAgLnBhY2thZ2Uuc3lzdGVtLgorCTB4MGI3MDogIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMgMjAzYyAgd2l0aC50aGUubmFtZXMuPAorCTB4MGI4MDogIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQgNmY2NCAgVFQ+bGliYXBhY2hlLW1vZAorCTB4MGI5MDogIDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYgNzUyMCAgLSo8L1RUPi4uSWYueW91LgorCTB4MGJhMDogIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMgNjUyMCAgbmVlZC50by5jb21waWxlLgorCTB4MGJiMDogIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMgNjU2YyAgYS5tb2R1bGUueW91cnNlbAorCTB4MGJjMDogIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUgNjU2NCAgZiwueW91LndpbGwubmVlZAorCTB4MGJkMDogIDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjggNjUwYSAgLnRvLmluc3RhbGwudGhlLgorCTB4MGJlMDogIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYgM2MyZiAgPFRUPmFwYWNoZS1kZXY8LworCTB4MGJmMDogIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEgM2M1MCAgVFQ+LnBhY2thZ2UuLi48UAorCTB4MGMwMDogIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgPk1vcmUuZG9jdW1lbnRhdAorCTB4MGMxMDogIDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAgNjM2MSAgaW9uLm9uLkFwYWNoZS5jYQorCTB4MGMyMDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EgMGEzYyAgbi5iZS5mb3VuZC5vbjouPAorCTB4MGMzMDogIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNDEyMCAgVUw+LjxMST4uVGhlLjxBLgorCTB4MGM0MDogIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEgNjM2OCAgSFJFRj0iL2RvYy9hcGFjaAorCTB4MGM1MDogIDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIgM2U0MSAgZS1kb2MvbWFudWFsLyI+QQorCTB4MGM2MDogIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgcGFjaGUuZG9jdW1lbnRhdAorCTB4MGM3MDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQgMjA2ZiAgaW9uPC9BPi5zdG9yZWQubworCTB4MGM4MDogIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUgM2MyZiAgbi55b3VyLnNlcnZlci48LworCTB4MGM5MDogIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAgTEk+Li48TEk+LlRoZS48QQorCTB4MGNhMDogIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyAgLkhSRUY9Imh0dHA6Ly93dworCTB4MGNiMDogIDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2U0MSAgdy5hcGFjaGUub3JnLyI+QQorCTB4MGNjMDogIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MgMmY0MSAgcGFjaGUuUHJvamVjdDwvQQorCTB4MGNkMDogIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAgPi5ob21lLnNpdGUuPC9MSQorCTB4MGNlMDogIDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCAgPi4uPExJPi5UaGUuPEEuSAorCTB4MGNmMDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSAgUkVGPSJodHRwOi8vd3d3LgorCTB4MGQwMDogIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcgMmYyMiAgYXBhY2hlLXNzbC5vcmcvIgorCTB4MGQxMDogIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEgM2UyMCAgPkFwYWNoZS1TU0w8L0E+LgorCTB4MGQyMDogIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgM2UwYSAgaG9tZS5zaXRlLjwvTEk+LgorCTB4MGQzMDogIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggNTI0NSAgLjxMST4uVGhlLjxBLkhSRQorCTB4MGQ0MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMgMmU2MSAgRj0iaHR0cDovL3BlcmwuYQorCTB4MGQ1MDogIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYgNjQyMCAgcGFjaGUub3JnLyI+bW9kLgorCTB4MGQ2MDogIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAgNzM2OSAgcGVybDwvQT4uaG9tZS5zaQorCTB4MGQ3MDogIDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCAgdGUuPC9MST4uLjxMST4uVAorCTB4MGQ4MDogIDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgaGUuPEEuSFJFRj0iaHR0cAorCTB4MGQ5MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcgNjU2NSAgOi8vd3d3LmFwYWNoZXdlZQorCTB4MGRhMDogIDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUgNTc2NSAgay5jb20vIj5BcGFjaGVXZQorCTB4MGRiMDogIDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQgNzQ2NSAgZWs8L0E+Lm5ld3NsZXR0ZQorCTB4MGRjMDogIDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCAgci48L0xJPi4uPExJPi5UaAorCTB4MGRkMDogIDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAgZS48QS5IUkVGPSJodHRwOgorCTB4MGRlMDogIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYgNzI2NyAgLy93d3cuZGViaWFuLm9yZworCTB4MGRmMDogIDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAgNTA3MiAgL2RvYy8iPkRlYmlhbi5QcgorCTB4MGUwMDogIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgb2plY3QuRG9jdW1lbnRhdAorCTB4MGUxMDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAgNjM2ZiAgaW9uPC9BPi53aGljaC5jbworCTB4MGUyMDogIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMgMjA0NiAgbnRhaW5zLkhPV1RPcywuRgorCTB4MGUzMDogIDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcgNjE3MiAgQVFzLC5hbmQuc29mdHdhcgorCTB4MGU0MDogIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkgM2UwYSAgZS51cGRhdGVzLjwvTEk+LgorCTB4MGU1MDogIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAgNjM2MSAgPC9VTD4uLjxQPllvdS5jYQorCTB4MGU2MDogIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQgMjA3NCAgbi5hbHNvLmNvbnN1bHQudAorCTB4MGU3MDogIDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAgNDg1MiAgaGUubGlzdC5vZi48QS5IUgorCTB4MGU4MDogIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2MiAgRUY9Imh0dHA6Ly93d3cuYgorCTB4MGU5MDogIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEgMmYyMiAgb3V0ZWxsLmNvbS9mYXEvIgorCTB4MGVhMDogIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUgNjIyMCAgPldvcmxkLldpZGUuV2ViLgorCTB4MGViMDogIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIgNjU2NCAgRnJlcXVlbnRseS5Bc2tlZAorCTB4MGVjMDogIDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UgMjA2NiAgLlF1ZXN0aW9uczwvQT4uZgorCTB4MGVkMDogIDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUgMmUwYSAgb3IuaW5mb3JtYXRpb24uLgorCTB4MGVlMDogIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIgMjA3MCAgLjxIMj5MZXQub3RoZXIucAorCTB4MGVmMDogIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYgNzU3NCAgZW9wbGUua25vdy5hYm91dAorCTB4MGYwMDogIDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYgNDgzMiAgLnRoaXMuc2VydmVyPC9IMgorCTB4MGYxMDogIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgPi4uPEEuSFJFRj0iaHR0cAorCTB4MGYyMDogIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAgOi8vbmV0Y3JhZnQuY29tLworCTB4MGYzMDogIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UgMjA3MCAgIj5OZXRjcmFmdDwvQT4ucAorCTB4MGY0MDogIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQgNjU3MiAgcm92aWRlcy5hbi5pbnRlcgorCTB4MGY1MDogIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUgNzI3NiAgZXN0aW5nLmZyZWUuc2VydgorCTB4MGY2MDogIDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkgNzQ2NSAgaWNlLmZvci53ZWIuc2l0ZQorCTB4MGY3MDogIDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUgNjQyMCAgLm1vbml0b3JpbmcuYW5kLgorCTB4MGY4MDogIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMgNjU2MyAgc3RhdGlzdGljLmNvbGxlYworCTB4MGY5MDogIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAgNmM2NSAgdGlvbi4uWW91LmNhbi5sZQorCTB4MGZhMDogIDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIgNmY3NSAgdC50aGVtLmtub3cuYWJvdQorCTB4MGZiMDogIDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAgNzU3MyAgdC55b3VyLnNlcnZlci51cworCTB4MGZjMDogIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDggNTI0NSAgaW5nLnRoZWlyLjxBLkhSRQorCTB4MGZkMDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkgNmQ2NSAgRj0iaHR0cDovL3VwdGltZQorCTB4MGZlMDogIDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgMjIzZSAgLm5ldGNyYWZ0LmNvbS8iPgorCTB4MGZmMDogIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUgMGE0NSAgaW50ZXJmYWNlPC9BPi4uRQorCTB4MTAwMDogIDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYgNmU2OSAgbmFibGluZy50aGUubW9uaQorCTB4MTAxMDogIDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIgMjA3MyAgdG9yaW5nLm9mLnlvdXIucworCTB4MTAyMDogIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYgNzY2OSAgZXJ2ZXIud2lsbC5wcm92aQorCTB4MTAzMDogIDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMgNmY2MiAgZGUuYS5iZXR0ZXIuZ2xvYgorCTB4MTA0MDogIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYgMjA3NyAgYWwub3ZlcnZpZXcub2YudworCTB4MTA1MDogIDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjggNjE3NCAgaG8uaXMudXNpbmcud2hhdAorCTB4MTA2MDogIDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUgNjQyMCAgLmFuZC53aGVyZSwuYW5kLgorCTB4MTA3MDogIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAgNDQ2NSAgaXQud291bGQuZ2l2ZS5EZQorCTB4MTA4MDogIDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEgNmY3NiAgYmlhbi5hLmJldHRlci5vdgorCTB4MTA5MDogIDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAgNjE3MCAgZXJ2aWV3Lm9mLnRoZS5hcAorCTB4MTBhMDogIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUgNzM2MSAgYWNoZS5wYWNrYWdlLnVzYQorCTB4MTBiMDogIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQgMjA3NCAgZ2UuLi48SDI+QWJvdXQudAorCTB4MTBjMDogIDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEgMGEzYyAgaGlzLnBhZ2U8L0gyPi4uPAorCTB4MTBkMDogIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcgNjg3NCAgSU1HLkFMSUdOPSJyaWdodAorCTB4MTBlMDogIDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDggNTQzZCAgIi5BTFQ9IiIuSEVJR0hUPQorCTB4MTBmMDogIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIgMzczOCAgIjI0NyIuV0lEVEg9IjI3OAorCTB4MTEwMDogIDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEgNjg2NSAgIi5TUkM9Imljb25zL2poZQorCTB4MTExMDogIDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UgNTQ2OCAgMDYxLnBuZyI+Li48UD5UaAorCTB4MTEyMDogIDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjggNmY2YyAgaXMuaXMuYS5wbGFjZWhvbAorCTB4MTEzMDogIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEgNmM2YyAgZGVyLnBhZ2UuaW5zdGFsbAorCTB4MTE0MDogIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDggNTI0NSAgZWQuYnkudGhlLjxBLkhSRQorCTB4MTE1MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjQ2NSAgRj0iaHR0cDovL3d3dy5kZQorCTB4MTE2MDogIDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIgNjk2MSAgYmlhbi5vcmcvIj5EZWJpYQorCTB4MTE3MDogIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAgNmY2NiAgbjwvQT4ucmVsZWFzZS5vZgorCTB4MTE4MDogIDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUgNjIyMCAgLnRoZS5hcGFjaGUuV2ViLgorCTB4MTE5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMmUwYSAgc2VydmVyLnBhY2thZ2UuLgorCTB4MTFhMDogIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUgNzQ2NSAgLjxQPlRoaXMuY29tcHV0ZQorCTB4MTFiMDogIDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUgNjQyMCAgci5oYXMuaW5zdGFsbGVkLgorCTB4MTFjMDogIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUgMmY0YyAgdGhlLkRlYmlhbi5HTlUvTAorCTB4MTFkMDogIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcgMjA3MyAgaW51eC5vcGVyYXRpbmcucworCTB4MTFlMDogIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAgNjg2MSAgeXN0ZW0sLmJ1dC5pdC5oYQorCTB4MTFmMDogIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjggNjk2ZSAgcy48c3Ryb25nPm5vdGhpbgorCTB4MTIwMDogIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQgNjg2NSAgZy50by5kby53aXRoLnRoZQorCTB4MTIxMDogIDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMgNzQzYyAgLkRlYmlhbi5Qcm9qZWN0PAorCTB4MTIyMDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEgNzM2NSAgL3N0cm9uZz4uLlBsZWFzZQorCTB4MTIzMDogIDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQzYyAgLmRvLjxzdHJvbmc+bm90PAorCTB4MTI0MDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEgNjM3NCAgL3N0cm9uZz4uY29udGFjdAorCTB4MTI1MDogIDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSAgLnRoZS5EZWJpYW4uUHJvagorCTB4MTI2MDogIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MgMmY1MCAgZWN0LmFib3V0Lml0LjwvUAorCTB4MTI3MDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYgNjk2ZSAgPi4uPFA+SWYueW91LmZpbgorCTB4MTI4MDogIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkgNzMyMCAgZC5hLmJ1Zy5pbi50aGlzLgorCTB4MTI5MDogIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCAgYXBhY2hlLnBhY2thZ2UsLgorCTB4MTJhMDogIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkgNzQ3MyAgb3IuaW4uQXBhY2hlLml0cworCTB4MTJiMDogIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkgNmM2NSAgZWxmLC5wbGVhc2UuZmlsZQorCTB4MTJjMDogIDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAgNmY2ZSAgLmEuYnVnLnJlcG9ydC5vbgorCTB4MTJkMDogIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQgNjk2ZiAgLml0Li4uSW5zdHJ1Y3RpbworCTB4MTJlMDogIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjggNjk3MyAgbnMub24uZG9pbmcudGhpcworCTB4MTJmMDogIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQgMjA2ZiAgLC5hbmQudGhlLmxpc3QubworCTB4MTMwMDogIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAgZi48QS5IUkVGPSJodHRwOgorCTB4MTMxMDogIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MiAgLy9idWdzLmRlYmlhbi5vcgorCTB4MTMyMDogIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UgNmI2ZSAgZy9zcmM6YXBhY2hlIj5rbgorCTB4MTMzMDogIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYgNjYyMCAgb3duLmJ1Z3M8L0E+Lm9mLgorCTB4MTM0MDogIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgNjM2MSAgdGhpcy5wYWNrYWdlLC5jYQorCTB4MTM1MDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgNzQ2OCAgbi5iZS5mb3VuZC5pbi50aAorCTB4MTM2MDogIDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgZS4uPEEuSFJFRj0iaHR0cAorCTB4MTM3MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MiAgOi8vd3d3LmRlYmlhbi5vcgorCTB4MTM4MDogIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkgNmU2NyAgZy9CdWdzL1JlcG9ydGluZworCTB4MTM5MDogIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQgNzI2MSAgIj5EZWJpYW4uQnVnLlRyYQorCTB4MTNhMDogIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYgNDEzZSAgY2tpbmcuU3lzdGVtPC9BPgorCTB4MTNiMDogIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYgNmY3MiAgLi4uPFA+VGhhbmtzLmZvcgorCTB4MTNjMDogIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEgNjM2YiAgLnVzaW5nLnRoaXMucGFjaworCTB4MTNkMDogIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIgNjE3NCAgYWdlLC5hbmQuY29uZ3JhdAorCTB4MTNlMDogIDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkgNmY3NSAgdWxhdGlvbnMuZm9yLnlvdQorCTB4MTNmMDogIDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAgNDQ2NSAgci5jaG9pY2Uub2YuYS5EZQorCTB4MTQwMDogIDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYgNTAzZSAgYmlhbi5zeXN0ZW0hPC9QPgorCTB4MTQxMDogIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIgNjM2NSAgLi48RElWLmFsaWduPSJjZQorCTB4MTQyMDogIDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYgM2QyMiAgbnRlciI+LjxhLmhyZWY9IgorCTB4MTQzMDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSAgaHR0cDovL3d3dy5kZWJpYQorCTB4MTQ0MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAgNjE2YyAgbi5vcmcvIj4uPElNRy5hbAorCTB4MTQ1MDogIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjggNjU2OSAgaWduPSJtaWRkbGUiLmhlaQorCTB4MTQ2MDogIDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjggM2QyMiAgZ2h0PSIzMCIud2lkdGg9IgorCTB4MTQ3MDogIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMgMmY2NCAgMjUiLnNyYz0iaWNvbnMvZAorCTB4MTQ4MDogIDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYgMmQzMiAgZWJpYW4vb3BlbmxvZ28tMgorCTB4MTQ5MDogIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUgNjI2OSAgNS5qcGciLmFsdD0iRGViaQorCTB4MTRhMDogIDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjggNzI2NSAgYW4iPi48L2E+LjxhLmhyZQorCTB4MTRiMDogIDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE3MCAgZj0iaHR0cDovL3d3dy5hcAorCTB4MTRjMDogIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkgNGQ0NyAgYWNoZS5vcmcvIj4uPElNRworCTB4MTRkMDogIDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUgMjIyMCAgLmFsaWduPSJtaWRkbGUiLgorCTB4MTRlMDogIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkgNjQ3NCAgaGVpZ2h0PSIzMiIud2lkdAorCTB4MTRmMDogIDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiAgaD0iMjU5Ii5zcmM9ImljbworCTB4MTUwMDogIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAgNmU2NyAgbnMvYXBhY2hlX3BiLnBuZworCTB4MTUxMDogIDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIgM2UwYSAgIi5hbHQ9IkFwYWNoZSI+LgorCTB4MTUyMDogIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MgMjEyZCAgPC9hPi48L0RJVj4uLjwhLQorCTB4MTUzMDogIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2MSAgLS4uLlRoaXMucGFnZS53YQorCTB4MTU0MDogIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIgNjU2MSAgcy5pbml0aWFsbHkuY3JlYQorCTB4MTU1MDogIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAgNDk2ZSAgdGVkLmJ5LkpvaG5pZS5JbgorCTB4MTU2MDogIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUgNjU3NCAgZ3JhbS4oaHR0cDovL25ldAorCTB4MTU3MDogIDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQgMjA3NyAgZ29kLm5ldC8pLi4uSXQudworCTB4MTU4MDogIDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUgNjQyMCAgYXMubGF0ZXIuZWRpdGVkLgorCTB4MTU5MDogIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMgNjM2ZiAgYnkuTWF0dGhldy5XaWxjbworCTB4MTVhMDogIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYgNjQ2OSAgeC5hbmQuSm9zaXAuUm9kaQorCTB4MTViMDogIDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkgNjY2OSAgbi4uLi5MYXN0Lm1vZGlmaQorCTB4MTVjMDogIDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAgMzQyZiAgZWQ6LiREYXRlOi4yMDA0LworCTB4MTVkMDogIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcgMjAyNCAgMDYvMjAuMTU6MzM6NTcuJAorCTB4MTVlMDogIDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQgNTkzZSAgLi4uLi0tPi4uPC9CT0RZPgorCTB4MTVmMDogIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEgICAgICAgICAgICAgICAgICAgLjwvSFRNTD4uCisyMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwMzQgMWI2ZSA0MDAwIDQwMDYgMjE1NCA3ZjAwIDAwMDEgN2YwMCAgLjQubkAuQC4hVC4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgODAxMCAgLi4ucC5QN1guSTd6Li4uLgorCTB4MDAzMDogIDMwNWYgMTBlYSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgNGRkYyAgMF8uLi4uLi4uLk0uLi5NLgorCTB4MDA0MDogIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4KKzIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDM0IDFiNzAgNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxIDdmMDAgIC40LnBALkAuIVIuLi4uLi4KKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTEgIC4uLnAuUDdYLkk3ei4uLi4KKwkweDAwMzA6ICAzMDVmIDBiZTEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIxIDRkZGMgIDBfLi4uLi4uLi5NLi4hTS4KKwkweDAwNDA6ICA5MjE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCisyMzo1NzozNy4yMzA4MzkgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBGIDU1NjA6NTU2MCgwKSBhY2sgMjA0IHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDE+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCisJMHgwMDEwOiAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMSA3ZjAwICAuNC4uQC5ALi4uLi4uLi4uCisJMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YSA4MDExICAuLi5QLnA3ei4uN1guSi4uCisJMHgwMDMwOiAgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjICAuLi41Li4uLi4uTS4uI00uCisJMHgwMDQwOiAgOTcyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIQorMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDM0IDFiNzIgNDAwMCA0MDA2IDIxNTAgN2YwMCAwMDAxIDdmMDAgIC40LnJALkAuIVAuLi4uLi4KKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNGEgMzc3YSBhM2FhIDgwMTAgIC4uLnAuUDdYLko3ei4uLi4KKwkweDAwMzA6ICAzMDVmIDA2ZDQgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzIDRkZGMgIDBfLi4uLi4uLi5NLi4jTS4KKwkweDAwNDA6ICA5NzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1jYXBYLm91dCBiL3Rlc3RzL3ByaW50LWNhcFgub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTQ0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wcmludC1jYXBYLm91dApAQCAtMCwwICsxLDQwOSBAQAorMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICA0NTAwIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgIEUuLjwuaEAuQC4hUi4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgIC4uLi4ucC5QN1gufi4uLi4KKwkweDAwMjA6ICBhMDAyIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgIC4uLi4uIS4uLi5ALi4uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMiAgICAgICAgICAgIE0uLi4uLi4uLi4uLgorMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDQ1MDAgMDAzYyAwMDAwIDQwMDAgNDAwNiAzY2JhIDdmMDAgMDAwMSAgRS4uPC4uQC5ALjwuLi4uLgorCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYxIDM3NTggODk3ZiAgLi4uLi5QLnA3ei4uN1guLgorCTB4MDAyMDogIGEwMTIgN2ZmZiA2ZWIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYSAgLi4uLm4uLi4uLkAuLi4uLgorCTB4MDAzMDogIDRkZGMgOTIxNiA0ZGRjIDkyMTYgMDEwMyAwMzAyICAgICAgICAgICAgTS4uLk0uLi4uLi4uCisyMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+CisJMHgwMDAwOiAgNDUwMCAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxICBFLi40LmpALkAuIVguLi4uCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyICAuLi4uLnAuUDdYLi43ei4uCisJMHgwMDIwOiAgODAxMCAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2ICAuLi4uNy4uLi4uLi5NLi4uCisJMHgwMDMwOiAgNGRkYyA5MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4uCisyMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICA0NTAwIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgIEUuLi4ubEAuQC4uLi4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgIC4uLi4ucC5QN1guLjd6Li4KKwkweDAwMjA6ICA4MDE4IDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgIC4uLi4uLi4uLi4uLk0uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgIE0uLi5HRVQuLy5IVFRQLzEKKwkweDAwNDA6ICAyZTMxIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggIC4xLi5Ib3N0Oi5sb2NhbGgKKwkweDAwNTA6ICA2ZjczIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgIG9zdC4uVXNlci1BZ2VudDoKKwkweDAwNjA6ICAyMDQ1IDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgIC5FTGlua3MvMC4xMC40LTcKKwkweDAwNzA6ICAyZDY0IDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgIC1kZWJpYW4uKHRleHRtb2QKKwkweDAwODA6ICA2NTNiIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgIGU7LkxpbnV4LjIuNi4xMS0KKwkweDAwOTA6ICAzMTJkIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgIDEtNjg2LXNtcC5pNjg2Oy4KKwkweDAwYTA6ICAzMTMzIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgIDEzMng1Ni0yKS4uQWNjZXAKKwkweDAwYjA6ICA3NDNhIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgIHQ6LiovKi4uQWNjZXB0LUUKKwkweDAwYzA6ICA2ZTYzIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgIG5jb2Rpbmc6Lmd6aXAuLkEKKwkweDAwZDA6ICA2MzYzIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgIGNjZXB0LUxhbmd1YWdlOi4KKwkweDAwZTA6ICA2NTZlIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgIGVuLi5Db25uZWN0aW9uOi4KKwkweDAwZjA6ICA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhICAgICAgIEtlZXAtQWxpdmUuLi4uCisyMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWZlNCA0MDAwIDQwMDYgMWNkZSA3ZjAwIDAwMDEgIEUuLjQuLkAuQC4uLi4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgIC4uLi4uUC5wN3ouLjdYLkkKKwkweDAwMjA6ICA4MDEwIDIwMDAgMzcwMyAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTggIC4uLi43Li4uLi4uLk0uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KKzIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KKwkweDAwMDA6ICA0NTAwIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEgIEUuLi4uLkAuQC4uJS4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgIC4uLi4uUC5wN3ouLjdYLkkKKwkweDAwMjA6ICA4MDE4IDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgIC4uLi4uLi4uLi4uLk0uLi4KKwkweDAwMzA6ICA0ZGRjIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAgIE0uLi5IVFRQLzEuMS4yMDAKKwkweDAwNDA6ICAyMDRmIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAgIC5PSy4uRGF0ZTouV2VkLC4KKwkweDAwNTA6ICAzMDM2IDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUgIDA2Lkp1bC4yMDA1LjAzOjUKKwkweDAwNjA6ICAzNzNhIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIgIDc6MzUuR01ULi5TZXJ2ZXIKKwkweDAwNzA6ICAzYTIwIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQgIDouQXBhY2hlLzEuMy4zMy4KKwkweDAwODA6ICAwYTRjIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAgIC5MYXN0LU1vZGlmaWVkOi4KKwkweDAwOTA6ICA1Mzc1IDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQgIFN1biwuMTUuQXVnLjIwMDQKKwkweDAwYTA6ICAyMDMwIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUgIC4wMDo0Mzo0MS5HTVQuLkUKKwkweDAwYjA6ICA1NDYxIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzggIFRhZzouIjZlODBmMC0xNDgKKwkweDAwYzA6ICA2MTJkIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMgIGEtNDExZWIxYmQiLi5BY2MKKwkweDAwZDA6ICA2NTcwIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUgIGVwdC1SYW5nZXM6LmJ5dGUKKwkweDAwZTA6ICA3MzBkIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQgIHMuLkNvbnRlbnQtTGVuZ3QKKwkweDAwZjA6ICA2ODNhIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMgIGg6LjUyNTguLktlZXAtQWwKKwkweDAxMDA6ICA2OTc2IDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMgIGl2ZToudGltZW91dD0xNSwKKwkweDAxMTA6ICAyMDZkIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgIC5tYXg9MTAwLi5Db25uZWMKKwkweDAxMjA6ICA3NDY5IDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgIHRpb246LktlZXAtQWxpdmUKKwkweDAxMzA6ICAwZDBhIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAgIC4uQ29udGVudC1UeXBlOi4KKwkweDAxNDA6ICA3NDY1IDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMgIHRleHQvaHRtbDsuY2hhcnMKKwkweDAxNTA6ICA2NTc0IDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQgIGV0PWlzby04ODU5LTEuLi4KKwkweDAxNjA6ICAwYTNjIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAgIC48IURPQ1RZUEUuSFRNTC4KKwkweDAxNzA6ICA1MDU1IDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYgIFBVQkxJQy4iLS8vVzNDLy8KKwkweDAxODA6ICA0NDU0IDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIgIERURC5IVE1MLjQuMDEuVHIKKwkweDAxOTA6ICA2MTZlIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UgIGFuc2l0aW9uYWwvL0VOIj4KKwkweDAxYTA6ICAwYTNjIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAgIC48SFRNTD4uPEhFQUQ+Li4KKwkweDAxYjA6ICAyMDIwIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUgIC4uPE1FVEEuSFRUUC1FUVUKKwkweDAxYzA6ICA0OTU2IDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgIElWPSJDb250ZW50LVR5cGUKKwkweDAxZDA6ICAyMjIwIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYgICIuQ09OVEVOVD0idGV4dC8KKwkweDAxZTA6ICA2ODc0IDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMgIGh0bWw7LmNoYXJzZXQ9aXMKKwkweDAxZjA6ICA2ZjJkIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQgIG8tODg1OS0xIj4uLi4uPE0KKwkweDAyMDA6ICA0NTU0IDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkgIEVUQS5OQU1FPSJEZXNjcmkKKwkweDAyMTA6ICA3MDc0IDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIgIHB0aW9uIi5DT05URU5UPSIKKwkweDAyMjA6ICA1NDY4IDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQgIFRoZS5pbml0aWFsLmluc3QKKwkweDAyMzA6ICA2MTZjIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkgIGFsbGF0aW9uLm9mLkRlYmkKKwkweDAyNDA6ICA2MTZlIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAgIGFuLmFwYWNoZS4iPi4uLi4KKwkweDAyNTA6ICAzYzU0IDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQgIDxUSVRMRT5QbGFjZWhvbGQKKwkweDAyNjA6ICA2NTcyIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEgIGVyLnBhZ2U8L1RJVExFPi4KKwkweDAyNzA6ICAzYzJmIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUgIDwvSEVBRD4uPEJPRFkuVEUKKwkweDAyODA6ICA1ODU0IDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMgIFhUPSIjMDAwMDAwIi5CR0MKKwkweDAyOTA6ICA0ZjRjIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMgIE9MT1I9IiNGRkZGRkYiLkwKKwkweDAyYTA6ICA0OTRlIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMgIElOSz0iIzAwMDBFRiIuVkwKKwkweDAyYjA6ICA0OTRlIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMgIElOSz0iIzU1MTg4QSIuQUwKKwkweDAyYzA6ICA0OTRlIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEgIElOSz0iI0ZGMDAwMCI+Li4KKwkweDAyZDA6ICAzYzQ4IDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAgIDxIMT5QbGFjZWhvbGRlci4KKwkweDAyZTA6ICA3MDYxIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYgIHBhZ2U8L0gxPi48SDI+SWYKKwkweDAyZjA6ICAyMDc5IDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIgIC55b3UuYXJlLmp1c3QuYnIKKwkweDAzMDA6ICA2Zjc3IDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYgIG93c2luZy50aGUud2ViPC8KKwkweDAzMTA6ICA2ODMyIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUgIGgyPi4uPFA+VGhlLm93bmUKKwkweDAzMjA6ICA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkgIHIub2YudGhpcy53ZWIuc2kKKwkweDAzMzA6ICA3NDY1IDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUgIHRlLmhhcy5ub3QucHV0LnUKKwkweDAzNDA6ICA3MDIwIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAgIHAuYW55LndlYi5wYWdlcy4KKwkweDAzNTA6ICA3OTY1IDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUgIHlldC4uUGxlYXNlLmNvbWUKKwkweDAzNjA6ICAyMDYyIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UgIC5iYWNrLmxhdGVyLjwvUD4KKwkweDAzNzA6ICAwYTBhIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQgIC4uPFA+PFNNQUxMPjxDSVQKKwkweDAzODA6ICA0NTNlIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYgIEU+TW92ZS5hbG9uZywubm8KKwkweDAzOTA6ICA3NDY4IDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIgIHRoaW5nLnRvLnNlZS5oZXIKKwkweDAzYTA6ICA2NTJlIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MgIGUuLi48L0NJVEU+LjotKTwKKwkweDAzYjA6ICAyZjUzIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIgIC9TTUFMTD48L1A+Li48SDIKKwkweDAzYzA6ICAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkgID5JZi55b3UuYXJlLnRyeWkKKwkweDAzZDA6ICA2ZTY3IDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUgIG5nLnRvLmxvY2F0ZS50aGUKKwkweDAzZTA6ICAyMDYxIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYgIC5hZG1pbmlzdHJhdG9yLm8KKwkweDAzZjA6ICA2NjIwIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYgIGYudGhpcy5tYWNoaW5lPC8KKwkweDA0MDA6ICA0ODMyIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcgIEgyPi4uPFA+SWYueW91LncKKwkweDA0MTA6ICA2MTZlIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYgIGFudC50by5yZXBvcnQuc28KKwkweDA0MjA6ICA2ZDY1IDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjggIG1ldGhpbmcuYWJvdXQudGgKKwkweDA0MzA6ICA2OTczIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkgIGlzLmhvc3Qncy5iZWhhdmkKKwkweDA0NDA6ICA2ZjcyIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEgIG9yLC5wbGVhc2UuY29udGEKKwkweDA0NTA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAgIGN0LnRoZS5JbnRlcm5ldC4KKwkweDA0NjA6ICA1MzY1IDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIgIFNlcnZpY2UuUHJvdmlkZXIKKwkweDA0NzA6ICAyMDI4IDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAgIC4oSVNQKS5pbnZvbHZlZC4KKwkweDA0ODA6ICA2NDY5IDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MgIGRpcmVjdGx5LjwvUD4uLjwKKwkweDA0OTA6ICA1MDNlIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUgIFA+U2VlLnRoZS48QS5ocmUKKwkweDA0YTA6ICA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIgIGY9Imh0dHA6Ly93d3cuYWIKKwkweDA0YjA6ICA3NTczIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIgIHVzZS5uZXQvIj5OZXR3b3IKKwkweDA0YzA6ICA2YjIwIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcgIGsuQWJ1c2UuQ2xlYXJpbmcKKwkweDA0ZDA6ICA2ODZmIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYgIGhvdXNlPC9BPi5mb3IuaG8KKwkweDA0ZTA6ICA3NzIwIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAgIHcudG8uZG8udGhpcy48L1AKKwkweDA0ZjA6ICAzZTBhIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgID4uLjxIMj5JZi55b3UuYXIKKwkweDA1MDA6ICA2NTIwIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEgIGUudGhlLmFkbWluaXN0cmEKKwkweDA1MTA6ICA3NDZmIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjggIHRvci5vZi50aGlzLm1hY2gKKwkweDA1MjA6ICA2OTZlIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUgIGluZTwvSDI+Li48UD5UaGUKKwkweDA1MzA6ICAyMDY5IDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMgIC5pbml0aWFsLmluc3RhbGwKKwkweDA1NDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYgIGF0aW9uLm9mLjxBLmhyZWYKKwkweDA1NTA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgID0iaHR0cDovL3d3dy5kZWIKKwkweDA1NjA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUgIGlhbi5vcmcvIj5EZWJpYW4KKwkweDA1NzA6ICAyNzczIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUgICdzLmFwYWNoZTwvQT4ud2UKKwkweDA1ODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgIGIuc2VydmVyLnBhY2thZ2UKKwkweDA1OTA6ICAyMDc3IDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUgIC53YXMuc3VjY2Vzc2Z1bC4KKwkweDA1YTA6ICAzYzJmIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcgIDwvUD4uLjxQPjxTVFJPTkcKKwkweDA1YjA6ICAzZTU5IDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMgID5Zb3Uuc2hvdWxkLnJlcGwKKwkweDA1YzA6ICA2MTYzIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkgIGFjZS50aGlzLnBhZ2Uud2kKKwkweDA1ZDA6ICA3NDY4IDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAgIHRoLnlvdXIub3duLndlYi4KKwkweDA1ZTA6ICA3MDYxIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMgIHBhZ2VzLmFzLnNvb24uYXMKKwkweDA1ZjA6ICAyMDcwIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYgIC5wb3NzaWJsZS48L1NUUk8KKwkweDA2MDA6ICA0ZTQ3IDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUgIE5HPjwvUD4uLjxQPlVubGUKKwkweDA2MTA6ICA3MzczIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkgIHNzLnlvdS5jaGFuZ2VkLmkKKwkweDA2MjA6ICA3NDczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUgIHRzLmNvbmZpZ3VyYXRpb24KKwkweDA2MzA6ICAyYzIwIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUgICwueW91ci5uZXcuc2VydmUKKwkweDA2NDA6ICA3MjIwIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAgIHIuaXMuY29uZmlndXJlZC4KKwkweDA2NTA6ICA2MTczIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UgIGFzLmZvbGxvd3M6LjxVTD4KKwkweDA2NjA6ICAwYTNjIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQgIC48TEk+LkNvbmZpZ3VyYXQKKwkweDA2NzA6ICA2OTZmIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUgIGlvbi5maWxlcy5jYW4uYmUKKwkweDA2ODA6ICAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUgIC5mb3VuZC5pbi48VFQ+L2UKKwkweDA2OTA6ICA3NDYzIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgIHRjL2FwYWNoZTwvVFQ+LjwKKwkweDA2YTA6ICAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgIC9MST4uLjxMST4uVGhlLjwKKwkweDA2YjA6ICA1NDU0IDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MgIFRUPkRvY3VtZW50Um9vdDwKKwkweDA2YzA6ICAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQgIC9UVD4sLndoaWNoLmlzLnQKKwkweDA2ZDA6ICA2ODY1IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQgIGhlLmRpcmVjdG9yeS51bmQKKwkweDA2ZTA6ICA2NTcyIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUgIGVyLndoaWNoLmFsbC55b3UKKwkweDA2ZjA6ICA3MjBhIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYgIHIuSFRNTC5maWxlcy5zaG8KKwkweDA3MDA6ICA3NTZjIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUgIHVsZC5leGlzdCwuaXMuc2UKKwkweDA3MTA6ICA3NDIwIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgIHQudG8uPFRUPi92YXIvd3cKKwkweDA3MjA6ICA3NzNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgIHc8L1RUPi48L0xJPi4uPEwKKwkweDA3MzA6ICA0OTNlIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEgIEk+LkNHSS5zY3JpcHRzLmEKKwkweDA3NDA6ICA3MjY1IDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUgIHJlLmxvb2tlZC5mb3IuaW4KKwkweDA3NTA6ICAyMDNjIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcgIC48VFQ+L3Vzci9saWIvY2cKKwkweDA3NjA6ICA2OTJkIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgIGktYmluPC9UVD4sLndoaWMKKwkweDA3NzA6ICA2ODIwIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEgIGguaXMud2hlcmUuRGViaWEKKwkweDA3ODA6ICA2ZTIwIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAgIG4ucGFja2FnZXMud2lsbC4KKwkweDA3OTA6ICA3MDZjIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkgIHBsYWNlLnRoZWlyLnNjcmkKKwkweDA3YTA6ICA3MDc0IDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgIHB0cy48L0xJPi4uPExJPi4KKwkweDA3YjA6ICA0YzZmIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMgIExvZy5maWxlcy5hcmUucGwKKwkweDA3YzA6ICA2MTYzIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgIGFjZWQuaW4uPFRUPi92YXIKKwkweDA3ZDA6ICAyZjZjIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgIC9sb2cvYXBhY2hlPC9UVD4KKwkweDA3ZTA6ICAyYzIwIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYgICwuYW5kLndpbGwuYmUucm8KKwkweDA3ZjA6ICA3NDYxIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQgIHRhdGVkLndlZWtseS4uLlQKKwkweDA4MDA6ICA2ODY1IDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAgIGhlLmZyZXF1ZW5jeS5vZi4KKwkweDA4MTA6ICA3MjZmIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAgIHJvdGF0aW9uLmNhbi5iZS4KKwkweDA4MjA6ICA2NTYxIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIgIGVhc2lseS5jaGFuZ2VkLmIKKwkweDA4MzA6ICA3OTIwIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUgIHkuZWRpdGluZy48VFQ+L2UKKwkweDA4NDA6ICA3NDYzIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEgIHRjL2xvZ3JvdGF0ZS5kL2EKKwkweDA4NTA6ICA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgIHBhY2hlPC9UVD4uPC9MST4KKwkweDA4NjA6ICAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUgIC4uPExJPi5UaGUuZGVmYXUKKwkweDA4NzA6ICA2Yzc0IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQgIGx0LmRpcmVjdG9yeS5pbmQKKwkweDA4ODA6ICA2NTc4IDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUgIGV4LmlzLjxUVD5pbmRleC4KKwkweDA4OTA6ICA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkgIGh0bWw8L1RUPiwubWVhbmkKKwkweDA4YTA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMgIG5nLnRoYXQucmVxdWVzdHMKKwkweDA4YjA6ICAwYTY2IDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgIC5mb3IuYS5kaXJlY3RvcnkKKwkweDA4YzA6ICAyMDNjIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYgIC48VFQ+L2Zvby9iYXIvPC8KKwkweDA4ZDA6ICA1NDU0IDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjggIFRUPi53aWxsLmdpdmUudGgKKwkweDA4ZTA6ICA2NTIwIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjggIGUuY29udGVudHMub2YudGgKKwkweDA4ZjA6ICA2NTIwIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgIGUuZmlsZS48VFQ+L3Zhci8KKwkweDA5MDA6ICA3Nzc3IDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUgIHd3dy9mb28vYmFyL2luZGUKKwkweDA5MTA6ICA3ODJlIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkgIHguaHRtbDwvVFQ+LmlmLmkKKwkweDA5MjA6ICA3NDIwIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkgIHQuZXhpc3RzLihhc3N1bWkKKwkweDA5MzA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgIG5nLnRoYXQuPFRUPi92YXIKKwkweDA5NDA6ICAyZjc3IDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUgIC93d3c8L1RUPi5pcy55b3UKKwkweDA5NTA6ICA3MjIwIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYgIHIuPFRUPkRvY3VtZW50Um8KKwkweDA5NjA6ICA2Zjc0IDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEgIG90PC9UVD4pLjwvTEk+Li4KKwkweDA5NzA6ICAzYzRjIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQgIDxMST4uVXNlci5kaXJlY3QKKwkweDA5ODA6ICA2ZjcyIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUgIG9yaWVzLmFyZS5lbmFibGUKKwkweDA5OTA6ICA2NDJjIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUgIGQsLmFuZC51c2VyLmRvY3UKKwkweDA5YTA6ICA2ZDY1IDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYgIG1lbnRzLndpbGwuYmUubG8KKwkweDA5YjA6ICA2ZjZiIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAgIG9rZWQuZm9yLmluLnRoZS4KKwkweDA5YzA6ICAzYzU0IDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MgIDxUVD5wdWJsaWNfaHRtbDwKKwkweDA5ZDA6ICAyZjU0IDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYgIC9UVD4uZGlyZWN0b3J5Lm8KKwkweDA5ZTA6ICA2NjIwIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQgIGYudGhlLnVzZXJzJy5ob20KKwkweDA5ZjA6ICA2NTczIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEgIGVzLi4uVGhlc2UuZGlycy4KKwkweDBhMDA6ICA3MzY4IDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAgIHNob3VsZC5iZS51bmRlci4KKwkweDBhMTA6ICAzYzU0IDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAgIDxUVD4vaG9tZTwvVFQ+LC4KKwkweDBhMjA6ICA2MTZlIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUgIGFuZC51c2Vycy53aWxsLm4KKwkweDBhMzA6ICA2Zjc0IDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkgIG90LmJlLmFibGUudG8uc3kKKwkweDBhNDA6ICA2ZDZjIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQgIG1saW5rLnRvLmZpbGVzLnQKKwkweDBhNTA6ICA2ODY1IDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYgIGhleS5kb24ndC5vd24uPC8KKwkweDBhNjA6ICA0YzQ5IDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQgIExJPi4uPC9VTD4uQWxsLnQKKwkweDBhNzA6ICA2ODY1IDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMgIGhlLnN0YW5kYXJkLmFwYWMKKwkweDBhODA6ICA2ODY1IDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEgIGhlLm1vZHVsZXMuYXJlLmEKKwkweDBhOTA6ICA3NjYxIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjggIHZhaWxhYmxlLndpdGgudGgKKwkweDBhYTA6ICA2OTczIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEgIGlzLnJlbGVhc2UuYW5kLmEKKwkweDBhYjA6ICA3MjY1IDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcgIHJlLm5vdy5tYW5hZ2VkLncKKwkweDBhYzA6ICA2OTc0IDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkgIGl0aC5kZWJjb25mLi4uVHkKKwkweDBhZDA6ICA3MDY1IDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYgIHBlLjxUVD5kcGtnLXJlY28KKwkweDBhZTA6ICA2ZTY2IDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYgIG5maWd1cmUuYXBhY2hlPC8KKwkweDBhZjA6ICA1NDU0IDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjggIFRUPi50by5zZWxlY3Qud2gKKwkweDBiMDA6ICA2OTYzIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAgIGljaC5tb2R1bGVzLnlvdS4KKwkweDBiMTA6ICA3NzYxIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQgIHdhbnQuZW5hYmxlZC4uLk0KKwkweDBiMjA6ICA2MTZlIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUgIGFueS5vdGhlci5tb2R1bGUKKwkweDBiMzA6ICA3MzIwIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEgIHMuYXJlLmF2YWlsYWJsZS4KKwkweDBiNDA6ICA3NDY4IDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkgIHRocm91Z2gudGhlLkRlYmkKKwkweDBiNTA6ICA2MTZlIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUgIGFuLnBhY2thZ2Uuc3lzdGUKKwkweDBiNjA6ICA2ZDIwIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMgIG0ud2l0aC50aGUubmFtZXMKKwkweDBiNzA6ICAyMDNjIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQgIC48VFQ+bGliYXBhY2hlLW0KKwkweDBiODA6ICA2ZjY0IDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYgIG9kLSo8L1RUPi4uSWYueW8KKwkweDBiOTA6ICA3NTIwIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMgIHUubmVlZC50by5jb21waWwKKwkweDBiYTA6ICA2NTIwIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMgIGUuYS5tb2R1bGUueW91cnMKKwkweDBiYjA6ICA2NTZjIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUgIGVsZiwueW91LndpbGwubmUKKwkweDBiYzA6ICA2NTY0IDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjggIGVkLnRvLmluc3RhbGwudGgKKwkweDBiZDA6ICA2NTBhIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYgIGUuPFRUPmFwYWNoZS1kZXYKKwkweDBiZTA6ICAzYzJmIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEgIDwvVFQ+LnBhY2thZ2UuLi4KKwkweDBiZjA6ICAzYzUwIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgIDxQPk1vcmUuZG9jdW1lbnQKKwkweDBjMDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAgIGF0aW9uLm9uLkFwYWNoZS4KKwkweDBjMTA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EgIGNhbi5iZS5mb3VuZC5vbjoKKwkweDBjMjA6ICAwYTNjIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgIC48VUw+LjxMST4uVGhlLjwKKwkweDBjMzA6ICA0MTIwIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEgIEEuSFJFRj0iL2RvYy9hcGEKKwkweDBjNDA6ICA2MzY4IDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIgIGNoZS1kb2MvbWFudWFsLyIKKwkweDBjNTA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgID5BcGFjaGUuZG9jdW1lbnQKKwkweDBjNjA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQgIGF0aW9uPC9BPi5zdG9yZWQKKwkweDBjNzA6ICAyMDZmIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUgIC5vbi55b3VyLnNlcnZlci4KKwkweDBjODA6ICAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgIDwvTEk+Li48TEk+LlRoZS4KKwkweDBjOTA6ICAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgIDxBLkhSRUY9Imh0dHA6Ly8KKwkweDBjYTA6ICA3Nzc3IDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgIHd3dy5hcGFjaGUub3JnLyIKKwkweDBjYjA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MgID5BcGFjaGUuUHJvamVjdDwKKwkweDBjYzA6ICAyZjQxIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgIC9BPi5ob21lLnNpdGUuPC8KKwkweDBjZDA6ICA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgIExJPi4uPExJPi5UaGUuPEEKKwkweDBjZTA6ICAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgIC5IUkVGPSJodHRwOi8vd3cKKwkweDBjZjA6ICA3NzJlIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcgIHcuYXBhY2hlLXNzbC5vcmcKKwkweDBkMDA6ICAyZjIyIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEgIC8iPkFwYWNoZS1TU0w8L0EKKwkweDBkMTA6ICAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgID4uaG9tZS5zaXRlLjwvTEkKKwkweDBkMjA6ICAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggID4uLjxMST4uVGhlLjxBLkgKKwkweDBkMzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMgIFJFRj0iaHR0cDovL3BlcmwKKwkweDBkNDA6ICAyZTYxIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYgIC5hcGFjaGUub3JnLyI+bW8KKwkweDBkNTA6ICA2NDIwIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAgIGQucGVybDwvQT4uaG9tZS4KKwkweDBkNjA6ICA3MzY5IDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgIHNpdGUuPC9MST4uLjxMST4KKwkweDBkNzA6ICAwYTU0IDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIC5UaGUuPEEuSFJFRj0iaHQKKwkweDBkODA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcgIHRwOi8vd3d3LmFwYWNoZXcKKwkweDBkOTA6ICA2NTY1IDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUgIGVlay5jb20vIj5BcGFjaGUKKwkweDBkYTA6ICA1NzY1IDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQgIFdlZWs8L0E+Lm5ld3NsZXQKKwkweDBkYjA6ICA3NDY1IDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgIHRlci48L0xJPi4uPExJPi4KKwkweDBkYzA6ICA1NDY4IDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgIFRoZS48QS5IUkVGPSJodHQKKwkweDBkZDA6ICA3MDNhIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYgIHA6Ly93d3cuZGViaWFuLm8KKwkweDBkZTA6ICA3MjY3IDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAgIHJnL2RvYy8iPkRlYmlhbi4KKwkweDBkZjA6ICA1MDcyIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgIFByb2plY3QuRG9jdW1lbnQKKwkweDBlMDA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAgIGF0aW9uPC9BPi53aGljaC4KKwkweDBlMTA6ICA2MzZmIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMgIGNvbnRhaW5zLkhPV1RPcywKKwkweDBlMjA6ICAyMDQ2IDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcgIC5GQVFzLC5hbmQuc29mdHcKKwkweDBlMzA6ICA2MTcyIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkgIGFyZS51cGRhdGVzLjwvTEkKKwkweDBlNDA6ICAzZTBhIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAgID4uPC9VTD4uLjxQPllvdS4KKwkweDBlNTA6ICA2MzYxIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQgIGNhbi5hbHNvLmNvbnN1bHQKKwkweDBlNjA6ICAyMDc0IDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAgIC50aGUubGlzdC5vZi48QS4KKwkweDBlNzA6ICA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgIEhSRUY9Imh0dHA6Ly93d3cKKwkweDBlODA6ICAyZTYyIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEgIC5ib3V0ZWxsLmNvbS9mYXEKKwkweDBlOTA6ICAyZjIyIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUgIC8iPldvcmxkLldpZGUuV2UKKwkweDBlYTA6ICA2MjIwIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIgIGIuRnJlcXVlbnRseS5Bc2sKKwkweDBlYjA6ICA2NTY0IDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UgIGVkLlF1ZXN0aW9uczwvQT4KKwkweDBlYzA6ICAyMDY2IDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUgIC5mb3IuaW5mb3JtYXRpb24KKwkweDBlZDA6ICAyZTBhIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIgIC4uLjxIMj5MZXQub3RoZXIKKwkweDBlZTA6ICAyMDcwIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYgIC5wZW9wbGUua25vdy5hYm8KKwkweDBlZjA6ICA3NTc0IDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYgIHV0LnRoaXMuc2VydmVyPC8KKwkweDBmMDA6ICA0ODMyIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIEgyPi4uPEEuSFJFRj0iaHQKKwkweDBmMTA6ICA3NDcwIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgIHRwOi8vbmV0Y3JhZnQuY28KKwkweDBmMjA6ICA2ZDJmIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UgIG0vIj5OZXRjcmFmdDwvQT4KKwkweDBmMzA6ICAyMDcwIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQgIC5wcm92aWRlcy5hbi5pbnQKKwkweDBmNDA6ICA2NTcyIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUgIGVyZXN0aW5nLmZyZWUuc2UKKwkweDBmNTA6ICA3Mjc2IDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkgIHJ2aWNlLmZvci53ZWIuc2kKKwkweDBmNjA6ICA3NDY1IDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUgIHRlLm1vbml0b3JpbmcuYW4KKwkweDBmNzA6ICA2NDIwIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMgIGQuc3RhdGlzdGljLmNvbGwKKwkweDBmODA6ICA2NTYzIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAgIGVjdGlvbi4uWW91LmNhbi4KKwkweDBmOTA6ICA2YzY1IDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIgIGxldC50aGVtLmtub3cuYWIKKwkweDBmYTA6ICA2Zjc1IDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAgIG91dC55b3VyLnNlcnZlci4KKwkweDBmYjA6ICA3NTczIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDggIHVzaW5nLnRoZWlyLjxBLkgKKwkweDBmYzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkgIFJFRj0iaHR0cDovL3VwdGkKKwkweDBmZDA6ICA2ZDY1IDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgIG1lLm5ldGNyYWZ0LmNvbS8KKwkweDBmZTA6ICAyMjNlIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUgICI+aW50ZXJmYWNlPC9BPi4KKwkweDBmZjA6ICAwYTQ1IDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYgIC5FbmFibGluZy50aGUubW8KKwkweDEwMDA6ICA2ZTY5IDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIgIG5pdG9yaW5nLm9mLnlvdXIKKwkweDEwMTA6ICAyMDczIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYgIC5zZXJ2ZXIud2lsbC5wcm8KKwkweDEwMjA6ICA3NjY5IDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMgIHZpZGUuYS5iZXR0ZXIuZ2wKKwkweDEwMzA6ICA2ZjYyIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYgIG9iYWwub3ZlcnZpZXcub2YKKwkweDEwNDA6ICAyMDc3IDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjggIC53aG8uaXMudXNpbmcud2gKKwkweDEwNTA6ICA2MTc0IDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUgIGF0LmFuZC53aGVyZSwuYW4KKwkweDEwNjA6ICA2NDIwIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAgIGQuaXQud291bGQuZ2l2ZS4KKwkweDEwNzA6ICA0NDY1IDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEgIERlYmlhbi5hLmJldHRlci4KKwkweDEwODA6ICA2Zjc2IDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAgIG92ZXJ2aWV3Lm9mLnRoZS4KKwkweDEwOTA6ICA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUgIGFwYWNoZS5wYWNrYWdlLnUKKwkweDEwYTA6ICA3MzYxIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQgIHNhZ2UuLi48SDI+QWJvdXQKKwkweDEwYjA6ICAyMDc0IDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEgIC50aGlzLnBhZ2U8L0gyPi4KKwkweDEwYzA6ICAwYTNjIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcgIC48SU1HLkFMSUdOPSJyaWcKKwkweDEwZDA6ICA2ODc0IDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDggIGh0Ii5BTFQ9IiIuSEVJR0gKKwkweDEwZTA6ICA1NDNkIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIgIFQ9IjI0NyIuV0lEVEg9IjIKKwkweDEwZjA6ICAzNzM4IDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEgIDc4Ii5TUkM9Imljb25zL2oKKwkweDExMDA6ICA2ODY1IDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UgIGhlMDYxLnBuZyI+Li48UD4KKwkweDExMTA6ICA1NDY4IDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjggIFRoaXMuaXMuYS5wbGFjZWgKKwkweDExMjA6ICA2ZjZjIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEgIG9sZGVyLnBhZ2UuaW5zdGEKKwkweDExMzA6ICA2YzZjIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDggIGxsZWQuYnkudGhlLjxBLkgKKwkweDExNDA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgIFJFRj0iaHR0cDovL3d3dy4KKwkweDExNTA6ICA2NDY1IDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIgIGRlYmlhbi5vcmcvIj5EZWIKKwkweDExNjA6ICA2OTYxIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAgIGlhbjwvQT4ucmVsZWFzZS4KKwkweDExNzA6ICA2ZjY2IDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUgIG9mLnRoZS5hcGFjaGUuV2UKKwkweDExODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgIGIuc2VydmVyLnBhY2thZ2UKKwkweDExOTA6ICAyZTBhIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUgIC4uLjxQPlRoaXMuY29tcHUKKwkweDExYTA6ICA3NDY1IDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUgIHRlci5oYXMuaW5zdGFsbGUKKwkweDExYjA6ICA2NDIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUgIGQudGhlLkRlYmlhbi5HTlUKKwkweDExYzA6ICAyZjRjIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcgIC9MaW51eC5vcGVyYXRpbmcKKwkweDExZDA6ICAyMDczIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAgIC5zeXN0ZW0sLmJ1dC5pdC4KKwkweDExZTA6ICA2ODYxIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjggIGhhcy48c3Ryb25nPm5vdGgKKwkweDExZjA6ICA2OTZlIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQgIGluZy50by5kby53aXRoLnQKKwkweDEyMDA6ICA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMgIGhlLkRlYmlhbi5Qcm9qZWMKKwkweDEyMTA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEgIHQ8L3N0cm9uZz4uLlBsZWEKKwkweDEyMjA6ICA3MzY1IDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgIHNlLmRvLjxzdHJvbmc+bm8KKwkweDEyMzA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEgIHQ8L3N0cm9uZz4uY29udGEKKwkweDEyNDA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgIGN0LnRoZS5EZWJpYW4uUHIKKwkweDEyNTA6ICA2ZjZhIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MgIG9qZWN0LmFib3V0Lml0LjwKKwkweDEyNjA6ICAyZjUwIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYgIC9QPi4uPFA+SWYueW91LmYKKwkweDEyNzA6ICA2OTZlIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkgIGluZC5hLmJ1Zy5pbi50aGkKKwkweDEyODA6ICA3MzIwIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgIHMuYXBhY2hlLnBhY2thZ2UKKwkweDEyOTA6ICAyYzIwIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkgICwub3IuaW4uQXBhY2hlLmkKKwkweDEyYTA6ICA3NDczIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkgIHRzZWxmLC5wbGVhc2UuZmkKKwkweDEyYjA6ICA2YzY1IDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAgIGxlLmEuYnVnLnJlcG9ydC4KKwkweDEyYzA6ICA2ZjZlIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQgIG9uLml0Li4uSW5zdHJ1Y3QKKwkweDEyZDA6ICA2OTZmIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjggIGlvbnMub24uZG9pbmcudGgKKwkweDEyZTA6ICA2OTczIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQgIGlzLC5hbmQudGhlLmxpc3QKKwkweDEyZjA6ICAyMDZmIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgIC5vZi48QS5IUkVGPSJodHQKKwkweDEzMDA6ICA3MDNhIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUgIHA6Ly9idWdzLmRlYmlhbi4KKwkweDEzMTA6ICA2ZjcyIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UgIG9yZy9zcmM6YXBhY2hlIj4KKwkweDEzMjA6ICA2YjZlIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYgIGtub3duLmJ1Z3M8L0E+Lm8KKwkweDEzMzA6ICA2NjIwIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgIGYudGhpcy5wYWNrYWdlLC4KKwkweDEzNDA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgIGNhbi5iZS5mb3VuZC5pbi4KKwkweDEzNTA6ICA3NDY4IDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIHRoZS4uPEEuSFJFRj0iaHQKKwkweDEzNjA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUgIHRwOi8vd3d3LmRlYmlhbi4KKwkweDEzNzA6ICA2ZjcyIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkgIG9yZy9CdWdzL1JlcG9ydGkKKwkweDEzODA6ICA2ZTY3IDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQgIG5nIj5EZWJpYW4uQnVnLlQKKwkweDEzOTA6ICA3MjYxIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYgIHJhY2tpbmcuU3lzdGVtPC8KKwkweDEzYTA6ICA0MTNlIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYgIEE+Li4uPFA+VGhhbmtzLmYKKwkweDEzYjA6ICA2ZjcyIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEgIG9yLnVzaW5nLnRoaXMucGEKKwkweDEzYzA6ICA2MzZiIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIgIGNrYWdlLC5hbmQuY29uZ3IKKwkweDEzZDA6ICA2MTc0IDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkgIGF0dWxhdGlvbnMuZm9yLnkKKwkweDEzZTA6ICA2Zjc1IDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAgIG91ci5jaG9pY2Uub2YuYS4KKwkweDEzZjA6ICA0NDY1IDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYgIERlYmlhbi5zeXN0ZW0hPC8KKwkweDE0MDA6ICA1MDNlIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIgIFA+Li48RElWLmFsaWduPSIKKwkweDE0MTA6ICA2MzY1IDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYgIGNlbnRlciI+LjxhLmhyZWYKKwkweDE0MjA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgID0iaHR0cDovL3d3dy5kZWIKKwkweDE0MzA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAgIGlhbi5vcmcvIj4uPElNRy4KKwkweDE0NDA6ICA2MTZjIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjggIGFsaWduPSJtaWRkbGUiLmgKKwkweDE0NTA6ICA2NTY5IDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjggIGVpZ2h0PSIzMCIud2lkdGgKKwkweDE0NjA6ICAzZDIyIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMgID0iMjUiLnNyYz0iaWNvbnMKKwkweDE0NzA6ICAyZjY0IDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYgIC9kZWJpYW4vb3BlbmxvZ28KKwkweDE0ODA6ICAyZDMyIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUgIC0yNS5qcGciLmFsdD0iRGUKKwkweDE0OTA6ICA2MjY5IDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjggIGJpYW4iPi48L2E+LjxhLmgKKwkweDE0YTA6ICA3MjY1IDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgIHJlZj0iaHR0cDovL3d3dy4KKwkweDE0YjA6ICA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkgIGFwYWNoZS5vcmcvIj4uPEkKKwkweDE0YzA6ICA0ZDQ3IDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUgIE1HLmFsaWduPSJtaWRkbGUKKwkweDE0ZDA6ICAyMjIwIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkgICIuaGVpZ2h0PSIzMiIud2kKKwkweDE0ZTA6ICA2NDc0IDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkgIGR0aD0iMjU5Ii5zcmM9ImkKKwkweDE0ZjA6ICA2MzZmIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAgIGNvbnMvYXBhY2hlX3BiLnAKKwkweDE1MDA6ICA2ZTY3IDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIgIG5nIi5hbHQ9IkFwYWNoZSIKKwkweDE1MTA6ICAzZTBhIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MgID4uPC9hPi48L0RJVj4uLjwKKwkweDE1MjA6ICAyMTJkIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgICEtLS4uLlRoaXMucGFnZS4KKwkweDE1MzA6ICA3NzYxIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIgIHdhcy5pbml0aWFsbHkuY3IKKwkweDE1NDA6ICA2NTYxIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAgIGVhdGVkLmJ5LkpvaG5pZS4KKwkweDE1NTA6ICA0OTZlIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUgIEluZ3JhbS4oaHR0cDovL24KKwkweDE1NjA6ICA2NTc0IDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQgIGV0Z29kLm5ldC8pLi4uSXQKKwkweDE1NzA6ICAyMDc3IDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUgIC53YXMubGF0ZXIuZWRpdGUKKwkweDE1ODA6ICA2NDIwIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMgIGQuYnkuTWF0dGhldy5XaWwKKwkweDE1OTA6ICA2MzZmIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYgIGNveC5hbmQuSm9zaXAuUm8KKwkweDE1YTA6ICA2NDY5IDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkgIGRpbi4uLi5MYXN0Lm1vZGkKKwkweDE1YjA6ICA2NjY5IDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAgIGZpZWQ6LiREYXRlOi4yMDAKKwkweDE1YzA6ICAzNDJmIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcgIDQvMDYvMjAuMTU6MzM6NTcKKwkweDE1ZDA6ICAyMDI0IDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQgIC4kLi4uLi0tPi4uPC9CT0QKKwkweDE1ZTA6ICA1OTNlIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEgICAgICAgICAgICAgIFk+LjwvSFRNTD4uCisyMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMSAgRS4uNC5uQC5ALiFULi4uLgorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSAgLi4uLi5wLlA3WC5JN3ouLgorCTB4MDAyMDogIDgwMTAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSAgLi4wXy4uLi4uLi4uTS4uLgorCTB4MDAzMDogIDRkZGMgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgorMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSAgRS4uNC5wQC5ALiFSLi4uLgorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSAgLi4uLi5wLlA3WC5JN3ouLgorCTB4MDAyMDogIDgwMTEgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSAgLi4wXy4uLi4uLi4uTS4uIQorCTB4MDAzMDogIDRkZGMgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgorMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMSAgRS4uNC4uQC5ALi4uLi4uLgorCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YSAgLi4uLi5QLnA3ei4uN1guSgorCTB4MDAyMDogIDgwMTEgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyAgLi4uLi41Li4uLi4uTS4uIworCTB4MDAzMDogIDRkZGMgOTcyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uIQorMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEgIEUuLjQuckAuQC4hUC4uLi4KKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEgIC4uLi4ucC5QN1guSjd6Li4KKwkweDAwMjA6ICA4MDEwIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgIC4uMF8uLi4uLi4uLk0uLiMKKwkweDAwMzA6ICA0ZGRjIDk3MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLiMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LWNhcFhYLm91dCBiL3Rlc3RzL3ByaW50LWNhcFhYLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTIxYTAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQtY2FwWFgub3V0CkBAIC0wLDAgKzEsNDE5IEBACisyMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMCAgLjwuaEAuQC4hUi4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgYTAwMiAgLi4ucC5QN1gufi4uLi4uLgorCTB4MDAzMDogIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYyAgLi4uIS4uLi5ALi4uLi5NLgorCTB4MDA0MDogIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMiAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLgorMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgN2YwMCAgLjwuLkAuQC48Li4uLi4uLgorCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgYTAxMiAgLi4uUC5wN3ouLjdYLi4uLgorCTB4MDAzMDogIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYyAgLi5uLi4uLi5ALi4uLi5NLgorCTB4MDA0MDogIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMiAgICAgICAgICAgICAgICAgLi5NLi4uLi4uLgorMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwMzQgMWI2YSA0MDAwIDQwMDYgMjE1OCA3ZjAwIDAwMDEgN2YwMCAgLjQuakAuQC4hWC4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxMCAgLi4ucC5QN1guLjd6Li4uLgorCTB4MDAzMDogIDIwMDAgMzdkMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTYgNGRkYyAgLi43Li4uLi4uLk0uLi5NLgorCTB4MDA0MDogIDkyMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4KKzIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgN2YwMCAgLi4ubEAuQC4uLi4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxOCAgLi4ucC5QN1guLjd6Li4uLgorCTB4MDAzMDogIDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgNGRkYyAgLi4uLi4uLi4uLk0uLi5NLgorCTB4MDA0MDogIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgMmUzMSAgLi5HRVQuLy5IVFRQLzEuMQorCTB4MDA1MDogIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggNmY3MyAgLi5Ib3N0Oi5sb2NhbGhvcworCTB4MDA2MDogIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgMjA0NSAgdC4uVXNlci1BZ2VudDouRQorCTB4MDA3MDogIDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgMmQ2NCAgTGlua3MvMC4xMC40LTctZAorCTB4MDA4MDogIDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgNjUzYiAgZWJpYW4uKHRleHRtb2RlOworCTB4MDA5MDogIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgMzEyZCAgLkxpbnV4LjIuNi4xMS0xLQorCTB4MDBhMDogIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgMzEzMyAgNjg2LXNtcC5pNjg2Oy4xMworCTB4MDBiMDogIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgNzQzYSAgMng1Ni0yKS4uQWNjZXB0OgorCTB4MDBjMDogIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgNmU2MyAgLiovKi4uQWNjZXB0LUVuYworCTB4MDBkMDogIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgNjM2MyAgb2Rpbmc6Lmd6aXAuLkFjYworCTB4MDBlMDogIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgNjU2ZSAgZXB0LUxhbmd1YWdlOi5lbgorCTB4MDBmMDogIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgNGI2NSAgLi5Db25uZWN0aW9uOi5LZQorCTB4MDEwMDogIDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhICAgICAgICAgICAgZXAtQWxpdmUuLi4uCisyMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxIDdmMDAgIC40Li5ALkAuLi4uLi4uLi4KKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5IDgwMTAgIC4uLlAucDd6Li43WC5JLi4KKwkweDAwMzA6ICAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4IDRkZGMgIC4uNy4uLi4uLi5NLi4uTS4KKwkweDAwNDA6ICA5MjE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCisyMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCisJMHgwMDEwOiAgMTVlYiAxZmU2IDQwMDAgNDAwNiAwNzI1IDdmMDAgMDAwMSA3ZjAwICAuLi4uQC5ALi4lLi4uLi4uCisJMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDE4ICAuLi5QLnA3ei4uN1guSS4uCisJMHgwMDMwOiAgMjAwMCAxM2UwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjICAuLi4uLi4uLi4uTS4uLk0uCisJMHgwMDQwOiAgOTIxNyA0ODU0IDU0NTAgMmYzMSAyZTMxIDIwMzIgMzAzMCAyMDRmICAuLkhUVFAvMS4xLjIwMC5PCisJMHgwMDUwOiAgNGIwZCAwYTQ0IDYxNzQgNjUzYSAyMDU3IDY1NjQgMmMyMCAzMDM2ICBLLi5EYXRlOi5XZWQsLjA2CisJMHgwMDYwOiAgMjA0YSA3NTZjIDIwMzIgMzAzMCAzNTIwIDMwMzMgM2EzNSAzNzNhICAuSnVsLjIwMDUuMDM6NTc6CisJMHgwMDcwOiAgMzMzNSAyMDQ3IDRkNTQgMGQwYSA1MzY1IDcyNzYgNjU3MiAzYTIwICAzNS5HTVQuLlNlcnZlcjouCisJMHgwMDgwOiAgNDE3MCA2MTYzIDY4NjUgMmYzMSAyZTMzIDJlMzMgMzMwZCAwYTRjICBBcGFjaGUvMS4zLjMzLi5MCisJMHgwMDkwOiAgNjE3MyA3NDJkIDRkNmYgNjQ2OSA2NjY5IDY1NjQgM2EyMCA1Mzc1ICBhc3QtTW9kaWZpZWQ6LlN1CisJMHgwMGEwOiAgNmUyYyAyMDMxIDM1MjAgNDE3NSA2NzIwIDMyMzAgMzAzNCAyMDMwICBuLC4xNS5BdWcuMjAwNC4wCisJMHgwMGIwOiAgMzAzYSAzNDMzIDNhMzQgMzEyMCA0NzRkIDU0MGQgMGE0NSA1NDYxICAwOjQzOjQxLkdNVC4uRVRhCisJMHgwMGMwOiAgNjczYSAyMDIyIDM2NjUgMzgzMCA2NjMwIDJkMzEgMzQzOCA2MTJkICBnOi4iNmU4MGYwLTE0OGEtCisJMHgwMGQwOiAgMzQzMSAzMTY1IDYyMzEgNjI2NCAyMjBkIDBhNDEgNjM2MyA2NTcwICA0MTFlYjFiZCIuLkFjY2VwCisJMHgwMGUwOiAgNzQyZCA1MjYxIDZlNjcgNjU3MyAzYTIwIDYyNzkgNzQ2NSA3MzBkICB0LVJhbmdlczouYnl0ZXMuCisJMHgwMGYwOiAgMGE0MyA2ZjZlIDc0NjUgNmU3NCAyZDRjIDY1NmUgNjc3NCA2ODNhICAuQ29udGVudC1MZW5ndGg6CisJMHgwMTAwOiAgMjAzNSAzMjM1IDM4MGQgMGE0YiA2NTY1IDcwMmQgNDE2YyA2OTc2ICAuNTI1OC4uS2VlcC1BbGl2CisJMHgwMTEwOiAgNjUzYSAyMDc0IDY5NmQgNjU2ZiA3NTc0IDNkMzEgMzUyYyAyMDZkICBlOi50aW1lb3V0PTE1LC5tCisJMHgwMTIwOiAgNjE3OCAzZDMxIDMwMzAgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5ICBheD0xMDAuLkNvbm5lY3RpCisJMHgwMTMwOiAgNmY2ZSAzYTIwIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhICBvbjouS2VlcC1BbGl2ZS4uCisJMHgwMTQwOiAgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgM2EyMCA3NDY1ICBDb250ZW50LVR5cGU6LnRlCisJMHgwMTUwOiAgNzg3NCAyZjY4IDc0NmQgNmMzYiAyMDYzIDY4NjEgNzI3MyA2NTc0ICB4dC9odG1sOy5jaGFyc2V0CisJMHgwMTYwOiAgM2Q2OSA3MzZmIDJkMzggMzgzNSAzOTJkIDMxMGQgMGEwZCAwYTNjICA9aXNvLTg4NTktMS4uLi48CisJMHgwMTcwOiAgMjE0NCA0ZjQzIDU0NTkgNTA0NSAyMDQ4IDU0NGQgNGMyMCA1MDU1ICAhRE9DVFlQRS5IVE1MLlBVCisJMHgwMTgwOiAgNDI0YyA0OTQzIDIwMjIgMmQyZiAyZjU3IDMzNDMgMmYyZiA0NDU0ICBCTElDLiItLy9XM0MvL0RUCisJMHgwMTkwOiAgNDQyMCA0ODU0IDRkNGMgMjAzNCAyZTMwIDMxMjAgNTQ3MiA2MTZlICBELkhUTUwuNC4wMS5UcmFuCisJMHgwMWEwOiAgNzM2OSA3NDY5IDZmNmUgNjE2YyAyZjJmIDQ1NGUgMjIzZSAwYTNjICBzaXRpb25hbC8vRU4iPi48CisJMHgwMWIwOiAgNDg1NCA0ZDRjIDNlMGEgM2M0OCA0NTQxIDQ0M2UgMGEyMCAyMDIwICBIVE1MPi48SEVBRD4uLi4uCisJMHgwMWMwOiAgM2M0ZCA0NTU0IDQxMjAgNDg1NCA1NDUwIDJkNDUgNTE1NSA0OTU2ICA8TUVUQS5IVFRQLUVRVUlWCisJMHgwMWQwOiAgM2QyMiA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAyMjIwICA9IkNvbnRlbnQtVHlwZSIuCisJMHgwMWUwOiAgNDM0ZiA0ZTU0IDQ1NGUgNTQzZCAyMjc0IDY1NzggNzQyZiA2ODc0ICBDT05URU5UPSJ0ZXh0L2h0CisJMHgwMWYwOiAgNmQ2YyAzYjIwIDYzNjggNjE3MiA3MzY1IDc0M2QgNjk3MyA2ZjJkICBtbDsuY2hhcnNldD1pc28tCisJMHgwMjAwOiAgMzgzOCAzNTM5IDJkMzEgMjIzZSAwYTIwIDIwMjAgM2M0ZCA0NTU0ICA4ODU5LTEiPi4uLi48TUVUCisJMHgwMjEwOiAgNDEyMCA0ZTQxIDRkNDUgM2QyMiA0NDY1IDczNjMgNzI2OSA3MDc0ICBBLk5BTUU9IkRlc2NyaXB0CisJMHgwMjIwOiAgNjk2ZiA2ZTIyIDIwNDMgNGY0ZSA1NDQ1IDRlNTQgM2QyMiA1NDY4ICBpb24iLkNPTlRFTlQ9IlRoCisJMHgwMjMwOiAgNjUyMCA2OTZlIDY5NzQgNjk2MSA2YzIwIDY5NmUgNzM3NCA2MTZjICBlLmluaXRpYWwuaW5zdGFsCisJMHgwMjQwOiAgNmM2MSA3NDY5IDZmNmUgMjA2ZiA2NjIwIDQ0NjUgNjI2OSA2MTZlICBsYXRpb24ub2YuRGViaWFuCisJMHgwMjUwOiAgMjA2MSA3MDYxIDYzNjggNjUyZSAyMjNlIDBhMjAgMjAyMCAzYzU0ICAuYXBhY2hlLiI+Li4uLjxUCisJMHgwMjYwOiAgNDk1NCA0YzQ1IDNlNTAgNmM2MSA2MzY1IDY4NmYgNmM2NCA2NTcyICBJVExFPlBsYWNlaG9sZGVyCisJMHgwMjcwOiAgMjA3MCA2MTY3IDY1M2MgMmY1NCA0OTU0IDRjNDUgM2UwYSAzYzJmICAucGFnZTwvVElUTEU+LjwvCisJMHgwMjgwOiAgNDg0NSA0MTQ0IDNlMGEgM2M0MiA0ZjQ0IDU5MjAgNTQ0NSA1ODU0ICBIRUFEPi48Qk9EWS5URVhUCisJMHgwMjkwOiAgM2QyMiAyMzMwIDMwMzAgMzAzMCAzMDIyIDIwNDIgNDc0MyA0ZjRjICA9IiMwMDAwMDAiLkJHQ09MCisJMHgwMmEwOiAgNGY1MiAzZDIyIDIzNDYgNDY0NiA0NjQ2IDQ2MjIgMjA0YyA0OTRlICBPUj0iI0ZGRkZGRiIuTElOCisJMHgwMmIwOiAgNGIzZCAyMjIzIDMwMzAgMzAzMCA0NTQ2IDIyMjAgNTY0YyA0OTRlICBLPSIjMDAwMEVGIi5WTElOCisJMHgwMmMwOiAgNGIzZCAyMjIzIDM1MzUgMzEzOCAzODQxIDIyMjAgNDE0YyA0OTRlICBLPSIjNTUxODhBIi5BTElOCisJMHgwMmQwOiAgNGIzZCAyMjIzIDQ2NDYgMzAzMCAzMDMwIDIyM2UgMGEwYSAzYzQ4ICBLPSIjRkYwMDAwIj4uLjxICisJMHgwMmUwOiAgMzEzZSA1MDZjIDYxNjMgNjU2OCA2ZjZjIDY0NjUgNzIyMCA3MDYxICAxPlBsYWNlaG9sZGVyLnBhCisJMHgwMmYwOiAgNjc2NSAzYzJmIDQ4MzEgM2UwYSAzYzQ4IDMyM2UgNDk2NiAyMDc5ICBnZTwvSDE+LjxIMj5JZi55CisJMHgwMzAwOiAgNmY3NSAyMDYxIDcyNjUgMjA2YSA3NTczIDc0MjAgNjI3MiA2Zjc3ICBvdS5hcmUuanVzdC5icm93CisJMHgwMzEwOiAgNzM2OSA2ZTY3IDIwNzQgNjg2NSAyMDc3IDY1NjIgM2MyZiA2ODMyICBzaW5nLnRoZS53ZWI8L2gyCisJMHgwMzIwOiAgM2UwYSAwYTNjIDUwM2UgNTQ2OCA2NTIwIDZmNzcgNmU2NSA3MjIwICA+Li48UD5UaGUub3duZXIuCisJMHgwMzMwOiAgNmY2NiAyMDc0IDY4NjkgNzMyMCA3NzY1IDYyMjAgNzM2OSA3NDY1ICBvZi50aGlzLndlYi5zaXRlCisJMHgwMzQwOiAgMjA2OCA2MTczIDIwNmUgNmY3NCAyMDcwIDc1NzQgMjA3NSA3MDIwICAuaGFzLm5vdC5wdXQudXAuCisJMHgwMzUwOiAgNjE2ZSA3OTIwIDc3NjUgNjIyMCA3MDYxIDY3NjUgNzMyMCA3OTY1ICBhbnkud2ViLnBhZ2VzLnllCisJMHgwMzYwOiAgNzQyZSAwYTUwIDZjNjUgNjE3MyA2NTIwIDYzNmYgNmQ2NSAyMDYyICB0Li5QbGVhc2UuY29tZS5iCisJMHgwMzcwOiAgNjE2MyA2YjIwIDZjNjEgNzQ2NSA3MjJlIDNjMmYgNTAzZSAwYTBhICBhY2subGF0ZXIuPC9QPi4uCisJMHgwMzgwOiAgM2M1MCAzZTNjIDUzNGQgNDE0YyA0YzNlIDNjNDMgNDk1NCA0NTNlICA8UD48U01BTEw+PENJVEU+CisJMHgwMzkwOiAgNGQ2ZiA3NjY1IDIwNjEgNmM2ZiA2ZTY3IDJjMjAgNmU2ZiA3NDY4ICBNb3ZlLmFsb25nLC5ub3RoCisJMHgwM2EwOiAgNjk2ZSA2NzIwIDc0NmYgMjA3MyA2NTY1IDIwNjggNjU3MiA2NTJlICBpbmcudG8uc2VlLmhlcmUuCisJMHgwM2IwOiAgMmUyZSAzYzJmIDQzNDkgNTQ0NSAzZTIwIDNhMmQgMjkzYyAyZjUzICAuLjwvQ0lURT4uOi0pPC9TCisJMHgwM2MwOiAgNGQ0MSA0YzRjIDNlM2MgMmY1MCAzZTBhIDBhM2MgNDgzMiAzZTQ5ICBNQUxMPjwvUD4uLjxIMj5JCisJMHgwM2QwOiAgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwIDc0NzIgNzk2OSA2ZTY3ICBmLnlvdS5hcmUudHJ5aW5nCisJMHgwM2UwOiAgMjA3NCA2ZjIwIDZjNmYgNjM2MSA3NDY1IDIwNzQgNjg2NSAyMDYxICAudG8ubG9jYXRlLnRoZS5hCisJMHgwM2YwOiAgNjQ2ZCA2OTZlIDY5NzMgNzQ3MiA2MTc0IDZmNzIgMjA2ZiA2NjIwICBkbWluaXN0cmF0b3Iub2YuCisJMHgwNDAwOiAgNzQ2OCA2OTczIDIwNmQgNjE2MyA2ODY5IDZlNjUgM2MyZiA0ODMyICB0aGlzLm1hY2hpbmU8L0gyCisJMHgwNDEwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA3NyA2MTZlICA+Li48UD5JZi55b3Uud2FuCisJMHgwNDIwOiAgNzQyMCA3NDZmIDIwNzIgNjU3MCA2ZjcyIDc0MjAgNzM2ZiA2ZDY1ICB0LnRvLnJlcG9ydC5zb21lCisJMHgwNDMwOiAgNzQ2OCA2OTZlIDY3MjAgNjE2MiA2Zjc1IDc0MjAgNzQ2OCA2OTczICB0aGluZy5hYm91dC50aGlzCisJMHgwNDQwOiAgMjA2OCA2ZjczIDc0MjcgNzMyMCA2MjY1IDY4NjEgNzY2OSA2ZjcyICAuaG9zdCdzLmJlaGF2aW9yCisJMHgwNDUwOiAgMmMyMCA3MDZjIDY1NjEgNzM2NSAwYTYzIDZmNmUgNzQ2MSA2Mzc0ICAsLnBsZWFzZS5jb250YWN0CisJMHgwNDYwOiAgMjA3NCA2ODY1IDIwNDkgNmU3NCA2NTcyIDZlNjUgNzQyMCA1MzY1ICAudGhlLkludGVybmV0LlNlCisJMHgwNDcwOiAgNzI3NiA2OTYzIDY1MjAgNTA3MiA2Zjc2IDY5NjQgNjU3MiAyMDI4ICBydmljZS5Qcm92aWRlci4oCisJMHgwNDgwOiAgNDk1MyA1MDI5IDIwNjkgNmU3NiA2ZjZjIDc2NjUgNjQyMCA2NDY5ICBJU1ApLmludm9sdmVkLmRpCisJMHgwNDkwOiAgNzI2NSA2Mzc0IDZjNzkgMmUzYyAyZjUwIDNlMGEgMGEzYyA1MDNlICByZWN0bHkuPC9QPi4uPFA+CisJMHgwNGEwOiAgNTM2NSA2NTIwIDc0NjggNjUyMCAzYzQxIDIwNjggNzI2NSA2NjNkICBTZWUudGhlLjxBLmhyZWY9CisJMHgwNGIwOiAgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE2MiA3NTczICAiaHR0cDovL3d3dy5hYnVzCisJMHgwNGMwOiAgNjUyZSA2ZTY1IDc0MmYgMjIzZSA0ZTY1IDc0NzcgNmY3MiA2YjIwICBlLm5ldC8iPk5ldHdvcmsuCisJMHgwNGQwOiAgNDE2MiA3NTczIDY1MGEgNDM2YyA2NTYxIDcyNjkgNmU2NyA2ODZmICBBYnVzZS5DbGVhcmluZ2hvCisJMHgwNGUwOiAgNzU3MyA2NTNjIDJmNDEgM2UyMCA2NjZmIDcyMjAgNjg2ZiA3NzIwICB1c2U8L0E+LmZvci5ob3cuCisJMHgwNGYwOiAgNzQ2ZiAyMDY0IDZmMjAgNzQ2OCA2OTczIDJlM2MgMmY1MCAzZTBhICB0by5kby50aGlzLjwvUD4uCisJMHgwNTAwOiAgMGEzYyA0ODMyIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwICAuPEgyPklmLnlvdS5hcmUuCisJMHgwNTEwOiAgNzQ2OCA2NTIwIDYxNjQgNmQ2OSA2ZTY5IDczNzQgNzI2MSA3NDZmICB0aGUuYWRtaW5pc3RyYXRvCisJMHgwNTIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDZkNjEgNjM2OCA2OTZlICByLm9mLnRoaXMubWFjaGluCisJMHgwNTMwOiAgNjUzYyAyZjQ4IDMyM2UgMGEwYSAzYzUwIDNlNTQgNjg2NSAyMDY5ICBlPC9IMj4uLjxQPlRoZS5pCisJMHgwNTQwOiAgNmU2OSA3NDY5IDYxNmMgMjA2OSA2ZTczIDc0NjEgNmM2YyA2MTc0ICBuaXRpYWwuaW5zdGFsbGF0CisJMHgwNTUwOiAgNjk2ZiA2ZTIwIDZmNjYgMjAzYyA0MTIwIDY4NzIgNjU2NiAzZDIyICBpb24ub2YuPEEuaHJlZj0iCisJMHgwNTYwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxICBodHRwOi8vd3d3LmRlYmlhCisJMHgwNTcwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyNzczICBuLm9yZy8iPkRlYmlhbidzCisJMHgwNTgwOiAgMGE2MSA3MDYxIDYzNjggNjUzYyAyZjQxIDNlMjAgNzc2NSA2MjIwICAuYXBhY2hlPC9BPi53ZWIuCisJMHgwNTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc3ICBzZXJ2ZXIucGFja2FnZS53CisJMHgwNWEwOiAgNjE3MyAyMDczIDc1NjMgNjM2NSA3MzczIDY2NzUgNmMyZSAzYzJmICBhcy5zdWNjZXNzZnVsLjwvCisJMHgwNWIwOiAgNTAzZSAwYTBhIDNjNTAgM2UzYyA1MzU0IDUyNGYgNGU0NyAzZTU5ICBQPi4uPFA+PFNUUk9ORz5ZCisJMHgwNWMwOiAgNmY3NSAyMDczIDY4NmYgNzU2YyA2NDIwIDcyNjUgNzA2YyA2MTYzICBvdS5zaG91bGQucmVwbGFjCisJMHgwNWQwOiAgNjUyMCA3NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2OSA3NDY4ICBlLnRoaXMucGFnZS53aXRoCisJMHgwNWUwOiAgMjA3OSA2Zjc1IDcyMjAgNmY3NyA2ZTIwIDc3NjUgNjIyMCA3MDYxICAueW91ci5vd24ud2ViLnBhCisJMHgwNWYwOiAgNjc2NSA3MzIwIDYxNzMgMGE3MyA2ZjZmIDZlMjAgNjE3MyAyMDcwICBnZXMuYXMuc29vbi5hcy5wCisJMHgwNjAwOiAgNmY3MyA3MzY5IDYyNmMgNjUyZSAzYzJmIDUzNTQgNTI0ZiA0ZTQ3ICBvc3NpYmxlLjwvU1RST05HCisJMHgwNjEwOiAgM2UzYyAyZjUwIDNlMGEgMGEzYyA1MDNlIDU1NmUgNmM2NSA3MzczICA+PC9QPi4uPFA+VW5sZXNzCisJMHgwNjIwOiAgMjA3OSA2Zjc1IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2OSA3NDczICAueW91LmNoYW5nZWQuaXRzCisJMHgwNjMwOiAgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjYxIDc0NjkgNmY2ZSAyYzIwICAuY29uZmlndXJhdGlvbiwuCisJMHgwNjQwOiAgNzk2ZiA3NTcyIDIwNmUgNjU3NyAyMDczIDY1NzIgNzY2NSA3MjIwICB5b3VyLm5ldy5zZXJ2ZXIuCisJMHgwNjUwOiAgNjk3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjUgNjQyMCA2MTczICBpcy5jb25maWd1cmVkLmFzCisJMHgwNjYwOiAgMjA2NiA2ZjZjIDZjNmYgNzc3MyAzYTBhIDNjNTUgNGMzZSAwYTNjICAuZm9sbG93czouPFVMPi48CisJMHgwNjcwOiAgNGM0OSAzZTBhIDQzNmYgNmU2NiA2OTY3IDc1NzIgNjE3NCA2OTZmICBMST4uQ29uZmlndXJhdGlvCisJMHgwNjgwOiAgNmUyMCA2NjY5IDZjNjUgNzMyMCA2MzYxIDZlMjAgNjI2NSAyMDY2ICBuLmZpbGVzLmNhbi5iZS5mCisJMHgwNjkwOiAgNmY3NSA2ZTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY2NSA3NDYzICBvdW5kLmluLjxUVD4vZXRjCisJMHgwNmEwOiAgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjICAvYXBhY2hlPC9UVD4uPC9MCisJMHgwNmIwOiAgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA1NDU0ICBJPi4uPExJPi5UaGUuPFRUCisJMHgwNmMwOiAgM2U0NCA2ZjYzIDc1NmQgNjU2ZSA3NDUyIDZmNmYgNzQzYyAyZjU0ICA+RG9jdW1lbnRSb290PC9UCisJMHgwNmQwOiAgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwIDY5NzMgMjA3NCA2ODY1ICBUPiwud2hpY2guaXMudGhlCisJMHgwNmUwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNzUgNmU2NCA2NTcyICAuZGlyZWN0b3J5LnVuZGVyCisJMHgwNmYwOiAgMjA3NyA2ODY5IDYzNjggMjA2MSA2YzZjIDIwNzkgNmY3NSA3MjBhICAud2hpY2guYWxsLnlvdXIuCisJMHgwNzAwOiAgNDg1NCA0ZDRjIDIwNjYgNjk2YyA2NTczIDIwNzMgNjg2ZiA3NTZjICBIVE1MLmZpbGVzLnNob3VsCisJMHgwNzEwOiAgNjQyMCA2NTc4IDY5NzMgNzQyYyAyMDY5IDczMjAgNzM2NSA3NDIwICBkLmV4aXN0LC5pcy5zZXQuCisJMHgwNzIwOiAgNzQ2ZiAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyA3NzNjICB0by48VFQ+L3Zhci93d3c8CisJMHgwNzMwOiAgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlICAvVFQ+LjwvTEk+Li48TEk+CisJMHgwNzQwOiAgMGE0MyA0NzQ5IDIwNzMgNjM3MiA2OTcwIDc0NzMgMjA2MSA3MjY1ICAuQ0dJLnNjcmlwdHMuYXJlCisJMHgwNzUwOiAgMjA2YyA2ZjZmIDZiNjUgNjQyMCA2NjZmIDcyMjAgNjk2ZSAyMDNjICAubG9va2VkLmZvci5pbi48CisJMHgwNzYwOiAgNTQ1NCAzZTJmIDc1NzMgNzIyZiA2YzY5IDYyMmYgNjM2NyA2OTJkICBUVD4vdXNyL2xpYi9jZ2ktCisJMHgwNzcwOiAgNjI2OSA2ZTNjIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwICBiaW48L1RUPiwud2hpY2guCisJMHgwNzgwOiAgNjk3MyAyMDc3IDY4NjUgNzI2NSAwYTQ0IDY1NjIgNjk2MSA2ZTIwICBpcy53aGVyZS5EZWJpYW4uCisJMHgwNzkwOiAgNzA2MSA2MzZiIDYxNjcgNjU3MyAyMDc3IDY5NmMgNmMyMCA3MDZjICBwYWNrYWdlcy53aWxsLnBsCisJMHgwN2EwOiAgNjE2MyA2NTIwIDc0NjggNjU2OSA3MjIwIDczNjMgNzI2OSA3MDc0ICBhY2UudGhlaXIuc2NyaXB0CisJMHgwN2IwOiAgNzMyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA0YzZmICBzLjwvTEk+Li48TEk+LkxvCisJMHgwN2MwOiAgNjcyMCA2NjY5IDZjNjUgNzMyMCA2MTcyIDY1MjAgNzA2YyA2MTYzICBnLmZpbGVzLmFyZS5wbGFjCisJMHgwN2QwOiAgNjU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjZjICBlZC5pbi48VFQ+L3Zhci9sCisJMHgwN2UwOiAgNmY2NyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyYzIwICBvZy9hcGFjaGU8L1RUPiwuCisJMHgwN2YwOiAgNjE2ZSA2NDIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNzI2ZiA3NDYxICBhbmQud2lsbC5iZS5yb3RhCisJMHgwODAwOiAgNzQ2NSA2NDBhIDc3NjUgNjU2YiA2Yzc5IDJlMjAgMjA1NCA2ODY1ICB0ZWQud2Vla2x5Li4uVGhlCisJMHgwODEwOiAgMjA2NiA3MjY1IDcxNzUgNjU2ZSA2Mzc5IDIwNmYgNjYyMCA3MjZmICAuZnJlcXVlbmN5Lm9mLnJvCisJMHgwODIwOiAgNzQ2MSA3NDY5IDZmNmUgMjA2MyA2MTZlIDIwNjIgNjUyMCA2NTYxICB0YXRpb24uY2FuLmJlLmVhCisJMHgwODMwOiAgNzM2OSA2Yzc5IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2MiA3OTIwICBzaWx5LmNoYW5nZWQuYnkuCisJMHgwODQwOiAgNjU2NCA2OTc0IDY5NmUgNjcwYSAzYzU0IDU0M2UgMmY2NSA3NDYzICBlZGl0aW5nLjxUVD4vZXRjCisJMHgwODUwOiAgMmY2YyA2ZjY3IDcyNmYgNzQ2MSA3NDY1IDJlNjQgMmY2MSA3MDYxICAvbG9ncm90YXRlLmQvYXBhCisJMHgwODYwOiAgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhICBjaGU8L1RUPi48L0xJPi4uCisJMHgwODcwOiAgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDY0IDY1NjYgNjE3NSA2Yzc0ICA8TEk+LlRoZS5kZWZhdWx0CisJMHgwODgwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNjkgNmU2NCA2NTc4ICAuZGlyZWN0b3J5LmluZGV4CisJMHgwODkwOiAgMjA2OSA3MzIwIDNjNTQgNTQzZSA2OTZlIDY0NjUgNzgyZSA2ODc0ICAuaXMuPFRUPmluZGV4Lmh0CisJMHgwOGEwOiAgNmQ2YyAzYzJmIDU0NTQgM2UyYyAyMDZkIDY1NjEgNmU2OSA2ZTY3ICBtbDwvVFQ+LC5tZWFuaW5nCisJMHgwOGIwOiAgMjA3NCA2ODYxIDc0MjAgNzI2NSA3MTc1IDY1NzMgNzQ3MyAwYTY2ICAudGhhdC5yZXF1ZXN0cy5mCisJMHgwOGMwOiAgNmY3MiAyMDYxIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDNjICBvci5hLmRpcmVjdG9yeS48CisJMHgwOGQwOiAgNTQ1NCAzZTJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgM2MyZiA1NDU0ICBUVD4vZm9vL2Jhci88L1RUCisJMHgwOGUwOiAgM2UyMCA3NzY5IDZjNmMgMjA2NyA2OTc2IDY1MjAgNzQ2OCA2NTIwICA+LndpbGwuZ2l2ZS50aGUuCisJMHgwOGYwOiAgNjM2ZiA2ZTc0IDY1NmUgNzQ3MyAyMDZmIDY2MjAgNzQ2OCA2NTIwICBjb250ZW50cy5vZi50aGUuCisJMHgwOTAwOiAgNjY2OSA2YzY1IDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3ICBmaWxlLjxUVD4vdmFyL3d3CisJMHgwOTEwOiAgNzcyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDY5NmUgNjQ2NSA3ODJlICB3L2Zvby9iYXIvaW5kZXguCisJMHgwOTIwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTBhIDY5NjYgMjA2OSA3NDIwICBodG1sPC9UVD4uaWYuaXQuCisJMHgwOTMwOiAgNjU3OCA2OTczIDc0NzMgMjAyOCA2MTczIDczNzUgNmQ2OSA2ZTY3ICBleGlzdHMuKGFzc3VtaW5nCisJMHgwOTQwOiAgMjA3NCA2ODYxIDc0MjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjc3ICAudGhhdC48VFQ+L3Zhci93CisJMHgwOTUwOiAgNzc3NyAzYzJmIDU0NTQgM2UyMCA2OTczIDIwNzkgNmY3NSA3MjIwICB3dzwvVFQ+LmlzLnlvdXIuCisJMHgwOTYwOiAgM2M1NCA1NDNlIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNTI2ZiA2Zjc0ICA8VFQ+RG9jdW1lbnRSb290CisJMHgwOTcwOiAgM2MyZiA1NDU0IDNlMjkgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjICA8L1RUPikuPC9MST4uLjxMCisJMHgwOTgwOiAgNDkzZSAwYTU1IDczNjUgNzIyMCA2NDY5IDcyNjUgNjM3NCA2ZjcyICBJPi5Vc2VyLmRpcmVjdG9yCisJMHgwOTkwOiAgNjk2NSA3MzIwIDYxNzIgNjUyMCA2NTZlIDYxNjIgNmM2NSA2NDJjICBpZXMuYXJlLmVuYWJsZWQsCisJMHgwOWEwOiAgMjA2MSA2ZTY0IDIwNzUgNzM2NSA3MjIwIDY0NmYgNjM3NSA2ZDY1ICAuYW5kLnVzZXIuZG9jdW1lCisJMHgwOWIwOiAgNmU3NCA3MzIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNmM2ZiA2ZjZiICBudHMud2lsbC5iZS5sb29rCisJMHgwOWMwOiAgNjU2NCAyMDY2IDZmNzIgMGE2OSA2ZTIwIDc0NjggNjUyMCAzYzU0ICBlZC5mb3IuaW4udGhlLjxUCisJMHgwOWQwOiAgNTQzZSA3MDc1IDYyNmMgNjk2MyA1ZjY4IDc0NmQgNmMzYyAyZjU0ICBUPnB1YmxpY19odG1sPC9UCisJMHgwOWUwOiAgNTQzZSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2ZiA2NjIwICBUPi5kaXJlY3Rvcnkub2YuCisJMHgwOWYwOiAgNzQ2OCA2NTIwIDc1NzMgNjU3MiA3MzI3IDIwNjggNmY2ZCA2NTczICB0aGUudXNlcnMnLmhvbWVzCisJMHgwYTAwOiAgMmUyMCAyMDU0IDY4NjUgNzM2NSAyMDY0IDY5NzIgNzMwYSA3MzY4ICAuLi5UaGVzZS5kaXJzLnNoCisJMHgwYTEwOiAgNmY3NSA2YzY0IDIwNjIgNjUyMCA3NTZlIDY0NjUgNzIyMCAzYzU0ICBvdWxkLmJlLnVuZGVyLjxUCisJMHgwYTIwOiAgNTQzZSAyZjY4IDZmNmQgNjUzYyAyZjU0IDU0M2UgMmMyMCA2MTZlICBUPi9ob21lPC9UVD4sLmFuCisJMHgwYTMwOiAgNjQyMCA3NTczIDY1NzIgNzMyMCA3NzY5IDZjNmMgMjA2ZSA2Zjc0ICBkLnVzZXJzLndpbGwubm90CisJMHgwYTQwOiAgMjA2MiA2NTIwIDYxNjIgNmM2NSAyMDc0IDZmMjAgNzM3OSA2ZDZjICAuYmUuYWJsZS50by5zeW1sCisJMHgwYTUwOiAgNjk2ZSA2YjBhIDc0NmYgMjA2NiA2OTZjIDY1NzMgMjA3NCA2ODY1ICBpbmsudG8uZmlsZXMudGhlCisJMHgwYTYwOiAgNzkyMCA2NDZmIDZlMjcgNzQyMCA2Zjc3IDZlMmUgM2MyZiA0YzQ5ICB5LmRvbid0Lm93bi48L0xJCisJMHgwYTcwOiAgM2UwYSAwYTNjIDJmNTUgNGMzZSAwYTQxIDZjNmMgMjA3NCA2ODY1ICA+Li48L1VMPi5BbGwudGhlCisJMHgwYTgwOiAgMjA3MyA3NDYxIDZlNjQgNjE3MiA2NDIwIDYxNzAgNjE2MyA2ODY1ICAuc3RhbmRhcmQuYXBhY2hlCisJMHgwYTkwOiAgMjA2ZCA2ZjY0IDc1NmMgNjU3MyAyMDYxIDcyNjUgMjA2MSA3NjYxICAubW9kdWxlcy5hcmUuYXZhCisJMHgwYWEwOiAgNjk2YyA2MTYyIDZjNjUgMjA3NyA2OTc0IDY4MjAgNzQ2OCA2OTczICBpbGFibGUud2l0aC50aGlzCisJMHgwYWIwOiAgMjA3MiA2NTZjIDY1NjEgNzM2NSAyMDYxIDZlNjQgMjA2MSA3MjY1ICAucmVsZWFzZS5hbmQuYXJlCisJMHgwYWMwOiAgMGE2ZSA2Zjc3IDIwNmQgNjE2ZSA2MTY3IDY1NjQgMjA3NyA2OTc0ICAubm93Lm1hbmFnZWQud2l0CisJMHgwYWQwOiAgNjgyMCA2NDY1IDYyNjMgNmY2ZSA2NjJlIDIwMjAgNTQ3OSA3MDY1ICBoLmRlYmNvbmYuLi5UeXBlCisJMHgwYWUwOiAgMjAzYyA1NDU0IDNlNjQgNzA2YiA2NzJkIDcyNjUgNjM2ZiA2ZTY2ICAuPFRUPmRwa2ctcmVjb25mCisJMHgwYWYwOiAgNjk2NyA3NTcyIDY1MjAgNjE3MCA2MTYzIDY4NjUgM2MyZiA1NDU0ICBpZ3VyZS5hcGFjaGU8L1RUCisJMHgwYjAwOiAgM2UyMCA3NDZmIDBhNzMgNjU2YyA2NTYzIDc0MjAgNzc2OCA2OTYzICA+LnRvLnNlbGVjdC53aGljCisJMHgwYjEwOiAgNjgyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwIDc5NmYgNzUyMCA3NzYxICBoLm1vZHVsZXMueW91LndhCisJMHgwYjIwOiAgNmU3NCAyMDY1IDZlNjEgNjI2YyA2NTY0IDJlMjAgMjA0ZCA2MTZlICBudC5lbmFibGVkLi4uTWFuCisJMHgwYjMwOiAgNzkyMCA2Zjc0IDY4NjUgNzIyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwICB5Lm90aGVyLm1vZHVsZXMuCisJMHgwYjQwOiAgNjE3MiA2NTIwIDYxNzYgNjE2OSA2YzYxIDYyNmMgNjUwYSA3NDY4ICBhcmUuYXZhaWxhYmxlLnRoCisJMHgwYjUwOiAgNzI2ZiA3NTY3IDY4MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlICByb3VnaC50aGUuRGViaWFuCisJMHgwYjYwOiAgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDczIDc5NzMgNzQ2NSA2ZDIwICAucGFja2FnZS5zeXN0ZW0uCisJMHgwYjcwOiAgNzc2OSA3NDY4IDIwNzQgNjg2NSAyMDZlIDYxNmQgNjU3MyAyMDNjICB3aXRoLnRoZS5uYW1lcy48CisJMHgwYjgwOiAgNTQ1NCAzZTZjIDY5NjIgNjE3MCA2MTYzIDY4NjUgMmQ2ZCA2ZjY0ICBUVD5saWJhcGFjaGUtbW9kCisJMHgwYjkwOiAgMmQyYSAzYzJmIDU0NTQgM2UyZSAwYTQ5IDY2MjAgNzk2ZiA3NTIwICAtKjwvVFQ+Li5JZi55b3UuCisJMHgwYmEwOiAgNmU2NSA2NTY0IDIwNzQgNmYyMCA2MzZmIDZkNzAgNjk2YyA2NTIwICBuZWVkLnRvLmNvbXBpbGUuCisJMHgwYmIwOiAgNjEyMCA2ZDZmIDY0NzUgNmM2NSAyMDc5IDZmNzUgNzI3MyA2NTZjICBhLm1vZHVsZS55b3Vyc2VsCisJMHgwYmMwOiAgNjYyYyAyMDc5IDZmNzUgMjA3NyA2OTZjIDZjMjAgNmU2NSA2NTY0ICBmLC55b3Uud2lsbC5uZWVkCisJMHgwYmQwOiAgMjA3NCA2ZjIwIDY5NmUgNzM3NCA2MTZjIDZjMjAgNzQ2OCA2NTBhICAudG8uaW5zdGFsbC50aGUuCisJMHgwYmUwOiAgM2M1NCA1NDNlIDYxNzAgNjE2MyA2ODY1IDJkNjQgNjU3NiAzYzJmICA8VFQ+YXBhY2hlLWRldjwvCisJMHgwYmYwOiAgNTQ1NCAzZTIwIDcwNjEgNjM2YiA2MTY3IDY1MmUgMGEwYSAzYzUwICBUVD4ucGFja2FnZS4uLjxQCisJMHgwYzAwOiAgM2U0ZCA2ZjcyIDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0ICA+TW9yZS5kb2N1bWVudGF0CisJMHgwYzEwOiAgNjk2ZiA2ZTIwIDZmNmUgMjA0MSA3MDYxIDYzNjggNjUyMCA2MzYxICBpb24ub24uQXBhY2hlLmNhCisJMHgwYzIwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNmYgNmUzYSAwYTNjICBuLmJlLmZvdW5kLm9uOi48CisJMHgwYzMwOiAgNTU0YyAzZTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA0MTIwICBVTD4uPExJPi5UaGUuPEEuCisJMHgwYzQwOiAgNDg1MiA0NTQ2IDNkMjIgMmY2NCA2ZjYzIDJmNjEgNzA2MSA2MzY4ICBIUkVGPSIvZG9jL2FwYWNoCisJMHgwYzUwOiAgNjUyZCA2NDZmIDYzMmYgNmQ2MSA2ZTc1IDYxNmMgMmYyMiAzZTQxICBlLWRvYy9tYW51YWwvIj5BCisJMHgwYzYwOiAgNzA2MSA2MzY4IDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0ICBwYWNoZS5kb2N1bWVudGF0CisJMHgwYzcwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3Mzc0IDZmNzIgNjU2NCAyMDZmICBpb248L0E+LnN0b3JlZC5vCisJMHgwYzgwOiAgNmUyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyZSAzYzJmICBuLnlvdXIuc2VydmVyLjwvCisJMHgwYzkwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxICBMST4uLjxMST4uVGhlLjxBCisJMHgwY2EwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3ICAuSFJFRj0iaHR0cDovL3d3CisJMHgwY2IwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTQxICB3LmFwYWNoZS5vcmcvIj5BCisJMHgwY2MwOiAgNzA2MSA2MzY4IDY1MjAgNTA3MiA2ZjZhIDY1NjMgNzQzYyAyZjQxICBwYWNoZS5Qcm9qZWN0PC9BCisJMHgwY2QwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5ICA+LmhvbWUuc2l0ZS48L0xJCisJMHgwY2UwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4ICA+Li48TEk+LlRoZS48QS5ICisJMHgwY2YwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlICBSRUY9Imh0dHA6Ly93d3cuCisJMHgwZDAwOiAgNjE3MCA2MTYzIDY4NjUgMmQ3MyA3MzZjIDJlNmYgNzI2NyAyZjIyICBhcGFjaGUtc3NsLm9yZy8iCisJMHgwZDEwOiAgM2U0MSA3MDYxIDYzNjggNjUyZCA1MzUzIDRjM2MgMmY0MSAzZTIwICA+QXBhY2hlLVNTTDwvQT4uCisJMHgwZDIwOiAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAzZTBhICBob21lLnNpdGUuPC9MST4uCisJMHgwZDMwOiAgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1ICAuPExJPi5UaGUuPEEuSFJFCisJMHgwZDQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDcwNjUgNzI2YyAyZTYxICBGPSJodHRwOi8vcGVybC5hCisJMHgwZDUwOiAgNzA2MSA2MzY4IDY1MmUgNmY3MiA2NzJmIDIyM2UgNmQ2ZiA2NDIwICBwYWNoZS5vcmcvIj5tb2QuCisJMHgwZDYwOiAgNzA2NSA3MjZjIDNjMmYgNDEzZSAyMDY4IDZmNmQgNjUyMCA3MzY5ICBwZXJsPC9BPi5ob21lLnNpCisJMHgwZDcwOiAgNzQ2NSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0ICB0ZS48L0xJPi4uPExJPi5UCisJMHgwZDgwOiAgNjg2NSAyMDNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwICBoZS48QS5IUkVGPSJodHRwCisJMHgwZDkwOiAgM2EyZiAyZjc3IDc3NzcgMmU2MSA3MDYxIDYzNjggNjU3NyA2NTY1ICA6Ly93d3cuYXBhY2hld2VlCisJMHgwZGEwOiAgNmIyZSA2MzZmIDZkMmYgMjIzZSA0MTcwIDYxNjMgNjg2NSA1NzY1ICBrLmNvbS8iPkFwYWNoZVdlCisJMHgwZGIwOiAgNjU2YiAzYzJmIDQxM2UgMjA2ZSA2NTc3IDczNmMgNjU3NCA3NDY1ICBlazwvQT4ubmV3c2xldHRlCisJMHgwZGMwOiAgNzIyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4ICByLjwvTEk+Li48TEk+LlRoCisJMHgwZGQwOiAgNjUyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhICBlLjxBLkhSRUY9Imh0dHA6CisJMHgwZGUwOiAgMmYyZiA3Nzc3IDc3MmUgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3ICAvL3d3dy5kZWJpYW4ub3JnCisJMHgwZGYwOiAgMmY2NCA2ZjYzIDJmMjIgM2U0NCA2NTYyIDY5NjEgNmUyMCA1MDcyICAvZG9jLyI+RGViaWFuLlByCisJMHgwZTAwOiAgNmY2YSA2NTYzIDc0MGEgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0ICBvamVjdC5Eb2N1bWVudGF0CisJMHgwZTEwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3NzY4IDY5NjMgNjgyMCA2MzZmICBpb248L0E+LndoaWNoLmNvCisJMHgwZTIwOiAgNmU3NCA2MTY5IDZlNzMgMjA0OCA0ZjU3IDU0NGYgNzMyYyAyMDQ2ICBudGFpbnMuSE9XVE9zLC5GCisJMHgwZTMwOiAgNDE1MSA3MzJjIDIwNjEgNmU2NCAyMDczIDZmNjYgNzQ3NyA2MTcyICBBUXMsLmFuZC5zb2Z0d2FyCisJMHgwZTQwOiAgNjUyMCA3NTcwIDY0NjEgNzQ2NSA3MzJlIDNjMmYgNGM0OSAzZTBhICBlLnVwZGF0ZXMuPC9MST4uCisJMHgwZTUwOiAgM2MyZiA1NTRjIDNlMGEgMGEzYyA1MDNlIDU5NmYgNzUyMCA2MzYxICA8L1VMPi4uPFA+WW91LmNhCisJMHgwZTYwOiAgNmUyMCA2MTZjIDczNmYgMjA2MyA2ZjZlIDczNzUgNmM3NCAyMDc0ICBuLmFsc28uY29uc3VsdC50CisJMHgwZTcwOiAgNjg2NSAyMDZjIDY5NzMgNzQyMCA2ZjY2IDIwM2MgNDEyMCA0ODUyICBoZS5saXN0Lm9mLjxBLkhSCisJMHgwZTgwOiAgNDU0NiAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYyICBFRj0iaHR0cDovL3d3dy5iCisJMHgwZTkwOiAgNmY3NSA3NDY1IDZjNmMgMmU2MyA2ZjZkIDJmNjYgNjE3MSAyZjIyICBvdXRlbGwuY29tL2ZhcS8iCisJMHgwZWEwOiAgM2U1NyA2ZjcyIDZjNjQgMGE1NyA2OTY0IDY1MjAgNTc2NSA2MjIwICA+V29ybGQuV2lkZS5XZWIuCisJMHgwZWIwOiAgNDY3MiA2NTcxIDc1NjUgNmU3NCA2Yzc5IDIwNDEgNzM2YiA2NTY0ICBGcmVxdWVudGx5LkFza2VkCisJMHgwZWMwOiAgMjA1MSA3NTY1IDczNzQgNjk2ZiA2ZTczIDNjMmYgNDEzZSAyMDY2ICAuUXVlc3Rpb25zPC9BPi5mCisJMHgwZWQwOiAgNmY3MiAyMDY5IDZlNjYgNmY3MiA2ZDYxIDc0NjkgNmY2ZSAyZTBhICBvci5pbmZvcm1hdGlvbi4uCisJMHgwZWUwOiAgMGEzYyA0ODMyIDNlNGMgNjU3NCAyMDZmIDc0NjggNjU3MiAyMDcwICAuPEgyPkxldC5vdGhlci5wCisJMHgwZWYwOiAgNjU2ZiA3MDZjIDY1MjAgNmI2ZSA2Zjc3IDIwNjEgNjI2ZiA3NTc0ICBlb3BsZS5rbm93LmFib3V0CisJMHgwZjAwOiAgMjA3NCA2ODY5IDczMjAgNzM2NSA3Mjc2IDY1NzIgM2MyZiA0ODMyICAudGhpcy5zZXJ2ZXI8L0gyCisJMHgwZjEwOiAgM2UwYSAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwICA+Li48QS5IUkVGPSJodHRwCisJMHgwZjIwOiAgM2EyZiAyZjZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmICA6Ly9uZXRjcmFmdC5jb20vCisJMHgwZjMwOiAgMjIzZSA0ZTY1IDc0NjMgNzI2MSA2Njc0IDNjMmYgNDEzZSAyMDcwICAiPk5ldGNyYWZ0PC9BPi5wCisJMHgwZjQwOiAgNzI2ZiA3NjY5IDY0NjUgNzMyMCA2MTZlIDIwNjkgNmU3NCA2NTcyICByb3ZpZGVzLmFuLmludGVyCisJMHgwZjUwOiAgNjU3MyA3NDY5IDZlNjcgMjA2NiA3MjY1IDY1MGEgNzM2NSA3Mjc2ICBlc3RpbmcuZnJlZS5zZXJ2CisJMHgwZjYwOiAgNjk2MyA2NTIwIDY2NmYgNzIyMCA3NzY1IDYyMjAgNzM2OSA3NDY1ICBpY2UuZm9yLndlYi5zaXRlCisJMHgwZjcwOiAgMjA2ZCA2ZjZlIDY5NzQgNmY3MiA2OTZlIDY3MjAgNjE2ZSA2NDIwICAubW9uaXRvcmluZy5hbmQuCisJMHgwZjgwOiAgNzM3NCA2MTc0IDY5NzMgNzQ2OSA2MzIwIDYzNmYgNmM2YyA2NTYzICBzdGF0aXN0aWMuY29sbGVjCisJMHgwZjkwOiAgNzQ2OSA2ZjZlIDJlMGEgNTk2ZiA3NTIwIDYzNjEgNmUyMCA2YzY1ICB0aW9uLi5Zb3UuY2FuLmxlCisJMHgwZmEwOiAgNzQyMCA3NDY4IDY1NmQgMjA2YiA2ZTZmIDc3MjAgNjE2MiA2Zjc1ICB0LnRoZW0ua25vdy5hYm91CisJMHgwZmIwOiAgNzQyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NTczICB0LnlvdXIuc2VydmVyLnVzCisJMHgwZmMwOiAgNjk2ZSA2NzIwIDc0NjggNjU2OSA3MjBhIDNjNDEgMjA0OCA1MjQ1ICBpbmcudGhlaXIuPEEuSFJFCisJMHgwZmQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc1NzAgNzQ2OSA2ZDY1ICBGPSJodHRwOi8vdXB0aW1lCisJMHgwZmUwOiAgMmU2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAyMjNlICAubmV0Y3JhZnQuY29tLyI+CisJMHgwZmYwOiAgNjk2ZSA3NDY1IDcyNjYgNjE2MyA2NTNjIDJmNDEgM2UyZSAwYTQ1ICBpbnRlcmZhY2U8L0E+Li5FCisJMHgxMDAwOiAgNmU2MSA2MjZjIDY5NmUgNjcyMCA3NDY4IDY1MjAgNmQ2ZiA2ZTY5ICBuYWJsaW5nLnRoZS5tb25pCisJMHgxMDEwOiAgNzQ2ZiA3MjY5IDZlNjcgMjA2ZiA2NjIwIDc5NmYgNzU3MiAyMDczICB0b3Jpbmcub2YueW91ci5zCisJMHgxMDIwOiAgNjU3MiA3NjY1IDcyMjAgNzc2OSA2YzZjIDIwNzAgNzI2ZiA3NjY5ICBlcnZlci53aWxsLnByb3ZpCisJMHgxMDMwOiAgNjQ2NSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMjAgNjc2YyA2ZjYyICBkZS5hLmJldHRlci5nbG9iCisJMHgxMDQwOiAgNjE2YyAyMDZmIDc2NjUgNzI3NiA2OTY1IDc3MGEgNmY2NiAyMDc3ICBhbC5vdmVydmlldy5vZi53CisJMHgxMDUwOiAgNjg2ZiAyMDY5IDczMjAgNzU3MyA2OTZlIDY3MjAgNzc2OCA2MTc0ICBoby5pcy51c2luZy53aGF0CisJMHgxMDYwOiAgMjA2MSA2ZTY0IDIwNzcgNjg2NSA3MjY1IDJjMjAgNjE2ZSA2NDIwICAuYW5kLndoZXJlLC5hbmQuCisJMHgxMDcwOiAgNjk3NCAyMDc3IDZmNzUgNmM2NCAyMDY3IDY5NzYgNjUyMCA0NDY1ICBpdC53b3VsZC5naXZlLkRlCisJMHgxMDgwOiAgNjI2OSA2MTZlIDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIwYSA2Zjc2ICBiaWFuLmEuYmV0dGVyLm92CisJMHgxMDkwOiAgNjU3MiA3NjY5IDY1NzcgMjA2ZiA2NjIwIDc0NjggNjUyMCA2MTcwICBlcnZpZXcub2YudGhlLmFwCisJMHgxMGEwOiAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NSA3MzYxICBhY2hlLnBhY2thZ2UudXNhCisJMHgxMGIwOiAgNjc2NSAyZTBhIDBhM2MgNDgzMiAzZTQxIDYyNmYgNzU3NCAyMDc0ICBnZS4uLjxIMj5BYm91dC50CisJMHgxMGMwOiAgNjg2OSA3MzIwIDcwNjEgNjc2NSAzYzJmIDQ4MzIgM2UwYSAwYTNjICBoaXMucGFnZTwvSDI+Li48CisJMHgxMGQwOiAgNDk0ZCA0NzIwIDQxNGMgNDk0NyA0ZTNkIDIyNzIgNjk2NyA2ODc0ICBJTUcuQUxJR049InJpZ2h0CisJMHgxMGUwOiAgMjIyMCA0MTRjIDU0M2QgMjIyMiAyMDQ4IDQ1NDkgNDc0OCA1NDNkICAiLkFMVD0iIi5IRUlHSFQ9CisJMHgxMGYwOiAgMjIzMiAzNDM3IDIyMjAgNTc0OSA0NDU0IDQ4M2QgMjIzMiAzNzM4ICAiMjQ3Ii5XSURUSD0iMjc4CisJMHgxMTAwOiAgMjIyMCA1MzUyIDQzM2QgMjI2OSA2MzZmIDZlNzMgMmY2YSA2ODY1ICAiLlNSQz0iaWNvbnMvamhlCisJMHgxMTEwOiAgMzAzNiAzMTJlIDcwNmUgNjcyMiAzZTBhIDBhM2MgNTAzZSA1NDY4ICAwNjEucG5nIj4uLjxQPlRoCisJMHgxMTIwOiAgNjk3MyAyMDY5IDczMjAgNjEyMCA3MDZjIDYxNjMgNjU2OCA2ZjZjICBpcy5pcy5hLnBsYWNlaG9sCisJMHgxMTMwOiAgNjQ2NSA3MjIwIDcwNjEgNjc2NSAyMDY5IDZlNzMgNzQ2MSA2YzZjICBkZXIucGFnZS5pbnN0YWxsCisJMHgxMTQwOiAgNjU2NCAyMDYyIDc5MjAgNzQ2OCA2NTIwIDNjNDEgMGE0OCA1MjQ1ICBlZC5ieS50aGUuPEEuSFJFCisJMHgxMTUwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1ICBGPSJodHRwOi8vd3d3LmRlCisJMHgxMTYwOiAgNjI2OSA2MTZlIDJlNmYgNzI2NyAyZjIyIDNlNDQgNjU2MiA2OTYxICBiaWFuLm9yZy8iPkRlYmlhCisJMHgxMTcwOiAgNmUzYyAyZjQxIDNlMGEgNzI2NSA2YzY1IDYxNzMgNjUyMCA2ZjY2ICBuPC9BPi5yZWxlYXNlLm9mCisJMHgxMTgwOiAgMjA3NCA2ODY1IDIwNjEgNzA2MSA2MzY4IDY1MjAgNTc2NSA2MjIwICAudGhlLmFwYWNoZS5XZWIuCisJMHgxMTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyZTBhICBzZXJ2ZXIucGFja2FnZS4uCisJMHgxMWEwOiAgMGEzYyA1MDNlIDU0NjggNjk3MyAyMDYzIDZmNmQgNzA3NSA3NDY1ICAuPFA+VGhpcy5jb21wdXRlCisJMHgxMWIwOiAgNzIyMCA2ODYxIDczMjAgNjk2ZSA3Mzc0IDYxNmMgNmM2NSA2NDIwICByLmhhcy5pbnN0YWxsZWQuCisJMHgxMWMwOiAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlIDIwNDcgNGU1NSAyZjRjICB0aGUuRGViaWFuLkdOVS9MCisJMHgxMWQwOiAgNjk2ZSA3NTc4IDIwNmYgNzA2NSA3MjYxIDc0NjkgNmU2NyAyMDczICBpbnV4Lm9wZXJhdGluZy5zCisJMHgxMWUwOiAgNzk3MyA3NDY1IDZkMmMgMGE2MiA3NTc0IDIwNjkgNzQyMCA2ODYxICB5c3RlbSwuYnV0Lml0LmhhCisJMHgxMWYwOiAgNzMyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQ2OCA2OTZlICBzLjxzdHJvbmc+bm90aGluCisJMHgxMjAwOiAgNjcyMCA3NDZmIDIwNjQgNmYyMCA3NzY5IDc0NjggMjA3NCA2ODY1ICBnLnRvLmRvLndpdGgudGhlCisJMHgxMjEwOiAgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgNjU2MyA3NDNjICAuRGViaWFuLlByb2plY3Q8CisJMHgxMjIwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyZTIwIDUwNmMgNjU2MSA3MzY1ICAvc3Ryb25nPi4uUGxlYXNlCisJMHgxMjMwOiAgMjA2NCA2ZjIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDNjICAuZG8uPHN0cm9uZz5ub3Q8CisJMHgxMjQwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyMDYzIDZmNmUgNzQ2MSA2Mzc0ICAvc3Ryb25nPi5jb250YWN0CisJMHgxMjUwOiAgMjA3NCA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhICAudGhlLkRlYmlhbi5Qcm9qCisJMHgxMjYwOiAgNjU2MyA3NDIwIDYxNjIgNmY3NSA3NDIwIDY5NzQgMmUzYyAyZjUwICBlY3QuYWJvdXQuaXQuPC9QCisJMHgxMjcwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA2NiA2OTZlICA+Li48UD5JZi55b3UuZmluCisJMHgxMjgwOiAgNjQyMCA2MTIwIDYyNzUgNjcyMCA2OTZlIDIwNzQgNjg2OSA3MzIwICBkLmEuYnVnLmluLnRoaXMuCisJMHgxMjkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyYzIwICBhcGFjaGUucGFja2FnZSwuCisJMHgxMmEwOiAgNmY3MiAyMDY5IDZlMjAgNDE3MCA2MTYzIDY4NjUgMjA2OSA3NDczICBvci5pbi5BcGFjaGUuaXRzCisJMHgxMmIwOiAgNjU2YyA2NjJjIDBhNzAgNmM2NSA2MTczIDY1MjAgNjY2OSA2YzY1ICBlbGYsLnBsZWFzZS5maWxlCisJMHgxMmMwOiAgMjA2MSAyMDYyIDc1NjcgMjA3MiA2NTcwIDZmNzIgNzQyMCA2ZjZlICAuYS5idWcucmVwb3J0Lm9uCisJMHgxMmQwOiAgMjA2OSA3NDJlIDIwMjAgNDk2ZSA3Mzc0IDcyNzUgNjM3NCA2OTZmICAuaXQuLi5JbnN0cnVjdGlvCisJMHgxMmUwOiAgNmU3MyAyMDZmIDZlMjAgNjQ2ZiA2OTZlIDY3MjAgNzQ2OCA2OTczICBucy5vbi5kb2luZy50aGlzCisJMHgxMmYwOiAgMmMyMCA2MTZlIDY0MjAgNzQ2OCA2NTBhIDZjNjkgNzM3NCAyMDZmICAsLmFuZC50aGUubGlzdC5vCisJMHgxMzAwOiAgNjYyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhICBmLjxBLkhSRUY9Imh0dHA6CisJMHgxMzEwOiAgMmYyZiA2Mjc1IDY3NzMgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyICAvL2J1Z3MuZGViaWFuLm9yCisJMHgxMzIwOiAgNjcyZiA3MzcyIDYzM2EgNjE3MCA2MTYzIDY4NjUgMjIzZSA2YjZlICBnL3NyYzphcGFjaGUiPmtuCisJMHgxMzMwOiAgNmY3NyA2ZTIwIDYyNzUgNjc3MyAzYzJmIDQxM2UgMjA2ZiA2NjIwICBvd24uYnVnczwvQT4ub2YuCisJMHgxMzQwOiAgNzQ2OCA2OTczIDBhNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCA2MzYxICB0aGlzLnBhY2thZ2UsLmNhCisJMHgxMzUwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMCA3NDY4ICBuLmJlLmZvdW5kLmluLnRoCisJMHgxMzYwOiAgNjUyMCAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwICBlLi48QS5IUkVGPSJodHRwCisJMHgxMzcwOiAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyICA6Ly93d3cuZGViaWFuLm9yCisJMHgxMzgwOiAgNjcyZiA0Mjc1IDY3NzMgMmY1MiA2NTcwIDZmNzIgNzQ2OSA2ZTY3ICBnL0J1Z3MvUmVwb3J0aW5nCisJMHgxMzkwOiAgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyMDQyIDc1NjcgMjA1NCA3MjYxICAiPkRlYmlhbi5CdWcuVHJhCisJMHgxM2EwOiAgNjM2YiA2OTZlIDY3MjAgNTM3OSA3Mzc0IDY1NmQgM2MyZiA0MTNlICBja2luZy5TeXN0ZW08L0E+CisJMHgxM2IwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2MTZlIDZiNzMgMjA2NiA2ZjcyICAuLi48UD5UaGFua3MuZm9yCisJMHgxM2MwOiAgMjA3NSA3MzY5IDZlNjcgMjA3NCA2ODY5IDczMjAgNzA2MSA2MzZiICAudXNpbmcudGhpcy5wYWNrCisJMHgxM2QwOiAgNjE2NyA2NTJjIDIwNjEgNmU2NCAyMDYzIDZmNmUgNjc3MiA2MTc0ICBhZ2UsLmFuZC5jb25ncmF0CisJMHgxM2UwOiAgNzU2YyA2MTc0IDY5NmYgNmU3MyAyMDY2IDZmNzIgMjA3OSA2Zjc1ICB1bGF0aW9ucy5mb3IueW91CisJMHgxM2YwOiAgNzIyMCA2MzY4IDZmNjkgNjM2NSAyMDZmIDY2MGEgNjEyMCA0NDY1ICByLmNob2ljZS5vZi5hLkRlCisJMHgxNDAwOiAgNjI2OSA2MTZlIDIwNzMgNzk3MyA3NDY1IDZkMjEgM2MyZiA1MDNlICBiaWFuLnN5c3RlbSE8L1A+CisJMHgxNDEwOiAgMGEwYSAzYzQ0IDQ5NTYgMjA2MSA2YzY5IDY3NmUgM2QyMiA2MzY1ICAuLjxESVYuYWxpZ249ImNlCisJMHgxNDIwOiAgNmU3NCA2NTcyIDIyM2UgMGEzYyA2MTIwIDY4NzIgNjU2NiAzZDIyICBudGVyIj4uPGEuaHJlZj0iCisJMHgxNDMwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxICBodHRwOi8vd3d3LmRlYmlhCisJMHgxNDQwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSAwYTNjIDQ5NGQgNDcyMCA2MTZjICBuLm9yZy8iPi48SU1HLmFsCisJMHgxNDUwOiAgNjk2NyA2ZTNkIDIyNmQgNjk2NCA2NDZjIDY1MjIgMjA2OCA2NTY5ICBpZ249Im1pZGRsZSIuaGVpCisJMHgxNDYwOiAgNjc2OCA3NDNkIDIyMzMgMzAyMiAyMDc3IDY5NjQgNzQ2OCAzZDIyICBnaHQ9IjMwIi53aWR0aD0iCisJMHgxNDcwOiAgMzIzNSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgNmU3MyAyZjY0ICAyNSIuc3JjPSJpY29ucy9kCisJMHgxNDgwOiAgNjU2MiA2OTYxIDZlMmYgNmY3MCA2NTZlIDZjNmYgNjc2ZiAyZDMyICBlYmlhbi9vcGVubG9nby0yCisJMHgxNDkwOiAgMzUyZSA2YTcwIDY3MjIgMjA2MSA2Yzc0IDNkMjIgNDQ2NSA2MjY5ICA1LmpwZyIuYWx0PSJEZWJpCisJMHgxNGEwOiAgNjE2ZSAyMjNlIDBhM2MgMmY2MSAzZTBhIDNjNjEgMjA2OCA3MjY1ICBhbiI+LjwvYT4uPGEuaHJlCisJMHgxNGIwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTcwICBmPSJodHRwOi8vd3d3LmFwCisJMHgxNGMwOiAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlMGEgM2M0OSA0ZDQ3ICBhY2hlLm9yZy8iPi48SU1HCisJMHgxNGQwOiAgMjA2MSA2YzY5IDY3NmUgM2QyMiA2ZDY5IDY0NjQgNmM2NSAyMjIwICAuYWxpZ249Im1pZGRsZSIuCisJMHgxNGUwOiAgNjg2NSA2OTY3IDY4NzQgM2QyMiAzMzMyIDIyMjAgNzc2OSA2NDc0ICBoZWlnaHQ9IjMyIi53aWR0CisJMHgxNGYwOiAgNjgzZCAyMjMyIDM1MzkgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmICBoPSIyNTkiLnNyYz0iaWNvCisJMHgxNTAwOiAgNmU3MyAyZjYxIDcwNjEgNjM2OCA2NTVmIDcwNjIgMmU3MCA2ZTY3ICBucy9hcGFjaGVfcGIucG5nCisJMHgxNTEwOiAgMjIyMCA2MTZjIDc0M2QgMjI0MSA3MDYxIDYzNjggNjUyMiAzZTBhICAiLmFsdD0iQXBhY2hlIj4uCisJMHgxNTIwOiAgM2MyZiA2MTNlIDBhM2MgMmY0NCA0OTU2IDNlMGEgMGEzYyAyMTJkICA8L2E+LjwvRElWPi4uPCEtCisJMHgxNTMwOiAgMmQwYSAyMDIwIDU0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzYxICAtLi4uVGhpcy5wYWdlLndhCisJMHgxNTQwOiAgNzMyMCA2OTZlIDY5NzQgNjk2MSA2YzZjIDc5MjAgNjM3MiA2NTYxICBzLmluaXRpYWxseS5jcmVhCisJMHgxNTUwOiAgNzQ2NSA2NDIwIDYyNzkgMjA0YSA2ZjY4IDZlNjkgNjUyMCA0OTZlICB0ZWQuYnkuSm9obmllLkluCisJMHgxNTYwOiAgNjc3MiA2MTZkIDIwMjggNjg3NCA3NDcwIDNhMmYgMmY2ZSA2NTc0ICBncmFtLihodHRwOi8vbmV0CisJMHgxNTcwOiAgNjc2ZiA2NDJlIDZlNjUgNzQyZiAyOTBhIDIwMjAgNDk3NCAyMDc3ICBnb2QubmV0LykuLi5JdC53CisJMHgxNTgwOiAgNjE3MyAyMDZjIDYxNzQgNjU3MiAyMDY1IDY0NjkgNzQ2NSA2NDIwICBhcy5sYXRlci5lZGl0ZWQuCisJMHgxNTkwOiAgNjI3OSAyMDRkIDYxNzQgNzQ2OCA2NTc3IDIwNTcgNjk2YyA2MzZmICBieS5NYXR0aGV3LldpbGNvCisJMHgxNWEwOiAgNzgyMCA2MTZlIDY0MjAgNGE2ZiA3MzY5IDcwMjAgNTI2ZiA2NDY5ICB4LmFuZC5Kb3NpcC5Sb2RpCisJMHgxNWIwOiAgNmUyZSAwYTIwIDIwNGMgNjE3MyA3NDIwIDZkNmYgNjQ2OSA2NjY5ICBuLi4uLkxhc3QubW9kaWZpCisJMHgxNWMwOiAgNjU2NCAzYTIwIDI0NDQgNjE3NCA2NTNhIDIwMzIgMzAzMCAzNDJmICBlZDouJERhdGU6LjIwMDQvCisJMHgxNWQwOiAgMzAzNiAyZjMyIDMwMjAgMzEzNSAzYTMzIDMzM2EgMzUzNyAyMDI0ICAwNi8yMC4xNTozMzo1Ny4kCisJMHgxNWUwOiAgMmUwYSAyMDIwIDJkMmQgM2UwYSAwYTNjIDJmNDIgNGY0NCA1OTNlICAuLi4uLS0+Li48L0JPRFk+CisJMHgxNWYwOiAgMGEzYyAyZjQ4IDU0NGQgNGMzZSAwYSAgICAgICAgICAgICAgICAgICAuPC9IVE1MPi4KKzIzOjU3OjM1Ljk0MTI2MCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTM+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCisJMHgwMDEwOiAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMSA3ZjAwICAuNC5uQC5ALiFULi4uLi4uCisJMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDEwICAuLi5wLlA3WC5JN3ouLi4uCisJMHgwMDMwOiAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjICAwXy4uLi4uLi4uTS4uLk0uCisJMHgwMDQwOiAgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLgorMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwMzQgMWI3MCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMCAgLjQucEAuQC4hUi4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgODAxMSAgLi4ucC5QN1guSTd6Li4uLgorCTB4MDAzMDogIDMwNWYgMGJlMSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjEgNGRkYyAgMF8uLi4uLi4uLk0uLiFNLgorCTB4MDA0MDogIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4KKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KKwkweDAwMTA6ICAwMDM0IDFmZTggNDAwMCA0MDA2IDFjZGEgN2YwMCAwMDAxIDdmMDAgIC40Li5ALkAuLi4uLi4uLi4KKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIGEzYTkgMzc1OCA4YTRhIDgwMTEgIC4uLlAucDd6Li43WC5KLi4KKwkweDAwMzA6ICAyMDAwIDE3MzUgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzIDRkZGMgIC4uLjUuLi4uLi5NLi4jTS4KKwkweDAwNDA6ICA5NzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4hCisyMzo1NzozNy4yMzA5MDAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYxIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQzPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgorCTB4MDAxMDogIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEgN2YwMCAgLjQuckAuQC4hUC4uLi4uLgorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEgODAxMCAgLi4ucC5QN1guSjd6Li4uLgorCTB4MDAzMDogIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYyAgMF8uLi4uLi4uLk0uLiNNLgorCTB4MDA0MDogIDk3MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LWZsYWdzLnBjYXAgYi90ZXN0cy9wcmludC1mbGFncy5wY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OThjNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wcmludC1mbGFncy5wY2FwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LWZsYWdzLnB1dSBiL3Rlc3RzL3ByaW50LWZsYWdzLnB1dQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q4Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQtZmxhZ3MucHV1CkBAIC0wLDAgKzEsMTUxIEBACitiZWdpbiA2NDQgcHJpbnQtZmxhZ3MucGNhcAorTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYCFgYGBgS1U7KzBFKTAjQCEqYGBgYDJAYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBAYDEwYGAvIU1IMGAhYCFCJTI/UGBgYDdcYGBgJzo8YCEwLVVCKT9AYGBgYCJAYEdfXworTSUiJGBgYCgkMGBQJGBAQCozPVIyJUBgYGBgYCFgUCwiS1U7KzBISTAjQCEqYGBgYDJAYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBAYDEwYGAvYGBgMGAhYCFDUlo/UGBgYDdcYGBgJGA0LUlQLVdKLVwzPThCN15AJEdfXworTTtLJGBgYCgkMGBQJGBAQCozPVIyJURXPERBOCFgUCwiS1U7KzBLPTAjQCEiYGBgYDBAYGBgYGBgYGBgYAorTWBgYGBgYGBgYGBAYDEwYGAtIU1KMGAhYCFCJTg/UGBgYDdcYGBgJzo8YCEwLVVCKT9TPVpDPypgJCJgYAorTS1dYGBgYCQhImBJLVcpKDYzPVIyJUpdNlJUKj81MFhgI2AkYGBgUCFgYGBgYGBgYGBgYGBgYGBgYGBgKAorTWAkNGBgL1g7OyRgYDBgOEBDJ1xgYGAlX2BgYCFWR2BgNCM9OEI3XFc+SFdSQCFAQGAvW1JgYGAhYDBAKgorTTM9UjIlVFc8REE5JzE1MEArUiEoNSUxMCtTJE4sMFQqMiZdUz0jSEA7Jl1DODZRSDtXLVQjMEk1PFY1UgorTSs0JUc5NllULkIhJTMmRU46VyxPLCJYUSwiWFQrMzxNOSY1Qjo2JU4oIkFUOTdBVDs2XUQ5M0xAMyZFTgorTT03QEAsQlhWK0MkUSszJE0tQ0BWKzctTTwiIUktQ0BWLlJgUSxTKVgtMzhNLEJELSJEJUM4VjVQPSNIQAorTSpCXEojMEkhOFYtRTwnME0xNllDO1YxSTtGPFooJj1aOjdgLSJEJUM4VjVQPSJVLDg2WUc9NiVHOTNIQAorTTk2WC0iRC1PO0ZZRThXMUk7VlhaKCRNRTk3YE0wNlFJPUY0LSJAVCpLVTsrMEtJOSNAISJgYGBgMEBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYEBgMTBgYC0hX0QwYCFgIUFTPj9QYGBgN1xgYGAkYDQtSVAtV0otXEM9OAorTUJERmAkImBgLVAsYGBgJCEiYEktVykoODM9UjIlWl02UlQqUDdgWGBeMTRgYC9ENWBgYGBgYGBgYGBgYAorTWBgYGBgYGAoYCQ0YCU+TD9ZRGBgMGA4Jyk3XGBgYCVfYGBgIWAlIzo8Iz1aQz8oVzYoSSlAIUBAYCEvQAorTWBgYCFgMEAqMz1SMiY0VzxEQT0oNSUxMCtTJE4sMmBSLCNgQDNUTC0iRDFBPSY0WiglPUU5IlBALCM4QAorTTJHNUwoIyhQLCM0QCwjLFotMzxaLFM0QDFUVTQjMEkzOTcpVjk3KFooJCVQODYtSDkyXFErQyxOLFMsLQorTSJEUUE8VzBNMzZdRDo2OUk5NjBaKCUtVTtCUEAsMzRAMDc1RygjKFAsIzBALCNgWi0jLFotIyRAMVRVNAorTSMwSSU1JiVHLkJgQi1GNFgsJjhQKzMkVC4mJE0tIyRROTYoUThGMEIjMEkhOFYtRTwnME00RiVOOVY1UworTS5CIUI+NzFFPFBUKjBWXU49JjVOPSJVLDk2WUc9JkBaKCM0Ui0zQC0iRE1FOTdgTTA2UUk9RjRaKCcxSQorTTs2NU89NzBdLDM0TCgmVUE+I1RRLCNgLSJELU87RllFOFcxSTtWWFooJE1FOTdgTTA2UUk9RjQtIkQtTworTTtHMUU7RzBNNSdFUDkzSEA9JjVYPSJdSD0mVUwuUiFDOiYlUjxWNVQvNkVTO1JUWC4jNFkrMyQtIkBUKgorTS8iJSQzVC00NjUhJSgkQTQzNFBANCU1IjMkRSMoIihNK1JdNyxULE8rVDE0MSIhKDUkVSwoIzBOLCMkQAorTTUnKUE7Ry1JPSZFTztGJUwrUl0lM0IoXiJDUSg1JFUsL0BIXDIkNSExI1gqKCJgQC8kVSU1JCRAMiUxNAorTTQiVSU0NTUpNUNUQjBWXU49JjVOPSJVND43IUUoQiEjM1RZNDE0WTQvMilUOTdBVCtWQVQ7NlBbKCYtSAorTTg3KVM5NzBdOjctTyszQFgtM0RNLDIoXiJCYEAoI1EtMTUxISgkWSEzNDRdKEQxRTxWLVI6NyFUOjZdTgorTShCISMzVFk0MTRZNC8yKTQ6JjRAOjZZST0mRUE7IiFJO0ctVDg2UUw4NzFJO1ZYQDtWOEAxJjVCOjYlTgorTSgmJVA4Ni1IOTJYQi9ASEAoImBcNSRFNDMkNF40JlFBOFY1SDtWUUQ5NyhAPCYlRzkzUE81JEU0MyQ0XgorTSJDUE8yJDUhMSNYKi8kKS8xJURANSQ1ODUjVEIoU2BQLCNgUCwiKEAwRD0jM1RRLzRDVEIoVDkmMUQ5JgorTTFCKEAzJEUuMlNUQihTYFAsIyElMUIoQDVEUSkzRExdKEIsVS0zJFguJCRCKCQlLDI0WSsvMihDMUQ4UAorTSwjYFAoQ1gqIkNRKCwzWTA7JiVDOTZBTzsmMUU8QiFQODY9RS8iXSgsM1gqLyRAUi9ERUYoJ0VPPTIhQQorTTxGNEA6RzVTPSIhQjxGXVc8VkVOOVIhVDomNEA9VjVCLyJdSCxDWCoiQ1EwL0UxSDkyIU89VllFPEIhTworTTlCIVQ6JkVTKCc9RThCIVM6NzFFKCZBQTxSIU47VzBAPCc1VCgnNVAoJiVOPjIhVzk2KEA8JiVHOTcsQAorTT42NVQrQEkwOyY1QTxWNEA4Vl1NOTIhQjg2LUsoJlFBPSY1UitDUE80I1gqIkNRMC9DUTMzNCUsMyNYXAorTTBURTQxM1ktO1c5RSgmJUw7VllHKyIhTjtXMUg6NllHKCcxTygnLUU5MiFIOTcpRStCWE4vIl0jMjUxJQorTS9CYForMkRcK1UtLTA0USwvQ1BPNCNYKiJDUSgsQ1kpOUIhWTtXNEA4NylFKCcxUj42RU45UiFUO1IhTAorTTtWLUE9JjRAPSZBRSgmJUQ7NkVOOjctVDxGJVQ7VyhAO1Y4QD0mQUk8UiFNODYtSDo2WUUvIl0oLENYKgorTSJDUTAvREVGKCdFTz0yIVc4NllUKCcxTygnKUU8Jl1SPSIhUztWVUU9JkFJO0Y8QDg2KU89NzBAPSZBSQorTTxSIUg7Vy1UKVcsQDhGNUg4NzlJO1coTCgnIUw5NiVTOTBJQztWWVQ4Ni1UKCcxSDkyISk7RzFFPEZZRQorTT0iITM5NylWOjYtRSglIVI7VzlJOSY1UigiQSk0VWBJKCZFTj1GXUw9RjVEKCYxSTxGNUM9JlFZK0NQTworTTQjWCoiQ1EwL0UtRTkyIVQ6JjRALyQkQDonKUU5Q1RCOicxVDwjSE8rVz1XPVJZQThHNVM5MllOOTcwTworTShDWS45NzFXO1cpSygkJUI9Ny1FIkQtTDk2JVI6NllHOiZdVTxWNFwrVCReKCY5TzxCIUg7VzxAPSZcQAorTTkmXEA9JkFJPFJYXCtVYF4iQEhcMiMoXjI2OEA+Nl1VKCYlUjkyIVQ6JjRAODYxTTo2WUk8VzFSODcxTworTTxCIU85QiFUOiZFUygmVUE4VkFJO0Y0XCtUQFIvQEgqLyVgXjUmQUUoJkVOOjcxSTg2UEA6NllTPSYlTAorTTsmJVQ6Nl1OKCZdRigjUSEoJkFSOTY4XShGQVQ9J2BaK1JdVz1XPE45JjVCOjYlTitGXVI5UlxCL0QxRQorTThGRUE7Qj1TIkYlUDg2LUg5M1BPMDNYQD1WNUIoJy1FPEc5RTxCIVA4Ni1LODY9RSgnPUE8UiFTPTYtQworTTk3LVM5RzVMK0NQTzQjWCoiQ1EwL0NRMzUlKS8zRDxeNjZdVSgnLUg7VzVMOSIhUjk3IUw4Ni1FKCcxSAorTTo3LEA8JiVHOTIhVzo3MUgoJ0VPPTcoQDtXPU4oJz1FOEIhUDg2PUU8UiFBPFBJUztWXU4oJiVTKCchTworTTxXLUk4RlFFK0NQTzRVMTIzVFknL0NQTzQjWCoiQ1EwL0U1TjsmNVM8UiFZO1c0QDhWQUE7Rj1FOSIhSQorTT0nLEA4Vl1OOUZFRz03KUE9JkVPO0JQQD42XVU8QiFOOTc8QDxWNVI9RjVSKCZFUygmLU87RjlJOVc1UgorTTk2MEA4NyxAOUZdTDsmXVc8U0gqLyU1LC9ASFwzJEReIkQtTztGOUk5VzVSODcxSTtWWEA5RkVMOTcsQAorTThWJU4oJilFKCY5Tz02WUQoJkVOKCNRNDUjWE85NzFDK1YlUDg2LUg5M1BPNSUwXitDUE8zJEReIkBIXAorTTMkRF4iRTFIOTJgXDUlMF4xJl1DPTZVRTtHMTI7Vl1ULyJdNDUjWEwoJz1IOjYtSCgmRVMoJzFIOTIhRAorTTo3KUU4VzFPPEdEQD02WUQ5NyhAPVZBSThWQEA4NlFMKCdFTz03KCoyJTEtMyIhRjo2UUU8UiFTOiZdVQorTTsmMEA5N0FJPFcwTCgmRVMoJy1FPSIhVDtSYFw1JTBeK1c5QTxCXVc9VzxcK1UxNC9CWFwrVFEpL0BIKgorTS8kUSkvQEkjMVREQDxWLVI6NyFUPFIhQTxGNEA7Jl1POlY1RCgmOU88QiFJO0JgXDUlMF4rVzVTPEJdTAorTTo2KE84Vj1JKzYpSTtDUE81JTBeKyIhVzomRUM6IiFJPFIhVzomNVI5MEkkOTYpSTg2WEA8JiVDOlYlRworTTk3LEA9VkVMOyIhUDsmJUM5MiFUOiY1STxCIVM4VylJPCcxUytDUE8zJEReIkBIXDMkRF4iRFFPOVIhRgorTTo2UUU8UiFBPEY0QDwmUUE4VjVEKCZFTigjUTQ1I1hPPUYlUitWUU85Ul1BPCYlQzomNFwrVTE0L0JQQAorTTg2WUQoJz1JOyZQQDhGNEA8Rl1UODcxRTlgSVc5NjVLOydETigiITQ6JjRAOUcpRTw3NUU7Ri1ZKCZdRgorTSgnKU89JiVUOjZdTigmLUE7QiFCOTIhRTg3LUk7J0RAOFZBQTtGPUU5IiFCPjIhRTkmRVQ6NllHIkNRNAorTTUjWE85NzFDK1ZRTzlXKU89JiVUOTJZRCtWJVA4Ni1IOTNQTzUlMF4rQ1BPMyREXiJASFwzJEReIkUxSAorTTkyIUQ5NjlBPTZRVCgmMUk8RjVDPSZdUj4yIUk7RjFFPiIhSTxSYFw1JTBeOjZZRDk3QE46JzFNOyNQTworTTUlMF4rIiFNOTYlTjo2WUcoJzFIODcwQDxGNVE9NjVTPScsKjlGXVIoJiRAOSZFUjk2LVQ7VylZKCNRNAorTTUjWE85Rl1PK1YpQTxCXFwrVTE0L0IhVzo2UUwoJj1JPUY0QD0mQUUoJi1PO0cxRTtHMVMoJl1GKCcxSAorTTkyIUY6NlFFKCNRNDUjWE89RiVSK1c9Vz1SXUY7VlxPOEYlUitWRU45JjVYK0ZBVDs2UFwrVTE0L0BJSQorTTlCIUk9IiFFPiZFUz0nLEAqJiVTPFc1TTo2WUcoJzFIODcwQC8lMTQvQl1WODcoTz1XPVcvIl00NSNYQAorTTo3LEA+Nl1VPEJgXDUlMF4xJl1DPTZVRTtHMTI7Vl1ULyJdNDUjWEkrQ1BPMyREXiJASFwzJEReIkU1UworTTk3KEA5JkVSOTYtVDtXKUk5NyxAODcpRSgmNU44NilMOTYwTCgmJU45IiFVPFY1UigmMU84VzVNOTZZVAorTTxSIVc6NlFMKCYpRSgmUU87Vk1FOSIhRjtXKCo6NlhAPSZBRSgjUTQ1I1lQPTYpTDo2LT86JzFNOyNQTworTTUlMF4oJjFJPEY1Qz0mXVI+MiFPOUIhVDomNEA9Ny1FPEcsRygmQU87NjVTK0JgQDUmQUU8VjRAOSZFUgorTTxQSVM6Jl1VOyYwQDhGNEA9NllEOTcoQC8lMTQvQl1IO1ZVRS8iXTQ1I1hMKCYlTjkiIVU8VjVSPFIhVworTTo2UUwoJllPPSIhQjkyIUE4RlFFKCcxTygnLVk7NlFJO0ZMKj0mXEA5RkVMOTcsQD0mQUU+MiFEO1ZYRworTT0iIU89VlhOLyJdLDIzWCoiQ1BPNTRQXiJEJUw7IiFUOiY0QDxXMUE7RjFBPEYwQDg3IUE4VkFFKCZVTworTTknNUw5NyxAODcpRSgmJVY4NkVMODYpTDkyIVc6NzFIKCcxSDo3LEA8RjVMOTYlUzkyIUE7RjBAODcpRQorTSJGWU89UiFNODZZQTlWNUQoJz1JPSZAQDkmNUI4Vl1OOUJYQCglMVk8JjRALyUxNC9GMVA6VjxNPEY1QworTTtWWUY6Nj1VPEY0QDg3IUE4VkFFLyJdNDUjWEA9JlwqPFY1TDk2LVQoJz1IOjYtSCgmVU85JzVMOTcsQAorTT42XVUoJz1BO0cwQDk2WUE4RlFFOSJYQCgkVUE7R0RAO1cxSDk3KEA7Nl1EPTZRRTxSIUE8RjRAODc5QQorTTo2UUE4RlFFIkcxSDxGXVU5VkBAPSZBRSgkMUU4RkVBO0IhUDg2LUs4Nj1FKCctWTxXMUU7MiFXOjcxSAorTSgnMUg5MiFOODZVRTxSYFw1JTBeOyZFQjg3IUE4VkFFKzZVTzkiVEovIl00NSNYTiJERUYoJ0VPPTIhTgorTTk2NUQoJzFPKCYtTzs3IUk7JjRAODIhTTtWMVU7JjRAPjZdVTxHLUU7JjhMKCdFTz0yIVc6NlFMKCZZRQorTTk2MEA9JlxAOjZZUz0mJUw7IiFUOiY0Ki8lMTQvRiVQODYtSDkyVUQ5NzhcK1UxNC9CIVA4Ni1LODY9RQorTStASCovJWBeMzZdUjkyIUQ7Vi1VOzY1Tj0mJVQ6Nl1OKCZdTigkJVA4Ni1IOTIhQzg2WEA4RjRAOUZdVQorTTtGMEA7VlhaIkNRNTMjWCovJFEpL0BJNDomNEAvJCRAMiUpJTFDVEIrVjFPOFJdQTwmJUM6JjRNOSZdQworTStWVUE7RzVBOyJcQi9EJVA4Ni1IOTIhRDtWLVU7NjVOPSYlVDo2XU4vIl0hL0IhUz0mXVI5NjBAO1ZYQAorTT42XVU8QiFTOTcpVjk3KE4vIl0sMjNYKiJDUSwyM1gqNSZBRSgjUSEoJEEyMTQ4XShGQVQ9J2BaK1JdVworTT1XPE44NyFBOFZBRStGXVI5UlxCL0QlUDg2LUg5MiEwPEZdSjk2LVQvIl0hL0IhSDtWVUUoJy1JPSY0TgorTS8iXSwyM1gqIkNRLDIzWCo1JkFFKCNRISgkQTIxNDhdKEZBVD0nYForUl1XPVc8Tjg3IUE4VkFFKzctUworTTsiWU88RjxPKENZITwmJUM6JjRNNFUtLC8iXSEvQiFIO1ZVRSgnLUk9JjROLyJdLDIzWCoiQ1EsMjNYKgorTTUmQUUoI1EhKCRBMjE0OF0oRkFUPSdgWitSXVA5NylMK0YlUDg2LUg5MllPPEY8TyhDWU07VjBAPCY1UgorTTsjUE8wM1hAOiZdTTkyIVM6NzFFK0NQTzMkRF4iQEhcMyREXiJFMUg5MmBcMDIhKDRENSYvMilIPScxUAorTS5CXE89Vz1XK0YlUDg2LUg5Nz1FOTZMTjhWXU0rUiheMDchQThWQUU1VjVFOlNQTzAzWEA7RjVXPFZRRQorTT0nMUU8QlhcK1RRKS9ASCovJFEpL0BJNDomNEAvJCRAMiUpJTFDVEI6JzFUPCNITytXPVc9UllEOTYpSQorTTg2WE47VylHK1YxTzhSXEIvRDFFOEZFQTtCITA8Rl1KOTYtVCJEMU84VzVNOTZZVDg3MUk7VlhcK1QkXgorTSgnPUg6Ni1IKCYtTztHMUE6NllTKCRBLzVVMS88UlBAMUQlMTxSUEA4NllEKCctTzlHMVc4NylFKCc1UAorTTkmJVQ5NyxOLyJdLDIzWCovIl01MyNYKiJDUTAvRUVPPTIhQzg2WEA4NlFTO1IhQztWWVM9NlFUKCcxSAorTTkyIUw6Ny1UKCZdRigjUSEoJEEyMTQ4XShGQVQ9J2BaK1JdVz1XPE44Rl1VPSY1TDsiWUM7VlRPOUYlUQorTStSKF41Vl1SOyYwKjVWRUQ5MiE3OTYoQDFHKUU8NzVFO0cxTD4yISE8Vk1FOSIhMT02NVM9JkVPO0csXAorTStUJF4oJjlPPEIhSTtGOU88RlVBPSZFTztCWCoiQ1EoLENZLDk3MEA7VzFIOTcoQDwmNU88JlFFKCZNTgorTTtXPEA4NilPPTcwQD0mQUk8UiFTOTcpVjk3KFwrVEBSL0BIKi8kJEAyJSklMUNUQjonMVQ8I0hPK1ZZRQorTT0mLVI4NjlUK0YtTzsyXEIvRFlFPSYtUjg2OVQvIl0hL0IhUDxGXVY6NjFFPFIhQTtCIUk7RzFFPEY1UworTT0mRU45UiFGPEY1RSJHLUU8RzlJOFY0QDlGXVIoJz1FOEIhUzo3MUUoJlVPO0ZFVDtXKUk7RjxAODZZRAorTSgnLVQ4NzFJPFcxSThSIUM7VlFMOTYtVDo2XU4rQEk5O1c0QDhWJU4oJlFFPSIhVDomNU0oJk1OO1c8QAorTTg2KU89NzBAPjZdVTxCIVM5NylWOTcoQD03LUk7RjxAPSZBRTo3KCovJCRAMiUpJTFDVEI6JzFUPCNITworTStXNVA9JkVNOTJZTjk3MUM8RiVGPSJZQztWVE8oQ1lJO0cxRTxGOUE4VjRcK1QkXitASSU7RiVCOyZFTgorTTlSIVQ6JjRAOzZdTjo3MU88RkVOOVIhTzlCIVk7VzVSKCctRTxHOUU8QiFXOjZRTCgnIVI7VzlJOSY0QAorTTgyIUI5NzFUOTcoQDlWUU84RiVMKCZdVjk3KVY6NjVXIkZdRignPUg7UiFJPFIhVTxWRU45UiFXOiYlVAorTSgmJU45IiFXOiY1UjkyUEA4NllEKCZFVCgnPU89NlFEKCY9ST1GNEAxJjVCOjYlTigmJEA4RjVUPSY1UgorTSJGXVY5NylWOjY1VygmXUYoJzFIOTIhQTwmJUM6JjRAPCYlQzpWJUc5MiFVPFYlRzkyWCoiQ1EoLENZIQorTThGXVU9IiFUOiZFUygnIUE5VjRcK1RAUi9ASCovJEUtMVIhITMkRSczQ1RCPEZFRzonMEIoJCUsNSNUQgorTShCISgxNEUnMiUwXShDKFQtUihANVRFJDUkQF0oQyhXLiIoQDRVKSMvMilJOFZdTjxSXUo6JjRQLUMkTgorTTwmWUcoQ1gqIkNRMC9FMUg6NyxAOjcsQDgyIVA7JiVDOTZBTzsmMUU8QiFQODY9RSgmRU48VzFBOyZRRQorTTkiIUI+MiFUOiY0QC8kJCoyJSklMUNUQjonMVQ8I0hPK1c9Vz1SWUQ5NilJODZYTjtXKUcrUiheMSY1QgorTTo2JU4vIl0hL0BJUjk2UUU4Ny1FKCZdRignMUg5MiFBPCYlQzomNEA1VjVCKCctRTxHOUU8QiFQODYtSworTTg2PUUrQEgqLyVgXjUmQUk8UiFDO1ZVUD03MUU8QiFIODcsQDo2WVM9JiVMOyY1RCgnMUg5MiEkOTYpSQorTTg2WEAxVFk1K1RRSTtHNVgoJl1QOTcpQT0mRU45UiFTPjctVDk2VEwiRilVPSIhST0iIUg4NyxALyctVAorTTxGXU45U1lOO1cxSDo2WUcoJzFPKCYxTygnPUk9JkBAPSZBRSgkMUU4RkVBO0BJMDxGXUo5Ni1ULyJdUworTT0nKU87RjxeK0IhMDsmNUE8VjRAOSZcQC8nLVQ8Rl1OOVNZTjtXMFwrVy1UPEZdTjlTWEA4Vl1OPSYlQworTT0iIVQ6JjRAMSY1Qjo2JU4iRSFSO1ZJRThXMEA4NilPPTcwQDo3ME4vIl0wL0BIKi8lYF4yNjhAPjZdVQorTSgmOUk7RjBAODIhQj02PEA6NlhAPSZBSTxSIUE8JiVDOiY0QDwmJUM6ViVHOTJQQDtXKEA6NlhAMDchQQorTThWQUUoJkVUPFY1TDlCUCo8JlFFODctRSgmOUk7JjRAODIhQj02PEA8RjVQO1cpVCgmXU4oJkVUK0JgQAorTTI2WVM9JylVOFcxSTtWWVMoJl1OKCYxTzo2WUcoJzFIOjcsTCgmJU45IiFUOiY0KjsmRVM9IiFPOUJgXAorTTAyISg0RDUmLzIpSD0nMVAuQlxPOEc1RzxSWUQ5NilJODZYTjtXKUcrVy1SOFNJQTwmJUM6JjRCL0ZNTgorTTtXPU4oJilVOVcsXCtUJF4oJl1GKCcxSDo3LCo8JiVDOlYlRzkyUEA4ViVOKCYpRSgmOU89NllEKCZFTgorTSgnMUg5MmAqLyQkQDIlKSUxQ1RCOicxVDwjSE8rVz1XPVJZRDk2KUk4NlhOO1cpRytUKVU5VyxPNEY1UAorTTtXKVQ6NllHKENZJDk2KUk4NlhAMEc1RyglMVI4Ni1LOjZZRyglLVk8VzFFOzNQTzAzWE4iQEhcNCNZNAorTTomJU46VyxAOUZdUignNVM6NllHKCcxSDo3LEA8JiVDOlYlRzkyUEA4NllEKCYtTztGPVI4NzFVOyYlVAorTTo2XU48UiFGO1coQD42XVU8QiFDOiZdSThWNEA7VjgqODIhJDk2KUk4NlhAPFdFUz0mNU0oM1BPNCNYKgorTSJDUSQyNThAODZRSTlWWF0oRi1FO0cxRTxCKF4iQ1FBKCZBUjk2OF0oRkFUPSdgWitSXVc9VzxOOSY1QgorTTo2JU4rRl1SOVJcQi9ASFwyNFUnKCYlTDo2PU4vMilNOjYxRDsmNEIoJkFFOjY9SD0jVEIsU2BCKCc9SQorTTknMUgvMihSLTIoQDxXKUMvMilJOFZdTjxSXUQ5NilJODZYTztXIUU7RlFPOVZcTSxDNE46RyFHKEIhQQorTTsnMF0oRDFFOEZFQTtCKF4iQ1BPODNYKi8mJEA6JylFOUNUQjonMVQ8I0hPK1c9Vz1SWUE8JiVDOiY0TgorTTtXKUcrUiheIkNRKTM0PEA4NlFJOVZYXShGVUk5JjFMOTIoQDomNUk5VkFULzIoUyxCKEA9VkVEPSZAXQorTShDKFUuMihAPFcpQy8yKUk4Vl1OPFJdQTwmJUM6JjU/PCYoTjwmWUcoQiFBOycwXShEJVA4Ni1IOTIoXgorTSJDUE84M1gqLyJdJDI1OF4iQEhcKDJUTSJCYEA1JkFJPFIhUDg2PUUoJz1BPFIhSTtGRVQ6NiVMOydEQAorTThXKUU4NzFFOSIhQj4yISo7VkFOOjY0QDI2WUc8RiVNKCJBSD0nMVAuQlxPO0Y1VDlWXUQrRllFPSJcSQorTSJCYEAyNzBAPVYlUygmUUE9JjVSKCY1RDo3MUU5IiFCPjIhLTg3MVQ6JjVXKCU9STsmLU8+IiFBO0YwQAorTTJGXVM6N2BANEZdRDo2WE4iQmBAMyYlUz0iIU07VjFJOUZFRTkjSEApJDFBPSY0WigjKFAsIzBPLCM4TworTSxDYEAsMzRaLFMsWi0zPEApIlgqKCJgTSszWCoiQ1BPMERdJDYzWCovIl0oNSRVLC9ASk81TE0iUyVQLgorTWAkKGBgYCEiYGBgYGBgYGBgYGBgYGBgYGBgYGAiYCElYGBgVCZWWWBgJGAmKDUxX2BgYCE/UGBgYD1JUAorTWAlYFc2KEkpLVdKQ0o4YDAsJVwwWkBgYGAwJCgiRFc8REFFLVcpKDlMNTsrMEw+YGBQISJgYGBgMEBgYAorTWBgYGBgYGBgYGBgYGBgYGBgYEBgMTBgYC0hTVAwYCFgIUIlMj9QYGBgN1xgYGAnOjxgITAtVUIqMjM9WgorTUhaRmAkMyE/Il4kYGBgJCEiYEktVyk8QTM9UjImOyU2UlQqV0EwLGAwQGBgYCQoYGBgYGBgYGBgYGBgYAorTWBgYGBgYGAoYCQ0YGAjMD9aJGBgMGA4PFZHXGBgYCVfYGBgIWAlIzo8Iz1aSFpEVzYoSSpAISRAYCE8VQorTWBgYCFgMEAqMz1SNyhUVzxFUiZRNUxNIl0oNCNgJChgYGAhImBgYGBgYGBgYGBgYGBgYGBgYGBgImAhJQorTWBgYFQmVylgYCRgJig1IV9gYGAhP1BgYGA9SVBgJWBXNihJKi1XSkNKSGAwLCVcJlVgYGBgMCQoIkRXPAorJkVSLS1XKTxDCitgCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LWZsYWdzLnNoIGIvdGVzdHMvcHJpbnQtZmxhZ3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk5Zjc4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ByaW50LWZsYWdzLnNoCkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCit1dWRlY29kZSBwcmludC1mbGFncy5wdXUKKworZm9yIGkgaW4geCB4eCBYIFhYIEEgQUE7IGRvCisJaWYgKC4uL3RjcGR1bXAgLSRpIC1zMCAtbnIgcHJpbnQtZmxhZ3MucGNhcCB8IHRlZSBwcmludC0kaS5uZXcgfCBkaWZmIC0gcHJpbnQtJGkub3V0KQorCXRoZW4KKwkJZWNobyBwcmludC0kaSBwYXNzZWQuCisJZWxzZQorCQllY2hvIHByaW50LSRpIGZhaWxlZC4KKwlmaQorZG9uZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQteC5uZXcgYi90ZXN0cy9wcmludC14Lm5ldwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI1YmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQteC5uZXcKQEAgLTAsMCArMSw0MDkgQEAKKzIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+CisJMHgwMDAwOiAgNDUwMCAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwCisJMHgwMDIwOiAgYTAwMiA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhCisJMHgwMDMwOiAgNGRkYyA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIKKzIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICA0NTAwIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YKKwkweDAwMjA6ICBhMDEyIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEKKwkweDAwMzA6ICA0ZGRjIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMgorMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZhIDQwMDAgNDAwNiAyMTU4IDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMgorCTB4MDAyMDogIDgwMTAgMjAwMCAzN2QwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNgorCTB4MDAzMDogIDRkZGMgOTIxNgorMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+CisJMHgwMDAwOiAgNDUwMCAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyCisJMHgwMDIwOiAgODAxOCAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3CisJMHgwMDMwOiAgNGRkYyA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxCisJMHgwMDQwOiAgMmUzMSAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4CisJMHgwMDUwOiAgNmY3MyA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhCisJMHgwMDYwOiAgMjA0NSA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3CisJMHgwMDcwOiAgMmQ2NCA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0CisJMHgwMDgwOiAgNjUzYiAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkCisJMHgwMDkwOiAgMzEyZCAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwCisJMHgwMGEwOiAgMzEzMyAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwCisJMHgwMGIwOiAgNzQzYSAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1CisJMHgwMGMwOiAgNmU2MyA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxCisJMHgwMGQwOiAgNjM2MyA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwCisJMHgwMGUwOiAgNjU2ZSAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwCisJMHgwMGYwOiAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYQorMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgNDUwMCAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5CisJMHgwMDIwOiAgODAxMCAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4CisJMHgwMDMwOiAgNGRkYyA5MjE3CisyMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgNDUwMCAxNWViIDFmZTYgNDAwMCA0MDA2IDA3MjUgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5CisJMHgwMDIwOiAgODAxOCAyMDAwIDEzZTAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5CisJMHgwMDMwOiAgNGRkYyA5MjE3IDQ4NTQgNTQ1MCAyZjMxIDJlMzEgMjAzMiAzMDMwCisJMHgwMDQwOiAgMjA0ZiA0YjBkIDBhNDQgNjE3NCA2NTNhIDIwNTcgNjU2NCAyYzIwCisJMHgwMDUwOiAgMzAzNiAyMDRhIDc1NmMgMjAzMiAzMDMwIDM1MjAgMzAzMyAzYTM1CisJMHgwMDYwOiAgMzczYSAzMzM1IDIwNDcgNGQ1NCAwZDBhIDUzNjUgNzI3NiA2NTcyCisJMHgwMDcwOiAgM2EyMCA0MTcwIDYxNjMgNjg2NSAyZjMxIDJlMzMgMmUzMyAzMzBkCisJMHgwMDgwOiAgMGE0YyA2MTczIDc0MmQgNGQ2ZiA2NDY5IDY2NjkgNjU2NCAzYTIwCisJMHgwMDkwOiAgNTM3NSA2ZTJjIDIwMzEgMzUyMCA0MTc1IDY3MjAgMzIzMCAzMDM0CisJMHgwMGEwOiAgMjAzMCAzMDNhIDM0MzMgM2EzNCAzMTIwIDQ3NGQgNTQwZCAwYTQ1CisJMHgwMGIwOiAgNTQ2MSA2NzNhIDIwMjIgMzY2NSAzODMwIDY2MzAgMmQzMSAzNDM4CisJMHgwMGMwOiAgNjEyZCAzNDMxIDMxNjUgNjIzMSA2MjY0IDIyMGQgMGE0MSA2MzYzCisJMHgwMGQwOiAgNjU3MCA3NDJkIDUyNjEgNmU2NyA2NTczIDNhMjAgNjI3OSA3NDY1CisJMHgwMGUwOiAgNzMwZCAwYTQzIDZmNmUgNzQ2NSA2ZTc0IDJkNGMgNjU2ZSA2Nzc0CisJMHgwMGYwOiAgNjgzYSAyMDM1IDMyMzUgMzgwZCAwYTRiIDY1NjUgNzAyZCA0MTZjCisJMHgwMTAwOiAgNjk3NiA2NTNhIDIwNzQgNjk2ZCA2NTZmIDc1NzQgM2QzMSAzNTJjCisJMHgwMTEwOiAgMjA2ZCA2MTc4IDNkMzEgMzAzMCAwZDBhIDQzNmYgNmU2ZSA2NTYzCisJMHgwMTIwOiAgNzQ2OSA2ZjZlIDNhMjAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1CisJMHgwMTMwOiAgMGQwYSA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAzYTIwCisJMHgwMTQwOiAgNzQ2NSA3ODc0IDJmNjggNzQ2ZCA2YzNiIDIwNjMgNjg2MSA3MjczCisJMHgwMTUwOiAgNjU3NCAzZDY5IDczNmYgMmQzOCAzODM1IDM5MmQgMzEwZCAwYTBkCisJMHgwMTYwOiAgMGEzYyAyMTQ0IDRmNDMgNTQ1OSA1MDQ1IDIwNDggNTQ0ZCA0YzIwCisJMHgwMTcwOiAgNTA1NSA0MjRjIDQ5NDMgMjAyMiAyZDJmIDJmNTcgMzM0MyAyZjJmCisJMHgwMTgwOiAgNDQ1NCA0NDIwIDQ4NTQgNGQ0YyAyMDM0IDJlMzAgMzEyMCA1NDcyCisJMHgwMTkwOiAgNjE2ZSA3MzY5IDc0NjkgNmY2ZSA2MTZjIDJmMmYgNDU0ZSAyMjNlCisJMHgwMWEwOiAgMGEzYyA0ODU0IDRkNGMgM2UwYSAzYzQ4IDQ1NDEgNDQzZSAwYTIwCisJMHgwMWIwOiAgMjAyMCAzYzRkIDQ1NTQgNDEyMCA0ODU0IDU0NTAgMmQ0NSA1MTU1CisJMHgwMWMwOiAgNDk1NiAzZDIyIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1CisJMHgwMWQwOiAgMjIyMCA0MzRmIDRlNTQgNDU0ZSA1NDNkIDIyNzQgNjU3OCA3NDJmCisJMHgwMWUwOiAgNjg3NCA2ZDZjIDNiMjAgNjM2OCA2MTcyIDczNjUgNzQzZCA2OTczCisJMHgwMWYwOiAgNmYyZCAzODM4IDM1MzkgMmQzMSAyMjNlIDBhMjAgMjAyMCAzYzRkCisJMHgwMjAwOiAgNDU1NCA0MTIwIDRlNDEgNGQ0NSAzZDIyIDQ0NjUgNzM2MyA3MjY5CisJMHgwMjEwOiAgNzA3NCA2OTZmIDZlMjIgMjA0MyA0ZjRlIDU0NDUgNGU1NCAzZDIyCisJMHgwMjIwOiAgNTQ2OCA2NTIwIDY5NmUgNjk3NCA2OTYxIDZjMjAgNjk2ZSA3Mzc0CisJMHgwMjMwOiAgNjE2YyA2YzYxIDc0NjkgNmY2ZSAyMDZmIDY2MjAgNDQ2NSA2MjY5CisJMHgwMjQwOiAgNjE2ZSAyMDYxIDcwNjEgNjM2OCA2NTJlIDIyM2UgMGEyMCAyMDIwCisJMHgwMjUwOiAgM2M1NCA0OTU0IDRjNDUgM2U1MCA2YzYxIDYzNjUgNjg2ZiA2YzY0CisJMHgwMjYwOiAgNjU3MiAyMDcwIDYxNjcgNjUzYyAyZjU0IDQ5NTQgNGM0NSAzZTBhCisJMHgwMjcwOiAgM2MyZiA0ODQ1IDQxNDQgM2UwYSAzYzQyIDRmNDQgNTkyMCA1NDQ1CisJMHgwMjgwOiAgNTg1NCAzZDIyIDIzMzAgMzAzMCAzMDMwIDMwMjIgMjA0MiA0NzQzCisJMHgwMjkwOiAgNGY0YyA0ZjUyIDNkMjIgMjM0NiA0NjQ2IDQ2NDYgNDYyMiAyMDRjCisJMHgwMmEwOiAgNDk0ZSA0YjNkIDIyMjMgMzAzMCAzMDMwIDQ1NDYgMjIyMCA1NjRjCisJMHgwMmIwOiAgNDk0ZSA0YjNkIDIyMjMgMzUzNSAzMTM4IDM4NDEgMjIyMCA0MTRjCisJMHgwMmMwOiAgNDk0ZSA0YjNkIDIyMjMgNDY0NiAzMDMwIDMwMzAgMjIzZSAwYTBhCisJMHgwMmQwOiAgM2M0OCAzMTNlIDUwNmMgNjE2MyA2NTY4IDZmNmMgNjQ2NSA3MjIwCisJMHgwMmUwOiAgNzA2MSA2NzY1IDNjMmYgNDgzMSAzZTBhIDNjNDggMzIzZSA0OTY2CisJMHgwMmYwOiAgMjA3OSA2Zjc1IDIwNjEgNzI2NSAyMDZhIDc1NzMgNzQyMCA2MjcyCisJMHgwMzAwOiAgNmY3NyA3MzY5IDZlNjcgMjA3NCA2ODY1IDIwNzcgNjU2MiAzYzJmCisJMHgwMzEwOiAgNjgzMiAzZTBhIDBhM2MgNTAzZSA1NDY4IDY1MjAgNmY3NyA2ZTY1CisJMHgwMzIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDc3NjUgNjIyMCA3MzY5CisJMHgwMzMwOiAgNzQ2NSAyMDY4IDYxNzMgMjA2ZSA2Zjc0IDIwNzAgNzU3NCAyMDc1CisJMHgwMzQwOiAgNzAyMCA2MTZlIDc5MjAgNzc2NSA2MjIwIDcwNjEgNjc2NSA3MzIwCisJMHgwMzUwOiAgNzk2NSA3NDJlIDBhNTAgNmM2NSA2MTczIDY1MjAgNjM2ZiA2ZDY1CisJMHgwMzYwOiAgMjA2MiA2MTYzIDZiMjAgNmM2MSA3NDY1IDcyMmUgM2MyZiA1MDNlCisJMHgwMzcwOiAgMGEwYSAzYzUwIDNlM2MgNTM0ZCA0MTRjIDRjM2UgM2M0MyA0OTU0CisJMHgwMzgwOiAgNDUzZSA0ZDZmIDc2NjUgMjA2MSA2YzZmIDZlNjcgMmMyMCA2ZTZmCisJMHgwMzkwOiAgNzQ2OCA2OTZlIDY3MjAgNzQ2ZiAyMDczIDY1NjUgMjA2OCA2NTcyCisJMHgwM2EwOiAgNjUyZSAyZTJlIDNjMmYgNDM0OSA1NDQ1IDNlMjAgM2EyZCAyOTNjCisJMHgwM2IwOiAgMmY1MyA0ZDQxIDRjNGMgM2UzYyAyZjUwIDNlMGEgMGEzYyA0ODMyCisJMHgwM2MwOiAgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgNzQ3MiA3OTY5CisJMHgwM2QwOiAgNmU2NyAyMDc0IDZmMjAgNmM2ZiA2MzYxIDc0NjUgMjA3NCA2ODY1CisJMHgwM2UwOiAgMjA2MSA2NDZkIDY5NmUgNjk3MyA3NDcyIDYxNzQgNmY3MiAyMDZmCisJMHgwM2YwOiAgNjYyMCA3NDY4IDY5NzMgMjA2ZCA2MTYzIDY4NjkgNmU2NSAzYzJmCisJMHgwNDAwOiAgNDgzMiAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDc3CisJMHgwNDEwOiAgNjE2ZSA3NDIwIDc0NmYgMjA3MiA2NTcwIDZmNzIgNzQyMCA3MzZmCisJMHgwNDIwOiAgNmQ2NSA3NDY4IDY5NmUgNjcyMCA2MTYyIDZmNzUgNzQyMCA3NDY4CisJMHgwNDMwOiAgNjk3MyAyMDY4IDZmNzMgNzQyNyA3MzIwIDYyNjUgNjg2MSA3NjY5CisJMHgwNDQwOiAgNmY3MiAyYzIwIDcwNmMgNjU2MSA3MzY1IDBhNjMgNmY2ZSA3NDYxCisJMHgwNDUwOiAgNjM3NCAyMDc0IDY4NjUgMjA0OSA2ZTc0IDY1NzIgNmU2NSA3NDIwCisJMHgwNDYwOiAgNTM2NSA3Mjc2IDY5NjMgNjUyMCA1MDcyIDZmNzYgNjk2NCA2NTcyCisJMHgwNDcwOiAgMjAyOCA0OTUzIDUwMjkgMjA2OSA2ZTc2IDZmNmMgNzY2NSA2NDIwCisJMHgwNDgwOiAgNjQ2OSA3MjY1IDYzNzQgNmM3OSAyZTNjIDJmNTAgM2UwYSAwYTNjCisJMHgwNDkwOiAgNTAzZSA1MzY1IDY1MjAgNzQ2OCA2NTIwIDNjNDEgMjA2OCA3MjY1CisJMHgwNGEwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTYyCisJMHgwNGIwOiAgNzU3MyA2NTJlIDZlNjUgNzQyZiAyMjNlIDRlNjUgNzQ3NyA2ZjcyCisJMHgwNGMwOiAgNmIyMCA0MTYyIDc1NzMgNjUwYSA0MzZjIDY1NjEgNzI2OSA2ZTY3CisJMHgwNGQwOiAgNjg2ZiA3NTczIDY1M2MgMmY0MSAzZTIwIDY2NmYgNzIyMCA2ODZmCisJMHgwNGUwOiAgNzcyMCA3NDZmIDIwNjQgNmYyMCA3NDY4IDY5NzMgMmUzYyAyZjUwCisJMHgwNGYwOiAgM2UwYSAwYTNjIDQ4MzIgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyCisJMHgwNTAwOiAgNjUyMCA3NDY4IDY1MjAgNjE2NCA2ZDY5IDZlNjkgNzM3NCA3MjYxCisJMHgwNTEwOiAgNzQ2ZiA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNmQ2MSA2MzY4CisJMHgwNTIwOiAgNjk2ZSA2NTNjIDJmNDggMzIzZSAwYTBhIDNjNTAgM2U1NCA2ODY1CisJMHgwNTMwOiAgMjA2OSA2ZTY5IDc0NjkgNjE2YyAyMDY5IDZlNzMgNzQ2MSA2YzZjCisJMHgwNTQwOiAgNjE3NCA2OTZmIDZlMjAgNmY2NiAyMDNjIDQxMjAgNjg3MiA2NTY2CisJMHgwNTUwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyCisJMHgwNTYwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDQ0NjUgNjI2OSA2MTZlCisJMHgwNTcwOiAgMjc3MyAwYTYxIDcwNjEgNjM2OCA2NTNjIDJmNDEgM2UyMCA3NzY1CisJMHgwNTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1CisJMHgwNTkwOiAgMjA3NyA2MTczIDIwNzMgNzU2MyA2MzY1IDczNzMgNjY3NSA2YzJlCisJMHgwNWEwOiAgM2MyZiA1MDNlIDBhMGEgM2M1MCAzZTNjIDUzNTQgNTI0ZiA0ZTQ3CisJMHgwNWIwOiAgM2U1OSA2Zjc1IDIwNzMgNjg2ZiA3NTZjIDY0MjAgNzI2NSA3MDZjCisJMHgwNWMwOiAgNjE2MyA2NTIwIDc0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzY5CisJMHgwNWQwOiAgNzQ2OCAyMDc5IDZmNzUgNzIyMCA2Zjc3IDZlMjAgNzc2NSA2MjIwCisJMHgwNWUwOiAgNzA2MSA2NzY1IDczMjAgNjE3MyAwYTczIDZmNmYgNmUyMCA2MTczCisJMHgwNWYwOiAgMjA3MCA2ZjczIDczNjkgNjI2YyA2NTJlIDNjMmYgNTM1NCA1MjRmCisJMHgwNjAwOiAgNGU0NyAzZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgNTU2ZSA2YzY1CisJMHgwNjEwOiAgNzM3MyAyMDc5IDZmNzUgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDY5CisJMHgwNjIwOiAgNzQ3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjEgNzQ2OSA2ZjZlCisJMHgwNjMwOiAgMmMyMCA3OTZmIDc1NzIgMjA2ZSA2NTc3IDIwNzMgNjU3MiA3NjY1CisJMHgwNjQwOiAgNzIyMCA2OTczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2NSA2NDIwCisJMHgwNjUwOiAgNjE3MyAyMDY2IDZmNmMgNmM2ZiA3NzczIDNhMGEgM2M1NSA0YzNlCisJMHgwNjYwOiAgMGEzYyA0YzQ5IDNlMGEgNDM2ZiA2ZTY2IDY5NjcgNzU3MiA2MTc0CisJMHgwNjcwOiAgNjk2ZiA2ZTIwIDY2NjkgNmM2NSA3MzIwIDYzNjEgNmUyMCA2MjY1CisJMHgwNjgwOiAgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjY1CisJMHgwNjkwOiAgNzQ2MyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjCisJMHgwNmEwOiAgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjCisJMHgwNmIwOiAgNTQ1NCAzZTQ0IDZmNjMgNzU2ZCA2NTZlIDc0NTIgNmY2ZiA3NDNjCisJMHgwNmMwOiAgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgNjk3MyAyMDc0CisJMHgwNmQwOiAgNjg2NSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA3NSA2ZTY0CisJMHgwNmUwOiAgNjU3MiAyMDc3IDY4NjkgNjM2OCAyMDYxIDZjNmMgMjA3OSA2Zjc1CisJMHgwNmYwOiAgNzIwYSA0ODU0IDRkNGMgMjA2NiA2OTZjIDY1NzMgMjA3MyA2ODZmCisJMHgwNzAwOiAgNzU2YyA2NDIwIDY1NzggNjk3MyA3NDJjIDIwNjkgNzMyMCA3MzY1CisJMHgwNzEwOiAgNzQyMCA3NDZmIDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3CisJMHgwNzIwOiAgNzczYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjCisJMHgwNzMwOiAgNDkzZSAwYTQzIDQ3NDkgMjA3MyA2MzcyIDY5NzAgNzQ3MyAyMDYxCisJMHgwNzQwOiAgNzI2NSAyMDZjIDZmNmYgNmI2NSA2NDIwIDY2NmYgNzIyMCA2OTZlCisJMHgwNzUwOiAgMjAzYyA1NDU0IDNlMmYgNzU3MyA3MjJmIDZjNjkgNjIyZiA2MzY3CisJMHgwNzYwOiAgNjkyZCA2MjY5IDZlM2MgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzCisJMHgwNzcwOiAgNjgyMCA2OTczIDIwNzcgNjg2NSA3MjY1IDBhNDQgNjU2MiA2OTYxCisJMHgwNzgwOiAgNmUyMCA3MDYxIDYzNmIgNjE2NyA2NTczIDIwNzcgNjk2YyA2YzIwCisJMHgwNzkwOiAgNzA2YyA2MTYzIDY1MjAgNzQ2OCA2NTY5IDcyMjAgNzM2MyA3MjY5CisJMHgwN2EwOiAgNzA3NCA3MzJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhCisJMHgwN2IwOiAgNGM2ZiA2NzIwIDY2NjkgNmM2NSA3MzIwIDYxNzIgNjUyMCA3MDZjCisJMHgwN2MwOiAgNjE2MyA2NTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY3NiA2MTcyCisJMHgwN2QwOiAgMmY2YyA2ZjY3IDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlCisJMHgwN2UwOiAgMmMyMCA2MTZlIDY0MjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA3MjZmCisJMHgwN2YwOiAgNzQ2MSA3NDY1IDY0MGEgNzc2NSA2NTZiIDZjNzkgMmUyMCAyMDU0CisJMHgwODAwOiAgNjg2NSAyMDY2IDcyNjUgNzE3NSA2NTZlIDYzNzkgMjA2ZiA2NjIwCisJMHgwODEwOiAgNzI2ZiA3NDYxIDc0NjkgNmY2ZSAyMDYzIDYxNmUgMjA2MiA2NTIwCisJMHgwODIwOiAgNjU2MSA3MzY5IDZjNzkgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDYyCisJMHgwODMwOiAgNzkyMCA2NTY0IDY5NzQgNjk2ZSA2NzBhIDNjNTQgNTQzZSAyZjY1CisJMHgwODQwOiAgNzQ2MyAyZjZjIDZmNjcgNzI2ZiA3NDYxIDc0NjUgMmU2NCAyZjYxCisJMHgwODUwOiAgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlCisJMHgwODYwOiAgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwNjQgNjU2NiA2MTc1CisJMHgwODcwOiAgNmM3NCAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2OSA2ZTY0CisJMHgwODgwOiAgNjU3OCAyMDY5IDczMjAgM2M1NCA1NDNlIDY5NmUgNjQ2NSA3ODJlCisJMHgwODkwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTJjIDIwNmQgNjU2MSA2ZTY5CisJMHgwOGEwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCA3MjY1IDcxNzUgNjU3MyA3NDczCisJMHgwOGIwOiAgMGE2NiA2ZjcyIDIwNjEgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5CisJMHgwOGMwOiAgMjAzYyA1NDU0IDNlMmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiAzYzJmCisJMHgwOGQwOiAgNTQ1NCAzZTIwIDc3NjkgNmM2YyAyMDY3IDY5NzYgNjUyMCA3NDY4CisJMHgwOGUwOiAgNjUyMCA2MzZmIDZlNzQgNjU2ZSA3NDczIDIwNmYgNjYyMCA3NDY4CisJMHgwOGYwOiAgNjUyMCA2NjY5IDZjNjUgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmCisJMHgwOTAwOiAgNzc3NyA3NzJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgNjk2ZSA2NDY1CisJMHgwOTEwOiAgNzgyZSA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMGEgNjk2NiAyMDY5CisJMHgwOTIwOiAgNzQyMCA2NTc4IDY5NzMgNzQ3MyAyMDI4IDYxNzMgNzM3NSA2ZDY5CisJMHgwOTMwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCAzYzU0IDU0M2UgMmY3NiA2MTcyCisJMHgwOTQwOiAgMmY3NyA3Nzc3IDNjMmYgNTQ1NCAzZTIwIDY5NzMgMjA3OSA2Zjc1CisJMHgwOTUwOiAgNzIyMCAzYzU0IDU0M2UgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA1MjZmCisJMHgwOTYwOiAgNmY3NCAzYzJmIDU0NTQgM2UyOSAyZTNjIDJmNGMgNDkzZSAwYTBhCisJMHgwOTcwOiAgM2M0YyA0OTNlIDBhNTUgNzM2NSA3MjIwIDY0NjkgNzI2NSA2Mzc0CisJMHgwOTgwOiAgNmY3MiA2OTY1IDczMjAgNjE3MiA2NTIwIDY1NmUgNjE2MiA2YzY1CisJMHgwOTkwOiAgNjQyYyAyMDYxIDZlNjQgMjA3NSA3MzY1IDcyMjAgNjQ2ZiA2Mzc1CisJMHgwOWEwOiAgNmQ2NSA2ZTc0IDczMjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA2YzZmCisJMHgwOWIwOiAgNmY2YiA2NTY0IDIwNjYgNmY3MiAwYTY5IDZlMjAgNzQ2OCA2NTIwCisJMHgwOWMwOiAgM2M1NCA1NDNlIDcwNzUgNjI2YyA2OTYzIDVmNjggNzQ2ZCA2YzNjCisJMHgwOWQwOiAgMmY1NCA1NDNlIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDZmCisJMHgwOWUwOiAgNjYyMCA3NDY4IDY1MjAgNzU3MyA2NTcyIDczMjcgMjA2OCA2ZjZkCisJMHgwOWYwOiAgNjU3MyAyZTIwIDIwNTQgNjg2NSA3MzY1IDIwNjQgNjk3MiA3MzBhCisJMHgwYTAwOiAgNzM2OCA2Zjc1IDZjNjQgMjA2MiA2NTIwIDc1NmUgNjQ2NSA3MjIwCisJMHgwYTEwOiAgM2M1NCA1NDNlIDJmNjggNmY2ZCA2NTNjIDJmNTQgNTQzZSAyYzIwCisJMHgwYTIwOiAgNjE2ZSA2NDIwIDc1NzMgNjU3MiA3MzIwIDc3NjkgNmM2YyAyMDZlCisJMHgwYTMwOiAgNmY3NCAyMDYyIDY1MjAgNjE2MiA2YzY1IDIwNzQgNmYyMCA3Mzc5CisJMHgwYTQwOiAgNmQ2YyA2OTZlIDZiMGEgNzQ2ZiAyMDY2IDY5NmMgNjU3MyAyMDc0CisJMHgwYTUwOiAgNjg2NSA3OTIwIDY0NmYgNmUyNyA3NDIwIDZmNzcgNmUyZSAzYzJmCisJMHgwYTYwOiAgNGM0OSAzZTBhIDBhM2MgMmY1NSA0YzNlIDBhNDEgNmM2YyAyMDc0CisJMHgwYTcwOiAgNjg2NSAyMDczIDc0NjEgNmU2NCA2MTcyIDY0MjAgNjE3MCA2MTYzCisJMHgwYTgwOiAgNjg2NSAyMDZkIDZmNjQgNzU2YyA2NTczIDIwNjEgNzI2NSAyMDYxCisJMHgwYTkwOiAgNzY2MSA2OTZjIDYxNjIgNmM2NSAyMDc3IDY5NzQgNjgyMCA3NDY4CisJMHgwYWEwOiAgNjk3MyAyMDcyIDY1NmMgNjU2MSA3MzY1IDIwNjEgNmU2NCAyMDYxCisJMHgwYWIwOiAgNzI2NSAwYTZlIDZmNzcgMjA2ZCA2MTZlIDYxNjcgNjU2NCAyMDc3CisJMHgwYWMwOiAgNjk3NCA2ODIwIDY0NjUgNjI2MyA2ZjZlIDY2MmUgMjAyMCA1NDc5CisJMHgwYWQwOiAgNzA2NSAyMDNjIDU0NTQgM2U2NCA3MDZiIDY3MmQgNzI2NSA2MzZmCisJMHgwYWUwOiAgNmU2NiA2OTY3IDc1NzIgNjUyMCA2MTcwIDYxNjMgNjg2NSAzYzJmCisJMHgwYWYwOiAgNTQ1NCAzZTIwIDc0NmYgMGE3MyA2NTZjIDY1NjMgNzQyMCA3NzY4CisJMHgwYjAwOiAgNjk2MyA2ODIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgNzk2ZiA3NTIwCisJMHgwYjEwOiAgNzc2MSA2ZTc0IDIwNjUgNmU2MSA2MjZjIDY1NjQgMmUyMCAyMDRkCisJMHgwYjIwOiAgNjE2ZSA3OTIwIDZmNzQgNjg2NSA3MjIwIDZkNmYgNjQ3NSA2YzY1CisJMHgwYjMwOiAgNzMyMCA2MTcyIDY1MjAgNjE3NiA2MTY5IDZjNjEgNjI2YyA2NTBhCisJMHgwYjQwOiAgNzQ2OCA3MjZmIDc1NjcgNjgyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5CisJMHgwYjUwOiAgNjE2ZSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzMgNzk3MyA3NDY1CisJMHgwYjYwOiAgNmQyMCA3NzY5IDc0NjggMjA3NCA2ODY1IDIwNmUgNjE2ZCA2NTczCisJMHgwYjcwOiAgMjAzYyA1NDU0IDNlNmMgNjk2MiA2MTcwIDYxNjMgNjg2NSAyZDZkCisJMHgwYjgwOiAgNmY2NCAyZDJhIDNjMmYgNTQ1NCAzZTJlIDBhNDkgNjYyMCA3OTZmCisJMHgwYjkwOiAgNzUyMCA2ZTY1IDY1NjQgMjA3NCA2ZjIwIDYzNmYgNmQ3MCA2OTZjCisJMHgwYmEwOiAgNjUyMCA2MTIwIDZkNmYgNjQ3NSA2YzY1IDIwNzkgNmY3NSA3MjczCisJMHgwYmIwOiAgNjU2YyA2NjJjIDIwNzkgNmY3NSAyMDc3IDY5NmMgNmMyMCA2ZTY1CisJMHgwYmMwOiAgNjU2NCAyMDc0IDZmMjAgNjk2ZSA3Mzc0IDYxNmMgNmMyMCA3NDY4CisJMHgwYmQwOiAgNjUwYSAzYzU0IDU0M2UgNjE3MCA2MTYzIDY4NjUgMmQ2NCA2NTc2CisJMHgwYmUwOiAgM2MyZiA1NDU0IDNlMjAgNzA2MSA2MzZiIDYxNjcgNjUyZSAwYTBhCisJMHgwYmYwOiAgM2M1MCAzZTRkIDZmNzIgNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0CisJMHgwYzAwOiAgNjE3NCA2OTZmIDZlMjAgNmY2ZSAyMDQxIDcwNjEgNjM2OCA2NTIwCisJMHgwYzEwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2ZiA2ZTNhCisJMHgwYzIwOiAgMGEzYyA1NTRjIDNlMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjCisJMHgwYzMwOiAgNDEyMCA0ODUyIDQ1NDYgM2QyMiAyZjY0IDZmNjMgMmY2MSA3MDYxCisJMHgwYzQwOiAgNjM2OCA2NTJkIDY0NmYgNjMyZiA2ZDYxIDZlNzUgNjE2YyAyZjIyCisJMHgwYzUwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0CisJMHgwYzYwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDczNzQgNmY3MiA2NTY0CisJMHgwYzcwOiAgMjA2ZiA2ZTIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjJlCisJMHgwYzgwOiAgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwCisJMHgwYzkwOiAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmCisJMHgwY2EwOiAgNzc3NyA3NzJlIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyCisJMHgwY2IwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA1MDcyIDZmNmEgNjU2MyA3NDNjCisJMHgwY2MwOiAgMmY0MSAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmCisJMHgwY2QwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxCisJMHgwY2UwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3CisJMHgwY2YwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZDczIDczNmMgMmU2ZiA3MjY3CisJMHgwZDAwOiAgMmYyMiAzZTQxIDcwNjEgNjM2OCA2NTJkIDUzNTMgNGMzYyAyZjQxCisJMHgwZDEwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5CisJMHgwZDIwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4CisJMHgwZDMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzA2NSA3MjZjCisJMHgwZDQwOiAgMmU2MSA3MDYxIDYzNjggNjUyZSA2ZjcyIDY3MmYgMjIzZSA2ZDZmCisJMHgwZDUwOiAgNjQyMCA3MDY1IDcyNmMgM2MyZiA0MTNlIDIwNjggNmY2ZCA2NTIwCisJMHgwZDYwOiAgNzM2OSA3NDY1IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlCisJMHgwZDcwOiAgMGE1NCA2ODY1IDIwM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0CisJMHgwZDgwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYxIDcwNjEgNjM2OCA2NTc3CisJMHgwZDkwOiAgNjU2NSA2YjJlIDYzNmYgNmQyZiAyMjNlIDQxNzAgNjE2MyA2ODY1CisJMHgwZGEwOiAgNTc2NSA2NTZiIDNjMmYgNDEzZSAyMDZlIDY1NzcgNzM2YyA2NTc0CisJMHgwZGIwOiAgNzQ2NSA3MjJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhCisJMHgwZGMwOiAgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0CisJMHgwZGQwOiAgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1IDYyNjkgNjE2ZSAyZTZmCisJMHgwZGUwOiAgNzI2NyAyZjY0IDZmNjMgMmYyMiAzZTQ0IDY1NjIgNjk2MSA2ZTIwCisJMHgwZGYwOiAgNTA3MiA2ZjZhIDY1NjMgNzQwYSA0NDZmIDYzNzUgNmQ2NSA2ZTc0CisJMHgwZTAwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDc3NjggNjk2MyA2ODIwCisJMHgwZTEwOiAgNjM2ZiA2ZTc0IDYxNjkgNmU3MyAyMDQ4IDRmNTcgNTQ0ZiA3MzJjCisJMHgwZTIwOiAgMjA0NiA0MTUxIDczMmMgMjA2MSA2ZTY0IDIwNzMgNmY2NiA3NDc3CisJMHgwZTMwOiAgNjE3MiA2NTIwIDc1NzAgNjQ2MSA3NDY1IDczMmUgM2MyZiA0YzQ5CisJMHgwZTQwOiAgM2UwYSAzYzJmIDU1NGMgM2UwYSAwYTNjIDUwM2UgNTk2ZiA3NTIwCisJMHgwZTUwOiAgNjM2MSA2ZTIwIDYxNmMgNzM2ZiAyMDYzIDZmNmUgNzM3NSA2Yzc0CisJMHgwZTYwOiAgMjA3NCA2ODY1IDIwNmMgNjk3MyA3NDIwIDZmNjYgMjAzYyA0MTIwCisJMHgwZTcwOiAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3CisJMHgwZTgwOiAgMmU2MiA2Zjc1IDc0NjUgNmM2YyAyZTYzIDZmNmQgMmY2NiA2MTcxCisJMHgwZTkwOiAgMmYyMiAzZTU3IDZmNzIgNmM2NCAwYTU3IDY5NjQgNjUyMCA1NzY1CisJMHgwZWEwOiAgNjIyMCA0NjcyIDY1NzEgNzU2NSA2ZTc0IDZjNzkgMjA0MSA3MzZiCisJMHgwZWIwOiAgNjU2NCAyMDUxIDc1NjUgNzM3NCA2OTZmIDZlNzMgM2MyZiA0MTNlCisJMHgwZWMwOiAgMjA2NiA2ZjcyIDIwNjkgNmU2NiA2ZjcyIDZkNjEgNzQ2OSA2ZjZlCisJMHgwZWQwOiAgMmUwYSAwYTNjIDQ4MzIgM2U0YyA2NTc0IDIwNmYgNzQ2OCA2NTcyCisJMHgwZWUwOiAgMjA3MCA2NTZmIDcwNmMgNjUyMCA2YjZlIDZmNzcgMjA2MSA2MjZmCisJMHgwZWYwOiAgNzU3NCAyMDc0IDY4NjkgNzMyMCA3MzY1IDcyNzYgNjU3MiAzYzJmCisJMHgwZjAwOiAgNDgzMiAzZTBhIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0CisJMHgwZjEwOiAgNzQ3MCAzYTJmIDJmNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmCisJMHgwZjIwOiAgNmQyZiAyMjNlIDRlNjUgNzQ2MyA3MjYxIDY2NzQgM2MyZiA0MTNlCisJMHgwZjMwOiAgMjA3MCA3MjZmIDc2NjkgNjQ2NSA3MzIwIDYxNmUgMjA2OSA2ZTc0CisJMHgwZjQwOiAgNjU3MiA2NTczIDc0NjkgNmU2NyAyMDY2IDcyNjUgNjUwYSA3MzY1CisJMHgwZjUwOiAgNzI3NiA2OTYzIDY1MjAgNjY2ZiA3MjIwIDc3NjUgNjIyMCA3MzY5CisJMHgwZjYwOiAgNzQ2NSAyMDZkIDZmNmUgNjk3NCA2ZjcyIDY5NmUgNjcyMCA2MTZlCisJMHgwZjcwOiAgNjQyMCA3Mzc0IDYxNzQgNjk3MyA3NDY5IDYzMjAgNjM2ZiA2YzZjCisJMHgwZjgwOiAgNjU2MyA3NDY5IDZmNmUgMmUwYSA1OTZmIDc1MjAgNjM2MSA2ZTIwCisJMHgwZjkwOiAgNmM2NSA3NDIwIDc0NjggNjU2ZCAyMDZiIDZlNmYgNzcyMCA2MTYyCisJMHgwZmEwOiAgNmY3NSA3NDIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjIwCisJMHgwZmIwOiAgNzU3MyA2OTZlIDY3MjAgNzQ2OCA2NTY5IDcyMGEgM2M0MSAyMDQ4CisJMHgwZmMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzU3MCA3NDY5CisJMHgwZmQwOiAgNmQ2NSAyZTZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmCisJMHgwZmUwOiAgMjIzZSA2OTZlIDc0NjUgNzI2NiA2MTYzIDY1M2MgMmY0MSAzZTJlCisJMHgwZmYwOiAgMGE0NSA2ZTYxIDYyNmMgNjk2ZSA2NzIwIDc0NjggNjUyMCA2ZDZmCisJMHgxMDAwOiAgNmU2OSA3NDZmIDcyNjkgNmU2NyAyMDZmIDY2MjAgNzk2ZiA3NTcyCisJMHgxMDEwOiAgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NzY5IDZjNmMgMjA3MCA3MjZmCisJMHgxMDIwOiAgNzY2OSA2NDY1IDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIyMCA2NzZjCisJMHgxMDMwOiAgNmY2MiA2MTZjIDIwNmYgNzY2NSA3Mjc2IDY5NjUgNzcwYSA2ZjY2CisJMHgxMDQwOiAgMjA3NyA2ODZmIDIwNjkgNzMyMCA3NTczIDY5NmUgNjcyMCA3NzY4CisJMHgxMDUwOiAgNjE3NCAyMDYxIDZlNjQgMjA3NyA2ODY1IDcyNjUgMmMyMCA2MTZlCisJMHgxMDYwOiAgNjQyMCA2OTc0IDIwNzcgNmY3NSA2YzY0IDIwNjcgNjk3NiA2NTIwCisJMHgxMDcwOiAgNDQ2NSA2MjY5IDYxNmUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjBhCisJMHgxMDgwOiAgNmY3NiA2NTcyIDc2NjkgNjU3NyAyMDZmIDY2MjAgNzQ2OCA2NTIwCisJMHgxMDkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc1CisJMHgxMGEwOiAgNzM2MSA2NzY1IDJlMGEgMGEzYyA0ODMyIDNlNDEgNjI2ZiA3NTc0CisJMHgxMGIwOiAgMjA3NCA2ODY5IDczMjAgNzA2MSA2NzY1IDNjMmYgNDgzMiAzZTBhCisJMHgxMGMwOiAgMGEzYyA0OTRkIDQ3MjAgNDE0YyA0OTQ3IDRlM2QgMjI3MiA2OTY3CisJMHgxMGQwOiAgNjg3NCAyMjIwIDQxNGMgNTQzZCAyMjIyIDIwNDggNDU0OSA0NzQ4CisJMHgxMGUwOiAgNTQzZCAyMjMyIDM0MzcgMjIyMCA1NzQ5IDQ0NTQgNDgzZCAyMjMyCisJMHgxMGYwOiAgMzczOCAyMjIwIDUzNTIgNDMzZCAyMjY5IDYzNmYgNmU3MyAyZjZhCisJMHgxMTAwOiAgNjg2NSAzMDM2IDMxMmUgNzA2ZSA2NzIyIDNlMGEgMGEzYyA1MDNlCisJMHgxMTEwOiAgNTQ2OCA2OTczIDIwNjkgNzMyMCA2MTIwIDcwNmMgNjE2MyA2NTY4CisJMHgxMTIwOiAgNmY2YyA2NDY1IDcyMjAgNzA2MSA2NzY1IDIwNjkgNmU3MyA3NDYxCisJMHgxMTMwOiAgNmM2YyA2NTY0IDIwNjIgNzkyMCA3NDY4IDY1MjAgM2M0MSAwYTQ4CisJMHgxMTQwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCisJMHgxMTUwOiAgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3IDJmMjIgM2U0NCA2NTYyCisJMHgxMTYwOiAgNjk2MSA2ZTNjIDJmNDEgM2UwYSA3MjY1IDZjNjUgNjE3MyA2NTIwCisJMHgxMTcwOiAgNmY2NiAyMDc0IDY4NjUgMjA2MSA3MDYxIDYzNjggNjUyMCA1NzY1CisJMHgxMTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1CisJMHgxMTkwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2OTczIDIwNjMgNmY2ZCA3MDc1CisJMHgxMWEwOiAgNzQ2NSA3MjIwIDY4NjEgNzMyMCA2OTZlIDczNzQgNjE2YyA2YzY1CisJMHgxMWIwOiAgNjQyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgMjA0NyA0ZTU1CisJMHgxMWMwOiAgMmY0YyA2OTZlIDc1NzggMjA2ZiA3MDY1IDcyNjEgNzQ2OSA2ZTY3CisJMHgxMWQwOiAgMjA3MyA3OTczIDc0NjUgNmQyYyAwYTYyIDc1NzQgMjA2OSA3NDIwCisJMHgxMWUwOiAgNjg2MSA3MzIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDY4CisJMHgxMWYwOiAgNjk2ZSA2NzIwIDc0NmYgMjA2NCA2ZjIwIDc3NjkgNzQ2OCAyMDc0CisJMHgxMjAwOiAgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSA2NTYzCisJMHgxMjEwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDJlMjAgNTA2YyA2NTYxCisJMHgxMjIwOiAgNzM2NSAyMDY0IDZmMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmCisJMHgxMjMwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDIwNjMgNmY2ZSA3NDYxCisJMHgxMjQwOiAgNjM3NCAyMDc0IDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyCisJMHgxMjUwOiAgNmY2YSA2NTYzIDc0MjAgNjE2MiA2Zjc1IDc0MjAgNjk3NCAyZTNjCisJMHgxMjYwOiAgMmY1MCAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDY2CisJMHgxMjcwOiAgNjk2ZSA2NDIwIDYxMjAgNjI3NSA2NzIwIDY5NmUgMjA3NCA2ODY5CisJMHgxMjgwOiAgNzMyMCA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1CisJMHgxMjkwOiAgMmMyMCA2ZjcyIDIwNjkgNmUyMCA0MTcwIDYxNjMgNjg2NSAyMDY5CisJMHgxMmEwOiAgNzQ3MyA2NTZjIDY2MmMgMGE3MCA2YzY1IDYxNzMgNjUyMCA2NjY5CisJMHgxMmIwOiAgNmM2NSAyMDYxIDIwNjIgNzU2NyAyMDcyIDY1NzAgNmY3MiA3NDIwCisJMHgxMmMwOiAgNmY2ZSAyMDY5IDc0MmUgMjAyMCA0OTZlIDczNzQgNzI3NSA2Mzc0CisJMHgxMmQwOiAgNjk2ZiA2ZTczIDIwNmYgNmUyMCA2NDZmIDY5NmUgNjcyMCA3NDY4CisJMHgxMmUwOiAgNjk3MyAyYzIwIDYxNmUgNjQyMCA3NDY4IDY1MGEgNmM2OSA3Mzc0CisJMHgxMmYwOiAgMjA2ZiA2NjIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0CisJMHgxMzAwOiAgNzAzYSAyZjJmIDYyNzUgNjc3MyAyZTY0IDY1NjIgNjk2MSA2ZTJlCisJMHgxMzEwOiAgNmY3MiA2NzJmIDczNzIgNjMzYSA2MTcwIDYxNjMgNjg2NSAyMjNlCisJMHgxMzIwOiAgNmI2ZSA2Zjc3IDZlMjAgNjI3NSA2NzczIDNjMmYgNDEzZSAyMDZmCisJMHgxMzMwOiAgNjYyMCA3NDY4IDY5NzMgMGE3MCA2MTYzIDZiNjEgNjc2NSAyYzIwCisJMHgxMzQwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwCisJMHgxMzUwOiAgNzQ2OCA2NTIwIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0CisJMHgxMzYwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSA2ZTJlCisJMHgxMzcwOiAgNmY3MiA2NzJmIDQyNzUgNjc3MyAyZjUyIDY1NzAgNmY3MiA3NDY5CisJMHgxMzgwOiAgNmU2NyAyMjNlIDQ0NjUgNjI2OSA2MTZlIDIwNDIgNzU2NyAyMDU0CisJMHgxMzkwOiAgNzI2MSA2MzZiIDY5NmUgNjcyMCA1Mzc5IDczNzQgNjU2ZCAzYzJmCisJMHgxM2EwOiAgNDEzZSAyZTBhIDBhM2MgNTAzZSA1NDY4IDYxNmUgNmI3MyAyMDY2CisJMHgxM2IwOiAgNmY3MiAyMDc1IDczNjkgNmU2NyAyMDc0IDY4NjkgNzMyMCA3MDYxCisJMHgxM2MwOiAgNjM2YiA2MTY3IDY1MmMgMjA2MSA2ZTY0IDIwNjMgNmY2ZSA2NzcyCisJMHgxM2QwOiAgNjE3NCA3NTZjIDYxNzQgNjk2ZiA2ZTczIDIwNjYgNmY3MiAyMDc5CisJMHgxM2UwOiAgNmY3NSA3MjIwIDYzNjggNmY2OSA2MzY1IDIwNmYgNjYwYSA2MTIwCisJMHgxM2YwOiAgNDQ2NSA2MjY5IDYxNmUgMjA3MyA3OTczIDc0NjUgNmQyMSAzYzJmCisJMHgxNDAwOiAgNTAzZSAwYTBhIDNjNDQgNDk1NiAyMDYxIDZjNjkgNjc2ZSAzZDIyCisJMHgxNDEwOiAgNjM2NSA2ZTc0IDY1NzIgMjIzZSAwYTNjIDYxMjAgNjg3MiA2NTY2CisJMHgxNDIwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyCisJMHgxNDMwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDBhM2MgNDk0ZCA0NzIwCisJMHgxNDQwOiAgNjE2YyA2OTY3IDZlM2QgMjI2ZCA2OTY0IDY0NmMgNjUyMiAyMDY4CisJMHgxNDUwOiAgNjU2OSA2NzY4IDc0M2QgMjIzMyAzMDIyIDIwNzcgNjk2NCA3NDY4CisJMHgxNDYwOiAgM2QyMiAzMjM1IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiA2ZTczCisJMHgxNDcwOiAgMmY2NCA2NTYyIDY5NjEgNmUyZiA2ZjcwIDY1NmUgNmM2ZiA2NzZmCisJMHgxNDgwOiAgMmQzMiAzNTJlIDZhNzAgNjcyMiAyMDYxIDZjNzQgM2QyMiA0NDY1CisJMHgxNDkwOiAgNjI2OSA2MTZlIDIyM2UgMGEzYyAyZjYxIDNlMGEgM2M2MSAyMDY4CisJMHgxNGEwOiAgNzI2NSA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCisJMHgxNGIwOiAgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2UwYSAzYzQ5CisJMHgxNGMwOiAgNGQ0NyAyMDYxIDZjNjkgNjc2ZSAzZDIyIDZkNjkgNjQ2NCA2YzY1CisJMHgxNGQwOiAgMjIyMCA2ODY1IDY5NjcgNjg3NCAzZDIyIDMzMzIgMjIyMCA3NzY5CisJMHgxNGUwOiAgNjQ3NCA2ODNkIDIyMzIgMzUzOSAyMjIwIDczNzIgNjMzZCAyMjY5CisJMHgxNGYwOiAgNjM2ZiA2ZTczIDJmNjEgNzA2MSA2MzY4IDY1NWYgNzA2MiAyZTcwCisJMHgxNTAwOiAgNmU2NyAyMjIwIDYxNmMgNzQzZCAyMjQxIDcwNjEgNjM2OCA2NTIyCisJMHgxNTEwOiAgM2UwYSAzYzJmIDYxM2UgMGEzYyAyZjQ0IDQ5NTYgM2UwYSAwYTNjCisJMHgxNTIwOiAgMjEyZCAyZDBhIDIwMjAgNTQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwCisJMHgxNTMwOiAgNzc2MSA3MzIwIDY5NmUgNjk3NCA2OTYxIDZjNmMgNzkyMCA2MzcyCisJMHgxNTQwOiAgNjU2MSA3NDY1IDY0MjAgNjI3OSAyMDRhIDZmNjggNmU2OSA2NTIwCisJMHgxNTUwOiAgNDk2ZSA2NzcyIDYxNmQgMjAyOCA2ODc0IDc0NzAgM2EyZiAyZjZlCisJMHgxNTYwOiAgNjU3NCA2NzZmIDY0MmUgNmU2NSA3NDJmIDI5MGEgMjAyMCA0OTc0CisJMHgxNTcwOiAgMjA3NyA2MTczIDIwNmMgNjE3NCA2NTcyIDIwNjUgNjQ2OSA3NDY1CisJMHgxNTgwOiAgNjQyMCA2Mjc5IDIwNGQgNjE3NCA3NDY4IDY1NzcgMjA1NyA2OTZjCisJMHgxNTkwOiAgNjM2ZiA3ODIwIDYxNmUgNjQyMCA0YTZmIDczNjkgNzAyMCA1MjZmCisJMHgxNWEwOiAgNjQ2OSA2ZTJlIDBhMjAgMjA0YyA2MTczIDc0MjAgNmQ2ZiA2NDY5CisJMHgxNWIwOiAgNjY2OSA2NTY0IDNhMjAgMjQ0NCA2MTc0IDY1M2EgMjAzMiAzMDMwCisJMHgxNWMwOiAgMzQyZiAzMDM2IDJmMzIgMzAyMCAzMTM1IDNhMzMgMzMzYSAzNTM3CisJMHgxNWQwOiAgMjAyNCAyZTBhIDIwMjAgMmQyZCAzZTBhIDBhM2MgMmY0MiA0ZjQ0CisJMHgxNWUwOiAgNTkzZSAwYTNjIDJmNDggNTQ0ZCA0YzNlIDBhCisyMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOQorCTB4MDAyMDogIDgwMTAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOQorCTB4MDAzMDogIDRkZGMgOTIxOQorMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOQorCTB4MDAyMDogIDgwMTEgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMQorCTB4MDAzMDogIDRkZGMgOTIxOQorMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YQorCTB4MDAyMDogIDgwMTEgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMworCTB4MDAzMDogIDRkZGMgOTcyMQorMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEKKwkweDAwMjA6ICA4MDEwIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMKKwkweDAwMzA6ICA0ZGRjIDk3MjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LXgub3V0IGIvdGVzdHMvcHJpbnQteC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyNWJmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ByaW50LXgub3V0CkBAIC0wLDAgKzEsNDA5IEBACisyMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDQ1MDAgMDAzYyAxYjY4IDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdlIDAwMDAgMDAwMAorCTB4MDAyMDogIGEwMDIgN2ZmZiAxNDIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYQorCTB4MDAzMDogIDRkZGMgOTIxNiAwMDAwIDAwMDAgMDEwMyAwMzAyCisyMzo1NzozNS45MzgxMjIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBTIDkzMDc3ODYwOTo5MzA3Nzg2MDkoMCkgYWNrIDkyODU0OTI0NyB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MCxub3Asd3NjYWxlIDI+CisJMHgwMDAwOiAgNDUwMCAwMDNjIDAwMDAgNDAwMCA0MDA2IDNjYmEgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjEgMzc1OCA4OTdmCisJMHgwMDIwOiAgYTAxMiA3ZmZmIDZlYjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhCisJMHgwMDMwOiAgNGRkYyA5MjE2IDRkZGMgOTIxNiAwMTAzIDAzMDIKKzIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI2YSA0MDAwIDQwMDYgMjE1OCA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIKKwkweDAwMjA6ICA4MDEwIDIwMDAgMzdkMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTYKKwkweDAwMzA6ICA0ZGRjIDkyMTYKKzIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDQ1MDAgMDBmZSAxYjZjIDQwMDAgNDAwNiAyMDhjIDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMgorCTB4MDAyMDogIDgwMTggMjAwMCBmZWYyIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNworCTB4MDAzMDogIDRkZGMgOTIxNiA0NzQ1IDU0MjAgMmYyMCA0ODU0IDU0NTAgMmYzMQorCTB4MDA0MDogIDJlMzEgMGQwYSA0ODZmIDczNzQgM2EyMCA2YzZmIDYzNjEgNmM2OAorCTB4MDA1MDogIDZmNzMgNzQwZCAwYTU1IDczNjUgNzIyZCA0MTY3IDY1NmUgNzQzYQorCTB4MDA2MDogIDIwNDUgNGM2OSA2ZTZiIDczMmYgMzAyZSAzMTMwIDJlMzQgMmQzNworCTB4MDA3MDogIDJkNjQgNjU2MiA2OTYxIDZlMjAgMjg3NCA2NTc4IDc0NmQgNmY2NAorCTB4MDA4MDogIDY1M2IgMjA0YyA2OTZlIDc1NzggMjAzMiAyZTM2IDJlMzEgMzEyZAorCTB4MDA5MDogIDMxMmQgMzYzOCAzNjJkIDczNmQgNzAyMCA2OTM2IDM4MzYgM2IyMAorCTB4MDBhMDogIDMxMzMgMzI3OCAzNTM2IDJkMzIgMjkwZCAwYTQxIDYzNjMgNjU3MAorCTB4MDBiMDogIDc0M2EgMjAyYSAyZjJhIDBkMGEgNDE2MyA2MzY1IDcwNzQgMmQ0NQorCTB4MDBjMDogIDZlNjMgNmY2NCA2OTZlIDY3M2EgMjA2NyA3YTY5IDcwMGQgMGE0MQorCTB4MDBkMDogIDYzNjMgNjU3MCA3NDJkIDRjNjEgNmU2NyA3NTYxIDY3NjUgM2EyMAorCTB4MDBlMDogIDY1NmUgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5IDZmNmUgM2EyMAorCTB4MDBmMDogIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhIDBkMGEKKzIzOjU3OjM1Ljk0MDQ3NCBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IC4gYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MiAxMzA2MzAwOTUxPgorCTB4MDAwMDogIDQ1MDAgMDAzNCAxZmU0IDQwMDAgNDAwNiAxY2RlIDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OQorCTB4MDAyMDogIDgwMTAgMjAwMCAzNzAzIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOAorCTB4MDAzMDogIDRkZGMgOTIxNworMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgorCTB4MDAwMDogIDQ1MDAgMTVlYiAxZmU2IDQwMDAgNDAwNiAwNzI1IDdmMDAgMDAwMQorCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OQorCTB4MDAyMDogIDgwMTggMjAwMCAxM2UwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOQorCTB4MDAzMDogIDRkZGMgOTIxNyA0ODU0IDU0NTAgMmYzMSAyZTMxIDIwMzIgMzAzMAorCTB4MDA0MDogIDIwNGYgNGIwZCAwYTQ0IDYxNzQgNjUzYSAyMDU3IDY1NjQgMmMyMAorCTB4MDA1MDogIDMwMzYgMjA0YSA3NTZjIDIwMzIgMzAzMCAzNTIwIDMwMzMgM2EzNQorCTB4MDA2MDogIDM3M2EgMzMzNSAyMDQ3IDRkNTQgMGQwYSA1MzY1IDcyNzYgNjU3MgorCTB4MDA3MDogIDNhMjAgNDE3MCA2MTYzIDY4NjUgMmYzMSAyZTMzIDJlMzMgMzMwZAorCTB4MDA4MDogIDBhNGMgNjE3MyA3NDJkIDRkNmYgNjQ2OSA2NjY5IDY1NjQgM2EyMAorCTB4MDA5MDogIDUzNzUgNmUyYyAyMDMxIDM1MjAgNDE3NSA2NzIwIDMyMzAgMzAzNAorCTB4MDBhMDogIDIwMzAgMzAzYSAzNDMzIDNhMzQgMzEyMCA0NzRkIDU0MGQgMGE0NQorCTB4MDBiMDogIDU0NjEgNjczYSAyMDIyIDM2NjUgMzgzMCA2NjMwIDJkMzEgMzQzOAorCTB4MDBjMDogIDYxMmQgMzQzMSAzMTY1IDYyMzEgNjI2NCAyMjBkIDBhNDEgNjM2MworCTB4MDBkMDogIDY1NzAgNzQyZCA1MjYxIDZlNjcgNjU3MyAzYTIwIDYyNzkgNzQ2NQorCTB4MDBlMDogIDczMGQgMGE0MyA2ZjZlIDc0NjUgNmU3NCAyZDRjIDY1NmUgNjc3NAorCTB4MDBmMDogIDY4M2EgMjAzNSAzMjM1IDM4MGQgMGE0YiA2NTY1IDcwMmQgNDE2YworCTB4MDEwMDogIDY5NzYgNjUzYSAyMDc0IDY5NmQgNjU2ZiA3NTc0IDNkMzEgMzUyYworCTB4MDExMDogIDIwNmQgNjE3OCAzZDMxIDMwMzAgMGQwYSA0MzZmIDZlNmUgNjU2MworCTB4MDEyMDogIDc0NjkgNmY2ZSAzYTIwIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NQorCTB4MDEzMDogIDBkMGEgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgM2EyMAorCTB4MDE0MDogIDc0NjUgNzg3NCAyZjY4IDc0NmQgNmMzYiAyMDYzIDY4NjEgNzI3MworCTB4MDE1MDogIDY1NzQgM2Q2OSA3MzZmIDJkMzggMzgzNSAzOTJkIDMxMGQgMGEwZAorCTB4MDE2MDogIDBhM2MgMjE0NCA0ZjQzIDU0NTkgNTA0NSAyMDQ4IDU0NGQgNGMyMAorCTB4MDE3MDogIDUwNTUgNDI0YyA0OTQzIDIwMjIgMmQyZiAyZjU3IDMzNDMgMmYyZgorCTB4MDE4MDogIDQ0NTQgNDQyMCA0ODU0IDRkNGMgMjAzNCAyZTMwIDMxMjAgNTQ3MgorCTB4MDE5MDogIDYxNmUgNzM2OSA3NDY5IDZmNmUgNjE2YyAyZjJmIDQ1NGUgMjIzZQorCTB4MDFhMDogIDBhM2MgNDg1NCA0ZDRjIDNlMGEgM2M0OCA0NTQxIDQ0M2UgMGEyMAorCTB4MDFiMDogIDIwMjAgM2M0ZCA0NTU0IDQxMjAgNDg1NCA1NDUwIDJkNDUgNTE1NQorCTB4MDFjMDogIDQ5NTYgM2QyMiA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NQorCTB4MDFkMDogIDIyMjAgNDM0ZiA0ZTU0IDQ1NGUgNTQzZCAyMjc0IDY1NzggNzQyZgorCTB4MDFlMDogIDY4NzQgNmQ2YyAzYjIwIDYzNjggNjE3MiA3MzY1IDc0M2QgNjk3MworCTB4MDFmMDogIDZmMmQgMzgzOCAzNTM5IDJkMzEgMjIzZSAwYTIwIDIwMjAgM2M0ZAorCTB4MDIwMDogIDQ1NTQgNDEyMCA0ZTQxIDRkNDUgM2QyMiA0NDY1IDczNjMgNzI2OQorCTB4MDIxMDogIDcwNzQgNjk2ZiA2ZTIyIDIwNDMgNGY0ZSA1NDQ1IDRlNTQgM2QyMgorCTB4MDIyMDogIDU0NjggNjUyMCA2OTZlIDY5NzQgNjk2MSA2YzIwIDY5NmUgNzM3NAorCTB4MDIzMDogIDYxNmMgNmM2MSA3NDY5IDZmNmUgMjA2ZiA2NjIwIDQ0NjUgNjI2OQorCTB4MDI0MDogIDYxNmUgMjA2MSA3MDYxIDYzNjggNjUyZSAyMjNlIDBhMjAgMjAyMAorCTB4MDI1MDogIDNjNTQgNDk1NCA0YzQ1IDNlNTAgNmM2MSA2MzY1IDY4NmYgNmM2NAorCTB4MDI2MDogIDY1NzIgMjA3MCA2MTY3IDY1M2MgMmY1NCA0OTU0IDRjNDUgM2UwYQorCTB4MDI3MDogIDNjMmYgNDg0NSA0MTQ0IDNlMGEgM2M0MiA0ZjQ0IDU5MjAgNTQ0NQorCTB4MDI4MDogIDU4NTQgM2QyMiAyMzMwIDMwMzAgMzAzMCAzMDIyIDIwNDIgNDc0MworCTB4MDI5MDogIDRmNGMgNGY1MiAzZDIyIDIzNDYgNDY0NiA0NjQ2IDQ2MjIgMjA0YworCTB4MDJhMDogIDQ5NGUgNGIzZCAyMjIzIDMwMzAgMzAzMCA0NTQ2IDIyMjAgNTY0YworCTB4MDJiMDogIDQ5NGUgNGIzZCAyMjIzIDM1MzUgMzEzOCAzODQxIDIyMjAgNDE0YworCTB4MDJjMDogIDQ5NGUgNGIzZCAyMjIzIDQ2NDYgMzAzMCAzMDMwIDIyM2UgMGEwYQorCTB4MDJkMDogIDNjNDggMzEzZSA1MDZjIDYxNjMgNjU2OCA2ZjZjIDY0NjUgNzIyMAorCTB4MDJlMDogIDcwNjEgNjc2NSAzYzJmIDQ4MzEgM2UwYSAzYzQ4IDMyM2UgNDk2NgorCTB4MDJmMDogIDIwNzkgNmY3NSAyMDYxIDcyNjUgMjA2YSA3NTczIDc0MjAgNjI3MgorCTB4MDMwMDogIDZmNzcgNzM2OSA2ZTY3IDIwNzQgNjg2NSAyMDc3IDY1NjIgM2MyZgorCTB4MDMxMDogIDY4MzIgM2UwYSAwYTNjIDUwM2UgNTQ2OCA2NTIwIDZmNzcgNmU2NQorCTB4MDMyMDogIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA3NzY1IDYyMjAgNzM2OQorCTB4MDMzMDogIDc0NjUgMjA2OCA2MTczIDIwNmUgNmY3NCAyMDcwIDc1NzQgMjA3NQorCTB4MDM0MDogIDcwMjAgNjE2ZSA3OTIwIDc3NjUgNjIyMCA3MDYxIDY3NjUgNzMyMAorCTB4MDM1MDogIDc5NjUgNzQyZSAwYTUwIDZjNjUgNjE3MyA2NTIwIDYzNmYgNmQ2NQorCTB4MDM2MDogIDIwNjIgNjE2MyA2YjIwIDZjNjEgNzQ2NSA3MjJlIDNjMmYgNTAzZQorCTB4MDM3MDogIDBhMGEgM2M1MCAzZTNjIDUzNGQgNDE0YyA0YzNlIDNjNDMgNDk1NAorCTB4MDM4MDogIDQ1M2UgNGQ2ZiA3NjY1IDIwNjEgNmM2ZiA2ZTY3IDJjMjAgNmU2ZgorCTB4MDM5MDogIDc0NjggNjk2ZSA2NzIwIDc0NmYgMjA3MyA2NTY1IDIwNjggNjU3MgorCTB4MDNhMDogIDY1MmUgMmUyZSAzYzJmIDQzNDkgNTQ0NSAzZTIwIDNhMmQgMjkzYworCTB4MDNiMDogIDJmNTMgNGQ0MSA0YzRjIDNlM2MgMmY1MCAzZTBhIDBhM2MgNDgzMgorCTB4MDNjMDogIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwIDc0NzIgNzk2OQorCTB4MDNkMDogIDZlNjcgMjA3NCA2ZjIwIDZjNmYgNjM2MSA3NDY1IDIwNzQgNjg2NQorCTB4MDNlMDogIDIwNjEgNjQ2ZCA2OTZlIDY5NzMgNzQ3MiA2MTc0IDZmNzIgMjA2ZgorCTB4MDNmMDogIDY2MjAgNzQ2OCA2OTczIDIwNmQgNjE2MyA2ODY5IDZlNjUgM2MyZgorCTB4MDQwMDogIDQ4MzIgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA3NworCTB4MDQxMDogIDYxNmUgNzQyMCA3NDZmIDIwNzIgNjU3MCA2ZjcyIDc0MjAgNzM2ZgorCTB4MDQyMDogIDZkNjUgNzQ2OCA2OTZlIDY3MjAgNjE2MiA2Zjc1IDc0MjAgNzQ2OAorCTB4MDQzMDogIDY5NzMgMjA2OCA2ZjczIDc0MjcgNzMyMCA2MjY1IDY4NjEgNzY2OQorCTB4MDQ0MDogIDZmNzIgMmMyMCA3MDZjIDY1NjEgNzM2NSAwYTYzIDZmNmUgNzQ2MQorCTB4MDQ1MDogIDYzNzQgMjA3NCA2ODY1IDIwNDkgNmU3NCA2NTcyIDZlNjUgNzQyMAorCTB4MDQ2MDogIDUzNjUgNzI3NiA2OTYzIDY1MjAgNTA3MiA2Zjc2IDY5NjQgNjU3MgorCTB4MDQ3MDogIDIwMjggNDk1MyA1MDI5IDIwNjkgNmU3NiA2ZjZjIDc2NjUgNjQyMAorCTB4MDQ4MDogIDY0NjkgNzI2NSA2Mzc0IDZjNzkgMmUzYyAyZjUwIDNlMGEgMGEzYworCTB4MDQ5MDogIDUwM2UgNTM2NSA2NTIwIDc0NjggNjUyMCAzYzQxIDIwNjggNzI2NQorCTB4MDRhMDogIDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE2MgorCTB4MDRiMDogIDc1NzMgNjUyZSA2ZTY1IDc0MmYgMjIzZSA0ZTY1IDc0NzcgNmY3MgorCTB4MDRjMDogIDZiMjAgNDE2MiA3NTczIDY1MGEgNDM2YyA2NTYxIDcyNjkgNmU2NworCTB4MDRkMDogIDY4NmYgNzU3MyA2NTNjIDJmNDEgM2UyMCA2NjZmIDcyMjAgNjg2ZgorCTB4MDRlMDogIDc3MjAgNzQ2ZiAyMDY0IDZmMjAgNzQ2OCA2OTczIDJlM2MgMmY1MAorCTB4MDRmMDogIDNlMGEgMGEzYyA0ODMyIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MgorCTB4MDUwMDogIDY1MjAgNzQ2OCA2NTIwIDYxNjQgNmQ2OSA2ZTY5IDczNzQgNzI2MQorCTB4MDUxMDogIDc0NmYgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDZkNjEgNjM2OAorCTB4MDUyMDogIDY5NmUgNjUzYyAyZjQ4IDMyM2UgMGEwYSAzYzUwIDNlNTQgNjg2NQorCTB4MDUzMDogIDIwNjkgNmU2OSA3NDY5IDYxNmMgMjA2OSA2ZTczIDc0NjEgNmM2YworCTB4MDU0MDogIDYxNzQgNjk2ZiA2ZTIwIDZmNjYgMjAzYyA0MTIwIDY4NzIgNjU2NgorCTB4MDU1MDogIDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MgorCTB4MDU2MDogIDY5NjEgNmUyZSA2ZjcyIDY3MmYgMjIzZSA0NDY1IDYyNjkgNjE2ZQorCTB4MDU3MDogIDI3NzMgMGE2MSA3MDYxIDYzNjggNjUzYyAyZjQxIDNlMjAgNzc2NQorCTB4MDU4MDogIDYyMjAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NQorCTB4MDU5MDogIDIwNzcgNjE3MyAyMDczIDc1NjMgNjM2NSA3MzczIDY2NzUgNmMyZQorCTB4MDVhMDogIDNjMmYgNTAzZSAwYTBhIDNjNTAgM2UzYyA1MzU0IDUyNGYgNGU0NworCTB4MDViMDogIDNlNTkgNmY3NSAyMDczIDY4NmYgNzU2YyA2NDIwIDcyNjUgNzA2YworCTB4MDVjMDogIDYxNjMgNjUyMCA3NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2OQorCTB4MDVkMDogIDc0NjggMjA3OSA2Zjc1IDcyMjAgNmY3NyA2ZTIwIDc3NjUgNjIyMAorCTB4MDVlMDogIDcwNjEgNjc2NSA3MzIwIDYxNzMgMGE3MyA2ZjZmIDZlMjAgNjE3MworCTB4MDVmMDogIDIwNzAgNmY3MyA3MzY5IDYyNmMgNjUyZSAzYzJmIDUzNTQgNTI0ZgorCTB4MDYwMDogIDRlNDcgM2UzYyAyZjUwIDNlMGEgMGEzYyA1MDNlIDU1NmUgNmM2NQorCTB4MDYxMDogIDczNzMgMjA3OSA2Zjc1IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2OQorCTB4MDYyMDogIDc0NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjYxIDc0NjkgNmY2ZQorCTB4MDYzMDogIDJjMjAgNzk2ZiA3NTcyIDIwNmUgNjU3NyAyMDczIDY1NzIgNzY2NQorCTB4MDY0MDogIDcyMjAgNjk3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjUgNjQyMAorCTB4MDY1MDogIDYxNzMgMjA2NiA2ZjZjIDZjNmYgNzc3MyAzYTBhIDNjNTUgNGMzZQorCTB4MDY2MDogIDBhM2MgNGM0OSAzZTBhIDQzNmYgNmU2NiA2OTY3IDc1NzIgNjE3NAorCTB4MDY3MDogIDY5NmYgNmUyMCA2NjY5IDZjNjUgNzMyMCA2MzYxIDZlMjAgNjI2NQorCTB4MDY4MDogIDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY2NQorCTB4MDY5MDogIDc0NjMgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYworCTB4MDZhMDogIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYworCTB4MDZiMDogIDU0NTQgM2U0NCA2ZjYzIDc1NmQgNjU2ZSA3NDUyIDZmNmYgNzQzYworCTB4MDZjMDogIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwIDY5NzMgMjA3NAorCTB4MDZkMDogIDY4NjUgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNzUgNmU2NAorCTB4MDZlMDogIDY1NzIgMjA3NyA2ODY5IDYzNjggMjA2MSA2YzZjIDIwNzkgNmY3NQorCTB4MDZmMDogIDcyMGEgNDg1NCA0ZDRjIDIwNjYgNjk2YyA2NTczIDIwNzMgNjg2ZgorCTB4MDcwMDogIDc1NmMgNjQyMCA2NTc4IDY5NzMgNzQyYyAyMDY5IDczMjAgNzM2NQorCTB4MDcxMDogIDc0MjAgNzQ2ZiAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NworCTB4MDcyMDogIDc3M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YworCTB4MDczMDogIDQ5M2UgMGE0MyA0NzQ5IDIwNzMgNjM3MiA2OTcwIDc0NzMgMjA2MQorCTB4MDc0MDogIDcyNjUgMjA2YyA2ZjZmIDZiNjUgNjQyMCA2NjZmIDcyMjAgNjk2ZQorCTB4MDc1MDogIDIwM2MgNTQ1NCAzZTJmIDc1NzMgNzIyZiA2YzY5IDYyMmYgNjM2NworCTB4MDc2MDogIDY5MmQgNjI2OSA2ZTNjIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MworCTB4MDc3MDogIDY4MjAgNjk3MyAyMDc3IDY4NjUgNzI2NSAwYTQ0IDY1NjIgNjk2MQorCTB4MDc4MDogIDZlMjAgNzA2MSA2MzZiIDYxNjcgNjU3MyAyMDc3IDY5NmMgNmMyMAorCTB4MDc5MDogIDcwNmMgNjE2MyA2NTIwIDc0NjggNjU2OSA3MjIwIDczNjMgNzI2OQorCTB4MDdhMDogIDcwNzQgNzMyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYQorCTB4MDdiMDogIDRjNmYgNjcyMCA2NjY5IDZjNjUgNzMyMCA2MTcyIDY1MjAgNzA2YworCTB4MDdjMDogIDYxNjMgNjU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNzYgNjE3MgorCTB4MDdkMDogIDJmNmMgNmY2NyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZQorCTB4MDdlMDogIDJjMjAgNjE2ZSA2NDIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNzI2ZgorCTB4MDdmMDogIDc0NjEgNzQ2NSA2NDBhIDc3NjUgNjU2YiA2Yzc5IDJlMjAgMjA1NAorCTB4MDgwMDogIDY4NjUgMjA2NiA3MjY1IDcxNzUgNjU2ZSA2Mzc5IDIwNmYgNjYyMAorCTB4MDgxMDogIDcyNmYgNzQ2MSA3NDY5IDZmNmUgMjA2MyA2MTZlIDIwNjIgNjUyMAorCTB4MDgyMDogIDY1NjEgNzM2OSA2Yzc5IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2MgorCTB4MDgzMDogIDc5MjAgNjU2NCA2OTc0IDY5NmUgNjcwYSAzYzU0IDU0M2UgMmY2NQorCTB4MDg0MDogIDc0NjMgMmY2YyA2ZjY3IDcyNmYgNzQ2MSA3NDY1IDJlNjQgMmY2MQorCTB4MDg1MDogIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZQorCTB4MDg2MDogIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDY0IDY1NjYgNjE3NQorCTB4MDg3MDogIDZjNzQgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNjkgNmU2NAorCTB4MDg4MDogIDY1NzggMjA2OSA3MzIwIDNjNTQgNTQzZSA2OTZlIDY0NjUgNzgyZQorCTB4MDg5MDogIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UyYyAyMDZkIDY1NjEgNmU2OQorCTB4MDhhMDogIDZlNjcgMjA3NCA2ODYxIDc0MjAgNzI2NSA3MTc1IDY1NzMgNzQ3MworCTB4MDhiMDogIDBhNjYgNmY3MiAyMDYxIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OQorCTB4MDhjMDogIDIwM2MgNTQ1NCAzZTJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgM2MyZgorCTB4MDhkMDogIDU0NTQgM2UyMCA3NzY5IDZjNmMgMjA2NyA2OTc2IDY1MjAgNzQ2OAorCTB4MDhlMDogIDY1MjAgNjM2ZiA2ZTc0IDY1NmUgNzQ3MyAyMDZmIDY2MjAgNzQ2OAorCTB4MDhmMDogIDY1MjAgNjY2OSA2YzY1IDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZgorCTB4MDkwMDogIDc3NzcgNzcyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDY5NmUgNjQ2NQorCTB4MDkxMDogIDc4MmUgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTBhIDY5NjYgMjA2OQorCTB4MDkyMDogIDc0MjAgNjU3OCA2OTczIDc0NzMgMjAyOCA2MTczIDczNzUgNmQ2OQorCTB4MDkzMDogIDZlNjcgMjA3NCA2ODYxIDc0MjAgM2M1NCA1NDNlIDJmNzYgNjE3MgorCTB4MDk0MDogIDJmNzcgNzc3NyAzYzJmIDU0NTQgM2UyMCA2OTczIDIwNzkgNmY3NQorCTB4MDk1MDogIDcyMjAgM2M1NCA1NDNlIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNTI2ZgorCTB4MDk2MDogIDZmNzQgM2MyZiA1NDU0IDNlMjkgMmUzYyAyZjRjIDQ5M2UgMGEwYQorCTB4MDk3MDogIDNjNGMgNDkzZSAwYTU1IDczNjUgNzIyMCA2NDY5IDcyNjUgNjM3NAorCTB4MDk4MDogIDZmNzIgNjk2NSA3MzIwIDYxNzIgNjUyMCA2NTZlIDYxNjIgNmM2NQorCTB4MDk5MDogIDY0MmMgMjA2MSA2ZTY0IDIwNzUgNzM2NSA3MjIwIDY0NmYgNjM3NQorCTB4MDlhMDogIDZkNjUgNmU3NCA3MzIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNmM2ZgorCTB4MDliMDogIDZmNmIgNjU2NCAyMDY2IDZmNzIgMGE2OSA2ZTIwIDc0NjggNjUyMAorCTB4MDljMDogIDNjNTQgNTQzZSA3MDc1IDYyNmMgNjk2MyA1ZjY4IDc0NmQgNmMzYworCTB4MDlkMDogIDJmNTQgNTQzZSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2ZgorCTB4MDllMDogIDY2MjAgNzQ2OCA2NTIwIDc1NzMgNjU3MiA3MzI3IDIwNjggNmY2ZAorCTB4MDlmMDogIDY1NzMgMmUyMCAyMDU0IDY4NjUgNzM2NSAyMDY0IDY5NzIgNzMwYQorCTB4MGEwMDogIDczNjggNmY3NSA2YzY0IDIwNjIgNjUyMCA3NTZlIDY0NjUgNzIyMAorCTB4MGExMDogIDNjNTQgNTQzZSAyZjY4IDZmNmQgNjUzYyAyZjU0IDU0M2UgMmMyMAorCTB4MGEyMDogIDYxNmUgNjQyMCA3NTczIDY1NzIgNzMyMCA3NzY5IDZjNmMgMjA2ZQorCTB4MGEzMDogIDZmNzQgMjA2MiA2NTIwIDYxNjIgNmM2NSAyMDc0IDZmMjAgNzM3OQorCTB4MGE0MDogIDZkNmMgNjk2ZSA2YjBhIDc0NmYgMjA2NiA2OTZjIDY1NzMgMjA3NAorCTB4MGE1MDogIDY4NjUgNzkyMCA2NDZmIDZlMjcgNzQyMCA2Zjc3IDZlMmUgM2MyZgorCTB4MGE2MDogIDRjNDkgM2UwYSAwYTNjIDJmNTUgNGMzZSAwYTQxIDZjNmMgMjA3NAorCTB4MGE3MDogIDY4NjUgMjA3MyA3NDYxIDZlNjQgNjE3MiA2NDIwIDYxNzAgNjE2MworCTB4MGE4MDogIDY4NjUgMjA2ZCA2ZjY0IDc1NmMgNjU3MyAyMDYxIDcyNjUgMjA2MQorCTB4MGE5MDogIDc2NjEgNjk2YyA2MTYyIDZjNjUgMjA3NyA2OTc0IDY4MjAgNzQ2OAorCTB4MGFhMDogIDY5NzMgMjA3MiA2NTZjIDY1NjEgNzM2NSAyMDYxIDZlNjQgMjA2MQorCTB4MGFiMDogIDcyNjUgMGE2ZSA2Zjc3IDIwNmQgNjE2ZSA2MTY3IDY1NjQgMjA3NworCTB4MGFjMDogIDY5NzQgNjgyMCA2NDY1IDYyNjMgNmY2ZSA2NjJlIDIwMjAgNTQ3OQorCTB4MGFkMDogIDcwNjUgMjAzYyA1NDU0IDNlNjQgNzA2YiA2NzJkIDcyNjUgNjM2ZgorCTB4MGFlMDogIDZlNjYgNjk2NyA3NTcyIDY1MjAgNjE3MCA2MTYzIDY4NjUgM2MyZgorCTB4MGFmMDogIDU0NTQgM2UyMCA3NDZmIDBhNzMgNjU2YyA2NTYzIDc0MjAgNzc2OAorCTB4MGIwMDogIDY5NjMgNjgyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwIDc5NmYgNzUyMAorCTB4MGIxMDogIDc3NjEgNmU3NCAyMDY1IDZlNjEgNjI2YyA2NTY0IDJlMjAgMjA0ZAorCTB4MGIyMDogIDYxNmUgNzkyMCA2Zjc0IDY4NjUgNzIyMCA2ZDZmIDY0NzUgNmM2NQorCTB4MGIzMDogIDczMjAgNjE3MiA2NTIwIDYxNzYgNjE2OSA2YzYxIDYyNmMgNjUwYQorCTB4MGI0MDogIDc0NjggNzI2ZiA3NTY3IDY4MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OQorCTB4MGI1MDogIDYxNmUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDczIDc5NzMgNzQ2NQorCTB4MGI2MDogIDZkMjAgNzc2OSA3NDY4IDIwNzQgNjg2NSAyMDZlIDYxNmQgNjU3MworCTB4MGI3MDogIDIwM2MgNTQ1NCAzZTZjIDY5NjIgNjE3MCA2MTYzIDY4NjUgMmQ2ZAorCTB4MGI4MDogIDZmNjQgMmQyYSAzYzJmIDU0NTQgM2UyZSAwYTQ5IDY2MjAgNzk2ZgorCTB4MGI5MDogIDc1MjAgNmU2NSA2NTY0IDIwNzQgNmYyMCA2MzZmIDZkNzAgNjk2YworCTB4MGJhMDogIDY1MjAgNjEyMCA2ZDZmIDY0NzUgNmM2NSAyMDc5IDZmNzUgNzI3MworCTB4MGJiMDogIDY1NmMgNjYyYyAyMDc5IDZmNzUgMjA3NyA2OTZjIDZjMjAgNmU2NQorCTB4MGJjMDogIDY1NjQgMjA3NCA2ZjIwIDY5NmUgNzM3NCA2MTZjIDZjMjAgNzQ2OAorCTB4MGJkMDogIDY1MGEgM2M1NCA1NDNlIDYxNzAgNjE2MyA2ODY1IDJkNjQgNjU3NgorCTB4MGJlMDogIDNjMmYgNTQ1NCAzZTIwIDcwNjEgNjM2YiA2MTY3IDY1MmUgMGEwYQorCTB4MGJmMDogIDNjNTAgM2U0ZCA2ZjcyIDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NAorCTB4MGMwMDogIDYxNzQgNjk2ZiA2ZTIwIDZmNmUgMjA0MSA3MDYxIDYzNjggNjUyMAorCTB4MGMxMDogIDYzNjEgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNmYgNmUzYQorCTB4MGMyMDogIDBhM2MgNTU0YyAzZTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYworCTB4MGMzMDogIDQxMjAgNDg1MiA0NTQ2IDNkMjIgMmY2NCA2ZjYzIDJmNjEgNzA2MQorCTB4MGM0MDogIDYzNjggNjUyZCA2NDZmIDYzMmYgNmQ2MSA2ZTc1IDYxNmMgMmYyMgorCTB4MGM1MDogIDNlNDEgNzA2MSA2MzY4IDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NAorCTB4MGM2MDogIDYxNzQgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3Mzc0IDZmNzIgNjU2NAorCTB4MGM3MDogIDIwNmYgNmUyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyZQorCTB4MGM4MDogIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMAorCTB4MGM5MDogIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZgorCTB4MGNhMDogIDc3NzcgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMgorCTB4MGNiMDogIDNlNDEgNzA2MSA2MzY4IDY1MjAgNTA3MiA2ZjZhIDY1NjMgNzQzYworCTB4MGNjMDogIDJmNDEgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZgorCTB4MGNkMDogIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MQorCTB4MGNlMDogIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NworCTB4MGNmMDogIDc3MmUgNjE3MCA2MTYzIDY4NjUgMmQ3MyA3MzZjIDJlNmYgNzI2NworCTB4MGQwMDogIDJmMjIgM2U0MSA3MDYxIDYzNjggNjUyZCA1MzUzIDRjM2MgMmY0MQorCTB4MGQxMDogIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OQorCTB4MGQyMDogIDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OAorCTB4MGQzMDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDcwNjUgNzI2YworCTB4MGQ0MDogIDJlNjEgNzA2MSA2MzY4IDY1MmUgNmY3MiA2NzJmIDIyM2UgNmQ2ZgorCTB4MGQ1MDogIDY0MjAgNzA2NSA3MjZjIDNjMmYgNDEzZSAyMDY4IDZmNmQgNjUyMAorCTB4MGQ2MDogIDczNjkgNzQ2NSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZQorCTB4MGQ3MDogIDBhNTQgNjg2NSAyMDNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NAorCTB4MGQ4MDogIDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2MSA3MDYxIDYzNjggNjU3NworCTB4MGQ5MDogIDY1NjUgNmIyZSA2MzZmIDZkMmYgMjIzZSA0MTcwIDYxNjMgNjg2NQorCTB4MGRhMDogIDU3NjUgNjU2YiAzYzJmIDQxM2UgMjA2ZSA2NTc3IDczNmMgNjU3NAorCTB4MGRiMDogIDc0NjUgNzIyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYQorCTB4MGRjMDogIDU0NjggNjUyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NAorCTB4MGRkMDogIDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjQ2NSA2MjY5IDYxNmUgMmU2ZgorCTB4MGRlMDogIDcyNjcgMmY2NCA2ZjYzIDJmMjIgM2U0NCA2NTYyIDY5NjEgNmUyMAorCTB4MGRmMDogIDUwNzIgNmY2YSA2NTYzIDc0MGEgNDQ2ZiA2Mzc1IDZkNjUgNmU3NAorCTB4MGUwMDogIDYxNzQgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3NzY4IDY5NjMgNjgyMAorCTB4MGUxMDogIDYzNmYgNmU3NCA2MTY5IDZlNzMgMjA0OCA0ZjU3IDU0NGYgNzMyYworCTB4MGUyMDogIDIwNDYgNDE1MSA3MzJjIDIwNjEgNmU2NCAyMDczIDZmNjYgNzQ3NworCTB4MGUzMDogIDYxNzIgNjUyMCA3NTcwIDY0NjEgNzQ2NSA3MzJlIDNjMmYgNGM0OQorCTB4MGU0MDogIDNlMGEgM2MyZiA1NTRjIDNlMGEgMGEzYyA1MDNlIDU5NmYgNzUyMAorCTB4MGU1MDogIDYzNjEgNmUyMCA2MTZjIDczNmYgMjA2MyA2ZjZlIDczNzUgNmM3NAorCTB4MGU2MDogIDIwNzQgNjg2NSAyMDZjIDY5NzMgNzQyMCA2ZjY2IDIwM2MgNDEyMAorCTB4MGU3MDogIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NworCTB4MGU4MDogIDJlNjIgNmY3NSA3NDY1IDZjNmMgMmU2MyA2ZjZkIDJmNjYgNjE3MQorCTB4MGU5MDogIDJmMjIgM2U1NyA2ZjcyIDZjNjQgMGE1NyA2OTY0IDY1MjAgNTc2NQorCTB4MGVhMDogIDYyMjAgNDY3MiA2NTcxIDc1NjUgNmU3NCA2Yzc5IDIwNDEgNzM2YgorCTB4MGViMDogIDY1NjQgMjA1MSA3NTY1IDczNzQgNjk2ZiA2ZTczIDNjMmYgNDEzZQorCTB4MGVjMDogIDIwNjYgNmY3MiAyMDY5IDZlNjYgNmY3MiA2ZDYxIDc0NjkgNmY2ZQorCTB4MGVkMDogIDJlMGEgMGEzYyA0ODMyIDNlNGMgNjU3NCAyMDZmIDc0NjggNjU3MgorCTB4MGVlMDogIDIwNzAgNjU2ZiA3MDZjIDY1MjAgNmI2ZSA2Zjc3IDIwNjEgNjI2ZgorCTB4MGVmMDogIDc1NzQgMjA3NCA2ODY5IDczMjAgNzM2NSA3Mjc2IDY1NzIgM2MyZgorCTB4MGYwMDogIDQ4MzIgM2UwYSAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NAorCTB4MGYxMDogIDc0NzAgM2EyZiAyZjZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZgorCTB4MGYyMDogIDZkMmYgMjIzZSA0ZTY1IDc0NjMgNzI2MSA2Njc0IDNjMmYgNDEzZQorCTB4MGYzMDogIDIwNzAgNzI2ZiA3NjY5IDY0NjUgNzMyMCA2MTZlIDIwNjkgNmU3NAorCTB4MGY0MDogIDY1NzIgNjU3MyA3NDY5IDZlNjcgMjA2NiA3MjY1IDY1MGEgNzM2NQorCTB4MGY1MDogIDcyNzYgNjk2MyA2NTIwIDY2NmYgNzIyMCA3NzY1IDYyMjAgNzM2OQorCTB4MGY2MDogIDc0NjUgMjA2ZCA2ZjZlIDY5NzQgNmY3MiA2OTZlIDY3MjAgNjE2ZQorCTB4MGY3MDogIDY0MjAgNzM3NCA2MTc0IDY5NzMgNzQ2OSA2MzIwIDYzNmYgNmM2YworCTB4MGY4MDogIDY1NjMgNzQ2OSA2ZjZlIDJlMGEgNTk2ZiA3NTIwIDYzNjEgNmUyMAorCTB4MGY5MDogIDZjNjUgNzQyMCA3NDY4IDY1NmQgMjA2YiA2ZTZmIDc3MjAgNjE2MgorCTB4MGZhMDogIDZmNzUgNzQyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyMAorCTB4MGZiMDogIDc1NzMgNjk2ZSA2NzIwIDc0NjggNjU2OSA3MjBhIDNjNDEgMjA0OAorCTB4MGZjMDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc1NzAgNzQ2OQorCTB4MGZkMDogIDZkNjUgMmU2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZgorCTB4MGZlMDogIDIyM2UgNjk2ZSA3NDY1IDcyNjYgNjE2MyA2NTNjIDJmNDEgM2UyZQorCTB4MGZmMDogIDBhNDUgNmU2MSA2MjZjIDY5NmUgNjcyMCA3NDY4IDY1MjAgNmQ2ZgorCTB4MTAwMDogIDZlNjkgNzQ2ZiA3MjY5IDZlNjcgMjA2ZiA2NjIwIDc5NmYgNzU3MgorCTB4MTAxMDogIDIwNzMgNjU3MiA3NjY1IDcyMjAgNzc2OSA2YzZjIDIwNzAgNzI2ZgorCTB4MTAyMDogIDc2NjkgNjQ2NSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMjAgNjc2YworCTB4MTAzMDogIDZmNjIgNjE2YyAyMDZmIDc2NjUgNzI3NiA2OTY1IDc3MGEgNmY2NgorCTB4MTA0MDogIDIwNzcgNjg2ZiAyMDY5IDczMjAgNzU3MyA2OTZlIDY3MjAgNzc2OAorCTB4MTA1MDogIDYxNzQgMjA2MSA2ZTY0IDIwNzcgNjg2NSA3MjY1IDJjMjAgNjE2ZQorCTB4MTA2MDogIDY0MjAgNjk3NCAyMDc3IDZmNzUgNmM2NCAyMDY3IDY5NzYgNjUyMAorCTB4MTA3MDogIDQ0NjUgNjI2OSA2MTZlIDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIwYQorCTB4MTA4MDogIDZmNzYgNjU3MiA3NjY5IDY1NzcgMjA2ZiA2NjIwIDc0NjggNjUyMAorCTB4MTA5MDogIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NQorCTB4MTBhMDogIDczNjEgNjc2NSAyZTBhIDBhM2MgNDgzMiAzZTQxIDYyNmYgNzU3NAorCTB4MTBiMDogIDIwNzQgNjg2OSA3MzIwIDcwNjEgNjc2NSAzYzJmIDQ4MzIgM2UwYQorCTB4MTBjMDogIDBhM2MgNDk0ZCA0NzIwIDQxNGMgNDk0NyA0ZTNkIDIyNzIgNjk2NworCTB4MTBkMDogIDY4NzQgMjIyMCA0MTRjIDU0M2QgMjIyMiAyMDQ4IDQ1NDkgNDc0OAorCTB4MTBlMDogIDU0M2QgMjIzMiAzNDM3IDIyMjAgNTc0OSA0NDU0IDQ4M2QgMjIzMgorCTB4MTBmMDogIDM3MzggMjIyMCA1MzUyIDQzM2QgMjI2OSA2MzZmIDZlNzMgMmY2YQorCTB4MTEwMDogIDY4NjUgMzAzNiAzMTJlIDcwNmUgNjcyMiAzZTBhIDBhM2MgNTAzZQorCTB4MTExMDogIDU0NjggNjk3MyAyMDY5IDczMjAgNjEyMCA3MDZjIDYxNjMgNjU2OAorCTB4MTEyMDogIDZmNmMgNjQ2NSA3MjIwIDcwNjEgNjc2NSAyMDY5IDZlNzMgNzQ2MQorCTB4MTEzMDogIDZjNmMgNjU2NCAyMDYyIDc5MjAgNzQ2OCA2NTIwIDNjNDEgMGE0OAorCTB4MTE0MDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZQorCTB4MTE1MDogIDY0NjUgNjI2OSA2MTZlIDJlNmYgNzI2NyAyZjIyIDNlNDQgNjU2MgorCTB4MTE2MDogIDY5NjEgNmUzYyAyZjQxIDNlMGEgNzI2NSA2YzY1IDYxNzMgNjUyMAorCTB4MTE3MDogIDZmNjYgMjA3NCA2ODY1IDIwNjEgNzA2MSA2MzY4IDY1MjAgNTc2NQorCTB4MTE4MDogIDYyMjAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NQorCTB4MTE5MDogIDJlMGEgMGEzYyA1MDNlIDU0NjggNjk3MyAyMDYzIDZmNmQgNzA3NQorCTB4MTFhMDogIDc0NjUgNzIyMCA2ODYxIDczMjAgNjk2ZSA3Mzc0IDYxNmMgNmM2NQorCTB4MTFiMDogIDY0MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlIDIwNDcgNGU1NQorCTB4MTFjMDogIDJmNGMgNjk2ZSA3NTc4IDIwNmYgNzA2NSA3MjYxIDc0NjkgNmU2NworCTB4MTFkMDogIDIwNzMgNzk3MyA3NDY1IDZkMmMgMGE2MiA3NTc0IDIwNjkgNzQyMAorCTB4MTFlMDogIDY4NjEgNzMyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQ2OAorCTB4MTFmMDogIDY5NmUgNjcyMCA3NDZmIDIwNjQgNmYyMCA3NzY5IDc0NjggMjA3NAorCTB4MTIwMDogIDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgNjU2MworCTB4MTIxMDogIDc0M2MgMmY3MyA3NDcyIDZmNmUgNjczZSAyZTIwIDUwNmMgNjU2MQorCTB4MTIyMDogIDczNjUgMjA2NCA2ZjIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZgorCTB4MTIzMDogIDc0M2MgMmY3MyA3NDcyIDZmNmUgNjczZSAyMDYzIDZmNmUgNzQ2MQorCTB4MTI0MDogIDYzNzQgMjA3NCA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MgorCTB4MTI1MDogIDZmNmEgNjU2MyA3NDIwIDYxNjIgNmY3NSA3NDIwIDY5NzQgMmUzYworCTB4MTI2MDogIDJmNTAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA2NgorCTB4MTI3MDogIDY5NmUgNjQyMCA2MTIwIDYyNzUgNjcyMCA2OTZlIDIwNzQgNjg2OQorCTB4MTI4MDogIDczMjAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NQorCTB4MTI5MDogIDJjMjAgNmY3MiAyMDY5IDZlMjAgNDE3MCA2MTYzIDY4NjUgMjA2OQorCTB4MTJhMDogIDc0NzMgNjU2YyA2NjJjIDBhNzAgNmM2NSA2MTczIDY1MjAgNjY2OQorCTB4MTJiMDogIDZjNjUgMjA2MSAyMDYyIDc1NjcgMjA3MiA2NTcwIDZmNzIgNzQyMAorCTB4MTJjMDogIDZmNmUgMjA2OSA3NDJlIDIwMjAgNDk2ZSA3Mzc0IDcyNzUgNjM3NAorCTB4MTJkMDogIDY5NmYgNmU3MyAyMDZmIDZlMjAgNjQ2ZiA2OTZlIDY3MjAgNzQ2OAorCTB4MTJlMDogIDY5NzMgMmMyMCA2MTZlIDY0MjAgNzQ2OCA2NTBhIDZjNjkgNzM3NAorCTB4MTJmMDogIDIwNmYgNjYyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NAorCTB4MTMwMDogIDcwM2EgMmYyZiA2Mjc1IDY3NzMgMmU2NCA2NTYyIDY5NjEgNmUyZQorCTB4MTMxMDogIDZmNzIgNjcyZiA3MzcyIDYzM2EgNjE3MCA2MTYzIDY4NjUgMjIzZQorCTB4MTMyMDogIDZiNmUgNmY3NyA2ZTIwIDYyNzUgNjc3MyAzYzJmIDQxM2UgMjA2ZgorCTB4MTMzMDogIDY2MjAgNzQ2OCA2OTczIDBhNzAgNjE2MyA2YjYxIDY3NjUgMmMyMAorCTB4MTM0MDogIDYzNjEgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMAorCTB4MTM1MDogIDc0NjggNjUyMCAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NAorCTB4MTM2MDogIDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgNmUyZQorCTB4MTM3MDogIDZmNzIgNjcyZiA0Mjc1IDY3NzMgMmY1MiA2NTcwIDZmNzIgNzQ2OQorCTB4MTM4MDogIDZlNjcgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyMDQyIDc1NjcgMjA1NAorCTB4MTM5MDogIDcyNjEgNjM2YiA2OTZlIDY3MjAgNTM3OSA3Mzc0IDY1NmQgM2MyZgorCTB4MTNhMDogIDQxM2UgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2MTZlIDZiNzMgMjA2NgorCTB4MTNiMDogIDZmNzIgMjA3NSA3MzY5IDZlNjcgMjA3NCA2ODY5IDczMjAgNzA2MQorCTB4MTNjMDogIDYzNmIgNjE2NyA2NTJjIDIwNjEgNmU2NCAyMDYzIDZmNmUgNjc3MgorCTB4MTNkMDogIDYxNzQgNzU2YyA2MTc0IDY5NmYgNmU3MyAyMDY2IDZmNzIgMjA3OQorCTB4MTNlMDogIDZmNzUgNzIyMCA2MzY4IDZmNjkgNjM2NSAyMDZmIDY2MGEgNjEyMAorCTB4MTNmMDogIDQ0NjUgNjI2OSA2MTZlIDIwNzMgNzk3MyA3NDY1IDZkMjEgM2MyZgorCTB4MTQwMDogIDUwM2UgMGEwYSAzYzQ0IDQ5NTYgMjA2MSA2YzY5IDY3NmUgM2QyMgorCTB4MTQxMDogIDYzNjUgNmU3NCA2NTcyIDIyM2UgMGEzYyA2MTIwIDY4NzIgNjU2NgorCTB4MTQyMDogIDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MgorCTB4MTQzMDogIDY5NjEgNmUyZSA2ZjcyIDY3MmYgMjIzZSAwYTNjIDQ5NGQgNDcyMAorCTB4MTQ0MDogIDYxNmMgNjk2NyA2ZTNkIDIyNmQgNjk2NCA2NDZjIDY1MjIgMjA2OAorCTB4MTQ1MDogIDY1NjkgNjc2OCA3NDNkIDIyMzMgMzAyMiAyMDc3IDY5NjQgNzQ2OAorCTB4MTQ2MDogIDNkMjIgMzIzNSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgNmU3MworCTB4MTQ3MDogIDJmNjQgNjU2MiA2OTYxIDZlMmYgNmY3MCA2NTZlIDZjNmYgNjc2ZgorCTB4MTQ4MDogIDJkMzIgMzUyZSA2YTcwIDY3MjIgMjA2MSA2Yzc0IDNkMjIgNDQ2NQorCTB4MTQ5MDogIDYyNjkgNjE2ZSAyMjNlIDBhM2MgMmY2MSAzZTBhIDNjNjEgMjA2OAorCTB4MTRhMDogIDcyNjUgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZQorCTB4MTRiMDogIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlMGEgM2M0OQorCTB4MTRjMDogIDRkNDcgMjA2MSA2YzY5IDY3NmUgM2QyMiA2ZDY5IDY0NjQgNmM2NQorCTB4MTRkMDogIDIyMjAgNjg2NSA2OTY3IDY4NzQgM2QyMiAzMzMyIDIyMjAgNzc2OQorCTB4MTRlMDogIDY0NzQgNjgzZCAyMjMyIDM1MzkgMjIyMCA3MzcyIDYzM2QgMjI2OQorCTB4MTRmMDogIDYzNmYgNmU3MyAyZjYxIDcwNjEgNjM2OCA2NTVmIDcwNjIgMmU3MAorCTB4MTUwMDogIDZlNjcgMjIyMCA2MTZjIDc0M2QgMjI0MSA3MDYxIDYzNjggNjUyMgorCTB4MTUxMDogIDNlMGEgM2MyZiA2MTNlIDBhM2MgMmY0NCA0OTU2IDNlMGEgMGEzYworCTB4MTUyMDogIDIxMmQgMmQwYSAyMDIwIDU0NjggNjk3MyAyMDcwIDYxNjcgNjUyMAorCTB4MTUzMDogIDc3NjEgNzMyMCA2OTZlIDY5NzQgNjk2MSA2YzZjIDc5MjAgNjM3MgorCTB4MTU0MDogIDY1NjEgNzQ2NSA2NDIwIDYyNzkgMjA0YSA2ZjY4IDZlNjkgNjUyMAorCTB4MTU1MDogIDQ5NmUgNjc3MiA2MTZkIDIwMjggNjg3NCA3NDcwIDNhMmYgMmY2ZQorCTB4MTU2MDogIDY1NzQgNjc2ZiA2NDJlIDZlNjUgNzQyZiAyOTBhIDIwMjAgNDk3NAorCTB4MTU3MDogIDIwNzcgNjE3MyAyMDZjIDYxNzQgNjU3MiAyMDY1IDY0NjkgNzQ2NQorCTB4MTU4MDogIDY0MjAgNjI3OSAyMDRkIDYxNzQgNzQ2OCA2NTc3IDIwNTcgNjk2YworCTB4MTU5MDogIDYzNmYgNzgyMCA2MTZlIDY0MjAgNGE2ZiA3MzY5IDcwMjAgNTI2ZgorCTB4MTVhMDogIDY0NjkgNmUyZSAwYTIwIDIwNGMgNjE3MyA3NDIwIDZkNmYgNjQ2OQorCTB4MTViMDogIDY2NjkgNjU2NCAzYTIwIDI0NDQgNjE3NCA2NTNhIDIwMzIgMzAzMAorCTB4MTVjMDogIDM0MmYgMzAzNiAyZjMyIDMwMjAgMzEzNSAzYTMzIDMzM2EgMzUzNworCTB4MTVkMDogIDIwMjQgMmUwYSAyMDIwIDJkMmQgM2UwYSAwYTNjIDJmNDIgNGY0NAorCTB4MTVlMDogIDU5M2UgMGEzYyAyZjQ4IDU0NGQgNGMzZSAwYQorMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI2ZSA0MDAwIDQwMDYgMjE1NCA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkKKwkweDAwMjA6ICA4MDEwIDMwNWYgMTBlYSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkKKwkweDAwMzA6ICA0ZGRjIDkyMTkKKzIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkKKwkweDAwMjA6ICA4MDExIDMwNWYgMGJlMSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjEKKwkweDAwMzA6ICA0ZGRjIDkyMTkKKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KKwkweDAwMDA6ICA0NTAwIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEKKwkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEKKwkweDAwMjA6ICA4MDExIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMKKwkweDAwMzA6ICA0ZGRjIDk3MjEKKzIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+CisJMHgwMDAwOiAgNDUwMCAwMDM0IDFiNzIgNDAwMCA0MDA2IDIxNTAgN2YwMCAwMDAxCisJMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNGEgMzc3YSBhM2FhCisJMHgwMDIwOiAgODAxMCAzMDVmIDA2ZDQgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzCisJMHgwMDMwOiAgNGRkYyA5NzIzCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC14eC5uZXcgYi90ZXN0cy9wcmludC14eC5uZXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzMjNkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3ByaW50LXh4Lm5ldwpAQCAtMCwwICsxLDQxOSBAQAorMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwIGEwMDIKKwkweDAwMzA6ICA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMKKwkweDAwNDA6ICA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIKKzIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDNjIDAwMDAgNDAwMCA0MDA2IDNjYmEgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjEgMzc1OCA4OTdmIGEwMTIKKwkweDAwMzA6ICA3ZmZmIDZlYjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMKKwkweDAwNDA6ICA5MjE2IDRkZGMgOTIxNiAwMTAzIDAzMDIKKzIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTAKKwkweDAwMzA6ICAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2IDRkZGMKKwkweDAwNDA6ICA5MjE2CisyMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTgKKwkweDAwMzA6ICAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3IDRkZGMKKwkweDAwNDA6ICA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxIDJlMzEKKwkweDAwNTA6ICAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4IDZmNzMKKwkweDAwNjA6ICA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhIDIwNDUKKwkweDAwNzA6ICA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3IDJkNjQKKwkweDAwODA6ICA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0IDY1M2IKKwkweDAwOTA6ICAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkIDMxMmQKKwkweDAwYTA6ICAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwIDMxMzMKKwkweDAwYjA6ICAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwIDc0M2EKKwkweDAwYzA6ICAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1IDZlNjMKKwkweDAwZDA6ICA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxIDYzNjMKKwkweDAwZTA6ICA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwIDY1NmUKKwkweDAwZjA6ICAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwIDRiNjUKKwkweDAxMDA6ICA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYQorMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCisJMHgwMDEwOiAgMDAzNCAxZmU0IDQwMDAgNDAwNiAxY2RlIDdmMDAgMDAwMSA3ZjAwCisJMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDEwCisJMHgwMDMwOiAgMjAwMCAzNzAzIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOCA0ZGRjCisJMHgwMDQwOiAgOTIxNworMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgODAxOAorCTB4MDAzMDogIDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgNGRkYworCTB4MDA0MDogIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAgMjA0ZgorCTB4MDA1MDogIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAgMzAzNgorCTB4MDA2MDogIDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUgMzczYQorCTB4MDA3MDogIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIgM2EyMAorCTB4MDA4MDogIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQgMGE0YworCTB4MDA5MDogIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAgNTM3NQorCTB4MDBhMDogIDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQgMjAzMAorCTB4MDBiMDogIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUgNTQ2MQorCTB4MDBjMDogIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzggNjEyZAorCTB4MDBkMDogIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMgNjU3MAorCTB4MDBlMDogIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUgNzMwZAorCTB4MDBmMDogIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQgNjgzYQorCTB4MDEwMDogIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMgNjk3NgorCTB4MDExMDogIDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMgMjA2ZAorCTB4MDEyMDogIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OQorCTB4MDEzMDogIDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYQorCTB4MDE0MDogIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAgNzQ2NQorCTB4MDE1MDogIDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMgNjU3NAorCTB4MDE2MDogIDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQgMGEzYworCTB4MDE3MDogIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAgNTA1NQorCTB4MDE4MDogIDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYgNDQ1NAorCTB4MDE5MDogIDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIgNjE2ZQorCTB4MDFhMDogIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UgMGEzYworCTB4MDFiMDogIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAgMjAyMAorCTB4MDFjMDogIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUgNDk1NgorCTB4MDFkMDogIDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgMjIyMAorCTB4MDFlMDogIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYgNjg3NAorCTB4MDFmMDogIDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMgNmYyZAorCTB4MDIwMDogIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQgNDU1NAorCTB4MDIxMDogIDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkgNzA3NAorCTB4MDIyMDogIDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIgNTQ2OAorCTB4MDIzMDogIDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQgNjE2YworCTB4MDI0MDogIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkgNjE2ZQorCTB4MDI1MDogIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAgM2M1NAorCTB4MDI2MDogIDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQgNjU3MgorCTB4MDI3MDogIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEgM2MyZgorCTB4MDI4MDogIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUgNTg1NAorCTB4MDI5MDogIDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMgNGY0YworCTB4MDJhMDogIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMgNDk0ZQorCTB4MDJiMDogIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMgNDk0ZQorCTB4MDJjMDogIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMgNDk0ZQorCTB4MDJkMDogIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEgM2M0OAorCTB4MDJlMDogIDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAgNzA2MQorCTB4MDJmMDogIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYgMjA3OQorCTB4MDMwMDogIDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIgNmY3NworCTB4MDMxMDogIDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYgNjgzMgorCTB4MDMyMDogIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUgNzIyMAorCTB4MDMzMDogIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkgNzQ2NQorCTB4MDM0MDogIDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUgNzAyMAorCTB4MDM1MDogIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAgNzk2NQorCTB4MDM2MDogIDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUgMjA2MgorCTB4MDM3MDogIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UgMGEwYQorCTB4MDM4MDogIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQgNDUzZQorCTB4MDM5MDogIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYgNzQ2OAorCTB4MDNhMDogIDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIgNjUyZQorCTB4MDNiMDogIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MgMmY1MworCTB4MDNjMDogIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIgM2U0OQorCTB4MDNkMDogIDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkgNmU2NworCTB4MDNlMDogIDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUgMjA2MQorCTB4MDNmMDogIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYgNjYyMAorCTB4MDQwMDogIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYgNDgzMgorCTB4MDQxMDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcgNjE2ZQorCTB4MDQyMDogIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYgNmQ2NQorCTB4MDQzMDogIDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjggNjk3MworCTB4MDQ0MDogIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkgNmY3MgorCTB4MDQ1MDogIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEgNjM3NAorCTB4MDQ2MDogIDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAgNTM2NQorCTB4MDQ3MDogIDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIgMjAyOAorCTB4MDQ4MDogIDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAgNjQ2OQorCTB4MDQ5MDogIDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZQorCTB4MDRhMDogIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUgNjYzZAorCTB4MDRiMDogIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIgNzU3MworCTB4MDRjMDogIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIgNmIyMAorCTB4MDRkMDogIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcgNjg2ZgorCTB4MDRlMDogIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYgNzcyMAorCTB4MDRmMDogIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAgM2UwYQorCTB4MDUwMDogIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMAorCTB4MDUxMDogIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEgNzQ2ZgorCTB4MDUyMDogIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjggNjk2ZQorCTB4MDUzMDogIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUgMjA2OQorCTB4MDU0MDogIDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMgNjE3NAorCTB4MDU1MDogIDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYgM2QyMgorCTB4MDU2MDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MQorCTB4MDU3MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjc3MworCTB4MDU4MDogIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUgNjIyMAorCTB4MDU5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NworCTB4MDVhMDogIDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUgM2MyZgorCTB4MDViMDogIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcgM2U1OQorCTB4MDVjMDogIDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMgNjE2MworCTB4MDVkMDogIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkgNzQ2OAorCTB4MDVlMDogIDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAgNzA2MQorCTB4MDVmMDogIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMgMjA3MAorCTB4MDYwMDogIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYgNGU0NworCTB4MDYxMDogIDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUgNzM3MworCTB4MDYyMDogIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkgNzQ3MworCTB4MDYzMDogIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUgMmMyMAorCTB4MDY0MDogIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUgNzIyMAorCTB4MDY1MDogIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAgNjE3MworCTB4MDY2MDogIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UgMGEzYworCTB4MDY3MDogIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQgNjk2ZgorCTB4MDY4MDogIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUgMjA2NgorCTB4MDY5MDogIDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUgNzQ2MworCTB4MDZhMDogIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YworCTB4MDZiMDogIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNTQ1NAorCTB4MDZjMDogIDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MgMmY1NAorCTB4MDZkMDogIDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQgNjg2NQorCTB4MDZlMDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQgNjU3MgorCTB4MDZmMDogIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUgNzIwYQorCTB4MDcwMDogIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYgNzU2YworCTB4MDcxMDogIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUgNzQyMAorCTB4MDcyMDogIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgNzczYworCTB4MDczMDogIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZQorCTB4MDc0MDogIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEgNzI2NQorCTB4MDc1MDogIDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUgMjAzYworCTB4MDc2MDogIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcgNjkyZAorCTB4MDc3MDogIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMAorCTB4MDc4MDogIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEgNmUyMAorCTB4MDc5MDogIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAgNzA2YworCTB4MDdhMDogIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkgNzA3NAorCTB4MDdiMDogIDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNGM2ZgorCTB4MDdjMDogIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMgNjE2MworCTB4MDdkMDogIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY2YworCTB4MDdlMDogIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmMyMAorCTB4MDdmMDogIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYgNzQ2MQorCTB4MDgwMDogIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQgNjg2NQorCTB4MDgxMDogIDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAgNzI2ZgorCTB4MDgyMDogIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAgNjU2MQorCTB4MDgzMDogIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIgNzkyMAorCTB4MDg0MDogIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUgNzQ2MworCTB4MDg1MDogIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEgNzA2MQorCTB4MDg2MDogIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYQorCTB4MDg3MDogIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUgNmM3NAorCTB4MDg4MDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQgNjU3OAorCTB4MDg5MDogIDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUgNjg3NAorCTB4MDhhMDogIDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkgNmU2NworCTB4MDhiMDogIDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMgMGE2NgorCTB4MDhjMDogIDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjAzYworCTB4MDhkMDogIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYgNTQ1NAorCTB4MDhlMDogIDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjggNjUyMAorCTB4MDhmMDogIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjggNjUyMAorCTB4MDkwMDogIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NworCTB4MDkxMDogIDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUgNzgyZQorCTB4MDkyMDogIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkgNzQyMAorCTB4MDkzMDogIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkgNmU2NworCTB4MDk0MDogIDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY3NworCTB4MDk1MDogIDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUgNzIyMAorCTB4MDk2MDogIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYgNmY3NAorCTB4MDk3MDogIDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YworCTB4MDk4MDogIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQgNmY3MgorCTB4MDk5MDogIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUgNjQyYworCTB4MDlhMDogIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUgNmQ2NQorCTB4MDliMDogIDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYgNmY2YgorCTB4MDljMDogIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAgM2M1NAorCTB4MDlkMDogIDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MgMmY1NAorCTB4MDllMDogIDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYgNjYyMAorCTB4MDlmMDogIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQgNjU3MworCTB4MGEwMDogIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEgNzM2OAorCTB4MGExMDogIDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAgM2M1NAorCTB4MGEyMDogIDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAgNjE2ZQorCTB4MGEzMDogIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUgNmY3NAorCTB4MGE0MDogIDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkgNmQ2YworCTB4MGE1MDogIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQgNjg2NQorCTB4MGE2MDogIDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYgNGM0OQorCTB4MGE3MDogIDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQgNjg2NQorCTB4MGE4MDogIDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMgNjg2NQorCTB4MGE5MDogIDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEgNzY2MQorCTB4MGFhMDogIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjggNjk3MworCTB4MGFiMDogIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEgNzI2NQorCTB4MGFjMDogIDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcgNjk3NAorCTB4MGFkMDogIDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkgNzA2NQorCTB4MGFlMDogIDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYgNmU2NgorCTB4MGFmMDogIDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYgNTQ1NAorCTB4MGIwMDogIDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjggNjk2MworCTB4MGIxMDogIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAgNzc2MQorCTB4MGIyMDogIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQgNjE2ZQorCTB4MGIzMDogIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMAorCTB4MGI0MDogIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEgNzQ2OAorCTB4MGI1MDogIDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZQorCTB4MGI2MDogIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUgNmQyMAorCTB4MGI3MDogIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMgMjAzYworCTB4MGI4MDogIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQgNmY2NAorCTB4MGI5MDogIDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYgNzUyMAorCTB4MGJhMDogIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMgNjUyMAorCTB4MGJiMDogIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMgNjU2YworCTB4MGJjMDogIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUgNjU2NAorCTB4MGJkMDogIDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjggNjUwYQorCTB4MGJlMDogIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYgM2MyZgorCTB4MGJmMDogIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEgM2M1MAorCTB4MGMwMDogIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NAorCTB4MGMxMDogIDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAgNjM2MQorCTB4MGMyMDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EgMGEzYworCTB4MGMzMDogIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNDEyMAorCTB4MGM0MDogIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEgNjM2OAorCTB4MGM1MDogIDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIgM2U0MQorCTB4MGM2MDogIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NAorCTB4MGM3MDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQgMjA2ZgorCTB4MGM4MDogIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUgM2MyZgorCTB4MGM5MDogIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MQorCTB4MGNhMDogIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NworCTB4MGNiMDogIDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2U0MQorCTB4MGNjMDogIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MgMmY0MQorCTB4MGNkMDogIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OQorCTB4MGNlMDogIDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OAorCTB4MGNmMDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZQorCTB4MGQwMDogIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcgMmYyMgorCTB4MGQxMDogIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEgM2UyMAorCTB4MGQyMDogIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgM2UwYQorCTB4MGQzMDogIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggNTI0NQorCTB4MGQ0MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMgMmU2MQorCTB4MGQ1MDogIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYgNjQyMAorCTB4MGQ2MDogIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAgNzM2OQorCTB4MGQ3MDogIDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NAorCTB4MGQ4MDogIDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MAorCTB4MGQ5MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcgNjU2NQorCTB4MGRhMDogIDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUgNTc2NQorCTB4MGRiMDogIDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQgNzQ2NQorCTB4MGRjMDogIDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OAorCTB4MGRkMDogIDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYQorCTB4MGRlMDogIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYgNzI2NworCTB4MGRmMDogIDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAgNTA3MgorCTB4MGUwMDogIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NAorCTB4MGUxMDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAgNjM2ZgorCTB4MGUyMDogIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMgMjA0NgorCTB4MGUzMDogIDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcgNjE3MgorCTB4MGU0MDogIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkgM2UwYQorCTB4MGU1MDogIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAgNjM2MQorCTB4MGU2MDogIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQgMjA3NAorCTB4MGU3MDogIDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAgNDg1MgorCTB4MGU4MDogIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2MgorCTB4MGU5MDogIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEgMmYyMgorCTB4MGVhMDogIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUgNjIyMAorCTB4MGViMDogIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIgNjU2NAorCTB4MGVjMDogIDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UgMjA2NgorCTB4MGVkMDogIDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUgMmUwYQorCTB4MGVlMDogIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIgMjA3MAorCTB4MGVmMDogIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYgNzU3NAorCTB4MGYwMDogIDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYgNDgzMgorCTB4MGYxMDogIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MAorCTB4MGYyMDogIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZgorCTB4MGYzMDogIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UgMjA3MAorCTB4MGY0MDogIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQgNjU3MgorCTB4MGY1MDogIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUgNzI3NgorCTB4MGY2MDogIDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkgNzQ2NQorCTB4MGY3MDogIDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUgNjQyMAorCTB4MGY4MDogIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMgNjU2MworCTB4MGY5MDogIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAgNmM2NQorCTB4MGZhMDogIDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIgNmY3NQorCTB4MGZiMDogIDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAgNzU3MworCTB4MGZjMDogIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDggNTI0NQorCTB4MGZkMDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkgNmQ2NQorCTB4MGZlMDogIDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgMjIzZQorCTB4MGZmMDogIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUgMGE0NQorCTB4MTAwMDogIDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYgNmU2OQorCTB4MTAxMDogIDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIgMjA3MworCTB4MTAyMDogIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYgNzY2OQorCTB4MTAzMDogIDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMgNmY2MgorCTB4MTA0MDogIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYgMjA3NworCTB4MTA1MDogIDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjggNjE3NAorCTB4MTA2MDogIDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUgNjQyMAorCTB4MTA3MDogIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAgNDQ2NQorCTB4MTA4MDogIDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEgNmY3NgorCTB4MTA5MDogIDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAgNjE3MAorCTB4MTBhMDogIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUgNzM2MQorCTB4MTBiMDogIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQgMjA3NAorCTB4MTBjMDogIDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEgMGEzYworCTB4MTBkMDogIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcgNjg3NAorCTB4MTBlMDogIDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDggNTQzZAorCTB4MTBmMDogIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIgMzczOAorCTB4MTEwMDogIDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEgNjg2NQorCTB4MTExMDogIDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UgNTQ2OAorCTB4MTEyMDogIDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjggNmY2YworCTB4MTEzMDogIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEgNmM2YworCTB4MTE0MDogIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDggNTI0NQorCTB4MTE1MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjQ2NQorCTB4MTE2MDogIDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIgNjk2MQorCTB4MTE3MDogIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAgNmY2NgorCTB4MTE4MDogIDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUgNjIyMAorCTB4MTE5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMmUwYQorCTB4MTFhMDogIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUgNzQ2NQorCTB4MTFiMDogIDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUgNjQyMAorCTB4MTFjMDogIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUgMmY0YworCTB4MTFkMDogIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcgMjA3MworCTB4MTFlMDogIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAgNjg2MQorCTB4MTFmMDogIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjggNjk2ZQorCTB4MTIwMDogIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQgNjg2NQorCTB4MTIxMDogIDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMgNzQzYworCTB4MTIyMDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEgNzM2NQorCTB4MTIzMDogIDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQzYworCTB4MTI0MDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEgNjM3NAorCTB4MTI1MDogIDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YQorCTB4MTI2MDogIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MgMmY1MAorCTB4MTI3MDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYgNjk2ZQorCTB4MTI4MDogIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkgNzMyMAorCTB4MTI5MDogIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMmMyMAorCTB4MTJhMDogIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkgNzQ3MworCTB4MTJiMDogIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkgNmM2NQorCTB4MTJjMDogIDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAgNmY2ZQorCTB4MTJkMDogIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQgNjk2ZgorCTB4MTJlMDogIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjggNjk3MworCTB4MTJmMDogIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQgMjA2ZgorCTB4MTMwMDogIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYQorCTB4MTMxMDogIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MgorCTB4MTMyMDogIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UgNmI2ZQorCTB4MTMzMDogIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYgNjYyMAorCTB4MTM0MDogIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgNjM2MQorCTB4MTM1MDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgNzQ2OAorCTB4MTM2MDogIDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MAorCTB4MTM3MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MgorCTB4MTM4MDogIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkgNmU2NworCTB4MTM5MDogIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQgNzI2MQorCTB4MTNhMDogIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYgNDEzZQorCTB4MTNiMDogIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYgNmY3MgorCTB4MTNjMDogIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEgNjM2YgorCTB4MTNkMDogIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIgNjE3NAorCTB4MTNlMDogIDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkgNmY3NQorCTB4MTNmMDogIDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAgNDQ2NQorCTB4MTQwMDogIDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYgNTAzZQorCTB4MTQxMDogIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIgNjM2NQorCTB4MTQyMDogIDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYgM2QyMgorCTB4MTQzMDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MQorCTB4MTQ0MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAgNjE2YworCTB4MTQ1MDogIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjggNjU2OQorCTB4MTQ2MDogIDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjggM2QyMgorCTB4MTQ3MDogIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMgMmY2NAorCTB4MTQ4MDogIDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYgMmQzMgorCTB4MTQ5MDogIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUgNjI2OQorCTB4MTRhMDogIDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjggNzI2NQorCTB4MTRiMDogIDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE3MAorCTB4MTRjMDogIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkgNGQ0NworCTB4MTRkMDogIDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUgMjIyMAorCTB4MTRlMDogIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkgNjQ3NAorCTB4MTRmMDogIDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZgorCTB4MTUwMDogIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAgNmU2NworCTB4MTUxMDogIDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIgM2UwYQorCTB4MTUyMDogIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MgMjEyZAorCTB4MTUzMDogIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2MQorCTB4MTU0MDogIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIgNjU2MQorCTB4MTU1MDogIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAgNDk2ZQorCTB4MTU2MDogIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUgNjU3NAorCTB4MTU3MDogIDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQgMjA3NworCTB4MTU4MDogIDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUgNjQyMAorCTB4MTU5MDogIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMgNjM2ZgorCTB4MTVhMDogIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYgNjQ2OQorCTB4MTViMDogIDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkgNjY2OQorCTB4MTVjMDogIDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAgMzQyZgorCTB4MTVkMDogIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcgMjAyNAorCTB4MTVlMDogIDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQgNTkzZQorCTB4MTVmMDogIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEKKzIzOjU3OjM1Ljk0MTI2MCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTM+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCisJMHgwMDEwOiAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMSA3ZjAwCisJMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDEwCisJMHgwMDMwOiAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjCisJMHgwMDQwOiAgOTIxOQorMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwMzQgMWI3MCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgODAxMQorCTB4MDAzMDogIDMwNWYgMGJlMSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjEgNGRkYworCTB4MDA0MDogIDkyMTkKKzIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDM0IDFmZTggNDAwMCA0MDA2IDFjZGEgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIGEzYTkgMzc1OCA4YTRhIDgwMTEKKwkweDAwMzA6ICAyMDAwIDE3MzUgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzIDRkZGMKKwkweDAwNDA6ICA5NzIxCisyMzo1NzozNy4yMzA5MDAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYxIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQzPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEgODAxMAorCTB4MDAzMDogIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYworCTB4MDA0MDogIDk3MjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LXh4Lm91dCBiL3Rlc3RzL3ByaW50LXh4Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjMyM2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcHJpbnQteHgub3V0CkBAIC0wLDAgKzEsNDE5IEBACisyMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgYTAwMgorCTB4MDAzMDogIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYworCTB4MDA0MDogIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMgorMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgYTAxMgorCTB4MDAzMDogIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYworCTB4MDA0MDogIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMgorMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwMzQgMWI2YSA0MDAwIDQwMDYgMjE1OCA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxMAorCTB4MDAzMDogIDIwMDAgMzdkMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTYgNGRkYworCTB4MDA0MDogIDkyMTYKKzIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxOAorCTB4MDAzMDogIDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgNGRkYworCTB4MDA0MDogIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgMmUzMQorCTB4MDA1MDogIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggNmY3MworCTB4MDA2MDogIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgMjA0NQorCTB4MDA3MDogIDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgMmQ2NAorCTB4MDA4MDogIDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgNjUzYgorCTB4MDA5MDogIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgMzEyZAorCTB4MDBhMDogIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgMzEzMworCTB4MDBiMDogIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgNzQzYQorCTB4MDBjMDogIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgNmU2MworCTB4MDBkMDogIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgNjM2MworCTB4MDBlMDogIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgNjU2ZQorCTB4MDBmMDogIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgNGI2NQorCTB4MDEwMDogIDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhCisyMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5IDgwMTAKKwkweDAwMzA6ICAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4IDRkZGMKKwkweDAwNDA6ICA5MjE3CisyMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCisJMHgwMDEwOiAgMTVlYiAxZmU2IDQwMDAgNDAwNiAwNzI1IDdmMDAgMDAwMSA3ZjAwCisJMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDE4CisJMHgwMDMwOiAgMjAwMCAxM2UwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjCisJMHgwMDQwOiAgOTIxNyA0ODU0IDU0NTAgMmYzMSAyZTMxIDIwMzIgMzAzMCAyMDRmCisJMHgwMDUwOiAgNGIwZCAwYTQ0IDYxNzQgNjUzYSAyMDU3IDY1NjQgMmMyMCAzMDM2CisJMHgwMDYwOiAgMjA0YSA3NTZjIDIwMzIgMzAzMCAzNTIwIDMwMzMgM2EzNSAzNzNhCisJMHgwMDcwOiAgMzMzNSAyMDQ3IDRkNTQgMGQwYSA1MzY1IDcyNzYgNjU3MiAzYTIwCisJMHgwMDgwOiAgNDE3MCA2MTYzIDY4NjUgMmYzMSAyZTMzIDJlMzMgMzMwZCAwYTRjCisJMHgwMDkwOiAgNjE3MyA3NDJkIDRkNmYgNjQ2OSA2NjY5IDY1NjQgM2EyMCA1Mzc1CisJMHgwMGEwOiAgNmUyYyAyMDMxIDM1MjAgNDE3NSA2NzIwIDMyMzAgMzAzNCAyMDMwCisJMHgwMGIwOiAgMzAzYSAzNDMzIDNhMzQgMzEyMCA0NzRkIDU0MGQgMGE0NSA1NDYxCisJMHgwMGMwOiAgNjczYSAyMDIyIDM2NjUgMzgzMCA2NjMwIDJkMzEgMzQzOCA2MTJkCisJMHgwMGQwOiAgMzQzMSAzMTY1IDYyMzEgNjI2NCAyMjBkIDBhNDEgNjM2MyA2NTcwCisJMHgwMGUwOiAgNzQyZCA1MjYxIDZlNjcgNjU3MyAzYTIwIDYyNzkgNzQ2NSA3MzBkCisJMHgwMGYwOiAgMGE0MyA2ZjZlIDc0NjUgNmU3NCAyZDRjIDY1NmUgNjc3NCA2ODNhCisJMHgwMTAwOiAgMjAzNSAzMjM1IDM4MGQgMGE0YiA2NTY1IDcwMmQgNDE2YyA2OTc2CisJMHgwMTEwOiAgNjUzYSAyMDc0IDY5NmQgNjU2ZiA3NTc0IDNkMzEgMzUyYyAyMDZkCisJMHgwMTIwOiAgNjE3OCAzZDMxIDMwMzAgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5CisJMHgwMTMwOiAgNmY2ZSAzYTIwIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhCisJMHgwMTQwOiAgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgM2EyMCA3NDY1CisJMHgwMTUwOiAgNzg3NCAyZjY4IDc0NmQgNmMzYiAyMDYzIDY4NjEgNzI3MyA2NTc0CisJMHgwMTYwOiAgM2Q2OSA3MzZmIDJkMzggMzgzNSAzOTJkIDMxMGQgMGEwZCAwYTNjCisJMHgwMTcwOiAgMjE0NCA0ZjQzIDU0NTkgNTA0NSAyMDQ4IDU0NGQgNGMyMCA1MDU1CisJMHgwMTgwOiAgNDI0YyA0OTQzIDIwMjIgMmQyZiAyZjU3IDMzNDMgMmYyZiA0NDU0CisJMHgwMTkwOiAgNDQyMCA0ODU0IDRkNGMgMjAzNCAyZTMwIDMxMjAgNTQ3MiA2MTZlCisJMHgwMWEwOiAgNzM2OSA3NDY5IDZmNmUgNjE2YyAyZjJmIDQ1NGUgMjIzZSAwYTNjCisJMHgwMWIwOiAgNDg1NCA0ZDRjIDNlMGEgM2M0OCA0NTQxIDQ0M2UgMGEyMCAyMDIwCisJMHgwMWMwOiAgM2M0ZCA0NTU0IDQxMjAgNDg1NCA1NDUwIDJkNDUgNTE1NSA0OTU2CisJMHgwMWQwOiAgM2QyMiA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAyMjIwCisJMHgwMWUwOiAgNDM0ZiA0ZTU0IDQ1NGUgNTQzZCAyMjc0IDY1NzggNzQyZiA2ODc0CisJMHgwMWYwOiAgNmQ2YyAzYjIwIDYzNjggNjE3MiA3MzY1IDc0M2QgNjk3MyA2ZjJkCisJMHgwMjAwOiAgMzgzOCAzNTM5IDJkMzEgMjIzZSAwYTIwIDIwMjAgM2M0ZCA0NTU0CisJMHgwMjEwOiAgNDEyMCA0ZTQxIDRkNDUgM2QyMiA0NDY1IDczNjMgNzI2OSA3MDc0CisJMHgwMjIwOiAgNjk2ZiA2ZTIyIDIwNDMgNGY0ZSA1NDQ1IDRlNTQgM2QyMiA1NDY4CisJMHgwMjMwOiAgNjUyMCA2OTZlIDY5NzQgNjk2MSA2YzIwIDY5NmUgNzM3NCA2MTZjCisJMHgwMjQwOiAgNmM2MSA3NDY5IDZmNmUgMjA2ZiA2NjIwIDQ0NjUgNjI2OSA2MTZlCisJMHgwMjUwOiAgMjA2MSA3MDYxIDYzNjggNjUyZSAyMjNlIDBhMjAgMjAyMCAzYzU0CisJMHgwMjYwOiAgNDk1NCA0YzQ1IDNlNTAgNmM2MSA2MzY1IDY4NmYgNmM2NCA2NTcyCisJMHgwMjcwOiAgMjA3MCA2MTY3IDY1M2MgMmY1NCA0OTU0IDRjNDUgM2UwYSAzYzJmCisJMHgwMjgwOiAgNDg0NSA0MTQ0IDNlMGEgM2M0MiA0ZjQ0IDU5MjAgNTQ0NSA1ODU0CisJMHgwMjkwOiAgM2QyMiAyMzMwIDMwMzAgMzAzMCAzMDIyIDIwNDIgNDc0MyA0ZjRjCisJMHgwMmEwOiAgNGY1MiAzZDIyIDIzNDYgNDY0NiA0NjQ2IDQ2MjIgMjA0YyA0OTRlCisJMHgwMmIwOiAgNGIzZCAyMjIzIDMwMzAgMzAzMCA0NTQ2IDIyMjAgNTY0YyA0OTRlCisJMHgwMmMwOiAgNGIzZCAyMjIzIDM1MzUgMzEzOCAzODQxIDIyMjAgNDE0YyA0OTRlCisJMHgwMmQwOiAgNGIzZCAyMjIzIDQ2NDYgMzAzMCAzMDMwIDIyM2UgMGEwYSAzYzQ4CisJMHgwMmUwOiAgMzEzZSA1MDZjIDYxNjMgNjU2OCA2ZjZjIDY0NjUgNzIyMCA3MDYxCisJMHgwMmYwOiAgNjc2NSAzYzJmIDQ4MzEgM2UwYSAzYzQ4IDMyM2UgNDk2NiAyMDc5CisJMHgwMzAwOiAgNmY3NSAyMDYxIDcyNjUgMjA2YSA3NTczIDc0MjAgNjI3MiA2Zjc3CisJMHgwMzEwOiAgNzM2OSA2ZTY3IDIwNzQgNjg2NSAyMDc3IDY1NjIgM2MyZiA2ODMyCisJMHgwMzIwOiAgM2UwYSAwYTNjIDUwM2UgNTQ2OCA2NTIwIDZmNzcgNmU2NSA3MjIwCisJMHgwMzMwOiAgNmY2NiAyMDc0IDY4NjkgNzMyMCA3NzY1IDYyMjAgNzM2OSA3NDY1CisJMHgwMzQwOiAgMjA2OCA2MTczIDIwNmUgNmY3NCAyMDcwIDc1NzQgMjA3NSA3MDIwCisJMHgwMzUwOiAgNjE2ZSA3OTIwIDc3NjUgNjIyMCA3MDYxIDY3NjUgNzMyMCA3OTY1CisJMHgwMzYwOiAgNzQyZSAwYTUwIDZjNjUgNjE3MyA2NTIwIDYzNmYgNmQ2NSAyMDYyCisJMHgwMzcwOiAgNjE2MyA2YjIwIDZjNjEgNzQ2NSA3MjJlIDNjMmYgNTAzZSAwYTBhCisJMHgwMzgwOiAgM2M1MCAzZTNjIDUzNGQgNDE0YyA0YzNlIDNjNDMgNDk1NCA0NTNlCisJMHgwMzkwOiAgNGQ2ZiA3NjY1IDIwNjEgNmM2ZiA2ZTY3IDJjMjAgNmU2ZiA3NDY4CisJMHgwM2EwOiAgNjk2ZSA2NzIwIDc0NmYgMjA3MyA2NTY1IDIwNjggNjU3MiA2NTJlCisJMHgwM2IwOiAgMmUyZSAzYzJmIDQzNDkgNTQ0NSAzZTIwIDNhMmQgMjkzYyAyZjUzCisJMHgwM2MwOiAgNGQ0MSA0YzRjIDNlM2MgMmY1MCAzZTBhIDBhM2MgNDgzMiAzZTQ5CisJMHgwM2QwOiAgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwIDc0NzIgNzk2OSA2ZTY3CisJMHgwM2UwOiAgMjA3NCA2ZjIwIDZjNmYgNjM2MSA3NDY1IDIwNzQgNjg2NSAyMDYxCisJMHgwM2YwOiAgNjQ2ZCA2OTZlIDY5NzMgNzQ3MiA2MTc0IDZmNzIgMjA2ZiA2NjIwCisJMHgwNDAwOiAgNzQ2OCA2OTczIDIwNmQgNjE2MyA2ODY5IDZlNjUgM2MyZiA0ODMyCisJMHgwNDEwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA3NyA2MTZlCisJMHgwNDIwOiAgNzQyMCA3NDZmIDIwNzIgNjU3MCA2ZjcyIDc0MjAgNzM2ZiA2ZDY1CisJMHgwNDMwOiAgNzQ2OCA2OTZlIDY3MjAgNjE2MiA2Zjc1IDc0MjAgNzQ2OCA2OTczCisJMHgwNDQwOiAgMjA2OCA2ZjczIDc0MjcgNzMyMCA2MjY1IDY4NjEgNzY2OSA2ZjcyCisJMHgwNDUwOiAgMmMyMCA3MDZjIDY1NjEgNzM2NSAwYTYzIDZmNmUgNzQ2MSA2Mzc0CisJMHgwNDYwOiAgMjA3NCA2ODY1IDIwNDkgNmU3NCA2NTcyIDZlNjUgNzQyMCA1MzY1CisJMHgwNDcwOiAgNzI3NiA2OTYzIDY1MjAgNTA3MiA2Zjc2IDY5NjQgNjU3MiAyMDI4CisJMHgwNDgwOiAgNDk1MyA1MDI5IDIwNjkgNmU3NiA2ZjZjIDc2NjUgNjQyMCA2NDY5CisJMHgwNDkwOiAgNzI2NSA2Mzc0IDZjNzkgMmUzYyAyZjUwIDNlMGEgMGEzYyA1MDNlCisJMHgwNGEwOiAgNTM2NSA2NTIwIDc0NjggNjUyMCAzYzQxIDIwNjggNzI2NSA2NjNkCisJMHgwNGIwOiAgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE2MiA3NTczCisJMHgwNGMwOiAgNjUyZSA2ZTY1IDc0MmYgMjIzZSA0ZTY1IDc0NzcgNmY3MiA2YjIwCisJMHgwNGQwOiAgNDE2MiA3NTczIDY1MGEgNDM2YyA2NTYxIDcyNjkgNmU2NyA2ODZmCisJMHgwNGUwOiAgNzU3MyA2NTNjIDJmNDEgM2UyMCA2NjZmIDcyMjAgNjg2ZiA3NzIwCisJMHgwNGYwOiAgNzQ2ZiAyMDY0IDZmMjAgNzQ2OCA2OTczIDJlM2MgMmY1MCAzZTBhCisJMHgwNTAwOiAgMGEzYyA0ODMyIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwCisJMHgwNTEwOiAgNzQ2OCA2NTIwIDYxNjQgNmQ2OSA2ZTY5IDczNzQgNzI2MSA3NDZmCisJMHgwNTIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDZkNjEgNjM2OCA2OTZlCisJMHgwNTMwOiAgNjUzYyAyZjQ4IDMyM2UgMGEwYSAzYzUwIDNlNTQgNjg2NSAyMDY5CisJMHgwNTQwOiAgNmU2OSA3NDY5IDYxNmMgMjA2OSA2ZTczIDc0NjEgNmM2YyA2MTc0CisJMHgwNTUwOiAgNjk2ZiA2ZTIwIDZmNjYgMjAzYyA0MTIwIDY4NzIgNjU2NiAzZDIyCisJMHgwNTYwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCisJMHgwNTcwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyNzczCisJMHgwNTgwOiAgMGE2MSA3MDYxIDYzNjggNjUzYyAyZjQxIDNlMjAgNzc2NSA2MjIwCisJMHgwNTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc3CisJMHgwNWEwOiAgNjE3MyAyMDczIDc1NjMgNjM2NSA3MzczIDY2NzUgNmMyZSAzYzJmCisJMHgwNWIwOiAgNTAzZSAwYTBhIDNjNTAgM2UzYyA1MzU0IDUyNGYgNGU0NyAzZTU5CisJMHgwNWMwOiAgNmY3NSAyMDczIDY4NmYgNzU2YyA2NDIwIDcyNjUgNzA2YyA2MTYzCisJMHgwNWQwOiAgNjUyMCA3NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2OSA3NDY4CisJMHgwNWUwOiAgMjA3OSA2Zjc1IDcyMjAgNmY3NyA2ZTIwIDc3NjUgNjIyMCA3MDYxCisJMHgwNWYwOiAgNjc2NSA3MzIwIDYxNzMgMGE3MyA2ZjZmIDZlMjAgNjE3MyAyMDcwCisJMHgwNjAwOiAgNmY3MyA3MzY5IDYyNmMgNjUyZSAzYzJmIDUzNTQgNTI0ZiA0ZTQ3CisJMHgwNjEwOiAgM2UzYyAyZjUwIDNlMGEgMGEzYyA1MDNlIDU1NmUgNmM2NSA3MzczCisJMHgwNjIwOiAgMjA3OSA2Zjc1IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2OSA3NDczCisJMHgwNjMwOiAgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjYxIDc0NjkgNmY2ZSAyYzIwCisJMHgwNjQwOiAgNzk2ZiA3NTcyIDIwNmUgNjU3NyAyMDczIDY1NzIgNzY2NSA3MjIwCisJMHgwNjUwOiAgNjk3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjUgNjQyMCA2MTczCisJMHgwNjYwOiAgMjA2NiA2ZjZjIDZjNmYgNzc3MyAzYTBhIDNjNTUgNGMzZSAwYTNjCisJMHgwNjcwOiAgNGM0OSAzZTBhIDQzNmYgNmU2NiA2OTY3IDc1NzIgNjE3NCA2OTZmCisJMHgwNjgwOiAgNmUyMCA2NjY5IDZjNjUgNzMyMCA2MzYxIDZlMjAgNjI2NSAyMDY2CisJMHgwNjkwOiAgNmY3NSA2ZTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY2NSA3NDYzCisJMHgwNmEwOiAgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjCisJMHgwNmIwOiAgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA1NDU0CisJMHgwNmMwOiAgM2U0NCA2ZjYzIDc1NmQgNjU2ZSA3NDUyIDZmNmYgNzQzYyAyZjU0CisJMHgwNmQwOiAgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwIDY5NzMgMjA3NCA2ODY1CisJMHgwNmUwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNzUgNmU2NCA2NTcyCisJMHgwNmYwOiAgMjA3NyA2ODY5IDYzNjggMjA2MSA2YzZjIDIwNzkgNmY3NSA3MjBhCisJMHgwNzAwOiAgNDg1NCA0ZDRjIDIwNjYgNjk2YyA2NTczIDIwNzMgNjg2ZiA3NTZjCisJMHgwNzEwOiAgNjQyMCA2NTc4IDY5NzMgNzQyYyAyMDY5IDczMjAgNzM2NSA3NDIwCisJMHgwNzIwOiAgNzQ2ZiAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyA3NzNjCisJMHgwNzMwOiAgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlCisJMHgwNzQwOiAgMGE0MyA0NzQ5IDIwNzMgNjM3MiA2OTcwIDc0NzMgMjA2MSA3MjY1CisJMHgwNzUwOiAgMjA2YyA2ZjZmIDZiNjUgNjQyMCA2NjZmIDcyMjAgNjk2ZSAyMDNjCisJMHgwNzYwOiAgNTQ1NCAzZTJmIDc1NzMgNzIyZiA2YzY5IDYyMmYgNjM2NyA2OTJkCisJMHgwNzcwOiAgNjI2OSA2ZTNjIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwCisJMHgwNzgwOiAgNjk3MyAyMDc3IDY4NjUgNzI2NSAwYTQ0IDY1NjIgNjk2MSA2ZTIwCisJMHgwNzkwOiAgNzA2MSA2MzZiIDYxNjcgNjU3MyAyMDc3IDY5NmMgNmMyMCA3MDZjCisJMHgwN2EwOiAgNjE2MyA2NTIwIDc0NjggNjU2OSA3MjIwIDczNjMgNzI2OSA3MDc0CisJMHgwN2IwOiAgNzMyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA0YzZmCisJMHgwN2MwOiAgNjcyMCA2NjY5IDZjNjUgNzMyMCA2MTcyIDY1MjAgNzA2YyA2MTYzCisJMHgwN2QwOiAgNjU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjZjCisJMHgwN2UwOiAgNmY2NyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyYzIwCisJMHgwN2YwOiAgNjE2ZSA2NDIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNzI2ZiA3NDYxCisJMHgwODAwOiAgNzQ2NSA2NDBhIDc3NjUgNjU2YiA2Yzc5IDJlMjAgMjA1NCA2ODY1CisJMHgwODEwOiAgMjA2NiA3MjY1IDcxNzUgNjU2ZSA2Mzc5IDIwNmYgNjYyMCA3MjZmCisJMHgwODIwOiAgNzQ2MSA3NDY5IDZmNmUgMjA2MyA2MTZlIDIwNjIgNjUyMCA2NTYxCisJMHgwODMwOiAgNzM2OSA2Yzc5IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2MiA3OTIwCisJMHgwODQwOiAgNjU2NCA2OTc0IDY5NmUgNjcwYSAzYzU0IDU0M2UgMmY2NSA3NDYzCisJMHgwODUwOiAgMmY2YyA2ZjY3IDcyNmYgNzQ2MSA3NDY1IDJlNjQgMmY2MSA3MDYxCisJMHgwODYwOiAgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhCisJMHgwODcwOiAgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDY0IDY1NjYgNjE3NSA2Yzc0CisJMHgwODgwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNjkgNmU2NCA2NTc4CisJMHgwODkwOiAgMjA2OSA3MzIwIDNjNTQgNTQzZSA2OTZlIDY0NjUgNzgyZSA2ODc0CisJMHgwOGEwOiAgNmQ2YyAzYzJmIDU0NTQgM2UyYyAyMDZkIDY1NjEgNmU2OSA2ZTY3CisJMHgwOGIwOiAgMjA3NCA2ODYxIDc0MjAgNzI2NSA3MTc1IDY1NzMgNzQ3MyAwYTY2CisJMHgwOGMwOiAgNmY3MiAyMDYxIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDNjCisJMHgwOGQwOiAgNTQ1NCAzZTJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgM2MyZiA1NDU0CisJMHgwOGUwOiAgM2UyMCA3NzY5IDZjNmMgMjA2NyA2OTc2IDY1MjAgNzQ2OCA2NTIwCisJMHgwOGYwOiAgNjM2ZiA2ZTc0IDY1NmUgNzQ3MyAyMDZmIDY2MjAgNzQ2OCA2NTIwCisJMHgwOTAwOiAgNjY2OSA2YzY1IDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3CisJMHgwOTEwOiAgNzcyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDY5NmUgNjQ2NSA3ODJlCisJMHgwOTIwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTBhIDY5NjYgMjA2OSA3NDIwCisJMHgwOTMwOiAgNjU3OCA2OTczIDc0NzMgMjAyOCA2MTczIDczNzUgNmQ2OSA2ZTY3CisJMHgwOTQwOiAgMjA3NCA2ODYxIDc0MjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjc3CisJMHgwOTUwOiAgNzc3NyAzYzJmIDU0NTQgM2UyMCA2OTczIDIwNzkgNmY3NSA3MjIwCisJMHgwOTYwOiAgM2M1NCA1NDNlIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNTI2ZiA2Zjc0CisJMHgwOTcwOiAgM2MyZiA1NDU0IDNlMjkgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjCisJMHgwOTgwOiAgNDkzZSAwYTU1IDczNjUgNzIyMCA2NDY5IDcyNjUgNjM3NCA2ZjcyCisJMHgwOTkwOiAgNjk2NSA3MzIwIDYxNzIgNjUyMCA2NTZlIDYxNjIgNmM2NSA2NDJjCisJMHgwOWEwOiAgMjA2MSA2ZTY0IDIwNzUgNzM2NSA3MjIwIDY0NmYgNjM3NSA2ZDY1CisJMHgwOWIwOiAgNmU3NCA3MzIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNmM2ZiA2ZjZiCisJMHgwOWMwOiAgNjU2NCAyMDY2IDZmNzIgMGE2OSA2ZTIwIDc0NjggNjUyMCAzYzU0CisJMHgwOWQwOiAgNTQzZSA3MDc1IDYyNmMgNjk2MyA1ZjY4IDc0NmQgNmMzYyAyZjU0CisJMHgwOWUwOiAgNTQzZSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2ZiA2NjIwCisJMHgwOWYwOiAgNzQ2OCA2NTIwIDc1NzMgNjU3MiA3MzI3IDIwNjggNmY2ZCA2NTczCisJMHgwYTAwOiAgMmUyMCAyMDU0IDY4NjUgNzM2NSAyMDY0IDY5NzIgNzMwYSA3MzY4CisJMHgwYTEwOiAgNmY3NSA2YzY0IDIwNjIgNjUyMCA3NTZlIDY0NjUgNzIyMCAzYzU0CisJMHgwYTIwOiAgNTQzZSAyZjY4IDZmNmQgNjUzYyAyZjU0IDU0M2UgMmMyMCA2MTZlCisJMHgwYTMwOiAgNjQyMCA3NTczIDY1NzIgNzMyMCA3NzY5IDZjNmMgMjA2ZSA2Zjc0CisJMHgwYTQwOiAgMjA2MiA2NTIwIDYxNjIgNmM2NSAyMDc0IDZmMjAgNzM3OSA2ZDZjCisJMHgwYTUwOiAgNjk2ZSA2YjBhIDc0NmYgMjA2NiA2OTZjIDY1NzMgMjA3NCA2ODY1CisJMHgwYTYwOiAgNzkyMCA2NDZmIDZlMjcgNzQyMCA2Zjc3IDZlMmUgM2MyZiA0YzQ5CisJMHgwYTcwOiAgM2UwYSAwYTNjIDJmNTUgNGMzZSAwYTQxIDZjNmMgMjA3NCA2ODY1CisJMHgwYTgwOiAgMjA3MyA3NDYxIDZlNjQgNjE3MiA2NDIwIDYxNzAgNjE2MyA2ODY1CisJMHgwYTkwOiAgMjA2ZCA2ZjY0IDc1NmMgNjU3MyAyMDYxIDcyNjUgMjA2MSA3NjYxCisJMHgwYWEwOiAgNjk2YyA2MTYyIDZjNjUgMjA3NyA2OTc0IDY4MjAgNzQ2OCA2OTczCisJMHgwYWIwOiAgMjA3MiA2NTZjIDY1NjEgNzM2NSAyMDYxIDZlNjQgMjA2MSA3MjY1CisJMHgwYWMwOiAgMGE2ZSA2Zjc3IDIwNmQgNjE2ZSA2MTY3IDY1NjQgMjA3NyA2OTc0CisJMHgwYWQwOiAgNjgyMCA2NDY1IDYyNjMgNmY2ZSA2NjJlIDIwMjAgNTQ3OSA3MDY1CisJMHgwYWUwOiAgMjAzYyA1NDU0IDNlNjQgNzA2YiA2NzJkIDcyNjUgNjM2ZiA2ZTY2CisJMHgwYWYwOiAgNjk2NyA3NTcyIDY1MjAgNjE3MCA2MTYzIDY4NjUgM2MyZiA1NDU0CisJMHgwYjAwOiAgM2UyMCA3NDZmIDBhNzMgNjU2YyA2NTYzIDc0MjAgNzc2OCA2OTYzCisJMHgwYjEwOiAgNjgyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwIDc5NmYgNzUyMCA3NzYxCisJMHgwYjIwOiAgNmU3NCAyMDY1IDZlNjEgNjI2YyA2NTY0IDJlMjAgMjA0ZCA2MTZlCisJMHgwYjMwOiAgNzkyMCA2Zjc0IDY4NjUgNzIyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwCisJMHgwYjQwOiAgNjE3MiA2NTIwIDYxNzYgNjE2OSA2YzYxIDYyNmMgNjUwYSA3NDY4CisJMHgwYjUwOiAgNzI2ZiA3NTY3IDY4MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlCisJMHgwYjYwOiAgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDczIDc5NzMgNzQ2NSA2ZDIwCisJMHgwYjcwOiAgNzc2OSA3NDY4IDIwNzQgNjg2NSAyMDZlIDYxNmQgNjU3MyAyMDNjCisJMHgwYjgwOiAgNTQ1NCAzZTZjIDY5NjIgNjE3MCA2MTYzIDY4NjUgMmQ2ZCA2ZjY0CisJMHgwYjkwOiAgMmQyYSAzYzJmIDU0NTQgM2UyZSAwYTQ5IDY2MjAgNzk2ZiA3NTIwCisJMHgwYmEwOiAgNmU2NSA2NTY0IDIwNzQgNmYyMCA2MzZmIDZkNzAgNjk2YyA2NTIwCisJMHgwYmIwOiAgNjEyMCA2ZDZmIDY0NzUgNmM2NSAyMDc5IDZmNzUgNzI3MyA2NTZjCisJMHgwYmMwOiAgNjYyYyAyMDc5IDZmNzUgMjA3NyA2OTZjIDZjMjAgNmU2NSA2NTY0CisJMHgwYmQwOiAgMjA3NCA2ZjIwIDY5NmUgNzM3NCA2MTZjIDZjMjAgNzQ2OCA2NTBhCisJMHgwYmUwOiAgM2M1NCA1NDNlIDYxNzAgNjE2MyA2ODY1IDJkNjQgNjU3NiAzYzJmCisJMHgwYmYwOiAgNTQ1NCAzZTIwIDcwNjEgNjM2YiA2MTY3IDY1MmUgMGEwYSAzYzUwCisJMHgwYzAwOiAgM2U0ZCA2ZjcyIDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0CisJMHgwYzEwOiAgNjk2ZiA2ZTIwIDZmNmUgMjA0MSA3MDYxIDYzNjggNjUyMCA2MzYxCisJMHgwYzIwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNmYgNmUzYSAwYTNjCisJMHgwYzMwOiAgNTU0YyAzZTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA0MTIwCisJMHgwYzQwOiAgNDg1MiA0NTQ2IDNkMjIgMmY2NCA2ZjYzIDJmNjEgNzA2MSA2MzY4CisJMHgwYzUwOiAgNjUyZCA2NDZmIDYzMmYgNmQ2MSA2ZTc1IDYxNmMgMmYyMiAzZTQxCisJMHgwYzYwOiAgNzA2MSA2MzY4IDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0CisJMHgwYzcwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3Mzc0IDZmNzIgNjU2NCAyMDZmCisJMHgwYzgwOiAgNmUyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyZSAzYzJmCisJMHgwYzkwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxCisJMHgwY2EwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3CisJMHgwY2IwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTQxCisJMHgwY2MwOiAgNzA2MSA2MzY4IDY1MjAgNTA3MiA2ZjZhIDY1NjMgNzQzYyAyZjQxCisJMHgwY2QwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5CisJMHgwY2UwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4CisJMHgwY2YwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCisJMHgwZDAwOiAgNjE3MCA2MTYzIDY4NjUgMmQ3MyA3MzZjIDJlNmYgNzI2NyAyZjIyCisJMHgwZDEwOiAgM2U0MSA3MDYxIDYzNjggNjUyZCA1MzUzIDRjM2MgMmY0MSAzZTIwCisJMHgwZDIwOiAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAzZTBhCisJMHgwZDMwOiAgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1CisJMHgwZDQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDcwNjUgNzI2YyAyZTYxCisJMHgwZDUwOiAgNzA2MSA2MzY4IDY1MmUgNmY3MiA2NzJmIDIyM2UgNmQ2ZiA2NDIwCisJMHgwZDYwOiAgNzA2NSA3MjZjIDNjMmYgNDEzZSAyMDY4IDZmNmQgNjUyMCA3MzY5CisJMHgwZDcwOiAgNzQ2NSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0CisJMHgwZDgwOiAgNjg2NSAyMDNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCisJMHgwZDkwOiAgM2EyZiAyZjc3IDc3NzcgMmU2MSA3MDYxIDYzNjggNjU3NyA2NTY1CisJMHgwZGEwOiAgNmIyZSA2MzZmIDZkMmYgMjIzZSA0MTcwIDYxNjMgNjg2NSA1NzY1CisJMHgwZGIwOiAgNjU2YiAzYzJmIDQxM2UgMjA2ZSA2NTc3IDczNmMgNjU3NCA3NDY1CisJMHgwZGMwOiAgNzIyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4CisJMHgwZGQwOiAgNjUyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCisJMHgwZGUwOiAgMmYyZiA3Nzc3IDc3MmUgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3CisJMHgwZGYwOiAgMmY2NCA2ZjYzIDJmMjIgM2U0NCA2NTYyIDY5NjEgNmUyMCA1MDcyCisJMHgwZTAwOiAgNmY2YSA2NTYzIDc0MGEgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0CisJMHgwZTEwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3NzY4IDY5NjMgNjgyMCA2MzZmCisJMHgwZTIwOiAgNmU3NCA2MTY5IDZlNzMgMjA0OCA0ZjU3IDU0NGYgNzMyYyAyMDQ2CisJMHgwZTMwOiAgNDE1MSA3MzJjIDIwNjEgNmU2NCAyMDczIDZmNjYgNzQ3NyA2MTcyCisJMHgwZTQwOiAgNjUyMCA3NTcwIDY0NjEgNzQ2NSA3MzJlIDNjMmYgNGM0OSAzZTBhCisJMHgwZTUwOiAgM2MyZiA1NTRjIDNlMGEgMGEzYyA1MDNlIDU5NmYgNzUyMCA2MzYxCisJMHgwZTYwOiAgNmUyMCA2MTZjIDczNmYgMjA2MyA2ZjZlIDczNzUgNmM3NCAyMDc0CisJMHgwZTcwOiAgNjg2NSAyMDZjIDY5NzMgNzQyMCA2ZjY2IDIwM2MgNDEyMCA0ODUyCisJMHgwZTgwOiAgNDU0NiAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYyCisJMHgwZTkwOiAgNmY3NSA3NDY1IDZjNmMgMmU2MyA2ZjZkIDJmNjYgNjE3MSAyZjIyCisJMHgwZWEwOiAgM2U1NyA2ZjcyIDZjNjQgMGE1NyA2OTY0IDY1MjAgNTc2NSA2MjIwCisJMHgwZWIwOiAgNDY3MiA2NTcxIDc1NjUgNmU3NCA2Yzc5IDIwNDEgNzM2YiA2NTY0CisJMHgwZWMwOiAgMjA1MSA3NTY1IDczNzQgNjk2ZiA2ZTczIDNjMmYgNDEzZSAyMDY2CisJMHgwZWQwOiAgNmY3MiAyMDY5IDZlNjYgNmY3MiA2ZDYxIDc0NjkgNmY2ZSAyZTBhCisJMHgwZWUwOiAgMGEzYyA0ODMyIDNlNGMgNjU3NCAyMDZmIDc0NjggNjU3MiAyMDcwCisJMHgwZWYwOiAgNjU2ZiA3MDZjIDY1MjAgNmI2ZSA2Zjc3IDIwNjEgNjI2ZiA3NTc0CisJMHgwZjAwOiAgMjA3NCA2ODY5IDczMjAgNzM2NSA3Mjc2IDY1NzIgM2MyZiA0ODMyCisJMHgwZjEwOiAgM2UwYSAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCisJMHgwZjIwOiAgM2EyZiAyZjZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmCisJMHgwZjMwOiAgMjIzZSA0ZTY1IDc0NjMgNzI2MSA2Njc0IDNjMmYgNDEzZSAyMDcwCisJMHgwZjQwOiAgNzI2ZiA3NjY5IDY0NjUgNzMyMCA2MTZlIDIwNjkgNmU3NCA2NTcyCisJMHgwZjUwOiAgNjU3MyA3NDY5IDZlNjcgMjA2NiA3MjY1IDY1MGEgNzM2NSA3Mjc2CisJMHgwZjYwOiAgNjk2MyA2NTIwIDY2NmYgNzIyMCA3NzY1IDYyMjAgNzM2OSA3NDY1CisJMHgwZjcwOiAgMjA2ZCA2ZjZlIDY5NzQgNmY3MiA2OTZlIDY3MjAgNjE2ZSA2NDIwCisJMHgwZjgwOiAgNzM3NCA2MTc0IDY5NzMgNzQ2OSA2MzIwIDYzNmYgNmM2YyA2NTYzCisJMHgwZjkwOiAgNzQ2OSA2ZjZlIDJlMGEgNTk2ZiA3NTIwIDYzNjEgNmUyMCA2YzY1CisJMHgwZmEwOiAgNzQyMCA3NDY4IDY1NmQgMjA2YiA2ZTZmIDc3MjAgNjE2MiA2Zjc1CisJMHgwZmIwOiAgNzQyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NTczCisJMHgwZmMwOiAgNjk2ZSA2NzIwIDc0NjggNjU2OSA3MjBhIDNjNDEgMjA0OCA1MjQ1CisJMHgwZmQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc1NzAgNzQ2OSA2ZDY1CisJMHgwZmUwOiAgMmU2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAyMjNlCisJMHgwZmYwOiAgNjk2ZSA3NDY1IDcyNjYgNjE2MyA2NTNjIDJmNDEgM2UyZSAwYTQ1CisJMHgxMDAwOiAgNmU2MSA2MjZjIDY5NmUgNjcyMCA3NDY4IDY1MjAgNmQ2ZiA2ZTY5CisJMHgxMDEwOiAgNzQ2ZiA3MjY5IDZlNjcgMjA2ZiA2NjIwIDc5NmYgNzU3MiAyMDczCisJMHgxMDIwOiAgNjU3MiA3NjY1IDcyMjAgNzc2OSA2YzZjIDIwNzAgNzI2ZiA3NjY5CisJMHgxMDMwOiAgNjQ2NSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMjAgNjc2YyA2ZjYyCisJMHgxMDQwOiAgNjE2YyAyMDZmIDc2NjUgNzI3NiA2OTY1IDc3MGEgNmY2NiAyMDc3CisJMHgxMDUwOiAgNjg2ZiAyMDY5IDczMjAgNzU3MyA2OTZlIDY3MjAgNzc2OCA2MTc0CisJMHgxMDYwOiAgMjA2MSA2ZTY0IDIwNzcgNjg2NSA3MjY1IDJjMjAgNjE2ZSA2NDIwCisJMHgxMDcwOiAgNjk3NCAyMDc3IDZmNzUgNmM2NCAyMDY3IDY5NzYgNjUyMCA0NDY1CisJMHgxMDgwOiAgNjI2OSA2MTZlIDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIwYSA2Zjc2CisJMHgxMDkwOiAgNjU3MiA3NjY5IDY1NzcgMjA2ZiA2NjIwIDc0NjggNjUyMCA2MTcwCisJMHgxMGEwOiAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NSA3MzYxCisJMHgxMGIwOiAgNjc2NSAyZTBhIDBhM2MgNDgzMiAzZTQxIDYyNmYgNzU3NCAyMDc0CisJMHgxMGMwOiAgNjg2OSA3MzIwIDcwNjEgNjc2NSAzYzJmIDQ4MzIgM2UwYSAwYTNjCisJMHgxMGQwOiAgNDk0ZCA0NzIwIDQxNGMgNDk0NyA0ZTNkIDIyNzIgNjk2NyA2ODc0CisJMHgxMGUwOiAgMjIyMCA0MTRjIDU0M2QgMjIyMiAyMDQ4IDQ1NDkgNDc0OCA1NDNkCisJMHgxMGYwOiAgMjIzMiAzNDM3IDIyMjAgNTc0OSA0NDU0IDQ4M2QgMjIzMiAzNzM4CisJMHgxMTAwOiAgMjIyMCA1MzUyIDQzM2QgMjI2OSA2MzZmIDZlNzMgMmY2YSA2ODY1CisJMHgxMTEwOiAgMzAzNiAzMTJlIDcwNmUgNjcyMiAzZTBhIDBhM2MgNTAzZSA1NDY4CisJMHgxMTIwOiAgNjk3MyAyMDY5IDczMjAgNjEyMCA3MDZjIDYxNjMgNjU2OCA2ZjZjCisJMHgxMTMwOiAgNjQ2NSA3MjIwIDcwNjEgNjc2NSAyMDY5IDZlNzMgNzQ2MSA2YzZjCisJMHgxMTQwOiAgNjU2NCAyMDYyIDc5MjAgNzQ2OCA2NTIwIDNjNDEgMGE0OCA1MjQ1CisJMHgxMTUwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1CisJMHgxMTYwOiAgNjI2OSA2MTZlIDJlNmYgNzI2NyAyZjIyIDNlNDQgNjU2MiA2OTYxCisJMHgxMTcwOiAgNmUzYyAyZjQxIDNlMGEgNzI2NSA2YzY1IDYxNzMgNjUyMCA2ZjY2CisJMHgxMTgwOiAgMjA3NCA2ODY1IDIwNjEgNzA2MSA2MzY4IDY1MjAgNTc2NSA2MjIwCisJMHgxMTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyZTBhCisJMHgxMWEwOiAgMGEzYyA1MDNlIDU0NjggNjk3MyAyMDYzIDZmNmQgNzA3NSA3NDY1CisJMHgxMWIwOiAgNzIyMCA2ODYxIDczMjAgNjk2ZSA3Mzc0IDYxNmMgNmM2NSA2NDIwCisJMHgxMWMwOiAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlIDIwNDcgNGU1NSAyZjRjCisJMHgxMWQwOiAgNjk2ZSA3NTc4IDIwNmYgNzA2NSA3MjYxIDc0NjkgNmU2NyAyMDczCisJMHgxMWUwOiAgNzk3MyA3NDY1IDZkMmMgMGE2MiA3NTc0IDIwNjkgNzQyMCA2ODYxCisJMHgxMWYwOiAgNzMyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQ2OCA2OTZlCisJMHgxMjAwOiAgNjcyMCA3NDZmIDIwNjQgNmYyMCA3NzY5IDc0NjggMjA3NCA2ODY1CisJMHgxMjEwOiAgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgNjU2MyA3NDNjCisJMHgxMjIwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyZTIwIDUwNmMgNjU2MSA3MzY1CisJMHgxMjMwOiAgMjA2NCA2ZjIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDNjCisJMHgxMjQwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyMDYzIDZmNmUgNzQ2MSA2Mzc0CisJMHgxMjUwOiAgMjA3NCA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhCisJMHgxMjYwOiAgNjU2MyA3NDIwIDYxNjIgNmY3NSA3NDIwIDY5NzQgMmUzYyAyZjUwCisJMHgxMjcwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA2NiA2OTZlCisJMHgxMjgwOiAgNjQyMCA2MTIwIDYyNzUgNjcyMCA2OTZlIDIwNzQgNjg2OSA3MzIwCisJMHgxMjkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyYzIwCisJMHgxMmEwOiAgNmY3MiAyMDY5IDZlMjAgNDE3MCA2MTYzIDY4NjUgMjA2OSA3NDczCisJMHgxMmIwOiAgNjU2YyA2NjJjIDBhNzAgNmM2NSA2MTczIDY1MjAgNjY2OSA2YzY1CisJMHgxMmMwOiAgMjA2MSAyMDYyIDc1NjcgMjA3MiA2NTcwIDZmNzIgNzQyMCA2ZjZlCisJMHgxMmQwOiAgMjA2OSA3NDJlIDIwMjAgNDk2ZSA3Mzc0IDcyNzUgNjM3NCA2OTZmCisJMHgxMmUwOiAgNmU3MyAyMDZmIDZlMjAgNjQ2ZiA2OTZlIDY3MjAgNzQ2OCA2OTczCisJMHgxMmYwOiAgMmMyMCA2MTZlIDY0MjAgNzQ2OCA2NTBhIDZjNjkgNzM3NCAyMDZmCisJMHgxMzAwOiAgNjYyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCisJMHgxMzEwOiAgMmYyZiA2Mjc1IDY3NzMgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCisJMHgxMzIwOiAgNjcyZiA3MzcyIDYzM2EgNjE3MCA2MTYzIDY4NjUgMjIzZSA2YjZlCisJMHgxMzMwOiAgNmY3NyA2ZTIwIDYyNzUgNjc3MyAzYzJmIDQxM2UgMjA2ZiA2NjIwCisJMHgxMzQwOiAgNzQ2OCA2OTczIDBhNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCA2MzYxCisJMHgxMzUwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMCA3NDY4CisJMHgxMzYwOiAgNjUyMCAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCisJMHgxMzcwOiAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCisJMHgxMzgwOiAgNjcyZiA0Mjc1IDY3NzMgMmY1MiA2NTcwIDZmNzIgNzQ2OSA2ZTY3CisJMHgxMzkwOiAgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyMDQyIDc1NjcgMjA1NCA3MjYxCisJMHgxM2EwOiAgNjM2YiA2OTZlIDY3MjAgNTM3OSA3Mzc0IDY1NmQgM2MyZiA0MTNlCisJMHgxM2IwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2MTZlIDZiNzMgMjA2NiA2ZjcyCisJMHgxM2MwOiAgMjA3NSA3MzY5IDZlNjcgMjA3NCA2ODY5IDczMjAgNzA2MSA2MzZiCisJMHgxM2QwOiAgNjE2NyA2NTJjIDIwNjEgNmU2NCAyMDYzIDZmNmUgNjc3MiA2MTc0CisJMHgxM2UwOiAgNzU2YyA2MTc0IDY5NmYgNmU3MyAyMDY2IDZmNzIgMjA3OSA2Zjc1CisJMHgxM2YwOiAgNzIyMCA2MzY4IDZmNjkgNjM2NSAyMDZmIDY2MGEgNjEyMCA0NDY1CisJMHgxNDAwOiAgNjI2OSA2MTZlIDIwNzMgNzk3MyA3NDY1IDZkMjEgM2MyZiA1MDNlCisJMHgxNDEwOiAgMGEwYSAzYzQ0IDQ5NTYgMjA2MSA2YzY5IDY3NmUgM2QyMiA2MzY1CisJMHgxNDIwOiAgNmU3NCA2NTcyIDIyM2UgMGEzYyA2MTIwIDY4NzIgNjU2NiAzZDIyCisJMHgxNDMwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCisJMHgxNDQwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSAwYTNjIDQ5NGQgNDcyMCA2MTZjCisJMHgxNDUwOiAgNjk2NyA2ZTNkIDIyNmQgNjk2NCA2NDZjIDY1MjIgMjA2OCA2NTY5CisJMHgxNDYwOiAgNjc2OCA3NDNkIDIyMzMgMzAyMiAyMDc3IDY5NjQgNzQ2OCAzZDIyCisJMHgxNDcwOiAgMzIzNSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgNmU3MyAyZjY0CisJMHgxNDgwOiAgNjU2MiA2OTYxIDZlMmYgNmY3MCA2NTZlIDZjNmYgNjc2ZiAyZDMyCisJMHgxNDkwOiAgMzUyZSA2YTcwIDY3MjIgMjA2MSA2Yzc0IDNkMjIgNDQ2NSA2MjY5CisJMHgxNGEwOiAgNjE2ZSAyMjNlIDBhM2MgMmY2MSAzZTBhIDNjNjEgMjA2OCA3MjY1CisJMHgxNGIwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTcwCisJMHgxNGMwOiAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlMGEgM2M0OSA0ZDQ3CisJMHgxNGQwOiAgMjA2MSA2YzY5IDY3NmUgM2QyMiA2ZDY5IDY0NjQgNmM2NSAyMjIwCisJMHgxNGUwOiAgNjg2NSA2OTY3IDY4NzQgM2QyMiAzMzMyIDIyMjAgNzc2OSA2NDc0CisJMHgxNGYwOiAgNjgzZCAyMjMyIDM1MzkgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmCisJMHgxNTAwOiAgNmU3MyAyZjYxIDcwNjEgNjM2OCA2NTVmIDcwNjIgMmU3MCA2ZTY3CisJMHgxNTEwOiAgMjIyMCA2MTZjIDc0M2QgMjI0MSA3MDYxIDYzNjggNjUyMiAzZTBhCisJMHgxNTIwOiAgM2MyZiA2MTNlIDBhM2MgMmY0NCA0OTU2IDNlMGEgMGEzYyAyMTJkCisJMHgxNTMwOiAgMmQwYSAyMDIwIDU0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzYxCisJMHgxNTQwOiAgNzMyMCA2OTZlIDY5NzQgNjk2MSA2YzZjIDc5MjAgNjM3MiA2NTYxCisJMHgxNTUwOiAgNzQ2NSA2NDIwIDYyNzkgMjA0YSA2ZjY4IDZlNjkgNjUyMCA0OTZlCisJMHgxNTYwOiAgNjc3MiA2MTZkIDIwMjggNjg3NCA3NDcwIDNhMmYgMmY2ZSA2NTc0CisJMHgxNTcwOiAgNjc2ZiA2NDJlIDZlNjUgNzQyZiAyOTBhIDIwMjAgNDk3NCAyMDc3CisJMHgxNTgwOiAgNjE3MyAyMDZjIDYxNzQgNjU3MiAyMDY1IDY0NjkgNzQ2NSA2NDIwCisJMHgxNTkwOiAgNjI3OSAyMDRkIDYxNzQgNzQ2OCA2NTc3IDIwNTcgNjk2YyA2MzZmCisJMHgxNWEwOiAgNzgyMCA2MTZlIDY0MjAgNGE2ZiA3MzY5IDcwMjAgNTI2ZiA2NDY5CisJMHgxNWIwOiAgNmUyZSAwYTIwIDIwNGMgNjE3MyA3NDIwIDZkNmYgNjQ2OSA2NjY5CisJMHgxNWMwOiAgNjU2NCAzYTIwIDI0NDQgNjE3NCA2NTNhIDIwMzIgMzAzMCAzNDJmCisJMHgxNWQwOiAgMzAzNiAyZjMyIDMwMjAgMzEzNSAzYTMzIDMzM2EgMzUzNyAyMDI0CisJMHgxNWUwOiAgMmUwYSAyMDIwIDJkMmQgM2UwYSAwYTNjIDJmNDIgNGY0NCA1OTNlCisJMHgxNWYwOiAgMGEzYyAyZjQ4IDU0NGQgNGMzZSAwYQorMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KKwkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKKwkweDAwMTA6ICAwMDM0IDFiNmUgNDAwMCA0MDA2IDIxNTQgN2YwMCAwMDAxIDdmMDAKKwkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTAKKwkweDAwMzA6ICAzMDVmIDEwZWEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5IDRkZGMKKwkweDAwNDA6ICA5MjE5CisyMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCisJMHgwMDEwOiAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSA3ZjAwCisJMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDExCisJMHgwMDMwOiAgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSA0ZGRjCisJMHgwMDQwOiAgOTIxOQorMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgorCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAorCTB4MDAxMDogIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgN2YwMAorCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgODAxMQorCTB4MDAzMDogIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYworCTB4MDA0MDogIDk3MjEKKzIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+CisJMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCisJMHgwMDEwOiAgMDAzNCAxYjcyIDQwMDAgNDAwNiAyMTUwIDdmMDAgMDAwMSA3ZjAwCisJMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTRhIDM3N2EgYTNhYSA4MDEwCisJMHgwMDMwOiAgMzA1ZiAwNmQ0IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjCisJMHgwMDQwOiAgOTcyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnN2cC1pbmZpbml0ZS1sb29wLnBjYXAgYi90ZXN0cy9yc3ZwLWluZmluaXRlLWxvb3AucGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAzZGFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcnN2cC1pbmZpbml0ZS1sb29wLnBjYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGZ0cC5oIGIvdGZ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDgzMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZnRwLmgKQEAgLTAsMCArMSw4MiBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90ZnRwLmgsdiAxLjEuMi4xIDIwMDcvMDkvMTQgMDE6MDM6MTIgZ3V5IEV4cCAkIChMQkwpICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0ZnRwLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfVEZUUF9IXworI2RlZmluZQlfVEZUUF9IXworCisvKgorICogVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIChJRU4tMTMzKQorICovCisjZGVmaW5lCVNFR1NJWkUJCTUxMgkJLyogZGF0YSBzZWdtZW50IHNpemUgKi8KKworLyoKKyAqIFBhY2tldCB0eXBlcy4KKyAqLworI2RlZmluZQlSUlEJMDEJCQkvKiByZWFkIHJlcXVlc3QgKi8KKyNkZWZpbmUJV1JRCTAyCQkJLyogd3JpdGUgcmVxdWVzdCAqLworI2RlZmluZQlEQVRBCTAzCQkJLyogZGF0YSBwYWNrZXQgKi8KKyNkZWZpbmUJQUNLCTA0CQkJLyogYWNrbm93bGVkZ2VtZW50ICovCisjZGVmaW5lCUVSUk9SCTA1CQkJLyogZXJyb3IgY29kZSAqLworI2RlZmluZSBPQUNLCTA2CQkJLyogb3B0aW9uIGFja25vd2xlZGdlbWVudCAqLworCitzdHJ1Y3QJdGZ0cGhkciB7CisJdW5zaWduZWQgc2hvcnQJdGhfb3Bjb2RlOwkJLyogcGFja2V0IHR5cGUgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIHNob3J0CXR1X2Jsb2NrOwkvKiBibG9jayAjICovCisJCXVuc2lnbmVkIHNob3J0CXR1X2NvZGU7CS8qIGVycm9yIGNvZGUgKi8KKwkJY2hhcgl0dV9zdHVmZlsxXTsJLyogcmVxdWVzdCBwYWNrZXQgc3R1ZmYgKi8KKwl9IHRoX3U7CisJY2hhcgl0aF9kYXRhWzFdOwkJLyogZGF0YSBvciBlcnJvciBzdHJpbmcgKi8KK307CisKKyNkZWZpbmUJdGhfYmxvY2sJdGhfdS50dV9ibG9jaworI2RlZmluZQl0aF9jb2RlCQl0aF91LnR1X2NvZGUKKyNkZWZpbmUJdGhfc3R1ZmYJdGhfdS50dV9zdHVmZgorI2RlZmluZQl0aF9tc2cJCXRoX2RhdGEKKworLyoKKyAqIEVycm9yIGNvZGVzLgorICovCisjZGVmaW5lCUVVTkRFRgkJMAkJLyogbm90IGRlZmluZWQgKi8KKyNkZWZpbmUJRU5PVEZPVU5ECTEJCS8qIGZpbGUgbm90IGZvdW5kICovCisjZGVmaW5lCUVBQ0NFU1MJCTIJCS8qIGFjY2VzcyB2aW9sYXRpb24gKi8KKyNkZWZpbmUJRU5PU1BBQ0UJMwkJLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUJRUJBRE9QCQk0CQkvKiBpbGxlZ2FsIFRGVFAgb3BlcmF0aW9uICovCisjZGVmaW5lCUVCQURJRAkJNQkJLyogdW5rbm93biB0cmFuc2ZlciBJRCAqLworI2RlZmluZQlFRVhJU1RTCQk2CQkvKiBmaWxlIGFscmVhZHkgZXhpc3RzICovCisjZGVmaW5lCUVOT1VTRVIJCTcJCS8qIG5vIHN1Y2ggdXNlciAqLworCisjZW5kaWYgLyogIV9URlRQX0hfICovCmRpZmYgLS1naXQgYS90aW1lZC5oIGIvdGltZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVjNWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGltZWQuaApAQCAtMCwwICsxLDkyIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RpbWVkLmgsdiAxLjUgMjAwMi8xMi8xMSAwNzoxNDoxMiBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRpbWVkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZglfUFJPVE9DT0xTX1RJTUVEX0hfCisjZGVmaW5lCV9QUk9UT0NPTFNfVElNRURfSF8KKworLyoKKyAqIFRpbWUgU3luY2hyb25pemF0aW9uIFByb3RvY29sCisgKi8KKworI2RlZmluZQlUU1BWRVJTSU9OCTEKKyNkZWZpbmUgQU5ZQUREUiAJTlVMTAorCitzdHJ1Y3QgdHNwIHsKKwl1X2ludDhfdAl0c3BfdHlwZTsKKwl1X2ludDhfdAl0c3BfdmVyczsKKwl1X2ludDE2X3QJdHNwX3NlcTsKKwl1bmlvbiB7CisJCXN0cnVjdCB0aW1ldmFsIHRzcHVfdGltZTsKKwkJaW50OF90IHRzcHVfaG9wY250OworCX0gdHNwX3U7CisJaW50OF90IHRzcF9uYW1lWzI1Nl07Cit9OworCisjZGVmaW5lCXRzcF90aW1lCXRzcF91LnRzcHVfdGltZQorI2RlZmluZQl0c3BfaG9wY250CXRzcF91LnRzcHVfaG9wY250CisKKy8qCisgKiBDb21tYW5kIHR5cGVzLgorICovCisjZGVmaW5lCVRTUF9BTlkJCQkwCS8qIG1hdGNoIGFueSB0eXBlcyAqLworI2RlZmluZQlUU1BfQURKVElNRQkJMQkvKiBzZW5kIGFkanRpbWUgKi8KKyNkZWZpbmUJVFNQX0FDSwkJCTIJLyogZ2VuZXJpYyBhY2tub3dsZWRnZW1lbnQgKi8KKyNkZWZpbmUJVFNQX01BU1RFUlJFUQkJMwkvKiBhc2sgZm9yIG1hc3RlcidzIG5hbWUgKi8KKyNkZWZpbmUJVFNQX01BU1RFUkFDSwkJNAkvKiBhY2tub3dsZWRnZSBtYXN0ZXIgcmVxdWVzdCAqLworI2RlZmluZQlUU1BfU0VUVElNRQkJNQkvKiBzZW5kIG5ldHdvcmsgdGltZSAqLworI2RlZmluZQlUU1BfTUFTVEVSVVAJCTYJLyogaW5mb3JtIHNsYXZlcyB0aGF0IG1hc3RlciBpcyB1cCAqLworI2RlZmluZQlUU1BfU0xBVkVVUAkJNwkvKiBzbGF2ZSBpcyB1cCBidXQgbm90IHBvbGxlZCAqLworI2RlZmluZQlUU1BfRUxFQ1RJT04JCTgJLyogYWR2YW5jZSBjYW5kaWRhdHVyZSBmb3IgbWFzdGVyICovCisjZGVmaW5lCVRTUF9BQ0NFUFQJCTkJLyogc3VwcG9ydCBjYW5kaWRhdHVyZSBvZiBtYXN0ZXIgKi8KKyNkZWZpbmUJVFNQX1JFRlVTRQkJMTAJLyogcmVqZWN0IGNhbmRpZGF0dXJlIG9mIG1hc3RlciAqLworI2RlZmluZQlUU1BfQ09ORkxJQ1QJCTExCS8qIHR3byBvciBtb3JlIG1hc3RlcnMgcHJlc2VudCAqLworI2RlZmluZQlUU1BfUkVTT0xWRQkJMTIJLyogbWFzdGVycycgY29uZmxpY3QgcmVzb2x1dGlvbiAqLworI2RlZmluZQlUU1BfUVVJVAkJMTMJLyogcmVqZWN0IGNhbmRpZGF0dXJlIGlmIG1hc3RlciBpcyB1cCAqLworI2RlZmluZQlUU1BfREFURQkJMTQJLyogcmVzZXQgdGhlIHRpbWUgKGRhdGUgY29tbWFuZCkgKi8KKyNkZWZpbmUJVFNQX0RBVEVSRVEJCTE1CS8qIHJlbW90ZSByZXF1ZXN0IHRvIHJlc2V0IHRoZSB0aW1lICovCisjZGVmaW5lCVRTUF9EQVRFQUNLCQkxNgkvKiBhY2tub3dsZWRnZSB0aW1lIHNldHRpbmcgICovCisjZGVmaW5lCVRTUF9UUkFDRU9OCQkxNwkvKiB0dXJuIHRyYWNpbmcgb24gKi8KKyNkZWZpbmUJVFNQX1RSQUNFT0ZGCQkxOAkvKiB0dXJuIHRyYWNpbmcgb2ZmICovCisjZGVmaW5lCVRTUF9NU0lURQkJMTkJLyogZmluZCBvdXQgbWFzdGVyJ3Mgc2l0ZSAqLworI2RlZmluZQlUU1BfTVNJVEVSRVEJCTIwCS8qIHJlbW90ZSBtYXN0ZXIncyBzaXRlIHJlcXVlc3QgKi8KKyNkZWZpbmUJVFNQX1RFU1QJCTIxCS8qIGZvciB0ZXN0aW5nIGVsZWN0aW9uIGFsZ28gKi8KKyNkZWZpbmUJVFNQX1NFVERBVEUJCTIyCS8qIE5ldyBmcm9tIGRhdGUgY29tbWFuZCAqLworI2RlZmluZQlUU1BfU0VUREFURVJFUQkJMjMJLyogTmV3IHJlbW90ZSBmb3IgYWJvdmUgKi8KKyNkZWZpbmUJVFNQX0xPT1AJCTI0CS8qIGxvb3AgZGV0ZWN0aW9uIHBhY2tldCAqLworCisjZGVmaW5lCVRTUFRZUEVOVU1CRVIJCTI1CisKKyNlbmRpZiAvKiAhX1RJTUVEX0hfICovCmRpZmYgLS1naXQgYS90b2tlbi5oIGIvdG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTdmZDZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9rZW4uaApAQCAtMCwwICsxLDUyIEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3Rva2VuLmgsdiAxLjYgMjAwMi8xMi8xMSAwNzoxNDoxMiBndXkgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIExhcnJ5IExpbGUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlIHVubW9kaWZpZWQsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjZGVmaW5lIFRPS0VOX0hEUkxFTgkJMTQKKyNkZWZpbmUgVE9LRU5fUklOR19NQUNfTEVOCTYKKyNkZWZpbmUgUk9VVElOR19TRUdNRU5UX01BWAkxNgorI2RlZmluZSBJU19TT1VSQ0VfUk9VVEVEKHRycCkJKCh0cnApLT50b2tlbl9zaG9zdFswXSAmIDB4ODApCisjZGVmaW5lIEZSQU1FX1RZUEUodHJwKQkJKCgodHJwKS0+dG9rZW5fZmMgJiAweEMwKSA+PiA2KQorI2RlZmluZSBUT0tFTl9GQ19MTEMJCTEKKworI2RlZmluZSBCUk9BRENBU1QodHJwKQkJKChudG9ocygodHJwKS0+dG9rZW5fcmNmKSAmIDB4RTAwMCkgPj4gMTMpCisjZGVmaW5lIFJJRl9MRU5HVEgodHJwKQkJKChudG9ocygodHJwKS0+dG9rZW5fcmNmKSAmIDB4MWYwMCkgPj4gOCkKKyNkZWZpbmUgRElSRUNUSU9OKHRycCkJCSgobnRvaHMoKHRycCktPnRva2VuX3JjZikgJiAweDAwODApID4+IDcpCisjZGVmaW5lIExBUkdFU1RfRlJBTUUodHJwKQkoKG50b2hzKCh0cnApLT50b2tlbl9yY2YpICYgMHgwMDcwKSA+PiA0KQorI2RlZmluZSBSSU5HX05VTUJFUih0cnAsIHgpCSgobnRvaHMoKHRycCktPnRva2VuX3JzZWdbeF0pICYgMHhmZmYwKSA+PiA0KQorI2RlZmluZSBCUklER0VfTlVNQkVSKHRycCwgeCkJKChudG9ocygodHJwKS0+dG9rZW5fcnNlZ1t4XSkgJiAweDAwMGYpKQorI2RlZmluZSBTRUdNRU5UX0NPVU5UKHRycCkJKChpbnQpKChSSUZfTEVOR1RIKHRycCkgLSAyKSAvIDIpKQorCitzdHJ1Y3QgdG9rZW5faGVhZGVyIHsKKwl1X2ludDhfdCAgdG9rZW5fYWM7CisJdV9pbnQ4X3QgIHRva2VuX2ZjOworCXVfaW50OF90ICB0b2tlbl9kaG9zdFtUT0tFTl9SSU5HX01BQ19MRU5dOworCXVfaW50OF90ICB0b2tlbl9zaG9zdFtUT0tFTl9SSU5HX01BQ19MRU5dOworCXVfaW50MTZfdCB0b2tlbl9yY2Y7CisJdV9pbnQxNl90IHRva2VuX3JzZWdbUk9VVElOR19TRUdNRU5UX01BWF07Cit9OwpkaWZmIC0tZ2l0IGEvdWRwLmggYi91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRjOWMxCi0tLSAvZGV2L251bGwKKysrIGIvdWRwLmgKQEAgLTAsMCArMSw4OSBAQAorLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC91ZHAuaCx2IDEuOC4yLjIgMjAwNy8wMy8yOCAwNzo0NTo0NiBoYW5uZXMgRXhwICQgKExCTCkgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXVkcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqLworCisvKgorICogVWRwIHByb3RvY29sIGhlYWRlci4KKyAqIFBlciBSRkMgNzY4LCBTZXB0ZW1iZXIsIDE5ODEuCisgKi8KK3N0cnVjdCB1ZHBoZHIgeworCXVfaW50MTZfdAl1aF9zcG9ydDsJCS8qIHNvdXJjZSBwb3J0ICovCisJdV9pbnQxNl90CXVoX2Rwb3J0OwkJLyogZGVzdGluYXRpb24gcG9ydCAqLworCXVfaW50MTZfdAl1aF91bGVuOwkJLyogdWRwIGxlbmd0aCAqLworCXVfaW50MTZfdAl1aF9zdW07CQkJLyogdWRwIGNoZWNrc3VtICovCit9OworCisjZGVmaW5lIFRGVFBfUE9SVCA2OQkJLypYWFgqLworI2RlZmluZSBLRVJCRVJPU19QT1JUIDg4CS8qWFhYKi8KKyNkZWZpbmUgU1VOUlBDX1BPUlQgMTExCQkvKlhYWCovCisjZGVmaW5lIFNOTVBfUE9SVCAxNjEJCS8qWFhYKi8KKyNkZWZpbmUgTlRQX1BPUlQgMTIzCQkvKlhYWCovCisjZGVmaW5lIFNOTVBUUkFQX1BPUlQgMTYyCS8qWFhYKi8KKyNkZWZpbmUgSVNBS01QX1BPUlQgNTAwCQkvKlhYWCovCisjZGVmaW5lIFNZU0xPR19QT1JUIDUxNCAgICAgICAgIC8qIHJmYzMxNjQgKi8KKyNkZWZpbmUgVElNRURfUE9SVCA1MjUJCS8qWFhYKi8KKyNkZWZpbmUgUklQX1BPUlQgNTIwCQkvKlhYWCovCisjZGVmaW5lIExEUF9QT1JUIDY0NgorI2RlZmluZSBBT0RWX1BPUlQgNjU0CQkvKlhYWCovCisjZGVmaW5lIE9MU1JfUE9SVCA2OTggICAgICAgICAgIC8qIHJmYzM2MjYgKi8KKyNkZWZpbmUgS0VSQkVST1NfU0VDX1BPUlQgNzUwCS8qWFhYKi8KKyNkZWZpbmUgTDJUUF9QT1JUIDE3MDEJCS8qWFhYKi8KKyNkZWZpbmUgU0lQX1BPUlQgNTA2MAorI2RlZmluZSBJU0FLTVBfUE9SVF9OQVRUICA0NTAwICAvKiByZmMzOTQ4ICovCisjZGVmaW5lIElTQUtNUF9QT1JUX1VTRVIxIDc1MDAJLypYWFggLSBub25zdGFuZGFyZCovCisjZGVmaW5lIElTQUtNUF9QT1JUX1VTRVIyIDg1MDAJLypYWFggLSBub25zdGFuZGFyZCovCisjZGVmaW5lIFJYX1BPUlRfTE9XIDcwMDAJLypYWFgqLworI2RlZmluZSBSWF9QT1JUX0hJR0ggNzAwOQkvKlhYWCovCisjZGVmaW5lIE5FVEJJT1NfTlNfUE9SVCAgIDEzNworI2RlZmluZSBORVRCSU9TX0RHUkFNX1BPUlQgICAxMzgKKyNkZWZpbmUgQ0lTQ09fQVVUT1JQX1BPUlQgNDk2CS8qWFhYKi8KKyNkZWZpbmUgUkFESVVTX1BPUlQgMTY0NQorI2RlZmluZSBSQURJVVNfTkVXX1BPUlQgMTgxMgorI2RlZmluZSBSQURJVVNfQUNDT1VOVElOR19QT1JUIDE2NDYKKyNkZWZpbmUgUkFESVVTX05FV19BQ0NPVU5USU5HX1BPUlQgMTgxMworI2RlZmluZSBIU1JQX1BPUlQgMTk4NQkJLypYWFgqLworI2RlZmluZSBMTVBfUE9SVCAgICAgICAgICAgICAgICA3MDEgLyogcmZjNDIwNCAqLworI2RlZmluZSBMV1JFU19QT1JUCQk5MjEKKyNkZWZpbmUgWkVQSFlSX1NSVl9QT1JUCQkyMTAzCisjZGVmaW5lIFpFUEhZUl9DTFRfUE9SVAkJMjEwNAorI2RlZmluZSBNUExTX0xTUF9QSU5HX1BPUlQgICAgICAzNTAzIC8qIGRyYWZ0LWlldGYtbXBscy1sc3AtcGluZy0wMi50eHQgKi8KKyNkZWZpbmUgQkZEX0NPTlRST0xfUE9SVCAgICAgICAgMzc4NCAvKiBkcmFmdC1rYXR6LXdhcmQtYmZkLXY0djYtMWhvcC0wMC50eHQgKi8KKyNkZWZpbmUgQkZEX0VDSE9fUE9SVCAgICAgICAgICAgMzc4NSAvKiBkcmFmdC1rYXR6LXdhcmQtYmZkLXY0djYtMWhvcC0wMC50eHQgKi8KKworI2lmZGVmIElORVQ2CisjZGVmaW5lIFJJUE5HX1BPUlQgNTIxCQkvKlhYWCovCisjZGVmaW5lIERIQ1A2X1NFUlZfUE9SVCA1NDYJLypYWFgqLworI2RlZmluZSBESENQNl9DTElfUE9SVCA1NDcJLypYWFgqLworI2VuZGlmCmRpZmYgLS1naXQgYS91dGlsLmMgYi91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyZjZmMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwuYwpAQCAtMCwwICsxLDUzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3V0aWwuYyx2IDEuOTUuMi42IDIwMDYvMDIvMDggMDE6NDA6MDkgaGFubmVzIEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgSEFWRV9GQ05UTF9ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKKy8qCisgKiBQcmludCBvdXQgYSBudWxsLXRlcm1pbmF0ZWQgZmlsZW5hbWUgKG9yIG90aGVyIGFzY2lpIHN0cmluZykuCisgKiBJZiBlcCBpcyBOVUxMLCBhc3N1bWUgbm8gdHJ1bmNhdGlvbiBjaGVjayBpcyBuZWVkZWQuCisgKiBSZXR1cm4gdHJ1ZSBpZiB0cnVuY2F0ZWQuCisgKi8KK2ludAorZm5fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpzLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQoreworCXJlZ2lzdGVyIGludCByZXQ7CisJcmVnaXN0ZXIgdV9jaGFyIGM7CisKKwlyZXQgPSAxOwkJCS8qIGFzc3VtZSB0cnVuY2F0ZWQgKi8KKwl3aGlsZSAoZXAgPT0gTlVMTCB8fCBzIDwgZXApIHsKKwkJYyA9ICpzKys7CisJCWlmIChjID09ICdcMCcpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIWlzYXNjaWkoYykpIHsKKwkJCWMgPSB0b2FzY2lpKGMpOworCQkJcHV0Y2hhcignTScpOworCQkJcHV0Y2hhcignLScpOworCQl9CisJCWlmICghaXNwcmludChjKSkgeworCQkJYyBePSAweDQwOwkvKiBERUwgdG8gPywgb3RoZXJzIHRvIGFscGhhICovCisJCQlwdXRjaGFyKCdeJyk7CisJCX0KKwkJcHV0Y2hhcihjKTsKKwl9CisJcmV0dXJuKHJldCk7Cit9CisKKy8qCisgKiBQcmludCBvdXQgYSBjb3VudGVkIGZpbGVuYW1lIChvciBvdGhlciBhc2NpaSBzdHJpbmcpLgorICogSWYgZXAgaXMgTlVMTCwgYXNzdW1lIG5vIHRydW5jYXRpb24gY2hlY2sgaXMgbmVlZGVkLgorICogUmV0dXJuIHRydWUgaWYgdHJ1bmNhdGVkLgorICovCitpbnQKK2ZuX3ByaW50bihyZWdpc3RlciBjb25zdCB1X2NoYXIgKnMsIHJlZ2lzdGVyIHVfaW50IG4sCisJICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQoreworCXJlZ2lzdGVyIHVfY2hhciBjOworCisJd2hpbGUgKG4gPiAwICYmIChlcCA9PSBOVUxMIHx8IHMgPCBlcCkpIHsKKwkJbi0tOworCQljID0gKnMrKzsKKwkJaWYgKCFpc2FzY2lpKGMpKSB7CisJCQljID0gdG9hc2NpaShjKTsKKwkJCXB1dGNoYXIoJ00nKTsKKwkJCXB1dGNoYXIoJy0nKTsKKwkJfQorCQlpZiAoIWlzcHJpbnQoYykpIHsKKwkJCWMgXj0gMHg0MDsJLyogREVMIHRvID8sIG90aGVycyB0byBhbHBoYSAqLworCQkJcHV0Y2hhcignXicpOworCQl9CisJCXB1dGNoYXIoYyk7CisJfQorCXJldHVybiAobiA9PSAwKSA/IDAgOiAxOworfQorCisvKgorICogUHJpbnQgb3V0IGEgbnVsbC1wYWRkZWQgZmlsZW5hbWUgKG9yIG90aGVyIGFzY2lpIHN0cmluZykuCisgKiBJZiBlcCBpcyBOVUxMLCBhc3N1bWUgbm8gdHJ1bmNhdGlvbiBjaGVjayBpcyBuZWVkZWQuCisgKiBSZXR1cm4gdHJ1ZSBpZiB0cnVuY2F0ZWQuCisgKi8KK2ludAorZm5fcHJpbnR6cChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnMsIHJlZ2lzdGVyIHVfaW50IG4sCisJICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQoreworCXJlZ2lzdGVyIGludCByZXQ7CisJcmVnaXN0ZXIgdV9jaGFyIGM7CisKKwlyZXQgPSAxOwkJCS8qIGFzc3VtZSB0cnVuY2F0ZWQgKi8KKwl3aGlsZSAobiA+IDAgJiYgKGVwID09IE5VTEwgfHwgcyA8IGVwKSkgeworCQluLS07CisJCWMgPSAqcysrOworCQlpZiAoYyA9PSAnXDAnKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFpc2FzY2lpKGMpKSB7CisJCQljID0gdG9hc2NpaShjKTsKKwkJCXB1dGNoYXIoJ00nKTsKKwkJCXB1dGNoYXIoJy0nKTsKKwkJfQorCQlpZiAoIWlzcHJpbnQoYykpIHsKKwkJCWMgXj0gMHg0MDsJLyogREVMIHRvID8sIG90aGVycyB0byBhbHBoYSAqLworCQkJcHV0Y2hhcignXicpOworCQl9CisJCXB1dGNoYXIoYyk7CisJfQorCXJldHVybiAobiA9PSAwKSA/IDAgOiByZXQ7Cit9CisKKy8qCisgKiBQcmludCB0aGUgdGltZXN0YW1wCisgKi8KK3ZvaWQKK3RzX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dnApCit7CisJcmVnaXN0ZXIgaW50IHM7CisJc3RydWN0IHRtICp0bTsKKwl0aW1lX3QgVGltZTsKKwlzdGF0aWMgdW5zaWduZWQgYl9zZWM7CisJc3RhdGljIHVuc2lnbmVkIGJfdXNlYzsKKworCXN3aXRjaCAodGZsYWcpIHsKKworCWNhc2UgMDogLyogRGVmYXVsdCAqLworCQlzID0gKHR2cC0+dHZfc2VjICsgdGhpc3pvbmUpICUgODY0MDA7CisJCSh2b2lkKXByaW50ZigiJTAyZDolMDJkOiUwMmQuJTA2dSAiLAorCQkJICAgICBzIC8gMzYwMCwgKHMgJSAzNjAwKSAvIDYwLCBzICUgNjAsCisJCQkgICAgICh1bnNpZ25lZCl0dnAtPnR2X3VzZWMpOworCQlicmVhazsKKworCWNhc2UgMTogLyogTm8gdGltZSBzdGFtcCAqLworCQlicmVhazsKKworCWNhc2UgMjogLyogVW5peCB0aW1ldmFsIHN0eWxlICovCisJCSh2b2lkKXByaW50ZigiJXUuJTA2dSAiLAorCQkJICAgICAodW5zaWduZWQpdHZwLT50dl9zZWMsCisJCQkgICAgICh1bnNpZ25lZCl0dnAtPnR2X3VzZWMpOworCQlicmVhazsKKworCWNhc2UgMzogLyogTWljcm9zZWNvbmRzIHNpbmNlIHByZXZpb3VzIHBhY2tldCAqLworCQlpZiAoYl9zZWMgPT0gMCkgeworCQkJcHJpbnRmKCIwMDAwMDAgIik7CisJCX0gZWxzZSB7CisJCQlpbnQgZF91c2VjID0gdHZwLT50dl91c2VjIC0gYl91c2VjOworCQkJaW50IGRfc2VjID0gdHZwLT50dl9zZWMgLSBiX3NlYzsKKworCQkJd2hpbGUgKGRfdXNlYyA8IDApIHsKKwkJCQlkX3VzZWMgKz0gMTAwMDAwMDsKKwkJCQlkX3NlYy0tOworCQkJfQorCQkJaWYgKGRfc2VjKQorCQkJCXByaW50ZigiJWQuICIsIGRfc2VjKTsKKwkJCXByaW50ZigiJTA2ZCAiLCBkX3VzZWMpOworCQl9CisJCWJfc2VjID0gdHZwLT50dl9zZWM7CisJCWJfdXNlYyA9IHR2cC0+dHZfdXNlYzsKKwkJYnJlYWs7CisKKwljYXNlIDQ6IC8qIERlZmF1bHQgKyBEYXRlKi8KKwkJcyA9ICh0dnAtPnR2X3NlYyArIHRoaXN6b25lKSAlIDg2NDAwOworCQlUaW1lID0gKHR2cC0+dHZfc2VjICsgdGhpc3pvbmUpIC0gczsKKwkJdG0gPSBnbXRpbWUgKCZUaW1lKTsKKwkJaWYgKCF0bSkKKwkJCXByaW50ZigiRGF0ZSBmYWlsICAiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlMDRkLSUwMmQtJTAyZCAiLAorCQkJCSAgIHRtLT50bV95ZWFyKzE5MDAsIHRtLT50bV9tb24rMSwgdG0tPnRtX21kYXkpOworCQlwcmludGYoIiUwMmQ6JTAyZDolMDJkLiUwNnUgIiwKKwkJCSAgIHMgLyAzNjAwLCAocyAlIDM2MDApIC8gNjAsIHMgJSA2MCwgKHVuc2lnbmVkKXR2cC0+dHZfdXNlYyk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFByaW50IGEgcmVsYXRpdmUgbnVtYmVyIG9mIHNlY29uZHMgKGUuZy4gaG9sZCB0aW1lLCBwcnVuZSB0aW1lcikKKyAqIGluIHRoZSBmb3JtIDVtMXMuICBUaGlzIGRvZXMgbm8gdHJ1bmNhdGlvbiwgc28gMzIyMzA4NjEgc2Vjb25kcworICogaXMgcmVwcmVzZW50ZWQgYXMgMXkxdzFkMWgxbTFzLgorICovCit2b2lkCityZWx0c19wcmludChpbnQgc2VjcykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbGVuZ3Roc1tdID0geyJ5IiwgInciLCAiZCIsICJoIiwgIm0iLCAicyJ9OworCXN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1tdID0gezMxNTM2MDAwLCA2MDQ4MDAsIDg2NDAwLCAzNjAwLCA2MCwgMX07CisJY29uc3QgY2hhciAqKmwgPSBsZW5ndGhzOworCWNvbnN0IGludCAqcyA9IHNlY29uZHM7CisKKwlpZiAoc2VjcyA9PSAwKSB7CisJCSh2b2lkKXByaW50ZigiMHMiKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoc2VjcyA8IDApIHsKKwkJKHZvaWQpcHJpbnRmKCItIik7CisJCXNlY3MgPSAtc2VjczsKKwl9CisJd2hpbGUgKHNlY3MgPiAwKSB7CisJCWlmIChzZWNzID49ICpzKSB7CisJCQkodm9pZClwcmludGYoIiVkJXMiLCBzZWNzIC8gKnMsICpsKTsKKwkJCXNlY3MgLT0gKHNlY3MgLyAqcykgKiAqczsKKwkJfQorCQlzKys7CisJCWwrKzsKKwl9Cit9CisKKy8qCisgKiAgdGhpcyBpcyBhIGdlbmVyaWMgcm91dGluZSBmb3IgcHJpbnRpbmcgdW5rbm93biBkYXRhOworICogIHdlIHBhc3Mgb24gdGhlIGxpbmVmZWVkIHBsdXMgaW5kZW50YXRpb24gc3RyaW5nIHRvCisgKiAgZ2V0IGEgcHJvcGVyIG91dHB1dCAtIHJldHVybnMgMCBvbiBlcnJvcgorICovCisKK2ludAorcHJpbnRfdW5rbm93bl9kYXRhKGNvbnN0IHVfY2hhciAqY3AsY29uc3QgY2hhciAqaWRlbnQsaW50IGxlbikKK3sKKwlpZiAobGVuIDwgMCkgeworCQlwcmludGYoIiVzRGlzc2VjdG9yIGVycm9yOiBwcmludF91bmtub3duX2RhdGEgY2FsbGVkIHdpdGggbmVnYXRpdmUgbGVuZ3RoIiwKKwkJICAgIGlkZW50KTsKKwkJcmV0dXJuKDApOworCX0KKwlpZiAoc25hcGVuZCAtIGNwIDwgbGVuKQorCQlsZW4gPSBzbmFwZW5kIC0gY3A7CisJaWYgKGxlbiA8IDApIHsKKwkJcHJpbnRmKCIlc0Rpc3NlY3RvciBlcnJvcjogcHJpbnRfdW5rbm93bl9kYXRhIGNhbGxlZCB3aXRoIHBvaW50ZXIgcGFzdCBlbmQgb2YgcGFja2V0IiwKKwkJICAgIGlkZW50KTsKKwkJcmV0dXJuKDApOworCX0KKyAgICAgICAgaGV4X3ByaW50KGlkZW50LGNwLGxlbik7CisJcmV0dXJuKDEpOyAvKiBldmVyeXRoaW5nIGlzIG9rICovCit9CisKKy8qCisgKiBDb252ZXJ0IGEgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCisgKi8KK2NvbnN0IGNoYXIgKgordG9rMnN0cmJ1ZihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAorCSAgIHJlZ2lzdGVyIGludCB2LCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQoreworCWlmIChscCAhPSBOVUxMKSB7CisJCXdoaWxlIChscC0+cyAhPSBOVUxMKSB7CisJCQlpZiAobHAtPnYgPT0gdikKKwkJCQlyZXR1cm4gKGxwLT5zKTsKKwkJCSsrbHA7CisJCX0KKwl9CisJaWYgKGZtdCA9PSBOVUxMKQorCQlmbXQgPSAiIyVkIjsKKworCSh2b2lkKXNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgZm10LCB2KTsKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKilidWY7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCisgKi8KK2NvbnN0IGNoYXIgKgordG9rMnN0cihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAorCXJlZ2lzdGVyIGludCB2KQoreworCXN0YXRpYyBjaGFyIGJ1Zls0XVsxMjhdOworCXN0YXRpYyBpbnQgaWR4ID0gMDsKKwljaGFyICpyZXQ7CisKKwlyZXQgPSBidWZbaWR4XTsKKwlpZHggPSAoaWR4KzEpICYgMzsKKwlyZXR1cm4gdG9rMnN0cmJ1ZihscCwgZm10LCB2LCByZXQsIHNpemVvZihidWZbMF0pKTsKK30KKworLyoKKyAqIENvbnZlcnQgYSBiaXQgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCisgKiB0aGlzIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyBiaXRmaWVsZHMsIHRoZSBvdXRwdXQgc3RyaW5ncyBhcmUgY29tbWEgc2VwZXJhdGVkCisgKi8KK2NoYXIgKgorYml0dG9rMnN0cihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAorCSAgIHJlZ2lzdGVyIGludCB2KQoreworICAgICAgICBzdGF0aWMgY2hhciBidWZbMjU2XTsgLyogb3VyIHN0cmluZ2J1ZmZlciAqLworICAgICAgICBpbnQgYnVmbGVuPTA7CisgICAgICAgIHJlZ2lzdGVyIGludCByb3RiaXQ7IC8qIHRoaXMgaXMgdGhlIGJpdCB3ZSByb3RhdGUgdGhyb3VnaCBhbGwgYml0cG9zaXRpb25zICovCisgICAgICAgIHJlZ2lzdGVyIGludCB0b2t2YWw7CisKKwl3aGlsZSAobHAtPnMgIT0gTlVMTCAmJiBscCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0b2t2YWw9bHAtPnY7ICAgLyogbG9hZCBvdXIgZmlyc3QgdmFsdWUgKi8KKyAgICAgICAgICAgIHJvdGJpdD0xOworICAgICAgICAgICAgd2hpbGUgKHJvdGJpdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBsZXRzIEFORCB0aGUgcm90YXRpbmcgYml0IHdpdGggb3VyIHRva2VuIHZhbHVlCisgICAgICAgICAgICAgICAgICogYW5kIHNlZSBpZiB3ZSBoYXZlIGdvdCBhIG1hdGNoCisgICAgICAgICAgICAgICAgICovCisJCWlmICh0b2t2YWwgPT0gKHYmcm90Yml0KSkgeworICAgICAgICAgICAgICAgICAgICAvKiBvayB3ZSBoYXZlIGZvdW5kIHNvbWV0aGluZyAqLworICAgICAgICAgICAgICAgICAgICBidWZsZW4rPXNucHJpbnRmKGJ1ZitidWZsZW4sIHNpemVvZihidWYpLWJ1ZmxlbiwgIiVzLCAiLGxwLT5zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvdGJpdD1yb3RiaXQ8PDE7IC8qIG5vIG1hdGNoIC0gbGV0cyBzaGlmdCBhbmQgdHJ5IGFnYWluICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBscCsrOworCX0KKworICAgICAgICBpZiAoYnVmbGVuICE9IDApIHsgLyogZGlkIHdlIGZpbmQgYW55dGhpbmcgKi8KKyAgICAgICAgICAgIC8qIHllcCwgc2V0IHRoZSB0aGUgdHJhaWxpbmcgemVybyAyIGJ5dGVzIGJlZm9yZSB0byBlbGltaW5hdGUgdGhlIGxhc3QgY29tbWEgJiB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICBidWZbYnVmbGVuLTJdID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIGJ1bW1lciAtIGxldHMgcHJpbnQgdGhlICJ1bmtub3duIiBtZXNzYWdlIGFzIGFkdmlzZWQgaW4gdGhlIGZtdCBzdHJpbmcgaWYgd2UgZ290IG9uZSAqLworICAgICAgICAgICAgaWYgKGZtdCA9PSBOVUxMKQorCQlmbXQgPSAiIyVkIjsKKyAgICAgICAgICAgICh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgdik7CisgICAgICAgICAgICByZXR1cm4gKGJ1Zik7CisgICAgICAgIH0KK30KKworLyoKKyAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB1c2luZyBhbiBhcnJheTsgdGhlIG1hY3JvCisgKiB0b2syc3RyYXJ5KCkgaW4gPGludGVyZmFjZS5oPiBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0bworICogdGhpcyBmdW5jdGlvbiBhbmQgZW5zdXJlcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKKyAqIGNvcnJlY3QgZm9yIGJvdW5kcy1jaGVja2luZy4KKyAqLworY29uc3QgY2hhciAqCit0b2syc3RyYXJ5X2ludGVybmFsKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipscCwgaW50IG4sIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmZtdCwKKwlyZWdpc3RlciBpbnQgdikKK3sKKwlzdGF0aWMgY2hhciBidWZbMTI4XTsKKworCWlmICh2ID49IDAgJiYgdiA8IG4gJiYgbHBbdl0gIT0gTlVMTCkKKwkJcmV0dXJuIGxwW3ZdOworCWlmIChmbXQgPT0gTlVMTCkKKwkJZm10ID0gIiMlZCI7CisJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCB2KTsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgMzItYml0IG5ldG1hc2sgdG8gcHJlZml4bGVuIGlmIHBvc3NpYmxlCisgKiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJlZml4LWxlbjsgaWYgcGxlbiA9PSAtMQorICogdGhlbiBjb252ZXJzaW9uIHdhcyBub3QgcG9zc2libGU7CisgKi8KKworaW50CittYXNrMnBsZW4gKHVfaW50MzJfdCBtYXNrKQoreworCXVfaW50MzJfdCBiaXRtYXNrc1szM10gPSB7CisJCTB4MDAwMDAwMDAsCisJCTB4ODAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4ZTAwMDAwMDAsIDB4ZjAwMDAwMDAsCisJCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIDB4ZmUwMDAwMDAsIDB4ZmYwMDAwMDAsCisJCTB4ZmY4MDAwMDAsIDB4ZmZjMDAwMDAsIDB4ZmZlMDAwMDAsIDB4ZmZmMDAwMDAsCisJCTB4ZmZmODAwMDAsIDB4ZmZmYzAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmZjAwMDAsCisJCTB4ZmZmZjgwMDAsIDB4ZmZmZmMwMDAsIDB4ZmZmZmUwMDAsIDB4ZmZmZmYwMDAsCisJCTB4ZmZmZmY4MDAsIDB4ZmZmZmZjMDAsIDB4ZmZmZmZlMDAsIDB4ZmZmZmZmMDAsCisJCTB4ZmZmZmZmODAsIDB4ZmZmZmZmYzAsIDB4ZmZmZmZmZTAsIDB4ZmZmZmZmZjAsCisJCTB4ZmZmZmZmZjgsIDB4ZmZmZmZmZmMsIDB4ZmZmZmZmZmUsIDB4ZmZmZmZmZmYKKwl9OworCWludCBwcmVmaXhfbGVuID0gMzI7CisKKwkvKiBsZXQncyBzZWUgaWYgd2UgY2FuIHRyYW5zZm9ybSB0aGUgbWFzayBpbnRvIGEgcHJlZml4bGVuICovCisJd2hpbGUgKHByZWZpeF9sZW4gPj0gMCkgeworCQlpZiAoYml0bWFza3NbcHJlZml4X2xlbl0gPT0gbWFzaykKKwkJCWJyZWFrOworCQlwcmVmaXhfbGVuLS07CisJfQorCXJldHVybiAocHJlZml4X2xlbik7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3ZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlleGl0KDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyogVkFSQVJHUyAqLwordm9pZAord2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogV0FSTklORzogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9Cit9CisKKy8qCisgKiBDb3B5IGFyZyB2ZWN0b3IgaW50byBhIG5ldyBidWZmZXIsIGNvbmNhdGVuYXRpbmcgYXJndW1lbnRzIHdpdGggc3BhY2VzLgorICovCitjaGFyICoKK2NvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBjaGFyICoqcDsKKwlyZWdpc3RlciB1X2ludCBsZW4gPSAwOworCWNoYXIgKmJ1ZjsKKwljaGFyICpzcmMsICpkc3Q7CisKKwlwID0gYXJndjsKKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKnApCisJCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOworCisJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOworCisJcCA9IGFyZ3Y7CisJZHN0ID0gYnVmOworCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgeworCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJCTsKKwkJZHN0Wy0xXSA9ICcgJzsKKwl9CisJZHN0Wy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQorCisvKgorICogT24gV2luZG93cywgd2UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLCBzbyB0aGF0CisgKiB3ZSBnZXQgYWxsIHRoZSBieXRlcyBzcGVjaWZpZWQgYnkgdGhlIHNpemUgd2UgZ2V0IGZyb20gImZzdGF0KCkiLgorICogT24gVU5JWCwgdGhhdCdzIG5vdCBuZWNlc3NhcnkuICBPX0JJTkFSWSBpcyBkZWZpbmVkIG9uIFdpbmRvd3M7CisgKiB3ZSBkZWZpbmUgaXQgYXMgMCBpZiBpdCdzIG5vdCBkZWZpbmVkLCBzbyBpdCBkb2VzIG5vdGhpbmcuCisgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkJMAorI2VuZGlmCisKK2NoYXIgKgorcmVhZF9pbmZpbGUoY2hhciAqZm5hbWUpCit7CisJcmVnaXN0ZXIgaW50IGksIGZkLCBjYzsKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisKKwlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKKwlpZiAoZmQgPCAwKQorCQllcnJvcigiY2FuJ3Qgb3BlbiAlczogJXMiLCBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCisJaWYgKGZzdGF0KGZkLCAmYnVmKSA8IDApCisJCWVycm9yKCJjYW4ndCBzdGF0ICVzOiAlcyIsIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisKKwljcCA9IG1hbGxvYygodV9pbnQpYnVmLnN0X3NpemUgKyAxKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZXJyb3IoIm1hbGxvYyglZCkgZm9yICVzOiAlcyIsICh1X2ludClidWYuc3Rfc2l6ZSArIDEsCisJCQlmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCWNjID0gcmVhZChmZCwgY3AsICh1X2ludClidWYuc3Rfc2l6ZSk7CisJaWYgKGNjIDwgMCkKKwkJZXJyb3IoInJlYWQgJXM6ICVzIiwgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoY2MgIT0gYnVmLnN0X3NpemUpCisJCWVycm9yKCJzaG9ydCByZWFkICVzICglZCAhPSAlZCkiLCBmbmFtZSwgY2MsIChpbnQpYnVmLnN0X3NpemUpOworCisJY2xvc2UoZmQpOworCS8qIHJlcGxhY2UgIiMgY29tbWVudCIgd2l0aCBzcGFjZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2M7IGkrKykgeworCQlpZiAoY3BbaV0gPT0gJyMnKQorCQkJd2hpbGUgKGkgPCBjYyAmJiBjcFtpXSAhPSAnXG4nKQorCQkJCWNwW2krK10gPSAnICc7CisJfQorCWNwW2NjXSA9ICdcMCc7CisJcmV0dXJuIChjcCk7Cit9CisKK3ZvaWQKK3NhZmVwdXRzKGNvbnN0IGNoYXIgKnMsIGludCBtYXhsZW4pCit7CisgICAgaW50IGlkeCA9IDA7CisJd2hpbGUgKCpzICYmIGlkeCA8IG1heGxlbikgeworCQlzYWZlcHV0Y2hhcigqcyk7CisgICAgICAgICAgICAgICAgaWR4Kys7CisJCXMrKzsKKwl9Cit9CisKK3ZvaWQKK3NhZmVwdXRjaGFyKGludCBjKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwljaCA9ICh1bnNpZ25lZCBjaGFyKShjICYgMHhmZik7CisJaWYgKGNoIDwgMHg4MCAmJiBpc3ByaW50KGNoKSkKKwkJcHJpbnRmKCIlYyIsIGNoKTsKKwllbHNlCisJCXByaW50ZigiXFwlMDNvIiwgY2gpOworfQpkaWZmIC0tZ2l0IGEvdmVyc2lvbi5jIGIvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTFiYTUKLS0tIC9kZXYvbnVsbAorKysgYi92ZXJzaW9uLmMKQEAgLTAsMCArMSBAQAorY2hhciB2ZXJzaW9uW10gPSAiMy45LjgiOwpkaWZmIC0tZ2l0IGEvdmZwcmludGYuYyBiL3ZmcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NDA2YwotLS0gL2Rldi9udWxsCisrKyBiL3ZmcHJpbnRmLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NQorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ZmcHJpbnRmLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjo0NSBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS5oIgorCisvKgorICogU3RvY2sgNC4zIGRvZXNuJ3QgaGF2ZSB2ZnByaW50Zi4KKyAqIFRoaXMgcm91dGluZSBpcyBkdWUgdG8gQ2hyaXMgVG9yZWsuCisgKi8KK3ZmcHJpbnRmKGYsIGZtdCwgYXJncykKKwlGSUxFICpmOworCWNoYXIgKmZtdDsKKwl2YV9saXN0IGFyZ3M7Cit7CisJaW50IHJldDsKKworCWlmICgoZi0+X2ZsYWcgJiBfSU9XUlQpID09IDApIHsKKwkJaWYgKGYtPl9mbGFnICYgX0lPUlcpCisJCQlmLT5fZmxhZyB8PSBfSU9XUlQ7CisJCWVsc2UKKwkJCXJldHVybiBFT0Y7CisJfQorCXJldCA9IF9kb3BybnQoZm10LCBhcmdzLCBmKTsKKwlyZXR1cm4gZmVycm9yKGYpID8gRU9GIDogcmV0OworfQo=