LyoKICogTFRDMjYzMiBEaWdpdGFsIHRvIGFuYWxvZyBjb252ZXJ0b3JzIHNwaSBkcml2ZXIKICoKICogQ29weXJpZ2h0IDIwMTcgTWF4aW1lIFJvdXNzaW4tQulsYW5nZXIKICogZXhwYW5kZWQgYnkgU2lsdmFuIE11cmVyIDxzaWx2YW4ubXVyZXJAZ21haWwuY29tPgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CiNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KCiNkZWZpbmUgTFRDMjYzMl9EQUNfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgIDIKCiNkZWZpbmUgTFRDMjYzMl9BRERSX0RBQzAgICAgICAgICAgICAgICAgICAgICAgIDB4MAojZGVmaW5lIExUQzI2MzJfQUREUl9EQUMxICAgICAgICAgICAgICAgICAgICAgICAweDEKCiNkZWZpbmUgTFRDMjYzMl9DTURfV1JJVEVfSU5QVVRfTiAgICAgICAgICAgICAgIDB4MAojZGVmaW5lIExUQzI2MzJfQ01EX1VQREFURV9EQUNfTiAgICAgICAgICAgICAgICAweDEKI2RlZmluZSBMVEMyNjMyX0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9BTEwgICAgMHgyCiNkZWZpbmUgTFRDMjYzMl9DTURfV1JJVEVfSU5QVVRfTl9VUERBVEVfTiAgICAgIDB4MwojZGVmaW5lIExUQzI2MzJfQ01EX1BPV0VSRE9XTl9EQUNfTiAgICAgICAgICAgICAweDQKI2RlZmluZSBMVEMyNjMyX0NNRF9QT1dFUkRPV05fQ0hJUCAgICAgICAgICAgICAgMHg1CiNkZWZpbmUgTFRDMjYzMl9DTURfSU5URVJOQUxfUkVGRVIgICAgICAgICAgICAgIDB4NgojZGVmaW5lIExUQzI2MzJfQ01EX0VYVEVSTkFMX1JFRkVSICAgICAgICAgICAgICAweDcKCi8qKgogKiBzdHJ1Y3QgbHRjMjYzMl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmljIGluZm9ybWF0aW9uCiAqIEBjaGFubmVsczoJCWNoYW5uZWwgc3BlYyBmb3IgdGhlIERBQwogKiBAdnJlZl9tdjoJCWludGVybmFsIHJlZmVyZW5jZSB2b2x0YWdlCiAqLwpzdHJ1Y3QgbHRjMjYzMl9jaGlwX2luZm8gewoJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOwoJY29uc3QgaW50IHZyZWZfbXY7Cn07CgovKioKICogc3RydWN0IGx0YzI2MzJfc3RhdGUgLSBkcml2ZXIgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQogKiBAc3BpX2RldjoJCQlwb2ludGVyIHRvIHRoZSBzcGlfZGV2aWNlIHN0cnVjdAogKiBAcG93ZXJkb3duX2NhY2hlX21hc2sJdXNlZCB0byBzaG93IGN1cnJlbnQgY2hhbm5lbCBwb3dlcmRvd24gc3RhdGUKICogQHZyZWZfbXYJCQl1c2VkIHJlZmVyZW5jZSB2b2x0YWdlIChpbnRlcm5hbCBvciBleHRlcm5hbCkKICogQHZyZWZfcmVnCQlyZWd1bGF0b3IgZm9yIHRoZSByZWZlcmVuY2Ugdm9sdGFnZQogKi8Kc3RydWN0IGx0YzI2MzJfc3RhdGUgewoJc3RydWN0IHNwaV9kZXZpY2UgKnNwaV9kZXY7Cgl1bnNpZ25lZCBpbnQgcG93ZXJkb3duX2NhY2hlX21hc2s7CglpbnQgdnJlZl9tdjsKCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZfcmVnOwp9OwoKZW51bSBsdGMyNjMyX3N1cHBvcnRlZF9kZXZpY2VfaWRzIHsKCUlEX0xUQzI2MzJMMTIsCglJRF9MVEMyNjMyTDEwLAoJSURfTFRDMjYzMkw4LAoJSURfTFRDMjYzMkgxMiwKCUlEX0xUQzI2MzJIMTAsCglJRF9MVEMyNjMySDgsCn07CgpzdGF0aWMgaW50IGx0YzI2MzJfc3BpX3dyaXRlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCgkJCSAgICAgdTggY21kLCB1OCBhZGRyLCB1MTYgdmFsLCB1OCBzaGlmdCkKewoJdTMyIGRhdGE7Cgl1OCBtc2dbM107CgoJLyoKCSAqIFRoZSBpbnB1dCBzaGlmdCByZWdpc3RlciBpcyAyNCBiaXRzIHdpZGUuCgkgKiBUaGUgbmV4dCBmb3VyIGFyZSB0aGUgY29tbWFuZCBiaXRzLCBDMyB0byBDMCwKCSAqIGZvbGxvd2VkIGJ5IHRoZSA0LWJpdCBEQUMgYWRkcmVzcywgQTMgdG8gQTAsIGFuZCB0aGVuIHRoZQoJICogMTItLCAxMC0sIDgtYml0IGRhdGEtd29yZC4gVGhlIGRhdGEtd29yZCBjb21wcmlzZXMgdGhlIDEyLSwKCSAqIDEwLSwgOC1iaXQgaW5wdXQgY29kZSBmb2xsb3dlZCBieSA0LCA2LCBvciA4IGRvbid0IGNhcmUgYml0cy4KCSAqLwoJZGF0YSA9IChjbWQgPDwgMjApIHwgKGFkZHIgPDwgMTYpIHwgKHZhbCA8PCBzaGlmdCk7Cgltc2dbMF0gPSBkYXRhID4+IDE2OwoJbXNnWzFdID0gZGF0YSA+PiA4OwoJbXNnWzJdID0gZGF0YTsKCglyZXR1cm4gc3BpX3dyaXRlKHNwaSwgbXNnLCBzaXplb2YobXNnKSk7Cn0KCnN0YXRpYyBpbnQgbHRjMjYzMl9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAoJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCgkJCSAgICBpbnQgKnZhbCwKCQkJICAgIGludCAqdmFsMiwKCQkJICAgIGxvbmcgbSkKewoJc3RydWN0IGx0YzI2MzJfY2hpcF9pbmZvICpjaGlwX2luZm87CgoJY29uc3Qgc3RydWN0IGx0YzI2MzJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICpzcGlfZGV2X2lkID0gc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaV9kZXYpOwoKCWNoaXBfaW5mbyA9IChzdHJ1Y3QgbHRjMjYzMl9jaGlwX2luZm8gKilzcGlfZGV2X2lkLT5kcml2ZXJfZGF0YTsKCglzd2l0Y2ggKG0pIHsKCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKCQkqdmFsID0gc3QtPnZyZWZfbXY7CgkJKnZhbDIgPSBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHM7CgkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOwoJfQoJcmV0dXJuIC1FSU5WQUw7Cn0KCnN0YXRpYyBpbnQgbHRjMjYzMl93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKCQkJICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKCQkJICAgICBpbnQgdmFsLAoJCQkgICAgIGludCB2YWwyLAoJCQkgICAgIGxvbmcgbWFzaykKewoJc3RydWN0IGx0YzI2MzJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKCglzd2l0Y2ggKG1hc2spIHsKCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CgkJaWYgKHZhbCA+PSAoMSA8PCBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpIHx8IHZhbCA8IDApCgkJCXJldHVybiAtRUlOVkFMOwoKCQlyZXR1cm4gbHRjMjYzMl9zcGlfd3JpdGUoc3QtPnNwaV9kZXYsCgkJCQkJIExUQzI2MzJfQ01EX1dSSVRFX0lOUFVUX05fVVBEQVRFX04sCgkJCQkJIGNoYW4tPmFkZHJlc3MsIHZhbCwKCQkJCQkgY2hhbi0+c2Nhbl90eXBlLnNoaWZ0KTsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCnN0YXRpYyBzc2l6ZV90IGx0YzI2MzJfcmVhZF9kYWNfcG93ZXJkb3duKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCgkJCQkJICB1aW50cHRyX3QgcHJpdmF0ZSwKCQkJCQkgIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFuLAoJCQkJCSAgY2hhciAqYnVmKQp7CglzdHJ1Y3QgbHRjMjYzMl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwoKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAoJCSAgICAgICAhIShzdC0+cG93ZXJkb3duX2NhY2hlX21hc2sgJiAoMSA8PCBjaGFuLT5jaGFubmVsKSkpOwp9CgpzdGF0aWMgc3NpemVfdCBsdGMyNjMyX3dyaXRlX2RhY19wb3dlcmRvd24oc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKCQkJCQkgICB1aW50cHRyX3QgcHJpdmF0ZSwKCQkJCQkgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKCQkJCQkgICBjb25zdCBjaGFyICpidWYsCgkJCQkJICAgc2l6ZV90IGxlbikKewoJYm9vbCBwd3JfZG93bjsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjYzMl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwoKCXJldCA9IHN0cnRvYm9vbChidWYsICZwd3JfZG93bik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJaWYgKHB3cl9kb3duKQoJCXN0LT5wb3dlcmRvd25fY2FjaGVfbWFzayB8PSAoMSA8PCBjaGFuLT5jaGFubmVsKTsKCWVsc2UKCQlzdC0+cG93ZXJkb3duX2NhY2hlX21hc2sgJj0gfigxIDw8IGNoYW4tPmNoYW5uZWwpOwoKCXJldCA9IGx0YzI2MzJfc3BpX3dyaXRlKHN0LT5zcGlfZGV2LAoJCQkJTFRDMjYzMl9DTURfUE9XRVJET1dOX0RBQ19OLAoJCQkJY2hhbi0+Y2hhbm5lbCwgMCwgMCk7CgoJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBsdGMyNjMyX2luZm8gPSB7Cgkud3JpdGVfcmF3CT0gbHRjMjYzMl93cml0ZV9yYXcsCgkucmVhZF9yYXcJPSBsdGMyNjMyX3JlYWRfcmF3LAp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjX2V4dF9pbmZvIGx0YzI2MzJfZXh0X2luZm9bXSA9IHsKCXsKCQkubmFtZSA9ICJwb3dlcmRvd24iLAoJCS5yZWFkID0gbHRjMjYzMl9yZWFkX2RhY19wb3dlcmRvd24sCgkJLndyaXRlID0gbHRjMjYzMl93cml0ZV9kYWNfcG93ZXJkb3duLAoJCS5zaGFyZWQgPSBJSU9fU0VQQVJBVEUsCgl9LAoJeyB9LAp9OwoKI2RlZmluZSBMVEMyNjMyX0NIQU5ORUwoX2NoYW4sIF9iaXRzKSB7IFwKCQkudHlwZSA9IElJT19WT0xUQUdFLCBcCgkJLmluZGV4ZWQgPSAxLCBcCgkJLm91dHB1dCA9IDEsIFwKCQkuY2hhbm5lbCA9IChfY2hhbiksIFwKCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAoJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKCQkuYWRkcmVzcyA9IChfY2hhbiksIFwKCQkuc2Nhbl90eXBlID0geyBcCgkJCS5yZWFsYml0cwk9IChfYml0cyksIFwKCQkJLnNoaWZ0CQk9IDE2IC0gKF9iaXRzKSwgXAoJCX0sIFwKCQkuZXh0X2luZm8gPSBsdGMyNjMyX2V4dF9pbmZvLCBcCn0KCiNkZWZpbmUgREVDTEFSRV9MVEMyNjMyX0NIQU5ORUxTKF9uYW1lLCBfYml0cykgXAoJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgX25hbWUgIyMgX2NoYW5uZWxzW10gPSB7IFwKCQlMVEMyNjMyX0NIQU5ORUwoMCwgX2JpdHMpLCBcCgkJTFRDMjYzMl9DSEFOTkVMKDEsIF9iaXRzKSwgXAoJfQoKc3RhdGljIERFQ0xBUkVfTFRDMjYzMl9DSEFOTkVMUyhsdGMyNjMybDEyLCAxMik7CnN0YXRpYyBERUNMQVJFX0xUQzI2MzJfQ0hBTk5FTFMobHRjMjYzMmwxMCwgMTApOwpzdGF0aWMgREVDTEFSRV9MVEMyNjMyX0NIQU5ORUxTKGx0YzI2MzJsOCwgOCk7CgpzdGF0aWMgREVDTEFSRV9MVEMyNjMyX0NIQU5ORUxTKGx0YzI2MzJoMTIsIDEyKTsKc3RhdGljIERFQ0xBUkVfTFRDMjYzMl9DSEFOTkVMUyhsdGMyNjMyaDEwLCAxMCk7CnN0YXRpYyBERUNMQVJFX0xUQzI2MzJfQ0hBTk5FTFMobHRjMjYzMmg4LCA4KTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgbHRjMjYzMl9jaGlwX2luZm8gbHRjMjYzMl9jaGlwX2luZm9fdGJsW10gPSB7CglbSURfTFRDMjYzMkwxMl0gPSB7CgkJLmNoYW5uZWxzCT0gbHRjMjYzMmwxMl9jaGFubmVscywKCQkudnJlZl9tdgk9IDI1MDAsCgl9LAoJW0lEX0xUQzI2MzJMMTBdID0gewoJCS5jaGFubmVscwk9IGx0YzI2MzJsMTBfY2hhbm5lbHMsCgkJLnZyZWZfbXYJPSAyNTAwLAoJfSwKCVtJRF9MVEMyNjMyTDhdID0gIHsKCQkuY2hhbm5lbHMJPSBsdGMyNjMybDhfY2hhbm5lbHMsCgkJLnZyZWZfbXYJPSAyNTAwLAoJfSwKCVtJRF9MVEMyNjMySDEyXSA9IHsKCQkuY2hhbm5lbHMJPSBsdGMyNjMyaDEyX2NoYW5uZWxzLAoJCS52cmVmX212CT0gNDA5NiwKCX0sCglbSURfTFRDMjYzMkgxMF0gPSB7CgkJLmNoYW5uZWxzCT0gbHRjMjYzMmgxMF9jaGFubmVscywKCQkudnJlZl9tdgk9IDQwOTYsCgl9LAoJW0lEX0xUQzI2MzJIOF0gPSAgewoJCS5jaGFubmVscwk9IGx0YzI2MzJoOF9jaGFubmVscywKCQkudnJlZl9tdgk9IDQwOTYsCgl9LAp9OwoKc3RhdGljIGludCBsdGMyNjMyX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCnsKCXN0cnVjdCBsdGMyNjMyX3N0YXRlICpzdDsKCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CglzdHJ1Y3QgbHRjMjYzMl9jaGlwX2luZm8gKmNoaXBfaW5mbzsKCWludCByZXQ7CgoJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOwoJaWYgKCFpbmRpb19kZXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwoKCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CglzdC0+c3BpX2RldiA9IHNwaTsKCgljaGlwX2luZm8gPSAoc3RydWN0IGx0YzI2MzJfY2hpcF9pbmZvICopCgkJCXNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOwoKCXN0LT52cmVmX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbCgmc3BpLT5kZXYsICJ2cmVmIik7CglpZiAoUFRSX0VSUihzdC0+dnJlZl9yZWcpID09IC1FTk9ERVYpIHsKCQkvKiB1c2UgaW50ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KCQlzdC0+dnJlZl9yZWcgPSBOVUxMOwoJCXN0LT52cmVmX212ID0gY2hpcF9pbmZvLT52cmVmX212OwoKCQlyZXQgPSBsdGMyNjMyX3NwaV93cml0ZShzcGksIExUQzI2MzJfQ01EX0lOVEVSTkFMX1JFRkVSLAoJCQkJMCwgMCwgMCk7CgkJaWYgKHJldCkgewoJCQlkZXZfZXJyKCZzcGktPmRldiwKCQkJCSJTZXQgaW50ZXJuYWwgcmVmZXJlbmNlIGNvbW1hbmQgZmFpbGVkLCAlZFxuIiwKCQkJCXJldCk7CgkJCXJldHVybiByZXQ7CgkJfQoJfSBlbHNlIGlmIChJU19FUlIoc3QtPnZyZWZfcmVnKSkgewoJCWRldl9lcnIoJnNwaS0+ZGV2LAoJCQkJIkVycm9yIGdldHRpbmcgdm9sdGFnZSByZWZlcmVuY2UgcmVndWxhdG9yXG4iKTsKCQlyZXR1cm4gUFRSX0VSUihzdC0+dnJlZl9yZWcpOwoJfSBlbHNlIHsKCQkvKiB1c2UgZXh0ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgKi8KCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0LT52cmVmX3JlZyk7CgkJaWYgKHJldCkgewoJCQlkZXZfZXJyKCZzcGktPmRldiwKCQkJCSJlbmFibGUgcmVmZXJlbmNlIHJlZ3VsYXRvciBmYWlsZWQsICVkXG4iLAoJCQkJcmV0KTsKCQkJcmV0dXJuIHJldDsKCQl9CgkJc3QtPnZyZWZfbXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnZyZWZfcmVnKSAvIDEwMDA7CgoJCXJldCA9IGx0YzI2MzJfc3BpX3dyaXRlKHNwaSwgTFRDMjYzMl9DTURfRVhURVJOQUxfUkVGRVIsCgkJCQkwLCAwLCAwKTsKCQlpZiAocmV0KSB7CgkJCWRldl9lcnIoJnNwaS0+ZGV2LAoJCQkJIlNldCBleHRlcm5hbCByZWZlcmVuY2UgY29tbWFuZCBmYWlsZWQsICVkXG4iLAoJCQkJcmV0KTsKCQkJcmV0dXJuIHJldDsKCQl9Cgl9CgoJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwoJaW5kaW9fZGV2LT5uYW1lID0gZGV2X29mX25vZGUoJnNwaS0+ZGV2KSA/IGRldl9vZl9ub2RlKCZzcGktPmRldiktPm5hbWUKCQkJCQkJIDogc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKCWluZGlvX2Rldi0+aW5mbyA9ICZsdGMyNjMyX2luZm87CglpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CglpbmRpb19kZXYtPmNoYW5uZWxzID0gY2hpcF9pbmZvLT5jaGFubmVsczsKCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gTFRDMjYzMl9EQUNfQ0hBTk5FTFM7CgoJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKfQoKc3RhdGljIGludCBsdGMyNjMyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQp7CglzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CglzdHJ1Y3QgbHRjMjYzMl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwoKCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwoKCWlmIChzdC0+dnJlZl9yZWcpCgkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnZyZWZfcmVnKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGx0YzI2MzJfaWRbXSA9IHsKCXsgImx0YzI2MzItbDEyIiwgKGtlcm5lbF91bG9uZ190KSZsdGMyNjMyX2NoaXBfaW5mb190YmxbSURfTFRDMjYzMkwxMl0gfSwKCXsgImx0YzI2MzItbDEwIiwgKGtlcm5lbF91bG9uZ190KSZsdGMyNjMyX2NoaXBfaW5mb190YmxbSURfTFRDMjYzMkwxMF0gfSwKCXsgImx0YzI2MzItbDgiLCAoa2VybmVsX3Vsb25nX3QpJmx0YzI2MzJfY2hpcF9pbmZvX3RibFtJRF9MVEMyNjMyTDhdIH0sCgl7ICJsdGMyNjMyLWgxMiIsIChrZXJuZWxfdWxvbmdfdCkmbHRjMjYzMl9jaGlwX2luZm9fdGJsW0lEX0xUQzI2MzJIMTJdIH0sCgl7ICJsdGMyNjMyLWgxMCIsIChrZXJuZWxfdWxvbmdfdCkmbHRjMjYzMl9jaGlwX2luZm9fdGJsW0lEX0xUQzI2MzJIMTBdIH0sCgl7ICJsdGMyNjMyLWg4IiwgKGtlcm5lbF91bG9uZ190KSZsdGMyNjMyX2NoaXBfaW5mb190YmxbSURfTFRDMjYzMkg4XSB9LAoJe30KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGx0YzI2MzJfaWQpOwoKc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbHRjMjYzMl9vZl9tYXRjaFtdID0gewoJewoJCS5jb21wYXRpYmxlID0gImxsdGMsbHRjMjYzMi1sMTIiLAoJCS5kYXRhID0gJmx0YzI2MzJfY2hpcF9pbmZvX3RibFtJRF9MVEMyNjMyTDEyXQoJfSwgewoJCS5jb21wYXRpYmxlID0gImxsdGMsbHRjMjYzMi1sMTAiLAoJCS5kYXRhID0gJmx0YzI2MzJfY2hpcF9pbmZvX3RibFtJRF9MVEMyNjMyTDEwXQoJfSwgewoJCS5jb21wYXRpYmxlID0gImxsdGMsbHRjMjYzMi1sOCIsCgkJLmRhdGEgPSAmbHRjMjYzMl9jaGlwX2luZm9fdGJsW0lEX0xUQzI2MzJMOF0KCX0sIHsKCQkuY29tcGF0aWJsZSA9ICJsbHRjLGx0YzI2MzItaDEyIiwKCQkuZGF0YSA9ICZsdGMyNjMyX2NoaXBfaW5mb190YmxbSURfTFRDMjYzMkgxMl0KCX0sIHsKCQkuY29tcGF0aWJsZSA9ICJsbHRjLGx0YzI2MzItaDEwIiwKCQkuZGF0YSA9ICZsdGMyNjMyX2NoaXBfaW5mb190YmxbSURfTFRDMjYzMkgxMF0KCX0sIHsKCQkuY29tcGF0aWJsZSA9ICJsbHRjLGx0YzI2MzItaDgiLAoJCS5kYXRhID0gJmx0YzI2MzJfY2hpcF9pbmZvX3RibFtJRF9MVEMyNjMySDhdCgl9LAoJe30KfTsKTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbHRjMjYzMl9vZl9tYXRjaCk7CgpzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbHRjMjYzMl9kcml2ZXIgPSB7CgkuZHJpdmVyCQk9IHsKCQkubmFtZQk9ICJsdGMyNjMyIiwKCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobHRjMjYzMl9vZl9tYXRjaCksCgl9LAoJLnByb2JlCQk9IGx0YzI2MzJfcHJvYmUsCgkucmVtb3ZlCQk9IGx0YzI2MzJfcmVtb3ZlLAoJLmlkX3RhYmxlCT0gbHRjMjYzMl9pZCwKfTsKbW9kdWxlX3NwaV9kcml2ZXIobHRjMjYzMl9kcml2ZXIpOwoKTU9EVUxFX0FVVEhPUigiTWF4aW1lIFJvdXNzaW4tQmVsYW5nZXIgPG1heGltZS5yb3Vzc2luYmVsYW5nZXJAZ21haWwuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkxUQzI2MzIgREFDIFNQSSBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo=