LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgoKI2luY2x1ZGUgInJwY3Byb3h5LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgIm5kcl9taXNjLmgiCiNpbmNsdWRlICJycGNuZHIuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKHJwYyk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIE5kckNsaWVudEluaXRpYWxpemVOZXcgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyggUFJQQ19NRVNTQUdFIHBScGNNZXNzYWdlLCBQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2csIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTUlETF9TVFVCX0RFU0MgcFN0dWJEZXNjLCB1bnNpZ25lZCBpbnQgUHJvY051bSApCnsKICBUUkFDRSgiKHBScGNNZXNzYWdlID09IF4lcCwgcFN0dWJNc2cgPT0gXiVwLCBwU3R1YkRlc2MgPT0gXiVwLCBQcm9jTnVtID09ICVkKVxuIiwKICAgIHBScGNNZXNzYWdlLCBwU3R1Yk1zZywgcFN0dWJEZXNjLCBQcm9jTnVtKTsKCiAgYXNzZXJ0KCBwUnBjTWVzc2FnZSAmJiBwU3R1Yk1zZyAmJiBwU3R1YkRlc2MgKTsKCiAgcFJwY01lc3NhZ2UtPkhhbmRsZSA9IE5VTEw7CiAgcFJwY01lc3NhZ2UtPlByb2NOdW0gPSBQcm9jTnVtOwogIHBScGNNZXNzYWdlLT5ScGNJbnRlcmZhY2VJbmZvcm1hdGlvbiA9IHBTdHViRGVzYy0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb247CiAgcFJwY01lc3NhZ2UtPlJwY0ZsYWdzID0gMDsKICBwUnBjTWVzc2FnZS0+RGF0YVJlcHJlc2VudGF0aW9uID0gTkRSX0xPQ0FMX0RBVEFfUkVQUkVTRU5UQVRJT047CgogIHBTdHViTXNnLT5ScGNNc2cgPSBwUnBjTWVzc2FnZTsKICBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgPSBOVUxMOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBOVUxMOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggPSAwOwogIHBTdHViTXNnLT5Jc0NsaWVudCA9IFRSVUU7CiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gRkFMU0U7CiAgcFN0dWJNc2ctPnBBbGxvY0FsbE5vZGVzQ29udGV4dCA9IE5VTEw7CiAgcFN0dWJNc2ctPnBQb2ludGVyUXVldWVTdGF0ZSA9IE5VTEw7CiAgcFN0dWJNc2ctPklnbm9yZUVtYmVkZGVkUG9pbnRlcnMgPSAwOwogIHBTdHViTXNnLT5Qb2ludGVyQnVmZmVyTWFyayA9IE5VTEw7CiAgcFN0dWJNc2ctPmZCdWZmZXJWYWxpZCA9IDA7CiAgcFN0dWJNc2ctPnVGbGFncyA9IDA7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzYy0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+U3RhY2tUb3AgPSBOVUxMOwogIHBTdHViTXNnLT5TdHViRGVzYyA9IHBTdHViRGVzYzsKICBwU3R1Yk1zZy0+RnVsbFB0clJlZklkID0gMDsKICBwU3R1Yk1zZy0+UG9pbnRlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPmZJbkRvbnRGcmVlID0gMDsKICBwU3R1Yk1zZy0+ZkRvbnRDYWxsRnJlZUluc3QgPSAwOwogIHBTdHViTXNnLT5mSW5Pbmx5UGFyYW0gPSAwOwogIHBTdHViTXNnLT5mSGFzUmV0dXJuID0gMDsKICBwU3R1Yk1zZy0+Zkhhc0V4dGVuc2lvbnMgPSAwOwogIHBTdHViTXNnLT5mSGFzTmV3Q29yckRlc2MgPSAwOwogIHBTdHViTXNnLT5mVW51c2VkID0gMDsKICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCA9IE1TSENUWF9ESUZGRVJFTlRNQUNISU5FOwogIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0ID0gTlVMTDsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBOVUxMOwogIHBTdHViTXNnLT5wQXJyYXlJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSAwOwogIC8qIEZJWE1FOiBMb3dTdGFja01hcmsgKi8KICBwU3R1Yk1zZy0+cEFzeW5jTXNnID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJNZW1vcnkgPSBOVUxMOwogIHBTdHViTXNnLT5wTWVtb3J5TGlzdCA9IE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBOZHJTZXJ2ZXJJbml0aWFsaXplTmV3IFtSUENSVDQuQF0KICovCnVuc2lnbmVkIGNoYXIqIFdJTkFQSSBOZHJTZXJ2ZXJJbml0aWFsaXplTmV3KCBQUlBDX01FU1NBR0UgcFJwY01zZywgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzYyApCnsKICBUUkFDRSgiKHBScGNNc2cgPT0gXiVwLCBwU3R1Yk1zZyA9PSBeJXAsIHBTdHViRGVzYyA9PSBeJXApXG4iLCBwUnBjTXNnLCBwU3R1Yk1zZywgcFN0dWJEZXNjKTsKCiAgYXNzZXJ0KCBwUnBjTXNnICYmIHBTdHViTXNnICYmIHBTdHViRGVzYyApOwoKICAvKiBub3QgZXZlcnlvbmUgYWxsb2NhdGVzIHN0YWNrIHNwYWNlIGZvciB3MmtSZXNlcnZlZCAqLwogIG1lbXNldChwU3R1Yk1zZywgMCwgRklFTERfT0ZGU0VUKE1JRExfU1RVQl9NRVNTQUdFLHBDU0luZm8pKTsKCiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gVFJVRTsKICBwU3R1Yk1zZy0+SXNDbGllbnQgPSBGQUxTRTsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2M7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzYy0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+UnBjTXNnID0gcFJwY01zZzsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlclN0YXJ0ID0gcFJwY01zZy0+QnVmZmVyOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggPSBwUnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgcFN0dWJNc2ctPkJ1ZmZlckVuZCA9IHBTdHViTXNnLT5CdWZmZXIgKyBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoOwoKICAvKiBGSVhNRTogZGV0ZXJtaW5lIHRoZSBwcm9wZXIgcmV0dXJuIHZhbHVlICovCiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyR2V0QnVmZmVyIFtSUENSVDQuQF0KICovCnVuc2lnbmVkIGNoYXIgKldJTkFQSSBOZHJHZXRCdWZmZXIoUE1JRExfU1RVQl9NRVNTQUdFIHN0dWJtc2csIFVMT05HIGJ1ZmxlbiwgUlBDX0JJTkRJTkdfSEFORExFIGhhbmRsZSkKewogIFRSQUNFKCIoc3R1Ym1zZyA9PSBeJXAsIGJ1ZmxlbiA9PSAldSwgaGFuZGxlID09ICVwKTogd2lsZCBndWVzcy5cbiIsIHN0dWJtc2csIGJ1ZmxlbiwgaGFuZGxlKTsKICAKICBhc3NlcnQoIHN0dWJtc2cgJiYgc3R1Ym1zZy0+UnBjTXNnICk7CgogIC8qIEkgZ3Vlc3MgdGhpcyBpcyBvdXIgY2hhbmNlIHRvIHB1dCB0aGUgYmluZGluZyBoYW5kbGUgaW50byB0aGUgUlBDX01FU1NBR0UgKi8KICBzdHVibXNnLT5ScGNNc2ctPkhhbmRsZSA9IGhhbmRsZTsKICAKICBzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlckxlbmd0aCA9IGJ1ZmxlbjsKICBpZiAoSV9ScGNHZXRCdWZmZXIoc3R1Ym1zZy0+UnBjTXNnKSAhPSBTX09LKQogICAgcmV0dXJuIE5VTEw7CgogIHN0dWJtc2ctPkJ1ZmZlciA9IHN0dWJtc2ctPkJ1ZmZlclN0YXJ0ID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXI7CiAgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgc3R1Ym1zZy0+QnVmZmVyRW5kID0gc3R1Ym1zZy0+QnVmZmVyICsgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoOwogIHJldHVybiAoc3R1Ym1zZy0+QnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlcik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJGcmVlQnVmZmVyIFtSUENSVDQuQF0KICovCnZvaWQgV0lOQVBJIE5kckZyZWVCdWZmZXIoUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnKQp7CiAgVFJBQ0UoIihwU3R1Yk1zZyA9PSBeJXApOiB3aWxkIGd1ZXNzLlxuIiwgcFN0dWJNc2cpOwogIElfUnBjRnJlZUJ1ZmZlcihwU3R1Yk1zZy0+UnBjTXNnKTsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gMDsKICBwU3R1Yk1zZy0+QnVmZmVyID0gcFN0dWJNc2ctPkJ1ZmZlckVuZCA9ICh1bnNpZ25lZCBjaGFyICopKHBTdHViTXNnLT5ScGNNc2ctPkJ1ZmZlciA9IE5VTEwpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJTZW5kUmVjZWl2ZSBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyU2VuZFJlY2VpdmUoIFBNSURMX1NUVUJfTUVTU0FHRSBzdHVibXNnLCB1bnNpZ25lZCBjaGFyICpidWZmZXIgICkKewogIFJQQ19TVEFUVVMgc3RhdHVzOwoKICBUUkFDRSgiKHN0dWJtc2cgPT0gXiVwLCBidWZmZXIgPT0gXiVwKVxuIiwgc3R1Ym1zZywgYnVmZmVyKTsKCiAgLyogRklYTUU6IGhvdyB0byBoYW5kbGUgZXJyb3JzPyAocmFpc2UgZXhjZXB0aW9uPykgKi8KICBpZiAoIXN0dWJtc2cpIHsKICAgIEVSUigiTlVMTCBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBpZiAoIXN0dWJtc2ctPlJwY01zZykgewogICAgRVJSKCJSUEMgTWVzc2FnZSBub3QgcHJlc2VudCBpbiBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZmZXIgLSAodW5zaWduZWQgY2hhciAqKXN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0YXR1cyA9IElfUnBjU2VuZFJlY2VpdmUoc3R1Ym1zZy0+UnBjTXNnKTsKICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKQogICAgUnBjUmFpc2VFeGNlcHRpb24oc3RhdHVzKTsKCiAgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgc3R1Ym1zZy0+QnVmZmVyU3RhcnQgPSBzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBzdHVibXNnLT5CdWZmZXJFbmQgPSBzdHVibXNnLT5CdWZmZXJTdGFydCArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydDsKCiAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyTWFwQ29tbUFuZEZhdWx0U3RhdHVzIFtSUENSVDQuQF0KICovClJQQ19TVEFUVVMgUlBDX0VOVFJZIE5kck1hcENvbW1BbmRGYXVsdFN0YXR1cyggUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICpwQ29tbVN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcEZhdWx0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19TVEFUVVMgU3RhdHVzICkKewogICAgRklYTUUoIiglcCwgJXAsICVwLCAlbGQpOiBzdHViXG4iLCBwU3R1Yk1zZywgcENvbW1TdGF0dXMsIHBGYXVsdFN0YXR1cywgU3RhdHVzKTsKCiAgICAqcENvbW1TdGF0dXMgPSAwOwogICAgKnBGYXVsdFN0YXR1cyA9IDA7CgogICAgcmV0dXJuIFJQQ19TX09LOwp9Cg==