LyoKICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS41NCAyMDA1LzA3LzE5IDE4OjI2OjQ2IG1rcnVma3kgRXhwICQKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKCi8qIGZ3ZCBkZWNsICovCnN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKc3RhdGljIHZvaWQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpOwpzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSk7CnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpOwoKLyogY29uZmlnIHZhcmlhYmxlcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwppbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCiAJeyAweDQwMjAxMGZjLCBCVFRWX0dWQkNUVjNQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjMvUENJIiB9LAoJeyAweDQwNTAxMGZjLCBCVFRWX0dWQkNUVjRQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjQvUENJIiB9LAoJeyAweDQwNzAxMGZjLCBCVFRWX0dWQkNUVjVQQ0ksICAgICJJLU8gRGF0YSBDby4gR1YtQkNUVjUvUENJIiB9LAogCXsgMHhkMDE4MTBmYywgQlRUVl9HVkJDVFY1UENJLCAgICAiSS1PIERhdGEgQ28uIEdWLUJDVFY1L1BDSSIgfSwKCgl7IDB4MDAxMjExYmQsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgkvLyBzb21lIGNhcmRzIHNoaXAgd2l0aCBieXRlc3dhcHBlZCBJRHMgLi4uCgl7IDB4MTIwMGJkMTEsIEJUVFZfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCXsgMHhmZjAwYmQxMSwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViBbYnN3YXBdIiB9LAoJLy8gdGhpcyBzZWVtcyB0byBoYXBwZW4gYXMgd2VsbCAuLi4KCXsgMHhmZjEyMTFiZCwgQlRUVl9QSU5OQUNMRSwgICAgICAiUGlubmFjbGUgUENUViIgfSwKCgl7IDB4MzAwMDEyMWEsIEJUVFZfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgyNjM3MTBiNCwgQlRUVl9WT09ET09UVl9GTSwgICAiM0RmeCBWb29kb29UViBGTS8gVm9vZG9vVFYgMjAwIiB9LAoJeyAweDMwNjAxMjFhLCBCVFRWX1NUQjIsCSAgIjNEZnggVm9vZG9vVFYgMTAwLyBTVEIgT0VNIiB9LAoKCXsgMHgzMDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYzLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNngiIH0sCgl7IDB4YTAwNTE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkNQSDA2WCBUVmlldzk5LUNhcmQiIH0sCgl7IDB4MzAwMjE0NGYsIEJUVFZfTUFHSUNUVklFVzA2MSwgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDV4IiB9LAoJeyAweDMwMDUxNDRmLCBCVFRWX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA2MS8wNkwgKFQxL0xDKSIgfSwKCXsgMHg1MDAwMTQ0ZiwgQlRUVl9NQUdJQ1RWSUVXMDYxLCAiQXNrZXkgQ1BIMDUwIiB9LAoJeyAweDMwMDAxNGZmLCBCVFRWX01BR0lDVFZJRVcwNjEsICJUVmlldyA5OSAoQ1BIMDYxKSIgfSwKCXsgMHgzMDAyMTRmZiwgQlRUVl9QSE9FQkVfVFZNQVMsICAiUGhvZWJlIFRWIE1hc3RlciAoQ1BIMDYwKSIgfSwKCgl7IDB4MDAwMTE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwMjE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJtZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDAwMzE0NjEsIEJUVFZfQVZQSE9ORTk4LCAgICAgIkFWZXJNZWRpYSBUVlBob25lOTgiIH0sCgl7IDB4MDAwNDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiIH0sCgl7IDB4MDMwMDE0NjEsIEJUVFZfQVZFUk1FRElBOTgsICAgIlZET01BVEUgVFYgVFVORVIgQ0FSRCIgfSwKCgl7IDB4MTExNzE1M2IsIEJUVFZfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE4MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgQi9HKSIgfSwKCXsgMHgxMTE5MTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChQaGlsaXBzIFBBTCBJKSIgfSwKCXsgMHgxMTFhMTUzYiwgQlRUVl9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChUZW1pYyBQQUwgSSkiIH0sCgoJeyAweDExMjMxNTNiLCBCVFRWX1RFUlJBVFZSQURJTywgICJUZXJyYXRlYyBUViBSYWRpbysiIH0sCgl7IDB4MTEyNzE1M2IsIEJUVFZfVEVSUkFUViwgICAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMDUpIiAgICB9LAoJLy8gY2xhc2hlcyB3aXRoIEZseVZpZGVvCgkvL3sgMHgxODUyMTg1MiwgQlRUVl9URVJSQVRWLCAgICAgIlRlcnJhdGVjIFRWKyAoVjEuMTApIiAgICB9LAoJeyAweDExMzQxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKExSMTAyKSIgfSwKCXsgMHgxMTM1MTUzYiwgQlRUVl9URVJSQVRWQUxVRVIsICAiVGVycmF0ZWMgVFZhbHVlIFJhZGlvIiB9LCAvLyBMUjEwMgoJeyAweDUwMTgxNTNiLCBCVFRWX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUiIH0sICAgICAgIC8vID8/Cgl7IDB4ZmYzYjE1M2IsIEJUVFZfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLy8gPz8KCgl7IDB4NDAwMDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwYTE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYiIH0sCgl7IDB4NDAwZDE1YjAsIEJUVFZfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDEwMTViMCwgQlRUVl9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoJeyAweDQwMTYxNWIwLCBCVFRWX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgoJeyAweDE0MzBhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0EiIH0sCgl7IDB4MTQzMWFhMDAsIEJUVFZfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQiIgfSwKCXsgMHgxNDMyYWEwMCwgQlRUVl9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNDIiB9LAoJeyAweDE0MzNhYTAwLCBCVFRWX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0QiIH0sCgl7IDB4MTQzM2FhMDMsIEJUVFZfUFYxNDMsICAgICAgICAgIlNlY3VyaXR5IEV5ZXMiIH0sCgoJeyAweDE0NjBhYTAwLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMSIgfSwKCXsgMHgxNDYxYWEwMSwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTIiIH0sCgl7IDB4MTQ2MmFhMDIsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0zIiB9LAoJeyAweDE0NjNhYTAzLCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtNCIgfSwKCgl7IDB4MTQ2NGFhMDQsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0xIiB9LAoJeyAweDE0NjVhYTA1LCBCVFRWX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMiIgfSwKCXsgMHgxNDY2YWEwNiwgQlRUVl9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTMiIH0sCgl7IDB4MTQ2N2FhMDcsIEJUVFZfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi00IiB9LAoKCXsgMHhhMTMyZmYwMCwgQlRUVl9JVkMxMDAsICAgICAgICAiSVZDLTEwMCIgIH0sCgl7IDB4YTE1NTAwMDAsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAxLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMiwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDMsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMTAwLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMSwgQlRUVl9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDIsIEJUVFZfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAzLCBCVFRWX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTgyZmYwMCwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAyLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA1LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDcsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA4LCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOSwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGEsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBiLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYywgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGQsIEJUVFZfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBlLCBCVFRWX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZiwgQlRUVl9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgoJeyAweDQxNDI0MzQ0LCBCVFRWX0dSQU5EVEVDLCAgICAgICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIiB9LAoJeyAweDAxMDIwMzA0LCBCVFRWX1hHVUFSRCwgICAgICAgICJHcmFuZHRlYyBHcmFuZCBYLUd1YXJkIiB9LAoKCXsgMHgxODUwMTg1MSwgQlRUVl9DSFJPTk9TX1ZTMiwgICAiRmx5VmlkZW8gOTggKExSNTApLyBDaHJvbm9zIFZpZGVvIFNodXR0bGUgSUkiIH0sCgl7IDB4YTA1MDE4NTEsIEJUVFZfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweDE4NTExODUxLCBCVFRWX0ZMWVZJREVPOThFWiwgICJGbHlWaWRlbyA5OEVaIChMUjUxKS8gQ3liZXJNYWlsIEFWIiB9LAoJeyAweDE4NTIxODUyLCBCVFRWX1RZUEhPT05fVFZJRVcsICJGbHlWaWRlbyA5OEZNIChMUjUwKS8gVHlwaG9vbiBUVmlldyBUVi9GTSBUdW5lciIgfSwKCXsgMHg0MWEwYTA1MSwgQlRUVl9GTFlWSURFT185OEZNLCAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCBSZXYgUSIgfSwKCXsgMHgxODUwMWY3ZiwgQlRUVl9GTFlWSURFT185OCwgICAiTGlmZXZpZXcgRmx5dmlkZW8gOTgiIH0sCgogICAgCXsgMHgwMTAxMTVjYiwgQlRUVl9HTVYxLCAgICAgICAgICAiQUcgR01WMSIgfSwKCXsgMHgwMTAxMTRjNywgQlRUVl9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCgoJeyAweDEwYjQyNjM2LCBCVFRWX0hBVVBQQVVHRTg3OCwgICJTVEIgPz8/IiB9LAoJeyAweDIxN2Q2NjA2LCBCVFRWX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFdpbkZhc3QgVFYgMjAwMCIgfSwKCXsgMHhmZmY2ZjZmZiwgQlRUVl9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4MDMxMTYwMDAsIEJUVFZfU0VOU09SQVkzMTEsICAgIlNlbnNvcmF5IDMxMSIgfSwKCXsgMHgwMDc5MGUxMSwgQlRUVl9XSU5EVlIsICAgICAgICAiQ2Fub3B1cyBXaW5EVlIgUENJIiB9LAoJeyAweGEwZmNhMWEwLCBCVFRWX1pPTFRSSVgsICAgICAgICJGYWNlIHRvIEZhY2UgVHZtYXgiIH0sCgl7IDB4MjAwMDcwNjMsIEJUVFZfUENfSERUViwgICAgICAgInBjSERUViBIRC0yMDAwIFRWIn0sCgl7IDB4ODJiMmFhNmEsIEJUVFZfU0lNVVNfR1ZDMTEwMCwgIlNJTVVTIEdWQzExMDAiIH0sCgl7IDB4MTQ2Y2FhMGMsIEJUVFZfUFY5NTEsICAgICAgICAgIml0dW5lciBzcGVjdHJhOCIgfSwKIAl7IDB4MjAwYTEyOTUsIEJUVFZfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJLy8gbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJLy97IDB4YTBmY2EwNGYsIEJUVFZfTUFHSUNUVklFVzA2MywgIkd1aWxsZW1vdCBNYXhpIFRWIFZpZGVvIDMiIH0sCgoJLy8gRFZCIGNhcmRzICh1c2luZyBwY2kgZnVuY3Rpb24gLjEgZm9yIG1wZWcgZGF0YSB4ZmVyKQoJeyAweDAxMDEwMDcxLCBCVFRWX05FQlVMQV9ESUdJVFYsICJOZWJ1bGEgRWxlY3Ryb25pY3MgRGlnaVRWIiB9LAoJeyAweDA3NjExNDYxLCBCVFRWX0FWRFZCVF83NjEsICAgICJBdmVyTWVkaWEgQXZlclRWIERWQi1UIDc2MSIgfSwKCXsgMHgwMDFjMTFiZCwgQlRUVl9QSU5OQUNMRVNBVCwgICAiUGlubmFjbGUgUENUViBTYXQiIH0sCgl7IDB4MDAyNjExYmQsIEJUVFZfVFdJTkhBTl9EU1QsICAgIlBpbm5hY2xlIFBDVFYgU0FUIENJIiB9LAoJeyAweDAwMDExODIyLCBCVFRWX1RXSU5IQU5fRFNULCAgICJUd2luaGFuIFZpc2lvblBsdXMgRFZCIiB9LAoJeyAweGZjMDAyNzBmLCBCVFRWX1RXSU5IQU5fRFNULCAgICJDaGFpblRlY2ggZGlnaXRvcCBEU1QtMTAwMCBEVkItUyIgfSwKCXsgMHgwNzcxMTQ2MSwgQlRUVl9BVkRWQlRfNzcxLCAgICAiQVZlcm1lZGlhIEF2ZXJUViBEVkItVCA3NzEiIH0sCgl7IDB4ZGIxMDE4YWMsIEJUVFZfRFZJQ09fRFZCVF9MSVRFLCAgICAiRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CnsKLyogLS0tLSBjYXJkIDB4MDAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIiAqKiogVU5LTk9XTi9HRU5FUklDICoqKiAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyA0LCAwLCAyLCAzLCAxfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5oYXNfcmFkaW8gICAgICA9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDAsCgkudHVuZXJfdHlwZQk9IDQsCn0sewoJLm5hbWUJCT0gIkRpYW1vbmQgRFRWMjAwMCIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmdwaW9tYXNrCT0gMHgwZiwKCS5hdWRpb211eAk9IHsgMHgwYywgMHgwNCwgMHgwOCwgMHgwNCwgMH0sCgkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIk1BVFJJWC1WaXNpb24gTVYtRGVsdGEiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0gezAgfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGMwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHhjMDAsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJJTVMvSVhtaWNybyBUdXJib1RWIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAxLCAyLCAzLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ19QQUwsCn0sewoJLm5hbWUJCT0gIkhhdXBwYXVnZSAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCS5tdXhzZWwJCT0geyAyLCAwLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMSwgMiwgMywgNH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1JUk8gUENUViBwcm8iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MzAxNGYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCi8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIkFWZXJNZWRpYSBUVkNhcHR1cmUgOTgiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gNCwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDE1LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxMywgMTQsIDExLCA3LCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5tc3AzNHh4X2FsdCAgICA9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSBhdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJBaW1zbGFiIFZpZGVvIEhpZ2h3YXkgWHRyZW1lIChWSFgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSA3LAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAxNSwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHswICwgMCwgMSAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBsYXlUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS8vIDIwMDMtMTAtMjAgYnkgIkFudG9uIEEuIEFyYXBvdiIgPGFyYXBvdkBtYWlsLnJ1PgoJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDgzMDBmOCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJLmF1ZGlvbXV4CT0geyAweDRmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwNywweGNmYTAwN30sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLmF1ZGlvX2hvb2sJPSB3aW52aWV3X2F1ZGlvLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLm5hbWUJCT0gIkFWRUMgSW50ZXJjYXB0dXJlIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrCT0gMHg4ZGZmMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAgfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MTQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkNFSSBSYWZmbGVzIENhcmQiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIEx1Y2t5IFN0YXIgSW1hZ2UgV29ybGQgQ29uZmVyZW5jZVRWIExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMiwgIC8vIHR1bmVyLCBsaW5lIGluCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTF9JLAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHhjMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MCwgMSwgMHg4MDAsIDB4NDAwLCAweGMwMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWLCBidDg3OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMywgLTEgfSwKICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkI1X1BBTF9JLAp9LHsKCi8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZTAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweGMwMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWKyBWZXJzaW9uIDEuMCAoQnQ4NDgpLyBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAvIFZvYmlzIFRWLUJvb3N0YXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MWYwZmZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkuYXVkaW9faG9vayAgICAgPSB0ZXJyYXR2X2F1ZGlvLAp9LHsKCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDcsCgkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweDE4MDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDB4ODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19TRUNBTSwKfSx7CgovKiAtLS0tIGNhcmQgMHgxYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgVGVycmFUVisgVmVyc2lvbiAxLjEgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxZjBmZmYsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDB4MDAwMDAsIDB4NDAwMDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5hdWRpb19ob29rCT0gdGVycmF0dl9hdWRpbywKCS8qIEdQSU8gd2lyaW5nOgogICAgICAgICAgICAgICBFeHRlcm5hbCAyMCBwaW4gY29ubmVjdG9yIChmb3IgQWN0aXZlIFJhZGlvIFVwZ3JhZGUgYm9hcmQpCiAgICAgICAgICAgICAgIGdwaW8wMDogaTJjLXNkYQogICAgICAgICAgICAgICBncGlvMDE6IGkyYy1zY2wKICAgICAgICAgICAgICAgZ3BpbzAyOiBvbTU2MTAtZGF0YQogICAgICAgICAgICAgICBncGlvMDM6IG9tNTYxMC1jbGsKICAgICAgICAgICAgICAgZ3BpbzA0OiBvbTU2MTAtd3JlCiAgICAgICAgICAgICAgIGdwaW8wNTogb201NjEwLXN0ZXJlbwogICAgICAgICAgICAgICBncGlvMDY6IHJkczY1ODgtZGF2bgogICAgICAgICAgICAgICBncGlvMDc6IFBpbiA3IG4uYy4KICAgICAgICAgICAgICAgZ3BpbzA4OiBuSU9XCiAgICAgICAgICAgICAgIGdwaW8wOSsxMDogbklPUiwgblNFTCA/PyAoYnQ4NzgpCiAgICAgICAgICAgICAgICBncGlvMDk6IG5JT1IgKGJ0ODQ4KQogICAgICAgICAgICAgICAgZ3BpbzEwOiBuU0VMIChidDg0OCkKICAgICAgICAgICAgICBTb3VuZCBSb3V0aW5nOgogICAgICAgICAgICAgICBncGlvMTY6IHUyLUEwICgxc3QgNDA1MmJ0KQogICAgICAgICAgICAgICBncGlvMTc6IHUyLUExCiAgICAgICAgICAgICAgIGdwaW8xODogdTItbkVOCiAgICAgICAgICAgICAgIGdwaW8xOTogdTQtQTAgKDJuZCA0MDUyKQogICAgICAgICAgICAgICBncGlvMjA6IHU0LUExCiAgICAgICAgICAgICAgICAgICAgICAgdTQtbkVOIC0gR05ECgkgICAgQnRzcHk6CgkgIAkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKCQkxMDAwMCA6IGV4dC4gVmlkZW8gYXVkaW8gaW5wdXQKCQkyMDAwMCA6IFRWIE1vbm8KCQlhMDAwMCA6IFRWIE1vbm8vMgoJICAgICAgIDFhMDAwMCA6IFRWIFN0ZXJlbwoJCTMwMDAwIDogUmFkaW8KCQk0MDAwMCA6IE11dGUKICAgICAgICovCgp9LHsKCS8qIEphbm5payBGcml0c2NoIDxqYW5uaWtAdGVjaGZhay51bmktYmllbGVmZWxkLmRlPiAqLwoJLm5hbWUJCT0gIkltYWdlbmF0aW9uIFBYQzIwMCIsCgkudmlkZW9faW5wdXRzCT0gNSwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IC0xLAoJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4CT0geyAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKCn0sewoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8vMHg4ZGZlMDAKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJGb3JtYWMgaVByb1RWLCBGb3JtYWMgUHJvVFYgSSAoYnQ4NDgpIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDMsCgkuZ3Bpb21hc2sJPSAxLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAwLCAwLCAwLCAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDIwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lCQk9ICJJbnRlbCBDcmVhdGUgYW5kIFNoYXJlIFBDSS8gU21hcnQgVmlkZW8gUmVjb3JkZXIgSUlJIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnR1bmVyX3R5cGUJPSA0LAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAp9LHsKCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgMjAwMC8gV2luRmFzdCAyMDAwIFhQIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8vIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKCS8qIEFsZXhhbmRlciBWYXJha2luIDxhdmFyYWtpbkBob3RtYWlsLmNvbT4gW3N0ZXJlbyB2ZXJzaW9uXSAqLwoJLmdwaW9tYXNrCT0gMHhiMzMwMDAsCgkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKCQlncGlvMjMgLS0gaGVmNDA1MjpuRW5hYmxlICgweDgwMDAwMCkKCQlncGlvMTIgLS0gaGVmNDA1MjpBMQoJICAgICAgICBncGlvMTMgLS0gaGVmNDA1MjpBMAoJICAgIDB4MDAwMDogZXh0ZXJuYWwgYXVkaW8KCSAgICAweDEwMDA6IEZNCgkgICAgMHgyMDAwOiBUVgoJICAgIDB4MzAwMDogbi5jLgogICAgICAgICAgTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPwoJICBOb3RlOiBlZXByb20gb25seSBjb250YWlucyBGRiBhbmQgcGNpIHN1YnN5c3RlbSBpZCAxMDdkOjY2MDYKCSAqLwoJLm5lZWRzX3R2YXVkaW8JPSAwLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKCS50dW5lcl90eXBlCT0gNSwgLy8gZGVmYXVsdCBmb3Igbm93LCBncGlvIHJlYWRzIEJGRkYwNiBmb3IgUGFsIGJnK2RrCgkuYXVkaW9faG9vawk9IHdpbmZhc3QyMDAwX2F1ZGlvLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCAvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxODAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4Rk0gTFI1MCAvIFR5cGhvb24gVFZpZXcgVFYvRk0gVHVuZXIiLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMywKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MTgwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDAsIDAgfSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsVmlldyBQbGF5VFYgcHJvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCS5hdWRpb211eAk9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IC0xLAp9LHsKCS5uYW1lCQk9ICJBc2tleSBDUEgwNlggVFZpZXc5OSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHg1NTFlMDAsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXgJPSB7IDB4NTUxNDAwLCAweDU1MTIwMCwgMCwgMCwgMHg1NTFjMDAsIDB4NTUxMjAwIH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMSwKCS5oYXNfcmVtb3RlICAgICA9IDEsCn0sewoJLm5hbWUJCT0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvL1JhdmUiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAyLCAweGQwMDAxLCAwLCAwLCAxfSwKCS5uZWVkc190dmF1ZGlvCT0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgyOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiU1RCIFRWIFBDSSBGTSwgR2F0ZXdheSBQL04gNjAwMDcwNCAoYnQ4NzgpLCAzRGZ4IFZvb2Rvb1RWIDEwMCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gNywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkubm9fbXNwMzR4eAk9IDEsCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZQaG9uZSA5OCIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSA0LAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7IDEzLCA0LCAxMSwgNywgMCwgMH0sCgkubmVlZHNfdHZhdWRpbwk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCgkuaGFzX3JhZGlvCT0gMSwKCS5hdWRpb19ob29rCT0gYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8sCn0sewoJLm5hbWUJCT0gIlByb1ZpZGVvIFBWOTUxIiwgLyogcGljMTZjNTQgKi8KCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAwLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAxLAp9LHsKCS5uYW1lCQk9ICJMaXR0bGUgT25BaXIgVFYiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZTAwYiwKCS5tdXhzZWwJCT0gezIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0gezB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjfSwKCS5ub19tc3AzNHh4CT0gMSwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoKLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJLnZpZGVvX2lucHV0cwk9IDIsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gLTEsCgkuZ3Bpb21hc2sJPSAzLAoJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MSwgMSwgMCwgMiwgM30sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF9OT05FLAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiTUFUUklYLVZpc2lvbiBNVi1EZWx0YSAyIiwKCS52aWRlb19pbnB1dHMJPSA1LAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gLTEsCgkuc3ZocwkJPSAzLAoJLmdwaW9tYXNrCT0gMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCS5hdWRpb211eAk9IHswIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4YmNmMDNmLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAweGJjODAzZiwgMHhiYzkwM2YsIDB4YmNiMDNmLCAwLCAweGJjYjAzZn0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gMjEsCn0sewoJLm5hbWUJCT0gIlRlcnJhdGVjIFRWL1JhZGlvKyIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHg3MDAwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMCwgMHg0MDAwMCwgMHgyMDAwMCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMzUsCgkudHVuZXJfdHlwZQk9IDEsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgovKiAtLS0tIGNhcmQgMHgzMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZQkJPSAiQXNrZXkgQ1BIMDN4LyBEeW5hbGluayBNYWdpYyBUVmlldyIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMTUsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSAtMSwKfSx7CgkubmFtZQkJPSAiSU9EQVRBIEdWLUJDVFYzL1BDSSIsCgkudmlkZW9faW5wdXRzCT0gMywKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgwMTBmMDAsCgkubXV4c2VsCQk9IHsyLCAzLCAwLCAwfSwKCS5hdWRpb211eAk9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKCS5ub19tc3AzNHh4CT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9BTFBTX1RTSEM2X05UU0MsCgkuYXVkaW9faG9vawk9IGd2YmN0djNwY2lfYXVkaW8sCn0sewoJLm5hbWUJCT0gIlByb2xpbmsgUFYtQlQ4NzhQKzRFIC8gUGl4ZWxWaWV3IFBsYXlUViBQQUsgLyBMZW5jbyBNWFRWLTk1NzggQ1AiLAoJLnZpZGVvX2lucHV0cwk9IDUsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMywKCS5ncGlvbWFzawk9IDB4QUEwMDAwLAoJLm11eHNlbAkJPSB7IDIsMywxLDEsLTEgfSwKCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDAsIDB4ODAwMDAsIDB4ODAwMDAsIDB4YTgwMDAsIDB4NDYwMDAgIH0sCgkubm9fbXNwMzR4eAk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCS5oYXNfcmVtb3RlCT0gMSwKCS8qIEdQSU8gd2lyaW5nOiAoZGlmZmVyZW50IGZyb20gUmV2LjRDICEpCgkJR1BJTzE3OiBVNC5BMCAoZmlyc3QgaGVmNDA1MmJ0KQoJCUdQSU8xOTogVTQuQTEKCQlHUElPMjA6IFU1LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCUdQSU8yMTogVTQubkVOCgkJR1BJTzIyOiBCVDgzMiBSZXNldCBMaW5lCgkJR1BJTzIzOiBBNSxBMCwgVTUsbkVOCgkgICBOb3RlOiBBdCBpMmM9MHg4YSBpcyBhIEJ0ODMyIGNoaXAsIHdoaWNoIGNoYW5nZXMgdG8gMHg4OCBhZnRlciBiZWluZyByZXNldCB2aWEgR1BJTzIyCgkgKi8KfSx7CgkubmFtZSAgICAgICAgICAgPSAiRWFnbGUgV2lyZWxlc3MgQ2Fwcmljb3JuMiAoYnQ4NzhBKSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gNywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEgLyogVFVORVJfQUxQU19UTURIMl9OVFNDICovLAp9LHsKCi8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIERhdmlkIEjkcmRlbWFuIDxkYXZpZEAyZ2VuLmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4CT0geyAxLCAweGQwMDAxLCAwLCAwLCAxMH0sCgkJCS8qIHNvdW5kIHBhdGggKDUgc291cmNlcyk6CgkJCSAgIE1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKCQkJCTA9IGV4dC4gQXVkaW8gSU4KCQkJCTE9IGZyb20gTVVYMgoJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCgkJCQkzPSBub3QgY29ubmVjdGVkCgkJCSAgIE1VWDIgKG1hc2sgMHgzMDAwMCk6CgkJCQkwLDIsMz0gZnJvbSBNU1AzNHh4CgkJCQkxPSBGTSBzdGVyZW8gUmFkaW8gZnJvbSBUdW5lciAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCgkgICBTdmVuIEdyb3Roa2xhZ3MgPHN2ZW5AdXBiLmRlPiAqLwoJLm5hbWUJCT0gIlR5cGhvb24gVFZpZXcgUkRTICsgRk0gU3RlcmVvIC8gS05DMSBUViBTdGF0aW9uIFJEUyIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAzLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgxYywKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJLm5lZWRzX3R2YXVkaW8JPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJLmhhc19yYWRpbwk9IDEsCn0sewoJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCSAgIGluIGRlLmNvbXAub3MudW5peC5saW51eC5oYXJkd2FyZToKCQlvcHRpb25zIGJ0dHYgY2FyZD0wIHBsbD0xIHJhZGlvPTEgZ3Bpb21hc2s9MHgxOGUwCgkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCW9wdGlvbnMgdHVuZXIgdHlwZT01ICovCgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gMjAwMCAvRmx5VmlkZW8gQTIvIExpZmV0ZWMgTFQgOTQxNSBUViBbTFI5MF0iLAoJLnZpZGVvX2lucHV0cwk9IDQsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAoJCSAgICAgICAvKiBGb3IgY2FyZHMgd2l0aCB0ZGE5ODIwL3RkYTk4MjE6CgkJCSAgMHgwMDAwOiBUdW5lciBub3JtYWwgc3RlcmVvCgkJCSAgMHgwMDgwOiBUdW5lciBBMiBTQVAgKHNlY29uZCBhdWRpbyBwcm9ncmFtID0gWndlaWthbmFsdG9uKQoJCQkgIDB4MDg4MDogVHVuZXIgQTIgc3RlcmVvICovCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gLTEsCn0sewoJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KCSAgIG9sZCBFYXN5IFRWIEJUODQ4IHZlcnNpb24gKG1vZGVsIENQSDAzMSkgKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwMzEvIEJFU1RCVVkgRWFzeSBUViIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDM4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEdvcmRvbiBIZXlkb24gPGdqaGV5ZG9uQGJpZ2Zvb3QuY29tICgnOTgpICovCgkubmFtZSAgICAgICAgICAgPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThGTSBMUjUwIiwKCS52aWRlb19pbnB1dHMgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgPSAzLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDE4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gNSwKfSx7CgkvKiBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBjaGVhcG8gY2FwdHVyZSBjYXJkCgkgKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQoJICogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkdyYW5kVGVjICdHcmFuZCBWaWRlbyBDYXB0dXJlJyAoQnQ4NDgpIiwKCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKICAgICAgICAvKiBEYW5pZWwgSGVycmluZ3RvbiA8ZGFuaWVsLmhlcnJpbmd0b25AaG9tZS5jb20+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MC8gUGhvZWJlIFRWIE1hc3RlciBPbmx5IChObyBGTSkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHhlMDAsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDB4NDAwLCAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDgwMCwgMHg0MDAgfSwKICAgICAgICAubmVlZHNfdHZhdWRpbyAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ180MDM2Rlk1X05UU0MsCn0sewoJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwoJLm5hbWUJCT0gIkFza2V5IENQSDAzeCBUViBDYXB0dXJlciIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDB4MDMwMDBGLAoJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IDAsCn0sewoKLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogUGhpbGlwIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPiAqLwoJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDIsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMTEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAxLCA4fSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8zNSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCn0sewoJLyogQWRyaWFuIENveCA8YWRyaWFuQGh1bWJvbGR0LmNvLnVrICovCgkubmFtZQkgICAgICAgID0gIkFHIEVsZWN0cm9uaWNzIEdNVjEiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIJICAgICAgICA9IC0xLAoJLnN2aHMJICAgICAgICA9IDEsCgkuZ3Bpb21hc2sgICAgICAgPSAweEYsCgkubXV4c2VsCSAgICAgICAgPSB7IDIsIDJ9LAoJLmF1ZGlvbXV4ICAgICAgID0geyB9LAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsCSAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgkvKiBNaWd1ZWwgQW5nZWwgQWx2YXJleiA8bWFhY3J1ekBuYXZlZ2FsaWEuY29tPgoJICAgbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJICAgc3BlY2lhbCB0aGFua3MgdG8gSW5mb3JtYXRpY2EgTWllcmVzIGZvciBwcm92aWRpbmcgdGhlIGNhcmQgKi8KCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjEvIEJFU1RCVVkgRWFzeSBUViAoYnQ4NzgpIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMiwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHhGRiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDEsIDAsIDQsIDQsIDl9LAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKfSx7CgkvKiBMdWthcyBHZWJhdWVyIDxnZWJ5QHZvbG55LmN6PiAqLwoJLm5hbWUJCT0gIkFUSSBUVi1Xb25kZXIiLAoJLnZpZGVvX2lucHV0cwk9IDMsCgkuYXVkaW9faW5wdXRzCT0gMSwKCS50dW5lcgkJPSAwLAoJLnN2aHMJCT0gMiwKCS5ncGlvbWFzawk9IDB4ZjAzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkuYXVkaW9tdXgJPSB7IDB4YmZmZSwgMCwgMHhiZmZmLCAwLCAweGJmZmV9LAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAp9LHsKCi8qIC0tLS0gY2FyZCAweDQwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkudmlkZW9faW5wdXRzCT0gMiwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDEsCgkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCgkuYXVkaW9tdXgJPSB7IDAsIDAsIDEsIDAsIDB9LAoJLm5vX21zcDM0eHgJPSAxLAoJLnBsbAkJPSBQTExfMjgsCgkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAp9LHsKCS8qIERlZUpheSA8ZGVlamF5QHdlc3RlbDkwMC5uZXQgKDIwMDBTKSAqLwoJLm5hbWUgICAgICAgICAgID0gIkxpZmV2aWV3IEZseVZpZGVvIDIwMDBTIExSOTAiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDMsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzawk9IDB4MThlMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAwLCAxfSwKCQkJLyogUmFkaW8gY2hhbmdlZCBmcm9tIDFlODAgdG8gMHg4MDAgdG8gbWFrZQoJCQkgICBGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJLyogLWRrLT8/Pzogc2V0IG11dGU9MHgxODAwIGZvciB0ZGE5ODc0aCBkYXVnaHRlcmJvYXJkICovCgkuYXVkaW9tdXgJPSB7IDB4MDAwMCwweDA4MDAsMHgxMDAwLDB4MTAwMCwweDE4MDAsIDB4MTA4MCB9LAoJLmF1ZGlvX2hvb2sJPSBmdjIwMDBzX2F1ZGlvLAoJLm5vX21zcDM0eHgJPSAxLAoJLm5vX3RkYTk4NzUJPSAxLAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDUsCn0sewoJLm5hbWUJCT0gIlRlcnJhdGVjIFRWYWx1ZVJhZGlvIiwKCS52aWRlb19pbnB1dHMJPSAzLAoJLmF1ZGlvX2lucHV0cwk9IDEsCgkudHVuZXIJCT0gMCwKCS5zdmhzCQk9IDIsCgkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCS5hdWRpb211eAk9IHsgMHg1MDAsIDB4NTAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCS5uZWVkc190dmF1ZGlvCT0gMSwKCS5wbGwJCT0gUExMXzI4LAoJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5oYXNfcmFkaW8JPSAxLAp9LHsKCS8qIFRBTkFLQSBLZWkgPHBlZzAwNjI1QG5pZnR5LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJT0RBVEEgR1YtQkNUVjQvUENJIiwKCS52aWRlb19pbnB1dHMgICA9IDMsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAxMGYwMCwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDEwMDAwLCAwLCAweDEwMDAwLCAwLCAwLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9TSEFSUF8yVTVKRjU1NDBfTlRTQywKCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCn0sewoKLyogLS0tLSBjYXJkIDB4NDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICIzRGZ4IFZvb2Rvb1RWIEZNIChFdXJvKSwgVm9vZG9vVFYgMjAwIChVU0EpIiwKCS8vIHRyeSAiaW5zbW9kIG1zcDM0MDAgc2ltcGxlPTAiIGlmIHlvdSBoYXZlCgkvLyBzb3VuZCBwcm9ibGVtcyB3aXRoIHRoaXMgY2FyZC4KICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDRmOGEwMCwKCS8vIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCgkvLyAweDAxMDAwMDogQ29ubmVjdGVkIHRvICJTMCIgb24gdGRhOTg4MCAoMD1QYWwvQkcsIDE9TlRTQykKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCgkvLyB0dnR1bmVyLCByYWRpbywgICBleHRlcm5hbCxpbnRlcm5hbCwgbXV0ZSwgIHN0ZXJlbwoJLyogdHVuZXIsIENvbXBvc2l0LCBTVmlkLCBDb21wb3NpdC1vbi1TdmlkLWFkYXB0ZXIqLwogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMyAsMCAsMX0sCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAoJLnBsbAkJPSBQTExfMjgsCgkuaGFzX3JhZGlvCT0gMSwKfSx7CgkvKiBQaGlsaXAgQmx1bmRlbGwgPHBiQG5leHVzLmNvLnVrPiAqLwoJLm5hbWUgICAgICAgICAgID0gIkFjdGl2ZSBJbWFnaW5nIEFJTU1TIiwKCS52aWRlb19pbnB1dHMgICA9IDEsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAoJLmdwaW9tYXNrICAgICAgID0gMAp9LHsKICAgICAgICAvKiBUb21hc3ogUHlyYSA8aGVsbGZpcmVAc2VkZXouaXEucGw+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi40Qyw4RSkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDMsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gNCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMTUsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDExLCA3LCAxMywgMH0sIC8vIFRWIGFuZCBSYWRpbyB3aXRoIHNhbWUgR1BJTyAhCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMjUsCgkuaGFzX3JlbW90ZSAgICAgPSAxLAoJLyogR1BJTyB3aXJpbmc6CgkJR1BJTzA6IFU0LkEwIChoZWY0MDUyYnQpCgkJR1BJTzE6IFU0LkExCgkJR1BJTzI6IFU0LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCUdQSU8zOiBVNC5uRU4sIFU1LkEwLCBBNS5uRU4KCQlHUElPOC0xNTogdnJkODY2YiA/CgkgKi8KfSx7CgkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOThFWiAoY2FwdHVyZSBvbmx5KSBMUjUxIiwKCS52aWRlb19pbnB1dHMJPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lcgkJPSAtMSwKCS5zdmhzCQk9IDIsCgkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8vIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUwoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4NDggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLyogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4gKi8KCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArOUIgKFBsYXlUViBQcm8gcmV2LjlCIEZNK05JQ0FNKSIsCgkudmlkZW9faW5wdXRzCT0gNCwKCS5hdWRpb19pbnB1dHMJPSAxLAoJLnR1bmVyCQk9IDAsCgkuc3ZocwkJPSAyLAoJLmdwaW9tYXNrCT0gMHgzZiwKCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxIH0sCgkuYXVkaW9tdXgJPSB7IDB4MDEsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDksIDB4MDIgfSwKCS5uZWVkc190dmF1ZGlvICA9IDEsCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkucGxsCQk9IFBMTF8yOCwKCS50dW5lcl90eXBlCT0gNSwKCS5hdWRpb19ob29rCT0gcHZidDg3OHA5Yl9hdWRpbywgLy8gTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHN0ZXJlbwoJLmhhc19yYWRpbwk9IDEsICAvLyBOb3RlOiBub3QgYWxsIGNhcmRzIGhhdmUgcmFkaW8KCS5oYXNfcmVtb3RlICAgICA9IDEsCgkvKiBHUElPIHdpcmluZzoKCQlHUElPMDogQTAgaGVmNDA1MgoJCUdQSU8xOiBBMSBoZWY0MDUyCgkJR1BJTzM6IG5FTiBoZWY0MDUyCgkJR1BJTzgtMTU6IHZyZDg2NmIKCQlHUElPMjAsMjIsMjM6IFIzMCxSMjksUjI4CgkgKi8KfSx7CgkvKiBDbGF5IEt1bnogPGNrdW56QG1haWwuYXJjLm5hc2EuZ292PiAqLwoJLyogeW91IG11c3QganVtcGVyIEpQNSBmb3IgdGhlIGNhcmQgdG8gd29yayAqLwoJLm5hbWUgICAgICAgICAgID0gIlNlbnNvcmF5IDMxMSIsCgkudmlkZW9faW5wdXRzICAgPSA1LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gNCwKCS5ncGlvbWFzayAgICAgICA9IDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJLm5hbWUgICAgICAgICAgID0gIlJlbW90ZVZpc2lvbiBNWCAoUlY2MDUpIiwKCS52aWRlb19pbnB1dHMgICA9IDE2LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwN2ZmLAoJLm11eHNlbCAgICAgICAgID0geyAweDMzLCAweDEzLCAweDIzLCAweDQzLCAweGYzLCAweDczLCAweGUzLCAweDAzLAoJCQkgIDB4ZDMsIDB4YjMsIDB4YzMsIDB4NjMsIDB4OTMsIDB4NTMsIDB4ODMsIDB4YTMgfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkubXV4c2VsX2hvb2sgICAgPSBydjYwNV9tdXhzZWwsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAyLAoJLnR1bmVyCQk9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDFDODAwRiwgIC8vIEJpdDAtMjogQXVkaW8gc2VsZWN0LCA4LTEyOnJlbW90ZSBjb250cm9sIDE0OnJlbW90ZSB2YWxpZCAxNTpyZW1vdGUgcmVzZXQKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEsIH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAxLCAyLCAyLCA0IH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5wbGwJCT0gUExMXzI4LAoJLmhhc19yYWRpbwk9IDEsCn0sewoKLyogLS0tLSBjYXJkIDB4NGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qIE1hc2FraSBTdXp1a2kgPG1hc2FraUBidHJlZS5vcmc+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkNhbm9wdXMgV2luRFZSIFBDSSAoQ09NUEFRIFByZXNhcmlvIDM1MjRKUCwgNTExMkpQKSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDE0MDAwNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDQsIDAgfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCiAgICAgICAgLmF1ZGlvX2hvb2sgICAgID0gd2luZHZyX2F1ZGlvLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSBDYXJkIChCdDg3OCkiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDMsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5ncGlvbWFzayAgICAgICA9IDcsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLy8gVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IKICAgICAgICAuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvLyBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkgIC8vIFRoaXMgY2FyZCBsYWNrcyBleHRlcm5hbCBBdWRpbyBJbiwgc28gd2UgbXV0ZSBpdCBvbiBFeHQuICYgSW50LgoJCQkJCSAgLy8gVGhlIFBDQiBjYW4gdGFrZSBhIHNieDE2Mzcvc2J4MTY3Mywgd2lyaW5nIHVua25vd24uCgkJCQkJICAvLyBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkgIC8vIGF1ZGlvbXV4PTE6IGxvd2VyIHZvbHVtZSwgMiszOiBtdXRlCgkJCQkJICAvLyBidHdpbmNhcCB1c2VzIDB4ODAwMDAvMHg4MDAwMwogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwgLy8gU2Ftc3VuZyBUQ1BBOTA5NVBDMjdBIChCRytESyksIHBoaWxpcHMgY29tcGF0aWJsZSwgdy9GTSwgc3RlcmVvIGFuZAoJCQkgICAvLyByYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuCgkuaGFzX3JhZGlvCQk9IDEsCgkvKiBHUElPIEluZm86CgkJR1BJTzAsMTogICBIRUY0MDUyIEEwLEExCgkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKCQlHUElPMy03OiAgIG4uYy4KCQlHUElPOC0xMzogIElSREMzNTcgZGF0YTAtNSAoZGF0YTYgbi5jLiA/KSBbY2hpcCBub3QgcHJlc2VudCBvbiBteSBjYXJkXQoJCUdQSU8xNCwxNTogPz8KCQlHUElPMTYtMjE6IG4uYy4KCQlHUElPMjIsMjM6ID8/CgkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwp9LHsKICAgICAgICAvKiBBcnRodXIgVGV0emxhZmYtRGVhcywgRFNQIERlc2lnbiBMdGQgPHNvZnR3YXJlQGRzcGRlc2lnbi5jb20+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CgogICAgICAgIC8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgUFZSIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gMCwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMCwgMSwgMX0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCgoJLmdwaW9tYXNrICAgICAgID0gNywKCS5hdWRpb211eCAgICAgICA9IHs3fSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY1L1BDSSIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgwZjBmODAsCgkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkuYXVkaW9tdXggICAgICAgPSB7MHgwMzAwMDAsIDB4MDEwMDAwLCAwLCAwLCAweDAyMDAwMCwgMH0sCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCgkuYXVkaW9faG9vayAgICAgPSBndmJjdHY1cGNpX2F1ZGlvLAoJLmhhc19yYWRpbyAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg3OCkiLCAvKiAweDEoMnwzKS00NUM2LUMxICovCgkudmlkZW9faW5wdXRzICAgPSA0LCAgICAgICAgICAgICAgICAgIC8qIGlkLWlucHV0cy1jbG9jayAqLwoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMywKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMiwgMCwgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDAvMTUwICg4NDgpIiwgLyogMHgwNC01NEMwLUMxICYgb2xkZXIgYm9hcmRzICovCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxICg4NDgpIiwgLyogMHgwNS00MEMwLUMxICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIiwgICAgICAgLyogMHgxKDR8NSktMDAwNC1DNCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMSwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMS8xNTEgdy8gc3ZpZCIsICAvKiAweCgxNnwxN3wyMCktMDBDNC1DMSAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDAsIDEgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjAwLzIwMS8yNTAvMjUxIiwgIC8qIDB4MSg4fDl8RXxGKS0wMDA0LUM0ICovCgkudmlkZW9faW5wdXRzICAgPSAxLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMC8yNTAiLCAgIC8qIDB4MShBfEIpLTAwQzQtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KCS52aWRlb19pbnB1dHMgICA9IDIsCgkuYXVkaW9faW5wdXRzICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDUwMCIsICAgLyogNTAwICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCn0sewogICAgICAgLm5hbWUgICAgICAgICAgID0gIk9zcHJleSA1NDAiLCAgIC8qIDU0MCAqLwogICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMDAiLCAgLyogMjAwMCAqLwoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDEsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5ub19tc3AzNHh4ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTk4NzUgICAgID0gMSwKICAgICAgICAubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwp9LHsKCS8qIE0gRyBCZXJiZXJpY2ggPGJlcmJlcmljQGZvcndpc3MudW5pLXBhc3NhdS5kZT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAwLCAxLCAyLCAzIH0sCgkubXV4c2VsX2hvb2sgICAgPSBlYWdsZV9tdXhzZWwsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAxLAoJLnR1bmVyICAgICAgICAgID0gLTEsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5ncGlvbWFzayAgICAgICA9IDB4MDEsCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDEgfSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMywKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAyLAoJLy8gVFYsIENvbXAxLCBDb21wb3NpdGUgb3ZlciBTVklEIGNvbiwgU1ZJRAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAyLCAyLCAwLCAwLCAwIH0sCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLmhhc19yYWRpbyAgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKICAgICAgLyogc291bmQgcm91dGluZzoKICAgICAgICAgICBHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQogICAgICAgICAgICAgIDB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCiAgICAgICAgIFRoZSBjYXJkIGhhcyBvbmJvYXJkIGF1ZGlvIGNvbm5lY3RvcnMgbGFiZWxlZCAiY2Ryb20iIGFuZCAiYm9hcmQiLAoJIG5vdCBzb2xkZXJlZCBoZXJlLCB0aG91Z2ggdW5rbm93biB3aXJpbmcuCiAgICAgICAgIENhcmQgbGFja3M6IGV4dGVybmFsIGF1ZGlvIGluLCBwY2kgc3Vic3lzdGVtIGlkLgogICAgICAgKi8KfSx7CgoJLyogLS0tLSBjYXJkIDB4NjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk1hY2hUViIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMywKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNH0sCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA1LAoJLnBsbCAgICAgICAgICAgID0gMSwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IDIsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxfSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBMdWMgVmFuIEhvZXlsYW5kdCA8bHVjQGUtbWFnaWMuYmU+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNTAiLCAvKiAweDRmICovCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gLTEsCgkuZ3Bpb21hc2sgICAgICAgPSAwLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+ICovCgkvKiBUaGlzIGNhcmQgbGFja3Mgc3Vic3lzdGVtIElEICovCgkubmFtZSAgICAgICAgICAgPSAiQUQtVFZLNTAzIiwgLyogMHg2MyAqLwoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAxZTgwMDcsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDAgfSwKCS8qICAgICAgICAgICAgICAgICAgVHVuZXIsIFJhZGlvLCBleHRlcm5hbCwgaW50ZXJuYWwsIG9mZiwgIG9uICovCgkuYXVkaW9tdXggICAgICAgPSB7IDB4MDgsICAweDBmLCAgMHgwYSwgICAgIDB4MDgsICAgICAweDBmLCAweDA4IH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IDIsCgkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg2NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkhlcmN1bGVzIFNtYXJ0IFRWIFN0ZXJlbyIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNSwKCS8qIE5vdGVzOgoJICAgLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJICAgLSBzdGVyZW8gdmFyaWFudCB3LyBkYXVnaHRlciBib2FyZCB3aXRoIHRkYTk4NzRhIEAweGIwCgkgICAtIEF1ZGlvIFJvdXRpbmc6CgkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCWV4dGVybmFsIGxpbmUgaW46IHVua25vd24KCSAgIC0gT3RoZXIgY2hpcHM6IGVtNzhwMTU2ZWxwIEAgMHg5NiAocHJvYmFibHkgSVIgcmVtb3RlIGNvbnRyb2wpCgkgICAgICAgICAgICAgIGhlZjQwNTMgKGluc3RlYWQgNDA1MikgZm9yIHVua25vd24gZnVuY3Rpb24KCSovCn0sewogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQYWNlIFRWICYgUmFkaW8gQ2FyZCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LCAvLyBUdW5lciwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMCwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMSwKICAgICAgICAuaGFzX3JhZGlvICAgICAgPSAxLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKICAgICAgICAvKiBCdDg3OCwgQnQ4MzIsIEZJMTI0NiB0dW5lcjsgbm8gcGNpIHN1YnN5c3RlbSBpZAogICAgICAgICAgIG9ubHkgaW50ZXJuYWwgbGluZSBvdXQ6ICg0cGluIGhlYWRlcikgUkdHTAogICAgICAgICAgIFJhZGlvIG11c3QgYmUgZGVjb2RlZCBieSBtc3AzNDEwZCAobm90IHJvdXRlZCB0aHJvdWdoKSovCiAgICAgICAgLy8gICAgICAgICAuZGlnaXRhbF9tb2RlICAgPSBESUdJVEFMX01PREVfQ0FNRVJBLCAvLyB0b2RvIQp9LHsKICAgICAgICAvKiBDaHJpcyBXaWxsaW5nIDxjaHJpc0B2aXNsYWIudXN5ZC5lZHUuYXU+ICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0yMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDEsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkubmFtZSAgICAgICAgICAgPSAiR3JhbmQgWC1HdWFyZCAvIFRydXN0IDgxNFBDSSIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAwLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IC0xLAoJLnR1bmVyX3R5cGUgICAgID0gNCwKICAgICAgICAuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJLm11eHNlbCAgICAgICAgID0geyAyLDIsMiwyLCAzLDMsMywzLCAxLDEsMSwxLCAwLDAsMCwwIH0sCgkubXV4c2VsX2hvb2sgICAgPSB4Z3VhcmRfbXV4c2VsLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgoJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAoJLnZpZGVvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAoJLmhhc19kdmIgICAgICAgID0gMSwKCS5ub19ncGlvaXJxICAgICA9IDEsCn0sewoJLyogSm9yZ2UgQm9uY29tcHRlIC0gRFRJMiA8am9yZ2VAZHRpMi5uZXQ+ICovCgkubmFtZSAgICAgICAgICAgPSAiUHJvVmlkZW8gUFYxNDMiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAwLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5hdWRpb211eCAgICAgICA9IHsgMCB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDAsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogTS5LbGFockBwaHl0ZWMuZGUgKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5LVgxIE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnN2aHMgICAgICAgICAgID0gMywKCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkubmVlZHNfdHZhdWRpbyAgPSAxLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoKCS8qIC0tLS0gY2FyZCAweDZjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IE1pbmlESU4gKGJ0ODc4KSIsCgkudmlkZW9faW5wdXRzICAgPSAxMCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLyogY2FyZCBoYXMgbm8gdHVuZXIgKi8KCS5zdmhzICAgICAgICAgICA9IDksCgkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJLmdwaW9tYXNrMiAgICAgID0gMHgwMywgLyogZ3Bpb21hc2syIGRlZmluZXMgdGhlIGJpdHMgdXNlZCB0byBzd2l0Y2ggYXVkaW8KCQkJCSAgIHZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCSAgIHh0ZXJuYWwgdmlkZW8tbXV4ICovCgkubXV4c2VsICAgICAgICAgPSB7IDB4MDIsIDB4MTIsIDB4MjIsIDB4MzIsIDB4MDMsIDB4MTMsIDB4MjMsIDB4MzMsIDB4MDEsIDB4MDAgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICA9IC0xLAp9LHsKCS5uYW1lICAgICAgICAgICA9ICJQSFlURUMgVkQtMDA5IENvbWJpIChidDg3OCkiLAoJLnZpZGVvX2lucHV0cyAgID0gMTAsCgkuYXVkaW9faW5wdXRzICAgPSAwLAoJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkuc3ZocyAgICAgICAgICAgPSA5LAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5ncGlvbWFzazIgICAgICA9IDB4MDMsIC8qIGdwaW9tYXNrMiBkZWZpbmVzIHRoZSBiaXRzIHVzZWQgdG8gc3dpdGNoIGF1ZGlvCgkJCQkgICB2aWEgdGhlIHVwcGVyIG5pYmJsZSBvZiBtdXhzZWwuIGhlcmU6IHVzZWQgZm9yCgkJCQkgICB4dGVybmFsIHZpZGVvLW11eCAqLwoJLm11eHNlbCAgICAgICAgID0geyAweDAyLCAweDEyLCAweDIyLCAweDMyLCAweDAzLCAweDEzLCAweDIzLCAweDMzLCAweDAxLCAweDAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5uZWVkc190dmF1ZGlvICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKfSx7CiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweGRmLAogICAgICAgIC5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKfSx7CgkvKiBJVkMtMTIwRyAtIEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTIwRyIsCgkudmlkZW9faW5wdXRzICAgPSAxNiwKCS5hdWRpb19pbnB1dHMgICA9IDAsICAgIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyBzdmhzICovCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKCQkJICAgIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MTAgfSwKCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDcwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS5uYW1lICAgICAgICAgICA9ICJwY0hEVFYgSEQtMjAwMCBUViIsCgkudmlkZW9faW5wdXRzICAgPSA0LAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfQVRTQywKCS5oYXNfZHZiICAgICAgICA9IDEsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlR3aW5oYW4gRFNUICsgY2xvbmVzIiwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKCS5ub192aWRlbyAgICAgICA9IDEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAp9LHsKICAgICAgICAubmFtZSAgICAgICAgICAgPSAiV2luZmFzdCBWQzEwMCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMCwKCS5zdmhzICAgICAgICAgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAtMSwgLy8gbm8gdHVuZXIKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMSwgM30sIC8vIFZpZCBJbiwgU1ZpZCBJbiwgVmlkIG92ZXIgU1ZpZCBpbiBjb25uZWN0b3IKICAgICAgICAubm9fbXNwMzR4eCAgICAgPSAxLAogICAgICAgIC5ub190ZGE5ODc1ICAgICA9IDEsCiAgICAgICAgLm5vX3RkYTc0MzIgICAgID0gMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoJLm5hbWUgICAgICAgICAgID0gIlRlcHBybyBURVYtNTYwL0ludGVyVmlzaW9uIElWLTU2MCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMywKCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkuYXVkaW9tdXggICAgICAgPSB7IDEsIDEsIDEsIDEsIDB9LAoJLm5lZWRzX3R2YXVkaW8gID0gMSwKCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAp9LHsKCgkvKiAtLS0tIGNhcmQgMHg3NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNJTVVTIEdWQzExMDAiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMCwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAtMSwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAtMSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAyLCAyLCAyfSwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDNGLAoJLm11eHNlbF9ob29rICAgID0gZ3ZjMTEwMF9tdXhzZWwsCn0sewogICAgICAgIC8qIENhcmxvcyBTaWx2YSByM3Bla0ByM3Blay5ob21lbGludXgub3JnIHx8IGNhcmQgMHg3NSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJOR1MgTkdTVFYrIiwKICAgICAgICAudmlkZW9faW5wdXRzICAgPSAzLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7MiwgMywgMCwgMH0sCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0gezAsIDAsIDAsIDAsIDB4MDAwMDAzLCAwfSwKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCiAgICAgICAgLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CiAgICAgICAgLyogaHR0cDovL2xpbnV4bWVkaWFsYWJzLmNvbSAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJMTUxCVDQiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLwogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDAsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gLTEsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLm5lZWRzX3R2YXVkaW8gID0gMCwKfSx7CgkvKiBIZWxtcm9vcyBIYXJyaSA8aGFycmkuaGVsbXJvb3NAcHAuaW5ldC5maT4gKi8KCS5uYW1lICAgICAgICAgICA9ICJUZWtyYW0gTTIwNSBQUk8iLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLm5lZWRzX3R2YXVkaW8gID0gMCwKCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAweDY4LCAweDY4LCAweDYxLCAweDYxLCAweDAwIH0sCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCn0sewoKCS8qIC0tLS0gY2FyZCAweDc4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIEphdmllciBDZW5kYW4gQXJlcyA8amNlbmRhbkBseWNvcy5lcz4gKi8KCS8qIGJ0ODc4IFRWICsgRk0gd2l0aG91dCBzdWJzeXN0ZW0gSUQgKi8KCS5uYW1lICAgICAgICAgICA9ICJDb25jZXB0cm9uaWMgQ09OVFZGTWkiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDMgfSwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCS5oYXNfcmVtb3RlICAgICA9IDEsCgkuaGFzX3JhZGlvICAgICAgPSAxLAp9LHsKCS8qRXJpYyBERUJJRUYgPGRlYmllZkB0ZWxlbXNhLmNvbT4qLwoJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KCS8qIGFkZHMgcGljb2xvX3RldHJhX211eHNlbCgpLCBwaWNvbG9fdGV0cmFfaW5pdCgpLCB0aGUgZm9sb3dpbmcgZGVjbGFyYXRpb24gc3RydWN1cmUsIGFuZCAjZGVmaW5lIEJUVFZfUElDT0xPX1RFVFJBX0NISVAqLwoJLyoweDc5IGluIGJ0dHYuaCovCgkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAoJLnZpZGVvX2lucHV0cyAgID0gNCwKCS5hdWRpb19pbnB1dHMgICA9IDAsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5zdmhzICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgID0gMCwKCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLwoJLm5vX21zcDM0eHggICAgID0gMSwKCS5ub190ZGE5ODc1ICAgICA9IDEsCgkubm9fdGRhNzQzMiAgICAgPSAxLAoJLm11eHNlbCAgICAgICAgID0gezIsMiwyLDJ9LC8qODc4QSBpbnB1dCBpcyBhbHdheXMgTVVYMCwgc2VlIGFib3ZlLiovCgkuYXVkaW9tdXggICAgICAgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfSwgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5uZWVkc190dmF1ZGlvICA9IDAsCgkubXV4c2VsX2hvb2sgICAgPSBwaWNvbG9fdGV0cmFfbXV4c2VsLC8qUmVxdWlyZWQgYXMgaXQgZG9lc24ndCBmb2xsb3cgdGhlIGNsYXNzaWMgaW5wdXQgc2VsZWN0aW9uIHBvbGljeSovCn0sewoJLyogU3Bpcml0IFRWIFR1bmVyIGZyb20gaHR0cDovL3NwaXJpdG1vZGVtcy5jb20uYXUgKi8KCS8qIFN0YWZmb3JkIEdvb2RzZWxsIDxzdXJnZUBnb2xpYXRoLmhvbWV1bml4Lm9yZz4gKi8KCS5uYW1lICAgICAgICAgICA9ICJTcGlyaXQgVFYgVHVuZXIiLAoJLnZpZGVvX2lucHV0cyAgID0gMywKCS5hdWRpb19pbnB1dHMgICA9IDEsCgkudHVuZXIgICAgICAgICAgPSAwLAoJLnN2aHMgICAgICAgICAgID0gMiwKCS5ncGlvbWFzayAgICAgICA9IDB4MDAwMDAwMGYsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKCS5hdWRpb211eCAgICAgICA9IHsgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU1JQ19QQUwsCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKfSx7CgkvKiBXb2xmcmFtIEpvb3N0IDx3b2pvQGZyb2thc2Nod2VpLmRlPiAqLwogICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgQVZlclRWIERWQi1UIDc3MSIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gMiwKICAgICAgICAuc3ZocyAgICAgICAgICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IC0xLAogICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDMgLCAzIH0sCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCiAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAogICAgICAgIC5oYXNfZHZiICAgICAgICA9IDEsCiAgICAgICAgLm5vX2dwaW9pcnEgICAgID0gMSwKICAgICAgICAuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS8qIC0tLS0gY2FyZCAweDdjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCS8qIE1hdHQgSmVzc29uIDxkdmJAamVzc29uLmVjbGlwc2UuY28udWs+ICovCgkvKiBCYXNlZCBvbiB0aGUgTmVidWxhIGNhcmQgZGF0YSAtIGFkZGVkIHJlbW90ZSBhbmQgbmV3IGNhcmQgbnVtYmVyIC0gQlRUVl9BVkRWQlRfNzYxLCBzZWUgYWxzbyBpci1rYmQtZ3Bpby5jICovCgkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiLAoJLnZpZGVvX2lucHV0cyAgID0gMiwKCS50dW5lciAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgID0gMSwKCS5tdXhzZWwgICAgICAgICA9IHsgMywgMSwgMiwgMH0sIC8qIENvbXAwLCBTLVZpZGVvLCA/LCA/ICovCgkubm9fbXNwMzR4eCAgICAgPSAxLAoJLm5vX3RkYTk4NzUgICAgID0gMSwKCS5ub190ZGE3NDMyICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSAtMSwKCS5oYXNfZHZiICAgICAgICA9IDEsCgkubm9fZ3Bpb2lycSAgICAgPSAxLAoJLmhhc19yZW1vdGUgICAgID0gMSwKfSx7CgkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCS5uYW1lICAgICAgICAgICAgID0gIk1BVFJJWCBWaXNpb24gU2lnbWEtU1EiLAoJLnZpZGVvX2lucHV0cyAgICAgPSAxNiwKCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCS50dW5lciAgICAgICAgICAgID0gLTEsCgkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkubXV4c2VsICAgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKCQkJICAgICAgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNRX211eHNlbCwKCS5hdWRpb211eCAgICAgICAgID0geyAwIH0sCgkubm9fbXNwMzR4eCAgICAgICA9IDEsCgkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKCS50dW5lcl90eXBlICAgICAgID0gLTEsCn0sewoJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNMQyIsCgkudmlkZW9faW5wdXRzICAgICA9IDQsCgkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkudHVuZXIgICAgICAgICAgICA9IC0xLAoJLnN2aHMgICAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIgfSwKCS5tdXhzZWxfaG9vayAgICAgID0gc2lnbWFTTENfbXV4c2VsLAoJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCS5wbGwgICAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKfSx7CgkvKiBCVFRWX0FQQUNfVklFV0NPTVAgKi8KCS8qIEF0dGlsYSBLb25kb3JvcyA8YXR0aWxhLmtvbmRvcm9zQGNoZWxsby5odT4gKi8KCS8qIGJ0ODc4IFRWICsgRk0gMHgwMDAwMDAwMCBzdWJzeXN0ZW0gSUQgKi8KCS5uYW1lICAgICAgICAgICA9ICJBUEFDIFZpZXdjb21wIDg3OChBTUFYKSIsCgkudmlkZW9faW5wdXRzICAgPSAyLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAtMSwKCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCgkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxMH0sCgkubmVlZHNfdHZhdWRpbyAgPSAwLAoJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkuaGFzX3JlbW90ZSAgICAgPSAxLCAgIC8qIG1pbmlyZW1vdGUgd29ya3MsIHNlZSBpci1rYmQtZ3Bpby5jICovCgkuaGFzX3JhZGlvICAgICAgPSAxLCAgIC8qIG5vdCBldmVyeSBjYXJkIGhhcyByYWRpbyAqLwp9LHsKCgkvKiAtLS0tIGNhcmQgMHg4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgkvKiBDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiAqLwoJLm5hbWUgICAgICAgICAgID0gIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIsCgkudHVuZXIgICAgICAgICAgPSAtMSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkubm9fdGRhOTg3NSAgICAgPSAxLAoJLm5vX3RkYTc0MzIgICAgID0gMSwKCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCS5ub192aWRlbyAgICAgICA9IDEsCgkuaGFzX2R2YiAgICAgICAgPSAxLAoJLnR1bmVyX3R5cGUgICAgID0gLTEsCn0sewoJLyogU3RldmVuIDxwaG90b24zOEBwY2hvbWUuY29tLnR3PiAqLwoJLm5hbWUgICAgICAgICAgID0gIlYtR2VhciBNeVZDRCIsCgkudmlkZW9faW5wdXRzICAgPSAzLAoJLmF1ZGlvX2lucHV0cyAgID0gMSwKCS50dW5lciAgICAgICAgICA9IDAsCgkuc3ZocyAgICAgICAgICAgPSAyLAoJLmdwaW9tYXNrICAgICAgID0gMHgzZiwKCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAxLCAwfSwKCS5hdWRpb211eCAgICAgICA9IHsweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxfSwKCS5ub19tc3AzNHh4ICAgICA9IDEsCgkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKCS5oYXNfcmFkaW8gICAgICA9IDAsCgkvLyAuaGFzX3JlbW90ZSAgICAgPSAxLAp9LHsKCS8qIFJpY2sgQyA8Y3J5cHRkcmFnb29uQGdtYWlsLmNvbT4gKi8KICAgICAgICAubmFtZSAgICAgICAgICAgPSAiU3VwZXIgVFYgVHVuZXIiLAogICAgICAgIC52aWRlb19pbnB1dHMgICA9IDQsCiAgICAgICAgLmF1ZGlvX2lucHV0cyAgID0gMSwKICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAogICAgICAgIC5zdmhzICAgICAgICAgICA9IDIsCiAgICAgICAgLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCiAgICAgICAgLmdwaW9tYXNrICAgICAgID0gMHgwMDgwMDcsCiAgICAgICAgLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDAwMDAwMSwwLDAsIDB9LAogICAgICAgIC5uZWVkc190dmF1ZGlvICA9IDEsCiAgICAgICAgLmhhc19yYWRpbyAgICAgID0gMSwKfSx7CgkJLyogQ2hyaXMgRmFubmluZyA8dmlkZW80bGludXhAaGF5ZG9uLm5ldD4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiVGliZXQgU3lzdGVtcyAnUHJvZ3Jlc3MgRFZSJyBDUzE2IiwKCQkudmlkZW9faW5wdXRzICAgPSAxNiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMgk9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLm11eHNlbF9ob29rICAgID0gdGliZXRDUzE2X211eHNlbCwKfSwKewoJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCgkvKgoJICogTm90ZSB0aGF0LCBiZWNhdXNlIG9mIHRoZSBjYXJkJ3Mgd2lyaW5nLCB0aGUgIm1hc3RlciIKCSAqIEJUODc4QSBjaGlwIChpLmUuIHRoZSBvbmUgd2hpY2ggY29udHJvbHMgdGhlIGFuYWxvZyBzd2l0Y2gKCSAqIGFuZCBtdXN0IHVzZSB0aGlzIGNhcmQgdHlwZSkgaXMgdGhlIDJuZCBvbmUgZGV0ZWN0ZWQuICBUaGUKCSAqIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSBjYXJkIHR5cGUgMHg4NSwgd2hvc2UgZGVzY3JpcHRpb24KCSAqIGZvbGxvd3MgdGhpcyBvbmUuICBUaGVyZSBpcyBhIEVFUFJPTSBvbiB0aGUgY2FyZCAod2hpY2ggaXMKCSAqIGNvbm5lY3RlZCB0byB0aGUgSTJDIG9mIG9uZSBvZiB0aG9zZSBvdGhlciBjaGlwcyksIGJ1dCBpcwoJICogbm90IGN1cnJlbnRseSBoYW5kbGVkLiAgVGhlcmUgaXMgYWxzbyBhIGZhY2lsaXR5IGZvciBhCgkgKiAibW9uaXRvciIsIHdoaWNoIGlzIGFsc28gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KCSAqLwoJLm5hbWUJCT0gIktvZGljb20gNDQwMFIgKG1hc3RlcikiLAoJLnZpZGVvX2lucHV0cwk9IDE2LAoJLmF1ZGlvX2lucHV0cwk9IDAsCgkudHVuZXIJCT0gLTEsCgkudHVuZXJfdHlwZQk9IC0xLAoJLnN2aHMJCT0gLTEsCgkvKiBHUElPIGJpdHMgMC05IHVzZWQgZm9yIGFuYWxvZyBzd2l0Y2g6CgkgKiAgIDAwIC0gMDM6CWNhbWVyYSBzZWxlY3RvcgoJICogICAwNCAtIDA2OgljaGFubmVsIChjb250cm9sbGVyKSBzZWxlY3RvcgoJICogICAwNzoJZGF0YSAoMS0+b24sIDAtPm9mZikKCSAqICAgMDg6CXN0cm9iZQoJICogICAwOToJcmVzZXQKCSAqIGJpdCAxNiBpcyBpbnB1dCBmcm9tIHN5bmMgc2VwYXJhdG9yIGZvciB0aGUgY2hhbm5lbAoJICovCgkuZ3Bpb21hc2sJPSAweDAwMDNmZiwKCS5ub19ncGlvaXJxICAgICA9IDEsCgkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJLnBsbAkJPSBQTExfMjgsCgkubm9fbXNwMzR4eAk9IDEsCgkubm9fdGRhNzQzMgk9IDEsCgkubm9fdGRhOTg3NQk9IDEsCgkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAp9LAp7CgkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCS8qIE5vdGUgdGhhdCwgZm9yIHJlYXNvbnMgdW5rbm93biwgdGhlICJtYXN0ZXIiIEJUODc4QSBjaGlwIChpLmUuIHRoZQoJICogb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoLCBhbmQgbXVzdCB1c2UgdGhlIGNhcmQgdHlwZSkKCSAqIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlIG90aGVyIDMgY2hpcHMgc2hvdWxkIHVzZSB0aGlzIGNhcmQKCSAqIHR5cGUKCSAqLwoJLm5hbWUJCT0gIktvZGljb20gNDQwMFIgKHNsYXZlKSIsCgkudmlkZW9faW5wdXRzCT0gMTYsCgkuYXVkaW9faW5wdXRzCT0gMCwKCS50dW5lcgkJPSAtMSwKCS50dW5lcl90eXBlCT0gLTEsCgkuc3ZocwkJPSAtMSwKCS5ncGlvbWFzawk9IDB4MDEwMDAwLAoJLm5vX2dwaW9pcnEgICAgID0gMSwKCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkucGxsCQk9IFBMTF8yOCwKCS5ub19tc3AzNHh4CT0gMSwKCS5ub190ZGE3NDMyCT0gMSwKCS5ub190ZGE5ODc1CT0gMSwKCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCn0sCnsKICAgICAgICAvKiAtLS0tIGNhcmQgMHg4NS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLwogICAgICAgIC8qIEFkbGluayBSVFYyNCB3aXRoIHNwZWNpYWwgdW5sb2NrIGNvZGVzICovCiAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkFkbGluayBSVFYyNCIsCiAgICAgICAgLnZpZGVvX2lucHV0cyAgID0gNCwKICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAogICAgICAgIC50dW5lciAgICAgICAgICA9IDAsCiAgICAgICAgLnN2aHMgICAgICAgICAgID0gMiwKICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAogICAgICAgIC50dW5lcl90eXBlICAgICA9IC0xLAogICAgICAgIC5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCn19OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBidHR2X251bV90dmNhcmRzID0gQVJSQVlfU0laRShidHR2X3R2Y2FyZHMpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl07CgovKgogKiBpZGVudGlmeSBjYXJkCiAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2lkY2FyZChzdHJ1Y3QgYnR0diAqYnR2KQp7Cgl1bnNpZ25lZCBpbnQgZ3Bpb2JpdHM7CglpbnQgaSx0eXBlOwoJdW5zaWduZWQgc2hvcnQgdG1wOwoKCS8qIHJlYWQgUENJIHN1YnN5c3RlbSBJRCAqLwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnR2LT5jLnBjaSwgUENJX1NVQlNZU1RFTV9JRCwgJnRtcCk7CglidHYtPmNhcmRpZCA9IHRtcCA8PCAxNjsKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdG1wKTsKCWJ0di0+Y2FyZGlkIHw9IHRtcDsKCglpZiAoMCAhPSBidHYtPmNhcmRpZCAmJiAweGZmZmZmZmZmICE9IGJ0di0+Y2FyZGlkKSB7CgkJLyogbG9vayBmb3IgdGhlIGNhcmQgKi8KCQlmb3IgKHR5cGUgPSAtMSwgaSA9IDA7IGNhcmRzW2ldLmlkICE9IDA7IGkrKykKCQkJaWYgKGNhcmRzW2ldLmlkICA9PSBidHYtPmNhcmRpZCkKCQkJCXR5cGUgPSBpOwoKCQlpZiAodHlwZSAhPSAtMSkgewoJCQkvKiBmb3VuZCBpdCAqLwoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGRldGVjdGVkOiAlcyBbY2FyZD0lZF0sICIKCQkJICAgICAgICJQQ0kgc3Vic3lzdGVtIElEIGlzICUwNHg6JTA0eFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixjYXJkc1t0eXBlXS5uYW1lLGNhcmRzW3R5cGVdLmNhcmRuciwKCQkJICAgICAgIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAoJCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CgkJCWJ0di0+Yy50eXBlID0gY2FyZHNbdHlwZV0uY2FyZG5yOwoJCX0gZWxzZSB7CgkJCS8qIDQwNCAqLwoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHN1YnN5c3RlbTogJTA0eDolMDR4IChVTktOT1dOKVxuIiwKCQkJICAgICAgIGJ0di0+Yy5uciwgYnR2LT5jYXJkaWQgJiAweGZmZmYsCgkJCSAgICAgICAoYnR2LT5jYXJkaWQgPj4gMTYpICYgMHhmZmZmKTsKCQkJcHJpbnRrKEtFUk5fREVCVUcgInBsZWFzZSBtYWlsIGlkLCBib2FyZCBuYW1lIGFuZCAiCgkJCSAgICAgICAidGhlIGNvcnJlY3QgY2FyZD0gaW5zbW9kIG9wdGlvbiB0byBrcmF4ZWxAYnl0ZXNleC5vcmdcbiIpOwoJCX0KCX0KCgkvKiBsZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGF1dG9kZXRlY3RlZCB0eXBlICovCglpZiAoY2FyZFtidHYtPmMubnJdIDwgYnR0dl9udW1fdHZjYXJkcykKCQlidHYtPmMudHlwZT1jYXJkW2J0di0+Yy5ucl07CgoJLyogcHJpbnQgd2hpY2ggY2FyZCBjb25maWcgd2UgYXJlIHVzaW5nICovCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IHVzaW5nOiAlcyBbY2FyZD0lZCwlc11cbiIsYnR2LT5jLm5yLAoJICAgICAgIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwgYnR2LT5jLnR5cGUsCgkgICAgICAgY2FyZFtidHYtPmMubnJdIDwgYnR0dl9udW1fdHZjYXJkcwoJICAgICAgID8gImluc21vZCBvcHRpb24iIDogImF1dG9kZXRlY3RlZCIpOwoKCS8qIG92ZXJ3cml0ZSBncGlvIHN0dWZmID8/ICovCglpZiAoVU5TRVQgPT0gYXVkaW9hbGwgJiYgVU5TRVQgPT0gYXVkaW9tdXhbMF0pCgkJcmV0dXJuOwoKCWlmIChVTlNFVCAhPSBhdWRpb211eFswXSkgewoJCWdwaW9iaXRzID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0gPSBhdWRpb211eFtpXTsKCQkJZ3Bpb2JpdHMgfD0gYXVkaW9tdXhbaV07CgkJfQoJfSBlbHNlIHsKCQlncGlvYml0cyA9IGF1ZGlvYWxsOwoJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQkJYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSA9IGF1ZGlvYWxsOwoJCX0KCX0KCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2sgPSAoVU5TRVQgIT0gZ3Bpb21hc2spID8gZ3Bpb21hc2sgOiBncGlvYml0czsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogZ3BpbyBjb25maWcgb3ZlcnJpZGU6IG1hc2s9MHgleCwgbXV4PSIsCgkgICAgICAgYnR2LT5jLm5yLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2spOwoJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCXByaW50aygiJXMweCV4IiwgaSA/ICIsIiA6ICIiLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldKTsKCX0KCXByaW50aygiXG4iKTsKfQoKLyoKICogKG1vc3QpIGJvYXJkIHNwZWNpZmljIGluaXRpYWxpc2F0aW9ucyBnb2VzIGhlcmUKICovCgovKiBTb21lIE1vZHVsYXIgVGVjaG5vbG9neSBjYXJkcyBoYXZlIGFuIGVlcHJvbSwgYnV0IG5vIHN1YnN5c3RlbSBJRCAqLwp2b2lkIGlkZW50aWZ5X2J5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBjaGFyIGVlcHJvbV9kYXRhWzI1Nl0pCnsKCWludCB0eXBlID0gLTE7CgoJaWYgKDAgPT0gc3RybmNtcChlZXByb21fZGF0YSwiR0VUIE1NMjB4UENUViIsMTMpKQoJCXR5cGUgPSBCVFRWX01PRFRFQ18yMDU7CgllbHNlIGlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGErMjAsIlBpY29sbyIsNykpCgkJdHlwZSA9IEJUVFZfRVVSRVNZU19QSUNPTE87CgllbHNlIGlmIChlZXByb21fZGF0YVswXSA9PSAweDg0ICYmIGVlcHJvbV9kYXRhWzJdPT0gMCkKICAgICAgICAgICAgICAgIHR5cGUgPSBCVFRWX0hBVVBQQVVHRTsgLyogb2xkIGJ0ODQ4ICovCgoJaWYgKC0xICE9IHR5cGUpIHsKCQlidHYtPmMudHlwZSA9IHR5cGU7CgkJcHJpbnRrKCJidHR2JWQ6IGRldGVjdGVkIGJ5IGVlcHJvbTogJXMgW2NhcmQ9JWRdXG4iLAoJCSAgICAgICBidHYtPmMubnIsIGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmFtZSwgYnR2LT5jLnR5cGUpOwoJfQp9CgpzdGF0aWMgdm9pZCBmbHl2aWRlb19ncGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCBncGlvLGhhc19yZW1vdGUsaGFzX3JhZGlvLGlzX2NhcHR1cmVfb25seSxpc19scjkwLGhhc190ZGE5ODIwX3RkYTk4MjE7CglpbnQgdHVuZXI9LTEsdHR5cGU7CgoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMCk7Cgl1ZGVsYXkoOCk7ICAvLyB3aXRob3V0IHRoaXMgd2Ugd291bGQgc2VlIHRoZSAweDE4MDAgbWFzawoJZ3BpbyA9IGdwaW9fcmVhZCgpOwoJLyogRklYTUU6IG11c3QgcmVzdG9yZSBPVVJfRU4gPz8/ICovCgoJLy8gYWxsIGNhcmRzIHByb3ZpZGUgR1BJTyBpbmZvLCBzb21lIGhhdmUgYW4gYWRkaXRpb25hbCBlZXByb20KCS8vIExSNTA6IEdQSU8gY29kaW5nIGNhbiBiZSBmb3VuZCBsb3dlciByaWdodCBDUDEgLi4gQ1A5CgkvLyAgICAgICBDUDk9R1BJTzIzIC4uIENQMT1HUElPMTU7IHdoZW4gT1BFTiwgdGhlIGNvcnJlc3BvbmRpbmcgR1BJTyByZWFkcyAxLgoJLy8gICAgICAgR1BJTzE0LTEyOiBuLmMuCgkvLyBMUjkwOiBHUDk9R1BJTzIzIC4uIEdQMT1HUElPMTUgKHJpZ2h0IGFib3ZlIHRoZSBidDg3OCkKCgkvLyBsb3dlc3QgMyBieXRlcyBhcmUgcmVtb3RlIGNvbnRyb2wgY29kZXMgKG5vIGhhbmRzaGFrZSBuZWVkZWQpCiAgICAgICAgLy8geHh4RkZGOiBObyByZW1vdGUgY29udHJvbCBjaGlwIHNvbGRlcmVkCiAgICAgICAgLy8geHh4RjAwKExSMjYvTFI1MCksIHh4eEZFMChMUjkwKTogUmVtb3RlIGNvbnRyb2wgY2hpcCAoTFZBMDAxIG9yIENGNDUpIHNvbGRlcmVkCgkvLyBOb3RlOiBTb21lIGJpdHMgYXJlIEF1ZGlvX01hc2sgIQoKCXR0eXBlPShncGlvJjB4MGYwMDAwKT4+MTY7Cglzd2l0Y2godHR5cGUpIHsKCWNhc2UgMHgwOiB0dW5lcj0yOyAvLyBOVFNDLCBlLmcuIFRQSThOU1IxMVAKCQlicmVhazsKICAgICAgICBjYXNlIDB4MjogdHVuZXI9Mzk7Ly8gTEcgTlRTQyAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtSDcwMVAKCQlicmVhazsKCWNhc2UgMHg0OiB0dW5lcj01OyAvLyBQaGlsaXBzIFBBTCBUUEk4UFNCMDJQLCBUUEk4UFNCMTJQLCBUUEk4UFNCMTJEIG9yIEZJMTIxNiwgRk0xMjE2CgkJYnJlYWs7CgljYXNlIDB4NjogdHVuZXI9Mzc7IC8vIExHIFBBTCAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtRzcwMlAKCQlicmVhazsKCWNhc2UgMHhDOiB0dW5lcj0zOyAvLyBQaGlsaXBzIFNFQ0FNKCtQQUwpIEZRMTIxNk1FIG9yIEZJMTIxNk1GCgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW9fZ3BpbzogdW5rbm93biB0dW5lciB0eXBlLlxuIiwgYnR2LT5jLm5yKTsKCX0KCgloYXNfcmVtb3RlICAgICAgICAgID0gICBncGlvICYgMHg4MDAwMDA7CgloYXNfcmFkaW8JICAgID0gICBncGlvICYgMHg0MDAwMDA7CgkvLyAgIHVua25vd24gICAgICAgICAgICAgICAgICAgMHgyMDAwMDA7CgkvLyAgIHVua25vd24yICAgICAgICAgICAgICAgICAgMHgxMDAwMDA7CiAgICAgICAgaXNfY2FwdHVyZV9vbmx5ICAgICA9ICEoZ3BpbyAmIDB4MDA4MDAwKTsgLy9HUElPMTUKCWhhc190ZGE5ODIwX3RkYTk4MjEgPSAhKGdwaW8gJiAweDAwNDAwMCk7Cglpc19scjkwICAgICAgICAgICAgID0gIShncGlvICYgMHgwMDIwMDApOyAvLyBlbHNlIExSMjYvTFI1MCAoTFIzOC9MUjUxIGYuIGNhcHR1cmUgb25seSkKICAgICAgICAvLwkJICAgICAgICBncGlvICYgMHgwMDEwMDAgLy8gb3V0cHV0IGJpdCBmb3IgYXVkaW8gcm91dGluZwoKCWlmKGlzX2NhcHR1cmVfb25seSkKCQl0dW5lcj00OyAvLyBObyB0dW5lciBwcmVzZW50CgoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyBSYWRpbz0lcyBSZW1vdGVDb250cm9sPSVzIFR1bmVyPSVkIGdwaW89MHglMDZ4XG4iLAoJICAgICAgIGJ0di0+Yy5uciwgaGFzX3JhZGlvPyAieWVzIjoibm8gIiwgaGFzX3JlbW90ZT8gInllcyI6Im5vICIsIHR1bmVyLCBncGlvKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gIExSOTA9JXMgdGRhOTgyMS90ZGE5ODIwPSVzIGNhcHR1cmVfb25seT0lc1xuIiwKCQlidHYtPmMubnIsIGlzX2xyOTA/InllcyI6Im5vICIsIGhhc190ZGE5ODIwX3RkYTk4MjE/InllcyI6Im5vICIsCgkJaXNfY2FwdHVyZV9vbmx5PyJ5ZXMiOiJubyAiKTsKCglpZih0dW5lciE9IC0xKSAvLyBvbmx5IHNldCBpZiBrbm93biB0dW5lciBhdXRvZGV0ZWN0ZWQsIGVsc2UgbGV0IGluc21vZCBvcHRpb24gdGhyb3VnaAoJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyOwoJYnR2LT5oYXNfcmFkaW8gPSBoYXNfcmFkaW87CgoJLy8gTFI5MCBBdWRpbyBSb3V0aW5nIGlzIGRvbmUgYnkgMiBoZWY0MDUyLCBzbyBBdWRpb19NYXNrIGhhcyA0IGJpdHM6IDB4MDAxYzgwCiAgICAgICAgLy8gTFIyNi9MUjUwIG9ubHkgaGFzIDEgaGVmNDA1MiwgQXVkaW9fTWFzayAweDAwMGMwMAoJLy8gQXVkaW8gb3B0aW9uczogZnJvbSB0dW5lciwgZnJvbSB0ZGE5ODIxL3RkYTk4MjEobW9ubyxzdGVyZW8sc2FwKSwgZnJvbSB0ZGE5ODc0LCBleHQuLCBtdXRlCglpZihoYXNfdGRhOTgyMF90ZGE5ODIxKSBidHYtPmF1ZGlvX2hvb2sgPSBsdDk0MTVfYXVkaW87CgkvL3RvZG86IGlmKGhhc190ZGE5ODc0KSBidHYtPmF1ZGlvX2hvb2sgPSBmdjIwMDBzX2F1ZGlvOwp9CgpzdGF0aWMgaW50IG1pcm9fdHVuZXJtYXBbXSA9IHsgMCw2LDIsMywgICA0LDUsNiwwLCAgMywwLDQsNSwgIDUsMiwxNiwxLAoJCQkgICAgICAgMTQsMiwxNywxLCA0LDEsNCwzLCAgMSwyLDE2LDEsIDQsNCw0LDQgfTsKc3RhdGljIGludCBtaXJvX2ZtdHVuZXJbXSAgPSB7IDAsMCwwLDAsICAgMCwwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwxLAoJCQkgICAgICAgMSwxLDEsMSwgICAxLDEsMSwwLCAgMCwwLDAsMCwgIDAsMSwwLDAgfTsKCnN0YXRpYyB2b2lkIG1pcm9fcGlubmFjbGVfZ3BpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgaWQsbXNwLGdwaW87CgljaGFyICppbmZvOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDApOwogICAgICAgIGdwaW8gPSBncGlvX3JlYWQoKTsKCWlkICAgPSAoKGdwaW8+PjEwKSAmIDYzKSAtMTsKCW1zcCAgPSBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMCwgIk1TUDM0eHgiKTsKCWlmIChpZCA8IDMyKSB7CgkJYnR2LT50dW5lcl90eXBlID0gbWlyb190dW5lcm1hcFtpZF07CgkJaWYgKDAgPT0gKGdwaW8gJiAweDIwKSkgewoJCQlidHYtPmhhc19yYWRpbyA9IDE7CgkJCWlmICghbWlyb19mbXR1bmVyW2lkXSkgewoJCQkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJCQkJYnR2LT5tYm94X3dlICAgID0gKDE8PDYpOwoJCQkJYnR2LT5tYm94X21vc3QgID0gKDE8PDcpOwoJCQkJYnR2LT5tYm94X2NsayAgID0gKDE8PDgpOwoJCQkJYnR2LT5tYm94X2RhdGEgID0gKDE8PDkpOwoJCQkJYnR2LT5tYm94X21hc2sgID0gKDE8PDYpfCgxPDw3KXwoMTw8OCl8KDE8PDkpOwoJCQl9CgkJfSBlbHNlIHsKCQkJYnR2LT5oYXNfcmFkaW8gPSAwOwoJCX0KCQlpZiAoLTEgIT0gbXNwKSB7CgkJCWlmIChidHYtPmMudHlwZSA9PSBCVFRWX01JUk8pCgkJCQlidHYtPmMudHlwZSA9IEJUVFZfTUlST1BSTzsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfUElOTkFDTEUpCgkJCQlidHYtPmMudHlwZSA9IEJUVFZfUElOTkFDTEVQUk87CgkJfQoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgImJ0dHYlZDogbWlybzogaWQ9JWQgdHVuZXI9JWQgcmFkaW89JXMgc3RlcmVvPSVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsIGlkKzEsIGJ0di0+dHVuZXJfdHlwZSwKCQkgICAgICAgIWJ0di0+aGFzX3JhZGlvID8gIm5vIiA6CgkJICAgICAgIChidHYtPmhhc19tYXRjaGJveCA/ICJtYXRjaGJveCIgOiAiZm10dW5lciIpLAoJCSAgICAgICAoLTEgPT0gbXNwKSA/ICJubyIgOiAieWVzIik7Cgl9IGVsc2UgewoJCS8qIG5ldyBjYXJkcyB3aXRoIG1pY3JvdHVuZSB0dW5lciAqLwoJCWlkID0gNjMgLSBpZDsKCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJc3dpdGNoIChpZCkgewoJCWNhc2UgMToKCQkJaW5mbyA9ICJQQUwgLyBtb25vIjsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQlpbmZvID0gIk5UU0MgLyBzdGVyZW8iOwoJCQlidHYtPmhhc19yYWRpbyA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJaW5mbyA9ICJQQUwrU0VDQU0gLyBtb25vIjsKCQkJYnJlYWs7CgkJY2FzZSA1OgoJCQlpbmZvID0gIk5UU0MgLyBtb25vIjsKCQkJYnJlYWs7CgkJY2FzZSA2OgoJCQlpbmZvID0gIk5UU0MgLyBzdGVyZW8iOwoJCQlicmVhazsKCQljYXNlIDc6CgkJCWluZm8gPSAiUEFMIC8gc3RlcmVvIjsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJaW5mbyA9ICJvb3BzOiB1bmtub3duIGNhcmQiOwoJCQlicmVhazsKCQl9CgkJaWYgKC0xICE9IG1zcCkKCQkJYnR2LT5jLnR5cGUgPSBCVFRWX1BJTk5BQ0xFUFJPOwoJCXByaW50ayhLRVJOX0lORk8KCQkgICAgICAgImJ0dHYlZDogcGlubmFjbGUvbXQ6IGlkPSVkIGluZm89XCIlc1wiIHJhZGlvPSVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsIGlkLCBpbmZvLCBidHYtPmhhc19yYWRpbyA/ICJ5ZXMiIDogIm5vIik7CgkJYnR2LT50dW5lcl90eXBlICA9IDMzOwoJCWJ0di0+cGlubmFjbGVfaWQgPSBpZDsKCX0KfQoKLyogR1BJTzIxICAgTDogQnVmZmVyIGFrdGl2LCBIOiBCdWZmZXIgaW5ha3RpdiAqLwojZGVmaW5lIExNMTg4Ml9TWU5DX0RSSVZFICAgICAweDIwMDAwMEwKCnN0YXRpYyB2b2lkIGluaXRfaWRzX2VhZ2xlKHN0cnVjdCBidHR2ICpidHYpCnsKCWdwaW9faW5vdXQoMHhmZmZmZmYsMHhGRkZGMzcpOwoJZ3Bpb193cml0ZSgweDIwMDAyMCk7CgoJLyogZmxhc2ggc3Ryb2JlIGludmVydGVyID8hICovCglncGlvX3dyaXRlKDB4MjAwMDI0KTsKCgkvKiBzd2l0Y2ggc3luYyBkcml2ZSBvZmYgKi8KCWdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7CgoJLyogc2V0IEJUODQ4IG11eGVsIHRvIDIgKi8KCWJ0YW9yKCgyKTw8NSwgfigyPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgovKiBNdXhzZWwgaGVscGVyIGZvciB0aGUgSURTIEVhZ2xlLgogKiB0aGUgZWFnbGVzIGRvZXMgbm90IHVzZSB0aGUgc3RhbmRhcmQgbXV4c2VsLWJpdHMgYnV0CiAqIGhhcyBpdHMgb3duIG11bHRpcGxleGVyICovCnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWJ0YW9yKCgyKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwoJZ3Bpb19iaXRzKDMsYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5tdXhzZWxbaW5wdXQmN10pOwoKICAgICAgIC8qIGNvbXBvc2l0ZSAqLwogICAgICAgLyogc2V0IGNocm9tYSBBREMgdG8gc2xlZXAgKi8KICAgICAgIGJ0b3IoQlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAvKiBzZXQgdG8gY29tcG9zaXRlIHZpZGVvICovCiAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwogICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKCiAgICAgICAvKiBzd2l0Y2ggc3luYyBkcml2ZSBvZmYgKi8KICAgICAgIGdwaW9fYml0cyhMTTE4ODJfU1lOQ19EUklWRSxMTTE4ODJfU1lOQ19EUklWRSk7Cn0KCnN0YXRpYyB2b2lkIGd2YzExMDBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWFza3NbXSA9IHsweDMwLCAweDAxLCAweDEyLCAweDIzfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlNF0pOwp9CgovKiBMTUxCVDR4IGluaXRpYWxpemF0aW9uIC0gdG8gYWxsb3cgYWNjZXNzIHRvIEdQSU8gYml0cyBmb3Igc2Vuc29ycyBpbnB1dCBhbmQKICAgYWxhcm1zIG91dHB1dAoKICAgR1BJT2JpdCAgICB8IDEwIHwgOSB8IDggfCA3IHwgNiB8IDUgfCA0IHwgMyB8IDIgfCAxIHwgMCB8CiAgIGFzc2lnbm1lbnQgfCBUSSB8IE8zfElOeHwgTzJ8IE8xfElONHxJTjN8SU4yfElOMXwgICB8ICAgfAoKICAgSU4gLSBzZW5zb3IgaW5wdXRzLCBJTnggLSBzZW5zb3IgaW5wdXRzIGFuZCBUSSBYT1JlZCB0b2dldGhlcgogICBPMSxPMixPMyAtIGFsYXJtIG91dHB1dHMgKHJlbGF5cykKCiAgIE9VVCBFTkFCTEUgICAxICAgIDEgICAwICAuIDEgIDEgICAwICAgMCAuIDAgICAwICAgMCAgICAwICAgPSAweDZDMAoKKi8KCnN0YXRpYyB2b2lkIGluaXRfbG1sYnQ0eChzdHJ1Y3QgYnR0diAqYnR2KQp7CglwcmludGsoS0VSTl9ERUJVRyAiTE1MQlQ0eCBpbml0XG4iKTsKCWJ0d3JpdGUoMHgwMDAwMDAsIEJUODQ4X0dQSU9fUkVHX0lOUCk7CglncGlvX2lub3V0KDB4ZmZmZmZmLCAweDAwMDZDMCk7CglncGlvX3dyaXRlKDB4MDAwMDAwKTsKfQoKc3RhdGljIHZvaWQgc2lnbWFTUV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7Cgl1bnNpZ25lZCBpbnQgaW5tdXggPSBpbnB1dCAlIDg7CglncGlvX2lub3V0KCAweGYsIDB4ZiApOwoJZ3Bpb19iaXRzKCAweGYsIGlubXV4ICk7Cn0KCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCXVuc2lnbmVkIGludCBpbm11eCA9IGlucHV0ICUgNDsKCWdwaW9faW5vdXQoIDM8PDksIDM8PDkgKTsKCWdwaW9fYml0cyggMzw8OSwgaW5tdXg8PDkgKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIGJ0dHZfcmVzZXRfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJLyoKCSAqIEJUODc4QSBoYXMgYSBhdWRpby1yZXNldCByZWdpc3Rlci4KCSAqIDEuIFRoaXMgcmVnaXN0ZXIgaXMgYW4gYXVkaW8gcmVzZXQgZnVuY3Rpb24gYnV0IGl0IGlzIGluCgkgKiAgICBmdW5jdGlvbi0wICh2aWRlbyBjYXB0dXJlKSBhZGRyZXNzIHNwYWNlLgoJICogMi4gSXQgaXMgZW5vdWdoIHRvIGRvIHRoaXMgb25jZSBwZXIgcG93ZXItdXAgb2YgdGhlIGNhcmQuCgkgKiAzLiBUaGVyZSBpcyBhIHR5cG8gaW4gdGhlIENvbmV4YW50IGRvYyAtLSBpdCBpcyBub3QgYXQKCSAqICAgIDB4NUIsIGJ1dCBhdCAweDA1OC4gKEIgaXMgYW4gb2RkLW51bWJlciwgb2J2aW91c2x5IGEgdHlwbyEpLgoJICogLS0vL1NocmlrdW1hciAwMzA2MDkKCSAqLwoJaWYgKGJ0di0+aWQgIT0gODc4KQoJCXJldHVybjsKCglpZiAoYnR0dl9kZWJ1ZykKCQlwcmludGsoImJ0dHYlZDogQlQ4NzhBIEFSRVNFVFxuIixidHYtPmMubnIpOwoJYnR3cml0ZSgoMTw8NyksIDB4MDU4KTsKCXVkZWxheSgxMCk7CglidHdyaXRlKCAgICAgMCwgMHgwNTgpOwp9CgovKiBpbml0aWFsaXphdGlvbiBwYXJ0IG9uZSAtLSBiZWZvcmUgcmVnaXN0ZXJpbmcgaTJjIGJ1cyAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDEoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3dpdGNoIChidHYtPmMudHlwZSkgewoJY2FzZSBCVFRWX0hBVVBQQVVHRToKCWNhc2UgQlRUVl9IQVVQUEFVR0U4Nzg6CiAgICAgICAgICAgICAgICBib290X21zcDM0eHgoYnR2LDUpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1ZPT0RPT1RWX0ZNOgogICAgICAgICAgICAgICAgYm9vdF9tc3AzNHh4KGJ0diwyMCk7CgkJYnJlYWs7CgljYXNlIEJUVFZfQVZFUk1FRElBOTg6CgkJYm9vdF9tc3AzNHh4KGJ0diwxMSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfSEFVUFBBVUdFUFZSOgoJCXB2cl9ib290KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfVFdJTkhBTl9EU1Q6CgljYXNlIEJUVFZfQVZEVkJUXzc3MToKCQlidHYtPnVzZV9pMmNfaHcgPSAxOwoJCWJyZWFrOwogICAgICAgIGNhc2UgQlRUVl9BRExJTktfUlRWMjQ6CiAgICAgICAgICAgICAgICBpbml0X1JUVjI0KCBidHYgKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKCX0KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiKQoJCWJ0dHZfcmVzZXRfYXVkaW8oYnR2KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCB0d28gLS0gYWZ0ZXIgcmVnaXN0ZXJpbmcgaTJjIGJ1cyAqLwp2b2lkIF9fZGV2aW5pdCBidHR2X2luaXRfY2FyZDIoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IHRkYTk4ODc7CiAgICAgICAgYnR2LT50dW5lcl90eXBlID0gLTE7CgoJaWYgKEJUVFZfVU5LTk9XTiA9PSBidHYtPmMudHlwZSkgewoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQlpZGVudGlmeV9ieV9lZXByb20oYnR2LGVlcHJvbV9kYXRhKTsKCX0KCglzd2l0Y2ggKGJ0di0+Yy50eXBlKSB7CgljYXNlIEJUVFZfTUlSTzoKCWNhc2UgQlRUVl9NSVJPUFJPOgoJY2FzZSBCVFRWX1BJTk5BQ0xFOgoJY2FzZSBCVFRWX1BJTk5BQ0xFUFJPOgoJCS8qIG1pcm8vcGlubmFjbGUgKi8KCQltaXJvX3Bpbm5hY2xlX2dwaW8oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9GTFlWSURFT185ODoKCWNhc2UgQlRUVl9NQVhJOgoJY2FzZSBCVFRWX0xJRkVfRkxZS0lUOgoJY2FzZSBCVFRWX0ZMWVZJREVPOgoJY2FzZSBCVFRWX1RZUEhPT05fVFZJRVc6CgljYXNlIEJUVFZfQ0hST05PU19WUzI6CgljYXNlIEJUVFZfRkxZVklERU9fOThGTToKCWNhc2UgQlRUVl9GTFlWSURFTzIwMDA6CgljYXNlIEJUVFZfRkxZVklERU85OEVaOgoJY2FzZSBCVFRWX0NPTkZFUkVOQ0VUVjoKCWNhc2UgQlRUVl9MSUZFVEVDXzk0MTU6CgkJZmx5dmlkZW9fZ3BpbyhidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0hBVVBQQVVHRToKCWNhc2UgQlRUVl9IQVVQUEFVR0U4Nzg6CgljYXNlIEJUVFZfSEFVUFBBVUdFUFZSOgoJCS8qIHBpY2sgdXAgc29tZSBjb25maWcgaW5mb3MgZnJvbSB0aGUgZWVwcm9tICovCgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwogICAgICAgICAgICAgICAgaGF1cHBhdWdlX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0FWRVJNRURJQTk4OgoJY2FzZSBCVFRWX0FWUEhPTkU5ODoKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJYXZlcm1lZGlhX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1BYQzIwMDoKCQlpbml0X1BYQzIwMChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX1BJQ09MT19URVRSQV9DSElQOgoJCXBpY29sb190ZXRyYV9pbml0KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfVkhYOgoJCWJ0di0+aGFzX3JhZGlvICAgID0gMTsKCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJYnR2LT5tYm94X3dlICAgICAgPSAweDIwOwoJCWJ0di0+bWJveF9tb3N0ICAgID0gMDsKCQlidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CgkJYnR2LT5tYm94X2RhdGEgICAgPSAweDEwOwoJCWJ0di0+bWJveF9tYXNrICAgID0gMHgzODsKCQlicmVhazsKCWNhc2UgQlRUVl9WT0JJU19CT09TVEFSOgoJY2FzZSBCVFRWX1RFUlJBVFY6CgkJdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9NQUdJQ1RWSUVXMDYxOgoJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CgkJCWJ0di0+aGFzX3JhZGlvPTE7CgkJCXByaW50aygiYnR0diVkOiByYWRpbyBkZXRlY3RlZCBieSBzdWJzeXN0ZW0gaWQgKENQSDA1eClcbiIsYnR2LT5jLm5yKTsKCQl9CgkJYnJlYWs7CiAgICAgICBjYXNlIEJUVFZfU1RCMjoKICAgICAgICAgICAgICAgIGlmIChidHYtPmNhcmRpZCA9PSAweDMwNjAxMjFhKSB7CgkJCS8qIEZpeCB1cCBlbnRyeSBmb3IgM0RGWCBWb29kb29UViAxMDAsCgkJCSAgIHdoaWNoIGlzIGFuIE9FTSBTVEIgY2FyZCB2YXJpYW50LiAqLwoJCQlidHYtPmhhc19yYWRpbz0wOwoJCQlidHYtPnR1bmVyX3R5cGU9VFVORVJfVEVNSUNfTlRTQzsKCQl9CgkJYnJlYWs7CgljYXNlIEJUVFZfT1NQUkVZMXgwOgoJY2FzZSBCVFRWX09TUFJFWTF4MF84NDg6CgljYXNlIEJUVFZfT1NQUkVZMTAxXzg0ODoKCWNhc2UgQlRUVl9PU1BSRVkxeDE6CgljYXNlIEJUVFZfT1NQUkVZMXgxX1NWSUQ6CgljYXNlIEJUVFZfT1NQUkVZMnh4OgoJY2FzZSBCVFRWX09TUFJFWTJ4MF9TVklEOgoJY2FzZSBCVFRWX09TUFJFWTJ4MDoKCWNhc2UgQlRUVl9PU1BSRVk1MDA6CgljYXNlIEJUVFZfT1NQUkVZNTQwOgoJY2FzZSBCVFRWX09TUFJFWTIwMDA6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwogICAgICAgICAgICAgICAgb3NwcmV5X2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0lEU19FQUdMRToKCQlpbml0X2lkc19lYWdsZShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX01PRFRFQ18yMDU6CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCW1vZHRlY19lZXByb20oYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9MTUxCVDQ6CgkJaW5pdF9sbWxidDR4KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfVElCRVRfQ1MxNjoKCQl0aWJldENTMTZfaW5pdChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0tPRElDT01fNDQwMFI6CgkJa29kaWNvbTQ0MDByX2luaXQoYnR2KTsKCQlicmVhazsKCX0KCgkvKiBwbGwgY29uZmlndXJhdGlvbiAqLwogICAgICAgIGlmICghKGJ0di0+aWQ9PTg0OCAmJiBidHYtPnJldmlzaW9uPT0weDExKSkgewoJCS8qIGRlZmF1bHRzIGZyb20gY2FyZCBsaXN0ICovCgkJaWYgKFBMTF8yOCA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9Mjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMDsKCQl9CgkJaWYgKFBMTF8zNSA9PSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnBsbCkgewoJCQlidHYtPnBsbC5wbGxfaWZyZXE9MzU0Njg5NTA7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsPUJUODQ4X0lGT1JNX1hUMTsKCQl9CgkJLyogaW5zbW9kIG9wdGlvbnMgY2FuIG92ZXJyaWRlICovCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBsbFtidHYtPmMubnJdKSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIG5vbmUgKi8KCQkJYnR2LT5wbGwucGxsX2NyeXN0YWwgPSAwOwoJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDA7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIDI4IE1IeiAqLwoJCWNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMjg2MzYzNjM7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYnR2LT5wbGwucGxsX2NyeXN0YWwgPSBCVDg0OF9JRk9STV9YVDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOiAvKiAzNSBNSHogKi8KCQljYXNlIDM1OgogICAgICAgICAgICAgICAgICAgICAgICBidHYtPnBsbC5wbGxfaWZyZXEgICA9IDM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQxOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CglidHYtPnBsbC5wbGxfY3VycmVudCA9IC0xOwoKCS8qIHR1bmVyIGNvbmZpZ3VyYXRpb24gKGZyb20gY2FyZCBsaXN0IC8gYXV0b2RldGVjdCAvIGluc21vZCBvcHRpb24pICovCiAJaWYgKFVOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfdHlwZSkKCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCiAgICAgICAgICAgICAgICAJYnR2LT50dW5lcl90eXBlID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlOwoJaWYgKFVOU0VUICE9IHR1bmVyW2J0di0+Yy5ucl0pCgkJYnR2LT50dW5lcl90eXBlID0gdHVuZXJbYnR2LT5jLm5yXTsKCXByaW50aygiYnR0diVkOiB1c2luZyB0dW5lcj0lZFxuIixidHYtPmMubnIsYnR2LT50dW5lcl90eXBlKTsKCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEFVRENfQ09ORklHX1BJTk5BQ0xFLAoJCQkJICAgICAgJmJ0di0+cGlubmFjbGVfaWQpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgewoJICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOwoKCSAgICAgICAgdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKCQl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CgoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOwoJfQoKCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwoJaWYgKHJlbW90ZVtidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yYWRpbykKCQlidHYtPmhhc19yYWRpbz0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JlbW90ZSkKCQlidHYtPmhhc19yZW1vdGU9MTsKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX2dwaW9pcnEpCgkJYnR2LT5ncGlvaXJxPTA7CglpZiAoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rKQoJCWJ0di0+YXVkaW9faG9vaz1idHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvX2hvb2s7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZGlnaXRhbF9tb2RlID09IERJR0lUQUxfTU9ERV9DQU1FUkEpIHsKCQkvKiBkZXRlY3QgQnQ4MzIgY2hpcCBmb3IgcXVhcnR6c2lnaHQgZGlnaXRhbCBjYW1lcmEgKi8KCQlpZiAoKGJ0dHZfSTJDUmVhZChidHYsIEkyQ19CVDgzMl9BTFQxLCAiQnQ4MzIiKSA+PTApIHx8CgkJICAgIChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMiwgIkJ0ODMyIikgPj0wKSkKCQkJYm9vdF9idDgzMihidHYpOwoJfQoKCWlmICghYXV0b2xvYWQpCgkJcmV0dXJuOwoKCS8qIHRyeSB0byBkZXRlY3QgYXVkaW8vZmFkZXIgY2hpcHMgKi8KCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub19tc3AzNHh4ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDAsICJNU1AzNHh4IikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXNwMzR4eF9hbHQgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfTVNQMzQwMF9BTFQsICJNU1AzNHh4IChhbHRlcm5hdGUgYWRkcmVzcykiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoIm1zcDM0MDAiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhOTg3NSAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODc1LCAiVERBOTg3NSIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg3NSIpOwoKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub190ZGE3NDMyICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTc0MzIsICJUREE3NDMyIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE3NDMyIik7CgoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubmVlZHNfdHZhdWRpbykKCQlyZXF1ZXN0X21vZHVsZSgidHZhdWRpbyIpOwoKCS8qIHR1bmVyIG1vZHVsZXMgKi8KCXRkYTk4ODcgPSAwOwoJaWYgKGJ0di0+cGlubmFjbGVfaWQgIT0gVU5TRVQpCgkJdGRhOTg4NyA9IDE7CglpZiAoMCA9PSB0ZGE5ODg3ICYmIDAgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5oYXNfZHZiICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX1REQTk4ODcsICJUREE5ODg3IikgPj0wKQoJCXRkYTk4ODcgPSAxOwoJaWYoKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMykgfHwKCSAgIChidHYtPnR1bmVyX3R5cGUgPT0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMpIHx8CgkgICAgdGRhOTg4NykKCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg4NyIpOwoJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBtb2R0ZWNfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWlmKCBzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJUZW1pYyA0MDY2IEZZNSIsMTQpID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9URU1JQ180MDY2Rlk1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAoJCSAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiQWxwcyBUU0JCNSIsMTApID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9BTFBTX1RTQkI1X1BBTF9JOwoJCXByaW50aygiYnR0diVkOiBNb2R0ZWM6IFR1bmVyIGF1dG9kZXRlY3RlZCBieSBlZXByb206ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwogICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgmKGVlcHJvbV9kYXRhWzB4MWVdKSwiUGhpbGlwcyBGTTEyNDYiLDE0KSA9PTApIHsKICAgICAgICAgICAgICAgIGJ0di0+dHVuZXJfdHlwZT1UVU5FUl9QSElMSVBTX05UU0M7CiAgICAgICAgICAgICAgICBwcmludGsoImJ0dHYlZDogTW9kdGVjOiBUdW5lciBhdXRvZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBidHYtPmMubnIsJmVlcHJvbV9kYXRhWzB4MWVdKTsKCX0gZWxzZSB7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVW5rbm93biBUdW5lclN0cmluZzogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfQp9CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CglzdHJ1Y3QgdHZlZXByb20gdHY7CgoJdHZlZXByb21faGF1cHBhdWdlX2FuYWxvZygmdHYsIGVlcHJvbV9kYXRhKTsKCWJ0di0+dHVuZXJfdHlwZSA9IHR2LnR1bmVyX3R5cGU7CglidHYtPmhhc19yYWRpbyAgPSB0di5oYXNfcmFkaW87Cn0KCnN0YXRpYyBpbnQgdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGZyZXE7CgoJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJYnR2LT5tYm94X3dlICAgICAgPSAweDEwOwoJYnR2LT5tYm94X21vc3QgICAgPSAweDIwOwoJYnR2LT5tYm94X2NsayAgICAgPSAweDA4OwoJYnR2LT5tYm94X2RhdGEgICAgPSAweDA0OwoJYnR2LT5tYm94X21hc2sgICAgPSAweDNjOwoKCWJ0di0+bWJveF9pb3cgICAgID0gMSA8PCAgODsKCWJ0di0+bWJveF9pb3IgICAgID0gMSA8PCAgOTsKCWJ0di0+bWJveF9jc2VsICAgID0gMSA8PCAxMDsKCglmcmVxPTg4MDAwLzYyLjU7Cgl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8vIHdyaXRlIDB4MWVkOAoJaWYgKDB4MWVkOCA9PSB0ZWE1NzU3X3JlYWQoYnR2KSkgewoJCXByaW50aygiYnR0diVkOiBUZXJyYXRlYyBBY3RpdmUgUmFkaW8gVXBncmFkZSBmb3VuZC5cbiIsCgkJICAgICAgIGJ0di0+Yy5ucik7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAxOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMTsKCX0gZWxzZSB7CgkJYnR2LT5oYXNfcmFkaW8gICAgPSAwOwoJCWJ0di0+aGFzX21hdGNoYm94ID0gMDsKCX0KCXJldHVybiAwOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIG1pbmltYWwgYm9vdHN0cmFwIGZvciB0aGUgV2luVFYvUFZSIC0tIHVwbG9hZCBhbHRlcmEgZmlybXdhcmUuCiAqCiAqIFRoZSBoY3dhbWMucmJmIGZpcm13YXJlIGZpbGUgaXMgb24gdGhlIEhhdXBwYXVnZSBkcml2ZXIgQ0QuICBIYXZlCiAqIGEgbG9vayBhdCBQdnIvcHZyNDV4eHguRVhFIChzZWxmLWV4dHJhY3RpbmcgemlwIGFyY2hpdmUsIGNhbiBiZQogKiB1bnBhY2tlZCB3aXRoIHVuemlwKS4KICovCiNkZWZpbmUgUFZSX0dQSU9fREVMQVkJCTEwCgojZGVmaW5lIEJUVFZfQUxUX0RBVEEJCTB4MDAwMDAxCiNkZWZpbmUgQlRUVl9BTFRfRENMSwkJMHgxMDAwMDAKI2RlZmluZSBCVFRWX0FMVF9OQ09ORklHCTB4ODAwMDAwCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBwdnJfYWx0ZXJhX2xvYWQoc3RydWN0IGJ0dHYgKmJ0diwgdTggKm1pY3JvLCB1MzIgbWljcm9sZW4pCnsKCXUzMiBuOwogIAl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CglpbnQgcmM7CgoJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgImhjd2FtYy5yYmYiLCAmYnR2LT5jLnBjaS0+ZGV2KTsKCWlmIChyYyAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiBubyBhbHRlcmEgZmlybXdhcmUgW3ZpYSBob3RwbHVnXVxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKICAgICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CglyYyA9IHB2cl9hbHRlcmFfbG9hZChidHYsIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGFsdGVyYSBmaXJtd2FyZSB1cGxvYWQgJXNcbiIsCgkgICAgICAgYnR2LT5jLm5yLCAocmMgPCAwKSA/ICJmYWlsZWQiIDogIm9rIik7CiAgICAgICAgcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CglyZXR1cm4gcmM7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIHNvbWUgb3NwcmV5IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICBpbnQgaSA9IDA7CiAgICAgICB1bnNpZ25lZCBjaGFyICplZSA9IGVlcHJvbV9kYXRhOwogICAgICAgdW5zaWduZWQgbG9uZyBzZXJpYWwgPSAwOwoKICAgICAgIGlmIChidHYtPmMudHlwZSA9PSAwKSB7CiAgICAgICAgICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KICAgICAgICAgICAgICAgaWYgKChlZVswXT09J00nKSAmJiAoZWVbMV09PSdNJykgJiYgKGVlWzJdPT0nQScpICYmIChlZVszXT09J0MnKSkgewogICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9MDsgaTwyMTsgaSsrKQoJCQkgICAgICAgY2hlY2tzdW0gKz0gZWVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrc3VtICE9IGVlWzIxXSkKCQkJICAgICAgIHJldHVybjsKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MF84NDg7CgkJICAgICAgIGZvciAoaSA9IDEyOyBpIDwgMjE7IGkrKykKCQkJICAgICAgIHNlcmlhbCAqPSAxMCwgc2VyaWFsICs9IGVlW2ldIC0gJzAnOwogICAgICAgICAgICAgICB9CiAgICAgICB9IGVsc2UgewoJICAgICAgIHVuc2lnbmVkIHNob3J0IHR5cGU7CiAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKICAgICAgICAgICAgICAgZm9yKDsgb2Zmc2V0IDwgOCoxNjsgb2Zmc2V0ICs9IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcmlmeSB0aGUgY2hlY2tzdW0gKi8KICAgICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGk8MTQ7IGkrKykgY2hlY2tzdW0gKz0gZWVbaStvZmZzZXRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0gPSB+Y2hlY2tzdW07ICAvKiBubyBpZGVhIHdoeSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoKGNoZWNrc3VtPj44KSYweDBGRikgPT0gZWVbb2Zmc2V0KzE0XSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoZWNrc3VtICYgMHgwRkYpID09IGVlW29mZnNldCsxNV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgLyogODc4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMTI6CgkgICAgICAgY2FzZSAweDAwMTM6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkxeDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE0OgoJICAgICAgIGNhc2UgMHgwMDE1OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZMXgxOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxNjoKCSAgICAgICBjYXNlIDB4MDAxNzoKCSAgICAgICBjYXNlIDB4MDAyMDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTF4MV9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxODoKCSAgICAgICBjYXNlIDB4MDAxOToKCSAgICAgICBjYXNlIDB4MDAxRToKCSAgICAgICBjYXNlIDB4MDAxRjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4eDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMUE6CgkgICAgICAgY2FzZSAweDAwMUI6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVkyeDBfU1ZJRDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNDA6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9PU1BSRVk1MDA7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDUwOgoJICAgICAgIGNhc2UgMHgwMDU2OgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfT1NQUkVZNTQwOwoJCSAgICAgICAvKiBidHR2X29zcHJleV81NDBfaW5pdChidHYpOyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA2MDoKCSAgICAgICBjYXNlIDB4MDA3MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX09TUFJFWTJ4MDsKCQkgICAgICAgLy9lbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewogICAgICAgIFRVTkVSX1BISUxJUFNfTlRTQywgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1CRyovLAogICAgICAgIFRVTkVSX1BISUxJUFNfUEFMLCAgIFRVTkVSX1BISUxJUFNfUEFMIC8qIFBBTC1JKi8sCiAgICAgICAgVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCiAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICBUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1BBTCwKCVRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszIH07CgpzdGF0aWMgaW50IHR1bmVyXzFfdGFibGVbXSA9IHsKICAgICAgICBUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCiAgICAgICAgVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfNDAxMkZZNSwgLy9UVU5FUl9URU1JQ19TRUNBTQogICAgICAgIFRVTkVSX1RFTUlDXzQwMTJGWTUsIFRVTkVSX1RFTUlDX1BBTH07CgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KQp7CiAgICAgICAgaW50IHR1bmVyX21ha2UsdHVuZXJfdHZfZm0sdHVuZXJfZm9ybWF0LHR1bmVyPTA7CgoJdHVuZXJfbWFrZSAgICAgID0gKGVlcHJvbV9kYXRhWzB4NDFdICYgMHg3KTsKICAgICAgICB0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOwogICAgICAgIHR1bmVyX2Zvcm1hdCAgICA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4ZjApID4+IDQ7CglidHYtPmhhc19yZW1vdGUgPSAoZWVwcm9tX2RhdGFbMHg0Ml0gJiAweDAxKTsKCglpZiAodHVuZXJfbWFrZSA9PSAwIHx8IHR1bmVyX21ha2UgPT0gMikKCQlpZih0dW5lcl9mb3JtYXQgPD0weDBhKQoJCQl0dW5lciA9IHR1bmVyXzBfdGFibGVbdHVuZXJfZm9ybWF0XTsKCWlmICh0dW5lcl9tYWtlID09IDEpCgkJaWYodHVuZXJfZm9ybWF0IDw9OSkKCQkJdHVuZXIgPSB0dW5lcl8xX3RhYmxlW3R1bmVyX2Zvcm1hdF07CgoJaWYgKHR1bmVyX21ha2UgPT0gNCkKCQlpZih0dW5lcl9mb3JtYXQgPT0gMHgwOSkKCQkJdHVuZXIgPSBUVU5FUl9MR19OVFNDX05FV19UQVBDOyAvLyBUQVBDLUc3MDJQCgoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBBdmVybWVkaWEgZWVwcm9tWzB4JTAyeCUwMnhdOiB0dW5lcj0iLAoJCWJ0di0+Yy5ucixlZXByb21fZGF0YVsweDQxXSxlZXByb21fZGF0YVsweDQyXSk7CglpZih0dW5lcikgewoJCWJ0di0+dHVuZXJfdHlwZT10dW5lcjsKCQlwcmludGsoIiVkIix0dW5lcik7Cgl9IGVsc2UKCQlwcmludGsoIlVua25vd24gdHlwZSIpOwoJcHJpbnRrKCIgcmFkaW86JXMgcmVtb3RlIGNvbnRyb2w6JXNcbiIsCgkgICAgICAgdHVuZXJfdHZfZm0gICAgID8gInllcyIgOiAibm8iLAoJICAgICAgIGJ0di0+aGFzX3JlbW90ZSA/ICJ5ZXMiIDogIm5vIik7Cn0KCi8qIHVzZWQgb24gVm9vZG9vIFRWL0ZNIChWb29kb28gMjAwKSwgUzAgd2lyZWQgdG8gMHgxMDAwMCAqLwp2b2lkIGJ0dHZfdGRhOTg4MF9zZXRub3JtKHN0cnVjdCBidHR2ICpidHYsIGludCBub3JtKQp7CgkvLyBmaXggdXAgb3VyIGNhcmQgZW50cnkKCWlmKG5vcm09PVZJREVPX01PREVfTlRTQykgewoJCWJ0dHZfdHZjYXJkc1tCVFRWX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk1N2ZmZjsKCQlidHR2X3R2Y2FyZHNbQlRUVl9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NTdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gTlRTQ1xuIik7Cgl9CgllbHNlIHsKCSAgICAgICAgYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTQ3ZmZmOwogICAgICAgICAgICAgICAgYnR0dl90dmNhcmRzW0JUVFZfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzRdPTB4OTQ3ZmZmOwoJCWRwcmludGsoImJ0dHZfdGRhOTg4MF9zZXRub3JtIHRvIFBBTFxuIik7Cgl9CgkvLyBzZXQgR1BJTyBhY2NvcmRpbmcKCWdwaW9fYml0cyhidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrLAoJCSAgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtidHYtPmF1ZGlvXSk7Cn0KCgovKgogKiByZXNldC9lbmFibGUgdGhlIE1TUCBvbiBzb21lIEhhdXBwYXVnZSBjYXJkcwogKiBUaGFua3MgdG8gS3n2c3RpIE3kbGtraSAoa21hbGtraUBjYy5odXQuZmkpIQogKgogKiBIYXVwcGF1Z2U6ICBwaW4gIDUKICogVm9vZG9vOiAgICAgcGluIDIwCiAqLwpzdGF0aWMgdm9pZCBfX2RldmluaXQgYm9vdF9tc3AzNHh4KHN0cnVjdCBidHR2ICpidHYsIGludCBwaW4pCnsKCWludCBtYXNrID0gKDEgPDwgcGluKTsKCglncGlvX2lub3V0KG1hc2ssbWFzayk7CglncGlvX2JpdHMobWFzaywwKTsKICAgICAgICB1ZGVsYXkoMjUwMCk7CglncGlvX2JpdHMobWFzayxtYXNrKTsKCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIm1zcDM0eHgiKTsKCWlmIChidHR2X3ZlcmJvc2UpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgoJCSAgICAgICAiaW5pdCBbJWRdXG4iLCBidHYtPmMubnIsIHBpbik7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCnsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLwovKiAgVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzCiAqICB1c2VkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGluIGhpcyBweGMyMDAKICogIGRyaXZlciwgYnV0IHVzaW5nIEJUVFYgZnVuY3Rpb25zICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RhdGljIGludCB2YWxzW10gX19kZXZpbml0ZGF0YSA9IHsgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwZCwgMHgwZCwKCQkJCQkgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKCQkJCQkgICAgMHgwMCB9OwoJdW5zaWduZWQgaW50IGk7CglpbnQgdG1wOwoJdTMyIHZhbDsKCgkvKiBJbml0aWFsaXNlIEdQSU8tY29ubmV2dGVkIHN0dWZmICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAoMTw8MTMpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMyk7CglncGlvX3dyaXRlKDE8PDEzKTsKCS8qIEdQSU8gaW5wdXRzIGFyZSBwdWxsZWQgdXAsIHNvIG5vIG5lZWQgdG8gZHJpdmUKCSAqIHJlc2V0IHBpbiBhbnkgbG9uZ2VyICovCglncGlvX2JpdHMoMHhmZmZmZmYsIDApOwoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJweGMyMDAiKTsKCgkvKiAgd2UgY291bGQvc2hvdWxkIHRyeSBhbmQgcmVzZXQvY29udHJvbCB0aGUgQUQgcG90cz8gYnV0CgkgICAgcmlnaHQgbm93ICB3ZSBzaW1wbHkgIHR1cm5lZCBvZmYgdGhlIGNydXNoaW5nLiAgV2l0aG91dAoJICAgIHRoaXMgdGhlIEFHQyBkcmlmdHMgZHJpZnRzCgkgICAgcmVtZW1iZXIgdGhlIEVOIGlzIHJldmVyc2UgbG9naWMgLS0+CgkgICAgc2V0dGluZyBCVDg0OF9BRENfQUdDX0VOIGRpc2FibGUgdGhlIEFHQwoJICAgIHRib3VsdEBlZWNzLmxlaGlnaC5lZHUKCSovCgoJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKCgkvKglJbml0aWFsaXNlIE1BWDUxNyBEQUMgKi8KCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CglidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKCgkvKglJbml0aWFsaXNlIDEyQzUwOCBQSUMgKi8KCS8qCVRoZSBJMkNXcml0ZSBhbmQgSTJDUmVhZCBjb21tbWFuZHMgYXJlIGFjdHVhbGx5IHRvIHRoZQoJICoJc2FtZSBjaGlwcyAtIGJ1dCB0aGUgUi9XIGJpdCBpcyBpbmNsdWRlZCBpbiB0aGUgYWRkcmVzcwoJICoJYXJndW1lbnQgc28gdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCAqLwoKCglwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CgoJLyogRmlyc3Qgb2YgYWxsLCBlbmFibGUgdGhlIGNsb2NrIGxpbmUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgUFhDMjAwLUYgKi8KCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwoJdmFsIHw9IEJUODQ4X0dQSU9fRE1BX0NUTF9HUENMS01PREU7CglidHdyaXRlKHZhbCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCgkvKiBUaGVuLCBwdXNoIHRvIDAgdGhlIHJlc2V0IHBpbiBsb25nIGVub3VnaCB0byByZXNldCB0aGUgKgoJICogZGV2aWNlIHNhbWUgYXMgYWJvdmUgZm9yIHRoZSByZXNldCBsaW5lLCBidXQgbm90IHRoZSBzYW1lCgkgKiB2YWx1ZSBzZW50IHRvIHRoZSBHUElPLWNvbm5lY3RlZCBzdHVmZgoJICogd2hpY2ggb25lIGlzIHRoZSBnb29kIG9uZT8gKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsKDE8PDIpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMTApOwoJZ3Bpb193cml0ZSgxPDwyKTsKCiAgICAgICAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodmFscyk7IGkrKykgewoJCXRtcD1idHR2X0kyQ1dyaXRlKGJ0diwweDFFLDAsdmFsc1tpXSwxKTsKCQlpZiAodG1wICE9IC0xKSB7CgkJCXByaW50ayhLRVJOX0lORk8KCQkJICAgICAgICJJMkMgV3JpdGUoJTIuMngpID0gJWlcbkkyQyBSZWFkICgpID0gJTIuMnhcblxuIiwKCQkJICAgICAgIHZhbHNbaV0sdG1wLGJ0dHZfSTJDUmVhZChidHYsMHgxRixOVUxMKSk7CgkJfQoJfQoKCXByaW50ayhLRVJOX0lORk8gIlBYQzIwMCBJbml0aWFsaXNlZC5cbiIpOwp9CgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qCiAqICBUaGUgQWRsaW5rIFJUVi0yNCAoYWthIEFuZ2VsbykgaGFzIHNvbWUgc3BlY2lhbCBpbml0aWFsaXNhdGlvbiB0byB1bmxvY2sKICogIGl0LiBUaGlzIGFwcGFyZW50bHkgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgZm9yIGVhY2ggODc4IGNoaXA6CiAqCiAqICAxKSB3cml0ZSAweDAwQzNGRUZGIHRvIHRoZSBHUElPX09VVF9FTiByZWdpc3RlcgogKgogKiAgMikgIHdyaXRlIHRvIEdQSU9fREFUQQogKiAgICAgIC0gMHgwRQogKiAgICAgIC0gc2xlZXAgMW1zCiAqICAgICAgLSAweDEwICsgMHgwRQogKiAgICAgIC0gc2xlZXAgMTBtcwogKiAgICAgIC0gMHgwRQogKiAgICAgcmVhZCBmcm9tIEdQSU9fREFUQSBpbnRvIGJ1ZiAodWludF8zMikKICogICAgICAtIGlmICggZGF0YT4+MTggJiAweDAxICE9IDApIHx8ICggYnVmPj4xOSAmIDB4MDEgIT0gMSApCiAqICAgICAgICAgICAgICAgICBlcnJvci4gRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgc3RvcC4KICoKICogIDMpIHdyaXRlIHRvIEdQSU9fREFUQQogKiAgICAgIC0gd3JpdGUgMHg0NDAwICsgMHgwRQogKiAgICAgIC0gc2xlZXAgMTBtcwogKiAgICAgIC0gd3JpdGUgMHg0NDEwICsgMHgwRQogKiAgICAgIC0gc2xlZXAgMW1zCiAqICAgICAgLSB3cml0ZSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBidWY+PjE4ICYgMHgwMSApIHx8ICggYnVmPj4xOSAmJiAweDAxICE9IDAgKQogKiAgICAgICAgICAgICAgICBlcnJvci4gRVJST1JfQ1BMRF9DaGVja19GYWlsZWQuCiAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp2b2lkCmluaXRfUlRWMjQgKHN0cnVjdCBidHR2ICpidHYpCnsKCXVpbnQzMl90IGRhdGFSZWFkID0gMDsKCWxvbmcgd2F0Y2hkb2dfdmFsdWUgPSAweDBFOwoKCXByaW50ayAoS0VSTl9JTkZPCgkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbiBpbiBwcm9ncmVzcyAuLi5cbiIsCgkJYnR2LT5jLm5yKTsKCglidHdyaXRlICgweDAwYzNmZWZmLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxKTsKCWJ0d3JpdGUgKDB4MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoKCWRhdGFSZWFkID0gYnRyZWFkIChCVDg0OF9HUElPX0RBVEEpOwoKCWlmICgoKChkYXRhUmVhZCA+PiAxOCkgJiAweDAxKSAhPSAwKSB8fCAoKChkYXRhUmVhZCA+PiAxOSkgJiAweDAxKSAhPSAxKSkgewoJCXByaW50ayAoS0VSTl9JTkZPCgkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMSkgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAoJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKCX0KCglidHdyaXRlICgweDQ0MDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMTApOwoJYnR3cml0ZSAoMHg0NDEwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAod2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDApKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigyKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoKCQlyZXR1cm47Cgl9CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlLlxuIiwgYnR2LT5jLm5yKTsKfQoKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBNaXJvIFBybyByYWRpbyBzdHVmZiAtLSB0aGUgdGVhNTc1NyBpcyBjb25uZWN0ZWQgdG8gc29tZSBHUElPIHBvcnRzICAgICAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTkgQ3NhYmEgSGFsYXN6IDxxZ2VoYWxpQHVuaS1taXNrb2xjLmh1PgogKiBUaGlzIGNvZGUgaXMgcGxhY2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoKICogQnJ1dGFsbHkgaGFja2VkIGJ5IERhbiBTaGVyaWRhbiA8ZGFuLnNoZXJpZGFuQGNvbnRhY3Qub3JnLnVrPiBkanM1MiA4LzMvMDAKICovCgpzdGF0aWMgdm9pZCBidXNfbG93KHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsMCk7Cgl1ZGVsYXkoNSk7CgoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLCAwKTsKCQl1ZGVsYXkoNSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGJ1c19oaWdoKHN0cnVjdCBidHR2ICpidHYsIGludCBiaXQpCnsKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWdwaW9fYml0cyhiaXQsYml0KTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIGludCBidXNfaW4oc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7CgoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KCXJldHVybiBncGlvX3JlYWQoKSAmIChiaXQpOwp9CgovKiBURUE1NzU3IHJlZ2lzdGVyIGJpdHMgKi8KI2RlZmluZSBURUFfRlJFUQkJMDoxNAojZGVmaW5lIFRFQV9CVUZGRVIJCTE1OjE1CgojZGVmaW5lIFRFQV9TSUdOQUxfU1RSRU5HVEgJMTY6MTcKCiNkZWZpbmUgVEVBX1BPUlQxCQkxODoxOAojZGVmaW5lIFRFQV9QT1JUMAkJMTk6MTkKCiNkZWZpbmUgVEVBX0JBTkQJCTIwOjIxCiNkZWZpbmUgVEVBX0JBTkRfRk0JCTAKI2RlZmluZSBURUFfQkFORF9NVwkJMQojZGVmaW5lIFRFQV9CQU5EX0xXCQkyCiNkZWZpbmUgVEVBX0JBTkRfU1cJCTMKCiNkZWZpbmUgVEVBX01PTk8JCTIyOjIyCiNkZWZpbmUgVEVBX0FMTE9XX1NURVJFTwkwCiNkZWZpbmUgVEVBX0ZPUkNFX01PTk8JCTEKCiNkZWZpbmUgVEVBX1NFQVJDSF9ESVJFQ1RJT04JMjM6MjMKI2RlZmluZSBURUFfU0VBUkNIX0RPV04JCTAKI2RlZmluZSBURUFfU0VBUkNIX1VQCQkxCgojZGVmaW5lIFRFQV9TVEFUVVMJCTI0OjI0CiNkZWZpbmUgVEVBX1NUQVRVU19UVU5FRAkwCiNkZWZpbmUgVEVBX1NUQVRVU19TRUFSQ0hJTkcJMQoKLyogTG93LWxldmVsIHN0dWZmICovCnN0YXRpYyBpbnQgdGVhNTc1N19yZWFkKHN0cnVjdCBidHR2ICpidHYpCnsKCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKCWludCB2YWx1ZSA9IDA7CglpbnQgaTsKCgkvKiBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlYTU3NTcgcmVhZCIpOwoKCWJ1c19sb3coYnR2LGJ0di0+bWJveF93ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCgl1ZGVsYXkoMTApOwoJdGltZW91dD0gamlmZmllcyArIEhaOwoKCS8vIHdhaXQgZm9yIERBVEEgbGluZSB0byBnbyBsb3c7IGVycm9yIGlmIGl0IGRvZXNuJ3QKCXdoaWxlIChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKCQlzY2hlZHVsZSgpOwoJaWYgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0diVkOiB0ZWE1NzU3OiByZWFkIHRpbWVvdXRcbiIsYnR2LT5jLm5yKTsKCQlyZXR1cm4gLTE7Cgl9CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiIsYnR2LT5jLm5yKTsKCWZvcihpID0gMDsgaSA8IDI0OyBpKyspCgl7CgkJdWRlbGF5KDUpOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoNSk7CgkJZHByaW50aygiJWMiLChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nVCc6Jy0nKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl2YWx1ZSA8PD0gMTsKCQl2YWx1ZSB8PSAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkgPT0gMCk/MDoxOyAgLyogTVNCIGZpcnN0ICovCgkJZHByaW50aygiJWMiLCAoYnVzX2luKGJ0dixidHYtPm1ib3hfbW9zdCkgPT0gMCk/J1MnOidNJyk7Cgl9CglkcHJpbnRrKCJcbmJ0dHYlZDogdGVhNTc1NzogcmVhZCAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCXJldHVybiB2YWx1ZTsKfQoKc3RhdGljIGludCB0ZWE1NzU3X3dyaXRlKHN0cnVjdCBidHR2ICpidHYsIGludCB2YWx1ZSkKewoJaW50IGk7CglpbnQgcmVnID0gdmFsdWU7CgoJZ3Bpb19pbm91dChidHYtPm1ib3hfbWFzaywgYnR2LT5tYm94X2NsayB8IGJ0di0+bWJveF93ZSB8IGJ0di0+bWJveF9kYXRhKTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCX0KCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyB3cml0ZSIpOwoKCWRwcmludGsoImJ0dHYlZDogdGVhNTc1Nzogd3JpdGUgMHglWFxuIiwgYnR2LT5jLm5yLCB2YWx1ZSk7CglidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfd2UpOwoJZm9yKGkgPSAwOyBpIDwgMjU7IGkrKykKCXsKCQlpZiAocmVnICYgMHgxMDAwMDAwKQoJCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2RhdGEpOwoJCWVsc2UKCQkJYnVzX2xvdyhidHYsYnR2LT5tYm94X2RhdGEpOwoJCXJlZyA8PD0gMTsKCQlidXNfaGlnaChidHYsYnR2LT5tYm94X2Nsayk7CgkJdWRlbGF5KDEwKTsKCQlidXNfbG93KGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJfQoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsgIC8qIHVubXV0ZSAhISEgKi8KCXJldHVybiAwOwp9Cgp2b2lkIHRlYTU3NTdfc2V0X2ZyZXEoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgc2hvcnQgZnJlcSkKewoJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogYWRkIDEwLjdNSHogKHNlZSBkb2NzKSAqLwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogd2ludmlldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnZvaWQgd2ludmlld19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCS8qIFBUMjI1NEEgcHJvZ3JhbW1pbmcgSm9uIFRvbWJzLCBqb25AZ3RlLmVzaS51cy5lcyAqLwoJaW50IGJpdHNfb3V0LCBsb29wcywgdm9sLCBkYXRhOwoKCWlmICghc2V0KSB7CgkJLyogRml4ZWQgYnkgTGVhbmRybyBMdWNhcmVsbGEgPGx1Y2FAbGludXhtZW5kb3phLm9yZy5hciAoMDcvMzEvMDEpICovCgkJdi0+ZmxhZ3MgfD0gVklERU9fQVVESU9fVk9MVU1FOwoJCXJldHVybjsKCX0KCgkvKiAzMiBsZXZlbHMgbG9nYXJpdGhtaWMgKi8KCXZvbCA9IDMyIC0gKCh2LT52b2x1bWU+PjExKSk7CgkvKiB1bml0cyAqLwoJYml0c19vdXQgPSAoUFQyMjU0X0RCU19JTl8yPj4odm9sJTUpKTsKCS8qIHRlbnMgKi8KCWJpdHNfb3V0IHw9IChQVDIyNTRfREJTX0lOXzEwPj4odm9sLzUpKTsKCWJpdHNfb3V0IHw9IFBUMjI1NF9MX0NIQU5ORUwgfCBQVDIyNTRfUl9DSEFOTkVMOwoJZGF0YSA9IGdwaW9fcmVhZCgpOwoJZGF0YSAmPSB+KFdJTlZJRVdfUFQyMjU0X0NMS3wgV0lOVklFV19QVDIyNTRfREFUQXwKCQkgIFdJTlZJRVdfUFQyMjU0X1NUUk9CRSk7Cglmb3IgKGxvb3BzID0gMTc7IGxvb3BzID49IDAgOyBsb29wcy0tKSB7CgkJaWYgKGJpdHNfb3V0ICYgKDE8PGxvb3BzKSkKCQkJZGF0YSB8PSAgV0lOVklFV19QVDIyNTRfREFUQTsKCQllbHNlCgkJCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CgkJZ3Bpb193cml0ZShkYXRhKTsKCQl1ZGVsYXkoNSk7CgkJZGF0YSB8PSBXSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCQl1ZGVsYXkoNSk7CgkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfQ0xLOwoJCWdwaW9fd3JpdGUoZGF0YSk7Cgl9CglkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9TVFJPQkU7CglkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9EQVRBOwoJZ3Bpb193cml0ZShkYXRhKTsKCXVkZWxheSgxMCk7CglkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9TVFJPQkU7CglncGlvX3dyaXRlKGRhdGEpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb25vL3N0ZXJlbyBjb250cm9sIGZvciB2YXJpb3VzIGNhcmRzICh3aGljaCBkb24ndCB1c2UgaTJjIGNoaXBzIGJ1dCAgICAqLwovKiBjb25uZWN0IHNvbWV0aGluZyB0byB0aGUgR1BJTyBwaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQKZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCBjb24gPSAwOwoKCWlmIChzZXQpIHsKCQlncGlvX2lub3V0KDB4MzAwLCAweDMwMCk7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJY29uID0gMHgzMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCWNvbiA9IDB4MjAwOwovLwkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQovLwkJCWNvbiA9IDB4MTAwOwoJCWdwaW9fYml0cygweDMwMCwgY29uKTsKCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCnN0YXRpYyB2b2lkCmd2YmN0djVwY2lfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsLCBjb247CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CgoJdmFsID0gZ3Bpb19yZWFkKCk7CglpZiAoc2V0KSB7CgkJY29uID0gMHgwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgewoJCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKSB7CgkJCQkvKiBMQU5HMSArIExBTkcyICovCgkJCQljb24gPSAweDEwMDsKCQkJfQoJCQllbHNlIHsKCQkJCS8qIExBTkcyICovCgkJCQljb24gPSAweDMwMDsKCQkJfQoJCX0KCQlpZiAoY29uICE9ICh2YWwgJiAweDMwMCkpIHsKCQkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiZ3ZiY3R2NXBjaSIpOwoJCX0KCX0gZWxzZSB7CgkJc3dpdGNoICh2YWwgJiAweDcwKSB7CgkJICBjYXNlIDB4MTA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJCQlicmVhazsKCQkgIGNhc2UgMHgzMDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcyOwoJCQlicmVhazsKCQkgIGNhc2UgMHg1MDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxOwoJCQlicmVhazsKCQkgIGNhc2UgMHg2MDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX1NURVJFTzsKCQkJYnJlYWs7CgkJICBjYXNlIDB4NzA6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05POwoJCQlicmVhazsKCQkgIGRlZmF1bHQ6CgkJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJCSAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCQl9Cgl9Cn0KCi8qCiAqIE1hcmlvIE1lZGluYSBOdXNzYmF1bSA8bWVkaXNvZnRAYWxvaGFiYnMub3JnLm14PgogKiAgSSBkaXNjb3ZlciB0aGF0IG9uIEJUODQ4X0dQSU9fREFUQSBhZGRyZXNzIGEgYnl0ZSAweGNjZSBlbmFibGUgc3RlcmVvLAogKiAgMHhkZGUgZW5hYmxlcyBtb25vIGFuZCAweGNjZCBlbmFibGVzIHNhcAogKgogKiBQZXRyIFZhbmRyb3ZlYyA8VkFORFJPVkVAdmMuY3Z1dC5jej4KICogIFAuUy46IEF0IGxlYXN0IG1hc2sgaW4gbGluZSBhYm92ZSBpcyB3cm9uZyAtIEdQSU8gcGlucyAzLDIgc2VsZWN0CiAqICBpbnB1dC9vdXRwdXQgc291bmQgY29ubmVjdGlvbiwgc28gYm90aCBtdXN0IGJlIHNldCBmb3Igb3V0cHV0IG1vZGUuCiAqCiAqIExvb2tzIGxpa2UgaXQncyBuZWVkZWQgb25seSBmb3IgdGhlICJ0dnBob25lIiwgdGhlICJ0dnBob25lIDk4IgogKiBoYW5kbGVzIHRoaXMgd2l0aCBhIHRkYTk4NDAKICoKICovCnN0YXRpYyB2b2lkCmF2ZXJtZWRpYV90dnBob25lX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJaW50IHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAgLyogU0FQICovCgkJCXZhbCA9IDB4MDI7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCXZhbCA9IDB4MDE7CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgwMyx2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiYXZlcm1lZGlhIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxOwoJCXJldHVybjsKCX0KfQoKc3RhdGljIHZvaWQKYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCWludCB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgIC8qIFNBUCAqLwoJCQl2YWwgPSAweDAxOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKSAgLyogU1RFUkVPICovCgkJCXZhbCA9IDB4MDI7CgkJYnRhb3IodmFsLCB+MHgwMywgQlQ4NDhfR1BJT19EQVRBKTsKCQlpZiAoYnR0dl9ncGlvKQoJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJhdmVybWVkaWEiKTsKCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJCXJldHVybjsKCX0KfQoKLyogTGlmZXRlYyA5NDE1IGhhbmRsaW5nICovCnN0YXRpYyB2b2lkCmx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKICAgICAgICBpbnQgdmFsID0gMDsKCiAgICAgICAgaWYgKGdwaW9fcmVhZCgpICYgMHg0MDAwKSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CgkJcmV0dXJuOwoJfQoKICAgICAgICBpZiAoc2V0KSB7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgLyogQTIgU0FQICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDB4MDA4MDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgLyogQTIgc3RlcmVvICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDB4MDg4MDsKICAgICAgICAgICAgICAgIGlmICgodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKSB8fAoJCSAgICAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pKQoJCQl2YWwgPSAwOwoJCWdwaW9fYml0cygweDA4ODAsIHZhbCk7CiAgICAgICAgICAgICAgICBpZiAoYnR0dl9ncGlvKQogICAgICAgICAgICAgICAgICAgICAgICBidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJsdDk0MTUiKTsKICAgICAgICB9IGVsc2UgewoJCS8qIGF1dG9kZXRlY3QgZG9lc24ndCB3b3JrIHdpdGggdGhpcyBjYXJkIDotKCAqLwogICAgICAgICAgICAgICAgdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KfQoKLy8gVERBOTgyMSBvbiBUZXJyYVRWKyBCdDg0OCwgQnQ4NzgKc3RhdGljIHZvaWQKdGVycmF0dl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCBjb24gPSAwOwoKCWlmIChzZXQpIHsKCQlncGlvX2lub3V0KDB4MTgwMDAwLDB4MTgwMDAwKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDA4MDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgxODAwMDA7CgkJZ3Bpb19iaXRzKDB4MTgwMDAwLCBjb24pOwoJCWlmIChidHR2X2dwaW8pCgkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInRlcnJhdHYiKTsKCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgpzdGF0aWMgdm9pZAp3aW5mYXN0MjAwMF9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGxvbmcgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJLypidG9yICgweGMzMjAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOyovCgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQkJLyogTW9ubyAqLwoJCQl2YWwgPSAweDQyMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQkvKiBNb25vICovCgkJCXZhbCA9IDB4NDIwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCS8qIFNBUCAqLwoJCQl2YWwgPSAweDQxMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykJLyogU3RlcmVvICovCgkJCXZhbCA9IDB4MDIwMDAwOwoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4NDMwMDAwLCB2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwid2luZmFzdDIwMDAiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPgogKiBzb3VuZCBjb250cm9sIGZvciBQcm9saW5rIFBWLUJUODc4UCs5QiAoUGl4ZWxWaWV3IFBsYXlUViBQcm8gRk0rTklDQU0KICogcmV2aXNpb24gOUIgaGFzIG9uLWJvYXJkIFREQTk4NzRBIHNvdW5kIGRlY29kZXIpLgogKgogKiBOb3RlOiBUaGVyZSBhcmUgY2FyZCB2YXJpYW50cyB3aXRob3V0IHRkYTk4NzRhLiBGb3JjaW5nIHRoZSAic3RlcmVvIHNvdW5kIHJvdXRlIgogKiAgICAgICB3aWxsIG11dGUgdGhpcyBjYXJkcy4KICovCnN0YXRpYyB2b2lkCnB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsID0gMDsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDE7CgkJfQoJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CgkJCXZhbCA9IDB4MDI7CgkJfQoJCWlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MDMsdmFsKTsKCQkJaWYgKGJ0dHZfZ3BpbykKCQkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsInB2YnQ4NzhwOWIiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKLyoKICogRGFyaXVzeiBLb3dhbGV3c2tpIDxkYXJla2tAYXV0b21leC5wbD4KICogc291bmQgY29udHJvbCBmb3IgRmx5VmlkZW8gMjAwMFMgKHdpdGggdGRhOTg3NCBkZWNvZGVyKQogKiBiYXNlZCBvbiBwdmJ0ODc4cDliX2F1ZGlvKCkgLSB0aGlzIGlzIG5vdCB0ZXN0ZWQsIHBsZWFzZSBmaXghISEKICovCnN0YXRpYyB2b2lkCmZ2MjAwMHNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7Cgl1bnNpZ25lZCBpbnQgdmFsID0gMHhmZmZmOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewoJCQl2YWwgPSAweDAwMDA7CgkJfQoJCWlmICgodi0+bW9kZSAmIChWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyKSkKCQkgICAgfHwgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pKSB7CgkJCXZhbCA9IDB4MTA4MDsgLy8tZGstPz8/OiAweDA4ODAsIDB4MDA4MCwgMHgxODAwIC4uLgoJCX0KCQlpZiAodmFsICE9IDB4ZmZmZikgewoJCQlncGlvX2JpdHMoMHgxODAwLCB2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwiZnYyMDAwcyIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBzb3VuZCBjb250cm9sIGZvciBDYW5vcHVzIFdpbkRWUiBQQ0kKICogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4KICovCnN0YXRpYyB2b2lkCndpbmR2cl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKICAgICAgICB1bnNpZ25lZCBsb25nIHZhbCA9IDA7CgogICAgICAgIGlmIChzZXQpIHsKICAgICAgICAgICAgICAgIGlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgwNDAwMDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAwOwogICAgICAgICAgICAgICAgaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMHgxMDAwMDA7CiAgICAgICAgICAgICAgICBpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKICAgICAgICAgICAgICAgIGlmICh2YWwpIHsKCQkJZ3Bpb19iaXRzKDB4MTQwMDAwLCB2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnR0dl9ncGlvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0dHZfZ3Bpb190cmFja2luZyhidHYsIndpbmR2ciIpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKICAgICAgICB9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIEFELVRWSzUwMwogKiBIaXJvc2hpIFRha2VrYXdhIDxzaWFuQGJpZy5vci5qcD4KICovCnN0YXRpYyB2b2lkCmFkdHZrNTAzX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDB4ZmZmZmZmOwoKCS8vYnRhb3IoMHgxZTAwMDAsIH4weDFlMDAwMCwgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWlmIChzZXQpIHsKCQkvL2J0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDAwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDAwMTgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJY29uID0gMHgwMDA2MDAwMDsKCQlpZiAoY29uICE9IDB4ZmZmZmZmKSB7CgkJCWdwaW9fYml0cygweDFlMDAwMCxjb24pOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwgImFkdHZrNTAzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qIFJlbW90ZVZpc2lvbiBNWCAocnY2MDUpIG11eHNlbCBoZWxwZXIgW01pZ3VlbCBGcmVpdGFzXQogKgogKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJ2NjA1IGRvbid0IHVzZSBhIG5vcm1hbCBtdWx0aXBsZXgsIGJ1dCBhIGNyb3NzcG9pbnQKICogc3dpdGNoIGluc3RlYWQgKENEMjJNMzQ5NEUpLiBUaGlzIElDIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjb25uZWN0aW9ucwogKiBiZXR3ZWVuIFhuIChpbnB1dCkgYW5kIFluIChvdXRwdXQpIHBpbnMuIFdlIG5lZWQgdG8gY2xlYXIgYW55IGV4aXN0aW5nCiAqIGNvbm5lY3Rpb24gcHJpb3IgdG8gZXN0YWJsaXNoIGEgbmV3IG9uZSwgcHVsc2luZyB0aGUgU1RST0JFIHBpbi4KICoKICogVGhlIGJvYXJkIGhhcmR3aXJlIFkwICh4cG9pbnQpIHRvIE1VWDEgYW5kIE1VWE9VVCB0byBZaW4uCiAqIEdQSU8gcGlucyBhcmUgd2lyZWQgYXM6CiAqICBHUElPWzA6M10gLSBBWFswOjNdICh4cG9pbnQpIC0gUDFbMDozXSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzQ6Nl0gLSBBWVswOjJdICh4cG9pbnQpIC0gUDFbNDo2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzddICAgLSBEQVRBICh4cG9pbnQpICAgIC0gUDFbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s4XSAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzVdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bOV0gICAtIFJFU0VUICh4cG9pbnQpICAgLSBQM1s2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzEwXSAgLSBTVFJPQkUgKHhwb2ludCkgIC0gUDNbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJTlRSICAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzRdIChtaWNyb2NvbnRyb2xlcikKICoKICogVGhlIG1pY3JvY29udHJvbGVyIGlzIGEgODBDMzIgbGlrZS4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB4cG9pbnQKICogY29uZmlndXJhdGlvbiBlaXRoZXIgZGlyZWN0bHkgKGFzIHdlIGFyZSBkb2luZykgb3IgdXNpbmcgdGhlIG1pY3JvY29udHJvbGVyCiAqIHdoaWNoIGlzIGFsc28gd2lyZWQgdG8gSTJDIGludGVyZmFjZS4gSSBoYXZlIG5vIGZ1cnRoZXIgaW5mbyBvbiB0aGUKICogbWljcm9jb250cm9sZXIgZmVhdHVyZXMsIG9uZSB3b3VsZCBuZWVkIHRvIGRpc2Fzc2VtYmx5IHRoZSBmaXJtd2FyZS4KICogbm90ZTogdGhlIHZlbmRvciByZWZ1c2VkIHRvIGdpdmUgYW55IGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvZHVjdCwgYWxsCiAqICAgICAgIHRoYXQgc3R1ZmYgd2FzIGZvdW5kIHVzaW5nIGEgbXVsdGltZXRlciEgOikKICovCnN0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHJlc2V0IGFsbCBjb25lY3Rpb25zICovCglncGlvX2JpdHMoMHgyMDAsMHgyMDApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4MjAwLDB4MDAwKTsKCW1kZWxheSgxKTsKCgkvKiBjcmVhdGUgYSBuZXcgY29uZWN0aW9uICovCglncGlvX2JpdHMoMHg0ODAsMHgwODApOwoJZ3Bpb19iaXRzKDB4NDgwLDB4NDgwKTsKCW1kZWxheSgxKTsKCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CgltZGVsYXkoMSk7Cn0KCi8qIFRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiBtdXhzZWwgaGVscGVyIFtDaHJpcyBGYW5uaW5nXQogKgogKiBUaGUgQ1MxNiAoYXZhaWxhYmxlIG9uIGVCYXkgY2hlYXApIGlzIGEgUENJIGJvYXJkIHdpdGggZm91ciBGdXNpb24KICogODc4QSBjaGlwcywgYSBQQ0kgYnJpZGdlLCBhbiBBdG1lbCBtaWNyb2NvbnRyb2xsZXIsIGZvdXIgc3luYyBzZXBlcmF0b3IKICogY2hpcHMsIHRlbiBlaWdodCBpbnB1dCBhbmFsb2cgbXVsdGlwbGV4b3JzLCBhIG5vdCBjaGlwIGFuZCBhIGZldwogKiBvdGhlciBjb21wb25lbnRzLgogKgogKiAxNiBpbnB1dHMgb24gYSBzZWNvbmRhcnkgYnJhY2tldCBhcmUgcHJvdmlkZWQgYW5kIGNhbiBiZSBzZWxlY3RlZAogKiBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgY2FwdHVyZSBjaGlwcy4gIFR3byBvZiB0aGUgZWlnaHQgaW5wdXQKICogbXVsdGlwbGV4b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBmcm9tIGFueSBvZiB0aGUgMTYgaW5wdXQgc2lnbmFscy4KICoKICogVW5zdXBwb3J0ZWQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzOgogKiAgLiBBIHZpZGVvIG91dHB1dCBtb25pdG9yIG9uIHRoZSBzZWNvbmRhcnkgYnJhY2tldCBjYW4gYmUgc2VsZWN0ZWQgZnJvbQogKiAgICBvbmUgb2YgdGhlIDg3OEEgY2hpcHMuCiAqICAuIEFub3RoZXIgcGFzc3Rocm91Z2ggYnV0IEkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBpbnZlc3RpZ2F0aW5nIGl0LgogKiAgLiBEaWdpdGFsIEkvTyAobG9naWMgbGV2ZWwgY29ubmVjdGVkIHRvIEdQSU8pIGlzIGF2YWlsYWJsZSBmcm9tIGFuCiAqICAgIG9uYm9hcmQgaGVhZGVyLgogKgogKiBUaGUgb24gY2hpcCBpbnB1dCBtdXggc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMi4KICogR1BJT1sxNjoxOV0gLSBWaWRlbyBpbnB1dCBzZWxlY3Rpb24KICogR1BJT1swOjNdICAgLSBWaWRlbyBvdXRwdXQgbW9uaXRvciBzZWxlY3QgKG9ubHkgYXZhaWxhYmxlIGZyb20gb25lIDg3OEEpCiAqIEdQSU9bPzo/XSAgIC0gRGlnaXRhbCBJL08uCiAqCiAqIFRoZXJlIGlzIGFuIEFUTUVMIG1pY3JvY29udHJvbGxlciB3aXRoIGFuIDgwMzEgY29yZSBvbiBib2FyZC4gIEkgaGF2ZSBub3QKICogZGV0ZXJtaW5lZCB3aGF0IGZ1bmN0aW9uIChpZiBhbnkpIGl0IHByb3ZpZGVzLiAgV2l0aCB0aGUgbWljcm9jb250cm9sbGVyCiAqIGFuZCBzeW5jIHNlcGVyYXRvciBjaGlwcyBhIGd1ZXNzIGlzIHRoYXQgaXQgbWlnaHQgaGF2ZSB0byBkbyB3aXRoIHZpZGVvCiAqIHN3aXRjaGluZyBhbmQgbWF5YmUgc29tZSBkaWdpdGFsIEkvTy4KICovCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvKiB2aWRlbyBtdXggKi8KCWdwaW9fYml0cygweDBmMDAwMCwgaW5wdXQgPDwgMTYpOwp9CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKiBlbmFibGUgZ3BpbyBiaXRzLCBtYXNrIG9idGFpbmVkIHZpYSBidFNweSAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwZjdmZmYpOwoJZ3Bpb193cml0ZSgweDBmN2ZmZik7Cn0KCi8qCiAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZm9yIHRoZSBLb2RpY29tLTQ0MDByIGdldCBhIGxpdHRsZSBtaW5kLXR3aXN0aW5nLgogKiBUaGVyZSBpcyBhICJtYXN0ZXIiIGNvbnRyb2xsZXIgYW5kIHRocmVlICJzbGF2ZSIgY29udHJvbGxlcnMsIHRvZ2V0aGVyCiAqIGFuIGFuYWxvZyBzd2l0Y2ggd2hpY2ggY29ubmVjdHMgYW55IG9mIDE2IGNhbWVyYXMgdG8gYW55IG9mIHRoZSBCVDg3QSdzLgogKiBUaGUgYW5hbG9nIHN3aXRjaCBpcyBjb250cm9sbGVkIGJ5IHRoZSAibWFzdGVyIiwgYnV0IHRoZSBkZXRlY3Rpb24gb3JkZXIKICogb2YgdGhlIGZvdXIgQlQ4NzhBIGNoaXBzIGlzIGluIGFuIG9yZGVyIHdoaWNoIEkganVzdCBkb24ndCB1bmRlcnN0YW5kLgogKiBUaGUgIm1hc3RlciIgaXMgYWN0dWFsbHkgdGhlIHNlY29uZCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkLiAgVGhlCiAqIGxvZ2ljIG9uIHRoZSBib2FyZCB1c2VzIGxvZ2ljYWwgbnVtYmVycyBmb3IgdGhlIDQgY29udHJvbGVycywgYnV0CiAqIHRob3NlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UuICBXaGVuIHdvcmtpbmcKICogd2l0aCB0aGUgYW5hbG9nIHN3aXRjaCwgd2UgbmVlZCB0byAibWFwIiBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UKICogb3ZlciB0byB0aGUgYm9hcmQncyBsb2dpY2FsIGNvbnRyb2xsZXIgbnVtYmVyLiAgVGhpcyBtYXBwaW5nIHNlcXVlbmNlCiAqIGlzIHszLCAwLCAyLCAxfSwgaS5lLiB0aGUgZmlyc3QgY29udHJvbGxlciB0byBiZSBkZXRlY3RlZCBpcyBsb2dpY2FsCiAqIHVuaXQgMywgdGhlIHNlY29uZCAod2hpY2ggaXMgdGhlIG1hc3RlcikgaXMgbG9naWNhbCB1bml0IDAsIGV0Yy4KICogV2UgbmVlZCB0byBtYWludGFpbiB0aGUgc3RhdHVzIG9mIHRoZSBhbmFsb2cgc3dpdGNoICh3aGljaCBvZiB0aGUgMTYKICogY2FtZXJhcyBpcyBjb25uZWN0ZWQgdG8gd2hpY2ggb2YgdGhlIDQgY29udHJvbGxlcnMpLiAgUmF0aGVyIHRoYW4KICogYWRkIHRvIHRoZSBidHR2IHN0cnVjdHVyZSBmb3IgdGhpcywgd2UgdXNlIHRoZSBkYXRhIHJlc2VydmVkIGZvcgogKiB0aGUgbWJveCAodW51c2VkIGZvciB0aGlzIGNhcmQgdHlwZSkuCiAqLwoKLyoKICogRmlyc3QgYSByb3V0aW5lIHRvIHNldCB0aGUgYW5hbG9nIHN3aXRjaCwgd2hpY2ggY29udHJvbHMgd2hpY2ggY2FtZXJhCiAqIGlzIHJvdXRlZCB0byB3aGljaCBjb250cm9sbGVyLiAgVGhlIHN3aXRjaCBjb21wcmlzZXMgYW4gWC1hZGRyZXNzCiAqIChncGlvIGJpdHMgMC0zLCByZXByZXNlbnRpbmcgdGhlIGNhbWVyYSwgcmFuZ2luZyBmcm9tIDAtMTUpLCBhbmQgYQogKiBZLWFkZHJlc3MgKGdwaW8gYml0cyA0LTYsIHJlcHJlc2VudGluZyB0aGUgY29udHJvbGxlciwgcmFuZ2luZyBmcm9tIDAtMykuCiAqIEEgZGF0YSB2YWx1ZSAoZ3BpbyBiaXQgNykgb2YgJzEnIGVuYWJsZXMgdGhlIHN3aXRjaCwgYW5kICcwJyBkaXNhYmxlcwogKiB0aGUgc3dpdGNoLiAgQSBTVFJPQkUgYml0IChncGlvIGJpdCA4KSBsYXRjaGVzIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlCiAqIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhlIGlkZWEgaXMgdG8gc2V0IHRoZSBhZGRyZXNzIGFuZCBkYXRhLCB0aGVuIGJyaW5nCiAqIFNUUk9CRSBoaWdoLCBhbmQgZmluYWxseSBicmluZyBTVFJPQkUgYmFjayB0byBsb3cuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeGFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHlhZGRyLAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBkYXRhKSB7Cgl1bnNpZ25lZCBpbnQgdWRhdGE7CgoJdWRhdGEgPSAoZGF0YSA8PCA3KSB8ICgoeWFkZHImMykgPDwgNCkgfCAoeGFkZHImMHhmKTsKCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogd3JpdGUgQUREUiBhbmQgREFUICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhIHwgKDEgPDwgOCkpOwkvKiBzdHJvYmUgaGlnaCAqLwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiBzdHJvYmUgbG93ICovCn0KCi8qCiAqIE5leHQgdGhlIG11eCBzZWxlY3QuICBCb3RoIHRoZSAibWFzdGVyIiBhbmQgInNsYXZlIiAnY2FyZHMnIChjb250cm9sbGVycykKICogdXNlIHRoaXMgcm91dGluZS4gIFRoZSByb3V0aW5lIGZpbmRzIHRoZSAibWFzdGVyIiBmb3IgdGhlIGNhcmQsIG1hcHMKICogdGhlIGNvbnRyb2xsZXIgbnVtYmVyIGZyb20gdGhlIGRldGVjdGVkIHBvc2l0aW9uIG92ZXIgdG8gdGhlIGxvZ2ljYWwKICogbnVtYmVyLCB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8gdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBob3VzZWtlZXBzCiAqIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzd2l0Y2ggaW5mb3JtYXRpb24uICBUaGUgcGFyYW1ldGVyICdpbnB1dCcgaXMgdGhlCiAqIHJlcXVlc3RlZCBjYW1lcmEgbnVtYmVyICgwIC0gMTUpLgogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWNoYXIgKnN3X3N0YXR1czsKCWludCB4YWRkciwgeWFkZHI7CglzdHJ1Y3QgYnR0diAqbWN0bHI7CglzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBbNF0gPSB7MywgMCwgMiwgMX07CgoJbWN0bHIgPSBtYXN0ZXJbYnR2LT5jLm5yXTsKCWlmIChtY3RsciA9PSBOVUxMKSB7CS8qIGlnbm9yZSBpZiBtYXN0ZXIgbm90IHlldCBkZXRlY3RlZCAqLwoJCXJldHVybjsKCX0KCXlhZGRyID0gKGJ0di0+Yy5uciAtIG1jdGxyLT5jLm5yICsgMSkgJiAzOyAvKiB0aGUgJyYnIGlzIGZvciBzYWZldHkgKi8KCXlhZGRyID0gbWFwW3lhZGRyXTsKCXN3X3N0YXR1cyA9IChjaGFyICopKCZtY3Rsci0+bWJveF93ZSk7Cgl4YWRkciA9IGlucHV0ICYgMHhmOwoJLyogQ2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIvY2FtZXJhIHBhaXIgaGFzIGNoYW5nZWQsIGVsc2UgaWdub3JlICovCglpZiAoc3dfc3RhdHVzW3lhZGRyXSAhPSB4YWRkcikKCXsKCQkvKiAib3BlbiIgdGhlIG9sZCBzd2l0Y2gsICJjbG9zZSIgdGhlIG5ldyBvbmUsIHNhdmUgdGhlIG5ldyAqLwoJCWtvZGljb200NDAwcl93cml0ZShtY3Rsciwgc3dfc3RhdHVzW3lhZGRyXSwgeWFkZHIsIDApOwoJCXN3X3N0YXR1c1t5YWRkcl0gPSB4YWRkcjsKCQlrb2RpY29tNDQwMHJfd3JpdGUobWN0bHIsIHhhZGRyLCB5YWRkciwgMSk7Cgl9Cn0KCi8qCiAqIER1cmluZyBpbml0aWFsaXNhdGlvbiwgd2UgbmVlZCB0byByZXNldCB0aGUgYW5hbG9nIHN3aXRjaC4gIFdlCiAqIGFsc28gcHJlc2V0IHRoZSBzd2l0Y2ggdG8gbWFwIHRoZSA0IGNvbm5lY3RvcnMgb24gdGhlIGNhcmQgdG8gdGhlCiAqICp1c2VyJ3MqIChzZWUgYWJvdmUgZGVzY3JpcHRpb24gb2Yga29kaWNvbTQ0MDByX211eHNlbCkgY2hhbm5lbHMKICogMCB0aHJvdWdoIDMKICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCWNoYXIgKnN3X3N0YXR1cyA9IChjaGFyICopKCZidHYtPm1ib3hfd2UpOwoJaW50IGl4OwoKCWdwaW9faW5vdXQoMHgwMDAzZmYsIDB4MDAwM2ZmKTsKCWdwaW9fd3JpdGUoMSA8PCA5KTsJLyogcmVzZXQgTVVYICovCglncGlvX3dyaXRlKDApOwoJLyogUHJlc2V0IGNhbWVyYSAwIHRvIHRoZSA0IGNvbnRyb2xsZXJzICovCglmb3IgKGl4PTA7IGl4PDQ7IGl4KyspIHsKCQlzd19zdGF0dXNbaXhdID0gaXg7CgkJa29kaWNvbTQ0MDByX3dyaXRlKGJ0diwgaXgsIGl4LCAxKTsKCX0KCS8qCgkgKiBTaW5jZSB0aGlzIGlzIHRoZSAibWFzdGVyIiwgd2UgbmVlZCB0byBzZXQgdXAgdGhlCgkgKiBvdGhlciB0aHJlZSBjb250cm9sbGVyIGNoaXBzJyBwb2ludGVycyB0byB0aGlzIHN0cnVjdHVyZQoJICogZm9yIGxhdGVyIHVzZSBpbiB0aGUgbXV4c2VsIHJvdXRpbmUuCgkgKi8KCWlmICgoYnR2LT5jLm5yPDEpIHx8IChidHYtPmMubnI+QlRUVl9NQVgtMykpCgkgICAgcmV0dXJuOwoJbWFzdGVyW2J0di0+Yy5uci0xXSA9IGJ0djsKCW1hc3RlcltidHYtPmMubnJdICAgPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucisyXSA9IGJ0djsKfQoKLy8gVGhlIEdyYW5kdGVjIFgtR3VhcmQgZnJhbWVncmFiYmVyIGNhcmQgdXNlcyB0d28gRHVhbCA0LWNoYW5uZWwKLy8gdmlkZW8gbXVsdGlwbGV4ZXJzIHRvIHByb3ZpZGUgdXAgdG8gMTYgdmlkZW8gaW5wdXRzLiBUaGVzZQovLyBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQovLyBidDg3OC4gVGhlIG11bHRpcGxleGVycyBwcm9iYWJseSBQZXJpY29tIFBJNVYzMzFRIG9yIHNpbWlsYXIuCgovLyB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCi8vIHl5eTEgaXMgcGluIHl5eSBvZiBtdWx0aXBsZXhlciBVMgoKI2RlZmluZSBFTkEwICAgIDB4MDEKI2RlZmluZSBFTkIwICAgIDB4MDIKI2RlZmluZSBFTkExICAgIDB4MDQKI2RlZmluZSBFTkIxICAgIDB4MDgKCiNkZWZpbmUgSU4xMCAgICAweDEwCiNkZWZpbmUgSU4wMCAgICAweDIwCiNkZWZpbmUgSU4xMSAgICAweDQwCiNkZWZpbmUgSU4wMSAgICAweDgwCgpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gewogICAgICAgICAgICAgICAgRU5CMCwgRU5CMHxJTjAwLCBFTkIwfElOMTAsIEVOQjB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5BMCwgRU5BMHxJTjAwLCBFTkEwfElOMTAsIEVOQTB8SU4wMHxJTjEwLAogICAgICAgICAgICAgICAgRU5CMSwgRU5CMXxJTjAxLCBFTkIxfElOMTEsIEVOQjF8SU4wMXxJTjExLAogICAgICAgICAgICAgICAgRU5BMSwgRU5BMXxJTjAxLCBFTkExfElOMTEsIEVOQTF8SU4wMXxJTjExLAoJfTsKCWdwaW9fd3JpdGUobWFza3NbaW5wdXQlMTZdKTsKfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKlRoaXMgaXMgdGhlIHZpZGVvIGlucHV0IHJlZGlyZWN0aW9uIGZvbmN0aW9uYWxpdHkgOiBJIERJRCBOT1QgVVNFRCBJVC4gKi8KCWJ0d3JpdGUgKDB4MDg8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE5XSBbPT0+IDQwNTMgQitDXSBzZXQgdG8gMSAqLwoJYnR3cml0ZSAoMHgwNDw8MTYsQlQ4NDhfR1BJT19EQVRBKTsvKkdQSU9bMThdIFs9PT4gNDA1MyBBXSAgc2V0IHRvIDEqLwp9CnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwgKHN0cnVjdCBidHR2KiBidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoKCWRwcmludGsgKEtFUk5fREVCVUcgImJ0dHYlZCA6IHBpY29sb190ZXRyYV9tdXhzZWwgPT4gIGlucHV0ID0gJWRcbiIsYnR2LT5jLm5yLGlucHV0KTsKCS8qSnVzdCBzZXQgdGhlIHJpZ2h0IHBhdGggaW4gdGhlIGFuYWxvZyBtdWx0aXBsZXhlcnMgOiBjaGFubmVsIDEgLT4gNCA9PT4gQW5hbG9nIE11eCA9PT4gTVVYMCovCgkvKkdQSU9bMjBdJkdQSU9bMjFdIHVzZWQgdG8gY2hvb3NlIHRoZSByaWdodCBpbnB1dCovCglidHdyaXRlIChpbnB1dDw8MjAsQlQ4NDhfR1BJT19EQVRBKTsKCn0KCi8qCiAqIGl2YzEyMF9tdXhzZWwgW0FkZGVkIGJ5IEFsYW4gR2FyZmllbGQgPGFsYW5AZnJvbW9yYml0LmNvbT5dCiAqCiAqIFRoZSBJVkMxMjBHIHNlY3VyaXR5IGNhcmQgaGFzIDQgaTJjIGNvbnRyb2xsZWQgVERBODU0MCBtYXRyaXgKICogc3dpY2hlcnMgdG8gcHJvdmlkZSAxNiBjaGFubmVscyB0byBNVVgwLiBUaGUgVERBODU0MCdzIGhhdmUKICogNCBpbmRlcGVkYW50IG91dHB1dHMgYW5kIGFzIHN1Y2ggdGhlIElWQzEyMEcgYWxzbyBoYXMgdGhlCiAqIG9wdGlvbmFsICJNb25pdG9yIE91dCIgYnVzLiBUaGlzIGFsbG93cyB0aGUgY2FyZCB0byBiZSBsb29raW5nCiAqIGF0IG9uZSBpbnB1dCB3aGlsZSB0aGUgbW9uaXRvciBpcyBsb29raW5nIGF0IGFub3RoZXIuCiAqCiAqIFNpbmNlIEkndmUgY291bGRuJ3QgYmUgYm90aGVyZWQgZmlndXJpbmcgb3V0IGhvdyB0byBhZGQgYW4KICogaW5kZXBlbmRhbnQgbXV4c2VsIGZvciB0aGUgbW9uaXRvciBidXMsIEkndmUganVzdCBzZXQgaXQgdG8KICogd2hhdGV2ZXIgdGhlIGNhcmQgaXMgbG9va2luZyBhdC4KICoKICogIE9VVDAgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gTVVYMCAgICAgICAgICgweDAzKQogKiAgT1VUMSBvZiB0aGUgVERBODU0MCdzIGlzIGNvbm5lY3RlZCB0byAiTW9uaXRvciBPdXQiICAgICAgICAoMHgwQykKICoKICogIFREQTg1NDBfQUxUMyBJTjAtMyA9IENoYW5uZWwgMTMgLSAxNiAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNCBJTjAtMyA9IENoYW5uZWwgMSAtIDQgICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNSBJTjAtMyA9IENoYW5uZWwgNSAtIDggICAgICAgICAoMHgwMykKICogIFREQTg1NDBfQUxUNiBJTjAtMyA9IENoYW5uZWwgOSAtIDEyICAgICAgICAgICAgICAgICgweDAzKQogKgogKi8KCi8qIEFsbCA3IHBvc3NpYmxlIHN1Yi1pZHMgZm9yIHRoZSBUREE4NTQwIE1hdHJpeCBTd2l0Y2hlciAqLwojZGVmaW5lIEkyQ19UREE4NTQwICAgICAgICAweDkwCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMSAgIDB4OTIKI2RlZmluZSBJMkNfVERBODU0MF9BTFQyICAgMHg5NAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDMgICAweDk2CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNCAgIDB4OTgKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ1ICAgMHg5YQojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDYgICAweDljCgpzdGF0aWMgdm9pZCBpdmMxMjBfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJLy8gU2ltcGxlIG1hdGhzCglpbnQga2V5ID0gaW5wdXQgJSA0OwoJaW50IG1hdHJpeCA9IGlucHV0IC8gNDsKCglkcHJpbnRrKCJidHR2JWQ6IGl2YzEyMF9tdXhzZWw6IElucHV0IC0gJTAyZCB8IFREQSAtICUwMmQgfCBJbiAtICUwMmRcbiIsCgkJYnR2LT5jLm5yLCBpbnB1dCwgbWF0cml4LCBrZXkpOwoKCS8vIEhhbmRsZXMgdGhlIGlucHV0IHNlbGVjdGlvbiBvbiB0aGUgVERBODU0MCdzCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUMywgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAzKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNCwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAwKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMCwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IChrZXkgfCBrZXkgPDwgMikgOiAweDAwKSwgMSk7CgoJLy8gSGFuZGxlcyB0aGUgb3V0cHV0IGVuYWJsZXMgb24gdGhlIFREQTg1NDAncwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMTMgLSAxNgoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAweDAzIDogMHgwMCksIDEpOyAgLy8gMS00CglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNSwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAxKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvLyA1LTgKCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ2LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDIpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8vIDktMTIKCgkvLyBTZWxlY3RzIE1VWDAgZm9yIGlucHV0IG9uIHRoZSA4NzgKCWJ0YW9yKCgwKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwp9CgoKLyogUFhDMjAwIG11eHNlbCBoZWxwZXIKICogbHVrZUBzeXNlbmcuYW51LmVkdS5hdQogKiBhbm90aGVyIHRyYW5zcGxhbnQKICogZnJvbSBBbGVzc2FuZHJvIFJ1YmluaSAocnViaW5pQGxpbnV4Lml0KQogKgogKiBUaGVyZSBhcmUgNCBraW5kcyBvZiBjYXJkczoKICogUFhDMjAwTCB3aGljaCBpcyBidDg0OAogKiBQWEMyMDBGIHdoaWNoIGlzIGJ0ODQ4IHdpdGggUElDIGNvbnRyb2xsaW5nIG11eAogKiBQWEMyMDBBTCB3aGljaCBpcyBidDg3OAogKiBQWEMyMDBBRiB3aGljaCBpcyBidDg3OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICovCiNkZWZpbmUgUFhfQ0ZHX1BYQzIwMEYgMHgwMQojZGVmaW5lIFBYX0ZMQUdfUFhDMjAwQSAgMHgwMDAwMTAwMCAvKiBhIHB4YzIwMEEgaXMgYnQtODc4IGJhc2VkICovCiNkZWZpbmUgUFhfSTJDX1BJQyAgICAgICAweDBmCiNkZWZpbmUgUFhfUFhDMjAwQV9DQVJESUQgMHgyMDBhMTI5NQojZGVmaW5lIFBYX0kyQ19DTURfQ0ZHICAgMHgwMAoKc3RhdGljIHZvaWQgUFhDMjAwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKICAgICAgICBpbnQgcmM7Cglsb25nIG11eDsKCWludCBiaXRtYXNrOwogICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdOwoKCS8qIFJlYWQgUElDIGNvbmZpZyB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhIFBYQzIwMEYgKi8KCS8qIFBYX0kyQ19DTURfQ0ZHKi8KCWJ1ZlswXT0wOwoJYnVmWzFdPTA7CglyYz1idHR2X0kyQ1dyaXRlKGJ0diwoUFhfSTJDX1BJQzw8MSksYnVmWzBdLGJ1ZlsxXSwxKTsKCWlmIChyYykgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBwaWMgY2ZnIHdyaXRlIGZhaWxlZDolZFxuIiwgYnR2LT5jLm5yLHJjKTsKCSAgLyogbm90IFBYQyA/IGRvIG5vdGhpbmcgKi8KCSAgcmV0dXJuOwoJfQoKCXJjPWJ0dHZfSTJDUmVhZChidHYsKFBYX0kyQ19QSUM8PDEpLE5VTEwpOwoJaWYgKCEocmMgJiBQWF9DRkdfUFhDMjAwRikpIHsKCSAgcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogUFhDMjAwX211eHNlbDogbm90IFBYQzIwMEYgcmM6JWQgXG4iLCBidHYtPmMubnIscmMpOwoJICByZXR1cm47Cgl9CgoKCS8qIFRoZSBtdWx0aXBsZXhlciBpbiB0aGUgMjAwRiBpcyBoYW5kbGVkIGJ5IHRoZSBHUElPIHBvcnQgKi8KCS8qIGdldCBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBpbnB1dHMgICovCgkvKiAgbXV4ID0gYnR0dl90dmNhcmRzW2J0di0+dHlwZV0ubXV4c2VsW2lucHV0XSAmIDM7ICovCgkvKiAqKiBub3QgbmVlZGVkIT8gICAqLwoJbXV4ID0gaW5wdXQ7CgoJLyogbWFrZSBzdXJlIG91dHB1dCBwaW5zIGFyZSBlbmFibGVkICovCgkvKiBiaXRtYXNrPTB4MzBmOyAqLwoJYml0bWFzaz0weDMwMjsKCS8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIFBYQzIwMEEgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpICB7CgkgICBiaXRtYXNrIF49IDB4MTgwOyAvKiB1c2UgNyBhbmQgOSwgbm90IDggYW5kIDkgKi8KCSAgIGJpdG1hc2sgfD0gNzw8NDsgLyogdGhlIERBQyAqLwoJfQoJYnR3cml0ZShiaXRtYXNrLCBCVDg0OF9HUElPX09VVF9FTik7CgoJYml0bWFzayA9IGJ0cmVhZChCVDg0OF9HUElPX0RBVEEpOwogCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MzAwKSB8ICgobXV4ICYgMykgPDwgOCk7CglidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKCgkvKgoJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCgkgKiBBY3R1YWxseSwgc2luY2UgaXQncyBvayBhdCBsb2FkIHRpbWUsIGJldHRlciBub3QgbWVzc2luZwoJICogd2l0aCB0aGVzZSBiaXRzIChvbiBQWEMyMDBBRiB5b3UgbmVlZCB0byBzZXQgbXV4IDIgaGVyZSkKCSAqCgkgKiBuZWVkZWQgYmVjYXVzZSBidHR2LWRyaXZlciBzZXRzIG11eCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgkgKi8KIAlpZiAoYnR2LT5jYXJkaWQgPT0gUFhfUFhDMjAwQV9DQVJESUQpCgkgIGJ0YW9yKDI8PDUsIH5CVDg0OF9JRk9STV9NVVhTRUwsIEJUODQ4X0lGT1JNKTsKCWVsc2UgLyogb2xkZXIgZGV2aWNlICovCgkgIGJ0YW5kKH5CVDg0OF9JRk9STV9NVVhTRUwsQlQ4NDhfSUZPUk0pOwoKCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IHNldHRpbmcgaW5wdXQgY2hhbm5lbCB0bzolZFxuIiwgYnR2LT5jLm5yLChpbnQpbXV4KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogbW90aGVyYm9hcmQgY2hpcHNldCBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnZvaWQgX19kZXZpbml0IGJ0dHZfY2hlY2tfY2hpcHNldCh2b2lkKQp7CglpbnQgcGNpcGNpX2ZhaWwgPSAwOwoJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CgoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfRkFJTCkKCQlwY2lwY2lfZmFpbCA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIChQQ0lQQ0lfVFJJVE9OfFBDSVBDSV9OQVRPTUF8UENJUENJX1ZJQUVUQkYpKQoJCXRyaXRvbjEgPSAxOwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfVlNGWCkKCQl2c2Z4ID0gMTsKI2lmZGVmIFBDSVBDSV9BTElNQUdJSwoJaWYgKHBjaV9wY2lfcHJvYmxlbXMgJiBQQ0lQQ0lfQUxJTUFHSUspCgkJbGF0ZW5jeSA9IDB4MEE7CiNlbmRpZgoKCgkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCglpZiAodHJpdG9uMSkKCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZSBuZWVkcyBFVEJGIGVuYWJsZWQuXG4iKTsKCWlmICh2c2Z4KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIFZTRlggZW5hYmxlZC5cbiIpOwoJaWYgKHBjaXBjaV9mYWlsKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogQlQ4NDggYW5kIHlvdXIgY2hpcHNldCBtYXkgbm90IHdvcmsgdG9nZXRoZXIuXG4iKTsKCQlpZiAoIW5vX292ZXJsYXkpIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogb3ZlcmxheSB3aWxsIGJlIGRpc2FibGVkLlxuIik7CgkJCW5vX292ZXJsYXkgPSAxOwoJCX0gZWxzZSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHY6IG92ZXJsYXkgZm9yY2VkLiBVc2UgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzay5cbiIpOwoJCX0KCX0KCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IHBjaSBsYXRlbmN5IGZpeHVwIFslZF1cbiIsbGF0ZW5jeSk7CgoJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEsIGRldikpKSB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CgkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUzLCAmYik7CgkJaWYgKGJ0dHZfZGVidWcpCgkJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlOiA4MjQ0MUZYIE5hdG9tYSwgIgoJCQkgICAgICAgImJ1ZmNvbj0weCUwMnhcbiIsYik7Cgl9Cn0KCmludCBfX2RldmluaXQgYnR0dl9oYW5kbGVfY2hpcHNldChzdHJ1Y3QgYnR0diAqYnR2KQp7CiAJdW5zaWduZWQgY2hhciBjb21tYW5kOwoKCWlmICghdHJpdG9uMSAmJiAhdnNmeCAmJiBVTlNFVCA9PSBsYXRlbmN5KQoJCXJldHVybiAwOwoKCWlmIChidHR2X3ZlcmJvc2UpIHsKCQlpZiAodHJpdG9uMSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBFVEJGICg0MzBGWC9WUDMgY29tcGF0aWJpbHR5KVxuIixidHYtPmMubnIpOwoJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKCQlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKCX0KCglpZiAoYnR2LT5pZCA8IDg3OCkgewoJCS8qIGJ0ODQ4IChtaXMpdXNlcyBhIGJpdCBpbiB0aGUgaXJxIG1hc2sgZm9yIGV0YmYgKi8KCQlpZiAodHJpdG9uMSkKCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7Cgl9IGVsc2UgewoJCS8qIGJ0ODc4IGhhcyBhIGJpdCBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSBmb3IgaXQgKi8KICAgICAgICAgICAgICAgIHBjaV9yZWFkX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIEJUODc4X0RFVkNUUkwsICZjb21tYW5kKTsKCQlpZiAodHJpdG9uMSkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9UQkZYOwoJCWlmICh2c2Z4KQoJCQljb21tYW5kIHw9IEJUODc4X0VOX1ZTRlg7CiAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoYnR2LT5jLnBjaSwgQlQ4NzhfREVWQ1RSTCwgY29tbWFuZCk7CiAgICAgICAgfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGJ0di0+Yy5wY2ksIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXRlbmN5KTsKCXJldHVybiAwOwp9CgoKLyoKICogTG9jYWwgdmFyaWFibGVzOgogKiBjLWJhc2ljLW9mZnNldDogOAogKiBFbmQ6CiAqLwo=