ZGlmZiAtLWdpdCBhL2JvYXJkL3NjNTIwX2NkcC9zYzUyMF9jZHBfcGNpLmMgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYjc5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9zYzUyMF9jZHAvc2M1MjBfY2RwX3BjaS5jCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogRGFuaWVsIEVuZ3N0cvZtLCBPbWljcm9uIENldGkgQUIgPGRhbmllbEBvbWljcm9uLnNlPi4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8cGNpLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgorI2luY2x1ZGUgPGFzbS9pYy9wY2kuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKyN1bmRlZiBTQzUyMF9DRFBfREVCVUcKKworI2lmZGVmCVNDNTIwX0NEUF9ERUJVRworI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBwY2lfZGV2X3QgZGV2KQoreworCS8qIGEgY29uZmlndXJhYmxlIGxpc3RzIG9mIGlycXMgdG8gc3RlYWwKKwkgKiB3aGVuIHdlIG5lZWQgb25lIChhIGJvYXJkIHdpdGggbW9yZSBwY2kgaW50ZXJydXB0IHBpbnMKKwkgKiB3b3VsZCB1c2UgYSBsYXJnZXIgdGFibGUgKi8KKwlzdGF0aWMgaW50IGlycV9saXN0W10gPSB7CisJCUNPTkZJR19TWVNfRklSU1RfUENJX0lSUSwKKwkJQ09ORklHX1NZU19TRUNPTkRfUENJX0lSUSwKKwkJQ09ORklHX1NZU19USElSRF9QQ0lfSVJRLAorCQlDT05GSUdfU1lTX0ZPUlRIX1BDSV9JUlEKKwl9OworCXN0YXRpYyBpbnQgbmV4dF9pcnFfaW5kZXg9MDsKKworCXVjaGFyIHRtcF9waW47CisJaW50IHBpbjsKKworCXBjaV9ob3NlX3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnRtcF9waW4pOworCXBpbiA9IHRtcF9waW47CisKKwlwaW4tPTE7IC8qIHBjaSBjb25maWcgc3BhY2UgdXNlIDEtYmFzZWQgbnVtYmVyaW5nICovCisJaWYgKC0xID09IHBpbikgeworCQlyZXR1cm47IC8qIGRldmljZSB1c2Ugbm8gaXJxICovCisJfQorCisKKwkvKiBtYXAgZGV2aWNlIG51bWJlciArICBwaW4gdG8gYSBwaW4gb24gdGhlIHNjNTIwICovCisJc3dpdGNoIChQQ0lfREVWKGRldikpIHsKKwljYXNlIDIwOgorCQlwaW4rPVNDNTIwX1BDSV9JTlRBOworCQlicmVhazsKKworCWNhc2UgMTk6CisJCXBpbis9U0M1MjBfUENJX0lOVEI7CisJCWJyZWFrOworCisJY2FzZSAxODoKKwkJcGluKz1TQzUyMF9QQ0lfSU5UQzsKKwkJYnJlYWs7CisKKwljYXNlIDE3OgorCQlwaW4rPVNDNTIwX1BDSV9JTlREOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlwaW4mPTM7IC8qIHdyYXAgYXJvdW5kICovCisKKwlpZiAoc2M1MjBfcGNpX2ludHNbcGluXSA9PSAtMSkgeworCQkvKiByZS1yb3V0ZSBvbmUgaW50ZXJydXB0IGZvciB1cyAqLworCQlpZiAobmV4dF9pcnFfaW5kZXggPiAzKSB7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHBjaV9zYzUyMF9zZXRfaXJxKHBpbiwgaXJxX2xpc3RbbmV4dF9pcnFfaW5kZXhdKSkgeworCQkJcmV0dXJuOworCQl9CisJCW5leHRfaXJxX2luZGV4Kys7CisJfQorCisKKwlpZiAoLTEgIT0gc2M1MjBfcGNpX2ludHNbcGluXSkgeworCQlwY2lfaG9zZV93cml0ZV9jb25maWdfYnl0ZShob3NlLCBkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwKKwkJCQkJICAgc2M1MjBfcGNpX2ludHNbcGluXSk7CisJfQorCVBSSU5URigiZml4dXBfaXJxOiBkZXZpY2UgJWQgcGluICVjIGlycSAlZFxuIiwKKwkgICAgICAgUENJX0RFVihkZXYpLCAnQScgKyBwaW4sIHNjNTIwX3BjaV9pbnRzW3Bpbl0pOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9jb250cm9sbGVyIHNjNTIwX2NkcF9ob3NlID0geworCWZpeHVwX2lycTogcGNpX3NjNTIwX2NkcF9maXh1cF9pcnEsCit9OworCit2b2lkIHBjaV9pbml0X2JvYXJkKHZvaWQpCit7CisJcGNpX3NjNTIwX2luaXQoJnNjNTIwX2NkcF9ob3NlKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKKyAqIG9mIHRoZSBzeXN0ZW0gYWRkcmVzcyBzcGFjZSB0byB0aGUgSVNBIGJ1cworICoKKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbWVtb3J5IGFkZHJlc3MKKyAqIGFzIHNlZW4gYnkgdGhlIGhvc3QgKHdoaWNoIG1heSB2ZXJ5IHdpbGwgYmUgdGhlCisgKiBzYW1lIGFzIHRoZSBidXMgYWRkcmVzcykKKyAqLwordTMyIGlzYV9tYXBfcm9tKHUzMiBidXNfYWRkciwgaW50IHNpemUpCit7CisJdTMyIHBhcjsKKworCVBSSU5URigiaXNhX21hcF9yb20gYXNrZWQgdG8gbWFwICVkIGJ5dGVzIGF0ICV4XG4iLAorCSAgICAgICBzaXplLCBidXNfYWRkcik7CisKKwlwYXIgPSBzaXplOworCWlmIChwYXIgPCAweDgwMDAwKSB7CisJCXBhciA9IDB4ODAwMDA7CisJfQorCXBhciA+Pj0gMTI7CisJcGFyLS07CisJcGFyJj0weDdmOworCXBhciA8PD0gMTg7CisJcGFyIHw9IChidXNfYWRkcj4+MTIpOworCXBhciB8PSAweDUwMDAwMDAwOworCisJUFJJTlRGICgic2V0dGluZyBQQVIxMSB0byAleFxuIiwgcGFyKTsKKworCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KKwlzYzUyMF9tbWNyLT5wYXJbMTFdID0gcGFyOworCisJcmV0dXJuIGJ1c19hZGRyOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKKyAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKKyAqLwordm9pZCBpc2FfdW5tYXBfcm9tKHUzMiBhZGRyKQoreworCVBSSU5URigiaXNhX3VubWFwX3JvbSBhc2tlZCB0byB1bm1hcCAleCIsIGFkZHIpOworCWlmICgoYWRkcj4+MTIpID09IChzYzUyMF9tbWNyLT5wYXJbMTFdICYgMHgzZmZmZikpIHsKKwkJc2M1MjBfbW1jci0+cGFyWzExXSA9IDA7CisJCVBSSU5URigiIGRvbmVcbiIpOworCQlyZXR1cm47CisJfQorCVBSSU5URigiIG5vdCBvdXJzXG4iKTsKK30KKworI2RlZmluZSBQQ0lfUk9NX1RFTVBfU1BBQ0UgMHgxMDAwMAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG1hcCBhIGNodW5rIG9mIHNpemUgYnl0ZXMKKyAqIG9mIHRoZSBzeXN0ZW0gYWRkcmVzcyBzcGFjZSB0byB0aGUgUENJIGJ1cywKKyAqIHN1aXRhYmxlIHRvIG1hcCBQQ0kgUk9NUyAoYnVzIGFkZHJlc3MgPCAxNk0pCisgKiB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGhvc3QgbWVtb3J5IGFkZHJlc3MKKyAqIHdoaWNoIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhIGJ1cyBhZGRyZXNzCisgKiBiZWZvcmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFBDSSByb20gYWRkcmVzcworICogZGVjb2RlcgorICovCit1MzIgcGNpX2dldF9yb21fd2luZG93KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgaW50IHNpemUpCit7CisJdTMyIHBhcjsKKworCXBhciA9IHNpemU7CisJaWYgKHBhciA8IDB4ODAwMDApIHsKKwkJcGFyID0gMHg4MDAwMDsKKwl9CisJcGFyID4+PSAxNjsKKwlwYXItLTsKKwlwYXImPTB4N2ZmOworCXBhciA8PD0gMTQ7CisJcGFyIHw9IChQQ0lfUk9NX1RFTVBfU1BBQ0U+PjE2KTsKKwlwYXIgfD0gMHg3MjAwMDAwMDsKKworCVBSSU5URiAoInNldHRpbmcgUEFSMSB0byAleFxuIiwgcGFyKTsKKworCS8qIE1hcCByb20gMHgxMDAwMCB3aXRoIFBBUjEgKi8KKwlzYzUyMF9tbWNyLT5wYXJbMV0gPSBwYXI7CisKKwlyZXR1cm4gUENJX1JPTV9URU1QX1NQQUNFOworfQorCisvKgorICogdGhpcyBmdW5jdGlvbiByZW1vdmVkIGFueSBtYXBwaW5nIGNyZWF0ZWQKKyAqIHdpdGggcGNpX2dldF9yb21fd2luZG93KCkKKyAqLwordm9pZCBwY2lfcmVtb3ZlX3JvbV93aW5kb3coc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCB1MzIgYWRkcikKK3sKKwlQUklOVEYoInBjaV9yZW1vdmVfcm9tX3dpbmRvdzogJXgiLCBhZGRyKTsKKwlpZiAoYWRkciA9PSBQQ0lfUk9NX1RFTVBfU1BBQ0UpIHsKKwkJc2M1MjBfbW1jci0+cGFyWzFdID0gMDsKKwkJUFJJTlRGKCIgZG9uZVxuIik7CisJCXJldHVybjsKKwl9CisJUFJJTlRGKCIgbm90IG91cnNcbiIpOworCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBvcmRlciB0byBwcm92aWRlIGFjY2VzIHRvIHRoZQorICogbGVnYWN5IHZpZGVvIEkvTyBwb3J0cyBvbiB0aGUgUENJIGJ1cy4KKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gYWNjZXNzZXMgdG8gSS9PIHBvcnRzIDB4M2IwLTB4M2JiIGFuZAorICogMHgzYzAtMHgzZGYgc2h1bGQgcmVzdWx0IGluIHRyYW5zYWN0aW9ucyBvbiB0aGUgUENJIGJ1cy4KKyAqCisgKi8KK2ludCBwY2lfZW5hYmxlX2xlZ2FjeV92aWRlb19wb3J0cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJLyogTWFwIHZpZGVvIG1lbW9yeSB0byAweGEwMDAwKi8KKwlzYzUyMF9tbWNyLT5wYXJbMF0gPSAweDcyMDA0MDBhOworCisJLyogZm9yd2FyZCBhbGwgSS9PIGFjY2Vzc2VzIHRvIFBDSSAqLworCXNjNTIwX21tY3ItPmFkZGRlY2N0bCA9IHNjNTIwX21tY3ItPmFkZGRlY2N0bCB8IElPX0hPTEVfREVTVF9QQ0k7CisKKworCS8qIHNvIHdlIG1hcCBhd2F5IGFsbCBpbyBwb3J0cyB0byBwY2kgKG9ubHkgd2F5IHRvIGFjY2VzcyBwY2kgaW8KKwkgKiBiZWxvdyAweDQwMC4gQnV0IHRoZW4gd2UgaGF2ZSB0byBtYXAgYmFjayB0aGUgcG9ydGlvbnMgdGhhdCB3ZSBkb250CisJICogdXNlIHNvIHRoYXQgdGhlIGdlbmVyYXRlIGN5Y2xlcyBvbiB0aGUgR1BJTyBidXMgd2hlcmUgdGhlIHNpbyBhbmQKKwkgKiBJU0Egc2xvdHMgYXJlIGNvbm5lY3RlZCwgdGhpcyByZXF1cmUgdGhlIHVzZSBvZiBzZXZlcmFsIFBBUiByZWdpc3RlcnMKKwkgKi8KKworCS8qIGJyaW5nIDB4MTAwIC0gMHgxZWYgYmFjayB0byBJU0EgdXNpbmcgUEFSNSAqLworCXNjNTIwX21tY3ItPnBhcls1XSA9IDB4MzBlZjAxMDA7CisKKwkvKiBJREUgdXNlIDFmMC0xZjcgKi8KKworCS8qIGJyaW5nIDB4MWY4IC0gMHgyZjcgYmFjayB0byBJU0EgdXNpbmcgUEFSNiAqLworCXNjNTIwX21tY3ItPnBhcls2XSA9IDB4MzBmZjAxZjg7CisKKwkvKiBjb20yIHVzZSAyZjgtMmZmICovCisKKwkvKiBicmluZyAweDMwMCAtIDB4M2FmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjcgKi8KKwlzYzUyMF9tbWNyLT5wYXJbN10gPSAweDMwYWYwMzAwOworCisJLyogdmdhIHVzZSAzYjAtM2JiICovCisKKwkvKiBicmluZyAweDNiYyAtIDB4M2JmIGJhY2sgdG8gSVNBIHVzaW5nIFBBUjggKi8KKwlzYzUyMF9tbWNyLT5wYXJbOF0gPSAweDMwMDMwM2JjOworCisJLyogdmdhIHVzZSAzYzAtM2RmICovCisKKwkvKiBicmluZyAweDNlMCAtIDB4M2Y1IGJhY2sgdG8gSVNBIHVzaW5nIFBBUjkgKi8KKwlzYzUyMF9tbWNyLT5wYXJbOV0gPSAweDMwMTUwM2UwOworCisJLyogaWRlIHVzZSAzZjYgKi8KKworCS8qIGJyaW5nIDB4M2Y3ICBiYWNrIHRvIElTQSB1c2luZyBQQVIxMCAqLworCXNjNTIwX21tY3ItPnBhclsxMF0gPSAweDMwMDAwM2Y3OworCisJLyogY29tMSB1c2UgM2Y4LTNmZiAqLworCisJcmV0dXJuIDA7Cit9Cg==