--------------Boundary-00=_WH8VLHTBVGPGQ0AT8N4Y Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Hiya, One of the things todo for KDE 3.0 is to get 64-bit file support working. You might want to read the following URL in order to understand the problem. http://ftp.sas.com/standards/large.file/x_open.20Mar96.html It seems that since we can't control the way in which either Qt, other libs or applications are being compiled we will need to use the "Transitional Extensions". I haven't tried it yet but I hope that we can circumvent this define mess that Jeff talks about. I'm sure that after all the problems with X-headers the glibc-developers wouldn't be that stupid. As far as KDE's internal interfaces goes, I think that we should start to use "long long" in the interfaces that need it. Maybe we can add a KIO::filesize_t typedef so that we have a central place to change it to something else. Cheers, Waldo ---------- Forwarded Message ---------- Subject: Re: 64 bit file support Date: Mon, 6 Aug 2001 14:53:46 -0400 From: Jeff Woods To: Waldo Bastian On Wednesday 25 July 2001 02:56 pm, you wrote: > There are various problems with 64 bit file-sizes, one of them being that > our APIs don't support 64 bits. We hope to fix that in KDE 3.0. Your > experiences will be usefull in that regard so that we know what needs > fixing. We finally got 64 files partially supported. Basically, we replaced the stat's and lstat's in kio/kfileitem.cpp and kio/file/file.cc with stat64 and lstat64. This allows files with sizes greater than 4 GB to be displayed in the file browser (which was our greatest concern). The application we've been working with already used 64 bit access routines where necessary. This solution won't work under Linux, though. Linux headers define "struct stat" based on the value of _FILE_OFFSET_BITS. If you place the line "#define _FILE_OFFSET_BITS 64" prior to any #include's in your source, you get the 64 bit version, otherwise you get the 32 bit version. An unfortunate side effect of this is that all system calls, such as open and truncate, get a #define like this: #define open open64 #define truncate truncate64 This caused problems with some QT member functions which had the same name as a system call. For example, QString::truncate() was renamed QString::truncate64(), which did not resolve against the QT dynamic library. We were able to get away with this since Solaris defines a seperate "struct stat64" for use with stat64 and lstat64. We just surrounded our changes with #ifdef sun ... #endif statements to keep the builds clean. As you're aware, there are many more changes which are necessary. Even though we are able to list the file, we do not get the correct file size. This would require a number of internal changes. I've attached the changed files (my reason for not posting to the developer list). Jeff Woods ------------------------------------------------------- -- KDE 2.2: We deliver. --------------Boundary-00=_WH8VLHTBVGPGQ0AT8N4Y Content-Type: text/x-c++; charset="iso-8859-1"; name="kfileitem.cpp" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kfileitem.cpp" LyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0CiAgIENvcHlyaWdodCAoQykg MTk5OSBEYXZpZCBGYXVyZSA8ZmF1cmVAa2RlLm9yZz4KCiAgIFRoaXMgbGlicmFyeSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAg IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KCiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMaWJyYXJ5IEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm IG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkg VGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAogICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4K Ki8KLy8gJElkOiBrZmlsZWl0ZW0uY3BwLHYgMS44OSAyMDAxLzAyLzEwIDEyOjU4OjIxIGhhdXNt YW5uIEV4cCAkCgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVk ZSA8Z3JwLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2lu Y2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgImtmaWxlaXRlbS5oIgoKI2luY2x1ZGUgPHFkaXIu aD4KI2luY2x1ZGUgPHFmaWxlLmg+CgojaW5jbHVkZSA8a2dsb2JhbC5oPgojaW5jbHVkZSA8a2Rl YnVnLmg+CiNpbmNsdWRlIDxrbG9jYWxlLmg+CiNpbmNsdWRlIDxrbWltZXR5cGUuaD4KI2luY2x1 ZGUgPGtydW4uaD4KCiNpbmNsdWRlIDxlcnJuby5oPgpleHRlcm4gaW50IGVycm5vOwoKY2xhc3Mg S0ZpbGVJdGVtOjpLRmlsZUl0ZW1Qcml2YXRlCnsKcHVibGljOgogIEtGaWxlSXRlbVByaXZhdGUo KSB7IGJNaW1lVHlwZUtub3duID0gZmFsc2U7IH0KICAgLy8gRm9yIHNwZWNpYWwgY2FzZSBsaWtl IGxpbmsgdG8gZGlycyBvdmVyIEZUUAogIFFTdHJpbmcgbV9ndWVzc2VkTWltZVR5cGU7CiAgYm9v bCBiTWltZVR5cGVLbm93bjsKfTsKCktGaWxlSXRlbTo6S0ZpbGVJdGVtKCBjb25zdCBLSU86OlVE U0VudHJ5JiBfZW50cnksIGNvbnN0IEtVUkwmIF91cmwsCiAgICAgICAgICAgICAgICAgICAgICBi b29sIF9kZXRlcm1pbmVNaW1lVHlwZU9uRGVtYW5kLCBib29sIF91cmxJc0RpcmVjdG9yeSApIDoK ICBtX2VudHJ5KCBfZW50cnkgKSwKICBtX3VybCggX3VybCApLAogIG1fYklzTG9jYWxVUkwoIF91 cmwuaXNMb2NhbEZpbGUoKSApLAogIG1fZmlsZU1vZGUoIChtb2RlX3QpLTEgKSwKICBtX3Blcm1p c3Npb25zKCAobW9kZV90KS0xICksCiAgbV9iTGluayggZmFsc2UgKSwKICBtX3BNaW1lVHlwZSgg MCApLAogIG1fYk1hcmtlZCggZmFsc2UgKSwKICBkKG5ldyBLRmlsZUl0ZW1Qcml2YXRlKQp7CiAg Ym9vbCBVRFNfVVJMX3NlZW4gPSBmYWxzZTsKICAvLyBleHRyYWN0IHRoZSBtb2RlIGFuZCB0aGUg ZmlsZW5hbWUgZnJvbSB0aGUgS0lPOjpVRFMgRW50cnkKICBLSU86OlVEU0VudHJ5OjpDb25zdEl0 ZXJhdG9yIGl0ID0gbV9lbnRyeS5iZWdpbigpOwogIGZvciggOyBpdCAhPSBtX2VudHJ5LmVuZCgp OyBpdCsrICkgewogICAgc3dpdGNoICgoKml0KS5tX3VkcykgewoKICAgICAgICBjYXNlIEtJTzo6 VURTX0ZJTEVfVFlQRToKICAgICAgICAgIG1fZmlsZU1vZGUgPSAobW9kZV90KSgoKml0KS5tX2xv bmcpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0lPOjpVRFNfQUNDRVNTOgogICAg ICAgICAgbV9wZXJtaXNzaW9ucyA9IChtb2RlX3QpKCgqaXQpLm1fbG9uZyk7CiAgICAgICAgICBi cmVhazsKCiAgICAgICAgY2FzZSBLSU86OlVEU19VU0VSOgogICAgICAgICAgbV91c2VyID0gKCgq aXQpLm1fc3RyKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtJTzo6VURTX0dST1VQ OgogICAgICAgICAgbV9ncm91cCA9ICgoKml0KS5tX3N0cik7CiAgICAgICAgICBicmVhazsKCiAg ICAgICAgY2FzZSBLSU86OlVEU19OQU1FOgogICAgICAgICAgbV9zdHJOYW1lID0gKCppdCkubV9z dHI7CiAgICAgICAgICBtX3N0clRleHQgPSBLSU86OmRlY29kZUZpbGVOYW1lKCBtX3N0ck5hbWUg KTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtJTzo6VURTX1VSTDoKICAgICAgICAg IFVEU19VUkxfc2VlbiA9IHRydWU7CiAgICAgICAgICBtX3VybCA9IEtVUkwoKCppdCkubV9zdHIp OwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0lPOjpVRFNfTUlNRV9UWVBFOgogICAg ICAgICAgbV9wTWltZVR5cGUgPSBLTWltZVR5cGU6Om1pbWVUeXBlKCgqaXQpLm1fc3RyKTsKICAg ICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtJTzo6VURTX0dVRVNTRURfTUlNRV9UWVBFOgog ICAgICAgICAgZC0+bV9ndWVzc2VkTWltZVR5cGUgPSAoKml0KS5tX3N0cjsKICAgICAgICAgIGJy ZWFrOwoKICAgICAgICBjYXNlIEtJTzo6VURTX0xJTktfREVTVDoKICAgICAgICAgIG1fYkxpbmsg PSAhKCppdCkubV9zdHIuaXNFbXB0eSgpOyAvLyB3ZSBkb24ndCBzdG9yZSB0aGUgbGluayBkZXN0 CiAgICAgICAgICBicmVhazsKICAgIH0KICB9CiAgLy8gYXZvaWQgY3JlYXRpbmcgdGhlc2UgUVN0 cmluZ3MgYWdhaW4gYW5kIGFnYWluCiAgc3RhdGljIGNvbnN0IFFTdHJpbmcmIGRvdCA9IEtHbG9i YWw6OnN0YXRpY1FTdHJpbmcoIi4iKTsKICBpZiAoIF91cmxJc0RpcmVjdG9yeSAmJiAhVURTX1VS TF9zZWVuICYmICFtX3N0ck5hbWUuaXNFbXB0eSgpICYmIG1fc3RyTmFtZSAhPSBkb3QgKQogICAg bV91cmwuYWRkUGF0aCggbV9zdHJOYW1lICk7CiAgaW5pdCggX2RldGVybWluZU1pbWVUeXBlT25E ZW1hbmQgKTsKfQoKS0ZpbGVJdGVtOjpLRmlsZUl0ZW0oIG1vZGVfdCBfbW9kZSwgbW9kZV90IF9w ZXJtaXNzaW9ucywgY29uc3QgS1VSTCYgX3VybCwgYm9vbCBfZGV0ZXJtaW5lTWltZVR5cGVPbkRl bWFuZCApIDoKICBtX2VudHJ5KCksIC8vIHdhcm5pbmcgIQogIG1fdXJsKCBfdXJsICksCiAgbV9i SXNMb2NhbFVSTCggX3VybC5pc0xvY2FsRmlsZSgpICksCiAgbV9zdHJOYW1lKCBfdXJsLmZpbGVO YW1lKCkgKSwKICBtX3N0clRleHQoIEtJTzo6ZGVjb2RlRmlsZU5hbWUoIG1fc3RyTmFtZSApICks CiAgbV9maWxlTW9kZSAoIF9tb2RlICksCiAgbV9wZXJtaXNzaW9ucyggX3Blcm1pc3Npb25zICks CiAgbV9iTGluayggZmFsc2UgKSwKICBtX2JNYXJrZWQoIGZhbHNlICksCiAgZChuZXcgS0ZpbGVJ dGVtUHJpdmF0ZSkKewogIGluaXQoIF9kZXRlcm1pbmVNaW1lVHlwZU9uRGVtYW5kICk7Cn0KCktG aWxlSXRlbTo6S0ZpbGVJdGVtKCBjb25zdCBLVVJMICZ1cmwsIGNvbnN0IFFTdHJpbmcgJm1pbWVU eXBlLCBtb2RlX3QgbW9kZSApCjogIG1fdXJsKCB1cmwgKSwKICBtX2JJc0xvY2FsVVJMKCB1cmwu aXNMb2NhbEZpbGUoKSApLAogIG1fc3RyTmFtZSggdXJsLmZpbGVOYW1lKCkgKSwKICBtX3N0clRl eHQoIEtJTzo6ZGVjb2RlRmlsZU5hbWUoIG1fc3RyTmFtZSApICksCiAgbV9maWxlTW9kZSggbW9k ZSApLAogIG1fcGVybWlzc2lvbnMoIDAgKSwKICBtX2JMaW5rKCBmYWxzZSApLAogIG1fYk1hcmtl ZCggZmFsc2UgKSwKICBkKG5ldyBLRmlsZUl0ZW1Qcml2YXRlKQp7CiAgbV9wTWltZVR5cGUgPSBL TWltZVR5cGU6Om1pbWVUeXBlKCBtaW1lVHlwZSApOwogIGluaXQoIGZhbHNlICk7Cn0KCktGaWxl SXRlbTo6S0ZpbGVJdGVtKCBjb25zdCBLRmlsZUl0ZW0gJiBpdGVtICkgOgogIGQobmV3IEtGaWxl SXRlbVByaXZhdGUpCnsKICAgIGFzc2lnbiggaXRlbSApOwp9CgpLRmlsZUl0ZW06On5LRmlsZUl0 ZW0oKQp7CiAgZGVsZXRlIGQ7Cn0KCnZvaWQgS0ZpbGVJdGVtOjppbml0KCBib29sIF9kZXRlcm1p bmVNaW1lVHlwZU9uRGVtYW5kICkKewogIC8vIGRldGVybWluZSBtb2RlIGFuZC9vciBwZXJtaXNz aW9ucyBpZiB1bmtub3duCiAgaWYgKCBtX2ZpbGVNb2RlID09IChtb2RlX3QpIC0xIHx8IG1fcGVy bWlzc2lvbnMgPT0gKG1vZGVfdCkgLTEgKQogIHsKICAgIG1vZGVfdCBtb2RlID0gMDsKICAgIGlm ICggbV91cmwuaXNMb2NhbEZpbGUoKSApCiAgICB7CiAgICAgIC8qIGRpcmVjdG9yaWVzIG1heSBu b3QgaGF2ZSBhIHNsYXNoIGF0IHRoZSBlbmQgaWYKICAgICAgICogd2Ugd2FudCB0byBzdGF0KCkg dGhlbTsgaXQgcmVxdWlyZXMgdGhhdCB3ZQogICAgICAgKiBjaGFuZ2UgaW50byBpdCAuLiB3aGlj aCBtYXkgbm90IGJlIGFsbG93ZWQKICAgICAgICogc3RhdCgiL2lzL3VuYWNjZXNzaWJsZSIpICAt PiByd3gtLS0tLS0KICAgICAgICogc3RhdCgiL2lzL3VuYWNjZXNzaWJsZS8iKSAtPiBFUEVSTSAg ICAgICAgICAgIEguWi4KICAgICAgICogVGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgLTEKICAg ICAgICovCiAgICAgIFFDU3RyaW5nIHBhdGggPSBRRmlsZTo6ZW5jb2RlTmFtZShtX3VybC5wYXRo KCAtMSApKTsKI2lmZGVmIHN1bgogICAgICBzdHJ1Y3Qgc3RhdDY0IGJ1ZjsKICAgICAgaWYgKCBs c3RhdDY0KCBwYXRoLmRhdGEoKSwgJmJ1ZiApID09IDAgKQojZWxzZQogICAgICBzdHJ1Y3Qgc3Rh dCBidWY7CiAgICAgIGlmICggbHN0YXQoIHBhdGguZGF0YSgpLCAmYnVmICkgPT0gMCApCiNlbmRp ZgogICAgICB7CiAgICAgICAgbW9kZSA9IGJ1Zi5zdF9tb2RlOwogICAgICAgIGlmICggU19JU0xO SyggbW9kZSApICkKICAgICAgICB7CiAgICAgICAgICBtX2JMaW5rID0gdHJ1ZTsKI2lmZGVmIHN1 bgogICAgICAgICAgaWYgKCBzdGF0NjQocGF0aC5kYXRhKCksICZidWYpID09IDAgKQojZWxzZQog ICAgICAgICAgaWYgKCBzdGF0KCBwYXRoLmRhdGEoKSwgJmJ1ZikgPT0gMCApCiNlbmRpZgogICAg ICAgICAgICAgIG1vZGUgPSBidWYuc3RfbW9kZTsKICAgICAgICAgIGVsc2UgLy8gbGluayBwb2lu dGluZyB0byBub3doZXJlIChzZWUga2lvL2ZpbGUvZmlsZS5jYykKICAgICAgICAgICAgICBtb2Rl ID0gKFNfSUZNVC0xKSB8IFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTzsKICAgICAgICB9CiAg ICAgIH0KICAgIH0KICAgIGlmICggbV9maWxlTW9kZSA9PSAobW9kZV90KSAtMSApCiAgICAgIG1f ZmlsZU1vZGUgPSBtb2RlICYgU19JRk1UOyAvLyBleHRyYWN0IGZpbGUgdHlwZQogICAgaWYgKCBt X3Blcm1pc3Npb25zID09IChtb2RlX3QpIC0xICkKICAgICAgbV9wZXJtaXNzaW9ucyA9IG1vZGUg JiAwNzc3NzsgLy8gZXh0cmFjdCBwZXJtaXNzaW9ucwogIH0KCiAgLy8gZGV0ZXJtaW5lIHRoZSBt aW1ldHlwZQogIGlmICghbV9wTWltZVR5cGUgKQogIHsKICAgICAgbV9wTWltZVR5cGUgPSBLTWlt ZVR5cGU6OmZpbmRCeVVSTCggbV91cmwsIG1fZmlsZU1vZGUsIG1fYklzTG9jYWxVUkwsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBmYXN0IG1vZGUgaWYg bm90IG1pbWV0eXBlIG9uIGRlbWFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfZGV0ZXJtaW5lTWltZVR5cGVPbkRlbWFuZCApOwogICAgICAvLyBpZiB3ZSBkaWRu J3QgdXNlIGZhc3QgbW9kZSwgb3IgaWYgd2UgZ290IGEgcmVzdWx0LCB0aGVuIHRoaXMgaXMgdGhl IG1pbWV0eXBlCiAgICAgIC8vIG90aGVyd2lzZSwgZGV0ZXJtaW5lTWltZVR5cGUgd2lsbCBiZSBh YmxlIHRvIGRvIGJldHRlci4KICAgICAgZC0+Yk1pbWVUeXBlS25vd24gPSAoIV9kZXRlcm1pbmVN aW1lVHlwZU9uRGVtYW5kKSB8fCAobV9wTWltZVR5cGUtPm5hbWUoKSAhPSBLTWltZVR5cGU6OmRl ZmF1bHRNaW1lVHlwZSgpKTsKICB9Cgp9Cgp2b2lkIEtGaWxlSXRlbTo6cmVmcmVzaCgpCnsKICBt X2ZpbGVNb2RlID0gKG1vZGVfdCktMTsKICBtX3Blcm1pc3Npb25zID0gKG1vZGVfdCktMTsKICBt X3VzZXIgPSBRU3RyaW5nOjpudWxsOwogIG1fZ3JvdXAgPSBRU3RyaW5nOjpudWxsOwogIC8vIEJh c2ljYWxseSwgd2UgY2FuJ3QgdHJ1c3QgYW55IGluZm9ybWF0aW9uIHdlIGdvdCB3aGlsZSBsaXN0 aW5nLgogIC8vIEV2ZXJ5dGhpbmcgY291bGQgaGF2ZSBjaGFuZ2VkLi4uCiAgLy8gQ2xlYXJpbmcg bV9lbnRyeSBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXRlY3QgY2hhbmdlcyBpbiB0aGUgc2l6ZSBv ZiB0aGUgZmlsZSwKICAvLyB0aGUgdGltZSBpbmZvcm1hdGlvbiwgZXRjLgogIG1fZW50cnkgPSBL SU86OlVEU0VudHJ5KCk7CiAgaW5pdCggZmFsc2UgKTsKfQoKdm9pZCBLRmlsZUl0ZW06OnJlZnJl c2hNaW1lVHlwZSgpCnsKICBtX3BNaW1lVHlwZSA9IDBMOwogIGluaXQoIGZhbHNlICk7IC8vIFdp bGwgZGV0ZXJtaW5lIHRoZSBtaW1ldHlwZQp9Cgp2b2lkIEtGaWxlSXRlbTo6c2V0VVJMKCBjb25z dCBLVVJMICZ1cmwgKQp7CiAgbV91cmwgPSB1cmw7CiAgbV9zdHJOYW1lID0gdXJsLmZpbGVOYW1l KCk7CiAgbV9zdHJUZXh0ID0gS0lPOjpkZWNvZGVGaWxlTmFtZSggbV9zdHJOYW1lICk7Cn0KClFT dHJpbmcgS0ZpbGVJdGVtOjpsaW5rRGVzdCgpIGNvbnN0CnsKICAvLyBFeHRyYWN0IGl0IGZyb20g dGhlIEtJTzo6VURTRW50cnkKICBLSU86OlVEU0VudHJ5OjpDb25zdEl0ZXJhdG9yIGl0ID0gbV9l bnRyeS5iZWdpbigpOwogIGZvciggOyBpdCAhPSBtX2VudHJ5LmVuZCgpOyBpdCsrICkKICAgIGlm ICggKCppdCkubV91ZHMgPT0gS0lPOjpVRFNfTElOS19ERVNUICkKICAgICAgcmV0dXJuICgqaXQp Lm1fc3RyOwogIC8vIElmIG5vdCBpbiB0aGUgS0lPOjpVRFNFbnRyeSwgb3IgaWYgVURTRW50cnkg ZW1wdHksIHVzZSByZWFkbGluaygpIFtpZiBsb2NhbCBVUkxdCiAgaWYgKCBtX2JJc0xvY2FsVVJM ICkKICB7CiAgICBjaGFyIGJ1ZlsxMDAwXTsKICAgIGludCBuID0gcmVhZGxpbmsoIFFGaWxlOjpl bmNvZGVOYW1lKG1fdXJsLnBhdGgoIC0xICkpLCBidWYsIDEwMDAgKTsKICAgIGlmICggbiAhPSAt MSApCiAgICB7CiAgICAgIGJ1ZlsgbiBdID0gMDsKICAgICAgcmV0dXJuIFFTdHJpbmc6OmZyb21M b2NhbDhCaXQoIGJ1ZiApOwogICAgfQogIH0KICByZXR1cm4gUVN0cmluZzo6bnVsbDsKfQoKbG9u ZyBLRmlsZUl0ZW06OnNpemUoKSBjb25zdAp7CiAgLy8gRXh0cmFjdCBpdCBmcm9tIHRoZSBLSU86 OlVEU0VudHJ5CiAgS0lPOjpVRFNFbnRyeTo6Q29uc3RJdGVyYXRvciBpdCA9IG1fZW50cnkuYmVn aW4oKTsKICBmb3IoIDsgaXQgIT0gbV9lbnRyeS5lbmQoKTsgaXQrKyApCiAgICBpZiAoICgqaXQp Lm1fdWRzID09IEtJTzo6VURTX1NJWkUgKQogICAgICByZXR1cm4gKCppdCkubV9sb25nOwogIC8v IElmIG5vdCBpbiB0aGUgS0lPOjpVRFNFbnRyeSwgb3IgaWYgVURTRW50cnkgZW1wdHksIHVzZSBz dGF0KCkgW2lmIGxvY2FsIFVSTF0KICBpZiAoIG1fYklzTG9jYWxVUkwgKQogIHsKI2lmZGVmIHN1 bgogICAgc3RydWN0IHN0YXQ2NCBidWY7CiAgICBzdGF0NjQoIFFGaWxlOjplbmNvZGVOYW1lKG1f dXJsLnBhdGgoIC0xICkpLCAmYnVmICk7CiNlbHNlCiAgICBzdHJ1Y3Qgc3RhdCBidWY7CiAgICBz dGF0KCBRRmlsZTo6ZW5jb2RlTmFtZShtX3VybC5wYXRoKCAtMSApKSwgJmJ1ZiApOwojZW5kaWYK CiAgICByZXR1cm4gYnVmLnN0X3NpemU7CiAgfQogIHJldHVybiAwTDsKfQoKdGltZV90IEtGaWxl SXRlbTo6dGltZSggdW5zaWduZWQgaW50IHdoaWNoICkgY29uc3QKewogIC8vIEV4dHJhY3QgaXQg ZnJvbSB0aGUgS0lPOjpVRFNFbnRyeQogIEtJTzo6VURTRW50cnk6OkNvbnN0SXRlcmF0b3IgaXQg PSBtX2VudHJ5LmJlZ2luKCk7CiAgZm9yKCA7IGl0ICE9IG1fZW50cnkuZW5kKCk7IGl0KysgKQog ICAgaWYgKCAoKml0KS5tX3VkcyA9PSB3aGljaCApCiAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0 aW1lX3Q+KCgqaXQpLm1fbG9uZyk7CgogIC8vIElmIG5vdCBpbiB0aGUgS0lPOjpVRFNFbnRyeSwg b3IgaWYgVURTRW50cnkgZW1wdHksIHVzZSBzdGF0KCkgW2lmIGxvY2FsIFVSTF0KICBpZiAoIG1f YklzTG9jYWxVUkwgKQogIHsKI2lmZGVmIHN1bgogICAgc3RydWN0IHN0YXQ2NCBidWY7CiAgICBz dGF0NjQoIFFGaWxlOjplbmNvZGVOYW1lKG1fdXJsLnBhdGgoIC0xICkpLCAmYnVmICk7CiNlbHNl CiAgICBzdHJ1Y3Qgc3RhdCBidWY7CiAgICBzdGF0KCBRRmlsZTo6ZW5jb2RlTmFtZShtX3VybC5w YXRoKCAtMSApKSwgJmJ1ZiApOwojZW5kaWYKCiAgICByZXR1cm4gKHdoaWNoID09IEtJTzo6VURT X01PRElGSUNBVElPTl9USU1FKSA/IGJ1Zi5zdF9tdGltZSA6CiAgICAgICAgICAgKHdoaWNoID09 IEtJTzo6VURTX0FDQ0VTU19USU1FKSA/IGJ1Zi5zdF9hdGltZSA6CiAgICAgICAgc3RhdGljX2Nh c3Q8dGltZV90PigwKTsgLy8gV2UgY2FuJ3QgZGV0ZXJtaW5lIGNyZWF0aW9uIHRpbWUgZm9yIGxv Y2FsIGZpbGVzCiAgfQogIHJldHVybiBzdGF0aWNfY2FzdDx0aW1lX3Q+KDApOwp9CgoKUVN0cmlu ZyBLRmlsZUl0ZW06OnVzZXIoKSBjb25zdAp7CiAgaWYgKCBtX3VzZXIuaXNFbXB0eSgpICYmIG1f YklzTG9jYWxVUkwgKQogIHsKI2lmZGVmIHN1bgogICAgc3RydWN0IHN0YXQ2NCBidWZmOwogICAg aWYgKCBsc3RhdDY0KCBRRmlsZTo6ZW5jb2RlTmFtZShtX3VybC5wYXRoKCAtMSApKSwgJmJ1ZmYg KSA9PSAwKSAvLyBnZXQgdWlkL2dpZCBvZiB0aGUgbGluaywgaWYgaXQncyBhIGxpbmsKI2Vsc2UK ICAgIHN0cnVjdCBzdGF0IGJ1ZmY7CiAgICBpZiAoIGxzdGF0KCBRRmlsZTo6ZW5jb2RlTmFtZSht X3VybC5wYXRoKCAtMSApKSwgJmJ1ZmYgKSA9PSAwKSAvLyBnZXQgdWlkL2dpZCBvZiB0aGUgbGlu aywgaWYgaXQncyBhIGxpbmsKI2VuZGlmCiAgICB7CiAgICAgIHN0cnVjdCBwYXNzd2QgKnVzZXIg PSBnZXRwd3VpZCggYnVmZi5zdF91aWQgKTsKICAgICAgaWYgKCB1c2VyICE9IDBMICkKICAgICAg ICBtX3VzZXIgPSBRU3RyaW5nOjpmcm9tTG9jYWw4Qml0KHVzZXItPnB3X25hbWUpOwogICAgfQog IH0KCiAgcmV0dXJuIG1fdXNlcjsKfQoKUVN0cmluZyBLRmlsZUl0ZW06Omdyb3VwKCkgY29uc3QK ewogIGlmIChtX2dyb3VwLmlzRW1wdHkoKSAmJiBtX2JJc0xvY2FsVVJMICkKICB7CiNpZmRlZiBz dW4KICAgIHN0cnVjdCBzdGF0NjQgYnVmZjsKICAgIGlmICggbHN0YXQ2NCggUUZpbGU6OmVuY29k ZU5hbWUobV91cmwucGF0aCggLTEgKSksICZidWZmICkgPT0gMCkgLy8gZ2V0IHVpZC9naWQgb2Yg dGhlIGxpbmssIGlmIGl0J3MgYSBsaW5rCiNlbHNlCiAgICBzdHJ1Y3Qgc3RhdCBidWZmOwogICAg aWYgKCBsc3RhdCggUUZpbGU6OmVuY29kZU5hbWUobV91cmwucGF0aCggLTEgKSksICZidWZmICkg PT0gMCkgLy8gZ2V0IHVpZC9naWQgb2YgdGhlIGxpbmssIGlmIGl0J3MgYSBsaW5rCiNlbmRpZgog ICAgewogICAgICBzdHJ1Y3QgZ3JvdXAgKmdlID0gZ2V0Z3JnaWQoIGJ1ZmYuc3RfZ2lkICk7CiAg ICAgIGlmICggZ2UgIT0gMEwgKSB7CiAgICAgICAgbV9ncm91cCA9IFFTdHJpbmc6OmZyb21Mb2Nh bDhCaXQoZ2UtPmdyX25hbWUpOwogICAgICAgIGlmIChtX2dyb3VwLmlzRW1wdHkoKSkKICAgICAg ICAgIG1fZ3JvdXAuc3ByaW50ZigiJWQiLGdlLT5ncl9naWQpOwogICAgICB9IGVsc2UKICAgICAg ICBtX2dyb3VwLnNwcmludGYoIiVkIixidWZmLnN0X2dpZCk7CiAgICB9CiAgICBlbHNlIGlmIChl cnJubyA9PSBFT1ZFUkZMT1cpCiAgICB7CiAgICAgIG1fZ3JvdXAgPSAoY2hhciAqKSBOVUxMOwog ICAgfQogIH0KICByZXR1cm4gbV9ncm91cDsKfQoKUVN0cmluZyBLRmlsZUl0ZW06Om1pbWV0eXBl KCkgY29uc3QKewogIEtGaWxlSXRlbSAqIHRoYXQgPSBjb25zdF9jYXN0PEtGaWxlSXRlbSAqPih0 aGlzKTsKICByZXR1cm4gdGhhdC0+ZGV0ZXJtaW5lTWltZVR5cGUoKS0+bmFtZSgpOwp9CgpLTWlt ZVR5cGU6OlB0ciBLRmlsZUl0ZW06OmRldGVybWluZU1pbWVUeXBlKCkKewogIGlmICggIW1fcE1p bWVUeXBlIHx8ICFkLT5iTWltZVR5cGVLbm93biApCiAgewogICAgLy9rZERlYnVnKDEyMDMpIDw8 ICJmaW5kaW5nIG1pbWV0eXBlIGZvciAiIDw8IG1fdXJsLnVybCgpIDw8IGVuZGw7CiAgICBtX3BN aW1lVHlwZSA9IEtNaW1lVHlwZTo6ZmluZEJ5VVJMKCBtX3VybCwgbV9maWxlTW9kZSwgbV9iSXNM b2NhbFVSTCApOwogICAgZC0+Yk1pbWVUeXBlS25vd24gPSB0cnVlOwogIH0KCiAgcmV0dXJuIG1f cE1pbWVUeXBlOwp9Cgpib29sIEtGaWxlSXRlbTo6aXNNaW1lVHlwZUtub3duKCkgY29uc3QKewog IHJldHVybiBkLT5iTWltZVR5cGVLbm93bjsKfQoKUVN0cmluZyBLRmlsZUl0ZW06Om1pbWVDb21t ZW50KCkKewogS01pbWVUeXBlOjpQdHIgbVR5cGUgPSBkZXRlcm1pbmVNaW1lVHlwZSgpOwogUVN0 cmluZyBjb21tZW50ID0gbVR5cGUtPmNvbW1lbnQoIG1fdXJsLCBmYWxzZSApOwogIGlmICghY29t bWVudC5pc0VtcHR5KCkpCiAgICByZXR1cm4gY29tbWVudDsKICBlbHNlCiAgICByZXR1cm4gbVR5 cGUtPm5hbWUoKTsKfQoKUVN0cmluZyBLRmlsZUl0ZW06Omljb25OYW1lKCkKewogIHJldHVybiBk ZXRlcm1pbmVNaW1lVHlwZSgpLT5pY29uKG1fdXJsLCBmYWxzZSk7Cn0KClFQaXhtYXAgS0ZpbGVJ dGVtOjpwaXhtYXAoIGludCBfc2l6ZSwgaW50IF9zdGF0ZSApIGNvbnN0CnsKICBpZiAoICFtX3BN aW1lVHlwZSApCiAgewogICAgc3RhdGljIGNvbnN0IFFTdHJpbmcgJiBkZWZhdWx0Rm9sZGVySWNv biA9CiAgICAgICBLR2xvYmFsOjpzdGF0aWNRU3RyaW5nKEtNaW1lVHlwZTo6bWltZVR5cGUoICJp bm9kZS9kaXJlY3RvcnkiICktPktTZXJ2aWNlVHlwZTo6aWNvbigpKTsKICAgIGlmICggU19JU0RJ UiggbV9maWxlTW9kZSApICkKICAgICByZXR1cm4gRGVza3RvcEljb24oIGRlZmF1bHRGb2xkZXJJ Y29uLCBfc2l6ZSwgX3N0YXRlICk7CgogICAgcmV0dXJuIERlc2t0b3BJY29uKCAidW5rbm93biIs IF9zaXplLCBfc3RhdGUgKTsKICB9CgogIGlmICggbV9iTGluayApCiAgICAgIF9zdGF0ZSB8PSBL SWNvbjo6TGlua092ZXJsYXk7CgogIGlmICggIVNfSVNESVIoIG1fZmlsZU1vZGUgKSAvLyBMb2Nr ZWQgZGlycyBoYXZlIGEgc3BlY2lhbCBpY29uCiAgICAgICAmJiAhaXNSZWFkYWJsZSgpKQogICAg IF9zdGF0ZSB8PSBLSWNvbjo6TG9ja092ZXJsYXk7CgogIEtNaW1lVHlwZTo6UHRyIG1pbWU7CiAg Ly8gVXNlIGd1ZXNzZWQgbWltZXR5cGUgaWYgdGhlIG1haW4gb25lIGlzIGNsdWVsZXNzCiAgaWYg KCBtX3BNaW1lVHlwZS0+bmFtZSgpID09IEtNaW1lVHlwZTo6ZGVmYXVsdE1pbWVUeXBlKCkKICAg ICAgJiYgIWQtPm1fZ3Vlc3NlZE1pbWVUeXBlLmlzRW1wdHkoKSApCiAgICAgIG1pbWUgPSBLTWlt ZVR5cGU6Om1pbWVUeXBlKCBkLT5tX2d1ZXNzZWRNaW1lVHlwZSApOwogIGVsc2UKICAgICAgbWlt ZSA9IG1fcE1pbWVUeXBlOwoKICAvLyBTdXBwb3J0IGZvciBnemlwcGVkIGZpbGVzCiAgaWYgKCBt aW1lLT5uYW1lKCkgPT0gImFwcGxpY2F0aW9uL3gtZ3ppcCIgJiYgbV91cmwuZmlsZU5hbWUoKS5y aWdodCgzKSA9PSAiLmd6IiApCiAgewogICAgICBRU3RyaW5nIHN1YkZpbGVOYW1lID0gbV91cmwu cGF0aCgpLmxlZnQoIG1fdXJsLnBhdGgoKS5sZW5ndGgoKSAtIDMgKTsKICAgICAgLy9rZERlYnVn KCkgPDwgIktGaWxlSXRlbTo6cGl4bWFwIHN1YkZpbGVOYW1lPSIgPDwgc3ViRmlsZU5hbWUgPDwg ZW5kbDsKICAgICAgbWltZSA9IEtNaW1lVHlwZTo6ZmluZEJ5VVJMKCBzdWJGaWxlTmFtZSwgMCwg bV9iSXNMb2NhbFVSTCApOwogICAgICBfc3RhdGUgfD0gS0ljb246OlppcE92ZXJsYXk7CiAgfQoK ICBRUGl4bWFwIHAgPSBtaW1lLT5waXhtYXAoIG1fdXJsLCBLSWNvbjo6RGVza3RvcCwgX3NpemUs IF9zdGF0ZSApOwogIGlmIChwLmlzTnVsbCgpKQogICAgICBrZFdhcm5pbmcoKSA8PCAiUGl4bWFw IG5vdCBmb3VuZCBmb3IgbWltZXR5cGUgIiA8PCBtX3BNaW1lVHlwZS0+bmFtZSgpIDw8IGVuZGw7 CgogIHJldHVybiBwOwp9Cgpib29sIEtGaWxlSXRlbTo6aXNSZWFkYWJsZSgpIGNvbnN0CnsKICAv KgogIHN0cnVjdCBwYXNzd2QgKiB1c2VyID0gZ2V0cHd1aWQoIGdldGV1aWQoKSApOwogIGJvb2wg aXNNeUZpbGUgPSAoUVN0cmluZzo6ZnJvbUxvY2FsOEJpdCh1c2VyLT5wd19uYW1lKSA9PSBtX3Vz ZXIpOwogIC8vIFRoaXMgZ2V0cyB1Z2x5IGZvciB0aGUgZ3JvdXAuLi4uCiAgLy8gTWF5YmUgd2Ug d2FudCBhIHN0YXRpYyBRU3RyaW5nIGZvciB0aGUgdXNlciBhbmQgYSBzdGF0aWMgUVN0cmluZ0xp c3QKICAvLyBmb3IgdGhlIGdyb3Vwcy4uLiB0aGVuIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBkZWxl dGlvbiBwcm9wZXJseS4uLgogICovCgogIC8vIE5vIHJlYWQgcGVybWlzc2lvbiBhdCBhbGwKICBp ZiAoICEoU19JUlVTUiAmIG1fcGVybWlzc2lvbnMpICYmICEoU19JUkdSUCAmIG1fcGVybWlzc2lv bnMpICYmICEoU19JUk9USCAmIG1fcGVybWlzc2lvbnMpICkKICAgICAgcmV0dXJuIGZhbHNlOwoK ICAvLyBPciBpZiB3ZSBjYW4ndCByZWFkIGl0IFt1c2luZyBhY2Nlc3MoKV0gLSBub3QgbmV0d29y ayB0cmFuc3BhcmVudAogIGVsc2UgaWYgKCBtX2JJc0xvY2FsVVJMICYmIGFjY2VzcyggUUZpbGU6 OmVuY29kZU5hbWUobV91cmwucGF0aCgpKSwgUl9PSyApID09IC0xICkKICAgICAgcmV0dXJuIGZh bHNlOwoKICByZXR1cm4gdHJ1ZTsKfQoKCmJvb2wgS0ZpbGVJdGVtOjphY2NlcHRzRHJvcHMoKQp7 CiAgLy8gQSBkaXJlY3RvcnkgPwogIGlmICggU19JU0RJUiggbW9kZSgpICkgKQogIHsKICAgIGlm ICggbV9iSXNMb2NhbFVSTCApIC8vIGxvY2FsIC0+IGNoZWNrIGlmIHdlIGNhbiBlbnRlciBpdAog ICAgICAgcmV0dXJuIChhY2Nlc3MoIFFGaWxlOjplbmNvZGVOYW1lKG1fdXJsLnBhdGgoKSksIFhf T0sgKSA9PSAwKTsKICAgIGVsc2UKICAgICAgIHJldHVybiB0cnVlOyAvLyBhc3N1bWUgb2sgZm9y IHJlbW90ZSB1cmxzCiAgfQoKICAvLyBCdXQgb25seSBsb2NhbCAuZGVza3RvcCBmaWxlcyBhbmQg ZXhlY3V0YWJsZXMKICBpZiAoICFtX2JJc0xvY2FsVVJMICkKICAgIHJldHVybiBmYWxzZTsKCiAg aWYgKCBtaW1ldHlwZSgpID09ICJhcHBsaWNhdGlvbi94LWRlc2t0b3AiKQogICAgcmV0dXJuIHRy dWU7CgogIC8vIEV4ZWN1dGFibGUsIHNoZWxsIHNjcmlwdCAuLi4gPwogIGlmICggYWNjZXNzKCBR RmlsZTo6ZW5jb2RlTmFtZShtX3VybC5wYXRoKCkpLCBYX09LICkgPT0gMCApCiAgICByZXR1cm4g dHJ1ZTsKCiAgcmV0dXJuIGZhbHNlOwp9CgpRU3RyaW5nIEtGaWxlSXRlbTo6Z2V0U3RhdHVzQmFy SW5mbygpCnsKICBRU3RyaW5nIGNvbW1lbnQgPSBkZXRlcm1pbmVNaW1lVHlwZSgpLT5jb21tZW50 KCBtX3VybCwgZmFsc2UgKTsKICBRU3RyaW5nIHRleHQgPSBtX3N0clRleHQ7CiAgLy8gRXh0cmFj dCBmcm9tIHRoZSBLSU86OlVEU0VudHJ5IHRoZSBhZGRpdGlvbmFsIGluZm8gd2UgZGlkbid0IGdl dCBwcmV2aW91c2x5CiAgUVN0cmluZyBteUxpbmtEZXN0ID0gbGlua0Rlc3QoKTsKICBsb25nIG15 U2l6ZSA9IHNpemUoKTsKCiAgUVN0cmluZyB0ZXh0MiA9IHRleHQuY29weSgpOwoKICBpZiAoIG1f YkxpbmsgKQogIHsKICAgICAgUVN0cmluZyB0bXA7CiAgICAgIGlmICggY29tbWVudC5pc0VtcHR5 KCkgKQogICAgICAgIHRtcCA9IGkxOG4gKCAiU3ltYm9saWMgTGluayIgKTsKICAgICAgZWxzZQog ICAgICAgIHRtcCA9IGkxOG4oIiUxIChMaW5rKSIpLmFyZyhjb21tZW50KTsKICAgICAgdGV4dCAr PSAiLT4iOwogICAgICB0ZXh0ICs9IG15TGlua0Rlc3Q7CiAgICAgIHRleHQgKz0gIiAgIjsKICAg ICAgdGV4dCArPSB0bXA7CiAgfQogIGVsc2UgaWYgKCBTX0lTUkVHKCBtX2ZpbGVNb2RlICkgKQog IHsKICAgICAgdGV4dCA9IFFTdHJpbmcoIiUxICglMikiKS5hcmcodGV4dDIpLmFyZyggS0lPOjpj b252ZXJ0U2l6ZSggbXlTaXplICkgKTsKICAgICAgdGV4dCArPSAiICAiOwogICAgICB0ZXh0ICs9 IGNvbW1lbnQ7CiAgfQogIGVsc2UgaWYgKCBTX0lTRElSICggbV9maWxlTW9kZSApICkKICB7CiAg ICAgIHRleHQgKz0gIi8gICI7CiAgICAgIHRleHQgKz0gY29tbWVudDsKICAgIH0KICAgIGVsc2UK ICAgIHsKICAgICAgdGV4dCArPSAiICAiOwogICAgICB0ZXh0ICs9IGNvbW1lbnQ7CiAgICB9CiAg ICByZXR1cm4gdGV4dDsKfQoKdm9pZCBLRmlsZUl0ZW06OnJ1bigpCnsKICBLVVJMIHVybCggbV91 cmwgKTsKICBpZiAoIG1fYkxpbmsgKQogICAgdXJsID0gS1VSTCggbV91cmwsIGxpbmtEZXN0KCkg KTsKICAodm9pZCkgbmV3IEtSdW4oIHVybCwgbV9maWxlTW9kZSwgbV9iSXNMb2NhbFVSTCApOwp9 Cgpib29sIEtGaWxlSXRlbTo6Y21wKCBjb25zdCBLRmlsZUl0ZW0gJiBpdGVtICkKewogICAgcmV0 dXJuICggbV9zdHJOYW1lID09IGl0ZW0ubV9zdHJOYW1lCiAgICAgICAgICAgICAmJiBtX2JJc0xv Y2FsVVJMID09IGl0ZW0ubV9iSXNMb2NhbFVSTAogICAgICAgICAgICAgJiYgbV9maWxlTW9kZSA9 PSBpdGVtLm1fZmlsZU1vZGUKICAgICAgICAgICAgICYmIG1fcGVybWlzc2lvbnMgPT0gaXRlbS5t X3Blcm1pc3Npb25zCiAgICAgICAgICAgICAmJiBtX3VzZXIgPT0gaXRlbS5tX3VzZXIKICAgICAg ICAgICAgICYmIG1fZ3JvdXAgPT0gaXRlbS5tX2dyb3VwCiAgICAgICAgICAgICAmJiBtX2JMaW5r ID09IGl0ZW0ubV9iTGluawogICAgICAgICAgICAgJiYgc2l6ZSgpID09IGl0ZW0uc2l6ZSgpCiAg ICAgICAgICAgICAmJiB0aW1lKEtJTzo6VURTX01PRElGSUNBVElPTl9USU1FKSA9PSBpdGVtLnRp bWUoS0lPOjpVRFNfTU9ESUZJQ0FUSU9OX1RJTUUpICk7Cn0KCnZvaWQgS0ZpbGVJdGVtOjphc3Np Z24oIGNvbnN0IEtGaWxlSXRlbSAmIGl0ZW0gKQp7CiAgICBtX2VudHJ5ID0gaXRlbS5tX2VudHJ5 OwogICAgbV91cmwgPSBpdGVtLm1fdXJsOwogICAgbV9iSXNMb2NhbFVSTCA9IGl0ZW0ubV9iSXNM b2NhbFVSTDsKICAgIG1fc3RyTmFtZSA9IGl0ZW0ubV9zdHJOYW1lOwogICAgbV9zdHJUZXh0ID0g aXRlbS5tX3N0clRleHQ7CiAgICBtX2ZpbGVNb2RlID0gaXRlbS5tX2ZpbGVNb2RlOwogICAgbV9w ZXJtaXNzaW9ucyA9IGl0ZW0ubV9wZXJtaXNzaW9uczsKICAgIG1fdXNlciA9IGl0ZW0ubV91c2Vy OwogICAgbV9ncm91cCA9IGl0ZW0ubV9ncm91cDsKICAgIG1fYkxpbmsgPSBpdGVtLm1fYkxpbms7 CiAgICBtX3BNaW1lVHlwZSA9IGl0ZW0ubV9wTWltZVR5cGU7CiAgICBtX3N0ckxvd2VyQ2FzZU5h bWUgPSBpdGVtLm1fc3RyTG93ZXJDYXNlTmFtZTsKICAgICpkID0gKml0ZW0uZDsKICAgIC8vIFdl IGhhZCBhIG1pbWV0eXBlIHByZXZpb3VzbHkgKHByb2JhYmx5KSwgc28gd2UgbmVlZCB0byByZS1k ZXRlcm1pbmUgaXQKICAgIGRldGVybWluZU1pbWVUeXBlKCk7Cn0K --------------Boundary-00=_WH8VLHTBVGPGQ0AT8N4Y Content-Type: text/x-c++; charset="iso-8859-1"; name="file.cc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="file.cc" Ly8gJElkOiBmaWxlLmNjLHYgMS4xMDMuMi4xIDIwMDEvMDMvMTIgMTI6MTA6NTQgZmF1cmUgRXhw ICQKCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBfX2xpbnV4X18KI2lmbmRlZiBfR05VX1NP VVJDRQojZGVmaW5lIF9HTlVfU09VUkNFCiNlbmRpZgojaWZuZGVmIF9GSUxFX09GRlNFVF9CSVRT CiNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKI2VuZGlmCiNpbmNsdWRlIDxmZWF0dXJlcy5o PgojZW5kaWYKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNp bmNsdWRlIDxzeXMvc3RhdC5oPgojaWZkZWYgSEFWRV9TWVNfVElNRV9ICiNpbmNsdWRlIDxzeXMv dGltZS5oPgojZW5kaWYKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGRpcmVudC5oPgoj aW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxncnAuaD4KI2lu Y2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5j bHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2lm ZGVmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZW5kaWYKCiNpbmNsdWRlIDxx dmFsdWVsaXN0Lmg+CgojaW5jbHVkZSA8a3NocmVkLmg+CiNpbmNsdWRlIDxrZGVidWcuaD4KI2lu Y2x1ZGUgPGt1cmwuaD4KI2luY2x1ZGUgPGtwcm90b2NvbG1hbmFnZXIuaD4KI2luY2x1ZGUgPGtp bnN0YW5jZS5oPgojaW5jbHVkZSA8a3NpbXBsZWNvbmZpZy5oPgojaW5jbHVkZSA8a3RlbXBmaWxl Lmg+CiNpbmNsdWRlIDxrbG9jYWxlLmg+CiNpbmNsdWRlIDxxZmlsZS5oPgojaW5jbHVkZSA8cXN0 cmxpc3QuaD4KI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgPGxpbWl0cy5oPgoKdXNpbmcgbmFt ZXNwYWNlIEtJTzsKCiNkZWZpbmUgTUFYX0lQQ19TSVpFICgxMDI0KjMyKQoKUVN0cmluZyB0ZXN0 TG9nRmlsZSggY29uc3QgY2hhciAqX2ZpbGVuYW1lICk7CgpleHRlcm4gIkMiIHsgaW50IGtkZW1h aW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsgfQoKaW50IGtkZW1haW4oIGludCBhcmdjLCBjaGFy ICoqYXJndiApCnsKICBLSW5zdGFuY2UgaW5zdGFuY2UoICJraW9fZmlsZSIgKTsKCiAga2REZWJ1 Zyg3MTAxKSA8PCAiU3RhcnRpbmcgIiA8PCBnZXRwaWQoKSA8PCBlbmRsOwoKICBpZiAoYXJnYyAh PSA0KQogIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBraW9fZmlsZSBwcm90b2NvbCBk b21haW4tc29ja2V0MSBkb21haW4tc29ja2V0MlxuIik7CiAgICAgZXhpdCgtMSk7CiAgfQoKICBG aWxlUHJvdG9jb2wgc2xhdmUoYXJndlsyXSwgYXJndlszXSk7CiAgc2xhdmUuZGlzcGF0Y2hMb29w KCk7CgogIGtkRGVidWcoNzEwMSkgPDwgIkRvbmUiIDw8IGVuZGw7CiAgcmV0dXJuIDA7Cn0KCgpG aWxlUHJvdG9jb2w6OkZpbGVQcm90b2NvbCggY29uc3QgUUNTdHJpbmcgJnBvb2wsIGNvbnN0IFFD U3RyaW5nICZhcHAgKSA6IFNsYXZlQmFzZSggImZpbGUiLCBwb29sLCBhcHAgKQp7CiAgICB1c2Vy Y2FjaGUuc2V0QXV0b0RlbGV0ZSggVFJVRSApOwogICAgZ3JvdXBjYWNoZS5zZXRBdXRvRGVsZXRl KCBUUlVFICk7Cn0KCnZvaWQgRmlsZVByb3RvY29sOjpjaG1vZCggY29uc3QgS1VSTCYgdXJsLCBp bnQgcGVybWlzc2lvbnMgKQp7CiAgICBRQ1N0cmluZyBfcGF0aCggUUZpbGU6OmVuY29kZU5hbWUo dXJsLnBhdGgoKSkpOwogICAgaWYgKCA6OmNobW9kKCBfcGF0aC5kYXRhKCksIHBlcm1pc3Npb25z ICkgPT0gLTEgKQogICAgICAgIGVycm9yKCBLSU86OkVSUl9DQU5OT1RfQ0hNT0QsIHVybC5wYXRo KCkgKTsKICAgIGVsc2UKICAgICAgICBmaW5pc2hlZCgpOwp9Cgp2b2lkIEZpbGVQcm90b2NvbDo6 bWtkaXIoIGNvbnN0IEtVUkwmIHVybCwgaW50IHBlcm1pc3Npb25zICkKewogICAgUUNTdHJpbmcg X3BhdGgoIFFGaWxlOjplbmNvZGVOYW1lKHVybC5wYXRoKCkpKTsKI2lmZGVmIHN1bgogICAgc3Ry dWN0IHN0YXQ2NCBidWZmOwogICAgaWYgKCBzdGF0NjQoIF9wYXRoLmRhdGEoKSwgJmJ1ZmYgKSA9 PSAtMSApIHsKI2Vsc2UKICAgIHN0cnVjdCBzdGF0IGJ1ZmY7CiAgICBpZiAoIDo6c3RhdCggX3Bh dGguZGF0YSgpLCAmYnVmZiApID09IC0xICkgewojZW5kaWYKCWlmICggOjpta2RpciggX3BhdGgu ZGF0YSgpLCAwNzc3IC8qdW1hc2sgd2lsbCBiZSBhcHBsaWVkKi8gKSAhPSAwICkgewoJICAgIGlm ICggZXJybm8gPT0gRUFDQ0VTICkgewoJCWVycm9yKCBLSU86OkVSUl9BQ0NFU1NfREVOSUVELCB1 cmwucGF0aCgpICk7CgkJcmV0dXJuOwoJICAgIH0gZWxzZSB7CgkJZXJyb3IoIEtJTzo6RVJSX0NP VUxEX05PVF9NS0RJUiwgdXJsLnBhdGgoKSApOwoJCXJldHVybjsKCSAgICB9Cgl9IGVsc2UgewoJ ICAgIGlmICggcGVybWlzc2lvbnMgIT0gLTEgKQoJICAgICAgICBjaG1vZCggdXJsLCBwZXJtaXNz aW9ucyApOwoJICAgIGVsc2UKCSAgICAgICAgZmluaXNoZWQoKTsKCSAgICByZXR1cm47Cgl9CiAg ICB9CgogICAgaWYgKCBTX0lTRElSKCBidWZmLnN0X21vZGUgKSApIHsKCWtkRGVidWcoKSA8PCAi RVJSX0RJUl9BTFJFQURZX0VYSVNUIiA8PCBlbmRsOwoJZXJyb3IoIEtJTzo6RVJSX0RJUl9BTFJF QURZX0VYSVNULCB1cmwucGF0aCgpICk7CglyZXR1cm47CiAgICB9CiAgICBlcnJvciggS0lPOjpF UlJfRklMRV9BTFJFQURZX0VYSVNULCB1cmwucGF0aCgpICk7CiAgICByZXR1cm47Cn0KCnZvaWQg RmlsZVByb3RvY29sOjpnZXQoIGNvbnN0IEtVUkwmIHVybCApCnsKICAgIFFDU3RyaW5nIF9wYXRo KCBRRmlsZTo6ZW5jb2RlTmFtZSh1cmwucGF0aCgpKSk7CiNpZmRlZiBzdW4KICAgIHN0cnVjdCBz dGF0NjQgYnVmZjsKICAgIGlmICggc3RhdDY0KCBfcGF0aC5kYXRhKCksICZidWZmICkgPT0gLTEg KSB7CiNlbHNlCiAgICBzdHJ1Y3Qgc3RhdCBidWZmOwogICAgaWYgKCA6OnN0YXQoIF9wYXRoLmRh dGEoKSwgJmJ1ZmYgKSA9PSAtMSApIHsKI2VuZGlmCiAgICAgICAgaWYgKCBlcnJubyA9PSBFQUND RVMgKQogICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9BQ0NFU1NfREVOSUVELCB1cmwucGF0aCgp ICk7CiAgICAgICAgZWxzZQogICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9ET0VTX05PVF9FWElT VCwgdXJsLnBhdGgoKSApOwoJcmV0dXJuOwogICAgfQoKICAgIGlmICggU19JU0RJUiggYnVmZi5z dF9tb2RlICkgKSB7CgllcnJvciggS0lPOjpFUlJfSVNfRElSRUNUT1JZLCB1cmwucGF0aCgpICk7 CglyZXR1cm47CiAgICB9CiAgICBpZiAoIFNfSVNGSUZPKCBidWZmLnN0X21vZGUgKSB8fCBTX0lT U09DSyAoIGJ1ZmYuc3RfbW9kZSApICkgewoJZXJyb3IoIEtJTzo6RVJSX0NBTk5PVF9PUEVOX0ZP Ul9SRUFESU5HLCB1cmwucGF0aCgpICk7CglyZXR1cm47CiAgICB9CgogICAgaW50IGZkID0gb3Bl biggX3BhdGguZGF0YSgpLCBPX1JET05MWSk7CiAgICBpZiAoIGZkIDwgMCApIHsKCWVycm9yKCBL SU86OkVSUl9DQU5OT1RfT1BFTl9GT1JfUkVBRElORywgdXJsLnBhdGgoKSApOwoJcmV0dXJuOwog ICAgfQoKICAgIHRvdGFsU2l6ZSggYnVmZi5zdF9zaXplICk7CiAgICBpbnQgcHJvY2Vzc2VkX3Np emUgPSAwOwogICAgdGltZV90IHRfc3RhcnQgPSB0aW1lKCAwTCApOwogICAgdGltZV90IHRfbGFz dCA9IHRfc3RhcnQ7CgogICAgY2hhciBidWZmZXJbIE1BWF9JUENfU0laRSBdOwogICAgUUJ5dGVB cnJheSBhcnJheTsKCiAgICB3aGlsZSggMSApCiAgICB7CiAgICAgICBpbnQgbiA9IDo6cmVhZCgg ZmQsIGJ1ZmZlciwgTUFYX0lQQ19TSVpFICk7CiAgICAgICBpZiAobiA9PSAtMSkKICAgICAgIHsK ICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikKICAgICAgICAgICAgICBjb250aW51ZTsKICAg ICAgICAgIGVycm9yKCBLSU86OkVSUl9DT1VMRF9OT1RfUkVBRCwgdXJsLnBhdGgoKSk7CiAgICAg ICAgICBjbG9zZShmZCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBpZiAobiA9 PSAwKQogICAgICAgICAgYnJlYWs7IC8vIEZpbmlzaGVkCgogICAgICAgYXJyYXkuc2V0UmF3RGF0 YShidWZmZXIsIG4pOwogICAgICAgZGF0YSggYXJyYXkgKTsKICAgICAgIGFycmF5LnJlc2V0UmF3 RGF0YShidWZmZXIsIG4pOwoKICAgICAgIHByb2Nlc3NlZF9zaXplICs9IG47CiAgICAgICB0aW1l X3QgdCA9IHRpbWUoIDBMICk7CiAgICAgICBpZiAoIHQgLSB0X2xhc3QgPj0gMSApCiAgICAgICB7 CiAgICAgICAgICBwcm9jZXNzZWRTaXplKCBwcm9jZXNzZWRfc2l6ZSApOwogICAgICAgICAgc3Bl ZWQoIHByb2Nlc3NlZF9zaXplIC8gKCB0IC0gdF9zdGFydCApICk7CiAgICAgICAgICB0X2xhc3Qg PSB0OwogICAgICAgfQogICAgfQoKICAgIGRhdGEoIFFCeXRlQXJyYXkoKSApOwoKICAgIGNsb3Nl KCBmZCApOwoKICAgIHByb2Nlc3NlZFNpemUoIGJ1ZmYuc3Rfc2l6ZSApOwogICAgdGltZV90IHQg PSB0aW1lKCAwTCApOwogICAgaWYgKCB0IC0gdF9zdGFydCA+PSAxICkKCXNwZWVkKCBwcm9jZXNz ZWRfc2l6ZSAvICggdCAtIHRfc3RhcnQgKSApOwoKICAgIGZpbmlzaGVkKCk7Cn0KCnN0YXRpYyBp bnQKd3JpdGVfYWxsKGludCBmZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQp7CiAgIHdo aWxlIChsZW4gPiAwKQogICB7CiAgICAgIGludCB3cml0dGVuID0gd3JpdGUoZmQsIGJ1ZiwgbGVu KTsKICAgICAgaWYgKHdyaXR0ZW4gPCAwKQogICAgICB7CiAgICAgICAgICBpZiAoZXJybm8gPT0g RUlOVFIpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAg fQogICAgICBidWYgKz0gd3JpdHRlbjsKICAgICAgbGVuIC09IHdyaXR0ZW47CiAgIH0KICAgcmV0 dXJuIDA7Cn0KCnZvaWQgRmlsZVByb3RvY29sOjpwdXQoIGNvbnN0IEtVUkwmIHVybCwgaW50IF9t b2RlLCBib29sIF9vdmVyd3JpdGUsIGJvb2wgX3Jlc3VtZSApCnsKICAgIFFTdHJpbmcgZGVzdF9v cmlnID0gdXJsLnBhdGgoKTsKICAgIFFDU3RyaW5nIF9kZXN0X29yaWcoIFFGaWxlOjplbmNvZGVO YW1lKGRlc3Rfb3JpZykpOwogICAga2REZWJ1ZyggNzEwMSApIDw8ICJQdXQgIiA8PCBkZXN0X29y aWcgPDwgZW5kbDsKICAgIFFTdHJpbmcgZGVzdF9wYXJ0KCBkZXN0X29yaWcgKTsKICAgIGRlc3Rf cGFydCArPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCIucGFydCIpOwogICAgUUNTdHJpbmcgX2Rlc3Rf cGFydCggUUZpbGU6OmVuY29kZU5hbWUoZGVzdF9wYXJ0KSk7CgogICAgYm9vbCBiTWFya1BhcnRp YWwgPSBLUHJvdG9jb2xNYW5hZ2VyOjptYXJrUGFydGlhbCgpOwoKI2lmZGVmIHN1bgogICAgc3Ry dWN0IHN0YXQ2NCBidWZmX29yaWc7CiAgICBib29sIG9yaWdfZXhpc3RzID0gKCBzdGF0NjQoIF9k ZXN0X29yaWcuZGF0YSgpLCAmYnVmZl9vcmlnICkgIT0gLTEgKTsKI2Vsc2UKICAgIHN0cnVjdCBz dGF0IGJ1ZmZfb3JpZzsKICAgIGJvb2wgb3JpZ19leGlzdHMgPSAoIDo6c3RhdCggX2Rlc3Rfb3Jp Zy5kYXRhKCksICZidWZmX29yaWcgKSAhPSAtMSApOwojZW5kaWYKICAgIGlmICggb3JpZ19leGlz dHMgJiYgICFfb3ZlcndyaXRlICYmICFfcmVzdW1lKQogICAgewogICAgICAgIGlmIChTX0lTRElS KGJ1ZmZfb3JpZy5zdF9tb2RlKSkKICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfRElSX0FMUkVB RFlfRVhJU1QsIGRlc3Rfb3JpZyApOwogICAgICAgIGVsc2UKICAgICAgICAgICBlcnJvciggS0lP OjpFUlJfRklMRV9BTFJFQURZX0VYSVNULCBkZXN0X29yaWcgKTsKICAgICAgICByZXR1cm47CiAg ICB9CgogICAgUVN0cmluZyBkZXN0OwogICAgaWYgKGJNYXJrUGFydGlhbCkKICAgIHsKICAgICAg ICBrZERlYnVnKDcxMDEpIDw8ICJBcHBlbmRpbmcgLnBhcnQgZXh0ZW5zaW9uIHRvICIgPDwgZGVz dF9vcmlnIDw8IGVuZGw7CiAgICAgICAgZGVzdCA9IGRlc3RfcGFydDsKCiNpZmRlZiBzdW4KICAg ICAgICBzdHJ1Y3Qgc3RhdDY0IGJ1ZmZfcGFydDsKICAgICAgICBib29sIHBhcnRfZXhpc3RzID0g KCBzdGF0NjQoIF9kZXN0X3BhcnQuZGF0YSgpLCAmYnVmZl9wYXJ0ICkgIT0gLTEgKTsKI2Vsc2UK ICAgICAgICBzdHJ1Y3Qgc3RhdCBidWZmX3BhcnQ7CiAgICAgICAgYm9vbCBwYXJ0X2V4aXN0cyA9 ICggOjpzdGF0KCBfZGVzdF9wYXJ0LmRhdGEoKSwgJmJ1ZmZfcGFydCApICE9IC0xICk7CiNlbmRp ZgogICAgICAgIGlmICggcGFydF9leGlzdHMgJiYgIV9yZXN1bWUgJiYgYnVmZl9wYXJ0LnN0X3Np emUgPiAwICkKICAgICAgICB7CiAgICAgICAgICAgIGtkRGVidWcoKSA8PCAiRmlsZVByb3RvY29s OjpwdXQgOiBjYWxsaW5nIGNhblJlc3VtZSB3aXRoICIgPDwgKHVuc2lnbmVkIGxvbmcpYnVmZl9w YXJ0LnN0X3NpemUgPDwgZW5kbDsKICAgICAgICAgICAgIC8vIE1heWJlIHdlIGNhbiB1c2UgdGhp cyBwYXJ0aWFsIGZpbGUgZm9yIHJlc3VtaW5nCiAgICAgICAgICAgICAvLyBUZWxsIGFib3V0IHRo ZSBzaXplIHdlIGhhdmUsIGFuZCB0aGUgYXBwIHdpbGwgdGVsbCB1cwogICAgICAgICAgICAgLy8g aWYgaXQncyBvayB0byByZXN1bWUgb3Igbm90LgogICAgICAgICAgICAgX3Jlc3VtZSA9IGNhblJl c3VtZSggYnVmZl9wYXJ0LnN0X3NpemUgKTsKCiAgICAgICAgICAgICBrZERlYnVnKCkgPDwgIkZp bGVQcm90b2NvbDo6cHV0IGdvdCBhbnN3ZXIgIiA8PCBfcmVzdW1lIDw8IGVuZGw7CgogICAgICAg ICAgICAgaWYgKCFfcmVzdW1lKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGtkRGVi dWcoNzEwMSkgPDwgIkRlbGV0aW5nIHBhcnRpYWwgZmlsZSAiIDw8IGRlc3RfcGFydCA8PCBlbmRs OwogICAgICAgICAgICAgICAgIGlmICggISByZW1vdmUoIF9kZXN0X3BhcnQuZGF0YSgpICkgKSB7 CiAgICAgICAgICAgICAgICAgICAgIHBhcnRfZXhpc3RzID0gZmFsc2U7CiAgICAgICAgICAgICAg ICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0NBTk5PVF9E RUxFVEVfUEFSVElBTCwgZGVzdF9wYXJ0ICk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsK ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxz ZQogICAgewogICAgICAgZGVzdCA9IGRlc3Rfb3JpZzsKICAgICAgIGlmICggb3JpZ19leGlzdHMg JiYgIV9yZXN1bWUgKQogICAgICAgIHsKICAgICAgICAgICAgIGtkRGVidWcoNzEwMSkgPDwgIkRl bGV0aW5nIGRlc3RpbmF0aW9uIGZpbGUgIiA8PCBkZXN0X3BhcnQgPDwgZW5kbDsKICAgICAgICAg ICAgIHJlbW92ZSggX2Rlc3Rfb3JpZy5kYXRhKCkgKTsKICAgICAgICAgICAgIC8vIENhdGNoIGVy cm9ycyB3aGVuIHdlIHRyeSB0byBvcGVuIHRoZSBmaWxlLgogICAgICAgIH0KICAgIH0KICAgIFFD U3RyaW5nIF9kZXN0KCBRRmlsZTo6ZW5jb2RlTmFtZShkZXN0KSk7CgogICAgaW50IGZkOwoKICAg IGlmICggX3Jlc3VtZSApIHsKICAgICAgICBmZCA9IG9wZW4oIF9kZXN0LmRhdGEoKSwgT19SRFdS ICk7ICAvLyBhcHBlbmQgaWYgcmVzdW1pbmcKICAgICAgICBsc2VlayhmZCwgMCwgU0VFS19FTkQp OyAvLyBTZWVrIHRvIGVuZAogICAgfSBlbHNlIHsKICAgICAgICAvLyBXQUJBOiBNYWtlIHN1cmUg dGhhdCB3ZSBrZWVwIHdyaXRpbmcgcGVybWlzc2lvbnMgb3Vyc2VsdmVzLAogICAgICAgIC8vIG90 aGVyd2lzZSB3ZSBjYW4gYmUgaW4gZm9yIGEgc3VycHJpc2Ugb24gTkZTLgogICAgICAgIG1vZGVf dCBpbml0aWFsTW9kZTsKICAgICAgICBpZiAoX21vZGUgIT0gLTEpCiAgICAgICAgICAgaW5pdGlh bE1vZGUgPSBfbW9kZSB8IFNfSVdVU1IgfCBTX0lSVVNSOwogICAgICAgIGVsc2UKICAgICAgICAg ICBpbml0aWFsTW9kZSA9IDA2NjY7CgogICAgICAgIGZkID0gb3BlbihfZGVzdC5kYXRhKCksIE9f Q1JFQVQgfCBPX1RSVU5DIHwgT19XUk9OTFksIGluaXRpYWxNb2RlKTsKICAgIH0KCiAgICBpZiAo IGZkIDwgMCApIHsKCWtkRGVidWcoNzEwMSkgPDwgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENP VUxEIE5PVCBXUklURSAiIDw8IGRlc3QgPDwgX21vZGUgPDwgZW5kbDsKCWtkRGVidWcoNzEwMSkg PDwgImVycm5vPT0iIDw8IGVycm5vIDw8ICIoIiA8PCBzdHJlcnJvcihlcnJubykgPDwgIikiIDw8 IGVuZGw7CiAgICAgICAgaWYgKCBlcnJubyA9PSBFQUNDRVMgKSB7CiAgICAgICAgICAgIGVycm9y KCBLSU86OkVSUl9XUklURV9BQ0NFU1NfREVOSUVELCBkZXN0ICk7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0NBTk5PVF9PUEVOX0ZPUl9XUklUSU5HLCBkZXN0 ICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgcmVzdWx0OwogICAg Ly8gTG9vcCB1bnRpbCB3ZSBnb3QgMCAoZW5kIG9mIGRhdGEpCiAgICBkbwogICAgewogICAgICBR Qnl0ZUFycmF5IGJ1ZmZlcjsKICAgICAgZGF0YVJlcSgpOyAvLyBSZXF1ZXN0IGZvciBkYXRhCiAg ICAgIHJlc3VsdCA9IHJlYWREYXRhKCBidWZmZXIgKTsKICAgICAgaWYgKHJlc3VsdCA+IDApCiAg ICAgIHsKICAgICAgICAgaWYgKHdyaXRlX2FsbCggZmQsIGJ1ZmZlci5kYXRhKCksIGJ1ZmZlci5z aXplKCkpKQogICAgICAgICB7CiAgICAgICAgICAgIGlmICggZXJybm8gPT0gRU5PU1BDICkgLy8g ZGlzayBmdWxsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfRElT S19GVUxMLCBkZXN0X29yaWcpOwogICAgICAgICAgICAgIHJlc3VsdCA9IC0yOyAvLyBtZWFuczog cmVtb3ZlIGRlc3QgZmlsZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAg ICAgewogICAgICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9DT1VMRF9OT1RfV1JJVEUsIGRlc3Rf b3JpZyk7CiAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAg fQogICAgICB9CiAgICB9CiAgICB3aGlsZSAoIHJlc3VsdCA+IDAgKTsKCgogICAgaWYgKHJlc3Vs dCAhPSAwKQogICAgewogICAgICAgIGNsb3NlKGZkKTsKCWtkRGVidWcoNzEwMSkgPDwgIkVycm9y IGR1cmluZyAncHV0Jy4gQWJvcnRpbmcuIiA8PCBlbmRsOwogICAgICAgIGlmIChyZXN1bHQgPT0g LTIpCiAgICAgICAgewoJICAgcmVtb3ZlKF9kZXN0LmRhdGEoKSk7CiAgICAgICAgfSBlbHNlIGlm IChiTWFya1BhcnRpYWwpCiAgICAgICAgewojaWZkZWYgc3VuCiAgICAgICAgICAgc3RydWN0IHN0 YXQ2NCBidWZmOwogICAgICAgICAgIGlmICgoIHN0YXQ2NCggX2Rlc3QuZGF0YSgpLCAmYnVmZiAp ID09IC0xICkgfHwKICAgICAgICAgICAgICAgKCBidWZmLnN0X3NpemUgPCBLUHJvdG9jb2xNYW5h Z2VyOjptaW5pbXVtS2VlcFNpemUoKSApKQojZWxzZQogICAgICAgICAgIHN0cnVjdCBzdGF0IGJ1 ZmY7CiAgICAgICAgICAgaWYgKCggOjpzdGF0KCBfZGVzdC5kYXRhKCksICZidWZmICkgPT0gLTEg KSB8fAogICAgICAgICAgICAgICAoIGJ1ZmYuc3Rfc2l6ZSA8IEtQcm90b2NvbE1hbmFnZXI6Om1p bmltdW1LZWVwU2l6ZSgpICkpCiNlbmRpZgogICAgICAgICAgIHsKCSAgICAgICByZW1vdmUoX2Rl c3QuZGF0YSgpKTsKICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIDo6ZXhpdCgyNTUpOwog ICAgfQoKICAgIGlmICggY2xvc2UoZmQpICkKICAgIHsKICAgICAgICBlcnJvciggS0lPOjpFUlJf Q09VTERfTk9UX1dSSVRFLCBkZXN0X29yaWcpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAv LyBhZnRlciBmdWxsIGRvd25sb2FkIHJlbmFtZSB0aGUgZmlsZSBiYWNrIHRvIG9yaWdpbmFsIG5h bWUKICAgIGlmICggYk1hcmtQYXJ0aWFsICkKICAgIHsKICAgICAgIGlmICggOjpyZW5hbWUoIF9k ZXN0LmRhdGEoKSwgX2Rlc3Rfb3JpZy5kYXRhKCkgKSApCiAgICAgICB7CiAgICAgICAgICAga2RX YXJuaW5nKDcxMDEpIDw8ICIgQ291bGRuJ3QgcmVuYW1lICIgPDwgX2Rlc3QgPDwgIiB0byAiIDw8 IF9kZXN0X29yaWcgPDwgZW5kbDsKICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfQ0FOTk9UX1JF TkFNRV9QQVJUSUFMLCBkZXN0X29yaWcgKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICB9CiAg ICB9CgogICAgLy8gc2V0IGZpbmFsIHBlcm1pc3Npb25zLCBpZiB0aGUgZmlsZSB3YXMganVzdCBj cmVhdGVkCiAgICBpZiAoIF9tb2RlICE9IC0xICYmICFvcmlnX2V4aXN0cyApCiAgICB7CiAgICAg ICBpZiAoOjpjaG1vZChfZGVzdF9vcmlnLmRhdGEoKSwgX21vZGUpICE9IDApCiAgICAgICB7CiAg ICAgICAgICAgd2FybmluZyggaTE4biggIkNvdWxkIG5vdCBjaGFuZ2UgcGVybWlzc2lvbnMgZm9y XG4lMSIgKS5hcmcoIGRlc3Rfb3JpZyApICk7CiAgICAgICB9CiAgICB9CgogICAgLy8gV2UgaGF2 ZSBkb25lIG91ciBqb2IgPT4gZmluaXNoCiAgICBmaW5pc2hlZCgpOwp9CgoKdm9pZCBGaWxlUHJv dG9jb2w6OmNvcHkoIGNvbnN0IEtVUkwgJnNyYywgY29uc3QgS1VSTCAmZGVzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgIGludCBfbW9kZSwgYm9vbCBfb3ZlcndyaXRlICkKewogICAgUUNTdHJp bmcgX3NyYyggUUZpbGU6OmVuY29kZU5hbWUoc3JjLnBhdGgoKSkpOwogICAgUUNTdHJpbmcgX2Rl c3QoIFFGaWxlOjplbmNvZGVOYW1lKGRlc3QucGF0aCgpKSk7CiNpZmRlZiBzdW4KICAgIHN0cnVj dCBzdGF0NjQgYnVmZl9zcmM7CiAgICBpZiAoIHN0YXQ2NCggX3NyYy5kYXRhKCksICZidWZmX3Ny YyApID09IC0xICkgewojZWxzZQogICAgc3RydWN0IHN0YXQgYnVmZl9zcmM7CiAgICBpZiAoIDo6 c3RhdCggX3NyYy5kYXRhKCksICZidWZmX3NyYyApID09IC0xICkgewojZW5kaWYKICAgICAgICBp ZiAoIGVycm5vID09IEVBQ0NFUyApCiAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0FDQ0VTU19E RU5JRUQsIHNyYy5wYXRoKCkgKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgZXJyb3IoIEtJTzo6 RVJSX0RPRVNfTk9UX0VYSVNULCBzcmMucGF0aCgpICk7CglyZXR1cm47CiAgICB9CgogICAgaWYg KCBTX0lTRElSKCBidWZmX3NyYy5zdF9tb2RlICkgKSB7CgllcnJvciggS0lPOjpFUlJfSVNfRElS RUNUT1JZLCBzcmMucGF0aCgpICk7CglyZXR1cm47CiAgICB9CiAgICBpZiAoIFNfSVNGSUZPKCBi dWZmX3NyYy5zdF9tb2RlICkgfHwgU19JU1NPQ0sgKCBidWZmX3NyYy5zdF9tb2RlICkgKSB7Cgll cnJvciggS0lPOjpFUlJfQ0FOTk9UX09QRU5fRk9SX1JFQURJTkcsIHNyYy5wYXRoKCkgKTsKCXJl dHVybjsKICAgIH0KCiNpZmRlZiBzdW4KICAgIHN0cnVjdCBzdGF0NjQgYnVmZl9kZXN0OwogICAg Ym9vbCBkZXN0X2V4aXN0cyA9ICggc3RhdDY0KCBfZGVzdC5kYXRhKCksICZidWZmX2Rlc3QgKSAh PSAtMSApOwojZWxzZQogICAgc3RydWN0IHN0YXQgYnVmZl9kZXN0OwogICAgYm9vbCBkZXN0X2V4 aXN0cyA9ICggOjpzdGF0KCBfZGVzdC5kYXRhKCksICZidWZmX2Rlc3QgKSAhPSAtMSApOwojZW5k aWYKICAgIGlmICggZGVzdF9leGlzdHMgKQogICAgewogICAgICAgIGlmIChTX0lTRElSKGJ1ZmZf ZGVzdC5zdF9tb2RlKSkKICAgICAgICB7CiAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0RJUl9B TFJFQURZX0VYSVNULCBkZXN0LnBhdGgoKSApOwogICAgICAgICAgIHJldHVybjsKICAgICAgICB9 CgogICAgICAgIGlmICghX292ZXJ3cml0ZSkKICAgICAgICB7CiAgICAgICAgICAgZXJyb3IoIEtJ Tzo6RVJSX0ZJTEVfQUxSRUFEWV9FWElTVCwgZGVzdC5wYXRoKCkgKTsKICAgICAgICAgICByZXR1 cm47CiAgICAgICAgfQogICAgfQoKICAgIGludCBzcmNfZmQgPSBvcGVuKCBfc3JjLmRhdGEoKSwg T19SRE9OTFkpOwogICAgaWYgKCBzcmNfZmQgPCAwICkgewoJZXJyb3IoIEtJTzo6RVJSX0NBTk5P VF9PUEVOX0ZPUl9SRUFESU5HLCBzcmMucGF0aCgpICk7CglyZXR1cm47CiAgICB9CgogICAgLy8g V0FCQTogTWFrZSBzdXJlIHRoYXQgd2Uga2VlcCB3cml0aW5nIHBlcm1pc3Npb25zIG91cnNlbHZl cywKICAgIC8vIG90aGVyd2lzZSB3ZSBjYW4gYmUgaW4gZm9yIGEgc3VycHJpc2Ugb24gTkZTLgog ICAgbW9kZV90IGluaXRpYWxNb2RlOwogICAgaWYgKF9tb2RlICE9IC0xKQogICAgICAgaW5pdGlh bE1vZGUgPSBfbW9kZSB8IFNfSVdVU1I7CiAgICBlbHNlCiAgICAgICBpbml0aWFsTW9kZSA9IDA2 NjY7CgogICAgaW50IGRlc3RfZmQgPSBvcGVuKF9kZXN0LmRhdGEoKSwgT19DUkVBVCB8IE9fVFJV TkMgfCBPX1dST05MWSwgaW5pdGlhbE1vZGUpOwogICAgaWYgKCBkZXN0X2ZkIDwgMCApIHsKCWtk RGVidWcoNzEwMSkgPDwgIiMjIyMjIyBDT1VMRCBOT1QgV1JJVEUgIiA8PCBkZXN0LnVybCgpIDw8 IGVuZGw7CiAgICAgICAgaWYgKCBlcnJubyA9PSBFQUNDRVMgKSB7CiAgICAgICAgICAgIGVycm9y KCBLSU86OkVSUl9XUklURV9BQ0NFU1NfREVOSUVELCBkZXN0LnBhdGgoKSApOwogICAgICAgIH0g ZWxzZSB7CiAgICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9DQU5OT1RfT1BFTl9GT1JfV1JJVElO RywgZGVzdC5wYXRoKCkgKTsKICAgICAgICB9CiAgICAgICAgY2xvc2Uoc3JjX2ZkKTsKICAgICAg ICByZXR1cm47CiAgICB9CgogICAgdG90YWxTaXplKCBidWZmX3NyYy5zdF9zaXplICk7CiAgICBp bnQgcHJvY2Vzc2VkX3NpemUgPSAwOwogICAgdGltZV90IHRfc3RhcnQgPSB0aW1lKCAwTCApOwog ICAgdGltZV90IHRfbGFzdCA9IHRfc3RhcnQ7CgogICAgY2hhciBidWZmZXJbIE1BWF9JUENfU0la RSBdOwogICAgUUJ5dGVBcnJheSBhcnJheTsKCiAgICB3aGlsZSggMSApCiAgICB7CiAgICAgICBp bnQgbiA9IDo6cmVhZCggc3JjX2ZkLCBidWZmZXIsIE1BWF9JUENfU0laRSApOwogICAgICAgaWYg KG4gPT0gLTEpCiAgICAgICB7CiAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCiAgICAgICAg ICAgICAgY29udGludWU7CiAgICAgICAgICBlcnJvciggS0lPOjpFUlJfQ09VTERfTk9UX1JFQUQs IHNyYy5wYXRoKCkpOwogICAgICAgICAgY2xvc2Uoc3JjX2ZkKTsKICAgICAgICAgIGNsb3NlKGRl c3RfZmQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgaWYgKG4gPT0gMCkKICAg ICAgICAgIGJyZWFrOyAvLyBGaW5pc2hlZAoKICAgICAgIGlmICh3cml0ZV9hbGwoIGRlc3RfZmQs IGJ1ZmZlciwgbikpCiAgICAgICB7CiAgICAgICAgICBjbG9zZShzcmNfZmQpOwogICAgICAgICAg Y2xvc2UoZGVzdF9mZCk7CiAgICAgICAgICBpZiAoIGVycm5vID09IEVOT1NQQyApIC8vIGRpc2sg ZnVsbAogICAgICAgICAgewogICAgICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9ESVNLX0ZVTEws IGRlc3QucGF0aCgpKTsKICAgICAgICAgICAgICByZW1vdmUoIF9kZXN0LmRhdGEoKSApOwogICAg ICAgICAgfQogICAgICAgICAgZWxzZQogICAgICAgICAgewogICAgICAgICAgICAgIGVycm9yKCBL SU86OkVSUl9DT1VMRF9OT1RfV1JJVEUsIGRlc3QucGF0aCgpKTsKICAgICAgICAgIH0KICAgICAg ICAgIHJldHVybjsKICAgICAgIH0KCiAgICAgICBwcm9jZXNzZWRfc2l6ZSArPSBuOwogICAgICAg dGltZV90IHQgPSB0aW1lKCAwTCApOwogICAgICAgaWYgKCB0IC0gdF9sYXN0ID49IDEgKQogICAg ICAgewogICAgICAgICAgcHJvY2Vzc2VkU2l6ZSggcHJvY2Vzc2VkX3NpemUgKTsKCSAgc3BlZWQo IHByb2Nlc3NlZF9zaXplIC8gKCB0IC0gdF9zdGFydCApICk7CgkgIHRfbGFzdCA9IHQ7CiAgICAg ICB9CiAgICB9CgogICAgY2xvc2UoIHNyY19mZCApOwoKICAgIGlmIChjbG9zZSggZGVzdF9mZCkp CiAgICB7CiAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0NPVUxEX05PVF9XUklURSwgZGVzdC5wYXRo KCkpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBzZXQgZmluYWwgcGVybWlzc2lvbnMK ICAgIGlmICggX21vZGUgIT0gLTEgKQogICAgewogICAgICAgaWYgKDo6Y2htb2QoX2Rlc3QuZGF0 YSgpLCBfbW9kZSkgIT0gMCkKICAgICAgIHsKICAgICAgICAgICB3YXJuaW5nKCBpMThuKCAiQ291 bGQgbm90IGNoYW5nZSBwZXJtaXNzaW9ucyBmb3JcbiUxIiApLmFyZyggZGVzdC5wYXRoKCkgKSAp OwogICAgICAgfQogICAgfQoKICAgIHByb2Nlc3NlZFNpemUoIGJ1ZmZfc3JjLnN0X3NpemUgKTsK ICAgIHRpbWVfdCB0ID0gdGltZSggMEwgKTsKICAgIGlmICggdCAtIHRfc3RhcnQgPj0gMSApCglz cGVlZCggcHJvY2Vzc2VkX3NpemUgLyAoIHQgLSB0X3N0YXJ0ICkgKTsKCiAgICBmaW5pc2hlZCgp Owp9Cgp2b2lkIEZpbGVQcm90b2NvbDo6cmVuYW1lKCBjb25zdCBLVVJMICZzcmMsIGNvbnN0IEtV UkwgJmRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX292ZXJ3cml0ZSApCnsK ICAgIFFDU3RyaW5nIF9zcmMoIFFGaWxlOjplbmNvZGVOYW1lKHNyYy5wYXRoKCkpKTsKICAgIFFD U3RyaW5nIF9kZXN0KCBRRmlsZTo6ZW5jb2RlTmFtZShkZXN0LnBhdGgoKSkpOwojaWZkZWYgc3Vu CiAgICBzdHJ1Y3Qgc3RhdDY0IGJ1ZmZfc3JjOwogICAgaWYgKCBzdGF0NjQoIF9zcmMuZGF0YSgp LCAmYnVmZl9zcmMgKSA9PSAtMSApIHsKI2Vsc2UKICAgIHN0cnVjdCBzdGF0IGJ1ZmZfc3JjOwog ICAgaWYgKCA6OnN0YXQoIF9zcmMuZGF0YSgpLCAmYnVmZl9zcmMgKSA9PSAtMSApIHsKI2VuZGlm CiAgICAgICAgaWYgKCBlcnJubyA9PSBFQUNDRVMgKQogICAgICAgICAgIGVycm9yKCBLSU86OkVS Ul9BQ0NFU1NfREVOSUVELCBzcmMucGF0aCgpICk7CiAgICAgICAgZWxzZQogICAgICAgICAgIGVy cm9yKCBLSU86OkVSUl9ET0VTX05PVF9FWElTVCwgc3JjLnBhdGgoKSApOwoJcmV0dXJuOwogICAg fQoKI2lmZGVmIHN1bgogICAgc3RydWN0IHN0YXQ2NCBidWZmX2Rlc3Q7CiAgICBib29sIGRlc3Rf ZXhpc3RzID0gKCBzdGF0NjQoIF9kZXN0LmRhdGEoKSwgJmJ1ZmZfZGVzdCApICE9IC0xICk7CiNl bHNlCiAgICBzdHJ1Y3Qgc3RhdCBidWZmX2Rlc3Q7CiAgICBib29sIGRlc3RfZXhpc3RzID0gKCA6 OnN0YXQoIF9kZXN0LmRhdGEoKSwgJmJ1ZmZfZGVzdCApICE9IC0xICk7CiNlbmRpZgogICAgaWYg KCBkZXN0X2V4aXN0cyApCiAgICB7CiAgICAgICAgaWYgKFNfSVNESVIoYnVmZl9kZXN0LnN0X21v ZGUpKQogICAgICAgIHsKICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfRElSX0FMUkVBRFlfRVhJ U1QsIGRlc3QucGF0aCgpICk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAg aWYgKCFfb3ZlcndyaXRlKQogICAgICAgIHsKICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfRklM RV9BTFJFQURZX0VYSVNULCBkZXN0LnBhdGgoKSApOwogICAgICAgICAgIHJldHVybjsKICAgICAg ICB9CiAgICB9CgogICAgaWYgKCA6OnJlbmFtZSggX3NyYy5kYXRhKCksIF9kZXN0LmRhdGEoKSkp CiAgICB7CiAgICAgICAgaWYgKCggZXJybm8gPT0gRUFDQ0VTICkgfHwgKGVycm5vID09IEVQRVJN KSkgewogICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfQUNDRVNTX0RFTklFRCwgZGVzdC5wYXRo KCkgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRVhERVYpIHsKICAgICAg ICAgICBlcnJvciggS0lPOjpFUlJfVU5TVVBQT1JURURfQUNUSU9OLCBRU3RyaW5nOjpmcm9tTGF0 aW4xKCJyZW5hbWUiKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVST0ZT KSB7IC8vIFRoZSBmaWxlIGlzIG9uIGEgcmVhZC1vbmx5IGZpbGVzeXN0ZW0KICAgICAgICAgICBl cnJvciggS0lPOjpFUlJfQ0FOTk9UX0RFTEVURSwgc3JjLnBhdGgoKSApOwogICAgICAgIH0KICAg ICAgICBlbHNlIHsKICAgICAgICAgICBlcnJvciggS0lPOjpFUlJfQ0FOTk9UX1JFTkFNRSwgc3Jj LnBhdGgoKSApOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CgogICAgZmluaXNoZWQo KTsKfQoKdm9pZCBGaWxlUHJvdG9jb2w6OnN5bWxpbmsoIGNvbnN0IFFTdHJpbmcgJnRhcmdldCwg Y29uc3QgS1VSTCAmZGVzdCwgYm9vbCBvdmVyd3JpdGUgKQp7CiAgICAvLyBBc3N1bWUgZGVzdCBp cyBsb2NhbCB0b28gKHdvdWxkbid0IGJlIGhlcmUgb3RoZXJ3aXNlKQogICAgaWYgKCA6OnN5bWxp bmsoIFFGaWxlOjplbmNvZGVOYW1lKCB0YXJnZXQgKSwgUUZpbGU6OmVuY29kZU5hbWUoIGRlc3Qu cGF0aCgpICkgKSA9PSAtMSApCiAgICB7CiAgICAgICAgLy8gRG9lcyB0aGUgZGVzdGluYXRpb24g YWxyZWFkeSBleGlzdCA/CiAgICAgICAgaWYgKCBlcnJubyA9PSBFRVhJU1QgKQogICAgICAgIHsK ICAgICAgICAgICAgaWYgKCBvdmVyd3JpdGUgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAvLyBUcnkgdG8gZGVsZXRlIHRoZSBkZXN0aW5hdGlvbgogICAgICAgICAgICAgICAgaWYgKCB1 bmxpbmsoIFFGaWxlOjplbmNvZGVOYW1lKCBkZXN0LnBhdGgoKSApICkgIT0gMCApCiAgICAgICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0NBTk5PVF9ERUxF VEUsIGRlc3QucGF0aCgpICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg ICAgICAgfQogICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluIC0gdGhpcyB3b24ndCBsb29wIGZv cmV2ZXIgc2luY2UgdW5saW5rIHN1Y2NlZWRlZAogICAgICAgICAgICAgICAgc3ltbGluayggdGFy Z2V0LCBkZXN0LCBvdmVyd3JpdGUgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAg ICAgICAgICAgIHsKI2lmZGVmIHN1bgogICAgICAgICAgICAgICAgc3RydWN0IHN0YXQ2NCBidWZm X2Rlc3Q7CiAgICAgICAgICAgICAgICBsc3RhdDY0KCBRRmlsZTo6ZW5jb2RlTmFtZSggZGVzdC5w YXRoKCkgKSwgJmJ1ZmZfZGVzdCApOwojZWxzZQogICAgICAgICAgICAgICAgc3RydWN0IHN0YXQg YnVmZl9kZXN0OwogICAgICAgICAgICAgICAgOjpsc3RhdCggUUZpbGU6OmVuY29kZU5hbWUoIGRl c3QucGF0aCgpICksICZidWZmX2Rlc3QgKTsKI2VuZGlmCiAgICAgICAgICAgICAgICBpZiAoU19J U0RJUihidWZmX2Rlc3Quc3RfbW9kZSkpCiAgICAgICAgICAgICAgICAgICAgZXJyb3IoIEtJTzo6 RVJSX0RJUl9BTFJFQURZX0VYSVNULCBkZXN0LnBhdGgoKSApOwogICAgICAgICAgICAgICAgZWxz ZQogICAgICAgICAgICAgICAgICAgIGVycm9yKCBLSU86OkVSUl9GSUxFX0FMUkVBRFlfRVhJU1Qs IGRlc3QucGF0aCgpICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gU29tZSBlcnJvciBv Y2N1cmVkIHdoaWxlIHdlIHRyaWVkIHRvIHN5bWxpbmsKICAgICAgICAgICAgZXJyb3IoIEtJTzo6 RVJSX0NBTk5PVF9TWU1MSU5LLCBkZXN0LnBhdGgoKSApOwogICAgICAgICAgICByZXR1cm47CiAg ICAgICAgfQogICAgfQogICAgZmluaXNoZWQoKTsKfQoKdm9pZCBGaWxlUHJvdG9jb2w6OmRlbCgg Y29uc3QgS1VSTCYgdXJsLCBib29sIGlzZmlsZSkKewogICAgUUNTdHJpbmcgX3BhdGgoIFFGaWxl OjplbmNvZGVOYW1lKHVybC5wYXRoKCkpKTsKICAgIC8qKioqKgogICAgICogRGVsZXRlIGZpbGVz CiAgICAgKioqKiovCgogICAgaWYgKGlzZmlsZSkgewoJa2REZWJ1ZyggNzEwMSApIDw8ICAiRGVs ZXRpbmcgZmlsZSAiPDwgdXJsLnVybCgpIDw8IGVuZGw7CgoJLy8gVE9ETyBkZWxldGluZ0ZpbGUo IHNvdXJjZSApOwoKCWlmICggdW5saW5rKCBfcGF0aC5kYXRhKCkgKSA9PSAtMSApIHsKICAgICAg ICAgICAgaWYgKChlcnJubyA9PSBFQUNDRVMpIHx8IChlcnJubyA9PSBFUEVSTSkpCiAgICAgICAg ICAgICAgIGVycm9yKCBLSU86OkVSUl9BQ0NFU1NfREVOSUVELCB1cmwucGF0aCgpKTsKICAgICAg ICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlTRElSKQogICAgICAgICAgICAgICBlcnJvciggS0lP OjpFUlJfSVNfRElSRUNUT1JZLCB1cmwucGF0aCgpKTsKICAgICAgICAgICAgZWxzZQogICAgICAg ICAgICAgICBlcnJvciggS0lPOjpFUlJfQ0FOTk9UX0RFTEVURSwgdXJsLnBhdGgoKSApOwoJICAg IHJldHVybjsKCX0KICAgIH0gZWxzZSB7CgogICAgICAvKioqKioKICAgICAgICogRGVsZXRlIGVt cHR5IGRpcmVjdG9yeQogICAgICAgKioqKiovCgogICAgICBrZERlYnVnKCA3MTAxICkgPDwgIkRl bGV0aW5nIGRpcmVjdG9yeSAiIDw8IHVybC51cmwoKSA8PCBlbmRsOwoKICAgICAgaWYgKCA6OnJt ZGlyKCBfcGF0aC5kYXRhKCkgKSA9PSAtMSApIHsKCWlmICgoZXJybm8gPT0gRUFDQ0VTKSB8fCAo ZXJybm8gPT0gRVBFUk0pKQoJICBlcnJvciggS0lPOjpFUlJfQUNDRVNTX0RFTklFRCwgdXJsLnBh dGgoKSk7CgllbHNlIHsKCSAga2REZWJ1ZyggNzEwMSApIDw8ICJjb3VsZCBub3Qgcm1kaXIgIiA8 PCBwZXJyb3IgPDwgZW5kbDsKCSAgZXJyb3IoIEtJTzo6RVJSX0NPVUxEX05PVF9STURJUiwgdXJs LnBhdGgoKSApOwoJICByZXR1cm47Cgl9CiAgICAgIH0KICAgIH0KCiAgICBmaW5pc2hlZCgpOwp9 Cgpib29sIEZpbGVQcm90b2NvbDo6Y3JlYXRlVURTRW50cnkoIGNvbnN0IFFTdHJpbmcgJiBmaWxl bmFtZSwgY29uc3QgUUNTdHJpbmcgJiBwYXRoLCBVRFNFbnRyeSAmIGVudHJ5ICApCnsKICAgIGFz c2VydChlbnRyeS5jb3VudCgpID09IDApOyAvLyBieSBjb250cmFjdCA6LSkKICAgIFVEU0F0b20g YXRvbTsKICAgIGF0b20ubV91ZHMgPSBLSU86OlVEU19OQU1FOwogICAgYXRvbS5tX3N0ciA9IGZp bGVuYW1lOwogICAgZW50cnkuYXBwZW5kKCBhdG9tICk7CgogICAgbW9kZV90IHR5cGU7CiAgICBt b2RlX3QgYWNjZXNzOwoKI2lmZGVmIHN1bgogICBzdHJ1Y3Qgc3RhdDY0IGJ1ZmY7CglpZiAoIGxz dGF0NjQoIHBhdGguZGF0YSgpLCAmYnVmZiApID09IDAgKSAgewojZWxzZQogICBzdHJ1Y3Qgc3Rh dCBidWZmOwoJaWYgKCBsc3RhdCggcGF0aC5kYXRhKCksICZidWZmICkgPT0gMCApICB7CiNlbmRp ZgoKCSAgICBpZiAoU19JU0xOSyhidWZmLnN0X21vZGUpKSB7CgoJCWNoYXIgYnVmZmVyMlsgMTAw MCBdOwoJCWludCBuID0gcmVhZGxpbmsoIHBhdGguZGF0YSgpLCBidWZmZXIyLCAxMDAwICk7CgkJ aWYgKCBuICE9IC0xICkgewoJCSAgICBidWZmZXIyWyBuIF0gPSAwOwogICAgICAgICAgICAgICAg fQoKCQlhdG9tLm1fdWRzID0gS0lPOjpVRFNfTElOS19ERVNUOwoJCWF0b20ubV9zdHIgPSBRU3Ry aW5nOjpmcm9tTG9jYWw4Qml0KCBidWZmZXIyICk7CgkJZW50cnkuYXBwZW5kKCBhdG9tICk7CgoJ CS8vIEEgbGluayBwb2l0aW5nIHRvIG5vd2hlcmUgPwojaWZkZWYgc3VuCiAgICAgIGtkV2Fybmlu ZygpIDw8ICJ1c2luZyA2NCBiaXQgc3RhdCIgPDwgZW5kbDsKCQlpZiAoIHN0YXQ2NCggcGF0aC5k YXRhKCksICZidWZmICkgPT0gLTEgKSB7CiNlbHNlCiAgICAgIGtkV2FybmluZygpIDw8ICJ1c2lu ZyAzMiBiaXQgc3RhdCIgPDwgZW5kbDsKCQlpZiAoIDo6c3RhdCggcGF0aC5kYXRhKCksICZidWZm ICkgPT0gLTEgKSB7CiNlbmRpZgoJCSAgICAvLyBJdCBpcyBhIGxpbmsgcG9pbnRpbmcgdG8gbm93 aGVyZQoJCSAgICB0eXBlID0gU19JRk1UIC0gMTsKCQkgICAgYWNjZXNzID0gU19JUldYVSB8IFNf SVJXWEcgfCBTX0lSV1hPOwoKCQkgICAgYXRvbS5tX3VkcyA9IEtJTzo6VURTX0ZJTEVfVFlQRTsK CQkgICAgYXRvbS5tX2xvbmcgPSB0eXBlOwoJCSAgICBlbnRyeS5hcHBlbmQoIGF0b20gKTsKCgkJ ICAgIGF0b20ubV91ZHMgPSBLSU86OlVEU19BQ0NFU1M7CgkJICAgIGF0b20ubV9sb25nID0gYWNj ZXNzOwoJCSAgICBlbnRyeS5hcHBlbmQoIGF0b20gKTsKCgkJICAgIGF0b20ubV91ZHMgPSBLSU86 OlVEU19TSVpFOwoJCSAgICBhdG9tLm1fbG9uZyA9IDBMOwoJCSAgICBlbnRyeS5hcHBlbmQoIGF0 b20gKTsKCgkJICAgIGdvdG8gbm90eXBlOwoKCQl9CgkgICAgfQoJfSBlbHNlIHsKICAgICAgICAg ICAga2RXYXJuaW5nKCkgPDwgImxzdGF0IGRpZG4ndCB3b3JrIG9uICIgPDwgcGF0aC5kYXRhKCkg PDwgZW5kbDsKCSAgICByZXR1cm4gZmFsc2U7Cgl9CgoJdHlwZSA9IGJ1ZmYuc3RfbW9kZSAmIFNf SUZNVDsgLy8gZXh0cmFjdCBmaWxlIHR5cGUKCWFjY2VzcyA9IGJ1ZmYuc3RfbW9kZSAmIDA3Nzc3 OyAvLyBleHRyYWN0IHBlcm1pc3Npb25zCgoJYXRvbS5tX3VkcyA9IEtJTzo6VURTX0ZJTEVfVFlQ RTsKCWF0b20ubV9sb25nID0gdHlwZTsKCWVudHJ5LmFwcGVuZCggYXRvbSApOwoKCWF0b20ubV91 ZHMgPSBLSU86OlVEU19BQ0NFU1M7CglhdG9tLm1fbG9uZyA9IGFjY2VzczsKCWVudHJ5LmFwcGVu ZCggYXRvbSApOwoKCWF0b20ubV91ZHMgPSBLSU86OlVEU19TSVpFOwoJYXRvbS5tX2xvbmcgPSBi dWZmLnN0X3NpemU7CgllbnRyeS5hcHBlbmQoIGF0b20gKTsKCiAgICBub3R5cGU6CglhdG9tLm1f dWRzID0gS0lPOjpVRFNfTU9ESUZJQ0FUSU9OX1RJTUU7CglhdG9tLm1fbG9uZyA9IGJ1ZmYuc3Rf bXRpbWU7CgllbnRyeS5hcHBlbmQoIGF0b20gKTsKCglhdG9tLm1fdWRzID0gS0lPOjpVRFNfVVNF UjsKCXVpZF90IHVpZCA9IGJ1ZmYuc3RfdWlkOwoJUVN0cmluZyAqdGVtcCA9IHVzZXJjYWNoZS5m aW5kKCB1aWQgKTsKCglpZiAoICF0ZW1wICkgewoJICAgIHN0cnVjdCBwYXNzd2QgKnVzZXIgPSBn ZXRwd3VpZCggdWlkICk7CgkgICAgaWYgKCB1c2VyICkgewoJCXVzZXJjYWNoZS5pbnNlcnQoIHVp ZCwgbmV3IFFTdHJpbmcoUVN0cmluZzo6ZnJvbUxhdGluMSh1c2VyLT5wd19uYW1lKSkgKTsKCQlh dG9tLm1fc3RyID0gdXNlci0+cHdfbmFtZTsKCSAgICB9CgkgICAgZWxzZQoJCWF0b20ubV9zdHIg PSBRU3RyaW5nOjpudW1iZXIoIHVpZCApOwoJfQoJZWxzZQoJICAgIGF0b20ubV9zdHIgPSAqdGVt cDsKCWVudHJ5LmFwcGVuZCggYXRvbSApOwoKCWF0b20ubV91ZHMgPSBLSU86OlVEU19HUk9VUDsK CWdpZF90IGdpZCA9IGJ1ZmYuc3RfZ2lkOwoJdGVtcCA9IGdyb3VwY2FjaGUuZmluZCggZ2lkICk7 CglpZiAoICF0ZW1wICkgewoJICAgIHN0cnVjdCBncm91cCAqZ3JwID0gZ2V0Z3JnaWQoIGdpZCAp OwoJICAgIGlmICggZ3JwICkgewoJCWdyb3VwY2FjaGUuaW5zZXJ0KCBnaWQsIG5ldyBRU3RyaW5n KFFTdHJpbmc6OmZyb21MYXRpbjEoZ3JwLT5ncl9uYW1lKSkgKTsKCQlhdG9tLm1fc3RyID0gZ3Jw LT5ncl9uYW1lOwoJICAgIH0KCSAgICBlbHNlCgkJYXRvbS5tX3N0ciA9IFFTdHJpbmc6Om51bWJl ciggZ2lkICk7Cgl9CgllbHNlCgkgICAgYXRvbS5tX3N0ciA9ICp0ZW1wOwoJZW50cnkuYXBwZW5k KCBhdG9tICk7CgoJYXRvbS5tX3VkcyA9IEtJTzo6VURTX0FDQ0VTU19USU1FOwoJYXRvbS5tX2xv bmcgPSBidWZmLnN0X2F0aW1lOwoJZW50cnkuYXBwZW5kKCBhdG9tICk7CgoJLy8gTm90ZTogYnVm Zi5zdF9jdGltZSBpc24ndCB0aGUgY3JlYXRpb24gdGltZSAhCiAgICAgICAgLy8gV2UgbWFkZSB0 aGF0IG1pc3Rha2UgZm9yIEtERSAyLjAsIGJ1dCBpdCdzIGluIGZhY3QgdGhlCiAgICAgICAgLy8g ImZpbGUgc3RhdHVzIiBjaGFuZ2UgdGltZSwgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dC4KCgly ZXR1cm4gdHJ1ZTsKfQoKdm9pZCBGaWxlUHJvdG9jb2w6OnN0YXQoIGNvbnN0IEtVUkwgJiB1cmwg KQp7CiAgICAvKiBkaXJlY3RvcmllcyBtYXkgbm90IGhhdmUgYSBzbGFzaCBhdCB0aGUgZW5kIGlm CiAgICAgKiB3ZSB3YW50IHRvIHN0YXQoKSB0aGVtOyBpdCByZXF1aXJlcyB0aGF0IHdlCiAgICAg KiBjaGFuZ2UgaW50byBpdCAuLiB3aGljaCBtYXkgbm90IGJlIGFsbG93ZWQKICAgICAqIHN0YXQo Ii9pcy91bmFjY2Vzc2libGUiKSAgLT4gcnd4LS0tLS0tCiAgICAgKiBzdGF0KCIvaXMvdW5hY2Nl c3NpYmxlLyIpIC0+IEVQRVJNICAgICAgICAgICAgSC5aLgogICAgICogVGhpcyBpcyB0aGUgcmVh c29uIGZvciB0aGUgLTEKICAgICAqLwogICAgUUNTdHJpbmcgX3BhdGgoIFFGaWxlOjplbmNvZGVO YW1lKHVybC5wYXRoKC0xKSkpOwojaWZkZWYgc3VuCiAgICBzdHJ1Y3Qgc3RhdDY0IGJ1ZmY7CiAg ICBpZiAoIGxzdGF0NjQoIF9wYXRoLmRhdGEoKSwgJmJ1ZmYgKSA9PSAtMSApIHsKI2Vsc2UKICAg IHN0cnVjdCBzdGF0IGJ1ZmY7CiAgICBpZiAoIDo6bHN0YXQoIF9wYXRoLmRhdGEoKSwgJmJ1ZmYg KSA9PSAtMSApIHsKI2VuZGlmCgllcnJvciggS0lPOjpFUlJfRE9FU19OT1RfRVhJU1QsIHVybC5w YXRoKC0xKSApOwoJcmV0dXJuOwogICAgfQoKICAgIFVEU0VudHJ5IGVudHJ5OwogICAgaWYgKCAh Y3JlYXRlVURTRW50cnkoIHVybC5maWxlTmFtZSgpLCBfcGF0aCwgZW50cnkgKSApCiAgICB7Cgkv LyBTaG91bGQgbmV2ZXIgaGFwcGVuCgllcnJvciggS0lPOjpFUlJfRE9FU19OT1RfRVhJU1QsIHVy bC5wYXRoKC0xKSApOwoJcmV0dXJuOwogICAgfQojaWYgMAovLy8vLy8vLy8gZGVidWcgY29kZQog ICAgS0lPOjpVRFNFbnRyeTo6Q29uc3RJdGVyYXRvciBpdCA9IGVudHJ5LmJlZ2luKCk7CiAgICBm b3IoIDsgaXQgIT0gZW50cnkuZW5kKCk7IGl0KysgKSB7CiAgICAgICAgc3dpdGNoICgoKml0KS5t X3VkcykgewogICAgICAgICAgICBjYXNlIEtJTzo6VURTX0ZJTEVfVFlQRToKICAgICAgICAgICAg ICAgIGtkRGVidWcoNzEwMSkgPDwgIkZpbGUgVHlwZSA6ICIgPDwgKG1vZGVfdCkoKCppdCkubV9s b25nKSA8PCBlbmRsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgS0lP OjpVRFNfQUNDRVNTOgogICAgICAgICAgICAgICAga2REZWJ1Zyg3MTAxKSA8PCAiQWNjZXNzIHBl cm1pc3Npb25zIDogIiA8PCAobW9kZV90KSgoKml0KS5tX2xvbmcpIDw8IGVuZGw7CiAgICAgICAg ICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLSU86OlVEU19VU0VSOgogICAgICAgICAg ICAgICAga2REZWJ1Zyg3MTAxKSA8PCAiVXNlciA6ICIgPDwgKCgqaXQpLm1fc3RyLmFzY2lpKCkg KSA8PCBlbmRsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgS0lPOjpV RFNfR1JPVVA6CiAgICAgICAgICAgICAgICBrZERlYnVnKDcxMDEpIDw8ICJHcm91cCA6ICIgPDwg KCgqaXQpLm1fc3RyLmFzY2lpKCkgKSA8PCBlbmRsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAg ICAgICAgICAgIGNhc2UgS0lPOjpVRFNfTkFNRToKICAgICAgICAgICAgICAgIGtkRGVidWcoNzEw MSkgPDwgIk5hbWUgOiAiIDw8ICgoKml0KS5tX3N0ci5hc2NpaSgpICkgPDwgZW5kbDsKICAgICAg ICAgICAgICAgIC8vbV9zdHJUZXh0ID0gZGVjb2RlRmlsZU5hbWUoICgqaXQpLm1fc3RyICk7CiAg ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLSU86OlVEU19VUkw6CiAgICAg ICAgICAgICAgICBrZERlYnVnKDcxMDEpIDw8ICJVUkwgOiAiIDw8ICgoKml0KS5tX3N0ci5hc2Np aSgpICkgPDwgZW5kbDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEtJ Tzo6VURTX01JTUVfVFlQRToKICAgICAgICAgICAgICAgIGtkRGVidWcoNzEwMSkgPDwgIk1pbWVU eXBlIDogIiA8PCAoKCppdCkubV9zdHIuYXNjaWkoKSApIDw8IGVuZGw7CiAgICAgICAgICAgICAg ICBicmVhazsKICAgICAgICAgICAgY2FzZSBLSU86OlVEU19MSU5LX0RFU1Q6CiAgICAgICAgICAg ICAgICBrZERlYnVnKDcxMDEpIDw8ICJMaW5rRGVzdCA6ICIgPDwgKCgqaXQpLm1fc3RyLmFzY2lp KCkgKSA8PCBlbmRsOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQovLy8v Ly8vLy8KI2VuZGlmCiAgICBzdGF0RW50cnkoIGVudHJ5ICk7CgogICAgZmluaXNoZWQoKTsKfQoK dm9pZCBGaWxlUHJvdG9jb2w6Omxpc3REaXIoIGNvbnN0IEtVUkwmIHVybCkKewogICAgUUNTdHJp bmcgX3BhdGgoIFFGaWxlOjplbmNvZGVOYW1lKHVybC5wYXRoKCkpKTsKICAgIGtkRGVidWcoNzEw MSkgPDwgIj09PT09PT09PSBMSVNUICIgPDwgdXJsLnVybCgpIDw8ICIgPT09PT09PT09IiA8PCBl bmRsOwoKI2lmZGVmIHN1bgogICAgc3RydWN0IHN0YXQ2NCBidWZmOwogICAgaWYgKCBzdGF0NjQo IF9wYXRoLmRhdGEoKSwgJmJ1ZmYgKSA9PSAtMSApIHsKI2Vsc2UKICAgIHN0cnVjdCBzdGF0IGJ1 ZmY7CiAgICBpZiAoIDo6c3RhdCggX3BhdGguZGF0YSgpLCAmYnVmZiApID09IC0xICkgewojZW5k aWYKCWVycm9yKCBLSU86OkVSUl9ET0VTX05PVF9FWElTVCwgdXJsLnBhdGgoKSApOwoJcmV0dXJu OwogICAgfQoKICAgIGlmICggIVNfSVNESVIoIGJ1ZmYuc3RfbW9kZSApICkgewoJZXJyb3IoIEtJ Tzo6RVJSX0lTX0ZJTEUsIHVybC5wYXRoKCkgKTsKCXJldHVybjsKICAgIH0KCiAgICBESVIgKmRw ID0gMEw7CiNpZiBkZWZpbmVkKCBfX0RFQ0NYWCkgJiYgZGVmaW5lZChfX2xpbnV4X18pCiAgICBz dHJ1Y3QgZGlyZW50NjQgKmVwOyAvLyBYWFggc3RydWN0IGRpcmVudCAqZXA7CiNlbHNlCiAgICBz dHJ1Y3QgZGlyZW50ICplcDsKI2VuZGlmCgogICAgZHAgPSBvcGVuZGlyKCBfcGF0aC5kYXRhKCkg KTsKICAgIGlmICggZHAgPT0gMCApIHsKCWVycm9yKCBLSU86OkVSUl9DQU5OT1RfRU5URVJfRElS RUNUT1JZLCB1cmwucGF0aCgpICk7CglyZXR1cm47CiAgICB9CgogICAgLy8gRG9uJ3QgbWFrZSB0 aGlzIGEgUVN0cmluZ0xpc3QuIFRoZSBsb2NhbGUgZmlsZSBuYW1lIHdlIGdldCBoZXJlCiAgICAv LyBzaG91bGQgYmUgcGFzc2VkIGludGFjdCB0byBjcmVhdGVVRFNFbnRyeSB0byBhdm9pZCBwcm9i bGVtcyB3aXRoCiAgICAvLyBmaWxlcyB3aGVyZSBRRmlsZTo6ZW5jb2RlTmFtZShRRmlsZTo6ZGVj b2RlTmFtZShhKSkgIT0gYS4KICAgIFFTdHJMaXN0IGVudHJ5TmFtZXM7CgogICAgd2hpbGUgKCAo IGVwID0gcmVhZGRpciggZHAgKSApICE9IDBMICkKCWVudHJ5TmFtZXMuYXBwZW5kKCBlcC0+ZF9u YW1lICk7CgogICAgY2xvc2VkaXIoIGRwICk7CiAgICB0b3RhbFNpemUoIGVudHJ5TmFtZXMuY291 bnQoKSApOwoKICAgIC8qIHNldCB0aGUgY3VycmVudCBkaXIgdG8gdGhlIHBhdGggdG8gc3BlZWQg dXAKICAgICAgIGluIG5vdCBoYXZpbmcgdG8gcGFzcyBhbiBhYnNvbHV0ZSBwYXRoLgogICAgICAg V2UgcmVzdG9yZSB0aGUgcGF0aCBsYXRlciB0byBnZXQgb3V0IG9mIHRoZQogICAgICAgcGF0aCAt IHRoZSBrZXJuZWwgd291bGRuJ3QgdW5tb3VudCBvciBkZWxldGUKICAgICAgIGRpcmVjdG9yaWVz IHdlIGtlZXAgYXMgYWN0aXZlIGRpcmVjdG9yeS4gQW5kCiAgICAgICBhcyB0aGUgc2xhdmUgcnVu cyBpbiB0aGUgYmFja2dyb3VuZCwgaXQncyBoYXJkCiAgICAgICB0byBzZWUgZm9yIHRoZSB1c2Vy IHdoYXQgdGhlIHByb2JsZW0gd291bGQgYmUgKi8KICAgIGNoYXIgcGF0aF9idWZmZXJbUEFUSF9N QVhdOwogICAgZ2V0Y3dkKHBhdGhfYnVmZmVyLCBQQVRIX01BWCAtIDEpOwogICAgY2hkaXIoIF9w YXRoLmRhdGEoKSApOwoKICAgIFVEU0VudHJ5IGVudHJ5OwogICAgUVN0ckxpc3RJdGVyYXRvciBp dChlbnRyeU5hbWVzKTsKICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpIHsKICAgICAgICBl bnRyeS5jbGVhcigpOwogICAgICAgIGlmICggY3JlYXRlVURTRW50cnkoIFFGaWxlOjpkZWNvZGVO YW1lKCppdCksICppdCAvKiB3ZSBjYW4gdXNlIHRoZSBmaWxlbmFtZSBhcyByZWxhdGl2ZSBwYXRo Ki8sIGVudHJ5ICkgKQogICAgICAgICAgbGlzdEVudHJ5KCBlbnRyeSwgZmFsc2UpOwogICAgICAg IGVsc2UKICAgICAgICAgIDsvL1dlbGwsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiBidXQg d2l0aCB3cm9uZyBlbmNvZGluZyBuYW1lcwogICAgfQoKICAgIGxpc3RFbnRyeSggZW50cnksIHRy dWUgKTsgLy8gcmVhZHkKCiAgICBrZERlYnVnKDcxMDEpIDw8ICI9PT09PT09PT09PT09IENPTVBM RVRFRCBMSVNUID09PT09PT09PT09PSIgPDwgZW5kbDsKCiAgICBjaGRpcihwYXRoX2J1ZmZlcik7 CgogICAgZmluaXNoZWQoKTsKCiAgICBrZERlYnVnKDcxMDEpIDw8ICI9PT09PT09PT09PT09PT0g QllFID09PT09PT09PT09IiA8PCBlbmRsOwp9CgovKgp2b2lkIEZpbGVQcm90b2NvbDo6dGVzdERp ciggY29uc3QgUVN0cmluZyYgcGF0aCApCnsKICAgIFFDU3RyaW5nIF9wYXRoKCBRRmlsZTo6ZW5j b2RlTmFtZShwYXRoKSk7CiAgICBzdHJ1Y3Qgc3RhdCBidWZmOwogICAgaWYgKCA6OnN0YXQoIF9w YXRoLmRhdGEoKSwgJmJ1ZmYgKSA9PSAtMSApIHsKCWVycm9yKCBLSU86OkVSUl9ET0VTX05PVF9F WElTVCwgcGF0aCApOwoJcmV0dXJuOwogICAgfQoKICAgIGlmICggU19JU0RJUiggYnVmZi5zdF9t b2RlICkgKQoJaXNEaXJlY3RvcnkoKTsKICAgIGVsc2UKCWlzRmlsZSgpOwoKICAgIGZpbmlzaGVk KCk7Cn0KKi8KCnZvaWQgRmlsZVByb3RvY29sOjpzcGVjaWFsKCBjb25zdCBRQnl0ZUFycmF5ICZk YXRhKQp7CiAgICBpbnQgdG1wOwogICAgUURhdGFTdHJlYW0gc3RyZWFtKGRhdGEsIElPX1JlYWRP bmx5KTsKCiAgICBzdHJlYW0gPj4gdG1wOwogICAgc3dpdGNoICh0bXApIHsKICAgIGNhc2UgMToK ICAgICAgewoJUVN0cmluZyBmc3R5cGUsIGRldiwgcG9pbnQ7CglRX0lOVDggaVJvOwoKCXN0cmVh bSA+PiBpUm8gPj4gZnN0eXBlID4+IGRldiA+PiBwb2ludDsKCglib29sIHJvID0gKCBpUm8gIT0g MCApOwoKCWtkRGVidWcoNzEwMSkgPDwgIk1PVU5USU5HIGZzdHlwZT0iIDw8IGZzdHlwZSA8PCAi IGRldj0iIDw8IGRldiA8PCAiIHBvaW50PSIgPDwgcG9pbnQgPDwgIiBybz0iIDw8IHJvIDw8IGVu ZGw7Cgltb3VudCggcm8sIGZzdHlwZS5hc2NpaSgpLCBkZXYsIHBvaW50ICk7CgogICAgICB9CiAg ICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICB7CglRU3RyaW5nIHBvaW50OwoJc3RyZWFtID4+ IHBvaW50OwoJdW5tb3VudCggcG9pbnQgKTsKICAgICAgfQogICAgICBicmVhazsKCiAgICBjYXNl IDM6CiAgICB7CiAgICAgIFFTdHJpbmcgZmlsZW5hbWU7CiAgICAgIHN0cmVhbSA+PiBmaWxlbmFt ZTsKICAgICAgS1NocmVkIHNocmVkKCBmaWxlbmFtZSApOwogICAgICBjb25uZWN0KCAmc2hyZWQs IFNJR05BTCggcHJvY2Vzc2VkU2l6ZSggdW5zaWduZWQgbG9uZyApICksCiAgICAgICAgICAgICAg IHRoaXMsIFNMT1QoIHNsb3RQcm9jZXNzZWRTaXplKCB1bnNpZ25lZCBsb25nICkgKSApOwogICAg ICBjb25uZWN0KCAmc2hyZWQsIFNJR05BTCggaW5mb01lc3NhZ2UoIGNvbnN0IFFTdHJpbmcgJiAp ICksCiAgICAgICAgICAgICAgIHRoaXMsIFNMT1QoIHNsb3RJbmZvTWVzc2FnZSggY29uc3QgUVN0 cmluZyAmICkgKSApOwogICAgICBpZiAoIXNocmVkLnNocmVkKCkpCiAgICAgICAgICBlcnJvcigg S0lPOjpFUlJfQ0FOTk9UX0RFTEVURSwgZmlsZW5hbWUgKTsKICAgICAgZWxzZQogICAgICAgICAg ZmluaXNoZWQoKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBkZWZhdWx0OgogICAgICBhc3NlcnQo MCk7CiAgICB9Cn0KCi8vIENvbm5lY3RlZCB0byBLU2hyZWQKdm9pZCBGaWxlUHJvdG9jb2w6OnNs b3RQcm9jZXNzZWRTaXplKCB1bnNpZ25lZCBsb25nIGJ5dGVzICkKewogIGtkRGVidWcoNzEwMSkg PDwgIkZpbGVQcm90b2NvbDo6c2xvdFByb2Nlc3NlZFNpemUgKCIgPDwgKHVuc2lnbmVkIGludCkg Ynl0ZXMgPDwgIikiIDw8IGVuZGw7CiAgcHJvY2Vzc2VkU2l6ZSggYnl0ZXMgKTsKfQoKLy8gQ29u bmVjdGVkIHRvIEtTaHJlZAp2b2lkIEZpbGVQcm90b2NvbDo6c2xvdEluZm9NZXNzYWdlKCBjb25z dCBRU3RyaW5nICYgbXNnICkKewogIGtkRGVidWcoNzEwMSkgPDwgIkZpbGVQcm90b2NvbDo6c2xv dEluZm9NZXNzYWdlICgiIDw8IG1zZyA8PCAiKSIgPDwgZW5kbDsKICBpbmZvTWVzc2FnZSggbXNn ICk7Cn0KCnN0YXRpYyBRU3RyaW5nIHNoZWxsUXVvdGUoIGNvbnN0IFFTdHJpbmcgJl9zdHIgKQp7 CiAgICAvLyBDcmVkaXRzIHRvIFdhbHRlciwgc2F5cyBCZXJuZCBHLiA6KQogICAgUVN0cmluZyBz dHIoX3N0cik7CiAgICBzdHIucmVwbGFjZShRUmVnRXhwKFFTdHJpbmc6OmZyb21MYXRpbjEoIici KSksIFFTdHJpbmc6OmZyb21MYXRpbjEoIidcIidcIiciKSk7CiAgICByZXR1cm4gUVN0cmluZzo6 ZnJvbUxhdGluMSgiJyIpK3N0cisnXCcnOwp9Cgp2b2lkIEZpbGVQcm90b2NvbDo6bW91bnQoIGJv b2wgX3JvLCBjb25zdCBjaGFyICpfZnN0eXBlLCBjb25zdCBRU3RyaW5nJiBfZGV2LCBjb25zdCBR U3RyaW5nJiBfcG9pbnQgKQp7CiAgICBrZERlYnVnKDcxMDEpIDw8ICJGaWxlUHJvdG9jb2w6Om1v dW50IF9mc3R5cGU9IiA8PCBfZnN0eXBlIDw8IGVuZGw7CiAgICBRU3RyaW5nIGJ1ZmZlcjsKCiAg ICBLVGVtcEZpbGUgdG1wRmlsZTsKICAgIFFDU3RyaW5nIHRtcEZpbGVDID0gUUZpbGU6OmVuY29k ZU5hbWUodG1wRmlsZS5uYW1lKCkpOwogICAgY29uc3QgY2hhciAqdG1wID0gdG1wRmlsZUMuZGF0 YSgpOwogICAgUUNTdHJpbmcgZGV2ID0gUUZpbGU6OmVuY29kZU5hbWUoIHNoZWxsUXVvdGUoX2Rl dikgKTsgLy8gZ2V0IHRob3NlIHJlYWR5IHRvIGJlIGdpdmVuIHRvIGEgc2hlbGwKICAgIFFDU3Ry aW5nIHBvaW50ID0gUUZpbGU6OmVuY29kZU5hbWUoIHNoZWxsUXVvdGUoX3BvaW50KSApOwogICAg UUNTdHJpbmcgZnN0eXBlID0gX2ZzdHlwZTsKICAgIFFDU3RyaW5nIHJlYWRvbmx5ID0gX3JvID8g Ii1yIiA6ICIiOwoKICAgIC8vIFR3byBzdGVwcywgaW4gY2FzZSBtb3VudCBkb2Vzbid0IGxpa2Ug aXQgd2hlbiB3ZSBwYXNzIGFsbCBvcHRpb25zCiAgICBmb3IgKCBpbnQgc3RlcCA9IDAgOyBzdGVw IDw9IDEgOyBzdGVwKysgKQogICAgewogICAgICAgIC8vIE1vdW50IHVzaW5nIGRldmljZSBvbmx5 IGlmIG5vIGZzdHlwZSBub3IgbW91bnRwb2ludCAoS0RFLTEueCBsaWtlKQogICAgICAgIGlmICgg IV9kZXYuaXNFbXB0eSgpICYmIF9wb2ludC5pc0VtcHR5KCkgJiYgZnN0eXBlLmlzRW1wdHkoKSAp CiAgICAgICAgICAgIGJ1ZmZlci5zcHJpbnRmKCAibW91bnQgJXMgMj4lcyIsIGRldi5kYXRhKCks IHRtcCApOwogICAgICAgIGVsc2UKICAgICAgICAgIC8vIE1vdW50IHVzaW5nIHRoZSBtb3VudHBv aW50LCBpZiBubyBmc3R5cGUgbm9yIGRldmljZSAoaW1wb3NzaWJsZSBpbiBmaXJzdCBzdGVwKQog ICAgICAgICAgaWYgKCAhX3BvaW50LmlzRW1wdHkoKSAmJiBfZGV2LmlzRW1wdHkoKSAmJiBmc3R5 cGUuaXNFbXB0eSgpICkKICAgICAgICAgICAgYnVmZmVyLnNwcmludGYoICJtb3VudCAlcyAyPiVz IiwgcG9pbnQuZGF0YSgpLCB0bXAgKTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgLy8gbW91 bnQgZ2l2aW5nIGRldmljZSArIG1vdW50cG9pbnQgYnV0IG5vIGZzdHlwZQogICAgICAgICAgICBp ZiAoICFfcG9pbnQuaXNFbXB0eSgpICYmICFfZGV2LmlzRW1wdHkoKSAmJiBmc3R5cGUuaXNFbXB0 eSgpICkKICAgICAgICAgICAgICBidWZmZXIuc3ByaW50ZiggIm1vdW50ICVzICVzICVzIDI+JXMi LCByZWFkb25seS5kYXRhKCksIGRldi5kYXRhKCksIHBvaW50LmRhdGEoKSwgdG1wICk7CiAgICAg ICAgICAgIGVsc2UKICAgICAgICAgICAgICAvLyBtb3VudCBnaXZpbmcgZGV2aWNlICsgbW91bnRw b2ludCArIGZzdHlwZQogICAgICAgICAgICAgIGJ1ZmZlci5zcHJpbnRmKCAibW91bnQgJXMgLXQg JXMgJXMgJXMgMj4lcyIsIHJlYWRvbmx5LmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZnN0eXBlLmRhdGEoKSwgZGV2LmRhdGEoKSwgcG9pbnQuZGF0YSgpLCB0bXAgKTsKCiAg ICAgICAga2REZWJ1Zyg3MTAxKSA8PCBidWZmZXIgPDwgZW5kbDsKCiAgICAgICAgc3lzdGVtKCBi dWZmZXIuYXNjaWkoKSApOwoKICAgICAgICBRU3RyaW5nIGVyciA9IHRlc3RMb2dGaWxlKCB0bXAg KTsKICAgICAgICBpZiAoIGVyci5pc0VtcHR5KCkgKQogICAgICAgIHsKICAgICAgICAgICAgZmlu aXNoZWQoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAg ICAgewogICAgICAgICAgICAvLyBEaWRuJ3Qgd29yayAtIG9yIG1heWJlIHdlIGp1c3QgZ290IGEg d2FybmluZwogICAgICAgICAgICBRU3RyaW5nIG1wID0gS0lPOjpmaW5kRGV2aWNlTW91bnRQb2lu dCggX2RldiApOwogICAgICAgICAgICAvLyBJcyB0aGUgZGV2aWNlIG1vdW50ZWQgPwogICAgICAg ICAgICBpZiAoICFtcC5pc051bGwoKSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGtk RGVidWcoNzEwMSkgPDwgIm1vdW50IGdvdCBhIHdhcm5pbmc6ICIgPDwgZXJyIDw8IGVuZGw7CiAg ICAgICAgICAgICAgICB3YXJuaW5nKCBlcnIgKTsKICAgICAgICAgICAgICAgIGZpbmlzaGVkKCk7 CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQog ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoIHN0ZXAgPT0gMCApCiAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAga2REZWJ1Zyg3MTAxKSA8PCBlcnIgPDwgZW5kbDsK ICAgICAgICAgICAgICAgICAgICBrZERlYnVnKDcxMDEpIDw8ICJNb3VudGluZyB3aXRoIHRob3Nl IG9wdGlvbnMgZGlkbid0IHdvcmssIHRyeWluZyB3aXRoIG9ubHkgbW91bnRwb2ludCIgPDwgZW5k bDsKICAgICAgICAgICAgICAgICAgICBmc3R5cGUgPSAiIjsKICAgICAgICAgICAgICAgICAgICBk ZXYgPSAiIjsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIGZvciB0cnlpbmcgd2l0 aCBvbmx5IG1vdW50cG9pbnQgKGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5 IGRldmljZSkgaXMgdGhhdCBzb21lIHBlb3BsZSAoaGkgTWFsdGUhKSBoYXZlIHRoZQogICAgICAg ICAgICAgICAgICAgIC8vIHNhbWUgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0d28gbW91bnRwb2lu dHMKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZGlmZmVyZW50IGZzdHlwZXMsIGxpa2UgL2Rl di9mZDAgL21udC9lMmZsb3BweSBhbmQKICAgICAgICAgICAgICAgICAgICAvLyAvZGV2L2ZkMCAv bW50L2Rvc2Zsb3BweS4KICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgdGhl IHNhbWUgbW91bnRwb2ludCBhc3NvY2lhdGVkIHdpdGggdHdvCiAgICAgICAgICAgICAgICAgICAg Ly8gZGlmZmVyZW50IGRldmljZXMsIHdlbGwgdGhleSBzaG91bGRuJ3Qgc3BlY2lmeSB0aGUKICAg ICAgICAgICAgICAgICAgICAvLyBtb3VudHBvaW50IGJ1dCBqdXN0IHRoZSBkZXZpY2UuCiAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgZXJyb3IoIEtJTzo6RVJSX0NPVUxEX05PVF9NT1VOVCwgZXJyICk7CiAg ICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9 CiAgICAgICAgfQogICAgfQp9CgoKdm9pZCBGaWxlUHJvdG9jb2w6OnVubW91bnQoIGNvbnN0IFFT dHJpbmcmIF9wb2ludCApCnsKICAgIFFTdHJpbmcgYnVmZmVyOwoKICAgIEtUZW1wRmlsZSB0bXBG aWxlOwogICAgUUNTdHJpbmcgdG1wRmlsZUMgPSBRRmlsZTo6ZW5jb2RlTmFtZSh0bXBGaWxlLm5h bWUoKSk7CiAgICBjb25zdCBjaGFyICp0bXAgPSB0bXBGaWxlQy5kYXRhKCk7CgogICAgYnVmZmVy LnNwcmludGYoICJ1bW91bnQgJXMgMj4lcyIsIFFGaWxlOjplbmNvZGVOYW1lKF9wb2ludCkuZGF0 YSgpLCB0bXAgKTsKICAgIHN5c3RlbSggYnVmZmVyLmFzY2lpKCkgKTsKCiAgICBRU3RyaW5nIGVy ciA9IHRlc3RMb2dGaWxlKCB0bXAgKTsKICAgIGlmICggZXJyLmlzRW1wdHkoKSApCglmaW5pc2hl ZCgpOwogICAgZWxzZQogICAgICAgIGVycm9yKCBLSU86OkVSUl9DT1VMRF9OT1RfVU5NT1VOVCwg ZXJyICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIFV0 aWxpdGllcwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KClFTdHJp bmcgdGVzdExvZ0ZpbGUoIGNvbnN0IGNoYXIgKl9maWxlbmFtZSApCnsKICAgIGNoYXIgYnVmZmVy WyAxMDI0IF07CiAgICBRU3RyaW5nIHJlc3VsdDsKI2lmZGVmIHN1bgogICAgc3RydWN0IHN0YXQ2 NCBidWZmOwogICAgc3RhdDY0KCBfZmlsZW5hbWUsICZidWZmICk7CiNlbHNlCiAgICBzdHJ1Y3Qg c3RhdCBidWZmOwogICAgc3RhdCggX2ZpbGVuYW1lLCAmYnVmZiApOwojZW5kaWYKCiAgICBpbnQg c2l6ZSA9IGJ1ZmYuc3Rfc2l6ZTsKICAgIGlmICggc2l6ZSA9PSAwICkgewoJdW5saW5rKCBfZmls ZW5hbWUgKTsKCXJldHVybiByZXN1bHQ7CiAgICB9CgogICAgRklMRSAqIGYgPSBmb3BlbiggX2Zp bGVuYW1lLCAicmIiICk7CiAgICBpZiAoIGYgPT0gMEwgKSB7Cgl1bmxpbmsoIF9maWxlbmFtZSAp OwoJcmVzdWx0ID0gaTE4bigiQ291bGQgbm90IHJlYWQgJTEiKS5hcmcoUUZpbGU6OmRlY29kZU5h bWUoX2ZpbGVuYW1lKSk7CglyZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHJlc3VsdCA9ICIiOwog ICAgY29uc3QgY2hhciAqcCA9ICIiOwogICAgd2hpbGUgKCBwICE9IDBMICkgewoJcCA9IGZnZXRz KCBidWZmZXIsIHNpemVvZihidWZmZXIpLTEsIGYgKTsKCWlmICggcCAhPSAwTCApCgkgICAgcmVz dWx0ICs9IFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoYnVmZmVyKTsKICAgIH0KCiAgICBmY2xvc2Uo IGYgKTsKCiAgICB1bmxpbmsoIF9maWxlbmFtZSApOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCiNp bmNsdWRlICJmaWxlLm1vYyIK --------------Boundary-00=_WH8VLHTBVGPGQ0AT8N4Y--