LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCgovKgogKiBQYXJ0bHkgYmFzZWQgb24gbXNiaW9zLmMgZnJvbSByb2xvIDEuNjoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIChDKSBDb3B5cmlnaHQgMjAwMAogKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zIEdtYkgKICogS2xlaW4tV2ludGVybmhlaW0sIEdlcm1hbnkKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8cGNpLmg+CiNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2RlZmluZSBOVU1WRUNUUwkyNTYKCiNkZWZpbmUgQklPU19EQVRBICAgICAgICAoKGNoYXIqKTB4NDAwKQojZGVmaW5lIEJJT1NfREFUQV9TSVpFICAgMjU2CiNkZWZpbmUgQklPU19CQVNFICAgICAgICAoKGNoYXIqKTB4ZjAwMDApCiNkZWZpbmUgQklPU19DUyAgICAgICAgICAweGYwMDAKCi8qIHRoZXNlIGFyZSBkZWZpbmVkIGluIGEgMTZiaXQgc2VnbWVudCBhbmQgbmVlZHMKICogdG8gYmUgYWNjZXNzZWQgd2l0aCB0aGUgUkVMT0NfMTZfeHh4eCgpIG1hY3JvcyBiZWxvdwogKi8KZXh0ZXJuIHUxNiByYW1faW5fNjRrYl9jaHVua3M7CmV4dGVybiB1MTYgYmlvc19lcXVpcG1lbnQ7CmV4dGVybiB1OCAgcGNpX2xhc3RfYnVzOwoKZXh0ZXJuIHZvaWQgKnJtX2ludDAwOwpleHRlcm4gdm9pZCAqcm1faW50MDE7CmV4dGVybiB2b2lkICpybV9pbnQwMjsKZXh0ZXJuIHZvaWQgKnJtX2ludDAzOwpleHRlcm4gdm9pZCAqcm1faW50MDQ7CmV4dGVybiB2b2lkICpybV9pbnQwNTsKZXh0ZXJuIHZvaWQgKnJtX2ludDA2OwpleHRlcm4gdm9pZCAqcm1faW50MDc7CmV4dGVybiB2b2lkICpybV9pbnQwODsKZXh0ZXJuIHZvaWQgKnJtX2ludDA5OwpleHRlcm4gdm9pZCAqcm1faW50MGE7CmV4dGVybiB2b2lkICpybV9pbnQwYjsKZXh0ZXJuIHZvaWQgKnJtX2ludDBjOwpleHRlcm4gdm9pZCAqcm1faW50MGQ7CmV4dGVybiB2b2lkICpybV9pbnQwZTsKZXh0ZXJuIHZvaWQgKnJtX2ludDBmOwpleHRlcm4gdm9pZCAqcm1faW50MTA7CmV4dGVybiB2b2lkICpybV9pbnQxMTsKZXh0ZXJuIHZvaWQgKnJtX2ludDEyOwpleHRlcm4gdm9pZCAqcm1faW50MTM7CmV4dGVybiB2b2lkICpybV9pbnQxNDsKZXh0ZXJuIHZvaWQgKnJtX2ludDE1OwpleHRlcm4gdm9pZCAqcm1faW50MTY7CmV4dGVybiB2b2lkICpybV9pbnQxNzsKZXh0ZXJuIHZvaWQgKnJtX2ludDE4OwpleHRlcm4gdm9pZCAqcm1faW50MTk7CmV4dGVybiB2b2lkICpybV9pbnQxYTsKZXh0ZXJuIHZvaWQgKnJtX2ludDFiOwpleHRlcm4gdm9pZCAqcm1faW50MWM7CmV4dGVybiB2b2lkICpybV9pbnQxZDsKZXh0ZXJuIHZvaWQgKnJtX2ludDFlOwpleHRlcm4gdm9pZCAqcm1faW50MWY7CmV4dGVybiB2b2lkICpybV9kZWZfaW50OwoKZXh0ZXJuIHZvaWQgKnJlYWxtb2RlX3Jlc2V0OwpleHRlcm4gdm9pZCAqcmVhbG1vZGVfcGNpX2Jpb3NfY2FsbF9lbnRyeTsKCnN0YXRpYyBpbnQgc2V0X2ptcF92ZWN0b3IoaW50IGVudHJ5X3BvaW50LCB2b2lkICp0YXJnZXQpCnsKCWlmIChlbnRyeV9wb2ludCAmIH4weGZmZmYpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKCgodTMyKXRhcmdldC0weGYwMDAwKSAmIH4weGZmZmYpIHsKCQlyZXR1cm4gLTE7Cgl9CglwcmludGYoInNldF9qbXBfdmVjdG9yOiAweGYwMDA6JTA0eCAtPiAlcFxuIiwKCSAgICAgICBlbnRyeV9wb2ludCwgdGFyZ2V0KTsKCgkvKiBqbXAgb3Bjb2RlICovCgl3cml0ZWIoMHhlYSwgMHhmMDAwMCArIGVudHJ5X3BvaW50KTsKCgkvKiBvZmZzZXQgKi8KCXdyaXRldygoKHUzMil0YXJnZXQtMHhmMDAwMCksIDB4ZjAwMDAgKyBlbnRyeV9wb2ludCArIDEpOwoKCS8qIHNlZ21lbnQgKi8KCXdyaXRldygweGYwMDAsIDB4ZjAwMDAgKyBlbnRyeV9wb2ludCArIDMpOwoKCXJldHVybiAwOwp9CgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbnN0YWxsIGFuIGludGVycnVwdCB2ZWN0b3IKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCnN0YXRpYyB2b2lkIHNldHZlY3RvcihpbnQgdmVjdG9yLCB1MTYgc2VnbWVudCwgdm9pZCAqaGFuZGxlcikKewoJdTE2ICpwdHIgPSAodTE2KikodmVjdG9yKjQpOwoJcHRyWzBdID0gKCh1MzIpaGFuZGxlciAtIChzZWdtZW50IDw8IDQpKSYweGZmZmY7CglwdHJbMV0gPSBzZWdtZW50OwoKI2lmIDAKCXByaW50Zigic2V0dmVjdG9yOiBpbnQlMDJ4IC0+ICUwNHg6JTA0eFxuIiwKCSAgICAgICB2ZWN0b3IsIHB0clsxXSwgcHRyWzBdKTsKI2VuZGlmCn0KCiNkZWZpbmUgUkVMT0NfMTZfTE9ORyhzZWcsIG9mZikgKih1MzIqKShzZWcgPDwgNCB8ICh1MzIpJm9mZikKI2RlZmluZSBSRUxPQ18xNl9XT1JEKHNlZywgb2ZmKSAqKHUxNiopKHNlZyA8PCA0IHwgKHUzMikmb2ZmKQojZGVmaW5lIFJFTE9DXzE2X0JZVEUoc2VnLCBvZmYpICoodTgqKShzZWcgPDwgNCB8ICh1MzIpJm9mZikKCmludCBiaW9zX3NldHVwKHZvaWQpCnsKCURFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOwoJc3RhdGljIGludCBkb25lPTA7CglpbnQgdmVjdG9yOwoJc3RydWN0IHBjaV9jb250cm9sbGVyICpwcmlfaG9zZTsKCglpZiAoZG9uZSkgewoJCXJldHVybiAwOwoJfQoJZG9uZSA9IDE7CgoJaWYgKGkzODZib290X2Jpb3Nfc2l6ZSA+IDY1NTM2KSB7CgkJcHJpbnRmKCJCSU9TIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgNjU1MzYpXG4iLAoJCSAgICAgICBpMzg2Ym9vdF9iaW9zX3NpemUpOwoJCXJldHVybiAtMTsKCX0KCgltZW1jcHkoQklPU19CQVNFLCAodm9pZCopaTM4NmJvb3RfYmlvcywgaTM4NmJvb3RfYmlvc19zaXplKTsKCgkvKiBjbGVhciBiZGEgKi8KCW1lbXNldChCSU9TX0RBVEEsIDAsIEJJT1NfREFUQV9TSVpFKTsKCgkvKiBlbnRlciBzb21lIHZhbHVlcyB0byB0aGUgYmRhICovCgl3cml0ZXcoMHgzZjgsIEJJT1NfREFUQSk7ICAgLyogY29tMSBhZGRyICovCgl3cml0ZXcoMHgyZjgsIEJJT1NfREFUQSsyKTsgLyogY29tMiBhZGRyICovCgl3cml0ZXcoMHgzZTgsIEJJT1NfREFUQSs0KTsgLyogY29tMyBhZGRyICovCgl3cml0ZXcoMHgyZTgsIEJJT1NfREFUQSs2KTsgLyogY29tNCBhZGRyICovCgl3cml0ZXcoMHgyNzgsIEJJT1NfREFUQSs4KTsgLyogbHB0MSBhZGRyICovCgkvKgoJICogVGhlIGtlcm5lbCB3YW50cyB0byByZWFkIHRoZSBiYXNlIG1lbW9yeSBzaXplCgkgKiBmcm9tIDQwOjEzLiBQdXQgYSB6ZXJvIHRoZXJlIHRvIGF2b2lkIGFuIGVycm9yIG1lc3NhZ2UKCSAqLwoJd3JpdGV3KDAsIEJJT1NfREFUQSsweDEzKTsgIC8qIGJhc2UgbWVtb3J5IHNpemUgKi8KCgoJLyogc2V0dXAgcmVhbG1vZGUgaW50ZXJydXB0IHZlY3RvcnMgKi8KCWZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgTlVNVkVDVFM7IHZlY3RvcisrKSB7CgkJc2V0dmVjdG9yKHZlY3RvciwgQklPU19DUywgJnJtX2RlZl9pbnQpOwoJfQoKCXNldHZlY3RvcigweDAwLCBCSU9TX0NTLCAmcm1faW50MDApOwoJc2V0dmVjdG9yKDB4MDEsIEJJT1NfQ1MsICZybV9pbnQwMSk7CglzZXR2ZWN0b3IoMHgwMiwgQklPU19DUywgJnJtX2ludDAyKTsKCXNldHZlY3RvcigweDAzLCBCSU9TX0NTLCAmcm1faW50MDMpOwoJc2V0dmVjdG9yKDB4MDQsIEJJT1NfQ1MsICZybV9pbnQwNCk7CglzZXR2ZWN0b3IoMHgwNSwgQklPU19DUywgJnJtX2ludDA1KTsKCXNldHZlY3RvcigweDA2LCBCSU9TX0NTLCAmcm1faW50MDYpOwoJc2V0dmVjdG9yKDB4MDcsIEJJT1NfQ1MsICZybV9pbnQwNyk7CglzZXR2ZWN0b3IoMHgwOCwgQklPU19DUywgJnJtX2ludDA4KTsKCXNldHZlY3RvcigweDA5LCBCSU9TX0NTLCAmcm1faW50MDkpOwoJc2V0dmVjdG9yKDB4MGEsIEJJT1NfQ1MsICZybV9pbnQwYSk7CglzZXR2ZWN0b3IoMHgwYiwgQklPU19DUywgJnJtX2ludDBiKTsKCXNldHZlY3RvcigweDBjLCBCSU9TX0NTLCAmcm1faW50MGMpOwoJc2V0dmVjdG9yKDB4MGQsIEJJT1NfQ1MsICZybV9pbnQwZCk7CglzZXR2ZWN0b3IoMHgwZSwgQklPU19DUywgJnJtX2ludDBlKTsKCXNldHZlY3RvcigweDBmLCBCSU9TX0NTLCAmcm1faW50MGYpOwoJc2V0dmVjdG9yKDB4MTAsIEJJT1NfQ1MsICZybV9pbnQxMCk7CglzZXR2ZWN0b3IoMHgxMSwgQklPU19DUywgJnJtX2ludDExKTsKCXNldHZlY3RvcigweDEyLCBCSU9TX0NTLCAmcm1faW50MTIpOwoJc2V0dmVjdG9yKDB4MTMsIEJJT1NfQ1MsICZybV9pbnQxMyk7CglzZXR2ZWN0b3IoMHgxNCwgQklPU19DUywgJnJtX2ludDE0KTsKCXNldHZlY3RvcigweDE1LCBCSU9TX0NTLCAmcm1faW50MTUpOwoJc2V0dmVjdG9yKDB4MTYsIEJJT1NfQ1MsICZybV9pbnQxNik7CglzZXR2ZWN0b3IoMHgxNywgQklPU19DUywgJnJtX2ludDE3KTsKCXNldHZlY3RvcigweDE4LCBCSU9TX0NTLCAmcm1faW50MTgpOwoJc2V0dmVjdG9yKDB4MTksIEJJT1NfQ1MsICZybV9pbnQxOSk7CglzZXR2ZWN0b3IoMHgxYSwgQklPU19DUywgJnJtX2ludDFhKTsKCXNldHZlY3RvcigweDFiLCBCSU9TX0NTLCAmcm1faW50MWIpOwoJc2V0dmVjdG9yKDB4MWMsIEJJT1NfQ1MsICZybV9pbnQxYyk7CglzZXR2ZWN0b3IoMHgxZCwgQklPU19DUywgJnJtX2ludDFkKTsKCXNldHZlY3RvcigweDFlLCBCSU9TX0NTLCAmcm1faW50MWUpOwoJc2V0dmVjdG9yKDB4MWYsIEJJT1NfQ1MsICZybV9pbnQxZik7CgoJc2V0X2ptcF92ZWN0b3IoMHhmZmYwLCAmcmVhbG1vZGVfcmVzZXQpOwoJc2V0X2ptcF92ZWN0b3IoMHhmZTZlLCAmcmVhbG1vZGVfcGNpX2Jpb3NfY2FsbF9lbnRyeSk7CgoJLyogZmlsbCBpbiBkYXRhIGFyZWEgKi8KCVJFTE9DXzE2X1dPUkQoMHhmMDAwLCByYW1faW5fNjRrYl9jaHVua3MpID0gZ2QtPnJhbV9zaXplID4+IDE2OwoJUkVMT0NfMTZfV09SRCgweGYwMDAsIGJpb3NfZXF1aXBtZW50KSA9IDA7IC8qIEZpeE1lICovCgoJLyogSWYgd2UgYXNzdW1lIG9ubHkgb25lIFBDSSBob3NlLCB0aGlzIFBDSSBob3NlCgkgKiB3aWxsIG93biBQQ0kgYnVzICMwLCBhbmQgdGhlIGxhc3QgUENJIGJ1cyBvZgoJICogdGhhdCBQQ0kgaG9zZSB3aWxsIGJlIHRoZSBsYXN0IFBDSSBidXMgaW4gdGhlCgkgKiBzeXN0ZW0uCgkgKiAoVGhpcywgb2ZjYXVzZSBicmVhayBvbiBtdWx0aSBob3NlIHN5c3RlbXMsCgkgKiAgYnV0IG91ciBQQ0kgQklPUyBvbmx5IHN1cHBvcnQgb25lIGhvc2UgYW55d2F5KQoJICovCglwcmlfaG9zZSA9IHBjaV9idXNfdG9faG9zZSgwKTsKCWlmIChOVUxMICE9IHByaV9ob3NlKSB7CgkJLyogZmlsbCBpbiBsYXN0IHBjaSBidXMgbnVtYmVyIGZvciB1c2UgYnkgdGhlIHJlYWxtb2RlCgkJICogUENJIEJJT1MgKi8KCQlSRUxPQ18xNl9CWVRFKDB4ZjAwMCwgcGNpX2xhc3RfYnVzKSA9IHByaV9ob3NlLT5sYXN0X2J1c25vOwoJfQoKCXJldHVybiAwOwp9Cg==