Lyogb2JqLWV2YXguYyAtIEVWQVggKG9wZW5WTVMvQWxwaGEpIG9iamVjdCBmaWxlIGZvcm1hdC4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIKCiAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICAgYW55IGxhdGVyIHZlcnNpb24uCgogICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLAogICBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwoKI2RlZmluZSBPQkpfSEVBREVSICJvYmotZXZheC5oIgoKI2luY2x1ZGUgImFzLmgiCgpzdGF0aWMgdm9pZCBzX2V2YXhfd2VhayBQQVJBTVMgKChpbnQpKTsKCmNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQp7CiAgeyAid2VhayIsIHNfZXZheF93ZWFrLCAwfSwKICB7MCwgMCwgMH0sCn07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KCnZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayAoKSB7fQoKLyogSGFuZGxlIHRoZSB3ZWFrIHNwZWNpZmljIHBzZXVkby1vcC4gICovCgpzdGF0aWMgdm9pZApzX2V2YXhfd2VhayAoaWdub3JlKQogICAgIGludCBpZ25vcmU7CnsKICBjaGFyICpuYW1lOwogIGludCBjOwogIHN5bWJvbFMgKnN5bWJvbFA7CiAgY2hhciAqc3RvcCA9IE5VTEw7CiAgY2hhciBzdG9wYzsKCiAgaWYgKGZsYWdfbXJpKQogICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwoKICBkbwogICAgewogICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwogICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CiAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CiAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKICAgICAgU19TRVRfV0VBSyAoc3ltYm9sUCk7CiAgICAgIGlmIChjID09ICcsJykKCXsKCSAgaW5wdXRfbGluZV9wb2ludGVyKys7CgkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKCSAgICBjID0gJ1xuJzsKCX0KICAgIH0KICB3aGlsZSAoYyA9PSAnLCcpOwoKICBpZiAoZmxhZ19tcmkpCiAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKCiAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKfQoKLyoKICogTG9jYWwgVmFyaWFibGVzOgogKiBjb21tZW50LWNvbHVtbjogMAogKiBmaWxsLWNvbHVtbjogMTMxCiAqIEVuZDoKICovCgovKiBlbmQgb2Ygb2JqLWV2YXguYyAqLwo=