LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxzeXNjYWxsLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CiNpbmNsdWRlIDxhc20vaWJtcGMuaD4KCgojaWYgMAovKiBkb25lICovCmludAlpbnRlcnJ1cHRfaW5pdCAgICAgKHZvaWQpOwp2b2lkCWlycV9pbnN0YWxsX2hhbmRsZXIoaW50LCBpbnRlcnJ1cHRfaGFuZGxlcl90ICosIHZvaWQgKik7CnZvaWQJaXJxX2ZyZWVfaGFuZGxlciAgIChpbnQpOwp2b2lkCWVuYWJsZV9pbnRlcnJ1cHRzICAodm9pZCk7CmludAlkaXNhYmxlX2ludGVycnVwdHMgKHZvaWQpOwoKLyogdG9kbyAqLwp2b2lkCXRpbWVyX2ludGVycnVwdCAgICAoc3RydWN0IHB0X3JlZ3MgKik7CnZvaWQJZXh0ZXJuYWxfaW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqKTsKdm9pZAlyZXNldF90aW1lcgkgICAodm9pZCk7CnVsb25nCWdldF90aW1lcgkgICAodWxvbmcgYmFzZSk7CnZvaWQJc2V0X3RpbWVyCSAgICh1bG9uZyB0KTsKCiNlbmRpZgoKc3RydWN0IGlkdF9lbnRyeSB7Cgl1MTYJYmFzZV9sb3c7Cgl1MTYJc2VsZWN0b3I7Cgl1OAlyZXM7Cgl1OAlhY2Nlc3M7Cgl1MTYJYmFzZV9oaWdoOwp9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKCgpzdHJ1Y3QgaWR0X2VudHJ5IGlkdFsyNTZdOwoKCiNkZWZpbmUgTUFYX0lSUSAxNgoKdHlwZWRlZiBzdHJ1Y3QgaXJxX2hhbmRsZXIgeyAKCXN0cnVjdCBpcnFfaGFuZGxlciAqbmV4dDsKCWludGVycnVwdF9oYW5kbGVyX3QqIGlzcl9mdW5jOwoJdm9pZCAqaXNyX2RhdGE7Cn0gaXJxX2hhbmRsZXJfdDsKCiNkZWZpbmUgSVJRX0RJU0FCTEVEICAgMQoKdHlwZWRlZiBzdHJ1Y3QgewoJaXJxX2hhbmRsZXJfdCAqaGFuZGxlcjsKCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwp9IGlycV9kZXNjX3Q7CgpzdGF0aWMgaXJxX2Rlc2NfdCBpcnFfdGFibGVbTUFYX0lSUV07CgoKLyogc3lzY2FsbCBzdHVmZiwgdmVyeSB1bnRlc3RlZCAKICogdGhlIGN1cnJlbnQgYXBwcm9hY2ggd2hpY2ggaW5jbHVkZXMgY29weWluZwogKiBwYXJ0IG9mIHRoZSBzdGFjayB3aWxsIHdvcmsgYmFkbHkgZm9yIAogKiB2YXJhcmdzIGZ1bmN0aW9ucy4KICogaWYgd2Ugd2VyZSB0byBzdG9yZSB0aGUgdG9wIHRocmVlIHdvcmRzIG9uIHRoZQogKiBzdGFjayAoZWlwLCBzcywgZWZsYWdzKSBzb213aGVyZSBhbmQgYWRkIDE0IHRvCiAqICVlc3AgLi4uLgogKi8KYXNtKCIuZ2xvYmwgc3lzY2FsbF9lbnRyeVxuIiBcCiAgICAgICAgInN5c2NhbGxfZW50cnk6XG4iIFwKICAgICAgICAibW92bCAgIDEyKCVlc3ApLCAlZWF4XG4iIFwKCSJtb3ZsICAgJWVzcCwgJWVieFxuIiBcCiAgICAgICAgImFkZGwgICAkMTYsICVlYnhcbiIgXAogICAgICAgICJwdXNobCAgJWVieFxuIiBcCiAgICAgICAgInB1c2hsICAlZWF4XG4iIFwKICAgICAgICAiY2FsbCAgIGRvX3N5c2NhbGxcbiIgXAogICAgICAgICJhZGRsICAgJDgsICVlc3BcbiIgXAogICAgICAgICJpcmV0XG4iKTsKCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzeXNjYWxsX2VudHJ5KHZvaWQpOwoKaW50IF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZG9fc3lzY2FsbCh1MzIgbnIsIHUzMiAqc3RhY2spCnsKCWlmIChucjxOUl9TWVNDQUxMUykgewoJCS8qIFdlIGNvcHkgOCBhcmdzIG9mIHRoZSBzeXNjYWxsLAoJCSAqIHRoaXMgd2lsbCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgCgkJICogcHJpbnRmIHN5c2NhbGwgLi4uLiAqLwoJCWludCAoKmZwKSh1MzIsIHUzMiwgdTMyLCB1MzIsCgkJCSAgdTMyLCB1MzIsIHUzMiwgdTMyKTsKCQlmcCA9IHN5c2NhbGxfdGJsW25yXTsKCQlyZXR1cm4gZnAoc3RhY2tbMF0sIHN0YWNrWzFdLCBzdGFja1syXSwgc3RhY2tbM10sCgkJCQkJICAgICBzdGFja1s0XSwgc3RhY2tbNV0sIHN0YWNrWzZdLCBzdGFja1s3XSk7Cgl9CgkKCXJldHVybiAtMTsKfQoJCgphc20gKCJpcnFfcmV0dXJuOlxuIgogICAgICIgICAgIGFkZGwgICQ0LCAlZXNwXG4iCiAgICAgIiAgICAgcG9wYVxuIgogICAgICIgICAgIGlyZXRcbiIpOwoKYXNtICgiZXhwX3JldHVybjpcbiIKICAgICAiICAgICBhZGRsICAkMTIsICVlc3BcbiIKICAgICAiICAgICBwb3AgICAlZXNwXG4iCiAgICAgIiAgICAgcG9wYVxuIgogICAgICIgICAgIGlyZXRcbiIpOwoKY2hhciBleGNlcHRpb25fc3RhY2tbNDA5Nl07CgojZGVmaW5lIERFQ0xBUkVfSU5URVJSVVBUKHgpIFwKCWFzbSgiLmdsb2JsIGlycV8iI3giXG4iIFwKCQkgICAgImlycV8iI3giOlxuIiBcCgkJICAgICJwdXNoYSBcbiIgXAoJCSAgICAicHVzaGwgJCIjeCJcbiIgXAoJCSAgICAicHVzaGwgJGlycV9yZXR1cm5cbiIgXAogICAgICAgICAgICAgICAgICAgICJqbXAgICBkb19pcnFcbiIpOyBcCgl2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaXJxXyMjeCh2b2lkKQoKI2RlZmluZSBERUNMQVJFX0VYQ0VQVElPTih4LCBmKSBcCglhc20oIi5nbG9ibCBleHBfIiN4IlxuIiBcCgkJICAgICJleHBfIiN4IjpcbiIgXAoJCSAgICAicHVzaGEgXG4iIFwKCQkgICAgIm1vdmwgICAgICVlc3AsICVlYnhcbiIgXAoJCSAgICAibW92bCAgICAgJGV4Y2VwdGlvbl9zdGFjaywgJWVheFxuIiBcCgkJICAgICJtb3ZsICAgICAlZWF4LCAlZXNwIFxuIiBcCgkJICAgICJwdXNobCAgICAlZWJ4XG4iIFwKCQkgICAgIm1vdmwgICAgIDMyKCVlc3ApLCAlZWJ4XG4iIFwKCQkgICAgInhvcmwgICAgICVlZHgsICVlZHhcbiIgXAoJCSAgICAibW92dyAgICAgMzYoJWVzcCksICVkeFxuIiBcCgkJICAgICJwdXNobCAgICAlZWR4XG4iIFwKCQkgICAgInB1c2hsICAgICVlYnhcbiIgXAoJCSAgICAicHVzaGwgICAgJCIjeCJcbiIgXAoJCSAgICAicHVzaGwgICAgJGV4cF9yZXR1cm5cbiIgXAoJCSAgICAiam1wICAgICAgIiNmIlxuIik7IFwKCXZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBleHBfIyN4KHZvaWQpCgpERUNMQVJFX0VYQ0VQVElPTigwLCBkaXZpZGVfZXhjZXB0aW9uX2VudHJ5KTsgICAgICAvKiBEaXZpZGUgZXhjZXB0aW9uICovCkRFQ0xBUkVfRVhDRVBUSU9OKDEsIGRlYnVnX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAgIC8qIERlYnVnIGV4Y2VwdGlvbiAqLwpERUNMQVJFX0VYQ0VQVElPTigyLCBubWlfZW50cnkpOyAgICAgICAgICAgICAgICAgICAvKiBOTUkgKi8KREVDTEFSRV9FWENFUFRJT04oMywgdW5rbm93bl9leGNlcHRpb25fZW50cnkpOyAgICAgLyogQnJlYWtwb2ludC9Db3Byb2Nlc3NvciBFcnJvciAqLwpERUNMQVJFX0VYQ0VQVElPTig0LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBPdmVyZmxvdyAqLwpERUNMQVJFX0VYQ0VQVElPTig1LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBCb3VuZHMgKi8KREVDTEFSRV9FWENFUFRJT04oNiwgaW52YWxpZF9pbnN0cnVjdGlvbl9lbnRyeSk7ICAgLyogSW52YWxpZCBpbnN0cnVjdGlvbiAqLwpERUNMQVJFX0VYQ0VQVElPTig3LCB1bmtub3duX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAvKiBEZXZpY2Ugbm90IHByZXNlbnQgKi8KREVDTEFSRV9FWENFUFRJT04oOCwgZG91YmxlX2ZhdWx0X2VudHJ5KTsgICAgICAgICAgLyogRG91YmxlIGZhdWx0ICovCkRFQ0xBUkVfRVhDRVBUSU9OKDksIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgIC8qIENvLXByb2Nlc3NvciBzZWdtZW50IG92ZXJydW4gKi8KREVDTEFSRV9FWENFUFRJT04oMTAsIGludmFsaWRfdHNzX2V4Y2VwdGlvbl9lbnRyeSk7LyogSW52YWxpZCBUU1MgKi8KREVDTEFSRV9FWENFUFRJT04oMTEsIHNlZ19mYXVsdF9lbnRyeSk7ICAgICAgICAgICAgLyogU2VnbWVudCBub3QgcHJlc2VudCAqLwpERUNMQVJFX0VYQ0VQVElPTigxMiwgc3RhY2tfZmF1bHRfZW50cnkpOyAgICAgICAgICAvKiBTdGFjayBvdmVyZmxvdyAqLwpERUNMQVJFX0VYQ0VQVElPTigxMywgZ3BmX2VudHJ5KTsgICAgICAgICAgICAgICAgICAvKiBHUEYgKi8KREVDTEFSRV9FWENFUFRJT04oMTQsIHBhZ2VfZmF1bHRfZW50cnkpOyAgICAgICAgICAgLyogUEYgKi8KREVDTEFSRV9FWENFUFRJT04oMTUsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMTYsIGZwX2V4Y2VwdGlvbl9lbnRyeSk7ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgKi8KREVDTEFSRV9FWENFUFRJT04oMTcsIGFsaWdubWVudF9jaGVja19lbnRyeSk7ICAgICAgLyogYWxpZ25tZW50IGNoZWNrICovCkRFQ0xBUkVfRVhDRVBUSU9OKDE4LCBtYWNoaW5lX2NoZWNrX2VudHJ5KTsgICAgICAgIC8qIG1hY2hpbmUgY2hlY2sgKi8KREVDTEFSRV9FWENFUFRJT04oMTksIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjAsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjEsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjIsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjMsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjQsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjUsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjYsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjcsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjgsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMjksIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMzAsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KREVDTEFSRV9FWENFUFRJT04oMzEsIHVua25vd25fZXhjZXB0aW9uX2VudHJ5KTsgICAgLyogUmVzZXJ2ZWQgKi8KCkRFQ0xBUkVfSU5URVJSVVBUKDApOwpERUNMQVJFX0lOVEVSUlVQVCgxKTsKREVDTEFSRV9JTlRFUlJVUFQoMyk7CkRFQ0xBUkVfSU5URVJSVVBUKDQpOwpERUNMQVJFX0lOVEVSUlVQVCg1KTsKREVDTEFSRV9JTlRFUlJVUFQoNik7CkRFQ0xBUkVfSU5URVJSVVBUKDcpOwpERUNMQVJFX0lOVEVSUlVQVCg4KTsKREVDTEFSRV9JTlRFUlJVUFQoOSk7CkRFQ0xBUkVfSU5URVJSVVBUKDEwKTsKREVDTEFSRV9JTlRFUlJVUFQoMTEpOwpERUNMQVJFX0lOVEVSUlVQVCgxMik7CkRFQ0xBUkVfSU5URVJSVVBUKDEzKTsKREVDTEFSRV9JTlRFUlJVUFQoMTQpOwpERUNMQVJFX0lOVEVSUlVQVCgxNSk7CiAgCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkZWZhdWx0X2lzcih2b2lkKTsgCmFzbSAoImRlZmF1bHRfaXNyOiBpcmV0XG4iKTsKCnZvaWQgZGlzYWJsZV9pcnEoaW50IGlycSkgCnsKCWlmIChpcnEgPj0gTUFYX0lSUSkgewoJCXJldHVybjsKCX0KCWlycV90YWJsZVtpcnFdLnN0YXR1cyB8PSBJUlFfRElTQUJMRUQ7CgkKfQoKdm9pZCBlbmFibGVfaXJxKGludCBpcnEpIAp7CglpZiAoaXJxID49IE1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CglpcnFfdGFibGVbaXJxXS5zdGF0dXMgJj0gfklSUV9ESVNBQkxFRDsKfQoKLyogbWFza3Mgb25lIHNwZWNpZmljIElSUSBpbiB0aGUgUElDICovCnN0YXRpYyB2b2lkIHVubWFza19pcnEoaW50IGlycSkKewoJaW50IGltcl9wb3J0OwoJCglpZiAoaXJxID49IE1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CglpZiAoaXJxID4gNykgewoJCWltcl9wb3J0ID0gU0xBVkVfUElDICsgSU1SOwoJfSBlbHNlIHsKCQlpbXJfcG9ydCA9IE1BU1RFUl9QSUMgKyBJTVI7Cgl9CgkKCW91dGIoaW5iKGltcl9wb3J0KSZ+KDE8PChpcnEmNykpLCBpbXJfcG9ydCk7Cn0KCgovKiB1bm1hc2tzIG9uZSBzcGVjaWZpYyBJUlEgaW4gdGhlIFBJQyAqLwpzdGF0aWMgdm9pZCBtYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgkKCWlmIChpcnEgPj0gTUFYX0lSUSkgewoJCXJldHVybjsKCX0KCWlmIChpcnEgPiA3KSB7CgkJaW1yX3BvcnQgPSBTTEFWRV9QSUMgKyBJTVI7Cgl9IGVsc2UgewoJCWltcl9wb3J0ID0gTUFTVEVSX1BJQyArIElNUjsKCX0KCQoJb3V0YihpbmIoaW1yX3BvcnQpfCgxPDwoaXJxJjcpKSwgaW1yX3BvcnQpOyAKfQoKCi8qIGlzc3VlIGEgU3BlY2lmaWMgRW5kIE9mIEludGVycnVwdCBpbnN0cnVjaXRvbiAqLwpzdGF0aWMgdm9pZCBzcGVjaWZpY19lb2koaW50IGlycSkKewoJLyogSWYgaXQgaXMgb24gdGhlIHNsYXZlIFBJQyB0aGlzIGhhdmUgdG8gYmUgcGVyZm9ybWVkIG9uCgkgKiBib3RoIHRoZSBtYXN0ZXIgYW5kIHRoZSBzbGF2ZSBQSUNzICovCglpZiAoaXJxID4gNykgewoJCW91dGIoT0NXMl9TRU9JfChpcnEmNyksIFNMQVZFX1BJQyArIE9DVzIpOwoJCWlycSA9IFNFT0lfSVIyOyAgICAgICAgICAgICAgIC8qIGFsc28gZG8gSVIyIG9uIG1hc3RlciAqLwoJfSAKCW91dGIoT0NXMl9TRU9JfGlycSwgTUFTVEVSX1BJQyArIE9DVzIpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZG9faXJxKGludCBpcnEpIAp7CgkKCW1hc2tfaXJxKGlycSk7CgkKCWlmIChpcnFfdGFibGVbaXJxXS5zdGF0dXMgJiBJUlFfRElTQUJMRUQpIHsKCQl1bm1hc2tfaXJxKGlycSk7CgkJc3BlY2lmaWNfZW9pKGlycSk7CgkJcmV0dXJuOwoJfQoJCgkKCWlmIChOVUxMICE9IGlycV90YWJsZVtpcnFdLmhhbmRsZXIpIHsKCQlpcnFfaGFuZGxlcl90ICpoYW5kbGVyOwoJCWZvciAoaGFuZGxlciA9IGlycV90YWJsZVtpcnFdLmhhbmRsZXI7IAoJCSAgICAgTlVMTCE9IGhhbmRsZXI7IGhhbmRsZXIgPSBoYW5kbGVyLT5uZXh0KSB7CgkJCWhhbmRsZXItPmlzcl9mdW5jKGhhbmRsZXItPmlzcl9kYXRhKTsKCQl9Cgl9IGVsc2UgewoJCWlmICgoaXJxICYgNykgIT0gNykgewkJCQkKCQkJcHJpbnRmKCJTcHVyaW91cyBpcnEgJWRcbiIsIGlycSk7CgkJfQoJfQkJCgl1bm1hc2tfaXJxKGlycSk7CglzcGVjaWZpY19lb2koaXJxKTsJCn0KCgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgdW5rbm93bl9leGNlcHRpb25fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAp7CglwcmludGYoIlVua25vd24gRXhjZXB0aW9uICVkIGF0ICUwNHg6JTA4eFxuIiwgY2F1c2UsIHNlZywgaXApOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZGl2aWRlX2V4Y2VwdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCnsKCXByaW50ZigiRGl2aWRlIEVycm9yIChEaXZpc2lvbiBieSB6ZXJvKSBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBkZWJ1Z19leGNlcHRpb25fZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAp7CglwcmludGYoIkRlYnVnIEludGVycnVwdCAoU2luZ2xlIHN0ZXApIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBubWlfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAp7CglwcmludGYoIk5NSSBJbnRlcnJ1cHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoJCQp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaW52YWxpZF9pbnN0cnVjdGlvbl9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCnsKCXByaW50ZigiSW52YWxpZCBJbnN0cnVjdGlvbiBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCQkJCQp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZG91YmxlX2ZhdWx0X2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKewoJcHJpbnRmKCJEb3VibGUgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgaW52YWxpZF90c3NfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKewoJcHJpbnRmKCJJbnZhbGlkIFRTUyBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwp9CgkJCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzZWdfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAp7CglwcmludGYoIlNlZ21lbnRhdGlvbiBmYXVsdCBhdCAlMDR4OiUwOHhcbiIsIHNlZywgaXApOwoJd2hpbGUoMSk7Cn0KCnZvaWQgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMCkpKSBzdGFja19mYXVsdF9lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCnsKCXByaW50ZigiU3RhY2sgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZ3BmX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKewoJcHJpbnRmKCJHZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIHBhZ2VfZmF1bHRfZW50cnkoaW50IGNhdXNlLCBpbnQgaXAsIGludCBzZWcpIAp7CglwcmludGYoIlBhZ2UgZmF1bHQgYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKCXdoaWxlKDEpOwp9Cgp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgZnBfZXhjZXB0aW9uX2VudHJ5KGludCBjYXVzZSwgaW50IGlwLCBpbnQgc2VnKSAKewoJcHJpbnRmKCJGbG9hdGluZyBwb2ludCBleGNlcHRpb24gYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGFsaWdubWVudF9jaGVja19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCnsKCXByaW50ZigiQWxpZ25tZW50IGNoZWNrIGF0ICUwNHg6JTA4eFxuIiwgc2VnLCBpcCk7Cn0KICAgICAgIAp2b2lkIF9fYXR0cmlidXRlX18gKChyZWdwYXJtKDApKSkgbWFjaGluZV9jaGVja19lbnRyeShpbnQgY2F1c2UsIGludCBpcCwgaW50IHNlZykgCnsKCXByaW50ZigiTWFjaGluZSBjaGVjayBleGNlcHRpb24gYXQgJTA0eDolMDh4XG4iLCBzZWcsIGlwKTsKfQoKCnZvaWQgaXJxX2luc3RhbGxfaGFuZGxlcihpbnQgaW5vLCBpbnRlcnJ1cHRfaGFuZGxlcl90ICpmdW5jLCB2b2lkICpwZGF0YSkKewoJaW50IHN0YXR1czsKCQoJaWYgKGlubz5NQVhfSVJRKSB7CgkJcmV0dXJuOwoJfQoJCQoJaWYgKE5VTEwgIT0gaXJxX3RhYmxlW2lub10uaGFuZGxlcikgewoJCXJldHVybjsKCX0KCQoJc3RhdHVzID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CglpcnFfdGFibGVbaW5vXS5oYW5kbGVyID0gbWFsbG9jKHNpemVvZihpcnFfaGFuZGxlcl90KSk7CglpZiAoTlVMTCA9PSBpcnFfdGFibGVbaW5vXS5oYW5kbGVyKSB7CgkJcmV0dXJuOwoJfQoJCgltZW1zZXQoaXJxX3RhYmxlW2lub10uaGFuZGxlciwgMCwgc2l6ZW9mKGlycV9oYW5kbGVyX3QpKTsKCQoJaXJxX3RhYmxlW2lub10uaGFuZGxlci0+aXNyX2Z1bmMgPSBmdW5jOwoJaXJxX3RhYmxlW2lub10uaGFuZGxlci0+aXNyX2RhdGEgPSBwZGF0YTsKCWlmIChzdGF0dXMpIHsKCQllbmFibGVfaW50ZXJydXB0cygpOwoJfQoJCgl1bm1hc2tfaXJxKGlubyk7CgkKCXJldHVybjsKfQoKdm9pZCBpcnFfZnJlZV9oYW5kbGVyKGludCBpbm8pCnsKCWludCBzdGF0dXM7CglpZiAoaW5vPk1BWF9JUlEpIHsKCQlyZXR1cm47Cgl9CgkKCXN0YXR1cyA9IGRpc2FibGVfaW50ZXJydXB0cygpOwoJbWFza19pcnEoaW5vKTsKCWlmIChOVUxMID09IGlycV90YWJsZVtpbm9dLmhhbmRsZXIpIHsKCQlyZXR1cm47Cgl9CglmcmVlKGlycV90YWJsZVtpbm9dLmhhbmRsZXIpOwoJaXJxX3RhYmxlW2lub10uaGFuZGxlcj1OVUxMOwoJaWYgKHN0YXR1cykgewoJCWVuYWJsZV9pbnRlcnJ1cHRzKCk7Cgl9CglyZXR1cm47Cn0KCgphc20gKCJpZHRfcHRyOlxuIgoJIi53b3JkCTB4ODAwXG4iIC8qIHNpemUgb2YgdGhlIHRhYmxlIDgqMjU2IGJ5dGVzICovCgkiLmxvbmcJaWR0XG4iCSAvKiBvZmZzZXQgKi8KCSIud29yZAkweDE4XG4iKTsvKiBkYXRhIHNlZ21lbnQgKi8KCnN0YXRpYyB2b2lkIHNldF92ZWN0b3IoaW50IGludG51bSwgdm9pZCAqcm91dGluZSkKewoJaWR0W2ludG51bV0uYmFzZV9oaWdoID0gKHUxNikoKHUzMikocm91dGluZSk+PjE2KTsJCglpZHRbaW50bnVtXS5iYXNlX2xvdyA9ICh1MTYpKCh1MzIpKHJvdXRpbmUpJjB4ZmZmZik7CQp9CgoKaW50IGludGVycnVwdF9pbml0KHZvaWQpCnsKCWludCBpOwoJCgkvKiBKdXN0IGluIGNhc2UuLi4gKi8KCWRpc2FibGVfaW50ZXJydXB0cygpOwoJCQoJLyogSW5pdGlhbGl6ZSB0aGUgSURUIGFuZCBzdHVmZiAqLwoJCgkKCW1lbXNldChpcnFfdGFibGUsIDAsIHNpemVvZihpcnFfdGFibGUpKTsKCgkvKiBTZXR1cCB0aGUgSURUICovCglmb3IgKGk9MDtpPDI1NjtpKyspIHsJCQoJCWlkdFtpXS5hY2Nlc3MgPSAweDhlOwoJCWlkdFtpXS5yZXMgPSAwOwkKCQlpZHRbaV0uc2VsZWN0b3IgPSAweDEwOwkKCQlzZXRfdmVjdG9yKGksIGRlZmF1bHRfaXNyKTsKCX0JCgkKCWFzbSAoImNzIGxpZHQgaWR0X3B0clxuIik7CgkKCS8qIFNldHVwIGV4Y2VwdGlvbnMgKi8KCXNldF92ZWN0b3IoMHgwMCwgZXhwXzApOwoJc2V0X3ZlY3RvcigweDAxLCBleHBfMSk7CglzZXRfdmVjdG9yKDB4MDIsIGV4cF8yKTsKCXNldF92ZWN0b3IoMHgwMywgZXhwXzMpOwoJc2V0X3ZlY3RvcigweDA0LCBleHBfNCk7CglzZXRfdmVjdG9yKDB4MDUsIGV4cF81KTsKCXNldF92ZWN0b3IoMHgwNiwgZXhwXzYpOwoJc2V0X3ZlY3RvcigweDA3LCBleHBfNyk7CglzZXRfdmVjdG9yKDB4MDgsIGV4cF84KTsKCXNldF92ZWN0b3IoMHgwOSwgZXhwXzkpOwoJc2V0X3ZlY3RvcigweDBhLCBleHBfMTApOwoJc2V0X3ZlY3RvcigweDBiLCBleHBfMTEpOwoJc2V0X3ZlY3RvcigweDBjLCBleHBfMTIpOwoJc2V0X3ZlY3RvcigweDBkLCBleHBfMTMpOwoJc2V0X3ZlY3RvcigweDBlLCBleHBfMTQpOwoJc2V0X3ZlY3RvcigweDBmLCBleHBfMTUpOwoJc2V0X3ZlY3RvcigweDEwLCBleHBfMTYpOwoJc2V0X3ZlY3RvcigweDExLCBleHBfMTcpOwoJc2V0X3ZlY3RvcigweDEyLCBleHBfMTgpOwoJc2V0X3ZlY3RvcigweDEzLCBleHBfMTkpOwoJc2V0X3ZlY3RvcigweDE0LCBleHBfMjApOwoJc2V0X3ZlY3RvcigweDE1LCBleHBfMjEpOwoJc2V0X3ZlY3RvcigweDE2LCBleHBfMjIpOwoJc2V0X3ZlY3RvcigweDE3LCBleHBfMjMpOwoJc2V0X3ZlY3RvcigweDE4LCBleHBfMjQpOwoJc2V0X3ZlY3RvcigweDE5LCBleHBfMjUpOwoJc2V0X3ZlY3RvcigweDFhLCBleHBfMjYpOwoJc2V0X3ZlY3RvcigweDFiLCBleHBfMjcpOwoJc2V0X3ZlY3RvcigweDFjLCBleHBfMjgpOwoJc2V0X3ZlY3RvcigweDFkLCBleHBfMjkpOwoJc2V0X3ZlY3RvcigweDFlLCBleHBfMzApOwoJc2V0X3ZlY3RvcigweDFmLCBleHBfMzEpOwoKCgkvKiBTZXR1cCBpbnRlcnJ1cHRzICovCglzZXRfdmVjdG9yKDB4MjAsIGlycV8wKTsKCXNldF92ZWN0b3IoMHgyMSwgaXJxXzEpOwoJc2V0X3ZlY3RvcigweDIzLCBpcnFfMyk7CglzZXRfdmVjdG9yKDB4MjQsIGlycV80KTsKCXNldF92ZWN0b3IoMHgyNSwgaXJxXzUpOwoJc2V0X3ZlY3RvcigweDI2LCBpcnFfNik7CglzZXRfdmVjdG9yKDB4MjcsIGlycV83KTsKCXNldF92ZWN0b3IoMHgyOCwgaXJxXzgpOwoJc2V0X3ZlY3RvcigweDI5LCBpcnFfOSk7CglzZXRfdmVjdG9yKDB4MmEsIGlycV8xMCk7CglzZXRfdmVjdG9yKDB4MmIsIGlycV8xMSk7CglzZXRfdmVjdG9yKDB4MmMsIGlycV8xMik7CglzZXRfdmVjdG9yKDB4MmQsIGlycV8xMyk7CglzZXRfdmVjdG9yKDB4MmUsIGlycV8xNCk7CglzZXRfdmVjdG9yKDB4MmYsIGlycV8xNSk7CgkvKiB2ZWN0b3JzIDB4MzAtMHgzZiBhcmUgcmVzZXJ2ZWQgZm9yIGlycSAxNi0zMSAqLwoJc2V0X3ZlY3RvcigweDQwLCBzeXNjYWxsX2VudHJ5KTsKCgkKCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KCW91dGIoMHhmZiwgTUFTVEVSX1BJQyArIElNUik7CglvdXRiKDB4ZmYsIFNMQVZFX1BJQyArIElNUik7CgkKCS8qIE1hc3RlciBQSUMgKi8KCW91dGIoSUNXMV9TRUx8SUNXMV9FSUNXNCwgTUFTVEVSX1BJQyArIElDVzEpOwkKCW91dGIoMHgyMCwgTUFTVEVSX1BJQyArIElDVzIpOyAgICAgICAgICAvKiBQbGFjZSBtYXN0ZXIgUElDIGludGVycnVwdHMgYXQgSU5UMjAgKi8KCW91dGIoSVIyLCBNQVNURVJfUElDICsgSUNXMyk7CQkvKiBJQ1czLCBPbmUgc2xldmMgUElDIGlzIHByZXNlbnQgKi8JCglvdXRiKElDVzRfUE0sIE1BU1RFUl9QSUMgKyBJQ1c0KTsKCQoJZm9yIChpPTA7aTw4O2krKykgewoJCW91dGIoT0NXMl9TRU9JfGksIE1BU1RFUl9QSUMgKyBPQ1cyKTsKCX0KCQoJLyogU2xhdmUgUElDICovCglvdXRiKElDVzFfU0VMfElDVzFfRUlDVzQsIFNMQVZFX1BJQyArIElDVzEpOwkKCW91dGIoMHgyOCwgU0xBVkVfUElDICsgSUNXMik7CSAgICAgICAgLyogUGxhY2Ugc2xhdmUgUElDIGludGVycnVwdHMgYXQgSU5UMjggKi8KCW91dGIoMHgwMiwgU0xBVkVfUElDICsgSUNXMyk7CQkvKiBTbGF2ZSBJRCAqLwoJb3V0YihJQ1c0X1BNLCBTTEFWRV9QSUMgKyBJQ1c0KTsgICAgICAgIAoJCglmb3IgKGk9MDtpPDg7aSsrKSB7CgkJb3V0YihPQ1cyX1NFT0l8aSwgU0xBVkVfUElDICsgT0NXMik7Cgl9CgkKCQoJLyogZW5hYmxlIGNhc2NhZGUgaW50ZXJyZXJ1cHQgKi8KCW91dGIoMHhmYiwgTUFTVEVSX1BJQyArIElNUik7CglvdXRiKDB4ZmYsIFNMQVZFX1BJQyArIElNUik7CgkKCS8qIEl0IGlzIG5vdyBzYWZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzICovCgllbmFibGVfaW50ZXJydXB0cygpOyAKCQoJcmV0dXJuIDA7Cn0KCnZvaWQgZW5hYmxlX2ludGVycnVwdHModm9pZCkKewoJYXNtKCJzdGlcbiIpOwp9CgppbnQgZGlzYWJsZV9pbnRlcnJ1cHRzKHZvaWQpCnsKCWxvbmcgZmxhZ3M7CgkKCWFzbSB2b2xhdGlsZSAoInB1c2hmbCA7IHBvcGwgJTAgOyBjbGlcbiIgOiAiPWciIChmbGFncykgOiApOwoJCglyZXR1cm4gKGZsYWdzJjB4MjAwKTsgLyogSUUgZmxhZ3MgaXMgYml0IDkgKi8KfQoKCiNpZmRlZiBDRkdfUkVTRVRfR0VORVJJQwoKdm9pZCBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgwKSkpIGdlbmVyYXRlX2dwZih2b2lkKTsKYXNtKCIuZ2xvYmwgZ2VuZXJhdGVfZ3BmXG4iIAogICAgImdlbmVyYXRlX2dwZjpcbiIgCiAgICAibGptcCAgICQweDcwLCAkMHg0NzExNDcxMVxuIik7IC8qIHNlZ21lbnQgMHg3MCBpcyBhbiBhcmJpdHJhcnkgc2VnbWVudCB3aGljaCBkb2VzIG5vdCAKCQkJCSAgICAqIGV4aXN0ICovCnZvaWQgcmVzZXRfY3B1KHVsb25nIGFkZHIpCnsKCXNldF92ZWN0b3IoMTMsIGdlbmVyYXRlX2dwZik7ICAvKiBnZW5lcmFsIHByb3RlY3Rpb24gZmF1bHQgaGFuZGxlciAqLwoJc2V0X3ZlY3Rvcig4LCBnZW5lcmF0ZV9ncGYpOyAgIC8qIGRvdWJsZSBmYXVsdCBoYW5kbGVyICovCglnZW5lcmF0ZV9ncGYoKTsgICAgICAgICAgICAgICAgLyogc3RhcnQgdGhlIHNob3cgKi8KfQojZW5kaWYK