LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKClRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCmFsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQpGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCmludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCmxpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCgpJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbApsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAp0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCk1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCgpJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCm1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbApQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQpTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCm9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCkRJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKZGlzY2xhaW1lci4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KCklmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKICAgICoJUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAoJdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KCiAgICAqCVJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCglkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKICAgICoJTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQpESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCkFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwooSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgpBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAooSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwpTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZm5kZWYgX19JTkNtdkJvYXJkRW52TGliaAojZGVmaW5lIF9fSU5DbXZCb2FyZEVudkxpYmgKCi8qIGRlZmluZXMgKi8KLyogVGhlIGJlbG93IGNvbnN0YW50IG1hY3JvcyBkZWZpbmVzIHRoZSBib2FyZCBJMkMgRUVQUk9NIGRhdGEgb2Zmc2V0cyAqLwoKI2luY2x1ZGUgImN0cmxFbnYvbXZDdHJsRW52TGliLmgiCiNpbmNsdWRlICJtdlN5c0h3Q29uZmlnLmgiCiNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oIgojaW5jbHVkZSAidHdzaS9tdlR3c2kuaCIKCi8qIERVQVJUIHN0dWZmIGZvciBUY2xrIGRldGVjdGlvbiBvbmx5ICovCiNkZWZpbmUgRFVBUlRfQkFVRF9SQVRFCQkJMTE1MjAwCiNkZWZpbmUgTUFYX0NMT0NLX01BUkdJTkUJCTUwMDAwMDAJLyogTWF4aW11bSBkZXRlY3RlZCBjbG9jayBtYXJnaW5lICovCgovKiBWb2ljZSBkZXZpY2VzIGFzc2VtYmx5IG1vZGVzICovCiNkZWZpbmUgREFJU1lfQ0hBSU5fTU9ERQkxCiNkZWZpbmUgRFVBTF9DSElQX1NFTEVDVF9NT0RFICAgMAojZGVmaW5lIElOVEVSUlVQVF9UT19NUFAgICAgICAgIDEKI2RlZmluZSBJTlRFUlJVUFRfVE9fVERNCTAKCiNkZWZpbmUgQk9BUkRfRVRIX1BPUlRfTlVNICBNVl9FVEhfTUFYX1BPUlRTCiNkZWZpbmUgQk9BUkRfRVRIX1NXSVRDSF9QT1JUX05VTQk4CiNkZWZpbmUgQk9BUkRfRVRIX1NXSVRDSF9DUFVQT1JUX05VTQkyCgojZGVmaW5lCU1WX0JPQVJEX01BWF9VU0JfSUYJCTEKI2RlZmluZSBNVl9CT0FSRF9NQVhfTVBQCQkxMgojZGVmaW5lIE1WX0JPQVJEX05BTUVfTEVOICAJCTB4MjAKCi8qCiNkZWZpbmUgTVZfQk9BUkRfQ0ZHX0lTX0dQT05fRU4oY2ZnKQkoY2ZnICYgMHgxKQojZGVmaW5lIE1WX0JPQVJEX0NGR19JU19FUE9OX0VOKGNmZykJKCFNVl9CT0FSRF9DRkdfSVNfRVBPTihjZmcpKQojZGVmaW5lIE1WX0JPQVJEX0NGR19JU19RU0dNSUlfRU4oY2ZnKQkoKGNmZyAmIDB4OCkgJiYgKGNmZyAmIDB4MTApKQojZGVmaW5lIE1WX0JPQVJEX0NGR19JU19TR01JSV9FTihjZmcpCSgoY2ZnICYgMHg4KSAmJiAoIShjZmcgJiAweDEwKSkpCiNkZWZpbmUgTVZfQk9BUkRfQ0ZHX0lTX1NBVEFfRU4oY2ZnKQkoIShjZmcgJiAweDgpKQojZGVmaW5lIE1WX0JPQVJEX0NGR19JU18zRkVfMUdFX0VOKGNmZykJKGNmZyAmIDB4MjApCiNkZWZpbmUgTVZfQk9BUkRfQ0ZHX0lTXzRGRV9FTihjZmcpCSghTVZfQk9BUkRfQ0ZHX0lTXzNGRV8xR0VfRU4oY2ZnKSkKKi8KLyogREJfODhGNjYwMSAgQXZhbnRhIGJvYXJkIGNvbmZpZ3VyYXRpb24gKi8KLyogSlAwCQlNQUMgY29ubmVjdGlvbiAJMCCWIE1BQzAgY29ubmVjdGVkIHRvIEdCRSBQSFkgYW5kIE1BQzEgIGNvbm5lY3RlZCB0byBMUCBTZXJEZXMKCQkJCQkJCTEgliBNQUMwIGNvbm5lY3RlZCB0byBMUCBTZXJEZXMgKi8KI2RlZmluZSBNVl9CT0FSRF82NjAxX0NGR19NQUNfU1JDKGNmZykJKGNmZyAmIDB4MSkKLyogSlAxCUV0aGVybmV0IGNhcGFjaXR5CTAgliBzaW5nbGUgRXRoZXJuZXQgY2hhbm5lbCAoR0JFIG9ubHkpCgkJCQkJCQkxIJYgZHVhbCBFdGguIGNoYW5uZWxzICovCiNkZWZpbmUgTVZfQk9BUkRfNjYwMV9DRkdfRVRIX0NBUChjZmcpCShjZmcgJiAweDIpCi8qIEpQMglMUCBTZXJEZXMgY29ubmVjdGlvbgkwIC0gIExQIFNlckRlcyBjb25uZWN0ZWQgdG8gR0JFIFBIWQoJCQkJCQkJCTEgLSAgTFAgU2VyRGVzIGNvbm5lY3RlZCB0byBTRlAJKi8KI2RlZmluZSBNVl9CT0FSRF82NjAxX0NGR19MUF9TRVJERVNfQ09OX01BU0sJMHg0CiNkZWZpbmUgTVZfQk9BUkRfNjYwMV9DRkdfTFBfU0VSREVTX0NPTihjZmcpCShjZmcgJiBNVl9CT0FSRF82NjAxX0NGR19MUF9TRVJERVNfQ09OX01BU0spCi8qIEpQMwlMUCBTZXJEZXMgbW9kZQkwIC0gIExQIFNlckRlcyBhdCAxLjI1RyBtb2RlCgkJCQkJCTEgLSAgTFAgU2VyRGVzIGF0IDIuNUcgbW9kZSAgICAgKi8KI2RlZmluZSBNVl9CT0FSRF82NjAxX0NGR19MUF9TRVJERVNfTU9ERV9NQVNLCTB4OAojZGVmaW5lIE1WX0JPQVJEXzY2MDFfQ0ZHX0xQX1NFUkRFU19NT0RFKGNmZykJKGNmZyAmIE1WX0JPQVJEXzY2MDFfQ0ZHX0xQX1NFUkRFU19NT0RFX01BU0spCi8qIEpQNAlGWFMgcHJlc2VuY2UgCTAgliBGWFMgcHJlc2VudGVkCgkJCQkJCTEgliBGWFMgbWlzc2luZyAJCQkqLwojZGVmaW5lIE1WX0JPQVJEXzY2MDFfQ0ZHX0ZYU19NQVNLCTB4MTAKI2RlZmluZSBNVl9CT0FSRF82NjAxX0NGR19GWFMoY2ZnKQkoY2ZnICYgTVZfQk9BUkRfNjYwMV9DRkdfRlhTX01BU0spCi8qIEpQNQlQT04gQkVOIHBvbGFyaXR5CTAgliBCRU4gYWN0aXZlIGxvdwoJCQkJCQkJMSCWIEJFTiBhY3RpdmUgaGlnaAkJKi8KI2RlZmluZSBNVl9CT0FSRF82NjAxX0NGR19QT05fUE9MQVJJVFkoY2ZnKQkoY2ZnICYgMHgyMCkKCi8qIEVQUFJPTSBNb2R1bGVzIGRldGVjdGlvbiBpbmZvcm1hdGlvbiAqLwojZGVmaW5lIE1WX0JPQVJEX0NGR19TV19TUkMoY2ZnKQkoY2ZnICYgMHgzKQovKiBTV19TUkMKSlA1IEpQNgogMCAgIDAKCUlmIFFTR01JSSBtb2R1bGUgcHJlc2VudDogTUFDMCA9PiBTd2l0Y2ggPT4gUVNHTUlJCiAwICAgMQoJSWYgUVNHTUlJIG1vZHVsZSBwcmVzZW50OiBNQUMxID0+IFN3aXRjaCA9PiBRU0dNSUkKCUlmIFFTR01JSSBtb2R1bGUgbm90IHByZXNlbnQ6IE1BQzAgPT4gU3dpdGNoID0+IDN4RkUKIDEgICAwCglJZiBRU0dNSUkgbW9kdWxlIHByZXNlbnQ6IE1BQzAgPT4gU3dpdGNoID0+IFFTR01JSS4KCUlmIFFTR01JSSBtb2R1bGUgbm90IHByZXNlbnQ6IE1BQzEgPT4gU3dpdGNoID0+IDN4RkUuCiAxICAgMQoJSWYgUVNHTUlJIG1vZHVsZSBwcmVzZW50OiAoTUFDMCArIE1BQzEpID0+IFN3aXRjaCA9PiBRU0dNSUkKCUlmIFFTR01JSSBtb2R1bGUgbm90IHByZXNlbnQ6IChNQUMwICsgTUFDMSkgPT4gU3dpdGNoID0+IDN4RkUKKi8KI2RlZmluZSBNVl9CT0FSRF9DRkdfU0VSREVTX1NSQyhjZmcpCSgoY2ZnICYgMHhDKT4+MikKLyogU0VSREVTX1NSQwpKUDggSlAxMAogMCAgIDAgICAgTm9uZQogMSAgIDAgICAgU0FUQQogMCAgIDEgICAgU0dNSUkKIDEgICAxICAgIE4vQQoqLwojZGVmaW5lIE1WX0JPQVJEX0NGR19SR01JSUFfU1JDKGNmZykJKChjZmcgJiAweDMwKT4+NCkKLyogUkdNSUlBX1NSQwpKUDExIEpQMTIKIDAgICAgMCAgIE5vbmUKIDEgICAgMCAgIE1BQzAgc291cmNlCiAwICAgIDEgICBNQUMxIHNvdXJjZQogMSAgICAxICAgU3dpdGNoIHBvcnQgNSBzb3VyY2UKKi8KI2RlZmluZSBNVl9CT0FSRF9DRkdfRkVHRVBIWV9TUkMoY2ZnKQkoKGNmZyAmIDB4QzApPj42KQovKiBHRVBIWV9TUkMKSlAxNyBKUDE4CiAwICAgIDAgICBOb25lCiAxICAgIDAgICBNQUMxIHNvdXJjZQogMCAgICAxICAgU3dpdGNoIHBvcnQgNCBzb3VyY2UKIDEgICAgMSAgIFN3aXRjaCBwb3J0IDUgc291cmNlCiovCgojZGVmaW5lIE1WX0JPQVJEX0VFUFJPTV9NT0RVTEVfQUREUgkJMHgyNAojZGVmaW5lIE1WX0JPQVJEX0VFUFJPTV9NT0RVTEVfQUREUl9UWVBFCUFERFI3X0JJVAoKI2RlZmluZSBNVl9CT0FSRF9SR01JSUFfTU9EVUxFX0FERFIJCTB4MjIKI2RlZmluZSBNVl9CT0FSRF9SR01JSUFfTU9EVUxFX0FERFJfVFlQRQlBRERSN19CSVQKI2RlZmluZSBNVl9CT0FSRF9SR01JSUFfTU9EVUxFX01VWF9DSE5VTQkxCgojZGVmaW5lIE1WX0JPQVJEX1JHTUlJQl9NT0RVTEVfQUREUgkJMHgyMAojZGVmaW5lIE1WX0JPQVJEX1JHTUlJQl9NT0RVTEVfQUREUl9UWVBFCUFERFI3X0JJVAojZGVmaW5lIE1WX0JPQVJEX1JHTUlJQl9NT0RVTEVfTVVYX0NITlVNCTEKCiNkZWZpbmUgTVZfQk9BUkRfUVNHTUlJX01PRFVMRV9BRERSCQkweDIzCiNkZWZpbmUgTVZfQk9BUkRfUVNHTUlJX01PRFVMRV9BRERSX1RZUEUJQUREUjdfQklUCiNkZWZpbmUgTVZfQk9BUkRfUVNHTUlJX01PRFVMRV9NVVhfQ0hOVU0JMQoKI2RlZmluZSBNVl9CT0FSRF9HRV9TRlBfTU9EVUxFX0FERFIJCTB4NTAKI2RlZmluZSBNVl9CT0FSRF9HRV9TRlBfTU9EVUxFX0FERFJfVFlQRQlBRERSN19CSVQKI2RlZmluZSBNVl9CT0FSRF9HRV9TRlBfTU9EVUxFX01VWF9DSE5VTQkxCgojZGVmaW5lIE1WX0JPQVJEX1hDVlJfTVVYX0FERFIJCQkweDcwCiNkZWZpbmUgTVZfQk9BUkRfWENWUl9NVVhfQUREUl9UWVBFCQlBRERSN19CSVQKCiNkZWZpbmUgTVZfQk9BUkRfVERNXzc5Ml9BREFQVF9NT0RVTEVfQUREUgkweDI3CiNkZWZpbmUgTVZfQk9BUkRfVERNXzg4MF9NT0RVTEVfQUREUgkJMHgyNgojZGVmaW5lIE1WX0JPQVJEX1RETV8zMjE1X01PRFVMRV9BRERSCQkweDIzCiNkZWZpbmUgTVZfQk9BUkRfVERNX01PRFVMRV9BRERSX1RZUEUJCUFERFI3X0JJVAojZGVmaW5lIE1WX0JPQVJEX1RETV9NT0RVTEVfTVVYX0NITlVNCQkwCgojZGVmaW5lIE1WX0JPQVJEX1NXSVRDSF9TQ0FOX01PREVfU0FUUl9JRFgJMAojZGVmaW5lIE1WX0JPQVJEX1NXSVRDSF9TQ0FOX01PREUoeCkJCSgoeCAmIDEpID09IDEpCiNkZWZpbmUgTVZfQk9BUkRfU1dJVENIX1NDQU5fTU9ERV9NQVNLCQkweDEKCgp0eXBlZGVmIHN0cnVjdCBfYm9hcmREYXRhIHsKCU1WX1UzMiBtYWdpYzsKCU1WX1UxNiBib2FyZElkOwoJTVZfVTggYm9hcmRWZXI7CglNVl9VOCBib2FyZFJldjsKCU1WX1UzMiByZXNlcnZlZDE7CglNVl9VMzIgcmVzZXJ2ZWQyOwp9IEJPQVJEX0RBVEE7Cgp0eXBlZGVmIGVudW0gX2RldkJvYXJkTXBwR3JvdXBDbGFzcyB7CglNVl9CT0FSRF9NUFBfR1JPVVBfMSwKCU1WX0JPQVJEX01QUF9HUk9VUF8yLAoJTVZfQk9BUkRfTVBQX0dST1VQXzMsCglNVl9CT0FSRF9NQVhfTVBQX0dST1VQCn0gTVZfQk9BUkRfTVBQX0dST1VQX0NMQVNTOwoKdHlwZWRlZiBlbnVtIF9kZXZCb2FyZE1wcFR5cGVDbGFzcyB7CglNVl9CT0FSRF9BVVRPLAoJTVZfQk9BUkRfVERNXzJDSCwKCU1WX0JPQVJEX1RETV8zMkNILAoJTVZfQk9BUkRfR0UwLAoJTVZfQk9BUkRfR0UxLAoJTVZfQk9BUkRfU1dfUDUsCglNVl9CT0FSRF9TV19QNiwKCU1WX0JPQVJEX09USEVSCn0gTVZfQk9BUkRfTVBQX1RZUEVfQ0xBU1M7CgojaWZkZWYgTVZfVERNXzJDSEFOTkVMUwojZGVmaW5lIE1WX0JPQVJEX1RETSAJTVZfQk9BUkRfVERNXzJDSAojZWxzZQojZGVmaW5lIE1WX0JPQVJEX1RETQlNVl9CT0FSRF9URE1fMzJDSAojZW5kaWYKCnR5cGVkZWYgZW51bSB7CglNVl9CT0FSRF9NT0RVTEVfVFNfSUQgPSAweDAwMDAxLAoJTVZfQk9BUkRfTU9EVUxFX1FTR01JSV9JRCA9IDB4MDAwMDIsCglNVl9CT0FSRF9NT0RVTEVfU0dNSUlfSUQgPSAweDAwMDA0LAoJTVZfQk9BUkRfTU9EVUxFX0dFX1NGUF9JRCA9IDB4MDAwMDgsCglNVl9CT0FSRF9NT0RVTEVfUkdNSUlBX0lEID0gMHgwMDAxMCwKCU1WX0JPQVJEX01PRFVMRV9SR01JSUJfSUQgPSAweDAwMDIwLAoJTVZfQk9BUkRfTU9EVUxFX01JSUFfSUQgPSAweDAwMDQwLAoJTVZfQk9BUkRfTU9EVUxFX01JSUJfSUQgPSAweDAwMDgwLAoJTVZfQk9BUkRfTU9EVUxFX1RETV8xX0lEID0gMHgwMDEwMCwKCU1WX0JPQVJEX01PRFVMRV9URE1fMl9JRCA9IDB4MDAyMDAsCglNVl9CT0FSRF9NT0RVTEVfVERNXzNfSUQgPSAweDAwNDAwLAoJTVZfQk9BUkRfTU9EVUxFX1RETV80X0lEID0gMHgwMDgwMCwKCU1WX0JPQVJEX01PRFVMRV9HUE9OX0lEID0gMHgwMTAwMCwKCU1WX0JPQVJEX01PRFVMRV9FUE9OX0lEID0gMHgwMjAwMCwKCU1WX0JPQVJEX01PRFVMRV80RkVfUEhZX0lEID0gMHgwNDAwMCwKCU1WX0JPQVJEX01PRFVMRV9GRV9HRV9QSFlfSUQgPSAweDA4MDAwLAoJTVZfQk9BUkRfTU9EVUxFX1NBVEFfSUQgPSAweDEwMDAwLAoJTVZfQk9BUkRfTU9EVUxFX1NESU9fSUQgPSAweDIwMDAwLAoJTVZfQk9BUkRfTU9EVUxFX09USEVSX0lEID0gMHg4MDAwMAp9IE1WX0JPQVJEX01PRFVMRV9JRF9DTEFTUzsKCnR5cGVkZWYgc3RydWN0IF9ib2FyZE1wcFR5cGVJbmZvIHsKCU1WX0JPQVJEX01QUF9UWVBFX0NMQVNTIGJvYXJkTXBwVGRtOwoKCS8qIEV0aGVybmV0IC8gU2F0YSBjb21wbGV4ICAgICAgICAgICAgICAgICAgICAgICovCgkvKiBBIGJpdG1hc2sgb2YgTVZfRVRIX1NBVEFfQ09NUExFWF9PUFRJT05TICAgICAqLwoJTVZfVTMyIGV0aFNhdGFDb21wbGV4T3B0OwoJTVZfVTMyIGV0aFBvcnRzTW9kZTsJLyogYml0bWFzayBvZiBNVl9FVEhfUE9SVF9NT0RFICovCn0gTVZfQk9BUkRfTVBQX1RZUEVfSU5GTzsKCnR5cGVkZWYgZW51bSBfZGV2Qm9hcmRDbGFzcyB7CglCT0FSRF9ERVZfTk9SX0ZMQVNILAoJQk9BUkRfREVWX05BTkRfRkxBU0gsCglCT0FSRF9ERVZfU0VWRU5fU0VHLAoJQk9BUkRfREVWX0ZQR0EsCglCT0FSRF9ERVZfU1JBTSwKCUJPQVJEX0RFVl9TUElfRkxBU0gsCglCT0FSRF9ERVZfT1RIRVIsCn0gTVZfQk9BUkRfREVWX0NMQVNTOwoKdHlwZWRlZiBlbnVtIF9kZXZUd3NpQm9hcmRDbGFzcyB7CglCT0FSRF9UV1NJX1JUQywKCUJPQVJEX0RFVl9UV1NJX0VYUCwKCUJPQVJEX0RFVl9UV1NJX1NBVFIsCglCT0FSRF9UV1NJX01VWCwKCUJPQVJEX1RXU0lfQVVESU9fREVDLAoJQk9BUkRfVFdTSV9PVEhFUgp9IE1WX0JPQVJEX1RXU0lfQ0xBU1M7Cgp0eXBlZGVmIGVudW0gX2RldkdwcEJvYXJkQ2xhc3MgewoJQk9BUkRfR1BQX1JUQywKCUJPQVJEX0dQUF9NVl9TV0lUQ0gsCglCT0FSRF9HUFBfVVNCX1ZCVVMsCglCT0FSRF9HUFBfVVNCX1ZCVVNfRU4sCglCT0FSRF9HUFBfVVNCX09DLAoJQk9BUkRfR1BQX1VTQl9IT1NUX0RFVklDRSwKCUJPQVJEX0dQUF9SRUZfQ0xDSywKCUJPQVJEX0dQUF9WT0lQX1NMSUMsCglCT0FSRF9HUFBfTElGRUxJTkUsCglCT0FSRF9HUFBfQlVUVE9OLAoJQk9BUkRfR1BQX1RTX0JVVFRPTl9DLAoJQk9BUkRfR1BQX1RTX0JVVFRPTl9VLAoJQk9BUkRfR1BQX1RTX0JVVFRPTl9ELAoJQk9BUkRfR1BQX1RTX0JVVFRPTl9MLAoJQk9BUkRfR1BQX1RTX0JVVFRPTl9SLAoJQk9BUkRfR1BQX1BPV0VSX0JVVFRPTiwKCUJPQVJEX0dQUF9SRVNUT1JfQlVUVE9OLAoJQk9BUkRfR1BQX1dQU19CVVRUT04sCglCT0FSRF9HUFBfSEREMF9QT1dFUiwKCUJPQVJEX0dQUF9IREQxX1BPV0VSLAoJQk9BUkRfR1BQX0ZBTl9QT1dFUiwKCUJPQVJEX0dQUF9SRVNFVCwKCUJPQVJEX0dQUF9QT1dFUl9PTl9MRUQsCglCT0FSRF9HUFBfSEREX1BPV0VSLAoJQk9BUkRfR1BQX1NESU9fUE9XRVIsCglCT0FSRF9HUFBfU0RJT19ERVRFQ1QsCglCT0FSRF9HUFBfU0RJT19XUCwKCUJPQVJEX0dQUF9TV0lUQ0hfUEhZX0lOVCwKCUJPQVJEX0dQUF9UU1VfRElSQ1RJT04sCglCT0FSRF9HUFBfUEVYX1JFU0VULAoJQk9BUkRfR1BQX0NPTkYsCglCT0FSRF9HUFBfUE9OX1hWUl9UWCwKCUJPQVJEX0dQUF9TWVNfTEVELAoJQk9BUkRfR1BQX1BPTl9MRUQsCglCT0FSRF9HUFBfTEVELAoJQk9BUkRfR1BQX09USEVSCn0gTVZfQk9BUkRfR1BQX0NMQVNTOwoKdHlwZWRlZiBzdHJ1Y3QgX2RldkNzSW5mbyB7CglNVl9VOCBkZXZpY2VDUzsKCU1WX1UzMiBwYXJhbXM7CglNVl9VMzIgZGV2Q2xhc3M7CS8qIE1WX0JPQVJEX0RFVl9DTEFTUyAqLwoJTVZfVTggZGV2V2lkdGg7Cn0gTVZfREVWX0NTX0lORk87Cgp0eXBlZGVmIHN0cnVjdCBfYm9hcmRTd2l0Y2hJbmZvIHsKCU1WXzMyIHN3aXRjaElycTsKCU1WXzMyIHN3aXRjaFBvcnRbQk9BUkRfRVRIX1NXSVRDSF9QT1JUX05VTV07CglNVl8zMiBjcHVQb3J0OwoJTVZfMzIgY29ubmVjdGVkUG9ydFtNVl9FVEhfTUFYX1BPUlRTXTsKCU1WXzMyIHNtaVNjYW5Nb2RlOwoJTVZfMzIgcXVhZFBoeUFkZHI7CglNVl9VMzIgZm9yY2VMaW5rTWFzazsgLyogQml0bWFzayBvZiBzd2l0Y2ggcG9ydHMgdG8gaGF2ZSBmb3JjZSBsaW5rICgxR2JwcykgKi8KfSBNVl9CT0FSRF9TV0lUQ0hfSU5GTzsKCnR5cGVkZWYgc3RydWN0IF9ib2FyZExlZEluZm8gewoJTVZfVTggYWN0aXZlTGVkc051bWJlcjsKCU1WX1U4IGxlZHNQb2xhcml0eTsJLyogJzAnIG9yICcxJyB0byB0dXJuIG9uIGxlZCAqLwoJTVZfVTggKmdwcFBpbk51bTsJLyogUG9pbnRlciB0byBHUFAgdmFsdWVzICovCn0gTVZfQk9BUkRfTEVEX0lORk87Cgp0eXBlZGVmIHN0cnVjdCBfYm9hcmRHcHBJbmZvIHsKCU1WX0JPQVJEX0dQUF9DTEFTUyBkZXZDbGFzczsKCU1WX1U4IGdwcFBpbk51bTsKCU1WX1U4IGFjdGl2ZUxvdzsKCWNvbnN0IGNoYXIgKm5hbWU7Cn0gTVZfQk9BUkRfR1BQX0lORk87Cgp0eXBlZGVmIHN0cnVjdCBfYm9hcmRUd3NpSW5mbyB7CglNVl9CT0FSRF9UV1NJX0NMQVNTIGRldkNsYXNzOwoJTVZfVTggdHdzaURldkFkZHI7CglNVl9VOCB0d3NpRGV2QWRkclR5cGU7Cn0gTVZfQk9BUkRfVFdTSV9JTkZPOwoKdHlwZWRlZiBlbnVtIF9ib2FyZE1hY1NwZWVkIHsKCUJPQVJEX01BQ19TUEVFRF8xME0sCglCT0FSRF9NQUNfU1BFRURfMTAwTSwKCUJPQVJEX01BQ19TUEVFRF8xMDAwTSwKCUJPQVJEX01BQ19TUEVFRF9BVVRPLAp9IE1WX0JPQVJEX01BQ19TUEVFRDsKCnR5cGVkZWYgc3RydWN0IF9ib2FyZE1hY0luZm8gewoJTVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQ7CglNVl9VOCBib2FyZEV0aFNtaUFkZHI7Cn0gTVZfQk9BUkRfTUFDX0lORk87Cgp0eXBlZGVmIHN0cnVjdCBfYm9hcmRNcHBJbmZvIHsKCU1WX1UzMiBtcHBHcm91cFtNVl9CT0FSRF9NQVhfTVBQXTsKfSBNVl9CT0FSRF9NUFBfSU5GTzsKCnR5cGVkZWYgZW51bSB7CglCT0FSRF9FUE9OX0NPTkZJRywKCUJPQVJEX0dQT05fQ09ORklHLAoJQk9BUkRfUE9OX05PTkUsCglCT0FSRF9QT05fQVVUTwp9IE1WX0JPQVJEX1BPTl9DT05GSUc7Cgp0eXBlZGVmIHN0cnVjdCB7CglNVl9VOCBzcGlDczsKfSBNVl9CT0FSRF9URE1fSU5GTzsKCnR5cGVkZWYgc3RydWN0IHsKCU1WX1U4IHNwaUlkOwp9IE1WX0JPQVJEX1RETV9TUElfSU5GTzsKCnR5cGVkZWYgZW51bSB7CglCT0FSRF9URE1fU0xJQ184ODAgPSAwLAoJQk9BUkRfVERNX1NMSUNfNzkyLAoJQk9BUkRfVERNX1NMSUNfMzIxNSwKCUJPQVJEX1RETV9TTElDX09USEVSLAoJQk9BUkRfVERNX1NMSUNfQ09VTlQKfSBNVl9CT0FSRF9URE1fU0xJQ19UWVBFOwoKdHlwZWRlZiBzdHJ1Y3QgewoJTVZfVTMyCXJlZzsKCU1WX1UzMgltYXNrOwoJTVZfVTMyCXZhbDsKfSBNVl9CT0FSRF9TUEVDX0lOSVQ7Cgp0eXBlZGVmIHN0cnVjdCBfYm9hcmRJbmZvIHsKCWNoYXIgYm9hcmROYW1lW01WX0JPQVJEX05BTUVfTEVOXTsKCU1WX1ZPSUQgKCpwQm9hcmRFbnZJbml0KShzdHJ1Y3QgX2JvYXJkSW5mbyAqKTsKCU1WX1ZPSUQgKCpwQm9hcmRFZ2lnYVBoeUluaXQpKHN0cnVjdCBfYm9hcmRJbmZvICopOwoJTVZfVk9JRCAoKnBCb2FyZFByZUJvb3RPcykoc3RydWN0IF9ib2FyZEluZm8gKik7CglNVl9VOCBudW1Cb2FyZE1wcFR5cGVWYWx1ZTsKCU1WX0JPQVJEX01QUF9UWVBFX0lORk8gKnBCb2FyZE1wcFR5cGVWYWx1ZTsKCU1WX1U4IG51bUJvYXJkTXBwQ29uZmlnVmFsdWU7CglNVl9CT0FSRF9NUFBfSU5GTyAqcEJvYXJkTXBwQ29uZmlnVmFsdWU7CglNVl9VMzIgaW50c0dwcE1hc2tMb3c7CglNVl9VMzIgaW50c0dwcE1hc2tNaWQ7CglNVl9VMzIgaW50c0dwcE1hc2tIaWdoOwoJTVZfVTggbnVtQm9hcmREZXZpY2VJZjsKCU1WX0RFVl9DU19JTkZPICpwRGV2Q3NJbmZvOwoJTVZfVTggbnVtQm9hcmRUd3NpRGV2OwoJTVZfQk9BUkRfVFdTSV9JTkZPICpwQm9hcmRUd3NpRGV2OwoJTVZfVTggbnVtQm9hcmRNYWNJbmZvOwoJTVZfQk9BUkRfTUFDX0lORk8gKnBCb2FyZE1hY0luZm87CglNVl9VOCBudW1Cb2FyZEdwcEluZm87CglNVl9CT0FSRF9HUFBfSU5GTyAqcEJvYXJkR3BwSW5mbzsKCU1WX1U4IGFjdGl2ZUxlZHNOdW1iZXI7CglNVl9VOCAqcExlZEdwcFBpbjsKCU1WX1U4IGxlZHNQb2xhcml0eTsJLyogJzAnIG9yICcxJyB0byB0dXJuIG9uIGxlZCAqLwoKCS8qIEdQUCB2YWx1ZXMgKi8KCU1WX1UzMiBncHBPdXRFblZhbExvdzsKCU1WX1UzMiBncHBPdXRFblZhbE1pZDsKCU1WX1UzMiBncHBPdXRFblZhbEhpZ2g7CglNVl9VMzIgZ3BwT3V0VmFsTG93OwoJTVZfVTMyIGdwcE91dFZhbE1pZDsKCU1WX1UzMiBncHBPdXRWYWxIaWdoOwoJTVZfVTMyIGdwcFBvbGFyaXR5VmFsTG93OwoJTVZfVTMyIGdwcFBvbGFyaXR5VmFsTWlkOwoJTVZfVTMyIGdwcFBvbGFyaXR5VmFsSGlnaDsKCgkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLwoJTVZfQk9BUkRfU1dJVENIX0lORk8gKnBTd2l0Y2hJbmZvOwoJTVZfVTMyIHN3aXRjaEluZm9OdW07CgoJLyogUE9OIGNvbmZpZ3VyYXRpb24uICovCglNVl9CT0FSRF9QT05fQ09ORklHIHBvbkNvbmZpZ1ZhbHVlOwoKCS8qIFRETSBjb25maWd1cmF0aW9uICovCgkvKiBXZSBob2xkIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gYXJyYXkgZm9yIGVhY2ggcG9zc2libGUgc2xpYyB0aGF0CgkgKiogY2FuIGJlIGNvbm5lY3RlZCB0byBib2FyZC4KCSAqKiBXaGVuIG1vZHVsZXMgYXJlIHNjYW5uZWQsIHRoZW4gd2Ugc2VsZWN0IHRoZSBpbmRleCBvZiB0aGUgcmVsZXZhbnQKCSAqKiBzbGljJ3MgaW5mb3JtYXRpb24gYXJyYXkuCgkgKiogRm9yIFJEIGFuZCBDdXN0b21lcnMgYm9hcmRzIHdlIG9ubHkgbmVlZCB0byBpbml0aWFsaXplIGEgc2luZ2xlCgkgKiogZW50cnkgb2YgdGhlIGFycmF5cyBiZWxvdywgYW5kIHNldCB0aGUgYm9hcmRUZG1JbmZvSW5kZXggdG8gMC4KCSAqLwoJTVZfVTggbnVtQm9hcmRUZG1JbmZvW0JPQVJEX1RETV9TTElDX0NPVU5UXTsKCU1WX0JPQVJEX1RETV9JTkZPICpwQm9hcmRUZG1JbnQyQ3NJbmZvW0JPQVJEX1RETV9TTElDX0NPVU5UXTsKCU1WXzggYm9hcmRUZG1JbmZvSW5kZXg7CgoJLyogQm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uIFBlcmZvcm1lZCBiZWZvcmUgaW5pdGlhbGl6aW5nIHRoZQoJKiogU29DLiAqLwoJTVZfQk9BUkRfU1BFQ19JTklUCSpwQm9hcmRTcGVjSW5pdDsKCgkvKiBEZWVwLUlkbGUgcG93ZXIgdXAgZGVsYXkgKi8KCU1WX1UzMiBkZWVwSWRsZVB3clVwRGVsYXk7CgoJLyogTkFORCBpbml0IHBhcmFtcyAqLwoJTVZfQk9PTCBuYW5kRmxhc2hQYXJhbXNWYWxpZDsKCU1WX1UzMiBuYW5kRmxhc2hSZWFkUGFyYW1zOwoJTVZfVTMyIG5hbmRGbGFzaFdyaXRlUGFyYW1zOwoJTVZfVTMyIG5hbmRGbGFzaENvbnRyb2w7CglNVl9CT0FSRF9URE1fU1BJX0lORk8gKnBCb2FyZFRkbVNwaUluZm87CgoJLyogSW5kaWNhdGVzIGlmIGF1dG8tZGV0ZWN0aW9uIG9mIG1vZHVsZXMgaXMgZW5hYmxlZCBvbiB0aGlzIGJvYXJkLiAqLwoJLyogU2V0IHRvIE1WX0ZBTFNFIGZvciBhbnkgYm9hcmQgdGhhdCBpcyBub3QgYSBEQi4gKi8KCU1WX0JPT0wJbW9kdWxlQXV0b0RldGVjdDsKfSBNVl9CT0FSRF9JTkZPOwoKLyogRm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgd2l0aCBMZWdhY3kgbW9kZSAqLwojZGVmaW5lIG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZChwb3J0KSAgKG12Qm9hcmRTd2l0Y2hDb25uZWN0ZWRQb3J0R2V0KHBvcnQpICE9IC0xKQojZGVmaW5lIG12Qm9hcmRMaW5rU3RhdHVzSXJxR2V0KHBvcnQpICAgbXZCb2FyZFN3aXRjaElycUdldCgpCgpNVl9WT0lEIG12Qm9hcmRFbnZJbml0KE1WX1ZPSUQpOwpNVl9VMTYgbXZCb2FyZE1vZGVsR2V0KE1WX1ZPSUQpOwpNVl9VMTYgbXZCb2FyZFJldkdldChNVl9WT0lEKTsKTVZfU1RBVFVTIG12Qm9hcmROYW1lR2V0KGNoYXIgKnBOYW1lQnVmZik7Ck1WX0JPQVJEX1NQRUNfSU5JVCAqbXZCb2FyZFNwZWNJbml0R2V0KE1WX1ZPSUQpOwpNVl9VMzIgbXZCb2FyZFB3clVwRGVsYXlHZXQoTVZfVk9JRCk7Ck1WX0JPT0wgbXZCb2FyZElzUG9ydEluU2dtaWkoTVZfVTMyIGV0aFBvcnROdW0pOwpNVl9CT09MIG12Qm9hcmRJc1BvcnRJblJnbWlpKE1WX1UzMiBldGhQb3J0TnVtKTsKTVZfVTMyIG12Qm9hcmRFdGhQb3J0c01vZGVHZXQodm9pZCk7Ck1WXzMyIG12Qm9hcmRQaHlBZGRyR2V0KE1WX1UzMiBldGhQb3J0TnVtKTsKTVZfU1RBVFVTIG12Qm9hcmRQaHlBZGRyU2V0KE1WX1UzMiBldGhQb3J0TnVtLCBNVl8zMiBwaHlBZGRyKTsKCk1WX0JPT0wgbXZCb2FyZFN3aXRjaFNuZ2xDaGlwQWRkTW9kZUdldChNVl9WT0lEKTsKTVZfU1RBVFVTIG12Qm9hcmRTd2l0Y2hTbmdsQ2hpcEFkZE1vZGVTZXQoTVZfQk9PTCBlbmFibGUpOwpNVl8zMiBtdkJvYXJkU3dpdGNoSXJxR2V0KE1WX1ZPSUQpOwpNVl8zMiBtdkJvYXJkU3dpdGNoQ29ubmVjdGVkUG9ydEdldChNVl9VMzIgZXRoUG9ydE51bSk7Ci8qIE1hcCBmcm9udCBwYW5lbCBjb25uZWN0b3IgbnVtYmVyIHRvIHN3aXRjaCBwb3J0IG51bWJlciAqLwpNVl8zMiBtdkJvYXJkU3dpdGNoUG9ydEdldChNVl9VMzIgc3dpdGNoSWR4LCBNVl9VMzIgYm9hcmRQb3J0TnVtKTsKTVZfU1RBVFVTIG12Qm9hcmRTd2l0Y2hJbmZvVXBkYXRlKE1WX1ZPSUQpOwovKiBNYXAgZnJvbnQgcGFuZWwgY29ubmVjdG9yIG51bWJlciB0byBzd2l0Y2ggcG9ydCBudW1iZXIgKi8KTVZfMzIgbXZCb2FyZFN3aXRjaFBvcnRNYXAoTVZfVTMyIHN3aXRjaElkeCwgTVZfVTMyIHN3aXRjaFBvcnROdW0pOwpNVl8zMiBtdkJvYXJkU3dpdGNoQ3B1UG9ydEdldChNVl9VMzIgc3dpdGNoSWR4KTsKTVZfVTMyIG12Qm9hcmRTd2l0Y2hQb3J0Rm9yY2VMaW5rR2V0KE1WX1UzMiBzd2l0Y2hJZHgpOwpNVl8zMiBtdkJvYXJkU21pU2Nhbk1vZGVHZXQoTVZfVTMyIHN3aXRjaElkeCk7Ck1WXzMyIG12Qm9hcmRRdWFkUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KTsKTVZfMzIgbXZCb2FyZFN3aXRjaE51bVBvcnRzR2V0KE1WX1ZPSUQpOwpNVl9CT09MIG12Qm9hcmRJc1FzZ21paU1vZHVsZUNvbm5lY3RlZChNVl9WT0lEKTsKTVZfMzIgbXZCb2FyZEdlUGh5U3dpdGNoUG9ydEdldChNVl9WT0lEKTsKTVZfMzIgbXZCb2FyZFJnbWlpQVN3aXRjaFBvcnRHZXQoTVZfVk9JRCk7Ck1WX0JPT0wgbXZCb2FyZFBoeVNwZWNJbml0R2V0KE1WX1UzMiAqcmVnT2ZmLCBNVl9VMzIgKmRhdGEpOwpNVl9VMzIgbXZCb2FyZFRjbGtHZXQoTVZfVk9JRCk7Ck1WX1UzMiBtdkJvYXJkU3lzQ2xrR2V0KE1WX1ZPSUQpOwpNVl9VMzIgbXZCb2FyZERlYnVnTGVkTnVtR2V0KE1WX1UzMiBib2FyZElkKTsKTVZfVk9JRCBtdkJvYXJkRGVidWdMZWQoTVZfVTMyIGhleE51bSk7Ck1WXzMyIG12Qm9hckdwaW9QaW5OdW1HZXQoTVZfQk9BUkRfR1BQX0NMQVNTIGNsYXNzLCBNVl9VMzIgaW5kZXgpOwpNVl9TVEFUVVMgbXZCb2FyZEdwcEluZm9HZXQoTVZfQk9BUkRfR1BQX0NMQVNTIGNsYXNzLCBNVl9VMzIgaW5kZXgsIE1WX1U4ICpwaW5OdW0sIE1WX1U4ICpwb2xhcml0eSk7Ck1WX1ZPSUQgbXZCb2FyZFJlc2V0KE1WX1ZPSUQpOwpNVl8zMiBtdkJvYXJkUmVzZXRHcGlvUGluR2V0KE1WX1ZPSUQpOwpNVl8zMiBtdkJvYXJkU0RJT0dwaW9QaW5HZXQoTVZfQk9BUkRfR1BQX0NMQVNTIHR5cGUpOwpNVl8zMiBtdkJvYXJkVVNCVmJ1c0dwaW9QaW5HZXQoTVZfMzIgZGV2SWQpOwpNVl8zMiBtdkJvYXJkVVNCVmJ1c0VuR3Bpb1BpbkdldChNVl8zMiBkZXZJZCk7Ck1WX1UzMiBtdkJvYXJkR3Bpb0ludE1hc2tHZXQoTVZfVTMyIGdwcEdycCk7Ck1WXzMyIG12Qm9hcmRNcHBHZXQoTVZfVTMyIG1wcEdyb3VwTnVtKTsKTVZfVTMyIG12Qm9hcmRFdGhDb21wbGV4Q29uZmlnR2V0KE1WX1ZPSUQpOwpNVl9WT0lEIG12Qm9hcmRFdGhDb21wbGV4Q29uZmlnU2V0KE1WX1UzMiBldGhDb25maWcpOwpNVl9VMzIgbXZCb2FyZFBvbkNvbmZpZ0dldChNVl9WT0lEKTsKTVZfVk9JRCBtdkJvYXJkUG9uQ29uZmlnU2V0KE1WX1UzMiBwb25Db25maWcpOwpNVl9VMzIgbXZCb2FyZEdwcENvbmZpZ0dldChNVl9WT0lEKTsKTVZfVk9JRCBtdkJvYXJkTW9kdWxlQ29uZmlnU2V0KE1WX1UzMiBtb2RDb25maWcpOwpNVl9WT0lEIG12Qm9hcmRNb2R1bGVDb25maWdHZXQoTVZfVTMyICptb2RDb25maWcpOwpNVl9WT0lEIG12Qm9hcmRNcHBJZFVwZGF0ZShNVl9WT0lEKTsKTVZfMzIgbXZCb2FyZFRkbVNwaU1vZGVHZXQoTVZfVk9JRCk7Ck1WX1U4IG12Qm9hcmRUZG1EZXZpY2VzQ291bnRHZXQoTVZfVk9JRCk7Ck1WX1U4IG12Qm9hcmRUZG1TcGlDc0dldChNVl9VOCBkZXZJZCk7Ck1WX1U4IG12Qm9hcmRUZG1TcGlJZEdldChNVl9WT0lEKTsKTVZfVk9JRCBtdkJvYXJkTXBwTW9kdWxlVHlwZVByaW50KE1WX1ZPSUQpOwpNVl9CT09MIG12Qm9hcmRJc0diRVBvcnRDb25uZWN0ZWQoTVZfVTMyIGV0aFBvcnROdW0pOwpNVl8zMiBtdkJvYXJkR2V0RGV2aWNlc051bWJlcihNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwpNVl8zMiBtdkJvYXJkR2V0RGV2aWNlQmFzZUFkZHIoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwpNVl8zMiBtdkJvYXJkR2V0RGV2aWNlQnVzV2lkdGgoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwpNVl8zMiBtdkJvYXJkR2V0RGV2aWNlV2lkdGgoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOwpNVl8zMiBtdkJvYXJkR2V0RGV2aWNlV2luU2l6ZShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcyk7Ck1WX1UzMiBib2FyZEdldERldkNTTnVtKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzKTsKTVZfVTggbXZCb2FyZFR3c2lBZGRyVHlwZUdldChNVl9CT0FSRF9UV1NJX0NMQVNTIHR3c2lDbGFzcywgTVZfVTMyIGluZGV4KTsKTVZfVTggbXZCb2FyZFR3c2lBZGRyR2V0KE1WX0JPQVJEX1RXU0lfQ0xBU1MgdHdzaUNsYXNzLCBNVl9VMzIgaW5kZXgpOwpNVl8zMiBtdkJvYXJkTmFuZFdpZHRoR2V0KE1WX1ZPSUQpOwpNVl9VMzIgbXZCb2FyZElkR2V0KE1WX1ZPSUQpOwpNVl9CT0FSRF9JTkZPICptdkJvYXJkSW5mb0dldChNVl9WT0lEKTsKCk1WX1U4IG12Qm9hcmRUd3NpU2F0UkdldChNVl9VOCBkZXZOdW0sIE1WX1U4IHJlZ051bSk7Ck1WX1NUQVRVUyBtdkJvYXJkVHdzaVNhdFJTZXQoTVZfVTggZGV2TnVtLCBNVl9VOCByZWdOdW0sIE1WX1U4IHJlZ1ZhbCk7Ck1WX1U4IG12Qm9hcmRGcmVxR2V0KE1WX1ZPSUQpOwpNVl9TVEFUVVMgbXZCb2FyZEZyZXFTZXQoTVZfVTggZnJlcVZhbCk7Ck1WX1U4IG12Qm9hcmRTU0NHR2V0KE1WX1ZPSUQpOwpNVl9TVEFUVVMgbXZCb2FyZFNTQ0dTZXQoTVZfVTggdmFsKTsKTVZfVTggbXZCb2FyZFRDbGtHZXQoTVZfVk9JRCk7Ck1WX1NUQVRVUyBtdkJvYXJkVENsa1NldChNVl9VOCB2YWwpOwpNVl9VOCBtdkJvYXJkUGV4Q2xrR2V0KE1WX1U4IHBleElmKTsKTVZfU1RBVFVTIG12Qm9hcmRQZXhDbGtTZXQoTVZfVTggcGV4SWYsIE1WX1U4IHZhbCk7Ck1WX1U4IG12Qm9hcmRTYVJMMkV4aXN0R2V0KE1WX1ZPSUQpOwpNVl9VOCBtdkJvYXJkU2FSTDJFeGlzdFNldChNVl9VOCB2YWwpOwpNVl9VOCBtdkJvYXJkUG9uR2V0KE1WX1ZPSUQpOwpNVl9TVEFUVVMgbXZCb2FyZFBvblNldChNVl9VOCB2YWwpOwoKTVZfU1RBVFVTIG12Qm9hcmRFdGhTYXRhTW9kdWxlc1NjYW4oTVZfVTMyICptb2R1bGVzLCBNVl9FVEhfQ09NUExFWF9JRl9TT1VSQ0VTICpldGhTcmNDZmcpOwpNVl9TVEFUVVMgbXZCb2FyZElzU2Rpb0VuYWJsZWQoTVZfVk9JRCk7Ck1WX1NUQVRVUyBtdkJvYXJkVGRtTW9kdWxlc1NjYW4oTVZfVk9JRCk7Ck1WX1NUQVRVUyBtdkJvYXJkUG9uTW9kdWxlc1NjYW4oTVZfVTMyICptb2R1bGVzKTsKTVZfU1RBVFVTIG12Qm9hcmRUd3NpTXV4Q2hhbm5lbFNldChNVl9VOCBtdXhDaE51bSk7Ck1WX1NUQVRVUyBtdkJvYXJkVHdzaVJlYWRCeXRlVGhydU11eChNVl9VOCBtdXhDaE51bSwgTVZfVTggY2hOdW0sIE1WX1RXU0lfU0xBVkUgKnBUd3NpU2xhdmUsIE1WX1U4ICpkYXRhKTsKTVZfQk9BUkRfTUFDX1NQRUVEIG12Qm9hcmRNYWNTcGVlZEdldChNVl9VMzIgZXRoUG9ydE51bSk7Ck1WX1NUQVRVUyBtdkJvYXJkTWFjU3BlZWRTZXQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX0JPQVJEX01BQ19TUEVFRCBzcGVlZCk7Ck1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZChNVl9VMzIgZXRoUG9ydE51bSk7Ck1WX0JPQVJEX01QUF9UWVBFX0NMQVNTIG12Qm9hcmRNcHBHcm91cFR5cGVHZXQoTVZfQk9BUkRfTVBQX0dST1VQX0NMQVNTIG1wcEdyb3VwQ2xhc3MpOwpNVl9CT09MIG12Qm9hcmRNb2R1bGVBdXRvRGV0ZWN0RW5hYmxlZCh2b2lkKTsKI2VuZGlmIC8qIF9fSU5DbXZCb2FyZEVudkxpYmggKi8K