LyogU2hhcmVkIGxpYnJhcnkgYWRkLW9uIHRvIGlwdGFibGVzIHRvIGFkZCBsaW1pdCBzdXBwb3J0LgogKgogKiBK6XL0bWUgZGUgVml2aWUgICA8ZGV2aXZpZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogKiBIZXJ26SBFeWNoZW5uZSAgIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgogKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxpcHRhYmxlcy5oPgojaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfbGltaXQuaD4KCiNkZWZpbmUgSVBUX0xJTUlUX0FWRwkiMy9ob3VyIgojZGVmaW5lIElQVF9MSU1JVF9CVVJTVAk1CgovKiBGdW5jdGlvbiB3aGljaCBwcmludHMgb3V0IHVzYWdlIG1lc3NhZ2UuICovCnN0YXRpYyB2b2lkCmhlbHAodm9pZCkKewoJcHJpbnRmKAoibGltaXQgdiVzIG9wdGlvbnM6XG4iCiItLWxpbWl0IGF2ZwkJCW1heCBhdmVyYWdlIG1hdGNoIHJhdGU6IGRlZmF1bHQgIklQVF9MSU1JVF9BVkciXG4iCiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQYWNrZXRzIHBlciBzZWNvbmQgdW5sZXNzIGZvbGxvd2VkIGJ5IFxuIgoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc2VjIC9taW51dGUgL2hvdXIgL2RheSBwb3N0Zml4ZXNdXG4iCiItLWxpbWl0LWJ1cnN0IG51bWJlcgkJbnVtYmVyIHRvIG1hdGNoIGluIGEgYnVyc3QsIGRlZmF1bHQgJXVcbiIKIlxuIiwgTkVURklMVEVSX1ZFUlNJT04sIElQVF9MSU1JVF9CVVJTVCk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9IHsKCXsgImxpbWl0IiwgMSwgMCwgJyUnIH0sCgl7ICJsaW1pdC1idXJzdCIsIDEsIDAsICckJyB9LAoJeyAwIH0KfTsKCnN0YXRpYwppbnQgcGFyc2VfcmF0ZShjb25zdCBjaGFyICpyYXRlLCB1X2ludDMyX3QgKnZhbCkKewoJY29uc3QgY2hhciAqZGVsaW07Cgl1X2ludDMyX3QgcjsKCXVfaW50MzJfdCBtdWx0ID0gMTsgIC8qIFNlY29uZHMgYnkgZGVmYXVsdC4gKi8KCglkZWxpbSA9IHN0cmNocihyYXRlLCAnLycpOwoJaWYgKGRlbGltKSB7CgkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQoJCQlyZXR1cm4gMDsKCgkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAxOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJtaW51dGUiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSA2MDsKCQllbHNlIGlmIChzdHJuY2FzZWNtcChkZWxpbSsxLCAiaG91ciIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKCQkJbXVsdCA9IDYwKjYwOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAyNCo2MCo2MDsKCQllbHNlCgkJCXJldHVybiAwOwoJfQoJciA9IGF0b2kocmF0ZSk7CglpZiAoIXIpCgkJcmV0dXJuIDA7CgoJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKICAgICAgICAgICBjYW4gc3BlY2lmeSwgc28gd2UncmUgb2sgYXQgdGhhdCBlbmQpLiAqLwoJaWYgKHIgLyBtdWx0ID4gSVBUX0xJTUlUX1NDQUxFKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJSYXRlIHRvbyBmYXN0IGAlcydcbiIsIHJhdGUpOwoKCSp2YWwgPSBJUFRfTElNSVRfU0NBTEUgKiBtdWx0IC8gcjsKCXJldHVybiAxOwp9CgovKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8Kc3RhdGljIHZvaWQKaW5pdChzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptLCB1bnNpZ25lZCBpbnQgKm5mY2FjaGUpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW0tPmRhdGE7CgoJcGFyc2VfcmF0ZShJUFRfTElNSVRfQVZHLCAmci0+YXZnKTsKCXItPmJ1cnN0ID0gSVBUX0xJTUlUX0JVUlNUOwoKCS8qIENhbid0IGNhY2hlIHRoaXMgKi8KCSpuZmNhY2hlIHw9IE5GQ19VTktOT1dOOwp9CgovKiBGSVhNRTogaGFuZGxlIG92ZXJmbG93OgoJaWYgKHItPmF2ZypyLT5idXJzdC9yLT5idXJzdCAhPSByLT5hdmcpCgkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJICAgIlNvcnJ5OiBidXJzdCB0b28gbGFyZ2UgZm9yIHRoYXQgYXZnIHJhdGUuXG4iKTsKKi8KCi8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAogICBhdGUgYW4gb3B0aW9uICovCnN0YXRpYyBpbnQKcGFyc2UoaW50IGMsIGNoYXIgKiphcmd2LCBpbnQgaW52ZXJ0LCB1bnNpZ25lZCBpbnQgKmZsYWdzLAogICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplbnRyeSwKICAgICAgdW5zaWduZWQgaW50ICpuZmNhY2hlLAogICAgICBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICoqbWF0Y2gpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKSgqbWF0Y2gpLT5kYXRhOwoJaW50IG51bTsKCglzd2l0Y2goYykgewoJY2FzZSAnJSc6CgkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxpbWl0Iik7CgkJaWYgKCFwYXJzZV9yYXRlKG9wdGFyZywgJnItPmF2ZykpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkgICAiYmFkIHJhdGUgYCVzJyIsIG9wdGFyZyk7CgkJYnJlYWs7CgoJY2FzZSAnJCc6CgkJaWYgKGNoZWNrX2ludmVyc2Uob3B0YXJnLCAmaW52ZXJ0KSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSAgICJVbmV4cGVjdGVkIGAhJyBhZnRlciAtLWxpbWl0LWJ1cnN0Iik7CgoJCW51bSA9IHN0cmluZ190b19udW1iZXIob3B0YXJnLCAwLCAxMDAwMCk7CgkJaWYgKG51bSA8PSAwKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJICAgImJhZCAtLWxpbWl0LWJ1cnN0IGAlcyciLCBvcHRhcmcpOwoJCXItPmJ1cnN0ID0gbnVtOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qIEZpbmFsIGNoZWNrOyBub3RoaW5nLiAqLwpzdGF0aWMgdm9pZCBmaW5hbF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCnsKfQoKc3RhdGljIHN0cnVjdCByYXRlcwp7Cgljb25zdCBjaGFyICpuYW1lOwoJdV9pbnQzMl90IG11bHQ7Cn0gcmF0ZXNbXSA9IHsgeyAiZGF5IiwgSVBUX0xJTUlUX1NDQUxFKjI0KjYwKjYwIH0sCgkgICAgICB7ICJob3VyIiwgSVBUX0xJTUlUX1NDQUxFKjYwKjYwIH0sCgkgICAgICB7ICJtaW4iLCBJUFRfTElNSVRfU0NBTEUqNjAgfSwKCSAgICAgIHsgInNlYyIsIElQVF9MSU1JVF9TQ0FMRSB9IH07CgpzdGF0aWMgdm9pZCBwcmludF9yYXRlKHVfaW50MzJfdCBwZXJpb2QpCnsKCXVuc2lnbmVkIGludCBpOwoKCWZvciAoaSA9IDE7IGkgPCBzaXplb2YocmF0ZXMpL3NpemVvZihzdHJ1Y3QgcmF0ZXMpOyBpKyspIHsKCQlpZiAocGVyaW9kID4gcmF0ZXNbaV0ubXVsdAoJCSAgICB8fCByYXRlc1tpXS5tdWx0ICUgcGVyaW9kICE9IDApCgkJCWJyZWFrOwoJfQoKCXByaW50ZigiJXUvJXMgIiwgcmF0ZXNbaS0xXS5tdWx0IC8gcGVyaW9kLCByYXRlc1tpLTFdLm5hbWUpOwp9CgovKiBQcmludHMgb3V0IHRoZSBtYXRjaGluZm8uICovCnN0YXRpYyB2b2lkCnByaW50KGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAogICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5X21hdGNoICptYXRjaCwKICAgICAgaW50IG51bWVyaWMpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW1hdGNoLT5kYXRhOwoJcHJpbnRmKCJsaW1pdDogYXZnICIpOyBwcmludF9yYXRlKHItPmF2Zyk7CglwcmludGYoImJ1cnN0ICV1ICIsIHItPmJ1cnN0KTsKfQoKLyogRklYTUU6IE1ha2UgbWluaW1hbGlzdDogb25seSBwcmludCByYXRlIGlmIG5vdCBkZWZhdWx0IC0tUlIgKi8Kc3RhdGljIHZvaWQgc2F2ZShjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwgY29uc3Qgc3RydWN0IGlwdF9lbnRyeV9tYXRjaCAqbWF0Y2gpCnsKCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSAoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW1hdGNoLT5kYXRhOwoKCXByaW50ZigiLS1saW1pdCAiKTsgcHJpbnRfcmF0ZShyLT5hdmcpOwoJaWYgKHItPmJ1cnN0ICE9IElQVF9MSU1JVF9CVVJTVCkKCQlwcmludGYoIi0tbGltaXQtYnVyc3QgJXUgIiwgci0+YnVyc3QpOwp9CgpzdHJ1Y3QgaXB0YWJsZXNfbWF0Y2ggbGltaXQKPSB7IE5VTEwsCiAgICAibGltaXQiLAogICAgTkVURklMVEVSX1ZFUlNJT04sCiAgICBzaXplb2Yoc3RydWN0IGlwdF9yYXRlaW5mbyksCiAgICAmaGVscCwKICAgICZpbml0LAogICAgJnBhcnNlLAogICAgJmZpbmFsX2NoZWNrLAogICAgJnByaW50LAogICAgJnNhdmUsCiAgICBvcHRzCn07Cgp2b2lkIF9pbml0KHZvaWQpCnsKCXJlZ2lzdGVyX21hdGNoKCZsaW1pdCk7Cn0K