LyoqDQogKiANCiAqIEBmaWxlICAgICAgYW10LmMNCiAqIEBicmllZiAgICAgDQogKiAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZUTS4NCiAqICAgICAgICAgICAgQU1UtPrA7dOm08Oy4w0KICogICAgICAgICAgICANCiAqIEBkZXRhaWxzICAgDQogKiBAYXV0aG9yICAgIFRvb2xzIFRlYW0uDQogKiBAZW1haWwgICAgIA0KICogQGNvcHlyaWdodCBDb3B5cmlnaHQgKEMpIDIwMTMgU2FuZWNoaXBzIFRlY2hub2xvZ3kgQ28uLCBMdGQuDQogKiBAd2FybmluZyAgIA0KICogQGRhdGUgICAgICAyMDE5LzAyLzAyDQogKiBAdmVyc2lvbiAgIDEuMQ0KICogQHByZSAgICAgICANCiAqIEBwb3N0ICAgICAgDQogKiAgICAgICAgICAgIA0KICogQHBhciAgICAgICANCiAqIENoYW5nZSBIaXN0b3J5IDoNCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogZGF0ZSAgICAgICAgdmVyc2lvbiAgYXV0aG9yICAgICAgICAgZGVzY3JpcHRpb24NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogMjAxNS8wNC8yOCAgMS4wICAgICAgbHUueGllamkgICAgICAgQ3JlYXRlIGZpbGUNCiAqIDIwMTkvMDIvMDIgIDEuMSAgICAgIGppYW5nLmZlbmdsaW4gINDeuMTXosrNt73Kvc6qZG94eWdlbg0KICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiANCiAqIA0KICovDQoNCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHB0aHJlYWQuaD4NCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4NCiNpbmNsdWRlIDxzeXMvc3RhdC5oPg0KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KI2luY2x1ZGUgPHN5cy9tc2cuaD4NCiNpbmNsdWRlIDxmY250bC5oPg0KI2luY2x1ZGUgPHVuaXN0ZC5oPg0KI2luY2x1ZGUgImxpbnV4L3JwbXNnX3p4MjkuaCINCiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+DQojaW5jbHVkZSA8bmV0ZGIuaD4NCiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+DQojaW5jbHVkZSA8bGludXgvbmV0bGluay5oPg0KI2luY2x1ZGUgPGFycGEvaW5ldC5oPg0KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1ZGUgInBvcnRfY29tLmgiDQojaW5jbHVkZSAiYW10LmgiDQojaW5jbHVkZSAib3NfdHlwZV9kZWYuaCINCiNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiDQojaW5jbHVkZSAib3RoZXJfbXNnLmgiDQojaW5jbHVkZSAibWVzc2FnZS5oIg0KI2luY2x1ZGUgImFtdF9hZ2VudF9kZXZpY2V0ZXN0LmgiDQojaW5jbHVkZSAia3dhdGNoX21zZy5oIg0KI2luY2x1ZGUgImFtdG52LmgiDQojaW5jbHVkZSAibGliY3Budi5oIg0KI2luY2x1ZGUgPHN5cy9wcmN0bC5oPg0KI2luY2x1ZGUgInJlZl9udl9kZWYuaCINCiNpbmNsdWRlICJudl9hcGkuaCINCg0KDQoNCg0KLyoqDQogKiDN4rK/uq/K/dL908MNCiAqLw0KZXh0ZXJuIGludCBBbXRfV2lmaV9Jbml0KHZvaWQpOw0KZXh0ZXJuIGludCBBbXRfV2lmaV9Qcm9jZXNzTXNnKHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIgKm1zZ19idWYsIHVuc2lnbmVkIGludCBtc2dfbGVuKTsNCmV4dGVybiBpbnQgQW10X0dwc19Qcm9jZXNzTXNnKHVuc2lnbmVkIGludCBtc2dfaWQsIHVuc2lnbmVkIGNoYXIgKm1zZ19idWYsIHVuc2lnbmVkIGludCBtc2dfbGVuKTsNCmV4dGVybiBpbnQgQW10X0RldmljZVRlc3RfUHJvY2Vzc01zZyh1bnNpZ25lZCBpbnQgbXNnX2lkLCB1bnNpZ25lZCBjaGFyICptc2dfYnVmLCB1bnNpZ25lZCBpbnQgbXNnX2xlbik7DQpleHRlcm4gaW50IEFtdF9Qcm9jZXNzX0dwc19Sc3AoTVNHX0JVRiAqbXNnLHVuc2lnbmVkIGludCBtc2dfaWQpOw0KZXh0ZXJuIGludCBBbXRfRnVuY1Rlc3RfUHJvY2Vzc01zZyh1bnNpZ25lZCBpbnQgbXNnX2lkLCB1bnNpZ25lZCBjaGFyICptc2dfYnVmLCB1bnNpZ25lZCBpbnQgbXNnX2xlbik7DQpleHRlcm4gaW50IHdpZmlfaW9jdGxfaGFuZGxlKGludCBjbWQpOw0KDQoNCi8qKg0KICogyKu+1rHkwb/J+cP3DQogKi8NCnN0YXRpYyBpbnQgZ19hbXRfZmRfY3AgPSAtMTsNCnN0YXRpYyBpbnQgZ19hbXRfZmRfdXNiID0gLTE7DQpzdGF0aWMgaW50IGdfYW10X2ZkX3VzYl9ob3RwbHVnID0gLTE7DQpzdGF0aWMgaW50IGdfYW10X2ZkX3NvY2tldF9jbGllbnQgPSAtMTsNCnN0YXRpYyBpbnQgZ19hbXRfZmRfc29ja2V0X3NlcnZlciA9IC0xOw0Kc3RhdGljIGZkX3NldCBnX2FtdF9mZHNyZWFkOw0Kc3RhdGljIGludCBnX2FtdF9mZF9tYXggPSAwOw0Kc3RhdGljIHZvbGF0aWxlIGludCAqZ19hbXRfZmRfY3VycmVudCA9IE5VTEw7DQpzdGF0aWMgaW50IGdfYW10X2lNc2dIYW5kbGUgPSAwOw0KdW5zaWduZWQgaW50IGdfYW10X2F0X21vZGUgPSAwOw0KI2lmZGVmIFVTRV9DQVBfU1VQUE9SVA0Kc3RhdGljIGludCBnX2FtdF9mZF9jYXAgPSAtMTsNCiNlbmRpZg0KDQoNCg0KDQovKioNCiAqIEBicmllZiBBTVTP+8+it6LLzbj4UEMNCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gt7W72Leiy821xMr9vt2zpLbIDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfU2VuZERhdGEoaW50IGZkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIGludCB3cml0ZV9sZW4gPSBQb3J0U2VuZChmZCwgKHVuc2lnbmVkIGNoYXIqKSZidWZfbGVuLCBzaXplb2YodW5zaWduZWQgaW50KSwgV0FJVF9BTEwpOw0KDQogICAgLy9pZiAod3JpdGVfbGVuID4gMCkNCiAgICB7DQogICAgICAgIHdyaXRlX2xlbiA9IFBvcnRTZW5kKGZkLCBidWYsIGJ1Zl9sZW4sIFdBSVRfQUxMKTsNCg0KICAgICAgICBpZiAod3JpdGVfbGVuIDw9IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBQb3J0U2VuZCAnZGF0YScgdG8gZGV2aWNlKGZkID0gJWQpOiB3cml0ZV9sZW4oJWQpIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fLCBmZCwgd3JpdGVfbGVuKTsNCiAgICAgICAgfQ0KICAgIH0NCgkvKg0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBQb3J0U2VuZCAnbGVuZ3RoJyB0byBkZXZpY2UoZmQgPSAlZCk6IHdyaXRlX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4pOw0KICAgIH0NCiAgICAqLw0KDQogICAgcmV0dXJuIHdyaXRlX2xlbjsNCn0NCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPoreiy80NCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gt7W72Leiy821xMr9vt2zpLbIDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfU2VuZERhdGFUb0FtdGFnZW50KGludCBmZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCglpbnQgIHdyaXRlX2xlbiA9IFBvcnRTZW5kKGZkLCBidWYsIGJ1Zl9sZW4sIE5PX1dBSVQpOw0KDQogICAgaWYgKHdyaXRlX2xlbiA8PSAwKQ0KICAgIHsNCiAgICAJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRTZW5kICdkYXRhJyB0byBkZXZpY2UoZmQgPSAlZCk6IHdyaXRlX2xlbiglZCkgaXMgd3JvbmcuXG4iLCBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4pOw0KICAgIH0NCgllbHNlDQoJew0KICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBQb3J0U2VuZCAnZGF0YScgdG8gZGV2aWNlKGZkID0gJWQpOiB3cml0ZV9sZW4oJWQpLGJ1Zl9sZW4oJWQpIFxuIiwgX19GVU5DVElPTl9fLCBmZCwgd3JpdGVfbGVuLGJ1Zl9sZW4pOw0KCX0NCiAgICByZXR1cm4gd3JpdGVfbGVuOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K908rVDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILe1u9i908rVtb21xMr9vt2zpLbIDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfUmVjZWl2ZURhdGEoaW50IGZkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIGludCByZWFkX2xlbiA9IFBvcnRSZWN2KGZkLCBidWYsIHNpemVvZih1bnNpZ25lZCBpbnQpLCBXQUlUX0FMTCk7DQoNCiAgICBpZiAocmVhZF9sZW4gPiAwKQ0KICAgIHsNCiAgICAgICAgdW5zaWduZWQgaW50IHBhY2tldF9sZW4gPSAqKCh1bnNpZ25lZCBpbnQgKilidWYpOw0KICAgICAgICBpZiAocGFja2V0X2xlbiA+IDAgJiYgcGFja2V0X2xlbiA8PSBidWZfbGVuKQ0KICAgICAgICB7DQogICAgICAgICAgICByZWFkX2xlbiA9IFBvcnRSZWN2KGZkLCBidWYsIHBhY2tldF9sZW4sIFdBSVRfQUxMKTsNCg0KICAgICAgICAgICAgaWYgKHJlYWRfbGVuIDw9IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFBvcnRSZWN2ICdkYXRhJyBmcm9tIGRldmljZShmZCA9ICVkKTogcmVhZF9sZW4oJWQpIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fLCBmZCwgcmVhZF9sZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGZkID0gJWQsIHBhY2tldF9sZW4oJWQpIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fLCBmZCwgcGFja2V0X2xlbik7DQogICAgICAgICAgICByZWFkX2xlbiA9IC0xOw0KICAgICAgICB9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBQb3J0UmVjdiAnbGVuZ3RoJyBmcm9tIGRldmljZShmZCA9ICVkKTogcmVhZF9sZW4oJWQpIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fLCBmZCwgcmVhZF9sZW4pOw0KICAgIH0NCg0KICAgIHJldHVybiByZWFkX2xlbjsNCn0NCg0KI2lmIDANCnN0YXRpYyB2b2lkIHN0cl90b19pbnQoIGludCAqZGF0YSwgY2hhciAqc3RyICkNCnsNCiAgICBpbnQgTGMgPSAwOw0KICAgIGludAlMZW4gPSAwOw0KICAgIGNoYXIgKkJlZ2IgPSBOVUxMOw0KICAgIGNoYXIgKkVuZGIgPSBOVUxMOw0KICAgIGNoYXIgKnB0ciA9IE5VTEw7DQogICAgY2hhciBzMVsxMDBdID0gIiI7DQogICAgY2hhciBzMls1MF0gPSAiIjsJDQogICAgbWVtc2V0KHMxLCAwLCBzaXplb2YoczEpKTsNCiAgICBzdHJjcHkoczEsIHN0cik7DQogICAgc3RyY2F0KHMxLCAiLCIpOw0KICAgIEJlZ2IgPSBzMTsJCQkJCQkvL8bwyry12Na3DQogICAgRW5kYiA9IHN0cmNocihzMSwnLCcpOwkJCS8vtdrSu7j2trq6xc671sMNCglpZiAoRW5kYiA9PSBOVUxMKQ0KCQlyZXR1cm47DQogICAgTGMgPSAwOwkNCiAgICBkbw0KICAgIHsNCiAgICAgICAgTGVuID0gMDsNCiAgICAgICAgTGVuID0gRW5kYiAtIEJlZ2I7CQkJLy+zpLbIDQogICAgICAgIG1lbXNldChzMiwgMCwgc2l6ZW9mKHMyKSk7CS8vvdjIocG9uPa2urrFvOS1xNfWt/u0rg0KICAgICAgICBzdHJuY3B5KHMyLCBCZWdiLCBMZW4pOwkJLy+92Mihwb249ra6usW85LXE19a3+7SuDQogICAgICAgIGRhdGFbTGNdID0gYXRvaShzMik7CQkJLy9zdHJpbmcgdG8gaW50DQogICAgICAgIHB0ciA9IEVuZGIgKyAxOwkJCQkvL9a4z/LPwrj2yv21xMbwyry12Na3DQogICAgICAgIHN0cmNweShzMSwgcHRyKTsJCQkvL8iltfTS0dequ6+1xNfWt/u0rg0KICAgICAgICBCZWdiID0gczE7CQkJCQkvL8bwyry12Na3uPzQwg0KICAgICAgICBFbmRiID0gc3RyY2hyKHMxLCcsJyk7CQkvL8/CuPa2urrFzrvWww0KICAgICAgICBMYysrOw0KICAgIH13aGlsZShFbmRiIT1OVUxMKTsgDQp9DQojZW5kaWYNCg0Kc3RhdGljIHZvaWQgc3RyX3RvX2RvdWJsZSggZG91YmxlICpkYXRhLCBjaGFyICpzdHIgKQ0Kew0KICAgIGludCBMYyA9IDA7DQogICAgaW50CUxlbiA9IDA7DQogICAgY2hhciAqQmVnYiA9IE5VTEw7DQogICAgY2hhciAqRW5kYiA9IE5VTEw7DQogICAgY2hhciAqcHRyID0gTlVMTDsNCiAgICBjaGFyIHMxWzEwMF0gPSAiIjsNCiAgICBjaGFyIHMyWzUwXSA9ICIiOwkNCiAgICBtZW1zZXQoczEsIDAsIHNpemVvZihzMSkpOw0KICAgIG1lbWNweShzMSwgc3RyLHNpemVvZihzMSkgLSAxKTsNCiAgICBzdHJjYXQoczEsICIsIik7DQogICAgQmVnYiA9IHMxOwkJCQkJCS8vxvDKvLXY1rcNCiAgICBFbmRiID0gc3RyY2hyKHMxLCcsJyk7CQkJLy+12tK7uPa2urrFzrvWww0KCWlmIChFbmRiID09IE5VTEwpDQoJCXJldHVybjsNCiAgICBMYyA9IDA7CQ0KICAgIGRvDQogICAgew0KICAgICAgICBMZW4gPSAwOw0KICAgICAgICBMZW4gPSBFbmRiIC0gQmVnYjsJCQkvL7OktsgNCiAgICAgICAgbWVtc2V0KHMyLCAwLCBzaXplb2YoczIpKTsJLy+92Mihwb249ra6usW85LXE19a3+7SuDQogICAgICAgIG1lbWNweShzMiwgQmVnYiwgc2l6ZW9mKHMyKSAtIDEpOwkJLy+92Mihwb249ra6usW85LXE19a3+7SuDQogICAgICAgIGRhdGFbTGNdID0gYXRvZihzMik7CQkJLy9zdHJpbmcgdG8gaW50DQogICAgICAgIHB0ciA9IEVuZGIgKyAxOwkJCQkvL9a4z/LPwrj2yv21xMbwyry12Na3DQogICAgICAgIG1lbWNweShzMSwgcHRyLCA5OSk7CQkJLy/IpbX00tHXqruvtcTX1rf7tK4NCiAgICAgICAgQmVnYiA9IHMxOwkJCQkJLy/G8Mq8tdjWt7j80MINCiAgICAgICAgRW5kYiA9IHN0cmNocihzMSwnLCcpOwkJLy/Pwrj2trq6xc671sMNCiAgICAgICAgTGMrKzsNCiAgICB9d2hpbGUoRW5kYiE9TlVMTCk7IA0KfQ0KDQojaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQovKioNCiAqIEBicmllZiC2wcihY2FwsuC1xLe0wKHP+8+iz9+zzLqvyv0NCiAqIEBwYXJhbVtpbl0gYXJncyDP37PMuq/K/bLOyv0NCiAqIEByZXR1cm4gTi9BDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIHZvaWQqIFJlYWRGcm9tQ0FQVGhyZWFkKHZvaWQqIGFyZ3MpDQp7DQogICAgLy8gUmVhZCBmcm9tIEFQLUNBUCBjaGFubmVsDQogICAgY2hhciAqcmVjZWl2ZV9idWZmZXIgPSBOVUxMOw0KDQoJVU5VU0VEKGFyZ3MpOw0KCQ0KCXJlY2VpdmVfYnVmZmVyID0gbWFsbG9jKE1BWF9QQUNLRVRfTEVOR1RIKTsNCiAgICBpZiAocmVjZWl2ZV9idWZmZXIgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHJldHVybiBOVUxMOw0KICAgIH0NCg0KCXByY3RsKFBSX1NFVF9OQU1FLCAiQW10UmVhZEZyb21DQVAiKTsNCg0KICAgIHdoaWxlICgxKQ0KICAgIHsNCiAgICAgICAgaW50IHJlYWRfbGVuID0gQW10X1JlY2VpdmVEYXRhKGdfYW10X2ZkX2NhcCwgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgTUFYX1BBQ0tFVF9MRU5HVEgpOw0KDQogICAgICAgIGlmIChyZWFkX2xlbiA+IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFJlY2VpdmUgY2FwIGRhdGEsIHJlYWRfbGVuID0gJWQhLlxuIiwgX19GVU5DVElPTl9fLCByZWFkX2xlbik7DQoNCiAgICAgICAgICAgIGlmIChnX2FtdF9mZF9jdXJyZW50ICYmICpnX2FtdF9mZF9jdXJyZW50ID49IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYoZ19hbXRfYXRfbW9kZSAhPSAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgQW10X1NlbmREYXRhKCpnX2FtdF9mZF9jdXJyZW50LCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCByZWFkX2xlbik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBDdXJyZW50IGZkIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZyZWUocmVjZWl2ZV9idWZmZXIpOw0KICAgIHJldHVybiBOVUxMOw0KfQ0KI2VuZGlmDQoNCg0KLyoqDQogKiBAYnJpZWYgtsHIoWNwsuC1xLe0wKHP+8+iz9+zzLqvyv0NCiAqIEBwYXJhbVtpbl0gYXJncyDP37PMuq/K/bLOyv0NCiAqIEByZXR1cm4gTi9BDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIHZvaWQqIFJlYWRGcm9tQ1BUaHJlYWQodm9pZCogYXJncykNCnsNCiAgICAvLyBSZWFkIGZyb20gQVAtQ1AgY2hhbm5lbA0KICAgIGNoYXIgKnJlY2VpdmVfYnVmZmVyID0gTlVMTDsNCg0KCVVOVVNFRChhcmdzKTsNCgkNCglyZWNlaXZlX2J1ZmZlciA9IG1hbGxvYyhNQVhfUEFDS0VUX0xFTkdUSCk7DQogICAgaWYgKHJlY2VpdmVfYnVmZmVyID09IE5VTEwpDQogICAgew0KICAgICAgICByZXR1cm4gTlVMTDsNCiAgICB9DQoNCglwcmN0bChQUl9TRVRfTkFNRSwgIkFtdFJlYWRGcm9tQ1AiKTsNCg0KICAgIHdoaWxlICgxKQ0KICAgIHsNCiAgICAgICAgaW50IHJlYWRfbGVuID0gQW10X1JlY2VpdmVEYXRhKGdfYW10X2ZkX2NwLCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCk7DQoNCiAgICAgICAgaWYgKHJlYWRfbGVuID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogUmVjZWl2ZSBjcCBkYXRhLCByZWFkX2xlbiA9ICVkIS5cbiIsIF9fRlVOQ1RJT05fXywgcmVhZF9sZW4pOw0KDQogICAgICAgICAgICBpZiAoZ19hbXRfZmRfY3VycmVudCAmJiAqZ19hbXRfZmRfY3VycmVudCA+PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmKGdfYW10X2F0X21vZGUgIT0gMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIEFtdF9TZW5kRGF0YSgqZ19hbXRfZmRfY3VycmVudCwgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgcmVhZF9sZW4pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogQ3VycmVudCBmZCBpcyB3cm9uZy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXR1cyA9IGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsNCiAgICAgICAgICAgIGlmKHN0YXR1cyAhPSBDUE5WX09LKQ0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGNwbnZfRnNHY1dhaXQgZmFpbCwgZXJyID0gJWQuXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmcmVlKHJlY2VpdmVfYnVmZmVyKTsNCiAgICByZXR1cm4gTlVMTDsNCn0NCg0KDQovKioNCiAqIEBicmllZiC2wcihxuTL+2FwcLXEz/vPos/fs8y6r8r9DQogKiBAcGFyYW1baW5dIGFyZ3Mgz9+zzLqvyv2yzsr9DQogKiBAcmV0dXJuIE4vQQ0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyB2b2lkKiBSZWN2TXNnRnJvbUFwcFRocmVhZCh2b2lkKiBhcmdzKQ0Kew0KICAgIGludCBpUmV0IDsNCiAgICBNU0dfQlVGIHN0TXNnID0gezB9Ow0KICAgIExPTkcgbXNnU2l6ZSA9ICBzaXplb2YoTVNHX0JVRikgLSBzaXplb2YoTE9ORyk7DQoNCglVTlVTRUQoYXJncyk7DQoNCiAgICBwcmN0bChQUl9TRVRfTkFNRSwgIkFtdFJlY3ZBcHBNc2ciKTsNCiAgICB3aGlsZSgxKQ0KICAgIHsNCiAgICAgICAgaVJldCA9IDA7DQogICAgICAgIG1lbXNldCgmc3RNc2csIDB4MDAsIHNpemVvZihNU0dfQlVGKSk7DQoNCiAgICAgICAgaVJldCA9IG1zZ3JjdihnX2FtdF9pTXNnSGFuZGxlLCAmc3RNc2csIG1zZ1NpemUsIDAsIDApOw0KICAgICAgICBpZihpUmV0ID49IDApDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IG1zZ2NtZCA9IDB4JXgsZGF0YWxlbj0lZC5cbiIsIF9fRlVOQ1RJT05fXyxzdE1zZy51c01zZ0NtZCxzdE1zZy51c0RhdGFMZW4pOw0KCQkJDQogICAgICAgICAgICBzd2l0Y2ggKHN0TXNnLnVzTXNnQ21kKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9CQVRURVJZX1ZPTFRBR0VfVEVTVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjdiAgTVNHX0NNRF9BTVRfQkFUVEVSWV9WT0xUQUdFX1RFU1RfUlNQLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfQkFUVEVSWV9WT0xUQUdFLCByZXN1bHQsICh1bnNpZ25lZCBjaGFyICopc3RNc2cuYXVjRGF0YUJ1Ziwgc3RNc2cudXNEYXRhTGVuKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9LRVlfVEVTVF9TVEFSVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBLRVlfVEVTVF9TVEFSVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfS0VZQk9BUkRfU1RBUlQsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX0tFWV9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9LRVlCT0FSRF9TVE9QLCByZXN1bHQsICh1bnNpZ25lZCBjaGFyICopc3RNc2cuYXVjRGF0YUJ1Ziwgc3RNc2cudXNEYXRhTGVuKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9MQ0RfVEVTVF9TVEFSVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBMQ0RfVEVTVF9TVEFSVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9MQ0RfU1RBUlQsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfTENEX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCgkJCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBMQ0RfVEVTVF9TVE9QIHJlc3VsdD0lZFxuIiwgX19GVU5DVElPTl9fLHJlc3VsdCk7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogTENEX1RFU1RfU1RPUCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9MQ0RfU1RPUCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9MQ0RfQkFDS0xJR0hUX1RFU1RfU1RBUlRfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogTENEX0JBQ0tMSUdIVF9URVNUX1NUQVJUIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0xDREJBQ0tMSUdIVF9TVEFSVCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9MQ0RfQkFDS0xJR0hUX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBMQ0RfQkFDS0xJR0hUX1RFU1RfU1RPUCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9MQ0RCQUNLTElHSFRfU1RPUCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9WSUJSQVRPUl9URVNUX1NUQVJUX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFZJQlJBVE9SX1RFU1RfU1RBUlQgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfVklCUkFUT1JfU1RBUlQsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfVklCUkFUT1JfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFZJQlJBVE9SX1RFU1RfU1RPUCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9WSUJSQVRPUl9TVE9QLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX0NBTUVSQV9URVNUX1NUQVJUX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQlpbnQqIHBBdWNEYXRhQnVmID0gKGludCopc3RNc2cuYXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICByZXN1bHQgPSAgKnBBdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gIDEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfU1VDQ0VTU19SRVQ7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IENBTUVSQV9URVNUX1NUQVJUIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0NBTUVSQV9CQUNLX1NUQVJULCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX0NBTUVSQV9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogQ0FNRVJBX1RFU1RfU1RPUCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9DQU1FUkFfQkFDS19TVE9QLCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1NQRUFLRVJfVEVTVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjdiAgTVNHX0NNRF9BTVRfU1BFQUtFUl9URVNUX1JTUC5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTUEVBS0VSX1RFU1QgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfQVVESU9fTUlDX1NQRUFLRVIsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfU1BFQUtFUl9URVNUX1NUT1BfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlY3YgIE1TR19DTURfQU1UX1NQRUFLRVJfVEVTVF9TVE9QX1JTUC5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX0FVRElPX01JQ19TUEVBS0VSX1NUT1AsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfUkVDRUlWRVJfVEVTVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjdiAgTVNHX0NNRF9BTVRfUkVDRUlWRVJfVEVTVF9SU1AuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KICAgICAgICAgICAgICAgIHJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCiAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogUkVDRUlWRVJfVEVTVCBmYWlsLiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgQW10X0RldmljZVRlc3RfU2VuZE1zZyhNU0dfREVWSUNFVEVTVF9BVURJT19NSUNfUkVDRUlWRVIsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfUkVDRUlWRVJfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiByZWN2ICBNU0dfQ01EX0FNVF9SRUNFSVZFUl9URVNUX1NUT1BfUlNQLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfQVVESU9fTUlDX1JFQ0VJVkVSX1NUT1AsIHJlc3VsdCwgTlVMTCwgMCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNhc2UgTVNHX0NNRF9BTVRfVFBfVEVTVF9TVEFSVF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBUUF9URVNUX1NUQVJUIGZhaWwuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX1RQX1NUQVJULCByZXN1bHQsIE5VTEwsIDApOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX1RQX1RFU1RfU1RPUF9SU1A6DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KICAgICAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBUUF9URVNUX1NUT1AgZmFpbC4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIEFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfVFBfU1RPUCwgcmVzdWx0LCBOVUxMLCAwKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9HU0VOU09SX1RFU1RfU1RBUlRfUlNQOg0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjYXNlIE1TR19DTURfQU1UX0dTRU5TT1JfVEVTVF9TVE9QX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCgkJCQ0KCSAgICAgICAgY2FzZSBNU0dfQ01EX0FNVF9XSUZJX1RFU1RfU1RBUlRfUlNQOg0KCQkJew0KCQkJCWludCByZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCWludCogcEF1Y0RhdGFCdWYgPSAoaW50KilzdE1zZy5hdWNEYXRhQnVmOw0KCQkJCXJlc3VsdCA9ICAqcEF1Y0RhdGFCdWY7DQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAgMSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgCXJlc3VsdCA9IEFNVF9TVUNDRVNTX1JFVDsNCiAgICAgICAgICAgICAgICB9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJcmVzdWx0ID0gQU1UX0VSUk9SX1JFVDsNCgkJCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogV2lmaSB0ZXN0IGZhaWwhIiwgX19GVU5DVElPTl9fKTsNCgkJCQl9DQoNCgkJCQlBbXRfRGV2aWNlVGVzdF9TZW5kTXNnKE1TR19ERVZJQ0VURVNUX1dJRkksIHJlc3VsdCwgTlVMTCwgMCk7DQoJCQkJYnJlYWs7DQoJCQl9DQoNCgkJCWNhc2UgTVNHX0NNRF9BTVRfRkxBU0hMSUdIVF9TVEFSVF9SU1A6DQoJCQl7DQoJCQkJaW50IHJlc3VsdCA9IEFNVF9FUlJPUl9SRVQ7DQoJCQkJaW50KiBwQXVjRGF0YUJ1ZiA9IChpbnQqKXN0TXNnLmF1Y0RhdGFCdWY7DQoJCQkJcmVzdWx0ID0gICpwQXVjRGF0YUJ1ZjsNCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09ICAxKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAJcmVzdWx0ID0gQU1UX1NVQ0NFU1NfUkVUOw0KICAgICAgICAgICAgICAgIH0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQlyZXN1bHQgPSBBTVRfRVJST1JfUkVUOw0KCQkJCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBmbGFzaGxpZ2h0IHRlc3QgZmFpbCEiLCBfX0ZVTkNUSU9OX18pOw0KCQkJCX0NCg0KCQkJCUFtdF9EZXZpY2VUZXN0X1NlbmRNc2coTVNHX0RFVklDRVRFU1RfRkxBU0hMSUdIVF9TVEFSVCwgcmVzdWx0LCBOVUxMLCAwKTsNCgkJCQlicmVhazsNCgkJCX0NCgkJCS8vZ3BzsuLK1M/7z6K72NOmDQogICAgICAgICAgICBjYXNlIEtXQVRDSF9NU0dfR1BTX1JTUDoNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRfUHJvY2Vzc19HcHNfUnNwKCZzdE1zZyxGSURfR1BTX01PRFVMRV9URVNUKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoJcmV0dXJuIE5VTEw7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgvNPU2LCuv8bOoldJRkm5zLz+DQogKiBAcGFyYW1baW5dIGFyZ3Mgz9+zzLqvyv2yzsr9DQogKiBAcmV0dXJuIE4vQQ0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyB2b2lkKiBMb2FkV2lmaUZpcm13YXJlVGhyZWFkKHZvaWQqIGFyZ3MpDQp7DQogICAgaW50IHJldCA9IC0xOw0KICAgIFVOVVNFRChhcmdzKTsNCgkNCglwcmN0bChQUl9TRVRfTkFNRSwgIkxvYWRXaWZpRmlybXdhcmVUaHJlYWQiKTsNCg0KCSNpZiAoZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKSkNCglyZXQgPSB3aWZpX2lvY3RsX2hhbmRsZSgzKTsgLy+809TYsuLK1LnMvP4NCglpZihyZXQgPCAwKQ0KCXsNCgkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGxvYWQgQUlDXzg4MDBEVyBmaXJtd2FyZSBmYWlsISByZXQ9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7DQoJfQ0KICAgIGVsc2UNCgl7DQoJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGxvYWQgQUlDXzg4MDBEVyBmaXJtd2FyZSBzdWNjZXNzISByZXQ9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7DQoJfQ0KCSNlbmRpZg0KCQ0KICAgIHJldHVybiBOVUxMOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K08rD8t6K4+ENQDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gbXNnX2lkIEZJRA0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gs8m5pre1u9gwDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBbXRfU2VuZE1lc3NhZ2VUb0FtdGFnZW50KGludCBmZCwgdW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICAvLyBTVFggIFRJRCAgRklEICAgRGF0YSAgQ2hlY2sgIEVUWA0KICAgIHVuc2lnbmVkIGludCBDbWRDb3VudCA9IDEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxICAgKyAxOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBSc3AgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBFVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBUSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBDaGVjayA9IE5VTEw7DQogICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KICAgIHVuc2lnbmVkIGludCBpID0gMDsNCg0KICAgIHBSc3AgPSBtYWxsb2MoQ21kQ291bnQpOw0KCWlmKHBSc3AgPT0gTlVMTCkNCgkJcmV0dXJuIC0xOw0KICAgIG1lbXNldChwUnNwLCAwLCBDbWRDb3VudCk7DQoNCiAgICBwU1RYID0gJnBSc3BbMF07DQogICAgcEVUWCA9ICZwUnNwWzEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxXTsNCiAgICBwVElEID0gJnBSc3BbMV07DQogICAgcEZJRCA9ICZwUnNwWzEgKyAxXTsNCiAgICBwQ2hlY2sgPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuXTsNCiAgICBwRGF0YSA9ICZwUnNwWzEgKyAxICsgMV07DQoJDQogICAgKnBTVFggPSAweDAyOw0KICAgICpwRVRYID0gMHgwMjsNCiAgICAqcFRJRCA9IChtc2dfaWQgJiAweEZGMDApID4+IDg7DQogICAgKnBGSUQgPSAobXNnX2lkICYgMHhGRik7DQoNCiAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmX2xlbiA+IDApDQogICAgew0KICAgICAgICBtZW1jcHkocERhdGEsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KDQogICAgQ2hlY2tTdW0gPSAwOw0KDQogICAgZm9yIChpID0gMDsgaSA8ICgxICsgMSArIGJ1Zl9sZW4pOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IHBSc3BbMSArIGldOw0KDQogICAgKnBDaGVjayA9IENoZWNrU3VtOw0KDQogICAgQW10X1NlbmREYXRhVG9BbXRhZ2VudChmZCwgcFJzcCwgQ21kQ291bnQpOw0KDQogICAgZnJlZShwUnNwKTsNCiAgICByZXR1cm4gMDsNCn0NCg0KDQovKioNCiAqIEBicmllZiBBTVTP+8+itPKw/LeiuPhQQw0KICogQHBhcmFtW2luXSBmZCDOxLz+w+jK9rf7DQogKiBAcGFyYW1baW5dIG1zZ19pZCBGSUQNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILPJuaa3tbvYMA0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyBpbnQgQW10X1NlbmRNZXNzYWdlKGludCBmZCwgdW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICAvLyBTVFggIFRJRCAgRklEICAgRGF0YSAgQ2hlY2sgIEVUWA0KICAgIHVuc2lnbmVkIGludCBDbWRDb3VudCA9IDEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxICAgKyAxOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBSc3AgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBFVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBUSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBDaGVjayA9IE5VTEw7DQogICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KICAgIHVuc2lnbmVkIGludCBpID0gMDsNCg0KICAgIHBSc3AgPSBtYWxsb2MoQ21kQ291bnQpOw0KCWlmKHBSc3AgPT0gTlVMTCkNCgkJcmV0dXJuIC0xOw0KICAgIG1lbXNldChwUnNwLCAwLCBDbWRDb3VudCk7DQoNCiAgICBwU1RYID0gJnBSc3BbMF07DQogICAgcEVUWCA9ICZwUnNwWzEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxXTsNCiAgICBwVElEID0gJnBSc3BbMV07DQogICAgcEZJRCA9ICZwUnNwWzEgKyAxXTsNCiAgICBwQ2hlY2sgPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuXTsNCiAgICBwRGF0YSA9ICZwUnNwWzEgKyAxICsgMV07DQoNCiAgICAqcFNUWCA9IDB4MDI7DQogICAgKnBFVFggPSAweDAyOw0KICAgICpwVElEID0gKG1zZ19pZCAmIDB4RkYwMCkgPj4gODsNCiAgICAqcEZJRCA9IChtc2dfaWQgJiAweEZGKTsNCg0KICAgIGlmIChidWYgIT0gTlVMTCAmJiBidWZfbGVuID4gMCkNCiAgICB7DQogICAgICAgIG1lbWNweShwRGF0YSwgYnVmLCBidWZfbGVuKTsNCiAgICB9DQoNCiAgICBDaGVja1N1bSA9IDA7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgKDEgKyAxICsgYnVmX2xlbik7IGkrKykNCiAgICAgICAgQ2hlY2tTdW0gXj0gcFJzcFsxICsgaV07DQoNCiAgICAqcENoZWNrID0gQ2hlY2tTdW07DQoNCiAgICBBbXRfU2VuZERhdGEoZmQsIHBSc3AsIENtZENvdW50KTsNCg0KICAgIGZyZWUocFJzcCk7DQogICAgcmV0dXJuIDA7DQp9DQoNCiNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K3osvNDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILe1u9i3osvNtcTK/b7ds6S2yA0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyBpbnQgQW10X1NlbmREYXRhVG9DQVAoaW50IGZkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIGludCB3cml0ZV9sZW4gPSBQb3J0U2VuZChmZCwgKHVuc2lnbmVkIGNoYXIqKSZidWZfbGVuLCBzaXplb2YodW5zaWduZWQgaW50KSwgV0FJVF9BTEwpOw0KDQogICAgaWYgKHdyaXRlX2xlbiAhPSBzaXplb2YodW5zaWduZWQgaW50KSkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBGYWlsZWQgdG8gc2VuZCBkYXRhX2xlbiB0byBmZCglZCkhIHdyaXRlX2xlbiA9ICVkLlxuIiwNCiAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZmQsIHdyaXRlX2xlbik7DQogICAgICAgIHdyaXRlX2xlbiA9IDA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGlmIChidWYgIT0gTlVMTCAmJiBidWZfbGVuID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgd3JpdGVfbGVuID0gUG9ydFNlbmQoZmQsIGJ1ZiwgYnVmX2xlbiwgV0FJVF9BTEwpOw0KDQogICAgICAgICAgICBpZiAod3JpdGVfbGVuICE9IChpbnQpYnVmX2xlbikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogRmFpbGVkIHRvIHNlbmQgZGF0YSB0byBmZCglZCkhICh3cml0ZV9sZW4gPSAlZCkgIT0gKGJ1Zl9sZW4gPSAlZCkuXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZkLCB3cml0ZV9sZW4sIGJ1Zl9sZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIHdyaXRlX2xlbjsNCn0NCg0KDQovKioNCiAqIEBicmllZiBBTVTP+8+itPKw/LeiuPhDQVANCiAqIEBwYXJhbVtpbl0gZmQgzsS8/sPoyva3+w0KICogQHBhcmFtW2luXSBtc2dfaWQgRklEDQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiCzybmmt7W72DANCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9TZW5kTWVzc2FnZVRvQ0FQKGludCBmZCwgdW5zaWduZWQgaW50IG1zZ19pZCwgdW5zaWduZWQgY2hhciogYnVmLCB1bnNpZ25lZCBpbnQgYnVmX2xlbikNCnsNCiAgICAvLyBTVFggIFRJRCAgRklEICAgRGF0YSAgQ2hlY2sgIEVUWA0KICAgIHVuc2lnbmVkIGludCBDbWRDb3VudCA9IDEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxICAgKyAxOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBSc3AgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBFVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBUSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBDaGVjayA9IE5VTEw7DQogICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KICAgIHVuc2lnbmVkIGludCBpID0gMDsNCg0KICAgIHBSc3AgPSBtYWxsb2MoQ21kQ291bnQpOw0KCWlmKHBSc3AgPT0gTlVMTCkNCgkJcmV0dXJuIC0xOw0KICAgIG1lbXNldChwUnNwLCAwLCBDbWRDb3VudCk7DQoNCiAgICBwU1RYID0gJnBSc3BbMF07DQogICAgcEVUWCA9ICZwUnNwWzEgKyAxICsgMSArIGJ1Zl9sZW4gKyAxXTsNCiAgICBwVElEID0gJnBSc3BbMV07DQogICAgcEZJRCA9ICZwUnNwWzEgKyAxXTsNCiAgICBwQ2hlY2sgPSAmcFJzcFsxICsgMSArIDEgKyBidWZfbGVuXTsNCiAgICBwRGF0YSA9ICZwUnNwWzEgKyAxICsgMV07DQoJDQogICAgKnBTVFggPSAweDAyOw0KICAgICpwRVRYID0gMHgwMjsNCiAgICAqcFRJRCA9IChtc2dfaWQgJiAweEZGMDApID4+IDg7DQogICAgKnBGSUQgPSAobXNnX2lkICYgMHhGRik7DQoNCiAgICBpZiAoYnVmICE9IE5VTEwgJiYgYnVmX2xlbiA+IDApDQogICAgew0KICAgICAgICBtZW1jcHkocERhdGEsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KDQogICAgQ2hlY2tTdW0gPSAwOw0KDQogICAgZm9yIChpID0gMDsgaSA8ICgxICsgMSArIGJ1Zl9sZW4pOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IHBSc3BbMSArIGldOw0KDQogICAgKnBDaGVjayA9IENoZWNrU3VtOw0KDQogICAgQW10X1NlbmREYXRhVG9DQVAoZmQsIHBSc3AsIENtZENvdW50KTsNCg0KICAgIGZyZWUocFJzcCk7DQogICAgcmV0dXJuIDA7DQp9DQojZW5kaWYNCg0KDQoNCi8qKg0KICogQGJyaWVmIEFNVM/7z6K0psDtuq/K/Q0KICogQHBhcmFtW2luXSBtc2dfaWQgRklEDQogKiBAcGFyYW1baW5dIGJ1ZiC908rVyv2+3WJ1ZmZlcg0KICogQHBhcmFtW2luXSBidWZfbGVuIL3TytXK/b7dYnVmZmVys6S2yA0KICogQHJldHVybiCzybmmt7W72DANCiAqIEBub3RlDQogKiBAc2VlIA0KICovDQpzdGF0aWMgaW50IEFtdF9Qcm9jZXNzTWVzc2FnZSh1bnNpZ25lZCBpbnQgbXNnX2lkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIGlmIChtc2dfaWQgPj0gRklEX1dJRklfQ01EX05PUlROICYmIG1zZ19pZCA8PSBGSURfV0lGSV9DTURfRU5EKSAvLyB3aWZpIHRlc3QNCiAgICB7DQogICAgICAgIEFtdF9XaWZpX1Byb2Nlc3NNc2cobXNnX2lkLCBidWYsIGJ1Zl9sZW4pOw0KICAgIH0NCiAgICBlbHNlIGlmIChtc2dfaWQgPT0gRklEX0dFVF9DSElQX1BMQVRGT1JNKQ0KICAgIHsNCiAgICAgICAgIC8vDQoJICAgIGlmKGlzX2FtdF9tb2RlKCkpDQoJICAgIHsNCgkgICAgCUFtdFByaW50ZihBTVRfRVJST1IgIkFNVCBNT0RFIVxuIik7DQoJICAgIH0NCgkgICAgZWxzZQ0KCSAgICB7DQoJICAgIAlBbXRQcmludGYoQU1UX0VSUk9SICJOb3JtYWwgTU9ERSFcbiIpOw0KCSAgICB9DQogICAgICAgIHVuc2lnbmVkIGNoYXIgY2hpcFR5cGUgPSAwOw0KICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBHZXQgY2hpcCBwbGF0Zm9ybSBtc2dfaWQgPSAlIzA0eCwgYnVmX2xlbiA9ICVkLlxuIiwNCiAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICAgICAgY2hpcFR5cGUgPSAxOyAvKjE6NzUyMFYzIDI6NzEwMCovDQoNCiAgICAgICAgaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsICZjaGlwVHlwZSwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSA9PSAtMSkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlIGlmIChtc2dfaWQgPj0gRklEX0dQU19NT0RVTEVfVEVTVCAmJiBtc2dfaWQgPD0gRklEX0dQU19DTURfRU5EKSAvLyBncHMgdGVzdA0KICAgIHsNCiAgICAgICAgQW10X0dwc19Qcm9jZXNzTXNnKG1zZ19pZCwgYnVmLCBidWZfbGVuKTsNCiAgICB9DQogICAgZWxzZSBpZiAobXNnX2lkID49IE1TR19ERVZJQ0VURVNUX1NUQVJUICYmIG1zZ19pZCA8PSBNU0dfREVWSUNFVEVTVF9FTkQpDQogICAgew0KICAgICAgICBBbXRfRGV2aWNlVGVzdF9Qcm9jZXNzTXNnKG1zZ19pZCwgYnVmLCBidWZfbGVuKTsNCiAgICB9DQoJZWxzZSBpZiAobXNnX2lkID09IEZJRF9BTVRfRU5EKQ0KICAgIHsNCgkJdW5zaWduZWQgaW50IHN0YXR1cyA9IENQTlZfT0s7Ly9jcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19OVlJPRlMsIDEpOw0KCQkvKg0KCSAgICAgICBpZihzdGF0dXMgIT0gQ1BOVl9PSykNCgkJew0KCQkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIFJXIG52cm9mcyBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOw0KCQkJcmV0dXJuIC0xOw0KCQl9Ki8NCgkJDQogICAgICAgIHN0YXR1cyA9IGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsNCgkJaWYoc3RhdHVzID09IENQTlZfT0spDQoJCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBjcG52X0ZzR2NXYWl0IG9rLlxuIiwgX19GVU5DVElPTl9fKTsNCgkJZWxzZQ0KCQkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogY3Budl9Gc0djV2FpdCBmYWlsLCBlcnIgPSAlZC5cbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsNCg0KCQlpZiAoQW10X0NyZWF0ZVJlc3BvbnNlKG1zZ19pZCwgKHVuc2lnbmVkIGNoYXIqKSZzdGF0dXMsIHNpemVvZih1bnNpZ25lZCBpbnQpKSA9PSAtMSkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgIH0NCgllbHNlIGlmIChtc2dfaWQgPT0gRklEX0FNVF9FWElUKQ0KCXsNCgkgICAgdW5zaWduZWQgaW50IHN0YXR1cyA9IDA7DQoJCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopJnN0YXR1cywgc2l6ZW9mKHVuc2lnbmVkIGludCkpID09IC0xKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogU2VuZCBkYXRhIGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQoJfQ0KICAgIGVsc2UgaWYgKG1zZ19pZCA9PSBGSURfRVhfQ09NTU9OX1NFVEJPT1RNT0RFKQ0KICAgIHsNCiAgICAgICAgLy8gc2V0IG5vcm1hbCBtb2RlDQogICAgICAgIHVuc2lnbmVkIGNoYXIgYm9vdG1vZGVbXSA9IHsweEZGLCAweEZGfTsgICAgICAgIA0KCQl1bnNpZ25lZCBpbnQgZHdSZXQgPSBDUE5WX09LOw0KDQogICAgICAgIC8vc3RydWN0IHRpbWVzcGVjIHRzOw0KCQkvL2Nsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOw0KCQkvL0FtdFByaW50ZihBTVRfSU5GTyAiWyU4ZC4lMDNkXSAlczogY3Budl9Gc0djV2FpdCBzdGFydC5cbiIsIHRzLnR2X3NlYywgdHMudHZfbnNlYyAvIDEwMDAwMDAsX19GVU5DVElPTl9fKTsNCiAgICAgICAgdW5zaWduZWQgY2hhciBtb2RlID0gNDsNCgkJaWYoYnVmX2xlbiA9PSBzaXplb2YobW9kZSkpDQoJCXsNCgkJICAgIG1lbWNweSgmbW9kZSwgYnVmLCBzaXplb2YobW9kZSkpOw0KCQl9DQoJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGJvb3QgbW9kZT0lZFxuIiwgX19GVU5DVElPTl9fLG1vZGUpOw0KCQlzd2l0Y2gobW9kZSkNCgkJew0KCQkgICAgIGNhc2UgMDogLy91c2VyIG1vZGUNCiAgICAgICAgICAgICB7ICAgDQogICAgICAgICAgICAgICAgIG52X3NldF9pdGVtKE5WX1JPLCAidXNiX21vZGV0eXBlIiwgInVzZXIiLCAxKTsNCgkJCQkgbnZfY29tbWl0KE5WX1JPKTsNCgkJCQkgYm9vdG1vZGVbMF0gPTB4NTQ7DQogICAgICAgICAgICAgICAgIGJvb3Rtb2RlWzFdID0weDAwOw0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgY2FzZSAxOi8vZGVidWcgbW9kZQ0KICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgbnZfc2V0X2l0ZW0oTlZfUk8sICJ1c2JfbW9kZXR5cGUiLCAiZGVidWciLCAxKTsNCgkJCQkgbnZfY29tbWl0KE5WX1JPKTsNCgkJCQkgYm9vdG1vZGVbMF0gPTB4NTQ7DQogICAgICAgICAgICAgICAgIGJvb3Rtb2RlWzFdID0weDAxOw0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgY2FzZSAyOi8vZmFjdG9yeSBtb2RlDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICBudl9zZXRfaXRlbShOVl9STywgInVzYl9tb2RldHlwZSIsICJmYWN0b3J5IiwgMSk7DQoJCQkJIG52X2NvbW1pdChOVl9STyk7DQoJCQkJIGJvb3Rtb2RlWzBdID0weDU0Ow0KICAgICAgICAgICAgICAgICBib290bW9kZVsxXSA9MHgwMjsNCiAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KICAgICAgICAgICAgIGNhc2UgMzovL2FtdCBtb2RlDQogICAgICAgICAgICAgew0KCQkJIAkgLy9udl9zZXRfaXRlbShOVl9STywgInVzYl9tb2RldHlwZSIsICJhbXQiLCAxKTsNCgkJCSAJIC8vbnZfY29tbWl0KE5WX1JPKTsNCgkJCQkgYm9vdG1vZGVbMF0gPTB4NTQ7DQogICAgICAgICAgICAgICAgIGJvb3Rtb2RlWzFdID0weDREOw0KICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICB9DQogICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgIH0NCgkJfQ0KDQogICAgICAgIGR3UmV0ID0gYW10X3NldF9ib290bW9kZShib290bW9kZSk7DQogICAgICAgIGlmIChkd1JldCA9PSBDUE5WX09LKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBzZXQgYm9vdCBtb2RlOiBzdWNlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IHNldCBib290IG1vZGU6IGZhaWxlZC5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCgkJLy9jbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsNCgkJLy9BbXRQcmludGYoQU1UX0lORk8gIlslOGQuJTAzZF0gJXM6IGNwbnZfRnNHY1dhaXQgb2suXG4iLCB0cy50dl9zZWMsIHRzLnR2X25zZWMgLyAxMDAwMDAwLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgDQogICAgICAgIGlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopJmR3UmV0LCBzaXplb2YodW5zaWduZWQgaW50KSkgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQogICAgICAgIH0NCiAgICB9DQoJZWxzZSBpZihtc2dfaWQgPT0gRklEX0NIRUNLX1NPRlRET0dfQ0lQSEVSX1RFWFQpDQogICAgew0KICAgICAgICBVSU5UOCBzb2Z0ZG9nX2NpcGhlcl90ZXh0c1tPU19GTEFTSF9BTVRfQ09NTV9ST19TT0ZURE9HX0NJUEhFUl9URVhUX1NJWkVdID0gezB9Ow0KICAgIAlpZighYW10X3JlYWRfbnZfaXRlbShBQlNPRlRET0dfQ0lQSEVSX1RFWFRfTlZQQVJBTSxzb2Z0ZG9nX2NpcGhlcl90ZXh0cyxzaXplb2Yoc29mdGRvZ19jaXBoZXJfdGV4dHMpKSkNCiAgICAJew0KICAgICAgICAJaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsIHNvZnRkb2dfY2lwaGVyX3RleHRzLCBzaXplb2Yoc29mdGRvZ19jaXBoZXJfdGV4dHMpKSA9PSAtMSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgCQlBbXRQcmludGYoQU1UX0VSUk9SICIlczogU2VuZCBkYXRhIGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18pOw0KICAgICAgICAJfQ0KICAgICAgIAkJZWxzZQ0KICAgICAgICAJew0KICAgICAgICAgICAgCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAJCX0NCiAgICAJfQ0KCSAgICBlbHNlDQoJICAgIHsNCgkJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiByZWFkIHNvZnRkb2cgY2lwaGVyIHRleHQgaW4gYWRkcmVzczoweCV4IGZhaWx1cmUuXG4iLCBfX0ZVTkNUSU9OX18sT1NfRkxBU0hfQU1UX0NPTU1fUk9fU09GVERPR19DSVBIRVJfVEVYVF9BRERSRVNTKTsNCgkJfQ0KICAgIH0NCgllbHNlIGlmKG1zZ19pZCA9PSBGSURfU0VUX0JBVF9ERVRfRkxBRykNCiAgICB7DQogICAgICAgIHVuc2lnbmVkIGludCAgcmV0Q29kZSA9IENQTlZfRVJST1I7DQogICAgICAgIGludCBiYXRfdmFsdWUgPSAtMTsNCiAgICAgICAgbWVtY3B5KCZiYXRfdmFsdWUsIGJ1Ziwgc2l6ZW9mKGludCkpOw0KCQlyZXRDb2RlID1hbXRfc2V0X2JhdGRldF9mbGFnKGJhdF92YWx1ZSk7ICAgDQogICAgDQogICAgICAgIGlmIChyZXRDb2RlID09IENQTlZfT0spDQogICAgICAgIHsNCiAgICAgICAgCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGFtdF9zZXRfYmF0ZGV0X2ZsYWcgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJCX0NCiAgICAJZWxzZQ0KICAgIAl7DQogICAgCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBhbXRfc2V0X2JhdGRldF9mbGFnIGZhaWwuXG4iLCBfX0ZVTkNUSU9OX18pOyAgDQogICAgCX0NCgkJaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsICh1bnNpZ25lZCBjaGFyKikmcmV0Q29kZSwgc2l6ZW9mKHJldENvZGUpKSA9PSAtMSkNCiAgICAgICAgew0KICAgICAgICAJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgfQ0KICAgICAgIAllbHNlDQogICAgICAgIHsNCiAgICAgICAgCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSBzdWNjZXNzLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAJfQ0KICAgIH0NCgllbHNlIGlmKG1zZ19pZCA9PSBGSURfR0VUX0JBVF9ERVRfRkxBRykNCiAgICB7DQogICAgICAgIHVuc2lnbmVkIGludCAgcmV0Q29kZSA9IENQTlZfRVJST1I7DQogICAgICAgIGludCBiYXRfdmFsdWUgPSAwOw0KICAgICAgICByZXRDb2RlID1hbXRfZ2V0X2JhdGRldF9mbGFnKCZiYXRfdmFsdWUpOyAgIA0KICAgIA0KICAgICAgICBpZiAocmV0Q29kZSA9PSBDUE5WX09LKQ0KICAgICAgICB7DQogICAgICAgIAlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBhbXRfZ2V0X2JhdGRldF9mbGFnIHN1Y2Nlc3MuYmF0X3ZhbHVlPSVkXG4iLCBfX0ZVTkNUSU9OX18sYmF0X3ZhbHVlKTsNCgkJCWlmIChBbXRfQ3JlYXRlUmVzcG9uc2UobXNnX2lkLCAodW5zaWduZWQgY2hhciopJmJhdF92YWx1ZSwgc2l6ZW9mKGJhdF92YWx1ZSkpID09IC0xKQ0KCSAgICAgICAgew0KCSAgICAgICAgCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJICAgICAgICB9DQoJICAgICAgIAllbHNlDQoJICAgICAgICB7DQoJICAgICAgICAJQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCSAgICAgICAJfQ0KCQl9DQogICAgCWVsc2UNCiAgICAJew0KICAgIAkJQW10UHJpbnRmKEFNVF9JTkZPICIlczogYW10X2dldF9iYXRkZXRfZmxhZyBmYWlsLlxuIiwgX19GVU5DVElPTl9fKTsgIA0KICAgIAl9DQoJfQ0KCWVsc2UgaWYobXNnX2lkID09IEZJRF9SSU5JU09GVFZFUlNJT04pDQogICAgew0KICAgICAgICB1bnNpZ25lZCBpbnQgcmV0Q29kZSA9IENQTlZfRVJST1I7DQoJICAgIGNoYXIgVG1wU29mdFZlcnNpb25bWlBTX1JFRl9NU0lORk9fTUFYX1NPRlRWRVJTSU9OX0lOVF9MRU4rMV09ezB9Ow0KDQoJICAgIHJldENvZGUgPSBjcG52X052SXRlbVJlYWQoWlBTX1JFRl9NU0lORk9fU09GVFZFUlNJT05fSU5UX0JBU0VfQUREUiwgKHVuc2lnbmVkIGNoYXIqKVRtcFNvZnRWZXJzaW9uLCBaUFNfUkVGX01TSU5GT19NQVhfU09GVFZFUlNJT05fSU5UX0xFTik7DQoJICAgIGlmIChyZXRDb2RlID09IENQTlZfT0spDQogICAgICAgIHsNCiAgICAgICAgICAgIFRtcFNvZnRWZXJzaW9uW1pQU19SRUZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9JTlRfTEVOXSA9ICdcMCc7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBpbm5lciB2ZXJzaW9uPSVzXG4iLCBfX0ZVTkNUSU9OX18sVG1wU29mdFZlcnNpb24pOw0KCQkJaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsICh1bnNpZ25lZCBjaGFyKilUbXBTb2Z0VmVyc2lvbiwgc2l6ZW9mKFRtcFNvZnRWZXJzaW9uKSkgPT0gLTEpDQoJICAgICAgICB7DQoJICAgICAgICAJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IFNlbmQgZGF0YSBmYWlsdXJlLlxuIiwgX19GVU5DVElPTl9fKTsNCgkgICAgICAgIH0NCgkgICAgICAgCWVsc2UNCgkgICAgICAgIHsNCgkgICAgICAgIAlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBTZW5kIGRhdGEgc3VjY2Vzcy5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJICAgICAgIAl9DQoJCX0NCiAgICAJZWxzZQ0KICAgIAl7DQogICAgCSAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBnZXQgaW5uZXIgdmVyc2lvbiBmYWlsIVxuIiwgX19GVU5DVElPTl9fKTsgIA0KICAgIAl9CQ0KICAgIH0NCgllbHNlIGlmKG1zZ19pZCA9PSBGSURfUk9VVFNPRlRWRVJTSU9OKQ0KICAgIHsNCiAgICAgICAgdW5zaWduZWQgaW50IHJldENvZGUgPSBDUE5WX0VSUk9SOw0KICAgICAgICBjaGFyIFRtcEV4dGNnbXJbWlBTX1JFRl9NU0lORk9fTUFYX1NPRlRWRVJTSU9OX0VYVF9MRU4rMV09ezB9Ow0KDQoJICAgIHJldENvZGUgPWNwbnZfTnZJdGVtUmVhZChaUFNfUkVGX01TSU5GT19TT0ZUVkVSU0lPTl9FWFRfQkFTRV9BRERSLCAodW5zaWduZWQgY2hhciAqKVRtcEV4dGNnbXIsIFpQU19SRUZfTVNJTkZPX01BWF9TT0ZUVkVSU0lPTl9FWFRfTEVOKTsNCgkgICAgaWYgKHJldENvZGUgPT0gQ1BOVl9PSykNCiAgICAgICAgew0KICAgICAgICAgICAgVG1wRXh0Y2dtcltaUFNfUkVGX01TSU5GT19NQVhfU09GVFZFUlNJT05fRVhUX0xFTl0gPSAnXDAnOw0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogb3V0ZXIgdmVyc2lvbj0lc1xuIiwgX19GVU5DVElPTl9fLFRtcEV4dGNnbXIpOw0KCQkJaWYgKEFtdF9DcmVhdGVSZXNwb25zZShtc2dfaWQsICh1bnNpZ25lZCBjaGFyKilUbXBFeHRjZ21yLCBzaXplb2YoVG1wRXh0Y2dtcikpID09IC0xKQ0KCSAgICAgICAgew0KCSAgICAgICAgCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBTZW5kIGRhdGEgZmFpbHVyZS5cbiIsIF9fRlVOQ1RJT05fXyk7DQoJICAgICAgICB9DQoJICAgICAgIAllbHNlDQoJICAgICAgICB7DQoJICAgICAgICAJQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHN1Y2Nlc3MuXG4iLCBfX0ZVTkNUSU9OX18pOw0KCSAgICAgICAJfQ0KCQl9DQogICAgCWVsc2UNCiAgICAJew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogZ2V0IG91dGVyIHZlcnNpb24gZmFpbCFcbiIsIF9fRlVOQ1RJT05fXyk7ICANCiAgICAJfQkJDQogICAgfQ0KCWVsc2UgaWYoKG1zZ19pZCA+PSBGSURfRlVOX1RFU1RfU1RBUlQpJiYobXNnX2lkIDw9IEZJRF9GVU5fVEVTVF9FTkQpKQ0KCXsNCgkJQW10X0Z1bmNUZXN0X1Byb2Nlc3NNc2cobXNnX2lkLCBidWYsIGJ1Zl9sZW4pOw0KCX0NCgkjaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQoJZWxzZSBpZigobXNnX2lkID49IEZJRF9DQVBfVEVTVF9TVEFSVCkmJihtc2dfaWQgPD0gRklEX0NBUF9URVNUX0VORCkpDQoJew0KCQkgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBjYXAgbXNnLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgLy8gU2VuZCBtZXNzYWdlIHRvIENBUA0KICAgICAgICBpZiAoQW10X1NlbmRNZXNzYWdlVG9DQVAoZ19hbXRfZmRfY2FwLCBtc2dfaWQsIGJ1ZiwgYnVmX2xlbikgPT0gLTEpDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBGYWlsZWQgdG8gc2VuZCBkYXRhIHRvIGNhcCwgbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsDQogICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtc2dfaWQsIGJ1Zl9sZW4pOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogU2VuZCBkYXRhIHRvIGNhcCwgbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsDQogICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtc2dfaWQsIGJ1Zl9sZW4pOw0KICAgICAgICB9DQoJfQ0KCSNlbmRpZg0KICAgIGVsc2UgLy8gQ1AgbWVzc2FnZQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBvbGQgY3AgbXNnLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgLy8gU2VuZCBtZXNzYWdlIHRvIENQDQogICAgICAgaWYgKEFtdF9TZW5kTWVzc2FnZVRvQW10YWdlbnQoZ19hbXRfZmRfY3AsIG1zZ19pZCwgYnVmLCBidWZfbGVuKSA9PSAtMSkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IEZhaWxlZCB0byBzZW5kIGRhdGEgdG8gY3AsIG1zZ19pZCA9ICUjMDR4LCBidWZfbGVuID0gJWQuXG4iLA0KICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnX2lkLCBidWZfbGVuKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IFNlbmQgZGF0YSB0byBjcCwgbXNnX2lkID0gJSMwNHgsIGJ1Zl9sZW4gPSAlZC5cbiIsDQogICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtc2dfaWQsIGJ1Zl9sZW4pOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIDA7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPor3isPwNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuIE4vQQ0KICogQG5vdGUNCiAqIEBzZWUgDQogKi8NCnN0YXRpYyB2b2lkIEFtdF9Db21wb3NlQW5kUHJvY2Vzcyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIHVuc2lnbmVkIGNoYXIgKnBTVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBFVFggPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBUSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBGSUQgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgKnBDaGVjayA9IE5VTEw7DQogICAgdW5zaWduZWQgY2hhciAqcERhdGEgPSBOVUxMOw0KICAgIHVuc2lnbmVkIGNoYXIgQ2hlY2tTdW0gPSAwOw0KICAgIHVuc2lnbmVkIGludCBtc2dfaWQ7DQogICAgdW5zaWduZWQgaW50IGkgPSAwOw0KICAgIHBUSUQgPSBwVElEOw0KICAgIHBDaGVjayA9IHBDaGVjazsNCiAgICBwRGF0YSA9IHBEYXRhOw0KDQogICAgcFNUWCA9ICZidWZbMF07DQogICAgcEVUWCA9ICZidWZbYnVmX2xlbiAtIDFdOw0KICAgIHBUSUQgPSAmYnVmWzFdOw0KICAgIHBGSUQgPSAmYnVmWzEgKyAxXTsNCiAgICBwQ2hlY2sgPSAmYnVmW2J1Zl9sZW4gLSAyXTsNCiAgICBwRGF0YSA9ICZidWZbMSArIDEgKyAxXTsNCg0KICAgIGlmICghKCgweDAyID09ICpwU1RYKSAmJiAoMHgwMiA9PSAqcEVUWCkpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIENoZWNrU3VtID0gMDsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCAoYnVmX2xlbiAtIDIpOyBpKyspDQogICAgICAgIENoZWNrU3VtIF49IGJ1ZlsxICsgaV07DQoNCiAgICBpZiAoQ2hlY2tTdW0gIT0gMCkNCiAgICB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICAvLyBUSUTT60ZJRNfpus/KudPD0tHAqdW5uabE3LrFDQogICAgbXNnX2lkID0gKCpwVElEIDw8IDgpIHwgKnBGSUQ7DQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBtc2dfaWQgPSAlIzA0eCwgYnVmX2xlbiA9ICVkLlxuIiwgX19GVU5DVElPTl9fLCBtc2dfaWQsIGJ1Zl9sZW4pOw0KICAgIEFtdF9Qcm9jZXNzTWVzc2FnZShtc2dfaWQsIHBGSUQgKyAxLCAoYnVmX2xlbiAtIDEgLSAxIC0gMSAtIDEgLSAxKSk7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgQU1Uz/vPore0wKENCiAqIEBwYXJhbVtpbl0gbXNnX2lkIEZJRA0KICogQHBhcmFtW2luXSBidWYgvdPK1cr9vt1idWZmZXINCiAqIEBwYXJhbVtpbl0gYnVmX2xlbiC908rVyv2+3WJ1ZmZlcrOktsgNCiAqIEByZXR1cm4gs8m5pre1u9gwLCDKp7Dct7W72C0xDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0KaW50IEFtdF9DcmVhdGVSZXNwb25zZSh1bnNpZ25lZCBpbnQgbXNnX2lkLCB1bnNpZ25lZCBjaGFyKiBidWYsIHVuc2lnbmVkIGludCBidWZfbGVuKQ0Kew0KICAgIGlmIChnX2FtdF9mZF9jdXJyZW50ICYmICpnX2FtdF9mZF9jdXJyZW50ID49IDApDQogICAgew0KICAgICAgICByZXR1cm4gQW10X1NlbmRNZXNzYWdlKCpnX2FtdF9mZF9jdXJyZW50LCBtc2dfaWQsIGJ1ZiwgYnVmX2xlbik7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBDdXJyZW50IGZkIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCn0NCg0KaW50IEFtdF9FeGVjdXRlQ21kKGNoYXIgKnBjbWQsIGNoYXIgKnBidWZmZXIsIGludCBsZW4pDQp7DQogICAgRklMRSAqcFBpcGU7DQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiBleGVjdXRlIFwiJXNcIiFcbiIsIF9fRlVOQ1RJT05fXywgcGNtZCk7DQoNCiAgICBpZiAoKHBQaXBlID0gcG9wZW4ocGNtZCwgInIiKSkgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgInBvcGVuIFwiJXNcIiBmYWlsdXJlLlxuIiwgcGNtZCk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpbnQgcmVhZF9sZW4gPSBmcmVhZChwYnVmZmVyLCAxLCBsZW4sIHBQaXBlKTsNCiAgICAvL0FtdFByaW50ZihBTVRfSU5GTyAiZnJlYWQsIHJlYWRfbGVuID0gJWQsIHBidWZmZXIgPSAlcy5cbiIsIHJlYWRfbGVuLCBwYnVmZmVyKTsNCg0KICAgIHBjbG9zZShwUGlwZSk7DQogICAgcmV0dXJuIHJlYWRfbGVuOw0KfQ0KDQpzdGF0aWMgaW50IGluaXRfY3BfY2hhbm5lbCh2b2lkKQ0Kew0KICAgIGludCBmZCA9IG9wZW4oQU1UX0NQX0NIQU5ORUwsIE9fUkRXUik7DQoNCiAgICBpZiAoZmQgPCAwKQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiRmFpbGVkIHRvIG9wZW4gXCIlc1wiIVxuIiwgQU1UX0NQX0NIQU5ORUwpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgaWYoaW9jdGwoZmQsIFJQTVNHX0NSRUFURV9DSEFOTkVMLCAoOCoxMDI0KSkhPSAwKSAgIC8vILS0vajNqLXAtPPQoThLDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJpb2N0cmw6UlBNU0dfQ1JFQVRFX0NIQU5ORUwgZmFpbCFcbiIpOw0KICAgIH0NCiAgICBpZihpb2N0bChmZCwgUlBNU0dfU0VUX0lOVF9GTEFHLCBOVUxMKSE9IDApICAgICAgIC8vILeiy83P+8+iyrGjrLSlt6LW0LbPDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJpb2N0cmw6UlBNU0dfU0VUX0lOVF9GTEFHIGZhaWwhXG4iKTsNCiAgICB9DQogICAgaWYoaW9jdGwoZmQsIFJQTVNHX0NMRUFSX1BPTExfRkxBRywgTlVMTCkhPSAwKSAgICAgIC8vINfoyPu1xLe9yr22wQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiaW9jdHJsOlJQTVNHX0NMRUFSX1BPTExfRkxBRyBmYWlsIVxuIik7DQoJfQ0KICAgIHJldHVybiBmZDsNCn0NCg0Kc3RhdGljIGludCBpbml0X3VzYl9kZXZpY2Uodm9pZCkNCnsNCiAgICBpbnQgZmQgPSBvcGVuKEFNVF9VU0JfREVWLCBPX1JEV1IpOw0KDQogICAgaWYgKGZkIDwgMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBvcGVuIFwiJXNcIiFcbiIsIEFNVF9VU0JfREVWKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIFBvcnRTZXQoZmQpOw0KICAgIHJldHVybiBmZDsNCn0NCg0Kc3RhdGljIGludCBpbml0X2hvdHBsdWdfbmwodm9pZCkNCnsNCiAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgc25sOw0KICAgIGJ6ZXJvKCZzbmwsIHNpemVvZihzbmwpKTsNCiAgICBzbmwubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsNCiAgICBzbmwubmxfcGlkID0gZ2V0cGlkKCk7DQogICAgc25sLm5sX2dyb3VwcyA9IDE7DQoNCiAgICBpbnQgcyA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNLCBORVRMSU5LX0tPQkpFQ1RfVUVWRU5UKTsNCiAgICBpZiAocyA9PSAtMSkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkNhbid0IGNyZWF0ZSBob3RwbHVnIHNvY2tldCFcbiIpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgaWYgKGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciAqKSZzbmwsIHNpemVvZihzbmwpKSA8IDApDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJDYW4ndCBiaW5kIGhvdHBsdWcgc29ja2V0IVxuIik7DQoJCWNsb3NlKHMpOw0KICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KDQogICAgcmV0dXJuIHM7DQp9DQoNCnN0YXRpYyBpbnQgaW5pdF9zb2NrZXQoaW50IHBvcnQpDQp7DQogICAgc3RydWN0IHNvY2thZGRyX2luIHNlcmFkZHI7DQogICAgaW50IHNvY2tmZCA9IC0xOw0KDQogICAgQW10UHJpbnRmKEFNVF9JTkZPICJwb3J0ID0gJWQuXG4iLCBwb3J0KTsNCg0KICAgIHNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOw0KICAgIGlmIChzb2NrZmQgPT0gLTEpDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJDYW4ndCBjcmVhdGUgc29ja2V0IVxuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBtZW1zZXQoJnNlcmFkZHIsMCxzaXplb2Yoc2VyYWRkcikpOw0KICAgIHNlcmFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7DQogICAgc2VyYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwOw0KICAgIHNlcmFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsNCg0KICAgIGlmIChiaW5kKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciopKCZzZXJhZGRyKSwgc2l6ZW9mKHNlcmFkZHIpKSA8IDApDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJDYW4ndCBiaW5kIHBvcnQgJWQhXG4iLCBwb3J0KTsNCgkJY2xvc2Uoc29ja2ZkKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIGlmIChsaXN0ZW4oc29ja2ZkLCAxKSA9PSAtMSkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIlNvY2tldCBsaXN0ZW4gZmFpbGVkIVxuIik7DQoJCWNsb3NlKHNvY2tmZCk7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICByZXR1cm4gc29ja2ZkOw0KfQ0KDQojaWZkZWYgVVNFX0NBUF9TVVBQT1JUDQpzdGF0aWMgaW50IGluaXRfY2FwX2NoYW5uZWwodm9pZCkNCnsNCiAgICBpbnQgZmQgPSBvcGVuKEFNVF9DQVBfREVWLCBPX1JEV1IpOw0KDQogICAgaWYgKGZkIDwgMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBvcGVuIFwiJXNcIiFcbiIsIEFNVF9DQVBfREVWKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIGlmKGlvY3RsKGZkLCBSUE1TR19DUkVBVEVfQ0hBTk5FTCwgKDQqMTAyNCkpIT0gMCkgICAvLyC0tL2ozai1wLTz0KE0Sw0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiaW9jdHJsOlJQTVNHX0NSRUFURV9DSEFOTkVMIGZhaWwhXG4iKTsNCiAgICB9DQogICAgaWYoaW9jdGwoZmQsIFJQTVNHX1NFVF9JTlRfRkxBRywgTlVMTCkhPSAwKSAgICAgICAvLyC3osvNz/vPosqxo6y0pbei1tC2zw0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAiaW9jdHJsOlJQTVNHX1NFVF9JTlRfRkxBRyBmYWlsIVxuIik7DQogICAgfQ0KICAgIGlmKGlvY3RsKGZkLCBSUE1TR19DTEVBUl9QT0xMX0ZMQUcsIE5VTEwpIT0gMCkgICAgICAvLyDX6Mj7tcS3vcq9tsENCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgImlvY3RybDpSUE1TR19DTEVBUl9QT0xMX0ZMQUcgZmFpbCFcbiIpOw0KCX0NCiAgICByZXR1cm4gZmQ7DQp9DQojZW5kaWYNCg0KDQpzdGF0aWMgdm9pZCBzZXRfZmQoaW50IGZkKQ0Kew0KICAgIEZEX1NFVChmZCwgJmdfYW10X2Zkc3JlYWQpOw0KICAgIGlmIChmZCA+PSBnX2FtdF9mZF9tYXgpDQogICAgew0KICAgICAgICBnX2FtdF9mZF9tYXggPSBmZCArIDE7DQogICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZCBjbHJfZmQoaW50IGZkKQ0Kew0KICAgIEZEX0NMUihmZCwgJmdfYW10X2Zkc3JlYWQpOw0KfQ0KDQpzdGF0aWMgaW50IENyZWF0ZVNlbmRQYWNrZXQodW5zaWduZWQgICAgIHNob3J0IGZpZCwgdW5zaWduZWQgY2hhciAqZGF0YV9idWYsIGludCBkYXRhX2xlbiwgdW5zaWduZWQgY2hhcipwYWNrZXRfYnVmKQ0Kew0KICAgIGludCBiUmV0ID0gMDsNCiAgICBCWVRFICpwU1RYID0gTlVMTDsNCiAgICBCWVRFICpwRVRYID0gTlVMTDsNCgkvL0ZJRLXEuN/X1r3aDQogICAgQllURSAqcEhGSUQgPSBOVUxMOw0KCS8vRklEtcS1zdfWvdoNCiAgICBCWVRFICpwTEZJRCA9IE5VTEw7DQogICAgQllURSAqcENoZWNrID0gTlVMTDsNCiAgICBCWVRFICpwRGF0YSA9IE5VTEw7DQogICAgQllURSBDaGVja1N1bSA9IDA7DQoJaW50IGkgPSAwOw0KDQogICAgLy8gICAgICAgICAgICBTVFggRklEICBEYXRhIENoZWNrICBFVFgNCiAgICBpbnQgQ21kQ291bnQgPSAxICsgMiArIGRhdGFfbGVuICsgMSAgICsgMTsNCg0KICAgIGlmICgoZGF0YV9sZW4gIT0gMCkgJiYgKE5VTEwgPT0gZGF0YV9idWYpKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIGJSZXQ7DQogICAgfQ0KDQogICAgcFNUWCA9ICZwYWNrZXRfYnVmWzBdOw0KICAgIHBFVFggPSAmcGFja2V0X2J1ZlsxICsgMiArIGRhdGFfbGVuICsgMV07DQogICAgcEhGSUQgPSAmcGFja2V0X2J1ZlsxXTsNCiAgICBwTEZJRCA9ICZwYWNrZXRfYnVmWzErMV07DQogICAgcENoZWNrID0gJnBhY2tldF9idWZbMSArIDIgKyBkYXRhX2xlbl07DQogICAgcERhdGEgPSAmcGFja2V0X2J1ZlsxICsgMl07DQoNCiAgICAqcFNUWCA9IDB4MDI7DQogICAgKnBFVFggPSAweDAyOw0KICAgICpwSEZJRCA9IChmaWQ+PjgpJjB4MDBGRjsNCiAgICAqcExGSUQgPSBmaWQmMHgwMEZGOw0KICAgIG1lbWNweShwRGF0YSwgZGF0YV9idWYsIGRhdGFfbGVuKTsNCiAgICBDaGVja1N1bSA9IDA7DQoJLy9DaGVja1N1bcrHRklEus1EQVRB19a2zrXE0KPR6Q0KICAgIGZvciAoaSA9IDA7IGkgPCAoMiArIGRhdGFfbGVuKTsgaSsrKQ0KICAgICAgICBDaGVja1N1bSBePSBwYWNrZXRfYnVmWzEgKyBpXTsNCiAgICAqcENoZWNrID0gQ2hlY2tTdW07DQogICAgYlJldCA9IDE7DQogICAgcmV0dXJuIGJSZXQ7DQp9DQoNCnN0YXRpYyB2b2lkIHNlbmRfZW50ZXJfYW10X21vZGVfcGFja2V0KCkNCnsNCiAgICB1MzIgZW50ZXJfYW10X3JlcVs1XSA9IHswfTsNCgllbnRlcl9hbXRfcmVxWzBdID0gMHgwMTAwOw0KCWVudGVyX2FtdF9yZXFbMV0gPSAxOw0KCWVudGVyX2FtdF9yZXFbMl0gPSAxOw0KCWVudGVyX2FtdF9yZXFbM10gPSAwOw0KCWVudGVyX2FtdF9yZXFbNF0gPSAwOw0KDQoJdW5zaWduZWQgY2hhciBlbnRlcl9hbXRfcGFja2V0WzI1XSA9IHswfTsNCgl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQoJQ3JlYXRlU2VuZFBhY2tldChmaWQsKHVuc2lnbmVkIGNoYXIqKWVudGVyX2FtdF9yZXEsc2l6ZW9mKGVudGVyX2FtdF9yZXEpLGVudGVyX2FtdF9wYWNrZXQpOw0KCUFtdF9Db21wb3NlQW5kUHJvY2VzcyhlbnRlcl9hbXRfcGFja2V0LCBzaXplb2YoZW50ZXJfYW10X3BhY2tldCkpOw0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX2V4aXRfYW10X21vZGVfcGFja2V0KCkNCnsNCgl1MzIgZXhpdF9hbXRfcmVxWzVdID0gezB9Ow0KCWV4aXRfYW10X3JlcVswXSA9IDB4MDEwMDsNCglleGl0X2FtdF9yZXFbMV0gPSAwOw0KCWV4aXRfYW10X3JlcVsyXSA9IDE7DQoJZXhpdF9hbXRfcmVxWzNdID0gMDsNCglleGl0X2FtdF9yZXFbNF0gPSAwOw0KDQoJdW5zaWduZWQgY2hhciBleGl0X2FtdF9wYWNrZXRbMjVdID0gezB9Ow0KCXVuc2lnbmVkIHNob3J0IGZpZCA9IDB4MDA1ZjsNCglDcmVhdGVTZW5kUGFja2V0KGZpZCwodW5zaWduZWQgY2hhciopZXhpdF9hbXRfcmVxLHNpemVvZihleGl0X2FtdF9yZXEpLGV4aXRfYW10X3BhY2tldCk7DQoJQW10X0NvbXBvc2VBbmRQcm9jZXNzKGV4aXRfYW10X3BhY2tldCwgc2l6ZW9mKGV4aXRfYW10X3BhY2tldCkpOw0KDQp9DQoNCg0Kc3RhdGljIHZvaWQgc2VuZF90eF9zdGFydF9wYWNrZXQodW5zaWduZWQgaW50IGJhbmQsdW5zaWduZWQgaW50IGNoYW5uZWwsc2hvcnQgaW50X3Bvd2VyLHNob3J0IGRlY19wb3dlcikNCnsNCiAgICB0eXBlZGVmIHN0cnVjdA0KICAgIHsNCiAgICAgICAgVUlOVDMyICBNc2dJZDsNCiAgICAJVUlOVDMyICB3QmFuZE51bTsgICAgICAgLy8gxrW2zg0KICAgIAlVSU5UMzIgIGR3RWFyZmNuOyAgIA0KICAgIAlVSU5UMzIgIHdGcmVxOyAgICAgICAgICAvLyDW0NDExrW146OsMTAwa0h6zqq1pc67DQogICAgCVVJTlQzMiAgd0JhbmRXaWR0aDsgICAgIC8vILT4v+2jrDEwMGtIes6qtaXOuw0KICAgIAlVSU5UMzIgIHdBbnRlbm5hUG9ydDsgICAvLyDM7M/ftsu/2iAgo7+jv6O/DQogICAgCVVJTlQzMiAgd01vZHVsYXRpb247ICAgIC8vILX31sa3vcq9o6wwo7pRUFNLo6wxo7oxNlFBTaOsMqO6NjRRQU0NCiAgICAJVUlOVDMyICB3UkJOdW07ICAgICAgICAgLy8gUkK49sr9DQogICAgCVVJTlQzMiAgd1JCU3RhcnRQb3NpdGlvbjsgIC8vIFJCxvDKvMar0sYNCiAgICAJVUlOVDMyICB3U2luZ2xlV2F2ZTsgICAgLy8gyse38c6qtaXU2LKoDQogICAgCVNJTlQxNiBzd1JmSW50UG93ZXI7IAkvL7mmwsrV+8r9DQogICAgCVNJTlQxNiBzd1JmRGVjUG93ZXI7CS8vuabCytChyv0sWy0yIC0xIDAgMSAyIF20+rHtWy0wLjUgLTAuMjUgMCAwLjI1IDAuNV0NCgl9VF96QU1UX0xURUFfU2V0VHhJbml0X1JlcTsgDQoNCglUX3pBTVRfTFRFQV9TZXRUeEluaXRfUmVxIHN0VHhJbml0UmVxID0gezB9Ow0KCXN0VHhJbml0UmVxLk1zZ0lkID0gMHgwNzAwOw0KCXN0VHhJbml0UmVxLndCYW5kTnVtID0gYmFuZDsNCglzdFR4SW5pdFJlcS5kd0VhcmZjbiA9IGNoYW5uZWw7DQoJc3RUeEluaXRSZXEud0ZyZXEgPSAwOw0KCXN0VHhJbml0UmVxLndCYW5kV2lkdGggPSA5Ow0KCXN0VHhJbml0UmVxLndBbnRlbm5hUG9ydCA9IDA7DQoJc3RUeEluaXRSZXEud01vZHVsYXRpb24gPSAwOw0KCXN0VHhJbml0UmVxLndSQk51bSA9IDUwOw0KCXN0VHhJbml0UmVxLndSQlN0YXJ0UG9zaXRpb24gPSAwOw0KCXN0VHhJbml0UmVxLndTaW5nbGVXYXZlID0gMDsNCglzdFR4SW5pdFJlcS5zd1JmSW50UG93ZXIgPSBpbnRfcG93ZXI7DQoJc3RUeEluaXRSZXEuc3dSZkRlY1Bvd2VyID0gZGVjX3Bvd2VyOw0KDQoJdW5zaWduZWQgY2hhciB0eF9zdGFydF9wYWNrZXRbc2l6ZW9mKHN0VHhJbml0UmVxKSs1XSA9IHswfTsNCgl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQoJQ3JlYXRlU2VuZFBhY2tldChmaWQsKHVuc2lnbmVkIGNoYXIqKSZzdFR4SW5pdFJlcSxzaXplb2Yoc3RUeEluaXRSZXEpLHR4X3N0YXJ0X3BhY2tldCk7DQoJQW10X0NvbXBvc2VBbmRQcm9jZXNzKHR4X3N0YXJ0X3BhY2tldCwgc2l6ZW9mKHR4X3N0YXJ0X3BhY2tldCkpOw0KCQ0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX3R4X3N0b3BfcGFja2V0KCkNCnsNCiAgICB1MzIgdHhfY2xvc2VfcmVxWzFdID0gezB9Ow0KCXR4X2Nsb3NlX3JlcVswXSA9IDB4MDIwMTsNCgl1bnNpZ25lZCBjaGFyIHR4X3N0b3BfcGFja2V0WzEqNCs1XSA9IHswfTsNCgl1bnNpZ25lZCBzaG9ydCBmaWQgPSAweDAwNWY7DQoJQ3JlYXRlU2VuZFBhY2tldChmaWQsKHVuc2lnbmVkIGNoYXIqKXR4X2Nsb3NlX3JlcSxzaXplb2YodHhfY2xvc2VfcmVxKSx0eF9zdG9wX3BhY2tldCk7DQoJQW10X0NvbXBvc2VBbmRQcm9jZXNzKHR4X3N0b3BfcGFja2V0LCBzaXplb2YodHhfc3RvcF9wYWNrZXQpKTsNCg0KfQ0KDQpzdGF0aWMgdm9pZCBzZW5kX3N3aXRjaF90b191c2VyX21vZGVfcGFja2V0KCkNCnsNCiAgICB1bnNpZ25lZCBjaGFyIGJvb3Rtb2RlW10gPSB7MHg1NCwgMHgwMH07DQoJdW5zaWduZWQgY2hhciBhdG1vZGVbXSA9IHsweEZGLCAweEZGfTsNCgludl9zZXRfaXRlbShOVl9STywgInVzYl9tb2RldHlwZSIsICJ1c2VyIiwgMSk7DQoJbnZfY29tbWl0KE5WX1JPKTsNCglhbXRfc2V0X2FtdF9hdG1vZGUoYm9vdG1vZGUsYXRtb2RlKTsNCn0NCg0Kc3RhdGljIHZvaWQgc2VuZF9vayhpbnQgZmQpDQp7DQogICAgY2hhciByZXBfb2tbXSA9ICJPS1xyXG4iOw0KCVBvcnRTZW5kKGZkLCAodW5zaWduZWQgY2hhciopcmVwX29rLCBzdHJsZW4ocmVwX29rKSwgV0FJVF9BTEwpOw0KfQ0KDQovKioNCiAqIEBicmllZiBBVMP8we6908rVDQogKiBAcGFyYW1baW5dIGZkIM7EvP7D6Mr2t/sNCiAqIEBwYXJhbVtpbl0gYnVmIL3TytXK/b7dYnVmZmVyDQogKiBAcGFyYW1baW5dIGJ1Zl9sZW4gvdPK1cr9vt1idWZmZXKzpLbIDQogKiBAcmV0dXJuILe1u9i908rVtb21xMr9vt2zpLbIDQogKiBAbm90ZQ0KICogQHNlZSANCiAqLw0Kc3RhdGljIGludCBBdF9SZWNlaXZlRGF0YShpbnQgZmQsIGNoYXIqIGJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4pDQp7DQogICAgaW50IHJlYWRfbGVuID0gMDsNCglpbnQgaSA9IDA7DQoJcmVhZF9sZW4gPSBQb3J0UmVjdihmZCwgYnVmLCAxMDAsIE5PX1dBSVQpOw0KICAgIEFtdFByaW50ZihBTVRfSU5GTyAiJXM6IHJlYWRfbGVuPSVkLlxuIiwgX19GVU5DVElPTl9fLCByZWFkX2xlbik7DQogICAgaWYgKHJlYWRfbGVuID4gMCkNCiAgICB7DQogICAgICAgIGJ1ZltyZWFkX2xlbl0gPSAnXDAnOw0KICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIiVzOiByZWNlaXZlIFslc11cbiIsIF9fRlVOQ1RJT05fXywgYnVmKTsNCgkJLy/Xqru7zqrQodC0DQoJCWZvcihpID0gMDsgaSA8IHJlYWRfbGVuOyBpKyspDQoJCXsNCgkJICAgIGNoYXIgYXQgPSB0b2xvd2VyKGJ1ZltpXSk7DQoJCQlidWZbaV0gPSBhdDsNCgkJfQ0KCQlBbXRQcmludGYoQU1UX0lORk8gIiVzOiBhZnRlciB0b2xvd2VyIFslc11cbiIsIF9fRlVOQ1RJT05fXywgYnVmKTsNCiAgICAgICAgLy9hdCt0eHN0YXJ0PWJhbmQsY2hhbm5lbCxwb3dlcg0KCQlpZihzdHJzdHIoYnVmLCJhdCt0eHN0YXJ0IikgIT0gTlVMTCkNCgkJew0KCQkgICAgQW10UHJpbnRmKEFNVF9JTkZPICIlczogcmVjZWl2ZSBhdCt0eHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOw0KCQkJZG91YmxlIGRhdGFbM10gPSB7MC4wfTsNCgkJCXVuc2lnbmVkIGludCBiYW5kID0gMDsNCgkJCXVuc2lnbmVkIGludCBjaGFubmVsID0gMDsNCgkJCXNob3J0IGludF9wb3dlciA9IDA7DQoJCQlzaG9ydCBpZGVjX3Bvd2VyID0gMDsNCgkJCWRvdWJsZSBkZWNfcG93ZXIgPSAwLjA7DQoJCQkvL7vxyKGyzsr9DQoJCQlidWYgPSBidWYgKyBzdHJsZW4oImF0K3R4c3RhcnQ9Iik7DQoJCQlpZihidWYgIT0gTlVMTCkNCgkJCXsNCgkJCSAgICBzdHJfdG9fZG91YmxlKGRhdGEsYnVmKTsNCgkJCQliYW5kID0gZGF0YVswXTsNCgkJCQljaGFubmVsID0gZGF0YVsxXTsNCgkJCQlpbnRfcG93ZXIgPSBkYXRhWzJdOw0KCQkJCWRlY19wb3dlciA9IGRhdGFbMl0gLSBpbnRfcG93ZXI7DQoJCQkJaWRlY19wb3dlciA9IGRlY19wb3dlcio0Ow0KCQkJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGJhbmQ9JWQsY2hhbm5lbD0lZCxpbnRfcG93ZXI9JWQsZGVjX3Bvd2VyPSVmLGlkZWNfcG93ZXI9JWRcbiIsIF9fRlVOQ1RJT05fXywgYmFuZCxjaGFubmVsLGludF9wb3dlcixkZWNfcG93ZXIsaWRlY19wb3dlcik7DQoJCQkJaWYoYmFuZCA9PSAwKQ0KCQkJCXsNCgkJCQkgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBiYW5kIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJCQkgICByZXR1cm4gcmVhZF9sZW47DQoJCQkJICAgCQ0KCQkJCX0NCgkJCQlpZihjaGFubmVsID09IDAgKQ0KCQkJCXsNCgkJCQkgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogaW52YWxpZCBjaGFubmVsIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJCQkgICByZXR1cm4gcmVhZF9sZW47DQoJCQkJfQ0KCQkJfQ0KCQkJLy/Xqruvzqq9+MjrYW10xKPKvbrNdHhpbml0wb3M9UFNVNa4we4NCgkJCXNlbmRfZW50ZXJfYW10X21vZGVfcGFja2V0KCk7DQoJCQlzbGVlcCgxKTsNCgkJCXNlbmRfdHhfc3RhcnRfcGFja2V0KGJhbmQsY2hhbm5lbCxpbnRfcG93ZXIsaWRlY19wb3dlcik7DQoJCQlzZW5kX29rKGZkKTsgLy/Wsb3TuPhBVMP8we63osvN1d+72Li0b2sNCgkJCQ0KCQl9DQoJCWVsc2UgaWYoc3Ryc3RyKGJ1ZiwiYXQrdHhzdG9wIikgIT0gTlVMTCkNCgkJew0KCQkgICAgLy/Xqruvzqq52LHVt6LJ5Lv6us3Ny7P2YW10xKPKvcG9zPVBTVTWuMHuDQoJCQlzZW5kX3R4X3N0b3BfcGFja2V0KCk7DQoJCSAgICBzbGVlcCgxKTsNCgkJCXNlbmRfZXhpdF9hbXRfbW9kZV9wYWNrZXQoKTsNCgkJCXNlbmRfb2soZmQpOw0KCQl9DQoJCWVsc2UgaWYoc3Ryc3RyKGJ1ZiwiYXQrenZlcnNpb250eXBlPTMiKSAhPSBOVUxMKQ0KCQl7DQoJCQlzZW5kX3N3aXRjaF90b191c2VyX21vZGVfcGFja2V0KCk7DQoJCQlzZW5kX29rKGZkKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiB1bmtub3duIGF0ICVzLlxuIiwgX19GVU5DVElPTl9fLCBidWYpOw0KCQl9DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBQb3J0UmVjdiBmcm9tIGRldmljZShmZCA9ICVkKTogcmVhZF9sZW4oJWQpIGlzIHdyb25nLlxuIiwgX19GVU5DVElPTl9fLCBmZCwgcmVhZF9sZW4pOw0KICAgIH0NCg0KICAgIHJldHVybiByZWFkX2xlbjsNCn0NCg0KLyoqDQogKiBNYWluIEZ1bmN0aW9uDQogKi8NCmludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KICAgIGV4dGVybiBjaGFyICpvcHRhcmc7DQogICAgZXh0ZXJuIGludCBvcHRpbmQ7DQogICAgaW50IGM7DQoJaW50IHNvY2tldF9wb3J0ID0gLTE7DQoNCiAgICAvKioqKioqKioqKioqKioqKioqKioqKiBHZXQgYXJndW1lbnRzICoqKioqKioqKioqKioqKioqKioqLw0KICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLGFyZ3YsInA6cjoiKSkgIT0gRU9GKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoIChjKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlICdwJzoNCiAgICAgICAgICAgICAgICBzb2NrZXRfcG9ydCA9IGF0b2kob3B0YXJnKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgJz8nOg0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiVXNhZ2U6IHp0ZV9hbXQgW29wdGlvbnNdXG4iKTsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIi1wIGlwcG9ydCAtIFNldCBJUCBwb3J0IG51bWJlciB0byBsaXN0ZW4gb25cbiIpOw0KICAgICAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBBbXRQcmludGYoQU1UX0lORk8gInN0YXJ0IEFNVCFcbiIpOw0KDQogICAgRkRfWkVSTygmZ19hbXRfZmRzcmVhZCk7DQoNCiAgICAvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IEFQLUNQIGNoYW5uZWwgKioqKioqKioqKioqKioqKioqKiovDQogICAgZ19hbXRfZmRfY3AgPSBpbml0X2NwX2NoYW5uZWwoKTsNCiAgICBpZiAoZ19hbXRfZmRfY3AgPCAwKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gImdfYW10X2ZkX2NwID0gJWQuXG4iLCBnX2FtdF9mZF9jcCk7DQogICAgfQ0KDQogICAgLyoqKioqKioqKioqKioqKioqKioqKiogSW5pdCBVU0IgZGV2aWNlICoqKioqKioqKioqKioqKioqKioqKioqLw0KICAgIGdfYW10X2ZkX3VzYiA9IGluaXRfdXNiX2RldmljZSgpOw0KICAgIGlmIChnX2FtdF9mZF91c2IgPj0gMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiZ19hbXRfZmRfdXNiID0gJWQuXG4iLCBnX2FtdF9mZF91c2IpOw0KICAgICAgICBzZXRfZmQoZ19hbXRfZmRfdXNiKTsNCg0KICAgICAgICAvL0luaXQgaG90cGx1ZyBuZXRsaW5rDQogICAgICAgIGdfYW10X2ZkX3VzYl9ob3RwbHVnID0gaW5pdF9ob3RwbHVnX25sKCk7DQogICAgICAgIGlmIChnX2FtdF9mZF91c2JfaG90cGx1ZyA+PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gImdfYW10X2ZkX3VzYl9ob3RwbHVnID0gJWQuXG4iLCBnX2FtdF9mZF91c2JfaG90cGx1Zyk7DQogICAgICAgICAgICBzZXRfZmQoZ19hbXRfZmRfdXNiX2hvdHBsdWcpOw0KICAgICAgICB9DQogICAgfQ0KCQ0KICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiBDcmVhdGUgc29ja2V0ICoqKioqKioqKioqKioqKioqKioqKioqLw0KICAgIGlmIChzb2NrZXRfcG9ydCA+IDApDQogICAgew0KICAgICAgICBnX2FtdF9mZF9zb2NrZXRfc2VydmVyID0gaW5pdF9zb2NrZXQoc29ja2V0X3BvcnQpOw0KICAgICAgICBpZiAoZ19hbXRfZmRfc29ja2V0X3NlcnZlciA+PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gImdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIgPSAlZC5cbiIsIGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIpOw0KICAgICAgICAgICAgc2V0X2ZkKGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIpOw0KICAgICAgICB9DQogICAgfQ0KCQ0KICAgICNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCgkvKioqKioqKioqKioqKioqKioqKioqKiBJbml0IEFQLUNBUCBjaGFubmVsICoqKioqKioqKioqKioqKioqKioqLw0KCWdfYW10X2ZkX2NhcCA9IGluaXRfY2FwX2NoYW5uZWwoKTsNCiAgICBpZiAoZ19hbXRfZmRfY2FwIDwgMCkNCiAgICB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJnX2FtdF9mZF9jYXAgPSAlZC5cbiIsIGdfYW10X2ZkX2NhcCk7DQogICAgfQ0KDQoJIC8vIENyZWF0ZSBDQVAgcmVhZCB0aHJlYWQNCiAgICBwdGhyZWFkX3QgY2FwX3JlYWRfdGhyZWFkOw0KICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmY2FwX3JlYWRfdGhyZWFkLCBOVUxMLCBSZWFkRnJvbUNBUFRocmVhZCwgTlVMTCkgIT0gMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBjcmVhdGUgQ0FQIHJlYWQgdGhyZWFkIVxuIik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoJI2VuZGlmDQoNCiAgICAvLyBDcmVhdGUgQ1AgcmVhZCB0aHJlYWQNCiAgICBwdGhyZWFkX3QgY3BfcmVhZF90aHJlYWQ7DQogICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZjcF9yZWFkX3RocmVhZCwgTlVMTCwgUmVhZEZyb21DUFRocmVhZCwgTlVMTCkgIT0gMCkNCiAgICB7DQogICAgICAgIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBjcmVhdGUgQ1AgcmVhZCB0aHJlYWQhXG4iKTsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgIH0NCg0KICAgIC8vIFdpZmkgaW5pdA0KICAgIEFtdF9XaWZpX0luaXQoKTsNCiAgICBnX2FtdF9pTXNnSGFuZGxlID0gbXNnZ2V0KE1PRFVMRV9JRF9BTVQsIElQQ19DUkVBVHwwNjAwKTsNCiAgICBpZigtMSA9PSBnX2FtdF9pTXNnSGFuZGxlKSANCiAgICB7DQogICAJICAgIEFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBjYW4gbm90IGNyZWF0ZSBtc2cgcXVldWUgZm9yIEFNVCFcbiIsIF9fRlVOQ1RJT05fXyk7DQoJICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBwdGhyZWFkX3QgbXNnX3JlY3ZfdGhyZWFkOw0KICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmbXNnX3JlY3ZfdGhyZWFkLCBOVUxMLCBSZWN2TXNnRnJvbUFwcFRocmVhZCwgTlVMTCkgIT0gMCkNCiAgICB7DQogICAJIEFtdFByaW50ZihBTVRfRVJST1IgIkZhaWxlZCB0byBjcmVhdGUgUmVjdk1zZ0Zyb21BcHBUaHJlYWQgdGhyZWFkIVxuIik7DQogICAgICAgICByZXR1cm4gLTE7DQogICAgfQ0KICAgIC8vIG1hbGxvYyByZWNlaXZlIGJ1ZmZlcg0KICAgIGNoYXIgKnJlY2VpdmVfYnVmZmVyID0gbWFsbG9jKE1BWF9QQUNLRVRfTEVOR1RIKTsNCiAgICBpZiAocmVjZWl2ZV9idWZmZXIgPT0gTlVMTCkNCiAgICB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiAgICBpbnQgcmV0ID0gLTE7DQogICAgaW50IHJlYWRfbGVuID0gMDsNCiAgICBmZF9zZXQgdG1wZmRzOw0KDQoJcmV0ID0gY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfTlZST0ZTLCAxKTsNCglpZihyZXQgIT0gQ1BOVl9PSykNCgl7DQoJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0ciBSVyBudnJvZnMgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJZnJlZShyZWNlaXZlX2J1ZmZlcik7DQoJCXJldHVybiAtMTsNCgl9DQoJZWxzZQ0KCXsNCgkgICAgQW10UHJpbnRmKEFNVF9JTkZPIiVzOiBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0ciBSVyBudnJvZnMgb2shXG4iLCBfX0ZVTkNUSU9OX18pOw0KCX0NCg0KCS8vvNPU2GFpYzg4MDC5zLz+DQogICAgLy8gQ3JlYXRlIGxvYWQgd2lmaSBmaXJtd2FyZSB0aHJlYWQNCiAgICBwdGhyZWFkX3QgbG9hZF93aWZpX2Zpcm13YXJlX3RocmVhZDsNCiAgICBpZiAocHRocmVhZF9jcmVhdGUoJmxvYWRfd2lmaV9maXJtd2FyZV90aHJlYWQsIE5VTEwsIExvYWRXaWZpRmlybXdhcmVUaHJlYWQsIE5VTEwpICE9IDApDQogICAgew0KICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJGYWlsZWQgdG8gY3JlYXRlIGxvYWQgd2lmaSBmaXJtd2FyZSB0aHJlYWQhXG4iKTsNCgkJZnJlZShyZWNlaXZlX2J1ZmZlcik7DQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCgkjaWYgMA0KCSNpZiAoZGVmaW5lZChfX0FJQ184ODAwRFdfQ0hJUF9fKSkNCglyZXQgPSB3aWZpX2lvY3RsX2hhbmRsZSgzKTsgLy+809TYsuLK1LnMvP4NCglpZihyZXQgPCAwKQ0KCXsNCgkJQW10UHJpbnRmKEFNVF9FUlJPUiAiJXM6IGxvYWQgQUlDXzg4MDBEVyBmaXJtd2FyZSBmYWlsISByZXQ9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7DQoJfQ0KICAgIGVsc2UNCgl7DQoJCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGxvYWQgQUlDXzg4MDBEVyBmaXJtd2FyZSBzdWNjZXNzISByZXQ9JWQuXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7DQoJfQ0KCSNlbmRpZg0KCSNlbmRpZg0KDQoJZ19hbXRfYXRfbW9kZSA9IGlzX2FtdF9hdG1vZGUoKTsNCglBbXRQcmludGYoQU1UX0lORk8iJXM6IGdfYW10X2F0X21vZGU9JWRcbiIsIF9fRlVOQ1RJT05fXyxnX2FtdF9hdF9tb2RlKTsNCg0KICAgIHdoaWxlICgxKQ0KICAgIHsNCiAgICAgICAgdG1wZmRzID0gZ19hbXRfZmRzcmVhZDsNCiAgICAgICAgcmV0ID0gc2VsZWN0KGdfYW10X2ZkX21heCwgJnRtcGZkcywgTlVMTCwgTlVMTCwgTlVMTCk7DQogICAgICAgIGlmIChyZXQgPD0gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9FUlJPUiAic2VsZWN0IGVycm9yOiAlcyFcbiIsIHN0cmVycm9yKGVycm5vKSk7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChnX2FtdF9mZF91c2JfaG90cGx1ZyA+PSAwICYmIEZEX0lTU0VUKGdfYW10X2ZkX3VzYl9ob3RwbHVnLCAmdG1wZmRzKSkNCiAgICAgICAgew0KICAgICAgICAgICAgcmVhZF9sZW4gPSBQb3J0UmVjdihnX2FtdF9mZF91c2JfaG90cGx1ZywgKHVuc2lnbmVkIGNoYXIgKilyZWNlaXZlX2J1ZmZlciwgTUFYX1BBQ0tFVF9MRU5HVEggLSAxLCBOT19XQUlUKTsNCgkJCWlmKHJlYWRfbGVuID49IDApDQoJCQkJcmVjZWl2ZV9idWZmZXJbcmVhZF9sZW5dID0gJ1wwJzsNCg0KCQkJLy8gx7/WxtT2vNO94cr4t/ssIHJlYWRfbGVuIDwgTUFYX1BBQ0tFVF9MRU5HVEgNCgkJCXJlY2VpdmVfYnVmZmVyW01BWF9QQUNLRVRfTEVOR1RIIC0gMV0gPSAnXDAnOw0KDQogICAgICAgICAgICBpZiAoc3Ryc3RyKHJlY2VpdmVfYnVmZmVyLCBBTVRfREVURUNUX1VTQl9IT1RSRU1PVkUpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiVVNCIHJlbW92ZSFcbiIpOw0KICAgICAgICAgICAgICAgIHN5c3RlbSgicG93ZXJvZmYiKTsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN0cnN0cihyZWNlaXZlX2J1ZmZlciwgQU1UX0RFVEVDVF9VU0JfT0ZGTElORSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJVU0Igb2ZmbGluZSFcbiIpOw0KDQogICAgICAgICAgICAgICAgaWYgKGdfYW10X2ZkX3VzYiA+PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2xvc2UoZ19hbXRfZmRfdXNiKTsNCiAgICAgICAgICAgICAgICAgICAgY2xyX2ZkKGdfYW10X2ZkX3VzYik7DQogICAgICAgICAgICAgICAgICAgIGdfYW10X2ZkX3VzYiA9IC0xOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN0cnN0cihyZWNlaXZlX2J1ZmZlciwgQU1UX0RFVEVDVF9VU0JfT05MSU5FKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIlVTQiBvbmxpbmUhXG4iKTsNCg0KICAgICAgICAgICAgICAgIGlmIChnX2FtdF9mZF91c2IgPj0gMCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIEFtdFByaW50ZihBTVRfSU5GTyAiYW10IGFscmVhZHkgb3BlbiB1c2IsZG8gbm90aGluZ1xuIik7DQogICAgICAgICAgICAgICAgICAgIC8vY2xvc2UoZ19hbXRfZmRfdXNiKTsNCiAgICAgICAgICAgICAgICAgICAgLy9jbHJfZmQoZ19hbXRfZmRfdXNiKTsNCiAgICAgICAgICAgICAgICAgICAgLy9nX2FtdF9mZF91c2IgPSAtMTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCgkgICAgICAgICAgICAgICAgZ19hbXRfZmRfdXNiID0gaW5pdF91c2JfZGV2aWNlKCk7DQoJICAgICAgICAgICAgICAgIGlmIChnX2FtdF9mZF91c2IgPj0gMCkNCgkgICAgICAgICAgICAgICAgew0KCSAgICAgICAgICAgICAgICAgICAgQW10UHJpbnRmKEFNVF9JTkZPICJnX2FtdF9mZF91c2IgPSAlZC5cbiIsIGdfYW10X2ZkX3VzYik7DQoJICAgICAgICAgICAgICAgICAgICBzZXRfZmQoZ19hbXRfZmRfdXNiKTsNCgkgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChnX2FtdF9mZF9zb2NrZXRfc2VydmVyID49IDAgJiYgRkRfSVNTRVQoZ19hbXRfZmRfc29ja2V0X3NlcnZlciwgJnRtcGZkcykpDQogICAgICAgIHsNCiAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGlhZGRyOw0KICAgICAgICAgICAgaW50IGFkZHJsZW4gPSBzaXplb2YoY2xpYWRkcik7DQoNCiAgICAgICAgICAgIGlmIChnX2FtdF9mZF9zb2NrZXRfY2xpZW50ID49IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2xvc2UoZ19hbXRfZmRfc29ja2V0X2NsaWVudCk7DQogICAgICAgICAgICAgICAgY2xyX2ZkKGdfYW10X2ZkX3NvY2tldF9jbGllbnQpOw0KICAgICAgICAgICAgICAgIGdfYW10X2ZkX3NvY2tldF9jbGllbnQgPSAtMTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKChnX2FtdF9mZF9zb2NrZXRfY2xpZW50ID0gYWNjZXB0KGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIsIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGlhZGRyLCAoc29ja2xlbl90ICopJmFkZHJsZW4pKSA9PSAtMSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICJBY2NlcHQgZmFpbGVkIVxuIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpcCA9IG50b2hsKGNsaWFkZHIuc2luX2FkZHIuc19hZGRyKTsNCiAgICAgICAgICAgICAgICBBbXRQcmludGYoQU1UX0lORk8gIkNvbm5lY3QgZnJvbSAlbHUuJWx1LiVsdS4lbHVcbiIsIChpcD4+MjQpJjB4ZmYsIChpcD4+MTYpJjB4ZmYsIChpcD4+OCkmMHhmZiwgKGlwPj4wKSYweGZmKTsNCiAgICAgICAgICAgICAgICBzZXRfZmQoZ19hbXRfZmRfc29ja2V0X2NsaWVudCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZ19hbXRfZmRfdXNiID49IDAgJiYgRkRfSVNTRVQoZ19hbXRfZmRfdXNiLCAmdG1wZmRzKSkNCiAgICAgICAgew0KICAgICAgICAgICAgZ19hbXRfZmRfY3VycmVudCA9ICZnX2FtdF9mZF91c2I7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoZ19hbXRfZmRfc29ja2V0X2NsaWVudCA+PSAwICYmIEZEX0lTU0VUKGdfYW10X2ZkX3NvY2tldF9jbGllbnQsICZ0bXBmZHMpKQ0KICAgICAgICB7DQogICAgICAgICAgICBnX2FtdF9mZF9jdXJyZW50ID0gJmdfYW10X2ZkX3NvY2tldF9jbGllbnQ7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KDQoJCS8vtsFOVsXQts/Kx7fxyse94s72QVTD/MHut73KvQ0KCQlpZihnX2FtdF9hdF9tb2RlID09IDEpDQoJCXsNCgkJICAgLy+94s72sqK0psDtQVTD/MHuDQoJCSAgIEF0X1JlY2VpdmVEYXRhKCpnX2FtdF9mZF9jdXJyZW50LCByZWNlaXZlX2J1ZmZlciwgTUFYX1BBQ0tFVF9MRU5HVEgpOw0KCQkgICBjb250aW51ZTsNCgkJfQ0KDQogICAgICAgIHJlYWRfbGVuID0gQW10X1JlY2VpdmVEYXRhKCpnX2FtdF9mZF9jdXJyZW50LCAodW5zaWduZWQgY2hhciAqKXJlY2VpdmVfYnVmZmVyLCBNQVhfUEFDS0VUX0xFTkdUSCk7DQoNCiAgICAgICAgaWYgKHJlYWRfbGVuID4gMCkNCiAgICAgICAgew0KICAgICAgICAgICAgQW10X0NvbXBvc2VBbmRQcm9jZXNzKCh1bnNpZ25lZCBjaGFyICopcmVjZWl2ZV9idWZmZXIsIHJlYWRfbGVuKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChyZWFkX2xlbiA9PSAwKQ0KICAgICAgICB7DQogICAgICAgICAgICBBbXRQcmludGYoQU1UX0VSUk9SICIlczogcmVhZF9sZW4gPSAwLCBjbG9zZSBmZCglZClcbiIsIF9fRlVOQ1RJT05fXywgKmdfYW10X2ZkX2N1cnJlbnQpOw0KICAgICAgICAgICAgY2xvc2UoKmdfYW10X2ZkX2N1cnJlbnQpOw0KICAgICAgICAgICAgY2xyX2ZkKCpnX2FtdF9mZF9jdXJyZW50KTsNCiAgICAgICAgICAgICpnX2FtdF9mZF9jdXJyZW50ID0gLTE7DQogICAgICAgICAgICBnX2FtdF9mZF9jdXJyZW50ID0gTlVMTDsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgLy9zdHJ1Y3QgdGltZXNwZWMgdHM7DQoJCS8vY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7DQoJCS8vQW10UHJpbnRmKEFNVF9JTkZPICJbJThkLiUwM2RdICVzOiBjcG52X0ZzR2NXYWl0IHN0YXJ0LlxuIiwgdHMudHZfc2VjLCB0cy50dl9uc2VjIC8gMTAwMDAwMCxfX0ZVTkNUSU9OX18pOw0KICAgICAgICAvL3Vuc2lnbmVkIGludCBzdGF0dXMgPSBjcG52X0ZzR2NXYWl0KEZTX05WUk9GUyk7DQoJCS8vaWYoc3RhdHVzICE9IENQTlZfT0spDQoJCS8vCUFtdFByaW50ZihBTVRfSU5GTyAiJXM6IGNwbnZfRnNHY1dhaXQgZmFpbCwgZXJyID0gJWQuXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7DQogICAgICAgIC8vZWxzZQ0KICAgICAgICAvL3sNCgkJLy8JY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7DQoJCS8vCUFtdFByaW50ZihBTVRfSU5GTyAiWyU4ZC4lMDNkXSAlczogY3Budl9Gc0djV2FpdCBvay5cbiIsIHRzLnR2X3NlYywgdHMudHZfbnNlYyAvIDEwMDAwMDAsIF9fRlVOQ1RJT05fXyk7DQoJCS8vfQ0KCQkNCiAgICB9DQoNCiAgICBmcmVlKHJlY2VpdmVfYnVmZmVyKTsNCiAgICBwdGhyZWFkX2pvaW4oY3BfcmVhZF90aHJlYWQsIE5VTEwpOw0KI2lmIDENCiAgICBjcG52X0ZzR2NXYWl0KEZTX05WUk9GUyk7DQoJQW10UHJpbnRmKEFNVF9JTkZPICIlczogY3Budl9Gc0djV2FpdCByZXR1cm4uXG4iLCBfX0ZVTkNUSU9OX18pOw0KDQoJcmV0ID0gY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfTlZST0ZTLCAwKTsNCglpZihyZXQgIT0gQ1BOVl9PSykNCgl7DQoJCUFtdFByaW50ZihBTVRfRVJST1IgIiVzOiBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0ciBSTyBudnJvZnMgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsNCgkJcmV0dXJuIC0xOw0KCX0NCiNlbmRpZg0KICAgIGNsb3NlKGdfYW10X2ZkX2NwKTsNCg0KICAgIGlmIChnX2FtdF9mZF91c2IgPj0gMCkNCiAgICB7DQogICAgICAgIGNsb3NlKGdfYW10X2ZkX3VzYik7DQogICAgfQ0KDQogICAgLy9pZiAoZ19hbXRfZmRfdXNiX2hvdHBsdWcgPj0gMCkNCiAgICB7DQogICAgICAgIGNsb3NlKGdfYW10X2ZkX3VzYl9ob3RwbHVnKTsNCiAgICB9DQoNCiAgICBpZiAoZ19hbXRfZmRfc29ja2V0X2NsaWVudCA+PSAwKQ0KICAgIHsNCiAgICAgICAgY2xvc2UoZ19hbXRfZmRfc29ja2V0X2NsaWVudCk7DQogICAgfQ0KDQogICAgaWYgKGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIgPj0gMCkNCiAgICB7DQogICAgICAgIGNsb3NlKGdfYW10X2ZkX3NvY2tldF9zZXJ2ZXIpOw0KICAgIH0NCg0KCSNpZmRlZiBVU0VfQ0FQX1NVUFBPUlQNCgljbG9zZShnX2FtdF9mZF9jYXApOw0KCSNlbmRpZg0KDQogICAgQW10UHJpbnRmKEFNVF9JTkZPICJBTVQgZXhpdCFcbiIpOw0KICAgIHJldHVybiAwOw0KfQ0KDQo=