LyoKICogQ29weXJpZ2h0IKkgMjAwNiBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBYaWFuZyBIYWloYW8gPGhhaWhhby54aWFuZ0BpbnRlbC5jb20+CiAqCiAqLwoKI2lmbmRlZiBfSTk2NV9SRU5ERVJfSF8KI2RlZmluZSBfSTk2NV9SRU5ERVJfSF8KCiNkZWZpbmUgTUFYX1JFTkRFUl9TVVJGQUNFUyAgICAgMTYKI2RlZmluZSBNQVhfU0FNUExFUlMgICAgICAgICAgICAxNgoKc3RydWN0IGk5NjVfcmVuZGVyX3N0YXRlCnsKICAgIHN0cnVjdCB7CiAgICAgICAgZHJpX2JvICp2ZXJ0ZXhfYnVmZmVyOwogICAgfSB2YjsKCiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqc3RhdGU7CiAgICB9IHZzOwogICAgCiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqc3RhdGU7CiAgICAgICAgZHJpX2JvICpwcm9nOwogICAgfSBzZjsKCiAgICBzdHJ1Y3QgewogICAgICAgIGludCBzYW1wbGVyX2NvdW50OwogICAgICAgIGRyaV9ibyAqc2FtcGxlcjsKICAgICAgICBkcmlfYm8gKnN1cmZhY2VbTUFYX1JFTkRFUl9TVVJGQUNFU107CiAgICAgICAgZHJpX2JvICpiaW5kaW5nX3RhYmxlOwogICAgICAgIGRyaV9ibyAqc3RhdGU7CiAgICAgICAgZHJpX2JvICpwcm9nOwogICAgfSB3bTsKCiAgICBzdHJ1Y3QgewogICAgICAgIGRyaV9ibyAqc3RhdGU7CiAgICAgICAgZHJpX2JvICp2aWV3cG9ydDsKICAgIH0gY2M7CgogICAgc3RydWN0IGludGVsX3JlZ2lvbiAqZHJhd19yZWdpb247Cn07CgpCb29sIGk5NjVfcmVuZGVyX2luaXQoVkFEcml2ZXJDb250ZXh0UCBjdHgpOwpCb29sIGk5NjVfcmVuZGVyX3Rlcm1pbmF0ZShWQURyaXZlckNvbnRleHRQIGN0eCk7CnZvaWQgaTk2NV9yZW5kZXJfcHV0X3N1cmZhY2UoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgc3VyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBzcmN4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc3JjdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzcmNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3R3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3RoKTsKCgp2b2lkCmk5NjVfcmVuZGVyX3B1dF9zdWJwaWMoVkFEcml2ZXJDb250ZXh0UCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgIFZBU3VyZmFjZUlEIHN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3gsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IHNyY3ksCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY3csCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGRlc3R4LAogICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCBkZXN0eSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZGVzdHcsCiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlc3RoKTsKI2VuZGlmIC8qIF9JOTY1X1JFTkRFUl9IXyAqLwo=