LyogZWFzeXByb2MuaAogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCi8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIFRoaXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzIG5lY2Vzc2FyeSBmb3IgYSBzaW1wbGUgL3Byb2MgZmlsZQogKiAgaW1wbGVtZW50YXRpb24gZm9yIGEgZHJpdmVyLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKI2lmbmRlZiBfX0VBU1lQUk9DX0hfXwojZGVmaW5lIF9fRUFTWVBST0NfSF9fCgojaW5jbHVkZSAidGltc2ttb2QuaCIKCgpzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGlyOwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRHJpdmVyRGlyOwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRHJpdmVyRGlhZ0ZpbGU7CglzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEZXZpY2VEaXI7CgljaGFyICpQcm9jSWQ7Cgl2b2lkICgqU2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApOwoJdm9pZCAoKlNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKCXZvaWQgKCpXcml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLCBzaXplX3QgY291bnQsCgkJCQkgIGxvZmZfdCAqcHBvcywgdm9pZCAqcCk7Cgl2b2lkICgqV3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwp9OwoKLyogcHJvcGVydHkgaXMgYSBmaWxlIHVuZGVyIC9wcm9jLzx4Pi9kZXZpY2UvPHg+Lzxwcm9wZXJ0eV9uYW1lPiAqLwpzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gewoJY2hhciBwcm9wZXJ0eV9uYW1lWzI1XTsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0VudHJ5OwoJc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyOwoJdm9pZCAqZGV2ZGF0YTsKCXZvaWQgKCpzaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqcCk7Cn07CgpzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGV2aWNleERpcjsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RldmljZXhEaWFnRmlsZTsKCXN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcjsKCXZvaWQgKmRldmRhdGE7CglpbnQgZGV2bm87CgkvKiAgYWxsb3cgZm9yIGEgbnVtYmVyIG9mIGN1c3RvbSBwcm9wZXJ0aWVzIGZvciBlYWNoIGRldmljZTogKi8KCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyBkZXZpY2VfcHJvcGVydHlfaW5mb1sxMF07Cn07Cgp2b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAoJCQkgICAgICAgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8sCgkJCSAgICAgICB2b2lkICpkZXZkYXRhKTsKdm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAoJCQkJIHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwgaW50IGRldm5vKTsKdm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlciwKCQkJICAgICAgIGNoYXIgKnByb2NJZCwKCQkJICAgICAgIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCgkJCSAgICAgICB2b2lkICgqc2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICosCgkJCQkJCQl2b2lkICopKTsKdm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAoJCQkJIGNoYXIgKnByb2NJZCwKCQkJCSB2b2lkICgqc2hvd19kcml2ZXJfaW5mbykoc3RydWN0IHNlcV9maWxlICopLAoJCQkJIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKCQkJCQkJCSAgdm9pZCAqKSwKCQkJCSB2b2lkICgqV3JpdGVfZHJpdmVyX2luZm8pKGNoYXIgKmJ1ZiwKCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyksCgkJCQkgdm9pZCAoKldyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsCgkJCQkJCQkgICBzaXplX3QgY291bnQsCgkJCQkJCQkgICBsb2ZmX3QgKnBwb3MsCgkJCQkJCQkgICB2b2lkICpwKSk7CnZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcik7CnZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAoJCQkJCSB2b2lkICgqc2hvd19wcm9wZXJ0eV9pbmZvKQoJCQkJCSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiksCgkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpOwoKI2VuZGlmCg==