LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJkZWJ1Z2dlci5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAid2luYmFzZS5oIgoKI2lmZGVmIF9faTM4Nl9fCi8qCiAqIFdlIGtlZXAgdGhpcyBpbmZvIGZvciBlYWNoIGZyYW1lLCBzbyB0aGF0IHdlIGNhbgogKiBmaW5kIGxvY2FsIHZhcmlhYmxlIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KICovCnN0cnVjdCBidF9pbmZvCnsKICB1bnNpZ25lZCBpbnQJICAgICBjczsKICB1bnNpZ25lZCBpbnQJICAgICBlaXA7CiAgdW5zaWduZWQgaW50CSAgICAgc3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWJwOwogIHN0cnVjdCBzeW1ib2xfaW5mbyBmcmFtZTsKfTsKCnN0YXRpYyBpbnQgbmZyYW1lOwpzdGF0aWMgc3RydWN0IGJ0X2luZm8gKiBmcmFtZXMgPSBOVUxMOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiNpZmRlZiBfX2kzODZfXwogICAgREJHX1ZBTFVFCXZhbHVlOwogICAgCiAgICB2YWx1ZS50eXBlID0gTlVMTDsKICAgIHZhbHVlLmNvb2tpZSA9IERWX1RBUkdFVDsKICAgIHZhbHVlLmFkZHIuc2VnID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHZhbHVlLmFkZHIub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CgogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiU3RhY2sgZHVtcDpcbiIpOwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUodmFsdWUuYWRkci5zZWcpKSB7CiAgICBjYXNlIDMyOiAvKiAzMi1iaXQgbW9kZSAqLwogICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3gnICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgMTY6ICAvKiAxNi1iaXQgbW9kZSAqLwogICAgICAgIHZhbHVlLmFkZHIub2ZmICY9IDB4ZmZmZjsKICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmdmFsdWUsIDI0LCAndycgKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csICJCYWQgc2VnbWVudCAoJWxkKVxuIiwgdmFsdWUuYWRkci5zZWcpOwogICAgfQogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiXG4iKTsKI2VuZGlmCn0KCiNpZmRlZiBfX2kzODZfXwpzdGF0aWMgdm9pZCBERUJVR19Gb3JjZUZyYW1lKERCR19BRERSICpzdGFjaywgREJHX0FERFIgKmNvZGUsIGludCBmcmFtZW5vLCBpbnQgYml0cywgaW50IG5vaXN5KQp7CiAgICBpbnQgdGhlZnJhbWUgPSBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKCQkJCQkgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gY29kZS0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBjb2RlLT5vZmY7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBjb2RlLCBiaXRzLCAKCQkJCQkJCSAgc3RhY2stPm9mZiwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggY29kZSwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIHN0YWNrLT5vZmYsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUubGlzdCk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLnNzID0gc3RhY2stPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gc3RhY2stPm9mZjsKICAgIGlmIChub2lzeSkgewogICAgICBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgKGJpdHMgPT0gMTYpID8gIiAoYnA9JTA0bHgpXG4iIDogIiAoZWJwPSUwOGx4KVxuIiwgc3RhY2stPm9mZiApOwogICAgfQp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTE2KERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJc3MgPSBhZGRyLT5zZWcsIHBvc3NpYmxlX2NzID0gMDsKICAgIEZSQU1FMTYgCQlmcmFtZTsKICAgIGludCAJCXRoZWZyYW1lID0gbmZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICAKICAgIGlmICghcCkgcmV0dXJuIEZBTFNFOwogICAgCiAgICBpZiAoIURFQlVHX1JFQURfTUVNKHAsICZmcmFtZSwgc2l6ZW9mKGZyYW1lKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX0ludmFsQWRkcihhZGRyKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghZnJhbWUuYnApIHJldHVybiBGQUxTRTsKICAgIG5mcmFtZSsrOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopREJHX3JlYWxsb2MoZnJhbWVzLAoJCQkJCSAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAoJCSAgICAgZnJhbWVubyk7CiAgICBpZiAoZnJhbWUuYnAgJiAxKSAqY3MgPSBmcmFtZS5jczsKICAgIGVsc2UgewogICAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKCSAqIGJ1dCBjaGVjayB3aGV0aGVyIGl0IGNvdWxkIGJlIGFueXdheSAqLwogICAgICAgIGlmICgoKGZyYW1lLmNzJjcpPT03KSAmJiAoZnJhbWUuY3MgIT0gKmNzKSkgewoJICAgIExEVF9FTlRSWQlsZTsKCSAKCSAgICBpZiAoR2V0VGhyZWFkU2VsZWN0b3JFbnRyeSggREVCVUdfQ3VyclRocmVhZC0+aGFuZGxlLCBmcmFtZS5jcywgJmxlKSAmJgoJCShsZS5IaWdoV29yZC5CaXRzLlR5cGUgJiAweDA4KSkgeyAvKiBjb2RlIHNlZ21lbnQgKi8KCSAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCgkJICogYSBwYXJhbWV0ZXIsIHNvIHRoaXMgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcyAqLwoJICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLmNzOwoJICAgIH0KCX0KICAgIH0KICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLmlwOwogICAgaWYgKG5vaXN5KQogICAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAxNiwgCgkJCQkJCQkgICAgZnJhbWUuYnAsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCQkgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBmcmFtZS5icCwgCgkJCQkgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUubGlzdCk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLnNzID0gYWRkci0+c2VnID0gc3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IGFkZHItPm9mZiA9IGZyYW1lLmJwICYgfjE7CiAgICBpZiAobm9pc3kpIHsKICAgICAgICBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIiAoYnA9JTA0bHgiLCBhZGRyLT5vZmYgKTsKICAgICAgICBpZiAocG9zc2libGVfY3MpIHsKCSAgICBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIiwgZmFyIGNhbGwgYXNzdW1lZCIgKTsKCX0KCURFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiKVxuIiApOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMzIoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCAJc3MgPSBhZGRyLT5zZWc7CiAgICBGUkFNRTMyIAkJZnJhbWU7CiAgICBpbnQgCQl0aGVmcmFtZSA9IG5mcmFtZTsKICAgIHZvaWQqCQlwID0gKHZvaWQqKURFQlVHX1RvTGluZWFyKGFkZHIpOwogICAgCiAgICBpZiAoIXApIHJldHVybiBGQUxTRTsKICAgIAogICAgaWYgKCFERUJVR19SRUFEX01FTShwLCAmZnJhbWUsIHNpemVvZihmcmFtZSkpKSB7CiAgICAgICBpZiAobm9pc3kpIERFQlVHX0ludmFsQWRkcihhZGRyKTsKICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghZnJhbWUuaXApIHJldHVybiBGQUxTRTsKICAgIAogICAgbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCgkJCQkJICAgbmZyYW1lKnNpemVvZihzdHJ1Y3QgYnRfaW5mbykpOwogICAgaWYgKG5vaXN5KQogICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiJXMlZCAiLCAodGhlZnJhbWUgPT0gY3Vycl9mcmFtZSA/ICI9PiIgOiAiICAiKSwKCQkgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gYWRkci0+c2VnID0gKmNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBhZGRyLT5vZmYgPSBmcmFtZS5pcDsKICAgIGlmIChub2lzeSkKICAgICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggYWRkciwgMzIsIAoJCQkJCQkJICAgIGZyYW1lLmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGFkZHIsIFRSVUUsIAoJCQkJICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUuYnAsIAoJCQkJICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIiAoZWJwPSUwOGx4KVxuIiwgZnJhbWUuYnAgKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gZnJhbWUuYnA7CiAgICBpZiAoYWRkci0+b2ZmID09IGZyYW1lLmJwKSByZXR1cm4gRkFMU0U7CiAgICBhZGRyLT5vZmYgPSBmcmFtZS5icDsKICAgIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2UoQk9PTCBub2lzeSkKewojaWZkZWYgX19pMzg2CiAgICBEQkdfQUREUiAJCWFkZHIsIHN3X2FkZHIsIGNvZGUsIHRtcDsKICAgIHVuc2lnbmVkIGludCAJc3MgPSBERUJVR19jb250ZXh0LlNlZ1NzOwogICAgdW5zaWduZWQgaW50CWNzID0gREVCVUdfY29udGV4dC5TZWdDczsKICAgIGludCAJCWZyYW1lbm8gPSAwLCBpczE2LCBvazsKICAgIERXT1JEIAkJbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2gsIHA7CiAgICBTVEFDSzE2RlJBTUUgICAgICAgCWZyYW1lMTY7CiAgICBTVEFDSzMyRlJBTUUgICAgICAgCWZyYW1lMzI7CiAgICBjaGFyCQljaDsKCiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFja3RyYWNlOlxuIiApOwoKICAgIG5mcmFtZSA9IDE7CiAgICBpZiAoZnJhbWVzKSBEQkdfZnJlZSggZnJhbWVzICk7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKikgREJHX2FsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7CiAgICBpZiAobm9pc3kpCiAgICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiJXMlZCAiLChjdXJyX2ZyYW1lID09IDAgPyAiPT4iIDogIiAgIiksIGZyYW1lbm8pOwoKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKHNzKSkgc3MgPSAwOwogICAgaWYgKERFQlVHX0lzU2VsZWN0b3JTeXN0ZW0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIHN3aXRjaCAoREVCVUdfR2V0U2VsZWN0b3JUeXBlKHNzKSkKICAgIHsKICAgIGNhc2UgMzI6CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBERUJVR19jb250ZXh0LkVpcDsKICAgICAgICBpZiAobm9pc3kpCiAgICAgICAgICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDMyLCBUUlVFICk7CiAgICAgICAgZWxzZQoJICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCAmYWRkciwgVFJVRSwgJmZyYW1lc1swXS5mcmFtZS5zeW0sIDAsIAoJCQkJICAgICAmZnJhbWVzWzBdLmZyYW1lLmxpc3QpOwogICAgICAgIGZyYW1lc1swXS5zcyA9IGFkZHIuc2VnID0gc3M7CglmcmFtZXNbMF0uZWJwID0gYWRkci5vZmYgPSBERUJVR19jb250ZXh0LkVicDsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiIChlYnA9JTA4eClcbiIsIGZyYW1lc1swXS5lYnAgKTsKICAgICAgICBpczE2ID0gRkFMU0U7CglicmVhazsKICAgIGNhc2UgMTY6CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBMT1dPUkQoREVCVUdfY29udGV4dC5FaXApOwogICAgICAgIGlmIChub2lzeSkKCSAgICBmcmFtZXNbMF0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCAxNiwgVFJVRSApOwogICAgICAgIGVsc2UKCSAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKCQkJCSAgICAgJmZyYW1lc1swXS5mcmFtZS5saXN0KTsKICAgICAgICBmcmFtZXNbMF0uc3MgPSBhZGRyLnNlZyA9IHNzOwoJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gTE9XT1JEKERFQlVHX2NvbnRleHQuRWJwKTsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiIChicD0lMDR4KVxuIiwgZnJhbWVzWzBdLmVicCApOwogICAgICAgIGlzMTYgPSBUUlVFOwoJYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc2VnbWVudCAnJXUnXG4iLCBzcyk7CglyZXR1cm47CiAgICB9CgogICAgLyogY3VyX3N3aXRjaCBob2xkcyBhZGRyZXNzIG9mIGN1cnJfc3RhY2sncyBmaWVsZCBpbiBURUIgaW4gZGVidWdnZWUgCiAgICAgKiBhZGRyZXNzIHNwYWNlIAogICAgICovCiAgICBjdXJfc3dpdGNoID0gKERXT1JEKURFQlVHX0N1cnJUaHJlYWQtPnRlYiArIE9GRlNFVF9PRihURUIsIGN1cl9zdGFjayk7CiAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiljdXJfc3dpdGNoLCAmbmV4dF9zd2l0Y2gsIHNpemVvZihuZXh0X3N3aXRjaCkpKSB7CiAgICAgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkNhbid0IHJlYWQgVEVCOmN1cl9zdGFja1xuIik7CglyZXR1cm47CiAgICB9CgogICAgaWYgKGlzMTYpIHsKICAgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkgICAgICh1bnNpZ25lZCBsb25nKShTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTMyLmZyYW1lMTY7Cglzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7Cglzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwogICAgfSBlbHNlIHsKICAgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7Cgl0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJCglpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMTZGUkFNRSopcCApOwoJICAgIHJldHVybjsKCX0KCWN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUxNi5mcmFtZTMyOwoJc3dfYWRkci5zZWcgPSBzczsKCXN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKICAgIH0KICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewogICAgICAgIHN3X2FkZHIuc2VnID0gKERXT1JEKS0xOwoJc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CiAgICB9CiAgICAKICAgIGZvciAob2sgPSBUUlVFOyBvazspIHsKICAgICAgICBpZiAoKGZyYW1lc1tmcmFtZW5vXS5zcyA9PSBzd19hZGRyLnNlZykgJiYKCSAgICAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpIHsKCSAgIC8qIDE2PC0+MzIgc3dpdGNoLi4uCgkgICAgKiB5ZXMsIEkga25vdyB0aGlzIGlzIGNvbmZ1c2luZywgaXQgZ2F2ZSBtZSBhIGhlYWRhY2hlIHRvbyAqLwoJICAgaWYgKGlzMTYpIHsKCSAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgICh1bnNpZ25lZCBsb25nKShTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkJICByZXR1cm47CgkgICAgICAgfQoKCSAgICAgICBjb2RlLnNlZyAgPSAwOwoJICAgICAgIGNvZGUub2ZmICA9IGZyYW1lMzIucmV0YWRkcjsKCSAgICAgICAKCSAgICAgICBjcyA9IDA7CgkgICAgICAgYWRkci5zZWcgPSAwOwoJICAgICAgIGFkZHIub2ZmID0gZnJhbWUzMi5lYnA7CgkgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDMyLCBub2lzeSApOwoJICAgICAgIAoJICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCSAgICAgICBwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgkgICAgICAgCgkgICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopcCwgJmZyYW1lMTYsIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJCSAgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkJICAgICh1bnNpZ25lZCBsb25nKShTVEFDSzE2RlJBTUUqKXAgKTsKCQkgICByZXR1cm47CgkgICAgICAgfQoJICAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpZnJhbWUxNi5mcmFtZTMyOwoJICAgICAgIHN3X2FkZHIuc2VnID0gMDsKCSAgICAgICBzd19hZGRyLm9mZiA9IGN1cl9zd2l0Y2g7CgkgICAgICAgCgkgICAgICAgaXMxNiA9IEZBTFNFOwoJICAgfSBlbHNlIHsKCSAgICAgIHRtcC5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgIHRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CgkgICAgICBwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgkgICAgICAKCSAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwKCQkJCQkgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkJICByZXR1cm47CgkgICAgICB9CgkgICAgICAKCSAgICAgIGNvZGUuc2VnICA9IGZyYW1lMTYuY3M7CgkgICAgICBjb2RlLm9mZiAgPSBmcmFtZTE2LmlwOwoJICAgICAgCgkgICAgICBjcyA9IGZyYW1lMTYuY3M7CgkgICAgICBhZGRyLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgYWRkci5vZmYgPSBmcmFtZTE2LmJwOwoJICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDE2LCBub2lzeSApOwoJICAgICAgCgkgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJCSBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgcmV0dXJuOwoJICAgICAgfQoJICAgICAgY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTMyLmZyYW1lMTY7CgkgICAgICBzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7CgkgICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwoJICAgICAgCgkgICAgICBpczE2ID0gVFJVRTsKCSAgIH0KCSAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewoJICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CgkgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKCSAgIH0KCX0gZWxzZSB7CgkgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KCSAgIG9rID0gaXMxNiA/IERFQlVHX0ZyYW1lMTYoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpCgkgICAgICA6IERFQlVHX0ZyYW1lMzIoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpOwoJfQogICAgfQogICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIlxuIiApOwojZW5kaWYKfQoKaW50CkRFQlVHX1NldEZyYW1lKGludCBuZXdmcmFtZSkKewojaWZkZWYgX19pMzg2X18KICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKI2Vsc2UgLyogX19pMzg2X18gKi8KICByZXR1cm4gRkFMU0U7CiNlbmRpZiAvKiBfX2kzODZfXyAqLwp9CgppbnQKREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgdW5zaWduZWQgaW50ICogZWlwLAoJCSAgICAgIHVuc2lnbmVkIGludCAqIGVicCkKewojaWZkZWYgX19pMzg2X18KICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7CiNlbHNlIC8qIF9faTM4Nl9fICovCiAgcmV0dXJuIEZBTFNFOwojZW5kaWYgLyogX19pMzg2X18gKi8KfQoK