ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA0MDQ3MTdmLi40NDk4MzQ1IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDEzICsxLDEwMyBAQAogCiAJCUNoYW5nZUxvZyBmaWxlIGZvciB6bGliCiAKK0NoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQorLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQorLSByZXR1cm4gZXJyb3IgZm9yIGd6c2VlayB0byBuZWdhdGl2ZSBhYnNvbHV0ZSBwb3NpdGlvbgorLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQorLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQorLSBnZXRfY3JjX3RhYmxlIGFuZCBpbmZsYXRlU3luY1BvaW50IGFyZSBFWFBPUlRlZCAoR2lsbGVzIFZvbGxhbnQpCistIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQorLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykKKy0gZm9yIGNvbnRyaWIvdW50Z3osIGZpeCBtYWtlZGlyKCkgYW5kIGltcHJvdmUgTWFrZWZpbGUKKworLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMKKy0gYWxsb2NhdGUgZXh0cmEgYnVmZmVyIGZvciBzZWVrcyBvbmx5IGlmIGd6c2VlayBpcyBhY3R1YWxseSBjYWxsZWQKKy0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkKKy0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaAorLSBmaXggbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gbnQvemxpYi5kbnQgYW5kIG1kc29zL3psaWIuZGVmCisKK0NoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQorLSBhZGQgZnVuY3Rpb25zIGd6cHJpbnRmLCBnenB1dGMsIGd6Z2V0YywgZ3p0ZWxsLCBnemVvZiwgZ3pzZWVrLCBnenJld2luZCBhbmQKKyAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkKKy0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJpbmcgb25seSB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAgKHRoYW5rcyB0bworICBBbmR5IEJ1Y2tsZXIgZm9yIGZpbmRpbmcgdGhpcyBvbmUpLgorLSBJbiBtaW5pZ3ppcCwgcGFzcyB0cmFuc3BhcmVudGx5IGFsc28gdGhlIGZpcnN0IGJ5dGUgZm9yIC5aIGZpbGVzLgorLSByZXR1cm4gWl9CVUZfRVJST1IgaW5zdGVhZCBvZiBaX09LIGlmIG91dHB1dCBidWZmZXIgZnVsbCBpbiB1bmNvbXByZXNzKCkKKy0gY2hlY2sgWl9GSU5JU0ggaW4gaW5mbGF0ZSAodGhhbmtzIHRvIE1hcmMgU2NobHVwZXIpCistIEltcGxlbWVudCBkZWZsYXRlQ29weSAodGhhbmtzIHRvIEFkYW0gQ29zdGVsbG8pCistIG1ha2Ugc3RhdGljIGxpYnJhcmllcyBieSBkZWZhdWx0IGluIGNvbmZpZ3VyZSwgYWRkIC0tc2hhcmVkIG9wdGlvbi4KKy0gbW92ZSBNU0RPUyBvciBXaW5kb3dzIHNwZWNpZmljIGZpbGVzIHRvIGRpcmVjdG9yeSBtc2RvcworLSBzdXBwcmVzcyB0aGUgbm90aW9uIG9mIHBhcnRpYWwgZmx1c2ggdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQorICAoYnV0IHRoZSBzeW1ib2wgWl9QQVJUSUFMX0ZMVVNIIGlzIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAuNCkKKy0gc3VwcHJlc3MgaGlzdG9yeSBidWZmZXIgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gdG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZQorICAodGhpcyBmZWF0dXJlIHdhcyBub3QgaW1wbGVtZW50ZWQgYW55d2F5IGluIDEuMC40KQorLSBuZXh0X2luIGFuZCBhdmFpbF9pbiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBjYWxsaW5nIGluZmxhdGVJbml0IG9yCisgIGluZmxhdGVJbml0MgorLSBhZGQgRVhQT1JUIGluIGFsbCBleHBvcnRlZCBmdW5jdGlvbnMgKGZvciBXaW5kb3dzIERMTCkKKy0gYWRkZWQgTWFrZWZpbGUubnQgKHRoYW5rcyB0byBTdGVwaGVuIFdpbGxpYW1zKQorLSBhZGRlZCB0aGUgdW5zdXBwb3J0ZWQgImNvbnRyaWIiIGRpcmVjdG9yeToKKyAgIGNvbnRyaWIvYXNtMzg2LyBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuCisgICBjb250cmliL2lvc3RyZWFtLyBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKKyAgIGNvbnRyaWIvaW9zdHJlYW0yLyAgYnkgVHlnZSBM+HZzZXQgPFR5Z2UuTG92c2V0QGNtci5ubz4KKwlBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UKKyAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKwlBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCisgICBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KKyAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCistIHBhc3MgcGFyYW1zIC1mIChmaWx0ZXJlZCBkYXRhKSwgLWggKGh1ZmZtYW4gb25seSksIC0xIHRvIC05IChjb21wcmVzc2lvbgorICBsZXZlbCkgaW4gbWluaWd6aXAgKHRoYW5rcyB0byBUb20gTGFuZSkKKworLSB1c2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBkZWZsYXRlCistIGFkZGVkIHRlc3QgZm9yIGd6c2VlayBhbmQgZ3p0ZWxsIGluIGV4YW1wbGUuYworLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIGluZmxhdGVTeW5jUG9pbnQoKSAoaGFjayBmb3IgUGF1bCBNYWNrZXJyYXMpCistIGFkZCB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gekVycm9yIHRvIGNvbnZlcnQgZXJyb3IgY29kZSB0byBzdHJpbmcKKyAgKGZvciBUaW0gU21pdGhlcnMpCistIEFsbG93IGNvbXBpbGF0aW9uIG9mIGd6aW8gd2l0aCAtRE5PX0RFRkxBVEUgdG8gYXZvaWQgdGhlIGNvbXByZXNzaW9uIGNvZGUuCistIFVzZSBkZWZhdWx0IG1lbWNweSBmb3IgU3ltYW50ZWMgTVNET1MgY29tcGlsZXIuCistIEFkZCBFWFBPUlQga2V5d29yZCBmb3IgY2hlY2tfZnVuYyAobmVlZGVkIGZvciBXaW5kb3dzIERMTCkKKy0gYWRkIGN1cnJlbnQgZGlyZWN0b3J5IHRvIExEX0xJQlJBUllfUEFUSCBmb3IgIm1ha2UgdGVzdCIKKy0gY3JlYXRlIGFsc28gYSBsaW5rIGZvciBsaWJ6LnNvLjEKKy0gYWRkZWQgc3VwcG9ydCBmb3IgRlVKSVRTVSBVWFAvRFMgKHRoYW5rcyB0byBUb3NoaWFraSBOb211cmEpCistIHVzZSAkKFNIQVJFRExJQikgaW5zdGVhZCBvZiBsaWJ6LnNvIGluIE1ha2VmaWxlLmluIChmb3IgSFBVWCkKKy0gYWRkZWQgLXNvbmFtZSBmb3IgTGludXggaW4gY29uZmlndXJlIChDaHVuLUNodW5nIENoZW4sCistIGFzc2lnbiBudW1iZXJzIHRvIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgaW4gemxpYi5kZWYgKGZvciBXaW5kb3dzIERMTCkKKy0gYWRkIGFkdmljZSBpbiB6bGliLmggZm9yIGJlc3QgdXNhZ2Ugb2YgZGVmbGF0ZVNldERpY3Rpb25hcnkKKy0gd29yayBhcm91bmQgY29tcGlsZXIgYnVnIG9uIEF0YXJpIChjYXN0IFpfTlVMTCBpbiBjYWxsIG9mIHMtPmNoZWNrZm4pCistIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgZm9yIFR1cmJvQyBpbiBsYXJnZSBtb2RlbAorLSBhdm9pZCAidmVyc2lvblN0cmluZyJbMF0gKEJvcmxhbmQgYnVnKQorLSBhZGQgTkVFRF9EVU1NWV9SRVRVUk4gZm9yIEJvcmxhbmQKKy0gdXNlIHZhcmlhYmxlIHpfdmVyYm9zZSBmb3IgdHJhY2luZyBpbiBkZWJ1ZyBtb2RlIChQZXRlciBEZXV0c2NoKS4KKy0gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDQworLSBkZWZpbmVkIFNUREMgZm9yIE9TLzIgKERhdmlkIENoYXJsYXApCQorLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQorLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMKKy0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiIKKy0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpCistIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkKKy0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQorLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkKKy0gQXZvaWQgZXhwYW5kZWQgJElkJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLgorLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpCistIHVzZSBUcmFjZXYgaW5zdGVhZCBvZiBUcmFjZSBpbiBpbmZibG9jay5jCistIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlCistIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3CistIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pCistIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaAorLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaAorLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYCistIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pCistIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MKKwogQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpCiAtIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGEKIC0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQogLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQogLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQogLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FCi0KKyAgCiBDaGFuZ2VzIGluIDEuMC40ICgyNCBKdWwgOTYpCiAtIEluIHZlcnkgcmFyZSBjb25kaXRpb25zLCBkZWZsYXRlKHMsIFpfRklOSVNIKSBjb3VsZCBmYWlsIHRvIHByb2R1Y2UgYW4gRU9GCiAgIGJpdCwgc28gdGhlIGRlY29tcHJlc3NvciBjb3VsZCBkZWNvbXByZXNzIGFsbCB0aGUgY29ycmVjdCBkYXRhIGJ1dCB3ZW50CmRpZmYgLS1naXQgYS9JTkRFWCBiL0lOREVYCmluZGV4IGJiMWUzZjAuLjg1ZDUxYTQgMTAwNjQ0Ci0tLSBhL0lOREVYCisrKyBiL0lOREVYCkBAIC0xLDIyICsxLDI4IEBACi1DaGFuZ2VMb2cJaGlzdG9yeSBvZiBjaGFuZ2VzCi1JTkRFWAkJdGhpcyBmaWxlCi1NYWtlX3Ztcy5jb20Jc2NyaXB0IGZvciBWYXgvVk1TCi1NYWtlZmlsZQltYWtlZmlsZSBmb3IgVW5peCAoZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZSkKLU1ha2VmaWxlLmIzMgltYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysgICAzMi1iaXQKLU1ha2VmaWxlLmJvcgltYWtlZmlsZSBmb3IgQm9ybGFuZCBDL0MrKyAxNi1iaXQKLU1ha2VmaWxlLmRqMgltYWtlZmlsZSBmb3IgREpHUFAgMi54Ci1NYWtlZmlsZS5pbgltYWtlZmlsZSBmb3IgVW5peCAodGVtcGxhdGUgZm9yIGNvbmZpZ3VyZSkKLU1ha2VmaWxlLm1zYwltYWtlZmlsZSBmb3IgTWljcm9zb2Z0IEMgMTYtYml0Ci1NYWtlZmlsZS5yaXNjb3MgbWFrZWZpbGUgZm9yIFJJU0NPUwotTWFrZWZpbGUuc2FzCW1ha2VmaWxlIGZvciBBbWlnYSBTQVMvQwotTWFrZWZpbGUudGMJbWFrZWZpbGUgZm9yIFR1cmJvIEMKLU1ha2VmaWxlLndhdAltYWtlZmlsZSBmb3IgV2F0Y29tIEMKLVJFQURNRQkJZ3Vlc3Mgd2hhdAotYWxnb3JpdGhtLmRvYwlkZXNjcmlwdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gJiBkZWNvbXByZXNzaW9uIGFsZ29yaXRobXMKLWNvbmZpZ3VyZQljb25maWd1cmUgc2NyaXB0IGZvciBVbml4Ci1kZXNjcmlwLm1tcwltYWtlZmlsZSBmb3IgVmF4L1ZNUwotemxpYi5kZWYgICAgICAgIGRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBETEwKLXpsaWIucmMgICAgICAgICBkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgRExMCitDaGFuZ2VMb2cJCWhpc3Rvcnkgb2YgY2hhbmdlcworSU5ERVgJCQl0aGlzIGZpbGUKK01ha2Vfdm1zLmNvbQkJc2NyaXB0IGZvciBWYXgvVk1TCitNYWtlZmlsZQkJbWFrZWZpbGUgZm9yIFVuaXggKGdlbmVyYXRlZCBieSBjb25maWd1cmUpCitNYWtlZmlsZS5pbgkJbWFrZWZpbGUgZm9yIFVuaXggKHRlbXBsYXRlIGZvciBjb25maWd1cmUpCitNYWtlZmlsZS5tc2MJCW1ha2VmaWxlIGZvciBNaWNyb3NvZnQgQyAxNi1iaXQKK01ha2VmaWxlLnJpc2NvcyAJbWFrZWZpbGUgZm9yIFJJU0NPUworTWFrZWZpbGUuc2FzCQltYWtlZmlsZSBmb3IgQW1pZ2EgU0FTL0MKK1JFQURNRQkJCWd1ZXNzIHdoYXQKK2FsZ29yaXRobS50eHQJCWRlc2NyaXB0aW9uIG9mIHRoZSAoZGUpY29tcHJlc3Npb24gYWxnb3JpdGhtCitjb25maWd1cmUJCWNvbmZpZ3VyZSBzY3JpcHQgZm9yIFVuaXgKK2Rlc2NyaXAubW1zCQltYWtlZmlsZSBmb3IgVmF4L1ZNUworemxpYi4zCQkJbWluaSBtYW4gcGFnZSBmb3IgemxpYiAodm9sdW50ZWVycyB0byB3cml0ZSBmdWxsCisJCQltYW4gcGFnZXMgZnJvbSB6bGliLmggd2VsY29tZS4gd3JpdGUgdG8gamxvdXBAZ3ppcC5vcmcpCisKK21zZG9zL01ha2VmaWxlLmIzMgltYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysgICAzMi1iaXQKK21zZG9zL01ha2VmaWxlLmJvcgltYWtlZmlsZSBmb3IgQm9ybGFuZCBDL0MrKyAxNi1iaXQKK21zZG9zL01ha2VmaWxlLmRqMgltYWtlZmlsZSBmb3IgREpHUFAgMi54Cittc2Rvcy9NYWtlZmlsZS50YwltYWtlZmlsZSBmb3IgVHVyYm8gQworbXNkb3MvTWFrZWZpbGUud2F0CW1ha2VmaWxlIGZvciBXYXRjb20gQworbXNkb3MvemxpYi5kZWYgICAgICAgIAlkZWZpbml0aW9uIGZpbGUgZm9yIFdpbmRvd3MgRExMCittc2Rvcy96bGliLnJjICAgICAgICAgCWRlZmluaXRpb24gZmlsZSBmb3IgV2luZG93cyBETEwKKworbnQvTWFrZWZpbGUubnQJCW1ha2VmaWxlIGZvciBXaW5kb3dzIE5UCitudC96bGliLmRudAkJZGVmaW5pdGlvbiBmaWxlIGZvciBXaW5kb3dzIE5UIERMTAogCiAKIAkJemxpYiBwdWJsaWMgaGVhZGVyIGZpbGVzIChtdXN0IGJlIGtlcHQpOgpAQCAtNDksMyArNTUsMjAgQEAKIAkJc291cmNlIGZpbGVzIGZvciBzYW1wbGUgcHJvZ3JhbXM6CiBleGFtcGxlLmMKIG1pbmlnemlwLmMKKworCQl1bnN1cHBvcnRlZCBjb250cmlidXRpb24gYnkgdGhpcmQgcGFydGllcworCitjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPgorCTM4NiBhc20gY29kZSByZXBsYWNpbmcgbG9uZ2VzdF9tYXRjaCgpLgorCitjb250cmliL2lvc3RyZWFtLyBieSBLZXZpbiBSdWxhbmQgPGtldmluQHJvZGluLnd1c3RsLmVkdT4KKyAgICAgICAgQSBDKysgSS9PIHN0cmVhbXMgaW50ZXJmYWNlIHRvIHRoZSB6bGliIGd6KiBmdW5jdGlvbnMKKworY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgorCUFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQorCitjb250cmliL3VudGd6LyAgYnkgIlBlZHJvIEEuIEFyYW5kYSBHdXRpXGlycmV6IiA8cGFhZ0B0aWQuZXM+CisJQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZXh0cmFjdG9yIHVzaW5nIHpsaWIKKworY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+CisgICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBiMjE2YmE3Li4zOTgxNjE0IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMjIsMTIgKzIyLDE0IEBACiBMREZMQUdTPS1MLiAtbHoKIExEU0hBUkVEPSQoQ0MpCiAKLVZFUj0xLjAuNQorVkVSPTEuMC43CiBMSUJTPWxpYnouYQorU0hBUkVETElCPWxpYnouc28KIAogQVI9YXIgcmMKIFJBTkxJQj1yYW5saWIKIFRBUj10YXIKK1NIRUxMPS9iaW4vc2gKIAogcHJlZml4PS91c3IvbG9jYWwKIGV4ZWNfcHJlZml4ID0gJChwcmVmaXgpCkBAIC0zNywyMiArMzksMzAgQEAKIAogVEVTVF9PQkpTID0gZXhhbXBsZS5vIG1pbmlnemlwLm8KIAotRElTVEZJTEVTID0gUkVBRE1FIElOREVYIENoYW5nZUxvZyBjb25maWd1cmUgTWFrZSpbYS16MC05XSBkZXNjcmlwLm1tcyBcCi0JICAgIHpsaWIuZGVmIHpsaWIucmMgYWxnb3JpdGhtLmRvYyAgKi5bY2hdCitESVNURklMRVMgPSBSRUFETUUgSU5ERVggQ2hhbmdlTG9nIGNvbmZpZ3VyZSBNYWtlKlthLXowLTldICouW2NoXSBkZXNjcmlwLm1tcyBcCisgIGFsZ29yaXRobS50eHQgemxpYi4zIG1zZG9zL01ha2UqW2EtejAtOV0gbXNkb3MvemxpYi5kZWYgbXNkb3MvemxpYi5yYyBcCisgIG50L01ha2VmaWxlLm50IG50L3psaWIuZG50ICBjb250cmliL1JFQURNRS5jb250cmliIGNvbnRyaWIvKi50eHQgXAorICBjb250cmliL2FzbTM4Ni8qLmFzbSBjb250cmliL2FzbTM4Ni8qLmMgXAorICBjb250cmliL2FzbTM4Ni8qLmJhdCBjb250cmliL2FzbTM4Ni8qLm1hayBjb250cmliL2lvc3RyZWFtLyouY3BwIFwKKyAgY29udHJpYi9pb3N0cmVhbS8qLmggIGNvbnRyaWIvaW9zdHJlYW0yLyouaCBjb250cmliL2lvc3RyZWFtMi8qLmNwcCBcCisgIGNvbnRyaWIvdW50Z3ovTWFrZWZpbGUgY29udHJpYi91bnRnei8qLmMgY29udHJpYi91bnRnei8qLnczMgogCiBhbGw6IGV4YW1wbGUgbWluaWd6aXAKIAogdGVzdDogYWxsCi0JLi9leGFtcGxlCi0JZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kIAorCUBMRF9MSUJSQVJZX1BBVEg9LjokKExEX0xJQlJBUllfUEFUSCkgOyBleHBvcnQgTERfTElCUkFSWV9QQVRIOyBcCisJLi9leGFtcGxlIDsgXAorCWVjaG8gaGVsbG8gd29ybGQgfCAuL21pbmlnemlwIHwgLi9taW5pZ3ppcCAtZAogCiBsaWJ6LmE6ICQoT0JKUykKIAkkKEFSKSAkQCAkKE9CSlMpCi0JLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSAyPi9kZXYvbnVsbAorCS1AICgkKFJBTkxJQikgJEAgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCiAKLWxpYnouc28uJChWRVIpOiAkKE9CSlMpCiskKFNIQVJFRExJQikuJChWRVIpOiAkKE9CSlMpCiAJJChMRFNIQVJFRCkgLW8gJEAgJChPQkpTKQotCXJtIC1mIGxpYnouc287IGxuIC1zICRAIGxpYnouc28KKwlybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjEKKwlsbiAtcyAkQCAkKFNIQVJFRExJQikKKwlsbiAtcyAkQCAkKFNIQVJFRExJQikuMQogCiBleGFtcGxlOiBleGFtcGxlLm8gJChMSUJTKQogCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCBleGFtcGxlLm8gJChMREZMQUdTKQpAQCAtNjgsMjIgKzc4LDI4IEBACiAJY3AgJChMSUJTKSAkKGV4ZWNfcHJlZml4KS9saWIKIAljZCAkKGV4ZWNfcHJlZml4KS9saWI7IGNobW9kIDY0NCAkKExJQlMpCiAJLUAoY2QgJChleGVjX3ByZWZpeCkvbGliOyAkKFJBTkxJQikgbGliei5hIHx8IHRydWUpID4vZGV2L251bGwgMj4mMQotCWNkICQoZXhlY19wcmVmaXgpL2xpYjsgaWYgdGVzdCAtZiBsaWJ6LnNvLiQoVkVSKTsgdGhlbiBcCi0JICBsbiAtcyBsaWJ6LnNvLiQoVkVSKSBsaWJ6LnNvOyBcCisJY2QgJChleGVjX3ByZWZpeCkvbGliOyBpZiB0ZXN0IC1mICQoU0hBUkVETElCKS4kKFZFUik7IHRoZW4gXAorCSAgcm0gLWYgJChTSEFSRURMSUIpICQoU0hBUkVETElCKS4xOyBcCisJICBsbiAtcyAkKFNIQVJFRExJQikuJChWRVIpICQoU0hBUkVETElCKTsgXAorCSAgbG4gLXMgJChTSEFSRURMSUIpLiQoVkVSKSAkKFNIQVJFRExJQikuMTsgXAorCSAgKGxkY29uZmlnIHx8IHRydWUpICA+L2Rldi9udWxsIDI+JjE7IFwKIAlmaQogIyBUaGUgcmFubGliIGluIGluc3RhbGwgaXMgbmVlZGVkIG9uIE5lWFRTVEVQIHdoaWNoIGNoZWNrcyBmaWxlIHRpbWVzCisjIGxkY29uZmlnIGlzIGZvciBMaW51eAogCiB1bmluc3RhbGw6CiAJY2QgJChleGVjX3ByZWZpeCkvbGliOyBybSAtZiAkKExJQlMpOyBcCi0JaWYgdGVzdCAtZiBsaWJ6LnNvOyB0aGVuIFwKKwlpZiB0ZXN0IC1mICQoU0hBUkVETElCKTsgdGhlbiBcCiAJIHY9YHNlZCAtbiAnL1ZFUlNJT04gIi9zLy4qIlwoLipcKSIuKi9cMS9wJzwkKHByZWZpeCkvaW5jbHVkZS96bGliLmhgO1wKLQkgcm0gLWYgbGliei5zby4kJHYgbGliei5zbzsgXAorCSBybSAtZiAkKFNIQVJFRExJQikuJCR2ICQoU0hBUkVETElCKTsgXAogCWZpCi0JY2QgJChwcmVmaXgpL2luY2x1ZGU7IHJtIC1mIHpsaWIuaCB6Y29uZi5oCisJY2R6ICQocHJlZml4KS9pbmNsdWRlOyBybSAtZiB6bGliLmggemNvbmYuaAogCiBjbGVhbjoKIAlybSAtZiAqLm8gKn4gZXhhbXBsZSBtaW5pZ3ppcCBsaWJ6LmEgbGliei5zbyogZm9vLmd6CiAKK2Rpc3RjbGVhbjoJY2xlYW4KKwogemlwOgogCW12IE1ha2VmaWxlIE1ha2VmaWxlfjsgY3AgLXAgTWFrZWZpbGUuaW4gTWFrZWZpbGUKIAl2PWBzZWQgLW4gLWUgJ3MvXC4vL2cnIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYDtcCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IGIyMTZiYTcuLjM5ODE2MTQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC0yMiwxMiArMjIsMTQgQEAKIExERkxBR1M9LUwuIC1segogTERTSEFSRUQ9JChDQykKIAotVkVSPTEuMC41CitWRVI9MS4wLjcKIExJQlM9bGliei5hCitTSEFSRURMSUI9bGliei5zbwogCiBBUj1hciByYwogUkFOTElCPXJhbmxpYgogVEFSPXRhcgorU0hFTEw9L2Jpbi9zaAogCiBwcmVmaXg9L3Vzci9sb2NhbAogZXhlY19wcmVmaXggPSAkKHByZWZpeCkKQEAgLTM3LDIyICszOSwzMCBAQAogCiBURVNUX09CSlMgPSBleGFtcGxlLm8gbWluaWd6aXAubwogCi1ESVNURklMRVMgPSBSRUFETUUgSU5ERVggQ2hhbmdlTG9nIGNvbmZpZ3VyZSBNYWtlKlthLXowLTldIGRlc2NyaXAubW1zIFwKLQkgICAgemxpYi5kZWYgemxpYi5yYyBhbGdvcml0aG0uZG9jICAqLltjaF0KK0RJU1RGSUxFUyA9IFJFQURNRSBJTkRFWCBDaGFuZ2VMb2cgY29uZmlndXJlIE1ha2UqW2EtejAtOV0gKi5bY2hdIGRlc2NyaXAubW1zIFwKKyAgYWxnb3JpdGhtLnR4dCB6bGliLjMgbXNkb3MvTWFrZSpbYS16MC05XSBtc2Rvcy96bGliLmRlZiBtc2Rvcy96bGliLnJjIFwKKyAgbnQvTWFrZWZpbGUubnQgbnQvemxpYi5kbnQgIGNvbnRyaWIvUkVBRE1FLmNvbnRyaWIgY29udHJpYi8qLnR4dCBcCisgIGNvbnRyaWIvYXNtMzg2LyouYXNtIGNvbnRyaWIvYXNtMzg2LyouYyBcCisgIGNvbnRyaWIvYXNtMzg2LyouYmF0IGNvbnRyaWIvYXNtMzg2LyoubWFrIGNvbnRyaWIvaW9zdHJlYW0vKi5jcHAgXAorICBjb250cmliL2lvc3RyZWFtLyouaCAgY29udHJpYi9pb3N0cmVhbTIvKi5oIGNvbnRyaWIvaW9zdHJlYW0yLyouY3BwIFwKKyAgY29udHJpYi91bnRnei9NYWtlZmlsZSBjb250cmliL3VudGd6LyouYyBjb250cmliL3VudGd6LyoudzMyCiAKIGFsbDogZXhhbXBsZSBtaW5pZ3ppcAogCiB0ZXN0OiBhbGwKLQkuL2V4YW1wbGUKLQllY2hvIGhlbGxvIHdvcmxkIHwgLi9taW5pZ3ppcCB8IC4vbWluaWd6aXAgLWQgCisJQExEX0xJQlJBUllfUEFUSD0uOiQoTERfTElCUkFSWV9QQVRIKSA7IGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg7IFwKKwkuL2V4YW1wbGUgOyBcCisJZWNobyBoZWxsbyB3b3JsZCB8IC4vbWluaWd6aXAgfCAuL21pbmlnemlwIC1kCiAKIGxpYnouYTogJChPQkpTKQogCSQoQVIpICRAICQoT0JKUykKLQktQCAoJChSQU5MSUIpICRAIHx8IHRydWUpIDI+L2Rldi9udWxsCisJLUAgKCQoUkFOTElCKSAkQCB8fCB0cnVlKSA+L2Rldi9udWxsIDI+JjEKIAotbGliei5zby4kKFZFUik6ICQoT0JKUykKKyQoU0hBUkVETElCKS4kKFZFUik6ICQoT0JKUykKIAkkKExEU0hBUkVEKSAtbyAkQCAkKE9CSlMpCi0Jcm0gLWYgbGliei5zbzsgbG4gLXMgJEAgbGliei5zbworCXJtIC1mICQoU0hBUkVETElCKSAkKFNIQVJFRExJQikuMQorCWxuIC1zICRAICQoU0hBUkVETElCKQorCWxuIC1zICRAICQoU0hBUkVETElCKS4xCiAKIGV4YW1wbGU6IGV4YW1wbGUubyAkKExJQlMpCiAJJChDQykgJChDRkxBR1MpIC1vICRAIGV4YW1wbGUubyAkKExERkxBR1MpCkBAIC02OCwyMiArNzgsMjggQEAKIAljcCAkKExJQlMpICQoZXhlY19wcmVmaXgpL2xpYgogCWNkICQoZXhlY19wcmVmaXgpL2xpYjsgY2htb2QgNjQ0ICQoTElCUykKIAktQChjZCAkKGV4ZWNfcHJlZml4KS9saWI7ICQoUkFOTElCKSBsaWJ6LmEgfHwgdHJ1ZSkgPi9kZXYvbnVsbCAyPiYxCi0JY2QgJChleGVjX3ByZWZpeCkvbGliOyBpZiB0ZXN0IC1mIGxpYnouc28uJChWRVIpOyB0aGVuIFwKLQkgIGxuIC1zIGxpYnouc28uJChWRVIpIGxpYnouc287IFwKKwljZCAkKGV4ZWNfcHJlZml4KS9saWI7IGlmIHRlc3QgLWYgJChTSEFSRURMSUIpLiQoVkVSKTsgdGhlbiBcCisJICBybSAtZiAkKFNIQVJFRExJQikgJChTSEFSRURMSUIpLjE7IFwKKwkgIGxuIC1zICQoU0hBUkVETElCKS4kKFZFUikgJChTSEFSRURMSUIpOyBcCisJICBsbiAtcyAkKFNIQVJFRExJQikuJChWRVIpICQoU0hBUkVETElCKS4xOyBcCisJICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXAogCWZpCiAjIFRoZSByYW5saWIgaW4gaW5zdGFsbCBpcyBuZWVkZWQgb24gTmVYVFNURVAgd2hpY2ggY2hlY2tzIGZpbGUgdGltZXMKKyMgbGRjb25maWcgaXMgZm9yIExpbnV4CiAKIHVuaW5zdGFsbDoKIAljZCAkKGV4ZWNfcHJlZml4KS9saWI7IHJtIC1mICQoTElCUyk7IFwKLQlpZiB0ZXN0IC1mIGxpYnouc287IHRoZW4gXAorCWlmIHRlc3QgLWYgJChTSEFSRURMSUIpOyB0aGVuIFwKIAkgdj1gc2VkIC1uICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnPCQocHJlZml4KS9pbmNsdWRlL3psaWIuaGA7XAotCSBybSAtZiBsaWJ6LnNvLiQkdiBsaWJ6LnNvOyBcCisJIHJtIC1mICQoU0hBUkVETElCKS4kJHYgJChTSEFSRURMSUIpOyBcCiAJZmkKLQljZCAkKHByZWZpeCkvaW5jbHVkZTsgcm0gLWYgemxpYi5oIHpjb25mLmgKKwljZHogJChwcmVmaXgpL2luY2x1ZGU7IHJtIC1mIHpsaWIuaCB6Y29uZi5oCiAKIGNsZWFuOgogCXJtIC1mICoubyAqfiBleGFtcGxlIG1pbmlnemlwIGxpYnouYSBsaWJ6LnNvKiBmb28uZ3oKIAorZGlzdGNsZWFuOgljbGVhbgorCiB6aXA6CiAJbXYgTWFrZWZpbGUgTWFrZWZpbGV+OyBjcCAtcCBNYWtlZmlsZS5pbiBNYWtlZmlsZQogCXY9YHNlZCAtbiAtZSAncy9cLi8vZycgLWUgJy9WRVJTSU9OICIvcy8uKiJcKC4qXCkiLiovXDEvcCcgPCB6bGliLmhgO1wKZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBiZmM5MmY1Li44ZDMzZmI5IDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDQgKzEsNCBAQAotemxpYiAxLjAuNSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuICBBbGwgdGhlIGNvZGUKK3psaWIgMS4wLjcgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LiAgQWxsIHRoZSBjb2RlCiBpcyByZWVudHJhbnQgKHRocmVhZCBzYWZlKS4gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkKIGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvciBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyAKIGZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjMTk1MC50eHQgKHpsaWIgZm9ybWF0KSwgcmZjMTk1MS50eHQgKGRlZmxhdGUKQEAgLTE5LDI3ICsxOSw1NCBAQAogUXVlc3Rpb25zIGFib3V0IHpsaWIgc2hvdWxkIGJlIHNlbnQgdG8gPHpsaWJAcXVlc3QuanBsLm5hc2EuZ292PiBvciwKIGlmIHRoaXMgZmFpbHMsIHRvIHRoZSBhZGRyZXNzZXMgZ2l2ZW4gYmVsb3cgaW4gdGhlIENvcHlyaWdodCBzZWN0aW9uLgogVGhlIHpsaWIgaG9tZSBwYWdlIGlzIGh0dHA6Ly93d3cuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvCitUaGUgb2ZmaWNpYWwgemxpYiBmdHAgc2l0ZSBpcyBmdHA6Ly9mdHAuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvCitNYXJrIE5lbHNvbiB3cm90ZSBhbiBhcnRpY2xlIGFib3V0IHpsaWIgZm9yIHRoZSBKYW4uIDE5OTcgaXNzdWUgb2YgCitEci4gRG9iYidzIEpvdXJuYWw7IGEgY29weSBvZiB0aGUgYXJ0aWNsZSBpcyBhdmFpbGFibGUgaW4KK2h0dHA6Ly93ZWIyLmFpcm1haWwubmV0L21hcmtuL2FydGljbGVzL3psaWJ0b29sL3psaWJ0b29sLmh0bQogCi1UaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4wLjUgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgotVGhlIG1haW4gY2hhbmdlcyBzaW5jZSAxLjAuNCBhcmU6CitUaGUgY2hhbmdlcyBtYWRlIGluIHZlcnNpb24gMS4wLjcgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIGZpbGUgQ2hhbmdlTG9nLgorVGhlIG1haW4gY2hhbmdlcyBzaW5jZSAxLjAuNiBhcmU6CiAKLS0gRml4IGluZmxhdGUgdG8gdGVybWluYXRlIGdyYWNlZnVsbHkgd2hlbiBmZWQgY29ycnVwdGVkIG9yIGludmFsaWQgZGF0YQotLSBVc2UgY29uc3QgZm9yIHJvbW1hYmxlIGNvbnN0YW50cyBpbiBpbmZsYXRlCistIGZpeCBnenNlZWsgd2hpY2ggd2FzIGJyb2tlbiBpbiB3cml0ZSBtb2RlCistIHJldHVybiBlcnJvciBmb3IgZ3pzZWVrIHRvIG5lZ2F0aXZlIGFic29sdXRlIHBvc2l0aW9uCistIGZpeCBjb25maWd1cmUgZm9yIExpbnV4IChDaHVuLUNodW5nIENoZW4pCistIGluY3JlYXNlIHN0YWNrIHNwYWNlIGZvciBNU0MgKFRpbSBXZWduZXIpCistIGdldF9jcmNfdGFibGUgYW5kIGluZmxhdGVTeW5jUG9pbnQgYXJlIEVYUE9SVGVkIChHaWxsZXMgVm9sbGFudCkKKy0gZGVmaW5lIEVYUE9SVFZBIGZvciBnenByaW50ZiAoR2lsbGVzIFZvbGxhbnQpCistIGFkZGVkIG1pbmkgbWFuIHBhZ2UgemxpYi4zIChSaWNrIFJvZGdlcnMpIFt2b2x1bnRlZXJzIHRvIHdyaXRlIGZ1bGwKKyAgbWFuIHBhZ2VzIGZyb20gemxpYi5oIG1vc3Qgd2VsY29tZS4gd3JpdGUgdG8gamxvdXBAZ3ppcC5vcmddCistIGZvciBjb250cmliL3VudGd6LCBmaXggbWFrZWRpcigpIGFuZCBpbXByb3ZlIE1ha2VmaWxlCiAKK1Vuc3VwcG9ydGVkIHRoaXJkIHBhcnR5IGNvbnRyaWJ1dGlvbnMgYXJlIHByb3ZpZGVkIGluIGRpcmVjdG9yeSAiY29udHJpYiIuCisKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB6bGliIGlzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQgMS4xCitodHRwOi8vd3d3LmphdmFzb2Z0LmNvbS9wcm9kdWN0cy9KREsvMS4xL2RvY3MvYXBpL1BhY2thZ2UtamF2YS51dGlsLnppcC5odG1sCitTZWUgdGhlIHpsaWIgaG9tZSBwYWdlIGh0dHA6Ly93d3cuY2Ryb20uY29tL3B1Yi9pbmZvemlwL3psaWIvIGZvciBkZXRhaWxzLgogCiBBIFBlcmwgaW50ZXJmYWNlIHRvIHpsaWIgd3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIDxwbWFycXVlc3NAYmZzZWMuYnQuY28udWs+CiBpcyBpbiB0aGUgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsIHN1Y2ggYXM6CiBmdHA6Ly9mdHAuY2lzLnVmbC5lZHUvcHViL3BlcmwvQ1BBTi9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy9Db21wcmVzcy1abGliKgogCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8gemxpYiB3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BtYWduZXQuY29tPgoraXMgYXZhaWxhYmxlIGZyb20gdGhlIFB5dGhvbiBTb2Z0d2FyZSBBc3NvY2lhdGlvbiBzaXRlcywgc3VjaCBhczoKK2Z0cDovL2Z0cC5weXRob24ub3JnL3B1Yi9weXRob24vY29udHJpYi9FbmNvZGluZy96bGliKi50YXIuZ3oKIAogTm90ZXMgZm9yIHNvbWUgdGFyZ2V0czoKIAotLSBGb3IgVHVyYm8gQyB0aGUgc21hbGwgbW9kZWwgaXMgc3VwcG9ydGVkIG9ubHkgd2l0aCByZWR1Y2VkIHBlcmZvcm1hbmNlIHRvCi0gIGF2b2lkIGFueSBmYXIgYWxsb2NhdGlvbjsgaXQgd2FzIHRlc3RlZCB3aXRoIC1ETUFYX1dCSVRTPTExIC1ETUFYX01FTV9MRVZFTD0zCistIFRvIGJ1aWxkIGEgV2luZG93cyBETEwgdmVyc2lvbiwgaW5jbHVkZSBpbiBhIERMTCBwcm9qZWN0IHpsaWIuZGVmLCB6bGliLnJjCisgIGFuZCBhbGwgLmMgZmlsZXMgZXhjZXB0IGV4YW1wbGUuYyBhbmQgbWluaWd6aXAuYzsgY29tcGlsZSB3aXRoIC1EWkxJQl9ETEwKKyAgVGhlIHpsaWIgRExMIHN1cHBvcnQgd2FzIGluaXRpYWxseSBkb25lIGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpIGFuZCBpcworICBub3cgbWFpbnRhaW5lZCBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+LiBDaGVjayB0aGUgemxpYiBETEwKKyAgaG9tZSBwYWdlIGF0IGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwKIAotLSBGb3IgNjQtYml0IElyaXMsIGRlZmxhdGUuYyBtdXN0IGJlIGNvbXBpbGVkIHdpdGhvdXQgYW55IG9wdGltaXphdGlvbi4KKyAgRnJvbSBWaXN1YWwgQmFzaWMsIHlvdSBjYW4gY2FsbCB0aGUgRExMIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgdGFrZQorICBhIHN0cnVjdHVyZSBhcyBhcmd1bWVudDogY29tcHJlc3MsIHVuY29tcHJlc3MgYW5kIGFsbCBneiogZnVuY3Rpb25zLgorICBTZWUgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICBJIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBzdHJ1Y3R1cmVzIGluIFZpc3VhbCBCYXNpYywgc29ycnkuCisKKy0gRm9yIDY0LWJpdCBJcml4LCBkZWZsYXRlLmMgbXVzdCBiZSBjb21waWxlZCB3aXRob3V0IGFueSBvcHRpbWl6YXRpb24uCiAgIFdpdGggLU8sIG9uZSBsaWJwbmcgdGVzdCBmYWlscy4gVGhlIHRlc3Qgd29ya3MgaW4gMzIgYml0IG1vZGUgKHdpdGgKLSAgdGhlIC0zMiBjb21waWxlciBmbGFnKS4gVGhlIGNvbXBpbGVyIGJ1ZyBoYXMgYmVlbiByZXBvcnRlZCB0byBTR0kuCisgIHRoZSAtbjMyIGNvbXBpbGVyIGZsYWcpLiBUaGUgY29tcGlsZXIgYnVnIGhhcyBiZWVuIHJlcG9ydGVkIHRvIFNHSS4KIAogLSB6bGliIGRvZXNuJ3Qgd29yayB3aXRoIGdjYyAyLjYuMyBvbiBhIERFQyAzMDAwLzMwMExYIHVuZGVyIE9TRi8xIDIuMSAgIAogICBpdCB3b3JrcyB3aGVuIGNvbXBpbGVkIHdpdGggY2MuCkBAIC00NywxNCArNzQsMTEgQEAKIC0gemxpYiBkb2Vzbid0IHdvcmsgb24gSFAtVVggOS4wNSB3aXRoIG9uZSBjYyBjb21waWxlciAodGhlIG9uZSBub3QKICAgYWNjZXB0aW5nIHRoZSAtTyBvcHRpb24pLiBJdCB3b3JrcyB3aXRoIHRoZSBvdGhlciBjYyBjb21waWxlci4KIAotLSBUbyBidWlsZCBhIFdpbmRvd3MgRExMIHZlcnNpb24sIGluY2x1ZGUgaW4gYSBETEwgcHJvamVjdCB6bGliLmRlZiwgemxpYi5yYwotICBhbmQgYWxsIC5jIGZpbGVzIGV4Y2VwdCBleGFtcGxlLmMgYW5kIG1pbmlnemlwLmM7IGNvbXBpbGUgd2l0aCAtRFpMSUJfRExMCi0gIEZvciBoZWxwIG9uIGJ1aWxkaW5nIGEgemxpYiBETEwsIGNvbnRhY3QgQWxlc3NhbmRybyBJYWNvcGV0dGkKLSAgPGlhY29AZW1haWwuYWxlc3NhbmRyaWEuYWxwY29tLml0PiAgaHR0cDovL2xpc2EudW5pYWwuaXQvaWFjbyAsCi0gIG9yIGNvbnRhY3QgQnJhZCBDbGFya2UgPGJjbGFya2VAY3liZXJ1cy5jYT4uCi0KIC0gZ3pkb3BlbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFJJU0NPUwogCistIEZvciBUdXJibyBDIHRoZSBzbWFsbCBtb2RlbCBpcyBzdXBwb3J0ZWQgb25seSB3aXRoIHJlZHVjZWQgcGVyZm9ybWFuY2UgdG8KKyAgYXZvaWQgYW55IGZhciBhbGxvY2F0aW9uOyBpdCB3YXMgdGVzdGVkIHdpdGggLURNQVhfV0JJVFM9MTEgLURNQVhfTUVNX0xFVkVMPTMKKwogCiBBY2tub3dsZWRnbWVudHM6CiAKQEAgLTg0LDcgKzEwOCw3IEBACiAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAKICAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBnemlwQHByZXAuYWkubWl0LmVkdSAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKIAogSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgd2Ugd291bGQgYXBwcmVjaWF0ZSAqbm90KgogcmVjZWl2aW5nIGxlbmd0aHkgbGVnYWwgZG9jdW1lbnRzIHRvIHNpZ24uIFRoZSBzb3VyY2VzIGFyZSBwcm92aWRlZApkaWZmIC0tZ2l0IGEvYWRsZXIzMi5jIGIvYWRsZXIzMi5jCmluZGV4IGM5ZGNmOTMuLjY3NWE0NmMgMTAwNjQ0Ci0tLSBhL2FkbGVyMzIuYworKysgYi9hZGxlcjMyLmMKQEAgLTEsOSArMSw5IEBACiAvKiBhZGxlcjMyLmMgLS0gY29tcHV0ZSB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YgYSBkYXRhIHN0cmVhbQotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCi0vKiAkSWQ6IGFkbGVyMzIuYyx2IDEuMTAgMTk5Ni8wNS8yMiAxMTo1MjoxOCBtZSBFeHAgJCAqLworLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlICJ6bGliLmgiCiAKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgRE8xNihidWYpICAgRE84KGJ1ZiwwKTsgRE84KGJ1Ziw4KTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCit1TG9uZyBFWFBPUlQgYWRsZXIzMihhZGxlciwgYnVmLCBsZW4pCiAgICAgdUxvbmcgYWRsZXI7CiAgICAgY29uc3QgQnl0ZWYgKmJ1ZjsKICAgICB1SW50IGxlbjsKZGlmZiAtLWdpdCBhL2FsZ29yaXRobS5kb2MgYi9hbGdvcml0aG0uZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTkwMmFmLi4wMDAwMDAwCi0tLSBhL2FsZ29yaXRobS5kb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQotCi1UaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IHpsaWIgKGFsc28gemlwIGFuZCBnemlwKSBpcyBhIHZhcmlhdGlvbiBvZgotTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCi10aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCi1wb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCi1sZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKLXRvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKLTMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcwotZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAotYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKLQotTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAotbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAotaW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55Ci1zaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KLWF2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0Ci1pdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcwotc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQotCi1EdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKLWxlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgotdGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKLXN0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCi10aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KLQotVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bwotZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgotVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCi1oYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgotCi1UbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Ci10cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAotcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Ci1wb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCi0KLWRlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgotbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yIGEKLWxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCi1wcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQotbGl0ZXJhbCBieXRlKSBhbmQgdGhlIGxvbmdlciBtYXRjaCBpcyBlbWl0dGVkIGFmdGVyd2FyZHMuICBPdGhlcndpc2UsCi10aGUgb3JpZ2luYWwgbWF0Y2ggaXMga2VwdCwgYW5kIHRoZSBuZXh0IG1hdGNoIHNlYXJjaCBpcyBhdHRlbXB0ZWQgb25seQotTiBzdGVwcyBsYXRlci4KLQotVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBhbHNvIHN1YmplY3QgdG8gYSBydW50aW1lIHBhcmFtZXRlci4gSWYKLXRoZSBjdXJyZW50IG1hdGNoIGlzIGxvbmcgZW5vdWdoLCBkZWZsYXRlKCkgcmVkdWNlcyB0aGUgc2VhcmNoIGZvciBhIGxvbmdlcgotbWF0Y2gsIHRodXMgc3BlZWRpbmcgdXAgdGhlIHdob2xlIHByb2Nlc3MuIElmIGNvbXByZXNzaW9uIHJhdGlvIGlzIG1vcmUKLWltcG9ydGFudCB0aGFuIHNwZWVkLCBkZWZsYXRlKCkgYXR0ZW1wdHMgYSBjb21wbGV0ZSBzZWNvbmQgc2VhcmNoIGV2ZW4gaWYKLXRoZSBmaXJzdCBtYXRjaCBpcyBhbHJlYWR5IGxvbmcgZW5vdWdoLgotCi1UaGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgZm9yIHRoZSBmYXN0ZXN0IGNvbXByZXNzaW9uCi1tb2RlcyAobGV2ZWwgcGFyYW1ldGVyIDEgdG8gMykuIEZvciB0aGVzZSBmYXN0IG1vZGVzLCBuZXcgc3RyaW5ncwotYXJlIGluc2VydGVkIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgd2hlbiBubyBtYXRjaCB3YXMgZm91bmQsIG9yCi13aGVuIHRoZSBtYXRjaCBpcyBub3QgdG9vIGxvbmcuIFRoaXMgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvCi1idXQgc2F2ZXMgdGltZSBzaW5jZSB0aGVyZSBhcmUgYm90aCBmZXdlciBpbnNlcnRpb25zIGFuZCBmZXdlciBzZWFyY2hlcy4KLQotCi0yLiBEZWNvbXByZXNzaW9uIGFsZ29yaXRobSAoaW5mbGF0ZSkKLQotVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGdpdmVuIGEgSHVmZm1hbiB0cmVlLCBob3cgdG8gZGVjb2RlIGZhc3QuICBUaGUgbW9zdAotaW1wb3J0YW50IHJlYWxpemF0aW9uIGlzIHRoYXQgc2hvcnRlciBjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuCi1sb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlIHNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQKLXRoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KLQotaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCi1pbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCi1zdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Ci1jb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAotdGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQotZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KLQotSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Ci10YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQotdGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKLWJlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCi1idWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKLWNvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcwotc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgc2V0IGl0Ci1mb3IgdGhlIG1heGltdW0gc3BlZWQuCi0KLWluZmxhdGUoKSBzZW5kcyBuZXcgdHJlZXMgcmVsYXRpdmVseSBvZnRlbiwgc28gaXQgaXMgcG9zc2libHkgc2V0IGZvciBhCi1zbWFsbGVyIGZpcnN0IGxldmVsIHRhYmxlIHRoYW4gYW4gYXBwbGljYXRpb24gdGhhdCBoYXMgb25seSBvbmUgdHJlZSBmb3IKLWFsbCB0aGUgZGF0YS4gIEZvciBpbmZsYXRlLCB3aGljaCBoYXMgMjg2IHBvc3NpYmxlIGNvZGVzIGZvciB0aGUKLWxpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBuaW5lIGJpdHMuICBBbHNvIHRoZQotZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZSB2YWx1ZXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGFibGUgaXMKLXNpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mIHRob3NlIGNhc2VzLCB0aGUgdGFibGUgZW5kZWQgdXAgb25lIGJpdAotbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUgbGVuZ3RoLCBpLmUuIHRoZSBjb2RlIGxlbmd0aCBvZiBhbgotYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYSBsaXR0bGUgbW9yZSB0aGFuIGVpZ2h0IGJpdHMgZm9yCi0yODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cyBmb3IgMzAgc3ltYm9scy4gIEl0IHdvdWxkIGJlCi1pbnRlcmVzdGluZyB0byBzZWUgaWYgb3B0aW1pemluZyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIG90aGVyCi1hcHBsaWNhdGlvbnMgZ2F2ZSB2YWx1ZXMgd2l0aGluIGEgYml0IG9yIHR3byBvZiB0aGUgZmxhdCBjb2RlIHNpemUuCi0KLQotSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotZ3ppcEBwcmVwLmFpLm1pdC5lZHUgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQotCi0KLVJlZmVyZW5jZXM6Ci0KLVtMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQotQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKLXBwLiAzMzctMzQzLgotCi1gYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCi1mdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS9hbGdvcml0aG0udHh0IGIvYWxnb3JpdGhtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM4MzBiCi0tLSAvZGV2L251bGwKKysrIGIvYWxnb3JpdGhtLnR4dApAQCAtMCwwICsxLDIxMyBAQAorMS4gQ29tcHJlc3Npb24gYWxnb3JpdGhtIChkZWZsYXRlKQorCitUaGUgZGVmbGF0aW9uIGFsZ29yaXRobSB1c2VkIGJ5IGd6aXAgKGFsc28gemlwIGFuZCB6bGliKSBpcyBhIHZhcmlhdGlvbiBvZgorTFo3NyAoTGVtcGVsLVppdiAxOTc3LCBzZWUgcmVmZXJlbmNlIGJlbG93KS4gSXQgZmluZHMgZHVwbGljYXRlZCBzdHJpbmdzIGluCit0aGUgaW5wdXQgZGF0YS4gIFRoZSBzZWNvbmQgb2NjdXJyZW5jZSBvZiBhIHN0cmluZyBpcyByZXBsYWNlZCBieSBhCitwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcsIGluIHRoZSBmb3JtIG9mIGEgcGFpciAoZGlzdGFuY2UsCitsZW5ndGgpLiAgRGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIDMySyBieXRlcywgYW5kIGxlbmd0aHMgYXJlIGxpbWl0ZWQKK3RvIDI1OCBieXRlcy4gV2hlbiBhIHN0cmluZyBkb2VzIG5vdCBvY2N1ciBhbnl3aGVyZSBpbiB0aGUgcHJldmlvdXMKKzMySyBieXRlcywgaXQgaXMgZW1pdHRlZCBhcyBhIHNlcXVlbmNlIG9mIGxpdGVyYWwgYnl0ZXMuICAoSW4gdGhpcworZGVzY3JpcHRpb24sIGBzdHJpbmcnIG11c3QgYmUgdGFrZW4gYXMgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGJ5dGVzLAorYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHByaW50YWJsZSBjaGFyYWN0ZXJzLikKKworTGl0ZXJhbHMgb3IgbWF0Y2ggbGVuZ3RocyBhcmUgY29tcHJlc3NlZCB3aXRoIG9uZSBIdWZmbWFuIHRyZWUsIGFuZAorbWF0Y2ggZGlzdGFuY2VzIGFyZSBjb21wcmVzc2VkIHdpdGggYW5vdGhlciB0cmVlLiBUaGUgdHJlZXMgYXJlIHN0b3JlZAoraW4gYSBjb21wYWN0IGZvcm0gYXQgdGhlIHN0YXJ0IG9mIGVhY2ggYmxvY2suIFRoZSBibG9ja3MgY2FuIGhhdmUgYW55CitzaXplIChleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIGZvciBvbmUgYmxvY2sgbXVzdCBmaXQgaW4KK2F2YWlsYWJsZSBtZW1vcnkpLiBBIGJsb2NrIGlzIHRlcm1pbmF0ZWQgd2hlbiBkZWZsYXRlKCkgZGV0ZXJtaW5lcyB0aGF0CitpdCB3b3VsZCBiZSB1c2VmdWwgdG8gc3RhcnQgYW5vdGhlciBibG9jayB3aXRoIGZyZXNoIHRyZWVzLiAoVGhpcyBpcworc29tZXdoYXQgc2ltaWxhciB0byB0aGUgYmVoYXZpb3Igb2YgTFpXLWJhc2VkIF9jb21wcmVzc18uKQorCitEdXBsaWNhdGVkIHN0cmluZ3MgYXJlIGZvdW5kIHVzaW5nIGEgaGFzaCB0YWJsZS4gQWxsIGlucHV0IHN0cmluZ3Mgb2YKK2xlbmd0aCAzIGFyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZS4gQSBoYXNoIGluZGV4IGlzIGNvbXB1dGVkIGZvcgordGhlIG5leHQgMyBieXRlcy4gSWYgdGhlIGhhc2ggY2hhaW4gZm9yIHRoaXMgaW5kZXggaXMgbm90IGVtcHR5LCBhbGwKK3N0cmluZ3MgaW4gdGhlIGNoYWluIGFyZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50IGlucHV0IHN0cmluZywgYW5kCit0aGUgbG9uZ2VzdCBtYXRjaCBpcyBzZWxlY3RlZC4KKworVGhlIGhhc2ggY2hhaW5zIGFyZSBzZWFyY2hlZCBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBzdHJpbmdzLCB0bworZmF2b3Igc21hbGwgZGlzdGFuY2VzIGFuZCB0aHVzIHRha2UgYWR2YW50YWdlIG9mIHRoZSBIdWZmbWFuIGVuY29kaW5nLgorVGhlIGhhc2ggY2hhaW5zIGFyZSBzaW5nbHkgbGlua2VkLiBUaGVyZSBhcmUgbm8gZGVsZXRpb25zIGZyb20gdGhlCitoYXNoIGNoYWlucywgdGhlIGFsZ29yaXRobSBzaW1wbHkgZGlzY2FyZHMgbWF0Y2hlcyB0aGF0IGFyZSB0b28gb2xkLgorCitUbyBhdm9pZCBhIHdvcnN0LWNhc2Ugc2l0dWF0aW9uLCB2ZXJ5IGxvbmcgaGFzaCBjaGFpbnMgYXJlIGFyYml0cmFyaWx5Cit0cnVuY2F0ZWQgYXQgYSBjZXJ0YWluIGxlbmd0aCwgZGV0ZXJtaW5lZCBieSBhIHJ1bnRpbWUgb3B0aW9uIChsZXZlbAorcGFyYW1ldGVyIG9mIGRlZmxhdGVJbml0KS4gU28gZGVmbGF0ZSgpIGRvZXMgbm90IGFsd2F5cyBmaW5kIHRoZSBsb25nZXN0Citwb3NzaWJsZSBtYXRjaCBidXQgZ2VuZXJhbGx5IGZpbmRzIGEgbWF0Y2ggd2hpY2ggaXMgbG9uZyBlbm91Z2guCisKK2RlZmxhdGUoKSBhbHNvIGRlZmVycyB0aGUgc2VsZWN0aW9uIG9mIG1hdGNoZXMgd2l0aCBhIGxhenkgZXZhbHVhdGlvbgorbWVjaGFuaXNtLiBBZnRlciBhIG1hdGNoIG9mIGxlbmd0aCBOIGhhcyBiZWVuIGZvdW5kLCBkZWZsYXRlKCkgc2VhcmNoZXMgZm9yCithIGxvbmdlciBtYXRjaCBhdCB0aGUgbmV4dCBpbnB1dCBieXRlLiBJZiBhIGxvbmdlciBtYXRjaCBpcyBmb3VuZCwgdGhlCitwcmV2aW91cyBtYXRjaCBpcyB0cnVuY2F0ZWQgdG8gYSBsZW5ndGggb2Ygb25lICh0aHVzIHByb2R1Y2luZyBhIHNpbmdsZQorbGl0ZXJhbCBieXRlKSBhbmQgdGhlIHByb2Nlc3Mgb2YgbGF6eSBldmFsdWF0aW9uIGJlZ2lucyBhZ2Fpbi4gT3RoZXJ3aXNlLAordGhlIG9yaWdpbmFsIG1hdGNoIGlzIGtlcHQsIGFuZCB0aGUgbmV4dCBtYXRjaCBzZWFyY2ggaXMgYXR0ZW1wdGVkIG9ubHkgTgorc3RlcHMgbGF0ZXIuCisKK1RoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24gaXMgYWxzbyBzdWJqZWN0IHRvIGEgcnVudGltZSBwYXJhbWV0ZXIuIElmCit0aGUgY3VycmVudCBtYXRjaCBpcyBsb25nIGVub3VnaCwgZGVmbGF0ZSgpIHJlZHVjZXMgdGhlIHNlYXJjaCBmb3IgYSBsb25nZXIKK21hdGNoLCB0aHVzIHNwZWVkaW5nIHVwIHRoZSB3aG9sZSBwcm9jZXNzLiBJZiBjb21wcmVzc2lvbiByYXRpbyBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBzcGVlZCwgZGVmbGF0ZSgpIGF0dGVtcHRzIGEgY29tcGxldGUgc2Vjb25kIHNlYXJjaCBldmVuIGlmCit0aGUgZmlyc3QgbWF0Y2ggaXMgYWxyZWFkeSBsb25nIGVub3VnaC4KKworVGhlIGxhenkgbWF0Y2ggZXZhbHVhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGZvciB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbgorbW9kZXMgKGxldmVsIHBhcmFtZXRlciAxIHRvIDMpLiBGb3IgdGhlc2UgZmFzdCBtb2RlcywgbmV3IHN0cmluZ3MKK2FyZSBpbnNlcnRlZCBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IHdoZW4gbm8gbWF0Y2ggd2FzIGZvdW5kLCBvcgord2hlbiB0aGUgbWF0Y2ggaXMgbm90IHRvbyBsb25nLiBUaGlzIGRlZ3JhZGVzIHRoZSBjb21wcmVzc2lvbiByYXRpbworYnV0IHNhdmVzIHRpbWUgc2luY2UgdGhlcmUgYXJlIGJvdGggZmV3ZXIgaW5zZXJ0aW9ucyBhbmQgZmV3ZXIgc2VhcmNoZXMuCisKKworMi4gRGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKGluZmxhdGUpCisKKzIuMSBJbnRyb2R1Y3Rpb24KKworVGhlIHJlYWwgcXVlc3Rpb24gaXMsIGdpdmVuIGEgSHVmZm1hbiB0cmVlLCBob3cgdG8gZGVjb2RlIGZhc3QuICBUaGUgbW9zdAoraW1wb3J0YW50IHJlYWxpemF0aW9uIGlzIHRoYXQgc2hvcnRlciBjb2RlcyBhcmUgbXVjaCBtb3JlIGNvbW1vbiB0aGFuCitsb25nZXIgY29kZXMsIHNvIHBheSBhdHRlbnRpb24gdG8gZGVjb2RpbmcgdGhlIHNob3J0IGNvZGVzIGZhc3QsIGFuZCBsZXQKK3RoZSBsb25nIGNvZGVzIHRha2UgbG9uZ2VyIHRvIGRlY29kZS4KKworaW5mbGF0ZSgpIHNldHMgdXAgYSBmaXJzdCBsZXZlbCB0YWJsZSB0aGF0IGNvdmVycyBzb21lIG51bWJlciBvZiBiaXRzIG9mCitpbnB1dCBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiBsb25nZXN0IGNvZGUuICBJdCBnZXRzIHRoYXQgbWFueSBiaXRzIGZyb20gdGhlCitzdHJlYW0sIGFuZCBsb29rcyBpdCB1cCBpbiB0aGUgdGFibGUuICBUaGUgdGFibGUgd2lsbCB0ZWxsIGlmIHRoZSBuZXh0Citjb2RlIGlzIHRoYXQgbWFueSBiaXRzIG9yIGxlc3MgYW5kIGhvdyBtYW55LCBhbmQgaWYgaXQgaXMsIGl0IHdpbGwgdGVsbAordGhlIHZhbHVlLCBlbHNlIGl0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgbGV2ZWwgdGFibGUgZm9yIHdoaWNoIGluZmxhdGUoKQorZ3JhYnMgbW9yZSBiaXRzIGFuZCB0cmllcyB0byBkZWNvZGUgYSBsb25nZXIgY29kZS4KKworSG93IG1hbnkgYml0cyB0byBtYWtlIHRoZSBmaXJzdCBsb29rdXAgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIHRoZSB0aW1lIGl0Cit0YWtlcyB0byBkZWNvZGUgYW5kIHRoZSB0aW1lIGl0IHRha2VzIHRvIGJ1aWxkIHRoZSB0YWJsZS4gIElmIGJ1aWxkaW5nIHRoZQordGFibGUgdG9vayBubyB0aW1lIChhbmQgaWYgeW91IGhhZCBpbmZpbml0ZSBtZW1vcnkpLCB0aGVuIHRoZXJlIHdvdWxkIG9ubHkKK2JlIGEgZmlyc3QgbGV2ZWwgdGFibGUgdG8gY292ZXIgYWxsIHRoZSB3YXkgdG8gdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsCitidWlsZGluZyB0aGUgdGFibGUgZW5kcyB1cCB0YWtpbmcgYSBsb3QgbG9uZ2VyIGZvciBtb3JlIGJpdHMgc2luY2Ugc2hvcnQKK2NvZGVzIGFyZSByZXBsaWNhdGVkIG1hbnkgdGltZXMgaW4gc3VjaCBhIHRhYmxlLiAgV2hhdCBpbmZsYXRlKCkgZG9lcyBpcworc2ltcGx5IHRvIG1ha2UgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBmaXJzdCB0YWJsZSBhIHZhcmlhYmxlLCBhbmQgc2V0IGl0Citmb3IgdGhlIG1heGltdW0gc3BlZWQuCisKK2luZmxhdGUoKSBzZW5kcyBuZXcgdHJlZXMgcmVsYXRpdmVseSBvZnRlbiwgc28gaXQgaXMgcG9zc2libHkgc2V0IGZvciBhCitzbWFsbGVyIGZpcnN0IGxldmVsIHRhYmxlIHRoYW4gYW4gYXBwbGljYXRpb24gdGhhdCBoYXMgb25seSBvbmUgdHJlZSBmb3IKK2FsbCB0aGUgZGF0YS4gIEZvciBpbmZsYXRlLCB3aGljaCBoYXMgMjg2IHBvc3NpYmxlIGNvZGVzIGZvciB0aGUKK2xpdGVyYWwvbGVuZ3RoIHRyZWUsIHRoZSBzaXplIG9mIHRoZSBmaXJzdCB0YWJsZSBpcyBuaW5lIGJpdHMuICBBbHNvIHRoZQorZGlzdGFuY2UgdHJlZXMgaGF2ZSAzMCBwb3NzaWJsZSB2YWx1ZXMsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgdGFibGUgaXMKK3NpeCBiaXRzLiAgTm90ZSB0aGF0IGZvciBlYWNoIG9mIHRob3NlIGNhc2VzLCB0aGUgdGFibGUgZW5kZWQgdXAgb25lIGJpdAorbG9uZ2VyIHRoYW4gdGhlIGBgYXZlcmFnZScnIGNvZGUgbGVuZ3RoLCBpLmUuIHRoZSBjb2RlIGxlbmd0aCBvZiBhbgorYXBwcm94aW1hdGVseSBmbGF0IGNvZGUgd2hpY2ggd291bGQgYmUgYSBsaXR0bGUgbW9yZSB0aGFuIGVpZ2h0IGJpdHMgZm9yCisyODYgc3ltYm9scyBhbmQgYSBsaXR0bGUgbGVzcyB0aGFuIGZpdmUgYml0cyBmb3IgMzAgc3ltYm9scy4gIEl0IHdvdWxkIGJlCitpbnRlcmVzdGluZyB0byBzZWUgaWYgb3B0aW1pemluZyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIG90aGVyCithcHBsaWNhdGlvbnMgZ2F2ZSB2YWx1ZXMgd2l0aGluIGEgYml0IG9yIHR3byBvZiB0aGUgZmxhdCBjb2RlIHNpemUuCisKKworMi4yIE1vcmUgZGV0YWlscyBvbiB0aGUgaW5mbGF0ZSB0YWJsZSBsb29rdXAKKworT2ssIHlvdSB3YW50IHRvIGtub3cgd2hhdCB0aGlzIGNsZXZlcmx5IG9iZnVzY2F0ZWQgaW5mbGF0ZSB0cmVlIGFjdHVhbGx5ICAKK2xvb2tzIGxpa2UuICBZb3UgYXJlIGNvcnJlY3QgdGhhdCBpdCdzIG5vdCBhIEh1ZmZtYW4gdHJlZS4gIEl0IGlzIHNpbXBseSBhICAKK2xvb2t1cCB0YWJsZSBmb3IgdGhlIGZpcnN0LCBsZXQncyBzYXksIG5pbmUgYml0cyBvZiBhIEh1ZmZtYW4gc3ltYm9sLiAgVGhlICAKK3N5bWJvbCBjb3VsZCBiZSBhcyBzaG9ydCBhcyBvbmUgYml0IG9yIGFzIGxvbmcgYXMgMTUgYml0cy4gIElmIGEgcGFydGljdWxhciAgCitzeW1ib2wgaXMgc2hvcnRlciB0aGFuIG5pbmUgYml0cywgdGhlbiB0aGF0IHN5bWJvbCdzIHRyYW5zbGF0aW9uIGlzIGR1cGxpY2F0ZWQKK2luIGFsbCB0aG9zZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aCB0aGF0IHN5bWJvbCdzIGJpdHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlICAKK3N5bWJvbCBpcyBmb3VyIGJpdHMsIHRoZW4gaXQncyBkdXBsaWNhdGVkIDMyIHRpbWVzIGluIGEgbmluZS1iaXQgdGFibGUuICBJZiBhICAKK3N5bWJvbCBpcyBuaW5lIGJpdHMgbG9uZywgaXQgYXBwZWFycyBpbiB0aGUgdGFibGUgb25jZS4KKworSWYgdGhlIHN5bWJvbCBpcyBsb25nZXIgdGhhbiBuaW5lIGJpdHMsIHRoZW4gdGhhdCBlbnRyeSBpbiB0aGUgdGFibGUgcG9pbnRzICAKK3RvIGFub3RoZXIgc2ltaWxhciB0YWJsZSBmb3IgdGhlIHJlbWFpbmluZyBiaXRzLiAgQWdhaW4sIHRoZXJlIGFyZSBkdXBsaWNhdGVkICAKK2VudHJpZXMgYXMgbmVlZGVkLiAgVGhlIGlkZWEgaXMgdGhhdCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBzeW1ib2wgd2lsbCBiZSBzaG9ydAorYW5kIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgdGFibGUgbG9vayB1cC4gIChUaGF0J3Mgd2hvbGUgaWRlYSBiZWhpbmQgZGF0YSAgCitjb21wcmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuKSAgRm9yIHRoZSBsZXNzIGZyZXF1ZW50IGxvbmcgc3ltYm9scywgdGhlcmUgIAord2lsbCBiZSB0d28gbG9va3Vwcy4gIElmIHlvdSBoYWQgYSBjb21wcmVzc2lvbiBtZXRob2Qgd2l0aCByZWFsbHkgbG9uZyAgCitzeW1ib2xzLCB5b3UgY291bGQgaGF2ZSBhcyBtYW55IGxldmVscyBvZiBsb29rdXBzIGFzIGlzIGVmZmljaWVudC4gIEZvciAgCitpbmZsYXRlLCB0d28gaXMgZW5vdWdoLgorCitTbyBhIHRhYmxlIGVudHJ5IGVpdGhlciBwb2ludHMgdG8gYW5vdGhlciB0YWJsZSAoaW4gd2hpY2ggY2FzZSBuaW5lIGJpdHMgaW4gIAordGhlIGFib3ZlIGV4YW1wbGUgYXJlIGdvYmJsZWQpLCBvciBpdCBjb250YWlucyB0aGUgdHJhbnNsYXRpb24gZm9yIHRoZSBzeW1ib2wgIAorYW5kIHRoZSBudW1iZXIgb2YgYml0cyB0byBnb2JibGUuICBUaGVuIHlvdSBzdGFydCBhZ2FpbiB3aXRoIHRoZSBuZXh0ICAKK3VuZ29iYmxlZCBiaXQuCisKK1lvdSBtYXkgd29uZGVyOiB3aHkgbm90IGp1c3QgaGF2ZSBvbmUgbG9va3VwIHRhYmxlIGZvciBob3cgZXZlciBtYW55IGJpdHMgdGhlICAKK2xvbmdlc3Qgc3ltYm9sIGlzPyAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHlvdSBkbyB0aGF0LCB5b3UgZW5kIHVwIHNwZW5kaW5nICAKK21vcmUgdGltZSBmaWxsaW5nIGluIGR1cGxpY2F0ZSBzeW1ib2wgZW50cmllcyB0aGFuIHlvdSBkbyBhY3R1YWxseSBkZWNvZGluZy4gICAKK0F0IGxlYXN0IGZvciBkZWZsYXRlJ3Mgb3V0cHV0IHRoYXQgZ2VuZXJhdGVzIG5ldyB0cmVlcyBldmVyeSBzZXZlcmFsIDEwJ3Mgb2YgIAora2J5dGVzLiAgWW91IGNhbiBpbWFnaW5lIHRoYXQgZmlsbGluZyBpbiBhIDJeMTUgZW50cnkgdGFibGUgZm9yIGEgMTUtYml0IGNvZGUgIAord291bGQgdGFrZSB0b28gbG9uZyBpZiB5b3UncmUgb25seSBkZWNvZGluZyBzZXZlcmFsIHRob3VzYW5kIHN5bWJvbHMuICBBdCB0aGUgIAorb3RoZXIgZXh0cmVtZSwgeW91IGNvdWxkIG1ha2UgYSBuZXcgdGFibGUgZm9yIGV2ZXJ5IGJpdCBpbiB0aGUgY29kZS4gIEluIGZhY3QsCit0aGF0J3MgZXNzZW50aWFsbHkgYSBIdWZmbWFuIHRyZWUuICBCdXQgdGhlbiB5b3Ugc3BlbmQgdHdvIG11Y2ggdGltZSAgCit0cmF2ZXJzaW5nIHRoZSB0cmVlIHdoaWxlIGRlY29kaW5nLCBldmVuIGZvciBzaG9ydCBzeW1ib2xzLgorCitTbyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBmaXJzdCBsb29rdXAgdGFibGUgaXMgYSB0cmFkZSBvZiB0aGUgdGltZSB0byAgCitmaWxsIG91dCB0aGUgdGFibGUgdnMuIHRoZSB0aW1lIHNwZW50IGxvb2tpbmcgYXQgdGhlIHNlY29uZCBsZXZlbCBhbmQgYWJvdmUgb2YKK3RoZSB0YWJsZS4KKworSGVyZSBpcyBhbiBleGFtcGxlLCBzY2FsZWQgZG93bjoKKworVGhlIGNvZGUgYmVpbmcgZGVjb2RlZCwgd2l0aCAxMCBzeW1ib2xzLCBmcm9tIDEgdG8gNiBiaXRzIGxvbmc6CisKK0E6IDAKK0I6IDEwCitDOiAxMTAwCitEOiAxMTAxMAorRTogMTEwMTEKK0Y6IDExMTAwCitHOiAxMTEwMQorSDogMTExMTAKK0k6IDExMTExMAorSjogMTExMTExCisKK0xldCdzIG1ha2UgdGhlIGZpcnN0IHRhYmxlIHRocmVlIGJpdHMgbG9uZyAoZWlnaHQgZW50cmllcyk6CisKKzAwMDogQSwxCiswMDE6IEEsMQorMDEwOiBBLDEKKzAxMTogQSwxCisxMDA6IEIsMgorMTAxOiBCLDIKKzExMDogLT4gdGFibGUgWCAoZ29iYmxlIDMgYml0cykKKzExMTogLT4gdGFibGUgWSAoZ29iYmxlIDMgYml0cykKKworRWFjaCBlbnRyeSBpcyB3aGF0IHRoZSBiaXRzIGRlY29kZSB0byBhbmQgaG93IG1hbnkgYml0cyB0aGF0IGlzLCBpLmUuIGhvdyAgCittYW55IGJpdHMgdG8gZ29iYmxlLiAgT3IgdGhlIGVudHJ5IHBvaW50cyB0byBhbm90aGVyIHRhYmxlLCB3aXRoIHRoZSBudW1iZXIgb2YKK2JpdHMgdG8gZ29iYmxlIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSB0YWJsZS4KKworVGFibGUgWCBpcyB0d28gYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTAgaXMgZml2ZSBiaXRzCitsb25nOgorCiswMDogQywxCiswMTogQywxCisxMDogRCwyCisxMTogRSwyCisKK1RhYmxlIFkgaXMgdGhyZWUgYml0cyBsb25nIHNpbmNlIHRoZSBsb25nZXN0IGNvZGUgc3RhcnRpbmcgd2l0aCAxMTEgaXMgc2l4ICAKK2JpdHMgbG9uZzoKKworMDAwOiBGLDIKKzAwMTogRiwyCiswMTA6IEcsMgorMDExOiBHLDIKKzEwMDogSCwyCisxMDE6IEgsMgorMTEwOiBJLDMKKzExMTogSiwzCisKK1NvIHdoYXQgd2UgaGF2ZSBoZXJlIGFyZSB0aHJlZSB0YWJsZXMgd2l0aCBhIHRvdGFsIG9mIDIwIGVudHJpZXMgdGhhdCBoYWQgdG8gIAorYmUgY29uc3RydWN0ZWQuICBUaGF0J3MgY29tcGFyZWQgdG8gNjQgZW50cmllcyBmb3IgYSBzaW5nbGUgdGFibGUuICBPciAgCitjb21wYXJlZCB0byAxNiBlbnRyaWVzIGZvciBhIEh1ZmZtYW4gdHJlZSAoc2l4IHR3byBlbnRyeSB0YWJsZXMgYW5kIG9uZSBmb3VyICAKK2VudHJ5IHRhYmxlKS4gIEFzc3VtaW5nIHRoYXQgdGhlIGNvZGUgaWRlYWxseSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSBvZiAgCit0aGUgc3ltYm9scywgaXQgdGFrZXMgb24gdGhlIGF2ZXJhZ2UgMS4yNSBsb29rdXBzIHBlciBzeW1ib2wuICBUaGF0J3MgY29tcGFyZWQKK3RvIG9uZSBsb29rdXAgZm9yIHRoZSBzaW5nbGUgdGFibGUsIG9yIDEuNjYgbG9va3VwcyBwZXIgc3ltYm9sIGZvciB0aGUgIAorSHVmZm1hbiB0cmVlLgorCitUaGVyZSwgSSB0aGluayB0aGF0IGdpdmVzIHlvdSBhIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLiAgRm9yIGluZmxhdGUsIHRoZSAgCittZWFuaW5nIG9mIGEgcGFydGljdWxhciBzeW1ib2wgaXMgb2Z0ZW4gbW9yZSB0aGFuIGp1c3QgYSBsZXR0ZXIuICBJdCBjYW4gYmUgYSAgCitieXRlIChhICJsaXRlcmFsIiksIG9yIGl0IGNhbiBiZSBlaXRoZXIgYSBsZW5ndGggb3IgYSBkaXN0YW5jZSB3aGljaCAgCitpbmRpY2F0ZXMgYSBiYXNlIHZhbHVlIGFuZCBhIG51bWJlciBvZiBiaXRzIHRvIGZldGNoIGFmdGVyIHRoZSBjb2RlIHRoYXQgaXMgIAorYWRkZWQgdG8gdGhlIGJhc2UgdmFsdWUuICBPciBpdCBtaWdodCBiZSB0aGUgc3BlY2lhbCBlbmQtb2YtYmxvY2sgY29kZS4gIFRoZSAgCitkYXRhIHN0cnVjdHVyZXMgY3JlYXRlZCBpbiBpbmZ0cmVlcy5jIHRyeSB0byBlbmNvZGUgYWxsIHRoYXQgaW5mb3JtYXRpb24gIAorY29tcGFjdGx5IGluIHRoZSB0YWJsZXMuCisKKworSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgoramxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQorCisKK1JlZmVyZW5jZXM6CisKK1tMWjc3XSBaaXYgSi4sIExlbXBlbCBBLiwgYGBBIFVuaXZlcnNhbCBBbGdvcml0aG0gZm9yIFNlcXVlbnRpYWwgRGF0YQorQ29tcHJlc3Npb24sJycgSUVFRSBUcmFuc2FjdGlvbnMgb24gSW5mb3JtYXRpb24gVGhlb3J5LCBWb2wuIDIzLCBOby4gMywKK3BwLiAzMzctMzQzLgorCitgYERFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uJycgYXZhaWxhYmxlIGluCitmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CmRpZmYgLS1naXQgYS9jb21wcmVzcy5jIGIvY29tcHJlc3MuYwppbmRleCA1OTBjNDUxLi43YmUwYjNkIDEwMDY0NAotLS0gYS9jb21wcmVzcy5jCisrKyBiL2NvbXByZXNzLmMKQEAgLTEsOSArMSw5IEBACiAvKiBjb21wcmVzcy5jIC0tIGNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKLS8qICRJZDogY29tcHJlc3MuYyx2IDEuMTAgMTk5Ni8wNS8yMyAxNjo1MToxMiBtZSBFeHAgJCAqLworLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlICJ6bGliLmgiCiAKQEAgLTE5LDcgKzE5LDcgQEAKICAgIGVub3VnaCBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dAogICAgYnVmZmVyLgogKi8KLWludCBjb21wcmVzcyAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4pCitpbnQgRVhQT1JUIGNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKICAgICBCeXRlZiAqZGVzdDsKICAgICB1TG9uZ2YgKmRlc3RMZW47CiAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZTsKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBhMzU0ZTRjLi41MjBkMjA1IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC00LDYgKzQsMTAgQEAKICMgb2YgaWYgeW91IG5lZWQgc3BlY2lhbCBjb21waWxlciwgZmxhZ3Mgb3IgaW5zdGFsbCBkaXJlY3RvcnkuCiAjIE90aGVyd2lzZSwgeW91IGNhbiBqdXN0IHVzZSBkaXJlY3RseSAibWFrZSB0ZXN0OyBtYWtlIGluc3RhbGwiCiAjCisjIFRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5LCB1c2UgImNvbmZpZ3VyZSAtLXNoYXJlZCI7IGJ5IGRlZmF1bHQgYSBzdGF0aWMKKyMgbGlicmFyeSBpcyBjcmVhdGVkLiBJZiB0aGUgcHJpbWl0aXZlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcHJvdmlkZWQgaGVyZQorIyBkb2VzIG5vdCB3b3JrLCB1c2UgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvbGlidG9vbC0qLnRhci5negorIwogIyBUbyBpbXBvc2Ugc3BlY2lmaWMgY29tcGlsZXIgb3IgZmxhZ3Mgb3IgaW5zdGFsbCBkaXJlY3RvcnksIHVzZSBmb3IgZXhhbXBsZToKICMgICAgcHJlZml4PSRIT01FIENDPWNjIENGTEFHUz0iLU80IiAuL2NvbmZpZ3VyZQogIyBvciBmb3IgY3NoL3Rjc2ggdXNlcnM6CkBAIC0xMSwyMiArMTUsMzMgQEAKICMgTERTSEFSRUQgaXMgdGhlIGNvbW1hbmQgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeQogCiBMSUJTPWxpYnouYQorU0hBUkVETElCPWxpYnouc28KIFZFUj1gc2VkIC1uIC1lICcvVkVSU0lPTiAiL3MvLioiXCguKlwpIi4qL1wxL3AnIDwgemxpYi5oYAogQVI9JHtBUi0iYXIgcmMifQogUkFOTElCPSR7UkFOTElCLSJyYW5saWIifQogcHJlZml4PSR7cHJlZml4LS91c3IvbG9jYWx9CiBleGVjX3ByZWZpeD0ke2V4ZWNfcHJlZml4LSRwcmVmaXh9CitzaGFyZWRfZXh0PScuc28nCitzaGFyZWQ9MAorCitjYXNlICIkMSIgaW4KKyAgLXMqIHwgLS1zKikgc2hhcmVkPTE7IHNoaWZ0OzsKKyAgLWgqIHwgLS1oKikgZWNobyAnc3ludGF4OiBjb25maWd1cmUgWyAtLXNoYXJlZCBdJzsgZXhpdCAwOzsKK2VzYWMKIAogdGVzdCAteiAiJENDIiAmJiBlY2hvIENoZWNraW5nIGZvciBnY2MuLi4KIHRlc3Q9enRlc3QkJAogY2F0ID4gJHRlc3QuYyA8PEVPRgogaW50IGhlbGxvKCkgeyBwcmludGYoImhlbGxvXG4iKTsgfQogRU9GCi1pZiB0ZXN0IC16ICIkQ0MiICYmIChnY2MgLWMgLU8zICR0ZXN0LmMpIDI+L2Rldi9udWxsOyB0aGVuCitpZiB0ZXN0IC16ICIkQ0MiIC1vICIkQ0MiID0gImdjYyIgJiYgKGdjYyAtYyAtTzMgJHRlc3QuYykgMj4vZGV2L251bGw7IHRoZW4KICAgQ0M9Z2NjCiAgIFNGTEFHUz0ke0NGTEFHUy0iLWZQSUMgLU8zIn0KICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzMifQotICBMRFNIQVJFRD0ke0xEU0hBUkVELSJnY2MgLXNoYXJlZCJ9CisgIGNhc2UgYCh1bmFtZSAtcyB8fCBlY2hvIHVua25vd24pIDI+L2Rldi9udWxsYCBpbgorICBMaW51eCB8IGxpbnV4KSBMRFNIQVJFRD0ke0xEU0hBUkVELSJnY2MgLXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJ6LnNvLjEifTs7CisgICopICAgICAgICAgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImdjYyAtc2hhcmVkIn07OworICBlc2FjCiBlbHNlCiAgICMgZmluZCBzeXN0ZW0gbmFtZSBhbmQgY29ycmVzcG9uZGluZyBjYyBvcHRpb25zCiAgIENDPSR7Q0MtY2N9CkBAIC01MCwzNSArNjUsNTUgQEAKIAkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1keSAtS1BJQyAtRyJ9OzsKICAgSFAtVVgqKSAgICBTRkxBR1M9JHtDRkxBR1MtIi1PICt6In0KIAkgICAgIENGTEFHUz0ke0NGTEFHUy0iLU8ifQotCSAgICAgTERTSEFSRUQ9JHtMRFNIQVJFRC0ibGQgLWIifQotCSAgICAgU0hBUkVETElCUz0nbGliei5zbCc7OwotICAjIHNlbmQgd29ya2luZyBvcHRpb25zIGZvciBvdGhlciBzeXN0ZW1zIHRvIGd6aXBAcHJlcC5haS5taXQuZWR1CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJsZCAtYiArdm5vY29tcGF0d2FybmluZ3MifQorCSAgICAgc2hhcmVkX2V4dD0nLnNsJworCSAgICAgU0hBUkVETElCPSdsaWJ6LnNsJzs7CisgIFVOSVhfU3lzdGVtX1ZcIDQuMi4wKSAKKwkgICAgIFNGTEFHUz0ke0NGTEFHUy0iLUtQSUMgLU8ifQorCSAgICAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CisJICAgICBMRFNIQVJFRD0ke0xEU0hBUkVELSJjYyAtRyJ9OzsKKyAgIyBzZW5kIHdvcmtpbmcgb3B0aW9ucyBmb3Igb3RoZXIgc3lzdGVtcyB0byBzdXBwb3J0QGd6aXAub3JnCiAgICopICAgICAgICAgU0ZMQUdTPSR7Q0ZMQUdTLSItTyJ9CiAJICAgICBDRkxBR1M9JHtDRkxBR1MtIi1PIn0KIAkgICAgIExEU0hBUkVEPSR7TERTSEFSRUQtImNjIC1zaGFyZWQifTs7CiAgIGVzYWMKIGZpCiAKLWVjaG8gQ2hlY2tpbmcgZm9yIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuLi4KLSMgd2UgbXVzdCB0ZXN0IGluIHR3byBzdGVwcyAoY2MgdGhlbiBsZCksIHJlcXVpcmVkIGF0IGxlYXN0IG9uIFN1bk9TIDQueAotaWYgdGVzdCAiYCgkQ0MgLWMgJFNGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIiAmJgotICAgdGVzdCAiYCgkTERTSEFSRUQgLW8gJHRlc3Quc28gJHRlc3QubykgMj4mMWAiID0gIiI7IHRoZW4KLSAgQ0ZMQUdTPSIkU0ZMQUdTIgotICBMSUJTPSdsaWJ6LnNvLiQoVkVSKScKLSAgZWNobyBCdWlsZGluZyBzaGFyZWQgbGlicmFyeSBsaWJ6LnNvLiRWRVIgd2l0aCAkQ0MuCi1lbHNlCitpZiB0ZXN0ICRzaGFyZWQgLWVxIDE7IHRoZW4KKyAgZWNobyBDaGVja2luZyBmb3Igc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4uLgorICAjIHdlIG11c3QgdGVzdCBpbiB0d28gc3RlcHMgKGNjIHRoZW4gbGQpLCByZXF1aXJlZCBhdCBsZWFzdCBvbiBTdW5PUyA0LngKKyAgaWYgdGVzdCAiYCgkQ0MgLWMgJFNGTEFHUyAkdGVzdC5jKSAyPiYxYCIgPSAiIiAmJgorICAgICB0ZXN0ICJgKCRMRFNIQVJFRCAtbyAkdGVzdCRzaGFyZWRfZXh0ICR0ZXN0Lm8pIDI+JjFgIiA9ICIiOyB0aGVuCisgICAgQ0ZMQUdTPSIkU0ZMQUdTIgorICAgIExJQlM9IiRTSEFSRURMSUIuJFZFUiIKKyAgICBlY2hvIEJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJ5ICRTSEFSRURMSUIuJFZFUiB3aXRoICRDQy4KKyAgZWxzZQorICAgIGVjaG8gTm8gc2hhcmVkIGxpYnJhcnkgc3VwcHBvcnQuCisgICAgc2hhcmVkPTA7CisgIGZpCitmaQoraWYgdGVzdCAkc2hhcmVkIC1lcSAwOyB0aGVuCiAgIExEU0hBUkVEPSIkQ0MiCiAgIGVjaG8gQnVpbGRpbmcgc3RhdGljIGxpYnJhcnkgJExJQlMgdmVyc2lvbiAkVkVSIHdpdGggJENDLgogZmkKLXJtIC1mICR0ZXN0Lltjb10gJHRlc3Quc28KK3JtIC1mICR0ZXN0Lltjb10gJHRlc3Qkc2hhcmVkX2V4dAorCitpZiB0ZXN0IC1mIC91c3IvaW5jbHVkZS91bmlzdGQuaDsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgLURIQVZFX1VOSVNURF9IIgorZmkKKworaWYgdGVzdCAhIC1mIC91c3IvaW5jbHVkZS9lcnJuby5oOyB0aGVuCisgIENGTEFHUz0iJENGTEFHUyAtRE5PX0VSUk5PX0giCitmaQogCiAjIHVkcGF0ZSBNYWtlZmlsZQogc2VkIDwgTWFrZWZpbGUuaW4gIgotL15DQyAqPS9zLz0uKi89JENDLworL15DQyAqPS9zLD0uKiw9JENDLAogL15DRkxBR1MgKj0vcy89LiovPSRDRkxBR1MvCi0vXkxEU0hBUkVEICo9L3MvPS4qLz0kTERTSEFSRUQvCisvXkxEU0hBUkVEICo9L3MlPS4qJT0kTERTSEFSRUQlCiAvXkxJQlMgKj0vcyw9LiosPSRMSUJTLAotL15BUiAqPS9zLz0uKi89JEFSLworL15TSEFSRURMSUIgKj0vcyw9LiosPSRTSEFSRURMSUIsCisvXkFSICo9L3MsPS4qLD0kQVIsCiAvXlJBTkxJQiAqPS9zLD0uKiw9JFJBTkxJQiwKIC9eVkVSICo9L3MvPS4qLz0kVkVSLwogL15wcmVmaXggKj0vcyw9LiosPSRwcmVmaXgsCmRpZmYgLS1naXQgYS9jb250cmliL1JFQURNRS5jb250cmliIGIvY29udHJpYi9SRUFETUUuY29udHJpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ViMWUzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SRUFETUUuY29udHJpYgpAQCAtMCwwICsxLDIxIEBACitBbGwgZmlsZXMgdW5kZXIgdGhpcyBjb250cmliIGRpcmVjdG9yeSBhcmUgVU5TVVBQT1JURUQuIFRoZXJlIHdlcmUKK3Byb3ZpZGVkIGJ5IHVzZXJzIG9mIHpsaWIgYW5kIHdlcmUgbm90IHRlc3RlZCBieSB0aGUgYXV0aG9ycyBvZiB6bGliLgorVXNlIGF0IHlvdXIgb3duIHJpc2suIFBsZWFzZSBjb250YWN0IHRoZSBhdXRob3JzIG9mIHRoZSBjb250cmlidXRpb25zCitmb3IgaGVscCBhYm91dCB0aGVzZSwgbm90IHRoZSB6bGliIGF1dGhvcnMuIFRoYW5rcy4KKworCithc20zODYvICAgICBieSBHaWxsZXMgVm9sbGFudCA8aW5mb0B3aW5pbWFnZS5jb20+CisJMzg2IGFzbSBjb2RlIHJlcGxhY2luZyBsb25nZXN0X21hdGNoKCkuIFRoaXMgY29kZSBtYXkgYmUgc2xvd2VyCisgICAgICAgIHRoYW4gdGhlIEMgY29kZSBpZiB5b3UgaGF2ZSBhIGdvb2QgY29tcGlsZXIuCisKK2lvc3RyZWFtLyAgIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1PgorICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucworCitpb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPgorCUFub3RoZXIgQysrIEkvTyBzdHJlYW1zIGludGVyZmFjZQorCit1bnRnei8gICAgICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKwlBIHZlcnkgc2ltcGxlIHRhci5neiBmaWxlIGV4dHJhY3RvciB1c2luZyB6bGliCisKK3Zpc3VhbC1iYXNpYy50eHQgYnkgQ2FybG9zIFJpb3MgPGNfcmlvc0Bzb25kYS5jbD4KKyAgICAgICAgSG93IHRvIHVzZSBjb21wcmVzcygpLCB1bmNvbXByZXNzKCkgYW5kIHRoZSBneiogZnVuY3Rpb25zIGZyb20gVkIuCmRpZmYgLS1naXQgYS9jb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbSBiL2NvbnRyaWIvYXNtMzg2L2d2bWF0MzIuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzU4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2FzbTM4Ni9ndm1hdDMyLmFzbQpAQCAtMCwwICsxLDQ2NCBAQAorOworOyBndm1hdDMyLmFzbSAtLSBBc20gcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2Cis7IENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkgYW5kIEdpbGxlcyBWb2xsYW50LgorOyBGaWxlIHdyaXR0ZW4gYnkgR2lsbGVzIFZvbGxhbnQsIGJ5IG1vZGlmaXlpbmcgdGhlIGxvbmdlc3RfbWF0Y2gKKzsgIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMKKzsgSXQgbmVlZCB3bWFzayA9PSAweDdmZmYKKzsgICAgIChhc3NlbWJseSBjb2RlIGlzIGZhc3RlciB3aXRoIGEgZml4ZWQgd21hc2spCis7Cis7IEZvciBWaXN1YWwgQysrIDQuMiBhbmQgTUwgNi4xMWMgKHZlcnNpb24gaW4gZGlyZWN0b3J5IFxNQVNNNjExQyBvZiBXaW45NSBEREspCis7ICAgSSBjb21waWxlIHdpdGggOiAibWwgL2NvZmYgL1ppIC9jIGd2bWF0MzIuYXNtIgorOworOyB1SW50IGxvbmdlc3RfbWF0Y2hfZ3Zhc20oSVBvcyBjdXJfbWF0Y2gsaW50KiBtYXRjaF9zdGFydF9wdHIsdUludCBzY2FuX2VuZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgc2Nhbl9zdGFydCx1c2gqIHByZXYsdWNoKiB3aW5kb3csaW50IGJlc3RfbGVuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgSVBvcyBsaW1pdCx1SW50IGNoYWluX2xlbmd0aCx1Y2gqIHNjYW5ycCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgbmljZV9tYXRjaCk7CisKKzt1SW50IGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKQorOyAgICBkZWZsYXRlX3N0YXRlICpzOworOyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KKworCU5iU3RhY2sJCWVxdQk3NgorCWN1cl9tYXRjaAllcXUJZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTBdCisJc3RyX3MJCWVxdQlkd29yZCBwdHJbZXNwK05iU3RhY2stNF0KKwk7IDUgZHdvcmQgb24gdG9wIChyZXQsZWJwLGVzaSxlZGksZWJ4KQorCWFkcnJldAkJZXF1CWR3b3JkIHB0cltlc3ArTmJTdGFjay04XQorCXB1c2hlYnAJCWVxdQlkd29yZCBwdHJbZXNwK05iU3RhY2stMTJdCisJcHVzaGVkaQkJZXF1CWR3b3JkIHB0cltlc3ArTmJTdGFjay0xNl0KKwlwdXNoZXNpCQllcXUJZHdvcmQgcHRyW2VzcCtOYlN0YWNrLTIwXQorCXB1c2hlYngJCWVxdQlkd29yZCBwdHJbZXNwK05iU3RhY2stMjRdCisKKwljaGFpbl9sZW5ndGggICAgZXF1IGR3b3JkIHB0ciBbZXNwK05iU3RhY2stMjhdCisJbGltaXQgICAgICAgICAgIGVxdSBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTMyXQorCWJlc3RfbGVuICAgICAgICBlcXUgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay0zNl0KKwl3aW5kb3cgICAgICAgICAgZXF1IGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNDBdCisJcHJldiAgICAgICAgICAgIGVxdSBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTQ0XQorCXNjYW5fc3RhcnQgICAgICBlcXUgIHdvcmQgcHRyIFtlc3ArTmJTdGFjay00OF0KKwlzY2FuX2VuZCAgICAgICAgZXF1ICB3b3JkIHB0ciBbZXNwK05iU3RhY2stNTJdCisJbWF0Y2hfc3RhcnRfcHRyIGVxdSBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTU2XQorCW5pY2VfbWF0Y2ggICAgICBlcXUgZHdvcmQgcHRyIFtlc3ArTmJTdGFjay02MF0KKwlzY2FucnAgICAgICAgICAgZXF1IGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjRdCisKKwl3aW5kb3dsZW4gICAgICAgZXF1IGR3b3JkIHB0ciBbZXNwK05iU3RhY2stNjhdCisJbWF0Y2hfc3RhcnQgICAgIGVxdSBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTcyXQorCXN0cmVuZAkJCWVxdSBkd29yZCBwdHIgW2VzcCtOYlN0YWNrLTc2XQorCU5iU3RhY2tBZGQJCWVxdQkoNzYtMjQpCisKKyAgICAuMzg2cAorCisgICAgbmFtZSAgICBndm1hdGNoCisgICAgLk1PREVMICBGTEFUCisKKworQGxtdHlwZQkJCQlUWVBFREVGICAgICAgICAgUFJPVE8gQyA6UFRSICwgOlNEV09SRAorbG9uZ2VzdF9tYXRjaF9jCQlQUk9UTyAgICAgICAgICAgQGxtdHlwZQorCisJZGVwX21heF9jaGFpbl9sZW5ndGgJZXF1CTcwaAorCWRlcF93aW5kb3cJCQkJZXF1CTJjaAorCWRlcF9zdHJzdGFydAkJCWVxdQk2MGgKKwlkZXBfcHJldl9sZW5ndGgJCQllcXUgNmNoCisJZGVwX25pY2VfbWF0Y2gJCQllcXUgODRoCisJZGVwX3dfc2l6ZQkJCQllcXUJMjBoCisJZGVwX3ByZXYJCQkJZXF1CTM0aAorCWRlcF93X21hc2sJCQkJZXF1CTI4aAorCWRlcF9nb29kX21hdGNoCQkJZXF1IDgwaAorCWRlcF9tYXRjaF9zdGFydAkJCWVxdQk2NGgKKwlkZXBfbG9va2FoZWFkCQkJZXF1CTY4aAorCisKK19URVhUICAgc2VnbWVudAorICAgIHB1YmxpYyAgX2xvbmdlc3RfbWF0Y2hfYXNtN2ZmZgorCisgICAgTUFYX01BVENICQllcXUgMjU4CisJTUlOX01BVENICQllcXUgMworCU1JTl9MT09LQUhFQUQgZXF1IChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisKKzsgaW5pdGlhbGl6ZSBvciBjaGVjayB0aGUgdmFyaWFibGVzIHVzZWQgaW4gbWF0Y2guYXNtLgorCisKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCis7IHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKKzsgaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpcworOyBnYXJiYWdlLgorOyBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50Cis7ICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDEKKworOyBpbnQgbG9uZ2VzdF9tYXRjaChjdXJfbWF0Y2gpCisKK19sb25nZXN0X21hdGNoX2FzbTdmZmYgcHJvYyBuZWFyCisKKworCisJICAgIDsgcmV0dXJuIGFkZHJlc3MKKworCQltb3YJCWVheCxbZXNwKzRdCisJCW1vdgkJYngsW2VheCtkZXBfd19tYXNrXQorCQljbXAJCWJ4LDdmZmZoCisJCWpuegkJbG9uZ2VzdF9tYXRjaF9jCisKKwkgICAgcHVzaCAgICBlYnAgICAgICAgICAgICAgCisJICAgIHB1c2ggICAgZWRpICAgICAgICAgICAgIAorCSAgICBwdXNoICAgIGVzaSAgICAgICAgICAgICAKKwkgICAgcHVzaCAgICBlYnggICAgICAgICAgICAgCisKKwkgICAgc3ViICAgICBlc3AsTmJTdGFja0FkZAorCisJCTsvL21vdgkJZWJwLHN0cl9zCisJCW1vdgkJZWJwLGVheAorCisJCW1vdgkJZWF4LFtlYnArZGVwX21heF9jaGFpbl9sZW5ndGhdCisJCW1vdgkJZWJ4LFtlYnArZGVwX3ByZXZfbGVuZ3RoXQorCQljbXAJCVtlYnArZGVwX2dvb2RfbWF0Y2hdLGVieAk7IGlmIHByZXZfbGVuZ3RoPj1nb29kX21hdGNoIGNoYWluX2xlbmd0aCA+Pj0gMgorCQlqYQkJbm9zaHIJCQorCQlzaHIJCWVheCwyCitub3NocjoKKwkJbW92CQllZGksW2VicCtkZXBfbmljZV9tYXRjaF0KKwkJbW92CQljaGFpbl9sZW5ndGgsZWF4CisJCW1vdgkJZWR4LFtlYnArZGVwX2xvb2thaGVhZF0KKwkJY21wCQllZHgsZWRpCis7aWYgKCh1SW50KW5pY2VfbWF0Y2ggPiBzLT5sb29rYWhlYWQpIG5pY2VfbWF0Y2ggPSBzLT5sb29rYWhlYWQ7CisJCWphZQkJbm9sb29rYWhlYWRuaWNlbWF0Y2gKKwkJbW92CQllZGksZWR4Citub2xvb2thaGVhZG5pY2VtYXRjaDoKKwkJbW92CQliZXN0X2xlbixlYngKKworCisJCW1vdgkJZXNpLFtlYnArZGVwX3dpbmRvd10KKwkJbW92CQllY3gsW2VicCtkZXBfc3Ryc3RhcnRdCisJCW1vdgkJd2luZG93LGVzaQorCQkKKwkJbW92CQluaWNlX21hdGNoLGVkaQorCQlhZGQJCWVzaSxlY3gKKwkJbW92CQlzY2FucnAsZXNpCisJCW1vdgkJYXgsd29yZCBwdHIgW2VzaV0KKwkJbW92CQlieCx3b3JkIHB0ciBbZXNpK2VieC0xXQorCQlhZGQJCWVzaSxNQVhfTUFUQ0gtMQorCQltb3YJCXNjYW5fc3RhcnQsYXgKKwkJbW92CQlzdHJlbmQsZXNpCisJCW1vdgkJc2Nhbl9lbmQsYngKKworOyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/Cis7ICAgICAgICBzLT5zdHJzdGFydCAtIChJUG9zKU1BWF9ESVNUKHMpIDogTklMOworCisJCW1vdgkJZXNpLFtlYnArZGVwX3dfc2l6ZV0KKwkJc3ViCQllc2ksTUlOX0xPT0tBSEVBRAorCQk7IGhlcmUgZXNpID0gTUFYX0RJU1QocykKKwkJc3ViCQllY3gsZXNpCisJCWphCQlub2Rpc3QKKwkJeG9yCQllY3gsZWN4Citub2Rpc3Q6CisJCW1vdgkJbGltaXQsZWN4CisKKworCisKKwkJbW92CQllYXgsW2VicCtkZXBfcHJldl0KKwkJbW92CQlwcmV2LGVheAorCisJICAgIG1vdiAgICAgZWJ4LGR3b3JkIHB0ciBbZWJwK2RlcF9tYXRjaF9zdGFydF0KKwkgICAgbW92ICAgICBicCxzY2FuX3N0YXJ0CisJICAgIG1vdiAgICAgZWR4LGN1cl9tYXRjaAorCSAgICBtb3YgICAgIG1hdGNoX3N0YXJ0LGVieAorCisJICAgIG1vdiAgICAgYngsc2Nhbl9lbmQKKwkgICAgbW92ICAgICBlYXgsd2luZG93CisJCW1vdgkJZWRpLGVheAorCSAgICBhZGQgICAgIGVkaSxiZXN0X2xlbgorCSAgICBtb3YgICAgIGVzaSxwcmV2CisJCWRlYyAgICAgZWRpCisJICAgIG1vdiAgICAgd2luZG93bGVuLGVkaQorCSAgICAKKwkgICAgam1wICAgICBiZWdpbmxvb3AyCisJICAgIGFsaWduICAgNAorCis7IGhlcmUsIGluIHRoZSBsb29wCis7Ozs7ICAgICAgIGVheCA9IGNoYWluX2xlbmd0aAorOyAgICAgICBlZHggPSBkeCA9IGN1cl9tYXRjaAorOyAgICAgICBlY3ggPSBsaW1pdAorOyAgICAgICAgYnggPSBzY2FuX2VuZAorOyAgICAgICAgYnAgPSBzY2FuX3N0YXJ0Cis7ICAgICAgIGVkaSA9IHdpbmRvd2xlbiAod2luZG93ICsgYmVzdF9sZW4pCis7ICAgICAgIGVzaSA9IHByZXYKKworCis7Ly8gaGVyZTsgZWF4IDw9MTYKK25vcm1hbGJlZzBhZGQxNjogCisJCWFkZAkJY2hhaW5fbGVuZ3RoLDE2CisJCWp6CQlleGl0bG9vcAorbm9ybWFsYmVnMDogCisJICAgIGNtcCAgICAgd29yZCBwdHJbZWRpK2VkeC0wXSxieAorCSAgICBqZSAgICAgIG5vcm1hbGJlZzIKKwkgICAgYW5kICAgICBlZHgsN2ZmZmgKKwkgICAgbW92ICAgICBkeCx3b3JkIHB0cltlc2krZWR4KjJdCisJICAgIGNtcCAgICAgZWN4LGVkeAorCSAgICBqbmIgICAgIGV4aXRsb29wCisJICAgIGRlYyAgICAgY2hhaW5fbGVuZ3RoCisJCWpuegkJbm9ybWFsYmVnMAorO2puYmV4aXRsb29wc2hvcnQxOgorCQlqbXAgICAgIGV4aXRsb29wCisKK2NvbnRsb29wMzoKKwkgICAgbW92ICAgICBlZGksd2luZG93bGVuCisKKzsgY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10KKwkgICAgYW5kCQllZHgsN2ZmZmgKKwkgICAgbW92ICAgICBkeCx3b3JkIHB0cltlc2krZWR4KjJdCis7IGlmIGN1cl9tYXRjaCA+IGxpbWl0LCBnbyB0byBleGl0bG9vcAorCSAgICBjbXAgICAgIGVjeCxlZHgKK2puYmV4aXRsb29wc2hvcnQxOgorCSAgICBqbmIgICAgIGV4aXRsb29wCis7IGlmIC0tY2hhaW5fbGVuZ3RoICE9IDAsIGdvIHRvIGV4aXRsb29wCisKK2JlZ2lubG9vcDI6CisJCXN1YgkJY2hhaW5fbGVuZ3RoLDE2KzEKKwkJam5hICAgICBub3JtYWxiZWcwYWRkMTYKKworZG8xNjoKKwkgICAgY21wICAgICB3b3JkIHB0cltlZGkrZWR4XSxieAorCSAgICBqZSAgICAgIG5vcm1hbGJlZzJkYzAKKworbWFjY24JTUFDUk8JbGFiCisJICAgIGFuZCAgICAgZWR4LDdmZmZoCisJICAgIG1vdiAgICAgZHgsd29yZCBwdHJbZXNpK2VkeCoyXQorCSAgICBjbXAgICAgIGVjeCxlZHgKKwkgICAgam5iICAgICBleGl0bG9vcAorCSAgICBjbXAgICAgIHdvcmQgcHRyW2VkaStlZHgtMF0sYngKKwkgICAgamUgICAgICBsYWIKKwkJRU5ETQorCityY29udGxvb3AwOgorCQltYWNjbiBub3JtYWxiZWcyZGMxCisKK3Jjb250bG9vcDE6CisJCW1hY2NuIG5vcm1hbGJlZzJkYzIKKworcmNvbnRsb29wMjoKKwkJbWFjY24gbm9ybWFsYmVnMmRjMworCityY29udGxvb3AzOgorCQltYWNjbiBub3JtYWxiZWcyZGM0CisKK3Jjb250bG9vcDQ6CisJCW1hY2NuIG5vcm1hbGJlZzJkYzUKKworcmNvbnRsb29wNToKKwkJbWFjY24gbm9ybWFsYmVnMmRjNgorCityY29udGxvb3A2OgorCQltYWNjbiBub3JtYWxiZWcyZGM3CisKK3Jjb250bG9vcDc6CisJCW1hY2NuIG5vcm1hbGJlZzJkYzgKKworcmNvbnRsb29wODoKKwkJbWFjY24gbm9ybWFsYmVnMmRjOQorCityY29udGxvb3A5OgorCQltYWNjbiBub3JtYWxiZWcyZGMxMAorCityY29udGxvb3AxMDoKKwkJbWFjY24gbm9ybWFsYmVnMmRjMTEKKworcmNvbnRsb29wMTE6CisJCW1hY2NuIHNob3J0IG5vcm1hbGJlZzJkYzEyCisKK3Jjb250bG9vcDEyOgorCQltYWNjbiBzaG9ydCBub3JtYWxiZWcyZGMxMworCityY29udGxvb3AxMzoKKwkJbWFjY24gc2hvcnQgbm9ybWFsYmVnMmRjMTQKKworcmNvbnRsb29wMTQ6CisJCW1hY2NuIHNob3J0IG5vcm1hbGJlZzJkYzE1CisKK3Jjb250bG9vcDE1OgorCSAgICBhbmQgICAgIGVkeCw3ZmZmaAorCSAgICBtb3YgICAgIGR4LHdvcmQgcHRyW2VzaStlZHgqMl0KKwkgICAgY21wICAgICBlY3gsZWR4CisJICAgIGpuYiAgICAgc2hvcnQgZXhpdGxvb3BzaG9ydAorCisJCXN1YgkJY2hhaW5fbGVuZ3RoLDE2CisJCWphCQlkbzE2CisJCWptcAkJbm9ybWFsYmVnMGFkZDE2CisKKzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKK2V4aXRsb29wc2hvcnQ6CisJCWptcAkJZXhpdGxvb3AgICAgICAgICAgICAgICAgICAKKworbm9ybWJlZwlNQUNSTwlyY29udGxhYix2YWxzdWIKKwkgICAgY21wICAgICBicCx3b3JkIHB0cltlYXgrZWR4XQorCQlqbmUJCXJjb250bGFiCisJCWFkZCAgICAgY2hhaW5fbGVuZ3RoLDE2LXZhbHN1YgorCQlqbXAJCWlzZXEKKwkJRU5ETQorCitub3JtYWxiZWcyZGMxMjoKKwkJbm9ybWJlZwlyY29udGxvb3AxMiwxMgorCitub3JtYWxiZWcyZGMxMzoKKwkJbm9ybWJlZwlyY29udGxvb3AxMywxMworCitub3JtYWxiZWcyZGMxNDoKKwkJbm9ybWJlZwlyY29udGxvb3AxNCwxNAorCitub3JtYWxiZWcyZGMxNToKKwkJbm9ybWJlZwlyY29udGxvb3AxNSwxNQorCitub3JtYWxiZWcyZGMxMToKKwkJbm9ybWJlZwlyY29udGxvb3AxMSwxMQorCitub3JtYWxiZWcyZGMxMDoKKwkJbm9ybWJlZwlyY29udGxvb3AxMCwxMAorCisKK25vcm1hbGJlZzJkYzk6CisJCW5vcm1iZWcJcmNvbnRsb29wOSw5CisKK25vcm1hbGJlZzJkYzg6CisJCW5vcm1iZWcJcmNvbnRsb29wOCw4CisKK25vcm1hbGJlZzJkYzc6CisJCW5vcm1iZWcJcmNvbnRsb29wNyw3CisKK25vcm1hbGJlZzJkYzU6CisJCW5vcm1iZWcJcmNvbnRsb29wNSw1CisKKworCisKKworbm9ybWFsYmVnMmRjNjoKKwkJbm9ybWJlZwlyY29udGxvb3A2LDYKKworbm9ybWFsYmVnMmRjNDoKKwkJbm9ybWJlZwlyY29udGxvb3A0LDQKKworbm9ybWFsYmVnMmRjMzoKKwkJbm9ybWJlZwlyY29udGxvb3AzLDMKKworbm9ybWFsYmVnMmRjMjoKKwkJbm9ybWJlZwlyY29udGxvb3AyLDIKKworbm9ybWFsYmVnMmRjMToKKwkJbm9ybWJlZwlyY29udGxvb3AxLDEKKworbm9ybWFsYmVnMmRjMDoKKwkJbm9ybWJlZwlyY29udGxvb3AwLDAKKworCis7IHdlIGdvIGluIG5vcm1hbGJlZzIgYmVjYXVzZSAqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSA9PSBzY2FuX2VuZAorCitub3JtYWxiZWcyOgorCisJCQkgOyAxMCBub3AgaGVyZSB0YWtlIDEwJSB0aW1lCisJCW1vdgkJZWRpLHdpbmRvdworCQkgIDttb3YgICAgIGNoYWluX2xlbmd0aCxlYXggICAgOyBub3csIHdlIG5lZWQgZWF4Li4uCisJCQkJCQorCSAgICBjbXAgICAgIGJwLHdvcmQgcHRyW2VkaStlZHhdCisJICAgIGpuZSAgICAgY29udGxvb3AzICAgICAgICAgICAgICAgICAgIDsgaWYgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0LCBjb250aW51ZQorCitpc2VxOgorCisJCW1vdgkJZWRpLGVheAorCSAgICBtb3YgICAgIGVzaSxzY2FucnAgICAgICAgICAgICAgICAgICA7IGVzaSA9IHNjYW4gICAgCisJICAgIGFkZCAgICAgZWRpLGVkeAkJCQk7IGVkaSA9IHdpbmRvdyArIGN1cl9tYXRjaCA9IG1hdGNoCisKKwkJICAgICAgIAorCSAgICBtb3YgICAgIGVheCxbZXNpKzNdCQkJCQk7IGNvbXBhcmUgbWFudWFsbHkgZHdvcmQgYXQgbWF0Y2grMworCSAgICB4b3IgICAgIGVheCxbZWRpKzNdICAgICAgICAgICAgICAgICA7ICAgICAgIGFuZCBzY2FuICszCisKKwkgICAganogICAgICBiZWdpbmNvbXBhcmUgICAgICAgICAgICAgICAgOyBpZiBlcXVhbCwgZ28gdG8gbG9uZyBjb21wYXJlCisKKwkJCTsgd2Ugd2lsbCBkZXRlcm1pbmUgdGhlIHVubWF0Y2ggYnl0ZSBhbmQgY2FsY3VsYXRlIGxlbiAoaW4gZXNpKQorCQlvcgkJYWwsYWwKKwkJamUJCWVxMXJyCisJICAgIG1vdiAgICAgZXNpLDMKKwkgICAgam1wICAgICB0cmZpbnZhbAorZXExcnI6CisJICAgIG9yICAgICAgYXgsYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJICAgIGplICAgICAgZXExCisKKwkgICAgbW92ICAgICBlc2ksNAorCSAgICBqbXAgICAgIHRyZmludmFsCitlcTE6CisJICAgIHNobCAgICAgZWF4LDgKKwkgICAganogICAgICBlcTExCisJICAgIG1vdiAgICAgZXNpLDUKKwkgICAgam1wICAgICB0cmZpbnZhbAorZXExMToKKwkgICAgbW92ICAgICBlc2ksNgorCSAgICBqbXAgICAgIHRyZmludmFsCisKK2JlZ2luY29tcGFyZToKKwkJOyBoZXJlIHdlIG5vdyBzY2FuIGFuZCBtYXRjaCBiZWdpbiBzYW1lCisJICAgIGFkZCAgICAgZWRpLDYKKwkgICAgYWRkICAgICBlc2ksNgorCSAgICBtb3YgICAgIGVjeCwoTUFYX01BVENILSgyKzQpKS80ICAgICA7Ly87IHNjYW4gZm9yIGF0IG1vc3QgTUFYX01BVENIIGJ5dGVzCisJICAgIHJlcGUgICAgY21wc2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLzsgbG9vcCB1bnRpbCBtaXNtYXRjaAorCisJICAgIGplICAgICAgdHJmaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZ28gdG8gdHJmaW4gaWYgbm90IHVubWF0Y2gKKwkJCTsgd2UgZGV0ZXJtaW5lIHRoZSB1bm1hdGNoIGJ5dGUKKwkgICAgc3ViICAgICBlc2ksNAorCSAgICBtb3YgICAgIGVheCxbZWRpLTRdCisJICAgIHhvciAgICAgZWF4LFtlc2ldCisJICAgIG9yICAgICAgYWwsYWwKKworCSAgICBqbnogICAgIHRyZmluCisJICAgIGluYyAgICAgZXNpCisKKwkgICAgb3IgICAgICBheCxheAorCSAgICBqbnogICAgIHRyZmluCisJICAgIGluYyAgICAgZXNpCisKKwkgICAgc2hsICAgICBlYXgsOCAgICAgICAgICAgCisJICAgIGpueiAgICAgdHJmaW4KKwkgICAgaW5jICAgICBlc2kKKwordHJmaW46ICAgICAgCisJICAgIHN1YiAgICAgZXNpLHNjYW5ycCAgICAgICAgICA7IGVzaSA9IGxlbgordHJmaW52YWw6CisJICAgIGNtcCAgICAgZXNpLGJlc3RfbGVuICAgICAgICA7IGlmIGxlbiA8PSBiZXN0X2xlbiwgZ28gY29udGxvb3AyCisJICAgIGpiZSAgICAgY29udGxvb3AyCisKKwkgICAgbW92ICAgICBiZXN0X2xlbixlc2kgICAgICAgIDsgbGVuIGJlY29tZSBiZXN0X2xlbgorCisJICAgIG1vdiAgICAgbWF0Y2hfc3RhcnQsZWR4CisJICAgIGNtcCAgICAgZXNpLG5pY2VfbWF0Y2ggOy8vOyBpZiBlc2kgPj0gbmljZV9tYXRjaCwgZXhpdAorCSAgICBtb3YgICAgIGVjeCxzY2FucnAKKwkgICAgamFlICAgICBleGl0bG9vcAorCSAgICBhZGQgICAgIGVzaSx3aW5kb3cKKwkgICAgYWRkICAgICBlY3gsYmVzdF9sZW4KKwkJCWRlYyAgICAgICAgICAgICBlc2kKKwkgICAgbW92ICAgICB3aW5kb3dsZW4sZXNpCisJICAgIG1vdiAgICAgYngsW2VjeC0xXQorCisKKzsgbm93IHdlIHJlc3RvcmUgZWF4LCBlY3ggYW5kIGVzaSwgZm9yIHRoZSBiaWcgbG9vcCA6Citjb250bG9vcDI6CisJICAgIG1vdiAgICAgZXNpLHByZXYKKwkgICAgbW92ICAgICBlY3gsbGltaXQKKwkgICAgO21vdiAgICAgZWF4LGNoYWluX2xlbmd0aAorCQltb3YJCWVheCx3aW5kb3cKKwkgICAgam1wICAgICBjb250bG9vcDMKKworZXhpdGxvb3A6ICAgICAgICAKKwkgICAgbW92ICAgICBlYngsbWF0Y2hfc3RhcnQKKwkJbW92CQllYnAsc3RyX3MKKwkgICAgbW92ICAgICBkd29yZCBwdHIgW2VicCtkZXBfbWF0Y2hfc3RhcnRdLGVieAorCSAgICBtb3YgICAgIGVheCxiZXN0X2xlbgorCSAgICBhZGQgICAgIGVzcCxOYlN0YWNrQWRkCisKKworCSAgICBwb3AgICAgIGVieAorCSAgICBwb3AgICAgIGVzaQorCSAgICBwb3AgICAgIGVkaQorCSAgICBwb3AgICAgIGVicCAKKwkgICAgcmV0CisKK19sb25nZXN0X21hdGNoX2FzbTdmZmYgZW5kcAorCitfVEVYVCAgIGVuZHMKK2VuZAorCQkJCQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL2FzbTM4Ni9ndm1hdDMyYy5jIGIvY29udHJpYi9hc20zODYvZ3ZtYXQzMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Q1MzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hc20zODYvZ3ZtYXQzMmMuYwpAQCAtMCwwICsxLDIyOSBAQAorLyogZ3ZtYXQzMi5jIC0tIEMgcG9ydGlvbiBvZiB0aGUgb3B0aW1pemVkIGxvbmdlc3RfbWF0Y2ggZm9yIDMyIGJpdHMgeDg2CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5IGFuZCBHaWxsZXMgVm9sbGFudC4KKyAqIEZpbGUgd3JpdHRlbiBieSBHaWxsZXMgVm9sbGFudCwgYnkgbW9kaWZpeWluZyB0aGUgbG9uZ2VzdF9tYXRjaAorICogIGZyb20gSmVhbi1sb3VwIEdhaWxseSBpbiBkZWZsYXRlLmMKKyAqICBpdCBwcmVwYXJlIGFsbCBwYXJhbWV0ZXJzIGFuZCBjYWxsIHRoZSBhc3NlbWJseSBsb25nZXN0X21hdGNoX2d2YXNtCisgKiAgbG9uZ2VzdF9tYXRjaCBleGVjdXRlIHN0YW5kYXJkIEMgY29kZSBpcyB3bWFzayAhPSAweDdmZmYKKyAqICAgICAoYXNzZW1ibHkgY29kZSBpcyBmYXN0ZXIgd2l0aCBhIGZpeGVkIHdtYXNrKQorICoKKyAqLworLy8jcHJhZ21hIG9wdGltaXplKCJhZ3QiLG9uKQorCisjaW5jbHVkZSAiZGVmbGF0ZS5oIgorCisjdW5kZWYgRkFSCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZkZWYgQVNNVgorCisjZGVmaW5lIE5JTCAwCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG90PTA7CitzdGF0aWMgdW5zaWduZWQgaW50IHRvdGwwPTA7CitzdGF0aWMgdW5zaWduZWQgaW50IHRvdGwwcDA9MDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmEwPTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGJhMT0wOworc3RhdGljIHVuc2lnbmVkIGludCBjcHRhPTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNwdGI9MDsKKworI2RlZmluZSBVTkFMSUdORURfT0sKKyNkZWZpbmUgZ3ZzaG93KGEsYixjLGQpCisvKgordm9pZCBndnNob3coaW50IGNoYWluX2xlbmd0aCxpbnQgbGVuLGludCBsaW1pdCx1c2hmKiBwcmV2KQoreworc3RhdGljIGludCBpdmFsPTA7CitjaGFyIHN6WzgwXTsKK3Vuc2lnbmVkIGxvbmcgaTsKK2ludCBwcmV2MD0qcHJldjsKKwlpdmFsKys7CisJLy93c3ByaW50ZihzeiwiY2FsbCAldSwgbGVuPSV1LCBjaGFpbl9sZW5ndGg9JXVcbiIsaXZhbCxsZW4sY2hhaW5fbGVuZ3RoKTsKKwkvL091dHB1dERlYnVnU3RyaW5nKHN6KTsKKwl0b3QrKzsKKwlpZiAobGltaXQ9PU5JTCkKKwkJdG90bDArKzsKKwlpZiAoKGxpbWl0PT1OSUwpICYmIChwcmV2MD09MCkpCisJCXRvdGwwcDArKzsKKwlmb3IgKGk9bGltaXQrMTtpPDMyNzY4O2krKykKKwl7CisJCXVzaCB2YT0qKHByZXYraSk7CisJCWlmIChiYTA+NDAwMDAwMDAwMCkKKwkJeworCQkJYmEwKz0xMDsKKwkJfQorCQliYTArKzsKKwkJaWYgKCh2YT5saW1pdCkgfHwgKHZhPT0wKSkKKwkJCWNvbnRpbnVlOworCQliYTErKzsKKwl9Cit9CisqLworCisKKy8qIGlmIHlvdXIgQyBjb21waWxlciBkb24ndCBhZGQgdW5kZXJsaW5lIGJlZm9yZSBmdW5jdGlvbiBuYW1lLAorCQlkZWZpbmUgQUREX1VOREVSTElORV9BU01GVU5DICovCisjaWZkZWYgQUREX1VOREVSTElORV9BU01GVU5DCisjZGVmaW5lIGxvbmdlc3RfbWF0Y2hfYXNtN2ZmZiBfbG9uZ2VzdF9tYXRjaF9hc203ZmZmCisjZW5kaWYKK3ZvaWQgbWF0Y2hfaW5pdCgpCit7Cit9CisKK3VJbnQgbG9uZ2VzdF9tYXRjaF9jKAorICAgIGRlZmxhdGVfc3RhdGUgKnMsCisgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworCisKK3VJbnQgbG9uZ2VzdF9tYXRjaF9hc203ZmZmKAorICAgIGRlZmxhdGVfc3RhdGUgKnMsCisgICAgSVBvcyBjdXJfbWF0Y2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXRjaCAqLworCit1SW50IGxvbmdlc3RfbWF0Y2goCisgICAgZGVmbGF0ZV9zdGF0ZSAqcywKKyAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICBpZiAocy0+d19tYXNrID09IDB4N2ZmZikKKyAgICAgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfYXNtN2ZmZihzLGN1cl9tYXRjaCk7CisgICAgcmV0dXJuIGxvbmdlc3RfbWF0Y2hfYyhzLGN1cl9tYXRjaCk7Cit9CisKKworCit1SW50IGxvbmdlc3RfbWF0Y2hfYyhzLCBjdXJfbWF0Y2gpCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICBJUG9zIGN1cl9tYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KK3sKKyAgICB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOy8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisgICAgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi8KKyAgICBpbnQgbmljZV9tYXRjaCA9IHMtPm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi8KKyAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/CisgICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7CisgICAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwKKyAgICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLgorICAgICAqLworICAgIFBvc2YgKnByZXYgPSBzLT5wcmV2OworICAgIHVJbnQgd21hc2sgPSBzLT53X21hc2s7CisKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAvKiBDb21wYXJlIHR3byBieXRlcyBhdCBhIHRpbWUuIE5vdGU6IHRoaXMgaXMgbm90IGFsd2F5cyBiZW5lZmljaWFsLgorICAgICAqIFRyeSB3aXRoIGFuZCB3aXRob3V0IC1EVU5BTElHTkVEX09LIHRvIGNoZWNrLgorICAgICAqLworICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSCAtIDE7CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOworI2Vsc2UKKyAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorCisgICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOworCisgICAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8KKyAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgeworICAgICAgICBjaGFpbl9sZW5ndGggPj49IDI7CisgICAgfQorICAgIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy4KKyAgICAgKi8KKyAgICBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgZG8geworICAgICAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKKyAgICAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisKKyAgICAgICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlCisgICAgICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaGYqKShtYXRjaCtiZXN0X2xlbi0xKSAhPSBzY2FuX2VuZCB8fAorICAgICAgICAgICAgKih1c2hmKiltYXRjaCAhPSBzY2FuX3N0YXJ0KSBjb250aW51ZTsKKworICAgICAgICAvKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleSBhcmUKKyAgICAgICAgICogYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0IHRoZSBoYXNoIGtleXMKKyAgICAgICAgICogYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LiBDb21wYXJlIDIgYnl0ZXMgYXQgYSB0aW1lIGF0CisgICAgICAgICAqIHN0cnN0YXJ0KzMsICs1LCAuLi4gdXAgdG8gc3Ryc3RhcnQrMjU3LiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50CisgICAgICAgICAqIGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDR0aCBjb21wYXJpc29uOyB0aGUgMTI4dGggY2hlY2sgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGF0IHN0cnN0YXJ0KzI1Ny4gSWYgTUFYX01BVENILTIgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCwgaXQgaXMKKyAgICAgICAgICogbmVjZXNzYXJ5IHRvIHB1dCBtb3JlIGd1YXJkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdywgb3IKKyAgICAgICAgICogdG8gY2hlY2sgbW9yZSBvZnRlbiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChzY2FuWzJdID09IG1hdGNoWzJdLCAic2NhblsyXT8iKTsKKyAgICAgICAgc2NhbisrLCBtYXRjaCsrOworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKyAgICAgICAgLyogVGhlIGZ1bm55ICJkbyB7fSIgZ2VuZXJhdGVzIGJldHRlciBjb2RlIG9uIG1vc3QgY29tcGlsZXJzICovCisKKyAgICAgICAgLyogSGVyZSwgc2NhbiA8PSB3aW5kb3crc3Ryc3RhcnQrMjU3ICovCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisgICAgICAgIGlmICgqc2NhbiA9PSAqbWF0Y2gpIHNjYW4rKzsKKworICAgICAgICBsZW4gPSAoTUFYX01BVENIIC0gMSkgLSAoaW50KShzdHJlbmQtc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSAoTUFYX01BVENILTEpOworCisjZWxzZSAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobWF0Y2hbYmVzdF9sZW5dICAgIT0gc2Nhbl9lbmQgIHx8CisgICAgICAgICAgICBtYXRjaFtiZXN0X2xlbi0xXSAhPSBzY2FuX2VuZDEgfHwKKyAgICAgICAgICAgICptYXRjaCAgICAgICAgICAgICE9ICpzY2FuICAgICB8fAorICAgICAgICAgICAgKisrbWF0Y2ggICAgICAgICAgIT0gc2NhblsxXSkgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorICAgICAgICAgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorICAgICAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisgICAgICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorICAgICAgICAgKi8KKyAgICAgICAgc2NhbiArPSAyLCBtYXRjaCsrOworICAgICAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7CisKKyAgICAgICAgLyogV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQgb25seSBldmVyeSA4dGggY29tcGFyaXNvbjsKKyAgICAgICAgICogdGhlIDI1NnRoIGNoZWNrIHdpbGwgYmUgbWFkZSBhdCBzdHJzdGFydCsyNTguCisgICAgICAgICAqLworICAgICAgICBkbyB7CisgICAgICAgIH0gd2hpbGUgKCorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKKworICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOworCisgICAgICAgIGxlbiA9IE1BWF9NQVRDSCAtIChpbnQpKHN0cmVuZCAtIHNjYW4pOworICAgICAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisjZW5kaWYgLyogVU5BTElHTkVEX09LICovCisKKyAgICAgICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCA9IGN1cl9tYXRjaDsKKyAgICAgICAgICAgIGJlc3RfbGVuID0gbGVuOworICAgICAgICAgICAgaWYgKGxlbiA+PSBuaWNlX21hdGNoKSBicmVhazsKKyNpZmRlZiBVTkFMSUdORURfT0sKKyAgICAgICAgICAgIHNjYW5fZW5kID0gKih1c2hmKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgICAgICAgICBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICAgICAgICAgIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGN1cl9tYXRjaCA9IHByZXZbY3VyX21hdGNoICYgd21hc2tdKSA+IGxpbWl0CisgICAgICAgICAgICAgJiYgLS1jaGFpbl9sZW5ndGggIT0gMCk7CisKKyAgICBpZiAoKHVJbnQpYmVzdF9sZW4gPD0gcy0+bG9va2FoZWFkKSByZXR1cm4gYmVzdF9sZW47CisgICAgcmV0dXJuIHMtPmxvb2thaGVhZDsKK30KKworI2VuZGlmIC8qIEFTTVYgKi8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXNtMzg2L21rZ3ZtdDMyLmJhdCBiL2NvbnRyaWIvYXNtMzg2L21rZ3ZtdDMyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVmZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9hc20zODYvbWtndm10MzIuYmF0CkBAIC0wLDAgKzEgQEAKK2M6XG1hc202MTFcYmluXG1sIC9jb2ZmIC9aaSAvYyAvRmxndm1hdDMyLmxzdCBndm1hdDMyLmFzbQpkaWZmIC0tZ2l0IGEvY29udHJpYi9hc20zODYvemxpYnZjLm1hayBiL2NvbnRyaWIvYXNtMzg2L3psaWJ2Yy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzZDE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvYXNtMzg2L3psaWJ2Yy5tYWsKQEAgLTAsMCArMSw3ODEgQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMjAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgorCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz16bGlidmMgLSBXaW4zMiBEZWJ1ZworIU1FU1NBR0UgTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQuICBEZWZhdWx0aW5nIHRvIHpsaWJ2YyAtIFdpbjMyIERlYnVnLgorIUVORElGIAorCishSUYgIiQoQ0ZHKSIgIT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiICYmICIkKENGRykiICE9ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgInpsaWJ2Yy5tYWsiIENGRz0iemxpYnZjIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCishTUVTU0FHRSAiemxpYnZjIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorTVRMPW1rdHlwbGliLmV4ZQorCishSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK09VVERJUj0uXFJlbGVhc2UKK0lOVERJUj0uXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVx6bGliLmRsbCIgIiQoT1VURElSKVx6bGlidmMuYnNjIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxhZGxlcjMyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcYWRsZXIzMi5zYnIiCisJLUBlcmFzZSAiJChJTlRESVIpXGNvbXByZXNzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcY29tcHJlc3Muc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVxjcmMzMi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGNyYzMyLnNiciIKKwktQGVyYXNlICIkKElOVERJUilcZGVmbGF0ZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGRlZmxhdGUuc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVxndm1hdDMyYy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGd2bWF0MzJjLnNiciIKKwktQGVyYXNlICIkKElOVERJUilcZ3ppby5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGd6aW8uc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVxpbmZibG9jay5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZmJsb2NrLnNiciIKKwktQGVyYXNlICIkKElOVERJUilcaW5mY29kZXMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxpbmZjb2Rlcy5zYnIiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZmZhc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxpbmZmYXN0LnNiciIKKwktQGVyYXNlICIkKElOVERJUilcaW5mbGF0ZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZmxhdGUuc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVxpbmZ0cmVlcy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZnRyZWVzLnNiciIKKwktQGVyYXNlICIkKElOVERJUilcaW5mdXRpbC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZnV0aWwuc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVx0cmVlcy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHRyZWVzLnNiciIKKwktQGVyYXNlICIkKElOVERJUilcdW5jb21wci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHVuY29tcHIuc2JyIgorCS1AZXJhc2UgIiQoSU5URElSKVx6bGliLnJlcyIKKwktQGVyYXNlICIkKElOVERJUilcenV0aWwub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx6dXRpbC5zYnIiCisJLUBlcmFzZSAiJChPVVRESVIpXHpsaWIuZGxsIgorCS1AZXJhc2UgIiQoT1VURElSKVx6bGliLmV4cCIKKwktQGVyYXNlICIkKE9VVERJUilcemxpYi5saWIiCisJLUBlcmFzZSAiJChPVVRESVIpXHpsaWIubWFwIgorCS1AZXJhc2UgIiQoT1VURElSKVx6bGlidmMuYnNjIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJOREVCVUciIC9EIGZkb3Blbj1fZmRvcGVuIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX1dJTkRMTCIgL0QgIl9XSU4zMiIgL0QgIkJVSUxEX1pMSUJETEwiIC9EICJaTElCX0RMTCIgL0QgIkFTTVYiIC9GUiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJOREVCVUciIC9EIGZkb3Blbj1fZmRvcGVuIC9EICJXSU4zMiIgL0RcCisgIl9XSU5ET1dTIiAvRCAiX1dJTkRMTCIgL0QgIl9XSU4zMiIgL0QgIkJVSUxEX1pMSUJETEwiIC9EICJaTElCX0RMTCIgL0QgIkFTTVYiXAorIC9GUiIkKElOVERJUikvIiAvRnAiJChJTlRESVIpL3psaWJ2Yy5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyIgL2MgCitDUFBfT0JKUz0uXFJlbGVhc2UvCitDUFBfU0JSUz0uXFJlbGVhc2UvCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCitNVExfUFJPSj0vbm9sb2dvIC9EICJOREVCVUciIC93aW4zMiAKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIk5ERUJVRyIKK1JTQ19QUk9KPS9sIDB4NDBjIC9mbyIkKElOVERJUikvemxpYi5yZXMiIC9kICJOREVCVUciIAorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvemxpYnZjLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJIiQoSU5URElSKVxhZGxlcjMyLnNiciIgXAorCSIkKElOVERJUilcY29tcHJlc3Muc2JyIiBcCisJIiQoSU5URElSKVxjcmMzMi5zYnIiIFwKKwkiJChJTlRESVIpXGRlZmxhdGUuc2JyIiBcCisJIiQoSU5URElSKVxndm1hdDMyYy5zYnIiIFwKKwkiJChJTlRESVIpXGd6aW8uc2JyIiBcCisJIiQoSU5URElSKVxpbmZibG9jay5zYnIiIFwKKwkiJChJTlRESVIpXGluZmNvZGVzLnNiciIgXAorCSIkKElOVERJUilcaW5mZmFzdC5zYnIiIFwKKwkiJChJTlRESVIpXGluZmxhdGUuc2JyIiBcCisJIiQoSU5URElSKVxpbmZ0cmVlcy5zYnIiIFwKKwkiJChJTlRESVIpXGluZnV0aWwuc2JyIiBcCisJIiQoSU5URElSKVx0cmVlcy5zYnIiIFwKKwkiJChJTlRESVIpXHVuY29tcHIuc2JyIiBcCisJIiQoSU5URElSKVx6dXRpbC5zYnIiCisKKyIkKE9VVERJUilcemxpYnZjLmJzYyIgOiAiJChPVVRESVIpIiAkKEJTQzMyX1NCUlMpCisgICAgJChCU0MzMikgQDw8CisgICQoQlNDMzJfRkxBR1MpICQoQlNDMzJfU0JSUykKKzw8CisKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgY3J0ZGxsLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYXAgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliIC9vdXQ6IlJlbGVhc2UvemxpYi5kbGwiCitMSU5LMzJfRkxBR1M9a2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWJcCisgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgY3J0ZGxsLmxpYiAvbm9sb2dvXAorIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9pbmNyZW1lbnRhbDpubyAvcGRiOiIkKE9VVERJUikvemxpYi5wZGIiXAorIC9tYXA6IiQoSU5URElSKS96bGliLm1hcCIgL21hY2hpbmU6STM4NiAvbm9kZWZhdWx0bGliIC9kZWY6Ii5cemxpYi5kZWYiXAorIC9vdXQ6IiQoT1VURElSKS96bGliLmRsbCIgL2ltcGxpYjoiJChPVVRESVIpL3psaWIubGliIiAKK0RFRl9GSUxFPSBcCisJIi5cemxpYi5kZWYiCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcYWRsZXIzMi5vYmoiIFwKKwkiJChJTlRESVIpXGNvbXByZXNzLm9iaiIgXAorCSIkKElOVERJUilcY3JjMzIub2JqIiBcCisJIiQoSU5URElSKVxkZWZsYXRlLm9iaiIgXAorCSIkKElOVERJUilcZ3ZtYXQzMmMub2JqIiBcCisJIiQoSU5URElSKVxnemlvLm9iaiIgXAorCSIkKElOVERJUilcaW5mYmxvY2sub2JqIiBcCisJIiQoSU5URElSKVxpbmZjb2Rlcy5vYmoiIFwKKwkiJChJTlRESVIpXGluZmZhc3Qub2JqIiBcCisJIiQoSU5URElSKVxpbmZsYXRlLm9iaiIgXAorCSIkKElOVERJUilcaW5mdHJlZXMub2JqIiBcCisJIiQoSU5URElSKVxpbmZ1dGlsLm9iaiIgXAorCSIkKElOVERJUilcdHJlZXMub2JqIiBcCisJIiQoSU5URElSKVx1bmNvbXByLm9iaiIgXAorCSIkKElOVERJUilcemxpYi5yZXMiIFwKKwkiJChJTlRESVIpXHp1dGlsLm9iaiIgXAorCSIuXEdWTUFUMzIub2JqIgorCisiJChPVVRESVIpXHpsaWIuZGxsIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgVGFyZ2V0X0RpciAiIgorT1VURElSPS5cRGVidWcKK0lOVERJUj0uXERlYnVnCisKK0FMTCA6ICIkKE9VVERJUilcemxpYi5kbGwiCisKK0NMRUFOIDogCisJLUBlcmFzZSAiJChJTlRESVIpXGFkbGVyMzIub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxjb21wcmVzcy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGNyYzMyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcZGVmbGF0ZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGd2bWF0MzJjLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcZ3ppby5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZmJsb2NrLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcaW5mY29kZXMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxpbmZmYXN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcaW5mbGF0ZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGluZnRyZWVzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcaW5mdXRpbC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHRyZWVzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcdW5jb21wci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHZjNDAuaWRiIgorCS1AZXJhc2UgIiQoSU5URElSKVx2YzQwLnBkYiIKKwktQGVyYXNlICIkKElOVERJUilcemxpYi5yZXMiCisJLUBlcmFzZSAiJChJTlRESVIpXHp1dGlsLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcemxpYi5kbGwiCisJLUBlcmFzZSAiJChPVVRESVIpXHpsaWIuZXhwIgorCS1AZXJhc2UgIiQoT1VURElSKVx6bGliLmlsayIKKwktQGVyYXNlICIkKE9VVERJUilcemxpYi5saWIiCisJLUBlcmFzZSAiJChPVVRESVIpXHpsaWIucGRiIgorCisiJChPVVRESVIpIiA6CisgICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKKworIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiX1dJTkRMTCIgL0QgIl9XSU4zMiIgL0QgIkJVSUxEX1pMSUJETEwiIC9EICJaTElCX0RMTCIgL1lYIC9jCitDUFBfUFJPSj0vbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyJcCisgL0QgIl9XSU5ETEwiIC9EICJfV0lOMzIiIC9EICJCVUlMRF9aTElCRExMIiAvRCAiWkxJQl9ETEwiXAorIC9GcCIkKElOVERJUikvemxpYnZjLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvRmQiJChJTlRESVIpLyIgL2MgCitDUFBfT0JKUz0uXERlYnVnLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgorIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCitNVExfUFJPSj0vbm9sb2dvIC9EICJfREVCVUciIC93aW4zMiAKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDBjIC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MGMgL2QgIl9ERUJVRyIKK1JTQ19QUk9KPS9sIDB4NDBjIC9mbyIkKElOVERJUikvemxpYi5yZXMiIC9kICJfREVCVUciIAorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvemxpYnZjLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9vdXQ6IkRlYnVnL3psaWIuZGxsIgorTElOSzMyX0ZMQUdTPWtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliXAorIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIC9ub2xvZ29cCisgL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2luY3JlbWVudGFsOnllcyAvcGRiOiIkKE9VVERJUikvemxpYi5wZGIiIC9kZWJ1Z1wKKyAvbWFjaGluZTpJMzg2IC9kZWY6Ii5cemxpYi5kZWYiIC9vdXQ6IiQoT1VURElSKS96bGliLmRsbCJcCisgL2ltcGxpYjoiJChPVVRESVIpL3psaWIubGliIiAKK0RFRl9GSUxFPSBcCisJIi5cemxpYi5kZWYiCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcYWRsZXIzMi5vYmoiIFwKKwkiJChJTlRESVIpXGNvbXByZXNzLm9iaiIgXAorCSIkKElOVERJUilcY3JjMzIub2JqIiBcCisJIiQoSU5URElSKVxkZWZsYXRlLm9iaiIgXAorCSIkKElOVERJUilcZ3ZtYXQzMmMub2JqIiBcCisJIiQoSU5URElSKVxnemlvLm9iaiIgXAorCSIkKElOVERJUilcaW5mYmxvY2sub2JqIiBcCisJIiQoSU5URElSKVxpbmZjb2Rlcy5vYmoiIFwKKwkiJChJTlRESVIpXGluZmZhc3Qub2JqIiBcCisJIiQoSU5URElSKVxpbmZsYXRlLm9iaiIgXAorCSIkKElOVERJUilcaW5mdHJlZXMub2JqIiBcCisJIiQoSU5URElSKVxpbmZ1dGlsLm9iaiIgXAorCSIkKElOVERJUilcdHJlZXMub2JqIiBcCisJIiQoSU5URElSKVx1bmNvbXByLm9iaiIgXAorCSIkKElOVERJUilcemxpYi5yZXMiIFwKKwkiJChJTlRESVIpXHp1dGlsLm9iaiIgXAorCSIuXEdWTUFUMzIub2JqIgorCisiJChPVVRESVIpXHpsaWIuZGxsIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTkRJRiAKKworLmN7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3BweyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3h4eyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorIyBOYW1lICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGFkbGVyMzIuYworREVQX0NQUF9BRExFUj1cCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGFkbGVyMzIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQURMRVIpICIkKElOVERJUikiCisKKyIkKElOVERJUilcYWRsZXIzMi5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9BRExFUikgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxhZGxlcjMyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0FETEVSKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNvbXByZXNzLmMKK0RFUF9DUFBfQ09NUFI9XAorCSIuXHpjb25mLmgiXAorCSIuXHpsaWIuaCJcCisJCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCisKKworIiQoSU5URElSKVxjb21wcmVzcy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DT01QUikgIiQoSU5URElSKSIKKworIiQoSU5URElSKVxjb21wcmVzcy5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DT01QUikgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxjb21wcmVzcy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DT01QUikgIiQoSU5URElSKSIKKworCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxjcmMzMi5jCitERVBfQ1BQX0NSQzMyPVwKKwkiLlx6Y29uZi5oIlwKKwkiLlx6bGliLmgiXAorCQorCishSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorCisKKyIkKElOVERJUilcY3JjMzIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ1JDMzIpICIkKElOVERJUikiCisKKyIkKElOVERJUilcY3JjMzIuc2JyIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ1JDMzIpICIkKElOVERJUikiCisKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorCisKKyIkKElOVERJUilcY3JjMzIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ1JDMzIpICIkKElOVERJUikiCisKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cZGVmbGF0ZS5jCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCisKK0RFUF9DUFBfREVGTEE9XAorCSIuXGRlZmxhdGUuaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIiQoSU5URElSKVxkZWZsYXRlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0RFRkxBKSAiJChJTlRESVIpIgorCisiJChJTlRESVIpXGRlZmxhdGUuc2JyIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfREVGTEEpICIkKElOVERJUikiCisKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorCitERVBfQ1BQX0RFRkxBPVwKKwkiLlxkZWZsYXRlLmgiXAorCSIuXHpjb25mLmgiXAorCSIuXHpsaWIuaCJcCisJIi5cenV0aWwuaCJcCisJCitOT0RFUF9DUFBfREVGTEE9XAorCSIuXGxvY2FsIlwKKwkKKworIiQoSU5URElSKVxkZWZsYXRlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0RFRkxBKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGd6aW8uYworREVQX0NQUF9HWklPXz1cCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGd6aW8ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfR1pJT18pICIkKElOVERJUikiCisKKyIkKElOVERJUilcZ3ppby5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9HWklPXykgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxnemlvLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0daSU9fKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGluZmJsb2NrLmMKK0RFUF9DUFBfSU5GQkw9XAorCSIuXGluZmJsb2NrLmgiXAorCSIuXGluZmNvZGVzLmgiXAorCSIuXGluZnRyZWVzLmgiXAorCSIuXGluZnV0aWwuaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGluZmJsb2NrLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORkJMKSAiJChJTlRESVIpIgorCisiJChJTlRESVIpXGluZmJsb2NrLnNiciIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORkJMKSAiJChJTlRESVIpIgorCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworCisiJChJTlRESVIpXGluZmJsb2NrLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORkJMKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGluZmNvZGVzLmMKK0RFUF9DUFBfSU5GQ089XAorCSIuXGluZmJsb2NrLmgiXAorCSIuXGluZmNvZGVzLmgiXAorCSIuXGluZmZhc3QuaCJcCisJIi5caW5mdHJlZXMuaCJcCisJIi5caW5mdXRpbC5oIlwKKwkiLlx6Y29uZi5oIlwKKwkiLlx6bGliLmgiXAorCSIuXHp1dGlsLmgiXAorCQorCishSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorCisKKyIkKElOVERJUilcaW5mY29kZXMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GQ08pICIkKElOVERJUikiCisKKyIkKElOVERJUilcaW5mY29kZXMuc2JyIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GQ08pICIkKElOVERJUikiCisKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorCisKKyIkKElOVERJUilcaW5mY29kZXMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GQ08pICIkKElOVERJUikiCisKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5caW5mZmFzdC5jCitERVBfQ1BQX0lORkZBPVwKKwkiLlxpbmZibG9jay5oIlwKKwkiLlxpbmZjb2Rlcy5oIlwKKwkiLlxpbmZmYXN0LmgiXAorCSIuXGluZnRyZWVzLmgiXAorCSIuXGluZnV0aWwuaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGluZmZhc3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GRkEpICIkKElOVERJUikiCisKKyIkKElOVERJUilcaW5mZmFzdC5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZGQSkgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxpbmZmYXN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORkZBKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGluZmxhdGUuYworREVQX0NQUF9JTkZMQT1cCisJIi5caW5mYmxvY2suaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGluZmxhdGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GTEEpICIkKElOVERJUikiCisKKyIkKElOVERJUilcaW5mbGF0ZS5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZMQSkgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxpbmZsYXRlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORkxBKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGluZnRyZWVzLmMKK0RFUF9DUFBfSU5GVFI9XAorCSIuXGluZnRyZWVzLmgiXAorCSIuXHpjb25mLmgiXAorCSIuXHpsaWIuaCJcCisJIi5cenV0aWwuaCJcCisJCisKKyFJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIFJlbGVhc2UiCisKKworIiQoSU5URElSKVxpbmZ0cmVlcy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZUUikgIiQoSU5URElSKSIKKworIiQoSU5URElSKVxpbmZ0cmVlcy5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZUUikgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxpbmZ0cmVlcy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZUUikgIiQoSU5URElSKSIKKworCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxpbmZ1dGlsLmMKK0RFUF9DUFBfSU5GVVQ9XAorCSIuXGluZmJsb2NrLmgiXAorCSIuXGluZmNvZGVzLmgiXAorCSIuXGluZnRyZWVzLmgiXAorCSIuXGluZnV0aWwuaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXGluZnV0aWwub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSU5GVVQpICIkKElOVERJUikiCisKKyIkKElOVERJUilcaW5mdXRpbC5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9JTkZVVCkgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKworIiQoSU5URElSKVxpbmZ1dGlsLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0lORlVUKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHRyZWVzLmMKK0RFUF9DUFBfVFJFRVM9XAorCSIuXGRlZmxhdGUuaCJcCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXHRyZWVzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSRUVTKSAiJChJTlRESVIpIgorCisiJChJTlRESVIpXHRyZWVzLnNiciIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSRUVTKSAiJChJTlRESVIpIgorCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworCisiJChJTlRESVIpXHRyZWVzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1RSRUVTKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHVuY29tcHIuYworCishSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorCitERVBfQ1BQX1VOQ09NPVwKKwkiLlx6Y29uZi5oIlwKKwkiLlx6bGliLmgiXAorCQorCisiJChJTlRESVIpXHVuY29tcHIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfVU5DT00pICIkKElOVERJUikiCisKKyIkKElOVERJUilcdW5jb21wci5zYnIiIDogJChTT1VSQ0UpICQoREVQX0NQUF9VTkNPTSkgIiQoSU5URElSKSIKKworCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKK0RFUF9DUFBfVU5DT009XAorCSIuXHpjb25mLmgiXAorCSIuXHpsaWIuaCJcCisJCitOT0RFUF9DUFBfVU5DT009XAorCSIuXHVuY29tcHJlc3MiXAorCQorCisiJChJTlRESVIpXHVuY29tcHIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfVU5DT00pICIkKElOVERJUikiCisKKworIUVORElGIAorCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cenV0aWwuYworREVQX0NQUF9aVVRJTD1cCisJIi5cemNvbmYuaCJcCisJIi5cemxpYi5oIlwKKwkiLlx6dXRpbC5oIlwKKwkKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworCisiJChJTlRESVIpXHp1dGlsLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1pVVElMKSAiJChJTlRESVIpIgorCisiJChJTlRESVIpXHp1dGlsLnNiciIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1pVVElMKSAiJChJTlRESVIpIgorCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworCisiJChJTlRESVIpXHp1dGlsLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1pVVElMKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHpsaWIucmMKKworIiQoSU5URElSKVx6bGliLnJlcyIgOiAkKFNPVVJDRSkgIiQoSU5URElSKSIKKyAgICQoUlNDKSAkKFJTQ19QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cemxpYi5kZWYKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gInpsaWJ2YyAtIFdpbjMyIERlYnVnIgorCishRU5ESUYgCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9LlxHVk1BVDMyLm9iagorCishSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBSZWxlYXNlIgorCishRUxTRUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgRGVidWciCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGd2bWF0MzJjLmMKKworIUlGICAiJChDRkcpIiA9PSAiemxpYnZjIC0gV2luMzIgUmVsZWFzZSIKKworREVQX0NQUF9HVk1BVD1cCisJIi5cZGVmbGF0ZS5oIlwKKwkiLlx6Y29uZi5oIlwKKwkiLlx6bGliLmgiXAorCSIuXHp1dGlsLmgiXAorCQorCisiJChJTlRESVIpXGd2bWF0MzJjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0dWTUFUKSAiJChJTlRESVIpIgorCisiJChJTlRESVIpXGd2bWF0MzJjLnNiciIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0dWTUFUKSAiJChJTlRESVIpIgorCisKKyFFTFNFSUYgICIkKENGRykiID09ICJ6bGlidmMgLSBXaW4zMiBEZWJ1ZyIKKworREVQX0NQUF9HVk1BVD1cCisJIi5cZGVmbGF0ZS5oIlwKKwkiLlx6Y29uZi5oIlwKKwkiLlx6bGliLmgiXAorCSIuXHp1dGlsLmgiXAorCQorCisiJChJTlRESVIpXGd2bWF0MzJjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0dWTUFUKSAiJChJTlRESVIpIgorCisKKyFFTkRJRiAKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvaW9zdHJlYW0vdGVzdC5jcHAgYi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjY1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2lvc3RyZWFtL3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKworI2luY2x1ZGUgInpmc3RyZWFtLmgiCisKK2ludCBtYWluKCkgeworCisgIC8vIENvbnN0cnVjdCBhIHN0cmVhbSBvYmplY3Qgd2l0aCB0aGlzIGZpbGVidWZmZXIuICBBbnl0aGluZyBzZW50CisgIC8vIHRvIHRoaXMgc3RyZWFtIHdpbGwgZ28gdG8gc3RhbmRhcmQgb3V0LgorICBnem9mc3RyZWFtIG9zKCAxLCBpb3M6Om91dCApOworCisgIC8vIFRoaXMgdGV4dCBpcyBnZXR0aW5nIGNvbXByZXNzZWQgYW5kIHNlbnQgdG8gc3Rkb3V0LgorICAvLyBUbyBwcm92ZSB0aGlzLCBydW4gJ3Rlc3QgfCB6Y2F0Jy4KKyAgb3MgPDwgIkhlbGxvLCBNb21teSIgPDwgZW5kbDsKKworICBvcyA8PCBzZXRjb21wcmVzc2lvbmxldmVsKCBaX05PX0NPTVBSRVNTSU9OICk7CisgIG9zIDw8ICJoZWxsbywgaGVsbG8sIGhpLCBobyEiIDw8IGVuZGw7CisKKyAgc2V0Y29tcHJlc3Npb25sZXZlbCggb3MsIFpfREVGQVVMVF9DT01QUkVTU0lPTiApCisgICAgPDwgIkknbSBjb21wcmVzc2luZyBhZ2FpbiIgPDwgZW5kbDsKKworICBvcy5jbG9zZSgpOworCisgIHJldHVybiAwOworCit9CmRpZmYgLS1naXQgYS9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmNwcCBiL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTBiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmNwcApAQCAtMCwwICsxLDMyOSBAQAorCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSAiemZzdHJlYW0uaCIKKworZ3pmaWxlYnVmOjpnemZpbGVidWYoKSA6CisgIGZpbGUoTlVMTCksCisgIG1vZGUoMCksCisgIG93bl9maWxlX2Rlc2NyaXB0b3IoMCkKK3sgfQorCitnemZpbGVidWY6On5nemZpbGVidWYoKSB7CisKKyAgc3luYygpOworICBpZiAoIG93bl9maWxlX2Rlc2NyaXB0b3IgKQorICAgIGNsb3NlKCk7CisKK30KKworZ3pmaWxlYnVmICpnemZpbGVidWY6Om9wZW4oIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgaW50IGlvX21vZGUgKSB7CisKKyAgaWYgKCBpc19vcGVuKCkgKQorICAgIHJldHVybiBOVUxMOworCisgIGNoYXIgY2hhcl9tb2RlWzEwXTsKKyAgY2hhciAqcDsKKyAgbWVtc2V0KGNoYXJfbW9kZSwnXDAnLDEwKTsKKyAgcCA9IGNoYXJfbW9kZTsKKworICBpZiAoIGlvX21vZGUgJiBpb3M6OmluICkgeworICAgIG1vZGUgPSBpb3M6OmluOworICAgICpwKysgPSAncic7CisgIH0gZWxzZSBpZiAoIGlvX21vZGUgJiBpb3M6OmFwcCApIHsKKyAgICBtb2RlID0gaW9zOjphcHA7CisgICAgKnArKyA9ICdhJzsKKyAgfSBlbHNlIHsKKyAgICBtb2RlID0gaW9zOjpvdXQ7CisgICAgKnArKyA9ICd3JzsKKyAgfQorCisgIGlmICggaW9fbW9kZSAmIGlvczo6YmluYXJ5ICkgeworICAgIG1vZGUgfD0gaW9zOjpiaW5hcnk7CisgICAgKnArKyA9ICdiJzsKKyAgfQorCisgIC8vIEhhcmQgY29kZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwKKyAgaWYgKCBpb19tb2RlICYgKGlvczo6b3V0fGlvczo6YXBwICkpIHsKKyAgICAqcCsrID0gJzknOworICB9CisKKyAgaWYgKCAoZmlsZSA9IGd6b3BlbihuYW1lLCBjaGFyX21vZGUpKSA9PSBOVUxMICkKKyAgICByZXR1cm4gTlVMTDsKKworICBvd25fZmlsZV9kZXNjcmlwdG9yID0gMTsKKworICByZXR1cm4gdGhpczsKKworfQorCitnemZpbGVidWYgKmd6ZmlsZWJ1Zjo6YXR0YWNoKCBpbnQgZmlsZV9kZXNjcmlwdG9yLAorCQkJICAgICAgaW50IGlvX21vZGUgKSB7CisKKyAgaWYgKCBpc19vcGVuKCkgKQorICAgIHJldHVybiBOVUxMOworCisgIGNoYXIgY2hhcl9tb2RlWzEwXTsKKyAgY2hhciAqcDsKKyAgbWVtc2V0KGNoYXJfbW9kZSwnXDAnLDEwKTsKKyAgcCA9IGNoYXJfbW9kZTsKKworICBpZiAoIGlvX21vZGUgJiBpb3M6OmluICkgeworICAgIG1vZGUgPSBpb3M6OmluOworICAgICpwKysgPSAncic7CisgIH0gZWxzZSBpZiAoIGlvX21vZGUgJiBpb3M6OmFwcCApIHsKKyAgICBtb2RlID0gaW9zOjphcHA7CisgICAgKnArKyA9ICdhJzsKKyAgfSBlbHNlIHsKKyAgICBtb2RlID0gaW9zOjpvdXQ7CisgICAgKnArKyA9ICd3JzsKKyAgfQorCisgIGlmICggaW9fbW9kZSAmIGlvczo6YmluYXJ5ICkgeworICAgIG1vZGUgfD0gaW9zOjpiaW5hcnk7CisgICAgKnArKyA9ICdiJzsKKyAgfQorCisgIC8vIEhhcmQgY29kZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwKKyAgaWYgKCBpb19tb2RlICYgKGlvczo6b3V0fGlvczo6YXBwICkpIHsKKyAgICAqcCsrID0gJzknOworICB9CisKKyAgaWYgKCAoZmlsZSA9IGd6ZG9wZW4oZmlsZV9kZXNjcmlwdG9yLCBjaGFyX21vZGUpKSA9PSBOVUxMICkKKyAgICByZXR1cm4gTlVMTDsKKworICBvd25fZmlsZV9kZXNjcmlwdG9yID0gMDsKKworICByZXR1cm4gdGhpczsKKworfQorCitnemZpbGVidWYgKmd6ZmlsZWJ1Zjo6Y2xvc2UoKSB7CisKKyAgaWYgKCBpc19vcGVuKCkgKSB7CisKKyAgICBzeW5jKCk7CisgICAgZ3pjbG9zZSggZmlsZSApOworICAgIGZpbGUgPSBOVUxMOworCisgIH0KKworICByZXR1cm4gdGhpczsKKworfQorCitpbnQgZ3pmaWxlYnVmOjpzZXRjb21wcmVzc2lvbmxldmVsKCBzaG9ydCBjb21wX2xldmVsICkgeworCisgIHJldHVybiBnenNldHBhcmFtcyhmaWxlLCBjb21wX2xldmVsLCAtMik7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6c2V0Y29tcHJlc3Npb25zdHJhdGVneSggc2hvcnQgY29tcF9zdHJhdGVneSApIHsKKworICByZXR1cm4gZ3pzZXRwYXJhbXMoZmlsZSwgLTIsIGNvbXBfc3RyYXRlZ3kpOworCit9CisKKworc3RyZWFtcG9zIGd6ZmlsZWJ1Zjo6c2Vla29mZiggc3RyZWFtb2ZmIG9mZiwgaW9zOjpzZWVrX2RpciBkaXIsIGludCB3aGljaCApIHsKKworICByZXR1cm4gc3RyZWFtcG9zKEVPRik7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6dW5kZXJmbG93KCkgeworCisgIC8vIElmIHRoZSBmaWxlIGhhc24ndCBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZywgZXJyb3IuCisgIGlmICggIWlzX29wZW4oKSB8fCAhKG1vZGUgJiBpb3M6OmluKSApCisgICAgcmV0dXJuIEVPRjsKKworICAvLyBpZiBhIGJ1ZmZlciBkb2Vzbid0IGV4aXN0cywgYWxsb2NhdGUgb25lLgorICBpZiAoICFiYXNlKCkgKSB7CisKKyAgICBpZiAoIChhbGxvY2F0ZSgpKSA9PSBFT0YgKQorICAgICAgcmV0dXJuIEVPRjsKKyAgICBzZXRwKDAsMCk7CisKKyAgfSBlbHNlIHsKKworICAgIGlmICggaW5fYXZhaWwoKSApCisgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICpncHRyKCk7CisKKyAgICBpZiAoIG91dF93YWl0aW5nKCkgKSB7CisgICAgICBpZiAoIGZsdXNoYnVmKCkgPT0gRU9GICkKKwlyZXR1cm4gRU9GOworICAgIH0KKworICB9CisKKyAgLy8gQXR0ZW1wdCB0byBmaWxsIHRoZSBidWZmZXIuCisKKyAgaW50IHJlc3VsdCA9IGZpbGxidWYoKTsKKyAgaWYgKCByZXN1bHQgPT0gRU9GICkgeworICAgIC8vIGRpc2FibGUgZ2V0IGFyZWEKKyAgICBzZXRnKDAsMCwwKTsKKyAgICByZXR1cm4gRU9GOworICB9CisKKyAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSAqZ3B0cigpOworCit9CisKK2ludCBnemZpbGVidWY6Om92ZXJmbG93KCBpbnQgYyApIHsKKworICBpZiAoICFpc19vcGVuKCkgfHwgIShtb2RlICYgaW9zOjpvdXQpICkKKyAgICByZXR1cm4gRU9GOworCisgIGlmICggIWJhc2UoKSApIHsKKyAgICBpZiAoIGFsbG9jYXRlKCkgPT0gRU9GICkKKyAgICAgIHJldHVybiBFT0Y7CisgICAgc2V0ZygwLDAsMCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGluX2F2YWlsKCkpIHsKKwlyZXR1cm4gRU9GOworICAgIH0KKyAgICBpZiAob3V0X3dhaXRpbmcoKSkgeworICAgICAgaWYgKGZsdXNoYnVmKCkgPT0gRU9GKQorCXJldHVybiBFT0Y7CisgICAgfQorICB9CisKKyAgaW50IGJsID0gYmxlbigpOworICBzZXRwKCBiYXNlKCksIGJhc2UoKSArIGJsKTsKKworICBpZiAoIGMgIT0gRU9GICkgeworCisgICAgKnBwdHIoKSA9IGM7CisgICAgcGJ1bXAoMSk7CisKKyAgfQorCisgIHJldHVybiAwOworCit9CisKK2ludCBnemZpbGVidWY6OnN5bmMoKSB7CisKKyAgaWYgKCAhaXNfb3BlbigpICkKKyAgICByZXR1cm4gRU9GOworCisgIGlmICggb3V0X3dhaXRpbmcoKSApCisgICAgcmV0dXJuIGZsdXNoYnVmKCk7CisKKyAgcmV0dXJuIDA7CisKK30KKworaW50IGd6ZmlsZWJ1Zjo6Zmx1c2hidWYoKSB7CisKKyAgaW50IG47CisgIGNoYXIgKnE7CisKKyAgcSA9IHBiYXNlKCk7CisgIG4gPSBwcHRyKCkgLSBxOworCisgIGlmICggZ3p3cml0ZSggZmlsZSwgcSwgbikgPCBuICkKKyAgICByZXR1cm4gRU9GOworCisgIHNldHAoMCwwKTsKKworICByZXR1cm4gMDsKKworfQorCitpbnQgZ3pmaWxlYnVmOjpmaWxsYnVmKCkgeworCisgIGludCByZXF1aXJlZDsKKyAgY2hhciAqcDsKKworICBwID0gYmFzZSgpOworCisgIHJlcXVpcmVkID0gYmxlbigpOworCisgIGludCB0ID0gZ3pyZWFkKCBmaWxlLCBwLCByZXF1aXJlZCApOworCisgIGlmICggdCA8PSAwKSByZXR1cm4gRU9GOworCisgIHNldGcoIGJhc2UoKSwgYmFzZSgpLCBiYXNlKCkrdCk7CisKKyAgcmV0dXJuIHQ7CisKK30KKworZ3pmaWxlc3RyZWFtX2NvbW1vbjo6Z3pmaWxlc3RyZWFtX2NvbW1vbigpIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sgfQorCitnemZpbGVzdHJlYW1fY29tbW9uOjp+Z3pmaWxlc3RyZWFtX2NvbW1vbigpCit7IH0KKwordm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGludCBmZCwgaW50IGlvX21vZGUgKSB7CisKKyAgaWYgKCAhYnVmZmVyLmF0dGFjaCggZmQsIGlvX21vZGUpICkKKyAgICBjbGVhciggaW9zOjpmYWlsYml0IHwgaW9zOjpiYWRiaXQgKTsKKyAgZWxzZQorICAgIGNsZWFyKCk7CisKK30KKwordm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIHsKKworICBpZiAoICFidWZmZXIub3BlbiggbmFtZSwgaW9fbW9kZSApICkKKyAgICBjbGVhciggaW9zOjpmYWlsYml0IHwgaW9zOjpiYWRiaXQgKTsKKyAgZWxzZQorICAgIGNsZWFyKCk7CisKK30KKwordm9pZCBnemZpbGVzdHJlYW1fY29tbW9uOjpjbG9zZSgpIHsKKworICBpZiAoICFidWZmZXIuY2xvc2UoKSApCisgICAgY2xlYXIoIGlvczo6ZmFpbGJpdCB8IGlvczo6YmFkYml0ICk7CisKK30KKworZ3pmaWxlYnVmICpnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpIHsKKworICByZXR1cm4gJmJ1ZmZlcjsKKworfQorICAgICAKK2d6aWZzdHJlYW06Omd6aWZzdHJlYW0oKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGNsZWFyKCBpb3M6OmJhZGJpdCApOworfQorCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggbmFtZSwgaW9fbW9kZSApOworfQorCitnemlmc3RyZWFtOjpnemlmc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGZkLCBpb19tb2RlICk7Cit9CisKK2d6aWZzdHJlYW06On5nemlmc3RyZWFtKCkgeyB9CisKK2d6b2ZzdHJlYW06Omd6b2ZzdHJlYW0oKSA6CisgIGlvcyggZ3pmaWxlc3RyZWFtX2NvbW1vbjo6cmRidWYoKSApCit7CisgIGNsZWFyKCBpb3M6OmJhZGJpdCApOworfQorCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApIDoKKyAgaW9zKCBnemZpbGVzdHJlYW1fY29tbW9uOjpyZGJ1ZigpICkKK3sKKyAgZ3pmaWxlc3RyZWFtX2NvbW1vbjo6b3BlbiggbmFtZSwgaW9fbW9kZSApOworfQorCitnem9mc3RyZWFtOjpnem9mc3RyZWFtKCBpbnQgZmQsIGludCBpb19tb2RlICkgOgorICBpb3MoIGd6ZmlsZXN0cmVhbV9jb21tb246OnJkYnVmKCkgKQoreworICBnemZpbGVzdHJlYW1fY29tbW9uOjphdHRhY2goIGZkLCBpb19tb2RlICk7Cit9CisKK2d6b2ZzdHJlYW06On5nem9mc3RyZWFtKCkgeyB9CmRpZmYgLS1naXQgYS9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmggYi9jb250cmliL2lvc3RyZWFtL3pmc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3ZmEwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaW9zdHJlYW0vemZzdHJlYW0uaApAQCAtMCwwICsxLDE0MiBAQAorCisjaWZuZGVmIF96ZnN0cmVhbV9oCisjZGVmaW5lIF96ZnN0cmVhbV9oCisKKyNpbmNsdWRlIDxmc3RyZWFtLmg+CisjaW5jbHVkZSAiemxpYi5oIgorCitjbGFzcyBnemZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKKworcHVibGljOgorCisgIGd6ZmlsZWJ1ZiggKTsKKyAgdmlydHVhbCB+Z3pmaWxlYnVmKCk7CisKKyAgZ3pmaWxlYnVmICpvcGVuKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSApOworICBnemZpbGVidWYgKmF0dGFjaCggaW50IGZpbGVfZGVzY3JpcHRvciwgaW50IGlvX21vZGUgKTsKKyAgZ3pmaWxlYnVmICpjbG9zZSgpOworCisgIGludCBzZXRjb21wcmVzc2lvbmxldmVsKCBzaG9ydCBjb21wX2xldmVsICk7CisgIGludCBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KCBzaG9ydCBjb21wX3N0cmF0ZWd5ICk7CisKKyAgaW5saW5lIGludCBpc19vcGVuKCkgY29uc3QgeyByZXR1cm4gKGZpbGUgIT1OVUxMKTsgfQorCisgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYoIHN0cmVhbW9mZiwgaW9zOjpzZWVrX2RpciwgaW50ICk7CisKKyAgdmlydHVhbCBpbnQgc3luYygpOworCitwcm90ZWN0ZWQ6CisKKyAgdmlydHVhbCBpbnQgdW5kZXJmbG93KCk7CisgIHZpcnR1YWwgaW50IG92ZXJmbG93KCBpbnQgPSBFT0YgKTsKKworcHJpdmF0ZToKKworICBnekZpbGUgZmlsZTsKKyAgc2hvcnQgbW9kZTsKKyAgc2hvcnQgb3duX2ZpbGVfZGVzY3JpcHRvcjsKKworICBpbnQgZmx1c2hidWYoKTsKKyAgaW50IGZpbGxidWYoKTsKKworfTsKKworY2xhc3MgZ3pmaWxlc3RyZWFtX2NvbW1vbiA6IHZpcnR1YWwgcHVibGljIGlvcyB7CisKKyAgZnJpZW5kIGNsYXNzIGd6aWZzdHJlYW07CisgIGZyaWVuZCBjbGFzcyBnem9mc3RyZWFtOworICBmcmllbmQgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25sZXZlbCggZ3pvZnN0cmVhbSAmLCBpbnQgKTsKKyAgZnJpZW5kIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9uc3RyYXRlZ3koIGd6b2ZzdHJlYW0gJiwgaW50ICk7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+Z3pmaWxlc3RyZWFtX2NvbW1vbigpOworCisgIHZvaWQgYXR0YWNoKCBpbnQgZmQsIGludCBpb19tb2RlICk7CisgIHZvaWQgb3BlbiggY29uc3QgY2hhciAqbmFtZSwgaW50IGlvX21vZGUgKTsKKyAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgIGd6ZmlsZXN0cmVhbV9jb21tb24oKTsKKworcHJpdmF0ZToKKyAgZ3pmaWxlYnVmICpyZGJ1ZigpOworCisgIGd6ZmlsZWJ1ZiBidWZmZXI7CisKK307CisKK2NsYXNzIGd6aWZzdHJlYW0gOiBwdWJsaWMgZ3pmaWxlc3RyZWFtX2NvbW1vbiwgcHVibGljIGlzdHJlYW0geworCitwdWJsaWM6CisKKyAgZ3ppZnN0cmVhbSgpOworICBnemlmc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSA9IGlvczo6aW4gKTsKKyAgZ3ppZnN0cmVhbSggaW50IGZkLCBpbnQgaW9fbW9kZSA9IGlvczo6aW4gKTsKKworICB2aXJ0dWFsIH5nemlmc3RyZWFtKCk7CisKK307CisKK2NsYXNzIGd6b2ZzdHJlYW0gOiBwdWJsaWMgZ3pmaWxlc3RyZWFtX2NvbW1vbiwgcHVibGljIG9zdHJlYW0geworCitwdWJsaWM6CisKKyAgZ3pvZnN0cmVhbSgpOworICBnem9mc3RyZWFtKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgaW9fbW9kZSA9IGlvczo6b3V0ICk7CisgIGd6b2ZzdHJlYW0oIGludCBmZCwgaW50IGlvX21vZGUgPSBpb3M6Om91dCApOworCisgIHZpcnR1YWwgfmd6b2ZzdHJlYW0oKTsKKworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZ3pvbWFuaXAgeworICBmcmllbmQgZ3pvZnN0cmVhbSAmb3BlcmF0b3I8PChnem9mc3RyZWFtICYsIGNvbnN0IGd6b21hbmlwPFQ+ICYpOworcHVibGljOgorICBnem9tYW5pcChnem9mc3RyZWFtICYoKmYpKGd6b2ZzdHJlYW0gJiwgVCksIFQgdikgOiBmdW5jKGYpLCB2YWwodikgeyB9Citwcml2YXRlOgorICBnem9mc3RyZWFtICYoKmZ1bmMpKGd6b2ZzdHJlYW0gJiwgVCk7CisgIFQgdmFsOworfTsKKwordGVtcGxhdGU8Y2xhc3MgVD4gZ3pvZnN0cmVhbSAmb3BlcmF0b3I8PChnem9mc3RyZWFtICZzLAorCQkJCQkgY29uc3QgZ3pvbWFuaXA8VD4gJm0pIHsKKyAgcmV0dXJuICgqbS5mdW5jKShzLCBtLnZhbCk7CisgIAorfQorCitpbmxpbmUgZ3pvZnN0cmVhbSAmc2V0Y29tcHJlc3Npb25sZXZlbCggZ3pvZnN0cmVhbSAmcywgaW50IGwgKSB7CisgIChzLnJkYnVmKCkpLT5zZXRjb21wcmVzc2lvbmxldmVsKGwpOworICByZXR1cm4gczsKK30KKworaW5saW5lIGd6b2ZzdHJlYW0gJnNldGNvbXByZXNzaW9uc3RyYXRlZ3koIGd6b2ZzdHJlYW0gJnMsIGludCBsICkgeworICAocy5yZGJ1ZigpKS0+c2V0Y29tcHJlc3Npb25zdHJhdGVneShsKTsKKyAgcmV0dXJuIHM7Cit9CisKK2lubGluZSBnem9tYW5pcDxpbnQ+IHNldGNvbXByZXNzaW9ubGV2ZWwoaW50IGwpCit7CisgIHJldHVybiBnem9tYW5pcDxpbnQ+KCZzZXRjb21wcmVzc2lvbmxldmVsLGwpOworfQorCitpbmxpbmUgZ3pvbWFuaXA8aW50PiBzZXRjb21wcmVzc2lvbnN0cmF0ZWd5KGludCBsKQoreworICByZXR1cm4gZ3pvbWFuaXA8aW50Pigmc2V0Y29tcHJlc3Npb25zdHJhdGVneSxsKTsKK30KKworI2VuZGlmCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmggYi9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkMjMzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvaW9zdHJlYW0yL3pzdHJlYW0uaApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqIENocmlzdGlhbiBNaWNoZWxzZW4gUmVzZWFyY2ggQVMKKyAqIEFkdmFuY2VkIENvbXB1dGluZworICogRmFudG9mdHZlZ2VuIDM4LCA1MDM2IEJFUkdFTiwgTm9yd2F5CisgKiBodHRwOi8vd3d3LmNtci5ubworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kCisgKiB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhcgorICogaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLiAgQ2hyaXN0aWFuIE1pY2hlbHNlbiBSZXNlYXJjaCBBUyBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqLworCisjaWZuZGVmIFpTVFJFQU1fX0gKKyNkZWZpbmUgWlNUUkVBTV9fSAorCisvKgorICogenN0cmVhbS5oIC0gQysrIGludGVyZmFjZSB0byB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgKiAkSWQ6IHpzdHJlYW0uaCAxLjEgMTk5Ny0wNi0yNSAxMjowMDo1NiswMiB0eWdlIEV4cCB0eWdlICQKKyAqLworCisjaW5jbHVkZSA8c3Ryc3RyZWFtLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ6bGliLmgiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyMgICBpbmNsdWRlIDxmY250bC5oPgorIyAgIGluY2x1ZGUgPGlvLmg+CisjICAgZGVmaW5lIFNFVF9CSU5BUllfTU9ERShmaWxlKSBzZXRtb2RlKGZpbGVubyhmaWxlKSwgT19CSU5BUlkpCisjZWxzZQorIyAgIGRlZmluZSBTRVRfQklOQVJZX01PREUoZmlsZSkKKyNlbmRpZgorCitjbGFzcyB6c3RyaW5nbGVuIHsKK3B1YmxpYzoKKyAgICB6c3RyaW5nbGVuKGNsYXNzIGl6c3RyZWFtJik7CisgICAgenN0cmluZ2xlbihjbGFzcyBvenN0cmVhbSYsIGNvbnN0IGNoYXIqKTsKKyAgICBzaXplX3QgdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWwud29yZDsgfQorcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVmFsIHsgdW5zaWduZWQgY2hhciBieXRlOyBzaXplX3Qgd29yZDsgfSB2YWw7Cit9OworCisvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaXpzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgaXpzdHJlYW0KK3sKKyAgICBwdWJsaWM6CisgICAgICAgIGl6c3RyZWFtKCkgOiBtX2ZwKDApIHt9CisgICAgICAgIGl6c3RyZWFtKEZJTEUqIGZwKSA6IG1fZnAoMCkgeyBvcGVuKGZwKTsgfQorICAgICAgICBpenN0cmVhbShjb25zdCBjaGFyKiBuYW1lKSA6IG1fZnAoMCkgeyBvcGVuKG5hbWUpOyB9CisgICAgICAgIH5penN0cmVhbSgpIHsgY2xvc2UoKTsgfQorCisgICAgICAgIC8qIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nLgorICAgICAgICAgKiBvcGVuKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGZpbGUgd2hpY2ggaXMgbm90IGluIGd6aXAgZm9ybWF0OworICAgICAgICAgKiBpbiB0aGlzIGNhc2UgcmVhZCgpIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQKKyAgICAgICAgICogZGVjb21wcmVzc2lvbi4gZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yCisgICAgICAgICAqIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnApIHsKKyAgICAgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgInJiIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIGlucHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKKyAgICAgICAgICogYW5kIGRlYWxsb2NhdGVzIGFsbCB0aGUgKGRlKWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgcmV0dXJuIHZhbHVlIGlzCisgICAgICAgICAqIHRoZSB6bGliIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGVycm9yKCkgYmVsb3cpLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGNsb3NlKCkgeworICAgICAgICAgICAgaW50IHIgPSA6Omd6Y2xvc2UobV9mcCk7CisgICAgICAgICAgICBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgcmVhZCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgICovCisgICAgICAgIGludCByZWFkKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3pyZWFkKG1fZnAsIGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBsYXN0IGVycm9yIHdoaWNoIG9jY3VycmVkIG9uIHRoZQorICAgICAgICAgKiBnaXZlbiBjb21wcmVzc2VkIGZpbGUuIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuIElmIGFuCisgICAgICAgICAqIGVycm9yIG9jY3VycmVkIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbm90IGluIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5LAorICAgICAgICAgKiBlcnJudW0gaXMgc2V0IHRvIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubworICAgICAgICAgKiB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBjaGFyKiBlcnJvcihpbnQqIGVycm51bSkgeworICAgICAgICAgICAgcmV0dXJuIDo6Z3plcnJvcihtX2ZwLCBlcnJudW0pOworICAgICAgICB9CisKKyAgICAgICAgZ3pGaWxlIGZwKCkgeyByZXR1cm4gbV9mcDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZ3pGaWxlIG1fZnA7Cit9OworCisvKgorICogQmluYXJ5IHJlYWQgdGhlIGdpdmVuIChhcnJheSBvZikgb2JqZWN0KHMpIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KKyAqIElmIHRoZSBpbnB1dCBmaWxlIHdhcyBub3QgaW4gZ3ppcCBmb3JtYXQsIHJlYWQoKSBjb3BpZXMgdGhlIG9iamVjdHMgbnVtYmVyCisgKiBvZiBieXRlcyBpbnRvIHRoZSBidWZmZXIuCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHJlYWQKKyAqICgwIGZvciBlbmQgb2YgZmlsZSwgLTEgZm9yIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCByZWFkKGl6c3RyZWFtJiB6cywgVCogeCwgSXRlbXMgaXRlbXMpIHsKKyAgICByZXR1cm4gOjpnenJlYWQoenMuZnAoKSwgeCwgaXRlbXMqc2l6ZW9mKFQpKTsKK30KKworLyoKKyAqIEJpbmFyeSBpbnB1dCB3aXRoIHRoZSAnPicgb3BlcmF0b3IuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBUJiB4KSB7CisgICAgOjpnenJlYWQoenMuZnAoKSwgJngsIHNpemVvZihUKSk7CisgICAgcmV0dXJuIHpzOworfQorCisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKGl6c3RyZWFtJiB6cykgeworICAgIHpzID4gdmFsLmJ5dGU7CisgICAgaWYgKHZhbC5ieXRlID09IDI1NSkgenMgPiB2YWwud29yZDsKKyAgICBlbHNlIHZhbC53b3JkID0gdmFsLmJ5dGU7Cit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBvZiBzdHJpbmcgKyB0aGUgc3RyaW5nIHdpdGggdGhlICc+JyBvcGVyYXRvci4KKyAqLworaW5saW5lIGl6c3RyZWFtJiBvcGVyYXRvcj4oaXpzdHJlYW0mIHpzLCBjaGFyKiB4KSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIDo6Z3pyZWFkKHpzLmZwKCksIHgsIGxlbi52YWx1ZSgpKTsKKyAgICB4W2xlbi52YWx1ZSgpXSA9ICdcMCc7CisgICAgcmV0dXJuIHpzOworfQorCitpbmxpbmUgY2hhciogcmVhZF9zdHJpbmcoaXpzdHJlYW0mIHpzKSB7CisgICAgenN0cmluZ2xlbiBsZW4oenMpOworICAgIGNoYXIqIHggPSBuZXcgY2hhcltsZW4udmFsdWUoKSsxXTsKKyAgICA6Omd6cmVhZCh6cy5mcCgpLCB4LCBsZW4udmFsdWUoKSk7CisgICAgeFtsZW4udmFsdWUoKV0gPSAnXDAnOworICAgIHJldHVybiB4OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvenN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBvenN0cmVhbQoreworICAgIHB1YmxpYzoKKyAgICAgICAgb3pzdHJlYW0oKSA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKEZJTEUqIGZwLCBpbnQgbGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pCisgICAgICAgICAgICA6IG1fZnAoMCksIG1fb3MoMCkgeworICAgICAgICAgICAgb3BlbihmcCwgbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIG96c3RyZWFtKGNvbnN0IGNoYXIqIG5hbWUsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikKKyAgICAgICAgICAgIDogbV9mcCgwKSwgbV9vcygwKSB7CisgICAgICAgICAgICBvcGVuKG5hbWUsIGxldmVsKTsKKyAgICAgICAgfQorICAgICAgICB+b3pzdHJlYW0oKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyogT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHdyaXRpbmcuCisgICAgICAgICAqIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIDAuLjkKKyAgICAgICAgICogZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGlzdGluZ3Vpc2ggdHdvIGVycm9yIGNhc2VzCisgICAgICAgICAqIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUgemxpYiBlcnJvciBpcyBaX01FTV9FUlJPUikuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSB7CisgICAgICAgICAgICBjaGFyIG1vZGVbNF0gPSAid2JcMCI7CisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBtb2RlWzJdID0gJzAnK2xldmVsOworICAgICAgICAgICAgaWYgKG1fZnApIGNsb3NlKCk7CisgICAgICAgICAgICBtX2ZwID0gOjpnem9wZW4obmFtZSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBvcGVuIGZyb20gYSBGSUxFIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICB2b2lkIG9wZW4oRklMRSogZnAsIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTikgeworICAgICAgICAgICAgU0VUX0JJTkFSWV9NT0RFKGZwKTsKKyAgICAgICAgICAgIGNoYXIgbW9kZVs0XSA9ICJ3YlwwIjsKKyAgICAgICAgICAgIGlmIChsZXZlbCAhPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIG1vZGVbMl0gPSAnMCcrbGV2ZWw7CisgICAgICAgICAgICBpZiAobV9mcCkgY2xvc2UoKTsKKyAgICAgICAgICAgIG1fZnAgPSA6Omd6ZG9wZW4oZmlsZW5vKGZwKSwgbW9kZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCisgICAgICAgICAqIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gVGhlIHJldHVybiB2YWx1ZSBpcworICAgICAgICAgKiB0aGUgemxpYiBlcnJvciBudW1iZXIgKHNlZSBmdW5jdGlvbiBlcnJvcigpIGJlbG93KS4KKyAgICAgICAgICovCisgICAgICAgIGludCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGlmIChtX29zKSB7CisgICAgICAgICAgICAgICAgOjpnendyaXRlKG1fZnAsIG1fb3MtPnN0cigpLCBtX29zLT5wY291bnQoKSk7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gbV9vcy0+c3RyKCk7IGRlbGV0ZSBtX29zOyBtX29zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCByID0gOjpnemNsb3NlKG1fZnApOyBtX2ZwID0gMDsgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICAvKiBCaW5hcnkgd3JpdGUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBpbnQgd3JpdGUoY29uc3Qgdm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gOjpnendyaXRlKG1fZnAsICh2b2lkcCkgYnVmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgLyogRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCisgICAgICAgICAqIF9mbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB6bGliCisgICAgICAgICAqIGVycm9yIG51bWJlciAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiBmbHVzaCgpIHJldHVybnMgWl9PSyBpZgorICAgICAgICAgKiB0aGUgZmx1c2hfIHBhcmFtZXRlciBpcyBaX0ZJTklTSCBhbmQgYWxsIG91dHB1dCBjb3VsZCBiZSBmbHVzaGVkLgorICAgICAgICAgKiBmbHVzaCgpIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgorICAgICAgICAgKiBkZWdyYWRlIGNvbXByZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGZsdXNoKGludCBfZmx1c2gpIHsKKyAgICAgICAgICAgIG9zX2ZsdXNoKCk7CisgICAgICAgICAgICByZXR1cm4gOjpnemZsdXNoKG1fZnAsIF9mbHVzaCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUKKyAgICAgICAgICogZ2l2ZW4gY29tcHJlc3NlZCBmaWxlLiBlcnJudW0gaXMgc2V0IHRvIHpsaWIgZXJyb3IgbnVtYmVyLiBJZiBhbgorICAgICAgICAgKiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gYW5kIG5vdCBpbiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSwKKyAgICAgICAgICogZXJybnVtIGlzIHNldCB0byBaX0VSUk5PIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IGNvbnN1bHQgZXJybm8KKyAgICAgICAgICogdG8gZ2V0IHRoZSBleGFjdCBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgY2hhciogZXJyb3IoaW50KiBlcnJudW0pIHsKKyAgICAgICAgICAgIHJldHVybiA6Omd6ZXJyb3IobV9mcCwgZXJybnVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGd6RmlsZSBmcCgpIHsgcmV0dXJuIG1fZnA7IH0KKworICAgICAgICBvc3RyZWFtJiBvcygpIHsKKyAgICAgICAgICAgIGlmIChtX29zID09IDApIG1fb3MgPSBuZXcgb3N0cnN0cmVhbTsKKyAgICAgICAgICAgIHJldHVybiAqbV9vczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb3NfZmx1c2goKSB7CisgICAgICAgICAgICBpZiAobV9vcyAmJiBtX29zLT5wY291bnQoKT4wKSB7CisgICAgICAgICAgICAgICAgb3N0cnN0cmVhbSogb3NzID0gbmV3IG9zdHJzdHJlYW07CisgICAgICAgICAgICAgICAgb3NzLT5maWxsKG1fb3MtPmZpbGwoKSk7CisgICAgICAgICAgICAgICAgb3NzLT5mbGFncyhtX29zLT5mbGFncygpKTsKKyAgICAgICAgICAgICAgICBvc3MtPnByZWNpc2lvbihtX29zLT5wcmVjaXNpb24oKSk7CisgICAgICAgICAgICAgICAgb3NzLT53aWR0aChtX29zLT53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICA6Omd6d3JpdGUobV9mcCwgbV9vcy0+c3RyKCksIG1fb3MtPnBjb3VudCgpKTsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBtX29zLT5zdHIoKTsgZGVsZXRlIG1fb3M7IG1fb3MgPSBvc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGd6RmlsZSBtX2ZwOworICAgICAgICBvc3Ryc3RyZWFtKiBtX29zOworfTsKKworLyoKKyAqIEJpbmFyeSB3cml0ZSB0aGUgZ2l2ZW4gKGFycmF5IG9mKSBvYmplY3QocykgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuCisgKiAoMCBpbiBjYXNlIG9mIGVycm9yKS4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEl0ZW1zPgoraW5saW5lIGludCB3cml0ZShvenN0cmVhbSYgenMsIGNvbnN0IFQqIHgsIEl0ZW1zIGl0ZW1zKSB7CisgICAgcmV0dXJuIDo6Z3p3cml0ZSh6cy5mcCgpLCAodm9pZHApIHgsIGl0ZW1zKnNpemVvZihUKSk7Cit9CisKKy8qCisgKiBCaW5hcnkgb3V0cHV0IHdpdGggdGhlICc8JyBvcGVyYXRvci4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitpbmxpbmUgb3pzdHJlYW0mIG9wZXJhdG9yPChvenN0cmVhbSYgenMsIGNvbnN0IFQmIHgpIHsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSAmeCwgc2l6ZW9mKFQpKTsKKyAgICByZXR1cm4genM7Cit9CisKK2lubGluZSB6c3RyaW5nbGVuOjp6c3RyaW5nbGVuKG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHZhbC5ieXRlID0gMjU1OyAgdmFsLndvcmQgPSA6OnN0cmxlbih4KTsKKyAgICBpZiAodmFsLndvcmQgPCAyNTUpIHpzIDwgKHZhbC5ieXRlID0gdmFsLndvcmQpOworICAgIGVsc2UgenMgPCB2YWw7Cit9CisKKy8qCisgKiBXcml0ZSBsZW5ndGggb2Ygc3RyaW5nICsgdGhlIHN0cmluZyB3aXRoIHRoZSAnPCcgb3BlcmF0b3IuCisgKi8KK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY29uc3QgY2hhciogeCkgeworICAgIHpzdHJpbmdsZW4gbGVuKHpzLCB4KTsKKyAgICA6Omd6d3JpdGUoenMuZnAoKSwgKHZvaWRwKSB4LCBsZW4udmFsdWUoKSk7CisgICAgcmV0dXJuIHpzOworfQorCisjaWZkZWYgX01TQ19WRVIKK2lubGluZSBvenN0cmVhbSYgb3BlcmF0b3I8KG96c3RyZWFtJiB6cywgY2hhciogY29uc3QmIHgpIHsKKyAgICByZXR1cm4genMgPCAoY29uc3QgY2hhciopIHg7Cit9CisjZW5kaWYKKworLyoKKyAqIEFzY2lpIHdyaXRlIHdpdGggdGhlIDw8IG9wZXJhdG9yOworICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBvc3RyZWFtJiBvcGVyYXRvcjw8KG96c3RyZWFtJiB6cywgY29uc3QgVCYgeCkgeworICAgIHpzLm9zX2ZsdXNoKCk7CisgICAgcmV0dXJuIHpzLm9zKCkgPDwgeDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb250cmliL2lvc3RyZWFtMi96c3RyZWFtX3Rlc3QuY3BwIGIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJkNTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9pb3N0cmVhbTIvenN0cmVhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSAienN0cmVhbS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpb21hbmlwLmg+CisKK3ZvaWQgbWFpbigpIHsKKwljaGFyIGhbMjU2XSA9ICJIZWxsbyI7CisJY2hhciogZyA9ICJHb29kYnllIjsKKwlvenN0cmVhbSBvdXQoInRlbXAuZ3oiKTsKKyAgICBvdXQgPCAiVGhpcyB3b3JrcyB3ZWxsIiA8IGggPCBnOworICAgIG91dC5jbG9zZSgpOworCisgICAgaXpzdHJlYW0gaW4oInRlbXAuZ3oiKTsgLy8gcmVhZCBpdCBiYWNrCisgICAgY2hhciAqeCA9IHJlYWRfc3RyaW5nKGluKSwgKnkgPSBuZXcgY2hhclsyNTZdLCB6WzI1Nl07CisgICAgaW4gPiB5ID4gejsKKyAgICBpbi5jbG9zZSgpOworICAgIGNvdXQgPDwgeCA8PCBlbmRsIDw8IHkgPDwgZW5kbCA8PCB6IDw8IGVuZGw7CisKKyAgICBvdXQub3BlbigidGVtcC5neiIpOyAvLyB0cnkgYXNjaWkgb3V0cHV0OyB6Y2F0IHRlbXAuZ3ogdG8gc2VlIHRoZSByZXN1bHRzCisgICAgb3V0IDw8IHNldHcoNTApIDw8IHNldGZpbGwoJyMnKSA8PCBzZXRwcmVjaXNpb24oMjApIDw8IHggPDwgZW5kbCA8PCB5IDw8IGVuZGwgPDwgeiA8PCBlbmRsOworICAgIG91dCA8PCB6IDw8IGVuZGwgPDwgeSA8PCBlbmRsIDw8IHggPDwgZW5kbDsKKyAgICBvdXQgPDwgMS4xMjM0NTY3ODkwMTIzNDU2Nzg5IDw8IGVuZGw7CisKKyAgICBkZWxldGVbXSB4OyBkZWxldGVbXSB5OworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi91bnRnei9NYWtlZmlsZSBiL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5YjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdW50Z3ovTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorQ0M9Y2MKK0NGTEFHUz0tZworCit1bnRnejogdW50Z3oubyAgLi4vLi4vbGliei5hCisJJChDQykgJChDRkxBR1MpIC1vIHVudGd6ICB1bnRnei5vIC1MLi4vLi4gLWx6CisKK3VudGd6Lm86IHVudGd6LmMgLi4vLi4vemxpYi5oCisJJChDQykgJChDRkxBR1MpIC1jIC1JLi4vLi4gdW50Z3ouYworCisuLi8uLi9saWJ6LmE6CisJY2QgLi4vLi47IG1ha2UKKworY2xlYW46CisJcm0gLWYgdW50Z3ogdW50Z3oubyAqfgpkaWZmIC0tZ2l0IGEvY29udHJpYi91bnRnei9tYWtlZmlsZS53MzIgYi9jb250cmliL3VudGd6L21ha2VmaWxlLnczMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTlkYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi91bnRnei9tYWtlZmlsZS53MzIKQEAgLTAsMCArMSw2MyBAQAorIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBtaW5ndzMyCisjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisKKyMgVG8gY29tcGlsZSwgCisjIAorIyAgIG1ha2UgLWZtYWtlZmlsZS53MzIKKyMgCisKK0NDPWdjYworCisjIEdlbmVyYXRlIGRlcGVuZGVuY2llcyAoc2VlIGVuZCBvZiB0aGUgZmlsZSkKKworQ1BQRkxBR1M9LU1NRCAKKworI0NGTEFHUz0tTU1EIC1PCisjQ0ZMQUdTPS1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03CisjQ0ZMQUdTPS1NTUQgLWcgLURERUJVRworQ0ZMQUdTPS1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKKyAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCisKKyMgSWYgY3AuZXhlIGlzIG5vdCBmb3VuZCwgcmVwbGFjZSB3aXRoIGNvcHkgL1kgLgorQ1A9Y3AgLWYKKworIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBSTSBpcyAicm0gLWYuIiAgCisjIElmICJybS5leGUiIGlzIG5vdCBmb3VuZCwgdW5jb21tZW50OgorIyBSTT1kZWwKKworTEQ9Z2NjCitMRExJQlM9LUwuIC1segorTERGTEFHUz0tcworCisKK0lOQ0w9emxpYi5oIHpjb25mLmgKK0xJQlM9bGliei5hCisKK0FSPWFyIHJjcworCitPQkpTID0gYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21wci5vIGRlZmxhdGUubyB0cmVlcy5vIFwKKyAgICAgICB6dXRpbC5vIGluZmxhdGUubyBpbmZibG9jay5vIGluZnRyZWVzLm8gaW5mY29kZXMubyBpbmZ1dGlsLm8gXAorICAgICAgIGluZmZhc3QubworCitURVNUX09CSlMgPSBtaW5pZ3ppcC5vIHVudGd6Lm8KKworYWxsOiBtaW5pZ3ppcC5leGUgdW50Z3ouZXhlCisKK3JlYnVpbGQ6CWNsZWFuCWFsbAorCitsaWJ6LmE6ICQoT0JKUykKKwkkKEFSKSAkQCAkKE9CSlMpCisKKyUuZXhlIDogJS5vICQoTElCUykKKwkkKExEKSAkKExERkxBR1MpIC1vICRAICQ8ICQoTERMSUJTKQorCisuUEhPTlkgOiBjbGVhbgorCitjbGVhbjoKKwkkKFJNKSAqLmQgKi5vICouZXhlIGxpYnouYSBmb28uZ3oKKworREVQUyA6PSAkKHdpbGRjYXJkICouZCkKK2lmbmVxICgkKERFUFMpLCkKK2luY2x1ZGUgJChERVBTKQorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY29udHJpYi91bnRnei91bnRnei5jIGIvY29udHJpYi91bnRnei91bnRnei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYTlhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3VudGd6L3VudGd6LmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiB1bnRnei5jIC0tIERpc3BsYXkgY29udGVudHMgYW5kL29yIGV4dHJhY3QgZmlsZSBmcm9tCisgKiBhIGd6aXAnZCBUQVIgZmlsZQorICogd3JpdHRlbiBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4KKyAqIGFkYXB0YXRpb24gdG8gVW5peCBieSBKZWFuLWxvdXAgR2FpbGx5IDxqbG91cEBnemlwLm9yZz4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgdW5peAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ6bGliLmgiCisKKy8qIFZhbHVlcyB1c2VkIGluIHR5cGVmbGFnIGZpZWxkLiAgKi8KKworI2RlZmluZSBSRUdUWVBFCSAnMCcJCS8qIHJlZ3VsYXIgZmlsZSAqLworI2RlZmluZSBBUkVHVFlQRSAnXDAnCQkvKiByZWd1bGFyIGZpbGUgKi8KKyNkZWZpbmUgTE5LVFlQRSAgJzEnCQkvKiBsaW5rICovCisjZGVmaW5lIFNZTVRZUEUgICcyJwkJLyogcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQ0hSVFlQRSAgJzMnCQkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLworI2RlZmluZSBCTEtUWVBFICAnNCcJCS8qIGJsb2NrIHNwZWNpYWwgKi8KKyNkZWZpbmUgRElSVFlQRSAgJzUnCQkvKiBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRklGT1RZUEUgJzYnCQkvKiBGSUZPIHNwZWNpYWwgKi8KKyNkZWZpbmUgQ09OVFRZUEUgJzcnCQkvKiByZXNlcnZlZCAqLworCisjZGVmaW5lIEJMT0NLU0laRSA1MTIKKworc3RydWN0IHRhcl9oZWFkZXIKK3sJCQkJLyogYnl0ZSBvZmZzZXQgKi8KKyAgY2hhciBuYW1lWzEwMF07CQkvKiAgIDAgKi8KKyAgY2hhciBtb2RlWzhdOwkJCS8qIDEwMCAqLworICBjaGFyIHVpZFs4XTsJCQkvKiAxMDggKi8KKyAgY2hhciBnaWRbOF07CQkJLyogMTE2ICovCisgIGNoYXIgc2l6ZVsxMl07CQkvKiAxMjQgKi8KKyAgY2hhciBtdGltZVsxMl07CQkvKiAxMzYgKi8KKyAgY2hhciBjaGtzdW1bOF07CQkvKiAxNDggKi8KKyAgY2hhciB0eXBlZmxhZzsJCS8qIDE1NiAqLworICBjaGFyIGxpbmtuYW1lWzEwMF07CQkvKiAxNTcgKi8KKyAgY2hhciBtYWdpY1s2XTsJCS8qIDI1NyAqLworICBjaGFyIHZlcnNpb25bMl07CQkvKiAyNjMgKi8KKyAgY2hhciB1bmFtZVszMl07CQkvKiAyNjUgKi8KKyAgY2hhciBnbmFtZVszMl07CQkvKiAyOTcgKi8KKyAgY2hhciBkZXZtYWpvcls4XTsJCS8qIDMyOSAqLworICBjaGFyIGRldm1pbm9yWzhdOwkJLyogMzM3ICovCisgIGNoYXIgcHJlZml4WzE1NV07CQkvKiAzNDUgKi8KKwkJCQkvKiA1MDAgKi8KK307CisKK3VuaW9uIHRhcl9idWZmZXIgeworICBjaGFyICAgICAgICAgICAgICAgYnVmZmVyW0JMT0NLU0laRV07CisgIHN0cnVjdCB0YXJfaGVhZGVyICBoZWFkZXI7Cit9OworCitlbnVtIHsgVEdaX0VYVFJBQ1QgPSAwLCBUR1pfTElTVCB9OworCitzdGF0aWMgY2hhciAqVEdaZm5hbWUJT0YoKGNvbnN0IGNoYXIgKikpOwordm9pZCBUR1pub3Rmb3VuZAlPRigoY29uc3QgY2hhciAqKSk7CisKK2ludCBnZXRvY3QJCU9GKChjaGFyICosIGludCkpOworY2hhciAqc3RydGltZQkJT0YoKHRpbWVfdCAqKSk7CitpbnQgRXhwck1hdGNoCQlPRigoY2hhciAqLGNoYXIgKikpOworCitpbnQgbWFrZWRpcgkJT0YoKGNoYXIgKikpOworaW50IG1hdGNobmFtZQkJT0YoKGludCxpbnQsY2hhciAqKixjaGFyICopKTsKKwordm9pZCBlcnJvcgkJT0YoKGNvbnN0IGNoYXIgKikpOworaW50ICB0YXIJCU9GKChnekZpbGUsIGludCwgaW50LCBpbnQsIGNoYXIgKiopKTsKKwordm9pZCBoZWxwCQlPRigoaW50KSk7CitpbnQgbWFpbgkJT0YoKGludCwgY2hhciAqKikpOworCitjaGFyICpwcm9nOworCisvKiBUaGlzIHdpbGwgZ2l2ZSBhIGJlbmlnbiB3YXJuaW5nICovCisKK3N0YXRpYyBjaGFyICpUR1pwcmVmaXhbXSA9IHsgIlwwIiwgIi50Z3oiLCAiLnRhci5neiIsIE5VTEwgfTsKKworLyogUmV0dXJuIHRoZSByZWFsIG5hbWUgb2YgdGhlIFRHWiBhcmNoaXZlICovCisvKiBvciBOVUxMIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAqLworCitzdGF0aWMgY2hhciAqVEdaZm5hbWUgT0YoKGNvbnN0IGNoYXIgKmZuYW1lKSkKK3sKKyAgc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgb3JpZ2xlbixpOworICAKKyAgc3RyY3B5KGJ1ZmZlcixmbmFtZSk7CisgIG9yaWdsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKworICBmb3IgKGk9MDsgVEdacHJlZml4W2ldOyBpKyspCisgICAgeworICAgICAgIHN0cmNweShidWZmZXIrb3JpZ2xlbixUR1pwcmVmaXhbaV0pOworICAgICAgIGlmIChhY2Nlc3MoYnVmZmVyLEZfT0spID09IDApCisgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBmaWxlbmFtZSAqLworCit2b2lkIFRHWm5vdGZvdW5kIE9GKChjb25zdCBjaGFyICpmbmFtZSkpCit7CisgIGludCBpOworCisgIGZwcmludGYoc3RkZXJyLCIlcyA6IGNvdWxkbid0IGZpbmQgIixwcm9nKTsKKyAgZm9yIChpPTA7VEdacHJlZml4W2ldO2krKykKKyAgICBmcHJpbnRmKHN0ZGVyciwoVEdacHJlZml4W2krMV0pID8gIiVzJXMsICIgOiAib3IgJXMlc1xuIiwKKyAgICAgICAgICAgIGZuYW1lLAorICAgICAgICAgICAgVEdacHJlZml4W2ldKTsKKyAgZXhpdCgxKTsKK30KKworCisvKiBoZWxwIGZ1bmN0aW9ucyAqLworCitpbnQgZ2V0b2N0KGNoYXIgKnAsaW50IHdpZHRoKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgY2hhciBjOworICAKKyAgd2hpbGUgKHdpZHRoIC0tKQorICAgIHsKKyAgICAgIGMgPSAqcCsrOworICAgICAgaWYgKGMgPT0gJyAnKQorCWNvbnRpbnVlOworICAgICAgaWYgKGMgPT0gMCkKKwlicmVhazsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDggKyAoYyAtICcwJyk7CisgICAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitjaGFyICpzdHJ0aW1lICh0aW1lX3QgKnQpCit7CisgIHN0cnVjdCB0bSAgICpsb2NhbDsKKyAgc3RhdGljIGNoYXIgcmVzdWx0WzMyXTsKKworICBsb2NhbCA9IGxvY2FsdGltZSh0KTsKKyAgc3ByaW50ZihyZXN1bHQsIiUyZC8lMDJkLyU0ZCAlMDJkOiUwMmQ6JTAyZCIsCisJICBsb2NhbC0+dG1fbWRheSwgbG9jYWwtPnRtX21vbisxLCBsb2NhbC0+dG1feWVhcisxOTAwLAorCSAgbG9jYWwtPnRtX2hvdXIsIGxvY2FsLT50bV9taW4sICAgbG9jYWwtPnRtX3NlYyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nICovCisKKyNkZWZpbmUgSVNTUEVDSUFMKGMpICgoKGMpID09ICcqJykgfHwgKChjKSA9PSAnLycpKQorCitpbnQgRXhwck1hdGNoKGNoYXIgKnN0cmluZyxjaGFyICpleHByKQoreworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBpZiAoSVNTUEVDSUFMKCpleHByKSkKKwl7CisJICBpZiAoKmV4cHIgPT0gJy8nKQorCSAgICB7CisJICAgICAgaWYgKCpzdHJpbmcgIT0gJ1xcJyAmJiAqc3RyaW5nICE9ICcvJykKKwkJcmV0dXJuIDA7CisJICAgICAgc3RyaW5nICsrOyBleHByKys7CisJICAgIH0KKwkgIGVsc2UgaWYgKCpleHByID09ICcqJykKKwkgICAgeworCSAgICAgIGlmICgqZXhwciArKyA9PSAwKQorCQlyZXR1cm4gMTsKKwkgICAgICB3aGlsZSAoKisrc3RyaW5nICE9ICpleHByKQorCQlpZiAoKnN0cmluZyA9PSAwKQorCQkgIHJldHVybiAwOworCSAgICB9CisJfQorICAgICAgZWxzZQorCXsKKwkgIGlmICgqc3RyaW5nICE9ICpleHByKQorCSAgICByZXR1cm4gMDsKKwkgIGlmICgqZXhwcisrID09IDApCisJICAgIHJldHVybiAxOworCSAgc3RyaW5nKys7CisJfQorICAgIH0KK30KKworLyogcmVjdXJzaXZlIG1ha2UgZGlyZWN0b3J5ICovCisvKiBhYm9ydCBpZiB5b3UgZ2V0IGFuIEVOT0VOVCBlcnJubyBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSAqLworLyogZS5nLiBpZ25vcmUgZXJyb3IgIm1rZGlyIG9uIGV4aXN0aW5nIGRpcmVjdG9yeSIgKi8KKy8qICovCisvKiByZXR1cm4gMSBpZiBPSyAqLworLyogICAgICAgIDAgb24gZXJyb3IgKi8KKworaW50IG1ha2VkaXIgKGNoYXIgKm5ld2RpcikKK3sKKyAgY2hhciAqYnVmZmVyID0gc3RyZHVwKG5ld2Rpcik7CisgIGNoYXIgKnA7CisgIGludCAgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisgIAorICBpZiAobGVuIDw9IDApIHsKKyAgICBmcmVlKGJ1ZmZlcik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGJ1ZmZlcltsZW4tMV0gPT0gJy8nKSB7CisgICAgYnVmZmVyW2xlbi0xXSA9ICdcMCc7CisgIH0KKyAgaWYgKG1rZGlyKGJ1ZmZlciwgMDc3NSkgPT0gMCkKKyAgICB7CisgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgcCA9IGJ1ZmZlcisxOworICB3aGlsZSAoMSkKKyAgICB7CisgICAgICBjaGFyIGhvbGQ7CisgICAgICAKKyAgICAgIHdoaWxlKCpwICYmICpwICE9ICdcXCcgJiYgKnAgIT0gJy8nKQorCXArKzsKKyAgICAgIGhvbGQgPSAqcDsKKyAgICAgICpwID0gMDsKKyAgICAgIGlmICgobWtkaXIoYnVmZmVyLCAwNzc1KSA9PSAtMSkgJiYgKGVycm5vID09IEVOT0VOVCkpCisJeworCSAgZnByaW50ZihzdGRlcnIsIiVzOiBjb3VsZG4ndCBjcmVhdGUgZGlyZWN0b3J5ICVzXG4iLHByb2csYnVmZmVyKTsKKwkgIGZyZWUoYnVmZmVyKTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIGlmIChob2xkID09IDApCisJYnJlYWs7CisgICAgICAqcCsrID0gaG9sZDsKKyAgICB9CisgIGZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtYXRjaG5hbWUgKGludCBhcmcsaW50IGFyZ2MsY2hhciAqKmFyZ3YsY2hhciAqZm5hbWUpCit7CisgIGlmIChhcmcgPT0gYXJnYykJCS8qIG5vIGFyZ3VtZW50cyBnaXZlbiAodW50Z3ogdGd6YXJjaGl2ZSkgKi8KKyAgICByZXR1cm4gMTsKKworICB3aGlsZSAoYXJnIDwgYXJnYykKKyAgICBpZiAoRXhwck1hdGNoKGZuYW1lLGFyZ3ZbYXJnKytdKSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOyAvKiBpZ25vcmUgdGhpcyBmb3IgdGhlIG1vbWVudCBiZWluZyAqLworfQorCisKKy8qIFRhciBmaWxlIGxpc3Qgb3IgZXh0cmFjdCAqLworCitpbnQgdGFyIChnekZpbGUgaW4saW50IGFjdGlvbixpbnQgYXJnLGludCBhcmdjLGNoYXIgKiphcmd2KQoreworICB1bmlvbiAgdGFyX2J1ZmZlciBidWZmZXI7CisgIGludCAgICBsZW47CisgIGludCAgICBlcnI7CisgIGludCAgICBnZXRoZWFkZXIgPSAxOworICBpbnQgICAgcmVtYWluaW5nID0gMDsKKyAgRklMRSAgICpvdXRmaWxlID0gTlVMTDsKKyAgY2hhciAgIGZuYW1lW0JMT0NLU0laRV07CisgIHRpbWVfdCB0YXJ0aW1lOworICAKKyAgaWYgKGFjdGlvbiA9PSBUR1pfTElTVCkKKyAgICBwcmludGYoIiAgICAgZGF5ICAgICAgdGltZSAgICAgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgZmlsZVxuIgorCSAgICIgLS0tLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGxlbiA9IGd6cmVhZChpbiwgJmJ1ZmZlciwgQkxPQ0tTSVpFKTsKKyAgICAgIGlmIChsZW4gPCAwKQorCWVycm9yIChnemVycm9yKGluLCAmZXJyKSk7CisgICAgICAvKgorICAgICAgICogaWYgd2UgbWV0IHRoZSBlbmQgb2YgdGhlIHRhcgorICAgICAgICogb3IgdGhlIGVuZC1vZi10YXIgYmxvY2ssCisgICAgICAgKiB3ZSBhcmUgZG9uZQorICAgICAgICovCisgICAgICBpZiAoKGxlbiA9PSAwKSAgfHwgKGJ1ZmZlci5oZWFkZXIubmFtZVswXT09IDApKQorCWJyZWFrOworICAgICAgCisgICAgICAvKgorICAgICAgICogQWx3YXlzIGV4cGVjdCBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcworICAgICAgICogdGhlIHRhciBpbmZvcm1hdGlvbi4KKyAgICAgICAqLworICAgICAgaWYgKGxlbiAhPSBCTE9DS1NJWkUpCisJZXJyb3IoImd6cmVhZDogaW5jb21wbGV0ZSBibG9jayByZWFkIik7CisgICAgICAKKyAgICAgIC8qCisgICAgICAgKiBJZiB3ZSBoYXZlIHRvIGdldCBhIHRhciBoZWFkZXIKKyAgICAgICAqLworICAgICAgaWYgKGdldGhlYWRlciA9PSAxKQorCXsKKwkgIHRhcnRpbWUgPSAodGltZV90KWdldG9jdChidWZmZXIuaGVhZGVyLm10aW1lLDEyKTsKKwkgIHN0cmNweShmbmFtZSxidWZmZXIuaGVhZGVyLm5hbWUpOworCSAgCisJICBzd2l0Y2ggKGJ1ZmZlci5oZWFkZXIudHlwZWZsYWcpCisJICAgIHsKKwkgICAgY2FzZSBESVJUWVBFOgorCSAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCisJCXByaW50ZigiICVzICAgICA8ZGlyPiAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxmbmFtZSk7CisJICAgICAgaWYgKGFjdGlvbiA9PSBUR1pfRVhUUkFDVCkKKwkJbWFrZWRpcihmbmFtZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUkVHVFlQRToKKwkgICAgY2FzZSBBUkVHVFlQRToKKwkgICAgICByZW1haW5pbmcgPSBnZXRvY3QoYnVmZmVyLmhlYWRlci5zaXplLDEyKTsKKwkgICAgICBpZiAoYWN0aW9uID09IFRHWl9MSVNUKQorCQlwcmludGYoIiAlcyAlOWQgJXNcbiIsc3RydGltZSgmdGFydGltZSkscmVtYWluaW5nLGZuYW1lKTsKKwkgICAgICBpZiAoYWN0aW9uID09IFRHWl9FWFRSQUNUKQorCQl7CisJCSAgaWYgKChyZW1haW5pbmcpICYmIChtYXRjaG5hbWUoYXJnLGFyZ2MsYXJndixmbmFtZSkpKQorCQkgICAgeworCQkgICAgICBvdXRmaWxlID0gZm9wZW4oZm5hbWUsIndiIik7CisJCSAgICAgIGlmIChvdXRmaWxlID09IE5VTEwpIHsKKwkJCS8qIHRyeSBjcmVhdGluZyBkaXJlY3RvcnkgKi8KKwkJCWNoYXIgKnAgPSBzdHJyY2hyKGZuYW1lLCAnLycpOworCQkJaWYgKHAgIT0gTlVMTCkgeworCQkJICAqcCA9ICdcMCc7CisJCQkgIG1ha2VkaXIoZm5hbWUpOworCQkJICAqcCA9ICcvJzsKKwkJCSAgb3V0ZmlsZSA9IGZvcGVuKGZuYW1lLCJ3YiIpOworCQkJfQorCQkgICAgICB9CisJCSAgICAgIGZwcmludGYoc3RkZXJyLAorCQkJICAgICAgIiVzICVzXG4iLAorCQkJICAgICAgKG91dGZpbGUpID8gIkV4dHJhY3RpbmciIDogIkNvdWxkbid0IGNyZWF0ZSIsCisJCQkgICAgICBmbmFtZSk7CisJCSAgICB9CisJCSAgZWxzZQorCQkgICAgb3V0ZmlsZSA9IE5VTEw7CisJCX0KKwkgICAgICAvKgorCSAgICAgICAqIGNvdWxkIGhhdmUgbm8gY29udGVudHMKKwkgICAgICAgKi8KKwkgICAgICBnZXRoZWFkZXIgPSAocmVtYWluaW5nKSA/IDAgOiAxOworCSAgICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICAgIGlmIChhY3Rpb24gPT0gVEdaX0xJU1QpCisJCXByaW50ZigiICVzICAgICA8LS0tPiAlc1xuIixzdHJ0aW1lKCZ0YXJ0aW1lKSxmbmFtZSk7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgdW5zaWduZWQgaW50IGJ5dGVzID0gKHJlbWFpbmluZyA+IEJMT0NLU0laRSkgPyBCTE9DS1NJWkUgOiByZW1haW5pbmc7CisKKwkgIGlmICgoYWN0aW9uID09IFRHWl9FWFRSQUNUKSAmJiAob3V0ZmlsZSAhPSBOVUxMKSkKKwkgICAgeworCSAgICAgIGlmIChmd3JpdGUoJmJ1ZmZlcixzaXplb2YoY2hhciksYnl0ZXMsb3V0ZmlsZSkgIT0gYnl0ZXMpCisJCXsKKwkJICBmcHJpbnRmKHN0ZGVyciwiJXMgOiBlcnJvciB3cml0aW5nICVzIHNraXBwaW5nLi4uXG4iLHByb2csZm5hbWUpOworCQkgIGZjbG9zZShvdXRmaWxlKTsKKwkJICB1bmxpbmsoZm5hbWUpOworCQl9CisJICAgIH0KKwkgIHJlbWFpbmluZyAtPSBieXRlczsKKwkgIGlmIChyZW1haW5pbmcgPT0gMCkKKwkgICAgeworCSAgICAgIGdldGhlYWRlciA9IDE7CisJICAgICAgaWYgKChhY3Rpb24gPT0gVEdaX0VYVFJBQ1QpICYmIChvdXRmaWxlICE9IE5VTEwpKQorCQl7CisJCSAgc3RydWN0IHV0aW1idWYgc2V0dGltZTsKKworCQkgIHNldHRpbWUuYWN0aW1lID0gc2V0dGltZS5tb2R0aW1lID0gdGFydGltZTsKKworCQkgIGZjbG9zZShvdXRmaWxlKTsKKwkJICBvdXRmaWxlID0gTlVMTDsKKwkJICB1dGltZShmbmFtZSwmc2V0dGltZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgIAorICBpZiAoZ3pjbG9zZShpbikgIT0gWl9PSykKKyAgICBlcnJvcigiZmFpbGVkIGd6Y2xvc2UiKTsKKworICByZXR1cm4gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGhlbHAoaW50IGV4aXR2YWwpCit7CisgIGZwcmludGYoc3RkZXJyLAorCSAgInVudGd6IHYgMC4xXG4iCisJICAiIGFuIHNhbXBsZSBhcHBsaWNhdGlvbiBvZiB6bGliIDEuMC40XG5cbiIKKyAgICAgICAgICAiVXNhZ2UgOiB1bnRneiBUR1pmaWxlICAgICAgICAgICAgdG8gZXh0cmFjdCBhbGwgZmlsZXNcbiIKKyAgICAgICAgICAiICAgICAgICB1bnRneiBUR1pmaWxlIGZuYW1lIC4uLiAgdG8gZXh0cmFjdCBzZWxlY3RlZCBmaWxlc1xuIgorICAgICAgICAgICIgICAgICAgIHVudGd6IC1sIFRHWmZpbGUgICAgICAgICB0byBsaXN0IGFyY2hpdmUgY29udGVudHNcbiIKKyAgICAgICAgICAiICAgICAgICB1bnRneiAtaCAgICAgICAgICAgICAgICAgdG8gZGlzcGxheSB0aGlzIGhlbHBcblxuIik7CisgIGV4aXQoZXhpdHZhbCk7Cit9CisKK3ZvaWQgZXJyb3IoY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9nLCBtc2cpOworICAgIGV4aXQoMSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitpbnQgX0NSVF9nbG9iID0gMDsJLyogZGlzYWJsZSBnbG9iYmluZyBvZiB0aGUgYXJndW1lbnRzICovCisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQoreworICAgIGludCAJYWN0aW9uID0gVEdaX0VYVFJBQ1Q7CisgICAgaW50IAlhcmcgPSAxOworICAgIGNoYXIJKlRHWmZpbGU7CisgICAgZ3pGaWxlCSpmOworICAgIAorCisgICAgcHJvZyA9IHN0cnJjaHIoYXJndlswXSwnXFwnKTsKKyAgICBpZiAocHJvZyA9PSBOVUxMKQorICAgICAgeworCXByb2cgPSBzdHJyY2hyKGFyZ3ZbMF0sJy8nKTsKKwlpZiAocHJvZyA9PSBOVUxMKQorCSAgeworCSAgICBwcm9nID0gc3RycmNocihhcmd2WzBdLCc6Jyk7CisJICAgIGlmIChwcm9nID09IE5VTEwpCisJICAgICAgcHJvZyA9IGFyZ3ZbMF07CisJICAgIGVsc2UKKwkgICAgICBwcm9nKys7CisJICB9CisJZWxzZQorCSAgcHJvZysrOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHByb2crKzsKKyAgICAKKyAgICBpZiAoYXJnYyA9PSAxKQorICAgICAgaGVscCgwKTsKKworICAgIGlmIChzdHJjbXAoYXJndlthcmddLCItbCIpID09IDApCisgICAgICB7CisJYWN0aW9uID0gVEdaX0xJU1Q7CisJaWYgKGFyZ2MgPT0gKythcmcpCisJICBoZWxwKDApOworICAgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W2FyZ10sIi1oIikgPT0gMCkKKyAgICAgIHsKKwloZWxwKDApOworICAgICAgfQorCisgICAgaWYgKChUR1pmaWxlID0gVEdaZm5hbWUoYXJndlthcmddKSkgPT0gTlVMTCkKKyAgICAgIFRHWm5vdGZvdW5kKGFyZ3ZbYXJnXSk7ICAgICAgICAgICAgCisKKyAgICArK2FyZzsKKyAgICBpZiAoKGFjdGlvbiA9PSBUR1pfTElTVCkgJiYgKGFyZyAhPSBhcmdjKSkKKyAgICAgIGhlbHAoMSk7CisKKy8qCisgKiAgUHJvY2VzcyB0aGUgVEdaIGZpbGUKKyAqLworICAgIHN3aXRjaChhY3Rpb24pCisgICAgICB7CisgICAgICBjYXNlIFRHWl9MSVNUOgorICAgICAgY2FzZSBUR1pfRVhUUkFDVDoKKwlmID0gZ3pvcGVuKFRHWmZpbGUsInJiIik7CisJaWYgKGYgPT0gTlVMTCkKKwkgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIiVzOiBDb3VsZG4ndCBnem9wZW4gJXNcbiIsCisJCSAgICBwcm9nLAorCQkgICAgVEdaZmlsZSk7CisJICAgIHJldHVybiAxOworCSAgfQorCWV4aXQodGFyKGYsIGFjdGlvbiwgYXJnLCBhcmdjLCBhcmd2KSk7CisgICAgICBicmVhazsKKwkKKyAgICAgIGRlZmF1bHQ6CisJZXJyb3IoIlVua25vd24gb3B0aW9uISIpOworCWV4aXQoMSk7CisgICAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBiL2NvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFhMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi92aXN1YWwtYmFzaWMudHh0CkBAIC0wLDAgKzEsNTcgQEAKK0Zyb206ICJKb24gQ2FydWFuYSIgPGpvbi1uZXRAdXNhLm5ldD4KK1RvOiAiSmVhbi1sb3VwIEdhaWxseSIgPGd6aXBAcHJlcC5haS5taXQuZWR1PgorU3ViamVjdDogUmU6IEhvdyB0byBwb3J0IHpsaWIgZGVjbGFyZXMgdG8gdmI/CitEYXRlOiBNb24sIDI4IE9jdCAxOTk2IDE4OjMzOjAzIC0wNjAwCisKK0dvdCB0aGUgYW5zd2VyISAoSSBoYXZlbid0IGhhZCB0aW1lIHRvIGNoZWNrIHRoaXMgYnV0IGl0J3Mgd2hhdCBJIGdvdCwgYW5kCitsb29rcyBjb3JyZWN0KToKKworSGUgaGFzIHRoZSBmb2xsb3dpbmcgcm91dGluZXMgd29ya2luZzoKKyAgICAgICAgY29tcHJlc3MKKyAgICAgICAgdW5jb21wcmVzcworICAgICAgICBnem9wZW4KKyAgICAgICAgZ3p3cml0ZQorICAgICAgICBnenJlYWQKKyAgICAgICAgZ3pjbG9zZQorCitEZWNsYXJlcyBmb2xsb3c6IChRdW90ZWQgZnJvbSBDYXJsb3MgUmlvcyA8Y19yaW9zQHNvbmRhLmNsPiwgaW4gVmI0IGZvcm0pCisKKyNJZiBXaW4xNiBUaGVuICAgJ1VzZSBXaW4xNiBjYWxscy4KK0RlY2xhcmUgRnVuY3Rpb24gY29tcHJlc3MgTGliICJaTElCLkRMTCIgKEJ5VmFsIGNvbXByIEFzCisgICAgICAgIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMgU3RyaW5nLCBCeVZhbCBidWZsZW4KKyAgICAgICAgQXMgTG9uZykgQXMgSW50ZWdlcgorRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQi5ETEwiIChCeVZhbCB1bmNvbXByCisgICAgICAgIEFzIFN0cmluZywgdW5jb21wckxlbiBBcyBBbnksIEJ5VmFsIGNvbXByIEFzIFN0cmluZywgQnlWYWwKKyAgICAgICAgbGNvbXByIEFzIExvbmcpIEFzIEludGVnZXIKK0RlY2xhcmUgRnVuY3Rpb24gZ3pvcGVuIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlUGF0aCBBcworICAgICAgICBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCitEZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIuRExMIiAoQnlWYWwgZmlsZSBBcworICAgICAgICBMb25nLCBCeVZhbCB1bmNvbXByIEFzIFN0cmluZywgQnlWYWwgdW5jb21wckxlbiBBcyBJbnRlZ2VyKQorICAgICAgICBBcyBJbnRlZ2VyCitEZWNsYXJlIEZ1bmN0aW9uIGd6d3JpdGUgTGliICJaTElCLkRMTCIgKEJ5VmFsIGZpbGUgQXMKKyAgICAgICAgTG9uZywgQnlWYWwgdW5jb21wciBBcyBTdHJpbmcsIEJ5VmFsIHVuY29tcHJMZW4gQXMgSW50ZWdlcikKKyAgICAgICAgQXMgSW50ZWdlcgorRGVjbGFyZSBGdW5jdGlvbiBnemNsb3NlIExpYiAiWkxJQi5ETEwiIChCeVZhbCBmaWxlIEFzCisgICAgICAgIExvbmcpIEFzIEludGVnZXIKKyNFbHNlCitEZWNsYXJlIEZ1bmN0aW9uIGNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIGNvbXByIEFzIFN0cmluZywgY29tcHJMZW4gQXMgQW55LCBCeVZhbCBidWYgQXMKKyAgICAgICAgU3RyaW5nLCBCeVZhbCBidWZsZW4gQXMgTG9uZykgQXMgSW50ZWdlcgorRGVjbGFyZSBGdW5jdGlvbiB1bmNvbXByZXNzIExpYiAiWkxJQjMyLkRMTCIKKyAgICAgICAgKEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCB1bmNvbXByTGVuIEFzIEFueSwgQnlWYWwgY29tcHIgQXMKKyAgICAgICAgU3RyaW5nLCBCeVZhbCBsY29tcHIgQXMgTG9uZykgQXMgTG9uZworRGVjbGFyZSBGdW5jdGlvbiBnem9wZW4gTGliICJaTElCMzIuRExMIgorICAgICAgICAoQnlWYWwgZmlsZSBBcyBTdHJpbmcsIEJ5VmFsIG1vZGUgQXMgU3RyaW5nKSBBcyBMb25nCitEZWNsYXJlIEZ1bmN0aW9uIGd6cmVhZCBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAorICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKK0RlY2xhcmUgRnVuY3Rpb24gZ3p3cml0ZSBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcsIEJ5VmFsIHVuY29tcHIgQXMgU3RyaW5nLCBCeVZhbAorICAgICAgICB1bmNvbXByTGVuIEFzIExvbmcpIEFzIExvbmcKK0RlY2xhcmUgRnVuY3Rpb24gZ3pjbG9zZSBMaWIgIlpMSUIzMi5ETEwiCisgICAgICAgIChCeVZhbCBmaWxlIEFzIExvbmcpIEFzIExvbmcKKyNFbmQgSWYKKworLUpvbiBDYXJ1YW5hCitqb24tbmV0QHVzYS5uZXQKK01pY3Jvc29mdCBTaXRlYnVpbGRlciBOZXR3b3JrIExldmVsIDEgTWVtYmVyIC0gSFRNTCBXcml0ZXIncyBHdWlsZCBNZW1iZXIKZGlmZiAtLWdpdCBhL2NyYzMyLmMgYi9jcmMzMi5jCmluZGV4IDU4ZmM2MGUuLmIwNDcxZTMgMTAwNjQ0Ci0tLSBhL2NyYzMyLmMKKysrIGIvY3JjMzIuYwpAQCAtMSw5ICsxLDkgQEAKIC8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIAotLyogJElkOiBjcmMzMi5jLHYgMS44IDE5OTYvMDEvMzAgMjE6NTk6MTAgbWUgRXhwICQgKi8KKy8qIEAoIykgJElkJCAqLwogCiAjaW5jbHVkZSAiemxpYi5oIgogCkBAIC0xMjQsNyArMTI0LDcgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKICAqLwotdUxvbmdmICpnZXRfY3JjX3RhYmxlKCkKK3VMb25nZiAqIEVYUE9SVCBnZXRfY3JjX3RhYmxlKCkKIHsKICNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQogICBpZiAoY3JjX3RhYmxlX2VtcHR5KSBtYWtlX2NyY190YWJsZSgpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAjZGVmaW5lIERPOChidWYpICBETzQoYnVmKTsgRE80KGJ1Zik7CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIGNyYzMyKGNyYywgYnVmLCBsZW4pCit1TG9uZyBFWFBPUlQgY3JjMzIoY3JjLCBidWYsIGxlbikKICAgICB1TG9uZyBjcmM7CiAgICAgY29uc3QgQnl0ZWYgKmJ1ZjsKICAgICB1SW50IGxlbjsKZGlmZiAtLWdpdCBhL2RlZmxhdGUuYyBiL2RlZmxhdGUuYwppbmRleCBlMWQ2NmNlLi5hY2JkYzA4IDEwMDY0NAotLS0gYS9kZWZsYXRlLmMKKysrIGIvZGVmbGF0ZS5jCkBAIC0zNiw4ICszNiw4IEBACiAgKgogICogIFJFRkVSRU5DRVMKICAqCi0gKiAgICAgIERldXRzY2gsIEwuUC4sIidEZWZsYXRlJyBDb21wcmVzc2VkIERhdGEgRm9ybWF0IFNwZWNpZmljYXRpb24iLgotICogICAgICBBdmFpbGFibGUgaW4gZnRwLnV1Lm5ldDovcHViL2FyY2hpdmluZy96aXAvZG9jL2RlZmxhdGUtMS4xLmRvYworICogICAgICBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CiAgKgogICogICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoZSBSYWJpbiBhbmQgS2FycCBhbGdvcml0aG0gaXMgZ2l2ZW4gaW4gdGhlIGJvb2sKICAqICAgICAgICAgIkFsZ29yaXRobXMiIGJ5IFIuIFNlZGdld2ljaywgQWRkaXNvbi1XZXNsZXksIHAyNTIuCkBAIC00NywxMCArNDcsMTIgQEAKICAqCiAgKi8KIAorLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlICJkZWZsYXRlLmgiCiAKLWNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9ICIgZGVmbGF0ZSAxLjAuNSBDb3B5cmlnaHQgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkgIjsKK2NvbnN0IGNoYXIgZGVmbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGRlZmxhdGUgMS4wLjcgQ29weXJpZ2h0IDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5ICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKQEAgLTc2LDEyICs3OCwxNCBAQAogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwogbG9jYWwgdm9pZCBsbV9pbml0ICAgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotbG9jYWwgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKIGxvY2FsIHZvaWQgcHV0U2hvcnRNU0IgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIHVJbnQgYikpOwogbG9jYWwgdm9pZCBmbHVzaF9wZW5kaW5nICBPRigoel9zdHJlYW1wIHN0cm0pKTsKIGxvY2FsIGludCByZWFkX2J1ZiAgICAgICAgT0YoKHpfc3RyZWFtcCBzdHJtLCBjaGFyZiAqYnVmLCB1bnNpZ25lZCBzaXplKSk7CiAjaWZkZWYgQVNNVgogICAgICAgdm9pZCBtYXRjaF9pbml0IE9GKCh2b2lkKSk7IC8qIGFzbSBjb2RlIGluaXRpYWxpemF0aW9uICovCisgICAgICB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOworI2Vsc2UKK2xvY2FsIHVJbnQgbG9uZ2VzdF9tYXRjaCAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3MgY3VyX21hdGNoKSk7CiAjZW5kaWYKIAogI2lmZGVmIERFQlVHCkBAIC0xMTksNyArMTIzLDcgQEAKICAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKIH0gY29uZmlnOwogCi1sb2NhbCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7Citsb2NhbCBjb25zdCBjb25maWcgY29uZmlndXJhdGlvbl90YWJsZVsxMF0gPSB7CiAvKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCiAvKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLwogLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH0sIC8qIG1heGltdW0gc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLwpAQCAtMTc0LDcgKzE3OCw3IEBACiAgICAgem1lbXplcm8oKGNoYXJmICopcy0+aGVhZCwgKHVuc2lnbmVkKShzLT5oYXNoX3NpemUtMSkqc2l6ZW9mKCpzLT5oZWFkKSk7CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBkZWZsYXRlSW5pdF8oc3RybSwgbGV2ZWwsIHZlcnNpb24sIHN0cmVhbV9zaXplKQoraW50IEVYUE9SVCBkZWZsYXRlSW5pdF8oc3RybSwgbGV2ZWwsIHZlcnNpb24sIHN0cmVhbV9zaXplKQogICAgIHpfc3RyZWFtcCBzdHJtOwogICAgIGludCBsZXZlbDsKICAgICBjb25zdCBjaGFyICp2ZXJzaW9uOwpAQCAtMTg2LDcgKzE5MCw3IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwKK2ludCBFWFBPUlQgZGVmbGF0ZUluaXQyXyhzdHJtLCBsZXZlbCwgbWV0aG9kLCB3aW5kb3dCaXRzLCBtZW1MZXZlbCwgc3RyYXRlZ3ksCiAJCSAgdmVyc2lvbiwgc3RyZWFtX3NpemUpCiAgICAgel9zdHJlYW1wIHN0cm07CiAgICAgaW50ICBsZXZlbDsKQEAgLTE5OSwxMyArMjAzLDE0IEBACiB7CiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBpbnQgbm9oZWFkZXIgPSAwOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBteV92ZXJzaW9uID0gWkxJQl9WRVJTSU9OOwogCiAgICAgdXNoZiAqb3ZlcmxheTsKICAgICAvKiBXZSBvdmVybGF5IHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1Zi4gVGhpcyB3b3JrcyBzaW5jZSB0aGUgYXZlcmFnZQogICAgICAqIG91dHB1dCBzaXplIGZvciAobGVuZ3RoLGRpc3RhbmNlKSBjb2RlcyBpcyA8PSAyNCBiaXRzLgogICAgICAqLwogCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8CisgICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gbXlfdmVyc2lvblswXSB8fAogICAgICAgICBzdHJlYW1fc2l6ZSAhPSBzaXplb2Yoel9zdHJlYW0pKSB7CiAJcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKICAgICB9CkBAIC0yNTIsNiArMjU3LDcgQEAKIAogICAgIG92ZXJsYXkgPSAodXNoZiAqKSBaQUxMT0Moc3RybSwgcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOwogICAgIHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKKyAgICBzLT5wZW5kaW5nX2J1Zl9zaXplID0gKHVsZylzLT5saXRfYnVmc2l6ZSAqIChzaXplb2YodXNoKSsyTCk7CiAKICAgICBpZiAocy0+d2luZG93ID09IFpfTlVMTCB8fCBzLT5wcmV2ID09IFpfTlVMTCB8fCBzLT5oZWFkID09IFpfTlVMTCB8fAogICAgICAgICBzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKQEAgLTI3MCw3ICsyNzYsNyBAQAogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgZGVmbGF0ZVNldERpY3Rpb25hcnkgKHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpCitpbnQgRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IChzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKQogICAgIHpfc3RyZWFtcCBzdHJtOwogICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5OwogICAgIHVJbnQgIGRpY3RMZW5ndGg7CkBAIC0yODksNyArMjk1LDkgQEAKICAgICBpZiAobGVuZ3RoIDwgTUlOX01BVENIKSByZXR1cm4gWl9PSzsKICAgICBpZiAobGVuZ3RoID4gTUFYX0RJU1QocykpIHsKIAlsZW5ndGggPSBNQVhfRElTVChzKTsKLQlkaWN0aW9uYXJ5ICs9IGRpY3RMZW5ndGggLSBsZW5ndGg7CisjaWZuZGVmIFVTRV9ESUNUX0hFQUQKKwlkaWN0aW9uYXJ5ICs9IGRpY3RMZW5ndGggLSBsZW5ndGg7IC8qIHVzZSB0aGUgdGFpbCBvZiB0aGUgZGljdGlvbmFyeSAqLworI2VuZGlmCiAgICAgfQogICAgIHptZW1jcHkoKGNoYXJmICopcy0+d2luZG93LCBkaWN0aW9uYXJ5LCBsZW5ndGgpOwogICAgIHMtPnN0cnN0YXJ0ID0gbGVuZ3RoOwpAQCAtMzA5LDcgKzMxNyw3IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBkZWZsYXRlUmVzZXQgKHN0cm0pCitpbnQgRVhQT1JUIGRlZmxhdGVSZXNldCAoc3RybSkKICAgICB6X3N0cmVhbXAgc3RybTsKIHsKICAgICBkZWZsYXRlX3N0YXRlICpzOwpAQCAtMzM5LDcgKzM0Nyw3IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBkZWZsYXRlUGFyYW1zKHN0cm0sIGxldmVsLCBzdHJhdGVneSkKK2ludCBFWFBPUlQgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpCiAgICAgel9zdHJlYW1wIHN0cm07CiAgICAgaW50IGxldmVsOwogICAgIGludCBzdHJhdGVneTsKQEAgLTQxMyw3ICs0MjEsNyBAQAogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgZGVmbGF0ZSAoc3RybSwgZmx1c2gpCitpbnQgRVhQT1JUIGRlZmxhdGUgKHN0cm0sIGZsdXNoKQogICAgIHpfc3RyZWFtcCBzdHJtOwogICAgIGludCBmbHVzaDsKIHsKQEAgLTU0Nyw0MiArNTU1LDg1IEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBkZWZsYXRlRW5kIChzdHJtKQoraW50IEVYUE9SVCBkZWZsYXRlRW5kIChzdHJtKQogICAgIHpfc3RyZWFtcCBzdHJtOwogewogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAKKyAgICBzdGF0dXMgPSBzdHJtLT5zdGF0ZS0+c3RhdHVzOworICAgIGlmIChzdGF0dXMgIT0gSU5JVF9TVEFURSAmJiBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgorCXN0YXR1cyAhPSBGSU5JU0hfU1RBVEUpIHsKKyAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisKICAgICAvKiBEZWFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgb2YgYWxsb2NhdGlvbnM6ICovCiAgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnBlbmRpbmdfYnVmKTsKICAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+aGVhZCk7CiAgICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPnByZXYpOwogICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT53aW5kb3cpOwogCi0gICAgc3RhdHVzID0gc3RybS0+c3RhdGUtPnN0YXR1czsKICAgICBaRlJFRShzdHJtLCBzdHJtLT5zdGF0ZSk7CiAgICAgc3RybS0+c3RhdGUgPSBaX05VTEw7CiAKICAgICByZXR1cm4gc3RhdHVzID09IEJVU1lfU1RBVEUgPyBaX0RBVEFfRVJST1IgOiBaX09LOwogfQogCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgZGVmbGF0ZUNvcHkgKGRlc3QsIHNvdXJjZSkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCisgKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKKyAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KKyAqLworaW50IEVYUE9SVCBkZWZsYXRlQ29weSAoZGVzdCwgc291cmNlKQogICAgIHpfc3RyZWFtcCBkZXN0OwogICAgIHpfc3RyZWFtcCBzb3VyY2U7CiB7Ci0gICAgaWYgKHNvdXJjZSA9PSBaX05VTEwgfHwgZGVzdCA9PSBaX05VTEwgfHwgc291cmNlLT5zdGF0ZSA9PSBaX05VTEwpIHsKKyNpZmRlZiBNQVhTRUdfNjRLCisgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKKyAgICBkZWZsYXRlX3N0YXRlICpkczsKKyAgICBkZWZsYXRlX3N0YXRlICpzczsKKyAgICB1c2hmICpvdmVybGF5OworCisgICAgc3MgPSBzb3VyY2UtPnN0YXRlOworCisgICAgaWYgKHNvdXJjZSA9PSBaX05VTEwgfHwgZGVzdCA9PSBaX05VTEwgfHwgc3MgPT0gWl9OVUxMKSB7CiAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgICB9CiAgICAgKmRlc3QgPSAqc291cmNlOwotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgLyogdG8gYmUgaW1wbGVtZW50ZWQgKi8KLSNpZiAwCi0gICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKQotICAgICAgICAoKmRlc3QtPnphbGxvYykoMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoZGVzdC0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CiAKLSAgICAqKGRlc3QtPnN0YXRlKSA9ICooc291cmNlLT5zdGF0ZSk7CisgICAgZHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBaQUxMT0MoZGVzdCwgMSwgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKKyAgICBpZiAoZHMgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKSBkczsKKyAgICAqZHMgPSAqc3M7CisgICAgZHMtPnN0cm0gPSBkZXN0OworCisgICAgZHMtPndpbmRvdyA9IChCeXRlZiAqKSBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOworICAgIGRzLT5wcmV2ICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT53X3NpemUsIHNpemVvZihQb3MpKTsKKyAgICBkcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhkZXN0LCBkcy0+aGFzaF9zaXplLCBzaXplb2YoUG9zKSk7CisgICAgb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhkZXN0LCBkcy0+bGl0X2J1ZnNpemUsIHNpemVvZih1c2gpKzIpOworICAgIGRzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7CisKKyAgICBpZiAoZHMtPndpbmRvdyA9PSBaX05VTEwgfHwgZHMtPnByZXYgPT0gWl9OVUxMIHx8IGRzLT5oZWFkID09IFpfTlVMTCB8fAorICAgICAgICBkcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7CisgICAgICAgIGRlZmxhdGVFbmQgKGRlc3QpOworICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgfQorICAgIC8qIGZvbGxvd2luZyB6bWVtY3B5IGRvIG5vdCB3b3JrIGZvciAxNi1iaXQgTVNET1MgKi8KKyAgICB6bWVtY3B5KGRzLT53aW5kb3csIHNzLT53aW5kb3csIGRzLT53X3NpemUgKiAyICogc2l6ZW9mKEJ5dGUpKTsKKyAgICB6bWVtY3B5KGRzLT5wcmV2LCBzcy0+cHJldiwgZHMtPndfc2l6ZSAqIHNpemVvZihQb3MpKTsKKyAgICB6bWVtY3B5KGRzLT5oZWFkLCBzcy0+aGVhZCwgZHMtPmhhc2hfc2l6ZSAqIHNpemVvZihQb3MpKTsKKyAgICB6bWVtY3B5KGRzLT5wZW5kaW5nX2J1Ziwgc3MtPnBlbmRpbmdfYnVmLCAodUludClkcy0+cGVuZGluZ19idWZfc2l6ZSk7CisKKyAgICBkcy0+cGVuZGluZ19vdXQgPSBkcy0+cGVuZGluZ19idWYgKyAoc3MtPnBlbmRpbmdfb3V0IC0gc3MtPnBlbmRpbmdfYnVmKTsKKyAgICBkcy0+ZF9idWYgPSBvdmVybGF5ICsgZHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpOworICAgIGRzLT5sX2J1ZiA9IGRzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpkcy0+bGl0X2J1ZnNpemU7CisKKyAgICBkcy0+bF9kZXNjLmR5bl90cmVlID0gZHMtPmR5bl9sdHJlZTsKKyAgICBkcy0+ZF9kZXNjLmR5bl90cmVlID0gZHMtPmR5bl9kdHJlZTsKKyAgICBkcy0+YmxfZGVzYy5keW5fdHJlZSA9IGRzLT5ibF90cmVlOworCiAgICAgcmV0dXJuIFpfT0s7CiAjZW5kaWYKIH0KQEAgLTgxNSw3ICs4NjYsNyBAQAogCX0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOwogICAgICAgICB6X2Vycm9yKCJpbnZhbGlkIG1hdGNoIik7CiAgICAgfQotICAgIGlmICh2ZXJib3NlID4gMSkgeworICAgIGlmICh6X3ZlcmJvc2UgPiAxKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcXFslZCwlZF0iLCBzdGFydC1tYXRjaCwgbGVuZ3RoKTsKICAgICAgICAgZG8geyBwdXRjKHMtPndpbmRvd1tzdGFydCsrXSwgc3RkZXJyKTsgfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CiAgICAgfQpAQCAtODY0LDI5ICs5MTUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpd3NpemUpOwogICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgLT0gd3NpemU7CiAgICAgICAgICAgICBzLT5zdHJzdGFydCAgICAtPSB3c2l6ZTsgLyogd2Ugbm93IGhhdmUgc3Ryc3RhcnQgPj0gTUFYX0RJU1QgKi8KLQogICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgLT0gKGxvbmcpIHdzaXplOwogCiAgICAgICAgICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXMKLSAgICAgICAgICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSk6CisgICAgICAgICAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMAorICAgICAgICAgICAgICAgdG8ga2VlcCB0aGUgaGFzaCB0YWJsZSBjb25zaXN0ZW50IGlmIHdlIHN3aXRjaCBiYWNrIHRvIGxldmVsID4gMAorICAgICAgICAgICAgICAgbGF0ZXIuIChVc2luZyBsZXZlbCAwIHBlcm1hbmVudGx5IGlzIG5vdCBhbiBvcHRpbWFsIHVzYWdlIG9mCisgICAgICAgICAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBuID0gcy0+aGFzaF9zaXplOwotICAgICAgICAgICAgcCA9ICZzLT5oZWFkW25dOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG0gPSAqLS1wOwotICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKwkgICAgbiA9IHMtPmhhc2hfc2l6ZTsKKwkgICAgcCA9ICZzLT5oZWFkW25dOworCSAgICBkbyB7CisJCW0gPSAqLS1wOworCQkqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKKwkgICAgfSB3aGlsZSAoLS1uKTsKIAotICAgICAgICAgICAgbiA9IHdzaXplOwotICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG0gPSAqLS1wOwotICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0Ci0gICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0KKwkgICAgbiA9IHdzaXplOworCSAgICBwID0gJnMtPnByZXZbbl07CisJICAgIGRvIHsKKwkJbSA9ICotLXA7CisJCSpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOworCQkvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorCQkgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorCQkgKi8KKwkgICAgfSB3aGlsZSAoLS1uKTsKICAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHJldHVybjsKQEAgLTk1MCwxMiArMTAwMiwyNCBAQAogICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2UKICAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCiAgKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCi0gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZy4KKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KKyAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KICAqLwogbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQocywgZmx1c2gpCiAgICAgZGVmbGF0ZV9zdGF0ZSAqczsKICAgICBpbnQgZmx1c2g7CiB7CisgICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKKyAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKKyAgICAgKi8KKyAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7CisgICAgdWxnIG1heF9zdGFydDsKKworICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7CisgICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7CisgICAgfQorCisgICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLwogICAgIGZvciAoOzspIHsKICAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCiAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgewpAQCAtOTczLDE0ICsxMDM3LDE3IEBACiAJcy0+c3Ryc3RhcnQgKz0gcy0+bG9va2FoZWFkOwogCXMtPmxvb2thaGVhZCA9IDA7CiAKLSAgICAgICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXM6ICovCi0gICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8IHMtPnN0cnN0YXJ0ID4gMHhmZmZlKSB7CisJLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCisgCW1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7CisgICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7CiAJICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovCi0JICAgIHMtPmxvb2thaGVhZCA9IHMtPnN0cnN0YXJ0IC0gMHhmZmZmOwotCSAgICBzLT5zdHJzdGFydCA9IDB4ZmZmZjsKKwkgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKKwkgICAgcy0+c3Ryc3RhcnQgPSAodUludCltYXhfc3RhcnQ7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKIAl9Ci0KLQkvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIGl0IGlzIGxhcmdlIGVub3VnaDogKi8KKwkvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKKyAgICAgICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKKyAgICAgICAgICovCiAgICAgICAgIGlmIChzLT5zdHJzdGFydCAtICh1SW50KXMtPmJsb2NrX3N0YXJ0ID49IE1BWF9ESVNUKHMpKSB7CiAgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKIAl9CmRpZmYgLS1naXQgYS9kZWZsYXRlLmggYi9kZWZsYXRlLmgKaW5kZXggYTdkYWY3Zi4uMDcyNzJkMSAxMDA2NDQKLS0tIGEvZGVmbGF0ZS5oCisrKyBiL2RlZmxhdGUuaApAQCAtMSw1ICsxLDUgQEAKIC8qIGRlZmxhdGUuaCAtLSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZQotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseQorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseQogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCkBAIC04LDcgKzgsNyBAQAogICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgogICovCiAKLS8qICRJZDogZGVmbGF0ZS5oLHYgMS4xMCAxOTk2LzA3LzAyIDEyOjQxOjAwIG1lIEV4cCAkICovCisvKiBAKCMpICRJZCQgKi8KIAogI2lmbmRlZiBfREVGTEFURV9ICiAjZGVmaW5lIF9ERUZMQVRFX0gKQEAgLTgzLDYgKzgzLDcgQEAKICAgICB6X3N0cmVhbXAgc3RybTsgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqLwogICAgIGludCAgIHN0YXR1czsgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi8KICAgICBCeXRlZiAqcGVuZGluZ19idWY7ICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqLworICAgIHVsZyAgIHBlbmRpbmdfYnVmX3NpemU7IC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi8KICAgICBCeXRlZiAqcGVuZGluZ19vdXQ7ICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqLwogICAgIGludCAgIHBlbmRpbmc7ICAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqLwogICAgIGludCAgIG5vaGVhZGVyOyAgICAgIC8qIHN1cHByZXNzIHpsaWIgaGVhZGVyIGFuZCBhZGxlcjMyICovCmRpZmYgLS1naXQgYS9leGFtcGxlLmMgYi9leGFtcGxlLmMKaW5kZXggNWU0ZGM2ZC4uNzM0OWRlYyAxMDA2NDQKLS0tIGEvZXhhbXBsZS5jCisrKyBiL2V4YW1wbGUuYwpAQCAtMSw5ICsxLDkgQEAKIC8qIGV4YW1wbGUuYyAtLSB1c2FnZSBleGFtcGxlIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCi0vKiAkSWQ6IGV4YW1wbGUuYyx2IDEuMTYgMTk5Ni8wNS8yMyAxNzoxMToyOCBtZSBFeHAgJCAqLworLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgInpsaWIuaCIKQEAgLTg2LDE2ICs4NiwxNyBAQAogICAgIGludCBlcnI7CiAgICAgaW50IGxlbiA9IHN0cmxlbihoZWxsbykrMTsKICAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IHBvczsKIAogICAgIGZpbGUgPSBnem9wZW4ob3V0LCAid2IiKTsKICAgICBpZiAoZmlsZSA9PSBOVUxMKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ3pvcGVuIGVycm9yXG4iKTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9Ci0KLSAgICBpZiAoZ3p3cml0ZShmaWxlLCAoY29uc3Qgdm9pZHApaGVsbG8sICh1bnNpZ25lZClsZW4pICE9IGxlbikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6d3JpdGUgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisgICAgaWYgKGd6cHJpbnRmKGZpbGUsICIlcywgJXMhIiwgImhlbGxvIiwgImhlbGxvIikgIT0gbGVuLTEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenByaW50ZiBlcnI6ICVzXG4iLCBnemVycm9yKGZpbGUsICZlcnIpKTsKICAgICB9CisgICAgZ3pzZWVrKGZpbGUsIDFMLCBTRUVLX0NVUik7IC8qIGFkZCBvbmUgemVybyBieXRlICovCiAgICAgZ3pjbG9zZShmaWxlKTsKIAogICAgIGZpbGUgPSBnem9wZW4oaW4sICJyYiIpOwpAQCAtMTA4LDEzICsxMDksMjggQEAKICAgICBpZiAodW5jb21wckxlbiAhPSBsZW4pIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnenJlYWQgZXJyOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CiAgICAgfQotICAgIGd6Y2xvc2UoZmlsZSk7Ci0KICAgICBpZiAoc3RyY21wKChjaGFyKil1bmNvbXByLCBoZWxsbykpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgZ3pyZWFkXG4iKTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmludGYoImd6cmVhZCgpOiAlc1xuIiwgdW5jb21wcik7CiAgICAgfQorCisgICAgcG9zID0gZ3pzZWVrKGZpbGUsIC03TCwgU0VFS19DVVIpOworICAgIGlmIChwb3MgIT0gNyB8fCBnenRlbGwoZmlsZSkgIT0gcG9zKSB7CisJZnByaW50ZihzdGRlcnIsICJnenNlZWsgZXJyb3IsIHBvcz0lbGQsIGd6dGVsbD0lbGRcbiIsCisJCXBvcywgZ3p0ZWxsKGZpbGUpKTsKKyAgICB9CisgICAgdW5jb21wckxlbiA9IGd6cmVhZChmaWxlLCB1bmNvbXByLCAodW5zaWduZWQpdW5jb21wckxlbik7CisgICAgaWYgKHVuY29tcHJMZW4gIT0gNykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImd6cmVhZCBlcnIgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgZ3plcnJvcihmaWxlLCAmZXJyKSk7CisgICAgfQorICAgIGlmIChzdHJjbXAoKGNoYXIqKXVuY29tcHIsIGhlbGxvKzcpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIGd6cmVhZCBhZnRlciBnenNlZWtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiZ3pyZWFkKCkgYWZ0ZXIgZ3pzZWVrOiAlc1xuIiwgdW5jb21wcik7CisgICAgfQorCisgICAgZ3pjbG9zZShmaWxlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xNzEsMTIgKzE4NywxMyBAQAogICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwogICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKIAorICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CisgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAwOworICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKKwogICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CiAgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CiAKLSAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwotICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsKLQogICAgIHdoaWxlIChkX3N0cmVhbS50b3RhbF9vdXQgPCB1bmNvbXByTGVuICYmIGRfc3RyZWFtLnRvdGFsX2luIDwgY29tcHJMZW4pIHsKICAgICAgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSBkX3N0cmVhbS5hdmFpbF9vdXQgPSAxOyAvKiBmb3JjZSBzbWFsbCBidWZmZXJzICovCiAgICAgICAgIGVyciA9IGluZmxhdGUoJmRfc3RyZWFtLCBaX05PX0ZMVVNIKTsKQEAgLTI2MywxMiArMjgwLDEyIEBACiAgICAgZF9zdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CiAgICAgZF9zdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwogCi0gICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKLSAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKLQogICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CiAgICAgZF9zdHJlYW0uYXZhaWxfaW4gPSAodUludCljb21wckxlbjsKIAorICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7CisgICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7CisKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGRfc3RyZWFtLm5leHRfb3V0ID0gdW5jb21wcjsgICAgICAgICAgICAvKiBkaXNjYXJkIHRoZSBvdXRwdXQgKi8KIAlkX3N0cmVhbS5hdmFpbF9vdXQgPSAodUludCl1bmNvbXByTGVuOwpAQCAtMzM5LDEyICszNTYsMTMgQEAKICAgICBkX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKICAgICBkX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CiAKKyAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOworICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMjsgLyoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqLworCiAgICAgZXJyID0gaW5mbGF0ZUluaXQoJmRfc3RyZWFtKTsKICAgICBDSEVDS19FUlIoZXJyLCAiaW5mbGF0ZUluaXQiKTsKIAotICAgIGRfc3RyZWFtLm5leHRfaW4gID0gY29tcHI7CiAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwotICAgIGRfc3RyZWFtLmF2YWlsX2luID0gMjsgLyoganVzdCByZWFkIHRoZSB6bGliIGhlYWRlciAqLwogICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47CiAKICAgICBpbmZsYXRlKCZkX3N0cmVhbSwgWl9OT19GTFVTSCk7CkBAIC00MTcsMTIgKzQzNSwxMiBAQAogICAgIGRfc3RyZWFtLnpmcmVlID0gKGZyZWVfZnVuYykwOwogICAgIGRfc3RyZWFtLm9wYXF1ZSA9ICh2b2lkcGYpMDsKIAotICAgIGVyciA9IGluZmxhdGVJbml0KCZkX3N0cmVhbSk7Ci0gICAgQ0hFQ0tfRVJSKGVyciwgImluZmxhdGVJbml0Iik7Ci0KICAgICBkX3N0cmVhbS5uZXh0X2luICA9IGNvbXByOwogICAgIGRfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpY29tcHJMZW47CiAKKyAgICBlcnIgPSBpbmZsYXRlSW5pdCgmZF9zdHJlYW0pOworICAgIENIRUNLX0VSUihlcnIsICJpbmZsYXRlSW5pdCIpOworCiAgICAgZF9zdHJlYW0ubmV4dF9vdXQgPSB1bmNvbXByOwogICAgIGRfc3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXVuY29tcHJMZW47CiAKQEAgLTQ2MSw4ICs0NzksOSBAQAogICAgIEJ5dGUgKmNvbXByLCAqdW5jb21wcjsKICAgICB1TG9uZyBjb21wckxlbiA9IDEwMDAwKnNpemVvZihpbnQpOyAvKiBkb24ndCBvdmVyZmxvdyBvbiBNU0RPUyAqLwogICAgIHVMb25nIHVuY29tcHJMZW4gPSBjb21wckxlbjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbXlWZXJzaW9uID0gWkxJQl9WRVJTSU9OOwogCi0gICAgaWYgKHpsaWJWZXJzaW9uKClbMF0gIT0gWkxJQl9WRVJTSU9OWzBdKSB7CisgICAgaWYgKHpsaWJWZXJzaW9uKClbMF0gIT0gbXlWZXJzaW9uWzBdKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5jb21wYXRpYmxlIHpsaWIgdmVyc2lvblxuIik7CiAgICAgICAgIGV4aXQoMSk7CiAKQEAgLTQ3OSw3ICs0OTgsNiBAQAogICAgICAgICBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOwogCWV4aXQoMSk7CiAgICAgfQotCiAgICAgdGVzdF9jb21wcmVzcyhjb21wciwgY29tcHJMZW4sIHVuY29tcHIsIHVuY29tcHJMZW4pOwogCiAgICAgdGVzdF9nemlvKChhcmdjID4gMSA/IGFyZ3ZbMV0gOiAiZm9vLmd6IiksCmRpZmYgLS1naXQgYS9nemlvLmMgYi9nemlvLmMKaW5kZXggNmM4MjY3Ny4uMGI5OTE1YyAxMDA2NDQKLS0tIGEvZ3ppby5jCisrKyBiL2d6aW8uYwpAQCAtMSw5ICsxLDExIEBACiAvKiBnemlvLmMgLS0gSU8gb24gLmd6IGZpbGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5LgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseS4KICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqCisgKiBDb21waWxlIHRoaXMgZmlsZSB3aXRoIC1ETk9fREVGTEFURSB0byBhdm9pZCB0aGUgY29tcHJlc3Npb24gY29kZS4KICAqLwogCi0vKiAkSWQ6IGd6aW8uYyx2IDEuMTQgMTk5Ni8wNy8yNCAxMzo0MTowMSBtZSBFeHAgJCAqLworLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC0zOCwxMCArNDAsMTIgQEAKICAgICBjaGFyICAgICAqcGF0aDsgICAvKiBwYXRoIG5hbWUgZm9yIGRlYnVnZ2luZyBvbmx5ICovCiAgICAgaW50ICAgICAgdHJhbnNwYXJlbnQ7IC8qIDEgaWYgaW5wdXQgZmlsZSBpcyBub3QgYSAuZ3ogZmlsZSAqLwogICAgIGNoYXIgICAgIG1vZGU7ICAgIC8qICd3JyBvciAncicgKi8KKyAgICBsb25nICAgICBzdGFydHBvczsgLyogc3RhcnQgb2YgY29tcHJlc3NlZCBkYXRhIGluIGZpbGUgKGhlYWRlciBza2lwcGVkKSAqLwogfSBnel9zdHJlYW07CiAKIAogbG9jYWwgZ3pGaWxlIGd6X29wZW4gICAgICBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSwgaW50ICBmZCkpOworbG9jYWwgaW50IGRvX2ZsdXNoICAgICAgICBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwogbG9jYWwgaW50ICAgIGdldF9ieXRlICAgICBPRigoZ3pfc3RyZWFtICpzKSk7CiBsb2NhbCB2b2lkICAgY2hlY2tfaGVhZGVyIE9GKChnel9zdHJlYW0gKnMpKTsKIGxvY2FsIGludCAgICBkZXN0cm95ICAgICAgT0YoKGd6X3N0cmVhbSAqcykpOwpAQCAtNjQsNiArNjgsNyBAQAogewogICAgIGludCBlcnI7CiAgICAgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOyAvKiBjb21wcmVzc2lvbiBsZXZlbCAqLworICAgIGludCBzdHJhdGVneSA9IFpfREVGQVVMVF9TVFJBVEVHWTsgLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KICAgICBjaGFyICpwID0gKGNoYXIqKW1vZGU7CiAgICAgZ3pfc3RyZWFtICpzOwogICAgIGNoYXIgZm1vZGVbODBdOyAvKiBjb3B5IG9mIG1vZGUsIHdpdGhvdXQgdGhlIGNvbXByZXNzaW9uIGxldmVsICovCkBAIC05OSw2ICsxMDQsMTAgQEAKICAgICAgICAgaWYgKCpwID09ICd3JyB8fCAqcCA9PSAnYScpIHMtPm1vZGUgPSAndyc7CiAgICAgICAgIGlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7CiAJICAgIGxldmVsID0gKnAgLSAnMCc7CisJfSBlbHNlIGlmICgqcCA9PSAnZicpIHsKKwkgIHN0cmF0ZWd5ID0gWl9GSUxURVJFRDsKKwl9IGVsc2UgaWYgKCpwID09ICdoJykgeworCSAgc3RyYXRlZ3kgPSBaX0hVRkZNQU5fT05MWTsKIAl9IGVsc2UgewogCSAgICAqbSsrID0gKnA7IC8qIGNvcHkgdGhlIG1vZGUgKi8KIAl9CkBAIC0xMDYsMTkgKzExNSwyNCBAQAogICAgIGlmIChzLT5tb2RlID09ICdcMCcpIHJldHVybiBkZXN0cm95KHMpLCAoZ3pGaWxlKVpfTlVMTDsKICAgICAKICAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19ERUZMQVRFCisgICAgICAgIGVyciA9IFpfU1RSRUFNX0VSUk9SOworI2Vsc2UKICAgICAgICAgZXJyID0gZGVmbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBaX0RFRkxBVEVELCAtTUFYX1dCSVRTLCBERUZfTUVNX0xFVkVMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFpfREVGTEFURUQsIC1NQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIHN0cmF0ZWd5KTsKICAgICAgICAgLyogd2luZG93Qml0cyBpcyBwYXNzZWQgPCAwIHRvIHN1cHByZXNzIHpsaWIgaGVhZGVyICovCiAKICAgICAgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gcy0+b3V0YnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7Ci0KKyNlbmRpZgogICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+b3V0YnVmID09IFpfTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgLU1BWF9XQklUUyk7CiAgICAgICAgIHMtPnN0cmVhbS5uZXh0X2luICA9IHMtPmluYnVmID0gKEJ5dGUqKUFMTE9DKFpfQlVGU0laRSk7CiAKKyAgICAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCYocy0+c3RyZWFtKSwgLU1BWF9XQklUUyk7CisgICAgICAgIC8qIHdpbmRvd0JpdHMgaXMgcGFzc2VkIDwgMCB0byB0ZWxsIHRoYXQgdGhlcmUgaXMgbm8gemxpYiBoZWFkZXIgKi8KKwogICAgICAgICBpZiAoZXJyICE9IFpfT0sgfHwgcy0+aW5idWYgPT0gWl9OVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gZGVzdHJveShzKSwgKGd6RmlsZSlaX05VTEw7CiAgICAgICAgIH0KQEAgLTEyNiw3ICsxNDAsNyBAQAogICAgIHMtPnN0cmVhbS5hdmFpbF9vdXQgPSBaX0JVRlNJWkU7CiAKICAgICBlcnJubyA9IDA7Ci0gICAgcy0+ZmlsZSA9IGZkIDwgMCA/IEZPUEVOKHBhdGgsIGZtb2RlKSA6IChGSUxFKilmZG9wZW4oZmQsIGZtb2RlKTsKKyAgICBzLT5maWxlID0gZmQgPCAwID8gRl9PUEVOKHBhdGgsIGZtb2RlKSA6IChGSUxFKilmZG9wZW4oZmQsIGZtb2RlKTsKIAogICAgIGlmIChzLT5maWxlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGRlc3Ryb3kocyksIChnekZpbGUpWl9OVUxMOwpAQCAtMTM2LDE2ICsxNTAsMTkgQEAKICAgICAgICAgICovCiAgICAgICAgIGZwcmludGYocy0+ZmlsZSwgIiVjJWMlYyVjJWMlYyVjJWMlYyVjIiwgZ3pfbWFnaWNbMF0sIGd6X21hZ2ljWzFdLAogICAgICAgICAgICAgIFpfREVGTEFURUQsIDAgLypmbGFncyovLCAwLDAsMCwwIC8qdGltZSovLCAwIC8qeGZsYWdzKi8sIE9TX0NPREUpOworCXMtPnN0YXJ0cG9zID0gZnRlbGwocy0+ZmlsZSk7CiAgICAgfSBlbHNlIHsKIAljaGVja19oZWFkZXIocyk7IC8qIHNraXAgdGhlIC5neiBoZWFkZXIgKi8KKwlzLT5zdGFydHBvcyA9IChmdGVsbChzLT5maWxlKSAtIHMtPnN0cmVhbS5hdmFpbF9pbik7CiAgICAgfQorICAgIAogICAgIHJldHVybiAoZ3pGaWxlKXM7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBPcGVucyBhIGd6aXAgKC5neikgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogKi8KLWd6RmlsZSBnem9wZW4gKHBhdGgsIG1vZGUpCitnekZpbGUgRVhQT1JUIGd6b3BlbiAocGF0aCwgbW9kZSkKICAgICBjb25zdCBjaGFyICpwYXRoOwogICAgIGNvbnN0IGNoYXIgKm1vZGU7CiB7CkBAIC0xNTYsNyArMTczLDcgQEAKICAgICAgQXNzb2NpYXRlIGEgZ3pGaWxlIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gZmQgaXMgbm90IGR1cCdlZCBoZXJlCiAgICB0byBtaW1pYyB0aGUgYmVoYXZpbyh1KXIgb2YgZmRvcGVuLgogKi8KLWd6RmlsZSBnemRvcGVuIChmZCwgbW9kZSkKK2d6RmlsZSBFWFBPUlQgZ3pkb3BlbiAoZmQsIG1vZGUpCiAgICAgaW50IGZkOwogICAgIGNvbnN0IGNoYXIgKm1vZGU7CiB7CkBAIC0xNjksNiArMTg2LDMxIEBACiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgc3RyYXRlZ3kKKyAqLworaW50IEVYUE9SVCBnenNldHBhcmFtcyAoZmlsZSwgbGV2ZWwsIHN0cmF0ZWd5KQorICAgIGd6RmlsZSBmaWxlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc3RyYXRlZ3k7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKworICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAndycpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIC8qIE1ha2Ugcm9vbSB0byBhbGxvdyBmbHVzaGluZyAqLworICAgIGlmIChzLT5zdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKKworCXMtPnN0cmVhbS5uZXh0X291dCA9IHMtPm91dGJ1ZjsKKwlpZiAoZndyaXRlKHMtPm91dGJ1ZiwgMSwgWl9CVUZTSVpFLCBzLT5maWxlKSAhPSBaX0JVRlNJWkUpIHsKKwkgICAgcy0+el9lcnIgPSBaX0VSUk5POworCX0KKwlzLT5zdHJlYW0uYXZhaWxfb3V0ID0gWl9CVUZTSVpFOworICAgIH0KKworICAgIHJldHVybiBkZWZsYXRlUGFyYW1zICgmKHMtPnN0cmVhbSksIGxldmVsLCBzdHJhdGVneSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICBSZWFkIGEgYnl0ZSBmcm9tIGEgZ3pfc3RyZWFtOyB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4uIFJldHVybiBFT0YKICAgIGZvciBlbmQgb2YgZmlsZS4KICAgIElOIGFzc2VydGlvbjogdGhlIHN0cmVhbSBzIGhhcyBiZWVuIHN1Y2Vzc2Z1bGx5IG9wZW5lZCBmb3IgcmVhZGluZy4KQEAgLTIxMiw4ICsyNTQsMTEgQEAKICAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IDI7IGxlbisrKSB7CiAJYyA9IGdldF9ieXRlKHMpOwogCWlmIChjICE9IGd6X21hZ2ljW2xlbl0pIHsKLQkgICAgcy0+dHJhbnNwYXJlbnQgPSAxOwotCSAgICBpZiAoYyAhPSBFT0YpIHMtPnN0cmVhbS5hdmFpbF9pbisrLCBzLT5zdHJlYW0ubmV4dF9pbi0tOworCSAgICBpZiAobGVuICE9IDApIHMtPnN0cmVhbS5hdmFpbF9pbisrLCBzLT5zdHJlYW0ubmV4dF9pbi0tOworCSAgICBpZiAoYyAhPSBFT0YpIHsKKwkJcy0+c3RyZWFtLmF2YWlsX2luKyssIHMtPnN0cmVhbS5uZXh0X2luLS07CisJCXMtPnRyYW5zcGFyZW50ID0gMTsKKwkgICAgfQogCSAgICBzLT56X2VyciA9IHMtPnN0cmVhbS5hdmFpbF9pbiAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKIAkgICAgcmV0dXJuOwogCX0KQEAgLTI2MCwxNCArMzA1LDIxIEBACiAgICAgVFJZRlJFRShzLT5tc2cpOwogCiAgICAgaWYgKHMtPnN0cmVhbS5zdGF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgaWYgKHMtPm1vZGUgPT0gJ3cnKSB7Ci0gICAgICAgICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKLSAgICAgICB9IGVsc2UgaWYgKHMtPm1vZGUgPT0gJ3InKSB7Ci0gICAgICAgICAgIGVyciA9IGluZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKLSAgICAgICB9CisJaWYgKHMtPm1vZGUgPT0gJ3cnKSB7CisjaWZkZWYgTk9fREVGTEFURQorCSAgICBlcnIgPSBaX1NUUkVBTV9FUlJPUjsKKyNlbHNlCisJICAgIGVyciA9IGRlZmxhdGVFbmQoJihzLT5zdHJlYW0pKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAocy0+bW9kZSA9PSAncicpIHsKKwkgICAgZXJyID0gaW5mbGF0ZUVuZCgmKHMtPnN0cmVhbSkpOworCX0KICAgICB9CiAgICAgaWYgKHMtPmZpbGUgIT0gTlVMTCAmJiBmY2xvc2Uocy0+ZmlsZSkpIHsKLSAgICAgICAgZXJyID0gWl9FUlJOTzsKKyNpZmRlZiBFU1BJUEUKKwlpZiAoZXJybm8gIT0gRVNQSVBFKSAvKiBmY2xvc2UgaXMgYnJva2VuIGZvciBwaXBlcyBpbiBIUC9VWCAqLworI2VuZGlmCisJICAgIGVyciA9IFpfRVJSTk87CiAgICAgfQogICAgIGlmIChzLT56X2VyciA8IDApIGVyciA9IHMtPnpfZXJyOwogCkBAIC0yODIsMTMgKzMzNCwxMyBAQAogICAgICBSZWFkcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUuCiAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgKDAgZm9yIGVuZCBvZiBmaWxlKS4KICovCi1pbnQgZ3pyZWFkIChmaWxlLCBidWYsIGxlbikKK2ludCBFWFBPUlQgZ3pyZWFkIChmaWxlLCBidWYsIGxlbikKICAgICBnekZpbGUgZmlsZTsKICAgICB2b2lkcCBidWY7CiAgICAgdW5zaWduZWQgbGVuOwogewogICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7Ci0gICAgQnl0ZWYgKnN0YXJ0ID0gYnVmOyAvKiBzdGFydGluZyBwb2ludCBmb3IgY3JjIGNvbXB1dGF0aW9uICovCisgICAgQnl0ZWYgKnN0YXJ0ID0gKEJ5dGVmKilidWY7IC8qIHN0YXJ0aW5nIHBvaW50IGZvciBjcmMgY29tcHV0YXRpb24gKi8KICAgICBCeXRlICAqbmV4dF9vdXQ7IC8qID09IHN0cmVhbS5uZXh0X291dCBidXQgbm90IGZvcmNlZCBmYXIgKGZvciBNU0RPUykgKi8KIAogICAgIGlmIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKQEAgLTI5Niw3ICszNDgsOCBAQAogICAgIGlmIChzLT56X2VyciA9PSBaX0RBVEFfRVJST1IgfHwgcy0+el9lcnIgPT0gWl9FUlJOTykgcmV0dXJuIC0xOwogICAgIGlmIChzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQpIHJldHVybiAwOyAgLyogRU9GICovCiAKLSAgICBzLT5zdHJlYW0ubmV4dF9vdXQgPSBuZXh0X291dCA9IGJ1ZjsKKyAgICBuZXh0X291dCA9IChCeXRlKilidWY7CisgICAgcy0+c3RyZWFtLm5leHRfb3V0ID0gKEJ5dGVmKilidWY7CiAgICAgcy0+c3RyZWFtLmF2YWlsX291dCA9IGxlbjsKIAogICAgIHdoaWxlIChzLT5zdHJlYW0uYXZhaWxfb3V0ICE9IDApIHsKQEAgLTM0NSw3ICszOTgsMTIgQEAKIAkJLyogQ2hlY2sgZm9yIGNvbmNhdGVuYXRlZCAuZ3ogZmlsZXM6ICovCiAJCWNoZWNrX2hlYWRlcihzKTsKIAkJaWYgKHMtPnpfZXJyID09IFpfT0spIHsKKwkJICAgIHVMb25nIHRvdGFsX2luID0gcy0+c3RyZWFtLnRvdGFsX2luOworCQkgICAgdUxvbmcgdG90YWxfb3V0ID0gcy0+c3RyZWFtLnRvdGFsX291dDsKKwogCQkgICAgaW5mbGF0ZVJlc2V0KCYocy0+c3RyZWFtKSk7CisJCSAgICBzLT5zdHJlYW0udG90YWxfaW4gPSB0b3RhbF9pbjsKKwkJICAgIHMtPnN0cmVhbS50b3RhbF9vdXQgPSB0b3RhbF9vdXQ7CiAJCSAgICBzLT5jcmMgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKIAkJfQogCSAgICB9CkBAIC0zNTcsMTEgKzQxNSwyNiBAQAogICAgIHJldHVybiAoaW50KShsZW4gLSBzLT5zdHJlYW0uYXZhaWxfb3V0KTsKIH0KIAorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gZ3pnZXRjIHJldHVybnMgdGhpcyBieXRlCisgICBvciAtMSBpbiBjYXNlIG9mIGVuZCBvZiBmaWxlIG9yIGVycm9yLgorKi8KK2ludCBFWFBPUlQgZ3pnZXRjKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgaW50IGM7CisKKyAgICByZXR1cm4gZ3pyZWFkKGZpbGUsICZjLCAxKSA9PSAxID8gYyA6IC0xOworfQorCisKKyNpZm5kZWYgTk9fREVGTEFURQogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgIFdyaXRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuCiAgICBnendyaXRlIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgogKi8KLWludCBnendyaXRlIChmaWxlLCBidWYsIGxlbikKK2ludCBFWFBPUlQgZ3p3cml0ZSAoZmlsZSwgYnVmLCBsZW4pCiAgICAgZ3pGaWxlIGZpbGU7CiAgICAgY29uc3Qgdm9pZHAgYnVmOwogICAgIHVuc2lnbmVkIGxlbjsKQEAgLTM3MCw3ICs0NDMsNyBAQAogCiAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5tb2RlICE9ICd3JykgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogCi0gICAgcy0+c3RyZWFtLm5leHRfaW4gPSBidWY7CisgICAgcy0+c3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKWJ1ZjsKICAgICBzLT5zdHJlYW0uYXZhaWxfaW4gPSBsZW47CiAKICAgICB3aGlsZSAocy0+c3RyZWFtLmF2YWlsX2luICE9IDApIHsKQEAgLTM4NywxOCArNDYwLDc5IEBACiAgICAgICAgIHMtPnpfZXJyID0gZGVmbGF0ZSgmKHMtPnN0cmVhbSksIFpfTk9fRkxVU0gpOwogICAgICAgICBpZiAocy0+el9lcnIgIT0gWl9PSykgYnJlYWs7CiAgICAgfQotICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgYnVmLCBsZW4pOworICAgIHMtPmNyYyA9IGNyYzMyKHMtPmNyYywgKGNvbnN0IEJ5dGVmICopYnVmLCBsZW4pOwogCiAgICAgcmV0dXJuIChpbnQpKGxlbiAtIHMtPnN0cmVhbS5hdmFpbF9pbik7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBDb252ZXJ0cywgZm9ybWF0cywgYW5kIHdyaXRlcyB0aGUgYXJncyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCisgICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiBnenByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAgIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSB3cml0dGVuICgwIGluIGNhc2Ugb2YgZXJyb3IpLgorKi8KKyNpZmRlZiBTVERDCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKK2ludCBFWFBPUlRWQSBnenByaW50ZiAoZ3pGaWxlIGZpbGUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLyogYXJncyAqLyAuLi4pCit7CisgICAgY2hhciBidWZbWl9CVUZTSVpFXTsKKyAgICB2YV9saXN0IHZhOworICAgIGludCBsZW47CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyNpZmRlZiBIQVNfdnNucHJpbnRmCisgICAgbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgdmEpOworI2Vsc2UKKyAgICBsZW4gPSB2c3ByaW50ZihidWYsIGZvcm1hdCwgdmEpOworI2VuZGlmCisgICAgdmFfZW5kKHZhKTsKKyAgICBpZiAobGVuIDw9IDApIHJldHVybiAwOworCisgICAgcmV0dXJuIGd6d3JpdGUoZmlsZSwgYnVmLCAodW5zaWduZWQpbGVuKTsKK30KKyNlbHNlIC8qIG5vdCBBTlNJIEMgKi8KKworaW50IEVYUE9SVFZBIGd6cHJpbnRmIChmaWxlLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwKKwkgICAgICAgICAgICAgICBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApCisgICAgZ3pGaWxlIGZpbGU7CisgICAgY29uc3QgY2hhciAqZm9ybWF0OworICAgIGludCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsCisJYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwOworeworICAgIGNoYXIgYnVmW1pfQlVGU0laRV07CisgICAgaW50IGxlbjsKKworI2lmZGVmIEhBU19zbnByaW50ZgorICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorCSAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKKyNlbHNlCisgICAgc3ByaW50ZihidWYsIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAorCSAgICBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApOworI2VuZGlmCisgICAgbGVuID0gc3RybGVuKGJ1Zik7IC8qIG9sZCBzcHJpbnRmIGRvZXNuJ3QgcmV0dXJuIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuICovCisgICAgaWYgKGxlbiA8PSAwKSByZXR1cm4gMDsKKworICAgIHJldHVybiBnendyaXRlKGZpbGUsIGJ1ZiwgbGVuKTsKK30KKyNlbmRpZgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworaW50IEVYUE9SVCBnenB1dGMoZmlsZSwgYykKKyAgICBnekZpbGUgZmlsZTsKKyAgICBpbnQgYzsKK3sKKyAgICByZXR1cm4gZ3p3cml0ZShmaWxlLCAmYywgMSkgPT0gMSA/IGMgOiAtMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiBUaGUgcGFyYW1ldGVyCiAgICBmbHVzaCBpcyBhcyBpbiB0aGUgZGVmbGF0ZSgpIGZ1bmN0aW9uLgotICAgICBnemZsdXNoIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIHN0cmljdGx5IG5lY2Vzc2FyeSBiZWNhdXNlIGl0IGNhbgotICAgZGVncmFkZSBjb21wcmVzc2lvbi4KICovCi1pbnQgZ3pmbHVzaCAoZmlsZSwgZmx1c2gpCitsb2NhbCBpbnQgZG9fZmx1c2ggKGZpbGUsIGZsdXNoKQogICAgIGd6RmlsZSBmaWxlOwogICAgIGludCBmbHVzaDsKIHsKQEAgLTQyNCw2ICs1NTgsOSBAQAogICAgICAgICBpZiAoZG9uZSkgYnJlYWs7CiAgICAgICAgIHMtPnpfZXJyID0gZGVmbGF0ZSgmKHMtPnN0cmVhbSksIGZsdXNoKTsKIAorCS8qIElnbm9yZSB0aGUgc2Vjb25kIG9mIHR3byBjb25zZWN1dGl2ZSBmbHVzaGVzOiAqLworCWlmIChsZW4gPT0gMCAmJiBzLT56X2VyciA9PSBaX0JVRl9FUlJPUikgcy0+el9lcnIgPSBaX09LOworCiAgICAgICAgIC8qIGRlZmxhdGUgaGFzIGZpbmlzaGVkIGZsdXNoaW5nIG9ubHkgd2hlbiBpdCBoYXNuJ3QgdXNlZCB1cAogICAgICAgICAgKiBhbGwgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlcjogCiAgICAgICAgICAqLwpAQCAtNDMxLDkgKzU2OCwxNTQgQEAKICAKICAgICAgICAgaWYgKHMtPnpfZXJyICE9IFpfT0sgJiYgcy0+el9lcnIgIT0gWl9TVFJFQU1fRU5EKSBicmVhazsKICAgICB9CisgICAgcmV0dXJuICBzLT56X2VyciA9PSBaX1NUUkVBTV9FTkQgPyBaX09LIDogcy0+el9lcnI7Cit9CisKK2ludCBFWFBPUlQgZ3pmbHVzaCAoZmlsZSwgZmx1c2gpCisgICAgIGd6RmlsZSBmaWxlOworICAgICBpbnQgZmx1c2g7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICBpbnQgZXJyID0gZG9fZmx1c2ggKGZpbGUsIGZsdXNoKTsKKworICAgIGlmIChlcnIpIHJldHVybiBlcnI7CiAgICAgZmZsdXNoKHMtPmZpbGUpOwogICAgIHJldHVybiAgcy0+el9lcnIgPT0gWl9TVFJFQU1fRU5EID8gWl9PSyA6IHMtPnpfZXJyOwogfQorI2VuZGlmIC8qIE5PX0RFRkxBVEUgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICBTZXRzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBmb3IgdGhlIG5leHQgZ3pyZWFkIG9yIGd6d3JpdGUgb24gdGhlIGdpdmVuCisgICBjb21wcmVzc2VkIGZpbGUuIFRoZSBvZmZzZXQgcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KKyAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICBTRUVLX0VORCBpcyBub3QgaW1wbGVtZW50ZWQsIHJldHVybnMgZXJyb3IuCisgICAgICBJbiB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGd6c2VlayBjYW4gYmUgZXh0cmVtZWx5IHNsb3cuCisqLworel9vZmZfdCBFWFBPUlQgZ3pzZWVrIChmaWxlLCBvZmZzZXQsIHdoZW5jZSkKKyAgICBnekZpbGUgZmlsZTsKKyAgICB6X29mZl90IG9mZnNldDsKKyAgICBpbnQgd2hlbmNlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisKKyAgICBpZiAocyA9PSBOVUxMIHx8IHdoZW5jZSA9PSBTRUVLX0VORCB8fCBzLT56X2VyciA9PSBaX0VSUk5PKSByZXR1cm4gLTFMOworCisgICAgcy0+el9lcnIgPSBaX09LOworICAgIHMtPnpfZW9mID0gMDsKKyAgICAKKyAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKKyNpZmRlZiBOT19ERUZMQVRFCisJcmV0dXJuIC0xTDsKKyNlbHNlCisJaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkgeworCSAgICBvZmZzZXQgLT0gcy0+c3RyZWFtLnRvdGFsX291dDsKKwl9CisJaWYgKG9mZnNldCA8IDApIHJldHVybiAtMUw7CisKKwkvKiBBdCB0aGlzIHBvaW50LCBvZmZzZXQgaXMgdGhlIG51bWJlciBvZiB6ZXJvIGJ5dGVzIHRvIHdyaXRlLiAqLworCWlmIChzLT5pbmJ1ZiA9PSBaX05VTEwpIHsKKwkgICAgcy0+aW5idWYgPSAoQnl0ZSopQUxMT0MoWl9CVUZTSVpFKTsgLyogZm9yIHNlZWtpbmcgKi8KKwkgICAgem1lbXplcm8ocy0+aW5idWYsIFpfQlVGU0laRSk7CisJfQorCXdoaWxlIChvZmZzZXQgPiAwKSAgeworCSAgICB1SW50IHNpemUgPSBaX0JVRlNJWkU7CisJICAgIGlmIChvZmZzZXQgPCBaX0JVRlNJWkUpIHNpemUgPSAodUludClvZmZzZXQ7CisKKwkgICAgc2l6ZSA9IGd6d3JpdGUoZmlsZSwgcy0+aW5idWYsIHNpemUpOworCSAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gLTFMOworCisJICAgIG9mZnNldCAtPSBzaXplOworCX0KKwlyZXR1cm4gcy0+c3RyZWFtLnRvdGFsX2luOworI2VuZGlmCisgICAgfQorICAgIC8qIFJlc3Qgb2YgZnVuY3Rpb24gaXMgZm9yIHJlYWRpbmcgb25seSAqLworCisgICAgaWYgKHMtPnpfZXJyID09IFpfREFUQV9FUlJPUikgcmV0dXJuIC0xTDsKKworICAgIC8qIGNvbXB1dGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KKyAgICBpZiAod2hlbmNlID09IFNFRUtfQ1VSKSB7CisJb2Zmc2V0ICs9IHMtPnN0cmVhbS50b3RhbF9vdXQ7CisgICAgfQorICAgIGlmIChvZmZzZXQgPCAwKSByZXR1cm4gLTFMOworCisgICAgaWYgKHMtPnRyYW5zcGFyZW50KSB7CisJLyogbWFwIHRvIGZzZWVrICovCisJcy0+c3RyZWFtLmF2YWlsX2luID0gMDsKKwlzLT5zdHJlYW0ubmV4dF9pbiA9IHMtPmluYnVmOworCWlmIChmc2VlayhzLT5maWxlLCBvZmZzZXQsIFNFRUtfU0VUKSA8IDApIHJldHVybiAtMUw7CisJcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICAvKiBGb3IgYSBuZWdhdGl2ZSBzZWVrLCByZXdpbmQgYW5kIHVzZSBwb3NpdGl2ZSBzZWVrICovCisgICAgaWYgKCh1TG9uZylvZmZzZXQgPj0gcy0+c3RyZWFtLnRvdGFsX291dCkgeworCW9mZnNldCAtPSBzLT5zdHJlYW0udG90YWxfb3V0OworICAgIH0gZWxzZSBpZiAoZ3pyZXdpbmQoZmlsZSkgPCAwKSB7CisJcmV0dXJuIC0xTDsKKyAgICB9CisgICAgLyogb2Zmc2V0IGlzIG5vdyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICovCisKKyAgICBpZiAob2Zmc2V0ICE9IDAgJiYgcy0+b3V0YnVmID09IFpfTlVMTCkgeworCXMtPm91dGJ1ZiA9IChCeXRlKilBTExPQyhaX0JVRlNJWkUpOworICAgIH0KKyAgICB3aGlsZSAob2Zmc2V0ID4gMCkgIHsKKwlpbnQgc2l6ZSA9IFpfQlVGU0laRTsKKwlpZiAob2Zmc2V0IDwgWl9CVUZTSVpFKSBzaXplID0gKGludClvZmZzZXQ7CisKKwlzaXplID0gZ3pyZWFkKGZpbGUsIHMtPm91dGJ1ZiwgKHVJbnQpc2l6ZSk7CisJaWYgKHNpemUgPD0gMCkgcmV0dXJuIC0xTDsKKwlvZmZzZXQgLT0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHMtPnN0cmVhbS50b3RhbF9vdXQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXdpbmRzIGlucHV0IGZpbGUuIAorKi8KK2ludCBFWFBPUlQgZ3pyZXdpbmQgKGZpbGUpCisgICAgZ3pGaWxlIGZpbGU7Cit7CisgICAgZ3pfc3RyZWFtICpzID0gKGd6X3N0cmVhbSopZmlsZTsKKyAgICAKKyAgICBpZiAocyA9PSBOVUxMIHx8IHMtPm1vZGUgIT0gJ3InKSByZXR1cm4gLTE7CisKKyAgICBzLT56X2VyciA9IFpfT0s7CisgICAgcy0+el9lb2YgPSAwOworICAgIHMtPnN0cmVhbS5hdmFpbF9pbiA9IDA7CisgICAgcy0+c3RyZWFtLm5leHRfaW4gPSBzLT5pbmJ1ZjsKKwkKKyAgICBpZiAocy0+c3RhcnRwb3MgPT0gMCkgeyAvKiBub3QgYSBjb21wcmVzc2VkIGZpbGUgKi8KKwlyZXdpbmQocy0+ZmlsZSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgKHZvaWQpIGluZmxhdGVSZXNldCgmcy0+c3RyZWFtKTsKKyAgICByZXR1cm4gZnNlZWsocy0+ZmlsZSwgcy0+c3RhcnRwb3MsIFNFRUtfU0VUKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorKi8KK3pfb2ZmX3QgRVhQT1JUIGd6dGVsbCAoZmlsZSkKKyAgICBnekZpbGUgZmlsZTsKK3sKKyAgICByZXR1cm4gZ3pzZWVrKGZpbGUsIDBMLCBTRUVLX0NVUik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgorICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyovCitpbnQgRVhQT1JUIGd6ZW9mIChmaWxlKQorICAgIGd6RmlsZSBmaWxlOworeworICAgIGd6X3N0cmVhbSAqcyA9IChnel9zdHJlYW0qKWZpbGU7CisgICAgCisgICAgcmV0dXJuIChzID09IE5VTEwgfHwgcy0+bW9kZSAhPSAncicpID8gMCA6IHMtPnpfZW9mOworfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIE91dHB1dHMgYSBsb25nIGluIExTQiBvcmRlciB0byB0aGUgZ2l2ZW4gZmlsZQpAQCAtNDcwLDcgKzc1Miw3IEBACiAgICAgIEZsdXNoZXMgYWxsIHBlbmRpbmcgb3V0cHV0IGlmIG5lY2Vzc2FyeSwgY2xvc2VzIHRoZSBjb21wcmVzc2VkIGZpbGUKICAgIGFuZCBkZWFsbG9jYXRlcyBhbGwgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4KICovCi1pbnQgZ3pjbG9zZSAoZmlsZSkKK2ludCBFWFBPUlQgZ3pjbG9zZSAoZmlsZSkKICAgICBnekZpbGUgZmlsZTsKIHsKICAgICBpbnQgZXJyOwpAQCAtNDc5LDE0ICs3NjEsMTcgQEAKICAgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAKICAgICBpZiAocy0+bW9kZSA9PSAndycpIHsKLSAgICAgICAgZXJyID0gZ3pmbHVzaCAoZmlsZSwgWl9GSU5JU0gpOwotICAgICAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBkZXN0cm95KGZpbGUpOworI2lmZGVmIE5PX0RFRkxBVEUKKwlyZXR1cm4gWl9TVFJFQU1fRVJST1I7CisjZWxzZQorICAgICAgICBlcnIgPSBkb19mbHVzaCAoZmlsZSwgWl9GSU5JU0gpOworICAgICAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBkZXN0cm95KChnel9zdHJlYW0qKWZpbGUpOwogCiAgICAgICAgIHB1dExvbmcgKHMtPmZpbGUsIHMtPmNyYyk7CiAgICAgICAgIHB1dExvbmcgKHMtPmZpbGUsIHMtPnN0cmVhbS50b3RhbF9pbik7Ci0KKyNlbmRpZgogICAgIH0KLSAgICByZXR1cm4gZGVzdHJveShmaWxlKTsKKyAgICByZXR1cm4gZGVzdHJveSgoZ3pfc3RyZWFtKilmaWxlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00OTYsNyArNzgxLDcgQEAKICAgIGVycm51bSBpcyBzZXQgdG8gWl9FUlJOTyBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBjb25zdWx0IGVycm5vCiAgICB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCiAqLwotY29uc3QgY2hhciogIGd6ZXJyb3IgKGZpbGUsIGVycm51bSkKK2NvbnN0IGNoYXIqICBFWFBPUlQgZ3plcnJvciAoZmlsZSwgZXJybnVtKQogICAgIGd6RmlsZSBmaWxlOwogICAgIGludCAqZXJybnVtOwogewpkaWZmIC0tZ2l0IGEvaW5mYmxvY2suYyBiL2luZmJsb2NrLmMKaW5kZXggYTMwMGMyOC4uNGQ4MWQ3MiAxMDA2NDQKLS0tIGEvaW5mYmxvY2suYworKysgYi9pbmZibG9jay5jCkBAIC02Niw3ICs2Niw3IEBACiB6X3N0cmVhbXAgejsKIHVMb25nZiAqYzsKIHsKLSAgaWYgKHMtPmNoZWNrZm4gIT0gWl9OVUxMKQorICBpZiAoYyAhPSBaX05VTEwpCiAgICAgKmMgPSBzLT5jaGVjazsKICAgaWYgKHMtPm1vZGUgPT0gQlRSRUUgfHwgcy0+bW9kZSA9PSBEVFJFRSkKICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwpAQCAtODEsNyArODEsNyBAQAogICBzLT5iaXRiID0gMDsKICAgcy0+cmVhZCA9IHMtPndyaXRlID0gcy0+d2luZG93OwogICBpZiAocy0+Y2hlY2tmbiAhPSBaX05VTEwpCi0gICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikoMEwsIFpfTlVMTCwgMCk7CisgICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikoMEwsIChjb25zdCBCeXRlZiAqKVpfTlVMTCwgMCk7CiAgIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlOiAgIGJsb2NrcyByZXNldFxuIikpOwogfQogCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgcy0+Y2hlY2tmbiA9IGM7CiAgIHMtPm1vZGUgPSBUWVBFOwogICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogICBibG9ja3MgYWxsb2NhdGVkXG4iKSk7Ci0gIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosICZzLT5jaGVjayk7CisgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIFpfTlVMTCk7CiAgIHJldHVybiBzOwogfQogCkBAIC0zODAsMTIgKzM4MCwxMSBAQAogfQogCiAKLWludCBpbmZsYXRlX2Jsb2Nrc19mcmVlKHMsIHosIGMpCitpbnQgaW5mbGF0ZV9ibG9ja3NfZnJlZShzLCB6KQogaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwogel9zdHJlYW1wIHo7Ci11TG9uZ2YgKmM7CiB7Ci0gIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHMsIHosIGMpOworICBpbmZsYXRlX2Jsb2Nrc19yZXNldChzLCB6LCBaX05VTEwpOwogICBaRlJFRSh6LCBzLT53aW5kb3cpOwogICBaRlJFRSh6LCBzKTsKICAgVHJhY2UoKHN0ZGVyciwgImluZmxhdGU6ICAgYmxvY2tzIGZyZWVkXG4iKSk7CkBAIC00MDEsMyArNDAwLDE0IEBACiAgIHptZW1jcHkoKGNoYXJmICopcy0+d2luZG93LCBkLCBuKTsKICAgcy0+cmVhZCA9IHMtPndyaXRlID0gcy0+d2luZG93ICsgbjsKIH0KKworCisvKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAorICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gCisgKiBJTiBhc3NlcnRpb246IHMgIT0gWl9OVUxMCisgKi8KK2ludCBpbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50KHMpCitpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnM7Cit7CisgIHJldHVybiBzLT5tb2RlID09IExFTlM7Cit9CmRpZmYgLS1naXQgYS9pbmZibG9jay5oIGIvaW5mYmxvY2suaAppbmRleCAzZWNkNTBjLi5iZDI1YzgwIDEwMDY0NAotLS0gYS9pbmZibG9jay5oCisrKyBiL2luZmJsb2NrLmgKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZibG9jay5oIC0tIGhlYWRlciB0byB1c2UgaW5mYmxvY2suYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCkBAIC0yOCwxMCArMjgsMTIgQEAKIAogZXh0ZXJuIGludCBpbmZsYXRlX2Jsb2Nrc19mcmVlIE9GKCgKICAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIHVMb25nZiAqKSk7ICAgICAgICAgICAgICAgICAgLyogY2hlY2sgdmFsdWUgb24gb3V0cHV0ICovCisgICAgel9zdHJlYW1wKSk7CiAKIGV4dGVybiB2b2lkIGluZmxhdGVfc2V0X2RpY3Rpb25hcnkgT0YoKAogICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKICAgICBjb25zdCBCeXRlZiAqZCwgIC8qIGRpY3Rpb25hcnkgKi8KICAgICB1SW50ICBuKSk7ICAgICAgIC8qIGRpY3Rpb25hcnkgbGVuZ3RoICovCisKK2V4dGVybiBpbnQgaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCBPRigoCisgICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzKSk7CmRpZmYgLS1naXQgYS9pbmZjb2Rlcy5jIGIvaW5mY29kZXMuYwppbmRleCAzYWUzODE4Li4xODFhYTUzIDEwMDY0NAotLS0gYS9pbmZjb2Rlcy5jCisrKyBiL2luZmNvZGVzLmMKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZjb2Rlcy5jIC0tIHByb2Nlc3MgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZSBwYWlycwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCkBAIC0xNiwxMSArMTYsNyBAQAogI2RlZmluZSBleG9wIHdvcmQud2hhdC5FeG9wCiAjZGVmaW5lIGJpdHMgd29yZC53aGF0LkJpdHMKIAotLyogaW5mbGF0ZSBjb2RlcyBwcml2YXRlIHN0YXRlICovCi1zdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7Ci0KLSAgLyogbW9kZSAqLwotICBlbnVtIHsgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KK3R5cGVkZWYgZW51bSB7ICAgICAgICAvKiB3YWl0aW5nIGZvciAiaToiPWlucHV0LCAibzoiPW91dHB1dCwgIng6Ij1ub3RoaW5nICovCiAgICAgICBTVEFSVCwgICAgLyogeDogc2V0IHVwIGZvciBMRU4gKi8KICAgICAgIExFTiwgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KICAgICAgIExFTkVYVCwgICAvKiBpOiBnZXR0aW5nIGxlbmd0aCBleHRyYSAoaGF2ZSBiYXNlKSAqLwpAQCAtMzEsNyArMjcsMTMgQEAKICAgICAgIFdBU0gsICAgICAvKiBvOiBnb3QgZW9iLCBwb3NzaWJseSBzdGlsbCBvdXRwdXQgd2FpdGluZyAqLwogICAgICAgRU5ELCAgICAgIC8qIHg6IGdvdCBlb2IgYW5kIGFsbCBkYXRhIGZsdXNoZWQgKi8KICAgICAgIEJBRENPREV9ICAvKiB4OiBnb3QgZXJyb3IgKi8KLSAgICBtb2RlOyAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5mbGF0ZV9jb2RlcyBtb2RlICovCitpbmZsYXRlX2NvZGVzX21vZGU7CisKKy8qIGluZmxhdGUgY29kZXMgcHJpdmF0ZSBzdGF0ZSAqLworc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGUgeworCisgIC8qIG1vZGUgKi8KKyAgaW5mbGF0ZV9jb2Rlc19tb2RlIG1vZGU7ICAgICAgLyogY3VycmVudCBpbmZsYXRlX2NvZGVzIG1vZGUgKi8KIAogICAvKiBtb2RlIGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwogICB1SW50IGxlbjsKQEAgLTIzNSw2ICsyMzcsOSBAQAogICAgICAgciA9IFpfU1RSRUFNX0VSUk9SOwogICAgICAgTEVBVkUKICAgfQorI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCisgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgIC8qIFNvbWUgZHVtYiBjb21waWxlcnMgY29tcGxhaW4gd2l0aG91dCB0aGlzICovCisjZW5kaWYKIH0KIAogCmRpZmYgLS1naXQgYS9pbmZjb2Rlcy5oIGIvaW5mY29kZXMuaAppbmRleCBjMmMzOGRmLi42Yzc1MGQ4IDEwMDY0NAotLS0gYS9pbmZjb2Rlcy5oCisrKyBiL2luZmNvZGVzLmgKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZjb2Rlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mY29kZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCmRpZmYgLS1naXQgYS9pbmZmYXN0LmMgYi9pbmZmYXN0LmMKaW5kZXggODZlZWU0YS4uM2M2ZmYwNiAxMDA2NDQKLS0tIGEvaW5mZmFzdC5jCisrKyBiL2luZmZhc3QuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmZhc3QuYyAtLSBwcm9jZXNzIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2UgcGFpcnMgZmFzdAotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCmRpZmYgLS1naXQgYS9pbmZmYXN0LmggYi9pbmZmYXN0LmgKaW5kZXggOGNjNjQ0ZS4uOGZhY2VjNSAxMDA2NDQKLS0tIGEvaW5mZmFzdC5oCisrKyBiL2luZmZhc3QuaApAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmZhc3QuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmZhc3QuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCmRpZmYgLS1naXQgYS9pbmZsYXRlLmMgYi9pbmZsYXRlLmMKaW5kZXggNzRjYzY5Yy4uNWJkZDk5NyAxMDA2NDQKLS0tIGEvaW5mbGF0ZS5jCisrKyBiL2luZmxhdGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmxhdGUuYyAtLSB6bGliIGludGVyZmFjZSB0byBpbmZsYXRlIG1vZHVsZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApAQCAtOCwxMSArOCw3IEBACiAKIHN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KIAotLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotCi0gIC8qIG1vZGUgKi8KLSAgZW51bSB7Cit0eXBlZGVmIGVudW0gewogICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCiAgICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCiAgICAgICBESUNUNCwgICAgLyogZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCkBAIC0yNyw3ICsyMywxMyBAQAogICAgICAgQ0hFQ0sxLCAgIC8qIG9uZSBjaGVjayBieXRlIHRvIGdvICovCiAgICAgICBET05FLCAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgKi8KICAgICAgIEJBRH0gICAgICAvKiBnb3QgYW4gZXJyb3ItLXN0YXkgaGVyZSAqLwotICAgIG1vZGU7ICAgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi8KK2luZmxhdGVfbW9kZTsKKworLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgeworCisgIC8qIG1vZGUgKi8KKyAgaW5mbGF0ZV9tb2RlICBtb2RlOyAgIC8qIGN1cnJlbnQgaW5mbGF0ZSBtb2RlICovCiAKICAgLyogbW9kZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KICAgdW5pb24gewpAQCAtNDgsMzkgKzUwLDM1IEBACiB9OwogCiAKLWludCBpbmZsYXRlUmVzZXQoeikKK2ludCBFWFBPUlQgaW5mbGF0ZVJlc2V0KHopCiB6X3N0cmVhbXAgejsKIHsKLSAgdUxvbmcgYzsKLQogICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMKQogICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgei0+dG90YWxfaW4gPSB6LT50b3RhbF9vdXQgPSAwOwogICB6LT5tc2cgPSBaX05VTEw7CiAgIHotPnN0YXRlLT5tb2RlID0gei0+c3RhdGUtPm5vd3JhcCA/IEJMT0NLUyA6IE1FVEhPRDsKLSAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgJmMpOwotICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogcmVzZXRcbiIpKTsKKyAgaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgWl9OVUxMKTsKKyAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwogICByZXR1cm4gWl9PSzsKIH0KIAogCi1pbnQgaW5mbGF0ZUVuZCh6KQoraW50IEVYUE9SVCBpbmZsYXRlRW5kKHopCiB6X3N0cmVhbXAgejsKIHsKLSAgdUxvbmcgYzsKLQogICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnpmcmVlID09IFpfTlVMTCkKICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAgIGlmICh6LT5zdGF0ZS0+YmxvY2tzICE9IFpfTlVMTCkKLSAgICBpbmZsYXRlX2Jsb2Nrc19mcmVlKHotPnN0YXRlLT5ibG9ja3MsIHosICZjKTsKKyAgICBpbmZsYXRlX2Jsb2Nrc19mcmVlKHotPnN0YXRlLT5ibG9ja3MsIHopOwogICBaRlJFRSh6LCB6LT5zdGF0ZSk7CiAgIHotPnN0YXRlID0gWl9OVUxMOwotICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7CiAgIHJldHVybiBaX09LOwogfQogCiAKLWludCBpbmZsYXRlSW5pdDJfKHosIHcsIHZlcnNpb24sIHN0cmVhbV9zaXplKQoraW50IEVYUE9SVCBpbmZsYXRlSW5pdDJfKHosIHcsIHZlcnNpb24sIHN0cmVhbV9zaXplKQogel9zdHJlYW1wIHo7CiBpbnQgdzsKIGNvbnN0IGNoYXIgKnZlcnNpb247CkBAIC0xMjksNyArMTI3LDcgQEAKICAgICBpbmZsYXRlRW5kKHopOwogICAgIHJldHVybiBaX01FTV9FUlJPUjsKICAgfQotICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CisgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogYWxsb2NhdGVkXG4iKSk7CiAKICAgLyogcmVzZXQgc3RhdGUgKi8KICAgaW5mbGF0ZVJlc2V0KHopOwpAQCAtMTM3LDcgKzEzNSw3IEBACiB9CiAKIAotaW50IGluZmxhdGVJbml0Xyh6LCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSkKK2ludCBFWFBPUlQgaW5mbGF0ZUluaXRfKHosIHZlcnNpb24sIHN0cmVhbV9zaXplKQogel9zdHJlYW1wIHo7CiBjb25zdCBjaGFyICp2ZXJzaW9uOwogaW50IHN0cmVhbV9zaXplOwpAQCAtMTQ2LDEwICsxNDQsMTAgQEAKIH0KIAogCi0jZGVmaW5lIE5FRURCWVRFIHtpZih6LT5hdmFpbF9pbj09MClyZXR1cm4gcjtyPVpfT0s7fQorI2RlZmluZSBORUVEQllURSB7aWYoei0+YXZhaWxfaW49PTApcmV0dXJuIHI7IGlmIChmICE9IFpfRklOSVNIKSByID0gWl9PSzt9CiAjZGVmaW5lIE5FWFRCWVRFICh6LT5hdmFpbF9pbi0tLHotPnRvdGFsX2luKyssKnotPm5leHRfaW4rKykKIAotaW50IGluZmxhdGUoeiwgZikKK2ludCBFWFBPUlQgaW5mbGF0ZSh6LCBmKQogel9zdHJlYW1wIHo7CiBpbnQgZjsKIHsKQEAgLTE4OCw3ICsxODYsNyBAQAogICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIFRyYWNlKChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGhlYWRlciBva1xuIikpOworICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGhlYWRlciBva1xuIikpOwogICAgICAgaWYgKCEoYiAmIFBSRVNFVF9ESUNUKSkKICAgICAgIHsKICAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBCTE9DS1M7CkBAIC0yMjcsNyArMjI1LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpZiAociAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHJldHVybiByOworICAgICAgICByZXR1cm4gZiA9PSBaX0ZJTklTSCAmJiByID09IFpfT0sgPyBaX0JVRl9FUlJPUiA6IHI7CiAgICAgICByID0gWl9PSzsKICAgICAgIGluZmxhdGVfYmxvY2tzX3Jlc2V0KHotPnN0YXRlLT5ibG9ja3MsIHosICZ6LT5zdGF0ZS0+c3ViLmNoZWNrLndhcyk7CiAgICAgICBpZiAoei0+c3RhdGUtPm5vd3JhcCkKQEAgLTIzNiw2ICsyMzQsNyBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0s0OworICAgICAgaWYgKGYgPT0gWl9GSU5JU0gpIHIgPSBaX0JVRl9FUlJPUjsKICAgICBjYXNlIENIRUNLNDoKICAgICAgIE5FRURCWVRFCiAgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7CkBAIC0yNTksNyArMjU4LDcgQEAKICAgICAgICAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSA1OyAgICAgICAvKiBjYW4ndCB0cnkgaW5mbGF0ZVN5bmMgKi8KICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOworICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiB6bGliIGNoZWNrIG9rXG4iKSk7CiAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IERPTkU7CiAgICAgY2FzZSBET05FOgogICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORDsKQEAgLTI2OCwxMCArMjY3LDEzIEBACiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKICAgfQorI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCisgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgIC8qIFNvbWUgZHVtYiBjb21waWxlcnMgY29tcGxhaW4gd2l0aG91dCB0aGlzICovCisjZW5kaWYKIH0KIAogCi1pbnQgaW5mbGF0ZVNldERpY3Rpb25hcnkoeiwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKK2ludCBFWFBPUlQgaW5mbGF0ZVNldERpY3Rpb25hcnkoeiwgZGljdGlvbmFyeSwgZGljdExlbmd0aCkKIHpfc3RyZWFtcCB6OwogY29uc3QgQnl0ZWYgKmRpY3Rpb25hcnk7CiB1SW50ICBkaWN0TGVuZ3RoOwpAQCAtMjk1LDcgKzI5Nyw3IEBACiB9CiAKIAotaW50IGluZmxhdGVTeW5jKHopCitpbnQgRVhQT1JUIGluZmxhdGVTeW5jKHopCiB6X3N0cmVhbXAgejsKIHsKICAgdUludCBuOyAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gbG9vayBhdCAqLwpAQCAtMzQzLDMgKzM0NSwxOSBAQAogICB6LT5zdGF0ZS0+bW9kZSA9IEJMT0NLUzsKICAgcmV0dXJuIFpfT0s7CiB9CisKKworLyogUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQKKyAqIGJ5IFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCisgKiBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcyBaX1NZTkNfRkxVU0gKKyAqIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQgYmxvY2suIFdoZW4KKyAqIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwgaW5mbGF0ZSBpcworICogd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgorICovCitpbnQgRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQoeikKK3pfc3RyZWFtcCB6OworeworICBpZiAoeiA9PSBaX05VTEwgfHwgei0+c3RhdGUgPT0gWl9OVUxMIHx8IHotPnN0YXRlLT5ibG9ja3MgPT0gWl9OVUxMKQorICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgcmV0dXJuIGluZmxhdGVfYmxvY2tzX3N5bmNfcG9pbnQoei0+c3RhdGUtPmJsb2Nrcyk7Cit9CmRpZmYgLS1naXQgYS9pbmZ0cmVlcy5jIGIvaW5mdHJlZXMuYwppbmRleCAxNzBjODVlLi5iZGQzYTk4IDEwMDY0NAotLS0gYS9pbmZ0cmVlcy5jCisrKyBiL2luZnRyZWVzLmMKQEAgLTYsNyArNiw4IEBACiAjaW5jbHVkZSAienV0aWwuaCIKICNpbmNsdWRlICJpbmZ0cmVlcy5oIgogCi1jaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPSAiIGluZmxhdGUgMS4wLjUgQ29weXJpZ2h0IDE5OTUtMTk5OCBNYXJrIEFkbGVyICI7Citjb25zdCBjaGFyIGluZmxhdGVfY29weXJpZ2h0W10gPQorICAgIiBpbmZsYXRlIDEuMC43IENvcHlyaWdodCAxOTk1LTE5OTggTWFyayBBZGxlciAiOwogLyoKICAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQogICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90CmRpZmYgLS1naXQgYS9pbmZ0cmVlcy5oIGIvaW5mdHJlZXMuaAppbmRleCBiMDY2MTNkLi5lM2RiNzVhIDEwMDY0NAotLS0gYS9pbmZ0cmVlcy5oCisrKyBiL2luZnRyZWVzLmgKQEAgLTEsNSArMSw1IEBACiAvKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgTWFyayBBZGxlcgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCmRpZmYgLS1naXQgYS9pbmZ1dGlsLmMgYi9pbmZ1dGlsLmMKaW5kZXggZWIyMTE5OS4uODI0ZGFiNSAxMDA2NDQKLS0tIGEvaW5mdXRpbC5jCisrKyBiL2luZnV0aWwuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIGluZmxhdGVfdXRpbC5jIC0tIGRhdGEgYW5kIHJvdXRpbmVzIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBNYXJrIEFkbGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKZGlmZiAtLWdpdCBhL2luZnV0aWwuaCBiL2luZnV0aWwuaAppbmRleCA3MDJjZDI5Li4xMjEzMTZiIDEwMDY0NAotLS0gYS9pbmZ1dGlsLmgKKysrIGIvaW5mdXRpbC5oCkBAIC0xLDUgKzEsNSBAQAogLyogaW5mdXRpbC5oIC0tIHR5cGVzIGFuZCBtYWNyb3MgY29tbW9uIHRvIGJsb2NrcyBhbmQgY29kZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IE1hcmsgQWRsZXIKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKICAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAgKi8KIApkaWZmIC0tZ2l0IGEvbWluaWd6aXAuYyBiL21pbmlnemlwLmMKaW5kZXggZmNlZTZhMi4uZWU1MmFiNiAxMDA2NDQKLS0tIGEvbWluaWd6aXAuYworKysgYi9taW5pZ3ppcC5jCkBAIC0xLDUgKzEsNSBAQAogLyogbWluaWd6aXAuYyAtLSBzaW11bGF0ZSBnemlwIHVzaW5nIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBvciBpbiBwaXBlIG1vZGUuCiAgKi8KIAotLyogJElkOiBtaW5pZ3ppcC5jLHYgMS4xMCAxOTk2LzA3LzI0IDEzOjQxOjA0IG1lIEV4cCAkICovCisvKiBAKCMpICRJZCQgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiemxpYi5oIgpAQCAtNDcsMTggKzQ3LDE5IEBACiAjaWZuZGVmIEdaX1NVRkZJWAogIyAgZGVmaW5lIEdaX1NVRkZJWCAiLmd6IgogI2VuZGlmCi0jZGVmaW5lIFNVRkZJWF9MRU4gc2l6ZW9mKEdaX1NVRkZJWCkKKyNkZWZpbmUgU1VGRklYX0xFTiAoc2l6ZW9mKEdaX1NVRkZJWCktMSkKIAogZXh0ZXJuIGludCB1bmxpbmsgT0YoKGNvbnN0IGNoYXIgKikpOwogCiAjZGVmaW5lIEJVRkxFTiA0MDk2CiAjZGVmaW5lIE1BWF9OQU1FX0xFTiAxMDI0CiAKLSNkZWZpbmUgbG9jYWwgc3RhdGljCi0vKiBGb3IgTVNET1MgYW5kIG90aGVyIHN5c3RlbXMgd2l0aCBsaW1pdGF0aW9uIG9uIHN0YWNrIHNpemUuIEZvciBVbml4LAotICAgICNkZWZpbmUgbG9jYWwKLSAgIHdvcmtzIGFsc28uCi0gKi8KKyNpZmRlZiBNQVhTRUdfNjRLCisjICBkZWZpbmUgbG9jYWwgc3RhdGljCisgICAvKiBOZWVkZWQgZm9yIHN5c3RlbXMgd2l0aCBsaW1pdGF0aW9uIG9uIHN0YWNrIHNpemUuICovCisjZWxzZQorIyAgZGVmaW5lIGxvY2FsCisjZW5kaWYKIAogY2hhciAqcHJvZzsKIApAQCAtMjAxLDcgKzIwMiwxMSBAQAogCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXNhZ2U6ICBtaW5pZ3ppcCBbLWRdIFtmaWxlcy4uLl0KKyAqIFVzYWdlOiAgbWluaWd6aXAgWy1kXSBbLWZdIFstaF0gWy0xIHRvIC05XSBbZmlsZXMuLi5dCisgKiAgIC1kIDogZGVjb21wcmVzcworICogICAtZiA6IGNvbXByZXNzIHdpdGggWl9GSUxURVJFRAorICogICAtaCA6IGNvbXByZXNzIHdpdGggWl9IVUZGTUFOX09OTFkKKyAqICAgLTEgdG8gLTkgOiBjb21wcmVzc2lvbiBsZXZlbAogICovCiAKIGludCBtYWluKGFyZ2MsIGFyZ3YpCkBAIC0yMTAsMTUgKzIxNSwyNiBAQAogewogICAgIGludCB1bmNvbXByID0gMDsKICAgICBnekZpbGUgZmlsZTsKKyAgICBjaGFyIG91dG1vZGVbMjBdOworCisgICAgc3RyY3B5KG91dG1vZGUsICJ3YjYgIik7CiAKICAgICBwcm9nID0gYXJndlswXTsKICAgICBhcmdjLS0sIGFyZ3YrKzsKIAotICAgIGlmIChhcmdjID4gMCkgewotICAgICAgICB1bmNvbXByID0gKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCk7Ci0gICAgICAgIGlmICh1bmNvbXByKSB7Ci0gICAgICAgICAgICBhcmdjLS0sIGFyZ3YrKzsKLSAgICAgICAgfQorICAgIHdoaWxlIChhcmdjID4gMCkgeworICAgICAgaWYgKHN0cmNtcCgqYXJndiwgIi1kIikgPT0gMCkKKwl1bmNvbXByID0gMTsKKyAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1mIikgPT0gMCkKKwlvdXRtb2RlWzNdID0gJ2YnOworICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWgiKSA9PSAwKQorCW91dG1vZGVbM10gPSAnaCc7CisgICAgICBlbHNlIGlmICgoKmFyZ3YpWzBdID09ICctJyAmJiAoKmFyZ3YpWzFdID49ICcxJyAmJiAoKmFyZ3YpWzFdIDw9ICc5JyAmJgorCSAgICAgICAoKmFyZ3YpWzJdID09IDApCisJb3V0bW9kZVsyXSA9ICgqYXJndilbMV07CisgICAgICBlbHNlCisJYnJlYWs7CisgICAgICBhcmdjLS0sIGFyZ3YrKzsKICAgICB9CiAgICAgaWYgKGFyZ2MgPT0gMCkgewogICAgICAgICBTRVRfQklOQVJZX01PREUoc3RkaW4pOwpAQCAtMjI4LDcgKzI0NCw3IEBACiAgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKSBlcnJvcigiY2FuJ3QgZ3pkb3BlbiBzdGRpbiIpOwogICAgICAgICAgICAgZ3pfdW5jb21wcmVzcyhmaWxlLCBzdGRvdXQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZG91dCksICJ3YiIpOyAvKiAid2I5IiBmb3IgbWF4IGNvbXByLiAqLworICAgICAgICAgICAgZmlsZSA9IGd6ZG9wZW4oZmlsZW5vKHN0ZG91dCksIG91dG1vZGUpOwogICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgZXJyb3IoImNhbid0IGd6ZG9wZW4gc3Rkb3V0Iik7CiAgICAgICAgICAgICBnel9jb21wcmVzcyhzdGRpbiwgZmlsZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01ha2VmaWxlLmIzMiBiL21zZG9zL01ha2VmaWxlLmIzMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYjMyCnJlbmFtZSB0byBtc2Rvcy9NYWtlZmlsZS5iMzIKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmJvciBiL21zZG9zL01ha2VmaWxlLmJvcgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYm9yCnJlbmFtZSB0byBtc2Rvcy9NYWtlZmlsZS5ib3IKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmRqMiBiL21zZG9zL01ha2VmaWxlLmRqMgpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBNYWtlZmlsZS5kajIKcmVuYW1lIHRvIG1zZG9zL01ha2VmaWxlLmRqMgppbmRleCAzOThmMjhiLi4wYWI0MzFjIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5kajIKKysrIGIvbXNkb3MvTWFrZWZpbGUuZGoyCkBAIC0xLDUgKzEsNSBAQAogIyBNYWtlZmlsZSBmb3IgemxpYi4gIE1vZGlmaWVkIGZvciBkamdwcCB2Mi4wIGJ5IEYuIEouIERvbmFob2UsIDMvMTUvOTYuCi0jIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisjIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCiAjIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCiAKICMgVG8gY29tcGlsZSwgb3IgdG8gY29tcGlsZSBhbmQgdGVzdCwgdHlwZToKQEAgLTIyLDcgKzIyLDggQEAKICMgLSAtIC0gLSAtCiAjIEFsdGVybmF0ZWx5LCB0aGVzZSB2YXJpYWJsZXMgbWF5IGJlIGRlZmluZWQgYmVsb3csIG92ZXJyaWRpbmcgdGhlIHZhbHVlcwogIyBpbiBkamdwcC5lbnYsIGFzCi1JTkNMVURFX1BBVEg9YzpcdXNyXGluY2x1ZGUKKyMgSU5DTFVERV9QQVRIPWM6XHVzclxpbmNsdWRlCisjIExJQlJBUllfUEFUSD1jOlx1c3JcbGliCiAKIENDPWdjYwogCkBAIC0zMiwxMiArMzMsMTIgQEAKIENGTEFHUz0tTU1EIC1PMyAkKEJVVFQpIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVdjb252ZXJzaW9uIFwKICAgICAgICAgICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzCiAKLSMgSWYgY3AuZXhlIGlzIG5vdCBmb3VuZCwgcmVwbGFjZSB3aXRoIGNvcHkgL1kgLgotQ1A9Y3AgLWYKLSMgSWYgaW5zdGFsbC5leGUgaXMgbm90IGZvdW5kLCByZXBsYWNlIHdpdGggJChDUCkuCi1JTlNUQUxMPWluc3RhbGwKLSMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIG5vdCBmb3VuZCwgdW5jb21tZW50OgotIyBSTT1kZWwKKyMgSWYgY3AuZXhlIGlzIGF2YWlsYWJsZSwgcmVwbGFjZSAiY29weSAvWSIgd2l0aCAiY3AgLWZwIiAuCitDUD1jb3B5IC9ZCisjIElmIGdudSBpbnN0YWxsLmV4ZSBpcyBhdmFpbGFibGUsIHJlcGxhY2UgJChDUCkgd2l0aCBnaW5zdGFsbC4KK0lOU1RBTEw9JChDUCkKKyMgVGhlIGRlZmF1bHQgdmFsdWUgb2YgUk0gaXMgInJtIC1mLiIgIElmICJybS5leGUiIGlzIGZvdW5kLCBjb21tZW50IG91dDoKK1JNPWRlbAogTERMSUJTPS1MLiAtbHoKIExEPSQoQ0MpIC1zIC1vCiBMRFNIQVJFRD0kKENDKQpAQCAtNzcsMTUgKzc4LDIxIEBACiBpbnN0YWxsOiAkKElOQ0wpICQoTElCUykKIAktQGlmIG5vdCBleGlzdCAkKElOQ0xVREVfUEFUSClcbnVsIG1rZGlyICQoSU5DTFVERV9QQVRIKQogCS1AaWYgbm90IGV4aXN0ICQoTElCUkFSWV9QQVRIKVxudWwgbWtkaXIgJChMSUJSQVJZX1BBVEgpCi0JZm9yICUlZiBpbiAoJChJTkNMKSkgZG8gJChJTlNUQUxMKSAlJWYgJChJTkNMVURFX1BBVEgpCi0JZm9yICUlcCBpbiAoJChMSUJTKSkgZG8gJChJTlNUQUxMKSAlJXAgJChMSUJSQVJZX1BBVEgpCisJJChJTlNUQUxMKSB6bGliLmggJChJTkNMVURFX1BBVEgpCisJJChJTlNUQUxMKSB6Y29uZi5oICQoSU5DTFVERV9QQVRIKQorCSQoSU5TVEFMTCkgbGliei5hICQoTElCUkFSWV9QQVRIKQogCiB1bmluc3RhbGw6Ci0JZm9yICUlZiBpbiAoJChJTkNMKSkgZG8gJChSTSkgJChJTkNMVURFX1BBVEgpXCUlZgotCWZvciAlJXAgaW4gKCQoTElCUykpIGRvICQoUk0pICQoTElCUkFSWV9QQVRIKVwlJXAKKwkkKFJNKSAkKElOQ0xVREVfUEFUSClcemxpYi5oCisJJChSTSkgJChJTkNMVURFX1BBVEgpXHpjb25mLmgKKwkkKFJNKSAkKExJQlJBUllfUEFUSClcbGliei5hCiAKIGNsZWFuOgotCWZvciAlJXAgaW4gKCouZCAqLm8gKi5leGUgbGliei5hIGxpYnouc28qIGZvby5neikgZG8gJChSTSkgJSVwCisJJChSTSkgKi5kCisJJChSTSkgKi5vCisJJChSTSkgKi5leGUKKwkkKFJNKSBsaWJ6LmEKKwkkKFJNKSBmb28uZ3oKIAogREVQUyA6PSAkKHdpbGRjYXJkICouZCkKIGlmbmVxICgkKERFUFMpLCkKZGlmZiAtLWdpdCBhL01ha2VmaWxlLm1zYyBiL21zZG9zL01ha2VmaWxlLm1zYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBNYWtlZmlsZS5tc2MKcmVuYW1lIHRvIG1zZG9zL01ha2VmaWxlLm1zYwppbmRleCAxMTI2ODRhLi4xYTZkNjYzIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5tc2MKKysrIGIvbXNkb3MvTWFrZWZpbGUubXNjCkBAIC0xNSw3ICsxNSw3IEBACiAjLU94IGdlbmVyYXRlcyBiYWQgY29kZSB3aXRoIE1TQyA1LjEKIENDPWNsCiBMRD1saW5rCi1MREZMQUdTPS9lL3N0OjB4MTAwMC9ub2UKK0xERkxBR1M9L2Uvc3Q6MHgxNTAwL25vZQogTz0ub2JqCiAKICMgdmFyaWFibGVzCmRpZmYgLS1naXQgYS9NYWtlZmlsZS50YyBiL21zZG9zL01ha2VmaWxlLnRjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBNYWtlZmlsZS50YwpyZW5hbWUgdG8gbXNkb3MvTWFrZWZpbGUudGMKZGlmZiAtLWdpdCBhL01ha2VmaWxlLndhdCBiL21zZG9zL01ha2VmaWxlLndhdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUud2F0CnJlbmFtZSB0byBtc2Rvcy9NYWtlZmlsZS53YXQKZGlmZiAtLWdpdCBhL21zZG9zL3psaWIuZGVmIGIvbXNkb3MvemxpYi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2Y2NlNwotLS0gL2Rldi9udWxsCisrKyBiL21zZG9zL3psaWIuZGVmCkBAIC0wLDAgKzEsNTcgQEAKK0xJQlJBUlkJCSJ6bGliIgorCitERVNDUklQVElPTgknIiIiemxpYiBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkiIiInCisKK0VYRVRZUEUJCU5UCisKK1NVQlNZU1RFTQlXSU5ET1dTCisKK1NUVUIJCSdXSU5TVFVCLkVYRScKKworVkVSU0lPTgkJMS4wNworCitDT0RFCQkgRVhFQ1VURSBSRUFECisKK0RBVEEJCSBSRUFEIFdSSVRFCisKK0hFQVBTSVpFCTEwNDg1NzYsNDA5NgorCitFWFBPUlRTCisgICAgYWRsZXIzMiAgICAgICAgICAgICAgICAgICAgICAgIEAxCisgICAgY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICAgIEAyCisgICAgY3JjMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEAzCisgICAgZGVmbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIEA0CisgICAgZGVmbGF0ZUNvcHkgICAgICAgICAgICAgICAgICAgIEA1CisgICAgZGVmbGF0ZUVuZCAgICAgICAgICAgICAgICAgICAgIEA2CisgICAgZGVmbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgIEA3CisgICAgZGVmbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgIEA4CisgICAgZGVmbGF0ZVBhcmFtcyAgICAgICAgICAgICAgICAgIEA5CisgICAgZGVmbGF0ZVJlc2V0ICAgICAgICAgICAgICAgICAgIEAxMAorICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICAgICAgICAgICBAMTEKKyAgICBnemNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgQDEyCisgICAgZ3pkb3BlbiAgICAgICAgICAgICAgICAgICAgICAgIEAxMworICAgIGd6ZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICBAMTQKKyAgICBnemZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgQDE1CisgICAgZ3pvcGVuICAgICAgICAgICAgICAgICAgICAgICAgIEAxNgorICAgIGd6cmVhZCAgICAgICAgICAgICAgICAgICAgICAgICBAMTcKKyAgICBnendyaXRlICAgICAgICAgICAgICAgICAgICAgICAgQDE4CisgICAgaW5mbGF0ZSAgICAgICAgICAgICAgICAgICAgICAgIEAxOQorICAgIGluZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICBAMjAKKyAgICBpbmZsYXRlSW5pdDJfICAgICAgICAgICAgICAgICAgQDIxCisgICAgaW5mbGF0ZUluaXRfICAgICAgICAgICAgICAgICAgIEAyMgorICAgIGluZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICBAMjMKKyAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgQDI0CisgICAgaW5mbGF0ZVN5bmMgICAgICAgICAgICAgICAgICAgIEAyNQorICAgIHVuY29tcHJlc3MgICAgICAgICAgICAgICAgICAgICBAMjYKKyAgICB6bGliVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgQDI3CisgICAgZ3pwcmludGYgICAgICAgICAgICAgICAgICAgICAgIEAyOAorICAgIGd6cHV0YyAgICAgICAgICAgICAgICAgICAgICAgICBAMjkKKyAgICBnemdldGMgICAgICAgICAgICAgICAgICAgICAgICAgQDMwCisgICAgZ3pzZWVrICAgICAgICAgICAgICAgICAgICAgICAgIEAzMQorICAgIGd6cmV3aW5kICAgICAgICAgICAgICAgICAgICAgICBAMzIKKyAgICBnenRlbGwgICAgICAgICAgICAgICAgICAgICAgICAgQDMzCisgICAgZ3plb2YgICAgICAgICAgICAgICAgICAgICAgICAgIEAzNAorICAgIGd6c2V0cGFyYW1zICAgICAgICAgICAgICAgICAgICBAMzUKKyAgICB6RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgQDM2CisgICAgaW5mbGF0ZVN5bmNQb2ludCAgICAgICAgICAgICAgIEAzNworICAgIGdldF9jcmNfdGFibGUgICAgICAgICAgICAgICAgICBAMzgKZGlmZiAtLWdpdCBhL3psaWIucmMgYi9tc2Rvcy96bGliLnJjCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHpsaWIucmMKcmVuYW1lIHRvIG1zZG9zL3psaWIucmMKaW5kZXggNGM2N2FmZi4uYTVhOWZjYiAxMDA2NDQKLS0tIGEvemxpYi5yYworKysgYi9tc2Rvcy96bGliLnJjCkBAIC0yLDggKzIsOCBAQAogCiAjZGVmaW5lIElEUl9WRVJTSU9OMSAgMQogSURSX1ZFUlNJT04xCVZFUlNJT05JTkZPCU1PVkVBQkxFIElNUFVSRSBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0gIEZJTEVWRVJTSU9OCSAxLDAsNSwwCi0gIFBST0RVQ1RWRVJTSU9OIDEsMCw1LDAKKyAgRklMRVZFUlNJT04JIDEsMCw3LDAKKyAgUFJPRFVDVFZFUlNJT04gMSwwLDcsMAogICBGSUxFRkxBR1NNQVNLCVZTX0ZGSV9GSUxFRkxBR1NNQVNLCiAgIEZJTEVGTEFHUwkwCiAgIEZJTEVPUwlWT1NfRE9TX1dJTkRPV1MzMgpAQCAtMTcsMTIgKzE3LDEyIEBACiAKICAgICBCRUdJTgogICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJ6bGliIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeVwwIgotICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwJIjEuMC41XDAiCisgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLAkiMS4wLjdcMCIKICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLAkiemxpYlwwIgogICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLAkiemxpYi5saWJcMCIKICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsCSJaTGliLkRMTFwwIgotICAgICAgVkFMVUUgIkNvbW1lbnRzIiwJIkRMTCBzdXBwb3J0IGJ5IEFsZXNzYW5kcm8gSWFjb3BldHRpXDAiCi0gICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5ICYgTWFyayBBZGxlclwwIgorICAgICAgVkFMVUUgIkNvbW1lbnRzIiwiRExMIHN1cHBvcnQgYnkgQWxlc3NhbmRybyBJYWNvcGV0dGkgJiBHaWxsZXMgVm9sbGFudFwwIgorICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIihDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseSAmIE1hcmsgQWRsZXJcMCIKICAgICBFTkQKICAgRU5ECiAgIEJMT0NLICJWYXJGaWxlSW5mbyIKZGlmZiAtLWdpdCBhL250L01ha2VmaWxlLm50IGIvbnQvTWFrZWZpbGUubnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MGYyYQotLS0gL2Rldi9udWxsCisrKyBiL250L01ha2VmaWxlLm50CkBAIC0wLDAgKzEsODggQEAKKyMgTWFrZWZpbGUgZm9yIHpsaWIKKworIWluY2x1ZGUgPG50d2luMzIubWFrPgorCitDQz1jbAorTEQ9bGluaworQ0ZMQUdTPS1PIC1ub2xvZ28KK0xERkxBR1M9CitPPS5vYmoKKworIyB2YXJpYWJsZXMKK09CSjEgPSBhZGxlcjMyJChPKSBjb21wcmVzcyQoTykgY3JjMzIkKE8pIGd6aW8kKE8pIHVuY29tcHIkKE8pIGRlZmxhdGUkKE8pIFwKKyAgdHJlZXMkKE8pCitPQkoyID0genV0aWwkKE8pIGluZmxhdGUkKE8pIGluZmJsb2NrJChPKSBpbmZ0cmVlcyQoTykgaW5mY29kZXMkKE8pIFwKKyAgaW5mdXRpbCQoTykgaW5mZmFzdCQoTykKKworYWxsOiAgemxpYi5kbGwgZXhhbXBsZS5leGUgbWluaWd6aXAuZXhlCisKK2FkbGVyMzIub2JqOiBhZGxlcjMyLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2NvbXByZXNzLm9iajogY29tcHJlc3MuYyB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2NyYzMyLm9iajogY3JjMzIuYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworZGVmbGF0ZS5vYmo6IGRlZmxhdGUuYyBkZWZsYXRlLmggenV0aWwuaCB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2d6aW8ub2JqOiBnemlvLmMgenV0aWwuaCB6bGliLmggemNvbmYuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2luZmJsb2NrLm9iajogaW5mYmxvY2suYyB6dXRpbC5oIHpsaWIuaCB6Y29uZi5oIGluZmJsb2NrLmggaW5mdHJlZXMuaFwKKyAgIGluZmNvZGVzLmggaW5mdXRpbC5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworaW5mY29kZXMub2JqOiBpbmZjb2Rlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmhcCisgICBpbmZjb2Rlcy5oIGluZmZhc3QuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2luZmxhdGUub2JqOiBpbmZsYXRlLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZibG9jay5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworaW5mdHJlZXMub2JqOiBpbmZ0cmVlcy5jIHp1dGlsLmggemxpYi5oIHpjb25mLmggaW5mdHJlZXMuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2luZnV0aWwub2JqOiBpbmZ1dGlsLmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAorCSQoQ0MpIC1jICQoY3ZhcnNkbGwpICQoQ0ZMQUdTKSAkKi5jCisKK2luZmZhc3Qub2JqOiBpbmZmYXN0LmMgenV0aWwuaCB6bGliLmggemNvbmYuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaCBpbmZmYXN0LmgKKwkkKENDKSAtYyAkKGN2YXJzZGxsKSAkKENGTEFHUykgJCouYworCit0cmVlcy5vYmo6IHRyZWVzLmMgZGVmbGF0ZS5oIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKwkkKENDKSAtYyAkKGN2YXJzZGxsKSAkKENGTEFHUykgJCouYworCit1bmNvbXByLm9iajogdW5jb21wci5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworenV0aWwub2JqOiB6dXRpbC5jIHp1dGlsLmggemxpYi5oIHpjb25mLmgKKwkkKENDKSAtYyAkKGN2YXJzZGxsKSAkKENGTEFHUykgJCouYworCitleGFtcGxlLm9iajogZXhhbXBsZS5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworbWluaWd6aXAub2JqOiBtaW5pZ3ppcC5jIHpsaWIuaCB6Y29uZi5oCisJJChDQykgLWMgJChjdmFyc2RsbCkgJChDRkxBR1MpICQqLmMKKworemxpYi5kbGw6ICQoT0JKMSkgJChPQkoyKSB6bGliLmRudAorCWxpbmsgJChkbGxsZmxhZ3MpIC1vdXQ6JEAgLWRlZjp6bGliLmRudCAkKE9CSjEpICQoT0JKMikgJChndWlsaWJzZGxsKQorCit6bGliLmxpYjogemxpYi5kbGwKKworZXhhbXBsZS5leGU6IGV4YW1wbGUub2JqIHpsaWIubGliCisJJChMRCkgJChMREZMQUdTKSBleGFtcGxlLm9iaiB6bGliLmxpYgorCittaW5pZ3ppcC5leGU6IG1pbmlnemlwLm9iaiB6bGliLmxpYgorCSQoTEQpICQoTERGTEFHUykgbWluaWd6aXAub2JqIHpsaWIubGliCisKK3Rlc3Q6IGV4YW1wbGUuZXhlIG1pbmlnemlwLmV4ZQorCWV4YW1wbGUKKwllY2hvIGhlbGxvIHdvcmxkIHwgbWluaWd6aXAgfCBtaW5pZ3ppcCAtZCAKKworY2xlYW46CisJZGVsICoub2JqCisJZGVsICouZXhlCisJZGVsICouZGxsCisJZGVsICoubGliCmRpZmYgLS1naXQgYS9udC96bGliLmRudCBiL250L3psaWIuZG50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Yzk5MGMKLS0tIC9kZXYvbnVsbAorKysgYi9udC96bGliLmRudApAQCAtMCwwICsxLDQ0IEBACitMSUJSQVJZCQl6bGliLmRsbAorRVhFVFlQRSBXSU5ET1dTCitDT0RFCQkgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQorREFUQQkJIFBSRUxPQUQgTU9WRUFCTEUgTVVMVElQTEUKKworRVhQT1JUUworICAgIGFkbGVyMzIgICAgICAgICAgICAgICAgICAgICAgICBAMQorICAgIGNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgICBAMgorICAgIGNyYzMyICAgICAgICAgICAgICAgICAgICAgICAgICBAMworICAgIGRlZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICBANAorICAgIGRlZmxhdGVDb3B5ICAgICAgICAgICAgICAgICAgICBANQorICAgIGRlZmxhdGVFbmQgICAgICAgICAgICAgICAgICAgICBANgorICAgIGRlZmxhdGVJbml0Ml8gICAgICAgICAgICAgICAgICBANworICAgIGRlZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICBAOAorICAgIGRlZmxhdGVQYXJhbXMgICAgICAgICAgICAgICAgICBAOQorICAgIGRlZmxhdGVSZXNldCAgICAgICAgICAgICAgICAgICBAMTAKKyAgICBkZWZsYXRlU2V0RGljdGlvbmFyeSAgICAgICAgICAgQDExCisgICAgZ3pjbG9zZSAgICAgICAgICAgICAgICAgICAgICAgIEAxMgorICAgIGd6ZG9wZW4gICAgICAgICAgICAgICAgICAgICAgICBAMTMKKyAgICBnemVycm9yICAgICAgICAgICAgICAgICAgICAgICAgQDE0CisgICAgZ3pmbHVzaCAgICAgICAgICAgICAgICAgICAgICAgIEAxNQorICAgIGd6b3BlbiAgICAgICAgICAgICAgICAgICAgICAgICBAMTYKKyAgICBnenJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgQDE3CisgICAgZ3p3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgIEAxOAorICAgIGluZmxhdGUgICAgICAgICAgICAgICAgICAgICAgICBAMTkKKyAgICBpbmZsYXRlRW5kICAgICAgICAgICAgICAgICAgICAgQDIwCisgICAgaW5mbGF0ZUluaXQyXyAgICAgICAgICAgICAgICAgIEAyMQorICAgIGluZmxhdGVJbml0XyAgICAgICAgICAgICAgICAgICBAMjIKKyAgICBpbmZsYXRlUmVzZXQgICAgICAgICAgICAgICAgICAgQDIzCisgICAgaW5mbGF0ZVNldERpY3Rpb25hcnkgICAgICAgICAgIEAyNAorICAgIGluZmxhdGVTeW5jICAgICAgICAgICAgICAgICAgICBAMjUKKyAgICB1bmNvbXByZXNzICAgICAgICAgICAgICAgICAgICAgQDI2CisgICAgemxpYlZlcnNpb24gICAgICAgICAgICAgICAgICAgIEAyNworICAgIGd6cHJpbnRmICAgICAgICAgICAgICAgICAgICAgICBAMjgKKyAgICBnenB1dGMgICAgICAgICAgICAgICAgICAgICAgICAgQDI5CisgICAgZ3pnZXRjICAgICAgICAgICAgICAgICAgICAgICAgIEAzMAorICAgIGd6c2VlayAgICAgICAgICAgICAgICAgICAgICAgICBAMzEKKyAgICBnenJld2luZCAgICAgICAgICAgICAgICAgICAgICAgQDMyCisgICAgZ3p0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgIEAzMworICAgIGd6ZW9mICAgICAgICAgICAgICAgICAgICAgICAgICBAMzQKKyAgICBnenNldHBhcmFtcyAgICAgICAgICAgICAgICAgICAgQDM1CisgICAgekVycm9yICAgICAgICAgICAgICAgICAgICAgICAgIEAzNgorICAgIGluZmxhdGVTeW5jUG9pbnQgICAgICAgICAgICAgICBAMzcKKyAgICBnZXRfY3JjX3RhYmxlICAgICAgICAgICAgICAgICAgQDM4CmRpZmYgLS1naXQgYS90cmVlcy5jIGIvdHJlZXMuYwppbmRleCA0YzRkNmYyLi5mZTg2Yzc3IDEwMDY0NAotLS0gYS90cmVlcy5jCisrKyBiL3RyZWVzLmMKQEAgLTEsNSArMSw1IEBACiAvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NiBKZWFuLWxvdXAgR2FpbGx5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5CiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKQEAgLTI5LDcgKzI5LDcgQEAKICAqICAgICAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTgzLiBJU0JOIDAtMjAxLTA2NjcyLTYuCiAgKi8KIAotLyogJElkOiB0cmVlcy5jLHYgMS4xMSAxOTk2LzA3LzI0IDEzOjQxOjA2IG1lIEV4cCAkICovCisvKiBAKCMpICRJZCQgKi8KIAogI2luY2x1ZGUgImRlZmxhdGUuaCIKIApAQCAtNTYsMTYgKzU2LDE2IEBACiAjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAogLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KIAotbG9jYWwgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLworbG9jYWwgY29uc3QgaW50IGV4dHJhX2xiaXRzW0xFTkdUSF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBsZW5ndGggY29kZSAqLwogICAgPSB7MCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMiwyLDIsMiwzLDMsMywzLDQsNCw0LDQsNSw1LDUsNSwwfTsKIAotbG9jYWwgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworbG9jYWwgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLwogICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CiAKLWxvY2FsIGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KK2xvY2FsIGNvbnN0IGludCBleHRyYV9ibGJpdHNbQkxfQ09ERVNdLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi8KICAgID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDd9OwogCi1sb2NhbCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCitsb2NhbCBjb25zdCB1Y2ggYmxfb3JkZXJbQkxfQ09ERVNdCiAgICA9IHsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1fTsKIC8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmcKICAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLgpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgewogICAgIGN0X2RhdGEgKnN0YXRpY190cmVlOyAgICAgICAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqLwotICAgIGludGYgICAgKmV4dHJhX2JpdHM7ICAgICAgICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnRmICpleHRyYV9iaXRzOyAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCiAgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCiAgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCiAgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCkBAIC0xNTQsNyArMTU0LDcgQEAKIAogI2Vsc2UgLyogREVCVUcgKi8KICMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgXAotICAgICB7IGlmICh2ZXJib3NlPjIpIGZwcmludGYoc3RkZXJyLCJcbmNkICUzZCAiLChjKSk7IFwKKyAgICAgeyBpZiAoel92ZXJib3NlPjIpIGZwcmludGYoc3RkZXJyLCJcbmNkICUzZCAiLChjKSk7IFwKICAgICAgICBzZW5kX2JpdHMocywgdHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbik7IH0KICNlbmRpZgogCkBAIC00MTYsNyArNDE2LDcgQEAKICAgICBjdF9kYXRhICp0cmVlICA9IGRlc2MtPmR5bl90cmVlOwogICAgIGludCBtYXhfY29kZSAgID0gZGVzYy0+bWF4X2NvZGU7CiAgICAgY3RfZGF0YSAqc3RyZWUgPSBkZXNjLT5zdGF0X2Rlc2MtPnN0YXRpY190cmVlOwotICAgIGludGYgKmV4dHJhICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iaXRzOworICAgIGNvbnN0IGludGYgKmV4dHJhID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iaXRzOwogICAgIGludCBiYXNlICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5leHRyYV9iYXNlOwogICAgIGludCBtYXhfbGVuZ3RoID0gZGVzYy0+c3RhdF9kZXNjLT5tYXhfbGVuZ3RoOwogICAgIGludCBoOyAgICAgICAgICAgICAgLyogaGVhcCBpbmRleCAqLwpkaWZmIC0tZ2l0IGEvdW5jb21wci5jIGIvdW5jb21wci5jCmluZGV4IGMzZGU5NjkuLjJkYjQ3YzQgMTAwNjQ0Ci0tLSBhL3VuY29tcHIuYworKysgYi91bmNvbXByLmMKQEAgLTEsOSArMSw5IEBACiAvKiB1bmNvbXByLmMgLS0gZGVjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCi0vKiAkSWQ6IHVuY29tcHIuYyx2IDEuOCAxOTk2LzAxLzMwIDIxOjU5OjI2IG1lIEV4cCAkICovCisvKiBAKCMpICRJZCQgKi8KIAogI2luY2x1ZGUgInpsaWIuaCIKIApAQCAtMjIsNyArMjIsNyBAQAogICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0CiAgICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgogKi8KLWludCB1bmNvbXByZXNzIChkZXN0LCBkZXN0TGVuLCBzb3VyY2UsIHNvdXJjZUxlbikKK2ludCBFWFBPUlQgdW5jb21wcmVzcyAoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4pCiAgICAgQnl0ZWYgKmRlc3Q7CiAgICAgdUxvbmdmICpkZXN0TGVuOwogICAgIGNvbnN0IEJ5dGVmICpzb3VyY2U7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgZXJyID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CiAgICAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpIHsKICAgICAgICAgaW5mbGF0ZUVuZCgmc3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIGVyciA9PSBaX09LID8gWl9CVUZfRVJST1IgOiBlcnI7CiAgICAgfQogICAgICpkZXN0TGVuID0gc3RyZWFtLnRvdGFsX291dDsKIApkaWZmIC0tZ2l0IGEvemNvbmYuaCBiL3pjb25mLmgKaW5kZXggNWY2ZTg4Ny4uZDk1ZWRiNiAxMDA2NDQKLS0tIGEvemNvbmYuaAorKysgYi96Y29uZi5oCkBAIC0xLDkgKzEsOSBAQAogLyogemNvbmYuaCAtLSBjb25maWd1cmF0aW9uIG9mIHRoZSB6bGliIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKICAqLwogCi0vKiAkSWQ6IHpjb25mLmgsdiAxLjIwIDE5OTYvMDcvMDIgMTU6MDk6MjggbWUgRXhwICQgKi8KKy8qIEAoIykgJElkJCAqLwogCiAjaWZuZGVmIF9aQ09ORl9ICiAjZGVmaW5lIF9aQ09ORl9ICkBAIC0yNyw2ICsyNyw3IEBACiAjICBkZWZpbmUgaW5mbGF0ZUluaXQyXwl6X2luZmxhdGVJbml0Ml8KICMgIGRlZmluZSBpbmZsYXRlU2V0RGljdGlvbmFyeSB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CiAjICBkZWZpbmUgaW5mbGF0ZVN5bmMJel9pbmZsYXRlU3luYworIyAgZGVmaW5lIGluZmxhdGVTeW5jUG9pbnQgel9pbmZsYXRlU3luY1BvaW50CiAjICBkZWZpbmUgaW5mbGF0ZVJlc2V0CXpfaW5mbGF0ZVJlc2V0CiAjICBkZWZpbmUgY29tcHJlc3MJel9jb21wcmVzcwogIyAgZGVmaW5lIHVuY29tcHJlc3MJel91bmNvbXByZXNzCkBAIC03Miw4ICs3MywxMCBAQAogI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkgICYmICFkZWZpbmVkKFNUREMpCiAjICBkZWZpbmUgU1REQwogI2VuZGlmCi0jaWYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKSAmJiAhZGVmaW5lZChTVERDKQotIyAgZGVmaW5lIFNUREMKKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKF9fT1MyX18pCisjICBpZm5kZWYgU1REQworIyAgICBkZWZpbmUgU1REQworIyAgZW5kaWYKICNlbmRpZgogCiAjaWZuZGVmIFNUREMKQEAgLTg3LDYgKzkwLDEyIEBACiAjICBkZWZpbmUgTk9fRFVNTVlfREVDTAogI2VuZGlmCiAKKy8qIEJvcmxhbmQgQyBpbmNvcnJlY3RseSBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyByZXR1cm5zOiAqLworI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgZGVmaW5lIE5FRURfRFVNTVlfUkVUVVJOCisjZW5kaWYKKworCiAvKiBNYXhpbXVtIHZhbHVlIGZvciBtZW1MZXZlbCBpbiBkZWZsYXRlSW5pdDIgKi8KICNpZm5kZWYgTUFYX01FTV9MRVZFTAogIyAgaWZkZWYgTUFYU0VHXzY0SwpAQCAtOTYsMTMgKzEwNSwxNyBAQAogIyAgZW5kaWYKICNlbmRpZgogCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyICovCisvKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgorICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcworICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5CisgKiBnemlwLikKKyAqLwogI2lmbmRlZiBNQVhfV0JJVFMKICMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KICNlbmRpZgogCiAvKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgIDEgPDwgKHdpbmRvd0JpdHMrMikgICArICAxIDw8IChtZW1MZXZlbCs5KQorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKICB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKICBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQogIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aApAQCAtMTcyLDEzICsxODUsNjMgQEAKICAgIHR5cGVkZWYgQnl0ZSAgICAgKnZvaWRwOwogI2VuZGlmCiAKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjICBpbmNsdWRlIDx1bmlzdGQuaD4gLyogZm9yIFNFRUtfKiBhbmQgb2ZmX3QgKi8KKyMgIGRlZmluZSB6X29mZl90ICBvZmZfdAorI2VuZGlmCisjaWZuZGVmIFNFRUtfU0VUCisjICBkZWZpbmUgU0VFS19TRVQgICAgICAgIDAgICAgICAgLyogU2VlayBmcm9tIGJlZ2lubmluZyBvZiBmaWxlLiAgKi8KKyMgIGRlZmluZSBTRUVLX0NVUiAgICAgICAgMSAgICAgICAvKiBTZWVrIGZyb20gY3VycmVudCBwb3NpdGlvbi4gICovCisjZW5kaWYKKyNpZm5kZWYgel9vZmZfdAorIyAgZGVmaW5lICB6X29mZl90IGxvbmcKKyNlbmRpZgogCiAvKiBDb21waWxlIHdpdGggLURaTElCX0RMTCBmb3IgV2luZG93cyBETEwgc3VwcG9ydCAqLwogI2lmIChkZWZpbmVkKF9XSU5ET1dTKSB8fCBkZWZpbmVkKFdJTkRPV1MpKSAmJiBkZWZpbmVkKFpMSUJfRExMKQorIyAgdW5kZWYgRkFSCiAjICBpbmNsdWRlIDx3aW5kb3dzLmg+CiAjICBkZWZpbmUgRVhQT1JUICBXSU5BUEkKKyMgIGlmZGVmIFdJTjMyCisjICAgIGRlZmluZSBFWFBPUlRWQSAgV0lOQVBJVgorIyAgZWxzZQorIyAgICBkZWZpbmUgRVhQT1JUVkEgIEZBUiBfY2RlY2wgX2V4cG9ydAorIyAgZW5kaWYKICNlbHNlCi0jICBkZWZpbmUgRVhQT1JUCisjICAgaWYgZGVmaW5lZCAoX19CT1JMQU5EQ19fKSAmJiBkZWZpbmVkIChfV2luZG93cykgJiYgZGVmaW5lZCAoX19ETExfXykKKyMgICAgICAgZGVmaW5lIEVYUE9SVCBfZXhwb3J0CisjICAgICAgIGRlZmluZSBFWFBPUlRWQSBfZXhwb3J0CisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgRVhQT1JUCisjICAgICAgIGRlZmluZSBFWFBPUlRWQQorIyAgIGVuZGlmCisjZW5kaWYKKworLyogTVZTIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IGV4dGVybmFsIG5hbWVzIGxhcmdlciB0aGFuIDggYnl0ZXMgKi8KKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICAgcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXQyXywiREVJTjIiKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUVuZCwiREVFTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3MsIklOQkwiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfbmV3LCJJTkJMTkUiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9ibG9ja3NfZnJlZSwiSU5CTEZSIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfYmxvY2tzX3Jlc2V0LCJJTkJMUkUiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb2Rlc19mcmVlLCJJTkNPRlIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb2RlcywiSU5DTyIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2Zhc3QsIklORkEiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9mbHVzaCwiSU5GTFUiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9tYXNrLCJJTk1BIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfc2V0X2RpY3Rpb25hcnksIklOU0VESTIiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV9jb3B5cmlnaHQsIklOQ09QWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2JpdHMsIklOVFJCSSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2R5bmFtaWMsIklOVFJEWSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX3RyZWVzX2ZpeGVkLCJJTlRSRkkiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90cmVlc19mcmVlLCJJTlRSRlIiKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfWkNPTkZfSCAqLwpkaWZmIC0tZ2l0IGEvemxpYi4zIGIvemxpYi4zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGVjZDcKLS0tIC9kZXYvbnVsbAorKysgYi96bGliLjMKQEAgLTAsMCArMSwxMDcgQEAKKy5USCBaTElCIDMgIjIwIEphbnVhcnkgMTk5OCIKKy5TSCBOQU1FCit6bGliIFwtIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gbGlicmFyeQorLlNIIFNZTk9QU0lTCitbc2VlCisuSSB6bGliLmgKK2ZvciBmdWxsIGRlc2NyaXB0b25dCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkkgemxpYgorbGlicmFyeSBpcyBhIGdlbmVyYWwgcHVycG9zZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCitUaGUgY29kZSBpcyByZWVudHJhbnQgKHRocmVhZCBzYWZlKS4KK0l0IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsCitpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEuCitUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kIChkZWZsYXRpb24pCitidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtIGludGVyZmFjZS4KKy5MUAorQ29tcHJlc3Npb24gY2FuIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcCBpZiB0aGUgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoCisoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwKK29yIGNhbiBiZSBkb25lIGJ5IHJlcGVhdGVkIGNhbGxzIG9mIHRoZSBjb21wcmVzc2lvbiBmdW5jdGlvbi4KK0luIHRoZSBsYXR0ZXIgY2FzZSwKK3RoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtZSB0aGUgb3V0cHV0CisocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorLkxQCitUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4KKy5JIGd6aXAKKyguZ3opIGZvcm1hdAord2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgorLkxQCitUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gVGhlIGRlY29kZXIgY2hlY2tzCit0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyCitjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorLkxQCitBbGwgZnVuY3Rpb25zIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFyZSBkb2N1bWVudGVkIGluIHRoZSBmaWxlCisuSVIgemxpYi5oLgorVGhlIGRpc3RyaWJ1dGlvbiBzb3VyY2UgaW5jbHVkZXMgZXhhbXBsZXMgb2YgdXNlIG9mIHRoZSBsaWJyYXJ5Cit0aGUgZmlsZXMKKy5JIGV4YW1wbGUuYworYW5kCisuSVIgbWluaWd6aXAuYyAuCisuTFAKK0EgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZgorLklSIHpsaWIKK2lzIGF2YWlsYWJsZSBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQgMS4xCisuSVAKK2h0dHA6Ly93d3cuamF2YXNvZnQuY29tL3Byb2R1Y3RzL0pESy8xLjEvZG9jcy9hcGkvUGFja2FnZS1qYXZhLnV0aWwuemlwLmh0bWwKKy5MUAorQSBQZXJsIGludGVyZmFjZSB0bworLklSIHpsaWIgLAord3JpdHRlbiBieSBQYXVsIE1hcnF1ZXNzIChwbWFycXVlc3NAYmZzZWMuYnQuY28udWspCitpcyBhdmFpbGFibGUgYXQgQ1BBTiAoQ29tcHJlaGVuc2l2ZSBQZXJsIEFyY2hpdmUgTmV0d29yaykgc2l0ZXMsCitzdWNoIGFzOgorLklQCitmdHA6Ly9mdHAuY2lzLnVmbC5lZHUvcHViL3BlcmwvQ1BBTi9tb2R1bGVzL2J5LW1vZHVsZS9Db21wcmVzcy9Db21wcmVzcy1abGliKgorLkxQCitBIFB5dGhvbiBpbnRlcmZhY2UgdG8KKy5JUiB6bGliCit3cml0dGVuIGJ5IEEuTS4gS3VjaGxpbmcgPGFta0BtYWduZXQuY29tPgoraXMgYXZhaWxhYmxlIGZyb20gdGhlIFB5dGhvbiBTb2Z0d2FyZSBBc3NvY2lhdGlvbiBzaXRlcywgc3VjaCBhczoKKy5JUAorZnRwOi8vZnRwLnB5dGhvbi5vcmcvcHViL3B5dGhvbi9jb250cmliL0VuY29kaW5nL3psaWIqLnRhci5negorLlNIICJTRUUgQUxTTyIKK1F1ZXN0aW9ucyBhYm91dCB6bGliIHNob3VsZCBiZSBzZW50IHRvOgorLklQCit6bGliQHF1ZXN0LmpwbC5uYXNhLmdvdgorb3IsIGlmIHRoaXMgZmFpbHMsIHRvIHRoZSBhdXRob3IgYWRkcmVzc2VzIGdpdmVuIGJlbG93LgorVGhlIHpsaWIgaG9tZSBwYWdlIGlzOgorLklQCitodHRwOi8vd3d3LmNkcm9tLmNvbS9pbmZvemlwL3psaWIvCisuTFAKK1RoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQworKFJlcXVlc3QgZm9yIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzOiAKKy5JUAorZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTUwLnR4dCAoemxpYiBmb3JtYXQpCisuYnIKK3JmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkKKy5icgorcmZjMTk1Mi50eHQgKGd6aXAgZm9ybWF0KQorLkxQCitUaGVzZSBkb2N1bWVudHMgYXJlIGFsc28gYXZhaWxhYmxlIGluIG90aGVyIGZvcm1hdHMgZnJvbToKKy5JUAorZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9wbmcvZG9jdW1lbnRzL3psaWIvemRvYy1pbmRleC5odG1sCisuU0ggQVVUSE9SUworVmVyc2lvbiAxLjAuNy4KK0NvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkgKGpsb3VwQGd6aXAub3JnKQorYW5kIE1hcmsgQWRsZXIgKG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUpLgorLkxQCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcy1pcywiCit3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KK1NlZSB0aGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB3aXRoIHJlc3BlY3QgdG8gcmVxdWlyZW1lbnRzCitnb3Zlcm5pbmcgcmVkaXN0cmlidXRpb24uCitUaGUgZGVmbGF0ZSBmb3JtYXQgdXNlZCBieQorLkkgemxpYgord2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LgorVGhlIGRlZmxhdGUgYW5kCisuSSB6bGliCitzcGVjaWZpY2F0aW9ucyB3ZXJlIHdyaXR0ZW4gYnkgUGV0ZXIgRGV1dHNjaC4KK1RoYW5rcyB0byBhbGwgdGhlIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzCitpbXByb3ZlbWVudHMgaW4KKy5JUiB6bGliIDsKK3dobyBhcmUgdG9vIG51bWVyb3VzIHRvIGNpdGUgaGVyZS4KKy5MUAorVU5JWCBtYW51YWwgcGFnZSBieSBSLiBQLiBDLiBSb2RnZXJzLAorVS5TLiBOYXRpb25hbCBMaWJyYXJ5IG9mIE1lZGljaW5lIChyb2RnZXJzQG5sbS5uaWguZ292KS4KKy5cIiBlbmQgb2YgbWFuIHBhZ2UKZGlmZiAtLWdpdCBhL3psaWIuZGVmIGIvemxpYi5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzY1Y2YuLjAwMDAwMDAKLS0tIGEvemxpYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1MSUJSQVJZCQkiemxpYiIKLQotREVTQ1JJUFRJT04JJyIiInpsaWIgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5IiIiJwotCi1FWEVUWVBFCQlOVAotCi1TVUJTWVNURU0JV0lORE9XUwotCi1TVFVCCQknV0lOU1RVQi5FWEUnCi0KLVZFUlNJT04JCTEuMDUKLQotQ09ERQkJIEVYRUNVVEUgUkVBRAotCi1EQVRBCQkgUkVBRCBXUklURQotCi1IRUFQU0laRQkxMDQ4NTc2LDQwOTYKLQotRVhQT1JUUwotCQl6bGliVmVyc2lvbgotCQlkZWZsYXRlCi0JCWRlZmxhdGVFbmQKLQkJaW5mbGF0ZQotCQlpbmZsYXRlRW5kCi0JCWRlZmxhdGVTZXREaWN0aW9uYXJ5Ci0JCWRlZmxhdGVDb3B5Ci0JCWRlZmxhdGVSZXNldAotCQlkZWZsYXRlUGFyYW1zCi0JCWluZmxhdGVTZXREaWN0aW9uYXJ5Ci0JCWluZmxhdGVTeW5jCi0JCWluZmxhdGVSZXNldAotCQljb21wcmVzcwotCQl1bmNvbXByZXNzCi0JCWd6b3BlbgotCQlnemRvcGVuCi0JCWd6cmVhZAotCQlnendyaXRlCi0JCWd6Zmx1c2gKLQkJZ3pjbG9zZQotCQlnemVycm9yCi0JCWFkbGVyMzIKLQkJY3JjMzIKLQkJZGVmbGF0ZUluaXRfCi0JCWluZmxhdGVJbml0XwotCQlkZWZsYXRlSW5pdDJfCi0JCWluZmxhdGVJbml0Ml8KZGlmZiAtLWdpdCBhL3psaWIuaCBiL3psaWIuaAppbmRleCA5NTM3Y2I4Li5jYzFiNDIzIDEwMDY0NAotLS0gYS96bGliLmgKKysrIGIvemxpYi5oCkBAIC0xLDUgKzEsNSBAQAogLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gIHZlcnNpb24gMS4wLjUsIEphbiAzcmQsIDE5OTguCisgIHZlcnNpb24gMS4wLjcsIEphbiAyMHRoLCAxOTk4CiAKICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgogCkBAIC0yMCw3ICsyMCw3IEBACiAgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAKICAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBnemlwQHByZXAuYWkubWl0LmVkdSAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisgIGpsb3VwQGd6aXAub3JnICAgICAgICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5lZHUKIAogCiAgIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IHRoZSB6bGliIGxpYnJhcnkgaXMgZGVzY3JpYmVkIGJ5IFJGQ3MgKFJlcXVlc3QgZm9yCkBAIC0zNywzMCArMzcsMjcgQEAKIAogI2luY2x1ZGUgInpjb25mLmgiCiAKLSNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjAuNSIKKyNkZWZpbmUgWkxJQl9WRVJTSU9OICIxLjAuNyIKIAogLyogCiAgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCiAgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCiAgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCi0gIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIG1heSBiZSBhZGRlZCBsYXRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQogICBzdHJlYW0gaW50ZXJmYWNlLgogCi0gICAgIEZvciBjb21wcmVzc2lvbiB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIHRoZSBvdXRwdXQgYnVmZmVyIGFuZAotICBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHRoZSBpbnB1dCBidWZmZXIgZm9yIG9wdGltaXphdGlvbi4gRm9yIGRlY29tcHJlc3Npb24sCi0gIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHByb3ZpZGUgdGhlIGlucHV0IGJ1ZmZlciBhbmQgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZQotICB0aGUgb3V0cHV0IGJ1ZmZlciBmb3Igb3B0aW1pemF0aW9uLgotCiAgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCiAgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKICAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKICAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAogICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgogCi0gICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBJdCBpcyByZWNvbW1lbmRlZCB0bwotICBhZGQgYXQgbGVhc3QgYSBoYW5kbGVyIGZvciBTSUdTRUdWIHdoZW4gZGVjb21wcmVzc2luZzsgdGhlIGxpYnJhcnkgY2hlY2tzCi0gIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgaW5wdXQgZGF0YSB3aGVuZXZlciBwb3NzaWJsZSBidXQgbWF5IGdvIG51dHMKLSAgZm9yIHNvbWUgZm9ybXMgb2YgY29ycnVwdGVkIGlucHV0LgorICAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKKyAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgogKi8KIAogdHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7CkBAIC0xMjMsNyArMTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50cyAqLwogCiAjZGVmaW5lIFpfTk9fRkxVU0ggICAgICAwCi0jZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxCisjZGVmaW5lIFpfUEFSVElBTF9GTFVTSCAxIC8qIHdpbGwgYmUgcmVtb3ZlZCwgdXNlIFpfU1lOQ19GTFVTSCBpbnN0ZWFkICovCiAjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAyCiAjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICAzCiAjZGVmaW5lIFpfRklOSVNIICAgICAgICA0CkBAIC0yMDAsNyArMTk3LDEzIEBACiAKIGV4dGVybiBpbnQgRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKIC8qCi0gIFBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAgICBkZWZsYXRlIGNvbXByZXNzZXMgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLCBhbmQgc3RvcHMgd2hlbiB0aGUgaW5wdXQKKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlIHNvbWUKKyAgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgorCisgICAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKKyAgZm9sbG93aW5nIGFjdGlvbnM6CiAKICAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgogICAgIGFjY29yZGluZ2x5LiBJZiBub3QgYWxsIGlucHV0IGNhbiBiZSBwcm9jZXNzZWQgKGJlY2F1c2UgdGhlcmUgaXMgbm90CkBAIC0yMjIsMjQgKzIyNSwyMyBAQAogICBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlCiAgIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgogCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9QQVJUSUFMX0ZMVVNILCB0aGUgY3VycmVudCBjb21wcmVzc2lvbgotICBibG9jayBpcyB0ZXJtaW5hdGVkIGFuZCBmbHVzaGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHNvIHRoYXQgdGhlCi0gIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuIEZvciBtZXRob2QgOSwgYSBmdXR1cmUKLSAgdmFyaWFudCBvbiBtZXRob2QgOCwgdGhlIGN1cnJlbnQgYmxvY2sgd2lsbCBiZSBmbHVzaGVkIGJ1dCBub3QgdGVybWluYXRlZC4KLSAgWl9TWU5DX0ZMVVNIIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgcGFydGlhbCBmbHVzaCBleGNlcHQgdGhhdCB0aGUgY29tcHJlc3NlZAotICBvdXRwdXQgaXMgYnl0ZSBhbGlnbmVkICh0aGUgY29tcHJlc3NvciBjYW4gY2xlYXIgaXRzIGludGVybmFsIGJpdCBidWZmZXIpCi0gIGFuZCB0aGUgY3VycmVudCBibG9jayBpcyBhbHdheXMgdGVybWluYXRlZDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHRoZQotICBjb21wcmVzc29yIGhhcyB0byBiZSByZXN0YXJ0ZWQgZnJvbSBzY3JhdGNoIGFmdGVyIGFuIGludGVycnVwdGlvbiAoaW4gd2hpY2gKLSAgY2FzZSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXByZXNzb3IgbWF5IGJlIGxvc3QpLgotICAgIElmIGZsdXNoIGlzIHNldCB0byBaX0ZVTExfRkxVU0gsIHRoZSBjb21wcmVzc2lvbiBibG9jayBpcyB0ZXJtaW5hdGVkLCBhCi0gIHNwZWNpYWwgbWFya2VyIGlzIG91dHB1dCBhbmQgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgaXMgZGlzY2FyZGVkOyB0aGlzCi0gIGlzIHVzZWZ1bCB0byBhbGxvdyB0aGUgZGVjb21wcmVzc29yIHRvIHN5bmNocm9uaXplIGlmIG9uZSBjb21wcmVzc2VkIGJsb2NrCi0gIGhhcyBiZWVuIGRhbWFnZWQgKHNlZSBpbmZsYXRlU3luYyBiZWxvdykuICBGbHVzaGluZyBkZWdyYWRlcyBjb21wcmVzc2lvbiBhbmQKLSAgc28gc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4gIFVzaW5nIFpfRlVMTF9GTFVTSCB0b28gb2Z0ZW4gY2FuCi0gIHNlcmlvdXNseSBkZWdyYWRlIHRoZSBjb21wcmVzc2lvbi4gSWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggYXZhaWxfb3V0ID09IDAsCi0gIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgc2FtZSB2YWx1ZSBvZiB0aGUgZmx1c2gKLSAgcGFyYW1ldGVyIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpLCB1bnRpbCB0aGUgZmx1c2ggaXMKLSAgY29tcGxldGUgKGRlZmxhdGUgcmV0dXJucyB3aXRoIG5vbi16ZXJvIGF2YWlsX291dCkuCisgICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBhbGwgcGVuZGluZyBvdXRwdXQgaXMKKyAgZmx1c2hlZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdGhlIG91dHB1dCBpcyBhbGlnbmVkIG9uIGEgYnl0ZSBib3VuZGFyeSwgc28KKyAgdGhhdCB0aGUgZGVjb21wcmVzc29yIGNhbiBnZXQgYWxsIGlucHV0IGRhdGEgYXZhaWxhYmxlIHNvIGZhci4gKEluIHBhcnRpY3VsYXIKKyAgYXZhaWxfaW4gaXMgemVybyBhZnRlciB0aGUgY2FsbCBpZiBlbm91Z2ggb3V0cHV0IHNwYWNlIGhhcyBiZWVuIHByb3ZpZGVkCisgIGJlZm9yZSB0aGUgY2FsbC4pICBGbHVzaGluZyBtYXkgZGVncmFkZSBjb21wcmVzc2lvbiBmb3Igc29tZSBjb21wcmVzc2lvbgorICBhbGdvcml0aG1zIGFuZCBzbyBpdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgorCisgICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfRlVMTF9GTFVTSCwgYWxsIG91dHB1dCBpcyBmbHVzaGVkIGFzIHdpdGgKKyAgWl9TWU5DX0ZMVVNILCBhbmQgdGhlIGNvbXByZXNzaW9uIHN0YXRlIGlzIHJlc2V0IHNvIHRoYXQgZGVjb21wcmVzc2lvbiBjYW4KKyAgcmVzdGFydCBmcm9tIHRoaXMgcG9pbnQgaWYgcHJldmlvdXMgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGRhbWFnZWQgb3IgaWYKKyAgcmFuZG9tIGFjY2VzcyBpcyBkZXNpcmVkLiBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQorICB0aGUgY29tcHJlc3Npb24uCisKKyAgICBJZiBkZWZsYXRlIHJldHVybnMgd2l0aCBhdmFpbF9vdXQgPT0gMCwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZ2FpbgorICB3aXRoIHRoZSBzYW1lIHZhbHVlIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYW5kIG1vcmUgb3V0cHV0IHNwYWNlICh1cGRhdGVkCisgIGF2YWlsX291dCksIHVudGlsIHRoZSBmbHVzaCBpcyBjb21wbGV0ZSAoZGVmbGF0ZSByZXR1cm5zIHdpdGggbm9uLXplcm8KKyAgYXZhaWxfb3V0KS4KIAogICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCwKICAgcGVuZGluZyBvdXRwdXQgaXMgZmx1c2hlZCBhbmQgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9TVFJFQU1fRU5EIGlmIHRoZXJlCkBAIC0yNTQsNiArMjU2LDkgQEAKICAgMC4xJSBsYXJnZXIgdGhhbiBhdmFpbF9pbiBwbHVzIDEyIGJ5dGVzLiAgSWYgZGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4KICAgWl9TVFJFQU1fRU5ELCB0aGVuIGl0IG11c3QgYmUgY2FsbGVkIGFnYWluIGFzIGRlc2NyaWJlZCBhYm92ZS4KIAorICAgIGRlZmxhdGUoKSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBpbnB1dCByZWFkCisgIHNvIGZhciAodGhhdCBpcywgdG90YWxfaW4gYnl0ZXMpLgorCiAgICAgZGVmbGF0ZSgpIG1heSB1cGRhdGUgZGF0YV90eXBlIGlmIGl0IGNhbiBtYWtlIGEgZ29vZCBndWVzcyBhYm91dAogICB0aGUgaW5wdXQgZGF0YSB0eXBlIChaX0FTQ0lJIG9yIFpfQklOQVJZKS4gSW4gZG91YnQsIHRoZSBkYXRhIGlzIGNvbnNpZGVyZWQKICAgYmluYXJ5LiBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QKQEAgLTI4NSwyMSArMjkwLDMyIEBACiBleHRlcm4gaW50IEVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKIAogICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiBUaGUgZmllbGRzCi0gICB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlIGNhbGxlci4gIElmCi0gICB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8gdXNlIGRlZmF1bHQKLSAgIGFsbG9jYXRpb24gZnVuY3Rpb25zLgorICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQorICAgdGhlIGNhbGxlci4gSWYgbmV4dF9pbiBpcyBub3QgWl9OVUxMIGFuZCBhdmFpbF9pbiBpcyBsYXJnZSBlbm91Z2ggKHRoZSBleGFjdAorICAgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY29tcHJlc3Npb24gbWV0aG9kKSwgaW5mbGF0ZUluaXQgZGV0ZXJtaW5lcyB0aGUKKyAgIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHRoZSB6bGliIGhlYWRlciBhbmQgYWxsb2NhdGVzIGFsbCBkYXRhIHN0cnVjdHVyZXMKKyAgIGFjY29yZGluZ2x5OyBvdGhlcndpc2UgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSBkZWZlcnJlZCB0byB0aGUgZmlyc3QgY2FsbCBvZgorICAgaW5mbGF0ZS4gIElmIHphbGxvYyBhbmQgemZyZWUgYXJlIHNldCB0byBaX05VTEwsIGluZmxhdGVJbml0IHVwZGF0ZXMgdGhlbSB0bworICAgdXNlIGRlZmF1bHQgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAKLSAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgIGVub3VnaCBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlCi0gICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubwotICAgZXJyb3IgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlCi0gICBkb25lIGJ5IGluZmxhdGUoKS4KKyAgICAgaW5mbGF0ZUluaXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCisgICBtZW1vcnksIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlCisgICB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlci4gIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvcgorICAgbWVzc2FnZS4gaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcKKyAgIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiB0aGlzIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQKKyAgIGF2YWlsX2luIG1heSBiZSBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCiAqLwogCiAKIGV4dGVybiBpbnQgRVhQT1JUIGluZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKIC8qCi0gIFBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAorICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCisgIGludHJvZHVjZSBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpCisgIGV4Y2VwdCB3aGVuIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKIAogICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KICAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdApAQCAtMzIwLDkgKzMzNiw5IEBACiAgIG11c3QgYmUgY2FsbGVkIGFnYWluIGFmdGVyIG1ha2luZyByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyIGJlY2F1c2UgdGhlcmUKICAgbWlnaHQgYmUgbW9yZSBvdXRwdXQgcGVuZGluZy4KIAotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCwgaW5mbGF0ZSBmbHVzaGVzIGFzIG11Y2gKKyAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX1NZTkNfRkxVU0gsIGluZmxhdGUgZmx1c2hlcyBhcyBtdWNoCiAgIG91dHB1dCBhcyBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlIGZsdXNoaW5nIGJlaGF2aW9yIG9mIGluZmxhdGUgaXMKLSAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiBaX1BBUlRJQUxfRkxVU0gKKyAgbm90IHNwZWNpZmllZCBmb3IgdmFsdWVzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb3RoZXIgdGhhbiBaX1NZTkNfRkxVU0gKICAgYW5kIFpfRklOSVNILCBidXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gYWN0dWFsbHkgZmx1c2hlcyBhcyBtdWNoIG91dHB1dAogICBhcyBwb3NzaWJsZSBhbnl3YXkuCiAKQEAgLTMzNywxOCArMzUzLDI2IEBACiAgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciByb3V0aW5lCiAgIG1heSBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKSBjYWxsLgogCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKLSAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlCi0gIGNvbXByZXNzZWQgZGF0YSBoYXMgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbgotICBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCAoc2VlCi0gIGluZmxhdGVTZXREaWN0aW9uYXJ5IGJlbG93KSwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQsCi0gIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQgKGZvciBleGFtcGxlIGlmCi0gIG5leHRfaW4gb3IgbmV4dF9vdXQgd2FzIE5VTEwpLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnksCi0gIFpfQlVGX0VSUk9SIGlmIG5vIHByb2dyZXNzIGlzIHBvc3NpYmxlIG9yIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4KLSAgdGhlIG91dHB1dCBidWZmZXIgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLiBJbiB0aGUgWl9EQVRBX0VSUk9SIGNhc2UsIHRoZQotICBhcHBsaWNhdGlvbiBtYXkgdGhlbiBjYWxsIGluZmxhdGVTeW5jIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jay4KLSAgSW4gdGhlIFpfTkVFRF9ESUNUIGNhc2UsIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgQWRsZXIzMiB2YWx1ZSBvZiB0aGUKLSAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IuCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQgKHNlZSBpbmZsYXRlU2V0RGljdGlvbmFyeQorICBiZWxvdyksIGluZmxhdGUgc2V0cyBzdHJtLWFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZQorICBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIAorICBpdCBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIGFsbCBvdXRwdXQgcHJvZHVjZWQKKyAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9vdXQgYnl0ZXMpIGFuZCByZXR1cm5zIFpfT0ssIFpfU1RSRUFNX0VORCBvcgorICBhbiBlcnJvciBjb2RlIGFzIGRlc2NyaWJlZCBiZWxvdy4gQXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCBpbmZsYXRlKCkKKyAgY2hlY2tzIHRoYXQgaXRzIGNvbXB1dGVkIGFkbGVyMzIgY2hlY2tzdW0gaXMgZXF1YWwgdG8gdGhhdCBzYXZlZCBieSB0aGUKKyAgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb25seSBpZiB0aGUgY2hlY2tzdW0gaXMgY29ycmVjdC4KKworICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAorICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCisgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKKyAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKKyAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdAorICBhZGxlcjMyIGNoZWNrc3VtKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAorICAoZm9yIGV4YW1wbGUgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKKyAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdAorICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIEluIHRoZSBaX0RBVEFfRVJST1IKKyAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMgdG8gbG9vayBmb3IgYSBnb29kCisgIGNvbXByZXNzaW9uIGJsb2NrLgogKi8KIAogCkBAIC0zODIsMTQgKzQwNiwxMyBAQAogICAgdGhlIGNhbGxlci4KIAogICAgICBUaGUgbWV0aG9kIHBhcmFtZXRlciBpcyB0aGUgY29tcHJlc3Npb24gbWV0aG9kLiBJdCBtdXN0IGJlIFpfREVGTEFURUQgaW4KLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gKE1ldGhvZCA5IHdpbGwgYWxsb3cgYSA2NEsgaGlzdG9yeSBidWZmZXIgYW5kCi0gICBwYXJ0aWFsIGJsb2NrIGZsdXNoZXMuKQorICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgogCiAgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQogICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5ICh0aGUgdmFsdWUgMTYgd2lsbCBiZSBhbGxvd2VkIGZvciBtZXRob2QgOSkuIExhcmdlcgotICAgdmFsdWVzIG9mIHRoaXMgcGFyYW1ldGVyIHJlc3VsdCBpbiBiZXR0ZXIgY29tcHJlc3Npb24gYXQgdGhlIGV4cGVuc2Ugb2YKLSAgIG1lbW9yeSB1c2FnZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTUgaWYgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgorICAgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4gTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCisgICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmCisgICBkZWZsYXRlSW5pdCBpcyB1c2VkIGluc3RlYWQuCiAKICAgICAgVGhlIG1lbUxldmVsIHBhcmFtZXRlciBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHNob3VsZCBiZSBhbGxvY2F0ZWQKICAgIGZvciB0aGUgaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUuIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQKQEAgLTQwOCw0MiArNDMxLDM1IEBACiAgICB0aGUgY29tcHJlc3Npb24gcmF0aW8gYnV0IG5vdCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGNvbXByZXNzZWQgb3V0cHV0IGV2ZW4KICAgIGlmIGl0IGlzIG5vdCBzZXQgYXBwcm9wcmlhdGVseS4KIAotICAgICBJZiBuZXh0X2luIGlzIG5vdCBudWxsLCB0aGUgbGlicmFyeSB3aWxsIHVzZSB0aGlzIGJ1ZmZlciB0byBob2xkIGFsc28KLSAgIHNvbWUgaGlzdG9yeSBpbmZvcm1hdGlvbjsgdGhlIGJ1ZmZlciBtdXN0IGVpdGhlciBob2xkIHRoZSBlbnRpcmUgaW5wdXQKLSAgIGRhdGEsIG9yIGhhdmUgYXQgbGVhc3QgMTw8KHdpbmRvd0JpdHMrMSkgYnl0ZXMgYW5kIGJlIHdyaXRhYmxlLiBJZiBuZXh0X2luCi0gICBpcyBudWxsLCB0aGUgbGlicmFyeSB3aWxsIGFsbG9jYXRlIGl0cyBvd24gaGlzdG9yeSBidWZmZXIgKGFuZCBsZWF2ZSBuZXh0X2luCi0gICBudWxsKS4gbmV4dF9vdXQgbmVlZCBub3QgYmUgcHJvdmlkZWQgaGVyZSBidXQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUKLSAgIGFwcGxpY2F0aW9uIGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KLQotICAgICBJZiB0aGUgaGlzdG9yeSBidWZmZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBuZXh0X2luIG11c3QKLSAgIG11c3QgbmV2ZXIgYmUgY2hhbmdlZCBieSB0aGUgYXBwbGljYXRpb24gc2luY2UgdGhlIGNvbXByZXNzb3IgbWFpbnRhaW5zCi0gICBpbmZvcm1hdGlvbiBpbnNpZGUgdGhpcyBidWZmZXIgZnJvbSBjYWxsIHRvIGNhbGw7IHRoZSBhcHBsaWNhdGlvbgotICAgbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgb25seSBieSBpbmNyZWFzaW5nIGF2YWlsX2luLiBuZXh0X2luIGlzIGFsd2F5cwotICAgcmVzZXQgYnkgdGhlIGxpYnJhcnkgaW4gdGhpcyBjYXNlLgotCi0gICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcwotICAgbm90IGVub3VnaCBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMKLSAgIGFuIGludmFsaWQgbWV0aG9kKS4gbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuCi0gICBkZWZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5Ci0gICBkZWZsYXRlKCkuIAorICAgICAgZGVmbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGFuIGludmFsaWQKKyAgIG1ldGhvZCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgZGVmbGF0ZUluaXQyIGRvZXMKKyAgIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIGV4dGVybiBpbnQgRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKIAkJCQkgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKIC8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IChoaXN0b3J5IGJ1ZmZlcikgZnJvbSB0aGUgZ2l2ZW4KLSAgIGJ5dGUgc2VxdWVuY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiBUaGlzIGZ1bmN0aW9uIG11c3QKLSAgIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGJlZm9yZSBhbnkgY2FsbAotICAgb2YgZGVmbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCisgICAgIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGUgc2VxdWVuY2UKKyAgIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLCBiZWZvcmUgYW55IGNhbGwgb2YKKyAgIGRlZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQogICAgZGljdGlvbmFyeSAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KKwogICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5CiAgICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5CiAgICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiBVc2luZyBhCi0gICBkaWN0aW9uYXJ5IGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCBpcyBzaG9ydCBhbmQKLSAgIGNhbiBiZSBwcmVkaWN0ZWQgd2l0aCBnb29kIGFjY3VyYWN5OyB0aGUgZGF0YSBjYW4gdGhlbiBiZSBjb21wcmVzc2VkIGJldHRlcgotICAgdGhhbiB3aXRoIHRoZSBkZWZhdWx0IGVtcHR5IGRpY3Rpb25hcnkuIEluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwKLSAgIG9ubHkgdGhlIGxhc3QgMzJLIGJ5dGVzIG9mIHRoZSBkaWN0aW9uYXJ5IGFyZSB1c2VkLgorICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQorICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgorICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5CisgICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCisgICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZSBpbgorICAgZGVmbGF0ZSBvciBkZWZsYXRlMi4gVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZSB1c2VmdWwgc2hvdWxkIGJlCisgICBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4KKwogICAgICBVcG9uIHJldHVybiBvZiB0aGlzIGZ1bmN0aW9uLCBzdHJtLT5hZGxlciBpcyBzZXQgdG8gdGhlIEFkbGVyMzIgdmFsdWUKICAgIG9mIHRoZSBkaWN0aW9uYXJ5OyB0aGUgZGVjb21wcmVzc29yIG1heSBsYXRlciB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUKICAgIHdoaWNoIGRpY3Rpb25hcnkgaGFzIGJlZW4gdXNlZCBieSB0aGUgY29tcHJlc3Nvci4gKFRoZSBBZGxlcjMyIHZhbHVlCkBAIC00NTEsMjEgKzQ2NywxNiBAQAogICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pCiAKICAgICAgZGVmbGF0ZVNldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIGEKLSAgIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIE5VTEwgZGljdGlvbmFyeSkgb3IgdGhlIHN0cmVhbSBzdGF0ZQotICAgaXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZSBpZiBkZWZsYXRlIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciB0aGlzCi0gICBzdHJlYW0pLiBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdCBwZXJmb3JtIGFueSBjb21wcmVzc2lvbjogdGhpcyB3aWxsCi0gICBiZSBkb25lIGJ5IGRlZmxhdGUoKS4gCisgICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBOVUxMIGRpY3Rpb25hcnkpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKKyAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KKyAgIG9yIGlmIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgaXMgYnNvcnQpLiBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAorICAgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KICovCiAKIGV4dGVybiBpbnQgRVhQT1JUIGRlZmxhdGVDb3B5IE9GKCh6X3N0cmVhbXAgZGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X3N0cmVhbXAgc291cmNlKSk7CiAvKgotICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLiAgSWYKLSAgIHRoZSBzb3VyY2Ugc3RyZWFtIGlzIHVzaW5nIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGhpc3RvcnkgYnVmZmVyLCBhIG5ldwotICAgYnVmZmVyIGlzIGFsbG9jYXRlZCBmb3IgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbS4gIFRoZSBjb21wcmVzc2VkIG91dHB1dAotICAgYnVmZmVyIGlzIGFsd2F5cyBhcHBsaWNhdGlvbi1zdXBwbGllZC4gSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlCi0gICBhcHBsaWNhdGlvbiB0byBwcm92aWRlIHRoZSBjb3JyZWN0IHZhbHVlcyBvZiBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGZvciB0aGUKLSAgIG5leHQgY2FsbCBvZiBkZWZsYXRlLgorICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gYXMgYSBjb21wbGV0ZSBjb3B5IG9mIHRoZSBzb3VyY2Ugc3RyZWFtLgogCiAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCB3aGVuIHNldmVyYWwgY29tcHJlc3Npb24gc3RyYXRlZ2llcyB3aWxsIGJlCiAgICB0cmllZCwgZm9yIGV4YW1wbGUgd2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCB3YXlzIG9mIHByZS1wcm9jZXNzaW5nIHRoZSBpbnB1dApAQCAtNDkzLDEyICs1MDQsMTMgQEAKIAogZXh0ZXJuIGludCBFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CiAvKgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4KLSAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4gY29tcHJlc3Npb24gYW5kIHN0cmFpZ2h0IGNvcHkgb2YKLSAgIHRoZSBpbnB1dCBkYXRhLCBvciB0byBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBkYXRhIHJlcXVpcmluZwotICAgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuIElmIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBjaGFuZ2VkLCB0aGUgaW5wdXQKLSAgIGF2YWlsYWJsZSBzbyBmYXIgaXMgY29tcHJlc3NlZCB3aXRoIHRoZSBvbGQgbGV2ZWwgKGFuZCBtYXkgYmUgZmx1c2hlZCk7Ci0gICB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZSBlZmZlY3Qgb25seSBhdCB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KKyAgICAgRHluYW1pY2FsbHkgdXBkYXRlIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBhbmQgY29tcHJlc3Npb24gc3RyYXRlZ3kuICBUaGUKKyAgIGludGVycHJldGF0aW9uIG9mIGxldmVsIGFuZCBzdHJhdGVneSBpcyBhcyBpbiBkZWZsYXRlSW5pdDIuICBUaGlzIGNhbiBiZQorICAgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiBjb21wcmVzc2lvbiBhbmQgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQgZGF0YSwgb3IKKyAgIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBraW5kIG9mIGlucHV0IGRhdGEgcmVxdWlyaW5nIGEgZGlmZmVyZW50CisgICBzdHJhdGVneS4gSWYgdGhlIGNvbXByZXNzaW9uIGxldmVsIGlzIGNoYW5nZWQsIHRoZSBpbnB1dCBhdmFpbGFibGUgc28gZmFyCisgICBpcyBjb21wcmVzc2VkIHdpdGggdGhlIG9sZCBsZXZlbCAoYW5kIG1heSBiZSBmbHVzaGVkKTsgdGhlIG5ldyBsZXZlbCB3aWxsCisgICB0YWtlIGVmZmVjdCBvbmx5IGF0IHRoZSBuZXh0IGNhbGwgb2YgZGVmbGF0ZSgpLgogCiAgICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlUGFyYW1zLCB0aGUgc3RyZWFtIHN0YXRlIG11c3QgYmUgc2V0IGFzIGZvcgogICAgYSBjYWxsIG9mIGRlZmxhdGUoKSwgc2luY2UgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgaW5wdXQgbWF5IGhhdmUgdG8KQEAgLTUxMyw0NiArNTI1LDM0IEBACiBleHRlcm4gaW50IEVYUE9SVCBpbmZsYXRlSW5pdDIgT0YoKHpfc3RyZWFtcCBzdHJtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMpKTsKIAotICAgICBUaGlzIGlzIGFub3RoZXIgdmVyc2lvbiBvZiBpbmZsYXRlSW5pdCB3aXRoIG1vcmUgY29tcHJlc3Npb24gb3B0aW9ucy4gVGhlCi0gICBmaWVsZHMgbmV4dF9vdXQsIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4KKyAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuIFRoZQorICAgZmllbGRzIG5leHRfaW4sIGF2YWlsX2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuCiAKICAgICAgVGhlIHdpbmRvd0JpdHMgcGFyYW1ldGVyIGlzIHRoZSBiYXNlIHR3byBsb2dhcml0aG0gb2YgdGhlIG1heGltdW0gd2luZG93CiAgICBzaXplICh0aGUgc2l6ZSBvZiB0aGUgaGlzdG9yeSBidWZmZXIpLiAgSXQgc2hvdWxkIGJlIGluIHRoZSByYW5nZSA4Li4xNSBmb3IKLSAgIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSAodGhlIHZhbHVlIDE2IHdpbGwgYmUgYWxsb3dlZCBzb29uKS4gVGhlCi0gICBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQgaW5zdGVhZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbQotICAgd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcyBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGgKLSAgIHRoZSBlcnJvciBjb2RlIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCisgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKKyAgIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcworICAgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mCisgICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgogCi0gICAgIElmIG5leHRfb3V0IGlzIG5vdCBudWxsLCB0aGUgbGlicmFyeSB3aWxsIHVzZSB0aGlzIGJ1ZmZlciBmb3IgdGhlIGhpc3RvcnkKLSAgIGJ1ZmZlcjsgdGhlIGJ1ZmZlciBtdXN0IGVpdGhlciBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIG91dHB1dAotICAgZGF0YSwgb3IgaGF2ZSBhdCBsZWFzdCAxPDx3aW5kb3dCaXRzIGJ5dGVzLiAgSWYgbmV4dF9vdXQgaXMgbnVsbCwgdGhlCi0gICBsaWJyYXJ5IHdpbGwgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgKGFuZCBsZWF2ZSBuZXh0X291dCBudWxsKS4gbmV4dF9pbgotICAgbmVlZCBub3QgYmUgcHJvdmlkZWQgaGVyZSBidXQgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gZm9yIHRoZQotICAgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KLQotICAgICBJZiB0aGUgaGlzdG9yeSBidWZmZXIgaXMgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBuZXh0X291dCBtdXN0Ci0gICBuZXZlciBiZSBjaGFuZ2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiBzaW5jZSB0aGUgZGVjb21wcmVzc29yIG1haW50YWlucwotICAgaGlzdG9yeSBpbmZvcm1hdGlvbiBpbnNpZGUgdGhpcyBidWZmZXIgZnJvbSBjYWxsIHRvIGNhbGw7IHRoZSBhcHBsaWNhdGlvbgotICAgY2FuIG9ubHkgcmVzZXQgbmV4dF9vdXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBidWZmZXIgd2hlbgotICAgYXZhaWxfb3V0IGlzIHplcm8gYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gY29uc3VtZWQuCi0KLSAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzCi0gICBub3QgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcwotICAgd2luZG93Qml0cyA8IDgpLiBtc2cgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4KLSAgIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieQotICAgaW5mbGF0ZSgpLgorICAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAorICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkIChzdWNoIGFzIGEgbmVnYXRpdmUKKyAgIG1lbUxldmVsKS4gbXNnIGlzIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBpbmZsYXRlSW5pdDIKKyAgIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24gYXBhcnQgZnJvbSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZgorICAgcHJlc2VudDogdGhpcyB3aWxsIGJlIGRvbmUgYnkgaW5mbGF0ZSgpLiAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlCisgICBtb2RpZmllZCwgYnV0IG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVuY2hhbmdlZC4pCiAqLwogCiBleHRlcm4gaW50IEVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCiAJCQkJICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKIAkJCQkJICAgdUludCAgZGljdExlbmd0aCkpOwogLyoKLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpIGZyb20gdGhlIGdpdmVuCi0gICB1bmNvbXByZXNzZWQgYnl0ZSBzZXF1ZW5jZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgYSBjYWxsIG9mIGluZmxhdGUgaWYgdGhpcyBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4KLSAgIGJ5IHRoZSBjb21wcmVzc29yIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcwotICAgY2FsbCBvZiBpbmZsYXRlLiBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgSW5pdGlhbGl6ZXMgdGhlIGRlY29tcHJlc3Npb24gZGljdGlvbmFyeSBmcm9tIHRoZSBnaXZlbiB1bmNvbXByZXNzZWQgYnl0ZQorICAgc2VxdWVuY2UuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjYWxsIG9mIGluZmxhdGUKKyAgIGlmIHRoaXMgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gVGhlIGRpY3Rpb25hcnkgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yCisgICBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBBZGxlcjMyIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgY2FsbCBvZgorICAgaW5mbGF0ZS4gVGhlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBtdXN0IHVzZSBleGFjdGx5IHRoZSBzYW1lCiAgICBkaWN0aW9uYXJ5IChzZWUgZGVmbGF0ZVNldERpY3Rpb25hcnkpLgogCiAgICAgIGluZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhCkBAIC01NjUsMTIgKzU2NSwxMiBAQAogCiBleHRlcm4gaW50IEVYUE9SVCBpbmZsYXRlU3luYyBPRigoel9zdHJlYW1wIHN0cm0pKTsKIC8qIAotICAgIFNraXBzIGludmFsaWQgY29tcHJlc3NlZCBkYXRhIHVudGlsIHRoZSBzcGVjaWFsIG1hcmtlciAoc2VlIGRlZmxhdGUoKQotICBhYm92ZSkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dAotICBpcyBwcm92aWRlZC4KKyAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZSB0aGUKKyAgZGVzY3JpcHRpb24gb2YgZGVmbGF0ZSB3aXRoIFpfRlVMTF9GTFVTSCkgY2FuIGJlIGZvdW5kLCBvciB1bnRpbCBhbGwKKyAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuIE5vIG91dHB1dCBpcyBwcm92aWRlZC4KIAotICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiB0aGUgc3BlY2lhbCBtYXJrZXIgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCi0gIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gbWFya2VyIGhhcyBiZWVuIGZvdW5kLAorICAgIGluZmxhdGVTeW5jIHJldHVybnMgWl9PSyBpZiBhIGZ1bGwgZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsIFpfQlVGX0VSUk9SCisgIGlmIG5vIG1vcmUgaW5wdXQgd2FzIHByb3ZpZGVkLCBaX0RBVEFfRVJST1IgaWYgbm8gZmx1c2ggcG9pbnQgaGFzIGJlZW4gZm91bmQsCiAgIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuIEluIHRoZSBzdWNjZXNzCiAgIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc2F2ZSB0aGUgY3VycmVudCBjdXJyZW50IHZhbHVlIG9mIHRvdGFsX2luIHdoaWNoCiAgIGluZGljYXRlcyB3aGVyZSB2YWxpZCBjb21wcmVzc2VkIGRhdGEgd2FzIGZvdW5kLiBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlCkBAIC01OTQsNyArNTk0LDcgQEAKIC8qCiAgICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUKICAgIGJhc2ljIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuIFRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UsIHNvbWUKLSAgIGRlZmF1bHQgb3B0aW9ucyBhcmUgYXNzdW1lZCAoY29tcHJlc3Npb24gbGV2ZWwsIHdpbmRvdyBzaXplLAorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAogICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCiAgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KICovCkBAIC02MzksMTMgKzYzOSwxNyBAQAogLyoKICAgICAgT3BlbnMgYSBnemlwICguZ3opIGZpbGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gVGhlIG1vZGUgcGFyYW1ldGVyCiAgICBpcyBhcyBpbiBmb3BlbiAoInJiIiBvciAid2IiKSBidXQgY2FuIGFsc28gaW5jbHVkZSBhIGNvbXByZXNzaW9uIGxldmVsCi0gICAoIndiOSIpLiAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsKLSAgIGluIHRoaXMgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLgorICAgKCJ3YjkiKSBvciBhIHN0cmF0ZWd5OiAnZicgZm9yIGZpbHRlcmVkIGRhdGEgYXMgaW4gIndiNmYiLCAnaCcgZm9yCisgICBIdWZmbWFuIG9ubHkgY29tcHJlc3Npb24gYXMgaW4gIndiMWgiLiAoU2VlIHRoZSBkZXNjcmlwdGlvbgorICAgb2YgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKQorCisgICAgIGd6b3BlbiBjYW4gYmUgdXNlZCB0byByZWFkIGEgZmlsZSB3aGljaCBpcyBub3QgaW4gZ3ppcCBmb3JtYXQ7IGluIHRoaXMKKyAgIGNhc2UgZ3pyZWFkIHdpbGwgZGlyZWN0bHkgcmVhZCBmcm9tIHRoZSBmaWxlIHdpdGhvdXQgZGVjb21wcmVzc2lvbi4KKwogICAgICBnem9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgb3IgaWYgdGhlcmUgd2FzCiAgICBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGU7IGVycm5vCiAgICBjYW4gYmUgY2hlY2tlZCB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIGNhc2VzIChpZiBlcnJubyBpcyB6ZXJvLCB0aGUKLSAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLgotKi8KKyAgIHpsaWIgZXJyb3IgaXMgWl9NRU1fRVJST1IpLiAgKi8KIAogZXh0ZXJuIGd6RmlsZSBFWFBPUlQgZ3pkb3BlbiAgT0YoKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkpOwogLyoKQEAgLTY2MCw2ICs2NjQsMTQgQEAKICAgIHRoZSAoZGUpY29tcHJlc3Npb24gc3RhdGUuCiAqLwogCitleHRlcm4gaW50IEVYUE9SVCBnenNldHBhcmFtcyBPRigoZ3pGaWxlIGZpbGUsIGludCBsZXZlbCwgaW50IHN0cmF0ZWd5KSk7CisvKgorICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIG9yIHN0cmF0ZWd5LiBTZWUgdGhlIGRlc2NyaXB0aW9uCisgICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCisgICAgIGd6c2V0cGFyYW1zIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgZmlsZSB3YXMgbm90CisgICBvcGVuZWQgZm9yIHdyaXRpbmcuCisqLworCiBleHRlcm4gaW50IEVYUE9SVCAgICBnenJlYWQgIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKIC8qCiAgICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4KQEAgLTY3NSw2ICs2ODcsMjUgQEAKICAgICgwIGluIGNhc2Ugb2YgZXJyb3IpLgogKi8KIAorZXh0ZXJuIGludCBFWFBPUlRWQSAgIGd6cHJpbnRmIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKKy8qCisgICAgIENvbnZlcnRzLCBmb3JtYXRzLCBhbmQgd3JpdGVzIHRoZSBhcmdzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgdW5kZXIKKyAgIGNvbnRyb2wgb2YgdGhlIGZvcm1hdCBzdHJpbmcsIGFzIGluIGZwcmludGYuIGd6cHJpbnRmIHJldHVybnMgdGhlIG51bWJlciBvZgorICAgdW5jb21wcmVzc2VkIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gKDAgaW4gY2FzZSBvZiBlcnJvcikuCisqLworCitleHRlcm4gaW50IEVYUE9SVCAgICBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOworLyoKKyAgICAgIFdyaXRlcyBjLCBjb252ZXJ0ZWQgdG8gYW4gdW5zaWduZWQgY2hhciwgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgZ3pwdXRjIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisqLworCitleHRlcm4gaW50IEVYUE9SVCAgICBnemdldGMgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICAgUmVhZHMgb25lIGJ5dGUgZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlLiBnemdldGMgcmV0dXJucyB0aGlzIGJ5dGUKKyAgIG9yIC0xIGluIGNhc2Ugb2YgZW5kIG9mIGZpbGUgb3IgZXJyb3IuCisqLworCiBleHRlcm4gaW50IEVYUE9SVCAgICBnemZsdXNoIE9GKChnekZpbGUgZmlsZSwgaW50IGZsdXNoKSk7CiAvKgogICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuIFRoZSBwYXJhbWV0ZXIKQEAgLTY4NSw2ICs3MTYsNDUgQEAKICAgIGRlZ3JhZGUgY29tcHJlc3Npb24uCiAqLwogCitleHRlcm4gel9vZmZfdCBFWFBPUlQgICAgZ3pzZWVrIE9GKChnekZpbGUgZmlsZSwgel9vZmZfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKKy8qIAorICAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgorICAgY29tcHJlc3NlZCBmaWxlLiBUaGUgb2Zmc2V0IHJlcHJlc2VudHMgYSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICB1bmNvbXByZXNzZWQgZGF0YSBzdHJlYW0uIFRoZSB3aGVuY2UgcGFyYW1ldGVyIGlzIGRlZmluZWQgYXMgaW4gbHNlZWsoMik7CisgICB0aGUgdmFsdWUgU0VFS19FTkQgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgSWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciByZWFkaW5nLCB0aGlzIGZ1bmN0aW9uIGlzIGVtdWxhdGVkIGJ1dCBjYW4gYmUKKyAgIGV4dHJlbWVseSBzbG93LiBJZiB0aGUgZmlsZSBpcyBvcGVuZWQgZm9yIHdyaXRpbmcsIG9ubHkgZm9yd2FyZCBzZWVrcyBhcmUKKyAgIHN1cHBvcnRlZDsgZ3pzZWVrIHRoZW4gY29tcHJlc3NlcyBhIHNlcXVlbmNlIG9mIHplcm9lcyB1cCB0byB0aGUgbmV3CisgICBzdGFydGluZyBwb3NpdGlvbi4KKworICAgICAgZ3pzZWVrIHJldHVybnMgdGhlIHJlc3VsdGluZyBvZmZzZXQgbG9jYXRpb24gYXMgbWVhc3VyZWQgaW4gYnl0ZXMgZnJvbQorICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbSwgb3IgLTEgaW4gY2FzZSBvZiBlcnJvciwgaW4KKyAgIHBhcnRpY3VsYXIgaWYgdGhlIGZpbGUgaXMgb3BlbmVkIGZvciB3cml0aW5nIGFuZCB0aGUgbmV3IHN0YXJ0aW5nIHBvc2l0aW9uCisgICB3b3VsZCBiZSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisqLworCitleHRlcm4gaW50IEVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCisKKyAgIGd6cmV3aW5kKGZpbGUpIGlzIGVxdWl2YWxlbnQgdG8gKGludClnenNlZWsoZmlsZSwgMEwsIFNFRUtfU0VUKQorKi8KKworZXh0ZXJuIHpfb2ZmX3QgRVhQT1JUICAgIGd6dGVsbCBPRigoZ3pGaWxlIGZpbGUpKTsKKy8qCisgICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUKKyAgIGdpdmVuIGNvbXByZXNzZWQgZmlsZS4gVGhpcyBwb3NpdGlvbiByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQorICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLgorCisgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQorKi8KKworZXh0ZXJuIGludCBFWFBPUlQgZ3plb2YgT0YoKGd6RmlsZSBmaWxlKSk7CisvKgorICAgICBSZXR1cm5zIDEgd2hlbiBFT0YgaGFzIHByZXZpb3VzbHkgYmVlbiBkZXRlY3RlZCByZWFkaW5nIHRoZSBnaXZlbgorICAgaW5wdXQgc3RyZWFtLCBvdGhlcndpc2UgemVyby4KKyovCisKIGV4dGVybiBpbnQgRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7CiAvKgogICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlCkBAIC03NjcsMTEgKzgzNywxNCBAQAogI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAogICAgICAgICBpbmZsYXRlSW5pdDJfKChzdHJtKSwgKHdpbmRvd0JpdHMpLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCiAKKwogI2lmICFkZWZpbmVkKF9aX1VUSUxfSCkgJiYgIWRlZmluZWQoTk9fRFVNTVlfREVDTCkKICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUge2ludCBkdW1teTt9OyAvKiBoYWNrIGZvciBidWdneSBjb21waWxlcnMgKi8KICNlbmRpZgogCi11TG9uZ2YgKmdldF9jcmNfdGFibGUgT0YoKHZvaWQpKTsgLyogY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkgKi8KK2V4dGVybiBjb25zdCBjaGFyICogRVhQT1JUIHpFcnJvciAgICAgICAgICAgT0YoKGludCBlcnIpKTsKK2V4dGVybiBpbnQgICAgICAgICAgRVhQT1JUIGluZmxhdGVTeW5jUG9pbnQgT0YoKHpfc3RyZWFtcCB6KSk7CitleHRlcm4gdUxvbmdmICogICAgIEVYUE9SVCBnZXRfY3JjX3RhYmxlICAgIE9GKCh2b2lkKSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvenV0aWwuYyBiL3p1dGlsLmMKaW5kZXggNzM0ZTI3NS4uODRiN2VlMSAxMDA2NDQKLS0tIGEvenV0aWwuYworKysgYi96dXRpbC5jCkBAIC0xLDkgKzEsOSBAQAogLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseS4KKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEplYW4tbG91cCBHYWlsbHkuCiAgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAogICovCiAKLS8qICRJZDogenV0aWwuYyx2IDEuMTcgMTk5Ni8wNy8yNCAxMzo0MToxMiBtZSBFeHAgJCAqLworLyogQCgjKSAkSWQkICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC0yOCwxMiArMjgsMTggQEAKICIifTsKIAogCi1jb25zdCBjaGFyICp6bGliVmVyc2lvbigpCitjb25zdCBjaGFyICogRVhQT1JUIHpsaWJWZXJzaW9uKCkKIHsKICAgICByZXR1cm4gWkxJQl9WRVJTSU9OOwogfQogCiAjaWZkZWYgREVCVUcKKworIyAgaWZuZGVmIHZlcmJvc2UKKyMgICAgZGVmaW5lIHZlcmJvc2UgMAorIyAgZW5kaWYKK2ludCB6X3ZlcmJvc2UgPSB2ZXJib3NlOworCiB2b2lkIHpfZXJyb3IgKG0pCiAgICAgY2hhciAqbTsKIHsKQEAgLTQyLDYgKzQ4LDE2IEBACiB9CiAjZW5kaWYKIAorLyogZXhwb3J0ZWQgdG8gYWxsb3cgY29udmVyc2lvbiBvZiBlcnJvciBjb2RlIHRvIHN0cmluZyBmb3IgY29tcHJlc3MoKSBhbmQKKyAqIHVuY29tcHJlc3MoKQorICovCitjb25zdCBjaGFyICogRVhQT1JUIHpFcnJvcihlcnIpCisgICAgaW50IGVycjsKK3sKKyAgICByZXR1cm4gRVJSX01TRyhlcnIpOworfQorCisKICNpZm5kZWYgSEFWRV9NRU1DUFkKIAogdm9pZCB6bWVtY3B5KGRlc3QsIHNvdXJjZSwgbGVuKQpkaWZmIC0tZ2l0IGEvenV0aWwuaCBiL3p1dGlsLmgKaW5kZXggYzgxYTlmOS4uMDgyYTg3YiAxMDA2NDQKLS0tIGEvenV0aWwuaAorKysgYi96dXRpbC5oCkBAIC0xLDUgKzEsNSBAQAogLyogenV0aWwuaCAtLSBpbnRlcm5hbCBpbnRlcmZhY2UgYW5kIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5LgogICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKQEAgLTgsMjMgKzgsMjMgQEAKICAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KICAqLwogCi0vKiAkSWQ6IHp1dGlsLmgsdiAxLjE2IDE5OTYvMDcvMjQgMTM6NDE6MTMgbWUgRXhwICQgKi8KKy8qIEAoIykgJElkJCAqLwogCiAjaWZuZGVmIF9aX1VUSUxfSAogI2RlZmluZSBfWl9VVElMX0gKIAogI2luY2x1ZGUgInpsaWIuaCIKIAotI2lmIGRlZmluZWQoTVNET1MpfHxkZWZpbmVkKFZNUyl8fGRlZmluZWQoQ1JBWSl8fGRlZmluZWQoV0lOMzIpfHxkZWZpbmVkKFJJU0NPUykKLSMgICBpbmNsdWRlIDxzdGRkZWYuaD4KLSMgICBpbmNsdWRlIDxlcnJuby5oPgotI2Vsc2UKLSAgICBleHRlcm4gaW50IGVycm5vOwotI2VuZGlmCiAjaWZkZWYgU1REQworIyAgaW5jbHVkZSA8c3RkZGVmLmg+CiAjICBpbmNsdWRlIDxzdHJpbmcuaD4KICMgIGluY2x1ZGUgPHN0ZGxpYi5oPgogI2VuZGlmCisjaWZkZWYgTk9fRVJSTk9fSAorICAgIGV4dGVybiBpbnQgZXJybm87CisjZWxzZQorIyAgIGluY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKIAogI2lmbmRlZiBsb2NhbAogIyAgZGVmaW5lIGxvY2FsIHN0YXRpYwpAQCAtNzYsNyArNzYsMTMgQEAKICNpZmRlZiBNU0RPUwogIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKICMgIGlmZGVmIF9fVFVSQk9DX18KLSMgICAgaW5jbHVkZSA8YWxsb2MuaD4KKyMgICAgaWYoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKKyAgICAgICAvKiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkICovCisgICAgICAgdm9pZCBfQ2RlY2wgZmFyZnJlZSggdm9pZCAqYmxvY2sgKTsKKyAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOworIyAgICBlbHNlCisjICAgICBpbmNsdWRlIDxhbGxvYy5oPgorIyAgICBlbmRpZgogIyAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KICMgICAgaW5jbHVkZSA8bWFsbG9jLmg+CiAjICBlbmRpZgpAQCAtOTIsNyArOTgsNyBAQAogCiAjaWYgZGVmaW5lZChWQVhDKSB8fCBkZWZpbmVkKFZNUykKICMgIGRlZmluZSBPU19DT0RFICAweDAyCi0jICBkZWZpbmUgRk9QRU4obmFtZSwgbW9kZSkgXAorIyAgZGVmaW5lIEZfT1BFTihuYW1lLCBtb2RlKSBcCiAgICAgIGZvcGVuKChuYW1lKSwgKG1vZGUpLCAibWJjPTYwIiwgImN0eD1zdG0iLCAicmZtPWZpeCIsICJtcnM9NTEyIikKICNlbmRpZgogCkBAIC0xMjAsMTQgKzEyNiwxOSBAQAogIyAgZGVmaW5lIGZkb3BlbihmZCxtb2RlKSBOVUxMIC8qIE5vIGZkb3BlbigpICovCiAjZW5kaWYKIAorI2lmIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gNjAwKSkKKyMgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKKyNlbmRpZgorCisKICAgICAgICAgLyogQ29tbW9uIGRlZmF1bHRzICovCiAKICNpZm5kZWYgT1NfQ09ERQogIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCiAjZW5kaWYKIAotI2lmbmRlZiBGT1BFTgotIyAgZGVmaW5lIEZPUEVOKG5hbWUsIG1vZGUpIGZvcGVuKChuYW1lKSwgKG1vZGUpKQorI2lmbmRlZiBGX09QRU4KKyMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgZm9wZW4oKG5hbWUpLCAobW9kZSkpCiAjZW5kaWYKIAogICAgICAgICAgLyogZnVuY3Rpb25zICovCkBAIC0xNDIsOSArMTUzLDEwIEBACiAjaWYgZGVmaW5lZChweXIpCiAjICBkZWZpbmUgTk9fTUVNQ1BZCiAjZW5kaWYKLSNpZiAoZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikKKyNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKICAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgogICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgorICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgogICAqLwogIyAgZGVmaW5lIE5PX01FTUNQWQogI2VuZGlmCkBAIC0xNzAsMTYgKzE4MiwxNCBAQAogLyogRGlhZ25vc3RpYyBmdW5jdGlvbnMgKi8KICNpZmRlZiBERUJVRwogIyAgaW5jbHVkZSA8c3RkaW8uaD4KLSMgIGlmbmRlZiB2ZXJib3NlCi0jICAgIGRlZmluZSB2ZXJib3NlIDAKLSMgIGVuZGlmCisgICBleHRlcm4gaW50IHpfdmVyYm9zZTsKICAgIGV4dGVybiB2b2lkIHpfZXJyb3IgICAgT0YoKGNoYXIgKm0pKTsKICMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHtpZighKGNvbmQpKSB6X2Vycm9yKG1zZyk7fQotIyAgZGVmaW5lIFRyYWNlKHgpIGZwcmludGYgeAotIyAgZGVmaW5lIFRyYWNldih4KSB7aWYgKHZlcmJvc2UpIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh2ZXJib3NlPjEpIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlYyhjLHgpIHtpZiAodmVyYm9zZSAmJiAoYykpIGZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHZlcmJvc2U+MSAmJiAoYykpIGZwcmludGYgeCA7fQorIyAgZGVmaW5lIFRyYWNlKHgpIHtpZiAoel92ZXJib3NlPj0wKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZXYoeCkge2lmICh6X3ZlcmJvc2U+MCkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHpfdmVyYm9zZT4xKSBmcHJpbnRmIHggO30KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHpfdmVyYm9zZT4wICYmIChjKSkgZnByaW50ZiB4IDt9CisjICBkZWZpbmUgVHJhY2VjdihjLHgpIHtpZiAoel92ZXJib3NlPjEgJiYgKGMpKSBmcHJpbnRmIHggO30KICNlbHNlCiAjICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKQogIyAgZGVmaW5lIFRyYWNlKHgpCkBAIC0xOTAsOCArMjAwLDggQEAKICNlbmRpZgogCiAKLXR5cGVkZWYgdUxvbmcgKCpjaGVja19mdW5jKSBPRigodUxvbmcgY2hlY2ssIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0KK3R5cGVkZWYgdUxvbmcgKEVYUE9SVCAqY2hlY2tfZnVuYykgT0YoKHVMb25nIGNoZWNrLCBjb25zdCBCeXRlZiAqYnVmLAorCQkJCSAgICAgICB1SW50IGxlbikpOwogdm9pZHBmIHpjYWxsb2MgT0YoKHZvaWRwZiBvcGFxdWUsIHVuc2lnbmVkIGl0ZW1zLCB1bnNpZ25lZCBzaXplKSk7CiB2b2lkICAgemNmcmVlICBPRigodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikpOwogCg==