LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgIm9iamJhc2UuaCIKCiNpbmNsdWRlICJycGNwcm94eS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlICJjcHNmLmgiCiNpbmNsdWRlICJuZHJfbWlzYy5oIgojaW5jbHVkZSAicnBjbmRyLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChvbGUpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJQcm94eUluaXRpYWxpemUgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyUHJveHlJbml0aWFsaXplKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSUENfTUVTU0FHRSBwUnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBQcm9jTnVtKQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlZClcbiIsIFRoaXMsIHBScGNNc2csIHBTdHViTXNnLCBwU3R1YkRlc2NyaXB0b3IsIFByb2NOdW0pOwogIE5kckNsaWVudEluaXRpYWxpemVOZXcocFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzY3JpcHRvciwgUHJvY051bSk7CiAgaWYgKFRoaXMpIFN0ZFByb3h5X0dldENoYW5uZWwoVGhpcywgJnBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlcik7CiAgaWYgKHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlcikgewogICAgaHIgPSBJUnBjQ2hhbm5lbEJ1ZmZlcl9HZXREZXN0Q3R4KHBTdHViTXNnLT5wUnBjQ2hhbm5lbEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwU3R1Yk1zZy0+cHZEZXN0Q29udGV4dCk7CiAgfQogIFRSQUNFKCJjaGFubmVsPSVwXG4iLCBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclByb3h5R2V0QnVmZmVyIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclByb3h5R2V0QnVmZmVyKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnKQp7CiAgSFJFU1VMVCBocjsKICBjb25zdCBJSUQgKnJpaWQgPSBOVUxMOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgVGhpcywgcFN0dWJNc2cpOwogIHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aCA9IHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfR0VUQlVGRkVSOwogIGhyID0gU3RkUHJveHlfR2V0SUlEKFRoaXMsICZyaWlkKTsKICBociA9IElScGNDaGFubmVsQnVmZmVyX0dldEJ1ZmZlcihwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUlBDT0xFTUVTU0FHRSopcFN0dWJNc2ctPlJwY01zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpaWQpOwogIHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0OwogIHBTdHViTXNnLT5kd1N0dWJQaGFzZSA9IFBST1hZX01BUlNIQUw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyUHJveHlTZW5kUmVjZWl2ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJQcm94eVNlbmRSZWNlaXZlKHZvaWQgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBVTE9ORyBTdGF0dXMgPSAwOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBUaGlzLCBwU3R1Yk1zZyk7CiAgcFN0dWJNc2ctPmR3U3R1YlBoYXNlID0gUFJPWFlfU0VORFJFQ0VJVkU7CiAgaHIgPSBJUnBjQ2hhbm5lbEJ1ZmZlcl9TZW5kUmVjZWl2ZShwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSUENPTEVNRVNTQUdFKilwU3R1Yk1zZy0+UnBjTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RhdHVzKTsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSBQUk9YWV9VTk1BUlNIQUw7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCA9IHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgPSBwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXI7CiAgcFN0dWJNc2ctPkJ1ZmZlckVuZCA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCArIHBTdHViTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydDsKCiAgLyogcmFpc2UgZXhjZXB0aW9uIGlmIGNhbGwgZmFpbGVkICovCiAgaWYgKGhyID09IFJQQ19TX0NBTExfRkFJTEVEKSBScGNSYWlzZUV4Y2VwdGlvbigqKERXT1JEKilwU3R1Yk1zZy0+QnVmZmVyKTsKICBlbHNlIGlmIChGQUlMRUQoaHIpKSBScGNSYWlzZUV4Y2VwdGlvbihocik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyUHJveHlGcmVlQnVmZmVyIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kclByb3h5RnJlZUJ1ZmZlcih2b2lkICpUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgVGhpcywgcFN0dWJNc2cpOwogIGhyID0gSVJwY0NoYW5uZWxCdWZmZXJfRnJlZUJ1ZmZlcihwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJQQ09MRU1FU1NBR0UqKXBTdHViTXNnLT5ScGNNc2cpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kclByb3h5RXJyb3JIYW5kbGVyIFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kclByb3h5RXJyb3JIYW5kbGVyKERXT1JEIGR3RXhjZXB0aW9uQ29kZSkKewogIEZJWE1FKCIoMHglMDhseCk6IHNlbWktc3R1YlxuIiwgZHdFeGNlcHRpb25Db2RlKTsKICByZXR1cm4gTUFLRV9IUkVTVUxUKFNFVkVSSVRZX0VSUk9SLCBGQUNJTElUWV9SUEMsIFJQQ19TX0NBTExfRkFJTEVEKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJTdHViSW5pdGlhbGl6ZSBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJTdHViSW5pdGlhbGl6ZShQUlBDX01FU1NBR0UgcFJwY01zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ0NIQU5ORUxCVUZGRVIgcFJwY0NoYW5uZWxCdWZmZXIpCnsKICBUUkFDRSgiKCVwLCVwLCVwLCVwKVxuIiwgcFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzY3JpcHRvciwgcFJwY0NoYW5uZWxCdWZmZXIpOwogIE5kclNlcnZlckluaXRpYWxpemVOZXcocFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzY3JpcHRvcik7CiAgcFN0dWJNc2ctPnBScGNDaGFubmVsQnVmZmVyID0gcFJwY0NoYW5uZWxCdWZmZXI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU3R1YkdldEJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJTdHViR2V0QnVmZmVyKExQUlBDU1RVQkJVRkZFUiBUaGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBSUENDSEFOTkVMQlVGRkVSIHBScGNDaGFubmVsQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnKQp7CiAgVFJBQ0UoIiglcCwlcClcbiIsIFRoaXMsIHBTdHViTXNnKTsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBwUnBjQ2hhbm5lbEJ1ZmZlcjsKICBwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoOwogIElfUnBjR2V0QnVmZmVyKHBTdHViTXNnLT5ScGNNc2cpOyAvKiA/ICovCiAgcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ID0gcFN0dWJNc2ctPlJwY01zZy0+QnVmZmVyOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXIgPSBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJDbGllbnRJbml0aWFsaXplTmV3KCBQUlBDX01FU1NBR0UgcFJwY01lc3NhZ2UsIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MsIHVuc2lnbmVkIGludCBQcm9jTnVtICkKewogIFRSQUNFKCIocFJwY01lc3NhZ2UgPT0gXiVwLCBwU3R1Yk1zZyA9PSBeJXAsIHBTdHViRGVzYyA9PSBeJXAsIFByb2NOdW0gPT0gJWQpXG4iLAogICAgcFJwY01lc3NhZ2UsIHBTdHViTXNnLCBwU3R1YkRlc2MsIFByb2NOdW0pOwoKICBhc3NlcnQoIHBScGNNZXNzYWdlICYmIHBTdHViTXNnICYmIHBTdHViRGVzYyApOwoKICBtZW1zZXQocFJwY01lc3NhZ2UsIDAsIHNpemVvZihSUENfTUVTU0FHRSkpOwoKICAvKiBub3QgZXZlcnlvbmUgYWxsb2NhdGVzIHN0YWNrIHNwYWNlIGZvciB3MmtSZXNlcnZlZCAqLwogIG1lbXNldChwU3R1Yk1zZywgMCwgRklFTERfT0ZGU0VUKE1JRExfU1RVQl9NRVNTQUdFLHBDU0luZm8pKTsKCiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gRkFMU0U7CiAgcFN0dWJNc2ctPklzQ2xpZW50ID0gVFJVRTsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2M7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzYy0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+UnBjTXNnID0gcFJwY01lc3NhZ2U7CgogIHBScGNNZXNzYWdlLT5Qcm9jTnVtID0gUHJvY051bTsKICBwUnBjTWVzc2FnZS0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb24gPSBwU3R1YkRlc2MtPlJwY0ludGVyZmFjZUluZm9ybWF0aW9uOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyKiBXSU5BUEkgTmRyU2VydmVySW5pdGlhbGl6ZU5ldyggUFJQQ19NRVNTQUdFIHBScGNNc2csIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MgKQp7CiAgVFJBQ0UoIihwUnBjTXNnID09IF4lcCwgcFN0dWJNc2cgPT0gXiVwLCBwU3R1YkRlc2MgPT0gXiVwKVxuIiwgcFJwY01zZywgcFN0dWJNc2csIHBTdHViRGVzYyk7CgogIGFzc2VydCggcFJwY01zZyAmJiBwU3R1Yk1zZyAmJiBwU3R1YkRlc2MgKTsKCiAgLyogbm90IGV2ZXJ5b25lIGFsbG9jYXRlcyBzdGFjayBzcGFjZSBmb3IgdzJrUmVzZXJ2ZWQgKi8KICBtZW1zZXQocFN0dWJNc2csIDAsIEZJRUxEX09GRlNFVChNSURMX1NUVUJfTUVTU0FHRSxwQ1NJbmZvKSk7CgogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IFRSVUU7CiAgcFN0dWJNc2ctPklzQ2xpZW50ID0gRkFMU0U7CiAgcFN0dWJNc2ctPlN0dWJEZXNjID0gcFN0dWJEZXNjOwogIHBTdHViTXNnLT5wZm5BbGxvY2F0ZSA9IHBTdHViRGVzYy0+cGZuQWxsb2NhdGU7CiAgcFN0dWJNc2ctPnBmbkZyZWUgPSBwU3R1YkRlc2MtPnBmbkZyZWU7CiAgcFN0dWJNc2ctPlJwY01zZyA9IHBScGNNc2c7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gcFJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBwU3R1Yk1zZy0+QnVmZmVyICsgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aDsKCiAgLyogRklYTUU6IGRldGVybWluZSB0aGUgcHJvcGVyIHJldHVybiB2YWx1ZSAqLwogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckdldEJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyR2V0QnVmZmVyKE1JRExfU1RVQl9NRVNTQUdFICpzdHVibXNnLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbiwgUlBDX0JJTkRJTkdfSEFORExFIGhhbmRsZSkKewogIFRSQUNFKCIoc3R1Ym1zZyA9PSBeJXAsIGJ1ZmxlbiA9PSAlbHUsIGhhbmRsZSA9PSAlcCk6IHdpbGQgZ3Vlc3MuXG4iLCBzdHVibXNnLCBidWZsZW4sIGhhbmRsZSk7CiAgCiAgYXNzZXJ0KCBzdHVibXNnICYmIHN0dWJtc2ctPlJwY01zZyApOwoKICAvKiBJIGd1ZXNzIHRoaXMgaXMgb3VyIGNoYW5jZSB0byBwdXQgdGhlIGJpbmRpbmcgaGFuZGxlIGludG8gdGhlIFJQQ19NRVNTQUdFICovCiAgc3R1Ym1zZy0+UnBjTXNnLT5IYW5kbGUgPSBoYW5kbGU7CiAgCiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZsZW47CiAgaWYgKElfUnBjR2V0QnVmZmVyKHN0dWJtc2ctPlJwY01zZykgIT0gU19PSykKICAgIHJldHVybiBOVUxMOwoKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aCA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHN0dWJtc2ctPkJ1ZmZlckVuZCA9IHN0dWJtc2ctPkJ1ZmZlciArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICByZXR1cm4gKHN0dWJtc2ctPkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXIpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRnJlZUJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJGcmVlQnVmZmVyKE1JRExfU1RVQl9NRVNTQUdFICpwU3R1Yk1zZykKewogIFRSQUNFKCIocFN0dWJNc2cgPT0gXiVwKTogd2lsZCBndWVzcy5cbiIsIHBTdHViTXNnKTsKICBJX1JwY0ZyZWVCdWZmZXIocFN0dWJNc2ctPlJwY01zZyk7CiAgcFN0dWJNc2ctPkJ1ZmZlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJFbmQgPSAodW5zaWduZWQgY2hhciAqKShwU3R1Yk1zZy0+UnBjTXNnLT5CdWZmZXIgPSBOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyU2VuZFJlY2VpdmUgW1JQQ1JUNC5AXQogKi8KdW5zaWduZWQgY2hhciAqV0lOQVBJIE5kclNlbmRSZWNlaXZlKCBNSURMX1NUVUJfTUVTU0FHRSAqc3R1Ym1zZywgdW5zaWduZWQgY2hhciAqYnVmZmVyICApCnsKICBUUkFDRSgiKHN0dWJtc2cgPT0gXiVwLCBidWZmZXIgPT0gXiVwKVxuIiwgc3R1Ym1zZywgYnVmZmVyKTsKCiAgLyogRklYTUU6IGhvdyB0byBoYW5kbGUgZXJyb3JzPyAocmFpc2UgZXhjZXB0aW9uPykgKi8KICBpZiAoIXN0dWJtc2cpIHsKICAgIEVSUigiTlVMTCBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBpZiAoIXN0dWJtc2ctPlJwY01zZykgewogICAgRVJSKCJSUEMgTWVzc2FnZSBub3QgcHJlc2VudCBpbiBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgLyogRklYTUU6IFNlZW1zIHdyb25nLiAgV2hlcmUgc2hvdWxkIHRoaXMgcmVhbGx5IGNvbWUgZnJvbSwgYW5kIHdoZW4/ICovCiAgc3R1Ym1zZy0+UnBjTXNnLT5EYXRhUmVwcmVzZW50YXRpb24gPSBORFJfTE9DQUxfREFUQV9SRVBSRVNFTlRBVElPTjsKCiAgaWYgKElfUnBjU2VuZFJlY2VpdmUoc3R1Ym1zZy0+UnBjTXNnKSAhPSBSUENfU19PSykgewogICAgV0FSTigiSV9ScGNTZW5kUmVjZWl2ZSBkaWQgbm90IHJldHVybiBzdWNjZXNzLlxuIik7CiAgICAvKiBGSVhNRTogcmFpc2UgZXhjZXB0aW9uPyAqLwogIH0KCiAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KICByZXR1cm4gTlVMTDsKfQo=