LyoKICogIEhvc3QgUmVzb3VyY2VzIE1JQiAtIERldmljZSBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGhyX2RldmljZS5jCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpbmNsdWRlICJob3N0X3Jlcy5oIgojaW5jbHVkZSAiaHJfZGV2aWNlLmgiCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgS2VybmVsICYgaW50ZXJmYWNlIGluZm9ybWF0aW9uLAoJICogICBhbmQgaW50ZXJuYWwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKaW50ICAgICAgICAgICAgIEdldF9OZXh0X0RldmljZSh2b2lkKTsKClBGViAgICAgICAgICAgICBpbml0X2RldmljZVtIUkRFVl9UWVBFX01BWF07ClBGSVYgICAgICAgICAgICBuZXh0X2RldmljZVtIUkRFVl9UWVBFX01BWF07ClBGViAgICAgICAgICAgICBzYXZlX2RldmljZVtIUkRFVl9UWVBFX01BWF07CmludCAgICAgICAgICAgICBkZXZfaWR4X2luY1tIUkRFVl9UWVBFX01BWF07CgpQRlMgICAgICAgICAgICAgZGV2aWNlX2Rlc2NyW0hSREVWX1RZUEVfTUFYXTsKUEZPICAgICAgICAgICAgIGRldmljZV9wcm9kaWRbSFJERVZfVFlQRV9NQVhdOwpQRkkgICAgICAgICAgICAgZGV2aWNlX3N0YXR1c1tIUkRFVl9UWVBFX01BWF07ClBGSSAgICAgICAgICAgICBkZXZpY2VfZXJyb3JzW0hSREVWX1RZUEVfTUFYXTsKCmludCAgICAgICAgICAgICBjdXJyZW50X3R5cGU7Cgp2b2lkICAgICAgICAgICAgSW5pdF9EZXZpY2Uodm9pZCk7CmludCAgICAgICAgICAgICBoZWFkZXJfaHJkZXZpY2Uoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKik7CgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lCUhSREVWX0lOREVYCQkxCiNkZWZpbmUJSFJERVZfVFlQRQkJMgojZGVmaW5lCUhSREVWX0RFU0NSCQkzCiNkZWZpbmUJSFJERVZfSUQJCTQKI2RlZmluZQlIUkRFVl9TVEFUVVMJCTUKI2RlZmluZQlIUkRFVl9FUlJPUlMJCTYKCnN0cnVjdCB2YXJpYWJsZTQgaHJkZXZpY2VfdmFyaWFibGVzW10gPSB7CiAgICB7SFJERVZfSU5ERVgsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2hyZGV2aWNlLCAyLCB7MSwgMX19LAogICAge0hSREVWX1RZUEUsIEFTTl9PQkpFQ1RfSUQsIFJPTkxZLCB2YXJfaHJkZXZpY2UsIDIsIHsxLCAyfX0sCiAgICB7SFJERVZfREVTQ1IsIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfaHJkZXZpY2UsIDIsIHsxLCAzfX0sCiAgICB7SFJERVZfSUQsIEFTTl9PQkpFQ1RfSUQsIFJPTkxZLCB2YXJfaHJkZXZpY2UsIDIsIHsxLCA0fX0sCiAgICB7SFJERVZfU1RBVFVTLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocmRldmljZSwgMiwgezEsIDV9fSwKICAgIHtIUkRFVl9FUlJPUlMsIEFTTl9DT1VOVEVSLCBST05MWSwgdmFyX2hyZGV2aWNlLCAyLCB7MSwgNn19Cn07Cm9pZCAgICAgICAgICAgICBocmRldmljZV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAzLCAyIH07CgoKdm9pZAppbml0X2hyX2RldmljZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAvKgogICAgICogSW5pdGlhbGx5IGFzc3VtZSBubyBkZXZpY2VzCiAgICAgKiAgICBJbnNlcnQgcG9pbnRlcnMgdG8gaW5pdGlhbGlzYXRpb24vZ2V0X25leHQgcm91dGluZXMKICAgICAqICAgIGZvciBwYXJ0aWN1bGFyIGRldmljZSB0eXBlcyBhcyB0aGV5IGFyZSBpbXBsZW1lbnRlZAogICAgICogICAgICAoc2V0IHVwIGluIHRoZSBhcHByb3ByaWF0ZSAnaW5pdF8qKCknIHJvdXRpbmUgKQogICAgICovCgogICAgZm9yIChpID0gMDsgaSA8IEhSREVWX1RZUEVfTUFYOyArK2kpIHsKICAgICAgICBpbml0X2RldmljZVtpXSA9IE5VTEw7CiAgICAgICAgbmV4dF9kZXZpY2VbaV0gPSBOVUxMOwogICAgICAgIHNhdmVfZGV2aWNlW2ldID0gTlVMTDsKICAgICAgICBkZXZfaWR4X2luY1tpXSA9IDA7ICAgICAvKiBBc3N1bWUgcmFuZG9tIGluZGljZXMgKi8KCiAgICAgICAgZGV2aWNlX2Rlc2NyW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2VfcHJvZGlkW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2Vfc3RhdHVzW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2VfZXJyb3JzW2ldID0gTlVMTDsKICAgIH0KCiAgICBSRUdJU1RFUl9NSUIoImhvc3QvaHJfZGV2aWNlIiwgaHJkZXZpY2VfdmFyaWFibGVzLCB2YXJpYWJsZTQsCiAgICAgICAgICAgICAgICAgaHJkZXZpY2VfdmFyaWFibGVzX29pZCk7Cn0KCgovKgogKiBoZWFkZXJfaHJkZXZpY2UoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwoKaW50CmhlYWRlcl9ocmRldmljZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJERVZfRU5UUllfTkFNRV9MRU5HVEgJMTEKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBkZXZfaWR4LCBMb3dJbmRleCA9IC0xLCBMb3dUeXBlID0gLTE7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwoKICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX2RldmljZSIsICJ2YXJfaHJkZXZpY2U6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9kZXZpY2UiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoImhvc3QvaHJfZGV2aWNlIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmV3bmFtZSwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgoKICAgIC8qCiAgICAgKiAgRmluZCB0aGUgIm5leHQiIGRldmljZSBlbnRyeS4KICAgICAqICBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0YWJsZSwgdGhlbiB0aGVyZSdzCiAgICAgKiAgICAgbm8gcG9pbnQgaW4gZXhhbWluaW5nIGVhcmxpZXIgdHlwZXMgb2YgZGV2aWNlcywKICAgICAqICAgICBzbyBzZXQgdGhlIHN0YXJ0aW5nIHR5cGUgdG8gdGhhdCBvZiB0aGUgdmFyaWFibGUKICAgICAqICAgICBiZWluZyBxdWVyaWVkLgogICAgICogIElmIHdlJ3ZlIG1vdmVkIGZyb20gb25lIGNvbHVtbiBvZiB0aGUgdGFibGUgdG8gYW5vdGhlciwKICAgICAqICAgICB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhZ2Fpbi4KICAgICAqICAgICAoaS5lLiB0aGUgJ2NvbXBhcmUnIGZhaWxzIHRvIG1hdGNoKQogICAgICogIFNpbWlsYXJseSBpZiB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlCiAgICAgKiAgICAgKGkuZS4gKmxlbmd0aCBpcyB0b28gc2hvcnQgdG8gYmUgYSBmdWxsIGluc3RhbmNlKQogICAgICovCgogICAgaWYgKChzbm1wX29pZF9jb21wYXJlKHZwLT5uYW1lLCB2cC0+bmFtZWxlbiwgbmFtZSwgdnAtPm5hbWVsZW4pID09IDApCiAgICAgICAgJiYgKCpsZW5ndGggPiBIUkRFVl9FTlRSWV9OQU1FX0xFTkdUSCkpCiAgICAgICAgY3VycmVudF90eXBlID0gKG5hbWVbSFJERVZfRU5UUllfTkFNRV9MRU5HVEhdID4+IEhSREVWX1RZUEVfU0hJRlQpOwogICAgZWxzZQogICAgICAgIGN1cnJlbnRfdHlwZSA9IDA7CgogICAgSW5pdF9EZXZpY2UoKTsKICAgIGZvciAoOzspIHsKICAgICAgICBkZXZfaWR4ID0gR2V0X05leHRfRGV2aWNlKCk7CiAgICAgICAgREVCVUdNU0coKCJob3N0L2hyX2RldmljZSIsICIoaW5kZXggJWQgLi4uLiIsIGRldl9pZHgpKTsKICAgICAgICBpZiAoZGV2X2lkeCA9PSAtMSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKExvd1R5cGUgIT0gLTEgJiYgTG93VHlwZSA8IChkZXZfaWR4ID4+IEhSREVWX1RZUEVfU0hJRlQpKQogICAgICAgICAgICBicmVhazsKICAgICAgICBuZXduYW1lW0hSREVWX0VOVFJZX05BTUVfTEVOR1RIXSA9IGRldl9pZHg7CiAgICAgICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX2RldmljZSIsIG5ld25hbWUsICpsZW5ndGgpKTsKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfZGV2aWNlIiwgIlxuIikpOwogICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgICAgICBpZiAoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgewogICAgICAgICAgICBpZiAoc2F2ZV9kZXZpY2VbY3VycmVudF90eXBlXSAhPSBOVUxMKQogICAgICAgICAgICAgICAgKCpzYXZlX2RldmljZVtjdXJyZW50X3R5cGVdKSAoKTsKICAgICAgICAgICAgTG93SW5kZXggPSBkZXZfaWR4OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSAmJgogICAgICAgICAgICAoTG93SW5kZXggPT0gLTEgfHwgZGV2X2lkeCA8IExvd0luZGV4KSkgewogICAgICAgICAgICBpZiAoc2F2ZV9kZXZpY2VbY3VycmVudF90eXBlXSAhPSBOVUxMKQogICAgICAgICAgICAgICAgKCpzYXZlX2RldmljZVtjdXJyZW50X3R5cGVdKSAoKTsKICAgICAgICAgICAgTG93SW5kZXggPSBkZXZfaWR4OwogICAgICAgICAgICBMb3dUeXBlID0gKGRldl9pZHggPj4gSFJERVZfVFlQRV9TSElGVCk7CiAgICAgICAgICAgIGlmIChkZXZfaWR4X2luY1tMb3dUeXBlXSkgICAvKiBJbmNyZWFzaW5nIGluZGljZXMgPT4gbm93IGRvbmUgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICB9CgogICAgaWYgKExvd0luZGV4ID09IC0xKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImhvc3QvaHJfZGV2aWNlIiwgIi4uLiBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpKTsKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICB9CgogICAgbmV3bmFtZVtIUkRFVl9FTlRSWV9OQU1FX0xFTkdUSF0gPSBMb3dJbmRleDsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9kZXZpY2UiLCAiLi4uIGdldCBkZXZpY2Ugc3RhdHMgIikpOwogICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX2RldmljZSIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgiaG9zdC9ocl9kZXZpY2UiLCAiXG4iKSk7CgogICAgcmV0dXJuIExvd0luZGV4Owp9CgoKb2lkICAgICAgICAgICAgIGRldmljZV90eXBlX2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAzLCAxLCA5OSB9OyAgLyogaHJEZXZpY2VUeXBlOTkgKi8KaW50ICAgICAgICAgICAgIGRldmljZV90eXBlX2xlbiA9CiAgICBzaXplb2YoZGV2aWNlX3R5cGVfaWQpIC8gc2l6ZW9mKGRldmljZV90eXBlX2lkWzBdKTsKCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgU3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKdV9jaGFyICAgICAgICAgKgp2YXJfaHJkZXZpY2Uoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGRldl9pZHgsIHR5cGU7CiAgICBvaWQgICAgICAgICAgICAqb2lkX3A7CiAgICBjb25zdCBjaGFyICAgICAqdG1wX3N0cjsKICAgIHN0YXRpYyBjaGFyICAgICBzdHJpbmdbMTAyNF07CgpyZWFsbHlfdHJ5X25leHQ6CiAgICBkZXZfaWR4ID0KICAgICAgICBoZWFkZXJfaHJkZXZpY2UodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoZGV2X2lkeCA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgdHlwZSA9IChkZXZfaWR4ID4+IEhSREVWX1RZUEVfU0hJRlQpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEhSREVWX0lOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gZGV2X2lkeDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUkRFVl9UWVBFOgogICAgICAgIGRldmljZV90eXBlX2lkW2RldmljZV90eXBlX2xlbiAtIDFdID0gdHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihkZXZpY2VfdHlwZV9pZCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZGV2aWNlX3R5cGVfaWQ7CiAgICBjYXNlIEhSREVWX0RFU0NSOgogICAgICAgIGlmICgoZGV2aWNlX2Rlc2NyW3R5cGVdICE9IE5VTEwpICYmCiAgICAgICAgICAgIChOVUxMIT0odG1wX3N0cj0oKCpkZXZpY2VfZGVzY3JbdHlwZV0pKGRldl9pZHgpKSkpKSB7CiAgICAgICAgICAgIHN0cmxjcHkoc3RyaW5nLCB0bXBfc3RyLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgfSBlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgICAgICBnb3RvIHRyeV9uZXh0OwojZWxzZQogICAgICAgICAgICBzcHJpbnRmKHN0cmluZywgImEgYmxhY2sgYm94IG9mIHNvbWUgc29ydCIpOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJERVZfSUQ6CiAgICAgICAgaWYgKGRldmljZV9wcm9kaWRbdHlwZV0gIT0gTlVMTCkKICAgICAgICAgICAgb2lkX3AgPSAoKCpkZXZpY2VfcHJvZGlkW3R5cGVdKSAoZGV2X2lkeCwgdmFyX2xlbikpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBvaWRfcCA9IG51bGxPaWQ7CiAgICAgICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgb2lkX3A7CiAgICBjYXNlIEhSREVWX1NUQVRVUzoKICAgICAgICBpZiAoZGV2aWNlX3N0YXR1c1t0eXBlXSAhPSBOVUxMKQogICAgICAgICAgICBsb25nX3JldHVybiA9ICgoKmRldmljZV9zdGF0dXNbdHlwZV0pIChkZXZfaWR4KSk7CiAgICAgICAgZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICAgICAgZ290byB0cnlfbmV4dDsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAvKiBBc3N1bWUgcnVubmluZyAqLwojZW5kaWYKICAgICAgICBpZiAoICFsb25nX3JldHVybiApCiAgICAgICAgICAgIGdvdG8gdHJ5X25leHQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJERVZfRVJST1JTOgogICAgICAgIGlmIChkZXZpY2VfZXJyb3JzW3R5cGVdICE9IE5VTEwpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKCpkZXZpY2VfZXJyb3JzW3R5cGVdKSAoZGV2X2lkeCk7CiAgICAgICAgZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICAgICAgZ290byB0cnlfbmV4dDsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOyAgICAvKiBBc3N1bWUgT0sgKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9ocmRldmljZVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KCiAgdHJ5X25leHQ6CiAgICBpZiAoIWV4YWN0KQogICAgICAgIGdvdG8gcmVhbGx5X3RyeV9uZXh0OwoKICAgIHJldHVybiBOVUxMOwp9CgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKdm9pZApJbml0X0RldmljZSh2b2lkKQp7CiAgICAvKgogICAgICogIEZpbmQgdGhlIGZpcnN0IG5vbi1OVUxMIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uCiAgICAgKiAgICBhbmQgY2FsbCBpdAogICAgICovCiAgICB3aGlsZSAoY3VycmVudF90eXBlIDwgSFJERVZfVFlQRV9NQVggJiYKICAgICAgICAgICBpbml0X2RldmljZVtjdXJyZW50X3R5cGVdID09IE5VTEwpCiAgICAgICAgaWYgKCsrY3VycmVudF90eXBlID49IEhSREVWX1RZUEVfTUFYKQogICAgICAgICAgICByZXR1cm47CiAgICAvKiBDaGVjayBjdXJyZW50X3R5cGUsIGlmID49IE1BWCBmaXJzdCB0aW1lIGludG8gbG9vcCwgd291bGQgZmFpbCBiZWxvdyAqLwogICAgaWYgKGN1cnJlbnRfdHlwZSA8IEhSREVWX1RZUEVfTUFYKQogICAgICAgICgqaW5pdF9kZXZpY2VbY3VycmVudF90eXBlXSkgKCk7Cn0KCmludApHZXRfTmV4dF9EZXZpY2Uodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IC0xOwoKICAgIC8qCiAgICAgKiAgQ2FsbCB0aGUgJ25leHQgZGV2aWNlJyBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQKICAgICAqICAgIHR5cGUgb2YgZGV2aWNlCiAgICAgKgogICAgICogIFRPRE86ICBzYXZlIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBkZXZpY2UKICAgICAqLwogICAgaWYgKGN1cnJlbnRfdHlwZSA8IEhSREVWX1RZUEVfTUFYICYmIG5leHRfZGV2aWNlW2N1cnJlbnRfdHlwZV0gIT0gTlVMTCkKICAgICAgICByZXN1bHQgPSAoKm5leHRfZGV2aWNlW2N1cnJlbnRfdHlwZV0pICgpOwoKICAgIC8qCiAgICAgKiAgTm8gbW9yZSBkZXZpY2VzIG9mIHRoZSBjdXJyZW50IHR5cGUuCiAgICAgKiAgVHJ5IHRoZSBuZXh0IHR5cGUgKGlmIGFueSkKICAgICAqLwogICAgaWYgKHJlc3VsdCA9PSAtMSkgewogICAgICAgIGlmICgrK2N1cnJlbnRfdHlwZSA+PSBIUkRFVl9UWVBFX01BWCkgewogICAgICAgICAgICBjdXJyZW50X3R5cGUgPSAwOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIEluaXRfRGV2aWNlKCk7CiAgICAgICAgcmV0dXJuIEdldF9OZXh0X0RldmljZSgpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKfQo=