LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCgoKLyoKICogV2Uga2VlcCB0aGlzIGluZm8gZm9yIGVhY2ggZnJhbWUsIHNvIHRoYXQgd2UgY2FuCiAqIGZpbmQgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24gY29ycmVjdGx5LgogKi8Kc3RydWN0IGJ0X2luZm8KewogIHVuc2lnbmVkIGludAkgICAgIGNzOwogIHVuc2lnbmVkIGludAkgICAgIGVpcDsKICB1bnNpZ25lZCBpbnQJICAgICBzczsKICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CiAgc3RydWN0IHN5bWJvbF9pbmZvIGZyYW1lOwp9OwoKc3RhdGljIGludCBuZnJhbWU7CnN0YXRpYyBzdHJ1Y3QgYnRfaW5mbyAqIGZyYW1lcyA9IE5VTEw7CmludCBjdXJyX2ZyYW1lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiAgICBEQkdfQUREUiBhZGRyOwoKICAgIGFkZHIudHlwZSA9IE5VTEw7CiAgICBhZGRyLnNlZyA9IFNTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBhZGRyLm9mZiA9IEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpOwoKICAgIGZwcmludGYoc3RkZXJyLCJTdGFjayBkdW1wOlxuIik7CiAgICBpZiAoSVNfU0VMRUNUT1JfMzJCSVQoYWRkci5zZWcpKQogICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmYWRkciwgMjQsICd4JyApOwogICAgfQogICAgZWxzZSAgLyogMTYtYml0IG1vZGUgKi8KICAgIHsKICAgICAgICBhZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIDI0LCAndycgKTsKICAgIH0KICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwp9CgoKc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgaW50IGJpdHMsIGludCBub2lzeSkKewogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGNvZGUtPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gY29kZS0+b2ZmOwogICAgaWYgKG5vaXN5KQogICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggY29kZSwgYml0cywgCgkJCQkJCXN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBzdGFjay0+b2ZmLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IHN0YWNrLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IHN0YWNrLT5vZmY7CiAgICBpZiAobm9pc3kpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseClcbiIgOiAiIChlYnA9JTA4bHgpXG4iLCBzdGFjay0+b2ZmICk7CiAgICB9Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMTYoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCBzcyA9IGFkZHItPnNlZywgcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAqZnJhbWUgPSAoRlJBTUUxNiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMTYpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmJwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBpZiAoZnJhbWUtPmJwICYgMSkgKmNzID0gZnJhbWUtPmNzOwogICAgZWxzZSB7CiAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKICAgICAgICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgIGlmICgoKGZyYW1lLT5jcyY3KT09NykgJiYgKGZyYW1lLT5jcyAhPSAqY3MpICYmICFJU19TRUxFQ1RPUl9GUkVFKGZyYW1lLT5jcykpIHsKICAgICAgICBsZHRfZW50cnkgdGNzOwogICAgICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoZnJhbWUtPmNzKSwgJnRjcyApOwogICAgICAgIGlmICggdGNzLnR5cGUgPT0gU0VHTUVOVF9DT0RFICkgewogICAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCiAgICAgICAgICAgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCiAgICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLT5jczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLT5pcDsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDE2LCAKCQkJCQkJZnJhbWUtPmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUtPmJwLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+YnAgJiB+MTsKICAgIGlmIChub2lzeSkgewogICAgICBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNGx4IiwgYWRkci0+b2ZmICk7CiAgICAgIGlmIChwb3NzaWJsZV9jcykgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiwgZmFyIGNhbGwgYXNzdW1lZCIgKTsKICAgICAgfQogICAgICBmcHJpbnRmKCBzdGRlcnIsICIpXG4iICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IHNzID0gYWRkci0+c2VnOwogICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggYWRkciwgc2l6ZW9mKEZSQU1FMzIpICkpIHJldHVybiBGQUxTRTsKICAgIGlmICghZnJhbWUtPmlwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gYWRkci0+c2VnID0gKmNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+aXA7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAzMiwgCgkJCQkJCWZyYW1lLT5icCwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIGZyYW1lLT5icCwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChlYnA9JTA4bHgpXG4iLCBmcmFtZS0+YnAgKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gZnJhbWUtPmJwOwogICAgaWYgKGFkZHItPm9mZiA9PSBmcmFtZS0+YnApIHJldHVybiBGQUxTRTsKICAgIGFkZHItPm9mZiA9IGZyYW1lLT5icDsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBERUJVR19Eb0JhY2tUcmFjZShpbnQgbm9pc3kpCnsKICAgIERCR19BRERSIGFkZHIsIHN3X2FkZHI7CiAgICB1bnNpZ25lZCBpbnQgc3MgPSBTU19yZWcoJkRFQlVHX2NvbnRleHQpLCBjcyA9IENTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBpbnQgZnJhbWVubyA9IDAsIGlzMTYsIG9rOwogICAgRFdPUkQgbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2g7CgogICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWNrdHJhY2U6XG4iICk7CgogICAgbmZyYW1lID0gMTsKICAgIGlmIChmcmFtZXMpIERCR19mcmVlKCBmcmFtZXMgKTsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKSBEQkdfYWxsb2MoIHNpemVvZihzdHJ1Y3QgYnRfaW5mbykgKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwoY3Vycl9mcmFtZSA9PSAwID8gIj0+IiA6ICIgICIpLCBmcmFtZW5vKTsKCiAgICBpZiAoSVNfU0VMRUNUT1JfU1lTVEVNKHNzKSkgc3MgPSAwOwogICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShjcykpIGNzID0gMDsKCiAgICAvKiBmaXJzdCBzdGFjayBmcmFtZSBmcm9tIHJlZ2lzdGVycyAqLwogICAgaWYgKElTX1NFTEVDVE9SXzMyQklUKHNzKSkKICAgIHsKICAgICAgICBmcmFtZXNbMF0uY3MgPSBhZGRyLnNlZyA9IGNzOwogICAgICAgIGZyYW1lc1swXS5laXAgPSBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkKICAgICAgICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDMyLCBUUlVFICk7CiAgICAgICAgZWxzZQoJICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKCQkJCQkJJmZyYW1lc1swXS5mcmFtZS5saXN0KTsKICAgICAgICBmcmFtZXNbMF0uc3MgPSBhZGRyLnNlZyA9IHNzOwoJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gRUJQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICIgKGVicD0lMDh4KVxuIiwgZnJhbWVzWzBdLmVicCApOwogICAgICAgIGlzMTYgPSBGQUxTRTsKICAgIH0gZWxzZSB7CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkKICAgICAgICAgIGZyYW1lc1swXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDE2LCBUUlVFICk7CiAgICAgICAgZWxzZQoJICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKCQkJCQkJJmZyYW1lc1swXS5mcmFtZS5saXN0KTsKICAgICAgICBmcmFtZXNbMF0uc3MgPSBhZGRyLnNlZyA9IHNzOwoJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gQlBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIiAoYnA9JTA0eClcbiIsIGZyYW1lc1swXS5lYnAgKTsKICAgICAgICBpczE2ID0gVFJVRTsKICAgIH0KCiAgICBuZXh0X3N3aXRjaCA9IFRIUkVBRF9DdXJyZW50KCktPmN1cl9zdGFjazsKICAgIGlmIChpczE2KSB7CiAgICAgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSByZXR1cm47CiAgICAgIH0KICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gpLT5mcmFtZTE2OwogICAgICBzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7CiAgICAgIHN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CiAgICB9IGVsc2UgewogICAgICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkgKTsKCSByZXR1cm47CiAgICAgIH0KICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpKS0+ZnJhbWUzMjsKICAgICAgc3dfYWRkci5zZWcgPSBzczsKICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKERFQlVHX0lzQmFkUmVhZFB0cigmc3dfYWRkciwxKSkgewogICAgICBzd19hZGRyLnNlZyA9IChEV09SRCktMTsKICAgICAgc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CiAgICB9CgogICAgZm9yIChvayA9IFRSVUU7IG9rOykgewogICAgICBpZiAoKGZyYW1lc1tmcmFtZW5vXS5zcyA9PSBzd19hZGRyLnNlZykgJiYKICAgICAgICAgIChmcmFtZXNbZnJhbWVub10uZWJwID49IHN3X2FkZHIub2ZmKSkgewogICAgICAgIC8qIDE2PC0+MzIgc3dpdGNoLi4uCiAgICAgICAgICogeWVzLCBJIGtub3cgdGhpcyBpcyBjb25mdXNpbmcsIGl0IGdhdmUgbWUgYSBoZWFkYWNoZSB0b28gKi8KICAgICAgICBpZiAoaXMxNikgewogICAgICAgICAgU1RBQ0szMkZSQU1FICpmcmFtZSA9IChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoOwogICAgICAgICAgREJHX0FERFIgY29kZTsKCgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJICAgIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47CgkgIH0KCSAgY29kZS50eXBlID0gTlVMTDsKCSAgY29kZS5zZWcgID0gMDsKCSAgY29kZS5vZmYgID0gZnJhbWUtPnJldGFkZHI7CgogICAgICAgICAgY3MgPSAwOwogICAgICAgICAgYWRkci5zZWcgPSAwOwogICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+ZWJwOwogICAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDMyLCBub2lzeSApOwoKICAgICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJICAgIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKSgoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkpLT5mcmFtZTMyOwogICAgICAgICAgc3dfYWRkci5zZWcgPSAwOwogICAgICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwoKICAgICAgICAgIGlzMTYgPSBGQUxTRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZSA9IChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKTsKICAgICAgICAgIERCR19BRERSIGNvZGU7CgoJICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgICAgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkgKTsKCSAgICByZXR1cm47CgkgIH0KCgkgIGNvZGUudHlwZSA9IE5VTEw7CgkgIGNvZGUuc2VnICA9IGZyYW1lLT5jczsKCSAgY29kZS5vZmYgID0gZnJhbWUtPmlwOwoKICAgICAgICAgIGNzID0gZnJhbWUtPmNzOwogICAgICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmJwOwogICAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDE2LCBub2lzeSApOwoKICAgICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJICAgIHJldHVybjsKCSAgfQogICAgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gpLT5mcmFtZTE2OwogICAgICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwogICAgICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCiAgICAgICAgICBpczE2ID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgaWYgKERFQlVHX0lzQmFkUmVhZFB0cigmc3dfYWRkciwxKSkgewogICAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CiAgICAgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KICAgICAgICBvayA9IGlzMTYgPyBERUJVR19GcmFtZTE2KCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KQogICAgICAgICAgICAgICAgICA6IERFQlVHX0ZyYW1lMzIoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpOwogICAgICB9CiAgICB9CiAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0JhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfQmFja1RyYWNlKHZvaWQpCnsKICAgIERFQlVHX0RvQmFja1RyYWNlKCBUUlVFICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfU2lsZW50QmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19TaWxlbnRCYWNrVHJhY2Uodm9pZCkKewogICAgREVCVUdfRG9CYWNrVHJhY2UoIEZBTFNFICk7Cn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7Cn0KCg==