LyoKICogQ29weXJpZ2h0IKkgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgogKiBJTiBOTyBFVkVOVCBTSEFMTCBQUkVDSVNJT04gSU5TSUdIVCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCiAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQogKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICogQXV0aG9yczoKICogICAgWGlhbmcgSGFpaGFvIDxoYWloYW8ueGlhbmdAaW50ZWwuY29tPgogKiAgICBab3UgTmFuIGhhaSA8bmFuaGFpLnpvdUBpbnRlbC5jb20+CiAqCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgInZhX2JhY2tlbmQuaCIKCiNpbmNsdWRlICJpbnRlbF9iYXRjaGJ1ZmZlci5oIgojaW5jbHVkZSAiaW50ZWxfZHJpdmVyLmgiCgojaW5jbHVkZSAiaTk2NV9kZWZpbmVzLmgiCiNpbmNsdWRlICJpOTY1X21lZGlhLmgiCiNpbmNsdWRlICJpOTY1X21lZGlhX21wZWcyLmgiCiNpbmNsdWRlICJpOTY1X2Rydl92aWRlby5oIgoKI2RlZmluZSBTVVJGQUNFX1RBUkdFVAkgICAgMAojZGVmaW5lIFNVUkZBQ0VfRk9SV0FSRAkgICAgMQojZGVmaW5lIFNVUkZBQ0VfQkFDS1dBUkQgICAgMgojZGVmaW5lIFNVUkZBQ0VfQklESVJFQ1QgICAgMwoKZW51bSBpbnRlcmZhY2UgewogICAgRlJBTUVfSU5UUkEgPSAwLAogICAgRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJELAogICAgRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCwKICAgIEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QsCiAgICBGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQsCiAgICBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJELAogICAgRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCwKICAgIExJQl9JTlRFUkZBQ0UsCiAgICBGSUVMRF9JTlRSQSwKICAgIEZJRUxEX0ZPUldBUkQsCiAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICBGSUVMRF9CQUNLV0FSRCwKICAgIEZJRUxEX0JBQ0tXQVJEXzE2WDgsCiAgICBGSUVMRF9CSURJUkVDVCwKICAgIEZJRUxEX0JJRElSRUNUXzE2WDgKfTsKCi8qIGlkY3QgdGFibGUgKi8KI2RlZmluZSBDMCAyMzE3MAojZGVmaW5lIEMxIDIyNzI1CiNkZWZpbmUgQzIgMjE0MDcKI2RlZmluZSBDMyAxOTI2NgojZGVmaW5lIEM0IDE2MzgzCiNkZWZpbmUgQzUgMTI4NzMKI2RlZmluZSBDNiA4ODY3CiNkZWZpbmUgQzcgNDUyMApjb25zdCB1aW50MzJfdCBpZGN0X3RhYmxlW10gPSB7CiAgICBDNCwgQzEsIEMyLCBDMywgQzQsIEM1LCBDNiwgQzcsICAgICAgICAgICAgIC8vZzUKICAgIEM0LCBDMSwgQzIsIEMzLCBDNCwgQzUsIEM2LCBDNywKICAgIEM0LCBDMywgQzYsLUM3LC1DNCwtQzEsLUMyLC1DNSwKICAgIEM0LCBDMywgQzYsLUM3LC1DNCwtQzEsLUMyLC1DNSwKICAgIEM0LCBDNSwtQzYsLUMxLC1DNCwgQzcsIEMyLCBDMywKICAgIEM0LCBDNSwtQzYsLUMxLC1DNCwgQzcsIEMyLCBDMywKICAgIEM0LCBDNywtQzIsLUM1LCBDNCwgQzMsLUM2LC1DMSwKICAgIEM0LCBDNywtQzIsLUM1LCBDNCwgQzMsLUM2LC1DMSwKICAgIEM0LC1DNywtQzIsIEM1LCBDNCwtQzMsLUM2LCBDMSwKICAgIEM0LC1DNywtQzIsIEM1LCBDNCwtQzMsLUM2LCBDMSwKICAgIEM0LC1DNSwtQzYsIEMxLC1DNCwtQzcsIEMyLC1DMywKICAgIEM0LC1DNSwtQzYsIEMxLC1DNCwtQzcsIEMyLC1DMywKICAgIEM0LC1DMywgQzYsIEM3LC1DNCwgQzEsLUMyLCBDNSwKICAgIEM0LC1DMywgQzYsIEM3LC1DNCwgQzEsLUMyLCBDNSwKICAgIEM0LC1DMSwgQzIsLUMzLCBDNCwtQzUsIEM2LC1DNywKICAgIEM0LC1DMSwgQzIsLUMzLCBDNCwtQzUsIEM2LC1DNyAgICAgICAgICAgICAgLy9nMjAKfTsKI3VuZGVmIEMwCiN1bmRlZiBDMQojdW5kZWYgQzIKI3VuZGVmIEMzCiN1bmRlZiBDNAojdW5kZWYgQzUKI3VuZGVmIEM2CiN1bmRlZiBDNwoKY29uc3QgdWludDMyX3QgemlnemFnX2RpcmVjdFs2NF0gPSB7CiAgICAwLCAgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCiAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCiAgICAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCiAgICAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsCiAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCiAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCiAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCiAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKfTsKCnN0YXRpYyB1aW50MzJfdCBmcmFtZV9pbnRyYV9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ludHJhLmc0YiIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9mcmFtZV9wcmVkX2JhY2t3YXJkX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9mcmFtZV9wcmVkX2JpZGlyZWN0X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsW11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9maWVsZF9wcmVkX2ZvcndhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZmllbGRfcHJlZF9iYWNrd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmlkaXJlY3QuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgbGliX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvbGliLmc0YiIKfTsKLypmaWVsZCBwaWN0dXJlKi8Kc3RhdGljIHVpbnQzMl90IGZpZWxkX2ludHJhX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfaW50cmEuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2ZvcndhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfZm9yd2FyZF8xNng4Lmc0YiIKfTsKc3RhdGljIHVpbnQzMl90IGZpZWxkX2JhY2t3YXJkX2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmFja3dhcmQuZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmFja3dhcmRfMTZ4OF9rZXJuZWxbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2JhY2t3YXJkXzE2eDguZzRiIgp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3Rfa2VybmVsW11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9iaWRpcmVjdC5nNGIiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbFtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmlkaXJlY3RfMTZ4OC5nNGIiCn07CgpzdGF0aWMgc3RydWN0IG1lZGlhX2tlcm5lbCAgbXBlZzJfdmxkX2tlcm5lbHNfZ2VuNFtdID0gewogICAgewogICAgICAgICJGUkFNRV9JTlRSQSIsCiAgICAgICAgRlJBTUVfSU5UUkEsCiAgICAgICAgZnJhbWVfaW50cmFfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfaW50cmFfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJEIiwKICAgIAlGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GUkFNRV9QUkVEX0JBQ0tXQVJEIiwKICAgICAgICBGUkFNRV9GUkFNRV9QUkVEX0JBQ0tXQVJELAogICAgICAgIGZyYW1lX2ZyYW1lX3ByZWRfYmFja3dhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgeyAgIAogICAgICAgICJGUkFNRV9GUkFNRV9QUkVEX0JJRElSRUNUIiwKICAgICAgICBGUkFNRV9GUkFNRV9QUkVEX0JJRElSRUNULAogICAgICAgIGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZnJhbWVfZmllbGRfcHJlZF9mb3J3YXJkX2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZSQU1FX0ZJRUxEX1BSRURfQkFDS1dBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfQkFDS1dBUkQsCiAgICAgICAgZnJhbWVfZmllbGRfcHJlZF9iYWNrd2FyZF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JhY2t3YXJkX2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1QiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1QsCiAgICAgICAgZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKICAgIAogICAgeyAgIAogICAgICAgICJMSUIiLAogICAgICAgIExJQl9JTlRFUkZBQ0UsCiAgICAgICAgbGliX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGxpYl9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9JTlRSQSIsCiAgICAgICAgRklFTERfSU5UUkEsCiAgICAgICAgZmllbGRfaW50cmFfa2VybmVsLCAKICAgICAgICBzaXplb2YoZmllbGRfaW50cmFfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRCIsCiAgICAgICAgRklFTERfRk9SV0FSRCwKICAgICAgICBmaWVsZF9mb3J3YXJkX2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2ZvcndhcmRfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICAgICAgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2ZvcndhcmRfMTZ4OF9rZXJuZWwpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CQUNLV0FSRCIsCiAgICAgICAgRklFTERfQkFDS1dBUkQsCiAgICAgICAgZmllbGRfYmFja3dhcmRfa2VybmVsLCAKICAgICAgICBzaXplb2YoZmllbGRfYmFja3dhcmRfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQkFDS1dBUkRfMTZYOCIsCiAgICAgICAgRklFTERfQkFDS1dBUkRfMTZYOCwKICAgICAgICBmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2JhY2t3YXJkXzE2eDhfa2VybmVsKSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQklESVJFQ1QiLAogICAgICAgIEZJRUxEX0JJRElSRUNULAogICAgICAgIGZpZWxkX2JpZGlyZWN0X2tlcm5lbCwgCiAgICAgICAgc2l6ZW9mKGZpZWxkX2JpZGlyZWN0X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7CiAgICAgICAgIkZJRUxEX0JJRElSRUNUXzE2WDgiLAogICAgICAgIEZJRUxEX0JJRElSRUNUXzE2WDgsCiAgICAgICAgZmllbGRfYmlkaXJlY3RfMTZ4OF9rZXJuZWwsIAogICAgICAgIHNpemVvZihmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbCksCiAgICAgICAgTlVMTAogICAgfQp9OwoKLyogT24gSUdETkcgKi8Kc3RhdGljIHVpbnQzMl90IGZyYW1lX2ludHJhX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9pbnRyYS5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfZm9yd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkLmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZC5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3QuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfZm9yd2FyZC5nNGIuZ2VuNSIKfTsKc3RhdGljIHVpbnQzMl90IGZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmRfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmQuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9mcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgbGliX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9saWIuZzRiLmdlbjUiCn07Ci8qZmllbGQgcGljdHVyZSovCnN0YXRpYyB1aW50MzJfdCBmaWVsZF9pbnRyYV9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfaW50cmEuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9mb3J3YXJkX2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9mb3J3YXJkLmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9mb3J3YXJkXzE2eDguZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmFja3dhcmQuZzRiLmdlbjUiCn07CnN0YXRpYyB1aW50MzJfdCBmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbF9nZW41W11bNF0gPSB7CiAgICNpbmNsdWRlICJzaGFkZXJzL21wZWcyL3ZsZC9maWVsZF9iYWNrd2FyZF8xNng4Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3Rfa2VybmVsX2dlbjVbXVs0XSA9IHsKICAgI2luY2x1ZGUgInNoYWRlcnMvbXBlZzIvdmxkL2ZpZWxkX2JpZGlyZWN0Lmc0Yi5nZW41Igp9OwpzdGF0aWMgdWludDMyX3QgZmllbGRfYmlkaXJlY3RfMTZ4OF9rZXJuZWxfZ2VuNVtdWzRdID0gewogICAjaW5jbHVkZSAic2hhZGVycy9tcGVnMi92bGQvZmllbGRfYmlkaXJlY3RfMTZ4OC5nNGIuZ2VuNSIKfTsKCnN0YXRpYyBzdHJ1Y3QgbWVkaWFfa2VybmVsICBtcGVnMl92bGRfa2VybmVsc19nZW41W10gPSB7CiAgICB7CiAgICAgICAgIkZSQU1FX0lOVFJBIiwKICAgICAgICBGUkFNRV9JTlRSQSwKICAgICAgICBmcmFtZV9pbnRyYV9rZXJuZWxfZ2VuNSwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ludHJhX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9GT1JXQVJEIiwKICAgIAlGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9mb3J3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCIsCiAgICAgICAgRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRCwKICAgICAgICBmcmFtZV9mcmFtZV9wcmVkX2JhY2t3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZnJhbWVfcHJlZF9iYWNrd2FyZF9rZXJuZWxfZ2VuNSksCiAgICAgICAgTlVMTAogICAgfSwKCiAgICB7ICAgCiAgICAgICAgIkZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QiLAogICAgICAgIEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1QsCiAgICAgICAgZnJhbWVfZnJhbWVfcHJlZF9iaWRpcmVjdF9rZXJuZWxfZ2VuNSwgCiAgICAgICAgc2l6ZW9mKGZyYW1lX2ZyYW1lX3ByZWRfYmlkaXJlY3Rfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0ZPUldBUkQiLAogICAgICAgIEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2ZvcndhcmRfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJEIiwKICAgICAgICBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJELAogICAgICAgIGZyYW1lX2ZpZWxkX3ByZWRfYmFja3dhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmcmFtZV9maWVsZF9wcmVkX2JhY2t3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCIsCiAgICAgICAgRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVCwKICAgICAgICBmcmFtZV9maWVsZF9wcmVkX2JpZGlyZWN0X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZnJhbWVfZmllbGRfcHJlZF9iaWRpcmVjdF9rZXJuZWxfZ2VuNSksCiAgICAgICAgTlVMTAogICAgfSwKICAgIAogICAgeyAgIAogICAgICAgICJMSUIiLAogICAgICAgIExJQl9JTlRFUkZBQ0UsCiAgICAgICAgbGliX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YobGliX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfSU5UUkEiLAogICAgICAgIEZJRUxEX0lOVFJBLAogICAgICAgIGZpZWxkX2ludHJhX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfaW50cmFfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9GT1JXQVJEIiwKICAgICAgICBGSUVMRF9GT1JXQVJELAogICAgICAgIGZpZWxkX2ZvcndhcmRfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9mb3J3YXJkX2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfRk9SV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9GT1JXQVJEXzE2WDgsCiAgICAgICAgZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfZm9yd2FyZF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQkFDS1dBUkQiLAogICAgICAgIEZJRUxEX0JBQ0tXQVJELAogICAgICAgIGZpZWxkX2JhY2t3YXJkX2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfYmFja3dhcmRfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CQUNLV0FSRF8xNlg4IiwKICAgICAgICBGSUVMRF9CQUNLV0FSRF8xNlg4LAogICAgICAgIGZpZWxkX2JhY2t3YXJkXzE2eDhfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9iYWNrd2FyZF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9LAoKICAgIHsKICAgICAgICAiRklFTERfQklESVJFQ1QiLAogICAgICAgIEZJRUxEX0JJRElSRUNULAogICAgICAgIGZpZWxkX2JpZGlyZWN0X2tlcm5lbF9nZW41LCAKICAgICAgICBzaXplb2YoZmllbGRfYmlkaXJlY3Rfa2VybmVsX2dlbjUpLAogICAgICAgIE5VTEwKICAgIH0sCgogICAgewogICAgICAgICJGSUVMRF9CSURJUkVDVF8xNlg4IiwKICAgICAgICBGSUVMRF9CSURJUkVDVF8xNlg4LAogICAgICAgIGZpZWxkX2JpZGlyZWN0XzE2eDhfa2VybmVsX2dlbjUsIAogICAgICAgIHNpemVvZihmaWVsZF9iaWRpcmVjdF8xNng4X2tlcm5lbF9nZW41KSwKICAgICAgICBOVUxMCiAgICB9Cn07CgpzdGF0aWMgc3RydWN0IG1lZGlhX2tlcm5lbCAgKm1wZWcyX3ZsZF9rZXJuZWxzID0gTlVMTDsKCiNkZWZpbmUgTlVNX01QRUcyX1ZMRF9LRVJORUxTIChzaXplb2YobXBlZzJfdmxkX2tlcm5lbHNfZ2VuNCkvc2l6ZW9mKG1wZWcyX3ZsZF9rZXJuZWxzX2dlbjRbMF0pKQoKc3RhdGljIHZvaWQKaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sIGlzX2RzdCwKCQkJICAgICAgIGludCB2ZXJ0X2xpbmVfc3RyaWRlLAoJCQkgICAgICAgaW50IHZlcnRfbGluZV9zdHJpZGVfb2ZzKQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsgIAogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgc3RydWN0IGk5NjVfc3VyZmFjZV9zdGF0ZSAqc3M7CiAgICBkcmlfYm8gKmJvOwogICAgdWludDMyX3Qgd3JpdGVfZG9tYWluLCByZWFkX2RvbWFpbjsKCiAgICBibyA9IGRyaV9ib19hbGxvYyhpOTY1LT5pbnRlbC5idWZtZ3IsIAogICAgICAgICAgICAgICAgICAgICAgInN1cmZhY2Ugc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV9zdXJmYWNlX3N0YXRlKSwgMzIpOwogICAgYXNzZXJ0KGJvKTsKICAgIGRyaV9ib19tYXAoYm8sIDEpOwogICAgYXNzZXJ0KGJvLT52aXJ0dWFsKTsKICAgIHNzID0gYm8tPnZpcnR1YWw7CiAgICBtZW1zZXQoc3MsIDAsIHNpemVvZigqc3MpKTsKICAgIHNzLT5zczAuc3VyZmFjZV90eXBlID0gSTk2NV9TVVJGQUNFXzJEOwogICAgc3MtPnNzMC5zdXJmYWNlX2Zvcm1hdCA9IEk5NjVfU1VSRkFDRUZPUk1BVF9SOF9TSU5UOwogICAgc3MtPnNzMC52ZXJ0X2xpbmVfc3RyaWRlID0gdmVydF9saW5lX3N0cmlkZTsKICAgIHNzLT5zczAudmVydF9saW5lX3N0cmlkZV9vZnMgPSB2ZXJ0X2xpbmVfc3RyaWRlX29mczsKICAgIHNzLT5zczEuYmFzZV9hZGRyID0gb2JqX3N1cmZhY2UtPmJvLT5vZmZzZXQgKyBvZmZzZXQ7CiAgICBzcy0+c3MyLndpZHRoID0gdyAtIDE7CiAgICBzcy0+c3MyLmhlaWdodCA9IGggLSAxOwogICAgc3MtPnNzMy5waXRjaCA9IHcgLSAxOwoKICAgIGlmIChpc19kc3QpIHsKICAgICAgICB3cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwogICAgICAgIHJlYWRfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKICAgIH0gZWxzZSB7CiAgICAgICAgd3JpdGVfZG9tYWluID0gMDsKICAgICAgICByZWFkX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9TQU1QTEVSOwogICAgfQoKICAgIGRyaV9ib19lbWl0X3JlbG9jKGJvLAogICAgICAgICAgICAgICAgICAgICAgcmVhZF9kb21haW4sIHdyaXRlX2RvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHN0cnVjdCBpOTY1X3N1cmZhY2Vfc3RhdGUsIHNzMSksCiAgICAgICAgICAgICAgICAgICAgICBvYmpfc3VyZmFjZS0+Ym8pOwogICAgZHJpX2JvX3VubWFwKGJvKTsKCiAgICBhc3NlcnQoaW5kZXggPCBNQVhfTUVESUFfU1VSRkFDRVMpOwovLyAgICBhc3NlcnQobWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaW5kZXhdLmJvID09IE5VTEwpOwogICAgbWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaW5kZXhdLmJvID0gYm87Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zZXR1cChWQURyaXZlckNvbnRleHRQIGN0eCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvYmplY3Rfc3VyZmFjZSAqb2JqX3N1cmZhY2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCBpc19kc3QsIAoJCQkgICAgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlLAoJCQkgICAgICAgaW50IHN1cmZhY2UpCnsKICAgIGludCB3ID0gb2JqX3N1cmZhY2UtPndpZHRoOwogICAgaW50IGggPSBvYmpfc3VyZmFjZS0+aGVpZ2h0OwoKICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSA9PSBNUEVHX0ZSQU1FKSB7CglpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMCwgb2JqX3N1cmZhY2UsCgkJCQkJMCwgdywgaCwgCgkJCQkJaXNfZHN0LCAwLCAwKTsKCWk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAxLCBvYmpfc3VyZmFjZSwKCQkJCQl3ICogaCwgdyAvIDIsIGggLyAyLCAKCQkJCQlpc19kc3QsIDAsIDApOwoJaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDIsIG9ial9zdXJmYWNlLAoJCQkJCXcgKiBoICsgdyAqIGggLyA0LCB3IC8gMiwgaCAvIDIsIAoJCQkJCWlzX2RzdCwgMCwgMCk7CiAgICB9IGVsc2UgewoJaWYgKHN1cmZhY2UgPT0gU1VSRkFDRV9UQVJHRVQpIHsKCSAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCAzLCBvYmpfc3VyZmFjZSwKCQkJCQkgICAgMCwgdywgaCwgCgkJCQkJICAgIEZhbHNlLCAwLCAwKTsKCSAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCAxMCwgb2JqX3N1cmZhY2UsCgkJCQkJICAgIHcgKiBoLCB3IC8gMiwgaCAvIDIsIAoJCQkJCSAgICBGYWxzZSwgMCwgMCk7CgkgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgMTEsIG9ial9zdXJmYWNlLAoJCQkJCSAgICB3ICogaCArIHcgKiBoIC8gNCwgdyAvIDIsIGggLyAyLCAKCQkJCQkgICAgRmFsc2UsIDAsIDApOwoJICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSA9PSBNUEVHX1RPUF9GSUVMRCkgewoJCWk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAwLCBvYmpfc3VyZmFjZSwKCQkJCQkJMCwgdywgaCwgCgkJCQkJCVRydWUsIDEsIDApOwoJCWk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAxLCBvYmpfc3VyZmFjZSwKCQkJCQkJdyAqIGgsIHcgLyAyLCBoIC8gMiwgCgkJCQkJCVRydWUsIDEsIDApOwoJCWk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAyLCBvYmpfc3VyZmFjZSwKCQkJCQkJdyAqIGggKyB3ICogaCAvIDQsIHcgLyAyLCBoIC8gMiwgCgkJCQkJCVRydWUsIDEsIDApOwoJICAgIH0gZWxzZSB7CgkJYXNzZXJ0KHBpY3R1cmVfc3RydWN0dXJlID09IE1QRUdfQk9UVE9NX0ZJRUxEKTsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMCwgb2JqX3N1cmZhY2UsCgkJCQkJCTAsIHcsIGgsIAoJCQkJCQlUcnVlLCAxLCAxKTsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMSwgb2JqX3N1cmZhY2UsCgkJCQkJCXcgKiBoLCB3IC8gMiwgaCAvIDIsIAoJCQkJCQlUcnVlLCAxLCAxKTsKCQlpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMiwgb2JqX3N1cmZhY2UsCgkJCQkJCXcgKiBoICsgdyAqIGggLyA0LCB3IC8gMiwgaCAvIDIsIAoJCQkJCQlUcnVlLCAxLCAxKTsKCSAgICB9Cgl9IGVsc2UgewoJICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zdGF0ZShjdHgsIGJhc2VfaW5kZXggKyAwLCBvYmpfc3VyZmFjZSwKCQkJCQkgICAgMCwgdywgaCwgCgkJCQkJICAgIGlzX2RzdCwgMCwgMCk7CgkgICAgaTk2NV9tZWRpYV9tcGVnMl9zdXJmYWNlX3N0YXRlKGN0eCwgYmFzZV9pbmRleCArIDEsIG9ial9zdXJmYWNlLAoJCQkJCSAgICB3ICogaCwgdyAvIDIsIGggLyAyLCAKCQkJCQkgICAgaXNfZHN0LCAwLCAwKTsKCSAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc3RhdGUoY3R4LCBiYXNlX2luZGV4ICsgMiwgb2JqX3N1cmZhY2UsCgkJCQkJICAgIHcgKiBoICsgdyAqIGggLyA0LCB3IC8gMiwgaCAvIDIsIAoJCQkJCSAgICBpc19kc3QsIDAsIDApOwoJfQogICAgfQp9Cgp2b2lkIAppOTY1X21lZGlhX21wZWcyX3N1cmZhY2VzX3NldHVwKFZBRHJpdmVyQ29udGV4dFAgY3R4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOyAgCiAgICBzdHJ1Y3Qgb2JqZWN0X3N1cmZhY2UgKm9ial9zdXJmYWNlOwogICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKnBhcmFtOwoKICAgIGFzc2VydChkZWNvZGVfc3RhdGUtPnBpY19wYXJhbSAmJiBkZWNvZGVfc3RhdGUtPnBpY19wYXJhbS0+YnVmZmVyKTsKICAgIHBhcmFtID0gKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyICopZGVjb2RlX3N0YXRlLT5waWNfcGFyYW0tPmJ1ZmZlcjsKCiAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0UoZGVjb2RlX3N0YXRlLT5jdXJyZW50X3JlbmRlcl90YXJnZXQpOwogICAgYXNzZXJ0KG9ial9zdXJmYWNlKTsKICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zZXR1cChjdHgsIDAsIG9ial9zdXJmYWNlLCBUcnVlLAoJCXBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5waWN0dXJlX3N0cnVjdHVyZSwgU1VSRkFDRV9UQVJHRVQpOwoKICAgIG9ial9zdXJmYWNlID0gU1VSRkFDRShwYXJhbS0+Zm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSk7CiAgICBpZiAoIW9ial9zdXJmYWNlKSB7Ci8vICAgICAgICBhc3NlcnQocGFyYW0tPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMSk7IC8qIEktcGljdHVyZSAqLwogICAgfSBlbHNlIHsKICAgICAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc2V0dXAoY3R4LCA0LCBvYmpfc3VyZmFjZSwgRmFsc2UsCgkJCXBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5waWN0dXJlX3N0cnVjdHVyZSwgU1VSRkFDRV9GT1JXQVJEKTsKICAgICAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlKTsKICAgICAgICBpZiAoIW9ial9zdXJmYWNlKSB7CiAgICAgICAgICAgIGFzc2VydChwYXJhbS0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAyKTsgLyogUC1waWN0dXJlICovCgogICAgICAgICAgICBvYmpfc3VyZmFjZSA9IFNVUkZBQ0UocGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUpOwogICAgICAgICAgICBpOTY1X21lZGlhX21wZWcyX3N1cmZhY2Vfc2V0dXAoY3R4LCA3LCBvYmpfc3VyZmFjZSwgRmFsc2UsCgkJCQlwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmUsIFNVUkZBQ0VfQkFDS1dBUkQpOyAgICAgICAgICAgIAogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFzc2VydChwYXJhbS0+cGljdHVyZV9jb2RpbmdfdHlwZSA9PSAzKTsgLyogQi1waWN0dXJlICovCiAgICAgICAgICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZV9zZXR1cChjdHgsIDcsIG9ial9zdXJmYWNlLCBGYWxzZSwKCQkJCXBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5waWN0dXJlX3N0cnVjdHVyZSwgU1VSRkFDRV9CSURJUkVDVCk7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZAppOTY1X21lZGlhX21wZWcyX2JpbmRpbmdfdGFibGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgaW50IGk7CiAgICB1bnNpZ25lZCBpbnQgKmJpbmRpbmdfdGFibGU7CiAgICBkcmlfYm8gKmJvID0gbWVkaWFfc3RhdGUtPmJpbmRpbmdfdGFibGUuYm87CgogICAgZHJpX2JvX21hcChibywgMSk7CiAgICBhc3NlcnQoYm8tPnZpcnR1YWwpOwogICAgYmluZGluZ190YWJsZSA9IGJvLT52aXJ0dWFsOwogICAgbWVtc2V0KGJpbmRpbmdfdGFibGUsIDAsIGJvLT5zaXplKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01FRElBX1NVUkZBQ0VTOyBpKyspIHsKICAgICAgICBpZiAobWVkaWFfc3RhdGUtPnN1cmZhY2Vfc3RhdGVbaV0uYm8pIHsKICAgICAgICAgICAgYmluZGluZ190YWJsZVtpXSA9IG1lZGlhX3N0YXRlLT5zdXJmYWNlX3N0YXRlW2ldLmJvLT5vZmZzZXQ7CiAgICAgICAgICAgIGRyaV9ib19lbWl0X3JlbG9jKGJvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJOTE1X0dFTV9ET01BSU5fSU5TVFJVQ1RJT04sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBzaXplb2YoKmJpbmRpbmdfdGFibGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0ZS0+c3VyZmFjZV9zdGF0ZVtpXS5ibyk7CiAgICAgICAgfQogICAgfQoKICAgIGRyaV9ib191bm1hcChtZWRpYV9zdGF0ZS0+YmluZGluZ190YWJsZS5ibyk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfdmZlX3N0YXRlKFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIHN0cnVjdCBpOTY1X21lZGlhX3N0YXRlICptZWRpYV9zdGF0ZSA9ICZpOTY1LT5tZWRpYV9zdGF0ZTsKICAgIHN0cnVjdCBpOTY1X3ZmZV9zdGF0ZSAqdmZlX3N0YXRlOwogICAgZHJpX2JvICpibzsKCiAgICBibyA9IG1lZGlhX3N0YXRlLT52ZmVfc3RhdGUuYm87CiAgICBkcmlfYm9fbWFwKGJvLCAxKTsKICAgIGFzc2VydChiby0+dmlydHVhbCk7CiAgICB2ZmVfc3RhdGUgPSBiby0+dmlydHVhbDsKICAgIG1lbXNldCh2ZmVfc3RhdGUsIDAsIHNpemVvZigqdmZlX3N0YXRlKSk7CiAgICB2ZmVfc3RhdGUtPnZmZTAuZXh0ZW5kX3ZmZV9zdGF0ZV9wcmVzZW50ID0gMTsKICAgIHZmZV9zdGF0ZS0+dmZlMS52ZmVfbW9kZSA9IFZGRV9WTERfTU9ERTsKICAgIHZmZV9zdGF0ZS0+dmZlMS5udW1fdXJiX2VudHJpZXMgPSBtZWRpYV9zdGF0ZS0+dXJiLm51bV92ZmVfZW50cmllczsKICAgIHZmZV9zdGF0ZS0+dmZlMS5jaGlsZHJlbl9wcmVzZW50ID0gMDsKICAgIHZmZV9zdGF0ZS0+dmZlMS51cmJfZW50cnlfYWxsb2Nfc2l6ZSA9IG1lZGlhX3N0YXRlLT51cmIuc2l6ZV92ZmVfZW50cnkgLSAxOwogICAgdmZlX3N0YXRlLT52ZmUxLm1heF90aHJlYWRzID0gbWVkaWFfc3RhdGUtPnVyYi5udW1fdmZlX2VudHJpZXMgLSAxOwogICAgdmZlX3N0YXRlLT52ZmUyLmludGVyZmFjZV9kZXNjcmlwdG9yX2Jhc2UgPSAKICAgICAgICBtZWRpYV9zdGF0ZS0+aWRydC5iby0+b2Zmc2V0ID4+IDQ7IC8qIHJlbG9jICovCiAgICBkcmlfYm9fZW1pdF9yZWxvYyhibywKICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaTk2NV92ZmVfc3RhdGUsIHZmZTIpLAogICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdGUtPmlkcnQuYm8pOwogICAgZHJpX2JvX3VubWFwKGJvKTsKfQoKc3RhdGljIHZvaWQgCmk5NjVfbWVkaWFfbXBlZzJfaW50ZXJmYWNlX2Rlc2NyaXB0b3JfcmVtYXBfdGFibGUoVkFEcml2ZXJDb250ZXh0UCBjdHgpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgc3RydWN0IGk5NjVfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmRlc2M7CiAgICBpbnQgaTsKICAgIGRyaV9ibyAqYm87CgogICAgYm8gPSBtZWRpYV9zdGF0ZS0+aWRydC5ibzsKICAgIGRyaV9ib19tYXAoYm8sIDEpOwogICAgYXNzZXJ0KGJvLT52aXJ0dWFsKTsKICAgIGRlc2MgPSBiby0+dmlydHVhbDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01QRUcyX1ZMRF9LRVJORUxTOyBpKyspIHsKICAgICAgICBtZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CiAgICAgICAgZGVzYy0+ZGVzYzAuZ3JmX3JlZ19ibG9ja3MgPSAxNTsKICAgICAgICBkZXNjLT5kZXNjMC5rZXJuZWxfc3RhcnRfcG9pbnRlciA9IG1wZWcyX3ZsZF9rZXJuZWxzW2ldLmJvLT5vZmZzZXQgPj4gNjsgLyogcmVsb2MgKi8KICAgICAgICBkZXNjLT5kZXNjMS5jb25zdF91cmJfZW50cnlfcmVhZF9vZmZzZXQgPSAwOwogICAgICAgIGRlc2MtPmRlc2MxLmNvbnN0X3VyYl9lbnRyeV9yZWFkX2xlbiA9IDMwOwogICAgICAgIGRlc2MtPmRlc2MzLmJpbmRpbmdfdGFibGVfZW50cnlfY291bnQgPSAwOwogICAgICAgIGRlc2MtPmRlc2MzLmJpbmRpbmdfdGFibGVfcG9pbnRlciA9IAogICAgICAgICAgICBtZWRpYV9zdGF0ZS0+YmluZGluZ190YWJsZS5iby0+b2Zmc2V0ID4+IDU7IC8qcmVsb2MgKi8KCiAgICAgICAgZHJpX2JvX2VtaXRfcmVsb2MoYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRlc2MwLmdyZl9yZWdfYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBzaXplb2YoKmRlc2MpICsgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfaW50ZXJmYWNlX2Rlc2NyaXB0b3IsIGRlc2MwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMl92bGRfa2VybmVsc1tpXS5ibyk7CgogICAgICAgIGRyaV9ib19lbWl0X3JlbG9jKGJvLAogICAgICAgICAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9JTlNUUlVDVElPTiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXNjMy5iaW5kaW5nX3RhYmxlX2VudHJ5X2NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiBzaXplb2YoKmRlc2MpICsgb2Zmc2V0b2Yoc3RydWN0IGk5NjVfaW50ZXJmYWNlX2Rlc2NyaXB0b3IsIGRlc2MzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0ZS0+YmluZGluZ190YWJsZS5ibyk7CiAgICAgICAgZGVzYysrOwogICAgfQoKICAgIGRyaV9ib191bm1hcChibyk7Cn0KCnZvaWQKaTk2NV9tZWRpYV9tcGVnMl92bGRfc3RhdGUoVkFEcml2ZXJDb250ZXh0UCBjdHgsIHN0cnVjdCBkZWNvZGVfc3RhdGUgKmRlY29kZV9zdGF0ZSkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9tZWRpYV9zdGF0ZSAqbWVkaWFfc3RhdGUgPSAmaTk2NS0+bWVkaWFfc3RhdGU7CiAgICBzdHJ1Y3QgaTk2NV92bGRfc3RhdGUgKnZsZF9zdGF0ZTsKICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyICpwYXJhbTsKCiAgICBhc3NlcnQoZGVjb2RlX3N0YXRlLT5waWNfcGFyYW0gJiYgZGVjb2RlX3N0YXRlLT5waWNfcGFyYW0tPmJ1ZmZlcik7CiAgICBwYXJhbSA9IChWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqKWRlY29kZV9zdGF0ZS0+cGljX3BhcmFtLT5idWZmZXI7CgogICAgYXNzZXJ0KG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5ibyk7CiAgICBkcmlfYm9fbWFwKG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5ibywgMSk7CiAgICBhc3NlcnQobWVkaWFfc3RhdGUtPmV4dGVuZGVkX3N0YXRlLmJvLT52aXJ0dWFsKTsKICAgIHZsZF9zdGF0ZSA9IG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5iby0+dmlydHVhbDsKICAgIG1lbXNldCh2bGRfc3RhdGUsIDAsIHNpemVvZigqdmxkX3N0YXRlKSk7CgogICAgdmxkX3N0YXRlLT52bGQwLmZfY29kZV8wXzAgPSAoKHBhcmFtLT5mX2NvZGUgPj4gMTIpICYgMHhmKTsKICAgIHZsZF9zdGF0ZS0+dmxkMC5mX2NvZGVfMF8xID0gKChwYXJhbS0+Zl9jb2RlID4+IDgpICYgMHhmKTsKICAgIHZsZF9zdGF0ZS0+dmxkMC5mX2NvZGVfMV8wID0gKChwYXJhbS0+Zl9jb2RlID4+IDQpICYgMHhmKTsKICAgIHZsZF9zdGF0ZS0+dmxkMC5mX2NvZGVfMV8xID0gKHBhcmFtLT5mX2NvZGUgJiAweGYpOwogICAgdmxkX3N0YXRlLT52bGQwLmludHJhX2RjX3ByZWNpc2lvbiA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pbnRyYV9kY19wcmVjaXNpb247CiAgICB2bGRfc3RhdGUtPnZsZDAucGljdHVyZV9zdHJ1Y3R1cmUgPSBwYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucGljdHVyZV9zdHJ1Y3R1cmU7CiAgICB2bGRfc3RhdGUtPnZsZDAudG9wX2ZpZWxkX2ZpcnN0ID0gcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnRvcF9maWVsZF9maXJzdDsKICAgIHZsZF9zdGF0ZS0+dmxkMC5mcmFtZV9wcmVkaWN0X2ZyYW1lX2RjdCA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5mcmFtZV9wcmVkX2ZyYW1lX2RjdDsKICAgIHZsZF9zdGF0ZS0+dmxkMC5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9yID0gcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzOwogICAgdmxkX3N0YXRlLT52bGQwLnF1YW50aXplcl9zY2FsZV90eXBlID0gcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnFfc2NhbGVfdHlwZTsKICAgIHZsZF9zdGF0ZS0+dmxkMC5pbnRyYV92bGNfZm9ybWF0ID0gcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmludHJhX3ZsY19mb3JtYXQ7CiAgICB2bGRfc3RhdGUtPnZsZDAuc2Nhbl9vcmRlciA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5hbHRlcm5hdGVfc2NhbjsKCiAgICB2bGRfc3RhdGUtPnZsZDEucGljdHVyZV9jb2RpbmdfdHlwZSA9IHBhcmFtLT5waWN0dXJlX2NvZGluZ190eXBlOwoKICAgIGlmICh2bGRfc3RhdGUtPnZsZDAucGljdHVyZV9zdHJ1Y3R1cmUgPT0gTVBFR19GUkFNRSkgewoJLypmcmFtZSBwaWN0dXJlKi8gCgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzAgPSBGUkFNRV9JTlRSQTsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMSA9IEZSQU1FX0ZSQU1FX1BSRURfRk9SV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMiA9IEZSQU1FX0ZJRUxEX1BSRURfRk9SV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfMyA9IEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1Q7IC8qIGR1YWwgcHJpbWUgKi8KCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNCA9IEZSQU1FX0ZSQU1FX1BSRURfQkFDS1dBUkQ7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzUgPSBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF82ID0gRlJBTUVfRlJBTUVfUFJFRF9CSURJUkVDVDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNyA9IEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1Q7CgoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF84ID0gRlJBTUVfSU5UUkE7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUxLmluZGV4XzkgPSBGUkFNRV9GUkFNRV9QUkVEX0ZPUldBUkQ7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUxLmluZGV4XzEwID0gRlJBTUVfRklFTERfUFJFRF9GT1JXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF8xMSA9IEZSQU1FX0ZJRUxEX1BSRURfQklESVJFQ1Q7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUxLmluZGV4XzEyID0gRlJBTUVfRlJBTUVfUFJFRF9CQUNLV0FSRDsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTEuaW5kZXhfMTMgPSBGUkFNRV9GSUVMRF9QUkVEX0JBQ0tXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMS5pbmRleF8xNCA9IEZSQU1FX0ZSQU1FX1BSRURfQklESVJFQ1Q7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUxLmluZGV4XzE1ID0gRlJBTUVfRklFTERfUFJFRF9CSURJUkVDVDsKICAgIH0gZWxzZSB7CgkvKmZpZWxkIHBpY3R1cmUqLwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF8wID0gRklFTERfSU5UUkE7Cgl2bGRfc3RhdGUtPmRlc2NfcmVtYXBfdGFibGUwLmluZGV4XzEgPSBGSUVMRF9GT1JXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF8yID0gRklFTERfRk9SV0FSRF8xNlg4OwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF8zID0gRklFTERfQklESVJFQ1Q7IC8qIGR1YWwgcHJpbWUgKi8KCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNCA9IEZJRUxEX0JBQ0tXQVJEOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF81ID0gRklFTERfQkFDS1dBUkRfMTZYODsKCXZsZF9zdGF0ZS0+ZGVzY19yZW1hcF90YWJsZTAuaW5kZXhfNiA9IEZJRUxEX0JJRElSRUNUOwoJdmxkX3N0YXRlLT5kZXNjX3JlbWFwX3RhYmxlMC5pbmRleF83ID0gRklFTERfQklESVJFQ1RfMTZYODsKICAgIH0KCiAgICBkcmlfYm9fdW5tYXAobWVkaWFfc3RhdGUtPmV4dGVuZGVkX3N0YXRlLmJvKTsKfQoKc3RhdGljIHZvaWQKaTk2NV9tZWRpYV9tcGVnMl91cGxvYWRfY29uc3RhbnRzKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpCnsKICAgIHN0cnVjdCBpOTY1X2RyaXZlcl9kYXRhICppOTY1ID0gaTk2NV9kcml2ZXJfZGF0YShjdHgpOwogICAgc3RydWN0IGk5NjVfbWVkaWFfc3RhdGUgKm1lZGlhX3N0YXRlID0gJmk5NjUtPm1lZGlhX3N0YXRlOwogICAgaW50IGksIGo7CiAgICB1bnNpZ25lZCBjaGFyICpjb25zdGFudF9idWZmZXI7CiAgICB1bnNpZ25lZCBjaGFyICpxbXg7CiAgICB1bnNpZ25lZCBpbnQgKmxpYl9yZWxvYzsKICAgIGludCBsaWJfcmVsb2Nfb2Zmc2V0ID0gMDsKCiAgICBkcmlfYm9fbWFwKG1lZGlhX3N0YXRlLT5jdXJiZS5ibywgMSk7CiAgICBhc3NlcnQobWVkaWFfc3RhdGUtPmN1cmJlLmJvLT52aXJ0dWFsKTsKICAgIGNvbnN0YW50X2J1ZmZlciA9IG1lZGlhX3N0YXRlLT5jdXJiZS5iby0+dmlydHVhbDsKCiAgICAvKiBpcV9tYXRyaXggKi8KICAgIGlmIChkZWNvZGVfc3RhdGUtPmlxX21hdHJpeCAmJiBkZWNvZGVfc3RhdGUtPmlxX21hdHJpeC0+YnVmZmVyKSB7CiAgICAgICAgVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICppcV9tYXRyaXggPSAoVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICopZGVjb2RlX3N0YXRlLT5pcV9tYXRyaXgtPmJ1ZmZlcjsKCiAgICAgICAgLyogVXBsb2FkIHF1YW50aXNhdGlvbiBtYXRyaXggaW4gcm93LW1ham9yIG9yZGVyLiBUaGUgbXBsYXllciB2YWFwaQogICAgICAgICAqIHBhdGNoIHBhc3NlcyBxdWFudGlzYXRpb24gbWF0cml4IGluIHppZy16YWcgb3JkZXIgdG8gdmEgbGlicmFyeS4KICAgICAgICAgKiBEbyB3ZSBuZWVkIGEgZmxhZyBpbiBWQUlRTWF0cml4QnVmZmVyTVBFRzIgdG8gc3BlY2lmeSB0aGUgb3JkZXIKICAgICAgICAgKiBvZiB0aGUgcXVhbnRpc2F0aW9uIG1hdHJpeD8KICAgICAgICAgKi8KICAgICAgICBxbXggPSBjb25zdGFudF9idWZmZXI7CiAgICAgICAgaWYgKGlxX21hdHJpeC0+bG9hZF9pbnRyYV9xdWFudGlzZXJfbWF0cml4KSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgICAgICAgICAgICBqID0gemlnemFnX2RpcmVjdFtpXTsKICAgICAgICAgICAgICAgIHFteFtqXSA9IGlxX21hdHJpeC0+aW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcW14ID0gY29uc3RhbnRfYnVmZmVyICsgNjQ7CiAgICAgICAgaWYgKGlxX21hdHJpeC0+bG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCkgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICAgICAgICAgICAgaiA9IHppZ3phZ19kaXJlY3RbaV07CiAgICAgICAgICAgICAgICBxbXhbal0gPSBpcV9tYXRyaXgtPm5vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4W2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBubyBjaHJvbWEgcXVhbnRpc2F0aW9uIG1hdHJpY2VzIGZvciA0OjI6MCBkYXRhICovCiAgICB9CgogICAgLyogaWRjdCB0YWJsZSAqLwogICAgbWVtY3B5KGNvbnN0YW50X2J1ZmZlciArIDEyOCwgaWRjdF90YWJsZSwgc2l6ZW9mKGlkY3RfdGFibGUpKTsKCiAgICAvKiBpZGN0IGxpYiByZWxvYyAqLwogICAgbGliX3JlbG9jX29mZnNldCA9IDEyOCArIHNpemVvZihpZGN0X3RhYmxlKTsKICAgIGxpYl9yZWxvYyA9ICh1bnNpZ25lZCBpbnQgKikoY29uc3RhbnRfYnVmZmVyICsgbGliX3JlbG9jX29mZnNldCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgbGliX3JlbG9jW2ldID0gbXBlZzJfdmxkX2tlcm5lbHNbTElCX0lOVEVSRkFDRV0uYm8tPm9mZnNldDsKICAgICAgICBkcmlfYm9fZW1pdF9yZWxvYyhtZWRpYV9zdGF0ZS0+Y3VyYmUuYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgSTkxNV9HRU1fRE9NQUlOX0lOU1RSVUNUSU9OLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGliX3JlbG9jX29mZnNldCArIGkgKiBzaXplb2YodW5zaWduZWQgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMl92bGRfa2VybmVsc1tMSUJfSU5URVJGQUNFXS5ibyk7CiAgICB9CgogICAgZHJpX2JvX3VubWFwKG1lZGlhX3N0YXRlLT5jdXJiZS5ibyk7Cn0KCnN0YXRpYyB2b2lkCmk5NjVfbWVkaWFfbXBlZzJfc3RhdGVzX3NldHVwKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpCnsKICAgIGk5NjVfbWVkaWFfbXBlZzJfc3VyZmFjZXNfc2V0dXAoY3R4LCBkZWNvZGVfc3RhdGUpOwogICAgaTk2NV9tZWRpYV9tcGVnMl9iaW5kaW5nX3RhYmxlKGN0eCk7CiAgICBpOTY1X21lZGlhX21wZWcyX2ludGVyZmFjZV9kZXNjcmlwdG9yX3JlbWFwX3RhYmxlKGN0eCk7CiAgICBpOTY1X21lZGlhX21wZWcyX3ZsZF9zdGF0ZShjdHgsIGRlY29kZV9zdGF0ZSk7CiAgICBpOTY1X21lZGlhX21wZWcyX3ZmZV9zdGF0ZShjdHgpOwogICAgaTk2NV9tZWRpYV9tcGVnMl91cGxvYWRfY29uc3RhbnRzKGN0eCwgZGVjb2RlX3N0YXRlKTsKfQoKc3RhdGljIHZvaWQKaTk2NV9tZWRpYV9tcGVnMl9vYmplY3RzKFZBRHJpdmVyQ29udGV4dFAgY3R4LCBzdHJ1Y3QgZGVjb2RlX3N0YXRlICpkZWNvZGVfc3RhdGUpCnsKICAgIGludCBpOwogICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyICpzbGljZV9wYXJhbTsKCiAgICBhc3NlcnQoZGVjb2RlX3N0YXRlLT5zbGljZV9wYXJhbSAmJiBkZWNvZGVfc3RhdGUtPnNsaWNlX3BhcmFtLT5idWZmZXIpOwogICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyICopZGVjb2RlX3N0YXRlLT5zbGljZV9wYXJhbS0+YnVmZmVyOwoKICAgIGZvciAoaSA9IDA7IGkgPCBkZWNvZGVfc3RhdGUtPm51bV9zbGljZXM7IGkrKykgewogICAgICAgIGFzc2VydChzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9mbGFnID09IFZBX1NMSUNFX0RBVEFfRkxBR19BTEwpOwoKICAgICAgICBCRUdJTl9CQVRDSChjdHgsIDYpOwogICAgICAgIE9VVF9CQVRDSChjdHgsIENNRF9NRURJQV9PQkpFQ1QgfCA0KTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCAwKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9zaXplIC0gKHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX29mZnNldCA+PiAzKSk7CiAgICAgICAgT1VUX1JFTE9DKGN0eCwgZGVjb2RlX3N0YXRlLT5zbGljZV9kYXRhLT5ibywgCiAgICAgICAgICAgICAgICAgIEk5MTVfR0VNX0RPTUFJTl9TQU1QTEVSLCAwLCAKICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0tPnNsaWNlX2RhdGFfb2Zmc2V0ICsgKHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX29mZnNldCA+PiAzKSk7CiAgICAgICAgT1VUX0JBVENIKGN0eCwgCiAgICAgICAgICAgICAgICAgICgoc2xpY2VfcGFyYW0tPnNsaWNlX2hvcml6b250YWxfcG9zaXRpb24gPDwgMjQpIHwgICAgIAogICAgICAgICAgICAgICAgICAgKHNsaWNlX3BhcmFtLT5zbGljZV92ZXJ0aWNhbF9wb3NpdGlvbiA8PCAxNikgfAogICAgICAgICAgICAgICAgICAgKDEyNyA8PCA4KSB8IAogICAgICAgICAgICAgICAgICAgKHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX29mZnNldCAmIDB4NykpKTsKICAgICAgICBPVVRfQkFUQ0goY3R4LCBzbGljZV9wYXJhbS0+cXVhbnRpc2VyX3NjYWxlX2NvZGUgPDwgMjQpOwogICAgICAgIEFEVkFOQ0VfQkFUQ0goY3R4KTsgICAgICAgICAgCiAgICAgICAgc2xpY2VfcGFyYW0rKzsKICAgIH0KfQoKdm9pZCAKaTk2NV9tZWRpYV9tcGVnMl9kZWNvZGVfaW5pdChWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgc3RydWN0IGk5NjVfZHJpdmVyX2RhdGEgKmk5NjUgPSBpOTY1X2RyaXZlcl9kYXRhKGN0eCk7CiAgICBzdHJ1Y3QgaTk2NV9tZWRpYV9zdGF0ZSAqbWVkaWFfc3RhdGUgPSAmaTk2NS0+bWVkaWFfc3RhdGU7CiAgICBkcmlfYm8gKmJvOwoKICAgIG1lZGlhX3N0YXRlLT5leHRlbmRlZF9zdGF0ZS5lbmFibGVkID0gMTsKICAgIGRyaV9ib191bnJlZmVyZW5jZShtZWRpYV9zdGF0ZS0+ZXh0ZW5kZWRfc3RhdGUuYm8pOwogICAgYm8gPSBkcmlfYm9fYWxsb2MoaTk2NS0+aW50ZWwuYnVmbWdyLCAKICAgICAgICAgICAgICAgICAgICAgICJ2bGQgc3RhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaTk2NV92bGRfc3RhdGUpLCAzMik7CiAgICBhc3NlcnQoYm8pOwogICAgbWVkaWFfc3RhdGUtPmV4dGVuZGVkX3N0YXRlLmJvID0gYm87CgogICAgLyogVVJCICovCiAgICBtZWRpYV9zdGF0ZS0+dXJiLm51bV92ZmVfZW50cmllcyA9IDI4OwogICAgbWVkaWFfc3RhdGUtPnVyYi5zaXplX3ZmZV9lbnRyeSA9IDEzOwoKICAgIG1lZGlhX3N0YXRlLT51cmIubnVtX2NzX2VudHJpZXMgPSAxOwogICAgbWVkaWFfc3RhdGUtPnVyYi5zaXplX2NzX2VudHJ5ID0gMTY7CgogICAgbWVkaWFfc3RhdGUtPnVyYi52ZmVfc3RhcnQgPSAwOwogICAgbWVkaWFfc3RhdGUtPnVyYi5jc19zdGFydCA9IG1lZGlhX3N0YXRlLT51cmIudmZlX3N0YXJ0ICsgCiAgICAgICAgbWVkaWFfc3RhdGUtPnVyYi5udW1fdmZlX2VudHJpZXMgKiBtZWRpYV9zdGF0ZS0+dXJiLnNpemVfdmZlX2VudHJ5OwogICAgYXNzZXJ0KG1lZGlhX3N0YXRlLT51cmIuY3Nfc3RhcnQgKyAKICAgICAgICAgICBtZWRpYV9zdGF0ZS0+dXJiLm51bV9jc19lbnRyaWVzICogbWVkaWFfc3RhdGUtPnVyYi5zaXplX2NzX2VudHJ5IDw9IFVSQl9TSVpFKCgmaTk2NS0+aW50ZWwpKSk7CgogICAgLyogaG9vayBmdW5jdGlvbnMgKi8KICAgIG1lZGlhX3N0YXRlLT5zdGF0ZXNfc2V0dXAgPSBpOTY1X21lZGlhX21wZWcyX3N0YXRlc19zZXR1cDsKICAgIG1lZGlhX3N0YXRlLT5tZWRpYV9vYmplY3RzID0gaTk2NV9tZWRpYV9tcGVnMl9vYmplY3RzOwoKfQoKQm9vbCAKaTk2NV9tZWRpYV9tcGVnMl9pbml0KFZBRHJpdmVyQ29udGV4dFAgY3R4KQp7CiAgICBzdHJ1Y3QgaTk2NV9kcml2ZXJfZGF0YSAqaTk2NSA9IGk5NjVfZHJpdmVyX2RhdGEoY3R4KTsKICAgIGludCBpOwoKICAgIC8qIGtlcm5lbCAqLwogICAgYXNzZXJ0KE5VTV9NUEVHMl9WTERfS0VSTkVMUyA9PSAoc2l6ZW9mKG1wZWcyX3ZsZF9rZXJuZWxzX2dlbjUpIC8gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobXBlZzJfdmxkX2tlcm5lbHNfZ2VuNVswXSkpKTsKICAgIGFzc2VydChOVU1fTVBFRzJfVkxEX0tFUk5FTFMgPD0gTUFYX0lOVEVSRkFDRV9ERVNDKTsKCiAgICBpZiAoSVNfSUdETkcoaTk2NS0+aW50ZWwuZGV2aWNlX2lkKSkKICAgICAgICBtcGVnMl92bGRfa2VybmVscyA9IG1wZWcyX3ZsZF9rZXJuZWxzX2dlbjU7CiAgICBlbHNlCiAgICAgICAgbXBlZzJfdmxkX2tlcm5lbHMgPSBtcGVnMl92bGRfa2VybmVsc19nZW40OwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTVBFRzJfVkxEX0tFUk5FTFM7IGkrKykgewogICAgICAgIHN0cnVjdCBtZWRpYV9rZXJuZWwgKmtlcm5lbCA9ICZtcGVnMl92bGRfa2VybmVsc1tpXTsKICAgICAgICBrZXJuZWwtPmJvID0gZHJpX2JvX2FsbG9jKGk5NjUtPmludGVsLmJ1Zm1nciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWwtPm5hbWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsLT5zaXplLCA2NCk7CiAgICAgICAgYXNzZXJ0KGtlcm5lbC0+Ym8pOwogICAgICAgIGRyaV9ib19zdWJkYXRhKGtlcm5lbC0+Ym8sIDAsIGtlcm5lbC0+c2l6ZSwga2VybmVsLT5iaW4pOwogICAgfQoKICAgIHJldHVybiBUcnVlOwp9CgpCb29sIAppOTY1X21lZGlhX21wZWcyX3Rlcm5pbWF0ZShWQURyaXZlckNvbnRleHRQIGN0eCkKewogICAgaW50IGk7CgogICAgZm9yIChpID0gMDsgaSA8IE5VTV9NUEVHMl9WTERfS0VSTkVMUzsgaSsrKSB7CiAgICAgICAgc3RydWN0IG1lZGlhX2tlcm5lbCAqa2VybmVsID0gJm1wZWcyX3ZsZF9rZXJuZWxzW2ldOwoKICAgICAgICBkcmlfYm9fdW5yZWZlcmVuY2Uoa2VybmVsLT5ibyk7CiAgICAgICAga2VybmVsLT5ibyA9IE5VTEw7CiAgICB9CgogICAgcmV0dXJuIFRydWU7Cn0KCg==