ZGlmZiAtLWdpdCBhL0FMR09SSVRITVMgYi9BTEdPUklUSE1TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzdkMmNhLi4wMDAwMDAwCi0tLSBhL0FMR09SSVRITVMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLUJ6aXAyIGlzIG5vdCByZXNlYXJjaCB3b3JrLCBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBkb2Vzbid0IHByZXNlbnQgYW55Ci1uZXcgaWRlYXMuICBSYXRoZXIsIGl0J3MgYW4gZW5naW5lZXJpbmcgZXhlcmNpc2UgYmFzZWQgb24gZXhpc3RpbmcKLWlkZWFzLgotCi1Gb3VyIGRvY3VtZW50cyBkZXNjcmliZSBlc3NlbnRpYWxseSBhbGwgdGhlIGlkZWFzIGJlaGluZCBiemlwMjoKLSAKLSAgIE1pY2hhZWwgQnVycm93cyBhbmQgRC4gSi4gV2hlZWxlcjoKLSAgICAgIkEgYmxvY2stc29ydGluZyBsb3NzbGVzcyBkYXRhIGNvbXByZXNzaW9uIGFsZ29yaXRobSIKLSAgICAgIDEwdGggTWF5IDE5OTQuIAotICAgICAgRGlnaXRhbCBTUkMgUmVzZWFyY2ggUmVwb3J0IDEyNC4KLSAgICAgIGZ0cDovL2Z0cC5kaWdpdGFsLmNvbS9wdWIvREVDL1NSQy9yZXNlYXJjaC1yZXBvcnRzL1NSQy0xMjQucHMuZ3oKLQotICAgRGFuaWVsIFMuIEhpcnNjaGJlcmcgYW5kIERlYnJhIEEuIExlTGV3ZXIKLSAgICAgIkVmZmljaWVudCBEZWNvZGluZyBvZiBQcmVmaXggQ29kZXMiCi0gICAgICBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkwLCBWb2wgMzMsIE51bWJlciA0LgotICAgICAgWW91IG1pZ2h0IGJlIGFibGUgdG8gZ2V0IGFuIGVsZWN0cm9uaWMgY29weSBvZiB0aGlzCi0gICAgICAgICBmcm9tIHRoZSBBQ00gRGlnaXRhbCBMaWJyYXJ5LgotCi0gICBEYXZpZCBKLiBXaGVlbGVyCi0gICAgICBQcm9ncmFtIGJyZWQzLmMgYW5kIGFjY29tcGFueWluZyBkb2N1bWVudCBicmVkMy5wcy4KLSAgICAgIFRoaXMgY29udGFpbnMgdGhlIGlkZWEgYmVoaW5kIHRoZSBtdWx0aS10YWJsZSBIdWZmbWFuCi0gICAgICBjb2Rpbmcgc2NoZW1lLgotICAgICAgZnRwOi8vZnRwLmNsLmNhbS5hYy51ay9wdWIvdXNlci9kanczLwotCi0gICBKb24gTC4gQmVudGxleSBhbmQgUm9iZXJ0IFNlZGdld2ljawotICAgICAiRmFzdCBBbGdvcml0aG1zIGZvciBTb3J0aW5nIGFuZCBTZWFyY2hpbmcgU3RyaW5ncyIKLSAgICAgIEF2YWlsYWJsZSBmcm9tIFNlZGdld2ljaydzIHdlYiBwYWdlLAotICAgICAgd3d3LmNzLnByaW5jZXRvbi5lZHUvfnJzCi0KLVRoZSBmb2xsb3dpbmcgcGFwZXIgZ2l2ZXMgdmFsdWFibGUgYWRkaXRpb25hbCBpbnNpZ2h0cyBpbnRvIHRoZQotYWxnb3JpdGhtLCBidXQgaXMgbm90IGltbWVkaWF0ZWx5IHRoZSBiYXNpcyBvZiBhbnkgY29kZQotdXNlZCBpbiBiemlwMi4KLQotICAgUGV0ZXIgRmVud2ljazoKLSAgICAgIEJsb2NrIFNvcnRpbmcgVGV4dCBDb21wcmVzc2lvbgotICAgICAgUHJvY2VlZGluZ3Mgb2YgdGhlIDE5dGggQXVzdHJhbGFzaWFuIENvbXB1dGVyIFNjaWVuY2UgQ29uZmVyZW5jZSwKLSAgICAgICAgTWVsYm91cm5lLCBBdXN0cmFsaWEuICBKYW4gMzEgLSBGZWIgMiwgMTk5Ni4KLSAgICAgIGZ0cDovL2Z0cC5jcy5hdWNrbGFuZC5hYy5uei9wdWIvcGV0ZXItZi9BQ1NDOTZwYXBlci5wcwotICAgICAgCi1BbGwgdGhyZWUgYXJlIHdlbGwgd3JpdHRlbiwgYW5kIG1ha2UgZmFzY2luYXRpbmcgcmVhZGluZy4gIElmIHlvdSB3YW50Ci10byBtb2RpZnkgYnppcDIgaW4gYW55IG5vbi10cml2aWFsIHdheSwgSSBzdHJvbmdseSBzdWdnZXN0IHlvdSBvYnRhaW4sCi1yZWFkIGFuZCB1bmRlcnN0YW5kIHRoZXNlIHBhcGVycy4KLQotSSBhbSBtdWNoIGluZGVidGVkIHRvIHRoZSB2YXJpb3VzIGF1dGhvcnMgZm9yIHRoZWlyIGhlbHAsIHN1cHBvcnQgYW5kCi1hZHZpY2UuCi0KZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDBmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9DSEFOR0VTCkBAIC0wLDAgKzEsNDUgQEAKKworCiswLjkuMAorfn5+fn4KK0ZpcnN0IHZlcnNpb24uCisKKworMC45LjBhCit+fn5+fn4KK1JlbW92ZWQgJ3JhbmxpYicgZnJvbSBNYWtlZmlsZSwgc2luY2UgbW9zdCBtb2Rlcm4gVW5peC1lcyAKK2Rvbid0IG5lZWQgaXQsIG9yIGV2ZW4ga25vdyBhYm91dCBpdC4KKworCiswLjkuMGIKK35+fn5+fgorRml4ZWQgYSBwcm9ibGVtIHdpdGggZXJyb3IgcmVwb3J0aW5nIGluIGJ6aXAyLmMuICBUaGlzIGRvZXMgbm90IGVmZmVjdAordGhlIGxpYnJhcnkgaW4gYW55IHdheS4gIFByb2JsZW0gaXM6IHZlcnNpb25zIDAuOS4wIGFuZCAwLjkuMGEgKG9mIHRoZQorcHJvZ3JhbSBwcm9wZXIpIGNvbXByZXNzIGFuZCBkZWNvbXByZXNzIGNvcnJlY3RseSwgYnV0IGdpdmUgbWlzbGVhZGluZworZXJyb3IgbWVzc2FnZXMgKGludGVybmFsIHBhbmljcykgd2hlbiBhbiBJL08gZXJyb3Igb2NjdXJzLCBpbnN0ZWFkIG9mCityZXBvcnRpbmcgdGhlIHByb2JsZW0gY29ycmVjdGx5LiAgVGhpcyBzaG91bGRuJ3QgZ2l2ZSBhbnkgZGF0YSBsb3NzCisoYXMgZmFyIGFzIEkgY2FuIHNlZSksIGJ1dCBpcyBjb25mdXNpbmcuCisKK01hZGUgdGhlIGlubGluZSBkZWNsYXJhdGlvbnMgZGlzYXBwZWFyIGZvciBub24tR0NDIGNvbXBpbGVycy4KKworCiswLjkuMGMKK35+fn5+fgorRml4ZWQgc29tZSBwcm9ibGVtcyBpbiB0aGUgbGlicmFyeSBwZXJ0YWluaW5nIHRvIHNvbWUgYm91bmRhcnkgY2FzZXMuCitUaGlzIG1ha2VzIHRoZSBsaWJyYXJ5IGJlaGF2ZSBtb3JlIGNvcnJlY3RseSBpbiB0aG9zZSBzaXR1YXRpb25zLiAgVGhlCitmaXhlcyBhcHBseSBvbmx5IHRvIGZlYXR1cmVzIChjYWxscyBhbmQgcGFyYW1ldGVycykgbm90IHVzZWQgYnkKK2J6aXAyLmMsIHNvIHRoZSBub24tZml4ZWRuZXNzIG9mIHRoZW0gaW4gcHJldmlvdXMgdmVyc2lvbnMgaGFzIG5vCitlZmZlY3Qgb24gcmVsaWFiaWxpdHkgb2YgYnppcDIuYy4KKworSW4gYnpsaWIuYzoKKyAgICogbWFkZSB6ZXJvLWxlbmd0aCBCWl9GTFVTSCB3b3JrIGNvcnJlY3RseSBpbiBiekNvbXByZXNzKCkuCisgICAqIGZpeGVkIGJ6V3JpdGUvYnpSZWFkIHRvIGlnbm9yZSB6ZXJvLWxlbmd0aCByZXF1ZXN0cy4KKyAgICogZml4ZWQgYnpyZWFkIHRvIGNvcnJlY3RseSBoYW5kbGUgcmVhZCByZXF1ZXN0cyBhZnRlciBFT0YuCisgICAqIHdyb25nIHBhcmFtZXRlciBvcmRlciBpbiBjYWxsIHRvIGJ6RGVjb21wcmVzc0luaXQgaW4KKyAgICAgYnpCdWZmVG9CdWZmRGVjb21wcmVzcy4gIEZpeGVkLgorCitJbiBjb21wcmVzcy5jOgorICAgKiBjaGFuZ2VkIHNldHRpbmcgb2Ygbkdyb3VwcyBpbiBzZW5kTVRGVmFsdWVzKCkgc28gYXMgdG8gCisgICAgIGRvIGEgYml0IGJldHRlciBvbiBzbWFsbCBmaWxlcy4gIFRoaXMgX2RvZXNfIGVmZmVjdAorICAgICBiemlwMi5jLgorCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCBhNDNlYTIxLi4zZGUwMzAxIDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTEsMzM5ICsxLDM5IEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKLSBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKLSBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KK1RoaXMgcHJvZ3JhbSwgImJ6aXAyIiBhbmQgYXNzb2NpYXRlZCBsaWJyYXJ5ICJsaWJiemlwMiIsIGFyZQorY29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotCQkJICAgIFByZWFtYmxlCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKIAotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAKLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuICBJZiB5b3UgdXNlIHRoaXMgCisgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91Ci1kaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCiszLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KKzQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAgIHBlcm1pc3Npb24uCiAKLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCitHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KK0p1bGlhbiBTZXdhcmQsIEd1aWxkZm9yZCwgU3VycmV5LCBVSy4KK2pzZXdhcmRAYWNtLm9yZworYnppcDIvbGliYnppcDIgdmVyc2lvbiAwLjkuMCBvZiAyOCBKdW5lIDE5OTgKIAotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCUFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA5ZDM1YjQzLi44ZWJlYTY2IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSwzMCArMSw0NiBAQAogCi1DQyA9IGdjYwotU0ggPSAvYmluL3NoCitDQz1nY2MKK0NGTEFHUz0tV2FsbCAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1zdHJlbmd0aC1yZWR1Y2UKIAotQ0ZMQUdTID0gLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mdW5yb2xsLWxvb3BzCitPQkpTPSBibG9ja3NvcnQubyAgXAorICAgICAgaHVmZm1hbi5vICAgIFwKKyAgICAgIGNyY3RhYmxlLm8gICBcCisgICAgICByYW5kdGFibGUubyAgXAorICAgICAgY29tcHJlc3MubyAgIFwKKyAgICAgIGRlY29tcHJlc3MubyBcCisgICAgICBiemxpYi5vCiAKK2FsbDogbGliIGJ6aXAyIHRlc3QKIAotCi1hbGw6Ci0JY2F0IHdvcmRzMAotCSQoQ0MpICQoQ0ZMQUdTKSAtbyBiemlwMiBiemlwMi5jCitiemlwMjogbGliCisJJChDQykgJChDRkxBR1MpIC1jIGJ6aXAyLmMKKwkkKENDKSAkKENGTEFHUykgLW8gYnppcDIgYnppcDIubyAtTC4gLWxiejIKIAkkKENDKSAkKENGTEFHUykgLW8gYnppcDJyZWNvdmVyIGJ6aXAycmVjb3Zlci5jCi0Jcm0gLWYgYnVuemlwMgotCWxuIC1zIC4vYnppcDIgLi9idW56aXAyCi0JY2F0IHdvcmRzMQorCitsaWI6ICQoT0JKUykKKwlybSAtZiBsaWJiejIuYQorCWFyIGNscSBsaWJiejIuYSAkKE9CSlMpCisKK3Rlc3Q6IGJ6aXAyCisJQGNhdCB3b3JkczEKIAkuL2J6aXAyIC0xIDwgc2FtcGxlMS5yZWYgPiBzYW1wbGUxLnJiMgogCS4vYnppcDIgLTIgPCBzYW1wbGUyLnJlZiA+IHNhbXBsZTIucmIyCi0JLi9idW56aXAyIDwgc2FtcGxlMS5iejIgPiBzYW1wbGUxLnRzdAotCS4vYnVuemlwMiA8IHNhbXBsZTIuYnoyID4gc2FtcGxlMi50c3QKLQljYXQgd29yZHMyCisJLi9iemlwMiAtZCA8IHNhbXBsZTEuYnoyID4gc2FtcGxlMS50c3QKKwkuL2J6aXAyIC1kIDwgc2FtcGxlMi5iejIgPiBzYW1wbGUyLnRzdAorCUBjYXQgd29yZHMyCiAJY21wIHNhbXBsZTEuYnoyIHNhbXBsZTEucmIyIAogCWNtcCBzYW1wbGUyLmJ6MiBzYW1wbGUyLnJiMgogCWNtcCBzYW1wbGUxLnRzdCBzYW1wbGUxLnJlZgogCWNtcCBzYW1wbGUyLnRzdCBzYW1wbGUyLnJlZgotCWNhdCB3b3JkczMKKwlAY2F0IHdvcmRzMwogCiAKLWNsZWFuOgotCXJtIC1mIGJ6aXAyIGJ1bnppcDIgYnppcDJyZWNvdmVyIHNhbXBsZSoudHN0IHNhbXBsZSoucmIyCitjbGVhbjogCisJcm0gLWYgKi5vIGxpYmJ6Mi5hIGJ6aXAyIGJ6aXAycmVjb3ZlciBzYW1wbGUxLnJiMiBzYW1wbGUyLnJiMiBzYW1wbGUxLnRzdCBzYW1wbGUyLnRzdAorCisuYy5vOiAkKi5vIGJ6bGliLmggYnpsaWJfcHJpdmF0ZS5oCisJJChDQykgJChDRkxBR1MpIC1jICQqLmMgLW8gJCoubworCit0YXJmaWxlOgorCXRhciBjdmYgaW50ZXJpbS50YXIgKi5jICouaCBNYWtlZmlsZSBtYW51YWwudGV4aSBtYW51YWwucHMgTElDRU5TRSBiemlwMi4xIGJ6aXAyLjEucHJlZm9ybWF0dGVkIGJ6aXAyLnR4dCB3b3JkczEgd29yZHMyIHdvcmRzMyBzYW1wbGUxLnJlZiBzYW1wbGUyLnJlZiBzYW1wbGUxLmJ6MiBzYW1wbGUyLmJ6MiAqLmh0bWwgUkVBRE1FIENIQU5HRVMgbGliYnoyLmRlZiBsaWJiejIuZHNwIGRsbHRlc3QuZHNwIAogCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggZDU4YmI0OS4uMmY1OWVmNyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSwxOTQgKzEsNjEgQEAKIAotR1JFRVRJTkdTIQogCi0gICBUaGlzIGlzIHRoZSBSRUFETUUgZm9yIGJ6aXAyLCBteSBibG9jay1zb3J0aW5nIGZpbGUgY29tcHJlc3NvciwKLSAgIHZlcnNpb24gMC4xLiAgCitUaGlzIGlzIHRoZSBSRUFETUUgZm9yIGJ6aXAyLCBhIGJsb2NrLXNvcnRpbmcgZmlsZSBjb21wcmVzc29yLCB2ZXJzaW9uCiswLjkuMC4gIFRoaXMgdmVyc2lvbiBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHB1YmxpYworcmVsZWFzZSwgYnppcDItMC4xcGwyLgogCi0gICBiemlwMiBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyOwotICAgZm9yIGRldGFpbHMsIHNlZSB0aGUgZmlsZSBMSUNFTlNFLiAgUG9pbnRlcnMgdG8gdGhlIGFsZ29yaXRobXMgdXNlZAotICAgYXJlIGluIEFMR09SSVRITVMuICBJbnN0cnVjdGlvbnMgZm9yIHVzZSBhcmUgaW4gYnppcDIuMS5wcmVmb3JtYXR0ZWQuCitiemlwMi0wLjkuMCBpcyBkaXN0cmlidXRlZCB1bmRlciBhIEJTRC1zdHlsZSBsaWNlbnNlLiAgRm9yIGRldGFpbHMsCitzZWUgdGhlIGZpbGUgTElDRU5TRS4KIAotICAgUGxlYXNlIHJlYWQgYWxsIG9mIHRoaXMgZmlsZSBjYXJlZnVsbHkuCitDb21wbGV0ZSBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBpbiBQb3N0c2NyaXB0IGZvcm0gKG1hbnVhbC5wcykKK29yIGh0bWwgKG1hbnVhbF90b2MuaHRtbCkuICBBIHBsYWluLXRleHQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHBhZ2UgaXMKK2F2YWlsYWJsZSBhcyBiemlwMi50eHQuCiAKIAorSE9XIFRPIEJVSUxEIC0tIFVOSVgKIAotSE9XIFRPIEJVSUxECitUeXBlIGBtYWtlJy4KIAotICAgLS0gZm9yIFVOSVg6CitUaGlzIGNyZWF0ZXMgYmluYXJpZXMgImJ6aXAyIiBhbmQgImJ6aXAycmVjb3ZlciIuCiAKLSAgICAgICAgVHlwZSBgbWFrZScuICAgICAodG91Z2gsIGh1aD8gOi0pCitJdCBhbHNvIHJ1bnMgZm91ciBjb21wcmVzcy1kZWNvbXByZXNzIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlCit3b3JraW5nIHByb3Blcmx5LiAgSWYgYWxsIGdvZXMgd2VsbCwgeW91IHNob3VsZCBiZSB1cCAmIHJ1bm5pbmcuCitQbGVhc2UgYmUgc3VyZSB0byByZWFkIHRoZSBvdXRwdXQgZnJvbSBgbWFrZScganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlCit0ZXN0cyB3ZW50IG9rLgogCi0gICAgICAgIFRoaXMgY3JlYXRlcyBiaW5hcmllcyAiYnppcDIiLCBhbmQgImJ1bnppcDIiLAotICAgICAgICB3aGljaCBpcyBhIHN5bWJvbGljIGxpbmsgdG8gImJ6aXAyIi4KK1RvIGluc3RhbGwgYnppcDIgcHJvcGVybHk6CiAKLSAgICAgICAgSXQgYWxzbyBydW5zIGZvdXIgY29tcHJlc3MtZGVjb21wcmVzcyB0ZXN0cyB0byBtYWtlIHN1cmUKLSAgICAgICAgdGhpbmdzIGFyZSB3b3JraW5nIHByb3Blcmx5LiAgSWYgYWxsIGdvZXMgd2VsbCwgeW91IHNob3VsZCBiZSB1cCAmCi0gICAgICAgIHJ1bm5pbmcuICBQbGVhc2UgYmUgc3VyZSB0byByZWFkIHRoZSBvdXRwdXQgZnJvbSBgbWFrZScKLSAgICAgICAganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIHRlc3RzIHdlbnQgb2suCisqIENvcHkgdGhlIGJpbmFyaWVzICJiemlwMiIgYW5kICJiemlwMnJlY292ZXIiIHRvIGEgcHVibGljYWxseSB2aXNpYmxlIAorICBwbGFjZSwgcG9zc2libHkgL3Vzci9iaW4gb3IgL3Vzci9sb2NhbC9iaW4uCiAKLSAgICAgICAgVG8gaW5zdGFsbCBiemlwMiBwcm9wZXJseToKKyogSW4gdGhhdCBkaXJlY3RvcnksIG1ha2UgImJ1bnppcDIiIGFuZCAiYnpjYXQiIGJlIHN5bWJvbGljIGxpbmtzCisgIHRvICJiemlwMiIuCiAKLSAgICAgICAgICAgLS0gQ29weSB0aGUgYmluYXJ5ICJiemlwMiIgdG8gYSBwdWJsaWNhbGx5IHZpc2libGUgcGxhY2UsCi0gICAgICAgICAgICAgIHBvc3NpYmx5IC91c3IvYmluLCAvdXNyL2NvbW1vbi9iaW4gb3IgL3Vzci9sb2NhbC9iaW4uCisqIENvcHkgdGhlIG1hbnVhbCBwYWdlLCBiemlwMi4xLCB0byB0aGUgcmVsZXZhbnQgcGxhY2UuCisgIFByb2JhYmx5IHRoZSByaWdodCBwbGFjZSBpcyAvdXNyL21hbi9tYW4xLy4KIAotICAgICAgICAgICAtLSBJbiB0aGF0IGRpcmVjdG9yeSwgbWFrZSAiYnVuemlwMiIgYmUgYSBzeW1ib2xpYyBsaW5rCi0gICAgICAgICAgICAgIHRvICJiemlwMiIuCitJZiB5b3Ugd2FudCB0byBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSdsbCBuZWVkIHRvIGNvcHkgbGliYnoyLmEKK2FuZCBiemxpYi5oIHRvIC91c3IvbGliIGFuZCAvdXNyL2luY2x1ZGUgcmVzcGVjdGl2ZWx5LgorICAKIAotICAgICAgICAgICAtLSBDb3B5IHRoZSBtYW51YWwgcGFnZSwgYnppcDIuMSwgdG8gdGhlIHJlbGV2YW50IHBsYWNlLgotICAgICAgICAgICAgICBQcm9iYWJseSB0aGUgcmlnaHQgcGxhY2UgaXMgL3Vzci9tYW4vbWFuMS8uCi0gICAKLSAgIC0tIGZvciBXaW5kb3dzIDk1IGFuZCBOVDogCitIT1cgVE8gQlVJTEQgLS0gV2luZG93cyA5NSwgTlQsIERPUywgTWFjLCBldGMuCiAKLSAgICAgICAgRm9yIGEgc3RhcnQsIGRvIHlvdSAqcmVhbGx5KiB3YW50IHRvIHJlY29tcGlsZSBiemlwMj8gIAotICAgICAgICBUaGUgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIGEgcHJlLWNvbXBpbGVkIHZlcnNpb24KLSAgICAgICAgZm9yIFdpbmRvd3MgOTUgYW5kIE5ULCBgYnppcDIuZXhlJy4KLQotICAgICAgICBUaGlzIGV4ZWN1dGFibGUgd2FzIGNyZWF0ZWQgd2l0aCBKYWNvYiBOYXZpYSdzIGV4Y2VsbGVudAotICAgICAgICBwb3J0IHRvIFdpbjMyIG9mIENocmlzIEZyYXNlciAmIERhdmlkIEhhbnNvbidzIGV4Y2VsbGVudAotICAgICAgICBBTlNJIEMgY29tcGlsZXIsICJsY2MiLiAgWW91IGNhbiBnZXQgdG8gaXQgYXQgdGhlIHBhZ2VzCi0gICAgICAgIG9mIHRoZSBDUyBkZXBhcnRtZW50IG9mIFByaW5jZXRvbiBVbml2ZXJzaXR5LCAKLSAgICAgICAgd3d3LmNzLnByaW5jZXRvbi5lZHUuICAKLSAgICAgICAgSSBoYXZlIG5vdCB0cmllZCB0byBjb21waWxlIHRoaXMgdmVyc2lvbiBvZiBiemlwMiB3aXRoCi0gICAgICAgIGEgY29tbWVyY2lhbCBDIGNvbXBpbGVyIHN1Y2ggYXMgTVMgVmlzdWFsIEMsIGFzIEkgZG9uJ3QKLSAgICAgICAgaGF2ZSBvbmUgYXZhaWxhYmxlLgotCi0gICAgICAgIE5vdGUgdGhhdCBsY2MgaXMgZGVzaWduZWQgcHJpbWFyaWx5IHRvIGJlIHBvcnRhYmxlIGFuZAotICAgICAgICBmYXN0LiAgQ29kZSBxdWFsaXR5IGlzIGEgc2Vjb25kYXJ5IGFpbSwgc28gYnppcDIuZXhlCi0gICAgICAgIHJ1bnMgcGVyaGFwcyA0MCUgc2xvd2VyIHRoYW4gaXQgY291bGQgaWYgY29tcGlsZWQgd2l0aAotICAgICAgICBhIGdvb2Qgb3B0aW1pc2luZyBjb21waWxlci4KLQotICAgICAgICBJIGNvbXBpbGVkIGEgcHJldmlvdXMgdmVyc2lvbiBvZiBiemlwICgwLjIxKSB3aXRoIEJvcmxhbmQKLSAgICAgICAgQyA1LjAsIHdoaWNoIHdvcmtlZCBmaW5lLCBhbmQgd2l0aCBNUyBWQysrIDIuMCwgd2hpY2gKLSAgICAgICAgZGlkbid0LiAgSGVyZSBpcyBhbiBjb21tZW50IGZyb20gdGhlIFJFQURNRSBmb3IgYnppcC0wLjIxLgotCi0gICAgICAgICAgIE1TIFZDKysgMi4wJ3Mgb3B0aW1pc2luZyBjb21waWxlciBoYXMgYSBidWcgd2hpY2gsIGF0IAotICAgICAgICAgICBtYXhpbXVtIG9wdGltaXNhdGlvbiwgZ2l2ZXMgYW4gZXhlY3V0YWJsZSB3aGljaCBwcm9kdWNlcyAKLSAgICAgICAgICAgZ2FyYmFnZSBjb21wcmVzc2VkIGZpbGVzLiAgUHJvY2VlZCB3aXRoIGNhdXRpb24uIAotICAgICAgICAgICBJIGRvIG5vdCBrbm93IHdoZXRoZXIgb3Igbm90IHRoaXMgaGFwcGVucyB3aXRoIGxhdGVyIAotICAgICAgICAgICB2ZXJzaW9ucyBvZiBWQysrLgotCi0gICAgICAgICAgIEVkaXQgdGhlIGRlZmluZXMgc3RhcnRpbmcgYXQgbGluZSA4NiBvZiBiemlwLmMgdG8gCi0gICAgICAgICAgIHNlbGVjdCB5b3VyIHBsYXRmb3JtL2NvbXBpbGVyIGNvbWJpbmF0aW9uLCBhbmQgdGhlbiBjb21waWxlLgotICAgICAgICAgICBUaGVuIGNoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIChhc3N1bWVkIHRvIGJlIAotICAgICAgICAgICBjYWxsZWQgYnppcC5leGUpIHdvcmtzIGNvcnJlY3RseSwgdXNpbmcgdGhlIFNFTEZURVNULkJBVCBmaWxlLiAgCi0gICAgICAgICAgIEJlYXJpbmcgaW4gbWluZCB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCB0aGUgc2VsZi10ZXN0IGlzCi0gICAgICAgICAgIGltcG9ydGFudC4KLQotICAgICAgICBOb3RlIHRoYXQgdGhlIGRlZmluZXMgd2hpY2ggYnppcC0wLjIxIGhhZCwgdG8gc3VwcG9ydCAKLSAgICAgICAgY29tcGlsYXRpb24gd2l0aCBWQyAyLjAgYW5kIEJDIDUuMCwgYXJlIGdvbmUuICBXaW5kb3dzCi0gICAgICAgIGlzIG5vdCBteSBwcmVmZXJyZWQgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIEkgYW0sIGZvciB0aGUKLSAgICAgICAgbW9tZW50LCBjb250ZW50IHdpdGggdGhlIG1vZGVzdGx5IGZhc3QgZXhlY3V0YWJsZSBjcmVhdGVkCi0gICAgICAgIGJ5IGxjYy13aW4zMi4KLQotICAgQSBtYW51YWwgcGFnZSBpcyBzdXBwbGllZCwgdW5mb3JtYXR0ZWQgKGJ6aXAyLjEpLAotICAgcHJlZm9ybWF0dGVkIChiemlwMi4xLnByZWZvcm1hdHRlZCksIGFuZCBwcmVmb3JtYXR0ZWQKLSAgIGFuZCBzYW5pdGlzZWQgZm9yIE1TLURPUyAoYnppcDIudHh0KS4KLQotICAgCi0KLUNPTVBJTEFUSU9OIE5PVEVTCi0KLSAgIGJ6aXAyIHNob3VsZCB3b3JrIG9uIGFueSAzMiBvciA2NC1iaXQgbWFjaGluZS4gIEl0IGlzIGtub3duIHRvIHdvcmsKLSAgIFttZWFuaW5nOiBpdCBoYXMgY29tcGlsZWQgYW5kIHBhc3NlZCBzZWxmLXRlc3RzXSBvbiB0aGUgCi0gICBmb2xsb3dpbmcgcGxhdGZvcm0tb3MgY29tYmluYXRpb25zOgotCi0gICAgICBJbnRlbCBpMzg2L2k0ODYgICAgICAgIHJ1bm5pbmcgTGludXggMi4wLjIxCi0gICAgICBTdW4gU3BhcmNzICh2YXJpb3VzKSAgIHJ1bm5pbmcgU3VuT1MgNC4xLjQgYW5kIFNvbGFyaXMgMi41Ci0gICAgICBJbnRlbCBpMzg2L2k0ODYgICAgICAgIHJ1bm5pbmcgV2luZG93cyA5NSBhbmQgTlQKLSAgICAgIERFQyBBbHBoYSAgICAgICAgICAgICAgcnVubmluZyBEaWdpdGFsIFVuaXggNC4wCi0KLSAgIEZvbGxvd2luZyB0aGUgcmVsZWFzZSBvZiBiemlwLTAuMjEsIG1hbnkgcGVvcGxlIG1haWxlZCBtZQotICAgZnJvbSBhcm91bmQgdGhlIHdvcmxkIHRvIHNheSB0aGV5IGhhZCBtYWRlIGl0IHdvcmsgb24gYWxsIHNvcnRzCi0gICBvZiB3ZWlyZCBhbmQgd29uZGVyZnVsIG1hY2hpbmVzLiAgQ2hhbmNlcyBhcmUsIGlmIHlvdSBoYXZlCi0gICBhIHJlYXNvbmFibGUgQU5TSSBDIGNvbXBpbGVyIGFuZCBhIDMyLWJpdCBtYWNoaW5lLCB5b3UgY2FuCi0gICBnZXQgaXQgdG8gd29yay4KLQotICAgVGhlICNkZWZpbmVzIHN0YXJ0aW5nIGF0IGFyb3VuZCBsaW5lIDgyIG9mIGJ6aXAyLmMgc3VwcGx5IHNvbWUKLSAgIGRlZ3JlZSBvZiBwbGF0Zm9ybS1pbmRlcGVuZGFuY2UuICBJZiB5b3UgY29uZmlndXJlIGJ6aXAyIGZvciBzb21lCi0gICBuZXcgZmFyLW91dCBwbGF0Zm9ybSB3aGljaCBpcyBub3QgY292ZXJlZCBieSB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbnMsCi0gICBwbGVhc2Ugc2VuZCBtZSB0aGUgcmVsZXZhbnQgZGVmaW5pdGlvbnMuCi0KLSAgIEkgcmVjb21tZW5kIEdOVSBDIGZvciBjb21waWxhdGlvbi4gIFRoZSBjb2RlIGlzIHN0YW5kYXJkIEFOU0kgQywKLSAgIGV4Y2VwdCBmb3IgdGhlIFVuaXgtc3BlY2lmaWMgZmlsZSBoYW5kbGluZywgc28gYW55IEFOU0kgQyBjb21waWxlcgotICAgc2hvdWxkIHdvcmsuICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgbWFueSByb3V0aW5lcyBtYXJrZWQgSU5MSU5FCi0gICBzaG91bGQgYmUgaW5saW5lZCBieSB5b3VyIGNvbXBpbGVyLCBlbHNlIHBlcmZvcm1hbmNlIHdpbGwgYmUgdmVyeQotICAgcG9vci4gIEFza2luZyB5b3VyIGNvbXBpbGVyIHRvIHVucm9sbCBsb29wcyBnaXZlcyBzb21lCi0gICBzbWFsbCBpbXByb3ZlbWVudCB0b287IGZvciBnY2MsIHRoZSByZWxldmFudCBmbGFnIGlzCi0gICAtZnVucm9sbC1sb29wcy4KLQotICAgT24gYSAzODYvNDg2IG1hY2hpbmVzLCBJJ2QgcmVjb21tZW5kIGdpdmluZyBnY2MgdGhlCi0gICAtZm9taXQtZnJhbWUtcG9pbnRlciBmbGFnOyB0aGlzIGxpYmVyYXRlcyBhbm90aGVyIHJlZ2lzdGVyIGZvcgotICAgYWxsb2NhdGlvbiwgd2hpY2ggbWVhc3VyYWJseSBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KLQotICAgSSB1c2VkIHRoZSBhYm92ZW1lbnRpb25lZCBsY2MgY29tcGlsZXIgdG8gZGV2ZWxvcCBiemlwMi4KLSAgIEkgd291bGQgaGlnaGx5IHJlY29tbWVuZCB0aGlzIGNvbXBpbGVyIGZvciBkYXktdG8tZGF5IGRldmVsb3BtZW50OwotICAgaXQgaXMgZmFzdCwgcmVsaWFibGUsIGxpZ2h0d2VpZ2h0LCBoYXMgYW4gZXhjZWxsZW50IHByb2ZpbGVyLAotICAgYW5kIGlzIGdlbmVyYWxseSBleGNlbGxlbnQuICBBbmQgaXQncyBmdW4gdG8gcmV0YXJnZXQsIGlmIHlvdSdyZQotICAgaW50byB0aGF0IGtpbmQgb2YgdGhpbmcuCi0KLSAgIElmIHlvdSBjb21waWxlIGJ6aXAyIG9uIGEgbmV3IHBsYXRmb3JtIG9yIHdpdGggYSBuZXcgY29tcGlsZXIsCi0gICBwbGVhc2UgYmUgc3VyZSB0byBydW4gdGhlIGZvdXIgY29tcHJlc3MtZGVjb21wcmVzcyB0ZXN0cywgZWl0aGVyCi0gICB1c2luZyB0aGUgTWFrZWZpbGUsIG9yIHdpdGggdGhlIHRlc3QuYmF0IChNU0RPUykgb3IgdGVzdC5jbWQgKE9TLzIpCi0gICBmaWxlcy4gIFNvbWUgY29tcGlsZXJzIGhhdmUgYmVlbiBzZWVuIHRvIGludHJvZHVjZSBzdWJ0bGUgYnVncwotICAgd2hlbiBvcHRpbWlzaW5nLCBzbyB0aGlzIGNoZWNrIGlzIGltcG9ydGFudC4gIElkZWFsbHkgeW91IHNob3VsZAotICAgdGhlbiBnbyBvbiB0byB0ZXN0IGJ6aXAyIG9uIGEgZmlsZSBzZXZlcmFsIG1lZ2FieXRlcyBvciBldmVuCi0gICB0ZW5zIG9mIG1lZ2FieXRlcyBsb25nLCBqdXN0IHRvIGJlIDExMCUgc3VyZS4gIGBgUHJvZmVzc2lvbmFsCi0gICBwcm9ncmFtbWVycyBhcmUgcGFyYW5vaWQgcHJvZ3JhbW1lcnMuJycgKGFub24pLgotCitJdCdzIGRpZmZpY3VsdCBmb3IgbWUgdG8gc3VwcG9ydCBjb21waWxhdGlvbiBvbiBhbGwgdGhlc2UgcGxhdGZvcm1zLgorTXkgYXBwcm9hY2ggaXMgdG8gY29sbGVjdCBiaW5hcmllcyBmb3IgdGhlc2UgcGxhdGZvcm1zLCBhbmQgcHV0IHRoZW0KK29uIG15IHdlYiBwYWdlIChodHRwOi8vd3d3Lm11cmFyb2EuZGVtb24uY28udWspLiAgTG9vayB0aGVyZS4KIAogCiBWQUxJREFUSU9OCiAKLSAgIENvcnJlY3Qgb3BlcmF0aW9uLCBpbiB0aGUgc2Vuc2UgdGhhdCBhIGNvbXByZXNzZWQgZmlsZSBjYW4gYWx3YXlzIGJlCi0gICBkZWNvbXByZXNzZWQgdG8gcmVwcm9kdWNlIHRoZSBvcmlnaW5hbCwgaXMgb2J2aW91c2x5IG9mIHBhcmFtb3VudAotICAgaW1wb3J0YW5jZS4gIFRvIHZhbGlkYXRlIGJ6aXAyLCBJIHVzZWQgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIAotICAgTWFyayBOZWxzb24ncyBjaHVybiBwcm9ncmFtLiAgQ2h1cm4gaXMgYW4gYXV0b21hdGVkIHRlc3QgZHJpdmVyCi0gICB3aGljaCByZWN1cnNpdmVseSB0cmF2ZXJzZXMgYSBkaXJlY3Rvcnkgc3RydWN0dXJlLCB1c2luZyBiemlwMiB0bwotICAgY29tcHJlc3MgYW5kIHRoZW4gZGVjb21wcmVzcyBlYWNoIGZpbGUgaXQgZW5jb3VudGVycywgYW5kIGNoZWNraW5nCi0gICB0aGF0IHRoZSBkZWNvbXByZXNzZWQgZGF0YSBpcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwuICBBcyB0ZXN0IAotICAgbWF0ZXJpYWwsIEkgdXNlZCBzZXZlcmFsIHJ1bnMgb3ZlciBzZXZlcmFsIGZpbGVzeXN0ZW1zIG9mIGRpZmZlcmluZwotICAgc2l6ZXMuCitDb3JyZWN0IG9wZXJhdGlvbiwgaW4gdGhlIHNlbnNlIHRoYXQgYSBjb21wcmVzc2VkIGZpbGUgY2FuIGFsd2F5cyBiZQorZGVjb21wcmVzc2VkIHRvIHJlcHJvZHVjZSB0aGUgb3JpZ2luYWwsIGlzIG9idmlvdXNseSBvZiBwYXJhbW91bnQKK2ltcG9ydGFuY2UuICBUbyB2YWxpZGF0ZSBiemlwMiwgSSB1c2VkIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiBNYXJrCitOZWxzb24ncyBjaHVybiBwcm9ncmFtLiAgQ2h1cm4gaXMgYW4gYXV0b21hdGVkIHRlc3QgZHJpdmVyIHdoaWNoCityZWN1cnNpdmVseSB0cmF2ZXJzZXMgYSBkaXJlY3Rvcnkgc3RydWN0dXJlLCB1c2luZyBiemlwMiB0byBjb21wcmVzcworYW5kIHRoZW4gZGVjb21wcmVzcyBlYWNoIGZpbGUgaXQgZW5jb3VudGVycywgYW5kIGNoZWNraW5nIHRoYXQgdGhlCitkZWNvbXByZXNzZWQgZGF0YSBpcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwuICBUaGVyZSBhcmUgbW9yZSBkZXRhaWxzCitpbiBTZWN0aW9uIDQgb2YgdGhlIHVzZXIgZ3VpZGUuCiAKLSAgIE9uZSBzZXQgb2YgdGVzdHMgd2FzIGRvbmUgb24gbXkgYmFzZSBMaW51eCBmaWxlc3lzdGVtLAotICAgNDEwIG1lZ2FieXRlcyBpbiAyMywwMDAgZmlsZXMuICBUaGVyZSB3ZXJlIHNldmVyYWwgcnVucyBvdmVyCi0gICB0aGlzIGZpbGVzeXN0ZW0sIGluIHZhcmlvdXMgY29uZmlndXJhdGlvbnMgZGVzaWduZWQgdG8gYnJlYWsgYnppcDIuCi0gICBUaGF0IGZpbGVzeXN0ZW0gYWxzbyBjb250YWluZWQgc29tZSBzcGVjaWFsbHkgY29uc3RydWN0ZWQgdGVzdAotICAgZmlsZXMgZGVzaWduZWQgdG8gZXhlcmNpc2UgYm91bmRhcnkgY2FzZXMgaW4gdGhlIGNvZGUuCi0gICBUaGlzIGluY2x1ZGVkIGZpbGVzIG9mIHplcm8gbGVuZ3RoLCB2YXJpb3VzIGxvbmcsIGhpZ2hseSByZXBldGl0aXZlIAotICAgZmlsZXMsIGFuZCBzb21lIGZpbGVzIHdoaWNoIGdlbmVyYXRlIGJsb2NrcyB3aXRoIGFsbCB2YWx1ZXMgdGhlIHNhbWUuCi0KLSAgIFRoZSBvdGhlciBzZXQgb2YgdGVzdHMgd2FzIGRvbmUganVzdCB3aXRoIHRoZSAibm9ybWFsIiBjb25maWd1cmF0aW9uLAotICAgYnV0IG9uIGEgbXVjaCBsYXJnZXIgcXVhbnRpdHkgb2YgZGF0YS4KLQotICAgICAgVGVzdHMgYXJlOgotCi0gICAgICAgICBMaW51eCBGUywgNDEwTSwgMjMwMDAgZmlsZXMKLQotICAgICAgICAgQXMgYWJvdmUsIHdpdGggLS1yZXBldGl0aXZlLWZhc3QKLQotICAgICAgICAgQXMgYWJvdmUsIHdpdGggLTEKLQotICAgICAgICAgTG93IGxldmVsIGRpc2sgaW1hZ2Ugb2YgYSBkaXNrIGNvbnRhaW5pbmcKLSAgICAgICAgICAgIFdpbmRvd3MgTlQ0LjA7IDQyME0gaW4gYSBzaW5nbGUgaHVnZSBmaWxlCi0KLSAgICAgICAgIExpbnV4IGRpc3RyaWJ1dGlvbiwgaW5jbCBTbGFja3dhcmUsIAotICAgICAgICAgICAgYWxsIEdOVSBzb3VyY2VzLiAgIDE5MDBNIGluIDIzMDAgZmlsZXMuCi0KLSAgICAgICAgIEFwcHJveCB+MTAwTSBjb21waWxlciBzb3VyY2VzIGFuZCByZWxhdGVkCi0gICAgICAgICAgICBwcm9ncmFtbWluZyB0b29scywgcnVubmluZyB1bmRlciBQdXJpZnkuCi0KLSAgICAgICAgIEFib3V0IDUwME0gb2YgZGF0YSBpbiAxMjAgZmlsZXMgb2YgYXJvdW5kCi0gICAgICAgICAgICA0IE0gZWFjaC4gIFRoaXMgaXMgcmF3IGRhdGEgZnJvbSBhIAotICAgICAgICAgICAgYmlvbWFnbmV0b21ldGVyIChTUVVJRC1iYXNlZCB0aGluZykuCi0KLSAgICAgIE92ZXJhbGwsIHRvdGFsIHZvbHVtZSBvZiB0ZXN0IGRhdGEgaXMgYWJvdXQKLSAgICAgICAgIDMzMDAgbWVnYWJ5dGVzIGluIDI1MDAwIGZpbGVzLgotCi0gICBUaGUgZGlzdHJpYnV0aW9uIGRvZXMgZm91ciB0ZXN0cyBhZnRlciBidWlsZGluZyBiemlwLiAgVGhlc2UgdGVzdHMKLSAgIGluY2x1ZGUgdGVzdCBkZWNvbXByZXNzaW9ucyBvZiBwcmUtc3VwcGxpZWQgY29tcHJlc3NlZCBmaWxlcywgc28KLSAgIHRoZXkgbm90IG9ubHkgdGVzdCB0aGF0IGJ6aXAgd29ya3MgY29ycmVjdGx5IG9uIHRoZSBtYWNoaW5lIGl0IHdhcwotICAgYnVpbHQgb24sIGJ1dCBjYW4gYWxzbyBkZWNvbXByZXNzIGZpbGVzIGNvbXByZXNzZWQgb24gYSBkaWZmZXJlbnQKLSAgIG1hY2hpbmUuICBUaGlzIGd1YXJkcyBhZ2FpbnN0IHVuZm9yc2VlbiBpbnRlcm9wZXJhYmlsaXR5IHByb2JsZW1zLgogCiAKIFBsZWFzZSByZWFkIGFuZCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOgpAQCAtMjM0LDE0ICsxMDEsMzAgQEAKIEVuZCBvZiBsZWdhbGl0aWVzLgogCiAKK1dIQVQnUyBORVcgSU4gMC45LjAgKGFzIGNvbXBhcmVkIHRvIDAuMXBsMikgPworCisgICAqIEFwcHJveCAxMCUgZmFzdGVyIGNvbXByZXNzaW9uLCAzMCUgZmFzdGVyIGRlY29tcHJlc3Npb24KKyAgICogLXQgKHRlc3QgbW9kZSkgaXMgYSBsb3QgcXVpY2tlcgorICAgKiBDYW4gZGVjb21wcmVzcyBjb25jYXRlbmF0ZWQgY29tcHJlc3NlZCBmaWxlcworICAgKiBQcm9ncmFtbWluZyBpbnRlcmZhY2UsIHNvIHByb2dyYW1zIGNhbiBkaXJlY3RseSByZWFkL3dyaXRlIC5iejIgZmlsZXMKKyAgICogTGVzcyByZXN0cmljdGl2ZSAoQlNELXN0eWxlKSBsaWNlbnNpbmcKKyAgICogRmxhZyBoYW5kbGluZyBtb3JlIGNvbXBhdGlibGUgd2l0aCBHTlUgZ3ppcAorICAgKiBNdWNoIG1vcmUgZG9jdW1lbnRhdGlvbiwgaS5lLiwgYSBwcm9wZXIgdXNlciBtYW51YWwKKyAgICogSG9wZWZ1bGx5LCBpbXByb3ZlZCBwb3J0YWJpbGl0eSAoYXQgbGVhc3Qgb2YgdGhlIGxpYnJhcnkpCisKKwogSSBob3BlIHlvdSBmaW5kIGJ6aXAyIHVzZWZ1bC4gIEZlZWwgZnJlZSB0byBjb250YWN0IG1lIGF0CiAgICBqc2V3YXJkQGFjbS5vcmcKIGlmIHlvdSBoYXZlIGFueSBzdWdnZXN0aW9ucyBvciBxdWVyaWVzLiAgTWFueSBwZW9wbGUgbWFpbGVkIG1lIHdpdGgKLWNvbW1lbnRzLCBzdWdnZXN0aW9ucyBhbmQgcGF0Y2hlcyBhZnRlciB0aGUgcmVsZWFzZXMgb2YgMC4xNSBhbmQgMC4yMSwgCi1hbmQgdGhlIGNoYW5nZXMgaW4gYnppcDIgYXJlIGxhcmdlbHkgYSByZXN1bHQgb2YgdGhpcyBmZWVkYmFjay4KLUkgdGhhbmsgeW91IGZvciB5b3VyIGNvbW1lbnRzLgorY29tbWVudHMsIHN1Z2dlc3Rpb25zIGFuZCBwYXRjaGVzIGFmdGVyIHRoZSByZWxlYXNlcyBvZiBiemlwLTAuMTUsCitiemlwLTAuMjEgYW5kIGJ6aXAyLTAuMXBsMiwgYW5kIHRoZSBjaGFuZ2VzIGluIGJ6aXAyIGFyZSBsYXJnZWx5IGEKK3Jlc3VsdCBvZiB0aGlzIGZlZWRiYWNrLiAgSSB0aGFuayB5b3UgZm9yIHlvdXIgY29tbWVudHMuCisKK0F0IGxlYXN0IGZvciB0aGUgdGltZSBiZWluZywgYnppcDIncyAiaG9tZSIgaXMgCitodHRwOi8vd3d3Lm11cmFyb2EuZGVtb24uY28udWsuCiAKIEp1bGlhbiBTZXdhcmQKK2pzZXdhcmRAYWNtLm9yZwogCiBNYW5jaGVzdGVyLCBVSwogMTggSnVseSAxOTk2ICh2ZXJzaW9uIDAuMTUpCkBAIC0yNTAsNCArMTMzLDUgQEAKIEd1aWxkZm9yZCwgU3VycmV5LCBVSwogNyBBdWd1c3QgMTk5NyAoYnppcDIsIHZlcnNpb24gMC4xKQogMjkgQXVndXN0IDE5OTcgKGJ6aXAyLCB2ZXJzaW9uIDAuMXBsMikKKzIzIEF1Z3VzdCAxOTk4IChiemlwMiwgdmVyc2lvbiAwLjkuMCkKIApkaWZmIC0tZ2l0IGEvUkVBRE1FLkRPUyBiL1JFQURNRS5ET1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGRlOGMuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLkRPUworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQ0KLUFzIG9mIHRvZGF5ICgzIE1hcmNoIDE5OTgpIEkndmUgcmVtb3ZlZCB0aGUgDQotV2luOTUvTlQgZXhlY3V0YWJsZXMgZnJvbSB0aGlzIGRpc3RyaWJ1dGlvbiwgc29ycnkuDQotDQotWW91IGNhbiBzdGlsbCBnZXQgYW4gZXhlY3V0YWJsZSBmcm9tIA0KLWh0dHA6Ly93d3cubXVyYXJvYS5kZW1vbi5jby51aywgb3IgKGFzIGEgbGFzdA0KLXJlc29ydCkgYnkgbWFpbGluZyBtZSBhdCBqc2V3YXJkQGFjbS5vcmcuDQotDQotVGhlIHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2Ugb2YgcGFja2FnaW5nIGlzIHRoYXQgaXQNCi1tYWtlcyBpdCBlYXNpZXIgZm9yIG1lIHRvIGZpeCBwcm9ibGVtcyB3aXRoIHNwZWNpZmljDQotZXhlY3V0YWJsZXMgaWYgdGhleSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBtYWluDQotZGlzdHJpYnV0aW9uLg0KLQ0KLUoNCi0NCi0KZGlmZiAtLWdpdCBhL2Jsb2Nrc29ydC5jIGIvYmxvY2tzb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYjI2YQotLS0gL2Rldi9udWxsCisrKyBiL2Jsb2Nrc29ydC5jCkBAIC0wLDAgKzEsNzA5IEBACisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBCbG9jayBzb3J0aW5nIG1hY2hpbmVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzb3J0LmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0KKyAgVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBiemlwMiBhbmQvb3IgbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQKKyAgbGlicmFyeSBmb3IgbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBKdWxpYW4gUiBTZXdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyAKKyAgICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCAKKyAgICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisgIDMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKKyAgICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworICA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAgICAgcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgIEp1bGlhbiBTZXdhcmQsIEd1aWxkZm9yZCwgU3VycmV5LCBVSy4KKyAganNld2FyZEBhY20ub3JnCisgIGJ6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMC45LjBjIG9mIDE4IE9jdG9iZXIgMTk5OAorCisgIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiAoYXQgbGVhc3QpIHRoZSB3b3JrIG9mOgorICAgICBNaWtlIEJ1cnJvd3MKKyAgICAgRGF2aWQgV2hlZWxlcgorICAgICBQZXRlciBGZW53aWNrCisgICAgIEFsaXN0YWlyIE1vZmZhdAorICAgICBSYWRmb3JkIE5lYWwKKyAgICAgSWFuIEguIFdpdHRlbgorICAgICBSb2JlcnQgU2VkZ2V3aWNrCisgICAgIEpvbiBMLiBCZW50bGV5CisKKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc291cmNlcywgc2VlIHRoZSBtYW51YWwuCistLSovCisKKworI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLQorICBDb21wYXJlIHR3byBzdHJpbmdzIGluIGJsb2NrLiAgV2UgYXNzdW1lIChzZWUKKyAgZGlzY3Vzc2lvbiBhYm92ZSkgdGhhdCBpMSBhbmQgaTIgaGF2ZSBhIG1heAorICBvZmZzZXQgb2YgMTAgb24gZW50cnksIGFuZCB0aGF0IHRoZSBmaXJzdAorICBieXRlcyBvZiBib3RoIGJsb2NrIGFuZCBxdWFkcmFudCBoYXZlIGJlZW4KKyAgY29waWVkIGludG8gdGhlICJvdmVyc2hvb3QgYXJlYSIsIGllCisgIGludG8gdGhlIHN1YnNjcmlwdCByYW5nZQorICBbbmJsb2NrIC4uIG5ibG9jaytOVU1fT1ZFUlNIT09UX0JZVEVTLTFdLgorLS0qLworc3RhdGljIF9faW5saW5lX18gQm9vbCBmdWxsR3RVICggVUNoYXIqICBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiogcXVhZHJhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgIG5ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyKiAgd29ya0RvbmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgICBpMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiAgIGkyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgSW50MzIgazsKKyAgIFVDaGFyIGMxLCBjMjsKKyAgIFVJbnQxNiBzMSwgczI7CisKKyAgIEFzc2VydEQgKCBpMSAhPSBpMiwgImZ1bGxHdFUoMSkiICk7CisKKyAgIGMxID0gYmxvY2tbaTFdOworICAgYzIgPSBibG9ja1tpMl07CisgICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7CisgICBpMSsrOyBpMisrOworCisgICBjMSA9IGJsb2NrW2kxXTsKKyAgIGMyID0gYmxvY2tbaTJdOworICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOworICAgaTErKzsgaTIrKzsKKworICAgYzEgPSBibG9ja1tpMV07CisgICBjMiA9IGJsb2NrW2kyXTsKKyAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKyAgIGkxKys7IGkyKys7CisKKyAgIGMxID0gYmxvY2tbaTFdOworICAgYzIgPSBibG9ja1tpMl07CisgICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7CisgICBpMSsrOyBpMisrOworCisgICBjMSA9IGJsb2NrW2kxXTsKKyAgIGMyID0gYmxvY2tbaTJdOworICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOworICAgaTErKzsgaTIrKzsKKworICAgYzEgPSBibG9ja1tpMV07CisgICBjMiA9IGJsb2NrW2kyXTsKKyAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKyAgIGkxKys7IGkyKys7CisKKyAgIGsgPSBuYmxvY2s7CisKKyAgIGRvIHsKKworICAgICAgYzEgPSBibG9ja1tpMV07CisgICAgICBjMiA9IGJsb2NrW2kyXTsKKyAgICAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKyAgICAgIHMxID0gcXVhZHJhbnRbaTFdOworICAgICAgczIgPSBxdWFkcmFudFtpMl07CisgICAgICBpZiAoczEgIT0gczIpIHJldHVybiAoczEgPiBzMik7CisgICAgICBpMSsrOyBpMisrOworCisgICAgICBjMSA9IGJsb2NrW2kxXTsKKyAgICAgIGMyID0gYmxvY2tbaTJdOworICAgICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOworICAgICAgczEgPSBxdWFkcmFudFtpMV07CisgICAgICBzMiA9IHF1YWRyYW50W2kyXTsKKyAgICAgIGlmIChzMSAhPSBzMikgcmV0dXJuIChzMSA+IHMyKTsKKyAgICAgIGkxKys7IGkyKys7CisKKyAgICAgIGMxID0gYmxvY2tbaTFdOworICAgICAgYzIgPSBibG9ja1tpMl07CisgICAgICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7CisgICAgICBzMSA9IHF1YWRyYW50W2kxXTsKKyAgICAgIHMyID0gcXVhZHJhbnRbaTJdOworICAgICAgaWYgKHMxICE9IHMyKSByZXR1cm4gKHMxID4gczIpOworICAgICAgaTErKzsgaTIrKzsKKworICAgICAgYzEgPSBibG9ja1tpMV07CisgICAgICBjMiA9IGJsb2NrW2kyXTsKKyAgICAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKKyAgICAgIHMxID0gcXVhZHJhbnRbaTFdOworICAgICAgczIgPSBxdWFkcmFudFtpMl07CisgICAgICBpZiAoczEgIT0gczIpIHJldHVybiAoczEgPiBzMik7CisgICAgICBpMSsrOyBpMisrOworCisgICAgICBpZiAoaTEgPj0gbmJsb2NrKSBpMSAtPSBuYmxvY2s7CisgICAgICBpZiAoaTIgPj0gbmJsb2NrKSBpMiAtPSBuYmxvY2s7CisKKyAgICAgIGsgLT0gNDsKKyAgICAgICgqd29ya0RvbmUpKys7CisgICB9CisgICAgICB3aGlsZSAoayA+PSAwKTsKKworICAgcmV0dXJuIEZhbHNlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tCisgICBLbnV0aCdzIGluY3JlbWVudHMgc2VlbSB0byB3b3JrIGJldHRlcgorICAgdGhhbiBJbmNlcnBpLVNlZGdld2ljayBoZXJlLiAgUG9zc2libHkKKyAgIGJlY2F1c2UgdGhlIG51bWJlciBvZiBlbGVtcyB0byBzb3J0IGlzCisgICB1c3VhbGx5IHNtYWxsLCB0eXBpY2FsbHkgPD0gMjAuCistLSovCitzdGF0aWMgSW50MzIgaW5jc1sxNF0gPSB7IDEsIDQsIDEzLCA0MCwgMTIxLCAzNjQsIDEwOTMsIDMyODAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDk4NDEsIDI5NTI0LCA4ODU3MywgMjY1NzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICA3OTcxNjEsIDIzOTE0ODQgfTsKKworc3RhdGljIHZvaWQgc2ltcGxlU29ydCAoIEVTdGF0ZSogcywgSW50MzIgbG8sIEludDMyIGhpLCBJbnQzMiBkICkKK3sKKyAgIEludDMyIGksIGosIGgsIGJpZ04sIGhwOworICAgSW50MzIgdjsKKworICAgVUNoYXIqICBibG9jayAgICAgICAgPSBzLT5ibG9jazsKKyAgIFVJbnQzMiogenB0ciAgICAgICAgID0gcy0+enB0cjsKKyAgIFVJbnQxNiogcXVhZHJhbnQgICAgID0gcy0+cXVhZHJhbnQ7CisgICBJbnQzMiogIHdvcmtEb25lICAgICA9ICYocy0+d29ya0RvbmUpOworICAgSW50MzIgICBuYmxvY2sgICAgICAgPSBzLT5uYmxvY2s7CisgICBJbnQzMiAgIHdvcmtMaW1pdCAgICA9IHMtPndvcmtMaW1pdDsKKyAgIEJvb2wgICAgZmlyc3RBdHRlbXB0ID0gcy0+Zmlyc3RBdHRlbXB0OworCisgICBiaWdOID0gaGkgLSBsbyArIDE7CisgICBpZiAoYmlnTiA8IDIpIHJldHVybjsKKworICAgaHAgPSAwOworICAgd2hpbGUgKGluY3NbaHBdIDwgYmlnTikgaHArKzsKKyAgIGhwLS07CisKKyAgIGZvciAoOyBocCA+PSAwOyBocC0tKSB7CisgICAgICBoID0gaW5jc1tocF07CisgICAgICBpID0gbG8gKyBoOworICAgICAgd2hpbGUgKFRydWUpIHsKKworICAgICAgICAgLyotLSBjb3B5IDEgLS0qLworICAgICAgICAgaWYgKGkgPiBoaSkgYnJlYWs7CisgICAgICAgICB2ID0genB0cltpXTsKKyAgICAgICAgIGogPSBpOworICAgICAgICAgd2hpbGUgKCBmdWxsR3RVICggYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIHdvcmtEb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgenB0cltqLWhdK2QsIHYrZCApICkgeworICAgICAgICAgICAgenB0cltqXSA9IHpwdHJbai1oXTsKKyAgICAgICAgICAgIGogPSBqIC0gaDsKKyAgICAgICAgICAgIGlmIChqIDw9IChsbyArIGggLSAxKSkgYnJlYWs7CisgICAgICAgICB9CisgICAgICAgICB6cHRyW2pdID0gdjsKKyAgICAgICAgIGkrKzsKKworICAgICAgICAgLyotLSBjb3B5IDIgLS0qLworICAgICAgICAgaWYgKGkgPiBoaSkgYnJlYWs7CisgICAgICAgICB2ID0genB0cltpXTsKKyAgICAgICAgIGogPSBpOworICAgICAgICAgd2hpbGUgKCBmdWxsR3RVICggYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIHdvcmtEb25lLAorICAgICAgICAgICAgICAgICB6cHRyW2otaF0rZCwgditkICkgKSB7CisgICAgICAgICAgICB6cHRyW2pdID0genB0cltqLWhdOworICAgICAgICAgICAgaiA9IGogLSBoOworICAgICAgICAgICAgaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIHpwdHJbal0gPSB2OworICAgICAgICAgaSsrOworCisgICAgICAgICAvKi0tIGNvcHkgMyAtLSovCisgICAgICAgICBpZiAoaSA+IGhpKSBicmVhazsKKyAgICAgICAgIHYgPSB6cHRyW2ldOworICAgICAgICAgaiA9IGk7CisgICAgICAgICB3aGlsZSAoIGZ1bGxHdFUgKCBibG9jaywgcXVhZHJhbnQsIG5ibG9jaywgd29ya0RvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6cHRyW2otaF0rZCwgditkICkgKSB7CisgICAgICAgICAgICB6cHRyW2pdID0genB0cltqLWhdOworICAgICAgICAgICAgaiA9IGogLSBoOworICAgICAgICAgICAgaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKKyAgICAgICAgIH0KKyAgICAgICAgIHpwdHJbal0gPSB2OworICAgICAgICAgaSsrOworCisgICAgICAgICBpZiAoKndvcmtEb25lID4gd29ya0xpbWl0ICYmIGZpcnN0QXR0ZW1wdCkgcmV0dXJuOworICAgICAgfQorICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0KKyAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgIGFuIGVsZWdhbnQgMy13YXkgcXVpY2tzb3J0IGZvciBzdHJpbmdzLAorICAgZGVzY3JpYmVkIGluIGEgcGFwZXIgIkZhc3QgQWxnb3JpdGhtcyBmb3IKKyAgIFNvcnRpbmcgYW5kIFNlYXJjaGluZyBTdHJpbmdzIiwgYnkgUm9iZXJ0CisgICBTZWRnZXdpY2sgYW5kIEpvbiBMLiBCZW50bGV5LgorLS0qLworCisjZGVmaW5lIHN3YXAobHYxLCBsdjIpIFwKKyAgIHsgSW50MzIgdG1wID0gbHYxOyBsdjEgPSBsdjI7IGx2MiA9IHRtcDsgfQorCitzdGF0aWMgdm9pZCB2c3dhcCAoIFVJbnQzMiogenB0ciwgSW50MzIgcDEsIEludDMyIHAyLCBJbnQzMiBuICkKK3sKKyAgIHdoaWxlIChuID4gMCkgeworICAgICAgc3dhcCh6cHRyW3AxXSwgenB0cltwMl0pOworICAgICAgcDErKzsgcDIrKzsgbi0tOworICAgfQorfQorCitzdGF0aWMgVUNoYXIgbWVkMyAoIFVDaGFyIGEsIFVDaGFyIGIsIFVDaGFyIGMgKQoreworICAgVUNoYXIgdDsKKyAgIGlmIChhID4gYikgeyB0ID0gYTsgYSA9IGI7IGIgPSB0OyB9OworICAgaWYgKGIgPiBjKSB7IHQgPSBiOyBiID0gYzsgYyA9IHQ7IH07CisgICBpZiAoYSA+IGIpICAgICAgICAgIGIgPSBhOworICAgcmV0dXJuIGI7Cit9CisKKworI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQorCit0eXBlZGVmCisgICBzdHJ1Y3QgeyBJbnQzMiBsbDsgSW50MzIgaGg7IEludDMyIGRkOyB9CisgICBTdGFja0VsZW07CisKKyNkZWZpbmUgcHVzaChseixoeixkeikgeyBzdGFja1tzcF0ubGwgPSBsejsgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW3NwXS5oaCA9IGh6OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbc3BdLmRkID0gZHo7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOyB9CisKKyNkZWZpbmUgcG9wKGx6LGh6LGR6KSB7IHNwLS07ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgbHogPSBzdGFja1tzcF0ubGw7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICBoeiA9IHN0YWNrW3NwXS5oaDsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR6ID0gc3RhY2tbc3BdLmRkOyB9CisKKyNkZWZpbmUgU01BTExfVEhSRVNIIDIwCisjZGVmaW5lIERFUFRIX1RIUkVTSCAxMAorCisvKi0tCisgICBJZiB5b3UgYXJlIGV2ZXIgdW5sdWNreS9pbXByb2JhYmxlIGVub3VnaAorICAgdG8gZ2V0IGEgc3RhY2sgb3ZlcmZsb3cgd2hpbHN0IHNvcnRpbmcsCisgICBpbmNyZWFzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFuZCB0cnkKKyAgIGFnYWluLiAgSW4gcHJhY3RpY2UgSSBoYXZlIG5ldmVyIHNlZW4gdGhlCisgICBzdGFjayBnbyBhYm92ZSAyNyBlbGVtcywgc28gdGhlIGZvbGxvd2luZworICAgbGltaXQgc2VlbXMgdmVyeSBnZW5lcm91cy4KKy0tKi8KKyNkZWZpbmUgUVNPUlRfU1RBQ0tfU0laRSAxMDAwCisKKworc3RhdGljIHZvaWQgcVNvcnQzICggRVN0YXRlKiBzLCBJbnQzMiBsb1N0LCBJbnQzMiBoaVN0LCBJbnQzMiBkU3QgKQoreworICAgSW50MzIgdW5MbywgdW5IaSwgbHRMbywgZ3RIaSwgbWVkLCBuLCBtOworICAgSW50MzIgc3AsIGxvLCBoaSwgZDsKKyAgIFN0YWNrRWxlbSBzdGFja1tRU09SVF9TVEFDS19TSVpFXTsKKworICAgVUNoYXIqICBibG9jayAgICAgICAgPSBzLT5ibG9jazsKKyAgIFVJbnQzMiogenB0ciAgICAgICAgID0gcy0+enB0cjsKKyAgIEludDMyKiAgd29ya0RvbmUgICAgID0gJihzLT53b3JrRG9uZSk7CisgICBJbnQzMiAgIHdvcmtMaW1pdCAgICA9IHMtPndvcmtMaW1pdDsKKyAgIEJvb2wgICAgZmlyc3RBdHRlbXB0ID0gcy0+Zmlyc3RBdHRlbXB0OworCisgICBzcCA9IDA7CisgICBwdXNoICggbG9TdCwgaGlTdCwgZFN0ICk7CisKKyAgIHdoaWxlIChzcCA+IDApIHsKKworICAgICAgQXNzZXJ0SCAoIHNwIDwgUVNPUlRfU1RBQ0tfU0laRSwgMTAwMSApOworCisgICAgICBwb3AgKCBsbywgaGksIGQgKTsKKworICAgICAgaWYgKGhpIC0gbG8gPCBTTUFMTF9USFJFU0ggfHwgZCA+IERFUFRIX1RIUkVTSCkgeworICAgICAgICAgc2ltcGxlU29ydCAoIHMsIGxvLCBoaSwgZCApOworICAgICAgICAgaWYgKCp3b3JrRG9uZSA+IHdvcmtMaW1pdCAmJiBmaXJzdEF0dGVtcHQpIHJldHVybjsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBtZWQgPSBtZWQzICggYmxvY2tbenB0clsgbG8gICAgICAgICBdK2RdLAorICAgICAgICAgICAgICAgICAgIGJsb2NrW3pwdHJbIGhpICAgICAgICAgXStkXSwKKyAgICAgICAgICAgICAgICAgICBibG9ja1t6cHRyWyAobG8raGkpPj4xIF0rZF0gKTsKKworICAgICAgdW5MbyA9IGx0TG8gPSBsbzsKKyAgICAgIHVuSGkgPSBndEhpID0gaGk7CisKKyAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgICAgaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKKyAgICAgICAgICAgIG4gPSAoKEludDMyKWJsb2NrW3pwdHJbdW5Mb10rZF0pIC0gbWVkOworICAgICAgICAgICAgaWYgKG4gPT0gMCkgeyBzd2FwKHpwdHJbdW5Mb10sIHpwdHJbbHRMb10pOyBsdExvKys7IHVuTG8rKzsgY29udGludWU7IH07CisgICAgICAgICAgICBpZiAobiA+ICAwKSBicmVhazsKKyAgICAgICAgICAgIHVuTG8rKzsKKyAgICAgICAgIH0KKyAgICAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICAgICBpZiAodW5MbyA+IHVuSGkpIGJyZWFrOworICAgICAgICAgICAgbiA9ICgoSW50MzIpYmxvY2tbenB0clt1bkhpXStkXSkgLSBtZWQ7CisgICAgICAgICAgICBpZiAobiA9PSAwKSB7IHN3YXAoenB0clt1bkhpXSwgenB0cltndEhpXSk7IGd0SGktLTsgdW5IaS0tOyBjb250aW51ZTsgfTsKKyAgICAgICAgICAgIGlmIChuIDwgIDApIGJyZWFrOworICAgICAgICAgICAgdW5IaS0tOworICAgICAgICAgfQorICAgICAgICAgaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKKyAgICAgICAgIHN3YXAoenB0clt1bkxvXSwgenB0clt1bkhpXSk7IHVuTG8rKzsgdW5IaS0tOworICAgICAgfQorCisgICAgICBBc3NlcnREICggdW5IaSA9PSB1bkxvLTEsICJiYWQgdGVybWluYXRpb24gaW4gcVNvcnQzIiApOworCisgICAgICBpZiAoZ3RIaSA8IGx0TG8pIHsKKyAgICAgICAgIHB1c2gobG8sIGhpLCBkKzEgKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBuID0gbWluKGx0TG8tbG8sIHVuTG8tbHRMbyk7IHZzd2FwKHpwdHIsIGxvLCB1bkxvLW4sIG4pOworICAgICAgbSA9IG1pbihoaS1ndEhpLCBndEhpLXVuSGkpOyB2c3dhcCh6cHRyLCB1bkxvLCBoaS1tKzEsIG0pOworCisgICAgICBuID0gbG8gKyB1bkxvIC0gbHRMbyAtIDE7CisgICAgICBtID0gaGkgLSAoZ3RIaSAtIHVuSGkpICsgMTsKKworICAgICAgcHVzaCAoIGxvLCBuLCBkICk7CisgICAgICBwdXNoICggbisxLCBtLTEsIGQrMSApOworICAgICAgcHVzaCAoIG0sIGhpLCBkICk7CisgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIEJJR0ZSRVEoYikgKGZ0YWJbKChiKSsxKSA8PCA4XSAtIGZ0YWJbKGIpIDw8IDhdKQorCisjZGVmaW5lIFNFVE1BU0sgKDEgPDwgMjEpCisjZGVmaW5lIENMRUFSTUFTSyAofihTRVRNQVNLKSkKKworc3RhdGljIHZvaWQgc29ydE1haW4gKCBFU3RhdGUqIHMgKQoreworICAgSW50MzIgaSwgaiwgaywgc3MsIHNiOworICAgSW50MzIgcnVubmluZ09yZGVyWzI1Nl07CisgICBJbnQzMiBjb3B5WzI1Nl07CisgICBCb29sICBiaWdEb25lWzI1Nl07CisgICBVQ2hhciBjMSwgYzI7CisgICBJbnQzMiBudW1RU29ydGVkOworCisgICBVQ2hhciogIGJsb2NrICAgICAgICA9IHMtPmJsb2NrOworICAgVUludDMyKiB6cHRyICAgICAgICAgPSBzLT56cHRyOworICAgVUludDE2KiBxdWFkcmFudCAgICAgPSBzLT5xdWFkcmFudDsKKyAgIEludDMyKiAgZnRhYiAgICAgICAgID0gcy0+ZnRhYjsKKyAgIEludDMyKiAgd29ya0RvbmUgICAgID0gJihzLT53b3JrRG9uZSk7CisgICBJbnQzMiAgIG5ibG9jayAgICAgICA9IHMtPm5ibG9jazsKKyAgIEludDMyICAgd29ya0xpbWl0ICAgID0gcy0+d29ya0xpbWl0OworICAgQm9vbCAgICBmaXJzdEF0dGVtcHQgPSBzLT5maXJzdEF0dGVtcHQ7CisKKyAgIC8qLS0KKyAgICAgIEluIHRoZSB2YXJpb3VzIGJsb2NrLXNpemVkIHN0cnVjdHVyZXMsIGxpdmUgZGF0YSBydW5zCisgICAgICBmcm9tIDAgdG8gbGFzdCtOVU1fT1ZFUlNIT09UX0JZVEVTIGluY2x1c2l2ZS4gIEZpcnN0LAorICAgICAgc2V0IHVwIHRoZSBvdmVyc2hvb3QgYXJlYSBmb3IgYmxvY2suCisgICAtLSovCisKKyAgIGlmIChzLT52ZXJib3NpdHkgPj0gNCkKKyAgICAgIFZQcmludGYwKCAiICAgICAgICBzb3J0IGluaXRpYWxpc2UgLi4uXG4iICk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBCWl9OVU1fT1ZFUlNIT09UX0JZVEVTOyBpKyspCisgICAgICAgYmxvY2tbbmJsb2NrK2ldID0gYmxvY2tbaSAlIG5ibG9ja107CisgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrK0JaX05VTV9PVkVSU0hPT1RfQllURVM7IGkrKykKKyAgICAgICBxdWFkcmFudFtpXSA9IDA7CisKKworICAgaWYgKG5ibG9jayA8PSA0MDAwKSB7CisKKyAgICAgIC8qLS0KKyAgICAgICAgIFVzZSBzaW1wbGVTb3J0KCksIHNpbmNlIHRoZSBmdWxsIHNvcnRpbmcgbWVjaGFuaXNtCisgICAgICAgICBoYXMgcXVpdGUgYSBsYXJnZSBjb25zdGFudCBvdmVyaGVhZC4KKyAgICAgIC0tKi8KKyAgICAgIGlmIChzLT52ZXJib3NpdHkgPj0gNCkgVlByaW50ZjAoICIgICAgICAgIHNpbXBsZVNvcnQgLi4uXG4iICk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHpwdHJbaV0gPSBpOworICAgICAgZmlyc3RBdHRlbXB0ID0gRmFsc2U7CisgICAgICAqd29ya0RvbmUgPSB3b3JrTGltaXQgPSAwOworICAgICAgc2ltcGxlU29ydCAoIHMsIDAsIG5ibG9jay0xLCAwICk7CisgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDQpIFZQcmludGYwKCAiICAgICAgICBzaW1wbGVTb3J0IGRvbmUuXG4iICk7CisKKyAgIH0gZWxzZSB7CisKKyAgICAgIG51bVFTb3J0ZWQgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgYmlnRG9uZVtpXSA9IEZhbHNlOworCisgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDQpIFZQcmludGYwKCAiICAgICAgICBidWNrZXQgc29ydGluZyAuLi5cbiIgKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8PSA2NTUzNjsgaSsrKSBmdGFiW2ldID0gMDsKKworICAgICAgYzEgPSBibG9ja1tuYmxvY2stMV07CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKKyAgICAgICAgIGMyID0gYmxvY2tbaV07CisgICAgICAgICBmdGFiWyhjMSA8PCA4KSArIGMyXSsrOworICAgICAgICAgYzEgPSBjMjsKKyAgICAgIH0KKworICAgICAgZm9yIChpID0gMTsgaSA8PSA2NTUzNjsgaSsrKSBmdGFiW2ldICs9IGZ0YWJbaS0xXTsKKworICAgICAgYzEgPSBibG9ja1swXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuYmxvY2stMTsgaSsrKSB7CisgICAgICAgICBjMiA9IGJsb2NrW2krMV07CisgICAgICAgICBqID0gKGMxIDw8IDgpICsgYzI7CisgICAgICAgICBjMSA9IGMyOworICAgICAgICAgZnRhYltqXS0tOworICAgICAgICAgenB0cltmdGFiW2pdXSA9IGk7CisgICAgICB9CisgICAgICBqID0gKGJsb2NrW25ibG9jay0xXSA8PCA4KSArIGJsb2NrWzBdOworICAgICAgZnRhYltqXS0tOworICAgICAgenB0cltmdGFiW2pdXSA9IG5ibG9jay0xOworCisgICAgICAvKi0tCisgICAgICAgICBOb3cgZnRhYiBjb250YWlucyB0aGUgZmlyc3QgbG9jIG9mIGV2ZXJ5IHNtYWxsIGJ1Y2tldC4KKyAgICAgICAgIENhbGN1bGF0ZSB0aGUgcnVubmluZyBvcmRlciwgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0CisgICAgICAgICBiaWcgYnVja2V0LgorICAgICAgLS0qLworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSBydW5uaW5nT3JkZXJbaV0gPSBpOworCisgICAgICB7CisgICAgICAgICBJbnQzMiB2djsKKyAgICAgICAgIEludDMyIGggPSAxOworICAgICAgICAgZG8gaCA9IDMgKiBoICsgMTsgd2hpbGUgKGggPD0gMjU2KTsKKyAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGggPSBoIC8gMzsKKyAgICAgICAgICAgIGZvciAoaSA9IGg7IGkgPD0gMjU1OyBpKyspIHsKKyAgICAgICAgICAgICAgIHZ2ID0gcnVubmluZ09yZGVyW2ldOworICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICB3aGlsZSAoIEJJR0ZSRVEocnVubmluZ09yZGVyW2otaF0pID4gQklHRlJFUSh2dikgKSB7CisgICAgICAgICAgICAgICAgICBydW5uaW5nT3JkZXJbal0gPSBydW5uaW5nT3JkZXJbai1oXTsKKyAgICAgICAgICAgICAgICAgIGogPSBqIC0gaDsKKyAgICAgICAgICAgICAgICAgIGlmIChqIDw9IChoIC0gMSkpIGdvdG8gemVybzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHplcm86CisgICAgICAgICAgICAgICBydW5uaW5nT3JkZXJbal0gPSB2djsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gd2hpbGUgKGggIT0gMSk7CisgICAgICB9CisKKyAgICAgIC8qLS0KKyAgICAgICAgIFRoZSBtYWluIHNvcnRpbmcgbG9vcC4KKyAgICAgIC0tKi8KKworICAgICAgZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgeworCisgICAgICAgICAvKi0tCisgICAgICAgICAgICBQcm9jZXNzIGJpZyBidWNrZXRzLCBzdGFydGluZyB3aXRoIHRoZSBsZWFzdCBmdWxsLgorICAgICAgICAgICAgQmFzaWNhbGx5IHRoaXMgaXMgYSA0LXN0ZXAgcHJvY2VzcyBpbiB3aGljaCB3ZSBjYWxsCisgICAgICAgICAgICBxU29ydDMgdG8gc29ydCB0aGUgc21hbGwgYnVja2V0cyBbc3MsIGpdLCBidXQKKyAgICAgICAgICAgIGFsc28gbWFrZSBhIGJpZyBlZmZvcnQgdG8gYXZvaWQgdGhlIGNhbGxzIGlmIHdlIGNhbi4KKyAgICAgICAgIC0tKi8KKyAgICAgICAgIHNzID0gcnVubmluZ09yZGVyW2ldOworCisgICAgICAgICAvKi0tCisgICAgICAgICAgICBTdGVwIDE6CisgICAgICAgICAgICBDb21wbGV0ZSB0aGUgYmlnIGJ1Y2tldCBbc3NdIGJ5IHF1aWNrc29ydGluZworICAgICAgICAgICAgYW55IHVuc29ydGVkIHNtYWxsIGJ1Y2tldHMgW3NzLCBqXSwgZm9yIGogIT0gc3MuICAKKyAgICAgICAgICAgIEhvcGVmdWxseSBwcmV2aW91cyBwb2ludGVyLXNjYW5uaW5nIHBoYXNlcyBoYXZlIGFscmVhZHkKKyAgICAgICAgICAgIGNvbXBsZXRlZCBtYW55IG9mIHRoZSBzbWFsbCBidWNrZXRzIFtzcywgal0sIHNvCisgICAgICAgICAgICB3ZSBkb24ndCBoYXZlIHRvIHNvcnQgdGhlbSBhdCBhbGwuCisgICAgICAgICAtLSovCisgICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7CisgICAgICAgICAgICBpZiAoaiAhPSBzcykgeworICAgICAgICAgICAgICAgc2IgPSAoc3MgPDwgOCkgKyBqOworICAgICAgICAgICAgICAgaWYgKCAhIChmdGFiW3NiXSAmIFNFVE1BU0spICkgeworICAgICAgICAgICAgICAgICAgSW50MzIgbG8gPSBmdGFiW3NiXSAgICYgQ0xFQVJNQVNLOworICAgICAgICAgICAgICAgICAgSW50MzIgaGkgPSAoZnRhYltzYisxXSAmIENMRUFSTUFTSykgLSAxOworICAgICAgICAgICAgICAgICAgaWYgKGhpID4gbG8pIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChzLT52ZXJib3NpdHkgPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQcmludGY0KCAiICAgICAgICBxc29ydCBbMHgleCwgMHgleF0gICBkb25lICVkICAgdGhpcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcywgaiwgbnVtUVNvcnRlZCwgaGkgLSBsbyArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgIHFTb3J0MyAoIHMsIGxvLCBoaSwgMiApOworICAgICAgICAgICAgICAgICAgICAgbnVtUVNvcnRlZCArPSAoIGhpIC0gbG8gKyAxICk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoKndvcmtEb25lID4gd29ya0xpbWl0ICYmIGZpcnN0QXR0ZW1wdCkgcmV0dXJuOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZnRhYltzYl0gfD0gU0VUTUFTSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyotLQorICAgICAgICAgICAgU3RlcCAyOgorICAgICAgICAgICAgRGVhbCBzcGVjaWFsbHkgd2l0aCBjYXNlIFtzcywgc3NdLiAgVGhpcyBlc3RhYmxpc2hlcyB0aGUKKyAgICAgICAgICAgIHNvcnRlZCBvcmRlciBmb3IgW3NzLCBzc10gd2l0aG91dCBhbnkgY29tcGFyaXNvbnMuICAKKyAgICAgICAgICAgIEEgY2xldmVyIHRyaWNrLCBjcnlwdGljYWxseSBkZXNjcmliZWQgYXMgc3RlcHMgUTZiIGFuZCBRNmMKKyAgICAgICAgICAgIGluIFNSQy0xMjQgKGFrYSBCVzk0KS4gIFRoaXMgbWFrZXMgaXQgZW50aXJlbHkgcHJhY3RpY2FsIHRvCisgICAgICAgICAgICBub3QgdXNlIGEgcHJlbGltaW5hcnkgcnVuLWxlbmd0aCBjb2RlciwgYnV0IHVuZm9ydHVuYXRlbHkKKyAgICAgICAgICAgIHdlIGFyZSBub3cgc3R1Y2sgd2l0aCB0aGUgLmJ6MiBmaWxlIGZvcm1hdC4KKyAgICAgICAgIC0tKi8KKyAgICAgICAgIHsKKyAgICAgICAgICAgIEludDMyIHB1dDAsIGdldDAsIHB1dDEsIGdldDE7CisgICAgICAgICAgICBJbnQzMiBzYm4gPSAoc3MgPDwgOCkgKyBzczsKKyAgICAgICAgICAgIEludDMyIGxvID0gZnRhYltzYm5dICYgQ0xFQVJNQVNLOworICAgICAgICAgICAgSW50MzIgaGkgPSAoZnRhYltzYm4rMV0gJiBDTEVBUk1BU0spIC0gMTsKKyAgICAgICAgICAgIFVDaGFyIHNzYyA9IChVQ2hhcilzczsKKyAgICAgICAgICAgIHB1dDAgPSBsbzsKKyAgICAgICAgICAgIGdldDAgPSBmdGFiW3NzIDw8IDhdICYgQ0xFQVJNQVNLOworICAgICAgICAgICAgcHV0MSA9IGhpOworICAgICAgICAgICAgZ2V0MSA9IChmdGFiWyhzcysxKSA8PCA4XSAmIENMRUFSTUFTSykgLSAxOworICAgICAgICAgICAgd2hpbGUgKGdldDAgPCBwdXQwKSB7CisgICAgICAgICAgICAgICBqID0genB0cltnZXQwXS0xOyBpZiAoaiA8IDApIGogKz0gbmJsb2NrOworICAgICAgICAgICAgICAgYzEgPSBibG9ja1tqXTsKKyAgICAgICAgICAgICAgIGlmIChjMSA9PSBzc2MpIHsgenB0cltwdXQwXSA9IGo7IHB1dDArKzsgfTsKKyAgICAgICAgICAgICAgIGdldDArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChnZXQxID4gcHV0MSkgeworICAgICAgICAgICAgICAgaiA9IHpwdHJbZ2V0MV0tMTsgaWYgKGogPCAwKSBqICs9IG5ibG9jazsKKyAgICAgICAgICAgICAgIGMxID0gYmxvY2tbal07CisgICAgICAgICAgICAgICBpZiAoYzEgPT0gc3NjKSB7IHpwdHJbcHV0MV0gPSBqOyBwdXQxLS07IH07CisgICAgICAgICAgICAgICBnZXQxLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdGFiW3Nibl0gfD0gU0VUTUFTSzsKKyAgICAgICAgIH0KKworICAgICAgICAgLyotLQorICAgICAgICAgICAgU3RlcCAzOgorICAgICAgICAgICAgVGhlIFtzc10gYmlnIGJ1Y2tldCBpcyBub3cgZG9uZS4gIFJlY29yZCB0aGlzIGZhY3QsCisgICAgICAgICAgICBhbmQgdXBkYXRlIHRoZSBxdWFkcmFudCBkZXNjcmlwdG9ycy4gIFJlbWVtYmVyIHRvCisgICAgICAgICAgICB1cGRhdGUgcXVhZHJhbnRzIGluIHRoZSBvdmVyc2hvb3QgYXJlYSB0b28sIGlmCisgICAgICAgICAgICBuZWNlc3NhcnkuICBUaGUgImlmIChpIDwgMjU1KSIgdGVzdCBtZXJlbHkgc2tpcHMKKyAgICAgICAgICAgIHRoaXMgdXBkYXRpbmcgZm9yIHRoZSBsYXN0IGJ1Y2tldCBwcm9jZXNzZWQsIHNpbmNlCisgICAgICAgICAgICB1cGRhdGluZyBmb3IgdGhlIGxhc3QgYnVja2V0IGlzIHBvaW50bGVzcy4KKworICAgICAgICAgICAgVGhlIHF1YWRyYW50IGFycmF5IHByb3ZpZGVzIGEgd2F5IHRvIGluY3JlbWVudGFsbHkKKyAgICAgICAgICAgIGNhY2hlIHNvcnQgb3JkZXJpbmdzLCBhcyB0aGV5IGFwcGVhciwgc28gYXMgdG8gCisgICAgICAgICAgICBtYWtlIHN1YnNlcXVlbnQgY29tcGFyaXNvbnMgaW4gZnVsbEd0VSgpIGNvbXBsZXRlCisgICAgICAgICAgICBmYXN0ZXIuICBGb3IgcmVwZXRpdGl2ZSBibG9ja3MgdGhpcyBtYWtlcyBhIGJpZworICAgICAgICAgICAgZGlmZmVyZW5jZSAoYnV0IG5vdCBiaWcgZW5vdWdoIHRvIGJlIGFibGUgdG8gYXZvaWQKKyAgICAgICAgICAgIHJhbmRvbWlzYXRpb24gZm9yIHZlcnkgcmVwZXRpdGl2ZSBkYXRhLikKKworICAgICAgICAgICAgVGhlIHByZWNpc2UgbWVhbmluZyBpczogYXQgYWxsIHRpbWVzOgorCisgICAgICAgICAgICAgICBmb3IgMCA8PSBpIDwgbmJsb2NrIGFuZCAwIDw9IGogPD0gbmJsb2NrCisKKyAgICAgICAgICAgICAgIGlmIGJsb2NrW2ldICE9IGJsb2NrW2pdLCAKKworICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgcmVsYXRpdmUgdmFsdWVzIG9mIHF1YWRyYW50W2ldIGFuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgcXVhZHJhbnRbal0gYXJlIG1lYW5pbmdsZXNzLgorCisgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIHF1YWRyYW50W2ldIDwgcXVhZHJhbnRbal0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHN0cmluZyBzdGFydGluZyBhdCBpIGxleGljb2dyYXBoaWNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjZWRlcyB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IGoKKworICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiBxdWFkcmFudFtpXSA+IHF1YWRyYW50W2pdCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgaiBsZXhpY29ncmFwaGljYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2VkZXMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBpCisKKyAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiB0aGUgc3RyaW5ncyBzdGFydGluZworICAgICAgICAgICAgICAgICAgICAgICAgYXQgaSBhbmQgaiBoYXMgbm90IHlldCBiZWVuIGRldGVybWluZWQuCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAtLSovCisgICAgICAgICBiaWdEb25lW3NzXSA9IFRydWU7CisKKyAgICAgICAgIGlmIChpIDwgMjU1KSB7CisgICAgICAgICAgICBJbnQzMiBiYlN0YXJ0ICA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7CisgICAgICAgICAgICBJbnQzMiBiYlNpemUgICA9IChmdGFiWyhzcysxKSA8PCA4XSAmIENMRUFSTUFTSykgLSBiYlN0YXJ0OworICAgICAgICAgICAgSW50MzIgc2hpZnRzICAgPSAwOworCisgICAgICAgICAgICB3aGlsZSAoKGJiU2l6ZSA+PiBzaGlmdHMpID4gNjU1MzQpIHNoaWZ0cysrOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmJTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgIEludDMyIGEydXBkYXRlICAgICA9IHpwdHJbYmJTdGFydCArIGpdOworICAgICAgICAgICAgICAgVUludDE2IHFWYWwgICAgICAgID0gKFVJbnQxNikoaiA+PiBzaGlmdHMpOworICAgICAgICAgICAgICAgcXVhZHJhbnRbYTJ1cGRhdGVdID0gcVZhbDsKKyAgICAgICAgICAgICAgIGlmIChhMnVwZGF0ZSA8IEJaX05VTV9PVkVSU0hPT1RfQllURVMpCisgICAgICAgICAgICAgICAgICBxdWFkcmFudFthMnVwZGF0ZSArIG5ibG9ja10gPSBxVmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnRIICggKCAoKGJiU2l6ZS0xKSA+PiBzaGlmdHMpIDw9IDY1NTM1ICksIDEwMDIgKTsKKyAgICAgICAgIH0KKworICAgICAgICAgLyotLQorICAgICAgICAgICAgU3RlcCA0OgorICAgICAgICAgICAgTm93IHNjYW4gdGhpcyBiaWcgYnVja2V0IFtzc10gc28gYXMgdG8gc3ludGhlc2lzZSB0aGUKKyAgICAgICAgICAgIHNvcnRlZCBvcmRlciBmb3Igc21hbGwgYnVja2V0cyBbdCwgc3NdIGZvciBhbGwgdCAhPSBzcy4KKyAgICAgICAgICAgIFRoaXMgd2lsbCBhdm9pZCBkb2luZyBSZWFsIFdvcmsgaW4gc3Vic2VxdWVudCBTdGVwIDEncy4KKyAgICAgICAgIC0tKi8KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspCisgICAgICAgICAgICBjb3B5W2pdID0gZnRhYlsoaiA8PCA4KSArIHNzXSAmIENMRUFSTUFTSzsKKworICAgICAgICAgZm9yIChqID0gZnRhYltzcyA8PCA4XSAmIENMRUFSTUFTSzsKKyAgICAgICAgICAgICAgaiA8IChmdGFiWyhzcysxKSA8PCA4XSAmIENMRUFSTUFTSyk7CisgICAgICAgICAgICAgIGorKykgeworICAgICAgICAgICAgayA9IHpwdHJbal0tMTsgaWYgKGsgPCAwKSBrICs9IG5ibG9jazsKKyAgICAgICAgICAgIGMxID0gYmxvY2tba107CisgICAgICAgICAgICBpZiAoICEgYmlnRG9uZVtjMV0gKSB7CisgICAgICAgICAgICAgICB6cHRyW2NvcHlbYzFdXSA9IGs7CisgICAgICAgICAgICAgICBjb3B5W2MxXSArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKworICAgICAgICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgZnRhYlsoaiA8PCA4KSArIHNzXSB8PSBTRVRNQVNLOworICAgICAgfQorICAgICAgaWYgKHMtPnZlcmJvc2l0eSA+PSA0KQorICAgICAgICAgVlByaW50ZjMoICIgICAgICAgICVkIHBvaW50ZXJzLCAlZCBzb3J0ZWQsICVkIHNjYW5uZWRcbiIsCisgICAgICAgICAgICAgICAgICAgbmJsb2NrLCBudW1RU29ydGVkLCBuYmxvY2sgLSBudW1RU29ydGVkICk7CisgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgcmFuZG9taXNlQmxvY2sgKCBFU3RhdGUqIHMgKQoreworICAgSW50MzIgaTsKKyAgIEJaX1JBTkRfSU5JVF9NQVNLOworICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBzLT5pblVzZVtpXSA9IEZhbHNlOworCisgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJsb2NrOyBpKyspIHsKKyAgICAgIEJaX1JBTkRfVVBEX01BU0s7CisgICAgICBzLT5ibG9ja1tpXSBePSBCWl9SQU5EX01BU0s7CisgICAgICBzLT5pblVzZVtzLT5ibG9ja1tpXV0gPSBUcnVlOworICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgYmxvY2tTb3J0ICggRVN0YXRlKiBzICkKK3sKKyAgIEludDMyIGk7CisKKyAgIHMtPndvcmtMaW1pdCAgICAgICA9IHMtPndvcmtGYWN0b3IgKiAocy0+bmJsb2NrIC0gMSk7CisgICBzLT53b3JrRG9uZSAgICAgICAgPSAwOworICAgcy0+YmxvY2tSYW5kb21pc2VkID0gRmFsc2U7CisgICBzLT5maXJzdEF0dGVtcHQgICAgPSBUcnVlOworCisgICBzb3J0TWFpbiAoIHMgKTsKKworICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKQorICAgICAgVlByaW50ZjMoICIgICAgICAlZCB3b3JrLCAlZCBibG9jaywgcmF0aW8gJTUuMmZcbiIsCisgICAgICAgICAgICAgICAgcy0+d29ya0RvbmUsIHMtPm5ibG9jay0xLCAKKyAgICAgICAgICAgICAgICAoZmxvYXQpKHMtPndvcmtEb25lKSAvIChmbG9hdCkocy0+bmJsb2NrLTEpICk7CisKKyAgIGlmIChzLT53b3JrRG9uZSA+IHMtPndvcmtMaW1pdCAmJiBzLT5maXJzdEF0dGVtcHQpIHsKKyAgICAgIGlmIChzLT52ZXJib3NpdHkgPj0gMikKKyAgICAgICAgIFZQcmludGYwKCAiICAgIHNvcnRpbmcgYWJvcnRlZDsgcmFuZG9taXNpbmcgYmxvY2tcbiIgKTsKKyAgICAgIHJhbmRvbWlzZUJsb2NrICggcyApOworICAgICAgcy0+d29ya0xpbWl0ID0gcy0+d29ya0RvbmUgPSAwOworICAgICAgcy0+YmxvY2tSYW5kb21pc2VkID0gVHJ1ZTsKKyAgICAgIHMtPmZpcnN0QXR0ZW1wdCA9IEZhbHNlOworICAgICAgc29ydE1haW4gKCBzICk7CisgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDMpCisgICAgICAgICBWUHJpbnRmMyggIiAgICAgICVkIHdvcmssICVkIGJsb2NrLCByYXRpbyAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT53b3JrRG9uZSwgcy0+bmJsb2NrLTEsIAorICAgICAgICAgICAgICAgICAgIChmbG9hdCkocy0+d29ya0RvbmUpIC8gKGZsb2F0KShzLT5uYmxvY2stMSkgKTsKKyAgIH0KKworICAgcy0+b3JpZ1B0ciA9IC0xOworICAgZm9yIChpID0gMDsgaSA8IHMtPm5ibG9jazsgaSsrKQorICAgICAgIGlmIChzLT56cHRyW2ldID09IDApCisgICAgICAgICAgeyBzLT5vcmlnUHRyID0gaTsgYnJlYWs7IH07CisKKyAgIEFzc2VydEgoIHMtPm9yaWdQdHIgIT0gLTEsIDEwMDMgKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc29ydC5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYnppcDIuMSBiL2J6aXAyLjEKaW5kZXggNDg5NjY4Zi4uYTY3ODlhNCAxMDA2NDQKLS0tIGEvYnppcDIuMQorKysgYi9iemlwMi4xCkBAIC0xLDIxICsxLDI5IEBACiAuUFUKIC5USCBiemlwMiAxCiAuU0ggTkFNRQotYnppcDIsIGJ1bnppcDIgXC0gYSBibG9jay1zb3J0aW5nIGZpbGUgY29tcHJlc3NvciwgdjAuMQorYnppcDIsIGJ1bnppcDIgXC0gYSBibG9jay1zb3J0aW5nIGZpbGUgY29tcHJlc3NvciwgdjAuOS4wCisuYnIKK2J6Y2F0IFwtIGRlY29tcHJlc3NlcyBmaWxlcyB0byBzdGRvdXQKIC5icgogYnppcDJyZWNvdmVyIFwtIHJlY292ZXJzIGRhdGEgZnJvbSBkYW1hZ2VkIGJ6aXAyIGZpbGVzCiAKIC5TSCBTWU5PUFNJUwogLmxsICs4CiAuQiBiemlwMgotLlJCIFsgIiBcLWNkZmtzdHZWTDEyMzQ1Njc4OSAiIF0KKy5SQiBbICIgXC1jZGZrc3R2elZMMTIzNDU2Nzg5ICIgXQogWwogLkkgImZpbGVuYW1lcyBcJi4uLiIKIF0KIC5sbCAtOAogLmJyCiAuQiBidW56aXAyCi0uUkIgWyAiIFwta3ZzVkwgIiBdCisuUkIgWyAiIFwtZmt2c1ZMICIgXQorWworLkkgImZpbGVuYW1lcyBcJi4uLiIKK10KKy5iciAKKy5CIGJ6Y2F0CisuUkIgWyAiIFwtcyAiIF0KIFsKIC5JICJmaWxlbmFtZXMgXCYuLi4iCiBdCkBAIC0yNCw3ICszMiw3IEBACiAuSSAiZmlsZW5hbWUiCiAKIC5TSCBERVNDUklQVElPTgotLkkgQnppcDIKKy5JIGJ6aXAyCiBjb21wcmVzc2VzIGZpbGVzIHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgYmxvY2stc29ydGluZyAKIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgSHVmZm1hbiBjb2RpbmcuCiBDb21wcmVzc2lvbiBpcyBnZW5lcmFsbHkgY29uc2lkZXJhYmx5CkBAIC0zOCw3ICs0Niw3IEBACiAuSSBHTlUgR3ppcCwKIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLgogCi0uSSBCemlwMiAKKy5JIGJ6aXAyIAogZXhwZWN0cyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB0byBhY2NvbXBhbnkgdGhlIGNvbW1hbmQtbGluZSBmbGFncy4gIAogRWFjaCBmaWxlIGlzIHJlcGxhY2VkIGJ5IGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIGl0c2VsZiwKIHdpdGggdGhlIG5hbWUgIm9yaWdpbmFsX25hbWUuYnoyIi4KQEAgLTUwLDExICs1OCwxMSBAQAogd2hpY2ggbGFjayB0aGVzZSBjb25jZXB0cywgb3IgaGF2ZSBzZXJpb3VzIGZpbGUgbmFtZSBsZW5ndGgKIHJlc3RyaWN0aW9ucywgc3VjaCBhcyBNUy1ET1MuCiAKLS5JIEJ6aXAyCisuSSBiemlwMgogYW5kCiAuSSBidW56aXAyCi13aWxsIG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXM7IGlmIHlvdSB3YW50IHRoaXMgdG8gaGFwcGVuLAoteW91IHNob3VsZCBkZWxldGUgdGhlbSBmaXJzdC4KK3dpbGwgYnkgZGVmYXVsdCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzOyAKK2lmIHlvdSB3YW50IHRoaXMgdG8gaGFwcGVuLCBzcGVjaWZ5IHRoZSBcLWYgZmxhZy4KIAogSWYgbm8gZmlsZSBuYW1lcyBhcmUgc3BlY2lmaWVkLAogLkkgYnppcDIKQEAgLTY0LDcgKzcyLDcgQEAKIHdpbGwgZGVjbGluZSB0byB3cml0ZSBjb21wcmVzc2VkIG91dHB1dCB0byBhIHRlcm1pbmFsLCBhcwogdGhpcyB3b3VsZCBiZSBlbnRpcmVseSBpbmNvbXByZWhlbnNpYmxlIGFuZCB0aGVyZWZvcmUgcG9pbnRsZXNzLgogCi0uSSBCdW56aXAyCisuSSBidW56aXAyCiAob3IKIC5JIGJ6aXAyIFwtZAogKSBkZWNvbXByZXNzZXMgYW5kIHJlc3RvcmVzIGFsbCBzcGVjaWZpZWQgZmlsZXMgd2hvc2UgbmFtZXMKQEAgLTczLDEyICs4MSwyOCBAQAogQWdhaW4sIHN1cHBseWluZyBubyBmaWxlbmFtZXMKIGNhdXNlcyBkZWNvbXByZXNzaW9uIGZyb20gc3RhbmRhcmQgaW5wdXQgdG8gc3RhbmRhcmQgb3V0cHV0LgogCisuSSBidW56aXAyCit3aWxsIGNvcnJlY3RseSBkZWNvbXByZXNzIGEgZmlsZSB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbgorb2YgdHdvIG9yIG1vcmUgY29tcHJlc3NlZCBmaWxlcy4gIFRoZSByZXN1bHQgaXMgdGhlIGNvbmNhdGVuYXRpb24KK29mIHRoZSBjb3JyZXNwb25kaW5nIHVuY29tcHJlc3NlZCBmaWxlcy4gIEludGVncml0eSB0ZXN0aW5nCisoXC10KSBvZiBjb25jYXRlbmF0ZWQgY29tcHJlc3NlZCBmaWxlcyBpcyBhbHNvIHN1cHBvcnRlZC4KKwogWW91IGNhbiBhbHNvIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZmlsZXMgdG8KIHRoZSBzdGFuZGFyZCBvdXRwdXQgYnkgZ2l2aW5nIHRoZSBcLWMgZmxhZy4KLVlvdSBjYW4gZGVjb21wcmVzcyBtdWx0aXBsZSBmaWxlcyBsaWtlIHRoaXMsIGJ1dCB5b3UgbWF5Ci1vbmx5IGNvbXByZXNzIGEgc2luZ2xlIGZpbGUgdGhpcyB3YXksIHNpbmNlIGl0IHdvdWxkIG90aGVyd2lzZQotYmUgZGlmZmljdWx0IHRvIHNlcGFyYXRlIG91dCB0aGUgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbnMgb2YKLXRoZSBvcmlnaW5hbCBmaWxlcy4KK011bHRpcGxlIGZpbGVzIG1heSBiZSBjb21wcmVzc2VkIGFuZCBkZWNvbXByZXNzZWQgbGlrZSB0aGlzLgorVGhlIHJlc3VsdGluZyBvdXRwdXRzIGFyZSBmZWQgc2VxdWVudGlhbGx5IHRvIHN0ZG91dC4KK0NvbXByZXNzaW9uIG9mIG11bHRpcGxlIGZpbGVzIGluIHRoaXMgbWFubmVyIGdlbmVyYXRlcworYSBzdHJlYW0gY29udGFpbmluZyBtdWx0aXBsZSBjb21wcmVzc2VkIGZpbGUgcmVwcmVzZW50YXRpb25zLgorU3VjaCBhIHN0cmVhbSBjYW4gYmUgZGVjb21wcmVzc2VkIGNvcnJlY3RseSBvbmx5IGJ5CisuSSBiemlwMgordmVyc2lvbiAwLjkuMCBvciBsYXRlci4gIEVhcmxpZXIgdmVyc2lvbnMgb2YKKy5JIGJ6aXAyCit3aWxsIHN0b3AgYWZ0ZXIgZGVjb21wcmVzc2luZyB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgc3RyZWFtLgorCisuSSBiemNhdAorKG9yCisuSSBiemlwMiBcLWRjCispIGRlY29tcHJlc3NlcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCiAKIENvbXByZXNzaW9uIGlzIGFsd2F5cyBwZXJmb3JtZWQsIGV2ZW4gaWYgdGhlIGNvbXByZXNzZWQgZmlsZSBpcwogc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsLiAgRmlsZXMgb2YgbGVzcyB0aGFuIGFib3V0CkBAIC0xMzIsNyArMTU2LDcgQEAKIAogICAgICAgQ29tcHJlc3Npb246ICAgNDAwayArICggNyB4IGJsb2NrIHNpemUgKQogCi0gICAgICBEZWNvbXByZXNzaW9uOiAxMDBrICsgKCA1IHggYmxvY2sgc2l6ZSApLCBvcgorICAgICAgRGVjb21wcmVzc2lvbjogMTAwayArICggNCB4IGJsb2NrIHNpemUgKSwgb3IKIC5icgogICAgICAgICAgICAgICAgICAgICAgMTAwayArICggMi41IHggYmxvY2sgc2l6ZSApCiAKQEAgLTE0Nyw3ICsxNzEsNyBAQAogCiBGb3IgZmlsZXMgY29tcHJlc3NlZCB3aXRoIHRoZSBkZWZhdWx0IDkwMGsgYmxvY2sgc2l6ZSwgCiAuSSBidW56aXAyCi13aWxsIHJlcXVpcmUgYWJvdXQgNDYwMCBrYnl0ZXMgdG8gZGVjb21wcmVzcy4KK3dpbGwgcmVxdWlyZSBhYm91dCAzNzAwIGtieXRlcyB0byBkZWNvbXByZXNzLgogVG8gc3VwcG9ydCBkZWNvbXByZXNzaW9uIG9mIGFueSBmaWxlIG9uIGEgNCBtZWdhYnl0ZSBtYWNoaW5lLAogLkkgYnVuemlwMgogaGFzIGFuIG9wdGlvbiB0byBkZWNvbXByZXNzIHVzaW5nIGFwcHJveGltYXRlbHkgaGFsZiB0aGlzCkBAIC0xNjgsOCArMTkyLDggQEAKIFwtOQogd2lsbCBjYXVzZSB0aGUgY29tcHJlc3NvciB0byBhbGxvY2F0ZSBhcm91bmQKIDY3MDBrIG9mIG1lbW9yeSwgYnV0IG9ubHkgdG91Y2ggNDAwayArIDIwMDAwICogNyA9IDU0MAota2J5dGVzIG9mIGl0LiAgU2ltaWxhcmx5LCB0aGUgZGVjb21wcmVzc29yIHdpbGwgYWxsb2NhdGUgNDYwMGsgYnV0Ci1vbmx5IHRvdWNoIDEwMGsgKyAyMDAwMCAqIDUgPSAyMDAga2J5dGVzLgora2J5dGVzIG9mIGl0LiAgU2ltaWxhcmx5LCB0aGUgZGVjb21wcmVzc29yIHdpbGwgYWxsb2NhdGUgMzcwMGsgYnV0Citvbmx5IHRvdWNoIDEwMGsgKyAyMDAwMCAqIDQgPSAxODAga2J5dGVzLgogCiBIZXJlIGlzIGEgdGFibGUgd2hpY2ggc3VtbWFyaXNlcyB0aGUgbWF4aW11bSBtZW1vcnkgdXNhZ2UgZm9yIAogZGlmZmVyZW50IGJsb2NrIHNpemVzLiAgQWxzbyByZWNvcmRlZCBpcyB0aGUgdG90YWwgY29tcHJlc3NlZApAQCAtMTgyLDcxICsyMDYsNzMgQEAKICAgICAgICAgICAgQ29tcHJlc3MgICBEZWNvbXByZXNzICAgRGVjb21wcmVzcyAgIENvcnB1cwogICAgIEZsYWcgICAgIHVzYWdlICAgICAgdXNhZ2UgICAgICAgLXMgdXNhZ2UgICAgIFNpemUKIAotICAgICAtMSAgICAgIDExMDBrICAgICAgIDYwMGsgICAgICAgICAzNTBrICAgICAgOTE0NzA0Ci0gICAgIC0yICAgICAgMTgwMGsgICAgICAxMTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKLSAgICAgLTMgICAgICAyNTAwayAgICAgIDE2MDBrICAgICAgICAgODUwayAgICAgIDg2MDMzOAotICAgICAtNCAgICAgIDMyMDBrICAgICAgMjEwMGsgICAgICAgIDExMDBrICAgICAgODQ2ODk5Ci0gICAgIC01ICAgICAgMzkwMGsgICAgICAyNjAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKLSAgICAgLTYgICAgICA0NjAwayAgICAgIDMxMDBrICAgICAgICAxNjAwayAgICAgIDgzODYyNgotICAgICAtNyAgICAgIDU0MDBrICAgICAgMzYwMGsgICAgICAgIDE4NTBrICAgICAgODM0MDk2Ci0gICAgIC04ICAgICAgNjAwMGsgICAgICA0MTAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKLSAgICAgLTkgICAgICA2NzAwayAgICAgIDQ2MDBrICAgICAgICAyMzUwayAgICAgIDgyODY0MgorICAgICAtMSAgICAgIDExMDBrICAgICAgIDUwMGsgICAgICAgICAzNTBrICAgICAgOTE0NzA0CisgICAgIC0yICAgICAgMTgwMGsgICAgICAgOTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKKyAgICAgLTMgICAgICAyNTAwayAgICAgIDEzMDBrICAgICAgICAgODUwayAgICAgIDg2MDMzOAorICAgICAtNCAgICAgIDMyMDBrICAgICAgMTcwMGsgICAgICAgIDExMDBrICAgICAgODQ2ODk5CisgICAgIC01ICAgICAgMzkwMGsgICAgICAyMTAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKKyAgICAgLTYgICAgICA0NjAwayAgICAgIDI1MDBrICAgICAgICAxNjAwayAgICAgIDgzODYyNgorICAgICAtNyAgICAgIDU0MDBrICAgICAgMjkwMGsgICAgICAgIDE4NTBrICAgICAgODM0MDk2CisgICAgIC04ICAgICAgNjAwMGsgICAgICAzMzAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKKyAgICAgLTkgICAgICA2NzAwayAgICAgIDM3MDBrICAgICAgICAyMzUwayAgICAgIDgyODY0MgogCiAuU0ggT1BUSU9OUwogLlRQCi0uQiBcLWMgIC0tc3Rkb3V0CisuQiBcLWMgLS1zdGRvdXQKIENvbXByZXNzIG9yIGRlY29tcHJlc3MgdG8gc3RhbmRhcmQgb3V0cHV0LiAgXC1jIHdpbGwgZGVjb21wcmVzcwogbXVsdGlwbGUgZmlsZXMgdG8gc3Rkb3V0LCBidXQgd2lsbCBvbmx5IGNvbXByZXNzIGEgc2luZ2xlIGZpbGUgdG8KIHN0ZG91dC4KIC5UUAogLkIgXC1kIC0tZGVjb21wcmVzcwogRm9yY2UgZGVjb21wcmVzc2lvbi4KLS5JIEJ6aXAyCi1hbmQKKy5JIGJ6aXAyLAogLkkgYnVuemlwMgotYXJlIHJlYWxseSB0aGUgc2FtZSBwcm9ncmFtLCBhbmQgdGhlIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgdG8KLWNvbXByZXNzIG9yIGRlY29tcHJlc3MgaXMgZG9uZSBvbiB0aGUgYmFzaXMgb2Ygd2hpY2ggbmFtZSBpcworYW5kCisuSSBiemNhdAorYXJlIHJlYWxseSB0aGUgc2FtZSBwcm9ncmFtLCBhbmQgdGhlIGRlY2lzaW9uIGFib3V0IHdoYXQgYWN0aW9ucwordG8gdGFrZSBpcyBkb25lIG9uIHRoZSBiYXNpcyBvZiB3aGljaCBuYW1lIGlzCiB1c2VkLiAgVGhpcyBmbGFnIG92ZXJyaWRlcyB0aGF0IG1lY2hhbmlzbSwgYW5kIGZvcmNlcwogLkkgYnppcDIKIHRvIGRlY29tcHJlc3MuCiAuVFAgCi0uQiBcLWYgLS1jb21wcmVzcworLkIgXC16IC0tY29tcHJlc3MKIFRoZSBjb21wbGVtZW50IHRvIFwtZDogZm9yY2VzIGNvbXByZXNzaW9uLCByZWdhcmRsZXNzIG9mIHRoZSBpbnZva2F0aW9uCiBuYW1lLgogLlRQCiAuQiBcLXQgLS10ZXN0CiBDaGVjayBpbnRlZ3JpdHkgb2YgdGhlIHNwZWNpZmllZCBmaWxlKHMpLCBidXQgZG9uJ3QgZGVjb21wcmVzcyB0aGVtLgotVGhpcyByZWFsbHkgcGVyZm9ybXMgYSB0cmlhbCBkZWNvbXByZXNzaW9uIGFuZCB0aHJvd3MgYXdheSB0aGUgcmVzdWx0LAotdXNpbmcgdGhlIGxvdy1tZW1vcnkgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKHNlZSBcLXMpLgorVGhpcyByZWFsbHkgcGVyZm9ybXMgYSB0cmlhbCBkZWNvbXByZXNzaW9uIGFuZCB0aHJvd3MgYXdheSB0aGUgcmVzdWx0LgorLlRQCisuQiBcLWYgLS1mb3JjZQorRm9yY2Ugb3ZlcndyaXRlIG9mIG91dHB1dCBmaWxlcy4gIE5vcm1hbGx5LAorLkkgYnppcDIKK3dpbGwgbm90IG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMuCiAuVFAKIC5CIFwtayAtLWtlZXAKIEtlZXAgKGRvbid0IGRlbGV0ZSkgaW5wdXQgZmlsZXMgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24uCiAuVFAKIC5CIFwtcyAtLXNtYWxsCi1SZWR1Y2UgbWVtb3J5IHVzYWdlLCBib3RoIGZvciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLUZpbGVzIGFyZSBkZWNvbXByZXNzZWQgdXNpbmcgYSBtb2RpZmllZCBhbGdvcml0aG0gd2hpY2ggb25seQorUmVkdWNlIG1lbW9yeSB1c2FnZSwgZm9yIGNvbXByZXNzaW9uLCBkZWNvbXByZXNzaW9uIGFuZAordGVzdGluZy4KK0ZpbGVzIGFyZSBkZWNvbXByZXNzZWQgYW5kIHRlc3RlZCB1c2luZyBhIG1vZGlmaWVkIGFsZ29yaXRobSB3aGljaCBvbmx5CiByZXF1aXJlcyAyLjUgYnl0ZXMgcGVyIGJsb2NrIGJ5dGUuICBUaGlzIG1lYW5zIGFueSBmaWxlIGNhbiBiZQotZGVjb21wcmVzc2VkIGluIDIzMDBrIG9mIG1lbW9yeSwgYWxiZWl0IHNvbWV3aGF0IG1vcmUgc2xvd2x5IHRoYW4KLXVzdWFsLgorZGVjb21wcmVzc2VkIGluIDIzMDBrIG9mIG1lbW9yeSwgYWxiZWl0IGF0IGFib3V0IGhhbGYgdGhlIG5vcm1hbAorc3BlZWQuCiAKIER1cmluZyBjb21wcmVzc2lvbiwgLXMgc2VsZWN0cyBhIGJsb2NrIHNpemUgb2YgMjAwaywgd2hpY2ggbGltaXRzCiBtZW1vcnkgdXNlIHRvIGFyb3VuZCB0aGUgc2FtZSBmaWd1cmUsIGF0IHRoZSBleHBlbnNlIG9mIHlvdXIKIGNvbXByZXNzaW9uIHJhdGlvLiAgSW4gc2hvcnQsIGlmIHlvdXIgbWFjaGluZSBpcyBsb3cgb24gbWVtb3J5CiAoOCBtZWdhYnl0ZXMgb3IgbGVzcyksIHVzZSAtcyBmb3IgZXZlcnl0aGluZy4gIFNlZQogTUVNT1JZIE1BTkFHRU1FTlQgYWJvdmUuCi0KIC5UUAogLkIgXC12IC0tdmVyYm9zZQogVmVyYm9zZSBtb2RlIC0tIHNob3cgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGZvciBlYWNoIGZpbGUgcHJvY2Vzc2VkLgogRnVydGhlciBcLXYncyBpbmNyZWFzZSB0aGUgdmVyYm9zaXR5IGxldmVsLCBzcGV3aW5nIG91dCBsb3RzIG9mCiBpbmZvcm1hdGlvbiB3aGljaCBpcyBwcmltYXJpbHkgb2YgaW50ZXJlc3QgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCiAuVFAKLS5CIFwtTCAtLWxpY2Vuc2UKKy5CIFwtTCAtLWxpY2Vuc2UgLVYgLS12ZXJzaW9uCiBEaXNwbGF5IHRoZSBzb2Z0d2FyZSB2ZXJzaW9uLCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zLgogLlRQCi0uQiBcLVYgLS12ZXJzaW9uCi1TYW1lIGFzIFwtTC4KLS5UUAogLkIgXC0xIHRvIFwtOSAKIFNldCB0aGUgYmxvY2sgc2l6ZSB0byAxMDAgaywgMjAwIGsgLi4gOTAwIGsgd2hlbgogY29tcHJlc3NpbmcuICBIYXMgbm8gZWZmZWN0IHdoZW4gZGVjb21wcmVzc2luZy4KQEAgLTMyOSwxMCArMzU1LDYgQEAKIElmIHlvdSBkbyBnZXQgYSBmaWxlIHdoaWNoIGNhdXNlcyBzZXZlcmUgc2xvd25lc3MgaW4gY29tcHJlc3Npb24sCiB0cnkgbWFraW5nIHRoZSBibG9jayBzaXplIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCB3aXRoIGZsYWcgXC0xLgogCi1JbmNvbXByZXNzaWJsZSBvciB2aXJ0dWFsbHktaW5jb21wcmVzc2libGUgZGF0YSBtYXkgZGVjb21wcmVzcwotcmF0aGVyIG1vcmUgc2xvd2x5IHRoYW4gb25lIHdvdWxkIGhvcGUuICBUaGlzIGlzIGR1ZSB0byAKLWEgbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vdmUtdG8tZnJvbnQgY29kZXIuCi0KIC5JIGJ6aXAyCiB1c3VhbGx5IGFsbG9jYXRlcyBzZXZlcmFsIG1lZ2FieXRlcyBvZiBtZW1vcnkgdG8gb3BlcmF0ZSBpbiwKIGFuZCB0aGVuIGNoYXJnZXMgYWxsIG92ZXIgaXQgaW4gYSBmYWlybHkgcmFuZG9tIGZhc2hpb24uICBUaGlzCkBAIC0zNDYsMjggKzM2OCwxOSBAQAogLkkgYnppcDIKIHdpbGwgcGVyZm9ybSBiZXN0IG9uIG1hY2hpbmVzIHdpdGggdmVyeSBsYXJnZSBjYWNoZXMuCiAKLVRlc3QgbW9kZSAoXC10KSB1c2VzIHRoZSBsb3ctbWVtb3J5IGRlY29tcHJlc3Npb24gYWxnb3JpdGhtCi0oXC1zKS4gIFRoaXMgbWVhbnMgdGVzdCBtb2RlIGRvZXMgbm90IHJ1biBhcyBmYXN0IGFzIGl0IGNvdWxkOwotaXQgY291bGQgcnVuIGFzIGZhc3QgYXMgdGhlIG5vcm1hbCBkZWNvbXByZXNzaW9uIG1hY2hpbmVyeS4KLVRoaXMgY291bGQgZWFzaWx5IGJlIGZpeGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgY29kZSBibG9hdC4KLQogLlNIIENBVkVBVFMKIEkvTyBlcnJvciBtZXNzYWdlcyBhcmUgbm90IGFzIGhlbHBmdWwgYXMgdGhleSBjb3VsZCBiZS4KIC5JIEJ6aXAyCiB0cmllcyBoYXJkIHRvIGRldGVjdCBJL08gZXJyb3JzIGFuZCBleGl0IGNsZWFubHksIGJ1dCB0aGUKIGRldGFpbHMgb2Ygd2hhdCB0aGUgcHJvYmxlbSBpcyBzb21ldGltZXMgc2VlbSByYXRoZXIgbWlzbGVhZGluZy4KIAotVGhpcyBtYW51YWwgcGFnZSBwZXJ0YWlucyB0byB2ZXJzaW9uIDAuMSBvZiAKK1RoaXMgbWFudWFsIHBhZ2UgcGVydGFpbnMgdG8gdmVyc2lvbiAwLjkuMCBvZiAKIC5JIGJ6aXAyLiAgCi1JdCBtYXkgd2VsbCBoYXBwZW4gdGhhdCBzb21lIGZ1dHVyZSB2ZXJzaW9uIHdpbGwKLXVzZSBhIGRpZmZlcmVudCBjb21wcmVzc2VkIGZpbGUgZm9ybWF0LiAgSWYgeW91IHRyeSB0byAKLWRlY29tcHJlc3MsIHVzaW5nIDAuMSwgYSAuYnoyIGZpbGUgY3JlYXRlZCB3aXRoIHNvbWUKLWZ1dHVyZSB2ZXJzaW9uIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgY29tcHJlc3NlZCBmaWxlIGZvcm1hdCwKLTAuMSB3aWxsIGNvbXBsYWluIHRoYXQgeW91ciBmaWxlICJpcyBub3QgYSBiemlwMiBmaWxlIi4KLUlmIHRoYXQgaGFwcGVucywgeW91IHNob3VsZCBvYnRhaW4gYSBtb3JlIHJlY2VudCB2ZXJzaW9uCi1vZiAKLS5JIGJ6aXAyCi1hbmQgdXNlIHRoYXQgdG8gZGVjb21wcmVzcyB0aGUgZmlsZS4KK0NvbXByZXNzZWQgZGF0YSBjcmVhdGVkIGJ5IHRoaXMgdmVyc2lvbiBpcyBlbnRpcmVseSBmb3J3YXJkcyBhbmQKK2JhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlLCB2ZXJzaW9uIDAuMXBsMiwKK2J1dCB3aXRoIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOiAwLjkuMCBjYW4gY29ycmVjdGx5IGRlY29tcHJlc3MKK211bHRpcGxlIGNvbmNhdGVuYXRlZCBjb21wcmVzc2VkIGZpbGVzLiAgMC4xcGwyIGNhbm5vdCBkbyB0aGlzOyBpdAord2lsbCBzdG9wIGFmdGVyIGRlY29tcHJlc3NpbmcganVzdCB0aGUgZmlyc3QgZmlsZSBpbiB0aGUgc3RyZWFtLgogCiBXaWxkY2FyZCBleHBhbnNpb24gZm9yIFdpbmRvd3MgOTUgYW5kIE5UIAogaXMgZmxha3kuCkBAIC0zNzcsNjMgKzM5MCwyNSBAQAogY29tcHJlc3NlZCBmaWxlcywgc28gaXQgY2Fubm90IGhhbmRsZSBjb21wcmVzc2VkIGZpbGVzCiBtb3JlIHRoYW4gNTEyIG1lZ2FieXRlcyBsb25nLiAgVGhpcyBjb3VsZCBlYXNpbHkgYmUgZml4ZWQuCiAKLS5JIGJ6aXAycmVjb3Zlcgotc29tZXRpbWVzIHJlcG9ydHMgYSB2ZXJ5IHNtYWxsLCBpbmNvbXBsZXRlIGZpbmFsIGJsb2NrLgotVGhpcyBpcyBzcHVyaW91cyBhbmQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLgotCi0uU0ggUkVMQVRJT05TSElQIFRPIGJ6aXAtMC4yMQotVGhpcyBwcm9ncmFtIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgCi0uSSBiemlwCi1wcm9ncmFtLCB2ZXJzaW9uIDAuMjEsIHdoaWNoIEkgcmVsZWFzZWQgaW4gQXVndXN0IDE5OTYuICAKLVRoZSBwcmltYXJ5IGRpZmZlcmVuY2Ugb2YKLS5JIGJ6aXAyCi1pcyBpdHMgYXZvaWRhbmNlIG9mIHRoZSBwb3NzaWJseSBwYXRlbnRlZCBhbGdvcml0aG1zCi13aGljaCB3ZXJlIHVzZWQgaW4gMC4yMS4gIAotLkkgYnppcDIKLWFsc28gYnJpbmdzIHZhcmlvdXMgdXNlZnVsIHJlZmluZW1lbnRzIChcLXMsIFwtdCksCi11c2VzIGxlc3MgbWVtb3J5LCBkZWNvbXByZXNzZXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIsIGFuZAotaGFzIHN1cHBvcnQgZm9yIHJlY292ZXJpbmcgZGF0YSBmcm9tIGRhbWFnZWQgZmlsZXMuCi0KLUJlY2F1c2UKLS5JIGJ6aXAyCi11c2VzIEh1ZmZtYW4gY29kaW5nIHRvIGNvbnN0cnVjdCB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0sCi1yYXRoZXIgdGhhbiB0aGUgYXJpdGhtZXRpYyBjb2RpbmcgdXNlZCBpbiAwLjIxLAotdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb25zIGdlbmVyYXRlZCBieSB0aGUgdHdvIHByb2dyYW1zCi1hcmUgaW5jb21wYXRpYmxlLCBhbmQgdGhleSB3aWxsIG5vdCBpbnRlcm9wZXJhdGUuICBUaGUgY2hhbmdlCi1pbiBzdWZmaXggZnJvbSAuYnogdG8gLmJ6MiByZWZsZWN0cyB0aGlzLiAgSXQgd291bGQgaGF2ZSBiZWVuCi1oZWxwZnVsIHRvIGF0IGxlYXN0IGFsbG93Ci0uSSBiemlwMgotdG8gZGVjb21wcmVzcyBmaWxlcyBjcmVhdGVkIGJ5IDAuMjEsIGJ1dCB0aGlzIHdvdWxkCi1kZWZlYXQgdGhlIHByaW1hcnkgYWltIG9mIGhhdmluZyBhIHBhdGVudC1mcmVlIGNvbXByZXNzb3IuCi0KLUZvciBhIG1vcmUgcHJlY2lzZSBzdGF0ZW1lbnQgYWJvdXQgcGF0ZW50IGlzc3VlcyBpbgotYnppcDIsIHBsZWFzZSBzZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24uCi0KLUh1ZmZtYW4gY29kaW5nIG5lY2Vzc2FyaWx5IGludm9sdmVzIHNvbWUgY29kaW5nIGluZWZmaWNpZW5jeQotY29tcGFyZWQgdG8gYXJpdGhtZXRpYyBjb2RpbmcuICBUaGlzIG1lYW5zIHRoYXQKLS5JIGJ6aXAyCi1jb21wcmVzc2VzIGFib3V0IDElIHdvcnNlIHRoYW4gMC4yMSwgYW4gdW5mb3J0dW5hdGUgYnV0Ci11bmF2b2lkYWJsZSBmYWN0LW9mLWxpZmUuICBPbiB0aGUgb3RoZXIgaGFuZCwgZGVjb21wcmVzc2lvbgotaXMgYXBwcm94aW1hdGVseSA1MCUgZmFzdGVyIGZvciB0aGUgc2FtZSByZWFzb24sIGFuZCB0aGUKLWNoYW5nZSBpbiBmaWxlIGZvcm1hdCBnYXZlIGFuIG9wcG9ydHVuaXR5IHRvIGFkZCBkYXRhLXJlY292ZXJ5Ci1mZWF0dXJlcy4gIFNvIGl0IGlzIG5vdCBhbGwgYmFkLgotCiAuU0ggQVVUSE9SCiBKdWxpYW4gU2V3YXJkLCBqc2V3YXJkQGFjbS5vcmcuCiAKK2h0dHA6Ly93d3cubXVyYXJvYS5kZW1vbi5jby51aworCiBUaGUgaWRlYXMgZW1ib2RpZWQgaW4gCi0uSSBiemlwCi1hbmQKIC5JIGJ6aXAyCiBhcmUgZHVlIHRvIChhdCBsZWFzdCkgdGhlIGZvbGxvd2luZyBwZW9wbGU6CiBNaWNoYWVsIEJ1cnJvd3MgYW5kIERhdmlkIFdoZWVsZXIgKGZvciB0aGUgYmxvY2sgc29ydGluZwogdHJhbnNmb3JtYXRpb24pLCBEYXZpZCBXaGVlbGVyIChhZ2FpbiwgZm9yIHRoZSBIdWZmbWFuIGNvZGVyKSwKLVBldGVyIEZlbndpY2sgKGZvciB0aGUgc3RydWN0dXJlZCBjb2RpbmcgbW9kZWwgaW4gMC4yMSwgCitQZXRlciBGZW53aWNrIChmb3IgdGhlIHN0cnVjdHVyZWQgY29kaW5nIG1vZGVsIGluIHRoZSBvcmlnaW5hbAorLkkgYnppcCwgCiBhbmQgbWFueSByZWZpbmVtZW50cyksCiBhbmQKIEFsaXN0YWlyIE1vZmZhdCwgUmFkZm9yZCBOZWFsIGFuZCBJYW4gV2l0dGVuIChmb3IgdGhlIGFyaXRobWV0aWMKLWNvZGVyIGluIDAuMjEpLiAgSSBhbSBtdWNoIGluZGVidGVkIGZvciB0aGVpciBoZWxwLCBzdXBwb3J0IGFuZCBhZHZpY2UuCi1TZWUgdGhlIGZpbGUgQUxHT1JJVEhNUyBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgcG9pbnRlcnMgdG8KK2NvZGVyIGluIHRoZSBvcmlnaW5hbAorLkkgYnppcCkuICAKK0kgYW0gbXVjaCBpbmRlYnRlZCBmb3IgdGhlaXIgaGVscCwgc3VwcG9ydCBhbmQgYWR2aWNlLgorU2VlIHRoZSBtYW51YWwgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIHBvaW50ZXJzIHRvCiBzb3VyY2VzIG9mIGRvY3VtZW50YXRpb24uCiBDaHJpc3RpYW4gdm9uIFJvcXVlcyBlbmNvdXJhZ2VkIG1lIHRvIGxvb2sgZm9yIGZhc3Rlcgogc29ydGluZyBhbGdvcml0aG1zLCBzbyBhcyB0byBzcGVlZCB1cCBjb21wcmVzc2lvbi4KZGlmZiAtLWdpdCBhL2J6aXAyLjEucHJlZm9ybWF0dGVkIGIvYnppcDIuMS5wcmVmb3JtYXR0ZWQKaW5kZXggNTIwNmUwNS4uOGM0ZmFiMSAxMDA2NDQKLS0tIGEvYnppcDIuMS5wcmVmb3JtYXR0ZWQKKysrIGIvYnppcDIuMS5wcmVmb3JtYXR0ZWQKQEAgLTUsMTggKzUsMjAgQEAKIAogCiBOCE5BCEFNCE1FCEUKLSAgICAgICBiemlwMiwgYnVuemlwMiAtIGEgYmxvY2stc29ydGluZyBmaWxlIGNvbXByZXNzb3IsIHYwLjEKKyAgICAgICBiemlwMiwgYnVuemlwMiAtIGEgYmxvY2stc29ydGluZyBmaWxlIGNvbXByZXNzb3IsIHYwLjkuMAorICAgICAgIGJ6Y2F0IC0gZGVjb21wcmVzc2VzIGZpbGVzIHRvIHN0ZG91dAogICAgICAgIGJ6aXAycmVjb3ZlciAtIHJlY292ZXJzIGRhdGEgZnJvbSBkYW1hZ2VkIGJ6aXAyIGZpbGVzCiAKIAogUwhTWQhZTghOTwhPUAhQUwhTSQhJUwhTCi0gICAgICAgYghiegh6aQhpcAhwMggyIFsgLQgtYwhjZAhkZghmawhrcwhzdAh0dgh2VghWTAhMMQgxMggyMwgzNAg0NQg1Ngg2Nwg3OAg4OQg5IF0gWyBfCGZfCGlfCGxfCGVfCG5fCGFfCG1fCGVfCHMgXwguXwguXwguICBdCi0gICAgICAgYghidQh1bghuegh6aQhpcAhwMggyIFsgLQgtawhrdgh2cwhzVghWTAhMIF0gWyBfCGZfCGlfCGxfCGVfCG5fCGFfCG1fCGVfCHMgXwguXwguXwguICBdCisgICAgICAgYghiegh6aQhpcAhwMggyIFsgLQgtYwhjZAhkZghmawhrcwhzdAh0dgh2egh6VghWTAhMMQgxMggyMwgzNAg0NQg1Ngg2Nwg3OAg4OQg5IF0gWyBfCGZfCGlfCGxfCGVfCG5fCGFfCG1fCGVfCHMgXwguXwguXwguICBdCisgICAgICAgYghidQh1bghuegh6aQhpcAhwMggyIFsgLQgtZghmawhrdgh2cwhzVghWTAhMIF0gWyBfCGZfCGlfCGxfCGVfCG5fCGFfCG1fCGVfCHMgXwguXwguXwguICBdCisgICAgICAgYghiegh6YwhjYQhhdAh0IFsgLQgtcwhzIF0gWyBfCGZfCGlfCGxfCGVfCG5fCGFfCG1fCGVfCHMgXwguXwguXwguICBdCiAgICAgICAgYghiegh6aQhpcAhwMggycghyZQhlYwhjbwhvdgh2ZQhlcghyIF8IZl8IaV8IbF8IZV8Ibl8IYV8IbV8IZQogCiAKIEQIREUIRVMIU0MIQ1IIUkkISVAIUFQIVEkISU8IT04ITgotICAgICAgIF8IQl8Iel8IaV8IcF8IMiAgY29tcHJlc3NlcyAgZmlsZXMgIHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgYmxvY2stCisgICAgICAgXwhiXwh6XwhpXwhwXwgyICBjb21wcmVzc2VzICBmaWxlcyAgdXNpbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciBibG9jay0KICAgICAgICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCAgYW5kICBIdWZmbWFuICBjb2RpbmcuCiAgICAgICAgQ29tcHJlc3Npb24gIGlzICBnZW5lcmFsbHkgIGNvbnNpZGVyYWJseSAgYmV0dGVyIHRoYW4gdGhhdAogICAgICAgIGFjaGlldmVkIGJ5IG1vcmUgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywKQEAgLTI2LDcgKzI4LDcgQEAKICAgICAgICBUaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGRlbGliZXJhdGVseSB2ZXJ5IHNpbWlsYXIgIHRvCiAgICAgICAgdGhvc2Ugb2YgXwhHXwhOXwhVIF8IR18Iel8IaV8IcF8ILCBidXQgdGhleSBhcmUgbm90IGlkZW50aWNhbC4KIAotICAgICAgIF8IQl8Iel8IaV8IcF8IMiAgZXhwZWN0cyAgYSBsaXN0IG9mIGZpbGUgbmFtZXMgdG8gYWNjb21wYW55IHRoZSBjb20tCisgICAgICAgXwhiXwh6XwhpXwhwXwgyICBleHBlY3RzICBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB0byBhY2NvbXBhbnkgdGhlIGNvbS0KICAgICAgICBtYW5kLWxpbmUgZmxhZ3MuICBFYWNoIGZpbGUgaXMgcmVwbGFjZWQgIGJ5ICBhICBjb21wcmVzc2VkCiAgICAgICAgdmVyc2lvbiAgb2YgIGl0c2VsZiwgIHdpdGggIHRoZSAgbmFtZSAib3JpZ2luYWxfbmFtZS5iejIiLgogICAgICAgIEVhY2ggY29tcHJlc3NlZCBmaWxlIGhhcyB0aGUgc2FtZSAgbW9kaWZpY2F0aW9uICBkYXRlICBhbmQKQEAgLTM4LDggKzQwLDggQEAKICAgICAgICBjZXB0cywgb3IgaGF2ZSBzZXJpb3VzIGZpbGUgbmFtZSBsZW5ndGggcmVzdHJpY3Rpb25zLCBzdWNoCiAgICAgICAgYXMgTVMtRE9TLgogCi0gICAgICAgXwhCXwh6XwhpXwhwXwgyICBhbmQgIF8IYl8IdV8Ibl8Iel8IaV8IcF8IMiAgd2lsbCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzOyBpZgotICAgICAgIHlvdSB3YW50IHRoaXMgdG8gaGFwcGVuLCB5b3Ugc2hvdWxkIGRlbGV0ZSB0aGVtIGZpcnN0LgorICAgICAgIF8IYl8Iel8IaV8IcF8IMiAgYW5kICBfCGJfCHVfCG5fCHpfCGlfCHBfCDIgd2lsbCBieSBkZWZhdWx0IG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcKKyAgICAgICBmaWxlczsgaWYgeW91IHdhbnQgdGhpcyB0byBoYXBwZW4sIHNwZWNpZnkgdGhlIC1mIGZsYWcuCiAKICAgICAgICBJZiBubyBmaWxlIG5hbWVzICBhcmUgIHNwZWNpZmllZCwgIF8IYl8Iel8IaV8IcF8IMiAgY29tcHJlc3NlcyAgZnJvbQogICAgICAgIHN0YW5kYXJkICBpbnB1dCAgdG8gIHN0YW5kYXJkIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgXwhiXwh6XwhpXwhwXwgyCkBAIC00NywxNyArNDksMTUgQEAKICAgICAgICB0aGlzICB3b3VsZCAgYmUgIGVudGlyZWx5ICBpbmNvbXByZWhlbnNpYmxlICBhbmQgdGhlcmVmb3JlCiAgICAgICAgcG9pbnRsZXNzLgogCi0gICAgICAgXwhCXwh1XwhuXwh6XwhpXwhwXwgyIChvciBfCGJfCHpfCGlfCHBfCDIgXwgtXwhkICkgZGVjb21wcmVzc2VzIGFuZCByZXN0b3JlcyBhbGwgc3BlYy0KKyAgICAgICBfCGJfCHVfCG5fCHpfCGlfCHBfCDIgKG9yIF8IYl8Iel8IaV8IcF8IMiBfCC1fCGQgKSBkZWNvbXByZXNzZXMgYW5kIHJlc3RvcmVzIGFsbCBzcGVjLQogICAgICAgIGlmaWVkIGZpbGVzIHdob3NlIG5hbWVzIGVuZCBpbiAiLmJ6MiIuICBGaWxlcyB3aXRob3V0IHRoaXMKICAgICAgICBzdWZmaXggYXJlIGlnbm9yZWQuICBBZ2Fpbiwgc3VwcGx5aW5nIG5vIGZpbGVuYW1lcyAgY2F1c2VzCiAgICAgICAgZGVjb21wcmVzc2lvbiBmcm9tIHN0YW5kYXJkIGlucHV0IHRvIHN0YW5kYXJkIG91dHB1dC4KIAotICAgICAgIFlvdSAgY2FuIGFsc28gY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlcyB0byB0aGUgc3RhbmRhcmQKLSAgICAgICBvdXRwdXQgYnkgZ2l2aW5nIHRoZSAtYyBmbGFnLiAgWW91IGNhbiBkZWNvbXByZXNzIG11bHRpcGxlCi0gICAgICAgZmlsZXMgIGxpa2UgIHRoaXMsIGJ1dCB5b3UgbWF5IG9ubHkgY29tcHJlc3MgYSBzaW5nbGUgZmlsZQotICAgICAgIHRoaXMgd2F5LCBzaW5jZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgZGlmZmljdWx0ICB0byAgc2VwYS0KLSAgICAgICByYXRlICBvdXQgIHRoZSAgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIG9yaWdpbmFsCi0gICAgICAgZmlsZXMuCisgICAgICAgXwhiXwh1XwhuXwh6XwhpXwhwXwgyIHdpbGwgY29ycmVjdGx5IGRlY29tcHJlc3MgYSBmaWxlIHdoaWNoIGlzIHRoZSBjb24tCisgICAgICAgY2F0ZW5hdGlvbiBvZiB0d28gb3IgbW9yZSBjb21wcmVzc2VkIGZpbGVzLiAgVGhlIHJlc3VsdCBpcworICAgICAgIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIHVuY29tcHJlc3NlZCBmaWxlcy4KKyAgICAgICBJbnRlZ3JpdHkgdGVzdGluZyAoLXQpIG9mIGNvbmNhdGVuYXRlZCBjb21wcmVzc2VkIGZpbGVzIGlzCiAKIAogCkBAIC03MCw2ICs3MCwyMSBAQAogYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKIAogCisgICAgICAgYWxzbyBzdXBwb3J0ZWQuCisKKyAgICAgICBZb3UgIGNhbiBhbHNvIGNvbXByZXNzIG9yIGRlY29tcHJlc3MgZmlsZXMgdG8gdGhlIHN0YW5kYXJkCisgICAgICAgb3V0cHV0IGJ5IGdpdmluZyB0aGUgLWMgZmxhZy4gIE11bHRpcGxlIGZpbGVzIG1heSBiZSAgY29tLQorICAgICAgIHByZXNzZWQgYW5kIGRlY29tcHJlc3NlZCBsaWtlIHRoaXMuICBUaGUgcmVzdWx0aW5nIG91dHB1dHMKKyAgICAgICBhcmUgZmVkIHNlcXVlbnRpYWxseSB0byBzdGRvdXQuICBDb21wcmVzc2lvbiAgb2YgIG11bHRpcGxlCisgICAgICAgZmlsZXMgIGluIHRoaXMgbWFubmVyIGdlbmVyYXRlcyBhIHN0cmVhbSBjb250YWluaW5nIG11bHRpLQorICAgICAgIHBsZSBjb21wcmVzc2VkIGZpbGUgcmVwcmVzZW50YXRpb25zLiAgU3VjaCBhIHN0cmVhbSBjYW4gYmUKKyAgICAgICBkZWNvbXByZXNzZWQgIGNvcnJlY3RseSAgb25seSAgYnkgIF8IYl8Iel8IaV8IcF8IMiAgdmVyc2lvbiAwLjkuMCBvcgorICAgICAgIGxhdGVyLiAgRWFybGllciB2ZXJzaW9ucyBvZiBfCGJfCHpfCGlfCHBfCDIgd2lsbCBzdG9wICBhZnRlciAgZGVjb20tCisgICAgICAgcHJlc3NpbmcgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIHN0cmVhbS4KKworICAgICAgIF8IYl8Iel8IY18IYV8IdCAgKG9yIF8IYl8Iel8IaV8IcF8IMiBfCC1fCGRfCGMgKSBkZWNvbXByZXNzZXMgYWxsIHNwZWNpZmllZCBmaWxlcyB0bworICAgICAgIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKICAgICAgICBDb21wcmVzc2lvbiBpcyBhbHdheXMgcGVyZm9ybWVkLCBldmVuICBpZiAgdGhlICBjb21wcmVzc2VkCiAgICAgICAgZmlsZSAgaXMgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsLiAgRmlsZXMgb2YgbGVzcwogICAgICAgIHRoYW4gYWJvdXQgb25lIGh1bmRyZWQgYnl0ZXMgdGVuZCB0byBnZXQgbGFyZ2VyLCBzaW5jZSB0aGUKQEAgLTEwOCwyMiArMTIzLDcgQEAKICAgICAgICBmaWxlLCBhbmQgXwhiXwh1XwhuXwh6XwhpXwhwXwgyIHRoZW4gYWxsb2NhdGVzIGl0c2VsZiBqdXN0IGVub3VnaCBtZW1vcnkKICAgICAgICB0byBkZWNvbXByZXNzIHRoZSBmaWxlLiAgU2luY2UgYmxvY2sgc2l6ZXMgYXJlICBzdG9yZWQgIGluCiAgICAgICAgY29tcHJlc3NlZCAgZmlsZXMsICBpdCBmb2xsb3dzIHRoYXQgdGhlIGZsYWdzIC0xIHRvIC05IGFyZQotICAgICAgIGlycmVsZXZhbnQgdG8gYW5kIHNvIGlnbm9yZWQgZHVyaW5nICBkZWNvbXByZXNzaW9uLiAgIENvbS0KLSAgICAgICBwcmVzc2lvbiAgYW5kIGRlY29tcHJlc3Npb24gcmVxdWlyZW1lbnRzLCBpbiBieXRlcywgY2FuIGJlCi0gICAgICAgZXN0aW1hdGVkIGFzOgotCi0gICAgICAgICAgICAgQ29tcHJlc3Npb246ICAgNDAwayArICggNyB4IGJsb2NrIHNpemUgKQotCi0gICAgICAgICAgICAgRGVjb21wcmVzc2lvbjogMTAwayArICggNSB4IGJsb2NrIHNpemUgKSwgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDBrICsgKCAyLjUgeCBibG9jayBzaXplICkKLQotICAgICAgIExhcmdlciAgYmxvY2sgIHNpemVzICBnaXZlICByYXBpZGx5ICBkaW1pbmlzaGluZyAgbWFyZ2luYWwKLSAgICAgICByZXR1cm5zOyAgbW9zdCBvZiB0aGUgY29tcHJlc3Npb24gY29tZXMgZnJvbSB0aGUgZmlyc3QgdHdvCi0gICAgICAgb3IgdGhyZWUgaHVuZHJlZCBrIG9mIGJsb2NrIHNpemUsIGEgZmFjdCB3b3J0aCBiZWFyaW5nICBpbgotICAgICAgIG1pbmQgIHdoZW4gIHVzaW5nICBfCGJfCHpfCGlfCHBfCDIgIG9uICBzbWFsbCAgbWFjaGluZXMuICBJdCBpcyBhbHNvCi0gICAgICAgaW1wb3J0YW50IHRvICBhcHByZWNpYXRlICB0aGF0ICB0aGUgIGRlY29tcHJlc3Npb24gIG1lbW9yeQotICAgICAgIHJlcXVpcmVtZW50ICBpcyAgc2V0ICBhdCBjb21wcmVzc2lvbi10aW1lIGJ5IHRoZSBjaG9pY2Ugb2YKLSAgICAgICBibG9jayBzaXplLgorICAgICAgIGlycmVsZXZhbnQgIHRvICBhbmQgIHNvICBpZ25vcmVkICAgZHVyaW5nICAgZGVjb21wcmVzc2lvbi4KIAogCiAKQEAgLTEzNiw4ICsxMzYsMjQgQEAKIGJ6aXAyKDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6aXAyKDEpCiAKIAorICAgICAgIENvbXByZXNzaW9uICBhbmQgZGVjb21wcmVzc2lvbiByZXF1aXJlbWVudHMsIGluIGJ5dGVzLCBjYW4KKyAgICAgICBiZSBlc3RpbWF0ZWQgYXM6CisKKyAgICAgICAgICAgICBDb21wcmVzc2lvbjogICA0MDBrICsgKCA3IHggYmxvY2sgc2l6ZSApCisKKyAgICAgICAgICAgICBEZWNvbXByZXNzaW9uOiAxMDBrICsgKCA0IHggYmxvY2sgc2l6ZSApLCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMGsgKyAoIDIuNSB4IGJsb2NrIHNpemUgKQorCisgICAgICAgTGFyZ2VyICBibG9jayAgc2l6ZXMgIGdpdmUgIHJhcGlkbHkgIGRpbWluaXNoaW5nICBtYXJnaW5hbAorICAgICAgIHJldHVybnM7ICBtb3N0IG9mIHRoZSBjb21wcmVzc2lvbiBjb21lcyBmcm9tIHRoZSBmaXJzdCB0d28KKyAgICAgICBvciB0aHJlZSBodW5kcmVkIGsgb2YgYmxvY2sgc2l6ZSwgYSBmYWN0IHdvcnRoIGJlYXJpbmcgIGluCisgICAgICAgbWluZCAgd2hlbiAgdXNpbmcgIF8IYl8Iel8IaV8IcF8IMiAgb24gIHNtYWxsICBtYWNoaW5lcy4gIEl0IGlzIGFsc28KKyAgICAgICBpbXBvcnRhbnQgdG8gIGFwcHJlY2lhdGUgIHRoYXQgIHRoZSAgZGVjb21wcmVzc2lvbiAgbWVtb3J5CisgICAgICAgcmVxdWlyZW1lbnQgIGlzICBzZXQgIGF0IGNvbXByZXNzaW9uLXRpbWUgYnkgdGhlIGNob2ljZSBvZgorICAgICAgIGJsb2NrIHNpemUuCisKICAgICAgICBGb3IgZmlsZXMgY29tcHJlc3NlZCB3aXRoIHRoZSAgZGVmYXVsdCAgOTAwayAgYmxvY2sgIHNpemUsCi0gICAgICAgXwhiXwh1XwhuXwh6XwhpXwhwXwgyICB3aWxsIHJlcXVpcmUgYWJvdXQgNDYwMCBrYnl0ZXMgdG8gZGVjb21wcmVzcy4gIFRvCisgICAgICAgXwhiXwh1XwhuXwh6XwhpXwhwXwgyICB3aWxsIHJlcXVpcmUgYWJvdXQgMzcwMCBrYnl0ZXMgdG8gZGVjb21wcmVzcy4gIFRvCiAgICAgICAgc3VwcG9ydCBkZWNvbXByZXNzaW9uIG9mIGFueSBmaWxlIG9uIGEgNCBtZWdhYnl0ZSBtYWNoaW5lLAogICAgICAgIF8IYl8IdV8Ibl8Iel8IaV8IcF8IMiAgaGFzICBhbiAgb3B0aW9uIHRvIGRlY29tcHJlc3MgdXNpbmcgYXBwcm94aW1hdGVseQogICAgICAgIGhhbGYgdGhpcyBhbW91bnQgb2YgbWVtb3J5LCBhYm91dCAyMzAwIGtieXRlcy4gIERlY29tcHJlcy0KQEAgLTE1Nyw4ICsxNzMsOCBAQAogICAgICAgIGZpbGUgMjAsMDAwIGJ5dGVzIGxvbmcgd2l0aCB0aGUgZmxhZyAgLTkgIHdpbGwgIGNhdXNlICB0aGUKICAgICAgICBjb21wcmVzc29yICB0byAgYWxsb2NhdGUgIGFyb3VuZCA2NzAwayBvZiBtZW1vcnksIGJ1dCBvbmx5CiAgICAgICAgdG91Y2ggNDAwayArIDIwMDAwICogNyA9IDU0MCBrYnl0ZXMgb2YgaXQuICBTaW1pbGFybHksIHRoZQotICAgICAgIGRlY29tcHJlc3NvciAgd2lsbCAgYWxsb2NhdGUgIDQ2MDBrICBidXQgb25seSB0b3VjaCAxMDBrICsKLSAgICAgICAyMDAwMCAqIDUgPSAyMDAga2J5dGVzLgorICAgICAgIGRlY29tcHJlc3NvciAgd2lsbCAgYWxsb2NhdGUgIDM3MDBrICBidXQgb25seSB0b3VjaCAxMDBrICsKKyAgICAgICAyMDAwMCAqIDQgPSAxODAga2J5dGVzLgogCiAgICAgICAgSGVyZSBpcyBhIHRhYmxlIHdoaWNoIHN1bW1hcmlzZXMgdGhlIG1heGltdW0gbWVtb3J5ICB1c2FnZQogICAgICAgIGZvciAgZGlmZmVyZW50ICBibG9jayAgc2l6ZXMuICAgQWxzbyByZWNvcmRlZCBpcyB0aGUgdG90YWwKQEAgLTE3MiwyNCArMTg4LDggQEAKICAgICAgICAgICAgICAgICAgIENvbXByZXNzICAgRGVjb21wcmVzcyAgIERlY29tcHJlc3MgICBDb3JwdXMKICAgICAgICAgICAgRmxhZyAgICAgdXNhZ2UgICAgICB1c2FnZSAgICAgICAtcyB1c2FnZSAgICAgU2l6ZQogCi0gICAgICAgICAgICAtMSAgICAgIDExMDBrICAgICAgIDYwMGsgICAgICAgICAzNTBrICAgICAgOTE0NzA0Ci0gICAgICAgICAgICAtMiAgICAgIDE4MDBrICAgICAgMTEwMGsgICAgICAgICA2MDBrICAgICAgODc3NzAzCi0gICAgICAgICAgICAtMyAgICAgIDI1MDBrICAgICAgMTYwMGsgICAgICAgICA4NTBrICAgICAgODYwMzM4Ci0gICAgICAgICAgICAtNCAgICAgIDMyMDBrICAgICAgMjEwMGsgICAgICAgIDExMDBrICAgICAgODQ2ODk5Ci0gICAgICAgICAgICAtNSAgICAgIDM5MDBrICAgICAgMjYwMGsgICAgICAgIDEzNTBrICAgICAgODQ1MTYwCi0gICAgICAgICAgICAtNiAgICAgIDQ2MDBrICAgICAgMzEwMGsgICAgICAgIDE2MDBrICAgICAgODM4NjI2Ci0gICAgICAgICAgICAtNyAgICAgIDU0MDBrICAgICAgMzYwMGsgICAgICAgIDE4NTBrICAgICAgODM0MDk2Ci0gICAgICAgICAgICAtOCAgICAgIDYwMDBrICAgICAgNDEwMGsgICAgICAgIDIxMDBrICAgICAgODI4NjQyCi0gICAgICAgICAgICAtOSAgICAgIDY3MDBrICAgICAgNDYwMGsgICAgICAgIDIzNTBrICAgICAgODI4NjQyCi0KLQotTwhPUAhQVAhUSQhJTwhPTghOUwhTCi0gICAgICAgLQgtYwhjIC0ILS0ILXMIc3QIdGQIZG8Ib3UIdXQIdAotICAgICAgICAgICAgICBDb21wcmVzcyBvciBkZWNvbXByZXNzIHRvIHN0YW5kYXJkIG91dHB1dC4gIC1jIHdpbGwKLSAgICAgICAgICAgICAgZGVjb21wcmVzcyBtdWx0aXBsZSBmaWxlcyB0byBzdGRvdXQsIGJ1dCB3aWxsICBvbmx5Ci0gICAgICAgICAgICAgIGNvbXByZXNzIGEgc2luZ2xlIGZpbGUgdG8gc3Rkb3V0LgotCi0KKyAgICAgICAgICAgIC0xICAgICAgMTEwMGsgICAgICAgNTAwayAgICAgICAgIDM1MGsgICAgICA5MTQ3MDQKKyAgICAgICAgICAgIC0yICAgICAgMTgwMGsgICAgICAgOTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKIAogCiAKQEAgLTIwMiwzNCArMjAyLDUyIEBACiBiemlwMigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMigxKQogCiAKLSAgICAgICAtCC1kCGQgLQgtLQgtZAhkZQhlYwhjbwhvbQhtcAhwcghyZQhlcwhzcwhzCi0gICAgICAgICAgICAgIEZvcmNlICBkZWNvbXByZXNzaW9uLiAgXwhCXwh6XwhpXwhwXwgyIGFuZCBfCGJfCHVfCG5fCHpfCGlfCHBfCDIgYXJlIHJlYWxseQotICAgICAgICAgICAgICB0aGUgc2FtZSBwcm9ncmFtLCBhbmQgdGhlIGRlY2lzaW9uIGFib3V0IHdoZXRoZXIgdG8KLSAgICAgICAgICAgICAgY29tcHJlc3MgIG9yICBkZWNvbXByZXNzICBpcyAgZG9uZSAgb24gdGhlIGJhc2lzIG9mCi0gICAgICAgICAgICAgIHdoaWNoIG5hbWUgaXMgdXNlZC4gIFRoaXMgZmxhZyBvdmVycmlkZXMgdGhhdCBtZWNoLQotICAgICAgICAgICAgICBhbmlzbSwgYW5kIGZvcmNlcyBfCGJfCHpfCGlfCHBfCDIgdG8gZGVjb21wcmVzcy4KKyAgICAgICAgICAgIC0zICAgICAgMjUwMGsgICAgICAxMzAwayAgICAgICAgIDg1MGsgICAgICA4NjAzMzgKKyAgICAgICAgICAgIC00ICAgICAgMzIwMGsgICAgICAxNzAwayAgICAgICAgMTEwMGsgICAgICA4NDY4OTkKKyAgICAgICAgICAgIC01ICAgICAgMzkwMGsgICAgICAyMTAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKKyAgICAgICAgICAgIC02ICAgICAgNDYwMGsgICAgICAyNTAwayAgICAgICAgMTYwMGsgICAgICA4Mzg2MjYKKyAgICAgICAgICAgIC03ICAgICAgNTQwMGsgICAgICAyOTAwayAgICAgICAgMTg1MGsgICAgICA4MzQwOTYKKyAgICAgICAgICAgIC04ICAgICAgNjAwMGsgICAgICAzMzAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKKyAgICAgICAgICAgIC05ICAgICAgNjcwMGsgICAgICAzNzAwayAgICAgICAgMjM1MGsgICAgICA4Mjg2NDIKIAotICAgICAgIC0ILWYIZiAtCC0tCC1jCGNvCG9tCG1wCHByCHJlCGVzCHNzCHMKKworTwhPUAhQVAhUSQhJTwhPTghOUwhTCisgICAgICAgLQgtYwhjIC0ILS0ILXMIc3QIdGQIZG8Ib3UIdXQIdAorICAgICAgICAgICAgICBDb21wcmVzcyBvciBkZWNvbXByZXNzIHRvIHN0YW5kYXJkIG91dHB1dC4gIC1jIHdpbGwKKyAgICAgICAgICAgICAgZGVjb21wcmVzcyBtdWx0aXBsZSBmaWxlcyB0byBzdGRvdXQsIGJ1dCB3aWxsICBvbmx5CisgICAgICAgICAgICAgIGNvbXByZXNzIGEgc2luZ2xlIGZpbGUgdG8gc3Rkb3V0LgorCisgICAgICAgLQgtZAhkIC0ILS0ILWQIZGUIZWMIY28Ib20IbXAIcHIIcmUIZXMIc3MIcworICAgICAgICAgICAgICBGb3JjZSAgZGVjb21wcmVzc2lvbi4gIF8IYl8Iel8IaV8IcF8IMl8ILCBfCGJfCHVfCG5fCHpfCGlfCHBfCDIgYW5kIF8IYl8Iel8IY18IYV8IdCBhcmUKKyAgICAgICAgICAgICAgcmVhbGx5IHRoZSBzYW1lIHByb2dyYW0sICBhbmQgIHRoZSAgZGVjaXNpb24gIGFib3V0CisgICAgICAgICAgICAgIHdoYXQgIGFjdGlvbnMgdG8gdGFrZSBpcyBkb25lIG9uIHRoZSBiYXNpcyBvZiB3aGljaAorICAgICAgICAgICAgICBuYW1lIGlzIHVzZWQuICBUaGlzIGZsYWcgb3ZlcnJpZGVzIHRoYXQgIG1lY2hhbmlzbSwKKyAgICAgICAgICAgICAgYW5kIGZvcmNlcyBfCGJfCHpfCGlfCHBfCDIgdG8gZGVjb21wcmVzcy4KKworICAgICAgIC0ILXoIeiAtCC0tCC1jCGNvCG9tCG1wCHByCHJlCGVzCHNzCHMKICAgICAgICAgICAgICAgVGhlICBjb21wbGVtZW50ICB0byAtZDogZm9yY2VzIGNvbXByZXNzaW9uLCByZWdhcmQtCiAgICAgICAgICAgICAgIGxlc3Mgb2YgdGhlIGludm9rYXRpb24gbmFtZS4KIAogICAgICAgIC0ILXQIdCAtCC0tCC10CHRlCGVzCHN0CHQKICAgICAgICAgICAgICAgQ2hlY2sgaW50ZWdyaXR5IG9mIHRoZSBzcGVjaWZpZWQgZmlsZShzKSwgYnV0IGRvbid0CiAgICAgICAgICAgICAgIGRlY29tcHJlc3MgIHRoZW0uICAgVGhpcyAgcmVhbGx5ICBwZXJmb3JtcyAgYSB0cmlhbAotICAgICAgICAgICAgICBkZWNvbXByZXNzaW9uIGFuZCB0aHJvd3MgYXdheSB0aGUgcmVzdWx0LCB1c2luZyB0aGUKLSAgICAgICAgICAgICAgbG93LW1lbW9yeSBkZWNvbXByZXNzaW9uIGFsZ29yaXRobSAoc2VlIC1zKS4KKyAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbiBhbmQgdGhyb3dzIGF3YXkgdGhlIHJlc3VsdC4KKworICAgICAgIC0ILWYIZiAtCC0tCC1mCGZvCG9yCHJjCGNlCGUKKyAgICAgICAgICAgICAgRm9yY2Ugb3ZlcndyaXRlIG9mIG91dHB1dCBmaWxlcy4gICBOb3JtYWxseSwgIF8IYl8Iel8IaV8IcF8IMgorICAgICAgICAgICAgICB3aWxsIG5vdCBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzLgogCiAgICAgICAgLQgtawhrIC0ILS0ILWsIa2UIZWUIZXAIcAogICAgICAgICAgICAgICBLZWVwICAoZG9uJ3QgZGVsZXRlKSBpbnB1dCBmaWxlcyBkdXJpbmcgY29tcHJlc3Npb24KICAgICAgICAgICAgICAgb3IgZGVjb21wcmVzc2lvbi4KIAogICAgICAgIC0ILXMIcyAtCC0tCC1zCHNtCG1hCGFsCGxsCGwKLSAgICAgICAgICAgICAgUmVkdWNlICBtZW1vcnkgIHVzYWdlLCAgYm90aCAgZm9yICBjb21wcmVzc2lvbiAgYW5kCi0gICAgICAgICAgICAgIGRlY29tcHJlc3Npb24uICBGaWxlcyBhcmUgZGVjb21wcmVzc2VkIHVzaW5nIGEgbW9kLQotICAgICAgICAgICAgICBpZmllZCBhbGdvcml0aG0gd2hpY2ggb25seSByZXF1aXJlcyAyLjUgIGJ5dGVzICBwZXIKLSAgICAgICAgICAgICAgYmxvY2sgIGJ5dGUuICAgVGhpcyAgbWVhbnMgIGFueSAgZmlsZSBjYW4gYmUgZGVjb20tCi0gICAgICAgICAgICAgIHByZXNzZWQgaW4gMjMwMGsgb2YgbWVtb3J5LCAgYWxiZWl0ICBzb21ld2hhdCAgbW9yZQotICAgICAgICAgICAgICBzbG93bHkgdGhhbiB1c3VhbC4KKyAgICAgICAgICAgICAgUmVkdWNlIG1lbW9yeSB1c2FnZSwgZm9yIGNvbXByZXNzaW9uLCBkZWNvbXByZXNzaW9uCisgICAgICAgICAgICAgIGFuZCAgdGVzdGluZy4gICBGaWxlcyAgYXJlICBkZWNvbXByZXNzZWQgYW5kIHRlc3RlZAorICAgICAgICAgICAgICB1c2luZyBhIG1vZGlmaWVkIGFsZ29yaXRobSB3aGljaCBvbmx5IHJlcXVpcmVzICAyLjUKKyAgICAgICAgICAgICAgYnl0ZXMgIHBlciAgYmxvY2sgYnl0ZS4gIFRoaXMgbWVhbnMgYW55IGZpbGUgY2FuIGJlCisgICAgICAgICAgICAgIGRlY29tcHJlc3NlZCBpbiAyMzAwayBvZiBtZW1vcnksICBhbGJlaXQgIGF0ICBhYm91dAorICAgICAgICAgICAgICBoYWxmIHRoZSBub3JtYWwgc3BlZWQuCiAKICAgICAgICAgICAgICAgRHVyaW5nICBjb21wcmVzc2lvbiwgIC1zICBzZWxlY3RzICBhICBibG9jayBzaXplIG9mCiAgICAgICAgICAgICAgIDIwMGssIHdoaWNoIGxpbWl0cyBtZW1vcnkgdXNlIHRvICBhcm91bmQgIHRoZSAgc2FtZQpAQCAtMjM5LDI0ICsyNTcsNiBAQAogICAgICAgICAgICAgICBNRU1PUlkgTUFOQUdFTUVOVCBhYm92ZS4KIAogCi0gICAgICAgLQgtdgh2IC0ILS0ILXYIdmUIZXIIcmIIYm8Ib3MIc2UIZQotICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgLS0gc2hvdyB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIGVhY2gKLSAgICAgICAgICAgICAgZmlsZSAgcHJvY2Vzc2VkLiAgIEZ1cnRoZXIgIC12J3MgIGluY3JlYXNlIHRoZSB2ZXItCi0gICAgICAgICAgICAgIGJvc2l0eSBsZXZlbCwgc3Bld2luZyBvdXQgbG90cyBvZiBpbmZvcm1hdGlvbiB3aGljaAotICAgICAgICAgICAgICBpcyBwcmltYXJpbHkgb2YgaW50ZXJlc3QgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCi0KLSAgICAgICAtCC1MCEwgLQgtLQgtbAhsaQhpYwhjZQhlbghucwhzZQhlCi0gICAgICAgICAgICAgIERpc3BsYXkgIHRoZSAgc29mdHdhcmUgIHZlcnNpb24sICBsaWNlbnNlIHRlcm1zIGFuZAotICAgICAgICAgICAgICBjb25kaXRpb25zLgotCi0gICAgICAgLQgtVghWIC0ILS0ILXYIdmUIZXIIcnMIc2kIaW8Ib24IbgotICAgICAgICAgICAgICBTYW1lIGFzIC1MLgotCi0gICAgICAgLQgtMQgxIHQIdG8IbyAtCC05CDkKLSAgICAgICAgICAgICAgU2V0IHRoZSBibG9jayBzaXplIHRvIDEwMCBrLCAyMDAgayAuLiAgOTAwICBrICB3aGVuCi0gICAgICAgICAgICAgIGNvbXByZXNzaW5nLiAgIEhhcyAgbm8gIGVmZmVjdCAgd2hlbiBkZWNvbXByZXNzaW5nLgotICAgICAgICAgICAgICBTZWUgTUVNT1JZIE1BTkFHRU1FTlQgYWJvdmUuCi0KIAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNApAQCAtMjY4LDYgKzI2OCwyMSBAQAogYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKIAogCisgICAgICAgLQgtdgh2IC0ILS0ILXYIdmUIZXIIcmIIYm8Ib3MIc2UIZQorICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgLS0gc2hvdyB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIGVhY2gKKyAgICAgICAgICAgICAgZmlsZSAgcHJvY2Vzc2VkLiAgIEZ1cnRoZXIgIC12J3MgIGluY3JlYXNlIHRoZSB2ZXItCisgICAgICAgICAgICAgIGJvc2l0eSBsZXZlbCwgc3Bld2luZyBvdXQgbG90cyBvZiBpbmZvcm1hdGlvbiB3aGljaAorICAgICAgICAgICAgICBpcyBwcmltYXJpbHkgb2YgaW50ZXJlc3QgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCisKKyAgICAgICAtCC1MCEwgLQgtLQgtbAhsaQhpYwhjZQhlbghucwhzZQhlIC0ILVYIViAtCC0tCC12CHZlCGVyCHJzCHNpCGlvCG9uCG4KKyAgICAgICAgICAgICAgRGlzcGxheSAgdGhlICBzb2Z0d2FyZSAgdmVyc2lvbiwgIGxpY2Vuc2UgdGVybXMgYW5kCisgICAgICAgICAgICAgIGNvbmRpdGlvbnMuCisKKyAgICAgICAtCC0xCDEgdAh0bwhvIC0ILTkIOQorICAgICAgICAgICAgICBTZXQgdGhlIGJsb2NrIHNpemUgdG8gMTAwIGssIDIwMCBrIC4uICA5MDAgIGsgIHdoZW4KKyAgICAgICAgICAgICAgY29tcHJlc3NpbmcuICAgSGFzICBubyAgZWZmZWN0ICB3aGVuIGRlY29tcHJlc3NpbmcuCisgICAgICAgICAgICAgIFNlZSBNRU1PUlkgTUFOQUdFTUVOVCBhYm92ZS4KKwogICAgICAgIC0ILS0ILXIIcmUIZXAIcGUIZXQIdGkIaXQIdGkIaXYIdmUIZS0ILWYIZmEIYXMIc3QIdAogICAgICAgICAgICAgICBfCGJfCHpfCGlfCHBfCDIgaW5qZWN0cyBzb21lIHNtYWxsICBwc2V1ZG8tcmFuZG9tICB2YXJpYXRpb25zCiAgICAgICAgICAgICAgIGludG8gIHZlcnkgIHJlcGV0aXRpdmUgIGJsb2NrcyAgdG8gbGltaXQgd29yc3QtY2FzZQpAQCAtMzA2LDIyICszMjEsNyBAQAogICAgICAgIF8IYl8Iel8IaV8IcF8IMl8Icl8IZV8IY18Ib18Idl8IZV8IciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGRhbS0KICAgICAgICBhZ2VkIGZpbGUsIGFuZCB3cml0ZXMgYSBudW1iZXIgb2YgZmlsZXMgInJlYzAwMDFmaWxlLmJ6MiIsCiAgICAgICAgInJlYzAwMDJmaWxlLmJ6MiIsIGV0YywgY29udGFpbmluZyB0aGUgIGV4dHJhY3RlZCAgYmxvY2tzLgotICAgICAgIFRoZSBvdXRwdXQgZmlsZW5hbWVzIGFyZSBkZXNpZ25lZCBzbyB0aGF0IHRoZSB1c2Ugb2Ygd2lsZC0KLSAgICAgICBjYXJkcyBpbiBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgLS0gZm9yIGV4YW1wbGUsICJiemlwMiAgLWRjCi0gICAgICAgcmVjKmZpbGUuYnoyICA+ICByZWNvdmVyZWRfZGF0YSIgLS0gbGlzdHMgdGhlIGZpbGVzIGluIHRoZQotICAgICAgICJyaWdodCIgb3JkZXIuCi0KLSAgICAgICBfCGJfCHpfCGlfCHBfCDJfCHJfCGVfCGNfCG9fCHZfCGVfCHIgc2hvdWxkIGJlIG9mIG1vc3QgdXNlIGRlYWxpbmcgd2l0aCBsYXJnZSAuYnoyCi0gICAgICAgZmlsZXMsICBhcyAgdGhlc2Ugd2lsbCBjb250YWluIG1hbnkgYmxvY2tzLiAgSXQgaXMgY2xlYXJseQotICAgICAgIGZ1dGlsZSB0byB1c2UgaXQgb24gZGFtYWdlZCBzaW5nbGUtYmxvY2sgIGZpbGVzLCAgc2luY2UgIGEKLSAgICAgICBkYW1hZ2VkICBibG9jayAgY2Fubm90ICBiZSByZWNvdmVyZWQuICBJZiB5b3Ugd2lzaCB0byBtaW4tCi0gICAgICAgaW1pc2UgYW55IHBvdGVudGlhbCBkYXRhIGxvc3MgdGhyb3VnaCBtZWRpYSAgb3IgIHRyYW5zbWlzLQotICAgICAgIHNpb24gZXJyb3JzLCB5b3UgbWlnaHQgY29uc2lkZXIgY29tcHJlc3Npbmcgd2l0aCBhIHNtYWxsZXIKLSAgICAgICBibG9jayBzaXplLgotCi0KLVAIUEUIRVIIUkYIRk8IT1IIUk0ITUEIQU4ITkMIQ0UIRSBOCE5PCE9UCFRFCEVTCFMKLSAgICAgICBUaGUgc29ydGluZyBwaGFzZSBvZiBjb21wcmVzc2lvbiBnYXRoZXJzIHRvZ2V0aGVyICBzaW1pbGFyCisgICAgICAgVGhlICBvdXRwdXQgIGZpbGVuYW1lcyAgYXJlICBkZXNpZ25lZCAgc28gIHRoYXQgdGhlIHVzZSBvZgogCiAKIApAQCAtMzM0LDYgKzMzNCwyMSBAQAogYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKIAogCisgICAgICAgd2lsZGNhcmRzIGluIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyAtLSBmb3IgZXhhbXBsZSwgICJiemlwMgorICAgICAgIC1kYyAgcmVjKmZpbGUuYnoyICA+IHJlY292ZXJlZF9kYXRhIiAtLSBsaXN0cyB0aGUgZmlsZXMgaW4KKyAgICAgICB0aGUgInJpZ2h0IiBvcmRlci4KKworICAgICAgIF8IYl8Iel8IaV8IcF8IMl8Icl8IZV8IY18Ib18Idl8IZV8IciBzaG91bGQgYmUgb2YgbW9zdCB1c2UgZGVhbGluZyB3aXRoIGxhcmdlIC5iejIKKyAgICAgICBmaWxlcywgIGFzICB0aGVzZSB3aWxsIGNvbnRhaW4gbWFueSBibG9ja3MuICBJdCBpcyBjbGVhcmx5CisgICAgICAgZnV0aWxlIHRvIHVzZSBpdCBvbiBkYW1hZ2VkIHNpbmdsZS1ibG9jayAgZmlsZXMsICBzaW5jZSAgYQorICAgICAgIGRhbWFnZWQgIGJsb2NrICBjYW5ub3QgIGJlIHJlY292ZXJlZC4gIElmIHlvdSB3aXNoIHRvIG1pbi0KKyAgICAgICBpbWlzZSBhbnkgcG90ZW50aWFsIGRhdGEgbG9zcyB0aHJvdWdoIG1lZGlhICBvciAgdHJhbnNtaXMtCisgICAgICAgc2lvbiBlcnJvcnMsIHlvdSBtaWdodCBjb25zaWRlciBjb21wcmVzc2luZyB3aXRoIGEgc21hbGxlcgorICAgICAgIGJsb2NrIHNpemUuCisKKworUAhQRQhFUghSRghGTwhPUghSTQhNQQhBTghOQwhDRQhFIE4ITk8IT1QIVEUIRVMIUworICAgICAgIFRoZSBzb3J0aW5nIHBoYXNlIG9mIGNvbXByZXNzaW9uIGdhdGhlcnMgdG9nZXRoZXIgIHNpbWlsYXIKICAgICAgICBzdHJpbmdzICBpbiAgdGhlICBmaWxlLiAgQmVjYXVzZSBvZiB0aGlzLCBmaWxlcyBjb250YWluaW5nCiAgICAgICAgdmVyeSBsb25nIHJ1bnMgb2YgIHJlcGVhdGVkICBzeW1ib2xzLCAgbGlrZSAgImFhYmFhYmFhYmFhYgogICAgICAgIC4uLiIgICAocmVwZWF0ZWQgICBzZXZlcmFsICBodW5kcmVkICB0aW1lcykgIG1heSAgY29tcHJlc3MKQEAgLTM0OCwxMCArMzYzLDYgQEAKICAgICAgICBzZXZlcmUgc2xvd25lc3MgaW4gY29tcHJlc3Npb24sIHRyeSBtYWtpbmcgdGhlIGJsb2NrICBzaXplCiAgICAgICAgYXMgc21hbGwgYXMgcG9zc2libGUsIHdpdGggZmxhZyAtMS4KIAotICAgICAgIEluY29tcHJlc3NpYmxlIG9yIHZpcnR1YWxseS1pbmNvbXByZXNzaWJsZSBkYXRhIG1heSBkZWNvbS0KLSAgICAgICBwcmVzcyByYXRoZXIgbW9yZSBzbG93bHkgdGhhbiBvbmUgd291bGQgaG9wZS4gIFRoaXMgaXMgZHVlCi0gICAgICAgdG8gYSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW92ZS10by1mcm9udCBjb2Rlci4KLQogICAgICAgIF8IYl8Iel8IaV8IcF8IMiAgdXN1YWxseSAgYWxsb2NhdGVzICBzZXZlcmFsICBtZWdhYnl0ZXMgb2YgbWVtb3J5IHRvCiAgICAgICAgb3BlcmF0ZSBpbiwgYW5kIHRoZW4gY2hhcmdlcyBhbGwgb3ZlciBpdCBpbiBhIGZhaXJseSAgcmFuLQogICAgICAgIGRvbSAgZmFzaGlvbi4gICBUaGlzIG1lYW5zIHRoYXQgcGVyZm9ybWFuY2UsIGJvdGggZm9yIGNvbS0KQEAgLTM2MiwxMiArMzczLDYgQEAKICAgICAgICBsYXJnZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuICBJIGltYWdpbmUgXwhiXwh6XwhpXwhwXwgyIHdpbGwgcGVyLQogICAgICAgIGZvcm0gYmVzdCBvbiBtYWNoaW5lcyB3aXRoIHZlcnkgbGFyZ2UgY2FjaGVzLgogCi0gICAgICAgVGVzdCBtb2RlICgtdCkgdXNlcyB0aGUgbG93LW1lbW9yeSBkZWNvbXByZXNzaW9uIGFsZ29yaXRobQotICAgICAgICgtcykuICBUaGlzIG1lYW5zIHRlc3QgbW9kZSBkb2VzIG5vdCBydW4gIGFzICBmYXN0ICBhcyAgaXQKLSAgICAgICBjb3VsZDsgIGl0ICBjb3VsZCAgcnVuIGFzIGZhc3QgYXMgdGhlIG5vcm1hbCBkZWNvbXByZXNzaW9uCi0gICAgICAgbWFjaGluZXJ5LiAgVGhpcyBjb3VsZCBlYXNpbHkgYmUgZml4ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZQotICAgICAgIGNvZGUgYmxvYXQuCi0KIAogQwhDQQhBVghWRQhFQQhBVAhUUwhTCiAgICAgICAgSS9PICBlcnJvciAgbWVzc2FnZXMgIGFyZSBub3QgYXMgaGVscGZ1bCBhcyB0aGV5IGNvdWxkIGJlLgpAQCAtMzc1LDE5ICszODAsMTQgQEAKICAgICAgICBidXQgIHRoZSAgZGV0YWlscyAgb2YgIHdoYXQgIHRoZSBwcm9ibGVtIGlzIHNvbWV0aW1lcyBzZWVtCiAgICAgICAgcmF0aGVyIG1pc2xlYWRpbmcuCiAKLSAgICAgICBUaGlzIG1hbnVhbCBwYWdlIHBlcnRhaW5zIHRvIHZlcnNpb24gMC4xIG9mIF8IYl8Iel8IaV8IcF8IMl8ILiAgSXQgbWF5Ci0gICAgICAgd2VsbCAgaGFwcGVuIHRoYXQgc29tZSBmdXR1cmUgdmVyc2lvbiB3aWxsIHVzZSBhIGRpZmZlcmVudAotICAgICAgIGNvbXByZXNzZWQgZmlsZSBmb3JtYXQuICBJZiB5b3UgdHJ5IHRvICBkZWNvbXByZXNzLCAgdXNpbmcKLSAgICAgICAwLjEsICBhICAuYnoyICBmaWxlIGNyZWF0ZWQgd2l0aCBzb21lIGZ1dHVyZSB2ZXJzaW9uIHdoaWNoCi0gICAgICAgdXNlcyBhIGRpZmZlcmVudCBjb21wcmVzc2VkIGZpbGUgZm9ybWF0LCAwLjEgd2lsbCBjb21wbGFpbgotICAgICAgIHRoYXQgIHlvdXIgIGZpbGUgICJpcyBub3QgYSBiemlwMiBmaWxlIi4gIElmIHRoYXQgaGFwcGVucywKLSAgICAgICB5b3Ugc2hvdWxkIG9idGFpbiBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgXwhiXwh6XwhpXwhwXwgyICBhbmQgIHVzZQotICAgICAgIHRoYXQgdG8gZGVjb21wcmVzcyB0aGUgZmlsZS4KKyAgICAgICBUaGlzIG1hbnVhbCBwYWdlIHBlcnRhaW5zIHRvIHZlcnNpb24gMC45LjAgb2YgXwhiXwh6XwhpXwhwXwgyXwguICBDb20tCisgICAgICAgcHJlc3NlZCAgZGF0YSBjcmVhdGVkIGJ5IHRoaXMgdmVyc2lvbiBpcyBlbnRpcmVseSBmb3J3YXJkcworICAgICAgIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyBwdWJsaWMgcmVsZWFzZSwKKyAgICAgICB2ZXJzaW9uICAwLjFwbDIsICBidXQgIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246IDAuOS4wCisgICAgICAgY2FuIGNvcnJlY3RseSBkZWNvbXByZXNzIG11bHRpcGxlIGNvbmNhdGVuYXRlZCAgY29tcHJlc3NlZAorICAgICAgIGZpbGVzLiAgIDAuMXBsMiAgY2Fubm90IGRvIHRoaXM7IGl0IHdpbGwgc3RvcCBhZnRlciBkZWNvbS0KKyAgICAgICBwcmVzc2luZyBqdXN0IHRoZSBmaXJzdCBmaWxlIGluIHRoZSBzdHJlYW0uCiAKLSAgICAgICBXaWxkY2FyZCBleHBhbnNpb24gZm9yIFdpbmRvd3MgOTUgYW5kIE5UIGlzIGZsYWt5LgotCi0gICAgICAgXwhiXwh6XwhpXwhwXwgyXwhyXwhlXwhjXwhvXwh2XwhlXwhyICB1c2VzICAzMi1iaXQgaW50ZWdlcnMgdG8gcmVwcmVzZW50IGJpdCBwb3NpLQotICAgICAgIHRpb25zIGluIGNvbXByZXNzZWQgZmlsZXMsIHNvIGl0IGNhbm5vdCBoYW5kbGUgIGNvbXByZXNzZWQKIAogCiAKQEAgLTQwMCw1OSArNDAwLDMxIEBACiBiemlwMigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMigxKQogCiAKLSAgICAgICBmaWxlcyAgbW9yZSB0aGFuIDUxMiBtZWdhYnl0ZXMgbG9uZy4gIFRoaXMgY291bGQgZWFzaWx5IGJlCisgICAgICAgV2lsZGNhcmQgZXhwYW5zaW9uIGZvciBXaW5kb3dzIDk1IGFuZCBOVCBpcyBmbGFreS4KKworICAgICAgIF8IYl8Iel8IaV8IcF8IMl8Icl8IZV8IY18Ib18Idl8IZV8IciB1c2VzIDMyLWJpdCBpbnRlZ2VycyB0byByZXByZXNlbnQgIGJpdCAgcG9zaS0KKyAgICAgICB0aW9ucyAgaW4gY29tcHJlc3NlZCBmaWxlcywgc28gaXQgY2Fubm90IGhhbmRsZSBjb21wcmVzc2VkCisgICAgICAgZmlsZXMgbW9yZSB0aGFuIDUxMiBtZWdhYnl0ZXMgbG9uZy4gIFRoaXMgY291bGQgZWFzaWx5ICBiZQogICAgICAgIGZpeGVkLgogCi0gICAgICAgXwhiXwh6XwhpXwhwXwgyXwhyXwhlXwhjXwhvXwh2XwhlXwhyIHNvbWV0aW1lcyByZXBvcnRzIGEgIHZlcnkgIHNtYWxsLCAgaW5jb21wbGV0ZQotICAgICAgIGZpbmFsICBibG9jay4gIFRoaXMgaXMgc3B1cmlvdXMgYW5kIGNhbiBiZSBzYWZlbHkgaWdub3JlZC4KLQotCi1SCFJFCEVMCExBCEFUCFRJCElPCE9OCE5TCFNICEhJCElQCFAgVAhUTwhPIGIIYnoIemkIaXAIcC0ILTAIMC4ILjIIMjEIMQotICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIF8IYl8Iel8IaV8IcCBwcm9ncmFtLCAgdmVyc2lvbgotICAgICAgIDAuMjEsICB3aGljaCAgSSByZWxlYXNlZCBpbiBBdWd1c3QgMTk5Ni4gIFRoZSBwcmltYXJ5IGRpZi0KLSAgICAgICBmZXJlbmNlIG9mIF8IYl8Iel8IaV8IcF8IMiBpcyBpdHMgYXZvaWRhbmNlIG9mIHRoZSBwb3NzaWJseSBwYXRlbnRlZAotICAgICAgIGFsZ29yaXRobXMgIHdoaWNoICB3ZXJlICB1c2VkICBpbiAwLjIxLiAgXwhiXwh6XwhpXwhwXwgyIGFsc28gYnJpbmdzCi0gICAgICAgdmFyaW91cyB1c2VmdWwgcmVmaW5lbWVudHMgKC1zLCAgLXQpLCAgdXNlcyAgbGVzcyAgbWVtb3J5LAotICAgICAgIGRlY29tcHJlc3NlcyAgc2lnbmlmaWNhbnRseSAgZmFzdGVyLCAgYW5kICBoYXMgc3VwcG9ydCBmb3IKLSAgICAgICByZWNvdmVyaW5nIGRhdGEgZnJvbSBkYW1hZ2VkIGZpbGVzLgotCi0gICAgICAgQmVjYXVzZSBfCGJfCHpfCGlfCHBfCDIgdXNlcyBIdWZmbWFuIGNvZGluZyB0byAgY29uc3RydWN0ICB0aGUgIGNvbS0KLSAgICAgICBwcmVzc2VkICBiaXRzdHJlYW0sIHJhdGhlciB0aGFuIHRoZSBhcml0aG1ldGljIGNvZGluZyB1c2VkCi0gICAgICAgaW4gMC4yMSwgdGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb25zIGdlbmVyYXRlZCAgYnkgIHRoZQotICAgICAgIHR3byAgcHJvZ3JhbXMgYXJlIGluY29tcGF0aWJsZSwgYW5kIHRoZXkgd2lsbCBub3QgaW50ZXJvcC0KLSAgICAgICBlcmF0ZS4gIFRoZSBjaGFuZ2UgaW4gc3VmZml4IGZyb20gIC5ieiAgdG8gIC5iejIgIHJlZmxlY3RzCi0gICAgICAgdGhpcy4gICBJdCB3b3VsZCBoYXZlIGJlZW4gaGVscGZ1bCB0byBhdCBsZWFzdCBhbGxvdyBfCGJfCHpfCGlfCHBfCDIKLSAgICAgICB0byBkZWNvbXByZXNzIGZpbGVzIGNyZWF0ZWQgYnkgMC4yMSwgYnV0IHRoaXMgd291bGQgZGVmZWF0Ci0gICAgICAgdGhlIHByaW1hcnkgYWltIG9mIGhhdmluZyBhIHBhdGVudC1mcmVlIGNvbXByZXNzb3IuCi0KLSAgICAgICBGb3IgYSBtb3JlIHByZWNpc2Ugc3RhdGVtZW50IGFib3V0IHBhdGVudCBpc3N1ZXMgaW4gYnppcDIsCi0gICAgICAgcGxlYXNlIHNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KLQotICAgICAgIEh1ZmZtYW4gIGNvZGluZyAgbmVjZXNzYXJpbHkgIGludm9sdmVzIHNvbWUgY29kaW5nIGluZWZmaS0KLSAgICAgICBjaWVuY3kgY29tcGFyZWQgdG8gYXJpdGhtZXRpYyAgY29kaW5nLiAgIFRoaXMgIG1lYW5zICB0aGF0Ci0gICAgICAgXwhiXwh6XwhpXwhwXwgyICBjb21wcmVzc2VzIGFib3V0IDElIHdvcnNlIHRoYW4gMC4yMSwgYW4gdW5mb3J0dW5hdGUKLSAgICAgICBidXQgdW5hdm9pZGFibGUgZmFjdC1vZi1saWZlLiAgT24gdGhlIG90aGVyICBoYW5kLCAgZGVjb20tCi0gICAgICAgcHJlc3Npb24gIGlzIGFwcHJveGltYXRlbHkgNTAlIGZhc3RlciBmb3IgdGhlIHNhbWUgcmVhc29uLAotICAgICAgIGFuZCB0aGUgY2hhbmdlIGluIGZpbGUgZm9ybWF0IGdhdmUgYW4gb3Bwb3J0dW5pdHkgIHRvICBhZGQKLSAgICAgICBkYXRhLXJlY292ZXJ5IGZlYXR1cmVzLiAgU28gaXQgaXMgbm90IGFsbCBiYWQuCi0KIAogQQhBVQhVVAhUSAhITwhPUghSCiAgICAgICAgSnVsaWFuIFNld2FyZCwganNld2FyZEBhY20ub3JnLgorICAgICAgIGh0dHA6Ly93d3cubXVyYXJvYS5kZW1vbi5jby51awogCi0gICAgICAgVGhlIGlkZWFzIGVtYm9kaWVkIGluIF8IYl8Iel8IaV8IcCBhbmQgXwhiXwh6XwhpXwhwXwgyIGFyZSBkdWUgdG8gKGF0IGxlYXN0KQotICAgICAgIHRoZSBmb2xsb3dpbmcgcGVvcGxlOiBNaWNoYWVsIEJ1cnJvd3MgIGFuZCAgRGF2aWQgIFdoZWVsZXIKLSAgICAgICAoZm9yICB0aGUgIGJsb2NrICBzb3J0aW5nICB0cmFuc2Zvcm1hdGlvbiksICBEYXZpZCBXaGVlbGVyCi0gICAgICAgKGFnYWluLCBmb3IgdGhlIEh1ZmZtYW4gY29kZXIpLCAgUGV0ZXIgIEZlbndpY2sgIChmb3IgIHRoZQotICAgICAgIHN0cnVjdHVyZWQgIGNvZGluZyAgbW9kZWwgIGluIDAuMjEsIGFuZCBtYW55IHJlZmluZW1lbnRzKSwKLSAgICAgICBhbmQgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwgYW5kIElhbiBXaXR0ZW4gKGZvciAgdGhlCi0gICAgICAgYXJpdGhtZXRpYyAgY29kZXIgIGluIDAuMjEpLiAgSSBhbSBtdWNoIGluZGVidGVkIGZvciB0aGVpcgotICAgICAgIGhlbHAsIHN1cHBvcnQgYW5kIGFkdmljZS4gIFNlZSB0aGUgZmlsZSBBTEdPUklUSE1TIGluICB0aGUKLSAgICAgICBzb3VyY2UgIGRpc3RyaWJ1dGlvbiBmb3IgcG9pbnRlcnMgdG8gc291cmNlcyBvZiBkb2N1bWVudGEtCi0gICAgICAgdGlvbi4gIENocmlzdGlhbiB2b24gUm9xdWVzICBlbmNvdXJhZ2VkICBtZSAgdG8gIGxvb2sgIGZvcgotICAgICAgIGZhc3RlciAgc29ydGluZyBhbGdvcml0aG1zLCBzbyBhcyB0byBzcGVlZCB1cCBjb21wcmVzc2lvbi4KLSAgICAgICBCZWxhIEx1YmtpbiBlbmNvdXJhZ2VkIG1lIHRvIGltcHJvdmUgdGhlICB3b3JzdC1jYXNlICBjb20tCi0gICAgICAgcHJlc3Npb24gIHBlcmZvcm1hbmNlLiAgIE1hbnkgIHBlb3BsZSBzZW50IHBhdGNoZXMsIGhlbHBlZAorICAgICAgIFRoZSBpZGVhcyBlbWJvZGllZCBpbiBfCGJfCHpfCGlfCHBfCDIgYXJlIGR1ZSB0byAoYXQgbGVhc3QpIHRoZSBmb2wtCisgICAgICAgbG93aW5nIHBlb3BsZTogTWljaGFlbCBCdXJyb3dzIGFuZCBEYXZpZCBXaGVlbGVyIChmb3IgIHRoZQorICAgICAgIGJsb2NrICBzb3J0aW5nICB0cmFuc2Zvcm1hdGlvbiksIERhdmlkIFdoZWVsZXIgKGFnYWluLCBmb3IKKyAgICAgICB0aGUgSHVmZm1hbiBjb2RlciksIFBldGVyIEZlbndpY2sgKGZvciB0aGUgc3RydWN0dXJlZCBjb2QtCisgICAgICAgaW5nIG1vZGVsIGluIHRoZSBvcmlnaW5hbCBfCGJfCHpfCGlfCHBfCCwgYW5kIG1hbnkgcmVmaW5lbWVudHMpLCBhbmQKKyAgICAgICBBbGlzdGFpciBNb2ZmYXQsIFJhZGZvcmQgTmVhbCAgYW5kICBJYW4gIFdpdHRlbiAgKGZvciAgdGhlCisgICAgICAgYXJpdGhtZXRpYyAgY29kZXIgIGluICB0aGUgIG9yaWdpbmFsICBfCGJfCHpfCGlfCHBfCClfCC4gICBJICBhbSAgbXVjaAorICAgICAgIGluZGVidGVkIGZvciB0aGVpciBoZWxwLCBzdXBwb3J0IGFuZCBhZHZpY2UuICBTZWUgdGhlIG1hbi0KKyAgICAgICB1YWwgIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvciBwb2ludGVycyB0byBzb3VyY2VzIG9mCisgICAgICAgZG9jdW1lbnRhdGlvbi4gIENocmlzdGlhbiB2b24gUm9xdWVzIGVuY291cmFnZWQgbWUgdG8gbG9vaworICAgICAgIGZvciAgZmFzdGVyIHNvcnRpbmcgYWxnb3JpdGhtcywgc28gYXMgdG8gc3BlZWQgdXAgY29tcHJlcy0KKyAgICAgICBzaW9uLiAgQmVsYSBMdWJraW4gZW5jb3VyYWdlZCBtZSB0byBpbXByb3ZlIHRoZSB3b3JzdC1jYXNlCisgICAgICAgY29tcHJlc3Npb24gcGVyZm9ybWFuY2UuICBNYW55IHBlb3BsZSBzZW50IHBhdGNoZXMsIGhlbHBlZAogICAgICAgIHdpdGggcG9ydGFiaWxpdHkgcHJvYmxlbXMsIGxlbnQgbWFjaGluZXMsIGdhdmUgYWR2aWNlICBhbmQKICAgICAgICB3ZXJlIGdlbmVyYWxseSBoZWxwZnVsLgogCkBAIC00NjAsNiArNDMyLDMyIEBACiAKIAogCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKIAogCmRpZmYgLS1naXQgYS9iemlwMi5jIGIvYnppcDIuYwppbmRleCA1M2NlMTBkLi42YTNhYjk1IDEwMDY0NAotLS0gYS9iemlwMi5jCisrKyBiL2J6aXAyLmMKQEAgLTQsMjggKzQsNDUgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKi0tCi0gIFRoaXMgcHJvZ3JhbSBpcyBiemlwMiwgYSBsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzb3IsCi0gIHZlcnNpb24gMC4xcGwyLCBkYXRlZCAyOS1BdWctMTk5Ny4KKyAgVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBiemlwMiBhbmQvb3IgbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQKKyAgbGlicmFyeSBmb3IgbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KIAotICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgYnkgSnVsaWFuIFNld2FyZC4KLSAgICAgR3VpbGRmb3JkLCBTdXJyZXksIFVLCi0gICAgIGVtYWlsOiBqc2V3YXJkQGFjbS5vcmcKKyAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CiAKLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAKLSAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBMSUNFTlNFLgorICAzLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisKKyAgNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICAgIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICBKdWxpYW4gU2V3YXJkLCBHdWlsZGZvcmQsIFN1cnJleSwgVUsuCisgIGpzZXdhcmRAYWNtLm9yZworICBiemlwMi9saWJiemlwMiB2ZXJzaW9uIDAuOS4wYyBvZiAxOCBPY3RvYmVyIDE5OTgKIAogICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24gKGF0IGxlYXN0KSB0aGUgd29yayBvZjoKICAgICAgTWlrZSBCdXJyb3dzCkBAIC0zNywyMSArNTQsMjMgQEAKICAgICAgUm9iZXJ0IFNlZGdld2ljawogICAgICBKb24gTC4gQmVudGxleQogCi0gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNvdXJjZXMsIHNlZSB0aGUgZmlsZSBBTEdPUklUSE1TLgorICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KIC0tKi8KIAorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyotLS0gSU1QT1JUQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0KICAgIFdBUk5JTkc6Ci0gICAgICBUaGlzIHByb2dyYW0gKGF0dGVtcHRzIHRvKSBjb21wcmVzcyBkYXRhIGJ5IHBlcmZvcm1pbmcgc2V2ZXJhbAotICAgICAgbm9uLXRyaXZpYWwgdHJhbnNmb3JtYXRpb25zIG9uIGl0LiAgVW5sZXNzIHlvdSBhcmUgMTAwJSBmYW1pbGlhcgotICAgICAgd2l0aCAqYWxsKiB0aGUgYWxnb3JpdGhtcyBjb250YWluZWQgaGVyZWluLCBhbmQgd2l0aCB0aGUKLSAgICAgIGNvbnNlcXVlbmNlcyBvZiBtb2RpZnlpbmcgdGhlbSwgeW91IHNob3VsZCBOT1QgbWVkZGxlIHdpdGggdGhlCi0gICAgICBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG1hY2hpbmVyeS4gIEluY29ycmVjdCBjaGFuZ2VzIGNhbgotICAgICAgYW5kIHZlcnkgbGlrZWx5ICp3aWxsKiBsZWFkIHRvIGRpc2FzdGVyb3VzIGxvc3Mgb2YgZGF0YS4KKyAgICAgIFRoaXMgcHJvZ3JhbSBhbmQgbGlicmFyeSAoYXR0ZW1wdHMgdG8pIGNvbXByZXNzIGRhdGEgYnkgCisgICAgICBwZXJmb3JtaW5nIHNldmVyYWwgbm9uLXRyaXZpYWwgdHJhbnNmb3JtYXRpb25zIG9uIGl0LiAgCisgICAgICBVbmxlc3MgeW91IGFyZSAxMDAlIGZhbWlsaWFyIHdpdGggKmFsbCogdGhlIGFsZ29yaXRobXMgCisgICAgICBjb250YWluZWQgaGVyZWluLCBhbmQgd2l0aCB0aGUgY29uc2VxdWVuY2VzIG9mIG1vZGlmeWluZyB0aGVtLCAKKyAgICAgIHlvdSBzaG91bGQgTk9UIG1lZGRsZSB3aXRoIHRoZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIAorICAgICAgbWFjaGluZXJ5LiAgSW5jb3JyZWN0IGNoYW5nZXMgY2FuIGFuZCB2ZXJ5IGxpa2VseSAqd2lsbCogCisgICAgICBsZWFkIHRvIGRpc2FzdGVyb3VzIGxvc3Mgb2YgZGF0YS4KIAogICAgRElTQ0xBSU1FUjoKICAgICAgIEkgVEFLRSBOTyBSRVNQT05TSUJJTElUWSBGT1IgQU5ZIExPU1MgT0YgREFUQSBBUklTSU5HIEZST00gVEhFCkBAIC02NSwxOCArODQsMTkgQEAKICAgICAgIG9mIHZhcmlvdXMgc3BlY2lhbCBjYXNlcyBpbiB0aGUgY29kZSB3aGljaCBvY2N1ciB3aXRoIHZlcnkgbG93CiAgICAgICBidXQgbm9uLXplcm8gcHJvYmFiaWxpdHkgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHJ1bGUgb3V0IHRoZQogICAgICAgcG9zc2liaWxpdHkgb2YgYnVncyByZW1haW5pbmcgaW4gdGhlIHByb2dyYW0uICBETyBOT1QgQ09NUFJFU1MKLSAgICAgIEFOWSBEQVRBIFdJVEggVEhJUyBQUk9HUkFNIFVOTEVTUyBZT1UgQVJFIFBSRVBBUkVEIFRPIEFDQ0VQVCBUSEUKLSAgICAgIFBPU1NJQklMSVRZLCBIT1dFVkVSIFNNQUxMLCBUSEFUIFRIRSBEQVRBIFdJTEwgTk9UIEJFIFJFQ09WRVJBQkxFLgorICAgICAgQU5ZIERBVEEgV0lUSCBUSElTIFBST0dSQU0gQU5EL09SIExJQlJBUlkgVU5MRVNTIFlPVSBBUkUgUFJFUEFSRUQgCisgICAgICBUTyBBQ0NFUFQgVEhFIFBPU1NJQklMSVRZLCBIT1dFVkVSIFNNQUxMLCBUSEFUIFRIRSBEQVRBIFdJTEwgCisgICAgICBOT1QgQkUgUkVDT1ZFUkFCTEUuCiAKICAgICAgIFRoYXQgaXMgbm90IHRvIHNheSB0aGlzIHByb2dyYW0gaXMgaW5oZXJlbnRseSB1bnJlbGlhYmxlLgotICAgICAgSW5kZWVkLCBJIHZlcnkgbXVjaCBob3BlIHRoZSBvcHBvc2l0ZSBpcyB0cnVlLiAgYnppcDIgaGFzIGJlZW4KLSAgICAgIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCBhbmQgZXh0ZW5zaXZlbHkgdGVzdGVkLgorICAgICAgSW5kZWVkLCBJIHZlcnkgbXVjaCBob3BlIHRoZSBvcHBvc2l0ZSBpcyB0cnVlLiAgYnppcDIvbGliYnppcDIKKyAgICAgIGhhcyBiZWVuIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCBhbmQgZXh0ZW5zaXZlbHkgdGVzdGVkLgogCiAgICBQQVRFTlRTOgotICAgICAgVG8gdGhlIGJlc3Qgb2YgbXkga25vd2xlZGdlLCBiemlwMiBkb2VzIG5vdCB1c2UgYW55IHBhdGVudGVkCi0gICAgICBhbGdvcml0aG1zLiAgSG93ZXZlciwgSSBkbyBub3QgaGF2ZSB0aGUgcmVzb3VyY2VzIGF2YWlsYWJsZSB0bwotICAgICAgY2Fycnkgb3V0IGEgZnVsbCBwYXRlbnQgc2VhcmNoLiAgVGhlcmVmb3JlIEkgY2Fubm90IGdpdmUgYW55Ci0gICAgICBndWFyYW50ZWUgb2YgdGhlIGFib3ZlIHN0YXRlbWVudC4KKyAgICAgIFRvIHRoZSBiZXN0IG9mIG15IGtub3dsZWRnZSwgYnppcDIvbGliYnppcDIgZG9lcyBub3QgdXNlIGFueSAKKyAgICAgIHBhdGVudGVkIGFsZ29yaXRobXMuICBIb3dldmVyLCBJIGRvIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMgCisgICAgICBhdmFpbGFibGUgdG8gY2Fycnkgb3V0IGEgZnVsbCBwYXRlbnQgc2VhcmNoLiAgVGhlcmVmb3JlIEkgY2Fubm90IAorICAgICAgZ2l2ZSBhbnkgZ3VhcmFudGVlIG9mIHRoZSBhYm92ZSBzdGF0ZW1lbnQuCiAtLSovCiAKIApAQCAtMTAzLDYgKzEyMywxMCBAQAogLS0qLwogI2RlZmluZSBCWl9MQ0NXSU4zMiAgMAogCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIEJaX0xDQ1dJTjMyIDEKKyNkZWZpbmUgQlpfVU5JWCAwCisjZW5kaWYKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMTIsMTIgKzEzNiwxMCBAQAogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiBERUJVRwotICAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAiYnpsaWIuaCIKIAogI2RlZmluZSBFUlJPUl9JRl9FT0YoaSkgICAgICAgeyBpZiAoKGkpID09IEVPRikgIGlvRXJyb3IoKTsgfQogI2RlZmluZSBFUlJPUl9JRl9OT1RfWkVSTyhpKSAgeyBpZiAoKGkpICE9IDApICAgIGlvRXJyb3IoKTsgfQpAQCAtMTMwLDY4ICsxNTIsNDUgQEAKIC0tKi8KIAogI2lmIEJaX1VOSVgKLSAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSAgICNpbmNsdWRlIDx1dGltZS5oPgotICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotICAgI2luY2x1ZGUgPG1hbGxvYy5oPgotICAgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0gICAjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgaW5jbHVkZSA8dXRpbWUuaD4KKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICBpbmNsdWRlIDxzeXMvc3RhdC5oPgorIyAgIGluY2x1ZGUgPHN5cy90aW1lcy5oPgogCi0gICAjZGVmaW5lIEludDMyICAgaW50Ci0gICAjZGVmaW5lIFVJbnQzMiAgdW5zaWduZWQgaW50Ci0gICAjZGVmaW5lIENoYXIgICAgY2hhcgotICAgI2RlZmluZSBVQ2hhciAgIHVuc2lnbmVkIGNoYXIKLSAgICNkZWZpbmUgSW50MTYgICBzaG9ydAotICAgI2RlZmluZSBVSW50MTYgIHVuc2lnbmVkIHNob3J0CisjICAgZGVmaW5lIFBBVEhfU0VQICAgICcvJworIyAgIGRlZmluZSBNWV9MU1RBVCAgICBsc3RhdAorIyAgIGRlZmluZSBNWV9TX0lGUkVHICBTX0lTUkVHCisjICAgZGVmaW5lIE1ZX1NUQVQgICAgIHN0YXQKIAotICAgI2RlZmluZSBQQVRIX1NFUCAgICAnLycKLSAgICNkZWZpbmUgTVlfTFNUQVQgICAgbHN0YXQKLSAgICNkZWZpbmUgTVlfU19JRlJFRyAgU19JU1JFRwotICAgI2RlZmluZSBNWV9TVEFUICAgICBzdGF0Ci0KLSAgICNkZWZpbmUgQVBQRU5EX0ZJTEVTUEVDKHJvb3QsIG5hbWUpIFwKKyMgICBkZWZpbmUgQVBQRU5EX0ZJTEVTUEVDKHJvb3QsIG5hbWUpIFwKICAgICAgIHJvb3Q9c25vY1N0cmluZygocm9vdCksIChuYW1lKSkKIAotICAgI2RlZmluZSBTRVRfQklOQVJZX01PREUoZmQpIC8qKi8KKyMgICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZkKSAvKiovCiAKLSAgIC8qLS0KLSAgICAgIFlvdSBzaG91bGQgdHJ5IHZlcnkgaGFyZCB0byBwZXJzdWFkZSB5b3VyIEMgY29tcGlsZXIKLSAgICAgIHRvIGlubGluZSB0aGUgYml0cyBtYXJrZWQgSU5MSU5FLiAgT3RoZXJ3aXNlIGJ6aXAyIHdpbGwKLSAgICAgIHJ1biByYXRoZXIgc2xvd2x5LiAgZ2NjIHZlcnNpb24gMi54IGlzIHJlY29tbWVuZGVkLgotICAgLS0qLwotICAgI2lmZGVmIF9fR05VQ19fCi0gICAgICAjZGVmaW5lIElOTElORSAgIGlubGluZQotICAgICAgI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQotICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgSU5MSU5FICAgLyoqLwotICAgICAgI2RlZmluZSBOT1JFVFVSTiAvKiovCi0gICAjZW5kaWYKKyMgICBpZmRlZiBfX0dOVUNfXworIyAgICAgIGRlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorIyAgIGVsc2UKKyMgICAgICBkZWZpbmUgTk9SRVRVUk4gLyoqLworIyAgIGVuZGlmCiAjZW5kaWYKIAogCiAKICNpZiBCWl9MQ0NXSU4zMgotICAgI2luY2x1ZGUgPGlvLmg+Ci0gICAjaW5jbHVkZSA8ZmNudGwuaD4KLSAgICNpbmNsdWRlIDxzeXNcc3RhdC5oPgorIyAgIGluY2x1ZGUgPGlvLmg+CisjICAgaW5jbHVkZSA8ZmNudGwuaD4KKyMgICBpbmNsdWRlIDxzeXNcc3RhdC5oPgogCi0gICAjZGVmaW5lIEludDMyICAgaW50Ci0gICAjZGVmaW5lIFVJbnQzMiAgdW5zaWduZWQgaW50Ci0gICAjZGVmaW5lIEludDE2ICAgc2hvcnQKLSAgICNkZWZpbmUgVUludDE2ICB1bnNpZ25lZCBzaG9ydAotICAgI2RlZmluZSBDaGFyICAgIGNoYXIKLSAgICNkZWZpbmUgVUNoYXIgICB1bnNpZ25lZCBjaGFyCisjICAgZGVmaW5lIE5PUkVUVVJOICAgICAgIC8qKi8KKyMgICBkZWZpbmUgUEFUSF9TRVAgICAgICAgJ1xcJworIyAgIGRlZmluZSBNWV9MU1RBVCAgICAgICBfc3RhdAorIyAgIGRlZmluZSBNWV9TVEFUICAgICAgICBfc3RhdAorIyAgIGRlZmluZSBNWV9TX0lGUkVHKHgpICAoKHgpICYgX1NfSUZSRUcpCiAKLSAgICNkZWZpbmUgSU5MSU5FICAgICAgICAgLyoqLwotICAgI2RlZmluZSBOT1JFVFVSTiAgICAgICAvKiovCi0gICAjZGVmaW5lIFBBVEhfU0VQICAgICAgICdcXCcKLSAgICNkZWZpbmUgTVlfTFNUQVQgICAgICAgX3N0YXQKLSAgICNkZWZpbmUgTVlfU1RBVCAgICAgICAgX3N0YXQKLSAgICNkZWZpbmUgTVlfU19JRlJFRyh4KSAgKCh4KSAmIF9TX0lGUkVHKQotCi0gICAjaWYgMAorIyAgIGlmIDAKICAgIC8qLS0gbGNjLXdpbjMyIHNlZW1zIHRvIGV4cGFuZCB3aWxkY2FyZHMgaXRzZWxmIC0tKi8KLSAgICNkZWZpbmUgQVBQRU5EX0ZJTEVTUEVDKHJvb3QsIHNwZWMpICAgICAgICAgICAgICAgIFwKKyMgICBkZWZpbmUgQVBQRU5EX0ZJTEVTUEVDKHJvb3QsIHNwZWMpICAgICAgICAgICAgICAgIFwKICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGlmICgoc3BlYylbMF0gPT0gJy0nKSB7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHJvb3QgPSBzbm9jU3RyaW5nKChyb290KSwgKHNwZWMpKTsgICAgICAgIFwKQEAgLTIxMSwxMiArMjEwLDEyIEBACiAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICB9IHdoaWxlICggMCApCi0gICAjZWxzZQotICAgI2RlZmluZSBBUFBFTkRfRklMRVNQRUMocm9vdCwgbmFtZSkgICAgICAgICAgICAgICAgXAorIyAgIGVsc2UKKyMgICBkZWZpbmUgQVBQRU5EX0ZJTEVTUEVDKHJvb3QsIG5hbWUpICAgICAgICAgICAgICAgIFwKICAgICAgIHJvb3QgPSBzbm9jU3RyaW5nICgocm9vdCksIChuYW1lKSkKLSAgICNlbmRpZgorIyAgIGVuZGlmCiAKLSAgICNkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZkKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyMgICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZkKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgIGludCByZXRWYWwgPSBzZXRtb2RlICggZmlsZW5vICggZmQgKSwgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX0JJTkFSWSApOyAgICAgICAgICAgIFwKQEAgLTIzMSwxMTEgKzIzMCwzMiBAQAogICBTb21lIG1vcmUgc3R1ZmYgZm9yIGFsbCBwbGF0Zm9ybXMgOi0pCiAtLSovCiAKLSNkZWZpbmUgQm9vbCAgIHVuc2lnbmVkIGNoYXIKLSNkZWZpbmUgVHJ1ZSAgIDEKLSNkZWZpbmUgRmFsc2UgIDAKK3R5cGVkZWYgY2hhciAgICAgICAgICAgIENoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCb29sOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUNoYXI7Cit0eXBlZGVmIGludCAgICAgICAgICAgICBJbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJbnQzMjsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgIEludDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVUludDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFRydWUgICgoQm9vbCkxKQorI2RlZmluZSBGYWxzZSAoKEJvb2wpMCkKIAogLyotLQogICBJbnROYXRpdmUgaXMgeW91ciBwbGF0Zm9ybSdzIGBuYXRpdmUnIGludCBzaXplLgogICBPbmx5IGhlcmUgdG8gYXZvaWQgcHJvYnMgd2l0aCA2NC1iaXQgcGxhdGZvcm1zLgogLS0qLwotI2RlZmluZSBJbnROYXRpdmUgaW50Ci0KLQotLyotLQotICAgY2hhbmdlIHRvIDEsIG9yIGNvbXBpbGUgd2l0aCAtRERFQlVHPTEgdG8gZGVidWcKLS0tKi8KLSNpZm5kZWYgREVCVUcKLSNkZWZpbmUgREVCVUcgMAotI2VuZGlmCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tCi0gICBJbXBsZW1lbnRhdGlvbiBub3RlcywgSnVseSAxOTk3Ci0gICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLSAgIE1lbW9yeSBhbGxvY2F0aW9uCi0gICB+fn5+fn5+fn5+fn5+fn5+fgotICAgQWxsIGxhcmdlIGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIG9uIHRoZSBDIGhlYXAsCi0gICBmb3IgYmV0dGVyIG9yIGZvciB3b3JzZS4gIFRoYXQgaW5jbHVkZXMgdGhlIHZhcmlvdXMKLSAgIGFycmF5cyBvZiBwb2ludGVycywgc3RyaXBlZCB3b3JkcywgYnl0ZXMsIGZyZXF1ZW5jeQotICAgdGFibGVzIGFuZCBidWZmZXJzIGZvciBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KLQotICAgYnppcDIgY2FuIG9wZXJhdGUgYXQgdmFyaW91cyBibG9jay1zaXplcywgcmFuZ2luZyBmcm9tCi0gICAxMDBrIHRvIDkwMGsgaW4gMTAwayBzdGVwcywgYW5kIGl0IGFsbG9jYXRlcyBvbmx5IGFzCi0gICBtdWNoIGFzIGl0IG5lZWRzIHRvLiAgV2hlbiBjb21wcmVzc2luZywgd2Uga25vdyBmcm9tIHRoZQotICAgY29tbWFuZC1saW5lIG9wdGlvbnMgd2hhdCB0aGUgYmxvY2stc2l6ZSBpcyBnb2luZyB0byBiZSwKLSAgIHNvIGFsbCBhbGxvY2F0aW9uIGNhbiBiZSBkb25lIGF0IHN0YXJ0LXVwOyBpZiB0aGF0Ci0gICBzdWNjZWVkcywgdGhlcmUgY2FuIGJlIG5vIGZ1cnRoZXIgYWxsb2NhdGlvbiBwcm9ibGVtcy4KLQotICAgRGVjb21wcmVzc2lvbiBpcyBtb3JlIGNvbXBsaWNhdGVkLiAgRWFjaCBjb21wcmVzc2VkIGZpbGUKLSAgIGNvbnRhaW5zLCBpbiBpdHMgaGVhZGVyLCBhIGJ5dGUgaW5kaWNhdGluZyB0aGUgYmxvY2sKLSAgIHNpemUgdXNlZCBmb3IgY29tcHJlc3Npb24uICBUaGlzIG1lYW5zIGJ6aXAyIHBvdGVudGlhbGx5Ci0gICBuZWVkcyB0byByZWFsbG9jYXRlIG1lbW9yeSBmb3IgZWFjaCBmaWxlIGl0IGRlYWxzIHdpdGgsCi0gICB3aGljaCBpbiB0dXJuIG9wZW5zIHRoZSBwb3NzaWJpbGl0eSBmb3IgYSBtZW1vcnkgYWxsb2NhdGlvbgotICAgZmFpbHVyZSBwYXJ0IHdheSB0aHJvdWdoIGEgcnVuIG9mIGZpbGVzLCBieSBlbmNvdW50ZXJpbmcKLSAgIGEgZmlsZSByZXF1aXJpbmcgYSBtdWNoIGxhcmdlciBibG9jayBzaXplIHRoYW4gYWxsIHRoZQotICAgb25lcyBwcmVjZWRpbmcgaXQuCi0KLSAgIFRoZSBwb2xpY3kgaXMgdG8gc2ltcGx5IGdpdmUgdXAgaWYgYSBtZW1vcnkgYWxsb2NhdGlvbgotICAgZmFpbHVyZSBvY2N1cnMuICBEdXJpbmcgZGVjb21wcmVzc2lvbiwgaXQgd291bGQgYmUKLSAgIHBvc3NpYmxlIHRvIG1vdmUgb24gdG8gc3Vic2VxdWVudCBmaWxlcyBpbiB0aGUgaG9wZSB0aGF0Ci0gICBzb21lIG1pZ2h0IGFzayBmb3IgYSBzbWFsbGVyIGJsb2NrIHNpemUsIGJ1dCB0aGUKLSAgIGNvbXBsaWNhdGlvbnMgZm9yIGRvaW5nIHRoaXMgc2VlbSBtb3JlIHRyb3VibGUgdGhhbiB0aGV5Ci0gICBhcmUgd29ydGguCi0KLQotICAgQ29tcHJlc3NlZCBmaWxlIGZvcm1hdHMKLSAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gICBbVGhpcyBpcyBub3cgZW50aXJlbHkgZGlmZmVyZW50IGZyb20gYm90aCAwLjIxLCBhbmQgZnJvbQotICAgIGFueSBwcmV2aW91cyBIdWZmbWFuLWNvZGVkIHZhcmlhbnQgb2YgYnppcC4KLSAgICBTZWUgdGhlIGFzc29jaWF0ZWQgZmlsZSBiemlwMi50eHQgZm9yIGRldGFpbHMuXQotCi0KLSAgIEVycm9yIGNvbmRpdGlvbnMKLSAgIH5+fn5+fn5+fn5+fn5+fn4KLSAgIERlYWxpbmcgd2l0aCBlcnJvciBjb25kaXRpb25zIGlzIHRoZSBsZWFzdCBzYXRpc2ZhY3RvcnkKLSAgIGFzcGVjdCBvZiBiemlwMi4gIFRoZSBwb2xpY3kgaXMgdG8gdHJ5IGFuZCBsZWF2ZSB0aGUKLSAgIGZpbGVzeXN0ZW0gaW4gYSBjb25zaXN0ZW50IHN0YXRlLCB0aGVuIHF1aXQsIGV2ZW4gaWYgaXQKLSAgIG1lYW5zIG5vdCBwcm9jZXNzaW5nIHNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGUKLSAgIGNvbW1hbmQgbGluZS4gIGBBIGNvbnNpc3RlbnQgc3RhdGUnIG1lYW5zIHRoYXQgYSBmaWxlCi0gICBleGlzdHMgZWl0aGVyIGluIGl0cyBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCBmb3JtLAotICAgYnV0IG5vdCBib3RoLiAgVGhpcyBib2lscyBkb3duIHRvIHRoZSBydWxlIGBkZWxldGUgdGhlCi0gICBvdXRwdXQgZmlsZSBpZiBhbiBlcnJvciBjb25kaXRpb24gb2NjdXJzLCBsZWF2aW5nIHRoZQotICAgaW5wdXQgaW50YWN0Jy4gIElucHV0IGZpbGVzIGFyZSBvbmx5IGRlbGV0ZWQgd2hlbiB3ZSBjYW4KLSAgIGJlIHByZXR0eSBzdXJlIHRoZSBvdXRwdXQgZmlsZSBoYXMgYmVlbiB3cml0dGVuIGFuZAotICAgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KLQotICAgRXJyb3JzIGFyZSBhIGRvZyBiZWNhdXNlIHRoZXJlJ3Mgc28gbWFueSB0aGluZ3MgdG8KLSAgIGRlYWwgd2l0aC4gIFRoZSBmb2xsb3dpbmcgY2FuIGhhcHBlbiBtaWQtZmlsZSwgYW5kCi0gICByZXF1aXJlIGNsZWFuaW5nIHVwLgotCi0gICAgIGludGVybmFsIGBwYW5pY3MnIC0tIGluZGljYXRpbmcgYSBidWcKLSAgICAgY29ycnVwdGVkIG9yIGluY29uc2lzdGVudCBjb21wcmVzc2VkIGZpbGUKLSAgICAgY2FuJ3QgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeSB0byBkZWNvbXByZXNzIHRoaXMgZmlsZQotICAgICBJL08gZXJyb3IgcmVhZGluZy93cml0aW5nL29wZW5pbmcvY2xvc2luZwotICAgICBzaWduYWwgY2F0Y2hlcyAtLSBDb250cm9sLUMsIFNJR1RFUk0sIFNJR0hVUC4KLQotICAgT3RoZXIgY29uZGl0aW9ucywgcHJpbWFyaWx5IHBlcnRhaW5pbmcgdG8gZmlsZSBuYW1lcywKLSAgIGNhbiBiZSBjaGVja2VkIGluLWJldHdlZW4gZmlsZXMsIHdoaWNoIG1ha2VzIGRlYWxpbmcKLSAgIHdpdGggdGhlbSBlYXNpZXIuCi0tLSovCi0KK3R5cGVkZWYgaW50IEludE5hdGl2ZTsKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLSBNaXNjIChmaWxlIGhhbmRsaW5nKSBkYXRhIGRlY2xzICAgICAgICAgICAgIC0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLVVJbnQzMiAgYnl0ZXNJbiwgYnl0ZXNPdXQ7CiBJbnQzMiAgIHZlcmJvc2l0eTsKLUJvb2wgICAga2VlcElucHV0RmlsZXMsIHNtYWxsTW9kZSwgdGVzdEZhaWxzRXhpc3Q7Ci1VSW50MzIgIGdsb2JhbENyYzsKLUludDMyICAgbnVtRmlsZU5hbWVzLCBudW1GaWxlc1Byb2Nlc3NlZDsKK0Jvb2wgICAga2VlcElucHV0RmlsZXMsIHNtYWxsTW9kZTsKK0Jvb2wgICAgZm9yY2VPdmVyd3JpdGUsIHRlc3RGYWlsc0V4aXN0OworSW50MzIgICBudW1GaWxlTmFtZXMsIG51bUZpbGVzUHJvY2Vzc2VkLCBibG9ja1NpemUxMDBrOwogCiAKIC8qLS0gc291cmNlIG1vZGVzOyBGPT1maWxlLCBJPT1zdGRpbiwgTz09c3Rkb3V0IC0tKi8KQEAgLTM1MSwyNjg5ICsyNzEsMzAyIEBACiBJbnQzMiAgIG9wTW9kZTsKIEludDMyICAgc3JjTW9kZTsKIAorI2RlZmluZSBGSUxFX05BTUVfTEVOIDEwMzQKIAogSW50MzIgICBsb25nZXN0RmlsZU5hbWU7Ci1DaGFyICAgIGluTmFtZVsxMDI0XTsKLUNoYXIgICAgb3V0TmFtZVsxMDI0XTsKK0NoYXIgICAgaW5OYW1lW0ZJTEVfTkFNRV9MRU5dOworQ2hhciAgICBvdXROYW1lW0ZJTEVfTkFNRV9MRU5dOwogQ2hhciAgICAqcHJvZ05hbWU7Ci1DaGFyICAgIHByb2dOYW1lUmVhbGx5WzEwMjRdOworQ2hhciAgICBwcm9nTmFtZVJlYWxseVtGSUxFX05BTUVfTEVOXTsKIEZJTEUgICAgKm91dHB1dEhhbmRsZUp1c3RJbkNhc2U7CitJbnQzMiAgIHdvcmtGYWN0b3I7CiAKLXZvaWQgICAgcGFuaWMgICAgICAgICAgICAgICAgICggQ2hhciogKSAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgaW9FcnJvciAgICAgICAgICAgICAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgY29tcHJlc3NPdXRPZk1lbW9yeSAgICggSW50MzIsIEludDMyICkgICBOT1JFVFVSTjsKLXZvaWQgICAgdW5jb21wcmVzc091dE9mTWVtb3J5ICggSW50MzIsIEludDMyICkgICBOT1JFVFVSTjsKLXZvaWQgICAgYmxvY2tPdmVycnVuICAgICAgICAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgYmFkQmxvY2tIZWFkZXIgICAgICAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgYmFkQkdMZW5ndGhzICAgICAgICAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgY3JjRXJyb3IgICAgICAgICAgICAgICggVUludDMyLCBVSW50MzIgKSBOT1JFVFVSTjsKLXZvaWQgICAgYml0U3RyZWFtRU9GICAgICAgICAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgY2xlYW5VcEFuZEZhaWwgICAgICAgICggSW50MzIgKSAgICAgICAgICBOT1JFVFVSTjsKLXZvaWQgICAgY29tcHJlc3NlZFN0cmVhbUVPRiAgICggdm9pZCApICAgICAgICAgICBOT1JFVFVSTjsKK3ZvaWQgICAgcGFuaWMgICAgICAgICAgICAgICAgICggQ2hhciogKSAgIE5PUkVUVVJOOwordm9pZCAgICBpb0Vycm9yICAgICAgICAgICAgICAgKCB2b2lkICkgICAgTk9SRVRVUk47Cit2b2lkICAgIG91dE9mTWVtb3J5ICAgICAgICAgICAoIHZvaWQgKSAgICBOT1JFVFVSTjsKK3ZvaWQgICAgYmxvY2tPdmVycnVuICAgICAgICAgICggdm9pZCApICAgIE5PUkVUVVJOOwordm9pZCAgICBiYWRCbG9ja0hlYWRlciAgICAgICAgKCB2b2lkICkgICAgTk9SRVRVUk47Cit2b2lkICAgIGJhZEJHTGVuZ3RocyAgICAgICAgICAoIHZvaWQgKSAgICBOT1JFVFVSTjsKK3ZvaWQgICAgY3JjRXJyb3IgICAgICAgICAgICAgICggdm9pZCApICAgIE5PUkVUVVJOOwordm9pZCAgICBiaXRTdHJlYW1FT0YgICAgICAgICAgKCB2b2lkICkgICAgTk9SRVRVUk47Cit2b2lkICAgIGNsZWFuVXBBbmRGYWlsICAgICAgICAoIEludDMyICkgICBOT1JFVFVSTjsKK3ZvaWQgICAgY29tcHJlc3NlZFN0cmVhbUVPRiAgICggdm9pZCApICAgIE5PUkVUVVJOOwogCit2b2lkICAgIGNvcHlGaWxlTmFtZSAoIENoYXIqLCBDaGFyKiApOwogdm9pZCogICBteU1hbGxvYyAoIEludDMyICk7CiAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLSBEYXRhIGRlY2xzIGZvciB0aGUgZnJvbnQgZW5kICAgICAgICAgICAgICAgIC0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0KLSAgIFRoZSBvdmVyc2hvb3QgYnl0ZXMgYWxsb3cgdXMgdG8gYXZvaWQgbW9zdCBvZgotICAgdGhlIGNvc3Qgb2YgcG9pbnRlciByZW5vcm1hbGlzYXRpb24gZHVyaW5nCi0gICBjb21wYXJpc29uIG9mIHJvdGF0aW9ucyBpbiBzb3J0aW5nLgotICAgVGhlIGZpZ3VyZSBvZiAyMCBpcyBkZXJpdmVkIGFzIGZvbGxvd3M6Ci0gICAgICBxU29ydDMgYWxsb3dzIGFuIG92ZXJzaG9vdCBvZiB1cCB0byAxMC4KLSAgICAgIEl0IHRoZW4gY2FsbHMgc2ltcGxlU29ydCwgd2hpY2ggY2FsbHMKLSAgICAgIGZ1bGxHdFUsIGFsc28gd2l0aCBtYXggb3ZlcnNob290IDEwLgotICAgICAgZnVsbEd0VSBkb2VzIHVwIHRvIDEwIGNvbXBhcmlzb25zIHdpdGhvdXQKLSAgICAgIHJlbm9ybWFsaXNpbmcsIGdpdmluZyAxMCsxMCA9PSAyMC4KLS0tKi8KLSNkZWZpbmUgTlVNX09WRVJTSE9PVF9CWVRFUyAyMAotCi0vKi0tCi0gIFRoZXNlIGFyZSB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZXMgZm9yCi0gIHRoZSBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtLgotLS0qLwotCi0vKi0tCi0gIFBvaW50ZXJzIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCi0gIHN0cnVjdHVyZXMuICBTZXQgYnkKLSAgICAgYWxsb2NhdGVDb21wcmVzc1N0cnVjdHVyZXMgICBhbmQKLSAgICAgc2V0RGVjb21wcmVzc1N0cnVjdHVyZVNpemVzCi0KLSAgVGhlIHN0cnVjdHVyZXMgYXJlIGFsd2F5cyBzZXQgdG8gYmUgc3VpdGFibGUKLSAgZm9yIGEgYmxvY2sgb2Ygc2l6ZSAxMDAwMDAgKiBibG9ja1NpemUxMDBrLgotLS0qLwotVUNoYXIgICAgKmJsb2NrOyAgICAvKi0tIGNvbXByZXNzICAgLS0qLwotVUludDE2ICAgKnF1YWRyYW50OyAvKi0tIGNvbXByZXNzICAgLS0qLwotSW50MzIgICAgKnpwdHI7ICAgICAvKi0tIGNvbXByZXNzICAgLS0qLyAKLVVJbnQxNiAgICpzenB0cjsgICAgLyotLSBvdmVybGF5cyB6cHRyIC0tLSovCi1JbnQzMiAgICAqZnRhYjsgICAgIC8qLS0gY29tcHJlc3MgICAtLSovCi0KLVVJbnQxNiAgICpsbDE2OyAgICAgLyotLSBzbWFsbCBkZWNvbXByZXNzIC0tKi8KLVVDaGFyICAgICpsbDQ7ICAgICAgLyotLSBzbWFsbCBkZWNvbXByZXNzIC0tKi8KLQotSW50MzIgICAgKnR0OyAgICAgICAvKi0tIGZhc3QgZGVjb21wcmVzcyAgLS0qLwotVUNoYXIgICAgKmxsODsgICAgICAvKi0tIGZhc3QgZGVjb21wcmVzcyAgLS0qLwotCi0KLS8qLS0KLSAgZnJlcSB0YWJsZSBjb2xsZWN0ZWQgdG8gc2F2ZSBhIHBhc3Mgb3ZlciB0aGUgZGF0YQotICBkdXJpbmcgZGVjb21wcmVzc2lvbi4KLS0tKi8KLUludDMyICAgdW56ZnRhYlsyNTZdOwotCi0KLS8qLS0KLSAgIGluZGV4IG9mIHRoZSBsYXN0IGNoYXIgaW4gdGhlIGJsb2NrLCBzbwotICAgdGhlIGJsb2NrIHNpemUgPT0gbGFzdCArIDEuCi0tLSovCi1JbnQzMiAgbGFzdDsKLQotCi0vKi0tCi0gIGluZGV4IGluIHpwdHJbXSBvZiBvcmlnaW5hbCBzdHJpbmcgYWZ0ZXIgc29ydGluZy4KLS0tKi8KLUludDMyICBvcmlnUHRyOwotCi0KLS8qLS0KLSAgYWx3YXlzOiBpbiB0aGUgcmFuZ2UgMCAuLiA5LgotICBUaGUgY3VycmVudCBibG9jayBzaXplIGlzIDEwMDAwMCAqIHRoaXMgbnVtYmVyLgotLS0qLwotSW50MzIgIGJsb2NrU2l6ZTEwMGs7Ci0KLQotLyotLQotICBVc2VkIHdoZW4gc29ydGluZy4gIElmIHRvbyBtYW55IGxvbmcgY29tcGFyaXNvbnMKLSAgaGFwcGVuLCB3ZSBzdG9wIHNvcnRpbmcsIHJhbmRvbWlzZSB0aGUgYmxvY2sgCi0gIHNsaWdodGx5LCBhbmQgdHJ5IGFnYWluLgotLS0qLwotCi1JbnQzMiAgd29ya0ZhY3RvcjsKLUludDMyICB3b3JrRG9uZTsKLUludDMyICB3b3JrTGltaXQ7Ci1Cb29sICAgYmxvY2tSYW5kb21pc2VkOwotQm9vbCAgIGZpcnN0QXR0ZW1wdDsKLUludDMyICBuQmxvY2tzUmFuZG9taXNlZDsKLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIERhdGEgZGVjbHMgZm9yIHRoZSBiYWNrIGVuZCAgICAgICAgICAgICAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBNQVhfQUxQSEFfU0laRSAyNTgKLSNkZWZpbmUgTUFYX0NPREVfTEVOICAgIDIzCi0KLSNkZWZpbmUgUlVOQSAwCi0jZGVmaW5lIFJVTkIgMQotCi0jZGVmaW5lIE5fR1JPVVBTIDYKLSNkZWZpbmUgR19TSVpFICAgNTAKLSNkZWZpbmUgTl9JVEVSUyAgNAotCi0jZGVmaW5lIE1BWF9TRUxFQ1RPUlMgKDIgKyAoOTAwMDAwIC8gR19TSVpFKSkKLQotQm9vbCAgaW5Vc2VbMjU2XTsKLUludDMyIG5JblVzZTsKLQotVUNoYXIgc2VxVG9VbnNlcVsyNTZdOwotVUNoYXIgdW5zZXFUb1NlcVsyNTZdOwotCi1VQ2hhciBzZWxlY3RvciAgIFtNQVhfU0VMRUNUT1JTXTsKLVVDaGFyIHNlbGVjdG9yTXRmW01BWF9TRUxFQ1RPUlNdOwotCi1JbnQzMiBuTVRGOwotCi1JbnQzMiBtdGZGcmVxW01BWF9BTFBIQV9TSVpFXTsKLQotVUNoYXIgbGVuICBbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKLQotLyotLSBkZWNvbXByZXNzIG9ubHkgLS0qLwotSW50MzIgbGltaXQgIFtOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOwotSW50MzIgYmFzZSAgIFtOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOwotSW50MzIgcGVybSAgIFtOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOwotSW50MzIgbWluTGVuc1tOX0dST1VQU107Ci0KLS8qLS0gY29tcHJlc3Mgb25seSAtLSovCi1JbnQzMiAgY29kZSBbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKLUludDMyICByZnJlcVtOX0dST1VQU11bTUFYX0FMUEhBX1NJWkVdOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIDMyLWJpdCBDUkMgZ3J1bmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLQotICBJIHRoaW5rIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFVVE9ESU4tSUksCi0gIEV0aGVybmV0ICYgRkRESSAzMi1iaXQgQ1JDIHN0YW5kYXJkLiAgVmFndWVseSBkZXJpdmVkCi0gIGZyb20gY29kZSBieSBSb2IgV2Fybm9jaywgaW4gU2VjdGlvbiA1MSBvZiB0aGUKLSAgY29tcC5jb21wcmVzc2lvbiBGQVEuCi0tLSovCi0KLVVJbnQzMiBjcmMzMlRhYmxlWzI1Nl0gPSB7Ci0KLSAgIC8qLS0gVWdseSwgaW5uaXQ/IC0tKi8KLQotICAgMHgwMDAwMDAwMFVMLCAweDA0YzExZGI3VUwsIDB4MDk4MjNiNmVVTCwgMHgwZDQzMjZkOVVMLAotICAgMHgxMzA0NzZkY1VMLCAweDE3YzU2YjZiVUwsIDB4MWE4NjRkYjJVTCwgMHgxZTQ3NTAwNVVMLAotICAgMHgyNjA4ZWRiOFVMLCAweDIyYzlmMDBmVUwsIDB4MmY4YWQ2ZDZVTCwgMHgyYjRiY2I2MVVMLAotICAgMHgzNTBjOWI2NFVMLCAweDMxY2Q4NmQzVUwsIDB4M2M4ZWEwMGFVTCwgMHgzODRmYmRiZFVMLAotICAgMHg0YzExZGI3MFVMLCAweDQ4ZDBjNmM3VUwsIDB4NDU5M2UwMWVVTCwgMHg0MTUyZmRhOVVMLAotICAgMHg1ZjE1YWRhY1VMLCAweDViZDRiMDFiVUwsIDB4NTY5Nzk2YzJVTCwgMHg1MjU2OGI3NVVMLAotICAgMHg2YTE5MzZjOFVMLCAweDZlZDgyYjdmVUwsIDB4NjM5YjBkYTZVTCwgMHg2NzVhMTAxMVVMLAotICAgMHg3OTFkNDAxNFVMLCAweDdkZGM1ZGEzVUwsIDB4NzA5ZjdiN2FVTCwgMHg3NDVlNjZjZFVMLAotICAgMHg5ODIzYjZlMFVMLCAweDljZTJhYjU3VUwsIDB4OTFhMThkOGVVTCwgMHg5NTYwOTAzOVVMLAotICAgMHg4YjI3YzAzY1VMLCAweDhmZTZkZDhiVUwsIDB4ODJhNWZiNTJVTCwgMHg4NjY0ZTZlNVVMLAotICAgMHhiZTJiNWI1OFVMLCAweGJhZWE0NmVmVUwsIDB4YjdhOTYwMzZVTCwgMHhiMzY4N2Q4MVVMLAotICAgMHhhZDJmMmQ4NFVMLCAweGE5ZWUzMDMzVUwsIDB4YTRhZDE2ZWFVTCwgMHhhMDZjMGI1ZFVMLAotICAgMHhkNDMyNmQ5MFVMLCAweGQwZjM3MDI3VUwsIDB4ZGRiMDU2ZmVVTCwgMHhkOTcxNGI0OVVMLAotICAgMHhjNzM2MWI0Y1VMLCAweGMzZjcwNmZiVUwsIDB4Y2ViNDIwMjJVTCwgMHhjYTc1M2Q5NVVMLAotICAgMHhmMjNhODAyOFVMLCAweGY2ZmI5ZDlmVUwsIDB4ZmJiOGJiNDZVTCwgMHhmZjc5YTZmMVVMLAotICAgMHhlMTNlZjZmNFVMLCAweGU1ZmZlYjQzVUwsIDB4ZThiY2NkOWFVTCwgMHhlYzdkZDAyZFVMLAotICAgMHgzNDg2NzA3N1VMLCAweDMwNDc2ZGMwVUwsIDB4M2QwNDRiMTlVTCwgMHgzOWM1NTZhZVVMLAotICAgMHgyNzgyMDZhYlVMLCAweDIzNDMxYjFjVUwsIDB4MmUwMDNkYzVVTCwgMHgyYWMxMjA3MlVMLAotICAgMHgxMjhlOWRjZlVMLCAweDE2NGY4MDc4VUwsIDB4MWIwY2E2YTFVTCwgMHgxZmNkYmIxNlVMLAotICAgMHgwMThhZWIxM1VMLCAweDA1NGJmNmE0VUwsIDB4MDgwOGQwN2RVTCwgMHgwY2M5Y2RjYVVMLAotICAgMHg3ODk3YWIwN1VMLCAweDdjNTZiNmIwVUwsIDB4NzExNTkwNjlVTCwgMHg3NWQ0OGRkZVVMLAotICAgMHg2YjkzZGRkYlVMLCAweDZmNTJjMDZjVUwsIDB4NjIxMWU2YjVVTCwgMHg2NmQwZmIwMlVMLAotICAgMHg1ZTlmNDZiZlVMLCAweDVhNWU1YjA4VUwsIDB4NTcxZDdkZDFVTCwgMHg1M2RjNjA2NlVMLAotICAgMHg0ZDliMzA2M1VMLCAweDQ5NWEyZGQ0VUwsIDB4NDQxOTBiMGRVTCwgMHg0MGQ4MTZiYVVMLAotICAgMHhhY2E1YzY5N1VMLCAweGE4NjRkYjIwVUwsIDB4YTUyN2ZkZjlVTCwgMHhhMWU2ZTA0ZVVMLAotICAgMHhiZmExYjA0YlVMLCAweGJiNjBhZGZjVUwsIDB4YjYyMzhiMjVVTCwgMHhiMmUyOTY5MlVMLAotICAgMHg4YWFkMmIyZlVMLCAweDhlNmMzNjk4VUwsIDB4ODMyZjEwNDFVTCwgMHg4N2VlMGRmNlVMLAotICAgMHg5OWE5NWRmM1VMLCAweDlkNjg0MDQ0VUwsIDB4OTAyYjY2OWRVTCwgMHg5NGVhN2IyYVVMLAotICAgMHhlMGI0MWRlN1VMLCAweGU0NzUwMDUwVUwsIDB4ZTkzNjI2ODlVTCwgMHhlZGY3M2IzZVVMLAotICAgMHhmM2IwNmIzYlVMLCAweGY3NzE3NjhjVUwsIDB4ZmEzMjUwNTVVTCwgMHhmZWYzNGRlMlVMLAotICAgMHhjNmJjZjA1ZlVMLCAweGMyN2RlZGU4VUwsIDB4Y2YzZWNiMzFVTCwgMHhjYmZmZDY4NlVMLAotICAgMHhkNWI4ODY4M1VMLCAweGQxNzk5YjM0VUwsIDB4ZGMzYWJkZWRVTCwgMHhkOGZiYTA1YVVMLAotICAgMHg2OTBjZTBlZVVMLCAweDZkY2RmZDU5VUwsIDB4NjA4ZWRiODBVTCwgMHg2NDRmYzYzN1VMLAotICAgMHg3YTA4OTYzMlVMLCAweDdlYzk4Yjg1VUwsIDB4NzM4YWFkNWNVTCwgMHg3NzRiYjBlYlVMLAotICAgMHg0ZjA0MGQ1NlVMLCAweDRiYzUxMGUxVUwsIDB4NDY4NjM2MzhVTCwgMHg0MjQ3MmI4ZlVMLAotICAgMHg1YzAwN2I4YVVMLCAweDU4YzE2NjNkVUwsIDB4NTU4MjQwZTRVTCwgMHg1MTQzNWQ1M1VMLAotICAgMHgyNTFkM2I5ZVVMLCAweDIxZGMyNjI5VUwsIDB4MmM5ZjAwZjBVTCwgMHgyODVlMWQ0N1VMLAotICAgMHgzNjE5NGQ0MlVMLCAweDMyZDg1MGY1VUwsIDB4M2Y5Yjc2MmNVTCwgMHgzYjVhNmI5YlVMLAotICAgMHgwMzE1ZDYyNlVMLCAweDA3ZDRjYjkxVUwsIDB4MGE5N2VkNDhVTCwgMHgwZTU2ZjBmZlVMLAotICAgMHgxMDExYTBmYVVMLCAweDE0ZDBiZDRkVUwsIDB4MTk5MzliOTRVTCwgMHgxZDUyODYyM1VMLAotICAgMHhmMTJmNTYwZVVMLCAweGY1ZWU0YmI5VUwsIDB4ZjhhZDZkNjBVTCwgMHhmYzZjNzBkN1VMLAotICAgMHhlMjJiMjBkMlVMLCAweGU2ZWEzZDY1VUwsIDB4ZWJhOTFiYmNVTCwgMHhlZjY4MDYwYlVMLAotICAgMHhkNzI3YmJiNlVMLCAweGQzZTZhNjAxVUwsIDB4ZGVhNTgwZDhVTCwgMHhkYTY0OWQ2ZlVMLAotICAgMHhjNDIzY2Q2YVVMLCAweGMwZTJkMGRkVUwsIDB4Y2RhMWY2MDRVTCwgMHhjOTYwZWJiM1VMLAotICAgMHhiZDNlOGQ3ZVVMLCAweGI5ZmY5MGM5VUwsIDB4YjRiY2I2MTBVTCwgMHhiMDdkYWJhN1VMLAotICAgMHhhZTNhZmJhMlVMLCAweGFhZmJlNjE1VUwsIDB4YTdiOGMwY2NVTCwgMHhhMzc5ZGQ3YlVMLAotICAgMHg5YjM2NjBjNlVMLCAweDlmZjc3ZDcxVUwsIDB4OTJiNDViYThVTCwgMHg5Njc1NDYxZlVMLAotICAgMHg4ODMyMTYxYVVMLCAweDhjZjMwYmFkVUwsIDB4ODFiMDJkNzRVTCwgMHg4NTcxMzBjM1VMLAotICAgMHg1ZDhhOTA5OVVMLCAweDU5NGI4ZDJlVUwsIDB4NTQwOGFiZjdVTCwgMHg1MGM5YjY0MFVMLAotICAgMHg0ZThlZTY0NVVMLCAweDRhNGZmYmYyVUwsIDB4NDcwY2RkMmJVTCwgMHg0M2NkYzA5Y1VMLAotICAgMHg3YjgyN2QyMVVMLCAweDdmNDM2MDk2VUwsIDB4NzIwMDQ2NGZVTCwgMHg3NmMxNWJmOFVMLAotICAgMHg2ODg2MGJmZFVMLCAweDZjNDcxNjRhVUwsIDB4NjEwNDMwOTNVTCwgMHg2NWM1MmQyNFVMLAotICAgMHgxMTliNGJlOVVMLCAweDE1NWE1NjVlVUwsIDB4MTgxOTcwODdVTCwgMHgxY2Q4NmQzMFVMLAotICAgMHgwMjlmM2QzNVVMLCAweDA2NWUyMDgyVUwsIDB4MGIxZDA2NWJVTCwgMHgwZmRjMWJlY1VMLAotICAgMHgzNzkzYTY1MVVMLCAweDMzNTJiYmU2VUwsIDB4M2UxMTlkM2ZVTCwgMHgzYWQwODA4OFVMLAotICAgMHgyNDk3ZDA4ZFVMLCAweDIwNTZjZDNhVUwsIDB4MmQxNWViZTNVTCwgMHgyOWQ0ZjY1NFVMLAotICAgMHhjNWE5MjY3OVVMLCAweGMxNjgzYmNlVUwsIDB4Y2MyYjFkMTdVTCwgMHhjOGVhMDBhMFVMLAotICAgMHhkNmFkNTBhNVVMLCAweGQyNmM0ZDEyVUwsIDB4ZGYyZjZiY2JVTCwgMHhkYmVlNzY3Y1VMLAotICAgMHhlM2ExY2JjMVVMLCAweGU3NjBkNjc2VUwsIDB4ZWEyM2YwYWZVTCwgMHhlZWUyZWQxOFVMLAotICAgMHhmMGE1YmQxZFVMLCAweGY0NjRhMGFhVUwsIDB4ZjkyNzg2NzNVTCwgMHhmZGU2OWJjNFVMLAotICAgMHg4OWI4ZmQwOVVMLCAweDhkNzllMGJlVUwsIDB4ODAzYWM2NjdVTCwgMHg4NGZiZGJkMFVMLAotICAgMHg5YWJjOGJkNVVMLCAweDllN2Q5NjYyVUwsIDB4OTMzZWIwYmJVTCwgMHg5N2ZmYWQwY1VMLAotICAgMHhhZmIwMTBiMVVMLCAweGFiNzEwZDA2VUwsIDB4YTYzMjJiZGZVTCwgMHhhMmYzMzY2OFVMLAotICAgMHhiY2I0NjY2ZFVMLCAweGI4NzU3YmRhVUwsIDB4YjUzNjVkMDNVTCwgMHhiMWY3NDBiNFVMCi19OwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaW5pdGlhbGlzZUNSQyAoIHZvaWQgKQotewotICAgZ2xvYmFsQ3JjID0gMHhmZmZmZmZmZlVMOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVVJbnQzMiBnZXRGaW5hbENSQyAoIHZvaWQgKQotewotICAgcmV0dXJuIH5nbG9iYWxDcmM7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotVUludDMyIGdldEdsb2JhbENSQyAoIHZvaWQgKQotewotICAgcmV0dXJuIGdsb2JhbENyYzsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHNldEdsb2JhbENSQyAoIFVJbnQzMiBuZXdDcmMgKQotewotICAgZ2xvYmFsQ3JjID0gbmV3Q3JjOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgVVBEQVRFX0NSQyhjcmNWYXIsY2hhKSAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBjcmNWYXIgPSAoY3JjVmFyIDw8IDgpIF4gICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNyYzMyVGFibGVbKGNyY1ZhciA+PiAyNCkgXiAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAoKFVDaGFyKWNoYSldOyAgICAgICBcCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0gQml0IHN0cmVhbSBJL08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLVVJbnQzMiBic0J1ZmY7Ci1JbnQzMiAgYnNMaXZlOwotRklMRSogIGJzU3RyZWFtOwotQm9vbCAgIGJzV3JpdGluZzsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGJzU2V0U3RyZWFtICggRklMRSogZiwgQm9vbCB3ciApCi17Ci0gICBpZiAoYnNTdHJlYW0gIT0gTlVMTCkgcGFuaWMgKCAiYnNTZXRTdHJlYW0iICk7Ci0gICBic1N0cmVhbSA9IGY7Ci0gICBic0xpdmUgPSAwOwotICAgYnNCdWZmID0gMDsKLSAgIGJ5dGVzT3V0ID0gMDsKLSAgIGJ5dGVzSW4gPSAwOwotICAgYnNXcml0aW5nID0gd3I7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBic0ZpbmlzaGVkV2l0aFN0cmVhbSAoIHZvaWQgKQotewotICAgaWYgKGJzV3JpdGluZykKLSAgICAgIHdoaWxlIChic0xpdmUgPiAwKSB7Ci0gICAgICAgICBmcHV0YyAoIChVQ2hhcikoYnNCdWZmID4+IDI0KSwgYnNTdHJlYW0gKTsKLSAgICAgICAgIGJzQnVmZiA8PD0gODsKLSAgICAgICAgIGJzTGl2ZSAtPSA4OwotICAgICAgICAgYnl0ZXNPdXQrKzsKLSAgICAgIH0KLSAgIGJzU3RyZWFtID0gTlVMTDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIGJzTkVFRFIobnopICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHdoaWxlIChic0xpdmUgPCBueikgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBJbnQzMiB6emkgPSBmZ2V0YyAoIGJzU3RyZWFtICk7ICAgICAgICAgXAotICAgICAgaWYgKHp6aSA9PSBFT0YpIGNvbXByZXNzZWRTdHJlYW1FT0YoKTsgIFwKLSAgICAgIGJzQnVmZiA9IChic0J1ZmYgPDwgOCkgfCAoenppICYgMHhmZkwpOyBcCi0gICAgICBic0xpdmUgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIGJzTkVFRFcobnopICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHdoaWxlIChic0xpdmUgPj0gOCkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmcHV0YyAoIChVQ2hhcikoYnNCdWZmID4+IDI0KSwgICAgICAgICAgXAotICAgICAgICAgICAgICAgYnNTdHJlYW0gKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJzQnVmZiA8PD0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBic0xpdmUgLT0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnl0ZXNPdXQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBic1IxKHZ6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBic05FRURSKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgdnogPSAoYnNCdWZmID4+IChic0xpdmUtMSkpICYgMTsgICAgICAgICAgIFwKLSAgIGJzTGl2ZS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSU5MSU5FIFVJbnQzMiBic1IgKCBJbnQzMiBuICkKLXsKLSAgIFVJbnQzMiB2OwotICAgYnNORUVEUiAoIG4gKTsKLSAgIHYgPSAoYnNCdWZmID4+IChic0xpdmUtbikpICYgKCgxIDw8IG4pLTEpOwotICAgYnNMaXZlIC09IG47Ci0gICByZXR1cm4gdjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1JTkxJTkUgdm9pZCBic1cgKCBJbnQzMiBuLCBVSW50MzIgdiApCi17Ci0gICBic05FRURXICggbiApOwotICAgYnNCdWZmIHw9ICh2IDw8ICgzMiAtIGJzTGl2ZSAtIG4pKTsKLSAgIGJzTGl2ZSArPSBuOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVVDaGFyIGJzR2V0VUNoYXIgKCB2b2lkICkKLXsKLSAgIHJldHVybiAoVUNoYXIpYnNSKDgpOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgYnNQdXRVQ2hhciAoIFVDaGFyIGMgKQotewotICAgYnNXKDgsIChVSW50MzIpYyApOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUludDMyIGJzR2V0VUludDMyICggdm9pZCApCi17Ci0gICBVSW50MzIgdTsKLSAgIHUgPSAwOwotICAgdSA9ICh1IDw8IDgpIHwgYnNSKDgpOwotICAgdSA9ICh1IDw8IDgpIHwgYnNSKDgpOwotICAgdSA9ICh1IDw8IDgpIHwgYnNSKDgpOwotICAgdSA9ICh1IDw8IDgpIHwgYnNSKDgpOwotICAgcmV0dXJuIHU7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotVUludDMyIGJzR2V0SW50VlMgKCBVSW50MzIgbnVtQml0cyApCi17Ci0gICByZXR1cm4gKFVJbnQzMilic1IobnVtQml0cyk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotVUludDMyIGJzR2V0SW50MzIgKCB2b2lkICkKLXsKLSAgIHJldHVybiAoSW50MzIpYnNHZXRVSW50MzIoKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGJzUHV0VUludDMyICggVUludDMyIHUgKQotewotICAgYnNXICggOCwgKHUgPj4gMjQpICYgMHhmZkwgKTsKLSAgIGJzVyAoIDgsICh1ID4+IDE2KSAmIDB4ZmZMICk7Ci0gICBic1cgKCA4LCAodSA+PiAgOCkgJiAweGZmTCApOwotICAgYnNXICggOCwgIHUgICAgICAgICYgMHhmZkwgKTsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGJzUHV0SW50MzIgKCBJbnQzMiBjICkKLXsKLSAgIGJzUHV0VUludDMyICggKFVJbnQzMiljICk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBic1B1dEludFZTICggSW50MzIgbnVtQml0cywgVUludDMyIGMgKQotewotICAgYnNXICggbnVtQml0cywgYyApOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIEh1ZmZtYW4gY29kaW5nIGxvdy1sZXZlbCBzdHVmZiAgICAgICAgICAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBXRUlHSFRPRih6ejApICAoKHp6MCkgJiAweGZmZmZmZjAwKQotI2RlZmluZSBERVBUSE9GKHp6MSkgICAoKHp6MSkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBNWU1BWCh6ejIsenozKSAoKHp6MikgPiAoenozKSA/ICh6ejIpIDogKHp6MykpCi0KLSNkZWZpbmUgQUREV0VJR0hUUyh6dzEsencyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIChXRUlHSFRPRih6dzEpK1dFSUdIVE9GKHp3MikpIHwgICAgICAgICAgICAgICAgICAgIFwKLSAgICgxICsgTVlNQVgoREVQVEhPRih6dzEpLERFUFRIT0YoencyKSkpCi0KLSNkZWZpbmUgVVBIRUFQKHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIEludDMyIHp6LCB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHp6ID0gejsgdG1wID0gaGVhcFt6el07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHdoaWxlICh3ZWlnaHRbdG1wXSA8IHdlaWdodFtoZWFwW3p6ID4+IDFdXSkgeyAgICAgIFwKLSAgICAgIGhlYXBbenpdID0gaGVhcFt6eiA+PiAxXTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHp6ID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGhlYXBbenpdID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBET1dOSEVBUCh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgSW50MzIgenosIHl5LCB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgenogPSB6OyB0bXAgPSBoZWFwW3p6XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgd2hpbGUgKFRydWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeXkgPSB6eiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHl5ID4gbkhlYXApIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHl5IDwgbkhlYXAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdlaWdodFtoZWFwW3l5KzFdXSA8IHdlaWdodFtoZWFwW3l5XV0pICAgICAgXAotICAgICAgICAgeXkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkgYnJlYWs7ICAgICAgXAotICAgICAgaGVhcFt6el0gPSBoZWFwW3l5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgenogPSB5eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgaGVhcFt6el0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGJNYWtlQ29kZUxlbmd0aHMgKCBVQ2hhciAqbGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiAqZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiBhbHBoYVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWF4TGVuICkKLXsKLSAgIC8qLS0KLSAgICAgIE5vZGVzIGFuZCBoZWFwIGVudHJpZXMgcnVuIGZyb20gMS4gIEVudHJ5IDAKLSAgICAgIGZvciBib3RoIHRoZSBoZWFwIGFuZCBub2RlcyBpcyBhIHNlbnRpbmVsLgotICAgLS0qLwotICAgSW50MzIgbk5vZGVzLCBuSGVhcCwgbjEsIG4yLCBpLCBqLCBrOwotICAgQm9vbCAgdG9vTG9uZzsKLQotICAgSW50MzIgaGVhcCAgIFsgTUFYX0FMUEhBX1NJWkUgKyAyIF07Ci0gICBJbnQzMiB3ZWlnaHQgWyBNQVhfQUxQSEFfU0laRSAqIDIgXTsKLSAgIEludDMyIHBhcmVudCBbIE1BWF9BTFBIQV9TSVpFICogMiBdOyAKLQotICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKQotICAgICAgd2VpZ2h0W2krMV0gPSAoZnJlcVtpXSA9PSAwID8gMSA6IGZyZXFbaV0pIDw8IDg7Ci0KLSAgIHdoaWxlIChUcnVlKSB7Ci0KLSAgICAgIG5Ob2RlcyA9IGFscGhhU2l6ZTsKLSAgICAgIG5IZWFwID0gMDsKLQotICAgICAgaGVhcFswXSA9IDA7Ci0gICAgICB3ZWlnaHRbMF0gPSAwOwotICAgICAgcGFyZW50WzBdID0gLTI7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gYWxwaGFTaXplOyBpKyspIHsKLSAgICAgICAgIHBhcmVudFtpXSA9IC0xOwotICAgICAgICAgbkhlYXArKzsKLSAgICAgICAgIGhlYXBbbkhlYXBdID0gaTsKLSAgICAgICAgIFVQSEVBUChuSGVhcCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIShuSGVhcCA8IChNQVhfQUxQSEFfU0laRSsyKSkpIAotICAgICAgICAgcGFuaWMgKCAiaGJNYWtlQ29kZUxlbmd0aHMoMSkiICk7Ci0gICAKLSAgICAgIHdoaWxlIChuSGVhcCA+IDEpIHsKLSAgICAgICAgIG4xID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUCgxKTsKLSAgICAgICAgIG4yID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUCgxKTsKLSAgICAgICAgIG5Ob2RlcysrOwotICAgICAgICAgcGFyZW50W24xXSA9IHBhcmVudFtuMl0gPSBuTm9kZXM7Ci0gICAgICAgICB3ZWlnaHRbbk5vZGVzXSA9IEFERFdFSUdIVFMod2VpZ2h0W24xXSwgd2VpZ2h0W24yXSk7Ci0gICAgICAgICBwYXJlbnRbbk5vZGVzXSA9IC0xOwotICAgICAgICAgbkhlYXArKzsKLSAgICAgICAgIGhlYXBbbkhlYXBdID0gbk5vZGVzOwotICAgICAgICAgVVBIRUFQKG5IZWFwKTsKLSAgICAgIH0KLSAgICAgIGlmICghKG5Ob2RlcyA8IChNQVhfQUxQSEFfU0laRSAqIDIpKSkKLSAgICAgICAgIHBhbmljICggImhiTWFrZUNvZGVMZW5ndGhzKDIpIiApOwotCi0gICAgICB0b29Mb25nID0gRmFsc2U7Ci0gICAgICBmb3IgKGkgPSAxOyBpIDw9IGFscGhhU2l6ZTsgaSsrKSB7Ci0gICAgICAgICBqID0gMDsKLSAgICAgICAgIGsgPSBpOwotICAgICAgICAgd2hpbGUgKHBhcmVudFtrXSA+PSAwKSB7IGsgPSBwYXJlbnRba107IGorKzsgfQotICAgICAgICAgbGVuW2ktMV0gPSBqOwotICAgICAgICAgaWYgKGogPiBtYXhMZW4pIHRvb0xvbmcgPSBUcnVlOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoISB0b29Mb25nKSBicmVhazsKLQotICAgICAgZm9yIChpID0gMTsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7Ci0gICAgICAgICBqID0gd2VpZ2h0W2ldID4+IDg7Ci0gICAgICAgICBqID0gMSArIChqIC8gMik7Ci0gICAgICAgICB3ZWlnaHRbaV0gPSBqIDw8IDg7Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoYkFzc2lnbkNvZGVzICggSW50MzIgKmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICBVQ2hhciAqbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWluTGVuLAotICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgSW50MzIgYWxwaGFTaXplICkKLXsKLSAgIEludDMyIG4sIHZlYywgaTsKLQotICAgdmVjID0gMDsKLSAgIGZvciAobiA9IG1pbkxlbjsgbiA8PSBtYXhMZW47IG4rKykgewotICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKQotICAgICAgICAgaWYgKGxlbmd0aFtpXSA9PSBuKSB7IGNvZGVbaV0gPSB2ZWM7IHZlYysrOyB9OwotICAgICAgdmVjIDw8PSAxOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgaGJDcmVhdGVEZWNvZGVUYWJsZXMgKCBJbnQzMiAqbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgKnBlcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiBtaW5MZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWF4TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyIGFscGhhU2l6ZSApCi17Ci0gICBJbnQzMiBwcCwgaSwgaiwgdmVjOwotCi0gICBwcCA9IDA7Ci0gICBmb3IgKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspCi0gICAgICBmb3IgKGogPSAwOyBqIDwgYWxwaGFTaXplOyBqKyspCi0gICAgICAgICBpZiAobGVuZ3RoW2pdID09IGkpIHsgcGVybVtwcF0gPSBqOyBwcCsrOyB9OwotCi0gICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREVfTEVOOyBpKyspIGJhc2VbaV0gPSAwOwotICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSBiYXNlW2xlbmd0aFtpXSsxXSsrOwotCi0gICBmb3IgKGkgPSAxOyBpIDwgTUFYX0NPREVfTEVOOyBpKyspIGJhc2VbaV0gKz0gYmFzZVtpLTFdOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREVfTEVOOyBpKyspIGxpbWl0W2ldID0gMDsKLSAgIHZlYyA9IDA7Ci0KLSAgIGZvciAoaSA9IG1pbkxlbjsgaSA8PSBtYXhMZW47IGkrKykgewotICAgICAgdmVjICs9IChiYXNlW2krMV0gLSBiYXNlW2ldKTsKLSAgICAgIGxpbWl0W2ldID0gdmVjLTE7Ci0gICAgICB2ZWMgPDw9IDE7Ci0gICB9Ci0gICBmb3IgKGkgPSBtaW5MZW4gKyAxOyBpIDw9IG1heExlbjsgaSsrKQotICAgICAgYmFzZVtpXSA9ICgobGltaXRbaS0xXSArIDEpIDw8IDEpIC0gYmFzZVtpXTsKLX0KLQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIFVuZG9pbmcgdGhlIHJldmVyc2libGUgdHJhbnNmb3JtYXRpb24gICAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBTRVRfTEw0KGksbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7IGlmICgoKGkpICYgMHgxKSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbGw0WyhpKSA+PiAxXSA9IChsbDRbKGkpID4+IDFdICYgMHhmMCkgfCAobik7IGVsc2UgICAgXAotICAgICAgICBsbDRbKGkpID4+IDFdID0gKGxsNFsoaSkgPj4gMV0gJiAweDBmKSB8ICgobikgPDwgNCk7ICBcCi0gICB9Ci0KLSNkZWZpbmUgR0VUX0xMNChpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICgoKFVJbnQzMikobGw0WyhpKSA+PiAxXSkpID4+ICgoKGkpIDw8IDIpICYgMHg0KSAmIDB4RikKLQotI2RlZmluZSBTRVRfTEwoaSxuKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgeyBsbDE2W2ldID0gKFVJbnQxNikobiAmIDB4MDAwMGZmZmYpOyAgXAotICAgICBTRVRfTEw0KGksIG4gPj4gMTYpOyAgICAgICAgICAgICAgICAgXAotICAgfQotCi0jZGVmaW5lIEdFVF9MTChpKSBcCi0gICAoKChVSW50MzIpbGwxNltpXSkgfCAoR0VUX0xMNChpKSA8PCAxNikpCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLQotICBNYW5hZ2UgbWVtb3J5IGZvciBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgotICBXaGVuIGNvbXByZXNzaW5nLCBhIHNpbmdsZSBibG9jayBzaXplIGFwcGxpZXMgdG8KLSAgYWxsIGZpbGVzIHByb2Nlc3NlZCwgYW5kIHRoYXQncyBzZXQgd2hlbiB0aGUKLSAgcHJvZ3JhbSBzdGFydHMuICBCdXQgd2hlbiBkZWNvbXByZXNzaW5nLCBlYWNoIGZpbGUKLSAgcHJvY2Vzc2VkIGNvdWxkIGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggYQotICBkaWZmZXJlbnQgYmxvY2sgc2l6ZSwgc28gd2UgbWF5IGhhdmUgdG8gZnJlZQotICBhbmQgcmVhbGxvY2F0ZSBvbiBhIHBlci1maWxlIGJhc2lzLgotCi0gIEEgY2FsbCB3aXRoIGFyZ3VtZW50IG9mIHplcm8gbWVhbnMKLSAgYGZyZWUgdXAgZXZlcnl0aGluZy4nICBBbmQgYSB2YWx1ZSBvZiB6ZXJvIGZvcgotICBibG9ja1NpemUxMDBrIG1lYW5zIG5vIG1lbW9yeSBpcyBjdXJyZW50bHkgYWxsb2NhdGVkLgotLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgYWxsb2NhdGVDb21wcmVzc1N0cnVjdHVyZXMgKCB2b2lkICkKLXsKLSAgIEludDMyIG4gID0gMTAwMDAwICogYmxvY2tTaXplMTAwazsKLSAgIGJsb2NrICAgID0gbWFsbG9jICggKG4gKyAxICsgTlVNX09WRVJTSE9PVF9CWVRFUykgKiBzaXplb2YoVUNoYXIpICk7Ci0gICBxdWFkcmFudCA9IG1hbGxvYyAoIChuICAgICArIE5VTV9PVkVSU0hPT1RfQllURVMpICogc2l6ZW9mKEludDE2KSApOwotICAgenB0ciAgICAgPSBtYWxsb2MgKCBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihJbnQzMikgKTsKLSAgIGZ0YWIgICAgID0gbWFsbG9jICggNjU1MzcgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoSW50MzIpICk7Ci0KLSAgIGlmIChibG9jayA9PSBOVUxMIHx8IHF1YWRyYW50ID09IE5VTEwgfHwKLSAgICAgICB6cHRyID09IE5VTEwgIHx8IGZ0YWIgPT0gTlVMTCkgewotICAgICAgSW50MzIgdG90YWxEcmF3Ci0gICAgICAgICA9IChuICsgMSArIE5VTV9PVkVSU0hPT1RfQllURVMpICogc2l6ZW9mKFVDaGFyKSArCi0gICAgICAgICAgIChuICAgICArIE5VTV9PVkVSU0hPT1RfQllURVMpICogc2l6ZW9mKEludDE2KSArCi0gICAgICAgICAgIG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKEludDMyKSArCi0gICAgICAgICAgIDY1NTM3ICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKEludDMyKTsKLQotICAgICAgY29tcHJlc3NPdXRPZk1lbW9yeSAoIHRvdGFsRHJhdywgbiApOwotICAgfQotCi0gICAvKi0tCi0gICAgICBTaW5jZSB3ZSB3YW50IHZhbGlkIGluZGV4ZXMgZm9yIGJsb2NrIG9mCi0gICAgICAtMSB0byBuICsgTlVNX09WRVJTSE9PVF9CWVRFUyAtIDEKLSAgICAgIGluY2x1c2l2ZS4KLSAgIC0tKi8KLSAgIGJsb2NrKys7Ci0KLSAgIC8qLS0KLSAgICAgIFRoZSBiYWNrIGVuZCBuZWVkcyBhIHBsYWNlIHRvIHN0b3JlIHRoZSBNVEYgdmFsdWVzCi0gICAgICB3aGlsc3QgaXQgY2FsY3VsYXRlcyB0aGUgY29kaW5nIHRhYmxlcy4gIFdlIGNvdWxkCi0gICAgICBwdXQgdGhlbSBpbiB0aGUgenB0ciBhcnJheS4gIEhvd2V2ZXIsIHRoZXNlIHZhbHVlcwotICAgICAgd2lsbCBmaXQgaW4gYSBzaG9ydCwgc28gd2Ugb3ZlcmxheSBzenB0ciBhdCB0aGUgCi0gICAgICBzdGFydCBvZiB6cHRyLCBpbiB0aGUgaG9wZSBvZiByZWR1Y2luZyB0aGUgbnVtYmVyCi0gICAgICBvZiBjYWNoZSBtaXNzZXMgaW5kdWNlZCBieSB0aGUgbXVsdGlwbGUgdHJhdmVyc2FscwotICAgICAgb2YgdGhlIE1URiB2YWx1ZXMgd2hlbiBjYWxjdWxhdGluZyBjb2RpbmcgdGFibGVzLgotICAgICAgU2VlbXMgdG8gaW1wcm92ZSBjb21wcmVzc2lvbiBzcGVlZCBieSBhYm91dCAxJS4KLSAgIC0tKi8KLSAgIHN6cHRyID0gKFVJbnQxNiopenB0cjsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHNldERlY29tcHJlc3NTdHJ1Y3R1cmVTaXplcyAoIEludDMyIG5ld1NpemUxMDBrICkKLXsKLSAgIGlmICghICgwIDw9IG5ld1NpemUxMDBrICAgJiYgbmV3U2l6ZTEwMGsgICA8PSA5ICYmCi0gICAgICAgICAgMCA8PSBibG9ja1NpemUxMDBrICYmIGJsb2NrU2l6ZTEwMGsgPD0gOSkpCi0gICAgICBwYW5pYyAoICJzZXREZWNvbXByZXNzU3RydWN0dXJlU2l6ZXMiICk7Ci0KLSAgIGlmIChuZXdTaXplMTAwayA9PSBibG9ja1NpemUxMDBrKSByZXR1cm47Ci0KLSAgIGJsb2NrU2l6ZTEwMGsgPSBuZXdTaXplMTAwazsKLQotICAgaWYgKGxsMTYgICE9IE5VTEwpIGZyZWUgKCBsbDE2ICApOwotICAgaWYgKGxsNCAgICE9IE5VTEwpIGZyZWUgKCBsbDQgICApOwotICAgaWYgKGxsOCAgICE9IE5VTEwpIGZyZWUgKCBsbDggICApOwotICAgaWYgKHR0ICAgICE9IE5VTEwpIGZyZWUgKCB0dCAgICApOwotCi0gICBpZiAobmV3U2l6ZTEwMGsgPT0gMCkgcmV0dXJuOwotCi0gICBpZiAoc21hbGxNb2RlKSB7Ci0KLSAgICAgIEludDMyIG4gPSAxMDAwMDAgKiBuZXdTaXplMTAwazsKLSAgICAgIGxsMTYgICAgPSBtYWxsb2MgKCBuICogc2l6ZW9mKFVJbnQxNikgKTsKLSAgICAgIGxsNCAgICAgPSBtYWxsb2MgKCAoKG4rMSkgPj4gMSkgKiBzaXplb2YoVUNoYXIpICk7Ci0KLSAgICAgIGlmIChsbDQgPT0gTlVMTCB8fCBsbDE2ID09IE5VTEwpIHsKLSAgICAgICAgIEludDMyIHRvdGFsRHJhdwotICAgICAgICAgICAgPSBuICogc2l6ZW9mKEludDE2KSArICgobisxKSA+PiAxKSAqIHNpemVvZihVQ2hhcik7Ci0gICAgICAgICB1bmNvbXByZXNzT3V0T2ZNZW1vcnkgKCB0b3RhbERyYXcsIG4gKTsKLSAgICAgIH0KLQotICAgfSBlbHNlIHsKLQotICAgICAgSW50MzIgbiA9IDEwMDAwMCAqIG5ld1NpemUxMDBrOwotICAgICAgbGw4ICAgICA9IG1hbGxvYyAoIG4gKiBzaXplb2YoVUNoYXIpICk7Ci0gICAgICB0dCAgICAgID0gbWFsbG9jICggbiAqIHNpemVvZihJbnQzMikgKTsKLQotICAgICAgaWYgKGxsOCA9PSBOVUxMIHx8IHR0ID09IE5VTEwpIHsKLSAgICAgICAgIEludDMyIHRvdGFsRHJhdwotICAgICAgICAgICAgPSBuICogc2l6ZW9mKFVDaGFyKSArIG4gKiBzaXplb2YoVUludDMyKTsKLSAgICAgICAgIHVuY29tcHJlc3NPdXRPZk1lbW9yeSAoIHRvdGFsRHJhdywgbiApOwotICAgICAgfQotCi0gICB9Ci19Ci0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLSBUaGUgbmV3IGJhY2sgZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgbWFrZU1hcHMgKCB2b2lkICkKLXsKLSAgIEludDMyIGk7Ci0gICBuSW5Vc2UgPSAwOwotICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgaWYgKGluVXNlW2ldKSB7Ci0gICAgICAgICBzZXFUb1Vuc2VxW25JblVzZV0gPSBpOwotICAgICAgICAgdW5zZXFUb1NlcVtpXSA9IG5JblVzZTsKLSAgICAgICAgIG5JblVzZSsrOwotICAgICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgZ2VuZXJhdGVNVEZWYWx1ZXMgKCB2b2lkICkKLXsKLSAgIFVDaGFyICB5eVsyNTZdOwotICAgSW50MzIgIGksIGo7Ci0gICBVQ2hhciAgdG1wOwotICAgVUNoYXIgIHRtcDI7Ci0gICBJbnQzMiAgelBlbmQ7Ci0gICBJbnQzMiAgd3I7Ci0gICBJbnQzMiAgRU9COwotCi0gICBtYWtlTWFwcygpOwotICAgRU9CID0gbkluVXNlKzE7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPD0gRU9COyBpKyspIG10ZkZyZXFbaV0gPSAwOwotCi0gICB3ciA9IDA7Ci0gICB6UGVuZCA9IDA7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbkluVXNlOyBpKyspIHl5W2ldID0gKFVDaGFyKSBpOwotICAgCi0KLSAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7Ci0gICAgICBVQ2hhciBsbF9pOwotCi0gICAgICAjaWYgREVCVUcKLSAgICAgICAgIGFzc2VydCAod3IgPD0gaSk7Ci0gICAgICAjZW5kaWYKLQotICAgICAgbGxfaSA9IHVuc2VxVG9TZXFbYmxvY2tbenB0cltpXSAtIDFdXTsKLSAgICAgICNpZiBERUJVRwotICAgICAgICAgYXNzZXJ0IChsbF9pIDwgbkluVXNlKTsKLSAgICAgICNlbmRpZgotCi0gICAgICBqID0gMDsKLSAgICAgIHRtcCA9IHl5W2pdOwotICAgICAgd2hpbGUgKCBsbF9pICE9IHRtcCApIHsKLSAgICAgICAgIGorKzsKLSAgICAgICAgIHRtcDIgPSB0bXA7Ci0gICAgICAgICB0bXAgPSB5eVtqXTsKLSAgICAgICAgIHl5W2pdID0gdG1wMjsKLSAgICAgIH07Ci0gICAgICB5eVswXSA9IHRtcDsKLQotICAgICAgaWYgKGogPT0gMCkgewotICAgICAgICAgelBlbmQrKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBpZiAoelBlbmQgPiAwKSB7Ci0gICAgICAgICAgICB6UGVuZC0tOwotICAgICAgICAgICAgd2hpbGUgKFRydWUpIHsKLSAgICAgICAgICAgICAgIHN3aXRjaCAoelBlbmQgJSAyKSB7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDA6IHN6cHRyW3dyXSA9IFJVTkE7IHdyKys7IG10ZkZyZXFbUlVOQV0rKzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBjYXNlIDE6IHN6cHRyW3dyXSA9IFJVTkI7IHdyKys7IG10ZkZyZXFbUlVOQl0rKzsgYnJlYWs7Ci0gICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgaWYgKHpQZW5kIDwgMikgYnJlYWs7Ci0gICAgICAgICAgICAgICB6UGVuZCA9ICh6UGVuZCAtIDIpIC8gMjsKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB6UGVuZCA9IDA7Ci0gICAgICAgICB9Ci0gICAgICAgICBzenB0clt3cl0gPSBqKzE7IHdyKys7IG10ZkZyZXFbaisxXSsrOwotICAgICAgfQotICAgfQotCi0gICBpZiAoelBlbmQgPiAwKSB7Ci0gICAgICB6UGVuZC0tOwotICAgICAgd2hpbGUgKFRydWUpIHsKLSAgICAgICAgIHN3aXRjaCAoelBlbmQgJSAyKSB7Ci0gICAgICAgICAgICBjYXNlIDA6ICBzenB0clt3cl0gPSBSVU5BOyB3cisrOyBtdGZGcmVxW1JVTkFdKys7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgc3pwdHJbd3JdID0gUlVOQjsgd3IrKzsgbXRmRnJlcVtSVU5CXSsrOyBicmVhazsKLSAgICAgICAgIH07Ci0gICAgICAgICBpZiAoelBlbmQgPCAyKSBicmVhazsKLSAgICAgICAgIHpQZW5kID0gKHpQZW5kIC0gMikgLyAyOwotICAgICAgfTsKLSAgIH0KLQotICAgc3pwdHJbd3JdID0gRU9COyB3cisrOyBtdGZGcmVxW0VPQl0rKzsKLQotICAgbk1URiA9IHdyOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgTEVTU0VSX0lDT1NUICAwCi0jZGVmaW5lIEdSRUFURVJfSUNPU1QgMTUKLQotdm9pZCBzZW5kTVRGVmFsdWVzICggdm9pZCApCi17Ci0gICBJbnQzMiB2LCB0LCBpLCBqLCBncywgZ2UsIHRvdGMsIGJ0LCBiYywgaXRlcjsKLSAgIEludDMyIG5TZWxlY3RvcnMsIGFscGhhU2l6ZSwgbWluTGVuLCBtYXhMZW4sIHNlbEN0cjsKLSAgIEludDMyIG5Hcm91cHMsIG5CeXRlczsKLQotICAgLyotLQotICAgVUNoYXIgIGxlbiBbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKLSAgIGlzIGEgZ2xvYmFsIHNpbmNlIHRoZSBkZWNvZGVyIGFsc28gbmVlZHMgaXQuCi0KLSAgIEludDMyICBjb2RlW05fR1JPVVBTXVtNQVhfQUxQSEFfU0laRV07Ci0gICBJbnQzMiAgcmZyZXFbTl9HUk9VUFNdW01BWF9BTFBIQV9TSVpFXTsKLSAgIGFyZSBhbHNvIGdsb2JhbHMgb25seSB1c2VkIGluIHRoaXMgcHJvYy4KLSAgIE1hZGUgZ2xvYmFsIHRvIGtlZXAgc3RhY2sgZnJhbWUgc2l6ZSBzbWFsbC4KLSAgIC0tKi8KLQotCi0gICBVSW50MTYgY29zdFtOX0dST1VQU107Ci0gICBJbnQzMiAgZmF2ZVtOX0dST1VQU107Ci0KLSAgIGlmICh2ZXJib3NpdHkgPj0gMykKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsIAotICAgICAgICAgICAgICAgICIgICAgICAlZCBpbiBibG9jaywgJWQgYWZ0ZXIgTVRGICYgMS0yIGNvZGluZywgJWQrMiBzeW1zIGluIHVzZVxuIiwgCi0gICAgICAgICAgICAgICAgbGFzdCsxLCBuTVRGLCBuSW5Vc2UgKTsKLQotICAgYWxwaGFTaXplID0gbkluVXNlKzI7Ci0gICBmb3IgKHQgPSAwOyB0IDwgTl9HUk9VUFM7IHQrKykKLSAgICAgIGZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKLSAgICAgICAgIGxlblt0XVt2XSA9IEdSRUFURVJfSUNPU1Q7Ci0KLSAgIC8qLS0tIERlY2lkZSBob3cgbWFueSBjb2RpbmcgdGFibGVzIHRvIHVzZSAtLS0qLwotICAgaWYgKG5NVEYgPD0gMCkgcGFuaWMgKCAic2VuZE1URlZhbHVlcygwKSIgKTsKLSAgIGlmIChuTVRGIDwgMjAwKSBuR3JvdXBzID0gMjsgZWxzZQotICAgaWYgKG5NVEYgPCA4MDApIG5Hcm91cHMgPSA0OyBlbHNlCi0gICAgICAgICAgICAgICAgICAgbkdyb3VwcyA9IDY7Ci0KLSAgIC8qLS0tIEdlbmVyYXRlIGFuIGluaXRpYWwgc2V0IG9mIGNvZGluZyB0YWJsZXMgLS0tKi8KLSAgIHsgCi0gICAgICBJbnQzMiBuUGFydCwgcmVtRiwgdEZyZXEsIGFGcmVxOwotCi0gICAgICBuUGFydCA9IG5Hcm91cHM7Ci0gICAgICByZW1GICA9IG5NVEY7Ci0gICAgICBncyA9IDA7Ci0gICAgICB3aGlsZSAoblBhcnQgPiAwKSB7Ci0gICAgICAgICB0RnJlcSA9IHJlbUYgLyBuUGFydDsKLSAgICAgICAgIGdlID0gZ3MtMTsKLSAgICAgICAgIGFGcmVxID0gMDsKLSAgICAgICAgIHdoaWxlIChhRnJlcSA8IHRGcmVxICYmIGdlIDwgYWxwaGFTaXplLTEpIHsKLSAgICAgICAgICAgIGdlKys7Ci0gICAgICAgICAgICBhRnJlcSArPSBtdGZGcmVxW2dlXTsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKGdlID4gZ3MgCi0gICAgICAgICAgICAgJiYgblBhcnQgIT0gbkdyb3VwcyAmJiBuUGFydCAhPSAxIAotICAgICAgICAgICAgICYmICgobkdyb3Vwcy1uUGFydCkgJSAyID09IDEpKSB7Ci0gICAgICAgICAgICBhRnJlcSAtPSBtdGZGcmVxW2dlXTsKLSAgICAgICAgICAgIGdlLS07Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmICh2ZXJib3NpdHkgPj0gMykKLSAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsIAotICAgICAgICAgICAgICAgICAgICAgICIgICAgICBpbml0aWFsIGdyb3VwICVkLCBbJWQgLi4gJWRdLCBoYXMgJWQgc3ltcyAoJTQuMWYlJSlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUGFydCwgZ3MsIGdlLCBhRnJlcSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwLjAgKiAoZmxvYXQpYUZyZXEpIC8gKGZsb2F0KW5NVEYgKTsKLSAKLSAgICAgICAgIGZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKLSAgICAgICAgICAgIGlmICh2ID49IGdzICYmIHYgPD0gZ2UpIAotICAgICAgICAgICAgICAgbGVuW25QYXJ0LTFdW3ZdID0gTEVTU0VSX0lDT1NUOyBlbHNlCi0gICAgICAgICAgICAgICBsZW5bblBhcnQtMV1bdl0gPSBHUkVBVEVSX0lDT1NUOwotIAotICAgICAgICAgblBhcnQtLTsKLSAgICAgICAgIGdzID0gZ2UrMTsKLSAgICAgICAgIHJlbUYgLT0gYUZyZXE7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qLS0tIAotICAgICAgSXRlcmF0ZSB1cCB0byBOX0lURVJTIHRpbWVzIHRvIGltcHJvdmUgdGhlIHRhYmxlcy4KLSAgIC0tLSovCi0gICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgTl9JVEVSUzsgaXRlcisrKSB7Ci0KLSAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIGZhdmVbdF0gPSAwOwotCi0gICAgICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQotICAgICAgICAgZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKQotICAgICAgICAgICAgcmZyZXFbdF1bdl0gPSAwOwotCi0gICAgICBuU2VsZWN0b3JzID0gMDsKLSAgICAgIHRvdGMgPSAwOwotICAgICAgZ3MgPSAwOwotICAgICAgd2hpbGUgKFRydWUpIHsKLQotICAgICAgICAgLyotLS0gU2V0IGdyb3VwIHN0YXJ0ICYgZW5kIG1hcmtzLiAtLSovCi0gICAgICAgICBpZiAoZ3MgPj0gbk1URikgYnJlYWs7Ci0gICAgICAgICBnZSA9IGdzICsgR19TSVpFIC0gMTsgCi0gICAgICAgICBpZiAoZ2UgPj0gbk1URikgZ2UgPSBuTVRGLTE7Ci0KLSAgICAgICAgIC8qLS0gCi0gICAgICAgICAgICBDYWxjdWxhdGUgdGhlIGNvc3Qgb2YgdGhpcyBncm91cCBhcyBjb2RlZAotICAgICAgICAgICAgYnkgZWFjaCBvZiB0aGUgY29kaW5nIHRhYmxlcy4KLSAgICAgICAgIC0tKi8KLSAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIGNvc3RbdF0gPSAwOwotCi0gICAgICAgICBpZiAobkdyb3VwcyA9PSA2KSB7Ci0gICAgICAgICAgICByZWdpc3RlciBVSW50MTYgY29zdDAsIGNvc3QxLCBjb3N0MiwgY29zdDMsIGNvc3Q0LCBjb3N0NTsKLSAgICAgICAgICAgIGNvc3QwID0gY29zdDEgPSBjb3N0MiA9IGNvc3QzID0gY29zdDQgPSBjb3N0NSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7IAotICAgICAgICAgICAgICAgVUludDE2IGljdiA9IHN6cHRyW2ldOwotICAgICAgICAgICAgICAgY29zdDAgKz0gbGVuWzBdW2ljdl07Ci0gICAgICAgICAgICAgICBjb3N0MSArPSBsZW5bMV1baWN2XTsKLSAgICAgICAgICAgICAgIGNvc3QyICs9IGxlblsyXVtpY3ZdOwotICAgICAgICAgICAgICAgY29zdDMgKz0gbGVuWzNdW2ljdl07Ci0gICAgICAgICAgICAgICBjb3N0NCArPSBsZW5bNF1baWN2XTsKLSAgICAgICAgICAgICAgIGNvc3Q1ICs9IGxlbls1XVtpY3ZdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29zdFswXSA9IGNvc3QwOyBjb3N0WzFdID0gY29zdDE7IGNvc3RbMl0gPSBjb3N0MjsKLSAgICAgICAgICAgIGNvc3RbM10gPSBjb3N0MzsgY29zdFs0XSA9IGNvc3Q0OyBjb3N0WzVdID0gY29zdDU7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpID0gZ3M7IGkgPD0gZ2U7IGkrKykgeyAKLSAgICAgICAgICAgICAgIFVJbnQxNiBpY3YgPSBzenB0cltpXTsKLSAgICAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIGNvc3RbdF0gKz0gbGVuW3RdW2ljdl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gCi0gICAgICAgICAvKi0tIAotICAgICAgICAgICAgRmluZCB0aGUgY29kaW5nIHRhYmxlIHdoaWNoIGlzIGJlc3QgZm9yIHRoaXMgZ3JvdXAsCi0gICAgICAgICAgICBhbmQgcmVjb3JkIGl0cyBpZGVudGl0eSBpbiB0aGUgc2VsZWN0b3IgdGFibGUuCi0gICAgICAgICAtLSovCi0gICAgICAgICBiYyA9IDk5OTk5OTk5OTsgYnQgPSAtMTsKLSAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCi0gICAgICAgICAgICBpZiAoY29zdFt0XSA8IGJjKSB7IGJjID0gY29zdFt0XTsgYnQgPSB0OyB9OwotICAgICAgICAgdG90YyArPSBiYzsKLSAgICAgICAgIGZhdmVbYnRdKys7Ci0gICAgICAgICBzZWxlY3RvcltuU2VsZWN0b3JzXSA9IGJ0OwotICAgICAgICAgblNlbGVjdG9ycysrOwotCi0gICAgICAgICAvKi0tIAotICAgICAgICAgICAgSW5jcmVtZW50IHRoZSBzeW1ib2wgZnJlcXVlbmNpZXMgZm9yIHRoZSBzZWxlY3RlZCB0YWJsZS4KLSAgICAgICAgICAtLSovCi0gICAgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKQotICAgICAgICAgICAgcmZyZXFbYnRdWyBzenB0cltpXSBdKys7Ci0KLSAgICAgICAgIGdzID0gZ2UrMTsKLSAgICAgIH0KLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMykgewotICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgCi0gICAgICAgICAgICAgICAgICAgIiAgICAgIHBhc3MgJWQ6IHNpemUgaXMgJWQsIGdycCB1c2VzIGFyZSAiLCAKLSAgICAgICAgICAgICAgICAgICBpdGVyKzEsIHRvdGMvOCApOwotICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKLSAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlZCAiLCBmYXZlW3RdICk7Ci0gICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiXG4iICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qLS0KLSAgICAgICAgUmVjb21wdXRlIHRoZSB0YWJsZXMgYmFzZWQgb24gdGhlIGFjY3VtdWxhdGVkIGZyZXF1ZW5jaWVzLgotICAgICAgLS0qLwotICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKLSAgICAgICAgIGhiTWFrZUNvZGVMZW5ndGhzICggJmxlblt0XVswXSwgJnJmcmVxW3RdWzBdLCBhbHBoYVNpemUsIDIwICk7Ci0gICB9Ci0KLQotICAgaWYgKCEobkdyb3VwcyA8IDgpKSBwYW5pYyAoICJzZW5kTVRGVmFsdWVzKDEpIiApOwotICAgaWYgKCEoblNlbGVjdG9ycyA8IDMyNzY4ICYmCi0gICAgICAgICBuU2VsZWN0b3JzIDw9ICgyICsgKDkwMDAwMCAvIEdfU0laRSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMgKCAic2VuZE1URlZhbHVlcygyKSIgKTsKLQotCi0gICAvKi0tLSBDb21wdXRlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuIC0tLSovCi0gICB7Ci0gICAgICBVQ2hhciBwb3NbTl9HUk9VUFNdLCBsbF9pLCB0bXAyLCB0bXA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbkdyb3VwczsgaSsrKSBwb3NbaV0gPSBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgewotICAgICAgICAgbGxfaSA9IHNlbGVjdG9yW2ldOwotICAgICAgICAgaiA9IDA7Ci0gICAgICAgICB0bXAgPSBwb3Nbal07Ci0gICAgICAgICB3aGlsZSAoIGxsX2kgIT0gdG1wICkgewotICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgdG1wMiA9IHRtcDsKLSAgICAgICAgICAgIHRtcCA9IHBvc1tqXTsKLSAgICAgICAgICAgIHBvc1tqXSA9IHRtcDI7Ci0gICAgICAgICB9OwotICAgICAgICAgcG9zWzBdID0gdG1wOwotICAgICAgICAgc2VsZWN0b3JNdGZbaV0gPSBqOwotICAgICAgfQotICAgfTsKLQotICAgLyotLS0gQXNzaWduIGFjdHVhbCBjb2RlcyBmb3IgdGhlIHRhYmxlcy4gLS0qLwotICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgewotICAgICAgbWluTGVuID0gMzI7Ci0gICAgICBtYXhMZW4gPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7Ci0gICAgICAgICBpZiAobGVuW3RdW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBsZW5bdF1baV07Ci0gICAgICAgICBpZiAobGVuW3RdW2ldIDwgbWluTGVuKSBtaW5MZW4gPSBsZW5bdF1baV07Ci0gICAgICB9Ci0gICAgICBpZiAobWF4TGVuID4gMjApIHBhbmljICggInNlbmRNVEZWYWx1ZXMoMykiICk7Ci0gICAgICBpZiAobWluTGVuIDwgMSkgIHBhbmljICggInNlbmRNVEZWYWx1ZXMoNCkiICk7Ci0gICAgICBoYkFzc2lnbkNvZGVzICggJmNvZGVbdF1bMF0sICZsZW5bdF1bMF0sIAotICAgICAgICAgICAgICAgICAgICAgIG1pbkxlbiwgbWF4TGVuLCBhbHBoYVNpemUgKTsKLSAgIH0KLQotICAgLyotLS0gVHJhbnNtaXQgdGhlIG1hcHBpbmcgdGFibGUuIC0tLSovCi0gICB7IAotICAgICAgQm9vbCBpblVzZTE2WzE2XTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgICAgaW5Vc2UxNltpXSA9IEZhbHNlOwotICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICAgICAgIGlmIChpblVzZVtpICogMTYgKyBqXSkgaW5Vc2UxNltpXSA9IFRydWU7Ci0gICAgICB9Ci0gICAgIAotICAgICAgbkJ5dGVzID0gYnl0ZXNPdXQ7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICAgICAgIGlmIChpblVzZTE2W2ldKSBic1coMSwxKTsgZWxzZSBic1coMSwwKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICBpZiAoaW5Vc2UxNltpXSkKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICAgICAgICAgaWYgKGluVXNlW2kgKiAxNiArIGpdKSBic1coMSwxKTsgZWxzZSBic1coMSwwKTsKLQotICAgICAgaWYgKHZlcmJvc2l0eSA+PSAzKSAKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgICBieXRlczogbWFwcGluZyAlZCwgIiwgYnl0ZXNPdXQtbkJ5dGVzICk7Ci0gICB9Ci0KLSAgIC8qLS0tIE5vdyB0aGUgc2VsZWN0b3JzLiAtLS0qLwotICAgbkJ5dGVzID0gYnl0ZXNPdXQ7Ci0gICBic1cgKCAzLCBuR3JvdXBzICk7Ci0gICBic1cgKCAxNSwgblNlbGVjdG9ycyApOwotICAgZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeyAKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzZWxlY3Rvck10ZltpXTsgaisrKSBic1coMSwxKTsKLSAgICAgIGJzVygxLDApOwotICAgfQotICAgaWYgKHZlcmJvc2l0eSA+PSAzKQotICAgICAgZnByaW50ZiAoIHN0ZGVyciwgInNlbGVjdG9ycyAlZCwgIiwgYnl0ZXNPdXQtbkJ5dGVzICk7Ci0KLSAgIC8qLS0tIE5vdyB0aGUgY29kaW5nIHRhYmxlcy4gLS0tKi8KLSAgIG5CeXRlcyA9IGJ5dGVzT3V0OwotCi0gICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7Ci0gICAgICBJbnQzMiBjdXJyID0gbGVuW3RdWzBdOwotICAgICAgYnNXICggNSwgY3VyciApOwotICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7Ci0gICAgICAgICB3aGlsZSAoY3VyciA8IGxlblt0XVtpXSkgeyBic1coMiwyKTsgY3VycisrOyAvKiAxMCAqLyB9OwotICAgICAgICAgd2hpbGUgKGN1cnIgPiBsZW5bdF1baV0pIHsgYnNXKDIsMyk7IGN1cnItLTsgLyogMTEgKi8gfTsKLSAgICAgICAgIGJzVyAoIDEsIDAgKTsKLSAgICAgIH0KLSAgIH0KLQotICAgaWYgKHZlcmJvc2l0eSA+PSAzKQotICAgICAgZnByaW50ZiAoIHN0ZGVyciwgImNvZGUgbGVuZ3RocyAlZCwgIiwgYnl0ZXNPdXQtbkJ5dGVzICk7Ci0KLSAgIC8qLS0tIEFuZCBmaW5hbGx5LCB0aGUgYmxvY2sgZGF0YSBwcm9wZXIgLS0tKi8KLSAgIG5CeXRlcyA9IGJ5dGVzT3V0OwotICAgc2VsQ3RyID0gMDsKLSAgIGdzID0gMDsKLSAgIHdoaWxlIChUcnVlKSB7Ci0gICAgICBpZiAoZ3MgPj0gbk1URikgYnJlYWs7Ci0gICAgICBnZSA9IGdzICsgR19TSVpFIC0gMTsgCi0gICAgICBpZiAoZ2UgPj0gbk1URikgZ2UgPSBuTVRGLTE7Ci0gICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7IAotICAgICAgICAgI2lmIERFQlVHCi0gICAgICAgICAgICBhc3NlcnQgKHNlbGVjdG9yW3NlbEN0cl0gPCBuR3JvdXBzKTsKLSAgICAgICAgICNlbmRpZgotICAgICAgICAgYnNXICggbGVuICBbc2VsZWN0b3Jbc2VsQ3RyXV0gW3N6cHRyW2ldXSwKLSAgICAgICAgICAgICAgIGNvZGUgW3NlbGVjdG9yW3NlbEN0cl1dIFtzenB0cltpXV0gKTsKLSAgICAgIH0KLQotICAgICAgZ3MgPSBnZSsxOwotICAgICAgc2VsQ3RyKys7Ci0gICB9Ci0gICBpZiAoIShzZWxDdHIgPT0gblNlbGVjdG9ycykpIHBhbmljICggInNlbmRNVEZWYWx1ZXMoNSkiICk7Ci0KLSAgIGlmICh2ZXJib3NpdHkgPj0gMykKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsICJjb2RlcyAlZFxuIiwgYnl0ZXNPdXQtbkJ5dGVzICk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBtb3ZlVG9Gcm9udENvZGVBbmRTZW5kICggdm9pZCApCi17Ci0gICBic1B1dEludFZTICggMjQsIG9yaWdQdHIgKTsKLSAgIGdlbmVyYXRlTVRGVmFsdWVzKCk7Ci0gICBzZW5kTVRGVmFsdWVzKCk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCByZWN2RGVjb2RpbmdUYWJsZXMgKCB2b2lkICkKLXsKLSAgIEludDMyIGksIGosIHQsIG5Hcm91cHMsIG5TZWxlY3RvcnMsIGFscGhhU2l6ZTsKLSAgIEludDMyIG1pbkxlbiwgbWF4TGVuOwotICAgQm9vbCBpblVzZTE2WzE2XTsKLQotICAgLyotLS0gUmVjZWl2ZSB0aGUgbWFwcGluZyB0YWJsZSAtLS0qLwotICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICBpZiAoYnNSKDEpID09IDEpIAotICAgICAgICAgaW5Vc2UxNltpXSA9IFRydWU7IGVsc2UgCi0gICAgICAgICBpblVzZTE2W2ldID0gRmFsc2U7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgaW5Vc2VbaV0gPSBGYWxzZTsKLQotICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICBpZiAoaW5Vc2UxNltpXSkKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotICAgICAgICAgICAgaWYgKGJzUigxKSA9PSAxKSBpblVzZVtpICogMTYgKyBqXSA9IFRydWU7Ci0KLSAgIG1ha2VNYXBzKCk7Ci0gICBhbHBoYVNpemUgPSBuSW5Vc2UrMjsKLQotICAgLyotLS0gTm93IHRoZSBzZWxlY3RvcnMgLS0tKi8KLSAgIG5Hcm91cHMgPSBic1IgKCAzICk7Ci0gICBuU2VsZWN0b3JzID0gYnNSICggMTUgKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKLSAgICAgIGogPSAwOwotICAgICAgd2hpbGUgKGJzUigxKSA9PSAxKSBqKys7Ci0gICAgICBzZWxlY3Rvck10ZltpXSA9IGo7Ci0gICB9Ci0KLSAgIC8qLS0tIFVuZG8gdGhlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuIC0tLSovCi0gICB7Ci0gICAgICBVQ2hhciBwb3NbTl9HUk9VUFNdLCB0bXAsIHY7Ci0gICAgICBmb3IgKHYgPSAwOyB2IDwgbkdyb3VwczsgdisrKSBwb3Nbdl0gPSB2OwotICAgCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7Ci0gICAgICAgICB2ID0gc2VsZWN0b3JNdGZbaV07Ci0gICAgICAgICB0bXAgPSBwb3Nbdl07Ci0gICAgICAgICB3aGlsZSAodiA+IDApIHsgcG9zW3ZdID0gcG9zW3YtMV07IHYtLTsgfQotICAgICAgICAgcG9zWzBdID0gdG1wOwotICAgICAgICAgc2VsZWN0b3JbaV0gPSB0bXA7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qLS0tIE5vdyB0aGUgY29kaW5nIHRhYmxlcyAtLS0qLwotICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgewotICAgICAgSW50MzIgY3VyciA9IGJzUiAoIDUgKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgewotICAgICAgICAgd2hpbGUgKGJzUigxKSA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAoYnNSKDEpID09IDApIGN1cnIrKzsgZWxzZSBjdXJyLS07Ci0gICAgICAgICB9Ci0gICAgICAgICBsZW5bdF1baV0gPSBjdXJyOwotICAgICAgfQotICAgfQotCi0gICAvKi0tLSBDcmVhdGUgdGhlIEh1ZmZtYW4gZGVjb2RpbmcgdGFibGVzIC0tLSovCi0gICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKSB7Ci0gICAgICBtaW5MZW4gPSAzMjsKLSAgICAgIG1heExlbiA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKLSAgICAgICAgIGlmIChsZW5bdF1baV0gPiBtYXhMZW4pIG1heExlbiA9IGxlblt0XVtpXTsKLSAgICAgICAgIGlmIChsZW5bdF1baV0gPCBtaW5MZW4pIG1pbkxlbiA9IGxlblt0XVtpXTsKLSAgICAgIH0KLSAgICAgIGhiQ3JlYXRlRGVjb2RlVGFibGVzICggCi0gICAgICAgICAmbGltaXRbdF1bMF0sICZiYXNlW3RdWzBdLCAmcGVybVt0XVswXSwgJmxlblt0XVswXSwKLSAgICAgICAgIG1pbkxlbiwgbWF4TGVuLCBhbHBoYVNpemUKLSAgICAgICk7Ci0gICAgICBtaW5MZW5zW3RdID0gbWluTGVuOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgR0VUX01URl9WQUwobHZhbCkgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIEludDMyIHp0LCB6biwgenZlYywgemo7ICAgICAgICAgICAgICAgIFwKLSAgIGlmIChncm91cFBvcyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGdyb3VwTm8rKzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGdyb3VwUG9zID0gR19TSVpFOyAgICAgICAgICAgICAgICAgIFwKLSAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGdyb3VwUG9zLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHp0ID0gc2VsZWN0b3JbZ3JvdXBOb107ICAgICAgICAgICAgICAgIFwKLSAgIHpuID0gbWluTGVuc1t6dF07ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHp2ZWMgPSBic1IgKCB6biApOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHdoaWxlICh6dmVjID4gbGltaXRbenRdW3puXSkgeyAgICAgICAgIFwKLSAgICAgIHpuKys7IGJzUjEoemopOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHp2ZWMgPSAoenZlYyA8PCAxKSB8IHpqOyAgICAgICAgICAgIFwKLSAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGx2YWwgPSBwZXJtW3p0XVt6dmVjIC0gYmFzZVt6dF1bem5dXTsgIFwKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGdldEFuZE1vdmVUb0Zyb250RGVjb2RlICggdm9pZCApCi17Ci0gICBVQ2hhciAgeXlbMjU2XTsKLSAgIEludDMyICBpLCBqLCBuZXh0U3ltLCBsaW1pdExhc3Q7Ci0gICBJbnQzMiAgRU9CLCBncm91cE5vLCBncm91cFBvczsKLQotICAgbGltaXRMYXN0ID0gMTAwMDAwICogYmxvY2tTaXplMTAwazsKLSAgIG9yaWdQdHIgICA9IGJzR2V0SW50VlMgKCAyNCApOwotCi0gICByZWN2RGVjb2RpbmdUYWJsZXMoKTsKLSAgIEVPQiAgICAgID0gbkluVXNlKzE7Ci0gICBncm91cE5vICA9IC0xOwotICAgZ3JvdXBQb3MgPSAwOwotCi0gICAvKi0tCi0gICAgICBTZXR0aW5nIHVwIHRoZSB1bnpmdGFiIGVudHJpZXMgaGVyZSBpcyBub3Qgc3RyaWN0bHkKLSAgICAgIG5lY2Vzc2FyeSwgYnV0IGl0IGRvZXMgc2F2ZSBoYXZpbmcgdG8gZG8gaXQgbGF0ZXIKLSAgICAgIGluIGEgc2VwYXJhdGUgcGFzcywgYW5kIHNvIHNhdmVzIGEgYmxvY2sncyB3b3J0aCBvZgotICAgICAgY2FjaGUgbWlzc2VzLgotICAgLS0qLwotICAgZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgdW56ZnRhYltpXSA9IDA7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPD0gMjU1OyBpKyspIHl5W2ldID0gKFVDaGFyKSBpOwotCi0gICBsYXN0ID0gLTE7Ci0KLSAgIEdFVF9NVEZfVkFMKG5leHRTeW0pOwotCi0gICB3aGlsZSAoVHJ1ZSkgewotCi0gICAgICBpZiAobmV4dFN5bSA9PSBFT0IpIGJyZWFrOwotCi0gICAgICBpZiAobmV4dFN5bSA9PSBSVU5BIHx8IG5leHRTeW0gPT0gUlVOQikgewotICAgICAgICAgVUNoYXIgY2g7Ci0gICAgICAgICBJbnQzMiBzID0gLTE7Ci0gICAgICAgICBJbnQzMiBOID0gMTsKLSAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChuZXh0U3ltID09IFJVTkEpIHMgPSBzICsgKDArMSkgKiBOOyBlbHNlCi0gICAgICAgICAgICBpZiAobmV4dFN5bSA9PSBSVU5CKSBzID0gcyArICgxKzEpICogTjsKLSAgICAgICAgICAgIE4gPSBOICogMjsKLSAgICAgICAgICAgIEdFVF9NVEZfVkFMKG5leHRTeW0pOwotICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKG5leHRTeW0gPT0gUlVOQSB8fCBuZXh0U3ltID09IFJVTkIpOwotCi0gICAgICAgICBzKys7Ci0gICAgICAgICBjaCA9IHNlcVRvVW5zZXFbeXlbMF1dOwotICAgICAgICAgdW56ZnRhYltjaF0gKz0gczsKLQotICAgICAgICAgaWYgKHNtYWxsTW9kZSkKLSAgICAgICAgICAgIHdoaWxlIChzID4gMCkgewotICAgICAgICAgICAgICAgbGFzdCsrOyAKLSAgICAgICAgICAgICAgIGxsMTZbbGFzdF0gPSBjaDsKLSAgICAgICAgICAgICAgIHMtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHdoaWxlIChzID4gMCkgewotICAgICAgICAgICAgICAgbGFzdCsrOwotICAgICAgICAgICAgICAgbGw4W2xhc3RdID0gY2g7Ci0gICAgICAgICAgICAgICBzLS07Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICBpZiAobGFzdCA+PSBsaW1pdExhc3QpIGJsb2NrT3ZlcnJ1bigpOwotICAgICAgICAgY29udGludWU7Ci0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgIFVDaGFyIHRtcDsKLSAgICAgICAgIGxhc3QrKzsgaWYgKGxhc3QgPj0gbGltaXRMYXN0KSBibG9ja092ZXJydW4oKTsKLQotICAgICAgICAgdG1wID0geXlbbmV4dFN5bS0xXTsKLSAgICAgICAgIHVuemZ0YWJbc2VxVG9VbnNlcVt0bXBdXSsrOwotICAgICAgICAgaWYgKHNtYWxsTW9kZSkKLSAgICAgICAgICAgIGxsMTZbbGFzdF0gPSBzZXFUb1Vuc2VxW3RtcF07IGVsc2UKLSAgICAgICAgICAgIGxsOFtsYXN0XSAgPSBzZXFUb1Vuc2VxW3RtcF07Ci0KLSAgICAgICAgIC8qLS0KLSAgICAgICAgICAgIFRoaXMgbG9vcCBpcyBoYW1tZXJlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiwKLSAgICAgICAgICAgIGhlbmNlIHRoZSB1bnJvbGxpbmcuCi0KLSAgICAgICAgICAgIGZvciAoaiA9IG5leHRTeW0tMTsgaiA+IDA7IGotLSkgeXlbal0gPSB5eVtqLTFdOwotICAgICAgICAgLS0qLwotCi0gICAgICAgICBqID0gbmV4dFN5bS0xOwotICAgICAgICAgZm9yICg7IGogPiAzOyBqIC09IDQpIHsKLSAgICAgICAgICAgIHl5W2pdICAgPSB5eVtqLTFdOwotICAgICAgICAgICAgeXlbai0xXSA9IHl5W2otMl07Ci0gICAgICAgICAgICB5eVtqLTJdID0geXlbai0zXTsKLSAgICAgICAgICAgIHl5W2otM10gPSB5eVtqLTRdOwotICAgICAgICAgfQotICAgICAgICAgZm9yICg7IGogPiAwOyBqLS0pIHl5W2pdID0geXlbai0xXTsKLQotICAgICAgICAgeXlbMF0gPSB0bXA7Ci0gICAgICAgICBHRVRfTVRGX1ZBTChuZXh0U3ltKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIEJsb2NrLXNvcnRpbmcgbWFjaGluZXJ5ICAgICAgICAgICAgICAgICAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLQotICBDb21wYXJlIHR3byBzdHJpbmdzIGluIGJsb2NrLiAgV2UgYXNzdW1lIChzZWUKLSAgZGlzY3Vzc2lvbiBhYm92ZSkgdGhhdCBpMSBhbmQgaTIgaGF2ZSBhIG1heAotICBvZmZzZXQgb2YgMTAgb24gZW50cnksIGFuZCB0aGF0IHRoZSBmaXJzdAotICBieXRlcyBvZiBib3RoIGJsb2NrIGFuZCBxdWFkcmFudCBoYXZlIGJlZW4KLSAgY29waWVkIGludG8gdGhlICJvdmVyc2hvb3QgYXJlYSIsIGllCi0gIGludG8gdGhlIHN1YnNjcmlwdCByYW5nZQotICBbbGFzdCsxIC4uIGxhc3QrTlVNX09WRVJTSE9PVF9CWVRFU10uCi0tLSovCi1JTkxJTkUgQm9vbCBmdWxsR3RVICggSW50MzIgaTEsIEludDMyIGkyICkKLXsKLSAgIEludDMyIGs7Ci0gICBVQ2hhciBjMSwgYzI7Ci0gICBVSW50MTYgczEsIHMyOwotCi0gICAjaWYgREVCVUcKLSAgICAgIC8qLS0KLSAgICAgICAgc2hlbGxzb3J0IHNob3VsZG4ndCBhc2sgdG8gY29tcGFyZQotICAgICAgICBzb21ldGhpbmcgd2l0aCBpdHNlbGYuCi0gICAgICAtLSovCi0gICAgICBhc3NlcnQgKGkxICE9IGkyKTsKLSAgICNlbmRpZgotCi0gICBjMSA9IGJsb2NrW2kxXTsKLSAgIGMyID0gYmxvY2tbaTJdOwotICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOwotICAgaTErKzsgaTIrKzsKLQotICAgYzEgPSBibG9ja1tpMV07Ci0gICBjMiA9IGJsb2NrW2kyXTsKLSAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKLSAgIGkxKys7IGkyKys7Ci0KLSAgIGMxID0gYmxvY2tbaTFdOwotICAgYzIgPSBibG9ja1tpMl07Ci0gICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7Ci0gICBpMSsrOyBpMisrOwotCi0gICBjMSA9IGJsb2NrW2kxXTsKLSAgIGMyID0gYmxvY2tbaTJdOwotICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOwotICAgaTErKzsgaTIrKzsKLQotICAgYzEgPSBibG9ja1tpMV07Ci0gICBjMiA9IGJsb2NrW2kyXTsKLSAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKLSAgIGkxKys7IGkyKys7Ci0KLSAgIGMxID0gYmxvY2tbaTFdOwotICAgYzIgPSBibG9ja1tpMl07Ci0gICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7Ci0gICBpMSsrOyBpMisrOwotCi0gICBrID0gbGFzdCArIDE7Ci0KLSAgIGRvIHsKLQotICAgICAgYzEgPSBibG9ja1tpMV07Ci0gICAgICBjMiA9IGJsb2NrW2kyXTsKLSAgICAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKLSAgICAgIHMxID0gcXVhZHJhbnRbaTFdOwotICAgICAgczIgPSBxdWFkcmFudFtpMl07Ci0gICAgICBpZiAoczEgIT0gczIpIHJldHVybiAoczEgPiBzMik7Ci0gICAgICBpMSsrOyBpMisrOwotCi0gICAgICBjMSA9IGJsb2NrW2kxXTsKLSAgICAgIGMyID0gYmxvY2tbaTJdOwotICAgICAgaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOwotICAgICAgczEgPSBxdWFkcmFudFtpMV07Ci0gICAgICBzMiA9IHF1YWRyYW50W2kyXTsKLSAgICAgIGlmIChzMSAhPSBzMikgcmV0dXJuIChzMSA+IHMyKTsKLSAgICAgIGkxKys7IGkyKys7Ci0KLSAgICAgIGMxID0gYmxvY2tbaTFdOwotICAgICAgYzIgPSBibG9ja1tpMl07Ci0gICAgICBpZiAoYzEgIT0gYzIpIHJldHVybiAoYzEgPiBjMik7Ci0gICAgICBzMSA9IHF1YWRyYW50W2kxXTsKLSAgICAgIHMyID0gcXVhZHJhbnRbaTJdOwotICAgICAgaWYgKHMxICE9IHMyKSByZXR1cm4gKHMxID4gczIpOwotICAgICAgaTErKzsgaTIrKzsKLQotICAgICAgYzEgPSBibG9ja1tpMV07Ci0gICAgICBjMiA9IGJsb2NrW2kyXTsKLSAgICAgIGlmIChjMSAhPSBjMikgcmV0dXJuIChjMSA+IGMyKTsKLSAgICAgIHMxID0gcXVhZHJhbnRbaTFdOwotICAgICAgczIgPSBxdWFkcmFudFtpMl07Ci0gICAgICBpZiAoczEgIT0gczIpIHJldHVybiAoczEgPiBzMik7Ci0gICAgICBpMSsrOyBpMisrOwotCi0gICAgICBpZiAoaTEgPiBsYXN0KSB7IGkxIC09IGxhc3Q7IGkxLS07IH07Ci0gICAgICBpZiAoaTIgPiBsYXN0KSB7IGkyIC09IGxhc3Q7IGkyLS07IH07Ci0KLSAgICAgIGsgLT0gNDsKLSAgICAgIHdvcmtEb25lKys7Ci0gICB9Ci0gICAgICB3aGlsZSAoayA+PSAwKTsKLQotICAgcmV0dXJuIEZhbHNlOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tCi0gICBLbnV0aCdzIGluY3JlbWVudHMgc2VlbSB0byB3b3JrIGJldHRlcgotICAgdGhhbiBJbmNlcnBpLVNlZGdld2ljayBoZXJlLiAgUG9zc2libHkKLSAgIGJlY2F1c2UgdGhlIG51bWJlciBvZiBlbGVtcyB0byBzb3J0IGlzCi0gICB1c3VhbGx5IHNtYWxsLCB0eXBpY2FsbHkgPD0gMjAuCi0tLSovCi1JbnQzMiBpbmNzWzE0XSA9IHsgMSwgNCwgMTMsIDQwLCAxMjEsIDM2NCwgMTA5MywgMzI4MCwKLSAgICAgICAgICAgICAgICAgICA5ODQxLCAyOTUyNCwgODg1NzMsIDI2NTcyMCwKLSAgICAgICAgICAgICAgICAgICA3OTcxNjEsIDIzOTE0ODQgfTsKLQotdm9pZCBzaW1wbGVTb3J0ICggSW50MzIgbG8sIEludDMyIGhpLCBJbnQzMiBkICkKLXsKLSAgIEludDMyIGksIGosIGgsIGJpZ04sIGhwOwotICAgSW50MzIgdjsKLQotICAgYmlnTiA9IGhpIC0gbG8gKyAxOwotICAgaWYgKGJpZ04gPCAyKSByZXR1cm47Ci0KLSAgIGhwID0gMDsKLSAgIHdoaWxlIChpbmNzW2hwXSA8IGJpZ04pIGhwKys7Ci0gICBocC0tOwotCi0gICBmb3IgKDsgaHAgPj0gMDsgaHAtLSkgewotICAgICAgaCA9IGluY3NbaHBdOwotICAgICAgaWYgKHZlcmJvc2l0eSA+PSA1KSAKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgICAgICAgc2hlbGwgaW5jcmVtZW50ICVkXG4iLCBoICk7Ci0KLSAgICAgIGkgPSBsbyArIGg7Ci0gICAgICB3aGlsZSAoVHJ1ZSkgewotCi0gICAgICAgICAvKi0tIGNvcHkgMSAtLSovCi0gICAgICAgICBpZiAoaSA+IGhpKSBicmVhazsKLSAgICAgICAgIHYgPSB6cHRyW2ldOwotICAgICAgICAgaiA9IGk7Ci0gICAgICAgICB3aGlsZSAoIGZ1bGxHdFUgKCB6cHRyW2otaF0rZCwgditkICkgKSB7Ci0gICAgICAgICAgICB6cHRyW2pdID0genB0cltqLWhdOwotICAgICAgICAgICAgaiA9IGogLSBoOwotICAgICAgICAgICAgaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIHpwdHJbal0gPSB2OwotICAgICAgICAgaSsrOwotCi0gICAgICAgICAvKi0tIGNvcHkgMiAtLSovCi0gICAgICAgICBpZiAoaSA+IGhpKSBicmVhazsKLSAgICAgICAgIHYgPSB6cHRyW2ldOwotICAgICAgICAgaiA9IGk7Ci0gICAgICAgICB3aGlsZSAoIGZ1bGxHdFUgKCB6cHRyW2otaF0rZCwgditkICkgKSB7Ci0gICAgICAgICAgICB6cHRyW2pdID0genB0cltqLWhdOwotICAgICAgICAgICAgaiA9IGogLSBoOwotICAgICAgICAgICAgaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIHpwdHJbal0gPSB2OwotICAgICAgICAgaSsrOwotCi0gICAgICAgICAvKi0tIGNvcHkgMyAtLSovCi0gICAgICAgICBpZiAoaSA+IGhpKSBicmVhazsKLSAgICAgICAgIHYgPSB6cHRyW2ldOwotICAgICAgICAgaiA9IGk7Ci0gICAgICAgICB3aGlsZSAoIGZ1bGxHdFUgKCB6cHRyW2otaF0rZCwgditkICkgKSB7Ci0gICAgICAgICAgICB6cHRyW2pdID0genB0cltqLWhdOwotICAgICAgICAgICAgaiA9IGogLSBoOwotICAgICAgICAgICAgaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIHpwdHJbal0gPSB2OwotICAgICAgICAgaSsrOwotCi0gICAgICAgICBpZiAod29ya0RvbmUgPiB3b3JrTGltaXQgJiYgZmlyc3RBdHRlbXB0KSByZXR1cm47Ci0gICAgICB9Ci0gICB9Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLQotICAgVGhlIGZvbGxvd2luZyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZgotICAgYW4gZWxlZ2FudCAzLXdheSBxdWlja3NvcnQgZm9yIHN0cmluZ3MsCi0gICBkZXNjcmliZWQgaW4gYSBwYXBlciAiRmFzdCBBbGdvcml0aG1zIGZvcgotICAgU29ydGluZyBhbmQgU2VhcmNoaW5nIFN0cmluZ3MiLCBieSBSb2JlcnQKLSAgIFNlZGdld2ljayBhbmQgSm9uIEwuIEJlbnRsZXkuCi0tLSovCi0KLSNkZWZpbmUgc3dhcChsdjEsIGx2MikgXAotICAgeyBJbnQzMiB0bXAgPSBsdjE7IGx2MSA9IGx2MjsgbHYyID0gdG1wOyB9Ci0KLUlOTElORSB2b2lkIHZzd2FwICggSW50MzIgcDEsIEludDMyIHAyLCBJbnQzMiBuICkKLXsKLSAgIHdoaWxlIChuID4gMCkgewotICAgICAgc3dhcCh6cHRyW3AxXSwgenB0cltwMl0pOwotICAgICAgcDErKzsgcDIrKzsgbi0tOwotICAgfQotfQotCi1JTkxJTkUgVUNoYXIgbWVkMyAoIFVDaGFyIGEsIFVDaGFyIGIsIFVDaGFyIGMgKQotewotICAgVUNoYXIgdDsKLSAgIGlmIChhID4gYikgeyB0ID0gYTsgYSA9IGI7IGIgPSB0OyB9OwotICAgaWYgKGIgPiBjKSB7IHQgPSBiOyBiID0gYzsgYyA9IHQ7IH07Ci0gICBpZiAoYSA+IGIpICAgICAgICAgIGIgPSBhOwotICAgcmV0dXJuIGI7Ci19Ci0KLQotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpKSA/IChhKSA6IChiKQotCi10eXBlZGVmCi0gICBzdHJ1Y3QgeyBJbnQzMiBsbDsgSW50MzIgaGg7IEludDMyIGRkOyB9Ci0gICBTdGFja0VsZW07Ci0KLSNkZWZpbmUgcHVzaChseixoeixkeikgeyBzdGFja1tzcF0ubGwgPSBsejsgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW3NwXS5oaCA9IGh6OyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbc3BdLmRkID0gZHo7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcCsrOyB9Ci0KLSNkZWZpbmUgcG9wKGx6LGh6LGR6KSB7IHNwLS07ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgbHogPSBzdGFja1tzcF0ubGw7ICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoeiA9IHN0YWNrW3NwXS5oaDsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGR6ID0gc3RhY2tbc3BdLmRkOyB9Ci0KLSNkZWZpbmUgU01BTExfVEhSRVNIIDIwCi0jZGVmaW5lIERFUFRIX1RIUkVTSCAxMAotCi0vKi0tCi0gICBJZiB5b3UgYXJlIGV2ZXIgdW5sdWNreS9pbXByb2JhYmxlIGVub3VnaAotICAgdG8gZ2V0IGEgc3RhY2sgb3ZlcmZsb3cgd2hpbHN0IHNvcnRpbmcsCi0gICBpbmNyZWFzZSB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFuZCB0cnkKLSAgIGFnYWluLiAgSW4gcHJhY3RpY2UgSSBoYXZlIG5ldmVyIHNlZW4gdGhlCi0gICBzdGFjayBnbyBhYm92ZSAyNyBlbGVtcywgc28gdGhlIGZvbGxvd2luZwotICAgbGltaXQgc2VlbXMgdmVyeSBnZW5lcm91cy4KLS0tKi8KLSNkZWZpbmUgUVNPUlRfU1RBQ0tfU0laRSAxMDAwCi0KLQotdm9pZCBxU29ydDMgKCBJbnQzMiBsb1N0LCBJbnQzMiBoaVN0LCBJbnQzMiBkU3QgKQotewotICAgSW50MzIgdW5MbywgdW5IaSwgbHRMbywgZ3RIaSwgbWVkLCBuLCBtOwotICAgSW50MzIgc3AsIGxvLCBoaSwgZDsKLSAgIFN0YWNrRWxlbSBzdGFja1tRU09SVF9TVEFDS19TSVpFXTsKLQotICAgc3AgPSAwOwotICAgcHVzaCAoIGxvU3QsIGhpU3QsIGRTdCApOwotCi0gICB3aGlsZSAoc3AgPiAwKSB7Ci0KLSAgICAgIGlmIChzcCA+PSBRU09SVF9TVEFDS19TSVpFKSBwYW5pYyAoICJzdGFjayBvdmVyZmxvdyBpbiBxU29ydDMiICk7Ci0KLSAgICAgIHBvcCAoIGxvLCBoaSwgZCApOwotCi0gICAgICBpZiAoaGkgLSBsbyA8IFNNQUxMX1RIUkVTSCB8fCBkID4gREVQVEhfVEhSRVNIKSB7Ci0gICAgICAgICBzaW1wbGVTb3J0ICggbG8sIGhpLCBkICk7Ci0gICAgICAgICBpZiAod29ya0RvbmUgPiB3b3JrTGltaXQgJiYgZmlyc3RBdHRlbXB0KSByZXR1cm47Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgbWVkID0gbWVkMyAoIGJsb2NrW3pwdHJbIGxvICAgICAgICAgXStkXSwKLSAgICAgICAgICAgICAgICAgICBibG9ja1t6cHRyWyBoaSAgICAgICAgIF0rZF0sCi0gICAgICAgICAgICAgICAgICAgYmxvY2tbenB0clsgKGxvK2hpKT4+MSBdK2RdICk7Ci0KLSAgICAgIHVuTG8gPSBsdExvID0gbG87Ci0gICAgICB1bkhpID0gZ3RIaSA9IGhpOwotCi0gICAgICB3aGlsZSAoVHJ1ZSkgewotICAgICAgICAgd2hpbGUgKFRydWUpIHsKLSAgICAgICAgICAgIGlmICh1bkxvID4gdW5IaSkgYnJlYWs7Ci0gICAgICAgICAgICBuID0gKChJbnQzMilibG9ja1t6cHRyW3VuTG9dK2RdKSAtIG1lZDsKLSAgICAgICAgICAgIGlmIChuID09IDApIHsgc3dhcCh6cHRyW3VuTG9dLCB6cHRyW2x0TG9dKTsgbHRMbysrOyB1bkxvKys7IGNvbnRpbnVlOyB9OwotICAgICAgICAgICAgaWYgKG4gPiAgMCkgYnJlYWs7Ci0gICAgICAgICAgICB1bkxvKys7Ci0gICAgICAgICB9Ci0gICAgICAgICB3aGlsZSAoVHJ1ZSkgewotICAgICAgICAgICAgaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKLSAgICAgICAgICAgIG4gPSAoKEludDMyKWJsb2NrW3pwdHJbdW5IaV0rZF0pIC0gbWVkOwotICAgICAgICAgICAgaWYgKG4gPT0gMCkgeyBzd2FwKHpwdHJbdW5IaV0sIHpwdHJbZ3RIaV0pOyBndEhpLS07IHVuSGktLTsgY29udGludWU7IH07Ci0gICAgICAgICAgICBpZiAobiA8ICAwKSBicmVhazsKLSAgICAgICAgICAgIHVuSGktLTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICh1bkxvID4gdW5IaSkgYnJlYWs7Ci0gICAgICAgICBzd2FwKHpwdHJbdW5Mb10sIHpwdHJbdW5IaV0pOyB1bkxvKys7IHVuSGktLTsKLSAgICAgIH0KLSAgICAgICNpZiBERUJVRwotICAgICAgICAgYXNzZXJ0ICh1bkhpID09IHVuTG8tMSk7Ci0gICAgICAjZW5kaWYKLQotICAgICAgaWYgKGd0SGkgPCBsdExvKSB7Ci0gICAgICAgICBwdXNoKGxvLCBoaSwgZCsxICk7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgbiA9IG1pbihsdExvLWxvLCB1bkxvLWx0TG8pOyB2c3dhcChsbywgdW5Mby1uLCBuKTsKLSAgICAgIG0gPSBtaW4oaGktZ3RIaSwgZ3RIaS11bkhpKTsgdnN3YXAodW5MbywgaGktbSsxLCBtKTsKLQotICAgICAgbiA9IGxvICsgdW5MbyAtIGx0TG8gLSAxOwotICAgICAgbSA9IGhpIC0gKGd0SGkgLSB1bkhpKSArIDE7Ci0KLSAgICAgIHB1c2ggKCBsbywgbiwgZCApOwotICAgICAgcHVzaCAoIG4rMSwgbS0xLCBkKzEgKTsKLSAgICAgIHB1c2ggKCBtLCBoaSwgZCApOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBCSUdGUkVRKGIpIChmdGFiWygoYikrMSkgPDwgOF0gLSBmdGFiWyhiKSA8PCA4XSkKLQotI2RlZmluZSBTRVRNQVNLICgxIDw8IDIxKQotI2RlZmluZSBDTEVBUk1BU0sgKH4oU0VUTUFTSykpCi0KLXZvaWQgc29ydEl0ICggdm9pZCApCi17Ci0gICBJbnQzMiBpLCBqLCBzcywgc2I7Ci0gICBJbnQzMiBydW5uaW5nT3JkZXJbMjU2XTsKLSAgIEludDMyIGNvcHlbMjU2XTsKLSAgIEJvb2wgYmlnRG9uZVsyNTZdOwotICAgVUNoYXIgYzEsIGMyOwotICAgSW50MzIgbnVtUVNvcnRlZDsKLQotICAgLyotLQotICAgICAgSW4gdGhlIHZhcmlvdXMgYmxvY2stc2l6ZWQgc3RydWN0dXJlcywgbGl2ZSBkYXRhIHJ1bnMKLSAgICAgIGZyb20gMCB0byBsYXN0K05VTV9PVkVSU0hPT1RfQllURVMgaW5jbHVzaXZlLiAgRmlyc3QsCi0gICAgICBzZXQgdXAgdGhlIG92ZXJzaG9vdCBhcmVhIGZvciBibG9jay4KLSAgIC0tKi8KLQotICAgaWYgKHZlcmJvc2l0eSA+PSA0KSBmcHJpbnRmICggc3RkZXJyLCAiICAgICAgICBzb3J0IGluaXRpYWxpc2UgLi4uXG4iICk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgTlVNX09WRVJTSE9PVF9CWVRFUzsgaSsrKQotICAgICAgIGJsb2NrW2xhc3QraSsxXSA9IGJsb2NrW2kgJSAobGFzdCsxKV07Ci0gICBmb3IgKGkgPSAwOyBpIDw9IGxhc3QrTlVNX09WRVJTSE9PVF9CWVRFUzsgaSsrKQotICAgICAgIHF1YWRyYW50W2ldID0gMDsKLQotICAgYmxvY2tbLTFdID0gYmxvY2tbbGFzdF07Ci0KLSAgIGlmIChsYXN0IDwgNDAwMCkgewotCi0gICAgICAvKi0tCi0gICAgICAgICBVc2Ugc2ltcGxlU29ydCgpLCBzaW5jZSB0aGUgZnVsbCBzb3J0aW5nIG1lY2hhbmlzbQotICAgICAgICAgaGFzIHF1aXRlIGEgbGFyZ2UgY29uc3RhbnQgb3ZlcmhlYWQuCi0gICAgICAtLSovCi0gICAgICBpZiAodmVyYm9zaXR5ID49IDQpIGZwcmludGYgKCBzdGRlcnIsICIgICAgICAgIHNpbXBsZVNvcnQgLi4uXG4iICk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykgenB0cltpXSA9IGk7Ci0gICAgICBmaXJzdEF0dGVtcHQgPSBGYWxzZTsKLSAgICAgIHdvcmtEb25lID0gd29ya0xpbWl0ID0gMDsKLSAgICAgIHNpbXBsZVNvcnQgKCAwLCBsYXN0LCAwICk7Ci0gICAgICBpZiAodmVyYm9zaXR5ID49IDQpIGZwcmludGYgKCBzdGRlcnIsICIgICAgICAgIHNpbXBsZVNvcnQgZG9uZS5cbiIgKTsKLQotICAgfSBlbHNlIHsKLQotICAgICAgbnVtUVNvcnRlZCA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSBiaWdEb25lW2ldID0gRmFsc2U7Ci0KLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gNCkgZnByaW50ZiAoIHN0ZGVyciwgIiAgICAgICAgYnVja2V0IHNvcnRpbmcgLi4uXG4iICk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gNjU1MzY7IGkrKykgZnRhYltpXSA9IDA7Ci0KLSAgICAgIGMxID0gYmxvY2tbLTFdOwotICAgICAgZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKLSAgICAgICAgIGMyID0gYmxvY2tbaV07Ci0gICAgICAgICBmdGFiWyhjMSA8PCA4KSArIGMyXSsrOwotICAgICAgICAgYzEgPSBjMjsKLSAgICAgIH0KLQotICAgICAgZm9yIChpID0gMTsgaSA8PSA2NTUzNjsgaSsrKSBmdGFiW2ldICs9IGZ0YWJbaS0xXTsKLQotICAgICAgYzEgPSBibG9ja1swXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKyspIHsKLSAgICAgICAgIGMyID0gYmxvY2tbaSsxXTsKLSAgICAgICAgIGogPSAoYzEgPDwgOCkgKyBjMjsKLSAgICAgICAgIGMxID0gYzI7Ci0gICAgICAgICBmdGFiW2pdLS07Ci0gICAgICAgICB6cHRyW2Z0YWJbal1dID0gaTsKLSAgICAgIH0KLSAgICAgIGogPSAoYmxvY2tbbGFzdF0gPDwgOCkgKyBibG9ja1swXTsKLSAgICAgIGZ0YWJbal0tLTsKLSAgICAgIHpwdHJbZnRhYltqXV0gPSBsYXN0OwotCi0gICAgICAvKi0tCi0gICAgICAgICBOb3cgZnRhYiBjb250YWlucyB0aGUgZmlyc3QgbG9jIG9mIGV2ZXJ5IHNtYWxsIGJ1Y2tldC4KLSAgICAgICAgIENhbGN1bGF0ZSB0aGUgcnVubmluZyBvcmRlciwgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0Ci0gICAgICAgICBiaWcgYnVja2V0LgotICAgICAgLS0qLwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSBydW5uaW5nT3JkZXJbaV0gPSBpOwotCi0gICAgICB7Ci0gICAgICAgICBJbnQzMiB2djsKLSAgICAgICAgIEludDMyIGggPSAxOwotICAgICAgICAgZG8gaCA9IDMgKiBoICsgMTsgd2hpbGUgKGggPD0gMjU2KTsKLSAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGggPSBoIC8gMzsKLSAgICAgICAgICAgIGZvciAoaSA9IGg7IGkgPD0gMjU1OyBpKyspIHsKLSAgICAgICAgICAgICAgIHZ2ID0gcnVubmluZ09yZGVyW2ldOwotICAgICAgICAgICAgICAgaiA9IGk7Ci0gICAgICAgICAgICAgICB3aGlsZSAoIEJJR0ZSRVEocnVubmluZ09yZGVyW2otaF0pID4gQklHRlJFUSh2dikgKSB7Ci0gICAgICAgICAgICAgICAgICBydW5uaW5nT3JkZXJbal0gPSBydW5uaW5nT3JkZXJbai1oXTsKLSAgICAgICAgICAgICAgICAgIGogPSBqIC0gaDsKLSAgICAgICAgICAgICAgICAgIGlmIChqIDw9IChoIC0gMSkpIGdvdG8gemVybzsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIHplcm86Ci0gICAgICAgICAgICAgICBydW5uaW5nT3JkZXJbal0gPSB2djsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUgKGggIT0gMSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qLS0KLSAgICAgICAgIFRoZSBtYWluIHNvcnRpbmcgbG9vcC4KLSAgICAgIC0tKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8PSAyNTU7IGkrKykgewotCi0gICAgICAgICAvKi0tCi0gICAgICAgICAgICBQcm9jZXNzIGJpZyBidWNrZXRzLCBzdGFydGluZyB3aXRoIHRoZSBsZWFzdCBmdWxsLgotICAgICAgICAgLS0qLwotICAgICAgICAgc3MgPSBydW5uaW5nT3JkZXJbaV07Ci0KLSAgICAgICAgIC8qLS0KLSAgICAgICAgICAgIENvbXBsZXRlIHRoZSBiaWcgYnVja2V0IFtzc10gYnkgcXVpY2tzb3J0aW5nCi0gICAgICAgICAgICBhbnkgdW5zb3J0ZWQgc21hbGwgYnVja2V0cyBbc3MsIGpdLiAgSG9wZWZ1bGx5Ci0gICAgICAgICAgICBwcmV2aW91cyBwb2ludGVyLXNjYW5uaW5nIHBoYXNlcyBoYXZlIGFscmVhZHkKLSAgICAgICAgICAgIGNvbXBsZXRlZCBtYW55IG9mIHRoZSBzbWFsbCBidWNrZXRzIFtzcywgal0sIHNvCi0gICAgICAgICAgICB3ZSBkb24ndCBoYXZlIHRvIHNvcnQgdGhlbSBhdCBhbGwuCi0gICAgICAgICAtLSovCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7Ci0gICAgICAgICAgICBzYiA9IChzcyA8PCA4KSArIGo7Ci0gICAgICAgICAgICBpZiAoICEgKGZ0YWJbc2JdICYgU0VUTUFTSykgKSB7Ci0gICAgICAgICAgICAgICBJbnQzMiBsbyA9IGZ0YWJbc2JdICAgJiBDTEVBUk1BU0s7Ci0gICAgICAgICAgICAgICBJbnQzMiBoaSA9IChmdGFiW3NiKzFdICYgQ0xFQVJNQVNLKSAtIDE7Ci0gICAgICAgICAgICAgICBpZiAoaGkgPiBsbykgewotICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2l0eSA+PSA0KQotICAgICAgICAgICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBxc29ydCBbMHgleCwgMHgleF0gICBkb25lICVkICAgdGhpcyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcywgaiwgbnVtUVNvcnRlZCwgaGkgLSBsbyArIDEgKTsKLSAgICAgICAgICAgICAgICAgIHFTb3J0MyAoIGxvLCBoaSwgMiApOwotICAgICAgICAgICAgICAgICAgbnVtUVNvcnRlZCArPSAoIGhpIC0gbG8gKyAxICk7Ci0gICAgICAgICAgICAgICAgICBpZiAod29ya0RvbmUgPiB3b3JrTGltaXQgJiYgZmlyc3RBdHRlbXB0KSByZXR1cm47Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBmdGFiW3NiXSB8PSBTRVRNQVNLOwotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKi0tCi0gICAgICAgICAgICBUaGUgc3MgYmlnIGJ1Y2tldCBpcyBub3cgZG9uZS4gIFJlY29yZCB0aGlzIGZhY3QsCi0gICAgICAgICAgICBhbmQgdXBkYXRlIHRoZSBxdWFkcmFudCBkZXNjcmlwdG9ycy4gIFJlbWVtYmVyIHRvCi0gICAgICAgICAgICB1cGRhdGUgcXVhZHJhbnRzIGluIHRoZSBvdmVyc2hvb3QgYXJlYSB0b28sIGlmCi0gICAgICAgICAgICBuZWNlc3NhcnkuICBUaGUgImlmIChpIDwgMjU1KSIgdGVzdCBtZXJlbHkgc2tpcHMKLSAgICAgICAgICAgIHRoaXMgdXBkYXRpbmcgZm9yIHRoZSBsYXN0IGJ1Y2tldCBwcm9jZXNzZWQsIHNpbmNlCi0gICAgICAgICAgICB1cGRhdGluZyBmb3IgdGhlIGxhc3QgYnVja2V0IGlzIHBvaW50bGVzcy4KLSAgICAgICAgIC0tKi8KLSAgICAgICAgIGJpZ0RvbmVbc3NdID0gVHJ1ZTsKLQotICAgICAgICAgaWYgKGkgPCAyNTUpIHsKLSAgICAgICAgICAgIEludDMyIGJiU3RhcnQgID0gZnRhYltzcyA8PCA4XSAmIENMRUFSTUFTSzsKLSAgICAgICAgICAgIEludDMyIGJiU2l6ZSAgID0gKGZ0YWJbKHNzKzEpIDw8IDhdICYgQ0xFQVJNQVNLKSAtIGJiU3RhcnQ7Ci0gICAgICAgICAgICBJbnQzMiBzaGlmdHMgICA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoYmJTaXplID4+IHNoaWZ0cykgPiA2NTUzNCkgc2hpZnRzKys7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBiYlNpemU7IGorKykgewotICAgICAgICAgICAgICAgSW50MzIgYTJ1cGRhdGUgICAgID0genB0cltiYlN0YXJ0ICsgal07Ci0gICAgICAgICAgICAgICBVSW50MTYgcVZhbCAgICAgICAgPSAoVUludDE2KShqID4+IHNoaWZ0cyk7Ci0gICAgICAgICAgICAgICBxdWFkcmFudFthMnVwZGF0ZV0gPSBxVmFsOwotICAgICAgICAgICAgICAgaWYgKGEydXBkYXRlIDwgTlVNX09WRVJTSE9PVF9CWVRFUykKLSAgICAgICAgICAgICAgICAgIHF1YWRyYW50W2EydXBkYXRlICsgbGFzdCArIDFdID0gcVZhbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCEgKCAoKGJiU2l6ZS0xKSA+PiBzaGlmdHMpIDw9IDY1NTM1ICkpIHBhbmljICggInNvcnRJdCIgKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyotLQotICAgICAgICAgICAgTm93IHNjYW4gdGhpcyBiaWcgYnVja2V0IHNvIGFzIHRvIHN5bnRoZXNpc2UgdGhlCi0gICAgICAgICAgICBzb3J0ZWQgb3JkZXIgZm9yIHNtYWxsIGJ1Y2tldHMgW3QsIHNzXSBmb3IgYWxsIHQgIT0gc3MuCi0gICAgICAgICAtLSovCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKQotICAgICAgICAgICAgY29weVtqXSA9IGZ0YWJbKGogPDwgOCkgKyBzc10gJiBDTEVBUk1BU0s7Ci0KLSAgICAgICAgIGZvciAoaiA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7Ci0gICAgICAgICAgICAgIGogPCAoZnRhYlsoc3MrMSkgPDwgOF0gJiBDTEVBUk1BU0spOwotICAgICAgICAgICAgICBqKyspIHsKLSAgICAgICAgICAgIGMxID0gYmxvY2tbenB0cltqXS0xXTsKLSAgICAgICAgICAgIGlmICggISBiaWdEb25lW2MxXSApIHsKLSAgICAgICAgICAgICAgIHpwdHJbY29weVtjMV1dID0genB0cltqXSA9PSAwID8gbGFzdCA6IHpwdHJbal0gLSAxOwotICAgICAgICAgICAgICAgY29weVtjMV0gKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIGZ0YWJbKGogPDwgOCkgKyBzc10gfD0gU0VUTUFTSzsKLSAgICAgIH0KLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gNCkKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgICAgICVkIHBvaW50ZXJzLCAlZCBzb3J0ZWQsICVkIHNjYW5uZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0KzEsIG51bVFTb3J0ZWQsIChsYXN0KzEpIC0gbnVtUVNvcnRlZCApOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tIFN0dWZmIGZvciByYW5kb21pc2luZyByZXBldGl0aXZlIGJsb2NrcyAgICAgLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotSW50MzIgck51bXNbNTEyXSA9IHsgCi0gICA2MTksIDcyMCwgMTI3LCA0ODEsIDkzMSwgODE2LCA4MTMsIDIzMywgNTY2LCAyNDcsIAotICAgOTg1LCA3MjQsIDIwNSwgNDU0LCA4NjMsIDQ5MSwgNzQxLCAyNDIsIDk0OSwgMjE0LCAKLSAgIDczMywgODU5LCAzMzUsIDcwOCwgNjIxLCA1NzQsIDczLCA2NTQsIDczMCwgNDcyLCAKLSAgIDQxOSwgNDM2LCAyNzgsIDQ5NiwgODY3LCAyMTAsIDM5OSwgNjgwLCA0ODAsIDUxLCAKLSAgIDg3OCwgNDY1LCA4MTEsIDE2OSwgODY5LCA2NzUsIDYxMSwgNjk3LCA4NjcsIDU2MSwgCi0gICA4NjIsIDY4NywgNTA3LCAyODMsIDQ4MiwgMTI5LCA4MDcsIDU5MSwgNzMzLCA2MjMsIAotICAgMTUwLCAyMzgsIDU5LCAzNzksIDY4NCwgODc3LCA2MjUsIDE2OSwgNjQzLCAxMDUsIAotICAgMTcwLCA2MDcsIDUyMCwgOTMyLCA3MjcsIDQ3NiwgNjkzLCA0MjUsIDE3NCwgNjQ3LCAKLSAgIDczLCAxMjIsIDMzNSwgNTMwLCA0NDIsIDg1MywgNjk1LCAyNDksIDQ0NSwgNTE1LCAKLSAgIDkwOSwgNTQ1LCA3MDMsIDkxOSwgODc0LCA0NzQsIDg4MiwgNTAwLCA1OTQsIDYxMiwgCi0gICA2NDEsIDgwMSwgMjIwLCAxNjIsIDgxOSwgOTg0LCA1ODksIDUxMywgNDk1LCA3OTksIAotICAgMTYxLCA2MDQsIDk1OCwgNTMzLCAyMjEsIDQwMCwgMzg2LCA4NjcsIDYwMCwgNzgyLCAKLSAgIDM4MiwgNTk2LCA0MTQsIDE3MSwgNTE2LCAzNzUsIDY4MiwgNDg1LCA5MTEsIDI3NiwgCi0gICA5OCwgNTUzLCAxNjMsIDM1NCwgNjY2LCA5MzMsIDQyNCwgMzQxLCA1MzMsIDg3MCwgCi0gICAyMjcsIDczMCwgNDc1LCAxODYsIDI2MywgNjQ3LCA1MzcsIDY4NiwgNjAwLCAyMjQsIAotICAgNDY5LCA2OCwgNzcwLCA5MTksIDE5MCwgMzczLCAyOTQsIDgyMiwgODA4LCAyMDYsIAotICAgMTg0LCA5NDMsIDc5NSwgMzg0LCAzODMsIDQ2MSwgNDA0LCA3NTgsIDgzOSwgODg3LCAKLSAgIDcxNSwgNjcsIDYxOCwgMjc2LCAyMDQsIDkxOCwgODczLCA3NzcsIDYwNCwgNTYwLCAKLSAgIDk1MSwgMTYwLCA1NzgsIDcyMiwgNzksIDgwNCwgOTYsIDQwOSwgNzEzLCA5NDAsIAotICAgNjUyLCA5MzQsIDk3MCwgNDQ3LCAzMTgsIDM1MywgODU5LCA2NzIsIDExMiwgNzg1LCAKLSAgIDY0NSwgODYzLCA4MDMsIDM1MCwgMTM5LCA5MywgMzU0LCA5OSwgODIwLCA5MDgsIAotICAgNjA5LCA3NzIsIDE1NCwgMjc0LCA1ODAsIDE4NCwgNzksIDYyNiwgNjMwLCA3NDIsIAotICAgNjUzLCAyODIsIDc2MiwgNjIzLCA2ODAsIDgxLCA5MjcsIDYyNiwgNzg5LCAxMjUsIAotICAgNDExLCA1MjEsIDkzOCwgMzAwLCA4MjEsIDc4LCAzNDMsIDE3NSwgMTI4LCAyNTAsIAotICAgMTcwLCA3NzQsIDk3MiwgMjc1LCA5OTksIDYzOSwgNDk1LCA3OCwgMzUyLCAxMjYsIAotICAgODU3LCA5NTYsIDM1OCwgNjE5LCA1ODAsIDEyNCwgNzM3LCA1OTQsIDcwMSwgNjEyLCAKLSAgIDY2OSwgMTEyLCAxMzQsIDY5NCwgMzYzLCA5OTIsIDgwOSwgNzQzLCAxNjgsIDk3NCwgCi0gICA5NDQsIDM3NSwgNzQ4LCA1MiwgNjAwLCA3NDcsIDY0MiwgMTgyLCA4NjIsIDgxLCAKLSAgIDM0NCwgODA1LCA5ODgsIDczOSwgNTExLCA2NTUsIDgxNCwgMzM0LCAyNDksIDUxNSwgCi0gICA4OTcsIDk1NSwgNjY0LCA5ODEsIDY0OSwgMTEzLCA5NzQsIDQ1OSwgODkzLCAyMjgsIAotICAgNDMzLCA4MzcsIDU1MywgMjY4LCA5MjYsIDI0MCwgMTAyLCA2NTQsIDQ1OSwgNTEsIAotICAgNjg2LCA3NTQsIDgwNiwgNzYwLCA0OTMsIDQwMywgNDE1LCAzOTQsIDY4NywgNzAwLCAKLSAgIDk0NiwgNjcwLCA2NTYsIDYxMCwgNzM4LCAzOTIsIDc2MCwgNzk5LCA4ODcsIDY1MywgCi0gICA5NzgsIDMyMSwgNTc2LCA2MTcsIDYyNiwgNTAyLCA4OTQsIDY3OSwgMjQzLCA0NDAsIAotICAgNjgwLCA4NzksIDE5NCwgNTcyLCA2NDAsIDcyNCwgOTI2LCA1NiwgMjA0LCA3MDAsIAotICAgNzA3LCAxNTEsIDQ1NywgNDQ5LCA3OTcsIDE5NSwgNzkxLCA1NTgsIDk0NSwgNjc5LCAKLSAgIDI5NywgNTksIDg3LCA4MjQsIDcxMywgNjYzLCA0MTIsIDY5MywgMzQyLCA2MDYsIAotICAgMTM0LCAxMDgsIDU3MSwgMzY0LCA2MzEsIDIxMiwgMTc0LCA2NDMsIDMwNCwgMzI5LCAKLSAgIDM0MywgOTcsIDQzMCwgNzUxLCA0OTcsIDMxNCwgOTgzLCAzNzQsIDgyMiwgOTI4LCAKLSAgIDE0MCwgMjA2LCA3MywgMjYzLCA5ODAsIDczNiwgODc2LCA0NzgsIDQzMCwgMzA1LCAKLSAgIDE3MCwgNTE0LCAzNjQsIDY5MiwgODI5LCA4MiwgODU1LCA5NTMsIDY3NiwgMjQ2LCAKLSAgIDM2OSwgOTcwLCAyOTQsIDc1MCwgODA3LCA4MjcsIDE1MCwgNzkwLCAyODgsIDkyMywgCi0gICA4MDQsIDM3OCwgMjE1LCA4MjgsIDU5MiwgMjgxLCA1NjUsIDU1NSwgNzEwLCA4MiwgCi0gICA4OTYsIDgzMSwgNTQ3LCAyNjEsIDUyNCwgNDYyLCAyOTMsIDQ2NSwgNTAyLCA1NiwgCi0gICA2NjEsIDgyMSwgOTc2LCA5OTEsIDY1OCwgODY5LCA5MDUsIDc1OCwgNzQ1LCAxOTMsIAotICAgNzY4LCA1NTAsIDYwOCwgOTMzLCAzNzgsIDI4NiwgMjE1LCA5NzksIDc5MiwgOTYxLCAKLSAgIDYxLCA2ODgsIDc5MywgNjQ0LCA5ODYsIDQwMywgMTA2LCAzNjYsIDkwNSwgNjQ0LCAKLSAgIDM3MiwgNTY3LCA0NjYsIDQzNCwgNjQ1LCAyMTAsIDM4OSwgNTUwLCA5MTksIDEzNSwgCi0gICA3ODAsIDc3MywgNjM1LCAzODksIDcwNywgMTAwLCA2MjYsIDk1OCwgMTY1LCA1MDQsIAotICAgOTIwLCAxNzYsIDE5MywgNzEzLCA4NTcsIDI2NSwgMjAzLCA1MCwgNjY4LCAxMDgsIAotICAgNjQ1LCA5OTAsIDYyNiwgMTk3LCA1MTAsIDM1NywgMzU4LCA4NTAsIDg1OCwgMzY0LCAKLSAgIDkzNiwgNjM4Ci19OwotCi0KLSNkZWZpbmUgUkFORF9ERUNMUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgSW50MzIgck5Ub0dvID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBJbnQzMiByVFBvcyAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI2RlZmluZSBSQU5EX01BU0sgKChyTlRvR28gPT0gMSkgPyAxIDogMCkKLQotI2RlZmluZSBSQU5EX1VQRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBpZiAock5Ub0dvID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJOVG9HbyA9IHJOdW1zW3JUUG9zXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgclRQb3MrKzsgaWYgKHJUUG9zID09IDUxMikgclRQb3MgPSAwOyAgICAgICBcCi0gICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHJOVG9Hby0tOwotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0gVGhlIFJldmVyc2libGUgVHJhbnNmb3JtYXRpb24gKHRtKSAgICAgICAgICAtLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHJhbmRvbWlzZUJsb2NrICggdm9pZCApCi17Ci0gICBJbnQzMiBpOwotICAgUkFORF9ERUNMUzsKLSAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgaW5Vc2VbaV0gPSBGYWxzZTsKLQotICAgZm9yIChpID0gMDsgaSA8PSBsYXN0OyBpKyspIHsKLSAgICAgIFJBTkRfVVBEX01BU0s7Ci0gICAgICBibG9ja1tpXSBePSBSQU5EX01BU0s7Ci0gICAgICBpblVzZVtibG9ja1tpXV0gPSBUcnVlOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24gKCB2b2lkICkKLXsKLSAgIEludDMyIGk7Ci0KLSAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIlxuIiApOwotCi0gICB3b3JrTGltaXQgICAgICAgPSB3b3JrRmFjdG9yICogbGFzdDsKLSAgIHdvcmtEb25lICAgICAgICA9IDA7Ci0gICBibG9ja1JhbmRvbWlzZWQgPSBGYWxzZTsKLSAgIGZpcnN0QXR0ZW1wdCAgICA9IFRydWU7Ci0KLSAgIHNvcnRJdCAoKTsKLQotICAgaWYgKHZlcmJvc2l0eSA+PSAzKQotICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiAgICAgICVkIHdvcmssICVkIGJsb2NrLCByYXRpbyAlNS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtEb25lLCBsYXN0LCAoZmxvYXQpd29ya0RvbmUgLyAoZmxvYXQpKGxhc3QpICk7Ci0KLSAgIGlmICh3b3JrRG9uZSA+IHdvcmtMaW1pdCAmJiBmaXJzdEF0dGVtcHQpIHsKLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMikKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgc29ydGluZyBhYm9ydGVkOyByYW5kb21pc2luZyBibG9ja1xuIiApOwotICAgICAgcmFuZG9taXNlQmxvY2sgKCk7Ci0gICAgICB3b3JrTGltaXQgPSB3b3JrRG9uZSA9IDA7Ci0gICAgICBibG9ja1JhbmRvbWlzZWQgPSBUcnVlOwotICAgICAgZmlyc3RBdHRlbXB0ID0gRmFsc2U7Ci0gICAgICBzb3J0SXQoKTsKLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMykKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgICAlZCB3b3JrLCAlZCBibG9jaywgcmF0aW8gJWZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrRG9uZSwgbGFzdCwgKGZsb2F0KXdvcmtEb25lIC8gKGZsb2F0KShsYXN0KSApOwotICAgfQotCi0gICBvcmlnUHRyID0gLTE7Ci0gICBmb3IgKGkgPSAwOyBpIDw9IGxhc3Q7IGkrKykKLSAgICAgICBpZiAoenB0cltpXSA9PSAwKQotICAgICAgICAgIHsgb3JpZ1B0ciA9IGk7IGJyZWFrOyB9OwotCi0gICBpZiAob3JpZ1B0ciA9PSAtMSkgcGFuaWMgKCAiZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb24iICk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1JTkxJTkUgSW50MzIgaW5kZXhJbnRvRiAoIEludDMyIGluZHgsIEludDMyICpjZnRhYiApCi17Ci0gICBJbnQzMiBuYiwgbmEsIG1pZDsKLSAgIG5iID0gMDsKLSAgIG5hID0gMjU2OwotICAgZG8gewotICAgICAgbWlkID0gKG5iICsgbmEpID4+IDE7Ci0gICAgICBpZiAoaW5keCA+PSBjZnRhYlttaWRdKSBuYiA9IG1pZDsgZWxzZSBuYSA9IG1pZDsKLSAgIH0KLSAgIHdoaWxlIChuYSAtIG5iICE9IDEpOwotICAgcmV0dXJuIG5iOwotfQotCi0KLSNkZWZpbmUgR0VUX1NNQUxMKGNjY2MpICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjY2NjID0gaW5kZXhJbnRvRiAoIHRQb3MsIGNmdGFiICk7ICAgIFwKLSAgICAgIHRQb3MgPSBHRVRfTEwodFBvcyk7Ci0KLQotdm9pZCB1bmRvUmV2ZXJzaWJsZVRyYW5zZm9ybWF0aW9uX3NtYWxsICggRklMRSogZHN0ICkKLXsKLSAgIEludDMyICBjZnRhYlsyNTddLCBjZnRhYkFsc29bMjU3XTsKLSAgIEludDMyICBpLCBqLCB0bXAsIHRQb3M7Ci0gICBVQ2hhciAgY2g7Ci0KLSAgIC8qLS0KLSAgICAgIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIGdsb2JhbCBhcnJheSB1bnpmdGFiIHdpbGwKLSAgICAgIGFscmVhZHkgYmUgaG9sZGluZyB0aGUgZnJlcXVlbmN5IGNvdW50cyBmb3IKLSAgICAgIGxsOFswIC4uIGxhc3RdLgotICAgLS0qLwotCi0gICAvKi0tIFNldCB1cCBjZnRhYiB0byBmYWNpbGl0YXRlIGdlbmVyYXRpb24gb2YgaW5kZXhJbnRvRiAtLSovCi0gICBjZnRhYlswXSA9IDA7Ci0gICBmb3IgKGkgPSAxOyBpIDw9IDI1NjsgaSsrKSBjZnRhYltpXSA9IHVuemZ0YWJbaS0xXTsKLSAgIGZvciAoaSA9IDE7IGkgPD0gMjU2OyBpKyspIGNmdGFiW2ldICs9IGNmdGFiW2ktMV07Ci0KLSAgIC8qLS0gTWFrZSBhIGNvcHkgb2YgaXQsIHVzZWQgaW4gZ2VuZXJhdGlvbiBvZiBUIC0tKi8KLSAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIGNmdGFiQWxzb1tpXSA9IGNmdGFiW2ldOwotCi0gICAvKi0tIGNvbXB1dGUgdGhlIFQgdmVjdG9yIC0tKi8KLSAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7Ci0gICAgICBjaCA9IChVQ2hhcilsbDE2W2ldOwotICAgICAgU0VUX0xMKGksIGNmdGFiQWxzb1tjaF0pOwotICAgICAgY2Z0YWJBbHNvW2NoXSsrOwotICAgfQotCi0gICAvKi0tCi0gICAgICBDb21wdXRlIFReKC0xKSBieSBwb2ludGVyIHJldmVyc2FsIG9uIFQuICBUaGlzIGlzIHJhdGhlcgotICAgICAgc3VidGxlLCBpbiB0aGF0LCBpZiB0aGUgb3JpZ2luYWwgYmxvY2sgd2FzIHR3byBvciBtb3JlCi0gICAgICAoaW4gZ2VuZXJhbCwgTikgY29uY2F0ZW5hdGVkIGNvcGllcyBvZiB0aGUgc2FtZSB0aGluZywKLSAgICAgIHRoZSBUIHZlY3RvciB3aWxsIGNvbnNpc3Qgb2YgTiBjeWNsZXMsIGVhY2ggb2YgbGVuZ3RoCi0gICAgICBibG9ja3NpemUgLyBOLCBhbmQgZGVjb2Rpbmcgd2lsbCBpbnZvbHZlIHRyYXZlcnNpbmcgb25lCi0gICAgICBvZiB0aGVzZSBjeWNsZXMgTiB0aW1lcy4gIFdoaWNoIHBhcnRpY3VsYXIgY3ljbGUgZG9lc24ndAotICAgICAgbWF0dGVyIC0tIHRoZXkgYXJlIGFsbCBlcXVpdmFsZW50LiAgVGhlIHRyaWNreSBwYXJ0IGlzIHRvCi0gICAgICBtYWtlIHN1cmUgdGhhdCB0aGUgcG9pbnRlciByZXZlcnNhbCBjcmVhdGVzIGEgY29ycmVjdAotICAgICAgcmV2ZXJzZWQgY3ljbGUgZm9yIHVzIHRvIHRyYXZlcnNlLiAgU28sIHRoZSBjb2RlIGJlbG93Ci0gICAgICBzaW1wbHkgcmV2ZXJzZXMgd2hhdGV2ZXIgY3ljbGUgb3JpZ1B0ciBoYXBwZW5zIHRvIGZhbGwgaW50bywKLSAgICAgIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBjeWNsZSBsZW5ndGguICBUaGF0IGdpdmVzIG9uZSByZXZlcnNlZAotICAgICAgY3ljbGUsIHdoaWNoIGZvciBub3JtYWwgYmxvY2tzLCBpcyB0aGUgZW50aXJlIGJsb2NrLXNpemUgbG9uZy4KLSAgICAgIEZvciByZXBlYXRlZCBibG9ja3MsIGl0IHdpbGwgYmUgaW50ZXJzcGVyc2VkIHdpdGggdGhlIG90aGVyCi0gICAgICBOLTEgbm9uLXJldmVyc2VkIGN5Y2xlcy4gIFByb3ZpZGluZyB0aGF0IHRoZSBGLXN1YnNjcmlwdGluZwotICAgICAgcGhhc2Ugd2hpY2ggZm9sbG93cyBzdGFydHMgYXQgb3JpZ1B0ciwgYWxsIHRoZW4gd29ya3Mgb2suCi0gICAtLSovCi0gICBpID0gb3JpZ1B0cjsKLSAgIGogPSBHRVRfTEwoaSk7Ci0gICBkbyB7Ci0gICAgICB0bXAgPSBHRVRfTEwoaik7Ci0gICAgICBTRVRfTEwoaiwgaSk7Ci0gICAgICBpID0gajsKLSAgICAgIGogPSB0bXA7Ci0gICB9Ci0gICAgICB3aGlsZSAoaSAhPSBvcmlnUHRyKTsKLQotICAgLyotLQotICAgICAgV2UgcmVjcmVhdGUgdGhlIG9yaWdpbmFsIGJ5IHN1YnNjcmlwdGluZyBGIHRocm91Z2ggVF4oLTEpLgotICAgICAgVGhlIHJ1bi1sZW5ndGgtZGVjb2RlciBiZWxvdyByZXF1aXJlcyBjaGFyYWN0ZXJzIGluY3JlbWVudGFsbHksCi0gICAgICBzbyB0UG9zIGlzIHNldCB0byBhIHN0YXJ0aW5nIHZhbHVlLCBhbmQgaXMgdXBkYXRlZCBieQotICAgICAgdGhlIEdFVF9TTUFMTCBtYWNyby4KLSAgIC0tKi8KLSAgIHRQb3MgICA9IG9yaWdQdHI7Ci0KLSAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAvKi0tCi0gICAgICBUaGlzIGlzIHByZXR0eSBtdWNoIGEgdmVyYmF0aW0gY29weSBvZiB0aGUKLSAgICAgIHJ1bi1sZW5ndGggZGVjb2RlciBwcmVzZW50IGluIHRoZSBkaXN0cmlidXRpb24KLSAgICAgIGJ6aXAtMC4yMTsgaXQgaGFzIHRvIGJlIGhlcmUgdG8gYXZvaWQgY3JlYXRpbmcKLSAgICAgIGJsb2NrW10gYXMgYW4gaW50ZXJtZWRpYXJ5IHN0cnVjdHVyZS4gIEFzIGluIDAuMjEsCi0gICAgICB0aGlzIGNvZGUgZGVyaXZlcyBmcm9tIHNvbWUgc2VudCB0byBtZSBieQotICAgICAgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLSAgICAgIEl0IGFsbG93cyBkc3Q9PU5VTEwsIHNvIGFzIHRvIHN1cHBvcnQgdGhlIHRlc3QgKC10KQotICAgICAgb3B0aW9uIHdpdGhvdXQgc2xvd2luZyBkb3duIHRoZSBmYXN0IGRlY29tcHJlc3Npb24KLSAgICAgIGNvZGUuCi0gICAtLSovCi0gICB7Ci0gICAgICBJbnROYXRpdmUgcmV0VmFsOwotICAgICAgSW50MzIgICAgIGkyLCBjb3VudCwgY2hQcmV2LCBjaDI7Ci0gICAgICBVSW50MzIgICAgbG9jYWxDcmM7Ci0KLSAgICAgIGNvdW50ICAgID0gMDsKLSAgICAgIGkyICAgICAgID0gMDsKLSAgICAgIGNoMiAgICAgID0gMjU2OyAgIC8qLS0gbm90IGEgY2hhciBhbmQgbm90IEVPRiAtLSovCi0gICAgICBsb2NhbENyYyA9IGdldEdsb2JhbENSQygpOwotCi0gICAgICB7Ci0gICAgICAgICBSQU5EX0RFQ0xTOwotICAgICAgICAgd2hpbGUgKCBpMiA8PSBsYXN0ICkgewotICAgICAgICAgICAgY2hQcmV2ID0gY2gyOwotICAgICAgICAgICAgR0VUX1NNQUxMKGNoMik7Ci0gICAgICAgICAgICBpZiAoYmxvY2tSYW5kb21pc2VkKSB7Ci0gICAgICAgICAgICAgICBSQU5EX1VQRF9NQVNLOwotICAgICAgICAgICAgICAgY2gyIF49IChVSW50MzIpUkFORF9NQVNLOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaTIrKzsKLSAgIAotICAgICAgICAgICAgaWYgKGRzdCkKLSAgICAgICAgICAgICAgIHJldFZhbCA9IHB1dGMgKCBjaDIsIGRzdCApOwotICAgCi0gICAgICAgICAgICBVUERBVEVfQ1JDICggbG9jYWxDcmMsIChVQ2hhciljaDIgKTsKLSAgIAotICAgICAgICAgICAgaWYgKGNoMiAhPSBjaFByZXYpIHsKLSAgICAgICAgICAgICAgIGNvdW50ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgaWYgKGNvdW50ID49IDQpIHsKLSAgICAgICAgICAgICAgICAgIEludDMyIGoyOwotICAgICAgICAgICAgICAgICAgVUNoYXIgejsKLSAgICAgICAgICAgICAgICAgIEdFVF9TTUFMTCh6KTsKLSAgICAgICAgICAgICAgICAgIGlmIChibG9ja1JhbmRvbWlzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgIFJBTkRfVVBEX01BU0s7Ci0gICAgICAgICAgICAgICAgICAgICB6IF49IFJBTkRfTUFTSzsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGZvciAoajIgPSAwOyAgajIgPCAoSW50MzIpejsgIGoyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChkc3QpIHJldFZhbCA9IHB1dGMgKGNoMiwgZHN0KTsKLSAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DUkMgKCBsb2NhbENyYywgKFVDaGFyKWNoMiApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaTIrKzsKLSAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgc2V0R2xvYmFsQ1JDICggbG9jYWxDcmMgKTsKLSAgIH0KLSAgIC8qLS0gZW5kIG9mIHRoZSBpbi1saW5lIHJ1bi1sZW5ndGgtZGVjb2Rlci4gLS0qLwotfQotI3VuZGVmIEdFVF9TTUFMTAotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2RlZmluZSBHRVRfRkFTVChjY2NjKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2NjYyA9IGxsOFt0UG9zXTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdFBvcyA9IHR0W3RQb3NdOwotCi0KLXZvaWQgdW5kb1JldmVyc2libGVUcmFuc2Zvcm1hdGlvbl9mYXN0ICggRklMRSogZHN0ICkKLXsKLSAgIEludDMyICBjZnRhYlsyNTddOwotICAgSW50MzIgIGksIHRQb3M7Ci0gICBVQ2hhciAgY2g7Ci0KLSAgIC8qLS0KLSAgICAgIFdlIGFzc3VtZSBoZXJlIHRoYXQgdGhlIGdsb2JhbCBhcnJheSB1bnpmdGFiIHdpbGwKLSAgICAgIGFscmVhZHkgYmUgaG9sZGluZyB0aGUgZnJlcXVlbmN5IGNvdW50cyBmb3IKLSAgICAgIGxsOFswIC4uIGxhc3RdLgotICAgLS0qLwotCi0gICAvKi0tIFNldCB1cCBjZnRhYiB0byBmYWNpbGl0YXRlIGdlbmVyYXRpb24gb2YgVF4oLTEpIC0tKi8KLSAgIGNmdGFiWzBdID0gMDsKLSAgIGZvciAoaSA9IDE7IGkgPD0gMjU2OyBpKyspIGNmdGFiW2ldID0gdW56ZnRhYltpLTFdOwotICAgZm9yIChpID0gMTsgaSA8PSAyNTY7IGkrKykgY2Z0YWJbaV0gKz0gY2Z0YWJbaS0xXTsKLQotICAgLyotLSBjb21wdXRlIHRoZSBUXigtMSkgdmVjdG9yIC0tKi8KLSAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKSB7Ci0gICAgICBjaCA9IChVQ2hhcilsbDhbaV07Ci0gICAgICB0dFtjZnRhYltjaF1dID0gaTsKLSAgICAgIGNmdGFiW2NoXSsrOwotICAgfQotCi0gICAvKi0tCi0gICAgICBXZSByZWNyZWF0ZSB0aGUgb3JpZ2luYWwgYnkgc3Vic2NyaXB0aW5nIEwgdGhyb3VnaCBUXigtMSkuCi0gICAgICBUaGUgcnVuLWxlbmd0aC1kZWNvZGVyIGJlbG93IHJlcXVpcmVzIGNoYXJhY3RlcnMgaW5jcmVtZW50YWxseSwKLSAgICAgIHNvIHRQb3MgaXMgc2V0IHRvIGEgc3RhcnRpbmcgdmFsdWUsIGFuZCBpcyB1cGRhdGVkIGJ5Ci0gICAgICB0aGUgR0VUX0ZBU1QgbWFjcm8uCi0gICAtLSovCi0gICB0UG9zICAgPSB0dFtvcmlnUHRyXTsKLQotICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgIC8qLS0KLSAgICAgIFRoaXMgaXMgcHJldHR5IG11Y2ggYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZQotICAgICAgcnVuLWxlbmd0aCBkZWNvZGVyIHByZXNlbnQgaW4gdGhlIGRpc3RyaWJ1dGlvbgotICAgICAgYnppcC0wLjIxOyBpdCBoYXMgdG8gYmUgaGVyZSB0byBhdm9pZCBjcmVhdGluZwotICAgICAgYmxvY2tbXSBhcyBhbiBpbnRlcm1lZGlhcnkgc3RydWN0dXJlLiAgQXMgaW4gMC4yMSwKLSAgICAgIHRoaXMgY29kZSBkZXJpdmVzIGZyb20gc29tZSBzZW50IHRvIG1lIGJ5Ci0gICAgICBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLSAgIC0tKi8KLSAgIHsKLSAgICAgIEludE5hdGl2ZSByZXRWYWw7Ci0gICAgICBJbnQzMiAgICAgaTIsIGNvdW50LCBjaFByZXYsIGNoMjsKLSAgICAgIFVJbnQzMiAgICBsb2NhbENyYzsKLQotICAgICAgY291bnQgICAgPSAwOwotICAgICAgaTIgICAgICAgPSAwOwotICAgICAgY2gyICAgICAgPSAyNTY7ICAgLyotLSBub3QgYSBjaGFyIGFuZCBub3QgRU9GIC0tKi8KLSAgICAgIGxvY2FsQ3JjID0gZ2V0R2xvYmFsQ1JDKCk7Ci0KLSAgICAgIGlmIChibG9ja1JhbmRvbWlzZWQpIHsKLSAgICAgICAgIFJBTkRfREVDTFM7Ci0gICAgICAgICB3aGlsZSAoIGkyIDw9IGxhc3QgKSB7Ci0gICAgICAgICAgICBjaFByZXYgPSBjaDI7Ci0gICAgICAgICAgICBHRVRfRkFTVChjaDIpOwotICAgICAgICAgICAgUkFORF9VUERfTUFTSzsKLSAgICAgICAgICAgIGNoMiBePSAoVUludDMyKVJBTkRfTUFTSzsKLSAgICAgICAgICAgIGkyKys7Ci0gICAKLSAgICAgICAgICAgIHJldFZhbCA9IHB1dGMgKCBjaDIsIGRzdCApOwotICAgICAgICAgICAgVVBEQVRFX0NSQyAoIGxvY2FsQ3JjLCAoVUNoYXIpY2gyICk7Ci0gICAKLSAgICAgICAgICAgIGlmIChjaDIgIT0gY2hQcmV2KSB7Ci0gICAgICAgICAgICAgICBjb3VudCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSA0KSB7Ci0gICAgICAgICAgICAgICAgICBJbnQzMiBqMjsKLSAgICAgICAgICAgICAgICAgIFVDaGFyIHo7Ci0gICAgICAgICAgICAgICAgICBHRVRfRkFTVCh6KTsKLSAgICAgICAgICAgICAgICAgIFJBTkRfVVBEX01BU0s7Ci0gICAgICAgICAgICAgICAgICB6IF49IFJBTkRfTUFTSzsKLSAgICAgICAgICAgICAgICAgIGZvciAoajIgPSAwOyAgajIgPCAoSW50MzIpejsgIGoyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHB1dGMgKGNoMiwgZHN0KTsKLSAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DUkMgKCBsb2NhbENyYywgKFVDaGFyKWNoMiApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaTIrKzsKLSAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgd2hpbGUgKCBpMiA8PSBsYXN0ICkgewotICAgICAgICAgICAgY2hQcmV2ID0gY2gyOwotICAgICAgICAgICAgR0VUX0ZBU1QoY2gyKTsKLSAgICAgICAgICAgIGkyKys7Ci0gICAKLSAgICAgICAgICAgIHJldFZhbCA9IHB1dGMgKCBjaDIsIGRzdCApOwotICAgICAgICAgICAgVVBEQVRFX0NSQyAoIGxvY2FsQ3JjLCAoVUNoYXIpY2gyICk7Ci0gICAKLSAgICAgICAgICAgIGlmIChjaDIgIT0gY2hQcmV2KSB7Ci0gICAgICAgICAgICAgICBjb3VudCA9IDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgIGlmIChjb3VudCA+PSA0KSB7Ci0gICAgICAgICAgICAgICAgICBJbnQzMiBqMjsKLSAgICAgICAgICAgICAgICAgIFVDaGFyIHo7Ci0gICAgICAgICAgICAgICAgICBHRVRfRkFTVCh6KTsKLSAgICAgICAgICAgICAgICAgIGZvciAoajIgPSAwOyAgajIgPCAoSW50MzIpejsgIGoyKyspIHsKLSAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHB1dGMgKGNoMiwgZHN0KTsKLSAgICAgICAgICAgICAgICAgICAgIFVQREFURV9DUkMgKCBsb2NhbENyYywgKFVDaGFyKWNoMiApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaTIrKzsKLSAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLQotICAgICAgfSAgIC8qLS0gaWYgKGJsb2NrUmFuZG9taXNlZCkgLS0qLwotCi0gICAgICBzZXRHbG9iYWxDUkMgKCBsb2NhbENyYyApOwotICAgfQotICAgLyotLSBlbmQgb2YgdGhlIGluLWxpbmUgcnVuLWxlbmd0aC1kZWNvZGVyLiAtLSovCi19Ci0jdW5kZWYgR0VUX0ZBU1QKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLSBUaGUgYmxvY2sgbG9hZGVyIGFuZCBSTEVyICAgICAgICAgICAgICAgICAgIC0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBUb3AgMTY6ICAgcnVuIGxlbmd0aCwgMSB0byAyNTUuCi0qICAgTG93ZXIgMTY6IHRoZSBjaGFyLCBvciBNWV9FT0YgZm9yIEVPRi4KLSovCi0KLSNkZWZpbmUgTVlfRU9GIDI1NwotCi1JTkxJTkUgSW50MzIgZ2V0UkxFcGFpciAoIEZJTEUqIHNyYyApCi17Ci0gICBJbnQzMiAgICAgcnVuTGVuZ3RoOwotICAgSW50TmF0aXZlIGNoLCBjaExhdGVzdDsKLQotICAgY2ggPSBnZXRjICggc3JjICk7Ci0KLSAgIC8qLS0tIEJlY2F1c2UgSSBoYXZlIG5vIGlkZWEgd2hhdCBraW5kIG9mIGEgdmFsdWUgRU9GIGlzLiAtLS0qLwotICAgaWYgKGNoID09IEVPRikgewotICAgICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3Ioc3JjKSk7Ci0gICAgICByZXR1cm4gKDEgPDwgMTYpIHwgTVlfRU9GOwotICAgfQotCi0gICBydW5MZW5ndGggPSAwOwotICAgZG8gewotICAgICAgY2hMYXRlc3QgPSBnZXRjICggc3JjICk7Ci0gICAgICBydW5MZW5ndGgrKzsKLSAgICAgIGJ5dGVzSW4rKzsKLSAgIH0KLSAgICAgIHdoaWxlIChjaCA9PSBjaExhdGVzdCAmJiBydW5MZW5ndGggPCAyNTUpOwotCi0gICBpZiAoIGNoTGF0ZXN0ICE9IEVPRiApIHsKLSAgICAgIGlmICggdW5nZXRjICggY2hMYXRlc3QsIHNyYyApID09IEVPRiApCi0gICAgICAgICBwYW5pYyAoICJnZXRSTEVwYWlyOiB1bmdldGMgZmFpbGVkIiApOwotICAgfSBlbHNlIHsKLSAgICAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHNyYykgKTsKLSAgIH0KLQotICAgLyotLS0gQ29uZGl0aW9uYWwgaXMganVzdCBhIHNwZWVkdXAgaGFjay4gLS0tKi8KLSAgIGlmIChydW5MZW5ndGggPT0gMSkgewotICAgICAgVVBEQVRFX0NSQyAoIGdsb2JhbENyYywgKFVDaGFyKWNoICk7Ci0gICAgICByZXR1cm4gKDEgPDwgMTYpIHwgY2g7Ci0gICB9IGVsc2UgewotICAgICAgSW50MzIgaTsKLSAgICAgIGZvciAoaSA9IDE7IGkgPD0gcnVuTGVuZ3RoOyBpKyspCi0gICAgICAgICBVUERBVEVfQ1JDICggZ2xvYmFsQ3JjLCAoVUNoYXIpY2ggKTsKLSAgICAgIHJldHVybiAocnVuTGVuZ3RoIDw8IDE2KSB8IGNoOwotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgbG9hZEFuZFJMRXNvdXJjZSAoIEZJTEUqIHNyYyApCi17Ci0gICBJbnQzMiBjaCwgYWxsb3dhYmxlQmxvY2tTaXplLCBpOwotCi0gICBsYXN0ID0gLTE7Ci0gICBjaCAgID0gMDsKLQotICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSBpblVzZVtpXSA9IEZhbHNlOwotCi0gICAvKi0tLSAyMCBpcyBqdXN0IGEgcGFyYW5vaWEgY29uc3RhbnQgLS0tKi8KLSAgIGFsbG93YWJsZUJsb2NrU2l6ZSA9IDEwMDAwMCAqIGJsb2NrU2l6ZTEwMGsgLSAyMDsKLQotICAgd2hpbGUgKGxhc3QgPCBhbGxvd2FibGVCbG9ja1NpemUgJiYgY2ggIT0gTVlfRU9GKSB7Ci0gICAgICBJbnQzMiBybGVQYWlyLCBydW5MZW47Ci0gICAgICBybGVQYWlyID0gZ2V0UkxFcGFpciAoIHNyYyApOwotICAgICAgY2ggICAgICA9IHJsZVBhaXIgJiAweEZGRkY7Ci0gICAgICBydW5MZW4gID0gKFVJbnQzMilybGVQYWlyID4+IDE2OwotCi0gICAgICAjaWYgREVCVUcKLSAgICAgICAgIGFzc2VydCAocnVuTGVuID49IDEgJiYgcnVuTGVuIDw9IDI1NSk7Ci0gICAgICAjZW5kaWYKLQotICAgICAgaWYgKGNoICE9IE1ZX0VPRikgewotICAgICAgICAgaW5Vc2VbY2hdID0gVHJ1ZTsKLSAgICAgICAgIHN3aXRjaCAocnVuTGVuKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICBsYXN0Kys7IGJsb2NrW2xhc3RdID0gKFVDaGFyKWNoOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgIGxhc3QrKzsgYmxvY2tbbGFzdF0gPSAoVUNoYXIpY2g7Ci0gICAgICAgICAgICAgICBsYXN0Kys7IGJsb2NrW2xhc3RdID0gKFVDaGFyKWNoOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgIGxhc3QrKzsgYmxvY2tbbGFzdF0gPSAoVUNoYXIpY2g7Ci0gICAgICAgICAgICAgICBsYXN0Kys7IGJsb2NrW2xhc3RdID0gKFVDaGFyKWNoOwotICAgICAgICAgICAgICAgbGFzdCsrOyBibG9ja1tsYXN0XSA9IChVQ2hhciljaDsgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgaW5Vc2VbcnVuTGVuLTRdID0gVHJ1ZTsKLSAgICAgICAgICAgICAgIGxhc3QrKzsgYmxvY2tbbGFzdF0gPSAoVUNoYXIpY2g7Ci0gICAgICAgICAgICAgICBsYXN0Kys7IGJsb2NrW2xhc3RdID0gKFVDaGFyKWNoOwotICAgICAgICAgICAgICAgbGFzdCsrOyBibG9ja1tsYXN0XSA9IChVQ2hhciljaDsKLSAgICAgICAgICAgICAgIGxhc3QrKzsgYmxvY2tbbGFzdF0gPSAoVUNoYXIpY2g7Ci0gICAgICAgICAgICAgICBsYXN0Kys7IGJsb2NrW2xhc3RdID0gKFVDaGFyKShydW5MZW4tNCk7IGJyZWFrOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qLS0tIFByb2Nlc3Npbmcgb2YgY29tcGxldGUgZmlsZXMgYW5kIHN0cmVhbXMgICAgLS0tKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQm9vbCBteWZlb2YgKCBGSUxFKiBmICkKK3sKKyAgIEludDMyIGMgPSBmZ2V0YyAoIGYgKTsKKyAgIGlmIChjID09IEVPRikgcmV0dXJuIFRydWU7CisgICB1bmdldGMgKCBjLCBmICk7CisgICByZXR1cm4gRmFsc2U7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogdm9pZCBjb21wcmVzc1N0cmVhbSAoIEZJTEUgKnN0cmVhbSwgRklMRSAqelN0cmVhbSApCiB7Ci0gICBJbnROYXRpdmUgIHJldFZhbDsKLSAgIFVJbnQzMiAgICAgYmxvY2tDUkMsIGNvbWJpbmVkQ1JDOwotICAgSW50MzIgICAgICBibG9ja05vOwotCi0gICBibG9ja05vICA9IDA7Ci0gICBieXRlc0luICA9IDA7Ci0gICBieXRlc091dCA9IDA7Ci0gICBuQmxvY2tzUmFuZG9taXNlZCA9IDA7CisgICBCWkZJTEUqIGJ6ZiA9IE5VTEw7CisgICBVQ2hhciAgIGlidWZbNTAwMF07CisgICBJbnQzMiAgIG5JYnVmOworICAgVUludDMyICBuYnl0ZXNfaW4sIG5ieXRlc19vdXQ7CisgICBJbnQzMiAgIGJ6ZXJyLCBiemVycl9kdW1teSwgcmV0OwogCiAgICBTRVRfQklOQVJZX01PREUoc3RyZWFtKTsKICAgIFNFVF9CSU5BUllfTU9ERSh6U3RyZWFtKTsKIAotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3Ioc3RyZWFtKSApOwotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKKyAgIGlmIChmZXJyb3Ioc3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOworICAgaWYgKGZlcnJvcih6U3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOwogCi0gICBic1NldFN0cmVhbSAoIHpTdHJlYW0sIFRydWUgKTsKLQotICAgLyotLS0gV3JpdGUgYG1hZ2ljJyBieXRlcyBCIGFuZCBaLAotICAgICAgICAgdGhlbiBoIGluZGljYXRpbmcgZmlsZS1mb3JtYXQgPT0gaHVmZm1hbmlzZWQsCi0gICAgICAgICBmb2xsb3dlZCBieSBhIGRpZ2l0IGluZGljYXRpbmcgYmxvY2tTaXplMTAway4KLSAgIC0tLSovCi0gICBic1B1dFVDaGFyICggJ0InICk7Ci0gICBic1B1dFVDaGFyICggJ1onICk7Ci0gICBic1B1dFVDaGFyICggJ2gnICk7Ci0gICBic1B1dFVDaGFyICggJzAnICsgYmxvY2tTaXplMTAwayApOwotCi0gICBjb21iaW5lZENSQyA9IDA7CisgICBiemYgPSBieldyaXRlT3BlbiAoICZiemVyciwgelN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZTEwMGssIHZlcmJvc2l0eSwgd29ya0ZhY3RvciApOyAgIAorICAgaWYgKGJ6ZXJyICE9IEJaX09LKSBnb3RvIGVycmhhbmRsZXI7CiAKICAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIlxuIiApOwogCiAgICB3aGlsZSAoVHJ1ZSkgewogCi0gICAgICBibG9ja05vKys7Ci0gICAgICBpbml0aWFsaXNlQ1JDICgpOwotICAgICAgbG9hZEFuZFJMRXNvdXJjZSAoIHN0cmVhbSApOwotICAgICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3Ioc3RyZWFtKSApOwotICAgICAgaWYgKGxhc3QgPT0gLTEpIGJyZWFrOworICAgICAgaWYgKG15ZmVvZihzdHJlYW0pKSBicmVhazsKKyAgICAgIG5JYnVmID0gZnJlYWQgKCBpYnVmLCBzaXplb2YoVUNoYXIpLCA1MDAwLCBzdHJlYW0gKTsKKyAgICAgIGlmIChmZXJyb3Ioc3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOworICAgICAgaWYgKG5JYnVmID4gMCkgYnpXcml0ZSAoICZiemVyciwgYnpmLCAodm9pZCopaWJ1ZiwgbklidWYgKTsKKyAgICAgIGlmIChiemVyciAhPSBCWl9PSykgZ290byBlcnJoYW5kbGVyOwogCi0gICAgICBibG9ja0NSQyA9IGdldEZpbmFsQ1JDICgpOwotICAgICAgY29tYmluZWRDUkMgPSAoY29tYmluZWRDUkMgPDwgMSkgfCAoY29tYmluZWRDUkMgPj4gMzEpOwotICAgICAgY29tYmluZWRDUkMgXj0gYmxvY2tDUkM7Ci0KLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMikKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgICAgYmxvY2sgJWQ6IGNyYyA9IDB4JTh4LCBjb21iaW5lZCBDUkMgPSAweCU4eCwgc2l6ZSA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTm8sIGJsb2NrQ1JDLCBjb21iaW5lZENSQywgbGFzdCsxICk7Ci0KLSAgICAgIC8qLS0gc29ydCB0aGUgYmxvY2sgYW5kIGVzdGFibGlzaCBwb3NuIG9mIG9yaWdpbmFsIHN0cmluZyAtLSovCi0gICAgICBkb1JldmVyc2libGVUcmFuc2Zvcm1hdGlvbiAoKTsKLQotICAgICAgLyotLQotICAgICAgICBBIDYtYnl0ZSBibG9jayBoZWFkZXIsIHRoZSB2YWx1ZSBjaG9zZW4gYXJiaXRyYXJpbHkKLSAgICAgICAgYXMgMHgzMTQxNTkyNjUzNTkgOi0pLiAgQSAzMiBiaXQgdmFsdWUgZG9lcyBub3QgcmVhbGx5Ci0gICAgICAgIGdpdmUgYSBzdHJvbmcgZW5vdWdoIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSB3aWxsIG5vdAotICAgICAgICBhcHBlYXIgYnkgY2hhbmNlIGluIHRoZSBjb21wcmVzc2VkIGRhdGFzdHJlYW0uICBXb3JzdC1jYXNlCi0gICAgICAgIHByb2JhYmlsaXR5IG9mIHRoaXMgZXZlbnQsIGZvciBhIDkwMGsgYmxvY2ssIGlzIGFib3V0Ci0gICAgICAgIDIuMGUtMyBmb3IgMzIgYml0cywgMS4wZS01IGZvciA0MCBiaXRzIGFuZCA0LjBlLTggZm9yIDQ4IGJpdHMuCi0gICAgICAgIEZvciBhIGNvbXByZXNzZWQgZmlsZSBvZiBzaXplIDEwMEdiIC0tIGFib3V0IDEwMDAwMCBibG9ja3MgLS0KLSAgICAgICAgb25seSBhIDQ4LWJpdCBtYXJrZXIgd2lsbCBkby4gIE5COiBub3JtYWwgY29tcHJlc3Npb24vCi0gICAgICAgIGRlY29tcHJlc3Npb24gZG8gKm5vdCogcmVseSBvbiB0aGVzZSBzdGF0aXN0aWNhbCBwcm9wZXJ0aWVzLgotICAgICAgICBUaGV5IGFyZSBvbmx5IGltcG9ydGFudCB3aGVuIHRyeWluZyB0byByZWNvdmVyIGJsb2NrcyBmcm9tCi0gICAgICAgIGRhbWFnZWQgZmlsZXMuCi0gICAgICAtLSovCi0gICAgICBic1B1dFVDaGFyICggMHgzMSApOyBic1B1dFVDaGFyICggMHg0MSApOwotICAgICAgYnNQdXRVQ2hhciAoIDB4NTkgKTsgYnNQdXRVQ2hhciAoIDB4MjYgKTsKLSAgICAgIGJzUHV0VUNoYXIgKCAweDUzICk7IGJzUHV0VUNoYXIgKCAweDU5ICk7Ci0KLSAgICAgIC8qLS0gTm93IHRoZSBibG9jaydzIENSQywgc28gaXQgaXMgaW4gYSBrbm93biBwbGFjZS4gLS0qLwotICAgICAgYnNQdXRVSW50MzIgKCBibG9ja0NSQyApOwotCi0gICAgICAvKi0tIE5vdyBhIHNpbmdsZSBiaXQgaW5kaWNhdGluZyByYW5kb21pc2F0aW9uLiAtLSovCi0gICAgICBpZiAoYmxvY2tSYW5kb21pc2VkKSB7Ci0gICAgICAgICBic1coMSwxKTsgbkJsb2Nrc1JhbmRvbWlzZWQrKzsKLSAgICAgIH0gZWxzZQotICAgICAgICAgYnNXKDEsMCk7Ci0KLSAgICAgIC8qLS0gRmluYWxseSwgYmxvY2sncyBjb250ZW50cyBwcm9wZXIuIC0tKi8KLSAgICAgIG1vdmVUb0Zyb250Q29kZUFuZFNlbmQgKCk7Ci0KLSAgICAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHpTdHJlYW0pICk7CiAgICB9CiAKLSAgIGlmICh2ZXJib3NpdHkgPj0gMiAmJiBuQmxvY2tzUmFuZG9taXNlZCA+IDApCi0gICAgICBmcHJpbnRmICggc3RkZXJyLCAiICAgICVkIGJsb2NrJXMgbmVlZGVkIHJhbmRvbWlzYXRpb25cbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgbkJsb2Nrc1JhbmRvbWlzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBuQmxvY2tzUmFuZG9taXNlZCA9PSAxID8gIiIgOiAicyIgKTsKKyAgIGJ6V3JpdGVDbG9zZSAoICZiemVyciwgYnpmLCAwLCAmbmJ5dGVzX2luLCAmbmJ5dGVzX291dCApOworICAgaWYgKGJ6ZXJyICE9IEJaX09LKSBnb3RvIGVycmhhbmRsZXI7CiAKLSAgIC8qLS0KLSAgICAgIE5vdyBhbm90aGVyIG1hZ2ljIDQ4LWJpdCBudW1iZXIsIDB4MTc3MjQ1Mzg1MDkwLCB0bwotICAgICAgaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGFzdCBibG9jay4gIChzcXJ0KHBpKSwgaWYKLSAgICAgIHlvdSB3YW50IHRvIGtub3cuICBJIGRpZCB3YW50IHRvIHVzZSBlLCBidXQgaXQgY29udGFpbnMKLSAgICAgIHRvbyBtdWNoIHJlcGV0aXRpb24gLS0gMjcgMTggMjggMTggMjggNDYgLS0gZm9yIG1lCi0gICAgICB0byBmZWVsIHN0YXRpc3RpY2FsbHkgY29tZm9ydGFibGUuICBDYWxsIG1lIHBhcmFub2lkLikKLSAgIC0tKi8KKyAgIGlmIChmZXJyb3IoelN0cmVhbSkpIGdvdG8gZXJyaGFuZGxlcl9pbzsKKyAgIHJldCA9IGZmbHVzaCAoIHpTdHJlYW0gKTsKKyAgIGlmIChyZXQgPT0gRU9GKSBnb3RvIGVycmhhbmRsZXJfaW87CisgICBpZiAoelN0cmVhbSAhPSBzdGRvdXQpIHsKKyAgICAgIHJldCA9IGZjbG9zZSAoIHpTdHJlYW0gKTsKKyAgICAgIGlmIChyZXQgPT0gRU9GKSBnb3RvIGVycmhhbmRsZXJfaW87CisgICB9CisgICBpZiAoZmVycm9yKHN0cmVhbSkpIGdvdG8gZXJyaGFuZGxlcl9pbzsKKyAgIHJldCA9IGZjbG9zZSAoIHN0cmVhbSApOworICAgaWYgKHJldCA9PSBFT0YpIGdvdG8gZXJyaGFuZGxlcl9pbzsKIAotICAgYnNQdXRVQ2hhciAoIDB4MTcgKTsgYnNQdXRVQ2hhciAoIDB4NzIgKTsKLSAgIGJzUHV0VUNoYXIgKCAweDQ1ICk7IGJzUHV0VUNoYXIgKCAweDM4ICk7Ci0gICBic1B1dFVDaGFyICggMHg1MCApOyBic1B1dFVDaGFyICggMHg5MCApOwotCi0gICBic1B1dFVJbnQzMiAoIGNvbWJpbmVkQ1JDICk7Ci0gICBpZiAodmVyYm9zaXR5ID49IDIpCi0gICAgICBmcHJpbnRmICggc3RkZXJyLCAiICAgIGZpbmFsIGNvbWJpbmVkIENSQyA9IDB4JXhcbiAgICIsIGNvbWJpbmVkQ1JDICk7Ci0KLSAgIC8qLS0gQ2xvc2UgdGhlIGZpbGVzIGluIGFuIHV0dGVybHkgcGFyYW5vaWQgd2F5LiAtLSovCi0gICBic0ZpbmlzaGVkV2l0aFN0cmVhbSAoKTsKLQotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKLSAgIHJldFZhbCA9IGZmbHVzaCAoIHpTdHJlYW0gKTsKLSAgIEVSUk9SX0lGX0VPRiAoIHJldFZhbCApOwotICAgcmV0VmFsID0gZmNsb3NlICggelN0cmVhbSApOwotICAgRVJST1JfSUZfRU9GICggcmV0VmFsICk7Ci0KLSAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHN0cmVhbSkgKTsKLSAgIHJldFZhbCA9IGZjbG9zZSAoIHN0cmVhbSApOwotICAgRVJST1JfSUZfRU9GICggcmV0VmFsICk7Ci0KLSAgIGlmIChieXRlc0luID09IDApIGJ5dGVzSW4gPSAxOwotICAgaWYgKGJ5dGVzT3V0ID09IDApIGJ5dGVzT3V0ID0gMTsKKyAgIGlmIChuYnl0ZXNfaW4gPT0gMCkgbmJ5dGVzX2luID0gMTsKIAogICAgaWYgKHZlcmJvc2l0eSA+PSAxKQogICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiU2LjNmOjEsICU2LjNmIGJpdHMvYnl0ZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJmJSUgc2F2ZWQsICVkIGluLCAlZCBvdXQuXG4iLAotICAgICAgICAgICAgICAgIChmbG9hdClieXRlc0luIC8gKGZsb2F0KWJ5dGVzT3V0LAotICAgICAgICAgICAgICAgICg4LjAgKiAoZmxvYXQpYnl0ZXNPdXQpIC8gKGZsb2F0KWJ5dGVzSW4sCi0gICAgICAgICAgICAgICAgMTAwLjAgKiAoMS4wIC0gKGZsb2F0KWJ5dGVzT3V0IC8gKGZsb2F0KWJ5dGVzSW4pLAotICAgICAgICAgICAgICAgIGJ5dGVzSW4sCi0gICAgICAgICAgICAgICAgYnl0ZXNPdXQKKyAgICAgICAgICAgICAgICAoZmxvYXQpbmJ5dGVzX2luIC8gKGZsb2F0KW5ieXRlc19vdXQsCisgICAgICAgICAgICAgICAgKDguMCAqIChmbG9hdCluYnl0ZXNfb3V0KSAvIChmbG9hdCluYnl0ZXNfaW4sCisgICAgICAgICAgICAgICAgMTAwLjAgKiAoMS4wIC0gKGZsb2F0KW5ieXRlc19vdXQgLyAoZmxvYXQpbmJ5dGVzX2luKSwKKyAgICAgICAgICAgICAgICBuYnl0ZXNfaW4sCisgICAgICAgICAgICAgICAgbmJ5dGVzX291dAogICAgICAgICAgICAgICApOworCisgICByZXR1cm47CisKKyAgIGVycmhhbmRsZXI6CisgICBieldyaXRlQ2xvc2UgKCAmYnplcnJfZHVtbXksIGJ6ZiwgMSwgJm5ieXRlc19pbiwgJm5ieXRlc19vdXQgKTsKKyAgIHN3aXRjaCAoYnplcnIpIHsKKyAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgorICAgICAgICAgb3V0T2ZNZW1vcnkgKCk7CisgICAgICBjYXNlIEJaX0lPX0VSUk9SOgorICAgICAgICAgZXJyaGFuZGxlcl9pbzoKKyAgICAgICAgIGlvRXJyb3IoKTsgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcGFuaWMgKCAiY29tcHJlc3M6dW5leHBlY3RlZCBlcnJvciIgKTsKKyAgIH0KKworICAgcGFuaWMgKCAiY29tcHJlc3M6ZW5kIiApOworICAgLypub3RyZWFjaGVkKi8KIH0KIAogCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIEJvb2wgdW5jb21wcmVzc1N0cmVhbSAoIEZJTEUgKnpTdHJlYW0sIEZJTEUgKnN0cmVhbSApCiB7Ci0gICBVQ2hhciAgICAgIG1hZ2ljMSwgbWFnaWMyLCBtYWdpYzMsIG1hZ2ljNDsKLSAgIFVDaGFyICAgICAgbWFnaWM1LCBtYWdpYzY7Ci0gICBVSW50MzIgICAgIHN0b3JlZEJsb2NrQ1JDLCBzdG9yZWRDb21iaW5lZENSQzsKLSAgIFVJbnQzMiAgICAgY29tcHV0ZWRCbG9ja0NSQywgY29tcHV0ZWRDb21iaW5lZENSQzsKLSAgIEludDMyICAgICAgY3VyckJsb2NrTm87Ci0gICBJbnROYXRpdmUgIHJldFZhbDsKKyAgIEJaRklMRSogYnpmID0gTlVMTDsKKyAgIEludDMyICAgYnplcnIsIGJ6ZXJyX2R1bW15LCByZXQsIG5yZWFkLCBzdHJlYW1ObywgaTsKKyAgIFVDaGFyICAgb2J1Zls1MDAwXTsKKyAgIFVDaGFyICAgdW51c2VkW0JaX01BWF9VTlVTRURdOworICAgSW50MzIgICBuVW51c2VkOworICAgVUNoYXIqICB1bnVzZWRUbXA7CisKKyAgIG5VbnVzZWQgPSAwOworICAgc3RyZWFtTm8gPSAwOwogCiAgICBTRVRfQklOQVJZX01PREUoc3RyZWFtKTsKICAgIFNFVF9CSU5BUllfTU9ERSh6U3RyZWFtKTsKIAotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3Ioc3RyZWFtKSApOwotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKLQotICAgYnNTZXRTdHJlYW0gKCB6U3RyZWFtLCBGYWxzZSApOwotCi0gICAvKi0tCi0gICAgICBBIGJhZCBtYWdpYyBudW1iZXIgaXMgYHJlY292ZXJhYmxlIGZyb20nOwotICAgICAgcmV0dXJuIHdpdGggRmFsc2Ugc28gdGhlIGNhbGxlciBza2lwcyB0aGUgZmlsZS4KLSAgIC0tKi8KLSAgIG1hZ2ljMSA9IGJzR2V0VUNoYXIgKCk7Ci0gICBtYWdpYzIgPSBic0dldFVDaGFyICgpOwotICAgbWFnaWMzID0gYnNHZXRVQ2hhciAoKTsKLSAgIG1hZ2ljNCA9IGJzR2V0VUNoYXIgKCk7Ci0gICBpZiAobWFnaWMxICE9ICdCJyB8fAotICAgICAgIG1hZ2ljMiAhPSAnWicgfHwKLSAgICAgICBtYWdpYzMgIT0gJ2gnIHx8Ci0gICAgICAgbWFnaWM0IDwgJzEnICB8fAotICAgICAgIG1hZ2ljNCA+ICc5JykgewotICAgICBic0ZpbmlzaGVkV2l0aFN0cmVhbSgpOwotICAgICByZXRWYWwgPSBmY2xvc2UgKCBzdHJlYW0gKTsKLSAgICAgRVJST1JfSUZfRU9GICggcmV0VmFsICk7Ci0gICAgIHJldHVybiBGYWxzZTsKLSAgIH0KLQotICAgc2V0RGVjb21wcmVzc1N0cnVjdHVyZVNpemVzICggbWFnaWM0IC0gJzAnICk7Ci0gICBjb21wdXRlZENvbWJpbmVkQ1JDID0gMDsKLQotICAgaWYgKHZlcmJvc2l0eSA+PSAyKSBmcHJpbnRmICggc3RkZXJyLCAiXG4gICAgIiApOwotICAgY3VyckJsb2NrTm8gPSAwOworICAgaWYgKGZlcnJvcihzdHJlYW0pKSBnb3RvIGVycmhhbmRsZXJfaW87CisgICBpZiAoZmVycm9yKHpTdHJlYW0pKSBnb3RvIGVycmhhbmRsZXJfaW87CiAKICAgIHdoaWxlIChUcnVlKSB7Ci0gICAgICBtYWdpYzEgPSBic0dldFVDaGFyICgpOwotICAgICAgbWFnaWMyID0gYnNHZXRVQ2hhciAoKTsKLSAgICAgIG1hZ2ljMyA9IGJzR2V0VUNoYXIgKCk7Ci0gICAgICBtYWdpYzQgPSBic0dldFVDaGFyICgpOwotICAgICAgbWFnaWM1ID0gYnNHZXRVQ2hhciAoKTsKLSAgICAgIG1hZ2ljNiA9IGJzR2V0VUNoYXIgKCk7Ci0gICAgICBpZiAobWFnaWMxID09IDB4MTcgJiYgbWFnaWMyID09IDB4NzIgJiYKLSAgICAgICAgICBtYWdpYzMgPT0gMHg0NSAmJiBtYWdpYzQgPT0gMHgzOCAmJgotICAgICAgICAgIG1hZ2ljNSA9PSAweDUwICYmIG1hZ2ljNiA9PSAweDkwKSBicmVhazsKIAotICAgICAgaWYgKG1hZ2ljMSAhPSAweDMxIHx8IG1hZ2ljMiAhPSAweDQxIHx8Ci0gICAgICAgICAgbWFnaWMzICE9IDB4NTkgfHwgbWFnaWM0ICE9IDB4MjYgfHwKLSAgICAgICAgICBtYWdpYzUgIT0gMHg1MyB8fCBtYWdpYzYgIT0gMHg1OSkgYmFkQmxvY2tIZWFkZXIoKTsKKyAgICAgIGJ6ZiA9IGJ6UmVhZE9wZW4gKCAKKyAgICAgICAgICAgICAgICZiemVyciwgelN0cmVhbSwgdmVyYm9zaXR5LCAKKyAgICAgICAgICAgICAgIChpbnQpc21hbGxNb2RlLCB1bnVzZWQsIG5VbnVzZWQKKyAgICAgICAgICAgICk7CisgICAgICBpZiAoYnpmID09IE5VTEwgfHwgYnplcnIgIT0gQlpfT0spIGdvdG8gZXJyaGFuZGxlcjsKKyAgICAgIHN0cmVhbU5vKys7CiAKLSAgICAgIHN0b3JlZEJsb2NrQ1JDID0gYnNHZXRVSW50MzIgKCk7CisgICAgICB3aGlsZSAoYnplcnIgPT0gQlpfT0spIHsKKyAgICAgICAgIG5yZWFkID0gYnpSZWFkICggJmJ6ZXJyLCBiemYsIG9idWYsIDUwMDAgKTsKKyAgICAgICAgIGlmIChiemVyciA9PSBCWl9EQVRBX0VSUk9SX01BR0lDKSBnb3RvIGVycmhhbmRsZXI7CisgICAgICAgICBpZiAoKGJ6ZXJyID09IEJaX09LIHx8IGJ6ZXJyID09IEJaX1NUUkVBTV9FTkQpICYmIG5yZWFkID4gMCkKKyAgICAgICAgICAgIGZ3cml0ZSAoIG9idWYsIHNpemVvZihVQ2hhciksIG5yZWFkLCBzdHJlYW0gKTsKKyAgICAgICAgIGlmIChmZXJyb3Ioc3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOworICAgICAgfQorICAgICAgaWYgKGJ6ZXJyICE9IEJaX1NUUkVBTV9FTkQpIGdvdG8gZXJyaGFuZGxlcjsKIAotICAgICAgaWYgKGJzUigxKSA9PSAxKQotICAgICAgICAgYmxvY2tSYW5kb21pc2VkID0gVHJ1ZTsgZWxzZQotICAgICAgICAgYmxvY2tSYW5kb21pc2VkID0gRmFsc2U7CisgICAgICBielJlYWRHZXRVbnVzZWQgKCAmYnplcnIsIGJ6ZiwgKHZvaWQqKikoJnVudXNlZFRtcCksICZuVW51c2VkICk7CisgICAgICBpZiAoYnplcnIgIT0gQlpfT0spIHBhbmljICggImRlY29tcHJlc3M6YnpSZWFkR2V0VW51c2VkIiApOwogCi0gICAgICBjdXJyQmxvY2tObysrOwotICAgICAgaWYgKHZlcmJvc2l0eSA+PSAyKQotICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIlslZDogaHVmZittdGYgIiwgY3VyckJsb2NrTm8gKTsKLSAgICAgIGdldEFuZE1vdmVUb0Zyb250RGVjb2RlICgpOwotICAgICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuVW51c2VkOyBpKyspIHVudXNlZFtpXSA9IHVudXNlZFRtcFtpXTsKIAotICAgICAgaW5pdGlhbGlzZUNSQygpOwotICAgICAgaWYgKHZlcmJvc2l0eSA+PSAyKSBmcHJpbnRmICggc3RkZXJyLCAicnQrcmxkIiApOwotICAgICAgaWYgKHNtYWxsTW9kZSkKLSAgICAgICAgIHVuZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb25fc21hbGwgKCBzdHJlYW0gKTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHVuZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb25fZmFzdCAgKCBzdHJlYW0gKTsKKyAgICAgIGJ6UmVhZENsb3NlICggJmJ6ZXJyLCBiemYgKTsKKyAgICAgIGlmIChiemVyciAhPSBCWl9PSykgcGFuaWMgKCAiZGVjb21wcmVzczpielJlYWRHZXRVbnVzZWQiICk7CiAKLSAgICAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHN0cmVhbSkgKTsKKyAgICAgIGlmIChuVW51c2VkID09IDAgJiYgbXlmZW9mKHpTdHJlYW0pKSBicmVhazsKIAotICAgICAgY29tcHV0ZWRCbG9ja0NSQyA9IGdldEZpbmFsQ1JDKCk7Ci0gICAgICBpZiAodmVyYm9zaXR5ID49IDMpCi0gICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiIHsweCV4LCAweCV4fSIsIHN0b3JlZEJsb2NrQ1JDLCBjb21wdXRlZEJsb2NrQ1JDICk7Ci0gICAgICBpZiAodmVyYm9zaXR5ID49IDIpIGZwcmludGYgKCBzdGRlcnIsICJdICIgKTsKLQotICAgICAgLyotLSBBIGJhZCBDUkMgaXMgY29uc2lkZXJlZCBhIGZhdGFsIGVycm9yLiAtLSovCi0gICAgICBpZiAoc3RvcmVkQmxvY2tDUkMgIT0gY29tcHV0ZWRCbG9ja0NSQykKLSAgICAgICAgIGNyY0Vycm9yICggc3RvcmVkQmxvY2tDUkMsIGNvbXB1dGVkQmxvY2tDUkMgKTsKLQotICAgICAgY29tcHV0ZWRDb21iaW5lZENSQyA9IChjb21wdXRlZENvbWJpbmVkQ1JDIDw8IDEpIHwgKGNvbXB1dGVkQ29tYmluZWRDUkMgPj4gMzEpOwotICAgICAgY29tcHV0ZWRDb21iaW5lZENSQyBePSBjb21wdXRlZEJsb2NrQ1JDOwotICAgfTsKLQotICAgaWYgKHZlcmJvc2l0eSA+PSAyKSBmcHJpbnRmICggc3RkZXJyLCAiXG4gICAgIiApOwotCi0gICBzdG9yZWRDb21iaW5lZENSQyAgPSBic0dldFVJbnQzMiAoKTsKLSAgIGlmICh2ZXJib3NpdHkgPj0gMikKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgImNvbWJpbmVkIENSQ3M6IHN0b3JlZCA9IDB4JXgsIGNvbXB1dGVkID0gMHgleFxuICAgICIsCi0gICAgICAgICAgICAgICAgc3RvcmVkQ29tYmluZWRDUkMsIGNvbXB1dGVkQ29tYmluZWRDUkMgKTsKLSAgIGlmIChzdG9yZWRDb21iaW5lZENSQyAhPSBjb21wdXRlZENvbWJpbmVkQ1JDKQotICAgICAgY3JjRXJyb3IgKCBzdG9yZWRDb21iaW5lZENSQywgY29tcHV0ZWRDb21iaW5lZENSQyApOwotCi0KLSAgIGJzRmluaXNoZWRXaXRoU3RyZWFtICgpOwotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKLSAgIHJldFZhbCA9IGZjbG9zZSAoIHpTdHJlYW0gKTsKLSAgIEVSUk9SX0lGX0VPRiAoIHJldFZhbCApOwotCi0gICBFUlJPUl9JRl9OT1RfWkVSTyAoIGZlcnJvcihzdHJlYW0pICk7Ci0gICByZXRWYWwgPSBmZmx1c2ggKCBzdHJlYW0gKTsKLSAgIEVSUk9SX0lGX05PVF9aRVJPICggcmV0VmFsICk7Ci0gICBpZiAoc3RyZWFtICE9IHN0ZG91dCkgewotICAgICAgcmV0VmFsID0gZmNsb3NlICggc3RyZWFtICk7Ci0gICAgICBFUlJPUl9JRl9FT0YgKCByZXRWYWwgKTsKICAgIH0KKworICAgaWYgKGZlcnJvcih6U3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOworICAgcmV0ID0gZmNsb3NlICggelN0cmVhbSApOworICAgaWYgKHJldCA9PSBFT0YpIGdvdG8gZXJyaGFuZGxlcl9pbzsKKworICAgaWYgKGZlcnJvcihzdHJlYW0pKSBnb3RvIGVycmhhbmRsZXJfaW87CisgICByZXQgPSBmZmx1c2ggKCBzdHJlYW0gKTsKKyAgIGlmIChyZXQgIT0gMCkgZ290byBlcnJoYW5kbGVyX2lvOworICAgaWYgKHN0cmVhbSAhPSBzdGRvdXQpIHsKKyAgICAgIHJldCA9IGZjbG9zZSAoIHN0cmVhbSApOworICAgICAgaWYgKHJldCA9PSBFT0YpIGdvdG8gZXJyaGFuZGxlcl9pbzsKKyAgIH0KKyAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIlxuICAgICIgKTsKICAgIHJldHVybiBUcnVlOworCisgICBlcnJoYW5kbGVyOgorICAgYnpSZWFkQ2xvc2UgKCAmYnplcnJfZHVtbXksIGJ6ZiApOworICAgc3dpdGNoIChiemVycikgeworICAgICAgY2FzZSBCWl9JT19FUlJPUjoKKyAgICAgICAgIGVycmhhbmRsZXJfaW86CisgICAgICAgICBpb0Vycm9yKCk7IGJyZWFrOworICAgICAgY2FzZSBCWl9EQVRBX0VSUk9SOgorICAgICAgICAgY3JjRXJyb3IoKTsKKyAgICAgIGNhc2UgQlpfTUVNX0VSUk9SOgorICAgICAgICAgb3V0T2ZNZW1vcnkoKTsKKyAgICAgIGNhc2UgQlpfVU5FWFBFQ1RFRF9FT0Y6CisgICAgICAgICBjb21wcmVzc2VkU3RyZWFtRU9GKCk7CisgICAgICBjYXNlIEJaX0RBVEFfRVJST1JfTUFHSUM6CisgICAgICAgICBpZiAoc3RyZWFtTm8gPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZhbHNlOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsIAorICAgICAgICAgICAgICAgICAgICAgICJcbiVzOiAlczogdHJhaWxpbmcgZ2FyYmFnZSBhZnRlciBFT0YgaWdub3JlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9nTmFtZSwgaW5OYW1lICk7CisgICAgICAgICAgICByZXR1cm4gVHJ1ZTsgICAgICAgCisgICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcGFuaWMgKCAiZGVjb21wcmVzczp1bmV4cGVjdGVkIGVycm9yIiApOworICAgfQorCisgICBwYW5pYyAoICJkZWNvbXByZXNzOmVuZCIgKTsKKyAgIHJldHVybiBUcnVlOyAvKm5vdHJlYWNoZWQqLwogfQogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIEJvb2wgdGVzdFN0cmVhbSAoIEZJTEUgKnpTdHJlYW0gKQogewotICAgVUNoYXIgICAgICBtYWdpYzEsIG1hZ2ljMiwgbWFnaWMzLCBtYWdpYzQ7Ci0gICBVQ2hhciAgICAgIG1hZ2ljNSwgbWFnaWM2OwotICAgVUludDMyICAgICBzdG9yZWRCbG9ja0NSQywgc3RvcmVkQ29tYmluZWRDUkM7Ci0gICBVSW50MzIgICAgIGNvbXB1dGVkQmxvY2tDUkMsIGNvbXB1dGVkQ29tYmluZWRDUkM7Ci0gICBJbnQzMiAgICAgIGN1cnJCbG9ja05vOwotICAgSW50TmF0aXZlICByZXRWYWw7CisgICBCWkZJTEUqIGJ6ZiA9IE5VTEw7CisgICBJbnQzMiAgIGJ6ZXJyLCBiemVycl9kdW1teSwgcmV0LCBucmVhZCwgc3RyZWFtTm8sIGk7CisgICBVQ2hhciAgIG9idWZbNTAwMF07CisgICBVQ2hhciAgIHVudXNlZFtCWl9NQVhfVU5VU0VEXTsKKyAgIEludDMyICAgblVudXNlZDsKKyAgIFVDaGFyKiAgdW51c2VkVG1wOworCisgICBuVW51c2VkID0gMDsKKyAgIHN0cmVhbU5vID0gMDsKIAogICAgU0VUX0JJTkFSWV9NT0RFKHpTdHJlYW0pOwotICAgRVJST1JfSUZfTk9UX1pFUk8gKCBmZXJyb3IoelN0cmVhbSkgKTsKLQotICAgYnNTZXRTdHJlYW0gKCB6U3RyZWFtLCBGYWxzZSApOwotCi0gICBtYWdpYzEgPSBic0dldFVDaGFyICgpOwotICAgbWFnaWMyID0gYnNHZXRVQ2hhciAoKTsKLSAgIG1hZ2ljMyA9IGJzR2V0VUNoYXIgKCk7Ci0gICBtYWdpYzQgPSBic0dldFVDaGFyICgpOwotICAgaWYgKG1hZ2ljMSAhPSAnQicgfHwKLSAgICAgICBtYWdpYzIgIT0gJ1onIHx8Ci0gICAgICAgbWFnaWMzICE9ICdoJyB8fAotICAgICAgIG1hZ2ljNCA8ICcxJyAgfHwKLSAgICAgICBtYWdpYzQgPiAnOScpIHsKLSAgICAgYnNGaW5pc2hlZFdpdGhTdHJlYW0oKTsKLSAgICAgZmNsb3NlICggelN0cmVhbSApOwotICAgICBmcHJpbnRmICggc3RkZXJyLCAiXG4lczogYmFkIG1hZ2ljIG51bWJlciAoaWUsIG5vdCBjcmVhdGVkIGJ5IGJ6aXAyKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lICk7Ci0gICAgIHJldHVybiBGYWxzZTsKLSAgIH0KLQotICAgc21hbGxNb2RlID0gVHJ1ZTsKLSAgIHNldERlY29tcHJlc3NTdHJ1Y3R1cmVTaXplcyAoIG1hZ2ljNCAtICcwJyApOwotICAgY29tcHV0ZWRDb21iaW5lZENSQyA9IDA7Ci0KLSAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIlxuIiApOwotICAgY3VyckJsb2NrTm8gPSAwOworICAgaWYgKGZlcnJvcih6U3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOwogCiAgICB3aGlsZSAoVHJ1ZSkgewotICAgICAgbWFnaWMxID0gYnNHZXRVQ2hhciAoKTsKLSAgICAgIG1hZ2ljMiA9IGJzR2V0VUNoYXIgKCk7Ci0gICAgICBtYWdpYzMgPSBic0dldFVDaGFyICgpOwotICAgICAgbWFnaWM0ID0gYnNHZXRVQ2hhciAoKTsKLSAgICAgIG1hZ2ljNSA9IGJzR2V0VUNoYXIgKCk7Ci0gICAgICBtYWdpYzYgPSBic0dldFVDaGFyICgpOwotICAgICAgaWYgKG1hZ2ljMSA9PSAweDE3ICYmIG1hZ2ljMiA9PSAweDcyICYmCi0gICAgICAgICAgbWFnaWMzID09IDB4NDUgJiYgbWFnaWM0ID09IDB4MzggJiYKLSAgICAgICAgICBtYWdpYzUgPT0gMHg1MCAmJiBtYWdpYzYgPT0gMHg5MCkgYnJlYWs7CiAKLSAgICAgIGN1cnJCbG9ja05vKys7Ci0gICAgICBpZiAobWFnaWMxICE9IDB4MzEgfHwgbWFnaWMyICE9IDB4NDEgfHwKLSAgICAgICAgICBtYWdpYzMgIT0gMHg1OSB8fCBtYWdpYzQgIT0gMHgyNiB8fAotICAgICAgICAgIG1hZ2ljNSAhPSAweDUzIHx8IG1hZ2ljNiAhPSAweDU5KSB7Ci0gICAgICAgICBic0ZpbmlzaGVkV2l0aFN0cmVhbSgpOwotICAgICAgICAgZmNsb3NlICggelN0cmVhbSApOwotICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAiXG4lcywgYmxvY2sgJWQ6IGJhZCBoZWFkZXIgKG5vdCA9PSAweDMxNDE1OTI2NTM1OSlcbiIsCi0gICAgICAgICAgICAgICAgICAgaW5OYW1lLCBjdXJyQmxvY2tObyApOwotICAgICAgICAgcmV0dXJuIEZhbHNlOworICAgICAgYnpmID0gYnpSZWFkT3BlbiAoIAorICAgICAgICAgICAgICAgJmJ6ZXJyLCB6U3RyZWFtLCB2ZXJib3NpdHksIAorICAgICAgICAgICAgICAgKGludClzbWFsbE1vZGUsIHVudXNlZCwgblVudXNlZAorICAgICAgICAgICAgKTsKKyAgICAgIGlmIChiemYgPT0gTlVMTCB8fCBiemVyciAhPSBCWl9PSykgZ290byBlcnJoYW5kbGVyOworICAgICAgc3RyZWFtTm8rKzsKKworICAgICAgd2hpbGUgKGJ6ZXJyID09IEJaX09LKSB7CisgICAgICAgICBucmVhZCA9IGJ6UmVhZCAoICZiemVyciwgYnpmLCBvYnVmLCA1MDAwICk7CisgICAgICAgICBpZiAoYnplcnIgPT0gQlpfREFUQV9FUlJPUl9NQUdJQykgZ290byBlcnJoYW5kbGVyOwogICAgICAgfQotICAgICAgc3RvcmVkQmxvY2tDUkMgPSBic0dldFVJbnQzMiAoKTsKKyAgICAgIGlmIChiemVyciAhPSBCWl9TVFJFQU1fRU5EKSBnb3RvIGVycmhhbmRsZXI7CiAKLSAgICAgIGlmIChic1IoMSkgPT0gMSkKLSAgICAgICAgIGJsb2NrUmFuZG9taXNlZCA9IFRydWU7IGVsc2UKLSAgICAgICAgIGJsb2NrUmFuZG9taXNlZCA9IEZhbHNlOworICAgICAgYnpSZWFkR2V0VW51c2VkICggJmJ6ZXJyLCBiemYsICh2b2lkKiopKCZ1bnVzZWRUbXApLCAmblVudXNlZCApOworICAgICAgaWYgKGJ6ZXJyICE9IEJaX09LKSBwYW5pYyAoICJ0ZXN0OmJ6UmVhZEdldFVudXNlZCIgKTsKIAotICAgICAgaWYgKHZlcmJvc2l0eSA+PSAyKQotICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiAgICBibG9jayBbJWQ6IGh1ZmYrbXRmICIsIGN1cnJCbG9ja05vICk7Ci0gICAgICBnZXRBbmRNb3ZlVG9Gcm9udERlY29kZSAoKTsKLSAgICAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHpTdHJlYW0pICk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgblVudXNlZDsgaSsrKSB1bnVzZWRbaV0gPSB1bnVzZWRUbXBbaV07CiAKLSAgICAgIGluaXRpYWxpc2VDUkMoKTsKLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgInJ0K3JsZCIgKTsKLSAgICAgIHVuZG9SZXZlcnNpYmxlVHJhbnNmb3JtYXRpb25fc21hbGwgKCBOVUxMICk7CisgICAgICBielJlYWRDbG9zZSAoICZiemVyciwgYnpmICk7CisgICAgICBpZiAoYnplcnIgIT0gQlpfT0spIHBhbmljICggInRlc3Q6YnpSZWFkR2V0VW51c2VkIiApOworICAgICAgaWYgKG5VbnVzZWQgPT0gMCAmJiBteWZlb2YoelN0cmVhbSkpIGJyZWFrOwogCi0gICAgICBjb21wdXRlZEJsb2NrQ1JDID0gZ2V0RmluYWxDUkMoKTsKLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMykKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIgezB4JXgsIDB4JXh9Iiwgc3RvcmVkQmxvY2tDUkMsIGNvbXB1dGVkQmxvY2tDUkMgKTsKLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIl0gIiApOwotCi0gICAgICBpZiAoc3RvcmVkQmxvY2tDUkMgIT0gY29tcHV0ZWRCbG9ja0NSQykgewotICAgICAgICAgYnNGaW5pc2hlZFdpdGhTdHJlYW0oKTsKLSAgICAgICAgIGZjbG9zZSAoIHpTdHJlYW0gKTsKLSAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsICJcbiVzLCBibG9jayAlZDogY29tcHV0ZWQgQ1JDIGRvZXMgbm90IG1hdGNoIHN0b3JlZCBvbmVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsIGN1cnJCbG9ja05vICk7Ci0gICAgICAgICByZXR1cm4gRmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh2ZXJib3NpdHkgPj0gMikgZnByaW50ZiAoIHN0ZGVyciwgIm9rXG4iICk7Ci0gICAgICBjb21wdXRlZENvbWJpbmVkQ1JDID0gKGNvbXB1dGVkQ29tYmluZWRDUkMgPDwgMSkgfCAoY29tcHV0ZWRDb21iaW5lZENSQyA+PiAzMSk7Ci0gICAgICBjb21wdXRlZENvbWJpbmVkQ1JDIF49IGNvbXB1dGVkQmxvY2tDUkM7Ci0gICB9OwotCi0gICBzdG9yZWRDb21iaW5lZENSQyAgPSBic0dldFVJbnQzMiAoKTsKLSAgIGlmICh2ZXJib3NpdHkgPj0gMikKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgIiAgICBjb21iaW5lZCBDUkNzOiBzdG9yZWQgPSAweCV4LCBjb21wdXRlZCA9IDB4JXhcbiAgICAiLAotICAgICAgICAgICAgICAgIHN0b3JlZENvbWJpbmVkQ1JDLCBjb21wdXRlZENvbWJpbmVkQ1JDICk7Ci0gICBpZiAoc3RvcmVkQ29tYmluZWRDUkMgIT0gY29tcHV0ZWRDb21iaW5lZENSQykgewotICAgICAgYnNGaW5pc2hlZFdpdGhTdHJlYW0oKTsKLSAgICAgIGZjbG9zZSAoIHpTdHJlYW0gKTsKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsICJcbiVzOiBjb21wdXRlZCBDUkMgZG9lcyBub3QgbWF0Y2ggc3RvcmVkIG9uZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSApOwotICAgICAgcmV0dXJuIEZhbHNlOwogICAgfQogCi0gICBic0ZpbmlzaGVkV2l0aFN0cmVhbSAoKTsKLSAgIEVSUk9SX0lGX05PVF9aRVJPICggZmVycm9yKHpTdHJlYW0pICk7Ci0gICByZXRWYWwgPSBmY2xvc2UgKCB6U3RyZWFtICk7Ci0gICBFUlJPUl9JRl9FT0YgKCByZXRWYWwgKTsKLSAgIHJldHVybiBUcnVlOwotfQorICAgaWYgKGZlcnJvcih6U3RyZWFtKSkgZ290byBlcnJoYW5kbGVyX2lvOworICAgcmV0ID0gZmNsb3NlICggelN0cmVhbSApOworICAgaWYgKHJldCA9PSBFT0YpIGdvdG8gZXJyaGFuZGxlcl9pbzsKIAorICAgaWYgKHZlcmJvc2l0eSA+PSAyKSBmcHJpbnRmICggc3RkZXJyLCAiXG4gICAgIiApOworICAgcmV0dXJuIFRydWU7CisKKyAgIGVycmhhbmRsZXI6CisgICBielJlYWRDbG9zZSAoICZiemVycl9kdW1teSwgYnpmICk7CisgICBzd2l0Y2ggKGJ6ZXJyKSB7CisgICAgICBjYXNlIEJaX0lPX0VSUk9SOgorICAgICAgICAgZXJyaGFuZGxlcl9pbzoKKyAgICAgICAgIGlvRXJyb3IoKTsgYnJlYWs7CisgICAgICBjYXNlIEJaX0RBVEFfRVJST1I6CisgICAgICAgICBmcHJpbnRmICggc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICJcbiVzOiBkYXRhIGludGVncml0eSAoQ1JDKSBlcnJvciBpbiBkYXRhXG4iLAorICAgICAgICAgICAgICAgICAgIGluTmFtZSApOworICAgICAgICAgcmV0dXJuIEZhbHNlOworICAgICAgY2FzZSBCWl9NRU1fRVJST1I6CisgICAgICAgICBvdXRPZk1lbW9yeSgpOworICAgICAgY2FzZSBCWl9VTkVYUEVDVEVEX0VPRjoKKyAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgIlxuJXM6IGZpbGUgZW5kcyB1bmV4cGVjdGVkbHlcbiIsCisgICAgICAgICAgICAgICAgICAgaW5OYW1lICk7CisgICAgICAgICByZXR1cm4gRmFsc2U7CisgICAgICBjYXNlIEJaX0RBVEFfRVJST1JfTUFHSUM6CisgICAgICAgICBpZiAoc3RyZWFtTm8gPT0gMSkgeworICAgICAgICAgIGZwcmludGYgKCBzdGRlcnIsIAorICAgICAgICAgICAgICAgICAgICAiXG4lczogYmFkIG1hZ2ljIG51bWJlciAoaWUsIG5vdCBjcmVhdGVkIGJ5IGJ6aXAyKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5OYW1lICk7CisgICAgICAgICAgICByZXR1cm4gRmFsc2U7CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgCisgICAgICAgICAgICAgICAgICAgICAgIlxuJXM6ICVzOiB0cmFpbGluZyBnYXJiYWdlIGFmdGVyIEVPRiBpZ25vcmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHByb2dOYW1lLCBpbk5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBUcnVlOyAgICAgICAKKyAgICAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICBwYW5pYyAoICJ0ZXN0OnVuZXhwZWN0ZWQgZXJyb3IiICk7CisgICB9CisKKyAgIHBhbmljICggInRlc3Q6ZW5kIiApOworICAgcmV0dXJuIFRydWU7IC8qbm90cmVhY2hlZCovCit9CiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzA1OSw4ICs1OTIsNyBAQAogICAgZnByaW50ZiAoCiAgICAgICBzdGRlcnIsCiAgICAgICAiXHRJbnB1dCBmaWxlID0gJXMsIG91dHB1dCBmaWxlID0gJXNcbiIsCi0gICAgICBpbk5hbWU9PU5VTEwgID8gIihudWxsKSIgOiBpbk5hbWUsCi0gICAgICBvdXROYW1lPT1OVUxMID8gIihudWxsKSIgOiBvdXROYW1lCisgICAgICBpbk5hbWUsIG91dE5hbWUgCiAgICApOwogfQogCkBAIC0zMDcyLDggKzYwNCw3IEBACiAKICAgIGlmICggc3JjTW9kZSA9PSBTTV9GMkYgJiYgb3BNb2RlICE9IE9NX1RFU1QgKSB7CiAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJXM6IERlbGV0aW5nIG91dHB1dCBmaWxlICVzLCBpZiBpdCBleGlzdHMuXG4iLAotICAgICAgICAgICAgICAgIHByb2dOYW1lLAotICAgICAgICAgICAgICAgIG91dE5hbWU9PU5VTEwgPyAiKG51bGwpIiA6IG91dE5hbWUgKTsKKyAgICAgICAgICAgICAgICBwcm9nTmFtZSwgb3V0TmFtZSApOwogICAgICAgaWYgKG91dHB1dEhhbmRsZUp1c3RJbkNhc2UgIT0gTlVMTCkKICAgICAgICAgIGZjbG9zZSAoIG91dHB1dEhhbmRsZUp1c3RJbkNhc2UgKTsKICAgICAgIHJldFZhbCA9IHJlbW92ZSAoIG91dE5hbWUgKTsKQEAgLTMxMDgsMTEgKzYzOSwxMCBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgYmFkQkdMZW5ndGhzICggdm9pZCApCit2b2lkIGNyY0Vycm9yICgpCiB7CiAgICBmcHJpbnRmICggc3RkZXJyLAotICAgICAgICAgICAgICJcbiVzOiBlcnJvciB3aGVuIHJlYWRpbmcgYmFja2dyb3VuZCBtb2RlbCBjb2RlIGxlbmd0aHMsXG4iCi0gICAgICAgICAgICAgIlx0d2hpY2ggcHJvYmFibHkgbWVhbnMgdGhlIGNvbXByZXNzZWQgZmlsZSBpcyBjb3JydXB0ZWQuXG4iLAorICAgICAgICAgICAgICJcbiVzOiBEYXRhIGludGVncml0eSBlcnJvciB3aGVuIGRlY29tcHJlc3NpbmcuXG4iLAogICAgICAgICAgICAgIHByb2dOYW1lICk7CiAgICBzaG93RmlsZU5hbWVzKCk7CiAgICBjYWR2aXNlKCk7CkBAIC0zMTIxLDE5ICs2NTEsNiBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgY3JjRXJyb3IgKCBVSW50MzIgY3JjU3RvcmVkLCBVSW50MzIgY3JjQ29tcHV0ZWQgKQotewotICAgZnByaW50ZiAoIHN0ZGVyciwKLSAgICAgICAgICAgICAiXG4lczogRGF0YSBpbnRlZ3JpdHkgZXJyb3Igd2hlbiBkZWNvbXByZXNzaW5nLlxuIgotICAgICAgICAgICAgICJcdFN0b3JlZCBDUkMgPSAweCV4LCBjb21wdXRlZCBDUkMgPSAweCV4XG4iLAotICAgICAgICAgICAgIHByb2dOYW1lLCBjcmNTdG9yZWQsIGNyY0NvbXB1dGVkICk7Ci0gICBzaG93RmlsZU5hbWVzKCk7Ci0gICBjYWR2aXNlKCk7Ci0gICBjbGVhblVwQW5kRmFpbCggMiApOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQgY29tcHJlc3NlZFN0cmVhbUVPRiAoIHZvaWQgKQogewogICAgZnByaW50ZiAoIHN0ZGVyciwKQEAgLTMxNjAsNDYgKzY3Nyw2IEBACiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBibG9ja092ZXJydW4gKCkKLXsKLSAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgIlxuJXM6IGJsb2NrIG92ZXJydW4gZHVyaW5nIGRlY29tcHJlc3Npb24sXG4iCi0gICAgICAgICAgICAgIlx0d2hpY2ggcHJvYmFibHkgbWVhbnMgdGhlIGNvbXByZXNzZWQgZmlsZVxuIgotICAgICAgICAgICAgICJcdGlzIGNvcnJ1cHRlZC5cbiIsCi0gICAgICAgICAgICAgcHJvZ05hbWUgKTsKLSAgIHNob3dGaWxlTmFtZXMoKTsKLSAgIGNhZHZpc2UoKTsKLSAgIGNsZWFuVXBBbmRGYWlsKCAyICk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBiYWRCbG9ja0hlYWRlciAoKQotewotICAgZnByaW50ZiAoIHN0ZGVyciwKLSAgICAgICAgICAgICAiXG4lczogYmFkIGJsb2NrIGhlYWRlciBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLFxuIgotICAgICAgICAgICAgICJcdHdoaWNoIHByb2JhYmx5IG1lYW5zIGl0IGlzIGNvcnJ1cHRlZC5cbiIsCi0gICAgICAgICAgICAgcHJvZ05hbWUgKTsKLSAgIHNob3dGaWxlTmFtZXMoKTsKLSAgIGNhZHZpc2UoKTsKLSAgIGNsZWFuVXBBbmRGYWlsKCAyICk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBiaXRTdHJlYW1FT0YgKCkKLXsKLSAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgIlxuJXM6IHJlYWQgcGFzdCB0aGUgZW5kIG9mIGNvbXByZXNzZWQgZGF0YSxcbiIKLSAgICAgICAgICAgICAiXHR3aGljaCBwcm9iYWJseSBtZWFucyBpdCBpcyBjb3JydXB0ZWQuXG4iLAotICAgICAgICAgICAgIHByb2dOYW1lICk7Ci0gICBzaG93RmlsZU5hbWVzKCk7Ci0gICBjYWR2aXNlKCk7Ci0gICBjbGVhblVwQW5kRmFpbCggMiApOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHZvaWQgbXlTaWduYWxDYXRjaGVyICggSW50TmF0aXZlIG4gKQogewogICAgZnByaW50ZiAoIHN0ZGVyciwKQEAgLTMyMzMsMjcgKzcxMCwxMSBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgdW5jb21wcmVzc091dE9mTWVtb3J5ICggSW50MzIgZHJhdywgSW50MzIgYmxvY2tTaXplICkKK3ZvaWQgb3V0T2ZNZW1vcnkgKCB2b2lkICkKIHsKICAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgIlxuJXM6IENhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGRlY29tcHJlc3Npb24uXG4iCi0gICAgICAgICAgICAgIlx0UmVxdWVzdGVkICVkIGJ5dGVzIGZvciBhIGJsb2NrIHNpemUgb2YgJWQuXG4iCi0gICAgICAgICAgICAgIlx0VHJ5IHNlbGVjdGluZyBzcGFjZS1lY29ub21pYyBkZWNvbXByZXNzICh3aXRoIGZsYWcgLXMpXG4iCi0gICAgICAgICAgICAgIlx0YW5kIGZhaWxpbmcgdGhhdCwgZmluZCBhIG1hY2hpbmUgd2l0aCBtb3JlIG1lbW9yeS5cbiIsCi0gICAgICAgICAgICAgcHJvZ05hbWUsIGRyYXcsIGJsb2NrU2l6ZSApOwotICAgc2hvd0ZpbGVOYW1lcygpOwotICAgY2xlYW5VcEFuZEZhaWwoMSk7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBjb21wcmVzc091dE9mTWVtb3J5ICggSW50MzIgZHJhdywgSW50MzIgYmxvY2tTaXplICkKLXsKLSAgIGZwcmludGYgKCBzdGRlcnIsCi0gICAgICAgICAgICAgIlxuJXM6IENhbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGNvbXByZXNzaW9uLlxuIgotICAgICAgICAgICAgICJcdFJlcXVlc3RlZCAlZCBieXRlcyBmb3IgYSBibG9jayBzaXplIG9mICVkLlxuIgotICAgICAgICAgICAgICJcdFRyeSBzZWxlY3RpbmcgYSBzbWFsbCBibG9jayBzaXplICh3aXRoIGZsYWcgLXMpLlxuIiwKLSAgICAgICAgICAgICBwcm9nTmFtZSwgZHJhdywgYmxvY2tTaXplICk7CisgICAgICAgICAgICAgIlxuJXM6IGNvdWxkbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnlcbiIsCisgICAgICAgICAgICAgcHJvZ05hbWUgKTsKICAgIHNob3dGaWxlTmFtZXMoKTsKICAgIGNsZWFuVXBBbmRGYWlsKDEpOwogfQpAQCAtMzI3NCw2ICs3MzUsMjQgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGNvcHlGaWxlTmFtZSAoIENoYXIqIHRvLCBDaGFyKiBmcm9tICkgCit7CisgICBpZiAoIHN0cmxlbihmcm9tKSA+IEZJTEVfTkFNRV9MRU4tMTAgKSAgeworICAgICAgZnByaW50ZiAoCisgICAgICAgICBzdGRlcnIsCisgICAgICAgICAiYnppcDI6IGZpbGUgbmFtZVxuYCVzJ1xuaXMgc3VzcGljaW91c2x5ICg+IDEwMjQgY2hhcnMpIGxvbmcuXG4iCisgICAgICAgICAiVHJ5IHVzaW5nIGEgcmVhc29uYWJsZSBmaWxlIG5hbWUgaW5zdGVhZC4gIFNvcnJ5ISA6KVxuIiwKKyAgICAgICAgIGZyb20KKyAgICAgICk7CisgICAgICBleGl0KDEpOworICAgfQorCisgIHN0cm5jcHkodG8sZnJvbSxGSUxFX05BTUVfTEVOLTEwKTsKKyAgdG9bRklMRV9OQU1FX0xFTi0xMF09J1wwJzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBCb29sIGZpbGVFeGlzdHMgKCBDaGFyKiBuYW1lICkKIHsKICAgIEZJTEUgKnRtcCAgID0gZm9wZW4gKCBuYW1lLCAicmIiICk7CkBAIC0zMjg3LDcgKzc2Niw3IEBACiAvKi0tCiAgIGlmIGluIGRvdWJ0LCByZXR1cm4gVHJ1ZQogLS0qLwotQm9vbCBub3RBQm9nU3RhbmRhcmRGaWxlICggQ2hhciogbmFtZSApCitCb29sIG5vdEFTdGFuZGFyZEZpbGUgKCBDaGFyKiBuYW1lICkKIHsKICAgIEludE5hdGl2ZSAgICAgIGk7CiAgICBzdHJ1Y3QgTVlfU1RBVCBzdGF0QnVmOwpAQCAtMzMwMCw5ICs3NzksOSBAQAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgY29weURhdGVBbmRQZXJtaXNzaW9ucyAoIENoYXIgKnNyY05hbWUsIENoYXIgKmRzdE5hbWUgKQordm9pZCBjb3B5RGF0ZVBlcm1pc3Npb25zQW5kT3duZXIgKCBDaGFyICpzcmNOYW1lLCBDaGFyICpkc3ROYW1lICkKIHsKLSAgICNpZiBCWl9VTklYCisjaWYgQlpfVU5JWAogICAgSW50TmF0aXZlICAgICAgcmV0VmFsOwogICAgc3RydWN0IE1ZX1NUQVQgc3RhdEJ1ZjsKICAgIHN0cnVjdCB1dGltYnVmIHVUaW1CdWY7CkBAIC0zMzE0LDEzICs3OTMsMzQgQEAKIAogICAgcmV0VmFsID0gY2htb2QgKCBkc3ROYW1lLCBzdGF0QnVmLnN0X21vZGUgKTsKICAgIEVSUk9SX0lGX05PVF9aRVJPICggcmV0VmFsICk7CisgICAvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHJlYWxseSBwb3J0YWJsZSBvciBub3QuICBDYXVzZXMgCisgICAgICBwcm9ibGVtcyBvbiBteSB4ODYtTGludXggUmVkaGF0IDUuMCBib3guICBEZWNpZGVkCisgICAgICB0byBvbWl0IGl0IGZyb20gMC45LjAuICBKUlMsIDI3IEp1bmUgOTguICBJZiB5b3UgCisgICAgICB1bmRlcnN0YW5kIFVuaXggZmlsZSBzZW1hbnRpY3MgYW5kIHBvcnRhYmlsaXR5IGlzc3VlcworICAgICAgd2VsbCBlbm91Z2ggdG8gZml4IHRoaXMgcHJvcGVybHksIGRyb3AgbWUgYSBsaW5lCisgICAgICBhdCBqc2V3YXJkQGFjbS5vcmcuCisgICByZXRWYWwgPSBjaG93biAoIGRzdE5hbWUsIHN0YXRCdWYuc3RfdWlkLCBzdGF0QnVmLnN0X2dpZCApOworICAgRVJST1JfSUZfTk9UX1pFUk8gKCByZXRWYWwgKTsKKyAgICovCiAgICByZXRWYWwgPSB1dGltZSAoIGRzdE5hbWUsICZ1VGltQnVmICk7CiAgICBFUlJPUl9JRl9OT1RfWkVSTyAoIHJldFZhbCApOwotICAgI2VuZGlmCisjZW5kaWYKIH0KIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIHNldEludGVyaW1QZXJtaXNzaW9ucyAoIENoYXIgKmRzdE5hbWUgKQoreworI2lmIEJaX1VOSVgKKyAgIEludE5hdGl2ZSAgICAgIHJldFZhbDsKKyAgIHJldFZhbCA9IGNobW9kICggZHN0TmFtZSwgU19JUlVTUiB8IFNfSVdVU1IgKTsKKyAgIEVSUk9SX0lGX05PVF9aRVJPICggcmV0VmFsICk7CisjZW5kaWYKK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIEJvb2wgZW5kc0luQnoyICggQ2hhciogbmFtZSApCiB7CiAgICBJbnQzMiBuID0gc3RybGVuICggbmFtZSApOwpAQCAtMzM1MywxMyArODUzLDEzIEBACiAgICAgICBwYW5pYyAoICJjb21wcmVzczogYmFkIG1vZGVzXG4iICk7CiAKICAgIHN3aXRjaCAoc3JjTW9kZSkgewotICAgICAgY2FzZSBTTV9JMk86IHN0cmNweSAoIGluTmFtZSwgIihzdGRpbikiICk7Ci0gICAgICAgICAgICAgICAgICAgc3RyY3B5ICggb3V0TmFtZSwgIihzdGRvdXQpIiApOyBicmVhazsKLSAgICAgIGNhc2UgU01fRjJGOiBzdHJjcHkgKCBpbk5hbWUsIG5hbWUgKTsKLSAgICAgICAgICAgICAgICAgICBzdHJjcHkgKCBvdXROYW1lLCBuYW1lICk7CisgICAgICBjYXNlIFNNX0kyTzogY29weUZpbGVOYW1lICggaW5OYW1lLCAiKHN0ZGluKSIgKTsKKyAgICAgICAgICAgICAgICAgICBjb3B5RmlsZU5hbWUgKCBvdXROYW1lLCAiKHN0ZG91dCkiICk7IGJyZWFrOworICAgICAgY2FzZSBTTV9GMkY6IGNvcHlGaWxlTmFtZSAoIGluTmFtZSwgbmFtZSApOworICAgICAgICAgICAgICAgICAgIGNvcHlGaWxlTmFtZSAoIG91dE5hbWUsIG5hbWUgKTsKICAgICAgICAgICAgICAgICAgICBzdHJjYXQgKCBvdXROYW1lLCAiLmJ6MiIgKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNNX0YyTzogc3RyY3B5ICggaW5OYW1lLCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgc3RyY3B5ICggb3V0TmFtZSwgIihzdGRvdXQpIiApOyBicmVhazsKKyAgICAgIGNhc2UgU01fRjJPOiBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICBjb3B5RmlsZU5hbWUgKCBvdXROYW1lLCAiKHN0ZG91dCkiICk7IGJyZWFrOwogICAgfQogCiAgICBpZiAoIHNyY01vZGUgIT0gU01fSTJPICYmIGNvbnRhaW5zRHViaW91c0NoYXJzICggaW5OYW1lICkgKSB7CkBAIC0zMzc3LDEyICs4NzcsMTIgQEAKICAgICAgICAgICAgICAgICBwcm9nTmFtZSwgaW5OYW1lICk7CiAgICAgICByZXR1cm47CiAgICB9Ci0gICBpZiAoIHNyY01vZGUgIT0gU01fSTJPICYmIG5vdEFCb2dTdGFuZGFyZEZpbGUgKCBpbk5hbWUgKSkgeworICAgaWYgKCBzcmNNb2RlICE9IFNNX0kyTyAmJiBub3RBU3RhbmRhcmRGaWxlICggaW5OYW1lICkpIHsKICAgICAgIGZwcmludGYgKCBzdGRlcnIsICIlczogSW5wdXQgZmlsZSAlcyBpcyBub3QgYSBub3JtYWwgZmlsZSwgc2tpcHBpbmcuXG4iLAogICAgICAgICAgICAgICAgIHByb2dOYW1lLCBpbk5hbWUgKTsKICAgICAgIHJldHVybjsKICAgIH0KLSAgIGlmICggc3JjTW9kZSA9PSBTTV9GMkYgJiYgZmlsZUV4aXN0cyAoIG91dE5hbWUgKSApIHsKKyAgIGlmICggc3JjTW9kZSA9PSBTTV9GMkYgJiYgIWZvcmNlT3ZlcndyaXRlICYmIGZpbGVFeGlzdHMgKCBvdXROYW1lICkgKSB7CiAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJXM6IE91dHB1dCBmaWxlICVzIGFscmVhZHkgZXhpc3RzLCBza2lwcGluZy5cbiIsCiAgICAgICAgICAgICAgICAgcHJvZ05hbWUsIG91dE5hbWUgKTsKICAgICAgIHJldHVybjsKQEAgLTM0MzQsNiArOTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBwcm9nTmFtZSwgaW5OYW1lICk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9OworICAgICAgICAgc2V0SW50ZXJpbVBlcm1pc3Npb25zICggb3V0TmFtZSApOwogICAgICAgICAgYnJlYWs7CiAKICAgICAgIGRlZmF1bHQ6CkBAIC0zNDU0LDcgKzk1NSw3IEBACiAKICAgIC8qLS0tIElmIHRoZXJlIHdhcyBhbiBJL08gZXJyb3IsIHdlIHdvbid0IGdldCBoZXJlLiAtLS0qLwogICAgaWYgKCBzcmNNb2RlID09IFNNX0YyRiApIHsKLSAgICAgIGNvcHlEYXRlQW5kUGVybWlzc2lvbnMgKCBpbk5hbWUsIG91dE5hbWUgKTsKKyAgICAgIGNvcHlEYXRlUGVybWlzc2lvbnNBbmRPd25lciAoIGluTmFtZSwgb3V0TmFtZSApOwogICAgICAgaWYgKCAha2VlcElucHV0RmlsZXMgKSB7CiAgICAgICAgICBJbnROYXRpdmUgcmV0VmFsID0gcmVtb3ZlICggaW5OYW1lICk7CiAgICAgICAgICBFUlJPUl9JRl9OT1RfWkVSTyAoIHJldFZhbCApOwpAQCAtMzQ3NCwxNSArOTc1LDE1IEBACiAgICAgICBwYW5pYyAoICJ1bmNvbXByZXNzOiBiYWQgbW9kZXNcbiIgKTsKIAogICAgc3dpdGNoIChzcmNNb2RlKSB7Ci0gICAgICBjYXNlIFNNX0kyTzogc3RyY3B5ICggaW5OYW1lLCAiKHN0ZGluKSIgKTsKLSAgICAgICAgICAgICAgICAgICBzdHJjcHkgKCBvdXROYW1lLCAiKHN0ZG91dCkiICk7IGJyZWFrOwotICAgICAgY2FzZSBTTV9GMkY6IHN0cmNweSAoIGluTmFtZSwgbmFtZSApOwotICAgICAgICAgICAgICAgICAgIHN0cmNweSAoIG91dE5hbWUsIG5hbWUgKTsKKyAgICAgIGNhc2UgU01fSTJPOiBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsICIoc3RkaW4pIiApOworICAgICAgICAgICAgICAgICAgIGNvcHlGaWxlTmFtZSAoIG91dE5hbWUsICIoc3Rkb3V0KSIgKTsgYnJlYWs7CisgICAgICBjYXNlIFNNX0YyRjogY29weUZpbGVOYW1lICggaW5OYW1lLCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgY29weUZpbGVOYW1lICggb3V0TmFtZSwgbmFtZSApOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmRzSW5CejIgKCBvdXROYW1lICkpCiAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSBbIHN0cmxlbiAoIG91dE5hbWUgKSAtIDQgXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNNX0YyTzogc3RyY3B5ICggaW5OYW1lLCBuYW1lICk7Ci0gICAgICAgICAgICAgICAgICAgc3RyY3B5ICggb3V0TmFtZSwgIihzdGRvdXQpIiApOyBicmVhazsKKyAgICAgIGNhc2UgU01fRjJPOiBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICBjb3B5RmlsZU5hbWUgKCBvdXROYW1lLCAiKHN0ZG91dCkiICk7IGJyZWFrOwogICAgfQogCiAgICBpZiAoIHNyY01vZGUgIT0gU01fSTJPICYmIGNvbnRhaW5zRHViaW91c0NoYXJzICggaW5OYW1lICkgKSB7CkBAIC0zNTAxLDEyICsxMDAyLDEyIEBACiAgICAgICAgICAgICAgICAgcHJvZ05hbWUsIGluTmFtZSApOwogICAgICAgcmV0dXJuOwogICAgfQotICAgaWYgKCBzcmNNb2RlICE9IFNNX0kyTyAmJiBub3RBQm9nU3RhbmRhcmRGaWxlICggaW5OYW1lICkpIHsKKyAgIGlmICggc3JjTW9kZSAhPSBTTV9JMk8gJiYgbm90QVN0YW5kYXJkRmlsZSAoIGluTmFtZSApKSB7CiAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJXM6IElucHV0IGZpbGUgJXMgaXMgbm90IGEgbm9ybWFsIGZpbGUsIHNraXBwaW5nLlxuIiwKICAgICAgICAgICAgICAgICBwcm9nTmFtZSwgaW5OYW1lICk7CiAgICAgICByZXR1cm47CiAgICB9Ci0gICBpZiAoIHNyY01vZGUgPT0gU01fRjJGICYmIGZpbGVFeGlzdHMgKCBvdXROYW1lICkgKSB7CisgICBpZiAoIHNyY01vZGUgPT0gU01fRjJGICYmICFmb3JjZU92ZXJ3cml0ZSAmJiBmaWxlRXhpc3RzICggb3V0TmFtZSApICkgewogICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiVzOiBPdXRwdXQgZmlsZSAlcyBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcuXG4iLAogICAgICAgICAgICAgICAgIHByb2dOYW1lLCBvdXROYW1lICk7CiAgICAgICByZXR1cm47CkBAIC0zNTUwLDYgKzEwNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHByb2dOYW1lLCBpbk5hbWUgKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH07CisgICAgICAgICBzZXRJbnRlcmltUGVybWlzc2lvbnMgKCBvdXROYW1lICk7CiAgICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKQEAgLTM1NzEsNyArMTA3Myw3IEBACiAgICAvKi0tLSBJZiB0aGVyZSB3YXMgYW4gSS9PIGVycm9yLCB3ZSB3b24ndCBnZXQgaGVyZS4gLS0tKi8KICAgIGlmICggbWFnaWNOdW1iZXJPSyApIHsKICAgICAgIGlmICggc3JjTW9kZSA9PSBTTV9GMkYgKSB7Ci0gICAgICAgICBjb3B5RGF0ZUFuZFBlcm1pc3Npb25zICggaW5OYW1lLCBvdXROYW1lICk7CisgICAgICAgICBjb3B5RGF0ZVBlcm1pc3Npb25zQW5kT3duZXIgKCBpbk5hbWUsIG91dE5hbWUgKTsKICAgICAgICAgIGlmICggIWtlZXBJbnB1dEZpbGVzICkgewogICAgICAgICAgICAgSW50TmF0aXZlIHJldFZhbCA9IHJlbW92ZSAoIGluTmFtZSApOwogICAgICAgICAgICAgRVJST1JfSUZfTk9UX1pFUk8gKCByZXRWYWwgKTsKQEAgLTM2MDcsMTEgKzExMDksMTEgQEAKICAgIGlmIChuYW1lID09IE5VTEwgJiYgc3JjTW9kZSAhPSBTTV9JMk8pCiAgICAgICBwYW5pYyAoICJ0ZXN0ZjogYmFkIG1vZGVzXG4iICk7CiAKLSAgIHN0cmNweSAoIG91dE5hbWUsICIobm9uZSkiICk7CisgICBjb3B5RmlsZU5hbWUgKCBvdXROYW1lLCAiKG5vbmUpIiApOwogICAgc3dpdGNoIChzcmNNb2RlKSB7Ci0gICAgICBjYXNlIFNNX0kyTzogc3RyY3B5ICggaW5OYW1lLCAiKHN0ZGluKSIgKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNNX0YyRjogc3RyY3B5ICggaW5OYW1lLCBuYW1lICk7IGJyZWFrOwotICAgICAgY2FzZSBTTV9GMk86IHN0cmNweSAoIGluTmFtZSwgbmFtZSApOyBicmVhazsKKyAgICAgIGNhc2UgU01fSTJPOiBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsICIoc3RkaW4pIiApOyBicmVhazsKKyAgICAgIGNhc2UgU01fRjJGOiBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsIG5hbWUgKTsgYnJlYWs7CisgICAgICBjYXNlIFNNX0YyTzogY29weUZpbGVOYW1lICggaW5OYW1lLCBuYW1lICk7IGJyZWFrOwogICAgfQogCiAgICBpZiAoIHNyY01vZGUgIT0gU01fSTJPICYmIGNvbnRhaW5zRHViaW91c0NoYXJzICggaW5OYW1lICkgKSB7CkBAIC0zNjMwLDcgKzExMzIsNyBAQAogICAgICAgICAgICAgICAgIHByb2dOYW1lLCBpbk5hbWUgKTsKICAgICAgIHJldHVybjsKICAgIH0KLSAgIGlmICggc3JjTW9kZSAhPSBTTV9JMk8gJiYgbm90QUJvZ1N0YW5kYXJkRmlsZSAoIGluTmFtZSApKSB7CisgICBpZiAoIHNyY01vZGUgIT0gU01fSTJPICYmIG5vdEFTdGFuZGFyZEZpbGUgKCBpbk5hbWUgKSkgewogICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiVzOiBJbnB1dCBmaWxlICVzIGlzIG5vdCBhIG5vcm1hbCBmaWxlLCBza2lwcGluZy5cbiIsCiAgICAgICAgICAgICAgICAgcHJvZ05hbWUsIGluTmFtZSApOwogICAgICAgcmV0dXJuOwpAQCAtMzY4NCwyNSArMTE4NiwxOCBAQAogICAgZnByaW50ZiAoIHN0ZGVyciwKIAogICAgICJiemlwMiwgYSBibG9jay1zb3J0aW5nIGZpbGUgY29tcHJlc3Nvci4gICIKLSAgICAiVmVyc2lvbiAwLjFwbDIsIDI5LUF1Zy05Ny5cbiIKKyAgICAiVmVyc2lvbiAwLjkuMGMsIDE4LU9jdC05OC5cbiIKICAgICAiICAgXG4iCi0gICAgIiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBieSBKdWxpYW4gU2V3YXJkLlxuIgorICAgICIgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggYnkgSnVsaWFuIFNld2FyZC5cbiIKICAgICAiICAgXG4iCiAgICAgIiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4iCi0gICAgIiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4iCi0gICAgIiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yXG4iCi0gICAgIiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4iCisgICAgIiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBzZXQgb3V0IGluIHRoZSBMSUNFTlNFIGZpbGUsIHdoaWNoIGlzIGluY2x1ZGVkXG4iCisgICAgIiAgIGluIHRoZSBiemlwMi0wLjkuMGMgc291cmNlIGRpc3RyaWJ1dGlvbi5cbiIKICAgICAiICAgXG4iCiAgICAgIiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIgogICAgICIgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIgogICAgICIgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4iCi0gICAgIiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0gICAgIiAgIFxuIgotICAgICIgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIgotICAgICIgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuIgotICAgICIgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS5cbiIKLSAgICAiICAgXG4iCi0gICAgIiAgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBjb250YWluZWQgaW4gdGhlIGZpbGUgTElDRU5TRS5cbiIKKyAgICAiICAgTElDRU5TRSBmaWxlIGZvciBtb3JlIGRldGFpbHMuXG4iCiAgICAgIiAgIFxuIgogICAgKTsKIH0KQEAgLTM3MTQsMTYgKzEyMDksMTcgQEAKICAgIGZwcmludGYgKAogICAgICAgc3RkZXJyLAogICAgICAgImJ6aXAyLCBhIGJsb2NrLXNvcnRpbmcgZmlsZSBjb21wcmVzc29yLiAgIgotICAgICAgIlZlcnNpb24gMC4xcGwyLCAyOS1BdWctOTcuXG4iCisgICAgICAiVmVyc2lvbiAwLjkuMGMsIDE4LU9jdC05OC5cbiIKICAgICAgICJcbiAgIHVzYWdlOiAlcyBbZmxhZ3MgYW5kIGlucHV0IGZpbGVzIGluIGFueSBvcmRlcl1cbiIKICAgICAgICJcbiIKICAgICAgICIgICAtaCAtLWhlbHAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZVxuIgogICAgICAgIiAgIC1kIC0tZGVjb21wcmVzcyAgICAgZm9yY2UgZGVjb21wcmVzc2lvblxuIgotICAgICAgIiAgIC1mIC0tY29tcHJlc3MgICAgICAgZm9yY2UgY29tcHJlc3Npb25cbiIKKyAgICAgICIgICAteiAtLWNvbXByZXNzICAgICAgIGZvcmNlIGNvbXByZXNzaW9uXG4iCisgICAgICAiICAgLWsgLS1rZWVwICAgICAgICAgICBrZWVwIChkb24ndCBkZWxldGUpIGlucHV0IGZpbGVzXG4iCisgICAgICAiICAgLWYgLS1mb3JjZSAgICAgICAgICBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzc1xuIgogICAgICAgIiAgIC10IC0tdGVzdCAgICAgICAgICAgdGVzdCBjb21wcmVzc2VkIGZpbGUgaW50ZWdyaXR5XG4iCiAgICAgICAiICAgLWMgLS1zdGRvdXQgICAgICAgICBvdXRwdXQgdG8gc3RhbmRhcmQgb3V0XG4iCiAgICAgICAiICAgLXYgLS12ZXJib3NlICAgICAgICBiZSB2ZXJib3NlIChhIDJuZCAtdiBnaXZlcyBtb3JlKVxuIgotICAgICAgIiAgIC1rIC0ta2VlcCAgICAgICAgICAga2VlcCAoZG9uJ3QgZGVsZXRlKSBpbnB1dCBmaWxlc1xuIgogICAgICAgIiAgIC1MIC0tbGljZW5zZSAgICAgICAgZGlzcGxheSBzb2Z0d2FyZSB2ZXJzaW9uICYgbGljZW5zZVxuIgogICAgICAgIiAgIC1WIC0tdmVyc2lvbiAgICAgICAgZGlzcGxheSBzb2Z0d2FyZSB2ZXJzaW9uICYgbGljZW5zZVxuIgogICAgICAgIiAgIC1zIC0tc21hbGwgICAgICAgICAgdXNlIGxlc3MgbWVtb3J5IChhdCBtb3N0IDI1MDBrKVxuIgpAQCAtMzczMSwxNSArMTIyNywxNiBAQAogICAgICAgIiAgIC0tcmVwZXRpdGl2ZS1mYXN0ICAgY29tcHJlc3MgcmVwZXRpdGl2ZSBibG9ja3MgZmFzdGVyXG4iCiAgICAgICAiICAgLS1yZXBldGl0aXZlLWJlc3QgICBjb21wcmVzcyByZXBldGl0aXZlIGJsb2NrcyBiZXR0ZXJcbiIKICAgICAgICJcbiIKLSAgICAgICIgICBJZiBpbnZva2VkIGFzIGBiemlwMicsIHRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBjb21wcmVzcy5cbiIKLSAgICAgICIgICAgICAgICAgICAgIGFzIGBidW56aXAyJywgdGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIGRlY29tcHJlc3MuXG4iCisgICAgICAiICAgSWYgaW52b2tlZCBhcyBgYnppcDInLCBkZWZhdWx0IGFjdGlvbiBpcyB0byBjb21wcmVzcy5cbiIKKyAgICAgICIgICAgICAgICAgICAgIGFzIGBidW56aXAyJywgIGRlZmF1bHQgYWN0aW9uIGlzIHRvIGRlY29tcHJlc3MuXG4iCisgICAgICAiICAgICAgICAgICAgICBhcyBgYnoyY2F0JywgZGVmYXVsdCBhY3Rpb24gaXMgdG8gZGVjb21wcmVzcyB0byBzdGRvdXQuXG4iCiAgICAgICAiXG4iCiAgICAgICAiICAgSWYgbm8gZmlsZSBuYW1lcyBhcmUgZ2l2ZW4sIGJ6aXAyIGNvbXByZXNzZXMgb3IgZGVjb21wcmVzc2VzXG4iCiAgICAgICAiICAgZnJvbSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXRwdXQuICBZb3UgY2FuIGNvbWJpbmVcbiIKLSAgICAgICIgICBmbGFncywgc28gYC12IC00JyBtZWFucyB0aGUgc2FtZSBhcyAtdjQgb3IgLTR2LCAmYy5cbiIKLSAgICAgICNpZiBCWl9VTklYCisgICAgICAiICAgc2hvcnQgZmxhZ3MsIHNvIGAtdiAtNCcgbWVhbnMgdGhlIHNhbWUgYXMgLXY0IG9yIC00diwgJmMuXG4iCisjaWYgQlpfVU5JWAogICAgICAgIlxuIgotICAgICAgI2VuZGlmCisjZW5kaWYKICAgICAgICwKIAogICAgICAgZnVsbFByb2dOYW1lCkBAIC0zNzc2LDE0ICsxMjczLDcgQEAKICAgIHZvaWQqIHA7CiAKICAgIHAgPSBtYWxsb2MgKCAoc2l6ZV90KW4gKTsKLSAgIGlmIChwID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYgKAotICAgICAgICAgc3RkZXJyLAotICAgICAgICAgIiVzOiBgbWFsbG9jJyBmYWlsZWQgb24gcmVxdWVzdCBmb3IgJWQgYnl0ZXMuXG4iLAotICAgICAgICAgcHJvZ05hbWUsIG4KLSAgICAgICk7Ci0gICAgICBleGl0ICggMSApOwotICAgfQorICAgaWYgKHAgPT0gTlVMTCkgb3V0T2ZNZW1vcnkgKCk7CiAgICByZXR1cm4gcDsKIH0KIApAQCAtMzgxNyw3ICsxMzA3LDYgQEAKIH0KIAogCi0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUgSVNGTEFHKHMpIChzdHJjbXAoYWEtPm5hbWUsIChzKSk9PTApCiAKQEAgLTM4MjksMTEgKzEzMTgsNiBAQAogICAgQ2VsbCAgICphcmdMaXN0OwogICAgQ2VsbCAgICphYTsKIAotCi0gICAjaWYgREVCVUcKLSAgICAgIGZwcmludGYgKCBzdGRlcnIsICJiemlwMjogKioqIGNvbXBpbGVkIHdpdGggZGVidWdnaW5nIE9OICoqKlxuIiApOwotICAgI2VuZGlmCi0KICAgIC8qLS0gQmUgcmVhbGx5IHJlYWxseSByZWFsbHkgcGFyYW5vaWQgOi0pIC0tKi8KICAgIGlmIChzaXplb2YoSW50MzIpICE9IDQgfHwgc2l6ZW9mKFVJbnQzMikgIT0gNCAgfHwKICAgICAgICBzaXplb2YoSW50MTYpICE9IDIgfHwgc2l6ZW9mKFVJbnQxNikgIT0gMiAgfHwKQEAgLTM4NDQsNyArMTMyOCw3IEBACiAgICAgICAgICAgICAgICAgIlx0b2YgNCwgMiBhbmQgMSBieXRlcyB0byBydW4gcHJvcGVybHksIGFuZCB0aGV5IGRvbid0LlxuIgogICAgICAgICAgICAgICAgICJcdFByb2JhYmx5IHlvdSBjYW4gZml4IHRoaXMgYnkgZGVmaW5pbmcgdGhlbSBjb3JyZWN0bHksXG4iCiAgICAgICAgICAgICAgICAgIlx0YW5kIHJlY29tcGlsaW5nLiAgQnllIVxuIiApOwotICAgICAgZXhpdCgxKTsKKyAgICAgIGV4aXQoMyk7CiAgICB9CiAKIApAQCAtMzg1MiwzNSArMTMzNiwyOCBAQAogICAgc2lnbmFsIChTSUdJTlQsICBteVNpZ25hbENhdGNoZXIpOwogICAgc2lnbmFsIChTSUdURVJNLCBteVNpZ25hbENhdGNoZXIpOwogICAgc2lnbmFsIChTSUdTRUdWLCBteVNJR1NFR1ZvclNJR0JVU2NhdGNoZXIpOwotICAgI2lmIEJaX1VOSVgKKyNpZiBCWl9VTklYCiAgICBzaWduYWwgKFNJR0hVUCwgIG15U2lnbmFsQ2F0Y2hlcik7CiAgICBzaWduYWwgKFNJR0JVUywgIG15U0lHU0VHVm9yU0lHQlVTY2F0Y2hlcik7Ci0gICAjZW5kaWYKKyNlbmRpZgogCiAKICAgIC8qLS0gSW5pdGlhbGlzZSAtLSovCiAgICBvdXRwdXRIYW5kbGVKdXN0SW5DYXNlICA9IE5VTEw7Ci0gICBmdGFiICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICBsbDQgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICBsbDE2ICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICBsbDggICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICB0dCAgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICBibG9jayAgICAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICB6cHRyICAgICAgICAgICAgICAgICAgICA9IE5VTEw7CiAgICBzbWFsbE1vZGUgICAgICAgICAgICAgICA9IEZhbHNlOwogICAga2VlcElucHV0RmlsZXMgICAgICAgICAgPSBGYWxzZTsKKyAgIGZvcmNlT3ZlcndyaXRlICAgICAgICAgID0gRmFsc2U7CiAgICB2ZXJib3NpdHkgICAgICAgICAgICAgICA9IDA7CiAgICBibG9ja1NpemUxMDBrICAgICAgICAgICA9IDk7CiAgICB0ZXN0RmFpbHNFeGlzdCAgICAgICAgICA9IEZhbHNlOwotICAgYnNTdHJlYW0gICAgICAgICAgICAgICAgPSBOVUxMOwogICAgbnVtRmlsZU5hbWVzICAgICAgICAgICAgPSAwOwogICAgbnVtRmlsZXNQcm9jZXNzZWQgICAgICAgPSAwOwogICAgd29ya0ZhY3RvciAgICAgICAgICAgICAgPSAzMDsKIAotICAgc3RyY3B5ICggaW5OYW1lLCAgIihub25lKSIgKTsKLSAgIHN0cmNweSAoIG91dE5hbWUsICIobm9uZSkiICk7CisgICBjb3B5RmlsZU5hbWUgKCBpbk5hbWUsICAiKG5vbmUpIiApOworICAgY29weUZpbGVOYW1lICggb3V0TmFtZSwgIihub25lKSIgKTsKIAotICAgc3RyY3B5ICggcHJvZ05hbWVSZWFsbHksIGFyZ3ZbMF0gKTsKKyAgIGNvcHlGaWxlTmFtZSAoIHByb2dOYW1lUmVhbGx5LCBhcmd2WzBdICk7CiAgICBwcm9nTmFtZSA9ICZwcm9nTmFtZVJlYWxseVswXTsKICAgIGZvciAodG1wID0gJnByb2dOYW1lUmVhbGx5WzBdOyAqdG1wICE9ICdcMCc7IHRtcCsrKQogICAgICAgaWYgKCp0bXAgPT0gUEFUSF9TRVApIHByb2dOYW1lID0gdG1wICsgMTsKQEAgLTM5MDMsMjIgKzEzODAsMjggQEAKICAgICAgIH0KIAogCi0gICAvKi0tIERldGVybWluZSB3aGF0IHRvIGRvIChjb21wcmVzcy91bmNvbXByZXNzL3Rlc3QpLiAtLSovCi0gICAvKi0tIE5vdGUgdGhhdCBzdWJzZXF1ZW50IGZsYWcgaGFuZGxpbmcgbWF5IGNoYW5nZSB0aGlzLiAtLSovCi0gICBvcE1vZGUgPSBPTV9aOwotCi0gICBpZiAoIChzdHJjbXAgKCAiYnVuemlwMiIsICAgICBwcm9nTmFtZSApID09IDApIHx8Ci0gICAgICAgIChzdHJjbXAgKCAiQlVOWklQMiIsICAgICBwcm9nTmFtZSApID09IDApIHx8Ci0gICAgICAgIChzdHJjbXAgKCAiYnVuemlwMi5leGUiLCBwcm9nTmFtZSApID09IDApIHx8Ci0gICAgICAgIChzdHJjbXAgKCAiQlVOWklQMi5FWEUiLCBwcm9nTmFtZSApID09IDApICkKLSAgICAgIG9wTW9kZSA9IE9NX1VOWjsKLQotCiAgICAvKi0tIERldGVybWluZSBzb3VyY2UgbW9kZXM7IGZsYWcgaGFuZGxpbmcgbWF5IGNoYW5nZSB0aGlzIHRvby4gLS0qLwogICAgaWYgKG51bUZpbGVOYW1lcyA9PSAwKQogICAgICAgc3JjTW9kZSA9IFNNX0kyTzsgZWxzZSBzcmNNb2RlID0gU01fRjJGOwogCiAKKyAgIC8qLS0gRGV0ZXJtaW5lIHdoYXQgdG8gZG8gKGNvbXByZXNzL3VuY29tcHJlc3MvdGVzdC9jYXQpLiAtLSovCisgICAvKi0tIE5vdGUgdGhhdCBzdWJzZXF1ZW50IGZsYWcgaGFuZGxpbmcgbWF5IGNoYW5nZSB0aGlzLiAtLSovCisgICBvcE1vZGUgPSBPTV9aOworCisgICBpZiAoIChzdHJzdHIgKCBwcm9nTmFtZSwgInVuemlwIiApICE9IDApIHx8CisgICAgICAgIChzdHJzdHIgKCBwcm9nTmFtZSwgIlVOWklQIiApICE9IDApICkKKyAgICAgIG9wTW9kZSA9IE9NX1VOWjsKKworICAgaWYgKCAoc3Ryc3RyICggcHJvZ05hbWUsICJ6MmNhdCIgKSAhPSAwKSB8fAorICAgICAgICAoc3Ryc3RyICggcHJvZ05hbWUsICJaMkNBVCIgKSAhPSAwKSB8fAorICAgICAgICAoc3Ryc3RyICggcHJvZ05hbWUsICJ6Y2F0IiApICE9IDApICB8fAorICAgICAgICAoc3Ryc3RyICggcHJvZ05hbWUsICJaQ0FUIiApICE9IDApICkgIHsKKyAgICAgIG9wTW9kZSA9IE9NX1VOWjsKKyAgICAgIHNyY01vZGUgPSAobnVtRmlsZU5hbWVzID09IDApID8gU01fSTJPIDogU01fRjJPOworICAgfQorCisKICAgIC8qLS0gTG9vayBhdCB0aGUgZmxhZ3MuIC0tKi8KICAgIGZvciAoYWEgPSBhcmdMaXN0OyBhYSAhPSBOVUxMOyBhYSA9IGFhLT5saW5rKQogICAgICAgaWYgKGFhLT5uYW1lWzBdID09ICctJyAmJiBhYS0+bmFtZVsxXSAhPSAnLScpCkBAIC0zOTI2LDcgKzE0MDksOCBAQAogICAgICAgICAgICAgc3dpdGNoIChhYS0+bmFtZVtqXSkgewogICAgICAgICAgICAgICAgY2FzZSAnYyc6IHNyY01vZGUgICAgICAgICAgPSBTTV9GMk87IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZCc6IG9wTW9kZSAgICAgICAgICAgPSBPTV9VTlo7IGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAnZic6IG9wTW9kZSAgICAgICAgICAgPSBPTV9aOyBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgJ3onOiBvcE1vZGUgICAgICAgICAgID0gT01fWjsgYnJlYWs7CisgICAgICAgICAgICAgICBjYXNlICdmJzogZm9yY2VPdmVyd3JpdGUgICA9IFRydWU7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndCc6IG9wTW9kZSAgICAgICAgICAgPSBPTV9URVNUOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2snOiBrZWVwSW5wdXRGaWxlcyAgID0gVHJ1ZTsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdzJzogc21hbGxNb2RlICAgICAgICA9IFRydWU7IGJyZWFrOwpAQCAtMzk1Nyw2ICsxNDQxLDcgQEAKICAgICAgIGlmIChJU0ZMQUcoIi0tc3Rkb3V0IikpICAgICAgICAgICAgc3JjTW9kZSAgICAgICAgICA9IFNNX0YyTzsgIGVsc2UKICAgICAgIGlmIChJU0ZMQUcoIi0tZGVjb21wcmVzcyIpKSAgICAgICAgb3BNb2RlICAgICAgICAgICA9IE9NX1VOWjsgIGVsc2UKICAgICAgIGlmIChJU0ZMQUcoIi0tY29tcHJlc3MiKSkgICAgICAgICAgb3BNb2RlICAgICAgICAgICA9IE9NX1o7ICAgIGVsc2UKKyAgICAgIGlmIChJU0ZMQUcoIi0tZm9yY2UiKSkgICAgICAgICAgICAgZm9yY2VPdmVyd3JpdGUgICA9IFRydWU7ICAgIGVsc2UKICAgICAgIGlmIChJU0ZMQUcoIi0tdGVzdCIpKSAgICAgICAgICAgICAgb3BNb2RlICAgICAgICAgICA9IE9NX1RFU1Q7IGVsc2UKICAgICAgIGlmIChJU0ZMQUcoIi0ta2VlcCIpKSAgICAgICAgICAgICAga2VlcElucHV0RmlsZXMgICA9IFRydWU7ICAgIGVsc2UKICAgICAgIGlmIChJU0ZMQUcoIi0tc21hbGwiKSkgICAgICAgICAgICAgc21hbGxNb2RlICAgICAgICA9IFRydWU7ICAgIGVsc2UKQEAgLTM5NzQsMTQgKzE0NTksOSBAQAogICAgICAgICAgfQogICAgfQogCisgICBpZiAodmVyYm9zaXR5ID4gNCkgdmVyYm9zaXR5ID0gNDsKICAgIGlmIChvcE1vZGUgPT0gT01fWiAmJiBzbWFsbE1vZGUpIGJsb2NrU2l6ZTEwMGsgPSAyOwogCi0gICBpZiAob3BNb2RlID09IE9NX1ogJiYgc3JjTW9kZSA9PSBTTV9GMk8gJiYgbnVtRmlsZU5hbWVzID4gMSkgewotICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiVzOiBJIHdvbid0IGNvbXByZXNzIG11bHRpcGxlIGZpbGVzIHRvIHN0ZG91dC5cbiIsCi0gICAgICAgICAgICAgICAgcHJvZ05hbWUgKTsKLSAgICAgIGV4aXQgKCAxICk7Ci0gICB9Ci0KICAgIGlmIChzcmNNb2RlID09IFNNX0YyTyAmJiBudW1GaWxlTmFtZXMgPT0gMCkgewogICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiVzOiAtYyBleHBlY3RzIGF0IGxlYXN0IG9uZSBmaWxlbmFtZS5cbiIsCiAgICAgICAgICAgICAgICAgcHJvZ05hbWUgKTsKQEAgLTM5OTcsNyArMTQ3Nyw2IEBACiAgICBpZiAob3BNb2RlICE9IE9NX1opIGJsb2NrU2l6ZTEwMGsgPSAwOwogCiAgICBpZiAob3BNb2RlID09IE9NX1opIHsKLSAgICAgIGFsbG9jYXRlQ29tcHJlc3NTdHJ1Y3R1cmVzKCk7CiAgICAgICBpZiAoc3JjTW9kZSA9PSBTTV9JMk8pCiAgICAgICAgICBjb21wcmVzcyAoIE5VTEwgKTsKICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2J6aXAyLnR4dCBiL2J6aXAyLnR4dAppbmRleCBhZWU4ZTJiLi44OThkZmU4IDEwMDY0NAotLS0gYS9iemlwMi50eHQKKysrIGIvYnppcDIudHh0CkBAIC0xLDIyICsxLDIyIEBACiAKLQotCiBiemlwMigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMigxKQogCiAKIE5BTUUKLSAgICAgICBiemlwMiwgYnVuemlwMiAtIGEgYmxvY2stc29ydGluZyBmaWxlIGNvbXByZXNzb3IsIHYwLjEKKyAgICAgICBiemlwMiwgYnVuemlwMiAtIGEgYmxvY2stc29ydGluZyBmaWxlIGNvbXByZXNzb3IsIHYwLjkuMAorICAgICAgIGJ6Y2F0IC0gZGVjb21wcmVzc2VzIGZpbGVzIHRvIHN0ZG91dAogICAgICAgIGJ6aXAycmVjb3ZlciAtIHJlY292ZXJzIGRhdGEgZnJvbSBkYW1hZ2VkIGJ6aXAyIGZpbGVzCiAKIAogU1lOT1BTSVMKLSAgICAgICBiemlwMiBbIC1jZGZrc3R2VkwxMjM0NTY3ODkgXSBbIGZpbGVuYW1lcyAuLi4gIF0KLSAgICAgICBidW56aXAyIFsgLWt2c1ZMIF0gWyBmaWxlbmFtZXMgLi4uICBdCisgICAgICAgYnppcDIgWyAtY2Rma3N0dnpWTDEyMzQ1Njc4OSBdIFsgZmlsZW5hbWVzIC4uLiAgXQorICAgICAgIGJ1bnppcDIgWyAtZmt2c1ZMIF0gWyBmaWxlbmFtZXMgLi4uICBdCisgICAgICAgYnpjYXQgWyAtcyBdIFsgZmlsZW5hbWVzIC4uLiAgXQogICAgICAgIGJ6aXAycmVjb3ZlciBmaWxlbmFtZQogCiAKIERFU0NSSVBUSU9OCi0gICAgICAgQnppcDIgIGNvbXByZXNzZXMgIGZpbGVzICB1c2luZyB0aGUgQnVycm93cy1XaGVlbGVyIGJsb2NrLQorICAgICAgIGJ6aXAyICBjb21wcmVzc2VzICBmaWxlcyAgdXNpbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciBibG9jay0KICAgICAgICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCAgYW5kICBIdWZmbWFuICBjb2RpbmcuCiAgICAgICAgQ29tcHJlc3Npb24gIGlzICBnZW5lcmFsbHkgIGNvbnNpZGVyYWJseSAgYmV0dGVyIHRoYW4gdGhhdAogICAgICAgIGFjaGlldmVkIGJ5IG1vcmUgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICBUaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGRlbGliZXJhdGVseSB2ZXJ5IHNpbWlsYXIgIHRvCiAgICAgICAgdGhvc2Ugb2YgR05VIEd6aXAsIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLgogCi0gICAgICAgQnppcDIgIGV4cGVjdHMgIGEgbGlzdCBvZiBmaWxlIG5hbWVzIHRvIGFjY29tcGFueSB0aGUgY29tLQorICAgICAgIGJ6aXAyICBleHBlY3RzICBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB0byBhY2NvbXBhbnkgdGhlIGNvbS0KICAgICAgICBtYW5kLWxpbmUgZmxhZ3MuICBFYWNoIGZpbGUgaXMgcmVwbGFjZWQgIGJ5ICBhICBjb21wcmVzc2VkCiAgICAgICAgdmVyc2lvbiAgb2YgIGl0c2VsZiwgIHdpdGggIHRoZSAgbmFtZSAib3JpZ2luYWxfbmFtZS5iejIiLgogICAgICAgIEVhY2ggY29tcHJlc3NlZCBmaWxlIGhhcyB0aGUgc2FtZSAgbW9kaWZpY2F0aW9uICBkYXRlICBhbmQKQEAgLTM4LDggKzM4LDggQEAKICAgICAgICBjZXB0cywgb3IgaGF2ZSBzZXJpb3VzIGZpbGUgbmFtZSBsZW5ndGggcmVzdHJpY3Rpb25zLCBzdWNoCiAgICAgICAgYXMgTVMtRE9TLgogCi0gICAgICAgQnppcDIgIGFuZCAgYnVuemlwMiAgd2lsbCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzOyBpZgotICAgICAgIHlvdSB3YW50IHRoaXMgdG8gaGFwcGVuLCB5b3Ugc2hvdWxkIGRlbGV0ZSB0aGVtIGZpcnN0LgorICAgICAgIGJ6aXAyICBhbmQgIGJ1bnppcDIgd2lsbCBieSBkZWZhdWx0IG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcKKyAgICAgICBmaWxlczsgaWYgeW91IHdhbnQgdGhpcyB0byBoYXBwZW4sIHNwZWNpZnkgdGhlIC1mIGZsYWcuCiAKICAgICAgICBJZiBubyBmaWxlIG5hbWVzICBhcmUgIHNwZWNpZmllZCwgIGJ6aXAyICBjb21wcmVzc2VzICBmcm9tCiAgICAgICAgc3RhbmRhcmQgIGlucHV0ICB0byAgc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCBiemlwMgpAQCAtNDcsMjggKzQ3LDI5IEBACiAgICAgICAgdGhpcyAgd291bGQgIGJlICBlbnRpcmVseSAgaW5jb21wcmVoZW5zaWJsZSAgYW5kIHRoZXJlZm9yZQogICAgICAgIHBvaW50bGVzcy4KIAotICAgICAgIEJ1bnppcDIgKG9yIGJ6aXAyIC1kICkgZGVjb21wcmVzc2VzIGFuZCByZXN0b3JlcyBhbGwgc3BlYy0KKyAgICAgICBidW56aXAyIChvciBiemlwMiAtZCApIGRlY29tcHJlc3NlcyBhbmQgcmVzdG9yZXMgYWxsIHNwZWMtCiAgICAgICAgaWZpZWQgZmlsZXMgd2hvc2UgbmFtZXMgZW5kIGluICIuYnoyIi4gIEZpbGVzIHdpdGhvdXQgdGhpcwogICAgICAgIHN1ZmZpeCBhcmUgaWdub3JlZC4gIEFnYWluLCBzdXBwbHlpbmcgbm8gZmlsZW5hbWVzICBjYXVzZXMKICAgICAgICBkZWNvbXByZXNzaW9uIGZyb20gc3RhbmRhcmQgaW5wdXQgdG8gc3RhbmRhcmQgb3V0cHV0LgogCisgICAgICAgYnVuemlwMiB3aWxsIGNvcnJlY3RseSBkZWNvbXByZXNzIGEgZmlsZSB3aGljaCBpcyB0aGUgY29uLQorICAgICAgIGNhdGVuYXRpb24gb2YgdHdvIG9yIG1vcmUgY29tcHJlc3NlZCBmaWxlcy4gIFRoZSByZXN1bHQgaXMKKyAgICAgICB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29ycmVzcG9uZGluZyB1bmNvbXByZXNzZWQgZmlsZXMuCisgICAgICAgSW50ZWdyaXR5IHRlc3RpbmcgKC10KSBvZiBjb25jYXRlbmF0ZWQgY29tcHJlc3NlZCBmaWxlcyBpcworICAgICAgIGFsc28gc3VwcG9ydGVkLgorCiAgICAgICAgWW91ICBjYW4gYWxzbyBjb21wcmVzcyBvciBkZWNvbXByZXNzIGZpbGVzIHRvIHRoZSBzdGFuZGFyZAotICAgICAgIG91dHB1dCBieSBnaXZpbmcgdGhlIC1jIGZsYWcuICBZb3UgY2FuIGRlY29tcHJlc3MgbXVsdGlwbGUKLSAgICAgICBmaWxlcyAgbGlrZSAgdGhpcywgYnV0IHlvdSBtYXkgb25seSBjb21wcmVzcyBhIHNpbmdsZSBmaWxlCi0gICAgICAgdGhpcyB3YXksIHNpbmNlIGl0IHdvdWxkIG90aGVyd2lzZSBiZSBkaWZmaWN1bHQgIHRvICBzZXBhLQotICAgICAgIHJhdGUgIG91dCAgdGhlICBjb21wcmVzc2VkIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgb3JpZ2luYWwKLSAgICAgICBmaWxlcy4KKyAgICAgICBvdXRwdXQgYnkgZ2l2aW5nIHRoZSAtYyBmbGFnLiAgTXVsdGlwbGUgZmlsZXMgbWF5IGJlICBjb20tCisgICAgICAgcHJlc3NlZCBhbmQgZGVjb21wcmVzc2VkIGxpa2UgdGhpcy4gIFRoZSByZXN1bHRpbmcgb3V0cHV0cworICAgICAgIGFyZSBmZWQgc2VxdWVudGlhbGx5IHRvIHN0ZG91dC4gIENvbXByZXNzaW9uICBvZiAgbXVsdGlwbGUKKyAgICAgICBmaWxlcyAgaW4gdGhpcyBtYW5uZXIgZ2VuZXJhdGVzIGEgc3RyZWFtIGNvbnRhaW5pbmcgbXVsdGktCisgICAgICAgcGxlIGNvbXByZXNzZWQgZmlsZSByZXByZXNlbnRhdGlvbnMuICBTdWNoIGEgc3RyZWFtIGNhbiBiZQorICAgICAgIGRlY29tcHJlc3NlZCAgY29ycmVjdGx5ICBvbmx5ICBieSAgYnppcDIgIHZlcnNpb24gMC45LjAgb3IKKyAgICAgICBsYXRlci4gIEVhcmxpZXIgdmVyc2lvbnMgb2YgYnppcDIgd2lsbCBzdG9wICBhZnRlciAgZGVjb20tCisgICAgICAgcHJlc3NpbmcgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIHN0cmVhbS4KIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0KLQotCi0KLQotYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKLQorICAgICAgIGJ6Y2F0ICAob3IgYnppcDIgLWRjICkgZGVjb21wcmVzc2VzIGFsbCBzcGVjaWZpZWQgZmlsZXMgdG8KKyAgICAgICB0aGUgc3RhbmRhcmQgb3V0cHV0LgogCiAgICAgICAgQ29tcHJlc3Npb24gaXMgYWx3YXlzIHBlcmZvcm1lZCwgZXZlbiAgaWYgIHRoZSAgY29tcHJlc3NlZAogICAgICAgIGZpbGUgIGlzIHNsaWdodGx5IGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbC4gIEZpbGVzIG9mIGxlc3MKQEAgLTEwOCwxMyArMTA5LDE0IEBACiAgICAgICAgZmlsZSwgYW5kIGJ1bnppcDIgdGhlbiBhbGxvY2F0ZXMgaXRzZWxmIGp1c3QgZW5vdWdoIG1lbW9yeQogICAgICAgIHRvIGRlY29tcHJlc3MgdGhlIGZpbGUuICBTaW5jZSBibG9jayBzaXplcyBhcmUgIHN0b3JlZCAgaW4KICAgICAgICBjb21wcmVzc2VkICBmaWxlcywgIGl0IGZvbGxvd3MgdGhhdCB0aGUgZmxhZ3MgLTEgdG8gLTkgYXJlCi0gICAgICAgaXJyZWxldmFudCB0byBhbmQgc28gaWdub3JlZCBkdXJpbmcgIGRlY29tcHJlc3Npb24uICAgQ29tLQotICAgICAgIHByZXNzaW9uICBhbmQgZGVjb21wcmVzc2lvbiByZXF1aXJlbWVudHMsIGluIGJ5dGVzLCBjYW4gYmUKLSAgICAgICBlc3RpbWF0ZWQgYXM6CisgICAgICAgaXJyZWxldmFudCAgdG8gIGFuZCAgc28gIGlnbm9yZWQgICBkdXJpbmcgICBkZWNvbXByZXNzaW9uLgorCisgICAgICAgQ29tcHJlc3Npb24gIGFuZCBkZWNvbXByZXNzaW9uIHJlcXVpcmVtZW50cywgaW4gYnl0ZXMsIGNhbgorICAgICAgIGJlIGVzdGltYXRlZCBhczoKIAogICAgICAgICAgICAgIENvbXByZXNzaW9uOiAgIDQwMGsgKyAoIDcgeCBibG9jayBzaXplICkKIAotICAgICAgICAgICAgIERlY29tcHJlc3Npb246IDEwMGsgKyAoIDUgeCBibG9jayBzaXplICksIG9yCisgICAgICAgICAgICAgRGVjb21wcmVzc2lvbjogMTAwayArICggNCB4IGJsb2NrIHNpemUgKSwgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDBrICsgKCAyLjUgeCBibG9jayBzaXplICkKIAogICAgICAgIExhcmdlciAgYmxvY2sgIHNpemVzICBnaXZlICByYXBpZGx5ICBkaW1pbmlzaGluZyAgbWFyZ2luYWwKQEAgLTEyNSwxOSArMTI3LDggQEAKICAgICAgICByZXF1aXJlbWVudCAgaXMgIHNldCAgYXQgY29tcHJlc3Npb24tdGltZSBieSB0aGUgY2hvaWNlIG9mCiAgICAgICAgYmxvY2sgc2l6ZS4KIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0KLQotCi0KLQotYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKLQotCiAgICAgICAgRm9yIGZpbGVzIGNvbXByZXNzZWQgd2l0aCB0aGUgIGRlZmF1bHQgIDkwMGsgIGJsb2NrICBzaXplLAotICAgICAgIGJ1bnppcDIgIHdpbGwgcmVxdWlyZSBhYm91dCA0NjAwIGtieXRlcyB0byBkZWNvbXByZXNzLiAgVG8KKyAgICAgICBidW56aXAyICB3aWxsIHJlcXVpcmUgYWJvdXQgMzcwMCBrYnl0ZXMgdG8gZGVjb21wcmVzcy4gIFRvCiAgICAgICAgc3VwcG9ydCBkZWNvbXByZXNzaW9uIG9mIGFueSBmaWxlIG9uIGEgNCBtZWdhYnl0ZSBtYWNoaW5lLAogICAgICAgIGJ1bnppcDIgIGhhcyAgYW4gIG9wdGlvbiB0byBkZWNvbXByZXNzIHVzaW5nIGFwcHJveGltYXRlbHkKICAgICAgICBoYWxmIHRoaXMgYW1vdW50IG9mIG1lbW9yeSwgYWJvdXQgMjMwMCBrYnl0ZXMuICBEZWNvbXByZXMtCkBAIC0xNTcsOCArMTQ4LDggQEAKICAgICAgICBmaWxlIDIwLDAwMCBieXRlcyBsb25nIHdpdGggdGhlIGZsYWcgIC05ICB3aWxsICBjYXVzZSAgdGhlCiAgICAgICAgY29tcHJlc3NvciAgdG8gIGFsbG9jYXRlICBhcm91bmQgNjcwMGsgb2YgbWVtb3J5LCBidXQgb25seQogICAgICAgIHRvdWNoIDQwMGsgKyAyMDAwMCAqIDcgPSA1NDAga2J5dGVzIG9mIGl0LiAgU2ltaWxhcmx5LCB0aGUKLSAgICAgICBkZWNvbXByZXNzb3IgIHdpbGwgIGFsbG9jYXRlICA0NjAwayAgYnV0IG9ubHkgdG91Y2ggMTAwayArCi0gICAgICAgMjAwMDAgKiA1ID0gMjAwIGtieXRlcy4KKyAgICAgICBkZWNvbXByZXNzb3IgIHdpbGwgIGFsbG9jYXRlICAzNzAwayAgYnV0IG9ubHkgdG91Y2ggMTAwayArCisgICAgICAgMjAwMDAgKiA0ID0gMTgwIGtieXRlcy4KIAogICAgICAgIEhlcmUgaXMgYSB0YWJsZSB3aGljaCBzdW1tYXJpc2VzIHRoZSBtYXhpbXVtIG1lbW9yeSAgdXNhZ2UKICAgICAgICBmb3IgIGRpZmZlcmVudCAgYmxvY2sgIHNpemVzLiAgIEFsc28gcmVjb3JkZWQgaXMgdGhlIHRvdGFsCkBAIC0xNzIsMTUgKzE2MywxNSBAQAogICAgICAgICAgICAgICAgICAgQ29tcHJlc3MgICBEZWNvbXByZXNzICAgRGVjb21wcmVzcyAgIENvcnB1cwogICAgICAgICAgICBGbGFnICAgICB1c2FnZSAgICAgIHVzYWdlICAgICAgIC1zIHVzYWdlICAgICBTaXplCiAKLSAgICAgICAgICAgIC0xICAgICAgMTEwMGsgICAgICAgNjAwayAgICAgICAgIDM1MGsgICAgICA5MTQ3MDQKLSAgICAgICAgICAgIC0yICAgICAgMTgwMGsgICAgICAxMTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKLSAgICAgICAgICAgIC0zICAgICAgMjUwMGsgICAgICAxNjAwayAgICAgICAgIDg1MGsgICAgICA4NjAzMzgKLSAgICAgICAgICAgIC00ICAgICAgMzIwMGsgICAgICAyMTAwayAgICAgICAgMTEwMGsgICAgICA4NDY4OTkKLSAgICAgICAgICAgIC01ICAgICAgMzkwMGsgICAgICAyNjAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKLSAgICAgICAgICAgIC02ICAgICAgNDYwMGsgICAgICAzMTAwayAgICAgICAgMTYwMGsgICAgICA4Mzg2MjYKLSAgICAgICAgICAgIC03ICAgICAgNTQwMGsgICAgICAzNjAwayAgICAgICAgMTg1MGsgICAgICA4MzQwOTYKLSAgICAgICAgICAgIC04ICAgICAgNjAwMGsgICAgICA0MTAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKLSAgICAgICAgICAgIC05ICAgICAgNjcwMGsgICAgICA0NjAwayAgICAgICAgMjM1MGsgICAgICA4Mjg2NDIKKyAgICAgICAgICAgIC0xICAgICAgMTEwMGsgICAgICAgNTAwayAgICAgICAgIDM1MGsgICAgICA5MTQ3MDQKKyAgICAgICAgICAgIC0yICAgICAgMTgwMGsgICAgICAgOTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKKyAgICAgICAgICAgIC0zICAgICAgMjUwMGsgICAgICAxMzAwayAgICAgICAgIDg1MGsgICAgICA4NjAzMzgKKyAgICAgICAgICAgIC00ICAgICAgMzIwMGsgICAgICAxNzAwayAgICAgICAgMTEwMGsgICAgICA4NDY4OTkKKyAgICAgICAgICAgIC01ICAgICAgMzkwMGsgICAgICAyMTAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKKyAgICAgICAgICAgIC02ICAgICAgNDYwMGsgICAgICAyNTAwayAgICAgICAgMTYwMGsgICAgICA4Mzg2MjYKKyAgICAgICAgICAgIC03ICAgICAgNTQwMGsgICAgICAyOTAwayAgICAgICAgMTg1MGsgICAgICA4MzQwOTYKKyAgICAgICAgICAgIC04ICAgICAgNjAwMGsgICAgICAzMzAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKKyAgICAgICAgICAgIC05ICAgICAgNjcwMGsgICAgICAzNzAwayAgICAgICAgMjM1MGsgICAgICA4Mjg2NDIKIAogCiBPUFRJT05TCkBAIC0xODksNDcgKzE4MCwzNyBAQAogICAgICAgICAgICAgICBkZWNvbXByZXNzIG11bHRpcGxlIGZpbGVzIHRvIHN0ZG91dCwgYnV0IHdpbGwgIG9ubHkKICAgICAgICAgICAgICAgY29tcHJlc3MgYSBzaW5nbGUgZmlsZSB0byBzdGRvdXQuCiAKLQotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLQotCi0KLQotCi1iemlwMigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMigxKQotCi0KICAgICAgICAtZCAtLWRlY29tcHJlc3MKLSAgICAgICAgICAgICAgRm9yY2UgIGRlY29tcHJlc3Npb24uICBCemlwMiBhbmQgYnVuemlwMiBhcmUgcmVhbGx5Ci0gICAgICAgICAgICAgIHRoZSBzYW1lIHByb2dyYW0sIGFuZCB0aGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciB0bwotICAgICAgICAgICAgICBjb21wcmVzcyAgb3IgIGRlY29tcHJlc3MgIGlzICBkb25lICBvbiB0aGUgYmFzaXMgb2YKLSAgICAgICAgICAgICAgd2hpY2ggbmFtZSBpcyB1c2VkLiAgVGhpcyBmbGFnIG92ZXJyaWRlcyB0aGF0IG1lY2gtCi0gICAgICAgICAgICAgIGFuaXNtLCBhbmQgZm9yY2VzIGJ6aXAyIHRvIGRlY29tcHJlc3MuCisgICAgICAgICAgICAgIEZvcmNlICBkZWNvbXByZXNzaW9uLiAgYnppcDIsIGJ1bnppcDIgYW5kIGJ6Y2F0IGFyZQorICAgICAgICAgICAgICByZWFsbHkgdGhlIHNhbWUgcHJvZ3JhbSwgIGFuZCAgdGhlICBkZWNpc2lvbiAgYWJvdXQKKyAgICAgICAgICAgICAgd2hhdCAgYWN0aW9ucyB0byB0YWtlIGlzIGRvbmUgb24gdGhlIGJhc2lzIG9mIHdoaWNoCisgICAgICAgICAgICAgIG5hbWUgaXMgdXNlZC4gIFRoaXMgZmxhZyBvdmVycmlkZXMgdGhhdCAgbWVjaGFuaXNtLAorICAgICAgICAgICAgICBhbmQgZm9yY2VzIGJ6aXAyIHRvIGRlY29tcHJlc3MuCiAKLSAgICAgICAtZiAtLWNvbXByZXNzCisgICAgICAgLXogLS1jb21wcmVzcwogICAgICAgICAgICAgICBUaGUgIGNvbXBsZW1lbnQgIHRvIC1kOiBmb3JjZXMgY29tcHJlc3Npb24sIHJlZ2FyZC0KICAgICAgICAgICAgICAgbGVzcyBvZiB0aGUgaW52b2thdGlvbiBuYW1lLgogCiAgICAgICAgLXQgLS10ZXN0CiAgICAgICAgICAgICAgIENoZWNrIGludGVncml0eSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUocyksIGJ1dCBkb24ndAogICAgICAgICAgICAgICBkZWNvbXByZXNzICB0aGVtLiAgIFRoaXMgIHJlYWxseSAgcGVyZm9ybXMgIGEgdHJpYWwKLSAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbiBhbmQgdGhyb3dzIGF3YXkgdGhlIHJlc3VsdCwgdXNpbmcgdGhlCi0gICAgICAgICAgICAgIGxvdy1tZW1vcnkgZGVjb21wcmVzc2lvbiBhbGdvcml0aG0gKHNlZSAtcykuCisgICAgICAgICAgICAgIGRlY29tcHJlc3Npb24gYW5kIHRocm93cyBhd2F5IHRoZSByZXN1bHQuCisKKyAgICAgICAtZiAtLWZvcmNlCisgICAgICAgICAgICAgIEZvcmNlIG92ZXJ3cml0ZSBvZiBvdXRwdXQgZmlsZXMuICAgTm9ybWFsbHksICBiemlwMgorICAgICAgICAgICAgICB3aWxsIG5vdCBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzLgogCiAgICAgICAgLWsgLS1rZWVwCiAgICAgICAgICAgICAgIEtlZXAgIChkb24ndCBkZWxldGUpIGlucHV0IGZpbGVzIGR1cmluZyBjb21wcmVzc2lvbgogICAgICAgICAgICAgICBvciBkZWNvbXByZXNzaW9uLgogCiAgICAgICAgLXMgLS1zbWFsbAotICAgICAgICAgICAgICBSZWR1Y2UgIG1lbW9yeSAgdXNhZ2UsICBib3RoICBmb3IgIGNvbXByZXNzaW9uICBhbmQKLSAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbi4gIEZpbGVzIGFyZSBkZWNvbXByZXNzZWQgdXNpbmcgYSBtb2QtCi0gICAgICAgICAgICAgIGlmaWVkIGFsZ29yaXRobSB3aGljaCBvbmx5IHJlcXVpcmVzIDIuNSAgYnl0ZXMgIHBlcgotICAgICAgICAgICAgICBibG9jayAgYnl0ZS4gICBUaGlzICBtZWFucyAgYW55ICBmaWxlIGNhbiBiZSBkZWNvbS0KLSAgICAgICAgICAgICAgcHJlc3NlZCBpbiAyMzAwayBvZiBtZW1vcnksICBhbGJlaXQgIHNvbWV3aGF0ICBtb3JlCi0gICAgICAgICAgICAgIHNsb3dseSB0aGFuIHVzdWFsLgorICAgICAgICAgICAgICBSZWR1Y2UgbWVtb3J5IHVzYWdlLCBmb3IgY29tcHJlc3Npb24sIGRlY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgYW5kICB0ZXN0aW5nLiAgIEZpbGVzICBhcmUgIGRlY29tcHJlc3NlZCBhbmQgdGVzdGVkCisgICAgICAgICAgICAgIHVzaW5nIGEgbW9kaWZpZWQgYWxnb3JpdGhtIHdoaWNoIG9ubHkgcmVxdWlyZXMgIDIuNQorICAgICAgICAgICAgICBieXRlcyAgcGVyICBibG9jayBieXRlLiAgVGhpcyBtZWFucyBhbnkgZmlsZSBjYW4gYmUKKyAgICAgICAgICAgICAgZGVjb21wcmVzc2VkIGluIDIzMDBrIG9mIG1lbW9yeSwgIGFsYmVpdCAgYXQgIGFib3V0CisgICAgICAgICAgICAgIGhhbGYgdGhlIG5vcm1hbCBzcGVlZC4KIAogICAgICAgICAgICAgICBEdXJpbmcgIGNvbXByZXNzaW9uLCAgLXMgIHNlbGVjdHMgIGEgIGJsb2NrIHNpemUgb2YKICAgICAgICAgICAgICAgMjAwaywgd2hpY2ggbGltaXRzIG1lbW9yeSB1c2UgdG8gIGFyb3VuZCAgdGhlICBzYW1lCkBAIC0yMzgsMzYgKzIxOSwyMSBAQAogICAgICAgICAgICAgICBtZWdhYnl0ZXMgIG9yICBsZXNzKSwgIHVzZSAgLXMgZm9yIGV2ZXJ5dGhpbmcuICBTZWUKICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgYWJvdmUuCiAKLQogICAgICAgIC12IC0tdmVyYm9zZQogICAgICAgICAgICAgICBWZXJib3NlIG1vZGUgLS0gc2hvdyB0aGUgY29tcHJlc3Npb24gcmF0aW8gZm9yIGVhY2gKICAgICAgICAgICAgICAgZmlsZSAgcHJvY2Vzc2VkLiAgIEZ1cnRoZXIgIC12J3MgIGluY3JlYXNlIHRoZSB2ZXItCiAgICAgICAgICAgICAgIGJvc2l0eSBsZXZlbCwgc3Bld2luZyBvdXQgbG90cyBvZiBpbmZvcm1hdGlvbiB3aGljaAogICAgICAgICAgICAgICBpcyBwcmltYXJpbHkgb2YgaW50ZXJlc3QgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCiAKLSAgICAgICAtTCAtLWxpY2Vuc2UKKyAgICAgICAtTCAtLWxpY2Vuc2UgLVYgLS12ZXJzaW9uCiAgICAgICAgICAgICAgIERpc3BsYXkgIHRoZSAgc29mdHdhcmUgIHZlcnNpb24sICBsaWNlbnNlIHRlcm1zIGFuZAogICAgICAgICAgICAgICBjb25kaXRpb25zLgogCi0gICAgICAgLVYgLS12ZXJzaW9uCi0gICAgICAgICAgICAgIFNhbWUgYXMgLUwuCi0KICAgICAgICAtMSB0byAtOQogICAgICAgICAgICAgICBTZXQgdGhlIGJsb2NrIHNpemUgdG8gMTAwIGssIDIwMCBrIC4uICA5MDAgIGsgIHdoZW4KICAgICAgICAgICAgICAgY29tcHJlc3NpbmcuICAgSGFzICBubyAgZWZmZWN0ICB3aGVuIGRlY29tcHJlc3NpbmcuCiAgICAgICAgICAgICAgIFNlZSBNRU1PUlkgTUFOQUdFTUVOVCBhYm92ZS4KIAotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0KLQotCi0KLQotYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKLQotCiAgICAgICAgLS1yZXBldGl0aXZlLWZhc3QKICAgICAgICAgICAgICAgYnppcDIgaW5qZWN0cyBzb21lIHNtYWxsICBwc2V1ZG8tcmFuZG9tICB2YXJpYXRpb25zCiAgICAgICAgICAgICAgIGludG8gIHZlcnkgIHJlcGV0aXRpdmUgIGJsb2NrcyAgdG8gbGltaXQgd29yc3QtY2FzZQpAQCAtMjc4LDcgKzI0NCw2IEBACiAgICAgICAgICAgICAgIHdvdWxkIHRha2UgYmVmb3JlIHJlc29ydGluZyB0byByYW5kb21pc2F0aW9uLiAgVGhpcwogICAgICAgICAgICAgICBmbGFnIG1ha2VzIGl0IGdpdmUgdXAgbXVjaCBzb29uZXIuCiAKLQogICAgICAgIC0tcmVwZXRpdGl2ZS1iZXN0CiAgICAgICAgICAgICAgIE9wcG9zaXRlICBvZiAgLS1yZXBldGl0aXZlLWZhc3Q7ICB0cnkgIGEgbG90IGhhcmRlcgogICAgICAgICAgICAgICBiZWZvcmUgcmVzb3J0aW5nIHRvIHJhbmRvbWlzYXRpb24uCkBAIC0zMDYsMTAgKzI3MSwxMCBAQAogICAgICAgIGJ6aXAycmVjb3ZlciB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCwgdGhlIG5hbWUgb2YgdGhlIGRhbS0KICAgICAgICBhZ2VkIGZpbGUsIGFuZCB3cml0ZXMgYSBudW1iZXIgb2YgZmlsZXMgInJlYzAwMDFmaWxlLmJ6MiIsCiAgICAgICAgInJlYzAwMDJmaWxlLmJ6MiIsIGV0YywgY29udGFpbmluZyB0aGUgIGV4dHJhY3RlZCAgYmxvY2tzLgotICAgICAgIFRoZSBvdXRwdXQgZmlsZW5hbWVzIGFyZSBkZXNpZ25lZCBzbyB0aGF0IHRoZSB1c2Ugb2Ygd2lsZC0KLSAgICAgICBjYXJkcyBpbiBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgLS0gZm9yIGV4YW1wbGUsICJiemlwMiAgLWRjCi0gICAgICAgcmVjKmZpbGUuYnoyICA+ICByZWNvdmVyZWRfZGF0YSIgLS0gbGlzdHMgdGhlIGZpbGVzIGluIHRoZQotICAgICAgICJyaWdodCIgb3JkZXIuCisgICAgICAgVGhlICBvdXRwdXQgIGZpbGVuYW1lcyAgYXJlICBkZXNpZ25lZCAgc28gIHRoYXQgdGhlIHVzZSBvZgorICAgICAgIHdpbGRjYXJkcyBpbiBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgLS0gZm9yIGV4YW1wbGUsICAiYnppcDIKKyAgICAgICAtZGMgIHJlYypmaWxlLmJ6MiAgPiByZWNvdmVyZWRfZGF0YSIgLS0gbGlzdHMgdGhlIGZpbGVzIGluCisgICAgICAgdGhlICJyaWdodCIgb3JkZXIuCiAKICAgICAgICBiemlwMnJlY292ZXIgc2hvdWxkIGJlIG9mIG1vc3QgdXNlIGRlYWxpbmcgd2l0aCBsYXJnZSAuYnoyCiAgICAgICAgZmlsZXMsICBhcyAgdGhlc2Ugd2lsbCBjb250YWluIG1hbnkgYmxvY2tzLiAgSXQgaXMgY2xlYXJseQpAQCAtMzIyLDE4ICsyODcsNiBAQAogCiBQRVJGT1JNQU5DRSBOT1RFUwogICAgICAgIFRoZSBzb3J0aW5nIHBoYXNlIG9mIGNvbXByZXNzaW9uIGdhdGhlcnMgdG9nZXRoZXIgIHNpbWlsYXIKLQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0KLQotCi0KLQotYnppcDIoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnppcDIoMSkKLQotCiAgICAgICAgc3RyaW5ncyAgaW4gIHRoZSAgZmlsZS4gIEJlY2F1c2Ugb2YgdGhpcywgZmlsZXMgY29udGFpbmluZwogICAgICAgIHZlcnkgbG9uZyBydW5zIG9mICByZXBlYXRlZCAgc3ltYm9scywgIGxpa2UgICJhYWJhYWJhYWJhYWIKICAgICAgICAuLi4iICAgKHJlcGVhdGVkICAgc2V2ZXJhbCAgaHVuZHJlZCAgdGltZXMpICBtYXkgIGNvbXByZXNzCkBAIC0zNDgsMTAgKzMwMSw2IEBACiAgICAgICAgc2V2ZXJlIHNsb3duZXNzIGluIGNvbXByZXNzaW9uLCB0cnkgbWFraW5nIHRoZSBibG9jayAgc2l6ZQogICAgICAgIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCB3aXRoIGZsYWcgLTEuCiAKLSAgICAgICBJbmNvbXByZXNzaWJsZSBvciB2aXJ0dWFsbHktaW5jb21wcmVzc2libGUgZGF0YSBtYXkgZGVjb20tCi0gICAgICAgcHJlc3MgcmF0aGVyIG1vcmUgc2xvd2x5IHRoYW4gb25lIHdvdWxkIGhvcGUuICBUaGlzIGlzIGR1ZQotICAgICAgIHRvIGEgbmFpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vdmUtdG8tZnJvbnQgY29kZXIuCi0KICAgICAgICBiemlwMiAgdXN1YWxseSAgYWxsb2NhdGVzICBzZXZlcmFsICBtZWdhYnl0ZXMgb2YgbWVtb3J5IHRvCiAgICAgICAgb3BlcmF0ZSBpbiwgYW5kIHRoZW4gY2hhcmdlcyBhbGwgb3ZlciBpdCBpbiBhIGZhaXJseSAgcmFuLQogICAgICAgIGRvbSAgZmFzaGlvbi4gICBUaGlzIG1lYW5zIHRoYXQgcGVyZm9ybWFuY2UsIGJvdGggZm9yIGNvbS0KQEAgLTM2MiwxMiArMzExLDYgQEAKICAgICAgICBsYXJnZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuICBJIGltYWdpbmUgYnppcDIgd2lsbCBwZXItCiAgICAgICAgZm9ybSBiZXN0IG9uIG1hY2hpbmVzIHdpdGggdmVyeSBsYXJnZSBjYWNoZXMuCiAKLSAgICAgICBUZXN0IG1vZGUgKC10KSB1c2VzIHRoZSBsb3ctbWVtb3J5IGRlY29tcHJlc3Npb24gYWxnb3JpdGhtCi0gICAgICAgKC1zKS4gIFRoaXMgbWVhbnMgdGVzdCBtb2RlIGRvZXMgbm90IHJ1biAgYXMgIGZhc3QgIGFzICBpdAotICAgICAgIGNvdWxkOyAgaXQgIGNvdWxkICBydW4gYXMgZmFzdCBhcyB0aGUgbm9ybWFsIGRlY29tcHJlc3Npb24KLSAgICAgICBtYWNoaW5lcnkuICBUaGlzIGNvdWxkIGVhc2lseSBiZSBmaXhlZCBhdCB0aGUgY29zdCBvZiBzb21lCi0gICAgICAgY29kZSBibG9hdC4KLQogCiBDQVZFQVRTCiAgICAgICAgSS9PICBlcnJvciAgbWVzc2FnZXMgIGFyZSBub3QgYXMgaGVscGZ1bCBhcyB0aGV5IGNvdWxkIGJlLgpAQCAtMzc1LDkxICszMTgsMzggQEAKICAgICAgICBidXQgIHRoZSAgZGV0YWlscyAgb2YgIHdoYXQgIHRoZSBwcm9ibGVtIGlzIHNvbWV0aW1lcyBzZWVtCiAgICAgICAgcmF0aGVyIG1pc2xlYWRpbmcuCiAKLSAgICAgICBUaGlzIG1hbnVhbCBwYWdlIHBlcnRhaW5zIHRvIHZlcnNpb24gMC4xIG9mIGJ6aXAyLiAgSXQgbWF5Ci0gICAgICAgd2VsbCAgaGFwcGVuIHRoYXQgc29tZSBmdXR1cmUgdmVyc2lvbiB3aWxsIHVzZSBhIGRpZmZlcmVudAotICAgICAgIGNvbXByZXNzZWQgZmlsZSBmb3JtYXQuICBJZiB5b3UgdHJ5IHRvICBkZWNvbXByZXNzLCAgdXNpbmcKLSAgICAgICAwLjEsICBhICAuYnoyICBmaWxlIGNyZWF0ZWQgd2l0aCBzb21lIGZ1dHVyZSB2ZXJzaW9uIHdoaWNoCi0gICAgICAgdXNlcyBhIGRpZmZlcmVudCBjb21wcmVzc2VkIGZpbGUgZm9ybWF0LCAwLjEgd2lsbCBjb21wbGFpbgotICAgICAgIHRoYXQgIHlvdXIgIGZpbGUgICJpcyBub3QgYSBiemlwMiBmaWxlIi4gIElmIHRoYXQgaGFwcGVucywKLSAgICAgICB5b3Ugc2hvdWxkIG9idGFpbiBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgYnppcDIgIGFuZCAgdXNlCi0gICAgICAgdGhhdCB0byBkZWNvbXByZXNzIHRoZSBmaWxlLgorICAgICAgIFRoaXMgbWFudWFsIHBhZ2UgcGVydGFpbnMgdG8gdmVyc2lvbiAwLjkuMCBvZiBiemlwMi4gIENvbS0KKyAgICAgICBwcmVzc2VkICBkYXRhIGNyZWF0ZWQgYnkgdGhpcyB2ZXJzaW9uIGlzIGVudGlyZWx5IGZvcndhcmRzCisgICAgICAgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlLAorICAgICAgIHZlcnNpb24gIDAuMXBsMiwgIGJ1dCAgd2l0aCB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjogMC45LjAKKyAgICAgICBjYW4gY29ycmVjdGx5IGRlY29tcHJlc3MgbXVsdGlwbGUgY29uY2F0ZW5hdGVkICBjb21wcmVzc2VkCisgICAgICAgZmlsZXMuICAgMC4xcGwyICBjYW5ub3QgZG8gdGhpczsgaXQgd2lsbCBzdG9wIGFmdGVyIGRlY29tLQorICAgICAgIHByZXNzaW5nIGp1c3QgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIHN0cmVhbS4KIAogICAgICAgIFdpbGRjYXJkIGV4cGFuc2lvbiBmb3IgV2luZG93cyA5NSBhbmQgTlQgaXMgZmxha3kuCiAKLSAgICAgICBiemlwMnJlY292ZXIgIHVzZXMgIDMyLWJpdCBpbnRlZ2VycyB0byByZXByZXNlbnQgYml0IHBvc2ktCi0gICAgICAgdGlvbnMgaW4gY29tcHJlc3NlZCBmaWxlcywgc28gaXQgY2Fubm90IGhhbmRsZSAgY29tcHJlc3NlZAotCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKLQotCi0KLQotCi1iemlwMigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemlwMigxKQotCi0KLSAgICAgICBmaWxlcyAgbW9yZSB0aGFuIDUxMiBtZWdhYnl0ZXMgbG9uZy4gIFRoaXMgY291bGQgZWFzaWx5IGJlCisgICAgICAgYnppcDJyZWNvdmVyIHVzZXMgMzItYml0IGludGVnZXJzIHRvIHJlcHJlc2VudCAgYml0ICBwb3NpLQorICAgICAgIHRpb25zICBpbiBjb21wcmVzc2VkIGZpbGVzLCBzbyBpdCBjYW5ub3QgaGFuZGxlIGNvbXByZXNzZWQKKyAgICAgICBmaWxlcyBtb3JlIHRoYW4gNTEyIG1lZ2FieXRlcyBsb25nLiAgVGhpcyBjb3VsZCBlYXNpbHkgIGJlCiAgICAgICAgZml4ZWQuCiAKLSAgICAgICBiemlwMnJlY292ZXIgc29tZXRpbWVzIHJlcG9ydHMgYSAgdmVyeSAgc21hbGwsICBpbmNvbXBsZXRlCi0gICAgICAgZmluYWwgIGJsb2NrLiAgVGhpcyBpcyBzcHVyaW91cyBhbmQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLgotCi0KLVJFTEFUSU9OU0hJUCBUTyBiemlwLTAuMjEKLSAgICAgICBUaGlzIHByb2dyYW0gaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBiemlwIHByb2dyYW0sICB2ZXJzaW9uCi0gICAgICAgMC4yMSwgIHdoaWNoICBJIHJlbGVhc2VkIGluIEF1Z3VzdCAxOTk2LiAgVGhlIHByaW1hcnkgZGlmLQotICAgICAgIGZlcmVuY2Ugb2YgYnppcDIgaXMgaXRzIGF2b2lkYW5jZSBvZiB0aGUgcG9zc2libHkgcGF0ZW50ZWQKLSAgICAgICBhbGdvcml0aG1zICB3aGljaCAgd2VyZSAgdXNlZCAgaW4gMC4yMS4gIGJ6aXAyIGFsc28gYnJpbmdzCi0gICAgICAgdmFyaW91cyB1c2VmdWwgcmVmaW5lbWVudHMgKC1zLCAgLXQpLCAgdXNlcyAgbGVzcyAgbWVtb3J5LAotICAgICAgIGRlY29tcHJlc3NlcyAgc2lnbmlmaWNhbnRseSAgZmFzdGVyLCAgYW5kICBoYXMgc3VwcG9ydCBmb3IKLSAgICAgICByZWNvdmVyaW5nIGRhdGEgZnJvbSBkYW1hZ2VkIGZpbGVzLgotCi0gICAgICAgQmVjYXVzZSBiemlwMiB1c2VzIEh1ZmZtYW4gY29kaW5nIHRvICBjb25zdHJ1Y3QgIHRoZSAgY29tLQotICAgICAgIHByZXNzZWQgIGJpdHN0cmVhbSwgcmF0aGVyIHRoYW4gdGhlIGFyaXRobWV0aWMgY29kaW5nIHVzZWQKLSAgICAgICBpbiAwLjIxLCB0aGUgY29tcHJlc3NlZCByZXByZXNlbnRhdGlvbnMgZ2VuZXJhdGVkICBieSAgdGhlCi0gICAgICAgdHdvICBwcm9ncmFtcyBhcmUgaW5jb21wYXRpYmxlLCBhbmQgdGhleSB3aWxsIG5vdCBpbnRlcm9wLQotICAgICAgIGVyYXRlLiAgVGhlIGNoYW5nZSBpbiBzdWZmaXggZnJvbSAgLmJ6ICB0byAgLmJ6MiAgcmVmbGVjdHMKLSAgICAgICB0aGlzLiAgIEl0IHdvdWxkIGhhdmUgYmVlbiBoZWxwZnVsIHRvIGF0IGxlYXN0IGFsbG93IGJ6aXAyCi0gICAgICAgdG8gZGVjb21wcmVzcyBmaWxlcyBjcmVhdGVkIGJ5IDAuMjEsIGJ1dCB0aGlzIHdvdWxkIGRlZmVhdAotICAgICAgIHRoZSBwcmltYXJ5IGFpbSBvZiBoYXZpbmcgYSBwYXRlbnQtZnJlZSBjb21wcmVzc29yLgotCi0gICAgICAgRm9yIGEgbW9yZSBwcmVjaXNlIHN0YXRlbWVudCBhYm91dCBwYXRlbnQgaXNzdWVzIGluIGJ6aXAyLAotICAgICAgIHBsZWFzZSBzZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24uCi0KLSAgICAgICBIdWZmbWFuICBjb2RpbmcgIG5lY2Vzc2FyaWx5ICBpbnZvbHZlcyBzb21lIGNvZGluZyBpbmVmZmktCi0gICAgICAgY2llbmN5IGNvbXBhcmVkIHRvIGFyaXRobWV0aWMgIGNvZGluZy4gICBUaGlzICBtZWFucyAgdGhhdAotICAgICAgIGJ6aXAyICBjb21wcmVzc2VzIGFib3V0IDElIHdvcnNlIHRoYW4gMC4yMSwgYW4gdW5mb3J0dW5hdGUKLSAgICAgICBidXQgdW5hdm9pZGFibGUgZmFjdC1vZi1saWZlLiAgT24gdGhlIG90aGVyICBoYW5kLCAgZGVjb20tCi0gICAgICAgcHJlc3Npb24gIGlzIGFwcHJveGltYXRlbHkgNTAlIGZhc3RlciBmb3IgdGhlIHNhbWUgcmVhc29uLAotICAgICAgIGFuZCB0aGUgY2hhbmdlIGluIGZpbGUgZm9ybWF0IGdhdmUgYW4gb3Bwb3J0dW5pdHkgIHRvICBhZGQKLSAgICAgICBkYXRhLXJlY292ZXJ5IGZlYXR1cmVzLiAgU28gaXQgaXMgbm90IGFsbCBiYWQuCi0KIAogQVVUSE9SCiAgICAgICAgSnVsaWFuIFNld2FyZCwganNld2FyZEBhY20ub3JnLgorICAgICAgIGh0dHA6Ly93d3cubXVyYXJvYS5kZW1vbi5jby51awogCi0gICAgICAgVGhlIGlkZWFzIGVtYm9kaWVkIGluIGJ6aXAgYW5kIGJ6aXAyIGFyZSBkdWUgdG8gKGF0IGxlYXN0KQotICAgICAgIHRoZSBmb2xsb3dpbmcgcGVvcGxlOiBNaWNoYWVsIEJ1cnJvd3MgIGFuZCAgRGF2aWQgIFdoZWVsZXIKLSAgICAgICAoZm9yICB0aGUgIGJsb2NrICBzb3J0aW5nICB0cmFuc2Zvcm1hdGlvbiksICBEYXZpZCBXaGVlbGVyCi0gICAgICAgKGFnYWluLCBmb3IgdGhlIEh1ZmZtYW4gY29kZXIpLCAgUGV0ZXIgIEZlbndpY2sgIChmb3IgIHRoZQotICAgICAgIHN0cnVjdHVyZWQgIGNvZGluZyAgbW9kZWwgIGluIDAuMjEsIGFuZCBtYW55IHJlZmluZW1lbnRzKSwKLSAgICAgICBhbmQgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwgYW5kIElhbiBXaXR0ZW4gKGZvciAgdGhlCi0gICAgICAgYXJpdGhtZXRpYyAgY29kZXIgIGluIDAuMjEpLiAgSSBhbSBtdWNoIGluZGVidGVkIGZvciB0aGVpcgotICAgICAgIGhlbHAsIHN1cHBvcnQgYW5kIGFkdmljZS4gIFNlZSB0aGUgZmlsZSBBTEdPUklUSE1TIGluICB0aGUKLSAgICAgICBzb3VyY2UgIGRpc3RyaWJ1dGlvbiBmb3IgcG9pbnRlcnMgdG8gc291cmNlcyBvZiBkb2N1bWVudGEtCi0gICAgICAgdGlvbi4gIENocmlzdGlhbiB2b24gUm9xdWVzICBlbmNvdXJhZ2VkICBtZSAgdG8gIGxvb2sgIGZvcgotICAgICAgIGZhc3RlciAgc29ydGluZyBhbGdvcml0aG1zLCBzbyBhcyB0byBzcGVlZCB1cCBjb21wcmVzc2lvbi4KLSAgICAgICBCZWxhIEx1YmtpbiBlbmNvdXJhZ2VkIG1lIHRvIGltcHJvdmUgdGhlICB3b3JzdC1jYXNlICBjb20tCi0gICAgICAgcHJlc3Npb24gIHBlcmZvcm1hbmNlLiAgIE1hbnkgIHBlb3BsZSBzZW50IHBhdGNoZXMsIGhlbHBlZAorICAgICAgIFRoZSBpZGVhcyBlbWJvZGllZCBpbiBiemlwMiBhcmUgZHVlIHRvIChhdCBsZWFzdCkgdGhlIGZvbC0KKyAgICAgICBsb3dpbmcgcGVvcGxlOiBNaWNoYWVsIEJ1cnJvd3MgYW5kIERhdmlkIFdoZWVsZXIgKGZvciAgdGhlCisgICAgICAgYmxvY2sgIHNvcnRpbmcgIHRyYW5zZm9ybWF0aW9uKSwgRGF2aWQgV2hlZWxlciAoYWdhaW4sIGZvcgorICAgICAgIHRoZSBIdWZmbWFuIGNvZGVyKSwgUGV0ZXIgRmVud2ljayAoZm9yIHRoZSBzdHJ1Y3R1cmVkIGNvZC0KKyAgICAgICBpbmcgbW9kZWwgaW4gdGhlIG9yaWdpbmFsIGJ6aXAsIGFuZCBtYW55IHJlZmluZW1lbnRzKSwgYW5kCisgICAgICAgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwgIGFuZCAgSWFuICBXaXR0ZW4gIChmb3IgIHRoZQorICAgICAgIGFyaXRobWV0aWMgIGNvZGVyICBpbiAgdGhlICBvcmlnaW5hbCAgYnppcCkuICAgSSAgYW0gIG11Y2gKKyAgICAgICBpbmRlYnRlZCBmb3IgdGhlaXIgaGVscCwgc3VwcG9ydCBhbmQgYWR2aWNlLiAgU2VlIHRoZSBtYW4tCisgICAgICAgdWFsICBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgcG9pbnRlcnMgdG8gc291cmNlcyBvZgorICAgICAgIGRvY3VtZW50YXRpb24uICBDaHJpc3RpYW4gdm9uIFJvcXVlcyBlbmNvdXJhZ2VkIG1lIHRvIGxvb2sKKyAgICAgICBmb3IgIGZhc3RlciBzb3J0aW5nIGFsZ29yaXRobXMsIHNvIGFzIHRvIHNwZWVkIHVwIGNvbXByZXMtCisgICAgICAgc2lvbi4gIEJlbGEgTHVia2luIGVuY291cmFnZWQgbWUgdG8gaW1wcm92ZSB0aGUgd29yc3QtY2FzZQorICAgICAgIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlLiAgTWFueSBwZW9wbGUgc2VudCBwYXRjaGVzLCBoZWxwZWQKICAgICAgICB3aXRoIHBvcnRhYmlsaXR5IHByb2JsZW1zLCBsZW50IG1hY2hpbmVzLCBnYXZlIGFkdmljZSAgYW5kCiAgICAgICAgd2VyZSBnZW5lcmFsbHkgaGVscGZ1bC4KLQotCi0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwotCi0KZGlmZiAtLWdpdCBhL2J6aXAycmVjb3Zlci5jIGIvYnppcDJyZWNvdmVyLmMKaW5kZXggMGVlZjBlNi4uMGUyODIyYiAxMDA2NDQKLS0tIGEvYnppcDJyZWNvdmVyLmMKKysrIGIvYnppcDJyZWNvdmVyLmMKQEAgLTcsNDMgKzcsNjMgQEAKIC8qLS0KICAgVGhpcyBwcm9ncmFtIGlzIGJ6aXAycmVjb3ZlciwgYSBwcm9ncmFtIHRvIGF0dGVtcHQgZGF0YSAKICAgc2FsdmFnZSBmcm9tIGRhbWFnZWQgZmlsZXMgY3JlYXRlZCBieSB0aGUgYWNjb21wYW55aW5nCi0gIGJ6aXAyLTAuMSBwcm9ncmFtLgorICBiemlwMi0wLjkuMGMgcHJvZ3JhbS4KIAotICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgYnkgSnVsaWFuIFNld2FyZC4KLSAgICAgR3VpbGRmb3JkLCBTdXJyZXksIFVLCi0gICAgIGVtYWlsOiBqc2V3YXJkQGFjbS5vcmcKKyAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CiAKLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiAKLSAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBMSUNFTlNFLgorICAzLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisKKyAgNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICAgIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICBKdWxpYW4gU2V3YXJkLCBHdWlsZGZvcmQsIFN1cnJleSwgVUsuCisgIGpzZXdhcmRAYWNtLm9yZworICBiemlwMi9saWJiemlwMiB2ZXJzaW9uIDAuOS4wYyBvZiAxOCBPY3RvYmVyIDE5OTgKIC0tKi8KIAorLyotLQorICBUaGlzIHByb2dyYW0gaXMgYSBjb21wbGV0ZSBoYWNrIGFuZCBzaG91bGQgYmUgcmV3cml0dGVuCisgIHByb3Blcmx5LiAgSXQgaXNuJ3QgdmVyeSBjb21wbGljYXRlZC4KKy0tKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+ICAvKi0tIG9yIHRyeSBzdHJpbmcuaCAtLSovCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNkZWZpbmUgVUludDMyICB1bnNpZ25lZCBpbnQKLSNkZWZpbmUgSW50MzIgICBpbnQKLSNkZWZpbmUgVUNoYXIgICB1bnNpZ25lZCBjaGFyCi0jZGVmaW5lIENoYXIgICAgY2hhcgotI2RlZmluZSBCb29sICAgIHVuc2lnbmVkIGNoYXIKLSNkZWZpbmUgVHJ1ZSAgICAxCi0jZGVmaW5lIEZhbHNlICAgMAordHlwZWRlZiAgdW5zaWduZWQgaW50ICAgVUludDMyOwordHlwZWRlZiAgaW50ICAgICAgICAgICAgSW50MzI7Cit0eXBlZGVmICB1bnNpZ25lZCBjaGFyICBVQ2hhcjsKK3R5cGVkZWYgIGNoYXIgICAgICAgICAgIENoYXI7Cit0eXBlZGVmICB1bnNpZ25lZCBjaGFyICBCb29sOworI2RlZmluZSBUcnVlICAgICgoQm9vbCkxKQorI2RlZmluZSBGYWxzZSAgICgoQm9vbCkwKQogCiAKIENoYXIgaW5GaWxlTmFtZVsyMDAwXTsKQEAgLTE5MSw4ICsyMTEsOSBAQAogICAgICAgaWYgKHJldFZhbCA9PSBFT0YpIHdyaXRlRXJyb3IoKTsKICAgIH0KICAgIHJldFZhbCA9IGZjbG9zZSAoIGJzLT5oYW5kbGUgKTsKLSAgIGlmIChyZXRWYWwgPT0gRU9GKQorICAgaWYgKHJldFZhbCA9PSBFT0YpIHsKICAgICAgIGlmIChicy0+bW9kZSA9PSAndycpIHdyaXRlRXJyb3IoKTsgZWxzZSByZWFkRXJyb3IoKTsKKyAgIH0KICAgIGZyZWUgKCBicyApOwogfQogCkBAIC0yNDgsMTMgKzI2OSwxOSBAQAogICAgVUludDMyICAgICAgYml0c1JlYWQ7CiAgICBVSW50MzIgICAgICBiU3RhcnRbMjAwMDBdOwogICAgVUludDMyICAgICAgYkVuZFsyMDAwMF07CisKKyAgIFVJbnQzMiAgICAgIHJiU3RhcnRbMjAwMDBdOworICAgVUludDMyICAgICAgcmJFbmRbMjAwMDBdOworICAgSW50MzIgICAgICAgcmJDdHI7CisKKwogICAgVUludDMyICAgICAgYnVmZkhpLCBidWZmTG8sIGJsb2NrQ1JDOwogICAgQ2hhciogICAgICAgcDsKIAogICAgc3RyY3B5ICggcHJvZ05hbWUsIGFyZ3ZbMF0gKTsKICAgIGluRmlsZU5hbWVbMF0gPSBvdXRGaWxlTmFtZVswXSA9IDA7CiAKLSAgIGZwcmludGYgKCBzdGRlcnIsICJiemlwMnJlY292ZXI6IGV4dHJhY3RzIGJsb2NrcyBmcm9tIGRhbWFnZWQgLmJ6MiBmaWxlcy5cbiIgKTsKKyAgIGZwcmludGYgKCBzdGRlcnIsICJiemlwMnJlY292ZXIgdjAuOS4wYzogZXh0cmFjdHMgYmxvY2tzIGZyb20gZGFtYWdlZCAuYnoyIGZpbGVzLlxuIiApOwogCiAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiJXM6IHVzYWdlIGlzIGAlcyBkYW1hZ2VkX2ZpbGVfbmFtZScuXG4iLApAQCAtMjc4LDYgKzMwNSw4IEBACiAgICBjdXJyQmxvY2sgPSAwOwogICAgYlN0YXJ0W2N1cnJCbG9ja10gPSAwOwogCisgICByYkN0ciA9IDA7CisKICAgIHdoaWxlIChUcnVlKSB7CiAgICAgICBiID0gYnNHZXRCaXQgKCBic0luICk7CiAgICAgICBiaXRzUmVhZCsrOwpAQCAtMzAzLDE5ICszMzIsMjUgQEAKICAgICAgICAgIGlmIChiaXRzUmVhZCA+IDQ5KQogICAgICAgICAgICAgYkVuZFtjdXJyQmxvY2tdID0gYml0c1JlYWQtNDk7IGVsc2UKICAgICAgICAgICAgIGJFbmRbY3VyckJsb2NrXSA9IDA7Ci0gICAgICAgICBpZiAoY3VyckJsb2NrID4gMCkKKyAgICAgICAgIGlmIChjdXJyQmxvY2sgPiAwICYmCisJICAgICAoYkVuZFtjdXJyQmxvY2tdIC0gYlN0YXJ0W2N1cnJCbG9ja10pID49IDEzMCkgewogICAgICAgICAgICAgZnByaW50ZiAoIHN0ZGVyciwgIiAgIGJsb2NrICVkIHJ1bnMgZnJvbSAlZCB0byAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBjdXJyQmxvY2ssICBiU3RhcnRbY3VyckJsb2NrXSwgYkVuZFtjdXJyQmxvY2tdICk7CisgICAgICAgICAgICAgICAgICAgICAgcmJDdHIrMSwgIGJTdGFydFtjdXJyQmxvY2tdLCBiRW5kW2N1cnJCbG9ja10gKTsKKyAgICAgICAgICAgIHJiU3RhcnRbcmJDdHJdID0gYlN0YXJ0W2N1cnJCbG9ja107CisgICAgICAgICAgICByYkVuZFtyYkN0cl0gPSBiRW5kW2N1cnJCbG9ja107CisgICAgICAgICAgICByYkN0cisrOworICAgICAgICAgfQogICAgICAgICAgY3VyckJsb2NrKys7CisKICAgICAgICAgIGJTdGFydFtjdXJyQmxvY2tdID0gYml0c1JlYWQ7CiAgICAgICB9CiAgICB9CiAKICAgIGJzQ2xvc2UgKCBic0luICk7CiAKLSAgIC8qLS0gaWRlbnRpZmllZCBibG9ja3MgcnVuIGZyb20gMSB0byBjdXJyQmxvY2sgaW5jbHVzaXZlLiAtLSovCisgICAvKi0tIGlkZW50aWZpZWQgYmxvY2tzIHJ1biBmcm9tIDEgdG8gcmJDdHIgaW5jbHVzaXZlLiAtLSovCiAKLSAgIGlmIChjdXJyQmxvY2sgPCAxKSB7CisgICBpZiAocmJDdHIgPCAxKSB7CiAgICAgICBmcHJpbnRmICggc3RkZXJyLAogICAgICAgICAgICAgICAgICIlczogc29ycnksIEkgY291bGRuJ3QgZmluZCBhbnkgYmxvY2sgYm91bmRhcmllcy5cbiIsCiAgICAgICAgICAgICAgICAgcHJvZ05hbWUgKTsKQEAgLTMzNiwyMyArMzcxLDIzIEBACiAKICAgIGJpdHNSZWFkID0gMDsKICAgIG91dEZpbGUgPSBOVUxMOwotICAgd3JCbG9jayA9IDE7CisgICB3ckJsb2NrID0gMDsKICAgIHdoaWxlIChUcnVlKSB7CiAgICAgICBiID0gYnNHZXRCaXQoYnNJbik7CiAgICAgICBpZiAoYiA9PSAyKSBicmVhazsKICAgICAgIGJ1ZmZIaSA9IChidWZmSGkgPDwgMSkgfCAoYnVmZkxvID4+IDMxKTsKICAgICAgIGJ1ZmZMbyA9IChidWZmTG8gPDwgMSkgfCAoYiAmIDEpOwotICAgICAgaWYgKGJpdHNSZWFkID09IDQ3K2JTdGFydFt3ckJsb2NrXSkgCisgICAgICBpZiAoYml0c1JlYWQgPT0gNDcrcmJTdGFydFt3ckJsb2NrXSkgCiAgICAgICAgICBibG9ja0NSQyA9IChidWZmSGkgPDwgMTYpIHwgKGJ1ZmZMbyA+PiAxNik7CiAKLSAgICAgIGlmIChvdXRGaWxlICE9IE5VTEwgJiYgYml0c1JlYWQgPj0gYlN0YXJ0W3dyQmxvY2tdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJpdHNSZWFkIDw9IGJFbmRbd3JCbG9ja10pIHsKKyAgICAgIGlmIChvdXRGaWxlICE9IE5VTEwgJiYgYml0c1JlYWQgPj0gcmJTdGFydFt3ckJsb2NrXQorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBiaXRzUmVhZCA8PSByYkVuZFt3ckJsb2NrXSkgewogICAgICAgICAgYnNQdXRCaXQgKCBic1dyLCBiICk7CiAgICAgICB9CiAKICAgICAgIGJpdHNSZWFkKys7CiAKLSAgICAgIGlmIChiaXRzUmVhZCA9PSBiRW5kW3dyQmxvY2tdKzEpIHsKKyAgICAgIGlmIChiaXRzUmVhZCA9PSByYkVuZFt3ckJsb2NrXSsxKSB7CiAgICAgICAgICBpZiAob3V0RmlsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBic1B1dFVDaGFyICggYnNXciwgMHgxNyApOyBic1B1dFVDaGFyICggYnNXciwgMHg3MiApOwogICAgICAgICAgICAgYnNQdXRVQ2hhciAoIGJzV3IsIDB4NDUgKTsgYnNQdXRVQ2hhciAoIGJzV3IsIDB4MzggKTsKQEAgLTM2MCwxOCArMzk1LDE4IEBACiAgICAgICAgICAgICBic1B1dFVJbnQzMiAoIGJzV3IsIGJsb2NrQ1JDICk7CiAgICAgICAgICAgICBic0Nsb3NlICggYnNXciApOwogICAgICAgICAgfQotICAgICAgICAgaWYgKHdyQmxvY2sgPj0gY3VyckJsb2NrKSBicmVhazsKKyAgICAgICAgIGlmICh3ckJsb2NrID49IHJiQ3RyKSBicmVhazsKICAgICAgICAgIHdyQmxvY2srKzsKICAgICAgIH0gZWxzZQotICAgICAgaWYgKGJpdHNSZWFkID09IGJTdGFydFt3ckJsb2NrXSkgeworICAgICAgaWYgKGJpdHNSZWFkID09IHJiU3RhcnRbd3JCbG9ja10pIHsKICAgICAgICAgIG91dEZpbGVOYW1lWzBdID0gMDsKLSAgICAgICAgIHNwcmludGYgKCBvdXRGaWxlTmFtZSwgInJlYyU0ZCIsIHdyQmxvY2sgKTsKKyAgICAgICAgIHNwcmludGYgKCBvdXRGaWxlTmFtZSwgInJlYyU0ZCIsIHdyQmxvY2srMSApOwogICAgICAgICAgZm9yIChwID0gb3V0RmlsZU5hbWU7ICpwICE9IDA7IHArKykgaWYgKCpwID09ICcgJykgKnAgPSAnMCc7CiAgICAgICAgICBzdHJjYXQgKCBvdXRGaWxlTmFtZSwgaW5GaWxlTmFtZSApOwogICAgICAgICAgaWYgKCAhZW5kc0luQnoyKG91dEZpbGVOYW1lKSkgc3RyY2F0ICggb3V0RmlsZU5hbWUsICIuYnoyIiApOwogCiAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAiICAgd3JpdGluZyBibG9jayAlZCB0byBgJXMnIC4uLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyQmxvY2ssIG91dEZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ckJsb2NrKzEsIG91dEZpbGVOYW1lICk7CiAKICAgICAgICAgIG91dEZpbGUgPSBmb3BlbiAoIG91dEZpbGVOYW1lLCAid2IiICk7CiAgICAgICAgICBpZiAob3V0RmlsZSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9iemxpYi5jIGIvYnpsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJlOGZmCi0tLSAvZGV2L251bGwKKysrIGIvYnpsaWIuYwpAQCAtMCwwICsxLDE1MTIgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIExpYnJhcnkgdG9wLWxldmVsIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLQorICBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGJ6aXAyIGFuZC9vciBsaWJiemlwMiwgYSBwcm9ncmFtIGFuZAorICBsaWJyYXJ5IGZvciBsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCisgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEp1bGlhbiBSIFNld2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKyAgMy4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCisgIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICAgICBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTCisgIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgSnVsaWFuIFNld2FyZCwgR3VpbGRmb3JkLCBTdXJyZXksIFVLLgorICBqc2V3YXJkQGFjbS5vcmcKKyAgYnppcDIvbGliYnppcDIgdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4CisKKyAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIChhdCBsZWFzdCkgdGhlIHdvcmsgb2Y6CisgICAgIE1pa2UgQnVycm93cworICAgICBEYXZpZCBXaGVlbGVyCisgICAgIFBldGVyIEZlbndpY2sKKyAgICAgQWxpc3RhaXIgTW9mZmF0CisgICAgIFJhZGZvcmQgTmVhbAorICAgICBJYW4gSC4gV2l0dGVuCisgICAgIFJvYmVydCBTZWRnZXdpY2sKKyAgICAgSm9uIEwuIEJlbnRsZXkKKworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KKy0tKi8KKworLyotLQorICAgQ0hBTkdFUworICAgfn5+fn5+fgorICAgMC45LjAgLS0gb3JpZ2luYWwgdmVyc2lvbi4KKworICAgMC45LjBhL2IgLS0gbm8gY2hhbmdlcyBpbiB0aGlzIGZpbGUuCisKKyAgIDAuOS4wYworICAgICAgKiBtYWRlIHplcm8tbGVuZ3RoIEJaX0ZMVVNIIHdvcmsgY29ycmVjdGx5IGluIGJ6Q29tcHJlc3MoKS4KKyAgICAgICogZml4ZWQgYnpXcml0ZS9ielJlYWQgdG8gaWdub3JlIHplcm8tbGVuZ3RoIHJlcXVlc3RzLgorICAgICAgKiBmaXhlZCBienJlYWQgdG8gY29ycmVjdGx5IGhhbmRsZSByZWFkIHJlcXVlc3RzIGFmdGVyIEVPRi4KKyAgICAgICogd3JvbmcgcGFyYW1ldGVyIG9yZGVyIGluIGNhbGwgdG8gYnpEZWNvbXByZXNzSW5pdCBpbgorICAgICAgICBiekJ1ZmZUb0J1ZmZEZWNvbXByZXNzLiAgRml4ZWQuCistLSovCisKKyNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gQ29tcHJlc3Npb24gc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZm5kZWYgQlpfTk9fU1RESU8KK3ZvaWQgYnpfX0Fzc2VydEhfX2ZhaWwgKCBpbnQgZXJyY29kZSApCit7CisgICBmcHJpbnRmKHN0ZGVyciwgCisgICAgICAiXG5cbmJ6aXAyL2xpYmJ6aXAyLCB2MC45LjBjOiBpbnRlcm5hbCBlcnJvciBudW1iZXIgJWQuXG4iCisgICAgICAiVGhpcyBpcyBhIGJ1ZyBpbiBiemlwMi9saWJiemlwMiwgdjAuOS4wYy4gIFBsZWFzZSByZXBvcnRcbiIKKyAgICAgICJpdCB0byBtZSBhdDoganNld2FyZEBhY20ub3JnLiAgSWYgdGhpcyBoYXBwZW5lZCB3aGVuXG4iCisgICAgICAieW91IHdlcmUgdXNpbmcgc29tZSBwcm9ncmFtIHdoaWNoIHVzZXMgbGliYnppcDIgYXMgYVxuIgorICAgICAgImNvbXBvbmVudCwgeW91IHNob3VsZCBhbHNvIHJlcG9ydCB0aGlzIGJ1ZyB0byB0aGUgYXV0aG9yKHMpXG4iCisgICAgICAib2YgdGhhdCBwcm9ncmFtLiAgUGxlYXNlIG1ha2UgYW4gZWZmb3J0IHRvIHJlcG9ydCB0aGlzIGJ1ZztcbiIKKyAgICAgICJ0aW1lbHkgYW5kIGFjY3VyYXRlIGJ1ZyByZXBvcnRzIGV2ZW50dWFsbHkgbGVhZCB0byBoaWdoZXJcbiIKKyAgICAgICJxdWFsaXR5IHNvZnR3YXJlLiAgVGh4LiAgSnVsaWFuIFNld2FyZCwgMTggT2N0b2JlciAxOTk4LlxuXG4iLAorICAgICAgZXJyY29kZQorICAgKTsKKyAgIGV4aXQoMyk7Cit9CisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQqIGRlZmF1bHRfYnphbGxvYyAoIHZvaWQqIG9wYXF1ZSwgSW50MzIgaXRlbXMsIEludDMyIHNpemUgKQoreworICAgdm9pZCogdiA9IG1hbGxvYyAoIGl0ZW1zICogc2l6ZSApOworICAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYwordm9pZCBkZWZhdWx0X2J6ZnJlZSAoIHZvaWQqIG9wYXF1ZSwgdm9pZCogYWRkciApCit7CisgICBpZiAoYWRkciAhPSBOVUxMKSBmcmVlICggYWRkciApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBwcmVwYXJlX25ld19ibG9jayAoIEVTdGF0ZSogcyApCit7CisgICBJbnQzMiBpOworICAgcy0+bmJsb2NrID0gMDsKKyAgIHMtPm51bVogPSAwOworICAgcy0+c3RhdGVfb3V0X3BvcyA9IDA7CisgICBCWl9JTklUSUFMSVNFX0NSQyAoIHMtPmJsb2NrQ1JDICk7CisgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHMtPmluVXNlW2ldID0gRmFsc2U7CisgICBzLT5ibG9ja05vKys7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGluaXRfUkwgKCBFU3RhdGUqIHMgKQoreworICAgcy0+c3RhdGVfaW5fY2ggID0gMjU2OworICAgcy0+c3RhdGVfaW5fbGVuID0gMDsKK30KKworCitzdGF0aWMKK0Jvb2wgaXNlbXB0eV9STCAoIEVTdGF0ZSogcyApCit7CisgICBpZiAocy0+c3RhdGVfaW5fY2ggPCAyNTYgJiYgcy0+c3RhdGVfaW5fbGVuID4gMCkKKyAgICAgIHJldHVybiBGYWxzZTsgZWxzZQorICAgICAgcmV0dXJuIFRydWU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiekNvbXByZXNzSW5pdCkgCisgICAgICAgICAgICAgICAgICAgICggYnpfc3RyZWFtKiBzdHJtLCAKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgYmxvY2tTaXplMTAwaywKKyAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgdmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB3b3JrRmFjdG9yICkKK3sKKyAgIEludDMyICAgbjsKKyAgIEVTdGF0ZSogczsKKworICAgaWYgKHN0cm0gPT0gTlVMTCB8fCAKKyAgICAgICBibG9ja1NpemUxMDBrIDwgMSB8fCBibG9ja1NpemUxMDBrID4gOSB8fAorICAgICAgIHdvcmtGYWN0b3IgPCAwIHx8IHdvcmtGYWN0b3IgPiAyNTApCisgICAgIHJldHVybiBCWl9QQVJBTV9FUlJPUjsKKworICAgaWYgKHdvcmtGYWN0b3IgPT0gMCkgd29ya0ZhY3RvciA9IDMwOworICAgaWYgKHN0cm0tPmJ6YWxsb2MgPT0gTlVMTCkgc3RybS0+YnphbGxvYyA9IGRlZmF1bHRfYnphbGxvYzsKKyAgIGlmIChzdHJtLT5iemZyZWUgPT0gTlVMTCkgc3RybS0+YnpmcmVlID0gZGVmYXVsdF9iemZyZWU7CisKKyAgIHMgPSBCWkFMTE9DKCBzaXplb2YoRVN0YXRlKSApOworICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIEJaX01FTV9FUlJPUjsKKyAgIHMtPnN0cm0gPSBzdHJtOworCisgICBzLT5ibG9jayAgICA9IE5VTEw7CisgICBzLT5xdWFkcmFudCA9IE5VTEw7CisgICBzLT56cHRyICAgICA9IE5VTEw7CisgICBzLT5mdGFiICAgICA9IE5VTEw7CisKKyAgIG4gICAgICAgICAgID0gMTAwMDAwICogYmxvY2tTaXplMTAwazsKKyAgIHMtPmJsb2NrICAgID0gQlpBTExPQyggKG4gKyBCWl9OVU1fT1ZFUlNIT09UX0JZVEVTKSAqIHNpemVvZihVQ2hhcikgKTsKKyAgIHMtPnF1YWRyYW50ID0gQlpBTExPQyggKG4gKyBCWl9OVU1fT1ZFUlNIT09UX0JZVEVTKSAqIHNpemVvZihJbnQxNikgKTsKKyAgIHMtPnpwdHIgICAgID0gQlpBTExPQyggbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihJbnQzMikgKTsKKyAgIHMtPmZ0YWIgICAgID0gQlpBTExPQyggNjU1MzcgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihJbnQzMikgKTsKKworICAgaWYgKHMtPmJsb2NrID09IE5VTEwgfHwgcy0+cXVhZHJhbnQgPT0gTlVMTCB8fAorICAgICAgIHMtPnpwdHIgPT0gTlVMTCAgfHwgcy0+ZnRhYiA9PSBOVUxMKSB7CisgICAgICBpZiAocy0+YmxvY2sgICAgIT0gTlVMTCkgQlpGUkVFKHMtPmJsb2NrKTsKKyAgICAgIGlmIChzLT5xdWFkcmFudCAhPSBOVUxMKSBCWkZSRUUocy0+cXVhZHJhbnQpOworICAgICAgaWYgKHMtPnpwdHIgICAgICE9IE5VTEwpIEJaRlJFRShzLT56cHRyKTsKKyAgICAgIGlmIChzLT5mdGFiICAgICAhPSBOVUxMKSBCWkZSRUUocy0+ZnRhYik7CisgICAgICBpZiAocyAgICAgICAgICAgIT0gTlVMTCkgQlpGUkVFKHMpOworICAgICAgcmV0dXJuIEJaX01FTV9FUlJPUjsKKyAgIH0KKworICAgcy0+c3pwdHIgPSAoVUludDE2Kikocy0+enB0cik7CisKKyAgIHMtPmJsb2NrTm8gICAgICAgICAgID0gMDsKKyAgIHMtPnN0YXRlICAgICAgICAgICAgID0gQlpfU19JTlBVVDsKKyAgIHMtPm1vZGUgICAgICAgICAgICAgID0gQlpfTV9SVU5OSU5HOworICAgcy0+Y29tYmluZWRDUkMgICAgICAgPSAwOworICAgcy0+YmxvY2tTaXplMTAwayAgICAgPSBibG9ja1NpemUxMDBrOworICAgcy0+bmJsb2NrTUFYICAgICAgICAgPSAxMDAwMDAgKiBibG9ja1NpemUxMDBrIC0gMTk7CisgICBzLT52ZXJib3NpdHkgICAgICAgICA9IHZlcmJvc2l0eTsKKyAgIHMtPndvcmtGYWN0b3IgICAgICAgID0gd29ya0ZhY3RvcjsKKyAgIHMtPm5CbG9ja3NSYW5kb21pc2VkID0gMDsKKyAgIHN0cm0tPnN0YXRlICAgICAgICAgID0gczsKKyAgIHN0cm0tPnRvdGFsX2luICAgICAgID0gMDsKKyAgIHN0cm0tPnRvdGFsX291dCAgICAgID0gMDsKKyAgIGluaXRfUkwgKCBzICk7CisgICBwcmVwYXJlX25ld19ibG9jayAoIHMgKTsKKyAgIHJldHVybiBCWl9PSzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYWRkX3BhaXJfdG9fYmxvY2sgKCBFU3RhdGUqIHMgKQoreworICAgSW50MzIgaTsKKyAgIFVDaGFyIGNoID0gKFVDaGFyKShzLT5zdGF0ZV9pbl9jaCk7CisgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3RhdGVfaW5fbGVuOyBpKyspIHsKKyAgICAgIEJaX1VQREFURV9DUkMoIHMtPmJsb2NrQ1JDLCBjaCApOworICAgfQorICAgcy0+aW5Vc2Vbcy0+c3RhdGVfaW5fY2hdID0gVHJ1ZTsKKyAgIHN3aXRjaCAocy0+c3RhdGVfaW5fbGVuKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgICBzLT5ibG9ja1tzLT5uYmxvY2tdID0gKFVDaGFyKWNoOyBzLT5uYmxvY2srKzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICAgcy0+YmxvY2tbcy0+bmJsb2NrXSA9IChVQ2hhciljaDsgcy0+bmJsb2NrKys7CisgICAgICAgICBzLT5ibG9ja1tzLT5uYmxvY2tdID0gKFVDaGFyKWNoOyBzLT5uYmxvY2srKzsKKyAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICAgcy0+YmxvY2tbcy0+bmJsb2NrXSA9IChVQ2hhciljaDsgcy0+bmJsb2NrKys7CisgICAgICAgICBzLT5ibG9ja1tzLT5uYmxvY2tdID0gKFVDaGFyKWNoOyBzLT5uYmxvY2srKzsKKyAgICAgICAgIHMtPmJsb2NrW3MtPm5ibG9ja10gPSAoVUNoYXIpY2g7IHMtPm5ibG9jaysrOworICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgcy0+aW5Vc2Vbcy0+c3RhdGVfaW5fbGVuLTRdID0gVHJ1ZTsKKyAgICAgICAgIHMtPmJsb2NrW3MtPm5ibG9ja10gPSAoVUNoYXIpY2g7IHMtPm5ibG9jaysrOworICAgICAgICAgcy0+YmxvY2tbcy0+bmJsb2NrXSA9IChVQ2hhciljaDsgcy0+bmJsb2NrKys7CisgICAgICAgICBzLT5ibG9ja1tzLT5uYmxvY2tdID0gKFVDaGFyKWNoOyBzLT5uYmxvY2srKzsKKyAgICAgICAgIHMtPmJsb2NrW3MtPm5ibG9ja10gPSAoVUNoYXIpY2g7IHMtPm5ibG9jaysrOworICAgICAgICAgcy0+YmxvY2tbcy0+bmJsb2NrXSA9IChVQ2hhcikocy0+c3RhdGVfaW5fbGVuLTQpOworICAgICAgICAgcy0+bmJsb2NrKys7CisgICAgICAgICBicmVhazsKKyAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgZmx1c2hfUkwgKCBFU3RhdGUqIHMgKQoreworICAgaWYgKHMtPnN0YXRlX2luX2NoIDwgMjU2KSBhZGRfcGFpcl90b19ibG9jayAoIHMgKTsKKyAgIGluaXRfUkwgKCBzICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBBRERfQ0hBUl9UT19CTE9DSyh6cyx6Y2hoMCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIFVJbnQzMiB6Y2hoID0gKFVJbnQzMikoemNoaDApOyAgICAgICAgICAgICAgICAgXAorICAgLyotLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLSovICAgICAgICAgICBcCisgICBpZiAoemNoaCAhPSB6cy0+c3RhdGVfaW5fY2ggJiYgICAgICAgICAgICAgICAgIFwKKyAgICAgICB6cy0+c3RhdGVfaW5fbGVuID09IDEpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgVUNoYXIgY2ggPSAoVUNoYXIpKHpzLT5zdGF0ZV9pbl9jaCk7ICAgICAgICBcCisgICAgICBCWl9VUERBVEVfQ1JDKCB6cy0+YmxvY2tDUkMsIGNoICk7ICAgICAgICAgIFwKKyAgICAgIHpzLT5pblVzZVt6cy0+c3RhdGVfaW5fY2hdID0gVHJ1ZTsgICAgICAgICAgXAorICAgICAgenMtPmJsb2NrW3pzLT5uYmxvY2tdID0gKFVDaGFyKWNoOyAgICAgICAgICBcCisgICAgICB6cy0+bmJsb2NrKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHpzLT5zdGF0ZV9pbl9jaCA9IHpjaGg7ICAgICAgICAgICAgICAgICAgICAgXAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIC8qLS0gZ2VuZXJhbCwgdW5jb21tb24gY2FzZXMgLS0qLyAgICAgICAgICAgICAgXAorICAgaWYgKHpjaGggIT0genMtPnN0YXRlX2luX2NoIHx8ICAgICAgICAgICAgICAgICBcCisgICAgICB6cy0+c3RhdGVfaW5fbGVuID09IDI1NSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICh6cy0+c3RhdGVfaW5fY2ggPCAyNTYpICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgYWRkX3BhaXJfdG9fYmxvY2sgKCB6cyApOyAgICAgICAgICAgICAgICBcCisgICAgICB6cy0+c3RhdGVfaW5fY2ggPSB6Y2hoOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHpzLT5zdGF0ZV9pbl9sZW4gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB6cy0+c3RhdGVfaW5fbGVuKys7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworQm9vbCBjb3B5X2lucHV0X3VudGlsX3N0b3AgKCBFU3RhdGUqIHMgKQoreworICAgQm9vbCBwcm9ncmVzc19pbiA9IEZhbHNlOworCisgICBpZiAocy0+bW9kZSA9PSBCWl9NX1JVTk5JTkcpIHsKKworICAgICAgLyotLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLSovCisgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgLyotLSBibG9jayBmdWxsPyAtLSovCisgICAgICAgICBpZiAocy0+bmJsb2NrID49IHMtPm5ibG9ja01BWCkgYnJlYWs7CisgICAgICAgICAvKi0tIG5vIGlucHV0PyAtLSovCisgICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgYnJlYWs7CisgICAgICAgICBwcm9ncmVzc19pbiA9IFRydWU7CisgICAgICAgICBBRERfQ0hBUl9UT19CTE9DSyAoIHMsIChVSW50MzIpKCooKFVDaGFyKikocy0+c3RybS0+bmV4dF9pbikpKSApOyAKKyAgICAgICAgIHMtPnN0cm0tPm5leHRfaW4rKzsKKyAgICAgICAgIHMtPnN0cm0tPmF2YWlsX2luLS07CisgICAgICAgICBzLT5zdHJtLT50b3RhbF9pbisrOworICAgICAgfQorCisgICB9IGVsc2UgeworCisgICAgICAvKi0tIGdlbmVyYWwsIHVuY29tbW9uIGNhc2UgLS0qLworICAgICAgd2hpbGUgKFRydWUpIHsKKyAgICAgICAgIC8qLS0gYmxvY2sgZnVsbD8gLS0qLworICAgICAgICAgaWYgKHMtPm5ibG9jayA+PSBzLT5uYmxvY2tNQVgpIGJyZWFrOworICAgICAgICAgLyotLSBubyBpbnB1dD8gLS0qLworICAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOworICAgICAgICAgLyotLSBmbHVzaC9maW5pc2ggZW5kPyAtLSovCisgICAgICAgICBpZiAocy0+YXZhaWxfaW5fZXhwZWN0ID09IDApIGJyZWFrOworICAgICAgICAgcHJvZ3Jlc3NfaW4gPSBUcnVlOworICAgICAgICAgQUREX0NIQVJfVE9fQkxPQ0sgKCBzLCAoVUludDMyKSgqKChVQ2hhciopKHMtPnN0cm0tPm5leHRfaW4pKSkgKTsgCisgICAgICAgICBzLT5zdHJtLT5uZXh0X2luKys7CisgICAgICAgICBzLT5zdHJtLT5hdmFpbF9pbi0tOworICAgICAgICAgcy0+c3RybS0+dG90YWxfaW4rKzsKKyAgICAgICAgIHMtPmF2YWlsX2luX2V4cGVjdC0tOworICAgICAgfQorICAgfQorICAgcmV0dXJuIHByb2dyZXNzX2luOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworQm9vbCBjb3B5X291dHB1dF91bnRpbF9zdG9wICggRVN0YXRlKiBzICkKK3sKKyAgIEJvb2wgcHJvZ3Jlc3Nfb3V0ID0gRmFsc2U7CisKKyAgIHdoaWxlIChUcnVlKSB7CisKKyAgICAgIC8qLS0gbm8gb3V0cHV0IHNwYWNlPyAtLSovCisgICAgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIGJyZWFrOworCisgICAgICAvKi0tIGJsb2NrIGRvbmU/IC0tKi8KKyAgICAgIGlmIChzLT5zdGF0ZV9vdXRfcG9zID49IHMtPm51bVopIGJyZWFrOworCisgICAgICBwcm9ncmVzc19vdXQgPSBUcnVlOworICAgICAgKihzLT5zdHJtLT5uZXh0X291dCkgPSAoKFVDaGFyKikocy0+cXVhZHJhbnQpKVtzLT5zdGF0ZV9vdXRfcG9zXTsKKyAgICAgIHMtPnN0YXRlX291dF9wb3MrKzsKKyAgICAgIHMtPnN0cm0tPmF2YWlsX291dC0tOworICAgICAgcy0+c3RybS0+bmV4dF9vdXQrKzsKKyAgICAgIHMtPnN0cm0tPnRvdGFsX291dCsrOworICAgICAgCisgICB9CisKKyAgIHJldHVybiBwcm9ncmVzc19vdXQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitCb29sIGhhbmRsZV9jb21wcmVzcyAoIGJ6X3N0cmVhbSogc3RybSApCit7CisgICBCb29sIHByb2dyZXNzX2luICA9IEZhbHNlOworICAgQm9vbCBwcm9ncmVzc19vdXQgPSBGYWxzZTsKKyAgIEVTdGF0ZSogcyA9IHN0cm0tPnN0YXRlOworICAgCisgICB3aGlsZSAoVHJ1ZSkgeworCisgICAgICBpZiAocy0+c3RhdGUgPT0gQlpfU19PVVRQVVQpIHsKKyAgICAgICAgIHByb2dyZXNzX291dCB8PSBjb3B5X291dHB1dF91bnRpbF9zdG9wICggcyApOworICAgICAgICAgaWYgKHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKSBicmVhazsKKyAgICAgICAgIGlmIChzLT5tb2RlID09IEJaX01fRklOSVNISU5HICYmIAorICAgICAgICAgICAgIHMtPmF2YWlsX2luX2V4cGVjdCA9PSAwICYmCisgICAgICAgICAgICAgaXNlbXB0eV9STChzKSkgYnJlYWs7CisgICAgICAgICBwcmVwYXJlX25ld19ibG9jayAoIHMgKTsKKyAgICAgICAgIHMtPnN0YXRlID0gQlpfU19JTlBVVDsKKyAgICAgICAgIGlmIChzLT5tb2RlID09IEJaX01fRkxVU0hJTkcgJiYgCisgICAgICAgICAgICAgcy0+YXZhaWxfaW5fZXhwZWN0ID09IDAgJiYKKyAgICAgICAgICAgICBpc2VtcHR5X1JMKHMpKSBicmVhazsKKyAgICAgIH0KKworICAgICAgaWYgKHMtPnN0YXRlID09IEJaX1NfSU5QVVQpIHsKKyAgICAgICAgIHByb2dyZXNzX2luIHw9IGNvcHlfaW5wdXRfdW50aWxfc3RvcCAoIHMgKTsKKyAgICAgICAgIGlmIChzLT5tb2RlICE9IEJaX01fUlVOTklORyAmJiBzLT5hdmFpbF9pbl9leHBlY3QgPT0gMCkgeworICAgICAgICAgICAgZmx1c2hfUkwgKCBzICk7CisgICAgICAgICAgICBjb21wcmVzc0Jsb2NrICggcywgcy0+bW9kZSA9PSBCWl9NX0ZJTklTSElORyApOworICAgICAgICAgICAgcy0+c3RhdGUgPSBCWl9TX09VVFBVVDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIGlmIChzLT5uYmxvY2sgPj0gcy0+bmJsb2NrTUFYKSB7CisgICAgICAgICAgICBjb21wcmVzc0Jsb2NrICggcywgRmFsc2UgKTsKKyAgICAgICAgICAgIHMtPnN0YXRlID0gQlpfU19PVVRQVVQ7CisgICAgICAgICB9CisgICAgICAgICBlbHNlCisgICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICB9CisgICAgICB9CisKKyAgIH0KKworICAgcmV0dXJuIHByb2dyZXNzX2luIHx8IHByb2dyZXNzX291dDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6Q29tcHJlc3MpICggYnpfc3RyZWFtICpzdHJtLCBpbnQgYWN0aW9uICkKK3sKKyAgIEJvb2wgcHJvZ3Jlc3M7CisgICBFU3RhdGUqIHM7CisgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBzID0gc3RybS0+c3RhdGU7CisgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBpZiAocy0+c3RybSAhPSBzdHJtKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisKKyAgIHByZXN3aXRjaDoKKyAgIHN3aXRjaCAocy0+bW9kZSkgeworCisgICAgICBjYXNlIEJaX01fSURMRToKKyAgICAgICAgIHJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsKKworICAgICAgY2FzZSBCWl9NX1JVTk5JTkc6CisgICAgICAgICBpZiAoYWN0aW9uID09IEJaX1JVTikgeworICAgICAgICAgICAgcHJvZ3Jlc3MgPSBoYW5kbGVfY29tcHJlc3MgKCBzdHJtICk7CisgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3MgPyBCWl9SVU5fT0sgOiBCWl9QQVJBTV9FUlJPUjsKKyAgICAgICAgIH0gCisgICAgICAgICBlbHNlCisJIGlmIChhY3Rpb24gPT0gQlpfRkxVU0gpIHsKKyAgICAgICAgICAgIHMtPmF2YWlsX2luX2V4cGVjdCA9IHN0cm0tPmF2YWlsX2luOworICAgICAgICAgICAgcy0+bW9kZSA9IEJaX01fRkxVU0hJTkc7CisgICAgICAgICAgICBnb3RvIHByZXN3aXRjaDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UKKyAgICAgICAgIGlmIChhY3Rpb24gPT0gQlpfRklOSVNIKSB7CisgICAgICAgICAgICBzLT5hdmFpbF9pbl9leHBlY3QgPSBzdHJtLT5hdmFpbF9pbjsKKyAgICAgICAgICAgIHMtPm1vZGUgPSBCWl9NX0ZJTklTSElORzsKKyAgICAgICAgICAgIGdvdG8gcHJlc3dpdGNoOworICAgICAgICAgfQorICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIHJldHVybiBCWl9QQVJBTV9FUlJPUjsKKworICAgICAgY2FzZSBCWl9NX0ZMVVNISU5HOgorICAgICAgICAgaWYgKGFjdGlvbiAhPSBCWl9GTFVTSCkgcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOworICAgICAgICAgaWYgKHMtPmF2YWlsX2luX2V4cGVjdCAhPSBzLT5zdHJtLT5hdmFpbF9pbikgcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOworICAgICAgICAgcHJvZ3Jlc3MgPSBoYW5kbGVfY29tcHJlc3MgKCBzdHJtICk7CisgICAgICAgICBpZiAocy0+YXZhaWxfaW5fZXhwZWN0ID4gMCB8fCAhaXNlbXB0eV9STChzKSB8fAorICAgICAgICAgICAgIHMtPnN0YXRlX291dF9wb3MgPCBzLT5udW1aKSByZXR1cm4gQlpfRkxVU0hfT0s7CisgICAgICAgICBzLT5tb2RlID0gQlpfTV9SVU5OSU5HOworICAgICAgICAgcmV0dXJuIEJaX1JVTl9PSzsKKworICAgICAgY2FzZSBCWl9NX0ZJTklTSElORzoKKyAgICAgICAgIGlmIChhY3Rpb24gIT0gQlpfRklOSVNIKSByZXR1cm4gQlpfU0VRVUVOQ0VfRVJST1I7CisgICAgICAgICBpZiAocy0+YXZhaWxfaW5fZXhwZWN0ICE9IHMtPnN0cm0tPmF2YWlsX2luKSByZXR1cm4gQlpfU0VRVUVOQ0VfRVJST1I7CisgICAgICAgICBwcm9ncmVzcyA9IGhhbmRsZV9jb21wcmVzcyAoIHN0cm0gKTsKKyAgICAgICAgIGlmICghcHJvZ3Jlc3MpIHJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsKKyAgICAgICAgIGlmIChzLT5hdmFpbF9pbl9leHBlY3QgPiAwIHx8ICFpc2VtcHR5X1JMKHMpIHx8CisgICAgICAgICAgICAgcy0+c3RhdGVfb3V0X3BvcyA8IHMtPm51bVopIHJldHVybiBCWl9GSU5JU0hfT0s7CisgICAgICAgICBzLT5tb2RlID0gQlpfTV9JRExFOworICAgICAgICAgcmV0dXJuIEJaX1NUUkVBTV9FTkQ7CisgICB9CisgICByZXR1cm4gQlpfT0s7IC8qLS1ub3QgcmVhY2hlZC0tKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6Q29tcHJlc3NFbmQpICAoIGJ6X3N0cmVhbSAqc3RybSApCit7CisgICBFU3RhdGUqIHM7CisgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBzID0gc3RybS0+c3RhdGU7CisgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBpZiAocy0+c3RybSAhPSBzdHJtKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisKKyAgIGlmIChzLT5ibG9jayAgICAhPSBOVUxMKSBCWkZSRUUocy0+YmxvY2spOworICAgaWYgKHMtPnF1YWRyYW50ICE9IE5VTEwpIEJaRlJFRShzLT5xdWFkcmFudCk7CisgICBpZiAocy0+enB0ciAgICAgIT0gTlVMTCkgQlpGUkVFKHMtPnpwdHIpOworICAgaWYgKHMtPmZ0YWIgICAgICE9IE5VTEwpIEJaRlJFRShzLT5mdGFiKTsKKyAgIEJaRlJFRShzdHJtLT5zdGF0ZSk7CisKKyAgIHN0cm0tPnN0YXRlID0gTlVMTDsgICAKKworICAgcmV0dXJuIEJaX09LOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIERlY29tcHJlc3Npb24gc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiekRlY29tcHJlc3NJbml0KSAKKyAgICAgICAgICAgICAgICAgICAgICggYnpfc3RyZWFtKiBzdHJtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICB2ZXJib3NpdHksCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgc21hbGwgKQoreworICAgRFN0YXRlKiBzOworCisgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBpZiAoc21hbGwgIT0gMCAmJiBzbWFsbCAhPSAxKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBpZiAodmVyYm9zaXR5IDwgMCB8fCB2ZXJib3NpdHkgPiA0KSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisKKyAgIGlmIChzdHJtLT5iemFsbG9jID09IE5VTEwpIHN0cm0tPmJ6YWxsb2MgPSBkZWZhdWx0X2J6YWxsb2M7CisgICBpZiAoc3RybS0+YnpmcmVlID09IE5VTEwpIHN0cm0tPmJ6ZnJlZSA9IGRlZmF1bHRfYnpmcmVlOworCisgICBzID0gQlpBTExPQyggc2l6ZW9mKERTdGF0ZSkgKTsKKyAgIGlmIChzID09IE5VTEwpIHJldHVybiBCWl9NRU1fRVJST1I7CisgICBzLT5zdHJtICAgICAgICAgICAgICAgICAgPSBzdHJtOworICAgc3RybS0+c3RhdGUgICAgICAgICAgICAgID0gczsKKyAgIHMtPnN0YXRlICAgICAgICAgICAgICAgICA9IEJaX1hfTUFHSUNfMTsKKyAgIHMtPmJzTGl2ZSAgICAgICAgICAgICAgICA9IDA7CisgICBzLT5ic0J1ZmYgICAgICAgICAgICAgICAgPSAwOworICAgcy0+Y2FsY3VsYXRlZENvbWJpbmVkQ1JDID0gMDsKKyAgIHN0cm0tPnRvdGFsX2luICAgICAgICAgICA9IDA7CisgICBzdHJtLT50b3RhbF9vdXQgICAgICAgICAgPSAwOworICAgcy0+c21hbGxEZWNvbXByZXNzICAgICAgID0gKEJvb2wpc21hbGw7CisgICBzLT5sbDQgICAgICAgICAgICAgICAgICAgPSBOVUxMOworICAgcy0+bGwxNiAgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgIHMtPnR0ICAgICAgICAgICAgICAgICAgICA9IE5VTEw7CisgICBzLT5jdXJyQmxvY2tObyAgICAgICAgICAgPSAwOworICAgcy0+dmVyYm9zaXR5ICAgICAgICAgICAgID0gdmVyYm9zaXR5OworCisgICByZXR1cm4gQlpfT0s7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIHVuUkxFX29idWZfdG9fb3V0cHV0X0ZBU1QgKCBEU3RhdGUqIHMgKQoreworICAgVUNoYXIgazE7CisKKyAgIGlmIChzLT5ibG9ja1JhbmRvbWlzZWQpIHsKKworICAgICAgd2hpbGUgKFRydWUpIHsKKyAgICAgICAgIC8qIHRyeSB0byBmaW5pc2ggZXhpc3RpbmcgcnVuICovCisgICAgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICBpZiAocy0+c3RhdGVfb3V0X2xlbiA9PSAwKSBicmVhazsKKyAgICAgICAgICAgICooIChVQ2hhciopKHMtPnN0cm0tPm5leHRfb3V0KSApID0gcy0+c3RhdGVfb3V0X2NoOworICAgICAgICAgICAgQlpfVVBEQVRFX0NSQyAoIHMtPmNhbGN1bGF0ZWRCbG9ja0NSQywgcy0+c3RhdGVfb3V0X2NoICk7CisgICAgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuLS07CisgICAgICAgICAgICBzLT5zdHJtLT5uZXh0X291dCsrOworICAgICAgICAgICAgcy0+c3RybS0+YXZhaWxfb3V0LS07CisgICAgICAgICAgICBzLT5zdHJtLT50b3RhbF9vdXQrKzsKKyAgICAgICAgIH0KKyAgIAorICAgICAgICAgLyogY2FuIGEgbmV3IHJ1biBiZSBzdGFydGVkPyAqLworICAgICAgICAgaWYgKHMtPm5ibG9ja191c2VkID09IHMtPnNhdmVfbmJsb2NrKzEpIHJldHVybjsKKyAgICAgICAgICAgICAgIAorICAgCisgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuID0gMTsKKyAgICAgICAgIHMtPnN0YXRlX291dF9jaCA9IHMtPmswOworICAgICAgICAgQlpfR0VUX0ZBU1QoazEpOyBCWl9SQU5EX1VQRF9NQVNLOyAKKyAgICAgICAgIGsxIF49IEJaX1JBTkRfTUFTSzsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSBjb250aW51ZTsKKyAgICAgICAgIGlmIChrMSAhPSBzLT5rMCkgeyBzLT5rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgcy0+c3RhdGVfb3V0X2xlbiA9IDI7CisgICAgICAgICBCWl9HRVRfRkFTVChrMSk7IEJaX1JBTkRfVVBEX01BU0s7IAorICAgICAgICAgazEgXj0gQlpfUkFORF9NQVNLOyBzLT5uYmxvY2tfdXNlZCsrOworICAgICAgICAgaWYgKHMtPm5ibG9ja191c2VkID09IHMtPnNhdmVfbmJsb2NrKzEpIGNvbnRpbnVlOworICAgICAgICAgaWYgKGsxICE9IHMtPmswKSB7IHMtPmswID0gazE7IGNvbnRpbnVlOyB9OworICAgCisgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuID0gMzsKKyAgICAgICAgIEJaX0dFVF9GQVNUKGsxKTsgQlpfUkFORF9VUERfTUFTSzsgCisgICAgICAgICBrMSBePSBCWl9SQU5EX01BU0s7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICBpZiAocy0+bmJsb2NrX3VzZWQgPT0gcy0+c2F2ZV9uYmxvY2srMSkgY29udGludWU7CisgICAgICAgICBpZiAoazEgIT0gcy0+azApIHsgcy0+azAgPSBrMTsgY29udGludWU7IH07CisgICAKKyAgICAgICAgIEJaX0dFVF9GQVNUKGsxKTsgQlpfUkFORF9VUERfTUFTSzsgCisgICAgICAgICBrMSBePSBCWl9SQU5EX01BU0s7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuID0gKChJbnQzMilrMSkgKyA0OworICAgICAgICAgQlpfR0VUX0ZBU1Qocy0+azApOyBCWl9SQU5EX1VQRF9NQVNLOyAKKyAgICAgICAgIHMtPmswIF49IEJaX1JBTkRfTUFTSzsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgIH0KKworICAgfSBlbHNlIHsKKworICAgICAgLyogcmVzdG9yZSAqLworICAgICAgVUludDMyICAgICAgICBjX2NhbGN1bGF0ZWRCbG9ja0NSQyA9IHMtPmNhbGN1bGF0ZWRCbG9ja0NSQzsKKyAgICAgIFVDaGFyICAgICAgICAgY19zdGF0ZV9vdXRfY2ggICAgICAgPSBzLT5zdGF0ZV9vdXRfY2g7CisgICAgICBJbnQzMiAgICAgICAgIGNfc3RhdGVfb3V0X2xlbiAgICAgID0gcy0+c3RhdGVfb3V0X2xlbjsKKyAgICAgIEludDMyICAgICAgICAgY19uYmxvY2tfdXNlZCAgICAgICAgPSBzLT5uYmxvY2tfdXNlZDsKKyAgICAgIEludDMyICAgICAgICAgY19rMCAgICAgICAgICAgICAgICAgPSBzLT5rMDsKKyAgICAgIFVJbnQzMiogICAgICAgY190dCAgICAgICAgICAgICAgICAgPSBzLT50dDsKKyAgICAgIFVJbnQzMiAgICAgICAgY190UG9zICAgICAgICAgICAgICAgPSBzLT50UG9zOworICAgICAgY2hhciogICAgICAgICBjc19uZXh0X291dCAgICAgICAgICA9IHMtPnN0cm0tPm5leHRfb3V0OworICAgICAgdW5zaWduZWQgaW50ICBjc19hdmFpbF9vdXQgICAgICAgICA9IHMtPnN0cm0tPmF2YWlsX291dDsKKyAgICAgIC8qIGVuZCByZXN0b3JlICovCisKKyAgICAgIFVJbnQzMiBhdmFpbF9vdXRfSU5JVCA9IGNzX2F2YWlsX291dDsKKyAgICAgIEludDMyICBzX3NhdmVfbmJsb2NrUFAgPSBzLT5zYXZlX25ibG9jaysxOworCisgICAgICB3aGlsZSAoVHJ1ZSkgeworCisgICAgICAgICAvKiB0cnkgdG8gZmluaXNoIGV4aXN0aW5nIHJ1biAqLworICAgICAgICAgaWYgKGNfc3RhdGVfb3V0X2xlbiA+IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICAgICAgICBpZiAoY3NfYXZhaWxfb3V0ID09IDApIGdvdG8gcmV0dXJuX25vdHI7CisgICAgICAgICAgICAgICBpZiAoY19zdGF0ZV9vdXRfbGVuID09IDEpIGJyZWFrOworICAgICAgICAgICAgICAgKiggKFVDaGFyKikoY3NfbmV4dF9vdXQpICkgPSBjX3N0YXRlX291dF9jaDsKKyAgICAgICAgICAgICAgIEJaX1VQREFURV9DUkMgKCBjX2NhbGN1bGF0ZWRCbG9ja0NSQywgY19zdGF0ZV9vdXRfY2ggKTsKKyAgICAgICAgICAgICAgIGNfc3RhdGVfb3V0X2xlbi0tOworICAgICAgICAgICAgICAgY3NfbmV4dF9vdXQrKzsKKyAgICAgICAgICAgICAgIGNzX2F2YWlsX291dC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc19zdGF0ZV9vdXRfbGVuX2VxX29uZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChjc19hdmFpbF9vdXQgPT0gMCkgeyAKKyAgICAgICAgICAgICAgICAgIGNfc3RhdGVfb3V0X2xlbiA9IDE7IGdvdG8gcmV0dXJuX25vdHI7CisgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgKiggKFVDaGFyKikoY3NfbmV4dF9vdXQpICkgPSBjX3N0YXRlX291dF9jaDsKKyAgICAgICAgICAgICAgIEJaX1VQREFURV9DUkMgKCBjX2NhbGN1bGF0ZWRCbG9ja0NSQywgY19zdGF0ZV9vdXRfY2ggKTsKKyAgICAgICAgICAgICAgIGNzX25leHRfb3V0Kys7CisgICAgICAgICAgICAgICBjc19hdmFpbF9vdXQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0gICAKKyAgICAgICAgIC8qIGNhbiBhIG5ldyBydW4gYmUgc3RhcnRlZD8gKi8KKyAgICAgICAgIGlmIChjX25ibG9ja191c2VkID09IHNfc2F2ZV9uYmxvY2tQUCkgeworICAgICAgICAgICAgY19zdGF0ZV9vdXRfbGVuID0gMDsgZ290byByZXR1cm5fbm90cjsKKyAgICAgICAgIH07ICAgCisgICAgICAgICBjX3N0YXRlX291dF9jaCA9IGNfazA7CisgICAgICAgICBCWl9HRVRfRkFTVF9DKGsxKTsgY19uYmxvY2tfdXNlZCsrOworICAgICAgICAgaWYgKGsxICE9IGNfazApIHsgCisgICAgICAgICAgICBjX2swID0gazE7IGdvdG8gc19zdGF0ZV9vdXRfbGVuX2VxX29uZTsgCisgICAgICAgICB9OworICAgICAgICAgaWYgKGNfbmJsb2NrX3VzZWQgPT0gc19zYXZlX25ibG9ja1BQKSAKKyAgICAgICAgICAgIGdvdG8gc19zdGF0ZV9vdXRfbGVuX2VxX29uZTsKKyAgIAorICAgICAgICAgY19zdGF0ZV9vdXRfbGVuID0gMjsKKyAgICAgICAgIEJaX0dFVF9GQVNUX0MoazEpOyBjX25ibG9ja191c2VkKys7CisgICAgICAgICBpZiAoY19uYmxvY2tfdXNlZCA9PSBzX3NhdmVfbmJsb2NrUFApIGNvbnRpbnVlOworICAgICAgICAgaWYgKGsxICE9IGNfazApIHsgY19rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgY19zdGF0ZV9vdXRfbGVuID0gMzsKKyAgICAgICAgIEJaX0dFVF9GQVNUX0MoazEpOyBjX25ibG9ja191c2VkKys7CisgICAgICAgICBpZiAoY19uYmxvY2tfdXNlZCA9PSBzX3NhdmVfbmJsb2NrUFApIGNvbnRpbnVlOworICAgICAgICAgaWYgKGsxICE9IGNfazApIHsgY19rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgQlpfR0VUX0ZBU1RfQyhrMSk7IGNfbmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGNfc3RhdGVfb3V0X2xlbiA9ICgoSW50MzIpazEpICsgNDsKKyAgICAgICAgIEJaX0dFVF9GQVNUX0MoY19rMCk7IGNfbmJsb2NrX3VzZWQrKzsKKyAgICAgIH0KKworICAgICAgcmV0dXJuX25vdHI6CisgICAgICBzLT5zdHJtLT50b3RhbF9vdXQgKz0gKGF2YWlsX291dF9JTklUIC0gY3NfYXZhaWxfb3V0KTsKKworICAgICAgLyogc2F2ZSAqLworICAgICAgcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDID0gY19jYWxjdWxhdGVkQmxvY2tDUkM7CisgICAgICBzLT5zdGF0ZV9vdXRfY2ggICAgICAgPSBjX3N0YXRlX291dF9jaDsKKyAgICAgIHMtPnN0YXRlX291dF9sZW4gICAgICA9IGNfc3RhdGVfb3V0X2xlbjsKKyAgICAgIHMtPm5ibG9ja191c2VkICAgICAgICA9IGNfbmJsb2NrX3VzZWQ7CisgICAgICBzLT5rMCAgICAgICAgICAgICAgICAgPSBjX2swOworICAgICAgcy0+dHQgICAgICAgICAgICAgICAgID0gY190dDsKKyAgICAgIHMtPnRQb3MgICAgICAgICAgICAgICA9IGNfdFBvczsKKyAgICAgIHMtPnN0cm0tPm5leHRfb3V0ICAgICA9IGNzX25leHRfb3V0OworICAgICAgcy0+c3RybS0+YXZhaWxfb3V0ICAgID0gY3NfYXZhaWxfb3V0OworICAgICAgLyogZW5kIHNhdmUgKi8KKyAgIH0KK30KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19faW5saW5lX18gSW50MzIgaW5kZXhJbnRvRiAoIEludDMyIGluZHgsIEludDMyICpjZnRhYiApCit7CisgICBJbnQzMiBuYiwgbmEsIG1pZDsKKyAgIG5iID0gMDsKKyAgIG5hID0gMjU2OworICAgZG8geworICAgICAgbWlkID0gKG5iICsgbmEpID4+IDE7CisgICAgICBpZiAoaW5keCA+PSBjZnRhYlttaWRdKSBuYiA9IG1pZDsgZWxzZSBuYSA9IG1pZDsKKyAgIH0KKyAgIHdoaWxlIChuYSAtIG5iICE9IDEpOworICAgcmV0dXJuIG5iOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCB1blJMRV9vYnVmX3RvX291dHB1dF9TTUFMTCAoIERTdGF0ZSogcyApCit7CisgICBVQ2hhciBrMTsKKworICAgaWYgKHMtPmJsb2NrUmFuZG9taXNlZCkgeworCisgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgLyogdHJ5IHRvIGZpbmlzaCBleGlzdGluZyBydW4gKi8KKyAgICAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICAgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybjsKKyAgICAgICAgICAgIGlmIChzLT5zdGF0ZV9vdXRfbGVuID09IDApIGJyZWFrOworICAgICAgICAgICAgKiggKFVDaGFyKikocy0+c3RybS0+bmV4dF9vdXQpICkgPSBzLT5zdGF0ZV9vdXRfY2g7CisgICAgICAgICAgICBCWl9VUERBVEVfQ1JDICggcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDLCBzLT5zdGF0ZV9vdXRfY2ggKTsKKyAgICAgICAgICAgIHMtPnN0YXRlX291dF9sZW4tLTsKKyAgICAgICAgICAgIHMtPnN0cm0tPm5leHRfb3V0Kys7CisgICAgICAgICAgICBzLT5zdHJtLT5hdmFpbF9vdXQtLTsKKyAgICAgICAgICAgIHMtPnN0cm0tPnRvdGFsX291dCsrOworICAgICAgICAgfQorICAgCisgICAgICAgICAvKiBjYW4gYSBuZXcgcnVuIGJlIHN0YXJ0ZWQ/ICovCisgICAgICAgICBpZiAocy0+bmJsb2NrX3VzZWQgPT0gcy0+c2F2ZV9uYmxvY2srMSkgcmV0dXJuOworICAgICAgICAgICAgICAgCisgICAKKyAgICAgICAgIHMtPnN0YXRlX291dF9sZW4gPSAxOworICAgICAgICAgcy0+c3RhdGVfb3V0X2NoID0gcy0+azA7CisgICAgICAgICBCWl9HRVRfU01BTEwoazEpOyBCWl9SQU5EX1VQRF9NQVNLOyAKKyAgICAgICAgIGsxIF49IEJaX1JBTkRfTUFTSzsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSBjb250aW51ZTsKKyAgICAgICAgIGlmIChrMSAhPSBzLT5rMCkgeyBzLT5rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgcy0+c3RhdGVfb3V0X2xlbiA9IDI7CisgICAgICAgICBCWl9HRVRfU01BTEwoazEpOyBCWl9SQU5EX1VQRF9NQVNLOyAKKyAgICAgICAgIGsxIF49IEJaX1JBTkRfTUFTSzsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSBjb250aW51ZTsKKyAgICAgICAgIGlmIChrMSAhPSBzLT5rMCkgeyBzLT5rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgcy0+c3RhdGVfb3V0X2xlbiA9IDM7CisgICAgICAgICBCWl9HRVRfU01BTEwoazEpOyBCWl9SQU5EX1VQRF9NQVNLOyAKKyAgICAgICAgIGsxIF49IEJaX1JBTkRfTUFTSzsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSBjb250aW51ZTsKKyAgICAgICAgIGlmIChrMSAhPSBzLT5rMCkgeyBzLT5rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgQlpfR0VUX1NNQUxMKGsxKTsgQlpfUkFORF9VUERfTUFTSzsgCisgICAgICAgICBrMSBePSBCWl9SQU5EX01BU0s7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuID0gKChJbnQzMilrMSkgKyA0OworICAgICAgICAgQlpfR0VUX1NNQUxMKHMtPmswKTsgQlpfUkFORF9VUERfTUFTSzsgCisgICAgICAgICBzLT5rMCBePSBCWl9SQU5EX01BU0s7IHMtPm5ibG9ja191c2VkKys7CisgICAgICB9CisKKyAgIH0gZWxzZSB7CisKKyAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICAvKiB0cnkgdG8gZmluaXNoIGV4aXN0aW5nIHJ1biAqLworICAgICAgICAgd2hpbGUgKFRydWUpIHsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgaWYgKHMtPnN0YXRlX291dF9sZW4gPT0gMCkgYnJlYWs7CisgICAgICAgICAgICAqKCAoVUNoYXIqKShzLT5zdHJtLT5uZXh0X291dCkgKSA9IHMtPnN0YXRlX291dF9jaDsKKyAgICAgICAgICAgIEJaX1VQREFURV9DUkMgKCBzLT5jYWxjdWxhdGVkQmxvY2tDUkMsIHMtPnN0YXRlX291dF9jaCApOworICAgICAgICAgICAgcy0+c3RhdGVfb3V0X2xlbi0tOworICAgICAgICAgICAgcy0+c3RybS0+bmV4dF9vdXQrKzsKKyAgICAgICAgICAgIHMtPnN0cm0tPmF2YWlsX291dC0tOworICAgICAgICAgICAgcy0+c3RybS0+dG90YWxfb3V0Kys7CisgICAgICAgICB9CisgICAKKyAgICAgICAgIC8qIGNhbiBhIG5ldyBydW4gYmUgc3RhcnRlZD8gKi8KKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSByZXR1cm47CisgICAKKyAgICAgICAgIHMtPnN0YXRlX291dF9sZW4gPSAxOworICAgICAgICAgcy0+c3RhdGVfb3V0X2NoID0gcy0+azA7CisgICAgICAgICBCWl9HRVRfU01BTEwoazEpOyBzLT5uYmxvY2tfdXNlZCsrOworICAgICAgICAgaWYgKHMtPm5ibG9ja191c2VkID09IHMtPnNhdmVfbmJsb2NrKzEpIGNvbnRpbnVlOworICAgICAgICAgaWYgKGsxICE9IHMtPmswKSB7IHMtPmswID0gazE7IGNvbnRpbnVlOyB9OworICAgCisgICAgICAgICBzLT5zdGF0ZV9vdXRfbGVuID0gMjsKKyAgICAgICAgIEJaX0dFVF9TTUFMTChrMSk7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICBpZiAocy0+bmJsb2NrX3VzZWQgPT0gcy0+c2F2ZV9uYmxvY2srMSkgY29udGludWU7CisgICAgICAgICBpZiAoazEgIT0gcy0+azApIHsgcy0+azAgPSBrMTsgY29udGludWU7IH07CisgICAKKyAgICAgICAgIHMtPnN0YXRlX291dF9sZW4gPSAzOworICAgICAgICAgQlpfR0VUX1NNQUxMKGsxKTsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxKSBjb250aW51ZTsKKyAgICAgICAgIGlmIChrMSAhPSBzLT5rMCkgeyBzLT5rMCA9IGsxOyBjb250aW51ZTsgfTsKKyAgIAorICAgICAgICAgQlpfR0VUX1NNQUxMKGsxKTsgcy0+bmJsb2NrX3VzZWQrKzsKKyAgICAgICAgIHMtPnN0YXRlX291dF9sZW4gPSAoKEludDMyKWsxKSArIDQ7CisgICAgICAgICBCWl9HRVRfU01BTEwocy0+azApOyBzLT5uYmxvY2tfdXNlZCsrOworICAgICAgfQorCisgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiekRlY29tcHJlc3MpICggYnpfc3RyZWFtICpzdHJtICkKK3sKKyAgIERTdGF0ZSogczsKKyAgIGlmIChzdHJtID09IE5VTEwpIHJldHVybiBCWl9QQVJBTV9FUlJPUjsKKyAgIHMgPSBzdHJtLT5zdGF0ZTsKKyAgIGlmIChzID09IE5VTEwpIHJldHVybiBCWl9QQVJBTV9FUlJPUjsKKyAgIGlmIChzLT5zdHJtICE9IHN0cm0pIHJldHVybiBCWl9QQVJBTV9FUlJPUjsKKworICAgd2hpbGUgKFRydWUpIHsKKyAgICAgIGlmIChzLT5zdGF0ZSA9PSBCWl9YX0lETEUpIHJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsKKyAgICAgIGlmIChzLT5zdGF0ZSA9PSBCWl9YX09VVFBVVCkgeworICAgICAgICAgaWYgKHMtPnNtYWxsRGVjb21wcmVzcykKKyAgICAgICAgICAgIHVuUkxFX29idWZfdG9fb3V0cHV0X1NNQUxMICggcyApOyBlbHNlCisgICAgICAgICAgICB1blJMRV9vYnVmX3RvX291dHB1dF9GQVNUICAoIHMgKTsKKyAgICAgICAgIGlmIChzLT5uYmxvY2tfdXNlZCA9PSBzLT5zYXZlX25ibG9jaysxICYmIHMtPnN0YXRlX291dF9sZW4gPT0gMCkgeworICAgICAgICAgICAgQlpfRklOQUxJU0VfQ1JDICggcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDICk7CisgICAgICAgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDMpIAorICAgICAgICAgICAgICAgVlByaW50ZjIgKCAiIHsweCV4LCAweCV4fSIsIHMtPnN0b3JlZEJsb2NrQ1JDLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDICk7CisgICAgICAgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDIpIFZQcmludGYwICggIl0iICk7CisgICAgICAgICAgICBpZiAocy0+Y2FsY3VsYXRlZEJsb2NrQ1JDICE9IHMtPnN0b3JlZEJsb2NrQ1JDKQorICAgICAgICAgICAgICAgcmV0dXJuIEJaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBzLT5jYWxjdWxhdGVkQ29tYmluZWRDUkMgCisgICAgICAgICAgICAgICA9IChzLT5jYWxjdWxhdGVkQ29tYmluZWRDUkMgPDwgMSkgfCAKKyAgICAgICAgICAgICAgICAgICAgKHMtPmNhbGN1bGF0ZWRDb21iaW5lZENSQyA+PiAzMSk7CisgICAgICAgICAgICBzLT5jYWxjdWxhdGVkQ29tYmluZWRDUkMgXj0gcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDOworICAgICAgICAgICAgcy0+c3RhdGUgPSBCWl9YX0JMS0hEUl8xOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCWl9PSzsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzLT5zdGF0ZSA+PSBCWl9YX01BR0lDXzEpIHsKKyAgICAgICAgIEludDMyIHIgPSBkZWNvbXByZXNzICggcyApOworICAgICAgICAgaWYgKHIgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKQorICAgICAgICAgICAgICAgVlByaW50ZjIgKCAiXG4gICAgY29tYmluZWQgQ1JDczogc3RvcmVkID0gMHgleCwgY29tcHV0ZWQgPSAweCV4IiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0b3JlZENvbWJpbmVkQ1JDLCBzLT5jYWxjdWxhdGVkQ29tYmluZWRDUkMgKTsKKyAgICAgICAgICAgIGlmIChzLT5jYWxjdWxhdGVkQ29tYmluZWRDUkMgIT0gcy0+c3RvcmVkQ29tYmluZWRDUkMpCisgICAgICAgICAgICAgICByZXR1cm4gQlpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgfQorICAgICAgICAgaWYgKHMtPnN0YXRlICE9IEJaX1hfT1VUUFVUKSByZXR1cm4gcjsKKyAgICAgIH0KKyAgIH0KKworICAgQXNzZXJ0SCAoIDAsIDYwMDEgKTsKKyAgIC8qbm90cmVhY2hlZCovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiekRlY29tcHJlc3NFbmQpICAoIGJ6X3N0cmVhbSAqc3RybSApCit7CisgICBEU3RhdGUqIHM7CisgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBzID0gc3RybS0+c3RhdGU7CisgICBpZiAocyA9PSBOVUxMKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisgICBpZiAocy0+c3RybSAhPSBzdHJtKSByZXR1cm4gQlpfUEFSQU1fRVJST1I7CisKKyAgIGlmIChzLT50dCAgICE9IE5VTEwpIEJaRlJFRShzLT50dCk7CisgICBpZiAocy0+bGwxNiAhPSBOVUxMKSBCWkZSRUUocy0+bGwxNik7CisgICBpZiAocy0+bGw0ICAhPSBOVUxMKSBCWkZSRUUocy0+bGw0KTsKKworICAgQlpGUkVFKHN0cm0tPnN0YXRlKTsKKyAgIHN0cm0tPnN0YXRlID0gTlVMTDsKKworICAgcmV0dXJuIEJaX09LOworfQorCisKKyNpZm5kZWYgQlpfTk9fU1RESU8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIEZpbGUgSS9PIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBCWl9TRVRFUlIoZWVlKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgaWYgKGJ6ZXJyb3IgIT0gTlVMTCkgKmJ6ZXJyb3IgPSBlZWU7ICAgXAorICAgaWYgKGJ6ZiAhPSBOVUxMKSBiemYtPmxhc3RFcnIgPSBlZWU7ICAgXAorfQorCit0eXBlZGVmIAorICAgc3RydWN0IHsKKyAgICAgIEZJTEUqICAgICBoYW5kbGU7CisgICAgICBDaGFyICAgICAgYnVmW0JaX01BWF9VTlVTRURdOworICAgICAgSW50MzIgICAgIGJ1Zk47CisgICAgICBCb29sICAgICAgd3JpdGluZzsKKyAgICAgIGJ6X3N0cmVhbSBzdHJtOworICAgICAgSW50MzIgICAgIGxhc3RFcnI7CisgICAgICBCb29sICAgICAgaW5pdGlhbGlzZWRPazsKKyAgIH0KKyAgIGJ6RmlsZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgQm9vbCBteWZlb2YgKCBGSUxFKiBmICkKK3sKKyAgIEludDMyIGMgPSBmZ2V0YyAoIGYgKTsKKyAgIGlmIChjID09IEVPRikgcmV0dXJuIFRydWU7CisgICB1bmdldGMgKCBjLCBmICk7CisgICByZXR1cm4gRmFsc2U7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQlpGSUxFKiBCWl9BUEkoYnpXcml0ZU9wZW4pIAorICAgICAgICAgICAgICAgICAgICAoIGludCogIGJ6ZXJyb3IsICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgRklMRSogZiwgCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgYmxvY2tTaXplMTAwaywgCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgdmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgIGludCAgIHdvcmtGYWN0b3IgKQoreworICAgSW50MzIgICByZXQ7CisgICBiekZpbGUqIGJ6ZiA9IE5VTEw7CisKKyAgIEJaX1NFVEVSUihCWl9PSyk7CisKKyAgIGlmIChmID09IE5VTEwgfHwKKyAgICAgICAoYmxvY2tTaXplMTAwayA8IDEgfHwgYmxvY2tTaXplMTAwayA+IDkpIHx8CisgICAgICAgKHdvcmtGYWN0b3IgPCAwIHx8IHdvcmtGYWN0b3IgPiAyNTApIHx8CisgICAgICAgKHZlcmJvc2l0eSA8IDAgfHwgdmVyYm9zaXR5ID4gNCkpCisgICAgICB7IEJaX1NFVEVSUihCWl9QQVJBTV9FUlJPUik7IHJldHVybiBOVUxMOyB9OworCisgICBpZiAoZmVycm9yKGYpKQorICAgICAgeyBCWl9TRVRFUlIoQlpfSU9fRVJST1IpOyByZXR1cm4gTlVMTDsgfTsKKworICAgYnpmID0gbWFsbG9jICggc2l6ZW9mKGJ6RmlsZSkgKTsKKyAgIGlmIChiemYgPT0gTlVMTCkKKyAgICAgIHsgQlpfU0VURVJSKEJaX01FTV9FUlJPUik7IHJldHVybiBOVUxMOyB9OworCisgICBCWl9TRVRFUlIoQlpfT0spOworICAgYnpmLT5pbml0aWFsaXNlZE9rID0gRmFsc2U7CisgICBiemYtPmJ1Zk4gICAgICAgICAgPSAwOworICAgYnpmLT5oYW5kbGUgICAgICAgID0gZjsKKyAgIGJ6Zi0+d3JpdGluZyAgICAgICA9IFRydWU7CisgICBiemYtPnN0cm0uYnphbGxvYyAgPSBOVUxMOworICAgYnpmLT5zdHJtLmJ6ZnJlZSAgID0gTlVMTDsKKyAgIGJ6Zi0+c3RybS5vcGFxdWUgICA9IE5VTEw7CisKKyAgIGlmICh3b3JrRmFjdG9yID09IDApIHdvcmtGYWN0b3IgPSAzMDsKKyAgIHJldCA9IGJ6Q29tcHJlc3NJbml0ICggJihiemYtPnN0cm0pLCBibG9ja1NpemUxMDBrLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5LCB3b3JrRmFjdG9yICk7CisgICBpZiAocmV0ICE9IEJaX09LKQorICAgICAgeyBCWl9TRVRFUlIocmV0KTsgZnJlZShiemYpOyByZXR1cm4gTlVMTDsgfTsKKworICAgYnpmLT5zdHJtLmF2YWlsX2luID0gMDsKKyAgIGJ6Zi0+aW5pdGlhbGlzZWRPayA9IFRydWU7CisgICByZXR1cm4gYnpmOyAgIAorfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCWl9BUEkoYnpXcml0ZSkKKyAgICAgICAgICAgICAoIGludCogICAgYnplcnJvciwgCisgICAgICAgICAgICAgICBCWkZJTEUqIGIsIAorICAgICAgICAgICAgICAgdm9pZCogICBidWYsIAorICAgICAgICAgICAgICAgaW50ICAgICBsZW4gKQoreworICAgSW50MzIgbiwgbjIsIHJldDsKKyAgIGJ6RmlsZSogYnpmID0gKGJ6RmlsZSopYjsKKworICAgQlpfU0VURVJSKEJaX09LKTsKKyAgIGlmIChiemYgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAwKQorICAgICAgeyBCWl9TRVRFUlIoQlpfUEFSQU1fRVJST1IpOyByZXR1cm47IH07CisgICBpZiAoIShiemYtPndyaXRpbmcpKQorICAgICAgeyBCWl9TRVRFUlIoQlpfU0VRVUVOQ0VfRVJST1IpOyByZXR1cm47IH07CisgICBpZiAoZmVycm9yKGJ6Zi0+aGFuZGxlKSkKKyAgICAgIHsgQlpfU0VURVJSKEJaX0lPX0VSUk9SKTsgcmV0dXJuOyB9OworCisgICBpZiAobGVuID09IDApCisgICAgICB7IEJaX1NFVEVSUihCWl9PSyk7IHJldHVybjsgfTsKKworICAgYnpmLT5zdHJtLmF2YWlsX2luID0gbGVuOworICAgYnpmLT5zdHJtLm5leHRfaW4gID0gYnVmOworCisgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgYnpmLT5zdHJtLmF2YWlsX291dCA9IEJaX01BWF9VTlVTRUQ7CisgICAgICBiemYtPnN0cm0ubmV4dF9vdXQgPSBiemYtPmJ1ZjsKKyAgICAgIHJldCA9IGJ6Q29tcHJlc3MgKCAmKGJ6Zi0+c3RybSksIEJaX1JVTiApOworICAgICAgaWYgKHJldCAhPSBCWl9SVU5fT0spCisgICAgICAgICB7IEJaX1NFVEVSUihyZXQpOyByZXR1cm47IH07CisKKyAgICAgIGlmIChiemYtPnN0cm0uYXZhaWxfb3V0IDwgQlpfTUFYX1VOVVNFRCkgeworICAgICAgICAgbiA9IEJaX01BWF9VTlVTRUQgLSBiemYtPnN0cm0uYXZhaWxfb3V0OworICAgICAgICAgbjIgPSBmd3JpdGUgKCAodm9pZCopKGJ6Zi0+YnVmKSwgc2l6ZW9mKFVDaGFyKSwgCisgICAgICAgICAgICAgICAgICAgICAgIG4sIGJ6Zi0+aGFuZGxlICk7CisgICAgICAgICBpZiAobiAhPSBuMiB8fCBmZXJyb3IoYnpmLT5oYW5kbGUpKQorICAgICAgICAgICAgeyBCWl9TRVRFUlIoQlpfSU9fRVJST1IpOyByZXR1cm47IH07CisgICAgICB9CisKKyAgICAgIGlmIChiemYtPnN0cm0uYXZhaWxfaW4gPT0gMCkKKyAgICAgICAgIHsgQlpfU0VURVJSKEJaX09LKTsgcmV0dXJuOyB9OworICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlpfQVBJKGJ6V3JpdGVDbG9zZSkKKyAgICAgICAgICAgICAgICAgICggaW50KiAgICAgICAgICBiemVycm9yLCAKKyAgICAgICAgICAgICAgICAgICAgQlpGSUxFKiAgICAgICBiLCAKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBhYmFuZG9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIG5ieXRlc19pbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBuYnl0ZXNfb3V0ICkKK3sKKyAgIEludDMyICAgbiwgbjIsIHJldDsKKyAgIGJ6RmlsZSogYnpmID0gKGJ6RmlsZSopYjsKKworICAgaWYgKGJ6ZiA9PSBOVUxMKQorICAgICAgeyBCWl9TRVRFUlIoQlpfT0spOyByZXR1cm47IH07CisgICBpZiAoIShiemYtPndyaXRpbmcpKQorICAgICAgeyBCWl9TRVRFUlIoQlpfU0VRVUVOQ0VfRVJST1IpOyByZXR1cm47IH07CisgICBpZiAoZmVycm9yKGJ6Zi0+aGFuZGxlKSkKKyAgICAgIHsgQlpfU0VURVJSKEJaX0lPX0VSUk9SKTsgcmV0dXJuOyB9OworCisgICBpZiAobmJ5dGVzX2luICE9IE5VTEwpICpuYnl0ZXNfaW4gPSAwOworICAgaWYgKG5ieXRlc19vdXQgIT0gTlVMTCkgKm5ieXRlc19vdXQgPSAwOworCisgICBpZiAoKCFhYmFuZG9uKSAmJiBiemYtPmxhc3RFcnIgPT0gQlpfT0spIHsKKyAgICAgIHdoaWxlIChUcnVlKSB7CisgICAgICAgICBiemYtPnN0cm0uYXZhaWxfb3V0ID0gQlpfTUFYX1VOVVNFRDsKKyAgICAgICAgIGJ6Zi0+c3RybS5uZXh0X291dCA9IGJ6Zi0+YnVmOworICAgICAgICAgcmV0ID0gYnpDb21wcmVzcyAoICYoYnpmLT5zdHJtKSwgQlpfRklOSVNIICk7CisgICAgICAgICBpZiAocmV0ICE9IEJaX0ZJTklTSF9PSyAmJiByZXQgIT0gQlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgIHsgQlpfU0VURVJSKHJldCk7IHJldHVybjsgfTsKKworICAgICAgICAgaWYgKGJ6Zi0+c3RybS5hdmFpbF9vdXQgPCBCWl9NQVhfVU5VU0VEKSB7CisgICAgICAgICAgICBuID0gQlpfTUFYX1VOVVNFRCAtIGJ6Zi0+c3RybS5hdmFpbF9vdXQ7CisgICAgICAgICAgICBuMiA9IGZ3cml0ZSAoICh2b2lkKikoYnpmLT5idWYpLCBzaXplb2YoVUNoYXIpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbiwgYnpmLT5oYW5kbGUgKTsKKyAgICAgICAgICAgIGlmIChuICE9IG4yIHx8IGZlcnJvcihiemYtPmhhbmRsZSkpCisgICAgICAgICAgICAgICB7IEJaX1NFVEVSUihCWl9JT19FUlJPUik7IHJldHVybjsgfTsKKyAgICAgICAgIH0KKworICAgICAgICAgaWYgKHJldCA9PSBCWl9TVFJFQU1fRU5EKSBicmVhazsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKCAhYWJhbmRvbiAmJiAhZmVycm9yICggYnpmLT5oYW5kbGUgKSApIHsKKyAgICAgIGZmbHVzaCAoIGJ6Zi0+aGFuZGxlICk7CisgICAgICBpZiAoZmVycm9yKGJ6Zi0+aGFuZGxlKSkKKyAgICAgICAgIHsgQlpfU0VURVJSKEJaX0lPX0VSUk9SKTsgcmV0dXJuOyB9OworICAgfQorCisgICBpZiAobmJ5dGVzX2luICE9IE5VTEwpICpuYnl0ZXNfaW4gPSBiemYtPnN0cm0udG90YWxfaW47CisgICBpZiAobmJ5dGVzX291dCAhPSBOVUxMKSAqbmJ5dGVzX291dCA9IGJ6Zi0+c3RybS50b3RhbF9vdXQ7CisKKyAgIEJaX1NFVEVSUihCWl9PSyk7CisgICBiekNvbXByZXNzRW5kICggJihiemYtPnN0cm0pICk7CisgICBmcmVlICggYnpmICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQlpGSUxFKiBCWl9BUEkoYnpSZWFkT3BlbikgCisgICAgICAgICAgICAgICAgICAgKCBpbnQqICBiemVycm9yLCAKKyAgICAgICAgICAgICAgICAgICAgIEZJTEUqIGYsIAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgdmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgc21hbGwsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgICBuVW51c2VkICkKK3sKKyAgIGJ6RmlsZSogYnpmID0gTlVMTDsKKyAgIGludCAgICAgcmV0OworCisgICBCWl9TRVRFUlIoQlpfT0spOworCisgICBpZiAoZiA9PSBOVUxMIHx8IAorICAgICAgIChzbWFsbCAhPSAwICYmIHNtYWxsICE9IDEpIHx8CisgICAgICAgKHZlcmJvc2l0eSA8IDAgfHwgdmVyYm9zaXR5ID4gNCkgfHwKKyAgICAgICAodW51c2VkID09IE5VTEwgJiYgblVudXNlZCAhPSAwKSB8fAorICAgICAgICh1bnVzZWQgIT0gTlVMTCAmJiAoblVudXNlZCA8IDAgfHwgblVudXNlZCA+IEJaX01BWF9VTlVTRUQpKSkKKyAgICAgIHsgQlpfU0VURVJSKEJaX1BBUkFNX0VSUk9SKTsgcmV0dXJuIE5VTEw7IH07CisKKyAgIGlmIChmZXJyb3IoZikpCisgICAgICB7IEJaX1NFVEVSUihCWl9JT19FUlJPUik7IHJldHVybiBOVUxMOyB9OworCisgICBiemYgPSBtYWxsb2MgKCBzaXplb2YoYnpGaWxlKSApOworICAgaWYgKGJ6ZiA9PSBOVUxMKSAKKyAgICAgIHsgQlpfU0VURVJSKEJaX01FTV9FUlJPUik7IHJldHVybiBOVUxMOyB9OworCisgICBCWl9TRVRFUlIoQlpfT0spOworCisgICBiemYtPmluaXRpYWxpc2VkT2sgPSBGYWxzZTsKKyAgIGJ6Zi0+aGFuZGxlICAgICAgICA9IGY7CisgICBiemYtPmJ1Zk4gICAgICAgICAgPSAwOworICAgYnpmLT53cml0aW5nICAgICAgID0gRmFsc2U7CisgICBiemYtPnN0cm0uYnphbGxvYyAgPSBOVUxMOworICAgYnpmLT5zdHJtLmJ6ZnJlZSAgID0gTlVMTDsKKyAgIGJ6Zi0+c3RybS5vcGFxdWUgICA9IE5VTEw7CisgICAKKyAgIHdoaWxlIChuVW51c2VkID4gMCkgeworICAgICAgYnpmLT5idWZbYnpmLT5idWZOXSA9ICooKFVDaGFyKikodW51c2VkKSk7IGJ6Zi0+YnVmTisrOworICAgICAgdW51c2VkID0gKCh2b2lkKikoIDEgKyAoKFVDaGFyKikodW51c2VkKSkgICkpOworICAgICAgblVudXNlZC0tOworICAgfQorCisgICByZXQgPSBiekRlY29tcHJlc3NJbml0ICggJihiemYtPnN0cm0pLCB2ZXJib3NpdHksIHNtYWxsICk7CisgICBpZiAocmV0ICE9IEJaX09LKQorICAgICAgeyBCWl9TRVRFUlIocmV0KTsgZnJlZShiemYpOyByZXR1cm4gTlVMTDsgfTsKKworICAgYnpmLT5zdHJtLmF2YWlsX2luID0gYnpmLT5idWZOOworICAgYnpmLT5zdHJtLm5leHRfaW4gID0gYnpmLT5idWY7CisKKyAgIGJ6Zi0+aW5pdGlhbGlzZWRPayA9IFRydWU7CisgICByZXR1cm4gYnpmOyAgIAorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlpfQVBJKGJ6UmVhZENsb3NlKSAoIGludCAqYnplcnJvciwgQlpGSUxFICpiICkKK3sKKyAgIGJ6RmlsZSogYnpmID0gKGJ6RmlsZSopYjsKKworICAgQlpfU0VURVJSKEJaX09LKTsKKyAgIGlmIChiemYgPT0gTlVMTCkKKyAgICAgIHsgQlpfU0VURVJSKEJaX09LKTsgcmV0dXJuOyB9OworCisgICBpZiAoYnpmLT53cml0aW5nKQorICAgICAgeyBCWl9TRVRFUlIoQlpfU0VRVUVOQ0VfRVJST1IpOyByZXR1cm47IH07CisKKyAgIGlmIChiemYtPmluaXRpYWxpc2VkT2spCisgICAgICAodm9pZCliekRlY29tcHJlc3NFbmQgKCAmKGJ6Zi0+c3RybSkgKTsKKyAgIGZyZWUgKCBiemYgKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6UmVhZCkgCisgICAgICAgICAgICggaW50KiAgICBiemVycm9yLCAKKyAgICAgICAgICAgICBCWkZJTEUqIGIsIAorICAgICAgICAgICAgIHZvaWQqICAgYnVmLCAKKyAgICAgICAgICAgICBpbnQgICAgIGxlbiApCit7CisgICBJbnQzMiAgIG4sIHJldDsKKyAgIGJ6RmlsZSogYnpmID0gKGJ6RmlsZSopYjsKKworICAgQlpfU0VURVJSKEJaX09LKTsKKworICAgaWYgKGJ6ZiA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMIHx8IGxlbiA8IDApCisgICAgICB7IEJaX1NFVEVSUihCWl9QQVJBTV9FUlJPUik7IHJldHVybiAwOyB9OworCisgICBpZiAoYnpmLT53cml0aW5nKQorICAgICAgeyBCWl9TRVRFUlIoQlpfU0VRVUVOQ0VfRVJST1IpOyByZXR1cm4gMDsgfTsKKworICAgaWYgKGxlbiA9PSAwKQorICAgICAgeyBCWl9TRVRFUlIoQlpfT0spOyByZXR1cm4gMDsgfTsKKworICAgYnpmLT5zdHJtLmF2YWlsX291dCA9IGxlbjsKKyAgIGJ6Zi0+c3RybS5uZXh0X291dCA9IGJ1ZjsKKworICAgd2hpbGUgKFRydWUpIHsKKworICAgICAgaWYgKGZlcnJvcihiemYtPmhhbmRsZSkpIAorICAgICAgICAgeyBCWl9TRVRFUlIoQlpfSU9fRVJST1IpOyByZXR1cm4gMDsgfTsKKworICAgICAgaWYgKGJ6Zi0+c3RybS5hdmFpbF9pbiA9PSAwICYmICFteWZlb2YoYnpmLT5oYW5kbGUpKSB7CisgICAgICAgICBuID0gZnJlYWQgKCBiemYtPmJ1Ziwgc2l6ZW9mKFVDaGFyKSwgCisgICAgICAgICAgICAgICAgICAgICBCWl9NQVhfVU5VU0VELCBiemYtPmhhbmRsZSApOworICAgICAgICAgaWYgKGZlcnJvcihiemYtPmhhbmRsZSkpCisgICAgICAgICAgICB7IEJaX1NFVEVSUihCWl9JT19FUlJPUik7IHJldHVybiAwOyB9OworICAgICAgICAgYnpmLT5idWZOID0gbjsKKyAgICAgICAgIGJ6Zi0+c3RybS5hdmFpbF9pbiA9IGJ6Zi0+YnVmTjsKKyAgICAgICAgIGJ6Zi0+c3RybS5uZXh0X2luID0gYnpmLT5idWY7CisgICAgICB9CisKKyAgICAgIHJldCA9IGJ6RGVjb21wcmVzcyAoICYoYnpmLT5zdHJtKSApOworCisgICAgICBpZiAocmV0ICE9IEJaX09LICYmIHJldCAhPSBCWl9TVFJFQU1fRU5EKQorICAgICAgICAgeyBCWl9TRVRFUlIocmV0KTsgcmV0dXJuIDA7IH07CisKKyAgICAgIGlmIChyZXQgPT0gQlpfT0sgJiYgbXlmZW9mKGJ6Zi0+aGFuZGxlKSAmJiAKKyAgICAgICAgICBiemYtPnN0cm0uYXZhaWxfaW4gPT0gMCAmJiBiemYtPnN0cm0uYXZhaWxfb3V0ID4gMCkKKyAgICAgICAgIHsgQlpfU0VURVJSKEJaX1VORVhQRUNURURfRU9GKTsgcmV0dXJuIDA7IH07CisKKyAgICAgIGlmIChyZXQgPT0gQlpfU1RSRUFNX0VORCkKKyAgICAgICAgIHsgQlpfU0VURVJSKEJaX1NUUkVBTV9FTkQpOworICAgICAgICAgICByZXR1cm4gbGVuIC0gYnpmLT5zdHJtLmF2YWlsX291dDsgfTsKKyAgICAgIGlmIChiemYtPnN0cm0uYXZhaWxfb3V0ID09IDApCisgICAgICAgICB7IEJaX1NFVEVSUihCWl9PSyk7IHJldHVybiBsZW47IH07CisgICAgICAKKyAgIH0KKworICAgcmV0dXJuIDA7IC8qbm90IHJlYWNoZWQqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlpfQVBJKGJ6UmVhZEdldFVudXNlZCkgCisgICAgICAgICAgICAgICAgICAgICAoIGludCogICAgYnplcnJvciwgCisgICAgICAgICAgICAgICAgICAgICAgIEJaRklMRSogYiwgCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgdW51c2VkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICBuVW51c2VkICkKK3sKKyAgIGJ6RmlsZSogYnpmID0gKGJ6RmlsZSopYjsKKyAgIGlmIChiemYgPT0gTlVMTCkKKyAgICAgIHsgQlpfU0VURVJSKEJaX1BBUkFNX0VSUk9SKTsgcmV0dXJuOyB9OworICAgaWYgKGJ6Zi0+bGFzdEVyciAhPSBCWl9TVFJFQU1fRU5EKQorICAgICAgeyBCWl9TRVRFUlIoQlpfU0VRVUVOQ0VfRVJST1IpOyByZXR1cm47IH07CisgICBpZiAodW51c2VkID09IE5VTEwgfHwgblVudXNlZCA9PSBOVUxMKQorICAgICAgeyBCWl9TRVRFUlIoQlpfUEFSQU1fRVJST1IpOyByZXR1cm47IH07CisKKyAgIEJaX1NFVEVSUihCWl9PSyk7CisgICAqblVudXNlZCA9IGJ6Zi0+c3RybS5hdmFpbF9pbjsKKyAgICp1bnVzZWQgPSBiemYtPnN0cm0ubmV4dF9pbjsKK30KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIE1pc2MgY29udmVuaWVuY2Ugc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiekJ1ZmZUb0J1ZmZDb21wcmVzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgKCBjaGFyKiAgICAgICAgIGRlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBkZXN0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICBzb3VyY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBzb3VyY2VMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGJsb2NrU2l6ZTEwMGssIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB2ZXJib3NpdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB3b3JrRmFjdG9yICkKK3sKKyAgIGJ6X3N0cmVhbSBzdHJtOworICAgaW50IHJldDsKKworICAgaWYgKGRlc3QgPT0gTlVMTCB8fCBkZXN0TGVuID09IE5VTEwgfHwgCisgICAgICAgc291cmNlID09IE5VTEwgfHwKKyAgICAgICBibG9ja1NpemUxMDBrIDwgMSB8fCBibG9ja1NpemUxMDBrID4gOSB8fAorICAgICAgIHZlcmJvc2l0eSA8IDAgfHwgdmVyYm9zaXR5ID4gNCB8fAorICAgICAgIHdvcmtGYWN0b3IgPCAwIHx8IHdvcmtGYWN0b3IgPiAyNTApIAorICAgICAgcmV0dXJuIEJaX1BBUkFNX0VSUk9SOworCisgICBpZiAod29ya0ZhY3RvciA9PSAwKSB3b3JrRmFjdG9yID0gMzA7CisgICBzdHJtLmJ6YWxsb2MgPSBOVUxMOworICAgc3RybS5iemZyZWUgPSBOVUxMOworICAgc3RybS5vcGFxdWUgPSBOVUxMOworICAgcmV0ID0gYnpDb21wcmVzc0luaXQgKCAmc3RybSwgYmxvY2tTaXplMTAwaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eSwgd29ya0ZhY3RvciApOworICAgaWYgKHJldCAhPSBCWl9PSykgcmV0dXJuIHJldDsKKworICAgc3RybS5uZXh0X2luID0gc291cmNlOworICAgc3RybS5uZXh0X291dCA9IGRlc3Q7CisgICBzdHJtLmF2YWlsX2luID0gc291cmNlTGVuOworICAgc3RybS5hdmFpbF9vdXQgPSAqZGVzdExlbjsKKworICAgcmV0ID0gYnpDb21wcmVzcyAoICZzdHJtLCBCWl9GSU5JU0ggKTsKKyAgIGlmIChyZXQgPT0gQlpfRklOSVNIX09LKSBnb3RvIG91dHB1dF9vdmVyZmxvdzsKKyAgIGlmIChyZXQgIT0gQlpfU1RSRUFNX0VORCkgZ290byBlcnJoYW5kbGVyOworCisgICAvKiBub3JtYWwgdGVybWluYXRpb24gKi8KKyAgICpkZXN0TGVuIC09IHN0cm0uYXZhaWxfb3V0OyAgIAorICAgYnpDb21wcmVzc0VuZCAoICZzdHJtICk7CisgICByZXR1cm4gQlpfT0s7CisKKyAgIG91dHB1dF9vdmVyZmxvdzoKKyAgIGJ6Q29tcHJlc3NFbmQgKCAmc3RybSApOworICAgcmV0dXJuIEJaX09VVEJVRkZfRlVMTDsKKworICAgZXJyaGFuZGxlcjoKKyAgIGJ6Q29tcHJlc3NFbmQgKCAmc3RybSApOworICAgcmV0dXJuIHJldDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6QnVmZlRvQnVmZkRlY29tcHJlc3MpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjaGFyKiAgICAgICAgIGRlc3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgc291cmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICBzb3VyY2VMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgc21hbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgdmVyYm9zaXR5ICkKK3sKKyAgIGJ6X3N0cmVhbSBzdHJtOworICAgaW50IHJldDsKKworICAgaWYgKGRlc3QgPT0gTlVMTCB8fCBkZXN0TGVuID09IE5VTEwgfHwgCisgICAgICAgc291cmNlID09IE5VTEwgfHwKKyAgICAgICAoc21hbGwgIT0gMCAmJiBzbWFsbCAhPSAxKSB8fAorICAgICAgIHZlcmJvc2l0eSA8IDAgfHwgdmVyYm9zaXR5ID4gNCkgCisgICAgICAgICAgcmV0dXJuIEJaX1BBUkFNX0VSUk9SOworCisgICBzdHJtLmJ6YWxsb2MgPSBOVUxMOworICAgc3RybS5iemZyZWUgPSBOVUxMOworICAgc3RybS5vcGFxdWUgPSBOVUxMOworICAgcmV0ID0gYnpEZWNvbXByZXNzSW5pdCAoICZzdHJtLCB2ZXJib3NpdHksIHNtYWxsICk7CisgICBpZiAocmV0ICE9IEJaX09LKSByZXR1cm4gcmV0OworCisgICBzdHJtLm5leHRfaW4gPSBzb3VyY2U7CisgICBzdHJtLm5leHRfb3V0ID0gZGVzdDsKKyAgIHN0cm0uYXZhaWxfaW4gPSBzb3VyY2VMZW47CisgICBzdHJtLmF2YWlsX291dCA9ICpkZXN0TGVuOworCisgICByZXQgPSBiekRlY29tcHJlc3MgKCAmc3RybSApOworICAgaWYgKHJldCA9PSBCWl9PSykgZ290byBvdXRwdXRfb3ZlcmZsb3dfb3JfZW9mOworICAgaWYgKHJldCAhPSBCWl9TVFJFQU1fRU5EKSBnb3RvIGVycmhhbmRsZXI7CisKKyAgIC8qIG5vcm1hbCB0ZXJtaW5hdGlvbiAqLworICAgKmRlc3RMZW4gLT0gc3RybS5hdmFpbF9vdXQ7CisgICBiekRlY29tcHJlc3NFbmQgKCAmc3RybSApOworICAgcmV0dXJuIEJaX09LOworCisgICBvdXRwdXRfb3ZlcmZsb3dfb3JfZW9mOgorICAgaWYgKHN0cm0uYXZhaWxfb3V0ID4gMCkgeworICAgICAgYnpEZWNvbXByZXNzRW5kICggJnN0cm0gKTsKKyAgICAgIHJldHVybiBCWl9VTkVYUEVDVEVEX0VPRjsKKyAgIH0gZWxzZSB7CisgICAgICBiekRlY29tcHJlc3NFbmQgKCAmc3RybSApOworICAgICAgcmV0dXJuIEJaX09VVEJVRkZfRlVMTDsKKyAgIH07ICAgICAgCisKKyAgIGVycmhhbmRsZXI6CisgICBiekRlY29tcHJlc3NFbmQgKCAmc3RybSApOworICAgcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0KKyAgIENvZGUgY29udHJpYnV0ZWQgYnkgWW9zaGlva2EgVHN1bmVvCisgICAoUVdGMDAxMzNAbmlmdHlzZXJ2ZS5vci5qcC90c3VuZW8teUBpcy5haXN0LW5hcmEuYWMuanApLAorICAgdG8gc3VwcG9ydCBiZXR0ZXIgemxpYiBjb21wYXRpYmlsaXR5LgorICAgVGhpcyBjb2RlIGlzIG5vdCBfb2ZmaWNpYWxseV8gcGFydCBvZiBsaWJiemlwMiAoeWV0KTsKKyAgIEkgaGF2ZW4ndCB0ZXN0ZWQgaXQsIGRvY3VtZW50ZWQgaXQsIG9yIGNvbnNpZGVyZWQgdGhlCisgICB0aHJlYWRpbmctc2FmZW5lc3Mgb2YgaXQuCisgICBJZiB0aGlzIGNvZGUgYnJlYWtzLCBwbGVhc2UgY29udGFjdCBib3RoIFlvc2hpb2thIGFuZCBtZS4KKy0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLQorICAgcmV0dXJuIHZlcnNpb24gbGlrZSAiMC45LjBjIi4KKy0tKi8KK2NvbnN0IGNoYXIgKiBCWl9BUEkoYnpsaWJWZXJzaW9uKSh2b2lkKQoreworICAgcmV0dXJuIEJaX1ZFUlNJT047Cit9CisKKworI2lmbmRlZiBCWl9OT19TVERJTworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKE1TRE9TKQorIyAgIGluY2x1ZGUgPGZjbnRsLmg+CisjICAgaW5jbHVkZSA8aW8uaD4KKyMgICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpIHNldG1vZGUoZmlsZW5vKGZpbGUpLE9fQklOQVJZKQorI2Vsc2UKKyMgICBkZWZpbmUgU0VUX0JJTkFSWV9NT0RFKGZpbGUpCisjZW5kaWYKK3N0YXRpYworQlpGSUxFICogYnpvcGVuX29yX2J6ZG9wZW4KKyAgICAgICAgICAgICAgICggY29uc3QgY2hhciAqcGF0aCwgICAvKiBubyB1c2Ugd2hlbiBiemRvcGVuICovCisgICAgICAgICAgICAgICAgIGludCBmZCwgICAgICAgICAgICAgLyogbm8gdXNlIHdoZW4gYnpkb3BlbiAqLworICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlLAorICAgICAgICAgICAgICAgICBpbnQgb3Blbl9tb2RlKSAgICAgIC8qIGJ6b3BlbjogMCwgYnpkb3BlbjoxICovCit7CisgICBpbnQgICAgYnplcnI7CisgICBjaGFyICAgdW51c2VkW0JaX01BWF9VTlVTRURdOworICAgaW50ICAgIGJsb2NrU2l6ZTEwMGsgPSA5OworICAgaW50ICAgIHdyaXRpbmcgICAgICAgPSAwOworICAgY2hhciAgIG1vZGUyWzEwXSAgICAgPSAiIjsKKyAgIEZJTEUgICAqZnAgICAgICAgICAgID0gTlVMTDsKKyAgIEJaRklMRSAqYnpmcCAgICAgICAgID0gTlVMTDsKKyAgIGludCAgICB2ZXJib3NpdHkgICAgID0gMDsKKyAgIGludCAgICB3b3JrRmFjdG9yICAgID0gMzA7CisgICBpbnQgICAgc21hbGxNb2RlICAgICA9IDA7CisgICBpbnQgICAgblVudXNlZCAgICAgICA9IDA7IAorCisgICBpZihtb2RlPT1OVUxMKXtyZXR1cm4gTlVMTDt9CisgICB3aGlsZSgqbW9kZSl7CisgICAgICBzd2l0Y2goKm1vZGUpeworICAgICAgY2FzZSAncic6CisgICAgICAgICB3cml0aW5nID0gMDticmVhazsKKyAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgd3JpdGluZyA9IDE7YnJlYWs7CisgICAgICBjYXNlICdzJzoKKyAgICAgICAgIHNtYWxsTW9kZSA9IDE7YnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICAgaWYoaXNkaWdpdCgqbW9kZSkpeworICAgICAgICAgICAgYmxvY2tTaXplMTAwayA9IDA7CisgICAgICAgICAgICB3aGlsZShpc2RpZ2l0KCptb2RlKSl7CisgICAgICAgICAgICAgICBibG9ja1NpemUxMDBrID0gYmxvY2tTaXplMTAwayoxMCArICptb2RlLScwJzsKKyAgICAgICAgICAgICAgIG1vZGUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgICB9CisgICAgICB9CisgICAgICBtb2RlKys7CisgICB9CisgICBzdHJjYXQobW9kZTIsIHdyaXRpbmcgPyAidyIgOiAiciIgKTsKKyAgIHN0cmNhdChtb2RlMiwiYiIpOyAgIC8qIGJpbmFyeSBtb2RlICovCisKKyAgIGlmKG9wZW5fbW9kZT09MCl7CisgICAgICBpZihwYXRoPT1OVUxMIHx8IHN0cmNtcChwYXRoLCIiKT09MCl7CisgICAgICAgIGZwID0gKHdyaXRpbmcgPyBzdGRvdXQgOiBzdGRpbik7CisgICAgICAgIFNFVF9CSU5BUllfTU9ERShmcCk7CisgICAgICB9ZWxzZXsKKyAgICAgICAgZnAgPSBmb3BlbihwYXRoLG1vZGUyKTsKKyAgICAgIH0KKyAgIH1lbHNleworI2lmZGVmIEJaX1NUUklDVF9BTlNJCisgICAgICBmcCA9IE5VTEw7CisjZWxzZQorICAgICAgZnAgPSBmZG9wZW4oZmQsbW9kZTIpOworI2VuZGlmCisgICB9CisgICBpZihmcD09TlVMTCl7cmV0dXJuIE5VTEw7fQorCisgICBpZih3cml0aW5nKXsKKyAgICAgIGJ6ZnAgPSBieldyaXRlT3BlbigmYnplcnIsZnAsYmxvY2tTaXplMTAwayx2ZXJib3NpdHksd29ya0ZhY3Rvcik7CisgICB9ZWxzZXsKKyAgICAgIGJ6ZnAgPSBielJlYWRPcGVuKCZiemVycixmcCx2ZXJib3NpdHksc21hbGxNb2RlLHVudXNlZCxuVW51c2VkKTsKKyAgIH0KKyAgIGlmKGJ6ZnA9PU5VTEwpeworICAgICAgaWYoZnAhPXN0ZGluICYmIGZwIT1zdGRvdXQpIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIHJldHVybiBiemZwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0KKyAgIG9wZW4gZmlsZSBmb3IgcmVhZCBvciB3cml0ZS4KKyAgICAgIGV4KSBiem9wZW4oImZpbGUiLCJ3OSIpCisgICAgICBjYXNlIHBhdGg9IiIgb3IgTlVMTCA9PiB1c2Ugc3RkaW4gb3Igc3Rkb3V0LgorLS0qLworQlpGSUxFICogQlpfQVBJKGJ6b3BlbikKKyAgICAgICAgICAgICAgICggY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZSApCit7CisgICByZXR1cm4gYnpvcGVuX29yX2J6ZG9wZW4ocGF0aCwtMSxtb2RlLC8qYnpvcGVuKi8wKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitCWkZJTEUgKiBCWl9BUEkoYnpkb3BlbikKKyAgICAgICAgICAgICAgICggaW50IGZkLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlICkKK3sKKyAgIHJldHVybiBiem9wZW5fb3JfYnpkb3BlbihOVUxMLGZkLG1vZGUsLypiemRvcGVuKi8xKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6cmVhZCkgKEJaRklMRSogYiwgdm9pZCogYnVmLCBpbnQgbGVuICkKK3sKKyAgIGludCBiemVyciwgbnJlYWQ7CisgICBpZiAoKChiekZpbGUqKWIpLT5sYXN0RXJyID09IEJaX1NUUkVBTV9FTkQpIHJldHVybiAwOworICAgbnJlYWQgPSBielJlYWQoJmJ6ZXJyLGIsYnVmLGxlbik7CisgICBpZiAoYnplcnIgPT0gQlpfT0sgfHwgYnplcnIgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgcmV0dXJuIG5yZWFkOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgQlpfQVBJKGJ6d3JpdGUpIChCWkZJTEUqIGIsIHZvaWQqIGJ1ZiwgaW50IGxlbiApCit7CisgICBpbnQgYnplcnI7CisKKyAgIGJ6V3JpdGUoJmJ6ZXJyLGIsYnVmLGxlbik7CisgICBpZihiemVyciA9PSBCWl9PSyl7CisgICAgICByZXR1cm4gbGVuOworICAgfWVsc2V7CisgICAgICByZXR1cm4gLTE7CisgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IEJaX0FQSShiemZsdXNoKSAoQlpGSUxFICpiKQoreworICAgLyogZG8gbm90aGluZyBub3cuLi4gKi8KKyAgIHJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlpfQVBJKGJ6Y2xvc2UpIChCWkZJTEUqIGIpCit7CisgICBpbnQgYnplcnI7CisgICBGSUxFICpmcCA9ICgoYnpGaWxlICopYiktPmhhbmRsZTsKKyAgIAorICAgaWYoYj09TlVMTCl7cmV0dXJuO30KKyAgIGlmKCgoYnpGaWxlKiliKS0+d3JpdGluZyl7CisgICAgICBieldyaXRlQ2xvc2UoJmJ6ZXJyLGIsMCxOVUxMLE5VTEwpOworICAgICAgaWYoYnplcnIgIT0gQlpfT0speworICAgICAgICAgYnpXcml0ZUNsb3NlKE5VTEwsYiwxLE5VTEwsTlVMTCk7CisgICAgICB9CisgICB9ZWxzZXsKKyAgICAgIGJ6UmVhZENsb3NlKCZiemVycixiKTsKKyAgIH0KKyAgIGlmKGZwIT1zdGRpbiAmJiBmcCE9c3Rkb3V0KXsKKyAgICAgIGZjbG9zZShmcCk7CisgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLQorICAgcmV0dXJuIGxhc3QgZXJyb3IgY29kZSAKKy0tKi8KK3N0YXRpYyBjaGFyICpiemVycm9yc3RyaW5nc1tdID0geworICAgICAgICJPSyIKKyAgICAgICwiU0VRVUVOQ0VfRVJST1IiCisgICAgICAsIlBBUkFNX0VSUk9SIgorICAgICAgLCJNRU1fRVJST1IiCisgICAgICAsIkRBVEFfRVJST1IiCisgICAgICAsIkRBVEFfRVJST1JfTUFHSUMiCisgICAgICAsIklPX0VSUk9SIgorICAgICAgLCJVTkVYUEVDVEVEX0VPRiIKKyAgICAgICwiT1VUQlVGRl9GVUxMIgorICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworICAgICAgLCI/Pz8iICAgLyogZm9yIGZ1dHVyZSAqLworfTsKKworCitjb25zdCBjaGFyICogQlpfQVBJKGJ6ZXJyb3IpIChCWkZJTEUgKmIsIGludCAqZXJybnVtKQoreworICAgaW50IGVyciA9ICgoYnpGaWxlICopYiktPmxhc3RFcnI7CisKKyAgIGlmKGVycj4wKSBlcnIgPSAwOworICAgKmVycm51bSA9IGVycjsKKyAgIHJldHVybiBiemVycm9yc3RyaW5nc1tlcnIqLTFdOworfQorI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYnpsaWIuaCBiL2J6bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2MjI3MwotLS0gL2Rldi9udWxsCisrKyBiL2J6bGliLmgKQEAgLTAsMCArMSwyOTkgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLQorICBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGJ6aXAyIGFuZC9vciBsaWJiemlwMiwgYSBwcm9ncmFtIGFuZAorICBsaWJyYXJ5IGZvciBsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCisgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEp1bGlhbiBSIFNld2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKyAgMy4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCisgIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICAgICBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTCisgIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgSnVsaWFuIFNld2FyZCwgR3VpbGRmb3JkLCBTdXJyZXksIFVLLgorICBqc2V3YXJkQGFjbS5vcmcKKyAgYnppcDIvbGliYnppcDIgdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4CisKKyAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIChhdCBsZWFzdCkgdGhlIHdvcmsgb2Y6CisgICAgIE1pa2UgQnVycm93cworICAgICBEYXZpZCBXaGVlbGVyCisgICAgIFBldGVyIEZlbndpY2sKKyAgICAgQWxpc3RhaXIgTW9mZmF0CisgICAgIFJhZGZvcmQgTmVhbAorICAgICBJYW4gSC4gV2l0dGVuCisgICAgIFJvYmVydCBTZWRnZXdpY2sKKyAgICAgSm9uIEwuIEJlbnRsZXkKKworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KKy0tKi8KKworCisjaWZuZGVmIF9CWkxJQl9ICisjZGVmaW5lIF9CWkxJQl9ICisKKyNkZWZpbmUgQlpfUlVOICAgICAgICAgICAgICAgMAorI2RlZmluZSBCWl9GTFVTSCAgICAgICAgICAgICAxCisjZGVmaW5lIEJaX0ZJTklTSCAgICAgICAgICAgIDIKKworI2RlZmluZSBCWl9PSyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJaX1JVTl9PSyAgICAgICAgICAgIDEKKyNkZWZpbmUgQlpfRkxVU0hfT0sgICAgICAgICAgMgorI2RlZmluZSBCWl9GSU5JU0hfT0sgICAgICAgICAzCisjZGVmaW5lIEJaX1NUUkVBTV9FTkQgICAgICAgIDQKKyNkZWZpbmUgQlpfU0VRVUVOQ0VfRVJST1IgICAgKC0xKQorI2RlZmluZSBCWl9QQVJBTV9FUlJPUiAgICAgICAoLTIpCisjZGVmaW5lIEJaX01FTV9FUlJPUiAgICAgICAgICgtMykKKyNkZWZpbmUgQlpfREFUQV9FUlJPUiAgICAgICAgKC00KQorI2RlZmluZSBCWl9EQVRBX0VSUk9SX01BR0lDICAoLTUpCisjZGVmaW5lIEJaX0lPX0VSUk9SICAgICAgICAgICgtNikKKyNkZWZpbmUgQlpfVU5FWFBFQ1RFRF9FT0YgICAgKC03KQorI2RlZmluZSBCWl9PVVRCVUZGX0ZVTEwgICAgICAoLTgpCisKK3R5cGVkZWYgCisgICBzdHJ1Y3QgeworICAgICAgY2hhciAqbmV4dF9pbjsKKyAgICAgIHVuc2lnbmVkIGludCBhdmFpbF9pbjsKKyAgICAgIHVuc2lnbmVkIGludCB0b3RhbF9pbjsKKworICAgICAgY2hhciAqbmV4dF9vdXQ7CisgICAgICB1bnNpZ25lZCBpbnQgYXZhaWxfb3V0OworICAgICAgdW5zaWduZWQgaW50IHRvdGFsX291dDsKKworICAgICAgdm9pZCAqc3RhdGU7CisKKyAgICAgIHZvaWQgKigqYnphbGxvYykodm9pZCAqLGludCxpbnQpOworICAgICAgdm9pZCAoKmJ6ZnJlZSkodm9pZCAqLHZvaWQgKik7CisgICAgICB2b2lkICpvcGFxdWU7CisgICB9IAorICAgYnpfc3RyZWFtOworCisKKyNpZm5kZWYgQlpfSU1QT1JUCisjZGVmaW5lIEJaX0VYUE9SVAorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyMgICBpbmNsdWRlIDxzdGRpby5oPgorIyAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgICBpZmRlZiBzbWFsbAorICAgICAgLyogd2luZG93cy5oIGRlZmluZSBzbWFsbCB0byBjaGFyICovCisjICAgICAgdW5kZWYgc21hbGwKKyMgICBlbmRpZgorIyAgIGlmZGVmIEJaX0VYUE9SVAorIyAgIGRlZmluZSBCWl9BUEkoZnVuYykgV0lOQVBJIGZ1bmMKKyMgICBkZWZpbmUgQlpfRVhURVJOIGV4dGVybgorIyAgIGVsc2UKKyAgIC8qIGltcG9ydCB3aW5kb3dzIGRsbCBkeW5hbWljYWxseSAqLworIyAgIGRlZmluZSBCWl9BUEkoZnVuYykgKFdJTkFQSSAqIGZ1bmMpCisjICAgZGVmaW5lIEJaX0VYVEVSTgorIyAgIGVuZGlmCisjZWxzZQorIyAgIGRlZmluZSBCWl9BUEkoZnVuYykgZnVuYworIyAgIGRlZmluZSBCWl9FWFRFUk4gZXh0ZXJuCisjZW5kaWYKKworCisvKi0tIENvcmUgKGxvdy1sZXZlbCkgbGlicmFyeSBmdW5jdGlvbnMgLS0qLworCitCWl9FWFRFUk4gaW50IEJaX0FQSShiekNvbXByZXNzSW5pdCkgKCAKKyAgICAgIGJ6X3N0cmVhbSogc3RybSwgCisgICAgICBpbnQgICAgICAgIGJsb2NrU2l6ZTEwMGssIAorICAgICAgaW50ICAgICAgICB2ZXJib3NpdHksIAorICAgICAgaW50ICAgICAgICB3b3JrRmFjdG9yIAorICAgKTsKKworQlpfRVhURVJOIGludCBCWl9BUEkoYnpDb21wcmVzcykgKCAKKyAgICAgIGJ6X3N0cmVhbSogc3RybSwgCisgICAgICBpbnQgYWN0aW9uIAorICAgKTsKKworQlpfRVhURVJOIGludCBCWl9BUEkoYnpDb21wcmVzc0VuZCkgKCAKKyAgICAgIGJ6X3N0cmVhbSogc3RybSAKKyAgICk7CisKK0JaX0VYVEVSTiBpbnQgQlpfQVBJKGJ6RGVjb21wcmVzc0luaXQpICggCisgICAgICBiel9zdHJlYW0gKnN0cm0sIAorICAgICAgaW50ICAgICAgIHZlcmJvc2l0eSwgCisgICAgICBpbnQgICAgICAgc21hbGwKKyAgICk7CisKK0JaX0VYVEVSTiBpbnQgQlpfQVBJKGJ6RGVjb21wcmVzcykgKCAKKyAgICAgIGJ6X3N0cmVhbSogc3RybSAKKyAgICk7CisKK0JaX0VYVEVSTiBpbnQgQlpfQVBJKGJ6RGVjb21wcmVzc0VuZCkgKCAKKyAgICAgIGJ6X3N0cmVhbSAqc3RybSAKKyAgICk7CisKKworCisvKi0tIEhpZ2goZXIpIGxldmVsIGxpYnJhcnkgZnVuY3Rpb25zIC0tKi8KKworI2lmbmRlZiBCWl9OT19TVERJTworI2RlZmluZSBCWl9NQVhfVU5VU0VEIDUwMDAKKwordHlwZWRlZiB2b2lkIEJaRklMRTsKKworQlpfRVhURVJOIEJaRklMRSogQlpfQVBJKGJ6UmVhZE9wZW4pICggCisgICAgICBpbnQqICBiemVycm9yLCAgIAorICAgICAgRklMRSogZiwgCisgICAgICBpbnQgICB2ZXJib3NpdHksIAorICAgICAgaW50ICAgc21hbGwsCisgICAgICB2b2lkKiB1bnVzZWQsICAgIAorICAgICAgaW50ICAgblVudXNlZCAKKyAgICk7CisKK0JaX0VYVEVSTiB2b2lkIEJaX0FQSShielJlYWRDbG9zZSkgKCAKKyAgICAgIGludCogICAgYnplcnJvciwgCisgICAgICBCWkZJTEUqIGIgCisgICApOworCitCWl9FWFRFUk4gdm9pZCBCWl9BUEkoYnpSZWFkR2V0VW51c2VkKSAoIAorICAgICAgaW50KiAgICBiemVycm9yLCAKKyAgICAgIEJaRklMRSogYiwgCisgICAgICB2b2lkKiogIHVudXNlZCwgIAorICAgICAgaW50KiAgICBuVW51c2VkIAorICAgKTsKKworQlpfRVhURVJOIGludCBCWl9BUEkoYnpSZWFkKSAoIAorICAgICAgaW50KiAgICBiemVycm9yLCAKKyAgICAgIEJaRklMRSogYiwgCisgICAgICB2b2lkKiAgIGJ1ZiwgCisgICAgICBpbnQgICAgIGxlbiAKKyAgICk7CisKK0JaX0VYVEVSTiBCWkZJTEUqIEJaX0FQSShieldyaXRlT3BlbikgKCAKKyAgICAgIGludCogIGJ6ZXJyb3IsICAgICAgCisgICAgICBGSUxFKiBmLCAKKyAgICAgIGludCAgIGJsb2NrU2l6ZTEwMGssIAorICAgICAgaW50ICAgdmVyYm9zaXR5LCAKKyAgICAgIGludCAgIHdvcmtGYWN0b3IgCisgICApOworCitCWl9FWFRFUk4gdm9pZCBCWl9BUEkoYnpXcml0ZSkgKCAKKyAgICAgIGludCogICAgYnplcnJvciwgCisgICAgICBCWkZJTEUqIGIsIAorICAgICAgdm9pZCogICBidWYsIAorICAgICAgaW50ICAgICBsZW4gCisgICApOworCitCWl9FWFRFUk4gdm9pZCBCWl9BUEkoYnpXcml0ZUNsb3NlKSAoIAorICAgICAgaW50KiAgICAgICAgICBiemVycm9yLCAKKyAgICAgIEJaRklMRSogICAgICAgYiwgCisgICAgICBpbnQgICAgICAgICAgIGFiYW5kb24sIAorICAgICAgdW5zaWduZWQgaW50KiBuYnl0ZXNfaW4sIAorICAgICAgdW5zaWduZWQgaW50KiBuYnl0ZXNfb3V0IAorICAgKTsKKyNlbmRpZgorCisKKy8qLS0gVXRpbGl0eSBmdW5jdGlvbnMgLS0qLworCitCWl9FWFRFUk4gaW50IEJaX0FQSShiekJ1ZmZUb0J1ZmZDb21wcmVzcykgKCAKKyAgICAgIGNoYXIqICAgICAgICAgZGVzdCwgCisgICAgICB1bnNpZ25lZCBpbnQqIGRlc3RMZW4sCisgICAgICBjaGFyKiAgICAgICAgIHNvdXJjZSwgCisgICAgICB1bnNpZ25lZCBpbnQgIHNvdXJjZUxlbiwKKyAgICAgIGludCAgICAgICAgICAgYmxvY2tTaXplMTAwaywgCisgICAgICBpbnQgICAgICAgICAgIHZlcmJvc2l0eSwgCisgICAgICBpbnQgICAgICAgICAgIHdvcmtGYWN0b3IgCisgICApOworCitCWl9FWFRFUk4gaW50IEJaX0FQSShiekJ1ZmZUb0J1ZmZEZWNvbXByZXNzKSAoIAorICAgICAgY2hhciogICAgICAgICBkZXN0LCAKKyAgICAgIHVuc2lnbmVkIGludCogZGVzdExlbiwKKyAgICAgIGNoYXIqICAgICAgICAgc291cmNlLCAKKyAgICAgIHVuc2lnbmVkIGludCAgc291cmNlTGVuLAorICAgICAgaW50ICAgICAgICAgICBzbWFsbCwgCisgICAgICBpbnQgICAgICAgICAgIHZlcmJvc2l0eSAKKyAgICk7CisKKworLyotLQorICAgQ29kZSBjb250cmlidXRlZCBieSBZb3NoaW9rYSBUc3VuZW8KKyAgIChRV0YwMDEzM0BuaWZ0eXNlcnZlLm9yLmpwL3RzdW5lby15QGlzLmFpc3QtbmFyYS5hYy5qcCksCisgICB0byBzdXBwb3J0IGJldHRlciB6bGliIGNvbXBhdGliaWxpdHkuCisgICBUaGlzIGNvZGUgaXMgbm90IF9vZmZpY2lhbGx5XyBwYXJ0IG9mIGxpYmJ6aXAyICh5ZXQpOworICAgSSBoYXZlbid0IHRlc3RlZCBpdCwgZG9jdW1lbnRlZCBpdCwgb3IgY29uc2lkZXJlZCB0aGUKKyAgIHRocmVhZGluZy1zYWZlbmVzcyBvZiBpdC4KKyAgIElmIHRoaXMgY29kZSBicmVha3MsIHBsZWFzZSBjb250YWN0IGJvdGggWW9zaGlva2EgYW5kIG1lLgorLS0qLworCitCWl9FWFRFUk4gY29uc3QgY2hhciAqIEJaX0FQSShiemxpYlZlcnNpb24pICgKKyAgICAgIHZvaWQKKyAgICk7CisKKyNpZm5kZWYgQlpfTk9fU1RESU8KK0JaX0VYVEVSTiBCWkZJTEUgKiBCWl9BUEkoYnpvcGVuKSAoCisgICAgICBjb25zdCBjaGFyICpwYXRoLAorICAgICAgY29uc3QgY2hhciAqbW9kZQorICAgKTsKKworQlpfRVhURVJOIEJaRklMRSAqIEJaX0FQSShiemRvcGVuKSAoCisgICAgICBpbnQgICAgICAgIGZkLAorICAgICAgY29uc3QgY2hhciAqbW9kZQorICAgKTsKKyAgICAgICAgIAorQlpfRVhURVJOIGludCBCWl9BUEkoYnpyZWFkKSAoCisgICAgICBCWkZJTEUqIGIsIAorICAgICAgdm9pZCogYnVmLCAKKyAgICAgIGludCBsZW4gCisgICApOworCitCWl9FWFRFUk4gaW50IEJaX0FQSShiendyaXRlKSAoCisgICAgICBCWkZJTEUqIGIsIAorICAgICAgdm9pZCogICBidWYsIAorICAgICAgaW50ICAgICBsZW4gCisgICApOworCitCWl9FWFRFUk4gaW50IEJaX0FQSShiemZsdXNoKSAoCisgICAgICBCWkZJTEUqIGIKKyAgICk7CisKK0JaX0VYVEVSTiB2b2lkIEJaX0FQSShiemNsb3NlKSAoCisgICAgICBCWkZJTEUqIGIKKyAgICk7CisKK0JaX0VYVEVSTiBjb25zdCBjaGFyICogQlpfQVBJKGJ6ZXJyb3IpICgKKyAgICAgIEJaRklMRSAqYiwgCisgICAgICBpbnQgICAgKmVycm51bQorICAgKTsKKyNlbmRpZgorCisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliLmggLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9iemxpYl9wcml2YXRlLmggYi9iemxpYl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NGFlZgotLS0gL2Rldi9udWxsCisrKyBiL2J6bGliX3ByaXZhdGUuaApAQCAtMCwwICsxLDUyMyBAQAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gUHJpdmF0ZSBoZWFkZXIgZmlsZSBmb3IgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWJfcHJpdmF0ZS5oIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tCisgIFRoaXMgZmlsZSBpcyBhIHBhcnQgb2YgYnppcDIgYW5kL29yIGxpYmJ6aXAyLCBhIHByb2dyYW0gYW5kCisgIGxpYnJhcnkgZm9yIGxvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKKyAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgIDIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3QgCisgICAgIG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuICBJZiB5b3UgdXNlIHRoaXMgCisgICAgIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgCisgICAgIGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKworICAzLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICAgIG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisKKyAgNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICAgIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICBKdWxpYW4gU2V3YXJkLCBHdWlsZGZvcmQsIFN1cnJleSwgVUsuCisgIGpzZXdhcmRAYWNtLm9yZworICBiemlwMi9saWJiemlwMiB2ZXJzaW9uIDAuOS4wYyBvZiAxOCBPY3RvYmVyIDE5OTgKKworICBUaGlzIHByb2dyYW0gaXMgYmFzZWQgb24gKGF0IGxlYXN0KSB0aGUgd29yayBvZjoKKyAgICAgTWlrZSBCdXJyb3dzCisgICAgIERhdmlkIFdoZWVsZXIKKyAgICAgUGV0ZXIgRmVud2ljaworICAgICBBbGlzdGFpciBNb2ZmYXQKKyAgICAgUmFkZm9yZCBOZWFsCisgICAgIElhbiBILiBXaXR0ZW4KKyAgICAgUm9iZXJ0IFNlZGdld2ljaworICAgICBKb24gTC4gQmVudGxleQorCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNvdXJjZXMsIHNlZSB0aGUgbWFudWFsLgorLS0qLworCisKKyNpZm5kZWYgX0JaTElCX1BSSVZBVEVfSAorI2RlZmluZSBfQlpMSUJfUFJJVkFURV9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmbmRlZiBCWl9OT19TVERJTworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiYnpsaWIuaCIKKworCisKKy8qLS0gR2VuZXJhbCBzdHVmZi4gLS0qLworCisjZGVmaW5lIEJaX1ZFUlNJT04gICIwLjkuMGMiCisKK3R5cGVkZWYgY2hhciAgICAgICAgICAgIENoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCb29sOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgVUNoYXI7Cit0eXBlZGVmIGludCAgICAgICAgICAgICBJbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJbnQzMjsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgIEludDE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVUludDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIFRydWUgICgoQm9vbCkxKQorI2RlZmluZSBGYWxzZSAoKEJvb2wpMCkKKworI2lmbmRlZiBfX0dOVUNfXworI2RlZmluZSBfX2lubGluZV9fICAvKiAqLworI2VuZGlmIAorCisjaWZuZGVmIEJaX05PX1NURElPCitleHRlcm4gdm9pZCBiel9fQXNzZXJ0SF9fZmFpbCAoIGludCBlcnJjb2RlICk7CisjZGVmaW5lIEFzc2VydEgoY29uZCxlcnJjb2RlKSBcCisgICB7IGlmICghKGNvbmQpKSBiel9fQXNzZXJ0SF9fZmFpbCAoIGVycmNvZGUgKTsgfQorI2lmIEJaX0RFQlVHCisjZGVmaW5lIEFzc2VydEQoY29uZCxtc2cpIFwKKyAgIHsgaWYgKCEoY29uZCkpIHsgICAgICAgXAorICAgICAgZnByaW50ZiAoIHN0ZGVyciwgICBcCisgICAgICAgICJcblxubGliYnppcDIoZGVidWcgYnVpbGQpOiBpbnRlcm5hbCBlcnJvclxuXHQlc1xuIiwgbXNnICk7XAorICAgICAgZXhpdCgxKTsgXAorICAgfX0KKyNlbHNlCisjZGVmaW5lIEFzc2VydEQoY29uZCxtc2cpIC8qICovCisjZW5kaWYKKyNkZWZpbmUgVlByaW50ZjAoemYpIFwKKyAgIGZwcmludGYoc3RkZXJyLHpmKQorI2RlZmluZSBWUHJpbnRmMSh6Zix6YTEpIFwKKyAgIGZwcmludGYoc3RkZXJyLHpmLHphMSkKKyNkZWZpbmUgVlByaW50ZjIoemYsemExLHphMikgXAorICAgZnByaW50ZihzdGRlcnIsemYsemExLHphMikKKyNkZWZpbmUgVlByaW50ZjMoemYsemExLHphMix6YTMpIFwKKyAgIGZwcmludGYoc3RkZXJyLHpmLHphMSx6YTIsemEzKQorI2RlZmluZSBWUHJpbnRmNCh6Zix6YTEsemEyLHphMyx6YTQpIFwKKyAgIGZwcmludGYoc3RkZXJyLHpmLHphMSx6YTIsemEzLHphNCkKKyNkZWZpbmUgVlByaW50ZjUoemYsemExLHphMix6YTMsemE0LHphNSkgXAorICAgZnByaW50ZihzdGRlcnIsemYsemExLHphMix6YTMsemE0LHphNSkKKyNlbHNlCitleHRlcm4gdm9pZCBiel9pbnRlcm5hbF9lcnJvciAoIGludCBlcnJjb2RlICk7CisjZGVmaW5lIEFzc2VydEgoY29uZCxlcnJjb2RlKSBcCisgICB7IGlmICghKGNvbmQpKSBiel9pbnRlcm5hbF9lcnJvciAoIGVycmNvZGUgKTsgfQorI2RlZmluZSBBc3NlcnREKGNvbmQsbXNnKSAvKiAqLworI2RlZmluZSBWUHJpbnRmMCh6ZikgLyogKi8KKyNkZWZpbmUgVlByaW50ZjEoemYsemExKSAvKiAqLworI2RlZmluZSBWUHJpbnRmMih6Zix6YTEsemEyKSAvKiAqLworI2RlZmluZSBWUHJpbnRmMyh6Zix6YTEsemEyLHphMykgLyogKi8KKyNkZWZpbmUgVlByaW50ZjQoemYsemExLHphMix6YTMsemE0KSAvKiAqLworI2RlZmluZSBWUHJpbnRmNSh6Zix6YTEsemEyLHphMyx6YTQsemE1KSAvKiAqLworI2VuZGlmCisKKworI2RlZmluZSBCWkFMTE9DKG5ubikgKHN0cm0tPmJ6YWxsb2MpKHN0cm0tPm9wYXF1ZSwobm5uKSwxKQorI2RlZmluZSBCWkZSRUUocHBwKSAgKHN0cm0tPmJ6ZnJlZSkoc3RybS0+b3BhcXVlLChwcHApKQorCisKKy8qLS0gQ29uc3RhbnRzIGZvciB0aGUgYmFjayBlbmQuIC0tKi8KKworI2RlZmluZSBCWl9NQVhfQUxQSEFfU0laRSAyNTgKKyNkZWZpbmUgQlpfTUFYX0NPREVfTEVOICAgIDIzCisKKyNkZWZpbmUgQlpfUlVOQSAwCisjZGVmaW5lIEJaX1JVTkIgMQorCisjZGVmaW5lIEJaX05fR1JPVVBTIDYKKyNkZWZpbmUgQlpfR19TSVpFICAgNTAKKyNkZWZpbmUgQlpfTl9JVEVSUyAgNAorCisjZGVmaW5lIEJaX01BWF9TRUxFQ1RPUlMgKDIgKyAoOTAwMDAwIC8gQlpfR19TSVpFKSkKKworCisKKy8qLS0gU3R1ZmYgZm9yIHJhbmRvbWlzaW5nIHJlcGV0aXRpdmUgYmxvY2tzLiAtLSovCisKK2V4dGVybiBJbnQzMiByTnVtc1s1MTJdOworCisjZGVmaW5lIEJaX1JBTkRfREVDTFMgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEludDMyIHJOVG9HbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgSW50MzIgclRQb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgQlpfUkFORF9JTklUX01BU0sgICAgICAgICAgICAgICAgICAgICAgXAorICAgcy0+ck5Ub0dvID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzLT5yVFBvcyAgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBCWl9SQU5EX01BU0sgKChzLT5yTlRvR28gPT0gMSkgPyAxIDogMCkKKworI2RlZmluZSBCWl9SQU5EX1VQRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICBcCisgICBpZiAocy0+ck5Ub0dvID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHMtPnJOVG9HbyA9IHJOdW1zW3MtPnJUUG9zXTsgICAgICAgICAgICAgXAorICAgICAgcy0+clRQb3MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocy0+clRQb3MgPT0gNTEyKSBzLT5yVFBvcyA9IDA7ICAgICAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgcy0+ck5Ub0dvLS07CisKKworCisvKi0tIFN0dWZmIGZvciBkb2luZyBDUkNzLiAtLSovCisKK2V4dGVybiBVSW50MzIgY3JjMzJUYWJsZVsyNTZdOworCisjZGVmaW5lIEJaX0lOSVRJQUxJU0VfQ1JDKGNyY1ZhcikgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgY3JjVmFyID0gMHhmZmZmZmZmZkw7ICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQlpfRklOQUxJU0VfQ1JDKGNyY1ZhcikgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBjcmNWYXIgPSB+KGNyY1Zhcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBCWl9VUERBVEVfQ1JDKGNyY1ZhcixjaGEpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGNyY1ZhciA9IChjcmNWYXIgPDwgOCkgXiAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY3JjMzJUYWJsZVsoY3JjVmFyID4+IDI0KSBeICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICgoVUNoYXIpY2hhKV07ICAgICAgICAgIFwKK30KKworCisKKy8qLS0gU3RhdGVzIGFuZCBtb2RlcyBmb3IgY29tcHJlc3Npb24uIC0tKi8KKworI2RlZmluZSBCWl9NX0lETEUgICAgICAxCisjZGVmaW5lIEJaX01fUlVOTklORyAgIDIKKyNkZWZpbmUgQlpfTV9GTFVTSElORyAgMworI2RlZmluZSBCWl9NX0ZJTklTSElORyA0CisKKyNkZWZpbmUgQlpfU19PVVRQVVQgICAgMQorI2RlZmluZSBCWl9TX0lOUFVUICAgICAyCisKKyNkZWZpbmUgQlpfTlVNX09WRVJTSE9PVF9CWVRFUyAyMAorCisKKworLyotLSBTdHJ1Y3R1cmUgaG9sZGluZyBhbGwgdGhlIGNvbXByZXNzaW9uLXNpZGUgc3R1ZmYuIC0tKi8KKwordHlwZWRlZgorICAgc3RydWN0IHsKKyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGJ6X3N0cmVhbSAqLworICAgICAgYnpfc3RyZWFtKiBzdHJtOworCisgICAgICAvKiBtb2RlIHRoaXMgc3RyZWFtIGlzIGluLCBhbmQgd2hldGhlciBpbnB1dHRpbmcgKi8KKyAgICAgIC8qIG9yIG91dHB1dHRpbmcgZGF0YSAqLworICAgICAgSW50MzIgICAgbW9kZTsKKyAgICAgIEludDMyICAgIHN0YXRlOworCisgICAgICAvKiByZW1lbWJlcnMgYXZhaWxfaW4gd2hlbiBmbHVzaC9maW5pc2ggcmVxdWVzdGVkICovCisgICAgICBVSW50MzIgICBhdmFpbF9pbl9leHBlY3Q7CisKKyAgICAgIC8qIGZvciBkb2luZyB0aGUgYmxvY2sgc29ydGluZyAqLworICAgICAgVUNoYXIqICAgYmxvY2s7CisgICAgICBVSW50MTYqICBxdWFkcmFudDsKKyAgICAgIFVJbnQzMiogIHpwdHI7CisgICAgICBVSW50MTYqICBzenB0cjsKKyAgICAgIEludDMyKiAgIGZ0YWI7CisgICAgICBJbnQzMiAgICB3b3JrRG9uZTsKKyAgICAgIEludDMyICAgIHdvcmtMaW1pdDsKKyAgICAgIEludDMyICAgIHdvcmtGYWN0b3I7CisgICAgICBCb29sICAgICBmaXJzdEF0dGVtcHQ7CisgICAgICBCb29sICAgICBibG9ja1JhbmRvbWlzZWQ7CisgICAgICBJbnQzMiAgICBvcmlnUHRyOworCisgICAgICAvKiBydW4tbGVuZ3RoLWVuY29kaW5nIG9mIHRoZSBpbnB1dCAqLworICAgICAgVUludDMyICAgc3RhdGVfaW5fY2g7CisgICAgICBJbnQzMiAgICBzdGF0ZV9pbl9sZW47CisgICAgICBCWl9SQU5EX0RFQ0xTOworCisgICAgICAvKiBpbnB1dCBhbmQgb3V0cHV0IGxpbWl0cyBhbmQgY3VycmVudCBwb3NucyAqLworICAgICAgSW50MzIgICAgbmJsb2NrOworICAgICAgSW50MzIgICAgbmJsb2NrTUFYOworICAgICAgSW50MzIgICAgbnVtWjsKKyAgICAgIEludDMyICAgIHN0YXRlX291dF9wb3M7CisKKyAgICAgIC8qIG1hcCBvZiBieXRlcyB1c2VkIGluIGJsb2NrICovCisgICAgICBJbnQzMiAgICBuSW5Vc2U7CisgICAgICBCb29sICAgICBpblVzZVsyNTZdOworICAgICAgVUNoYXIgICAgdW5zZXFUb1NlcVsyNTZdOworCisgICAgICAvKiB0aGUgYnVmZmVyIGZvciBiaXQgc3RyZWFtIGNyZWF0aW9uICovCisgICAgICBVSW50MzIgICBic0J1ZmY7CisgICAgICBJbnQzMiAgICBic0xpdmU7CisKKyAgICAgIC8qIGJsb2NrIGFuZCBjb21iaW5lZCBDUkNzICovCisgICAgICBVSW50MzIgICBibG9ja0NSQzsKKyAgICAgIFVJbnQzMiAgIGNvbWJpbmVkQ1JDOworCisgICAgICAvKiBtaXNjIGFkbWluaXN0cmF0aXVtICovCisgICAgICBJbnQzMiAgICB2ZXJib3NpdHk7CisgICAgICBJbnQzMiAgICBibG9ja05vOworICAgICAgSW50MzIgICAgbkJsb2Nrc1JhbmRvbWlzZWQ7CisgICAgICBJbnQzMiAgICBibG9ja1NpemUxMDBrOworCisgICAgICAvKiBzdHVmZiBmb3IgY29kaW5nIHRoZSBNVEYgdmFsdWVzICovCisgICAgICBJbnQzMiAgICBuTVRGOworICAgICAgSW50MzIgICAgbXRmRnJlcSAgICBbQlpfTUFYX0FMUEhBX1NJWkVdOworICAgICAgVUNoYXIgICAgc2VsZWN0b3IgICBbQlpfTUFYX1NFTEVDVE9SU107CisgICAgICBVQ2hhciAgICBzZWxlY3Rvck10ZltCWl9NQVhfU0VMRUNUT1JTXTsKKworICAgICAgVUNoYXIgICAgbGVuICBbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKyAgICAgIEludDMyICAgIGNvZGUgW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisgICAgICBJbnQzMiAgICByZnJlcVtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCisgICB9CisgICBFU3RhdGU7CisKKworCisvKi0tIGV4dGVybnMgZm9yIGNvbXByZXNzaW9uLiAtLSovCisKK2V4dGVybiB2b2lkIAorYmxvY2tTb3J0ICggRVN0YXRlKiApOworCitleHRlcm4gdm9pZCAKK2NvbXByZXNzQmxvY2sgKCBFU3RhdGUqLCBCb29sICk7CisKK2V4dGVybiB2b2lkIAorYnNJbml0V3JpdGUgKCBFU3RhdGUqICk7CisKK2V4dGVybiB2b2lkIAoraGJBc3NpZ25Db2RlcyAoIEludDMyKiwgVUNoYXIqLCBJbnQzMiwgSW50MzIsIEludDMyICk7CisKK2V4dGVybiB2b2lkIAoraGJNYWtlQ29kZUxlbmd0aHMgKCBVQ2hhciosIEludDMyKiwgSW50MzIsIEludDMyICk7CisKKworCisvKi0tIHN0YXRlcyBmb3IgZGVjb21wcmVzc2lvbi4gLS0qLworCisjZGVmaW5lIEJaX1hfSURMRSAgICAgICAgMQorI2RlZmluZSBCWl9YX09VVFBVVCAgICAgIDIKKworI2RlZmluZSBCWl9YX01BR0lDXzEgICAgIDEwCisjZGVmaW5lIEJaX1hfTUFHSUNfMiAgICAgMTEKKyNkZWZpbmUgQlpfWF9NQUdJQ18zICAgICAxMgorI2RlZmluZSBCWl9YX01BR0lDXzQgICAgIDEzCisjZGVmaW5lIEJaX1hfQkxLSERSXzEgICAgMTQKKyNkZWZpbmUgQlpfWF9CTEtIRFJfMiAgICAxNQorI2RlZmluZSBCWl9YX0JMS0hEUl8zICAgIDE2CisjZGVmaW5lIEJaX1hfQkxLSERSXzQgICAgMTcKKyNkZWZpbmUgQlpfWF9CTEtIRFJfNSAgICAxOAorI2RlZmluZSBCWl9YX0JMS0hEUl82ICAgIDE5CisjZGVmaW5lIEJaX1hfQkNSQ18xICAgICAgMjAKKyNkZWZpbmUgQlpfWF9CQ1JDXzIgICAgICAyMQorI2RlZmluZSBCWl9YX0JDUkNfMyAgICAgIDIyCisjZGVmaW5lIEJaX1hfQkNSQ180ICAgICAgMjMKKyNkZWZpbmUgQlpfWF9SQU5EQklUICAgICAyNAorI2RlZmluZSBCWl9YX09SSUdQVFJfMSAgIDI1CisjZGVmaW5lIEJaX1hfT1JJR1BUUl8yICAgMjYKKyNkZWZpbmUgQlpfWF9PUklHUFRSXzMgICAyNworI2RlZmluZSBCWl9YX01BUFBJTkdfMSAgIDI4CisjZGVmaW5lIEJaX1hfTUFQUElOR18yICAgMjkKKyNkZWZpbmUgQlpfWF9TRUxFQ1RPUl8xICAzMAorI2RlZmluZSBCWl9YX1NFTEVDVE9SXzIgIDMxCisjZGVmaW5lIEJaX1hfU0VMRUNUT1JfMyAgMzIKKyNkZWZpbmUgQlpfWF9DT0RJTkdfMSAgICAzMworI2RlZmluZSBCWl9YX0NPRElOR18yICAgIDM0CisjZGVmaW5lIEJaX1hfQ09ESU5HXzMgICAgMzUKKyNkZWZpbmUgQlpfWF9NVEZfMSAgICAgICAzNgorI2RlZmluZSBCWl9YX01URl8yICAgICAgIDM3CisjZGVmaW5lIEJaX1hfTVRGXzMgICAgICAgMzgKKyNkZWZpbmUgQlpfWF9NVEZfNCAgICAgICAzOQorI2RlZmluZSBCWl9YX01URl81ICAgICAgIDQwCisjZGVmaW5lIEJaX1hfTVRGXzYgICAgICAgNDEKKyNkZWZpbmUgQlpfWF9FTkRIRFJfMiAgICA0MgorI2RlZmluZSBCWl9YX0VOREhEUl8zICAgIDQzCisjZGVmaW5lIEJaX1hfRU5ESERSXzQgICAgNDQKKyNkZWZpbmUgQlpfWF9FTkRIRFJfNSAgICA0NQorI2RlZmluZSBCWl9YX0VOREhEUl82ICAgIDQ2CisjZGVmaW5lIEJaX1hfQ0NSQ18xICAgICAgNDcKKyNkZWZpbmUgQlpfWF9DQ1JDXzIgICAgICA0OAorI2RlZmluZSBCWl9YX0NDUkNfMyAgICAgIDQ5CisjZGVmaW5lIEJaX1hfQ0NSQ180ICAgICAgNTAKKworCisKKy8qLS0gQ29uc3RhbnRzIGZvciB0aGUgZmFzdCBNVEYgZGVjb2Rlci4gLS0qLworCisjZGVmaW5lIE1URkFfU0laRSA0MDk2CisjZGVmaW5lIE1URkxfU0laRSAxNgorCisKKworLyotLSBTdHJ1Y3R1cmUgaG9sZGluZyBhbGwgdGhlIGRlY29tcHJlc3Npb24tc2lkZSBzdHVmZi4gLS0qLworCit0eXBlZGVmCisgICBzdHJ1Y3QgeworICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoZSBzdHJ1Y3QgYnpfc3RyZWFtICovCisgICAgICBiel9zdHJlYW0qIHN0cm07CisKKyAgICAgIC8qIHN0YXRlIGluZGljYXRvciBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgICAgIEludDMyICAgIHN0YXRlOworCisgICAgICAvKiBmb3IgZG9pbmcgdGhlIGZpbmFsIHJ1bi1sZW5ndGggZGVjb2RpbmcgKi8KKyAgICAgIFVDaGFyICAgIHN0YXRlX291dF9jaDsKKyAgICAgIEludDMyICAgIHN0YXRlX291dF9sZW47CisgICAgICBCb29sICAgICBibG9ja1JhbmRvbWlzZWQ7CisgICAgICBCWl9SQU5EX0RFQ0xTOworCisgICAgICAvKiB0aGUgYnVmZmVyIGZvciBiaXQgc3RyZWFtIHJlYWRpbmcgKi8KKyAgICAgIFVJbnQzMiAgIGJzQnVmZjsKKyAgICAgIEludDMyICAgIGJzTGl2ZTsKKworICAgICAgLyogbWlzYyBhZG1pbmlzdHJhdGl1bSAqLworICAgICAgSW50MzIgICAgYmxvY2tTaXplMTAwazsKKyAgICAgIEJvb2wgICAgIHNtYWxsRGVjb21wcmVzczsKKyAgICAgIEludDMyICAgIGN1cnJCbG9ja05vOworICAgICAgSW50MzIgICAgdmVyYm9zaXR5OworCisgICAgICAvKiBmb3IgdW5kb2luZyB0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAqLworICAgICAgSW50MzIgICAgb3JpZ1B0cjsKKyAgICAgIFVJbnQzMiAgIHRQb3M7CisgICAgICBJbnQzMiAgICBrMDsKKyAgICAgIEludDMyICAgIHVuemZ0YWJbMjU2XTsKKyAgICAgIEludDMyICAgIG5ibG9ja191c2VkOworICAgICAgSW50MzIgICAgY2Z0YWJbMjU3XTsKKyAgICAgIEludDMyICAgIGNmdGFiQ29weVsyNTddOworCisgICAgICAvKiBmb3IgdW5kb2luZyB0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAoRkFTVCkgKi8KKyAgICAgIFVJbnQzMiAgICp0dDsKKworICAgICAgLyogZm9yIHVuZG9pbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciB0cmFuc2Zvcm0gKFNNQUxMKSAqLworICAgICAgVUludDE2ICAgKmxsMTY7CisgICAgICBVQ2hhciAgICAqbGw0OworCisgICAgICAvKiBzdG9yZWQgYW5kIGNhbGN1bGF0ZWQgQ1JDcyAqLworICAgICAgVUludDMyICAgc3RvcmVkQmxvY2tDUkM7CisgICAgICBVSW50MzIgICBzdG9yZWRDb21iaW5lZENSQzsKKyAgICAgIFVJbnQzMiAgIGNhbGN1bGF0ZWRCbG9ja0NSQzsKKyAgICAgIFVJbnQzMiAgIGNhbGN1bGF0ZWRDb21iaW5lZENSQzsKKworICAgICAgLyogbWFwIG9mIGJ5dGVzIHVzZWQgaW4gYmxvY2sgKi8KKyAgICAgIEludDMyICAgIG5JblVzZTsKKyAgICAgIEJvb2wgICAgIGluVXNlWzI1Nl07CisgICAgICBCb29sICAgICBpblVzZTE2WzE2XTsKKyAgICAgIFVDaGFyICAgIHNlcVRvVW5zZXFbMjU2XTsKKworICAgICAgLyogZm9yIGRlY29kaW5nIHRoZSBNVEYgdmFsdWVzICovCisgICAgICBVQ2hhciAgICBtdGZhICAgW01URkFfU0laRV07CisgICAgICBJbnQzMiAgICBtdGZiYXNlWzI1NiAvIE1URkxfU0laRV07CisgICAgICBVQ2hhciAgICBzZWxlY3RvciAgIFtCWl9NQVhfU0VMRUNUT1JTXTsKKyAgICAgIFVDaGFyICAgIHNlbGVjdG9yTXRmW0JaX01BWF9TRUxFQ1RPUlNdOworICAgICAgVUNoYXIgICAgbGVuICBbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKworICAgICAgSW50MzIgICAgbGltaXQgIFtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworICAgICAgSW50MzIgICAgYmFzZSAgIFtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworICAgICAgSW50MzIgICAgcGVybSAgIFtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworICAgICAgSW50MzIgICAgbWluTGVuc1tCWl9OX0dST1VQU107CisKKyAgICAgIC8qIHNhdmUgYXJlYSBmb3Igc2NhbGFycyBpbiB0aGUgbWFpbiBkZWNvbXByZXNzIGNvZGUgKi8KKyAgICAgIEludDMyICAgIHNhdmVfaTsKKyAgICAgIEludDMyICAgIHNhdmVfajsKKyAgICAgIEludDMyICAgIHNhdmVfdDsKKyAgICAgIEludDMyICAgIHNhdmVfYWxwaGFTaXplOworICAgICAgSW50MzIgICAgc2F2ZV9uR3JvdXBzOworICAgICAgSW50MzIgICAgc2F2ZV9uU2VsZWN0b3JzOworICAgICAgSW50MzIgICAgc2F2ZV9FT0I7CisgICAgICBJbnQzMiAgICBzYXZlX2dyb3VwTm87CisgICAgICBJbnQzMiAgICBzYXZlX2dyb3VwUG9zOworICAgICAgSW50MzIgICAgc2F2ZV9uZXh0U3ltOworICAgICAgSW50MzIgICAgc2F2ZV9uYmxvY2tNQVg7CisgICAgICBJbnQzMiAgICBzYXZlX25ibG9jazsKKyAgICAgIEludDMyICAgIHNhdmVfZXM7CisgICAgICBJbnQzMiAgICBzYXZlX047CisgICAgICBJbnQzMiAgICBzYXZlX2N1cnI7CisgICAgICBJbnQzMiAgICBzYXZlX3p0OworICAgICAgSW50MzIgICAgc2F2ZV96bjsgCisgICAgICBJbnQzMiAgICBzYXZlX3p2ZWM7CisgICAgICBJbnQzMiAgICBzYXZlX3pqOworICAgICAgSW50MzIgICAgc2F2ZV9nU2VsOworICAgICAgSW50MzIgICAgc2F2ZV9nTWlubGVuOworICAgICAgSW50MzIqICAgc2F2ZV9nTGltaXQ7CisgICAgICBJbnQzMiogICBzYXZlX2dCYXNlOworICAgICAgSW50MzIqICAgc2F2ZV9nUGVybTsKKworICAgfQorICAgRFN0YXRlOworCisKKworLyotLSBNYWNyb3MgZm9yIGRlY29tcHJlc3Npb24uIC0tKi8KKworI2RlZmluZSBCWl9HRVRfRkFTVChjY2NjKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzLT50UG9zID0gcy0+dHRbcy0+dFBvc107ICAgICAgICAgICAgICAgICBcCisgICAgY2NjYyA9IChVQ2hhcikocy0+dFBvcyAmIDB4ZmYpOyAgICAgICAgICAgXAorICAgIHMtPnRQb3MgPj49IDg7CisKKyNkZWZpbmUgQlpfR0VUX0ZBU1RfQyhjY2NjKSAgICAgICAgICAgICAgICAgICBcCisgICAgY190UG9zID0gY190dFtjX3RQb3NdOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNjY2MgPSAoVUNoYXIpKGNfdFBvcyAmIDB4ZmYpOyAgICAgICAgICAgIFwKKyAgICBjX3RQb3MgPj49IDg7CisKKyNkZWZpbmUgU0VUX0xMNChpLG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgeyBpZiAoKChpKSAmIDB4MSkgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMtPmxsNFsoaSkgPj4gMV0gPSAocy0+bGw0WyhpKSA+PiAxXSAmIDB4ZjApIHwgKG4pOyBlbHNlICAgIFwKKyAgICAgICAgcy0+bGw0WyhpKSA+PiAxXSA9IChzLT5sbDRbKGkpID4+IDFdICYgMHgwZikgfCAoKG4pIDw8IDQpOyAgXAorICAgfQorCisjZGVmaW5lIEdFVF9MTDQoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKChVSW50MzIpKHMtPmxsNFsoaSkgPj4gMV0pKSA+PiAoKChpKSA8PCAyKSAmIDB4NCkgJiAweEYpCisKKyNkZWZpbmUgU0VUX0xMKGksbikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHsgcy0+bGwxNltpXSA9IChVSW50MTYpKG4gJiAweDAwMDBmZmZmKTsgIFwKKyAgICAgU0VUX0xMNChpLCBuID4+IDE2KTsgICAgICAgICAgICAgICAgIFwKKyAgIH0KKworI2RlZmluZSBHRVRfTEwoaSkgXAorICAgKCgoVUludDMyKXMtPmxsMTZbaV0pIHwgKEdFVF9MTDQoaSkgPDwgMTYpKQorCisjZGVmaW5lIEJaX0dFVF9TTUFMTChjY2NjKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNjY2MgPSBpbmRleEludG9GICggcy0+dFBvcywgcy0+Y2Z0YWIgKTsgICAgXAorICAgICAgcy0+dFBvcyA9IEdFVF9MTChzLT50UG9zKTsKKworCisvKi0tIGV4dGVybnMgZm9yIGRlY29tcHJlc3Npb24uIC0tKi8KKworZXh0ZXJuIEludDMyIAoraW5kZXhJbnRvRiAoIEludDMyLCBJbnQzMiogKTsKKworZXh0ZXJuIEludDMyIAorZGVjb21wcmVzcyAoIERTdGF0ZSogKTsKKworZXh0ZXJuIHZvaWQgCitoYkNyZWF0ZURlY29kZVRhYmxlcyAoIEludDMyKiwgSW50MzIqLCBJbnQzMiosIFVDaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50MzIsICBJbnQzMiwgSW50MzIgKTsKKworCisjZW5kaWYKKworCisvKi0tIEJaX05PX1NURElPIHNlZW1zIHRvIG1ha2UgTlVMTCBkaXNhcHBlYXIgb24gc29tZSBwbGF0Zm9ybXMuIC0tKi8KKworI2lmZGVmIEJaX05PX1NURElPCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCisjZW5kaWYKKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliX3ByaXZhdGUuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2NvbXByZXNzLmMgYi9jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWJkNDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wcmVzcy5jCkBAIC0wLDAgKzEsNTg4IEBACisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBDb21wcmVzc2lvbiBtYWNoaW5lcnkgKG5vdCBpbmNsIGJsb2NrIHNvcnRpbmcpICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0KKyAgVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBiemlwMiBhbmQvb3IgbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQKKyAgbGlicmFyeSBmb3IgbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBKdWxpYW4gUiBTZXdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyAKKyAgICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCAKKyAgICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisgIDMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKKyAgICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworICA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAgICAgcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgIEp1bGlhbiBTZXdhcmQsIEd1aWxkZm9yZCwgU3VycmV5LCBVSy4KKyAganNld2FyZEBhY20ub3JnCisgIGJ6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMC45LjAgb2YgMjggSnVuZSAxOTk4CisKKyAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIChhdCBsZWFzdCkgdGhlIHdvcmsgb2Y6CisgICAgIE1pa2UgQnVycm93cworICAgICBEYXZpZCBXaGVlbGVyCisgICAgIFBldGVyIEZlbndpY2sKKyAgICAgQWxpc3RhaXIgTW9mZmF0CisgICAgIFJhZGZvcmQgTmVhbAorICAgICBJYW4gSC4gV2l0dGVuCisgICAgIFJvYmVydCBTZWRnZXdpY2sKKyAgICAgSm9uIEwuIEJlbnRsZXkKKworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KKy0tKi8KKworLyotLQorICAgQ0hBTkdFUworICAgfn5+fn5+fgorICAgMC45LjAgLS0gb3JpZ2luYWwgdmVyc2lvbi4KKworICAgMC45LjBhL2IgLS0gbm8gY2hhbmdlcyBpbiB0aGlzIGZpbGUuCisKKyAgIDAuOS4wYworICAgICAgKiBjaGFuZ2VkIHNldHRpbmcgb2Ygbkdyb3VwcyBpbiBzZW5kTVRGVmFsdWVzKCkgc28gYXMgdG8gCisgICAgICAgIGRvIGEgYml0IGJldHRlciBvbiBzbWFsbCBmaWxlcworLS0qLworCisjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIEJpdCBzdHJlYW0gSS9PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBic0luaXRXcml0ZSAoIEVTdGF0ZSogcyApCit7CisgICBzLT5ic0xpdmUgPSAwOworICAgcy0+YnNCdWZmID0gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYnNGaW5pc2hXcml0ZSAoIEVTdGF0ZSogcyApCit7CisgICB3aGlsZSAocy0+YnNMaXZlID4gMCkgeworICAgICAgKChVQ2hhciopKHMtPnF1YWRyYW50KSlbcy0+bnVtWl0gPSAoVUNoYXIpKHMtPmJzQnVmZiA+PiAyNCk7CisgICAgICBzLT5udW1aKys7CisgICAgICBzLT5ic0J1ZmYgPDw9IDg7CisgICAgICBzLT5ic0xpdmUgLT0gODsKKyAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIGJzTkVFRFcobnopICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHdoaWxlIChzLT5ic0xpdmUgPj0gOCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKFVDaGFyKikocy0+cXVhZHJhbnQpKVtzLT5udW1aXSAgICAgICAgXAorICAgICAgICAgPSAoVUNoYXIpKHMtPmJzQnVmZiA+PiAyNCk7ICAgICAgICAgIFwKKyAgICAgIHMtPm51bVorKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzLT5ic0J1ZmYgPDw9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcy0+YnNMaXZlIC09IDg7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGJzVyAoIEVTdGF0ZSogcywgSW50MzIgbiwgVUludDMyIHYgKQoreworICAgYnNORUVEVyAoIG4gKTsKKyAgIHMtPmJzQnVmZiB8PSAodiA8PCAoMzIgLSBzLT5ic0xpdmUgLSBuKSk7CisgICBzLT5ic0xpdmUgKz0gbjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgYnNQdXRVSW50MzIgKCBFU3RhdGUqIHMsIFVJbnQzMiB1ICkKK3sKKyAgIGJzVyAoIHMsIDgsICh1ID4+IDI0KSAmIDB4ZmZMICk7CisgICBic1cgKCBzLCA4LCAodSA+PiAxNikgJiAweGZmTCApOworICAgYnNXICggcywgOCwgKHUgPj4gIDgpICYgMHhmZkwgKTsKKyAgIGJzVyAoIHMsIDgsICB1ICAgICAgICAmIDB4ZmZMICk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGJzUHV0VUNoYXIgKCBFU3RhdGUqIHMsIFVDaGFyIGMgKQoreworICAgYnNXKCBzLCA4LCAoVUludDMyKWMgKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBUaGUgYmFjayBlbmQgcHJvcGVyICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBtYWtlTWFwc19lICggRVN0YXRlKiBzICkKK3sKKyAgIEludDMyIGk7CisgICBzLT5uSW5Vc2UgPSAwOworICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgaWYgKHMtPmluVXNlW2ldKSB7CisgICAgICAgICBzLT51bnNlcVRvU2VxW2ldID0gcy0+bkluVXNlOworICAgICAgICAgcy0+bkluVXNlKys7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGdlbmVyYXRlTVRGVmFsdWVzICggRVN0YXRlKiBzICkKK3sKKyAgIFVDaGFyICB5eVsyNTZdOworICAgSW50MzIgIGksIGo7CisgICBVQ2hhciAgdG1wOworICAgVUNoYXIgIHRtcDI7CisgICBJbnQzMiAgelBlbmQ7CisgICBJbnQzMiAgd3I7CisgICBJbnQzMiAgRU9COworCisgICBtYWtlTWFwc19lICggcyApOworICAgRU9CID0gcy0+bkluVXNlKzE7CisKKyAgIGZvciAoaSA9IDA7IGkgPD0gRU9COyBpKyspIHMtPm10ZkZyZXFbaV0gPSAwOworCisgICB3ciA9IDA7CisgICB6UGVuZCA9IDA7CisgICBmb3IgKGkgPSAwOyBpIDwgcy0+bkluVXNlOyBpKyspIHl5W2ldID0gKFVDaGFyKSBpOworCisgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJsb2NrOyBpKyspIHsKKyAgICAgIFVDaGFyIGxsX2k7CisKKyAgICAgIEFzc2VydEQgKCB3ciA8PSBpLCAiZ2VuZXJhdGVNVEZWYWx1ZXMoMSkiICk7CisgICAgICBqID0gcy0+enB0cltpXS0xOyBpZiAoaiA8IDApIGogKz0gcy0+bmJsb2NrOworICAgICAgbGxfaSA9IHMtPnVuc2VxVG9TZXFbcy0+YmxvY2tbal1dOworICAgICAgQXNzZXJ0RCAoIGxsX2kgPCBzLT5uSW5Vc2UsICJnZW5lcmF0ZU1URlZhbHVlcygyYSkiICk7CisKKyAgICAgIGogPSAwOworICAgICAgdG1wID0geXlbal07CisgICAgICB3aGlsZSAoIGxsX2kgIT0gdG1wICkgeworICAgICAgICAgaisrOworICAgICAgICAgdG1wMiA9IHRtcDsKKyAgICAgICAgIHRtcCA9IHl5W2pdOworICAgICAgICAgeXlbal0gPSB0bXAyOworICAgICAgfTsKKyAgICAgIHl5WzBdID0gdG1wOworCisgICAgICBpZiAoaiA9PSAwKSB7CisgICAgICAgICB6UGVuZCsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGlmICh6UGVuZCA+IDApIHsKKyAgICAgICAgICAgIHpQZW5kLS07CisgICAgICAgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgICAgICAgc3dpdGNoICh6UGVuZCAlIDIpIHsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMDogcy0+c3pwdHJbd3JdID0gQlpfUlVOQTsgd3IrKzsgcy0+bXRmRnJlcVtCWl9SVU5BXSsrOyBicmVhazsKKyAgICAgICAgICAgICAgICAgIGNhc2UgMTogcy0+c3pwdHJbd3JdID0gQlpfUlVOQjsgd3IrKzsgcy0+bXRmRnJlcVtCWl9SVU5CXSsrOyBicmVhazsKKyAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICBpZiAoelBlbmQgPCAyKSBicmVhazsKKyAgICAgICAgICAgICAgIHpQZW5kID0gKHpQZW5kIC0gMikgLyAyOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHpQZW5kID0gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIHMtPnN6cHRyW3dyXSA9IGorMTsgd3IrKzsgcy0+bXRmRnJlcVtqKzFdKys7CisgICAgICB9CisgICB9CisKKyAgIGlmICh6UGVuZCA+IDApIHsKKyAgICAgIHpQZW5kLS07CisgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgc3dpdGNoICh6UGVuZCAlIDIpIHsKKyAgICAgICAgICAgIGNhc2UgMDogIHMtPnN6cHRyW3dyXSA9IEJaX1JVTkE7IHdyKys7IHMtPm10ZkZyZXFbQlpfUlVOQV0rKzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICBzLT5zenB0clt3cl0gPSBCWl9SVU5COyB3cisrOyBzLT5tdGZGcmVxW0JaX1JVTkJdKys7IGJyZWFrOworICAgICAgICAgfTsKKyAgICAgICAgIGlmICh6UGVuZCA8IDIpIGJyZWFrOworICAgICAgICAgelBlbmQgPSAoelBlbmQgLSAyKSAvIDI7CisgICAgICB9OworICAgfQorCisgICBzLT5zenB0clt3cl0gPSBFT0I7IHdyKys7IHMtPm10ZkZyZXFbRU9CXSsrOworCisgICBzLT5uTVRGID0gd3I7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBCWl9MRVNTRVJfSUNPU1QgIDAKKyNkZWZpbmUgQlpfR1JFQVRFUl9JQ09TVCAxNQorCitzdGF0aWMKK3ZvaWQgc2VuZE1URlZhbHVlcyAoIEVTdGF0ZSogcyApCit7CisgICBJbnQzMiB2LCB0LCBpLCBqLCBncywgZ2UsIHRvdGMsIGJ0LCBiYywgaXRlcjsKKyAgIEludDMyIG5TZWxlY3RvcnMsIGFscGhhU2l6ZSwgbWluTGVuLCBtYXhMZW4sIHNlbEN0cjsKKyAgIEludDMyIG5Hcm91cHMsIG5CeXRlczsKKworICAgLyotLQorICAgVUNoYXIgIGxlbiBbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKyAgIGlzIGEgZ2xvYmFsIHNpbmNlIHRoZSBkZWNvZGVyIGFsc28gbmVlZHMgaXQuCisKKyAgIEludDMyICBjb2RlW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisgICBJbnQzMiAgcmZyZXFbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKyAgIGFyZSBhbHNvIGdsb2JhbHMgb25seSB1c2VkIGluIHRoaXMgcHJvYy4KKyAgIE1hZGUgZ2xvYmFsIHRvIGtlZXAgc3RhY2sgZnJhbWUgc2l6ZSBzbWFsbC4KKyAgIC0tKi8KKworCisgICBVSW50MTYgY29zdFtCWl9OX0dST1VQU107CisgICBJbnQzMiAgZmF2ZVtCWl9OX0dST1VQU107CisKKyAgIGlmIChzLT52ZXJib3NpdHkgPj0gMykKKyAgICAgIFZQcmludGYzKCAiICAgICAgJWQgaW4gYmxvY2ssICVkIGFmdGVyIE1URiAmIDEtMiBjb2RpbmcsICIKKyAgICAgICAgICAgICAgICAiJWQrMiBzeW1zIGluIHVzZVxuIiwgCisgICAgICAgICAgICAgICAgcy0+bmJsb2NrLCBzLT5uTVRGLCBzLT5uSW5Vc2UgKTsKKworICAgYWxwaGFTaXplID0gcy0+bkluVXNlKzI7CisgICBmb3IgKHQgPSAwOyB0IDwgQlpfTl9HUk9VUFM7IHQrKykKKyAgICAgIGZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKKyAgICAgICAgIHMtPmxlblt0XVt2XSA9IEJaX0dSRUFURVJfSUNPU1Q7CisKKyAgIC8qLS0tIERlY2lkZSBob3cgbWFueSBjb2RpbmcgdGFibGVzIHRvIHVzZSAtLS0qLworICAgQXNzZXJ0SCAoIHMtPm5NVEYgPiAwLCAzMDAxICk7CisgICBpZiAocy0+bk1URiA8IDIwMCkgIG5Hcm91cHMgPSAyOyBlbHNlCisgICBpZiAocy0+bk1URiA8IDYwMCkgIG5Hcm91cHMgPSAzOyBlbHNlCisgICBpZiAocy0+bk1URiA8IDEyMDApIG5Hcm91cHMgPSA0OyBlbHNlCisgICBpZiAocy0+bk1URiA8IDI0MDApIG5Hcm91cHMgPSA1OyBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIG5Hcm91cHMgPSA2OworCisgICAvKi0tLSBHZW5lcmF0ZSBhbiBpbml0aWFsIHNldCBvZiBjb2RpbmcgdGFibGVzIC0tLSovCisgICB7IAorICAgICAgSW50MzIgblBhcnQsIHJlbUYsIHRGcmVxLCBhRnJlcTsKKworICAgICAgblBhcnQgPSBuR3JvdXBzOworICAgICAgcmVtRiAgPSBzLT5uTVRGOworICAgICAgZ3MgPSAwOworICAgICAgd2hpbGUgKG5QYXJ0ID4gMCkgeworICAgICAgICAgdEZyZXEgPSByZW1GIC8gblBhcnQ7CisgICAgICAgICBnZSA9IGdzLTE7CisgICAgICAgICBhRnJlcSA9IDA7CisgICAgICAgICB3aGlsZSAoYUZyZXEgPCB0RnJlcSAmJiBnZSA8IGFscGhhU2l6ZS0xKSB7CisgICAgICAgICAgICBnZSsrOworICAgICAgICAgICAgYUZyZXEgKz0gcy0+bXRmRnJlcVtnZV07CisgICAgICAgICB9CisKKyAgICAgICAgIGlmIChnZSA+IGdzIAorICAgICAgICAgICAgICYmIG5QYXJ0ICE9IG5Hcm91cHMgJiYgblBhcnQgIT0gMSAKKyAgICAgICAgICAgICAmJiAoKG5Hcm91cHMtblBhcnQpICUgMiA9PSAxKSkgeworICAgICAgICAgICAgYUZyZXEgLT0gcy0+bXRmRnJlcVtnZV07CisgICAgICAgICAgICBnZS0tOworICAgICAgICAgfQorCisgICAgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDMpCisgICAgICAgICAgICBWUHJpbnRmNSggIiAgICAgIGluaXRpYWwgZ3JvdXAgJWQsIFslZCAuLiAlZF0sICIKKyAgICAgICAgICAgICAgICAgICAgICAiaGFzICVkIHN5bXMgKCU0LjFmJSUpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG5QYXJ0LCBncywgZ2UsIGFGcmVxLCAKKyAgICAgICAgICAgICAgICAgICAgICAoMTAwLjAgKiAoZmxvYXQpYUZyZXEpIC8gKGZsb2F0KShzLT5uTVRGKSApOworIAorICAgICAgICAgZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKQorICAgICAgICAgICAgaWYgKHYgPj0gZ3MgJiYgdiA8PSBnZSkgCisgICAgICAgICAgICAgICBzLT5sZW5bblBhcnQtMV1bdl0gPSBCWl9MRVNTRVJfSUNPU1Q7IGVsc2UKKyAgICAgICAgICAgICAgIHMtPmxlbltuUGFydC0xXVt2XSA9IEJaX0dSRUFURVJfSUNPU1Q7CisgCisgICAgICAgICBuUGFydC0tOworICAgICAgICAgZ3MgPSBnZSsxOworICAgICAgICAgcmVtRiAtPSBhRnJlcTsKKyAgICAgIH0KKyAgIH0KKworICAgLyotLS0gCisgICAgICBJdGVyYXRlIHVwIHRvIEJaX05fSVRFUlMgdGltZXMgdG8gaW1wcm92ZSB0aGUgdGFibGVzLgorICAgLS0tKi8KKyAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBCWl9OX0lURVJTOyBpdGVyKyspIHsKKworICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgZmF2ZVt0XSA9IDA7CisKKyAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCisgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspCisgICAgICAgICAgICBzLT5yZnJlcVt0XVt2XSA9IDA7CisKKyAgICAgIG5TZWxlY3RvcnMgPSAwOworICAgICAgdG90YyA9IDA7CisgICAgICBncyA9IDA7CisgICAgICB3aGlsZSAoVHJ1ZSkgeworCisgICAgICAgICAvKi0tLSBTZXQgZ3JvdXAgc3RhcnQgJiBlbmQgbWFya3MuIC0tKi8KKyAgICAgICAgIGlmIChncyA+PSBzLT5uTVRGKSBicmVhazsKKyAgICAgICAgIGdlID0gZ3MgKyBCWl9HX1NJWkUgLSAxOyAKKyAgICAgICAgIGlmIChnZSA+PSBzLT5uTVRGKSBnZSA9IHMtPm5NVEYtMTsKKworICAgICAgICAgLyotLSAKKyAgICAgICAgICAgIENhbGN1bGF0ZSB0aGUgY29zdCBvZiB0aGlzIGdyb3VwIGFzIGNvZGVkCisgICAgICAgICAgICBieSBlYWNoIG9mIHRoZSBjb2RpbmcgdGFibGVzLgorICAgICAgICAgLS0qLworICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgY29zdFt0XSA9IDA7CisKKyAgICAgICAgIGlmIChuR3JvdXBzID09IDYpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFVJbnQxNiBjb3N0MCwgY29zdDEsIGNvc3QyLCBjb3N0MywgY29zdDQsIGNvc3Q1OworICAgICAgICAgICAgY29zdDAgPSBjb3N0MSA9IGNvc3QyID0gY29zdDMgPSBjb3N0NCA9IGNvc3Q1ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IGdzOyBpIDw9IGdlOyBpKyspIHsgCisgICAgICAgICAgICAgICBVSW50MTYgaWN2ID0gcy0+c3pwdHJbaV07CisgICAgICAgICAgICAgICBjb3N0MCArPSBzLT5sZW5bMF1baWN2XTsKKyAgICAgICAgICAgICAgIGNvc3QxICs9IHMtPmxlblsxXVtpY3ZdOworICAgICAgICAgICAgICAgY29zdDIgKz0gcy0+bGVuWzJdW2ljdl07CisgICAgICAgICAgICAgICBjb3N0MyArPSBzLT5sZW5bM11baWN2XTsKKyAgICAgICAgICAgICAgIGNvc3Q0ICs9IHMtPmxlbls0XVtpY3ZdOworICAgICAgICAgICAgICAgY29zdDUgKz0gcy0+bGVuWzVdW2ljdl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3N0WzBdID0gY29zdDA7IGNvc3RbMV0gPSBjb3N0MTsgY29zdFsyXSA9IGNvc3QyOworICAgICAgICAgICAgY29zdFszXSA9IGNvc3QzOyBjb3N0WzRdID0gY29zdDQ7IGNvc3RbNV0gPSBjb3N0NTsKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7IAorICAgICAgICAgICAgICAgVUludDE2IGljdiA9IHMtPnN6cHRyW2ldOworICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgY29zdFt0XSArPSBzLT5sZW5bdF1baWN2XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAKKyAgICAgICAgIC8qLS0gCisgICAgICAgICAgICBGaW5kIHRoZSBjb2RpbmcgdGFibGUgd2hpY2ggaXMgYmVzdCBmb3IgdGhpcyBncm91cCwKKyAgICAgICAgICAgIGFuZCByZWNvcmQgaXRzIGlkZW50aXR5IGluIHRoZSBzZWxlY3RvciB0YWJsZS4KKyAgICAgICAgIC0tKi8KKyAgICAgICAgIGJjID0gOTk5OTk5OTk5OyBidCA9IC0xOworICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKyAgICAgICAgICAgIGlmIChjb3N0W3RdIDwgYmMpIHsgYmMgPSBjb3N0W3RdOyBidCA9IHQ7IH07CisgICAgICAgICB0b3RjICs9IGJjOworICAgICAgICAgZmF2ZVtidF0rKzsKKyAgICAgICAgIHMtPnNlbGVjdG9yW25TZWxlY3RvcnNdID0gYnQ7CisgICAgICAgICBuU2VsZWN0b3JzKys7CisKKyAgICAgICAgIC8qLS0gCisgICAgICAgICAgICBJbmNyZW1lbnQgdGhlIHN5bWJvbCBmcmVxdWVuY2llcyBmb3IgdGhlIHNlbGVjdGVkIHRhYmxlLgorICAgICAgICAgIC0tKi8KKyAgICAgICAgIGZvciAoaSA9IGdzOyBpIDw9IGdlOyBpKyspCisgICAgICAgICAgICBzLT5yZnJlcVtidF1bIHMtPnN6cHRyW2ldIF0rKzsKKworICAgICAgICAgZ3MgPSBnZSsxOworICAgICAgfQorICAgICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKSB7CisgICAgICAgICBWUHJpbnRmMiAoICIgICAgICBwYXNzICVkOiBzaXplIGlzICVkLCBncnAgdXNlcyBhcmUgIiwgCisgICAgICAgICAgICAgICAgICAgaXRlcisxLCB0b3RjLzggKTsKKyAgICAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCisgICAgICAgICAgICBWUHJpbnRmMSAoICIlZCAiLCBmYXZlW3RdICk7CisgICAgICAgICBWUHJpbnRmMCAoICJcbiIgKTsKKyAgICAgIH0KKworICAgICAgLyotLQorICAgICAgICBSZWNvbXB1dGUgdGhlIHRhYmxlcyBiYXNlZCBvbiB0aGUgYWNjdW11bGF0ZWQgZnJlcXVlbmNpZXMuCisgICAgICAtLSovCisgICAgICBmb3IgKHQgPSAwOyB0IDwgbkdyb3VwczsgdCsrKQorICAgICAgICAgaGJNYWtlQ29kZUxlbmd0aHMgKCAmKHMtPmxlblt0XVswXSksICYocy0+cmZyZXFbdF1bMF0pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFTaXplLCAyMCApOworICAgfQorCisKKyAgIEFzc2VydEgoIG5Hcm91cHMgPCA4LCAzMDAyICk7CisgICBBc3NlcnRIKCBuU2VsZWN0b3JzIDwgMzI3NjggJiYKKyAgICAgICAgICAgIG5TZWxlY3RvcnMgPD0gKDIgKyAoOTAwMDAwIC8gQlpfR19TSVpFKSksCisgICAgICAgICAgICAzMDAzICk7CisKKworICAgLyotLS0gQ29tcHV0ZSBNVEYgdmFsdWVzIGZvciB0aGUgc2VsZWN0b3JzLiAtLS0qLworICAgeworICAgICAgVUNoYXIgcG9zW0JaX05fR1JPVVBTXSwgbGxfaSwgdG1wMiwgdG1wOworICAgICAgZm9yIChpID0gMDsgaSA8IG5Hcm91cHM7IGkrKykgcG9zW2ldID0gaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKKyAgICAgICAgIGxsX2kgPSBzLT5zZWxlY3RvcltpXTsKKyAgICAgICAgIGogPSAwOworICAgICAgICAgdG1wID0gcG9zW2pdOworICAgICAgICAgd2hpbGUgKCBsbF9pICE9IHRtcCApIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIHRtcDIgPSB0bXA7CisgICAgICAgICAgICB0bXAgPSBwb3Nbal07CisgICAgICAgICAgICBwb3Nbal0gPSB0bXAyOworICAgICAgICAgfTsKKyAgICAgICAgIHBvc1swXSA9IHRtcDsKKyAgICAgICAgIHMtPnNlbGVjdG9yTXRmW2ldID0gajsKKyAgICAgIH0KKyAgIH07CisKKyAgIC8qLS0tIEFzc2lnbiBhY3R1YWwgY29kZXMgZm9yIHRoZSB0YWJsZXMuIC0tKi8KKyAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgIG1pbkxlbiA9IDMyOworICAgICAgbWF4TGVuID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworICAgICAgICAgaWYgKHMtPmxlblt0XVtpXSA+IG1heExlbikgbWF4TGVuID0gcy0+bGVuW3RdW2ldOworICAgICAgICAgaWYgKHMtPmxlblt0XVtpXSA8IG1pbkxlbikgbWluTGVuID0gcy0+bGVuW3RdW2ldOworICAgICAgfQorICAgICAgQXNzZXJ0SCAoICEobWF4TGVuID4gMjApLCAzMDA0ICk7CisgICAgICBBc3NlcnRIICggIShtaW5MZW4gPCAxKSwgIDMwMDUgKTsKKyAgICAgIGhiQXNzaWduQ29kZXMgKCAmKHMtPmNvZGVbdF1bMF0pLCAmKHMtPmxlblt0XVswXSksIAorICAgICAgICAgICAgICAgICAgICAgIG1pbkxlbiwgbWF4TGVuLCBhbHBoYVNpemUgKTsKKyAgIH0KKworICAgLyotLS0gVHJhbnNtaXQgdGhlIG1hcHBpbmcgdGFibGUuIC0tLSovCisgICB7IAorICAgICAgQm9vbCBpblVzZTE2WzE2XTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgaW5Vc2UxNltpXSA9IEZhbHNlOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgIGlmIChzLT5pblVzZVtpICogMTYgKyBqXSkgaW5Vc2UxNltpXSA9IFRydWU7CisgICAgICB9CisgICAgIAorICAgICAgbkJ5dGVzID0gcy0+bnVtWjsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgaWYgKGluVXNlMTZbaV0pIGJzVyhzLDEsMSk7IGVsc2UgYnNXKHMsMSwwKTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICBpZiAoaW5Vc2UxNltpXSkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICBpZiAocy0+aW5Vc2VbaSAqIDE2ICsgal0pIGJzVyhzLDEsMSk7IGVsc2UgYnNXKHMsMSwwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKSAKKyAgICAgICAgIFZQcmludGYxKCAiICAgICAgYnl0ZXM6IG1hcHBpbmcgJWQsICIsIHMtPm51bVotbkJ5dGVzICk7CisgICB9CisKKyAgIC8qLS0tIE5vdyB0aGUgc2VsZWN0b3JzLiAtLS0qLworICAgbkJ5dGVzID0gcy0+bnVtWjsKKyAgIGJzVyAoIHMsIDMsIG5Hcm91cHMgKTsKKyAgIGJzVyAoIHMsIDE1LCBuU2VsZWN0b3JzICk7CisgICBmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7IAorICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnNlbGVjdG9yTXRmW2ldOyBqKyspIGJzVyhzLDEsMSk7CisgICAgICBic1cocywxLDApOworICAgfQorICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKQorICAgICAgVlByaW50ZjEoICJzZWxlY3RvcnMgJWQsICIsIHMtPm51bVotbkJ5dGVzICk7CisKKyAgIC8qLS0tIE5vdyB0aGUgY29kaW5nIHRhYmxlcy4gLS0tKi8KKyAgIG5CeXRlcyA9IHMtPm51bVo7CisKKyAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgIEludDMyIGN1cnIgPSBzLT5sZW5bdF1bMF07CisgICAgICBic1cgKCBzLCA1LCBjdXJyICk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgIHdoaWxlIChjdXJyIDwgcy0+bGVuW3RdW2ldKSB7IGJzVyhzLDIsMik7IGN1cnIrKzsgLyogMTAgKi8gfTsKKyAgICAgICAgIHdoaWxlIChjdXJyID4gcy0+bGVuW3RdW2ldKSB7IGJzVyhzLDIsMyk7IGN1cnItLTsgLyogMTEgKi8gfTsKKyAgICAgICAgIGJzVyAoIHMsIDEsIDAgKTsKKyAgICAgIH0KKyAgIH0KKworICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAzKQorICAgICAgVlByaW50ZjEgKCAiY29kZSBsZW5ndGhzICVkLCAiLCBzLT5udW1aLW5CeXRlcyApOworCisgICAvKi0tLSBBbmQgZmluYWxseSwgdGhlIGJsb2NrIGRhdGEgcHJvcGVyIC0tLSovCisgICBuQnl0ZXMgPSBzLT5udW1aOworICAgc2VsQ3RyID0gMDsKKyAgIGdzID0gMDsKKyAgIHdoaWxlIChUcnVlKSB7CisgICAgICBpZiAoZ3MgPj0gcy0+bk1URikgYnJlYWs7CisgICAgICBnZSA9IGdzICsgQlpfR19TSVpFIC0gMTsgCisgICAgICBpZiAoZ2UgPj0gcy0+bk1URikgZ2UgPSBzLT5uTVRGLTE7CisgICAgICBmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7CisgICAgICAgICBBc3NlcnRIICggcy0+c2VsZWN0b3Jbc2VsQ3RyXSA8IG5Hcm91cHMsIDMwMDYgKTsKKyAgICAgICAgIGJzVyAoIHMsIAorICAgICAgICAgICAgICAgcy0+bGVuICBbcy0+c2VsZWN0b3Jbc2VsQ3RyXV0gW3MtPnN6cHRyW2ldXSwKKyAgICAgICAgICAgICAgIHMtPmNvZGUgW3MtPnNlbGVjdG9yW3NlbEN0cl1dIFtzLT5zenB0cltpXV0gKTsKKyAgICAgIH0KKworICAgICAgZ3MgPSBnZSsxOworICAgICAgc2VsQ3RyKys7CisgICB9CisgICBBc3NlcnRIKCBzZWxDdHIgPT0gblNlbGVjdG9ycywgMzAwNyApOworCisgICBpZiAocy0+dmVyYm9zaXR5ID49IDMpCisgICAgICBWUHJpbnRmMSggImNvZGVzICVkXG4iLCBzLT5udW1aLW5CeXRlcyApOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgY29tcHJlc3NCbG9jayAoIEVTdGF0ZSogcywgQm9vbCBpc19sYXN0X2Jsb2NrICkKK3sKKyAgIGlmIChzLT5uYmxvY2sgPiAwKSB7CisKKyAgICAgIEJaX0ZJTkFMSVNFX0NSQyAoIHMtPmJsb2NrQ1JDICk7CisgICAgICBzLT5jb21iaW5lZENSQyA9IChzLT5jb21iaW5lZENSQyA8PCAxKSB8IChzLT5jb21iaW5lZENSQyA+PiAzMSk7CisgICAgICBzLT5jb21iaW5lZENSQyBePSBzLT5ibG9ja0NSQzsKKyAgICAgIGlmIChzLT5ibG9ja05vID4gMSkgcy0+bnVtWiA9IDA7CisKKyAgICAgIGlmIChzLT52ZXJib3NpdHkgPj0gMikKKyAgICAgICAgIFZQcmludGY0KCAiICAgIGJsb2NrICVkOiBjcmMgPSAweCU4eCwgIgorICAgICAgICAgICAgICAgICAgICJjb21iaW5lZCBDUkMgPSAweCU4eCwgc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrTm8sIHMtPmJsb2NrQ1JDLCBzLT5jb21iaW5lZENSQywgcy0+bmJsb2NrICk7CisKKyAgICAgIGJsb2NrU29ydCAoIHMgKTsKKyAgIH0KKworICAgLyotLSBJZiB0aGlzIGlzIHRoZSBmaXJzdCBibG9jaywgY3JlYXRlIHRoZSBzdHJlYW0gaGVhZGVyLiAtLSovCisgICBpZiAocy0+YmxvY2tObyA9PSAxKSB7CisgICAgICBic0luaXRXcml0ZSAoIHMgKTsKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAnQicgKTsKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAnWicgKTsKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAnaCcgKTsKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAnMCcgKyBzLT5ibG9ja1NpemUxMDBrICk7CisgICB9CisKKyAgIGlmIChzLT5uYmxvY2sgPiAwKSB7CisKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAweDMxICk7IGJzUHV0VUNoYXIgKCBzLCAweDQxICk7CisgICAgICBic1B1dFVDaGFyICggcywgMHg1OSApOyBic1B1dFVDaGFyICggcywgMHgyNiApOworICAgICAgYnNQdXRVQ2hhciAoIHMsIDB4NTMgKTsgYnNQdXRVQ2hhciAoIHMsIDB4NTkgKTsKKworICAgICAgLyotLSBOb3cgdGhlIGJsb2NrJ3MgQ1JDLCBzbyBpdCBpcyBpbiBhIGtub3duIHBsYWNlLiAtLSovCisgICAgICBic1B1dFVJbnQzMiAoIHMsIHMtPmJsb2NrQ1JDICk7CisKKyAgICAgIC8qLS0gTm93IGEgc2luZ2xlIGJpdCBpbmRpY2F0aW5nIHJhbmRvbWlzYXRpb24uIC0tKi8KKyAgICAgIGlmIChzLT5ibG9ja1JhbmRvbWlzZWQpIHsKKyAgICAgICAgIGJzVyhzLDEsMSk7IHMtPm5CbG9ja3NSYW5kb21pc2VkKys7CisgICAgICB9IGVsc2UKKyAgICAgICAgIGJzVyhzLDEsMCk7CisKKyAgICAgIGJzVyAoIHMsIDI0LCBzLT5vcmlnUHRyICk7CisgICAgICBnZW5lcmF0ZU1URlZhbHVlcyAoIHMgKTsKKyAgICAgIHNlbmRNVEZWYWx1ZXMgKCBzICk7CisgICB9CisKKworICAgLyotLSBJZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrLCBhZGQgdGhlIHN0cmVhbSB0cmFpbGVyLiAtLSovCisgICBpZiAoaXNfbGFzdF9ibG9jaykgeworCisgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDIgJiYgcy0+bkJsb2Nrc1JhbmRvbWlzZWQgPiAwKQorICAgICAgICAgVlByaW50ZjIgKCAiICAgICVkIGJsb2NrJXMgbmVlZGVkIHJhbmRvbWlzYXRpb25cbiIsIAorICAgICAgICAgICAgICAgICAgICBzLT5uQmxvY2tzUmFuZG9taXNlZCwKKyAgICAgICAgICAgICAgICAgICAgcy0+bkJsb2Nrc1JhbmRvbWlzZWQgPT0gMSA/ICIiIDogInMiICk7CisKKyAgICAgIGJzUHV0VUNoYXIgKCBzLCAweDE3ICk7IGJzUHV0VUNoYXIgKCBzLCAweDcyICk7CisgICAgICBic1B1dFVDaGFyICggcywgMHg0NSApOyBic1B1dFVDaGFyICggcywgMHgzOCApOworICAgICAgYnNQdXRVQ2hhciAoIHMsIDB4NTAgKTsgYnNQdXRVQ2hhciAoIHMsIDB4OTAgKTsKKyAgICAgIGJzUHV0VUludDMyICggcywgcy0+Y29tYmluZWRDUkMgKTsKKyAgICAgIGlmIChzLT52ZXJib3NpdHkgPj0gMikKKyAgICAgICAgIFZQcmludGYxKCAiICAgIGZpbmFsIGNvbWJpbmVkIENSQyA9IDB4JXhcbiAgICIsIHMtPmNvbWJpbmVkQ1JDICk7CisgICAgICBic0ZpbmlzaFdyaXRlICggcyApOworICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3MuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2NyY3RhYmxlLmMgYi9jcmN0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmM2VhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jcmN0YWJsZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBUYWJsZSBmb3IgZG9pbmcgQ1JDcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyY3RhYmxlLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0KKyAgVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBiemlwMiBhbmQvb3IgbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQKKyAgbGlicmFyeSBmb3IgbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBKdWxpYW4gUiBTZXdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyAKKyAgICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCAKKyAgICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisgIDMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKKyAgICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworICA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAgICAgcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgIEp1bGlhbiBTZXdhcmQsIEd1aWxkZm9yZCwgU3VycmV5LCBVSy4KKyAganNld2FyZEBhY20ub3JnCisgIGJ6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMC45LjBjIG9mIDE4IE9jdG9iZXIgMTk5OAorCisgIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiAoYXQgbGVhc3QpIHRoZSB3b3JrIG9mOgorICAgICBNaWtlIEJ1cnJvd3MKKyAgICAgRGF2aWQgV2hlZWxlcgorICAgICBQZXRlciBGZW53aWNrCisgICAgIEFsaXN0YWlyIE1vZmZhdAorICAgICBSYWRmb3JkIE5lYWwKKyAgICAgSWFuIEguIFdpdHRlbgorICAgICBSb2JlcnQgU2VkZ2V3aWNrCisgICAgIEpvbiBMLiBCZW50bGV5CisKKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc291cmNlcywgc2VlIHRoZSBtYW51YWwuCistLSovCisKKworI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIKKworLyotLQorICBJIHRoaW5rIHRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFVVE9ESU4tSUksCisgIEV0aGVybmV0ICYgRkRESSAzMi1iaXQgQ1JDIHN0YW5kYXJkLiAgVmFndWVseSBkZXJpdmVkCisgIGZyb20gY29kZSBieSBSb2IgV2Fybm9jaywgaW4gU2VjdGlvbiA1MSBvZiB0aGUKKyAgY29tcC5jb21wcmVzc2lvbiBGQVEuCistLSovCisKK1VJbnQzMiBjcmMzMlRhYmxlWzI1Nl0gPSB7CisKKyAgIC8qLS0gVWdseSwgaW5uaXQ/IC0tKi8KKworICAgMHgwMDAwMDAwMEwsIDB4MDRjMTFkYjdMLCAweDA5ODIzYjZlTCwgMHgwZDQzMjZkOUwsCisgICAweDEzMDQ3NmRjTCwgMHgxN2M1NmI2YkwsIDB4MWE4NjRkYjJMLCAweDFlNDc1MDA1TCwKKyAgIDB4MjYwOGVkYjhMLCAweDIyYzlmMDBmTCwgMHgyZjhhZDZkNkwsIDB4MmI0YmNiNjFMLAorICAgMHgzNTBjOWI2NEwsIDB4MzFjZDg2ZDNMLCAweDNjOGVhMDBhTCwgMHgzODRmYmRiZEwsCisgICAweDRjMTFkYjcwTCwgMHg0OGQwYzZjN0wsIDB4NDU5M2UwMWVMLCAweDQxNTJmZGE5TCwKKyAgIDB4NWYxNWFkYWNMLCAweDViZDRiMDFiTCwgMHg1Njk3OTZjMkwsIDB4NTI1NjhiNzVMLAorICAgMHg2YTE5MzZjOEwsIDB4NmVkODJiN2ZMLCAweDYzOWIwZGE2TCwgMHg2NzVhMTAxMUwsCisgICAweDc5MWQ0MDE0TCwgMHg3ZGRjNWRhM0wsIDB4NzA5ZjdiN2FMLCAweDc0NWU2NmNkTCwKKyAgIDB4OTgyM2I2ZTBMLCAweDljZTJhYjU3TCwgMHg5MWExOGQ4ZUwsIDB4OTU2MDkwMzlMLAorICAgMHg4YjI3YzAzY0wsIDB4OGZlNmRkOGJMLCAweDgyYTVmYjUyTCwgMHg4NjY0ZTZlNUwsCisgICAweGJlMmI1YjU4TCwgMHhiYWVhNDZlZkwsIDB4YjdhOTYwMzZMLCAweGIzNjg3ZDgxTCwKKyAgIDB4YWQyZjJkODRMLCAweGE5ZWUzMDMzTCwgMHhhNGFkMTZlYUwsIDB4YTA2YzBiNWRMLAorICAgMHhkNDMyNmQ5MEwsIDB4ZDBmMzcwMjdMLCAweGRkYjA1NmZlTCwgMHhkOTcxNGI0OUwsCisgICAweGM3MzYxYjRjTCwgMHhjM2Y3MDZmYkwsIDB4Y2ViNDIwMjJMLCAweGNhNzUzZDk1TCwKKyAgIDB4ZjIzYTgwMjhMLCAweGY2ZmI5ZDlmTCwgMHhmYmI4YmI0NkwsIDB4ZmY3OWE2ZjFMLAorICAgMHhlMTNlZjZmNEwsIDB4ZTVmZmViNDNMLCAweGU4YmNjZDlhTCwgMHhlYzdkZDAyZEwsCisgICAweDM0ODY3MDc3TCwgMHgzMDQ3NmRjMEwsIDB4M2QwNDRiMTlMLCAweDM5YzU1NmFlTCwKKyAgIDB4Mjc4MjA2YWJMLCAweDIzNDMxYjFjTCwgMHgyZTAwM2RjNUwsIDB4MmFjMTIwNzJMLAorICAgMHgxMjhlOWRjZkwsIDB4MTY0ZjgwNzhMLCAweDFiMGNhNmExTCwgMHgxZmNkYmIxNkwsCisgICAweDAxOGFlYjEzTCwgMHgwNTRiZjZhNEwsIDB4MDgwOGQwN2RMLCAweDBjYzljZGNhTCwKKyAgIDB4Nzg5N2FiMDdMLCAweDdjNTZiNmIwTCwgMHg3MTE1OTA2OUwsIDB4NzVkNDhkZGVMLAorICAgMHg2YjkzZGRkYkwsIDB4NmY1MmMwNmNMLCAweDYyMTFlNmI1TCwgMHg2NmQwZmIwMkwsCisgICAweDVlOWY0NmJmTCwgMHg1YTVlNWIwOEwsIDB4NTcxZDdkZDFMLCAweDUzZGM2MDY2TCwKKyAgIDB4NGQ5YjMwNjNMLCAweDQ5NWEyZGQ0TCwgMHg0NDE5MGIwZEwsIDB4NDBkODE2YmFMLAorICAgMHhhY2E1YzY5N0wsIDB4YTg2NGRiMjBMLCAweGE1MjdmZGY5TCwgMHhhMWU2ZTA0ZUwsCisgICAweGJmYTFiMDRiTCwgMHhiYjYwYWRmY0wsIDB4YjYyMzhiMjVMLCAweGIyZTI5NjkyTCwKKyAgIDB4OGFhZDJiMmZMLCAweDhlNmMzNjk4TCwgMHg4MzJmMTA0MUwsIDB4ODdlZTBkZjZMLAorICAgMHg5OWE5NWRmM0wsIDB4OWQ2ODQwNDRMLCAweDkwMmI2NjlkTCwgMHg5NGVhN2IyYUwsCisgICAweGUwYjQxZGU3TCwgMHhlNDc1MDA1MEwsIDB4ZTkzNjI2ODlMLCAweGVkZjczYjNlTCwKKyAgIDB4ZjNiMDZiM2JMLCAweGY3NzE3NjhjTCwgMHhmYTMyNTA1NUwsIDB4ZmVmMzRkZTJMLAorICAgMHhjNmJjZjA1ZkwsIDB4YzI3ZGVkZThMLCAweGNmM2VjYjMxTCwgMHhjYmZmZDY4NkwsCisgICAweGQ1Yjg4NjgzTCwgMHhkMTc5OWIzNEwsIDB4ZGMzYWJkZWRMLCAweGQ4ZmJhMDVhTCwKKyAgIDB4NjkwY2UwZWVMLCAweDZkY2RmZDU5TCwgMHg2MDhlZGI4MEwsIDB4NjQ0ZmM2MzdMLAorICAgMHg3YTA4OTYzMkwsIDB4N2VjOThiODVMLCAweDczOGFhZDVjTCwgMHg3NzRiYjBlYkwsCisgICAweDRmMDQwZDU2TCwgMHg0YmM1MTBlMUwsIDB4NDY4NjM2MzhMLCAweDQyNDcyYjhmTCwKKyAgIDB4NWMwMDdiOGFMLCAweDU4YzE2NjNkTCwgMHg1NTgyNDBlNEwsIDB4NTE0MzVkNTNMLAorICAgMHgyNTFkM2I5ZUwsIDB4MjFkYzI2MjlMLCAweDJjOWYwMGYwTCwgMHgyODVlMWQ0N0wsCisgICAweDM2MTk0ZDQyTCwgMHgzMmQ4NTBmNUwsIDB4M2Y5Yjc2MmNMLCAweDNiNWE2YjliTCwKKyAgIDB4MDMxNWQ2MjZMLCAweDA3ZDRjYjkxTCwgMHgwYTk3ZWQ0OEwsIDB4MGU1NmYwZmZMLAorICAgMHgxMDExYTBmYUwsIDB4MTRkMGJkNGRMLCAweDE5OTM5Yjk0TCwgMHgxZDUyODYyM0wsCisgICAweGYxMmY1NjBlTCwgMHhmNWVlNGJiOUwsIDB4ZjhhZDZkNjBMLCAweGZjNmM3MGQ3TCwKKyAgIDB4ZTIyYjIwZDJMLCAweGU2ZWEzZDY1TCwgMHhlYmE5MWJiY0wsIDB4ZWY2ODA2MGJMLAorICAgMHhkNzI3YmJiNkwsIDB4ZDNlNmE2MDFMLCAweGRlYTU4MGQ4TCwgMHhkYTY0OWQ2ZkwsCisgICAweGM0MjNjZDZhTCwgMHhjMGUyZDBkZEwsIDB4Y2RhMWY2MDRMLCAweGM5NjBlYmIzTCwKKyAgIDB4YmQzZThkN2VMLCAweGI5ZmY5MGM5TCwgMHhiNGJjYjYxMEwsIDB4YjA3ZGFiYTdMLAorICAgMHhhZTNhZmJhMkwsIDB4YWFmYmU2MTVMLCAweGE3YjhjMGNjTCwgMHhhMzc5ZGQ3YkwsCisgICAweDliMzY2MGM2TCwgMHg5ZmY3N2Q3MUwsIDB4OTJiNDViYThMLCAweDk2NzU0NjFmTCwKKyAgIDB4ODgzMjE2MWFMLCAweDhjZjMwYmFkTCwgMHg4MWIwMmQ3NEwsIDB4ODU3MTMwYzNMLAorICAgMHg1ZDhhOTA5OUwsIDB4NTk0YjhkMmVMLCAweDU0MDhhYmY3TCwgMHg1MGM5YjY0MEwsCisgICAweDRlOGVlNjQ1TCwgMHg0YTRmZmJmMkwsIDB4NDcwY2RkMmJMLCAweDQzY2RjMDljTCwKKyAgIDB4N2I4MjdkMjFMLCAweDdmNDM2MDk2TCwgMHg3MjAwNDY0ZkwsIDB4NzZjMTViZjhMLAorICAgMHg2ODg2MGJmZEwsIDB4NmM0NzE2NGFMLCAweDYxMDQzMDkzTCwgMHg2NWM1MmQyNEwsCisgICAweDExOWI0YmU5TCwgMHgxNTVhNTY1ZUwsIDB4MTgxOTcwODdMLCAweDFjZDg2ZDMwTCwKKyAgIDB4MDI5ZjNkMzVMLCAweDA2NWUyMDgyTCwgMHgwYjFkMDY1YkwsIDB4MGZkYzFiZWNMLAorICAgMHgzNzkzYTY1MUwsIDB4MzM1MmJiZTZMLCAweDNlMTE5ZDNmTCwgMHgzYWQwODA4OEwsCisgICAweDI0OTdkMDhkTCwgMHgyMDU2Y2QzYUwsIDB4MmQxNWViZTNMLCAweDI5ZDRmNjU0TCwKKyAgIDB4YzVhOTI2NzlMLCAweGMxNjgzYmNlTCwgMHhjYzJiMWQxN0wsIDB4YzhlYTAwYTBMLAorICAgMHhkNmFkNTBhNUwsIDB4ZDI2YzRkMTJMLCAweGRmMmY2YmNiTCwgMHhkYmVlNzY3Y0wsCisgICAweGUzYTFjYmMxTCwgMHhlNzYwZDY3NkwsIDB4ZWEyM2YwYWZMLCAweGVlZTJlZDE4TCwKKyAgIDB4ZjBhNWJkMWRMLCAweGY0NjRhMGFhTCwgMHhmOTI3ODY3M0wsIDB4ZmRlNjliYzRMLAorICAgMHg4OWI4ZmQwOUwsIDB4OGQ3OWUwYmVMLCAweDgwM2FjNjY3TCwgMHg4NGZiZGJkMEwsCisgICAweDlhYmM4YmQ1TCwgMHg5ZTdkOTY2MkwsIDB4OTMzZWIwYmJMLCAweDk3ZmZhZDBjTCwKKyAgIDB4YWZiMDEwYjFMLCAweGFiNzEwZDA2TCwgMHhhNjMyMmJkZkwsIDB4YTJmMzM2NjhMLAorICAgMHhiY2I0NjY2ZEwsIDB4Yjg3NTdiZGFMLCAweGI1MzY1ZDAzTCwgMHhiMWY3NDBiNEwKK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmN0YWJsZS5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZGVjb21wcmVzcy5jIGIvZGVjb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMmIwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9kZWNvbXByZXNzLmMKQEAgLTAsMCArMSw2MzYgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIERlY29tcHJlc3Npb24gbWFjaGluZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcHJlc3MuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLQorICBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGJ6aXAyIGFuZC9vciBsaWJiemlwMiwgYSBwcm9ncmFtIGFuZAorICBsaWJyYXJ5IGZvciBsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCisgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEp1bGlhbiBSIFNld2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKyAgMy4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCisgIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICAgICBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTCisgIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgSnVsaWFuIFNld2FyZCwgR3VpbGRmb3JkLCBTdXJyZXksIFVLLgorICBqc2V3YXJkQGFjbS5vcmcKKyAgYnppcDIvbGliYnppcDIgdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4CisKKyAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIChhdCBsZWFzdCkgdGhlIHdvcmsgb2Y6CisgICAgIE1pa2UgQnVycm93cworICAgICBEYXZpZCBXaGVlbGVyCisgICAgIFBldGVyIEZlbndpY2sKKyAgICAgQWxpc3RhaXIgTW9mZmF0CisgICAgIFJhZGZvcmQgTmVhbAorICAgICBJYW4gSC4gV2l0dGVuCisgICAgIFJvYmVydCBTZWRnZXdpY2sKKyAgICAgSm9uIEwuIEJlbnRsZXkKKworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KKy0tKi8KKworCisjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBtYWtlTWFwc19kICggRFN0YXRlKiBzICkKK3sKKyAgIEludDMyIGk7CisgICBzLT5uSW5Vc2UgPSAwOworICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgaWYgKHMtPmluVXNlW2ldKSB7CisgICAgICAgICBzLT5zZXFUb1Vuc2VxW3MtPm5JblVzZV0gPSBpOworICAgICAgICAgcy0+bkluVXNlKys7CisgICAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBSRVRVUk4ocnJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7IHJldFZhbCA9IHJycjsgZ290byBzYXZlX3N0YXRlX2FuZF9yZXR1cm47IH07CisKKyNkZWZpbmUgR0VUX0JJVFMobGxsLHZ2dixubm4pICAgICAgICAgICAgICAgICAgICAgXAorICAgY2FzZSBsbGw6IHMtPnN0YXRlID0gbGxsOyAgICAgICAgICAgICAgICAgICAgICBcCisgICB3aGlsZSAoVHJ1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChzLT5ic0xpdmUgPj0gbm5uKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgVUludDMyIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB2ID0gKHMtPmJzQnVmZiA+PiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAocy0+YnNMaXZlLW5ubikpICYgKCgxIDw8IG5ubiktMSk7ICAgXAorICAgICAgICAgcy0+YnNMaXZlIC09IG5ubjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB2dnYgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgUkVUVVJOKEJaX09LKTsgIFwKKyAgICAgIHMtPmJzQnVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgPSAocy0+YnNCdWZmIDw8IDgpIHwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICgoVUludDMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKCooKFVDaGFyKikocy0+c3RybS0+bmV4dF9pbikpKSk7ICAgXAorICAgICAgcy0+YnNMaXZlICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzLT5zdHJtLT5uZXh0X2luKys7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHMtPnN0cm0tPmF2YWlsX2luLS07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcy0+c3RybS0+dG90YWxfaW4rKzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNkZWZpbmUgR0VUX1VDSEFSKGxsbCx1dXUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgR0VUX0JJVFMobGxsLHV1dSw4KQorCisjZGVmaW5lIEdFVF9CSVQobGxsLHV1dSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEdFVF9CSVRTKGxsbCx1dXUsMSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBHRVRfTVRGX1ZBTChsYWJlbDEsbGFiZWwyLGx2YWwpICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGlmIChncm91cFBvcyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ3JvdXBObysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBncm91cFBvcyA9IEJaX0dfU0laRTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGdTZWwgPSBzLT5zZWxlY3Rvcltncm91cE5vXTsgICAgICAgICAgICAgICAgXAorICAgICAgZ01pbmxlbiA9IHMtPm1pbkxlbnNbZ1NlbF07ICAgICAgICAgICAgICAgICBcCisgICAgICBnTGltaXQgPSAmKHMtPmxpbWl0W2dTZWxdWzBdKTsgICAgICAgICAgICAgIFwKKyAgICAgIGdQZXJtID0gJihzLT5wZXJtW2dTZWxdWzBdKTsgICAgICAgICAgICAgICAgXAorICAgICAgZ0Jhc2UgPSAmKHMtPmJhc2VbZ1NlbF1bMF0pOyAgICAgICAgICAgICAgICBcCisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGdyb3VwUG9zLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgem4gPSBnTWlubGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBHRVRfQklUUyhsYWJlbDEsIHp2ZWMsIHpuKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgIHdoaWxlICh6dmVjID4gZ0xpbWl0W3puXSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgem4rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBHRVRfQklUKGxhYmVsMiwgemopOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHp2ZWMgPSAoenZlYyA8PCAxKSB8IHpqOyAgICAgICAgICAgICAgICAgICAgXAorICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBsdmFsID0gZ1Blcm1benZlYyAtIGdCYXNlW3puXV07ICAgICAgICAgICAgICAgIFwKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitJbnQzMiBkZWNvbXByZXNzICggRFN0YXRlKiBzICkKK3sKKyAgIFVDaGFyICAgICAgdWM7CisgICBJbnQzMiAgICAgIHJldFZhbDsKKyAgIEludDMyICAgICAgbWluTGVuLCBtYXhMZW47CisgICBiel9zdHJlYW0qIHN0cm0gPSBzLT5zdHJtOworCisgICAvKiBzdHVmZiB0aGF0IG5lZWRzIHRvIGJlIHNhdmVkL3Jlc3RvcmVkICovCisgICBJbnQzMiBpIDsKKyAgIEludDMyICBqOworICAgSW50MzIgIHQ7CisgICBJbnQzMiAgYWxwaGFTaXplOworICAgSW50MzIgIG5Hcm91cHM7CisgICBJbnQzMiAgblNlbGVjdG9yczsKKyAgIEludDMyICBFT0I7CisgICBJbnQzMiAgZ3JvdXBObzsKKyAgIEludDMyICBncm91cFBvczsKKyAgIEludDMyICBuZXh0U3ltOworICAgSW50MzIgIG5ibG9ja01BWDsKKyAgIEludDMyICBuYmxvY2s7CisgICBJbnQzMiAgZXM7CisgICBJbnQzMiAgTjsKKyAgIEludDMyICBjdXJyOworICAgSW50MzIgIHp0OworICAgSW50MzIgIHpuOyAKKyAgIEludDMyICB6dmVjOworICAgSW50MzIgIHpqOworICAgSW50MzIgIGdTZWw7CisgICBJbnQzMiAgZ01pbmxlbjsKKyAgIEludDMyKiBnTGltaXQ7CisgICBJbnQzMiogZ0Jhc2U7CisgICBJbnQzMiogZ1Blcm07CisKKyAgIGlmIChzLT5zdGF0ZSA9PSBCWl9YX01BR0lDXzEpIHsKKyAgICAgIC8qaW5pdGlhbGlzZSB0aGUgc2F2ZSBhcmVhKi8KKyAgICAgIHMtPnNhdmVfaSAgICAgICAgICAgPSAwOworICAgICAgcy0+c2F2ZV9qICAgICAgICAgICA9IDA7CisgICAgICBzLT5zYXZlX3QgICAgICAgICAgID0gMDsKKyAgICAgIHMtPnNhdmVfYWxwaGFTaXplICAgPSAwOworICAgICAgcy0+c2F2ZV9uR3JvdXBzICAgICA9IDA7CisgICAgICBzLT5zYXZlX25TZWxlY3RvcnMgID0gMDsKKyAgICAgIHMtPnNhdmVfRU9CICAgICAgICAgPSAwOworICAgICAgcy0+c2F2ZV9ncm91cE5vICAgICA9IDA7CisgICAgICBzLT5zYXZlX2dyb3VwUG9zICAgID0gMDsKKyAgICAgIHMtPnNhdmVfbmV4dFN5bSAgICAgPSAwOworICAgICAgcy0+c2F2ZV9uYmxvY2tNQVggICA9IDA7CisgICAgICBzLT5zYXZlX25ibG9jayAgICAgID0gMDsKKyAgICAgIHMtPnNhdmVfZXMgICAgICAgICAgPSAwOworICAgICAgcy0+c2F2ZV9OICAgICAgICAgICA9IDA7CisgICAgICBzLT5zYXZlX2N1cnIgICAgICAgID0gMDsKKyAgICAgIHMtPnNhdmVfenQgICAgICAgICAgPSAwOworICAgICAgcy0+c2F2ZV96biAgICAgICAgICA9IDA7CisgICAgICBzLT5zYXZlX3p2ZWMgICAgICAgID0gMDsKKyAgICAgIHMtPnNhdmVfemogICAgICAgICAgPSAwOworICAgICAgcy0+c2F2ZV9nU2VsICAgICAgICA9IDA7CisgICAgICBzLT5zYXZlX2dNaW5sZW4gICAgID0gMDsKKyAgICAgIHMtPnNhdmVfZ0xpbWl0ICAgICAgPSBOVUxMOworICAgICAgcy0+c2F2ZV9nQmFzZSAgICAgICA9IE5VTEw7CisgICAgICBzLT5zYXZlX2dQZXJtICAgICAgID0gTlVMTDsKKyAgIH0KKworICAgLypyZXN0b3JlIGZyb20gdGhlIHNhdmUgYXJlYSovCisgICBpICAgICAgICAgICA9IHMtPnNhdmVfaTsKKyAgIGogICAgICAgICAgID0gcy0+c2F2ZV9qOworICAgdCAgICAgICAgICAgPSBzLT5zYXZlX3Q7CisgICBhbHBoYVNpemUgICA9IHMtPnNhdmVfYWxwaGFTaXplOworICAgbkdyb3VwcyAgICAgPSBzLT5zYXZlX25Hcm91cHM7CisgICBuU2VsZWN0b3JzICA9IHMtPnNhdmVfblNlbGVjdG9yczsKKyAgIEVPQiAgICAgICAgID0gcy0+c2F2ZV9FT0I7CisgICBncm91cE5vICAgICA9IHMtPnNhdmVfZ3JvdXBObzsKKyAgIGdyb3VwUG9zICAgID0gcy0+c2F2ZV9ncm91cFBvczsKKyAgIG5leHRTeW0gICAgID0gcy0+c2F2ZV9uZXh0U3ltOworICAgbmJsb2NrTUFYICAgPSBzLT5zYXZlX25ibG9ja01BWDsKKyAgIG5ibG9jayAgICAgID0gcy0+c2F2ZV9uYmxvY2s7CisgICBlcyAgICAgICAgICA9IHMtPnNhdmVfZXM7CisgICBOICAgICAgICAgICA9IHMtPnNhdmVfTjsKKyAgIGN1cnIgICAgICAgID0gcy0+c2F2ZV9jdXJyOworICAgenQgICAgICAgICAgPSBzLT5zYXZlX3p0OworICAgem4gICAgICAgICAgPSBzLT5zYXZlX3puOyAKKyAgIHp2ZWMgICAgICAgID0gcy0+c2F2ZV96dmVjOworICAgemogICAgICAgICAgPSBzLT5zYXZlX3pqOworICAgZ1NlbCAgICAgICAgPSBzLT5zYXZlX2dTZWw7CisgICBnTWlubGVuICAgICA9IHMtPnNhdmVfZ01pbmxlbjsKKyAgIGdMaW1pdCAgICAgID0gcy0+c2F2ZV9nTGltaXQ7CisgICBnQmFzZSAgICAgICA9IHMtPnNhdmVfZ0Jhc2U7CisgICBnUGVybSAgICAgICA9IHMtPnNhdmVfZ1Blcm07CisKKyAgIHJldFZhbCA9IEJaX09LOworCisgICBzd2l0Y2ggKHMtPnN0YXRlKSB7CisKKyAgICAgIEdFVF9VQ0hBUihCWl9YX01BR0lDXzEsIHVjKTsKKyAgICAgIGlmICh1YyAhPSAnQicpIFJFVFVSTihCWl9EQVRBX0VSUk9SX01BR0lDKTsKKworICAgICAgR0VUX1VDSEFSKEJaX1hfTUFHSUNfMiwgdWMpOworICAgICAgaWYgKHVjICE9ICdaJykgUkVUVVJOKEJaX0RBVEFfRVJST1JfTUFHSUMpOworCisgICAgICBHRVRfVUNIQVIoQlpfWF9NQUdJQ18zLCB1YykKKyAgICAgIGlmICh1YyAhPSAnaCcpIFJFVFVSTihCWl9EQVRBX0VSUk9SX01BR0lDKTsKKworICAgICAgR0VUX0JJVFMoQlpfWF9NQUdJQ180LCBzLT5ibG9ja1NpemUxMDBrLCA4KQorICAgICAgaWYgKHMtPmJsb2NrU2l6ZTEwMGsgPCAnMScgfHwgCisgICAgICAgICAgcy0+YmxvY2tTaXplMTAwayA+ICc5JykgUkVUVVJOKEJaX0RBVEFfRVJST1JfTUFHSUMpOworICAgICAgcy0+YmxvY2tTaXplMTAwayAtPSAnMCc7CisKKyAgICAgIGlmIChzLT5zbWFsbERlY29tcHJlc3MpIHsKKyAgICAgICAgIHMtPmxsMTYgPSBCWkFMTE9DKCBzLT5ibG9ja1NpemUxMDBrICogMTAwMDAwICogc2l6ZW9mKFVJbnQxNikgKTsKKyAgICAgICAgIHMtPmxsNCAgPSBCWkFMTE9DKCAKKyAgICAgICAgICAgICAgICAgICAgICAoKDEgKyBzLT5ibG9ja1NpemUxMDBrICogMTAwMDAwKSA+PiAxKSAqIHNpemVvZihVQ2hhcikgCisgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgIGlmIChzLT5sbDE2ID09IE5VTEwgfHwgcy0+bGw0ID09IE5VTEwpIFJFVFVSTihCWl9NRU1fRVJST1IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIHMtPnR0ICA9IEJaQUxMT0MoIHMtPmJsb2NrU2l6ZTEwMGsgKiAxMDAwMDAgKiBzaXplb2YoSW50MzIpICk7CisgICAgICAgICBpZiAocy0+dHQgPT0gTlVMTCkgUkVUVVJOKEJaX01FTV9FUlJPUik7CisgICAgICB9CisKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0JMS0hEUl8xLCB1Yyk7CisKKyAgICAgIGlmICh1YyA9PSAweDE3KSBnb3RvIGVuZGhkcl8yOworICAgICAgaWYgKHVjICE9IDB4MzEpIFJFVFVSTihCWl9EQVRBX0VSUk9SKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0JMS0hEUl8yLCB1Yyk7CisgICAgICBpZiAodWMgIT0gMHg0MSkgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworICAgICAgR0VUX1VDSEFSKEJaX1hfQkxLSERSXzMsIHVjKTsKKyAgICAgIGlmICh1YyAhPSAweDU5KSBSRVRVUk4oQlpfREFUQV9FUlJPUik7CisgICAgICBHRVRfVUNIQVIoQlpfWF9CTEtIRFJfNCwgdWMpOworICAgICAgaWYgKHVjICE9IDB4MjYpIFJFVFVSTihCWl9EQVRBX0VSUk9SKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0JMS0hEUl81LCB1Yyk7CisgICAgICBpZiAodWMgIT0gMHg1MykgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworICAgICAgR0VUX1VDSEFSKEJaX1hfQkxLSERSXzYsIHVjKTsKKyAgICAgIGlmICh1YyAhPSAweDU5KSBSRVRVUk4oQlpfREFUQV9FUlJPUik7CisKKyAgICAgIHMtPmN1cnJCbG9ja05vKys7CisgICAgICBpZiAocy0+dmVyYm9zaXR5ID49IDIpCisgICAgICAgICBWUHJpbnRmMSAoICJcbiAgICBbJWQ6IGh1ZmYrbXRmICIsIHMtPmN1cnJCbG9ja05vICk7CisgCisgICAgICBzLT5zdG9yZWRCbG9ja0NSQyA9IDA7CisgICAgICBHRVRfVUNIQVIoQlpfWF9CQ1JDXzEsIHVjKTsKKyAgICAgIHMtPnN0b3JlZEJsb2NrQ1JDID0gKHMtPnN0b3JlZEJsb2NrQ1JDIDw8IDgpIHwgKChVSW50MzIpdWMpOworICAgICAgR0VUX1VDSEFSKEJaX1hfQkNSQ18yLCB1Yyk7CisgICAgICBzLT5zdG9yZWRCbG9ja0NSQyA9IChzLT5zdG9yZWRCbG9ja0NSQyA8PCA4KSB8ICgoVUludDMyKXVjKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0JDUkNfMywgdWMpOworICAgICAgcy0+c3RvcmVkQmxvY2tDUkMgPSAocy0+c3RvcmVkQmxvY2tDUkMgPDwgOCkgfCAoKFVJbnQzMil1Yyk7CisgICAgICBHRVRfVUNIQVIoQlpfWF9CQ1JDXzQsIHVjKTsKKyAgICAgIHMtPnN0b3JlZEJsb2NrQ1JDID0gKHMtPnN0b3JlZEJsb2NrQ1JDIDw8IDgpIHwgKChVSW50MzIpdWMpOworCisgICAgICBHRVRfQklUUyhCWl9YX1JBTkRCSVQsIHMtPmJsb2NrUmFuZG9taXNlZCwgMSk7CisKKyAgICAgIHMtPm9yaWdQdHIgPSAwOworICAgICAgR0VUX1VDSEFSKEJaX1hfT1JJR1BUUl8xLCB1Yyk7CisgICAgICBzLT5vcmlnUHRyID0gKHMtPm9yaWdQdHIgPDwgOCkgfCAoKEludDMyKXVjKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX09SSUdQVFJfMiwgdWMpOworICAgICAgcy0+b3JpZ1B0ciA9IChzLT5vcmlnUHRyIDw8IDgpIHwgKChJbnQzMil1Yyk7CisgICAgICBHRVRfVUNIQVIoQlpfWF9PUklHUFRSXzMsIHVjKTsKKyAgICAgIHMtPm9yaWdQdHIgPSAocy0+b3JpZ1B0ciA8PCA4KSB8ICgoSW50MzIpdWMpOworCisgICAgICAvKi0tLSBSZWNlaXZlIHRoZSBtYXBwaW5nIHRhYmxlIC0tLSovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgR0VUX0JJVChCWl9YX01BUFBJTkdfMSwgdWMpOworICAgICAgICAgaWYgKHVjID09IDEpIAorICAgICAgICAgICAgcy0+aW5Vc2UxNltpXSA9IFRydWU7IGVsc2UgCisgICAgICAgICAgICBzLT5pblVzZTE2W2ldID0gRmFsc2U7CisgICAgICB9CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgcy0+aW5Vc2VbaV0gPSBGYWxzZTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICBpZiAocy0+aW5Vc2UxNltpXSkKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICBHRVRfQklUKEJaX1hfTUFQUElOR18yLCB1Yyk7CisgICAgICAgICAgICAgICBpZiAodWMgPT0gMSkgcy0+aW5Vc2VbaSAqIDE2ICsgal0gPSBUcnVlOworICAgICAgICAgICAgfQorICAgICAgbWFrZU1hcHNfZCAoIHMgKTsKKyAgICAgIGFscGhhU2l6ZSA9IHMtPm5JblVzZSsyOworCisgICAgICAvKi0tLSBOb3cgdGhlIHNlbGVjdG9ycyAtLS0qLworICAgICAgR0VUX0JJVFMoQlpfWF9TRUxFQ1RPUl8xLCBuR3JvdXBzLCAzKTsKKyAgICAgIEdFVF9CSVRTKEJaX1hfU0VMRUNUT1JfMiwgblNlbGVjdG9ycywgMTUpOworICAgICAgZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeworICAgICAgICAgaiA9IDA7CisgICAgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgICAgR0VUX0JJVChCWl9YX1NFTEVDVE9SXzMsIHVjKTsKKyAgICAgICAgICAgIGlmICh1YyA9PSAwKSBicmVhazsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGlmIChqID4gNSkgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworICAgICAgICAgfQorICAgICAgICAgcy0+c2VsZWN0b3JNdGZbaV0gPSBqOworICAgICAgfQorCisgICAgICAvKi0tLSBVbmRvIHRoZSBNVEYgdmFsdWVzIGZvciB0aGUgc2VsZWN0b3JzLiAtLS0qLworICAgICAgeworICAgICAgICAgVUNoYXIgcG9zW0JaX05fR1JPVVBTXSwgdG1wLCB2OworICAgICAgICAgZm9yICh2ID0gMDsgdiA8IG5Hcm91cHM7IHYrKykgcG9zW3ZdID0gdjsKKyAgIAorICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeworICAgICAgICAgICAgdiA9IHMtPnNlbGVjdG9yTXRmW2ldOworICAgICAgICAgICAgdG1wID0gcG9zW3ZdOworICAgICAgICAgICAgd2hpbGUgKHYgPiAwKSB7IHBvc1t2XSA9IHBvc1t2LTFdOyB2LS07IH0KKyAgICAgICAgICAgIHBvc1swXSA9IHRtcDsKKyAgICAgICAgICAgIHMtPnNlbGVjdG9yW2ldID0gdG1wOworICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKi0tLSBOb3cgdGhlIGNvZGluZyB0YWJsZXMgLS0tKi8KKyAgICAgIGZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKyAgICAgICAgIEdFVF9CSVRTKEJaX1hfQ09ESU5HXzEsIGN1cnIsIDUpOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB3aGlsZSAoVHJ1ZSkgeworICAgICAgICAgICAgICAgaWYgKGN1cnIgPCAxIHx8IGN1cnIgPiAyMCkgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworICAgICAgICAgICAgICAgR0VUX0JJVChCWl9YX0NPRElOR18yLCB1Yyk7CisgICAgICAgICAgICAgICBpZiAodWMgPT0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICBHRVRfQklUKEJaX1hfQ09ESU5HXzMsIHVjKTsKKyAgICAgICAgICAgICAgIGlmICh1YyA9PSAwKSBjdXJyKys7IGVsc2UgY3Vyci0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bGVuW3RdW2ldID0gY3VycjsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyotLS0gQ3JlYXRlIHRoZSBIdWZmbWFuIGRlY29kaW5nIHRhYmxlcyAtLS0qLworICAgICAgZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykgeworICAgICAgICAgbWluTGVuID0gMzI7CisgICAgICAgICBtYXhMZW4gPSAwOworICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+bGVuW3RdW2ldID4gbWF4TGVuKSBtYXhMZW4gPSBzLT5sZW5bdF1baV07CisgICAgICAgICAgICBpZiAocy0+bGVuW3RdW2ldIDwgbWluTGVuKSBtaW5MZW4gPSBzLT5sZW5bdF1baV07CisgICAgICAgICB9CisgICAgICAgICBoYkNyZWF0ZURlY29kZVRhYmxlcyAoIAorICAgICAgICAgICAgJihzLT5saW1pdFt0XVswXSksIAorICAgICAgICAgICAgJihzLT5iYXNlW3RdWzBdKSwgCisgICAgICAgICAgICAmKHMtPnBlcm1bdF1bMF0pLCAKKyAgICAgICAgICAgICYocy0+bGVuW3RdWzBdKSwKKyAgICAgICAgICAgIG1pbkxlbiwgbWF4TGVuLCBhbHBoYVNpemUKKyAgICAgICAgICk7CisgICAgICAgICBzLT5taW5MZW5zW3RdID0gbWluTGVuOworICAgICAgfQorCisgICAgICAvKi0tLSBOb3cgdGhlIE1URiB2YWx1ZXMgLS0tKi8KKworICAgICAgRU9CICAgICAgPSBzLT5uSW5Vc2UrMTsKKyAgICAgIG5ibG9ja01BWCA9IDEwMDAwMCAqIHMtPmJsb2NrU2l6ZTEwMGs7CisgICAgICBncm91cE5vICA9IC0xOworICAgICAgZ3JvdXBQb3MgPSAwOworCisgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSBzLT51bnpmdGFiW2ldID0gMDsKKworICAgICAgLyotLSBNVEYgaW5pdCAtLSovCisgICAgICB7CisgICAgICAgICBJbnQzMiBpaSwgamosIGtrOworICAgICAgICAga2sgPSBNVEZBX1NJWkUtMTsKKyAgICAgICAgIGZvciAoaWkgPSAyNTYgLyBNVEZMX1NJWkUgLSAxOyBpaSA+PSAwOyBpaS0tKSB7CisgICAgICAgICAgICBmb3IgKGpqID0gTVRGTF9TSVpFLTE7IGpqID49IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgIHMtPm10ZmFba2tdID0gKFVDaGFyKShpaSAqIE1URkxfU0laRSArIGpqKTsKKyAgICAgICAgICAgICAgIGtrLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5tdGZiYXNlW2lpXSA9IGtrICsgMTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8qLS0gZW5kIE1URiBpbml0IC0tKi8KKworICAgICAgbmJsb2NrID0gMDsKKworICAgICAgR0VUX01URl9WQUwoQlpfWF9NVEZfMSwgQlpfWF9NVEZfMiwgbmV4dFN5bSk7CisKKyAgICAgIHdoaWxlIChUcnVlKSB7CisKKyAgICAgICAgIGlmIChuZXh0U3ltID09IEVPQikgYnJlYWs7CisKKyAgICAgICAgIGlmIChuZXh0U3ltID09IEJaX1JVTkEgfHwgbmV4dFN5bSA9PSBCWl9SVU5CKSB7CisKKyAgICAgICAgICAgIGVzID0gLTE7CisgICAgICAgICAgICBOID0gMTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgIGlmIChuZXh0U3ltID09IEJaX1JVTkEpIGVzID0gZXMgKyAoMCsxKSAqIE47IGVsc2UKKyAgICAgICAgICAgICAgIGlmIChuZXh0U3ltID09IEJaX1JVTkIpIGVzID0gZXMgKyAoMSsxKSAqIE47CisgICAgICAgICAgICAgICBOID0gTiAqIDI7CisgICAgICAgICAgICAgICBHRVRfTVRGX1ZBTChCWl9YX01URl8zLCBCWl9YX01URl80LCBuZXh0U3ltKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U3ltID09IEJaX1JVTkEgfHwgbmV4dFN5bSA9PSBCWl9SVU5CKTsKKworICAgICAgICAgICAgZXMrKzsKKyAgICAgICAgICAgIHVjID0gcy0+c2VxVG9VbnNlcVsgcy0+bXRmYVtzLT5tdGZiYXNlWzBdXSBdOworICAgICAgICAgICAgcy0+dW56ZnRhYlt1Y10gKz0gZXM7CisKKyAgICAgICAgICAgIGlmIChzLT5zbWFsbERlY29tcHJlc3MpCisgICAgICAgICAgICAgICB3aGlsZSAoZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICBzLT5sbDE2W25ibG9ja10gPSAoVUludDE2KXVjOworICAgICAgICAgICAgICAgICAgbmJsb2NrKys7CisgICAgICAgICAgICAgICAgICBlcy0tOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgd2hpbGUgKGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgcy0+dHRbbmJsb2NrXSA9IChVSW50MzIpdWM7CisgICAgICAgICAgICAgICAgICBuYmxvY2srKzsKKyAgICAgICAgICAgICAgICAgIGVzLS07CisgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAobmJsb2NrID4gbmJsb2NrTUFYKSBSRVRVUk4oQlpfREFUQV9FUlJPUik7CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKG5ibG9jayA+IG5ibG9ja01BWCkgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworCisgICAgICAgICAgICAvKi0tIHVjID0gTVRGICggbmV4dFN5bS0xICkgLS0qLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgSW50MzIgaWksIGpqLCBraywgcHAsIGxubywgb2ZmOworICAgICAgICAgICAgICAgVUludDMyIG5uOworICAgICAgICAgICAgICAgbm4gPSAoVUludDMyKShuZXh0U3ltIC0gMSk7CisKKyAgICAgICAgICAgICAgIGlmIChubiA8IE1URkxfU0laRSkgeworICAgICAgICAgICAgICAgICAgLyogYXZvaWQgZ2VuZXJhbC1jYXNlIGV4cGVuc2UgKi8KKyAgICAgICAgICAgICAgICAgIHBwID0gcy0+bXRmYmFzZVswXTsKKyAgICAgICAgICAgICAgICAgIHVjID0gcy0+bXRmYVtwcCtubl07CisgICAgICAgICAgICAgICAgICB3aGlsZSAobm4gPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICBJbnQzMiB6ID0gcHArbm47CisgICAgICAgICAgICAgICAgICAgICBzLT5tdGZhWyh6KSAgXSA9IHMtPm10ZmFbKHopLTFdOworICAgICAgICAgICAgICAgICAgICAgcy0+bXRmYVsoeiktMV0gPSBzLT5tdGZhWyh6KS0yXTsKKyAgICAgICAgICAgICAgICAgICAgIHMtPm10ZmFbKHopLTJdID0gcy0+bXRmYVsoeiktM107CisgICAgICAgICAgICAgICAgICAgICBzLT5tdGZhWyh6KS0zXSA9IHMtPm10ZmFbKHopLTRdOworICAgICAgICAgICAgICAgICAgICAgbm4gLT0gNDsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHdoaWxlIChubiA+IDApIHsgCisgICAgICAgICAgICAgICAgICAgICBzLT5tdGZhWyhwcCtubildID0gcy0+bXRmYVsocHArbm4pLTFdOyBubi0tOyAKKyAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICBzLT5tdGZhW3BwXSA9IHVjOworICAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgICAvKiBnZW5lcmFsIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgIGxubyA9IG5uIC8gTVRGTF9TSVpFOworICAgICAgICAgICAgICAgICAgb2ZmID0gbm4gJSBNVEZMX1NJWkU7CisgICAgICAgICAgICAgICAgICBwcCA9IHMtPm10ZmJhc2VbbG5vXSArIG9mZjsKKyAgICAgICAgICAgICAgICAgIHVjID0gcy0+bXRmYVtwcF07CisgICAgICAgICAgICAgICAgICB3aGlsZSAocHAgPiBzLT5tdGZiYXNlW2xub10pIHsgCisgICAgICAgICAgICAgICAgICAgICBzLT5tdGZhW3BwXSA9IHMtPm10ZmFbcHAtMV07IHBwLS07IAorICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgIHMtPm10ZmJhc2VbbG5vXSsrOworICAgICAgICAgICAgICAgICAgd2hpbGUgKGxubyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIHMtPm10ZmJhc2VbbG5vXS0tOworICAgICAgICAgICAgICAgICAgICAgcy0+bXRmYVtzLT5tdGZiYXNlW2xub11dIAorICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5tdGZhW3MtPm10ZmJhc2VbbG5vLTFdICsgTVRGTF9TSVpFIC0gMV07CisgICAgICAgICAgICAgICAgICAgICBsbm8tLTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHMtPm10ZmJhc2VbMF0tLTsKKyAgICAgICAgICAgICAgICAgIHMtPm10ZmFbcy0+bXRmYmFzZVswXV0gPSB1YzsKKyAgICAgICAgICAgICAgICAgIGlmIChzLT5tdGZiYXNlWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgIGtrID0gTVRGQV9TSVpFLTE7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMjU2IC8gTVRGTF9TSVpFLTE7IGlpID49IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoamogPSBNVEZMX1NJWkUtMTsgamogPj0gMDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXRmYVtra10gPSBzLT5tdGZhW3MtPm10ZmJhc2VbaWldICsgampdOworICAgICAgICAgICAgICAgICAgICAgICAgICAga2stLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm10ZmJhc2VbaWldID0ga2sgKyAxOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyotLSBlbmQgdWMgPSBNVEYgKCBuZXh0U3ltLTEgKSAtLSovCisKKyAgICAgICAgICAgIHMtPnVuemZ0YWJbcy0+c2VxVG9VbnNlcVt1Y11dKys7CisgICAgICAgICAgICBpZiAocy0+c21hbGxEZWNvbXByZXNzKQorICAgICAgICAgICAgICAgcy0+bGwxNltuYmxvY2tdID0gKFVJbnQxNikocy0+c2VxVG9VbnNlcVt1Y10pOyBlbHNlCisgICAgICAgICAgICAgICBzLT50dFtuYmxvY2tdICAgPSAoVUludDMyKShzLT5zZXFUb1Vuc2VxW3VjXSk7CisgICAgICAgICAgICBuYmxvY2srKzsKKworICAgICAgICAgICAgR0VUX01URl9WQUwoQlpfWF9NVEZfNSwgQlpfWF9NVEZfNiwgbmV4dFN5bSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcy0+c3RhdGVfb3V0X2xlbiA9IDA7CisgICAgICBzLT5zdGF0ZV9vdXRfY2ggID0gMDsKKyAgICAgIEJaX0lOSVRJQUxJU0VfQ1JDICggcy0+Y2FsY3VsYXRlZEJsb2NrQ1JDICk7CisgICAgICBzLT5zdGF0ZSA9IEJaX1hfT1VUUFVUOworICAgICAgaWYgKHMtPnZlcmJvc2l0eSA+PSAyKSBWUHJpbnRmMCAoICJydCtybGQiICk7CisKKyAgICAgIC8qLS0gU2V0IHVwIGNmdGFiIHRvIGZhY2lsaXRhdGUgZ2VuZXJhdGlvbiBvZiBUXigtMSkgLS0qLworICAgICAgcy0+Y2Z0YWJbMF0gPSAwOworICAgICAgZm9yIChpID0gMTsgaSA8PSAyNTY7IGkrKykgcy0+Y2Z0YWJbaV0gPSBzLT51bnpmdGFiW2ktMV07CisgICAgICBmb3IgKGkgPSAxOyBpIDw9IDI1NjsgaSsrKSBzLT5jZnRhYltpXSArPSBzLT5jZnRhYltpLTFdOworCisgICAgICBpZiAocy0+c21hbGxEZWNvbXByZXNzKSB7CisKKyAgICAgICAgIC8qLS0gTWFrZSBhIGNvcHkgb2YgY2Z0YWIsIHVzZWQgaW4gZ2VuZXJhdGlvbiBvZiBUIC0tKi8KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHMtPmNmdGFiQ29weVtpXSA9IHMtPmNmdGFiW2ldOworCisgICAgICAgICAvKi0tIGNvbXB1dGUgdGhlIFQgdmVjdG9yIC0tKi8KKyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYmxvY2s7IGkrKykgeworICAgICAgICAgICAgdWMgPSAoVUNoYXIpKHMtPmxsMTZbaV0pOworICAgICAgICAgICAgU0VUX0xMKGksIHMtPmNmdGFiQ29weVt1Y10pOworICAgICAgICAgICAgcy0+Y2Z0YWJDb3B5W3VjXSsrOworICAgICAgICAgfQorCisgICAgICAgICAvKi0tIENvbXB1dGUgVF4oLTEpIGJ5IHBvaW50ZXIgcmV2ZXJzYWwgb24gVCAtLSovCisgICAgICAgICBpID0gcy0+b3JpZ1B0cjsKKyAgICAgICAgIGogPSBHRVRfTEwoaSk7CisgICAgICAgICBkbyB7CisgICAgICAgICAgICBJbnQzMiB0bXAgPSBHRVRfTEwoaik7CisgICAgICAgICAgICBTRVRfTEwoaiwgaSk7CisgICAgICAgICAgICBpID0gajsKKyAgICAgICAgICAgIGogPSB0bXA7CisgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoaSAhPSBzLT5vcmlnUHRyKTsKKworICAgICAgICAgcy0+dFBvcyA9IHMtPm9yaWdQdHI7CisgICAgICAgICBzLT5uYmxvY2tfdXNlZCA9IDA7CisgICAgICAgICBpZiAocy0+YmxvY2tSYW5kb21pc2VkKSB7CisgICAgICAgICAgICBCWl9SQU5EX0lOSVRfTUFTSzsKKyAgICAgICAgICAgIEJaX0dFVF9TTUFMTChzLT5rMCk7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICAgICBCWl9SQU5EX1VQRF9NQVNLOyBzLT5rMCBePSBCWl9SQU5EX01BU0s7IAorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJaX0dFVF9TTUFMTChzLT5rMCk7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICB9CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgIC8qLS0gY29tcHV0ZSB0aGUgVF4oLTEpIHZlY3RvciAtLSovCisgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKKyAgICAgICAgICAgIHVjID0gKFVDaGFyKShzLT50dFtpXSAmIDB4ZmYpOworICAgICAgICAgICAgcy0+dHRbcy0+Y2Z0YWJbdWNdXSB8PSAoaSA8PCA4KTsKKyAgICAgICAgICAgIHMtPmNmdGFiW3VjXSsrOworICAgICAgICAgfQorCisgICAgICAgICBzLT50UG9zID0gcy0+dHRbcy0+b3JpZ1B0cl0gPj4gODsKKyAgICAgICAgIHMtPm5ibG9ja191c2VkID0gMDsKKyAgICAgICAgIGlmIChzLT5ibG9ja1JhbmRvbWlzZWQpIHsKKyAgICAgICAgICAgIEJaX1JBTkRfSU5JVF9NQVNLOworICAgICAgICAgICAgQlpfR0VUX0ZBU1Qocy0+azApOyBzLT5uYmxvY2tfdXNlZCsrOworICAgICAgICAgICAgQlpfUkFORF9VUERfTUFTSzsgcy0+azAgXj0gQlpfUkFORF9NQVNLOyAKKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCWl9HRVRfRkFTVChzLT5rMCk7IHMtPm5ibG9ja191c2VkKys7CisgICAgICAgICB9CisKKyAgICAgIH0KKworICAgICAgUkVUVVJOKEJaX09LKTsKKworCisKKyAgICBlbmRoZHJfMjoKKworICAgICAgR0VUX1VDSEFSKEJaX1hfRU5ESERSXzIsIHVjKTsKKyAgICAgIGlmICh1YyAhPSAweDcyKSBSRVRVUk4oQlpfREFUQV9FUlJPUik7CisgICAgICBHRVRfVUNIQVIoQlpfWF9FTkRIRFJfMywgdWMpOworICAgICAgaWYgKHVjICE9IDB4NDUpIFJFVFVSTihCWl9EQVRBX0VSUk9SKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0VOREhEUl80LCB1Yyk7CisgICAgICBpZiAodWMgIT0gMHgzOCkgUkVUVVJOKEJaX0RBVEFfRVJST1IpOworICAgICAgR0VUX1VDSEFSKEJaX1hfRU5ESERSXzUsIHVjKTsKKyAgICAgIGlmICh1YyAhPSAweDUwKSBSRVRVUk4oQlpfREFUQV9FUlJPUik7CisgICAgICBHRVRfVUNIQVIoQlpfWF9FTkRIRFJfNiwgdWMpOworICAgICAgaWYgKHVjICE9IDB4OTApIFJFVFVSTihCWl9EQVRBX0VSUk9SKTsKKworICAgICAgcy0+c3RvcmVkQ29tYmluZWRDUkMgPSAwOworICAgICAgR0VUX1VDSEFSKEJaX1hfQ0NSQ18xLCB1Yyk7CisgICAgICBzLT5zdG9yZWRDb21iaW5lZENSQyA9IChzLT5zdG9yZWRDb21iaW5lZENSQyA8PCA4KSB8ICgoVUludDMyKXVjKTsKKyAgICAgIEdFVF9VQ0hBUihCWl9YX0NDUkNfMiwgdWMpOworICAgICAgcy0+c3RvcmVkQ29tYmluZWRDUkMgPSAocy0+c3RvcmVkQ29tYmluZWRDUkMgPDwgOCkgfCAoKFVJbnQzMil1Yyk7CisgICAgICBHRVRfVUNIQVIoQlpfWF9DQ1JDXzMsIHVjKTsKKyAgICAgIHMtPnN0b3JlZENvbWJpbmVkQ1JDID0gKHMtPnN0b3JlZENvbWJpbmVkQ1JDIDw8IDgpIHwgKChVSW50MzIpdWMpOworICAgICAgR0VUX1VDSEFSKEJaX1hfQ0NSQ180LCB1Yyk7CisgICAgICBzLT5zdG9yZWRDb21iaW5lZENSQyA9IChzLT5zdG9yZWRDb21iaW5lZENSQyA8PCA4KSB8ICgoVUludDMyKXVjKTsKKworICAgICAgcy0+c3RhdGUgPSBCWl9YX0lETEU7CisgICAgICBSRVRVUk4oQlpfU1RSRUFNX0VORCk7CisKKyAgICAgIGRlZmF1bHQ6IEFzc2VydEggKCBGYWxzZSwgNDAwMSApOworICAgfQorCisgICBBc3NlcnRIICggRmFsc2UsIDQwMDIgKTsKKworICAgc2F2ZV9zdGF0ZV9hbmRfcmV0dXJuOgorCisgICBzLT5zYXZlX2kgICAgICAgICAgID0gaTsKKyAgIHMtPnNhdmVfaiAgICAgICAgICAgPSBqOworICAgcy0+c2F2ZV90ICAgICAgICAgICA9IHQ7CisgICBzLT5zYXZlX2FscGhhU2l6ZSAgID0gYWxwaGFTaXplOworICAgcy0+c2F2ZV9uR3JvdXBzICAgICA9IG5Hcm91cHM7CisgICBzLT5zYXZlX25TZWxlY3RvcnMgID0gblNlbGVjdG9yczsKKyAgIHMtPnNhdmVfRU9CICAgICAgICAgPSBFT0I7CisgICBzLT5zYXZlX2dyb3VwTm8gICAgID0gZ3JvdXBObzsKKyAgIHMtPnNhdmVfZ3JvdXBQb3MgICAgPSBncm91cFBvczsKKyAgIHMtPnNhdmVfbmV4dFN5bSAgICAgPSBuZXh0U3ltOworICAgcy0+c2F2ZV9uYmxvY2tNQVggICA9IG5ibG9ja01BWDsKKyAgIHMtPnNhdmVfbmJsb2NrICAgICAgPSBuYmxvY2s7CisgICBzLT5zYXZlX2VzICAgICAgICAgID0gZXM7CisgICBzLT5zYXZlX04gICAgICAgICAgID0gTjsKKyAgIHMtPnNhdmVfY3VyciAgICAgICAgPSBjdXJyOworICAgcy0+c2F2ZV96dCAgICAgICAgICA9IHp0OworICAgcy0+c2F2ZV96biAgICAgICAgICA9IHpuOworICAgcy0+c2F2ZV96dmVjICAgICAgICA9IHp2ZWM7CisgICBzLT5zYXZlX3pqICAgICAgICAgID0gemo7CisgICBzLT5zYXZlX2dTZWwgICAgICAgID0gZ1NlbDsKKyAgIHMtPnNhdmVfZ01pbmxlbiAgICAgPSBnTWlubGVuOworICAgcy0+c2F2ZV9nTGltaXQgICAgICA9IGdMaW1pdDsKKyAgIHMtPnNhdmVfZ0Jhc2UgICAgICAgPSBnQmFzZTsKKyAgIHMtPnNhdmVfZ1Blcm0gICAgICAgPSBnUGVybTsKKworICAgcmV0dXJuIHJldFZhbDsgICAKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kbGx0ZXN0LmMgYi9kbGx0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4MWJjZAotLS0gL2Rldi9udWxsCisrKyBiL2RsbHRlc3QuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKwltaW5pYnoyCisJCWxpYmJ6Mi5kbGwgdGVzdCBwcm9ncmFtLgorCQlieSBZb3NoaW9rYSBUc3VuZW8oUVdGMDAxMzNAbmlmdHkubmUuanAvdHN1bmVvLXlAaXMuYWlzdC1uYXJhLmFjLmpwKQorCQlUaGlzIGZpbGUgaXMgUHVibGljIERvbWFpbi4KKwkJd2VsY29tZSBhbnkgZW1haWwgdG8gbWUuCisKKwl1c2FnZTogbWluaWJ6MiBbLWRdIFstezEsMiwuLjl9XSBbW3NyY2ZpbGVuYW1lXSBkZXN0ZmlsZW5hbWVdCisqLworCisjZGVmaW5lIEJaX0lNUE9SVAorI2luY2x1ZGUgImJ6bGliLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKworI2lmZGVmIF9XSU4zMgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorc3RhdGljIGludCBCWjJETExMb2FkZWQgPSAwOworc3RhdGljIEhJTlNUQU5DRSBCWjJETExoTGliOworaW50IEJaMkRMTExvYWRMaWJyYXJ5KHZvaWQpCit7CisJSElOU1RBTkNFIGhMaWI7CisKKwlpZihCWjJETExMb2FkZWQ9PTEpe3JldHVybiAwO30KKwloTGliPUxvYWRMaWJyYXJ5KCJsaWJiejIuZGxsIik7CisJaWYoaExpYiA9PSBOVUxMKXsKKwkJcHV0cygiQ2FuJ3QgbG9hZCBsaWJiejIuZGxsIik7CisJCXJldHVybiAtMTsKKwl9CisJQloyRExMTG9hZGVkPTE7CisJQloyRExMaExpYj1oTGliOworCWJ6bGliVmVyc2lvbj1HZXRQcm9jQWRkcmVzcyhoTGliLCJiemxpYlZlcnNpb24iKTsKKwliem9wZW49R2V0UHJvY0FkZHJlc3MoaExpYiwiYnpvcGVuIik7CisJYnpkb3Blbj1HZXRQcm9jQWRkcmVzcyhoTGliLCJiemRvcGVuIik7CisJYnpyZWFkPUdldFByb2NBZGRyZXNzKGhMaWIsImJ6cmVhZCIpOworCWJ6d3JpdGU9R2V0UHJvY0FkZHJlc3MoaExpYiwiYnp3cml0ZSIpOworCWJ6Zmx1c2g9R2V0UHJvY0FkZHJlc3MoaExpYiwiYnpmbHVzaCIpOworCWJ6Y2xvc2U9R2V0UHJvY0FkZHJlc3MoaExpYiwiYnpjbG9zZSIpOworCWJ6ZXJyb3I9R2V0UHJvY0FkZHJlc3MoaExpYiwiYnplcnJvciIpOworCXJldHVybiAwOworCit9CitpbnQgQloyRExMRnJlZUxpYnJhcnkodm9pZCkKK3sKKwlpZihCWjJETExMb2FkZWQ9PTApe3JldHVybiAwO30KKwlGcmVlTGlicmFyeShCWjJETExoTGliKTsKKwlCWjJETExMb2FkZWQ9MDsKK30KKyNlbmRpZiAvKiBXSU4zMiAqLworCit2b2lkIHVzYWdlKHZvaWQpCit7CisJcHV0cygidXNhZ2U6IG1pbmliejIgWy1kXSBbLXsxLDIsLi45fV0gW1tzcmNmaWxlbmFtZV0gZGVzdGZpbGVuYW1lXSIpOworfQorCit2b2lkIG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQoreworCWludCBkZWNvbXByZXNzID0gMDsKKwlpbnQgbGV2ZWwgPSA5OworCWNoYXIgKmZuX3IsKmZuX3c7CisKKyNpZmRlZiBfV0lOMzIKKwlpZihCWjJETExMb2FkTGlicmFyeSgpPDApeworCQlwdXRzKCJjYW4ndCBsb2FkIGRsbCIpOworCQlleGl0KDEpOworCX0KKyNlbmRpZgorCXdoaWxlKCsrYXJndiwtLWFyZ2MpeworCQlpZigqKmFyZ3YgPT0nLScgfHwgKiphcmd2PT0nLycpeworCQkJY2hhciAqcDsKKworCQkJZm9yKHA9KmFyZ3YrMTsqcDtwKyspeworCQkJCWlmKCpwPT0nZCcpeworCQkJCQlkZWNvbXByZXNzID0gMTsKKwkJCQl9ZWxzZSBpZignMSc8PSpwICYmICpwPD0nOScpeworCQkJCQlsZXZlbCA9ICpwIC0gJzAnOworCQkJCX1lbHNleworCQkJCQl1c2FnZSgpOworCQkJCQlleGl0KDEpOworCQkJCX0KKwkJCX0KKwkJfWVsc2V7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZihhcmdjPj0xKXsKKwkJZm5fciA9ICphcmd2OworCQlhcmdjLS07YXJndisrOworCX1lbHNleworCQlmbl9yID0gTlVMTDsKKwl9CisJaWYoYXJnYz49MSl7CisJCWZuX3cgPSAqYXJndjsKKwkJYXJnYy0tO2FyZ3YrKzsKKwl9ZWxzZXsKKwkJZm5fdyA9IE5VTEw7CisJfQorCXsKKwkJaW50IGxlbjsKKwkJY2hhciBidWZmWzB4MTAwMF07CisJCWNoYXIgbW9kZVsxMF07CisKKwkJaWYoZGVjb21wcmVzcyl7CisJCQlCWkZJTEUgKkJaMmZwX3I7CisJCQlGSUxFICpmcF93OworCisJCQlpZihmbl93KXsKKwkJCQlpZigoZnBfdyA9IGZvcGVuKGZuX3csIndiIikpPT1OVUxMKXsKKwkJCQkJcHJpbnRmKCJjYW4ndCBvcGVuIFslc11cbiIsZm5fdyk7CisJCQkJCXBlcnJvcigicmVhc29uOiIpOworCQkJCQlleGl0KDEpOworCQkJCX0KKwkJCX1lbHNleworCQkJCWZwX3cgPSBzdGRvdXQ7CisJCQl9CisJCQlpZigoQloyZnBfciA9PSBOVUxMICYmIChCWjJmcF9yID0gYnpkb3BlbihmaWxlbm8oc3RkaW4pLCJyYiIpKT09TlVMTCkKKwkJCQl8fCAoQloyZnBfciAhPSBOVUxMICYmIChCWjJmcF9yID0gYnpvcGVuKGZuX3IsInJiIikpPT1OVUxMKSl7CisJCQkJcHJpbnRmKCJjYW4ndCBiejJvcGVuc3RyZWFtXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJd2hpbGUoKGxlbj1ienJlYWQoQloyZnBfcixidWZmLDB4MTAwMCkpPjApeworCQkJCWZ3cml0ZShidWZmLDEsbGVuLGZwX3cpOworCQkJfQorCQkJYnpjbG9zZShCWjJmcF9yKTsKKwkJCWlmKGZwX3cgIT0gc3Rkb3V0KSBmY2xvc2UoZnBfdyk7CisJCX1lbHNleworCQkJQlpGSUxFICpCWjJmcF93OworCQkJRklMRSAqZnBfcjsKKworCQkJaWYoZm5fcil7CisJCQkJaWYoKGZwX3IgPSBmb3Blbihmbl9yLCJyYiIpKT09TlVMTCl7CisJCQkJCXByaW50ZigiY2FuJ3Qgb3BlbiBbJXNdXG4iLGZuX3IpOworCQkJCQlwZXJyb3IoInJlYXNvbjoiKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQl9ZWxzZXsKKwkJCQlmcF9yID0gc3RkaW47CisJCQl9CisJCQltb2RlWzBdPSd3JzsKKwkJCW1vZGVbMV0gPSAnMCcgKyBsZXZlbDsKKwkJCW1vZGVbMl0gPSAnXDAnOworCisJCQlpZigoZm5fdyA9PSBOVUxMICYmIChCWjJmcF93ID0gYnpkb3BlbihmaWxlbm8oc3Rkb3V0KSxtb2RlKSk9PU5VTEwpCisJCQkJfHwgKGZuX3cgIT1OVUxMICYmIChCWjJmcF93ID0gYnpvcGVuKGZuX3csbW9kZSkpPT1OVUxMKSl7CisJCQkJcHJpbnRmKCJjYW4ndCBiejJvcGVuc3RyZWFtXG4iKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJd2hpbGUoKGxlbj1mcmVhZChidWZmLDEsMHgxMDAwLGZwX3IpKT4wKXsKKwkJCQliendyaXRlKEJaMmZwX3csYnVmZixsZW4pOworCQkJfQorCQkJYnpjbG9zZShCWjJmcF93KTsKKwkJCWlmKGZwX3IhPXN0ZGluKWZjbG9zZShmcF9yKTsKKwkJfQorCX0KKyNpZmRlZiBfV0lOMzIKKwlCWjJETExGcmVlTGlicmFyeSgpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kbGx0ZXN0LmRzcCBiL2RsbHRlc3QuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTYxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9kbGx0ZXN0LmRzcApAQCAtMCwwICsxLDkzIEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9ImRsbHRlc3QiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwDQorIyAqKiCV0o9XgrWCyIKigsWCrYK+grOCoiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMw0KKw0KK0NGRz1kbGx0ZXN0IC0gV2luMzIgRGVidWcNCishTUVTU0FHRSCCsYLqgs2XTIz4gsjSsrjMp7LZgsWCzYKgguiC3IK5gvGBQiCCsYLMzN/bvN6quMSC8Mve2cTegreC6YK9gt+CyYLNIE5NQUtFIILwjmeXcIK1gsSCrYK+grOCooFCDQorIU1FU1NBR0UgW9KyuMynstmCzLS4vc7fsMRdILrP3cTegvCOZ5dwgrWCxI7AjXOCtYLEgq2CvoKzgqINCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZGxsdGVzdC5tYWsiLg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIILMjsCNc46egsmNXJCsgvCOd5LogsWCq4LcgrcNCishTUVTU0FHRSC6z93E3iDXst2P44LFz7jbgsyQ3ZLogvCS6ItggrWC3IK3gUKX4ToNCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAiZGxsdGVzdC5tYWsiIENGRz0iZGxsdGVzdCAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIJFJkfCJwpRcgsjL3tnE3iDTsMTeOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJkbGx0ZXN0IC0gV2luMzIgUmVsZWFzZSIgKCJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiCXcCkNCishTUVTU0FHRSAiZGxsdGVzdCAtIFdpbjMyIERlYnVnIiAoIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIJdwKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAiZGxsdGVzdCAtIFdpbjMyIFJlbGVhc2UiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMA0KKyMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MNCisjIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2DQorIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYgL291dDoibWluaWJ6Mi5leGUiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImRsbHRlc3QgLSBXaW4zMiBEZWJ1ZyINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJkbGx0ZXN0XyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJkbGx0ZXN0XyINCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQorIyBQUk9QIFVzZV9NRkMgMA0KKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDENCisjIFBST1AgT3V0cHV0X0RpciAiZGxsdGVzdF8iDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImRsbHRlc3RfIg0KKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYw0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDExIC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDExIC9kICJfREVCVUciDQorQlNDMzI9YnNjbWFrZS5leGUNCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28NCisjIEFERCBCU0MzMiAvbm9sb2dvDQorTElOSzMyPWxpbmsuZXhlDQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdA0KKyMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJtaW5pYnoyLmV4ZSIgL3BkYnR5cGU6c2VwdA0KKw0KKyFFTkRJRiANCisNCisjIEJlZ2luIFRhcmdldA0KKw0KKyMgTmFtZSAiZGxsdGVzdCAtIFdpbjMyIFJlbGVhc2UiDQorIyBOYW1lICJkbGx0ZXN0IC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGJ6bGliLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxkbGx0ZXN0LmMNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgRW5kIFRhcmdldA0KKyMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9ob3diaWcuYyBiL2hvd2JpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMmFkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9ob3diaWcuYwpAQCAtMCwwICsxLDM3IEBACisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgImJ6bGliLmgiCisKK3Vuc2lnbmVkIGNoYXIgaWJ1ZmZbMTAwMDAwMF07Cit1bnNpZ25lZCBjaGFyIG9idWZmWzEwMDAwMDBdOworCit2b2lkIGRvb25lICggaW50IG4gKQoreworICAgaW50IGksIGosIGssIHEsIG5vYnVmZjsKKyAgIHEgPSAwOworCisgICBmb3IgKGsgPSAwOyBrIDwgMTsgaysrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgaWJ1ZmZbaV0gPSAoKHVuc2lnbmVkIGxvbmcpKHJhbmRvbSgpKSkgJiAweGZmOworICAgICAgbm9idWZmID0gMTAwMDAwMDsKKyAgICAgIGogPSBiekJ1ZmZUb0J1ZmZDb21wcmVzcyAoIG9idWZmLCAmbm9idWZmLCBpYnVmZiwgbiwgOSwwLDAgKTsKKyAgICAgIGFzc2VydCAoaiA9PSBCWl9PSyk7CisgICAgICBpZiAobm9idWZmID4gcSkgcSA9IG5vYnVmZjsKKyAgIH0KKyAgIHByaW50ZiAoICIlZCAlZCglZClcbiIsIG4sIHEsIChpbnQpKChmbG9hdCluICogMS4wMSAtIChmbG9hdClxKSApOworfQorCitpbnQgbWFpbiAoIGludCBhcmdjLCBjaGFyKiogYXJndiApCit7CisgICBpbnQgaTsKKyAgIGkgPSAwOworICAgd2hpbGUgKDEpIHsKKyAgICAgaWYgKGkgPj0gOTAwMDAwKSBicmVhazsKKyAgICAgZG9vbmUoaSk7CisgICAgIGlmICggICAoaW50KSgxLjEwICogaSkgPiBpICkKKyAgICAgICAgaSA9IChpbnQpKDEuMTAgKiBpKTsgZWxzZSBpKys7CisgICB9CisKKyAgIHJldHVybiAwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2h1ZmZtYW4uYyBiL2h1ZmZtYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjU0OTkwCi0tLSAvZGV2L251bGwKKysrIGIvaHVmZm1hbi5jCkBAIC0wLDAgKzEsMjI4IEBACisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBIdWZmbWFuIGNvZGluZyBsb3ctbGV2ZWwgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0KKyAgVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBiemlwMiBhbmQvb3IgbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQKKyAgbGlicmFyeSBmb3IgbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBKdWxpYW4gUiBTZXdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCAKKyAgICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyAKKyAgICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCAKKyAgICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCisgIDMuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3QKKyAgICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKworICA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAgICAgcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisgIEp1bGlhbiBTZXdhcmQsIEd1aWxkZm9yZCwgU3VycmV5LCBVSy4KKyAganNld2FyZEBhY20ub3JnCisgIGJ6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMC45LjBjIG9mIDE4IE9jdG9iZXIgMTk5OAorCisgIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiAoYXQgbGVhc3QpIHRoZSB3b3JrIG9mOgorICAgICBNaWtlIEJ1cnJvd3MKKyAgICAgRGF2aWQgV2hlZWxlcgorICAgICBQZXRlciBGZW53aWNrCisgICAgIEFsaXN0YWlyIE1vZmZhdAorICAgICBSYWRmb3JkIE5lYWwKKyAgICAgSWFuIEguIFdpdHRlbgorICAgICBSb2JlcnQgU2VkZ2V3aWNrCisgICAgIEpvbiBMLiBCZW50bGV5CisKKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc291cmNlcywgc2VlIHRoZSBtYW51YWwuCistLSovCisKKworI2luY2x1ZGUgImJ6bGliX3ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBXRUlHSFRPRih6ejApICAoKHp6MCkgJiAweGZmZmZmZjAwKQorI2RlZmluZSBERVBUSE9GKHp6MSkgICAoKHp6MSkgJiAweDAwMDAwMGZmKQorI2RlZmluZSBNWU1BWCh6ejIsenozKSAoKHp6MikgPiAoenozKSA/ICh6ejIpIDogKHp6MykpCisKKyNkZWZpbmUgQUREV0VJR0hUUyh6dzEsencyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIChXRUlHSFRPRih6dzEpK1dFSUdIVE9GKHp3MikpIHwgICAgICAgICAgICAgICAgICAgIFwKKyAgICgxICsgTVlNQVgoREVQVEhPRih6dzEpLERFUFRIT0YoencyKSkpCisKKyNkZWZpbmUgVVBIRUFQKHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIEludDMyIHp6LCB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHp6ID0gejsgdG1wID0gaGVhcFt6el07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHdoaWxlICh3ZWlnaHRbdG1wXSA8IHdlaWdodFtoZWFwW3p6ID4+IDFdXSkgeyAgICAgIFwKKyAgICAgIGhlYXBbenpdID0gaGVhcFt6eiA+PiAxXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHp6ID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGhlYXBbenpdID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBET1dOSEVBUCh6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgSW50MzIgenosIHl5LCB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgenogPSB6OyB0bXAgPSBoZWFwW3p6XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgd2hpbGUgKFRydWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgeXkgPSB6eiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHl5ID4gbkhlYXApIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHl5IDwgbkhlYXAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHdlaWdodFtoZWFwW3l5KzFdXSA8IHdlaWdodFtoZWFwW3l5XV0pICAgICAgXAorICAgICAgICAgeXkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkgYnJlYWs7ICAgICAgXAorICAgICAgaGVhcFt6el0gPSBoZWFwW3l5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgenogPSB5eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgaGVhcFt6el0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaGJNYWtlQ29kZUxlbmd0aHMgKCBVQ2hhciAqbGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiAqZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiBhbHBoYVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWF4TGVuICkKK3sKKyAgIC8qLS0KKyAgICAgIE5vZGVzIGFuZCBoZWFwIGVudHJpZXMgcnVuIGZyb20gMS4gIEVudHJ5IDAKKyAgICAgIGZvciBib3RoIHRoZSBoZWFwIGFuZCBub2RlcyBpcyBhIHNlbnRpbmVsLgorICAgLS0qLworICAgSW50MzIgbk5vZGVzLCBuSGVhcCwgbjEsIG4yLCBpLCBqLCBrOworICAgQm9vbCAgdG9vTG9uZzsKKworICAgSW50MzIgaGVhcCAgIFsgQlpfTUFYX0FMUEhBX1NJWkUgKyAyIF07CisgICBJbnQzMiB3ZWlnaHQgWyBCWl9NQVhfQUxQSEFfU0laRSAqIDIgXTsKKyAgIEludDMyIHBhcmVudCBbIEJaX01BWF9BTFBIQV9TSVpFICogMiBdOyAKKworICAgZm9yIChpID0gMDsgaSA8IGFscGhhU2l6ZTsgaSsrKQorICAgICAgd2VpZ2h0W2krMV0gPSAoZnJlcVtpXSA9PSAwID8gMSA6IGZyZXFbaV0pIDw8IDg7CisKKyAgIHdoaWxlIChUcnVlKSB7CisKKyAgICAgIG5Ob2RlcyA9IGFscGhhU2l6ZTsKKyAgICAgIG5IZWFwID0gMDsKKworICAgICAgaGVhcFswXSA9IDA7CisgICAgICB3ZWlnaHRbMF0gPSAwOworICAgICAgcGFyZW50WzBdID0gLTI7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gYWxwaGFTaXplOyBpKyspIHsKKyAgICAgICAgIHBhcmVudFtpXSA9IC0xOworICAgICAgICAgbkhlYXArKzsKKyAgICAgICAgIGhlYXBbbkhlYXBdID0gaTsKKyAgICAgICAgIFVQSEVBUChuSGVhcCk7CisgICAgICB9CisKKyAgICAgIEFzc2VydEgoIG5IZWFwIDwgKEJaX01BWF9BTFBIQV9TSVpFKzIpLCAyMDAxICk7CisgICAKKyAgICAgIHdoaWxlIChuSGVhcCA+IDEpIHsKKyAgICAgICAgIG4xID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUCgxKTsKKyAgICAgICAgIG4yID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUCgxKTsKKyAgICAgICAgIG5Ob2RlcysrOworICAgICAgICAgcGFyZW50W24xXSA9IHBhcmVudFtuMl0gPSBuTm9kZXM7CisgICAgICAgICB3ZWlnaHRbbk5vZGVzXSA9IEFERFdFSUdIVFMod2VpZ2h0W24xXSwgd2VpZ2h0W24yXSk7CisgICAgICAgICBwYXJlbnRbbk5vZGVzXSA9IC0xOworICAgICAgICAgbkhlYXArKzsKKyAgICAgICAgIGhlYXBbbkhlYXBdID0gbk5vZGVzOworICAgICAgICAgVVBIRUFQKG5IZWFwKTsKKyAgICAgIH0KKworICAgICAgQXNzZXJ0SCggbk5vZGVzIDwgKEJaX01BWF9BTFBIQV9TSVpFICogMiksIDIwMDIgKTsKKworICAgICAgdG9vTG9uZyA9IEZhbHNlOworICAgICAgZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworICAgICAgICAgaiA9IDA7CisgICAgICAgICBrID0gaTsKKyAgICAgICAgIHdoaWxlIChwYXJlbnRba10gPj0gMCkgeyBrID0gcGFyZW50W2tdOyBqKys7IH0KKyAgICAgICAgIGxlbltpLTFdID0gajsKKyAgICAgICAgIGlmIChqID4gbWF4TGVuKSB0b29Mb25nID0gVHJ1ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgaWYgKCEgdG9vTG9uZykgYnJlYWs7CisKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBhbHBoYVNpemU7IGkrKykgeworICAgICAgICAgaiA9IHdlaWdodFtpXSA+PiA4OworICAgICAgICAgaiA9IDEgKyAoaiAvIDIpOworICAgICAgICAgd2VpZ2h0W2ldID0gaiA8PCA4OworICAgICAgfQorICAgfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaGJBc3NpZ25Db2RlcyAoIEludDMyICpjb2RlLAorICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIEludDMyIG1pbkxlbiwKKyAgICAgICAgICAgICAgICAgICAgIEludDMyIG1heExlbiwKKyAgICAgICAgICAgICAgICAgICAgIEludDMyIGFscGhhU2l6ZSApCit7CisgICBJbnQzMiBuLCB2ZWMsIGk7CisKKyAgIHZlYyA9IDA7CisgICBmb3IgKG4gPSBtaW5MZW47IG4gPD0gbWF4TGVuOyBuKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykKKyAgICAgICAgIGlmIChsZW5ndGhbaV0gPT0gbikgeyBjb2RlW2ldID0gdmVjOyB2ZWMrKzsgfTsKKyAgICAgIHZlYyA8PD0gMTsKKyAgIH0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIGhiQ3JlYXRlRGVjb2RlVGFibGVzICggSW50MzIgKmxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyICpwZXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzIgbWluTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyIG1heExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMiBhbHBoYVNpemUgKQoreworICAgSW50MzIgcHAsIGksIGosIHZlYzsKKworICAgcHAgPSAwOworICAgZm9yIChpID0gbWluTGVuOyBpIDw9IG1heExlbjsgaSsrKQorICAgICAgZm9yIChqID0gMDsgaiA8IGFscGhhU2l6ZTsgaisrKQorICAgICAgICAgaWYgKGxlbmd0aFtqXSA9PSBpKSB7IHBlcm1bcHBdID0gajsgcHArKzsgfTsKKworICAgZm9yIChpID0gMDsgaSA8IEJaX01BWF9DT0RFX0xFTjsgaSsrKSBiYXNlW2ldID0gMDsKKyAgIGZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgYmFzZVtsZW5ndGhbaV0rMV0rKzsKKworICAgZm9yIChpID0gMTsgaSA8IEJaX01BWF9DT0RFX0xFTjsgaSsrKSBiYXNlW2ldICs9IGJhc2VbaS0xXTsKKworICAgZm9yIChpID0gMDsgaSA8IEJaX01BWF9DT0RFX0xFTjsgaSsrKSBsaW1pdFtpXSA9IDA7CisgICB2ZWMgPSAwOworCisgICBmb3IgKGkgPSBtaW5MZW47IGkgPD0gbWF4TGVuOyBpKyspIHsKKyAgICAgIHZlYyArPSAoYmFzZVtpKzFdIC0gYmFzZVtpXSk7CisgICAgICBsaW1pdFtpXSA9IHZlYy0xOworICAgICAgdmVjIDw8PSAxOworICAgfQorICAgZm9yIChpID0gbWluTGVuICsgMTsgaSA8PSBtYXhMZW47IGkrKykKKyAgICAgIGJhc2VbaV0gPSAoKGxpbWl0W2ktMV0gKyAxKSA8PCAxKSAtIGJhc2VbaV07Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvbGliYnoyLmRlZiBiL2xpYmJ6Mi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwZjU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJ6Mi5kZWYKQEAgLTAsMCArMSwyNSBAQAorTElCUkFSWQkJCUxJQkJaMg0KK0RFU0NSSVBUSU9OCQkibGliYnppcDI6IGxpYnJhcnkgZm9yIGRhdGEgY29tcHJlc3Npb24iDQorRVhQT1JUUw0KKwliekNvbXByZXNzSW5pdA0KKwliekNvbXByZXNzDQorCWJ6Q29tcHJlc3NFbmQNCisJYnpEZWNvbXByZXNzSW5pdA0KKwliekRlY29tcHJlc3MNCisJYnpEZWNvbXByZXNzRW5kDQorCWJ6UmVhZE9wZW4NCisJYnpSZWFkQ2xvc2UNCisJYnpSZWFkR2V0VW51c2VkDQorCWJ6UmVhZA0KKwlieldyaXRlT3Blbg0KKwlieldyaXRlDQorCWJ6V3JpdGVDbG9zZQ0KKwliekJ1ZmZUb0J1ZmZDb21wcmVzcw0KKwliekJ1ZmZUb0J1ZmZEZWNvbXByZXNzDQorCWJ6bGliVmVyc2lvbg0KKwliem9wZW4NCisJYnpkb3Blbg0KKwlienJlYWQNCisJYnp3cml0ZQ0KKwliemZsdXNoDQorCWJ6Y2xvc2UNCmRpZmYgLS1naXQgYS9saWJiejIuZHNwIGIvbGliYnoyLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFhMjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYnoyLmRzcApAQCAtMCwwICsxLDEzMCBAQAorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJsaWJiejIiIC0gUGFja2FnZSBPd25lcj08ND4NCisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwDQorIyAqKiCV0o9XgrWCyIKigsWCrYK+grOCoiAqKg0KKw0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDINCisNCitDRkc9bGliYnoyIC0gV2luMzIgRGVidWcNCishTUVTU0FHRSCCsYLqgs2XTIz4gsjSsrjMp7LZgsWCzYKgguiC3IK5gvGBQiCCsYLMzN/bvN6quMSC8Mve2cTegreC6YK9gt+CyYLNIE5NQUtFIILwjmeXcIK1gsSCrYK+grOCooFCDQorIU1FU1NBR0UgW9KyuMynstmCzLS4vc7fsMRdILrP3cTegvCOZ5dwgrWCxI7AjXOCtYLEgq2CvoKzgqINCishTUVTU0FHRSANCishTUVTU0FHRSBOTUFLRSAvZiAibGliYnoyLm1hayIuDQorIU1FU1NBR0UgDQorIU1FU1NBR0UgTk1BS0UggsyOwI1zjp6CyY1ckKyC8I53kuiCxYKrgtyCtw0KKyFNRVNTQUdFILrP3cTeINey3Y/jgsXPuNuCzJDdkuiC8JLoi2CCtYLcgreBQpfhOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIE5NQUtFIC9mICJsaWJiejIubWFrIiBDRkc9ImxpYmJ6MiAtIFdpbjMyIERlYnVnIg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFIJFJkfCJwpRcgsjL3tnE3iDTsMTeOg0KKyFNRVNTQUdFIA0KKyFNRVNTQUdFICJsaWJiejIgLSBXaW4zMiBSZWxlYXNlIiAoIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiCXcCkNCishTUVTU0FHRSAibGliYnoyIC0gV2luMzIgRGVidWciICgiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIJdwKQ0KKyFNRVNTQUdFIA0KKw0KKyMgQmVnaW4gUHJvamVjdA0KKyMgUFJPUCBTY2NfUHJvak5hbWUgIiINCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KK0NQUD1jbC5leGUNCitNVEw9bWlkbC5leGUNCitSU0M9cmMuZXhlDQorDQorIUlGICAiJChDRkcpIiA9PSAibGliYnoyIC0gV2luMzIgUmVsZWFzZSINCisNCisjIFBST1AgQkFTRSBVc2VfTUZDIDANCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTEgL2QgIk5ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2IC9vdXQ6ImxpYmJ6Mi5kbGwiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYmJ6MiAtIFdpbjMyIERlYnVnIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIkRlYnVnIg0KKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCisjIFBST1AgVXNlX01GQyAwDQorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyINCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL0ZEIC9jDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL28gTlVMIC93aW4zMg0KKyMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvbyBOVUwgL3dpbjMyDQorIyBBREQgQkFTRSBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyINCisjIEFERCBSU0MgL2wgMHg0MTEgL2QgIl9ERUJVRyINCitCU0MzMj1ic2NtYWtlLmV4ZQ0KKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KKyMgQUREIEJTQzMyIC9ub2xvZ28NCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQNCisjIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiJsaWJiejIuZGxsIiAvcGRidHlwZTpzZXB0DQorDQorIUVORElGIA0KKw0KKyMgQmVnaW4gVGFyZ2V0DQorDQorIyBOYW1lICJsaWJiejIgLSBXaW4zMiBSZWxlYXNlIg0KKyMgTmFtZSAibGliYnoyIC0gV2luMzIgRGVidWciDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGJsb2Nrc29ydC5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cYnpsaWIuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGJ6bGliLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxiemxpYl9wcml2YXRlLmgNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9Llxjb21wcmVzcy5jDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS5cY3JjdGFibGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGRlY29tcHJlc3MuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGh1ZmZtYW4uYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KK1NPVVJDRT0uXGxpYmJ6Mi5kZWYNCisjIEVuZCBTb3VyY2UgRmlsZQ0KKyMgQmVnaW4gU291cmNlIEZpbGUNCisNCitTT1VSQ0U9LlxyYW5kdGFibGUuYw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBFbmQgVGFyZ2V0DQorIyBFbmQgUHJvamVjdA0KZGlmZiAtLWdpdCBhL21hbnVhbC50ZXhpIGIvbWFudWFsLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljZTY2MQotLS0gL2Rldi9udWxsCisrKyBiL21hbnVhbC50ZXhpCkBAIC0wLDAgKzEsMjEwMCBAQAorXGlucHV0IHRleGluZm8gIEBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBUZXhpbmZvIC0qLQorQHNldGZpbGVuYW1lIGJ6aXAyLmluZm8KKworQGlnbm9yZQorVGhpcyBmaWxlIGRvY3VtZW50cyBiemlwMiB2ZXJzaW9uIDAuOS4wYywgYW5kIGFzc29jaWF0ZWQgbGlicmFyeQorbGliYnppcDIsIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCAoanNld2FyZEBhY20ub3JnKS4KKworQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkCisKK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgordGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKK2FyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KKworUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCitpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3BpZXMuCitAZW5kIGlnbm9yZQorCitAaWZpbmZvCitAZm9ybWF0CitTVEFSVC1JTkZPLURJUi1FTlRSWQorKiBCemlwMjogKGJ6aXAyKS4JCUEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IgZGF0YSBjb21wcmVzc2lvbi4KK0VORC1JTkZPLURJUi1FTlRSWQorQGVuZCBmb3JtYXQKKworQGVuZCBpZmluZm8KKworQGlmdGV4CitAYyBAZmluYWxvdXQKK0BzZXR0aXRsZSBiemlwMiBhbmQgbGliYnppcDIKK0B0aXRsZXBhZ2UKK0B0aXRsZSBiemlwMiBhbmQgbGliYnppcDIKK0BzdWJ0aXRsZSBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yIGRhdGEgY29tcHJlc3Npb24KK0BzdWJ0aXRsZSBjb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBKdWxpYW4gU2V3YXJkCitAc3VidGl0bGUgdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4CitAYXV0aG9yIEp1bGlhbiBTZXdhcmQKKworQGVuZCB0aXRsZXBhZ2UKK0BlbmQgaWZ0ZXgKKworCitAcGFyaW5kZW50IDBtbQorQHBhcnNraXAgMm1tCisKKworVGhpcyBwcm9ncmFtLCBAY29kZXtiemlwMn0sIAorYW5kIGFzc29jaWF0ZWQgbGlicmFyeSBAY29kZXtsaWJiemlwMn0sIGFyZQorQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggSnVsaWFuIFIgU2V3YXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KK0BpdGVtCisgICBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcyAKKyAgIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgCisgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCitAaXRlbQorICAgQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KK0BpdGVtCisgICBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgICBwZXJtaXNzaW9uLgorQGVuZCBpdGVtaXplCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUworT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCitHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCitJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworSnVsaWFuIFNld2FyZCwgR3VpbGRmb3JkLCBTdXJyZXksIFVLLgorCitAY29kZXtqc2V3YXJkQEBhY20ub3JnfQorCitAY29kZXtodHRwOi8vd3d3Lm11cmFyb2EuZGVtb24uY28udWt9CisKK0Bjb2Rle2J6aXAyfS9AY29kZXtsaWJiemlwMn0gdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4LgorCitQQVRFTlRTOiBUbyB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UsIEBjb2Rle2J6aXAyfSBkb2VzIG5vdCB1c2UgYW55IHBhdGVudGVkCithbGdvcml0aG1zLiAgSG93ZXZlciwgSSBkbyBub3QgaGF2ZSB0aGUgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBjYXJyeSBvdXQKK2EgZnVsbCBwYXRlbnQgc2VhcmNoLiAgVGhlcmVmb3JlIEkgY2Fubm90IGdpdmUgYW55IGd1YXJhbnRlZSBvZiB0aGUKK2Fib3ZlIHN0YXRlbWVudC4KKworCisKKworCisKKworQG5vZGUgT3ZlcnZpZXcsIEltcGxlbWVudGF0aW9uLCBUb3AsIFRvcAorQGNoYXB0ZXIgSW50cm9kdWN0aW9uCisKK0Bjb2Rle2J6aXAyfSAgY29tcHJlc3NlcyAgZmlsZXMgIHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgCitibG9jay1zb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCAgYW5kICBIdWZmbWFuICBjb2RpbmcuCitDb21wcmVzc2lvbiAgaXMgIGdlbmVyYWxseSAgY29uc2lkZXJhYmx5ICBiZXR0ZXIgdGhhbiB0aGF0CithY2hpZXZlZCBieSBtb3JlIGNvbnZlbnRpb25hbCBMWjc3L0xaNzgtYmFzZWQgY29tcHJlc3NvcnMsCithbmQgIGFwcHJvYWNoZXMgIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgUFBNIGZhbWlseSBvZiBzdGF0aXN0aWNhbCBjb21wcmVzc29ycy4KKworQGNvZGV7YnppcDJ9IGlzIGJ1aWx0IG9uIHRvcCBvZiBAY29kZXtsaWJiemlwMn0sIGEgZmxleGlibGUgbGlicmFyeQorZm9yIGhhbmRsaW5nIGNvbXByZXNzZWQgZGF0YSBpbiB0aGUgQGNvZGV7YnppcDJ9IGZvcm1hdC4gIFRoaXMgbWFudWFsCitkZXNjcmliZXMgYm90aCBob3cgdG8gdXNlIHRoZSBwcm9ncmFtIGFuZCAKK2hvdyB0byB3b3JrIHdpdGggdGhlIGxpYnJhcnkgaW50ZXJmYWNlLiAgTW9zdCBvZiB0aGUKK21hbnVhbCBpcyBkZXZvdGVkIHRvIHRoaXMgbGlicmFyeSwgbm90IHRoZSBwcm9ncmFtLCAKK3doaWNoIGlzIGdvb2QgbmV3cyBpZiB5b3VyIGludGVyZXN0IGlzIG9ubHkgaW4gdGhlIHByb2dyYW0uCisKK0NoYXB0ZXIgMiBkZXNjcmliZXMgaG93IHRvIHVzZSBAY29kZXtiemlwMn07IHRoaXMgaXMgdGhlIG9ubHkgcGFydCAKK3lvdSBuZWVkIHRvIHJlYWQgaWYgeW91IGp1c3Qgd2FudCB0byBrbm93IGhvdyB0byBvcGVyYXRlIHRoZSBwcm9ncmFtLgorQ2hhcHRlciAzIGRlc2NyaWJlcyB0aGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyBpbiBkZXRhaWwsIGFuZAorQ2hhcHRlciA0IHJlY29yZHMgc29tZSBtaXNjZWxsYW5lb3VzIG5vdGVzIHdoaWNoIEkgdGhvdWdodAorb3VnaHQgdG8gYmUgcmVjb3JkZWQgc29tZXdoZXJlLgorCisKK0BjaGFwdGVyIEhvdyB0byB1c2UgQGNvZGV7YnppcDJ9CisKK1RoaXMgY2hhcHRlciBjb250YWlucyBhIGNvcHkgb2YgdGhlIEBjb2Rle2J6aXAyfSBtYW4gcGFnZSwKK2FuZCBub3RoaW5nIGVsc2UuCitAZXhhbXBsZQorTkFNRQorICAgICAgIGJ6aXAyLCBidW56aXAyIC0gYSBibG9jay1zb3J0aW5nIGZpbGUgY29tcHJlc3NvciwgdjAuOS4wCisgICAgICAgYnpjYXQgLSBkZWNvbXByZXNzZXMgZmlsZXMgdG8gc3Rkb3V0CisgICAgICAgYnppcDJyZWNvdmVyIC0gcmVjb3ZlcnMgZGF0YSBmcm9tIGRhbWFnZWQgYnppcDIgZmlsZXMKKworCitTWU5PUFNJUworICAgICAgIGJ6aXAyIFsgLWNkZmtzdHZ6VkwxMjM0NTY3ODkgXSBbIGZpbGVuYW1lcyAuLi4gIF0KKyAgICAgICBidW56aXAyIFsgLWZrdnNWTCBdIFsgZmlsZW5hbWVzIC4uLiAgXQorICAgICAgIGJ6Y2F0IFsgLXMgXSBbIGZpbGVuYW1lcyAuLi4gIF0KKyAgICAgICBiemlwMnJlY292ZXIgZmlsZW5hbWUKKworCitERVNDUklQVElPTgorICAgICAgIGJ6aXAyICBjb21wcmVzc2VzICBmaWxlcyAgdXNpbmcgdGhlIEJ1cnJvd3MtV2hlZWxlciBibG9jay0KKyAgICAgICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCAgYW5kICBIdWZmbWFuICBjb2RpbmcuCisgICAgICAgQ29tcHJlc3Npb24gIGlzICBnZW5lcmFsbHkgIGNvbnNpZGVyYWJseSAgYmV0dGVyIHRoYW4gdGhhdAorICAgICAgIGFjaGlldmVkIGJ5IG1vcmUgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywKKyAgICAgICBhbmQgIGFwcHJvYWNoZXMgIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgUFBNIGZhbWlseSBvZiBzdGEtCisgICAgICAgdGlzdGljYWwgY29tcHJlc3NvcnMuCisKKyAgICAgICBUaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIGRlbGliZXJhdGVseSB2ZXJ5IHNpbWlsYXIgIHRvCisgICAgICAgdGhvc2Ugb2YgR05VIEd6aXAsIGJ1dCB0aGV5IGFyZSBub3QgaWRlbnRpY2FsLgorCisgICAgICAgYnppcDIgIGV4cGVjdHMgIGEgbGlzdCBvZiBmaWxlIG5hbWVzIHRvIGFjY29tcGFueSB0aGUgY29tLQorICAgICAgIG1hbmQtbGluZSBmbGFncy4gIEVhY2ggZmlsZSBpcyByZXBsYWNlZCAgYnkgIGEgIGNvbXByZXNzZWQKKyAgICAgICB2ZXJzaW9uICBvZiAgaXRzZWxmLCAgd2l0aCAgdGhlICBuYW1lICJvcmlnaW5hbF9uYW1lLmJ6MiIuCisgICAgICAgRWFjaCBjb21wcmVzc2VkIGZpbGUgaGFzIHRoZSBzYW1lICBtb2RpZmljYXRpb24gIGRhdGUgIGFuZAorICAgICAgIHBlcm1pc3Npb25zICBhcyAgdGhlIGNvcnJlc3BvbmRpbmcgb3JpZ2luYWwsIHNvIHRoYXQgdGhlc2UKKyAgICAgICBwcm9wZXJ0aWVzIGNhbiAgYmUgIGNvcnJlY3RseSAgcmVzdG9yZWQgIGF0ICBkZWNvbXByZXNzaW9uCisgICAgICAgdGltZS4gIEZpbGUgbmFtZSBoYW5kbGluZyBpcyBuYWl2ZSBpbiB0aGUgc2Vuc2UgdGhhdCB0aGVyZQorICAgICAgIGlzIG5vIG1lY2hhbmlzbSBmb3IgcHJlc2VydmluZyBvcmlnaW5hbCBmaWxlICBuYW1lcywgIHBlci0KKyAgICAgICBtaXNzaW9ucyAgYW5kICBkYXRlcyAgaW4gZmlsZXN5c3RlbXMgd2hpY2ggbGFjayB0aGVzZSBjb24tCisgICAgICAgY2VwdHMsIG9yIGhhdmUgc2VyaW91cyBmaWxlIG5hbWUgbGVuZ3RoIHJlc3RyaWN0aW9ucywgc3VjaAorICAgICAgIGFzIE1TLURPUy4KKworICAgICAgIGJ6aXAyICBhbmQgIGJ1bnppcDIgd2lsbCBieSBkZWZhdWx0IG5vdCBvdmVyd3JpdGUgZXhpc3RpbmcKKyAgICAgICBmaWxlczsgaWYgeW91IHdhbnQgdGhpcyB0byBoYXBwZW4sIHNwZWNpZnkgdGhlIC1mIGZsYWcuCisKKyAgICAgICBJZiBubyBmaWxlIG5hbWVzICBhcmUgIHNwZWNpZmllZCwgIGJ6aXAyICBjb21wcmVzc2VzICBmcm9tCisgICAgICAgc3RhbmRhcmQgIGlucHV0ICB0byAgc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcyBjYXNlLCBiemlwMgorICAgICAgIHdpbGwgZGVjbGluZSB0byB3cml0ZSBjb21wcmVzc2VkIG91dHB1dCB0byBhIHRlcm1pbmFsLCAgYXMKKyAgICAgICB0aGlzICB3b3VsZCAgYmUgIGVudGlyZWx5ICBpbmNvbXByZWhlbnNpYmxlICBhbmQgdGhlcmVmb3JlCisgICAgICAgcG9pbnRsZXNzLgorCisgICAgICAgYnVuemlwMiAob3IgYnppcDIgLWQgKSBkZWNvbXByZXNzZXMgYW5kIHJlc3RvcmVzIGFsbCBzcGVjLQorICAgICAgIGlmaWVkIGZpbGVzIHdob3NlIG5hbWVzIGVuZCBpbiAiLmJ6MiIuICBGaWxlcyB3aXRob3V0IHRoaXMKKyAgICAgICBzdWZmaXggYXJlIGlnbm9yZWQuICBBZ2Fpbiwgc3VwcGx5aW5nIG5vIGZpbGVuYW1lcyAgY2F1c2VzCisgICAgICAgZGVjb21wcmVzc2lvbiBmcm9tIHN0YW5kYXJkIGlucHV0IHRvIHN0YW5kYXJkIG91dHB1dC4KKworICAgICAgIGJ1bnppcDIgd2lsbCBjb3JyZWN0bHkgZGVjb21wcmVzcyBhIGZpbGUgd2hpY2ggaXMgdGhlIGNvbi0KKyAgICAgICBjYXRlbmF0aW9uIG9mIHR3byBvciBtb3JlIGNvbXByZXNzZWQgZmlsZXMuICBUaGUgcmVzdWx0IGlzCisgICAgICAgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgdW5jb21wcmVzc2VkIGZpbGVzLgorICAgICAgIEludGVncml0eSB0ZXN0aW5nICgtdCkgb2YgY29uY2F0ZW5hdGVkIGNvbXByZXNzZWQgZmlsZXMgaXMKKyAgICAgICBhbHNvIHN1cHBvcnRlZC4KKworICAgICAgIFlvdSAgY2FuIGFsc28gY29tcHJlc3Mgb3IgZGVjb21wcmVzcyBmaWxlcyB0byB0aGUgc3RhbmRhcmQKKyAgICAgICBvdXRwdXQgYnkgZ2l2aW5nIHRoZSAtYyBmbGFnLiAgTXVsdGlwbGUgZmlsZXMgbWF5IGJlICBjb20tCisgICAgICAgcHJlc3NlZCBhbmQgZGVjb21wcmVzc2VkIGxpa2UgdGhpcy4gIFRoZSByZXN1bHRpbmcgb3V0cHV0cworICAgICAgIGFyZSBmZWQgc2VxdWVudGlhbGx5IHRvIHN0ZG91dC4gIENvbXByZXNzaW9uICBvZiAgbXVsdGlwbGUKKyAgICAgICBmaWxlcyAgaW4gdGhpcyBtYW5uZXIgZ2VuZXJhdGVzIGEgc3RyZWFtIGNvbnRhaW5pbmcgbXVsdGktCisgICAgICAgcGxlIGNvbXByZXNzZWQgZmlsZSByZXByZXNlbnRhdGlvbnMuICBTdWNoIGEgc3RyZWFtIGNhbiBiZQorICAgICAgIGRlY29tcHJlc3NlZCAgY29ycmVjdGx5ICBvbmx5ICBieSAgYnppcDIgIHZlcnNpb24gMC45LjAgb3IKKyAgICAgICBsYXRlci4gIEVhcmxpZXIgdmVyc2lvbnMgb2YgYnppcDIgd2lsbCBzdG9wICBhZnRlciAgZGVjb20tCisgICAgICAgcHJlc3NpbmcgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIHN0cmVhbS4KKworICAgICAgIGJ6Y2F0ICAob3IgYnppcDIgLWRjICkgZGVjb21wcmVzc2VzIGFsbCBzcGVjaWZpZWQgZmlsZXMgdG8KKyAgICAgICB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCisgICAgICAgQ29tcHJlc3Npb24gaXMgYWx3YXlzIHBlcmZvcm1lZCwgZXZlbiAgaWYgIHRoZSAgY29tcHJlc3NlZAorICAgICAgIGZpbGUgIGlzIHNsaWdodGx5IGxhcmdlciB0aGFuIHRoZSBvcmlnaW5hbC4gIEZpbGVzIG9mIGxlc3MKKyAgICAgICB0aGFuIGFib3V0IG9uZSBodW5kcmVkIGJ5dGVzIHRlbmQgdG8gZ2V0IGxhcmdlciwgc2luY2UgdGhlCisgICAgICAgY29tcHJlc3Npb24gIG1lY2hhbmlzbSAgaGFzICBhICBjb25zdGFudCAgb3ZlcmhlYWQgIGluIHRoZQorICAgICAgIHJlZ2lvbiBvZiA1MCBieXRlcy4gIFJhbmRvbSBkYXRhIChpbmNsdWRpbmcgdGhlIG91dHB1dCAgb2YKKyAgICAgICBtb3N0ICBmaWxlICBjb21wcmVzc29ycykgIGlzICBjb2RlZCBhdCBhYm91dCA4LjA1IGJpdHMgcGVyCisgICAgICAgYnl0ZSwgZ2l2aW5nIGFuIGV4cGFuc2lvbiBvZiBhcm91bmQgMC41JS4KKworICAgICAgIEFzIGEgc2VsZi1jaGVjayBmb3IgeW91ciAgcHJvdGVjdGlvbiwgIGJ6aXAyICB1c2VzICAzMi1iaXQKKyAgICAgICBDUkNzICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGVjb21wcmVzc2VkIHZlcnNpb24gb2YgYSBmaWxlCisgICAgICAgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgZ3VhcmRzIGFnYWluc3QgY29ycnVwLQorICAgICAgIHRpb24gIG9mICB0aGUgY29tcHJlc3NlZCBkYXRhLCBhbmQgYWdhaW5zdCB1bmRldGVjdGVkIGJ1Z3MKKyAgICAgICBpbiBiemlwMiAoaG9wZWZ1bGx5IHZlcnkgdW5saWtlbHkpLiAgVGhlIGNoYW5jZXMgIG9mICBkYXRhCisgICAgICAgY29ycnVwdGlvbiAgZ29pbmcgIHVuZGV0ZWN0ZWQgIGlzICBtaWNyb3Njb3BpYywgIGFib3V0IG9uZQorICAgICAgIGNoYW5jZSBpbiBmb3VyIGJpbGxpb24gZm9yIGVhY2ggZmlsZSBwcm9jZXNzZWQuICBCZSBhd2FyZSwKKyAgICAgICB0aG91Z2gsICB0aGF0ICB0aGUgIGNoZWNrIG9jY3VycyB1cG9uIGRlY29tcHJlc3Npb24sIHNvIGl0CisgICAgICAgY2FuIG9ubHkgdGVsbCB5b3UgdGhhdCB0aGF0IHNvbWV0aGluZyBpcyB3cm9uZy4gIEl0ICBjYW4ndAorICAgICAgIGhlbHAgIHlvdSByZWNvdmVyIHRoZSBvcmlnaW5hbCB1bmNvbXByZXNzZWQgZGF0YS4gIFlvdSBjYW4KKyAgICAgICB1c2UgYnppcDJyZWNvdmVyIHRvICB0cnkgIHRvICByZWNvdmVyICBkYXRhICBmcm9tICBkYW1hZ2VkCisgICAgICAgZmlsZXMuCisKKyAgICAgICBSZXR1cm4gIHZhbHVlczogIDAgIGZvciBhIG5vcm1hbCBleGl0LCAxIGZvciBlbnZpcm9ubWVudGFsCisgICAgICAgcHJvYmxlbXMgKGZpbGUgbm90IGZvdW5kLCBpbnZhbGlkIGZsYWdzLCBJL08gZXJyb3JzLCAgJmMpLAorICAgICAgIDIgdG8gaW5kaWNhdGUgYSBjb3JydXB0IGNvbXByZXNzZWQgZmlsZSwgMyBmb3IgYW4gaW50ZXJuYWwKKyAgICAgICBjb25zaXN0ZW5jeSBlcnJvciAoZWcsIGJ1Zykgd2hpY2ggY2F1c2VkIGJ6aXAyIHRvIHBhbmljLgorCisKK01FTU9SWSBNQU5BR0VNRU5UCisgICAgICAgQnppcDIgY29tcHJlc3NlcyBsYXJnZSBmaWxlcyBpbiBibG9ja3MuICAgVGhlICBibG9jayAgc2l6ZQorICAgICAgIGFmZmVjdHMgIGJvdGggIHRoZSAgY29tcHJlc3Npb24gIHJhdGlvICBhY2hpZXZlZCwgIGFuZCB0aGUKKyAgICAgICBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCBib3RoIGZvciAgY29tcHJlc3Npb24gIGFuZCAgZGVjb20tCisgICAgICAgcHJlc3Npb24uICAgVGhlIGZsYWdzIC0xIHRocm91Z2ggLTkgc3BlY2lmeSB0aGUgYmxvY2sgc2l6ZQorICAgICAgIHRvIGJlIDEwMCwwMDAgYnl0ZXMgdGhyb3VnaCA5MDAsMDAwICBieXRlcyAgKHRoZSAgZGVmYXVsdCkKKyAgICAgICByZXNwZWN0aXZlbHkuICAgQXQgZGVjb21wcmVzc2lvbi10aW1lLCB0aGUgYmxvY2sgc2l6ZSB1c2VkCisgICAgICAgZm9yIGNvbXByZXNzaW9uIGlzIHJlYWQgZnJvbSB0aGUgaGVhZGVyIG9mIHRoZSAgY29tcHJlc3NlZAorICAgICAgIGZpbGUsIGFuZCBidW56aXAyIHRoZW4gYWxsb2NhdGVzIGl0c2VsZiBqdXN0IGVub3VnaCBtZW1vcnkKKyAgICAgICB0byBkZWNvbXByZXNzIHRoZSBmaWxlLiAgU2luY2UgYmxvY2sgc2l6ZXMgYXJlICBzdG9yZWQgIGluCisgICAgICAgY29tcHJlc3NlZCAgZmlsZXMsICBpdCBmb2xsb3dzIHRoYXQgdGhlIGZsYWdzIC0xIHRvIC05IGFyZQorICAgICAgIGlycmVsZXZhbnQgIHRvICBhbmQgIHNvICBpZ25vcmVkICAgZHVyaW5nICAgZGVjb21wcmVzc2lvbi4KKworICAgICAgIENvbXByZXNzaW9uICBhbmQgZGVjb21wcmVzc2lvbiByZXF1aXJlbWVudHMsIGluIGJ5dGVzLCBjYW4KKyAgICAgICBiZSBlc3RpbWF0ZWQgYXM6CisKKyAgICAgICAgICAgICBDb21wcmVzc2lvbjogICA0MDBrICsgKCA3IHggYmxvY2sgc2l6ZSApCisKKyAgICAgICAgICAgICBEZWNvbXByZXNzaW9uOiAxMDBrICsgKCA0IHggYmxvY2sgc2l6ZSApLCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMGsgKyAoIDIuNSB4IGJsb2NrIHNpemUgKQorCisgICAgICAgTGFyZ2VyICBibG9jayAgc2l6ZXMgIGdpdmUgIHJhcGlkbHkgIGRpbWluaXNoaW5nICBtYXJnaW5hbAorICAgICAgIHJldHVybnM7ICBtb3N0IG9mIHRoZSBjb21wcmVzc2lvbiBjb21lcyBmcm9tIHRoZSBmaXJzdCB0d28KKyAgICAgICBvciB0aHJlZSBodW5kcmVkIGsgb2YgYmxvY2sgc2l6ZSwgYSBmYWN0IHdvcnRoIGJlYXJpbmcgIGluCisgICAgICAgbWluZCAgd2hlbiAgdXNpbmcgIGJ6aXAyICBvbiAgc21hbGwgIG1hY2hpbmVzLiAgSXQgaXMgYWxzbworICAgICAgIGltcG9ydGFudCB0byAgYXBwcmVjaWF0ZSAgdGhhdCAgdGhlICBkZWNvbXByZXNzaW9uICBtZW1vcnkKKyAgICAgICByZXF1aXJlbWVudCAgaXMgIHNldCAgYXQgY29tcHJlc3Npb24tdGltZSBieSB0aGUgY2hvaWNlIG9mCisgICAgICAgYmxvY2sgc2l6ZS4KKworICAgICAgIEZvciBmaWxlcyBjb21wcmVzc2VkIHdpdGggdGhlICBkZWZhdWx0ICA5MDBrICBibG9jayAgc2l6ZSwKKyAgICAgICBidW56aXAyICB3aWxsIHJlcXVpcmUgYWJvdXQgMzcwMCBrYnl0ZXMgdG8gZGVjb21wcmVzcy4gIFRvCisgICAgICAgc3VwcG9ydCBkZWNvbXByZXNzaW9uIG9mIGFueSBmaWxlIG9uIGEgNCBtZWdhYnl0ZSBtYWNoaW5lLAorICAgICAgIGJ1bnppcDIgIGhhcyAgYW4gIG9wdGlvbiB0byBkZWNvbXByZXNzIHVzaW5nIGFwcHJveGltYXRlbHkKKyAgICAgICBoYWxmIHRoaXMgYW1vdW50IG9mIG1lbW9yeSwgYWJvdXQgMjMwMCBrYnl0ZXMuICBEZWNvbXByZXMtCisgICAgICAgc2lvbiAgc3BlZWQgIGlzIGFsc28gaGFsdmVkLCBzbyB5b3Ugc2hvdWxkIHVzZSB0aGlzIG9wdGlvbgorICAgICAgIG9ubHkgd2hlcmUgbmVjZXNzYXJ5LiAgVGhlIHJlbGV2YW50IGZsYWcgaXMgLXMuCisKKyAgICAgICBJbiBnZW5lcmFsLCB0cnkgYW5kIHVzZSB0aGUgbGFyZ2VzdCBibG9jayBzaXplIG1lbW9yeSBjb24tCisgICAgICAgc3RyYWludHMgIGFsbG93LCAgc2luY2UgIHRoYXQgIG1heGltaXNlcyAgdGhlICBjb21wcmVzc2lvbgorICAgICAgIGFjaGlldmVkLiAgQ29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gc3BlZWQgYXJlICB2aXJ0dS0KKyAgICAgICBhbGx5IHVuYWZmZWN0ZWQgYnkgYmxvY2sgc2l6ZS4KKworICAgICAgIEFub3RoZXIgIHNpZ25pZmljYW50IHBvaW50IGFwcGxpZXMgdG8gZmlsZXMgd2hpY2ggZml0IGluIGEKKyAgICAgICBzaW5nbGUgYmxvY2sgLS0gdGhhdCAgbWVhbnMgIG1vc3QgIGZpbGVzICB5b3UnZCAgZW5jb3VudGVyCisgICAgICAgdXNpbmcgIGEgIGxhcmdlICBibG9jayAgc2l6ZS4gICBUaGUgIGFtb3VudCBvZiByZWFsIG1lbW9yeQorICAgICAgIHRvdWNoZWQgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBmaWxlLCBzaW5jZSB0aGUKKyAgICAgICBmaWxlICBpcyBzbWFsbGVyIHRoYW4gYSBibG9jay4gIEZvciBleGFtcGxlLCBjb21wcmVzc2luZyBhCisgICAgICAgZmlsZSAyMCwwMDAgYnl0ZXMgbG9uZyB3aXRoIHRoZSBmbGFnICAtOSAgd2lsbCAgY2F1c2UgIHRoZQorICAgICAgIGNvbXByZXNzb3IgIHRvICBhbGxvY2F0ZSAgYXJvdW5kIDY3MDBrIG9mIG1lbW9yeSwgYnV0IG9ubHkKKyAgICAgICB0b3VjaCA0MDBrICsgMjAwMDAgKiA3ID0gNTQwIGtieXRlcyBvZiBpdC4gIFNpbWlsYXJseSwgdGhlCisgICAgICAgZGVjb21wcmVzc29yICB3aWxsICBhbGxvY2F0ZSAgMzcwMGsgIGJ1dCBvbmx5IHRvdWNoIDEwMGsgKworICAgICAgIDIwMDAwICogNCA9IDE4MCBrYnl0ZXMuCisKKyAgICAgICBIZXJlIGlzIGEgdGFibGUgd2hpY2ggc3VtbWFyaXNlcyB0aGUgbWF4aW11bSBtZW1vcnkgIHVzYWdlCisgICAgICAgZm9yICBkaWZmZXJlbnQgIGJsb2NrICBzaXplcy4gICBBbHNvIHJlY29yZGVkIGlzIHRoZSB0b3RhbAorICAgICAgIGNvbXByZXNzZWQgc2l6ZSBmb3IgMTQgZmlsZXMgb2YgdGhlIENhbGdhcnkgVGV4dCAgQ29tcHJlcy0KKyAgICAgICBzaW9uICBDb3JwdXMgdG90YWxsaW5nIDMsMTQxLDYyMiBieXRlcy4gIFRoaXMgY29sdW1uIGdpdmVzCisgICAgICAgc29tZSBmZWVsIGZvciBob3cgIGNvbXByZXNzaW9uICB2YXJpZXMgIHdpdGggIGJsb2NrICBzaXplLgorICAgICAgIFRoZXNlICBmaWd1cmVzICB0ZW5kIHRvIHVuZGVyc3RhdGUgdGhlIGFkdmFudGFnZSBvZiBsYXJnZXIKKyAgICAgICBibG9jayBzaXplcyBmb3IgbGFyZ2VyIGZpbGVzLCBzaW5jZSB0aGUgIENvcnB1cyAgaXMgIGRvbWktCisgICAgICAgbmF0ZWQgYnkgc21hbGxlciBmaWxlcy4KKworICAgICAgICAgICAgICAgICAgQ29tcHJlc3MgICBEZWNvbXByZXNzICAgRGVjb21wcmVzcyAgIENvcnB1cworICAgICAgICAgICBGbGFnICAgICB1c2FnZSAgICAgIHVzYWdlICAgICAgIC1zIHVzYWdlICAgICBTaXplCisKKyAgICAgICAgICAgIC0xICAgICAgMTEwMGsgICAgICAgNTAwayAgICAgICAgIDM1MGsgICAgICA5MTQ3MDQKKyAgICAgICAgICAgIC0yICAgICAgMTgwMGsgICAgICAgOTAwayAgICAgICAgIDYwMGsgICAgICA4Nzc3MDMKKyAgICAgICAgICAgIC0zICAgICAgMjUwMGsgICAgICAxMzAwayAgICAgICAgIDg1MGsgICAgICA4NjAzMzgKKyAgICAgICAgICAgIC00ICAgICAgMzIwMGsgICAgICAxNzAwayAgICAgICAgMTEwMGsgICAgICA4NDY4OTkKKyAgICAgICAgICAgIC01ICAgICAgMzkwMGsgICAgICAyMTAwayAgICAgICAgMTM1MGsgICAgICA4NDUxNjAKKyAgICAgICAgICAgIC02ICAgICAgNDYwMGsgICAgICAyNTAwayAgICAgICAgMTYwMGsgICAgICA4Mzg2MjYKKyAgICAgICAgICAgIC03ICAgICAgNTQwMGsgICAgICAyOTAwayAgICAgICAgMTg1MGsgICAgICA4MzQwOTYKKyAgICAgICAgICAgIC04ICAgICAgNjAwMGsgICAgICAzMzAwayAgICAgICAgMjEwMGsgICAgICA4Mjg2NDIKKyAgICAgICAgICAgIC05ICAgICAgNjcwMGsgICAgICAzNzAwayAgICAgICAgMjM1MGsgICAgICA4Mjg2NDIKKworCitPUFRJT05TCisgICAgICAgLWMgLS1zdGRvdXQKKyAgICAgICAgICAgICAgQ29tcHJlc3Mgb3IgZGVjb21wcmVzcyB0byBzdGFuZGFyZCBvdXRwdXQuICAtYyB3aWxsCisgICAgICAgICAgICAgIGRlY29tcHJlc3MgbXVsdGlwbGUgZmlsZXMgdG8gc3Rkb3V0LCBidXQgd2lsbCAgb25seQorICAgICAgICAgICAgICBjb21wcmVzcyBhIHNpbmdsZSBmaWxlIHRvIHN0ZG91dC4KKworICAgICAgIC1kIC0tZGVjb21wcmVzcworICAgICAgICAgICAgICBGb3JjZSAgZGVjb21wcmVzc2lvbi4gIGJ6aXAyLCBidW56aXAyIGFuZCBiemNhdCBhcmUKKyAgICAgICAgICAgICAgcmVhbGx5IHRoZSBzYW1lIHByb2dyYW0sICBhbmQgIHRoZSAgZGVjaXNpb24gIGFib3V0CisgICAgICAgICAgICAgIHdoYXQgIGFjdGlvbnMgdG8gdGFrZSBpcyBkb25lIG9uIHRoZSBiYXNpcyBvZiB3aGljaAorICAgICAgICAgICAgICBuYW1lIGlzIHVzZWQuICBUaGlzIGZsYWcgb3ZlcnJpZGVzIHRoYXQgIG1lY2hhbmlzbSwKKyAgICAgICAgICAgICAgYW5kIGZvcmNlcyBiemlwMiB0byBkZWNvbXByZXNzLgorCisgICAgICAgLXogLS1jb21wcmVzcworICAgICAgICAgICAgICBUaGUgIGNvbXBsZW1lbnQgIHRvIC1kOiBmb3JjZXMgY29tcHJlc3Npb24sIHJlZ2FyZC0KKyAgICAgICAgICAgICAgbGVzcyBvZiB0aGUgaW52b2thdGlvbiBuYW1lLgorCisgICAgICAgLXQgLS10ZXN0CisgICAgICAgICAgICAgIENoZWNrIGludGVncml0eSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUocyksIGJ1dCBkb24ndAorICAgICAgICAgICAgICBkZWNvbXByZXNzICB0aGVtLiAgIFRoaXMgIHJlYWxseSAgcGVyZm9ybXMgIGEgdHJpYWwKKyAgICAgICAgICAgICAgZGVjb21wcmVzc2lvbiBhbmQgdGhyb3dzIGF3YXkgdGhlIHJlc3VsdC4KKworICAgICAgIC1mIC0tZm9yY2UKKyAgICAgICAgICAgICAgRm9yY2Ugb3ZlcndyaXRlIG9mIG91dHB1dCBmaWxlcy4gICBOb3JtYWxseSwgIGJ6aXAyCisgICAgICAgICAgICAgIHdpbGwgbm90IG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMuCisKKyAgICAgICAtayAtLWtlZXAKKyAgICAgICAgICAgICAgS2VlcCAgKGRvbid0IGRlbGV0ZSkgaW5wdXQgZmlsZXMgZHVyaW5nIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgIG9yIGRlY29tcHJlc3Npb24uCisKKyAgICAgICAtcyAtLXNtYWxsCisgICAgICAgICAgICAgIFJlZHVjZSBtZW1vcnkgdXNhZ2UsIGZvciBjb21wcmVzc2lvbiwgZGVjb21wcmVzc2lvbgorICAgICAgICAgICAgICBhbmQgIHRlc3RpbmcuICAgRmlsZXMgIGFyZSAgZGVjb21wcmVzc2VkIGFuZCB0ZXN0ZWQKKyAgICAgICAgICAgICAgdXNpbmcgYSBtb2RpZmllZCBhbGdvcml0aG0gd2hpY2ggb25seSByZXF1aXJlcyAgMi41CisgICAgICAgICAgICAgIGJ5dGVzICBwZXIgIGJsb2NrIGJ5dGUuICBUaGlzIG1lYW5zIGFueSBmaWxlIGNhbiBiZQorICAgICAgICAgICAgICBkZWNvbXByZXNzZWQgaW4gMjMwMGsgb2YgbWVtb3J5LCAgYWxiZWl0ICBhdCAgYWJvdXQKKyAgICAgICAgICAgICAgaGFsZiB0aGUgbm9ybWFsIHNwZWVkLgorCisgICAgICAgICAgICAgIER1cmluZyAgY29tcHJlc3Npb24sICAtcyAgc2VsZWN0cyAgYSAgYmxvY2sgc2l6ZSBvZgorICAgICAgICAgICAgICAyMDBrLCB3aGljaCBsaW1pdHMgbWVtb3J5IHVzZSB0byAgYXJvdW5kICB0aGUgIHNhbWUKKyAgICAgICAgICAgICAgZmlndXJlLCAgYXQgIHRoZSBleHBlbnNlIG9mIHlvdXIgY29tcHJlc3Npb24gcmF0aW8uCisgICAgICAgICAgICAgIEluIHNob3J0LCBpZiB5b3VyICBtYWNoaW5lICBpcyAgbG93ICBvbiAgbWVtb3J5ICAoOAorICAgICAgICAgICAgICBtZWdhYnl0ZXMgIG9yICBsZXNzKSwgIHVzZSAgLXMgZm9yIGV2ZXJ5dGhpbmcuICBTZWUKKyAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgYWJvdmUuCisKKyAgICAgICAtdiAtLXZlcmJvc2UKKyAgICAgICAgICAgICAgVmVyYm9zZSBtb2RlIC0tIHNob3cgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGZvciBlYWNoCisgICAgICAgICAgICAgIGZpbGUgIHByb2Nlc3NlZC4gICBGdXJ0aGVyICAtdidzICBpbmNyZWFzZSB0aGUgdmVyLQorICAgICAgICAgICAgICBib3NpdHkgbGV2ZWwsIHNwZXdpbmcgb3V0IGxvdHMgb2YgaW5mb3JtYXRpb24gd2hpY2gKKyAgICAgICAgICAgICAgaXMgcHJpbWFyaWx5IG9mIGludGVyZXN0IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgorCisgICAgICAgLUwgLS1saWNlbnNlIC1WIC0tdmVyc2lvbgorICAgICAgICAgICAgICBEaXNwbGF5ICB0aGUgIHNvZnR3YXJlICB2ZXJzaW9uLCAgbGljZW5zZSB0ZXJtcyBhbmQKKyAgICAgICAgICAgICAgY29uZGl0aW9ucy4KKworICAgICAgIC0xIHRvIC05CisgICAgICAgICAgICAgIFNldCB0aGUgYmxvY2sgc2l6ZSB0byAxMDAgaywgMjAwIGsgLi4gIDkwMCAgayAgd2hlbgorICAgICAgICAgICAgICBjb21wcmVzc2luZy4gICBIYXMgIG5vICBlZmZlY3QgIHdoZW4gZGVjb21wcmVzc2luZy4KKyAgICAgICAgICAgICAgU2VlIE1FTU9SWSBNQU5BR0VNRU5UIGFib3ZlLgorCisgICAgICAgLS1yZXBldGl0aXZlLWZhc3QKKyAgICAgICAgICAgICAgYnppcDIgaW5qZWN0cyBzb21lIHNtYWxsICBwc2V1ZG8tcmFuZG9tICB2YXJpYXRpb25zCisgICAgICAgICAgICAgIGludG8gIHZlcnkgIHJlcGV0aXRpdmUgIGJsb2NrcyAgdG8gbGltaXQgd29yc3QtY2FzZQorICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBkdXJpbmcgY29tcHJlc3Npb24uICAgSWYgIHNvcnRpbmcgIHJ1bnMKKyAgICAgICAgICAgICAgaW50byAgZGlmZmljdWx0aWVzLCAgdGhlICBibG9jayAgaXMgcmFuZG9taXNlZCwgYW5kCisgICAgICAgICAgICAgIHNvcnRpbmcgaXMgcmVzdGFydGVkLiAgVmVyeSByb3VnaGx5LCBiemlwMiBwZXJzaXN0cworICAgICAgICAgICAgICBmb3IgIHRocmVlICB0aW1lcyAgYXMgIGxvbmcgYXMgYSB3ZWxsLWJlaGF2ZWQgaW5wdXQKKyAgICAgICAgICAgICAgd291bGQgdGFrZSBiZWZvcmUgcmVzb3J0aW5nIHRvIHJhbmRvbWlzYXRpb24uICBUaGlzCisgICAgICAgICAgICAgIGZsYWcgbWFrZXMgaXQgZ2l2ZSB1cCBtdWNoIHNvb25lci4KKworICAgICAgIC0tcmVwZXRpdGl2ZS1iZXN0CisgICAgICAgICAgICAgIE9wcG9zaXRlICBvZiAgLS1yZXBldGl0aXZlLWZhc3Q7ICB0cnkgIGEgbG90IGhhcmRlcgorICAgICAgICAgICAgICBiZWZvcmUgcmVzb3J0aW5nIHRvIHJhbmRvbWlzYXRpb24uCisKKworUkVDT1ZFUklORyBEQVRBIEZST00gREFNQUdFRCBGSUxFUworICAgICAgIGJ6aXAyIGNvbXByZXNzZXMgZmlsZXMgaW4gYmxvY2tzLCB1c3VhbGx5IDkwMGtieXRlcyAgbG9uZy4KKyAgICAgICBFYWNoIGJsb2NrIGlzIGhhbmRsZWQgaW5kZXBlbmRlbnRseS4gIElmIGEgbWVkaWEgb3IgdHJhbnMtCisgICAgICAgbWlzc2lvbiBlcnJvciBjYXVzZXMgYSBtdWx0aS1ibG9jayAgLmJ6MiAgZmlsZSAgdG8gIGJlY29tZQorICAgICAgIGRhbWFnZWQsICBpdCAgbWF5ICBiZSAgcG9zc2libGUgIHRvICByZWNvdmVyIGRhdGEgZnJvbSB0aGUKKyAgICAgICB1bmRhbWFnZWQgYmxvY2tzIGluIHRoZSBmaWxlLgorCisgICAgICAgVGhlIGNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBibG9jayAgaXMgIGRlbGltaXRlZAorICAgICAgIGJ5ICBhICA0OC1iaXQgcGF0dGVybiwgd2hpY2ggbWFrZXMgaXQgcG9zc2libGUgdG8gZmluZCB0aGUKKyAgICAgICBibG9jayBib3VuZGFyaWVzIHdpdGggcmVhc29uYWJsZSAgY2VydGFpbnR5LiAgIEVhY2ggIGJsb2NrCisgICAgICAgYWxzbyAgY2FycmllcyBpdHMgb3duIDMyLWJpdCBDUkMsIHNvIGRhbWFnZWQgYmxvY2tzIGNhbiBiZQorICAgICAgIGRpc3Rpbmd1aXNoZWQgZnJvbSB1bmRhbWFnZWQgb25lcy4KKworICAgICAgIGJ6aXAycmVjb3ZlciBpcyBhICBzaW1wbGUgIHByb2dyYW0gIHdob3NlICBwdXJwb3NlICBpcyAgdG8KKyAgICAgICBzZWFyY2ggIGZvciBibG9ja3MgaW4gLmJ6MiBmaWxlcywgYW5kIHdyaXRlIGVhY2ggYmxvY2sgb3V0CisgICAgICAgaW50byBpdHMgb3duIC5iejIgZmlsZS4gIFlvdSBjYW4gdGhlbiB1c2UgYnppcDIgLXQgdG8gdGVzdAorICAgICAgIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHJlc3VsdGluZyBmaWxlcywgYW5kIGRlY29tcHJlc3MgdGhvc2UKKyAgICAgICB3aGljaCBhcmUgdW5kYW1hZ2VkLgorCisgICAgICAgYnppcDJyZWNvdmVyIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgbmFtZSBvZiB0aGUgZGFtLQorICAgICAgIGFnZWQgZmlsZSwgYW5kIHdyaXRlcyBhIG51bWJlciBvZiBmaWxlcyAicmVjMDAwMWZpbGUuYnoyIiwKKyAgICAgICAicmVjMDAwMmZpbGUuYnoyIiwgZXRjLCBjb250YWluaW5nIHRoZSAgZXh0cmFjdGVkICBibG9ja3MuCisgICAgICAgVGhlICBvdXRwdXQgIGZpbGVuYW1lcyAgYXJlICBkZXNpZ25lZCAgc28gIHRoYXQgdGhlIHVzZSBvZgorICAgICAgIHdpbGRjYXJkcyBpbiBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgLS0gZm9yIGV4YW1wbGUsICAiYnppcDIKKyAgICAgICAtZGMgIHJlYypmaWxlLmJ6MiAgPiByZWNvdmVyZWRfZGF0YSIgLS0gbGlzdHMgdGhlIGZpbGVzIGluCisgICAgICAgdGhlICJyaWdodCIgb3JkZXIuCisKKyAgICAgICBiemlwMnJlY292ZXIgc2hvdWxkIGJlIG9mIG1vc3QgdXNlIGRlYWxpbmcgd2l0aCBsYXJnZSAuYnoyCisgICAgICAgZmlsZXMsICBhcyAgdGhlc2Ugd2lsbCBjb250YWluIG1hbnkgYmxvY2tzLiAgSXQgaXMgY2xlYXJseQorICAgICAgIGZ1dGlsZSB0byB1c2UgaXQgb24gZGFtYWdlZCBzaW5nbGUtYmxvY2sgIGZpbGVzLCAgc2luY2UgIGEKKyAgICAgICBkYW1hZ2VkICBibG9jayAgY2Fubm90ICBiZSByZWNvdmVyZWQuICBJZiB5b3Ugd2lzaCB0byBtaW4tCisgICAgICAgaW1pc2UgYW55IHBvdGVudGlhbCBkYXRhIGxvc3MgdGhyb3VnaCBtZWRpYSAgb3IgIHRyYW5zbWlzLQorICAgICAgIHNpb24gZXJyb3JzLCB5b3UgbWlnaHQgY29uc2lkZXIgY29tcHJlc3Npbmcgd2l0aCBhIHNtYWxsZXIKKyAgICAgICBibG9jayBzaXplLgorCisKK1BFUkZPUk1BTkNFIE5PVEVTCisgICAgICAgVGhlIHNvcnRpbmcgcGhhc2Ugb2YgY29tcHJlc3Npb24gZ2F0aGVycyB0b2dldGhlciAgc2ltaWxhcgorICAgICAgIHN0cmluZ3MgIGluICB0aGUgIGZpbGUuICBCZWNhdXNlIG9mIHRoaXMsIGZpbGVzIGNvbnRhaW5pbmcKKyAgICAgICB2ZXJ5IGxvbmcgcnVucyBvZiAgcmVwZWF0ZWQgIHN5bWJvbHMsICBsaWtlICAiYWFiYWFiYWFiYWFiCisgICAgICAgLi4uIiAgIChyZXBlYXRlZCAgIHNldmVyYWwgIGh1bmRyZWQgIHRpbWVzKSAgbWF5ICBjb21wcmVzcworICAgICAgIGV4dHJhb3JkaW5hcmlseSBzbG93bHkuICBZb3UgY2FuIHVzZSB0aGUgLXZ2dnZ2IG9wdGlvbiAgdG8KKyAgICAgICBtb25pdG9yIHByb2dyZXNzIGluIGdyZWF0IGRldGFpbCwgaWYgeW91IHdhbnQuICBEZWNvbXByZXMtCisgICAgICAgc2lvbiBzcGVlZCBpcyB1bmFmZmVjdGVkLgorCisgICAgICAgU3VjaCBwYXRob2xvZ2ljYWwgY2FzZXMgc2VlbSByYXJlIGluICBwcmFjdGljZSwgIGFwcGVhcmluZworICAgICAgIG1vc3RseSBpbiBhcnRpZmljaWFsbHktY29uc3RydWN0ZWQgdGVzdCBmaWxlcywgYW5kIGluIGxvdy0KKyAgICAgICBsZXZlbCBkaXNrIGltYWdlcy4gIEl0IG1heSBiZSBpbmFkdmlzYWJsZSB0byB1c2UgYnppcDIgIHRvCisgICAgICAgY29tcHJlc3MgIHRoZSAgbGF0dGVyLiAgIElmIHlvdSBkbyBnZXQgYSBmaWxlIHdoaWNoIGNhdXNlcworICAgICAgIHNldmVyZSBzbG93bmVzcyBpbiBjb21wcmVzc2lvbiwgdHJ5IG1ha2luZyB0aGUgYmxvY2sgIHNpemUKKyAgICAgICBhcyBzbWFsbCBhcyBwb3NzaWJsZSwgd2l0aCBmbGFnIC0xLgorCisgICAgICAgYnppcDIgIHVzdWFsbHkgIGFsbG9jYXRlcyAgc2V2ZXJhbCAgbWVnYWJ5dGVzIG9mIG1lbW9yeSB0bworICAgICAgIG9wZXJhdGUgaW4sIGFuZCB0aGVuIGNoYXJnZXMgYWxsIG92ZXIgaXQgaW4gYSBmYWlybHkgIHJhbi0KKyAgICAgICBkb20gIGZhc2hpb24uICAgVGhpcyBtZWFucyB0aGF0IHBlcmZvcm1hbmNlLCBib3RoIGZvciBjb20tCisgICAgICAgcHJlc3NpbmcgYW5kIGRlY29tcHJlc3NpbmcsIGlzIGxhcmdlbHkgZGV0ZXJtaW5lZCAgYnkgIHRoZQorICAgICAgIHNwZWVkICBhdCAgd2hpY2ggIHlvdXIgIG1hY2hpbmUgIGNhbiBzZXJ2aWNlIGNhY2hlIG1pc3Nlcy4KKyAgICAgICBCZWNhdXNlIG9mIHRoaXMsIHNtYWxsIGNoYW5nZXMgdG8gdGhlIGNvZGUgdG8gIHJlZHVjZSAgdGhlCisgICAgICAgbWlzcyAgcmF0ZSAgaGF2ZSAgYmVlbiBvYnNlcnZlZCB0byBnaXZlIGRpc3Byb3BvcnRpb25hdGVseQorICAgICAgIGxhcmdlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gIEkgaW1hZ2luZSBiemlwMiB3aWxsIHBlci0KKyAgICAgICBmb3JtIGJlc3Qgb24gbWFjaGluZXMgd2l0aCB2ZXJ5IGxhcmdlIGNhY2hlcy4KKworCitDQVZFQVRTCisgICAgICAgSS9PICBlcnJvciAgbWVzc2FnZXMgIGFyZSBub3QgYXMgaGVscGZ1bCBhcyB0aGV5IGNvdWxkIGJlLgorICAgICAgIEJ6aXAyIHRyaWVzIGhhcmQgdG8gZGV0ZWN0IEkvTyBlcnJvcnMgIGFuZCAgZXhpdCAgY2xlYW5seSwKKyAgICAgICBidXQgIHRoZSAgZGV0YWlscyAgb2YgIHdoYXQgIHRoZSBwcm9ibGVtIGlzIHNvbWV0aW1lcyBzZWVtCisgICAgICAgcmF0aGVyIG1pc2xlYWRpbmcuCisKKyAgICAgICBUaGlzIG1hbnVhbCBwYWdlIHBlcnRhaW5zIHRvIHZlcnNpb24gMC45LjAgb2YgYnppcDIuICBDb20tCisgICAgICAgcHJlc3NlZCAgZGF0YSBjcmVhdGVkIGJ5IHRoaXMgdmVyc2lvbiBpcyBlbnRpcmVseSBmb3J3YXJkcworICAgICAgIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcmV2aW91cyBwdWJsaWMgcmVsZWFzZSwKKyAgICAgICB2ZXJzaW9uICAwLjFwbDIsICBidXQgIHdpdGggdGhlIGZvbGxvd2luZyBleGNlcHRpb246IDAuOS4wCisgICAgICAgY2FuIGNvcnJlY3RseSBkZWNvbXByZXNzIG11bHRpcGxlIGNvbmNhdGVuYXRlZCAgY29tcHJlc3NlZAorICAgICAgIGZpbGVzLiAgIDAuMXBsMiAgY2Fubm90IGRvIHRoaXM7IGl0IHdpbGwgc3RvcCBhZnRlciBkZWNvbS0KKyAgICAgICBwcmVzc2luZyBqdXN0IHRoZSBmaXJzdCBmaWxlIGluIHRoZSBzdHJlYW0uCisKKyAgICAgICBXaWxkY2FyZCBleHBhbnNpb24gZm9yIFdpbmRvd3MgOTUgYW5kIE5UIGlzIGZsYWt5LgorCisgICAgICAgYnppcDJyZWNvdmVyIHVzZXMgMzItYml0IGludGVnZXJzIHRvIHJlcHJlc2VudCAgYml0ICBwb3NpLQorICAgICAgIHRpb25zICBpbiBjb21wcmVzc2VkIGZpbGVzLCBzbyBpdCBjYW5ub3QgaGFuZGxlIGNvbXByZXNzZWQKKyAgICAgICBmaWxlcyBtb3JlIHRoYW4gNTEyIG1lZ2FieXRlcyBsb25nLiAgVGhpcyBjb3VsZCBlYXNpbHkgIGJlCisgICAgICAgZml4ZWQuCisKKworQVVUSE9SCisgICAgICAgSnVsaWFuIFNld2FyZCwganNld2FyZEBAYWNtLm9yZy4KKworICAgICAgIFRoZSBpZGVhcyBlbWJvZGllZCBpbiBiemlwMiBhcmUgZHVlIHRvIChhdCBsZWFzdCkgdGhlIGZvbC0KKyAgICAgICBsb3dpbmcgcGVvcGxlOiBNaWNoYWVsIEJ1cnJvd3MgYW5kIERhdmlkIFdoZWVsZXIgKGZvciAgdGhlCisgICAgICAgYmxvY2sgIHNvcnRpbmcgIHRyYW5zZm9ybWF0aW9uKSwgRGF2aWQgV2hlZWxlciAoYWdhaW4sIGZvcgorICAgICAgIHRoZSBIdWZmbWFuIGNvZGVyKSwgUGV0ZXIgRmVud2ljayAoZm9yIHRoZSBzdHJ1Y3R1cmVkIGNvZC0KKyAgICAgICBpbmcgbW9kZWwgaW4gdGhlIG9yaWdpbmFsIGJ6aXAsIGFuZCBtYW55IHJlZmluZW1lbnRzKSwgYW5kCisgICAgICAgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwgIGFuZCAgSWFuICBXaXR0ZW4gIChmb3IgIHRoZQorICAgICAgIGFyaXRobWV0aWMgIGNvZGVyICBpbiAgdGhlICBvcmlnaW5hbCAgYnppcCkuICAgSSAgYW0gIG11Y2gKKyAgICAgICBpbmRlYnRlZCBmb3IgdGhlaXIgaGVscCwgc3VwcG9ydCBhbmQgYWR2aWNlLiAgU2VlIHRoZSBtYW4tCisgICAgICAgdWFsICBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgcG9pbnRlcnMgdG8gc291cmNlcyBvZgorICAgICAgIGRvY3VtZW50YXRpb24uICBDaHJpc3RpYW4gdm9uIFJvcXVlcyBlbmNvdXJhZ2VkIG1lIHRvIGxvb2sKKyAgICAgICBmb3IgIGZhc3RlciBzb3J0aW5nIGFsZ29yaXRobXMsIHNvIGFzIHRvIHNwZWVkIHVwIGNvbXByZXMtCisgICAgICAgc2lvbi4gIEJlbGEgTHVia2luIGVuY291cmFnZWQgbWUgdG8gaW1wcm92ZSB0aGUgd29yc3QtY2FzZQorICAgICAgIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlLiAgTWFueSBwZW9wbGUgc2VudCBwYXRjaGVzLCBoZWxwZWQKKyAgICAgICB3aXRoIHBvcnRhYmlsaXR5IHByb2JsZW1zLCBsZW50IG1hY2hpbmVzLCBnYXZlIGFkdmljZSAgYW5kCisgICAgICAgd2VyZSBnZW5lcmFsbHkgaGVscGZ1bC4KK0BlbmQgZXhhbXBsZQorCisKKworCisKK0BjaGFwdGVyIFByb2dyYW1taW5nIHdpdGggQGNvZGV7bGliYnppcDJ9CisKK1RoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIHByb2dyYW1taW5nIGludGVyZmFjZSB0byBAY29kZXtsaWJiemlwMn0uCisKK0ZvciBnZW5lcmFsIGJhY2tncm91bmQgaW5mb3JtYXRpb24sIHBhcnRpY3VsYXJseSBhYm91dCBtZW1vcnkKK3VzZSBhbmQgcGVyZm9ybWFuY2UgYXNwZWN0cywgeW91J2QgYmUgd2VsbCBhZHZpc2VkIHRvIHJlYWQgQ2hhcHRlciAyCithcyB3ZWxsLgorCitAc2VjdGlvbiBUb3AtbGV2ZWwgc3RydWN0dXJlCisKK0Bjb2Rle2xpYmJ6aXAyfSBpcyBhIGZsZXhpYmxlIGxpYnJhcnkgZm9yIGNvbXByZXNzaW5nIGFuZCBkZWNvbXByZXNzaW5nCitkYXRhIGluIHRoZSBAY29kZXtiemlwMn0gZGF0YSBmb3JtYXQuICBBbHRob3VnaCBwYWNrYWdlZCBhcyBhIHNpbmdsZQorZW50aXR5LCBpdCBoZWxwcyB0byByZWdhcmQgdGhlIGxpYnJhcnkgYXMgdGhyZWUgc2VwYXJhdGUgcGFydHM6IHRoZSBsb3cKK2xldmVsIGludGVyZmFjZSwgYW5kIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZSwgYW5kIHNvbWUgdXRpbGl0eQorZnVuY3Rpb25zLgorCitUaGUgc3RydWN0dXJlIG9mIEBjb2Rle2xpYmJ6aXAyfSdzIGludGVyZmFjZXMgaXMgc2ltaWxhciB0bwordGhhdCBvZiBKZWFuLWxvdXAgR2FpbGx5J3MgYW5kIE1hcmsgQWRsZXIncyBleGNlbGxlbnQgQGNvZGV7emxpYn0gCitsaWJyYXJ5LgorCitAc3Vic2VjdGlvbiBMb3ctbGV2ZWwgc3VtbWFyeQorCitUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzZXJ2aWNlcyBmb3IgY29tcHJlc3NpbmcgYW5kIGRlY29tcHJlc3NpbmcKK2RhdGEgaW4gbWVtb3J5LiAgVGhlcmUncyBubyBwcm92aXNpb24gZm9yIGRlYWxpbmcgd2l0aCBmaWxlcywgc3RyZWFtcworb3IgYW55IG90aGVyIEkvTyBtZWNoYW5pc21zLCBqdXN0IHN0cmFpZ2h0IG1lbW9yeS10by1tZW1vcnkgd29yay4KK0luIGZhY3QsIHRoaXMgcGFydCBvZiB0aGUgbGlicmFyeSBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCBpbmNsdXNpb24KK29mIEBjb2Rle3N0ZGlvLmh9LCB3aGljaCBtYXkgYmUgaGVscGZ1bCBmb3IgZW1iZWRkZWQgYXBwbGljYXRpb25zLgorCitUaGUgbG93LWxldmVsIHBhcnQgb2YgdGhlIGxpYnJhcnkgaGFzIG5vIGdsb2JhbCB2YXJpYWJsZXMgYW5kCitpcyB0aGVyZWZvcmUgdGhyZWFkLXNhZmUuCisKK1NpeCByb3V0aW5lcyBtYWtlIHVwIHRoZSBsb3cgbGV2ZWwgaW50ZXJmYWNlOiAKK0Bjb2Rle2J6Q29tcHJlc3NJbml0fSwgQGNvZGV7YnpDb21wcmVzc30sIGFuZCBAKiBAY29kZXtiekNvbXByZXNzRW5kfQorZm9yIGNvbXByZXNzaW9uLAorYW5kIGEgY29ycmVzcG9uZGluZyB0cmlvIEBjb2Rle2J6RGVjb21wcmVzc0luaXR9LCBAKiBAY29kZXtiekRlY29tcHJlc3N9CithbmQgQGNvZGV7YnpEZWNvbXByZXNzRW5kfSBmb3IgZGVjb21wcmVzc2lvbi4gIAorVGhlIEBjb2RleypJbml0fSBmdW5jdGlvbnMgYWxsb2NhdGUKK21lbW9yeSBmb3IgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBhbmQgZG8gb3RoZXIKK2luaXRpYWxpc2F0aW9ucywgd2hpbHN0IHRoZSBAY29kZXsqRW5kfSBmdW5jdGlvbnMgY2xvc2UgZG93biBvcGVyYXRpb25zCithbmQgcmVsZWFzZSBtZW1vcnkuCisKK1RoZSByZWFsIHdvcmsgaXMgZG9uZSBieSBAY29kZXtiekNvbXByZXNzfSBhbmQgQGNvZGV7YnpEZWNvbXByZXNzfS4gIAorVGhlc2UgY29tcHJlc3MvZGVjb21wcmVzcyBkYXRhIGZyb20gYSB1c2VyLXN1cHBsaWVkIGlucHV0IGJ1ZmZlcgordG8gYSB1c2VyLXN1cHBsaWVkIG91dHB1dCBidWZmZXIuICBUaGVzZSBidWZmZXJzIGNhbiBiZSBhbnkgc2l6ZTsKK2FyYml0cmFyeSBxdWFudGl0aWVzIG9mIGRhdGEgYXJlIGhhbmRsZWQgYnkgbWFraW5nIHJlcGVhdGVkIGNhbGxzCit0byB0aGVzZSBmdW5jdGlvbnMuICBUaGlzIGlzIGEgZmxleGlibGUgbWVjaGFuaXNtIGFsbG93aW5nIGEgCitjb25zdW1lci1wdWxsIHN0eWxlIG9mIGFjdGl2aXR5LCBvciBwcm9kdWNlci1wdXNoLCBvciBhIG1peHR1cmUgb2YKK2JvdGguCisKKworCitAc3Vic2VjdGlvbiBIaWdoLWxldmVsIHN1bW1hcnkKKworVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc29tZSBoYW5keSB3cmFwcGVycyBhcm91bmQgdGhlIGxvdy1sZXZlbAoraW50ZXJmYWNlIHRvIGZhY2lsaXRhdGUgcmVhZGluZyBhbmQgd3JpdGluZyBAY29kZXtiemlwMn0gZm9ybWF0CitmaWxlcyAoQGNvZGV7LmJ6Mn0gZmlsZXMpLiAgVGhlIHJvdXRpbmVzIHByb3ZpZGUgaG9va3MgdG8gZmFjaWxpdGF0ZQorcmVhZGluZyBmaWxlcyBpbiB3aGljaCB0aGUgQGNvZGV7YnppcDJ9IGRhdGEgc3RyZWFtIGlzIGVtYmVkZGVkIAord2l0aGluIHNvbWUgbGFyZ2VyLXNjYWxlIGZpbGUgc3RydWN0dXJlLCBvciB3aGVyZSB0aGVyZSBhcmUKK211bHRpcGxlIEBjb2Rle2J6aXAyfSBkYXRhIHN0cmVhbXMgY29uY2F0ZW5hdGVkIGVuZC10by1lbmQuCisKK0ZvciByZWFkaW5nIGZpbGVzLCBAY29kZXtielJlYWRPcGVufSwgQGNvZGV7YnpSZWFkfSwgQGNvZGV7YnpSZWFkQ2xvc2V9CithbmQgQGNvZGV7YnpSZWFkR2V0VW51c2VkfSBhcmUgc3VwcGxpZWQuICBGb3Igd3JpdGluZyBmaWxlcywKK0Bjb2Rle2J6V3JpdGVPcGVufSwgQGNvZGV7YnpXcml0ZX0gYW5kIEBjb2Rle2J6V3JpdGVGaW5pc2h9IGFyZQorYXZhaWxhYmxlLgorCitBcyB3aXRoIHRoZSBsb3ctbGV2ZWwgbGlicmFyeSwgbm8gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgdXNlZAorc28gdGhlIGxpYnJhcnkgaXMgcGVyIHNlIHRocmVhZC1zYWZlLiAgSG93ZXZlciwgaWYgSS9PIGVycm9ycworb2NjdXIgd2hpbHN0IHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgdW5kZXJseWluZyBjb21wcmVzc2VkIGZpbGVzLAoreW91IG1heSBoYXZlIHRvIGNvbnN1bHQgQGNvZGV7ZXJybm99IHRvIGRldGVybWluZSB0aGUgY2F1c2Ugb2YKK3RoZSBlcnJvci4gIEluIHRoYXQgY2FzZSwgeW91J2QgbmVlZCBhIEMgbGlicmFyeSB3aGljaCBjb3JyZWN0bHkKK3N1cHBvcnRzIEBjb2Rle2Vycm5vfSBpbiBhIG11bHRpdGhyZWFkZWQgZW52aXJvbm1lbnQuCisKK1RvIG1ha2UgdGhlIGxpYnJhcnkgYSBsaXR0bGUgc2ltcGxlciBhbmQgbW9yZSBwb3J0YWJsZSwKK0Bjb2Rle2J6UmVhZE9wZW59IGFuZCBAY29kZXtieldyaXRlT3Blbn0gcmVxdWlyZSB5b3UgdG8gcGFzcyB0aGVtIGZpbGUKK2hhbmRsZXMgKEBjb2Rle0ZJTEUqfXMpIHdoaWNoIGhhdmUgcHJldmlvdXNseSBiZWVuIG9wZW5lZCBmb3IgcmVhZGluZyBvcgord3JpdGluZyByZXNwZWN0aXZlbHkuICBUaGF0IGF2b2lkcyBwb3J0YWJpbGl0eSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGgKK2ZpbGUgb3BlcmF0aW9ucyBhbmQgZmlsZSBhdHRyaWJ1dGVzLCB3aGlsc3Qgbm90IGJlaW5nIG11Y2ggb2YgYW4KK2ltcG9zaXRpb24gb24gdGhlIHByb2dyYW1tZXIuCisKKworCitAc3Vic2VjdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBzdW1tYXJ5CitGb3IgdmVyeSBzaW1wbGUgbmVlZHMsIEBjb2Rle2J6QnVmZlRvQnVmZkNvbXByZXNzfSBhbmQKK0Bjb2Rle2J6QnVmZlRvQnVmZkRlY29tcHJlc3N9IGFyZSBwcm92aWRlZC4gIFRoZXNlIGNvbXByZXNzCitkYXRhIGluIG1lbW9yeSBmcm9tIG9uZSBidWZmZXIgdG8gYW5vdGhlciBidWZmZXIgaW4gYSBzaW5nbGUKK2Z1bmN0aW9uIGNhbGwuICBZb3Ugc2hvdWxkIGFzc2VzcyB3aGV0aGVyIHRoZXNlIGZ1bmN0aW9ucworZnVsZmlsbCB5b3VyIG1lbW9yeS10by1tZW1vcnkgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbgorcmVxdWlyZW1lbnRzIGJlZm9yZSBpbnZlc3RpbmcgZWZmb3J0IGluIHVuZGVyc3RhbmRpbmcgdGhlIG1vcmUKK2dlbmVyYWwgYnV0IG1vcmUgY29tcGxleCBsb3ctbGV2ZWwgaW50ZXJmYWNlLgorCitZb3NoaW9rYSBUc3VuZW8gKEBjb2Rle1FXRjAwMTMzQEBuaWZ0eXNlcnZlLm9yLmpwfSAvCitAY29kZXt0c3VuZW8teUBAaXMuYWlzdC1uYXJhLmFjLmpwfSkgaGFzIGNvbnRyaWJ1dGVkIHNvbWUgZnVuY3Rpb25zIHRvCitnaXZlIGJldHRlciBAY29kZXt6bGlifSBjb21wYXRpYmlsaXR5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZQorQGNvZGV7YnpvcGVufSwgQGNvZGV7YnpyZWFkfSwgQGNvZGV7Ynp3cml0ZX0sIEBjb2Rle2J6Zmx1c2h9LAorQGNvZGV7YnpjbG9zZX0sCitAY29kZXtiemVycm9yfSBhbmQgQGNvZGV7YnpsaWJWZXJzaW9ufS4gIFlvdSBtYXkgZmluZCB0aGVzZSBmdW5jdGlvbnMKK21vcmUgY29udmVuaWVudCBmb3Igc2ltcGxlIGZpbGUgcmVhZGluZyBhbmQgd3JpdGluZywgdGhhbiB0aG9zZSBpbiB0aGUKK2hpZ2gtbGV2ZWwgaW50ZXJmYWNlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgKHlldCkgb2ZmaWNpYWxseSBwYXJ0IG9mCit0aGUgbGlicmFyeSwgYW5kIGFyZSBub3QgZnVydGhlciBkb2N1bWVudGVkIGhlcmUuICBJZiB0aGV5IGJyZWFrLCB5b3UKK2dldCB0byBrZWVwIGFsbCB0aGUgcGllY2VzLiAgSSBob3BlIHRvIGRvY3VtZW50IHRoZW0gcHJvcGVybHkgd2hlbiB0aW1lCitwZXJtaXRzLgorCitZb3NoaW9rYSBhbHNvIGNvbnRyaWJ1dGVkIG1vZGlmaWNhdGlvbnMgdG8gYWxsb3cgdGhlIGxpYnJhcnkgdG8gYmUKK2J1aWx0IGFzIGEgV2luZG93cyBETEwuCisKKworQHNlY3Rpb24gRXJyb3IgaGFuZGxpbmcKKworVGhlIGxpYnJhcnkgaXMgZGVzaWduZWQgdG8gcmVjb3ZlciBjbGVhbmx5IGluIGFsbCBzaXR1YXRpb25zLCBpbmNsdWRpbmcKK3RoZSB3b3JzdC1jYXNlIHNpdHVhdGlvbiBvZiBkZWNvbXByZXNzaW5nIHJhbmRvbSBkYXRhLiAgSSdtIG5vdCAKKzEwMCUgc3VyZSB0aGF0IGl0IGNhbiBhbHdheXMgZG8gdGhpcywgc28geW91IG1pZ2h0IHdhbnQgdG8gYWRkCithIHNpZ25hbCBoYW5kbGVyIHRvIGNhdGNoIHNlZ21lbnRhdGlvbiB2aW9sYXRpb25zIGR1cmluZyBkZWNvbXByZXNzaW9uCitpZiB5b3UgYXJlIGZlZWxpbmcgZXNwZWNpYWxseSBwYXJhbm9pZC4gIEkgd291bGQgYmUgaW50ZXJlc3RlZCBpbgoraGVhcmluZyBtb3JlIGFib3V0IHRoZSByb2J1c3RuZXNzIG9mIHRoZSBsaWJyYXJ5IHRvIGNvcnJ1cHRlZAorY29tcHJlc3NlZCBkYXRhLgorCitUaGUgZmlsZSBAY29kZXtiemxpYi5ofSBjb250YWlucyBhbGwgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIHVzZQordGhlIGxpYnJhcnkuICBJbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIGRlZmluaXRlbHkgbm90IGluY2x1ZGUKK0Bjb2Rle2J6bGliX3ByaXZhdGUuaH0uCisKK0luIEBjb2Rle2J6bGliLmh9LCB0aGUgdmFyaW91cyByZXR1cm4gdmFsdWVzIGFyZSBkZWZpbmVkLiAgVGhlIGZvbGxvd2luZworbGlzdCBpcyBub3QgaW50ZW5kZWQgYXMgYW4gZXhoYXVzdGl2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2lyY3Vtc3RhbmNlcyAKK2luIHdoaWNoIGEgZ2l2ZW4gdmFsdWUgbWF5IGJlIHJldHVybmVkIC0tIHRob3NlIGRlc2NyaXB0aW9ucyBhcmUgZ2l2ZW4KK2xhdGVyLiAgUmF0aGVyLCBpdCBpcyBpbnRlbmRlZCB0byBjb252ZXkgdGhlIHJvdWdoIG1lYW5pbmcgb2YgZWFjaAorcmV0dXJuIHZhbHVlLiAgVGhlIGZpcnN0IGZpdmUgYWN0aW9ucyBhcmUgbm9ybWFsIGFuZCBub3QgaW50ZW5kZWQgdG8gCitkZW5vdGUgYW4gZXJyb3Igc2l0dWF0aW9uLgorQHRhYmxlIEBjb2RlCitAaXRlbSBCWl9PSworVGhlIHJlcXVlc3RlZCBhY3Rpb24gd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCitAaXRlbSBCWl9SVU5fT0sKK0BpdGVteCBCWl9GTFVTSF9PSworQGl0ZW14IEJaX0ZJTklTSF9PSworSW4gQGNvZGV7YnpDb21wcmVzc30sIHRoZSByZXF1ZXN0ZWQgZmx1c2gvZmluaXNoL25vdGhpbmctc3BlY2lhbCBhY3Rpb24KK3dhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorQGl0ZW0gQlpfU1RSRUFNX0VORAorQ29tcHJlc3Npb24gb2YgZGF0YSB3YXMgY29tcGxldGVkLCBvciB0aGUgbG9naWNhbCBzdHJlYW0gZW5kIHdhcworZGV0ZWN0ZWQgZHVyaW5nIGRlY29tcHJlc3Npb24uCitAZW5kIHRhYmxlCisKK1RoZSBmb2xsb3dpbmcgcmV0dXJuIHZhbHVlcyBpbmRpY2F0ZSBhbiBlcnJvciBvZiBzb21lIGtpbmQuCitAdGFibGUgQGNvZGUKK0BpdGVtIEJaX1NFUVVFTkNFX0VSUk9SCitXaGVuIHVzaW5nIHRoZSBsaWJyYXJ5LCBpdCBpcyBpbXBvcnRhbnQgdG8gY2FsbCB0aGUgZnVuY3Rpb25zIGluIHRoZQorY29ycmVjdCBzZXF1ZW5jZSBhbmQgd2l0aCBkYXRhIHN0cnVjdHVyZXMgKGJ1ZmZlcnMgZXRjKSBpbiB0aGUgY29ycmVjdAorc3RhdGVzLiAgQGNvZGV7bGliYnppcDJ9IGNoZWNrcyBhcyBtdWNoIGFzIGl0IGNhbiB0byBlbnN1cmUgdGhpcyBpcworaGFwcGVuaW5nLCBhbmQgcmV0dXJucyBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gaWYgbm90LiAgQ29kZSB3aGljaAorY29tcGxpZXMgcHJlY2lzZWx5IHdpdGggdGhlIGZ1bmN0aW9uIHNlbWFudGljcywgYXMgZGV0YWlsZWQgYmVsb3csCitzaG91bGQgbmV2ZXIgcmVjZWl2ZSB0aGlzIHZhbHVlOyBzdWNoIGFuIGV2ZW50IGRlbm90ZXMgYnVnZ3kgY29kZQord2hpY2ggeW91IHNob3VsZCBpbnZlc3RpZ2F0ZS4KK0BpdGVtIEJaX1BBUkFNX0VSUk9SCitSZXR1cm5lZCB3aGVuIGEgcGFyYW1ldGVyIHRvIGEgZnVuY3Rpb24gY2FsbCBpcyBvdXQgb2YgcmFuZ2UgCitvciBvdGhlcndpc2UgbWFuaWZlc3RseSBpbmNvcnJlY3QuICBBcyB3aXRoIEBjb2Rle0JaX1NFUVVFTkNFX0VSUk9SfSwKK3RoaXMgZGVub3RlcyBhIGJ1ZyBpbiB0aGUgY2xpZW50IGNvZGUuICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbgorQGNvZGV7QlpfUEFSQU1fRVJST1J9IGFuZCBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gaXMgYSBiaXQgaGF6eSwgYnV0IHN0aWxsIHdvcnRoCittYWtpbmcuCitAaXRlbSBCWl9NRU1fRVJST1IKK1JldHVybmVkIHdoZW4gYSByZXF1ZXN0IHRvIGFsbG9jYXRlIG1lbW9yeSBmYWlsZWQuICBOb3RlIHRoYXQgdGhlCitxdWFudGl0eSBvZiBtZW1vcnkgbmVlZGVkIHRvIGRlY29tcHJlc3MgYSBzdHJlYW0gY2Fubm90IGJlIGRldGVybWluZWQKK3VudGlsIHRoZSBzdHJlYW0ncyBoZWFkZXIgaGFzIGJlZW4gcmVhZC4gIFNvIEBjb2Rle2J6RGVjb21wcmVzc30gYW5kCitAY29kZXtielJlYWR9IG1heSByZXR1cm4gQGNvZGV7QlpfTUVNX0VSUk9SfSBldmVuIHRob3VnaCBzb21lIG9mCit0aGUgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIHJlYWQuICBUaGUgc2FtZSBpcyBub3QgdHJ1ZSBmb3IKK2NvbXByZXNzaW9uOyBvbmNlIEBjb2Rle2J6Q29tcHJlc3NJbml0fSBvciBAY29kZXtieldyaXRlT3Blbn0gaGF2ZQorc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCwgQGNvZGV7QlpfTUVNX0VSUk9SfSBjYW5ub3Qgb2NjdXIuCitAaXRlbSBCWl9EQVRBX0VSUk9SCitSZXR1cm5lZCB3aGVuIGEgZGF0YSBpbnRlZ3JpdHkgZXJyb3IgaXMgZGV0ZWN0ZWQgZHVyaW5nIGRlY29tcHJlc3Npb24uCitNb3N0IGltcG9ydGFudGx5LCB0aGlzIG1lYW5zIHdoZW4gc3RvcmVkIGFuZCBjb21wdXRlZCBDUkNzIGZvciB0aGUKK2RhdGEgZG8gbm90IG1hdGNoLiAgVGhpcyB2YWx1ZSBpcyBhbHNvIHJldHVybmVkIHVwb24gZGV0ZWN0aW9uIG9mIGFueQorb3RoZXIgYW5vbWFseSBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLgorQGl0ZW0gQlpfREFUQV9FUlJPUl9NQUdJQworQXMgYSBzcGVjaWFsIGNhc2Ugb2YgQGNvZGV7QlpfREFUQV9FUlJPUn0sIGl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8KK2tub3cgd2hlbiB0aGUgY29tcHJlc3NlZCBzdHJlYW0gZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgY29ycmVjdAorbWFnaWMgYnl0ZXMgKEBjb2RleydCJyAnWicgJ2gnfSkuICAKK0BpdGVtIEJaX0lPX0VSUk9SCitSZXR1cm5lZCBieSBAY29kZXtielJlYWR9IGFuZCBAY29kZXtielJlYWR9IHdoZW4gdGhlcmUgaXMgYW4gZXJyb3IKK3JlYWRpbmcgb3Igd3JpdGluZyBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLCBhbmQgYnkgQGNvZGV7YnpSZWFkT3Blbn0KK2FuZCBAY29kZXtieldyaXRlT3Blbn0gZm9yIGF0dGVtcHRzIHRvIHVzZSBhIGZpbGUgZm9yIHdoaWNoIHRoZQorZXJyb3IgaW5kaWNhdG9yICh2aXosIEBjb2Rle2ZlcnJvcihmKX0pIGlzIHNldC4KK09uIHJlY2VpcHQgb2YgQGNvZGV7QlpfSU9fRVJST1J9LCB0aGUgY2FsbGVyIHNob3VsZCBjb25zdWx0CitAY29kZXtlcnJub30gYW5kL29yIEBjb2Rle3BlcnJvcn0gdG8gYWNxdWlyZSBvcGVyYXRpbmctc3lzdGVtCitzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvYmxlbS4KK0BpdGVtIEJaX1VORVhQRUNURURfRU9GCitSZXR1cm5lZCBieSBAY29kZXtielJlYWR9IHdoZW4gdGhlIGNvbXByZXNzZWQgZmlsZSBmaW5pc2hlcworYmVmb3JlIHRoZSBsb2dpY2FsIGVuZCBvZiBzdHJlYW0gaXMgZGV0ZWN0ZWQuCitAaXRlbSBCWl9PVVRCVUZGX0ZVTEwKK1JldHVybmVkIGJ5IEBjb2Rle2J6QnVmZlRvQnVmZkNvbXByZXNzfSBhbmQKK0Bjb2Rle2J6QnVmZlRvQnVmZkRlY29tcHJlc3N9IHRvIGluZGljYXRlIHRoYXQgdGhlIG91dHB1dCBkYXRhCit3aWxsIG5vdCBmaXQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciBwcm92aWRlZC4KK0BlbmQgdGFibGUKKworCisKK0BzZWN0aW9uIExvdy1sZXZlbCBpbnRlcmZhY2UKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpDb21wcmVzc0luaXR9CitAZXhhbXBsZQordHlwZWRlZiAKKyAgIHN0cnVjdCBAeworICAgICAgY2hhciAqbmV4dF9pbjsKKyAgICAgIHVuc2lnbmVkIGludCBhdmFpbF9pbjsKKyAgICAgIHVuc2lnbmVkIGludCB0b3RhbF9pbjsKKworICAgICAgY2hhciAqbmV4dF9vdXQ7CisgICAgICB1bnNpZ25lZCBpbnQgYXZhaWxfb3V0OworICAgICAgdW5zaWduZWQgaW50IHRvdGFsX291dDsKKworICAgICAgdm9pZCAqc3RhdGU7CisKKyAgICAgIHZvaWQgKigqYnphbGxvYykodm9pZCAqLGludCxpbnQpOworICAgICAgdm9pZCAoKmJ6ZnJlZSkodm9pZCAqLHZvaWQgKik7CisgICAgICB2b2lkICpvcGFxdWU7CisgICBAfSAKKyAgIGJ6X3N0cmVhbTsKKworaW50IGJ6Q29tcHJlc3NJbml0ICggYnpfc3RyZWFtICpzdHJtLCAKKyAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja1NpemUxMDBrLCAKKyAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJib3NpdHksCisgICAgICAgICAgICAgICAgICAgICBpbnQgd29ya0ZhY3RvciApOworCitAZW5kIGV4YW1wbGUKKworUHJlcGFyZXMgZm9yIGNvbXByZXNzaW9uLiAgVGhlIEBjb2Rle2J6X3N0cmVhbX0gc3RydWN0dXJlCitob2xkcyBhbGwgZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBhY3Rpdml0eS4gIAorQSBAY29kZXtiel9zdHJlYW19IHN0cnVjdHVyZSBzaG91bGQgYmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXNlZAorcHJpb3IgdG8gdGhlIGNhbGwuCitUaGUgZmllbGRzIG9mIEBjb2Rle2J6X3N0cmVhbX0KK2NvbXByaXNlIHRoZSBlbnRpcmV0eSBvZiB0aGUgdXNlci12aXNpYmxlIGRhdGEuICBAY29kZXtzdGF0ZX0KK2lzIGEgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZXMgcmVxdWlyZWQgZm9yIGNvbXByZXNzaW9uLgorCitDdXN0b20gbWVtb3J5IGFsbG9jYXRvcnMgYXJlIHN1cHBvcnRlZCwgdmlhIGZpZWxkcyBAY29kZXtiemFsbG9jfSwgCitAY29kZXtiemZyZWV9LAorYW5kIEBjb2Rle29wYXF1ZX0uICBUaGUgdmFsdWUgCitAY29kZXtvcGFxdWV9IGlzIHBhc3NlZCB0byBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KK2FsbCBjYWxscyB0byBAY29kZXtiemFsbG9jfSBhbmQgQGNvZGV7YnpmcmVlfSwgYnV0IGlzIAorb3RoZXJ3aXNlIGlnbm9yZWQgYnkgdGhlIGxpYnJhcnkuCitUaGUgY2FsbCBAY29kZXtiemFsbG9jICggb3BhcXVlLCBuLCBtICl9IGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIAorcG9pbnRlciBAY29kZXtwfSB0bworQGNvZGV7biAqIG19IGJ5dGVzIG9mIG1lbW9yeSwgYW5kIEBjb2Rle2J6ZnJlZSAoIG9wYXF1ZSwgcCApfSAKK3Nob3VsZCBmcmVlCit0aGF0IG1lbW9yeS4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIGEgY3VzdG9tIG1lbW9yeSBhbGxvY2F0b3IsIHNldCBAY29kZXtiemFsbG9jfSwgCitAY29kZXtiemZyZWV9IGFuZAorQGNvZGV7b3BhcXVlfSB0byBAY29kZXtOVUxMfSwgCithbmQgdGhlIGxpYnJhcnkgd2lsbCB0aGVuIHVzZSB0aGUgc3RhbmRhcmQgQGNvZGV7bWFsbG9jfS9AY29kZXtmcmVlfQorcm91dGluZXMuCisKK0JlZm9yZSBjYWxsaW5nIEBjb2Rle2J6Q29tcHJlc3NJbml0fSwgZmllbGRzIEBjb2Rle2J6YWxsb2N9LCAKK0Bjb2Rle2J6ZnJlZX0gYW5kIEBjb2Rle29wYXF1ZX0gc2hvdWxkCitiZSBmaWxsZWQgYXBwcm9wcmlhdGVseSwgYXMganVzdCBkZXNjcmliZWQuICBVcG9uIHJldHVybiwgdGhlIGludGVybmFsCitzdGF0ZSB3aWxsIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpc2VkLCBhbmQgQGNvZGV7dG90YWxfaW59IGFuZCAKK0Bjb2Rle3RvdGFsX291dH0gd2lsbCBoYXZlIGJlZW4gc2V0IHRvIHplcm8uICAKK1RoZXNlIGxhc3QgdHdvIGZpZWxkcyBhcmUgdXNlZCBieSB0aGUgbGlicmFyeQordG8gaW5mb3JtIHRoZSBjYWxsZXIgb2YgdGhlIHRvdGFsIGFtb3VudCBvZiBkYXRhIHBhc3NlZCBpbnRvIGFuZCBvdXQgb2YKK3RoZSBsaWJyYXJ5LCByZXNwZWN0aXZlbHkuICBZb3Ugc2hvdWxkIG5vdCB0cnkgdG8gY2hhbmdlIHRoZW0uCisKK1BhcmFtZXRlciBAY29kZXtibG9ja1NpemUxMDBrfSBzcGVjaWZpZXMgdGhlIGJsb2NrIHNpemUgdG8gYmUgdXNlZCBmb3IKK2NvbXByZXNzaW9uLiAgSXQgc2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAxIGFuZCA5IGluY2x1c2l2ZSwgYW5kIHRoZQorYWN0dWFsIGJsb2NrIHNpemUgdXNlZCBpcyAxMDAwMDAgeCB0aGlzIGZpZ3VyZS4gIDkgZ2l2ZXMgdGhlIGJlc3QKK2NvbXByZXNzaW9uIGJ1dCB0YWtlcyBtb3N0IG1lbW9yeS4KKworUGFyYW1ldGVyIEBjb2Rle3ZlcmJvc2l0eX0gc2hvdWxkIGJlIHNldCB0byBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDQKK2luY2x1c2l2ZS4gIDAgaXMgc2lsZW50LCBhbmQgZ3JlYXRlciBudW1iZXJzIGdpdmUgaW5jcmVhc2luZ2x5IHZlcmJvc2UKK21vbml0b3JpbmcvZGVidWdnaW5nIG91dHB1dC4gIElmIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKK0Bjb2Rley1EQlpfTk9fU1RESU99LCBubyBzdWNoIG91dHB1dCB3aWxsIGFwcGVhciBmb3IgYW55IHZlcmJvc2l0eQorc2V0dGluZy4KKworUGFyYW1ldGVyIEBjb2Rle3dvcmtGYWN0b3J9IGNvbnRyb2xzIGhvdyB0aGUgY29tcHJlc3Npb24gcGhhc2UgYmVoYXZlcword2hlbiBwcmVzZW50ZWQgd2l0aCB3b3JzdCBjYXNlLCBoaWdobHkgcmVwZXRpdGl2ZSwgaW5wdXQgZGF0YS4KK0lmIGNvbXByZXNzaW9uIHJ1bnMgaW50byBkaWZmaWN1bHRpZXMgY2F1c2VkIGJ5IHJlcGV0aXRpdmUgZGF0YSwKK3NvbWUgcHNldWRvLXJhbmRvbSB2YXJpYXRpb25zIGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBibG9jaywgYW5kCitjb21wcmVzc2lvbiBpcyByZXN0YXJ0ZWQuICBMb3dlciB2YWx1ZXMgb2YgQGNvZGV7d29ya0ZhY3Rvcn0KK3JlZHVjZSB0aGUgdG9sZXJhbmNlIG9mIGNvbXByZXNzaW9uIHRvIHJlcGV0aXRpdmUgZGF0YS4KK1lvdSBzaG91bGQgc2V0IHRoaXMgcGFyYW1ldGVyIGNhcmVmdWxseTsgdG9vIGxvdywgYW5kIAorY29tcHJlc3Npb24gcmF0aW8gc3VmZmVycywgdG9vIGhpZ2gsIGFuZCB5b3VyIGF2ZXJhZ2UtdG8td29yc3QKK2Nhc2UgY29tcHJlc3Npb24gdGltZXMgY2FuIGJlY29tZSB2ZXJ5IGxhcmdlLiAgCitUaGUgZGVmYXVsdCB2YWx1ZSBvZiAzMAorZ2l2ZXMgcmVhc29uYWJsZSBiZWhhdmlvdXIgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgY2lyY3Vtc3RhbmNlcy4KKworQWxsb3dhYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gMjUwIGluY2x1c2l2ZS4gIDAgaXMgYSBzcGVjaWFsCitjYXNlLCBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDMwLgorCitOb3RlIHRoYXQgdGhlIHJhbmRvbWlzYXRpb24gcHJvY2VzcyBpcyBlbnRpcmVseSB0cmFuc3BhcmVudC4gIAorSWYgdGhlIGxpYnJhcnkgZGVjaWRlcyB0byByYW5kb21pc2UgYW5kIHJlc3RhcnQgY29tcHJlc3Npb24gb24gYQorYmxvY2ssIGl0IGRvZXMgc28gd2l0aG91dCBjb21tZW50LiAgUmFuZG9taXNlZCBibG9ja3MgYXJlCithdXRvbWF0aWNhbGx5IGRlLXJhbmRvbWlzZWQgZHVyaW5nIGRlY29tcHJlc3Npb24sIHNvIGRhdGEKK2ludGVncml0eSBpcyBuZXZlciBjb21wcm9taXNlZC4KKworUG9zc2libGUgcmV0dXJuIHZhbHVlczoKK0BkaXNwbGF5CisgICAgICBAY29kZXtCWl9QQVJBTV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtzdHJtfSBpcyBAY29kZXtOVUxMfSAKKyAgICAgICAgIG9yIEBjb2Rle2Jsb2NrU2l6ZX0gPCAxIG9yIEBjb2Rle2Jsb2NrU2l6ZX0gPiA5CisgICAgICAgICBvciBAY29kZXt2ZXJib3NpdHl9IDwgMCBvciBAY29kZXt2ZXJib3NpdHl9ID4gNAorICAgICAgICAgb3IgQGNvZGV7d29ya0ZhY3Rvcn0gPCAwIG9yIEBjb2Rle3dvcmtGYWN0b3J9ID4gMjUwCisgICAgICBAY29kZXtCWl9NRU1fRVJST1J9IAorICAgICAgICAgaWYgbm90IGVub3VnaCBtZW1vcnkgaXMgYXZhaWxhYmxlCisgICAgICBAY29kZXtCWl9PS30gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorQWxsb3dhYmxlIG5leHQgYWN0aW9uczoKK0BkaXNwbGF5CisgICAgICBAY29kZXtiekNvbXByZXNzfSAKKyAgICAgICAgIGlmIEBjb2Rle0JaX09LfSBpcyByZXR1cm5lZAorICAgICAgbm8gc3BlY2lmaWMgYWN0aW9uIG5lZWRlZCBpbiBjYXNlIG9mIGVycm9yCitAZW5kIGRpc3BsYXkKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpDb21wcmVzc30KK0BleGFtcGxlCisgICBpbnQgYnpDb21wcmVzcyAoIGJ6X3N0cmVhbSAqc3RybSwgaW50IGFjdGlvbiApOworQGVuZCBleGFtcGxlCitQcm92aWRlcyBtb3JlIGlucHV0IGFuZC9vciBvdXRwdXQgYnVmZmVyIHNwYWNlIGZvciB0aGUgbGlicmFyeS4gIFRoZQorY2FsbGVyIG1haW50YWlucyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMsIGFuZCBjYWxscyBAY29kZXtiekNvbXByZXNzfSB0bwordHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHRoZW0uCisKK0JlZm9yZSBlYWNoIGNhbGwgdG8gQGNvZGV7YnpDb21wcmVzc30sIEBjb2Rle25leHRfaW59IHNob3VsZCBwb2ludCBhdAordGhlIGRhdGEgdG8gYmUgY29tcHJlc3NlZCwgYW5kIEBjb2Rle2F2YWlsX2lufSBzaG91bGQgaW5kaWNhdGUgaG93IG1hbnkKK2J5dGVzIHRoZSBsaWJyYXJ5IG1heSByZWFkLiAgQGNvZGV7YnpDb21wcmVzc30gdXBkYXRlcyBAY29kZXtuZXh0X2lufSwKK0Bjb2Rle2F2YWlsX2lufSBhbmQgQGNvZGV7dG90YWxfaW59IHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiBieXRlcyBpdAoraGFzIHJlYWQuCisKK1NpbWlsYXJseSwgQGNvZGV7bmV4dF9vdXR9IHNob3VsZCBwb2ludCB0byBhIGJ1ZmZlciBpbiB3aGljaCB0aGUKK2NvbXByZXNzZWQgZGF0YSBpcyB0byBiZSBwbGFjZWQsIHdpdGggQGNvZGV7YXZhaWxfb3V0fSBpbmRpY2F0aW5nIGhvdworbXVjaCBvdXRwdXQgc3BhY2UgaXMgYXZhaWxhYmxlLiAgQGNvZGV7YnpDb21wcmVzc30gdXBkYXRlcworQGNvZGV7bmV4dF9vdXR9LCBAY29kZXthdmFpbF9vdXR9IGFuZCBAY29kZXt0b3RhbF9vdXR9IHRvIHJlZmxlY3QgdGhlCitudW1iZXIgb2YgYnl0ZXMgb3V0cHV0LgorCitZb3UgbWF5IHByb3ZpZGUgYW5kIHJlbW92ZSBhcyBsaXR0bGUgb3IgYXMgbXVjaCBkYXRhIGFzIHlvdSBsaWtlIG9uIGVhY2gKK2NhbGwgb2YgQGNvZGV7YnpDb21wcmVzc30uICBJbiB0aGUgbGltaXQsIGl0IGlzIGFjY2VwdGFibGUgdG8gc3VwcGx5IGFuZAorcmVtb3ZlIGRhdGEgb25lIGJ5dGUgYXQgYSB0aW1lLCBhbHRob3VnaCB0aGlzIHdvdWxkIGJlIHRlcnJpYmx5CitpbmVmZmljaWVudC4gIFlvdSBzaG91bGQgYWx3YXlzIGVuc3VyZSB0aGF0IGF0IGxlYXN0IG9uZSBieXRlIG9mIG91dHB1dAorc3BhY2UgaXMgYXZhaWxhYmxlIGF0IGVhY2ggY2FsbC4KKworQSBzZWNvbmQgcHVycG9zZSBvZiBAY29kZXtiekNvbXByZXNzfSBpcyB0byByZXF1ZXN0IGEgY2hhbmdlIG9mIG1vZGUgb2YgdGhlCitjb21wcmVzc2VkIHN0cmVhbS4gIAorCitDb25jZXB0dWFsbHksIGEgY29tcHJlc3NlZCBzdHJlYW0gY2FuIGJlIGluIG9uZSBvZiBmb3VyIHN0YXRlczogSURMRSwKK1JVTk5JTkcsIEZMVVNISU5HIGFuZCBGSU5JU0hJTkcuICBCZWZvcmUgaW5pdGlhbGlzYXRpb24KKyhAY29kZXtiekNvbXByZXNzSW5pdH0pIGFuZCBhZnRlciB0ZXJtaW5hdGlvbiAoQGNvZGV7YnpDb21wcmVzc0VuZH0pLCBhCitzdHJlYW0gaXMgcmVnYXJkZWQgYXMgSURMRS4KKworVXBvbiBpbml0aWFsaXNhdGlvbiAoQGNvZGV7YnpDb21wcmVzc0luaXR9KSwgdGhlIHN0cmVhbSBpcyBwbGFjZWQgaW4gdGhlCitSVU5OSU5HIHN0YXRlLiAgU3Vic2VxdWVudCBjYWxscyB0byBAY29kZXtiekNvbXByZXNzfSBzaG91bGQgcGFzcworQGNvZGV7QlpfUlVOfSBhcyB0aGUgcmVxdWVzdGVkIGFjdGlvbjsgb3RoZXIgYWN0aW9ucyBhcmUgaWxsZWdhbCBhbmQKK3dpbGwgcmVzdWx0IGluIEBjb2Rle0JaX1NFUVVFTkNFX0VSUk9SfS4KKworQXQgc29tZSBwb2ludCwgdGhlIGNhbGxpbmcgcHJvZ3JhbSB3aWxsIGhhdmUgcHJvdmlkZWQgYWxsIHRoZSBpbnB1dCBkYXRhCitpdCB3YW50cyB0by4gIEl0IHdpbGwgdGhlbiB3YW50IHRvIGZpbmlzaCB1cCAtLSBpbiBlZmZlY3QsIGFza2luZyB0aGUKK2xpYnJhcnkgdG8gcHJvY2VzcyBhbnkgZGF0YSBpdCBtaWdodCBoYXZlIGJ1ZmZlcmVkIGludGVybmFsbHkuICBJbiB0aGlzCitzdGF0ZSwgQGNvZGV7YnpDb21wcmVzc30gd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byByZWFkIGRhdGEgZnJvbQorQGNvZGV7bmV4dF9pbn0sIGJ1dCBpdCB3aWxsIHdhbnQgdG8gd3JpdGUgZGF0YSB0byBAY29kZXtuZXh0X291dH0uCitCZWNhdXNlIHRoZSBvdXRwdXQgYnVmZmVyIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIGNhbiBiZSBhcmJpdHJhcmlseSBzbWFsbCwKK3RoZSBmaW5pc2hpbmctdXAgb3BlcmF0aW9uIGNhbm5vdCBuZWNlc3NhcmlseSBiZSBkb25lIHdpdGggYSBzaW5nbGUgY2FsbAorb2YgQGNvZGV7YnpDb21wcmVzc30uCisKK0luc3RlYWQsIHRoZSBjYWxsaW5nIHByb2dyYW0gcGFzc2VzIEBjb2Rle0JaX0ZJTklTSH0gYXMgYW4gYWN0aW9uIHRvCitAY29kZXtiekNvbXByZXNzfS4gIFRoaXMgY2hhbmdlcyB0aGUgc3RyZWFtJ3Mgc3RhdGUgdG8gRklOSVNISU5HLiAgQW55CityZW1haW5pbmcgaW5wdXQgKGllLCBAY29kZXtuZXh0X2luWzAgLi4gYXZhaWxfaW4tMV19KSBpcyBjb21wcmVzc2VkIGFuZAordHJhbnNmZXJyZWQgdG8gdGhlIG91dHB1dCBidWZmZXIuICBUbyBkbyB0aGlzLCBAY29kZXtiekNvbXByZXNzfSBtdXN0IGJlCitjYWxsZWQgcmVwZWF0ZWRseSB1bnRpbCBhbGwgdGhlIG91dHB1dCBoYXMgYmVlbiBjb25zdW1lZC4gIEF0IHRoYXQKK3BvaW50LCBAY29kZXtiekNvbXByZXNzfSByZXR1cm5zIEBjb2Rle0JaX1NUUkVBTV9FTkR9LCBhbmQgdGhlIHN0cmVhbSdzCitzdGF0ZSBpcyBzZXQgYmFjayB0byBJRExFLiAgQGNvZGV7YnpDb21wcmVzc0VuZH0gc2hvdWxkIHRoZW4gYmUKK2NhbGxlZC4KKworSnVzdCB0byBtYWtlIHN1cmUgdGhlIGNhbGxpbmcgcHJvZ3JhbSBkb2VzIG5vdCBjaGVhdCwgdGhlIGxpYnJhcnkgbWFrZXMKK2Egbm90ZSBvZiBAY29kZXthdmFpbF9pbn0gYXQgdGhlIHRpbWUgb2YgdGhlIGZpcnN0IGNhbGwgdG8KK0Bjb2Rle2J6Q29tcHJlc3N9IHdoaWNoIGhhcyBAY29kZXtCWl9GSU5JU0h9IGFzIGFuIGFjdGlvbiAoaWUsIGF0IHRoZQordGltZSB0aGUgcHJvZ3JhbSBoYXMgYW5ub3VuY2VkIGl0cyBpbnRlbnRpb24gdG8gbm90IHN1cHBseSBhbnkgbW9yZQoraW5wdXQpLiAgQnkgY29tcGFyaW5nIHRoaXMgdmFsdWUgd2l0aCB0aGF0IG9mIEBjb2Rle2F2YWlsX2lufSBvdmVyCitzdWJzZXF1ZW50IGNhbGxzIHRvIEBjb2Rle2J6Q29tcHJlc3N9LCB0aGUgbGlicmFyeSBjYW4gZGV0ZWN0IGFueQorYXR0ZW1wdHMgdG8gc2xpcCBpbiBtb3JlIGRhdGEgdG8gY29tcHJlc3MuICBBbnkgY2FsbHMgZm9yIHdoaWNoIHRoaXMgaXMKK2RldGVjdGVkIHdpbGwgcmV0dXJuIEBjb2Rle0JaX1NFUVVFTkNFX0VSUk9SfS4gIFRoaXMgaW5kaWNhdGVzIGEKK3Byb2dyYW1taW5nIG1pc3Rha2Ugd2hpY2ggc2hvdWxkIGJlIGNvcnJlY3RlZC4KKworSW5zdGVhZCBvZiBhc2tpbmcgdG8gZmluaXNoLCB0aGUgY2FsbGluZyBwcm9ncmFtIG1heSBhc2sKK0Bjb2Rle2J6Q29tcHJlc3N9IHRvIHRha2UgYWxsIHRoZSByZW1haW5pbmcgaW5wdXQsIGNvbXByZXNzIGl0IGFuZAordGVybWluYXRlIHRoZSBjdXJyZW50IChCdXJyb3dzLVdoZWVsZXIpIGNvbXByZXNzaW9uIGJsb2NrLiAgVGhpcyBjb3VsZAorYmUgdXNlZnVsIGZvciBlcnJvciBjb250cm9sIHB1cnBvc2VzLiAgVGhlIG1lY2hhbmlzbSBpcyBhbmFsb2dvdXMgdG8KK3RoYXQgZm9yIGZpbmlzaGluZzogY2FsbCBAY29kZXtiekNvbXByZXNzfSB3aXRoIGFuIGFjdGlvbiBvZgorQGNvZGV7QlpfRkxVU0h9LCByZW1vdmUgb3V0cHV0IGRhdGEsIGFuZCBwZXJzaXN0IHdpdGggdGhlCitAY29kZXtCWl9GTFVTSH0gYWN0aW9uIHVudGlsIHRoZSB2YWx1ZSBAY29kZXtCWl9SVU59IGlzIHJldHVybmVkLiAgQXMKK3dpdGggZmluaXNoaW5nLCBAY29kZXtiekNvbXByZXNzfSBkZXRlY3RzIGFueSBhdHRlbXB0IHRvIHByb3ZpZGUgbW9yZQoraW5wdXQgZGF0YSBvbmNlIHRoZSBmbHVzaCBoYXMgYmVndW4uCisKK09uY2UgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLCB0aGUgc3RyZWFtIHJldHVybnMgdG8gdGhlIG5vcm1hbCBSVU5OSU5HCitzdGF0ZS4KKworVGhpcyBhbGwgc291bmRzIHByZXR0eSBjb21wbGV4LCBidXQgaXNuJ3QgcmVhbGx5LiAgSGVyZSdzIGEgdGFibGUKK3doaWNoIHNob3dzIHdoaWNoIGFjdGlvbnMgYXJlIGFsbG93YWJsZSBpbiBlYWNoIHN0YXRlLCB3aGF0IGFjdGlvbgord2lsbCBiZSB0YWtlbiwgd2hhdCB0aGUgbmV4dCBzdGF0ZSBpcywgYW5kIHdoYXQgdGhlIG5vbi1lcnJvciByZXR1cm4KK3ZhbHVlcyBhcmUuICBOb3RlIHRoYXQgeW91IGNhbid0IGV4cGxpY2l0bHkgYXNrIHdoYXQgc3RhdGUgdGhlCitzdHJlYW0gaXMgaW4sIGJ1dCBub3IgZG8geW91IG5lZWQgdG8gLS0gaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlCit2YWx1ZXMgcmV0dXJuZWQgYnkgQGNvZGV7YnpDb21wcmVzc30uCitAZGlzcGxheQorSURMRS9AY29kZXthbnl9ICAgICAgICAgICAKKyAgICAgIElsbGVnYWwuICBJRExFIHN0YXRlIG9ubHkgZXhpc3RzIGFmdGVyIEBjb2Rle2J6Q29tcHJlc3NFbmR9IG9yCisgICAgICBiZWZvcmUgQGNvZGV7YnpDb21wcmVzc0luaXR9LgorICAgICAgUmV0dXJuIHZhbHVlID0gQGNvZGV7QlpfU0VRVUVOQ0VfRVJST1J9CisKK1JVTk5JTkcvQGNvZGV7QlpfUlVOfSAgICAgCisgICAgICBDb21wcmVzcyBmcm9tIEBjb2Rle25leHRfaW59IHRvIEBjb2Rle25leHRfb3V0fSBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAgICAgTmV4dCBzdGF0ZSA9IFJVTk5JTkcKKyAgICAgIFJldHVybiB2YWx1ZSA9IEBjb2Rle0JaX1JVTl9PS30KKworUlVOTklORy9AY29kZXtCWl9GTFVTSH0gICAKKyAgICAgIFJlbWVtYmVyIGN1cnJlbnQgdmFsdWUgb2YgQGNvZGV7bmV4dF9pbn0uICBDb21wcmVzcyBmcm9tIEBjb2Rle25leHRfaW59CisgICAgICB0byBAY29kZXtuZXh0X291dH0gYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IGRvIG5vdCBhY2NlcHQgYW55IG1vcmUgaW5wdXQuICAKKyAgICAgIE5leHQgc3RhdGUgPSBGTFVTSElORworICAgICAgUmV0dXJuIHZhbHVlID0gQGNvZGV7QlpfRkxVU0hfT0t9CisKK1JVTk5JTkcvQGNvZGV7QlpfRklOSVNIfSAgCisgICAgICBSZW1lbWJlciBjdXJyZW50IHZhbHVlIG9mIEBjb2Rle25leHRfaW59LiAgQ29tcHJlc3MgZnJvbSBAY29kZXtuZXh0X2lufQorICAgICAgdG8gQGNvZGV7bmV4dF9vdXR9IGFzIG11Y2ggYXMgcG9zc2libGUsIGJ1dCBkbyBub3QgYWNjZXB0IGFueSBtb3JlIGlucHV0LgorICAgICAgTmV4dCBzdGF0ZSA9IEZJTklTSElORworICAgICAgUmV0dXJuIHZhbHVlID0gQGNvZGV7QlpfRklOSVNIX09LfQorCitGTFVTSElORy9AY29kZXtCWl9GTFVTSH0gIAorICAgICAgQ29tcHJlc3MgZnJvbSBAY29kZXtuZXh0X2lufSB0byBAY29kZXtuZXh0X291dH0gYXMgbXVjaCBhcyBwb3NzaWJsZSwgCisgICAgICBidXQgZG8gbm90IGFjY2VwdCBhbnkgbW9yZSBpbnB1dC4gIAorICAgICAgSWYgYWxsIHRoZSBleGlzdGluZyBpbnB1dCBoYXMgYmVlbiB1c2VkIHVwIGFuZCBhbGwgY29tcHJlc3NlZAorICAgICAgb3V0cHV0IGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgIE5leHQgc3RhdGUgPSBSVU5OSU5HOyBSZXR1cm4gdmFsdWUgPSBAY29kZXtCWl9SVU5fT0t9CisgICAgICBlbHNlCisgICAgICAgICBOZXh0IHN0YXRlID0gRkxVU0hJTkc7IFJldHVybiB2YWx1ZSA9IEBjb2Rle0JaX0ZMVVNIX09LfQorCitGTFVTSElORy9vdGhlciAgICAgCisgICAgICBJbGxlZ2FsLgorICAgICAgUmV0dXJuIHZhbHVlID0gQGNvZGV7QlpfU0VRVUVOQ0VfRVJST1J9CisKK0ZJTklTSElORy9AY29kZXtCWl9GSU5JU0h9ICAKKyAgICAgIENvbXByZXNzIGZyb20gQGNvZGV7bmV4dF9pbn0gdG8gQGNvZGV7bmV4dF9vdXR9IGFzIG11Y2ggYXMgcG9zc2libGUsCisgICAgICBidXQgdG8gbm90IGFjY2VwdCBhbnkgbW9yZSBpbnB1dC4gIAorICAgICAgSWYgYWxsIHRoZSBleGlzdGluZyBpbnB1dCBoYXMgYmVlbiB1c2VkIHVwIGFuZCBhbGwgY29tcHJlc3NlZAorICAgICAgb3V0cHV0IGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgIE5leHQgc3RhdGUgPSBJRExFOyBSZXR1cm4gdmFsdWUgPSBAY29kZXtCWl9TVFJFQU1fRU5EfQorICAgICAgZWxzZQorICAgICAgICAgTmV4dCBzdGF0ZSA9IEZJTklTSElORzsgUmV0dXJuIHZhbHVlID0gQGNvZGV7QlpfRklOSVNISU5HfQorCitGSU5JU0hJTkcvb3RoZXIKKyAgICAgIElsbGVnYWwuCisgICAgICBSZXR1cm4gdmFsdWUgPSBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0KK0BlbmQgZGlzcGxheQorCitUaGF0IHN0aWxsIGxvb2tzIGNvbXBsaWNhdGVkPyAgV2VsbCwgZmFpciBlbm91Z2guICBUaGUgdXN1YWwgc2VxdWVuY2UKK29mIGNhbGxzIGZvciBjb21wcmVzc2luZyBhIGxvYWQgb2YgZGF0YSBpczoKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIEdldCBzdGFydGVkIHdpdGggQGNvZGV7YnpDb21wcmVzc0luaXR9LgorQGl0ZW0gU2hvdmVsIGRhdGEgaW4gYW5kIHNobHVycCBvdXQgaXRzIGNvbXByZXNzZWQgZm9ybSB1c2luZyB6ZXJvIG9yIG1vcmUKK2NhbGxzIG9mIEBjb2Rle2J6Q29tcHJlc3N9IHdpdGggYWN0aW9uID0gQGNvZGV7QlpfUlVOfS4KK0BpdGVtIEZpbmlzaCB1cC4gIAorUmVwZWF0ZWRseSBjYWxsIEBjb2Rle2J6Q29tcHJlc3N9IHdpdGggYWN0aW9uID0gQGNvZGV7QlpfRklOSVNIfSwgCitjb3B5aW5nIG91dCB0aGUgY29tcHJlc3NlZCBvdXRwdXQsIHVudGlsIEBjb2Rle0JaX1NUUkVBTV9FTkR9IGlzIHJldHVybmVkLgorQGl0ZW0gQ2xvc2UgdXAgYW5kIGdvIGhvbWUuICBDYWxsIEBjb2Rle2J6Q29tcHJlc3NFbmR9LgorQGVuZCBpdGVtaXplCitJZiB0aGUgZGF0YSB5b3Ugd2FudCB0byBjb21wcmVzcyBmaXRzIGludG8geW91ciBpbnB1dCBidWZmZXIgYWxsCithdCBvbmNlLCB5b3UgY2FuIHNraXAgdGhlIGNhbGxzIG9mIEBjb2Rle2J6Q29tcHJlc3MgKCAuLi4sIEJaX1JVTiApfSBhbmQgCitqdXN0IGRvIHRoZSBAY29kZXtiekNvbXByZXNzICggLi4uLCBCWl9GSU5JU0ggKX0gY2FsbHMuCisKK0FsbCByZXF1aXJlZCBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ5IEBjb2Rle2J6Q29tcHJlc3NJbml0fS4gIFRoZQorY29tcHJlc3Npb24gbGlicmFyeSBjYW4gYWNjZXB0IGFueSBkYXRhIGF0IGFsbCAob2J2aW91c2x5KS4gIFNvIHlvdQorc2hvdWxkbid0IGdldCBhbnkgZXJyb3IgcmV0dXJuIHZhbHVlcyBmcm9tIHRoZSBAY29kZXtiekNvbXByZXNzfSBjYWxscy4KK0lmIHlvdSBkbywgdGhleSB3aWxsIGJlIEBjb2Rle0JaX1NFUVVFTkNFX0VSUk9SfSwgYW5kIGluZGljYXRlIGEgYnVnIGluCit5b3VyIHByb2dyYW1taW5nLgorCitUcml2aWFsIG90aGVyIHBvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9ICAgCisgICAgICAgICBpZiBAY29kZXtzdHJtfSBpcyBAY29kZXtOVUxMfSwgb3IgQGNvZGV7c3RybS0+c30gaXMgQGNvZGV7TlVMTH0KK0BlbmQgZGlzcGxheQorCitAc3Vic2VjdGlvbiBAY29kZXtiekNvbXByZXNzRW5kfQorQGV4YW1wbGUKK2ludCBiekNvbXByZXNzRW5kICggYnpfc3RyZWFtICpzdHJtICk7CitAZW5kIGV4YW1wbGUKK1JlbGVhc2VzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgY29tcHJlc3Npb24gc3RyZWFtLgorCitQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorQGRpc3BsYXkKKyAgIEBjb2Rle0JaX1BBUkFNX0VSUk9SfSAgICBpZiBAY29kZXtzdHJtfSBpcyBAY29kZXtOVUxMfSBvciBAY29kZXtzdHJtLT5zfSBpcyBAY29kZXtOVUxMfQorICAgQGNvZGV7QlpfT0t9ICAgIG90aGVyd2lzZQorQGVuZCBkaXNwbGF5CisKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpEZWNvbXByZXNzSW5pdH0KK0BleGFtcGxlCitpbnQgYnpEZWNvbXByZXNzSW5pdCAoIGJ6X3N0cmVhbSAqc3RybSwgaW50IHZlcmJvc2l0eSwgaW50IHNtYWxsICk7CitAZW5kIGV4YW1wbGUKK1ByZXBhcmVzIGZvciBkZWNvbXByZXNzaW9uLiAgQXMgd2l0aCBAY29kZXtiekNvbXByZXNzSW5pdH0sIGEKK0Bjb2Rle2J6X3N0cmVhbX0gcmVjb3JkIHNob3VsZCBiZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpc2VkIGJlZm9yZSB0aGUKK2NhbGwuICBGaWVsZHMgQGNvZGV7YnphbGxvY30sIEBjb2Rle2J6ZnJlZX0gYW5kIEBjb2Rle29wYXF1ZX0gc2hvdWxkIGJlCitzZXQgaWYgYSBjdXN0b20gbWVtb3J5IGFsbG9jYXRvciBpcyByZXF1aXJlZCwgb3IgbWFkZSBAY29kZXtOVUxMfSBmb3IKK3RoZSBub3JtYWwgQGNvZGV7bWFsbG9jfS9AY29kZXtmcmVlfSByb3V0aW5lcy4gIFVwb24gcmV0dXJuLCB0aGUgaW50ZXJuYWwKK3N0YXRlIHdpbGwgaGF2ZSBiZWVuIGluaXRpYWxpc2VkLCBhbmQgQGNvZGV7dG90YWxfaW59IGFuZAorQGNvZGV7dG90YWxfb3V0fSB3aWxsIGJlIHplcm8uCisKK0ZvciB0aGUgbWVhbmluZyBvZiBwYXJhbWV0ZXIgQGNvZGV7dmVyYm9zaXR5fSwgc2VlIEBjb2Rle2J6Q29tcHJlc3NJbml0fS4KKworSWYgQGNvZGV7c21hbGx9IGlzIG5vbnplcm8sIHRoZSBsaWJyYXJ5IHdpbGwgdXNlIGFuIGFsdGVybmF0aXZlCitkZWNvbXByZXNzaW9uIGFsZ29yaXRobSB3aGljaCB1c2VzIGxlc3MgbWVtb3J5IGJ1dCBhdCB0aGUgY29zdCBvZgorZGVjb21wcmVzc2luZyBtb3JlIHNsb3dseSAocm91Z2hseSBzcGVha2luZywgaGFsZiB0aGUgc3BlZWQsIGJ1dCB0aGUKK21heGltdW0gbWVtb3J5IHJlcXVpcmVtZW50IGRyb3BzIHRvIGFyb3VuZCAyMzAwaykuICBTZWUgQ2hhcHRlciAyIGZvcgorbW9yZSBpbmZvcm1hdGlvbiBvbiBtZW1vcnkgbWFuYWdlbWVudC4KKworTm90ZSB0aGF0IHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byBkZWNvbXByZXNzCithIHN0cmVhbSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB1bnRpbCB0aGUgc3RyZWFtJ3MgaGVhZGVyIGhhcyBiZWVuIHJlYWQsCitzbyBldmVuIGlmIEBjb2Rle2J6RGVjb21wcmVzc0luaXR9IHN1Y2NlZWRzLCBhIHN1YnNlcXVlbnQKK0Bjb2Rle2J6RGVjb21wcmVzc30gY291bGQgZmFpbCB3aXRoIEBjb2Rle0JaX01FTV9FUlJPUn0uCisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9CisgICAgICAgICBpZiBAY29kZXsoc21hbGwgIT0gMCAmJiBzbWFsbCAhPSAxKX0KKyAgICAgICAgIG9yIEBjb2Rleyh2ZXJib3NpdHkgPCAwIHx8IHZlcmJvc2l0eSA+IDQpfQorICAgICAgQGNvZGV7QlpfTUVNX0VSUk9SfQorICAgICAgICAgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIEBjb2Rle2J6RGVjb21wcmVzc30KKyAgICAgICAgIGlmIEBjb2Rle0JaX09LfSB3YXMgcmV0dXJuZWQKKyAgICAgIG5vIHNwZWNpZmljIGFjdGlvbiByZXF1aXJlZCBpbiBjYXNlIG9mIGVycm9yCitAZW5kIGRpc3BsYXkKKworIAorCitAc3Vic2VjdGlvbiBAY29kZXtiekRlY29tcHJlc3N9CitAZXhhbXBsZQoraW50IGJ6RGVjb21wcmVzcyAoIGJ6X3N0cmVhbSAqc3RybSApOworQGVuZCBleGFtcGxlCitQcm92aWRlcyBtb3JlIGlucHV0IGFuZC9vdXQgb3V0cHV0IGJ1ZmZlciBzcGFjZSBmb3IgdGhlIGxpYnJhcnkuICBUaGUKK2NhbGxlciBtYWludGFpbnMgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzLCBhbmQgdXNlcyBAY29kZXtiekRlY29tcHJlc3N9Cit0byB0cmFuc2ZlciBkYXRhIGJldHdlZW4gdGhlbS4KKworQmVmb3JlIGVhY2ggY2FsbCB0byBAY29kZXtiekRlY29tcHJlc3N9LCBAY29kZXtuZXh0X2lufSAKK3Nob3VsZCBwb2ludCBhdCB0aGUgY29tcHJlc3NlZCBkYXRhLAorYW5kIEBjb2Rle2F2YWlsX2lufSBzaG91bGQgaW5kaWNhdGUgaG93IG1hbnkgYnl0ZXMgdGhlIGxpYnJhcnkKK21heSByZWFkLiAgQGNvZGV7YnpEZWNvbXByZXNzfSB1cGRhdGVzIEBjb2Rle25leHRfaW59LCBAY29kZXthdmFpbF9pbn0gCithbmQgQGNvZGV7dG90YWxfaW59Cit0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgaGFzIHJlYWQuCisKK1NpbWlsYXJseSwgQGNvZGV7bmV4dF9vdXR9IHNob3VsZCBwb2ludCB0byBhIGJ1ZmZlciBpbiB3aGljaCB0aGUgdW5jb21wcmVzc2VkCitvdXRwdXQgaXMgdG8gYmUgcGxhY2VkLCB3aXRoIEBjb2Rle2F2YWlsX291dH0gaW5kaWNhdGluZyBob3cgbXVjaCBvdXRwdXQgc3BhY2UKK2lzIGF2YWlsYWJsZS4gIEBjb2Rle2J6Q29tcHJlc3N9IHVwZGF0ZXMgQGNvZGV7bmV4dF9vdXR9LAorQGNvZGV7YXZhaWxfb3V0fSBhbmQgQGNvZGV7dG90YWxfb3V0fSB0byByZWZsZWN0Cit0aGUgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dC4KKworWW91IG1heSBwcm92aWRlIGFuZCByZW1vdmUgYXMgbGl0dGxlIG9yIGFzIG11Y2ggZGF0YSBhcyB5b3UgbGlrZSBvbgorZWFjaCBjYWxsIG9mIEBjb2Rle2J6RGVjb21wcmVzc30uICAKK0luIHRoZSBsaW1pdCwgaXQgaXMgYWNjZXB0YWJsZSB0bworc3VwcGx5IGFuZCByZW1vdmUgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUsIGFsdGhvdWdoIHRoaXMgd291bGQgYmUKK3RlcnJpYmx5IGluZWZmaWNpZW50LiAgWW91IHNob3VsZCBhbHdheXMgZW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lCitieXRlIG9mIG91dHB1dCBzcGFjZSBpcyBhdmFpbGFibGUgYXQgZWFjaCBjYWxsLgorCitVc2Ugb2YgQGNvZGV7YnpEZWNvbXByZXNzfSBpcyBzaW1wbGVyIHRoYW4gQGNvZGV7YnpDb21wcmVzc30uCisKK1lvdSBzaG91bGQgcHJvdmlkZSBpbnB1dCBhbmQgcmVtb3ZlIG91dHB1dCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZAorcmVwZWF0ZWRseSBjYWxsIEBjb2Rle2J6RGVjb21wcmVzc30gdW50aWwgQGNvZGV7QlpfU1RSRUFNX0VORH0gaXMKK3JldHVybmVkLiAgQXBwZWFyYW5jZSBvZiBAY29kZXtCWl9TVFJFQU1fRU5EfSBkZW5vdGVzIHRoYXQKK0Bjb2Rle2J6RGVjb21wcmVzc30gaGFzIGRldGVjdGVkIHRoZSBsb2dpY2FsIGVuZCBvZiB0aGUgY29tcHJlc3NlZAorc3RyZWFtLiAgQGNvZGV7YnpEZWNvbXByZXNzfSB3aWxsIG5vdCBwcm9kdWNlIEBjb2Rle0JaX1NUUkVBTV9FTkR9IHVudGlsCithbGwgb3V0cHV0IGRhdGEgaGFzIGJlZW4gcGxhY2VkIGludG8gdGhlIG91dHB1dCBidWZmZXIsIHNvIG9uY2UKK0Bjb2Rle0JaX1NUUkVBTV9FTkR9IGFwcGVhcnMsIHlvdSBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGF2YWlsYWJsZSBhbGwKK3RoZSBkZWNvbXByZXNzZWQgb3V0cHV0LCBhbmQgQGNvZGV7YnpEZWNvbXByZXNzRW5kfSBjYW4gc2FmZWx5IGJlCitjYWxsZWQuCisKK0lmIGNhc2Ugb2YgYW4gZXJyb3IgcmV0dXJuIHZhbHVlLCB5b3Ugc2hvdWxkIGNhbGwgQGNvZGV7YnpEZWNvbXByZXNzRW5kfQordG8gY2xlYW4gdXAgYW5kIHJlbGVhc2UgbWVtb3J5LgorCitQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorQGRpc3BsYXkKKyAgICAgIEBjb2Rle0JaX1BBUkFNX0VSUk9SfQorICAgICAgICAgaWYgQGNvZGV7c3RybX0gaXMgQGNvZGV7TlVMTH0gb3IgQGNvZGV7c3RybS0+c30gaXMgQGNvZGV7TlVMTH0KKyAgICAgICAgIG9yIEBjb2Rle3N0cm0tPmF2YWlsX291dCA8IDF9CisgICAgICBAY29kZXtCWl9EQVRBX0VSUk9SfQorICAgICAgICAgaWYgYSBkYXRhIGludGVncml0eSBlcnJvciBpcyBkZXRlY3RlZCBpbiB0aGUgY29tcHJlc3NlZCBzdHJlYW0KKyAgICAgIEBjb2Rle0JaX0RBVEFfRVJST1JfTUFHSUN9CisgICAgICAgICBpZiB0aGUgY29tcHJlc3NlZCBzdHJlYW0gZG9lc24ndCBiZWdpbiB3aXRoIHRoZSByaWdodCBtYWdpYyBieXRlcworICAgICAgQGNvZGV7QlpfTUVNX0VSUk9SfQorICAgICAgICAgaWYgdGhlcmUgd2Fzbid0IGVub3VnaCBtZW1vcnkgYXZhaWxhYmxlCisgICAgICBAY29kZXtCWl9TVFJFQU1fRU5EfQorICAgICAgICAgaWYgdGhlIGxvZ2ljYWwgZW5kIG9mIHRoZSBkYXRhIHN0cmVhbSB3YXMgZGV0ZWN0ZWQgYW5kIGFsbAorICAgICAgICAgb3V0cHV0IGluIGhhcyBiZWVuIGNvbnN1bWVkLCBlZyBAY29kZXtzLT5hdmFpbF9vdXQgPiAwfQorICAgICAgQGNvZGV7QlpfT0t9CisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorQWxsb3dhYmxlIG5leHQgYWN0aW9uczoKK0BkaXNwbGF5CisgICAgICBAY29kZXtiekRlY29tcHJlc3N9CisgICAgICAgICBpZiBAY29kZXtCWl9PS30gd2FzIHJldHVybmVkCisgICAgICBAY29kZXtiekRlY29tcHJlc3NFbmR9CisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCisKK0BzdWJzZWN0aW9uIEBjb2Rle2J6RGVjb21wcmVzc0VuZH0KK0BleGFtcGxlCitpbnQgYnpEZWNvbXByZXNzRW5kICggYnpfc3RyZWFtICpzdHJtICk7CitAZW5kIGV4YW1wbGUKK1JlbGVhc2VzIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgZGVjb21wcmVzc2lvbiBzdHJlYW0uCisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9CisgICAgICAgICBpZiBAY29kZXtzdHJtfSBpcyBAY29kZXtOVUxMfSBvciBAY29kZXtzdHJtLT5zfSBpcyBAY29kZXtOVUxMfQorICAgICAgQGNvZGV7QlpfT0t9CisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIE5vbmUuCitAZW5kIGRpc3BsYXkKKworCitAc2VjdGlvbiBIaWdoLWxldmVsIGludGVyZmFjZQorCitUaGlzIGludGVyZmFjZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgCitAY29kZXtiemlwMn0gZm9ybWF0IGZpbGVzLiAgRmlyc3QsIHNvbWUgZ2VuZXJhbCBwb2ludHMuCisKK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIEFsbCBvZiB0aGUgZnVuY3Rpb25zIHRha2UgYW4gQGNvZGV7aW50Kn0gZmlyc3QgYXJndW1lbnQsCisgIEBjb2Rle2J6ZXJyb3J9LgorICBBZnRlciBlYWNoIGNhbGwsIEBjb2Rle2J6ZXJyb3J9IHNob3VsZCBiZSBjb25zdWx0ZWQgZmlyc3QgdG8gZGV0ZXJtaW5lCisgIHRoZSBvdXRjb21lIG9mIHRoZSBjYWxsLiAgSWYgQGNvZGV7YnplcnJvcn0gaXMgQGNvZGV7QlpfT0t9LCAKKyAgdGhlIGNhbGwgY29tcGxldGVkCisgIHN1Y2Nlc3NmdWxseSwgYW5kIG9ubHkgdGhlbiBzaG91bGQgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24KKyAgKGlmIGFueSkgYmUgY29uc3VsdGVkLiAgSWYgQGNvZGV7YnplcnJvcn0gaXMgQGNvZGV7QlpfSU9fRVJST1J9LCAKKyAgdGhlcmUgd2FzIGFuIGVycm9yCisgIHJlYWRpbmcvd3JpdGluZyB0aGUgdW5kZXJseWluZyBjb21wcmVzc2VkIGZpbGUsIGFuZCB5b3Ugc2hvdWxkCisgIHRoZW4gY29uc3VsdCBAY29kZXtlcnJub30vQGNvZGV7cGVycm9yfSB0byBkZXRlcm1pbmUgdGhlIAorICBjYXVzZSBvZiB0aGUgZGlmZmljdWx0eS4KKyAgQGNvZGV7YnplcnJvcn0gbWF5IGFsc28gYmUgc2V0IHRvIHZhcmlvdXMgb3RoZXIgdmFsdWVzOyBwcmVjaXNlIGRldGFpbHMgYXJlCisgIGdpdmVuIG9uIGEgcGVyLWZ1bmN0aW9uIGJhc2lzIGJlbG93LgorQGl0ZW0gSWYgQGNvZGV7YnplcnJvcn0gaW5kaWNhdGVzIGFuIGVycm9yIAorICAoaWUsIGFueXRoaW5nIGV4Y2VwdCBAY29kZXtCWl9PS30gYW5kIEBjb2Rle0JaX1NUUkVBTV9FTkR9KSwKKyAgeW91IHNob3VsZCBpbW1lZGlhdGVseSBjYWxsIEBjb2Rle2J6UmVhZENsb3NlfSAob3IgQGNvZGV7YnpXcml0ZUNsb3NlfSwKKyAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGFyZSBhdHRlbXB0aW5nIHRvIHJlYWQgb3IgdG8gd3JpdGUpCisgIHRvIGZyZWUgdXAgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkCisgIHdpdGggdGhlIHN0cmVhbS4gIE9uY2UgYW4gZXJyb3IgaGFzIGJlZW4gaW5kaWNhdGVkLCBiZWhhdmlvdXIgb2YgYWxsIGNhbGxzCisgIGV4Y2VwdCBAY29kZXtielJlYWRDbG9zZX0gKEBjb2Rle2J6V3JpdGVDbG9zZX0pIGlzIHVuZGVmaW5lZC4gIAorICBUaGUgaW1wbGljYXRpb24gaXMgdGhhdCAoMSkgQGNvZGV7YnplcnJvcn0gc2hvdWxkCisgIGJlIGNoZWNrZWQgYWZ0ZXIgZWFjaCBjYWxsLCBhbmQgKDIpIGlmIEBjb2Rle2J6ZXJyb3J9IGluZGljYXRlcyBhbiBlcnJvciwgCisgIEBjb2Rle2J6UmVhZENsb3NlfSAoQGNvZGV7YnpXcml0ZUNsb3NlfSkgc2hvdWxkIHRoZW4gYmUgY2FsbGVkIHRvIGNsZWFuIHVwLgorQGl0ZW0gVGhlIEBjb2Rle0ZJTEUqfSBhcmd1bWVudHMgcGFzc2VkIHRvCisgICBAY29kZXtielJlYWRPcGVufS9AY29kZXtieldyaXRlT3Blbn0gIAorICBzaG91bGQgYmUgc2V0IHRvIGJpbmFyeSBtb2RlLgorICBNb3N0IFVuaXggc3lzdGVtcyB3aWxsIGRvIHRoaXMgYnkgZGVmYXVsdCwgYnV0IG90aGVyIHBsYXRmb3JtcywKKyAgaW5jbHVkaW5nIFdpbmRvd3MgYW5kIE1hYywgd2lsbCBub3QuICBJZiB5b3Ugb21pdCB0aGlzLCB5b3UgbWF5CisgIGVuY291bnRlciBwcm9ibGVtcyB3aGVuIG1vdmluZyBjb2RlIHRvIG5ldyBwbGF0Zm9ybXMuCitAaXRlbSBNZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieQorICBAY29kZXttYWxsb2N9L0Bjb2Rle2ZyZWV9LiAgCisgIEF0IHByZXNlbnQKKyAgdGhlcmUgaXMgbm8gZmFjaWxpdHkgZm9yIHVzZXItZGVmaW5lZCBtZW1vcnkgYWxsb2NhdG9ycyBpbiB0aGUgZmlsZSBJL08KKyAgZnVuY3Rpb25zIChjb3VsZCBlYXNpbHkgYmUgYWRkZWQsIHRob3VnaCkuCitAZW5kIGl0ZW1pemUKKworCisKK0BzdWJzZWN0aW9uIEBjb2Rle2J6UmVhZE9wZW59CitAZXhhbXBsZQorICAgdHlwZWRlZiB2b2lkIEJaRklMRTsKKworICAgQlpGSUxFICpielJlYWRPcGVuICggaW50ICpiemVycm9yLCBGSUxFICpmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbWFsbCwgaW50IHZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVudXNlZCwgaW50IG5VbnVzZWQgKTsKK0BlbmQgZXhhbXBsZQorUHJlcGFyZSB0byByZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tIGZpbGUgaGFuZGxlIEBjb2Rle2Z9LiAgQGNvZGV7Zn0KK3Nob3VsZCByZWZlciB0byBhIGZpbGUgd2hpY2ggaGFzIGJlZW4gb3BlbmVkIGZvciByZWFkaW5nLCBhbmQgZm9yIHdoaWNoCit0aGUgZXJyb3IgaW5kaWNhdG9yIChAY29kZXtmZXJyb3IoZil9KWlzIG5vdCBzZXQuICBJZiBAY29kZXtzbWFsbH0gaXMgMSwKK3RoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIGRlY29tcHJlc3MgdXNpbmcgbGVzcyBtZW1vcnksIGF0IHRoZSBleHBlbnNlIG9mCitzcGVlZC4KKworRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGJlbG93LCBAY29kZXtielJlYWR9IHdpbGwgZGVjb21wcmVzcyB0aGUKK0Bjb2Rle25VbnVzZWR9IGJ5dGVzIHN0YXJ0aW5nIGF0IEBjb2Rle3VudXNlZH0sIGJlZm9yZSBzdGFydGluZyB0byByZWFkCitmcm9tIHRoZSBmaWxlIEBjb2Rle2Z9LiAgQXQgbW9zdCBAY29kZXtCWl9NQVhfVU5VU0VEfSBieXRlcyBtYXkgYmUKK3N1cHBsaWVkIGxpa2UgdGhpcy4gIElmIHRoaXMgZmFjaWxpdHkgaXMgbm90IHJlcXVpcmVkLCB5b3Ugc2hvdWxkIHBhc3MKK0Bjb2Rle05VTEx9IGFuZCBAY29kZXswfSBmb3IgQGNvZGV7dW51c2VkfSBhbmQgbkBjb2Rle1VudXNlZH0KK3Jlc3BlY3RpdmVseS4KKworRm9yIHRoZSBtZWFuaW5nIG9mIHBhcmFtZXRlcnMgQGNvZGV7c21hbGx9IGFuZCBAY29kZXt2ZXJib3NpdHl9LAorc2VlIEBjb2Rle2J6RGVjb21wcmVzc0luaXR9LgorCitUaGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gZGVjb21wcmVzcyBhIGZpbGUgY2Fubm90IGJlIGRldGVybWluZWQKK3VudGlsIHRoZSBmaWxlJ3MgaGVhZGVyIGhhcyBiZWVuIHJlYWQuICBTbyBpdCBpcyBwb3NzaWJsZSB0aGF0CitAY29kZXtielJlYWRPcGVufSByZXR1cm5zIEBjb2Rle0JaX09LfSBidXQgYSBzdWJzZXF1ZW50IGNhbGwgb2YKK0Bjb2Rle2J6UmVhZH0gd2lsbCByZXR1cm4gQGNvZGV7QlpfTUVNX0VSUk9SfS4KKworUG9zc2libGUgYXNzaWdubWVudHMgdG8gQGNvZGV7YnplcnJvcn06CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9CisgICAgICAgICBpZiBAY29kZXtmfSBpcyBAY29kZXtOVUxMfSAKKyAgICAgICAgIG9yIEBjb2Rle3NtYWxsfSBpcyBuZWl0aGVyIEBjb2RlezB9IG5vciBAY29kZXsxfSAgICAgICAgICAgICAgICAgCisgICAgICAgICBvciBAY29kZXsodW51c2VkID09IE5VTEwgJiYgblVudXNlZCAhPSAwKX0KKyAgICAgICAgIG9yIEBjb2Rleyh1bnVzZWQgIT0gTlVMTCAmJiAhKDAgPD0gblVudXNlZCA8PSBCWl9NQVhfVU5VU0VEKSl9CisgICAgICBAY29kZXtCWl9JT19FUlJPUn0gICAgCisgICAgICAgICBpZiBAY29kZXtmZXJyb3IoZil9IGlzIG5vbnplcm8KKyAgICAgIEBjb2Rle0JaX01FTV9FUlJPUn0gICAKKyAgICAgICAgIGlmIGluc3VmZmljaWVudCBtZW1vcnkgaXMgYXZhaWxhYmxlCisgICAgICBAY29kZXtCWl9PS30KKyAgICAgICAgIG90aGVyd2lzZS4KK0BlbmQgZGlzcGxheQorCitQb3NzaWJsZSByZXR1cm4gdmFsdWVzOgorQGRpc3BsYXkKKyAgICAgIFBvaW50ZXIgdG8gYW4gYWJzdHJhY3QgQGNvZGV7QlpGSUxFfSAgICAgICAgCisgICAgICAgICBpZiBAY29kZXtiemVycm9yfSBpcyBAY29kZXtCWl9PS30gICAKKyAgICAgIEBjb2Rle05VTEx9CisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIEBjb2Rle2J6UmVhZH0KKyAgICAgICAgIGlmIEBjb2Rle2J6ZXJyb3J9IGlzIEBjb2Rle0JaX09LfSAgIAorICAgICAgQGNvZGV7YnpDbG9zZX0gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCisKK0BzdWJzZWN0aW9uIEBjb2Rle2J6UmVhZH0KK0BleGFtcGxlCisgICBpbnQgYnpSZWFkICggaW50ICpiemVycm9yLCBCWkZJTEUgKmIsIHZvaWQgKmJ1ZiwgaW50IGxlbiApOworQGVuZCBleGFtcGxlCitSZWFkcyB1cCB0byBAY29kZXtsZW59ICh1bmNvbXByZXNzZWQpIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSAKK0Bjb2Rle2J9IGludG8KK3RoZSBidWZmZXIgQGNvZGV7YnVmfS4gIElmIHRoZSByZWFkIHdhcyBzdWNjZXNzZnVsLCAKK0Bjb2Rle2J6ZXJyb3J9IGlzIHNldCB0byBAY29kZXtCWl9PS30KK2FuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMgcmV0dXJuZWQuICBJZiB0aGUgbG9naWNhbCBlbmQtb2Ytc3RyZWFtCit3YXMgZGV0ZWN0ZWQsIEBjb2Rle2J6ZXJyb3J9IHdpbGwgYmUgc2V0IHRvIEBjb2Rle0JaX1NUUkVBTV9FTkR9LCAKK2FuZCB0aGUgbnVtYmVyCitvZiBieXRlcyByZWFkIGlzIHJldHVybmVkLiAgQWxsIG90aGVyIEBjb2Rle2J6ZXJyb3J9IHZhbHVlcyBkZW5vdGUgYW4gZXJyb3IuCisKK0Bjb2Rle2J6UmVhZH0gd2lsbCBzdXBwbHkgQGNvZGV7bGVufSBieXRlcywKK3VubGVzcyB0aGUgbG9naWNhbCBzdHJlYW0gZW5kIGlzIGRldGVjdGVkCitvciBhbiBlcnJvciBvY2N1cnMuICBCZWNhdXNlIG9mIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRvIGRldGVjdCB0aGUgCitzdHJlYW0gZW5kIGJ5IG9ic2VydmluZyB3aGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmV0dXJuZWQgaXMgCitsZXNzIHRoYW4gdGhlIG51bWJlcgorcmVxdWVzdGVkLiAgTmV2ZXJ0aGVsZXNzLCB0aGlzIGlzIHJlZ2FyZGVkIGFzIGluYWR2aXNhYmxlOyB5b3Ugc2hvdWxkCitpbnN0ZWFkIGNoZWNrIEBjb2Rle2J6ZXJyb3J9IGFmdGVyIGV2ZXJ5IGNhbGwgYW5kIHdhdGNoIG91dCBmb3IKK0Bjb2Rle0JaX1NUUkVBTV9FTkR9LgorCitJbnRlcm5hbGx5LCBAY29kZXtielJlYWR9IGNvcGllcyBkYXRhIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBjaHVua3MKK29mIHNpemUgQGNvZGV7QlpfTUFYX1VOVVNFRH0gYnl0ZXMKK2JlZm9yZSBkZWNvbXByZXNzaW5nIGl0LiAgSWYgdGhlIGZpbGUgY29udGFpbnMgbW9yZSBieXRlcyB0aGFuIHN0cmljdGx5CituZWVkZWQgdG8gcmVhY2ggdGhlIGxvZ2ljYWwgZW5kLW9mLXN0cmVhbSwgQGNvZGV7YnpSZWFkfSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkKK3JlYWQgc29tZSBvZiB0aGUgdHJhaWxpbmcgZGF0YSBiZWZvcmUgc2lnbmFsbGluZyBAY29kZXtCWl9TRVFVRU5DRV9FTkR9LgorVG8gY29sbGVjdCB0aGUgcmVhZCBidXQgdW51c2VkIGRhdGEgb25jZSBAY29kZXtCWl9TRVFVRU5DRV9FTkR9IGhhcyAKK2FwcGVhcmVkLCBjYWxsIEBjb2Rle2J6UmVhZEdldFVudXNlZH0gaW1tZWRpYXRlbHkgYmVmb3JlIEBjb2Rle2J6UmVhZENsb3NlfS4KKworUG9zc2libGUgYXNzaWdubWVudHMgdG8gQGNvZGV7YnplcnJvcn06CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9CisgICAgICAgICBpZiBAY29kZXtifSBpcyBAY29kZXtOVUxMfSBvciBAY29kZXtidWZ9IGlzIEBjb2Rle05VTEx9IG9yIEBjb2Rle2xlbiA8IDB9CisgICAgICBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtifSB3YXMgb3BlbmVkIHdpdGggQGNvZGV7YnpXcml0ZU9wZW59CisgICAgICBAY29kZXtCWl9JT19FUlJPUn0gCisgICAgICAgICBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZQorICAgICAgQGNvZGV7QlpfVU5FWFBFQ1RFRF9FT0Z9IAorICAgICAgICAgaWYgdGhlIGNvbXByZXNzZWQgZmlsZSBlbmRlZCBiZWZvcmUgdGhlIGxvZ2ljYWwgZW5kLW9mLXN0cmVhbSB3YXMgZGV0ZWN0ZWQKKyAgICAgIEBjb2Rle0JaX0RBVEFfRVJST1J9IAorICAgICAgICAgaWYgYSBkYXRhIGludGVncml0eSBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtCisgICAgICBAY29kZXtCWl9EQVRBX0VSUk9SX01BR0lDfQorICAgICAgICAgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSByZXF1aXNpdGUgaGVhZGVyIGJ5dGVzIChpZSwgaXMgbm90IAorICAgICAgICAgYSBAY29kZXtiemlwMn0gZGF0YSBmaWxlKS4gIFRoaXMgaXMgcmVhbGx5IGEgc3BlY2lhbCBjYXNlIG9mIEBjb2Rle0JaX0RBVEFfRVJST1J9LgorICAgICAgQGNvZGV7QlpfTUVNX0VSUk9SfSAKKyAgICAgICAgIGlmIGluc3VmZmljaWVudCBtZW1vcnkgd2FzIGF2YWlsYWJsZQorICAgICAgQGNvZGV7QlpfU1RSRUFNX0VORH0gCisgICAgICAgICBpZiB0aGUgbG9naWNhbCBlbmQgb2Ygc3RyZWFtIHdhcyBkZXRlY3RlZC4KKyAgICAgIEBjb2Rle0JaX09LfQorICAgICAgICAgb3RoZXJ3aXNlLgorQGVuZCBkaXNwbGF5CisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICAgICAgIGlmIEBjb2Rle2J6ZXJyb3J9IGlzIEBjb2Rle0JaX09LfSBvciBAY29kZXtCWl9TVFJFQU1fRU5EfQorICAgICAgdW5kZWZpbmVkCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIGNvbGxlY3QgZGF0YSBmcm9tIEBjb2Rle2J1Zn0sIHRoZW4gQGNvZGV7YnpSZWFkfSBvciBAY29kZXtielJlYWRDbG9zZX0KKyAgICAgICAgIGlmIEBjb2Rle2J6ZXJyb3J9IGlzIEBjb2Rle0JaX09LfSAKKyAgICAgIGNvbGxlY3QgZGF0YSBmcm9tIEBjb2Rle2J1Zn0sIHRoZW4gQGNvZGV7YnpSZWFkQ2xvc2V9IG9yIEBjb2Rle2J6UmVhZEdldFVudXNlZH0gCisgICAgICAgICBpZiBAY29kZXtiemVycm9yfSBpcyBAY29kZXtCWl9TRVFVRU5DRV9FTkR9ICAgCisgICAgICBAY29kZXtielJlYWRDbG9zZX0gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCisKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpSZWFkR2V0VW51c2VkfQorQGV4YW1wbGUKKyAgIHZvaWQgYnpSZWFkR2V0VW51c2VkICggaW50KiBiemVycm9yLCBCWkZJTEUgKmIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogdW51c2VkLCBpbnQqIG5VbnVzZWQgKTsKK0BlbmQgZXhhbXBsZQorUmV0dXJucyBkYXRhIHdoaWNoIHdhcyByZWFkIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSBidXQgd2FzIG5vdCBuZWVkZWQKK3RvIGdldCB0byB0aGUgbG9naWNhbCBlbmQtb2Ytc3RyZWFtLiAgQGNvZGV7KnVudXNlZH0gaXMgc2V0IHRvIHRoZSBhZGRyZXNzCitvZiB0aGUgZGF0YSwgYW5kIEBjb2RleypuVW51c2VkfSB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgQGNvZGV7Km5VbnVzZWR9IHdpbGwKK2JlIHNldCB0byBhIHZhbHVlIGJldHdlZW4gQGNvZGV7MH0gYW5kIEBjb2Rle0JaX01BWF9VTlVTRUR9IGluY2x1c2l2ZS4KKworVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBAY29kZXtielJlYWR9IGhhcyBzaWduYWxsZWQgCitAY29kZXtCWl9TVFJFQU1fRU5EfSBidXQgYmVmb3JlIEBjb2Rle2J6UmVhZENsb3NlfS4KKworUG9zc2libGUgYXNzaWdubWVudHMgdG8gQGNvZGV7YnplcnJvcn06CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9IAorICAgICAgICAgaWYgQGNvZGV7Yn0gaXMgQGNvZGV7TlVMTH0gCisgICAgICAgICBvciBAY29kZXt1bnVzZWR9IGlzIEBjb2Rle05VTEx9IG9yIEBjb2Rle25VbnVzZWR9IGlzIEBjb2Rle05VTEx9CisgICAgICBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtCWl9TVFJFQU1fRU5EfSBoYXMgbm90IGJlZW4gc2lnbmFsbGVkCisgICAgICAgICBvciBpZiBAY29kZXtifSB3YXMgb3BlbmVkIHdpdGggQGNvZGV7YnpXcml0ZU9wZW59CisgICAgIEBjb2Rle0JaX09LfQorICAgICAgICAgb3RoZXJ3aXNlCitAZW5kIGRpc3BsYXkKKworQWxsb3dhYmxlIG5leHQgYWN0aW9uczoKK0BkaXNwbGF5IAorICAgICAgQGNvZGV7YnpSZWFkQ2xvc2V9CitAZW5kIGRpc3BsYXkKKworCitAc3Vic2VjdGlvbiBAY29kZXtielJlYWRDbG9zZX0KK0BleGFtcGxlCisgICB2b2lkIGJ6UmVhZENsb3NlICggaW50ICpiemVycm9yLCBCWkZJTEUgKmIgKTsKK0BlbmQgZXhhbXBsZQorUmVsZWFzZXMgYWxsIG1lbW9yeSBwZXJ0YWluaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgQGNvZGV7Yn0uICAKK0Bjb2Rle2J6UmVhZENsb3NlfSBkb2VzIG5vdCBjYWxsIEBjb2Rle2ZjbG9zZX0gb24gdGhlIHVuZGVybHlpbmcgZmlsZQoraGFuZGxlLCBzbyB5b3Ugc2hvdWxkIGRvIHRoYXQgeW91cnNlbGYgaWYgYXBwcm9wcmlhdGUuCitAY29kZXtielJlYWRDbG9zZX0gc2hvdWxkIGJlIGNhbGxlZCB0byBjbGVhbiB1cCBhZnRlciBhbGwgZXJyb3IKK3NpdHVhdGlvbnMuCisKK1Bvc3NpYmxlIGFzc2lnbm1lbnRzIHRvIEBjb2Rle2J6ZXJyb3J9OgorQGRpc3BsYXkKKyAgICAgIEBjb2Rle0JaX1NFUVVFTkNFX0VSUk9SfSAKKyAgICAgICAgIGlmIEBjb2Rle2J9IHdhcyBvcGVuZWQgd2l0aCBAY29kZXtiek9wZW5Xcml0ZX0gCisgICAgICBAY29kZXtCWl9PS30gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIG5vbmUKK0BlbmQgZGlzcGxheQorCisKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpXcml0ZU9wZW59CitAZXhhbXBsZQorICAgQlpGSUxFICpieldyaXRlT3BlbiAoIGludCAqYnplcnJvciwgRklMRSAqZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrU2l6ZTEwMGssIGludCB2ZXJib3NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdvcmtGYWN0b3IgKTsKK0BlbmQgZXhhbXBsZQorUHJlcGFyZSB0byB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8gZmlsZSBoYW5kbGUgQGNvZGV7Zn0uICAKK0Bjb2Rle2Z9IHNob3VsZCByZWZlciB0bworYSBmaWxlIHdoaWNoIGhhcyBiZWVuIG9wZW5lZCBmb3Igd3JpdGluZywgYW5kIGZvciB3aGljaCB0aGUgZXJyb3IKK2luZGljYXRvciAoQGNvZGV7ZmVycm9yKGYpfSlpcyBub3Qgc2V0LiAgCisKK0ZvciB0aGUgbWVhbmluZyBvZiBwYXJhbWV0ZXJzIEBjb2Rle2Jsb2NrU2l6ZTEwMGt9LAorQGNvZGV7dmVyYm9zaXR5fSBhbmQgQGNvZGV7d29ya0ZhY3Rvcn0sIHNlZQorQCogQGNvZGV7YnpDb21wcmVzc0luaXR9LgorCitBbGwgcmVxdWlyZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCBhdCB0aGlzIHN0YWdlLCBzbyBpZiB0aGUgY2FsbAorY29tcGxldGVzIHN1Y2Nlc3NmdWxseSwgQGNvZGV7QlpfTUVNX0VSUk9SfSBjYW5ub3QgYmUgc2lnbmFsbGVkIGJ5IGEKK3N1YnNlcXVlbnQgY2FsbCB0byBAY29kZXtieldyaXRlfS4KKworUG9zc2libGUgYXNzaWdubWVudHMgdG8gQGNvZGV7YnplcnJvcn06CitAZGlzcGxheSAKKyAgICAgIEBjb2Rle0JaX1BBUkFNX0VSUk9SfSAKKyAgICAgICAgIGlmIEBjb2Rle2Z9IGlzIEBjb2Rle05VTEx9IAorICAgICAgICAgb3IgQGNvZGV7YmxvY2tTaXplMTAwayA8IDF9IG9yIEBjb2Rle2Jsb2NrU2l6ZTEwMGsgPiA5fQorICAgICAgQGNvZGV7QlpfSU9fRVJST1J9IAorICAgICAgICAgaWYgQGNvZGV7ZmVycm9yKGYpfSBpcyBub256ZXJvCisgICAgICBAY29kZXtCWl9NRU1fRVJST1J9IAorICAgICAgICAgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUKKyAgICAgIEBjb2Rle0JaX09LfSAKKyAgICAgICAgIG90aGVyd2lzZQorQGVuZCBkaXNwbGF5CisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgUG9pbnRlciB0byBhbiBhYnN0cmFjdCBAY29kZXtCWkZJTEV9ICAKKyAgICAgICAgIGlmIEBjb2Rle2J6ZXJyb3J9IGlzIEBjb2Rle0JaX09LfSAgIAorICAgICAgQGNvZGV7TlVMTH0gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCitBbGxvd2FibGUgbmV4dCBhY3Rpb25zOgorQGRpc3BsYXkKKyAgICAgIEBjb2Rle2J6V3JpdGV9IAorICAgICAgICAgaWYgQGNvZGV7YnplcnJvcn0gaXMgQGNvZGV7QlpfT0t9IAorICAgICAgICAgKHlvdSBjb3VsZCBnbyBkaXJlY3RseSB0byBAY29kZXtieldyaXRlQ2xvc2V9LCBidXQgdGhpcyB3b3VsZCBiZSBwcmV0dHkgcG9pbnRsZXNzKQorICAgICAgQGNvZGV7YnpXcml0ZUNsb3NlfSAKKyAgICAgICAgIG90aGVyd2lzZQorQGVuZCBkaXNwbGF5CisKKworCitAc3Vic2VjdGlvbiBAY29kZXtieldyaXRlfQorQGV4YW1wbGUKKyAgIHZvaWQgYnpXcml0ZSAoIGludCAqYnplcnJvciwgQlpGSUxFICpiLCB2b2lkICpidWYsIGludCBsZW4gKTsKK0BlbmQgZXhhbXBsZQorQWJzb3JicyBAY29kZXtsZW59IGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBAY29kZXtidWZ9LCBldmVudHVhbGx5IHRvIGJlCitjb21wcmVzc2VkIGFuZCB3cml0dGVuIHRvIHRoZSBmaWxlLgorCitQb3NzaWJsZSBhc3NpZ25tZW50cyB0byBAY29kZXtiemVycm9yfToKK0BkaXNwbGF5CisgICAgICBAY29kZXtCWl9QQVJBTV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtifSBpcyBAY29kZXtOVUxMfSBvciBAY29kZXtidWZ9IGlzIEBjb2Rle05VTEx9IG9yIEBjb2Rle2xlbiA8IDB9CisgICAgICBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gCisgICAgICAgICBpZiBiIHdhcyBvcGVuZWQgd2l0aCBAY29kZXtielJlYWRPcGVufQorICAgICAgQGNvZGV7QlpfSU9fRVJST1J9IAorICAgICAgICAgaWYgdGhlcmUgaXMgYW4gZXJyb3Igd3JpdGluZyB0aGUgY29tcHJlc3NlZCBmaWxlLgorICAgICAgQGNvZGV7QlpfT0t9IAorICAgICAgICAgb3RoZXJ3aXNlCitAZW5kIGRpc3BsYXkKKworCisKKworQHN1YnNlY3Rpb24gQGNvZGV7YnpXcml0ZUNsb3NlfQorQGV4YW1wbGUKKyAgIGludCBieldyaXRlQ2xvc2UgKCBpbnQgKmJ6ZXJyb3IsIEJaRklMRSogZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWJhbmRvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIG5ieXRlc19pbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIG5ieXRlc19vdXQgKTsKK0BlbmQgZXhhbXBsZQorCitDb21wcmVzc2VzIGFuZCBmbHVzaGVzIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUgYWxsIGRhdGEgc28gZmFyIHN1cHBsaWVkCitieSBAY29kZXtieldyaXRlfS4gIFRoZSBsb2dpY2FsIGVuZC1vZi1zdHJlYW0gbWFya2VycyBhcmUgYWxzbyB3cml0dGVuLCBzbworc3Vic2VxdWVudCBjYWxscyB0byBAY29kZXtieldyaXRlfSBhcmUgaWxsZWdhbC4gIEFsbCBtZW1vcnkgYXNzb2NpYXRlZCAKK3dpdGggdGhlIGNvbXByZXNzZWQgZmlsZSBAY29kZXtifSBpcyByZWxlYXNlZC4gIAorQGNvZGV7ZmZsdXNofSBpcyBjYWxsZWQgb24gdGhlCitjb21wcmVzc2VkIGZpbGUsIGJ1dCBpdCBpcyBub3QgQGNvZGV7ZmNsb3NlfSdkLgorCitJZiBAY29kZXtieldyaXRlQ2xvc2V9IGlzIGNhbGxlZCB0byBjbGVhbiB1cCBhZnRlciBhbiBlcnJvciwgdGhlIG9ubHkKK2FjdGlvbiBpcyB0byByZWxlYXNlIHRoZSBtZW1vcnkuICBUaGUgbGlicmFyeSByZWNvcmRzIHRoZSBlcnJvciBjb2RlcworaXNzdWVkIGJ5IHByZXZpb3VzIGNhbGxzLCBzbyB0aGlzIHNpdHVhdGlvbiB3aWxsIGJlIGRldGVjdGVkCithdXRvbWF0aWNhbGx5LiAgVGhlcmUgaXMgbm8gYXR0ZW1wdCB0byBjb21wbGV0ZSB0aGUgY29tcHJlc3Npb24KK29wZXJhdGlvbiwgbm9yIHRvIEBjb2Rle2ZmbHVzaH0gdGhlIGNvbXByZXNzZWQgZmlsZS4gIFlvdSBjYW4gZm9yY2UgdGhpcworYmVoYXZpb3VyIHRvIGhhcHBlbiBldmVuIGluIHRoZSBjYXNlIG9mIG5vIGVycm9yLCBieSBwYXNzaW5nIGEgbm9uemVybwordmFsdWUgdG8gQGNvZGV7YWJhbmRvbn0uCisKK0lmIEBjb2Rle25ieXRlc19pbn0gaXMgbm9uLW51bGwsIEBjb2RleypuYnl0ZXNfaW59IHdpbGwgYmUgc2V0IHRvIGJlIHRoZQordG90YWwgdm9sdW1lIG9mIHVuY29tcHJlc3NlZCBkYXRhIGhhbmRsZWQuICBTaW1pbGFybHksIEBjb2Rle25ieXRlc19vdXR9Cit3aWxsIGJlIHNldCB0byB0aGUgdG90YWwgdm9sdW1lIG9mIGNvbXByZXNzZWQgZGF0YSB3cml0dGVuLgorCitQb3NzaWJsZSBhc3NpZ25tZW50cyB0byBAY29kZXtiemVycm9yfToKK0BkaXNwbGF5CisgICAgICBAY29kZXtCWl9TRVFVRU5DRV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtifSB3YXMgb3BlbmVkIHdpdGggQGNvZGV7YnpSZWFkT3Blbn0KKyAgICAgIEBjb2Rle0JaX0lPX0VSUk9SfSAKKyAgICAgICAgIGlmIHRoZXJlIGlzIGFuIGVycm9yIHdyaXRpbmcgdGhlIGNvbXByZXNzZWQgZmlsZQorICAgICAgQGNvZGV7QlpfT0t9IAorICAgICAgICAgb3RoZXJ3aXNlCitAZW5kIGRpc3BsYXkKKworQHN1YnNlY3Rpb24gSGFuZGxpbmcgZW1iZWRkZWQgY29tcHJlc3NlZCBkYXRhIHN0cmVhbXMKKworVGhlIGhpZ2gtbGV2ZWwgbGlicmFyeSBmYWNpbGl0YXRlcyB1c2Ugb2YKK0Bjb2Rle2J6aXAyfSBkYXRhIHN0cmVhbXMgd2hpY2ggZm9ybSBzb21lIHBhcnQgb2YgYSBzdXJyb3VuZGluZywgbGFyZ2VyCitkYXRhIHN0cmVhbS4KK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtIEZvciB3cml0aW5nLCB0aGUgbGlicmFyeSB0YWtlcyBhbiBvcGVuIGZpbGUgaGFuZGxlLCB3cml0ZXMKK2NvbXByZXNzZWQgZGF0YSB0byBpdCwgQGNvZGV7ZmZsdXNofWVzIGl0IGJ1dCBkb2VzIG5vdCBAY29kZXtmY2xvc2V9IGl0LgorVGhlIGNhbGxpbmcgYXBwbGljYXRpb24gY2FuIHdyaXRlIGl0cyBvd24gZGF0YSBiZWZvcmUgYW5kIGFmdGVyIHRoZQorY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgdXNpbmcgdGhhdCBzYW1lIGZpbGUgaGFuZGxlLgorQGl0ZW0gUmVhZGluZyBpcyBtb3JlIGNvbXBsZXgsIGFuZCB0aGUgZmFjaWxpdGllcyBhcmUgbm90IGFzIGdlbmVyYWwKK2FzIHRoZXkgY291bGQgYmUgc2luY2UgZ2VuZXJhbGl0eSBpcyBoYXJkIHRvIHJlY29uY2lsZSB3aXRoIGVmZmljaWVuY3kuCitAY29kZXtielJlYWR9IHJlYWRzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSBpbiBibG9ja3Mgb2Ygc2l6ZQorQGNvZGV7QlpfTUFYX1VOVVNFRH0gYnl0ZXMsIGFuZCBpbiBkb2luZyBzbyBwcm9iYWJseSB3aWxsIG92ZXJzaG9vdAordGhlIGxvZ2ljYWwgZW5kIG9mIGNvbXByZXNzZWQgc3RyZWFtLgorVG8gcmVjb3ZlciB0aGlzIGRhdGEgb25jZSBkZWNvbXByZXNzaW9uIGhhcworZW5kZWQsIGNhbGwgQGNvZGV7YnpSZWFkR2V0VW51c2VkfSBhZnRlciB0aGUgbGFzdCBjYWxsIG9mIEBjb2Rle2J6UmVhZH0KKyh0aGUgb25lIHJldHVybmluZyBAY29kZXtCWl9TVFJFQU1fRU5EfSkgYnV0IGJlZm9yZSBjYWxsaW5nCitAY29kZXtielJlYWRDbG9zZX0uCitAZW5kIGl0ZW1pemUKKworVGhpcyBtZWNoYW5pc20gbWFrZXMgaXQgZWFzeSB0byBkZWNvbXByZXNzIG11bHRpcGxlIEBjb2Rle2J6aXAyfQorc3RyZWFtcyBwbGFjZWQgZW5kLXRvLWVuZC4gIEFzIHRoZSBlbmQgb2Ygb25lIHN0cmVhbSwgd2hlbiBAY29kZXtielJlYWR9CityZXR1cm5zIEBjb2Rle0JaX1NUUkVBTV9FTkR9LCBjYWxsIEBjb2Rle2J6UmVhZEdldFVudXNlZH0gdG8gY29sbGVjdCB0aGUKK3VudXNlZCBkYXRhIChjb3B5IGl0IGludG8geW91ciBvd24gYnVmZmVyIHNvbWV3aGVyZSkuICAKK1RoYXQgZGF0YSBmb3JtcyB0aGUgc3RhcnQgb2YgdGhlIG5leHQgY29tcHJlc3NlZCBzdHJlYW0uCitUbyBzdGFydCB1bmNvbXByZXNzaW5nIHRoYXQgbmV4dCBzdHJlYW0sIGNhbGwgQGNvZGV7YnpSZWFkT3Blbn0gYWdhaW4sCitmZWVkaW5nIGluIHRoZSB1bnVzZWQgZGF0YSB2aWEgdGhlIEBjb2Rle3VudXNlZH0vQGNvZGV7blVudXNlZH0KK3BhcmFtZXRlcnMuCitLZWVwIGRvaW5nIHRoaXMgdW50aWwgQGNvZGV7QlpfU1RSRUFNX0VORH0gcmV0dXJuIGNvaW5jaWRlcyB3aXRoIHRoZQorcGh5c2ljYWwgZW5kIG9mIGZpbGUgKEBjb2Rle2Zlb2YoZil9KS4gIEluIHRoaXMgc2l0dWF0aW9uCitAY29kZXtielJlYWRHZXRVbnVzZWR9Cit3aWxsIG9mIGNvdXJzZSByZXR1cm4gbm8gZGF0YS4KKworVGhpcyBzaG91bGQgZ2l2ZSBzb21lIGZlZWwgZm9yIGhvdyB0aGUgaGlnaC1sZXZlbCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQuCitJZiB5b3UgcmVxdWlyZSBleHRyYSBmbGV4aWJpbGl0eSwgeW91J2xsIGhhdmUgdG8gYml0ZSB0aGUgYnVsbGV0IGFuZCBnZXQKK3RvIGdyaXBzIHdpdGggdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2UuCisKK0BzdWJzZWN0aW9uIFN0YW5kYXJkIGZpbGUtcmVhZGluZy93cml0aW5nIGNvZGUKK0hlcmUncyBob3cgeW91J2Qgd3JpdGUgZGF0YSB0byBhIGNvbXByZXNzZWQgZmlsZToKK0BleGFtcGxlIEBjb2RlCitGSUxFKiAgIGY7CitCWkZJTEUqIGI7CitpbnQgICAgIG5CdWY7CitjaGFyICAgIGJ1ZlsgLyogd2hhdGV2ZXIgc2l6ZSB5b3UgbGlrZSAqLyBdOworaW50ICAgICBiemVycm9yOworaW50ICAgICBuV3JpdHRlbjsKKworZiA9IGZvcGVuICggIm15ZmlsZS5iejIiLCAidyIgKTsKK2lmICghZikgQHsKKyAgIC8qIGhhbmRsZSBlcnJvciAqLworQH0KK2IgPSBieldyaXRlT3BlbiAoICZiemVycm9yLCBmLCA5ICk7CitpZiAoYnplcnJvciAhPSBCWl9PSykgQHsKKyAgIGJ6V3JpdGVDbG9zZSAoIGIgKTsKKyAgIC8qIGhhbmRsZSBlcnJvciAqLworQH0KKword2hpbGUgKCAvKiBjb25kaXRpb24gKi8gKSBAeworICAgLyogZ2V0IGRhdGEgdG8gd3JpdGUgaW50byBidWYsIGFuZCBzZXQgbkJ1ZiBhcHByb3ByaWF0ZWx5ICovCisgICBuV3JpdHRlbiA9IGJ6V3JpdGUgKCAmYnplcnJvciwgYiwgYnVmLCBuQnVmICk7CisgICBpZiAoYnplcnJvciA9PSBCWl9JT19FUlJPUikgQHsgCisgICAgICBieldyaXRlQ2xvc2UgKCAmYnplcnJvciwgYiApOworICAgICAgLyogaGFuZGxlIGVycm9yICovCisgICBAfQorQH0KKworYnpXcml0ZUNsb3NlICggJmJ6ZXJyb3IsIGIgKTsKK2lmIChiemVycm9yID09IEJaX0lPX0VSUk9SKSBAeworICAgLyogaGFuZGxlIGVycm9yICovCitAfQorQGVuZCBleGFtcGxlCitBbmQgdG8gcmVhZCBmcm9tIGEgY29tcHJlc3NlZCBmaWxlOgorQGV4YW1wbGUKK0ZJTEUqICAgZjsKK0JaRklMRSogYjsKK2ludCAgICAgbkJ1ZjsKK2NoYXIgICAgYnVmWyAvKiB3aGF0ZXZlciBzaXplIHlvdSBsaWtlICovIF07CitpbnQgICAgIGJ6ZXJyb3I7CitpbnQgICAgIG5Xcml0dGVuOworCitmID0gZm9wZW4gKCAibXlmaWxlLmJ6MiIsICJyIiApOworaWYgKCFmKSBAeworICAgLyogaGFuZGxlIGVycm9yICovCitAfQorYiA9IGJ6UmVhZE9wZW4gKCAmYnplcnJvciwgZiwgMCwgTlVMTCwgMCApOworaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIEB7CisgICBielJlYWRDbG9zZSAoICZiemVycm9yLCBiICk7CisgICAvKiBoYW5kbGUgZXJyb3IgKi8KK0B9CisKK2J6ZXJyb3IgPSBCWl9PSzsKK3doaWxlIChiemVycm9yID09IEJaX09LICYmIC8qIGFyYml0cmFyeSBvdGhlciBjb25kaXRpb25zICovKSBAeworICAgbkJ1ZiA9IGJ6UmVhZCAoICZiemVycm9yLCBiLCBidWYsIC8qIHNpemUgb2YgYnVmICovICk7CisgICBpZiAoYnplcnJvciA9PSBCWl9PSykgQHsKKyAgICAgIC8qIGRvIHNvbWV0aGluZyB3aXRoIGJ1ZlswIC4uIG5CdWYtMV0gKi8KKyAgIEB9CitAfQoraWYgKGJ6ZXJyb3IgIT0gQlpfU1RSRUFNX0VORCkgQHsKKyAgIGJ6UmVhZENsb3NlICggJmJ6ZXJyb3IsIGIgKTsKKyAgIC8qIGhhbmRsZSBlcnJvciAqLworQH0gZWxzZSBAeworICAgYnpSZWFkQ2xvc2UgKCAmYnplcnJvciApOworQH0KK0BlbmQgZXhhbXBsZQorCisKKworQHNlY3Rpb24gVXRpbGl0eSBmdW5jdGlvbnMKK0BzdWJzZWN0aW9uIEBjb2Rle2J6QnVmZlRvQnVmZkNvbXByZXNzfQorQGV4YW1wbGUKKyAgIGludCBiekJ1ZmZUb0J1ZmZDb21wcmVzcyggY2hhciogICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGRlc3RMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgIHNvdXJjZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBibG9ja1NpemUxMDBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICB3b3JrRmFjdG9yICk7CitAZW5kIGV4YW1wbGUKK0F0dGVtcHRzIHRvIGNvbXByZXNzIHRoZSBkYXRhIGluIEBjb2Rle3NvdXJjZVswIC4uIHNvdXJjZUxlbi0xXX0KK2ludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgQGNvZGV7ZGVzdFswIC4uICpkZXN0TGVuLTFdfS4KK0lmIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgYmlnIGVub3VnaCwgQGNvZGV7KmRlc3RMZW59IGlzCitzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgYW5kIEBjb2Rle0JaX09LfSBpcworcmV0dXJuZWQuICBJZiB0aGUgY29tcHJlc3NlZCBkYXRhIHdvbid0IGZpdCwgQGNvZGV7KmRlc3RMZW59CitpcyB1bmNoYW5nZWQsIGFuZCBAY29kZXtCWl9PVVRCVUZGX0ZVTEx9IGlzIHJldHVybmVkLgorCitDb21wcmVzc2lvbiBpbiB0aGlzIG1hbm5lciBpcyBhIG9uZS1zaG90IGV2ZW50LCBkb25lIHdpdGggYSBzaW5nbGUgY2FsbAordG8gdGhpcyBmdW5jdGlvbi4gIFRoZSByZXN1bHRpbmcgY29tcHJlc3NlZCBkYXRhIGlzIGEgY29tcGxldGUKK0Bjb2Rle2J6aXAyfSBmb3JtYXQgZGF0YSBzdHJlYW0uICBUaGVyZSBpcyBubyBtZWNoYW5pc20gZm9yIG1ha2luZworYWRkaXRpb25hbCBjYWxscyB0byBwcm92aWRlIGV4dHJhIGlucHV0IGRhdGEuICBJZiB5b3Ugd2FudCB0aGF0IGtpbmQgb2YKK21lY2hhbmlzbSwgdXNlIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlLgorCitGb3IgdGhlIG1lYW5pbmcgb2YgcGFyYW1ldGVycyBAY29kZXtibG9ja1NpemUxMDBrfSwgQGNvZGV7dmVyYm9zaXR5fQorYW5kIEBjb2Rle3dvcmtGYWN0b3J9LCBAKiBzZWUgQGNvZGV7YnpDb21wcmVzc0luaXR9LgorCitUbyBndWFyYW50ZWUgdGhhdCB0aGUgY29tcHJlc3NlZCBkYXRhIHdpbGwgZml0IGluIGl0cyBidWZmZXIsIGFsbG9jYXRlCithbiBvdXRwdXQgYnVmZmVyIG9mIHNpemUgMSUgbGFyZ2VyIHRoYW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhLCBwbHVzCitzaXggaHVuZHJlZCBleHRyYSBieXRlcy4KKworQGNvZGV7YnpCdWZmVG9CdWZmRGVjb21wcmVzc30gd2lsbCBub3Qgd3JpdGUgZGF0YSBhdCBvcgorYmV5b25kIEBjb2Rle2Rlc3RbKmRlc3RMZW5dfSwgZXZlbiBpbiBjYXNlIG9mIGJ1ZmZlciBvdmVyZmxvdy4KKworUG9zc2libGUgcmV0dXJuIHZhbHVlczoKK0BkaXNwbGF5CisgICAgICBAY29kZXtCWl9QQVJBTV9FUlJPUn0gCisgICAgICAgICBpZiBAY29kZXtkZXN0fSBpcyBAY29kZXtOVUxMfSBvciBAY29kZXtkZXN0TGVufSBpcyBAY29kZXtOVUxMfQorICAgICAgICAgb3IgQGNvZGV7YmxvY2tTaXplMTAwayA8IDF9IG9yIEBjb2Rle2Jsb2NrU2l6ZTEwMGsgPiA5fQorICAgICAgICAgb3IgQGNvZGV7dmVyYm9zaXR5IDwgMH0gb3IgQGNvZGV7dmVyYm9zaXR5ID4gNH0gCisgICAgICAgICBvciBAY29kZXt3b3JrRmFjdG9yIDwgMH0gb3IgQGNvZGV7d29ya0ZhY3RvciA+IDI1MH0KKyAgICAgIEBjb2Rle0JaX01FTV9FUlJPUn0KKyAgICAgICAgIGlmIGluc3VmZmljaWVudCBtZW1vcnkgaXMgYXZhaWxhYmxlIAorICAgICAgQGNvZGV7QlpfT1VUQlVGRl9GVUxMfQorICAgICAgICAgaWYgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBleGNlZWRzIEBjb2RleypkZXN0TGVufQorICAgICAgQGNvZGV7QlpfT0t9IAorICAgICAgICAgb3RoZXJ3aXNlCitAZW5kIGRpc3BsYXkKKworCisKK0BzdWJzZWN0aW9uIEBjb2Rle2J6QnVmZlRvQnVmZkRlY29tcHJlc3N9CitAZXhhbXBsZQorICAgaW50IGJ6QnVmZlRvQnVmZkRlY29tcHJlc3MgKCBjaGFyKiAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogZGVzdExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgc291cmNlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHZlcmJvc2l0eSApOworQGVuZCBleGFtcGxlCitBdHRlbXB0cyB0byBkZWNvbXByZXNzIHRoZSBkYXRhIGluIEBjb2Rle3NvdXJjZVswIC4uIHNvdXJjZUxlbi0xXX0KK2ludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgQGNvZGV7ZGVzdFswIC4uICpkZXN0TGVuLTFdfS4KK0lmIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgYmlnIGVub3VnaCwgQGNvZGV7KmRlc3RMZW59IGlzCitzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLCBhbmQgQGNvZGV7QlpfT0t9IGlzCityZXR1cm5lZC4gIElmIHRoZSBjb21wcmVzc2VkIGRhdGEgd29uJ3QgZml0LCBAY29kZXsqZGVzdExlbn0KK2lzIHVuY2hhbmdlZCwgYW5kIEBjb2Rle0JaX09VVEJVRkZfRlVMTH0gaXMgcmV0dXJuZWQuCisKK0Bjb2Rle3NvdXJjZX0gaXMgYXNzdW1lZCB0byBob2xkIGEgY29tcGxldGUgQGNvZGV7YnppcDJ9IGZvcm1hdAorZGF0YSBzdHJlYW0uICBAY29kZXtiekJ1ZmZUb0J1ZmZEZWNvbXByZXNzfSB0cmllcyB0byBkZWNvbXByZXNzCit0aGUgZW50aXJldHkgb2YgdGhlIHN0cmVhbSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgorCitGb3IgdGhlIG1lYW5pbmcgb2YgcGFyYW1ldGVycyBAY29kZXtzbWFsbH0gYW5kIEBjb2Rle3ZlcmJvc2l0eX0sCitzZWUgQGNvZGV7YnpEZWNvbXByZXNzSW5pdH0uCisKK0JlY2F1c2UgdGhlIGNvbXByZXNzaW9uIHJhdGlvIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgY2Fubm90IGJlIGtub3duIGluCithZHZhbmNlLCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBndWFyYW50ZWUgdGhhdCB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsCitiZSBiaWcgZW5vdWdoLiAgWW91IG1heSBvZiBjb3Vyc2UgbWFrZSBhcnJhbmdlbWVudHMgaW4geW91ciBjb2RlIHRvCityZWNvcmQgdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhLCBidXQgc3VjaCBhIG1lY2hhbmlzbSBpcyBiZXlvbmQKK3RoZSBzY29wZSBvZiB0aGlzIGxpYnJhcnkuCisKK0Bjb2Rle2J6QnVmZlRvQnVmZkRlY29tcHJlc3N9IHdpbGwgbm90IHdyaXRlIGRhdGEgYXQgb3IKK2JleW9uZCBAY29kZXtkZXN0WypkZXN0TGVuXX0sIGV2ZW4gaW4gY2FzZSBvZiBidWZmZXIgb3ZlcmZsb3cuCisKK1Bvc3NpYmxlIHJldHVybiB2YWx1ZXM6CitAZGlzcGxheQorICAgICAgQGNvZGV7QlpfUEFSQU1fRVJST1J9IAorICAgICAgICAgaWYgQGNvZGV7ZGVzdH0gaXMgQGNvZGV7TlVMTH0gb3IgQGNvZGV7ZGVzdExlbn0gaXMgQGNvZGV7TlVMTH0KKyAgICAgICAgIG9yIEBjb2Rle3NtYWxsICE9IDAgJiYgc21hbGwgIT0gMX0KKyAgICAgICAgIG9yIEBjb2Rle3ZlcmJvc2l0eSA8IDB9IG9yIEBjb2Rle3ZlcmJvc2l0eSA+IDR9IAorICAgICAgQGNvZGV7QlpfTUVNX0VSUk9SfQorICAgICAgICAgaWYgaW5zdWZmaWNpZW50IG1lbW9yeSBpcyBhdmFpbGFibGUgCisgICAgICBAY29kZXtCWl9PVVRCVUZGX0ZVTEx9CisgICAgICAgICBpZiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGV4Y2VlZHMgQGNvZGV7KmRlc3RMZW59CisgICAgICBAY29kZXtCWl9EQVRBX0VSUk9SfQorICAgICAgICAgaWYgYSBkYXRhIGludGVncml0eSBlcnJvciB3YXMgZGV0ZWN0ZWQgaW4gdGhlIGNvbXByZXNzZWQgZGF0YQorICAgICAgQGNvZGV7QlpfREFUQV9FUlJPUl9NQUdJQ30KKyAgICAgICAgIGlmIHRoZSBjb21wcmVzc2VkIGRhdGEgZG9lc24ndCBiZWdpbiB3aXRoIHRoZSByaWdodCBtYWdpYyBieXRlcworICAgICAgQGNvZGV7QlpfVU5FWFBFQ1RFRF9FT0Z9CisgICAgICAgICBpZiB0aGUgY29tcHJlc3NlZCBkYXRhIGVuZHMgdW5leHBlY3RlZGx5CisgICAgICBAY29kZXtCWl9PS30gCisgICAgICAgICBvdGhlcndpc2UKK0BlbmQgZGlzcGxheQorCisKKworQHNlY3Rpb24gVXNpbmcgdGhlIGxpYnJhcnkgaW4gYSBAY29kZXtzdGRpb30tZnJlZSBlbnZpcm9ubWVudAorCitAc3Vic2VjdGlvbiBHZXR0aW5nIHJpZCBvZiBAY29kZXtzdGRpb30KKworSW4gYSBkZWVwbHkgZW1iZWRkZWQgYXBwbGljYXRpb24sIHlvdSBtaWdodCB3YW50IHRvIHVzZSBqdXN0Cit0aGUgbWVtb3J5LXRvLW1lbW9yeSBmdW5jdGlvbnMuICBZb3UgY2FuIGRvIHRoaXMgY29udmVuaWVudGx5CitieSBjb21waWxpbmcgdGhlIGxpYnJhcnkgd2l0aCBwcmVwcm9jZXNzb3Igc3ltYm9sIEBjb2Rle0JaX05PX1NURElPfQorZGVmaW5lZC4gIERvaW5nIHRoaXMgZ2l2ZXMgeW91IGEgbGlicmFyeSBjb250YWluaW5nIG9ubHkgdGhlIGZvbGxvd2luZworZWlnaHQgZnVuY3Rpb25zOgorCitAY29kZXtiekNvbXByZXNzSW5pdH0sIEBjb2Rle2J6Q29tcHJlc3N9LCBAY29kZXtiekNvbXByZXNzRW5kfSBAKgorQGNvZGV7YnpEZWNvbXByZXNzSW5pdH0sIEBjb2Rle2J6RGVjb21wcmVzc30sIEBjb2Rle2J6RGVjb21wcmVzc0VuZH0gQCoKK0Bjb2Rle2J6QnVmZlRvQnVmZkNvbXByZXNzfSwgQGNvZGV7YnpCdWZmVG9CdWZmRGVjb21wcmVzc30KKworV2hlbiBjb21waWxlZCBsaWtlIHRoaXMsIGFsbCBmdW5jdGlvbnMgd2lsbCBpZ25vcmUgQGNvZGV7dmVyYm9zaXR5fQorc2V0dGluZ3MuCisKK0BzdWJzZWN0aW9uIENyaXRpY2FsIGVycm9yIGhhbmRsaW5nCitAY29kZXtsaWJiemlwMn0gY29udGFpbnMgYSBudW1iZXIgb2YgaW50ZXJuYWwgYXNzZXJ0aW9uIGNoZWNrcyB3aGljaAorc2hvdWxkLCBuZWVkbGVzcyB0byBzYXksIG5ldmVyIGJlIGFjdGl2YXRlZC4gIE5ldmVydGhlbGVzcywgaWYgYW4KK2Fzc2VydGlvbiBzaG91bGQgZmFpbCwgYmVoYXZpb3VyIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgdGhlIGxpYnJhcnkKK3dhcyBjb21waWxlZCB3aXRoIEBjb2Rle0JaX05PX1NURElPfSBzZXQuCisKK0ZvciBhIG5vcm1hbCBjb21waWxlLCBhbiBhc3NlcnRpb24gZmFpbHVyZSB5aWVsZHMgdGhlIG1lc3NhZ2UKK0BleGFtcGxlCisgICBiemlwMi9saWJiemlwMiwgdjAuOS4wOiBpbnRlcm5hbCBlcnJvciBudW1iZXIgTi4KKyAgIFRoaXMgaXMgYSBidWcgaW4gYnppcDIvbGliYnppcDIsIHYwLjkuMC4gIFBsZWFzZSByZXBvcnQKKyAgIGl0IHRvIG1lIGF0OiBqc2V3YXJkQEBhY20ub3JnLiAgSWYgdGhpcyBoYXBwZW5lZCB3aGVuCisgICB5b3Ugd2VyZSB1c2luZyBzb21lIHByb2dyYW0gd2hpY2ggdXNlcyBsaWJiemlwMiBhcyBhCisgICBjb21wb25lbnQsIHlvdSBzaG91bGQgYWxzbyByZXBvcnQgdGhpcyBidWcgdG8gdGhlIGF1dGhvcihzKQorICAgb2YgdGhhdCBwcm9ncmFtLiAgUGxlYXNlIG1ha2UgYW4gZWZmb3J0IHRvIHJlcG9ydCB0aGlzIGJ1ZzsKKyAgIHRpbWVseSBhbmQgYWNjdXJhdGUgYnVnIHJlcG9ydHMgZXZlbnR1YWxseSBsZWFkIHRvIGhpZ2hlcgorICAgcXVhbGl0eSBzb2Z0d2FyZS4gIFRoeC4gIEp1bGlhbiBTZXdhcmQsIDI3IEp1bmUgMTk5OC4KK0BlbmQgZXhhbXBsZQord2hlcmUgQGNvZGV7Tn0gaXMgc29tZSBlcnJvciBjb2RlIG51bWJlci4gIEBjb2Rle2V4aXQoMyl9CitpcyB0aGVuIGNhbGxlZC4KKworRm9yIGEgQGNvZGV7c3RkaW99LWZyZWUgbGlicmFyeSwgYXNzZXJ0aW9uIGZhaWx1cmVzIHJlc3VsdAoraW4gYSBjYWxsIHRvIGEgZnVuY3Rpb24gZGVjbGFyZWQgYXM6CitAZXhhbXBsZQorICAgZXh0ZXJuIHZvaWQgYnpfaW50ZXJuYWxfZXJyb3IgKCBpbnQgZXJyY29kZSApOworQGVuZCBleGFtcGxlCitUaGUgcmVsZXZhbnQgY29kZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuICBZb3Ugc2hvdWxkIHN1cHBseQorc3VjaCBhIGZ1bmN0aW9uLgorCitJbiBlaXRoZXIgY2FzZSwgb25jZSBhbiBhc3NlcnRpb24gZmFpbHVyZSBoYXMgb2NjdXJyZWQsIGFueSAKK0Bjb2Rle2J6X3N0cmVhbX0gcmVjb3JkcyBpbnZvbHZlZCBjYW4gYmUgcmVnYXJkZWQgYXMgaW52YWxpZC4KK1lvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVzdW1lIG5vcm1hbCBvcGVyYXRpb24gd2l0aCB0aGVtLgorCitZb3UgbWF5LCBvZiBjb3Vyc2UsIGNoYW5nZSBjcml0aWNhbCBlcnJvciBoYW5kbGluZyB0byBzdWl0Cit5b3VyIG5lZWRzLiAgQXMgSSBzYWlkIGFib3ZlLCBjcml0aWNhbCBlcnJvcnMgaW5kaWNhdGUgYnVncworaW4gdGhlIGxpYnJhcnkgYW5kIHNob3VsZCBub3Qgb2NjdXIuICBBbGwgIm5vcm1hbCIgZXJyb3IKK3NpdHVhdGlvbnMgYXJlIGluZGljYXRlZCB2aWEgZXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZnVuY3Rpb25zLAorYW5kIGNhbiBiZSByZWNvdmVyZWQgZnJvbS4KKworCitAc2VjdGlvbiBNYWtpbmcgYSBXaW5kb3dzIERMTAorRXZlcnl0aGluZyByZWxhdGVkIHRvIFdpbmRvd3MgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgWW9zaGlva2EgVHN1bmVvCitAKiAoQGNvZGV7UVdGMDAxMzNAQG5pZnR5c2VydmUub3IuanB9IC8KK0Bjb2Rle3RzdW5lby15QEBpcy5haXN0LW5hcmEuYWMuanB9KSwgc28geW91IHNob3VsZCBzZW5kIHlvdXIgcXVlcmllcyB0bworaGltIChidXQgcGVyaGFwcyBDYzogbWUsIEBjb2Rle2pzZXdhcmRAQGFjbS5vcmd9KS4KKworTXkgdmFndWUgdW5kZXJzdGFuZGluZyBvZiB3aGF0IHRvIGRvIGlzOiB1c2luZyBWaXN1YWwgQysrIDUuMCwKK29wZW4gdGhlIHByb2plY3QgZmlsZSBAY29kZXtsaWJiejIuZHNwfSwgYW5kIGJ1aWxkLiAgVGhhdCdzIGFsbC4KKworSWYgeW91IGNhbid0CitvcGVuIHRoZSBwcm9qZWN0IGZpbGUgZm9yIHNvbWUgcmVhc29uLCBtYWtlIGEgbmV3IG9uZSwgbmFtaW5nIHRoZXNlIGZpbGVzOgorQGNvZGV7YmxvY2tzb3J0LmN9LCBAY29kZXtiemxpYi5jfSwgQGNvZGV7Y29tcHJlc3MuY30sIAorQGNvZGV7Y3JjdGFibGUuY30sIEBjb2Rle2RlY29tcHJlc3MuY30sIEBjb2Rle2h1ZmZtYW4uY30sIEAqCitAY29kZXtyYW5kdGFibGUuY30gYW5kIEBjb2Rle2xpYmJ6Mi5kZWZ9LiAgWW91IG1pZ2h0IGFsc28gbmVlZAordG8gbmFtZSB0aGUgaGVhZGVyIGZpbGVzIEBjb2Rle2J6bGliLmh9IGFuZCBAY29kZXtiemxpYl9wcml2YXRlLmh9LgorCitJZiB5b3UgZG9uJ3QgdXNlIFZDKyssIHlvdSBtYXkgbmVlZCB0byBkZWZpbmUgdGhlIHByb3Byb2Nlc3NvciBzeW1ib2wKK0Bjb2Rle19XSU4zMn0uIAorCitGaW5hbGx5LCBAY29kZXtkbGx0ZXN0LmN9IGlzIGEgc2FtcGxlIHByb2dyYW0gdXNpbmcgdGhlIERMTC4gIEl0IGhhcyBhCitwcm9qZWN0IGZpbGUsIEBjb2Rle2RsbHRlc3QuZHNwfS4KKworSSBoYXZlbid0IHRyaWVkIGFueSBvZiB0aGlzIHN0dWZmIG15c2VsZiwgYnV0IGl0IGFsbCBsb29rcyBwbGF1c2libGUuCisKKworCitAY2hhcHRlciBNaXNjZWxsYW5lYQorCitUaGVzZSBhcmUganVzdCBzb21lIHJhbmRvbSB0aG91Z2h0cyBvZiBtaW5lLiAgWW91ciBtaWxlYWdlIG1heQordmFyeS4KKworQHNlY3Rpb24gTGltaXRhdGlvbnMgb2YgdGhlIGNvbXByZXNzZWQgZmlsZSBmb3JtYXQKK0Bjb2Rle2J6aXAyLTAuOS4wfSB1c2VzIGV4YWN0bHkgdGhlIHNhbWUgZmlsZSBmb3JtYXQgYXMgdGhlIHByZXZpb3VzCit2ZXJzaW9uLCBAY29kZXtiemlwMi0wLjF9LiAgVGhpcyBkZWNpc2lvbiB3YXMgbWFkZSBpbiB0aGUgaW50ZXJlc3RzIG9mCitzdGFiaWxpdHkuICBDcmVhdGluZyB5ZXQgYW5vdGhlciBpbmNvbXBhdGlibGUgY29tcHJlc3NlZCBmaWxlIGZvcm1hdAord291bGQgY3JlYXRlIGZ1cnRoZXIgY29uZnVzaW9uIGFuZCBkaXNydXB0aW9uIGZvciB1c2Vycy4KKworTmV2ZXJ0aGVsZXNzLCB0aGlzIGlzIG5vdCBhIHBhaW5sZXNzIGRlY2lzaW9uLiAgRGV2ZWxvcG1lbnQKK3dvcmsgc2luY2UgdGhlIHJlbGVhc2Ugb2YgQGNvZGV7YnppcDItMC4xfSBpbiBBdWd1c3QgMTk5NworaGFzIHNob3duIGNvbXBsZXhpdGllcyBpbiB0aGUgZmlsZSBmb3JtYXQgd2hpY2ggc2xvdyBkb3duCitkZWNvbXByZXNzaW9uIGFuZCwgaW4gcmV0cm9zcGVjdCwgYXJlIHVubmVjZXNzYXJ5LiAgVGhlc2UgYXJlOgorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gVGhlIHJ1bi1sZW5ndGggZW5jb2Rlciwgd2hpY2ggaXMgdGhlIGZpcnN0IG9mIHRoZSAKKyAgICAgIGNvbXByZXNzaW9uIHRyYW5zZm9ybWF0aW9ucywgaXMgZW50aXJlbHkgaXJyZWxldmFudC4KKyAgICAgIFRoZSBvcmlnaW5hbCBwdXJwb3NlIHdhcyB0byBwcm90ZWN0IHRoZSBzb3J0aW5nIGFsZ29yaXRobQorICAgICAgZnJvbSB0aGUgdmVyeSB3b3JzdCBjYXNlIGlucHV0OiBhIHN0cmluZyBvZiByZXBlYXRlZAorICAgICAgc3ltYm9scy4gIEJ1dCBhbGdvcml0aG0gc3RlcHMgUTZhIGFuZCBRNmIgaW4gdGhlIG9yaWdpbmFsCisgICAgICBCdXJyb3dzLVdoZWVsZXIgdGVjaG5pY2FsIHJlcG9ydCAoU1JDLTEyNCkgc2hvdyBob3cKKyAgICAgIHJlcGVhdHMgY2FuIGJlIGhhbmRsZWQgd2l0aG91dCBkaWZmaWN1bHR5IGluIGJsb2NrCisgICAgICBzb3J0aW5nLgorQGl0ZW0gVGhlIHJhbmRvbWlzYXRpb24gbWVjaGFuaXNtIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8gYmUKKyAgICAgIHRoZXJlLiAgVWRpIE1hbmJlciBhbmQgR2VuZSBNeWVycyBwdWJsaXNoZWQgYSBzdWZmaXgKKyAgICAgIGFycmF5IGNvbnN0cnVjdGlvbiBhbGdvcml0aG0gYSBmZXcgeWVhcnMgYmFjaywgd2hpY2gKKyAgICAgIGNhbiBiZSBlbXBsb3llZCB0byBzb3J0IGFueSBibG9jaywgbm8gbWF0dGVyIGhvdyAKKyAgICAgIHJlcGV0aXRpdmUsIGluIE8oTiBsb2cgTikgdGltZS4gIFN1YnNlcXVlbnQgd29yayBieQorICAgICAgS3VuaWhpa28gU2FkYWthbmUgaGFzIHByb2R1Y2VkIGEgZGVyaXZhdGl2ZSBPKE4gKGxvZyBOKV4yKSAKKyAgICAgIGFsZ29yaXRobSB3aGljaCB1c3VhbGx5IG91dHBlcmZvcm1zIHRoZSBNYW5iZXItTXllcnMKKyAgICAgIGFsZ29yaXRobS4KKworICAgICAgSSBjb3VsZCBoYXZlIGNoYW5nZWQgdG8gU2FkYWthbmUncyBhbGdvcml0aG0sIGJ1dCBJIGZpbmQKKyAgICAgIGl0IHRvIGJlIHNsb3dlciB0aGFuIEBjb2Rle2J6aXAyfSdzIGV4aXN0aW5nIGFsZ29yaXRobSBmb3IKKyAgICAgIG1vc3QgaW5wdXRzLCBhbmQgdGhlIHJhbmRvbWlzYXRpb24gbWVjaGFuaXNtIHByb3RlY3RzCisgICAgICBhZGVxdWF0ZWx5IGFnYWluc3QgYmFkIGNhc2VzLiAgSSBkaWRuJ3QgdGhpbmsgaXQgd2FzCisgICAgICBhIGdvb2QgdHJhZGVvZmYgdG8gbWFrZS4gIFBhcnRseSB0aGlzIGlzIGR1ZSB0byB0aGUgZmFjdAorICAgICAgdGhhdCBJIHdhcyBub3QgZmxvb2RlZCB3aXRoIGVtYWlsIGNvbXBsYWludHMgYWJvdXQKKyAgICAgIEBjb2Rle2J6aXAyLTAuMX0ncyBwZXJmb3JtYW5jZSBvbiByZXBldGl0aXZlIGRhdGEsIHNvCisgICAgICBwZXJoYXBzIGl0IGlzbid0IGEgcHJvYmxlbSBmb3IgcmVhbCBpbnB1dHMuCisKKyAgICAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBzb2x1dGlvbgorICAgICAgaXMgdG8gdXNlIHRoZSBleGlzdGluZyBzb3J0aW5nCisgICAgICBhbGdvcml0aG0gaW5pdGlhbGx5LCBhbmQgZmFsbCBiYWNrIHRvIGEgTyhOIChsb2cgTileMikKKyAgICAgIGFsZ29yaXRobSBpZiB0aGUgc3RhbmRhcmQgYWxnb3JpdGhtIGdldHMgaW50byBkaWZmaWN1bHRpZXMuCisgICAgICBUaGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgbXVjaCBkaWZmaWN1bHR5OyBJIG1hZGUKKyAgICAgIGEgcHJvdG90eXBlIGltcGxlbWVudGF0aW9uIG9mIGl0IHNvbWUgbW9udGhzIG5vdy4KK0BpdGVtIFRoZSBjb21wcmVzc2VkIGZpbGUgZm9ybWF0IHdhcyBuZXZlciBkZXNpZ25lZCB0byBiZQorICAgICAgaGFuZGxlZCBieSBhIGxpYnJhcnksIGFuZCBJIGhhdmUgaGFkIHRvIGp1bXAgdGhvdWdoCisgICAgICBzb21lIGhvb3BzIHRvIHByb2R1Y2UgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mCisgICAgICBkZWNvbXByZXNzaW9uLiAgSXQncyBhIGJpdCBoYWlyeS4gIFRyeSBwYXNzaW5nCisgICAgICBAY29kZXtkZWNvbXByZXNzLmN9IHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIAorICAgICAgYW5kIHlvdSdsbCBzZWUgd2hhdCBJIG1lYW4uICBNdWNoIG9mIHRoaXMgY29tcGxleGl0eQorICAgICAgY291bGQgaGF2ZSBiZWVuIGF2b2lkZWQgaWYgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZgorICAgICAgZWFjaCBibG9jayBvZiBkYXRhIHdhcyByZWNvcmRlZCBpbiB0aGUgZGF0YSBzdHJlYW0uCitAaXRlbSBBbiBBZGxlci0zMiBjaGVja3N1bSwgcmF0aGVyIHRoYW4gYSBDUkMzMiBjaGVja3N1bSwKKyAgICAgIHdvdWxkIGJlIGZhc3RlciB0byBjb21wdXRlLgorQGVuZCBpdGVtaXplCitJdCB3b3VsZCBiZSBmYWlyIHRvIHNheSB0aGF0IHRoZSBAY29kZXtiemlwMn0gZm9ybWF0IHdhcyBmcm96ZW4KK2JlZm9yZSBJIHByb3Blcmx5IGFuZCBmdWxseSB1bmRlcnN0b29kIHRoZSBwZXJmb3JtYW5jZQorY29uc2VxdWVuY2VzIG9mIGRvaW5nIHNvLgorCitJbXByb3ZlbWVudHMgd2hpY2ggSSBoYXZlIGJlZW4gYWJsZSB0byBpbmNvcnBvcmF0ZSBpbnRvCiswLjkuMCwgZGVzcGl0ZSB1c2luZyB0aGUgc2FtZSBmaWxlIGZvcm1hdCwgYXJlOgorQGl0ZW1pemUgQGJ1bGxldAorQGl0ZW0gU2luZ2xlIGFycmF5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnZlcnNlIEJXVC4gIFRoaXMKKyAgICAgIHNpZ25pZmljYW50bHkgc3BlZWRzIHVwIGRlY29tcHJlc3Npb24sIHByZXN1bWFibHkKKyAgICAgIGJlY2F1c2UgaXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNhY2hlIG1pc3Nlcy4KK0BpdGVtIEZhc3RlciBpbnZlcnNlIE1URiB0cmFuc2Zvcm0gZm9yIGxhcmdlIE1URiB2YWx1ZXMuICBUaGUKKyAgICAgIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbm90aW9uIG9mIHNsaWRpbmcgYmxvY2tzCisgICAgICBvZiB2YWx1ZXMuCitAaXRlbSBAY29kZXtiemlwMi0wLjkuMH0gbm93IHJlYWRzIGFuZCB3cml0ZXMgZmlsZXMgd2l0aCBAY29kZXtmcmVhZH0KKyAgICAgIGFuZCBAY29kZXtmd3JpdGV9OyB2ZXJzaW9uIDAuMSB1c2VkIEBjb2Rle3B1dGN9IGFuZCBAY29kZXtnZXRjfS4KKyAgICAgIER1aCEgSSdtIGVtYmFycmFzc2VkIGF0IG15IG93biBtb3JvbmljbmVzcyAobW9yb25pY2l0eT8pIG9uIHRoaXMKKyAgICAgIG9uZS4KKworQGVuZCBpdGVtaXplCitGdXJ0aGVyIGFoZWFkLCBpdCB3b3VsZCBiZSBuaWNlIAordG8gYmUgYWJsZSB0byBkbyByYW5kb20gYWNjZXNzIGludG8gZmlsZXMuICBUaGlzIHdpbGwgCityZXF1aXJlIHNvbWUgY2FyZWZ1bCBkZXNpZ24gb2YgY29tcHJlc3NlZCBmaWxlIGZvcm1hdHMuCisKKworCitAc2VjdGlvbiBQb3J0YWJpbGl0eSBpc3N1ZXMKK0FmdGVyIHNvbWUgY29uc2lkZXJhdGlvbiwgSSBoYXZlIGRlY2lkZWQgbm90IHRvIHVzZQorR05VIEBjb2Rle2F1dG9jb25mfSB0byBjb25maWd1cmUgMC45LjAuCisKK0Bjb2Rle2F1dG9jb25mfSwgYWRtaXJhYmxlIGFuZCB3b25kZXJmdWwgdGhvdWdoIGl0IGlzLCAKK21haW5seSBhc3Npc3RzIHdpdGggcG9ydGFiaWxpdHkgcHJvYmxlbXMgYmV0d2VlbiBVbml4LWxpa2UKK3BsYXRmb3Jtcy4gIEJ1dCBAY29kZXtiemlwMn0gZG9lc24ndCBoYXZlIG11Y2ggaW4gdGhlIHdheQorb2YgcG9ydGFiaWxpdHkgcHJvYmxlbXMgb24gVW5peDsgbW9zdCBvZiB0aGUgZGlmZmljdWx0aWVzIGFwcGVhcgord2hlbiBwb3J0aW5nIHRvIHRoZSBNYWMsIG9yIHRvIE1pY3Jvc29mdCdzIG9wZXJhdGluZyBzeXN0ZW1zLgorQGNvZGV7YXV0b2NvbmZ9IGRvZXNuJ3QgaGVscCBpbiB0aG9zZSBjYXNlcywgYW5kIGJyaW5ncyBpbiBhIAord2hvbGUgbG9hZCBvZiBuZXcgY29tcGxleGl0eS4KKworTW9zdCBwZW9wbGUgc2hvdWxkIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgbGlicmFyeSBhbmQgcHJvZ3JhbQordW5kZXIgVW5peCBzdHJhaWdodCBvdXQtb2YtdGhlLWJveCwgc28gdG8gc3BlYWssIGVzcGVjaWFsbHkgCitpZiB5b3UgaGF2ZSBhIHZlcnNpb24gb2YgR05VIEMgYXZhaWxhYmxlLgorCitUaGVyZSBhcmUgYSBjb3VwbGUgb2YgQGNvZGV7X19pbmxpbmVfX30gZGlyZWN0aXZlcyBpbiB0aGUgY29kZS4gIEdOVSBDCisoQGNvZGV7Z2NjfSkgc2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIHRoZW0uICBJZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QKK2xpa2UgdGhlbSwganVzdCBAY29kZXsjZGVmaW5lfSBAY29kZXtfX2lubGluZV9ffSB0byBiZSBudWxsLiAgT25lCitlYXN5IHdheSB0byBkbyB0aGlzIGlzIHRvIGNvbXBpbGUgd2l0aCB0aGUgZmxhZyBAY29kZXstRF9faW5saW5lX189fSwgCit3aGljaCBzaG91bGQgYmUgdW5kZXJzdG9vZCBieSBtb3N0IFVuaXggY29tcGlsZXJzLgorCitJZiB5b3Ugc3RpbGwgaGF2ZSBkaWZmaWN1bHRpZXMsIHRyeSBjb21waWxpbmcgd2l0aCB0aGUgbWFjcm8KK0Bjb2Rle0JaX1NUUklDVF9BTlNJfSBkZWZpbmVkLiAgVGhpcyBzaG91bGQgZW5hYmxlIHlvdSB0byBidWlsZCB0aGUKK2xpYnJhcnkgaW4gYSBzdHJpY3RseSBBTlNJIGNvbXBsaWFudCBlbnZpcm9ubWVudC4gIEJ1aWxkaW5nIHRoZSBwcm9ncmFtCitpdHNlbGYgbGlrZSB0aGlzIGlzIGRhbmdlcm91cyBhbmQgbm90IHN1cHBvcnRlZCwgc2luY2UgeW91IHJlbW92ZQorQGNvZGV7YnppcDJ9J3MgY2hlY2tzIGFnYWluc3QgY29tcHJlc3NpbmcgZGlyZWN0b3JpZXMsIHN5bWJvbGljIGxpbmtzLAorZGV2aWNlcywgYW5kIG90aGVyIG5vdC1yZWFsbHktYS1maWxlIGVudGl0aWVzLiAgVGhpcyBjb3VsZCBjYXVzZQorZmlsZXN5c3RlbSBjb3JydXB0aW9uIQorCitPbmUgb3RoZXIgdGhpbmc6IGlmIHlvdSBjcmVhdGUgYSBAY29kZXtiemlwMn0gYmluYXJ5IGZvciBwdWJsaWMKK2Rpc3RyaWJ1dGlvbiwgcGxlYXNlIHRyeSBhbmQgbGluayBpdCBzdGF0aWNhbGx5IChAY29kZXtnY2MgLXN9KS4gIFRoaXMKK2F2b2lkcyBhbGwgc29ydHMgb2YgbGlicmFyeS12ZXJzaW9uIGlzc3VlcyB0aGF0IG90aGVycyBtYXkgZW5jb3VudGVyCitsYXRlciBvbi4KKworCitAc2VjdGlvbiBSZXBvcnRpbmcgYnVncworSSB0cmllZCBwcmV0dHkgaGFyZCB0byBtYWtlIHN1cmUgQGNvZGV7YnppcDJ9IGlzCitidWcgZnJlZSwgYm90aCBieSBkZXNpZ24gYW5kIGJ5IHRlc3RpbmcuICBIb3BlZnVsbHkKK3lvdSdsbCBuZXZlciBuZWVkIHRvIHJlYWQgdGhpcyBzZWN0aW9uIGZvciByZWFsLgorCitOZXZlcnRoZWxlc3MsIGlmIEBjb2Rle2J6aXAyfSBkaWVzIHdpdGggYSBzZWdtZW50YXRpb24KK2ZhdWx0LCBhIGJ1cyBlcnJvciBvciBhbiBpbnRlcm5hbCBhc3NlcnRpb24gZmFpbHVyZSwgaXQKK3dpbGwgYXNrIHlvdSB0byBlbWFpbCBtZSBhIGJ1ZyByZXBvcnQuICBFeHBlcmllbmNlIHdpdGgKK3ZlcnNpb24gMC4xIHNob3dzIHRoYXQgYWxtb3N0IGFsbCB0aGVzZSBwcm9ibGVtcyBjYW4KK2JlIHRyYWNlZCB0byBlaXRoZXIgY29tcGlsZXIgYnVncyBvciBoYXJkd2FyZSBwcm9ibGVtcy4KK0BpdGVtaXplIEBidWxsZXQKK0BpdGVtCitSZWNvbXBpbGUgdGhlIHByb2dyYW0gd2l0aCBubyBvcHRpbWlzYXRpb24sIGFuZCBzZWUgaWYgaXQKK3dvcmtzLiAgQW5kL29yIHRyeSBhIGRpZmZlcmVudCBjb21waWxlci4KK0kgaGVhcmQgYWxsIHNvcnRzIG9mIHN0b3JpZXMgYWJvdXQgdmFyaW91cyBmbGF2b3Vycworb2YgR05VIEMgKGFuZCBvdGhlciBjb21waWxlcnMpIGdlbmVyYXRpbmcgYmFkIGNvZGUgZm9yCitAY29kZXtiemlwMn0sIGFuZCBJJ3ZlIHJ1biBhY3Jvc3MgdHdvIHN1Y2ggZXhhbXBsZXMgbXlzZWxmLgorCisyLjcuWCB2ZXJzaW9ucyBvZiBHTlUgQyBhcmUga25vd24gdG8gZ2VuZXJhdGUgYmFkIGNvZGUgZnJvbQordGltZSB0byB0aW1lLCBhdCBoaWdoIG9wdGltaXNhdGlvbiBsZXZlbHMuICAKK0lmIHlvdSBnZXQgcHJvYmxlbXMsIHRyeSB1c2luZyB0aGUgZmxhZ3MKK0Bjb2Rley1PMn0gQGNvZGV7LWZvbWl0LWZyYW1lLXBvaW50ZXJ9IEBjb2Rley1mbm8tc3RyZW5ndGgtcmVkdWNlfS4KK1lvdSBzaG91bGQgc3BlY2lmaWNhbGx5IEBlbXBoe25vdH0gdXNlIEBjb2Rley1mdW5yb2xsLWxvb3BzfS4KKworWW91IG1heSBub3RpY2UgdGhhdCB0aGUgTWFrZWZpbGUgcnVucyBmb3VyIHRlc3RzIGFzIHBhcnQgb2YKK3RoZSBidWlsZCBwcm9jZXNzLiAgSWYgdGhlIHByb2dyYW0gcGFzc2VzIGFsbCBvZiB0aGVzZSwgaXQncworYSBwcmV0dHkgZ29vZCAoYnV0IG5vdCAxMDAlKSBpbmRpY2F0aW9uIHRoYXQgdGhlIGNvbXBpbGVyIGhhcworZG9uZSBpdHMgam9iIGNvcnJlY3RseS4KK0BpdGVtCitJZiBAY29kZXtiemlwMn0gY3Jhc2hlcyByYW5kb21seSwgYW5kIHRoZSBjcmFzaGVzIGFyZSBub3QKK3JlcGVhdGFibGUsIHlvdSBtYXkgaGF2ZSBhIGZsYWt5IG1lbW9yeSBzdWJzeXN0ZW0uICBAY29kZXtiemlwMn0KK3JlYWxseSBoYW1tZXJzIHlvdXIgbWVtb3J5IGhpZXJhcmNoeSwgYW5kIGlmIGl0J3MgYSBiaXQgbWFyZ2luYWwsCit5b3UgbWF5IGdldCB0aGVzZSBwcm9ibGVtcy4gIERpdHRvIGlmIHlvdXIgZGlzayBvciBJL08gc3Vic3lzdGVtCitpcyBzbG93bHkgZmFpbGluZy4gIFl1cCwgdGhpcyByZWFsbHkgZG9lcyBoYXBwZW4uCisKK1RyeSB1c2luZyBhIGRpZmZlcmVudCBtYWNoaW5lIG9mIHRoZSBzYW1lIHR5cGUsIGFuZCBzZWUgaWYKK3lvdSBjYW4gcmVwZWF0IHRoZSBwcm9ibGVtLgorQGl0ZW0gVGhpcyBpc24ndCByZWFsbHkgYSBidWcsIGJ1dCAuLi4gSWYgQGNvZGV7YnppcDJ9IHRlbGxzCit5b3UgeW91ciBmaWxlIGlzIGNvcnJ1cHRlZCBvbiBkZWNvbXByZXNzaW9uLCBhbmQgeW91CitvYnRhaW5lZCB0aGUgZmlsZSB2aWEgRlRQLCB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgeW91Citmb3Jnb3QgdG8gdGVsbCBGVFAgdG8gZG8gYSBiaW5hcnkgbW9kZSB0cmFuc2Zlci4gIFRoYXQgYWJzb2x1dGVseQord2lsbCBjYXVzZSB0aGUgZmlsZSB0byBiZSBub24tZGVjb21wcmVzc2libGUuICBZb3UnbGwgaGF2ZSB0byB0cmFuc2ZlcgoraXQgYWdhaW4uCitAZW5kIGl0ZW1pemUKKworSWYgeW91J3ZlIGluY29ycG9yYXRlZCBAY29kZXtsaWJiemlwMn0gaW50byB5b3VyIG93biBwcm9ncmFtCithbmQgYXJlIGdldHRpbmcgcHJvYmxlbXMsIHBsZWFzZSwgcGxlYXNlLCBwbGVhc2UsIGNoZWNrIHRoYXQgdGhlIAorcGFyYW1ldGVycyB5b3UgYXJlIHBhc3NpbmcgaW4gY2FsbHMgdG8gdGhlIGxpYnJhcnksIGFyZQorY29ycmVjdCwgYW5kIGluIGFjY29yZGFuY2Ugd2l0aCB3aGF0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMKK2lzIGFsbG93YWJsZS4gIEkgaGF2ZSB0cmllZCB0byBtYWtlIHRoZSBsaWJyYXJ5IHJvYnVzdCBhZ2FpbnN0CitzdWNoIHByb2JsZW1zLCBidXQgSSdtIHN1cmUgSSBoYXZlbid0IHN1Y2NlZWRlZC4KKworRmluYWxseSwgaWYgdGhlIGFib3ZlIGNvbW1lbnRzIGRvbid0IGhlbHAsIHlvdSdsbCBoYXZlIHRvIHNlbmQKK21lIGEgYnVnIHJlcG9ydC4gIE5vdywgaXQncyBqdXN0IGFtYXppbmcgaG93IG1hbnkgcGVvcGxlIHdpbGwgCitzZW5kIG1lIGEgYnVnIHJlcG9ydCBzYXlpbmcgc29tZXRoaW5nIGxpa2UKK0BkaXNwbGF5CisgICBiemlwMiBjcmFzaGVkIHdpdGggc2VnbWVudGF0aW9uIGZhdWx0IG9uIG15IG1hY2hpbmUKK0BlbmQgZGlzcGxheQorYW5kIGFic29sdXRlbHkgbm90aGluZyBlbHNlLiAgTmVlZGxlc3MgdG8gc2F5LCBhIHN1Y2ggYSByZXBvcnQKK2lzIEBlbXBoe3RvdGFsbHksIHV0dGVybHksIGNvbXBsZXRlbHkgYW5kIGNvbXByZWhlbnNpdmVseSAxMDAlIHVzZWxlc3M7IAorYSB3YXN0ZSBvZiB5b3VyIHRpbWUsIG15IHRpbWUsIGFuZCBuZXQgYmFuZHdpZHRofS4KK1dpdGggbm8gZGV0YWlscyBhdCBhbGwsIHRoZXJlJ3Mgbm8gd2F5IEkgY2FuIHBvc3NpYmx5IGJlZ2luCit0byBmaWd1cmUgb3V0IHdoYXQgdGhlIHByb2JsZW0gaXMuCisKK1RoZSBydWxlcyBvZiB0aGUgZ2FtZSBhcmU6IGZhY3RzLCBmYWN0cywgZmFjdHMuICBEb24ndCBvbWl0Cit0aGVtIGJlY2F1c2UgIm9oLCB0aGV5IHdvbid0IGJlIHJlbGV2YW50Ii4gIEF0IHRoZSBiYXJlIAorbWluaW11bToKK0BkaXNwbGF5CisgICBNYWNoaW5lIHR5cGUuICBPcGVyYXRpbmcgc3lzdGVtIHZlcnNpb24uICAKKyAgIEV4YWN0IHZlcnNpb24gb2YgQGNvZGV7YnppcDJ9IChkbyBAY29kZXtiemlwMiAtVn0pLiAgCisgICBFeGFjdCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciB1c2VkLiAgCisgICBGbGFncyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLgorQGVuZCBkaXNwbGF5CitIb3dldmVyLCB0aGUgbW9zdCBpbXBvcnRhbnQgc2luZ2xlIHRoaW5nIHRoYXQgd2lsbCBoZWxwIG1lIGlzCit0aGUgZmlsZSB0aGF0IHlvdSB3ZXJlIHRyeWluZyB0byBjb21wcmVzcyBvciBkZWNvbXByZXNzIGF0IHRoZQordGltZSB0aGUgcHJvYmxlbSBoYXBwZW5lZC4gIFdpdGhvdXQgdGhhdCwgbXkgYWJpbGl0eSB0byBkbyBhbnl0aGluZworbW9yZSB0aGFuIHNwZWN1bGF0ZSBhYm91dCB0aGUgY2F1c2UsIGlzIGxpbWl0ZWQuCisKK1BsZWFzZSByZW1lbWJlciB0aGF0IEkgY29ubmVjdCB0byB0aGUgSW50ZXJuZXQgd2l0aCBhIG1vZGVtLCBzbworeW91IHNob3VsZCBjb250YWN0IG1lIGJlZm9yZSBtYWlsaW5nIG1lIGh1Z2UgZmlsZXMuCisKKworQHNlY3Rpb24gRGlkIHlvdSBnZXQgdGhlIHJpZ2h0IHBhY2thZ2U/CisKK0Bjb2Rle2J6aXAyfSBpcyBhIHJlc291cmNlIGhvZy4gIEl0IHNvYWtzIHVwIGxhcmdlIGFtb3VudHMgb2YgQ1BVIGN5Y2xlcworYW5kIG1lbW9yeS4gIEFsc28sIGl0IGdpdmVzIHZlcnkgbGFyZ2UgbGF0ZW5jaWVzLiAgSW4gdGhlIHdvcnN0IGNhc2UsIHlvdQorY2FuIGZlZWQgbWFueSBtZWdhYnl0ZXMgb2YgdW5jb21wcmVzc2VkIGRhdGEgaW50byB0aGUgbGlicmFyeSBiZWZvcmUKK2dldHRpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LCBzbyB0aGlzIHByb2JhYmx5IHJ1bGVzIG91dCBhcHBsaWNhdGlvbnMKK3JlcXVpcmluZyBpbnRlcmFjdGl2ZSBiZWhhdmlvdXIuCisKK1RoZXNlIGFyZW4ndCBmYXVsdHMgb2YgbXkgaW1wbGVtZW50YXRpb24sIEkgaG9wZSwgYnV0IG1vcmUKK2FuIGludHJpbnNpYyBwcm9wZXJ0eSBvZiB0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAodW5mb3J0dW5hdGVseSkuICAKK01heWJlIHRoaXMgaXNuJ3Qgd2hhdCB5b3Ugd2FudC4KKworSWYgeW91IHdhbnQgYSBjb21wcmVzc29yIGFuZC9vciBsaWJyYXJ5IHdoaWNoIGlzIGZhc3RlciwgdXNlcyBsZXNzCittZW1vcnkgYnV0IGdldHMgcHJldHR5IGdvb2QgY29tcHJlc3Npb24sIGFuZCBoYXMgbWluaW1hbCBsYXRlbmN5LAorY29uc2lkZXIgSmVhbi1sb3VwCitHYWlsbHkncyBhbmQgTWFyayBBZGxlcidzIHdvcmssIEBjb2Rle3psaWItMS4xLjJ9IGFuZAorQGNvZGV7Z3ppcC0xLjIuNH0uICBMb29rIGZvciB0aGVtIGF0CitAY29kZXtodHRwOi8vd3d3LmNkcm9tLmNvbS9wdWIvaW5mb3ppcC96bGlifSBhbmQKK0Bjb2Rle2h0dHA6Ly93d3cuZ3ppcC5vcmd9IHJlc3BlY3RpdmVseS4KKworRm9yIHNvbWV0aGluZyBmYXN0ZXIgYW5kIGxpZ2h0ZXIgc3RpbGwsIHlvdSBtaWdodCB0cnkgTWFya3VzIEYgWCBKCitPYmVyaHVtZXIncyBAY29kZXtMWk99IHJlYWwtdGltZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGxpYnJhcnksIGF0CitAKiBAY29kZXtodHRwOi8vd2lsZHNhdS5pZHYudW5pLWxpbnouYWMuYXQvbWZ4L2x6by5odG1sfS4KKworSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBAY29kZXtiemlwMn0gYWxnb3JpdGhtcyB0byBjb21wcmVzcyBzbWFsbCBibG9ja3MKK29mIGRhdGEsIDY0ayBieXRlcyBvciBzbWFsbGVyLCBmb3IgZXhhbXBsZSBvbiBhbiBvbi10aGUtZmx5IGRpc2sKK2NvbXByZXNzb3IsIHlvdSdkIGJlIHdlbGwgYWR2aXNlZCBub3QgdG8gdXNlIHRoaXMgbGlicmFyeS4gIEluc3RlYWQsCitJJ3ZlIG1hZGUgYSBzcGVjaWFsIGxpYnJhcnkgdHVuZWQgZm9yIHRoYXQga2luZCBvZiB1c2UuICBJdCdzIHBhcnQgb2YKK0Bjb2Rle2UyY29tcHItMC40MH0sIGFuIG9uLXRoZS1mbHkgZGlzayBjb21wcmVzc29yIGZvciB0aGUgTGludXgKK0Bjb2Rle2V4dDJ9IGZpbGVzeXN0ZW0uICBMb29rIGF0CitAY29kZXtodHRwOi8vd3d3Lm5ldHNwYWNlLm5ldC5hdS9+cmVpdGVyL2UyY29tcHJ9LgorCisKKworQHNlY3Rpb24gVGVzdGluZworCitBIHJlY29yZCBvZiB0aGUgdGVzdHMgSSd2ZSBkb25lLgorCitGaXJzdCwgc29tZSBkYXRhIHNldHM6CitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbSBCOiBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgNjAwMSBmaWxlcywgb25lIGZvciBldmVyeSBsZW5ndGggaW4gdGhlCisgICAgICByYW5nZSAwIHRvIDYwMDAgYnl0ZXMuICBUaGUgZmlsZXMgY29udGFpbiByYW5kb20gbG93ZXJjYXNlCisgICAgICBsZXR0ZXJzLiAgMTguNyBtZWdhYnl0ZXMuCitAaXRlbSBIOiBteSBob21lIGRpcmVjdG9yeSB0cmVlLiAgRG9jdW1lbnRzLCBzb3VyY2UgY29kZSwgbWFpbCBmaWxlcywKKyAgICAgIGNvbXByZXNzZWQgZGF0YS4gIEggY29udGFpbnMgQiwgYW5kIGFsc28gYSBkaXJlY3Rvcnkgb2YgCisgICAgICBmaWxlcyBkZXNpZ25lZCBhcyBib3VuZGFyeSBjYXNlcyBmb3IgdGhlIHNvcnRpbmc7IG1vc3RseSB2ZXJ5CisgICAgICByZXBldGl0aXZlLCBuYXN0eSBmaWxlcy4gIDQ0NSBtZWdhYnl0ZXMuCitAaXRlbSBBOiBkaXJlY3RvcnkgdHJlZSBob2xkaW5nIHZhcmlvdXMgYXBwbGljYXRpb25zIGJ1aWx0IGZyb20gc291cmNlOgorICAgICAgQGNvZGV7ZWdjcy0xLjAuMn0sIEBjb2Rle2djYy0yLjguMX0sIEtERSBCZXRhIDQsIEdUSywgT2N0YXZlLCBldGMuCisgICAgICA4MjcgbWVnYWJ5dGVzLgorQGl0ZW0gUDogZGlyZWN0b3J5IHRyZWUgaG9sZGluZyBsYXJnZSBhbW91bnRzIG9mIHNvdXJjZSBjb2RlIChAY29kZXsudGFyfSAKKyAgICAgIGZpbGVzKSBvZiB0aGUgZW50aXJlIEdOVSBkaXN0cmlidXRpb24sIHBsdXMgYSBjb3VwbGUgb2YKKyAgICAgIExpbnV4IGRpc3RyaWJ1dGlvbnMuICAyNDAwIG1lZ2FieXRlcy4KK0BlbmQgaXRlbWl6ZQorVGhlIHRlc3RzIGNvbmR1Y3RlZCBhcmUgYXMgZm9sbG93cy4gIEVhY2ggdGVzdCBtZWFucyBjb21wcmVzc2luZyAKKyhhIGNvcHkgb2YpIGVhY2ggZmlsZSBpbiB0aGUgZGF0YSBzZXQsIGRlY29tcHJlc3NpbmcgaXQgYW5kCitjb21wYXJpbmcgaXQgYWdhaW5zdCB0aGUgb3JpZ2luYWwuCisKK0ZpcnN0LCBhIGJ1bmNoIG9mIHRlc3RzIHdpdGggYmxvY2sgc2l6ZXMsIGludGVybmFsIGJ1ZmZlcgorc2l6ZXMgYW5kIHJhbmRvbWlzYXRpb24gbGVuZ3RocyBzZXQgdmVyeSBzbWFsbCwgCit0byBkZXRlY3QgYW55IHByb2JsZW1zIHdpdGggdGhlCitibG9ja2luZywgYnVmZmVyaW5nIGFuZCByYW5kb21pc2F0aW9uIG1lY2hhbmlzbXMuICAKK1RoaXMgcmVxdWlyZWQgbW9kaWZ5aW5nIHRoZSBzb3VyY2UgY29kZSBzbyBhcyB0byB0cnkgdG8gCiticmVhayBpdC4KK0BlbnVtZXJhdGUKK0BpdGVtIERhdGEgc2V0IEgsIHdpdGgKKyAgICAgIGJ1ZmZlciBzaXplIG9mIDEgYnl0ZSwgYW5kIGJsb2NrIHNpemUgb2YgMjMgYnl0ZXMuCitAaXRlbSBEYXRhIHNldCBCLCBidWZmZXIgc2l6ZXMgMSBieXRlLCBibG9jayBzaXplIDEgYnl0ZS4KK0BpdGVtIEFzICgyKSBidXQgc21hbGwtbW9kZSBkZWNvbXByZXNzaW9uIChmaXJzdCAxNzAwIGZpbGVzKS4KK0BpdGVtIEFzICgyKSB3aXRoIGJsb2NrIHNpemUgMiBieXRlcy4KK0BpdGVtIEFzICgyKSB3aXRoIGJsb2NrIHNpemUgMyBieXRlcy4KK0BpdGVtIEFzICgyKSB3aXRoIGJsb2NrIHNpemUgNCBieXRlcy4KK0BpdGVtIEFzICgyKSB3aXRoIGJsb2NrIHNpemUgNSBieXRlcy4KK0BpdGVtIEFzICgyKSB3aXRoIGJsb2NrIHNpemUgNiBieXRlcyBhbmQgc21hbGwtbW9kZSBkZWNvbXByZXNzaW9uLgorQGl0ZW0gSCB3aXRoIG5vcm1hbCBidWZmZXIgc2l6ZXMgKDUwMDAgYnl0ZXMpLCBub3JtYWwgYmxvY2sKKyAgICAgIHNpemUgKHVwIHRvIDkwMDAwMCBieXRlcyksIGJ1dCB3aXRoIHJhbmRvbWlzYXRpb24KKyAgICAgIG1lY2hhbmlzbSBydW5uaW5nIGludGVuc2VseSAocmFuZG9taXNpbmcgYXBwcm94aW1hdGVseSBldmVyeQorICAgICAgdGhpcmQgYnl0ZSkuCitAaXRlbSBBcyAoOSkgd2l0aCBzbWFsbC1tb2RlIGRlY29tcHJlc3Npb24uCitAZW5kIGVudW1lcmF0ZQorVGhlbiBzb21lIHRlc3RzIHdpdGggdW5tb2RpZmllZCBzb3VyY2UgY29kZS4KK0BlbnVtZXJhdGUKK0BpdGVtIEgsIGFsbCBzZXR0aW5ncyBub3JtYWwuCitAaXRlbSBBcyAoMSksIHdpdGggc21hbGwtbW9kZSBkZWNvbXByZXNzLgorQGl0ZW0gSCwgY29tcHJlc3Mgd2l0aCBmbGFnIEBjb2Rley0xfS4KK0BpdGVtIEgsIGNvbXByZXNzIHdpdGggZmxhZyBAY29kZXstc30sIGRlY29tcHJlc3Mgd2l0aCBmbGFnIEBjb2Rley1zfS4KK0BpdGVtIEZvcndhcmRzIGNvbXBhdGliaWxpdHk6IEgsIEBjb2Rle2J6aXAyLTAuMXBsMn0gY29tcHJlc3NpbmcsCisgICAgICBAY29kZXtiemlwMi0wLjkuMH0gZGVjb21wcmVzc2luZywgYWxsIHNldHRpbmdzIG5vcm1hbC4KK0BpdGVtIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiAgSCwgQGNvZGV7YnppcDItMC45LjB9IGNvbXByZXNzaW5nLAorICAgICAgQGNvZGV7YnppcDItMC4xcGwyfSBkZWNvbXByZXNzaW5nLCBhbGwgc2V0dGluZ3Mgbm9ybWFsLgorQGl0ZW0gQmlnZ2VyIHRlc3RzOiBBLCBhbGwgc2V0dGluZ3Mgbm9ybWFsLgorQGl0ZW0gUCwgYWxsIHNldHRpbmdzIG5vcm1hbC4KK0BpdGVtIE1pc2MgdGVzdDogYWJvdXQgMTAwIG1lZ2FieXRlcyBvZiBAY29kZXsudGFyfSBmaWxlcyB3aXRoCisgICAgICBAY29kZXtiemlwMn0gY29tcGlsZWQgd2l0aCBQdXJpZnkuCitAaXRlbSBNaXNjIHRlc3RzIHRvIG1ha2Ugc3VyZSBpdCBidWlsZHMgYW5kIHJ1bnMgb2sgb24gbm9uLUxpbnV4L3g4NgorICAgICAgcGxhdGZvcm1zLgorQGVuZCBlbnVtZXJhdGUKK1RoZXNlIHRlc3RzIHdlcmUgY29uZHVjdGVkIG9uIGEgMjA1IE1IeiBDeXJpeCA2eDg2TVggbWFjaGluZSwgcnVubmluZworTGludXggMi4wLjMyLiAgVGhleSByZXByZXNlbnQgbmVhcmx5IGEgd2VlayBvZiBjb250aW51b3VzIGNvbXB1dGF0aW9uLgorQWxsIHRlc3RzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisKKworQHNlY3Rpb24gRnVydGhlciByZWFkaW5nCitAY29kZXtiemlwMn0gaXMgbm90IHJlc2VhcmNoIHdvcmssIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXNuJ3QgcHJlc2VudAorYW55IG5ldyBpZGVhcy4gIFJhdGhlciwgaXQncyBhbiBlbmdpbmVlcmluZyBleGVyY2lzZSBiYXNlZCBvbiBleGlzdGluZworaWRlYXMuCisKK0ZvdXIgZG9jdW1lbnRzIGRlc2NyaWJlIGVzc2VudGlhbGx5IGFsbCB0aGUgaWRlYXMgYmVoaW5kIEBjb2Rle2J6aXAyfToKK0BleGFtcGxlCitNaWNoYWVsIEJ1cnJvd3MgYW5kIEQuIEouIFdoZWVsZXI6CisgICJBIGJsb2NrLXNvcnRpbmcgbG9zc2xlc3MgZGF0YSBjb21wcmVzc2lvbiBhbGdvcml0aG0iCisgICAxMHRoIE1heSAxOTk0LiAKKyAgIERpZ2l0YWwgU1JDIFJlc2VhcmNoIFJlcG9ydCAxMjQuCisgICBmdHA6Ly9mdHAuZGlnaXRhbC5jb20vcHViL0RFQy9TUkMvcmVzZWFyY2gtcmVwb3J0cy9TUkMtMTI0LnBzLmd6CisgICBJZiB5b3UgaGF2ZSB0cm91YmxlIGZpbmRpbmcgaXQsIHRyeSBzZWFyY2hpbmcgYXQgdGhlCisgICBOZXcgWmVhbGFuZCBEaWdpdGFsIExpYnJhcnksIGh0dHA6Ly93d3cubnpkbC5vcmcuCisKK0RhbmllbCBTLiBIaXJzY2hiZXJnIGFuZCBEZWJyYSBBLiBMZUxld2VyCisgICJFZmZpY2llbnQgRGVjb2Rpbmcgb2YgUHJlZml4IENvZGVzIgorICAgQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MCwgVm9sIDMzLCBOdW1iZXIgNC4KKyAgIFlvdSBtaWdodCBiZSBhYmxlIHRvIGdldCBhbiBlbGVjdHJvbmljIGNvcHkgb2YgdGhpcworICAgICAgZnJvbSB0aGUgQUNNIERpZ2l0YWwgTGlicmFyeS4KKworRGF2aWQgSi4gV2hlZWxlcgorICAgUHJvZ3JhbSBicmVkMy5jIGFuZCBhY2NvbXBhbnlpbmcgZG9jdW1lbnQgYnJlZDMucHMuCisgICBUaGlzIGNvbnRhaW5zIHRoZSBpZGVhIGJlaGluZCB0aGUgbXVsdGktdGFibGUgSHVmZm1hbgorICAgY29kaW5nIHNjaGVtZS4KKyAgIGZ0cDovL2Z0cC5jbC5jYW0uYWMudWsvcHViL3VzZXIvZGp3My8KKworSm9uIEwuIEJlbnRsZXkgYW5kIFJvYmVydCBTZWRnZXdpY2sKKyAgIkZhc3QgQWxnb3JpdGhtcyBmb3IgU29ydGluZyBhbmQgU2VhcmNoaW5nIFN0cmluZ3MiCisgICBBdmFpbGFibGUgZnJvbSBTZWRnZXdpY2sncyB3ZWIgcGFnZSwKKyAgIHd3dy5jcy5wcmluY2V0b24uZWR1L35ycworQGVuZCBleGFtcGxlCitUaGUgZm9sbG93aW5nIHBhcGVyIGdpdmVzIHZhbHVhYmxlIGFkZGl0aW9uYWwgaW5zaWdodHMgaW50byB0aGUKK2FsZ29yaXRobSwgYnV0IGlzIG5vdCBpbW1lZGlhdGVseSB0aGUgYmFzaXMgb2YgYW55IGNvZGUKK3VzZWQgaW4gYnppcDIuCitAZXhhbXBsZQorUGV0ZXIgRmVud2ljazoKKyAgIEJsb2NrIFNvcnRpbmcgVGV4dCBDb21wcmVzc2lvbgorICAgUHJvY2VlZGluZ3Mgb2YgdGhlIDE5dGggQXVzdHJhbGFzaWFuIENvbXB1dGVyIFNjaWVuY2UgQ29uZmVyZW5jZSwKKyAgICAgTWVsYm91cm5lLCBBdXN0cmFsaWEuICBKYW4gMzEgLSBGZWIgMiwgMTk5Ni4KKyAgIGZ0cDovL2Z0cC5jcy5hdWNrbGFuZC5hYy5uei9wdWIvcGV0ZXItZi9BQ1NDOTZwYXBlci5wcworQGVuZCBleGFtcGxlCitLdW5paGlrbyBTYWRha2FuZSdzIHNvcnRpbmcgYWxnb3JpdGhtLCBtZW50aW9uZWQgYWJvdmUsCitpcyBhdmFpbGFibGUgZnJvbToKK0BleGFtcGxlCitodHRwOi8vbmFvbWkuaXMucy51LXRva3lvLmFjLmpwL35zYWRhL3BhcGVycy9TYWRhOThiLnBzLmd6CitAZW5kIGV4YW1wbGUKK1RoZSBNYW5iZXItTXllcnMgc3VmZml4IGFycmF5IGNvbnN0cnVjdGlvbgorYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBhIHBhcGVyCithdmFpbGFibGUgZnJvbToKK0BleGFtcGxlCitodHRwOi8vd3d3LmNzLmFyaXpvbmEuZWR1L3Blb3BsZS9nZW5lL1BBUEVSUy9zdWZmaXgucHMKK0BlbmQgZXhhbXBsZQorCisKKworQGNvbnRlbnRzCisKK0BieWUKKwpkaWZmIC0tZ2l0IGEvcmFuZHRhYmxlLmMgYi9yYW5kdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IzNGFmCi0tLSAvZGV2L251bGwKKysrIGIvcmFuZHRhYmxlLmMKQEAgLTAsMCArMSwxMjQgQEAKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIFRhYmxlIGZvciByYW5kb21pc2luZyByZXBldGl0aXZlIGJsb2NrcyAgICAgICAgICAgICAgIC0tLSovCisvKi0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kdGFibGUuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLQorICBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGJ6aXAyIGFuZC9vciBsaWJiemlwMiwgYSBwcm9ncmFtIGFuZAorICBsaWJyYXJ5IGZvciBsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCisgIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEp1bGlhbiBSIFNld2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IAorICAgICBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgSWYgeW91IHVzZSB0aGlzIAorICAgICBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IAorICAgICBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisKKyAgMy4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdAorICAgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCisgIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICAgICBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTCisgIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFCisgIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyAgSnVsaWFuIFNld2FyZCwgR3VpbGRmb3JkLCBTdXJyZXksIFVLLgorICBqc2V3YXJkQGFjbS5vcmcKKyAgYnppcDIvbGliYnppcDIgdmVyc2lvbiAwLjkuMGMgb2YgMTggT2N0b2JlciAxOTk4CisKKyAgVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIChhdCBsZWFzdCkgdGhlIHdvcmsgb2Y6CisgICAgIE1pa2UgQnVycm93cworICAgICBEYXZpZCBXaGVlbGVyCisgICAgIFBldGVyIEZlbndpY2sKKyAgICAgQWxpc3RhaXIgTW9mZmF0CisgICAgIFJhZGZvcmQgTmVhbAorICAgICBJYW4gSC4gV2l0dGVuCisgICAgIFJvYmVydCBTZWRnZXdpY2sKKyAgICAgSm9uIEwuIEJlbnRsZXkKKworICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzb3VyY2VzLCBzZWUgdGhlIG1hbnVhbC4KKy0tKi8KKworCisjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0ludDMyIHJOdW1zWzUxMl0gPSB7IAorICAgNjE5LCA3MjAsIDEyNywgNDgxLCA5MzEsIDgxNiwgODEzLCAyMzMsIDU2NiwgMjQ3LCAKKyAgIDk4NSwgNzI0LCAyMDUsIDQ1NCwgODYzLCA0OTEsIDc0MSwgMjQyLCA5NDksIDIxNCwgCisgICA3MzMsIDg1OSwgMzM1LCA3MDgsIDYyMSwgNTc0LCA3MywgNjU0LCA3MzAsIDQ3MiwgCisgICA0MTksIDQzNiwgMjc4LCA0OTYsIDg2NywgMjEwLCAzOTksIDY4MCwgNDgwLCA1MSwgCisgICA4NzgsIDQ2NSwgODExLCAxNjksIDg2OSwgNjc1LCA2MTEsIDY5NywgODY3LCA1NjEsIAorICAgODYyLCA2ODcsIDUwNywgMjgzLCA0ODIsIDEyOSwgODA3LCA1OTEsIDczMywgNjIzLCAKKyAgIDE1MCwgMjM4LCA1OSwgMzc5LCA2ODQsIDg3NywgNjI1LCAxNjksIDY0MywgMTA1LCAKKyAgIDE3MCwgNjA3LCA1MjAsIDkzMiwgNzI3LCA0NzYsIDY5MywgNDI1LCAxNzQsIDY0NywgCisgICA3MywgMTIyLCAzMzUsIDUzMCwgNDQyLCA4NTMsIDY5NSwgMjQ5LCA0NDUsIDUxNSwgCisgICA5MDksIDU0NSwgNzAzLCA5MTksIDg3NCwgNDc0LCA4ODIsIDUwMCwgNTk0LCA2MTIsIAorICAgNjQxLCA4MDEsIDIyMCwgMTYyLCA4MTksIDk4NCwgNTg5LCA1MTMsIDQ5NSwgNzk5LCAKKyAgIDE2MSwgNjA0LCA5NTgsIDUzMywgMjIxLCA0MDAsIDM4NiwgODY3LCA2MDAsIDc4MiwgCisgICAzODIsIDU5NiwgNDE0LCAxNzEsIDUxNiwgMzc1LCA2ODIsIDQ4NSwgOTExLCAyNzYsIAorICAgOTgsIDU1MywgMTYzLCAzNTQsIDY2NiwgOTMzLCA0MjQsIDM0MSwgNTMzLCA4NzAsIAorICAgMjI3LCA3MzAsIDQ3NSwgMTg2LCAyNjMsIDY0NywgNTM3LCA2ODYsIDYwMCwgMjI0LCAKKyAgIDQ2OSwgNjgsIDc3MCwgOTE5LCAxOTAsIDM3MywgMjk0LCA4MjIsIDgwOCwgMjA2LCAKKyAgIDE4NCwgOTQzLCA3OTUsIDM4NCwgMzgzLCA0NjEsIDQwNCwgNzU4LCA4MzksIDg4NywgCisgICA3MTUsIDY3LCA2MTgsIDI3NiwgMjA0LCA5MTgsIDg3MywgNzc3LCA2MDQsIDU2MCwgCisgICA5NTEsIDE2MCwgNTc4LCA3MjIsIDc5LCA4MDQsIDk2LCA0MDksIDcxMywgOTQwLCAKKyAgIDY1MiwgOTM0LCA5NzAsIDQ0NywgMzE4LCAzNTMsIDg1OSwgNjcyLCAxMTIsIDc4NSwgCisgICA2NDUsIDg2MywgODAzLCAzNTAsIDEzOSwgOTMsIDM1NCwgOTksIDgyMCwgOTA4LCAKKyAgIDYwOSwgNzcyLCAxNTQsIDI3NCwgNTgwLCAxODQsIDc5LCA2MjYsIDYzMCwgNzQyLCAKKyAgIDY1MywgMjgyLCA3NjIsIDYyMywgNjgwLCA4MSwgOTI3LCA2MjYsIDc4OSwgMTI1LCAKKyAgIDQxMSwgNTIxLCA5MzgsIDMwMCwgODIxLCA3OCwgMzQzLCAxNzUsIDEyOCwgMjUwLCAKKyAgIDE3MCwgNzc0LCA5NzIsIDI3NSwgOTk5LCA2MzksIDQ5NSwgNzgsIDM1MiwgMTI2LCAKKyAgIDg1NywgOTU2LCAzNTgsIDYxOSwgNTgwLCAxMjQsIDczNywgNTk0LCA3MDEsIDYxMiwgCisgICA2NjksIDExMiwgMTM0LCA2OTQsIDM2MywgOTkyLCA4MDksIDc0MywgMTY4LCA5NzQsIAorICAgOTQ0LCAzNzUsIDc0OCwgNTIsIDYwMCwgNzQ3LCA2NDIsIDE4MiwgODYyLCA4MSwgCisgICAzNDQsIDgwNSwgOTg4LCA3MzksIDUxMSwgNjU1LCA4MTQsIDMzNCwgMjQ5LCA1MTUsIAorICAgODk3LCA5NTUsIDY2NCwgOTgxLCA2NDksIDExMywgOTc0LCA0NTksIDg5MywgMjI4LCAKKyAgIDQzMywgODM3LCA1NTMsIDI2OCwgOTI2LCAyNDAsIDEwMiwgNjU0LCA0NTksIDUxLCAKKyAgIDY4NiwgNzU0LCA4MDYsIDc2MCwgNDkzLCA0MDMsIDQxNSwgMzk0LCA2ODcsIDcwMCwgCisgICA5NDYsIDY3MCwgNjU2LCA2MTAsIDczOCwgMzkyLCA3NjAsIDc5OSwgODg3LCA2NTMsIAorICAgOTc4LCAzMjEsIDU3NiwgNjE3LCA2MjYsIDUwMiwgODk0LCA2NzksIDI0MywgNDQwLCAKKyAgIDY4MCwgODc5LCAxOTQsIDU3MiwgNjQwLCA3MjQsIDkyNiwgNTYsIDIwNCwgNzAwLCAKKyAgIDcwNywgMTUxLCA0NTcsIDQ0OSwgNzk3LCAxOTUsIDc5MSwgNTU4LCA5NDUsIDY3OSwgCisgICAyOTcsIDU5LCA4NywgODI0LCA3MTMsIDY2MywgNDEyLCA2OTMsIDM0MiwgNjA2LCAKKyAgIDEzNCwgMTA4LCA1NzEsIDM2NCwgNjMxLCAyMTIsIDE3NCwgNjQzLCAzMDQsIDMyOSwgCisgICAzNDMsIDk3LCA0MzAsIDc1MSwgNDk3LCAzMTQsIDk4MywgMzc0LCA4MjIsIDkyOCwgCisgICAxNDAsIDIwNiwgNzMsIDI2MywgOTgwLCA3MzYsIDg3NiwgNDc4LCA0MzAsIDMwNSwgCisgICAxNzAsIDUxNCwgMzY0LCA2OTIsIDgyOSwgODIsIDg1NSwgOTUzLCA2NzYsIDI0NiwgCisgICAzNjksIDk3MCwgMjk0LCA3NTAsIDgwNywgODI3LCAxNTAsIDc5MCwgMjg4LCA5MjMsIAorICAgODA0LCAzNzgsIDIxNSwgODI4LCA1OTIsIDI4MSwgNTY1LCA1NTUsIDcxMCwgODIsIAorICAgODk2LCA4MzEsIDU0NywgMjYxLCA1MjQsIDQ2MiwgMjkzLCA0NjUsIDUwMiwgNTYsIAorICAgNjYxLCA4MjEsIDk3NiwgOTkxLCA2NTgsIDg2OSwgOTA1LCA3NTgsIDc0NSwgMTkzLCAKKyAgIDc2OCwgNTUwLCA2MDgsIDkzMywgMzc4LCAyODYsIDIxNSwgOTc5LCA3OTIsIDk2MSwgCisgICA2MSwgNjg4LCA3OTMsIDY0NCwgOTg2LCA0MDMsIDEwNiwgMzY2LCA5MDUsIDY0NCwgCisgICAzNzIsIDU2NywgNDY2LCA0MzQsIDY0NSwgMjEwLCAzODksIDU1MCwgOTE5LCAxMzUsIAorICAgNzgwLCA3NzMsIDYzNSwgMzg5LCA3MDcsIDEwMCwgNjI2LCA5NTgsIDE2NSwgNTA0LCAKKyAgIDkyMCwgMTc2LCAxOTMsIDcxMywgODU3LCAyNjUsIDIwMywgNTAsIDY2OCwgMTA4LCAKKyAgIDY0NSwgOTkwLCA2MjYsIDE5NywgNTEwLCAzNTcsIDM1OCwgODUwLCA4NTgsIDM2NCwgCisgICA5MzYsIDYzOAorfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZHRhYmxlLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS90ZXN0LmJhdCBiL3Rlc3QuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGI3NDdkLi4wMDAwMDAwCi0tLSBhL3Rlc3QuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1AcmVtDQotQHJlbSBNU0RPUyB0ZXN0IGRyaXZlciBmb3IgYnppcDINCi1AcmVtDQotdHlwZSB3b3JkczENCi0uXGJ6aXAyIC0xIDwgc2FtcGxlMS5yZWYgPiBzYW1wbGUxLnJieg0KLS5cYnppcDIgLTIgPCBzYW1wbGUyLnJlZiA+IHNhbXBsZTIucmJ6DQotLlxiemlwMiAtZHZ2IDwgc2FtcGxlMS5iejIgPiBzYW1wbGUxLnRzdA0KLS5cYnppcDIgLWR2diA8IHNhbXBsZTIuYnoyID4gc2FtcGxlMi50c3QNCi10eXBlIHdvcmRzM3NoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC5jbWQgYi90ZXN0LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiYzg2Ni4uMDAwMDAwMAotLS0gYS90ZXN0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotQHJlbQ0KLUByZW0gT1MvMiB0ZXN0IGRyaXZlciBmb3IgYnppcDINCi1AcmVtDQotdHlwZSB3b3JkczENCi0uXGJ6aXAyIC0xIDwgc2FtcGxlMS5yZWYgPiBzYW1wbGUxLnJieg0KLS5cYnppcDIgLTIgPCBzYW1wbGUyLnJlZiA+IHNhbXBsZTIucmJ6DQotLlxiemlwMiAtZHZ2IDwgc2FtcGxlMS5iejIgPiBzYW1wbGUxLnRzdA0KLS5cYnppcDIgLWR2diA8IHNhbXBsZTIuYnoyID4gc2FtcGxlMi50c3QNCi10eXBlIHdvcmRzM3NoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd29yZHMwIGIvd29yZHMwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdmYjQzLi4wMDAwMDAwCi0tLSBhL3dvcmRzMAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotKioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqKgotKioqLS0tLS0tLS0tIElNUE9SVEFOVDogUkVBRCBXSEFUIEZPTExPV1MhIC0tLS0tLS0tLSoqKgotKioqLS0tLS0tLS0tICAgICB2aXo6IHBheSBhdHRlbnRpb24gOi0pICAgIC0tLS0tLS0tLSoqKgotKioqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoqKgotCi1Db21waWxpbmcgYnppcDIgLi4uCi0KZGlmZiAtLWdpdCBhL3dvcmRzMSBiL3dvcmRzMQppbmRleCBjNzUyOTNiLi5hODkxNDMxIDEwMDY0NAotLS0gYS93b3JkczEKKysrIGIvd29yZHMxCkBAIC0xLDUgKzEsNCBAQAogCi0KIERvaW5nIDQgdGVzdHMgKDIgY29tcHJlc3MsIDIgdW5jb21wcmVzcykgLi4uCiBJZiB0aGVyZSdzIGEgcHJvYmxlbSwgdGhpbmdzIG1pZ2h0IHN0b3AgYXQgdGhpcyBwb2ludC4KICAKZGlmZiAtLWdpdCBhL3dvcmRzMiBiL3dvcmRzMgppbmRleCBkM2NhZmI5Li4yMDNlZTM5IDEwMDY0NAotLS0gYS93b3JkczIKKysrIGIvd29yZHMyCkBAIC0xLDUgKzEsNCBAQAogCi0KIENoZWNraW5nIHRlc3QgcmVzdWx0cy4gIElmIGFueSBvZiB0aGUgZm91ciAiY21wInMgd2hpY2ggZm9sbG93CiByZXBvcnQgYW55IGRpZmZlcmVuY2VzLCBzb21ldGhpbmcgaXMgd3JvbmcuICBJZiB5b3UgY2FuJ3QgZWFzaWx5CiBmaWd1cmUgb3V0IHdoYXQsIHBsZWFzZSBsZXQgbWUga25vdyAoanNld2FyZEBhY20ub3JnKS4KZGlmZiAtLWdpdCBhL3dvcmRzMyBiL3dvcmRzMwppbmRleCA1NzM5ZDE4Li4xMGJiMmU5IDEwMDY0NAotLS0gYS93b3JkczMKKysrIGIvd29yZHMzCkBAIC0xLDIzICsxLDIwIEBACiAKLQogSWYgeW91IGdvdCB0aGlzIGZhciBhbmQgdGhlICJjbXAicyBkaWRuJ3QgZmluZCBhbnl0aGluZyBhbWlzcywgbG9va3MKLWxpa2UgeW91J3JlIGluIGJ1c2luZXNzLiAgWW91IHNob3VsZCBpbnN0YWxsIGJ6aXAyIGFuZCBidW56aXAyOgorbGlrZSB5b3UncmUgaW4gYnVzaW5lc3MuICBZb3Ugc2hvdWxkIGluc3RhbGwgYnppcDIsIGJ1bnppcDIgYW5kIGJ6Y2F0OgogCi0gICBjb3B5IGJ6aXAyIHRvIGEgcHVibGljIHBsYWNlLCBtYXliZSAvdXNyL2Jpbi4KLSAgIEluIHRoYXQgcHVibGljIHBsYWNlLCBtYWtlIGJ1bnppcDIgYSBzeW1ib2xpYyBsaW5rCi0gICAgICB0byB0aGUgYnppcDIgeW91IGp1c3QgY29waWVkIHRoZXJlLgorICAgQ29weSBiemlwMiBhbmQgYnppcDJyZWNvdmVyIHRvIGEgcHVibGljIHBsYWNlLCBtYXliZSAvdXNyL2Jpbi4KKyAgIEluIHRoYXQgcHVibGljIHBsYWNlLCBtYWtlIGJ1bnppcDIgYW5kIGJ6Y2F0IGJlCisgICAgICBzeW1ib2xpYyBsaW5rcyB0byB0aGUgYnppcDIgeW91IGp1c3QgY29waWVkIHRoZXJlLgogICAgUHV0IHRoZSBtYW51YWwgcGFnZSwgYnppcDIuMSwgc29tZXdoZXJlIGFwcHJvcHJpYXRlOwogICAgICAgcGVyaGFwcyBpbiAvdXNyL21hbi9tYW4xLgogCi1Db21wbGV0ZSBpbnN0cnVjdGlvbnMgZm9yIHVzZSBhcmUgaW4gdGhlIHByZWZvcm1hdHRlZAotbWFudWFsIHBhZ2UsIGluIHRoZSBmaWxlIGJ6aXAyLjEucHJlZm9ybWF0dGVkLgorSW5zdHJ1Y3Rpb25zIGZvciB1c2UgYXJlIGluIHRoZSBwcmVmb3JtYXR0ZWQgbWFudWFsIHBhZ2UsIGluIHRoZSBmaWxlCitiemlwMi50eHQuICBGb3IgbW9yZSBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCByZWFkIHRoZSBmdWxsIG1hbnVhbC4gIAorSXQgaXMgYXZhaWxhYmxlIGluIFBvc3RzY3JpcHQgZm9ybSAobWFudWFsLnBzKSBhbmQgSFRNTCBmb3JtCisobWFudWFsX3RvYy5odG1sKS4KIAogWW91IGNhbiBhbHNvIGRvICJiemlwMiAtLWhlbHAiIHRvIHNlZSBzb21lIGhlbHBmdWwgaW5mb3JtYXRpb24uIAotCiAiYnppcDIgLUwiIGRpc3BsYXlzIHRoZSBzb2Z0d2FyZSBsaWNlbnNlLgogCi1QbGVhc2UgcmVhZCB0aGUgUkVBRE1FIGZpbGUgY2FyZWZ1bGx5LiAgCi1GaW5hbGx5LCBub3RlIHRoYXQgYnppcDIgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgotCi1IYXBweSBjb21wcmVzc2luZyEKK0hhcHB5IGNvbXByZXNzaW5nLiAgLS0gSlJTLCAzMCBBdWd1c3QgMTk5OC4KIApkaWZmIC0tZ2l0IGEvd29yZHMzc2ggYi93b3JkczNzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEzOTE3Ny4uMDAwMDAwMAotLS0gYS93b3JkczNzaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLUlmIHlvdSBnb3QgdGhpcyBmYXIgYW5kIHRoZSAiYnppcDIgLWR2diJzIGdpdmUgaWRlbnRpY2FsDQotc3RvcmVkIHZzIGNvbXB1dGVkIENSQ3MsIHlvdSdyZSBwcm9iYWJseSBpbiBidXNpbmVzcy4NCi1Db21wbGV0ZSBpbnN0cnVjdGlvbnMgZm9yIHVzZSBhcmUgaW4gdGhlIHByZWZvcm1hdHRlZCBtYW51YWwgcGFnZSwgDQotaW4gdGhlIGZpbGUgYnppcDIudHh0Lg0KLQ0KLVlvdSBjYW4gYWxzbyBkbyAiYnppcDIgLS1oZWxwIiB0byBzZWUgc29tZSBoZWxwZnVsIGluZm9ybWF0aW9uLiANCi0iYnppcDIgLUwiIGRpc3BsYXlzIHRoZSBzb2Z0d2FyZSBsaWNlbnNlLg0KLQ0KLVBsZWFzZSByZWFkIHRoZSBSRUFETUUgZmlsZSBjYXJlZnVsbHkuICANCi1GaW5hbGx5LCBub3RlIHRoYXQgYnppcDIgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLg0KLQ0KLUhhcHB5IGNvbXByZXNzaW5nIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK