LyoKIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIEluYy4gKCJBcHBsZSIpIGluCiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwgaW5zdGFsbGF0aW9uLCAKIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgCiB0ZXJtcy4gIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcywgcGxlYXNlIGRvIG5vdCB1c2UsIGluc3RhbGwsIG1vZGlmeSBvciAKIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgogCiBJbiBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIGFiaWRlIGJ5IHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCBzdWJqZWN0IHRvIHRoZXNlIAogdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4gCiB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIAogcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGluIHNvdXJjZSBhbmQvb3IgYmluYXJ5IAogZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0IAogbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCAKIHN1Y2ggcmVkaXN0cmlidXRpb25zIG9mIHRoZSBBcHBsZSBTb2Z0d2FyZS4gIE5laXRoZXIgdGhlIG5hbWUsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MgCiBvciBsb2dvcyBvZiBBcHBsZSBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gCiB0aGUgQXBwbGUgU29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSBBcHBsZS4gRXhjZXB0IGFzIGV4cHJlc3NseQogc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgQXBwbGUKIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciAKIGRlcml2YXRpdmUgd29ya3Mgb3IgYnkgb3RoZXIgd29ya3MgaW4gd2hpY2ggdGhlIEFwcGxlIFNvZnR3YXJlIG1heSBiZSBpbmNvcnBvcmF0ZWQuCiAKIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywgCiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBOT04tSU5GUklOR0VNRU5ULCAKIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIAogVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgogCiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIAogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgCiAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFLCAKIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgCiBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIAogT1RIRVJXSVNFLCBFVkVOIElGIEFQUExFIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCiNpbXBvcnQgPFdlYktpdC9ucGFwaS5oPgojaW1wb3J0IDxXZWJLaXQvbnBmdW5jdGlvbnMuaD4KI2ltcG9ydCA8V2ViS2l0L25wcnVudGltZS5oPgoKTlBOZXRzY2FwZUZ1bmNzICpicm93c2VyOwoKTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwpOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdyk7Ck5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwpOUEVycm9yIE5QUF9EZXN0cm95U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29uKTsKaW50MzJfdCBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOwppbnQzMl90IE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGxlbiwgdm9pZCogYnVmZmVyKTsKdm9pZCBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwp2b2lkIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwppbnQxNl90IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKdm9pZCBOUFBfVVJMTm90aWZ5KE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciogVVJMLCBOUFJlYXNvbiByZWFzb24sIHZvaWQqIG5vdGlmeURhdGEpOwpOUEVycm9yIE5QUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7Ck5QRXJyb3IgTlBQX1NldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKCiNwcmFnbWEgZXhwb3J0IG9uCi8vIE1hY2gtbyBlbnRyeSBwb2ludHMKTlBFcnJvciBOUF9Jbml0aWFsaXplKE5QTmV0c2NhcGVGdW5jcyAqYnJvd3NlckZ1bmNzKTsKTlBFcnJvciBOUF9HZXRFbnRyeVBvaW50cyhOUFBsdWdpbkZ1bmNzICpwbHVnaW5GdW5jcyk7CnZvaWQgTlBfU2h1dGRvd24odm9pZCk7Ci8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQ0ZNIGJyb3dzZXJzLgppbnQgbWFpbihOUE5ldHNjYXBlRnVuY3MgKmJyb3dzZXJGdW5jcywgTlBQbHVnaW5GdW5jcyAqcGx1Z2luRnVuY3MsIE5QUF9TaHV0ZG93blByb2NQdHIgKnNodXRkb3duKTsKI3ByYWdtYSBleHBvcnQgb2ZmCgoKdHlwZWRlZiB2b2lkICgqIEZ1bmN0aW9uUG9pbnRlcikgKHZvaWQpOwp0eXBlZGVmIHZvaWQgKCogVHJhbnNpdGlvblZlY3RvcikgKHZvaWQpOwpzdGF0aWMgRnVuY3Rpb25Qb2ludGVyIGZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoVHJhbnNpdGlvblZlY3Rvcik7CnN0YXRpYyBUcmFuc2l0aW9uVmVjdG9yIHRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoRnVuY3Rpb25Qb2ludGVyKTsKCi8vIE1hY2gtbyBlbnRyeSBwb2ludHMKTlBFcnJvciBOUF9Jbml0aWFsaXplKE5QTmV0c2NhcGVGdW5jcyogYnJvd3NlckZ1bmNzKQp7CiAgICBicm93c2VyID0gYnJvd3NlckZ1bmNzOwogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QX0dldEVudHJ5UG9pbnRzKE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzKQp7CiAgICBwbHVnaW5GdW5jcy0+dmVyc2lvbiA9IDExOwogICAgcGx1Z2luRnVuY3MtPnNpemUgPSBzaXplb2YocGx1Z2luRnVuY3MpOwogICAgcGx1Z2luRnVuY3MtPm5ld3AgPSBOUFBfTmV3OwogICAgcGx1Z2luRnVuY3MtPmRlc3Ryb3kgPSBOUFBfRGVzdHJveTsKICAgIHBsdWdpbkZ1bmNzLT5zZXR3aW5kb3cgPSBOUFBfU2V0V2luZG93OwogICAgcGx1Z2luRnVuY3MtPm5ld3N0cmVhbSA9IE5QUF9OZXdTdHJlYW07CiAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveXN0cmVhbSA9IE5QUF9EZXN0cm95U3RyZWFtOwogICAgcGx1Z2luRnVuY3MtPmFzZmlsZSA9IE5QUF9TdHJlYW1Bc0ZpbGU7CiAgICBwbHVnaW5GdW5jcy0+d3JpdGVyZWFkeSA9IE5QUF9Xcml0ZVJlYWR5OwogICAgcGx1Z2luRnVuY3MtPndyaXRlID0gKE5QUF9Xcml0ZVByb2NQdHIpTlBQX1dyaXRlOwogICAgcGx1Z2luRnVuY3MtPnByaW50ID0gTlBQX1ByaW50OwogICAgcGx1Z2luRnVuY3MtPmV2ZW50ID0gTlBQX0hhbmRsZUV2ZW50OwogICAgcGx1Z2luRnVuY3MtPnVybG5vdGlmeSA9IE5QUF9VUkxOb3RpZnk7CiAgICBwbHVnaW5GdW5jcy0+Z2V0dmFsdWUgPSBOUFBfR2V0VmFsdWU7CiAgICBwbHVnaW5GdW5jcy0+c2V0dmFsdWUgPSBOUFBfU2V0VmFsdWU7CiAgICAKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKdm9pZCBOUF9TaHV0ZG93bih2b2lkKQp7Cgp9CiAKLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBDRk0gYnJvd3NlcnMuCmludCBtYWluKE5QTmV0c2NhcGVGdW5jcyAqYnJvd3NlckZ1bmNzLCBOUFBsdWdpbkZ1bmNzICpwbHVnaW5GdW5jcywgTlBQX1NodXRkb3duUHJvY1B0ciAqc2h1dGRvd24pCnsKICAgIGJyb3dzZXIgPSBtYWxsb2Moc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpOwogICAgYnplcm8oYnJvd3Nlciwgc2l6ZW9mKE5QTmV0c2NhcGVGdW5jcykpOwogICAgCiAgICBicm93c2VyLT5zaXplID0gYnJvd3NlckZ1bmNzLT5zaXplOwogICAgYnJvd3Nlci0+dmVyc2lvbiA9IGJyb3dzZXJGdW5jcy0+dmVyc2lvbjsKICAgIAogICAgLy8gU2luY2UgdGhpcyBpcyBhIG1hY2gtbyBwbHVnLWluIGFuZCB0aGUgYnJvd3NlciBpcyBDRk0gYmVjYXVzZSBpdCBpcyBjYWxsaW5nIG1haW4sIHRyYW5zbGF0ZQogICAgLy8gb3VyIGZ1bmN0aW9uIHBvaW50cyBpbnRvIFRWZWN0b3JzIHNvIHRoZSBicm93c2VyIGNhbiBjYWxsIHRoZW0uCiAgICBicm93c2VyLT5nZXR1cmwgPSAoTlBOX0dldFVSTFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmdldHVybCk7CiAgICBicm93c2VyLT5wb3N0dXJsID0gKE5QTl9Qb3N0VVJMUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+cG9zdHVybCk7CiAgICBicm93c2VyLT5yZXF1ZXN0cmVhZCA9IChOUE5fUmVxdWVzdFJlYWRQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5yZXF1ZXN0cmVhZCk7CiAgICBicm93c2VyLT5uZXdzdHJlYW0gPSAoTlBOX05ld1N0cmVhbVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPm5ld3N0cmVhbSk7CiAgICBicm93c2VyLT53cml0ZSA9IChOUE5fV3JpdGVQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT53cml0ZSk7CiAgICBicm93c2VyLT5kZXN0cm95c3RyZWFtID0gKE5QTl9EZXN0cm95U3RyZWFtUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+ZGVzdHJveXN0cmVhbSk7CiAgICBicm93c2VyLT5zdGF0dXMgPSAoTlBOX1N0YXR1c1Byb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnN0YXR1cyk7CiAgICBicm93c2VyLT51YWdlbnQgPSAoTlBOX1VzZXJBZ2VudFByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPnVhZ2VudCk7CiAgICBicm93c2VyLT5tZW1hbGxvYyA9IChOUE5fTWVtQWxsb2NQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5tZW1hbGxvYyk7CiAgICBicm93c2VyLT5tZW1mcmVlID0gKE5QTl9NZW1GcmVlUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+bWVtZnJlZSk7CiAgICBicm93c2VyLT5tZW1mbHVzaCA9IChOUE5fTWVtRmx1c2hQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5tZW1mbHVzaCk7CiAgICBicm93c2VyLT5yZWxvYWRwbHVnaW5zID0gKE5QTl9SZWxvYWRQbHVnaW5zUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+cmVsb2FkcGx1Z2lucyk7CiAgICBicm93c2VyLT5nZXR1cmxub3RpZnkgPSAoTlBOX0dldFVSTE5vdGlmeVByb2NQdHIpZnVuY3Rpb25Qb2ludGVyRm9yVFZlY3RvcigoVHJhbnNpdGlvblZlY3Rvcilicm93c2VyRnVuY3MtPmdldHVybG5vdGlmeSk7CiAgICBicm93c2VyLT5wb3N0dXJsbm90aWZ5ID0gKE5QTl9Qb3N0VVJMTm90aWZ5UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+cG9zdHVybG5vdGlmeSk7CiAgICBicm93c2VyLT5nZXR2YWx1ZSA9IChOUE5fR2V0VmFsdWVQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5nZXR2YWx1ZSk7CiAgICBicm93c2VyLT5zZXR2YWx1ZSA9IChOUE5fU2V0VmFsdWVQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5zZXR2YWx1ZSk7CiAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdCA9IChOUE5fSW52YWxpZGF0ZVJlY3RQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5pbnZhbGlkYXRlcmVjdCk7CiAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVnaW9uID0gKE5QTl9JbnZhbGlkYXRlUmVnaW9uUHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+aW52YWxpZGF0ZXJlZ2lvbik7CiAgICBicm93c2VyLT5mb3JjZXJlZHJhdyA9IChOUE5fRm9yY2VSZWRyYXdQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5mb3JjZXJlZHJhdyk7CiAgICBicm93c2VyLT5nZXRKYXZhRW52ID0gKE5QTl9HZXRKYXZhRW52UHJvY1B0cilmdW5jdGlvblBvaW50ZXJGb3JUVmVjdG9yKChUcmFuc2l0aW9uVmVjdG9yKWJyb3dzZXJGdW5jcy0+Z2V0SmF2YUVudik7CiAgICBicm93c2VyLT5nZXRKYXZhUGVlciA9IChOUE5fR2V0SmF2YVBlZXJQcm9jUHRyKWZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoKFRyYW5zaXRpb25WZWN0b3IpYnJvd3NlckZ1bmNzLT5nZXRKYXZhUGVlcik7CiAgICAKICAgIHBsdWdpbkZ1bmNzLT52ZXJzaW9uID0gMTE7CiAgICBwbHVnaW5GdW5jcy0+c2l6ZSA9IHNpemVvZihwbHVnaW5GdW5jcyk7CiAgICBwbHVnaW5GdW5jcy0+bmV3cCA9IChOUFBfTmV3UHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX05ldyk7CiAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveSA9IChOUFBfRGVzdHJveVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9EZXN0cm95KTsKICAgIHBsdWdpbkZ1bmNzLT5zZXR3aW5kb3cgPSAoTlBQX1NldFdpbmRvd1Byb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9TZXRXaW5kb3cpOwogICAgcGx1Z2luRnVuY3MtPm5ld3N0cmVhbSA9IChOUFBfTmV3U3RyZWFtUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX05ld1N0cmVhbSk7CiAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveXN0cmVhbSA9IChOUFBfRGVzdHJveVN0cmVhbVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9EZXN0cm95U3RyZWFtKTsKICAgIHBsdWdpbkZ1bmNzLT5hc2ZpbGUgPSAoTlBQX1N0cmVhbUFzRmlsZVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9TdHJlYW1Bc0ZpbGUpOwogICAgcGx1Z2luRnVuY3MtPndyaXRlcmVhZHkgPSAoTlBQX1dyaXRlUmVhZHlQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfV3JpdGVSZWFkeSk7CiAgICBwbHVnaW5GdW5jcy0+d3JpdGUgPSAoTlBQX1dyaXRlUHJvY1B0cil0VmVjdG9yRm9yRnVuY3Rpb25Qb2ludGVyKChGdW5jdGlvblBvaW50ZXIpTlBQX1dyaXRlKTsKICAgIHBsdWdpbkZ1bmNzLT5wcmludCA9IChOUFBfUHJpbnRQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfUHJpbnQpOwogICAgcGx1Z2luRnVuY3MtPmV2ZW50ID0gKE5QUF9IYW5kbGVFdmVudFByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9IYW5kbGVFdmVudCk7CiAgICBwbHVnaW5GdW5jcy0+dXJsbm90aWZ5ID0gKE5QUF9VUkxOb3RpZnlQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfVVJMTm90aWZ5KTsKICAgIHBsdWdpbkZ1bmNzLT5nZXR2YWx1ZSA9IChOUFBfR2V0VmFsdWVQcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUFBfR2V0VmFsdWUpOwogICAgcGx1Z2luRnVuY3MtPnNldHZhbHVlID0gKE5QUF9TZXRWYWx1ZVByb2NQdHIpdFZlY3RvckZvckZ1bmN0aW9uUG9pbnRlcigoRnVuY3Rpb25Qb2ludGVyKU5QUF9TZXRWYWx1ZSk7CiAgICAKICAgICpzaHV0ZG93biA9IChOUFBfU2h1dGRvd25Qcm9jUHRyKXRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoKEZ1bmN0aW9uUG9pbnRlcilOUF9TaHV0ZG93bik7CiAgICAKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpCnsKICAgIC8vIENhbGwgd2luZG93LmFsZXJ0KCJTdWNjZXNzISIpCiAgICBOUEVycm9yIGVycm9yOwogICAgTlBPYmplY3QgKndpbmRvd09iamVjdCA9IE5VTEw7CiAgICBlcnJvciA9IGJyb3dzZXItPmdldHZhbHVlKGluc3RhbmNlLCBOUE5WV2luZG93TlBPYmplY3QsICZ3aW5kb3dPYmplY3QpOwogICAgaWYgKGVycm9yID09IE5QRVJSX05PX0VSUk9SKSB7CiAgICAgICAgTlBWYXJpYW50IGFsZXJ0TWVzc2FnZTsKICAgICAgICBTVFJJTkdaX1RPX05QVkFSSUFOVCgiU3VjY2VzcyEiLCBhbGVydE1lc3NhZ2UpOwogICAgICAgIE5QVmFyaWFudCByZXN1bHQ7CiAgICAgICAgYnJvd3Nlci0+aW52b2tlKGluc3RhbmNlLCB3aW5kb3dPYmplY3QsIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXIoImFsZXJ0IiksICZhbGVydE1lc3NhZ2UsIDEsICZyZXN1bHQpOwogICAgICAgIGJyb3dzZXItPnJlbGVhc2VvYmplY3Qod2luZG93T2JqZWN0KTsKICAgIH0KICAgIAogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKQp7CiAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Cn0KCk5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpCnsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSkKewogICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKfQoKTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbikKewogICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwp9CgppbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKewogICAgcmV0dXJuIDA7Cn0KCmludDMyX3QgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLCB2b2lkKiBidWZmZXIpCnsKICAgIHJldHVybiAwOwp9Cgp2b2lkIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSkKewp9Cgp2b2lkIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpCnsKCn0KCmludDE2X3QgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCnsKICAgIHJldHVybiAxOwp9Cgp2b2lkIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiB1cmwsIE5QUmVhc29uIHJlYXNvbiwgdm9pZCogbm90aWZ5RGF0YSkKewoKfQoKTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpCnsKICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwp9CgpOUEVycm9yIE5QUF9TZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QTlZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSkKewogICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cn0KCi8vIGZ1bmN0aW9uIHBvaW50ZXIgY29udmVydGVycwoKRnVuY3Rpb25Qb2ludGVyIGZ1bmN0aW9uUG9pbnRlckZvclRWZWN0b3IoVHJhbnNpdGlvblZlY3RvciB0dnApCnsKICAgIGNvbnN0IHVpbnQzMl90IHRlbXBbNl0gPSB7MHgzRDgwMDAwMCwgMHg2MThDMDAwMCwgMHg4MDBDMDAwMCwgMHg4MDRDMDAwNCwgMHg3QzA5MDNBNiwgMHg0RTgwMDQyMH07CiAgICB1aW50MzJfdCAqbmV3R2x1ZSA9IE5VTEw7CiAgICAKICAgIGlmICh0dnAgIT0gTlVMTCkgewogICAgICAgIG5ld0dsdWUgPSAodWludDMyX3QgKiltYWxsb2Moc2l6ZW9mKHRlbXApKTsKICAgICAgICBpZiAobmV3R2x1ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIHVuc2lnbmVkIGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIG5ld0dsdWVbaV0gPSB0ZW1wW2ldOwogICAgICAgICAgICBuZXdHbHVlWzBdIHw9ICgoVUludDMyKXR2cCA+PiAxNik7CiAgICAgICAgICAgIG5ld0dsdWVbMV0gfD0gKChVSW50MzIpdHZwICYgMHhGRkZGKTsKICAgICAgICAgICAgTWFrZURhdGFFeGVjdXRhYmxlKG5ld0dsdWUsIHNpemVvZih0ZW1wKSk7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gKEZ1bmN0aW9uUG9pbnRlciluZXdHbHVlOwp9CgpUcmFuc2l0aW9uVmVjdG9yIHRWZWN0b3JGb3JGdW5jdGlvblBvaW50ZXIoRnVuY3Rpb25Qb2ludGVyIGZwKQp7CiAgICBGdW5jdGlvblBvaW50ZXIgKm5ld0dsdWUgPSBOVUxMOwogICAgaWYgKGZwICE9IE5VTEwpIHsKICAgICAgICBuZXdHbHVlID0gKEZ1bmN0aW9uUG9pbnRlciAqKW1hbGxvYygyICogc2l6ZW9mKEZ1bmN0aW9uUG9pbnRlcikpOwogICAgICAgIGlmIChuZXdHbHVlICE9IE5VTEwpIHsKICAgICAgICAgICAgbmV3R2x1ZVswXSA9IGZwOwogICAgICAgICAgICBuZXdHbHVlWzFdID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKFRyYW5zaXRpb25WZWN0b3IpbmV3R2x1ZTsKfQo=