LyoKQ29weXJpZ2h0IChjKSAyMDAzLTIwMDkgRXJ3aW4gQ291bWFucyAgaHR0cDovL2J1bGxldC5nb29nbGVjb2RlLmNvbQoKVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCkluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuClBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLCAKaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksIApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgoKMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCjIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKi8KCgoKI2lmbmRlZiBTSU1EX19fU0NBTEFSX0gKI2RlZmluZSBTSU1EX19fU0NBTEFSX0gKCiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4vL3NpemVfdCBmb3IgTVNWQyA2LjAKI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjZmxvYXQ+CiNpbmNsdWRlIDxmbG9hdC5oPgoKLyogU1ZOICRSZXZpc2lvbiQgb24gJERhdGUkIGZyb20gaHR0cDovL2J1bGxldC5nb29nbGVjb2RlLmNvbSovCiNkZWZpbmUgQlRfQlVMTEVUX1ZFUlNJT04gMjc1CgppbmxpbmUgaW50CWJ0R2V0VmVyc2lvbigpCnsKCXJldHVybiBCVF9CVUxMRVRfVkVSU0lPTjsKfQoKI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQgKF9ERUJVRykKI2RlZmluZSBCVF9ERUJVRwojZW5kaWYKCgojaWZkZWYgV0lOMzIKCgkJI2lmIGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgKGRlZmluZWQgKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDEzMDApCgoJCQkjZGVmaW5lIFNJTURfRk9SQ0VfSU5MSU5FIGlubGluZQoJCQkjZGVmaW5lIEFUVFJJQlVURV9BTElHTkVEMTYoYSkgYQoJCQkjZGVmaW5lIEFUVFJJQlVURV9BTElHTkVEMTI4KGEpIGEKCQkjZWxzZQoJCQkvLyNkZWZpbmUgQlRfSEFTX0FMSUdORURfQUxMT0NBVE9SCgkJCSNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDMyNCkgLy8gZGlzYWJsZSBwYWRkaW5nIHdhcm5pbmcKLy8JCQkjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0NTMwKSAvLyBEaXNhYmxlIHRoZSBleGNlcHRpb24gZGlzYWJsZSBidXQgdXNlZCBpbiBNU0NWIFN0bCB3YXJuaW5nLgovLwkJCSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpIC8vVHVybiBvZmYgd2FybmluZ3MgYWJvdXQgZGVwcmVjYXRlZCBDIHJvdXRpbmVzCi8vCQkJI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDc4NikgLy8gRGlzYWJsZSB0aGUgImRlYnVnIG5hbWUgdG9vIGxvbmciIHdhcm5pbmcKCgkJCSNkZWZpbmUgU0lNRF9GT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQoJCQkjZGVmaW5lIEFUVFJJQlVURV9BTElHTkVEMTYoYSkgX19kZWNsc3BlYyhhbGlnbigxNikpIGEKCQkJI2RlZmluZSBBVFRSSUJVVEVfQUxJR05FRDEyOChhKSBfX2RlY2xzcGVjIChhbGlnbigxMjgpKSBhCgkJI2lmZGVmIF9YQk9YCgkJCSNkZWZpbmUgQlRfVVNFX1ZNWDEyOAoKCQkJI2luY2x1ZGUgPHBwY2ludHJpbnNpY3MuaD4KIAkJCSNkZWZpbmUgQlRfSEFWRV9OQVRJVkVfRlNFTAogCQkJI2RlZmluZSBidEZzZWwoYSxiLGMpIF9fZnNlbCgoYSksKGIpLChjKSkKCQkjZWxzZQoKI2lmIChkZWZpbmVkIChXSU4zMikgJiYgKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNDAwKSAmJiAoIWRlZmluZWQgKEJUX1VTRV9ET1VCTEVfUFJFQ0lTSU9OKSkKCQkJI2RlZmluZSBCVF9VU0VfU1NFCgkJCSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KI2VuZGlmCgoJCSNlbmRpZi8vX1hCT1gKCgkJI2VuZGlmIC8vX19NSU5HVzMyX18KCgkJI2luY2x1ZGUgPGFzc2VydC5oPgojaWZkZWYgQlRfREVCVUcKCQkjZGVmaW5lIGJ0QXNzZXJ0IGFzc2VydAojZWxzZQoJCSNkZWZpbmUgYnRBc3NlcnQoeCkKI2VuZGlmCgkJLy9idEZ1bGxBc3NlcnQgaXMgb3B0aW9uYWwsIHNsb3dzIGRvd24gYSBsb3QKCQkjZGVmaW5lIGJ0RnVsbEFzc2VydCh4KQoKCQkjZGVmaW5lIGJ0TGlrZWx5KF9jKSAgX2MKCQkjZGVmaW5lIGJ0VW5saWtlbHkoX2MpIF9jCgojZWxzZQoJCiNpZiBkZWZpbmVkCShfX0NFTExPU19MVjJfXykKCQkjZGVmaW5lIFNJTURfRk9SQ0VfSU5MSU5FIGlubGluZQoJCSNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxNihhKSBhIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKQoJCSNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxMjgoYSkgYSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTI4KSkpCgkJI2lmbmRlZiBhc3NlcnQKCQkjaW5jbHVkZSA8YXNzZXJ0Lmg+CgkJI2VuZGlmCiNpZmRlZiBCVF9ERUJVRwoJCSNkZWZpbmUgYnRBc3NlcnQgYXNzZXJ0CiNlbHNlCgkJI2RlZmluZSBidEFzc2VydCh4KQojZW5kaWYKCQkvL2J0RnVsbEFzc2VydCBpcyBvcHRpb25hbCwgc2xvd3MgZG93biBhIGxvdAoJCSNkZWZpbmUgYnRGdWxsQXNzZXJ0KHgpCgoJCSNkZWZpbmUgYnRMaWtlbHkoX2MpICBfYwoJCSNkZWZpbmUgYnRVbmxpa2VseShfYykgX2MKCiNlbHNlCgojaWZkZWYgVVNFX0xJQlNQRTIKCgkJI2RlZmluZSBTSU1EX0ZPUkNFX0lOTElORSBfX2lubGluZQoJCSNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxNihhKSBhIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKQoJCSNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxMjgoYSkgYSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTI4KSkpCgkJI2lmbmRlZiBhc3NlcnQKCQkjaW5jbHVkZSA8YXNzZXJ0Lmg+CgkJI2VuZGlmCiNpZmRlZiBCVF9ERUJVRwoJCSNkZWZpbmUgYnRBc3NlcnQgYXNzZXJ0CiNlbHNlCgkJI2RlZmluZSBidEFzc2VydCh4KQojZW5kaWYKCQkvL2J0RnVsbEFzc2VydCBpcyBvcHRpb25hbCwgc2xvd3MgZG93biBhIGxvdAoJCSNkZWZpbmUgYnRGdWxsQXNzZXJ0KHgpCgoKCQkjZGVmaW5lIGJ0TGlrZWx5KF9jKSAgIF9fYnVpbHRpbl9leHBlY3QoKF9jKSwgMSkKCQkjZGVmaW5lIGJ0VW5saWtlbHkoX2MpIF9fYnVpbHRpbl9leHBlY3QoKF9jKSwgMCkKCQkKCiNlbHNlCgkvL25vbi13aW5kb3dzIHN5c3RlbXMKCiNpZiAoZGVmaW5lZCAoX19BUFBMRV9fKSAmJiBkZWZpbmVkIChfX2kzODZfXykgJiYgKCFkZWZpbmVkIChCVF9VU0VfRE9VQkxFX1BSRUNJU0lPTikpKQoJI2RlZmluZSBCVF9VU0VfU1NFCgkjaW5jbHVkZSA8ZW1taW50cmluLmg+CgoJI2RlZmluZSBTSU1EX0ZPUkNFX0lOTElORSBpbmxpbmUKLy8vQHRvZG86IGNoZWNrIG91dCBhbGlnbm1lbnQgbWV0aG9kcyBmb3Igb3RoZXIgcGxhdGZvcm1zL2NvbXBpbGVycwoJI2RlZmluZSBBVFRSSUJVVEVfQUxJR05FRDE2KGEpIGEgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDE2KSkpCgkjZGVmaW5lIEFUVFJJQlVURV9BTElHTkVEMTI4KGEpIGEgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDEyOCkpKQoJI2lmbmRlZiBhc3NlcnQKCSNpbmNsdWRlIDxhc3NlcnQuaD4KCSNlbmRpZgoKCSNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChfREVCVUcpCgkJI2RlZmluZSBidEFzc2VydCBhc3NlcnQKCSNlbHNlCgkJI2RlZmluZSBidEFzc2VydCh4KQoJI2VuZGlmCgoJLy9idEZ1bGxBc3NlcnQgaXMgb3B0aW9uYWwsIHNsb3dzIGRvd24gYSBsb3QKCSNkZWZpbmUgYnRGdWxsQXNzZXJ0KHgpCgkjZGVmaW5lIGJ0TGlrZWx5KF9jKSAgX2MKCSNkZWZpbmUgYnRVbmxpa2VseShfYykgX2MKCiNlbHNlCgoJCSNkZWZpbmUgU0lNRF9GT1JDRV9JTkxJTkUgaW5saW5lCgkJLy8vQHRvZG86IGNoZWNrIG91dCBhbGlnbm1lbnQgbWV0aG9kcyBmb3Igb3RoZXIgcGxhdGZvcm1zL2NvbXBpbGVycwoJCS8vLyNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxNihhKSBhIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICgxNikpKQoJCS8vLyNkZWZpbmUgQVRUUklCVVRFX0FMSUdORUQxMjgoYSkgYSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMTI4KSkpCgkJI2RlZmluZSBBVFRSSUJVVEVfQUxJR05FRDE2KGEpIGEKCQkjZGVmaW5lIEFUVFJJQlVURV9BTElHTkVEMTI4KGEpIGEKCQkjaWZuZGVmIGFzc2VydAoJCSNpbmNsdWRlIDxhc3NlcnQuaD4KCQkjZW5kaWYKCiNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkIChfREVCVUcpCgkJI2RlZmluZSBidEFzc2VydCBhc3NlcnQKI2Vsc2UKCQkjZGVmaW5lIGJ0QXNzZXJ0KHgpCiNlbmRpZgoKCQkvL2J0RnVsbEFzc2VydCBpcyBvcHRpb25hbCwgc2xvd3MgZG93biBhIGxvdAoJCSNkZWZpbmUgYnRGdWxsQXNzZXJ0KHgpCgkJI2RlZmluZSBidExpa2VseShfYykgIF9jCgkJI2RlZmluZSBidFVubGlrZWx5KF9jKSBfYwojZW5kaWYgLy9fX0FQUExFX18gCgojZW5kaWYgLy8gTElCU1BFMgoKI2VuZGlmCS8vX19DRUxMT1NfTFYyX18KI2VuZGlmCgoKLy8vVGhlIGJ0U2NhbGFyIHR5cGUgYWJzdHJhY3RzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIHRvIGVhc2lseSBzd2l0Y2ggYmV0d2VlbiBkb3VibGUgYW5kIHNpbmdsZSBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24uCiNpZiBkZWZpbmVkKEJUX1VTRV9ET1VCTEVfUFJFQ0lTSU9OKQp0eXBlZGVmIGRvdWJsZSBidFNjYWxhcjsKLy90aGlzIG51bWJlciBjb3VsZCBiZSBiaWdnZXIgaW4gZG91YmxlIHByZWNpc2lvbgojZGVmaW5lIEJUX0xBUkdFX0ZMT0FUIDFlMzAKI2Vsc2UKdHlwZWRlZiBmbG9hdCBidFNjYWxhcjsKLy9rZWVwIEJUX0xBUkdFX0ZMT0FUKkJUX0xBUkdFX0ZMT0FUIDwgRkxUX01BWAojZGVmaW5lIEJUX0xBUkdFX0ZMT0FUIDFlMThmCiNlbmRpZgoKCgojZGVmaW5lIEJUX0RFQ0xBUkVfQUxJR05FRF9BTExPQ0FUT1IoKSBcCiAgIFNJTURfRk9SQ0VfSU5MSU5FIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZUluQnl0ZXMpICAgeyByZXR1cm4gYnRBbGlnbmVkQWxsb2Moc2l6ZUluQnl0ZXMsMTYpOyB9ICAgXAogICBTSU1EX0ZPUkNFX0lOTElORSB2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCogcHRyKSAgICAgICAgIHsgYnRBbGlnbmVkRnJlZShwdHIpOyB9ICAgXAogICBTSU1EX0ZPUkNFX0lOTElORSB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkKiBwdHIpICAgeyByZXR1cm4gcHRyOyB9ICAgXAogICBTSU1EX0ZPUkNFX0lOTElORSB2b2lkICBvcGVyYXRvciBkZWxldGUodm9pZCosIHZvaWQqKSAgICAgIHsgfSAgIFwKICAgU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCogb3BlcmF0b3IgbmV3W10oc2l6ZV90IHNpemVJbkJ5dGVzKSAgIHsgcmV0dXJuIGJ0QWxpZ25lZEFsbG9jKHNpemVJbkJ5dGVzLDE2KTsgfSAgIFwKICAgU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCAgb3BlcmF0b3IgZGVsZXRlW10odm9pZCogcHRyKSAgICAgICAgIHsgYnRBbGlnbmVkRnJlZShwdHIpOyB9ICAgXAogICBTSU1EX0ZPUkNFX0lOTElORSB2b2lkKiBvcGVyYXRvciBuZXdbXShzaXplX3QsIHZvaWQqIHB0cikgICB7IHJldHVybiBwdHI7IH0gICBcCiAgIFNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB2b2lkKikgICAgICB7IH0gICBcCgoKCiNpZiBkZWZpbmVkKEJUX1VTRV9ET1VCTEVfUFJFQ0lTSU9OKSB8fCBkZWZpbmVkKEJUX0ZPUkNFX0RPVUJMRV9GVU5DVElPTlMpCgkJClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0U3FydChidFNjYWxhciB4KSB7IHJldHVybiBzcXJ0KHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0RmFicyhidFNjYWxhciB4KSB7IHJldHVybiBmYWJzKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0Q29zKGJ0U2NhbGFyIHgpIHsgcmV0dXJuIGNvcyh4KTsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidFNpbihidFNjYWxhciB4KSB7IHJldHVybiBzaW4oeCk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRUYW4oYnRTY2FsYXIgeCkgeyByZXR1cm4gdGFuKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0QWNvcyhidFNjYWxhciB4KSB7IHJldHVybiBhY29zKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0QXNpbihidFNjYWxhciB4KSB7IHJldHVybiBhc2luKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0QXRhbihidFNjYWxhciB4KSB7IHJldHVybiBhdGFuKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0QXRhbjIoYnRTY2FsYXIgeCwgYnRTY2FsYXIgeSkgeyByZXR1cm4gYXRhbjIoeCwgeSk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRFeHAoYnRTY2FsYXIgeCkgeyByZXR1cm4gZXhwKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0TG9nKGJ0U2NhbGFyIHgpIHsgcmV0dXJuIGxvZyh4KTsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidFBvdyhidFNjYWxhciB4LGJ0U2NhbGFyIHkpIHsgcmV0dXJuIHBvdyh4LHkpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0Rm1vZChidFNjYWxhciB4LGJ0U2NhbGFyIHkpIHsgcmV0dXJuIGZtb2QoeCx5KTsgfQoKI2Vsc2UKCQkKU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRTcXJ0KGJ0U2NhbGFyIHkpIAp7IAojaWZkZWYgVVNFX0FQUFJPWElNQVRJT04KICAgIGRvdWJsZSB4LCB6LCB0ZW1wZjsKICAgIHVuc2lnbmVkIGxvbmcgKnRmcHRyID0gKCh1bnNpZ25lZCBsb25nICopJnRlbXBmKSArIDE7CgoJdGVtcGYgPSB5OwoJKnRmcHRyID0gKDB4YmZjZGQ5MGEgLSAqdGZwdHIpPj4xOyAvKiBlc3RpbWF0ZSBvZiAxL3NxcnQoeSkgKi8KCXggPSAgdGVtcGY7Cgl6ID0gIHkqYnRTY2FsYXIoMC41KTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBob2lzdCBvdXQgdGhlIJMvMpQgICAgKi8KCXggPSAoYnRTY2FsYXIoMS41KSp4KS0oeCp4KSooeCp6KTsgICAgICAgICAvKiBpdGVyYXRpb24gZm9ybXVsYSAgICAgKi8KCXggPSAoYnRTY2FsYXIoMS41KSp4KS0oeCp4KSooeCp6KTsKCXggPSAoYnRTY2FsYXIoMS41KSp4KS0oeCp4KSooeCp6KTsKCXggPSAoYnRTY2FsYXIoMS41KSp4KS0oeCp4KSooeCp6KTsKCXggPSAoYnRTY2FsYXIoMS41KSp4KS0oeCp4KSooeCp6KTsKCXJldHVybiB4Knk7CiNlbHNlCglyZXR1cm4gc3FydGYoeSk7IAojZW5kaWYKfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidEZhYnMoYnRTY2FsYXIgeCkgeyByZXR1cm4gZmFic2YoeCk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRDb3MoYnRTY2FsYXIgeCkgeyByZXR1cm4gY29zZih4KTsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidFNpbihidFNjYWxhciB4KSB7IHJldHVybiBzaW5mKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0VGFuKGJ0U2NhbGFyIHgpIHsgcmV0dXJuIHRhbmYoeCk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRBY29zKGJ0U2NhbGFyIHgpIHsgCglidEFzc2VydCh4IDw9IGJ0U2NhbGFyKDEuKSk7CglyZXR1cm4gYWNvc2YoeCk7IAp9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0QXNpbihidFNjYWxhciB4KSB7IHJldHVybiBhc2luZih4KTsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidEF0YW4oYnRTY2FsYXIgeCkgeyByZXR1cm4gYXRhbmYoeCk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRBdGFuMihidFNjYWxhciB4LCBidFNjYWxhciB5KSB7IHJldHVybiBhdGFuMmYoeCwgeSk7IH0KU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRFeHAoYnRTY2FsYXIgeCkgeyByZXR1cm4gZXhwZih4KTsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidExvZyhidFNjYWxhciB4KSB7IHJldHVybiBsb2dmKHgpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0UG93KGJ0U2NhbGFyIHgsYnRTY2FsYXIgeSkgeyByZXR1cm4gcG93Zih4LHkpOyB9ClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0Rm1vZChidFNjYWxhciB4LGJ0U2NhbGFyIHkpIHsgcmV0dXJuIGZtb2RmKHgseSk7IH0KCQojZW5kaWYKCiNkZWZpbmUgU0lNRF8yX1BJICAgICAgICAgYnRTY2FsYXIoNi4yODMxODUzMDcxNzk1ODYyMzIpCiNkZWZpbmUgU0lNRF9QSSAgICAgICAgICAgKFNJTURfMl9QSSAqIGJ0U2NhbGFyKDAuNSkpCiNkZWZpbmUgU0lNRF9IQUxGX1BJICAgICAgKFNJTURfMl9QSSAqIGJ0U2NhbGFyKDAuMjUpKQojZGVmaW5lIFNJTURfUkFEU19QRVJfREVHIChTSU1EXzJfUEkgLyBidFNjYWxhcigzNjAuMCkpCiNkZWZpbmUgU0lNRF9ERUdTX1BFUl9SQUQgIChidFNjYWxhcigzNjAuMCkgLyBTSU1EXzJfUEkpCiNkZWZpbmUgU0lNRFNRUlQxMiBidFNjYWxhcigwLjcwNzEwNjc4MTE4NjU0NzUyNDQwMDg0NDM2MjEwNDg0OTApCgojZGVmaW5lIGJ0UmVjaXBTcXJ0KHgpICgoYnRTY2FsYXIpKGJ0U2NhbGFyKDEuMCkvYnRTcXJ0KGJ0U2NhbGFyKHgpKSkpCQkvKiByZWNpcHJvY2FsIHNxdWFyZSByb290ICovCgoKI2lmZGVmIEJUX1VTRV9ET1VCTEVfUFJFQ0lTSU9OCiNkZWZpbmUgU0lNRF9FUFNJTE9OICAgICAgREJMX0VQU0lMT04KI2RlZmluZSBTSU1EX0lORklOSVRZICAgICBEQkxfTUFYCiNlbHNlCiNkZWZpbmUgU0lNRF9FUFNJTE9OICAgICAgRkxUX0VQU0lMT04KI2RlZmluZSBTSU1EX0lORklOSVRZICAgICBGTFRfTUFYCiNlbmRpZgoKU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRBdGFuMkZhc3QoYnRTY2FsYXIgeSwgYnRTY2FsYXIgeCkgCnsKCWJ0U2NhbGFyIGNvZWZmXzEgPSBTSU1EX1BJIC8gNC4wZjsKCWJ0U2NhbGFyIGNvZWZmXzIgPSAzLjBmICogY29lZmZfMTsKCWJ0U2NhbGFyIGFic195ID0gYnRGYWJzKHkpOwoJYnRTY2FsYXIgYW5nbGU7CglpZiAoeCA+PSAwLjBmKSB7CgkJYnRTY2FsYXIgciA9ICh4IC0gYWJzX3kpIC8gKHggKyBhYnNfeSk7CgkJYW5nbGUgPSBjb2VmZl8xIC0gY29lZmZfMSAqIHI7Cgl9IGVsc2UgewoJCWJ0U2NhbGFyIHIgPSAoeCArIGFic195KSAvIChhYnNfeSAtIHgpOwoJCWFuZ2xlID0gY29lZmZfMiAtIGNvZWZmXzEgKiByOwoJfQoJcmV0dXJuICh5IDwgMC4wZikgPyAtYW5nbGUgOiBhbmdsZTsKfQoKU0lNRF9GT1JDRV9JTkxJTkUgYm9vbCAgICAgIGJ0RnV6enlaZXJvKGJ0U2NhbGFyIHgpIHsgcmV0dXJuIGJ0RmFicyh4KSA8IFNJTURfRVBTSUxPTjsgfQoKU0lNRF9GT1JDRV9JTkxJTkUgYm9vbAlidEVxdWFsKGJ0U2NhbGFyIGEsIGJ0U2NhbGFyIGVwcykgewoJcmV0dXJuICgoKGEpIDw9IGVwcykgJiYgISgoYSkgPCAtZXBzKSk7Cn0KU0lNRF9GT1JDRV9JTkxJTkUgYm9vbAlidEdyZWF0ZXJFcXVhbCAoYnRTY2FsYXIgYSwgYnRTY2FsYXIgZXBzKSB7CglyZXR1cm4gKCEoKGEpIDw9IGVwcykpOwp9CgoKU0lNRF9GT1JDRV9JTkxJTkUgaW50ICAgICAgIGJ0SXNOZWdhdGl2ZShidFNjYWxhciB4KSB7CiAgICByZXR1cm4geCA8IGJ0U2NhbGFyKDAuMCkgPyAxIDogMDsKfQoKU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRSYWRpYW5zKGJ0U2NhbGFyIHgpIHsgcmV0dXJuIHggKiBTSU1EX1JBRFNfUEVSX0RFRzsgfQpTSU1EX0ZPUkNFX0lOTElORSBidFNjYWxhciBidERlZ3JlZXMoYnRTY2FsYXIgeCkgeyByZXR1cm4geCAqIFNJTURfREVHU19QRVJfUkFEOyB9CgojZGVmaW5lIEJUX0RFQ0xBUkVfSEFORExFKG5hbWUpIHR5cGVkZWYgc3RydWN0IG5hbWUjI19fIHsgaW50IHVudXNlZDsgfSAqbmFtZQoKI2lmbmRlZiBidEZzZWwKU0lNRF9GT1JDRV9JTkxJTkUgYnRTY2FsYXIgYnRGc2VsKGJ0U2NhbGFyIGEsIGJ0U2NhbGFyIGIsIGJ0U2NhbGFyIGMpCnsKCXJldHVybiBhID49IDAgPyBiIDogYzsKfQojZW5kaWYKI2RlZmluZSBidEZzZWxzKGEsYixjKSAoYnRTY2FsYXIpYnRGc2VsKGEsYixjKQoKClNJTURfRk9SQ0VfSU5MSU5FIGJvb2wgYnRNYWNoaW5lSXNMaXR0bGVFbmRpYW4oKQp7CiAgIGxvbmcgaW50IGkgPSAxOwogICBjb25zdCBjaGFyICpwID0gKGNvbnN0IGNoYXIgKikgJmk7CiAgIGlmIChwWzBdID09IDEpICAvLyBMb3dlc3QgYWRkcmVzcyBjb250YWlucyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZQoJICAgcmV0dXJuIHRydWU7CiAgIGVsc2UKCSAgIHJldHVybiBmYWxzZTsKfQoKCgovLy9idFNlbGVjdCBhdm9pZHMgYnJhbmNoZXMsIHdoaWNoIG1ha2VzIHBlcmZvcm1hbmNlIG11Y2ggYmV0dGVyIGZvciBjb25zb2xlcyBsaWtlIFBsYXlzdGF0aW9uIDMgYW5kIFhCb3ggMzYwCi8vL1RoYW5rcyBQaGlsIEtuaWdodC4gU2VlIGFsc28gaHR0cDovL3d3dy5jZWxscGVyZm9ybWFuY2UuY29tL2FydGljbGVzLzIwMDYvMDQvbW9yZV90ZWNobmlxdWVzX2Zvcl9lbGltaW5hdGluXzEuaHRtbApTSU1EX0ZPUkNFX0lOTElORSB1bnNpZ25lZCBidFNlbGVjdCh1bnNpZ25lZCBjb25kaXRpb24sIHVuc2lnbmVkIHZhbHVlSWZDb25kaXRpb25Ob25aZXJvLCB1bnNpZ25lZCB2YWx1ZUlmQ29uZGl0aW9uWmVybykgCnsKICAgIC8vIFNldCB0ZXN0TnogdG8gMHhGRkZGRkZGRiBpZiBjb25kaXRpb24gaXMgbm9uemVybywgMHgwMDAwMDAwMCBpZiBjb25kaXRpb24gaXMgemVybwogICAgLy8gUmVseSBvbiBwb3NpdGl2ZSB2YWx1ZSBvcidlZCB3aXRoIGl0cyBuZWdhdGl2ZSBoYXZpbmcgc2lnbiBiaXQgb24KICAgIC8vIGFuZCB6ZXJvIHZhbHVlIG9yJ2VkIHdpdGggaXRzIG5lZ2F0aXZlICh3aGljaCBpcyBzdGlsbCB6ZXJvKSBoYXZpbmcgc2lnbiBiaXQgb2ZmIAogICAgLy8gVXNlIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQsIHNoaWZ0aW5nIHRoZSBzaWduIGJpdCB0aHJvdWdoIGFsbCAzMiBiaXRzCiAgICB1bnNpZ25lZCB0ZXN0TnogPSAodW5zaWduZWQpKCgoaW50KWNvbmRpdGlvbiB8IC0oaW50KWNvbmRpdGlvbikgPj4gMzEpOwogICAgdW5zaWduZWQgdGVzdEVxeiA9IH50ZXN0Tno7CiAgICByZXR1cm4gKCh2YWx1ZUlmQ29uZGl0aW9uTm9uWmVybyAmIHRlc3ROeikgfCAodmFsdWVJZkNvbmRpdGlvblplcm8gJiB0ZXN0RXF6KSk7IAp9ClNJTURfRk9SQ0VfSU5MSU5FIGludCBidFNlbGVjdCh1bnNpZ25lZCBjb25kaXRpb24sIGludCB2YWx1ZUlmQ29uZGl0aW9uTm9uWmVybywgaW50IHZhbHVlSWZDb25kaXRpb25aZXJvKQp7CiAgICB1bnNpZ25lZCB0ZXN0TnogPSAodW5zaWduZWQpKCgoaW50KWNvbmRpdGlvbiB8IC0oaW50KWNvbmRpdGlvbikgPj4gMzEpOwogICAgdW5zaWduZWQgdGVzdEVxeiA9IH50ZXN0Tno7IAogICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oKHZhbHVlSWZDb25kaXRpb25Ob25aZXJvICYgdGVzdE56KSB8ICh2YWx1ZUlmQ29uZGl0aW9uWmVybyAmIHRlc3RFcXopKTsKfQpTSU1EX0ZPUkNFX0lOTElORSBmbG9hdCBidFNlbGVjdCh1bnNpZ25lZCBjb25kaXRpb24sIGZsb2F0IHZhbHVlSWZDb25kaXRpb25Ob25aZXJvLCBmbG9hdCB2YWx1ZUlmQ29uZGl0aW9uWmVybykKewojaWZkZWYgQlRfSEFWRV9OQVRJVkVfRlNFTAogICAgcmV0dXJuIChmbG9hdClidEZzZWwoKGJ0U2NhbGFyKWNvbmRpdGlvbiAtIGJ0U2NhbGFyKDEuMGYpLCB2YWx1ZUlmQ29uZGl0aW9uTm9uWmVybywgdmFsdWVJZkNvbmRpdGlvblplcm8pOwojZWxzZQogICAgcmV0dXJuIChjb25kaXRpb24gIT0gMCkgPyB2YWx1ZUlmQ29uZGl0aW9uTm9uWmVybyA6IHZhbHVlSWZDb25kaXRpb25aZXJvOyAKI2VuZGlmCn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNJTURfRk9SQ0VfSU5MSU5FIHZvaWQgYnRTd2FwKFQmIGEsIFQmIGIpCnsKCVQgdG1wID0gYTsKCWEgPSBiOwoJYiA9IHRtcDsKfQoKCi8vUENLOiBlbmRpYW4gc3dhcHBpbmcgZnVuY3Rpb25zClNJTURfRk9SQ0VfSU5MSU5FIHVuc2lnbmVkIGJ0U3dhcEVuZGlhbih1bnNpZ25lZCB2YWwpCnsKCXJldHVybiAoKCh2YWwgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCAoKHZhbCAmIDB4MDBmZjAwMDApID4+IDgpIHwgKCh2YWwgJiAweDAwMDBmZjAwKSA8PCA4KSAgfCAoKHZhbCAmIDB4MDAwMDAwZmYpIDw8IDI0KSk7Cn0KClNJTURfRk9SQ0VfSU5MSU5FIHVuc2lnbmVkIHNob3J0IGJ0U3dhcEVuZGlhbih1bnNpZ25lZCBzaG9ydCB2YWwpCnsKCXJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oKCh2YWwgJiAweGZmMDApID4+IDgpIHwgKCh2YWwgJiAweDAwZmYpIDw8IDgpKTsKfQoKU0lNRF9GT1JDRV9JTkxJTkUgdW5zaWduZWQgYnRTd2FwRW5kaWFuKGludCB2YWwpCnsKCXJldHVybiBidFN3YXBFbmRpYW4oKHVuc2lnbmVkKXZhbCk7Cn0KClNJTURfRk9SQ0VfSU5MSU5FIHVuc2lnbmVkIHNob3J0IGJ0U3dhcEVuZGlhbihzaG9ydCB2YWwpCnsKCXJldHVybiBidFN3YXBFbmRpYW4oKHVuc2lnbmVkIHNob3J0KSB2YWwpOwp9CgovLy9idFN3YXBGbG9hdCB1c2VzIHVzaW5nIGNoYXIgcG9pbnRlcnMgdG8gc3dhcCB0aGUgZW5kaWFubmVzcwovLy8vYnRTd2FwRmxvYXQvYnRTd2FwRG91YmxlIHdpbGwgTk9UIHJldHVybiBhIGZsb2F0LCBiZWNhdXNlIHRoZSBtYWNoaW5lIG1pZ2h0ICdjb3JyZWN0JyBpbnZhbGlkIGZsb2F0aW5nIHBvaW50IHZhbHVlcwovLy9Ob3QgYWxsIHZhbHVlcyBvZiBzaWduL2V4cG9uZW50L21hbnRpc3NhIGFyZSB2YWxpZCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFjY29yZGluZyB0byBJRUVFIDc1NC4gCi8vL1doZW4gYSBmbG9hdGluZyBwb2ludCB1bml0IGlzIGZhY2VkIHdpdGggYW4gaW52YWxpZCB2YWx1ZSwgaXQgbWF5IGFjdHVhbGx5IGNoYW5nZSB0aGUgdmFsdWUsIG9yIHdvcnNlLCB0aHJvdyBhbiBleGNlcHRpb24uIAovLy9JbiBtb3N0IHN5c3RlbXMsIHJ1bm5pbmcgdXNlciBtb2RlIGNvZGUsIHlvdSB3b3VsZG4ndCBnZXQgYW4gZXhjZXB0aW9uLCBidXQgaW5zdGVhZCB0aGUgaGFyZHdhcmUvb3MvcnVudGltZSB3aWxsICdmaXgnIHRoZSBudW1iZXIgZm9yIHlvdS4gCi8vL3NvIGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgZmxvYXQvZG91YmxlLCB3ZSByZXR1cm4gaW50ZWdlci9sb25nIGxvbmcgaW50ZWdlcgpTSU1EX0ZPUkNFX0lOTElORSB1bnNpZ25lZCBpbnQgIGJ0U3dhcEVuZGlhbkZsb2F0KGZsb2F0IGQpCnsKICAgIHVuc2lnbmVkIGludCBhID0gMDsKICAgIHVuc2lnbmVkIGNoYXIgKmRzdCA9ICh1bnNpZ25lZCBjaGFyICopJmE7CiAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSAodW5zaWduZWQgY2hhciAqKSZkOwoKICAgIGRzdFswXSA9IHNyY1szXTsKICAgIGRzdFsxXSA9IHNyY1syXTsKICAgIGRzdFsyXSA9IHNyY1sxXTsKICAgIGRzdFszXSA9IHNyY1swXTsKICAgIHJldHVybiBhOwp9CgovLyB1bnN3YXAgdXNpbmcgY2hhciBwb2ludGVycwpTSU1EX0ZPUkNFX0lOTElORSBmbG9hdCBidFVuc3dhcEVuZGlhbkZsb2F0KHVuc2lnbmVkIGludCBhKSAKewogICAgZmxvYXQgZCA9IDAuMGY7CiAgICB1bnNpZ25lZCBjaGFyICpzcmMgPSAodW5zaWduZWQgY2hhciAqKSZhOwogICAgdW5zaWduZWQgY2hhciAqZHN0ID0gKHVuc2lnbmVkIGNoYXIgKikmZDsKCiAgICBkc3RbMF0gPSBzcmNbM107CiAgICBkc3RbMV0gPSBzcmNbMl07CiAgICBkc3RbMl0gPSBzcmNbMV07CiAgICBkc3RbM10gPSBzcmNbMF07CgogICAgcmV0dXJuIGQ7Cn0KCgovLyBzd2FwIHVzaW5nIGNoYXIgcG9pbnRlcnMKU0lNRF9GT1JDRV9JTkxJTkUgdm9pZCAgYnRTd2FwRW5kaWFuRG91YmxlKGRvdWJsZSBkLCB1bnNpZ25lZCBjaGFyKiBkc3QpCnsKICAgIHVuc2lnbmVkIGNoYXIgKnNyYyA9ICh1bnNpZ25lZCBjaGFyICopJmQ7CgogICAgZHN0WzBdID0gc3JjWzddOwogICAgZHN0WzFdID0gc3JjWzZdOwogICAgZHN0WzJdID0gc3JjWzVdOwogICAgZHN0WzNdID0gc3JjWzRdOwogICAgZHN0WzRdID0gc3JjWzNdOwogICAgZHN0WzVdID0gc3JjWzJdOwogICAgZHN0WzZdID0gc3JjWzFdOwogICAgZHN0WzddID0gc3JjWzBdOwoKfQoKLy8gdW5zd2FwIHVzaW5nIGNoYXIgcG9pbnRlcnMKU0lNRF9GT1JDRV9JTkxJTkUgZG91YmxlIGJ0VW5zd2FwRW5kaWFuRG91YmxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYykgCnsKICAgIGRvdWJsZSBkID0gMC4wOwogICAgdW5zaWduZWQgY2hhciAqZHN0ID0gKHVuc2lnbmVkIGNoYXIgKikmZDsKCiAgICBkc3RbMF0gPSBzcmNbN107CiAgICBkc3RbMV0gPSBzcmNbNl07CiAgICBkc3RbMl0gPSBzcmNbNV07CiAgICBkc3RbM10gPSBzcmNbNF07CiAgICBkc3RbNF0gPSBzcmNbM107CiAgICBkc3RbNV0gPSBzcmNbMl07CiAgICBkc3RbNl0gPSBzcmNbMV07CiAgICBkc3RbN10gPSBzcmNbMF07CgoJcmV0dXJuIGQ7Cn0KCi8vIHJldHVybnMgbm9ybWFsaXplZCB2YWx1ZSBpbiByYW5nZSBbLVNJTURfUEksIFNJTURfUEldClNJTURfRk9SQ0VfSU5MSU5FIGJ0U2NhbGFyIGJ0Tm9ybWFsaXplQW5nbGUoYnRTY2FsYXIgYW5nbGVJblJhZGlhbnMpIAp7CglhbmdsZUluUmFkaWFucyA9IGJ0Rm1vZChhbmdsZUluUmFkaWFucywgU0lNRF8yX1BJKTsKCWlmKGFuZ2xlSW5SYWRpYW5zIDwgLVNJTURfUEkpCgl7CgkJcmV0dXJuIGFuZ2xlSW5SYWRpYW5zICsgU0lNRF8yX1BJOwoJfQoJZWxzZSBpZihhbmdsZUluUmFkaWFucyA+IFNJTURfUEkpCgl7CgkJcmV0dXJuIGFuZ2xlSW5SYWRpYW5zIC0gU0lNRF8yX1BJOwoJfQoJZWxzZQoJewoJCXJldHVybiBhbmdsZUluUmFkaWFuczsKCX0KfQoKLy8vcnVkaW1lbnRhcnkgY2xhc3MgdG8gcHJvdmlkZSB0eXBlIGluZm8Kc3RydWN0IGJ0VHlwZWRPYmplY3QKewoJYnRUeXBlZE9iamVjdChpbnQgb2JqZWN0VHlwZSkKCQk6bV9vYmplY3RUeXBlKG9iamVjdFR5cGUpCgl7Cgl9CglpbnQJbV9vYmplY3RUeXBlOwoJaW5saW5lIGludCBnZXRPYmplY3RUeXBlKCkgY29uc3QKCXsKCQlyZXR1cm4gbV9vYmplY3RUeXBlOwoJfQp9OwojZW5kaWYgLy9TSU1EX19fU0NBTEFSX0gK