LyoKCiAgICBidHR2LWNhcmRzLmMKCiAgICB0aGlzIGZpbGUgaGFzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb25zIC0gY2FyZC1zcGVjaWZpYyBzdHVmZgogICAgbGlrZSB0aGUgYmlnIHR2Y2FyZHMgYXJyYXkgZm9yIHRoZSBtb3N0IHBhcnQKCiAgICBDb3B5cmlnaHQgKEMpIDE5OTYsOTcsOTggUmFscGggIE1ldHpsZXIgKHJqa21AdGhwLnVuaS1rb2Vsbi5kZSkKCQkJICAgJiBNYXJjdXMgTWV0emxlciAobW9jbUB0aHAudW5pLWtvZWxuLmRlKQogICAgKGMpIDE5OTktMjAwMSBHZXJkIEtub3JyIDxrcmF4ZWxAZ29sZGJhY2guaW4tYmVybGluLmRlPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSAiYnR0dnAuaCIKCi8qIGZ3ZCBkZWNsICovCnN0YXRpYyB2b2lkIGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKTsKc3RhdGljIHZvaWQgYm9vdF9idDgzMihzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaGF1cHBhdWdlX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgYXZlcm1lZGlhX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgb3NwcmV5X2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIHZvaWQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyB2b2lkIGluaXRfUlRWMjQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIGx0OTQxNV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsCgkJCQkgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIGF2ZXJtZWRpYV90dl9zdGVyZW9fYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LAoJCQkJICAgICAgaW50IHNldCk7CnN0YXRpYyB2b2lkIHRlcnJhdHZfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZ3ZiY3R2M3BjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCBndmJjdHY1cGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHdpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CnN0YXRpYyB2b2lkIHB2YnQ4NzhwOWJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwpzdGF0aWMgdm9pZCB3aW5kdnJfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgYWR0dms1MDNfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KTsKc3RhdGljIHZvaWQgcnY2MDVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGVhZ2xlX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIGl2YzEyMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKCnN0YXRpYyB2b2lkIHBpY29sb190ZXRyYV9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KTsKc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dik7CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCk7CnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9pbml0KHN0cnVjdCBidHR2ICpidHYpOwoKc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KTsKCnN0YXRpYyB2b2lkIHNpZ21hU0xDX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwpzdGF0aWMgdm9pZCBzaWdtYVNRX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KTsKc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dik7CnN0YXRpYyBpbnQgdGVhNTc1N193cml0ZShzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgdmFsdWUpOwpzdGF0aWMgdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZWVwcm9tX2RhdGFbMjU2XSk7CnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9ib290KHN0cnVjdCBidHR2ICpidHYpOwoKLyogY29uZmlnIHZhcmlhYmxlcyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IHRyaXRvbjE9MDsKc3RhdGljIHVuc2lnbmVkIGludCB2c2Z4PTA7CnN0YXRpYyB1bnNpZ25lZCBpbnQgbGF0ZW5jeSA9IFVOU0VUOwppbnQgbm9fb3ZlcmxheT0tMTsKCnN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcGxsW0JUVFZfTUFYXSAgICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbQlRUVl9NQVhdICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgc3Zoc1tCVFRWX01BWF0gICA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyB1bnNpZ25lZCBpbnQgcmVtb3RlW0JUVFZfTUFYXSA9IHsgWyAwIC4uLiAoQlRUVl9NQVgtMSkgXSA9IFVOU0VUIH07CnN0YXRpYyBzdHJ1Y3QgYnR0diAgKm1hc3RlcltCVFRWX01BWF0gPSB7IFsgMCAuLi4gKEJUVFZfTUFYLTEpIF0gPSBOVUxMIH07CiNpZmRlZiBNT0RVTEUKc3RhdGljIHVuc2lnbmVkIGludCBhdXRvbG9hZCA9IDE7CiNlbHNlCnN0YXRpYyB1bnNpZ25lZCBpbnQgYXV0b2xvYWQgPSAwOwojZW5kaWYKc3RhdGljIHVuc2lnbmVkIGludCBncGlvbWFzayA9IFVOU0VUOwpzdGF0aWMgdW5zaWduZWQgaW50IGF1ZGlvYWxsID0gVU5TRVQ7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXVkaW9tdXhbNV0gPSB7IFsgMCAuLi4gNCBdID0gVU5TRVQgfTsKCi8qIGluc21vZCBvcHRpb25zICovCm1vZHVsZV9wYXJhbSh0cml0b24xLCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0odnNmeCwgICAgICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKG5vX292ZXJsYXksIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShsYXRlbmN5LCAgICBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW0oZ3Bpb21hc2ssICAgaW50LCAwNDQ0KTsKbW9kdWxlX3BhcmFtKGF1ZGlvYWxsLCAgIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbShhdXRvbG9hZCwgICBpbnQsIDA0NDQpOwoKbW9kdWxlX3BhcmFtX2FycmF5KGNhcmQsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocGxsLCAgICAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheSh0dW5lciwgICAgaW50LCBOVUxMLCAwNDQ0KTsKbW9kdWxlX3BhcmFtX2FycmF5KHN2aHMsICAgICBpbnQsIE5VTEwsIDA0NDQpOwptb2R1bGVfcGFyYW1fYXJyYXkocmVtb3RlLCAgIGludCwgTlVMTCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9hcnJheShhdWRpb211eCwgaW50LCBOVUxMLCAwNDQ0KTsKCk1PRFVMRV9QQVJNX0RFU0ModHJpdG9uMSwic2V0IEVUQkYgcGNpIGNvbmZpZyBiaXQgIgoJCSAiW2VuYWJsZSBidWcgY29tcGF0aWJpbGl0eSBmb3IgdHJpdG9uMSArIG90aGVyc10iKTsKTU9EVUxFX1BBUk1fREVTQyh2c2Z4LCJzZXQgVlNGWCBwY2kgY29uZmlnIGJpdCAiCgkJICJbeWV0IGFub3RoZXIgY2hpcHNldCBmbGF3IHdvcmthcm91bmRdIik7Ck1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKTU9EVUxFX1BBUk1fREVTQyhjYXJkLCJzcGVjaWZ5IFRWL2dyYWJiZXIgY2FyZCBtb2RlbCwgc2VlIENBUkRMSVNUIGZpbGUgZm9yIGEgbGlzdCIpOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwic3BlY2lmeSBpbnN0YWxsZWQgY3J5c3RhbCAoMD1ub25lLCAyOD0yOCBNSHosIDM1PTM1IE1IeikiKTsKTU9EVUxFX1BBUk1fREVTQyh0dW5lciwic3BlY2lmeSBpbnN0YWxsZWQgdHVuZXIgdHlwZSIpOwpNT0RVTEVfUEFSTV9ERVNDKGF1dG9sb2FkLCJhdXRvbWF0aWNhbGx5IGxvYWQgaTJjIG1vZHVsZXMgbGlrZSB0dW5lci5vLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIGxpc3Qgb2YgY2FyZCBJRHMgZm9yIGJ0ODc4KyBjYXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgc3RydWN0IENBUkQgewoJdW5zaWduZWQgaWQ7CglpbnQgY2FyZG5yOwoJY2hhciAqbmFtZTsKfSBjYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IDB4MTNlYjAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIkhhdXBwYXVnZSBXaW5UViIgfSwKCXsgMHgzOTAwMDA3MCwgQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzgsICAiSGF1cHBhdWdlIFdpblRWLUQiIH0sCgl7IDB4NDUwMDAwNzAsIEJUVFZfQk9BUkRfSEFVUFBBVUdFUFZSLCAgIkhhdXBwYXVnZSBXaW5UVi9QVlIiIH0sCgl7IDB4ZmYwMDAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMXgwLCAgICAgIk9zcHJleS0xMDAiIH0sCgl7IDB4ZmYwMTAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMngwX1NWSUQsIk9zcHJleS0yMDAiIH0sCgl7IDB4ZmYwMjAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZNTAwLCAgICAgIk9zcHJleS01MDAiIH0sCgl7IDB4ZmYwMzAwNzAsIEJUVFZfQk9BUkRfT1NQUkVZMjAwMCwgICAgIk9zcHJleS0yMDAwIiB9LAoJeyAweGZmMDQwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTU0MCwgICAgICJPc3ByZXktNTQwIiB9LAoJeyAweGZmMDcwMDcwLCBCVFRWX0JPQVJEX09TUFJFWTQ0MCwgICAgICJPc3ByZXktNDQwIiB9LAoKCXsgMHgwMDAxMTAwMiwgQlRUVl9CT0FSRF9BVElfVFZXT05ERVIsICAiQVRJIFRWIFdvbmRlciIgfSwKCXsgMHgwMDAzMTAwMiwgQlRUVl9CT0FSRF9BVElfVFZXT05ERVJWRSwiQVRJIFRWIFdvbmRlci9WRSIgfSwKCgl7IDB4NjYwNjEwN2QsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDY2MDcxMDdkLCBCVFRWX0JPQVJEX1dJTkZBU1RWQzEwMCwgICJMZWFkdGVrIFdpbkZhc3QgVkMgMTAwIiB9LAoJeyAweDY2MDkxMDdkLCBCVFRWX0JPQVJEX1dJTkZBU1QyMDAwLCAgICJMZWFkdGVrIFRWIDIwMDAgWFAiIH0sCgl7IDB4MjYzNjEwYjQsIEJUVFZfQk9BUkRfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4MjY0NTEwYjQsIEJUVFZfQk9BUkRfU1RCMiwgICAgICAgICAgIlNUQiBUViBQQ0kgRk0sIEdhdGV3YXkgUC9OIDYwMDA3MDQiIH0sCgl7IDB4NDAyMDEwZmMsIEJUVFZfQk9BUkRfR1ZCQ1RWM1BDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWMy9QQ0kiIH0sCgl7IDB4NDA1MDEwZmMsIEJUVFZfQk9BUkRfR1ZCQ1RWNFBDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWNC9QQ0kiIH0sCgl7IDB4NDA3MDEwZmMsIEJUVFZfQk9BUkRfR1ZCQ1RWNVBDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWNS9QQ0kiIH0sCgl7IDB4ZDAxODEwZmMsIEJUVFZfQk9BUkRfR1ZCQ1RWNVBDSSwgICAgIkktTyBEYXRhIENvLiBHVi1CQ1RWNS9QQ0kiIH0sCgoJeyAweDAwMTIxMWJkLCBCVFRWX0JPQVJEX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIiB9LAoJLyogc29tZSBjYXJkcyBzaGlwIHdpdGggYnl0ZXN3YXBwZWQgSURzIC4uLiAqLwoJeyAweDEyMDBiZDExLCBCVFRWX0JPQVJEX1BJTk5BQ0xFLCAgICAgICJQaW5uYWNsZSBQQ1RWIFtic3dhcF0iIH0sCgl7IDB4ZmYwMGJkMTEsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYgW2Jzd2FwXSIgfSwKCS8qIHRoaXMgc2VlbXMgdG8gaGFwcGVuIGFzIHdlbGwgLi4uICovCgl7IDB4ZmYxMjExYmQsIEJUVFZfQk9BUkRfUElOTkFDTEUsICAgICAgIlBpbm5hY2xlIFBDVFYiIH0sCgoJeyAweDMwMDAxMjFhLCBCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNLCAgICIzRGZ4IFZvb2Rvb1RWIEZNLyBWb29kb29UViAyMDAiIH0sCgl7IDB4MjYzNzEwYjQsIEJUVFZfQk9BUkRfVk9PRE9PVFZfRk0sICAgIjNEZnggVm9vZG9vVFYgRk0vIFZvb2Rvb1RWIDIwMCIgfSwKCXsgMHgzMDYwMTIxYSwgQlRUVl9CT0FSRF9TVEIyLAkgICIzRGZ4IFZvb2Rvb1RWIDEwMC8gU1RCIE9FTSIgfSwKCgl7IDB4MzAwMDE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MywgIihBc2tleSBNYWdpYy9vdGhlcnMpIFRWaWV3OTkgQ1BIMDZ4IiB9LAoJeyAweGEwMDUxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjMsICJDUEgwNlggVFZpZXc5OS1DYXJkIiB9LAoJeyAweDMwMDIxNDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjEsICIoQXNrZXkgTWFnaWMvb3RoZXJzKSBUVmlldzk5IENQSDA1eCIgfSwKCXsgMHgzMDA1MTQ0ZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxLCAiKEFza2V5IE1hZ2ljL290aGVycykgVFZpZXc5OSBDUEgwNjEvMDZMIChUMS9MQykiIH0sCgl7IDB4NTAwMDE0NGYsIEJUVFZfQk9BUkRfTUFHSUNUVklFVzA2MSwgIkFza2V5IENQSDA1MCIgfSwKCXsgMHgzMDAwMTRmZiwgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxLCAiVFZpZXcgOTkgKENQSDA2MSkiIH0sCgl7IDB4MzAwMjE0ZmYsIEJUVFZfQk9BUkRfUEhPRUJFX1RWTUFTLCAgIlBob2ViZSBUViBNYXN0ZXIgKENQSDA2MCkiIH0sCgoJeyAweDAwMDExNDYxLCBCVFRWX0JPQVJEX0FWUEhPTkU5OCwgICAgICJBVmVyTWVkaWEgVFZQaG9uZTk4IiB9LAoJeyAweDAwMDIxNDYxLCBCVFRWX0JPQVJEX0FWRVJNRURJQTk4LCAgICJBVmVybWVkaWEgVFZDYXB0dXJlIDk4IiB9LAoJeyAweDAwMDMxNDYxLCBCVFRWX0JPQVJEX0FWUEhPTkU5OCwgICAgICJBVmVyTWVkaWEgVFZQaG9uZTk4IiB9LAoJeyAweDAwMDQxNDYxLCBCVFRWX0JPQVJEX0FWRVJNRURJQTk4LCAgICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiB9LAoJeyAweDAzMDAxNDYxLCBCVFRWX0JPQVJEX0FWRVJNRURJQTk4LCAgICJWRE9NQVRFIFRWIFRVTkVSIENBUkQiIH0sCgoJeyAweDExMTcxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFLCAgICJUZXJyYXRlYyBUVmFsdWUgKFBoaWxpcHMgUEFMIEIvRykiIH0sCgl7IDB4MTExODE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoVGVtaWMgUEFMIEIvRykiIH0sCgl7IDB4MTExOTE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoUGhpbGlwcyBQQUwgSSkiIH0sCgl7IDB4MTExYTE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUUsICAgIlRlcnJhdGVjIFRWYWx1ZSAoVGVtaWMgUEFMIEkpIiB9LAoKCXsgMHgxMTIzMTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWUkFESU8sICAiVGVycmF0ZWMgVFYgUmFkaW8rIiB9LAoJeyAweDExMjcxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFYsICAgICAgICJUZXJyYXRlYyBUVisgKFYxLjA1KSIgICAgfSwKCS8qIGNsYXNoZXMgd2l0aCBGbHlWaWRlbwoJICp7IDB4MTg1MjE4NTIsIEJUVFZfQk9BUkRfVEVSUkFUViwgICAgICJUZXJyYXRlYyBUVisgKFYxLjEwKSIgICAgfSwgKi8KCXsgMHgxMTM0MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIChMUjEwMikiIH0sCgl7IDB4MTEzNTE1M2IsIEJUVFZfQk9BUkRfVEVSUkFUVkFMVUVSLCAgIlRlcnJhdGVjIFRWYWx1ZSBSYWRpbyIgfSwgLyogTFIxMDIgKi8KCXsgMHg1MDE4MTUzYiwgQlRUVl9CT0FSRF9URVJSQVRWQUxVRSwgICAiVGVycmF0ZWMgVFZhbHVlIiB9LCAgICAgICAvKiA/PyAqLwoJeyAweGZmM2IxNTNiLCBCVFRWX0JPQVJEX1RFUlJBVFZBTFVFUiwgICJUZXJyYXRlYyBUVmFsdWUgUmFkaW8iIH0sIC8qID8/ICovCgoJeyAweDQwMDAxNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LAoJeyAweDQwMGExNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIiB9LAoJeyAweDQwMGQxNWIwLCBCVFRWX0JPQVJEX1pPTFRSSVhfR0VOSUUsICJab2x0cml4IEdlbmllIFRWIC8gUmFkaW8iIH0sCgl7IDB4NDAxMDE1YjAsIEJUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRSwgIlpvbHRyaXggR2VuaWUgVFYgLyBSYWRpbyIgfSwKCXsgMHg0MDE2MTViMCwgQlRUVl9CT0FSRF9aT0xUUklYX0dFTklFLCAiWm9sdHJpeCBHZW5pZSBUViAvIFJhZGlvIiB9LAoKCXsgMHgxNDMwYWEwMCwgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNBIiB9LAoJeyAweDE0MzFhYTAwLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJQcm92aWRlbyBQVjE0M0IiIH0sCgl7IDB4MTQzMmFhMDAsIEJUVFZfQk9BUkRfUFYxNDMsICAgICAgICAgIlByb3ZpZGVvIFBWMTQzQyIgfSwKCXsgMHgxNDMzYWEwMCwgQlRUVl9CT0FSRF9QVjE0MywgICAgICAgICAiUHJvdmlkZW8gUFYxNDNEIiB9LAoJeyAweDE0MzNhYTAzLCBCVFRWX0JPQVJEX1BWMTQzLCAgICAgICAgICJTZWN1cml0eSBFeWVzIiB9LAoKCXsgMHgxNDYwYWEwMCwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTEiIH0sCgl7IDB4MTQ2MWFhMDEsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQS0yIiB9LAoJeyAweDE0NjJhYTAyLCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEEtMyIgfSwKCXsgMHgxNDYzYWEwMywgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBBLTQiIH0sCgoJeyAweDE0NjRhYTA0LCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItMSIgfSwKCXsgMHgxNDY1YWEwNSwgQlRUVl9CT0FSRF9QVjE1MCwgICAgICAgICAiUHJvdmlkZW8gUFYxNTBCLTIiIH0sCgl7IDB4MTQ2NmFhMDYsIEJUVFZfQk9BUkRfUFYxNTAsICAgICAgICAgIlByb3ZpZGVvIFBWMTUwQi0zIiB9LAoJeyAweDE0NjdhYTA3LCBCVFRWX0JPQVJEX1BWMTUwLCAgICAgICAgICJQcm92aWRlbyBQVjE1MEItNCIgfSwKCgl7IDB4YTEzMmZmMDAsIEJUVFZfQk9BUkRfSVZDMTAwLCAgICAgICAgIklWQy0xMDAiICB9LAoJeyAweGExNTUwMDAwLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDAwMSwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMCIgIH0sCgl7IDB4YTE1NTAwMDIsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDAiICB9LAoJeyAweGExNTUwMDAzLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwIiAgfSwKCXsgMHhhMTU1MDEwMCwgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE1NTAxMDEsIEJUVFZfQk9BUkRfSVZDMjAwLCAgICAgICAgIklWQy0yMDBHIiB9LAoJeyAweGExNTUwMTAyLCBCVFRWX0JPQVJEX0lWQzIwMCwgICAgICAgICJJVkMtMjAwRyIgfSwKCXsgMHhhMTU1MDEwMywgQlRUVl9CT0FSRF9JVkMyMDAsICAgICAgICAiSVZDLTIwMEciIH0sCgl7IDB4YTE4MmZmMDAsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjAxLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwMiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDMsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA0LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwNSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDYsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjA3LCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwOCwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMDksIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBhLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwYiwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGMsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoJeyAweGExODJmZjBkLCBCVFRWX0JPQVJEX0lWQzEyMCwgICAgICAgICJJVkMtMTIwRyIgfSwKCXsgMHhhMTgyZmYwZSwgQlRUVl9CT0FSRF9JVkMxMjAsICAgICAgICAiSVZDLTEyMEciIH0sCgl7IDB4YTE4MmZmMGYsIEJUVFZfQk9BUkRfSVZDMTIwLCAgICAgICAgIklWQy0xMjBHIiB9LAoKCXsgMHg0MTQyNDM0NCwgQlRUVl9CT0FSRF9HUkFORFRFQywgICAgICAiR3JhbmRUZWMgTXVsdGkgQ2FwdHVyZSIgfSwKCXsgMHgwMTAyMDMwNCwgQlRUVl9CT0FSRF9YR1VBUkQsICAgICAgICAiR3JhbmR0ZWMgR3JhbmQgWC1HdWFyZCIgfSwKCgl7IDB4MTg1MDE4NTEsIEJUVFZfQk9BUkRfQ0hST05PU19WUzIsICAgIkZseVZpZGVvIDk4IChMUjUwKS8gQ2hyb25vcyBWaWRlbyBTaHV0dGxlIElJIiB9LAoJeyAweGEwNTAxODUxLCBCVFRWX0JPQVJEX0NIUk9OT1NfVlMyLCAgICJGbHlWaWRlbyA5OCAoTFI1MCkvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIgfSwKCXsgMHgxODUxMTg1MSwgQlRUVl9CT0FSRF9GTFlWSURFTzk4RVosICAiRmx5VmlkZW8gOThFWiAoTFI1MSkvIEN5YmVyTWFpbCBBViIgfSwKCXsgMHgxODUyMTg1MiwgQlRUVl9CT0FSRF9UWVBIT09OX1RWSUVXLCAiRmx5VmlkZW8gOThGTSAoTFI1MCkvIFR5cGhvb24gVFZpZXcgVFYvRk0gVHVuZXIiIH0sCgl7IDB4NDFhMGEwNTEsIEJUVFZfQk9BUkRfRkxZVklERU9fOThGTSwgIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAgUmV2IFEiIH0sCgl7IDB4MTg1MDFmN2YsIEJUVFZfQk9BUkRfRkxZVklERU9fOTgsICAgIkxpZmV2aWV3IEZseXZpZGVvIDk4IiB9LAoKICAgIAl7IDB4MDEwMTE1Y2IsIEJUVFZfQk9BUkRfR01WMSwgICAgICAgICAgIkFHIEdNVjEiIH0sCgl7IDB4MDEwMTE0YzcsIEJUVFZfQk9BUkRfTU9EVEVDXzIwNSwgICAgIk1vZHVsYXIgVGVjaG5vbG9neSBNTTIwMS9NTTIwMi9NTTIwNS9NTTIxMC9NTTIxNSBQQ1RWIiB9LAoKCXsgMHgxMGI0MjYzNiwgQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzgsICAiU1RCID8/PyIgfSwKCXsgMHgyMTdkNjYwNiwgQlRUVl9CT0FSRF9XSU5GQVNUMjAwMCwgICAiTGVhZHRlayBXaW5GYXN0IFRWIDIwMDAiIH0sCgl7IDB4ZmZmNmY2ZmYsIEJUVFZfQk9BUkRfV0lORkFTVDIwMDAsICAgIkxlYWR0ZWsgV2luRmFzdCBUViAyMDAwIiB9LAoJeyAweDAzMTE2MDAwLCBCVFRWX0JPQVJEX1NFTlNPUkFZMzExLCAgICJTZW5zb3JheSAzMTEiIH0sCgl7IDB4MDA3OTBlMTEsIEJUVFZfQk9BUkRfV0lORFZSLCAgICAgICAgIkNhbm9wdXMgV2luRFZSIFBDSSIgfSwKCXsgMHhhMGZjYTFhMCwgQlRUVl9CT0FSRF9aT0xUUklYLCAgICAgICAiRmFjZSB0byBGYWNlIFR2bWF4IiB9LAoJeyAweDIwMDA3MDYzLCBCVFRWX0JPQVJEX1BDX0hEVFYsICAgICAgICJwY0hEVFYgSEQtMjAwMCBUViJ9LAoJeyAweDgyYjJhYTZhLCBCVFRWX0JPQVJEX1NJTVVTX0dWQzExMDAsICJTSU1VUyBHVkMxMTAwIiB9LAoJeyAweDE0NmNhYTBjLCBCVFRWX0JPQVJEX1BWOTUxLCAgICAgICAgICJpdHVuZXIgc3BlY3RyYTgiIH0sCgl7IDB4MjAwYTEyOTUsIEJUVFZfQk9BUkRfUFhDMjAwLCAgICAgICAgIkltYWdlTmF0aW9uIFBYQzIwMEEiIH0sCgoJeyAweDQwMTExNTU0LCBCVFRWX0JPQVJEX1BWX0JUODc4UF85QiwgICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVCIgfSwKCXsgMHgxN2RlMGEwMSwgQlRUVl9CT0FSRF9LV09STEQsICAgICAgICAiTWVjZXIgVFYvRk0vVmlkZW8gVHVuZXIiIH0sCgoJeyAweDAxMDUxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzEiIH0sCgl7IDB4MDEwNjE4MDUsIEJUVFZfQk9BUkRfUElDT0xPX1RFVFJBX0NISVAsICJQaWNvbG8gVGV0cmEgQ2hpcCAjMiIgfSwKCXsgMHgwMTA3MTgwNSwgQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUCwgIlBpY29sbyBUZXRyYSBDaGlwICMzIiB9LAoJeyAweDAxMDgxODA1LCBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQLCAiUGljb2xvIFRldHJhIENoaXAgIzQiIH0sCgoJeyAweDE1NDA5NTExLCBCVFRWX0JPQVJEX0FDT1JQX1k4NzhGLCAiQWNvcnAgWTg3OEYiIH0sCgoJLyogbGlrZWx5IGJyb2tlbiwgdmVuZG9yIGlkIGRvZXNuJ3QgbWF0Y2ggdGhlIG90aGVyIG1hZ2ljIHZpZXdzIC4uLgoJICogeyAweGEwZmNhMDRmLCBCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjMsICJHdWlsbGVtb3QgTWF4aSBUViBWaWRlbyAzIiB9LCAqLwoKCS8qIERWQiBjYXJkcyAodXNpbmcgcGNpIGZ1bmN0aW9uIC4xIGZvciBtcGVnIGRhdGEgeGZlcikgKi8KCXsgMHgwMTAxMDA3MSwgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWLCAiTmVidWxhIEVsZWN0cm9uaWNzIERpZ2lUViIgfSwKCXsgMHgwNzYxMTQ2MSwgQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCAgICAiQXZlck1lZGlhIEF2ZXJUViBEVkItVCA3NjEiIH0sCgl7IDB4MDAxYzExYmQsIEJUVFZfQk9BUkRfUElOTkFDTEVTQVQsICAgIlBpbm5hY2xlIFBDVFYgU2F0IiB9LAoJeyAweDAwMjYxMWJkLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULCAgICJQaW5uYWNsZSBQQ1RWIFNBVCBDSSIgfSwKCXsgMHgwMDAxMTgyMiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwgICAiVHdpbmhhbiBWaXNpb25QbHVzIERWQiIgfSwKCXsgMHhmYzAwMjcwZiwgQlRUVl9CT0FSRF9UV0lOSEFOX0RTVCwgICAiQ2hhaW5UZWNoIGRpZ2l0b3AgRFNULTEwMDAgRFZCLVMiIH0sCgl7IDB4MDc3MTE0NjEsIEJUVFZfQk9BUkRfQVZEVkJUXzc3MSwgICAgIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAoJeyAweGRiMTAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0RWQlRfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIgfSwKCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwgICAgIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAoKCXsgMCwgLTEsIE5VTEwgfQp9OwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogYXJyYXkgd2l0aCBkZXNjcmlwdGlvbiBmb3IgYnQ4NDggLyBidDg3OCB0di9ncmFiYmVyIGNhcmRzICAgICAgICAgICAgICAgKi8KCnN0cnVjdCB0dmNhcmQgYnR0dl90dmNhcmRzW10gPSB7CgkvKiAtLS0tIGNhcmQgMHgwMCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9VTktOT1dOXSA9IHsKCQkubmFtZQkJPSAiICoqKiBVTktOT1dOL0dFTkVSSUMgKioqICIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NSVJPXSA9IHsKCQkubmFtZQkJPSAiTUlSTyBQQ1RWIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDIsIDAsIDAsIDAsIDEwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0VdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSA3LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDEsIDIsIDMsIDR9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1NUQl0gPSB7CgkJLm5hbWUJCT0gIlNUQiwgR2F0ZXdheSBQL04gNjAwMDY5OSAoYnQ4NDgpIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDA0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0lOVEVMXSA9IHsKCQkubmFtZQkJPSAiSW50ZWwgQ3JlYXRlIGFuZCBTaGFyZSBQQ0kvIFNtYXJ0IFZpZGVvIFJlY29yZGVyIElJSSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gNCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9ESUFNT05EXSA9IHsKCQkubmFtZQkJPSAiRGlhbW9uZCBEVFYyMDAwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAoJCS5hdWRpb211eAk9IHsgMCwgMSwgMCwgMSwgM30sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVZFUk1FRElBXSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5ncGlvbWFzawk9IDB4MGYsCgkJLmF1ZGlvbXV4CT0geyAweDBjLCAweDA0LCAweDA4LCAweDA0LCAwfSwKCQkvKiAgICAgICAgICAgICAgICAweDA0IGZvciBzb21lIGNhcmRzID8/ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSBhdmVybWVkaWFfdHZwaG9uZV9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX01BVFJJWF9WSVNJT05dID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwLCAwfSwKCQkuYXVkaW9tdXgJPSB7MCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgwOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9GTFlWSURFT10gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIElJIChCdDg0OCkgTFIyNiAvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjI2IiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4YzAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDAsIDB4YzAwLCAweDgwMCwgMHg0MDAsIDB4YzAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9UVVJCT1RWXSA9IHsKCQkubmFtZQkJPSAiSU1TL0lYbWljcm8gVHVyYm9UViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAzLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDEsIDIsIDMsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9IQVVQUEFVR0U4NzhdID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDBmLCAvKiBvbGQ6IDcgKi8KCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NSVJPUFJPXSA9IHsKCQkubmFtZQkJPSAiTUlSTyBQQ1RWIHBybyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDMwMTRmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDEsMHgxMDAwMSwgMCwgMCwxMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDBjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0FEU1RFQ0hfVFZdID0gewoJCS5uYW1lCQk9ICJBRFMgVGVjaG5vbG9naWVzIENoYW5uZWwgU3VyZmVyIFRWIChidDg0OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMTMsIDE0LCAxMSwgNywgMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfQVZFUk1FRElBOThdID0gewoJCS5uYW1lCQk9ICJBVmVyTWVkaWEgVFZDYXB0dXJlIDk4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gNCwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEzLCAxNCwgMTEsIDcsIDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkubXNwMzR4eF9hbHQgICAgPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sgICAgID0gYXZlcm1lZGlhX3R2X3N0ZXJlb19hdWRpbywKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1ZIWF0gPSB7CgkJLm5hbWUJCT0gIkFpbXNsYWIgVmlkZW8gSGlnaHdheSBYdHJlbWUgKFZIWCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAyLCAxLCAzLCA0fSwgLyogb2xkOiB7IDAsIDEsIDIsIDMsIDR9ICovCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggVFYtTWF4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MCAsIDAsIDEgLCAwLCAxMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDEwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJWFZJRVdQTEFZVFZdID0gewoJCS5uYW1lCQk9ICJQcm9saW5rIFBpeGVsdmlldyBQbGF5VFYgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkjaWYgMAoJCS8qIG9sZCAqLwoJCS5hdWRpb211eAk9IHsgMHgwMWMwMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKCSNlbHNlCgkJLyogMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+ICovCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJI2VuZGlmCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgl9LAoJW0JUVFZfQk9BUkRfV0lOVklFV182MDFdID0gewoJCS5uYW1lCQk9ICJMZWFkdGVrIFdpblZpZXcgNjAxIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ODMwMGY4LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxLDB9LAoJCS5hdWRpb211eAk9IHsgMHg0ZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDcsMHhjZmEwMDd9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gd2ludmlld19hdWRpbywKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCglbQlRUVl9CT0FSRF9BVkVDX0lOVEVSQ0FQXSA9IHsKCQkubmFtZQkJPSAiQVZFQyBJbnRlcmNhcHR1cmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MSwgMCwgMCwgMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTElGRV9GTFlLSVRdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyBJSSBFWiAvRmx5S2l0IExSMzggQnQ4NDggKGNhcHR1cmUgb25seSkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sJPSAweDhkZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0NFSV9SQUZGTEVTXSA9IHsKCQkubmFtZQkJPSAiQ0VJIFJhZmZsZXMgQ2FyZCIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDMsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsyLCAzLCAxLCAxfSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0NPTkZFUkVOQ0VUVl0gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4LyBMdWNreSBTdGFyIEltYWdlIFdvcmxkIENvbmZlcmVuY2VUViBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwgIC8qIHR1bmVyLCBsaW5lIGluICovCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUxfSSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9QSE9FQkVfVFZNQVNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNTAvIFBob2ViZSBUdiBNYXN0ZXIgKyBGTSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGMwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezAsIDEsIDB4ODAwLCAweDQwMCwgMHhjMDAsIDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01PRFRFQ18yMDVdID0gewoJCS5uYW1lCQk9ICJNb2R1bGFyIFRlY2hub2xvZ3kgTU0yMDEvTU0yMDIvTU0yMDUvTU0yMTAvTU0yMTUgUENUViwgYnQ4NzgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwKCQkuYXVkaW9tdXgJPSB7IDAsIDAsIDAsIDAsIDAgfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FMUFNfVFNCQjVfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDE4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjFdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNVgvMDZYIChidDg3OCkgW21hbnkgdmVuZG9yc10iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhlMDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHhjMDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVk9CSVNfQk9PU1RBUl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4wIChCdDg0OCkvIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIDEuMC8gVm9iaXMgVFYtQm9vc3RhciIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDFmMGZmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDIwMDAwLCAweDMwMDAwLCAweDEwMDAwLCAwLCAweDQwMDAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDAsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSB0ZXJyYXR2X2F1ZGlvLAoJfSwKCVtCVFRWX0JPQVJEX0hBVVBQQVVHX1dDQU1dID0gewoJCS5uYW1lCQk9ICJIYXVwcGF1Z2UgV2luQ2FtIG5ld2VyIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDMsCgkJLmdwaW9tYXNrCT0gNywKCQkubXV4c2VsCQk9IHsgMiwgMCwgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAxLCAyLCAzLCA0fSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9NQVhJXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTgvIE1BWEkgVFYgVmlkZW8gUENJMiBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19TRUNBTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfVEVSUkFUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIFRlcnJhVFYrIFZlcnNpb24gMS4xIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgxZjBmZmYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHgyMDAwMCwgMHgzMDAwMCwgMHgxMDAwMCwgMHgwMDAwMCwgMHg0MDAwMH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSB0ZXJyYXR2X2F1ZGlvLAoJCS8qIEdQSU8gd2lyaW5nOgoJCUV4dGVybmFsIDIwIHBpbiBjb25uZWN0b3IgKGZvciBBY3RpdmUgUmFkaW8gVXBncmFkZSBib2FyZCkKCQlncGlvMDA6IGkyYy1zZGEKCQlncGlvMDE6IGkyYy1zY2wKCQlncGlvMDI6IG9tNTYxMC1kYXRhCgkJZ3BpbzAzOiBvbTU2MTAtY2xrCgkJZ3BpbzA0OiBvbTU2MTAtd3JlCgkJZ3BpbzA1OiBvbTU2MTAtc3RlcmVvCgkJZ3BpbzA2OiByZHM2NTg4LWRhdm4KCQlncGlvMDc6IFBpbiA3IG4uYy4KCQlncGlvMDg6IG5JT1cKCQlncGlvMDkrMTA6IG5JT1IsIG5TRUwgPz8gKGJ0ODc4KQoJCQlncGlvMDk6IG5JT1IgKGJ0ODQ4KQoJCQlncGlvMTA6IG5TRUwgKGJ0ODQ4KQoJCVNvdW5kIFJvdXRpbmc6CgkJZ3BpbzE2OiB1Mi1BMCAoMXN0IDQwNTJidCkKCQlncGlvMTc6IHUyLUExCgkJZ3BpbzE4OiB1Mi1uRU4KCQlncGlvMTk6IHU0LUEwICgybmQgNDA1MikKCQlncGlvMjA6IHU0LUExCgkJCXU0LW5FTiAtIEdORAoJCUJ0c3B5OgoJCQkwMDAwMCA6IENkcm9tIChpbnRlcm5hbCBhdWRpbyBpbnB1dCkKCQkJMTAwMDAgOiBleHQuIFZpZGVvIGF1ZGlvIGlucHV0CgkJCTIwMDAwIDogVFYgTW9ubwoJCQlhMDAwMCA6IFRWIE1vbm8vMgoJCTFhMDAwMCA6IFRWIFN0ZXJlbwoJCQkzMDAwMCA6IFJhZGlvCgkJCTQwMDAwIDogTXV0ZQoJKi8KCgl9LAoJW0JUVFZfQk9BUkRfUFhDMjAwXSA9IHsKCQkvKiBKYW5uaWsgRnJpdHNjaCA8amFubmlrQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZT4gKi8KCQkubmFtZQkJPSAiSW1hZ2VuYXRpb24gUFhDMjAwIiwKCQkudmlkZW9faW5wdXRzCT0gNSwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMSwgLyogd2FzOiA0ICovCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMCwgMH0sCgkJLmF1ZGlvbXV4CT0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbF9ob29rICAgID0gUFhDMjAwX211eHNlbCwKCgl9LAoJW0JUVFZfQk9BUkRfRkxZVklERU9fOThdID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OCBMUjUwIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwgIC8qIDB4OGRmZTAwICovCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHgwODAwLCAweDEwMDAsIDB4MTAwMCwgMHgxODAwLCAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfSVBST1RWXSA9IHsKCQkubmFtZQkJPSAiRm9ybWFjIGlQcm9UViwgRm9ybWFjIFByb1RWIEkgKGJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAxLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDEsIDAsIDAsIDAsIDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MjAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSU5URUxfQ19TX1BDSV0gPSB7CgkJLm5hbWUJCT0gIkludGVsIENyZWF0ZSBhbmQgU2hhcmUgUENJLyBTbWFydCBWaWRlbyBSZWNvcmRlciBJSUkiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMCwKCQkudHVuZXJfdHlwZQk9IDQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVEVSUkFUVkFMVUVdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBUZXJyYVRWYWx1ZSBWZXJzaW9uIEJ0ODc4IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4ZmZmZjAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4NTAwLCAwLCAweDMwMCwgMHg5MDAsIDB4OTAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUMjAwMF0gPSB7CgkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCAyMDAwLyBXaW5GYXN0IDIwMDAgWFAiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEsIDB9LCAvKiBUViwgQ1ZpZCwgU1ZpZCwgQ1ZpZCBvdmVyIFNWaWQgY29ubmVjdG9yICovCgkjaWYgMAoJCS5ncGlvbWFzawk9IDB4YzMzMDAwLAoJCS5hdWRpb211eAk9IHsgMHg0MjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAoJI2Vsc2UKCQkvKiBBbGV4YW5kZXIgVmFyYWtpbiA8YXZhcmFraW5AaG90bWFpbC5jb20+IFtzdGVyZW8gdmVyc2lvbl0gKi8KCQkuZ3Bpb21hc2sJPSAweGIzMzAwMCwKCQkuYXVkaW9tdXgJPSB7IDB4MTIyMDAwLDB4MTAwMCwweDAwMDAsMHg2MjAwMDAsMHg4MDAwMDAgfSwKCSNlbmRpZgoJCS8qIEF1ZGlvIFJvdXRpbmcgZm9yICJXaW5GYXN0IDIwMDAgWFAiIChubyB0diBzdGVyZW8gISkKCQkJZ3BpbzIzIC0tIGhlZjQwNTI6bkVuYWJsZSAoMHg4MDAwMDApCgkJCWdwaW8xMiAtLSBoZWY0MDUyOkExCgkJCWdwaW8xMyAtLSBoZWY0MDUyOkEwCgkJMHgwMDAwOiBleHRlcm5hbCBhdWRpbwoJCTB4MTAwMDogRk0KCQkweDIwMDA6IFRWCgkJMHgzMDAwOiBuLmMuCgkJTm90ZTogVGhlcmUgZXhpc3RzIGFub3RoZXIgdmFyaWFudCAiV2luZmFzdCAyMDAwIiB3aXRoIHR2IHN0ZXJlbyAhPwoJCU5vdGU6IGVlcHJvbSBvbmx5IGNvbnRhaW5zIEZGIGFuZCBwY2kgc3Vic3lzdGVtIGlkIDEwN2Q6NjYwNgoJCSovCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS5oYXNfcmFkaW8JPSAxLAoJCS50dW5lcl90eXBlCT0gNSwgLyogZGVmYXVsdCBmb3Igbm93LCBncGlvIHJlYWRzIEJGRkYwNiBmb3IgUGFsIGJnK2RrICovCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmF1ZGlvX2hvb2sJPSB3aW5mYXN0MjAwMF9hdWRpbywKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0NIUk9OT1NfVlMyXSA9IHsKCQkubmFtZQkJPSAiTGlmZXZpZXcgRmx5VmlkZW8gOTggTFI1MCAvIENocm9ub3MgVmlkZW8gU2h1dHRsZSBJSSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDMsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4MDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMHg4MDAsIDB4MTAwMCwgMHgxMDAwLCAweDE4MDB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDI0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1RZUEhPT05fVFZJRVddID0gewoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAgLyBUeXBob29uIFRWaWV3IFRWL0ZNIFR1bmVyIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MTgwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfUFhFTFZXUExUVlBST10gPSB7CgkJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBwcm8iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhmZiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eAk9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX01BR0lDVFZJRVcwNjNdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwNlggVFZpZXc5OSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDU1MWUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4CT0geyAweDU1MTQwMCwgMHg1NTEyMDAsIDAsIDAsIDB4NTUxYzAwLCAweDU1MTIwMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QSU5OQUNMRV0gPSB7CgkJLm5hbWUJCT0gIlBpbm5hY2xlIFBDVFYgU3R1ZGlvL1JhdmUiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMiwgMHhkMDAwMSwgMCwgMCwgMX0sCgkJLm5lZWRzX3R2YXVkaW8JPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDI4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1NUQjJdID0gewoJCS5uYW1lCQk9ICJTVEIgVFYgUENJIEZNLCBHYXRld2F5IFAvTiA2MDAwNzA0IChidDg3OCksIDNEZnggVm9vZG9vVFYgMTAwIiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDcsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgNCwgMCwgMiwgMywgMX0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZQSE9ORTk4XSA9IHsKCQkubmFtZQkJPSAiQVZlck1lZGlhIFRWUGhvbmUgOTgiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSA0LAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMTUsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMTMsIDQsIDExLCA3LCAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCQkuYXVkaW9faG9vawk9IGF2ZXJtZWRpYV90dnBob25lX2F1ZGlvLAoJfSwKCVtCVFRWX0JPQVJEX1BWOTUxXSA9IHsKCQkubmFtZQkJPSAiUHJvVmlkZW8gUFY5NTEiLCAvKiBwaWMxNmM1NCAqLwoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAwLCAwLCAwLCAwfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9PTkFJUl9UVl0gPSB7CgkJLm5hbWUJCT0gIkxpdHRsZSBPbkFpciBUViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGUwMGIsCgkJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezB4ZmY5ZmY2LCAweGZmOWZmNiwgMHhmZjFmZjcsIDAsIDB4ZmYzZmZjfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0lHTUFfVFZJSV9GTV0gPSB7CgkJLm5hbWUJCT0gIlNpZ21hIFRWSUktRk0iLAoJCS52aWRlb19pbnB1dHMJPSAyLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IC0xLAoJCS5ncGlvbWFzawk9IDMsCgkJLm11eHNlbAkJPSB7MiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezEsIDEsIDAsIDIsIDN9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF9OT05FLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTjJdID0gewoJCS5uYW1lCQk9ICJNQVRSSVgtVmlzaW9uIE1WLURlbHRhIDIiLAoJCS52aWRlb19pbnB1dHMJPSA1LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAzLAoJCS5ncGlvbWFzawk9IDAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDAsIDB9LAoJCS5hdWRpb211eAk9IHswIH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfWk9MVFJJWF9HRU5JRV0gPSB7CgkJLm5hbWUJCT0gIlpvbHRyaXggR2VuaWUgVFYvRk0iLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhiY2YwM2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHhiYzgwM2YsIDB4YmM5MDNmLCAweGJjYjAzZiwgMCwgMHhiY2IwM2Z9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IDIxLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1RFUlJBVFZSQURJT10gPSB7CgkJLm5hbWUJCT0gIlRlcnJhdGVjIFRWL1JhZGlvKyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDcwMDAwLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7IDB4MjAwMDAsIDB4MzAwMDAsIDB4MTAwMDAsIDAsIDB4NDAwMDAsIDB4MjAwMDAgfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzM1LAoJCS50dW5lcl90eXBlCT0gMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvCT0gMSwKCX0sCgoJLyogLS0tLSBjYXJkIDB4MzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfRFlOQUxJTktdID0gewoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3gvIER5bmFsaW5rIE1hZ2ljIFRWaWV3IiwKCQkudmlkZW9faW5wdXRzCT0gMywKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDE1LAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXgJPSB7MiwwLDAsMCwxfSwKCQkubmVlZHNfdHZhdWRpbwk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9HVkJDVFYzUENJXSA9IHsKCQkubmFtZQkJPSAiSU9EQVRBIEdWLUJDVFYzL1BDSSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxMGYwMCwKCQkubXV4c2VsCQk9IHsyLCAzLCAwLCAwfSwKCQkuYXVkaW9tdXgJPSB7MHgxMDAwMCwgMCwgMHgxMDAwMCwgMCwgMCwgMH0sCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfQUxQU19UU0hDNl9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gZ3ZiY3R2M3BjaV9hdWRpbywKCX0sCglbQlRUVl9CT0FSRF9QWEVMVldQTFRWUEFLXSA9IHsKCQkubmFtZQkJPSAiUHJvbGluayBQVi1CVDg3OFArNEUgLyBQaXhlbFZpZXcgUGxheVRWIFBBSyAvIExlbmNvIE1YVFYtOTU3OCBDUCIsCgkJLnZpZGVvX2lucHV0cwk9IDUsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMywKCQkuZ3Bpb21hc2sJPSAweEFBMDAwMCwKCQkubXV4c2VsCQk9IHsgMiwzLDEsMSwtMSB9LAoJCS5kaWdpdGFsX21vZGUgICA9IERJR0lUQUxfTU9ERV9DQU1FUkEsCgkJLmF1ZGlvbXV4CT0geyAweDIwMDAwLCAwLCAweDgwMDAwLCAweDgwMDAwLCAweGE4MDAwLCAweDQ2MDAwICB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMX0ksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUJPSAxLAoJCS8qIEdQSU8gd2lyaW5nOiAoZGlmZmVyZW50IGZyb20gUmV2LjRDICEpCgkJCUdQSU8xNzogVTQuQTAgKGZpcnN0IGhlZjQwNTJidCkKCQkJR1BJTzE5OiBVNC5BMQoJCQlHUElPMjA6IFU1LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCQlHUElPMjE6IFU0Lm5FTgoJCQlHUElPMjI6IEJUODMyIFJlc2V0IExpbmUKCQkJR1BJTzIzOiBBNSxBMCwgVTUsbkVOCgkJTm90ZTogQXQgaTJjPTB4OGEgaXMgYSBCdDgzMiBjaGlwLCB3aGljaCBjaGFuZ2VzIHRvIDB4ODggYWZ0ZXIgYmVpbmcgcmVzZXQgdmlhIEdQSU8yMgoJCSovCgl9LAoJW0JUVFZfQk9BUkRfRUFHTEVdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJFYWdsZSBXaXJlbGVzcyBDYXByaWNvcm4yIChidDg3OEEpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSAvKiBUVU5FUl9BTFBTX1RNREgyX05UU0MgKi8sCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BJTk5BQ0xFUFJPXSA9IHsKCQkvKiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQDJnZW4uY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0dWRpbyBQcm8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMSwgMHhkMDAwMSwgMCwgMCwgMTB9LAoJCQkJLyogc291bmQgcGF0aCAoNSBzb3VyY2VzKToKCQkJCU1VWDEgKG1hc2sgMHgwMyksIEVuYWJsZSBQaW4gMHgwOCAoMD1lbmFibGUsIDE9ZGlzYWJsZSkKCQkJCQkwPSBleHQuIEF1ZGlvIElOCgkJCQkJMT0gZnJvbSBNVVgyCgkJCQkJMj0gTW9ubyBUViBzb3VuZCBmcm9tIFR1bmVyCgkJCQkJMz0gbm90IGNvbm5lY3RlZAoJCQkJTVVYMiAobWFzayAweDMwMDAwKToKCQkJCQkwLDIsMz0gZnJvbSBNU1AzNHh4CgkJCQkJMT0gRk0gc3RlcmVvIFJhZGlvIGZyb20gVHVuZXIgKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9UVklFV19SRFNfRk1dID0gewoJCS8qIENsYWFzIExhbmdiZWhuIDxjbGFhc0BiaWdmb290LmNvbT4sCgkJU3ZlbiBHcm90aGtsYWdzIDxzdmVuQHVwYi5kZT4gKi8KCQkubmFtZQkJPSAiVHlwaG9vbiBUVmlldyBSRFMgKyBGTSBTdGVyZW8gLyBLTkMxIFRWIFN0YXRpb24gUkRTIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMywKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4MWMsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMCwgMCwgMHgxMCwgOCwgNCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xJRkVURUNfOTQxNV0gPSB7CgkJLyogVGltIFL2c3Rlcm11bmR0IDxyb3N0ZXJtQHVuaS1tdWVuc3Rlci5kZT4KCQlpbiBkZS5jb21wLm9zLnVuaXgubGludXguaGFyZHdhcmU6CgkJCW9wdGlvbnMgYnR0diBjYXJkPTAgcGxsPTEgcmFkaW89MSBncGlvbWFzaz0weDE4ZTAKCQkJYXVkaW9tdXg9MHg0NGM3MWYsMHg0NGQ3MWYsMCwweDQ0ZDcxZiwweDQ0ZGZmZgoJCQlvcHRpb25zIHR1bmVyIHR5cGU9NSAqLwoJCS5uYW1lCQk9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwIC9GbHlWaWRlbyBBMi8gTGlmZXRlYyBMVCA5NDE1IFRWIFtMUjkwXSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDE4ZTAsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MThlMCB9LAoJCQkvKiBGb3IgY2FyZHMgd2l0aCB0ZGE5ODIwL3RkYTk4MjE6CgkJCQkweDAwMDA6IFR1bmVyIG5vcm1hbCBzdGVyZW8KCQkJCTB4MDA4MDogVHVuZXIgQTIgU0FQIChzZWNvbmQgYXVkaW8gcHJvZ3JhbSA9IFp3ZWlrYW5hbHRvbikKCQkJCTB4MDg4MDogVHVuZXIgQTIgc3RlcmVvICovCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9CRVNUQlVZX0VBU1lUVl0gPSB7CgkJLyogTWlndWVsIEFuZ2VsIEFsdmFyZXogPG1hYWNydXpAbmF2ZWdhbGlhLmNvbT4KCQlvbGQgRWFzeSBUViBCVDg0OCB2ZXJzaW9uIChtb2RlbCBDUEgwMzEpICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDAzMS8gQkVTVEJVWSBFYXN5IFRWIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweEYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDIsIDAsIDAsIDAsIDEwfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVFVORVJfVEVNSUNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHgzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9GTFlWSURFT185OEZNXSA9IHsKCQkvKiBHb3Jkb24gSGV5ZG9uIDxnamhleWRvbkBiaWdmb290LmNvbSAoJzk4KSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyA5OEZNIExSNTAiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMywKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxODAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAweDgwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTgwMCwgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCQkvKiBUaGlzIGlzIHRoZSB1bHRpbWF0ZSBjaGVhcG8gY2FwdHVyZSBjYXJkCgkJKiBqdXN0IGEgQlQ4NDhBIG9uIGEgc21hbGwgUENCIQoJCSogU3RldmUgSG9zZ29vZCA8c3RldmVAZXF1aWluZXQuY29tPiAqLwoJW0JUVFZfQk9BUkRfR1JBTkRURUNdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyAnR3JhbmQgVmlkZW8gQ2FwdHVyZScgKEJ0ODQ4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FTS0VZX0NQSDA2MF0gPSB7CgkJLyogRGFuaWVsIEhlcnJpbmd0b24gPGRhbmllbC5oZXJyaW5ndG9uQGhvbWUuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBc2tleSBDUEgwNjAvIFBob2ViZSBUViBNYXN0ZXIgT25seSAoTm8gRk0pIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDQwMCwgMHg0MDAsIDB4NDAwLCAweDQwMCwgMHg4MDAsIDB4NDAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEVNSUNfNDAzNkZZNV9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FTS0VZX0NQSDAzWF0gPSB7CgkJLyogTWF0dGkgTW90dHVzIDxtb3R0dXNAcGh5c2ljLnV0LmVlPiAqLwoJCS5uYW1lCQk9ICJBc2tleSBDUEgwM3ggVFYgQ2FwdHVyZXIiLAoJCS52aWRlb19pbnB1dHMJPSA0LAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMzAwMEYsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwwLDAsMCwxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJLyogLS0tLSBjYXJkIDB4M2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTU0xMDBQQ1RWXSA9IHsKCQkvKiBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+ICovCgkJLm5hbWUgICAgICAgICAgID0gIk1vZHVsYXIgVGVjaG5vbG9neSBNTTEwMFBDVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMiwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAxMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMCwgMCwgMSwgOH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzM1LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9HTVYxXSA9IHsKCQkvKiBBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWsgKi8KCQkubmFtZQkJPSAiQUcgRWxlY3Ryb25pY3MgR01WMSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkuc3ZocwkJPSAxLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RiwKCQkubXV4c2VsCQk9IHsgMiwgMn0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9CRVNUQlVZX0VBU1lUVjJdID0gewoJCS8qIE1pZ3VlbCBBbmdlbCBBbHZhcmV6IDxtYWFjcnV6QG5hdmVnYWxpYS5jb20+CgkJbmV3IEVhc3kgVFYgQlQ4NzggdmVyc2lvbiAobW9kZWwgQ1BIMDYxKQoJCXNwZWNpYWwgdGhhbmtzIHRvIEluZm9ybWF0aWNhIE1pZXJlcyBmb3IgcHJvdmlkaW5nIHRoZSBjYXJkICovCgkJLm5hbWUgICAgICAgICAgID0gIkFza2V5IENQSDA2MS8gQkVTVEJVWSBFYXN5IFRWIChidDg3OCkiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDIsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4RkYsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDEsIDAsIDQsIDQsIDl9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9BVElfVFZXT05ERVJdID0gewoJCS8qIEx1a2FzIEdlYmF1ZXIgPGdlYnlAdm9sbnkuY3o+ICovCgkJLm5hbWUJCT0gIkFUSSBUVi1Xb25kZXIiLAoJCS52aWRlb19pbnB1dHMJPSAzLAoJCS5hdWRpb19pbnB1dHMJPSAxLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzCQk9IDIsCgkJLmdwaW9tYXNrCT0gMHhmMDNmLAoJCS5tdXhzZWwJCT0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4CT0geyAweGJmZmUsIDAsIDB4YmZmZiwgMCwgMHhiZmZlfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1RFTUlDXzQwMDZGTjVfTVVMVElfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHg0MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BVElfVFZXT05ERVJWRV0gPSB7CgkJLyogTHVrYXMgR2ViYXVlciA8Z2VieUB2b2xueS5jej4gKi8KCQkubmFtZQkJPSAiQVRJIFRWLVdvbmRlciBWRSIsCgkJLnZpZGVvX2lucHV0cwk9IDIsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCgkJLmF1ZGlvbXV4CT0geyAwLCAwLCAxLCAwLCAwfSwKCQkubm9fbXNwMzR4eAk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9URU1JQ180MDA2Rk41X01VTFRJX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9GTFlWSURFTzIwMDBdID0gewoJCS8qIERlZUpheSA8ZGVlamF5QHdlc3RlbDkwMC5uZXQgKDIwMDBTKSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMaWZldmlldyBGbHlWaWRlbyAyMDAwUyBMUjkwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzawk9IDB4MThlMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMCwgMX0sCgkJCQkvKiBSYWRpbyBjaGFuZ2VkIGZyb20gMWU4MCB0byAweDgwMCB0byBtYWtlCgkJCQlGbHlWaWRlbzIwMDBTIGluIC5odSBoYXBweSAoZ20pKi8KCQkJCS8qIC1kay0/Pz86IHNldCBtdXRlPTB4MTgwMCBmb3IgdGRhOTg3NGggZGF1Z2h0ZXJib2FyZCAqLwoJCS5hdWRpb211eAk9IHsgMHgwMDAwLDB4MDgwMCwweDEwMDAsMHgxMDAwLDB4MTgwMCwgMHgxMDgwIH0sCgkJLmF1ZGlvX2hvb2sJPSBmdjIwMDBzX2F1ZGlvLAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9URVJSQVRWQUxVRVJdID0gewoJCS5uYW1lCQk9ICJUZXJyYXRlYyBUVmFsdWVSYWRpbyIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweGZmZmYwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAweDUwMCwgMHg1MDAsIDB4MzAwLCAweDkwMCwgMHg5MDB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0dWQkNUVjRQQ0ldID0gewoJCS8qIFRBTkFLQSBLZWkgPHBlZzAwNjI1QG5pZnR5LmNvbT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiSU9EQVRBIEdWLUJDVFY0L1BDSSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAxMGYwMCwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMCwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4MTAwMDAsIDAsIDB4MTAwMDAsIDAsIDAsIDB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1NIQVJQXzJVNUpGNTU0MF9OVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rICAgICA9IGd2YmN0djNwY2lfYXVkaW8sCgl9LAoKCS8qIC0tLS0gY2FyZCAweDQ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiM0RmeCBWb29kb29UViBGTSAoRXVybyksIFZvb2Rvb1RWIDIwMCAoVVNBKSIsCgkJLyogdHJ5ICJpbnNtb2QgbXNwMzQwMCBzaW1wbGU9MCIgaWYgeW91IGhhdmUKCQkqIHNvdW5kIHByb2JsZW1zIHdpdGggdGhpcyBjYXJkLiAqLwoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4NGY4YTAwLAoJCS8qIDB4MTAwMDAwOiAxPU1TUCBlbmFibGVkICgwPWRpc2FibGUgYWdhaW4pCgkJKiAweDAxMDAwMDogQ29ubmVjdGVkIHRvICJTMCIgb24gdGRhOTg4MCAoMD1QYWwvQkcsIDE9TlRTQykgKi8KCQkuYXVkaW9tdXggICAgICAgPSB7MHg5NDdmZmYsIDB4OTg3ZmZmLDB4OTQ3ZmZmLDB4OTQ3ZmZmLCAweDk0N2ZmZn0sCgkJLyogdHZ0dW5lciwgcmFkaW8sICAgZXh0ZXJuYWwsaW50ZXJuYWwsIG11dGUsICBzdGVyZW8KCQkqIHR1bmVyLCBDb21wb3NpdCwgU1ZpZCwgQ29tcG9zaXQtb24tU3ZpZC1hZGFwdGVyICovCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzICwwICwxfSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbAkJPSBQTExfMjgsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQUlNTVNdID0gewoJCS8qIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkFjdGl2ZSBJbWFnaW5nIEFJTU1TIiwKCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiB9LAoJCS5ncGlvbWFzayAgICAgICA9IDAKCX0sCglbQlRUVl9CT0FSRF9QVl9CVDg3OFBfUExVU10gPSB7CgkJLyogVG9tYXN6IFB5cmEgPGhlbGxmaXJlQHNlZGV6LmlxLnBsPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQcm9saW5rIFBpeGVsdmlldyBQVi1CVDg3OFArIChSZXYuNEMsOEUpIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDQsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDE1LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAxMSwgNywgMTMsIDB9LCAvKiBUViBhbmQgUmFkaW8gd2l0aCBzYW1lIEdQSU8gISAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IDI1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkJLyogR1BJTyB3aXJpbmc6CgkJCUdQSU8wOiBVNC5BMCAoaGVmNDA1MmJ0KQoJCQlHUElPMTogVTQuQTEKCQkJR1BJTzI6IFU0LkExIChzZWNvbmQgaGVmNDA1MmJ0KQoJCQlHUElPMzogVTQubkVOLCBVNS5BMCwgQTUubkVOCgkJCUdQSU84LTE1OiB2cmQ4NjZiID8KCQkqLwoJfSwKCVtCVFRWX0JPQVJEX0ZMWVZJREVPOThFWl0gPSB7CgkJLm5hbWUJCT0gIkxpZmV2aWV3IEZseVZpZGVvIDk4RVogKGNhcHR1cmUgb25seSkgTFI1MSIsCgkJLnZpZGVvX2lucHV0cwk9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIJCT0gLTEsCgkJLnN2aHMJCT0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sIC8qIEFWMSwgQVYyLCBTVkhTLCBDVmlkIGFkYXB0ZXIgb24gU1ZIUyAqLwoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkvKiAtLS0tIGNhcmQgMHg0OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9QVl9CVDg3OFBfOUJdID0gewoJCS8qIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+ICovCgkJLm5hbWUJCT0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCs5QiAoUGxheVRWIFBybyByZXYuOUIgRk0rTklDQU0pIiwKCQkudmlkZW9faW5wdXRzCT0gNCwKCQkuYXVkaW9faW5wdXRzCT0gMSwKCQkudHVuZXIJCT0gMCwKCQkuc3ZocwkJPSAyLAoJCS5ncGlvbWFzawk9IDB4M2YsCgkJLm11eHNlbAkJPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXgJPSB7IDB4MDEsIDB4MDAsIDB4MDMsIDB4MDMsIDB4MDksIDB4MDIgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5hdWRpb19ob29rCT0gcHZidDg3OHA5Yl9hdWRpbywgLyogTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHN0ZXJlbyAqLwoJCS5oYXNfcmFkaW8JPSAxLCAgLyogTm90ZTogbm90IGFsbCBjYXJkcyBoYXZlIHJhZGlvICovCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCQkvKiBHUElPIHdpcmluZzoKCQkJR1BJTzA6IEEwIGhlZjQwNTIKCQkJR1BJTzE6IEExIGhlZjQwNTIKCQkJR1BJTzM6IG5FTiBoZWY0MDUyCgkJCUdQSU84LTE1OiB2cmQ4NjZiCgkJCUdQSU8yMCwyMiwyMzogUjMwLFIyOSxSMjgKCQkqLwoJfSwKCVtCVFRWX0JPQVJEX1NFTlNPUkFZMzExXSA9IHsKCQkvKiBDbGF5IEt1bnogPGNrdW56QG1haWwuYXJjLm5hc2EuZ292PiAqLwoJCS8qIHlvdSBtdXN0IGp1bXBlciBKUDUgZm9yIHRoZSBjYXJkIHRvIHdvcmsgKi8KCQkubmFtZSAgICAgICAgICAgPSAiU2Vuc29yYXkgMzExIiwKCQkudmlkZW9faW5wdXRzICAgPSA1LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gNCwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9SVjYwNV0gPSB7CgkJLyogTWlndWVsIEZyZWl0YXMgPG1pZ3VlbEBjZXR1Yy5wdWMtcmlvLmJyPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJSZW1vdGVWaXNpb24gTVggKFJWNjA1KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4MDdmZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDB4MzMsIDB4MTMsIDB4MjMsIDB4NDMsIDB4ZjMsIDB4NzMsIDB4ZTMsIDB4MDMsCgkJCQkweGQzLCAweGIzLCAweGMzLCAweDYzLCAweDkzLCAweDUzLCAweDgzLCAweGEzIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IHJ2NjA1X211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9QT1dFUkNMUl9NVFY4NzhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJQb3dlcmNvbG9yIE1UVjg3OC8gTVRWODc4Ui8gTVRWODc4RiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAyLAoJCS50dW5lcgkJPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgxQzgwMEYsICAvKiBCaXQwLTI6IEF1ZGlvIHNlbGVjdCwgOC0xMjpyZW1vdGUgY29udHJvbCAxNDpyZW1vdGUgdmFsaWQgMTU6cmVtb3RlIHJlc2V0ICovCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAxLCAxLCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgNCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnBsbAkJPSBQTExfMjgsCgkJLmhhc19yYWRpbwk9IDEsCgl9LAoKCS8qIC0tLS0gY2FyZCAweDRjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1dJTkRWUl0gPSB7CgkJLyogTWFzYWtpIFN1enVraSA8bWFzYWtpQGJ0cmVlLm9yZz4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ2Fub3B1cyBXaW5EVlIgUENJIChDT01QQVEgUHJlc2FyaW8gMzUyNEpQLCA1MTEySlApIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MTQwMDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMywgNCwgMCB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSB3aW5kdnJfYXVkaW8sCgl9LAoJW0JUVFZfQk9BUkRfR1JBTkRURUNfTVVMVEldID0gewoJCS5uYW1lICAgICAgICAgICA9ICJHcmFuZFRlYyBNdWx0aSBDYXB0dXJlIENhcmQgKEJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9LV09STERdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJKZXR3YXkgVFYvQ2FwdHVyZSBKVy1UVjg3OC1GQkssIEt3b3JsZCBLVy1UVjg3OFJGIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxIH0sICAgLyogVHVuZXIsIFNWaWQsIFNWSFMsIFNWaWQgdG8gU1ZIUyBjb25uZWN0b3IgKi8KCQkuYXVkaW9tdXggICAgICAgPSB7IDAgLDAgLDQsIDQsNCw0fSwvKiBZZXMsIHRoaXMgdHVuZXIgdXNlcyB0aGUgc2FtZSBhdWRpbyBvdXRwdXQgZm9yIFRWIGFuZCBGTSByYWRpbyEKCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgZXh0ZXJuYWwgQXVkaW8gSW4sIHNvIHdlIG11dGUgaXQgb24gRXh0LiAmIEludC4KCQkJCQkJKiBUaGUgUENCIGNhbiB0YWtlIGEgc2J4MTYzNy9zYngxNjczLCB3aXJpbmcgdW5rbm93bi4KCQkJCQkJKiBUaGlzIGNhcmQgbGFja3MgUENJIHN1YnN5c3RlbSBJRCwgc2lnaC4KCQkJCQkJKiBhdWRpb211eD0xOiBsb3dlciB2b2x1bWUsIDIrMzogbXV0ZQoJCQkJCQkqIGJ0d2luY2FwIHVzZXMgMHg4MDAwMC8weDgwMDAzCgkJCQkJCSovCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSA1LAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS8qIFNhbXN1bmcgVENQQTkwOTVQQzI3QSAoQkcrREspLCBwaGlsaXBzIGNvbXBhdGlibGUsIHcvRk0sIHN0ZXJlbyBhbmQKCQlyYWRpbyBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9ycyB3b3JrIGZpbmUuICovCgkJLmhhc19yYWRpbwk9IDEsCgkJLyogR1BJTyBJbmZvOgoJCQlHUElPMCwxOiAgIEhFRjQwNTIgQTAsQTEKCQkJR1BJTzI6ICAgICBIRUY0MDUyIG5FTkFCTEUKCQkJR1BJTzMtNzogICBuLmMuCgkJCUdQSU84LTEzOiAgSVJEQzM1NyBkYXRhMC01IChkYXRhNiBuLmMuID8pIFtjaGlwIG5vdCBwcmVzZW50IG9uIG15IGNhcmRdCgkJCUdQSU8xNCwxNTogPz8KCQkJR1BJTzE2LTIxOiBuLmMuCgkJCUdQSU8yMiwyMzogPz8KCQkJPz8gICAgICAgOiBtdHU4YjU2ZXAgbWljcm9jb250cm9sbGVyIGZvciBJUiAoR1BJTyB3aXJpbmcgdW5rbm93bikqLwoJfSwKCVtCVFRWX0JPQVJEX0RTUF9UQ1ZJREVPXSA9IHsKCQkvKiBBcnRodXIgVGV0emxhZmYtRGVhcywgRFNQIERlc2lnbiBMdGQgPHNvZnR3YXJlQGRzcGRlc2lnbi5jb20+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRTUCBEZXNpZ24gVENWSURFTyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDUwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX0hBVVBQQVVHRVBWUl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBQVlIiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAwLCAxLCAxfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCgkJLmdwaW9tYXNrICAgICAgID0gNywKCQkuYXVkaW9tdXggICAgICAgPSB7N30sCgl9LAoJW0JUVFZfQk9BUkRfR1ZCQ1RWNVBDSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi1CQ1RWNS9QQ0kiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwZjBmODAsCgkJLm11eHNlbCAgICAgICAgID0gezIsIDMsIDEsIDB9LAoJCS5hdWRpb211eCAgICAgICA9IHsweDAzMDAwMCwgMHgwMTAwMDAsIDAsIDAsIDB4MDIwMDAwLCAwfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vayAgICAgPSBndmJjdHY1cGNpX2F1ZGlvLAoJCS5oYXNfcmFkaW8gICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDEwMC8xNTAgKDg3OCkiLCAvKiAweDEoMnwzKS00NUM2LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwgICAgICAgICAgICAgICAgICAvKiBpZC1pbnB1dHMtY2xvY2sgKi8KCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAyLCAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MF84NDhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAwLzE1MCAoODQ4KSIsIC8qIDB4MDQtNTRDMC1DMSAmIG9sZGVyIGJvYXJkcyAqLwoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCgoJCS8qIC0tLS0gY2FyZCAweDU0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX09TUFJFWTEwMV84NDhdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxICg4NDgpIiwgLyogMHgwNS00MEMwLUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTF4MV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAxMDEvMTUxIiwgICAgICAgLyogMHgxKDR8NSktMDAwNC1DNCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSURdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMTAxLzE1MSB3LyBzdmlkIiwgIC8qIDB4KDE2fDE3fDIwKS0wMEM0LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX09TUFJFWTJ4eF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjAxLzI1MC8yNTEiLCAgLyogMHgxKDh8OXxFfEYpLTAwMDQtQzQgKi8KCQkudmlkZW9faW5wdXRzICAgPSAxLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAwIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk9zcHJleSAyMDAvMjUwIiwgICAvKiAweDEoQXxCKS0wMEM0LUMxICovCgkJLnZpZGVvX2lucHV0cyAgID0gMiwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAwLCAxIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gVU5TRVQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZMngwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAiLCAgIC8qIDB4MShBfEIpLTA0QzAtQzEgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9PU1BSRVk1MDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgNTAwIiwgICAvKiA1MDAgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfT1NQUkVZNTQwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDU0MCIsICAgLyogNTQwICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJI2lmIDAgLyogVE9ETyAuLi4gKi8KCQkuc3ZocyAgICAgICAgICAgPSBPU1BSRVk1NDBfU1ZJRF9BTkFMT0csCgkJLm11eHNlbCAgICAgICAgID0geyAgICAgICBbT1NQUkVZNTQwX0NPTVBfQU5BTE9HXSA9IDIsCgkJCQkJW09TUFJFWTU0MF9TVklEX0FOQUxPR10gPSAzLCB9LAoJI2VuZGlmCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJI2lmIDAgLyogVE9ETyAuLi4gKi8KCQkubXV4c2VsX2hvb2sgICAgPSBvc3ByZXlfNTQwX211eHNlbCwKCQkucGljdHVyZV9ob29rICAgPSBvc3ByZXlfNTQwX3NldF9waWN0dXJlLAoJI2VuZGlmCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg1QyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVkyMDAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIwMDAiLCAgLyogMjAwMCAqLwoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMyB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLCAgICAgIC8qIG11c3QgYXZvaWQsIGNvbmZsaWN0cyB3aXRoIHRoZSBidDg2MCAqLwoJfSwKCVtCVFRWX0JPQVJEX0lEU19FQUdMRV0gPSB7CgkJLyogTSBHIEJlcmJlcmljaCA8YmVyYmVyaWNAZm9yd2lzcy51bmktcGFzc2F1LmRlPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJRFMgRWFnbGUiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMCwgMSwgMiwgMyB9LAoJCS5tdXhzZWxfaG9vayAgICA9IGVhZ2xlX211eHNlbCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUGlubmFjbGUgUENUViBTYXQiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMywgMCwgMSwgMn0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9GT1JNQUNfUFJPVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJGb3JtYWMgUHJvVFYgSUkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICAgPSAyLAoJCS8qIFRWLCBDb21wMSwgQ29tcG9zaXRlIG92ZXIgU1ZJRCBjb24sIFNWSUQgKi8KCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMiwgMiwgMCwgMCwgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJLyogc291bmQgcm91dGluZzoKCQlHUElPPTB4MDAsMHgwMSwweDAzOiBtdXRlICg/KQoJCTB4MDI6IGJvdGggVFYgYW5kIHJhZGlvICh0dW5lcjogRk0xMjE2L0kpCgkJVGhlIGNhcmQgaGFzIG9uYm9hcmQgYXVkaW8gY29ubmVjdG9ycyBsYWJlbGVkICJjZHJvbSIgYW5kICJib2FyZCIsCgkJbm90IHNvbGRlcmVkIGhlcmUsIHRob3VnaCB1bmtub3duIHdpcmluZy4KCQlDYXJkIGxhY2tzOiBleHRlcm5hbCBhdWRpbyBpbiwgcGNpIHN1YnN5c3RlbSBpZC4KCSovCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg2MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9NQUNIVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJNYWNoVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDcsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDMsIDR9LAoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gNSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoJW0JUVFZfQk9BUkRfRVVSRVNZU19QSUNPTE9dID0gewoJCS5uYW1lICAgICAgICAgICA9ICJFdXJlc3lzIFBpY29sbyIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDAsIDF9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9QVjE1MF0gPSB7CgkJLyogTHVjIFZhbiBIb2V5bGFuZHQgPGx1Y0BlLW1hZ2ljLmJlPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE1MCIsIC8qIDB4NGYgKi8KCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgID0gMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0FEX1RWSzUwM10gPSB7CgkJLyogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+ICovCgkJLyogVGhpcyBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRCAqLwoJCS5uYW1lICAgICAgICAgICA9ICJBRC1UVks1MDMiLCAvKiAweDYzICovCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwMWU4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS8qICAgICAgICAgICAgICAgICAgVHVuZXIsIFJhZGlvLCBleHRlcm5hbCwgaW50ZXJuYWwsIG9mZiwgIG9uICovCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDA4LCAgMHgwZiwgIDB4MGEsICAgICAweDA4LCAgICAgMHgwZiwgMHgwOCB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuYXVkaW9faG9vawk9IGFkdHZrNTAzX2F1ZGlvLAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NjQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfSEVSQ1VMRVNfU01fVFZdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJIZXJjdWxlcyBTbWFydCBUViBTdGVyZW8iLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAxLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IDUsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLyogTm90ZXM6CgkJLSBjYXJkIGxhY2tzIHN1YnN5c3RlbSBJRAoJCS0gc3RlcmVvIHZhcmlhbnQgdy8gZGF1Z2h0ZXIgYm9hcmQgd2l0aCB0ZGE5ODc0YSBAMHhiMAoJCS0gQXVkaW8gUm91dGluZzoKCQkJYWx3YXlzIGZyb20gdGRhOTg3NCBpbmRlcGVuZGVudCBvZiBHUElPICg/KQoJCQlleHRlcm5hbCBsaW5lIGluOiB1bmtub3duCgkJLSBPdGhlciBjaGlwczogZW03OHAxNTZlbHAgQCAweDk2IChwcm9iYWJseSBJUiByZW1vdGUgY29udHJvbCkKCQkJaGVmNDA1MyAoaW5zdGVhZCA0MDUyKSBmb3IgdW5rbm93biBmdW5jdGlvbgoJCSovCgl9LAoJW0JUVFZfQk9BUkRfUEFDRVRWXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUGFjZSBUViAmIFJhZGlvIENhcmQiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAxfSwgLyogVHVuZXIsIENWaWQsIFNWaWQsIENWaWQgb3ZlciBTVmlkIGNvbm5lY3RvciAqLwoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS50dW5lcl90eXBlICAgICA9IDEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLyogQnQ4NzgsIEJ0ODMyLCBGSTEyNDYgdHVuZXI7IG5vIHBjaSBzdWJzeXN0ZW0gaWQKCQlvbmx5IGludGVybmFsIGxpbmUgb3V0OiAoNHBpbiBoZWFkZXIpIFJHR0wKCQlSYWRpbyBtdXN0IGJlIGRlY29kZWQgYnkgbXNwMzQxMGQgKG5vdCByb3V0ZWQgdGhyb3VnaCkqLwoJCS8qCgkJLmRpZ2l0YWxfbW9kZSAgID0gRElHSVRBTF9NT0RFX0NBTUVSQSwgIHRvZG8hCgkJKi8KCX0sCglbQlRUVl9CT0FSRF9JVkMyMDBdID0gewoJCS8qIENocmlzIFdpbGxpbmcgPGNocmlzQHZpc2xhYi51c3lkLmVkdS5hdT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiSVZDLTIwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDB4ZGYsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCVtCVFRWX0JPQVJEX1hHVUFSRF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkdyYW5kIFgtR3VhcmQgLyBUcnVzdCA4MTRQQ0kiLAoJCS52aWRlb19pbnB1dHMgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLnR1bmVyX3R5cGUgICAgID0gNCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuZ3Bpb21hc2syICAgICAgPSAweGZmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwyLDIsMiwgMywzLDMsMywgMSwxLDEsMSwgMCwwLDAsMCB9LAoJCS5tdXhzZWxfaG9vayAgICA9IHhndWFyZF9tdXhzZWwsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NjggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfTkVCVUxBX0RJR0lUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIk5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYiLAoJCS52aWRlb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwfSwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkuaGFzX3JlbW90ZQk9IDEsCgkJLmdwaW9tYXNrCT0gMHgxYiwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5hbnlfaXJxCQk9IDEsCgl9LAoJW0JUVFZfQk9BUkRfUFYxNDNdID0gewoJCS8qIEpvcmdlIEJvbmNvbXB0ZSAtIERUSTIgPGpvcmdlQGR0aTIubmV0PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJQcm9WaWRlbyBQVjE0MyIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICA9IDAsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwIH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WRDAwOVgxX01JTklESU5dID0gewoJCS8qIE0uS2xhaHJAcGh5dGVjLmRlICovCgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgTWluaURJTiAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsIC8qIGNhcmQgaGFzIG5vIHR1bmVyICovCgkJLnN2aHMgICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAwLCAwLCAwLCAwLCAwLCAwIH0sIC8qIGNhcmQgaGFzIG5vIGF1ZGlvICovCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfVkQwMDlYMV9DT01CSV0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDktWDEgQ29tYmkgKGJ0ODc4KSIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDMsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfVkQwMDlfTUlOSURJTl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIlBIWVRFQyBWRC0wMDkgTWluaURJTiAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAxMCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDksCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMCB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX1ZEMDA5X0NPTUJJXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiUEhZVEVDIFZELTAwOSBDb21iaSAoYnQ4NzgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAxMCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLCAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS5zdmhzICAgICAgICAgICA9IDksCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMCwKCQkuZ3Bpb21hc2syICAgICAgPSAweDAzLCAvKiBncGlvbWFzazIgZGVmaW5lcyB0aGUgYml0cyB1c2VkIHRvIHN3aXRjaCBhdWRpbwoJCQkJCXZpYSB0aGUgdXBwZXIgbmliYmxlIG9mIG11eHNlbC4gaGVyZTogdXNlZCBmb3IKCQkJCQl4dGVybmFsIHZpZGVvLW11eCAqLwoJCS5tdXhzZWwgICAgICAgICA9IHsgMHgwMiwgMHgxMiwgMHgyMiwgMHgzMiwgMHgwMywgMHgxMywgMHgyMywgMHgzMywgMHgwMSwgMHgwMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5uZWVkc190dmF1ZGlvICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCVtCVFRWX0JPQVJEX0lWQzEwMF0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIklWQy0xMDAiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweGRmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMCB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9JVkMxMjBdID0gewoJCS8qIElWQy0xMjBHIC0gQWxhbiBHYXJmaWVsZCA8YWxhbkBmcm9tb3JiaXQuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJJVkMtMTIwRyIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwgICAgLyogY2FyZCBoYXMgbm8gYXVkaW8gKi8KCQkudHVuZXIgICAgICAgICAgPSAtMSwgICAvKiBjYXJkIGhhcyBubyB0dW5lciAqLwoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzICAgICAgICAgICA9IC0xLCAgIC8qIGNhcmQgaGFzIG5vIHN2aHMgKi8KCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDAsCgkJLm11eHNlbCAgICAgICAgID0geyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAoJCQkJMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCB9LAoJCS5tdXhzZWxfaG9vayAgICA9IGl2YzEyMF9tdXhzZWwsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJfSwKCgkJLyogLS0tLSBjYXJkIDB4NzAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfUENfSERUVl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gInBjSERUViBIRC0yMDAwIFRWIiwKCQkudmlkZW9faW5wdXRzICAgPSA0LAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMH0sCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19BVFNDLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfZHZiICAgICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfVFdJTkhBTl9EU1RdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUd2luaGFuIERTVCArIGNsb25lcyIsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9XSU5GQVNUVkMxMDBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJXaW5mYXN0IFZDMTAwIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDMsIDEsIDEsIDN9LCAvKiBWaWQgSW4sIFNWaWQgSW4sIFZpZCBvdmVyIFNWaWQgaW4gY29ubmVjdG9yICovCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCglbQlRUVl9CT0FSRF9URVY1NjBdID0gewoJCS5uYW1lICAgICAgICAgICA9ICJUZXBwcm8gVEVWLTU2MC9JbnRlclZpc2lvbiBJVi01NjAiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDF9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMSwgMSwgMSwgMSwgMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMzUsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9TSU1VU19HVkMxMTAwXSA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiU0lNVVMgR1ZDMTEwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAwLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IC0xLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDJ9LAoJCS5ncGlvbWFzayAgICAgICA9IDB4M0YsCgkJLm11eHNlbF9ob29rICAgID0gZ3ZjMTEwMF9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfTkdTVFZfUExVU10gPSB7CgkJLyogQ2FybG9zIFNpbHZhIHIzcGVrQHIzcGVrLmhvbWVsaW51eC5vcmcgfHwgY2FyZCAweDc1ICovCgkJLm5hbWUgICAgICAgICAgID0gIk5HUyBOR1NUVisiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsyLCAzLCAwLCAwfSwKCQkuYXVkaW9tdXggICAgICAgPSB7MCwgMCwgMCwgMCwgMHgwMDAwMDMsIDB9LAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX0xNTEJUNF0gPSB7CgkJLyogaHR0cDovL2xpbnV4bWVkaWFsYWJzLmNvbSAqLwoJCS5uYW1lICAgICAgICAgICA9ICJMTUxCVDQiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsIC8qIElOMSxJTjIsSU4zLElONCAqLwoJCS5hdWRpb19pbnB1dHMgICA9IDAsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLnN2aHMgICAgICAgICAgID0gLTEsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxLCAwIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9URUtSQU1fTTIwNV0gPSB7CgkJLyogSGVsbXJvb3MgSGFycmkgPGhhcnJpLmhlbG1yb29zQHBwLmluZXQuZmk+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlRla3JhbSBNMjA1IFBSTyIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5ncGlvbWFzayAgICAgICA9IDB4NjgsCgkJLm11eHNlbCAgICAgICAgID0geyAyLCAzLCAxfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDB4NjgsIDB4NjgsIDB4NjEsIDB4NjEsIDB4MDAgfSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg3OCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05UVkZNSV0gPSB7CgkJLyogSmF2aWVyIENlbmRhbiBBcmVzIDxqY2VuZGFuQGx5Y29zLmVzPiAqLwoJCS8qIGJ0ODc4IFRWICsgRk0gd2l0aG91dCBzdWJzeXN0ZW0gSUQgKi8KCQkubmFtZSAgICAgICAgICAgPSAiQ29uY2VwdHJvbmljIENPTlRWRk1pIiwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAyLAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDA4MDA3LAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMSwgMiwgMiwgMyB9LAoJCS5uZWVkc190dmF1ZGlvICA9IDAsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCX0sCglbQlRUVl9CT0FSRF9QSUNPTE9fVEVUUkFfQ0hJUF0gPSB7CgkJLypFcmljIERFQklFRiA8ZGViaWVmQHRlbGVtc2EuY29tPiovCgkJLypFVVJFU1lTIFBpY29sbyBUZXRyYSA6IDQgQ29uZXhhbnQgRnVzaW9uIDg3OEEsIG5vIGF1ZGlvLCB2aWRlbyBpbnB1dCBzZXQgd2l0aCBhbmFsb2cgbXVsdGlwbGV4ZXJzIEdQSU8gY29udHJvbGVkKi8KCQkvKiBhZGRzIHBpY29sb190ZXRyYV9tdXhzZWwoKSwgcGljb2xvX3RldHJhX2luaXQoKSwgdGhlIGZvbG93aW5nIGRlY2xhcmF0aW9uIHN0cnVjdXJlLCBhbmQgI2RlZmluZSBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQKi8KCQkvKjB4NzkgaW4gYnR0di5oKi8KCQkubmFtZSAgICAgICAgICAgPSAiRXVyZXN5cyBQaWNvbG8gVGV0cmEiLAoJCS52aWRlb19pbnB1dHMgICA9IDQsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAwLAoJCS5ncGlvbWFzazIgICAgICA9IDB4M0M8PDE2LC8qU2V0IHRoZSBHUElPWzE4XS0+R1BJT1syMV0gYXMgb3V0cHV0IHBpbi49PT4gZHJpdmUgdGhlIHZpZGVvIGlucHV0cyB0aHJvdWdoIGFuYWxvZyBtdWx0aXBsZXhlcnMqLwoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5tdXhzZWwgICAgICAgICA9IHsyLDIsMiwyfSwvKjg3OEEgaW5wdXQgaXMgYWx3YXlzIE1VWDAsIHNlZSBhYm92ZS4qLwoJCS5hdWRpb211eCAgICAgICA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9LCAvKiBjYXJkIGhhcyBubyBhdWRpbyAqLwoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5tdXhzZWxfaG9vayAgICA9IHBpY29sb190ZXRyYV9tdXhzZWwsLypSZXF1aXJlZCBhcyBpdCBkb2Vzbid0IGZvbGxvdyB0aGUgY2xhc3NpYyBpbnB1dCBzZWxlY3Rpb24gcG9saWN5Ki8KCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9TUElSSVRfVFZdID0gewoJCS8qIFNwaXJpdCBUViBUdW5lciBmcm9tIGh0dHA6Ly9zcGlyaXRtb2RlbXMuY29tLmF1ICovCgkJLyogU3RhZmZvcmQgR29vZHNlbGwgPHN1cmdlQGdvbGlhdGguaG9tZXVuaXgub3JnPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTcGlyaXQgVFYgVHVuZXIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDAwMDAwZiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RFTUlDX1BBTCwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfQVZEVkJUXzc3MV0gPSB7CgkJLyogV29sZnJhbSBKb29zdCA8d29qb0Bmcm9rYXNjaHdlaS5kZT4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIEFWZXJUViBEVkItVCA3NzEiLAoJCS52aWRlb19pbnB1dHMgICA9IDIsCgkJLnN2aHMgICAgICAgICAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BQlNFTlQsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLm11eHNlbCAgICAgICAgID0geyAzICwgMyB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLm5vX3RkYTk4NzUgICAgID0gMSwKCQkubm9fdGRhNzQzMiAgICAgPSAxLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkuaGFzX2R2YiAgICAgICAgPSAxLAoJCS5ub19ncGlvaXJxICAgICA9IDEsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4N2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQVZEVkJUXzc2MV0gPSB7CgkJLyogTWF0dCBKZXNzb24gPGR2YkBqZXNzb24uZWNsaXBzZS5jby51az4gKi8KCQkvKiBCYXNlZCBvbiB0aGUgTmVidWxhIGNhcmQgZGF0YSAtIGFkZGVkIHJlbW90ZSBhbmQgbmV3IGNhcmQgbnVtYmVyIC0gQlRUVl9CT0FSRF9BVkRWQlRfNzYxLCBzZWUgYWxzbyBpci1rYmQtZ3Bpby5jICovCgkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAzLCAxLCAyLCAwfSwgLyogQ29tcDAsIFMtVmlkZW8sID8sID8gKi8KCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTlNRXSA9IHsKCQkvKiBhbmRyZS5zY2h3YXJ6QG1hdHJpeC12aXNpb24uZGUgKi8KCQkubmFtZSAgICAgICAgICAgICA9ICJNQVRSSVggVmlzaW9uIFNpZ21hLVNRIiwKCQkudmlkZW9faW5wdXRzICAgICA9IDE2LAoJCS5hdWRpb19pbnB1dHMgICAgID0gMCwKCQkudHVuZXIgICAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICAgID0gLTEsCgkJLmdwaW9tYXNrICAgICAgICAgPSAweDAsCgkJLm11eHNlbCAgICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCgkJCQkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNRX211eHNlbCwKCQkuYXVkaW9tdXggICAgICAgICA9IHsgMCB9LAoJCS5ub19tc3AzNHh4ICAgICAgID0gMSwKCQkucGxsICAgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCSAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgl9LAoJW0JUVFZfQk9BUkRfTUFUUklYX1ZJU0lPTlNMQ10gPSB7CgkJLyogYW5kcmUuc2Nod2FyekBtYXRyaXgtdmlzaW9uLmRlICovCgkJLm5hbWUgICAgICAgICAgICAgPSAiTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMiLAoJCS52aWRlb19pbnB1dHMgICAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgICA9IDAsCgkJLnR1bmVyICAgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgICA9IC0xLAoJCS5ncGlvbWFzayAgICAgICAgID0gMHgwLAoJCS5tdXhzZWwgICAgICAgICAgID0geyAyLCAyLCAyLCAyIH0sCgkJLm11eHNlbF9ob29rICAgICAgPSBzaWdtYVNMQ19tdXhzZWwsCgkJLmF1ZGlvbXV4ICAgICAgICAgPSB7IDAgfSwKCQkubm9fbXNwMzR4eCAgICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgkgID0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJfSwKCQkvKiBCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVAgKi8KCVtCVFRWX0JPQVJEX0FQQUNfVklFV0NPTVBdID0gewoJCS8qIEF0dGlsYSBLb25kb3JvcyA8YXR0aWxhLmtvbmRvcm9zQGNoZWxsby5odT4gKi8KCQkvKiBidDg3OCBUViArIEZNIDB4MDAwMDAwMDAgc3Vic3lzdGVtIElEICovCgkJLm5hbWUgICAgICAgICAgID0gIkFQQUMgVmlld2NvbXAgODc4KEFNQVgpIiwKCQkudmlkZW9faW5wdXRzICAgPSAyLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnR1bmVyICAgICAgICAgID0gMCwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkuZ3Bpb21hc2sgICAgICAgPSAweEZGLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAyLCAwLCAwLCAwLCAxMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMCwKCQkucGxsICAgICAgICAgICAgPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwgICAvKiBtaW5pcmVtb3RlIHdvcmtzLCBzZWUgaXIta2JkLWdwaW8uYyAqLwoJCS5oYXNfcmFkaW8gICAgICA9IDEsICAgLyogbm90IGV2ZXJ5IGNhcmQgaGFzIHJhZGlvICovCgl9LAoKCQkvKiAtLS0tIGNhcmQgMHg4MCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEVdID0gewoJCS8qIENocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+ICovCgkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgTGl0ZSIsCgkJLnR1bmVyICAgICAgICAgID0gLTEsCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS5ub192aWRlbyAgICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCQkudHVuZXJfdHlwZSAgICAgPSAtMSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCglbQlRUVl9CT0FSRF9WR0VBUl9NWVZDRF0gPSB7CgkJLyogU3RldmVuIDxwaG90b24zOEBwY2hvbWUuY29tLnR3PiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJWLUdlYXIgTXlWQ0QiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgzZiwKCQkubXV4c2VsICAgICAgICAgPSB7MiwgMywgMSwgMH0sCgkJLmF1ZGlvbXV4ICAgICAgID0gezB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzEsIDB4MzF9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5oYXNfcmFkaW8gICAgICA9IDAsCgkjaWYgMAoJCS5oYXNfcmVtb3RlICAgICA9IDEsCgkjZW5kaWYKCX0sCglbQlRUVl9CT0FSRF9TVVBFUl9UVl0gPSB7CgkJLyogUmljayBDIDxjcnlwdGRyYWdvb25AZ21haWwuY29tPiAqLwoJCS5uYW1lICAgICAgICAgICA9ICJTdXBlciBUViBUdW5lciIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDAwODAwNywKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDB4MDAwMDAxLDAsMCwgMH0sCgkJLm5lZWRzX3R2YXVkaW8gID0gMSwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCVtCVFRWX0JPQVJEX1RJQkVUX0NTMTZdID0gewoJCS8qIENocmlzIEZhbm5pbmcgPHZpZGVvNGxpbnV4QGhheWRvbi5uZXQ+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiIsCgkJLnZpZGVvX2lucHV0cyAgID0gMTYsCgkJLmF1ZGlvX2lucHV0cyAgID0gMCwKCQkudHVuZXIgICAgICAgICAgPSAtMSwKCQkuc3ZocyAgICAgICAgICAgPSAtMSwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIgfSwKCQkucGxsCQk9IFBMTF8yOCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIJPSAxLAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5tdXhzZWxfaG9vayAgICA9IHRpYmV0Q1MxNl9tdXhzZWwsCgl9LAoJW0JUVFZfQk9BUkRfS09ESUNPTV80NDAwUl0gPSB7CgkJLyogQmlsbCBCcmFjayA8d2JyYWNrQG1tbS5jb20uaGs+ICovCgkJLyoKCQkqIE5vdGUgdGhhdCwgYmVjYXVzZSBvZiB0aGUgY2FyZCdzIHdpcmluZywgdGhlICJtYXN0ZXIiCgkJKiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUgb25lIHdoaWNoIGNvbnRyb2xzIHRoZSBhbmFsb2cgc3dpdGNoCgkJKiBhbmQgbXVzdCB1c2UgdGhpcyBjYXJkIHR5cGUpIGlzIHRoZSAybmQgb25lIGRldGVjdGVkLiAgVGhlCgkJKiBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgY2FyZCB0eXBlIDB4ODUsIHdob3NlIGRlc2NyaXB0aW9uCgkJKiBmb2xsb3dzIHRoaXMgb25lLiAgVGhlcmUgaXMgYSBFRVBST00gb24gdGhlIGNhcmQgKHdoaWNoIGlzCgkJKiBjb25uZWN0ZWQgdG8gdGhlIEkyQyBvZiBvbmUgb2YgdGhvc2Ugb3RoZXIgY2hpcHMpLCBidXQgaXMKCQkqIG5vdCBjdXJyZW50bHkgaGFuZGxlZC4gIFRoZXJlIGlzIGFsc28gYSBmYWNpbGl0eSBmb3IgYQoJCSogIm1vbml0b3IiLCB3aGljaCBpcyBhbHNvIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCgkJKi8KCQkubmFtZSAgICAgICAgICAgPSAiS29kaWNvbSA0NDAwUiAobWFzdGVyKSIsCgkJLnZpZGVvX2lucHV0cwk9IDE2LAoJCS5hdWRpb19pbnB1dHMJPSAwLAoJCS50dW5lcgkJPSAtMSwKCQkudHVuZXJfdHlwZQk9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5zdmhzCQk9IC0xLAoJCS8qIEdQSU8gYml0cyAwLTkgdXNlZCBmb3IgYW5hbG9nIHN3aXRjaDoKCQkqICAgMDAgLSAwMzoJY2FtZXJhIHNlbGVjdG9yCgkJKiAgIDA0IC0gMDY6CWNoYW5uZWwgKGNvbnRyb2xsZXIpIHNlbGVjdG9yCgkJKiAgIDA3OglkYXRhICgxLT5vbiwgMC0+b2ZmKQoJCSogICAwODoJc3Ryb2JlCgkJKiAgIDA5OglyZXNldAoJCSogYml0IDE2IGlzIGlucHV0IGZyb20gc3luYyBzZXBhcmF0b3IgZm9yIHRoZSBjaGFubmVsCgkJKi8KCQkuZ3Bpb21hc2sJPSAweDAwMDNmZiwKCQkubm9fZ3Bpb2lycSAgICAgPSAxLAoJCS5tdXhzZWwJCT0geyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCgkJLnBsbAkJPSBQTExfMjgsCgkJLm5vX21zcDM0eHgJPSAxLAoJCS5ub190ZGE3NDMyCT0gMSwKCQkubm9fdGRhOTg3NQk9IDEsCgkJLm11eHNlbF9ob29rCT0ga29kaWNvbTQ0MDByX211eHNlbCwKCX0sCglbQlRUVl9CT0FSRF9LT0RJQ09NXzQ0MDBSX1NMXSA9IHsKCQkvKiBCaWxsIEJyYWNrIDx3YnJhY2tAbW1tLmNvbS5oaz4gKi8KCQkvKiBOb3RlIHRoYXQsIGZvciByZWFzb25zIHVua25vd24sIHRoZSAibWFzdGVyIiBCVDg3OEEgY2hpcCAoaS5lLiB0aGUKCQkqIG9uZSB3aGljaCBjb250cm9scyB0aGUgYW5hbG9nIHN3aXRjaCwgYW5kIG11c3QgdXNlIHRoZSBjYXJkIHR5cGUpCgkJKiBpcyB0aGUgMm5kIG9uZSBkZXRlY3RlZC4gIFRoZSBvdGhlciAzIGNoaXBzIHNob3VsZCB1c2UgdGhpcyBjYXJkCgkJKiB0eXBlCgkJKi8KCQkubmFtZQkJPSAiS29kaWNvbSA0NDAwUiAoc2xhdmUpIiwKCQkudmlkZW9faW5wdXRzCT0gMTYsCgkJLmF1ZGlvX2lucHV0cwk9IDAsCgkJLnR1bmVyCQk9IC0xLAoJCS50dW5lcl90eXBlCT0gLTEsCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnN2aHMJCT0gLTEsCgkJLmdwaW9tYXNrCT0gMHgwMTAwMDAsCgkJLm5vX2dwaW9pcnEgICAgID0gMSwKCQkubXV4c2VsCQk9IHsgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMyB9LAoJCS5wbGwJCT0gUExMXzI4LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhNzQzMgk9IDEsCgkJLm5vX3RkYTk4NzUJPSAxLAoJCS5tdXhzZWxfaG9vawk9IGtvZGljb200NDAwcl9tdXhzZWwsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDg2LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQURMSU5LX1JUVjI0XSA9IHsKCQkvKiBNaWNoYWVsIEhlbnNvbiA8bWhlbnNvbkBjbGFyaXR5dmkuY29tPiAqLwoJCS8qIEFkbGluayBSVFYyNCB3aXRoIHNwZWNpYWwgdW5sb2NrIGNvZGVzICovCgkJLm5hbWUgICAgICAgICAgID0gIkFkbGluayBSVFYyNCIsCgkJLnZpZGVvX2lucHV0cyAgID0gNCwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAoJCS50dW5lcl90eXBlICAgICA9IC0xLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURV0gPSB7CgkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4gKi8KCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDYyRiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkudmlkZW9faW5wdXRzICAgPSAzLAoJCS5hdWRpb19pbnB1dHMgICA9IDEsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSB9LAoJCS5ncGlvbWFzayAgICAgICA9IDB4MDBlMDAwMDcsCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwNDAwMDA1LCAwLCAweDAwMDAwMDAxLCAwLCAweDAwYzAwMDA3LCAwIH0sCgkJLm5vX21zcDM0eHggICAgID0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLmhhc19kdmIgICAgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4ODgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9BQ09SUF9ZODc4Rl0gPSB7CgkJLyogTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiAqLwoJCS5uYW1lCQk9ICJBY29ycCBZODc4RiIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAoJCS5uZWVkc190dmF1ZGlvCT0gMSwKCQkucGxsCQk9IFBMTF8yOCwKCQkudHVuZXJfdHlwZQk9IFRVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRiwKCQkudHVuZXJfYWRkcgk9IDB4YzEgPj4xLAoJCS5yYWRpb19hZGRyICAgICA9IDB4YzEgPj4xLAoJCS5oYXNfcmFkaW8JPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4OSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9DT05DRVBUUk9OSUNfQ1RWRk1JMl0gPSB7CgkJLm5hbWUgICAgICAgICAgID0gIkNvbmNlcHRyb25pYyBDVFZGTWkgdjIiLAoJCS52aWRlb19pbnB1dHMgICA9IDMsCgkJLmF1ZGlvX2lucHV0cyAgID0gMSwKCQkudHVuZXIgICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgICA9IDIsCgkJLmdwaW9tYXNrICAgICAgID0gMHgwMDFjMDAwNywKCQkubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDEgfSwKCQkuYXVkaW9tdXggICAgICAgPSB7IDAsIDEsIDIsIDIsIDMgfSwKCQkubmVlZHNfdHZhdWRpbyAgPSAwLAoJCS5wbGwgICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU5BXzk1MzNfREksCgkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yZW1vdGUgICAgID0gMSwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9QVl9CVDg3OFBfMkVdID0gewoJCS5uYW1lICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWx2aWV3IFBWLUJUODc4UCsgKFJldi4yRSkiLAoJCS52aWRlb19pbnB1dHMgID0gNSwKCQkuYXVkaW9faW5wdXRzICA9IDEsCgkJLnR1bmVyICAgICAgICAgPSAwLAoJCS5zdmhzICAgICAgICAgID0gMywKCQkuZ3Bpb21hc2sgICAgICA9IDB4MDFmZTAwLAoJCS5tdXhzZWwgICAgICAgID0geyAyLDMsMSwxLC0xIH0sCgkJLmRpZ2l0YWxfbW9kZSAgPSBESUdJVEFMX01PREVfQ0FNRVJBLAoJCS5hdWRpb211eCAgICAgID0geyAweDAwNDAwLCAweDEwNDAwLCAweDA0NDAwLCAweDgwMDAwLCAweDEyNDAwLCAweDQ2MDAwICB9LAoJCS5ub19tc3AzNHh4ICAgID0gMSwKCQkucGxsICAgICAgICAgICA9IFBMTF8yOCwKCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0xHX1BBTF9GTSwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkuaGFzX3JlbW90ZSAgICA9IDEsCgl9LAoJCS8qIC0tLS0gY2FyZCAweDhiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCVtCVFRWX0JPQVJEX1BWX000OTAwXSA9IHsKCQkvKiBT6XJnaW8gRm9ydGllciA8c2VyZ2lvZm9ydGllckB5YWhvby5jb20uYnI+ICovCgkJLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGl4ZWxWaWV3IFBsYXlUViBNUEVHMiBQVi1NNDkwMCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMywKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IDAsCgkJLnN2aHMgICAgICAgICAgID0gMiwKCQkuZ3Bpb21hc2sgICAgICAgPSAweDNmLAoJCS5tdXhzZWwgICAgICAgICA9IHsgMiwgMywgMSwgMSB9LAoJCS5hdWRpb211eCAgICAgICA9IHsgMHgyMSwgMHgyMCwgMHgyNCwgMHgyYywgMHgyOSwgMHgyOSB9LAoJCS5ub19tc3AzNHh4ICAgICA9IDEsCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1lNRUNfVFZGXzU1MzNNRiwKCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAoJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLmhhc19yYWRpbyAgICAgID0gMSwKCQkuaGFzX3JlbW90ZSAgICAgPSAxLAoJfSwKCQkvKiAtLS0tIGNhcmQgMHg4YyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCglbQlRUVl9CT0FSRF9PU1BSRVk0NDBdICA9IHsKCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDQ0MCIsCgkJLnZpZGVvX2lucHV0cyAgID0gMSwKCQkuYXVkaW9faW5wdXRzICAgPSAxLAoJCS50dW5lciAgICAgICAgICA9IC0xLAoJCS5zdmhzICAgICAgICAgICA9IDEsCgkJLm11eHNlbCAgICAgICAgID0geyAyIH0sCgkJLnBsbCAgICAgICAgICAgID0gUExMXzI4LAoJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAoJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCQkubm9fbXNwMzR4eCAgICAgPSAxLAoJCS5ub190ZGE5ODc1ICAgICA9IDEsCgkJLm5vX3RkYTc0MzIgICAgID0gMSwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfQVNPVU5EX1NLWUVZRV0gPSB7CgkJLm5hbWUJCT0gIkFzb3VuZCBTa3lleWUgUENUViIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAxNSwKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0gezIsMCwwLDAsMX0sCgkJLm5lZWRzX3R2YXVkaW8JPSAxLAoJCS5wbGwJCT0gUExMXzI4LAoJCS50dW5lcl90eXBlCT0gMiwKCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCgkJLnJhZGlvX2FkZHIgICAgID0gQUREUl9VTlNFVCwKCX0sCgkJLyogLS0tLSBjYXJkIDB4OGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoJW0JUVFZfQk9BUkRfU0FCUkVOVF9UVkZNXSA9IHsKCQkubmFtZQkJPSAiU2FicmVudCBUVi1GTSAoYnR0diB2ZXJzaW9uKSIsCgkJLnZpZGVvX2lucHV0cwk9IDMsCgkJLmF1ZGlvX2lucHV0cwk9IDEsCgkJLnR1bmVyCQk9IDAsCgkJLnN2aHMJCT0gMiwKCQkuZ3Bpb21hc2sJPSAweDEwODAwNywKCQkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCgkJLmF1ZGlvbXV4CT0geyAxMDAwMDAsIDEwMDAwMiwgMTAwMDAyLCAxMDAwMDB9LAoJCS5ub19tc3AzNHh4CT0gMSwKCQkubm9fdGRhOTg3NSAgICAgPSAxLAoJCS5ub190ZGE3NDMyICAgICA9IDEsCgkJLnBsbAkJPSBQTExfMjgsCgkJLnR1bmVyX3R5cGUJPSBUVU5FUl9UTkZfNTMzNU1GLAoJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKCQkuaGFzX3JhZGlvICAgICAgPSAxLAoJfSwKfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYnR0dl9udW1fdHZjYXJkcyA9IEFSUkFZX1NJWkUoYnR0dl90dmNhcmRzKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdOwoKLyoKICogaWRlbnRpZnkgY2FyZAogKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pZGNhcmQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgaW50IGdwaW9iaXRzOwoJaW50IGksdHlwZTsKCXVuc2lnbmVkIHNob3J0IHRtcDsKCgkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ0bXApOwoJYnR2LT5jYXJkaWQgPSB0bXAgPDwgMTY7CglwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7CglidHYtPmNhcmRpZCB8PSB0bXA7CgoJaWYgKDAgIT0gYnR2LT5jYXJkaWQgJiYgMHhmZmZmZmZmZiAhPSBidHYtPmNhcmRpZCkgewoJCS8qIGxvb2sgZm9yIHRoZSBjYXJkICovCgkJZm9yICh0eXBlID0gLTEsIGkgPSAwOyBjYXJkc1tpXS5pZCAhPSAwOyBpKyspCgkJCWlmIChjYXJkc1tpXS5pZCAgPT0gYnR2LT5jYXJkaWQpCgkJCQl0eXBlID0gaTsKCgkJaWYgKHR5cGUgIT0gLTEpIHsKCQkJLyogZm91bmQgaXQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBkZXRlY3RlZDogJXMgW2NhcmQ9JWRdLCAiCgkJCSAgICAgICAiUENJIHN1YnN5c3RlbSBJRCBpcyAlMDR4OiUwNHhcbiIsCgkJCSAgICAgICBidHYtPmMubnIsY2FyZHNbdHlwZV0ubmFtZSxjYXJkc1t0eXBlXS5jYXJkbnIsCgkJCSAgICAgICBidHYtPmNhcmRpZCAmIDB4ZmZmZiwKCQkJICAgICAgIChidHYtPmNhcmRpZCA+PiAxNikgJiAweGZmZmYpOwoJCQlidHYtPmMudHlwZSA9IGNhcmRzW3R5cGVdLmNhcmRucjsKCQl9IGVsc2UgewoJCQkvKiA0MDQgKi8KCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzdWJzeXN0ZW06ICUwNHg6JTA0eCAoVU5LTk9XTilcbiIsCgkJCSAgICAgICBidHYtPmMubnIsIGJ0di0+Y2FyZGlkICYgMHhmZmZmLAoJCQkgICAgICAgKGJ0di0+Y2FyZGlkID4+IDE2KSAmIDB4ZmZmZik7CgkJCXByaW50ayhLRVJOX0RFQlVHICJwbGVhc2UgbWFpbCBpZCwgYm9hcmQgbmFtZSBhbmQgIgoJCQkgICAgICAgInRoZSBjb3JyZWN0IGNhcmQ9IGluc21vZCBvcHRpb24gdG8gdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tXG4iKTsKCQl9Cgl9CgoJLyogbGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBhdXRvZGV0ZWN0ZWQgdHlwZSAqLwoJaWYgKGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMpCgkJYnR2LT5jLnR5cGU9Y2FyZFtidHYtPmMubnJdOwoKCS8qIHByaW50IHdoaWNoIGNhcmQgY29uZmlnIHdlIGFyZSB1c2luZyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiB1c2luZzogJXMgW2NhcmQ9JWQsJXNdXG4iLGJ0di0+Yy5uciwKCSAgICAgICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsIGJ0di0+Yy50eXBlLAoJICAgICAgIGNhcmRbYnR2LT5jLm5yXSA8IGJ0dHZfbnVtX3R2Y2FyZHMKCSAgICAgICA/ICJpbnNtb2Qgb3B0aW9uIiA6ICJhdXRvZGV0ZWN0ZWQiKTsKCgkvKiBvdmVyd3JpdGUgZ3BpbyBzdHVmZiA/PyAqLwoJaWYgKFVOU0VUID09IGF1ZGlvYWxsICYmIFVOU0VUID09IGF1ZGlvbXV4WzBdKQoJCXJldHVybjsKCglpZiAoVU5TRVQgIT0gYXVkaW9tdXhbMF0pIHsKCQlncGlvYml0cyA9IDA7CgkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQlidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2ldID0gYXVkaW9tdXhbaV07CgkJCWdwaW9iaXRzIHw9IGF1ZGlvbXV4W2ldOwoJCX0KCX0gZWxzZSB7CgkJZ3Bpb2JpdHMgPSBhdWRpb2FsbDsKCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CgkJCWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbaV0gPSBhdWRpb2FsbDsKCQl9Cgl9CglidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrID0gKFVOU0VUICE9IGdwaW9tYXNrKSA/IGdwaW9tYXNrIDogZ3Bpb2JpdHM7CglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGdwaW8gY29uZmlnIG92ZXJyaWRlOiBtYXNrPTB4JXgsIG11eD0iLAoJICAgICAgIGJ0di0+Yy5ucixidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmdwaW9tYXNrKTsKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKCQlwcmludGsoIiVzMHgleCIsIGkgPyAiLCIgOiAiIiwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb211eFtpXSk7Cgl9CglwcmludGsoIlxuIik7Cn0KCi8qCiAqIChtb3N0KSBib2FyZCBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbnMgZ29lcyBoZXJlCiAqLwoKLyogU29tZSBNb2R1bGFyIFRlY2hub2xvZ3kgY2FyZHMgaGF2ZSBhbiBlZXByb20sIGJ1dCBubyBzdWJzeXN0ZW0gSUQgKi8Kdm9pZCBpZGVudGlmeV9ieV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgY2hhciBlZXByb21fZGF0YVsyNTZdKQp7CglpbnQgdHlwZSA9IC0xOwoKCWlmICgwID09IHN0cm5jbXAoZWVwcm9tX2RhdGEsIkdFVCBNTTIweFBDVFYiLDEzKSkKCQl0eXBlID0gQlRUVl9CT0FSRF9NT0RURUNfMjA1OwoJZWxzZSBpZiAoMCA9PSBzdHJuY21wKGVlcHJvbV9kYXRhKzIwLCJQaWNvbG8iLDcpKQoJCXR5cGUgPSBCVFRWX0JPQVJEX0VVUkVTWVNfUElDT0xPOwoJZWxzZSBpZiAoZWVwcm9tX2RhdGFbMF0gPT0gMHg4NCAmJiBlZXByb21fZGF0YVsyXT09IDApCgkJdHlwZSA9IEJUVFZfQk9BUkRfSEFVUFBBVUdFOyAvKiBvbGQgYnQ4NDggKi8KCglpZiAoLTEgIT0gdHlwZSkgewoJCWJ0di0+Yy50eXBlID0gdHlwZTsKCQlwcmludGsoImJ0dHYlZDogZGV0ZWN0ZWQgYnkgZWVwcm9tOiAlcyBbY2FyZD0lZF1cbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5uYW1lLCBidHYtPmMudHlwZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGZseXZpZGVvX2dwaW8oc3RydWN0IGJ0dHYgKmJ0dikKewoJaW50IGdwaW8saGFzX3JlbW90ZSxoYXNfcmFkaW8saXNfY2FwdHVyZV9vbmx5LGlzX2xyOTAsaGFzX3RkYTk4MjBfdGRhOTgyMTsKCWludCB0dW5lcj0tMSx0dHlwZTsKCglncGlvX2lub3V0KDB4ZmZmZmZmLCAwKTsKCXVkZWxheSg4KTsgIC8qIHdpdGhvdXQgdGhpcyB3ZSB3b3VsZCBzZWUgdGhlIDB4MTgwMCBtYXNrICovCglncGlvID0gZ3Bpb19yZWFkKCk7CgkvKiBGSVhNRTogbXVzdCByZXN0b3JlIE9VUl9FTiA/Pz8gKi8KCgkvKiBhbGwgY2FyZHMgcHJvdmlkZSBHUElPIGluZm8sIHNvbWUgaGF2ZSBhbiBhZGRpdGlvbmFsIGVlcHJvbQoJICogTFI1MDogR1BJTyBjb2RpbmcgY2FuIGJlIGZvdW5kIGxvd2VyIHJpZ2h0IENQMSAuLiBDUDkKCSAqICAgICAgIENQOT1HUElPMjMgLi4gQ1AxPUdQSU8xNTsgd2hlbiBPUEVOLCB0aGUgY29ycmVzcG9uZGluZyBHUElPIHJlYWRzIDEuCgkgKiAgICAgICBHUElPMTQtMTI6IG4uYy4KCSAqIExSOTA6IEdQOT1HUElPMjMgLi4gR1AxPUdQSU8xNSAocmlnaHQgYWJvdmUgdGhlIGJ0ODc4KQoKCSAqIGxvd2VzdCAzIGJ5dGVzIGFyZSByZW1vdGUgY29udHJvbCBjb2RlcyAobm8gaGFuZHNoYWtlIG5lZWRlZCkKCSAqIHh4eEZGRjogTm8gcmVtb3RlIGNvbnRyb2wgY2hpcCBzb2xkZXJlZAoJICogeHh4RjAwKExSMjYvTFI1MCksIHh4eEZFMChMUjkwKTogUmVtb3RlIGNvbnRyb2wgY2hpcCAoTFZBMDAxIG9yIENGNDUpIHNvbGRlcmVkCgkgKiBOb3RlOiBTb21lIGJpdHMgYXJlIEF1ZGlvX01hc2sgIQoJICovCgl0dHlwZT0oZ3BpbyYweDBmMDAwMCk+PjE2OwoJc3dpdGNoKHR0eXBlKSB7CgljYXNlIDB4MDogdHVuZXI9MjsgLyogTlRTQywgZS5nLiBUUEk4TlNSMTFQICovCgkJYnJlYWs7CgljYXNlIDB4MjogdHVuZXI9Mzk7LyogTEcgTlRTQyAobmV3ZXIgVEFQQyBzZXJpZXMpIFRBUEMtSDcwMVAgKi8KCQlicmVhazsKCWNhc2UgMHg0OiB0dW5lcj01OyAvKiBQaGlsaXBzIFBBTCBUUEk4UFNCMDJQLCBUUEk4UFNCMTJQLCBUUEk4UFNCMTJEIG9yIEZJMTIxNiwgRk0xMjE2ICovCgkJYnJlYWs7CgljYXNlIDB4NjogdHVuZXI9Mzc7LyogTEcgUEFMIChuZXdlciBUQVBDIHNlcmllcykgVEFQQy1HNzAyUCAqLwoJCWJyZWFrOwoJCWNhc2UgMHhDOiB0dW5lcj0zOyAvKiBQaGlsaXBzIFNFQ0FNKCtQQUwpIEZRMTIxNk1FIG9yIEZJMTIxNk1GICovCgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW9fZ3BpbzogdW5rbm93biB0dW5lciB0eXBlLlxuIiwgYnR2LT5jLm5yKTsKCX0KCgloYXNfcmVtb3RlICAgICAgICAgID0gICBncGlvICYgMHg4MDAwMDA7CgloYXNfcmFkaW8JICAgID0gICBncGlvICYgMHg0MDAwMDA7CgkvKiAgIHVua25vd24gICAgICAgICAgICAgICAgICAgMHgyMDAwMDA7CgkgKiAgIHVua25vd24yICAgICAgICAgICAgICAgICAgMHgxMDAwMDA7ICovCglpc19jYXB0dXJlX29ubHkgICAgID0gIShncGlvICYgMHgwMDgwMDApOyAvKiBHUElPMTUgKi8KCWhhc190ZGE5ODIwX3RkYTk4MjEgPSAhKGdwaW8gJiAweDAwNDAwMCk7Cglpc19scjkwICAgICAgICAgICAgID0gIShncGlvICYgMHgwMDIwMDApOyAvKiBlbHNlIExSMjYvTFI1MCAoTFIzOC9MUjUxIGYuIGNhcHR1cmUgb25seSkgKi8KCS8qCgkgKiBncGlvICYgMHgwMDEwMDAgICAgb3V0cHV0IGJpdCBmb3IgYXVkaW8gcm91dGluZyAqLwoKCWlmKGlzX2NhcHR1cmVfb25seSkKCQl0dW5lcj00OyAvKiBObyB0dW5lciBwcmVzZW50ICovCgoJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBGbHlWaWRlbyBSYWRpbz0lcyBSZW1vdGVDb250cm9sPSVzIFR1bmVyPSVkIGdwaW89MHglMDZ4XG4iLAoJICAgICAgIGJ0di0+Yy5uciwgaGFzX3JhZGlvPyAieWVzIjoibm8gIiwgaGFzX3JlbW90ZT8gInllcyI6Im5vICIsIHR1bmVyLCBncGlvKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogRmx5VmlkZW8gIExSOTA9JXMgdGRhOTgyMS90ZGE5ODIwPSVzIGNhcHR1cmVfb25seT0lc1xuIiwKCQlidHYtPmMubnIsIGlzX2xyOTA/InllcyI6Im5vICIsIGhhc190ZGE5ODIwX3RkYTk4MjE/InllcyI6Im5vICIsCgkJaXNfY2FwdHVyZV9vbmx5PyJ5ZXMiOiJubyAiKTsKCglpZih0dW5lciE9IC0xKSAvKiBvbmx5IHNldCBpZiBrbm93biB0dW5lciBhdXRvZGV0ZWN0ZWQsIGVsc2UgbGV0IGluc21vZCBvcHRpb24gdGhyb3VnaCAqLwoJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyOwoJYnR2LT5oYXNfcmFkaW8gPSBoYXNfcmFkaW87CgoJLyogTFI5MCBBdWRpbyBSb3V0aW5nIGlzIGRvbmUgYnkgMiBoZWY0MDUyLCBzbyBBdWRpb19NYXNrIGhhcyA0IGJpdHM6IDB4MDAxYzgwCgkgKiBMUjI2L0xSNTAgb25seSBoYXMgMSBoZWY0MDUyLCBBdWRpb19NYXNrIDB4MDAwYzAwCgkgKiBBdWRpbyBvcHRpb25zOiBmcm9tIHR1bmVyLCBmcm9tIHRkYTk4MjEvdGRhOTgyMShtb25vLHN0ZXJlbyxzYXApLCBmcm9tIHRkYTk4NzQsIGV4dC4sIG11dGUgKi8KCWlmKGhhc190ZGE5ODIwX3RkYTk4MjEpIGJ0di0+YXVkaW9faG9vayA9IGx0OTQxNV9hdWRpbzsKCS8qIHRvZG86IGlmKGhhc190ZGE5ODc0KSBidHYtPmF1ZGlvX2hvb2sgPSBmdjIwMDBzX2F1ZGlvOyAqLwp9CgpzdGF0aWMgaW50IG1pcm9fdHVuZXJtYXBbXSA9IHsgMCw2LDIsMywgICA0LDUsNiwwLCAgMywwLDQsNSwgIDUsMiwxNiwxLAoJCQkgICAgICAgMTQsMiwxNywxLCA0LDEsNCwzLCAgMSwyLDE2LDEsIDQsNCw0LDQgfTsKc3RhdGljIGludCBtaXJvX2ZtdHVuZXJbXSAgPSB7IDAsMCwwLDAsICAgMCwwLDAsMCwgIDAsMCwwLDAsICAwLDAsMCwxLAoJCQkgICAgICAgMSwxLDEsMSwgICAxLDEsMSwwLCAgMCwwLDAsMCwgIDAsMSwwLDAgfTsKCnN0YXRpYyB2b2lkIG1pcm9fcGlubmFjbGVfZ3BpbyhzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgaWQsbXNwLGdwaW87CgljaGFyICppbmZvOwoKCWdwaW9faW5vdXQoMHhmZmZmZmYsIDApOwoJZ3BpbyA9IGdwaW9fcmVhZCgpOwoJaWQgICA9ICgoZ3Bpbz4+MTApICYgNjMpIC0xOwoJbXNwICA9IGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpOwoJaWYgKGlkIDwgMzIpIHsKCQlidHYtPnR1bmVyX3R5cGUgPSBtaXJvX3R1bmVybWFwW2lkXTsKCQlpZiAoMCA9PSAoZ3BpbyAmIDB4MjApKSB7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJaWYgKCFtaXJvX2ZtdHVuZXJbaWRdKSB7CgkJCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJCQlidHYtPm1ib3hfd2UgICAgPSAoMTw8Nik7CgkJCQlidHYtPm1ib3hfbW9zdCAgPSAoMTw8Nyk7CgkJCQlidHYtPm1ib3hfY2xrICAgPSAoMTw8OCk7CgkJCQlidHYtPm1ib3hfZGF0YSAgPSAoMTw8OSk7CgkJCQlidHYtPm1ib3hfbWFzayAgPSAoMTw8Nil8KDE8PDcpfCgxPDw4KXwoMTw8OSk7CgkJCX0KCQl9IGVsc2UgewoJCQlidHYtPmhhc19yYWRpbyA9IDA7CgkJfQoJCWlmICgtMSAhPSBtc3ApIHsKCQkJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfQk9BUkRfTUlSTykKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9NSVJPUFJPOwoJCQlpZiAoYnR2LT5jLnR5cGUgPT0gQlRUVl9CT0FSRF9QSU5OQUNMRSkKCQkJCWJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9QSU5OQUNMRVBSTzsKCQl9CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBtaXJvOiBpZD0lZCB0dW5lcj0lZCByYWRpbz0lcyBzdGVyZW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQrMSwgYnR2LT50dW5lcl90eXBlLAoJCSAgICAgICAhYnR2LT5oYXNfcmFkaW8gPyAibm8iIDoKCQkgICAgICAgKGJ0di0+aGFzX21hdGNoYm94ID8gIm1hdGNoYm94IiA6ICJmbXR1bmVyIiksCgkJICAgICAgICgtMSA9PSBtc3ApID8gIm5vIiA6ICJ5ZXMiKTsKCX0gZWxzZSB7CgkJLyogbmV3IGNhcmRzIHdpdGggbWljcm90dW5lIHR1bmVyICovCgkJaWQgPSA2MyAtIGlkOwoJCWJ0di0+aGFzX3JhZGlvID0gMDsKCQlzd2l0Y2ggKGlkKSB7CgkJY2FzZSAxOgoJCQlpbmZvID0gIlBBTCAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDI6CgkJCWluZm8gPSAiUEFMK1NFQ0FNIC8gc3RlcmVvIjsKCQkJYnR2LT5oYXNfcmFkaW8gPSAxOwoJCQlicmVhazsKCQljYXNlIDM6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJ0di0+aGFzX3JhZGlvID0gMTsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQlpbmZvID0gIlBBTCtTRUNBTSAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDU6CgkJCWluZm8gPSAiTlRTQyAvIG1vbm8iOwoJCQlicmVhazsKCQljYXNlIDY6CgkJCWluZm8gPSAiTlRTQyAvIHN0ZXJlbyI7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJaW5mbyA9ICJQQUwgLyBzdGVyZW8iOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvID0gIm9vcHM6IHVua25vd24gY2FyZCI7CgkJCWJyZWFrOwoJCX0KCQlpZiAoLTEgIT0gbXNwKQoJCQlidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfUElOTkFDTEVQUk87CgkJcHJpbnRrKEtFUk5fSU5GTwoJCSAgICAgICAiYnR0diVkOiBwaW5uYWNsZS9tdDogaWQ9JWQgaW5mbz1cIiVzXCIgcmFkaW89JXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwgaWQsIGluZm8sIGJ0di0+aGFzX3JhZGlvID8gInllcyIgOiAibm8iKTsKCQlidHYtPnR1bmVyX3R5cGUgID0gMzM7CgkJYnR2LT5waW5uYWNsZV9pZCA9IGlkOwoJfQp9CgovKiBHUElPMjEgICBMOiBCdWZmZXIgYWt0aXYsIEg6IEJ1ZmZlciBpbmFrdGl2ICovCiNkZWZpbmUgTE0xODgyX1NZTkNfRFJJVkUgICAgIDB4MjAwMDAwTAoKc3RhdGljIHZvaWQgaW5pdF9pZHNfZWFnbGUoc3RydWN0IGJ0dHYgKmJ0dikKewoJZ3Bpb19pbm91dCgweGZmZmZmZiwweEZGRkYzNyk7CglncGlvX3dyaXRlKDB4MjAwMDIwKTsKCgkvKiBmbGFzaCBzdHJvYmUgaW52ZXJ0ZXIgPyEgKi8KCWdwaW9fd3JpdGUoMHgyMDAwMjQpOwoKCS8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwoJZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKCgkvKiBzZXQgQlQ4NDggbXV4ZWwgdG8gMiAqLwoJYnRhb3IoKDIpPDw1LCB+KDI8PDUpLCBCVDg0OF9JRk9STSk7Cn0KCi8qIE11eHNlbCBoZWxwZXIgZm9yIHRoZSBJRFMgRWFnbGUuCiAqIHRoZSBlYWdsZXMgZG9lcyBub3QgdXNlIHRoZSBzdGFuZGFyZCBtdXhzZWwtYml0cyBidXQKICogaGFzIGl0cyBvd24gbXVsdGlwbGV4ZXIgKi8Kc3RhdGljIHZvaWQgZWFnbGVfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJYnRhb3IoKDIpPDw1LCB+KDM8PDUpLCBCVDg0OF9JRk9STSk7CglncGlvX2JpdHMoMyxidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm11eHNlbFtpbnB1dCY3XSk7CgogICAgICAgLyogY29tcG9zaXRlICovCiAgICAgICAvKiBzZXQgY2hyb21hIEFEQyB0byBzbGVlcCAqLwogICAgICAgYnRvcihCVDg0OF9BRENfQ19TTEVFUCwgQlQ4NDhfQURDKTsKICAgICAgIC8qIHNldCB0byBjb21wb3NpdGUgdmlkZW8gKi8KICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X0VfQ09OVFJPTCk7CiAgICAgICBidGFuZCh+QlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9PX0NPTlRST0wpOwoKICAgICAgIC8qIHN3aXRjaCBzeW5jIGRyaXZlIG9mZiAqLwogICAgICAgZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKfQoKc3RhdGljIHZvaWQgZ3ZjMTEwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglzdGF0aWMgY29uc3QgaW50IG1hc2tzW10gPSB7MHgzMCwgMHgwMSwgMHgxMiwgMHgyM307CglncGlvX3dyaXRlKG1hc2tzW2lucHV0JTRdKTsKfQoKLyogTE1MQlQ0eCBpbml0aWFsaXphdGlvbiAtIHRvIGFsbG93IGFjY2VzcyB0byBHUElPIGJpdHMgZm9yIHNlbnNvcnMgaW5wdXQgYW5kCiAgIGFsYXJtcyBvdXRwdXQKCiAgIEdQSU9iaXQgICAgfCAxMCB8IDkgfCA4IHwgNyB8IDYgfCA1IHwgNCB8IDMgfCAyIHwgMSB8IDAgfAogICBhc3NpZ25tZW50IHwgVEkgfCBPM3xJTnh8IE8yfCBPMXxJTjR8SU4zfElOMnxJTjF8ICAgfCAgIHwKCiAgIElOIC0gc2Vuc29yIGlucHV0cywgSU54IC0gc2Vuc29yIGlucHV0cyBhbmQgVEkgWE9SZWQgdG9nZXRoZXIKICAgTzEsTzIsTzMgLSBhbGFybSBvdXRwdXRzIChyZWxheXMpCgogICBPVVQgRU5BQkxFICAgMSAgICAxICAgMCAgLiAxICAxICAgMCAgIDAgLiAwICAgMCAgIDAgICAgMCAgID0gMHg2QzAKCiovCgpzdGF0aWMgdm9pZCBpbml0X2xtbGJ0NHgoc3RydWN0IGJ0dHYgKmJ0dikKewoJcHJpbnRrKEtFUk5fREVCVUcgIkxNTEJUNHggaW5pdFxuIik7CglidHdyaXRlKDB4MDAwMDAwLCBCVDg0OF9HUElPX1JFR19JTlApOwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwMDA2QzApOwoJZ3Bpb193cml0ZSgweDAwMDAwMCk7Cn0KCnN0YXRpYyB2b2lkIHNpZ21hU1FfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJdW5zaWduZWQgaW50IGlubXV4ID0gaW5wdXQgJSA4OwoJZ3Bpb19pbm91dCggMHhmLCAweGYgKTsKCWdwaW9fYml0cyggMHhmLCBpbm11eCApOwp9CgpzdGF0aWMgdm9pZCBzaWdtYVNMQ19tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7Cgl1bnNpZ25lZCBpbnQgaW5tdXggPSBpbnB1dCAlIDQ7CglncGlvX2lub3V0KCAzPDw5LCAzPDw5ICk7CglncGlvX2JpdHMoIDM8PDksIGlubXV4PDw5ICk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBidHR2X3Jlc2V0X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYpCnsKCS8qCgkgKiBCVDg3OEEgaGFzIGEgYXVkaW8tcmVzZXQgcmVnaXN0ZXIuCgkgKiAxLiBUaGlzIHJlZ2lzdGVyIGlzIGFuIGF1ZGlvIHJlc2V0IGZ1bmN0aW9uIGJ1dCBpdCBpcyBpbgoJICogICAgZnVuY3Rpb24tMCAodmlkZW8gY2FwdHVyZSkgYWRkcmVzcyBzcGFjZS4KCSAqIDIuIEl0IGlzIGVub3VnaCB0byBkbyB0aGlzIG9uY2UgcGVyIHBvd2VyLXVwIG9mIHRoZSBjYXJkLgoJICogMy4gVGhlcmUgaXMgYSB0eXBvIGluIHRoZSBDb25leGFudCBkb2MgLS0gaXQgaXMgbm90IGF0CgkgKiAgICAweDVCLCBidXQgYXQgMHgwNTguIChCIGlzIGFuIG9kZC1udW1iZXIsIG9idmlvdXNseSBhIHR5cG8hKS4KCSAqIC0tLy9TaHJpa3VtYXIgMDMwNjA5CgkgKi8KCWlmIChidHYtPmlkICE9IDg3OCkKCQlyZXR1cm47CgoJaWYgKGJ0dHZfZGVidWcpCgkJcHJpbnRrKCJidHR2JWQ6IEJUODc4QSBBUkVTRVRcbiIsYnR2LT5jLm5yKTsKCWJ0d3JpdGUoKDE8PDcpLCAweDA1OCk7Cgl1ZGVsYXkoMTApOwoJYnR3cml0ZSggICAgIDAsIDB4MDU4KTsKfQoKLyogaW5pdGlhbGl6YXRpb24gcGFydCBvbmUgLS0gYmVmb3JlIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQxKHN0cnVjdCBidHR2ICpidHYpCnsKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0U6CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4OgoJCWJvb3RfbXNwMzR4eChidHYsNSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVk9PRE9PVFZfRk06CgkJYm9vdF9tc3AzNHh4KGJ0diwyMCk7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfQVZFUk1FRElBOTg6CgkJYm9vdF9tc3AzNHh4KGJ0diwxMSk7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFUFZSOgoJCXB2cl9ib290KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVFdJTkhBTl9EU1Q6CgljYXNlIEJUVFZfQk9BUkRfQVZEVkJUXzc3MToKCWNhc2UgQlRUVl9CT0FSRF9QSU5OQUNMRVNBVDoKCQlidHYtPnVzZV9pMmNfaHcgPSAxOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0FETElOS19SVFYyNDoKCQlpbml0X1JUVjI0KCBidHYgKTsKCQlicmVhazsKCgl9CglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKCQlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7Cn0KCi8qIGluaXRpYWxpemF0aW9uIHBhcnQgdHdvIC0tIGFmdGVyIHJlZ2lzdGVyaW5nIGkyYyBidXMgKi8Kdm9pZCBfX2RldmluaXQgYnR0dl9pbml0X2NhcmQyKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0ZGE5ODg3OwoJaW50IGFkZHI9QUREUl9VTlNFVDsKCglidHYtPnR1bmVyX3R5cGUgPSAtMTsKCglpZiAoQlRUVl9CT0FSRF9VTktOT1dOID09IGJ0di0+Yy50eXBlKSB7CgkJYnR0dl9yZWFkZWUoYnR2LGVlcHJvbV9kYXRhLDB4YTApOwoJCWlkZW50aWZ5X2J5X2VlcHJvbShidHYsZWVwcm9tX2RhdGEpOwoJfQoKCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKCWNhc2UgQlRUVl9CT0FSRF9NSVJPOgoJY2FzZSBCVFRWX0JPQVJEX01JUk9QUk86CgljYXNlIEJUVFZfQk9BUkRfUElOTkFDTEU6CgljYXNlIEJUVFZfQk9BUkRfUElOTkFDTEVQUk86CgkJLyogbWlyby9waW5uYWNsZSAqLwoJCW1pcm9fcGlubmFjbGVfZ3BpbyhidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4OgoJY2FzZSBCVFRWX0JPQVJEX01BWEk6CgljYXNlIEJUVFZfQk9BUkRfTElGRV9GTFlLSVQ6CgljYXNlIEJUVFZfQk9BUkRfRkxZVklERU86CgljYXNlIEJUVFZfQk9BUkRfVFlQSE9PTl9UVklFVzoKCWNhc2UgQlRUVl9CT0FSRF9DSFJPTk9TX1ZTMjoKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFT185OEZNOgoJY2FzZSBCVFRWX0JPQVJEX0ZMWVZJREVPMjAwMDoKCWNhc2UgQlRUVl9CT0FSRF9GTFlWSURFTzk4RVo6CgljYXNlIEJUVFZfQk9BUkRfQ09ORkVSRU5DRVRWOgoJY2FzZSBCVFRWX0JPQVJEX0xJRkVURUNfOTQxNToKCQlmbHl2aWRlb19ncGlvKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfSEFVUFBBVUdFOgoJY2FzZSBCVFRWX0JPQVJEX0hBVVBQQVVHRTg3ODoKCWNhc2UgQlRUVl9CT0FSRF9IQVVQUEFVR0VQVlI6CgkJLyogcGljayB1cCBzb21lIGNvbmZpZyBpbmZvcyBmcm9tIHRoZSBlZXByb20gKi8KCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJaGF1cHBhdWdlX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0FWRVJNRURJQTk4OgoJY2FzZSBCVFRWX0JPQVJEX0FWUEhPTkU5ODoKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJYXZlcm1lZGlhX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1BYQzIwMDoKCQlpbml0X1BYQzIwMChidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX1BJQ09MT19URVRSQV9DSElQOgoJCXBpY29sb190ZXRyYV9pbml0KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfVkhYOgoJCWJ0di0+aGFzX3JhZGlvICAgID0gMTsKCQlidHYtPmhhc19tYXRjaGJveCA9IDE7CgkJYnR2LT5tYm94X3dlICAgICAgPSAweDIwOwoJCWJ0di0+bWJveF9tb3N0ICAgID0gMDsKCQlidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CgkJYnR2LT5tYm94X2RhdGEgICAgPSAweDEwOwoJCWJ0di0+bWJveF9tYXNrICAgID0gMHgzODsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9WT0JJU19CT09TVEFSOgoJY2FzZSBCVFRWX0JPQVJEX1RFUlJBVFY6CgkJdGVycmF0ZWNfYWN0aXZlX3JhZGlvX3VwZ3JhZGUoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9NQUdJQ1RWSUVXMDYxOgoJCWlmIChidHYtPmNhcmRpZCA9PSAweDMwMDIxNDRmKSB7CgkJCWJ0di0+aGFzX3JhZGlvPTE7CgkJCXByaW50aygiYnR0diVkOiByYWRpbyBkZXRlY3RlZCBieSBzdWJzeXN0ZW0gaWQgKENQSDA1eClcbiIsYnR2LT5jLm5yKTsKCQl9CgkJYnJlYWs7CiAgICAgICBjYXNlIEJUVFZfQk9BUkRfU1RCMjoKCQlpZiAoYnR2LT5jYXJkaWQgPT0gMHgzMDYwMTIxYSkgewoJCQkvKiBGaXggdXAgZW50cnkgZm9yIDNERlggVm9vZG9vVFYgMTAwLAoJCQkgICB3aGljaCBpcyBhbiBPRU0gU1RCIGNhcmQgdmFyaWFudC4gKi8KCQkJYnR2LT5oYXNfcmFkaW89MDsKCQkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDX05UU0M7CgkJfQoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZMXgxOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTF4MV9TVklEOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTJ4eDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeDBfU1ZJRDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyeDA6CgljYXNlIEJUVFZfQk9BUkRfT1NQUkVZNTAwOgoJY2FzZSBCVFRWX0JPQVJEX09TUFJFWTU0MDoKCWNhc2UgQlRUVl9CT0FSRF9PU1BSRVkyMDAwOgoJCWJ0dHZfcmVhZGVlKGJ0dixlZXByb21fZGF0YSwweGEwKTsKCQlvc3ByZXlfZWVwcm9tKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfSURTX0VBR0xFOgoJCWluaXRfaWRzX2VhZ2xlKGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfTU9EVEVDXzIwNToKCQlidHR2X3JlYWRlZShidHYsZWVwcm9tX2RhdGEsMHhhMCk7CgkJbW9kdGVjX2VlcHJvbShidHYpOwoJCWJyZWFrOwoJY2FzZSBCVFRWX0JPQVJEX0xNTEJUNDoKCQlpbml0X2xtbGJ0NHgoYnR2KTsKCQlicmVhazsKCWNhc2UgQlRUVl9CT0FSRF9USUJFVF9DUzE2OgoJCXRpYmV0Q1MxNl9pbml0KGJ0dik7CgkJYnJlYWs7CgljYXNlIEJUVFZfQk9BUkRfS09ESUNPTV80NDAwUjoKCQlrb2RpY29tNDQwMHJfaW5pdChidHYpOwoJCWJyZWFrOwoJfQoKCS8qIHBsbCBjb25maWd1cmF0aW9uICovCglpZiAoIShidHYtPmlkPT04NDggJiYgYnR2LT5yZXZpc2lvbj09MHgxMSkpIHsKCQkvKiBkZWZhdWx0cyBmcm9tIGNhcmQgbGlzdCAqLwoJCWlmIChQTExfMjggPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDA7CgkJfQoJCWlmIChQTExfMzUgPT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5wbGwpIHsKCQkJYnR2LT5wbGwucGxsX2lmcmVxPTM1NDY4OTUwOwoJCQlidHYtPnBsbC5wbGxfY3J5c3RhbD1CVDg0OF9JRk9STV9YVDE7CgkJfQoJCS8qIGluc21vZCBvcHRpb25zIGNhbiBvdmVycmlkZSAqLwoJCXN3aXRjaCAocGxsW2J0di0+Yy5ucl0pIHsKCQljYXNlIDA6IC8qIG5vbmUgKi8KCQkJYnR2LT5wbGwucGxsX2NyeXN0YWwgPSAwOwoJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDA7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKCQkJYnJlYWs7CgkJY2FzZSAxOiAvKiAyOCBNSHogKi8KCQljYXNlIDI4OgoJCQlidHYtPnBsbC5wbGxfaWZyZXEgICA9IDI4NjM2MzYzOwoJCQlidHYtPnBsbC5wbGxfb2ZyZXEgICA9IDA7CgkJCWJ0di0+cGxsLnBsbF9jcnlzdGFsID0gQlQ4NDhfSUZPUk1fWFQwOwoJCQlicmVhazsKCQljYXNlIDI6IC8qIDM1IE1IeiAqLwoJCWNhc2UgMzU6CgkJCWJ0di0+cGxsLnBsbF9pZnJlcSAgID0gMzU0Njg5NTA7CgkJCWJ0di0+cGxsLnBsbF9vZnJlcSAgID0gMDsKCQkJYnR2LT5wbGwucGxsX2NyeXN0YWwgPSBCVDg0OF9JRk9STV9YVDE7CgkJCWJyZWFrOwoJCX0KCX0KCWJ0di0+cGxsLnBsbF9jdXJyZW50ID0gLTE7CgoJLyogdHVuZXIgY29uZmlndXJhdGlvbiAoZnJvbSBjYXJkIGxpc3QgLyBhdXRvZGV0ZWN0IC8gaW5zbW9kIG9wdGlvbikgKi8KCWlmIChBRERSX1VOU0VUICE9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0udHVuZXJfYWRkcikKCQlhZGRyID0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl9hZGRyOwoKCWlmIChVTlNFVCAhPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGUpCgkJaWYoVU5TRVQgPT0gYnR2LT50dW5lcl90eXBlKQoJCQlidHYtPnR1bmVyX3R5cGUgPSBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLnR1bmVyX3R5cGU7CglpZiAoVU5TRVQgIT0gdHVuZXJbYnR2LT5jLm5yXSkKCQlidHYtPnR1bmVyX3R5cGUgPSB0dW5lcltidHYtPmMubnJdOwoJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwoKCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpIHsKCQlzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOwoKCQl0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9BTkFMT0dfVFYgfCBUX0RJR0lUQUxfVFY7CgkJdHVuX3NldHVwLnR5cGUgPSBidHYtPnR1bmVyX3R5cGU7CgkJdHVuX3NldHVwLmFkZHIgPSBhZGRyOwoKCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKCX0KCglpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkgewoJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIEFVRENfQ09ORklHX1BJTk5BQ0xFLAoJCQkJCQkJJmJ0di0+cGlubmFjbGVfaWQpOwoJfQoKCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKCWlmIChzdmhzW2J0di0+Yy5ucl0gIT0gVU5TRVQpCgkJYnR2LT5zdmhzID0gc3Zoc1tidHYtPmMubnJdOwoJaWYgKHJlbW90ZVtidHYtPmMubnJdICE9IFVOU0VUKQoJCWJ0di0+aGFzX3JlbW90ZSA9IHJlbW90ZVtidHYtPmMubnJdOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmhhc19yYWRpbykKCQlidHYtPmhhc19yYWRpbz0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX3JlbW90ZSkKCQlidHYtPmhhc19yZW1vdGU9MTsKCWlmICghYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ub19ncGlvaXJxKQoJCWJ0di0+Z3Bpb2lycT0xOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYW55X2lycSkKCQlidHYtPmFueV9pcnEgPSAxOwoJaWYgKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9faG9vaykKCQlidHYtPmF1ZGlvX2hvb2s9YnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5hdWRpb19ob29rOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmRpZ2l0YWxfbW9kZSA9PSBESUdJVEFMX01PREVfQ0FNRVJBKSB7CgkJLyogZGV0ZWN0IEJ0ODMyIGNoaXAgZm9yIHF1YXJ0enNpZ2h0IGRpZ2l0YWwgY2FtZXJhICovCgkJaWYgKChidHR2X0kyQ1JlYWQoYnR2LCBJMkNfQlQ4MzJfQUxUMSwgIkJ0ODMyIikgPj0wKSB8fAoJCSAgICAoYnR0dl9JMkNSZWFkKGJ0diwgSTJDX0JUODMyX0FMVDIsICJCdDgzMiIpID49MCkpCgkJCWJvb3RfYnQ4MzIoYnR2KTsKCX0KCglpZiAoIWF1dG9sb2FkKQoJCXJldHVybjsKCgkvKiB0cnkgdG8gZGV0ZWN0IGF1ZGlvL2ZhZGVyIGNoaXBzICovCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fbXNwMzR4eCAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19NU1AzNDAwLCAiTVNQMzR4eCIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgibXNwMzQwMCIpOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm1zcDM0eHhfYWx0ICYmCgkgICAgYnR0dl9JMkNSZWFkKGJ0diwgSTJDX01TUDM0MDBfQUxULCAiTVNQMzR4eCAoYWx0ZXJuYXRlIGFkZHJlc3MpIikgPj0wKQoJCXJlcXVlc3RfbW9kdWxlKCJtc3AzNDAwIik7CgoJaWYgKCFidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5vX3RkYTk4NzUgJiYKCSAgICBidHR2X0kyQ1JlYWQoYnR2LCBJMkNfVERBOTg3NSwgIlREQTk4NzUiKSA+PTApCgkJcmVxdWVzdF9tb2R1bGUoInRkYTk4NzUiKTsKCglpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubm9fdGRhNzQzMiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE3NDMyLCAiVERBNzQzMiIpID49MCkKCQlyZXF1ZXN0X21vZHVsZSgidGRhNzQzMiIpOwoKCWlmIChidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5lZWRzX3R2YXVkaW8pCgkJcmVxdWVzdF9tb2R1bGUoInR2YXVkaW8iKTsKCgkvKiB0dW5lciBtb2R1bGVzICovCgl0ZGE5ODg3ID0gMDsKCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQoJCXRkYTk4ODcgPSAxOwoJaWYgKDAgPT0gdGRhOTg4NyAmJiAwID09IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YiAmJgoJICAgIGJ0dHZfSTJDUmVhZChidHYsIEkyQ19UREE5ODg3LCAiVERBOTg4NyIpID49MCkKCQl0ZGE5ODg3ID0gMTsKCS8qIEh5YnJpZCBEVkIgY2FyZCwgRE9FUyBoYXZlIGEgdGRhOTg4NyAqLwoJaWYgKGJ0di0+Yy50eXBlID09IEJUVFZfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0xJVEUpCgkJdGRhOTg4NyA9IDE7CglpZigoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszKSB8fAoJICAgKGJ0di0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMpIHx8CgkgICAoYnR2LT50dW5lcl90eXBlID09IFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMykgfHwKCSAgICB0ZGE5ODg3KQoJCXJlcXVlc3RfbW9kdWxlKCJ0ZGE5ODg3Iik7CglpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKQoJCXJlcXVlc3RfbW9kdWxlKCJ0dW5lciIpOwp9CgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIG1vZHRlY19lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewoJaWYoIHN0cm5jbXAoJihlZXByb21fZGF0YVsweDFlXSksIlRlbWljIDQwNjYgRlk1IiwxNCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX1RFTUlDXzQwNjZGWTVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJBbHBzIFRTQkI1IiwxMCkgPT0wKSB7CgkJYnR2LT50dW5lcl90eXBlPVRVTkVSX0FMUFNfVFNCQjVfUEFMX0k7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIGlmIChzdHJuY21wKCYoZWVwcm9tX2RhdGFbMHgxZV0pLCJQaGlsaXBzIEZNMTI0NiIsMTQpID09MCkgewoJCWJ0di0+dHVuZXJfdHlwZT1UVU5FUl9QSElMSVBTX05UU0M7CgkJcHJpbnRrKCJidHR2JWQ6IE1vZHRlYzogVHVuZXIgYXV0b2RldGVjdGVkIGJ5IGVlcHJvbTogJXNcbiIsCgkJICAgICAgIGJ0di0+Yy5uciwmZWVwcm9tX2RhdGFbMHgxZV0pOwoJfSBlbHNlIHsKCQlwcmludGsoImJ0dHYlZDogTW9kdGVjOiBVbmtub3duIFR1bmVyU3RyaW5nOiAlc1xuIiwKCQkgICAgICAgYnR2LT5jLm5yLCZlZXByb21fZGF0YVsweDFlXSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBoYXVwcGF1Z2VfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCXN0cnVjdCB0dmVlcHJvbSB0djsKCgl0dmVlcHJvbV9oYXVwcGF1Z2VfYW5hbG9nKCZidHYtPmkyY19jbGllbnQsICZ0diwgZWVwcm9tX2RhdGEpOwoJYnR2LT50dW5lcl90eXBlID0gdHYudHVuZXJfdHlwZTsKCWJ0di0+aGFzX3JhZGlvICA9IHR2Lmhhc19yYWRpbzsKfQoKc3RhdGljIGludCB0ZXJyYXRlY19hY3RpdmVfcmFkaW9fdXBncmFkZShzdHJ1Y3QgYnR0diAqYnR2KQp7CglpbnQgZnJlcTsKCglidHYtPmhhc19yYWRpbyAgICA9IDE7CglidHYtPmhhc19tYXRjaGJveCA9IDE7CglidHYtPm1ib3hfd2UgICAgICA9IDB4MTA7CglidHYtPm1ib3hfbW9zdCAgICA9IDB4MjA7CglidHYtPm1ib3hfY2xrICAgICA9IDB4MDg7CglidHYtPm1ib3hfZGF0YSAgICA9IDB4MDQ7CglidHYtPm1ib3hfbWFzayAgICA9IDB4M2M7CgoJYnR2LT5tYm94X2lvdyAgICAgPSAxIDw8ICA4OwoJYnR2LT5tYm94X2lvciAgICAgPSAxIDw8ICA5OwoJYnR2LT5tYm94X2NzZWwgICAgPSAxIDw8IDEwOwoKCWZyZXE9ODgwMDAvNjIuNTsKCXRlYTU3NTdfd3JpdGUoYnR2LCA1ICogZnJlcSArIDB4MzU4KTsgLyogd3JpdGUgMHgxZWQ4ICovCglpZiAoMHgxZWQ4ID09IHRlYTU3NTdfcmVhZChidHYpKSB7CgkJcHJpbnRrKCJidHR2JWQ6IFRlcnJhdGVjIEFjdGl2ZSBSYWRpbyBVcGdyYWRlIGZvdW5kLlxuIiwKCQkgICAgICAgYnR2LT5jLm5yKTsKCQlidHYtPmhhc19yYWRpbyAgICA9IDE7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAxOwoJfSBlbHNlIHsKCQlidHYtPmhhc19yYWRpbyAgICA9IDA7CgkJYnR2LT5oYXNfbWF0Y2hib3ggPSAwOwoJfQoJcmV0dXJuIDA7Cn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogbWluaW1hbCBib290c3RyYXAgZm9yIHRoZSBXaW5UVi9QVlIgLS0gdXBsb2FkIGFsdGVyYSBmaXJtd2FyZS4KICoKICogVGhlIGhjd2FtYy5yYmYgZmlybXdhcmUgZmlsZSBpcyBvbiB0aGUgSGF1cHBhdWdlIGRyaXZlciBDRC4gIEhhdmUKICogYSBsb29rIGF0IFB2ci9wdnI0NXh4eC5FWEUgKHNlbGYtZXh0cmFjdGluZyB6aXAgYXJjaGl2ZSwgY2FuIGJlCiAqIHVucGFja2VkIHdpdGggdW56aXApLgogKi8KI2RlZmluZSBQVlJfR1BJT19ERUxBWQkJMTAKCiNkZWZpbmUgQlRUVl9BTFRfREFUQQkJMHgwMDAwMDEKI2RlZmluZSBCVFRWX0FMVF9EQ0xLCQkweDEwMDAwMAojZGVmaW5lIEJUVFZfQUxUX05DT05GSUcJMHg4MDAwMDAKCnN0YXRpYyBpbnQgX19kZXZpbml0IHB2cl9hbHRlcmFfbG9hZChzdHJ1Y3QgYnR0diAqYnR2LCB1OCAqbWljcm8sIHUzMiBtaWNyb2xlbikKewoJdTMyIG47Cgl1OCBiaXRzOwoJaW50IGk7CgoJZ3Bpb19pbm91dCgweGZmZmZmZixCVFRWX0FMVF9EQVRBfEJUVFZfQUxUX0RDTEt8QlRUVl9BTFRfTkNPTkZJRyk7CglncGlvX3dyaXRlKDApOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglncGlvX3dyaXRlKEJUVFZfQUxUX05DT05GSUcpOwoJdWRlbGF5KFBWUl9HUElPX0RFTEFZKTsKCglmb3IgKG4gPSAwOyBuIDwgbWljcm9sZW47IG4rKykgewoJCWJpdHMgPSBtaWNyb1tuXTsKCQlmb3IgKCBpID0gMCA7IGkgPCA4IDsgaSsrICkgewoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCQkJaWYgKGJpdHMgJiAweDAxKQoJCQkJZ3Bpb19iaXRzKEJUVFZfQUxUX0RBVEEsQlRUVl9BTFRfREFUQSk7CgkJCWVsc2UKCQkJCWdwaW9fYml0cyhCVFRWX0FMVF9EQVRBLDApOwoJCQlncGlvX2JpdHMoQlRUVl9BTFRfRENMSyxCVFRWX0FMVF9EQ0xLKTsKCQkJYml0cyA+Pj0gMTsKCQl9Cgl9CglncGlvX2JpdHMoQlRUVl9BTFRfRENMSywwKTsKCXVkZWxheShQVlJfR1BJT19ERUxBWSk7CgoJLyogYmVnaW4gQWx0ZXJhIGluaXQgbG9vcCAoTm90IG5lY2Vzc2FyeSxidXQgZG9lc24ndCBodXJ0KSAqLwoJZm9yIChpID0gMCA7IGkgPCAzMCA7IGkrKykgewoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLDApOwoJCWdwaW9fYml0cyhCVFRWX0FMVF9EQ0xLLEJUVFZfQUxUX0RDTEspOwoJfQoJZ3Bpb19iaXRzKEJUVFZfQUxUX0RDTEssMCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2RldmluaXQgcHZyX2Jvb3Qoc3RydWN0IGJ0dHYgKmJ0dikKewoJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRyeTsKCWludCByYzsKCglyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCAiaGN3YW1jLnJiZiIsICZidHYtPmMucGNpLT5kZXYpOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IG5vIGFsdGVyYSBmaXJtd2FyZSBbdmlhIGhvdHBsdWddXG4iLAoJCSAgICAgICBidHYtPmMubnIpOwoJCXJldHVybiByYzsKCX0KCXJjID0gcHZyX2FsdGVyYV9sb2FkKGJ0diwgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKCXByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogYWx0ZXJhIGZpcm13YXJlIHVwbG9hZCAlc1xuIiwKCSAgICAgICBidHYtPmMubnIsIChyYyA8IDApID8gImZhaWxlZCIgOiAib2siKTsKCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwoJcmV0dXJuIHJjOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBzb21lIG9zcHJleSBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IG9zcHJleV9lZXByb20oc3RydWN0IGJ0dHYgKmJ0dikKewogICAgICAgaW50IGkgPSAwOwogICAgICAgdW5zaWduZWQgY2hhciAqZWUgPSBlZXByb21fZGF0YTsKICAgICAgIHVuc2lnbmVkIGxvbmcgc2VyaWFsID0gMDsKCiAgICAgICBpZiAoYnR2LT5jLnR5cGUgPT0gMCkgewoJICAgICAgIC8qIHRoaXMgbWlnaHQgYmUgYW4gYW50aXF1ZS4uLiBjaGVjayBmb3IgTU1BQyBsYWJlbCBpbiBlZXByb20gKi8KCSAgICAgICBpZiAoKGVlWzBdPT0nTScpICYmIChlZVsxXT09J00nKSAmJiAoZWVbMl09PSdBJykgJiYgKGVlWzNdPT0nQycpKSB7CgkJICAgICAgIHVuc2lnbmVkIGNoYXIgY2hlY2tzdW0gPSAwOwoJCSAgICAgICBmb3IgKGkgPTA7IGk8MjE7IGkrKykKCQkJICAgICAgIGNoZWNrc3VtICs9IGVlW2ldOwoJCSAgICAgICBpZiAoY2hlY2tzdW0gIT0gZWVbMjFdKQoJCQkgICAgICAgcmV0dXJuOwoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgwXzg0ODsKCQkgICAgICAgZm9yIChpID0gMTI7IGkgPCAyMTsgaSsrKQoJCQkgICAgICAgc2VyaWFsICo9IDEwLCBzZXJpYWwgKz0gZWVbaV0gLSAnMCc7CgkgICAgICAgfQogICAgICAgfSBlbHNlIHsKCSAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOwoJICAgICAgIGludCBvZmZzZXQgPSA0KjE2OwoKCSAgICAgICBmb3IoOyBvZmZzZXQgPCA4KjE2OyBvZmZzZXQgKz0gMTYpIHsKCQkgICAgICAgdW5zaWduZWQgc2hvcnQgY2hlY2tzdW0gPSAwOwoJCSAgICAgICAvKiB2ZXJpZnkgdGhlIGNoZWNrc3VtICovCgkJICAgICAgIGZvcihpID0gMDsgaTwxNDsgaSsrKSBjaGVja3N1bSArPSBlZVtpK29mZnNldF07CgkJCSAgICAgICBjaGVja3N1bSA9IH5jaGVja3N1bTsgIC8qIG5vIGlkZWEgd2h5ICovCgkJCSAgICAgICBpZiAoKCgoY2hlY2tzdW0+PjgpJjB4MEZGKSA9PSBlZVtvZmZzZXQrMTRdKSAmJgoJCQkJICAgKChjaGVja3N1bSAmIDB4MEZGKSA9PSBlZVtvZmZzZXQrMTVdKSkgewoJCQkgICAgICAgYnJlYWs7CgkJICAgICAgIH0KCSAgICAgICB9CgoJICAgICAgIGlmIChvZmZzZXQgPj0gOCoxNikKCQkgICAgICAgcmV0dXJuOwoKCSAgICAgICAvKiBmb3VuZCBhIHZhbGlkIGRlc2NyaXB0b3IgKi8KCSAgICAgICB0eXBlID0gKGVlW29mZnNldCs0XTw8OCkgfCAoZWVbb2Zmc2V0KzVdKTsKCgkgICAgICAgc3dpdGNoKHR5cGUpIHsKCgkgICAgICAgLyogODQ4IGJhc2VkICovCgkgICAgICAgY2FzZSAweDAwMDQ6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDBfODQ4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAwNToKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTEwMV84NDg7CgkJICAgICAgIGJyZWFrOwoKCSAgICAgICAvKiA4NzggYmFzZWQgKi8KCSAgICAgICBjYXNlIDB4MDAxMjoKCSAgICAgICBjYXNlIDB4MDAxMzoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTF4MDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwMTQ6CgkgICAgICAgY2FzZSAweDAwMTU6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVkxeDE7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE2OgoJICAgICAgIGNhc2UgMHgwMDE3OgoJICAgICAgIGNhc2UgMHgwMDIwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMXgxX1NWSUQ7CgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDE4OgoJICAgICAgIGNhc2UgMHgwMDE5OgoJICAgICAgIGNhc2UgMHgwMDFFOgoJICAgICAgIGNhc2UgMHgwMDFGOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMnh4OwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDAxQToKCSAgICAgICBjYXNlIDB4MDAxQjoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTJ4MF9TVklEOwoJCSAgICAgICBicmVhazsKCSAgICAgICBjYXNlIDB4MDA0MDoKCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTUwMDsKCQkgICAgICAgYnJlYWs7CgkgICAgICAgY2FzZSAweDAwNTA6CgkgICAgICAgY2FzZSAweDAwNTY6CgkJICAgICAgIGJ0di0+Yy50eXBlID0gQlRUVl9CT0FSRF9PU1BSRVk1NDA7CgkJICAgICAgIC8qIGJ0dHZfb3NwcmV5XzU0MF9pbml0KGJ0dik7ICovCgkJICAgICAgIGJyZWFrOwoJICAgICAgIGNhc2UgMHgwMDYwOgoJICAgICAgIGNhc2UgMHgwMDcwOgoJCSAgICAgICBidHYtPmMudHlwZSA9IEJUVFZfQk9BUkRfT1NQUkVZMngwOwoJCSAgICAgICAvKiBlbmFibGUgb3V0cHV0IG9uIHNlbGVjdCBjb250cm9sIGxpbmVzICovCgkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwoJCSAgICAgICBicmVhazsKCSAgICAgICBkZWZhdWx0OgoJCSAgICAgICAvKiB1bmtub3duLi4ubGVhdmUgZ2VuZXJpYywgYnV0IGdldCBzZXJpYWwgIyAqLwoJCSAgICAgICBicmVhazsKCSAgICAgICB9CgkgICAgICAgc2VyaWFsID0gIChlZVtvZmZzZXQrNl0gPDwgMjQpCgkJICAgICAgIHwgKGVlW29mZnNldCs3XSA8PCAxNikKCQkgICAgICAgfCAoZWVbb2Zmc2V0KzhdIDw8ICA4KQoJCSAgICAgICB8IChlZVtvZmZzZXQrOV0pOwogICAgICAgfQoKICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0dHYlZDogb3NwcmV5IGVlcHJvbTogY2FyZD0lZCBuYW1lPSVzIHNlcmlhbD0lbGRcbiIsCgkgICAgICBidHYtPmMubnIsIGJ0di0+Yy50eXBlLCBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLm5hbWUsc2VyaWFsKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogQVZlcm1lZGlhIHNwZWNpZmljIHN0dWZmLCBmcm9tICBia3RyX2NhcmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCnN0YXRpYyBpbnQgdHVuZXJfMF90YWJsZVtdID0gewoJVFVORVJfUEhJTElQU19OVFNDLCAgVFVORVJfUEhJTElQU19QQUwgLyogUEFMLUJHKi8sCglUVU5FUl9QSElMSVBTX1BBTCwgICBUVU5FUl9QSElMSVBTX1BBTCAvKiBQQUwtSSovLAoJVFVORVJfUEhJTElQU19QQUwsICAgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX1NFQ0FNLCBUVU5FUl9QSElMSVBTX1NFQ0FNLAoJVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19QQUwsCglUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMyB9OwoKc3RhdGljIGludCB0dW5lcl8xX3RhYmxlW10gPSB7CglUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLAoJVFVORVJfVEVNSUNfUEFMLCAgIFRVTkVSX1RFTUlDX1BBTCwKCVRVTkVSX1RFTUlDX1BBTCwgICBUVU5FUl9URU1JQ19QQUwsCglUVU5FUl9URU1JQ180MDEyRlk1LCBUVU5FUl9URU1JQ180MDEyRlk1LCAvKiBUVU5FUl9URU1JQ19TRUNBTSAqLwoJVFVORVJfVEVNSUNfNDAxMkZZNSwgVFVORVJfVEVNSUNfUEFMfTsKCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdmVybWVkaWFfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpCnsKCWludCB0dW5lcl9tYWtlLHR1bmVyX3R2X2ZtLHR1bmVyX2Zvcm1hdCx0dW5lcj0wOwoKCXR1bmVyX21ha2UgICAgICA9IChlZXByb21fZGF0YVsweDQxXSAmIDB4Nyk7Cgl0dW5lcl90dl9mbSAgICAgPSAoZWVwcm9tX2RhdGFbMHg0MV0gJiAweDE4KSA+PiAzOwoJdHVuZXJfZm9ybWF0ICAgID0gKGVlcHJvbV9kYXRhWzB4NDJdICYgMHhmMCkgPj4gNDsKCWJ0di0+aGFzX3JlbW90ZSA9IChlZXByb21fZGF0YVsweDQyXSAmIDB4MDEpOwoKCWlmICh0dW5lcl9tYWtlID09IDAgfHwgdHVuZXJfbWFrZSA9PSAyKQoJCWlmKHR1bmVyX2Zvcm1hdCA8PTB4MGEpCgkJCXR1bmVyID0gdHVuZXJfMF90YWJsZVt0dW5lcl9mb3JtYXRdOwoJaWYgKHR1bmVyX21ha2UgPT0gMSkKCQlpZih0dW5lcl9mb3JtYXQgPD05KQoJCQl0dW5lciA9IHR1bmVyXzFfdGFibGVbdHVuZXJfZm9ybWF0XTsKCglpZiAodHVuZXJfbWFrZSA9PSA0KQoJCWlmKHR1bmVyX2Zvcm1hdCA9PSAweDA5KQoJCQl0dW5lciA9IFRVTkVSX0xHX05UU0NfTkVXX1RBUEM7IC8qIFRBUEMtRzcwMlAgKi8KCglwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IEF2ZXJtZWRpYSBlZXByb21bMHglMDJ4JTAyeF06IHR1bmVyPSIsCgkJYnR2LT5jLm5yLGVlcHJvbV9kYXRhWzB4NDFdLGVlcHJvbV9kYXRhWzB4NDJdKTsKCWlmKHR1bmVyKSB7CgkJYnR2LT50dW5lcl90eXBlPXR1bmVyOwoJCXByaW50aygiJWQiLHR1bmVyKTsKCX0gZWxzZQoJCXByaW50aygiVW5rbm93biB0eXBlIik7CglwcmludGsoIiByYWRpbzolcyByZW1vdGUgY29udHJvbDolc1xuIiwKCSAgICAgICB0dW5lcl90dl9mbSAgICAgPyAieWVzIiA6ICJubyIsCgkgICAgICAgYnR2LT5oYXNfcmVtb3RlID8gInllcyIgOiAibm8iKTsKfQoKLyogdXNlZCBvbiBWb29kb28gVFYvRk0gKFZvb2RvbyAyMDApLCBTMCB3aXJlZCB0byAweDEwMDAwICovCnZvaWQgYnR0dl90ZGE5ODgwX3NldG5vcm0oc3RydWN0IGJ0dHYgKmJ0diwgaW50IG5vcm0pCnsKCS8qIGZpeCB1cCBvdXIgY2FyZCBlbnRyeSAqLwoJaWYobm9ybT09VklERU9fTU9ERV9OVFNDKSB7CgkJYnR0dl90dmNhcmRzW0JUVFZfQk9BUkRfVk9PRE9PVFZfRk1dLmF1ZGlvbXV4WzBdPTB4OTU3ZmZmOwoJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFs0XT0weDk1N2ZmZjsKCQlkcHJpbnRrKCJidHR2X3RkYTk4ODBfc2V0bm9ybSB0byBOVFNDXG4iKTsKCX0KCWVsc2UgewoJCWJ0dHZfdHZjYXJkc1tCVFRWX0JPQVJEX1ZPT0RPT1RWX0ZNXS5hdWRpb211eFswXT0weDk0N2ZmZjsKCQlidHR2X3R2Y2FyZHNbQlRUVl9CT0FSRF9WT09ET09UVl9GTV0uYXVkaW9tdXhbNF09MHg5NDdmZmY7CgkJZHByaW50aygiYnR0dl90ZGE5ODgwX3NldG5vcm0gdG8gUEFMXG4iKTsKCX0KCS8qIHNldCBHUElPIGFjY29yZGluZyAqLwoJZ3Bpb19iaXRzKGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uZ3Bpb21hc2ssCgkJICBidHR2X3R2Y2FyZHNbYnR2LT5jLnR5cGVdLmF1ZGlvbXV4W2J0di0+YXVkaW9dKTsKfQoKCi8qCiAqIHJlc2V0L2VuYWJsZSB0aGUgTVNQIG9uIHNvbWUgSGF1cHBhdWdlIGNhcmRzCiAqIFRoYW5rcyB0byBLecO2c3RpIE3DpGxra2kgKGttYWxra2lAY2MuaHV0LmZpKSEKICoKICogSGF1cHBhdWdlOiAgcGluICA1CiAqIFZvb2RvbzogICAgIHBpbiAyMAogKi8Kc3RhdGljIHZvaWQgX19kZXZpbml0IGJvb3RfbXNwMzR4eChzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgcGluKQp7CglpbnQgbWFzayA9ICgxIDw8IHBpbik7CgoJZ3Bpb19pbm91dChtYXNrLG1hc2spOwoJZ3Bpb19iaXRzKG1hc2ssMCk7Cgl1ZGVsYXkoMjUwMCk7CglncGlvX2JpdHMobWFzayxtYXNrKTsKCglpZiAoYnR0dl9ncGlvKQoJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsIm1zcDM0eHgiKTsKCWlmIChidHR2X3ZlcmJvc2UpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBIYXVwcGF1Z2UvVm9vZG9vIG1zcDM0eHg6IHJlc2V0IGxpbmUgIgoJCSAgICAgICAiaW5pdCBbJWRdXG4iLCBidHYtPmMubnIsIHBpbik7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCnsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEltYWdlbmF0aW9uIEwtTW9kZWwgUFhDMjAwIEZyYW1lZ3JhYmJlciAqLwovKiAgVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VkdXJlIGFzCiAqICB1c2VkIGJ5IEFsZXNzYW5kcm8gUnViaW5pIGluIGhpcyBweGMyMDAKICogIGRyaXZlciwgYnV0IHVzaW5nIEJUVFYgZnVuY3Rpb25zICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9QWEMyMDAoc3RydWN0IGJ0dHYgKmJ0dikKewoJc3RhdGljIGludCB2YWxzW10gX19kZXZpbml0ZGF0YSA9IHsgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwZCwgMHgwZCwKCQkJCQkgICAgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKCQkJCQkgICAgMHgwMCB9OwoJdW5zaWduZWQgaW50IGk7CglpbnQgdG1wOwoJdTMyIHZhbDsKCgkvKiBJbml0aWFsaXNlIEdQSU8tY29ubmV2dGVkIHN0dWZmICovCglncGlvX2lub3V0KDB4ZmZmZmZmLCAoMTw8MTMpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMyk7CglncGlvX3dyaXRlKDE8PDEzKTsKCS8qIEdQSU8gaW5wdXRzIGFyZSBwdWxsZWQgdXAsIHNvIG5vIG5lZWQgdG8gZHJpdmUKCSAqIHJlc2V0IHBpbiBhbnkgbG9uZ2VyICovCglncGlvX2JpdHMoMHhmZmZmZmYsIDApOwoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJweGMyMDAiKTsKCgkvKiAgd2UgY291bGQvc2hvdWxkIHRyeSBhbmQgcmVzZXQvY29udHJvbCB0aGUgQUQgcG90cz8gYnV0CgkgICAgcmlnaHQgbm93ICB3ZSBzaW1wbHkgIHR1cm5lZCBvZmYgdGhlIGNydXNoaW5nLiAgV2l0aG91dAoJICAgIHRoaXMgdGhlIEFHQyBkcmlmdHMgZHJpZnRzCgkgICAgcmVtZW1iZXIgdGhlIEVOIGlzIHJldmVyc2UgbG9naWMgLS0+CgkgICAgc2V0dGluZyBCVDg0OF9BRENfQUdDX0VOIGRpc2FibGUgdGhlIEFHQwoJICAgIHRib3VsdEBlZWNzLmxlaGlnaC5lZHUKCSovCgoJYnR3cml0ZShCVDg0OF9BRENfUkVTRVJWRUR8QlQ4NDhfQURDX0FHQ19FTiwgQlQ4NDhfQURDKTsKCgkvKglJbml0aWFsaXNlIE1BWDUxNyBEQUMgKi8KCXByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgREFDIHJlZmVyZW5jZSB2b2x0YWdlIGxldmVsIC4uLlxuIik7CglidHR2X0kyQ1dyaXRlKGJ0diwweDVFLDAsMHg4MCwxKTsKCgkvKglJbml0aWFsaXNlIDEyQzUwOCBQSUMgKi8KCS8qCVRoZSBJMkNXcml0ZSBhbmQgSTJDUmVhZCBjb21tbWFuZHMgYXJlIGFjdHVhbGx5IHRvIHRoZQoJICoJc2FtZSBjaGlwcyAtIGJ1dCB0aGUgUi9XIGJpdCBpcyBpbmNsdWRlZCBpbiB0aGUgYWRkcmVzcwoJICoJYXJndW1lbnQgc28gdGhlIG51bWJlcnMgYXJlIGRpZmZlcmVudCAqLwoKCglwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXNpbmcgMTJDNTA4IFBJQyBjaGlwIC4uLlxuIik7CgoJLyogRmlyc3Qgb2YgYWxsLCBlbmFibGUgdGhlIGNsb2NrIGxpbmUuIFRoaXMgaXMgdXNlZCBpbiB0aGUgUFhDMjAwLUYgKi8KCXZhbCA9IGJ0cmVhZChCVDg0OF9HUElPX0RNQV9DVEwpOwoJdmFsIHw9IEJUODQ4X0dQSU9fRE1BX0NUTF9HUENMS01PREU7CglidHdyaXRlKHZhbCwgQlQ4NDhfR1BJT19ETUFfQ1RMKTsKCgkvKiBUaGVuLCBwdXNoIHRvIDAgdGhlIHJlc2V0IHBpbiBsb25nIGVub3VnaCB0byByZXNldCB0aGUgKgoJICogZGV2aWNlIHNhbWUgYXMgYWJvdmUgZm9yIHRoZSByZXNldCBsaW5lLCBidXQgbm90IHRoZSBzYW1lCgkgKiB2YWx1ZSBzZW50IHRvIHRoZSBHUElPLWNvbm5lY3RlZCBzdHVmZgoJICogd2hpY2ggb25lIGlzIHRoZSBnb29kIG9uZT8gKi8KCWdwaW9faW5vdXQoMHhmZmZmZmYsKDE8PDIpKTsKCWdwaW9fd3JpdGUoMCk7Cgl1ZGVsYXkoMTApOwoJZ3Bpb193cml0ZSgxPDwyKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2YWxzKTsgaSsrKSB7CgkJdG1wPWJ0dHZfSTJDV3JpdGUoYnR2LDB4MUUsMCx2YWxzW2ldLDEpOwoJCWlmICh0bXAgIT0gLTEpIHsKCQkJcHJpbnRrKEtFUk5fSU5GTwoJCQkgICAgICAgIkkyQyBXcml0ZSglMi4yeCkgPSAlaVxuSTJDIFJlYWQgKCkgPSAlMi4yeFxuXG4iLAoJCQkgICAgICAgdmFsc1tpXSx0bXAsYnR0dl9JMkNSZWFkKGJ0diwweDFGLE5VTEwpKTsKCQl9Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiUFhDMjAwIEluaXRpYWxpc2VkLlxuIik7Cn0KCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoKICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jawogKiAgaXQuIFRoaXMgYXBwYXJlbnRseSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBmb3IgZWFjaCA4NzggY2hpcDoKICoKICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCiAqCiAqICAyKSAgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIDB4MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSAweDBFCiAqICAgICByZWFkIGZyb20gR1BJT19EQVRBIGludG8gYnVmICh1aW50XzMyKQogKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKICogICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCBzdG9wLgogKgogKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCiAqICAgICAgLSB3cml0ZSAweDQ0MDAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxMG1zCiAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCiAqICAgICAgLSBzbGVlcCAxbXMKICogICAgICAtIHdyaXRlIDB4MEUKICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCiAqICAgICAgLSBpZiAoIGJ1Zj4+MTggJiAweDAxICkgfHwgKCBidWY+PjE5ICYmIDB4MDEgIT0gMCApCiAqICAgICAgICAgICAgICAgIGVycm9yLiBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZC4KICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCnZvaWQKaW5pdF9SVFYyNCAoc3RydWN0IGJ0dHYgKmJ0dikKewoJdWludDMyX3QgZGF0YVJlYWQgPSAwOwoJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CgoJcHJpbnRrIChLRVJOX0lORk8KCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKCQlidHYtPmMubnIpOwoKCWJ0d3JpdGUgKDB4MDBjM2ZlZmYsIEJUODQ4X0dQSU9fT1VUX0VOKTsKCglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7Cgltc2xlZXAgKDEpOwoJYnR3cml0ZSAoMHgxMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7CgoJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CgoJaWYgKCgoKGRhdGFSZWFkID4+IDE4KSAmIDB4MDEpICE9IDApIHx8ICgoKGRhdGFSZWFkID4+IDE5KSAmIDB4MDEpICE9IDEpKSB7CgkJcHJpbnRrIChLRVJOX0lORk8KCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigxKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCgkJCWJ0di0+Yy5uciwgZGF0YVJlYWQpOwoJfQoKCWJ0d3JpdGUgKDB4NDQwMCArIHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOwoJbXNsZWVwICgxMCk7CglidHdyaXRlICgweDQ0MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglidHdyaXRlICh3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKCW1zbGVlcCAoMSk7CglkYXRhUmVhZCA9IGJ0cmVhZCAoQlQ4NDhfR1BJT19EQVRBKTsKCglpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKCQlwcmludGsgKEtFUk5fSU5GTwoJCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uKDIpIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkIChyZWFkICVkKVxuIiwKCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CgoJCXJldHVybjsKCX0KCglwcmludGsgKEtFUk5fSU5GTwoJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGUuXG4iLCBidHYtPmMubnIpOwp9CgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIE1pcm8gUHJvIHJhZGlvIHN0dWZmIC0tIHRoZSB0ZWE1NzU3IGlzIGNvbm5lY3RlZCB0byBzb21lIEdQSU8gcG9ydHMgICAgICovCi8qCiAqIENvcHlyaWdodCAoYykgMTk5OSBDc2FiYSBIYWxhc3ogPHFnZWhhbGlAdW5pLW1pc2tvbGMuaHU+CiAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKgogKiBCcnV0YWxseSBoYWNrZWQgYnkgRGFuIFNoZXJpZGFuIDxkYW4uc2hlcmlkYW5AY29udGFjdC5vcmcudWs+IGRqczUyIDgvMy8wMAogKi8KCnN0YXRpYyB2b2lkIGJ1c19sb3coc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCwwKTsKCXVkZWxheSg1KTsKCglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsIDApOwoJCXVkZWxheSg1KTsKCX0KfQoKc3RhdGljIHZvaWQgYnVzX2hpZ2goc3RydWN0IGJ0dHYgKmJ0diwgaW50IGJpdCkKewoJaWYgKGJ0di0+bWJveF9pb3IpIHsKCQlncGlvX2JpdHMoYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwKCQkJICBidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsKTsKCQl1ZGVsYXkoNSk7Cgl9CgoJZ3Bpb19iaXRzKGJpdCxiaXQpOwoJdWRlbGF5KDUpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQp9CgpzdGF0aWMgaW50IGJ1c19pbihzdHJ1Y3QgYnR0diAqYnR2LCBpbnQgYml0KQp7CglpZiAoYnR2LT5tYm94X2lvcikgewoJCWdwaW9fYml0cyhidHYtPm1ib3hfaW9yIHwgYnR2LT5tYm94X2lvdyB8IGJ0di0+bWJveF9jc2VsLAoJCQkgIGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwpOwoJCXVkZWxheSg1KTsKCgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCwgMCk7CgkJdWRlbGF5KDUpOwoJfQoJcmV0dXJuIGdwaW9fcmVhZCgpICYgKGJpdCk7Cn0KCi8qIFRFQTU3NTcgcmVnaXN0ZXIgYml0cyAqLwojZGVmaW5lIFRFQV9GUkVRCQkwOjE0CiNkZWZpbmUgVEVBX0JVRkZFUgkJMTU6MTUKCiNkZWZpbmUgVEVBX1NJR05BTF9TVFJFTkdUSAkxNjoxNwoKI2RlZmluZSBURUFfUE9SVDEJCTE4OjE4CiNkZWZpbmUgVEVBX1BPUlQwCQkxOToxOQoKI2RlZmluZSBURUFfQkFORAkJMjA6MjEKI2RlZmluZSBURUFfQkFORF9GTQkJMAojZGVmaW5lIFRFQV9CQU5EX01XCQkxCiNkZWZpbmUgVEVBX0JBTkRfTFcJCTIKI2RlZmluZSBURUFfQkFORF9TVwkJMwoKI2RlZmluZSBURUFfTU9OTwkJMjI6MjIKI2RlZmluZSBURUFfQUxMT1dfU1RFUkVPCTAKI2RlZmluZSBURUFfRk9SQ0VfTU9OTwkJMQoKI2RlZmluZSBURUFfU0VBUkNIX0RJUkVDVElPTgkyMzoyMwojZGVmaW5lIFRFQV9TRUFSQ0hfRE9XTgkJMAojZGVmaW5lIFRFQV9TRUFSQ0hfVVAJCTEKCiNkZWZpbmUgVEVBX1NUQVRVUwkJMjQ6MjQKI2RlZmluZSBURUFfU1RBVFVTX1RVTkVECTAKI2RlZmluZSBURUFfU1RBVFVTX1NFQVJDSElORwkxCgovKiBMb3ctbGV2ZWwgc3R1ZmYgKi8Kc3RhdGljIGludCB0ZWE1NzU3X3JlYWQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwoJaW50IHZhbHVlID0gMDsKCWludCBpOwoKCS8qIGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KCWdwaW9faW5vdXQoYnR2LT5tYm94X21hc2ssIGJ0di0+bWJveF9jbGsgfCBidHYtPm1ib3hfd2UpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoKCWlmIChidHR2X2dwaW8pCgkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVhNTc1NyByZWFkIik7CgoJYnVzX2xvdyhidHYsYnR2LT5tYm94X3dlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoKCXVkZWxheSgxMCk7Cgl0aW1lb3V0PSBqaWZmaWVzICsgSFo7CgoJLyogd2FpdCBmb3IgREFUQSBsaW5lIHRvIGdvIGxvdzsgZXJyb3IgaWYgaXQgZG9lc24ndCAqLwoJd2hpbGUgKGJ1c19pbihidHYsYnR2LT5tYm94X2RhdGEpICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQoJCXNjaGVkdWxlKCk7CglpZiAoYnVzX2luKGJ0dixidHYtPm1ib3hfZGF0YSkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2JWQ6IHRlYTU3NTc6IHJlYWQgdGltZW91dFxuIixidHYtPmMubnIpOwoJCXJldHVybiAtMTsKCX0KCglkcHJpbnRrKCJidHR2JWQ6IHRlYTU3NTc6IixidHYtPmMubnIpOwoJZm9yKGkgPSAwOyBpIDwgMjQ7IGkrKykKCXsKCQl1ZGVsYXkoNSk7CgkJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSg1KTsKCQlkcHJpbnRrKCIlYyIsKGJ1c19pbihidHYsYnR2LT5tYm94X21vc3QpID09IDApPydUJzonLScpOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXZhbHVlIDw8PSAxOwoJCXZhbHVlIHw9IChidXNfaW4oYnR2LGJ0di0+bWJveF9kYXRhKSA9PSAwKT8wOjE7ICAvKiBNU0IgZmlyc3QgKi8KCQlkcHJpbnRrKCIlYyIsIChidXNfaW4oYnR2LGJ0di0+bWJveF9tb3N0KSA9PSAwKT8nUyc6J00nKTsKCX0KCWRwcmludGsoIlxuYnR0diVkOiB0ZWE1NzU3OiByZWFkIDB4JVhcbiIsIGJ0di0+Yy5uciwgdmFsdWUpOwoJcmV0dXJuIHZhbHVlOwp9CgpzdGF0aWMgaW50IHRlYTU3NTdfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHZhbHVlKQp7CglpbnQgaTsKCWludCByZWcgPSB2YWx1ZTsKCglncGlvX2lub3V0KGJ0di0+bWJveF9tYXNrLCBidHYtPm1ib3hfY2xrIHwgYnR2LT5tYm94X3dlIHwgYnR2LT5tYm94X2RhdGEpOwoKCWlmIChidHYtPm1ib3hfaW9yKSB7CgkJZ3Bpb19iaXRzKGJ0di0+bWJveF9pb3IgfCBidHYtPm1ib3hfaW93IHwgYnR2LT5tYm94X2NzZWwsCgkJCSAgYnR2LT5tYm94X2lvciB8IGJ0di0+bWJveF9pb3cgfCBidHYtPm1ib3hfY3NlbCk7CgkJdWRlbGF5KDUpOwoJfQoJaWYgKGJ0dHZfZ3BpbykKCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ0ZWE1NzU3IHdyaXRlIik7CgoJZHByaW50aygiYnR0diVkOiB0ZWE1NzU3OiB3cml0ZSAweCVYXG4iLCBidHYtPmMubnIsIHZhbHVlKTsKCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJYnVzX2hpZ2goYnR2LGJ0di0+bWJveF93ZSk7Cglmb3IoaSA9IDA7IGkgPCAyNTsgaSsrKQoJewoJCWlmIChyZWcgJiAweDEwMDAwMDApCgkJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJZWxzZQoJCQlidXNfbG93KGJ0dixidHYtPm1ib3hfZGF0YSk7CgkJcmVnIDw8PSAxOwoJCWJ1c19oaWdoKGJ0dixidHYtPm1ib3hfY2xrKTsKCQl1ZGVsYXkoMTApOwoJCWJ1c19sb3coYnR2LGJ0di0+bWJveF9jbGspOwoJCXVkZWxheSgxMCk7Cgl9CglidXNfbG93KGJ0dixidHYtPm1ib3hfd2UpOyAgLyogdW5tdXRlICEhISAqLwoJcmV0dXJuIDA7Cn0KCnZvaWQgdGVhNTc1N19zZXRfZnJlcShzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBzaG9ydCBmcmVxKQp7CglkcHJpbnRrKCJ0ZWE1NzU3X3NldF9mcmVxICVkXG4iLGZyZXEpOwoJdGVhNTc1N193cml0ZShidHYsIDUgKiBmcmVxICsgMHgzNTgpOyAvKiBhZGQgMTAuN01IeiAoc2VlIGRvY3MpICovCn0KCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiB3aW52aWV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCB3aW52aWV3X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJLyogUFQyMjU0QSBwcm9ncmFtbWluZyBKb24gVG9tYnMsIGpvbkBndGUuZXNpLnVzLmVzICovCglpbnQgYml0c19vdXQsIGxvb3BzLCB2b2wsIGRhdGE7CgoJaWYgKCFzZXQpIHsKCQkvKiBGaXhlZCBieSBMZWFuZHJvIEx1Y2FyZWxsYSA8bHVjYUBsaW51eG1lbmRvemEub3JnLmFyICgwNy8zMS8wMSkgKi8KCQl2LT5mbGFncyB8PSBWSURFT19BVURJT19WT0xVTUU7CgkJcmV0dXJuOwoJfQoKCS8qIDMyIGxldmVscyBsb2dhcml0aG1pYyAqLwoJdm9sID0gMzIgLSAoKHYtPnZvbHVtZT4+MTEpKTsKCS8qIHVuaXRzICovCgliaXRzX291dCA9IChQVDIyNTRfREJTX0lOXzI+Pih2b2wlNSkpOwoJLyogdGVucyAqLwoJYml0c19vdXQgfD0gKFBUMjI1NF9EQlNfSU5fMTA+Pih2b2wvNSkpOwoJYml0c19vdXQgfD0gUFQyMjU0X0xfQ0hBTk5FTCB8IFBUMjI1NF9SX0NIQU5ORUw7CglkYXRhID0gZ3Bpb19yZWFkKCk7CglkYXRhICY9IH4oV0lOVklFV19QVDIyNTRfQ0xLfCBXSU5WSUVXX1BUMjI1NF9EQVRBfAoJCSAgV0lOVklFV19QVDIyNTRfU1RST0JFKTsKCWZvciAobG9vcHMgPSAxNzsgbG9vcHMgPj0gMCA7IGxvb3BzLS0pIHsKCQlpZiAoYml0c19vdXQgJiAoMTw8bG9vcHMpKQoJCQlkYXRhIHw9ICBXSU5WSUVXX1BUMjI1NF9EQVRBOwoJCWVsc2UKCQkJZGF0YSAmPSB+V0lOVklFV19QVDIyNTRfREFUQTsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhIHw9IFdJTlZJRVdfUFQyMjU0X0NMSzsKCQlncGlvX3dyaXRlKGRhdGEpOwoJCXVkZWxheSg1KTsKCQlkYXRhICY9IH5XSU5WSUVXX1BUMjI1NF9DTEs7CgkJZ3Bpb193cml0ZShkYXRhKTsKCX0KCWRhdGEgfD0gIFdJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X0RBVEE7CglncGlvX3dyaXRlKGRhdGEpOwoJdWRlbGF5KDEwKTsKCWRhdGEgJj0gfldJTlZJRVdfUFQyMjU0X1NUUk9CRTsKCWdwaW9fd3JpdGUoZGF0YSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIG1vbm8vc3RlcmVvIGNvbnRyb2wgZm9yIHZhcmlvdXMgY2FyZHMgKHdoaWNoIGRvbid0IHVzZSBpMmMgY2hpcHMgYnV0ICAgICovCi8qIGNvbm5lY3Qgc29tZXRoaW5nIHRvIHRoZSBHUElPIHBpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgpzdGF0aWMgdm9pZApndmJjdHYzcGNpX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgzMDAsIDB4MzAwKTsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcxKQoJCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDMwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJY29uID0gMHgyMDA7Ci8qCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCiAqCQkJY29uID0gMHgxMDA7ICovCgkJZ3Bpb19iaXRzKDB4MzAwLCBjb24pOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSAgfCBWSURFT19TT1VORF9MQU5HMjsKCX0KfQoKc3RhdGljIHZvaWQKZ3ZiY3R2NXBjaV9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKCglpZiAoYnR2LT5yYWRpb191c2VyKQoJCXJldHVybjsKCgl2YWwgPSBncGlvX3JlYWQoKTsKCWlmIChzZXQpIHsKCQljb24gPSAweDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSB7CgkJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpIHsKCQkJCS8qIExBTkcxICsgTEFORzIgKi8KCQkJCWNvbiA9IDB4MTAwOwoJCQl9CgkJCWVsc2UgewoJCQkJLyogTEFORzIgKi8KCQkJCWNvbiA9IDB4MzAwOwoJCQl9CgkJfQoJCWlmIChjb24gIT0gKHZhbCAmIDB4MzAwKSkgewoJCQlncGlvX2JpdHMoMHgzMDAsIGNvbik7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJndmJjdHY1cGNpIik7CgkJfQoJfSBlbHNlIHsKCQlzd2l0Y2ggKHZhbCAmIDB4NzApIHsKCQkgIGNhc2UgMHgxMDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDMwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzI7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDUwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfTEFORzE7CgkJCWJyZWFrOwoJCSAgY2FzZSAweDYwOgoJCQl2LT5tb2RlID0gVklERU9fU09VTkRfU1RFUkVPOwoJCQlicmVhazsKCQkgIGNhc2UgMHg3MDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CgkJCWJyZWFrOwoJCSAgZGVmYXVsdDoKCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkJICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJCX0KCX0KfQoKLyoKICogTWFyaW8gTWVkaW5hIE51c3NiYXVtIDxtZWRpc29mdEBhbG9oYWJicy5vcmcubXg+CiAqICBJIGRpc2NvdmVyIHRoYXQgb24gQlQ4NDhfR1BJT19EQVRBIGFkZHJlc3MgYSBieXRlIDB4Y2NlIGVuYWJsZSBzdGVyZW8sCiAqICAweGRkZSBlbmFibGVzIG1vbm8gYW5kIDB4Y2NkIGVuYWJsZXMgc2FwCiAqCiAqIFBldHIgVmFuZHJvdmVjIDxWQU5EUk9WRUB2Yy5jdnV0LmN6PgogKiAgUC5TLjogQXQgbGVhc3QgbWFzayBpbiBsaW5lIGFib3ZlIGlzIHdyb25nIC0gR1BJTyBwaW5zIDMsMiBzZWxlY3QKICogIGlucHV0L291dHB1dCBzb3VuZCBjb25uZWN0aW9uLCBzbyBib3RoIG11c3QgYmUgc2V0IGZvciBvdXRwdXQgbW9kZS4KICoKICogTG9va3MgbGlrZSBpdCdzIG5lZWRlZCBvbmx5IGZvciB0aGUgInR2cGhvbmUiLCB0aGUgInR2cGhvbmUgOTgiCiAqIGhhbmRsZXMgdGhpcyB3aXRoIGEgdGRhOTg0MAogKgogKi8Kc3RhdGljIHZvaWQKYXZlcm1lZGlhX3R2cGhvbmVfYXVkaW8oc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IHZpZGVvX2F1ZGlvICp2LCBpbnQgc2V0KQp7CglpbnQgdmFsID0gMDsKCglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikgICAvKiBTQVAgKi8KCQkJdmFsID0gMHgwMjsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykKCQkJdmFsID0gMHgwMTsKCQlpZiAodmFsKSB7CgkJCWdwaW9fYml0cygweDAzLHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJhdmVybWVkaWEiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJVklERU9fU09VTkRfTEFORzE7CgkJcmV0dXJuOwoJfQp9CgpzdGF0aWMgdm9pZAphdmVybWVkaWFfdHZfc3RlcmVvX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJaW50IHZhbCA9IDA7CgoJaWYgKHNldCkgewoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpICAgLyogU0FQICovCgkJCXZhbCA9IDB4MDE7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pICAvKiBTVEVSRU8gKi8KCQkJdmFsID0gMHgwMjsKCQlidGFvcih2YWwsIH4weDAzLCBCVDg0OF9HUElPX0RBVEEpOwoJCWlmIChidHR2X2dwaW8pCgkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImF2ZXJtZWRpYSIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJcmV0dXJuOwoJfQp9CgovKiBMaWZldGVjIDk0MTUgaGFuZGxpbmcgKi8Kc3RhdGljIHZvaWQKbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJaW50IHZhbCA9IDA7CgoJaWYgKGdwaW9fcmVhZCgpICYgMHg0MDAwKSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CgkJcmV0dXJuOwoJfQoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKSAgLyogQTIgU0FQICovCgkJCXZhbCA9IDB4MDA4MDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykgLyogQTIgc3RlcmVvICovCgkJCXZhbCA9IDB4MDg4MDsKCQlpZiAoKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkgfHwKCQkgICAgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKSkKCQkJdmFsID0gMDsKCQlncGlvX2JpdHMoMHgwODgwLCB2YWwpOwoJCWlmIChidHR2X2dwaW8pCgkJCWJ0dHZfZ3Bpb190cmFja2luZyhidHYsImx0OTQxNSIpOwoJfSBlbHNlIHsKCQkvKiBhdXRvZGV0ZWN0IGRvZXNuJ3Qgd29yayB3aXRoIHRoaXMgY2FyZCA6LSggKi8KCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CgkJcmV0dXJuOwoJfQp9CgovKiBUREE5ODIxIG9uIFRlcnJhVFYrIEJ0ODQ4LCBCdDg3OCAqLwpzdGF0aWMgdm9pZAp0ZXJyYXR2X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgaW50IGNvbiA9IDA7CgoJaWYgKHNldCkgewoJCWdwaW9faW5vdXQoMHgxODAwMDAsMHgxODAwMDApOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzIpCgkJCWNvbiA9IDB4MDgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDE4MDAwMDsKCQlncGlvX2JpdHMoMHgxODAwMDAsIGNvbik7CgkJaWYgKGJ0dHZfZ3BpbykKCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwidGVycmF0diIpOwoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCnN0YXRpYyB2b2lkCndpbmZhc3QyMDAwX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgbG9uZyB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQkvKmJ0b3IgKDB4YzMyMDAwLCBCVDg0OF9HUElPX09VVF9FTik7Ki8KCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCQkvKiBNb25vICovCgkJCXZhbCA9IDB4NDIwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCS8qIE1vbm8gKi8KCQkJdmFsID0gMHg0MjAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikJLyogU0FQICovCgkJCXZhbCA9IDB4NDEwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQkvKiBTdGVyZW8gKi8KCQkJdmFsID0gMHgwMjAwMDA7CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHg0MzAwMDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ3aW5mYXN0MjAwMCIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQkgIFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIERhcml1c3ogS293YWxld3NraSA8ZGFyZWtrQGF1dG9tZXgucGw+CiAqIHNvdW5kIGNvbnRyb2wgZm9yIFByb2xpbmsgUFYtQlQ4NzhQKzlCIChQaXhlbFZpZXcgUGxheVRWIFBybyBGTStOSUNBTQogKiByZXZpc2lvbiA5QiBoYXMgb24tYm9hcmQgVERBOTg3NEEgc291bmQgZGVjb2RlcikuCiAqCiAqIE5vdGU6IFRoZXJlIGFyZSBjYXJkIHZhcmlhbnRzIHdpdGhvdXQgdGRhOTg3NGEuIEZvcmNpbmcgdGhlICJzdGVyZW8gc291bmQgcm91dGUiCiAqICAgICAgIHdpbGwgbXV0ZSB0aGlzIGNhcmRzLgogKi8Kc3RhdGljIHZvaWQKcHZidDg3OHA5Yl9hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwgPSAwOwoKCWlmIChidHYtPnJhZGlvX3VzZXIpCgkJcmV0dXJuOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKCQkJdmFsID0gMHgwMTsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgwMjsKCQl9CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgwMyx2YWwpOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwicHZidDg3OHA5YiIpOwoJCX0KCX0gZWxzZSB7CgkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk8gfCBWSURFT19TT1VORF9TVEVSRU8gfAoJCQlWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBEYXJpdXN6IEtvd2FsZXdza2kgPGRhcmVra0BhdXRvbWV4LnBsPgogKiBzb3VuZCBjb250cm9sIGZvciBGbHlWaWRlbyAyMDAwUyAod2l0aCB0ZGE5ODc0IGRlY29kZXIpCiAqIGJhc2VkIG9uIHB2YnQ4NzhwOWJfYXVkaW8oKSAtIHRoaXMgaXMgbm90IHRlc3RlZCwgcGxlYXNlIGZpeCEhIQogKi8Kc3RhdGljIHZvaWQKZnYyMDAwc19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCB2YWwgPSAweGZmZmY7CgoJaWYgKGJ0di0+cmFkaW9fdXNlcikKCQlyZXR1cm47CglpZiAoc2V0KSB7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9NT05PKQl7CgkJCXZhbCA9IDB4MDAwMDsKCQl9CgkJaWYgKCh2LT5tb2RlICYgKFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzIpKQoJCSAgICB8fCAodi0+bW9kZSAmIFZJREVPX1NPVU5EX1NURVJFTykpIHsKCQkJdmFsID0gMHgxMDgwOyAvKi1kay0/Pz86IDB4MDg4MCwgMHgwMDgwLCAweDE4MDAgLi4uICovCgkJfQoJCWlmICh2YWwgIT0gMHhmZmZmKSB7CgkJCWdwaW9fYml0cygweDE4MDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJmdjIwMDBzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCVZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qCiAqIHNvdW5kIGNvbnRyb2wgZm9yIENhbm9wdXMgV2luRFZSIFBDSQogKiBNYXNha2kgU3V6dWtpIDxtYXNha2lAYnRyZWUub3JnPgogKi8Kc3RhdGljIHZvaWQKd2luZHZyX2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCkKewoJdW5zaWduZWQgbG9uZyB2YWwgPSAwOwoKCWlmIChzZXQpIHsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCgkJCXZhbCA9IDB4MDQwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTEFORzEpCgkJCXZhbCA9IDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMikKCQkJdmFsID0gMHgxMDAwMDA7CgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9TVEVSRU8pCgkJCXZhbCA9IDA7CgkJaWYgKHZhbCkgewoJCQlncGlvX2JpdHMoMHgxNDAwMDAsIHZhbCk7CgkJCWlmIChidHR2X2dwaW8pCgkJCQlidHR2X2dwaW9fdHJhY2tpbmcoYnR2LCJ3aW5kdnIiKTsKCQl9Cgl9IGVsc2UgewoJCXYtPm1vZGUgPSBWSURFT19TT1VORF9NT05PIHwgVklERU9fU09VTkRfU1RFUkVPIHwKCQkJICBWSURFT19TT1VORF9MQU5HMSB8IFZJREVPX1NPVU5EX0xBTkcyOwoJfQp9CgovKgogKiBzb3VuZCBjb250cm9sIGZvciBBRC1UVks1MDMKICogSGlyb3NoaSBUYWtla2F3YSA8c2lhbkBiaWcub3IuanA+CiAqLwpzdGF0aWMgdm9pZAphZHR2azUwM19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpCnsKCXVuc2lnbmVkIGludCBjb24gPSAweGZmZmZmZjsKCgkvKiBidGFvcigweDFlMDAwMCwgfjB4MWUwMDAwLCBCVDg0OF9HUElPX09VVF9FTik7ICovCgoJaWYgKHNldCkgewoJCS8qIGJ0b3IoKioqLCBCVDg0OF9HUElPX09VVF9FTik7ICovCgkJaWYgKHYtPm1vZGUgJiBWSURFT19TT1VORF9MQU5HMSkKCQkJY29uID0gMHgwMDAwMDAwMDsKCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX0xBTkcyKQoJCQljb24gPSAweDAwMTgwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKQoJCQljb24gPSAweDAwMDAwMDAwOwoJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykKCQkJY29uID0gMHgwMDA2MDAwMDsKCQlpZiAoY29uICE9IDB4ZmZmZmZmKSB7CgkJCWdwaW9fYml0cygweDFlMDAwMCxjb24pOwoJCQlpZiAoYnR0dl9ncGlvKQoJCQkJYnR0dl9ncGlvX3RyYWNraW5nKGJ0diwgImFkdHZrNTAzIik7CgkJfQoJfSBlbHNlIHsKCQl2LT5tb2RlID0gVklERU9fU09VTkRfTU9OTyB8IFZJREVPX1NPVU5EX1NURVJFTyB8CgkJCSAgVklERU9fU09VTkRfTEFORzEgIHwgVklERU9fU09VTkRfTEFORzI7Cgl9Cn0KCi8qIFJlbW90ZVZpc2lvbiBNWCAocnY2MDUpIG11eHNlbCBoZWxwZXIgW01pZ3VlbCBGcmVpdGFzXQogKgogKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJ2NjA1IGRvbid0IHVzZSBhIG5vcm1hbCBtdWx0aXBsZXgsIGJ1dCBhIGNyb3NzcG9pbnQKICogc3dpdGNoIGluc3RlYWQgKENEMjJNMzQ5NEUpLiBUaGlzIElDIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjb25uZWN0aW9ucwogKiBiZXR3ZWVuIFhuIChpbnB1dCkgYW5kIFluIChvdXRwdXQpIHBpbnMuIFdlIG5lZWQgdG8gY2xlYXIgYW55IGV4aXN0aW5nCiAqIGNvbm5lY3Rpb24gcHJpb3IgdG8gZXN0YWJsaXNoIGEgbmV3IG9uZSwgcHVsc2luZyB0aGUgU1RST0JFIHBpbi4KICoKICogVGhlIGJvYXJkIGhhcmR3aXJlIFkwICh4cG9pbnQpIHRvIE1VWDEgYW5kIE1VWE9VVCB0byBZaW4uCiAqIEdQSU8gcGlucyBhcmUgd2lyZWQgYXM6CiAqICBHUElPWzA6M10gLSBBWFswOjNdICh4cG9pbnQpIC0gUDFbMDozXSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzQ6Nl0gLSBBWVswOjJdICh4cG9pbnQpIC0gUDFbNDo2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzddICAgLSBEQVRBICh4cG9pbnQpICAgIC0gUDFbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJT1s4XSAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzVdIChtaWNyb2NvbnRyb2xlcikKICogIEdQSU9bOV0gICAtIFJFU0VUICh4cG9pbnQpICAgLSBQM1s2XSAobWljcm9jb250cm9sZXIpCiAqICBHUElPWzEwXSAgLSBTVFJPQkUgKHhwb2ludCkgIC0gUDNbN10gKG1pY3JvY29udHJvbGVyKQogKiAgR1BJTlRSICAgIC0gICAgICAgICAgICAgICAgICAtIFAzWzRdIChtaWNyb2NvbnRyb2xlcikKICoKICogVGhlIG1pY3JvY29udHJvbGVyIGlzIGEgODBDMzIgbGlrZS4gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNoYW5nZSB4cG9pbnQKICogY29uZmlndXJhdGlvbiBlaXRoZXIgZGlyZWN0bHkgKGFzIHdlIGFyZSBkb2luZykgb3IgdXNpbmcgdGhlIG1pY3JvY29udHJvbGVyCiAqIHdoaWNoIGlzIGFsc28gd2lyZWQgdG8gSTJDIGludGVyZmFjZS4gSSBoYXZlIG5vIGZ1cnRoZXIgaW5mbyBvbiB0aGUKICogbWljcm9jb250cm9sZXIgZmVhdHVyZXMsIG9uZSB3b3VsZCBuZWVkIHRvIGRpc2Fzc2VtYmx5IHRoZSBmaXJtd2FyZS4KICogbm90ZTogdGhlIHZlbmRvciByZWZ1c2VkIHRvIGdpdmUgYW55IGluZm9ybWF0aW9uIG9uIHRoaXMgcHJvZHVjdCwgYWxsCiAqICAgICAgIHRoYXQgc3R1ZmYgd2FzIGZvdW5kIHVzaW5nIGEgbXVsdGltZXRlciEgOikKICovCnN0YXRpYyB2b2lkIHJ2NjA1X211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIHJlc2V0IGFsbCBjb25lY3Rpb25zICovCglncGlvX2JpdHMoMHgyMDAsMHgyMDApOwoJbWRlbGF5KDEpOwoJZ3Bpb19iaXRzKDB4MjAwLDB4MDAwKTsKCW1kZWxheSgxKTsKCgkvKiBjcmVhdGUgYSBuZXcgY29uZWN0aW9uICovCglncGlvX2JpdHMoMHg0ODAsMHgwODApOwoJZ3Bpb19iaXRzKDB4NDgwLDB4NDgwKTsKCW1kZWxheSgxKTsKCWdwaW9fYml0cygweDQ4MCwweDA4MCk7CgltZGVsYXkoMSk7Cn0KCi8qIFRpYmV0IFN5c3RlbXMgJ1Byb2dyZXNzIERWUicgQ1MxNiBtdXhzZWwgaGVscGVyIFtDaHJpcyBGYW5uaW5nXQogKgogKiBUaGUgQ1MxNiAoYXZhaWxhYmxlIG9uIGVCYXkgY2hlYXApIGlzIGEgUENJIGJvYXJkIHdpdGggZm91ciBGdXNpb24KICogODc4QSBjaGlwcywgYSBQQ0kgYnJpZGdlLCBhbiBBdG1lbCBtaWNyb2NvbnRyb2xsZXIsIGZvdXIgc3luYyBzZXBlcmF0b3IKICogY2hpcHMsIHRlbiBlaWdodCBpbnB1dCBhbmFsb2cgbXVsdGlwbGV4b3JzLCBhIG5vdCBjaGlwIGFuZCBhIGZldwogKiBvdGhlciBjb21wb25lbnRzLgogKgogKiAxNiBpbnB1dHMgb24gYSBzZWNvbmRhcnkgYnJhY2tldCBhcmUgcHJvdmlkZWQgYW5kIGNhbiBiZSBzZWxlY3RlZAogKiBmcm9tIGVhY2ggb2YgdGhlIGZvdXIgY2FwdHVyZSBjaGlwcy4gIFR3byBvZiB0aGUgZWlnaHQgaW5wdXQKICogbXVsdGlwbGV4b3JzIGFyZSB1c2VkIHRvIHNlbGVjdCBmcm9tIGFueSBvZiB0aGUgMTYgaW5wdXQgc2lnbmFscy4KICoKICogVW5zdXBwb3J0ZWQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzOgogKiAgLiBBIHZpZGVvIG91dHB1dCBtb25pdG9yIG9uIHRoZSBzZWNvbmRhcnkgYnJhY2tldCBjYW4gYmUgc2VsZWN0ZWQgZnJvbQogKiAgICBvbmUgb2YgdGhlIDg3OEEgY2hpcHMuCiAqICAuIEFub3RoZXIgcGFzc3Rocm91Z2ggYnV0IEkgaGF2ZW4ndCBzcGVudCBhbnkgdGltZSBpbnZlc3RpZ2F0aW5nIGl0LgogKiAgLiBEaWdpdGFsIEkvTyAobG9naWMgbGV2ZWwgY29ubmVjdGVkIHRvIEdQSU8pIGlzIGF2YWlsYWJsZSBmcm9tIGFuCiAqICAgIG9uYm9hcmQgaGVhZGVyLgogKgogKiBUaGUgb24gY2hpcCBpbnB1dCBtdXggc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMi4KICogR1BJT1sxNjoxOV0gLSBWaWRlbyBpbnB1dCBzZWxlY3Rpb24KICogR1BJT1swOjNdICAgLSBWaWRlbyBvdXRwdXQgbW9uaXRvciBzZWxlY3QgKG9ubHkgYXZhaWxhYmxlIGZyb20gb25lIDg3OEEpCiAqIEdQSU9bPzo/XSAgIC0gRGlnaXRhbCBJL08uCiAqCiAqIFRoZXJlIGlzIGFuIEFUTUVMIG1pY3JvY29udHJvbGxlciB3aXRoIGFuIDgwMzEgY29yZSBvbiBib2FyZC4gIEkgaGF2ZSBub3QKICogZGV0ZXJtaW5lZCB3aGF0IGZ1bmN0aW9uIChpZiBhbnkpIGl0IHByb3ZpZGVzLiAgV2l0aCB0aGUgbWljcm9jb250cm9sbGVyCiAqIGFuZCBzeW5jIHNlcGVyYXRvciBjaGlwcyBhIGd1ZXNzIGlzIHRoYXQgaXQgbWlnaHQgaGF2ZSB0byBkbyB3aXRoIHZpZGVvCiAqIHN3aXRjaGluZyBhbmQgbWF5YmUgc29tZSBkaWdpdGFsIEkvTy4KICovCnN0YXRpYyB2b2lkIHRpYmV0Q1MxNl9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CgkvKiB2aWRlbyBtdXggKi8KCWdwaW9fYml0cygweDBmMDAwMCwgaW5wdXQgPDwgMTYpOwp9CgpzdGF0aWMgdm9pZCB0aWJldENTMTZfaW5pdChzdHJ1Y3QgYnR0diAqYnR2KQp7CgkvKiBlbmFibGUgZ3BpbyBiaXRzLCBtYXNrIG9idGFpbmVkIHZpYSBidFNweSAqLwoJZ3Bpb19pbm91dCgweGZmZmZmZiwgMHgwZjdmZmYpOwoJZ3Bpb193cml0ZSgweDBmN2ZmZik7Cn0KCi8qCiAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZm9yIHRoZSBLb2RpY29tLTQ0MDByIGdldCBhIGxpdHRsZSBtaW5kLXR3aXN0aW5nLgogKiBUaGVyZSBpcyBhICJtYXN0ZXIiIGNvbnRyb2xsZXIgYW5kIHRocmVlICJzbGF2ZSIgY29udHJvbGxlcnMsIHRvZ2V0aGVyCiAqIGFuIGFuYWxvZyBzd2l0Y2ggd2hpY2ggY29ubmVjdHMgYW55IG9mIDE2IGNhbWVyYXMgdG8gYW55IG9mIHRoZSBCVDg3QSdzLgogKiBUaGUgYW5hbG9nIHN3aXRjaCBpcyBjb250cm9sbGVkIGJ5IHRoZSAibWFzdGVyIiwgYnV0IHRoZSBkZXRlY3Rpb24gb3JkZXIKICogb2YgdGhlIGZvdXIgQlQ4NzhBIGNoaXBzIGlzIGluIGFuIG9yZGVyIHdoaWNoIEkganVzdCBkb24ndCB1bmRlcnN0YW5kLgogKiBUaGUgIm1hc3RlciIgaXMgYWN0dWFsbHkgdGhlIHNlY29uZCBjb250cm9sbGVyIHRvIGJlIGRldGVjdGVkLiAgVGhlCiAqIGxvZ2ljIG9uIHRoZSBib2FyZCB1c2VzIGxvZ2ljYWwgbnVtYmVycyBmb3IgdGhlIDQgY29udHJvbGVycywgYnV0CiAqIHRob3NlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UuICBXaGVuIHdvcmtpbmcKICogd2l0aCB0aGUgYW5hbG9nIHN3aXRjaCwgd2UgbmVlZCB0byAibWFwIiBmcm9tIHRoZSBkZXRlY3Rpb24gc2VxdWVuY2UKICogb3ZlciB0byB0aGUgYm9hcmQncyBsb2dpY2FsIGNvbnRyb2xsZXIgbnVtYmVyLiAgVGhpcyBtYXBwaW5nIHNlcXVlbmNlCiAqIGlzIHszLCAwLCAyLCAxfSwgaS5lLiB0aGUgZmlyc3QgY29udHJvbGxlciB0byBiZSBkZXRlY3RlZCBpcyBsb2dpY2FsCiAqIHVuaXQgMywgdGhlIHNlY29uZCAod2hpY2ggaXMgdGhlIG1hc3RlcikgaXMgbG9naWNhbCB1bml0IDAsIGV0Yy4KICogV2UgbmVlZCB0byBtYWludGFpbiB0aGUgc3RhdHVzIG9mIHRoZSBhbmFsb2cgc3dpdGNoICh3aGljaCBvZiB0aGUgMTYKICogY2FtZXJhcyBpcyBjb25uZWN0ZWQgdG8gd2hpY2ggb2YgdGhlIDQgY29udHJvbGxlcnMpLiAgUmF0aGVyIHRoYW4KICogYWRkIHRvIHRoZSBidHR2IHN0cnVjdHVyZSBmb3IgdGhpcywgd2UgdXNlIHRoZSBkYXRhIHJlc2VydmVkIGZvcgogKiB0aGUgbWJveCAodW51c2VkIGZvciB0aGlzIGNhcmQgdHlwZSkuCiAqLwoKLyoKICogRmlyc3QgYSByb3V0aW5lIHRvIHNldCB0aGUgYW5hbG9nIHN3aXRjaCwgd2hpY2ggY29udHJvbHMgd2hpY2ggY2FtZXJhCiAqIGlzIHJvdXRlZCB0byB3aGljaCBjb250cm9sbGVyLiAgVGhlIHN3aXRjaCBjb21wcmlzZXMgYW4gWC1hZGRyZXNzCiAqIChncGlvIGJpdHMgMC0zLCByZXByZXNlbnRpbmcgdGhlIGNhbWVyYSwgcmFuZ2luZyBmcm9tIDAtMTUpLCBhbmQgYQogKiBZLWFkZHJlc3MgKGdwaW8gYml0cyA0LTYsIHJlcHJlc2VudGluZyB0aGUgY29udHJvbGxlciwgcmFuZ2luZyBmcm9tIDAtMykuCiAqIEEgZGF0YSB2YWx1ZSAoZ3BpbyBiaXQgNykgb2YgJzEnIGVuYWJsZXMgdGhlIHN3aXRjaCwgYW5kICcwJyBkaXNhYmxlcwogKiB0aGUgc3dpdGNoLiAgQSBTVFJPQkUgYml0IChncGlvIGJpdCA4KSBsYXRjaGVzIHRoZSBkYXRhIHZhbHVlIGludG8gdGhlCiAqIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhlIGlkZWEgaXMgdG8gc2V0IHRoZSBhZGRyZXNzIGFuZCBkYXRhLCB0aGVuIGJyaW5nCiAqIFNUUk9CRSBoaWdoLCBhbmQgZmluYWxseSBicmluZyBTVFJPQkUgYmFjayB0byBsb3cuCiAqLwpzdGF0aWMgdm9pZCBrb2RpY29tNDQwMHJfd3JpdGUoc3RydWN0IGJ0dHYgKmJ0diwKCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgeGFkZHIsCgkJCSAgICAgICB1bnNpZ25lZCBjaGFyIHlhZGRyLAoJCQkgICAgICAgdW5zaWduZWQgY2hhciBkYXRhKSB7Cgl1bnNpZ25lZCBpbnQgdWRhdGE7CgoJdWRhdGEgPSAoZGF0YSA8PCA3KSB8ICgoeWFkZHImMykgPDwgNCkgfCAoeGFkZHImMHhmKTsKCWdwaW9fYml0cygweDFmZiwgdWRhdGEpOwkJLyogd3JpdGUgQUREUiBhbmQgREFUICovCglncGlvX2JpdHMoMHgxZmYsIHVkYXRhIHwgKDEgPDwgOCkpOwkvKiBzdHJvYmUgaGlnaCAqLwoJZ3Bpb19iaXRzKDB4MWZmLCB1ZGF0YSk7CQkvKiBzdHJvYmUgbG93ICovCn0KCi8qCiAqIE5leHQgdGhlIG11eCBzZWxlY3QuICBCb3RoIHRoZSAibWFzdGVyIiBhbmQgInNsYXZlIiAnY2FyZHMnIChjb250cm9sbGVycykKICogdXNlIHRoaXMgcm91dGluZS4gIFRoZSByb3V0aW5lIGZpbmRzIHRoZSAibWFzdGVyIiBmb3IgdGhlIGNhcmQsIG1hcHMKICogdGhlIGNvbnRyb2xsZXIgbnVtYmVyIGZyb20gdGhlIGRldGVjdGVkIHBvc2l0aW9uIG92ZXIgdG8gdGhlIGxvZ2ljYWwKICogbnVtYmVyLCB3cml0ZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdG8gdGhlIGFuYWxvZyBzd2l0Y2gsIGFuZCBob3VzZWtlZXBzCiAqIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzd2l0Y2ggaW5mb3JtYXRpb24uICBUaGUgcGFyYW1ldGVyICdpbnB1dCcgaXMgdGhlCiAqIHJlcXVlc3RlZCBjYW1lcmEgbnVtYmVyICgwIC0gMTUpLgogKi8Kc3RhdGljIHZvaWQga29kaWNvbTQ0MDByX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCWNoYXIgKnN3X3N0YXR1czsKCWludCB4YWRkciwgeWFkZHI7CglzdHJ1Y3QgYnR0diAqbWN0bHI7CglzdGF0aWMgdW5zaWduZWQgY2hhciBtYXBbNF0gPSB7MywgMCwgMiwgMX07CgoJbWN0bHIgPSBtYXN0ZXJbYnR2LT5jLm5yXTsKCWlmIChtY3RsciA9PSBOVUxMKSB7CS8qIGlnbm9yZSBpZiBtYXN0ZXIgbm90IHlldCBkZXRlY3RlZCAqLwoJCXJldHVybjsKCX0KCXlhZGRyID0gKGJ0di0+Yy5uciAtIG1jdGxyLT5jLm5yICsgMSkgJiAzOyAvKiB0aGUgJyYnIGlzIGZvciBzYWZldHkgKi8KCXlhZGRyID0gbWFwW3lhZGRyXTsKCXN3X3N0YXR1cyA9IChjaGFyICopKCZtY3Rsci0+bWJveF93ZSk7Cgl4YWRkciA9IGlucHV0ICYgMHhmOwoJLyogQ2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIvY2FtZXJhIHBhaXIgaGFzIGNoYW5nZWQsIGVsc2UgaWdub3JlICovCglpZiAoc3dfc3RhdHVzW3lhZGRyXSAhPSB4YWRkcikKCXsKCQkvKiAib3BlbiIgdGhlIG9sZCBzd2l0Y2gsICJjbG9zZSIgdGhlIG5ldyBvbmUsIHNhdmUgdGhlIG5ldyAqLwoJCWtvZGljb200NDAwcl93cml0ZShtY3Rsciwgc3dfc3RhdHVzW3lhZGRyXSwgeWFkZHIsIDApOwoJCXN3X3N0YXR1c1t5YWRkcl0gPSB4YWRkcjsKCQlrb2RpY29tNDQwMHJfd3JpdGUobWN0bHIsIHhhZGRyLCB5YWRkciwgMSk7Cgl9Cn0KCi8qCiAqIER1cmluZyBpbml0aWFsaXNhdGlvbiwgd2UgbmVlZCB0byByZXNldCB0aGUgYW5hbG9nIHN3aXRjaC4gIFdlCiAqIGFsc28gcHJlc2V0IHRoZSBzd2l0Y2ggdG8gbWFwIHRoZSA0IGNvbm5lY3RvcnMgb24gdGhlIGNhcmQgdG8gdGhlCiAqICp1c2VyJ3MqIChzZWUgYWJvdmUgZGVzY3JpcHRpb24gb2Yga29kaWNvbTQ0MDByX211eHNlbCkgY2hhbm5lbHMKICogMCB0aHJvdWdoIDMKICovCnN0YXRpYyB2b2lkIGtvZGljb200NDAwcl9pbml0KHN0cnVjdCBidHR2ICpidHYpCnsKCWNoYXIgKnN3X3N0YXR1cyA9IChjaGFyICopKCZidHYtPm1ib3hfd2UpOwoJaW50IGl4OwoKCWdwaW9faW5vdXQoMHgwMDAzZmYsIDB4MDAwM2ZmKTsKCWdwaW9fd3JpdGUoMSA8PCA5KTsJLyogcmVzZXQgTVVYICovCglncGlvX3dyaXRlKDApOwoJLyogUHJlc2V0IGNhbWVyYSAwIHRvIHRoZSA0IGNvbnRyb2xsZXJzICovCglmb3IgKGl4PTA7IGl4PDQ7IGl4KyspIHsKCQlzd19zdGF0dXNbaXhdID0gaXg7CgkJa29kaWNvbTQ0MDByX3dyaXRlKGJ0diwgaXgsIGl4LCAxKTsKCX0KCS8qCgkgKiBTaW5jZSB0aGlzIGlzIHRoZSAibWFzdGVyIiwgd2UgbmVlZCB0byBzZXQgdXAgdGhlCgkgKiBvdGhlciB0aHJlZSBjb250cm9sbGVyIGNoaXBzJyBwb2ludGVycyB0byB0aGlzIHN0cnVjdHVyZQoJICogZm9yIGxhdGVyIHVzZSBpbiB0aGUgbXV4c2VsIHJvdXRpbmUuCgkgKi8KCWlmICgoYnR2LT5jLm5yPDEpIHx8IChidHYtPmMubnI+QlRUVl9NQVgtMykpCgkgICAgcmV0dXJuOwoJbWFzdGVyW2J0di0+Yy5uci0xXSA9IGJ0djsKCW1hc3RlcltidHYtPmMubnJdICAgPSBidHY7CgltYXN0ZXJbYnR2LT5jLm5yKzFdID0gYnR2OwoJbWFzdGVyW2J0di0+Yy5ucisyXSA9IGJ0djsKfQoKLyogVGhlIEdyYW5kdGVjIFgtR3VhcmQgZnJhbWVncmFiYmVyIGNhcmQgdXNlcyB0d28gRHVhbCA0LWNoYW5uZWwKICogdmlkZW8gbXVsdGlwbGV4ZXJzIHRvIHByb3ZpZGUgdXAgdG8gMTYgdmlkZW8gaW5wdXRzLiBUaGVzZQogKiBtdWx0aXBsZXhlcnMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIGxvd2VyIDggR1BJTyBwaW5zIG9mIHRoZQogKiBidDg3OC4gVGhlIG11bHRpcGxleGVycyBwcm9iYWJseSBQZXJpY29tIFBJNVYzMzFRIG9yIHNpbWlsYXIuCgogKiB4eHgwIGlzIHBpbiB4eHggb2YgbXVsdGlwbGV4ZXIgVTUsCiAqIHl5eTEgaXMgcGluIHl5eSBvZiBtdWx0aXBsZXhlciBVMgogKi8KI2RlZmluZSBFTkEwICAgIDB4MDEKI2RlZmluZSBFTkIwICAgIDB4MDIKI2RlZmluZSBFTkExICAgIDB4MDQKI2RlZmluZSBFTkIxICAgIDB4MDgKCiNkZWZpbmUgSU4xMCAgICAweDEwCiNkZWZpbmUgSU4wMCAgICAweDIwCiNkZWZpbmUgSU4xMSAgICAweDQwCiNkZWZpbmUgSU4wMSAgICAweDgwCgpzdGF0aWMgdm9pZCB4Z3VhcmRfbXV4c2VsKHN0cnVjdCBidHR2ICpidHYsIHVuc2lnbmVkIGludCBpbnB1dCkKewoJc3RhdGljIGNvbnN0IGludCBtYXNrc1tdID0gewoJCUVOQjAsIEVOQjB8SU4wMCwgRU5CMHxJTjEwLCBFTkIwfElOMDB8SU4xMCwKCQlFTkEwLCBFTkEwfElOMDAsIEVOQTB8SU4xMCwgRU5BMHxJTjAwfElOMTAsCgkJRU5CMSwgRU5CMXxJTjAxLCBFTkIxfElOMTEsIEVOQjF8SU4wMXxJTjExLAoJCUVOQTEsIEVOQTF8SU4wMSwgRU5BMXxJTjExLCBFTkExfElOMDF8SU4xMSwKCX07CglncGlvX3dyaXRlKG1hc2tzW2lucHV0JTE2XSk7Cn0Kc3RhdGljIHZvaWQgcGljb2xvX3RldHJhX2luaXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJLypUaGlzIGlzIHRoZSB2aWRlbyBpbnB1dCByZWRpcmVjdGlvbiBmb25jdGlvbmFsaXR5IDogSSBESUQgTk9UIFVTRUQgSVQuICovCglidHdyaXRlICgweDA4PDwxNixCVDg0OF9HUElPX0RBVEEpOy8qR1BJT1sxOV0gWz09PiA0MDUzIEIrQ10gc2V0IHRvIDEgKi8KCWJ0d3JpdGUgKDB4MDQ8PDE2LEJUODQ4X0dQSU9fREFUQSk7LypHUElPWzE4XSBbPT0+IDQwNTMgQV0gIHNldCB0byAxKi8KfQpzdGF0aWMgdm9pZCBwaWNvbG9fdGV0cmFfbXV4c2VsIChzdHJ1Y3QgYnR0diogYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCglkcHJpbnRrIChLRVJOX0RFQlVHICJidHR2JWQgOiBwaWNvbG9fdGV0cmFfbXV4c2VsID0+ICBpbnB1dCA9ICVkXG4iLGJ0di0+Yy5ucixpbnB1dCk7CgkvKkp1c3Qgc2V0IHRoZSByaWdodCBwYXRoIGluIHRoZSBhbmFsb2cgbXVsdGlwbGV4ZXJzIDogY2hhbm5lbCAxIC0+IDQgPT0+IEFuYWxvZyBNdXggPT0+IE1VWDAqLwoJLypHUElPWzIwXSZHUElPWzIxXSB1c2VkIHRvIGNob29zZSB0aGUgcmlnaHQgaW5wdXQqLwoJYnR3cml0ZSAoaW5wdXQ8PDIwLEJUODQ4X0dQSU9fREFUQSk7Cgp9CgovKgogKiBpdmMxMjBfbXV4c2VsIFtBZGRlZCBieSBBbGFuIEdhcmZpZWxkIDxhbGFuQGZyb21vcmJpdC5jb20+XQogKgogKiBUaGUgSVZDMTIwRyBzZWN1cml0eSBjYXJkIGhhcyA0IGkyYyBjb250cm9sbGVkIFREQTg1NDAgbWF0cml4CiAqIHN3aWNoZXJzIHRvIHByb3ZpZGUgMTYgY2hhbm5lbHMgdG8gTVVYMC4gVGhlIFREQTg1NDAncyBoYXZlCiAqIDQgaW5kZXBlZGFudCBvdXRwdXRzIGFuZCBhcyBzdWNoIHRoZSBJVkMxMjBHIGFsc28gaGFzIHRoZQogKiBvcHRpb25hbCAiTW9uaXRvciBPdXQiIGJ1cy4gVGhpcyBhbGxvd3MgdGhlIGNhcmQgdG8gYmUgbG9va2luZwogKiBhdCBvbmUgaW5wdXQgd2hpbGUgdGhlIG1vbml0b3IgaXMgbG9va2luZyBhdCBhbm90aGVyLgogKgogKiBTaW5jZSBJJ3ZlIGNvdWxkbid0IGJlIGJvdGhlcmVkIGZpZ3VyaW5nIG91dCBob3cgdG8gYWRkIGFuCiAqIGluZGVwZW5kYW50IG11eHNlbCBmb3IgdGhlIG1vbml0b3IgYnVzLCBJJ3ZlIGp1c3Qgc2V0IGl0IHRvCiAqIHdoYXRldmVyIHRoZSBjYXJkIGlzIGxvb2tpbmcgYXQuCiAqCiAqICBPVVQwIG9mIHRoZSBUREE4NTQwJ3MgaXMgY29ubmVjdGVkIHRvIE1VWDAgICAgICAgICAoMHgwMykKICogIE9VVDEgb2YgdGhlIFREQTg1NDAncyBpcyBjb25uZWN0ZWQgdG8gIk1vbml0b3IgT3V0IiAgICAgICAgKDB4MEMpCiAqCiAqICBUREE4NTQwX0FMVDMgSU4wLTMgPSBDaGFubmVsIDEzIC0gMTYgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDQgSU4wLTMgPSBDaGFubmVsIDEgLSA0ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDUgSU4wLTMgPSBDaGFubmVsIDUgLSA4ICAgICAgICAgKDB4MDMpCiAqICBUREE4NTQwX0FMVDYgSU4wLTMgPSBDaGFubmVsIDkgLSAxMiAgICAgICAgICAgICAgICAoMHgwMykKICoKICovCgovKiBBbGwgNyBwb3NzaWJsZSBzdWItaWRzIGZvciB0aGUgVERBODU0MCBNYXRyaXggU3dpdGNoZXIgKi8KI2RlZmluZSBJMkNfVERBODU0MCAgICAgICAgMHg5MAojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDEgICAweDkyCiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUMiAgIDB4OTQKI2RlZmluZSBJMkNfVERBODU0MF9BTFQzICAgMHg5NgojZGVmaW5lIEkyQ19UREE4NTQwX0FMVDQgICAweDk4CiNkZWZpbmUgSTJDX1REQTg1NDBfQUxUNSAgIDB4OWEKI2RlZmluZSBJMkNfVERBODU0MF9BTFQ2ICAgMHg5YwoKc3RhdGljIHZvaWQgaXZjMTIwX211eHNlbChzdHJ1Y3QgYnR0diAqYnR2LCB1bnNpZ25lZCBpbnQgaW5wdXQpCnsKCS8qIFNpbXBsZSBtYXRocyAqLwoJaW50IGtleSA9IGlucHV0ICUgNDsKCWludCBtYXRyaXggPSBpbnB1dCAvIDQ7CgoJZHByaW50aygiYnR0diVkOiBpdmMxMjBfbXV4c2VsOiBJbnB1dCAtICUwMmQgfCBUREEgLSAlMDJkIHwgSW4gLSAlMDJkXG4iLAoJCWJ0di0+Yy5uciwgaW5wdXQsIG1hdHJpeCwga2V5KTsKCgkvKiBIYW5kbGVzIHRoZSBpbnB1dCBzZWxlY3Rpb24gb24gdGhlIFREQTg1NDAncyAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDMsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMykgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDQsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMCkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDYsIDB4MDAsCgkJICAgICAgKChtYXRyaXggPT0gMikgPyAoa2V5IHwga2V5IDw8IDIpIDogMHgwMCksIDEpOwoKCS8qIEhhbmRsZXMgdGhlIG91dHB1dCBlbmFibGVzIG9uIHRoZSBUREE4NTQwJ3MgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQzLCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDMpID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEzIC0gMTYgKi8KCWJ0dHZfSTJDV3JpdGUoYnR2LCBJMkNfVERBODU0MF9BTFQ0LCAweDAyLAoJCSAgICAgICgobWF0cml4ID09IDApID8gMHgwMyA6IDB4MDApLCAxKTsgIC8qIDEtNCAqLwoJYnR0dl9JMkNXcml0ZShidHYsIEkyQ19UREE4NTQwX0FMVDUsIDB4MDIsCgkJICAgICAgKChtYXRyaXggPT0gMSkgPyAweDAzIDogMHgwMCksIDEpOyAgLyogNS04ICovCglidHR2X0kyQ1dyaXRlKGJ0diwgSTJDX1REQTg1NDBfQUxUNiwgMHgwMiwKCQkgICAgICAoKG1hdHJpeCA9PSAyKSA/IDB4MDMgOiAweDAwKSwgMSk7ICAvKiA5LTEyICovCgoJLyogU2VsZWN0cyBNVVgwIGZvciBpbnB1dCBvbiB0aGUgODc4ICovCglidGFvcigoMCk8PDUsIH4oMzw8NSksIEJUODQ4X0lGT1JNKTsKfQoKCi8qIFBYQzIwMCBtdXhzZWwgaGVscGVyCiAqIGx1a2VAc3lzZW5nLmFudS5lZHUuYXUKICogYW5vdGhlciB0cmFuc3BsYW50CiAqIGZyb20gQWxlc3NhbmRybyBSdWJpbmkgKHJ1YmluaUBsaW51eC5pdCkKICoKICogVGhlcmUgYXJlIDQga2luZHMgb2YgY2FyZHM6CiAqIFBYQzIwMEwgd2hpY2ggaXMgYnQ4NDgKICogUFhDMjAwRiB3aGljaCBpcyBidDg0OCB3aXRoIFBJQyBjb250cm9sbGluZyBtdXgKICogUFhDMjAwQUwgd2hpY2ggaXMgYnQ4NzgKICogUFhDMjAwQUYgd2hpY2ggaXMgYnQ4Nzggd2l0aCBQSUMgY29udHJvbGxpbmcgbXV4CiAqLwojZGVmaW5lIFBYX0NGR19QWEMyMDBGIDB4MDEKI2RlZmluZSBQWF9GTEFHX1BYQzIwMEEgIDB4MDAwMDEwMDAgLyogYSBweGMyMDBBIGlzIGJ0LTg3OCBiYXNlZCAqLwojZGVmaW5lIFBYX0kyQ19QSUMgICAgICAgMHgwZgojZGVmaW5lIFBYX1BYQzIwMEFfQ0FSRElEIDB4MjAwYTEyOTUKI2RlZmluZSBQWF9JMkNfQ01EX0NGRyAgIDB4MDAKCnN0YXRpYyB2b2lkIFBYQzIwMF9tdXhzZWwoc3RydWN0IGJ0dHYgKmJ0diwgdW5zaWduZWQgaW50IGlucHV0KQp7CglpbnQgcmM7Cglsb25nIG11eDsKCWludCBiaXRtYXNrOwoJdW5zaWduZWQgY2hhciBidWZbMl07CgoJLyogUmVhZCBQSUMgY29uZmlnIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGEgUFhDMjAwRiAqLwoJLyogUFhfSTJDX0NNRF9DRkcqLwoJYnVmWzBdPTA7CglidWZbMV09MDsKCXJjPWJ0dHZfSTJDV3JpdGUoYnR2LChQWF9JMkNfUElDPDwxKSxidWZbMF0sYnVmWzFdLDEpOwoJaWYgKHJjKSB7CgkgIHByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6IFBYQzIwMF9tdXhzZWw6IHBpYyBjZmcgd3JpdGUgZmFpbGVkOiVkXG4iLCBidHYtPmMubnIscmMpOwoJICAvKiBub3QgUFhDID8gZG8gbm90aGluZyAqLwoJICByZXR1cm47Cgl9CgoJcmM9YnR0dl9JMkNSZWFkKGJ0diwoUFhfSTJDX1BJQzw8MSksTlVMTCk7CglpZiAoIShyYyAmIFBYX0NGR19QWEMyMDBGKSkgewoJICBwcmludGsoS0VSTl9ERUJVRyAiYnR0diVkOiBQWEMyMDBfbXV4c2VsOiBub3QgUFhDMjAwRiByYzolZCBcbiIsIGJ0di0+Yy5ucixyYyk7CgkgIHJldHVybjsKCX0KCgoJLyogVGhlIG11bHRpcGxleGVyIGluIHRoZSAyMDBGIGlzIGhhbmRsZWQgYnkgdGhlIEdQSU8gcG9ydCAqLwoJLyogZ2V0IGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIGlucHV0cyAgKi8KCS8qICBtdXggPSBidHR2X3R2Y2FyZHNbYnR2LT50eXBlXS5tdXhzZWxbaW5wdXRdICYgMzsgKi8KCS8qICoqIG5vdCBuZWVkZWQhPyAgICovCgltdXggPSBpbnB1dDsKCgkvKiBtYWtlIHN1cmUgb3V0cHV0IHBpbnMgYXJlIGVuYWJsZWQgKi8KCS8qIGJpdG1hc2s9MHgzMGY7ICovCgliaXRtYXNrPTB4MzAyOwoJLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgUFhDMjAwQSAqLwoJaWYgKGJ0di0+Y2FyZGlkID09IFBYX1BYQzIwMEFfQ0FSRElEKSAgewoJICAgYml0bWFzayBePSAweDE4MDsgLyogdXNlIDcgYW5kIDksIG5vdCA4IGFuZCA5ICovCgkgICBiaXRtYXNrIHw9IDc8PDQ7IC8qIHRoZSBEQUMgKi8KCX0KCWJ0d3JpdGUoYml0bWFzaywgQlQ4NDhfR1BJT19PVVRfRU4pOwoKCWJpdG1hc2sgPSBidHJlYWQoQlQ4NDhfR1BJT19EQVRBKTsKCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MjgwKSB8ICgobXV4ICYgMikgPDwgOCkgfCAoKG11eCAmIDEpIDw8IDcpOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYml0bWFzayA9IChiaXRtYXNrICYgfjB4MzAwKSB8ICgobXV4ICYgMykgPDwgOCk7CglidHdyaXRlKGJpdG1hc2ssQlQ4NDhfR1BJT19EQVRBKTsKCgkvKgoJICogV2FzICJ0byBiZSBzYWZlLCBzZXQgdGhlIGJ0ODQ4IHRvIGlucHV0IDAiCgkgKiBBY3R1YWxseSwgc2luY2UgaXQncyBvayBhdCBsb2FkIHRpbWUsIGJldHRlciBub3QgbWVzc2luZwoJICogd2l0aCB0aGVzZSBiaXRzIChvbiBQWEMyMDBBRiB5b3UgbmVlZCB0byBzZXQgbXV4IDIgaGVyZSkKCSAqCgkgKiBuZWVkZWQgYmVjYXVzZSBidHR2LWRyaXZlciBzZXRzIG11eCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCgkgKi8KCWlmIChidHYtPmNhcmRpZCA9PSBQWF9QWEMyMDBBX0NBUkRJRCkKCSAgYnRhb3IoMjw8NSwgfkJUODQ4X0lGT1JNX01VWFNFTCwgQlQ4NDhfSUZPUk0pOwoJZWxzZSAvKiBvbGRlciBkZXZpY2UgKi8KCSAgYnRhbmQofkJUODQ4X0lGT1JNX01VWFNFTCxCVDg0OF9JRk9STSk7CgoJcHJpbnRrKEtFUk5fREVCVUcgImJ0dHYlZDogc2V0dGluZyBpbnB1dCBjaGFubmVsIHRvOiVkXG4iLCBidHYtPmMubnIsKGludCltdXgpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBtb3RoZXJib2FyZCBjaGlwc2V0IHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKdm9pZCBfX2RldmluaXQgYnR0dl9jaGVja19jaGlwc2V0KHZvaWQpCnsKCWludCBwY2lwY2lfZmFpbCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9GQUlMKQoJCXBjaXBjaV9mYWlsID0gMTsKCWlmIChwY2lfcGNpX3Byb2JsZW1zICYgKFBDSVBDSV9UUklUT058UENJUENJX05BVE9NQXxQQ0lQQ0lfVklBRVRCRikpCgkJdHJpdG9uMSA9IDE7CglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9WU0ZYKQoJCXZzZnggPSAxOwojaWZkZWYgUENJUENJX0FMSU1BR0lLCglpZiAocGNpX3BjaV9wcm9ibGVtcyAmIFBDSVBDSV9BTElNQUdJSykKCQlsYXRlbmN5ID0gMHgwQTsKI2VuZGlmCgoKCS8qIHByaW50IHdhcm5pbmdzIGFib3V0IGFueSBxdWlya3MgZm91bmQgKi8KCWlmICh0cml0b24xKQoJCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIG5lZWRzIEVUQkYgZW5hYmxlZC5cbiIpOwoJaWYgKHZzZngpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogSG9zdCBicmlkZ2UgbmVlZHMgVlNGWCBlbmFibGVkLlxuIik7CglpZiAocGNpcGNpX2ZhaWwpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBCVDg0OCBhbmQgeW91ciBjaGlwc2V0IG1heSBub3Qgd29yayB0b2dldGhlci5cbiIpOwoJCWlmICghbm9fb3ZlcmxheSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJidHR2OiBvdmVybGF5IHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKCQkJbm9fb3ZlcmxheSA9IDE7CgkJfSBlbHNlIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYnR0djogb3ZlcmxheSBmb3JjZWQuIFVzZSB0aGlzIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLlxuIik7CgkJfQoJfQoJaWYgKFVOU0VUICE9IGxhdGVuY3kpCgkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogcGNpIGxhdGVuY3kgZml4dXAgWyVkXVxuIixsYXRlbmN5KTsKCXdoaWxlICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEsIGRldikpKSB7CgkJdW5zaWduZWQgY2hhciBiOwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MywgJmIpOwoJCWlmIChidHR2X2RlYnVnKQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBIb3N0IGJyaWRnZTogODI0NDFGWCBOYXRvbWEsICIKCQkJICAgICAgICJidWZjb249MHglMDJ4XG4iLGIpOwoJfQp9CgppbnQgX19kZXZpbml0IGJ0dHZfaGFuZGxlX2NoaXBzZXQoc3RydWN0IGJ0dHYgKmJ0dikKewoJdW5zaWduZWQgY2hhciBjb21tYW5kOwoKCWlmICghdHJpdG9uMSAmJiAhdnNmeCAmJiBVTlNFVCA9PSBsYXRlbmN5KQoJCXJldHVybiAwOwoKCWlmIChidHR2X3ZlcmJvc2UpIHsKCQlpZiAodHJpdG9uMSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBlbmFibGluZyBFVEJGICg0MzBGWC9WUDMgY29tcGF0aWJpbHR5KVxuIixidHYtPmMubnIpOwoJCWlmICh2c2Z4ICYmIGJ0di0+aWQgPj0gODc4KQoJCQlwcmludGsoS0VSTl9JTkZPICJidHR2JWQ6IGVuYWJsaW5nIFZTRlhcbiIsYnR2LT5jLm5yKTsKCQlpZiAoVU5TRVQgIT0gbGF0ZW5jeSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnR0diVkOiBzZXR0aW5nIHBjaSB0aW1lciB0byAlZFxuIiwKCQkJICAgICAgIGJ0di0+Yy5ucixsYXRlbmN5KTsKCX0KCglpZiAoYnR2LT5pZCA8IDg3OCkgewoJCS8qIGJ0ODQ4IChtaXMpdXNlcyBhIGJpdCBpbiB0aGUgaXJxIG1hc2sgZm9yIGV0YmYgKi8KCQlpZiAodHJpdG9uMSkKCQkJYnR2LT50cml0b24xID0gQlQ4NDhfSU5UX0VUQkY7Cgl9IGVsc2UgewoJCS8qIGJ0ODc4IGhhcyBhIGJpdCBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSBmb3IgaXQgKi8KCQlwY2lfcmVhZF9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCAmY29tbWFuZCk7CgkJaWYgKHRyaXRvbjEpCgkJCWNvbW1hbmQgfD0gQlQ4NzhfRU5fVEJGWDsKCQlpZiAodnNmeCkKCQkJY29tbWFuZCB8PSBCVDg3OF9FTl9WU0ZYOwoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBCVDg3OF9ERVZDVFJMLCBjb21tYW5kKTsKCX0KCWlmIChVTlNFVCAhPSBsYXRlbmN5KQoJCXBjaV93cml0ZV9jb25maWdfYnl0ZShidHYtPmMucGNpLCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0ZW5jeSk7CglyZXR1cm4gMDsKfQoKCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogYy1iYXNpYy1vZmZzZXQ6IDgKICogRW5kOgogKi8K