LyogZmlsdGVyLmMgdmVyc2lvbiAwLjcKICogY29udGllbnQgbGVzIGZpbHRyZXMgYXBwbGljYWJsZSBhIHVuIGJ1ZmZlcgogKiBjcmVhdGlvbiA6IDAxLzEwLzIwMDAKICogIC1ham91dCBkZSBzaW5GaWx0ZXIoKQogKiAgLWFqb3V0IGRlIHpvb21GaWx0ZXIoKQogKiAgLWNvcGllIGRlIHpvb21GaWx0ZXIoKSBlbiB6b29tRmlsdGVyUkdCKCksIGfpcmFudCBsZXMgMyBjb3VsZXVycwogKiAgLW9wdGltaXNhdGlvbiBkZSBzaW5GaWx0ZXIgKHV0aWxpc2FudCB1bmUgdGFibGUgZGUgc2luKQogKiAgICAgIC1hc20KICogICAgICAtb3B0aW1pc2F0aW9uIGRlIGxhIHByb2NlZHVyZSBkZSBn6W7pcmF0aW9uIGR1IGJ1ZmZlciBkZSB0cmFuc2Zvcm1hdGlvbgogKiAgICAgICAgICAgICAgbGEgdml0ZXNzZSBlc3QgbWFpbnRlbmFudCBjb21wcmlzZSBkYW5zIFswLi4xMjhdIGF1IGxpZXUgZGUgWzAuLjEwMF0KKi8KCi8qI2RlZmluZSBfREVCVUdfUElYRUw7ICovCgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSAiY29uZmlnLmgiCiNlbmRpZgoKI2luY2x1ZGUgImZpbHRlcnMuaCIKI2luY2x1ZGUgImdyYXBoaWMuaCIKI2luY2x1ZGUgImdvb21fdG9vbHMuaCIKI2luY2x1ZGUgImdvb21fY29yZS5oIgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2lmZGVmIE1NWAojZGVmaW5lIFVTRV9BU00KI2VuZGlmCiNpZmRlZiBQT1dFUlBDCiNkZWZpbmUgVVNFX0FTTQojZW5kaWYKCiNpZmRlZiBVU0VfQVNNCiNkZWZpbmUgRUZGRUNUX0RJU1RPUlMgNAojZWxzZQojZGVmaW5lIEVGRkVDVF9ESVNUT1JTIDEwCiNlbmRpZgoKCiNpZmRlZiBVU0VfQVNNCgojaWZkZWYgTU1YCmludCBtbXhfem9vbSAoKTsKZ3VpbnQzMiBtbXhfem9vbV9zaXplOwojZW5kaWYgLyogTU1YICovCgojaWZkZWYgUE9XRVJQQwpleHRlcm4gdW5zaWduZWQgaW50IHVzZUFsdGl2ZWM7CmV4dGVybiB2b2lkIHBwY196b29tICh2b2lkKTsKZXh0ZXJuIHZvaWQgcHBjX3pvb21fYWx0aXZlYyAodm9pZCk7CnVuc2lnbmVkIGludCBwcGNzaXplNDsKI2VuZGlmIC8qIFBvd2VyUEMgKi8KCgp1bnNpZ25lZCBpbnQgKmNvZWZmcyA9IDAsICpmcmVlY29lZmZzID0gMDsKZ3VpbnQzMiAqZXhwaXgxID0gMDsgICAgICAgICAgICAvKiBwb2ludGV1ciBleHBvcnRlIHZlcnMgcDEgKi8KZ3VpbnQzMiAqZXhwaXgyID0gMDsgICAgICAgICAgICAvKiBwb2ludGV1ciBleHBvcnRlIHZlcnMgcDIgKi8KZ3VpbnQzMiB6b29tX3dpZHRoOwojZW5kaWYgLyogQVNNICovCgoKc3RhdGljIGludCBmaXJzdFRpbWUgPSAxOwpzdGF0aWMgaW50IHNpbnRhYmxlWzB4ZmZmZl07Cgpab29tRmlsdGVyRGF0YSAqCnpvb21GaWx0ZXJOZXcgKHZvaWQpCnsKICBab29tRmlsdGVyRGF0YSAqemYgPSBtYWxsb2MgKHNpemVvZiAoWm9vbUZpbHRlckRhdGEpKTsKCiAgemYtPnZpdGVzc2UgPSAxMjg7CiAgemYtPnBlcnRlZGVjID0gODsKICB6Zi0+c3FydHBlcnRlID0gMTY7CiAgemYtPm1pZGRsZVggPSAxOwogIHpmLT5taWRkbGVZID0gMTsKICB6Zi0+cmV2ZXJzZSA9IDA7CiAgemYtPm1vZGUgPSBXQVZFX01PREU7CiAgemYtPmhQbGFuZUVmZmVjdCA9IDA7CiAgemYtPnZQbGFuZUVmZmVjdCA9IDA7CiAgemYtPm5vaXNpZnkgPSAwOwogIHpmLT5idWZmc2l6ZSA9IDA7CiAgemYtPnJlc194ID0gMDsKICB6Zi0+cmVzX3kgPSAwOwoKICB6Zi0+YnVmZmVyID0gTlVMTDsKICB6Zi0+ZmlyZWRlYyA9IE5VTEw7CgogIHpmLT53YXZlID0gMDsKICB6Zi0+d2F2ZXNwID0gMDsKCiAgcmV0dXJuIHpmOwp9CgovKiByZXRvdXJuZSB4Pj5zICwgZW4gdGVzdGFudCBsZSBzaWduZSBkZSB4ICovCnN0YXRpYyBpbmxpbmUgaW50ClNoaWZ0UmlnaHQgKGludCB4LCBjb25zdCB1bnNpZ25lZCBjaGFyIHMpCnsKICBpZiAoeCA8IDApCiAgICByZXR1cm4gLSgteCA+PiBzKTsKICBlbHNlCiAgICByZXR1cm4geCA+PiBzOwp9CgovKgogIGNhbGN1bGVyIHB4IGV0IHB5IGVuIGZvbmN0aW9uIGRlIHgseSxtaWRkbGVYLG1pZGRsZVkgZXQgdGhlTW9kZQogIHB4IGV0IHB5IGluZGlxdWUgbGEgbm91dmVsbGUgcG9zaXRpb24gKGVuIHNxcnRwZXJ0ZSBpZW1lIGRlIHBpeGVsKQogICh2YWxldXIgKiAxNikKKi8Kc3RhdGljIHZvaWQKY2FsY3VsYXRlUFhhbmRQWSAoR29vbURhdGEgKiBnZCwgaW50IHgsIGludCB5LCBpbnQgKnB4LCBpbnQgKnB5KQp7CiAgWm9vbUZpbHRlckRhdGEgKnpmID0gZ2QtPnpmZDsKICBpbnQgbWlkZGxlWCwgbWlkZGxlWTsKICBndWludDMyIHJlc29seSA9IHpmLT5yZXNfeTsKICBpbnQgdlBsYW5lRWZmZWN0ID0gemYtPnZQbGFuZUVmZmVjdDsKICBpbnQgaFBsYW5lRWZmZWN0ID0gemYtPmhQbGFuZUVmZmVjdDsKICBpbnQgdml0ZXNzZSA9IHpmLT52aXRlc3NlOwogIGNoYXIgdGhlTW9kZSA9IHpmLT5tb2RlOwoKICBpZiAodGhlTW9kZSA9PSBXQVRFUl9NT0RFKSB7CiAgICBpbnQgd2F2ZXNwID0gemYtPndhdmVzcDsKICAgIGludCB3YXZlID0gemYtPndhdmU7CiAgICBpbnQgeXkgPSB5ICsgUkFORCAoZ2QpICUgNCArIHdhdmUgLyAxMDsKCiAgICB5eSAtPSBSQU5EIChnZCkgJSA0OwogICAgaWYgKHl5IDwgMCkKICAgICAgeXkgPSAwOwogICAgaWYgKHl5ID49IHJlc29seSkKICAgICAgeXkgPSByZXNvbHkgLSAxOwoKICAgICpweCA9ICh4IDw8IDQpICsgemYtPmZpcmVkZWNbeXldICsgKHdhdmUgLyAxMCk7CiAgICAqcHkgPSAoeSA8PCA0KSArIDEzMiAtICgodml0ZXNzZSA8IDEzMikgPyB2aXRlc3NlIDogMTMxKTsKCiAgICB3YXZlc3AgKz0gUkFORCAoZ2QpICUgMzsKICAgIHdhdmVzcCAtPSBSQU5EIChnZCkgJSAzOwogICAgaWYgKHdhdmUgPCAtMTApCiAgICAgIHdhdmVzcCArPSAyOwogICAgaWYgKHdhdmUgPiAxMCkKICAgICAgd2F2ZXNwIC09IDI7CiAgICB3YXZlICs9ICh3YXZlc3AgLyAxMCkgKyBSQU5EIChnZCkgJSAzOwogICAgd2F2ZSAtPSBSQU5EIChnZCkgJSAzOwogICAgaWYgKHdhdmVzcCA+IDEwMCkKICAgICAgd2F2ZXNwID0gKHdhdmVzcCAqIDkpIC8gMTA7CgogICAgemYtPndhdmVzcCA9IHdhdmVzcDsKICAgIHpmLT53YXZlID0gd2F2ZTsKICB9IGVsc2UgewogICAgaW50IGRpc3Q7CiAgICByZWdpc3RlciBpbnQgdngsIHZ5OwogICAgaW50IGZ2aXRlc3NlID0gdml0ZXNzZSA8PCA0OwoKICAgIG1pZGRsZVggPSB6Zi0+bWlkZGxlWDsKICAgIG1pZGRsZVkgPSB6Zi0+bWlkZGxlWTsKCiAgICBpZiAoemYtPm5vaXNpZnkpIHsKICAgICAgeCArPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKICAgICAgeCAtPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKICAgICAgeSArPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKICAgICAgeSAtPSBSQU5EIChnZCkgJSB6Zi0+bm9pc2lmeTsKICAgIH0KCiAgICBpZiAoaFBsYW5lRWZmZWN0KQogICAgICB2eCA9ICgoeCAtIG1pZGRsZVgpIDw8IDkpICsgaFBsYW5lRWZmZWN0ICogKHkgLSBtaWRkbGVZKTsKICAgIGVsc2UKICAgICAgdnggPSAoeCAtIG1pZGRsZVgpIDw8IDk7CgogICAgaWYgKHZQbGFuZUVmZmVjdCkKICAgICAgdnkgPSAoKHkgLSBtaWRkbGVZKSA8PCA5KSArIHZQbGFuZUVmZmVjdCAqICh4IC0gbWlkZGxlWCk7CiAgICBlbHNlCiAgICAgIHZ5ID0gKHkgLSBtaWRkbGVZKSA8PCA5OwoKICAgIHN3aXRjaCAodGhlTW9kZSkgewogICAgICBjYXNlIFdBVkVfTU9ERToKICAgICAgICBkaXN0ID0KICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCiAgICAgICAgICAgIDkpICogU2hpZnRSaWdodCAodnksIDkpOwogICAgICAgIGZ2aXRlc3NlICo9CiAgICAgICAgICAgIDEwMjQgKwogICAgICAgICAgICBTaGlmdFJpZ2h0IChzaW50YWJsZVsodW5zaWduZWQgc2hvcnQpICgweGZmZmYgKiBkaXN0ICoKICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRElTVE9SUyldLCA2KTsKICAgICAgICBmdml0ZXNzZSAvPSAxMDI0OwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENSWVNUQUxfQkFMTF9NT0RFOgogICAgICAgIGRpc3QgPQogICAgICAgICAgICBTaGlmdFJpZ2h0ICh2eCwgOSkgKiBTaGlmdFJpZ2h0ICh2eCwgOSkgKyBTaGlmdFJpZ2h0ICh2eSwKICAgICAgICAgICAgOSkgKiBTaGlmdFJpZ2h0ICh2eSwgOSk7CiAgICAgICAgZnZpdGVzc2UgKz0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiAxMCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQU1VTEVUVEVfTU9ERToKICAgICAgICBkaXN0ID0KICAgICAgICAgICAgU2hpZnRSaWdodCAodngsIDkpICogU2hpZnRSaWdodCAodngsIDkpICsgU2hpZnRSaWdodCAodnksCiAgICAgICAgICAgIDkpICogU2hpZnRSaWdodCAodnksIDkpOwogICAgICAgIGZ2aXRlc3NlIC09IChkaXN0ICogRUZGRUNUX0RJU1RPUlMgPj4gNCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgU0NSVU5DSF9NT0RFOgogICAgICAgIGRpc3QgPQogICAgICAgICAgICBTaGlmdFJpZ2h0ICh2eCwgOSkgKiBTaGlmdFJpZ2h0ICh2eCwgOSkgKyBTaGlmdFJpZ2h0ICh2eSwKICAgICAgICAgICAgOSkgKiBTaGlmdFJpZ2h0ICh2eSwgOSk7CiAgICAgICAgZnZpdGVzc2UgLT0gKGRpc3QgKiBFRkZFQ1RfRElTVE9SUyA+PiA5KTsKICAgICAgICBicmVhazsKICAgIH0KICAgIGlmICh2eCA8IDApCiAgICAgICpweCA9IChtaWRkbGVYIDw8IDQpIC0gKC0odnggKiBmdml0ZXNzZSkgPj4gMTYpOwogICAgZWxzZQogICAgICAqcHggPSAobWlkZGxlWCA8PCA0KSArICgodnggKiBmdml0ZXNzZSkgPj4gMTYpOwogICAgaWYgKHZ5IDwgMCkKICAgICAgKnB5ID0gKG1pZGRsZVkgPDwgNCkgLSAoLSh2eSAqIGZ2aXRlc3NlKSA+PiAxNik7CiAgICBlbHNlCiAgICAgICpweSA9IChtaWRkbGVZIDw8IDQpICsgKCh2eSAqIGZ2aXRlc3NlKSA+PiAxNik7CiAgfQp9CgovKiNkZWZpbmUgX0RFQlVHICovCgpzdGF0aWMgaW5saW5lIHZvaWQKc2V0UGl4ZWxSR0IgKFVpbnQgKiBidWZmZXIsIFVpbnQgeCwgVWludCB5LCBDb2xvciBjLAogICAgZ3VpbnQzMiByZXNvbHgsIGd1aW50MzIgcmVzb2x5KQp7Ci8qICAgICAgICAgICAgICBidWZmZXJbIHkqV0lEVEggKyB4IF0gPSAoYy5yPDwxNil8KGMudjw8OCl8Yy5iICovCiNpZmRlZiBfREVCVUdfUElYRUwKICBpZiAoeCArIHkgKiByZXNvbHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CiAgICBmcHJpbnRmIChzdGRlcnIsICJzZXRQaXhlbCBFUlJPUiA6IGhvcnMgZHUgdGFibGVhdS4uLiAlaSwgJWlcbiIsIHgsIHkpOwogICAgLypleGl0ICgxKSA7ICovCiAgfQojZW5kaWYKCiNpZmRlZiBVU0VfREdBCiAgYnVmZmVyW3kgKiByZXNvbHggKyB4XSA9IChjLmIgPDwgMTYpIHwgKGMudiA8PCA4KSB8IGMucjsKI2Vsc2UKICBidWZmZXJbeSAqIHJlc29seCArIHhdID0gKGMuciA8PCAxNikgfCAoYy52IDw8IDgpIHwgYy5iOwojZW5kaWYKfQoKCnN0YXRpYyBpbmxpbmUgdm9pZApzZXRQaXhlbFJHQl8gKFVpbnQgKiBidWZmZXIsIFVpbnQgeCwgQ29sb3IgYywgZ3VpbnQzMiByZXNvbHgsIGd1aW50MzIgcmVzb2x5KQp7CiNpZmRlZiBfREVCVUcKICBpZiAoeCA+PSByZXNvbHggKiByZXNvbHkpIHsKICAgIHByaW50ZiAoInNldFBpeGVsIEVSUk9SIDogaG9ycyBkdSB0YWJsZWF1Li4uICVpID49ICVpKiVpICglaSlcbiIsIHgsIHJlc29seCwKICAgICAgICByZXNvbHksIHJlc29seCAqIHJlc29seSk7CiAgICBleGl0ICgxKTsKICB9CiNlbmRpZgoKI2lmZGVmIFVTRV9ER0EKICBidWZmZXJbeF0gPSAoYy5iIDw8IDE2KSB8IChjLnYgPDwgOCkgfCBjLnI7CiNlbHNlCiAgYnVmZmVyW3hdID0gKGMuciA8PCAxNikgfCAoYy52IDw8IDgpIHwgYy5iOwojZW5kaWYKfQoKCgpzdGF0aWMgaW5saW5lIHZvaWQKZ2V0UGl4ZWxSR0IgKFVpbnQgKiBidWZmZXIsIFVpbnQgeCwgVWludCB5LCBDb2xvciAqIGMsCiAgICBndWludDMyIHJlc29seCwgZ3VpbnQzMiByZXNvbHkpCnsKICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICp0bXA4OwoKI2lmZGVmIF9ERUJVRwogIGlmICh4ICsgeSAqIHJlc29seCA+PSByZXNvbHggKiByZXNvbHkpIHsKICAgIHByaW50ZiAoImdldFBpeGVsIEVSUk9SIDogaG9ycyBkdSB0YWJsZWF1Li4uICVpLCAlaVxuIiwgeCwgeSk7CiAgICBleGl0ICgxKTsKICB9CiNlbmRpZgoKI2lmZGVmIF9fQklHX0VORElBTl9fCiAgYy0+YiA9ICoodW5zaWduZWQgY2hhciAqKSAodG1wOCA9CiAgICAgICh1bnNpZ25lZCBjaGFyICopIChidWZmZXIgKyAoeCArIHkgKiByZXNvbHgpKSk7CiAgYy0+ciA9ICoodW5zaWduZWQgY2hhciAqKSAoKyt0bXA4KTsKICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOwogIGMtPmIgPSAqKHVuc2lnbmVkIGNoYXIgKikgKCsrdG1wOCk7CgojZWxzZQogIC8qIEFUVEVOVElPTiBBVSBQRVRJVCBJTkRJRU4gICovCiAgYy0+YiA9ICoodW5zaWduZWQgY2hhciAqKSAodG1wOCA9CiAgICAgICh1bnNpZ25lZCBjaGFyICopIChidWZmZXIgKyAoeCArIHkgKiByZXNvbHgpKSk7CiAgYy0+diA9ICoodW5zaWduZWQgY2hhciAqKSAoKyt0bXA4KTsKICBjLT5yID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOwovKiAgICAgICpjID0gKENvbG9yKSBidWZmZXJbeCt5KldJRFRIXSA7ICovCiNlbmRpZgp9CgoKc3RhdGljIGlubGluZSB2b2lkCmdldFBpeGVsUkdCXyAoVWludCAqIGJ1ZmZlciwgVWludCB4LCBDb2xvciAqIGMsIGd1aW50MzIgcmVzb2x4LCBndWludDMyIHJlc29seSkKewogIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnRtcDg7CgojaWZkZWYgX0RFQlVHCiAgaWYgKHggPj0gcmVzb2x4ICogcmVzb2x5KSB7CiAgICBwcmludGYgKCJnZXRQaXhlbCBFUlJPUiA6IGhvcnMgZHUgdGFibGVhdS4uLiAlaVxuIiwgeCk7CiAgICBleGl0ICgxKTsKICB9CiNlbmRpZgoKI2lmZGVmIF9fQklHX0VORElBTl9fCiAgYy0+YiA9ICoodW5zaWduZWQgY2hhciAqKSAodG1wOCA9ICh1bnNpZ25lZCBjaGFyICopIChidWZmZXIgKyB4KSk7CiAgYy0+ciA9ICoodW5zaWduZWQgY2hhciAqKSAoKyt0bXA4KTsKICBjLT52ID0gKih1bnNpZ25lZCBjaGFyICopICgrK3RtcDgpOwogIGMtPmIgPSAqKHVuc2lnbmVkIGNoYXIgKikgKCsrdG1wOCk7CgojZWxzZQogIC8qIEFUVEVOVElPTiBBVSBQRVRJVCBJTkRJRU4gICovCiAgdG1wOCA9ICh1bnNpZ25lZCBjaGFyICopIChidWZmZXIgKyB4KTsKICBjLT5iID0gKih1bnNpZ25lZCBjaGFyICopICh0bXA4KyspOwogIGMtPnYgPSAqKHVuc2lnbmVkIGNoYXIgKikgKHRtcDgrKyk7CiAgYy0+ciA9ICoodW5zaWduZWQgY2hhciAqKSAodG1wOCk7Ci8qICAgICAgKmMgPSAoQ29sb3IpIGJ1ZmZlclt4K3kqV0lEVEhdIDsgKi8KI2VuZGlmCn0KCnN0YXRpYyB2b2lkCnpvb21GaWx0ZXJTZXRSZXNvbHV0aW9uIChHb29tRGF0YSAqIGdkLCBab29tRmlsdGVyRGF0YSAqIHpmKQp7CiAgdW5zaWduZWQgc2hvcnQgdXM7CgogIGlmICh6Zi0+YnVmZnNpemUgPj0gZ2QtPmJ1ZmZzaXplKSB7CiAgICB6Zi0+cmVzX3ggPSBnZC0+cmVzb2x4OwogICAgemYtPnJlc195ID0gZ2QtPnJlc29seTsKICAgIHpmLT5taWRkbGVYID0gZ2QtPnJlc29seCAvIDI7CiAgICB6Zi0+bWlkZGxlWSA9IGdkLT5yZXNvbHkgLSAxOwoKICAgIHJldHVybjsKICB9CiNpZm5kZWYgVVNFX0FTTQogIGlmICh6Zi0+YnVmZmVyKQogICAgZnJlZSAoemYtPmJ1ZmZlcik7CiAgemYtPmJ1ZmZlciA9IDA7CiNlbHNlCiAgaWYgKGNvZWZmcykKICAgIGZyZWUgKGZyZWVjb2VmZnMpOwogIGNvZWZmcyA9IDA7CiNlbmRpZgogIHpmLT5taWRkbGVYID0gZ2QtPnJlc29seCAvIDI7CiAgemYtPm1pZGRsZVkgPSBnZC0+cmVzb2x5IC0gMTsKICB6Zi0+cmVzX3ggPSBnZC0+cmVzb2x4OwogIHpmLT5yZXNfeSA9IGdkLT5yZXNvbHk7CgogIGlmICh6Zi0+ZmlyZWRlYykKICAgIGZyZWUgKHpmLT5maXJlZGVjKTsKICB6Zi0+ZmlyZWRlYyA9IDA7CgogIHpmLT5idWZmc2l6ZSA9IGdkLT5yZXNvbHggKiBnZC0+cmVzb2x5ICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpOwoKI2lmZGVmIFVTRV9BU00KICBmcmVlY29lZmZzID0gKHVuc2lnbmVkIGludCAqKQogICAgICBtYWxsb2MgKHJlc3ggKiByZXN5ICogMiAqIHNpemVvZiAodW5zaWduZWQgaW50KSArIDEyOCk7CiAgY29lZmZzID0gKGd1aW50MzIgKikgKCgxICsgKCh1bnNpZ25lZCBpbnQpIChmcmVlY29lZmZzKSkgLyAxMjgpICogMTI4KTsKCiNlbHNlCiAgemYtPmJ1ZmZlciA9IGNhbGxvYyAoc2l6ZW9mIChndWludDMyKSwgemYtPmJ1ZmZzaXplICogNSk7CiAgemYtPnBvczEwID0gemYtPmJ1ZmZlcjsKICB6Zi0+Y1swXSA9IHpmLT5wb3MxMCArIHpmLT5idWZmc2l6ZTsKICB6Zi0+Y1sxXSA9IHpmLT5jWzBdICsgemYtPmJ1ZmZzaXplOwogIHpmLT5jWzJdID0gemYtPmNbMV0gKyB6Zi0+YnVmZnNpemU7CiAgemYtPmNbM10gPSB6Zi0+Y1syXSArIHpmLT5idWZmc2l6ZTsKI2VuZGlmCiAgemYtPmZpcmVkZWMgPSAoaW50ICopIG1hbGxvYyAoemYtPnJlc195ICogc2l6ZW9mIChpbnQpKTsKCiAgaWYgKGZpcnN0VGltZSkgewogICAgZmlyc3RUaW1lID0gMDsKCiAgICAvKiBnZW5lcmF0aW9uIGQndW5lIHRhYmxlIGRlIHNpbnVzICovCiAgICBmb3IgKHVzID0gMDsgdXMgPCAweGZmZmY7IHVzKyspIHsKICAgICAgc2ludGFibGVbdXNdID0gKGludCkgKDEwMjQuMGYgKiBzaW4gKHVzICogMiAqIDMuMzE0MTVmIC8gMHhmZmZmKSk7CiAgICB9CiAgfQoKICB7CiAgICBpbnQgbG9vcHY7CgogICAgZm9yIChsb29wdiA9IHpmLT5yZXNfeTsgbG9vcHYgIT0gMDspIHsKICAgICAgaW50IGRlY2MgPSAwOwogICAgICBpbnQgc3BkYyA9IDA7CiAgICAgIGludCBhY2NlbCA9IDA7CgogICAgICBsb29wdi0tOwogICAgICB6Zi0+ZmlyZWRlY1tsb29wdl0gPSBkZWNjOwogICAgICBkZWNjICs9IHNwZGMgLyAxMDsKICAgICAgc3BkYyArPSBSQU5EIChnZCkgJSAzOwogICAgICBzcGRjIC09IFJBTkQgKGdkKSAlIDM7CgogICAgICBpZiAoZGVjYyA+IDQpCiAgICAgICAgc3BkYyAtPSAxOwogICAgICBpZiAoZGVjYyA8IC00KQogICAgICAgIHNwZGMgKz0gMTsKCiAgICAgIGlmIChzcGRjID4gMzApCiAgICAgICAgc3BkYyA9IHNwZGMgLSBSQU5EIChnZCkgJSAzICsgYWNjZWwgLyAxMDsKICAgICAgaWYgKHNwZGMgPCAtMzApCiAgICAgICAgc3BkYyA9IHNwZGMgKyBSQU5EIChnZCkgJSAzICsgYWNjZWwgLyAxMDsKCiAgICAgIGlmIChkZWNjID4gOCAmJiBzcGRjID4gMSkKICAgICAgICBzcGRjIC09IFJBTkQgKGdkKSAlIDMgLSAyOwoKICAgICAgaWYgKGRlY2MgPCAtOCAmJiBzcGRjIDwgLTEpCiAgICAgICAgc3BkYyArPSBSQU5EIChnZCkgJSAzICsgMjsKCiAgICAgIGlmIChkZWNjID4gOCB8fCBkZWNjIDwgLTgpCiAgICAgICAgZGVjYyA9IGRlY2MgKiA4IC8gOTsKCiAgICAgIGFjY2VsICs9IFJBTkQgKGdkKSAlIDI7CiAgICAgIGFjY2VsIC09IFJBTkQgKGdkKSAlIDI7CiAgICAgIGlmIChhY2NlbCA+IDIwKQogICAgICAgIGFjY2VsIC09IDI7CiAgICAgIGlmIChhY2NlbCA8IC0yMCkKICAgICAgICBhY2NlbCArPSAyOwogICAgfQogIH0KfQoKdm9pZAp6b29tRmlsdGVyRGVzdHJveSAoWm9vbUZpbHRlckRhdGEgKiB6ZikKewogIGlmICh6ZikgewogICAgaWYgKHpmLT5maXJlZGVjKQogICAgICBmcmVlICh6Zi0+ZmlyZWRlYyk7CiAgICBpZiAoemYtPmJ1ZmZlcikKICAgICAgZnJlZSAoemYtPmJ1ZmZlcik7CiAgICBmcmVlICh6Zik7CiAgfQp9CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCnZvaWQKem9vbUZpbHRlckZhc3RSR0IgKEdvb21EYXRhICogZ29vbWRhdGEsIFpvb21GaWx0ZXJEYXRhICogemYsIGludCB6ZmRfdXBkYXRlKQp7CiAgZ3VpbnQzMiBwcmV2WCA9IGdvb21kYXRhLT5yZXNvbHg7CiAgZ3VpbnQzMiBwcmV2WSA9IGdvb21kYXRhLT5yZXNvbHk7CgogIGd1aW50MzIgKnBpeDEgPSBnb29tZGF0YS0+cDE7CiAgZ3VpbnQzMiAqcGl4MiA9IGdvb21kYXRhLT5wMjsKICB1bnNpZ25lZCBpbnQgKnBvczEwOwogIHVuc2lnbmVkIGludCAqKmM7CgogIFVpbnQgeCwgeTsKCi8qICBzdGF0aWMgdW5zaWduZWQgaW50IHByZXZYID0gMCwgcHJldlkgPSAwOyAqLwoKI2lmZGVmIFVTRV9BU00KICBleHBpeDEgPSBwaXgxOwogIGV4cGl4MiA9IHBpeDI7CiNlbHNlCiAgQ29sb3IgY291bGV1cjsKICBDb2xvciBjb2wxLCBjb2wyLCBjb2wzLCBjb2w0OwogIFVpbnQgcG9zaXRpb247CiNlbmRpZgoKICBpZiAoKGdvb21kYXRhLT5yZXNvbHggIT0gemYtPnJlc194KSB8fCAoZ29vbWRhdGEtPnJlc29seSAhPSB6Zi0+cmVzX3kpKSB7CiAgICB6b29tRmlsdGVyU2V0UmVzb2x1dGlvbiAoZ29vbWRhdGEsIHpmKTsKICB9CgogIHBvczEwID0gemYtPnBvczEwOwogIGMgPSB6Zi0+YzsKCiAgaWYgKHpmZF91cGRhdGUpIHsKICAgIGd1Y2hhciBzcXJ0cGVydGUgPSB6Zi0+c3FydHBlcnRlOwogICAgZ2ludCBzdGFydF95ID0gMDsKCiAgICBpZiAoemYtPnJldmVyc2UpCiAgICAgIHpmLT52aXRlc3NlID0gMjU2IC0gemYtPnZpdGVzc2U7CgogICAgLyogZ2VuZXJhdGlvbiBkdSBidWZmZXIgKi8KICAgIGZvciAoeSA9IDA7IHkgPCB6Zi0+cmVzX3k7IHkrKykgewogICAgICBnaW50IHlfMTYgPSB5IDw8IDQ7CiAgICAgIGdpbnQgbWF4X3B4ID0gKHByZXZYIC0gMSkgKiBzcXJ0cGVydGU7CiAgICAgIGdpbnQgbWF4X3B5ID0gKHByZXZZIC0gMSkgKiBzcXJ0cGVydGU7CgogICAgICBmb3IgKHggPSAwOyB4IDwgemYtPnJlc194OyB4KyspIHsKICAgICAgICBnaW50IHB4LCBweTsKICAgICAgICBndWNoYXIgY29lZnYsIGNvZWZoOwoKICAgICAgICAvKiBjYWxjdWxlciBweCBldCBweSBlbiBmb25jdGlvbiBkZSAqLwogICAgICAgIC8qICAgeCx5LG1pZGRsZVgsbWlkZGxlWSBldCB0aGVNb2RlICovCiAgICAgICAgY2FsY3VsYXRlUFhhbmRQWSAoZ29vbWRhdGEsIHgsIHksICZweCwgJnB5KTsKCiAgICAgICAgaWYgKChweCA9PSB4IDw8IDQpICYmIChweSA9PSB5XzE2KSkKICAgICAgICAgIHB5ICs9IDg7CgogICAgICAgIGlmICgocHkgPCAwKSB8fCAocHggPCAwKSB8fCAocHkgPj0gbWF4X3B5KSB8fCAocHggPj0gbWF4X3B4KSkgewojaWZkZWYgVVNFX0FTTQogICAgICAgICAgY29lZmZzWyh5ICogcHJldlggKyB4KSAqIDJdID0gMDsKICAgICAgICAgIGNvZWZmc1soeSAqIHByZXZYICsgeCkgKiAyICsgMV0gPSAwOwojZWxzZQogICAgICAgICAgcG9zMTBbc3RhcnRfeSArIHhdID0gMDsKICAgICAgICAgIGNbMF1bc3RhcnRfeSArIHhdID0gMDsKICAgICAgICAgIGNbMV1bc3RhcnRfeSArIHhdID0gMDsKICAgICAgICAgIGNbMl1bc3RhcnRfeSArIHhdID0gMDsKICAgICAgICAgIGNbM11bc3RhcnRfeSArIHhdID0gMDsKI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGludCBucHgxMDsKICAgICAgICAgIGludCBucHkxMDsKICAgICAgICAgIGludCBwb3M7CgogICAgICAgICAgbnB4MTAgPSAocHggLyBzcXJ0cGVydGUpOwogICAgICAgICAgbnB5MTAgPSAocHkgLyBzcXJ0cGVydGUpOwoKLyogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnB4MTAgPj0gcHJldlgpIGZwcmludGYoc3RkZXJyLCJlcnJvciBucHg6JWQiLG5weDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnB5MTAgPj0gcHJldlkpIGZwcmludGYoc3RkZXJyLCJlcnJvciBucHk6JWQiLG5weTEwKTsKKi8KICAgICAgICAgIGNvZWZoID0gcHggJSBzcXJ0cGVydGU7CiAgICAgICAgICBjb2VmdiA9IHB5ICUgc3FydHBlcnRlOwojaWZkZWYgVVNFX0FTTQogICAgICAgICAgcG9zID0gKHkgKiBwcmV2WCArIHgpICogMjsKICAgICAgICAgIGNvZWZmc1twb3NdID0gKG5weDEwICsgcHJldlggKiBucHkxMCkgKiA0OwoKICAgICAgICAgIGlmICghKGNvZWZoIHx8IGNvZWZ2KSkKICAgICAgICAgICAgY29lZmZzW3BvcyArIDFdID0gKHNxcnRwZXJ0ZSAqIHNxcnRwZXJ0ZSAtIDEpOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBjb2VmZnNbcG9zICsgMV0gPSAoKHNxcnRwZXJ0ZSAtIGNvZWZoKSAqIChzcXJ0cGVydGUgLSBjb2VmdikpOwoKICAgICAgICAgIGNvZWZmc1twb3MgKyAxXSB8PSAoY29lZmggKiAoc3FydHBlcnRlIC0gY29lZnYpKSA8PCA4OwogICAgICAgICAgY29lZmZzW3BvcyArIDFdIHw9ICgoc3FydHBlcnRlIC0gY29lZmgpICogY29lZnYpIDw8IDE2OwogICAgICAgICAgY29lZmZzW3BvcyArIDFdIHw9IChjb2VmaCAqIGNvZWZ2KSA8PCAyNDsKI2Vsc2UKICAgICAgICAgIHBvcyA9IHN0YXJ0X3kgKyB4OwogICAgICAgICAgcG9zMTBbcG9zXSA9IG5weDEwICsgcHJldlggKiBucHkxMDsKCiAgICAgICAgICBpZiAoIShjb2VmaCB8fCBjb2VmdikpCiAgICAgICAgICAgIGNbMF1bcG9zXSA9IHNxcnRwZXJ0ZSAqIHNxcnRwZXJ0ZSAtIDE7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGNbMF1bcG9zXSA9IChzcXJ0cGVydGUgLSBjb2VmaCkgKiAoc3FydHBlcnRlIC0gY29lZnYpOwoKICAgICAgICAgIGNbMV1bcG9zXSA9IGNvZWZoICogKHNxcnRwZXJ0ZSAtIGNvZWZ2KTsKICAgICAgICAgIGNbMl1bcG9zXSA9IChzcXJ0cGVydGUgLSBjb2VmaCkgKiBjb2VmdjsKICAgICAgICAgIGNbM11bcG9zXSA9IGNvZWZoICogY29lZnY7CiNlbmRpZgogICAgICAgIH0KICAgICAgfQogICAgICAvKiBBZHZhbmNlIHN0YXJ0IG9mIGxpbmUgaW5kZXggKi8KICAgICAgc3RhcnRfeSArPSBwcmV2WDsKICAgIH0KICB9CiNpZmRlZiBVU0VfQVNNCiNpZmRlZiBNTVgKICB6b29tX3dpZHRoID0gcHJldlg7CiAgbW14X3pvb21fc2l6ZSA9IHByZXZYICogcHJldlk7CiAgbW14X3pvb20gKCk7CiNlbmRpZgoKI2lmZGVmIFBPV0VSUEMKICB6b29tX3dpZHRoID0gcHJldlg7CiAgaWYgKHVzZUFsdGl2ZWMpIHsKICAgIHBwY3NpemU0ID0gKCh1bnNpZ25lZCBpbnQpIChwcmV2WCAqIHByZXZZKSkgLyA0OwogICAgcHBjX3pvb21fYWx0aXZlYyAoKTsKICB9IGVsc2UgewogICAgcHBjc2l6ZTQgPSAoKHVuc2lnbmVkIGludCkgKHByZXZYICogcHJldlkpKTsKICAgIHBwY196b29tICgpOwogIH0KI2VuZGlmCiNlbHNlCiAgZm9yIChwb3NpdGlvbiA9IDA7IHBvc2l0aW9uIDwgcHJldlggKiBwcmV2WTsgcG9zaXRpb24rKykgewogICAgZ2V0UGl4ZWxSR0JfIChwaXgxLCBwb3MxMFtwb3NpdGlvbl0sICZjb2wxLCBnb29tZGF0YS0+cmVzb2x4LAogICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOwogICAgZ2V0UGl4ZWxSR0JfIChwaXgxLCBwb3MxMFtwb3NpdGlvbl0gKyAxLCAmY29sMiwgZ29vbWRhdGEtPnJlc29seCwKICAgICAgICBnb29tZGF0YS0+cmVzb2x5KTsKICAgIGdldFBpeGVsUkdCXyAocGl4MSwgcG9zMTBbcG9zaXRpb25dICsgcHJldlgsICZjb2wzLCBnb29tZGF0YS0+cmVzb2x4LAogICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOwogICAgZ2V0UGl4ZWxSR0JfIChwaXgxLCBwb3MxMFtwb3NpdGlvbl0gKyBwcmV2WCArIDEsICZjb2w0LCBnb29tZGF0YS0+cmVzb2x4LAogICAgICAgIGdvb21kYXRhLT5yZXNvbHkpOwoKICAgIGNvdWxldXIuciA9IGNvbDEuciAqIGNbMF1bcG9zaXRpb25dCiAgICAgICAgKyBjb2wyLnIgKiBjWzFdW3Bvc2l0aW9uXQogICAgICAgICsgY29sMy5yICogY1syXVtwb3NpdGlvbl0KICAgICAgICArIGNvbDQuciAqIGNbM11bcG9zaXRpb25dOwogICAgY291bGV1ci5yID4+PSB6Zi0+cGVydGVkZWM7CgogICAgY291bGV1ci52ID0gY29sMS52ICogY1swXVtwb3NpdGlvbl0KICAgICAgICArIGNvbDIudiAqIGNbMV1bcG9zaXRpb25dCiAgICAgICAgKyBjb2wzLnYgKiBjWzJdW3Bvc2l0aW9uXQogICAgICAgICsgY29sNC52ICogY1szXVtwb3NpdGlvbl07CiAgICBjb3VsZXVyLnYgPj49IHpmLT5wZXJ0ZWRlYzsKCiAgICBjb3VsZXVyLmIgPSBjb2wxLmIgKiBjWzBdW3Bvc2l0aW9uXQogICAgICAgICsgY29sMi5iICogY1sxXVtwb3NpdGlvbl0KICAgICAgICArIGNvbDMuYiAqIGNbMl1bcG9zaXRpb25dCiAgICAgICAgKyBjb2w0LmIgKiBjWzNdW3Bvc2l0aW9uXTsKICAgIGNvdWxldXIuYiA+Pj0gemYtPnBlcnRlZGVjOwoKICAgIHNldFBpeGVsUkdCXyAocGl4MiwgcG9zaXRpb24sIGNvdWxldXIsIGdvb21kYXRhLT5yZXNvbHgsIGdvb21kYXRhLT5yZXNvbHkpOwogIH0KI2VuZGlmCn0KCgp2b2lkCnBvaW50RmlsdGVyIChHb29tRGF0YSAqIGdvb21kYXRhLCBDb2xvciBjLAogICAgZmxvYXQgdDEsIGZsb2F0IHQyLCBmbG9hdCB0MywgZmxvYXQgdDQsIFVpbnQgY3ljbGUpCnsKICBVaW50ICpwaXgxID0gZ29vbWRhdGEtPnAxOwogIFpvb21GaWx0ZXJEYXRhICp6ZiA9IGdvb21kYXRhLT56ZmQ7CiAgVWludCB4ID0gKFVpbnQpICh6Zi0+bWlkZGxlWCArIChpbnQpICh0MSAqIGNvcyAoKGZsb2F0KSBjeWNsZSAvIHQzKSkpOwogIFVpbnQgeSA9IChVaW50KSAoemYtPm1pZGRsZVkgKyAoaW50KSAodDIgKiBzaW4gKChmbG9hdCkgY3ljbGUgLyB0NCkpKTsKCiAgaWYgKCh4ID4gMSkgJiYgKHkgPiAxKSAmJiAoeCA8IGdvb21kYXRhLT5yZXNvbHggLSAyKQogICAgICAmJiAoeSA8IGdvb21kYXRhLT5yZXNvbHkgLSAyKSkgewogICAgc2V0UGl4ZWxSR0IgKHBpeDEsIHggKyAxLCB5LCBjLCBnb29tZGF0YS0+cmVzb2x4LCBnb29tZGF0YS0+cmVzb2x5KTsKICAgIHNldFBpeGVsUkdCIChwaXgxLCB4LCB5ICsgMSwgYywgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CiAgICBzZXRQaXhlbFJHQiAocGl4MSwgeCArIDEsIHkgKyAxLCBXSElURSwgZ29vbWRhdGEtPnJlc29seCwgZ29vbWRhdGEtPnJlc29seSk7CiAgICBzZXRQaXhlbFJHQiAocGl4MSwgeCArIDIsIHkgKyAxLCBjLCBnb29tZGF0YS0+cmVzb2x4LCBnb29tZGF0YS0+cmVzb2x5KTsKICAgIHNldFBpeGVsUkdCIChwaXgxLCB4ICsgMSwgeSArIDIsIGMsIGdvb21kYXRhLT5yZXNvbHgsIGdvb21kYXRhLT5yZXNvbHkpOwogIH0KfQo=