LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCgoKLyoKICogV2Uga2VlcCB0aGlzIGluZm8gZm9yIGVhY2ggZnJhbWUsIHNvIHRoYXQgd2UgY2FuCiAqIGZpbmQgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24gY29ycmVjdGx5LgogKi8Kc3RydWN0IGJ0X2luZm8KewogIHVuc2lnbmVkIGludAkgICAgIGNzOwogIHVuc2lnbmVkIGludAkgICAgIGVpcDsKICB1bnNpZ25lZCBpbnQJICAgICBzczsKICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CiAgc3RydWN0IHN5bWJvbF9pbmZvIGZyYW1lOwp9OwoKc3RhdGljIGludCBuZnJhbWU7CnN0YXRpYyBzdHJ1Y3QgYnRfaW5mbyAqIGZyYW1lcyA9IE5VTEw7CmludCBjdXJyX2ZyYW1lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiNpZmRlZiBfX2kzODZfXwogICAgREJHX0FERFIgYWRkcjsKCiAgICBhZGRyLnR5cGUgPSBOVUxMOwogICAgYWRkci5zZWcgPSBTU19yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgYWRkci5vZmYgPSBFU1BfcmVnKCZERUJVR19jb250ZXh0KTsKCiAgICBmcHJpbnRmKHN0ZGVyciwiU3RhY2sgZHVtcDpcbiIpOwogICAgaWYgKElTX1NFTEVDVE9SXzMyQklUKGFkZHIuc2VnKSkKICAgIHsgIC8qIDMyLWJpdCBtb2RlICovCiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIDI0LCAneCcgKTsKICAgIH0KICAgIGVsc2UgIC8qIDE2LWJpdCBtb2RlICovCiAgICB7CiAgICAgICAgYWRkci5vZmYgJj0gMHhmZmZmOwogICAgICAgIERFQlVHX0V4YW1pbmVNZW1vcnkoICZhZGRyLCAyNCwgJ3cnICk7CiAgICB9CiAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKI2VuZGlmCn0KCiNpZmRlZiBfX2kzODZfXwpzdGF0aWMgdm9pZCBERUJVR19Gb3JjZUZyYW1lKERCR19BRERSICpzdGFjaywgREJHX0FERFIgKmNvZGUsIGludCBmcmFtZW5vLCBpbnQgYml0cywgaW50IG5vaXN5KQp7CiAgICBpbnQgdGhlZnJhbWUgPSBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gY29kZS0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBjb2RlLT5vZmY7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBjb2RlLCBiaXRzLCAKCQkJCQkJc3RhY2stPm9mZiwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggY29kZSwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIHN0YWNrLT5vZmYsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUubGlzdCk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLnNzID0gc3RhY2stPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gc3RhY2stPm9mZjsKICAgIGlmIChub2lzeSkgewogICAgICBmcHJpbnRmKCBzdGRlcnIsIChiaXRzID09IDE2KSA/ICIgKGJwPSUwNGx4KVxuIiA6ICIgKGVicD0lMDhseClcbiIsIHN0YWNrLT5vZmYgKTsKICAgIH0KfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUxNihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IHNzID0gYWRkci0+c2VnLCBwb3NzaWJsZV9jcyA9IDA7CiAgICBGUkFNRTE2ICpmcmFtZSA9IChGUkFNRTE2ICopREJHX0FERFJfVE9fTElOKGFkZHIpOwogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lOwoKICAgIGlmIChERUJVR19Jc0JhZFJlYWRQdHIoIGFkZHIsIHNpemVvZihGUkFNRTE2KSApKSB7CiAgICAgICBpZiAobm9pc3kpIHsKCSAgZnByaW50ZihzdGRlcnIsIioqKiBJbnZhbGlkIGFkZHJlc3MgIik7CgkgIERFQlVHX1ByaW50QWRkcmVzcyhhZGRyLCBkYmdfbW9kZSwgRkFMU0UpOwoJICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKICAgICAgIH0KICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghZnJhbWUtPmJwKSByZXR1cm4gRkFMU0U7CiAgICBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgZnByaW50ZihzdGRlcnIsIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBpZiAoZnJhbWUtPmJwICYgMSkgKmNzID0gZnJhbWUtPmNzOwogICAgZWxzZSB7CiAgICAgIC8qIG5vdCBleHBsaWNpdGx5IG1hcmtlZCBhcyBmYXIgY2FsbCwKICAgICAgICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgIGlmICgoKGZyYW1lLT5jcyY3KT09NykgJiYgKGZyYW1lLT5jcyAhPSAqY3MpICYmICFJU19TRUxFQ1RPUl9GUkVFKGZyYW1lLT5jcykpIHsKICAgICAgICBsZHRfZW50cnkgdGNzOwogICAgICAgIExEVF9HZXRFbnRyeSggU0VMRUNUT1JfVE9fRU5UUlkoZnJhbWUtPmNzKSwgJnRjcyApOwogICAgICAgIGlmICggdGNzLnR5cGUgPT0gU0VHTUVOVF9DT0RFICkgewogICAgICAgICAgLyogaXQgaXMgdmVyeSB1bmNvbW1vbiB0byBwdXNoIGEgY29kZSBzZWdtZW50IGNzIGFzCiAgICAgICAgICAgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCiAgICAgICAgICAqY3MgPSBwb3NzaWJsZV9jcyA9IGZyYW1lLT5jczsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLT5pcDsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDE2LCAKCQkJCQkJZnJhbWUtPmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUtPmJwLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+YnAgJiB+MTsKICAgIGlmIChub2lzeSkgewogICAgICBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNGx4IiwgYWRkci0+b2ZmICk7CiAgICAgIGlmIChwb3NzaWJsZV9jcykgewogICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiwgZmFyIGNhbGwgYXNzdW1lZCIgKTsKICAgICAgfQogICAgICBmcHJpbnRmKCBzdGRlcnIsICIpXG4iICk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIEJPT0wgREVCVUdfRnJhbWUzMihEQkdfQUREUiAqYWRkciwgdW5zaWduZWQgaW50ICpjcywgaW50IGZyYW1lbm8sIGludCBub2lzeSkKewogICAgdW5zaWduZWQgaW50IHNzID0gYWRkci0+c2VnOwogICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoREVCVUdfSXNCYWRSZWFkUHRyKCBhZGRyLCBzaXplb2YoRlJBTUUzMikgKSkgewogICAgICAgaWYgKG5vaXN5KSB7CgkgIGZwcmludGYoc3RkZXJyLCIqKiogSW52YWxpZCBhZGRyZXNzICIpOwoJICBERUJVR19QcmludEFkZHJlc3MoYWRkciwgZGJnX21vZGUsIEZBTFNFKTsKCSAgZnByaW50ZihzdGRlcnIsIlxuIik7CiAgICAgICB9CiAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBpZiAoIWZyYW1lLT5pcCkgcmV0dXJuIEZBTFNFOwogICAgbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGFkZHItPnNlZyA9ICpjczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gYWRkci0+b2ZmID0gZnJhbWUtPmlwOwogICAgaWYgKG5vaXN5KQogICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggYWRkciwgMzIsIAoJCQkJCQlmcmFtZS0+YnAsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGFkZHIsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBmcmFtZS0+YnAsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUubGlzdCk7CiAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIiAoZWJwPSUwOGx4KVxuIiwgZnJhbWUtPmJwICk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLnNzID0gYWRkci0+c2VnID0gc3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IGZyYW1lLT5icDsKICAgIGlmIChhZGRyLT5vZmYgPT0gZnJhbWUtPmJwKSByZXR1cm4gRkFMU0U7CiAgICBhZGRyLT5vZmYgPSBmcmFtZS0+YnA7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgREVCVUdfRG9CYWNrVHJhY2UoaW50IG5vaXN5KQp7CiAgICBEQkdfQUREUiBhZGRyLCBzd19hZGRyOwogICAgdW5zaWduZWQgaW50IHNzID0gU1NfcmVnKCZERUJVR19jb250ZXh0KSwgY3MgPSBDU19yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgaW50IGZyYW1lbm8gPSAwLCBpczE2LCBvazsKICAgIERXT1JEIG5leHRfc3dpdGNoLCBjdXJfc3dpdGNoOwoKICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFja3RyYWNlOlxuIiApOwoKICAgIG5mcmFtZSA9IDE7CiAgICBpZiAoZnJhbWVzKSBEQkdfZnJlZSggZnJhbWVzICk7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKikgREJHX2FsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsKGN1cnJfZnJhbWUgPT0gMCA/ICI9PiIgOiAiICAiKSwgZnJhbWVubyk7CgogICAgaWYgKElTX1NFTEVDVE9SX1NZU1RFTShzcykpIHNzID0gMDsKICAgIGlmIChJU19TRUxFQ1RPUl9TWVNURU0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIGlmIChJU19TRUxFQ1RPUl8zMkJJVChzcykpCiAgICB7CiAgICAgICAgZnJhbWVzWzBdLmNzID0gYWRkci5zZWcgPSBjczsKICAgICAgICBmcmFtZXNbMF0uZWlwID0gYWRkci5vZmYgPSBFSVBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpCiAgICAgICAgICBmcmFtZXNbMF0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCAzMiwgVFJVRSApOwogICAgICAgIGVsc2UKCSAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICZhZGRyLCBUUlVFLCAmZnJhbWVzWzBdLmZyYW1lLnN5bSwgMCwgCgkJCQkJCSZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CiAgICAgICAgZnJhbWVzWzBdLnNzID0gYWRkci5zZWcgPSBzczsKCWZyYW1lc1swXS5lYnAgPSBhZGRyLm9mZiA9IEVCUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChlYnA9JTA4eClcbiIsIGZyYW1lc1swXS5lYnAgKTsKICAgICAgICBpczE2ID0gRkFMU0U7CiAgICB9IGVsc2UgewogICAgICAgIGZyYW1lc1swXS5jcyA9IGFkZHIuc2VnID0gY3M7CiAgICAgICAgZnJhbWVzWzBdLmVpcCA9IGFkZHIub2ZmID0gTE9XT1JEKEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpKTsKICAgICAgICBpZiAobm9pc3kpCiAgICAgICAgICBmcmFtZXNbMF0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3MoICZhZGRyLCAxNiwgVFJVRSApOwogICAgICAgIGVsc2UKCSAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICZhZGRyLCBUUlVFLCAmZnJhbWVzWzBdLmZyYW1lLnN5bSwgMCwgCgkJCQkJCSZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CiAgICAgICAgZnJhbWVzWzBdLnNzID0gYWRkci5zZWcgPSBzczsKCWZyYW1lc1swXS5lYnAgPSBhZGRyLm9mZiA9IEJQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICIgKGJwPSUwNHgpXG4iLCBmcmFtZXNbMF0uZWJwICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CiAgICB9CgogICAgbmV4dF9zd2l0Y2ggPSBOdEN1cnJlbnRUZWIoKS0+Y3VyX3N0YWNrOwogICAgaWYgKGlzMTYpIHsKICAgICAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgcmV0dXJuOwogICAgICB9CiAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoKS0+ZnJhbWUxNjsKICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwogICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkgKTsKCSByZXR1cm47CiAgICAgIH0KICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpKS0+ZnJhbWUzMjsKICAgICAgc3dfYWRkci5zZWcgPSBzczsKICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKERFQlVHX0lzQmFkUmVhZFB0cigmc3dfYWRkciwxKSkgewogICAgICBzd19hZGRyLnNlZyA9IChEV09SRCktMTsKICAgICAgc3dfYWRkci5vZmYgPSAoRFdPUkQpLTE7CiAgICB9CgogICAgZm9yIChvayA9IFRSVUU7IG9rOykgewogICAgICBpZiAoKGZyYW1lc1tmcmFtZW5vXS5zcyA9PSBzd19hZGRyLnNlZykgJiYKICAgICAgICAgIChmcmFtZXNbZnJhbWVub10uZWJwID49IHN3X2FkZHIub2ZmKSkgewogICAgICAgIC8qIDE2PC0+MzIgc3dpdGNoLi4uCiAgICAgICAgICogeWVzLCBJIGtub3cgdGhpcyBpcyBjb25mdXNpbmcsIGl0IGdhdmUgbWUgYSBoZWFkYWNoZSB0b28gKi8KICAgICAgICBpZiAoaXMxNikgewogICAgICAgICAgU1RBQ0szMkZSQU1FICpmcmFtZSA9IChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoOwogICAgICAgICAgREJHX0FERFIgY29kZTsKCgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJICAgIHJldHVybjsKCSAgfQoJICBjb2RlLnR5cGUgPSBOVUxMOwoJICBjb2RlLnNlZyAgPSAwOwoJICBjb2RlLm9mZiAgPSBmcmFtZS0+cmV0YWRkcjsKCiAgICAgICAgICBjcyA9IDA7CiAgICAgICAgICBhZGRyLnNlZyA9IDA7CiAgICAgICAgICBhZGRyLm9mZiA9IGZyYW1lLT5lYnA7CiAgICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgMzIsIG5vaXN5ICk7CgogICAgICAgICAgbmV4dF9zd2l0Y2ggPSBjdXJfc3dpdGNoOwoJICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSApOwoJICAgIHJldHVybjsKCSAgfQogICAgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpKS0+ZnJhbWUzMjsKICAgICAgICAgIHN3X2FkZHIuc2VnID0gMDsKICAgICAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKCiAgICAgICAgICBpczE2ID0gRkFMU0U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUgPSAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCk7CiAgICAgICAgICBEQkdfQUREUiBjb2RlOwoKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkgKTsKCSAgICByZXR1cm47CgkgIH0KCgkgIGNvZGUudHlwZSA9IE5VTEw7CgkgIGNvZGUuc2VnICA9IGZyYW1lLT5jczsKCSAgY29kZS5vZmYgID0gZnJhbWUtPmlwOwoKICAgICAgICAgIGNzID0gZnJhbWUtPmNzOwogICAgICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKICAgICAgICAgIGFkZHIub2ZmID0gZnJhbWUtPmJwOwogICAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDE2LCBub2lzeSApOwoKICAgICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICJCYWQgc3RhY2sgZnJhbWUgJXBcbiIsIChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKSgoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCktPmZyYW1lMTY7CiAgICAgICAgICBzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7CiAgICAgICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwoKICAgICAgICAgIGlzMTYgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBpZiAoREVCVUdfSXNCYWRSZWFkUHRyKCZzd19hZGRyLDEpKSB7CiAgICAgICAgICBzd19hZGRyLnNlZyA9IChEV09SRCktMTsKICAgICAgICAgIHN3X2FkZHIub2ZmID0gKERXT1JEKS0xOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBvcmRpbmFyeSBzdGFjayBmcmFtZSAqLwogICAgICAgIG9rID0gaXMxNiA/IERFQlVHX0ZyYW1lMTYoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpCiAgICAgICAgICAgICAgICAgIDogREVCVUdfRnJhbWUzMiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cn0KI2VuZGlmCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2Uodm9pZCkKewojaWZkZWYgX19pMzg2X18KICAgIERFQlVHX0RvQmFja1RyYWNlKCBUUlVFICk7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX1NpbGVudEJhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfU2lsZW50QmFja1RyYWNlKHZvaWQpCnsKI2lmZGVmIF9faTM4Nl9fCiAgICBERUJVR19Eb0JhY2tUcmFjZSggRkFMU0UgKTsKI2VuZGlmCn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7Cn0KCg==