LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJkZWJ1Z2dlci5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAid2luYmFzZS5oIgoKI2lmZGVmIF9faTM4Nl9fCi8qCiAqIFdlIGtlZXAgdGhpcyBpbmZvIGZvciBlYWNoIGZyYW1lLCBzbyB0aGF0IHdlIGNhbgogKiBmaW5kIGxvY2FsIHZhcmlhYmxlIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KICovCnN0cnVjdCBidF9pbmZvCnsKICB1bnNpZ25lZCBpbnQJICAgICBjczsKICB1bnNpZ25lZCBpbnQJICAgICBlaXA7CiAgdW5zaWduZWQgaW50CSAgICAgc3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWJwOwogIHN0cnVjdCBzeW1ib2xfaW5mbyBmcmFtZTsKfTsKCnN0YXRpYyBpbnQgbmZyYW1lOwpzdGF0aWMgc3RydWN0IGJ0X2luZm8gKiBmcmFtZXMgPSBOVUxMOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiNpZmRlZiBfX2kzODZfXwogICAgREJHX1ZBTFVFCXZhbHVlOwogICAgCiAgICB2YWx1ZS50eXBlID0gTlVMTDsKICAgIHZhbHVlLmNvb2tpZSA9IERWX1RBUkdFVDsKICAgIHZhbHVlLmFkZHIuc2VnID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHZhbHVlLmFkZHIub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CgogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiU3RhY2sgZHVtcDpcbiIpOwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUodmFsdWUuYWRkci5zZWcpKSB7CiAgICBjYXNlIDMyOiAvKiAzMi1iaXQgbW9kZSAqLwogICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3gnICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgMTY6ICAvKiAxNi1iaXQgbW9kZSAqLwogICAgICAgIHZhbHVlLmFkZHIub2ZmICY9IDB4ZmZmZjsKICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmdmFsdWUsIDI0LCAndycgKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csICJCYWQgc2VnbWVudCAoJWxkKVxuIiwgdmFsdWUuYWRkci5zZWcpOwogICAgfQogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiXG4iKTsKI2VuZGlmCn0KCiNpZmRlZiBfX2kzODZfXwpzdGF0aWMgdm9pZCBERUJVR19Gb3JjZUZyYW1lKERCR19BRERSICpzdGFjaywgREJHX0FERFIgKmNvZGUsIGludCBmcmFtZW5vLCBpbnQgYml0cywgaW50IG5vaXN5LCBjb25zdCBjaGFyICpjYXZlYXQpCnsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZSsrOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopREJHX3JlYWxsb2MoZnJhbWVzLAoJCQkJCSAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiJXMlZCAiLCAodGhlZnJhbWUgPT0gY3Vycl9mcmFtZSA/ICI9PiIgOiAiICAiKSwKICAgICAgICAgICAgICBmcmFtZW5vKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBjb2RlLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGNvZGUtPm9mZjsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvZGUsIGJpdHMsIAoJCQkJCQkJICBzdGFjay0+b2ZmLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBjb2RlLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgc3RhY2stPm9mZiwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBzdGFjay0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBzdGFjay0+b2ZmOwogICAgaWYgKG5vaXN5KSB7CiAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseCVzKVxuIiA6ICIgKGVicD0lMDhseCVzKVxuIiwgc3RhY2stPm9mZiwgY2F2ZWF0P2NhdmVhdDoiIiApOwogICAgfQp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTE2KERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5icCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChmcmFtZS5icCAmIDEpICpjcyA9IGZyYW1lLmNzOwogICAgZWxzZSB7CiAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLAoJICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgICAgaWYgKCgoZnJhbWUuY3MmNyk9PTcpICYmIChmcmFtZS5jcyAhPSAqY3MpKSB7CgkgICAgTERUX0VOVFJZCWxlOwoJIAoJICAgIGlmIChHZXRUaHJlYWRTZWxlY3RvckVudHJ5KCBERUJVR19DdXJyVGhyZWFkLT5oYW5kbGUsIGZyYW1lLmNzLCAmbGUpICYmCgkJKGxlLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MDgpKSB7IC8qIGNvZGUgc2VnbWVudCAqLwoJICAgICAgICAvKiBpdCBpcyB2ZXJ5IHVuY29tbW9uIHRvIHB1c2ggYSBjb2RlIHNlZ21lbnQgY3MgYXMKCQkgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCgkgICAgICAgICpjcyA9IHBvc3NpYmxlX2NzID0gZnJhbWUuY3M7CgkgICAgfQoJfQogICAgfQogICAgY29kZS5zZWcgPSAqY3M7CiAgICBjb2RlLm9mZiA9IGZyYW1lLmlwOwogICAgYWRkci0+b2ZmID0gZnJhbWUuYnAgJiB+MTsKICAgIERFQlVHX0ZvcmNlRnJhbWUoYWRkciwgJmNvZGUsIGZyYW1lbm8sIDE2LCBub2lzeSwgcG9zc2libGVfY3MgPyAiLCBmYXIgY2FsbCBhc3N1bWVkIiA6IE5VTEwgKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTMyKERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICBGUkFNRTMyIAkJZnJhbWU7CiAgICB2b2lkKgkJcCA9ICh2b2lkKilERUJVR19Ub0xpbmVhcihhZGRyKTsKICAgIERCR19BRERSCQljb2RlOwogICAgRFdPUkQJCW9sZF9icCA9IGFkZHItPm9mZjsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgaWYgKG5vaXN5KSBERUJVR19JbnZhbEFkZHIoYWRkcik7CiAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBpZiAoIWZyYW1lLmlwKSByZXR1cm4gRkFMU0U7CgogICAgY29kZS5zZWcgPSAqY3M7CiAgICBjb2RlLm9mZiA9IGZyYW1lLmlwOwogICAgYWRkci0+b2ZmID0gZnJhbWUuYnA7CiAgICBERUJVR19Gb3JjZUZyYW1lKGFkZHIsICZjb2RlLCBmcmFtZW5vLCAzMiwgbm9pc3ksIE5VTEwpOwogICAgaWYgKGFkZHItPm9mZiA9PSBvbGRfYnApIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2UoQk9PTCBub2lzeSkKewojaWZkZWYgX19pMzg2CiAgICBEQkdfQUREUiAJCWFkZHIsIHN3X2FkZHIsIGNvZGUsIHRtcDsKICAgIHVuc2lnbmVkIGludCAJc3MgPSBERUJVR19jb250ZXh0LlNlZ1NzOwogICAgdW5zaWduZWQgaW50CWNzID0gREVCVUdfY29udGV4dC5TZWdDczsKICAgIGludCAJCWZyYW1lbm8gPSAwLCBpczE2LCBvazsKICAgIERXT1JEIAkJbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2gsIHA7CiAgICBTVEFDSzE2RlJBTUUgICAgICAgCWZyYW1lMTY7CiAgICBTVEFDSzMyRlJBTUUgICAgICAgCWZyYW1lMzI7CiAgICBjaGFyCQljaDsKCiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFja3RyYWNlOlxuIiApOwoKICAgIG5mcmFtZSA9IDA7CiAgICBpZiAoZnJhbWVzKSBEQkdfZnJlZSggZnJhbWVzICk7CiAgICAvKiBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKikgREJHX2FsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7ICovCiAgICBmcmFtZXMgPSBOVUxMOwoKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKHNzKSkgc3MgPSAwOwogICAgaWYgKERFQlVHX0lzU2VsZWN0b3JTeXN0ZW0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIHN3aXRjaCAoREVCVUdfR2V0U2VsZWN0b3JUeXBlKHNzKSkKICAgIHsKICAgIGNhc2UgMzI6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IERFQlVHX2NvbnRleHQuRWlwOwogICAgICAgIGFkZHIuc2VnID0gc3M7CglhZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRWJwOwogICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgZnJhbWVubywgMzIsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaWYgKCEoY29kZS5zZWcgfHwgY29kZS5vZmYpKSB7CiAgICAgICAgICAgIC8qIHRyeWluZyB0byBleGVjdXRlIGEgbnVsbCBwb2ludGVyLi4uIHl1Y2suLi4KICAgICAgICAgICAgICogaWYgaXQgd2FzIGEgY2FsbCB0byBudWxsLCB0aGUgcmV0dXJuIEVJUCBzaG91bGQgYmUKICAgICAgICAgICAgICogYXZhaWxhYmxlIGF0IFNTOkVTUCwgc28gbGV0J3MgdHJ5IHRvIHJldHJpZXZlIGl0ICovCiAgICAgICAgICAgIHRtcC5zZWcgPSBzczsKICAgICAgICAgICAgdG1wLm9mZiA9IERFQlVHX2NvbnRleHQuRXNwOwogICAgICAgICAgICBpZiAoREVCVUdfUkVBRF9NRU0oKHZvaWQgKilERUJVR19Ub0xpbmVhcigmdG1wKSwgJmNvZGUub2ZmLCBzaXplb2YoY29kZS5vZmYpKSkgewogICAgICAgICAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDMyLCBub2lzeSwgIiwgbnVsbCBjYWxsIGFzc3VtZWQiICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaXMxNiA9IEZBTFNFOwoJYnJlYWs7CiAgICBjYXNlIDE2OgogICAgICAgIGNvZGUuc2VnID0gY3M7CiAgICAgICAgY29kZS5vZmYgPSBMT1dPUkQoREVCVUdfY29udGV4dC5FaXApOwogICAgICAgIGFkZHIuc2VnID0gc3M7CglhZGRyLm9mZiA9IExPV09SRChERUJVR19jb250ZXh0LkVicCk7CiAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCBmcmFtZW5vLCAxNiwgbm9pc3ksIE5VTEwgKTsKICAgICAgICBpczE2ID0gVFJVRTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHNlZ21lbnQgJyV1J1xuIiwgc3MpOwoJcmV0dXJuOwogICAgfQoKICAgIC8qIGN1cl9zd2l0Y2ggaG9sZHMgYWRkcmVzcyBvZiBjdXJyX3N0YWNrJ3MgZmllbGQgaW4gVEVCIGluIGRlYnVnZ2VlIAogICAgICogYWRkcmVzcyBzcGFjZSAKICAgICAqLwogICAgY3VyX3N3aXRjaCA9IChEV09SRClERUJVR19DdXJyVGhyZWFkLT50ZWIgKyBPRkZTRVRfT0YoVEVCLCBjdXJfc3RhY2spOwogICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopY3VyX3N3aXRjaCwgJm5leHRfc3dpdGNoLCBzaXplb2YobmV4dF9zd2l0Y2gpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJDYW4ndCByZWFkIFRFQjpjdXJfc3RhY2tcbiIpOwoJcmV0dXJuOwogICAgfQoKICAgIGlmIChpczE2KSB7CiAgICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopbmV4dF9zd2l0Y2gsICZmcmFtZTMyLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJICAgIHJldHVybjsKCX0KCWN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwoJc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwoJc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCXAgPSBERUJVR19Ub0xpbmVhcigmdG1wKTsKCQoJaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopcCwgJmZyYW1lMTYsIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkgICAgICh1bnNpZ25lZCBsb25nKShTVEFDSzE2RlJBTUUqKXAgKTsKCSAgICByZXR1cm47Cgl9CgljdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMTYuZnJhbWUzMjsKCXN3X2FkZHIuc2VnID0gc3M7Cglzd19hZGRyLm9mZiA9IGN1cl9zd2l0Y2g7CiAgICB9CiAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilERUJVR19Ub0xpbmVhcigmc3dfYWRkciksICZjaCwgc2l6ZW9mKGNoKSkpIHsKICAgICAgICBzd19hZGRyLnNlZyA9IChEV09SRCktMTsKCXN3X2FkZHIub2ZmID0gKERXT1JEKS0xOwogICAgfQogICAgCiAgICBmb3IgKG9rID0gVFJVRTsgb2s7KSB7CiAgICAgICAgaWYgKChmcmFtZXNbZnJhbWVub10uc3MgPT0gc3dfYWRkci5zZWcpICYmCgkgICAgKGZyYW1lc1tmcmFtZW5vXS5lYnAgPj0gc3dfYWRkci5vZmYpKSB7CgkgICAvKiAxNjwtPjMyIHN3aXRjaC4uLgoJICAgICogeWVzLCBJIGtub3cgdGhpcyBpcyBjb25mdXNpbmcsIGl0IGdhdmUgbWUgYSBoZWFkYWNoZSB0b28gKi8KCSAgIGlmIChpczE2KSB7CgkgICAgICAKCSAgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJCSAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCQkgICAodW5zaWduZWQgbG9uZykoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJCSAgcmV0dXJuOwoJICAgICAgIH0KCgkgICAgICAgY29kZS5zZWcgID0gMDsKCSAgICAgICBjb2RlLm9mZiAgPSBmcmFtZTMyLnJldGFkZHI7CgkgICAgICAgCgkgICAgICAgY3MgPSAwOwoJICAgICAgIGFkZHIuc2VnID0gMDsKCSAgICAgICBhZGRyLm9mZiA9IGZyYW1lMzIuZWJwOwoJICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAzMiwgbm9pc3ksIE5VTEwgKTsKCSAgICAgICAKCSAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgIHRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkJICAgcmV0dXJuOwoJICAgICAgIH0KCSAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMTYuZnJhbWUzMjsKCSAgICAgICBzd19hZGRyLnNlZyA9IDA7CgkgICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwoJICAgICAgIAoJICAgICAgIGlzMTYgPSBGQUxTRTsKCSAgIH0gZWxzZSB7CgkgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICB0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgCgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMTZGUkFNRSopcCApOwoJCSAgcmV0dXJuOwoJICAgICAgfQoJICAgICAgCgkgICAgICBjb2RlLnNlZyAgPSBmcmFtZTE2LmNzOwoJICAgICAgY29kZS5vZmYgID0gZnJhbWUxNi5pcDsKCSAgICAgIAoJICAgICAgY3MgPSBmcmFtZTE2LmNzOwoJICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgIGFkZHIub2ZmID0gZnJhbWUxNi5icDsKCSAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAxNiwgbm9pc3ksIE5VTEwgKTsKCSAgICAgIAoJICAgICAgbmV4dF9zd2l0Y2ggPSBjdXJfc3dpdGNoOwoJICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopbmV4dF9zd2l0Y2gsICZmcmFtZTMyLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCQkgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCQkgICh1bnNpZ25lZCBsb25nKShTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkJIHJldHVybjsKCSAgICAgIH0KCSAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUzMi5mcmFtZTE2OwoJICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwoJICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCSAgICAgIAoJICAgICAgaXMxNiA9IFRSVUU7CgkgICB9CgkgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilERUJVR19Ub0xpbmVhcigmc3dfYWRkciksICZjaCwgc2l6ZW9mKGNoKSkpIHsKCSAgICAgIHN3X2FkZHIuc2VnID0gKERXT1JEKS0xOwoJICAgICAgc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CgkgICB9Cgl9IGVsc2UgewoJICAgIC8qIG9yZGluYXJ5IHN0YWNrIGZyYW1lICovCgkgICBvayA9IGlzMTYgPyBERUJVR19GcmFtZTE2KCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KQoJICAgICAgOiBERUJVR19GcmFtZTMyKCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KTsKCX0KICAgIH0KICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJcbiIgKTsKI2VuZGlmCn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKI2lmZGVmIF9faTM4Nl9fCiAgaW50CQlydG4gPSBGQUxTRTsKCiAgY3Vycl9mcmFtZSA9IG5ld2ZyYW1lOwoKICBpZiggY3Vycl9mcmFtZSA+PSBuZnJhbWUgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gbmZyYW1lIC0gMTsKICAgIH0KCiAgaWYoIGN1cnJfZnJhbWUgPCAwICkKICAgIHsKICAgICAgY3Vycl9mcmFtZSA9IDA7CiAgICB9CgogICBpZiggZnJhbWVzICYmIGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5saXN0LnNvdXJjZWZpbGUgIT0gTlVMTCApCiAgICB7CiAgICAgIERFQlVHX0xpc3QoJmZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5saXN0LCBOVUxMLCAwKTsKICAgIH0KCiAgcnRuID0gVFJVRTsKICByZXR1cm4gKHJ0bik7CiNlbHNlIC8qIF9faTM4Nl9fICovCiAgcmV0dXJuIEZBTFNFOwojZW5kaWYgLyogX19pMzg2X18gKi8KfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKI2lmZGVmIF9faTM4Nl9fCiAgLyoKICAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgYmFja3RyYWNlLCB0aGVuIGp1c3QgcmV0dXJuLgogICAqLwogIGlmKCBmcmFtZXMgPT0gTlVMTCApCiAgICB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgLyoKICAgKiBJZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXMsIHRoZW4gd2UgYWxzbyBoYXZlCiAgICogbm90aGluZyB0byByZXBvcnQgaGVyZS4KICAgKi8KICBpZiggZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bSA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAqbmFtZSA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5zeW07CiAgKmVpcCA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5laXA7CiAgKmVicCA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5lYnA7CgogIHJldHVybiBUUlVFOwojZWxzZSAvKiBfX2kzODZfXyAqLwogIHJldHVybiBGQUxTRTsKI2VuZGlmIC8qIF9faTM4Nl9fICovCn0KCg==