LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyICBTYW0gTGFudGluZ2EKCiAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCgogICAgU2FtIExhbnRpbmdhCiAgICBzbG91a2VuQGxpYnNkbC5vcmcKKi8KI2luY2x1ZGUgIlNETF9jb25maWcuaCIKCi8qICAKICAgIE5vdGU6IFRoaXMgZmlsZSBoYXNuJ3QgYmVlbiBtb2RpZmllZCBzbyB0ZWNobmljYWxseSB3ZSBoYXZlIHRvIGtlZXAgdGhlIGRpc2NsYWltZXIgOi0oCiAgICAKICAgIENvcHlyaWdodDogIKkgQ29weXJpZ2h0IDIwMDIgQXBwbGUgQ29tcHV0ZXIsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAgICBEaXNjbGFpbWVyOiBJTVBPUlRBTlQ6ICBUaGlzIEFwcGxlIHNvZnR3YXJlIGlzIHN1cHBsaWVkIHRvIHlvdSBieSBBcHBsZSBDb21wdXRlciwgSW5jLgogICAgICAgICAgICAoIkFwcGxlIikgaW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgeW91cgogICAgICAgICAgICB1c2UsIGluc3RhbGxhdGlvbiwgbW9kaWZpY2F0aW9uIG9yIHJlZGlzdHJpYnV0aW9uIG9mIHRoaXMgQXBwbGUgc29mdHdhcmUKICAgICAgICAgICAgY29uc3RpdHV0ZXMgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcywKICAgICAgICAgICAgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciByZWRpc3RyaWJ1dGUgdGhpcyBBcHBsZSBzb2Z0d2FyZS4KCiAgICAgICAgICAgIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QKICAgICAgICAgICAgdG8gdGhlc2UgdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzCiAgICAgICAgICAgIGNvcHlyaWdodHMgaW4gdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsCiAgICAgICAgICAgIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgICAgICAgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZQogICAgICAgICAgICB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbgogICAgICAgICAgICB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YKICAgICAgICAgICAgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyBvciBsb2dvcyBvZgogICAgICAgICAgICBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoZQogICAgICAgICAgICBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiAgRXhjZXB0IGFzCiAgICAgICAgICAgIGV4cHJlc3NseSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLAogICAgICAgICAgICBhcmUgZ3JhbnRlZCBieSBBcHBsZSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdAogICAgICAgICAgICBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUKICAgICAgICAgICAgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KCiAgICAgICAgICAgIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8KICAgICAgICAgICAgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVECiAgICAgICAgICAgIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAgICAgICAgICAgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMgVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4KICAgICAgICAgICAgQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgoKICAgICAgICAgICAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwgT1IKICAgICAgICAgICAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQogICAgICAgICAgICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICAgICAgICAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLCBSRVBST0RVQ1RJT04sIE1PRElGSUNBVElPTiBBTkQvT1IgRElTVFJJQlVUSU9OCiAgICAgICAgICAgIE9GIFRIRSBBUFBMRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQgQU5EIFdIRVRIRVIgVU5ERVIgVEhFT1JZIE9GIENPTlRSQUNULCBUT1JUCiAgICAgICAgICAgIChJTkNMVURJTkcgTkVHTElHRU5DRSksIFNUUklDVCBMSUFCSUxJVFkgT1IgT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOCiAgICAgICAgICAgIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoqLwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBDQUd1YXJkLmNwCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBJbmNsdWRlcwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KKi8KI2luY2x1ZGUgIlNETF9zdGRpbmMuaCIKCi8qI2RlZmluZSBOREVCVUcgMSovCi8qCiNpbmNsdWRlIDxhc3NlcnQuaD4KKi8KI2RlZmluZSBhc3NlcnQoWCkKCgojaW5jbHVkZSAiU0RMT1NYQ0FHdWFyZC5oIgoKLyojd2FybmluZyAgICAgIE5lZWQgYSB0cnktYmFzZWQgTG9ja2VyIHRvbyovCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFNETE9TWENBR3VhcmQKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgpzdGF0aWMgaW50IFNETE9TWENBR3VhcmRfTG9jayhTRExPU1hDQUd1YXJkICpjYWcpCnsKICAgIGludCB0aGVBbnN3ZXIgPSAwOwogICAgCiAgICBpZihwdGhyZWFkX3NlbGYoKSAhPSBjYWctPm1Pd25lcikKICAgIHsKICAgICAgICBPU1N0YXR1cyB0aGVFcnJvciA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmY2FnLT5tTXV0ZXgpOwogICAgICAgICh2b2lkKXRoZUVycm9yOwogICAgICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKICAgICAgICBjYWctPm1Pd25lciA9IHB0aHJlYWRfc2VsZigpOwogICAgICAgIHRoZUFuc3dlciA9IDE7CiAgICB9CgogICAgcmV0dXJuIHRoZUFuc3dlcjsKfQoKc3RhdGljIHZvaWQgICAgU0RMT1NYQ0FHdWFyZF9VbmxvY2soU0RMT1NYQ0FHdWFyZCAqY2FnKQp7CiAgICBPU1N0YXR1cyB0aGVFcnJvcjsKICAgIGFzc2VydChwdGhyZWFkX3NlbGYoKSA9PSBjYWctPm1Pd25lcik7CgogICAgY2FnLT5tT3duZXIgPSAwOwogICAgdGhlRXJyb3IgPSBwdGhyZWFkX211dGV4X3VubG9jaygmY2FnLT5tTXV0ZXgpOwogICAgKHZvaWQpdGhlRXJyb3I7CiAgICBhc3NlcnQodGhlRXJyb3IgPT0gMCk7Cn0KCnN0YXRpYyBpbnQgU0RMT1NYQ0FHdWFyZF9UcnkgKFNETE9TWENBR3VhcmQgKmNhZywgaW50ICpvdXRXYXNMb2NrZWQpCnsKICAgIGludCB0aGVBbnN3ZXIgPSAwOwogICAgKm91dFdhc0xvY2tlZCA9IDA7CiAgICAKICAgIGlmIChwdGhyZWFkX3NlbGYoKSA9PSBjYWctPm1Pd25lcikgewogICAgICAgIHRoZUFuc3dlciA9IDE7CiAgICAgICAgKm91dFdhc0xvY2tlZCA9IDA7CiAgICB9IGVsc2UgewogICAgICAgIE9TU3RhdHVzIHRoZUVycm9yID0gcHRocmVhZF9tdXRleF90cnlsb2NrKCZjYWctPm1NdXRleCk7CiAgICAgICAgaWYgKHRoZUVycm9yID09IDApIHsKICAgICAgICAgICAgY2FnLT5tT3duZXIgPSBwdGhyZWFkX3NlbGYoKTsKICAgICAgICAgICAgdGhlQW5zd2VyID0gMTsKICAgICAgICAgICAgKm91dFdhc0xvY2tlZCA9IDE7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gdGhlQW5zd2VyOwp9CgpzdGF0aWMgdm9pZCAgICBTRExPU1hDQUd1YXJkX1dhaXQoU0RMT1NYQ0FHdWFyZCAqY2FnKQp7CiAgICBPU1N0YXR1cyB0aGVFcnJvcjsKICAgIGFzc2VydChwdGhyZWFkX3NlbGYoKSA9PSBjYWctPm1Pd25lcik7CgogICAgY2FnLT5tT3duZXIgPSAwOwoKICAgIHRoZUVycm9yID0gcHRocmVhZF9jb25kX3dhaXQoJmNhZy0+bUNvbmRWYXIsICZjYWctPm1NdXRleCk7CiAgICAodm9pZCl0aGVFcnJvcjsKICAgIGFzc2VydCh0aGVFcnJvciA9PSAwKTsKICAgIGNhZy0+bU93bmVyID0gcHRocmVhZF9zZWxmKCk7Cn0KCnN0YXRpYyB2b2lkICAgIFNETE9TWENBR3VhcmRfTm90aWZ5KFNETE9TWENBR3VhcmQgKmNhZykKewogICAgT1NTdGF0dXMgdGhlRXJyb3IgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjYWctPm1Db25kVmFyKTsKICAgICh2b2lkKXRoZUVycm9yOwogICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwp9CgoKU0RMT1NYQ0FHdWFyZCAqbmV3X1NETE9TWENBR3VhcmQodm9pZCkKewogICAgT1NTdGF0dXMgdGhlRXJyb3I7CiAgICBTRExPU1hDQUd1YXJkICpjYWcgPSAoU0RMT1NYQ0FHdWFyZCAqKSBTRExfbWFsbG9jKHNpemVvZiAoU0RMT1NYQ0FHdWFyZCkpOwogICAgaWYgKGNhZyA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwogICAgU0RMX21lbXNldChjYWcsICdcMCcsIHNpemVvZiAoKmNhZykpOwoKICAgICNkZWZpbmUgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKG0pIGNhZy0+bSA9IFNETE9TWENBR3VhcmRfIyNtCiAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoTG9jayk7CiAgICBTRVRfU0RMT1NYQ0FHVUFSRF9NRVRIT0QoVW5sb2NrKTsKICAgIFNFVF9TRExPU1hDQUdVQVJEX01FVEhPRChUcnkpOwogICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKFdhaXQpOwogICAgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9EKE5vdGlmeSk7CiAgICAjdW5kZWYgU0VUX1NETE9TWENBR1VBUkRfTUVUSE9ECgogICAgdGhlRXJyb3IgPSBwdGhyZWFkX211dGV4X2luaXQoJmNhZy0+bU11dGV4LCBOVUxMKTsKICAgICh2b2lkKXRoZUVycm9yOwogICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwogICAgCiAgICB0aGVFcnJvciA9IHB0aHJlYWRfY29uZF9pbml0KCZjYWctPm1Db25kVmFyLCBOVUxMKTsKICAgICh2b2lkKXRoZUVycm9yOwogICAgYXNzZXJ0KHRoZUVycm9yID09IDApOwogICAgCiAgICBjYWctPm1Pd25lciA9IDA7CiAgICByZXR1cm4gY2FnOwp9Cgp2b2lkIGRlbGV0ZV9TRExPU1hDQUd1YXJkKFNETE9TWENBR3VhcmQgKmNhZykKewogICAgaWYgKGNhZyAhPSBOVUxMKQogICAgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY2FnLT5tTXV0ZXgpOwogICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjYWctPm1Db25kVmFyKTsKICAgICAgICBTRExfZnJlZShjYWcpOwogICAgfQp9Cgo=