LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCgovKgogKiBQYXJ0bHkgYmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIChDKSBDb3B5cmlnaHQgMjAwMAogKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKICogS2xlaW4tV2ludGVybmhlaW0sIEdlcm1hbnkKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgojZGVmaW5lIE5VTVZFQ1RTCTI1NgoKI2RlZmluZSBCSU9TX0RBVEEgICAgICAgICgoY2hhciopMHg0MDApCiNkZWZpbmUgQklPU19EQVRBX1NJWkUgICAyNTYKI2RlZmluZSBCSU9TX0JBU0UgICAgICAgICgoY2hhciopMHhmMDAwMCkKI2RlZmluZSBCSU9TX0NTICAgICAgICAgIDB4ZjAwMAoKLyogdGhlc2UgYXJlIGRlZmluZWQgaW4gYSAxNmJpdCBzZWdtZW50IGFuZCBuZWVkcwogKiB0byBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBSRUxPQ18xNl94eHh4KCkgbWFjcm9zIGJlbG93CiAqLwpleHRlcm4gdTE2IHJhbV9pbl82NGtiX2NodW5rczsKZXh0ZXJuIHUxNiBiaW9zX2VxdWlwbWVudDsKZXh0ZXJuIHU4ICBwY2lfbGFzdF9idXM7CgpleHRlcm4gdm9pZCAqcm1faW50MDA7CmV4dGVybiB2b2lkICpybV9pbnQwMTsKZXh0ZXJuIHZvaWQgKnJtX2ludDAyOwpleHRlcm4gdm9pZCAqcm1faW50MDM7CmV4dGVybiB2b2lkICpybV9pbnQwNDsKZXh0ZXJuIHZvaWQgKnJtX2ludDA1OwpleHRlcm4gdm9pZCAqcm1faW50MDY7CmV4dGVybiB2b2lkICpybV9pbnQwNzsKZXh0ZXJuIHZvaWQgKnJtX2ludDA4OwpleHRlcm4gdm9pZCAqcm1faW50MDk7CmV4dGVybiB2b2lkICpybV9pbnQwYTsKZXh0ZXJuIHZvaWQgKnJtX2ludDBiOwpleHRlcm4gdm9pZCAqcm1faW50MGM7CmV4dGVybiB2b2lkICpybV9pbnQwZDsKZXh0ZXJuIHZvaWQgKnJtX2ludDBlOwpleHRlcm4gdm9pZCAqcm1faW50MGY7CmV4dGVybiB2b2lkICpybV9pbnQxMDsKZXh0ZXJuIHZvaWQgKnJtX2ludDExOwpleHRlcm4gdm9pZCAqcm1faW50MTI7CmV4dGVybiB2b2lkICpybV9pbnQxMzsKZXh0ZXJuIHZvaWQgKnJtX2ludDE0OwpleHRlcm4gdm9pZCAqcm1faW50MTU7CmV4dGVybiB2b2lkICpybV9pbnQxNjsKZXh0ZXJuIHZvaWQgKnJtX2ludDE3OwpleHRlcm4gdm9pZCAqcm1faW50MTg7CmV4dGVybiB2b2lkICpybV9pbnQxOTsKZXh0ZXJuIHZvaWQgKnJtX2ludDFhOwpleHRlcm4gdm9pZCAqcm1faW50MWI7CmV4dGVybiB2b2lkICpybV9pbnQxYzsKZXh0ZXJuIHZvaWQgKnJtX2ludDFkOwpleHRlcm4gdm9pZCAqcm1faW50MWU7CmV4dGVybiB2b2lkICpybV9pbnQxZjsKZXh0ZXJuIHZvaWQgKnJtX2RlZl9pbnQ7CgpleHRlcm4gdm9pZCAqcmVhbG1vZGVfcmVzZXQ7CmV4dGVybiB2b2lkICpyZWFsbW9kZV9wY2lfYmlvc19jYWxsX2VudHJ5OwoKc3RhdGljIGludCBzZXRfam1wX3ZlY3RvcihpbnQgZW50cnlfcG9pbnQsIHZvaWQgKnRhcmdldCkKewoJaWYgKGVudHJ5X3BvaW50ICYgfjB4ZmZmZikgewoJCXJldHVybiAtMTsKCX0KCglpZiAoKCh1MzIpdGFyZ2V0LTB4ZjAwMDApICYgfjB4ZmZmZikgewoJCXJldHVybiAtMTsKCX0KCXByaW50Zigic2V0X2ptcF92ZWN0b3I6IDB4ZjAwMDolMDR4IC0+ICVwXG4iLAoJICAgICAgIGVudHJ5X3BvaW50LCB0YXJnZXQpOwoKCS8qIGptcCBvcGNvZGUgKi8KCXdyaXRlYigweGVhLCAweGYwMDAwICsgZW50cnlfcG9pbnQpOwoKCS8qIG9mZnNldCAqLwoJd3JpdGV3KCgodTMyKXRhcmdldC0weGYwMDAwKSwgMHhmMDAwMCArIGVudHJ5X3BvaW50ICsgMSk7CgoJLyogc2VnbWVudCAqLwoJd3JpdGV3KDB4ZjAwMCwgMHhmMDAwMCArIGVudHJ5X3BvaW50ICsgMyk7CgoJcmV0dXJuIDA7Cn0KCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEluc3RhbGwgYW4gaW50ZXJydXB0IHZlY3RvcgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKc3RhdGljIHZvaWQgc2V0dmVjdG9yKGludCB2ZWN0b3IsIHUxNiBzZWdtZW50LCB2b2lkICpoYW5kbGVyKQp7Cgl1MTYgKnB0ciA9ICh1MTYqKSh2ZWN0b3IqNCk7CglwdHJbMF0gPSAoKHUzMiloYW5kbGVyIC0gKHNlZ21lbnQgPDwgNCkpJjB4ZmZmZjsKCXB0clsxXSA9IHNlZ21lbnQ7CgojaWYgMAoJcHJpbnRmKCJzZXR2ZWN0b3I6IGludCUwMnggLT4gJTA0eDolMDR4XG4iLAoJICAgICAgIHZlY3RvciwgcHRyWzFdLCBwdHJbMF0pOwojZW5kaWYKfQoKI2RlZmluZSBSRUxPQ18xNl9MT05HKHNlZywgb2ZmKSAqKHUzMiopKHNlZyA8PCA0IHwgKHUzMikmb2ZmKQojZGVmaW5lIFJFTE9DXzE2X1dPUkQoc2VnLCBvZmYpICoodTE2Kikoc2VnIDw8IDQgfCAodTMyKSZvZmYpCiNkZWZpbmUgUkVMT0NfMTZfQllURShzZWcsIG9mZikgKih1OCopKHNlZyA8PCA0IHwgKHUzMikmb2ZmKQoKaW50IGJpb3Nfc2V0dXAodm9pZCkKewoJc3RhdGljIGludCBkb25lPTA7CglpbnQgdmVjdG9yOwojaWZkZWYgQ09ORklHX1BDSQoJc3RydWN0IHBjaV9jb250cm9sbGVyICpwcmlfaG9zZTsKI2VuZGlmCglpZiAoZG9uZSkgewoJCXJldHVybiAwOwoJfQoJZG9uZSA9IDE7CgoJaWYgKGkzODZib290X2Jpb3Nfc2l6ZSA+IDY1NTM2KSB7CgkJcHJpbnRmKCJCSU9TIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgNjU1MzYpXG4iLAoJCSAgICAgICBpMzg2Ym9vdF9iaW9zX3NpemUpOwoJCXJldHVybiAtMTsKCX0KCgltZW1jcHkoQklPU19CQVNFLCAodm9pZCopaTM4NmJvb3RfYmlvcywgaTM4NmJvb3RfYmlvc19zaXplKTsKCgkvKiBjbGVhciBiZGEgKi8KCW1lbXNldChCSU9TX0RBVEEsIDAsIEJJT1NfREFUQV9TSVpFKTsKCgkvKiBlbnRlciBzb21lIHZhbHVlcyB0byB0aGUgYmRhICovCgl3cml0ZXcoMHgzZjgsIEJJT1NfREFUQSk7ICAgLyogY29tMSBhZGRyICovCgl3cml0ZXcoMHgyZjgsIEJJT1NfREFUQSsyKTsgLyogY29tMiBhZGRyICovCgl3cml0ZXcoMHgzZTgsIEJJT1NfREFUQSs0KTsgLyogY29tMyBhZGRyICovCgl3cml0ZXcoMHgyZTgsIEJJT1NfREFUQSs2KTsgLyogY29tNCBhZGRyICovCgl3cml0ZXcoMHgyNzgsIEJJT1NfREFUQSs4KTsgLyogbHB0MSBhZGRyICovCgkvKgoJICogVGhlIGtlcm5lbCB3YW50cyB0byByZWFkIHRoZSBiYXNlIG1lbW9yeSBzaXplCgkgKiBmcm9tIDQwOjEzLiBQdXQgYSB6ZXJvIHRoZXJlIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UKCSAqLwoJd3JpdGV3KDAsIEJJT1NfREFUQSsweDEzKTsgIC8qIGJhc2UgbWVtb3J5IHNpemUgKi8KCgoJLyogc2V0dXAgcmVhbG1vZGUgaW50ZXJydXB0IHZlY3RvcnMgKi8KCWZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgTlVNVkVDVFM7IHZlY3RvcisrKSB7CgkJc2V0dmVjdG9yKHZlY3RvciwgQklPU19DUywgJnJtX2RlZl9pbnQpOwoJfQoKCXNldHZlY3RvcigweDAwLCBCSU9TX0NTLCAmcm1faW50MDApOwoJc2V0dmVjdG9yKDB4MDEsIEJJT1NfQ1MsICZybV9pbnQwMSk7CglzZXR2ZWN0b3IoMHgwMiwgQklPU19DUywgJnJtX2ludDAyKTsKCXNldHZlY3RvcigweDAzLCBCSU9TX0NTLCAmcm1faW50MDMpOwoJc2V0dmVjdG9yKDB4MDQsIEJJT1NfQ1MsICZybV9pbnQwNCk7CglzZXR2ZWN0b3IoMHgwNSwgQklPU19DUywgJnJtX2ludDA1KTsKCXNldHZlY3RvcigweDA2LCBCSU9TX0NTLCAmcm1faW50MDYpOwoJc2V0dmVjdG9yKDB4MDcsIEJJT1NfQ1MsICZybV9pbnQwNyk7CglzZXR2ZWN0b3IoMHgwOCwgQklPU19DUywgJnJtX2ludDA4KTsKCXNldHZlY3RvcigweDA5LCBCSU9TX0NTLCAmcm1faW50MDkpOwoJc2V0dmVjdG9yKDB4MGEsIEJJT1NfQ1MsICZybV9pbnQwYSk7CglzZXR2ZWN0b3IoMHgwYiwgQklPU19DUywgJnJtX2ludDBiKTsKCXNldHZlY3RvcigweDBjLCBCSU9TX0NTLCAmcm1faW50MGMpOwoJc2V0dmVjdG9yKDB4MGQsIEJJT1NfQ1MsICZybV9pbnQwZCk7CglzZXR2ZWN0b3IoMHgwZSwgQklPU19DUywgJnJtX2ludDBlKTsKCXNldHZlY3RvcigweDBmLCBCSU9TX0NTLCAmcm1faW50MGYpOwoJc2V0dmVjdG9yKDB4MTAsIEJJT1NfQ1MsICZybV9pbnQxMCk7CglzZXR2ZWN0b3IoMHgxMSwgQklPU19DUywgJnJtX2ludDExKTsKCXNldHZlY3RvcigweDEyLCBCSU9TX0NTLCAmcm1faW50MTIpOwoJc2V0dmVjdG9yKDB4MTMsIEJJT1NfQ1MsICZybV9pbnQxMyk7CglzZXR2ZWN0b3IoMHgxNCwgQklPU19DUywgJnJtX2ludDE0KTsKCXNldHZlY3RvcigweDE1LCBCSU9TX0NTLCAmcm1faW50MTUpOwoJc2V0dmVjdG9yKDB4MTYsIEJJT1NfQ1MsICZybV9pbnQxNik7CglzZXR2ZWN0b3IoMHgxNywgQklPU19DUywgJnJtX2ludDE3KTsKCXNldHZlY3RvcigweDE4LCBCSU9TX0NTLCAmcm1faW50MTgpOwoJc2V0dmVjdG9yKDB4MTksIEJJT1NfQ1MsICZybV9pbnQxOSk7CglzZXR2ZWN0b3IoMHgxYSwgQklPU19DUywgJnJtX2ludDFhKTsKCXNldHZlY3RvcigweDFiLCBCSU9TX0NTLCAmcm1faW50MWIpOwoJc2V0dmVjdG9yKDB4MWMsIEJJT1NfQ1MsICZybV9pbnQxYyk7CglzZXR2ZWN0b3IoMHgxZCwgQklPU19DUywgJnJtX2ludDFkKTsKCXNldHZlY3RvcigweDFlLCBCSU9TX0NTLCAmcm1faW50MWUpOwoJc2V0dmVjdG9yKDB4MWYsIEJJT1NfQ1MsICZybV9pbnQxZik7CgoJc2V0X2ptcF92ZWN0b3IoMHhmZmYwLCAmcmVhbG1vZGVfcmVzZXQpOwoJc2V0X2ptcF92ZWN0b3IoMHhmZTZlLCAmcmVhbG1vZGVfcGNpX2Jpb3NfY2FsbF9lbnRyeSk7CgoJLyogZmlsbCBpbiBkYXRhIGFyZWEgKi8KCVJFTE9DXzE2X1dPUkQoMHhmMDAwLCByYW1faW5fNjRrYl9jaHVua3MpID0gZ2QtPnJhbV9zaXplID4+IDE2OwoJUkVMT0NfMTZfV09SRCgweGYwMDAsIGJpb3NfZXF1aXBtZW50KSA9IDA7IC8qIEZpeE1lICovCgoJLyogSWYgd2UgYXNzdW1lIG9ubHkgb25lIFBDSSBob3NlLCB0aGlzIFBDSSBob3NlCgkgKiB3aWxsIG93biBQQ0kgYnVzICMwLCBhbmQgdGhlIGxhc3QgUENJIGJ1cyBvZgoJICogdGhhdCBQQ0kgaG9zZSB3aWxsIGJlIHRoZSBsYXN0IFBDSSBidXMgaW4gdGhlCgkgKiBzeXN0ZW0uCgkgKiAoVGhpcywgb2ZjYXVzZSBicmVhayBvbiBtdWx0aSBob3NlIHN5c3RlbXMsCgkgKiAgYnV0IG91ciBQQ0kgQklPUyBvbmx5IHN1cHBvcnQgb25lIGhvc2UgYW55d2F5KQoJICovCiNpZmRlZiBDT05GSUdfUENJCglwcmlfaG9zZSA9IHBjaV9idXNfdG9faG9zZSgwKTsKCWlmIChOVUxMICE9IHByaV9ob3NlKSB7CgkJLyogZmlsbCBpbiBsYXN0IHBjaSBidXMgbnVtYmVyIGZvciB1c2UgYnkgdGhlIHJlYWxtb2RlCgkJICogUENJIEJJT1MgKi8KCQlSRUxPQ18xNl9CWVRFKDB4ZjAwMCwgcGNpX2xhc3RfYnVzKSA9IHByaV9ob3NlLT5sYXN0X2J1c25vOwoJfQojZW5kaWYKCXJldHVybiAwOwp9Cg==