LyoqDQogKiANCiAqIEBmaWxlICAgICAgYW10LmMNCiAqIEBicmllZiAgICAgDQogKiAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZUTS4NCiAqICAgICAgICAgICAgQU1UtPrA7dOm08Oy4w0KICogICAgICAgICAgICANCiAqIEBkZXRhaWxzICAgDQogKiBAYXV0aG9yICAgIFRvb2xzIFRlYW0uDQogKiBAZW1haWwgICAgIA0KICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKEMpIDIwMTMgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQogKiBAd2FybmluZyAgIA0KICogQGRhdGUgICAgICAyMDE5LzAyLzAyDQogKiBAdmVyc2lvbiAgIDEuMQ0KICogQHByZSAgICAgICANCiAqIEBwb3N0ICAgICAgDQogKiAgICAgICAgICAgIA0KICogQHBhciAgICAgICANCiAqIENoYW5nZSBIaXN0b3J5IDoNCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogZGF0ZSAgICAgICAgdmVyc2lvbiAgYXV0aG9yICAgICAgICAgZGVzY3JpcHRpb24NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogMjAxNS8wNC8yOCAgMS4wICAgICAgbHUueGllamkgICAgICAgQ3JlYXRlIGZpbGUNCiAqIDIwMTkvMDIvMDIgIDEuMSAgICAgIGppYW5nLmZlbmdsaW4gINDeuMTXosrNt73Kvc6qZG94eWdlbg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiANCiAqIA0KICovDQoNCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHB0aHJlYWQuaD4NCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KI2luY2x1ZGUgPHN5cy9tc2cuaD4NCiNpbmNsdWRlIDxmY250bC5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgImxpbnV4L3JwbXNnX3p4MjkuaCINCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQojaW5jbHVkZSA8bGludXgvbmV0bGluay5oPg0KI2luY2x1ZGUgPGFycGEvaW5ldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgInBvcnRfY29tLmgiDQojaW5jbHVkZSAiYW10LmgiDQojaW5jbHVkZSAib3NfdHlwZV9kZWYuaCINCiNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiDQojaW5jbHVkZSAib3RoZXJfbXNnLmgiDQojaW5jbHVkZSAibWVzc2FnZS5oIg0KI2luY2x1ZGUgImFtdF9hZ2VudF9kZXZpY2V0ZXN0LmgiDQojaW5jbHVkZSAia3dhdGNoX21zZy5oIg0KI2luY2x1ZGUgImFtdG52LmgiDQojaW5jbHVkZSAibGliY3Budi5oIg0KI2luY2x1ZGUgPHN5cy9wcmN0bC5oPg0KI2luY2x1ZGUgInN5cy93YWl0LmgiDQojaW5jbHVkZSAicmVmX252X2RlZi5oIg0KI2luY2x1ZGUgIm52X2FwaS5oIg0KDQoNCg0KDQovKioNCiAqIM3isr+6r8r90v3Tww0KICovDQpleHRlcm4gaW50IEFtdF9XaWZpX0luaXQodm9pZCk7DQpleHRlcm4gaW50IEFtdF9XaWZpX1Byb2Nlc3NNc2codW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciAqbXNnX2J1ZiwgdW5zaWduZWQgaW50IG1zZ19sZW4pOw0KZXh0ZXJuIGludCBBbXRfR3BzX1Byb2Nlc3NNc2codW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciAqbXNnX2J1ZiwgdW5zaWduZWQgaW50IG1zZ19sZW4pOw0KZXh0ZXJuIGludCBBbXRfRGV2aWNlVGVzdF9Qcm9jZXNzTXNnKHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIgKm1zZ19idWYsIHVuc2lnbmVkIGludCBtc2dfbGVuKTsNCmV4dGVybiBpbnQgQW10X1Byb2Nlc3NfR3BzX1JzcChNU0dfQlVGICptc2csdW5zaWduZWQgaW50IG1zZ19pZCk7DQpleHRlcm4gaW50IEFtdF9GdW5jVGVzdF9Qcm9jZXNzTXNnKHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIgKm1zZ19idWYsIHVuc2lnbmVkIGludCBtc2dfbGVuKTsNCmV4dGVybiBpbnQgd2lmaV9pb2N0bF9oYW5kbGUoaW50IGNtZCk7DQoNCg0KLyoqDQogKiDIq77WseTBv8n5w/cNCiAqLw0Kc3RhdGljIGludCBnX2FtdF9mZF9jcCA9IC0xOw0Kc3RhdGljIGludCBnX2FtdF9mZF91c2IgPSAtMTsNCnN0YXRpYyBpbnQgZ19hbXRfZmRfdXNiX2hvdHBsdWcgPSAtMTsNCnN0YXRpYyBpbnQgZ19hbXRfZmRfc29ja2V0X2NsaWVudCA9IC0xOw0Kc3RhdGljIGludCBnX2FtdF9mZF9zb2NrZXRfc2VydmVyID0gLTE7DQpzdGF0aWMgZmRfc2V0IGdfYW10X2Zkc3JlYWQ7DQpzdGF0aWMgaW50IGdfYW10X2ZkX21heCA9IDA7DQpzdGF0aWMgdm9sYXRpbGUgaW50ICpnX2FtdF9mZF9jdXJyZW50ID0gTlVMTDsNCnN0YXRpYyBpbnQgZ19hbXRfaU1zZ0hhbmRsZSA9IDA7DQp1bnNpZ25lZCBpbnQgZ19hbXRfYXRfbW9kZSA9IDA7DQojaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQpzdGF0aWMgaW50IGdfYW10X2ZkX2NhcCA9IC0xOw0KI2VuZGlmDQpzdGF0aWMgdW5zaWduZWQgaW50IHJhdCA9IDA7DQpzdGF0aWMgdW5zaWduZWQgaW50IGFudF9udW0gPSAwOw0Kc3RhdGljIHZvaWQgc2VuZF9vayhpbnQgZmQpOw0Kc3RhdGljIHZvaWQgc2VuZF9lcnJvcihpbnQgZmQpOw0Kc3RhdGljIHZvaWQgc2VuZF9xdWVyeV9yZXN1bHQoaW50IGZkLGNoYXIqIGNtZCwgY2hhciogcGFyYW0pOw0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K3osvNuPhQQw0KICogQHBhcmFtW2luXSBmZCDOxLz+w+jK9rf7DQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiC3tbvYt6LLzbXEyv2+3bOktsgNCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9TZW5kRGF0YShpbnQgZmQsIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgaW50IHdyaXRlX2xlbiA9IFBvcnRTZW5kKGZkLCAodW5zaWduZWQgY2hhciopJmJ1Zl9sZW4sIHNpemVvZih1bnNpZ25lZCBpbnQpLCBXQUlUX0FMTCk7DQoNCiAgICAvL2lmICh3cml0ZV9sZW4gPiAwKQ0KICAgIHsNCiAgICAgICAgd3JpdGVfbGVuID0gUG9ydFNlbmQoZmQsIGJ1ZiwgYnVmX2xlbiwgV0FJVF9BTEwpOw0KDQogICAgICAgIGlmICh3cml0ZV9sZW4gPD0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRTZW5kICdkYXRhJyB0byBkZXZpY2UoZmQgPSAlZCk6IHdyaXRlX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4pOw0KICAgICAgICB9DQogICAgfQ0KCS8qDQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRTZW5kICdsZW5ndGgnIHRvIGRldmljZShmZCA9ICVkKTogd3JpdGVfbGVuKCVkKSBpcyB3cm9uZy5cbiIsIF9fRlVOQ1RJT05fXywgZmQsIHdyaXRlX2xlbik7DQogICAgfQ0KICAgICovDQoNCiAgICByZXR1cm4gd3JpdGVfbGVuOw0KfQ0KDQovKioNCiAqIEBicmllZiBBTVTP+8+it6LLzQ0KICogQHBhcmFtW2luXSBmZCDOxLz+w+jK9rf7DQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiC3tbvYt6LLzbXEyv2+3bOktsgNCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9TZW5kRGF0YVRvQW10YWdlbnQoaW50IGZkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KCWludCAgd3JpdGVfbGVuID0gUG9ydFNlbmQoZmQsIGJ1ZiwgYnVmX2xlbiwgTk9fV0FJVCk7DQoNCiAgICBpZiAod3JpdGVfbGVuIDw9IDApDQogICAgew0KICAgIAlBbXRQcmludGYoQU1UX0VSUk9SICIlczogUG9ydFNlbmQgJ2RhdGEnIHRvIGRldmljZShmZCA9ICVkKTogd3JpdGVfbGVuKCVkKSBpcyB3cm9uZy5cbiIsIF9fRlVOQ1RJT05fXywgZmQsIHdyaXRlX2xlbik7DQogICAgfQ0KCWVsc2UNCgl7DQogICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFBvcnRTZW5kICdkYXRhJyB0byBkZXZpY2UoZmQgPSAlZCk6IHdyaXRlX2xlbiglZCksYnVmX2xlbiglZCkgXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4sYnVmX2xlbik7DQoJfQ0KICAgIHJldHVybiB3cml0ZV9sZW47DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPor3TytUNCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gt7W72L3TytW1vbXEyv2+3bOktsgNCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9SZWNlaXZlRGF0YShpbnQgZmQsIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgaW50IHJlYWRfbGVuID0gUG9ydFJlY3YoZmQsIGJ1Ziwgc2l6ZW9mKHVuc2lnbmVkIGludCksIFdBSVRfQUxMKTsNCg0KICAgIGlmIChyZWFkX2xlbiA+IDApDQogICAgew0KICAgICAgICB1bnNpZ25lZCBpbnQgcGFja2V0X2xlbiA9ICooKHVuc2lnbmVkIGludCAqKWJ1Zik7DQogICAgICAgIGlmIChwYWNrZXRfbGVuID4gMCAmJiBwYWNrZXRfbGVuIDw9IGJ1Zl9sZW4pDQogICAgICAgIHsNCiAgICAgICAgICAgIHJlYWRfbGVuID0gUG9ydFJlY3YoZmQsIGJ1ZiwgcGFja2V0X2xlbiwgV0FJVF9BTEwpOw0KDQogICAgICAgICAgICBpZiAocmVhZF9sZW4gPD0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogUG9ydFJlY3YgJ2RhdGEnIGZyb20gZGV2aWNlKGZkID0gJWQpOiByZWFkX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCByZWFkX2xlbik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogZmQgPSAlZCwgcGFja2V0X2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCBwYWNrZXRfbGVuKTsNCiAgICAgICAgICAgIHJlYWRfbGVuID0gLTE7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRSZWN2ICdsZW5ndGgnIGZyb20gZGV2aWNlKGZkID0gJWQpOiByZWFkX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCByZWFkX2xlbik7DQogICAgfQ0KDQogICAgcmV0dXJuIHJlYWRfbGVuOw0KfQ0KDQojaWYgMA0Kc3RhdGljIHZvaWQgc3RyX3RvX2ludCggaW50ICpkYXRhLCBjaGFyICpzdHIgKQ0Kew0KICAgIGludCBMYyA9IDA7DQogICAgaW50CUxlbiA9IDA7DQogICAgY2hhciAqQmVnYiA9IE5VTEw7DQogICAgY2hhciAqRW5kYiA9IE5VTEw7DQogICAgY2hhciAqcHRyID0gTlVMTDsNCiAgICBjaGFyIHMxWzEwMF0gPSAiIjsNCiAgICBjaGFyIHMyWzUwXSA9ICIiOwkNCiAgICBtZW1zZXQoczEsIDAsIHNpemVvZihzMSkpOw0KICAgIHN0cmNweShzMSwgc3RyKTsNCiAgICBzdHJjYXQoczEsICIsIik7DQogICAgQmVnYiA9IHMxOwkJCQkJCS8vxvDKvLXY1rcNCiAgICBFbmRiID0gc3RyY2hyKHMxLCcsJyk7CQkJLy+12tK7uPa2urrFzrvWww0KCWlmIChFbmRiID09IE5VTEwpDQoJCXJldHVybjsNCiAgICBMYyA9IDA7CQ0KICAgIGRvDQogICAgew0KICAgICAgICBMZW4gPSAwOw0KICAgICAgICBMZW4gPSBFbmRiIC0gQmVnYjsJCQkvL7OktsgNCiAgICAgICAgbWVtc2V0KHMyLCAwLCBzaXplb2YoczIpKTsJLy+92Mihwb249ra6usW85LXE19a3+7SuDQogICAgICAgIHN0cm5jcHkoczIsIEJlZ2IsIExlbik7CQkvL73YyKHBvbj2trq6xbzktcTX1rf7tK4NCiAgICAgICAgZGF0YVtMY10gPSBhdG9pKHMyKTsJCQkvL3N0cmluZyB0byBpbnQNCiAgICAgICAgcHRyID0gRW5kYiArIDE7CQkJCS8v1rjP8s/CuPbK/bXExvDKvLXY1rcNCiAgICAgICAgc3RyY3B5KHMxLCBwdHIpOwkJCS8vyKW19NLR16q7r7XE19a3+7SuDQogICAgICAgIEJlZ2IgPSBzMTsJCQkJCS8vxvDKvLXY1re4/NDCDQogICAgICAgIEVuZGIgPSBzdHJjaHIoczEsJywnKTsJCS8vz8K49ra6usXOu9bDDQogICAgICAgIExjKys7DQogICAgfXdoaWxlKEVuZGIhPU5VTEwpOyANCn0NCiNlbmRpZg0KDQpzdGF0aWMgdm9pZCBzdHJfdG9fZG91YmxlKCBkb3VibGUgKmRhdGEsIGNoYXIgKnN0ciApDQp7DQogICAgaW50IExjID0gMDsNCiAgICBpbnQJTGVuID0gMDsNCiAgICBjaGFyICpCZWdiID0gTlVMTDsNCiAgICBjaGFyICpFbmRiID0gTlVMTDsNCiAgICBjaGFyICpwdHIgPSBOVUxMOw0KICAgIGNoYXIgczFbMTAwXSA9ICIiOw0KICAgIGNoYXIgczJbNTBdID0gIiI7CQ0KICAgIG1lbXNldChzMSwgMCwgc2l6ZW9mKHMxKSk7DQogICAgbWVtY3B5KHMxLCBzdHIsc2l6ZW9mKHMxKSAtIDEpOw0KICAgIHN0cmNhdChzMSwgIiwiKTsNCiAgICBCZWdiID0gczE7CQkJCQkJLy/G8Mq8tdjWtw0KICAgIEVuZGIgPSBzdHJjaHIoczEsJywnKTsJCQkvL7Xa0ru49ra6usXOu9bDDQoJaWYgKEVuZGIgPT0gTlVMTCkNCgkJcmV0dXJuOw0KICAgIExjID0gMDsJDQogICAgZG8NCiAgICB7DQogICAgICAgIExlbiA9IDA7DQogICAgICAgIExlbiA9IEVuZGIgLSBCZWdiOwkJCS8vs6S2yA0KICAgICAgICBtZW1zZXQoczIsIDAsIHNpemVvZihzMikpOwkvL73YyKHBvbj2trq6xbzktcTX1rf7tK4NCiAgICAgICAgbWVtY3B5KHMyLCBCZWdiLCBzaXplb2YoczIpIC0gMSk7CQkvL73YyKHBvbj2trq6xbzktcTX1rf7tK4NCiAgICAgICAgZGF0YVtMY10gPSBhdG9mKHMyKTsJCQkvL3N0cmluZyB0byBpbnQNCiAgICAgICAgcHRyID0gRW5kYiArIDE7CQkJCS8v1rjP8s/CuPbK/bXExvDKvLXY1rcNCiAgICAgICAgbWVtY3B5KHMxLCBwdHIsIDk5KTsJCQkvL8iltfTS0dequ6+1xNfWt/u0rg0KICAgICAgICBCZWdiID0gczE7CQkJCQkvL8bwyry12Na3uPzQwg0KICAgICAgICBFbmRiID0gc3RyY2hyKHMxLCcsJyk7CQkvL8/CuPa2urrFzrvWww0KICAgICAgICBMYysrOw0KICAgIH13aGlsZShFbmRiIT1OVUxMKTsgDQp9DQoNCiNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCi8qKg0KICogQGJyaWVmILbByKFjYXCy4LXEt7TAoc/7z6LP37PMuq/K/Q0KICogQHBhcmFtW2luXSBhcmdzIM/fs8y6r8r9ss7K/Q0KICogQHJldHVybiBOL0ENCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgdm9pZCogUmVhZEZyb21DQVBUaHJlYWQodm9pZCogYXJncykNCnsNCiAgICAvLyBSZWFkIGZyb20gQVAtQ0FQIGNoYW5uZWwNCiAgICBjaGFyICpyZWNlaXZlX2J1ZmZlciA9IE5VTEw7DQoNCglVTlVTRUQoYXJncyk7DQoJDQoJcmVjZWl2ZV9idWZmZXIgPSBtYWxsb2MoTUFYX1BBQ0tFVF9MRU5HVEgpOw0KICAgIGlmIChyZWNlaXZlX2J1ZmZlciA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIE5VTEw7DQogICAgfQ0KDQoJcHJjdGwoUFJfU0VUX05BTUUsICJBbXRSZWFkRnJvbUNBUCIpOw0KDQogICAgd2hpbGUgKDEpDQogICAgew0KICAgICAgICBpbnQgcmVhZF9sZW4gPSBBbXRfUmVjZWl2ZURhdGEoZ19hbXRfZmRfY2FwLCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCk7DQoNCiAgICAgICAgaWYgKHJlYWRfbGVuID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogUmVjZWl2ZSBjYXAgZGF0YSwgcmVhZF9sZW4gPSAlZCEuXG4iLCBfX0ZVTkNUSU9OX18sIHJlYWRfbGVuKTsNCg0KICAgICAgICAgICAgaWYgKGdfYW10X2ZkX2N1cnJlbnQgJiYgKmdfYW10X2ZkX2N1cnJlbnQgPj0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZihnX2FtdF9hdF9tb2RlICE9IDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBBbXRfU2VuZERhdGEoKmdfYW10X2ZkX2N1cnJlbnQsICh1bnNpZ25lZCBjaGFyICopcmVjZWl2ZV9idWZmZXIsIHJlYWRfbGVuKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IEN1cnJlbnQgZmQgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnJlZShyZWNlaXZlX2J1ZmZlcik7DQogICAgcmV0dXJuIE5VTEw7DQp9DQojZW5kaWYNCg0KLyoqDQogKiBAYnJpZWYgveLO9kFNVM/7z6LXqruvzqpBVNfWt/u0rreiy824+FBDDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILe1u9i3osvNtcTK/b7ds6S2yA0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyBpbnQgQXRfU2VuZERhdGEoaW50IGZkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KCXVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBFVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBUSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBDaGVjayA9IE5VTEw7DQogICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KICAgIHVuc2lnbmVkIGludCBtc2dfaWQ7DQogICAgdW5zaWduZWQgaW50IGkgPSAwOw0KCXVuc2lnbmVkIGludCBwaHlfbXNnX2lkOw0KCXVuc2lnbmVkIGludCBwaHlfcmV0Ow0KICAgIHBUSUQgPSBwVElEOw0KICAgIHBDaGVjayA9IHBDaGVjazsNCiAgICBwRGF0YSA9IHBEYXRhOw0KDQogICAgcFNUWCA9ICZidWZbMF07DQogICAgcEVUWCA9ICZidWZbYnVmX2xlbiAtIDFdOw0KICAgIHBUSUQgPSAmYnVmWzFdOw0KICAgIHBGSUQgPSAmYnVmWzEgKyAxXTsNCiAgICBwQ2hlY2sgPSAmYnVmW2J1Zl9sZW4gLSAyXTsNCiAgICBwRGF0YSA9ICZidWZbMSArIDEgKyAxXTsNCg0KICAgIGlmICghKCgweDAyID09ICpwU1RYKSAmJiAoMHgwMiA9PSAqcEVUWCkpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIENoZWNrU3VtID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCAoYnVmX2xlbiAtIDIpOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IGJ1ZlsxICsgaV07DQoNCiAgICBpZiAoQ2hlY2tTdW0gIT0gMCkNCiAgICB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICAvLyBUSUTT60ZJRNfpus/KudPD0tHAqdW5uabE3LrFDQogICAgbXNnX2lkID0gKCpwVElEIDw8IDgpIHwgKnBGSUQ7DQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBtc2dfaWQgPSAlIzA0eCwgYnVmX2xlbiA9ICVkLlxuIiwgX19GVU5DVElPTl9fLCBtc2dfaWQsIGJ1Zl9sZW4pOw0KDQoJc3dpdGNoKG1zZ19pZCkNCgl7DQoJICAgIC8vTFRFzu/A7bLjQU1Uz/vPog0KCQljYXNlIEZJRF9MVEVBX1BIWV9NU0c6DQoJCXsNCgkJCW1lbWNweSgmcGh5X21zZ19pZCwgcERhdGEsIDQpOw0KCQkJbWVtY3B5KCZwaHlfcmV0LCBwRGF0YSArIDQsIDQpOw0KCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogbHRlX3BoeV9tc2dfaWQgPSAlIzA0eCwgbHRlX3BoeV9yZXQgPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgcGh5X21zZ19pZCxwaHlfcmV0KTsNCgkJCXN3aXRjaChwaHlfbXNnX2lkKQ0KCQkJew0KCQkJCWNhc2UgMHg1MDU6Ly9aQU1UX0xURUFfR0VUX05TVF9SU1JQDQoJCQkJew0KCQkJCSAgICB0eXBlZGVmIHN0cnVjdA0KCQkJCSAgICB7DQoJCQkJCQlVSU5UMzIgIGR3TXNnSWQ7ICAvL3gwNTA1DQoJCQkJCQlVSU5UMzIgIGR3UmV0OyAgICAvLz0wLLHqyrazybmmOyDG5Mv71rWx6sq2yqew3A0KCQkgICAgCQkJVUlOVDE2IHdBbnRSc3JwWzRdOyAgIC8vINfutuA0uPbM7M/fvdPK1VJTUlDWtQ0KCQkgICAgCQkJVUlOVDE2IHdBbnRSc3NpWzJdOyAgIC8vINb3uKjM7M/fvdPK1VJTU0nWtbXE1fvK/bK/t9YNCgkJICAgIAkJCVVJTlQxNiB3QW50UnNzaURlY1syXTsgICAvLyDW97iozOzP373TytVSU1NJ1rW1xNChyv2yv7fWDQoJCQkJCX1UX3pBTVRfTFRFQV9HZXRSc3JwX1JzcDsgDQoJCQkJCQkNCgkJCSAgICAgICAgVF96QU1UX0xURUFfR2V0UnNycF9Sc3Agc3RHZXRSc3JwX1JzcCA9IHswfTsNCgkJCQkJDQoJCQkJICAgIGlmKHBoeV9yZXQgPT0gMCkNCgkJCQkgICAgew0KCQkJCSAgICAJbWVtY3B5KCZzdEdldFJzcnBfUnNwLCBwRGF0YSxzaXplb2Yoc3RHZXRSc3JwX1JzcCkpOw0KCQkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogUlNSUFswXSA9ICVkLCBSU1JQWzFdID0gJWQsUlNTSVswXSA9ICVkLCBSU1NJWzFdID0gJWQsUlNTSURlY1swXSA9ICVkLCBSU1NJRGVjWzFdID0gJWRcbiIsIFwNCgkJCQkJCQlfX0ZVTkNUSU9OX18sIHN0R2V0UnNycF9Sc3Aud0FudFJzcnBbMF0sc3RHZXRSc3JwX1JzcC53QW50UnNycFsxXSxcDQoJCQkJCQkJc3RHZXRSc3JwX1JzcC53QW50UnNzaVswXSxzdEdldFJzcnBfUnNwLndBbnRSc3NpWzFdLFwNCgkJCQkJCQlzdEdldFJzcnBfUnNwLndBbnRSc3NpRGVjWzBdLHN0R2V0UnNycF9Sc3Aud0FudFJzc2lEZWNbMV0pO1wNCgkJCQkJCWNoYXIgc3RyUlNTSVsxMDBdID0gezB9Ow0KICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IHdBbnQwUlNTSSA9IHN0R2V0UnNycF9Sc3Aud0FudFJzc2lbMF07DQoJCQkJCQlVSU5UMTYgd0FudDBSU1NJRGVjID0gc3RHZXRSc3JwX1JzcC53QW50UnNzaURlY1swXTsNCgkJCQkJCWRvdWJsZSBkQW50MFJTU0kgPSAoZG91YmxlKSh3QW50MFJTU0kgKyAod0FudDBSU1NJRGVjLzEyOC4wKSAtIDY1NTM1KTsNCgkJCQkJCVVJTlQxNiB3QW50MVJTU0kgPSBzdEdldFJzcnBfUnNwLndBbnRSc3NpWzFdOw0KCQkJCQkJVUlOVDE2IHdBbnQxUlNTSURlYyA9IHN0R2V0UnNycF9Sc3Aud0FudFJzc2lEZWNbMV07DQoJCQkJCQlkb3VibGUgZEFudDFSU1NJID0gKGRvdWJsZSkod0FudDFSU1NJICsgKHdBbnQxUlNTSURlYy8xMjguMCkgLSA2NTUzNSk7DQoJCQkJCQkNCgkJCQkJCXN3aXRjaChhbnRfbnVtKQ0KCQkJCQkJew0KCQkJCQkJICAgIC8vu/HIodb3wrdyc3NpDQoJCQkJCQkJY2FzZSAxMDoNCgkJCQkJCQl7IA0KCQkJCQkJCSAgICBzcHJpbnRmKHN0clJTU0ksIiUuMmYiLGRBbnQwUlNTSSk7DQoJCQkJCQkgICAgICAgIHNlbmRfcXVlcnlfcmVzdWx0KGZkLCAiUlNTSSIsc3RyUlNTSSk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCQkvL7vxyKG4qMK3cnNzaQ0KCQkJCQkJCWNhc2UgMTE6DQoJCQkJCQkJew0KCQkJCQkJCSAgICBzcHJpbnRmKHN0clJTU0ksIiUuMmYiLGRBbnQxUlNTSSk7DQoJCQkJCQkgICAgICAgIHNlbmRfcXVlcnlfcmVzdWx0KGZkLCAiUlNTSSIsc3RyUlNTSSk7DQoJCQkJCQkJCWJyZWFrOw0KCQkJCQkJCX0NCgkJCQkJCQkvL7vxyKHW97iowrdyc3NpDQoJCQkJCQkJZGVmYXVsdDoNCgkJCQkJCQl7DQoJCQkJCQkJICAgIHNwcmludGYoc3RyUlNTSSwiJS4yZiwlLjJmIixkQW50MFJTU0ksZEFudDFSU1NJKTsNCgkJCQkJCSAgICAgICAgc2VuZF9xdWVyeV9yZXN1bHQoZmQsICJSU1NJIixzdHJSU1NJKTsNCgkJCQkJCQkJYnJlYWs7DQoJCQkJCQkJfQ0KCQkJCQkgICAgfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJc2VuZF9lcnJvcihmZCk7DQoJCQkJCX0NCgkJCQkgICAgDQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQljYXNlIDB4NTAwOi8vWkFNVF9MVEVBX1NFVF9OU1RfSU5JVA0KCQkJCXsNCgkJCQkgICAgaWYocGh5X3JldCA9PSAwKQ0KCQkJCSAgICB7DQoJCQkJICAgIAlzZW5kX29rKGZkKTsNCgkJCQkgICAgfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCXNlbmRfZXJyb3IoZmQpOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCQlkZWZhdWx0Og0KCQkJCXsNCgkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogbHRlX3BoeV9tc2dfaWQgPSAlIzA0eFxuIiwgX19GVU5DVElPTl9fLCBwaHlfbXNnX2lkKTsJCQ0KCQkJCQlicmVhazsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWJyZWFrOw0KCQl9DQoJCWRlZmF1bHQ6DQoJCXsNCgkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHVua25vd24gbXNnX2lkID0gJSMwNHhcbiIsIF9fRlVOQ1RJT05fXywgbXNnX2lkKTsJCQ0KCSAgICAJYnJlYWs7DQoJCX0NCgl9DQoNCglyZXR1cm4gMTsNCiAgICANCn0NCg0KLyoqDQogKiBAYnJpZWYgtsHIoWNwsuC1xLe0wKHP+8+iz9+zzLqvyv0NCiAqIEBwYXJhbVtpbl0gYXJncyDP37PMuq/K/bLOyv0NCiAqIEByZXR1cm4gTi9BDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIHZvaWQqIFJlYWRGcm9tQ1BUaHJlYWQodm9pZCogYXJncykNCnsNCiAgICAvLyBSZWFkIGZyb20gQVAtQ1AgY2hhbm5lbA0KICAgIGNoYXIgKnJlY2VpdmVfYnVmZmVyID0gTlVMTDsNCg0KCVVOVVNFRChhcmdzKTsNCgkNCglyZWNlaXZlX2J1ZmZlciA9IG1hbGxvYyhNQVhfUEFDS0VUX0xFTkdUSCk7DQogICAgaWYgKHJlY2VpdmVfYnVmZmVyID09IE5VTEwpDQogICAgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCglwcmN0bChQUl9TRVRfTkFNRSwgIkFtdFJlYWRGcm9tQ1AiKTsNCg0KICAgIHdoaWxlICgxKQ0KICAgIHsNCiAgICAgICAgaW50IHJlYWRfbGVuID0gQW10X1JlY2VpdmVEYXRhKGdfYW10X2ZkX2NwLCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCk7DQoNCiAgICAgICAgaWYgKHJlYWRfbGVuID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogUmVjZWl2ZSBjcCBkYXRhLCByZWFkX2xlbiA9ICVkIS5cbiIsIF9fRlVOQ1RJT05fXywgcmVhZF9sZW4pOw0KDQogICAgICAgICAgICBpZiAoZ19hbXRfZmRfY3VycmVudCAmJiAqZ19hbXRfZmRfY3VycmVudCA+PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKGdfYW10X2F0X21vZGUgIT0gMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIEFtdF9TZW5kRGF0YSgqZ19hbXRfZmRfY3VycmVudCwgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgcmVhZF9sZW4pOw0KICAgICAgICAgICAgICAgIH0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkNCiAgICAgICAgICAgICAgICAgICBBdF9TZW5kRGF0YSgqZ19hbXRfZmRfY3VycmVudCwgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgcmVhZF9sZW4pOw0KCQkJCX0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogQ3VycmVudCBmZCBpcyB3cm9uZy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICB9DQoNCiNpZiAwICAgICAgICAgICAgDQogICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzID0gY3Budl9Gc0djV2FpdChGU19OVlJPRlMpOw0KICAgICAgICAgICAgaWYoc3RhdHVzICE9IENQTlZfT0spDQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogY3Budl9Gc0djV2FpdCBmYWlsLCBlcnIgPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsNCiNlbmRpZg0KCQl9DQogICAgfQ0KDQogICAgZnJlZShyZWNlaXZlX2J1ZmZlcik7DQogICAgcmV0dXJuIE5VTEw7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgtsHIocbky/thcHC1xM/7z6LP37PMuq/K/Q0KICogQHBhcmFtW2luXSBhcmdzIM/fs8y6r8r9ss7K/Q0KICogQHJldHVybiBOL0ENCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgdm9pZCogUmVjdk1zZ0Zyb21BcHBUaHJlYWQodm9pZCogYXJncykNCnsNCiAgICBpbnQgaVJldCA7DQogICAgTVNHX0JVRiBzdE1zZyA9IHswfTsNCiAgICBMT05HIG1zZ1NpemUgPSAgc2l6ZW9mKE1TR19CVUYpIC0gc2l6ZW9mKExPTkcpOw0KDQoJVU5VU0VEKGFyZ3MpOw0KDQogICAgcHJjdGwoUFJfU0VUX05BTUUsICJBbXRSZWN2QXBwTXNnIik7DQogICAgd2hpbGUoMSkNCiAgICB7DQogICAgICAgIGlSZXQgPSAwOw0KICAgICAgICBtZW1zZXQoJnN0TXNnLCAweDAwLCBzaXplb2YoTVNHX0JVRikpOw0KDQogICAgICAgIGlSZXQgPSBtc2dyY3YoZ19hbXRfaU1zZ0hhbmRsZSwgJnN0TXNnLCBtc2dTaXplLCAwLCAwKTsNCiAgICAgICAgaWYoaVJldCA+PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBtc2djbWQgPSAweCV4LGRhdGFsZW49JWQuXG4iLCBfX0ZVTkNUSU9OX18sc3RNc2cudXNNc2dDbWQsc3RNc2cudXNEYXRhTGVuKTsNCgkJCQ0KICAgICAgICAgICAgc3dpdGNoIChzdE1zZy51c01zZ0NtZCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfQkFUVEVSWV9WT0xUQUdFX1RFU1RfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY3YgIE1TR19DTURfQU1UX0JBVFRFUllfVk9MVEFHRV9URVNUX1JTUC5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0JBVFRFUllfVk9MVEFHRSwgcmVzdWx0LCAodW5zaWduZWQgY2hhciAqKXN0TXNnLmF1Y0RhdGFCdWYsIHN0TXNnLnVzRGF0YUxlbik7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfS0VZX1RFU1RfU1RBUlRfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogS0VZX1RFU1RfU1RBUlQgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0tFWUJPQVJEX1NUQVJULCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9LRVlfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfS0VZQk9BUkRfU1RPUCwgcmVzdWx0LCAodW5zaWduZWQgY2hhciAqKXN0TXNnLmF1Y0RhdGFCdWYsIHN0TXNnLnVzRGF0YUxlbik7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfTENEX1RFU1RfU1RBUlRfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogTENEX1RFU1RfU1RBUlQgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfTENEX1NUQVJULCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX0xDRF9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQoJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogTENEX1RFU1RfU1RPUCByZXN1bHQ9JWRcbiIsIF9fRlVOQ1RJT05fXyxyZXN1bHQpOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IExDRF9URVNUX1NUT1AgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfTENEX1NUT1AsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfTENEX0JBQ0tMSUdIVF9URVNUX1NUQVJUX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IExDRF9CQUNLTElHSFRfVEVTVF9TVEFSVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9MQ0RCQUNLTElHSFRfU1RBUlQsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfTENEX0JBQ0tMSUdIVF9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogTENEX0JBQ0tMSUdIVF9URVNUX1NUT1AgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfTENEQkFDS0xJR0hUX1NUT1AsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfVklCUkFUT1JfVEVTVF9TVEFSVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBWSUJSQVRPUl9URVNUX1NUQVJUIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX1ZJQlJBVE9SX1NUQVJULCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1ZJQlJBVE9SX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBWSUJSQVRPUl9URVNUX1NUT1AgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfVklCUkFUT1JfU1RPUCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9DQU1FUkFfVEVTVF9TVEFSVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBDQU1FUkFfVEVTVF9TVEFSVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9DQU1FUkFfQkFDS19TVEFSVCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9DQU1FUkFfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IENBTUVSQV9URVNUX1NUT1AgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfQ0FNRVJBX0JBQ0tfU1RPUCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9TUEVBS0VSX1RFU1RfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY3YgIE1TR19DTURfQU1UX1NQRUFLRVJfVEVTVF9SU1AuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogU1BFQUtFUl9URVNUIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0FVRElPX01JQ19TUEVBS0VSLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1NQRUFLRVJfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiByZWN2ICBNU0dfQ01EX0FNVF9TUEVBS0VSX1RFU1RfU1RPUF9SU1AuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9BVURJT19NSUNfU1BFQUtFUl9TVE9QLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1JFQ0VJVkVSX1RFU1RfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY3YgIE1TR19DTURfQU1UX1JFQ0VJVkVSX1RFU1RfUlNQLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFJFQ0VJVkVSX1RFU1QgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfQVVESU9fTUlDX1JFQ0VJVkVSLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1JFQ0VJVkVSX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjdiAgTVNHX0NNRF9BTVRfUkVDRUlWRVJfVEVTVF9TVE9QX1JTUC5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0FVRElPX01JQ19SRUNFSVZFUl9TVE9QLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1RQX1RFU1RfU1RBUlRfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogVFBfVEVTVF9TVEFSVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9UUF9TVEFSVCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9UUF9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogVFBfVEVTVF9TVE9QIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX1RQX1NUT1AsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfR1NFTlNPUl9URVNUX1NUQVJUX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9HU0VOU09SX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoJCQkNCgkgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfV0lGSV9URVNUX1NUQVJUX1JTUDoNCgkJCXsNCgkJCQlpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCgkJCQlyZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIAlyZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCXJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFdpZmkgdGVzdCBmYWlsISIsIF9fRlVOQ1RJT05fXyk7DQoJCQkJfQ0KDQoJCQkJQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9XSUZJLCByZXN1bHQsIE5VTEwsIDApOw0KCQkJCWJyZWFrOw0KCQkJfQ0KDQoJCQljYXNlIE1TR19DTURfQU1UX0ZMQVNITElHSFRfU1RBUlRfUlNQOg0KCQkJew0KCQkJCWludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KCQkJCXJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgCXJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogZmxhc2hsaWdodCB0ZXN0IGZhaWwhIiwgX19GVU5DVElPTl9fKTsNCgkJCQl9DQoNCgkJCQlBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0ZMQVNITElHSFRfU1RBUlQsIHJlc3VsdCwgTlVMTCwgMCk7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQkvL2dwc7LiytTP+8+iu9jTpg0KICAgICAgICAgICAgY2FzZSBLV0FUQ0hfTVNHX0dQU19SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10X1Byb2Nlc3NfR3BzX1JzcCgmc3RNc2csRklEX0dQU19NT0RVTEVfVEVTVCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KCXJldHVybiBOVUxMOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmILzT1Niwrr/GzqJXSUZJucy8/g0KICogQHBhcmFtW2luXSBhcmdzIM/fs8y6r8r9ss7K/Q0KICogQHJldHVybiBOL0ENCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgdm9pZCogTG9hZFdpZmlGaXJtd2FyZVRocmVhZCh2b2lkKiBhcmdzKQ0Kew0KICAgIGludCByZXQgPSAtMTsNCiAgICBVTlVTRUQoYXJncyk7DQoJDQoJcHJjdGwoUFJfU0VUX05BTUUsICJMb2FkV2lmaUZpcm13YXJlVGhyZWFkIik7DQoNCgkjaWYgKGRlZmluZWQoX19BSUNfODgwMERXX0NISVBfXykpDQoJcmV0ID0gd2lmaV9pb2N0bF9oYW5kbGUoMyk7IC8vvNPU2LLiytS5zLz+DQoJaWYocmV0IDwgMCkNCgl7DQoJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBsb2FkIEFJQ184ODAwRFcgZmlybXdhcmUgZmFpbCEgcmV0PSVkLlxuIiwgX19GVU5DVElPTl9fLCByZXQpOw0KCX0NCiAgICBlbHNlDQoJew0KCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBsb2FkIEFJQ184ODAwRFcgZmlybXdhcmUgc3VjY2VzcyEgcmV0PSVkLlxuIiwgX19GVU5DVElPTl9fLCByZXQpOw0KCX0NCgkjZW5kaWYNCgkNCiAgICByZXR1cm4gTlVMTDsNCn0NCg0KDQovKioNCiAqIEBicmllZiBBTVTP+8+itPKw/LeiuPhDUA0KICogQHBhcmFtW2luXSBmZCDOxLz+w+jK9rf7DQogKiBAcGFyYW1baW5dIG1zZ19pZCBGSUQNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILPJuaa3tbvYMA0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyBpbnQgQW10X1NlbmRNZXNzYWdlVG9BbXRhZ2VudChpbnQgZmQsIHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgLy8gU1RYICBUSUQgIEZJRCAgIERhdGEgIENoZWNrICBFVFgNCiAgICB1bnNpZ25lZCBpbnQgQ21kQ291bnQgPSAxICsgMSArIDEgKyBidWZfbGVuICsgMSAgICsgMTsNCiAgICB1bnNpZ25lZCBjaGFyICpwUnNwID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwU1RYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRVRYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwVElEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRklEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwQ2hlY2sgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBEYXRhID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyIENoZWNrU3VtID0gMDsNCiAgICB1bnNpZ25lZCBpbnQgaSA9IDA7DQoNCiAgICBwUnNwID0gbWFsbG9jKENtZENvdW50KTsNCglpZihwUnNwID09IE5VTEwpDQoJCXJldHVybiAtMTsNCiAgICBtZW1zZXQocFJzcCwgMCwgQ21kQ291bnQpOw0KDQogICAgcFNUWCA9ICZwUnNwWzBdOw0KICAgIHBFVFggPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuICsgMV07DQogICAgcFRJRCA9ICZwUnNwWzFdOw0KICAgIHBGSUQgPSAmcFJzcFsxICsgMV07DQogICAgcENoZWNrID0gJnBSc3BbMSArIDEgKyAxICsgYnVmX2xlbl07DQogICAgcERhdGEgPSAmcFJzcFsxICsgMSArIDFdOw0KCQ0KICAgICpwU1RYID0gMHgwMjsNCiAgICAqcEVUWCA9IDB4MDI7DQogICAgKnBUSUQgPSAobXNnX2lkICYgMHhGRjAwKSA+PiA4Ow0KICAgICpwRklEID0gKG1zZ19pZCAmIDB4RkYpOw0KDQogICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGJ1Zl9sZW4gPiAwKQ0KICAgIHsNCiAgICAgICAgbWVtY3B5KHBEYXRhLCBidWYsIGJ1Zl9sZW4pOw0KICAgIH0NCg0KICAgIENoZWNrU3VtID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCAoMSArIDEgKyBidWZfbGVuKTsgaSsrKQ0KICAgICAgICBDaGVja1N1bSBePSBwUnNwWzEgKyBpXTsNCg0KICAgICpwQ2hlY2sgPSBDaGVja1N1bTsNCg0KICAgIEFtdF9TZW5kRGF0YVRvQW10YWdlbnQoZmQsIHBSc3AsIENtZENvdW50KTsNCg0KICAgIGZyZWUocFJzcCk7DQogICAgcmV0dXJuIDA7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPorTysPy3orj4UEMNCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBtc2dfaWQgRklEDQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiCzybmmt7W72DANCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9TZW5kTWVzc2FnZShpbnQgZmQsIHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgLy8gU1RYICBUSUQgIEZJRCAgIERhdGEgIENoZWNrICBFVFgNCiAgICB1bnNpZ25lZCBpbnQgQ21kQ291bnQgPSAxICsgMSArIDEgKyBidWZfbGVuICsgMSAgICsgMTsNCiAgICB1bnNpZ25lZCBjaGFyICpwUnNwID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwU1RYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRVRYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwVElEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRklEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwQ2hlY2sgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBEYXRhID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyIENoZWNrU3VtID0gMDsNCiAgICB1bnNpZ25lZCBpbnQgaSA9IDA7DQoNCiAgICBwUnNwID0gbWFsbG9jKENtZENvdW50KTsNCglpZihwUnNwID09IE5VTEwpDQoJCXJldHVybiAtMTsNCiAgICBtZW1zZXQocFJzcCwgMCwgQ21kQ291bnQpOw0KDQogICAgcFNUWCA9ICZwUnNwWzBdOw0KICAgIHBFVFggPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuICsgMV07DQogICAgcFRJRCA9ICZwUnNwWzFdOw0KICAgIHBGSUQgPSAmcFJzcFsxICsgMV07DQogICAgcENoZWNrID0gJnBSc3BbMSArIDEgKyAxICsgYnVmX2xlbl07DQogICAgcERhdGEgPSAmcFJzcFsxICsgMSArIDFdOw0KDQogICAgKnBTVFggPSAweDAyOw0KICAgICpwRVRYID0gMHgwMjsNCiAgICAqcFRJRCA9IChtc2dfaWQgJiAweEZGMDApID4+IDg7DQogICAgKnBGSUQgPSAobXNnX2lkICYgMHhGRik7DQoNCiAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmX2xlbiA+IDApDQogICAgew0KICAgICAgICBtZW1jcHkocERhdGEsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KDQogICAgQ2hlY2tTdW0gPSAwOw0KDQogICAgZm9yIChpID0gMDsgaSA8ICgxICsgMSArIGJ1Zl9sZW4pOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IHBSc3BbMSArIGldOw0KDQogICAgKnBDaGVjayA9IENoZWNrU3VtOw0KDQogICAgQW10X1NlbmREYXRhKGZkLCBwUnNwLCBDbWRDb3VudCk7DQoNCiAgICBmcmVlKHBSc3ApOw0KICAgIHJldHVybiAwOw0KfQ0KDQojaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQovKioNCiAqIEBicmllZiBBTVTP+8+it6LLzQ0KICogQHBhcmFtW2luXSBmZCDOxLz+w+jK9rf7DQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiC3tbvYt6LLzbXEyv2+3bOktsgNCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9TZW5kRGF0YVRvQ0FQKGludCBmZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICBpbnQgd3JpdGVfbGVuID0gUG9ydFNlbmQoZmQsICh1bnNpZ25lZCBjaGFyKikmYnVmX2xlbiwgc2l6ZW9mKHVuc2lnbmVkIGludCksIFdBSVRfQUxMKTsNCg0KICAgIGlmICh3cml0ZV9sZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGludCkpDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogRmFpbGVkIHRvIHNlbmQgZGF0YV9sZW4gdG8gZmQoJWQpISB3cml0ZV9sZW4gPSAlZC5cbiIsDQogICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4pOw0KICAgICAgICB3cml0ZV9sZW4gPSAwOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmX2xlbiA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIHdyaXRlX2xlbiA9IFBvcnRTZW5kKGZkLCBidWYsIGJ1Zl9sZW4sIFdBSVRfQUxMKTsNCg0KICAgICAgICAgICAgaWYgKHdyaXRlX2xlbiAhPSAoaW50KWJ1Zl9sZW4pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IEZhaWxlZCB0byBzZW5kIGRhdGEgdG8gZmQoJWQpISAod3JpdGVfbGVuID0gJWQpICE9IChidWZfbGVuID0gJWQpLlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmZCwgd3JpdGVfbGVuLCBidWZfbGVuKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiB3cml0ZV9sZW47DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPorTysPy3orj4Q0FQDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gbXNnX2lkIEZJRA0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gs8m5pre1u9gwDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfU2VuZE1lc3NhZ2VUb0NBUChpbnQgZmQsIHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgLy8gU1RYICBUSUQgIEZJRCAgIERhdGEgIENoZWNrICBFVFgNCiAgICB1bnNpZ25lZCBpbnQgQ21kQ291bnQgPSAxICsgMSArIDEgKyBidWZfbGVuICsgMSAgICsgMTsNCiAgICB1bnNpZ25lZCBjaGFyICpwUnNwID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwU1RYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRVRYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwVElEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRklEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwQ2hlY2sgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBEYXRhID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyIENoZWNrU3VtID0gMDsNCiAgICB1bnNpZ25lZCBpbnQgaSA9IDA7DQoNCiAgICBwUnNwID0gbWFsbG9jKENtZENvdW50KTsNCglpZihwUnNwID09IE5VTEwpDQoJCXJldHVybiAtMTsNCiAgICBtZW1zZXQocFJzcCwgMCwgQ21kQ291bnQpOw0KDQogICAgcFNUWCA9ICZwUnNwWzBdOw0KICAgIHBFVFggPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuICsgMV07DQogICAgcFRJRCA9ICZwUnNwWzFdOw0KICAgIHBGSUQgPSAmcFJzcFsxICsgMV07DQogICAgcENoZWNrID0gJnBSc3BbMSArIDEgKyAxICsgYnVmX2xlbl07DQogICAgcERhdGEgPSAmcFJzcFsxICsgMSArIDFdOw0KCQ0KICAgICpwU1RYID0gMHgwMjsNCiAgICAqcEVUWCA9IDB4MDI7DQogICAgKnBUSUQgPSAobXNnX2lkICYgMHhGRjAwKSA+PiA4Ow0KICAgICpwRklEID0gKG1zZ19pZCAmIDB4RkYpOw0KDQogICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGJ1Zl9sZW4gPiAwKQ0KICAgIHsNCiAgICAgICAgbWVtY3B5KHBEYXRhLCBidWYsIGJ1Zl9sZW4pOw0KICAgIH0NCg0KICAgIENoZWNrU3VtID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCAoMSArIDEgKyBidWZfbGVuKTsgaSsrKQ0KICAgICAgICBDaGVja1N1bSBePSBwUnNwWzEgKyBpXTsNCg0KICAgICpwQ2hlY2sgPSBDaGVja1N1bTsNCg0KICAgIEFtdF9TZW5kRGF0YVRvQ0FQKGZkLCBwUnNwLCBDbWRDb3VudCk7DQoNCiAgICBmcmVlKHBSc3ApOw0KICAgIHJldHVybiAwOw0KfQ0KI2VuZGlmDQoNCg0KDQovKioNCiAqIEBicmllZiBBTVTP+8+itKbA7bqvyv0NCiAqIEBwYXJhbVtpbl0gbXNnX2lkIEZJRA0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gs8m5pre1u9gwDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfUHJvY2Vzc01lc3NhZ2UodW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICBpZiAobXNnX2lkID49IEZJRF9XSUZJX0NNRF9OT1JUTiAmJiBtc2dfaWQgPD0gRklEX1dJRklfQ01EX0VORCkgLy8gd2lmaSB0ZXN0DQogICAgew0KICAgICAgICBBbXRfV2lmaV9Qcm9jZXNzTXNnKG1zZ19pZCwgYnVmLCBidWZfbGVuKTsNCiAgICB9DQogICAgZWxzZSBpZiAobXNnX2lkID09IEZJRF9HRVRfQ0hJUF9QTEFURk9STSkNCiAgICB7DQogICAgICAgICAvLw0KCSAgICBpZihpc19hbXRfbW9kZSgpKQ0KCSAgICB7DQoJICAgIAlBbXRQcmludGYoQU1UX0VSUk9SICJBTVQgTU9ERSFcbiIpOw0KCSAgICB9DQoJICAgIGVsc2UNCgkgICAgew0KCSAgICAJQW10UHJpbnRmKEFNVF9FUlJPUiAiTm9ybWFsIE1PREUhXG4iKTsNCgkgICAgfQ0KICAgICAgICB1bnNpZ25lZCBjaGFyIGNoaXBUeXBlID0gMDsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogR2V0IGNoaXAgcGxhdGZvcm0gbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsDQogICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1zZ19pZCwgYnVmX2xlbik7DQogICAgICAgIGNoaXBUeXBlID0gMTsgLyoxOjc1MjBWMyAyOjcxMDAqLw0KDQogICAgICAgIGlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAmY2hpcFR5cGUsIHNpemVvZih1bnNpZ25lZCBjaGFyKSkgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICB9DQogICAgZWxzZSBpZiAobXNnX2lkID49IEZJRF9HUFNfTU9EVUxFX1RFU1QgJiYgbXNnX2lkIDw9IEZJRF9HUFNfQ01EX0VORCkgLy8gZ3BzIHRlc3QNCiAgICB7DQogICAgICAgIEFtdF9HcHNfUHJvY2Vzc01zZyhtc2dfaWQsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KICAgIGVsc2UgaWYgKG1zZ19pZCA+PSBNU0dfREVWSUNFVEVTVF9TVEFSVCAmJiBtc2dfaWQgPD0gTVNHX0RFVklDRVRFU1RfRU5EKQ0KICAgIHsNCiAgICAgICAgQW10X0RldmljZVRlc3RfUHJvY2Vzc01zZyhtc2dfaWQsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KCWVsc2UgaWYgKG1zZ19pZCA9PSBGSURfQU1UX0VORCkNCiAgICB7DQoJCXVuc2lnbmVkIGludCBzdGF0dXMgPSBDUE5WX09LOy8vY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfTlZST0ZTLCAxKTsNCgkJLyoNCgkgICAgICAgaWYoc3RhdHVzICE9IENQTlZfT0spDQoJCXsNCgkJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0ciBSVyBudnJvZnMgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJCXJldHVybiAtMTsNCgkJfSovDQoJCQ0KICAgICAgICBzdGF0dXMgPSBjcG52X0ZzR2NXYWl0KEZTX05WUk9GUyk7DQoJCWlmKHN0YXR1cyA9PSBDUE5WX09LKQ0KCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogY3Budl9Gc0djV2FpdCBvay5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJCWVsc2UNCgkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGNwbnZfRnNHY1dhaXQgZmFpbCwgZXJyID0gJWQuXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7DQoNCgkJaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsICh1bnNpZ25lZCBjaGFyKikmc3RhdHVzLCBzaXplb2YodW5zaWduZWQgaW50KSkgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICB9DQoJZWxzZSBpZiAobXNnX2lkID09IEZJRF9BTVRfRVhJVCkNCgl7DQoJICAgIHVuc2lnbmVkIGludCBzdGF0dXMgPSAwOw0KCQlpZiAoQW10X0NyZWF0ZVJlc3BvbnNlKG1zZ19pZCwgKHVuc2lnbmVkIGNoYXIqKSZzdGF0dXMsIHNpemVvZih1bnNpZ25lZCBpbnQpKSA9PSAtMSkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KCX0NCiAgICBlbHNlIGlmIChtc2dfaWQgPT0gRklEX0VYX0NPTU1PTl9TRVRCT09UTU9ERSkNCiAgICB7DQogICAgICAgIC8vIHNldCBub3JtYWwgbW9kZQ0KICAgICAgICB1bnNpZ25lZCBjaGFyIGJvb3Rtb2RlW10gPSB7MHhGRiwgMHhGRn07ICAgICAgICANCgkJdW5zaWduZWQgaW50IGR3UmV0ID0gQ1BOVl9PSzsNCg0KICAgICAgICAvL3N0cnVjdCB0aW1lc3BlYyB0czsNCgkJLy9jbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsNCgkJLy9BbXRQcmludGYoQU1UX0lORk8gIlslOGQuJTAzZF0gJXM6IGNwbnZfRnNHY1dhaXQgc3RhcnQuXG4iLCB0cy50dl9zZWMsIHRzLnR2X25zZWMgLyAxMDAwMDAwLF9fRlVOQ1RJT05fXyk7DQogICAgICAgIHVuc2lnbmVkIGNoYXIgbW9kZSA9IDQ7DQoJCWlmKGJ1Zl9sZW4gPT0gc2l6ZW9mKG1vZGUpKQ0KCQl7DQoJCSAgICBtZW1jcHkoJm1vZGUsIGJ1Ziwgc2l6ZW9mKG1vZGUpKTsNCgkJfQ0KCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBib290IG1vZGU9JWRcbiIsIF9fRlVOQ1RJT05fXyxtb2RlKTsNCgkJc3dpdGNoKG1vZGUpDQoJCXsNCgkJICAgICBjYXNlIDA6IC8vdXNlciBtb2RlDQogICAgICAgICAgICAgeyAgIA0KICAgICAgICAgICAgICAgICBudl9zZXRfaXRlbShOVl9STywgInVzYl9tb2RldHlwZSIsICJ1c2VyIiwgMSk7DQoJCQkJIG52X2NvbW1pdChOVl9STyk7DQoJCQkJIGJvb3Rtb2RlWzBdID0weDU0Ow0KICAgICAgICAgICAgICAgICBib290bW9kZVsxXSA9MHgwMDsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGNhc2UgMTovL2RlYnVnIG1vZGUNCiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIG52X3NldF9pdGVtKE5WX1JPLCAidXNiX21vZGV0eXBlIiwgImRlYnVnIiwgMSk7DQoJCQkJIG52X2NvbW1pdChOVl9STyk7DQoJCQkJIGJvb3Rtb2RlWzBdID0weDU0Ow0KICAgICAgICAgICAgICAgICBib290bW9kZVsxXSA9MHgwMTsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGNhc2UgMjovL2ZhY3RvcnkgbW9kZQ0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgbnZfc2V0X2l0ZW0oTlZfUk8sICJ1c2JfbW9kZXR5cGUiLCAiZmFjdG9yeSIsIDEpOw0KCQkJCSBudl9jb21taXQoTlZfUk8pOw0KCQkJCSBib290bW9kZVswXSA9MHg1NDsNCiAgICAgICAgICAgICAgICAgYm9vdG1vZGVbMV0gPTB4MDI7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICBjYXNlIDM6Ly9hbXQgbW9kZQ0KICAgICAgICAgICAgIHsNCgkJCSAJIC8vbnZfc2V0X2l0ZW0oTlZfUk8sICJ1c2JfbW9kZXR5cGUiLCAiYW10IiwgMSk7DQoJCQkgCSAvL252X2NvbW1pdChOVl9STyk7DQoJCQkJIGJvb3Rtb2RlWzBdID0weDU0Ow0KICAgICAgICAgICAgICAgICBib290bW9kZVsxXSA9MHg0RDsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQoJCX0NCg0KICAgICAgICBkd1JldCA9IGFtdF9zZXRfYm9vdG1vZGUoYm9vdG1vZGUpOw0KICAgICAgICBpZiAoZHdSZXQgPT0gQ1BOVl9PSykNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogc2V0IGJvb3QgbW9kZTogc3VjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBzZXQgYm9vdCBtb2RlOiBmYWlsZWQuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQoJCS8vY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7DQoJCS8vQW10UHJpbnRmKEFNVF9JTkZPICJbJThkLiUwM2RdICVzOiBjcG52X0ZzR2NXYWl0IG9rLlxuIiwgdHMudHZfc2VjLCB0cy50dl9uc2VjIC8gMTAwMDAwMCwgX19GVU5DVElPTl9fKTsNCiAgICAgIA0KICAgICAgICBpZiAoQW10X0NyZWF0ZVJlc3BvbnNlKG1zZ19pZCwgKHVuc2lnbmVkIGNoYXIqKSZkd1JldCwgc2l6ZW9mKHVuc2lnbmVkIGludCkpID09IC0xKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogU2VuZCBkYXRhIGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQogICAgfQ0KCWVsc2UgaWYobXNnX2lkID09IEZJRF9DSEVDS19TT0ZURE9HX0NJUEhFUl9URVhUKQ0KICAgIHsNCiAgICAgICAgVUlOVDggc29mdGRvZ19jaXBoZXJfdGV4dHNbT1NfRkxBU0hfQU1UX0NPTU1fUk9fU09GVERPR19DSVBIRVJfVEVYVF9TSVpFXSA9IHswfTsNCiAgICAJaWYoIWFtdF9yZWFkX252X2l0ZW0oQUJTT0ZURE9HX0NJUEhFUl9URVhUX05WUEFSQU0sc29mdGRvZ19jaXBoZXJfdGV4dHMsc2l6ZW9mKHNvZnRkb2dfY2lwaGVyX3RleHRzKSkpDQogICAgCXsNCiAgICAgICAgCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCBzb2Z0ZG9nX2NpcGhlcl90ZXh0cywgc2l6ZW9mKHNvZnRkb2dfY2lwaGVyX3RleHRzKSkgPT0gLTEpDQogICAgICAgICAgICB7DQogICAgICAgICAgIAkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgCX0NCiAgICAgICAJCWVsc2UNCiAgICAgICAgCXsNCiAgICAgICAgICAgIAlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgCQl9DQogICAgCX0NCgkgICAgZWxzZQ0KCSAgICB7DQoJCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogcmVhZCBzb2Z0ZG9nIGNpcGhlciB0ZXh0IGluIGFkZHJlc3M6MHgleCBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fLE9TX0ZMQVNIX0FNVF9DT01NX1JPX1NPRlRET0dfQ0lQSEVSX1RFWFRfQUREUkVTUyk7DQoJCX0NCiAgICB9DQoJZWxzZSBpZihtc2dfaWQgPT0gRklEX1NFVF9CQVRfREVUX0ZMQUcpDQogICAgew0KICAgICAgICB1bnNpZ25lZCBpbnQgIHJldENvZGUgPSBDUE5WX0VSUk9SOw0KICAgICAgICBpbnQgYmF0X3ZhbHVlID0gLTE7DQogICAgICAgIG1lbWNweSgmYmF0X3ZhbHVlLCBidWYsIHNpemVvZihpbnQpKTsNCgkJcmV0Q29kZSA9YW10X3NldF9iYXRkZXRfZmxhZyhiYXRfdmFsdWUpOyAgIA0KICAgIA0KICAgICAgICBpZiAocmV0Q29kZSA9PSBDUE5WX09LKQ0KICAgICAgICB7DQogICAgICAgIAlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBhbXRfc2V0X2JhdGRldF9mbGFnIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQl9DQogICAgCWVsc2UNCiAgICAJew0KICAgIAkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYW10X3NldF9iYXRkZXRfZmxhZyBmYWlsLlxuIiwgX19GVU5DVElPTl9fKTsgIA0KICAgIAl9DQoJCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopJnJldENvZGUsIHNpemVvZihyZXRDb2RlKSkgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICAgICAJZWxzZQ0KICAgICAgICB7DQogICAgICAgIAlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgCX0NCiAgICB9DQoJZWxzZSBpZihtc2dfaWQgPT0gRklEX0dFVF9CQVRfREVUX0ZMQUcpDQogICAgew0KICAgICAgICB1bnNpZ25lZCBpbnQgIHJldENvZGUgPSBDUE5WX0VSUk9SOw0KICAgICAgICBpbnQgYmF0X3ZhbHVlID0gMDsNCiAgICAgICAgcmV0Q29kZSA9YW10X2dldF9iYXRkZXRfZmxhZygmYmF0X3ZhbHVlKTsgICANCiAgICANCiAgICAgICAgaWYgKHJldENvZGUgPT0gQ1BOVl9PSykNCiAgICAgICAgew0KICAgICAgICAJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYW10X2dldF9iYXRkZXRfZmxhZyBzdWNjZXNzLmJhdF92YWx1ZT0lZFxuIiwgX19GVU5DVElPTl9fLGJhdF92YWx1ZSk7DQoJCQlpZiAoQW10X0NyZWF0ZVJlc3BvbnNlKG1zZ19pZCwgKHVuc2lnbmVkIGNoYXIqKSZiYXRfdmFsdWUsIHNpemVvZihiYXRfdmFsdWUpKSA9PSAtMSkNCgkgICAgICAgIHsNCgkgICAgICAgIAlBbXRQcmludGYoQU1UX0VSUk9SICIlczogU2VuZCBkYXRhIGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCSAgICAgICAgfQ0KCSAgICAgICAJZWxzZQ0KCSAgICAgICAgew0KCSAgICAgICAgCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCgkgICAgICAgCX0NCgkJfQ0KICAgIAllbHNlDQogICAgCXsNCiAgICAJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGFtdF9nZXRfYmF0ZGV0X2ZsYWcgZmFpbC5cbiIsIF9fRlVOQ1RJT05fXyk7ICANCiAgICAJfQ0KCX0NCgllbHNlIGlmKG1zZ19pZCA9PSBGSURfUklOSVNPRlRWRVJTSU9OKQ0KICAgIHsNCiAgICAgICAgdW5zaWduZWQgaW50IHJldENvZGUgPSBDUE5WX0VSUk9SOw0KCSAgICBjaGFyIFRtcFNvZnRWZXJzaW9uW1pQU19SRUZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9JTlRfTEVOKzFdPXswfTsNCg0KCSAgICByZXRDb2RlID0gY3Budl9Odkl0ZW1SZWFkKFpQU19SRUZfTVNJTkZPX1NPRlRWRVJTSU9OX0lOVF9CQVNFX0FERFIsICh1bnNpZ25lZCBjaGFyKilUbXBTb2Z0VmVyc2lvbiwgWlBTX1JFRl9NU0lORk9fTUFYX1NPRlRWRVJTSU9OX0lOVF9MRU4pOw0KCSAgICBpZiAocmV0Q29kZSA9PSBDUE5WX09LKQ0KICAgICAgICB7DQogICAgICAgICAgICBUbXBTb2Z0VmVyc2lvbltaUFNfUkVGX01TSU5GT19NQVhfU09GVFZFUlNJT05fSU5UX0xFTl0gPSAnXDAnOw0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogaW5uZXIgdmVyc2lvbj0lc1xuIiwgX19GVU5DVElPTl9fLFRtcFNvZnRWZXJzaW9uKTsNCgkJCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopVG1wU29mdFZlcnNpb24sIHNpemVvZihUbXBTb2Z0VmVyc2lvbikpID09IC0xKQ0KCSAgICAgICAgew0KCSAgICAgICAgCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJICAgICAgICB9DQoJICAgICAgIAllbHNlDQoJICAgICAgICB7DQoJICAgICAgICAJQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCSAgICAgICAJfQ0KCQl9DQogICAgCWVsc2UNCiAgICAJew0KICAgIAkgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogZ2V0IGlubmVyIHZlcnNpb24gZmFpbCFcbiIsIF9fRlVOQ1RJT05fXyk7ICANCiAgICAJfQkNCiAgICB9DQoJZWxzZSBpZihtc2dfaWQgPT0gRklEX1JPVVRTT0ZUVkVSU0lPTikNCiAgICB7DQogICAgICAgIHVuc2lnbmVkIGludCByZXRDb2RlID0gQ1BOVl9FUlJPUjsNCiAgICAgICAgY2hhciBUbXBFeHRjZ21yW1pQU19SRUZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9FWFRfTEVOKzFdPXswfTsNCg0KCSAgICByZXRDb2RlID1jcG52X052SXRlbVJlYWQoWlBTX1JFRl9NU0lORk9fU09GVFZFUlNJT05fRVhUX0JBU0VfQUREUiwgKHVuc2lnbmVkIGNoYXIgKilUbXBFeHRjZ21yLCBaUFNfUkVGX01TSU5GT19NQVhfU09GVFZFUlNJT05fRVhUX0xFTik7DQoJICAgIGlmIChyZXRDb2RlID09IENQTlZfT0spDQogICAgICAgIHsNCiAgICAgICAgICAgIFRtcEV4dGNnbXJbWlBTX1JFRl9NU0lORk9fTUFYX1NPRlRWRVJTSU9OX0VYVF9MRU5dID0gJ1wwJzsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IG91dGVyIHZlcnNpb249JXNcbiIsIF9fRlVOQ1RJT05fXyxUbXBFeHRjZ21yKTsNCgkJCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopVG1wRXh0Y2dtciwgc2l6ZW9mKFRtcEV4dGNnbXIpKSA9PSAtMSkNCgkgICAgICAgIHsNCgkgICAgICAgIAlBbXRQcmludGYoQU1UX0VSUk9SICIlczogU2VuZCBkYXRhIGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCSAgICAgICAgfQ0KCSAgICAgICAJZWxzZQ0KCSAgICAgICAgew0KCSAgICAgICAgCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCgkgICAgICAgCX0NCgkJfQ0KICAgIAllbHNlDQogICAgCXsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGdldCBvdXRlciB2ZXJzaW9uIGZhaWwhXG4iLCBfX0ZVTkNUSU9OX18pOyAgDQogICAgCX0JCQ0KICAgIH0NCgllbHNlIGlmKChtc2dfaWQgPj0gRklEX0ZVTl9URVNUX1NUQVJUKSYmKG1zZ19pZCA8PSBGSURfRlVOX1RFU1RfRU5EKSkNCgl7DQoJCUFtdF9GdW5jVGVzdF9Qcm9jZXNzTXNnKG1zZ19pZCwgYnVmLCBidWZfbGVuKTsNCgl9DQoJI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KCWVsc2UgaWYoKG1zZ19pZCA+PSBGSURfQ0FQX1RFU1RfU1RBUlQpJiYobXNnX2lkIDw9IEZJRF9DQVBfVEVTVF9FTkQpKQ0KCXsNCgkJIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY2VpdmUgY2FwIG1zZy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBDQVANCiAgICAgICAgaWYgKEFtdF9TZW5kTWVzc2FnZVRvQ0FQKGdfYW10X2ZkX2NhcCwgbXNnX2lkLCBidWYsIGJ1Zl9sZW4pID09IC0xKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogRmFpbGVkIHRvIHNlbmQgZGF0YSB0byBjYXAsIG1zZ19pZCA9ICUjMDR4LCBidWZfbGVuID0gJWQuXG4iLA0KICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSB0byBjYXAsIG1zZ19pZCA9ICUjMDR4LCBidWZfbGVuID0gJWQuXG4iLA0KICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICAgICAgfQ0KCX0NCgkjZW5kaWYNCiAgICBlbHNlIC8vIENQIG1lc3NhZ2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY2VpdmUgb2xkIGNwIG1zZy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIC8vIFNlbmQgbWVzc2FnZSB0byBDUA0KICAgICAgIGlmIChBbXRfU2VuZE1lc3NhZ2VUb0FtdGFnZW50KGdfYW10X2ZkX2NwLCBtc2dfaWQsIGJ1ZiwgYnVmX2xlbikgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBGYWlsZWQgdG8gc2VuZCBkYXRhIHRvIGNwLCBtc2dfaWQgPSAlIzA0eCwgYnVmX2xlbiA9ICVkLlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1zZ19pZCwgYnVmX2xlbik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgdG8gY3AsIG1zZ19pZCA9ICUjMDR4LCBidWZfbGVuID0gJWQuXG4iLA0KICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiAwOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K94rD8DQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiBOL0ENCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgdm9pZCBBbXRfQ29tcG9zZUFuZFByb2Nlc3ModW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICB1bnNpZ25lZCBjaGFyICpwU1RYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRVRYID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwVElEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwRklEID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyICpwQ2hlY2sgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBEYXRhID0gTlVMTDsNCiAgICB1bnNpZ25lZCBjaGFyIENoZWNrU3VtID0gMDsNCiAgICB1bnNpZ25lZCBpbnQgbXNnX2lkOw0KICAgIHVuc2lnbmVkIGludCBpID0gMDsNCiAgICBwVElEID0gcFRJRDsNCiAgICBwQ2hlY2sgPSBwQ2hlY2s7DQogICAgcERhdGEgPSBwRGF0YTsNCg0KICAgIHBTVFggPSAmYnVmWzBdOw0KICAgIHBFVFggPSAmYnVmW2J1Zl9sZW4gLSAxXTsNCiAgICBwVElEID0gJmJ1ZlsxXTsNCiAgICBwRklEID0gJmJ1ZlsxICsgMV07DQogICAgcENoZWNrID0gJmJ1ZltidWZfbGVuIC0gMl07DQogICAgcERhdGEgPSAmYnVmWzEgKyAxICsgMV07DQoNCiAgICBpZiAoISgoMHgwMiA9PSAqcFNUWCkgJiYgKDB4MDIgPT0gKnBFVFgpKSkNCiAgICB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICBDaGVja1N1bSA9IDA7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgKGJ1Zl9sZW4gLSAyKTsgaSsrKQ0KICAgICAgICBDaGVja1N1bSBePSBidWZbMSArIGldOw0KDQogICAgaWYgKENoZWNrU3VtICE9IDApDQogICAgew0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgLy8gVElE0+tGSUTX6brPyrnTw9LRwKnVubmmxNy6xQ0KICAgIG1zZ19pZCA9ICgqcFRJRCA8PCA4KSB8ICpwRklEOw0KDQogICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICBBbXRfUHJvY2Vzc01lc3NhZ2UobXNnX2lkLCBwRklEICsgMSwgKGJ1Zl9sZW4gLSAxIC0gMSAtIDEgLSAxIC0gMSkpOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K3tMChDQogKiBAcGFyYW1baW5dIG1zZ19pZCBGSUQNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILPJuaa3tbvYMCwgyqew3Le1u9gtMQ0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCmludCBBbXRfQ3JlYXRlUmVzcG9uc2UodW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICBpZiAoZ19hbXRfZmRfY3VycmVudCAmJiAqZ19hbXRfZmRfY3VycmVudCA+PSAwKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIEFtdF9TZW5kTWVzc2FnZSgqZ19hbXRfZmRfY3VycmVudCwgbXNnX2lkLCBidWYsIGJ1Zl9sZW4pOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogQ3VycmVudCBmZCBpcyB3cm9uZy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQp9DQoNCmludCB3ZnN5c3RlbShjb25zdCBjaGFyICogY21kKQ0Kew0KCXBpZF90IHJldCAgPSAgMCA7DQoJcmV0ID0gc29mdF9zeXN0ZW0oY21kKTsNCglBbXRQcmludGYgKEFNVF9FUlJPUiAiWyVzXXJldCA9ICVkLCBXSUZFWElURUQocmV0KT0lZCwgV0VYSVRTVEFUVVMocmV0KSA9JWQiLGNtZCwgcmV0ICwgV0lGRVhJVEVEIChyZXQpLCBXRVhJVFNUQVRVUyAocmV0KSk7DQoJaWYgKCEgKC0xICE9IHJldCAmJiBXSUZFWElURUQgKHJldCkgJiYgMCA9PSBXRVhJVFNUQVRVUyAocmV0KSkpIHsNCgkJcmV0dXJuIC0xOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0KaW50IGNoZWNrX3dsYW4gKHZvaWQpDQp7DQoJaW50IGZpbmRfd2xhbiA9IC0xOw0KCWludCBpID0gMCwgc3VtID0gMDsNCg0KCXdoaWxlICgtMSA9PSBmaW5kX3dsYW4pIHsNCgkJQW10UHJpbnRmIChBTVRfRVJST1IgImZpbmRpbmcgd2xhbiAgaT0lZCwgJWQgcy4uLiIsIGkgLCBzdW0pOw0KCQlmaW5kX3dsYW4gPSB3ZnN5c3RlbSAoImlmY29uZmlnIHdsYW4wIik7DQoJCWlmICgtMT09ZmluZF93bGFuKSB7DQoJCQlpZiAoc3VtID49IDYwKQ0KCQkJCXJldHVybiAgLTE7DQoJCQlzdW0gKz0gMiAqIGk7DQoJCQlzbGVlcCAoMiAqIGkrKyk7DQoJCX0NCgl9DQoJcmV0dXJuIDA7DQp9DQoNCmludCBBbXRfRXhlY3V0ZUNtZChjaGFyICpwY21kLCBjaGFyICpwYnVmZmVyLCBpbnQgbGVuKQ0Kew0KICAgIEZJTEUgKnBQaXBlOw0KCXN0YXRpYyBpbnQgd2lmaV9pbml0ID0gMDsNCiAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBleGVjdXRlIFwiJXNcIiFcbiIsIF9fRlVOQ1RJT05fXywgcGNtZCk7DQogICAgaWYoMCA9PSB3aWZpX2luaXQpDQogICAgew0KCQlpZigwID09IHN0cmNtcChwY21kLCAiaWZjb25maWcgd2xhbjAgdXAiKSl7DQoJCQljaGVja193bGFuKCk7DQoJCQl3aWZpX2luaXQgPSAxOw0KCQl9DQoJfQ0KCQ0KICAgIGlmICgocFBpcGUgPSBwb3BlbihwY21kLCAiciIpKSA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAicG9wZW4gXCIlc1wiIGZhaWx1cmUuXG4iLCBwY21kKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIGludCByZWFkX2xlbiA9IGZyZWFkKHBidWZmZXIsIDEsIGxlbiwgcFBpcGUpOw0KICAgIC8vQW10UHJpbnRmKEFNVF9JTkZPICJmcmVhZCwgcmVhZF9sZW4gPSAlZCwgcGJ1ZmZlciA9ICVzLlxuIiwgcmVhZF9sZW4sIHBidWZmZXIpOw0KDQogICAgcGNsb3NlKHBQaXBlKTsNCiAgICByZXR1cm4gcmVhZF9sZW47DQp9DQoNCnN0YXRpYyBpbnQgaW5pdF9jcF9jaGFubmVsKHZvaWQpDQp7DQogICAgaW50IGZkID0gb3BlbihBTVRfQ1BfQ0hBTk5FTCwgT19SRFdSKTsNCg0KICAgIGlmIChmZCA8IDApDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJGYWlsZWQgdG8gb3BlbiBcIiVzXCIhXG4iLCBBTVRfQ1BfQ0hBTk5FTCk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpZihpb2N0bChmZCwgUlBNU0dfQ1JFQVRFX0NIQU5ORUwsICg4KjEwMjQpKSE9IDApICAgLy8gtLS9qM2otcC089ChOEsNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgImlvY3RybDpSUE1TR19DUkVBVEVfQ0hBTk5FTCBmYWlsIVxuIik7DQogICAgfQ0KICAgIGlmKGlvY3RsKGZkLCBSUE1TR19TRVRfSU5UX0ZMQUcsIE5VTEwpIT0gMCkgICAgICAgLy8gt6LLzc/7z6LKsaOstKW3otbQts8NCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgImlvY3RybDpSUE1TR19TRVRfSU5UX0ZMQUcgZmFpbCFcbiIpOw0KICAgIH0NCiAgICBpZihpb2N0bChmZCwgUlBNU0dfQ0xFQVJfUE9MTF9GTEFHLCBOVUxMKSE9IDApICAgICAgLy8g1+jI+7XEt73KvbbBDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJpb2N0cmw6UlBNU0dfQ0xFQVJfUE9MTF9GTEFHIGZhaWwhXG4iKTsNCgl9DQogICAgcmV0dXJuIGZkOw0KfQ0KDQpzdGF0aWMgaW50IGluaXRfdXNiX2RldmljZSh2b2lkKQ0Kew0KICAgIGludCBmZCA9IG9wZW4oQU1UX1VTQl9ERVYsIE9fUkRXUik7DQoNCiAgICBpZiAoZmQgPCAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiIVxuIiwgQU1UX1VTQl9ERVYpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgUG9ydFNldChmZCk7DQogICAgcmV0dXJuIGZkOw0KfQ0KDQpzdGF0aWMgaW50IGluaXRfaG90cGx1Z19ubCh2b2lkKQ0Kew0KICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBzbmw7DQogICAgYnplcm8oJnNubCwgc2l6ZW9mKHNubCkpOw0KICAgIHNubC5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOw0KICAgIHNubC5ubF9waWQgPSBnZXRwaWQoKTsNCiAgICBzbmwubmxfZ3JvdXBzID0gMTsNCg0KICAgIGludCBzID0gc29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfS09CSkVDVF9VRVZFTlQpOw0KICAgIGlmIChzID09IC0xKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiQ2FuJ3QgY3JlYXRlIGhvdHBsdWcgc29ja2V0IVxuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpZiAoYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJnNubCwgc2l6ZW9mKHNubCkpIDwgMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkNhbid0IGJpbmQgaG90cGx1ZyBzb2NrZXQhXG4iKTsNCgkJY2xvc2Uocyk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICByZXR1cm4gczsNCn0NCg0Kc3RhdGljIGludCBpbml0X3NvY2tldChpbnQgcG9ydCkNCnsNCiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VyYWRkcjsNCiAgICBpbnQgc29ja2ZkID0gLTE7DQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gInBvcnQgPSAlZC5cbiIsIHBvcnQpOw0KDQogICAgc29ja2ZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7DQogICAgaWYgKHNvY2tmZCA9PSAtMSkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkNhbid0IGNyZWF0ZSBzb2NrZXQhXG4iKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIG1lbXNldCgmc2VyYWRkciwwLHNpemVvZihzZXJhZGRyKSk7DQogICAgc2VyYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsNCiAgICBzZXJhZGRyLnNpbl9hZGRyLnNfYWRkciA9IDA7DQogICAgc2VyYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOw0KDQogICAgaWYgKGJpbmQoc29ja2ZkLCAoc3RydWN0IHNvY2thZGRyKikoJnNlcmFkZHIpLCBzaXplb2Yoc2VyYWRkcikpIDwgMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkNhbid0IGJpbmQgcG9ydCAlZCFcbiIsIHBvcnQpOw0KCQljbG9zZShzb2NrZmQpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgaWYgKGxpc3Rlbihzb2NrZmQsIDEpID09IC0xKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiU29ja2V0IGxpc3RlbiBmYWlsZWQhXG4iKTsNCgkJY2xvc2Uoc29ja2ZkKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIHJldHVybiBzb2NrZmQ7DQp9DQoNCiNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCnN0YXRpYyBpbnQgaW5pdF9jYXBfY2hhbm5lbCh2b2lkKQ0Kew0KICAgIGludCBmZCA9IG9wZW4oQU1UX0NBUF9ERVYsIE9fUkRXUik7DQoNCiAgICBpZiAoZmQgPCAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiIVxuIiwgQU1UX0NBUF9ERVYpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgaWYoaW9jdGwoZmQsIFJQTVNHX0NSRUFURV9DSEFOTkVMLCAoNCoxMDI0KSkhPSAwKSAgIC8vILS0vajNqLXAtPPQoTRLDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJpb2N0cmw6UlBNU0dfQ1JFQVRFX0NIQU5ORUwgZmFpbCFcbiIpOw0KICAgIH0NCiAgICBpZihpb2N0bChmZCwgUlBNU0dfU0VUX0lOVF9GTEFHLCBOVUxMKSE9IDApICAgICAgIC8vILeiy83P+8+iyrGjrLSlt6LW0LbPDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJpb2N0cmw6UlBNU0dfU0VUX0lOVF9GTEFHIGZhaWwhXG4iKTsNCiAgICB9DQogICAgaWYoaW9jdGwoZmQsIFJQTVNHX0NMRUFSX1BPTExfRkxBRywgTlVMTCkhPSAwKSAgICAgIC8vINfoyPu1xLe9yr22wQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiaW9jdHJsOlJQTVNHX0NMRUFSX1BPTExfRkxBRyBmYWlsIVxuIik7DQoJfQ0KICAgIHJldHVybiBmZDsNCn0NCiNlbmRpZg0KDQoNCnN0YXRpYyB2b2lkIHNldF9mZChpbnQgZmQpDQp7DQogICAgRkRfU0VUKGZkLCAmZ19hbXRfZmRzcmVhZCk7DQogICAgaWYgKGZkID49IGdfYW10X2ZkX21heCkNCiAgICB7DQogICAgICAgIGdfYW10X2ZkX21heCA9IGZkICsgMTsNCiAgICB9DQp9DQoNCnN0YXRpYyB2b2lkIGNscl9mZChpbnQgZmQpDQp7DQogICAgRkRfQ0xSKGZkLCAmZ19hbXRfZmRzcmVhZCk7DQp9DQoNCnN0YXRpYyBpbnQgQ3JlYXRlU2VuZFBhY2tldCh1bnNpZ25lZCAgICAgc2hvcnQgZmlkLCB1bnNpZ25lZCBjaGFyICpkYXRhX2J1ZiwgaW50IGRhdGFfbGVuLCB1bnNpZ25lZCBjaGFyKnBhY2tldF9idWYpDQp7DQogICAgaW50IGJSZXQgPSAwOw0KICAgIEJZVEUgKnBTVFggPSBOVUxMOw0KICAgIEJZVEUgKnBFVFggPSBOVUxMOw0KCS8vRklEtcS439fWvdoNCiAgICBCWVRFICpwSEZJRCA9IE5VTEw7DQoJLy9GSUS1xLXN19a92g0KICAgIEJZVEUgKnBMRklEID0gTlVMTDsNCiAgICBCWVRFICpwQ2hlY2sgPSBOVUxMOw0KICAgIEJZVEUgKnBEYXRhID0gTlVMTDsNCiAgICBCWVRFIENoZWNrU3VtID0gMDsNCglpbnQgaSA9IDA7DQoNCiAgICAvLyAgICAgICAgICAgIFNUWCBGSUQgIERhdGEgQ2hlY2sgIEVUWA0KICAgIGludCBDbWRDb3VudCA9IDEgKyAyICsgZGF0YV9sZW4gKyAxICAgKyAxOw0KDQogICAgaWYgKChkYXRhX2xlbiAhPSAwKSAmJiAoTlVMTCA9PSBkYXRhX2J1ZikpDQogICAgew0KICAgICAgICByZXR1cm4gYlJldDsNCiAgICB9DQoNCiAgICBwU1RYID0gJnBhY2tldF9idWZbMF07DQogICAgcEVUWCA9ICZwYWNrZXRfYnVmWzEgKyAyICsgZGF0YV9sZW4gKyAxXTsNCiAgICBwSEZJRCA9ICZwYWNrZXRfYnVmWzFdOw0KICAgIHBMRklEID0gJnBhY2tldF9idWZbMSsxXTsNCiAgICBwQ2hlY2sgPSAmcGFja2V0X2J1ZlsxICsgMiArIGRhdGFfbGVuXTsNCiAgICBwRGF0YSA9ICZwYWNrZXRfYnVmWzEgKyAyXTsNCg0KICAgICpwU1RYID0gMHgwMjsNCiAgICAqcEVUWCA9IDB4MDI7DQogICAgKnBIRklEID0gKGZpZD4+OCkmMHgwMEZGOw0KICAgICpwTEZJRCA9IGZpZCYweDAwRkY7DQogICAgbWVtY3B5KHBEYXRhLCBkYXRhX2J1ZiwgZGF0YV9sZW4pOw0KICAgIENoZWNrU3VtID0gMDsNCgkvL0NoZWNrU3VtysdGSUS6zURBVEHX1rbOtcTQo9HpDQogICAgZm9yIChpID0gMDsgaSA8ICgyICsgZGF0YV9sZW4pOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IHBhY2tldF9idWZbMSArIGldOw0KICAgICpwQ2hlY2sgPSBDaGVja1N1bTsNCiAgICBiUmV0ID0gMTsNCiAgICByZXR1cm4gYlJldDsNCn0NCg0Kc3RhdGljIHZvaWQgc2VuZF9lbnRlcl9hbXRfbW9kZV9wYWNrZXQoKQ0Kew0KICAgIHUzMiBlbnRlcl9hbXRfcmVxWzVdID0gezB9Ow0KCWVudGVyX2FtdF9yZXFbMF0gPSAweDAxMDA7DQoJZW50ZXJfYW10X3JlcVsxXSA9IDE7DQoJZW50ZXJfYW10X3JlcVsyXSA9IDE7DQoJZW50ZXJfYW10X3JlcVszXSA9IDA7DQoJZW50ZXJfYW10X3JlcVs0XSA9IDA7DQoNCgl1bnNpZ25lZCBjaGFyIGVudGVyX2FtdF9wYWNrZXRbMjVdID0gezB9Ow0KCXVuc2lnbmVkIHNob3J0IGZpZCA9IDB4MDA1ZjsNCglDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopZW50ZXJfYW10X3JlcSxzaXplb2YoZW50ZXJfYW10X3JlcSksZW50ZXJfYW10X3BhY2tldCk7DQoJQW10X0NvbXBvc2VBbmRQcm9jZXNzKGVudGVyX2FtdF9wYWNrZXQsIHNpemVvZihlbnRlcl9hbXRfcGFja2V0KSk7DQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfZXhpdF9hbXRfbW9kZV9wYWNrZXQoKQ0Kew0KCXUzMiBleGl0X2FtdF9yZXFbNV0gPSB7MH07DQoJZXhpdF9hbXRfcmVxWzBdID0gMHgwMTAwOw0KCWV4aXRfYW10X3JlcVsxXSA9IDA7DQoJZXhpdF9hbXRfcmVxWzJdID0gMTsNCglleGl0X2FtdF9yZXFbM10gPSAwOw0KCWV4aXRfYW10X3JlcVs0XSA9IDA7DQoNCgl1bnNpZ25lZCBjaGFyIGV4aXRfYW10X3BhY2tldFsyNV0gPSB7MH07DQoJdW5zaWduZWQgc2hvcnQgZmlkID0gMHgwMDVmOw0KCUNyZWF0ZVNlbmRQYWNrZXQoZmlkLCh1bnNpZ25lZCBjaGFyKilleGl0X2FtdF9yZXEsc2l6ZW9mKGV4aXRfYW10X3JlcSksZXhpdF9hbXRfcGFja2V0KTsNCglBbXRfQ29tcG9zZUFuZFByb2Nlc3MoZXhpdF9hbXRfcGFja2V0LCBzaXplb2YoZXhpdF9hbXRfcGFja2V0KSk7DQoNCn0NCg0KDQpzdGF0aWMgdm9pZCBzZW5kX3R4X3N0YXJ0X3BhY2tldCh1bnNpZ25lZCBpbnQgYmFuZCx1bnNpZ25lZCBpbnQgY2hhbm5lbCxzaG9ydCBpbnRfcG93ZXIsc2hvcnQgZGVjX3Bvd2VyKQ0Kew0KICAgIHR5cGVkZWYgc3RydWN0DQogICAgew0KICAgICAgICBVSU5UMzIgIE1zZ0lkOw0KICAgIAlVSU5UMzIgIHdCYW5kTnVtOyAgICAgICAvLyDGtbbODQogICAgCVVJTlQzMiAgZHdFYXJmY247ICAgDQogICAgCVVJTlQzMiAgd0ZyZXE7ICAgICAgICAgIC8vINbQ0MTGtbXjo6wxMDBrSHrOqrWlzrsNCiAgICAJVUlOVDMyICB3QmFuZFdpZHRoOyAgICAgLy8gtPi/7aOsMTAwa0h6zqq1pc67DQogICAgCVVJTlQzMiAgd0FudGVubmFQb3J0OyAgIC8vIMzsz9+2y7/aICCjv6O/o78NCiAgICAJVUlOVDMyICB3TW9kdWxhdGlvbjsgICAgLy8gtffWxre9yr2jrDCjulFQU0ujrDGjujE2UUFNo6wyo7o2NFFBTQ0KICAgIAlVSU5UMzIgIHdSQk51bTsgICAgICAgICAvLyBSQrj2yv0NCiAgICAJVUlOVDMyICB3UkJTdGFydFBvc2l0aW9uOyAgLy8gUkLG8Mq8xqvSxg0KICAgIAlVSU5UMzIgIHdTaW5nbGVXYXZlOyAgICAvLyDKx7fxzqq1pdTYsqgNCiAgICAJU0lOVDE2IHN3UmZJbnRQb3dlcjsgCS8vuabCytX7yv0NCiAgICAJU0lOVDE2IHN3UmZEZWNQb3dlcjsJLy+5psLK0KHK/SxbLTIgLTEgMCAxIDIgXbT6se1bLTAuNSAtMC4yNSAwIDAuMjUgMC41XQ0KCX1UX3pBTVRfTFRFQV9TZXRUeEluaXRfUmVxOyANCg0KCVRfekFNVF9MVEVBX1NldFR4SW5pdF9SZXEgc3RUeEluaXRSZXEgPSB7MH07DQoJc3RUeEluaXRSZXEuTXNnSWQgPSAweDA3MDA7DQoJc3RUeEluaXRSZXEud0JhbmROdW0gPSBiYW5kOw0KCXN0VHhJbml0UmVxLmR3RWFyZmNuID0gY2hhbm5lbDsNCglzdFR4SW5pdFJlcS53RnJlcSA9IDA7DQoJc3RUeEluaXRSZXEud0JhbmRXaWR0aCA9IDk7DQoJc3RUeEluaXRSZXEud0FudGVubmFQb3J0ID0gMDsNCglzdFR4SW5pdFJlcS53TW9kdWxhdGlvbiA9IDA7DQoJc3RUeEluaXRSZXEud1JCTnVtID0gNTA7DQoJc3RUeEluaXRSZXEud1JCU3RhcnRQb3NpdGlvbiA9IDA7DQoJc3RUeEluaXRSZXEud1NpbmdsZVdhdmUgPSAwOw0KCXN0VHhJbml0UmVxLnN3UmZJbnRQb3dlciA9IGludF9wb3dlcjsNCglzdFR4SW5pdFJlcS5zd1JmRGVjUG93ZXIgPSBkZWNfcG93ZXI7DQoNCgl1bnNpZ25lZCBjaGFyIHR4X3N0YXJ0X3BhY2tldFtzaXplb2Yoc3RUeEluaXRSZXEpKzVdID0gezB9Ow0KCXVuc2lnbmVkIHNob3J0IGZpZCA9IDB4MDA1ZjsNCglDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopJnN0VHhJbml0UmVxLHNpemVvZihzdFR4SW5pdFJlcSksdHhfc3RhcnRfcGFja2V0KTsNCglBbXRfQ29tcG9zZUFuZFByb2Nlc3ModHhfc3RhcnRfcGFja2V0LCBzaXplb2YodHhfc3RhcnRfcGFja2V0KSk7DQoJDQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfdHhfc3RvcF9wYWNrZXQoKQ0Kew0KICAgIHUzMiB0eF9jbG9zZV9yZXFbMV0gPSB7MH07DQoJdHhfY2xvc2VfcmVxWzBdID0gMHgwMjAxOw0KCXVuc2lnbmVkIGNoYXIgdHhfc3RvcF9wYWNrZXRbMSo0KzVdID0gezB9Ow0KCXVuc2lnbmVkIHNob3J0IGZpZCA9IDB4MDA1ZjsNCglDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopdHhfY2xvc2VfcmVxLHNpemVvZih0eF9jbG9zZV9yZXEpLHR4X3N0b3BfcGFja2V0KTsNCglBbXRfQ29tcG9zZUFuZFByb2Nlc3ModHhfc3RvcF9wYWNrZXQsIHNpemVvZih0eF9zdG9wX3BhY2tldCkpOw0KDQp9DQoNCnN0YXRpYyBkb3VibGUgbHRlX2NoYW5uZWxfdG9fZnJlcSh1bnNpZ25lZCBpbnQgYmFuZCx1bnNpZ25lZCBpbnQgY2hhbm5lbCx1bnNpZ25lZCBpbnQgbGluaykNCnsNCiAgICBkb3VibGUgZnJlcSA9IDA7DQoJdHlwZWRlZiBzdHJ1Y3QNCgl7DQoJCWludCBiYW5kOw0KCQlkb3VibGUgZGxfZl9sb3c7DQoJCWludCBkbF9uX29mZnNldDsNCgkJZG91YmxlIHVsX2ZfbG93Ow0KCQlpbnQgdWxfbl9vZmZzZXQ7DQoJCX1zdEx0ZUNoYW5uZWxBcnJhbmdlbWVudDsgDQoNCglzdEx0ZUNoYW5uZWxBcnJhbmdlbWVudCBpbmZvWzY0XSA9IHsNCg0KCXsgMSwgMjExMCwgMCwgMTkyMCwgMTgwMDAgfSwNCgl7IDIsIDE5MzAsIDYwMCwgMTg1MCwgMTg2MDAgfSwNCgl7IDMsIDE4MDUsIDEyMDAsIDE3MTAsIDE5MjAwIH0sDQoJeyA0LCAyMTEwLCAxOTUwLCAxNzEwLCAxOTk1MCB9LA0KCXsgNSwgODY5LCAyNDAwLCA4MjQsIDIwNDAwIH0sDQoJeyA2LCA4NzUsIDI2NTAsIDgzMCwgMjA2NTAgfSwNCgl7IDcsIDI2MjAsIDI3NTAsIDI1MDAsIDIwNzUwIH0sDQoJeyA4LCA5MjUsIDM0NTAsIDg4MCwgMjE0NTAgfSwNCgl7IDksIDE4NDQuOSwgMzgwMCwgMTc0OS45LCAyMTgwMCB9LA0KCXsgMTAsIDIxMTAsIDQxNTAsIDE3MTAsIDIyMTUwIH0sDQoJeyAxMSwgMTQ3NS45LCA0NzUwLCAxNDI3LjksIDIyNzUwIH0sDQoJeyAxMiwgNzI5LCA1MDEwLCA2OTksIDIzMDEwIH0sDQoJeyAxMywgNzQ2LCA1MTgwLCA3NzcsIDIzMTgwIH0sDQoJeyAxNCwgNzU4LCA1MjgwLCA3ODgsIDIzMjgwIH0sDQoJeyAxNSwgMCwgMCwgMCwgMCB9LA0KCXsgMTYsIDAsIDAsIDAsIDAgfSwNCgl7IDE3LCA3MzQsIDU3MzAsIDcwNCwgMjM3MzAgfSwNCgl7IDE4LCA4NjAsIDU4NTAsIDgxNSwgMjM4NTAgfSwNCgl7IDE5LCA4NzUsIDYwMDAsIDgzMCwgMjQwMDAgfSwNCgl7IDIwLCA3OTEsIDYxNTAsIDgzMiwgMjQxNTAgfSwNCgl7IDIxLCAxNDk1LjksIDY0NTAsIDE0NDcuOSwgMjQ0NTAgfSwNCgl7IDIyLCAzNTEwLCA2NjAwLCAzNDEwLCAyNDYwMCB9LA0KCXsgMjMsIDIxODAsIDc1MDAsIDIwMDAsIDI1NTAwIH0sDQoJeyAyNCwgMTUyNSwgNzcwMCwgMTYyNi41LCAyNTcwMCB9LA0KCXsgMjUsIDE5MzAsIDgwNDAsIDE4NTAsIDI2MDQwIH0sDQoJeyAyNiwgODU5LCA4NjkwLCA4MTQsIDI2NjkwIH0sDQoJeyAyNywgODUyLCA5MDQwLCA4MDcsIDI3MDQwIH0sDQoJeyAyOCwgNzU4LCA5MjEwLCA3MDMsIDI3MjEwIH0sDQoJeyAyOSwgMCwgMCwgMCwgMCB9LA0KICAgIHsgMzAsIDIzNTAsIDk3NzAsIDIzMDUsIDI3NjYwIH0sDQogICAgeyAzMSwgNDYyLjUsIDk4NzAsIDQ1Mi41LCAyNzc2MCB9LA0KCXsgMzIsIDAsIDAsIDAsIDAgfSwNCgl7IDMzLCAxOTAwLCAzNjAwMCwgMTkwMCwgMzYwMDAgfSwNCgl7IDM0LCAyMDEwLCAzNjIwMCwgMjAxMCwgMzYyMDAgfSwNCgl7IDM1LCAxODUwLCAzNjM1MCwgMTg1MCwgMzYzNTAgfSwNCgl7IDM2LCAxOTMwLCAzNjk1MCwgMTkzMCwgMzY5NTAgfSwNCgl7IDM3LCAxOTEwLCAzNzU1MCwgMTkxMCwgMzc1NTAgfSwNCgl7IDM4LCAyNTcwLCAzNzc1MCwgMjU3MCwgMzc3NTAgfSwNCgl7IDM5LCAxODgwLCAzODI1MCwgMTg4MCwgMzgyNTAgfSwNCgl7IDQwLCAyMzAwLCAzODY1MCwgMjMwMCwgMzg2NTAgfSwNCgl7IDQxLCAyNDk2LCAzOTY1MCwgMjQ5NiwgMzk2NTAgfSwNCgl7IDQyLCAzNDAwLCA0MTU5MCwgMzQwMCwgNDE1OTAgfSwNCgl7IDQzLCAzNjAwLCA0MzU5MCwgMzYwMCwgNDM1OTAgfSwNCgl7IDQ0LCA3MDMsIDQ1NTkwLCA3MDMsIDQ1NTkwIH0sDQoJeyA0NSwgMCwgMCwgMCwgMCB9LA0KCXsgNDYsIDAsIDAsIDAsIDAgfSwNCgl7IDQ3LCAwLCAwLCAwLCAwIH0sDQoJeyA0OCwgMCwgMCwgMCwgMCB9LA0KCXsgNDksIDAsIDAsIDAsIDAgfSwNCgl7IDUwLCAwLCAwLCAwLCAwIH0sDQoJeyA1MSwgMCwgMCwgMCwgMCB9LA0KCXsgNTIsIDAsIDAsIDAsIDAgfSwNCgl7IDUzLCAwLCAwLCAwLCAwIH0sDQoJeyA1NCwgMCwgMCwgMCwgMCB9LA0KCXsgNTUsIDAsIDAsIDAsIDAgfSwNCgl7IDU2LCAwLCAwLCAwLCAwIH0sDQoJeyA1NywgMCwgMCwgMCwgMCB9LA0KCXsgNTgsIDAsIDAsIDAsIDAgfSwNCgl7IDU5LCAwLCAwLCAwLCAwIH0sDQoJeyA2MCwgMCwgMCwgMCwgMCB9LA0KCXsgNjEsIDAsIDAsIDAsIDAgfSwNCgl7IDYyLCAwLCAwLCAwLCAwIH0sDQoJeyA2MywgMCwgMCwgMCwgMCB9LA0KCXsgNjQsIDAsIDAsIDAsIDAgfSwNCg0KCX07DQoNCglBbXRQcmludGYoQU1UX0lORk8gIiVzOiBiZW9yZSB0cmFuc2Zvcm0gYmFuZD0lZCxjaGFubmVsPSVkLGxpbms9JWQsZnJlcT0lZlxuIiwgX19GVU5DVElPTl9fLCBiYW5kLGNoYW5uZWwsbGluayxmcmVxKTsNCg0KCWlmIChiYW5kID4gMCAmJiBiYW5kIDw9IDY0KQ0KCXsNCgkJZnJlcSA9IGluZm9bYmFuZCAtIDFdLnVsX2ZfbG93ICsgMC4xICogKGNoYW5uZWwgLSBpbmZvW2JhbmQgLSAxXS51bF9uX29mZnNldCk7DQogICAgICAgIGlmKGxpbmspDQoJICAgIHsNCgkgICAgCWZyZXEgPSBpbmZvW2JhbmQgLTFdLmRsX2ZfbG93ICsgMC4xICogKGNoYW5uZWwgLSBpbmZvW2JhbmQgLSAxXS5kbF9uX29mZnNldCk7DQogICAgICAgIH0NCgl9DQoJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYWZ0ZXIgdHJhbnNmb3JtIGZyZXE9JWZcbiIsIF9fRlVOQ1RJT05fXywgZnJlcSk7DQoJcmV0dXJuIGZyZXE7DQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfbHRlX25zdF9pbml0X3BhY2tldCh1bnNpZ25lZCBpbnQgYmFuZCx1bnNpZ25lZCBpbnQgY2hhbm5lbCx1bnNpZ25lZCBpbnQgYmFuZF93aWR0aCkNCnsNCgl0eXBlZGVmIHN0cnVjdCANCgl7DQogICAgICAgIHUzMiBNc2dJZDsNCiAgICAgICAgdW5zaWduZWQgc2hvcnQgd0JhbmROdW1bMl07ICAvLyDGtbbODQogICAgICAgIHVuc2lnbmVkIHNob3J0IHdGcmVxWzJdOyAgLy8g1tDQxMa1teOjrDEwMGtIes6qtaXOuw0KICAgICAgICB1bnNpZ25lZCBzaG9ydCB3QmFuZFdpZHRoWzJdOyAgLy8gtPi/7Q0KICAgICAgICB1bnNpZ25lZCBzaG9ydCB3QW50ZW5uYVBvcnRbMl07ICAvLyDM7M/ftsu/2g0KICAgICAgICB1bnNpZ25lZCBzaG9ydCB3TW9kdWxhdGlvblsyXTsgIC8vILX31sa3vcq9o6wwo7pRUFNLo6wxo7oxNlFBTaOsMqO6NjRRQU0NCiAgICAgICAgdW5zaWduZWQgc2hvcnQgd1JiTnVtWzJdOyAgLy8gcmIgbnVtDQogICAgICAgIHVuc2lnbmVkIHNob3J0IHdSYlN0YXJ0UG9zdGlvblsyXTsgIC8vIHJiIHN0YXJ0DQogICAgICAgIHVuc2lnbmVkIHNob3J0IHdTaW5nbGVDYXJyaWVyWzJdOyAgIC8vMDq3orX31sbQxbrFIDE6t6K1pdTYsqgNCiAgICB9VF96QU1UX0xURUFfTlNUX0lOSVQ7DQoJDQoJdW5zaWduZWQgc2hvcnQgZnJlcSA9IDA7DQogICAgZnJlcSA9ICh1bnNpZ25lZCBzaG9ydCkobHRlX2NoYW5uZWxfdG9fZnJlcShiYW5kLGNoYW5uZWwsMSkqMTApOw0KCQ0KCQ0KCVRfekFNVF9MVEVBX05TVF9JTklUIHN0TlNUSW5pdFJlcSA9IHswfTsNCglzdE5TVEluaXRSZXEuTXNnSWQgPSAweDA1MDA7DQoJc3ROU1RJbml0UmVxLndCYW5kTnVtWzBdID0gYmFuZDsNCglzdE5TVEluaXRSZXEud0ZyZXFbMF0gPSBmcmVxOw0KCXN0TlNUSW5pdFJlcS53QmFuZFdpZHRoWzBdID0gYmFuZF93aWR0aDsNCglzdE5TVEluaXRSZXEud0FudGVubmFQb3J0WzBdID0gMTsNCglzdE5TVEluaXRSZXEud01vZHVsYXRpb25bMF0gPSAwOw0KCXN0TlNUSW5pdFJlcS53UmJOdW1bMF0gPSA1MDsNCglzdE5TVEluaXRSZXEud1JiU3RhcnRQb3N0aW9uWzBdID0gMDsNCglzdE5TVEluaXRSZXEud1NpbmdsZUNhcnJpZXJbMF0gPSAwOw0KDQoJQW10UHJpbnRmKEFNVF9JTkZPICIlczogc3ROU1RJbml0UmVxOk1zZ0lkPSVkLHdCYW5kTnVtWzBdPSVkLHdGcmVxWzBdPSVkLHdCYW5kV2lkdGhbMF09JWRcbiIsXA0KCQlfX0ZVTkNUSU9OX18sIHN0TlNUSW5pdFJlcS5Nc2dJZCxzdE5TVEluaXRSZXEud0JhbmROdW1bMF0sc3ROU1RJbml0UmVxLndGcmVxWzBdLHN0TlNUSW5pdFJlcS53QmFuZFdpZHRoWzBdKTsNCgkNCglBbXRQcmludGYoQU1UX0lORk8gIiVzOiBzdE5TVEluaXRSZXE6d0FudGVubmFQb3J0WzBdPSVkLHdNb2R1bGF0aW9uWzBdPSVkLHdSYk51bVswXT0lZFxuIixcDQoJCV9fRlVOQ1RJT05fXywgc3ROU1RJbml0UmVxLndBbnRlbm5hUG9ydFswXSxzdE5TVEluaXRSZXEud01vZHVsYXRpb25bMF0sc3ROU1RJbml0UmVxLndSYk51bVswXSk7DQoJDQoJQW10UHJpbnRmKEFNVF9JTkZPICIlczogd1JiU3RhcnRQb3N0aW9uWzBdPSVkLHdTaW5nbGVDYXJyaWVyWzBdPSVkXG4iLFwNCgkJX19GVU5DVElPTl9fLCBzdE5TVEluaXRSZXEud1JiU3RhcnRQb3N0aW9uWzBdLHN0TlNUSW5pdFJlcS53U2luZ2xlQ2FycmllclswXSk7DQoJDQoJdW5zaWduZWQgY2hhciBsdGVfbnN0X2luaXRfcGFja2V0W3NpemVvZihzdE5TVEluaXRSZXEpKzVdID0gezB9Ow0KCXVuc2lnbmVkIHNob3J0IGZpZCA9IDB4MDA1ZjsNCglDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopJnN0TlNUSW5pdFJlcSxzaXplb2Yoc3ROU1RJbml0UmVxKSxsdGVfbnN0X2luaXRfcGFja2V0KTsNCglBbXRfQ29tcG9zZUFuZFByb2Nlc3MobHRlX25zdF9pbml0X3BhY2tldCwgc2l6ZW9mKGx0ZV9uc3RfaW5pdF9wYWNrZXQpKTsNCg0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX2x0ZV9nZXRfcnNzaV9wYWNrZXQoKQ0Kew0KCXUzMiBsdGVfZ2V0X3Jzc2lfcmVxWzFdID0gezB9Ow0KCWx0ZV9nZXRfcnNzaV9yZXFbMF0gPSAweDA1MDU7DQoJdW5zaWduZWQgY2hhciBsdGVfZ2V0X3Jzc2lfcGFja2V0WzEqNCs1XSA9IHswfTsNCgl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQoJQ3JlYXRlU2VuZFBhY2tldChmaWQsKHVuc2lnbmVkIGNoYXIqKWx0ZV9nZXRfcnNzaV9yZXEsc2l6ZW9mKGx0ZV9nZXRfcnNzaV9yZXEpLGx0ZV9nZXRfcnNzaV9wYWNrZXQpOw0KCUFtdF9Db21wb3NlQW5kUHJvY2VzcyhsdGVfZ2V0X3Jzc2lfcGFja2V0LCBzaXplb2YobHRlX2dldF9yc3NpX3BhY2tldCkpOw0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX2x0ZV9yeF9jbG9zZV9wYWNrZXQoKQ0Kew0KCXUzMiBsdGVfcnhfY2xvc2VfcmVxWzFdID0gezB9Ow0KCWx0ZV9yeF9jbG9zZV9yZXFbMF0gPSAweDAzMDE7DQoJdW5zaWduZWQgY2hhciBsdGVfcnhfY2xvc2VfcGFja2V0WzEqNCs1XSA9IHswfTsNCgl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQoJQ3JlYXRlU2VuZFBhY2tldChmaWQsKHVuc2lnbmVkIGNoYXIqKWx0ZV9yeF9jbG9zZV9yZXEsc2l6ZW9mKGx0ZV9yeF9jbG9zZV9yZXEpLGx0ZV9yeF9jbG9zZV9wYWNrZXQpOw0KCUFtdF9Db21wb3NlQW5kUHJvY2VzcyhsdGVfcnhfY2xvc2VfcGFja2V0LCBzaXplb2YobHRlX3J4X2Nsb3NlX3BhY2tldCkpOw0KfQ0Kc3RhdGljIHZvaWQgc2VuZF9zd2l0Y2hfdG9fdXNlcl9tb2RlX3BhY2tldCgpDQp7DQogICAgdW5zaWduZWQgY2hhciBib290bW9kZVtdID0gezB4NTQsIDB4MDB9Ow0KCXVuc2lnbmVkIGNoYXIgYXRtb2RlW10gPSB7MHhGRiwgMHhGRn07DQoJbnZfc2V0X2l0ZW0oTlZfUk8sICJ1c2JfbW9kZXR5cGUiLCAidXNlciIsIDEpOw0KCW52X2NvbW1pdChOVl9STyk7DQoJYW10X3NldF9hbXRfYXRtb2RlKGJvb3Rtb2RlLGF0bW9kZSk7DQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfb2soaW50IGZkKQ0Kew0KICAgIGNoYXIgcmVwX29rW10gPSAiT0tcclxuIjsNCglQb3J0U2VuZChmZCwgKHVuc2lnbmVkIGNoYXIqKXJlcF9vaywgc3RybGVuKHJlcF9vayksIFdBSVRfQUxMKTsNCn0NCg0Kc3RhdGljIHZvaWQgc2VuZF9lcnJvcihpbnQgZmQpDQp7DQogICAgY2hhciByZXBfb2tbXSA9ICJFUlJPUlxyXG4iOw0KCVBvcnRTZW5kKGZkLCAodW5zaWduZWQgY2hhciopcmVwX29rLCBzdHJsZW4ocmVwX29rKSwgV0FJVF9BTEwpOw0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX3F1ZXJ5X3Jlc3VsdChpbnQgZmQsY2hhciogY21kLCBjaGFyKiBwYXJhbSkNCnsNCiAgICBjaGFyICogYXRfc3RyID0gTlVMTDsNCglpbnQgbGVuID0gMDsNCg0KCWlmKHBhcmFtKQ0KCXsNCgkgICAgbGVuID0gMzIgKyBzdHJsZW4oY21kKSArIHN0cmxlbihwYXJhbSk7DQogICAgCWF0X3N0ciA9IG1hbGxvYyhsZW4pOw0KCX0NCgllbHNlDQoJew0KCSAgICBsZW4gPSAzMiArIHN0cmxlbihjbWQpOw0KICAgIAlhdF9zdHIgPSBtYWxsb2MobGVuKTsNCgl9DQoJYXNzZXJ0KGF0X3N0cik7DQoJbWVtc2V0KGF0X3N0ciwgMCwgbGVuKTsNCiAgICBpZighcGFyYW0pDQogICAgICAgIHNwcmludGYoYXRfc3RyLCJcclxuKyVzXHJcblxyXG5PS1xyXG4iLGNtZCk7DQogICAgZWxzZQ0KICAgICAgICBzcHJpbnRmKGF0X3N0ciwiXHJcbislczogJXNcclxuXHJcbk9LXHJcbiIsY21kLHBhcmFtKTsNCg0KCVBvcnRTZW5kKGZkLCAodW5zaWduZWQgY2hhciopYXRfc3RyLCBzdHJsZW4oYXRfc3RyKSwgV0FJVF9BTEwpOw0KCWZyZWUoYXRfc3RyKTsNCn0NCi8qKg0KICogQGJyaWVmIEFUw/zB7r3TytUNCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gt7W72L3TytW1vbXEyv2+3bOktsgNCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEF0X1JlY2VpdmVEYXRhKGludCBmZCwgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICBpbnQgcmVhZF9sZW4gPSAwOw0KCWludCBpID0gMDsNCglyZWFkX2xlbiA9IFBvcnRSZWN2KGZkLCBidWYsIDEwMCwgTk9fV0FJVCk7DQogICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVhZF9sZW49JWQuXG4iLCBfX0ZVTkNUSU9OX18sIHJlYWRfbGVuKTsNCiAgICBpZiAocmVhZF9sZW4gPiAwKQ0KICAgIHsNCiAgICAgICAgYnVmW3JlYWRfbGVuXSA9ICdcMCc7DQogICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY2VpdmUgWyVzXVxuIiwgX19GVU5DVElPTl9fLCBidWYpOw0KCQkvL9equ7vOqtCh0LQNCgkJZm9yKGkgPSAwOyBpIDwgcmVhZF9sZW47IGkrKykNCgkJew0KCQkgICAgY2hhciBhdCA9IHRvbG93ZXIoYnVmW2ldKTsNCgkJCWJ1ZltpXSA9IGF0Ow0KCQl9DQoJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGFmdGVyIHRvbG93ZXIgWyVzXVxuIiwgX19GVU5DVElPTl9fLCBidWYpOw0KICAgICAgICAvL2F0K3R4c3RhcnQ9YmFuZCxjaGFubmVsLHBvd2VyDQoJCWlmKHN0cnN0cihidWYsImF0K3R4c3RhcnQiKSAhPSBOVUxMKQ0KCQl7DQoJCSAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiByZWNlaXZlIGF0K3R4c3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7DQoJCQlkb3VibGUgZGF0YVszXSA9IHswLjB9Ow0KCQkJdW5zaWduZWQgaW50IGJhbmQgPSAwOw0KCQkJdW5zaWduZWQgaW50IGNoYW5uZWwgPSAwOw0KCQkJc2hvcnQgaW50X3Bvd2VyID0gMDsNCgkJCXNob3J0IGlkZWNfcG93ZXIgPSAwOw0KCQkJZG91YmxlIGRlY19wb3dlciA9IDAuMDsNCgkJCS8vu/HIobLOyv0NCgkJCWJ1ZiA9IGJ1ZiArIHN0cmxlbigiYXQrdHhzdGFydD0iKTsNCgkJCWlmKGJ1ZiAhPSBOVUxMKQ0KCQkJew0KCQkJICAgIHN0cl90b19kb3VibGUoZGF0YSxidWYpOw0KCQkJCWJhbmQgPSBkYXRhWzBdOw0KCQkJCWNoYW5uZWwgPSBkYXRhWzFdOw0KCQkJCWludF9wb3dlciA9IGRhdGFbMl07DQoJCQkJZGVjX3Bvd2VyID0gZGF0YVsyXSAtIGludF9wb3dlcjsNCgkJCQlpZGVjX3Bvd2VyID0gZGVjX3Bvd2VyKjQ7DQoJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYmFuZD0lZCxjaGFubmVsPSVkLGludF9wb3dlcj0lZCxkZWNfcG93ZXI9JWYsaWRlY19wb3dlcj0lZFxuIiwgX19GVU5DVElPTl9fLCBiYW5kLGNoYW5uZWwsaW50X3Bvd2VyLGRlY19wb3dlcixpZGVjX3Bvd2VyKTsNCgkJCQlpZihiYW5kID09IDApDQoJCQkJew0KCQkJCSAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIGJhbmQhXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQkJCSAgIHJldHVybiByZWFkX2xlbjsNCgkJCQkgICAJDQoJCQkJfQ0KCQkJCWlmKGNoYW5uZWwgPT0gMCApDQoJCQkJew0KCQkJCSAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIGNoYW5uZWwhXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQkJCSAgIHJldHVybiByZWFkX2xlbjsNCgkJCQl9DQoJCQl9DQoJCQkvL9equ6/Oqr34yOthbXTEo8q9us10eGluaXTBvcz1QU1U1rjB7g0KCQkJc2VuZF9lbnRlcl9hbXRfbW9kZV9wYWNrZXQoKTsNCgkJCXNsZWVwKDEpOw0KCQkJc2VuZF90eF9zdGFydF9wYWNrZXQoYmFuZCxjaGFubmVsLGludF9wb3dlcixpZGVjX3Bvd2VyKTsNCgkJCXNlbmRfb2soZmQpOyAvL9axvdO4+EFUw/zB7reiy83V37vYuLRvaw0KCQkJDQoJCX0NCgkJZWxzZSBpZihzdHJzdHIoYnVmLCJhdCt0eHN0b3AiKSAhPSBOVUxMKQ0KCQl7DQoJCSAgICAvL9equ6/OqrnYsdW3osnku/q6zc3Ls/ZhbXTEo8q9wb3M9UFNVNa4we4NCgkJCXNlbmRfdHhfc3RvcF9wYWNrZXQoKTsNCgkJICAgIHNsZWVwKDEpOw0KCQkJc2VuZF9leGl0X2FtdF9tb2RlX3BhY2tldCgpOw0KCQkJc2VuZF9vayhmZCk7DQoJCX0NCgkJZWxzZSBpZihzdHJzdHIoYnVmLCJhdCt6dmVyc2lvbnR5cGU9MyIpICE9IE5VTEwpDQoJCXsNCgkJCXNlbmRfc3dpdGNoX3RvX3VzZXJfbW9kZV9wYWNrZXQoKTsNCgkJCXNlbmRfb2soZmQpOw0KCQl9DQoJCWVsc2UgaWYoc3Ryc3RyKGJ1ZiwiYXQrcnhzdGFydCIpICE9IE5VTEwpDQoJCXsNCgkJICAgIC8vveLO9kFUw/zB7mF0K3J4c3RhcnQ9cmF0LGJhbmQsY2hhbm5lbCxiYW5kd2lkdGgsYW50bnVtLGV4cGVjdF9sZXZlbA0KCQkgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBhdCtyeHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOw0KCQkJaW50IGRhdGFbNl0gPSB7MH07DQoJCQkvL3Vuc2lnbmVkIGludCByYXQgPSAwOw0KCQkJdW5zaWduZWQgaW50IGJhbmQgPSAwOw0KCQkJdW5zaWduZWQgaW50IGNoYW5uZWwgPSAwOw0KCQkJdW5zaWduZWQgaW50IGJhbmRfd2lkdGggPSAwOw0KCQkJLy91bnNpZ25lZCBpbnQgYW50X251bSA9IDA7DQoJCQlpbnQgZXhwZWN0X2xldmVsID0gMDsNCgkJCWludCByZXQgPSAwOw0KDQoJCQkvL7vxyKGyzsr9DQoJCQlidWYgPSBidWYgKyBzdHJsZW4oImF0K3J4c3RhcnQ9Iik7DQoJCQlpZihidWYgIT0gTlVMTCkNCgkJCXsNCgkJCSAgICByZXQgPSBzc2NhbmYoYnVmLCAiJWQsJWQsJWQsJWQsJWQsJWQiLCAmZGF0YVswXSwgJmRhdGFbMV0sICZkYXRhWzJdLCAmZGF0YVszXSwmZGF0YVs0XSwmZGF0YVs1XSk7DQoJCQkJaWYocmV0ID09IDYpDQoJCQkJew0KCQkJCSAgICByYXQgPSBkYXRhWzBdOw0KCQkJCQliYW5kID0gZGF0YVsxXTsNCgkJCQkJY2hhbm5lbCA9IGRhdGFbMl07DQoJCQkJCWJhbmRfd2lkdGggPSBkYXRhWzNdOw0KCQkJCQlhbnRfbnVtID0gZGF0YVs0XTsNCgkJCQkJZXhwZWN0X2xldmVsID0gZGF0YVs1XTsNCgkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmF0PSVkLGJhbmQ9JWQsY2hhbm5lbD0lZCxiYW5kX3dpZHRoPSVkLGFudF9udW09JWQsZXhwZWN0X2xldmVsPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHJhdCxiYW5kLGNoYW5uZWwsYmFuZF93aWR0aCxhbnRfbnVtLGV4cGVjdF9sZXZlbCk7DQoJCQkJICAgIC8vcmF0KNbGyr0pyKHWtbe2zqdbMCwyXSAwOkdTTSAxOldDRE1BIDI6TFRFDQoJCQkJCWlmKChyYXQgPCAwKSB8fCAocmF0ID4gMikpDQoJCQkJCXsNCgkJCQkgICAJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBpbnZhbGlkIHJhdD0lZFswLDJdIVxuIiwgX19GVU5DVElPTl9fLHJhdCk7DQoJCQkJICAgCQlyZXR1cm4gcmVhZF9sZW47DQoJCQkJCX0NCgkJCQkJaWYoYmFuZCA9PSAwKQ0KCQkJCQl7DQoJCQkJICAgCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBiYW5kIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJCQkgICAJCXJldHVybiByZWFkX2xlbjsNCgkJCQkgICAJDQoJCQkJCX0NCgkJCQkJaWYoY2hhbm5lbCA9PSAwICkNCgkJCQkJew0KCQkJCSAgIAkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGludmFsaWQgY2hhbm5lbCFcbiIsIF9fRlVOQ1RJT05fXyk7DQoJCQkJICAgCQlyZXR1cm4gcmVhZF9sZW47DQoJCQkJCX0NCgkJCQkJLy9hbnRfbnVtt7bOp1swLDEwMDBdDQoJCQkJCWlmKChhbnRfbnVtIDwgMCkgfHwgKGFudF9udW0gPiAxMDAwKSkNCgkJCQkJew0KCQkJCSAgIAkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGludmFsaWQgYW50X251bT0lZFswLDEwMDBdIVxuIiwgX19GVU5DVElPTl9fLGFudF9udW0pOw0KCQkJCSAgIAkJcmV0dXJuIHJlYWRfbGVuOwkNCgkJCQkJfQ0KDQoJCQkJCXN3aXRjaChyYXQpDQoJCQkJCXsNCgkJCQkJICAgIC8vTFRFDQoJCQkJCQljYXNlIDI6DQoJCQkJCQl7DQoJCQkJCQkJLy9MVEW0+L/tt7bOpw0KCQkJCQkJCS8qDQoJCQkJCQkJdHlwZWRlZiBlbnVtIFRERExURV9iYW5kVw0KCQkJCQkJCXsNCgkJCQkJCQkgICAgUlgxcG9pbnQ3NU0gPSAwLA0KCQkJCQkJCSAgICBSWDJwb2ludDI1TSwNCgkJCQkJCQkgICAgUlgzcG9pbnQ1TSwNCgkJCQkJCQkgICAgUlg1TSwNCgkJCQkJCQkgICAgUlg1cG9pbnQ1TSwNCgkJCQkJCQkgICAgUlg2TSwNCgkJCQkJCQkgICAgUlg3TSwNCgkJCQkJCQkgICAgUlg4TSwNCgkJCQkJCQkgICAgUlg5TSwNCgkJCQkJCQkgICAgUlgxME0sDQoJCQkJCQkJICAgIFJYMTJNLA0KCQkJCQkJCSAgICBSWDE0TSwNCgkJCQkJCQkgICAgUlgxNU0sDQoJCQkJCQkJICAgIFJYMjBNLA0KCQkJCQkJCSAgICBSWDI0TSwNCgkJCQkJCQkgICAgUlgyOE0NCgkJCQkJCQkgICAgUlgxcG9pbnQ0TQ0KCQkJCQkJCX0gVERETFRFX0JhbmRXaWR0aDsqLw0KCQkJCQkJCWlmKChiYW5kX3dpZHRoIDwgMCkgfHwgKGJhbmRfd2lkdGggPiAxNikpDQoJCQkJCQkJew0KCQkJCQkJICAgCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBMVEUgYmFuZF93aWR0aD0lZFswLDE2XSFcbiIsIF9fRlVOQ1RJT05fXyxiYW5kX3dpZHRoKTsNCgkJCQkJCSAgIAkJcmV0dXJuIHJlYWRfbGVuOw0KCQkJCQkJCX0NCgkJCQkJCQkvL9equ6/Oqr34yOthbXTEo8q9us1uc3Rpbml0wb3M9UFNVNa4we4NCgkJCQkJCQlzZW5kX2VudGVyX2FtdF9tb2RlX3BhY2tldCgpOw0KCQkJCQkJCXNsZWVwKDEpOw0KCQkJCQkJCXNlbmRfbHRlX25zdF9pbml0X3BhY2tldChiYW5kLGNoYW5uZWwsYmFuZF93aWR0aCk7DQoJCQkJCQkgICAgYnJlYWs7DQoJCQkJCQl9DQoJCQkJCQljYXNlIDA6DQoJCQkJCQljYXNlIDE6DQoJCQkJCQlkZWZhdWx0Og0KCQkJCQkJew0KCQkJCQkJICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByYXQ9JWQgbm90IHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyxyYXQpOw0KCQkJCQkJCXNlbmRfZXJyb3IoZmQpOw0KCQkJCQkJCWJyZWFrOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkgQW10UHJpbnRmKEFNVF9JTkZPICIlczogYXQrcnhzdGFydCBwYXJhbSBwYXJzZSBlcnJvciFcbiIsIF9fRlVOQ1RJT05fXyk7DQoJCQkJCSByZXR1cm4gcmVhZF9sZW47DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGF0K3J4c3RhcnQgcGFyYW0gc3RyIGlzIGVtcHR5IVxuIiwgX19GVU5DVElPTl9fKTsNCgkJCSAgICByZXR1cm4gcmVhZF9sZW47DQoJCQl9DQoJCX0NCgkJZWxzZSBpZihzdHJzdHIoYnVmLCJhdCtyc3NpIikgIT0gTlVMTCkNCgkJew0KCQkgICAgLy+94s72QVTD/MHuYXQrcnNzaQ0KCQkgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBhdCtyc3NpXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgc3dpdGNoKHJhdCkNCgkJCXsNCgkJCQkvL0xURQ0KCQkJCWNhc2UgMjoNCgkJCQl7DQoJCQkJICAgIC8v16q7r86qu/HIoVJTU0m1xEFNVNa4we4NCgkJCQkJc2VuZF9sdGVfZ2V0X3Jzc2lfcGFja2V0KCk7DQoJCQkJCWJyZWFrOw0KCQkJCX0NCgkJCSAgICBjYXNlIDA6DQoJCQkJY2FzZSAxOg0KCQkJCWRlZmF1bHQ6DQoJCQkJew0KCQkJCSAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByYXQ9JWQgbm90IHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyxyYXQpOw0KCQkJCSAgIHNlbmRfZXJyb3IoZmQpOw0KCQkJCSAgIGJyZWFrOw0KCQkJCX0NCgkJICAgIH0NCgkJfQ0KCQllbHNlIGlmKHN0cnN0cihidWYsImF0K3J4c3RvcCIpICE9IE5VTEwpDQoJCXsNCgkJICAgIC8v16q7r86qudix1b3TytW7+rrNzcuz9mFtdMSjyr3Bvcz1QU1U1rjB7g0KCQkJc2VuZF9sdGVfcnhfY2xvc2VfcGFja2V0KCk7DQoJCSAgICBzbGVlcCgxKTsNCgkJCXNlbmRfZXhpdF9hbXRfbW9kZV9wYWNrZXQoKTsNCgkJCXNlbmRfb2soZmQpOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IHVua25vd24gYXQgJXMuXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zik7DQoJCX0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRSZWN2IGZyb20gZGV2aWNlKGZkID0gJWQpOiByZWFkX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCByZWFkX2xlbik7DQogICAgfQ0KDQogICAgcmV0dXJuIHJlYWRfbGVuOw0KfQ0KDQovKioNCiAqIE1haW4gRnVuY3Rpb24NCiAqLw0KaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pDQp7DQogICAgZXh0ZXJuIGNoYXIgKm9wdGFyZzsNCiAgICBleHRlcm4gaW50IG9wdGluZDsNCiAgICBpbnQgYzsNCglpbnQgc29ja2V0X3BvcnQgPSAtMTsNCg0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqIEdldCBhcmd1bWVudHMgKioqKioqKioqKioqKioqKioqKiovDQogICAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsYXJndiwicDpyOiIpKSAhPSBFT0YpDQogICAgew0KICAgICAgICBzd2l0Y2ggKGMpDQogICAgICAgIHsNCiAgICAgICAgICAgIGNhc2UgJ3AnOg0KICAgICAgICAgICAgICAgIHNvY2tldF9wb3J0ID0gYXRvaShvcHRhcmcpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAnPyc6DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJVc2FnZTogenRlX2FtdCBbb3B0aW9uc11cbiIpOw0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiLXAgaXBwb3J0IC0gU2V0IElQIHBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvblxuIik7DQogICAgICAgICAgICAgICAgZXhpdCgxKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIEFtdFByaW50ZihBTVRfSU5GTyAic3RhcnQgQU1UIVxuIik7DQoNCiAgICBGRF9aRVJPKCZnX2FtdF9mZHNyZWFkKTsNCg0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgQVAtQ1AgY2hhbm5lbCAqKioqKioqKioqKioqKioqKioqKi8NCiAgICBnX2FtdF9mZF9jcCA9IGluaXRfY3BfY2hhbm5lbCgpOw0KICAgIGlmIChnX2FtdF9mZF9jcCA8IDApDQogICAgew0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiZ19hbXRfZmRfY3AgPSAlZC5cbiIsIGdfYW10X2ZkX2NwKTsNCiAgICB9DQoNCiAgICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IFVTQiBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKiovDQogICAgZ19hbXRfZmRfdXNiID0gaW5pdF91c2JfZGV2aWNlKCk7DQogICAgaWYgKGdfYW10X2ZkX3VzYiA+PSAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJnX2FtdF9mZF91c2IgPSAlZC5cbiIsIGdfYW10X2ZkX3VzYik7DQogICAgICAgIHNldF9mZChnX2FtdF9mZF91c2IpOw0KDQogICAgICAgIC8vSW5pdCBob3RwbHVnIG5ldGxpbmsNCiAgICAgICAgZ19hbXRfZmRfdXNiX2hvdHBsdWcgPSBpbml0X2hvdHBsdWdfbmwoKTsNCiAgICAgICAgaWYgKGdfYW10X2ZkX3VzYl9ob3RwbHVnID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiZ19hbXRfZmRfdXNiX2hvdHBsdWcgPSAlZC5cbiIsIGdfYW10X2ZkX3VzYl9ob3RwbHVnKTsNCiAgICAgICAgICAgIHNldF9mZChnX2FtdF9mZF91c2JfaG90cGx1Zyk7DQogICAgICAgIH0NCiAgICB9DQoJDQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqIENyZWF0ZSBzb2NrZXQgKioqKioqKioqKioqKioqKioqKioqKiovDQogICAgaWYgKHNvY2tldF9wb3J0ID4gMCkNCiAgICB7DQogICAgICAgIGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIgPSBpbml0X3NvY2tldChzb2NrZXRfcG9ydCk7DQogICAgICAgIGlmIChnX2FtdF9mZF9zb2NrZXRfc2VydmVyID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiZ19hbXRfZmRfc29ja2V0X3NlcnZlciA9ICVkLlxuIiwgZ19hbXRfZmRfc29ja2V0X3NlcnZlcik7DQogICAgICAgICAgICBzZXRfZmQoZ19hbXRfZmRfc29ja2V0X3NlcnZlcik7DQogICAgICAgIH0NCiAgICB9DQoJDQogICAgI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KCS8qKioqKioqKioqKioqKioqKioqKioqIEluaXQgQVAtQ0FQIGNoYW5uZWwgKioqKioqKioqKioqKioqKioqKiovDQoJZ19hbXRfZmRfY2FwID0gaW5pdF9jYXBfY2hhbm5lbCgpOw0KICAgIGlmIChnX2FtdF9mZF9jYXAgPCAwKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gImdfYW10X2ZkX2NhcCA9ICVkLlxuIiwgZ19hbXRfZmRfY2FwKTsNCiAgICB9DQoNCgkgLy8gQ3JlYXRlIENBUCByZWFkIHRocmVhZA0KICAgIHB0aHJlYWRfdCBjYXBfcmVhZF90aHJlYWQ7DQogICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZjYXBfcmVhZF90aHJlYWQsIE5VTEwsIFJlYWRGcm9tQ0FQVGhyZWFkLCBOVUxMKSAhPSAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIGNyZWF0ZSBDQVAgcmVhZCB0aHJlYWQhXG4iKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCgkjZW5kaWYNCg0KICAgIC8vIENyZWF0ZSBDUCByZWFkIHRocmVhZA0KICAgIHB0aHJlYWRfdCBjcF9yZWFkX3RocmVhZDsNCiAgICBpZiAocHRocmVhZF9jcmVhdGUoJmNwX3JlYWRfdGhyZWFkLCBOVUxMLCBSZWFkRnJvbUNQVGhyZWFkLCBOVUxMKSAhPSAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIGNyZWF0ZSBDUCByZWFkIHRocmVhZCFcbiIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgLy8gV2lmaSBpbml0DQogICAgQW10X1dpZmlfSW5pdCgpOw0KICAgIGdfYW10X2lNc2dIYW5kbGUgPSBtc2dnZXQoTU9EVUxFX0lEX0FNVCwgSVBDX0NSRUFUfDA2MDApOw0KICAgIGlmKC0xID09IGdfYW10X2lNc2dIYW5kbGUpIA0KICAgIHsNCiAgIAkgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGNhbiBub3QgY3JlYXRlIG1zZyBxdWV1ZSBmb3IgQU1UIVxuIiwgX19GVU5DVElPTl9fKTsNCgkgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIHB0aHJlYWRfdCBtc2dfcmVjdl90aHJlYWQ7DQogICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZtc2dfcmVjdl90aHJlYWQsIE5VTEwsIFJlY3ZNc2dGcm9tQXBwVGhyZWFkLCBOVUxMKSAhPSAwKQ0KICAgIHsNCiAgIAkgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIGNyZWF0ZSBSZWN2TXNnRnJvbUFwcFRocmVhZCB0aHJlYWQhXG4iKTsNCiAgICAgICAgIHJldHVybiAtMTsNCiAgICB9DQogICAgLy8gbWFsbG9jIHJlY2VpdmUgYnVmZmVyDQogICAgY2hhciAqcmVjZWl2ZV9idWZmZXIgPSBtYWxsb2MoTUFYX1BBQ0tFVF9MRU5HVEgpOw0KICAgIGlmIChyZWNlaXZlX2J1ZmZlciA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIGludCByZXQgPSAtMTsNCiAgICBpbnQgcmVhZF9sZW4gPSAwOw0KICAgIGZkX3NldCB0bXBmZHM7DQoNCglyZXQgPSBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19OVlJPRlMsIDEpOw0KCWlmKHJldCAhPSBDUE5WX09LKQ0KCXsNCgkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIFJXIG52cm9mcyBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQlmcmVlKHJlY2VpdmVfYnVmZmVyKTsNCgkJcmV0dXJuIC0xOw0KCX0NCgllbHNlDQoJew0KCSAgICBBbXRQcmludGYoQU1UX0lORk8iJXM6IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIFJXIG52cm9mcyBvayFcbiIsIF9fRlVOQ1RJT05fXyk7DQoJfQ0KDQoJLy+809TYYWljODgwMLnMvP4NCiAgICAvLyBDcmVhdGUgbG9hZCB3aWZpIGZpcm13YXJlIHRocmVhZA0KICAgIHB0aHJlYWRfdCBsb2FkX3dpZmlfZmlybXdhcmVfdGhyZWFkOw0KICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmbG9hZF93aWZpX2Zpcm13YXJlX3RocmVhZCwgTlVMTCwgTG9hZFdpZmlGaXJtd2FyZVRocmVhZCwgTlVMTCkgIT0gMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBjcmVhdGUgbG9hZCB3aWZpIGZpcm13YXJlIHRocmVhZCFcbiIpOw0KCQlmcmVlKHJlY2VpdmVfYnVmZmVyKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KCSNpZiAwDQoJI2lmIChkZWZpbmVkKF9fQUlDXzg4MDBEV19DSElQX18pKQ0KCXJldCA9IHdpZmlfaW9jdGxfaGFuZGxlKDMpOyAvL7zT1Niy4srUucy8/g0KCWlmKHJldCA8IDApDQoJew0KCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogbG9hZCBBSUNfODgwMERXIGZpcm13YXJlIGZhaWwhIHJldD0lZC5cbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsNCgl9DQogICAgZWxzZQ0KCXsNCgkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogbG9hZCBBSUNfODgwMERXIGZpcm13YXJlIHN1Y2Nlc3MhIHJldD0lZC5cbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsNCgl9DQoJI2VuZGlmDQoJI2VuZGlmDQoNCglnX2FtdF9hdF9tb2RlID0gaXNfYW10X2F0bW9kZSgpOw0KCUFtdFByaW50ZihBTVRfSU5GTyIlczogZ19hbXRfYXRfbW9kZT0lZFxuIiwgX19GVU5DVElPTl9fLGdfYW10X2F0X21vZGUpOw0KDQogICAgd2hpbGUgKDEpDQogICAgew0KICAgICAgICB0bXBmZHMgPSBnX2FtdF9mZHNyZWFkOw0KICAgICAgICByZXQgPSBzZWxlY3QoZ19hbXRfZmRfbWF4LCAmdG1wZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsNCiAgICAgICAgaWYgKHJldCA8PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJzZWxlY3QgZXJyb3I6ICVzIVxuIiwgc3RyZXJyb3IoZXJybm8pKTsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGdfYW10X2ZkX3VzYl9ob3RwbHVnID49IDAgJiYgRkRfSVNTRVQoZ19hbXRfZmRfdXNiX2hvdHBsdWcsICZ0bXBmZHMpKQ0KICAgICAgICB7DQogICAgICAgICAgICByZWFkX2xlbiA9IFBvcnRSZWN2KGdfYW10X2ZkX3VzYl9ob3RwbHVnLCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCAtIDEsIE5PX1dBSVQpOw0KCQkJaWYocmVhZF9sZW4gPj0gMCkNCgkJCQlyZWNlaXZlX2J1ZmZlcltyZWFkX2xlbl0gPSAnXDAnOw0KDQoJCQkvLyDHv9bG1Pa8073hyvi3+ywgcmVhZF9sZW4gPCBNQVhfUEFDS0VUX0xFTkdUSA0KCQkJcmVjZWl2ZV9idWZmZXJbTUFYX1BBQ0tFVF9MRU5HVEggLSAxXSA9ICdcMCc7DQoNCiAgICAgICAgICAgIGlmIChzdHJzdHIocmVjZWl2ZV9idWZmZXIsIEFNVF9ERVRFQ1RfVVNCX0hPVFJFTU9WRSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJVU0IgcmVtb3ZlIVxuIik7DQogICAgICAgICAgICAgICAgc3lzdGVtKCJwb3dlcm9mZiIpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoc3Ryc3RyKHJlY2VpdmVfYnVmZmVyLCBBTVRfREVURUNUX1VTQl9PRkZMSU5FKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIlVTQiBvZmZsaW5lIVxuIik7DQoNCiAgICAgICAgICAgICAgICBpZiAoZ19hbXRfZmRfdXNiID49IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBjbG9zZShnX2FtdF9mZF91c2IpOw0KICAgICAgICAgICAgICAgICAgICBjbHJfZmQoZ19hbXRfZmRfdXNiKTsNCiAgICAgICAgICAgICAgICAgICAgZ19hbXRfZmRfdXNiID0gLTE7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoc3Ryc3RyKHJlY2VpdmVfYnVmZmVyLCBBTVRfREVURUNUX1VTQl9PTkxJTkUpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiVVNCIG9ubGluZSFcbiIpOw0KDQogICAgICAgICAgICAgICAgaWYgKGdfYW10X2ZkX3VzYiA+PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJhbXQgYWxyZWFkeSBvcGVuIHVzYixkbyBub3RoaW5nXG4iKTsNCiAgICAgICAgICAgICAgICAgICAgLy9jbG9zZShnX2FtdF9mZF91c2IpOw0KICAgICAgICAgICAgICAgICAgICAvL2Nscl9mZChnX2FtdF9mZF91c2IpOw0KICAgICAgICAgICAgICAgICAgICAvL2dfYW10X2ZkX3VzYiA9IC0xOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KCSAgICAgICAgICAgICAgICBnX2FtdF9mZF91c2IgPSBpbml0X3VzYl9kZXZpY2UoKTsNCgkgICAgICAgICAgICAgICAgaWYgKGdfYW10X2ZkX3VzYiA+PSAwKQ0KCSAgICAgICAgICAgICAgICB7DQoJICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gImdfYW10X2ZkX3VzYiA9ICVkLlxuIiwgZ19hbXRfZmRfdXNiKTsNCgkgICAgICAgICAgICAgICAgICAgIHNldF9mZChnX2FtdF9mZF91c2IpOw0KCSAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIgPj0gMCAmJiBGRF9JU1NFVChnX2FtdF9mZF9zb2NrZXRfc2VydmVyLCAmdG1wZmRzKSkNCiAgICAgICAgew0KICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNsaWFkZHI7DQogICAgICAgICAgICBpbnQgYWRkcmxlbiA9IHNpemVvZihjbGlhZGRyKTsNCg0KICAgICAgICAgICAgaWYgKGdfYW10X2ZkX3NvY2tldF9jbGllbnQgPj0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjbG9zZShnX2FtdF9mZF9zb2NrZXRfY2xpZW50KTsNCiAgICAgICAgICAgICAgICBjbHJfZmQoZ19hbXRfZmRfc29ja2V0X2NsaWVudCk7DQogICAgICAgICAgICAgICAgZ19hbXRfZmRfc29ja2V0X2NsaWVudCA9IC0xOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoKGdfYW10X2ZkX3NvY2tldF9jbGllbnQgPSBhY2NlcHQoZ19hbXRfZmRfc29ja2V0X3NlcnZlciwgKHN0cnVjdCBzb2NrYWRkciopJmNsaWFkZHIsIChzb2NrbGVuX3QgKikmYWRkcmxlbikpID09IC0xKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkFjY2VwdCBmYWlsZWQhXG4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlwID0gbnRvaGwoY2xpYWRkci5zaW5fYWRkci5zX2FkZHIpOw0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiQ29ubmVjdCBmcm9tICVsdS4lbHUuJWx1LiVsdVxuIiwgKGlwPj4yNCkmMHhmZiwgKGlwPj4xNikmMHhmZiwgKGlwPj44KSYweGZmLCAoaXA+PjApJjB4ZmYpOw0KICAgICAgICAgICAgICAgIHNldF9mZChnX2FtdF9mZF9zb2NrZXRfY2xpZW50KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChnX2FtdF9mZF91c2IgPj0gMCAmJiBGRF9JU1NFVChnX2FtdF9mZF91c2IsICZ0bXBmZHMpKQ0KICAgICAgICB7DQogICAgICAgICAgICBnX2FtdF9mZF9jdXJyZW50ID0gJmdfYW10X2ZkX3VzYjsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChnX2FtdF9mZF9zb2NrZXRfY2xpZW50ID49IDAgJiYgRkRfSVNTRVQoZ19hbXRfZmRfc29ja2V0X2NsaWVudCwgJnRtcGZkcykpDQogICAgICAgIHsNCiAgICAgICAgICAgIGdfYW10X2ZkX2N1cnJlbnQgPSAmZ19hbXRfZmRfc29ja2V0X2NsaWVudDsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQoNCgkJLy+2wU5WxdC2z8rHt/HKx73izvZBVMP8we63vcq9DQoJCWlmKGdfYW10X2F0X21vZGUgPT0gMSkNCgkJew0KCQkgICAvL73izvayorSmwO1BVMP8we4NCgkJICAgQXRfUmVjZWl2ZURhdGEoKmdfYW10X2ZkX2N1cnJlbnQsIHJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCk7DQoJCSAgIGNvbnRpbnVlOw0KCQl9DQoNCiAgICAgICAgcmVhZF9sZW4gPSBBbXRfUmVjZWl2ZURhdGEoKmdfYW10X2ZkX2N1cnJlbnQsICh1bnNpZ25lZCBjaGFyICopcmVjZWl2ZV9idWZmZXIsIE1BWF9QQUNLRVRfTEVOR1RIKTsNCg0KICAgICAgICBpZiAocmVhZF9sZW4gPiAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRfQ29tcG9zZUFuZFByb2Nlc3MoKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgcmVhZF9sZW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKHJlYWRfbGVuID09IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByZWFkX2xlbiA9IDAsIGNsb3NlIGZkKCVkKVxuIiwgX19GVU5DVElPTl9fLCAqZ19hbXRfZmRfY3VycmVudCk7DQogICAgICAgICAgICBjbG9zZSgqZ19hbXRfZmRfY3VycmVudCk7DQogICAgICAgICAgICBjbHJfZmQoKmdfYW10X2ZkX2N1cnJlbnQpOw0KICAgICAgICAgICAgKmdfYW10X2ZkX2N1cnJlbnQgPSAtMTsNCiAgICAgICAgICAgIGdfYW10X2ZkX2N1cnJlbnQgPSBOVUxMOw0KICAgICAgICB9DQoNCg0KICAgICAgICAvL3N0cnVjdCB0aW1lc3BlYyB0czsNCgkJLy9jbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsNCgkJLy9BbXRQcmludGYoQU1UX0lORk8gIlslOGQuJTAzZF0gJXM6IGNwbnZfRnNHY1dhaXQgc3RhcnQuXG4iLCB0cy50dl9zZWMsIHRzLnR2X25zZWMgLyAxMDAwMDAwLF9fRlVOQ1RJT05fXyk7DQogICAgICAgIC8vdW5zaWduZWQgaW50IHN0YXR1cyA9IGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsNCgkJLy9pZihzdGF0dXMgIT0gQ1BOVl9PSykNCgkJLy8JQW10UHJpbnRmKEFNVF9JTkZPICIlczogY3Budl9Gc0djV2FpdCBmYWlsLCBlcnIgPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsNCiAgICAgICAgLy9lbHNlDQogICAgICAgIC8vew0KCQkvLwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsNCgkJLy8JQW10UHJpbnRmKEFNVF9JTkZPICJbJThkLiUwM2RdICVzOiBjcG52X0ZzR2NXYWl0IG9rLlxuIiwgdHMudHZfc2VjLCB0cy50dl9uc2VjIC8gMTAwMDAwMCwgX19GVU5DVElPTl9fKTsNCgkJLy99DQoJCQ0KICAgIH0NCg0KICAgIGZyZWUocmVjZWl2ZV9idWZmZXIpOw0KICAgIHB0aHJlYWRfam9pbihjcF9yZWFkX3RocmVhZCwgTlVMTCk7DQojaWYgMQ0KICAgIGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsNCglBbXRQcmludGYoQU1UX0lORk8gIiVzOiBjcG52X0ZzR2NXYWl0IHJldHVybi5cbiIsIF9fRlVOQ1RJT05fXyk7DQoNCglyZXQgPSBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19OVlJPRlMsIDApOw0KCWlmKHJldCAhPSBDUE5WX09LKQ0KCXsNCgkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIFJPIG52cm9mcyBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQlyZXR1cm4gLTE7DQoJfQ0KI2VuZGlmDQogICAgY2xvc2UoZ19hbXRfZmRfY3ApOw0KDQogICAgaWYgKGdfYW10X2ZkX3VzYiA+PSAwKQ0KICAgIHsNCiAgICAgICAgY2xvc2UoZ19hbXRfZmRfdXNiKTsNCiAgICB9DQoNCiAgICAvL2lmIChnX2FtdF9mZF91c2JfaG90cGx1ZyA+PSAwKQ0KICAgIHsNCiAgICAgICAgY2xvc2UoZ19hbXRfZmRfdXNiX2hvdHBsdWcpOw0KICAgIH0NCg0KICAgIGlmIChnX2FtdF9mZF9zb2NrZXRfY2xpZW50ID49IDApDQogICAgew0KICAgICAgICBjbG9zZShnX2FtdF9mZF9zb2NrZXRfY2xpZW50KTsNCiAgICB9DQoNCiAgICBpZiAoZ19hbXRfZmRfc29ja2V0X3NlcnZlciA+PSAwKQ0KICAgIHsNCiAgICAgICAgY2xvc2UoZ19hbXRfZmRfc29ja2V0X3NlcnZlcik7DQogICAgfQ0KDQoJI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0KCWNsb3NlKGdfYW10X2ZkX2NhcCk7DQoJI2VuZGlmDQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gIkFNVCBleGl0IVxuIik7DQogICAgcmV0dXJuIDA7DQp9DQoNCg==