LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIHNubXB1c20uYwogKgogKiBSb3V0aW5lcyB0byBtYW5pcHVsYXRlIGEgaW5mb3JtYXRpb24gYWJvdXQgYSAidXNlciIgYXMKICogZGVmaW5lZCBieSB0aGUgU05NUC1VU0VSLUJBU0VELVNNLU1JQiBNSUIuCiAqCiAqIEFsbCBmdW5jdGlvbnMgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV8qKCkgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEKICogb3RoZXJ3aXNlLgogKgogKiAhISBUYWIgc3RvcHMgc2V0IHRvIDQgaW4gc29tZSBwYXJ0cyBvZiB0aGlzIGZpbGUuICEhCiAqICAgIChEZXNpZ25hdGVkIG9uIGEgcGVyIGZ1bmN0aW9uLikKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZmRlZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvY29uZmlnX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9hc24xLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2NhbGxiYWNrLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2tleXRvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXB2My5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sY2RfdGltZS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zY2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX3NlY21vZC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wdXNtLmg+CgpvaWQgICAgICAgICAgICAgdXNtTm9BdXRoUHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKb2lkICAgICAgICAgICAgIHVzbUhNQUNNRDVBdXRoUHJvdG9jb2xbMTBdID0KICAgIHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDEsIDIgfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICB1c21ITUFDU0hBMUF1dGhQcm90b2NvbFsxMF0gPQogICAgeyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMSwgMyB9OwpvaWQgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2xbMTBdID0geyAxLCAzLCA2LCAxLCA2LCAzLCAxMCwgMSwgMiwgMSB9OwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKb2lkICAgICAgICAgICAgIHVzbURFU1ByaXZQcm90b2NvbFsxMF0gPSB7IDEsIDMsIDYsIDEsIDYsIDMsIDEwLCAxLCAyLCAyIH07CiNlbmRpZgpvaWQgICAgICAgICAgICAgdXNtQUVTUHJpdlByb3RvY29sWzEwXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMTAsIDEsIDIsIDQgfTsKLyogYmFja3dhcmRzIGNvbXBhdCAqLwpvaWQgICAgICAgICAgICAgKnVzbUFFUzEyOFByaXZQcm90b2NvbCA9IHVzbUFFU1ByaXZQcm90b2NvbDsKCnN0YXRpYyB1X2ludCAgICBkdW1teV9ldGltZSwgZHVtbXlfZWJvb3Q7ICAgICAgIC8qIEZvciBJU0VOR0lORUtOT1dOKCkuICovCgovKgogKiBHbG9iYWxzLgogKi8Kc3RhdGljIHVfaW50ICAgIHNhbHRfaW50ZWdlcjsKI2lmZGVmIEhBVkVfQUVTCnN0YXRpYyB1X2ludCAgICBzYWx0X2ludGVnZXI2NF8xLCBzYWx0X2ludGVnZXI2NF8yOwojZW5kaWYKICAgICAgICAvKgogICAgICAgICAqIDEvMiBvZiBzZWVkIGZvciB0aGUgc2FsdC4gICBDZi4gUkZDMjI3NCwgU2VjdCA4LjEuMS4xLgogICAgICAgICAqLwoKc3RhdGljIHN0cnVjdCB1c21Vc2VyICpub05hbWVVc2VyID0gTlVMTDsKLyoKICogTG9jYWwgc3RvcmFnZSAoTENEKSBvZiB0aGUgZGVmYXVsdCB1c2VyIGxpc3QuCiAqLwpzdGF0aWMgc3RydWN0IHVzbVVzZXIgKnVzZXJMaXN0ID0gTlVMTDsKCi8qCiAqIFByb3RvdHlwZXMKICovCmludAogICAgICAgICAgICAgICAgdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scyhpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9pZCAqIGF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgYXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBwcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHByaXZQcm90b2NvbExlbik7CmludAogICAgICAgICAgICAgICAgdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2xvbmcgZW5naW5lYm9vdHMsIGxvbmcgZW5naW5lX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHRoZVRvdGFsTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBhdXRoUGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBwcml2UGFyYW1zT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCBzaXplX3QgKiBkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sIHNpemVfdCAqIG90c3RsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlcV9sZW4sIHNpemVfdCAqIG1zZ1NlY1Bhcm1MZW4pOwovKgogKiBTZXQgYSBnaXZlbiBmaWVsZCBvZiB0aGUgc2VjU3RhdGVSZWYuCiAqCiAqIEFsbG9jYXRlIDxsZW4+IGJ5dGVzIGZvciB0eXBlIDx0eXBlPiBwb2ludGVkIHRvIGJ5IHJlZi0+PGZpZWxkPi4KICogVGhlbiBjb3B5IGluIDxpdGVtPiBhbmQgcmVjb3JkIGl0cyBsZW5ndGggaW4gcmVmLT48ZmllbGRfbGVuPi4KICoKICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgogKi8KI2RlZmluZSBNQUtFX0VOVFJZKCB0eXBlLCBpdGVtLCBsZW4sIGZpZWxkLCBmaWVsZF9sZW4gKQkJCVwKewkJCQkJCQkJCVwKCWlmIChyZWYgPT0gTlVMTCkJCQkJCQlcCgkJcmV0dXJuIC0xOwkJCQkJCVwKCWlmIChyZWYtPmZpZWxkICE9IE5VTEwpCXsJCQkJCVwKCQlTTk1QX1pFUk8ocmVmLT5maWVsZCwgcmVmLT5maWVsZF9sZW4pOwkJCVwKCQlTTk1QX0ZSRUUocmVmLT5maWVsZCk7CQkJCQlcCgl9CQkJCQkJCQlcCglyZWYtPmZpZWxkX2xlbiA9IDA7CQkJCQkJXAogICAgICAgIGlmIChsZW4gPT0gMCB8fCBpdGVtID09IE5VTEwpIHsJCQkJCVwKCQlyZXR1cm4gMDsJCQkJCQlcCgl9CQkJCQkgCQkJXAoJaWYgKChyZWYtPmZpZWxkID0gKHR5cGUqKSBtYWxsb2MgKGxlbiAqIHNpemVvZih0eXBlKSkpID09IE5VTEwpCVwKCXsJCQkJCQkJCVwKCQlyZXR1cm4gLTE7CQkJCQkJXAoJfQkJCQkJCQkJXAoJCQkJCQkJCQlcCgltZW1jcHkgKHJlZi0+ZmllbGQsIGl0ZW0sIGxlbiAqIHNpemVvZih0eXBlKSk7CQkJXAoJcmVmLT5maWVsZF9sZW4gPSBsZW47CQkJCQkJXAoJCQkJCQkJCQlcCglyZXR1cm4gMDsJCQkJCQkJXAp9CgoKc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoKdXNtX21hbGxvY191c21TdGF0ZVJlZmVyZW5jZSh2b2lkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJldHZhbCA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikKICAgICAgICBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSkpOwoKICAgIHJldHVybiByZXR2YWw7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKCnZvaWQKdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uodm9pZCAqb2xkKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKm9sZF9yZWYgPSAoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICopIG9sZDsKCiAgICBpZiAob2xkX3JlZikgewoKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX25hbWUpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfZW5naW5lX2lkKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX2F1dGhfcHJvdG9jb2wpOwogICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfcHJpdl9wcm90b2NvbCk7CgogICAgICAgIGlmIChvbGRfcmVmLT51c3JfYXV0aF9rZXkpIHsKICAgICAgICAgICAgU05NUF9aRVJPKG9sZF9yZWYtPnVzcl9hdXRoX2tleSwgb2xkX3JlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aCk7CiAgICAgICAgICAgIFNOTVBfRlJFRShvbGRfcmVmLT51c3JfYXV0aF9rZXkpOwogICAgICAgIH0KICAgICAgICBpZiAob2xkX3JlZi0+dXNyX3ByaXZfa2V5KSB7CiAgICAgICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLT51c3JfcHJpdl9rZXksIG9sZF9yZWYtPnVzcl9wcml2X2tleV9sZW5ndGgpOwogICAgICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZi0+dXNyX3ByaXZfa2V5KTsKICAgICAgICB9CgogICAgICAgIFNOTVBfWkVSTyhvbGRfcmVmLCBzaXplb2YoKm9sZF9yZWYpKTsKICAgICAgICBTTk1QX0ZSRUUob2xkX3JlZik7CgogICAgfQoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKSAqLwoKc3RydWN0IHVzbVVzZXIgKgp1c21fZ2V0X3VzZXJMaXN0KHZvaWQpCnsKICAgIHJldHVybiB1c2VyTGlzdDsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfbmFtZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgTUFLRV9FTlRSWShjaGFyLCBuYW1lLCBuYW1lX2xlbiwgdXNyX25hbWUsIHVzcl9uYW1lX2xlbmd0aCk7Cn0KCmludAp1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogZW5naW5lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZW5naW5lX2lkX2xlbikKewogICAgTUFLRV9FTlRSWSh1X2NoYXIsIGVuZ2luZV9pZCwgZW5naW5lX2lkX2xlbiwKICAgICAgICAgICAgICAgdXNyX2VuZ2luZV9pZCwgdXNyX2VuZ2luZV9pZF9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogYXV0aF9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhdXRoX3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIGF1dGhfcHJvdG9jb2wsIGF1dGhfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9wcm90b2NvbCwgdXNyX2F1dGhfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogYXV0aF9rZXksIHNpemVfdCBhdXRoX2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBhdXRoX2tleSwgYXV0aF9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfYXV0aF9rZXksIHVzcl9hdXRoX2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9wcml2X3Byb3RvY29sKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogcHJpdl9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcml2X3Byb3RvY29sX2xlbikKewogICAgTUFLRV9FTlRSWShvaWQsIHByaXZfcHJvdG9jb2wsIHByaXZfcHJvdG9jb2xfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9wcm90b2NvbCwgdXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKTsKfQoKaW50CnVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogcHJpdl9rZXksIHNpemVfdCBwcml2X2tleV9sZW4pCnsKICAgIE1BS0VfRU5UUlkodV9jaGFyLCBwcml2X2tleSwgcHJpdl9rZXlfbGVuLAogICAgICAgICAgICAgICB1c3JfcHJpdl9rZXksIHVzcl9wcml2X2tleV9sZW5ndGgpOwp9CgppbnQKdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICpyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNfbGV2ZWwpCnsKICAgIGlmIChyZWYgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICByZWYtPnVzcl9zZWNfbGV2ZWwgPSBzZWNfbGV2ZWw7CiAgICByZXR1cm4gMDsKfQoKaW50CnVzbV9jbG9uZV91c21TdGF0ZVJlZmVyZW5jZShzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmZyb20sIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKnRvKQp7CiAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKmNsb25lZF91c21TdGF0ZVJlZjsKCiAgICBpZiAoZnJvbSA9PSBOVUxMIHx8IHRvID09IE5VTEwpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICp0byA9IHVzbV9tYWxsb2NfdXNtU3RhdGVSZWZlcmVuY2UoKTsKICAgIGNsb25lZF91c21TdGF0ZVJlZiA9ICp0bzsKCiAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lKGNsb25lZF91c21TdGF0ZVJlZiwgZnJvbS0+dXNyX25hbWUsIGZyb20tPnVzcl9uYW1lX2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2VuZ2luZV9pZChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9lbmdpbmVfaWQsIGZyb20tPnVzcl9lbmdpbmVfaWRfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbChjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX3Byb3RvY29sLCBmcm9tLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9hdXRoX2tleShjbG9uZWRfdXNtU3RhdGVSZWYsIGZyb20tPnVzcl9hdXRoX2tleSwgZnJvbS0+dXNyX2F1dGhfa2V5X2xlbmd0aCkgfHwKICAgICAgICB1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX3ByaXZfcHJvdG9jb2woY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9wcm90b2NvbCwgZnJvbS0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoKSB8fAogICAgICAgIHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3JfcHJpdl9rZXksIGZyb20tPnVzcl9wcml2X2tleV9sZW5ndGgpIHx8CiAgICAgICAgdXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoY2xvbmVkX3VzbVN0YXRlUmVmLCBmcm9tLT51c3Jfc2VjX2xldmVsKSkKICAgIHsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqdG8pOwogICAgICAgICp0byA9IE5VTEw7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwoKfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBlbWVyZ2VuY3lfcHJpbnQKICoKICogUGFyYW1ldGVyczoKICoJKmZpZWxkCiAqCSBsZW5ndGgKICogICAgICAKICoJVGhpcyBpcyBhIHByaW50IHJvdXRpbmUgdGhhdCBpcyBzb2xlbHkgaW5jbHVkZWQgc28gdGhhdCBpdCBjYW4gYmUKICoJdXNlZCBpbiBnZGIuICBEb24ndCB1c2UgaXQgYXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBwdWxsZWQgYmVmb3JlCiAqCWEgcmVhbCByZWxlYXNlIG9mIHRoZSBjb2RlLgogKgogKgl0YWIgc3RvcCA0CiAqCiAqCVhYWCBmZmx1c2goKSBvbmx5IHdvcmtzIG9uIEZyZWVCU0Q7IGNvcmUgZHVtcHMgb24gU3VuIE9TJ3MKICovCnZvaWQKZW1lcmdlbmN5X3ByaW50KHVfY2hhciAqIGZpZWxkLCB1X2ludCBsZW5ndGgpCnsKICAgIGludCAgICAgICAgICAgICBpaW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHN0b3AgPSAyNTsKCiAgICB3aGlsZSAoc3RhcnQgPCBzdG9wKSB7CiAgICAgICAgZm9yIChpaW5kZXggPSBzdGFydDsgaWluZGV4IDwgc3RvcDsgaWluZGV4KyspCiAgICAgICAgICAgIHByaW50ZigiJTAyWCAiLCBmaWVsZFtpaW5kZXhdKTsKCiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIHN0YXJ0ID0gc3RvcDsKICAgICAgICBzdG9wID0gc3RvcCArIDI1IDwgbGVuZ3RoID8gc3RvcCArIDI1IDogbGVuZ3RoOwogICAgfQogICAgZmZsdXNoKDApOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZW1lcmdlbmN5X3ByaW50KCkgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9pbnRfbGVuZ3RoCiAqCiAqIFBhcmFtZXRlcnM6CiAqCXR5cGUJKFVOVVNFRCkKICoJbnVtYmVyCiAqCWxlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglOdW1iZXIgb2YgYnl0ZXMgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZSBBU04uMSBlbmNvZGVkIHZhbHVlIG9mICdudW1iZXInLgogKgogKgogKglUaGlzIGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgQVNOLjEgZW5jb2RlciAoaW4gYXNuMS5jKSB3aWxsCiAqCXVzZSB0byBlbmNvZGUgYSBwYXJ0aWN1bGFyIGludGVnZXIgdmFsdWUuCiAqCiAqCVJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgaW50ZWdlciAtLSBOT1QgVEhFIEhFQURFUiEKICoKICoJRG8gdGhpcyB0aGUgc2FtZSB3YXkgYXMgYXNuX2J1aWxkX2ludCgpLi4uCiAqLwppbnQKYXNuX3ByZWRpY3RfaW50X2xlbmd0aChpbnQgdHlwZSwgbG9uZyBudW1iZXIsIHNpemVfdCBsZW4pCnsKICAgIHJlZ2lzdGVyIHVfbG9uZyBtYXNrOwoKCiAgICBpZiAobGVuICE9IHNpemVvZihsb25nKSkKICAgICAgICByZXR1cm4gLTE7CgogICAgbWFzayA9ICgodV9sb25nKSAweDFGRikgPDwgKCg4ICogKHNpemVvZihsb25nKSAtIDEpKSAtIDEpOwogICAgLyoKICAgICAqIG1hc2sgaXMgMHhGRjgwMDAwMCBvbiBhIGJpZy1lbmRpYW4gbWFjaGluZSAKICAgICAqLwoKICAgIHdoaWxlICgoKChudW1iZXIgJiBtYXNrKSA9PSAwKSB8fCAoKG51bWJlciAmIG1hc2spID09IG1hc2spKQogICAgICAgICAgICYmIGxlbiA+IDEpIHsKICAgICAgICBsZW4tLTsKICAgICAgICBudW1iZXIgPDw9IDg7CiAgICB9CgogICAgcmV0dXJuIGxlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBhc25fcHJlZGljdF9sZW5ndGgKICoKICogUGFyYW1ldGVyczoKICoJIHR5cGUKICoJKnB0cgogKgkgdV9jaGFyX2xlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglMZW5ndGggaW4gYnl0ZXM6CTEgKyA8bj4gKyA8dV9jaGFyX2xlbj4sIHdoZXJlCiAqCiAqCQkxCQlGb3IgdGhlIEFTTi4xIHR5cGUuCiAqCQk8bj4JCSMgb2YgYnl0ZXMgdG8gc3RvcmUgbGVuZ3RoIG9mIGRhdGEuCiAqCQk8dV9jaGFyX2xlbj4JTGVuZ3RoIG9mIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFTTi4xIHR5cGUuCiAqCiAqCVRoaXMgZ2l2ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBBU04uMSBlbmNvZGVyIChpbiBhc24xLmMpIHdpbGwKICoJdXNlIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgaW50ZWdlciB2YWx1ZS4gIFRoaXMgaXMgYXMgYnJva2VuIGFzIHRoZQogKgljdXJyZW50bHkgdXNlZCBlbmNvZGVyLgogKgogKiBYWFgJSG93IGlzIDxuPiBjaG9zZW4sIGV4YWN0bHk/PwogKi8KaW50CmFzbl9wcmVkaWN0X2xlbmd0aChpbnQgdHlwZSwgdV9jaGFyICogcHRyLCBzaXplX3QgdV9jaGFyX2xlbikKewoKICAgIGlmICh0eXBlICYgQVNOX1NFUVVFTkNFKQogICAgICAgIHJldHVybiAxICsgMyArIHVfY2hhcl9sZW47CgogICAgaWYgKHR5cGUgJiBBU05fSU5URUdFUikgewogICAgICAgIHVfbG9uZyAgICAgICAgICB2YWx1ZTsKICAgICAgICBtZW1jcHkoJnZhbHVlLCBwdHIsIHVfY2hhcl9sZW4pOwogICAgICAgIHVfY2hhcl9sZW4gPSBhc25fcHJlZGljdF9pbnRfbGVuZ3RoKHR5cGUsIHZhbHVlLCB1X2NoYXJfbGVuKTsKICAgIH0KCiAgICBpZiAodV9jaGFyX2xlbiA8IDB4ODApCiAgICAgICAgcmV0dXJuIDEgKyAxICsgdV9jaGFyX2xlbjsKICAgIGVsc2UgaWYgKHVfY2hhcl9sZW4gPCAweEZGKQogICAgICAgIHJldHVybiAxICsgMiArIHVfY2hhcl9sZW47CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIDEgKyAzICsgdV9jaGFyX2xlbjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGFzbl9wcmVkaWN0X2xlbmd0aCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fY2FsY19vZmZzZXRzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCiAqCVRoaXMgcm91dGluZSBjYWxjdWxhdGVzIHRoZSBvZmZzZXRzIGludG8gYW4gb3V0Z29pbmcgbWVzc2FnZSBidWZmZXIKICoJZm9yIHRoZSBuZWNlc3NhcnkgdmFsdWVzLiAgVGhlIG91dGdvaW5nIGJ1ZmZlciB3aWxsIGdlbmVyaWNhbGx5CiAqCWxvb2sgbGlrZSB0aGlzOgogKgogKglTTk1QdjMgTWVzc2FnZQogKglTRVEgbGVuWzExXQogKgkJSU5UIGxlbiB2ZXJzaW9uCiAqCUhlYWRlcgogKgkJU0VRIGxlbgogKgkJCUlOVCBsZW4gTXNnSUQKICoJCQlJTlQgbGVuIG1zZ01heFNpemUKICoJCQlPU1QgbGVuIG1zZ0ZsYWdzIChPU1QgPSBPQ1RFVCBTVFJJTkcpCiAqCQkJSU5UIGxlbiBtc2dTZWN1cml0eU1vZGVsCiAqCU1zZ1NlY3VyaXR5UGFyYW1ldGVycwogKgkJWzFdIE9TVCBsZW5bMl0KICoJCQlTRVEgbGVuWzNdCiAqCQkJCU9TVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlECiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzCiAqCQkJCUlOVCBsZW4gbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUKICoJCQkJT1NUIGxlbiBtc2dVc2VyTmFtZQogKgkJCQlPU1QgbGVuWzRdIFs1XSBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMKICoJCQkJT1NUIGxlbls2XSBbN10gbXNnUHJpdmFjeVBhcmFtZXRlcnMKICoJTXNnRGF0YQogKgkJWzhdIE9TVCBsZW5bOV0gWzEwXSBlbmNyeXB0ZWRQRFUKICoJCW9yCiAqCQlbOCwxMF0gU0VRVUVOQ0UgbGVuWzldIHNjb3BlZFBEVQogKglbMTJdCiAqCiAqCVRoZSBicmFja2V0ZWQgcG9pbnRzIHdpbGwgYmUgbmVlZGVkIHRvIGJlIGlkZW50aWZpZWQgKFt4XSBpcyBhbiBpbmRleAogKgl2YWx1ZSwgbGVuW3hdIG1lYW5zIGEgbGVuZ3RoIHZhbHVlKS4gIEhlcmUgaXMgYSBzZW1hbnRpYyBndWlkZSB0byB0aGVtOgogKgogKglbMV0gPSBnbG9iYWxEYXRhTGVuIChpbnB1dCkKICoJWzJdID0gb3RzdGxlbgogKglbM10gPSBzZXFfbGVuCiAqCVs0XSA9IG1zZ0F1dGhQYXJtTGVuIChtYXkgYmUgMCBvciAxMikKICoJWzVdID0gYXV0aFBhcmFtc09mZnNldAogKglbNl0gPSBtc2dQcml2UGFybUxlbiAobWF5IGJlIDAgb3IgOCkKICoJWzddID0gcHJpdlBhcmFtc09mZnNldAogKglbOF0gPSBnbG9iYWxEYXRhTGVuICsgbXNnU2VjUGFybUxlbgogKglbOV0gPSBkYXRhbGVuCiAqCVsxMF0gPSBkYXRhT2Zmc2V0CiAqCVsxMV0gPSB0aGVUb3RhbExlbmd0aCAtIHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBpdHNlbGYKICoJWzEyXSA9IHRoZVRvdGFsTGVuZ3RoCiAqLwppbnQKdXNtX2NhbGNfb2Zmc2V0cyhzaXplX3QgZ2xvYmFsRGF0YUxlbiwgIC8qIFNOTVB2M01lc3NhZ2UgKyBIZWFkZXJEYXRhICovCiAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCBzaXplX3Qgc2VjRW5naW5lSURMZW4sIHNpemVfdCBzZWNOYW1lTGVuLCBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgIC8qIEFuIEJFUiBlbmNvZGVkIHNlcXVlbmNlLiAqLwogICAgICAgICAgICAgICAgIHVfbG9uZyBlbmdpbmVib290cywgICAgLyogWFhYIChhc24xLmMgd29ya3MgaW4gbG9uZywgbm90IGludC4pICovCiAgICAgICAgICAgICAgICAgbG9uZyBlbmdpbmVfdGltZSwgICAgICAvKiBYWFggKGFzbjEuYyB3b3JrcyBpbiBsb25nLCBub3QgaW50LikgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiB0aGVUb3RhbExlbmd0aCwgICAgICAgLyogZ2xvYmFsRGF0YUxlbiArIG1zZ1NlY3VyaXR5UC4gKyBtc2dEYXRhICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogYXV0aFBhcmFtc09mZnNldCwgICAgIC8qIERpc3RhbmNlIHRvIGF1dGggYnl0ZXMuICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIHByaXZQYXJhbXNPZmZzZXQsICAgICAvKiBEaXN0YW5jZSB0byBwcml2IGJ5dGVzLiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBkYXRhT2Zmc2V0LCAgIC8qIERpc3RhbmNlIHRvIHNjb3BlZFBkdSBTRVEgIC1vci0gIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjcnlwdGVkIChkYXRhKSBwb3J0aW9uIG9mIG1zZ0RhdGEuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogZGF0YWxlbiwgICAgICAvKiBTaXplIG9mIG1zZ0RhdGEgT0NURVQgU1RSSU5HIGVuY29kaW5nLiAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dBdXRoUGFybUxlbiwgICAgICAgLyogU2l6ZSBvZiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogbXNnUHJpdlBhcm1MZW4sICAgICAgIC8qIFNpemUgb2YgbXNnUHJpdmFjeVBhcmFtZXRlcnMuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHNpemVfdCAqIG90c3RsZW4sICAgICAgLyogU2l6ZSBvZiBtc2dTZWN1cml0eVAuIE8uUy4gZW5jb2RpbmcuICAgICovCiAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VxX2xlbiwgICAgICAvKiBTaXplIG9mIG1zZ1NlY3VyaXR5UC4gU0VRIGRhdGEuICAgICAgICAgKi8KICAgICAgICAgICAgICAgICBzaXplX3QgKiBtc2dTZWNQYXJtTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpemUgb2YgbXNnU2VjdXJpdHlQLiBTRVEuICAgICAgICAgICAgICAqLwogICAgaW50ICAgICAgICAgICAgIGVuZ0lEbGVuLCAgIC8qIFNpemVzIG9mIE9DVEVUIFNUUklORyBhbmQgU0VRIGVuY29kaW5ncyAqLwogICAgICAgICAgICAgICAgICAgIGVuZ0J0bGVuLCAgIC8qICAgZm9yIGZpZWxkcyB3aXRoaW4gICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGVuZ1RtbGVuLCAgIC8qICAgbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHBvcnRpb24gb2YgICAgICAqLwogICAgICAgICAgICAgICAgICAgIG5hbWVsZW4sICAgIC8qICAgU05NUHYzTWVzc2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGF1dGhsZW4sIHByaXZsZW47CgogICAgLyoKICAgICAqIElmIGRvaW5nIGF1dGhlbnRpY2F0aW9uLCBtc2dBdXRoUGFybUxlbiA9IDEyIGVsc2UgbXNnQXV0aFBhcm1MZW4gPSAwLgogICAgICogSWYgZG9pbmcgZW5jcnlwdGlvbiwgICAgIG1zZ1ByaXZQYXJtTGVuID0gOCAgZWxzZSBtc2dQcml2UGFybUxlbiA9IDAuCiAgICAgKi8KICAgICptc2dBdXRoUGFybUxlbiA9IChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgICAgICAgICAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpID8gMTIgOiAwOwoKICAgICptc2dQcml2UGFybUxlbiA9IChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgPyA4IDogMDsKCgogICAgLyoKICAgICAqIENhbGN1bGF0ZSBsZW5ndGhzLgogICAgICovCiAgICBpZiAoKGVuZ0lEbGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNlY0VuZ2luZUlETGVuKSkgPT0gLTEpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKChlbmdCdGxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSAmIGVuZ2luZWJvb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKGVuZ1RtbGVuID0gYXNuX3ByZWRpY3RfbGVuZ3RoKEFTTl9JTlRFR0VSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopICYgZW5naW5lX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSkpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgobmFtZWxlbiA9IGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNlY05hbWVMZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKGF1dGhsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqbXNnQXV0aFBhcm1MZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKHByaXZsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqbXNnUHJpdlBhcm1MZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAqc2VxX2xlbiA9CiAgICAgICAgZW5nSURsZW4gKyBlbmdCdGxlbiArIGVuZ1RtbGVuICsgbmFtZWxlbiArIGF1dGhsZW4gKyBwcml2bGVuOwoKICAgIGlmICgoKm90c3RsZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX1NFUVVFTkNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAqc2VxX2xlbikpID09IC0xKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmICgoKm1zZ1NlY1Bhcm1MZW4gPSBhc25fcHJlZGljdF9sZW5ndGgoQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKm90c3RsZW4pKSA9PSAtMSkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAqYXV0aFBhcmFtc09mZnNldCA9IGdsb2JhbERhdGFMZW4gKyArKCptc2dTZWNQYXJtTGVuIC0gKnNlcV9sZW4pCiAgICAgICAgKyBlbmdJRGxlbiArIGVuZ0J0bGVuICsgZW5nVG1sZW4gKyBuYW1lbGVuCiAgICAgICAgKyAoYXV0aGxlbiAtICptc2dBdXRoUGFybUxlbik7CgogICAgKnByaXZQYXJhbXNPZmZzZXQgPSAqYXV0aFBhcmFtc09mZnNldCArICptc2dBdXRoUGFybUxlbgogICAgICAgICsgKHByaXZsZW4gLSAqbXNnUHJpdlBhcm1MZW4pOwoKCiAgICAvKgogICAgICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgcGxhaW50ZXh0LiAgUm91bmQgdXAgdG8gYWNjb3VudCBmb3IgY2lwaGVyCiAgICAgKiBibG9jayBzaXplLCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogWFhYICBUaGlzIGlzIGhhcmR3aXJlZCBmb3IgMURFUy4uLiBJZiBzY29wZWRQZHVMZW4gaXMgYWxyZWFkeQogICAgICogICAgICBhIG11bHRpcGxlIG9mIDgsIHRoZW4gKmFkZCogOCBtb3JlOyBvdGhlcndpc2UsIHJvdW5kIHVwCiAgICAgKiAgICAgIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDguCiAgICAgKgogICAgICogRklYICBDYWxjdWxhdGlvbiBvZiBlbmNyeXB0ZWQgcG9ydGlvbiBvZiBtc2dEYXRhIGFuZCBjb25zZXF1ZW50CiAgICAgKiAgICAgIHNldHRpbmcgYW5kIHNhbml0eSBjaGVja2luZyBvZiB0aGVUb3RhbExlbmd0aCwgZXQgYWwuIHNob3VsZAogICAgICogICAgICBvY2N1ciAqYWZ0ZXIqIGVuY3J5cHRpb24gaGFzIHRha2VuIHBsYWNlLgogICAgICovCiAgICBpZiAoc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBzY29wZWRQZHVMZW4gPSBST1VORFVQOChzY29wZWRQZHVMZW4pOwoKICAgICAgICBpZiAoKCpkYXRhbGVuID0KICAgICAgICAgICAgIGFzbl9wcmVkaWN0X2xlbmd0aChBU05fT0NURVRfU1RSLCBOVUxMLCBzY29wZWRQZHVMZW4pKSA9PSAtMSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAqZGF0YWxlbiA9IHNjb3BlZFBkdUxlbjsKICAgIH0KCiAgICAqZGF0YU9mZnNldCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArCiAgICAgICAgKCpkYXRhbGVuIC0gc2NvcGVkUGR1TGVuKTsKICAgICp0aGVUb3RhbExlbmd0aCA9IGdsb2JhbERhdGFMZW4gKyAqbXNnU2VjUGFybUxlbiArICpkYXRhbGVuOwoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NhbGNfb2Zmc2V0cygpICovCgoKCgoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfc2FsdAogKgogKiBQYXJhbWV0ZXJzOgogKgkqaXYJCSAgKE8pICAgQnVmZmVyIHRvIGNvbnRhaW4gSVYuCiAqCSppdl9sZW5ndGgJICAoTykgICBMZW5ndGggb2YgaXYuCiAqCSpwcml2X3NhbHQJICAoSSkgICBTYWx0IHBvcnRpb24gb2YgcHJpdmF0ZSBrZXkuCiAqCSBwcml2X3NhbHRfbGVuZ3RoIChJKSAgIExlbmd0aCBvZiBwcml2X3NhbHQuCiAqCSptc2dTYWx0CSAgKEkvTykgUG9pbnRlciBzYWx0IHBvcnRpb24gb2Ygb3V0Z29pbmcgbXNnIGJ1ZmZlci4KICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCURldGVybWluZSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGZvciB0aGUgREVTLUNCQyBlbmNyeXB0aW9uLgogKgkoQ2YuIFJGQyAyMjc0LCA4LjEuMS4xLikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cyBhbmQgdGhlCiAqCQlzYWx0IGludGVnZXIuCiAqCVRoZSBzYWx0IGludGVnZXIgaXMgaW5jcmVtZW50ZWQuCiAqCVRoZSByZXN1bHRpbmcgc2FsdCBpcyBjb3BpZWQgaW50byB0aGUgbXNnU2FsdCBidWZmZXIuCiAqCVRoZSByZXN1bHQgb2YgdGhlIGNvbmNhdGVuYXRpb24gaXMgdGhlbiBYT1JlZCB3aXRoIHRoZSBzYWx0CiAqCQlwb3J0aW9uIG9mIHRoZSBwcml2YXRlIGtleSAobGFzdCA4IGJ5dGVzKS4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfc2FsdCh1X2NoYXIgKiBpdiwKICAgICAgICAgICAgIHNpemVfdCAqIGl2X2xlbmd0aCwKICAgICAgICAgICAgIHVfY2hhciAqIHByaXZfc2FsdCwgc2l6ZV90IHByaXZfc2FsdF9sZW5ndGgsIHVfY2hhciAqIG1zZ1NhbHQpCnsKICAgIHNpemVfdCAgICAgICAgICBwcm9wZXJzaXplX3NhbHQgPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgIGludCAgICAgICAgICAgICBuZXRfYm9vdHM7CiAgICBpbnQgICAgICAgICAgICAgbmV0X3NhbHRfaW50OwogICAgLyoKICAgICAqIG5ldF8qIHNob3VsZCBiZSBlbmNvZGVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4gIFhYWCAgV2h5PwogICAgICovCiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwoKCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiAgICBpZiAoIWl2IHx8ICFpdl9sZW5ndGggfHwgIXByaXZfc2FsdCB8fCAoKml2X2xlbmd0aCAhPSBwcm9wZXJzaXplX3NhbHQpCiAgICAgICAgfHwgKHByaXZfc2FsdF9sZW5ndGggPCBwcm9wZXJzaXplX3NhbHQpKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKCiAgICBuZXRfYm9vdHMgPSBodG9ubChzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCkpOwogICAgbmV0X3NhbHRfaW50ID0gaHRvbmwoc2FsdF9pbnRlZ2VyKTsKCiAgICBzYWx0X2ludGVnZXIgKz0gMTsKCiAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIHByb3BlcnNpemVfc2FsdCAvIDIpOwogICAgbWVtY3B5KGl2ICsgKHByb3BlcnNpemVfc2FsdCAvIDIpLCAmbmV0X3NhbHRfaW50LCBwcm9wZXJzaXplX3NhbHQgLyAyKTsKCiAgICBpZiAobXNnU2FsdCkKICAgICAgICBtZW1jcHkobXNnU2FsdCwgaXYsIHByb3BlcnNpemVfc2FsdCk7CgoKICAgIC8qCiAgICAgKiBUdXJuIHRoZSBzYWx0IGludG8gYW4gSVY6IFhPUiA8Ym9vdHMsIHNhbHRfaW50PiB3aXRoIHNhbHQKICAgICAqIHBvcnRpb24gb2YgcHJpdl9rZXkuCiAgICAgKi8KICAgIGZvciAoaWluZGV4ID0gMDsgaWluZGV4IDwgKGludCkgcHJvcGVyc2l6ZV9zYWx0OyBpaW5kZXgrKykKICAgICAgICBpdltpaW5kZXhdIF49IHByaXZfc2FsdFtpaW5kZXhdOwoKCiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9zZXRfc2FsdCgpICovCiNlbmRpZgoKI2lmZGVmIEhBVkVfQUVTCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9zZXRfYWVzX2l2CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSppdgkJICAoTykgICBCdWZmZXIgdG8gY29udGFpbiBJVi4KICoJKml2X2xlbmd0aAkgIChPKSAgIExlbmd0aCBvZiBpdi4KICogICAgICBuZXRfYm9vdHMgICAgICAgICAoSSkgICB0aGUgbmV0d29yayBieXRlIG9yZGVyIG9mIHRoZSBhdXRoRW5nIGJvb3RzIHZhbAogKiAgICAgIG5ldF90aW1lICAgICAgICAgKEkpICAgdGhlIG5ldHdvcmsgYnl0ZSBvcmRlciBvZiB0aGUgYXV0aEVuZyB0aW1lIHZhbAogKiAgICAgICpzYWx0ICAgICAgICAgICAgIChPKSAgIEEgYnVmZmVyIGZvciB0aGUgb3V0Z29pbmcgc2FsdCAoPSA4IGJ5dGVzIG9mIGl2KQogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MsCiAqCS0xCU90aGVyd2lzZS4KICoKICoJRGV0ZXJtaW5lIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgZm9yIEFFUyBlbmNyeXB0aW9uLgogKgkoZHJhZnQtYmx1bWVudGhhbC1hZXMtdXNtLTAzLnR4dCwgMy4xLjIuMikKICoKICoJaXYgaXMgZGVmaW5lZCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBlbmdpbmVCb290cywgZW5naW5lVGltZQogIAlhbmQgYSA2NCBiaXQgc2FsdC1pbnRlZ2VyLgogKglUaGUgNjQgYml0IHNhbHQgaW50ZWdlciBpcyBpbmNyZW1lbnRlZC4KICoJVGhlIHJlc3VsdGluZyBzYWx0IGlzIGNvcGllZCBpbnRvIHRoZSBzYWx0IGJ1ZmZlci4KICoJVGhlIElWIHJlc3VsdCBpcyByZXR1cm5lZCBpbmRpdmlkdWFsbHkgZm9yIGZ1cnRoZXIgdXNlLgogKi8KaW50CnVzbV9zZXRfYWVzX2l2KHVfY2hhciAqIGl2LAogICAgICAgICAgICAgICBzaXplX3QgKiBpdl9sZW5ndGgsCiAgICAgICAgICAgICAgIHVfaW50IG5ldF9ib290cywKICAgICAgICAgICAgICAgdV9pbnQgbmV0X3RpbWUsCiAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQpCnsKICAgIC8qCiAgICAgKiBuZXRfKiBzaG91bGQgYmUgZW5jb2RlZCBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgICAgKi8KICAgIGludCAgICAgICAgICAgICBuZXRfc2FsdF9pbnQxLCBuZXRfc2FsdF9pbnQyOwojZGVmaW5lIFBST1BFUl9BRVNfSVZfU0laRSA2NAoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KICAgIGlmICghaXYgfHwgIWl2X2xlbmd0aCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBuZXRfc2FsdF9pbnQxID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMSk7CiAgICBuZXRfc2FsdF9pbnQyID0gaHRvbmwoc2FsdF9pbnRlZ2VyNjRfMik7CgogICAgaWYgKChzYWx0X2ludGVnZXI2NF8yICs9IDEpID09IDApCiAgICAgICAgc2FsdF9pbnRlZ2VyNjRfMiArPSAxOwogICAgCiAgICAvKiBYWFg6IHdhcm5pbmc6IGhhcmQgY29kZWQgcHJvcGVyIGxlbmd0aHMgKi8KICAgIG1lbWNweShpdiwgJm5ldF9ib290cywgNCk7CiAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgIG1lbWNweShpdis4LCAmbmV0X3NhbHRfaW50MSwgNCk7CiAgICBtZW1jcHkoaXYrMTIsICZuZXRfc2FsdF9pbnQyLCA0KTsKCiAgICBtZW1jcHkoc2FsdCwgaXYrOCwgOCk7IC8qIG9ubHkgY29weSB0aGUgbmVlZGVkIHBvcnRpb24gKi8KICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fc2V0X3NhbHQoKSAqLwojZW5kaWYgLyogSEFWRV9BRVMgKi8KCmludAp1c21fc2VjbW9kX2dlbmVyYXRlX291dF9tc2coc3RydWN0IHNubXBfc2VjbW9kX291dGdvaW5nX3BhcmFtcyAqcGFybXMpCnsKICAgIGlmICghcGFybXMpCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwoKICAgIHJldHVybiB1c21fZ2VuZXJhdGVfb3V0X21zZyhwYXJtcy0+bXNnUHJvY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+bWF4TXNnU2l6ZSwgcGFybXMtPnNlY01vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNjb3BlZFBkdSwgcGFybXMtPnNjb3BlZFBkdUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY1BhcmFtcywgcGFybXMtPnNlY1BhcmFtc0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2csIHBhcm1zLT53aG9sZU1zZ0xlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9nZW5lcmF0ZV9vdXRfbXNnCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJT24gc3VjY2Vzcy4KICoJU05NUEVSUl9VU01fQVVUSEVOVElDQVRJT05GQUlMVVJFCiAqCVNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUgogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRQogKglTTk1QRVJSX1VTTV9HRU5FUklDRVJST1IKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCQogKgogKiBHZW5lcmF0ZXMgYW4gb3V0Z29pbmcgbWVzc2FnZS4KICoKICogWFhYCUJld2FyZSBvZiBtaXNub21lcnMhCiAqLwppbnQKdXNtX2dlbmVyYXRlX291dF9tc2coaW50IG1zZ1Byb2NNb2RlbCwgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIGdsb2JhbERhdGEsICAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gbXNnIGhlYWRlciBkYXRhIHdpbGwgcG9pbnQgdG8gdGhlIGJlZ2lubmluZwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBlbnRpcmUgcGFja2V0IGJ1ZmZlciB0byBiZSB0cmFuc21pdHRlZCBvbiB3aXJlLAogICAgICAgICAgICAgICAgICAgICAgKiAqIG1lbW9yeSB3aWxsIGJlIGNvbnRpZ3VvdXMgd2l0aCBzZWNQYXJhbXMsIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoaXMgcG9pbnRlciB3aWxsIGJlIHBhc3NlZCBiYWNrIGFzIGJlZ2lubmluZyBvZgogICAgICAgICAgICAgICAgICAgICAgKiAqIHdob2xlTXNnIGJlbG93LiAgYXNuIHNlcS4gbGVuZ3RoIGlzIHVwZGF0ZWQgdy8gbmV3IGxlbmd0aC4KICAgICAgICAgICAgICAgICAgICAgICogKgogICAgICAgICAgICAgICAgICAgICAgKiAqIFdoaWxlIHRoaXMgcG9pbnRzIHRvIGEgYnVmZmVyIHRoYXQgc2hvdWxkIGJlIGJpZyBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgICogKiBmb3IgdGhlIHdob2xlIG1lc3NhZ2UsIG9ubHkgdGhlIGZpcnN0IHR3byBwYXJ0cwogICAgICAgICAgICAgICAgICAgICAgKiAqIG9mIHRoZSBtZXNzYWdlIGFyZSBjb21wbGV0ZWQsIG5hbWVseSBTTk1QdjNNZXNzYWdlIGFuZAogICAgICAgICAgICAgICAgICAgICAgKiAqIEhlYWRlckRhdGEuICBnbG9iYWxEYXRhTGVuIChuZXh0IHBhcmFtZXRlcikgcmVwcmVzZW50cwogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBsZW5ndGggb2YgdGhlc2UgdHdvIGNvbXBsZXRlZCBwYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBnbG9iYWxEYXRhTGVuLCAgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpbnQgbWF4TXNnU2l6ZSwgICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgaW50IHNlY01vZGVsLCAgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY0VuZ2luZUlELCAgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjRW5naW5lSURMZW4sICAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VjTmFtZUxlbiwgLyogSU4gLSBTZWN1cml0eU5hbWUgbGVuZ3RoLiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgICAvKiBJTiAtIEF1dGhOb1ByaXYsIGF1dGhQcml2IGV0Yy4gICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogUG9pbnRlciB0byBzY29wZWRQZHUgd2lsbCBiZSBlbmNyeXB0ZWQgYnkgVVNNIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgKiAqIGFuZCB3cml0dGVuIHRvIHBhY2tldCBidWZmZXIgaW1tZWRpYXRlbHkgZm9sbG93aW5nCiAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgKiAqIFVTTSBpZiBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgICAvKiBJTiAtIHNjb3BlZFBkdSBsZW5ndGguICovCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgKiAqIFJlc3BvbnNlLCBvdGhlcndpc2UgTlVMTC4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNlY1BhcmFtcywgICAgICAgIC8qIE9VVCAqLwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMgcG9pbnRlciB0byBvZmZzZXQgd2l0aGluCiAgICAgICAgICAgICAgICAgICAgICAqICogcGFja2V0IGJ1ZmZlciB3aGVyZSBzZWNQYXJhbXMgc2hvdWxkIGJlIHdyaXR0ZW4sIHRoZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGVudGlyZSBCRVIgZW5jb2RlZCBPQ1RFVCBTVFJJTkcgKGluY2x1ZGluZyBoZWFkZXIpIGlzCiAgICAgICAgICAgICAgICAgICAgICAqICogd3JpdHRlbiBoZXJlIGJ5IFVTTSBzZWNQYXJhbXMgPSBnbG9iYWxEYXRhICsKICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhTGVuLgogICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogc2VjUGFyYW1zTGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAqLwogICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiogd2hvbGVNc2csICAgICAgICAvKiBPVVQgKi8KICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogQ29tcGxldGUgYXV0aGVudGljYXRlZC9lbmNyeXB0ZWQgbWVzc2FnZSAtIHR5cGljYWxseQogICAgICAgICAgICAgICAgICAgICAgKiAqIHRoZSBwb2ludGVyIHRvIHN0YXJ0IG9mIHBhY2tldCBidWZmZXIgcHJvdmlkZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICogKiBnbG9iYWxEYXRhIGlzIHJldHVybmVkIGhlcmUsIGNvdWxkIGFsc28gYmUgYSBzZXBhcmF0ZQogICAgICAgICAgICAgICAgICAgICAgKiAqIGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHdob2xlTXNnTGVuKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOL09VVCAtIExlbiBhdmFpbGFibGUsIGxlbiByZXR1cm5lZC4gKi8KICAgIHNpemVfdCAgICAgICAgICBvdHN0bGVuOwogICAgc2l6ZV90ICAgICAgICAgIHNlcV9sZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnQXV0aFBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnUHJpdlBhcm1MZW47CiAgICBzaXplX3QgICAgICAgICAgbXNnU2VjUGFybUxlbjsKICAgIHNpemVfdCAgICAgICAgICBhdXRoUGFyYW1zT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHByaXZQYXJhbXNPZmZzZXQ7CiAgICBzaXplX3QgICAgICAgICAgZGF0YWxlbjsKICAgIHNpemVfdCAgICAgICAgICBkYXRhT2Zmc2V0OwogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwoKICAgIHVfY2hhciAgICAgICAgICpwdHI7CiAgICBzaXplX3QgICAgICAgICAgcHRyX2xlbjsKICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgb2ZmU2V0OwogICAgdV9pbnQgICAgICAgICAgIGJvb3RzX3VpbnQ7CiAgICB1X2ludCAgICAgICAgICAgdGltZV91aW50OwogICAgbG9uZyAgICAgICAgICAgIGJvb3RzX2xvbmc7CiAgICBsb25nICAgICAgICAgICAgdGltZV9sb25nOwoKICAgIC8qCiAgICAgKiBJbmRpcmVjdGlvbiBiZWNhdXNlIHNlY1N0YXRlUmVmIHZhbHVlcyBvdmVycmlkZSBwYXJhbWV0ZXJzLgogICAgICogCiAgICAgKiBOb25lIG9mIHRoZXNlIGFyZSB0byBiZSBmcmVlJ2QgLSB0aGV5IGFyZSBlaXRoZXIgcG9pbnRpbmcgdG8KICAgICAqIHdoYXQncyBpbiB0aGUgc2VjU3RhdGVSZWYgb3IgdG8gc29tZXRoaW5nIGVpdGhlciBpbiB0aGUKICAgICAqIGFjdHVhbCBwcmFybWV0ZXIgbGlzdCBvciB0aGUgdXNlciBsaXN0LgogICAgICovCgogICAgY2hhciAgICAgICAgICAgKnRoZU5hbWUgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZU5hbWVMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZUVuZ2luZUlEID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlQXV0aEtleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlQXV0aFByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSAwOwogICAgdV9jaGFyICAgICAgICAgKnRoZVByaXZLZXkgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgY29uc3Qgb2lkICAgICAgKnRoZVByaXZQcm90b2NvbCA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0gMDsKICAgIGludCAgICAgICAgICAgICB0aGVTZWNMZXZlbCA9IDA7ICAgIC8qIE5vIGRlZmluZWQgY29uc3QgZm9yIGJhZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdmFsdWUgKG90aGVyIHRoZW4gZXJyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuLlxuIikpOwoKICAgIGlmIChzZWNTdGF0ZVJlZiAhPSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUbyBodXNoIHRoZSBjb21waWxlciBmb3Igbm93LiAgWFhYIAogICAgICAgICAqLwogICAgICAgIHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqcmVmCiAgICAgICAgICAgID0gKHN0cnVjdCB1c21TdGF0ZVJlZmVyZW5jZSAqKSBzZWNTdGF0ZVJlZjsKCiAgICAgICAgdGhlTmFtZSA9IHJlZi0+dXNyX25hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHJlZi0+dXNyX25hbWVfbGVuZ3RoOwogICAgICAgIHRoZUVuZ2luZUlEID0gcmVmLT51c3JfZW5naW5lX2lkOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gcmVmLT51c3JfZW5naW5lX2lkX2xlbmd0aDsKCiAgICAgICAgaWYgKCF0aGVFbmdpbmVJRExlbmd0aCkgewogICAgICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHNlY0VuZ2luZUlETGVuOwogICAgICAgIH0KCiAgICAgICAgdGhlQXV0aFByb3RvY29sID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbDsKICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9hdXRoX3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVBdXRoS2V5ID0gcmVmLT51c3JfYXV0aF9rZXk7CiAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IHJlZi0+dXNyX2F1dGhfa2V5X2xlbmd0aDsKICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSByZWYtPnVzcl9wcml2X3Byb3RvY29sOwogICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHJlZi0+dXNyX3ByaXZfcHJvdG9jb2xfbGVuZ3RoOwogICAgICAgIHRoZVByaXZLZXkgPSByZWYtPnVzcl9wcml2X2tleTsKICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gcmVmLT51c3JfcHJpdl9rZXlfbGVuZ3RoOwogICAgICAgIHRoZVNlY0xldmVsID0gcmVmLT51c3Jfc2VjX2xldmVsOwogICAgfQoKICAgIC8qCiAgICAgKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyKCVzKVxuIiwgc2VjTmFtZSkpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dOU0VDVVJJVFlOQU1FOwogICAgICAgIH0KCiAgICAgICAgdGhlTmFtZSA9IHNlY05hbWU7CiAgICAgICAgdGhlTmFtZUxlbmd0aCA9IHNlY05hbWVMZW47CiAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHNlY0xldmVsOwogICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gc2VjRW5naW5lSURMZW47CiAgICAgICAgaWYgKHVzZXIpIHsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sID0gdXNlci0+YXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPSB1c2VyLT5hdXRoUHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZUF1dGhLZXkgPSB1c2VyLT5hdXRoS2V5OwogICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gdXNlci0+YXV0aEtleUxlbjsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sID0gdXNlci0+cHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSB1c2VyLT5wcml2UHJvdG9jb2xMZW47CiAgICAgICAgICAgIHRoZVByaXZLZXkgPSB1c2VyLT5wcml2S2V5OwogICAgICAgICAgICB0aGVQcml2S2V5TGVuZ3RoID0gdXNlci0+cHJpdktleUxlbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB1bmtub3duIHVzZXJzIGNhbiBub3QgZG8gYXV0aGVudGljYXRpb24gKG9idmlvdXNseSkgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c21Ob0F1dGhQcm90b2NvbDsKICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSAwOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c21Ob1ByaXZQcm90b2NvbDsKICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoID0KICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKTsKICAgICAgICAgICAgdGhlUHJpdktleSA9IE5VTEw7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSAwOwogICAgICAgIH0KICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBzZWNTdGF0ZVJlZj09TlVMTCAqLwoKCiAgICAvKgogICAgICogRnJvbSBoZXJlIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhdm9pZCByZWZlcmVuY2UgdG8KICAgICAqIHNlY05hbWUsIHNlY0VuZ2luZUlELCBzZWNMZXZlbCwgYW5kIGFzc29jaWF0ZWQgbGVuZ3Rocy4KICAgICAqLwoKCiAgICAvKgogICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGNhbiB1c2UgdGhlIHJlcXVlc3RlZCBzZWMgc2VydmljZXMuCiAgICAgKi8KICAgIGlmICh1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzKHRoZVNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdlByb3RvY29sTGVuZ3RoKSA9PSAxKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbnN1cHBvcnRlZCBTZWN1cml0eSBMZXZlbCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIHRoZVNlY0xldmVsKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUw7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFhYWCAgTm8gZXJyb3IgaXMgZGVjbGFyZWQgaW4gdGhlIEVvUCB3aGVuIHNlbmRpbmcgbWVzc2FnZXMgdG8KICAgICAqICAgICAgdW5rbm93biBlbmdpbmVzLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyB3LyBib290cy90aW1lID09ICgwLDApLgogICAgICovCiAgICBpZiAoZ2V0X2VuZ2luZXRpbWUodGhlRW5naW5lSUQsIHRoZUVuZ2luZUlETGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LCBGQUxTRSkgPT0gLTEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGZpbmQgZW5naW5lIGRhdGEuIikpOwogICAgfQoKICAgIGJvb3RzX2xvbmcgPSBib290c191aW50OwogICAgdGltZV9sb25nID0gdGltZV91aW50OwoKCiAgICAvKgogICAgICogU2V0IHVwIHRoZSBPZmZzZXRzLgogICAgICovCiAgICBpZiAodXNtX2NhbGNfb2Zmc2V0cyhnbG9iYWxEYXRhTGVuLCB0aGVTZWNMZXZlbCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVOYW1lTGVuZ3RoLCBzY29wZWRQZHVMZW4sIGJvb3RzX2xvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2xvbmcsICZ0aGVUb3RhbExlbmd0aCwgJmF1dGhQYXJhbXNPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdlBhcmFtc09mZnNldCwgJmRhdGFPZmZzZXQsICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJm1zZ0F1dGhQYXJtTGVuLCAmbXNnUHJpdlBhcm1MZW4sICZvdHN0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgJnNlcV9sZW4sICZtc2dTZWNQYXJtTGVuKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRmFpbGVkIGNhbGN1bGF0aW5nIG9mZnNldHMuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICB9CgogICAgLyoKICAgICAqIFNvLCB3ZSBoYXZlIHRoZSBvZmZzZXRzIGZvciB0aGUgdGhyZWUgcGFydHMgdGhhdCBuZWVkIHRvIGJlCiAgICAgKiBkZXRlcm1pbmVkLCBhbmQgYW4gb3ZlcmFsbCBsZW5ndGguICBOb3cgd2UgbmVlZCB0byBtYWtlCiAgICAgKiBzdXJlIGFsbCBvZiB0aGlzIHdvdWxkIGZpdCBpbiB0aGUgb3V0Z29pbmcgYnVmZmVyLCBhbmQKICAgICAqIHdoZXRoZXIgb3Igbm90IHdlIG5lZWQgdG8gbWFrZSBhIG5ldyBidWZmZXIsIGV0Yy4KICAgICAqLwoKCiAgICAvKgogICAgICogU2V0IHdob2xlTXNnIGFzIGEgcG9pbnRlciB0byBnbG9iYWxEYXRhLiAgU2FuaXR5IGNoZWNrIGZvcgogICAgICogdGhlIHByb3BlciBzaXplLgogICAgICogCiAgICAgKiBNYXJrIHdvcmtzcGFjZSBpbiB0aGUgbWVzc2FnZSB3aXRoIGJ5dGVzIG9mIGFsbCAxJ3MgdG8gbWFrZSBpdAogICAgICogZWFzaWVyIHRvIGZpbmQgbWlzdGFrZXMgaW4gcmF3IG1lc3NhZ2UgZHVtcHMuCiAgICAgKi8KICAgIHB0ciA9ICp3aG9sZU1zZyA9IGdsb2JhbERhdGE7CiAgICBpZiAodGhlVG90YWxMZW5ndGggPiAqd2hvbGVNc2dMZW4pIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk1lc3NhZ2Ugd29uJ3QgZml0IGluIGJ1ZmZlci5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgIH0KCiAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICBtZW1zZXQoJnB0cltnbG9iYWxEYXRhTGVuXSwgMHhGRiwgdGhlVG90YWxMZW5ndGggLSBnbG9iYWxEYXRhTGVuKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogRG8gdGhlIGVuY3J5cHRpb24uCiAgICAgKi8KICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIHNpemVfdCAgICAgICAgICBlbmNyeXB0ZWRfbGVuZ3RoID0gdGhlVG90YWxMZW5ndGggLSBkYXRhT2Zmc2V0OwogICAgICAgIHNpemVfdCAgICAgICAgICBzYWx0X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgICAgIHVfY2hhciAgICAgICAgICBzYWx0W0JZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpXTsKCiAgICAgICAgLyoKICAgICAgICAgKiBYWFggIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5IQogICAgICAgICAqLwojaWZkZWYgSEFWRV9BRVMKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0odGhlUHJpdlByb3RvY29sLCBBRVNQcml2KSkgewogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cltwcml2UGFyYW1zT2Zmc2V0XSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IEFFUyBpdi5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9IAojZW5kaWYKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHRoZVByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8CiAgICAgICAgICAgICAgICAodXNtX3NldF9zYWx0KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleSArIDgsIHRoZVByaXZLZXlMZW5ndGggLSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyW3ByaXZQYXJhbXNPZmZzZXRdKQogICAgICAgICAgICAgICAgID09IC0xKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJDYW4ndCBzZXQgREVTLUNCQyBzYWx0LlxuIikpOwogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgJnB0cltkYXRhT2Zmc2V0XSwgJmVuY3J5cHRlZF9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06IiwKICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBzYWx0X2xlbmd0aCk7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAmcHRyW2RhdGFPZmZzZXRdLCBlbmNyeXB0ZWRfbGVuZ3RoKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAiKndob2xlTXNnOiIsCiAgICAgICAgICAgICAgICAgICAgICAgKndob2xlTXNnLCB0aGVUb3RhbExlbmd0aCk7CiAgICAgICAgfQojZW5kaWYKCgogICAgICAgIHB0ciA9ICp3aG9sZU1zZzsKICAgICAgICBwdHJfbGVuID0gKndob2xlTXNnTGVuID0gdGhlVG90YWxMZW5ndGg7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgU2FuaXR5IGNoZWNrIGZvciBzYWx0IGxlbmd0aCBzaG91bGQgYmUgbW92ZWQgdXAKICAgICAgICAgKiAgICAgIHVuZGVyIHVzbV9jYWxjX29mZnNldHMoKSBvciB0b3NzZWQuCiAgICAgICAgICovCiAgICAgICAgaWYgKChlbmNyeXB0ZWRfbGVuZ3RoICE9ICh0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpKQogICAgICAgICAgICB8fCAoc2FsdF9sZW5ndGggIT0gbXNnUHJpdlBhcm1MZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiZW5jcnlwdGlvbiBsZW5ndGggZXJyb3IuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiRW5jcnlwdGlvbiBzdWNjZXNzZnVsLlxuIikpOwogICAgfQoKICAgIC8qCiAgICAgKiBObyBlbmNyeXB0aW9uIGZvciB5b3UhCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIG1lbWNweSgmcHRyW2RhdGFPZmZzZXRdLCBzY29wZWRQZHUsIHNjb3BlZFBkdUxlbik7CiAgICB9CgoKCiAgICAvKgogICAgICogU3RhcnQgZmlsbGluZyBpbiB0aGUgb3RoZXIgZmllbGRzIChpbiBwcmVwIGZvciBhdXRoZW50aWNhdGlvbikuCiAgICAgKiAKICAgICAqIG9mZlNldCBpcyBhbiBvY3RldCBzdHJpbmcgaGVhZGVyLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSBhbGwKICAgICAqIHRoZSBvdGhlciBoZWFkZXJzLgogICAgICovCiAgICByZW1haW5pbmcgPSBwdHJfbGVuIC0gZ2xvYmFsRGF0YUxlbjsKCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgb3RzdGxlbik7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZSgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksIHNlcV9sZW4pOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBhc25fYnVpbGRfc3RyaW5nKCZwdHJbb2ZmU2V0XSwgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCB0aGVFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMiKTsKICAgIGFzbl9idWlsZF9pbnQoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fSU5URUdFUiksCiAgICAgICAgICAgICAgICAgICZib290c19sb25nLCBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CgogICAgb2ZmU2V0ID0gcHRyX2xlbiAtIHJlbWFpbmluZzsKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRob3JpdGF0aXZlRW5naW5lVGltZSIpOwogICAgYXNuX2J1aWxkX2ludCgmcHRyW29mZlNldF0sICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSwKICAgICAgICAgICAgICAgICAgJnRpbWVfbG9uZywgc2l6ZW9mKGxvbmcpKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnVXNlck5hbWUiKTsKICAgIGFzbl9idWlsZF9zdHJpbmcoJnB0cltvZmZTZXRdLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksICh1X2NoYXIgKikgdGhlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgdGhlTmFtZUxlbmd0aCk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKCgogICAgLyoKICAgICAqIE5vdGU6IGlmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uIGJlaW5nIGRvbmUsCiAgICAgKiBtc2dBdXRoUGFybUxlbiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuCiAgICAgKiBpbnNlcnRpbmcgYSB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcKICAgICAqIHN0YXRlbWVudHMuCiAgICAgKi8KCiAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgYXNuX2J1aWxkX2hlYWRlcigmcHRyW29mZlNldF0sCiAgICAgICAgICAgICAgICAgICAgICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwgbXNnQXV0aFBhcm1MZW4pOwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIG1lbXNldCgmcHRyW29mZlNldF0sIDAsIG1zZ0F1dGhQYXJtTGVuKTsKICAgIH0KCiAgICByZW1haW5pbmcgLT0gbXNnQXV0aFBhcm1MZW47CgoKICAgIC8qCiAgICAgKiBOb3RlOiBpZiB0aGVyZSBpcyBubyBlbmNyeXB0aW9uIGJlaW5nIGRvbmUsIG1zZ1ByaXZQYXJtTGVuCiAgICAgKiBpcyAwLCBhbmQgdGhlcmUgaXMgbm8gZWZmZWN0IChvdGhlciB0aGFuIGluc2VydGluZyBhCiAgICAgKiB6ZXJvLWxlbmd0aCBoZWFkZXIpIG9mIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cy4KICAgICAqLwoKICAgIG9mZlNldCA9IHB0cl9sZW4gLSByZW1haW5pbmc7CiAgICBhc25fYnVpbGRfaGVhZGVyKCZwdHJbb2ZmU2V0XSwKICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIpLCBtc2dQcml2UGFybUxlbik7CgogICAgcmVtYWluaW5nIC09IG1zZ1ByaXZQYXJtTGVuOyAgICAgICAgLyogU2tpcHBpbmcgdGhlIElWIGFscmVhZHkgdGhlcmUuICovCgoKICAgIC8qCiAgICAgKiBGb3IgcHJpdmFjeSwgbmVlZCB0byBhZGQgdGhlIG9jdGV0IHN0cmluZyBoZWFkZXIgZm9yIGl0LgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBvZmZTZXQgPSBwdHJfbGVuIC0gcmVtYWluaW5nOwogICAgICAgIGFzbl9idWlsZF9oZWFkZXIoJnB0cltvZmZTZXRdLAogICAgICAgICAgICAgICAgICAgICAgICAgJnJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUb3RhbExlbmd0aCAtIGRhdGFPZmZzZXQpOwogICAgfQoKCiAgICAvKgogICAgICogQWRqdXN0IG92ZXJhbGwgbGVuZ3RoIGFuZCBzdG9yZSBpdCBhcyB0aGUgZmlyc3QgU0VRIGxlbmd0aAogICAgICogb2YgdGhlIFNOTVB2M01lc3NhZ2UuCiAgICAgKgogICAgICogRklYICA0IGlzIGEgbWFnaWMgbnVtYmVyIQogICAgICovCiAgICByZW1haW5pbmcgPSB0aGVUb3RhbExlbmd0aDsKICAgIGFzbl9idWlsZF9zZXF1ZW5jZShwdHIsICZyZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8IEFTTl9DT05TVFJVQ1RPUiksCiAgICAgICAgICAgICAgICAgICAgICAgdGhlVG90YWxMZW5ndGggLSA0KTsKCgogICAgLyoKICAgICAqIE5vdywgdGltZSB0byBjb25zaWRlciAvIGRvIGF1dGhlbnRpY2F0aW9uLgogICAgICovCiAgICBpZiAodGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVgogICAgICAgIHx8IHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIHRlbXBfc2lnX2xlbiA9IG1zZ0F1dGhQYXJtTGVuOwogICAgICAgIHVfY2hhciAgICAgICAgICp0ZW1wX3NpZyA9ICh1X2NoYXIgKikgbWFsbG9jKHRlbXBfc2lnX2xlbik7CgogICAgICAgIGlmICh0ZW1wX3NpZyA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNjX2dlbmVyYXRlX2tleWVkX2hhc2godGhlQXV0aFByb3RvY29sLCB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXV0aEtleSwgdGhlQXV0aEtleUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIHB0cl9sZW4sIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEZJWCB0ZW1wX3NpZ19sZW4gZGVmaW5lZD8hCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9aRVJPKHRlbXBfc2lnLCB0ZW1wX3NpZ19sZW4pOwogICAgICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlNpZ25pbmcgbGVuZ3RocyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIG1lbWNweSgmcHRyW2F1dGhQYXJhbXNPZmZzZXRdLCB0ZW1wX3NpZywgbXNnQXV0aFBhcm1MZW4pOwoKICAgICAgICBTTk1QX1pFUk8odGVtcF9zaWcsIHRlbXBfc2lnX2xlbik7CiAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKCiAgICB9CgogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CgogICAgREVCVUdNU0dUTCgoInVzbSIsICJVU00gcHJvY2Vzc2luZyBjb21wbGV0ZWQuXG4iKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9nZW5lcmF0ZV9vdXRfbXNnKCkgKi8KCiNpZmRlZiBORVRTTk1QX1VTRV9SRVZFUlNFX0FTTkVOQ09ESU5HCmludAp1c21fc2VjbW9kX3JnZW5lcmF0ZV9vdXRfbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9vdXRnb2luZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5nbG9iYWxEYXRhLCBwYXJtcy0+Z2xvYmFsRGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPm1heE1zZ1NpemUsIHBhcm1zLT5zZWNNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlELCBwYXJtcy0+c2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNOYW1lLCBwYXJtcy0+c2VjTmFtZUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0xldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2NvcGVkUGR1LCBwYXJtcy0+c2NvcGVkUGR1TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT53aG9sZU1zZywgcGFybXMtPndob2xlTXNnTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dPZmZzZXQpOwp9CgppbnQKdXNtX3JnZW5lcmF0ZV9vdXRfbXNnKGludCBtc2dQcm9jTW9kZWwsIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBnbG9iYWxEYXRhLCAgICAgIC8qIElOICovCiAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICogcG9pbnRzIGF0IHRoZSBtc2dHbG9iYWxEYXRhLCB3aGljaCBpcyBvZiBsZW5ndGggZ2l2ZW4gYnkgbmV4dCAKICAgICAgICAgICAgICAgICAgICAgICAqIHBhcmFtZXRlci4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZ2xvYmFsRGF0YUxlbiwgICAgIC8qIElOIC0gTGVuZ3RoIG9mIG1zZyBoZWFkZXIgZGF0YS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgaW50IG1heE1zZ1NpemUsICAgLyogKFVOVVNFRCkgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNNb2RlbCwgICAgIC8qIChVTlVTRUQpICovCiAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNFbmdpbmVJRCwgICAgIC8qIElOIC0gUG9pbnRlciBzbm1wRW5naW5lSUQuICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY0VuZ2luZUlETGVuLCAgICAvKiBJTiAtIFNubXBFbmdpbmVJRCBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY05hbWUsICAgIC8qIElOIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNlY05hbWVMZW4sICAgICAgICAvKiBJTiAtIFNlY3VyaXR5TmFtZSBsZW5ndGguICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNMZXZlbCwgICAgIC8qIElOIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2NvcGVkUGR1LCAgICAgICAvKiBJTiAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gc2NvcGVkUGR1IHdpbGwgYmUgZW5jcnlwdGVkIGJ5IFVTTSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAqICogYW5kIHdyaXR0ZW4gdG8gcGFja2V0IGJ1ZmZlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAqICogc2VjdXJpdHlQYXJhbWV0ZXJzLCBlbnRpcmUgbXNnIHdpbGwgYmUgYXV0aGVudGljYXRlZCBieQogICAgICAgICAgICAgICAgICAgICAgICogKiBVU00gaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2NvcGVkUGR1TGVuLCAgICAgIC8qIElOIC0gc2NvcGVkUGR1IGxlbmd0aC4gKi8KICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlY1N0YXRlUmVmLCAgICAgICAgLyogSU4gKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBzZWNTdGF0ZVJlZiwgcG9pbnRlciB0byBjYWNoZWQgaW5mbyBwcm92aWRlZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgICogKiBSZXNwb25zZSwgb3RoZXJ3aXNlIE5VTEwuCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiB3aG9sZU1zZywgICAgICAgLyogIElOL09VVCAgKi8KICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgKiBQb2ludHMgYXQgdGhlIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBidWZmZXIsIHdoaWNoIG1pZ2h0IGdldCBleHRlbmRlZAogICAgICAgICAgICAgICAgICAgICAgICogaWYgbmVjZXNzYXJ5IHZpYSByZWFsbG9jKCkuICAKICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICogd2hvbGVNc2dMZW4sICAgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIExlbmd0aCBvZiB0aGUgZW50aXJlIHBhY2tldCBidWZmZXIsICoqbm90KiogdGhlIGxlbmd0aCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAqIHBhY2tldC4gIAogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBvZmZzZXQgICAvKiAgSU4vT1VUICAqLwogICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAqIE9mZnNldCBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhY2tldCBidWZmZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgKiBhbHNvIGtub3duIGFzIHRoZSBwYWNrZXQgbGVuZ3RoLiAgCiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICkKewogICAgc2l6ZV90ICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gMDsKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgc2l6ZV90ICAgICAgICAgIHRoZVRvdGFsTGVuZ3RoOwojZW5kaWYKCiAgICB1X2ludCAgICAgICAgICAgYm9vdHNfdWludDsKICAgIHVfaW50ICAgICAgICAgICB0aW1lX3VpbnQ7CiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgLyoKICAgICAqIEluZGlyZWN0aW9uIGJlY2F1c2Ugc2VjU3RhdGVSZWYgdmFsdWVzIG92ZXJyaWRlIHBhcmFtZXRlcnMuCiAgICAgKiAKICAgICAqIE5vbmUgb2YgdGhlc2UgYXJlIHRvIGJlIGZyZWUnZCAtIHRoZXkgYXJlIGVpdGhlciBwb2ludGluZyB0bwogICAgICogd2hhdCdzIGluIHRoZSBzZWNTdGF0ZVJlZiBvciB0byBzb21ldGhpbmcgZWl0aGVyIGluIHRoZQogICAgICogYWN0dWFsIHBhcmFtZXRlciBsaXN0IG9yIHRoZSB1c2VyIGxpc3QuCiAgICAgKi8KCiAgICBjaGFyICAgICAgICAgICAqdGhlTmFtZSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlTmFtZUxlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlRW5naW5lSUQgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoID0gMDsKICAgIHVfY2hhciAgICAgICAgICp0aGVBdXRoS2V5ID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVBdXRoS2V5TGVuZ3RoID0gMDsKICAgIGNvbnN0IG9pZCAgICAgICp0aGVBdXRoUHJvdG9jb2wgPSBOVUxMOwogICAgdV9pbnQgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAqdGhlUHJpdktleSA9IE5VTEw7CiAgICB1X2ludCAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICBjb25zdCBvaWQgICAgICAqdGhlUHJpdlByb3RvY29sID0gTlVMTDsKICAgIHVfaW50ICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSAwOwogICAgaW50ICAgICAgICAgICAgIHRoZVNlY0xldmVsID0gMDsgICAgLyogTm8gZGVmaW5lZCBjb25zdCBmb3IgYmFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWx1ZSAob3RoZXIgdGhlbiBlcnIpLiAqLwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gMCwgc2F2ZV9zYWx0X2xlbmd0aCA9IDA7CiAgICB1X2NoYXIgICAgICAgICAgc2FsdFtCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICB1X2NoYXIgICAgICAgICAgYXV0aFBhcmFtc1tVU01fTUFYX0FVVEhTSVpFXTsKICAgIHVfY2hhciAgICAgICAgICBpdltCWVRFU0laRShVU01fTUFYX1NBTFRfTEVOR1RIKV07CiAgICBzaXplX3QgICAgICAgICAgc3Bfb2Zmc2V0ID0gMCwgbWFjX29mZnNldCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgaGFzIGJlZ3VuIChvZmZzZXQgJWQpXG4iLCAoaW50KSpvZmZzZXQpKTsKCiAgICBpZiAoc2VjU3RhdGVSZWYgIT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogVG8gaHVzaCB0aGUgY29tcGlsZXIgZm9yIG5vdy4gIFhYWCAKICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKnJlZgogICAgICAgICAgICA9IChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKikgc2VjU3RhdGVSZWY7CgogICAgICAgIHRoZU5hbWUgPSByZWYtPnVzcl9uYW1lOwogICAgICAgIHRoZU5hbWVMZW5ndGggPSByZWYtPnVzcl9uYW1lX2xlbmd0aDsKICAgICAgICB0aGVFbmdpbmVJRCA9IHJlZi0+dXNyX2VuZ2luZV9pZDsKICAgICAgICB0aGVFbmdpbmVJRExlbmd0aCA9IHJlZi0+dXNyX2VuZ2luZV9pZF9sZW5ndGg7CgogICAgICAgIGlmICghdGhlRW5naW5lSURMZW5ndGgpIHsKICAgICAgICAgICAgdGhlRW5naW5lSUQgPSBzZWNFbmdpbmVJRDsKICAgICAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICB9CgogICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHJlZi0+dXNyX2F1dGhfcHJvdG9jb2w7CiAgICAgICAgdGhlQXV0aFByb3RvY29sTGVuZ3RoID0gcmVmLT51c3JfYXV0aF9wcm90b2NvbF9sZW5ndGg7CiAgICAgICAgdGhlQXV0aEtleSA9IHJlZi0+dXNyX2F1dGhfa2V5OwogICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSByZWYtPnVzcl9hdXRoX2tleV9sZW5ndGg7CiAgICAgICAgdGhlUHJpdlByb3RvY29sID0gcmVmLT51c3JfcHJpdl9wcm90b2NvbDsKICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPSByZWYtPnVzcl9wcml2X3Byb3RvY29sX2xlbmd0aDsKICAgICAgICB0aGVQcml2S2V5ID0gcmVmLT51c3JfcHJpdl9rZXk7CiAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IHJlZi0+dXNyX3ByaXZfa2V5X2xlbmd0aDsKICAgICAgICB0aGVTZWNMZXZlbCA9IHJlZi0+dXNyX3NlY19sZXZlbDsKICAgIH0KCiAgICAvKgogICAgICogKiBJZGVudGlmeSB0aGUgdXNlciByZWNvcmQuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgICAgICAvKgogICAgICAgICAqIHdlIGRvIGFsbG93IGFuIHVua25vd24gdXNlciBuYW1lIGZvcgogICAgICAgICAqIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0cy4gCiAgICAgICAgICovCiAgICAgICAgaWYgKCh1c2VyID0gdXNtX2dldF91c2VyKHNlY0VuZ2luZUlELCBzZWNFbmdpbmVJRExlbiwgc2VjTmFtZSkpCiAgICAgICAgICAgID09IE5VTEwgJiYgc2VjTGV2ZWwgIT0gU05NUF9TRUNfTEVWRUxfTk9BVVRIKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBVc2VyXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICAgICAgfQoKICAgICAgICB0aGVOYW1lID0gc2VjTmFtZTsKICAgICAgICB0aGVOYW1lTGVuZ3RoID0gc2VjTmFtZUxlbjsKICAgICAgICB0aGVFbmdpbmVJRCA9IHNlY0VuZ2luZUlEOwogICAgICAgIHRoZVNlY0xldmVsID0gc2VjTGV2ZWw7CiAgICAgICAgdGhlRW5naW5lSURMZW5ndGggPSBzZWNFbmdpbmVJRExlbjsKICAgICAgICBpZiAodXNlcikgewogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wgPSB1c2VyLT5hdXRoUHJvdG9jb2w7CiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbExlbmd0aCA9IHVzZXItPmF1dGhQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlQXV0aEtleSA9IHVzZXItPmF1dGhLZXk7CiAgICAgICAgICAgIHRoZUF1dGhLZXlMZW5ndGggPSB1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wgPSB1c2VyLT5wcml2UHJvdG9jb2w7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbExlbmd0aCA9IHVzZXItPnByaXZQcm90b2NvbExlbjsKICAgICAgICAgICAgdGhlUHJpdktleSA9IHVzZXItPnByaXZLZXk7CiAgICAgICAgICAgIHRoZVByaXZLZXlMZW5ndGggPSB1c2VyLT5wcml2S2V5TGVuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHVua25vd24gdXNlcnMgY2FuIG5vdCBkbyBhdXRoZW50aWNhdGlvbiAob2J2aW91c2x5KSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoZUF1dGhQcm90b2NvbCA9IHVzbU5vQXV0aFByb3RvY29sOwogICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vQXV0aFByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVBdXRoS2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlQXV0aEtleUxlbmd0aCA9IDA7CiAgICAgICAgICAgIHRoZVByaXZQcm90b2NvbCA9IHVzbU5vUHJpdlByb3RvY29sOwogICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGggPQogICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpOwogICAgICAgICAgICB0aGVQcml2S2V5ID0gTlVMTDsKICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZGlmIC0tIHNlY1N0YXRlUmVmPT1OVUxMICovCgoKICAgIC8qCiAgICAgKiBGcm9tIGhlcmUgdG8gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGF2b2lkIHJlZmVyZW5jZSB0bwogICAgICogc2VjTmFtZSwgc2VjRW5naW5lSUQsIHNlY0xldmVsLCBhbmQgYXNzb2NpYXRlZCBsZW5ndGhzLgogICAgICovCgoKICAgIC8qCiAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHVzZXIgY2FuIHVzZSB0aGUgcmVxdWVzdGVkIHNlYyBzZXJ2aWNlcy4KICAgICAqLwogICAgaWYgKHVzbV9jaGVja19zZWNMZXZlbF92c19wcm90b2NvbHModGhlU2VjTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBdXRoUHJvdG9jb2xMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2UHJvdG9jb2xMZW5ndGgpID09IDEpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlVuc3VwcG9ydGVkIFNlY3VyaXR5IExldmVsIG9yIHR5cGUgKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICB0aGVTZWNMZXZlbCkpOwoKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0KCgogICAgLyoKICAgICAqICogUmV0cmlldmUgdGhlIGVuZ2luZSBpbmZvcm1hdGlvbi4KICAgICAqICoKICAgICAqICogWFhYICAgIE5vIGVycm9yIGlzIGRlY2xhcmVkIGluIHRoZSBFb1Agd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIHRvCiAgICAgKiAqICAgICAgICB1bmtub3duIGVuZ2luZXMsIHByb2Nlc3NpbmcgY29udGludWVzIHcvIGJvb3RzL3RpbWUgPT0gKDAsMCkuCiAgICAgKi8KICAgIGlmIChnZXRfZW5naW5ldGltZSh0aGVFbmdpbmVJRCwgdGhlRW5naW5lSURMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgJmJvb3RzX3VpbnQsICZ0aW1lX3VpbnQsIEZBTFNFKSA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gZmluZCBlbmdpbmUgZGF0YS4iKSk7CiAgICB9CgogICAgYm9vdHNfbG9uZyA9IGJvb3RzX3VpbnQ7CiAgICB0aW1lX2xvbmcgPSB0aW1lX3VpbnQ7CgogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBJbml0aWFsbHkgYXNzdW1lIHRoYXQgdGhlIGNpcGhlcnRleHQgd2lsbCBlbmQgdXAgdGhlIHNhbWUgc2l6ZSBhcwogICAgICAgICAqIHRoZSBwbGFpbnRleHQgcGx1cyBzb21lIHBhZGRpbmcuICBSZWFsbHkgc2NfZW5jcnlwdCBvdWdodCB0byBiZSBhYmxlCiAgICAgICAgICogdG8gZ3JvdyB0aGlzIGZvciB1cywgYSBsYSBhc25fcmVhbGxvY19yYnVpbGRfPHR5cGU+IGZ1bmN0aW9ucywgYnV0CiAgICAgICAgICogdGhpcyB3aWxsIGRvIGZvciBub3cuICAKICAgICAgICAgKi8KICAgICAgICB1X2NoYXIgICAgICAgICAqY2lwaGVydGV4dCA9IE5VTEw7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGNpcGhlcnRleHRsZW4gPSBzY29wZWRQZHVMZW4gKyA2NDsKCiAgICAgICAgaWYgKChjaXBoZXJ0ZXh0ID0gKHVfY2hhciAqKSBtYWxsb2MoY2lwaGVydGV4dGxlbikpID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBtYWxsb2MgJWQgYnl0ZXMgZm9yIGVuY3J5cHRlZCBQRFVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpY2lwaGVydGV4dGxlbikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX01BTExPQzsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogWFhYIEhhcmR3aXJlZCB0byBzZWVrIGludG8gYSAxREVTIHByaXZhdGUga2V5ISAgCiAgICAgICAgICovCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0FFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fQUVTX1NBTFRfTEVOR1RIKS8yOwogICAgICAgICAgICBpZiAoIXRoZVByaXZLZXkgfHwKICAgICAgICAgICAgICAgIHVzbV9zZXRfYWVzX2l2KHNhbHQsICZzYWx0X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0b25sKGJvb3RzX3VpbnQpLCBodG9ubCh0aW1lX3VpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYpID09IC0xKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkNhbid0IHNldCBBRVMgaXYuXG4iKSk7CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgfSAKI2VuZGlmCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh0aGVQcml2UHJvdG9jb2wsIERFU1ByaXYpKSB7CiAgICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX0RFU19TQUxUX0xFTkdUSCk7CiAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGggPSBCWVRFU0laRShVU01fREVTX1NBTFRfTEVOR1RIKTsKICAgICAgICAgICAgaWYgKCF0aGVQcml2S2V5IHx8ICh1c21fc2V0X3NhbHQoc2FsdCwgJnNhbHRfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQcml2S2V5ICsgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHJpdktleUxlbmd0aCAtIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2KSA9PSAtMSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiQ2FuJ3Qgc2V0IERFUy1DQkMgc2FsdC5cbiIpKTsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgaWYgKGRlYnVnX2lzX3Rva2VuX3JlZ2lzdGVyZWQoInVzbS9kdW1wIikgPT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIGR1bXBfY2h1bmsoInVzbS9kdW1wIiwgIlRoaXMgZGF0YSB3YXMgZW5jcnlwdGVkOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4pOwogICAgICAgIH0KI2VuZGlmCgogICAgICAgIGlmIChzY19lbmNyeXB0KHRoZVByaXZQcm90b2NvbCwgdGhlUHJpdlByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIHRoZVByaXZLZXksIHRoZVByaXZLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkUGR1LCBzY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgJmNpcGhlcnRleHRsZW4pICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJlbmNyeXB0aW9uIGVycm9yLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIFNOTVBfRlJFRShjaXBoZXJ0ZXh0KTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0VOQ1JZUFRJT05FUlJPUjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogV3JpdGUgdGhlIGVuY3J5cHRlZCBzY29wZWRQZHUgYmFjayBpbnRvIHRoZSBwYWNrZXQgYnVmZmVyLiAgCiAgICAgICAgICovCgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICAgICAgdGhlVG90YWxMZW5ndGggPSAqd2hvbGVNc2dMZW47CiNlbmRpZgogICAgICAgICpvZmZzZXQgPSAwOwogICAgICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgY2lwaGVydGV4dGxlbik7CiAgICAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIGZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgICAgICBTTk1QX0ZSRUUoY2lwaGVydGV4dCk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9FTkNSWVBUSU9ORVJST1I7CiAgICAgICAgfQoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJzYWx0ICsgRW5jcnlwdGVkIGZvcm06ICIsIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJ3aG9sZU1zZzoiLAogICAgICAgICAgICAgICAgICAgICAgICgqd2hvbGVNc2cgKyAqd2hvbGVNc2dMZW4gLSAqb2Zmc2V0KSwgKm9mZnNldCk7CiAgICAgICAgfQojZW5kaWYKCiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbmNyeXB0aW9uIHN1Y2Nlc3NmdWwuXG4iKSk7CiAgICAgICAgU05NUF9GUkVFKGNpcGhlcnRleHQpOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIHRoZVNlY0xldmVsICE9IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWICAKICAgICAgICAgKi8KICAgIH0KCiAgICAvKgogICAgICogU3RhcnQgZW5jb2RpbmcgdGhlIG1zZ1NlY3VyaXR5UGFyYW1ldGVycy4gIAogICAgICovCgogICAgc3Bfb2Zmc2V0ID0gKm9mZnNldDsKCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnUHJpdmFjeVBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dQcml2YWN5UGFyYW1ldGVycyAod2FybmluZzogYXNzdW1lcyBERVMgc2FsdCkuICAKICAgICAqLwogICAgcmMgPSBhc25fcmVhbGxvY19yYnVpbGRfc3RyaW5nKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfc2FsdF9sZW5ndGgpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgcHJpdlBhcmFtcyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIERFQlVHRFVNUEhFQURFUigic2VuZCIsICJtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMiKTsKICAgIC8qCiAgICAgKiBtc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMgKHdhcm5pbmdzIGFzc3VtZXMgMHgwMCBieSAxMikuICAKICAgICAqLwogICAgaWYgKHRoZVNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYKICAgICAgICB8fCB0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIG1lbXNldChhdXRoUGFyYW1zLCAwLCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4pOwogICAgICAgIG1zZ0F1dGhQYXJtTGVuID0gVVNNX01ENV9BTkRfU0hBX0FVVEhfTEVOOwogICAgfQoKICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3N0cmluZyh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBU05fT0NURVRfU1RSKSwgYXV0aFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dBdXRoUGFybUxlbik7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJidWlsZGluZyBhdXRoUGFyYW1zIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIFJlbWVtYmVyIHdoZXJlIHRvIHB1dCB0aGUgYWN0dWFsIEhNQUMgd2UgY2FsY3VsYXRlIGxhdGVyIG9uLiAgQW4KICAgICAqIGVuY29kZWQgT0NURVQgU1RSSU5HIG9mIGxlbmd0aCBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4gaGFzIGFuIEFTTi4xCiAgICAgKiBoZWFkZXIgb2YgbGVuZ3RoIDIsIGhlbmNlIHRoZSBmdWRnZSBmYWN0b3IuICAKICAgICAqLwoKICAgIG1hY19vZmZzZXQgPSAqb2Zmc2V0IC0gMjsKCiAgICAvKgogICAgICogbXNnVXNlck5hbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ1VzZXJOYW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSB0aGVOYW1lLCB0aGVOYW1lTGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIGF1dGhQYXJhbXMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUuICAKICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJzZW5kIiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmdGltZV9sb25nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsb25nKSk7CiAgICBERUJVR0lOREVOVExFU1MoKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVCb290cy4gIAogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9pbnQod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0lOVEVHRVIpLCAmYm9vdHNfbG9uZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobG9uZykpOwogICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICBpZiAocmMgPT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICJidWlsZGluZyBtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICBERUJVR0RVTVBIRUFERVIoInNlbmQiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zdHJpbmcod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksIHRoZUVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUVuZ2luZUlETGVuZ3RoKTsKICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVJRCBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBVU00gbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIHNlcXVlbmNlIGhlYWRlciAgCiAgICAgKi8KICAgIHJjID0gYXNuX3JlYWxsb2NfcmJ1aWxkX3NlcXVlbmNlKHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwgb2Zmc2V0LCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9TRVFVRU5DRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQgLSBzcF9vZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIHVzbSBzZWN1cml0eSBwYXJhbWV0ZXJzIGZhaWxlZC5cbiIpKTsKICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVE9PX0xPTkc7CiAgICB9CgogICAgLyoKICAgICAqIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBPQ1RFVCBTVFJJTkcgd3JhcHBlci4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9oZWFkZXIod2hvbGVNc2csIHdob2xlTXNnTGVuLCBvZmZzZXQsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCAtIHNwX29mZnNldCk7CgogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1zZ1NlY3VyaXR5UGFyYW1ldGVycyBmYWlsZWQuXG4iKSk7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2Uoc2VjU3RhdGVSZWYpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3B5IGluIHRoZSBtc2dHbG9iYWxEYXRhIGFuZCBtc2dWZXJzaW9uLiAgCiAgICAgKi8KICAgIHdoaWxlICgoKndob2xlTXNnTGVuIC0gKm9mZnNldCkgPCBnbG9iYWxEYXRhTGVuKSB7CiAgICAgICAgaWYgKCFhc25fcmVhbGxvYyh3aG9sZU1zZywgd2hvbGVNc2dMZW4pKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiYnVpbGRpbmcgZ2xvYmFsIGRhdGEgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1RPT19MT05HOwogICAgICAgIH0KICAgIH0KCiAgICAqb2Zmc2V0ICs9IGdsb2JhbERhdGFMZW47CiAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldCwgZ2xvYmFsRGF0YSwgZ2xvYmFsRGF0YUxlbik7CgogICAgLyoKICAgICAqIFRvdGFsIHBhY2tldCBzZXF1ZW5jZS4gIAogICAgICovCiAgICByYyA9IGFzbl9yZWFsbG9jX3JidWlsZF9zZXF1ZW5jZSh3aG9sZU1zZywgd2hvbGVNc2dMZW4sIG9mZnNldCwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIpIChBU05fU0VRVUVOQ0UgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9DT05TVFJVQ1RPUiksICpvZmZzZXQpOwogICAgaWYgKHJjID09IDApIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgImJ1aWxkaW5nIG1hc3RlciBwYWNrZXQgc2VxdWVuY2UgZmFpbGVkLlxuIikpOwogICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9UT09fTE9ORzsKICAgIH0KCiAgICAvKgogICAgICogTm93IGNvbnNpZGVyIC8gZG8gYXV0aGVudGljYXRpb24uICAKICAgICAqLwoKICAgIGlmICh0aGVTZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWIHx8CiAgICAgICAgdGhlU2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBzaXplX3QgICAgICAgICAgdGVtcF9zaWdfbGVuID0gbXNnQXV0aFBhcm1MZW47CiAgICAgICAgdV9jaGFyICAgICAgICAgKnRlbXBfc2lnID0gKHVfY2hhciAqKSBtYWxsb2ModGVtcF9zaWdfbGVuKTsKICAgICAgICB1X2NoYXIgICAgICAgICAqcHJvdG9fbXNnID0gKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gKm9mZnNldDsKICAgICAgICBzaXplX3QgICAgICAgICAgcHJvdG9fbXNnX2xlbiA9ICpvZmZzZXQ7CgoKICAgICAgICBpZiAodGVtcF9zaWcgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk91dCBvZiBtZW1vcnkuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmIChzY19nZW5lcmF0ZV9rZXllZF9oYXNoKHRoZUF1dGhQcm90b2NvbCwgdGhlQXV0aFByb3RvY29sTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUF1dGhLZXksIHRoZUF1dGhLZXlMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fbXNnLCBwcm90b19tc2dfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfc2lnLCAmdGVtcF9zaWdfbGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIFNOTVBfRlJFRSh0ZW1wX3NpZyk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiU2lnbmluZyBmYWlsZWQuXG4iKSk7CiAgICAgICAgICAgIHVzbV9mcmVlX3VzbVN0YXRlUmVmZXJlbmNlKHNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0FVVEhFTlRJQ0FUSU9ORkFJTFVSRTsKICAgICAgICB9CgogICAgICAgIGlmICh0ZW1wX3NpZ19sZW4gIT0gbXNnQXV0aFBhcm1MZW4pIHsKICAgICAgICAgICAgU05NUF9GUkVFKHRlbXBfc2lnKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJTaWduaW5nIGxlbmd0aHMgZmFpbGVkLlxuIikpOwogICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoKndob2xlTXNnICsgKndob2xlTXNnTGVuIC0gbWFjX29mZnNldCwgdGVtcF9zaWcsCiAgICAgICAgICAgICAgIG1zZ0F1dGhQYXJtTGVuKTsKICAgICAgICBTTk1QX0ZSRUUodGVtcF9zaWcpOwogICAgfQogICAgLyoKICAgICAqIGVuZGlmIC0tIGNyZWF0ZSBrZXllZCBoYXNoIAogICAgICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShzZWNTdGF0ZVJlZik7CiAgICBERUJVR01TR1RMKCgidXNtIiwgIlVTTSBwcm9jZXNzaW5nIGNvbXBsZXRlZC5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9yZ2VuZXJhdGVfb3V0X21zZygpICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCShTZWUgbGlzdCBiZWxvdy4uLikKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCiAqCXRhYiBzdG9wIDQKICoKICoJRXh0cmFjdHMgdmFsdWVzIGZyb20gdGhlIHNlY3VyaXR5IGhlYWRlciBhbmQgZGF0YSBwb3J0aW9ucyBvZiB0aGUKICoJaW5jb21pbmcgYnVmZmVyLgogKi8KaW50CnVzbV9wYXJzZV9zZWN1cml0eV9wYXJhbWV0ZXJzKHVfY2hhciAqIHNlY1BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCAqIGJvb3RzX3VpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50ICogdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzaWduYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNpZ25hdHVyZV9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNhbHRfbGVuZ3RoLCB1X2NoYXIgKiogZGF0YV9wdHIpCnsKICAgIHVfY2hhciAgICAgICAgICpwYXJzZV9wdHIgPSBzZWNQYXJhbXM7CiAgICB1X2NoYXIgICAgICAgICAqdmFsdWVfcHRyOwogICAgdV9jaGFyICAgICAgICAgKm5leHRfcHRyOwogICAgdV9jaGFyICAgICAgICAgIHR5cGVfdmFsdWU7CgogICAgc2l6ZV90ICAgICAgICAgIG9jdGV0X3N0cmluZ19sZW5ndGggPSByZW1haW5pbmc7CiAgICBzaXplX3QgICAgICAgICAgc2VxdWVuY2VfbGVuZ3RoOwogICAgc2l6ZV90ICAgICAgICAgIHJlbWFpbmluZ19ieXRlczsKCiAgICBsb25nICAgICAgICAgICAgYm9vdHNfbG9uZzsKICAgIGxvbmcgICAgICAgICAgICB0aW1lX2xvbmc7CgogICAgdV9pbnQgICAgICAgICAgIG9yaWdOYW1lTGVuOwoKCiAgICAvKgogICAgICogRWF0IHRoZSBmaXJzdCBvY3RldCBoZWFkZXIuCiAgICAgKi8KICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKHBhcnNlX3B0ciwgJm9jdGV0X3N0cmluZ19sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNtIGZpcnN0IG9jdGV0IikpID09IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0xOwogICAgfQoKCiAgICAvKgogICAgICogRWF0IHRoZSBzZXF1ZW5jZSBoZWFkZXIuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHNlcXVlbmNlX2xlbmd0aCA9IG9jdGV0X3N0cmluZ19sZW5ndGg7CgogICAgaWYgKCh2YWx1ZV9wdHIgPSBhc25fcGFyc2Vfc2VxdWVuY2UocGFyc2VfcHRyLCAmc2VxdWVuY2VfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVNOX1NFUVVFTkNFIHwgQVNOX0NPTlNUUlVDVE9SKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c20gc2VxdWVuY2UiKSkgPT0gTlVMTCkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgZW5naW5lSUQuCiAgICAgKi8KICAgIHBhcnNlX3B0ciA9IHZhbHVlX3B0cjsKICAgIHJlbWFpbmluZ19ieXRlcyA9IHNlcXVlbmNlX2xlbmd0aDsKCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUlEIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhwYXJzZV9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCgogICAgLyoKICAgICAqIFJldHJpZXZlIHRoZSBlbmdpbmUgYm9vdHMsIG5vdGljZSBzd2l0Y2ggaW4gdGhlIHdheSBuZXh0X3B0ciBhbmQKICAgICAqIHJlbWFpbmluZ19ieXRlcyBhcmUgdXNlZCAodG8gYWNjb21vZGF0ZSB0aGUgYXNuIGNvZGUpLgogICAgICovCiAgICBERUJVR0RVTVBIRUFERVIoInJlY3YiLCAibXNnQXV0aG9yaXRhdGl2ZUVuZ2luZUJvb3RzIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm9vdHNfbG9uZywgc2l6ZW9mKGxvbmcpKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9JTlRFR0VSKSkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgogICAgKmJvb3RzX3VpbnQgPSAodV9pbnQpIGJvb3RzX2xvbmc7CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgdGltZSB2YWx1ZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIik7CiAgICBpZiAoKG5leHRfcHRyID0gYXNuX3BhcnNlX2ludChuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZV9sb25nLCBzaXplb2YobG9uZykpKSA9PSBOVUxMKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX0lOVEVHRVIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICAqdGltZV91aW50ID0gKHVfaW50KSB0aW1lX2xvbmc7CgogICAgaWYgKCpib290c191aW50ID4gRU5HSU5FQk9PVF9NQVggfHwgKnRpbWVfdWludCA+IEVOR0lORVRJTUVfTUFYKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2VjTmFtZS4KICAgICAqLwogICAgb3JpZ05hbWVMZW4gPSAqc2VjTmFtZUxlbjsKCgogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1VzZXJOYW1lIik7CiAgICBpZiAoKG5leHRfcHRyCiAgICAgICAgID0gYXNuX3BhcnNlX3N0cmluZyhuZXh0X3B0ciwgJnJlbWFpbmluZ19ieXRlcywgJnR5cGVfdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIHNlY05hbWUsIHNlY05hbWVMZW4pKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIC8qCiAgICAgKiBGSVggLS0gZG9lc24ndCB0aGlzIGFsc28gaW5kaWNhdGUgYSBidWZmZXIgb3ZlcnJ1bj8KICAgICAqLwogICAgaWYgKChpbnQpIG9yaWdOYW1lTGVuIDwgKnNlY05hbWVMZW4gKyAxKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IsIGJ1dCBpdCdzIHJlYWxseSBhIHBhcmFtZXRlciBlcnJvciAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaWYgKCpzZWNOYW1lTGVuID4gMzIpIHsKICAgICAgICAvKgogICAgICAgICAqIFRoaXMgaXMgYSBVU00tc3BlY2lmaWMgbGltaXRhdGlvbiBvdmVyIGFuZCBhYm92ZSB0aGUgYWJvdmUKICAgICAgICAgKiBsaW1pdGF0aW9uICh3aGljaCB3aWxsIHByb2JhYmx5IGRlZmF1bHQgdG8gdGhlIGxlbmd0aCBvZiBhbgogICAgICAgICAqIFNubXBBZG1pblN0cmluZywgaS5lLiAyNTUpLiAgU2VlIFJGQyAyNTc0LCBzZWMuIDIuNC4gIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBzZWNOYW1lWypzZWNOYW1lTGVuXSA9ICdcMCc7CgogICAgaWYgKHR5cGVfdmFsdWUgIT0KICAgICAgICAodV9jaGFyKSAoQVNOX1VOSVZFUlNBTCB8IEFTTl9QUklNSVRJVkUgfCBBU05fT0NURVRfU1RSKSkgewogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CgoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgc2lnbmF0dXJlIGFuZCBibGFuayBpdCBpZiB0aGVyZS4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ0F1dGhlbnRpY2F0aW9uUGFyYW1ldGVycyIpOwogICAgaWYgKChuZXh0X3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCBzaWduYXR1cmVfbGVuZ3RoKSkgPT0gTlVMTCkgewogICAgICAgIERFQlVHSU5ERU5UTEVTUygpOwogICAgICAgIC8qCiAgICAgICAgICogUkVUVVJOIHBhcnNlIGVycm9yIAogICAgICAgICAqLyByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR0lOREVOVExFU1MoKTsKCiAgICBpZiAodHlwZV92YWx1ZSAhPQogICAgICAgICh1X2NoYXIpIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRSB8IEFTTl9PQ1RFVF9TVFIpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoKnNpZ25hdHVyZV9sZW5ndGggIT0gMCkgeyAgICAgICAvKiBCbGFua2luZyBmb3IgYXV0aGVudGljYXRpb24gc3RlcCBsYXRlciAqLwogICAgICAgIG1lbXNldChuZXh0X3B0ciAtICh1X2xvbmcpICogc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgMCwgKnNpZ25hdHVyZV9sZW5ndGgpOwogICAgfQoKCiAgICAvKgogICAgICogUmV0cmlldmUgdGhlIHNhbHQuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoZSBuZXh0IHB0ciBpcyB3aGVyZSB0aGUgZGF0YSBzZWN0aW9uIHN0YXJ0cy4KICAgICAqLwogICAgREVCVUdEVU1QSEVBREVSKCJyZWN2IiwgIm1zZ1ByaXZhY3lQYXJhbWV0ZXJzIik7CiAgICBpZiAoKCpkYXRhX3B0cgogICAgICAgICA9IGFzbl9wYXJzZV9zdHJpbmcobmV4dF9wdHIsICZyZW1haW5pbmdfYnl0ZXMsICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpKSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdJTkRFTlRMRVNTKCk7CiAgICAgICAgLyoKICAgICAgICAgKiBSRVRVUk4gcGFyc2UgZXJyb3IgCiAgICAgICAgICovIHJldHVybiAtMjsKICAgIH0KICAgIERFQlVHSU5ERU5UTEVTUygpOwoKICAgIGlmICh0eXBlX3ZhbHVlICE9CiAgICAgICAgKHVfY2hhcikgKEFTTl9VTklWRVJTQUwgfCBBU05fUFJJTUlUSVZFIHwgQVNOX09DVEVUX1NUUikpIHsKICAgICAgICAvKgogICAgICAgICAqIFJFVFVSTiBwYXJzZSBlcnJvciAKICAgICAgICAgKi8gcmV0dXJuIC0yOwogICAgfQoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoKSAqLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcwogKgogKiBQYXJhbWV0ZXJzOgogKgkqc2VjRW5naW5lSUQKICoJIHNlY0VuZ2luZUlEZW4KICoJIGJvb3RzX3VpbnQKICoJIHRpbWVfdWludAogKgkqZXJyb3IKICogICAgICAKICogUmV0dXJuczoKICoJMAlPbiBzdWNjZXNzLAogKgktMQlPdGhlcndpc2UuCiAqCQogKgogKiBQZXJmb3JtcyB0aGUgaW5jb21pbmcgdGltZWxpbmVzcyBjaGVja2luZyBhbmQgc2V0dGluZy4KICovCmludAp1c21fY2hlY2tfYW5kX3VwZGF0ZV90aW1lbGluZXNzKHVfY2hhciAqIHNlY0VuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBib290c191aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IHRpbWVfdWludCwgaW50ICplcnJvcikKewogICAgdV9jaGFyICAgICAgICAgIG15SURbVVNNX01BWF9JRF9MRU5HVEhdOwogICAgdV9sb25nICAgICAgICAgIG15SURMZW5ndGggPQogICAgICAgIHNubXB2M19nZXRfZW5naW5lSUQobXlJRCwgVVNNX01BWF9JRF9MRU5HVEgpOwogICAgdV9pbnQgICAgICAgICAgIG15Qm9vdHM7CiAgICB1X2ludCAgICAgICAgICAgbXlUaW1lOwoKCgogICAgaWYgKChteUlETGVuZ3RoID4gVVNNX01BWF9JRF9MRU5HVEgpIHx8IChteUlETGVuZ3RoID09IDApKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBXZSdyZSBwcm9iYWJseSBhbHJlYWR5IHNjcmV3ZWQuLi5idWZmZXIgb3ZlcndyaXRlLiAgWFhYPyAKICAgICAgICAgKi8KICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkJ1ZmZlciBvdmVyZmxvdy5cbiIpKTsKICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG15Qm9vdHMgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZUJvb3RzKCk7CiAgICBteVRpbWUgPSBzbm1wdjNfbG9jYWxfc25tcEVuZ2luZVRpbWUoKTsKCgogICAgLyoKICAgICAqIElGIHRoZSB0aW1lIGludm9sdmVkIGlzIGxvY2FsCiAgICAgKiAgICAgTWFrZSBzdXJlICBtZXNzYWdlIGlzIGluc2lkZSB0aGUgdGltZSB3aW5kb3cgCiAgICAgKiBFTFNFIAogICAgICogICAgICBJRiBib290cyBpcyBoaWdoZXIgb3IgYm9vdHMgaXMgdGhlIHNhbWUgYW5kIHRpbWUgaXMgaGlnaGVyCiAgICAgKiAgICAgICAgICAgICAgcmVtZW1iZXIgdGhpcyBuZXcgZGF0YQogICAgICogICAgICBFTFNFCiAgICAgKiAgICAgICAgICAgICAgSUYgIShib290cyBzYW1lIGFuZCB0aW1lIHdpdGhpbiBVU01fVElNRV9XSU5ET1cgc2VjcykKICAgICAqICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgaXMgdG9vIG9sZCAKICAgICAqICAgICAgICAgICAgICBFTFNFICAgIAogICAgICogICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBpcyBvaywgYnV0IGRvbid0IHRha2UgdGltZQogICAgICogICAgICAgICAgICAgIEVORElGCiAgICAgKiAgICAgIEVORElGCiAgICAgKiBFTkRJRgogICAgICovCgogICAgLyoKICAgICAqIFRoaXMgaXMgYSBsb2NhbCByZWZlcmVuY2UuCiAgICAgKi8KICAgIGlmICgoaW50KSBzZWNFbmdpbmVJRExlbiA9PSBteUlETGVuZ3RoCiAgICAgICAgJiYgbWVtY21wKHNlY0VuZ2luZUlELCBteUlELCBteUlETGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRpbWVfZGlmZmVyZW5jZSA9IG15VGltZSA+IHRpbWVfdWludCA/CiAgICAgICAgICAgIG15VGltZSAtIHRpbWVfdWludCA6IHRpbWVfdWludCAtIG15VGltZTsKCiAgICAgICAgaWYgKGJvb3RzX3VpbnQgPT0gRU5HSU5FQk9PVF9NQVgKICAgICAgICAgICAgfHwgYm9vdHNfdWludCAhPSBteUJvb3RzCiAgICAgICAgICAgIHx8IHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNOT1RJTlRJTUVXSU5ET1dTKSA9PQogICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9vdF91aW50ICV1IG15Qm9vdHMgJXUgdGltZV9kaWZmICV1ID0+IG5vdCBpbiB0aW1lIHdpbmRvd1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgbXlCb290cywgdGltZV9kaWZmZXJlbmNlKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVzsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBUaGlzIGlzIGEgcmVtb3RlIHJlZmVyZW5jZS4KICAgICAqLwogICAgZWxzZSB7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHRoZWlyQm9vdHMsIHRoZWlyVGltZSwgdGhlaXJMYXN0VGltZTsKICAgICAgICB1X2ludCAgICAgICAgICAgdGltZV9kaWZmZXJlbmNlOwoKICAgICAgICBpZiAoZ2V0X2VuZ2luZXRpbWVfZXgoc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlaXJCb290cywgJnRoZWlyVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZWlyTGFzdFRpbWUsIFRSVUUpCiAgICAgICAgICAgICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGdldCByZW1vdGUgZW5naW5lJ3MgdGltZXMuIikpOwoKICAgICAgICAgICAgKmVycm9yID0gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICB0aW1lX2RpZmZlcmVuY2UgPSB0aGVpclRpbWUgPiB0aW1lX3VpbnQgPwogICAgICAgICAgICB0aGVpclRpbWUgLSB0aW1lX3VpbnQgOiB0aW1lX3VpbnQgLSB0aGVpclRpbWU7CgoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAgQ29udHJhcnkgdG8gdGhlIHBzZXVkb2NvZGU6CiAgICAgICAgICogICAgICBTZWUgaWYgYm9vdHMgaXMgaW52YWxpZCBmaXJzdC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBFTkdJTkVCT09UX01BWCB8fCB0aGVpckJvb3RzID4gYm9vdHNfdWludCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiUmVtb3RlIGJvb3QgY291bnQgaW52YWxpZC4iKSk7CgogICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgoKICAgICAgICAvKgogICAgICAgICAqIEJvb3RzIGlzIG9rLCBzZWUgaWYgdGhlIGJvb3RzIGlzIHRoZSBzYW1lIGJ1dCB0aGUgdGltZQogICAgICAgICAqIGlzIG9sZC4KICAgICAgICAgKi8KICAgICAgICBpZiAodGhlaXJCb290cyA9PSBib290c191aW50ICYmIHRpbWVfdWludCA8IHRoZWlyTGFzdFRpbWUpIHsKICAgICAgICAgICAgaWYgKHRpbWVfZGlmZmVyZW5jZSA+IFVTTV9USU1FX1dJTkRPVykgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIk1lc3NhZ2UgdG9vIG9sZC4iKSk7CiAgICAgICAgICAgICAgICAqZXJyb3IgPSBTTk1QRVJSX1VTTV9OT1RJTlRJTUVXSU5ET1c7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgLyogT2xkLCBidXQgYWNjZXB0YWJsZSAqLwoKICAgICAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKCiAgICAgICAgLyoKICAgICAgICAgKiBNZXNzYWdlIGlzIG9rLCBlaXRoZXIgYm9vdHMgaGFzIGJlZW4gYWR2YW5jZWQsIG9yCiAgICAgICAgICogdGltZSBpcyBncmVhdGVyIHRoYW4gYmVmb3JlIHdpdGggdGhlIHNhbWUgYm9vdHMuCiAgICAgICAgICovCgogICAgICAgIGlmIChzZXRfZW5naW5ldGltZShzZWNFbmdpbmVJRCwgc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwgVFJVRSkKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdXBkYXRpbmcgcmVtb3RlIGJvb3QvdGltZS4iKSk7CiAgICAgICAgICAgICplcnJvciA9IFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KCiAgICAgICAgKmVycm9yID0gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIEZyZXNoIG1lc3NhZ2UgYW5kIHRpbWUgdXBkYXRlZCAqLwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBsb2NhbCBvciByZW1vdGUgdGltZSByZWZlcmVuY2UuICovCgoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcygpICovCgoKCmludAp1c21fc2VjbW9kX3Byb2Nlc3NfaW5fbXNnKHN0cnVjdCBzbm1wX3NlY21vZF9pbmNvbWluZ19wYXJhbXMgKnBhcm1zKQp7CiAgICBpZiAoIXBhcm1zKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKCiAgICByZXR1cm4gdXNtX3Byb2Nlc3NfaW5fbXNnKHBhcm1zLT5tc2dQcm9jTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhNc2dTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPndob2xlTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+d2hvbGVNc2dMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNFbmdpbmVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtcy0+c2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zY29wZWRQZHVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5tYXhTaXplUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLT5zZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMtPnNlc3MsIHBhcm1zLT5tc2dfZmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fcHJvY2Vzc19pbl9tc2cKICoKICogUGFyYW1ldGVyczoKICoJKFNlZSBsaXN0IGJlbG93Li4uKQogKiAgICAgIAogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlPbiBzdWNjZXNzLgogKglTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkUKICoJU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SCiAqCVNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUgogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05FTkdJTkVJRAogKglTTk1QRVJSX1VTTV9QQVJTRUVSUk9SCiAqCVNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUUKICoJU05NUEVSUl9VU01fVU5TVVBQT1JURURTRUNVUklUWUxFVkVMCiAqCiAqCiAqIEFTU1VNRVMgc2l6ZSBvZiBkZWNyeXB0X2J1ZiB3aWxsIGFsd2F5cyBiZSA+PSBzaXplIG9mIGVuY3J5cHRlZCBzUERVLgogKgogKiBGSVggIE1lbW9yeSBsZWFrcyBpZiBzZWNTdGF0ZVJlZiBpcyBhbGxvY2F0ZWQgYW5kIGEgcmV0dXJuIG9jY3VycwogKgl3aXRob3V0IGNsZWFuaW5nIHVwLiAgTWF5IGNvbnRhaW4gc2VjcmV0cy4uLgogKi8KaW50CnVzbV9wcm9jZXNzX2luX21zZyhpbnQgbXNnUHJvY01vZGVsLCAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heE1zZ1NpemUsICAgLyogSU4gICAgIC0gVXNlZCB0byBjYWxjIG1heFNpemVSZXNwb25zZS4gICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzZWNQYXJhbXMsICAvKiBJTiAgICAgLSBCRVIgZW5jb2RlZCBzZWN1cml0eVBhcmFtZXRlcnMuICovCiAgICAgICAgICAgICAgICAgICBpbnQgc2VjTW9kZWwsICAgICAgICAvKiAoVU5VU0VEKSAqLwogICAgICAgICAgICAgICAgICAgaW50IHNlY0xldmVsLCAgICAgICAgLyogSU4gICAgIC0gQXV0aE5vUHJpdiwgYXV0aFByaXYgZXRjLiAgICAgICovCiAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB3aG9sZU1zZywgICAvKiBJTiAgICAgLSBPcmlnaW5hbCB2MyBtZXNzYWdlLiAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCB3aG9sZU1zZ0xlbiwgIC8qIElOICAgICAtIE1zZyBsZW5ndGguICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyICogc2VjRW5naW5lSUQsICAgICAgICAvKiBPVVQgICAgLSBQb2ludGVyIHNubXBFbmdpbmVJRC4gICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNlY0VuZ2luZUlETGVuLCAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICogTk9URTogTWVtb3J5IHByb3ZpZGVkIGJ5IGNhbGxlci4gICAgICAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgY2hhciAqc2VjTmFtZSwgICAgICAgLyogT1VUICAgIC0gUG9pbnRlciB0byBzZWN1cml0eU5hbWUuICAgICAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBzZWNOYW1lTGVuLCAvKiBJTi9PVVQgLSBMZW4gYXZhaWxhYmxlLCBsZW4gcmV0dXJuZWQuICAgKi8KICAgICAgICAgICAgICAgICAgIHVfY2hhciAqKiBzY29wZWRQZHUsIC8qIE9VVCAgICAtIFBvaW50ZXIgdG8gcGxhaW50ZXh0IHNjb3BlZFBkdS4gKi8KICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHNjb3BlZFBkdUxlbiwgICAgICAgLyogSU4vT1VUIC0gTGVuIGF2YWlsYWJsZSwgbGVuIHJldHVybmVkLiAgICovCiAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBtYXhTaXplUmVzcG9uc2UsICAgIC8qIE9VVCAgICAtIE1heCBzaXplIG9mIFJlc3BvbnNlIFBEVS4gICAgICAqLwogICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlY1N0YXRlUmYsICAgLyogT1VUICAgIC0gUmVmIHRvIHNlY3VyaXR5IHN0YXRlLiAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzLCAgICAgIC8qIElOICAgICAtIHNlc3Npb24gd2hpY2ggZ290IHRoZSBtZXNzYWdlICAqLwogICAgICAgICAgICAgICAgICAgdV9jaGFyIG1zZ19mbGFncykKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAgICAgLSB2MyBNZXNzYWdlIGZsYWdzLiAgICAgICAgICAgICAgKi8KICAgIHNpemVfdCAgICAgICAgICByZW1haW5pbmcgPSB3aG9sZU1zZ0xlbiAtICh1X2ludCkKICAgICAgICAoKHVfbG9uZykgKiBzZWNQYXJhbXMgLSAodV9sb25nKSAqIHdob2xlTXNnKTsKICAgIHVfaW50ICAgICAgICAgICBib290c191aW50OwogICAgdV9pbnQgICAgICAgICAgIHRpbWVfdWludDsKI2lmZGVmIEhBVkVfQUVTCiAgICB1X2ludCAgICAgICAgICAgbmV0X2Jvb3RzLCBuZXRfdGltZTsKI2VuZGlmCiAgICB1X2NoYXIgICAgICAgICAgc2lnbmF0dXJlW0JZVEVTSVpFKFVTTV9NQVhfS0VZRURIQVNIX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNpZ25hdHVyZV9sZW5ndGggPSBCWVRFU0laRShVU01fTUFYX0tFWUVESEFTSF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgIHNhbHRbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfbGVuZ3RoID0gQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCk7CiAgICB1X2NoYXIgICAgICAgICAgaXZbQllURVNJWkUoVVNNX01BWF9TQUxUX0xFTkdUSCldOwogICAgdV9pbnQgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9NQVhfU0FMVF9MRU5HVEgpOwogICAgdV9jaGFyICAgICAgICAgKmRhdGFfcHRyOwogICAgdV9jaGFyICAgICAgICAgKnZhbHVlX3B0cjsKICAgIHVfY2hhciAgICAgICAgICB0eXBlX3ZhbHVlOwogICAgdV9jaGFyICAgICAgICAgKmVuZF9vZl9vdmVyaGVhZCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXJyb3I7CiAgICBpbnQgICAgICAgICAgICAgaSwgcmMgPSAwOwogICAgc3RydWN0IHVzbVN0YXRlUmVmZXJlbmNlICoqc2VjU3RhdGVSZWYgPQogICAgICAgIChzdHJ1Y3QgdXNtU3RhdGVSZWZlcmVuY2UgKiopIHNlY1N0YXRlUmY7CgogICAgc3RydWN0IHVzbVVzZXIgKnVzZXI7CgoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgYmVndW4uLi5cbiIpKTsKCgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAqc2VjU3RhdGVSZWYgPSB1c21fbWFsbG9jX3VzbVN0YXRlUmVmZXJlbmNlKCk7CiAgICAgICAgaWYgKCpzZWNTdGF0ZVJlZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiT3V0IG9mIG1lbW9yeS5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhlICpzZWNQYXJtcyBpcyBhbiBPQ1RFVCBTVFJJTkcuCiAgICAgKiBFeHRyYWN0IHRoZSB1c2VyIG5hbWUsIGVuZ2luZSBJRCwgYW5kIHNlY3VyaXR5IGxldmVsLgogICAgICovCiAgICBpZiAoKHJjID0gdXNtX3BhcnNlX3NlY3VyaXR5X3BhcmFtZXRlcnMoc2VjUGFyYW1zLCByZW1haW5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjRW5naW5lSUQsIHNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib290c191aW50LCAmdGltZV91aW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY05hbWUsIHNlY05hbWVMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCAmc2lnbmF0dXJlX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCAmc2FsdF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfcHRyKSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJQYXJzaW5nIGZhaWxlZCAocmMgJWQpLlxuIiwgcmMpKTsKICAgICAgICBpZiAocmMgPT0gLTIpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogVGhpcyBpbmRpY2F0ZXMgYSBkZWNyeXB0aW9uRXJyb3IuICAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfU05NUElOQVNOUEFSU0VFUlJTKSA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgdG8gaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9QQVJTRUVSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBSRkMgMjU3NCBzZWN0aW9uIDguMy4yCiAgICAgKiAxKSAgSWYgdGhlIHByaXZQYXJhbWV0ZXJzIGZpZWxkIGlzIG5vdCBhbiA4LW9jdGV0IE9DVEVUIFNUUklORywKICAgICAqIHRoZW4gYW4gZXJyb3IgaW5kaWNhdGlvbiAoZGVjcnlwdGlvbkVycm9yKSBpcyByZXR1cm5lZCB0byB0aGUKICAgICAqIGNhbGxpbmcgbW9kdWxlLgogICAgICovCiAgICBpZiAoKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSAmJiAoc2FsdF9sZW5ndGggIT0gOCkpIHsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PSAKICAgICAgICAgICAgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgfQoKICAgIGlmIChzZWNMZXZlbCAhPSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVikgewogICAgICAgIC8qCiAgICAgICAgICogcHVsbCB0aGVzZSBvdXQgbm93IHNvIHJlcG9ydHMgY2FuIHVzZSB0aGVtIAogICAgICAgICAqLwogICAgICAgICpzY29wZWRQZHUgPSBkYXRhX3B0cjsKICAgICAgICAqc2NvcGVkUGR1TGVuID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CiAgICAgICAgZW5kX29mX292ZXJoZWFkID0gZGF0YV9wdHI7CiAgICB9CgogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBDYWNoZSB0aGUgbmFtZSwgZW5naW5lIElELCBhbmQgc2VjdXJpdHkgbGV2ZWwsCiAgICAgICAgICogKiBwZXIgc3RlcCAyIChzZWN0aW9uIDMuMikKICAgICAgICAgKi8KICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9uYW1lCiAgICAgICAgICAgICgqc2VjU3RhdGVSZWYsIHNlY05hbWUsICpzZWNOYW1lTGVuKSA9PSAtMSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiQ291bGRuJ3QgY2FjaGUgbmFtZS4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9lbmdpbmVfaWQKICAgICAgICAgICAgKCpzZWNTdGF0ZVJlZiwgc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIGVuZ2luZSBpZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgICAgICBpZiAodXNtX3NldF91c21TdGF0ZVJlZmVyZW5jZV9zZWNfbGV2ZWwoKnNlY1N0YXRlUmVmLCBzZWNMZXZlbCkgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHNlY3VyaXR5IGxldmVsLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBMb2NhdGUgdGhlIGVuZ2luZSBJRCByZWNvcmQuCiAgICAgKiBJZiBpdCBpcyB1bmtub3duLCB0aGVuIGVpdGhlciBjcmVhdGUgb25lIG9yIG5vdGUgdGhpcyBhcyBhbiBlcnJvci4KICAgICAqLwogICAgaWYgKChzZXNzICYmIChzZXNzLT5pc0F1dGhvcml0YXRpdmUgPT0gU05NUF9TRVNTX0FVVEhPUklUQVRJVkUgfHwKICAgICAgICAgICAgICAgICAgKHNlc3MtPmlzQXV0aG9yaXRhdGl2ZSA9PSBTTk1QX1NFU1NfVU5LTk9XTkFVVEggJiYKICAgICAgICAgICAgICAgICAgIChtc2dfZmxhZ3MgJiBTTk1QX01TR19GTEFHX1JQUlRfQklUKSkpKSB8fAogICAgICAgICghc2VzcyAmJiAobXNnX2ZsYWdzICYgU05NUF9NU0dfRkxBR19SUFJUX0JJVCkpKSB7CiAgICAgICAgaWYgKElTRU5HSU5FS05PV04oc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikgPT0gRkFMU0UpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIEVuZ2luZSBJRC5cbiIpKTsKICAgICAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTkVOR0lORUlEUykgPT0KICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9VTktOT1dORU5HSU5FSUQ7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoRU5TVVJFX0VOR0lORV9SRUNPUkQoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbikKICAgICAgICAgICAgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJDb3VsZG4ndCBlbnN1cmUgZW5naW5lIHJlY29yZC4iKSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9HRU5FUklDRVJST1I7CiAgICAgICAgfQoKICAgIH0KCgogICAgLyoKICAgICAqIExvY2F0ZSB0aGUgVXNlciByZWNvcmQuCiAgICAgKiBJZiB0aGUgdXNlci9lbmdpbmUgSUQgaXMgdW5rbm93biwgcmVwb3J0IHRoaXMgYXMgYW4gZXJyb3IuCiAgICAgKi8KICAgIGlmICgodXNlciA9IHVzbV9nZXRfdXNlcl9mcm9tX2xpc3Qoc2VjRW5naW5lSUQsICpzZWNFbmdpbmVJRExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjTmFtZSwgdXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHNlc3MgJiYgc2Vzcy0+aXNBdXRob3JpdGF0aXZlID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfU0VTU19BVVRIT1JJVEFUSVZFKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2VzcykpID8gMCA6IDEpKSkKICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVbmtub3duIFVzZXIoJXMpXG4iLCBzZWNOYW1lKSk7CiAgICAgICAgaWYgKHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1VTTVNUQVRTVU5LTk9XTlVTRVJOQU1FUykgPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fVU5LTk9XTlNFQ1VSSVRZTkFNRTsKICAgIH0KCiAgICAvKiBlbnN1cmUgdGhlIHVzZXIgaXMgYWN0aXZlICovCiAgICBpZiAodXNlci0+dXNlclN0YXR1cyAhPSBSU19BQ1RJVkUpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkF0dGVtcHQgdG8gdXNlIGFuIGluYWN0aXZlIHVzZXIuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOS05PV05TRUNVUklUWU5BTUU7CiAgICB9CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGUgc2VjdXJpdHkgbGV2ZWwgaXMgYXBwcm9wcmlhdGUuCiAgICAgKi8KCiAgICByYyA9IHVzbV9jaGVja19zZWNMZXZlbChzZWNMZXZlbCwgdXNlcik7CiAgICBpZiAoMSA9PSByYykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5zdXBwb3J0ZWQgU2VjdXJpdHkgTGV2ZWwgKCVkKS5cbiIsCiAgICAgICAgICAgICAgICAgICAgc2VjTGV2ZWwpKTsKICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljCiAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTVU5TVVBQT1JURURTRUNMRVZFTFMpID09IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCB0byBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1VOU1VQUE9SVEVEU0VDVVJJVFlMRVZFTDsKICAgIH0gZWxzZSBpZiAocmMgIT0gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVW5rbm93biBpc3N1ZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgfQoKICAgIC8qCiAgICAgKiBDaGVjayB0aGUgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgb2YgdGhlIG1lc3NhZ2UuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAoc2NfY2hlY2tfa2V5ZWRfaGFzaCh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LCB1c2VyLT5hdXRoS2V5TGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdob2xlTXNnLCB3aG9sZU1zZ0xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsIHNpZ25hdHVyZV9sZW5ndGgpCiAgICAgICAgICAgICE9IFNOTVBfRVJSX05PRVJST1IpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJWZXJpZmljYXRpb24gZmFpbGVkLlxuIikpOwogICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNXUk9OR0RJR0VTVFMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICB9CgkgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICVzXG4iLAoJCQkJdXNlci0+bmFtZSk7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU7CiAgICAgICAgfQoKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIlZlcmlmaWNhdGlvbiBzdWNjZWVkZWQuXG4iKSk7CiAgICB9CgoKICAgIC8qCiAgICAgKiBTdGVwcyAxMC0xMSAgdXNlciBpcyBhbHJlYWR5IHNldCAtIHJlbG9jYXRlZCBiZWZvcmUgdGltZWxpbmVzcyAKICAgICAqIGNoZWNrIGluIGNhc2UgaXQgZmFpbHMgLSBzdGlsbCBzYXZlIHVzZXIgZGF0YSBmb3IgcmVzcG9uc2UuCiAgICAgKgogICAgICogQ2FjaGUgdGhlIGtleXMgYW5kIHByb3RvY29sIG9pZHMsIHBlciBzdGVwIDExIChzMy4yKS4KICAgICAqLwogICAgaWYgKHNlY1N0YXRlUmVmKSB7CiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfYXV0aF9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CgogICAgICAgIGlmICh1c21fc2V0X3VzbVN0YXRlUmVmZXJlbmNlX2F1dGhfa2V5KCpzZWNTdGF0ZVJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmF1dGhLZXlMZW4pID09IC0xKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjYWNoZSBhdXRoZW50aWNhdGlvbiBrZXkuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9wcm90b2NvbCgqc2VjU3RhdGVSZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm90b2NvbExlbikgPT0KICAgICAgICAgICAgLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kgcHJvdG9jb2wuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fR0VORVJJQ0VSUk9SOwogICAgICAgIH0KCiAgICAgICAgaWYgKHVzbV9zZXRfdXNtU3RhdGVSZWZlcmVuY2VfcHJpdl9rZXkoKnNlY1N0YXRlUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdktleUxlbikgPT0gLTEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkNvdWxkbid0IGNhY2hlIHByaXZhY3kga2V5LiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX0dFTkVSSUNFUlJPUjsKICAgICAgICB9CiAgICB9CgoKICAgIC8qCiAgICAgKiBQZXJmb3JtIHRoZSB0aW1lbGluZXNzL3RpbWUgbWFuYWdlciBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGlmIChzZWNMZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRITk9QUklWCiAgICAgICAgfHwgc2VjTGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYpIHsKICAgICAgICBpZiAodXNtX2NoZWNrX2FuZF91cGRhdGVfdGltZWxpbmVzcyhzZWNFbmdpbmVJRCwgKnNlY0VuZ2luZUlETGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzX3VpbnQsIHRpbWVfdWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICB9CiAgICB9CiNpZmRlZgkJCQkJCQlMQ0RfVElNRV9TWU5DX09QVAogICAgLyoKICAgICAqIENhY2hlIHRoZSB1bmF1dGhlbnRpY2F0ZWQgdGltZSB0byB1c2UgaW4gY2FzZSB3ZSBkb24ndCBoYXZlCiAgICAgKiBhbnl0aGluZyBiZXR0ZXIgLSB0aGlzIGd1ZXNzIHdpbGwgYmUgbm8gd29yc2UgdGhhbiAoMCwwKQogICAgICogdGhhdCB3ZSBub3JtYWxseSB1c2UuCiAgICAgKi8KICAgIGVsc2UgewogICAgICAgIHNldF9lbmdpbmV0aW1lKHNlY0VuZ2luZUlELCAqc2VjRW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgYm9vdHNfdWludCwgdGltZV91aW50LCBGQUxTRSk7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTENEX1RJTUVfU1lOQ19PUFQgKi8KCgogICAgLyoKICAgICAqIElmIG5lZWRlZCwgZGVjcnlwdCB0aGUgc2NvcGVkIFBEVS4KICAgICAqLwogICAgaWYgKHNlY0xldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWKSB7CiAgICAgICAgcmVtYWluaW5nID0gd2hvbGVNc2dMZW4gLSAoZGF0YV9wdHIgLSB3aG9sZU1zZyk7CgogICAgICAgIGlmICgodmFsdWVfcHRyID0gYXNuX3BhcnNlX3NlcXVlbmNlKGRhdGFfcHRyLCAmcmVtYWluaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBU05fVU5JVkVSU0FMIHwgQVNOX1BSSU1JVElWRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFTTl9PQ1RFVF9TVFIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNyeXB0ZWQgc1BEVSIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgd2hpbGUgcGFyc2luZyBlbmNyeXB0ZWQgc1BEVS4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9TTk1QSU5BU05QQVJTRUVSUlMpID09IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfVVNNX1BBUlNFRVJST1I7CiAgICAgICAgfQoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKHVzZXItPnByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRnJvbSBSRkMyNTc0OgogICAgICAgICAgICAgKiAKICAgICAgICAgICAgICogIkJlZm9yZSBkZWNyeXB0aW9uLCB0aGUgZW5jcnlwdGVkIGRhdGEgbGVuZ3RoIGlzIHZlcmlmaWVkLgogICAgICAgICAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBPQ1RFVCBTVFJJTkcgdG8gYmUgZGVjcnlwdGVkIGlzIG5vdAogICAgICAgICAgICAgKiBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiA4IG9jdGV0cywgdGhlIGRlY3J5cHRpb24gcHJvY2VzcwogICAgICAgICAgICAgKiBpcyBoYWx0ZWQgYW5kIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBub3RlZC4iICAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAocmVtYWluaW5nICUgOCAhPSAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaXBoZXJ0ZXh0IGlzICVsdSBieXRlcywgbm90IGFuIGludGVnZXIgbXVsdGlwbGUgb2YgOCAocmVtICVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylyZW1haW5pbmcsICh1bnNpZ25lZCBsb25nKXJlbWFpbmluZyAlIDgpKTsKICAgICAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9VU01TVEFUU0RFQ1JZUFRJT05FUlJPUlMpID09CiAgICAgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgaW5jcmVtZW50IHN0YXRpc3RpYy4iKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZSgqc2VjU3RhdGVSZWYpOwogICAgICAgICAgICAgICAgKnNlY1N0YXRlUmVmID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1VTTV9ERUNSWVBUSU9ORVJST1I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IHZhbHVlX3B0cjsKCiAgICAgICAgICAgIGlmICggIXVzZXItPnByaXZLZXkgKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIk5vIHByaXZhY3kgcGFzcyBwaHJhc2UgZm9yICVzXG4iLCB1c2VyLT5zZWNOYW1lKSk7CiAgICAgICAgICAgICAgICBpZiAoc25tcF9pbmNyZW1lbnRfc3RhdGlzdGljKFNUQVRfVVNNU1RBVFNERUNSWVBUSU9ORVJST1JTKSA9PQogICAgICAgICAgICAgICAgICAgIDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIiVzXG4iLCAiRmFpbGVkIGluY3JlbWVudCBzdGF0aXN0aWMuIikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXNtX2ZyZWVfdXNtU3RhdGVSZWZlcmVuY2UoKnNlY1N0YXRlUmVmKTsKICAgICAgICAgICAgICAgICpzZWNTdGF0ZVJlZiA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYT1IgdGhlIHNhbHQgd2l0aCB0aGUgbGFzdCAoaXZfbGVuZ3RoKSBieXRlcwogICAgICAgICAgICAgKiBvZiB0aGUgcHJpdl9rZXkgdG8gb2J0YWluIHRoZSBJVi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9ERVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgaXZfbGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICBpdltpXSA9IHNhbHRbaV0gXiB1c2VyLT5wcml2S2V5W2l2X2xlbmd0aCArIGldOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgICAgIGlmIChJU1RSQU5TRk9STSh1c2VyLT5wcml2UHJvdG9jb2wsIEFFU1ByaXYpKSB7CiAgICAgICAgICAgIGl2X2xlbmd0aCA9IEJZVEVTSVpFKFVTTV9BRVNfU0FMVF9MRU5HVEgpOwogICAgICAgICAgICBuZXRfYm9vdHMgPSBudG9obChib290c191aW50KTsKICAgICAgICAgICAgbmV0X3RpbWUgPSBudG9obCh0aW1lX3VpbnQpOwogICAgICAgICAgICBtZW1jcHkoaXYsICZuZXRfYm9vdHMsIDQpOwogICAgICAgICAgICBtZW1jcHkoaXYrNCwgJm5ldF90aW1lLCA0KTsKICAgICAgICAgICAgbWVtY3B5KGl2KzgsIHNhbHQsIHNhbHRfbGVuZ3RoKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIAogICAgICAgIGlmIChzY19kZWNyeXB0KHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVzZXItPnByaXZLZXksIHVzZXItPnByaXZLZXlMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgaXYsIGl2X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9wdHIsIHJlbWFpbmluZywgKnNjb3BlZFBkdSwgc2NvcGVkUGR1TGVuKQogICAgICAgICAgICAhPSBTTk1QX0VSUl9OT0VSUk9SKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiJXNcbiIsICJGYWlsZWQgZGVjcnlwdGlvbi4iKSk7CiAgICAgICAgICAgIGlmIChzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMKICAgICAgICAgICAgICAgIChTVEFUX1VTTVNUQVRTREVDUllQVElPTkVSUk9SUykgPT0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICIlc1xuIiwgIkZhaWxlZCBpbmNyZW1lbnQgc3RhdGlzdGljLiIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOwogICAgICAgIH0KI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgICAgIGlmIChkZWJ1Z19pc190b2tlbl9yZWdpc3RlcmVkKCJ1c20vZHVtcCIpID09IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJDeXBoZXIgVGV4dCIsIHZhbHVlX3B0ciwgcmVtYWluaW5nKTsKICAgICAgICAgICAgZHVtcF9jaHVuaygidXNtL2R1bXAiLCAic2FsdCArIEVuY3J5cHRlZCBmb3JtOiIsCiAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJJViArIEVuY3J5cHRlZCBmb3JtOiIsIGl2LCBpdl9sZW5ndGgpOwogICAgICAgICAgICBkdW1wX2NodW5rKCJ1c20vZHVtcCIsICJEZWNyeXB0ZWQgY2h1bms6IiwKICAgICAgICAgICAgICAgICAgICAgICAqc2NvcGVkUGR1LCAqc2NvcGVkUGR1TGVuKTsKICAgICAgICB9CiNlbmRpZgogICAgfQogICAgLyoKICAgICAqIHNQRFUgaXMgcGxhaW50ZXh0LgogICAgICovCiAgICBlbHNlIHsKICAgICAgICAqc2NvcGVkUGR1ID0gZGF0YV9wdHI7CiAgICAgICAgKnNjb3BlZFBkdUxlbiA9IHdob2xlTXNnTGVuIC0gKGRhdGFfcHRyIC0gd2hvbGVNc2cpOwogICAgICAgIGVuZF9vZl9vdmVyaGVhZCA9IGRhdGFfcHRyOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBQRFUgZGVjcnlwdGlvbiAqLwoKCiAgICAvKgogICAgICogQ2FsY3VsYXRlIHRoZSBiaWdnZXN0IHNQRFUgZm9yIHRoZSByZXNwb25zZSAoaS5lLiwgd2hvbGUgLSBvdnJoZCkuCiAgICAgKgogICAgICogRklYICBDb3JyZWN0PyAKICAgICAqLwogICAgKm1heFNpemVSZXNwb25zZSA9IG1heE1zZ1NpemUgLSAoaW50KQogICAgICAgICgodV9sb25nKSBlbmRfb2Zfb3ZlcmhlYWQgLSAodV9sb25nKSB3aG9sZU1zZyk7CgoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVVNNIHByb2Nlc3NpbmcgY29tcGxldGVkLlxuIikpOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fcHJvY2Vzc19pbl9tc2coKSAqLwoKdm9pZAp1c21faGFuZGxlX3JlcG9ydCh2b2lkICpzZXNzcCwKICAgICAgICAgICAgICAgICAgbmV0c25tcF90cmFuc3BvcnQgKnRyYW5zcG9ydCwgbmV0c25tcF9zZXNzaW9uICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0LCBuZXRzbm1wX3BkdSAqcGR1KQp7CiAgICAvKgogICAgICogaGFuZGxlIHJlcG9ydGFibGUgZXJyb3JzIAogICAgICovCgogICAgLyogdGhpcyB3aWxsIGdldCBpbiBvdXIgd2F5ICovCiAgICB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZShwZHUtPnNlY3VyaXR5U3RhdGVSZWYpOwogICAgcGR1LT5zZWN1cml0eVN0YXRlUmVmID0gTlVMTDsKCiAgICBzd2l0Y2ggKHJlc3VsdCkgewogICAgY2FzZSBTTk1QRVJSX1VTTV9BVVRIRU5USUNBVElPTkZBSUxVUkU6CiAgICB7CiAgICAgICAgaW50IHJlcyA9IHNlc3Npb24tPnNfc25tcF9lcnJubzsKICAgICAgICBzZXNzaW9uLT5zX3NubXBfZXJybm8gPSByZXN1bHQ7CiAgICAgICAgaWYgKHNlc3Npb24tPmNhbGxiYWNrKSB7CiAgICAgICAgICAgIHNlc3Npb24tPmNhbGxiYWNrKE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgcGR1LT5yZXFpZCwgcGR1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jYWxsYmFja19tYWdpYyk7CiAgICAgICAgfQogICAgICAgIHNlc3Npb24tPnNfc25tcF9lcnJubyA9IHJlczsKICAgIH0gIAogICAgLyogZmFsbHRocm91Z2ggKi8KICAgIGNhc2UgU05NUEVSUl9VU01fVU5LTk9XTkVOR0lORUlEOgogICAgY2FzZSBTTk1QRVJSX1VTTV9VTktOT1dOU0VDVVJJVFlOQU1FOgogICAgY2FzZSBTTk1QRVJSX1VTTV9VTlNVUFBPUlRFRFNFQ1VSSVRZTEVWRUw6CiAgICBjYXNlIFNOTVBFUlJfVVNNX05PVElOVElNRVdJTkRPVzoKICAgIGNhc2UgU05NUEVSUl9VU01fREVDUllQVElPTkVSUk9SOgoKICAgICAgICBpZiAoU05NUF9DTURfQ09ORklSTUVEKHBkdS0+Y29tbWFuZCkgfHwKICAgICAgICAgICAgKHBkdS0+Y29tbWFuZCA9PSAwCiAgICAgICAgICAgICAmJiAocGR1LT5mbGFncyAmIFNOTVBfTVNHX0ZMQUdfUlBSVF9CSVQpKSkgewogICAgICAgICAgICBuZXRzbm1wX3BkdSAgICAqcGR1MjsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZsYWdzID0gcGR1LT5mbGFnczsKCiAgICAgICAgICAgIHBkdS0+ZmxhZ3MgfD0gVUNEX01TR19GTEFHX0ZPUkNFX1BEVV9DT1BZOwogICAgICAgICAgICBwZHUyID0gc25tcF9jbG9uZV9wZHUocGR1KTsKICAgICAgICAgICAgcGR1LT5mbGFncyA9IHBkdTItPmZsYWdzID0gZmxhZ3M7CiAgICAgICAgICAgIHNubXB2M19tYWtlX3JlcG9ydChwZHUyLCByZXN1bHQpOwogICAgICAgICAgICBpZiAoMCA9PSBzbm1wX3Nlc3Nfc2VuZChzZXNzcCwgcGR1MikpIHsKICAgICAgICAgICAgICAgIHNubXBfZnJlZV9wZHUocGR1Mik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVE9ETzogaW5kaWNhdGUgZXJyb3IgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0gICAgICAgCn0Kdm9pZAppbml0X3VzbSh2b2lkKQp7CiAgICBzdHJ1Y3Qgc25tcF9zZWNtb2RfZGVmICpkZWY7CgogICAgREVCVUdNU0dUTCgoImluaXRfdXNtIiwgInVuaXRfdXNtOiAlbHUgJWx1XG4iLCB1c21Ob1ByaXZQcm90b2NvbFswXSwKICAgICAgICAgICAgICAgIHVzbU5vUHJpdlByb3RvY29sWzFdKSk7CgogICAgc2NfaW5pdCgpOyAgICAgICAgICAgICAgICAgIC8qIGluaXRhbGl6ZSBzY2FwaSBjb2RlICovCgogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhIHNlY3VyaXR5IHNlcnZpY2UgCiAgICAgKi8KICAgIGRlZiA9IFNOTVBfTUFMTE9DX1NUUlVDVChzbm1wX3NlY21vZF9kZWYpOwogICAgaWYgKGRlZiA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIC8qCiAgICAgKiBYWFg6IGRlZi0+aW5pdF9zZXNzX3NlY21vZCBtb3ZlIHN0dWZmIGZyb20gc25tcF9hcGkuYyAKICAgICAqLwogICAgZGVmLT5lbmNvZGVfcmV2ZXJzZSA9IHVzbV9zZWNtb2RfcmdlbmVyYXRlX291dF9tc2c7CiAgICBkZWYtPmVuY29kZV9mb3J3YXJkID0gdXNtX3NlY21vZF9nZW5lcmF0ZV9vdXRfbXNnOwogICAgZGVmLT5kZWNvZGUgPSB1c21fc2VjbW9kX3Byb2Nlc3NfaW5fbXNnOwogICAgZGVmLT5wZHVfZnJlZV9zdGF0ZV9yZWYgPSB1c21fZnJlZV91c21TdGF0ZVJlZmVyZW5jZTsKICAgIGRlZi0+aGFuZGxlX3JlcG9ydCA9IHVzbV9oYW5kbGVfcmVwb3J0OwogICAgcmVnaXN0ZXJfc2VjX21vZChVU01fU0VDX01PREVMX05VTUJFUiwgInVzbSIsIGRlZik7CgogICAgc25tcF9yZWdpc3Rlcl9jYWxsYmFjayhTTk1QX0NBTExCQUNLX0xJQlJBUlksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfQ0FMTEJBQ0tfUE9TVF9QUkVNSUJfUkVBRF9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfdXNtX3Bvc3RfY29uZmlnLCBOVUxMKTsKCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9DQUxMQkFDS19TSFVURE9XTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVpbml0X3VzbV9wb3N0X2NvbmZpZywgTlVMTCk7CgogICAgc25tcF9yZWdpc3Rlcl9jYWxsYmFjayhTTk1QX0NBTExCQUNLX0xJQlJBUlksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfQ0FMTEJBQ0tfU0hVVERPV04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfZW5naW5lSUQsIE5VTEwpOwoKfQoKdm9pZAppbml0X3VzbV9jb25mKGNvbnN0IGNoYXIgKmFwcCkKewogICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoYXBwLCAidXNtVXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21fcGFyc2VfY29uZmlnX3VzbVVzZXIsIE5VTEwsIE5VTEwpOwogICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoYXBwLCAiY3JlYXRlVXNlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21fcGFyc2VfY3JlYXRlX3VzbVVzZXIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUgWy1lIEVOR0lORUlEXSAoTUQ1fFNIQSkgYXV0aHBhc3NwaHJhc2UgW0RFUyBbcHJpdnBhc3NwaHJhc2VdXSIpOwoKICAgIC8qCiAgICAgKiB3ZSBuZWVkIHRvIGJlIGNhbGxlZCBiYWNrIGxhdGVyIAogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19TVE9SRV9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1c21fc3RvcmVfdXNlcnMsIE5VTEwpOwp9CgovKgogKiBpbml0aWFsaXphdGlvbnMgZm9yIHRoZSBVU00uCiAqCiAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIChlbmdpbmVpZCkgY29uZmlndXJhdGlvbiBmaWxlcyBoYXZlIGJlZW4gcmVhZC4KICoKICogU2V0ICJhcmJpdHJhcnkiIHBvcnRpb24gb2Ygc2FsdCB0byBhIHJhbmRvbSBudW1iZXIuCiAqLwppbnQKaW5pdF91c21fcG9zdF9jb25maWcoaW50IG1ham9yaWQsIGludCBtaW5vcmlkLCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgc2l6ZV90ICAgICAgICAgIHNhbHRfaW50ZWdlcl9sZW4gPSBzaXplb2Yoc2FsdF9pbnRlZ2VyKTsKCiAgICBpZiAoc2NfcmFuZG9tKCh1X2NoYXIgKikgJiBzYWx0X2ludGVnZXIsICZzYWx0X2ludGVnZXJfbGVuKSAhPQogICAgICAgIFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAic2NfcmFuZG9tKCkgZmFpbGVkOiB1c2luZyB0aW1lKCkgYXMgc2FsdC5cbiIpKTsKICAgICAgICBzYWx0X2ludGVnZXIgPSAodV9pbnQpIHRpbWUoTlVMTCk7CiAgICB9CgojaWZkZWYgSEFWRV9BRVMKICAgIHNhbHRfaW50ZWdlcl9sZW4gPSBzaXplb2YgKHNhbHRfaW50ZWdlcjY0XzEpOwogICAgaWYgKHNjX3JhbmRvbSgodV9jaGFyICopICYgc2FsdF9pbnRlZ2VyNjRfMSwgJnNhbHRfaW50ZWdlcl9sZW4pICE9CiAgICAgICAgU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJzY19yYW5kb20oKSBmYWlsZWQ6IHVzaW5nIHRpbWUoKSBhcyBhZXMxIHNhbHQuXG4iKSk7CiAgICAgICAgc2FsdF9pbnRlZ2VyNjRfMSA9ICh1X2ludCkgdGltZShOVUxMKTsKICAgIH0KICAgIHNhbHRfaW50ZWdlcl9sZW4gPSBzaXplb2YgKHNhbHRfaW50ZWdlcjY0XzEpOwogICAgaWYgKHNjX3JhbmRvbSgodV9jaGFyICopICYgc2FsdF9pbnRlZ2VyNjRfMiwgJnNhbHRfaW50ZWdlcl9sZW4pICE9CiAgICAgICAgU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJzY19yYW5kb20oKSBmYWlsZWQ6IHVzaW5nIHRpbWUoKSBhcyBhZXMyIHNhbHQuXG4iKSk7CiAgICAgICAgc2FsdF9pbnRlZ2VyNjRfMiA9ICh1X2ludCkgdGltZShOVUxMKTsKICAgIH0KI2VuZGlmCiAgICAKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBub05hbWVVc2VyID0gdXNtX2NyZWF0ZV9pbml0aWFsX3VzZXIoIiIsIHVzbUhNQUNNRDVBdXRoUHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNLAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21ERVNQcml2UHJvdG9jb2wsCiNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtQUVTUHJpdlByb3RvY29sLAojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pOwojZWxzZQogICAgbm9OYW1lVXNlciA9IHVzbV9jcmVhdGVfaW5pdGlhbF91c2VyKCIiLCB1c21ITUFDU0hBMUF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0sCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbURFU1ByaXZQcm90b2NvbCwKI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c21BRVNQcml2UHJvdG9jb2wsCiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSk7CiNlbmRpZgoKICAgIGlmICggbm9OYW1lVXNlciApIHsKICAgICAgICBTTk1QX0ZSRUUobm9OYW1lVXNlci0+ZW5naW5lSUQpOwogICAgICAgIG5vTmFtZVVzZXItPmVuZ2luZUlETGVuID0gMDsKICAgIH0KCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBpbml0X3VzbV9wb3N0X2NvbmZpZygpICovCgppbnQKZGVpbml0X3VzbV9wb3N0X2NvbmZpZyhpbnQgbWFqb3JpZCwgaW50IG1pbm9yaWQsIHZvaWQgKnNlcnZlcmFyZywKCQkgICAgICAgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBpZiAodXNtX2ZyZWVfdXNlcihub05hbWVVc2VyKSAhPSBOVUxMKSB7CglERUJVR01TR1RMKCgiZGVpbml0X3VzbV9wb3N0X2NvbmZpZyIsICJjb3VsZCBub3QgZnJlZSBpbml0aWFsIHVzZXJcbiIpKTsKCXJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIG5vTmFtZVVzZXIgPSBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJkZWluaXRfdXNtX3Bvc3RfY29uZmlnIiwgImluaXRpYWwgdXNlciByZW1vdmVkXG4iKSk7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBkZWluaXRfdXNtX3Bvc3RfY29uZmlnKCkgKi8KCnZvaWQKY2xlYXJfdXNlcl9saXN0KHZvaWQpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp0bXAgPSB1c2VyTGlzdCwgKm5leHQgPSBOVUxMOwoKICAgIHdoaWxlICh0bXAgIT0gTlVMTCkgewoJbmV4dCA9IHRtcC0+bmV4dDsKCXVzbV9mcmVlX3VzZXIodG1wKTsKCXRtcCA9IG5leHQ7CiAgICB9CiAgICB1c2VyTGlzdCA9IE5VTEw7Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fY2hlY2tfc2VjTGV2ZWwKICoKICogUGFyYW1ldGVyczoKICoJIGxldmVsCiAqCSp1c2VyCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJT24gc3VjY2VzcywKICoJLTEJT3RoZXJ3aXNlLgogKgogKiBDaGVja3MgdGhhdCBhIGdpdmVuIHNlY3VyaXR5IGxldmVsIGlzIHZhbGlkIGZvciBhIGdpdmVuIHVzZXIuCiAqLwppbnQKdXNtX2NoZWNrX3NlY0xldmVsKGludCBsZXZlbCwgc3RydWN0IHVzbVVzZXIgKnVzZXIpCnsKCiAgICBpZiAodXNlci0+dXNlclN0YXR1cyAhPSBSU19BQ1RJVkUpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgIERFQlVHTVNHVEwoKCJjb21wYXJleCIsICJDb21wYXJpbmc6ICVsdSAlbHUgIiwgdXNtTm9Qcml2UHJvdG9jb2xbMF0sCiAgICAgICAgICAgICAgICB1c21Ob1ByaXZQcm90b2NvbFsxXSkpOwogICAgREVCVUdNU0dPSUQoKCJjb21wYXJleCIsIHVzbU5vUHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgIHNpemVvZih1c21Ob1ByaXZQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkpOwogICAgREVCVUdNU0coKCJjb21wYXJleCIsICJcbiIpKTsKICAgIGlmIChsZXZlbCA9PSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVgogICAgICAgICYmIChuZXRzbm1wX29pZF9lcXVhbHModXNlci0+cHJpdlByb3RvY29sLCB1c2VyLT5wcml2UHJvdG9jb2xMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNtTm9Qcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpKSA9PQogICAgICAgICAgICAwKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiTGV2ZWw6ICVkXG4iLCBsZXZlbCkpOwogICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiVXNlciAoJXMpIEF1dGggUHJvdG9jb2w6ICIsIHVzZXItPm5hbWUpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiLCBVc2VyIFByaXYgUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIHVzZXItPnByaXZQcm90b2NvbCwgdXNlci0+cHJpdlByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiXG4iKSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoKGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWCiAgICAgICAgIHx8IGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVYpCiAgICAgICAgJiYKICAgICAgICAobmV0c25tcF9vaWRfZXF1YWxzCiAgICAgICAgICh1c2VyLT5hdXRoUHJvdG9jb2wsIHVzZXItPmF1dGhQcm90b2NvbExlbiwgdXNtTm9BdXRoUHJvdG9jb2wsCiAgICAgICAgICBzaXplb2YodXNtTm9BdXRoUHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpID09IDApKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJMZXZlbDogJWRcbiIsIGxldmVsKSk7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJVc2VyICglcykgQXV0aCBQcm90b2NvbDogIiwgdXNlci0+bmFtZSkpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgdXNlci0+YXV0aFByb3RvY29sLCB1c2VyLT5hdXRoUHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICIsIFVzZXIgUHJpdiBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgdXNlci0+cHJpdlByb3RvY29sLCB1c2VyLT5wcml2UHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICJcbiIpKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9jaGVja19zZWNMZXZlbCgpICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fY2hlY2tfc2VjTGV2ZWxfdnNfcHJvdG9jb2xzCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBsZXZlbAogKgkqYXV0aFByb3RvY29sCiAqCSBhdXRoUHJvdG9jb2xMZW4KICoJKnByaXZQcm90b2NvbAogKgkgcHJpdlByb3RvY29sTGVuCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJT24gc3VjY2VzcywKICoJMQlPdGhlcndpc2UuCiAqCiAqIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggZXhwbGljaXRseSBuYW1lZCB0cmFuc2Zvcm0gdHlwZXMgaW5zdGVhZCBvZiB0YWtpbmcKICogZnJvbSB0aGUgdXNtVXNlciBzdHJ1Y3R1cmUuCiAqLwppbnQKdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scyhpbnQgbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogYXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfaW50IGF1dGhQcm90b2NvbExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBwcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgcHJpdlByb3RvY29sTGVuKQp7CgogICAgaWYgKGxldmVsID09IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWCiAgICAgICAgJiYKICAgICAgICAobmV0c25tcF9vaWRfZXF1YWxzCiAgICAgICAgIChwcml2UHJvdG9jb2wsIHByaXZQcm90b2NvbExlbiwgdXNtTm9Qcml2UHJvdG9jb2wsCiAgICAgICAgICBzaXplb2YodXNtTm9Qcml2UHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpID09IDApKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJMZXZlbDogJWRcbiIsIGxldmVsKSk7CiAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJBdXRoIFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCBhdXRoUHJvdG9jb2wsIGF1dGhQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIiwgUHJpdiBQcm90b2NvbDogIikpOwogICAgICAgIERFQlVHTVNHT0lEKCgidXNtIiwgcHJpdlByb3RvY29sLCBwcml2UHJvdG9jb2xMZW4pKTsKICAgICAgICBERUJVR01TRygoInVzbSIsICJcbiIpKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGlmICgobGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVYKICAgICAgICAgfHwgbGV2ZWwgPT0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVikKICAgICAgICAmJgogICAgICAgIChuZXRzbm1wX29pZF9lcXVhbHMKICAgICAgICAgKGF1dGhQcm90b2NvbCwgYXV0aFByb3RvY29sTGVuLCB1c21Ob0F1dGhQcm90b2NvbCwKICAgICAgICAgIHNpemVvZih1c21Ob0F1dGhQcm90b2NvbCkgLyBzaXplb2Yob2lkKSkgPT0gMCkpIHsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkxldmVsOiAlZFxuIiwgbGV2ZWwpKTsKICAgICAgICBERUJVR01TR1RMKCgidXNtIiwgIkF1dGggUHJvdG9jb2w6ICIpKTsKICAgICAgICBERUJVR01TR09JRCgoInVzbSIsIGF1dGhQcm90b2NvbCwgYXV0aFByb3RvY29sTGVuKSk7CiAgICAgICAgREVCVUdNU0coKCJ1c20iLCAiLCBQcml2IFByb3RvY29sOiAiKSk7CiAgICAgICAgREVCVUdNU0dPSUQoKCJ1c20iLCBwcml2UHJvdG9jb2wsIHByaXZQcm90b2NvbExlbikpOwogICAgICAgIERFQlVHTVNHKCgidXNtIiwgIlxuIikpOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX2NoZWNrX3NlY0xldmVsX3ZzX3Byb3RvY29scygpICovCgoKCgovKgogKiB1c21fZ2V0X3VzZXIoKTogUmV0dXJucyBhIHVzZXIgZnJvbSB1c2VyTGlzdCBiYXNlZCBvbiB0aGUgZW5naW5lSUQsCiAqIGVuZ2luZUlETGVuIGFuZCBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgdXNlci4gCiAqLwoKc3RydWN0IHVzbVVzZXIgKgp1c21fZ2V0X3VzZXIodV9jaGFyICogZW5naW5lSUQsIHNpemVfdCBlbmdpbmVJRExlbiwgY2hhciAqbmFtZSkKewogICAgREVCVUdNU0dUTCgoInVzbSIsICJnZXR0aW5nIHVzZXIgJXNcbiIsIG5hbWUpKTsKICAgIHJldHVybiB1c21fZ2V0X3VzZXJfZnJvbV9saXN0KGVuZ2luZUlELCBlbmdpbmVJRExlbiwgbmFtZSwgdXNlckxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKfQoKc3RydWN0IHVzbVVzZXIgKgp1c21fZ2V0X3VzZXJfZnJvbV9saXN0KHVfY2hhciAqIGVuZ2luZUlELCBzaXplX3QgZW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwgc3RydWN0IHVzbVVzZXIgKnB1c2VyTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2RlZmF1bHQpCnsKICAgIHN0cnVjdCB1c21Vc2VyICpwdHI7CiAgICBjaGFyICAgICAgICAgICAgbm9OYW1lW10gPSAiIjsKICAgIGlmIChuYW1lID09IE5VTEwpCiAgICAgICAgbmFtZSA9IG5vTmFtZTsKICAgIGZvciAocHRyID0gcHVzZXJMaXN0OyBwdHIgIT0gTlVMTDsgcHRyID0gcHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKHB0ci0+bmFtZSAmJiAhc3RyY21wKHB0ci0+bmFtZSwgbmFtZSkpIHsKICAgICAgICAgIERFQlVHTVNHVEwoKCJ1c20iLCAibWF0Y2ggb24gdXNlciAlc1xuIiwgcHRyLT5uYW1lKSk7CiAgICAgICAgICBpZiAocHRyLT5lbmdpbmVJRExlbiA9PSBlbmdpbmVJRExlbiAmJgogICAgICAgICAgICAoKHB0ci0+ZW5naW5lSUQgPT0gTlVMTCAmJiBlbmdpbmVJRCA9PSBOVUxMKSB8fAogICAgICAgICAgICAgKHB0ci0+ZW5naW5lSUQgIT0gTlVMTCAmJiBlbmdpbmVJRCAhPSBOVUxMICYmCiAgICAgICAgICAgICAgbWVtY21wKHB0ci0+ZW5naW5lSUQsIGVuZ2luZUlELCBlbmdpbmVJRExlbikgPT0gMCkpKQogICAgICAgICAgICByZXR1cm4gcHRyOwogICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJubyBtYXRjaCBvbiBlbmdpbmVJRCAoIikpOwogICAgICAgICAgaWYgKGVuZ2luZUlEKSB7CiAgICAgICAgICAgICAgREVCVUdNU0dIRVgoKCJ1c20iLCBlbmdpbmVJRCwgZW5naW5lSURMZW4pKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsICJFbXB0eSBFbmdpbmVJRCIpKTsKICAgICAgICAgIH0KICAgICAgICAgIERFQlVHTVNHKCgidXNtIiwgIilcbiIpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIHJldHVybiAiIiB1c2VyIHVzZWQgdG8gZmFjaWxpdGF0ZSBlbmdpbmVJRCBkaXNjb3ZlcnkgCiAgICAgKi8KICAgIGlmICh1c2VfZGVmYXVsdCAmJiAhc3RyY21wKG5hbWUsICIiKSkKICAgICAgICByZXR1cm4gbm9OYW1lVXNlcjsKICAgIHJldHVybiBOVUxMOwp9CgovKgogKiB1c21fYWRkX3VzZXIoKTogQWRkJ3MgYSB1c2VyIHRvIHRoZSB1c2VyTGlzdCwgc29ydGVkIGJ5IHRoZQogKiBlbmdpbmVJRExlbmd0aCB0aGVuIHRoZSBlbmdpbmVJRCB0aGVuIHRoZSBuYW1lIGxlbmd0aCB0aGVuIHRoZSBuYW1lCiAqIHRvIGZhY2lsaXRhdGUgZ2V0TmV4dCBjYWxscyBvbiBhIHVzbVVzZXIgdGFibGUgd2hpY2ggaXMgaW5kZXhlZCBieQogKiB0aGVzZSB2YWx1ZXMuCiAqIAogKiByZXR1cm5zIHRoZSBoZWFkIG9mIHRoZSBsaXN0ICh3aGljaCBjb3VsZCBjaGFuZ2UgZHVlIHRvIHRoaXMgYWRkKS4KICovCgpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9hZGRfdXNlcihzdHJ1Y3QgdXNtVXNlciAqdXNlcikKewogICAgc3RydWN0IHVzbVVzZXIgKnVwdHI7CiAgICB1cHRyID0gdXNtX2FkZF91c2VyX3RvX2xpc3QodXNlciwgdXNlckxpc3QpOwogICAgaWYgKHVwdHIgIT0gTlVMTCkKICAgICAgICB1c2VyTGlzdCA9IHVwdHI7CiAgICByZXR1cm4gdXB0cjsKfQoKc3RydWN0IHVzbVVzZXIgKgp1c21fYWRkX3VzZXJfdG9fbGlzdChzdHJ1Y3QgdXNtVXNlciAqdXNlciwgc3RydWN0IHVzbVVzZXIgKnB1c2VyTGlzdCkKewogICAgc3RydWN0IHVzbVVzZXIgKm5wdHIsICpwcHRyLCAqb3B0cjsKCiAgICAvKgogICAgICogbG9vcCB0aHJvdWdoIHB1c2VyTGlzdCB0aWxsIHdlIGZpbmQgdGhlIHByb3Blciwgc29ydGVkIHBsYWNlIHRvCiAgICAgKiBpbnNlcnQgdGhlIG5ldyB1c2VyIAogICAgICovCiAgICAvKiBYWFggLSBob3cgdG8gaGFuZGxlIGEgTlVMTCB1c2VyLT5uYW1lID8/ICovCiAgICAvKiBYWFggLSBzaW1pbGFybHkgZm9yIGEgTlVMTCBucHRyLT5uYW1lID8/ICovCiAgICBmb3IgKG5wdHIgPSBwdXNlckxpc3QsIHBwdHIgPSBOVUxMOyBucHRyICE9IE5VTEw7CiAgICAgICAgIHBwdHIgPSBucHRyLCBucHRyID0gbnB0ci0+bmV4dCkgewogICAgICAgIGlmIChucHRyLT5lbmdpbmVJRExlbiA+IHVzZXItPmVuZ2luZUlETGVuKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgaWYgKHVzZXItPmVuZ2luZUlEID09IE5VTEwgJiYgbnB0ci0+ZW5naW5lSUQgIT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGlmIChucHRyLT5lbmdpbmVJRExlbiA9PSB1c2VyLT5lbmdpbmVJRExlbiAmJgogICAgICAgICAgICAobnB0ci0+ZW5naW5lSUQgIT0gTlVMTCAmJiB1c2VyLT5lbmdpbmVJRCAhPSBOVUxMICYmCiAgICAgICAgICAgICBtZW1jbXAobnB0ci0+ZW5naW5lSUQsIHVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgIHVzZXItPmVuZ2luZUlETGVuKSA+IDApKQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgaWYgKCEobnB0ci0+ZW5naW5lSUQgPT0gTlVMTCAmJiB1c2VyLT5lbmdpbmVJRCAhPSBOVUxMKSkgewogICAgICAgICAgICBpZiAobnB0ci0+ZW5naW5lSURMZW4gPT0gdXNlci0+ZW5naW5lSURMZW4gJiYKICAgICAgICAgICAgICAgICgobnB0ci0+ZW5naW5lSUQgPT0gTlVMTCAmJiB1c2VyLT5lbmdpbmVJRCA9PSBOVUxMKSB8fAogICAgICAgICAgICAgICAgIG1lbWNtcChucHRyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmVuZ2luZUlETGVuKSA9PSAwKQogICAgICAgICAgICAgICAgJiYgc3RybGVuKG5wdHItPm5hbWUpID4gc3RybGVuKHVzZXItPm5hbWUpKQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBpZiAobnB0ci0+ZW5naW5lSURMZW4gPT0gdXNlci0+ZW5naW5lSURMZW4gJiYKICAgICAgICAgICAgICAgICgobnB0ci0+ZW5naW5lSUQgPT0gTlVMTCAmJiB1c2VyLT5lbmdpbmVJRCA9PSBOVUxMKSB8fAogICAgICAgICAgICAgICAgIG1lbWNtcChucHRyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmVuZ2luZUlETGVuKSA9PSAwKQogICAgICAgICAgICAgICAgJiYgc3RybGVuKG5wdHItPm5hbWUpID09IHN0cmxlbih1c2VyLT5uYW1lKQogICAgICAgICAgICAgICAgJiYgc3RyY21wKG5wdHItPm5hbWUsIHVzZXItPm5hbWUpID4gMCkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgaWYgKG5wdHItPmVuZ2luZUlETGVuID09IHVzZXItPmVuZ2luZUlETGVuICYmCiAgICAgICAgICAgICAgICAoKG5wdHItPmVuZ2luZUlEID09IE5VTEwgJiYgdXNlci0+ZW5naW5lSUQgPT0gTlVMTCkgfHwKICAgICAgICAgICAgICAgICBtZW1jbXAobnB0ci0+ZW5naW5lSUQsIHVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5lbmdpbmVJRExlbikgPT0gMCkKICAgICAgICAgICAgICAgICYmIHN0cmxlbihucHRyLT5uYW1lKSA9PSBzdHJsZW4odXNlci0+bmFtZSkKICAgICAgICAgICAgICAgICYmIHN0cmNtcChucHRyLT5uYW1lLCB1c2VyLT5uYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdGhlIHVzZXIgaXMgYW4gZXhhY3QgbWF0Y2ggb2YgYSBwcmV2aW91cyBlbnRyeS4KICAgICAgICAgICAgICAgICAqIENyZWRlbnRpYWxzIG1heSBiZSBkaWZmZXJlbnQsIHRob3VnaCwgc28gcmVtb3ZlCiAgICAgICAgICAgICAgICAgKiB0aGUgb2xkIGVudHJ5IChhbmQgYWRkIHRoZSBuZXcgb25lKSEKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHBwdHIpIHsgLyogY2hhbmdlIHByZXYncyBuZXh0IHBvaW50ZXIgKi8KICAgICAgICAgICAgICAgICAgcHB0ci0+bmV4dCA9IG5wdHItPm5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobnB0ci0+bmV4dCkgeyAvKiBjaGFuZ2UgbmV4dCdzIHByZXYgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICBucHRyLT5uZXh0LT5wcmV2ID0gcHB0cjsKICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICBvcHRyID0gbnB0cjsKICAgICAgICAgICAgICAgIG5wdHIgPSBvcHRyLT5uZXh0OyAvKiBhZGQgbmV3IHVzZXIgYXQgdGhpcyBwb3NpdGlvbiAqLwogICAgICAgICAgICAgICAgLyogZnJlZSB0aGUgb2xkIHVzZXIgKi8KICAgICAgICAgICAgICAgIG9wdHItPm5leHQ9TlVMTDsKICAgICAgICAgICAgICAgIG9wdHItPnByZXY9TlVMTDsKICAgICAgICAgICAgICAgIHVzbV9mcmVlX3VzZXIob3B0cik7IAogICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5ldyB1c2VyIHdpbGwgYmUgYWRkZWQgYmVsb3cgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogbnB0ciBzaG91bGQgbm93IHBvaW50IHRvIHRoZSB1c2VyIHRoYXQgd2UgbmVlZCB0byBhZGQgb3Vyc2VsdmVzCiAgICAgKiBpbiBmcm9udCBvZiwgYW5kIHBwdHIgc2hvdWxkIGJlIG91ciBuZXcgJ3ByZXYnLiAKICAgICAqLwoKICAgIC8qCiAgICAgKiBjaGFuZ2Ugb3VyIHBvaW50ZXJzIAogICAgICovCiAgICB1c2VyLT5wcmV2ID0gcHB0cjsKICAgIHVzZXItPm5leHQgPSBucHRyOwoKICAgIC8qCiAgICAgKiBjaGFuZ2UgdGhlIG5leHQncyBwcmV2IHBvaW50ZXIgCiAgICAgKi8KICAgIGlmICh1c2VyLT5uZXh0KQogICAgICAgIHVzZXItPm5leHQtPnByZXYgPSB1c2VyOwoKICAgIC8qCiAgICAgKiBjaGFuZ2UgdGhlIHByZXYncyBuZXh0IHBvaW50ZXIgCiAgICAgKi8KICAgIGlmICh1c2VyLT5wcmV2KQogICAgICAgIHVzZXItPnByZXYtPm5leHQgPSB1c2VyOwoKICAgIC8qCiAgICAgKiByZXdpbmQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgYW5kIHJldHVybiBpdCAoc2luY2UgdGhlIG5ldyBoZWFkCiAgICAgKiBjb3VsZCBiZSB1cywgd2UgbmVlZCB0byBub3RpZnkgdGhlIGFib3ZlIHJvdXRpbmUgd2hvIHRoZSBoZWFkIG5vdyBpcy4gCiAgICAgKi8KICAgIGZvciAocHB0ciA9IHVzZXI7IHBwdHItPnByZXYgIT0gTlVMTDsgcHB0ciA9IHBwdHItPnByZXYpOwogICAgcmV0dXJuIHBwdHI7Cn0KCi8qCiAqIHVzbV9yZW1vdmVfdXNlcigpOiBmaW5kcyBhbmQgcmVtb3ZlcyBhIHVzZXIgZnJvbSBhIGxpc3QgCiAqLwpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9yZW1vdmVfdXNlcihzdHJ1Y3QgdXNtVXNlciAqdXNlcikKewogICAgcmV0dXJuIHVzbV9yZW1vdmVfdXNlcl9mcm9tX2xpc3QodXNlciwgJnVzZXJMaXN0KTsKfQoKc3RydWN0IHVzbVVzZXIgKgp1c21fcmVtb3ZlX3VzZXJfZnJvbV9saXN0KHN0cnVjdCB1c21Vc2VyICp1c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c21Vc2VyICoqcHB1c2VyTGlzdCkKewogICAgc3RydWN0IHVzbVVzZXIgKm5wdHIsICpwcHRyOwoKICAgIC8qCiAgICAgKiBOVUxMIHBvaW50ZXJzIGFyZW4ndCBhbGxvd2VkIAogICAgICovCiAgICBpZiAocHB1c2VyTGlzdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICgqcHB1c2VyTGlzdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBmaW5kIHRoZSB1c2VyIGluIHRoZSBsaXN0IAogICAgICovCiAgICBmb3IgKG5wdHIgPSAqcHB1c2VyTGlzdCwgcHB0ciA9IE5VTEw7IG5wdHIgIT0gTlVMTDsKICAgICAgICAgcHB0ciA9IG5wdHIsIG5wdHIgPSBucHRyLT5uZXh0KSB7CiAgICAgICAgaWYgKG5wdHIgPT0gdXNlcikKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKG5wdHIpIHsKICAgICAgICAvKgogICAgICAgICAqIHJlbW92ZSB0aGUgdXNlciBmcm9tIHRoZSBsaW5rZWQgbGlzdCAKICAgICAgICAgKi8KICAgICAgICBpZiAocHB0cikgewogICAgICAgICAgICBwcHRyLT5uZXh0ID0gbnB0ci0+bmV4dDsKICAgICAgICB9CiAgICAgICAgaWYgKG5wdHItPm5leHQpIHsKICAgICAgICAgICAgbnB0ci0+bmV4dC0+cHJldiA9IHBwdHI7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIHVzZXIgZGlkbid0IGV4aXN0IAogICAgICAgICAqLwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgaWYgKG5wdHIgPT0gKnBwdXNlckxpc3QpICAgIC8qIHdlJ3JlIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBuZWVkIHRvIGNoYW5nZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICogdGhlIGhlYWQgdG8gdGhlIG5leHQgdXNlciAqLwogICAgICAgICpwcHVzZXJMaXN0ID0gbnB0ci0+bmV4dDsKICAgIHJldHVybiAqcHB1c2VyTGlzdDsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgdXNtX3JlbW92ZV91c2VyX2Zyb21fbGlzdCgpICovCgoKCgovKgogKiB1c21fZnJlZV91c2VyKCk6ICBjYWxscyBmcmVlKCkgb24gYWxsIG5lZWRlZCBwYXJ0cyBvZiBzdHJ1Y3QgdXNtVXNlciBhbmQKICogdGhlIHVzZXIgaGltc2VsZi4KICogCiAqIE5vdGU6IFRoaXMgc2hvdWxkICpub3QqIGJlIGNhbGxlZCBvbiBhbiBvYmplY3QgaW4gYSBsaXN0IChJRSwKICogcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgZmlyc3QsIGFuZCBzZXQgbmV4dCBhbmQgcHJldiB0byBOVUxMKSwgYnV0CiAqIHdpbGwgdHJ5IHRvIHJlY29ubmVjdCB0aGUgbGlzdCBwaWVjZXMgYWdhaW4gaWYgaXQgaXMgY2FsbGVkIHRoaXMKICogd2F5LiAgSWYgY2FsbGVkIG9uIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCB0aGUgZW50aXJlIGxpc3Qgd2lsbCBiZQogKiBsb3N0LiAKICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX2ZyZWVfdXNlcihzdHJ1Y3QgdXNtVXNlciAqdXNlcikKewogICAgaWYgKHVzZXIgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBTTk1QX0ZSRUUodXNlci0+ZW5naW5lSUQpOwogICAgU05NUF9GUkVFKHVzZXItPm5hbWUpOwogICAgU05NUF9GUkVFKHVzZXItPnNlY05hbWUpOwogICAgU05NUF9GUkVFKHVzZXItPmNsb25lRnJvbSk7CiAgICBTTk1QX0ZSRUUodXNlci0+dXNlclB1YmxpY1N0cmluZyk7CiAgICBTTk1QX0ZSRUUodXNlci0+YXV0aFByb3RvY29sKTsKICAgIFNOTVBfRlJFRSh1c2VyLT5wcml2UHJvdG9jb2wpOwoKICAgIGlmICh1c2VyLT5hdXRoS2V5ICE9IE5VTEwpIHsKICAgICAgICBTTk1QX1pFUk8odXNlci0+YXV0aEtleSwgdXNlci0+YXV0aEtleUxlbik7CiAgICAgICAgU05NUF9GUkVFKHVzZXItPmF1dGhLZXkpOwogICAgfQoKICAgIGlmICh1c2VyLT5wcml2S2V5ICE9IE5VTEwpIHsKICAgICAgICBTTk1QX1pFUk8odXNlci0+cHJpdktleSwgdXNlci0+cHJpdktleUxlbik7CiAgICAgICAgU05NUF9GUkVFKHVzZXItPnByaXZLZXkpOwogICAgfQoKCiAgICAvKgogICAgICogRklYICBXaHkgbm90IHB1dCB0aGlzIGNoZWNrICpmaXJzdD8qCiAgICAgKi8KICAgIGlmICh1c2VyLT5wcmV2ICE9IE5VTEwpIHsgICAvKiBhY2ssIHRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLwogICAgICAgIHVzZXItPnByZXYtPm5leHQgPSB1c2VyLT5uZXh0OwogICAgfQogICAgaWYgKHVzZXItPm5leHQgIT0gTlVMTCkgewogICAgICAgIHVzZXItPm5leHQtPnByZXYgPSB1c2VyLT5wcmV2OwogICAgICAgIGlmICh1c2VyLT5wcmV2ICE9IE5VTEwpIC8qIGFjayB0aGlzIGlzIHJlYWxseSBiYWQsIGJlY2F1c2UgaXQgbWVhbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqIHdlJ2xsIGxvb3NlIHRoZSBoZWFkIG9mIHNvbWUgc3RydWN0dXJlIHRyZWUgKi8KICAgICAgICAgICAgREVCVUdNU0dUTCgoInVzbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJTZXZlcmU6IEFza2VkIHRvIGZyZWUgdGhlIGhlYWQgb2YgYSB1c21Vc2VyIHRyZWUgc29tZXdoZXJlLiIpKTsKICAgIH0KCgogICAgU05NUF9aRVJPKHVzZXIsIHNpemVvZigqdXNlcikpOwogICAgU05NUF9GUkVFKHVzZXIpOwoKICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBmb3IgY29udmVuaWVuY2UgdG8gcmV0dXJucyBmcm9tIGNhbGxpbmcgZnVuY3Rpb25zICovCgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fZnJlZV91c2VyKCkgKi8KCgoKCi8qCiAqIHRha2UgYSBnaXZlbiB1c2VyIGFuZCBjbG9uZSB0aGUgc2VjdXJpdHkgaW5mbyBpbnRvIGFub3RoZXIgCiAqLwpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9jbG9uZUZyb21fdXNlcihzdHJ1Y3QgdXNtVXNlciAqZnJvbSwgc3RydWN0IHVzbVVzZXIgKnRvKQp7CiAgICAvKgogICAgICogY29weSB0aGUgYXV0aFByb3RvY29sIG9pZCByb3cgcG9pbnRlciAKICAgICAqLwogICAgU05NUF9GUkVFKHRvLT5hdXRoUHJvdG9jb2wpOwoKICAgIGlmICgodG8tPmF1dGhQcm90b2NvbCA9CiAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKGZyb20tPmF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbS0+YXV0aFByb3RvY29sTGVuKSkgIT0gTlVMTCkKICAgICAgICB0by0+YXV0aFByb3RvY29sTGVuID0gZnJvbS0+YXV0aFByb3RvY29sTGVuOwogICAgZWxzZQogICAgICAgIHRvLT5hdXRoUHJvdG9jb2xMZW4gPSAwOwoKCiAgICAvKgogICAgICogY29weSB0aGUgYXV0aEtleSAKICAgICAqLwogICAgU05NUF9GUkVFKHRvLT5hdXRoS2V5KTsKCiAgICBpZiAoZnJvbS0+YXV0aEtleUxlbiA+IDAgJiYKICAgICAgICAodG8tPmF1dGhLZXkgPSAodV9jaGFyICopIG1hbGxvYyhmcm9tLT5hdXRoS2V5TGVuKSkKICAgICAgICAhPSBOVUxMKSB7CiAgICAgICAgdG8tPmF1dGhLZXlMZW4gPSBmcm9tLT5hdXRoS2V5TGVuOwogICAgICAgIG1lbWNweSh0by0+YXV0aEtleSwgZnJvbS0+YXV0aEtleSwgdG8tPmF1dGhLZXlMZW4pOwogICAgfSBlbHNlIHsKICAgICAgICB0by0+YXV0aEtleSA9IE5VTEw7CiAgICAgICAgdG8tPmF1dGhLZXlMZW4gPSAwOwogICAgfQoKCiAgICAvKgogICAgICogY29weSB0aGUgcHJpdlByb3RvY29sIG9pZCByb3cgcG9pbnRlciAKICAgICAqLwogICAgU05NUF9GUkVFKHRvLT5wcml2UHJvdG9jb2wpOwoKICAgIGlmICgodG8tPnByaXZQcm90b2NvbCA9CiAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKGZyb20tPnByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbS0+cHJpdlByb3RvY29sTGVuKSkgIT0gTlVMTCkKICAgICAgICB0by0+cHJpdlByb3RvY29sTGVuID0gZnJvbS0+cHJpdlByb3RvY29sTGVuOwogICAgZWxzZQogICAgICAgIHRvLT5wcml2UHJvdG9jb2xMZW4gPSAwOwoKICAgIC8qCiAgICAgKiBjb3B5IHRoZSBwcml2S2V5IAogICAgICovCiAgICBTTk1QX0ZSRUUodG8tPnByaXZLZXkpOwoKICAgIGlmIChmcm9tLT5wcml2S2V5TGVuID4gMCAmJgogICAgICAgICh0by0+cHJpdktleSA9ICh1X2NoYXIgKikgbWFsbG9jKGZyb20tPnByaXZLZXlMZW4pKQogICAgICAgICE9IE5VTEwpIHsKICAgICAgICB0by0+cHJpdktleUxlbiA9IGZyb20tPnByaXZLZXlMZW47CiAgICAgICAgbWVtY3B5KHRvLT5wcml2S2V5LCBmcm9tLT5wcml2S2V5LCB0by0+cHJpdktleUxlbik7CiAgICB9IGVsc2UgewogICAgICAgIHRvLT5wcml2S2V5ID0gTlVMTDsKICAgICAgICB0by0+cHJpdktleUxlbiA9IDA7CiAgICB9CiAgICByZXR1cm4gdG87Cn0KCi8qCiAqIHVzbV9jcmVhdGVfdXNlcih2b2lkKToKICogY3JlYXRlIGEgZGVmYXVsdCBlbXB0eSB1c2VyLCBpbnN0YW50aWF0aW5nIG9ubHkgdGhlIGF1dGgvcHJpdgogKiBwcm90b2NvbHMgdG8gbm9BdXRoIGFuZCBub1ByaXYgT0lEIHBvaW50ZXJzCiAqLwpzdHJ1Y3QgdXNtVXNlciAqCnVzbV9jcmVhdGVfdXNlcih2b2lkKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqbmV3VXNlcjsKCiAgICAvKgogICAgICogY3JlYXRlIHRoZSBuZXcgdXNlciAKICAgICAqLwogICAgbmV3VXNlciA9IChzdHJ1Y3QgdXNtVXNlciAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCB1c21Vc2VyKSk7CiAgICBpZiAobmV3VXNlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qCiAgICAgKiBmaWxsIHRoZSBhdXRoL3ByaXYgcHJvdG9jb2xzIAogICAgICovCiAgICBpZiAoKG5ld1VzZXItPmF1dGhQcm90b2NvbCA9CiAgICAgICAgIHNubXBfZHVwbGljYXRlX29iamlkKHVzbU5vQXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodXNtTm9BdXRoUHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCkpKSA9PQogICAgICAgIE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CiAgICBuZXdVc2VyLT5hdXRoUHJvdG9jb2xMZW4gPSBzaXplb2YodXNtTm9BdXRoUHJvdG9jb2wpIC8gc2l6ZW9mKG9pZCk7CgogICAgaWYgKChuZXdVc2VyLT5wcml2UHJvdG9jb2wgPQogICAgICAgICBzbm1wX2R1cGxpY2F0ZV9vYmppZCh1c21Ob1ByaXZQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpKSkgPT0KICAgICAgICBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwogICAgbmV3VXNlci0+cHJpdlByb3RvY29sTGVuID0gc2l6ZW9mKHVzbU5vUHJpdlByb3RvY29sKSAvIHNpemVvZihvaWQpOwoKICAgIC8qCiAgICAgKiBzZXQgdGhlIHN0b3JhZ2UgdHlwZSB0byBub252b2xhdGlsZSwgYW5kIHRoZSBzdGF0dXMgdG8gQUNUSVZFIAogICAgICovCiAgICBuZXdVc2VyLT51c2VyU3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIG5ld1VzZXItPnVzZXJTdGF0dXMgPSBSU19BQ1RJVkU7CiAgICByZXR1cm4gbmV3VXNlcjsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHVzbV9jbG9uZV91c2VyKCkgKi8KCgoKCi8qCiAqIHVzbV9jcmVhdGVfaW5pdGlhbF91c2VyKHZvaWQpOgogKiBjcmVhdGVzIGFuIGluaXRpYWwgdXNlciwgZmlsbGVkIHdpdGggdGhlIGRlZmF1bHRzIGRlZmluZWQgaW4gdGhlCiAqIFVTTSBkb2N1bWVudC4KICovCnN0cnVjdCB1c21Vc2VyICoKdXNtX2NyZWF0ZV9pbml0aWFsX3VzZXIoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2lkICogYXV0aFByb3RvY29sLCBzaXplX3QgYXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvaWQgKiBwcml2UHJvdG9jb2wsIHNpemVfdCBwcml2UHJvdG9jb2xMZW4pCnsKICAgIHN0cnVjdCB1c21Vc2VyICpuZXdVc2VyID0gdXNtX2NyZWF0ZV91c2VyKCk7CiAgICBpZiAobmV3VXNlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICgobmV3VXNlci0+bmFtZSA9IHN0cmR1cChuYW1lKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKCiAgICBpZiAoKG5ld1VzZXItPnNlY05hbWUgPSBzdHJkdXAobmFtZSkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIHVzbV9mcmVlX3VzZXIobmV3VXNlcik7CgogICAgaWYgKChuZXdVc2VyLT5lbmdpbmVJRCA9CiAgICAgICAgIHNubXB2M19nZW5lcmF0ZV9lbmdpbmVJRCgmbmV3VXNlci0+ZW5naW5lSURMZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiB1c21fZnJlZV91c2VyKG5ld1VzZXIpOwoKICAgIGlmICgobmV3VXNlci0+Y2xvbmVGcm9tID0gKG9pZCAqKSBtYWxsb2Moc2l6ZW9mKG9pZCkgKiAyKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKICAgIG5ld1VzZXItPmNsb25lRnJvbVswXSA9IDA7CiAgICBuZXdVc2VyLT5jbG9uZUZyb21bMV0gPSAwOwogICAgbmV3VXNlci0+Y2xvbmVGcm9tTGVuID0gMjsKCiAgICBTTk1QX0ZSRUUobmV3VXNlci0+cHJpdlByb3RvY29sKTsKICAgIGlmICgobmV3VXNlci0+cHJpdlByb3RvY29sID0gc25tcF9kdXBsaWNhdGVfb2JqaWQocHJpdlByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2UHJvdG9jb2xMZW4pKSA9PQogICAgICAgIE5VTEwpIHsKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKICAgIH0KICAgIG5ld1VzZXItPnByaXZQcm90b2NvbExlbiA9IHByaXZQcm90b2NvbExlbjsKCiAgICBTTk1QX0ZSRUUobmV3VXNlci0+YXV0aFByb3RvY29sKTsKICAgIGlmICgobmV3VXNlci0+YXV0aFByb3RvY29sID0gc25tcF9kdXBsaWNhdGVfb2JqaWQoYXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoUHJvdG9jb2xMZW4pKSA9PQogICAgICAgIE5VTEwpIHsKICAgICAgICByZXR1cm4gdXNtX2ZyZWVfdXNlcihuZXdVc2VyKTsKICAgIH0KICAgIG5ld1VzZXItPmF1dGhQcm90b2NvbExlbiA9IGF1dGhQcm90b2NvbExlbjsKCiAgICBuZXdVc2VyLT51c2VyU3RhdHVzID0gUlNfQUNUSVZFOwogICAgbmV3VXNlci0+dXNlclN0b3JhZ2VUeXBlID0gU1RfUkVBRE9OTFk7CgogICAgcmV0dXJuIG5ld1VzZXI7Cn0KCi8qCiAqIHRoaXMgaXMgYSBjYWxsYmFjayB0aGF0IGNhbiBzdG9yZSBhbGwga25vd24gdXNlcnMgYmFzZWQgb24gYQogKiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gSUQgCiAqLwppbnQKdXNtX3N0b3JlX3VzZXJzKGludCBtYWpvcklELCBpbnQgbWlub3JJRCwgdm9pZCAqc2VydmVyYXJnLCB2b2lkICpjbGllbnRhcmcpCnsKICAgIC8qCiAgICAgKiBmaWd1cmUgb3V0IG91ciBhcHBsaWNhdGlvbiBuYW1lIAogICAgICovCiAgICBjaGFyICAgICAgICAgICAqYXBwbmFtZSA9IChjaGFyICopIGNsaWVudGFyZzsKICAgIGlmIChhcHBuYW1lID09IE5VTEwpIHsKICAgICAgICBhcHBuYW1lID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJTkVUU05NUF9EU19MSUJfQVBQVFlQRSk7CiAgICB9CgogICAgLyoKICAgICAqIHNhdmUgdGhlIHVzZXIgYmFzZSAKICAgICAqLwogICAgdXNtX3NhdmVfdXNlcnMoInVzbVVzZXIiLCBhcHBuYW1lKTsKCiAgICAvKgogICAgICogbmV2ZXIgZmFpbHMgCiAgICAgKi8KICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgovKgogKiB1c21fc2F2ZV91c2VycygpOiBzYXZlcyBhIGxpc3Qgb2YgdXNlcnMgdG8gdGhlIHBlcnNpc3RlbnQgY2FjaGUgCiAqLwp2b2lkCnVzbV9zYXZlX3VzZXJzKGNvbnN0IGNoYXIgKnRva2VuLCBjb25zdCBjaGFyICp0eXBlKQp7CiAgICB1c21fc2F2ZV91c2Vyc19mcm9tX2xpc3QodXNlckxpc3QsIHRva2VuLCB0eXBlKTsKfQoKdm9pZAp1c21fc2F2ZV91c2Vyc19mcm9tX2xpc3Qoc3RydWN0IHVzbVVzZXIgKnB1c2VyTGlzdCwgY29uc3QgY2hhciAqdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlKQp7CiAgICBzdHJ1Y3QgdXNtVXNlciAqdXB0cjsKICAgIGZvciAodXB0ciA9IHB1c2VyTGlzdDsgdXB0ciAhPSBOVUxMOyB1cHRyID0gdXB0ci0+bmV4dCkgewogICAgICAgIGlmICh1cHRyLT51c2VyU3RvcmFnZVR5cGUgPT0gU1RfTk9OVk9MQVRJTEUpCiAgICAgICAgICAgIHVzbV9zYXZlX3VzZXIodXB0ciwgdG9rZW4sIHR5cGUpOwogICAgfQp9CgovKgogKiB1c21fc2F2ZV91c2VyKCk6IHNhdmVzIGEgdXNlciB0byB0aGUgcGVyc2lzdGVudCBjYWNoZSAKICovCnZvaWQKdXNtX3NhdmVfdXNlcihzdHJ1Y3QgdXNtVXNlciAqdXNlciwgY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnR5cGUpCnsKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzQwOTZdOwogICAgY2hhciAgICAgICAgICAgKmNwdHI7CgogICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CgogICAgc3ByaW50ZihsaW5lLCAiJXMgJWQgJWQgIiwgdG9rZW4sIHVzZXItPnVzZXJTdGF0dXMsCiAgICAgICAgICAgIHVzZXItPnVzZXJTdG9yYWdlVHlwZSk7CiAgICBjcHRyID0gJmxpbmVbc3RybGVuKGxpbmUpXTsgLyogdGhlIE5VTEwgKi8KICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmVuZ2luZUlETGVuKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgKHVfY2hhciAqKSB1c2VyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VyLT5uYW1lID09IE5VTEwpID8gMCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHVzZXItPm5hbWUpICsgMSk7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsICh1X2NoYXIgKikgdXNlci0+c2VjTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlci0+c2VjTmFtZSA9PSBOVUxMKSA/IDAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbih1c2VyLT5zZWNOYW1lKSArIDEpOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2JqaWQoY3B0ciwgdXNlci0+Y2xvbmVGcm9tLCB1c2VyLT5jbG9uZUZyb21MZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPSByZWFkX2NvbmZpZ19zYXZlX29iamlkKGNwdHIsIHVzZXItPmF1dGhQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXItPmF1dGhQcm90b2NvbExlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9CiAgICAgICAgcmVhZF9jb25maWdfc2F2ZV9vY3RldF9zdHJpbmcoY3B0ciwgdXNlci0+YXV0aEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5hdXRoS2V5TGVuKTsKICAgICpjcHRyKysgPSAnICc7CiAgICBjcHRyID0gcmVhZF9jb25maWdfc2F2ZV9vYmppZChjcHRyLCB1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5wcml2UHJvdG9jb2xMZW4pOwogICAgKmNwdHIrKyA9ICcgJzsKICAgIGNwdHIgPQogICAgICAgIHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPnByaXZLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+cHJpdktleUxlbik7CiAgICAqY3B0cisrID0gJyAnOwogICAgY3B0ciA9IHJlYWRfY29uZmlnX3NhdmVfb2N0ZXRfc3RyaW5nKGNwdHIsIHVzZXItPnVzZXJQdWJsaWNTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci0+dXNlclB1YmxpY1N0cmluZ0xlbik7CgogICAgcmVhZF9jb25maWdfc3RvcmUodHlwZSwgbGluZSk7Cn0KCi8qCiAqIHVzbV9wYXJzZV91c2VyKCk6IHJlYWRzIGluIGEgbGluZSBjb250YWluaW5nIGEgc2F2ZWQgdXNlciBwcm9maWxlCiAqIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGNyZWF0ZWQgc3RydWN0IHVzbVVzZXIuIAogKi8Kc3RydWN0IHVzbVVzZXIgKgp1c21fcmVhZF91c2VyKGNoYXIgKmxpbmUpCnsKICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHNpemVfdCBleHBlY3RlZF9wcml2S2V5TGVuID0gMDsKCiAgICB1c2VyID0gdXNtX2NyZWF0ZV91c2VyKCk7CiAgICBpZiAodXNlciA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHVzZXItPnVzZXJTdGF0dXMgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW4obGluZSk7CiAgICB1c2VyLT51c2VyU3RvcmFnZVR5cGUgPSBhdG9pKGxpbmUpOwogICAgbGluZSA9IHNraXBfdG9rZW4obGluZSk7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgJnVzZXItPmVuZ2luZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5lbmdpbmVJRExlbik7CgogICAgLyoKICAgICAqIHNldCB0aGUgbGNkIGVudHJ5IGZvciB0aGlzIGVuZ2luZUlEIHRvIHRoZSBtaW5pbXVtIGJvb3RzL3RpbWUKICAgICAqIHZhbHVlcyBzbyB0aGF0IGl0cyBhIGtub3duIGVuZ2luZWlkIGFuZCB3b24ndCByZXR1cm4gYSByZXBvcnQgcGR1LgogICAgICogVGhpcyBpcyBtb3N0bHkgaW1wb3J0YW50IHdoZW4gcmVjZWl2aW5nIHYzIHRyYXBzIHNvIHRoYXQgdGhlIHVzbQogICAgICogd2lsbCBhdCBsZWFzdCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZW0uIAogICAgICovCiAgICBzZXRfZW5naW5ldGltZSh1c2VyLT5lbmdpbmVJRCwgdXNlci0+ZW5naW5lSURMZW4sIDEsIDAsIDApOwoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAodV9jaGFyICoqKSAmIHVzZXItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbik7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgKHVfY2hhciAqKikgJiB1c2VyLT5zZWNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pOwogICAgU05NUF9GUkVFKHVzZXItPmNsb25lRnJvbSk7CiAgICB1c2VyLT5jbG9uZUZyb21MZW4gPSAwOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfb2JqaWQobGluZSwgJnVzZXItPmNsb25lRnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5jbG9uZUZyb21MZW4pOwoKICAgIFNOTVBfRlJFRSh1c2VyLT5hdXRoUHJvdG9jb2wpOwogICAgdXNlci0+YXV0aFByb3RvY29sTGVuID0gMDsKCiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vYmppZChsaW5lLCAmdXNlci0+YXV0aFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmF1dGhQcm90b2NvbExlbik7CiAgICBsaW5lID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcobGluZSwgJnVzZXItPmF1dGhLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmF1dGhLZXlMZW4pOwogICAgU05NUF9GUkVFKHVzZXItPnByaXZQcm90b2NvbCk7CiAgICB1c2VyLT5wcml2UHJvdG9jb2xMZW4gPSAwOwoKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29iamlkKGxpbmUsICZ1c2VyLT5wcml2UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+cHJpdlByb3RvY29sTGVuKTsKICAgIGxpbmUgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhsaW5lLCAmdXNlci0+cHJpdktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+cHJpdktleUxlbik7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgaWYgKElTVFJBTlNGT1JNKHVzZXItPnByaXZQcm90b2NvbCwgREVTUHJpdikpIHsKICAgICAgICAvKiBERVMgdXNlcyBhIDEyOCBiaXQga2V5LCA2NCBiaXRzIG9mIHdoaWNoIGlzIGEgc2FsdCAqLwogICAgICAgIGV4cGVjdGVkX3ByaXZLZXlMZW4gPSAxNjsKICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgaWYgKElTVFJBTlNGT1JNKHVzZXItPnByaXZQcm90b2NvbCwgQUVTUHJpdikpIHsKICAgICAgICBleHBlY3RlZF9wcml2S2V5TGVuID0gMTY7CiAgICB9CiNlbmRpZgogICAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAgICBpZiAodXNlci0+cHJpdktleUxlbiA+IGV4cGVjdGVkX3ByaXZLZXlMZW4pIHsKCSAgdXNlci0+cHJpdktleUxlbiA9IGV4cGVjdGVkX3ByaXZLZXlMZW47CiAgICB9CgogICAgbGluZSA9IHJlYWRfY29uZmlnX3JlYWRfb2N0ZXRfc3RyaW5nKGxpbmUsICZ1c2VyLT51c2VyUHVibGljU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT51c2VyUHVibGljU3RyaW5nTGVuKTsKICAgIHJldHVybiB1c2VyOwp9CgovKgogKiBzbm1wZC5jb25mIHBhcnNpbmcgcm91dGluZXMgCiAqLwp2b2lkCnVzbV9wYXJzZV9jb25maWdfdXNtVXNlcihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgc3RydWN0IHVzbVVzZXIgKnVwdHI7CgogICAgdXB0ciA9IHVzbV9yZWFkX3VzZXIobGluZSk7CiAgICBpZiAoIHVwdHIpCiAgICAgICAgdXNtX2FkZF91c2VyKHVwdHIpOwp9CgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiB1c21fc2V0X3Bhc3N3b3JkCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSp0b2tlbgogKgkqbGluZQogKiAgICAgIAogKgogKiBmb3JtYXQ6IHVzZXJTZXRBdXRoUGFzcyAgICAgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBwYXNzCiAqICAgICBvcjogdXNlclNldFByaXZQYXNzICAgICBzZWNuYW1lIGVuZ2luZUlETGVuIGVuZ2luZUlEIHBhc3MgCiAqICAgICBvcjogdXNlclNldEF1dGhLZXkgICAgICBzZWNuYW1lIGVuZ2luZUlETGVuIGVuZ2luZUlEIEt1TGVuIEt1CiAqICAgICBvcjogdXNlclNldFByaXZLZXkgICAgICBzZWNuYW1lIGVuZ2luZUlETGVuIGVuZ2luZUlEIEt1TGVuIEt1IAogKiAgICAgb3I6IHVzZXJTZXRBdXRoTG9jYWxLZXkgc2VjbmFtZSBlbmdpbmVJRExlbiBlbmdpbmVJRCBLdWxMZW4gS3VsCiAqICAgICBvcjogdXNlclNldFByaXZMb2NhbEtleSBzZWNuYW1lIGVuZ2luZUlETGVuIGVuZ2luZUlEIEt1bExlbiBLdWwgCiAqCiAqIHR5cGUgaXM6CTE9cGFzc3BocmFzZTsgMj1LdTsgMz1LdWwuCiAqCiAqCiAqIEFTU1VNRVMgIFBhc3N3b3JkcyBhcmUgbnVsbC10ZXJtaW5hdGVkIHByaW50YWJsZSBzdHJpbmdzLgogKi8Kdm9pZAp1c21fc2V0X3Bhc3N3b3JkKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBjaGFyICAgICAgICAgICAgbmFtZUJ1ZltTTk1QX01BWEJVRl07CiAgICB1X2NoYXIgICAgICAgICAqZW5naW5lSUQgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIGVuZ2luZUlETGVuID0gMDsKICAgIHN0cnVjdCB1c21Vc2VyICp1c2VyOwoKICAgIGNwID0gY29weV9ud29yZChsaW5lLCBuYW1lQnVmLCBzaXplb2YobmFtZUJ1ZikpOwogICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIG5hbWUgc3BlY2lmaWVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJ1c20iLCAiY29tcGFyaW5nOiAlcyBhbmQgJXNcbiIsIGNwLCBXSUxEQ0FSRFNUUklORykpOwogICAgaWYgKHN0cm5jbXAoY3AsIFdJTERDQVJEU1RSSU5HLCBzdHJsZW4oV0lMRENBUkRTVFJJTkcpKSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBtYXRjaCBhZ2FpbnN0IGFsbCBlbmdpbmVJRHMgd2Uga25vdyBhYm91dCAKICAgICAgICAgKi8KICAgICAgICBjcCA9IHNraXBfdG9rZW4oY3ApOwogICAgICAgIGZvciAodXNlciA9IHVzZXJMaXN0OyB1c2VyICE9IE5VTEw7IHVzZXIgPSB1c2VyLT5uZXh0KSB7CiAgICAgICAgICAgIGlmICh1c2VyLT5zZWNOYW1lICYmIHN0cmNtcCh1c2VyLT5zZWNOYW1lLCBuYW1lQnVmKSA9PSAwKSB7CiAgICAgICAgICAgICAgICB1c21fc2V0X3VzZXJfcGFzc3dvcmQodXNlciwgdG9rZW4sIGNwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgY3AgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhjcCwgJmVuZ2luZUlELCAmZW5naW5lSURMZW4pOwogICAgICAgIGlmIChjcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgZW5naW5lSUQgc3BlY2lmaWVyIik7CiAgICAgICAgICAgIFNOTVBfRlJFRShlbmdpbmVJRCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHVzZXIgPSB1c21fZ2V0X3VzZXIoZW5naW5lSUQsIGVuZ2luZUlETGVuLCBuYW1lQnVmKTsKICAgICAgICBpZiAodXNlciA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIm5vdCBhIHZhbGlkIHVzZXIvZW5naW5lSUQgcGFpciIpOwogICAgICAgICAgICBTTk1QX0ZSRUUoZW5naW5lSUQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHVzbV9zZXRfdXNlcl9wYXNzd29yZCh1c2VyLCB0b2tlbiwgY3ApOwogICAgICAgIFNOTVBfRlJFRShlbmdpbmVJRCk7CiAgICB9Cn0KCi8qCiAqIHVzZXMgdGhlIHJlc3Qgb2YgTElORSB0byBjb25maWd1cmUgVVNFUidzIHBhc3N3b3JkIG9mIHR5cGUgVE9LRU4gCiAqLwp2b2lkCnVzbV9zZXRfdXNlcl9wYXNzd29yZChzdHJ1Y3QgdXNtVXNlciAqdXNlciwgY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIGNoYXIgICAgICAgICAgICpjcCA9IGxpbmU7CiAgICB1X2NoYXIgICAgICAgICAqZW5naW5lSUQgPSB1c2VyLT5lbmdpbmVJRDsKICAgIHNpemVfdCAgICAgICAgICBlbmdpbmVJRExlbiA9IHVzZXItPmVuZ2luZUlETGVuOwoKICAgIHVfY2hhciAgICAgICAgKiprZXk7CiAgICBzaXplX3QgICAgICAgICAqa2V5TGVuOwogICAgdV9jaGFyICAgICAgICAgIHVzZXJLZXlbU05NUF9NQVhCVUZfU01BTExdOwogICAgc2l6ZV90ICAgICAgICAgIHVzZXJLZXlMZW4gPSBTTk1QX01BWEJVRl9TTUFMTDsKICAgIHVfY2hhciAgICAgICAgICp1c2VyS2V5UCA9IHVzZXJLZXk7CiAgICBpbnQgICAgICAgICAgICAgdHlwZSwgcmV0OwoKICAgIC8qCiAgICAgKiBSZXRyaWV2ZSB0aGUgIm9sZCIga2V5IGFuZCBzZXQgdGhlIGtleSB0eXBlLgogICAgICovCiAgICBpZiAoIXRva2VuKSB7CiAgICAgICAgcmV0dXJuOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0QXV0aFBhc3MiKSA9PSAwKSB7CiAgICAgICAga2V5ID0gJnVzZXItPmF1dGhLZXk7CiAgICAgICAga2V5TGVuID0gJnVzZXItPmF1dGhLZXlMZW47CiAgICAgICAgdHlwZSA9IDA7CiAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInVzZXJTZXRQcml2UGFzcyIpID09IDApIHsKICAgICAgICBrZXkgPSAmdXNlci0+cHJpdktleTsKICAgICAgICBrZXlMZW4gPSAmdXNlci0+cHJpdktleUxlbjsKICAgICAgICB0eXBlID0gMDsKICAgIH0gZWxzZSBpZiAoc3RyY21wKHRva2VuLCAidXNlclNldEF1dGhLZXkiKSA9PSAwKSB7CiAgICAgICAga2V5ID0gJnVzZXItPmF1dGhLZXk7CiAgICAgICAga2V5TGVuID0gJnVzZXItPmF1dGhLZXlMZW47CiAgICAgICAgdHlwZSA9IDE7CiAgICB9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInVzZXJTZXRQcml2S2V5IikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5wcml2S2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5wcml2S2V5TGVuOwogICAgICAgIHR5cGUgPSAxOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0QXV0aExvY2FsS2V5IikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5hdXRoS2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5hdXRoS2V5TGVuOwogICAgICAgIHR5cGUgPSAyOwogICAgfSBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJ1c2VyU2V0UHJpdkxvY2FsS2V5IikgPT0gMCkgewogICAgICAgIGtleSA9ICZ1c2VyLT5wcml2S2V5OwogICAgICAgIGtleUxlbiA9ICZ1c2VyLT5wcml2S2V5TGVuOwogICAgICAgIHR5cGUgPSAyOwogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIG5vIG9sZCBrZXksIG9yIHRva2VuIHdhcyBub3QgcmVjb2duaXplZCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCprZXkpIHsKICAgICAgICAvKgogICAgICAgICAqIChkZXN0cm95IGFuZCkgZnJlZSB0aGUgb2xkIGtleSAKICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoKmtleSwgMCwgKmtleUxlbik7CiAgICAgICAgU05NUF9GUkVFKCprZXkpOwogICAgfQoKICAgIGlmICh0eXBlID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIGNvbnZlcnQgdGhlIHBhc3N3b3JkIGludG8gYSBrZXkgCiAgICAgICAgICovCiAgICAgICAgaWYgKGNwID09IE5VTEwpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyB1c2VyIHBhc3N3b3JkIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmV0ID0gZ2VuZXJhdGVfS3UodXNlci0+YXV0aFByb3RvY29sLCB1c2VyLT5hdXRoUHJvdG9jb2xMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBjcCwgc3RybGVuKGNwKSwgdXNlcktleSwgJnVzZXJLZXlMZW4pOwoKICAgICAgICBpZiAocmV0ICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJzZXR0aW5nIGtleSBmYWlsZWQgKGluIHNjX2dlbkt1KCkpIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMSkgewogICAgICAgIGNwID0gcmVhZF9jb25maWdfcmVhZF9vY3RldF9zdHJpbmcoY3AsICZ1c2VyS2V5UCwgJnVzZXJLZXlMZW4pOwoKICAgICAgICBpZiAoY3AgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHVzZXIga2V5Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHR5cGUgPCAyKSB7CiAgICAgICAgKmtleSA9ICh1X2NoYXIgKikgbWFsbG9jKFNOTVBfTUFYQlVGX1NNQUxMKTsKICAgICAgICAqa2V5TGVuID0gU05NUF9NQVhCVUZfU01BTEw7CiAgICAgICAgcmV0ID0gZ2VuZXJhdGVfa3VsKHVzZXItPmF1dGhQcm90b2NvbCwgdXNlci0+YXV0aFByb3RvY29sTGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmVJRCwgZW5naW5lSURMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJLZXksIHVzZXJLZXlMZW4sICprZXksIGtleUxlbik7CiAgICAgICAgaWYgKHJldCAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigic2V0dGluZyBrZXkgZmFpbGVkIChpbiBnZW5lcmF0ZV9rdWwoKSkiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiAoZGVzdHJveSBhbmQpIGZyZWUgdGhlIG9sZCBrZXkgCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KHVzZXJLZXksIDAsIHNpemVvZih1c2VyS2V5KSk7CgogICAgfSBlbHNlIHsKICAgICAgICAvKgogICAgICAgICAqIHRoZSBrZXkgaXMgZ2l2ZW4sIGNvcHkgaXQgaW4gCiAgICAgICAgICovCiAgICAgICAgY3AgPSByZWFkX2NvbmZpZ19yZWFkX29jdGV0X3N0cmluZyhjcCwga2V5LCBrZXlMZW4pOwoKICAgICAgICBpZiAoY3AgPT0gTlVMTCkgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIGxvY2FsaXplZCB1c2VyIGtleSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB1c21fc2V0X3Bhc3N3b3JkKCkgKi8K