LyoKICogUlBDIGJpbmRpbmcgQVBJCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19CSU5ESU5HX0gKI2RlZmluZSBfX1dJTkVfUlBDX0JJTkRJTkdfSAoKI2luY2x1ZGUgIndpbmUvcnBjc3Nfc2hhcmVkLmgiCgp0eXBlZGVmIHN0cnVjdCBfUnBjQ29ubmVjdGlvbgp7CiAgc3RydWN0IF9ScGNDb25uZWN0aW9uKiBOZXh0OwogIHN0cnVjdCBfUnBjQmluZGluZyogVXNlZDsKICBCT09MIHNlcnZlcjsKICBMUFNUUiBQcm90c2VxOwogIExQU1RSIE5ldHdvcmtBZGRyOwogIExQU1RSIEVuZHBvaW50OwogIEhBTkRMRSBjb25uLCB0aHJlYWQ7CiAgT1ZFUkxBUFBFRCBvdmw7Cn0gUnBjQ29ubmVjdGlvbjsKCi8qIGRvbid0IGtub3cgd2hhdCBNUydzIHN0cnVjdHVyZSBsb29rcyBsaWtlICovCnR5cGVkZWYgc3RydWN0IF9ScGNCaW5kaW5nCnsKICBEV09SRCByZWZzOwogIHN0cnVjdCBfUnBjQmluZGluZyogTmV4dDsKICBCT09MIHNlcnZlcjsKICBVVUlEIE9iamVjdFV1aWQ7CiAgVVVJRCBBY3RpdmVVdWlkOwogIExQU1RSIFByb3RzZXE7CiAgTFBTVFIgTmV0d29ya0FkZHI7CiAgTFBTVFIgRW5kcG9pbnQ7CiAgUlBDX0JMT0NLSU5HX0ZOIEJsb2NraW5nRm47CiAgVUxPTkcgU2VydmVyVGlkOwogIFJwY0Nvbm5lY3Rpb24qIEZyb21Db25uOwp9IFJwY0JpbmRpbmc7CgpMUFNUUiBSUENSVDRfc3RybmR1cEEoTFBTVFIgc3JjLCBJTlQgbGVuKTsKTFBXU1RSIFJQQ1JUNF9zdHJuZHVwVyhMUFdTVFIgc3JjLCBJTlQgbGVuKTsKTFBTVFIgUlBDUlQ0X3N0cmR1cFd0b0EoTFBXU1RSIHNyYyk7CkxQV1NUUiBSUENSVDRfc3RyZHVwQXRvVyhMUFNUUiBzcmMpOwp2b2lkIFJQQ1JUNF9zdHJmcmVlKExQU1RSIHNyYyk7CgojZGVmaW5lIFJQQ1JUNF9zdHJkdXBBKHgpIFJQQ1JUNF9zdHJuZHVwQSgoeCksLTEpCiNkZWZpbmUgUlBDUlQ0X3N0cmR1cFcoeCkgUlBDUlQ0X3N0cm5kdXBXKCh4KSwtMSkKClJQQ19TVEFUVVMgUlBDUlQ0X0NyZWF0ZUNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbioqIENvbm5lY3Rpb24sIEJPT0wgc2VydmVyLCBMUFNUUiBQcm90c2VxLCBMUFNUUiBOZXR3b3JrQWRkciwgTFBTVFIgRW5kcG9pbnQsIExQU1RSIE5ldHdvcmtPcHRpb25zLCBScGNCaW5kaW5nKiBCaW5kaW5nKTsKUlBDX1NUQVRVUyBSUENSVDRfRGVzdHJveUNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X09wZW5Db25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pOwpSUENfU1RBVFVTIFJQQ1JUNF9DbG9zZUNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X1NwYXduQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbiwgUnBjQ29ubmVjdGlvbiogT2xkQ29ubmVjdGlvbik7CgpSUENfU1RBVFVTIFJQQ1JUNF9DcmVhdGVCaW5kaW5nQShScGNCaW5kaW5nKiogQmluZGluZywgQk9PTCBzZXJ2ZXIsIExQU1RSIFByb3RzZXEpOwpSUENfU1RBVFVTIFJQQ1JUNF9DcmVhdGVCaW5kaW5nVyhScGNCaW5kaW5nKiogQmluZGluZywgQk9PTCBzZXJ2ZXIsIExQV1NUUiBQcm90c2VxKTsKUlBDX1NUQVRVUyBSUENSVDRfQ29tcGxldGVCaW5kaW5nQShScGNCaW5kaW5nKiBCaW5kaW5nLCBMUFNUUiBOZXR3b3JrQWRkciwgIExQU1RSIEVuZHBvaW50LCAgTFBTVFIgTmV0d29ya09wdGlvbnMpOwpSUENfU1RBVFVTIFJQQ1JUNF9Db21wbGV0ZUJpbmRpbmdXKFJwY0JpbmRpbmcqIEJpbmRpbmcsIExQV1NUUiBOZXR3b3JrQWRkciwgTFBXU1RSIEVuZHBvaW50LCBMUFdTVFIgTmV0d29ya09wdGlvbnMpOwpSUENfU1RBVFVTIFJQQ1JUNF9SZXNvbHZlQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBMUFNUUiBFbmRwb2ludCk7ClJQQ19TVEFUVVMgUlBDUlQ0X1NldEJpbmRpbmdPYmplY3QoUnBjQmluZGluZyogQmluZGluZywgVVVJRCogT2JqZWN0VXVpZCk7ClJQQ19TVEFUVVMgUlBDUlQ0X01ha2VCaW5kaW5nKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfRXhwb3J0QmluZGluZyhScGNCaW5kaW5nKiogQmluZGluZywgUnBjQmluZGluZyogT2xkQmluZGluZyk7ClJQQ19TVEFUVVMgUlBDUlQ0X0Rlc3Ryb3lCaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcpOwpSUENfU1RBVFVTIFJQQ1JUNF9PcGVuQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X0Nsb3NlQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKQk9PTCBSUENSVDRfUlBDU1NPbkRlbWFuZENhbGwoUFJQQ1NTX05QX01FU1NBR0UgbXNnLCBjaGFyICp2YXJkYXRhX3BheWxvYWQsIFBSUENTU19OUF9SRVBMWSByZXBseSk7CkhBTkRMRSBSUENSVDRfR2V0TWFzdGVyTXV0ZXgodm9pZCk7CkhBTkRMRSBSUENSVDRfUnBjc3NOUENvbm5lY3Qodm9pZCk7CgojZW5kaWYK