Name: series-workflowgmwz9 Phase: Failed StartedAt: 2026-09-07 14:02:03 +0000 UTC FinishedAt: 2026-09-07 14:52:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgmwz9[0] Phase: Succeeded StartedAt: 2026-09-07 14:02:03 +0000 UTC FinishedAt: 2026-09-07 14:51:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgmwz9[0].run-triage Phase: Succeeded StartedAt: 2026-09-07 14:02:03 +0000 UTC FinishedAt: 2026-09-07 14:51:52 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE0OjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5YWM0NzMyYzNkNGMwYThjNjA0MTFhMzI2OTQ4MDk2MDU0YWYyOTc4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAxNDo1MToyMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZ1xuQEAgLTM4LDYgJiM0MzszOCw3IEBAIGNvbmZpZyBBUk02NFxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HU1xuJiM0MztcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuaW5kZXggMTdiODNhMjUxOGE4Zi4uZGIyNmY2YjBlYWY1ZSAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5AQCAtMjkzLDYgJiM0MzsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksXG4mIzQzO1x0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX1ZJU0lCTEUsIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfRElUX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5pbmRleCBiN2NjMTFlNGZiZmE2Li42MjY2MGJmNTIwYThkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMTAsNSAmIzQzOzMxMCw2IEBAIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcJiMzNDtcbiYjNDM7c291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXCYjMzQ7XG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM5LDMgJiM0MzszOSw0IEBAIG9iai15XHRcdFx0XHQmIzQzOz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQmIzQzOz0gdGVncmEvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSB4aWxpbngvXG4mIzQzO29iai15XHRcdFx0XHQmIzQzOz0gYXJtX3JtbS9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODI3MjRlZTIzMTg2ZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbkBAIC0wLDAgJiM0MzsxLDI2IEBAXG4mIzQzO1xuJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbiYjNDM7XHRib29sXG4mIzQzO1xuJiM0Mztjb25maWcgQVJNX1JNTV9STUlcbiYjNDM7XHRib29sIFwmIzM0O1JlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG4mIzQzO1x0ZGVmYXVsdCB5XG4mIzQzO1x0aGVscFxuJiM0MztcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcbiYjNDM7XHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXG4mIzQzO1x0ICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLlxuJiM0MztcbiYjNDM7XHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cbiYjNDM7XHQgIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHVzZWQgYnkgYSBOb3JtYWwgV29ybGQgaG9zdCB0byBjcmVhdGUsXG4mIzQzO1x0ICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhblxuJiM0MztcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXG4mIzQzO1x0ICBQQ0kgSURFIHNldHVwIGZvciBzZWN1cmluZyB0aGUgUENJZSBsaW5rcy5cbiYjNDM7XG4mIzQzO1x0ICBUaGlzIG9wdGlvbiBidWlsZHMgdGhlIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCB1c2VkIGJ5IEtWTSB0byBkZXRlY3QgYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxuJiM0MztcdCAgUmVhbG0gZ3Vlc3RzLlxuJiM0MztcbiYjNDM7XHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxuJiM0MztcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXG4mIzQzO1x0ICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgJiM0MzsxLDIgQEBcbiYjNDM7XG4mIzQzO29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcdD0gcm1pLm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zNDA1OGUzNDE4OGQzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbkBAIC0wLDAgJiM0MzsxLDgxOSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdWZlYXR1cmUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO1xuJiM0MzsvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cbiYjNDM7I2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbiYjNDM7c3RhdGljIF9fcm9fYWZ0ZXJfaW5pdCB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdO1xuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OKGlkIFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xuJiM0MztcbiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuJiM0MztcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXG4mIzQzO3tcbiYjNDM7XHRsb25nIHJldCA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZShwaHlzLCB0b3AsIFx1MDAyNm91dF90b3ApO1xuJiM0MztcdFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cGh5cyA9IG91dF90b3A7XG4mIzQzO1x0XHRlbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKVxuJiM0MztcdFx0XHRjcHVfcmVsYXgoKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3V0X3BoeXMpXG4mIzQzO1x0XHQqb3V0X3BoeXMgPSBwaHlzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4mIzQzO1xuJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGxvbmcgcmV0ID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChwaHlzIFx1MDAzYyB0b3ApIHtcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoMyAtIHVuaXRfc2l6ZSkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfc21jY2NfaW52b2tlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3NfaW4sXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSAqcmVnc19pbjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKDEpIHtcbiYjNDM7XHRcdGFybV9zbWNjY18xXzJfaW52b2tlKFx1MDAyNnJlZ3MsIHJlZ3Nfb3V0KTtcbiYjNDM7XHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbiYjNDM7XHRcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXHUwMDI2XHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjcHVfcmVsYXgoKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzLCBvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHQgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfTUVNX0RPTkFURSwgc3JvX2hhbmRsZSwgbGlzdF9hZGRyLCBsaXN0X2NvdW50LCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIG91dHB1dCBkb25hdGVkIGNvdW50IChhMSkgaXMgYWx3YXlzIHZhbGlkLCBpcnJlc3BlY3RpdmVcbiYjNDM7XHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcbiYjNDM7XHQgKi9cbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHtcbiYjNDM7XHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPVkVSRkxPVztcbiYjNDM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9TUEM7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSB1bml0X3NpemVfYnl0ZXMgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR2b2lkICp2aXJ0O1xuJiM0MztcdHBoeXNfYWRkcl90IHBoeXM7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhXG4mIzQzO1x0ICogcG93ZXIgb2YgMlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuJiM0MztcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbiYjNDM7XHRcdFx0ICAwLCBvdXRfcmVncyk7XG4mIzQzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuJiM0MztcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXHUwMDNjIHNpemUpIHtcbiYjNDM7XHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cbiYjNDM7XHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuJiM0MztcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4mIzQzO1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbiYjNDM7XHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbiYjNDM7XHRcdFx0Zm91bmQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpLS07XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbiYjNDM7XHQgKiBqdXN0IGluIGNhc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbiYjNDM7XHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuJiM0MztcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbiYjNDM7XHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4mIzQzO1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuJiM0MztcdFx0XHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbiYjNDM7XHRcdGZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XG4mIzQzO1x0XHQgICAgIGkgJiM0Mzs9IFBBR0VfU0laRSkge1xuJiM0MztcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4mIzQzO1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgJiM0MzsgaSkpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuJiM0MztcdFx0ICogZnJlZWQpXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJiMzOTt0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbiYjNDM7XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpIFx1MDAzYyBmb3VuZDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaV07XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHJlZ3MsIGdmcCk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdHJlZ3MsIGdmcCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbiYjNDM7XG4mIzQzO1x0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcbiYjNDM7XHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSxcbiYjNDM7XHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cdTAwM2VhMSBcdTAwM2UgY2FwYWNpdHkpKVxuJiM0MztcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50O1xuJiM0MztcbiYjNDM7XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xuJiM0MztcdFx0XHRcdC8qIExlYWsgdGhlIHBhZ2VzICovXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KGFkZHIpLCBzaXplKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xuJiM0MztcbiYjNDM7bG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuJiM0MztcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuJiM0MztcdFx0XHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWUuXG4mIzQzO1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuJiM0MztcdFx0XHQgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFjYW5fY2FuY2VsKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcbiYjNDM7XG4mIzQzO1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuJiM0MztcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0ZGVmYXVsdDpcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuJiM0MztcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4mIzQzO1xuJiM0MztcdFx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuJiM0MztcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGNhbmNlbGxlZClcbiYjNDM7XHRcdHJldHVybiAtRUNBTkNFTEVEO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2V4ZWN1dGUpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBob3N0X3ZlcnNpb24gPSBSTUlfQUJJX1ZFUlNJT04oUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4mIzQzO1xuJiM0MztcdC8qIElmIFJNRSBpc24mIzM5O3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4mIzM5O3QgYmUgKi9cbiYjNDM7XHRpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKVxuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHR2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpO1xuJiM0MztcdHZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMSk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIHNob3J0IGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yO1xuJiM0MztcbiYjNDM7XHRcdGhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTtcbiYjNDM7XHRcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcbiYjNDM7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7VW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxuJiM0MztcdFx0ICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbiYjNDM7XHRcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHByX2luZm8oXCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCYjMzQ7LCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU2luY2Ugd2UmIzM5O3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcbiYjNDM7XHQgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZVxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2NvbmZpZ3VyZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1x0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbiYjNDM7XHRjYXNlIFNaXzRLOlxuJiM0MztcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgU1pfMTZLOlxuJiM0MztcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuJiM0MztcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl82NEs6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0QlVJTERfQlVHKCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIShybWlfZmVhdF9yZWcoMSkgXHUwMDI2IGdyYW51bGVfZmVhdHVyZSkpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBQQUdFX1NJWkUgXHUwMDNlXHUwMDNlIDEwKTtcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFjb25maWcpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0Y29uZmlnLVx1MDAzZXJtaV9ncmFudWxlX3NpemUgPSBncmFudWxlX3NpemU7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXG4mIzQzO1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbiYjNDM7XHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbiYjNDM7XHQgKiBQQUdFX1NJWkVTXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuJiM0MztcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4mIzQzO1x0XHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcbiYjNDM7XHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4mIzQzO1x0XHRcdHByX2VycihcJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuJiM0MzsgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuJiM0MztcbiYjNDM7XHRsMGdwdF9zeiA9IDFVTCBcdTAwM2NcdTAwM2MgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4mIzQzO1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuJiM0MztcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xuJiM0MztcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRzdGFydCwgbmV4dCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3RhcnQgPSBuZXh0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQoc3RhcnQsIGVuZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuJiM0MztcdFx0aWYgKG1lbWJsb2NrX2lzX25vbWFwKHIpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHN0YXJ0ID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3Bmbik7XG4mIzQzO1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiAmIzQzOyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuJiM0MztcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuJiM0MztcdC5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllcixcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4mIzQzO1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKiBBY3RpdmF0ZSB0aGUgUk1NICovXG4mIzQzO1x0c3JvID0ga21hbGxvY19vYmooKnNybyk7XG4mIzQzO1x0aWYgKCFzcm8pXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IHJldCBcdTAwM2MgMCA/IHJldCA6IC1FTlhJTztcbiYjNDM7XHRcdGdvdG8gb3V0X2ZyZWVfc3JvO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFx1MDAyNnJtaV9tZW1vcnlfbmIpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuJiM0MztcbiYjNDM7XHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1JNSSBjb25maWd1cmVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRrZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO291dF9kZWFjdGl2YXRlOlxuJiM0MztcdHJtaV9ybW1fZGVhY3RpdmF0ZShzcm8pO1xuJiM0MztvdXRfZnJlZV9zcm86XG4mIzQzO1x0a2ZyZWUoc3JvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBOb3RlIGFybTY0X2luaXRfcm1pKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGt2bV9pbml0X3JtaSgpIG90aGVyd2lzZSBLVk1cbiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbiYjNDM7ICogbW9kdWxlX2luaXQoKSAodXNlZCBmb3IgS1ZNKSBzbyB0aGlzIGlzIE9LLlxuJiM0MzsgKi9cbiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjc0NjI1N2Q3N2RkNjFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgJiM0MzsxLDY3OCBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbiYjNDM7XG4mIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xuJiM0MztcbiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcbiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG4mIzQzO2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuJiM0MztcbiYjNDM7I2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7XHRcdFx0XHRcXFxuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1x0XHRcdFx0XFxcbiYjNDM7XHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcdFxcXG4mIzQzO1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4mIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0XG4mIzQzOyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxuJiM0MzsgKlxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fREVBQ1RJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ybW1fYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uXG4mIzQzOyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uXG4mIzQzOyAqIEBlbmQ6IEVuZCBvZiB0aGUgUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeVxuJiM0MzsgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGVcbiYjNDM7ICogQG91dF90b3A6IFRvcCBvZiB0aGUgbWVtb3J5IHJlZ2lvblxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfY2F0ZWdvcnkpXG4mIzQzO1x0XHRcdCpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3N0YXRlKVxuJiM0MztcdFx0XHQqb3V0X3N0YXRlID0gcmVzLmEyO1xuJiM0MztcdFx0aWYgKG91dF90b3ApXG4mIzQzO1x0XHRcdCpvdXRfdG9wID0gcmVzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlcy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcm1pX2dwdF9pbmZvIC0gUXVlcnkgdGhlIEdQVCBpbmZvIGZvciB0aGUgZ2l2ZW4gUEFSLlxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcbiYjNDM7ICpcdFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcbiYjNDM7ICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0dQVF9JTkZPLCBiYXNlLCBlbmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X2dwdF9wYXJfc3RhdGUpXG4mIzQzO1x0XHRcdCpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXJcbiYjNDM7ICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XG4mIzQzOyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRpZiAocmVzLmEwID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXQpXG4mIzQzO1x0XHQqb3V0ID0gcmVzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzXG4mIzQzOyAqIEBiYXNlOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBvZiB0aGUgcmFuZ2VcbiYjNDM7ICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4mIzQzOyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkXG4mIzQzOyAqXG4mIzQzOyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuJiM0MzsgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4mIzQzOyAqIGFnYWluIHdpdGggQGJhc2UgPT0gQG91dF90b3AuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURSwgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xuJiM0MzsgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcbiYjNDM7ICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBwcm90ZWN0ZWQgbWFwcGluZyB3aXRoIGRhdGEgY29udGVudHNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGRhdGE6IFBBIG9mIHRoZSB0YXJnZXQgZ3JhbnVsZVxuJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4mIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZVxuJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXG4mIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgdW5zaWduZWQgbG9uZyBzcmMsXG4mIzQzO1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IFJlYWxtXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0aWYgKG91dF90b3ApXG4mIzQzO1x0XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XHRcdGlmIChvdXRfcmFuZ2UpXG4mIzQzO1x0XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuJiM0MztcdFx0aWYgKG91dF9jb3VudClcbiYjNDM7XHRcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kXG4mIzQzOyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDXG4mIzQzOyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKlxuJiM0MzsgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZSBhbmQgYWxsb3dpbmdcbiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBUZXJtaW5hdGVzIGEgcmVhbG0sIG1vdmluZyBpdCBpbnRvIGEgWk9NQklFIHN0YXRlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0RFU1RST1ksIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxuJiM0MzsgKiB0byBieSBAcGFyYW1zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xuJiM0MztcdH19O1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0cm1pX3Nyb19mcmVlKHNybyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICAgbG9uZyBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfcnR0KVxuJiM0MztcdFx0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKlxuJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlXG4mIzQzOyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3J0dClcbiYjNDM7XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuJiM0MzsgKlxuJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2VcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlYjg4Y2FmNDA5NjRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICYjNDM7MSw0OTQgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuJiM0MzsgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZF9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbiYjNDM7XHRBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbiYjNDM7XHRcdFx0ICAgKGZ1bmMpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2YpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxODYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FXHRcdFNNQ19STUlfQ0FMTCgweDAxZjApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OXHQwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAyNiAweEZGRkYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0tcdFx0KDB4RkZVTClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0KDB4RkZVTCBcdTAwM2NcdTAwM2MgOClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLXHRcdCgweDNVTCBcdTAwM2NcdTAwM2MgOClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTS1x0KDB4MVVMIFx1MDAzY1x1MDAzYyAxMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVgocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1NVQ0NFU1NcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXHRcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVx0XHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUkVDXHRcdFx0M1xuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRcdFx0XHQ0XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcdFx0NVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcdFx0NlxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYXHRcdDdcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcdFx0OFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9EUFRcdFx0XHQ5XG4mIzQzOyNkZWZpbmUgUk1JX0JVU1lcdFx0XHQxMFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcdFx0MTFcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkdcdFx0MTJcbiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURVx0XHRcdDEzXG4mIzQzOyNkZWZpbmUgUk1JX0JMT0NLRURcdFx0XHQxNFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUFRcdFx0XHQxNVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXHRcdDE2XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUFx0XHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfUkVDTEFJTVx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXHRcdDNVTFxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTS1x0XHRHRU5NQVNLKDE1LCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0tcdFx0QklUKDE2KVxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1x0XHRHRU5NQVNLKDE4LCAxNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fQ09ORElUSU9OQUxcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX0xJU1RcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTS1x0R0VOTUFTSyg2MywgNjIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXHRcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXFxuJiM0MztcdFx0XHRcdFx0XHQgICAoYXIpKSlcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChhcilcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcilcdFx0KChhcikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURShhcilcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzO1xuJiM0MztlbnVtIHJtaV9yaXBhcyB7XG4mIzQzO1x0Uk1JX0VNUFRZID0gMCxcbiYjNDM7XHRSTUlfUkFNID0gMSxcbiYjNDM7XHRSTUlfREVTVFJPWUVEID0gMixcbiYjNDM7XHRSTUlfREVWID0gMyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcdDFcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdEdFTk1BU0soNywgMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkxcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdEdFTk1BU0soMTksIDE0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRHRU5NQVNLKDI1LCAyMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRCSVQoMjYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdEdFTk1BU0soMzEsIDI3KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEVcdEJJVCgzMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRHRU5NQVNLKDQwLCAzMylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdEdFTk1BU0soMTYsIDE0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QREVWX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSyg3LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXHRCSVQoOClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1JFQUxNX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSygxNCwgMTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXHRHRU5NQVNLKDMsIDApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcdFx0R0VOTUFTSyg1LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1RcdEJJVCg2KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVFx0XHRHRU5NQVNLKDYzLCAwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09IXHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcdFx0XHQzXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFx0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVx0XHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXHRcdFx0M1xuJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcdFx0NFxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlx0MVxuJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNjRLQlx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9QTEFUICAgICAgICAgICAgICAgMVVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbiYjNDM7ICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBybW1fY29uZmlnIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuJiM0MztcdFx0XHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBzaXplcltTWl80S107XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRVx0XHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcdFx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXHRcdEdFTk1BU0soNiwgNSlcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZXHRcdEdFTk1BU0soOCwgNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1Nlx0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXHRcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcdFx0XHQyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMDtcbiYjNDM7XHRcdFx0dTY0IHMyc3o7XG4mIzQzO1x0XHRcdHU2NCBzdmVfdmw7XG4mIzQzO1x0XHRcdHU2NCBudW1fYnBzO1xuJiM0MztcdFx0XHR1NjQgbnVtX3dwcztcbiYjNDM7XHRcdFx0dTY0IHBtdV9udW1fY3RycztcbiYjNDM7XHRcdFx0dTY0IGhhc2hfYWxnbztcbiYjNDM7XHRcdFx0dTY0IG51bV9hdXhfcGxhbmVzO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4NDAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg0MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU4IHJwdls2NF07XG4mIzQzO1x0XHRcdHU2NCBhdHNfcGxhbmU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHg0MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDgwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHBhZGRpbmcyO1xuJiM0MztcdFx0XHR1NjQgcnR0X2Jhc2U7XG4mIzQzO1x0XHRcdHM2NCBydHRfbGV2ZWxfc3RhcnQ7XG4mIzQzO1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgZmxhZ3MxO1xuJiM0MztcdFx0XHR1NjQgbWF4X251bV92ZGV2cztcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweDcwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4ZjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nNFsweDgwXTtcbiYjNDM7XHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbiYjNDM7ICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUKDApXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX3BhcmFtcyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgxMDAgKi9cbiYjNDM7XHRcdHU2NCBtcGlkcjtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBwYztcbiYjNDM7XHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgzMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweGQwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXHRcdEJJVCgzKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXHRCSVQoNClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFXHRCSVQoNilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFx0XHRCSVQoNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTXHRcdFx0MzFcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZW50ZXIge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDYwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfU1lOQ1x0XHRcdDB4MDBcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfRklRXHRcdFx0MHgwMlxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1BTQ0lcdFx0XHQweDAzXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcdFx0MHgwNVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NFUlJPUlx0XHRcdDB4MDZcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXHQweDA4XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORFx0XHQweDBhXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX2V4aXQge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU4IGV4aXRfcmVhc29uO1xuJiM0MztcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDEwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGVzcjtcbiYjNDM7XHRcdFx0dTY0IGZhcjtcbiYjNDM7XHRcdFx0dTY0IGhwZmFyO1xuJiM0MztcdFx0XHR1NjQgcnR0X3RyZWU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDIwMCAqL1xuJiM0MztcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgzMDAgKi9cbiYjNDM7XHRcdHU4IHBhZGRpbmczWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg0MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBjbnRwX2N0bDtcbiYjNDM7XHRcdFx0dTY0IGNudHBfY3ZhbDtcbiYjNDM7XHRcdFx0dTY0IGNudHZfY3RsO1xuJiM0MztcdFx0XHR1NjQgY250dl9jdmFsO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc0WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg1MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCByaXBhc19iYXNlO1xuJiM0MztcdFx0XHR1NjQgcmlwYXNfdG9wO1xuJiM0MztcdFx0XHR1OCByaXBhc192YWx1ZTtcbiYjNDM7XHRcdFx0dTggcGFkZGluZzVbMHhmXTtcbiYjNDM7XHRcdFx0dTY0IHMyYXBfYmFzZTtcbiYjNDM7XHRcdFx0dTY0IHMyYXBfdG9wO1xuJiM0MztcdFx0XHR1NjQgdmRldl9pZF8xO1xuJiM0MztcdFx0XHR1NjQgdmRldl9pZF8yO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9iYXNlO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV90b3A7XG4mIzQzO1x0XHRcdHU2NCBkZXZfbWVtX3BhO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg2MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHUxNiBpbW07XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc3WzB4Nl07XG4mIzQzO1x0XHRcdHU2NCBwbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nOFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NzAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbiYjNDM7XHRcdFx0dTggcGFkZGluZzlbMHhmXTtcbiYjNDM7XHRcdFx0dTY0IHZzbW11O1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspO1xuJiM0MztcbiYjNDM7c3RydWN0IHJlY19ydW4ge1xuJiM0MztcdHN0cnVjdCByZWNfZW50ZXIgZW50ZXI7XG4mIzQzO1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7LyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUlx0R0VOTUFTSygxOCwgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4mIzQzO1xuJiM0MzsvKiBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuJiM0MztcbiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4mIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXHRcdFx0QklUKDApXG4mIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQURcdFx0XHRCSVQoMSlcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDlhYzQ3MzJjM2Q0YzBhOGM2MDQxMWEzMjY5NDgwOTYwNTRhZjI5NzgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDE0OjUxOjIzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L0tjb25maWcKQEAgLTM4LDYgJiM0MzszOCw3IEBAIGNvbmZpZyBBUk02NAogCXNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRQogCXNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVAogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HUwomIzQzOwlzZWxlY3QgQVJDSF9TVVBQT1JUU19STU0KIAlzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTCiAJc2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFCiAJc2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwppbmRleCAxN2I4M2EyNTE4YThmLi5kYjI2ZjZiMGVhZjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0gewogc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksCiYjNDM7CUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKQEAgLTMxMCw1ICYjNDM7MzEwLDYgQEAgc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnJiMzNDsKJiM0Mztzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyYjMzQ7CiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IGJlNDZmMWUxZGM3N2YuLjE5NmE2NTBjY2YwMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLXkJCQkJJiM0Mzs9IHNhbXN1bmcvCiBvYmoteQkJCQkmIzQzOz0gc21jY2MvCiBvYmoteQkJCQkmIzQzOz0gdGVncmEvCiBvYmoteQkJCQkmIzQzOz0geGlsaW54LwomIzQzO29iai15CQkJCSYjNDM7PSBhcm1fcm1tLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKQEAgLTAsMCAmIzQzOzEsMjYgQEAKJiM0MzsKJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJYm9vbAomIzQzOwomIzQzO2NvbmZpZyBBUk1fUk1NX1JNSQomIzQzOwlib29sICYjMzQ7UmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydCYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJZGVmYXVsdCB5CiYjNDM7CWhlbHAKJiM0MzsJICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdAomIzQzOwkgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlCiYjNDM7CSAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS4KJiM0MzsKJiM0MzsJICBUaGUgUk1NIHJ1bnMgYXQgRUwyIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtCiYjNDM7CSAgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwKJiM0MzsJICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhbgomIzQzOwkgIGFsc28gYWN0IGFzIGEgVFNNLCBhcyBkZWZpbmVkIGJ5IHRoZSBQQ0llIFRESVNQIGFuZCBjYW4gbWFuYWdlIHRoZQomIzQzOwkgIFBDSSBJREUgc2V0dXAgZm9yIHNlY3VyaW5nIHRoZSBQQ0llIGxpbmtzLgomIzQzOwomIzQzOwkgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhCiYjNDM7CSAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZQomIzQzOwkgIFJlYWxtIGd1ZXN0cy4KJiM0MzsKJiM0MzsJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZToKJiM0MzsJICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDIgQEAKJiM0MzsKJiM0MztvYmotJChDT05GSUdfQVJNX1JNTV9STUkpCT0gcm1pLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zNDA1OGUzNDE4OGQzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCkBAIC0wLDAgJiM0MzsxLDgxOSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcHVmZWF0dXJlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbW9yeS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcm0tcm1pLWNtZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJvY2Vzc29yLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YXNtL21lbW9yeS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0OwomIzQzOwomIzQzO3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7CiYjNDM7CiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovCiYjNDM7I2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlQJMgomIzQzO3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTsKJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT04oaWQgJmd0Oz0gUk1JX0ZFQVRfUkVHX0NPVU5UKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTsKJiM0MzsKJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgJmFtcDtvdXRfdG9wKTsKJiM0MzsJCWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQkJcGh5cyA9IG91dF90b3A7CiYjNDM7CQllbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKQomIzQzOwkJCWNwdV9yZWxheCgpOwomIzQzOwkJZWxzZQomIzQzOwkJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChvdXRfcGh5cykKJiM0MzsJCSpvdXRfcGh5cyA9IHBoeXM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCWVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJY3B1X3JlbGF4KCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7CiYjNDM7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbiwKJiM0MzsJCQkgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdHVzOwomIzQzOwomIzQzOwl3aGlsZSAoMSkgewomIzQzOwkJYXJtX3NtY2NjXzFfMl9pbnZva2UoJmFtcDtyZWdzLCByZWdzX291dCk7CiYjNDM7CQlzdGF0dXMgPSBSTUlfUkVUVVJOX1NUQVRVUyhyZWdzX291dC0mZ3Q7YTApOwomIzQzOwkJaWYgKHN0YXR1cyAhPSBSTUlfQlVTWSAmYW1wOyZhbXA7IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNwdV9yZWxheCgpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NhbmNlbCh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzLCBvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCSAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvdXRwdXQgZG9uYXRlZCBjb3VudCAoYTEpIGlzIGFsd2F5cyB2YWxpZCwgaXJyZXNwZWN0aXZlCiYjNDM7CSAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgomIzQzOwkgKi8KJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwKJiM0MzsJCQkgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHsKJiM0MzsJCS8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJaW50IHJldDsKJiM0MzsJdm9pZCAqdmlydDsKJiM0MzsJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhCiYjNDM7CSAqIHBvd2VyIG9mIDIKJiM0MzsJICovCiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc3JvLSZndDthZGRyX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby0mZ3Q7YWRkcl9saXN0W2ldOwomIzQzOwomIzQzOwkJaWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50ICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUgJmFtcDsmYW1wOwomIzQzOwkJICAgIElTX0FMSUdORUQoUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSksIHNpemUpKSB7CiYjNDM7CQkJc3JvLSZndDthZGRyX2NvdW50LS07CiYjNDM7CQkJc3dhcChzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdLAomIzQzOwkJCSAgICAgc3JvLSZndDthZGRyX2xpc3RbaV0pOwomIzQzOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTsKJiM0MzsJaWYgKCF2aXJ0KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkgewomIzQzOwkJcGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7CiYjNDM7CiYjNDM7CQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsICZhbXA7ZGVsZWdhdGVkX3BoeXMpKSB7CiYjNDM7CQkJaWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKQomIzQzOwkJCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpOwomIzQzOwkJCXJldHVybiAtRU5YSU87CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJYWRkcl9yYW5nZSA9IHBoeXMgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGNvdW50KTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdID0gYWRkcl9yYW5nZTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwgMSwKJiM0MzsJCQkgIDAsIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9IGRvbmF0ZWRfZ3JhbnVsZXMgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkgewomIzQzOwkJLyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovCiYjNDM7CQlzcm8tJmd0O2FkZHJfY291bnQmIzQzOyYjNDM7OwomIzQzOwl9IGVsc2UgaWYgKGRvbmF0ZWRfc2l6ZSAmbHQ7IHNpemUpIHsKJiM0MzsJCXBoeXMgPSBzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSzsKJiM0MzsKJiM0MzsJCS8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi8KJiM0MzsJCWZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpICZsdDsgc2l6ZTsgaSAmIzQzOz0gUEFHRV9TSVpFKSB7CiYjNDM7CQkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKQomIzQzOwkJCQlmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgJiM0MzsgaSk7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyAmIzQzOyBpKSk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgICAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGFkZHJfbGlzdF9zdGFydCAmYW1wOyZhbXA7IGZvdW5kICZsdDsgY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7CiYjNDM7CQkJYWRkcl9saXN0X3N0YXJ0LS07CiYjNDM7CQkJc3dhcChzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLAomIzQzOwkJCSAgICAgc3JvLSZndDthZGRyX2xpc3RbaV0pOwomIzQzOwkJCWZvdW5kJiM0MzsmIzQzOzsKJiM0MzsJCQlpLS07CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlIChmb3VuZCAmbHQ7IGNvdW50KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7CiYjNDM7CQl2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJCWlmICghdmlydCkKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHVuaXRfc2l6ZV9ieXRlcywKJiM0MzsJCQkJCSAgICAgICAmYW1wO2RlbGVnYXRlZF9waHlzKSkgewomIzQzOwkJCQlpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpCiYjNDM7CQkJCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHVuaXRfc2l6ZV9ieXRlcyk7CiYjNDM7CQkJCXJldHVybiAtRU5YSU87CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwomIzQzOwkJYWRkcl9yYW5nZSA9IHBoeXMgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCB1bml0X3NpemUpOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgMSk7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBzdGF0ZSk7CiYjNDM7CiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnQmIzQzOyYjNDM7XSA9IGFkZHJfcmFuZ2U7CiYjNDM7CQlmb3VuZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0pLAomIzQzOwkJCSAgZm91bmQsIDAsIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl91bml0ID0gdW5pdF9zaXplX2J5dGVzICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY29uc3VtZWRfdW5pdHM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXAKJiM0MzsJICoganVzdCBpbiBjYXNlLgomIzQzOwkgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzICZndDsgZm91bmQgKiBncmFudWxlc19wZXJfdW5pdCkpCiYjNDM7CQlkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSByZXBvcnRzIHRoZSBjb25zdW1lZCBtZW1vcnkgaW4gdGVybXMgb2YgZ3JhbnVsZXMsIGJ1dCB3ZQomIzQzOwkgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldAomIzQzOwkgKiB0aGUgbnVtYmVyIG9mIChjb21wbGV0ZSkgY29uc3VtZWQgdW5pdHMuCiYjNDM7CSAqLwomIzQzOwljb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgewomIzQzOwkJLyoKJiM0MzsJCSAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieQomIzQzOwkJICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3QKJiM0MzsJCSAqLwomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiYjNDM7CQkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGNvbnN1bWVkX3VuaXRzXTsKJiM0MzsJCXBoeXNfYWRkcl90IHBoeXMgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0KJiM0MzsJCQkoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJLyogRnJlZSB0aGUgdGFpbCBiYWNrICovCiYjNDM7CQlmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSAmbHQ7IHVuaXRfc2l6ZV9ieXRlczsKJiM0MzsJCSAgICAgaSAmIzQzOz0gUEFHRV9TSVpFKSB7CiYjNDM7CQkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKQomIzQzOwkJCQlmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgJiM0MzsgaSk7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyAmIzQzOyBpKSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAmIzM5O2NvbnN1bWVkJiMzOTsgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3IKJiM0MzsJCSAqIGZyZWVkKQomIzQzOwkJICovCiYjNDM7CQljb25zdW1lZF91bml0cyYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogS2VlcCBqdXN0IHRoZSB1bml0cyB0aGUgUk1NIGRpZG4mIzM5O3QgdXNlIGluIGFkZHJfbGlzdCAqLwomIzQzOwlmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpICZsdDsgZm91bmQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGkgLSBjb25zdW1lZF91bml0c10gPQomIzQzOwkJCXNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCSAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsCiYjNDM7CQkJICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLAomIzQzOwkJCSAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpZiAoUk1JX0RPTkFURV9DT05USUcoZG9uYXRlcmVxKSkgewomIzQzOwkJcmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSwKJiM0MzsJCQkJCSAgICAgcmVncywgZ2ZwKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkJcmVncywgZ2ZwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCSAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlybWlfc3JvX2ZyZWUoc3JvKTsKJiM0MzsKJiM0MzsJY2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby0mZ3Q7YWRkcl9jb3VudDsKJiM0MzsKJiM0MzsJcm1pX29wX21lbV9yZWNsYWltKHNyb19oYW5kbGUsCiYjNDM7CQkJICAgdmlydF90b19waHlzKCZhbXA7c3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSksCiYjNDM7CQkJICAgY2FwYWNpdHksIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRShvdXRfcmVncy0mZ3Q7YTEgJmd0OyBjYXBhY2l0eSkpCiYjNDM7CQlvdXRfcmVncy0mZ3Q7YTEgPSBjYXBhY2l0eTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ICYjNDM7PSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkgewomIzQzOwkJCQkvKiBMZWFrIHRoZSBwYWdlcyAqLwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ID0gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9ICZhbXA7c3JvLSZndDtyZWdzOwomIzQzOwlib29sIGNhbmNlbGxlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpOwomIzQzOwomIzQzOwlzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgPT0gUk1JX0lOQ09NUExFVEUpIHsKJiM0MzsJCWJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLSZndDthMCk7CiYjNDM7CQlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtJmd0O2EyLCByZWdzLAomIzQzOwkJCQkJICAgICBnZnApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOgomIzQzOwkJCXJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQlyZXQgPSBXQVJOX09OX09OQ0UoMSk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYQomIzQzOwkJCSAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbiYjMzk7dCBiZSBhbiBpc3N1ZS4KJiM0MzsJCQkgKiBIb3dldmVyLCBpZiB3ZSBlbmNvdW50ZXIgYSByYW5kb20gZmFpbHVyZSAoZS5nLiwKJiM0MzsJCQkgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpCiYjNDM7CQkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQkJcm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCQljYW5jZWxsZWQgPSB0cnVlOwomIzQzOwomIzQzOwkJCWlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUpOwomIzQzOwomIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovCiYjNDM7bG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTsKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTsKJiM0MzsKJiM0MzsJc3JvX2hhbmRsZSA9IHJlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwl3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApID09IFJNSV9JTkNPTVBMRVRFKSB7CiYjNDM7CQlib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy0mZ3Q7YTApOwomIzQzOwomIzQzOwkJc3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLSZndDthMCkpIHsKJiM0MzsJCWNhc2UgUk1JX09QX01FTV9SRVFfTk9ORToKJiM0MzsJCQlybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsCiYjNDM7CQkJCQlyZWdzKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJV0FSTl9PTl9PTkNFKDEpOwomIzQzOwkJCWlmICghY2FuX2NhbmNlbCkKJiM0MzsJCQkJcmV0dXJuIHJlZ3MtJmd0O2EwOwomIzQzOwomIzQzOwkJCWNhbmNlbGxlZCA9IHRydWU7CiYjNDM7CQkJcm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CXVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCQkJCQkgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpOwomIzQzOwomIzQzOwkvKiBJZiBSTUUgaXNuJiMzOTt0IHN1cHBvcnRlZCwgdGhlbiBSTUkgY2FuJiMzOTt0IGJlICovCiYjNDM7CWlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTsKJiM0MzsJdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykgewomIzQzOwkJdW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7CiYjNDM7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7CiYjNDM7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXG4mIzM0OywKJiM0MzsJCSAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCSAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlwcl9pbmZvKCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXG4mIzM0OywgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVycwomIzQzOwkgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZQomIzQzOwkgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgJmFtcDtybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7CiYjNDM7CWludCByZXQgPSAwOwomIzQzOwlzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnOwomIzQzOwomIzQzOwlzd2l0Y2ggKFBBR0VfU0laRSkgewomIzQzOwljYXNlIFNaXzRLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7CiYjNDM7CQlncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFNaXzE2SzoKJiM0MzsJCWdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFNaXzY0SzoKJiM0MzsJCWdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJQlVJTERfQlVHKCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEocm1pX2ZlYXRfcmVnKDEpICZhbXA7IGdyYW51bGVfZmVhdHVyZSkpIHsKJiM0MzsJCXByX2VycigmIzM0O1JNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXG4mIzM0OywKJiM0MzsJCSAgICAgICBQQUdFX1NJWkUgJmd0OyZndDsgMTApOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwljb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghY29uZmlnKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uCiYjNDM7CSAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuCiYjNDM7CSAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlcgomIzQzOwkgKiBQQUdFX1NJWkVTCiYjNDM7CSAqLwomIzQzOwljb25maWctJmd0O3RyYWNraW5nX3JlZ2lvbl9zaXplID0gMDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LgomIzQzOyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0OwomIzQzOwomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHN0YXJ0LCBlbmQsICZhbXA7Y2F0ZWdvcnksICZhbXA7c3RhdGUsICZhbXA7bmV4dCk7CiYjNDM7CQlpZiAocmV0ICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJaWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8CiYjNDM7CQkgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHsKJiM0MzsJCQkvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi8KJiM0MzsJCQlwcl9lcnIoJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHN0YXJ0LCBuZXh0KTsKJiM0MzsJCQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsJCX0KJiM0MzsJCXN0YXJ0ID0gbmV4dDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjcmVhdGluZyBMMSBHUFRzIHlldC4gU28sIG1ha2Ugc3VyZSB0aGF0CiYjNDM7ICogYWxsIHRoZSByZWdpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbDBncHRfc3o7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlOwomIzQzOwomIzQzOwlsMGdwdF9zeiA9IDFVTCAmbHQ7Jmx0OyAoMzAgJiM0MzsgRklFTERfR0VUKFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWiwKJiM0MzsJCQkJCSAgcm1pX2ZlYXRfcmVnKDEpKSk7CiYjNDM7CXN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opOwomIzQzOwllbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTsKJiM0MzsKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQlsb25nIHJldCA9IHJtaV9ncHRfaW5mbyhzdGFydCwgZW5kLCAmYW1wO25leHQsICZhbXA7cGFyX3N0YXRlKTsKJiM0MzsKJiM0MzsJCWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CQlpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHsKJiM0MzsJCQlwcl9lcnIoJiMzNDtHUFQgZm9yIHRoZSByZWdpb24gaXMgbm90IG1hbmFnZWQgYnkgZmlybXdhcmUgJWxseC0lbHhcbiYjMzQ7LAomIzQzOwkJCQlzdGFydCwgbmV4dCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQl9CiYjNDM7CQlzdGFydCA9IG5leHQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpCiYjNDM7ewomIzQzOwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOwomIzQzOwlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwomIzQzOwomIzQzOwlmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHsKJiM0MzsJCWludCByZXQ7CiYjNDM7CiYjNDM7CQkvKiBGaXJtd2FyZS1yZXNlcnZlZCBOT01BUCByZWdpb25zIGFyZSBub3QgdXNhYmxlIHN5c3RlbSBSQU0gKi8KJiM0MzsJCWlmIChtZW1ibG9ja19pc19ub21hcChyKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCXN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwkJZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CQlyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1vcnlfbm90aWZ5ICphcmcgPSBkYXRhOwomIzQzOwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpCiYjNDM7CQlyZXR1cm4gTk9USUZZX0RPTkU7CiYjNDM7CiYjNDM7CXN0YXJ0ID0gUEZOX1BIWVMoYXJnLSZndDtzdGFydF9wZm4pOwomIzQzOwllbmQgPSBQRk5fUEhZUyhhcmctJmd0O3N0YXJ0X3BmbiAmIzQzOyBhcmctJmd0O25yX3BhZ2VzKTsKJiM0MzsJcmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpOwomIzQzOwomIzQzOwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJtaV9tZW1vcnlfbmIgPSB7CiYjNDM7CS5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllciwKJiM0Mzt9OwomIzQzOwomIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGlzX3JtaV9hdmFpbGFibGUpOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyA9IE5VTEw7CiYjNDM7CiYjNDM7CS8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovCiYjNDM7CXJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX2NvbmZpZ3VyZSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogQWN0aXZhdGUgdGhlIFJNTSAqLwomIzQzOwlzcm8gPSBrbWFsbG9jX29iaigqc3JvKTsKJiM0MzsJaWYgKCFzcm8pCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSByZXQgJmx0OyAwID8gcmV0IDogLUVOWElPOwomIzQzOwkJZ290byBvdXRfZnJlZV9zcm87CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gb3V0X2RlYWN0aXZhdGU7CiYjNDM7CiYjNDM7CXJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcigmYW1wO3JtaV9tZW1vcnlfbmIpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKJiM0MzsKJiM0MzsJYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgY29uZmlndXJlZFxuJiMzNDspOwomIzQzOwlrZnJlZShzcm8pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztvdXRfZGVhY3RpdmF0ZToKJiM0MzsJcm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7CiYjNDM7b3V0X2ZyZWVfc3JvOgomIzQzOwlrZnJlZShzcm8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTQomIzQzOyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlCiYjNDM7ICogbW9kdWxlX2luaXQoKSAodXNlZCBmb3IgS1ZNKSBzbyB0aGlzIGlzIE9LLgomIzQzOyAqLwomIzQzO3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43NDYyNTdkNzdkZDYxCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaApAQCAtMCwwICYjNDM7MSw2NzggQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qCiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXNtY2NjLXJtaS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUCTI1NgomIzQzOwomIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTsKJiM0Mzt9OwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7CiYjNDM7fQomIzQzOwomIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7CiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7CiYjNDM7bG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7CiYjNDM7CiYjNDM7I2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7CQkJCVwKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7CQkJCVwKJiM0MzsJKl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07CVwKJiM0MzsJbG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApOwkJXAomIzQzOwlybWlfc3JvX2ZyZWUoX19zcm8pOwkJCQkJCVwKJiM0MzsJX19yZXQ7CQkJCQkJCQlcCiYjNDM7fSkKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NCiYjNDM7ICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWcKJiM0MzsgKgomIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlcy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0CiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpCiYjNDM7ICoKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ybW1fZGVhY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTQomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvbgomIzQzOyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb24KJiM0MzsgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnkKJiM0MzsgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGUKJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LAomIzQzOwkJCQkJICAgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfY2F0ZWdvcnksCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VULCBzdGFydCwgZW5kLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CWlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfY2F0ZWdvcnkpCiYjNDM7CQkJKm91dF9jYXRlZ29yeSA9IHJlcy5hMTsKJiM0MzsJCWlmIChvdXRfc3RhdGUpCiYjNDM7CQkJKm91dF9zdGF0ZSA9IHJlcy5hMjsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogcm1pX2dwdF9pbmZvIC0gUXVlcnkgdGhlIEdQVCBpbmZvIGZvciB0aGUgZ2l2ZW4gUEFSLgomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbgomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2gKJiM0MzsgKgkJdGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWQKJiM0MzsgKiBAb3V0X2dwdF9wYXJfc3RhdGU6IFN0YXRlIG9mIHRoZSBHUFQgY292ZXJlZCBieSBbYmFzZSwgb3V0X3RvcCkKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9ncHRfcGFyX3N0YXRlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUFRfSU5GTywgYmFzZSwgZW5kLAomIzQzOwl9OwomIzQzOwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQlpZiAob3V0X3RvcCkKJiM0MzsJCQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CQlpZiAob3V0X2dwdF9wYXJfc3RhdGUpCiYjNDM7CQkJKm91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlcgomIzQzOyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleAomIzQzOyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXIKJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9GRUFUVVJFUywgaW5kZXgsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dCkKJiM0MzsJCSpvdXQgPSByZXMuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlcwomIzQzOyAqIEBiYXNlOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBvZiB0aGUgcmFuZ2UKJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2UKJiM0MzsgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlCiYjNDM7ICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAomIzQzOyAqIGFnYWluIHdpdGggQGJhc2UgPT0gQG91dF90b3AuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcwomIzQzOyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWQKJiM0MzsgKgomIzQzOyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmCiYjNDM7ICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlCiYjNDM7ICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdAomIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZQomIzQzOyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nCiYjNDM7ICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsCiYjNDM7CQkJCQkgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJldHVybiBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbQomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQlpZiAob3V0X3RvcCkKJiM0MzsJCQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CQlpZiAob3V0X3JhbmdlKQomIzQzOwkJCSpvdXRfcmFuZ2UgPSByZWdzLmEyOwomIzQzOwkJaWYgKG91dF9jb3VudCkKJiM0MzsJCQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmQKJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQwomIzQzOyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0CiYjNDM7ICoKJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKgomIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlIGFuZCBhbGxvd2luZwomIzQzOyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlcy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnMKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsCiYjNDM7CQkJCSAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUMKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnMKJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZAomIzQzOyAqIHRvIGJ5IEBwYXJhbXMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19jcmVhdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CSpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXMKJiM0MzsJfX07CiYjNDM7CXJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7CiYjNDM7CXJtaV9zcm9fZnJlZShzcm8pOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUMKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlY19lbnRlcigpIC0gRW50ZXIgYSBSRUMKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUCiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqCiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGUKJiM0MzsgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbQomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogUlRUIGxldmVsCiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZAomIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5CiYjNDM7ICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZQomIzQzOyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQkgICBsb25nIGxldmVsLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJaWYgKG91dF9ydHQpCiYjNDM7CQkJKm91dF9ydHQgPSByZWdzLmExOwomIzQzOwkJaWYgKG91dF90b3ApCiYjNDM7CQkJKm91dF90b3AgPSByZWdzLmEyOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkCiYjNDM7ICoKJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlCiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9mb2xkKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQlsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nICpvdXRfcnR0KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfRk9MRCwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF9ydHQpCiYjNDM7CQkqb3V0X3J0dCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkCiYjNDM7ICoKJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmcKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEKJiM0MzsgKiByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF91bnByb3RfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB3aXRoaW4gYW4gdW5wcm90ZWN0ZWQgSVBBIHJhbmdlCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmcKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3RvcCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9jb3VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJCWlmIChvdXRfcmFuZ2UpCiYjNDM7CQkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CQlpZiAob3V0X2NvdW50KQomIzQzOwkJCSpvdXRfY291bnQgPSByZWdzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zZWI4OGNhZjQwOTY0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmgKQEAgLTAsMCAmIzQzOzEsNDk0IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuCiYjNDM7ICoKJiM0MzsgKiBUaGUgdmFsdWVzIGFuZCBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZSBhcmUgZnJvbSB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yCiYjNDM7ICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MzoKJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzLwomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXNtY2NjLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdGZpZWxkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVpbGRfYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NpemVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wYWdlLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYykJCQkJXAomIzQzOwlBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfU01DXzY0LAkJXAomIzQzOwkJCSAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCwJXAomIzQzOwkJCSAgIChmdW5jKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTgkJCQlTTUNfUk1JX0NBTEwoMHgwMTUwKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVAkJU01DX1JNSV9DQUxMKDB4MDE1MykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1OSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSCQkJU01DX1JNSV9DQUxMKDB4MDE1YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1ZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUlkJCQlTTUNfUk1JX0NBTEwoMHgwMTYxKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTYzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFCQkJU01DX1JNSV9DQUxMKDB4MDE2NCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRAkJCVNNQ19STUlfQ0FMTCgweDAxNjYpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTCQkJU01DX1JNSV9DQUxMKDB4MDE2OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTZiKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVAkJCVNNQ19STUlfQ0FMTCgweDAxNmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRlkJCVNNQ19STUlfQ0FMTCgweDAxNmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0gJU01DX1JNSV9DQUxMKDB4MDE3MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxNzQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxNzUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTc4KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDE3YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZCQkJU01DX1JNSV9DQUxMKDB4MDE3YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QCQkJU01DX1JNSV9DQUxMKDB4MDE3YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTdkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTdlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTdmKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUCQkJU01DX1JNSV9DQUxMKDB4MDE4NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURQkJU01DX1JNSV9DQUxMKDB4MDE4NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTg4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURQkJCVNNQ19STUlfQ0FMTCgweDAxODkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLCQkJU01DX1JNSV9DQUxMKDB4MDE4YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQCQkJU01DX1JNSV9DQUxMKDB4MDE4YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVAlTTUNfUk1JX0NBTEwoMHgwMWQwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFMJCVNNQ19STUlfQ0FMTCgweDAxZDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxZDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlQJCQlTTUNfUk1JX0NBTEwoMHgwMWQzKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEUJCVNNQ19STUlfQ0FMTCgweDAxZDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0FDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURQkJU01DX1JNSV9DQUxMKDB4MDFkOCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFCQlTTUNfUk1JX0NBTEwoMHgwMWRiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZCQlTTUNfUk1JX0NBTEwoMHgwMWRjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWRlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWUwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVAkJU01DX1JNSV9DQUxMKDB4MDFlMSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVQJCVNNQ19STUlfQ0FMTCgweDAxZTMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDFlYykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUUJCVNNQ19STUlfQ0FMTCgweDAxZjApCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUJCVNNQ19STUlfQ0FMTCgweDAxZjEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURQlTTUNfUk1JX0NBTEwoMHgwMWYyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFmMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWY0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWZiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAyMDApCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFCQkJU01DX1JNSV9DQUxMKDB4MDIwMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEUJCVNNQ19STUlfQ0FMTCgweDAyMDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRQkJU01DX1JNSV9DQUxMKDB4MDIwNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNCQkJU01DX1JNSV9DQUxMKDB4MDIwOSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMCQkJU01DX1JNSV9DQUxMKDB4MDIwYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMjBiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDIwYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjBkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPCQkJU01DX1JNSV9DQUxMKDB4MDIwZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjBmKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPCQlTTUNfUk1JX0NBTEwoMHgwMjEwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfSU5GTwkJCVNNQ19STUlfQ0FMTCgweDAyMTEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT04JMgomIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OCTAKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSAmZ3Q7Jmd0OyAxNikKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSAmYW1wOyAweEZGRkYpCiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSAmbHQ7Jmx0OyAxNikgfCAobWlub3IpKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTSwkJKDB4RkZVTCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTSwkJKDB4RkZVTCAmbHQ7Jmx0OyA4KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTSwkJKDB4M1VMICZsdDsmbHQ7IDgpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSwkoMHgxVUwgJmx0OyZsdDsgMTApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldCkJRklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfU1VDQ0VTUwkJCTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVAkJCTEKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTQkJCTIKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUMJCQkzCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUCQkJNAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURUQJCTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0UJCTYKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYCQk3CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1QJCTgKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9EUFQJCQk5CiYjNDM7I2RlZmluZSBSTUlfQlVTWQkJCTEwCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR0xPQkFMCQkxMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HCQkxMgomIzQzOyNkZWZpbmUgUk1JX0lOQ09NUExFVEUJCQkxMwomIzQzOyNkZWZpbmUgUk1JX0JMT0NLRUQJCQkxNAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dQVAkJCTE1CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRQkJMTYKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HCQkwCiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORQkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFCQkxCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NJWkVfTUFTSwkJM1VMCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0sJCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLCQlCSVQoMTYpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0sJCUdFTk1BU0soMTgsIDE3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSkJCUZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTAkJMgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSwlHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCShQQUdFX01BU0sgJmFtcDsgR0VOTUFTSyg1MSwgMCkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUdFTk1BU0soNjMsIDYyKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU0laRShhcikJCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcCiYjNDM7CQkJCQkJICAgKGFyKSkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChhcikJKEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcCiYjNDM7CQkJCQkJICAgKGFyKSkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKGFyKQkJKChhcikgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOwomIzQzO2VudW0gcm1pX3JpcGFzIHsKJiM0MzsJUk1JX0VNUFRZID0gMCwKJiM0MzsJUk1JX1JBTSA9IDEsCiYjNDM7CVJNSV9ERVNUUk9ZRUQgPSAyLAomIzQzOwlSTUlfREVWID0gMywKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVAkwCiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UCTEKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWgkJR0VOTUFTSyg3LCAwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFCQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQUwkJR0VOTUFTSygxOSwgMTQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFMJCUdFTk1BU0soMjUsIDIwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVUJCUJJVCgyNikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTCUdFTk1BU0soMzEsIDI3KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURQlCSVQoMzIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWgkJR0VOTUFTSyg0MCwgMzMpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQglCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQglCSVQoMSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQglCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2CUJJVCgzKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODQJQklUKDQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMglCSVQoNSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVIJR0VOTUFTSyg5LCA2KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTCQlHRU5NQVNLKDE2LCAxNCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREEJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0gJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVQkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUUwkJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSCUdFTk1BU0soNywgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCUJJVCg4KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSCUdFTk1BU0soMTQsIDEwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVMJR0VOTUFTSygzLCAwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkUJCUdFTk1BU0soNSwgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1QJQklUKDYpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVAkJR0VOTUFTSyg2MywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMCQkwCiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09ICQkxCiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0gJCTIKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfTk9ORQkJCTMKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRAkJCTAKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19OT05FCQkJMQomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkUJCQkyCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFCQkJMwomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0lOVEVSTUVESUFURQkJNAomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0IJMAomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCCTEKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNjRLQgkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFUKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVQomIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVCiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1UKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjQKJiM0MzsgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LgomIzQzOyAqLwomIzQzO3N0cnVjdCBybW1fY29uZmlnIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplOwomIzQzOwkJCXU2NCBybWlfZ3JhbnVsZV9zaXplOwomIzQzOwkJfTsKJiM0MzsJCXU4IHNpemVyW1NaXzRLXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkUJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBCQkJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZCQlHRU5NQVNLKDYsIDUpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZCQlHRU5NQVNLKDgsIDcpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2CQkJMAomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMgkJCTEKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODQJCQkyCiYjNDM7CiYjNDM7c3RydWN0IHJlYWxtX3BhcmFtcyB7CiYjNDM7CXVuaW9uIHsgLyogMHgwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCBmbGFnczA7CiYjNDM7CQkJdTY0IHMyc3o7CiYjNDM7CQkJdTY0IHN2ZV92bDsKJiM0MzsJCQl1NjQgbnVtX2JwczsKJiM0MzsJCQl1NjQgbnVtX3dwczsKJiM0MzsJCQl1NjQgcG11X251bV9jdHJzOwomIzQzOwkJCXU2NCBoYXNoX2FsZ287CiYjNDM7CQkJdTY0IG51bV9hdXhfcGxhbmVzOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4NDAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDQwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBycHZbNjRdOwomIzQzOwkJCXU2NCBhdHNfcGxhbmU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHg0MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4ODAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCBwYWRkaW5nMjsKJiM0MzsJCQl1NjQgcnR0X2Jhc2U7CiYjNDM7CQkJczY0IHJ0dF9sZXZlbF9zdGFydDsKJiM0MzsJCQl1NjQgcnR0X251bV9zdGFydDsKJiM0MzsJCQl1NjQgZmxhZ3MxOwomIzQzOwkJCXU2NCBtYXhfbnVtX3ZkZXZzOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmczWzB4NzAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweGYwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBwYWRkaW5nNFsweDgwXTsKJiM0MzsJCQl1NjQgYXV4X3J0dF9iYXNlWzNdOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmc1WzB4MTAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmUKJiM0MzsgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSUwkJOAomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1BBUkFNU19GTEFHX1JVTk5BQkxFCUJJVCgwKQomIzQzOwomIzQzO3N0cnVjdCByZWNfcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXU2NCBmbGFnczsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJdTY0IG1waWRyOwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgcGM7CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nM1sweGQwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JTwlCSVQoMCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUEJQklUKDEpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSQkJQklUKDIpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRQkJQklUKDMpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0UJQklUKDUpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFCUJJVCg2KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDAJCUJJVCg3KQomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTCQkJMzEKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX2VudGVyIHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTY0IGZsYWdzOwomIzQzOwkJdTggcGFkZGluZzBbMHgyMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzFbMHg2MDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19lbnRlcikgPT0gU1pfMkspOwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfU1lOQwkJCTB4MDAKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0lSUQkJCTB4MDEKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUQkJCTB4MDIKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1BTQ0kJCQkweDAzCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9SSVBBU19DSEFOR0UJCTB4MDQKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTAkJMHgwNQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SCQkJMHgwNgomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0UJCTB4MDcKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElORwkweDA4CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5ECQkweDBhCiYjNDM7CiYjNDM7c3RydWN0IHJlY19leGl0IHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTggZXhpdF9yZWFzb247CiYjNDM7CQl1OCBwYWRkaW5nMFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgxMDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGVzcjsKJiM0MzsJCQl1NjQgZmFyOwomIzQzOwkJCXU2NCBocGZhcjsKJiM0MzsJCQl1NjQgcnR0X3RyZWU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzJbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MzAwICovCiYjNDM7CQl1OCBwYWRkaW5nM1sweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGNudHBfY3RsOwomIzQzOwkJCXU2NCBjbnRwX2N2YWw7CiYjNDM7CQkJdTY0IGNudHZfY3RsOwomIzQzOwkJCXU2NCBjbnR2X2N2YWw7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzRbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NTAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCByaXBhc19iYXNlOwomIzQzOwkJCXU2NCByaXBhc190b3A7CiYjNDM7CQkJdTggcmlwYXNfdmFsdWU7CiYjNDM7CQkJdTggcGFkZGluZzVbMHhmXTsKJiM0MzsJCQl1NjQgczJhcF9iYXNlOwomIzQzOwkJCXU2NCBzMmFwX3RvcDsKJiM0MzsJCQl1NjQgdmRldl9pZF8xOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzI7CiYjNDM7CQkJdTY0IGRldl9tZW1fYmFzZTsKJiM0MzsJCQl1NjQgZGV2X21lbV90b3A7CiYjNDM7CQkJdTY0IGRldl9tZW1fcGE7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzZbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NjAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXUxNiBpbW07CiYjNDM7CQkJdTggcGFkZGluZzdbMHg2XTsKJiM0MzsJCQl1NjQgcGxhbmU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzhbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NzAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHBtdV9vdmZfc3RhdHVzOwomIzQzOwkJCXU4IHBhZGRpbmc5WzB4Zl07CiYjNDM7CQkJdTY0IHZzbW11OwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcxMFsweDEwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX3J1biB7CiYjNDM7CXN0cnVjdCByZWNfZW50ZXIgZW50ZXI7CiYjNDM7CXN0cnVjdCByZWNfZXhpdCBleGl0OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFCUdFTk1BU0soMSwgMCkKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUglHRU5NQVNLKDE4LCAxNikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQCQlHRU5NQVNLKDIyLCAxOSkKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7CiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovCiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEUJCQlCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFECQkJQklUKDEpCiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzc4NwoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDYzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBSZWxldmFuY2UgdG8gQU1ENjQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UmIzM5O3ZlIGdvdCBhIHBhdGNoLCBhbmQgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgc3BlY2lmaWVkIGFzIGBhbWQ2NGAuIE15IGluaXRpYWwgdGFzayBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdGNoIGlzIHJlbGV2YW50IHRvIEFNRDY0LCBvciBpZiBpdCBjYW4gYmUgY29uc2lkZXJlZCBhICYjMzQ7d29ydGgtZnV6emluZyYjMzQ7IGNhbmRpZGF0ZS4gTGV0JiMzOTtzIGRlbHZlIGludG8gdGhlIGNoYW5nZXMuCgpJJiMzOTttIHNlZWluZyBtb2RpZmljYXRpb25zIHByaW1hcmlseSBjb25jZW50cmF0ZWQgYXJvdW5kIEFSTTY0LXNwZWNpZmljIGNvZGUuIFNwZWNpZmljYWxseToKCjEuICBgYXJjaC9hcm02NC9LY29uZmlnYCBpcyBiZWluZyBtb2RpZmllZCwgc2VsZWN0aW5nIGBBUkNIX1NVUFBPUlRTX1JNTWAuCjIuICBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCBpcyBiZWluZyB0b3VjaGVkLiBUaGlzIGlzIGFkZGluZyBhbiBgQVJNNjRfRlRSX0JJVFNgIGVudHJ5LCB2ZXJ5IHNwZWNpZmljYWxseSByZWxhdGVkIHRvIEFSTTY0IGZlYXR1cmUgaWRlbnRpZmljYXRpb24uCjMuICBXZSBoYXZlIGNoYW5nZXMgaW4gYGRyaXZlcnMvZmlybXdhcmVgIHdpdGggYWRkaXRpb25zIG9mIGBhcm1fcm1tYCBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXM6IGBLY29uZmlnYCBhbmQgYE1ha2VmaWxlYC4gVGhpcyBhcHBlYXJzIHRvIGJlIGludGVncmF0aW5nIGEgbmV3IGNvbXBvbmVudCwgd2hpY2ggaW5jbHVkZXMgaXRzIG93biBLY29uZmlnIG9wdGlvbnMgYW5kIG1ha2VmaWxlIGVudHJpZXMsIGFuZCBzcGVjaWZpY2FsbHkgYSBmaWxlIGNhbGxlZCBgcm1pLmNgIHdoaWNoIGNvbnRhaW5zIHRoZSBjb3JlIG9mIHRoZSBBUk0gUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgaG9zdC1zaWRlIGRyaXZlci4KNC4gIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbmNsdWRlIGZpbGVzIGFkZGVkLCBgYXJtLXJtaS1jbWRzLmhgIGFuZCBgYXJtLXNtY2NjLXJtaS5oYCwgYWdhaW4sIHN1Z2dlc3RpbmcgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byBBUk0gYXJjaGl0ZWN0dXJlcy4KCkhvbGQgb24gYSBtb21lbnQsIHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gSSBuZWVkIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGlzIGJhY2sgdG8gdGhlICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsgY3JpdGVyaWEuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNob3VsZCBiZSBpZ25vcmVkIGlmIGFsbCBvZiB0aGUgbW9kaWZpY2F0aW9ucyBmYWxsIGludG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgoqICAgVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzICh0ZWFyZG93biBjYWxsYmFja3MsIGV0Yy4pCiogICBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgpBbmQgZ2l2ZW4gdGhhdCB3ZSBhcmUgdGFyZ2V0aW5nIGBhbWQ2NGAsIGl0JiMzOTtzIGNsZWFyIHdlIHNob3VsZCBiZSBmb2N1c2VkIG9uIHRoZSBzZWNvbmQgcG9pbnQuCgpMZXQmIzM5O3MgdmVyaWZ5IHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyAqbm90KiBlbmFibGVkIG9uIGFtZDY0LiBJdCBsb29rcyBsaWtlIGBBUk1fUk1NX1JNSWAgZGlyZWN0bHkgZGVwZW5kcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLCBhbmQgSSBjYW4gc2VlIHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgYnkgYGNvbmZpZyBBUk02NGAgd2l0aGluIGBhcmNoL2FybTY0L0tjb25maWdgLiBJdCBkb2VzbiYjMzk7dCBhcHBlYXIgdGhpcyB3aWxsIGJlIHNlbGVjdGVkIGJ5IHg4Ni9hbWQ2NC4gSSYjMzk7bGwgY29uZmlybSB3aXRoIGEgYGdyZXBwZXJgIGNoZWNrIHRvIGJlIGNlcnRhaW4gdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzICpub3QqIHNlbGVjdGVkIGJ5IHg4Ni4KCk15IGNvbmNsdXNpb24gYXQgdGhpcyBwb2ludCwgYmFycmluZyBhbnkgdW5mb3Jlc2VlbiBkZXBlbmRlbmNpZXMsIGlzIHRoYXQgdGhpcyBwYXRjaCBpcyBsaWtlbHkgKm5vdCogcmVsZXZhbnQgdG8gQU1ENjQgYW5kIGNhbiBwcm9iYWJseSBiZSBjb25zaWRlcmVkICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsuIEkganVzdCBuZWVkIHRvIHZlcmlmeSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgbm90IHByZXNlbnQgaW4gdGhlIHg4Ni9hbWQ2NCBidWlsZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtBUkNIX1NVUFBPUlRTX1JNTSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL2FybTY0L0tjb25maWc9Mj1jb25maWcgQVJNNjRcbi0tXG5hcmNoL2FybTY0L0tjb25maWctNDAtXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbmFyY2gvYXJtNjQvS2NvbmZpZzo0MTpcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuYXJjaC9hcm02NC9LY29uZmlnLTQyLVx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTEtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzoyOmNvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cdGJvb2xcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctNi1cdGJvb2wgXCYjMzQ7UmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFwmIzM0O1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc6NzpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTgtXHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTMyMwoJCQkJCQkJb3V0cHV0OiAxMjAKCQkJCQkJCXRob3VnaHRzOiA2MjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBUaGlzIFBhdGNoJiMzOTtzIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBmbGFnZ2VkIHNvbWUgZmlsZXMgcmVsYXRlZCB0byBgYXJtX3JtbWAsIGBBUk1fUk1NX1JNSWAsIGFuZCBjb2RlIHRvdWNoZWQgYnkgdGhpcyBwYXRjaCwgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJiMzOTt0IGltcGFjdCBteSBhcmVhIG9mIGV4cGVydGlzZS4gSSBpbW1lZGlhdGVseSBsb29rZWQgZm9yIGFueSBwb3RlbnRpYWwgY3Jvc3NvdmVyIG9uIHg4Ni9hbWQ2NC4KCkZpcnN0LCBJIGlkZW50aWZpZWQgdGhlIG1vZGlmaWVkIGZpbGVzOiBgYXJjaC9hcm02NC9LY29uZmlnYCwgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AsIGFuZCBzbyBvbi4gUmlnaHQgYXdheSwgdGhlc2UgZmlsZXMgbG9vayBBUk0tc3BlY2lmaWMuIEkgc2VlIGBybWkuY2AgaW5jbHVkZXMgYCZsdDthc20vbWVtb3J5LmgmZ3Q7YCBhbmQgYCZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0O2AsIGJvdGggb2Ygd2hpY2ggc2NyZWFtIEFSTS4gRnVydGhlcm1vcmUsIGBBUk1fUk1NX1JNSWAgcmVsaWVzIG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAsIHdoaWNoIGlzIHNwZWNpZmljYWxseSBzZWxlY3RlZCBvbmx5IHdoZW4gYnVpbGRpbmcgZm9yIGBBUk02NGAuIE9uIG15IHRhcmdldCBhcmNoaXRlY3R1cmUsIGFtZDY0L3g4Nl82NCwgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyAqbm90KiBlbmFibGVkLCBzbyBgQVJNX1JNTV9STUlgIGlzIHVucmVhY2hhYmxlLCBhbmQgYHJtaS5jYCBpcyBub3QgZXZlbiBjb21waWxlZC4gSSBhbHNvIG5vdGVkIHRoYXQgYWxsIG90aGVyIGZpbGVzIGFyZSBhbHNvIGVpdGhlciBpbiB0aGUgYGFyY2gvYXJtNjQvYCBkaXJlY3Rvcnkgb3IgaW52b2x2ZSBBUk0tc3BlY2lmaWMgZmlybXdhcmUgaGVhZGVycyBhbmQgZHJpdmVycy4KCkdpdmVuIHRoaXMsIGl0JiMzOTtzIHByZXR0eSBjbGVhcjogdGhpcyBwYXRjaCBpcyBzdHJpY3RseSBBUk02NC1zcGVjaWZpYy4gSXQmIzM5O3MgaW50cm9kdWNpbmcgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgc3VwcG9ydCwgYW5kIHRoZSBhc3NvY2lhdGVkIENQVSBmZWF0dXJlIGRlZmluaXRpb25zIGFyZSBhbGwgdGllZCB0byB0aGF0IGFyY2hpdGVjdHVyZS4gVGhlcmUmIzM5O3MgemVybyBjaGFuY2Ugb2YgdGhpcyBwYXRjaCBoYXZpbmcgYW55IGltcGFjdCBvbiB4ODYvYW1kNjQuCgpOb3csIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIHRyaWFnZSBjcml0ZXJpYS4gVGhlICYjMzQ7dW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzJiMzNDsgY3JpdGVyaW9uIGNvdmVycyB0aGlzIHBlcmZlY3RseTogdGhpcyBpcyBjb2RlIGV4Y2x1c2l2ZSB0byBhbiBhcmNoaXRlY3R1cmUgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gVGhpcyBtZWFucywgd2l0aG91dCBhIGRvdWJ0LCBJIG5lZWQgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIHdpdGg6CgoqICAgYFdvcnRoRnV6emluZzogZmFsc2VgCiogICBgRm9jdXNTeW1ib2xzOiBbXWAKKiAgIGBFbmFibGVDb25maWdzOiBbXWAKKiAgIGBSZWFzb25pbmdgOiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBzdXBwb3J0IGFuZCBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIGRlZmluaXRpb25zLCB3aGljaCBkZXBlbmQgb24gQVJDSFxfU1VQUE9SVFNcX1JNTSAoc2VsZWN0ZWQgb25seSBieSBBUk02NCkuIE5vbmUgb2YgdGhlIG1vZGlmaWVkIGNvZGUgaXMgY29tcGlsZWQgb3IgcmVhY2hhYmxlIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDsKCkVhc3kgZGVjaXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjI1Ljk2MzM1MDk4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3MTExMDE3MzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MjUuOTYzMzU3NjFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjE5MDI2NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5YWM0NzMyYzNkNGMwYThjNjA0MTFhMzI2OTQ4MDk2MDU0YWYyOTc4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMTQ6NTE6MjMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxcbiBcXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcXG4rXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDE3YjgzYTI1MThhOGYuLmRiMjZmNmIwZWFmNWUgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcXG4rXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc2Ftc3VuZy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS94aWxpbngvS2NvbmZpZ1xcXCJcXG4rc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xcXCJcXG4gXFxuIGVuZG1lbnVcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxuQEAgLTAsMCArMSwyNiBAQFxcbitcXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGJvb2xcXG4rXFxuK2NvbmZpZyBBUk1fUk1NX1JNSVxcbitcXHRib29sIFxcXCJSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGRlZmF1bHQgeVxcbitcXHRoZWxwXFxuK1xcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcXG4rXFx0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxcbitcXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXFxuK1xcbitcXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cXG4rXFx0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxcbitcXHQgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuXFxuK1xcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXFxuK1xcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXFxuK1xcbitcXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxcbitcXHQgIFJlYWxtIGd1ZXN0cy5cXG4rXFxuK1xcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XFxuK1xcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcXHQ9IHJtaS5vXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzQwNThlMzQxODhkM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcXG5AQCAtMCwwICsxLDgxOSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1ibG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9tZW1vcnkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcXHUwMDNlXFxuK1xcbitzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xcbitcXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXFxuKyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXFx0MlxcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKVxcbit7XFxuK1xcdGlmIChXQVJOX09OKGlkIFxcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcXG4rXFxuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcXG4rXFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4rXFx0XFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cylcXG4re1xcbitcXHRsb25nIHJldCA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcXG4rXFxuK1xcdHdoaWxlIChwaHlzIFxcdTAwM2MgdG9wKSB7XFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXHRcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvdXRfcGh5cylcXG4rXFx0XFx0Km91dF9waHlzID0gcGh5cztcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTtcXG4rXFxuK2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxcbitcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdGxvbmcgcmV0ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xcbitcXG4rXFx0d2hpbGUgKHBoeXMgXFx1MDAzYyB0b3ApIHtcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsIFxcdTAwMjZvdXRfdG9wKTtcXG4rXFx0XFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUylcXG4rXFx0XFx0XFx0cGh5cyA9IG91dF90b3A7XFxuK1xcdFxcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXFxuK1xcdFxcdFxcdGNwdV9yZWxheCgpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSlcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xcbitcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXR1cztcXG4rXFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGFybV9zbWNjY18xXzJfaW52b2tlKFxcdTAwMjZyZWdzLCByZWdzX291dCk7XFxuK1xcdFxcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVxcdTAwM2VhMCk7XFxuK1xcdFxcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXFx1MDAyNlxcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX2NhbmNlbCh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX0NBTkNFTCwgc3JvX2hhbmRsZVxcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShcXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfbWVtX2RvbmF0ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxcbitcXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcXG4rXFx0ICovXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzcm8tXFx1MDAzZWFkZHJfY291bnQgXFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXFxuK1xcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbitcXG4rXFx0aWYgKGNvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQpXFxuK1xcdFxcdHJldHVybiAtRU5PU1BDO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHVuaXRfc2l6ZV9ieXRlcyAqIGNvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdGludCByZXQ7XFxuK1xcdHZvaWQgKnZpcnQ7XFxuK1xcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgUk1NIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgY29udGlndW91cyBhbGxvY2F0aW9ucyBhcmUgYWx3YXlzIGFcXG4rXFx0ICogcG93ZXIgb2YgMlxcbitcXHQgKi9cXG4rXFx0aWYgKFdBUk5fT05fT05DRSghaXNfcG93ZXJfb2ZfMihzaXplKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzcm8tXFx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHtcXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50LS07XFxuK1xcdFxcdFxcdHN3YXAoc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSxcXG4rXFx0XFx0XFx0ICAgICBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXSk7XFxuK1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0dmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7XFxuK1xcdGlmICghdmlydClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XFxuK1xcbitcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XFxuK1xcbitcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFxcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcXG4rXFx0XFx0XFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxcbitcXHRcXHRcXHRcXHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGFkZHJfcmFuZ2UgPSBwaHlzIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcXG4rXFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XFxuK1xcbitvdXQ6XFxuK1xcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSwgMSxcXG4rXFx0XFx0XFx0ICAwLCBvdXRfcmVncyk7XFxuK1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xcbitcXHRcXHQvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi9cXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50Kys7XFxuK1xcdH0gZWxzZSBpZiAoZG9uYXRlZF9zaXplIFxcdTAwM2Mgc2l6ZSkge1xcbitcXHRcXHRwaHlzID0gc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFxuK1xcdFxcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cXG4rXFx0XFx0Zm9yIChsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXFx1MDAzYyBzaXplOyBpICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuK1xcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcXHUwMDI2XFx1MDAyNiBmb3VuZCBcXHUwMDNjIGNvdW50OyBpKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cXHUwMDNlYWRkcl9saXN0W2ldO1xcbitcXG4rXFx0XFx0aWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xcbitcXHRcXHRcXHRhZGRyX2xpc3Rfc3RhcnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFx0XFx0XFx0Zm91bmQrKztcXG4rXFx0XFx0XFx0aS0tO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3aGlsZSAoZm91bmQgXFx1MDAzYyBjb3VudCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdFxcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7XFxuK1xcdFxcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHRcXHRpZiAoIXZpcnQpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0XFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGRyX3JhbmdlID0gcGh5cyBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XFxuK1xcdFxcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgMSk7XFxuK1xcdFxcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xcbitcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50KytdID0gYWRkcl9yYW5nZTtcXG4rXFx0XFx0Zm91bmQrKztcXG4rXFx0fVxcbitcXG4rXFx0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0pLFxcbitcXHRcXHRcXHQgIGZvdW5kLCAwLCBvdXRfcmVncyk7XFxuK1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0cztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxcbitcXHQgKiBqdXN0IGluIGNhc2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcXG4rXFx0XFx0ZG9uYXRlZF9ncmFudWxlcyA9IGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXFxuK1xcdCAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIHVuaXQtc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XFxuK1xcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cXG4rXFx0ICovXFxuK1xcdGNvbnN1bWVkX3VuaXRzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl91bml0O1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxcbitcXHRcXHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxcbitcXHRcXHQgKi9cXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XFxuK1xcdFxcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGNvbnN1bWVkX3VuaXRzXTtcXG4rXFx0XFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XFxuK1xcdFxcdFxcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cXG4rXFx0XFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XFxuK1xcdFxcdCAgICAgaSArPSBQQUdFX1NJWkUpIHtcXG4rXFx0XFx0XFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxcbitcXHRcXHRcXHRcXHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyArIGkpKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXFxuK1xcdFxcdCAqIGZyZWVkKVxcbitcXHRcXHQgKi9cXG4rXFx0XFx0Y29uc3VtZWRfdW5pdHMrKztcXG4rXFx0fVxcbitcXG4rXFx0LyogS2VlcCBqdXN0IHRoZSB1bml0cyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXFxuK1xcdGZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgXFx1MDAzYyBmb3VuZDsgaSsrKVxcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfdW5pdHNdID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgaV07XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxcbitcXHRcXHRcXHQgIGdmcF90IGdmcClcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSkpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpKSB7XFxuK1xcdFxcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcmVncywgZ2ZwKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cmVncywgZ2ZwKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSxcXG4rXFx0XFx0XFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcXG4rXFxuK1xcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXFx1MDAzZWExIFxcdTAwM2UgY2FwYWNpdHkpKVxcbitcXHRcXHRvdXRfcmVncy1cXHUwMDNlYTEgPSBjYXBhY2l0eTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCArPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7XFxuK1xcbitcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHtcXG4rXFx0XFx0XFx0XFx0LyogTGVhayB0aGUgcGFnZXMgKi9cXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCA9IDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcXG4rXFxuK2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFxcdTAwMjZzcm8tXFx1MDAzZXJlZ3M7XFxuK1xcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpO1xcbitcXG4rXFx0c3JvX2hhbmRsZSA9IHJlZ3MtXFx1MDAzZWExO1xcbitcXG4rXFx0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xcbitcXHRcXHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cXHUwMDNlYTApO1xcbitcXHRcXHRpbnQgcmV0ID0gMDtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfRE9OQVRFOlxcbitcXHRcXHRcXHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXFx1MDAzZWEyLCByZWdzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIGdmcCk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XFxuK1xcdFxcdFxcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0cmV0ID0gV0FSTl9PTl9PTkNFKDEpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxcbitcXHRcXHRcXHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4ndCBiZSBhbiBpc3N1ZS5cXG4rXFx0XFx0XFx0ICogSG93ZXZlciwgaWYgd2UgZW5jb3VudGVyIGEgcmFuZG9tIGZhaWx1cmUgKGUuZy4sXFxuK1xcdFxcdFxcdCAqIGJ1Z2d5IFJNTSksIGRvbid0IGxvb3AgZm9yZXZlciwganVzdCBnaXZlIHVwLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHRcXHRjYW5jZWxsZWQgPSB0cnVlO1xcbitcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjYW5jZWxsZWQpXFxuK1xcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcXG4rXFxuKy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXFxuK2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xcbitcXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcXG4rXFxuK1xcdHNyb19oYW5kbGUgPSByZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKTtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0aWYgKCFjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK1xcbitcXHRcXHRcXHRjYW5jZWxsZWQgPSB0cnVlO1xcbitcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjYW5jZWxsZWQpXFxuK1xcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xcbitcXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XFxuK1xcbitcXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xcbitcXHRpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcXG4rXFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFxuK1xcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XFxuK1xcdHZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMSk7XFxuK1xcbitcXHRpZiAocmVzLmEwICE9IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdHVuc2lnbmVkIHNob3J0IGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yO1xcbitcXG4rXFx0XFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XFxuK1xcbitcXHRcXHRwcl9lcnIoXFxcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXFxcblxcXCIsXFxuK1xcdFxcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxcbitcXHRcXHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHRwcl9pbmZvKFxcXCJSTUkgQUJJIHZlcnNpb24gJWQuJWRcXFxcblxcXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTaW5jZSB3ZSd2ZSBuZWdvdGlhdGVkIGEgY29tcGF0aWJsZSB2ZXJzaW9uIHRoZXNlIGZlYXR1cmUgcmVnaXN0ZXJzXFxuK1xcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXFxuK1xcdCAqL1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplO1xcbitcXHRpbnQgcmV0ID0gMDtcXG4rXFx0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcXG4rXFxuK1xcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XFxuK1xcdGNhc2UgU1pfNEs6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xcbitcXHRcXHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfMTZLOlxcbitcXHRcXHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzE2S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfNjRLOlxcbitcXHRcXHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdEJVSUxEX0JVRygpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIShybWlfZmVhdF9yZWcoMSkgXFx1MDAyNiBncmFudWxlX2ZlYXR1cmUpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGRvZXMgbm90IHN1cHBvcnQgJWx1S0IgZ3JhbnVsZXNcXFxcblxcXCIsXFxuK1xcdFxcdCAgICAgICBQQUdFX1NJWkUgXFx1MDAzZVxcdTAwM2UgMTApO1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghY29uZmlnKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxcbitcXHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxcbitcXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcXG4rXFx0ICogUEFHRV9TSVpFU1xcbitcXHQgKi9cXG4rXFx0Y29uZmlnLVxcdTAwM2V0cmFja2luZ19yZWdpb25fc2l6ZSA9IDA7XFxuK1xcbitcXHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNvbmZpZyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LlxcbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxcbisgKi9cXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xcbitcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHN0YXJ0LCBlbmQsIFxcdTAwMjZjYXRlZ29yeSwgXFx1MDAyNnN0YXRlLCBcXHUwMDI2bmV4dCk7XFxuK1xcdFxcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0XFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XFxuK1xcdFxcdCAgICBjYXRlZ29yeSAhPSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTCkge1xcbitcXHRcXHRcXHQvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi9cXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJ3QgZmluZS9jb252ZW50aW9uYWw6ICVsbHgtJWx4XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgc3RhcnQsIG5leHQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjcmVhdGluZyBMMSBHUFRzIHlldC4gU28sIG1ha2Ugc3VyZSB0aGF0XFxuKyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuXFxuKyAqL1xcbitzdGF0aWMgaW50IHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xcbitcXHR1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTtcXG4rXFxuK1xcdGwwZ3B0X3N6ID0gMVVMIFxcdTAwM2NcXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXFxuK1xcdFxcdFxcdFxcdFxcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XFxuK1xcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xcbitcXHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcXG4rXFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHRsb25nIHJldCA9IHJtaV9ncHRfaW5mbyhzdGFydCwgZW5kLCBcXHUwMDI2bmV4dCwgXFx1MDAyNnBhcl9zdGF0ZSk7XFxuK1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdGlmIChwYXJfc3RhdGUgIT0gUk1JX0dQVF9QQVJfUExBVCkge1xcbitcXHRcXHRcXHRwcl9lcnIoXFxcIkdQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0c3RhcnQsIG5leHQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXFxuK3tcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcXG4rXFxuK1xcdGZvcl9lYWNoX21lbV9yZWdpb24ocikge1xcbitcXHRcXHRpbnQgcmV0O1xcbitcXG4rXFx0XFx0LyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovXFxuK1xcdFxcdGlmIChtZW1ibG9ja19pc19ub21hcChyKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFx0XFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfbm90aWZ5ICphcmcgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0aWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKVxcbitcXHRcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK1xcbitcXHRzdGFydCA9IFBGTl9QSFlTKGFyZy1cXHUwMDNlc3RhcnRfcGZuKTtcXG4rXFx0ZW5kID0gUEZOX1BIWVMoYXJnLVxcdTAwM2VzdGFydF9wZm4gKyBhcmctXFx1MDAzZW5yX3BhZ2VzKTtcXG4rXFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xcbitcXG4rXFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xcbitcXHQubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsXFxuK307XFxuK1xcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChpc19ybWlfYXZhaWxhYmxlKTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldCA9IDA7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gPSBOVUxMO1xcbitcXG4rXFx0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xcbitcXHRyZXQgPSBybWlfY2hlY2tfdmVyc2lvbigpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIEFjdGl2YXRlIHRoZSBSTU0gKi9cXG4rXFx0c3JvID0ga21hbGxvY19vYmooKnNybyk7XFxuK1xcdGlmICghc3JvKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSByZXQgXFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xcbitcXHRcXHRnb3RvIG91dF9mcmVlX3NybztcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihcXHUwMDI2cm1pX21lbW9yeV9uYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XFxuK1xcbitcXHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcXG4rXFx0cHJfaW5mbyhcXFwiUk1JIGNvbmZpZ3VyZWRcXFxcblxcXCIpO1xcbitcXHRrZnJlZShzcm8pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitvdXRfZGVhY3RpdmF0ZTpcXG4rXFx0cm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7XFxuK291dF9mcmVlX3NybzpcXG4rXFx0a2ZyZWUoc3JvKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXFxuKyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlXFxuKyAqIG1vZHVsZV9pbml0KCkgKHVzZWQgZm9yIEtWTSkgc28gdGhpcyBpcyBPSy5cXG4rICovXFxuK3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NDYyNTdkNzdkZDYxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcXG5AQCAtMCwwICsxLDY3OCBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC5cXG4rICovXFxuK1xcbisjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXFx0MjU2XFxuK1xcbitzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncztcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XFxuK307XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcXG4rXFxuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XFxuK2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApO1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuK1xcbisjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XFx0XFxcXFxcbitcXHRsb25nIF9fcmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoX19zcm8sIGdmcCk7XFx0XFx0XFxcXFxcbitcXHRybWlfc3JvX2ZyZWUoX19zcm8pO1xcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0X19yZXQ7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbit9KVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU1cXG4rICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcXG4rICpcXG4rICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0XFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxcbisgKlxcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTVxcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XFxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0aWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X2NhdGVnb3J5KVxcbitcXHRcXHRcXHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xcbitcXHRcXHRpZiAob3V0X3N0YXRlKVxcbitcXHRcXHRcXHQqb3V0X3N0YXRlID0gcmVzLmEyO1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZXMuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXMuYTA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi5cXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cXG4rICogQG91dF90b3A6IFRvcCBvZiB0aGUgcGh5aXNjYWwgYWRkcmVzcyByZWdpb24gZm9yIHdoaWNoXFxuKyAqXFx0XFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX0dQVF9JTkZPLCBiYXNlLCBlbmQsXFxuK1xcdH07XFxuK1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdGlmIChvdXRfdG9wKVxcbitcXHRcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcdFxcdGlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSlcXG4rXFx0XFx0XFx0Km91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXFxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxcbisgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcXHUwMDI2cmVzKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0KVxcbitcXHRcXHQqb3V0ID0gcmVzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlc1xcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXFxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxcbisgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZFxcbisgKlxcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcXG4rICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXFxuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxcbisgKlxcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXFxuKyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXFxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XFxuKyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IFJlYWxtXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcXG4rICpcXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICpcXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXFxuKyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGEgcmVhbG0sIGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgcmVhbG0gbXVzdCBiZSBkZXN0cm95ZWQgZmlyc3QuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlY19jcmVhdGUoKSAtIENyZWF0ZSBhIFJFQ1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xcbisgKiBAcGFyYW1zOiBQQSBvZiBSRUMgcGFyYW1ldGVyc1xcbisgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBSRUMgdXNpbmcgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3QgcmVjX3BhcmFtcyBwb2ludGVkXFxuKyAqIHRvIGJ5IEBwYXJhbXMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyByZWMsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBwYXJhbXMsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xcbitcXHR9fTtcXG4rXFx0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFx0cm1pX3Nyb19mcmVlKHNybyk7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xcbisgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxcbisgKlxcbisgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9jcmVhdGUoKSAtIENyZWF0ZXMgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXFxuKyAqXFxuKyAqIENyZWF0ZXMgYW4gUlRUIChSZWFsbSBUcmFuc2xhdGlvbiBUYWJsZSkgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlXFxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IHJlYWxtXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IFJUVCBsZXZlbFxcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XFxuKyAqIGF0IHdoaWNoIHRoZSBSVFQgd2FsayB0ZXJtaW5hdGVkLlxcbisgKlxcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxcbisgKiB0YWJsZSBhcmUgaW4gQVNTSUdORUQgb3IgVEFCTEUgc3RhdGUuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXFxuK1xcdFxcdFxcdFxcdCAgIGxvbmcgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdGlmIChvdXRfcnR0KVxcbitcXHRcXHRcXHQqb3V0X3J0dCA9IHJlZ3MuYTE7XFxuK1xcdFxcdGlmIChvdXRfdG9wKVxcbitcXHRcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2ZvbGQoKSAtIEZvbGQgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXFxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcXG4rICpcXG4rICogRm9sZHMgYW4gUlRULiBJZiBhbGwgZW50cmllcyB3aXRoIHRoZSBSVFQgYXJlICdob21vZ2VuZW91cycgdGhlIFJUVCBjYW4gYmVcXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0XFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxcbisgKlxcbisgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCwgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0lOSVRfUklQQVMsIHJkLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxcbisgKlxcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcXG4rICogcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKyNlbmRpZlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZWI4OGNhZjQwOTY0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxuQEAgLTAsMCArMSw0OTQgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICpcXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxcbisgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRmaWVsZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wYWdlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXFx0XFx0XFxcXFxcbitcXHRcXHRcXHQgICBBUk1fU01DQ0NfU01DXzY0LFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgKGZ1bmMpKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cXHRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTUwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTcpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTkpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YilcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWMpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjEpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjMpXFxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NClcXG4rI2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmUpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcXG4rI2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0hcXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc4KVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2IpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2YpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODUpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NilcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NylcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODgpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODkpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxOGEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThiKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDIpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjEpXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcXHRTTUNfUk1JX0NBTEwoMHgwMWYyKVxcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjMpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY1KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmIpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDApXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMilcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDgpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDkpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGMpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBkKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGUpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMClcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0KDB4RkZVTClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcXHRcXHQoMHhGRlVMIFxcdTAwM2NcXHUwMDNjIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdCgweDNVTCBcXHUwMDNjXFx1MDAzYyA4KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXFx0KDB4MVVMIFxcdTAwM2NcXHUwMDNjIDEwKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcXG4rXFxuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcXHRcXHRcXHQ0XFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcXHRcXHQ1XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVxcdFxcdDZcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFxcdFxcdDdcXG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcXHRcXHQ4XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFxcdFxcdFxcdDlcXG4rI2RlZmluZSBSTUlfQlVTWVxcdFxcdFxcdDEwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFxcdFxcdDExXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXFx0XFx0MTJcXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVxcdFxcdFxcdDEzXFxuKyNkZWZpbmUgUk1JX0JMT0NLRURcXHRcXHRcXHQxNFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcXHRcXHRcXHQxNVxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXFx0XFx0MTZcXG4rXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcXHRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXFx0XFx0M1VMXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXFx0XFx0R0VOTUFTSygxNSwgMilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXFx0XFx0QklUKDE2KVxcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1xcdFxcdEdFTk1BU0soMTgsIDE3KVxcbitcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NJWkUocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09OVElHX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9BRERSX1RZUEVfTElTVFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLXFx0R0VOTUFTSygxLCAwKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0tcXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1xcdChQQUdFX01BU0sgXFx1MDAyNiBHRU5NQVNLKDUxLCAwKSlcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXFx0R0VOTUFTSyg2MywgNjIpXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXFx0XFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKGFyKSkpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXFx0XFx0KChhcikgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbitcXG4rZW51bSBybWlfcmlwYXMge1xcbitcXHRSTUlfRU1QVFkgPSAwLFxcbitcXHRSTUlfUkFNID0gMSxcXG4rXFx0Uk1JX0RFU1RST1lFRCA9IDIsXFxuK1xcdFJNSV9ERVYgPSAzLFxcbit9O1xcbitcXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXFx0MFxcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlxcdFxcdEdFTk1BU0soNywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVxcdFxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXFx0XFx0R0VOTUFTSygxMywgMTApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXFx0XFx0R0VOTUFTSygxOSwgMTQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXFx0XFx0R0VOTUFTSygyNSwgMjApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcXHRcXHRCSVQoMjYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRHRU5NQVNLKDMxLCAyNylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0wwR1BUX0JMT0NLX0RFTEVHQVRFXFx0QklUKDMyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJPQVNaXFx0XFx0R0VOTUFTSyg0MCwgMzMpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCXFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFxcdEJJVCg0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXFx0QklUKDUpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlxcdEdFTk1BU0soOSwgNilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1pcXHRcXHRHRU5NQVNLKDEzLCAxMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1xcdFxcdEdFTk1BU0soMTYsIDE0KVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0hcXHRcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSygxNCwgMTApXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXFx0R0VOTUFTSygzLCAwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1BMQU5FXFx0XFx0R0VOTUFTSyg1LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1RcXHRCSVQoNilcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcXHRcXHRHRU5NQVNLKDYzLCAwKVxcbitcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcXHRcXHRcXHQzXFxuK1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcXHRcXHQ0XFxuK1xcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNEtCXFx0MFxcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlxcdDFcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfTk9UX0NSRUFURUQgICAyVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVVxcbitcXG4rLypcXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxcbisgKi9cXG4rc3RydWN0IHJtbV9jb25maWcge1xcbitcXHR1bmlvbiB7IC8qIDB4MCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XFxuK1xcdFxcdFxcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBzaXplcltTWl80S107XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xcbitcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcXHRcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVxcdFxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcXHRcXHRHRU5NQVNLKDYsIDUpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVxcdFxcdEdFTk1BU0soOCwgNylcXG4rXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1NlxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcXHRcXHRcXHQyXFxuK1xcbitzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMDtcXG4rXFx0XFx0XFx0dTY0IHMyc3o7XFxuK1xcdFxcdFxcdHU2NCBzdmVfdmw7XFxuK1xcdFxcdFxcdHU2NCBudW1fYnBzO1xcbitcXHRcXHRcXHR1NjQgbnVtX3dwcztcXG4rXFx0XFx0XFx0dTY0IHBtdV9udW1fY3RycztcXG4rXFx0XFx0XFx0dTY0IGhhc2hfYWxnbztcXG4rXFx0XFx0XFx0dTY0IG51bV9hdXhfcGxhbmVzO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDQwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcnB2WzY0XTtcXG4rXFx0XFx0XFx0dTY0IGF0c19wbGFuZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4ODAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBwYWRkaW5nMjtcXG4rXFx0XFx0XFx0dTY0IHJ0dF9iYXNlO1xcbitcXHRcXHRcXHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xcbitcXHRcXHRcXHR1NjQgcnR0X251bV9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMTtcXG4rXFx0XFx0XFx0dTY0IG1heF9udW1fdmRldnM7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4NzAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweGYwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1OCBwYWRkaW5nNFsweDgwXTtcXG4rXFx0XFx0XFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzVbMHgxMDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xcbitcXG4rLypcXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cXG4rICovXFxuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXFx0XFx0OFxcbitcXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcXHRCSVQoMClcXG4rXFxuK3N0cnVjdCByZWNfcGFyYW1zIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0dTY0IGZsYWdzO1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgxMDAgKi9cXG4rXFx0XFx0dTY0IG1waWRyO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IHBjO1xcbitcXHRcXHR1OCBwYWRkaW5nMlsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgzMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzNbMHhkMDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19wYXJhbXMpID09IFNaXzRLKTtcXG4rXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JT1xcdEJJVCgwKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcXHRCSVQoMSlcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVxcdFxcdEJJVCgyKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUklQQVNfUkVTUE9OU0VcXHRCSVQoNClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXFx0QklUKDUpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVxcdEJJVCg2KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0ZPUkNFX1AwXFx0XFx0QklUKDcpXFxuK1xcbisjZGVmaW5lIFJFQ19SVU5fR1BSU1xcdFxcdFxcdDMxXFxuK1xcbitzdHJ1Y3QgcmVjX2VudGVyIHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1NjQgZmxhZ3M7XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MjAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDIwMCAqL1xcbitcXHRcXHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDYwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XFxuK1xcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcXHRcXHRcXHQweDAwXFxuKyNkZWZpbmUgUk1JX0VYSVRfSVJRXFx0XFx0XFx0MHgwMVxcbisjZGVmaW5lIFJNSV9FWElUX0ZJUVxcdFxcdFxcdDB4MDJcXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXFx0XFx0XFx0MHgwM1xcbisjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVxcdFxcdDB4MDRcXG4rI2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcXHRcXHQweDA1XFxuKyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SXFx0XFx0XFx0MHgwNlxcbisjZGVmaW5lIFJNSV9FWElUX1MyQVBfQ0hBTkdFXFx0XFx0MHgwN1xcbisjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1xcdDB4MDhcXG4rI2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5EXFx0XFx0MHgwYVxcbitcXG4rc3RydWN0IHJlY19leGl0IHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1OCBleGl0X3JlYXNvbjtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBlc3I7XFxuK1xcdFxcdFxcdHU2NCBmYXI7XFxuK1xcdFxcdFxcdHU2NCBocGZhcjtcXG4rXFx0XFx0XFx0dTY0IHJ0dF90cmVlO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDQwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgY250cF9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnRwX2N2YWw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N0bDtcXG4rXFx0XFx0XFx0dTY0IGNudHZfY3ZhbDtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzRbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NTAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCByaXBhc19iYXNlO1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfdG9wO1xcbitcXHRcXHRcXHR1OCByaXBhc192YWx1ZTtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzVbMHhmXTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfdG9wO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8xO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8yO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9iYXNlO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV90b3A7XFxuK1xcdFxcdFxcdHU2NCBkZXZfbWVtX3BhO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nNlsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg2MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTE2IGltbTtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzdbMHg2XTtcXG4rXFx0XFx0XFx0dTY0IHBsYW5lO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nOFsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg3MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcG11X292Zl9zdGF0dXM7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc5WzB4Zl07XFxuK1xcdFxcdFxcdHU2NCB2c21tdTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzEwWzB4MTAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspO1xcbitcXG4rc3RydWN0IHJlY19ydW4ge1xcbitcXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xcbitcXHRzdHJ1Y3QgcmVjX2V4aXQgZXhpdDtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcnVuKSA9PSBTWl80Syk7XFxuK1xcbisvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVxcdEdFTk1BU0soMSwgMClcXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFxcdEdFTk1BU0soMTUsIDIpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcXHRHRU5NQVNLKDE4LCAxNilcXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUFxcdFxcdEdFTk1BU0soMjIsIDE5KVxcbitcXG4rLyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xcbisjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVxcdEdFTk1BU0soMSwgMClcXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbitcXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXFxuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXFx0XFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQURcXHRcXHRcXHRCSVQoMSlcXG4rXFxuKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MjcuNjg3MzU1MDUxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMjk4NzA3NzgyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWFjNDczMmMzZDRjMGE4YzYwNDExYTMyNjk0ODA5NjA1NGFmMjk3OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTQ6NTE6MjMgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcbisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZ1xuQEAgLTM4LDYgKzM4LDcgQEAgY29uZmlnIEFSTTY0XG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNQkFSUklFUl9TWU5DX0NPUkVcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxuIFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG4rXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbiBcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlRcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDE3YjgzYTI1MThhOGYuLmRiMjZmNmIwZWFmNWUgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksXG4rXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcIlxuK3NvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXCJcbiBcbiBlbmRtZW51XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbmluZGV4IGJlNDZmMWUxZGM3N2YuLjE5NmE2NTBjY2YwMjUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5AQCAtMzksMyArMzksNCBAQCBvYmoteVx0XHRcdFx0Kz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0Kz0gc21jY2MvXG4gb2JqLXlcdFx0XHRcdCs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQrPSB4aWxpbngvXG4rb2JqLXlcdFx0XHRcdCs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmRcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5AQCAtMCwwICsxLDI2IEBAXG4rXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXG4rXHRib29sXG4rXG4rY29uZmlnIEFSTV9STU1fUk1JXG4rXHRib29sIFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFwiXG4rXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG4rXHRkZWZhdWx0IHlcbitcdGhlbHBcbitcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcbitcdCAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGVcbitcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cbitcbitcdCAgVGhlIFJNTSBydW5zIGF0IEVMMiBpbiB0aGUgUmVhbG0gd29ybGQgYW5kIHByb3ZpZGVzIHRoZSBSZWFsbVxuK1x0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxuK1x0ICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhblxuK1x0ICBhbHNvIGFjdCBhcyBhIFRTTSwgYXMgZGVmaW5lZCBieSB0aGUgUENJZSBURElTUCBhbmQgY2FuIG1hbmFnZSB0aGVcbitcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXG4rXG4rXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXG4rXHQgIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmUgaXQsIG1hbmFnZSBkZWxlZ2F0ZWQgbWVtb3J5IGFuZCBlbmFibGVcbitcdCAgUmVhbG0gZ3Vlc3RzLlxuK1xuK1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbitcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXG4rXHQgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLlxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjY1MTcxOTg4ZmRjYWVcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxuQEAgLTAsMCArMSwyIEBAXG4rXG4rb2JqLSQoQ09ORklHX0FSTV9STU1fUk1JKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM0MDU4ZTM0MTg4ZDNcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xuQEAgLTAsMCArMSw4MTkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFx1MDAzZVxuK1xuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbit7XG4rXHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuK1x0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuK3tcbitcdGxvbmcgcmV0ID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XG4rXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4rXG4rXHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGlmIChvdXRfcGh5cylcbitcdFx0Km91dF9waHlzID0gcGh5cztcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4re1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbitcbitcdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbixcbitcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4rXHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbitcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjcHVfcmVsYXgoKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuK31cbitcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVGhlIG91dHB1dCBkb25hdGVkIGNvdW50IChhMSkgaXMgYWx3YXlzIHZhbGlkLCBpcnJlc3BlY3RpdmVcbitcdCAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvclxuK1x0ICovXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCxcbitcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2RlbGVnYXRlZF9wYWdlKTtcbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbitcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4rXG4rXHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4rXHRcdHJldHVybiAtRU5PU1BDO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0IGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRpbnQgcmV0O1xuK1x0dm9pZCAqdmlydDtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHQvKlxuK1x0ICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhXG4rXHQgKiBwb3dlciBvZiAyXG4rXHQgKi9cbitcdGlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHtcbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuK1x0XHRcdHN3YXAoc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0sXG4rXHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbitcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbitcdGlmICghdmlydClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuK1xuK1x0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuK1xuK1x0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuK1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbitcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XG4rXHRcdFx0cmV0dXJuIC1FTlhJTztcbitcdFx0fVxuK1x0fVxuK1xuK1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XG4rXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgY291bnQpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdID0gYWRkcl9yYW5nZTtcbitcbitvdXQ6XG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbitcdFx0XHQgIDAsIG91dF9yZWdzKTtcbitcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuK1x0XHQvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi9cbitcdFx0c3JvLVx1MDAzZWFkZHJfY291bnQrKztcbitcdH0gZWxzZSBpZiAoZG9uYXRlZF9zaXplIFx1MDAzYyBzaXplKSB7XG4rXHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1xuK1x0XHQvKiBOb3QgYWxsIGdyYW51bGVzIHVzZWQgYnkgdGhlIFJNTSwgZnJlZSB0aGUgcmVtYWluaW5nIHBhZ2VzICovXG4rXHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICs9IFBBR0VfU0laRSkge1xuK1x0XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcbitcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4rXHRcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MsXG4rXHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXG4rXHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xuK1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuK1x0XHRcdHN3YXAoc3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxuK1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4rXHRcdFx0Zm91bmQrKztcbitcdFx0XHRpLS07XG4rXHRcdH1cbitcdH1cbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0d2hpbGUgKGZvdW5kIFx1MDAzYyBjb3VudCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7XG4rXHRcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRcdGlmICghdmlydClcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcbitcdFx0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbitcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuK1x0XHRcdFx0cmV0dXJuIC1FTlhJTztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIDEpO1xuK1x0XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xuK1xuK1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50KytdID0gYWRkcl9yYW5nZTtcbitcdFx0Zm91bmQrKztcbitcdH1cbitcbitcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4rXHRcdFx0ICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdKSxcbitcdFx0XHQgIGZvdW5kLCAwLCBvdXRfcmVncyk7XG4rXG4rXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuK1x0ICoganVzdCBpbiBjYXNlLlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQpKVxuK1x0XHRkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDtcbitcbitcdC8qXG4rXHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXG4rXHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuK1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIHVuaXRzLlxuK1x0ICovXG4rXHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbitcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIHtcbitcdFx0LypcbitcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4rXHRcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XG4rXHRcdCAqL1xuK1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGNvbnN1bWVkX3VuaXRzXTtcbitcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XG4rXHRcdFx0KGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdC8qIEZyZWUgdGhlIHRhaWwgYmFjayAqL1xuK1x0XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcdTAwM2MgdW5pdF9zaXplX2J5dGVzO1xuK1x0XHQgICAgIGkgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuK1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICsgaSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgKyBpKSk7XG4rXHRcdH1cbitcbitcdFx0LypcbitcdFx0ICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4rXHRcdCAqIGZyZWVkKVxuK1x0XHQgKi9cbitcdFx0Y29uc3VtZWRfdW5pdHMrKztcbitcdH1cbitcbitcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJ3QgdXNlIGluIGFkZHJfbGlzdCAqL1xuK1x0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBjb25zdW1lZF91bml0czsgaSBcdTAwM2MgZm91bmQ7IGkrKylcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdCAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4rXHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuK1x0XHRcdCAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcbitcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbitcdFx0XHRcdFx0ICAgICByZWdzLCBnZnApO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbitcdFx0XHRcdFx0XHRyZWdzLCBnZnApO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGNhcGFjaXR5O1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4rXHRpZiAocmV0KVxuK1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbitcbitcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuK1x0XHRcdCAgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksXG4rXHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbitcbitcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXHUwMDNlYTEgXHUwMDNlIGNhcGFjaXR5KSlcbitcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVx1MDAzZWExO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50O1xuK1xuK1x0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbitcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xuK1x0XHRcdFx0LyogTGVhayB0aGUgcGFnZXMgKi9cbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0XHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7XG4rXHR9XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7XG4rXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuK1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4rXG4rXHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbitcbitcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuK1x0XHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cdTAwM2VhMCk7XG4rXHRcdGludCByZXQgPSAwO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcbitcdFx0XHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXHUwMDNlYTIsIHJlZ3MsXG4rXHRcdFx0XHRcdCAgICAgZ2ZwKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuK1x0XHRcdCAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbid0IGJlIGFuIGlzc3VlLlxuK1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuK1x0XHRcdCAqIGJ1Z2d5IFJNTSksIGRvbid0IGxvb3AgZm9yZXZlciwganVzdCBnaXZlIHVwLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoIWNhbl9jYW5jZWwpKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG4rXG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAoY2FuY2VsbGVkKVxuK1x0XHRyZXR1cm4gLUVDQU5DRUxFRDtcbitcbitcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XG4rXG4rLyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi9cbitsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbitcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpO1xuK1xuK1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXG4rXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbitcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4rXHRcdFx0XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbitcbitcdFx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChjYW5jZWxsZWQpXG4rXHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4rXG4rc3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4rXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfVkVSU0lPTiwgaG9zdF92ZXJzaW9uLCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4rXHR2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpO1xuK1xuK1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuK1x0XHR1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjtcbitcbitcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuK1x0XHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XG4rXG4rXHRcdHByX2VycihcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXG5cIixcbitcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcbitcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRwcl9pbmZvKFwiUk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbit7XG4rXHQvKlxuK1x0ICogU2luY2Ugd2UndmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuK1x0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcbitcdCAqL1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XG4rXHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcbitcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplO1xuK1x0aW50IHJldCA9IDA7XG4rXHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xuK1xuK1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbitcdGNhc2UgU1pfNEs6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xuK1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFNaXzE2SzpcbitcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuK1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl82NEs6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCO1xuK1x0XHRicmVhaztcbitcdGRlZmF1bHQ6XG4rXHRcdEJVSUxEX0JVRygpO1xuK1x0fVxuK1xuK1x0aWYgKCEocm1pX2ZlYXRfcmVnKDEpIFx1MDAyNiBncmFudWxlX2ZlYXR1cmUpKSB7XG4rXHRcdHByX2VycihcIlJNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXFxuXCIsXG4rXHRcdCAgICAgICBQQUdFX1NJWkUgXHUwMDNlXHUwMDNlIDEwKTtcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcdH1cbitcbitcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbitcdGlmICghY29uZmlnKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gZ3JhbnVsZV9zaXplO1xuK1xuK1x0LypcbitcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxuK1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbitcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuK1x0ICogUEFHRV9TSVpFU1xuK1x0ICovXG4rXHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuK1xuK1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCIpO1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNvbmZpZyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LlxuKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuXG4rICovXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcmV0LCBjYXRlZ29yeSwgc3RhdGUsIG5leHQ7XG4rXG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuK1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0XHRpZiAoc3RhdGUgIT0gUk1JX1RSQUNLSU5HX0ZJTkUgfHxcbitcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4rXHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4rXHRcdFx0cHJfZXJyKFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwiLFxuK1x0XHRcdCAgICAgICBzdGFydCwgbmV4dCk7XG4rXHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4rXHRcdH1cbitcdFx0c3RhcnQgPSBuZXh0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuKyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuXG4rICovXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbitcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuK1xuK1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4rXHRcdFx0XHRcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XG4rXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbitcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbitcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0aWYgKHBhcl9zdGF0ZSAhPSBSTUlfR1BUX1BBUl9QTEFUKSB7XG4rXHRcdFx0cHJfZXJyKFwiR1BUIGZvciB0aGUgcmVnaW9uIGlzIG5vdCBtYW5hZ2VkIGJ5IGZpcm13YXJlICVsbHgtJWx4XFxuXCIsXG4rXHRcdFx0XHRzdGFydCwgbmV4dCk7XG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRcdH1cbitcdFx0c3RhcnQgPSBuZXh0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXG4re1xuK1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbitcdHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7XG4rXG4rXHRmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHtcbitcdFx0aW50IHJldDtcbitcbitcdFx0LyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovXG4rXHRcdGlmIChtZW1ibG9ja19pc19ub21hcChyKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSlcbit7XG4rXHRzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTtcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0aWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKVxuK1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4rXG4rXHRzdGFydCA9IFBGTl9QSFlTKGFyZy1cdTAwM2VzdGFydF9wZm4pO1xuK1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiArIGFyZy1cdTAwM2Vucl9wYWdlcyk7XG4rXHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XG4rXG4rXHRyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJtaV9tZW1vcnlfbmIgPSB7XG4rXHQubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsXG4rfTtcbitcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcbit7XG4rXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4rXG4rc3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbit7XG4rXHRpbnQgcmV0ID0gMDtcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gPSBOVUxMO1xuK1xuK1x0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuK1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBBY3RpdmF0ZSB0aGUgUk1NICovXG4rXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvKTtcbitcdGlmICghc3JvKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcblwiKTtcbitcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuK1x0XHRnb3RvIG91dF9mcmVlX3NybztcbitcdH1cbitcbitcdHJldCA9IHJtaV9pbml0X21ldGFkYXRhKCk7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFx1MDAyNnJtaV9tZW1vcnlfbmIpO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbitcbitcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xuK1x0cHJfaW5mbyhcIlJNSSBjb25maWd1cmVkXFxuXCIpO1xuK1x0a2ZyZWUoc3JvKTtcbitcbitcdHJldHVybiAwO1xuK1xuK291dF9kZWFjdGl2YXRlOlxuK1x0cm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7XG4rb3V0X2ZyZWVfc3JvOlxuK1x0a2ZyZWUoc3JvKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjc0NjI1N2Q3N2RkNjFcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgKzEsNjc4IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rI2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4rXG4rc3RydWN0IHJtaV9zcm9fc3RhdGUge1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuK1x0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xuK1x0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xuK307XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuK2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpO1xuK2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4re1xuK1x0cmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4re1xuK1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4rfVxuK1xuK2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbitcbitsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XG4rdm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XG4rXG4rI2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7XHRcdFx0XHRcXFxuK1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XHRcdFx0XHRcXFxuK1x0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XHRcXFxuK1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuK1x0cm1pX3Nyb19mcmVlKF9fc3JvKTtcdFx0XHRcdFx0XHRcXFxuK1x0X19yZXQ7XHRcdFx0XHRcdFx0XHRcdFxcXG4rfSlcbitcbisvKipcbisgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4rICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcbisgKlxuKyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ybW1fZGVhY3RpdmF0ZSgpIC0gRGVhY3RpdmF0ZSB0aGUgUk1NIGFuZCByZWNsYWltIGFueSBtZW1vcnkgZG9uYXRlZCBhdFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxuKyAqXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpO1xuK31cbitcbisvKipcbisgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvblxuKyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbisgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnlcbisgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGVcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXHUwMDI2cmVzKTtcbitcbitcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF9jYXRlZ29yeSlcbitcdFx0XHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xuK1x0XHRpZiAob3V0X3N0YXRlKVxuK1x0XHRcdCpvdXRfc3RhdGUgPSByZXMuYTI7XG4rXHRcdGlmIChvdXRfdG9wKVxuK1x0XHRcdCpvdXRfdG9wID0gcmVzLmEzO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLypcbisgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaFxuKyAqXHRcdHRoZSBHUFQgQG91dF9ncHRfcGFyX3N0YXRlIGlzIHZhbGlkXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ncHRfaW5mbyh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSlcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1BUX0lORk8sIGJhc2UsIGVuZCxcbitcdH07XG4rXG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0XHRpZiAob3V0X2dwdF9wYXJfc3RhdGUpXG4rXHRcdFx0Km91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjtcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXG4rICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XG4rICogQG91dDogRmVhdHVyZSByZWdpc3RlciB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlclxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0KVxuK1x0XHQqb3V0ID0gcmVzLmExO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzXG4rICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxuKyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkXG4rICpcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcbisgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4rICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbisgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcbisgKlxuKyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmXG4rICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXG4rICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxuKyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZVxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXG4rICpcbisgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgdW5zaWduZWQgbG9uZyBzcmMsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGZsYWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHdpdGggdW5rbm93biBjb250ZW50c1xuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XG4rICogQHJkOiBQQSBvZiB0aGUgUkQgZm9yIHRoZSB0YXJnZXQgUmVhbG1cbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBjb252ZW50aW9uIG1lbW9yeSB3aXRoIGEgdGFyZ2V0IFByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuK1x0XHRpZiAob3V0X3RvcClcbitcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRcdGlmIChvdXRfcmFuZ2UpXG4rXHRcdFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XG4rXHRcdGlmIChvdXRfY291bnQpXG4rXHRcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4rXHR9XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcbisgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuKyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0XG4rICpcbisgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXG4rICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCBcdTAwMjZyZXMpO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXG4rXHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4rXHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcbisgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxuKyAqIHRvIGJ5IEBwYXJhbXMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19jcmVhdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuK1x0XHRcdFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdGxvbmcgcmV0O1xuK1xuK1x0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zXG4rXHR9fTtcbitcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4rXHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfZGVzdHJveSgpIC0gRGVzdHJveSBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbisgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuKyAqXG4rICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgIGxvbmcgbGV2ZWwsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4rXHRcdGlmIChvdXRfcnR0KVxuK1x0XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbisgKlxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9mb2xkKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgaXBhLFxuK1x0XHRcdFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4rICpcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9zZXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgYW4gcnVubmluZyByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4rICpcbisgKiBDb21wbGV0ZXMgYSByZXF1ZXN0IG1hZGUgYnkgdGhlIHJlYWxtIHRvIGNoYW5nZSB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBXG4rICogcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF91bnByb3RfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB3aXRoaW4gYW4gdW5wcm90ZWN0ZWQgSVBBIHJhbmdlXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0XHRpZiAob3V0X3JhbmdlKVxuK1x0XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuK1x0XHRpZiAob3V0X2NvdW50KVxuK1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlYjg4Y2FmNDA5NjRcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICsxLDQ5NCBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuKyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDM6XG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0My9cbisgKi9cbitcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuK1x0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbitcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuK1x0XHRcdCAgIChmdW5jKSlcbitcbisjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbitcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWEpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbisjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4rI2RlZmluZSBTTUNfUk1JX1BTQ0lfQ09NUExFVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY0KVxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfU0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZSlcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTg2KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4OSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0VWRU5UX0hBTkRMRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkOClcbitcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcdFx0U01DX1JNSV9DQUxMKDB4MDFkYylcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGQpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGYpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbitcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMylcbitcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfRVZFTlRfQ09OU1VNRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVx0U01DX1JNSV9DQUxMKDB4MDFmMilcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjMpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZjkpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZmIpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmYpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDEpXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDIpXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9ESVNDT05ORUNUXHRcdFNNQ19STUlfQ0FMTCgweDAyMDUpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fRE9OQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOClcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGIpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwZClcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGUpXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fSU5GT1x0XHRTTUNfUk1JX0NBTEwoMHgwMjEwKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfSU5GT1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMTEpXG4rXG4rI2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT05cdDJcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlx0MFxuK1xuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAzZVx1MDAzZSAxNilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwMjYgMHhGRkZGKVxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4rXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXHRcdCgweEZGVUwpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0KDB4RkZVTCBcdTAwM2NcdTAwM2MgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0KDB4M1VMIFx1MDAzY1x1MDAzYyA4KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0tcdCgweDFVTCBcdTAwM2NcdTAwM2MgMTApXG4rXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSywgcmV0KVxuK1xuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcdFx0XHQwXG4rI2RlZmluZSBSTUlfRVJST1JfSU5QVVRcdFx0XHQxXG4rI2RlZmluZSBSTUlfRVJST1JfUkVBTE1cdFx0XHQyXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXHRcdFx0M1xuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVFx0XHRcdDRcbisjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXHRcdDVcbisjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcdFx0NlxuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcdFx0N1xuKyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXHRcdDhcbisjZGVmaW5lIFJNSV9FUlJPUl9EUFRcdFx0XHQ5XG4rI2RlZmluZSBSTUlfQlVTWVx0XHRcdDEwXG4rI2RlZmluZSBSTUlfRVJST1JfR0xPQkFMXHRcdDExXG4rI2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkdcdFx0MTJcbisjZGVmaW5lIFJNSV9JTkNPTVBMRVRFXHRcdFx0MTNcbisjZGVmaW5lIFJNSV9CTE9DS0VEXHRcdFx0MTRcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcdFx0XHQxNVxuKyNkZWZpbmUgUk1JX0VSUk9SX0dSQU5VTEVcdFx0MTZcbitcbisjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXHRcdDBcbisjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXHRcdDFcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXHRcdDFcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cdFx0MlxuK1xuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFX01BU0tcdFx0M1VMXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0tcdFx0R0VOTUFTSygxNSwgMilcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0tcdFx0QklUKDE2KVxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXHRcdEdFTk1BU0soMTgsIDE3KVxuK1xuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXHRcdDBcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFx0XHQyXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXHRHRU5NQVNLKDYzLCA2MilcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXHRcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcXG4rXHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKGFyKVx0XHQoKGFyKSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcXG4rXHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4rXG4rZW51bSBybWlfcmlwYXMge1xuK1x0Uk1JX0VNUFRZID0gMCxcbitcdFJNSV9SQU0gPSAxLFxuK1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4rXHRSTUlfREVWID0gMyxcbit9O1xuK1xuKyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFx0MFxuKyNkZWZpbmUgUk1JX01FQVNVUkVfQ09OVEVOVFx0MVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdEdFTk1BU0soNywgMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMlx0XHRCSVQoOClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXHRcdEJJVCg5KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkxcdFx0R0VOTUFTSygxMywgMTApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFNcdFx0R0VOTUFTSygxOSwgMTQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcdFx0R0VOTUFTSygyNSwgMjApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRCSVQoMjYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVV9OVU1fQ1RSU1x0R0VOTUFTSygzMSwgMjcpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0wwR1BUX0JMT0NLX0RFTEVHQVRFXHRCSVQoMzIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRHRU5NQVNLKDQwLCAzMylcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCXHRCSVQoMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdEJJVCgzKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcdEJJVCg1KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0R0VOTUFTSyg5LCA2KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFNcdFx0R0VOTUFTSygxNiwgMTQpXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0hcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXHRcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDcsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDE0LCAxMClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXHRHRU5NQVNLKDMsIDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXHRCSVQoNilcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXHRcdEdFTk1BU0soNjMsIDApXG4rXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFx0XHQwXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXHRcdDFcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFx0XHQyXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcdFx0XHQzXG4rXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVx0XHRcdDFcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19GSU5FXHRcdFx0MlxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcdFx0NFxuK1xuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlx0MVxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXHQyXG4rXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVVxuKyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcbitcbisvKlxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxuKyAqL1xuK3N0cnVjdCBybW1fY29uZmlnIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuK1x0XHRcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xuK1x0XHR9O1xuK1x0XHR1OCBzaXplcltTWl80S107XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRVx0XHRCSVQoMSlcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVVx0XHRCSVQoMilcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBXHRcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXHRcdEdFTk1BU0soNiwgNSlcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcdFx0R0VOTUFTSyg4LCA3KVxuK1xuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1Nlx0XHRcdDBcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTJcdFx0XHQxXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XHRcdFx0MlxuK1xuK3N0cnVjdCByZWFsbV9wYXJhbXMge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgZmxhZ3MwO1xuK1x0XHRcdHU2NCBzMnN6O1xuK1x0XHRcdHU2NCBzdmVfdmw7XG4rXHRcdFx0dTY0IG51bV9icHM7XG4rXHRcdFx0dTY0IG51bV93cHM7XG4rXHRcdFx0dTY0IHBtdV9udW1fY3RycztcbitcdFx0XHR1NjQgaGFzaF9hbGdvO1xuK1x0XHRcdHU2NCBudW1fYXV4X3BsYW5lcztcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzBbMHg0MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg0MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBycHZbNjRdO1xuK1x0XHRcdHU2NCBhdHNfcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcxWzB4NDAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4ODAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHBhZGRpbmcyO1xuK1x0XHRcdHU2NCBydHRfYmFzZTtcbitcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuK1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuK1x0XHRcdHU2NCBmbGFnczE7XG4rXHRcdFx0dTY0IG1heF9udW1fdmRldnM7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmczWzB4NzAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4ZjAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcGFkZGluZzRbMHg4MF07XG4rXHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbitcbisvKlxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cbisgKi9cbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4rXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVCgwKVxuK1xuK3N0cnVjdCByZWNfcGFyYW1zIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgxMDAgKi9cbitcdFx0dTY0IG1waWRyO1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgcGM7XG4rXHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MzAwICovXG4rXHRcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XG4rXHRcdHU4IHBhZGRpbmczWzB4ZDAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuK1xuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JT1x0QklUKDApXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJXHRcdEJJVCgyKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRkVcdFx0QklUKDMpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXHRCSVQoNSlcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcdEJJVCg2KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4rXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcdFx0XHQzMVxuK1xuK3N0cnVjdCByZWNfZW50ZXIge1xuK1x0dW5pb24geyAvKiAweDAwMCAqL1xuK1x0XHR1NjQgZmxhZ3M7XG4rXHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MjAwICovXG4rXHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4rXHRcdHU4IHBhZGRpbmcxWzB4NjAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4rXG4rI2RlZmluZSBSTUlfRVhJVF9TWU5DXHRcdFx0MHgwMFxuKyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuKyNkZWZpbmUgUk1JX0VYSVRfRklRXHRcdFx0MHgwMlxuKyNkZWZpbmUgUk1JX0VYSVRfUFNDSVx0XHRcdDB4MDNcbisjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4rI2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcdFx0MHgwNVxuKyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SXHRcdFx0MHgwNlxuKyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXHQweDA4XG4rI2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5EXHRcdDB4MGFcbitcbitzdHJ1Y3QgcmVjX2V4aXQge1xuK1x0dW5pb24geyAvKiAweDAwMCAqL1xuK1x0XHR1OCBleGl0X3JlYXNvbjtcbitcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgxMDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgZXNyO1xuK1x0XHRcdHU2NCBmYXI7XG4rXHRcdFx0dTY0IGhwZmFyO1xuK1x0XHRcdHU2NCBydHRfdHJlZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgzMDAgKi9cbitcdFx0dTggcGFkZGluZzNbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg0MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgY250cF9jdGw7XG4rXHRcdFx0dTY0IGNudHBfY3ZhbDtcbitcdFx0XHR1NjQgY250dl9jdGw7XG4rXHRcdFx0dTY0IGNudHZfY3ZhbDtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzRbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg1MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgcmlwYXNfYmFzZTtcbitcdFx0XHR1NjQgcmlwYXNfdG9wO1xuK1x0XHRcdHU4IHJpcGFzX3ZhbHVlO1xuK1x0XHRcdHU4IHBhZGRpbmc1WzB4Zl07XG4rXHRcdFx0dTY0IHMyYXBfYmFzZTtcbitcdFx0XHR1NjQgczJhcF90b3A7XG4rXHRcdFx0dTY0IHZkZXZfaWRfMTtcbitcdFx0XHR1NjQgdmRldl9pZF8yO1xuK1x0XHRcdHU2NCBkZXZfbWVtX2Jhc2U7XG4rXHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuK1x0XHRcdHU2NCBkZXZfbWVtX3BhO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDYwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHUxNiBpbW07XG4rXHRcdFx0dTggcGFkZGluZzdbMHg2XTtcbitcdFx0XHR1NjQgcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc4WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NzAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4rXHRcdFx0dTggcGFkZGluZzlbMHhmXTtcbitcdFx0XHR1NjQgdnNtbXU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcxMFsweDEwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19leGl0KSA9PSBTWl8ySyk7XG4rXG4rc3RydWN0IHJlY19ydW4ge1xuK1x0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcbitcdHN0cnVjdCByZWNfZXhpdCBleGl0O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTtcbitcbisvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXHRHRU5NQVNLKDE4LCAxNilcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQXHRcdEdFTk1BU0soMjIsIDE5KVxuK1xuKy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbisjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuK1xuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXHRcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfUkVBRFx0XHRcdEJJVCgxKVxuK1xuKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjI3LjY4NzM1NzE5MVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwODcxMzk1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgUmVsZXZhbmNlIHRvIEFNRDY0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSd2ZSBnb3QgYSBwYXRjaCwgYW5kIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIHNwZWNpZmllZCBhcyBgYW1kNjRgLiBNeSBpbml0aWFsIHRhc2sgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCBpcyByZWxldmFudCB0byBBTUQ2NCwgb3IgaWYgaXQgY2FuIGJlIGNvbnNpZGVyZWQgYSBcIndvcnRoLWZ1enppbmdcIiBjYW5kaWRhdGUuIExldCdzIGRlbHZlIGludG8gdGhlIGNoYW5nZXMuXG5cbkknbSBzZWVpbmcgbW9kaWZpY2F0aW9ucyBwcmltYXJpbHkgY29uY2VudHJhdGVkIGFyb3VuZCBBUk02NC1zcGVjaWZpYyBjb2RlLiBTcGVjaWZpY2FsbHk6XG5cbjEuICBgYXJjaC9hcm02NC9LY29uZmlnYCBpcyBiZWluZyBtb2RpZmllZCwgc2VsZWN0aW5nIGBBUkNIX1NVUFBPUlRTX1JNTWAuXG4yLiAgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AgaXMgYmVpbmcgdG91Y2hlZC4gVGhpcyBpcyBhZGRpbmcgYW4gYEFSTTY0X0ZUUl9CSVRTYCBlbnRyeSwgdmVyeSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBBUk02NCBmZWF0dXJlIGlkZW50aWZpY2F0aW9uLlxuMy4gIFdlIGhhdmUgY2hhbmdlcyBpbiBgZHJpdmVycy9maXJtd2FyZWAgd2l0aCBhZGRpdGlvbnMgb2YgYGFybV9ybW1gIGRpcmVjdG9yeSBhbmQgY29uZmlndXJhdGlvbiBmaWxlczogYEtjb25maWdgIGFuZCBgTWFrZWZpbGVgLiBUaGlzIGFwcGVhcnMgdG8gYmUgaW50ZWdyYXRpbmcgYSBuZXcgY29tcG9uZW50LCB3aGljaCBpbmNsdWRlcyBpdHMgb3duIEtjb25maWcgb3B0aW9ucyBhbmQgbWFrZWZpbGUgZW50cmllcywgYW5kIHNwZWNpZmljYWxseSBhIGZpbGUgY2FsbGVkIGBybWkuY2Agd2hpY2ggY29udGFpbnMgdGhlIGNvcmUgb2YgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBob3N0LXNpZGUgZHJpdmVyLlxuNC4gIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbmNsdWRlIGZpbGVzIGFkZGVkLCBgYXJtLXJtaS1jbWRzLmhgIGFuZCBgYXJtLXNtY2NjLXJtaS5oYCwgYWdhaW4sIHN1Z2dlc3RpbmcgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byBBUk0gYXJjaGl0ZWN0dXJlcy5cblxuSG9sZCBvbiBhIG1vbWVudCwgdGhpcyBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gY3Jvc3MtcmVmZXJlbmNlIHRoaXMgYmFjayB0byB0aGUgXCJXb3J0aEZ1enppbmc9ZmFsc2VcIiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGlnbm9yZWQgaWYgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIGZhbGwgaW50byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuKiAgIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocyAodGVhcmRvd24gY2FsbGJhY2tzLCBldGMuKVxuKiAgIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuQW5kIGdpdmVuIHRoYXQgd2UgYXJlIHRhcmdldGluZyBgYW1kNjRgLCBpdCdzIGNsZWFyIHdlIHNob3VsZCBiZSBmb2N1c2VkIG9uIHRoZSBzZWNvbmQgcG9pbnQuXG5cbkxldCdzIHZlcmlmeSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogZW5hYmxlZCBvbiBhbWQ2NC4gSXQgbG9va3MgbGlrZSBgQVJNX1JNTV9STUlgIGRpcmVjdGx5IGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIEkgY2FuIHNlZSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIGJ5IGBjb25maWcgQVJNNjRgIHdpdGhpbiBgYXJjaC9hcm02NC9LY29uZmlnYC4gSXQgZG9lc24ndCBhcHBlYXIgdGhpcyB3aWxsIGJlIHNlbGVjdGVkIGJ5IHg4Ni9hbWQ2NC4gSSdsbCBjb25maXJtIHdpdGggYSBgZ3JlcHBlcmAgY2hlY2sgdG8gYmUgY2VydGFpbiB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogc2VsZWN0ZWQgYnkgeDg2LlxuXG5NeSBjb25jbHVzaW9uIGF0IHRoaXMgcG9pbnQsIGJhcnJpbmcgYW55IHVuZm9yZXNlZW4gZGVwZW5kZW5jaWVzLCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgbGlrZWx5ICpub3QqIHJlbGV2YW50IHRvIEFNRDY0IGFuZCBjYW4gcHJvYmFibHkgYmUgY29uc2lkZXJlZCBcIldvcnRoRnV6emluZz1mYWxzZVwiLiBJIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG5vdCBwcmVzZW50IGluIHRoZSB4ODYvYW1kNjQgYnVpbGQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3Nzg3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MzIuNzc0NTAwODA5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NTk3OTI3MzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQVJDSF9TVVBQT1JUU19STU1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XFxuLS1cXG5hcmNoL2FybTY0L0tjb25maWctNDAtXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuYXJjaC9hcm02NC9LY29uZmlnOjQxOlxcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjI6Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cXHRib29sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFxcXCJcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzo3OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxNDo1MTozNS41MzQyOTg4MDJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MTQwMDk5MDY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCdzIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHNjYW4gZmxhZ2dlZCBzb21lIGZpbGVzIHJlbGF0ZWQgdG8gYGFybV9ybW1gLCBgQVJNX1JNTV9STUlgLCBhbmQgY29kZSB0b3VjaGVkIGJ5IHRoaXMgcGF0Y2gsIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGltcGFjdCBteSBhcmVhIG9mIGV4cGVydGlzZS4gSSBpbW1lZGlhdGVseSBsb29rZWQgZm9yIGFueSBwb3RlbnRpYWwgY3Jvc3NvdmVyIG9uIHg4Ni9hbWQ2NC5cblxuRmlyc3QsIEkgaWRlbnRpZmllZCB0aGUgbW9kaWZpZWQgZmlsZXM6IGBhcmNoL2FybTY0L0tjb25maWdgLCBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCwgYW5kIHNvIG9uLiBSaWdodCBhd2F5LCB0aGVzZSBmaWxlcyBsb29rIEFSTS1zcGVjaWZpYy4gSSBzZWUgYHJtaS5jYCBpbmNsdWRlcyBgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlYCBhbmQgYFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcdTAwM2VgLCBib3RoIG9mIHdoaWNoIHNjcmVhbSBBUk0uIEZ1cnRoZXJtb3JlLCBgQVJNX1JNTV9STUlgIHJlbGllcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLCB3aGljaCBpcyBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgb25seSB3aGVuIGJ1aWxkaW5nIGZvciBgQVJNNjRgLiBPbiBteSB0YXJnZXQgYXJjaGl0ZWN0dXJlLCBhbWQ2NC94ODZfNjQsIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogZW5hYmxlZCwgc28gYEFSTV9STU1fUk1JYCBpcyB1bnJlYWNoYWJsZSwgYW5kIGBybWkuY2AgaXMgbm90IGV2ZW4gY29tcGlsZWQuIEkgYWxzbyBub3RlZCB0aGF0IGFsbCBvdGhlciBmaWxlcyBhcmUgYWxzbyBlaXRoZXIgaW4gdGhlIGBhcmNoL2FybTY0L2AgZGlyZWN0b3J5IG9yIGludm9sdmUgQVJNLXNwZWNpZmljIGZpcm13YXJlIGhlYWRlcnMgYW5kIGRyaXZlcnMuXG5cbkdpdmVuIHRoaXMsIGl0J3MgcHJldHR5IGNsZWFyOiB0aGlzIHBhdGNoIGlzIHN0cmljdGx5IEFSTTY0LXNwZWNpZmljLiBJdCdzIGludHJvZHVjaW5nIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHN1cHBvcnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBDUFUgZmVhdHVyZSBkZWZpbml0aW9ucyBhcmUgYWxsIHRpZWQgdG8gdGhhdCBhcmNoaXRlY3R1cmUuIFRoZXJlJ3MgemVybyBjaGFuY2Ugb2YgdGhpcyBwYXRjaCBoYXZpbmcgYW55IGltcGFjdCBvbiB4ODYvYW1kNjQuXG5cbk5vdywgbGV0J3MgZG91YmxlLWNoZWNrIHRoZSB0cmlhZ2UgY3JpdGVyaWEuIFRoZSBcInVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoc1wiIGNyaXRlcmlvbiBjb3ZlcnMgdGhpcyBwZXJmZWN0bHk6IHRoaXMgaXMgY29kZSBleGNsdXNpdmUgdG8gYW4gYXJjaGl0ZWN0dXJlIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIFRoaXMgbWVhbnMsIHdpdGhvdXQgYSBkb3VidCwgSSBuZWVkIHRvIGNhbGwgYHNldC1yZXN1bHRzYCB3aXRoOlxuXG4qICAgYFdvcnRoRnV6emluZzogZmFsc2VgXG4qICAgYEZvY3VzU3ltYm9sczogW11gXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtdYFxuKiAgIGBSZWFzb25pbmdgOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBzdXBwb3J0IGFuZCBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIGRlZmluaXRpb25zLCB3aGljaCBkZXBlbmQgb24gQVJDSFxcX1NVUFBPUlRTXFxfUk1NIChzZWxlY3RlZCBvbmx5IGJ5IEFSTTY0KS4gTm9uZSBvZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBjb21waWxlZCBvciByZWFjaGFibGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIlxuXG5FYXN5IGRlY2lzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTMyMywiT3V0cHV0VG9rZW5zIjoxMjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6NDAuNjc0NDAxODcxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODQ1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjQwLjY3NDQzNzIyMVoiLCJTZXEiOjcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgmwz9[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-07 14:02:03 +0000 UTC FinishedAt: 2026-09-07 14:51:42 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA3IDE0OjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA5YWM0NzMyYzNkNGMwYThjNjA0MTFhMzI2OTQ4MDk2MDU0YWYyOTc4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBTZXAgNyAxNDo1MToyMyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYXJtNjQvS2NvbmZpZ1xuQEAgLTM4LDYgJiM0MzszOCw3IEBAIGNvbmZpZyBBUk02NFxuIFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNX0VOQ1JZUFRcbiBcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HU1xuJiM0MztcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXG4gXHRzZWxlY3QgQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcgaWYgQVJNNjRfSEFGVFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuaW5kZXggMTdiODNhMjUxOGE4Zi4uZGIyNmY2YjBlYWY1ZSAxMDA2NDRcbi0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXG5AQCAtMjkzLDYgJiM0MzsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksXG4mIzQzO1x0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX1ZJU0lCTEUsIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfRElUX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG5pbmRleCBiN2NjMTFlNGZiZmE2Li42MjY2MGJmNTIwYThkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbkBAIC0zMTAsNSAmIzQzOzMxMCw2IEBAIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1wmIzM0O1xuIHNvdXJjZSBcJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3NtY2NjL0tjb25maWdcJiMzNDtcbiBzb3VyY2UgXCYjMzQ7ZHJpdmVycy9maXJtd2FyZS90ZWdyYS9LY29uZmlnXCYjMzQ7XG4gc291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcJiMzNDtcbiYjNDM7c291cmNlIFwmIzM0O2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXCYjMzQ7XG4gXG4gZW5kbWVudVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZVxuQEAgLTM5LDMgJiM0MzszOSw0IEBAIG9iai15XHRcdFx0XHQmIzQzOz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0JiM0Mzs9IHNtY2NjL1xuIG9iai15XHRcdFx0XHQmIzQzOz0gdGVncmEvXG4gb2JqLXlcdFx0XHRcdCYjNDM7PSB4aWxpbngvXG4mIzQzO29iai15XHRcdFx0XHQmIzQzOz0gYXJtX3JtbS9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uODI3MjRlZTIzMTg2ZFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWdcbkBAIC0wLDAgJiM0MzsxLDI2IEBAXG4mIzQzO1xuJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU1cbiYjNDM7XHRib29sXG4mIzQzO1xuJiM0Mztjb25maWcgQVJNX1JNTV9STUlcbiYjNDM7XHRib29sIFwmIzM0O1JlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIFN1cHBvcnRcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG4mIzQzO1x0ZGVmYXVsdCB5XG4mIzQzO1x0aGVscFxuJiM0MztcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcbiYjNDM7XHQgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlXG4mIzQzO1x0ICBBcm0gQ29uZmlkZW50aWFsIENvbXB1dGUgQXJjaGl0ZWN0dXJlLlxuJiM0MztcbiYjNDM7XHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cbiYjNDM7XHQgIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHVzZWQgYnkgYSBOb3JtYWwgV29ybGQgaG9zdCB0byBjcmVhdGUsXG4mIzQzO1x0ICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhblxuJiM0MztcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXG4mIzQzO1x0ICBQQ0kgSURFIHNldHVwIGZvciBzZWN1cmluZyB0aGUgUENJZSBsaW5rcy5cbiYjNDM7XG4mIzQzO1x0ICBUaGlzIG9wdGlvbiBidWlsZHMgdGhlIGhvc3Qtc2lkZSBSTUkgc3VwcG9ydCB1c2VkIGJ5IEtWTSB0byBkZXRlY3QgYVxuJiM0MztcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxuJiM0MztcdCAgUmVhbG0gZ3Vlc3RzLlxuJiM0MztcbiYjNDM7XHQgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBieSBpdHNlbGYgbWFrZSBSZWFsbSBndWVzdHMgYXZhaWxhYmxlOlxuJiM0MztcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXG4mIzQzO1x0ICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcbkBAIC0wLDAgJiM0MzsxLDIgQEBcbiYjNDM7XG4mIzQzO29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcdD0gcm1pLm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zNDA1OGUzNDE4OGQzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcbkBAIC0wLDAgJiM0MzsxLDgxOSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdWZlYXR1cmUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbW9yeS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1ybWktY21kcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcdTAwM2VcbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO1xuJiM0MzsvKiBDdXJyZW50bHkgb25seSB0aGUgZmlyc3QgMiByZWdpc3RlcnMgYXJlIHVzZWQgYnkgTGludXggKi9cbiYjNDM7I2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbiYjNDM7c3RhdGljIF9fcm9fYWZ0ZXJfaW5pdCB1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZ19jYWNoZVtSTUlfRkVBVF9SRUdfQ09VTlRdO1xuJiM0MztcbiYjNDM7dW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OKGlkIFx1MDAzZT0gUk1JX0ZFQVRfUkVHX0NPVU5UKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfZmVhdF9yZWcpO1xuJiM0MztcbiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuJiM0MztcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpXG4mIzQzO3tcbiYjNDM7XHRsb25nIHJldCA9IDA7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4mIzQzO1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZShwaHlzLCB0b3AsIFx1MDAyNm91dF90b3ApO1xuJiM0MztcdFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cGh5cyA9IG91dF90b3A7XG4mIzQzO1x0XHRlbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKVxuJiM0MztcdFx0XHRjcHVfcmVsYXgoKTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAob3V0X3BoeXMpXG4mIzQzO1x0XHQqb3V0X3BoeXMgPSBwaHlzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4mIzQzO1xuJiM0MztpbnQgcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcbiYjNDM7XHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGxvbmcgcmV0ID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgJiM0Mzsgc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChwaHlzIFx1MDAzYyB0b3ApIHtcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCBcdTAwMjZvdXRfdG9wKTtcbiYjNDM7XHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4mIzQzO1x0XHRcdHBoeXMgPSBvdXRfdG9wO1xuJiM0MztcdFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0Y3B1X3JlbGF4KCk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfdW5kZWxlZ2F0ZV9yYW5nZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gQklUKEFSTTY0X0hXX1BHVEFCTEVfTEVWRUxfU0hJRlQoMyAtIHVuaXRfc2l6ZSkpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBybWlfc21jY2NfaW52b2tlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3NfaW4sXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19vdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSAqcmVnc19pbjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKDEpIHtcbiYjNDM7XHRcdGFybV9zbWNjY18xXzJfaW52b2tlKFx1MDAyNnJlZ3MsIHJlZ3Nfb3V0KTtcbiYjNDM7XHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbiYjNDM7XHRcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXHUwMDI2XHUwMDI2IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjcHVfcmVsYXgoKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfQ09OVElOVUUsIHNyb19oYW5kbGUsIGZsYWdzXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShcdTAwMjZyZWdzLCBvdXRfcmVncyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jYW5jZWwodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuJiM0MztcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbiYjNDM7XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHQgICAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfT1BfTUVNX0RPTkFURSwgc3JvX2hhbmRsZSwgbGlzdF9hZGRyLCBsaXN0X2NvdW50LCBmbGFnc1xuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIG91dHB1dCBkb25hdGVkIGNvdW50IChhMSkgaXMgYWx3YXlzIHZhbGlkLCBpcnJlc3BlY3RpdmVcbiYjNDM7XHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcbiYjNDM7XHQgKi9cbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHtcbiYjNDM7XHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4mIzQzO1x0XHRyZXR1cm4gLUVCVVNZO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChwaHlzKSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGZyZWVfZGVsZWdhdGVkX3BhZ2UpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKHNyby1cdTAwM2VhZGRyX2NvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVPVkVSRkxPVztcbiYjNDM7XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9TUEM7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNpemUgPSB1bml0X3NpemVfYnl0ZXMgKiBjb3VudDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHR2b2lkICp2aXJ0O1xuJiM0MztcdHBoeXNfYWRkcl90IHBoeXM7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhXG4mIzQzO1x0ICogcG93ZXIgb2YgMlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBJU19BTElHTkVEKFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpLCBzaXplKSkge1xuJiM0MztcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdLFxuJiM0MztcdFx0XHQgICAgIHNyby1cdTAwM2VhZGRyX2xpc3RbaV0pO1xuJiM0MztcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbiYjNDM7XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuJiM0MztcbiYjNDM7XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbiYjNDM7XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgc2l6ZSwgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbiYjNDM7XHRcdFx0XHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbiYjNDM7XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCB1bml0X3NpemUpO1xuJiM0MztcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XG4mIzQzO1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0gPSBhZGRyX3JhbmdlO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbiYjNDM7XHRcdFx0ICAwLCBvdXRfcmVncyk7XG4mIzQzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuJiM0MztcdFx0LyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0Mzs7XG4mIzQzO1x0fSBlbHNlIGlmIChkb25hdGVkX3NpemUgXHUwMDNjIHNpemUpIHtcbiYjNDM7XHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cbiYjNDM7XHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICYjNDM7PSBQQUdFX1NJWkUpIHtcbiYjNDM7XHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuJiM0MztcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0ZWxzZVxuJiM0MztcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICYjNDM7IGkpKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuJiM0MztcdFx0XHRcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcbiYjNDM7XHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdF9zdGFydCA9IHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBhZGRyX2xpc3Rfc3RhcnQgXHUwMDI2XHUwMDI2IGZvdW5kIFx1MDAzYyBjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcbiYjNDM7XHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7XG4mIzQzO1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuJiM0MztcdFx0XHRzd2FwKHNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSxcbiYjNDM7XHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbiYjNDM7XHRcdFx0Zm91bmQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRpLS07XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIGNvdW50IC0gZm91bmQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZm91bmQgXHUwMDNjIGNvdW50KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4mIzQzO1x0XHR2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIXZpcnQpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcbiYjNDM7XHRcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4mIzQzO1x0XHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgXHUwMDI2ZGVsZWdhdGVkX3BoeXMpKSB7XG4mIzQzO1x0XHRcdFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxuJiM0MztcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuJiM0MztcdFx0XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRhZGRyX3JhbmdlID0gcGh5cyBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuJiM0MztcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCAxKTtcbiYjNDM7XHRcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcdTAwMjZhZGRyX3JhbmdlLCBzdGF0ZSk7XG4mIzQzO1xuJiM0MztcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudCYjNDM7JiM0MztdID0gYWRkcl9yYW5nZTtcbiYjNDM7XHRcdGZvdW5kJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0XSksXG4mIzQzO1x0XHRcdCAgZm91bmQsIDAsIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtXHUwMDNlYTE7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlc19wZXJfdW5pdCA9IHVuaXRfc2l6ZV9ieXRlcyBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXBcbiYjNDM7XHQgKiBqdXN0IGluIGNhc2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzIFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcbiYjNDM7XHRcdGRvbmF0ZWRfZ3JhbnVsZXMgPSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0O1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBSTU0gcmVwb3J0cyB0aGUgY29uc3VtZWQgbWVtb3J5IGluIHRlcm1zIG9mIGdyYW51bGVzLCBidXQgd2VcbiYjNDM7XHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuJiM0MztcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbiYjNDM7XHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4mIzQzO1x0XHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgY29uc3VtZWRfdW5pdHNdO1xuJiM0MztcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPVxuJiM0MztcdFx0XHQoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0XHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cbiYjNDM7XHRcdGZvciAodW5zaWduZWQgbG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XG4mIzQzO1x0XHQgICAgIGkgJiM0Mzs9IFBBR0VfU0laRSkge1xuJiM0MztcdFx0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXG4mIzQzO1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICYjNDM7IGkpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgJiM0MzsgaSkpO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaGlzIHVuaXQgaXMgbm93IGZ1bGx5ICYjMzk7Y29uc3VtZWQmIzM5OyAoZWl0aGVyIGhlbGQgYnkgdGhlIFJNTSBvclxuJiM0MztcdFx0ICogZnJlZWQpXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGNvbnN1bWVkX3VuaXRzJiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJiMzOTt0IHVzZSBpbiBhZGRyX2xpc3QgKi9cbiYjNDM7XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpIFx1MDAzYyBmb3VuZDsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbiYjNDM7XHRcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgJiM0MzsgaV07XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuJiM0MztcdFx0XHQgIGdmcF90IGdmcClcbiYjNDM7e1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHQgICAgIHJlZ3MsIGdmcCk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXG4mIzQzO1x0XHRcdFx0XHRcdHJlZ3MsIGdmcCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuJiM0MztcdFx0XHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBjYXBhY2l0eTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbiYjNDM7XG4mIzQzO1x0Y2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby1cdTAwM2VhZGRyX2NvdW50O1xuJiM0MztcbiYjNDM7XHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcbiYjNDM7XHRcdFx0ICAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSxcbiYjNDM7XHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShvdXRfcmVncy1cdTAwM2VhMSBcdTAwM2UgY2FwYWNpdHkpKVxuJiM0MztcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbiYjNDM7XG4mIzQzO1x0c3JvLVx1MDAzZWFkZHJfY291bnQgJiM0Mzs9IG91dF9yZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9BRERSX1JBTkdFX0NPVU5UKGVudHJ5KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50O1xuJiM0MztcbiYjNDM7XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xuJiM0MztcdFx0XHRcdC8qIExlYWsgdGhlIHBhZ2VzICovXG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGZyZWVfcGFnZXNfZXhhY3QocGh5c190b192aXJ0KGFkZHIpLCBzaXplKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNyby1cdTAwM2VhZGRyX2NvdW50ID0gMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2ZyZWUpO1xuJiM0MztcbiYjNDM7bG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuJiM0MztcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4mIzQzO1xuJiM0MztcdHNyb19oYW5kbGUgPSByZWdzLVx1MDAzZWExO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbiYjNDM7XHRcdGJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLVx1MDAzZWEwKTtcbiYjNDM7XHRcdGludCByZXQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9ET05BVEU6XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fZG9uYXRlKHNybywgc3JvX2hhbmRsZSwgcmVncy1cdTAwM2VhMiwgcmVncyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgZ2ZwKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XG4mIzQzO1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJldCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuJiM0MztcdFx0XHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4mIzM5O3QgYmUgYW4gaXNzdWUuXG4mIzQzO1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuJiM0MztcdFx0XHQgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuXG4mIzQzO1x0XHRcdCAqL1xuJiM0MztcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKCFjYW5fY2FuY2VsKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRcdFx0cm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTtcbiYjNDM7XHRcdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxuJiM0MztcdFx0XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY2FuY2VsbGVkKVxuJiM0MztcdFx0cmV0dXJuIC1FQ0FOQ0VMRUQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuJiM0Mzt9XG4mIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcbiYjNDM7XG4mIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNyb19oYW5kbGU7XG4mIzQzO1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcbiYjNDM7XG4mIzQzO1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4mIzQzO1xuJiM0MztcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuJiM0MztcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApO1xuJiM0MztcbiYjNDM7XHRcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cdTAwM2VhMCkpIHtcbiYjNDM7XHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbiYjNDM7XHRcdFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxuJiM0MztcdFx0XHRcdFx0cmVncyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0ZGVmYXVsdDpcbiYjNDM7XHRcdFx0V0FSTl9PTl9PTkNFKDEpO1xuJiM0MztcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4mIzQzO1xuJiM0MztcdFx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuJiM0MztcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGNhbmNlbGxlZClcbiYjNDM7XHRcdHJldHVybiAtRUNBTkNFTEVEO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX2V4ZWN1dGUpO1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBob3N0X3ZlcnNpb24gPSBSTUlfQUJJX1ZFUlNJT04oUk1JX0FCSV9NQUpPUl9WRVJTSU9OLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4mIzQzO1xuJiM0MztcdC8qIElmIFJNRSBpc24mIzM5O3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4mIzM5O3QgYmUgKi9cbiYjNDM7XHRpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKVxuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgPT0gU01DQ0NfUkVUX05PVF9TVVBQT1JURUQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOWElPO1xuJiM0MztcbiYjNDM7XHR2ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTEpO1xuJiM0MztcdHZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMSk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgIT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdHVuc2lnbmVkIHNob3J0IGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yO1xuJiM0MztcbiYjNDM7XHRcdGhpZ2hfdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmEyKTtcbiYjNDM7XHRcdGhpZ2hfdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmEyKTtcbiYjNDM7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7VW5zdXBwb3J0ZWQgUk1JIEFCSSAodiVkLiVkIC0gdiVkLiVkKSB3ZSB3YW50IHYlZC4lZFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxuJiM0MztcdFx0ICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLFxuJiM0MztcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbiYjNDM7XHRcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuJiM0MztcdFx0cmV0dXJuIC1FTlhJTztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHByX2luZm8oXCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCYjMzQ7LCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU2luY2Ugd2UmIzM5O3ZlIG5lZ290aWF0ZWQgYSBjb21wYXRpYmxlIHZlcnNpb24gdGhlc2UgZmVhdHVyZSByZWdpc3RlcnNcbiYjNDM7XHQgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZVxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2NvbmZpZ3VyZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1x0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbiYjNDM7XHRjYXNlIFNaXzRLOlxuJiM0MztcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgU1pfMTZLOlxuJiM0MztcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuJiM0MztcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBTWl82NEs6XG4mIzQzO1x0XHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XG4mIzQzO1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0I7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHRkZWZhdWx0OlxuJiM0MztcdFx0QlVJTERfQlVHKCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIShybWlfZmVhdF9yZWcoMSkgXHUwMDI2IGdyYW51bGVfZmVhdHVyZSkpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gZG9lcyBub3Qgc3VwcG9ydCAlbHVLQiBncmFudWxlc1xcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBQQUdFX1NJWkUgXHUwMDNlXHUwMDNlIDEwKTtcbiYjNDM7XHRcdHJldHVybiAtRU5YSU87XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFjb25maWcpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0Y29uZmlnLVx1MDAzZXJtaV9ncmFudWxlX3NpemUgPSBncmFudWxlX3NpemU7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uXG4mIzQzO1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbiYjNDM7XHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcbiYjNDM7XHQgKiBQQUdFX1NJWkVTXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uZmlnLVx1MDAzZXRyYWNraW5nX3JlZ2lvbl9zaXplID0gMDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY29uZmlnKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBNYWtlIHN1cmUgdGhlIGFyZWEgaXMgdHJhY2tlZCBieSBSTU0gYXQgRklORSBncmFudWxhcml0eS5cbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhlIHRyYWNraW5nIHlldC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ZlcmlmeV9tZW1vcnlfdHJhY2tpbmcocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcbiYjNDM7e1xuJiM0MztcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xuJiM0MztcbiYjNDM7XHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuJiM0MztcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XG4mIzQzO1x0XHQgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHtcbiYjNDM7XHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4mIzQzO1x0XHRcdHByX2VycihcJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHN0YXJ0LCBuZXh0KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdGFydCA9IG5leHQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuJiM0MzsgKiBhbGwgdGhlIHJlZ2lvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGZpcm13YXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuJiM0MztcbiYjNDM7XHRsMGdwdF9zeiA9IDFVTCBcdTAwM2NcdTAwM2MgKDMwICYjNDM7IEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4mIzQzO1x0XHRcdFx0XHQgIHJtaV9mZWF0X3JlZygxKSkpO1xuJiM0MztcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xuJiM0MztcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoc3RhcnQgXHUwMDNjIGVuZCkge1xuJiM0MztcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHtcbiYjNDM7XHRcdFx0cHJfZXJyKFwmIzM0O0dQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRzdGFydCwgbmV4dCk7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3RhcnQgPSBuZXh0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQoc3RhcnQsIGVuZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcm1pX2luaXRfbWV0YWRhdGEodm9pZClcbiYjNDM7e1xuJiM0MztcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4mIzQzO1x0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcbiYjNDM7XG4mIzQzO1x0Zm9yX2VhY2hfbWVtX3JlZ2lvbihyKSB7XG4mIzQzO1x0XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRcdC8qIEZpcm13YXJlLXJlc2VydmVkIE5PTUFQIHJlZ2lvbnMgYXJlIG5vdCB1c2FibGUgc3lzdGVtIFJBTSAqL1xuJiM0MztcdFx0aWYgKG1lbWJsb2NrX2lzX25vbWFwKHIpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XG4mIzQzO1x0XHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1xuJiM0MztcdFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xuJiM0MztcdFx0aWYgKHJldClcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcbiYjNDM7XHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IG1lbW9yeV9ub3RpZnkgKmFyZyA9IGRhdGE7XG4mIzQzO1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpXG4mIzQzO1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4mIzQzO1xuJiM0MztcdHN0YXJ0ID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3Bmbik7XG4mIzQzO1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiAmIzQzOyBhcmctXHUwMDNlbnJfcGFnZXMpO1xuJiM0MztcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xuJiM0MztcdC5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllcixcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4mIzQzO31cbiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBhcm02NF9pbml0X3JtaSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IDA7XG4mIzQzO1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdC8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovXG4mIzQzO1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2NvbmZpZ3VyZSgpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKiBBY3RpdmF0ZSB0aGUgUk1NICovXG4mIzQzO1x0c3JvID0ga21hbGxvY19vYmooKnNybyk7XG4mIzQzO1x0aWYgKCFzcm8pXG4mIzQzO1x0XHRyZXR1cm4gLUVOT01FTTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pO1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IHJldCBcdTAwM2MgMCA/IHJldCA6IC1FTlhJTztcbiYjNDM7XHRcdGdvdG8gb3V0X2ZyZWVfc3JvO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFx1MDAyNnJtaV9tZW1vcnlfbmIpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuJiM0MztcbiYjNDM7XHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1JNSSBjb25maWd1cmVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRrZnJlZShzcm8pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO291dF9kZWFjdGl2YXRlOlxuJiM0MztcdHJtaV9ybW1fZGVhY3RpdmF0ZShzcm8pO1xuJiM0MztvdXRfZnJlZV9zcm86XG4mIzQzO1x0a2ZyZWUoc3JvKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBOb3RlIGFybTY0X2luaXRfcm1pKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGt2bV9pbml0X3JtaSgpIG90aGVyd2lzZSBLVk1cbiYjNDM7ICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbiYjNDM7ICogbW9kdWxlX2luaXQoKSAodXNlZCBmb3IgS1ZNKSBzbyB0aGlzIGlzIE9LLlxuJiM0MzsgKi9cbiYjNDM7c3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjc0NjI1N2Q3N2RkNjFcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgJiM0MzsxLDY3OCBAQFxuJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuJiM0MzsvKlxuJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FybS1zbWNjYy1ybWkuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXHQyNTZcbiYjNDM7XG4mIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHtcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpO1xuJiM0MztcbiYjNDM7aW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXG4mIzQzO1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcbiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XG4mIzQzO2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbiYjNDM7XG4mIzQzO2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKTtcbiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4mIzQzO2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpO1xuJiM0MztcbiYjNDM7I2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7XHRcdFx0XHRcXFxuJiM0MztcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1x0XHRcdFx0XFxcbiYjNDM7XHQqX19zcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpeyAucmVncyA9IHtfX1ZBX0FSR1NfX30gfTtcdFxcXG4mIzQzO1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuJiM0MztcdHJtaV9zcm9fZnJlZShfX3Nybyk7XHRcdFx0XHRcdFx0XFxcbiYjNDM7XHRfX3JldDtcdFx0XHRcdFx0XHRcdFx0XFxcbiYjNDM7fSlcbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4mIzQzOyAqIEBjZmdfcHRyOiBQQSBvZiBhIHN0cnVjdCBybW1fY29uZmlnXG4mIzQzOyAqXG4mIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBybWlfcm1tX2NvbmZpZ19zZXQodW5zaWduZWQgbG9uZyBjZmdfcHRyKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuJiM0MztcbiYjNDM7XHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1JNTV9DT05GSUdfU0VULCBjZmdfcHRyLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0XG4mIzQzOyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxuJiM0MzsgKlxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fREVBQ1RJVkFURSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ybW1fYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9STU1fQUNUSVZBVEUpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KCkgLSBHZXQgY29uZmlndXJhdGlvbiBvZiBhIEdyYW51bGUgdHJhY2tpbmcgcmVnaW9uXG4mIzQzOyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uXG4mIzQzOyAqIEBlbmQ6IEVuZCBvZiB0aGUgUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfY2F0ZWdvcnk6IE1lbW9yeSBjYXRlZ29yeVxuJiM0MzsgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGVcbiYjNDM7ICogQG91dF90b3A6IFRvcCBvZiB0aGUgbWVtb3J5IHJlZ2lvblxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHVuc2lnbmVkIGxvbmcgc3RhcnQsXG4mIzQzO1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVuZCxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9zdGF0ZSxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfY2F0ZWdvcnkpXG4mIzQzO1x0XHRcdCpvdXRfY2F0ZWdvcnkgPSByZXMuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3N0YXRlKVxuJiM0MztcdFx0XHQqb3V0X3N0YXRlID0gcmVzLmEyO1xuJiM0MztcdFx0aWYgKG91dF90b3ApXG4mIzQzO1x0XHRcdCpvdXRfdG9wID0gcmVzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJlcy5hMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogcm1pX2dwdF9pbmZvIC0gUXVlcnkgdGhlIEdQVCBpbmZvIGZvciB0aGUgZ2l2ZW4gUEFSLlxuJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2hcbiYjNDM7ICpcdFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcbiYjNDM7ICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsXG4mIzQzO1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuJiM0MztcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX0dQVF9JTkZPLCBiYXNlLCBlbmQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X2dwdF9wYXJfc3RhdGUpXG4mIzQzO1x0XHRcdCpvdXRfZ3B0X3Bhcl9zdGF0ZSA9IHJlZ3MuYTI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2ZlYXR1cmVzKCkgLSBSZWFkIGZlYXR1cmUgcmVnaXN0ZXJcbiYjNDM7ICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XG4mIzQzOyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXJcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9mZWF0dXJlcyh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpvdXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRpZiAocmVzLmEwID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXQpXG4mIzQzO1x0XHQqb3V0ID0gcmVzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzXG4mIzQzOyAqIEBiYXNlOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBvZiB0aGUgcmFuZ2VcbiYjNDM7ICogQHRvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgYWZ0ZXIgdGhlIHJhbmdlXG4mIzQzOyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkXG4mIzQzOyAqXG4mIzQzOyAqIERlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZSBmb3IgdXNlIGJ5IHRoZSByZWFsbSB3b3JsZC4gSWYgdGhlIGVudGlyZSByYW5nZVxuJiM0MzsgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4mIzQzOyAqIGFnYWluIHdpdGggQGJhc2UgPT0gQG91dF90b3AuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHVuc2lnbmVkIGxvbmcgYmFzZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURSwgYmFzZSwgdG9wXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xuJiM0MzsgKiBAYmFzZTogQmFzZSBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBQQSBvZiB0aGUgdGFyZ2V0IHJhbmdlXG4mIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcbiYjNDM7ICpcbiYjNDM7ICogVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzIHRvIGFsbG93IHVzZSBieSB0aGUgbm9ybWFsIHdvcmxkLiBXaWxsIGZhaWwgaWZcbiYjNDM7ICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0XHR1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0MztcbiYjNDM7XHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuJiM0MztcdFx0Km91dF90b3AgPSByZWdzLmExO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcF9pbml0KCkgLSBDcmVhdGUgYSBwcm90ZWN0ZWQgbWFwcGluZyB3aXRoIGRhdGEgY29udGVudHNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGRhdGE6IFBBIG9mIHRoZSB0YXJnZXQgZ3JhbnVsZVxuJiM0MzsgKiBAaXBhOiBJUEEgYXQgd2hpY2ggdGhlIGdyYW51bGUgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGd1ZXN0XG4mIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZVxuJiM0MzsgKiBAZmxhZ3M6IFJNSV9NRUFTVVJFX0NPTlRFTlQgaWYgdGhlIGNvbnRlbnRzIHNob3VsZCBiZSBtZWFzdXJlZFxuJiM0MzsgKlxuJiM0MzsgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXG4mIzQzOyAqIGNvbnRlbnRzIGZyb20gYSBOb24tc2VjdXJlIEdyYW51bGUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcF9pbml0KHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgdW5zaWduZWQgbG9uZyBzcmMsXG4mIzQzO1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBmbGFncylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbiYjNDM7XHR9O1xuJiM0MztcdGxvbmcgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XG4mIzQzOyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IFJlYWxtXG4mIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuJiM0MzsgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxuJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4mIzQzOyAqXG4mIzQzOyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuJiM0MztcdFx0aWYgKG91dF90b3ApXG4mIzQzO1x0XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XHRcdGlmIChvdXRfcmFuZ2UpXG4mIzQzO1x0XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuJiM0MztcdFx0aWYgKG91dF9jb3VudClcbiYjNDM7XHRcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3BzY2lfY29tcGxldGUoKSAtIENvbXBsZXRlIHBlbmRpbmcgUFNDSSBjb21tYW5kXG4mIzQzOyAqIEBjYWxsaW5nX3JlYzogUEEgb2YgdGhlIGNhbGxpbmcgUkVDXG4mIzQzOyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0XG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHBlbmRpbmcgUFNDSSBjb21tYW5kLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4mIzQzO1x0XHRcdFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9QU0NJX0NPTVBMRVRFLCBjYWxsaW5nX3JlYywgc3RhdHVzLCBcdTAwMjZyZXMpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmVzLmEwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2FjdGl2YXRlKCkgLSBBY3RpdmUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKlxuJiM0MzsgKiBNYXJrIGEgcmVhbG0gYXMgQWN0aXZlIHNpZ25hbGxpbmcgdGhhdCBjcmVhdGlvbiBpcyBjb21wbGV0ZSBhbmQgYWxsb3dpbmdcbiYjNDM7ICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbiYjNDM7XG4mIzQzO1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fY3JlYXRlKCkgLSBDcmVhdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAcGFyYW1zOiBQQSBvZiByZWFsbSBwYXJhbWV0ZXJzXG4mIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBhIG5ldyByZWFsbSB1c2luZyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVhbG1fdGVybWluYXRlKCkgLSBUZXJtaW5hdGUgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBUZXJtaW5hdGVzIGEgcmVhbG0sIG1vdmluZyBpdCBpbnRvIGEgWk9NQklFIHN0YXRlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURSwgcmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3JlYWxtX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSByZWFsbVxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuJiM0MzsgKlxuJiM0MzsgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fZGVzdHJveSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbiYjNDM7e1xuJiM0MztcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbiYjNDM7XHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0RFU1RST1ksIHJkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxuJiM0MzsgKiB0byBieSBAcGFyYW1zLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyByZWMsXG4mIzQzO1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBhcmFtcyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRsb25nIHJldDtcbiYjNDM7XG4mIzQzO1x0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xuJiM0MztcdH19O1xuJiM0MztcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0cm1pX3Nyb19mcmVlKHNybyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUNcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbiYjNDM7ICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYSBSRUMuIFRoZSBSRUMgbXVzdCBub3QgYmUgcnVubmluZy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xuJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xuJiM0MzsgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuJiM0MzsgKlxuJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XG4mIzQzO1xuJiM0MztcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVDX0VOVEVSLCByZWMsIHJ1bl9wdHIsIFx1MDAyNnJlcyk7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXMuYTA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICpcbiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGVcbiYjNDM7ICogdHJhbnNsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHdpdGhpbiB0aGUgcmVhbG0uXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuJiM0MztcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBpcGEsIGxvbmcgbGV2ZWwpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9DUkVBVEUsIHJkLCBydHQsIGlwYSwgbGV2ZWxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogcm1pX3J0dF9kZXN0cm95KCkgLSBEZXN0cm95IGFuIFJUVFxuJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuJiM0MzsgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbiYjNDM7ICogQGxldmVsOiBSVFQgbGV2ZWxcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKiBAb3V0X3RvcDogUG9pbnRlciB0byB3cml0ZSB0aGUgdG9wIElQQSBvZiBub24tbGl2ZSBSVFQgZW50cmllcywgZnJvbSBlbnRyeVxuJiM0MzsgKiBhdCB3aGljaCB0aGUgUlRUIHdhbGsgdGVybWluYXRlZC5cbiYjNDM7ICpcbiYjNDM7ICogRGVzdHJveXMgYW4gUlRULiBUaGUgUlRUIG11c3QgYmUgbm9uLWxpdmUsIGkuZS4gbm9uZSBvZiB0aGUgZW50cmllcyBpbiB0aGVcbiYjNDM7ICogdGFibGUgYXJlIGluIEFTU0lHTkVEIG9yIFRBQkxFIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0ICAgbG9uZyBsZXZlbCxcbiYjNDM7XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuJiM0MztcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfcnR0KVxuJiM0MztcdFx0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3RvcClcbiYjNDM7XHRcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFRcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4mIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWVcbiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuJiM0MzsgKlxuJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlXG4mIzQzOyAqIGZvbGRlZCBpbnRvIHRoZSBwYXJlbnQgYW5kIHRoZSBSVFQgZGVzdHJveWVkLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2ZvbGQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBpcGEsXG4mIzQzO1x0XHRcdFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbiYjNDM7XHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3J0dClcbiYjNDM7XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuJiM0MzsgKlxuJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4mIzQzOyAqXG4mIzQzOyAqIENyZWF0ZSBtYXBwaW5ncyB0byBtZW1vcnkgd2l0aGluIGEgdGFyZ2V0IHVucHJvdGVjdGVkIElQQSByYW5nZS5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuJiM0MztcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4mIzQzO1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuJiM0MztcdFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4mIzQzO1x0fTtcbiYjNDM7XHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbiYjNDM7XHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbiYjNDM7ICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cbiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXG4mIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4mIzQzOyAqXG4mIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxuJiM0MztcdFx0XHRcdCAgICAgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHRvcCxcbiYjNDM7XHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4mIzQzO1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBybWlfcnR0X3VucHJvdF91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHdpdGhpbiBhbiB1bnByb3RlY3RlZCBJUEEgcmFuZ2VcbiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkRcbiYjNDM7ICogQGJhc2U6IEJhc2UgSVBBIG9mIHRoZSBtYXBwaW5nXG4mIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuJiM0MzsgKiBAZmxhZ3M6IEZsYWdzXG4mIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcbiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgd2hpY2ggaGFzIGJlZW4gdW5tYXBwZWRcbiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbiYjNDM7ICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3VucHJvdF91bm1hcCh1bnNpZ25lZCBsb25nIHJkLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBiYXNlLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nIGZsYWdzLFxuJiM0MztcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBvYWRkcixcbiYjNDM7XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfcmFuZ2UsXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4mIzQzO1x0XHRTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuJiM0MztcdH07XG4mIzQzO1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4mIzQzO1xuJiM0MztcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbiYjNDM7XHRcdGlmIChvdXRfdG9wKVxuJiM0MztcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4mIzQzO1x0XHRpZiAob3V0X3JhbmdlKVxuJiM0MztcdFx0XHQqb3V0X3JhbmdlID0gcmVncy5hMjtcbiYjNDM7XHRcdGlmIChvdXRfY291bnQpXG4mIzQzO1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlYjg4Y2FmNDA5NjRcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICYjNDM7MSw0OTQgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7LypcbiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuJiM0MzsgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxuJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tc21jY2MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZF9idWcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2Nhc20vcGFnZS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVx0XHRcdFx0XFxcbiYjNDM7XHRBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbiYjNDM7XHRcdFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFx0XFxcbiYjNDM7XHRcdFx0ICAgKGZ1bmMpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cdFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNTkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjEpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTYzKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNDSV9DT01QTEVURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjYpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjkpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19TRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTZlKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfQVRURVNUX1BMQVRfVE9LRU5fUkVGUkVTSFx0U01DX1JNSV9DQUxMKDB4MDE3MClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDE3NSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX0dFVF9TVEFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2IpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxN2YpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxODYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfU1RBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTg5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4YilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXHRcdFNNQ19STUlfQ0FMTCgweDAxZDEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0xPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWQyKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRVZFTlRfSEFORExFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9ERUFDVElWQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZDgpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZXHRcdFNNQ19STUlfQ0FMTCgweDAxZGMpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0RQVF9MMV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWRmKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUwKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFx0XHRTTUNfUk1JX0NBTEwoMHgwMWUzKVxuJiM0MztcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlYylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9FVkVOVF9DT05TVU1FXHRcdFNNQ19STUlfQ0FMTCgweDAxZjApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcdFNNQ19STUlfQ0FMTCgweDAxZjIpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1VOTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmOClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZiKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmUpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0RJU0NPTk5FQ1RcdFx0U01DX1JNSV9DQUxMKDB4MDIwNSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcdFx0U01DX1JNSV9DQUxMKDB4MDIwNylcbiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9ET05BVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA4KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0ZFQVRVUkVTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwYilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMGQpXG4mIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZSlcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0lORk9cdFx0U01DX1JNSV9DQUxMKDB4MDIxMClcbiYjNDM7I2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXHQyXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OXHQwXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwM2VcdTAwM2UgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAyNiAweEZGRkYpXG4mIzQzOyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fU1RBVFVTX01BU0tcdFx0KDB4RkZVTClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0KDB4RkZVTCBcdTAwM2NcdTAwM2MgOClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUV9NQVNLXHRcdCgweDNVTCBcdTAwM2NcdTAwM2MgOClcbiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTS1x0KDB4MVVMIFx1MDAzY1x1MDAzYyAxMClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVMocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVgocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXG4mIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxuJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZXQpXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX1NVQ0NFU1NcdFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXHRcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVx0XHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUkVDXHRcdFx0M1xuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRcdFx0XHQ0XG4mIzQzOyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcdFx0NVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcdFx0NlxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYXHRcdDdcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcdFx0OFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9EUFRcdFx0XHQ5XG4mIzQzOyNkZWZpbmUgUk1JX0JVU1lcdFx0XHQxMFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HTE9CQUxcdFx0MTFcbiYjNDM7I2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkdcdFx0MTJcbiYjNDM7I2RlZmluZSBSTUlfSU5DT01QTEVURVx0XHRcdDEzXG4mIzQzOyNkZWZpbmUgUk1JX0JMT0NLRURcdFx0XHQxNFxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUFRcdFx0XHQxNVxuJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXHRcdDE2XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUFx0XHQxXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX0RPTkFURVx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfUkVDTEFJTVx0XHQyXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXHRcdDNVTFxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlRfTUFTS1x0XHRHRU5NQVNLKDE1LCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0tcdFx0QklUKDE2KVxuJiM0MzsjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1x0XHRHRU5NQVNLKDE4LCAxNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcbiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPTlRJR19NQVNLLCByZXEpXG4mIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX09QX01FTV9ERUxFR0FURURcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9PUF9NRU1fQ09ORElUSU9OQUxcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX0xJU1RcdFx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0tcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTS1x0R0VOTUFTSyg2MywgNjIpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXHRcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXFxuJiM0MztcdFx0XHRcdFx0XHQgICAoYXIpKSlcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChhcilcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUihhcilcdFx0KChhcikgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSylcbiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURShhcilcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXFxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4mIzQzO1xuJiM0MztlbnVtIHJtaV9yaXBhcyB7XG4mIzQzO1x0Uk1JX0VNUFRZID0gMCxcbiYjNDM7XHRSTUlfUkFNID0gMSxcbiYjNDM7XHRSTUlfREVTVFJPWUVEID0gMixcbiYjNDM7XHRSTUlfREVWID0gMyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFx0MFxuJiM0MzsjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcdDFcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdEdFTk1BU0soNywgMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcdFx0QklUKDgpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVcdFx0QklUKDkpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkxcdFx0R0VOTUFTSygxMywgMTApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXHRcdEdFTk1BU0soMTksIDE0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX1dQU1x0XHRHRU5NQVNLKDI1LCAyMClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRCSVQoMjYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcdEdFTk1BU0soMzEsIDI3KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTDBHUFRfQkxPQ0tfREVMRUdBVEVcdEJJVCgzMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRHRU5NQVNLKDQwLCAzMylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl80S0JcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXHRCSVQoMilcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzI1Nlx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX01BWF9SRUNTX09SREVSXHRHRU5NQVNLKDksIDYpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTXHRcdEdFTk1BU0soMTYsIDE0KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREFfQ09IXHRcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVlNNTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9QREVWX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSyg3LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXHRCSVQoOClcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1JFQUxNX01BWF9WREVWU19PUkRFUlx0R0VOTUFTSygxNCwgMTApXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXHRHRU5NQVNLKDMsIDApXG4mIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkVcdFx0R0VOTUFTSyg1LCA0KVxuJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1RcdEJJVCg2KVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVFx0XHRHRU5NQVNLKDYzLCAwKVxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFx0XHQwXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfTkNPSFx0XHQxXG4mIzQzOyNkZWZpbmUgUk1JX01FTV9DQVRFR09SWV9ERVZfQ09IXHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcdFx0XHQzXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFx0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVx0XHRcdDFcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVx0XHRcdDJcbiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXHRcdFx0M1xuJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcdFx0NFxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzRLQlx0MFxuJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlx0MVxuJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNjRLQlx0MlxuJiM0MztcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9QTEFUICAgICAgICAgICAgICAgMVVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX05PVF9DUkVBVEVEICAgMlVcbiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbiYjNDM7ICogYWxpZ25tZW50LCBzbyB1c2UgdTY0IHRvIGVuc3VyZSBjb3JyZWN0IGFsaWdubWVudC5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBybW1fY29uZmlnIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuJiM0MztcdFx0XHR1NjQgcm1pX2dyYW51bGVfc2l6ZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBzaXplcltTWl80S107XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRVx0XHRCSVQoMSlcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcdFx0QklUKDIpXG4mIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfREFcdFx0XHRCSVQoMylcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXHRcdEdFTk1BU0soNiwgNSlcbiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZXHRcdEdFTk1BU0soOCwgNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1Nlx0XHRcdDBcbiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXHRcdFx0MVxuJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcdFx0XHQyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4MCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGZsYWdzMDtcbiYjNDM7XHRcdFx0dTY0IHMyc3o7XG4mIzQzO1x0XHRcdHU2NCBzdmVfdmw7XG4mIzQzO1x0XHRcdHU2NCBudW1fYnBzO1xuJiM0MztcdFx0XHR1NjQgbnVtX3dwcztcbiYjNDM7XHRcdFx0dTY0IHBtdV9udW1fY3RycztcbiYjNDM7XHRcdFx0dTY0IGhhc2hfYWxnbztcbiYjNDM7XHRcdFx0dTY0IG51bV9hdXhfcGxhbmVzO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4NDAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg0MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU4IHJwdls2NF07XG4mIzQzO1x0XHRcdHU2NCBhdHNfcGxhbmU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHg0MDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDgwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IHBhZGRpbmcyO1xuJiM0MztcdFx0XHR1NjQgcnR0X2Jhc2U7XG4mIzQzO1x0XHRcdHM2NCBydHRfbGV2ZWxfc3RhcnQ7XG4mIzQzO1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuJiM0MztcdFx0XHR1NjQgZmxhZ3MxO1xuJiM0MztcdFx0XHR1NjQgbWF4X251bV92ZGV2cztcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweDcwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4ZjAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwYWRkaW5nNFsweDgwXTtcbiYjNDM7XHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nNVsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbiYjNDM7ICogY29uZmlndXJlZCBieSB0aGUgaG9zdCB3aGVuIGEgUkVDIGlzIGNyZWF0ZWQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19QQVJBTVNfRkxBR19SVU5OQUJMRVx0QklUKDApXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX3BhcmFtcyB7XG4mIzQzO1x0dW5pb24geyAvKiAweDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgxMDAgKi9cbiYjNDM7XHRcdHU2NCBtcGlkcjtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBwYztcbiYjNDM7XHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgzMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nM1sweGQwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcGFyYW1zKSA9PSBTWl80Syk7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0VNVUxBVEVEX01NSU9cdEJJVCgwKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcdEJJVCgxKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJXHRcdEJJVCgyKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXHRcdEJJVCgzKVxuJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1JJUEFTX1JFU1BPTlNFXHRCSVQoNClcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXHRCSVQoNSlcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFXHRCSVQoNilcbiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19GT1JDRV9QMFx0XHRCSVQoNylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTXHRcdFx0MzFcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNfZW50ZXIge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU2NCBmbGFncztcbiYjNDM7XHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgyMDAgKi9cbiYjNDM7XHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4mIzQzO1x0XHR1OCBwYWRkaW5nMVsweDYwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZW50ZXIpID09IFNaXzJLKTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfU1lOQ1x0XHRcdDB4MDBcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9JUlFcdFx0XHQweDAxXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfRklRXHRcdFx0MHgwMlxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1BTQ0lcdFx0XHQweDAzXG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfUklQQVNfQ0hBTkdFXHRcdDB4MDRcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcdFx0MHgwNVxuJiM0MzsjZGVmaW5lIFJNSV9FWElUX1NFUlJPUlx0XHRcdDB4MDZcbiYjNDM7I2RlZmluZSBSTUlfRVhJVF9TMkFQX0NIQU5HRVx0XHQweDA3XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXHQweDA4XG4mIzQzOyNkZWZpbmUgUk1JX0VYSVRfVlNNTVVfQ09NTUFORFx0XHQweDBhXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjX2V4aXQge1xuJiM0MztcdHVuaW9uIHsgLyogMHgwMDAgKi9cbiYjNDM7XHRcdHU4IGV4aXRfcmVhc29uO1xuJiM0MztcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDEwMCAqL1xuJiM0MztcdFx0c3RydWN0IHtcbiYjNDM7XHRcdFx0dTY0IGVzcjtcbiYjNDM7XHRcdFx0dTY0IGZhcjtcbiYjNDM7XHRcdFx0dTY0IGhwZmFyO1xuJiM0MztcdFx0XHR1NjQgcnR0X3RyZWU7XG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuJiM0MztcdH07XG4mIzQzO1x0dW5pb24geyAvKiAweDIwMCAqL1xuJiM0MztcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHgzMDAgKi9cbiYjNDM7XHRcdHU4IHBhZGRpbmczWzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg0MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCBjbnRwX2N0bDtcbiYjNDM7XHRcdFx0dTY0IGNudHBfY3ZhbDtcbiYjNDM7XHRcdFx0dTY0IGNudHZfY3RsO1xuJiM0MztcdFx0XHR1NjQgY250dl9jdmFsO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc0WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg1MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHU2NCByaXBhc19iYXNlO1xuJiM0MztcdFx0XHR1NjQgcmlwYXNfdG9wO1xuJiM0MztcdFx0XHR1OCByaXBhc192YWx1ZTtcbiYjNDM7XHRcdFx0dTggcGFkZGluZzVbMHhmXTtcbiYjNDM7XHRcdFx0dTY0IHMyYXBfYmFzZTtcbiYjNDM7XHRcdFx0dTY0IHMyYXBfdG9wO1xuJiM0MztcdFx0XHR1NjQgdmRldl9pZF8xO1xuJiM0MztcdFx0XHR1NjQgdmRldl9pZF8yO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV9iYXNlO1xuJiM0MztcdFx0XHR1NjQgZGV2X21lbV90b3A7XG4mIzQzO1x0XHRcdHU2NCBkZXZfbWVtX3BhO1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmc2WzB4MTAwXTtcbiYjNDM7XHR9O1xuJiM0MztcdHVuaW9uIHsgLyogMHg2MDAgKi9cbiYjNDM7XHRcdHN0cnVjdCB7XG4mIzQzO1x0XHRcdHUxNiBpbW07XG4mIzQzO1x0XHRcdHU4IHBhZGRpbmc3WzB4Nl07XG4mIzQzO1x0XHRcdHU2NCBwbGFuZTtcbiYjNDM7XHRcdH07XG4mIzQzO1x0XHR1OCBwYWRkaW5nOFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7XHR1bmlvbiB7IC8qIDB4NzAwICovXG4mIzQzO1x0XHRzdHJ1Y3Qge1xuJiM0MztcdFx0XHR1OCBwbXVfb3ZmX3N0YXR1cztcbiYjNDM7XHRcdFx0dTggcGFkZGluZzlbMHhmXTtcbiYjNDM7XHRcdFx0dTY0IHZzbW11O1xuJiM0MztcdFx0fTtcbiYjNDM7XHRcdHU4IHBhZGRpbmcxMFsweDEwMF07XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspO1xuJiM0MztcbiYjNDM7c3RydWN0IHJlY19ydW4ge1xuJiM0MztcdHN0cnVjdCByZWNfZW50ZXIgZW50ZXI7XG4mIzQzO1x0c3RydWN0IHJlY19leGl0IGV4aXQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3J1bikgPT0gU1pfNEspO1xuJiM0MztcbiYjNDM7LyogUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX09BRERSX1RZUEVcdEdFTk1BU0soMSwgMClcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUlx0R0VOTUFTSygxOCwgMTYpXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX1MyQVBcdFx0R0VOTUFTSygyMiwgMTkpXG4mIzQzO1xuJiM0MzsvKiBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4mIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuJiM0MztcbiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXG4mIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXHRcdFx0QklUKDApXG4mIzQzOyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQURcdFx0XHRCSVQoMSlcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDlhYzQ3MzJjM2Q0YzBhOGM2MDQxMWEzMjY5NDgwOTYwNTRhZjI5NzgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIFNlcCA3IDE0OjUxOjIzIDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FybTY0L0tjb25maWcKQEAgLTM4LDYgJiM0MzszOCw3IEBAIGNvbmZpZyBBUk02NAogCXNlbGVjdCBBUkNIX0hBU19NRU1CQVJSSUVSX1NZTkNfQ09SRQogCXNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVAogCXNlbGVjdCBBUkNIX1NVUFBPUlRTX01TRUFMX1NZU1RFTV9NQVBQSU5HUwomIzQzOwlzZWxlY3QgQVJDSF9TVVBQT1JUU19STU0KIAlzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTCiAJc2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFCiAJc2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwppbmRleCAxN2I4M2EyNTE4YThmLi5kYjI2ZjZiMGVhZjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCkBAIC0yOTMsNiAmIzQzOzI5Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyM1tdID0gewogc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0NTVjNfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksCiYjNDM7CUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQU1VX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX01QQU1fU0hJRlQsIDQsIDApLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKQEAgLTMxMCw1ICYjNDM7MzEwLDYgQEAgc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zYW1zdW5nL0tjb25maWcmIzM0Owogc291cmNlICYjMzQ7ZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnJiMzNDsKIHNvdXJjZSAmIzM0O2RyaXZlcnMvZmlybXdhcmUvdGVncmEvS2NvbmZpZyYjMzQ7CiBzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL3hpbGlueC9LY29uZmlnJiMzNDsKJiM0Mztzb3VyY2UgJiMzNDtkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyYjMzQ7CiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlCmluZGV4IGJlNDZmMWUxZGM3N2YuLjE5NmE2NTBjY2YwMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZQpAQCAtMzksMyAmIzQzOzM5LDQgQEAgb2JqLXkJCQkJJiM0Mzs9IHNhbXN1bmcvCiBvYmoteQkJCQkmIzQzOz0gc21jY2MvCiBvYmoteQkJCQkmIzQzOz0gdGVncmEvCiBvYmoteQkJCQkmIzQzOz0geGlsaW54LwomIzQzO29iai15CQkJCSYjNDM7PSBhcm1fcm1tLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcKQEAgLTAsMCAmIzQzOzEsMjYgQEAKJiM0MzsKJiM0Mztjb25maWcgQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJYm9vbAomIzQzOwomIzQzO2NvbmZpZyBBUk1fUk1NX1JNSQomIzQzOwlib29sICYjMzQ7UmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydCYjMzQ7CiYjNDM7CWRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU0KJiM0MzsJZGVmYXVsdCB5CiYjNDM7CWhlbHAKJiM0MzsJICBTdXBwb3J0IHRoZSBSZWFsbSBNYW5hZ2VtZW50IE1vbml0b3IgKFJNTSkgb24gQXJtIHN5c3RlbXMgdGhhdAomIzQzOwkgIGltcGxlbWVudCB0aGUgUmVhbG0gTWFuYWdlbWVudCBFeHRlbnNpb24gKFJNRSksIGFzIGRlZmluZWQgYnkgdGhlCiYjNDM7CSAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS4KJiM0MzsKJiM0MzsJICBUaGUgUk1NIHJ1bnMgYXQgRUwyIGluIHRoZSBSZWFsbSB3b3JsZCBhbmQgcHJvdmlkZXMgdGhlIFJlYWxtCiYjNDM7CSAgTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgdXNlZCBieSBhIE5vcm1hbCBXb3JsZCBob3N0IHRvIGNyZWF0ZSwKJiM0MzsJICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhbgomIzQzOwkgIGFsc28gYWN0IGFzIGEgVFNNLCBhcyBkZWZpbmVkIGJ5IHRoZSBQQ0llIFRESVNQIGFuZCBjYW4gbWFuYWdlIHRoZQomIzQzOwkgIFBDSSBJREUgc2V0dXAgZm9yIHNlY3VyaW5nIHRoZSBQQ0llIGxpbmtzLgomIzQzOwomIzQzOwkgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhCiYjNDM7CSAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZQomIzQzOwkgIFJlYWxtIGd1ZXN0cy4KJiM0MzsKJiM0MzsJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZToKJiM0MzsJICB0aGUgc3lzdGVtIG11c3QgYWxzbyBwcm92aWRlIFJNRS1jYXBhYmxlIGhhcmR3YXJlIGFuZCBmaXJtd2FyZSB3aXRoIGEKJiM0MzsJICBjb21wYXRpYmxlIFJNTSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NTE3MTk4OGZkY2FlCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL01ha2VmaWxlCkBAIC0wLDAgJiM0MzsxLDIgQEAKJiM0MzsKJiM0MztvYmotJChDT05GSUdfQVJNX1JNTV9STUkpCT0gcm1pLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zNDA1OGUzNDE4OGQzCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL3JtaS5jCkBAIC0wLDAgJiM0MzsxLDgxOSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcHVmZWF0dXJlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbWJsb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21lbW9yeS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcm0tcm1pLWNtZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJvY2Vzc29yLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7YXNtL21lbW9yeS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0OwomIzQzOwomIzQzO3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7CiYjNDM7CiYjNDM7LyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovCiYjNDM7I2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlQJMgomIzQzO3N0YXRpYyBfX3JvX2FmdGVyX2luaXQgdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWdfY2FjaGVbUk1JX0ZFQVRfUkVHX0NPVU5UXTsKJiM0MzsKJiM0Mzt1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT04oaWQgJmd0Oz0gUk1JX0ZFQVRfUkVHX0NPVU5UKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX2ZlYXRfcmVnX2NhY2hlW2lkXTsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTsKJiM0MzsKJiM0MztpbnQgcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgJmFtcDtvdXRfdG9wKTsKJiM0MzsJCWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQkJcGh5cyA9IG91dF90b3A7CiYjNDM7CQllbHNlIGlmIChyZXQgPT0gUk1JX0JVU1kgfHwgcmV0ID09IFJNSV9CTE9DS0VEKQomIzQzOwkJCWNwdV9yZWxheCgpOwomIzQzOwkJZWxzZQomIzQzOwkJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChvdXRfcGh5cykKJiM0MzsJCSpvdXRfcGh5cyA9IHBoeXM7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7CiYjNDM7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsCiYjNDM7CQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICYjNDM7IHNpemU7CiYjNDM7CXVuc2lnbmVkIGxvbmcgb3V0X3RvcDsKJiM0MzsKJiM0MzsJd2hpbGUgKHBoeXMgJmx0OyB0b3ApIHsKJiM0MzsJCXJldCA9IHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUocGh5cywgdG9wLCAmYW1wO291dF90b3ApOwomIzQzOwkJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykKJiM0MzsJCQlwaHlzID0gb3V0X3RvcDsKJiM0MzsJCWVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpCiYjNDM7CQkJY3B1X3JlbGF4KCk7CiYjNDM7CQllbHNlCiYjNDM7CQkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3VuZGVsZWdhdGVfcmFuZ2UpOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7CiYjNDM7CiYjNDM7CXJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbiwKJiM0MzsJCQkgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gKnJlZ3NfaW47CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3RhdHVzOwomIzQzOwomIzQzOwl3aGlsZSAoMSkgewomIzQzOwkJYXJtX3NtY2NjXzFfMl9pbnZva2UoJmFtcDtyZWdzLCByZWdzX291dCk7CiYjNDM7CQlzdGF0dXMgPSBSTUlfUkVUVVJOX1NUQVRVUyhyZWdzX291dC0mZ3Q7YTApOwomIzQzOwkJaWYgKHN0YXR1cyAhPSBSTUlfQlVTWSAmYW1wOyZhbXA7IHN0YXR1cyAhPSBSTUlfQkxPQ0tFRCkKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNwdV9yZWxheCgpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9jb250aW51ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3MKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX2NhbmNlbCh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfT1BfQ0FOQ0VMLCBzcm9faGFuZGxlCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJtaV9zbWNjY19pbnZva2UoJmFtcDtyZWdzLCBvdXRfcmVncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJtaV9vcF9tZW1fZG9uYXRlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCSAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvdXRwdXQgZG9uYXRlZCBjb3VudCAoYTEpIGlzIGFsd2F5cyB2YWxpZCwgaXJyZXNwZWN0aXZlCiYjNDM7CSAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvcgomIzQzOwkgKi8KJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCwKJiM0MzsJCQkgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZSgmYW1wO3JlZ3MsIG91dF9yZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CWlmIChXQVJOX09OX09OQ0Uocm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzKSkpIHsKJiM0MzsJCS8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovCiYjNDM7CQlyZXR1cm4gLUVCVVNZOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nIGNvdW50KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShzcm8tJmd0O2FkZHJfY291bnQgJmd0OyBSTUlfTUFYX0FERFJfTElTVCkpCiYjNDM7CQlyZXR1cm4gLUVPVkVSRkxPVzsKJiM0MzsKJiM0MzsJaWYgKGNvdW50ICZndDsgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tJmd0O2FkZHJfY291bnQpCiYjNDM7CQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9yYW5nZTsKJiM0MzsJaW50IHJldDsKJiM0MzsJdm9pZCAqdmlydDsKJiM0MzsJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhCiYjNDM7CSAqIHBvd2VyIG9mIDIKJiM0MzsJICovCiYjNDM7CWlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgc3JvLSZndDthZGRyX2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby0mZ3Q7YWRkcl9saXN0W2ldOwomIzQzOwomIzQzOwkJaWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50ICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSkgPT0gc3RhdGUgJmFtcDsmYW1wOwomIzQzOwkJICAgIElTX0FMSUdORUQoUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSksIHNpemUpKSB7CiYjNDM7CQkJc3JvLSZndDthZGRyX2NvdW50LS07CiYjNDM7CQkJc3dhcChzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdLAomIzQzOwkJCSAgICAgc3JvLSZndDthZGRyX2xpc3RbaV0pOwomIzQzOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTsKJiM0MzsJaWYgKCF2aXJ0KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkgewomIzQzOwkJcGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7CiYjNDM7CiYjNDM7CQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsICZhbXA7ZGVsZWdhdGVkX3BoeXMpKSB7CiYjNDM7CQkJaWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKQomIzQzOwkJCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpOwomIzQzOwkJCXJldHVybiAtRU5YSU87CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJYWRkcl9yYW5nZSA9IHBoeXMgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7CiYjNDM7CUZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCAmYW1wO2FkZHJfcmFuZ2UsIGNvdW50KTsKJiM0MzsJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgc3RhdGUpOwomIzQzOwomIzQzOwlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdID0gYWRkcl9yYW5nZTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CXJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsCiYjNDM7CQkJICB2aXJ0X3RvX3BoeXMoJmFtcDtzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdKSwgMSwKJiM0MzsJCQkgIDAsIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwl1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9IGRvbmF0ZWRfZ3JhbnVsZXMgJmx0OyZsdDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkgewomIzQzOwkJLyogTm8gcGFnZXMgdXNlZCBieSB0aGUgUk1NICovCiYjNDM7CQlzcm8tJmd0O2FkZHJfY291bnQmIzQzOyYjNDM7OwomIzQzOwl9IGVsc2UgaWYgKGRvbmF0ZWRfc2l6ZSAmbHQ7IHNpemUpIHsKJiM0MzsJCXBoeXMgPSBzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnRdICZhbXA7IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSzsKJiM0MzsKJiM0MzsJCS8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi8KJiM0MzsJCWZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpICZsdDsgc2l6ZTsgaSAmIzQzOz0gUEFHRV9TSVpFKSB7CiYjNDM7CQkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKQomIzQzOwkJCQlmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgJiM0MzsgaSk7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyAmIzQzOyBpKSk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfbm9uY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSwKJiM0MzsJCQkJICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLAomIzQzOwkJCQkgICAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9ET05BVEVfU1RBVEUoZG9uYXRlcmVxKTsKJiM0MzsJdW5zaWduZWQgbG9uZyBmb3VuZCA9IDA7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLSZndDthZGRyX2NvdW50OwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlmb3IgKGludCBpID0gMDsgaSAmbHQ7IGFkZHJfbGlzdF9zdGFydCAmYW1wOyZhbXA7IGZvdW5kICZsdDsgY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CiYjNDM7CQlpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplICZhbXA7JmFtcDsKJiM0MzsJCSAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlKSB7CiYjNDM7CQkJYWRkcl9saXN0X3N0YXJ0LS07CiYjNDM7CQkJc3dhcChzcm8tJmd0O2FkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLAomIzQzOwkJCSAgICAgc3JvLSZndDthZGRyX2xpc3RbaV0pOwomIzQzOwkJCWZvdW5kJiM0MzsmIzQzOzsKJiM0MzsJCQlpLS07CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCBjb3VudCAtIGZvdW5kKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlIChmb3VuZCAmbHQ7IGNvdW50KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7CiYjNDM7CQl2b2lkICp2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3QodW5pdF9zaXplX2J5dGVzLCBnZnApOwomIzQzOwkJcGh5c19hZGRyX3QgcGh5czsKJiM0MzsKJiM0MzsJCWlmICghdmlydCkKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJCXBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5czsKJiM0MzsKJiM0MzsJCQlpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHVuaXRfc2l6ZV9ieXRlcywKJiM0MzsJCQkJCSAgICAgICAmYW1wO2RlbGVnYXRlZF9waHlzKSkgewomIzQzOwkJCQlpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpCiYjNDM7CQkJCQlmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHVuaXRfc2l6ZV9ieXRlcyk7CiYjNDM7CQkJCXJldHVybiAtRU5YSU87CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwomIzQzOwkJYWRkcl9yYW5nZSA9IHBoeXMgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCB1bml0X3NpemUpOwomIzQzOwkJRklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssICZhbXA7YWRkcl9yYW5nZSwgMSk7CiYjNDM7CQlGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgJmFtcDthZGRyX3JhbmdlLCBzdGF0ZSk7CiYjNDM7CiYjNDM7CQlzcm8tJmd0O2FkZHJfbGlzdFtzcm8tJmd0O2FkZHJfY291bnQmIzQzOyYjNDM7XSA9IGFkZHJfcmFuZ2U7CiYjNDM7CQlmb3VuZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSwKJiM0MzsJCQkgIHZpcnRfdG9fcGh5cygmYW1wO3Nyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0pLAomIzQzOwkJCSAgZm91bmQsIDAsIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJdW5zaWduZWQgbG9uZyBkb25hdGVkX2dyYW51bGVzID0gb3V0X3JlZ3MtJmd0O2ExOwomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVzX3Blcl91bml0ID0gdW5pdF9zaXplX2J5dGVzICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY29uc3VtZWRfdW5pdHM7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBSTU0gc2hvdWxkbiYjMzk7dCByZXBvcnQgbW9yZSBncmFudWxlcyB0aGFuIHdlIHByb3ZpZGVkLCBidXQgY2xhbXAKJiM0MzsJICoganVzdCBpbiBjYXNlLgomIzQzOwkgKi8KJiM0MzsJaWYgKFdBUk5fT05fT05DRShkb25hdGVkX2dyYW51bGVzICZndDsgZm91bmQgKiBncmFudWxlc19wZXJfdW5pdCkpCiYjNDM7CQlkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIFJNTSByZXBvcnRzIHRoZSBjb25zdW1lZCBtZW1vcnkgaW4gdGVybXMgb2YgZ3JhbnVsZXMsIGJ1dCB3ZQomIzQzOwkgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldAomIzQzOwkgKiB0aGUgbnVtYmVyIG9mIChjb21wbGV0ZSkgY29uc3VtZWQgdW5pdHMuCiYjNDM7CSAqLwomIzQzOwljb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDsKJiM0MzsJaWYgKGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgewomIzQzOwkJLyoKJiM0MzsJCSAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieQomIzQzOwkJICogdGhlIFJNTSwgdGhlIHRhaWwgaXMgb3duZWQgYnkgdGhlIGhvc3QKJiM0MzsJCSAqLwomIzQzOwkJdW5zaWduZWQgbG9uZyBlbnRyeSA9CiYjNDM7CQkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGNvbnN1bWVkX3VuaXRzXTsKJiM0MzsJCXBoeXNfYWRkcl90IHBoeXMgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0KJiM0MzsJCQkoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwomIzQzOwkJLyogRnJlZSB0aGUgdGFpbCBiYWNrICovCiYjNDM7CQlmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSAmbHQ7IHVuaXRfc2l6ZV9ieXRlczsKJiM0MzsJCSAgICAgaSAmIzQzOz0gUEFHRV9TSVpFKSB7CiYjNDM7CQkJaWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKQomIzQzOwkJCQlmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgJiM0MzsgaSk7CiYjNDM7CQkJZWxzZQomIzQzOwkJCQlfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyAmIzQzOyBpKSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAmIzM5O2NvbnN1bWVkJiMzOTsgKGVpdGhlciBoZWxkIGJ5IHRoZSBSTU0gb3IKJiM0MzsJCSAqIGZyZWVkKQomIzQzOwkJICovCiYjNDM7CQljb25zdW1lZF91bml0cyYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogS2VlcCBqdXN0IHRoZSB1bml0cyB0aGUgUk1NIGRpZG4mIzM5O3QgdXNlIGluIGFkZHJfbGlzdCAqLwomIzQzOwlmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGNvbnN1bWVkX3VuaXRzOyBpICZsdDsgZm91bmQ7IGkmIzQzOyYjNDM7KQomIzQzOwkJc3JvLSZndDthZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICYjNDM7IGkgLSBjb25zdW1lZF91bml0c10gPQomIzQzOwkJCXNyby0mZ3Q7YWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCAmIzQzOyBpXTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50IC09IGNvbnN1bWVkX3VuaXRzOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCSAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLAomIzQzOwkJCSAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsCiYjNDM7CQkJICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLAomIzQzOwkJCSAgZ2ZwX3QgZ2ZwKQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpZiAoUk1JX0RPTkFURV9DT05USUcoZG9uYXRlcmVxKSkgewomIzQzOwkJcmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSwKJiM0MzsJCQkJCSAgICAgcmVncywgZ2ZwKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsCiYjNDM7CQkJCQkJcmVncywgZ2ZwKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLAomIzQzOwkJCSAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwKJiM0MzsJCQkgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlybWlfc3JvX2ZyZWUoc3JvKTsKJiM0MzsKJiM0MzsJY2FwYWNpdHkgPSBSTUlfTUFYX0FERFJfTElTVCAtIHNyby0mZ3Q7YWRkcl9jb3VudDsKJiM0MzsKJiM0MzsJcm1pX29wX21lbV9yZWNsYWltKHNyb19oYW5kbGUsCiYjNDM7CQkJICAgdmlydF90b19waHlzKCZhbXA7c3JvLSZndDthZGRyX2xpc3Rbc3JvLSZndDthZGRyX2NvdW50XSksCiYjNDM7CQkJICAgY2FwYWNpdHksIG91dF9yZWdzKTsKJiM0MzsKJiM0MzsJaWYgKFdBUk5fT05fT05DRShvdXRfcmVncy0mZ3Q7YTEgJmd0OyBjYXBhY2l0eSkpCiYjNDM7CQlvdXRfcmVncy0mZ3Q7YTEgPSBjYXBhY2l0eTsKJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ICYjNDM7PSBvdXRfcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzcm8tJmd0O2FkZHJfY291bnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLSZndDthZGRyX2xpc3RbaV07CiYjNDM7CQl1bnNpZ25lZCBsb25nIGFkZHIgPSBSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7CiYjNDM7CQl1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpOwomIzQzOwkJdW5zaWduZWQgbG9uZyBzdGF0ZSA9IFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7CiYjNDM7CiYjNDM7CQlpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHsKJiM0MzsJCQlpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkgewomIzQzOwkJCQkvKiBMZWFrIHRoZSBwYWdlcyAqLwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQlmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3JvLSZndDthZGRyX2NvdW50ID0gMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9ICZhbXA7c3JvLSZndDtyZWdzOwomIzQzOwlib29sIGNhbmNlbGxlZCA9IGZhbHNlOwomIzQzOwomIzQzOwlybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpOwomIzQzOwomIzQzOwlzcm9faGFuZGxlID0gcmVncy0mZ3Q7YTE7CiYjNDM7CiYjNDM7CXdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLSZndDthMCkgPT0gUk1JX0lOQ09NUExFVEUpIHsKJiM0MzsJCWJvb2wgY2FuX2NhbmNlbCA9IFJNSV9SRVRVUk5fQ0FOX0NBTkNFTChyZWdzLSZndDthMCk7CiYjNDM7CQlpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsJCXN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy0mZ3Q7YTApKSB7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX05PTkU6CiYjNDM7CQkJcm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLAomIzQzOwkJCQkJcmVncyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURToKJiM0MzsJCQlyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtJmd0O2EyLCByZWdzLAomIzQzOwkJCQkJICAgICBnZnApOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJY2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOgomIzQzOwkJCXJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJZGVmYXVsdDoKJiM0MzsJCQlyZXQgPSBXQVJOX09OX09OQ0UoMSk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYQomIzQzOwkJCSAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbiYjMzk7dCBiZSBhbiBpc3N1ZS4KJiM0MzsJCQkgKiBIb3dldmVyLCBpZiB3ZSBlbmNvdW50ZXIgYSByYW5kb20gZmFpbHVyZSAoZS5nLiwKJiM0MzsJCQkgKiBidWdneSBSTU0pLCBkb24mIzM5O3QgbG9vcCBmb3JldmVyLCBqdXN0IGdpdmUgdXAuCiYjNDM7CQkJICovCiYjNDM7CQkJaWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpCiYjNDM7CQkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQkJcm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCQljYW5jZWxsZWQgPSB0cnVlOwomIzQzOwomIzQzOwkJCWlmIChXQVJOX09OX09OQ0UoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApICE9IFJNSV9JTkNPTVBMRVRFKSkKJiM0MzsJCQkJcmV0dXJuIHJldDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUpOwomIzQzOwomIzQzOy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovCiYjNDM7bG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTsKJiM0MzsJYm9vbCBjYW5jZWxsZWQgPSBmYWxzZTsKJiM0MzsKJiM0MzsJcm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTsKJiM0MzsKJiM0MzsJc3JvX2hhbmRsZSA9IHJlZ3MtJmd0O2ExOwomIzQzOwomIzQzOwl3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy0mZ3Q7YTApID09IFJNSV9JTkNPTVBMRVRFKSB7CiYjNDM7CQlib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy0mZ3Q7YTApOwomIzQzOwomIzQzOwkJc3dpdGNoIChSTUlfUkVUVVJOX01FTVJFUShyZWdzLSZndDthMCkpIHsKJiM0MzsJCWNhc2UgUk1JX09QX01FTV9SRVFfTk9ORToKJiM0MzsJCQlybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsCiYjNDM7CQkJCQlyZWdzKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWRlZmF1bHQ6CiYjNDM7CQkJV0FSTl9PTl9PTkNFKDEpOwomIzQzOwkJCWlmICghY2FuX2NhbmNlbCkKJiM0MzsJCQkJcmV0dXJuIHJlZ3MtJmd0O2EwOwomIzQzOwomIzQzOwkJCWNhbmNlbGxlZCA9IHRydWU7CiYjNDM7CQkJcm1pX29wX2NhbmNlbChzcm9faGFuZGxlLCByZWdzKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2FuY2VsbGVkKQomIzQzOwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CiYjNDM7CiYjNDM7CXJldHVybiByZWdzLSZndDthMDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19leGVjdXRlKTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CXVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaG9zdF92ZXJzaW9uID0gUk1JX0FCSV9WRVJTSU9OKFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCQkJCQkgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWE2NHBmcjAgPSByZWFkX3Nhbml0aXNlZF9mdHJfcmVnKFNZU19JRF9BQTY0UEZSMF9FTDEpOwomIzQzOwomIzQzOwkvKiBJZiBSTUUgaXNuJiMzOTt0IHN1cHBvcnRlZCwgdGhlbiBSTUkgY2FuJiMzOTt0IGJlICovCiYjNDM7CWlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoYWE2NHBmcjAsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQpID09IDApCiYjNDM7CQlyZXR1cm4gLUVOWElPOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1ZFUlNJT04sIGhvc3RfdmVyc2lvbiwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlpZiAocmVzLmEwID09IFNNQ0NDX1JFVF9OT1RfU1VQUE9SVEVEKQomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsKJiM0MzsJdmVyc2lvbl9tYWpvciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IocmVzLmExKTsKJiM0MzsJdmVyc2lvbl9taW5vciA9IFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IocmVzLmExKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykgewomIzQzOwkJdW5zaWduZWQgc2hvcnQgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3I7CiYjNDM7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMik7CiYjNDM7CQloaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7CiYjNDM7CiYjNDM7CQlwcl9lcnIoJiMzNDtVbnN1cHBvcnRlZCBSTUkgQUJJICh2JWQuJWQgLSB2JWQuJWQpIHdlIHdhbnQgdiVkLiVkXG4mIzM0OywKJiM0MzsJCSAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yLAomIzQzOwkJICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTiwKJiM0MzsJCSAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwlwcl9pbmZvKCYjMzQ7Uk1JIEFCSSB2ZXJzaW9uICVkLiVkXG4mIzM0OywgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcik7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9yZWFkX2ZlYXR1cmVzKHZvaWQpCiYjNDM7ewomIzQzOwkvKgomIzQzOwkgKiBTaW5jZSB3ZSYjMzk7dmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVycwomIzQzOwkgKiBzaG91bGQgYWx3YXlzIGJlIGF2YWlsYWJsZQomIzQzOwkgKi8KJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBSTUlfRkVBVF9SRUdfQ09VTlQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoV0FSTl9PTihybWlfZmVhdHVyZXMoaSwgJmFtcDtybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBncmFudWxlX3NpemU7CiYjNDM7CWludCByZXQgPSAwOwomIzQzOwlzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnOwomIzQzOwomIzQzOwlzd2l0Y2ggKFBBR0VfU0laRSkgewomIzQzOwljYXNlIFNaXzRLOgomIzQzOwkJZ3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV80S0I7CiYjNDM7CQlncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFNaXzE2SzoKJiM0MzsJCWdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfMTZLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFNaXzY0SzoKJiM0MzsJCWdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjsKJiM0MzsJCWdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjsKJiM0MzsJCWJyZWFrOwomIzQzOwlkZWZhdWx0OgomIzQzOwkJQlVJTERfQlVHKCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEocm1pX2ZlYXRfcmVnKDEpICZhbXA7IGdyYW51bGVfZmVhdHVyZSkpIHsKJiM0MzsJCXByX2VycigmIzM0O1JNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXG4mIzM0OywKJiM0MzsJCSAgICAgICBQQUdFX1NJWkUgJmd0OyZndDsgMTApOwomIzQzOwkJcmV0dXJuIC1FTlhJTzsKJiM0MzsJfQomIzQzOwomIzQzOwljb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghY29uZmlnKQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CWNvbmZpZy0mZ3Q7cm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogRm9yIG5vdyB3ZSBzZXQgdGhlIHRyYWNraW5nX3JlZ2lvbl9zaXplIHRvIDAgd2hpY2ggaXMgdGhlIG9ubHkgb3B0aW9uCiYjNDM7CSAqIGZvciA0S0IgUEFHRV9TSVpFICgxR0IgZm9yIDRLQiBQQUdFX1NJWkUsIDMyTUIvNTEyTUIgZm9yIDE2S0IvNjRLQikuCiYjNDM7CSAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlcgomIzQzOwkgKiBQQUdFX1NJWkVTCiYjNDM7CSAqLwomIzQzOwljb25maWctJmd0O3RyYWNraW5nX3JlZ2lvbl9zaXplID0gMDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTsKJiM0MzsJaWYgKHJldCkgewomIzQzOwkJcHJfZXJyKCYjMzQ7Uk1NIGNvbmZpZyBzZXQgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljb25maWcpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LgomIzQzOyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQomIzQzO3sKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0OwomIzQzOwomIzQzOwkJcmV0ID0gcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHN0YXJ0LCBlbmQsICZhbXA7Y2F0ZWdvcnksICZhbXA7c3RhdGUsICZhbXA7bmV4dCk7CiYjNDM7CQlpZiAocmV0ICE9IFJNSV9TVUNDRVNTKQomIzQzOwkJCXJldHVybiAtRU5PTUVNOwomIzQzOwomIzQzOwkJaWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8CiYjNDM7CQkgICAgY2F0ZWdvcnkgIT0gUk1JX01FTV9DQVRFR09SWV9DT05WRU5USU9OQUwpIHsKJiM0MzsJCQkvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi8KJiM0MzsJCQlwcl9lcnIoJiMzNDtHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJiMzOTt0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHN0YXJ0LCBuZXh0KTsKJiM0MzsJCQlyZXR1cm4gLUVOT0RFVjsKJiM0MzsJCX0KJiM0MzsJCXN0YXJ0ID0gbmV4dDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBXZSBkbyBub3Qgc3VwcG9ydCBjcmVhdGluZyBMMSBHUFRzIHlldC4gU28sIG1ha2Ugc3VyZSB0aGF0CiYjNDM7ICogYWxsIHRoZSByZWdpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbDBncHRfc3o7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlOwomIzQzOwomIzQzOwlsMGdwdF9zeiA9IDFVTCAmbHQ7Jmx0OyAoMzAgJiM0MzsgRklFTERfR0VUKFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTDBHUFRTWiwKJiM0MzsJCQkJCSAgcm1pX2ZlYXRfcmVnKDEpKSk7CiYjNDM7CXN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opOwomIzQzOwllbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTsKJiM0MzsKJiM0MzsJd2hpbGUgKHN0YXJ0ICZsdDsgZW5kKSB7CiYjNDM7CQlsb25nIHJldCA9IHJtaV9ncHRfaW5mbyhzdGFydCwgZW5kLCAmYW1wO25leHQsICZhbXA7cGFyX3N0YXRlKTsKJiM0MzsKJiM0MzsJCWlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpCiYjNDM7CQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CQlpZiAocGFyX3N0YXRlICE9IFJNSV9HUFRfUEFSX1BMQVQpIHsKJiM0MzsJCQlwcl9lcnIoJiMzNDtHUFQgZm9yIHRoZSByZWdpb24gaXMgbm90IG1hbmFnZWQgYnkgZmlybXdhcmUgJWxseC0lbHhcbiYjMzQ7LAomIzQzOwkJCQlzdGFydCwgbmV4dCk7CiYjNDM7CQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQl9CiYjNDM7CQlzdGFydCA9IG5leHQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpCiYjNDM7ewomIzQzOwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOwomIzQzOwlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwomIzQzOwomIzQzOwlmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHsKJiM0MzsJCWludCByZXQ7CiYjNDM7CiYjNDM7CQkvKiBGaXJtd2FyZS1yZXNlcnZlZCBOT01BUCByZWdpb25zIGFyZSBub3QgdXNhYmxlIHN5c3RlbSBSQU0gKi8KJiM0MzsJCWlmIChtZW1ibG9ja19pc19ub21hcChyKSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsKJiM0MzsJCXN0YXJ0ID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyKSAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOwkJZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CQlyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7CiYjNDM7CQlpZiAocmV0KQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcm1pX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAomIzQzOwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1vcnlfbm90aWZ5ICphcmcgPSBkYXRhOwomIzQzOwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlpZiAoYWN0aW9uICE9IE1FTV9HT0lOR19PTkxJTkUpCiYjNDM7CQlyZXR1cm4gTk9USUZZX0RPTkU7CiYjNDM7CiYjNDM7CXN0YXJ0ID0gUEZOX1BIWVMoYXJnLSZndDtzdGFydF9wZm4pOwomIzQzOwllbmQgPSBQRk5fUEhZUyhhcmctJmd0O3N0YXJ0X3BmbiAmIzQzOyBhcmctJmd0O25yX3BhZ2VzKTsKJiM0MzsJcmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpOwomIzQzOwomIzQzOwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJtaV9tZW1vcnlfbmIgPSB7CiYjNDM7CS5ub3RpZmllcl9jYWxsID0gcm1pX21lbW9yeV9ub3RpZmllciwKJiM0Mzt9OwomIzQzOwomIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGFybTY0X3JtaV9pc19hdmFpbGFibGU7CiYjNDM7fQomIzQzO0VYUE9SVF9TWU1CT0xfR1BMKGlzX3JtaV9hdmFpbGFibGUpOwomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gMDsKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyA9IE5VTEw7CiYjNDM7CiYjNDM7CS8qIENvbnRpbnVlIHdpdGhvdXQgcmVhbG0gc3VwcG9ydCBpZiB3ZSBjYW4mIzM5O3QgYWdyZWUgb24gYSB2ZXJzaW9uICovCiYjNDM7CXJldCA9IHJtaV9jaGVja192ZXJzaW9uKCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX2NvbmZpZ3VyZSgpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogQWN0aXZhdGUgdGhlIFJNTSAqLwomIzQzOwlzcm8gPSBrbWFsbG9jX29iaigqc3JvKTsKJiM0MzsJaWYgKCFzcm8pCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsKJiM0MzsJcmV0ID0gcm1pX3JtbV9hY3RpdmF0ZShzcm8pOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlwcl9lcnIoJiMzNDtSTU0gYWN0aXZhdGUgZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSByZXQgJmx0OyAwID8gcmV0IDogLUVOWElPOwomIzQzOwkJZ290byBvdXRfZnJlZV9zcm87CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCWdvdG8gb3V0X2RlYWN0aXZhdGU7CiYjNDM7CiYjNDM7CXJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcigmYW1wO3JtaV9tZW1vcnlfbmIpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKJiM0MzsKJiM0MzsJYXJtNjRfcm1pX2lzX2F2YWlsYWJsZSA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtSTUkgY29uZmlndXJlZFxuJiMzNDspOwomIzQzOwlrZnJlZShzcm8pOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztvdXRfZGVhY3RpdmF0ZToKJiM0MzsJcm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7CiYjNDM7b3V0X2ZyZWVfc3JvOgomIzQzOwlrZnJlZShzcm8pOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIE5vdGUgYXJtNjRfaW5pdF9ybWkoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUga3ZtX2luaXRfcm1pKCkgb3RoZXJ3aXNlIEtWTQomIzQzOyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlCiYjNDM7ICogbW9kdWxlX2luaXQoKSAodXNlZCBmb3IgS1ZNKSBzbyB0aGlzIGlzIE9LLgomIzQzOyAqLwomIzQzO3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43NDYyNTdkNzdkZDYxCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaApAQCAtMCwwICYjNDM7MSw2NzggQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLwomIzQzOy8qCiYjNDM7ICogQ29weXJpZ2h0IChDKSAyMDI2IEFSTSBMdGQuCiYjNDM7ICovCiYjNDM7CiYjNDM7I2lmbmRlZiBfX0xJTlVYX0FSTV9STUlfQ01EU19IXwomIzQzOyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXNtY2NjLXJtaS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9idWcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUCTI1NgomIzQzOwomIzQzO3N0cnVjdCBybWlfc3JvX3N0YXRlIHsKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHJfY291bnQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYWRkcl9saXN0W1JNSV9NQVhfQUREUl9MSVNUXTsKJiM0Mzt9OwomIzQzOwomIzQzO3Vuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnKHVuc2lnbmVkIGxvbmcgaWQpOwomIzQzOwomIzQzO2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLAomIzQzOwkJICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cyk7CiYjNDM7aW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiYjNDM7aW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cyk7CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFLCBOVUxMKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX3VuZGVsZWdhdGVfcGFnZShwaHlzX2FkZHJfdCBwaHlzKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7CiYjNDM7fQomIzQzOwomIzQzO2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTsKJiM0MzsKJiM0Mztsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7CiYjNDM7dm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7CiYjNDM7bG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7CiYjNDM7CiYjNDM7I2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7CQkJCVwKJiM0MzsJc3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7CQkJCVwKJiM0MzsJKl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07CVwKJiM0MzsJbG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApOwkJXAomIzQzOwlybWlfc3JvX2ZyZWUoX19zcm8pOwkJCQkJCVwKJiM0MzsJX19yZXQ7CQkJCQkJCQlcCiYjNDM7fSkKJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NCiYjNDM7ICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWcKJiM0MzsgKgomIzQzOyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUk1NX0NPTkZJR19TRVQsIGNmZ19wdHIsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlcy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0CiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpCiYjNDM7ICoKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ybW1fZGVhY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9ERUFDVElWQVRFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTQomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JtbV9hY3RpdmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvbgomIzQzOyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uCiYjNDM7ICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb24KJiM0MzsgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnkKJiM0MzsgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGUKJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LAomIzQzOwkJCQkJICAgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfY2F0ZWdvcnksCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsCiYjNDM7CQkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOwomIzQzOwomIzQzOwlhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VULCBzdGFydCwgZW5kLCAmYW1wO3Jlcyk7CiYjNDM7CiYjNDM7CWlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfY2F0ZWdvcnkpCiYjNDM7CQkJKm91dF9jYXRlZ29yeSA9IHJlcy5hMTsKJiM0MzsJCWlmIChvdXRfc3RhdGUpCiYjNDM7CQkJKm91dF9zdGF0ZSA9IHJlcy5hMjsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogcm1pX2dwdF9pbmZvIC0gUXVlcnkgdGhlIEdQVCBpbmZvIGZvciB0aGUgZ2l2ZW4gUEFSLgomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvbgomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb24KJiM0MzsgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBwaHlpc2NhbCBhZGRyZXNzIHJlZ2lvbiBmb3Igd2hpY2gKJiM0MzsgKgkJdGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWQKJiM0MzsgKiBAb3V0X2dwdF9wYXJfc3RhdGU6IFN0YXRlIG9mIHRoZSBHUFQgY292ZXJlZCBieSBbYmFzZSwgb3V0X3RvcCkKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3AsCiYjNDM7CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9ncHRfcGFyX3N0YXRlKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUFRfSU5GTywgYmFzZSwgZW5kLAomIzQzOwl9OwomIzQzOwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQlpZiAob3V0X3RvcCkKJiM0MzsJCQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CQlpZiAob3V0X2dwdF9wYXJfc3RhdGUpCiYjNDM7CQkJKm91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfZmVhdHVyZXMoKSAtIFJlYWQgZmVhdHVyZSByZWdpc3RlcgomIzQzOyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleAomIzQzOyAqIEBvdXQ6IEZlYXR1cmUgcmVnaXN0ZXIgdmFsdWUgaXMgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXIKJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgcm1pX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKm91dCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9GRUFUVVJFUywgaW5kZXgsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJaWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dCkKJiM0MzsJCSpvdXQgPSByZXMuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXMuYTA7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlcwomIzQzOyAqIEBiYXNlOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBvZiB0aGUgcmFuZ2UKJiM0MzsgKiBAdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBhZnRlciB0aGUgcmFuZ2UKJiM0MzsgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZAomIzQzOyAqCiYjNDM7ICogRGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlIGZvciB1c2UgYnkgdGhlIHJlYWxtIHdvcmxkLiBJZiB0aGUgZW50aXJlIHJhbmdlCiYjNDM7ICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAomIzQzOyAqIGFnYWluIHdpdGggQGJhc2UgPT0gQG91dF90b3AuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUodW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcwomIzQzOyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2UKJiM0MzsgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZQomIzQzOyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWQKJiM0MzsgKgomIzQzOyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmCiYjNDM7ICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3RvcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3AKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlCiYjNDM7ICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdAomIzQzOyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZQomIzQzOyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkCiYjNDM7ICoKJiM0MzsgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nCiYjNDM7ICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsCiYjNDM7CQkJCQkgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklULCByZCwgZGF0YSwgaXBhLCBzcmMsIGZsYWdzCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJldHVybiBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZQomIzQzOyAqIEBmbGFnczogRmxhZ3MKJiM0MzsgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yCiYjNDM7ICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyB0b3AsCiYjNDM7CQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0OwomIzQzOwomIzQzOwlyZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF90b3ApCiYjNDM7CQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGF0YV91bm1hcCgpIC0gUmVtb3ZlIG1hcHBpbmdzIHRvIGNvbnZlbnRpb25hbCBtZW1vcnkKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCBSZWFsbQomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlCiYjNDM7ICogQGZsYWdzOiBGbGFncwomIzQzOyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3IKJiM0MzsgKiBAb3V0X3RvcDogUmV0dXJucyB0b3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIGNvbnZlbnRpb24gbWVtb3J5IHdpdGggYSB0YXJnZXQgUHJvdGVjdGVkIElQQSByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvYWRkciwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCwKJiM0MzsJCQkJICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHIKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7CiYjNDM7CQlpZiAob3V0X3RvcCkKJiM0MzsJCQkqb3V0X3RvcCA9IHJlZ3MuYTE7CiYjNDM7CQlpZiAob3V0X3JhbmdlKQomIzQzOwkJCSpvdXRfcmFuZ2UgPSByZWdzLmEyOwomIzQzOwkJaWYgKG91dF9jb3VudCkKJiM0MzsJCQkqb3V0X2NvdW50ID0gcmVncy5hMzsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmQKJiM0MzsgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQwomIzQzOyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0CiYjNDM7ICoKJiM0MzsgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsCiYjNDM7CQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGF0dXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7CiYjNDM7CiYjNDM7CWFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVhbG1fYWN0aXZhdGUoKSAtIEFjdGl2ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKgomIzQzOyAqIE1hcmsgYSByZWFsbSBhcyBBY3RpdmUgc2lnbmFsbGluZyB0aGF0IGNyZWF0aW9uIGlzIGNvbXBsZXRlIGFuZCBhbGxvd2luZwomIzQzOyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fYWN0aXZhdGUodW5zaWduZWQgbG9uZyByZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsICZhbXA7cmVzKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJlcy5hMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnMKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsCiYjNDM7CQkJCSAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLAomIzQzOwkJCQkgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICAgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pCiYjNDM7ewomIzQzOwlyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsCiYjNDM7CQkJCSAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwKJiM0MzsJCQkJICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUMKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDCiYjNDM7ICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnMKJiM0MzsgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZAomIzQzOyAqIHRvIGJ5IEBwYXJhbXMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19jcmVhdGUodW5zaWduZWQgbG9uZyByZCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIHBhcmFtcywKJiM0MzsJCQkJICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKQomIzQzO3sKJiM0MzsJbG9uZyByZXQ7CiYjNDM7CiYjNDM7CSpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0gewomIzQzOwkJU01DX1JNSV9SRUNfQ1JFQVRFLCByZCwgcmVjLCBwYXJhbXMKJiM0MzsJfX07CiYjNDM7CXJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7CiYjNDM7CXJtaV9zcm9fZnJlZShzcm8pOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcmVjX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBSRUMKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhIFJFQy4gVGhlIFJFQyBtdXN0IG5vdCBiZSBydW5uaW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybykKJiM0Mzt7CiYjNDM7CXJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCwgU01DX1JNSV9SRUNfREVTVFJPWSwgcmVjKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3JlY19lbnRlcigpIC0gRW50ZXIgYSBSRUMKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQwomIzQzOyAqIEBydW5fcHRyOiBQQSBvZiBSZWNSdW4gc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZW50ZXIodW5zaWduZWQgbG9uZyByZWMsIHVuc2lnbmVkIGxvbmcgcnVuX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKJiM0MzsKJiM0MzsJYXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgJmFtcDtyZXMpOwomIzQzOwomIzQzOwlyZXR1cm4gcmVzLmEwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X2NyZWF0ZSgpIC0gQ3JlYXRlcyBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUCiYjNDM7ICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUCiYjNDM7ICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZQomIzQzOyAqCiYjNDM7ICogQ3JlYXRlcyBhbiBSVFQgKFJlYWxtIFRyYW5zbGF0aW9uIFRhYmxlKSBhdCB0aGUgc3BlY2lmaWVkIGxldmVsIGZvciB0aGUKJiM0MzsgKiB0cmFuc2xhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGFkZHJlc3Mgd2l0aGluIHRoZSByZWFsbS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCwKJiM0MzsJCQkJICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbAomIzQzOwl9OwomIzQzOwomIzQzOwlyZXR1cm4gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbQomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogUlRUIGxldmVsCiYjNDM7ICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZAomIzQzOyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5CiYjNDM7ICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuCiYjNDM7ICoKJiM0MzsgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZQomIzQzOyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCSAgIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQkgICBsb25nIGxldmVsLAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LAomIzQzOwkJCQkgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfREVTVFJPWSwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUykgewomIzQzOwkJaWYgKG91dF9ydHQpCiYjNDM7CQkJKm91dF9ydHQgPSByZWdzLmExOwomIzQzOwkJaWYgKG91dF90b3ApCiYjNDM7CQkJKm91dF90b3AgPSByZWdzLmEyOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfZm9sZCgpIC0gRm9sZCBhbiBSVFQKJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVAomIzQzOyAqIEBsZXZlbDogRGVwdGggb2YgdGhlIFJUVCB3aXRoaW4gdGhlIHRyZWUKJiM0MzsgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkCiYjNDM7ICoKJiM0MzsgKiBGb2xkcyBhbiBSVFQuIElmIGFsbCBlbnRyaWVzIHdpdGggdGhlIFJUVCBhcmUgJiMzOTtob21vZ2VuZW91cyYjMzk7IHRoZSBSVFQgY2FuIGJlCiYjNDM7ICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGUKJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9mb2xkKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgaXBhLAomIzQzOwkJCQlsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nICpvdXRfcnR0KQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfRk9MRCwgcmQsIGlwYSwgbGV2ZWwKJiM0MzsJfTsKJiM0MzsJbG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoJmFtcDtyZWdzKTsKJiM0MzsKJiM0MzsJaWYgKHJldCA9PSBSTUlfU1VDQ0VTUyAmYW1wOyZhbXA7IG91dF9ydHQpCiYjNDM7CQkqb3V0X3J0dCA9IHJlZ3MuYTE7CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG0KJiM0MzsgKiBAcmQ6IFBBIG9mIHRoZSBSRAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkCiYjNDM7ICoKJiM0MzsgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfaW5pdF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLCB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfSU5JVF9SSVBBUywgcmQsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmcKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZAomIzQzOyAqCiYjNDM7ICogQ3JlYXRlIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKQomIzQzO3sKJiM0MzsJc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0gewomIzQzOwkJU01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgJmFtcDsmYW1wOyBvdXRfdG9wKQomIzQzOwkJKm91dF90b3AgPSByZWdzLmExOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBybWlfcnR0X3NldF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBhbiBydW5uaW5nIHJlYWxtCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAcmVjOiBQQSBvZiB0aGUgUkVDIG1ha2luZyB0aGUgcmVxdWVzdAomIzQzOyAqIEBiYXNlOiBCYXNlIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uCiYjNDM7ICogQG91dF90b3A6IFBvaW50ZXIgdG8gd3JpdGUgdG9wIElQQSBvZiByYW5nZSB3aG9zZSBSSVBBUyB3YXMgbW9kaWZpZWQKJiM0MzsgKgomIzQzOyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEKJiM0MzsgKiByYW5nZS4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZQomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X3NldF9yaXBhcyh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJlYywKJiM0MzsJCQkJICAgICB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgdG9wLAomIzQzOwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7CiYjNDM7CQlTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcAomIzQzOwl9OwomIzQzOwlsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZSgmYW1wO3JlZ3MpOwomIzQzOwomIzQzOwlpZiAocmV0ID09IFJNSV9TVUNDRVNTICZhbXA7JmFtcDsgb3V0X3RvcCkKJiM0MzsJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogcm1pX3J0dF91bnByb3RfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB3aXRoaW4gYW4gdW5wcm90ZWN0ZWQgSVBBIHJhbmdlCiYjNDM7ICogQHJkOiBQQSBvZiB0aGUgUkQKJiM0MzsgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmcKJiM0MzsgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2UKJiM0MzsgKiBAZmxhZ3M6IEZsYWdzCiYjNDM7ICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvcgomIzQzOyAqIEBvdXRfdG9wOiBUb3AgSVBBIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkCiYjNDM7ICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2UKJiM0MzsgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0CiYjNDM7ICoKJiM0MzsgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIGJhc2UsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIHRvcCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCiYjNDM7CQkJCQl1bnNpZ25lZCBsb25nIG9hZGRyLAomIzQzOwkJCQkJdW5zaWduZWQgbG9uZyAqb3V0X3RvcCwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSwKJiM0MzsJCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9jb3VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHsKJiM0MzsJCVNNQ19STUlfUlRUX1VOUFJPVF9VTk1BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyCiYjNDM7CX07CiYjNDM7CWxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKCZhbXA7cmVncyk7CiYjNDM7CiYjNDM7CWlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHsKJiM0MzsJCWlmIChvdXRfdG9wKQomIzQzOwkJCSpvdXRfdG9wID0gcmVncy5hMTsKJiM0MzsJCWlmIChvdXRfcmFuZ2UpCiYjNDM7CQkJKm91dF9yYW5nZSA9IHJlZ3MuYTI7CiYjNDM7CQlpZiAob3V0X2NvdW50KQomIzQzOwkJCSpvdXRfY291bnQgPSByZWdzLmEzOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi4zZWI4OGNhZjQwOTY0Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmgKQEAgLTAsMCAmIzQzOzEsNDk0IEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsvKgomIzQzOyAqIENvcHlyaWdodCAoQykgMjAyMy0yMDI2IEFSTSBMdGQuCiYjNDM7ICoKJiM0MzsgKiBUaGUgdmFsdWVzIGFuZCBzdHJ1Y3R1cmVzIGluIHRoaXMgZmlsZSBhcmUgZnJvbSB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yCiYjNDM7ICogc3BlY2lmaWNhdGlvbiAoREVOMDEzNykgdmVyc2lvbiAyLjAtYmV0MzoKJiM0MzsgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzLwomIzQzOyAqLwomIzQzOwomIzQzOyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfCiYjNDM7I2RlZmluZSBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYXJtLXNtY2NjLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdGZpZWxkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVpbGRfYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NpemVzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2FzbS9wYWdlLmgmZ3Q7CiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX0NBTEwoZnVuYykJCQkJXAomIzQzOwlBUk1fU01DQ0NfQ0FMTF9WQUwoQVJNX1NNQ0NDX0ZBU1RfQ0FMTCwJCVwKJiM0MzsJCQkgICBBUk1fU01DQ0NfU01DXzY0LAkJXAomIzQzOwkJCSAgIEFSTV9TTUNDQ19PV05FUl9TVEFOREFSRCwJXAomIzQzOwkJCSAgIChmdW5jKSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkVSU0lPTgkJCQlTTUNfUk1JX0NBTEwoMHgwMTUwKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVAkJU01DX1JNSV9DQUxMKDB4MDE1MykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTU4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1OSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSCQkJU01DX1JNSV9DQUxMKDB4MDE1YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNWQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE1ZSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUlkJCQlTTUNfUk1JX0NBTEwoMHgwMTYxKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFCQlTTUNfUk1JX0NBTEwoMHgwMTYzKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFCQkJU01DX1JNSV9DQUxMKDB4MDE2NCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMTY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfRk9MRAkJCVNNQ19STUlfQ0FMTCgweDAxNjYpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9JTklUX1JJUEFTCQkJU01DX1JNSV9DQUxMKDB4MDE2OCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9SSVBBUwkJCVNNQ19STUlfQ0FMTCgweDAxNjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURQkJCVNNQ19STUlfQ0FMTCgweDAxNmEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZTTU1VX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTZiKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVAkJCVNNQ19STUlfQ0FMTCgweDAxNmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0lSUV9OT1RJRlkJCVNNQ19STUlfQ0FMTCgweDAxNmYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0gJU01DX1JNSV9DQUxMKDB4MDE3MCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9BQk9SVAkJCVNNQ19STUlfQ0FMTCgweDAxNzQpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ09NTVVOSUNBVEUJCVNNQ19STUlfQ0FMTCgweDAxNzUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDE3NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9ERVNUUk9ZCQkJU01DX1JNSV9DQUxMKDB4MDE3NykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTc4KQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUkVGUkVTSAkJU01DX1JNSV9DQUxMKDB4MDE3YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZCQkJU01DX1JNSV9DQUxMKDB4MDE3YikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QCQkJU01DX1JNSV9DQUxMKDB4MDE3YykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTdkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTdlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTEQJCQlTTUNfUk1JX0NBTEwoMHgwMTdmKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUCQkJU01DX1JNSV9DQUxMKDB4MDE4NSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURQkJU01DX1JNSV9DQUxMKDB4MDE4NikKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9DUkVBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMTg3KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMTg4KQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURQkJCVNNQ19STUlfQ0FMTCgweDAxODkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfVU5MT0NLCQkJU01DX1JNSV9DQUxMKDB4MDE4YSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1NFVF9TMkFQCQkJU01DX1JNSV9DQUxMKDB4MDE4YikKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfSU5URVJGQUNFX1JFUE9SVAlTTUNfUk1JX0NBTEwoMHgwMWQwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFMJCVNNQ19STUlfQ0FMTCgweDAxZDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DSwkJCVNNQ19STUlfQ0FMTCgweDAxZDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1ZERVZfU1RBUlQJCQlTTUNfUk1JX0NBTEwoMHgwMWQzKQomIzQzOwomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEUJCVNNQ19STUlfQ0FMTCgweDAxZDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0FDVElWQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURQkJU01DX1JNSV9DQUxMKDB4MDFkOCkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFCQlTTUNfUk1JX0NBTEwoMHgwMWRiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9TVF9MMl9ERVNUUk9ZCQlTTUNfUk1JX0NBTEwoMHgwMWRjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkZCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWRlKQomIzQzOyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFkZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWUwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVAkJU01DX1JNSV9DQUxMKDB4MDFlMSkKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVQJCVNNQ19STUlfQ0FMTCgweDAxZTMpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDFlYykKJiM0MzsKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX1NUQVRFX0dFVAkJCVNNQ19STUlfQ0FMTCgweDAxZWUpCiYjNDM7CiYjNDM7I2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUUJCVNNQ19STUlfQ0FMTCgweDAxZjApCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfREVMRUdBVEUJCVNNQ19STUlfQ0FMTCgweDAxZjEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURQlTTUNfUk1JX0NBTEwoMHgwMWYyKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfQ1JFQVRFCQkJU01DX1JNSV9DQUxMKDB4MDFmMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0RFU1RST1kJCQlTTUNfUk1JX0NBTEwoMHgwMWY0KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWY1KQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfTUFQCQkJU01DX1JNSV9DQUxMKDB4MDFmNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUAkJCVNNQ19STUlfQ0FMTCgweDAxZjgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9NQVAJCVNNQ19STUlfQ0FMTCgweDAxZjkpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUAkJU01DX1JNSV9DQUxMKDB4MDFmYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX1VOUFJPVF9NQVAJCQlTTUNfUk1JX0NBTEwoMHgwMWZiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZjKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfTUFQCQlTTUNfUk1JX0NBTEwoMHgwMWZkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAxZmUpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUAkJU01DX1JNSV9DQUxMKDB4MDFmZikKJiM0MzsjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfVU5NQVAJCVNNQ19STUlfQ0FMTCgweDAyMDApCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDEpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDIpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFCQkJU01DX1JNSV9DQUxMKDB4MDIwMykKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNCkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVAkJU01DX1JNSV9DQUxMKDB4MDIwNSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09NUExFVEUJCVNNQ19STUlfQ0FMTCgweDAyMDYpCiYjNDM7I2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRQkJU01DX1JNSV9DQUxMKDB4MDIwNykKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURQkJCVNNQ19STUlfQ0FMTCgweDAyMDgpCiYjNDM7I2RlZmluZSBTTUNfUk1JX09QX01FTV9SRUNMQUlNCQkJU01DX1JNSV9DQUxMKDB4MDIwOSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfT1BfQ0FOQ0VMCQkJU01DX1JNSV9DQUxMKDB4MDIwYSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVMJCQlTTUNfUk1JX0NBTEwoMHgwMjBiKQomIzQzOyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfR0VUCQkJU01DX1JNSV9DQUxMKDB4MDIwYykKJiM0MzsjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0NPTVBMRVRFCQlTTUNfUk1JX0NBTEwoMHgwMjBkKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QU01NVV9JTkZPCQkJU01DX1JNSV9DQUxMKDB4MDIwZSkKJiM0MzsjZGVmaW5lIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUJCQlTTUNfUk1JX0NBTEwoMHgwMjBmKQomIzQzOyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPCQlTTUNfUk1JX0NBTEwoMHgwMjEwKQomIzQzOyNkZWZpbmUgU01DX1JNSV9HUFRfSU5GTwkJCVNNQ19STUlfQ0FMTCgweDAyMTEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT04JMgomIzQzOyNkZWZpbmUgUk1JX0FCSV9NSU5PUl9WRVJTSU9OCTAKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUFKT1IodmVyc2lvbikgKCh2ZXJzaW9uKSAmZ3Q7Jmd0OyAxNikKJiM0MzsjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSAmYW1wOyAweEZGRkYpCiYjNDM7I2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSAmbHQ7Jmx0OyAxNikgfCAobWlub3IpKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9TVEFUVVNfTUFTSwkJKDB4RkZVTCkKJiM0MzsjZGVmaW5lIFJNSV9SRVRVUk5fSU5ERVhfTUFTSwkJKDB4RkZVTCAmbHQ7Jmx0OyA4KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTSwkJKDB4M1VMICZsdDsmbHQ7IDgpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSwkoMHgxVUwgJmx0OyZsdDsgMTApCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9TVEFUVVNfTUFTSywgcmV0KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9JTkRFWChyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpCiYjNDM7I2RlZmluZSBSTUlfUkVUVVJOX01FTVJFUShyZXQpCQlGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KQomIzQzOyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldCkJRklFTERfR0VUKFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLLCByZXQpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfU1VDQ0VTUwkJCTAKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9JTlBVVAkJCTEKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTQkJCTIKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SRUMJCQkzCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUlRUCQkJNAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURUQJCTUKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0UJCTYKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9SVFRfQVVYCQk3CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1QJCTgKJiM0MzsjZGVmaW5lIFJNSV9FUlJPUl9EUFQJCQk5CiYjNDM7I2RlZmluZSBSTUlfQlVTWQkJCTEwCiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR0xPQkFMCQkxMQomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HCQkxMgomIzQzOyNkZWZpbmUgUk1JX0lOQ09NUExFVEUJCQkxMwomIzQzOyNkZWZpbmUgUk1JX0JMT0NLRUQJCQkxNAomIzQzOyNkZWZpbmUgUk1JX0VSUk9SX0dQVAkJCTE1CiYjNDM7I2RlZmluZSBSTUlfRVJST1JfR1JBTlVMRQkJMTYKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HCQkwCiYjNDM7I2RlZmluZSBSTUlfQ09OVElOVUVfU1RPUAkJMQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfTk9ORQkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFCQkxCiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NJWkVfTUFTSwkJM1VMCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0sJCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLCQlCSVQoMTYpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFX01BU0sJCUdFTk1BU0soMTgsIDE3KQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSkJCUZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVChyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT1VOVF9NQVNLLCByZXEpCiYjNDM7I2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKQomIzQzOyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpCQlGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfT1BfTUVNX0RFTEVHQVRFRAkJMAomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9VTkRFTEVHQVRFRAkJMQomIzQzOyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTAkJMgomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FCQkwCiYjNDM7I2RlZmluZSBSTUlfQUREUl9UWVBFX1NJTkdMRQkJMQomIzQzOyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUCQkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TSVpFX01BU0sJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSwlHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLCShQQUdFX01BU0sgJmFtcDsgR0VOTUFTSyg1MSwgMCkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLCUdFTk1BU0soNjMsIDYyKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU0laRShhcikJCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcCiYjNDM7CQkJCQkJICAgKGFyKSkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9DT1VOVChhcikJKEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcCiYjNDM7CQkJCQkJICAgKGFyKSkpCiYjNDM7I2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKGFyKQkJKChhcikgJmFtcDsgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKQomIzQzOyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpCShGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXAomIzQzOwkJCQkJCSAgIChhcikpKQomIzQzOwomIzQzO2VudW0gcm1pX3JpcGFzIHsKJiM0MzsJUk1JX0VNUFRZID0gMCwKJiM0MzsJUk1JX1JBTSA9IDEsCiYjNDM7CVJNSV9ERVNUUk9ZRUQgPSAyLAomIzQzOwlSTUlfREVWID0gMywKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVAkwCiYjNDM7I2RlZmluZSBSTUlfTUVBU1VSRV9DT05URU5UCTEKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWgkJR0VOTUFTSyg3LCAwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MUEEyCQlCSVQoOCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFCQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTlVNX0JQUwkJR0VOTUFTSygxOSwgMTQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFMJCUdFTk1BU0soMjUsIDIwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVUJCUJJVCgyNikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUE1VX05VTV9DVFJTCUdFTk1BU0soMzEsIDI3KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9MMEdQVF9CTE9DS19ERUxFR0FURQlCSVQoMzIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWgkJR0VOTUFTSyg0MCwgMzMpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQglCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQglCSVQoMSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQglCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfMjU2CUJJVCgzKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODQJQklUKDQpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzUxMglCSVQoNSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfTUFYX1JFQ1NfT1JERVIJR0VOTUFTSyg5LCA2KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaCQlHRU5NQVNLKDEzLCAxMCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUFBTCQlHRU5NQVNLKDE2LCAxNCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfREEJCUJJVCgwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0gJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9WU01NVQkJQklUKDIpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0FUUwkJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSCUdFTk1BU0soNywgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VCUJJVCg4KQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTQlCSVQoOSkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSCUdFTk1BU0soMTQsIDEwKQomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19NQVhfTlVNX0FVWF9QTEFORVMJR0VOTUFTSygzLCAwKQomIzQzOyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfM19SVFRfUExBTkUJCUdFTk1BU0soNSwgNCkKJiM0MzsjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1QJQklUKDYpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl80X01FQ19DT1VOVAkJR0VOTUFTSyg2MywgMCkKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMCQkwCiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09ICQkxCiYjNDM7I2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9DT0gJCTIKJiM0MzsjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfTk9ORQkJCTMKJiM0MzsKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRAkJCTAKJiM0MzsjZGVmaW5lIFJNSV9UUkFDS0lOR19OT05FCQkJMQomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0ZJTkUJCQkyCiYjNDM7I2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFCQkJMwomIzQzOyNkZWZpbmUgUk1JX1RSQUNLSU5HX0lOVEVSTUVESUFURQkJNAomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0IJMAomIzQzOyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV8xNktCCTEKJiM0MzsjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNjRLQgkyCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFUKJiM0MzsjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVQomIzQzOyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVCiYjNDM7I2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1UKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjQKJiM0MzsgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LgomIzQzOyAqLwomIzQzO3N0cnVjdCBybW1fY29uZmlnIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplOwomIzQzOwkJCXU2NCBybWlfZ3JhbnVsZV9zaXplOwomIzQzOwkJfTsKJiM0MzsJCXU4IHNpemVyW1NaXzRLXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBybW1fY29uZmlnKSA9PSBTWl80Syk7CiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkUJCUJJVCgxKQomIzQzOyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfUE1VCQlCSVQoMikKJiM0MzsjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBCQkJQklUKDMpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZCQlHRU5NQVNLKDYsIDUpCiYjNDM7I2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19NRUNfUE9MSUNZCQlHRU5NQVNLKDgsIDcpCiYjNDM7CiYjNDM7I2RlZmluZSBSTUlfSEFTSF9TSEFfMjU2CQkJMAomIzQzOyNkZWZpbmUgUk1JX0hBU0hfU0hBXzUxMgkJCTEKJiM0MzsjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODQJCQkyCiYjNDM7CiYjNDM7c3RydWN0IHJlYWxtX3BhcmFtcyB7CiYjNDM7CXVuaW9uIHsgLyogMHgwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCBmbGFnczA7CiYjNDM7CQkJdTY0IHMyc3o7CiYjNDM7CQkJdTY0IHN2ZV92bDsKJiM0MzsJCQl1NjQgbnVtX2JwczsKJiM0MzsJCQl1NjQgbnVtX3dwczsKJiM0MzsJCQl1NjQgcG11X251bV9jdHJzOwomIzQzOwkJCXU2NCBoYXNoX2FsZ287CiYjNDM7CQkJdTY0IG51bV9hdXhfcGxhbmVzOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4NDAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDQwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBycHZbNjRdOwomIzQzOwkJCXU2NCBhdHNfcGxhbmU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHg0MDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4ODAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCBwYWRkaW5nMjsKJiM0MzsJCQl1NjQgcnR0X2Jhc2U7CiYjNDM7CQkJczY0IHJ0dF9sZXZlbF9zdGFydDsKJiM0MzsJCQl1NjQgcnR0X251bV9zdGFydDsKJiM0MzsJCQl1NjQgZmxhZ3MxOwomIzQzOwkJCXU2NCBtYXhfbnVtX3ZkZXZzOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmczWzB4NzAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweGYwMCAqLwomIzQzOwkJc3RydWN0IHsKJiM0MzsJCQl1OCBwYWRkaW5nNFsweDgwXTsKJiM0MzsJCQl1NjQgYXV4X3J0dF9iYXNlWzNdOwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmc1WzB4MTAwXTsKJiM0MzsJfTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmUKJiM0MzsgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSUwkJOAomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1BBUkFNU19GTEFHX1JVTk5BQkxFCUJJVCgwKQomIzQzOwomIzQzO3N0cnVjdCByZWNfcGFyYW1zIHsKJiM0MzsJdW5pb24geyAvKiAweDAgKi8KJiM0MzsJCXU2NCBmbGFnczsKJiM0MzsJCXU4IHBhZGRpbmcwWzB4MTAwXTsKJiM0MzsJfTsKJiM0MzsJdW5pb24geyAvKiAweDEwMCAqLwomIzQzOwkJdTY0IG1waWRyOwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgcGM7CiYjNDM7CQl1OCBwYWRkaW5nMlsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgzMDAgKi8KJiM0MzsJCXU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107CiYjNDM7CQl1OCBwYWRkaW5nM1sweGQwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspOwomIzQzOwomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JTwlCSVQoMCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUEJQklUKDEpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSQkJQklUKDIpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGRQkJQklUKDMpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRQlCSVQoNCkKJiM0MzsjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1MyQVBfUkVTUE9OU0UJQklUKDUpCiYjNDM7I2RlZmluZSBSRUNfRU5URVJfRkxBR19ERVZfTUVNX1JFU1BPTlNFCUJJVCg2KQomIzQzOyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDAJCUJJVCg3KQomIzQzOwomIzQzOyNkZWZpbmUgUkVDX1JVTl9HUFJTCQkJMzEKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX2VudGVyIHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTY0IGZsYWdzOwomIzQzOwkJdTggcGFkZGluZzBbMHgyMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzFbMHg2MDBdOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19lbnRlcikgPT0gU1pfMkspOwomIzQzOwomIzQzOyNkZWZpbmUgUk1JX0VYSVRfU1lOQwkJCTB4MDAKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0lSUQkJCTB4MDEKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0ZJUQkJCTB4MDIKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1BTQ0kJCQkweDAzCiYjNDM7I2RlZmluZSBSTUlfRVhJVF9SSVBBU19DSEFOR0UJCTB4MDQKJiM0MzsjZGVmaW5lIFJNSV9FWElUX0hPU1RfQ0FMTAkJMHgwNQomIzQzOyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SCQkJMHgwNgomIzQzOyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0UJCTB4MDcKJiM0MzsjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElORwkweDA4CiYjNDM7I2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5ECQkweDBhCiYjNDM7CiYjNDM7c3RydWN0IHJlY19leGl0IHsKJiM0MzsJdW5pb24geyAvKiAweDAwMCAqLwomIzQzOwkJdTggZXhpdF9yZWFzb247CiYjNDM7CQl1OCBwYWRkaW5nMFsweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHgxMDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGVzcjsKJiM0MzsJCQl1NjQgZmFyOwomIzQzOwkJCXU2NCBocGZhcjsKJiM0MzsJCQl1NjQgcnR0X3RyZWU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzFbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MjAwICovCiYjNDM7CQl1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdOwomIzQzOwkJdTggcGFkZGluZzJbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4MzAwICovCiYjNDM7CQl1OCBwYWRkaW5nM1sweDEwMF07CiYjNDM7CX07CiYjNDM7CXVuaW9uIHsgLyogMHg0MDAgKi8KJiM0MzsJCXN0cnVjdCB7CiYjNDM7CQkJdTY0IGNudHBfY3RsOwomIzQzOwkJCXU2NCBjbnRwX2N2YWw7CiYjNDM7CQkJdTY0IGNudHZfY3RsOwomIzQzOwkJCXU2NCBjbnR2X2N2YWw7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzRbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NTAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU2NCByaXBhc19iYXNlOwomIzQzOwkJCXU2NCByaXBhc190b3A7CiYjNDM7CQkJdTggcmlwYXNfdmFsdWU7CiYjNDM7CQkJdTggcGFkZGluZzVbMHhmXTsKJiM0MzsJCQl1NjQgczJhcF9iYXNlOwomIzQzOwkJCXU2NCBzMmFwX3RvcDsKJiM0MzsJCQl1NjQgdmRldl9pZF8xOwomIzQzOwkJCXU2NCB2ZGV2X2lkXzI7CiYjNDM7CQkJdTY0IGRldl9tZW1fYmFzZTsKJiM0MzsJCQl1NjQgZGV2X21lbV90b3A7CiYjNDM7CQkJdTY0IGRldl9tZW1fcGE7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzZbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NjAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXUxNiBpbW07CiYjNDM7CQkJdTggcGFkZGluZzdbMHg2XTsKJiM0MzsJCQl1NjQgcGxhbmU7CiYjNDM7CQl9OwomIzQzOwkJdTggcGFkZGluZzhbMHgxMDBdOwomIzQzOwl9OwomIzQzOwl1bmlvbiB7IC8qIDB4NzAwICovCiYjNDM7CQlzdHJ1Y3QgewomIzQzOwkJCXU4IHBtdV9vdmZfc3RhdHVzOwomIzQzOwkJCXU4IHBhZGRpbmc5WzB4Zl07CiYjNDM7CQkJdTY0IHZzbW11OwomIzQzOwkJfTsKJiM0MzsJCXU4IHBhZGRpbmcxMFsweDEwMF07CiYjNDM7CX07CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2V4aXQpID09IFNaXzJLKTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjX3J1biB7CiYjNDM7CXN0cnVjdCByZWNfZW50ZXIgZW50ZXI7CiYjNDM7CXN0cnVjdCByZWNfZXhpdCBleGl0OwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTsKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi8KJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFCUdFTk1BU0soMSwgMCkKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7I2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTUVNQVRUUglHRU5NQVNLKDE4LCAxNikKJiM0MzsjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQCQlHRU5NQVNLKDIyLCAxOSkKJiM0MzsKJiM0MzsvKiBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTIGRlZmluaXRpb25zICovCiYjNDM7I2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX09BRERSX1RZUEUJR0VOTUFTSygxLCAwKQomIzQzOyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UCUdFTk1BU0soMTUsIDIpCiYjNDM7CiYjNDM7LyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovCiYjNDM7I2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfV1JJVEUJCQlCSVQoMCkKJiM0MzsjZGVmaW5lIFJNSV9TMkFQX0RJUkVDVF9SRUFECQkJQklUKDEpCiYjNDM7CiYjNDM7I2VuZGlmIC8qIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IXyAqLwo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzc4NwoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDYzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBSZWxldmFuY2UgdG8gQU1ENjQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UmIzM5O3ZlIGdvdCBhIHBhdGNoLCBhbmQgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgc3BlY2lmaWVkIGFzIGBhbWQ2NGAuIE15IGluaXRpYWwgdGFzayBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdGNoIGlzIHJlbGV2YW50IHRvIEFNRDY0LCBvciBpZiBpdCBjYW4gYmUgY29uc2lkZXJlZCBhICYjMzQ7d29ydGgtZnV6emluZyYjMzQ7IGNhbmRpZGF0ZS4gTGV0JiMzOTtzIGRlbHZlIGludG8gdGhlIGNoYW5nZXMuCgpJJiMzOTttIHNlZWluZyBtb2RpZmljYXRpb25zIHByaW1hcmlseSBjb25jZW50cmF0ZWQgYXJvdW5kIEFSTTY0LXNwZWNpZmljIGNvZGUuIFNwZWNpZmljYWxseToKCjEuICBgYXJjaC9hcm02NC9LY29uZmlnYCBpcyBiZWluZyBtb2RpZmllZCwgc2VsZWN0aW5nIGBBUkNIX1NVUFBPUlRTX1JNTWAuCjIuICBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCBpcyBiZWluZyB0b3VjaGVkLiBUaGlzIGlzIGFkZGluZyBhbiBgQVJNNjRfRlRSX0JJVFNgIGVudHJ5LCB2ZXJ5IHNwZWNpZmljYWxseSByZWxhdGVkIHRvIEFSTTY0IGZlYXR1cmUgaWRlbnRpZmljYXRpb24uCjMuICBXZSBoYXZlIGNoYW5nZXMgaW4gYGRyaXZlcnMvZmlybXdhcmVgIHdpdGggYWRkaXRpb25zIG9mIGBhcm1fcm1tYCBkaXJlY3RvcnkgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXM6IGBLY29uZmlnYCBhbmQgYE1ha2VmaWxlYC4gVGhpcyBhcHBlYXJzIHRvIGJlIGludGVncmF0aW5nIGEgbmV3IGNvbXBvbmVudCwgd2hpY2ggaW5jbHVkZXMgaXRzIG93biBLY29uZmlnIG9wdGlvbnMgYW5kIG1ha2VmaWxlIGVudHJpZXMsIGFuZCBzcGVjaWZpY2FsbHkgYSBmaWxlIGNhbGxlZCBgcm1pLmNgIHdoaWNoIGNvbnRhaW5zIHRoZSBjb3JlIG9mIHRoZSBBUk0gUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgaG9zdC1zaWRlIGRyaXZlci4KNC4gIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbmNsdWRlIGZpbGVzIGFkZGVkLCBgYXJtLXJtaS1jbWRzLmhgIGFuZCBgYXJtLXNtY2NjLXJtaS5oYCwgYWdhaW4sIHN1Z2dlc3RpbmcgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byBBUk0gYXJjaGl0ZWN0dXJlcy4KCkhvbGQgb24gYSBtb21lbnQsIHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gSSBuZWVkIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGlzIGJhY2sgdG8gdGhlICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsgY3JpdGVyaWEuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHNob3VsZCBiZSBpZ25vcmVkIGlmIGFsbCBvZiB0aGUgbW9kaWZpY2F0aW9ucyBmYWxsIGludG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgoqICAgVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzICh0ZWFyZG93biBjYWxsYmFja3MsIGV0Yy4pCiogICBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgpBbmQgZ2l2ZW4gdGhhdCB3ZSBhcmUgdGFyZ2V0aW5nIGBhbWQ2NGAsIGl0JiMzOTtzIGNsZWFyIHdlIHNob3VsZCBiZSBmb2N1c2VkIG9uIHRoZSBzZWNvbmQgcG9pbnQuCgpMZXQmIzM5O3MgdmVyaWZ5IHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyAqbm90KiBlbmFibGVkIG9uIGFtZDY0LiBJdCBsb29rcyBsaWtlIGBBUk1fUk1NX1JNSWAgZGlyZWN0bHkgZGVwZW5kcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLCBhbmQgSSBjYW4gc2VlIHRoYXQgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgYnkgYGNvbmZpZyBBUk02NGAgd2l0aGluIGBhcmNoL2FybTY0L0tjb25maWdgLiBJdCBkb2VzbiYjMzk7dCBhcHBlYXIgdGhpcyB3aWxsIGJlIHNlbGVjdGVkIGJ5IHg4Ni9hbWQ2NC4gSSYjMzk7bGwgY29uZmlybSB3aXRoIGEgYGdyZXBwZXJgIGNoZWNrIHRvIGJlIGNlcnRhaW4gdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzICpub3QqIHNlbGVjdGVkIGJ5IHg4Ni4KCk15IGNvbmNsdXNpb24gYXQgdGhpcyBwb2ludCwgYmFycmluZyBhbnkgdW5mb3Jlc2VlbiBkZXBlbmRlbmNpZXMsIGlzIHRoYXQgdGhpcyBwYXRjaCBpcyBsaWtlbHkgKm5vdCogcmVsZXZhbnQgdG8gQU1ENjQgYW5kIGNhbiBwcm9iYWJseSBiZSBjb25zaWRlcmVkICYjMzQ7V29ydGhGdXp6aW5nPWZhbHNlJiMzNDsuIEkganVzdCBuZWVkIHRvIHZlcmlmeSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgbm90IHByZXNlbnQgaW4gdGhlIHg4Ni9hbWQ2NCBidWlsZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtBUkNIX1NVUFBPUlRTX1JNTSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDthcmNoL2FybTY0L0tjb25maWc9Mj1jb25maWcgQVJNNjRcbi0tXG5hcmNoL2FybTY0L0tjb25maWctNDAtXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcbmFyY2gvYXJtNjQvS2NvbmZpZzo0MTpcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxuYXJjaC9hcm02NC9LY29uZmlnLTQyLVx0c2VsZWN0IEFSQ0hfSEFTX05NSV9TQUZFX1RISVNfQ1BVX09QU1xuLS1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTEtXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzoyOmNvbmZpZyBBUkNIX1NVUFBPUlRTX1JNTVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cdGJvb2xcbi0tXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctNi1cdGJvb2wgXCYjMzQ7UmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFwmIzM0O1xuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWc6NzpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTgtXHRkZWZhdWx0IHlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNyAxNDo1MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTMyMwoJCQkJCQkJb3V0cHV0OiAxMjAKCQkJCQkJCXRob3VnaHRzOiA2MjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiBUaGlzIFBhdGNoJiMzOTtzIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgc2NhbiBmbGFnZ2VkIHNvbWUgZmlsZXMgcmVsYXRlZCB0byBgYXJtX3JtbWAsIGBBUk1fUk1NX1JNSWAsIGFuZCBjb2RlIHRvdWNoZWQgYnkgdGhpcyBwYXRjaCwgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJiMzOTt0IGltcGFjdCBteSBhcmVhIG9mIGV4cGVydGlzZS4gSSBpbW1lZGlhdGVseSBsb29rZWQgZm9yIGFueSBwb3RlbnRpYWwgY3Jvc3NvdmVyIG9uIHg4Ni9hbWQ2NC4KCkZpcnN0LCBJIGlkZW50aWZpZWQgdGhlIG1vZGlmaWVkIGZpbGVzOiBgYXJjaC9hcm02NC9LY29uZmlnYCwgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AsIGFuZCBzbyBvbi4gUmlnaHQgYXdheSwgdGhlc2UgZmlsZXMgbG9vayBBUk0tc3BlY2lmaWMuIEkgc2VlIGBybWkuY2AgaW5jbHVkZXMgYCZsdDthc20vbWVtb3J5LmgmZ3Q7YCBhbmQgYCZsdDthc20vcGd0YWJsZS1od2RlZi5oJmd0O2AsIGJvdGggb2Ygd2hpY2ggc2NyZWFtIEFSTS4gRnVydGhlcm1vcmUsIGBBUk1fUk1NX1JNSWAgcmVsaWVzIG9uIGBBUkNIX1NVUFBPUlRTX1JNTWAsIHdoaWNoIGlzIHNwZWNpZmljYWxseSBzZWxlY3RlZCBvbmx5IHdoZW4gYnVpbGRpbmcgZm9yIGBBUk02NGAuIE9uIG15IHRhcmdldCBhcmNoaXRlY3R1cmUsIGFtZDY0L3g4Nl82NCwgYEFSQ0hfU1VQUE9SVFNfUk1NYCBpcyAqbm90KiBlbmFibGVkLCBzbyBgQVJNX1JNTV9STUlgIGlzIHVucmVhY2hhYmxlLCBhbmQgYHJtaS5jYCBpcyBub3QgZXZlbiBjb21waWxlZC4gSSBhbHNvIG5vdGVkIHRoYXQgYWxsIG90aGVyIGZpbGVzIGFyZSBhbHNvIGVpdGhlciBpbiB0aGUgYGFyY2gvYXJtNjQvYCBkaXJlY3Rvcnkgb3IgaW52b2x2ZSBBUk0tc3BlY2lmaWMgZmlybXdhcmUgaGVhZGVycyBhbmQgZHJpdmVycy4KCkdpdmVuIHRoaXMsIGl0JiMzOTtzIHByZXR0eSBjbGVhcjogdGhpcyBwYXRjaCBpcyBzdHJpY3RseSBBUk02NC1zcGVjaWZpYy4gSXQmIzM5O3MgaW50cm9kdWNpbmcgUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgc3VwcG9ydCwgYW5kIHRoZSBhc3NvY2lhdGVkIENQVSBmZWF0dXJlIGRlZmluaXRpb25zIGFyZSBhbGwgdGllZCB0byB0aGF0IGFyY2hpdGVjdHVyZS4gVGhlcmUmIzM5O3MgemVybyBjaGFuY2Ugb2YgdGhpcyBwYXRjaCBoYXZpbmcgYW55IGltcGFjdCBvbiB4ODYvYW1kNjQuCgpOb3csIGxldCYjMzk7cyBkb3VibGUtY2hlY2sgdGhlIHRyaWFnZSBjcml0ZXJpYS4gVGhlICYjMzQ7dW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzJiMzNDsgY3JpdGVyaW9uIGNvdmVycyB0aGlzIHBlcmZlY3RseTogdGhpcyBpcyBjb2RlIGV4Y2x1c2l2ZSB0byBhbiBhcmNoaXRlY3R1cmUgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gVGhpcyBtZWFucywgd2l0aG91dCBhIGRvdWJ0LCBJIG5lZWQgdG8gY2FsbCBgc2V0LXJlc3VsdHNgIHdpdGg6CgoqICAgYFdvcnRoRnV6emluZzogZmFsc2VgCiogICBgRm9jdXNTeW1ib2xzOiBbXWAKKiAgIGBFbmFibGVDb25maWdzOiBbXWAKKiAgIGBSZWFzb25pbmdgOiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBzdXBwb3J0IGFuZCBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIGRlZmluaXRpb25zLCB3aGljaCBkZXBlbmQgb24gQVJDSFxfU1VQUE9SVFNcX1JNTSAoc2VsZWN0ZWQgb25seSBieSBBUk02NCkuIE5vbmUgb2YgdGhlIG1vZGlmaWVkIGNvZGUgaXMgY29tcGlsZWQgb3IgcmVhY2hhYmxlIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChhbWQ2NCkuJiMzNDsKCkVhc3kgZGVjaXNpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDcgMTQ6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjI1Ljk2MzM1MDk4WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ3MTExMDE3MzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MjUuOTYzMzU3NjFaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjE5MDI2NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA5YWM0NzMyYzNkNGMwYThjNjA0MTFhMzI2OTQ4MDk2MDU0YWYyOTc4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gU2VwIDcgMTQ6NTE6MjMgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnXFxuaW5kZXggYjVhNTFiMGVmOTQ0MC4uZmY5NTY1ZDNmZmE1OSAxMDA2NDRcXG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcXG4rKysgYi9hcmNoL2FybTY0L0tjb25maWdcXG5AQCAtMzgsNiArMzgsNyBAQCBjb25maWcgQVJNNjRcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX01FTUJBUlJJRVJfU1lOQ19DT1JFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxcbiBcXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0VBTF9TWVNURU1fTUFQUElOR1NcXG4rXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfUk1NXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcXG4gXFx0c2VsZWN0IEFSQ0hfSEFTX05PTl9PVkVSTEFQUElOR19BRERSRVNTX1NQQUNFXFxuIFxcdHNlbGVjdCBBUkNIX0hBU19OT05MRUFGX1BNRF9ZT1VORyBpZiBBUk02NF9IQUZUXFxuZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xcbmluZGV4IDE3YjgzYTI1MThhOGYuLmRiMjZmNmIwZWFmNWUgMTAwNjQ0XFxuLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jXFxuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHtcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcXG4gXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YyX1NISUZULCA0LCAwKSxcXG4rXFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9STUVfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxcbiBcXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX0FNVV9TSElGVCwgNCwgMCksXFxuIFxcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfTVBBTV9TSElGVCwgNCwgMCksXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuKysrIGIvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnXFxuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc2Ftc3VuZy9LY29uZmlnXFxcIlxcbiBzb3VyY2UgXFxcImRyaXZlcnMvZmlybXdhcmUvc21jY2MvS2NvbmZpZ1xcXCJcXG4gc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcXFwiXFxuIHNvdXJjZSBcXFwiZHJpdmVycy9maXJtd2FyZS94aWxpbngvS2NvbmZpZ1xcXCJcXG4rc291cmNlIFxcXCJkcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xcXCJcXG4gXFxuIGVuZG1lbnVcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG5pbmRleCBiZTQ2ZjFlMWRjNzdmLi4xOTZhNjUwY2NmMDI1IDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXFxuQEAgLTM5LDMgKzM5LDQgQEAgb2JqLXlcXHRcXHRcXHRcXHQrPSBzYW1zdW5nL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHNtY2NjL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHRlZ3JhL1xcbiBvYmoteVxcdFxcdFxcdFxcdCs9IHhpbGlueC9cXG4rb2JqLXlcXHRcXHRcXHRcXHQrPSBhcm1fcm1tL1xcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi44MjcyNGVlMjMxODZkXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXFxuQEAgLTAsMCArMSwyNiBAQFxcbitcXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGJvb2xcXG4rXFxuK2NvbmZpZyBBUk1fUk1NX1JNSVxcbitcXHRib29sIFxcXCJSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBTdXBwb3J0XFxcIlxcbitcXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXFxuK1xcdGRlZmF1bHQgeVxcbitcXHRoZWxwXFxuK1xcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcXG4rXFx0ICBpbXBsZW1lbnQgdGhlIFJlYWxtIE1hbmFnZW1lbnQgRXh0ZW5zaW9uIChSTUUpLCBhcyBkZWZpbmVkIGJ5IHRoZVxcbitcXHQgIEFybSBDb25maWRlbnRpYWwgQ29tcHV0ZSBBcmNoaXRlY3R1cmUuXFxuK1xcbitcXHQgIFRoZSBSTU0gcnVucyBhdCBFTDIgaW4gdGhlIFJlYWxtIHdvcmxkIGFuZCBwcm92aWRlcyB0aGUgUmVhbG1cXG4rXFx0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxcbitcXHQgIG1hbmFnZSBhbmQgcnVuIHByb3RlY3RlZCB2aXJ0dWFsIG1hY2hpbmVzIGNhbGxlZCBSZWFsbXMuIFRoZSBSTU0gY2FuXFxuK1xcdCAgYWxzbyBhY3QgYXMgYSBUU00sIGFzIGRlZmluZWQgYnkgdGhlIFBDSWUgVERJU1AgYW5kIGNhbiBtYW5hZ2UgdGhlXFxuK1xcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXFxuK1xcbitcXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0sIGNvbmZpZ3VyZSBpdCwgbWFuYWdlIGRlbGVnYXRlZCBtZW1vcnkgYW5kIGVuYWJsZVxcbitcXHQgIFJlYWxtIGd1ZXN0cy5cXG4rXFxuK1xcdCAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIGRvZXMgbm90IGJ5IGl0c2VsZiBtYWtlIFJlYWxtIGd1ZXN0cyBhdmFpbGFibGU6XFxuK1xcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXFxuK1xcdCAgY29tcGF0aWJsZSBSTU0gaW1wbGVtZW50YXRpb24uXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjUxNzE5ODhmZGNhZVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vTWFrZWZpbGVcXG5AQCAtMCwwICsxLDIgQEBcXG4rXFxuK29iai0kKENPTkZJR19BUk1fUk1NX1JNSSlcXHQ9IHJtaS5vXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMzQwNThlMzQxODhkM1xcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vcm1pLmNcXG5AQCAtMCwwICsxLDgxOSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxcbisgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tZW1ibG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtb3J5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9tZW1vcnkuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcXHUwMDNlXFxuK1xcbitzdGF0aWMgYm9vbCBhcm02NF9ybWlfaXNfYXZhaWxhYmxlO1xcbitcXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXFxuKyNkZWZpbmUgUk1JX0ZFQVRfUkVHX0NPVU5UXFx0MlxcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKVxcbit7XFxuK1xcdGlmIChXQVJOX09OKGlkIFxcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2ZlYXRfcmVnKTtcXG4rXFxuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cyxcXG4rXFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSxcXG4rXFx0XFx0ICAgICAgIHBoeXNfYWRkcl90ICpvdXRfcGh5cylcXG4re1xcbitcXHRsb25nIHJldCA9IDA7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgb3V0X3RvcDtcXG4rXFxuK1xcdHdoaWxlIChwaHlzIFxcdTAwM2MgdG9wKSB7XFxuK1xcdFxcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXFx1MDAyNm91dF90b3ApO1xcbitcXHRcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRwaHlzID0gb3V0X3RvcDtcXG4rXFx0XFx0ZWxzZSBpZiAocmV0ID09IFJNSV9CVVNZIHx8IHJldCA9PSBSTUlfQkxPQ0tFRClcXG4rXFx0XFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChvdXRfcGh5cylcXG4rXFx0XFx0Km91dF9waHlzID0gcGh5cztcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX2RlbGVnYXRlX3JhbmdlKTtcXG4rXFxuK2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxcbitcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdGxvbmcgcmV0ID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyB0b3AgPSBwaHlzICsgc2l6ZTtcXG4rXFx0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xcbitcXG4rXFx0d2hpbGUgKHBoeXMgXFx1MDAzYyB0b3ApIHtcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZShwaHlzLCB0b3AsIFxcdTAwMjZvdXRfdG9wKTtcXG4rXFx0XFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUylcXG4rXFx0XFx0XFx0cGh5cyA9IG91dF90b3A7XFxuK1xcdFxcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXFxuK1xcdFxcdFxcdGNwdV9yZWxheCgpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSlcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xcbitcXG4rXFx0cmV0dXJuIEJJVChBUk02NF9IV19QR1RBQkxFX0xFVkVMX1NISUZUKDMgLSB1bml0X3NpemUpKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX3NtY2NjX2ludm9rZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzX2luLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXR1cztcXG4rXFxuK1xcdHdoaWxlICgxKSB7XFxuK1xcdFxcdGFybV9zbWNjY18xXzJfaW52b2tlKFxcdTAwMjZyZWdzLCByZWdzX291dCk7XFxuK1xcdFxcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVxcdTAwM2VhMCk7XFxuK1xcdFxcdGlmIChzdGF0dXMgIT0gUk1JX0JVU1kgXFx1MDAyNlxcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0Y3B1X3JlbGF4KCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9PUF9DT05USU5VRSwgc3JvX2hhbmRsZSwgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX2NhbmNlbCh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX0NBTkNFTCwgc3JvX2hhbmRsZVxcbitcXHR9O1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShcXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBybWlfb3BfbWVtX2RvbmF0ZSh1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdCAgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9PUF9NRU1fRE9OQVRFLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnQsIGZsYWdzXFxuK1xcdH07XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3V0cHV0IGRvbmF0ZWQgY291bnQgKGExKSBpcyBhbHdheXMgdmFsaWQsIGlycmVzcGVjdGl2ZVxcbitcXHQgKiBvZiB0aGUgcmV0dXJuIHJlc3VsdC4gaS5lLiwgMCBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcXG4rXFx0ICovXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9hZGRyLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2NvdW50LFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcXG4rXFx0fTtcXG4rXFxuK1xcdHJtaV9zbWNjY19pbnZva2UoXFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcXG4rfVxcbitcXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XFxuK1xcdFxcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXFxuK1xcdFxcdHJldHVybiAtRUJVU1k7XFxuK1xcdH1cXG4rXFxuK1xcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocGh5cykpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwoZnJlZV9kZWxlZ2F0ZWRfcGFnZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgY291bnQpXFxuK3tcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzcm8tXFx1MDAzZWFkZHJfY291bnQgXFx1MDAzZSBSTUlfTUFYX0FERFJfTElTVCkpXFxuK1xcdFxcdHJldHVybiAtRU9WRVJGTE9XO1xcbitcXG4rXFx0aWYgKGNvdW50IFxcdTAwM2UgUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQpXFxuK1xcdFxcdHJldHVybiAtRU5PU1BDO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxcbitcXHRcXHRcXHRcXHQgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplX2J5dGVzID0gZG9uYXRlX3JlcV90b19zaXplKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IHVuaXRfc2l6ZV9ieXRlcyAqIGNvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdGludCByZXQ7XFxuK1xcdHZvaWQgKnZpcnQ7XFxuK1xcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgUk1NIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgY29udGlndW91cyBhbGxvY2F0aW9ucyBhcmUgYWx3YXlzIGFcXG4rXFx0ICogcG93ZXIgb2YgMlxcbitcXHQgKi9cXG4rXFx0aWYgKFdBUk5fT05fT05DRSghaXNfcG93ZXJfb2ZfMihzaXplKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzcm8tXFx1MDAzZWFkZHJfY291bnQ7IGkrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGVudHJ5ID0gc3JvLVxcdTAwM2VhZGRyX2xpc3RbaV07XFxuK1xcbitcXHRcXHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gY291bnQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHtcXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50LS07XFxuK1xcdFxcdFxcdHN3YXAoc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSxcXG4rXFx0XFx0XFx0ICAgICBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXSk7XFxuK1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0dmlydCA9IGFsbG9jX3BhZ2VzX2V4YWN0KHNpemUsIGdmcCk7XFxuK1xcdGlmICghdmlydClcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdHBoeXMgPSB2aXJ0X3RvX3BoeXModmlydCk7XFxuK1xcbitcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XFxuK1xcbitcXHRcXHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFxcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcXG4rXFx0XFx0XFx0aWYgKCFybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzLCBkZWxlZ2F0ZWRfcGh5cyAtIHBoeXMpKVxcbitcXHRcXHRcXHRcXHRmcmVlX3BhZ2VzX2V4YWN0KHZpcnQsIHNpemUpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGFkZHJfcmFuZ2UgPSBwaHlzIFxcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xcbitcXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcXG4rXFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcdTAwMjZhZGRyX3JhbmdlLCBjb3VudCk7XFxuK1xcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xcbitcXG4rXFx0c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSA9IGFkZHJfcmFuZ2U7XFxuK1xcbitvdXQ6XFxuK1xcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSwgMSxcXG4rXFx0XFx0XFx0ICAwLCBvdXRfcmVncyk7XFxuK1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9zaXplID0gZG9uYXRlZF9ncmFudWxlcyBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUO1xcbitcXG4rXFx0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xcbitcXHRcXHQvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi9cXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2NvdW50Kys7XFxuK1xcdH0gZWxzZSBpZiAoZG9uYXRlZF9zaXplIFxcdTAwM2Mgc2l6ZSkge1xcbitcXHRcXHRwaHlzID0gc3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50XSBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFxuK1xcdFxcdC8qIE5vdCBhbGwgZ3JhbnVsZXMgdXNlZCBieSB0aGUgUk1NLCBmcmVlIHRoZSByZW1haW5pbmcgcGFnZXMgKi9cXG4rXFx0XFx0Zm9yIChsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXFx1MDAzYyBzaXplOyBpICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpXFxuK1xcdFxcdFxcdFxcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xcbitcXHRcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdFxcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncyxcXG4rXFx0XFx0XFx0XFx0ICAgIGdmcF90IGdmcClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0RPTkFURV9DT1VOVChkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xcbitcXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3Rfc3RhcnQgPSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcXHUwMDI2XFx1MDAyNiBmb3VuZCBcXHUwMDNjIGNvdW50OyBpKyspIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cXHUwMDNlYWRkcl9saXN0W2ldO1xcbitcXG4rXFx0XFx0aWYgKFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpID09IHVuaXRfc2l6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IDEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xcbitcXHRcXHRcXHRhZGRyX2xpc3Rfc3RhcnQtLTtcXG4rXFx0XFx0XFx0c3dhcChzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxcbitcXHRcXHRcXHQgICAgIHNyby1cXHUwMDNlYWRkcl9saXN0W2ldKTtcXG4rXFx0XFx0XFx0Zm91bmQrKztcXG4rXFx0XFx0XFx0aS0tO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3aGlsZSAoZm91bmQgXFx1MDAzYyBjb3VudCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XFxuK1xcdFxcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7XFxuK1xcdFxcdHBoeXNfYWRkcl90IHBoeXM7XFxuK1xcbitcXHRcXHRpZiAoIXZpcnQpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0XFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcXG4rXFxuK1xcdFxcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRCkge1xcbitcXHRcXHRcXHRwaHlzX2FkZHJfdCBkZWxlZ2F0ZWRfcGh5cztcXG4rXFxuK1xcdFxcdFxcdGlmIChybWlfZGVsZWdhdGVfcmFuZ2UocGh5cywgdW5pdF9zaXplX2J5dGVzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xcbitcXHRcXHRcXHRcXHRpZiAoIXJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIGRlbGVnYXRlZF9waHlzIC0gcGh5cykpXFxuK1xcdFxcdFxcdFxcdFxcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgdW5pdF9zaXplX2J5dGVzKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRhZGRyX3JhbmdlID0gcGh5cyBcXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcXG4rXFx0XFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XFxuK1xcdFxcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgMSk7XFxuK1xcdFxcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xcbitcXG4rXFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3Rbc3JvLVxcdTAwM2VhZGRyX2NvdW50KytdID0gYWRkcl9yYW5nZTtcXG4rXFx0XFx0Zm91bmQrKztcXG4rXFx0fVxcbitcXG4rXFx0cm1pX29wX21lbV9kb25hdGUoc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB2aXJ0X3RvX3BoeXMoXFx1MDAyNnNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydF0pLFxcbitcXHRcXHRcXHQgIGZvdW5kLCAwLCBvdXRfcmVncyk7XFxuK1xcbitcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4rXFx0dW5zaWduZWQgbG9uZyBjb25zdW1lZF91bml0cztcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxcbitcXHQgKiBqdXN0IGluIGNhc2UuXFxuK1xcdCAqL1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXFx1MDAzZSBmb3VuZCAqIGdyYW51bGVzX3Blcl91bml0KSlcXG4rXFx0XFx0ZG9uYXRlZF9ncmFudWxlcyA9IGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXFxuK1xcdCAqIHRyYWNrIGluIHRoZSBhZGRyZXNzIGxpc3RzIGluIHVuaXQtc2l6ZWQgcmFuZ2VzLiBTbyBkaXZpZGUgdG8gZ2V0XFxuK1xcdCAqIHRoZSBudW1iZXIgb2YgKGNvbXBsZXRlKSBjb25zdW1lZCB1bml0cy5cXG4rXFx0ICovXFxuK1xcdGNvbnN1bWVkX3VuaXRzID0gZG9uYXRlZF9ncmFudWxlcyAvIGdyYW51bGVzX3Blcl91bml0O1xcbitcXHRpZiAoZG9uYXRlZF9ncmFudWxlcyAlIGdyYW51bGVzX3Blcl91bml0KSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEEgdW5pdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29uc3VtZWQsIHRoZSBzdGFydCBpcyBvd25lZCBieVxcbitcXHRcXHQgKiB0aGUgUk1NLCB0aGUgdGFpbCBpcyBvd25lZCBieSB0aGUgaG9zdFxcbitcXHRcXHQgKi9cXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9XFxuK1xcdFxcdFxcdHNyby1cXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGNvbnN1bWVkX3VuaXRzXTtcXG4rXFx0XFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XFxuK1xcdFxcdFxcdChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHQvKiBGcmVlIHRoZSB0YWlsIGJhY2sgKi9cXG4rXFx0XFx0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBkb25hdGVkX3NpemU7IGkgXFx1MDAzYyB1bml0X3NpemVfYnl0ZXM7XFxuK1xcdFxcdCAgICAgaSArPSBQQUdFX1NJWkUpIHtcXG4rXFx0XFx0XFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxcbitcXHRcXHRcXHRcXHRmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXMgKyBpKTtcXG4rXFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRfX2ZyZWVfcGFnZShwaHlzX3RvX3BhZ2UocGh5cyArIGkpKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXFxuK1xcdFxcdCAqIGZyZWVkKVxcbitcXHRcXHQgKi9cXG4rXFx0XFx0Y29uc3VtZWRfdW5pdHMrKztcXG4rXFx0fVxcbitcXG4rXFx0LyogS2VlcCBqdXN0IHRoZSB1bml0cyB0aGUgUk1NIGRpZG4ndCB1c2UgaW4gYWRkcl9saXN0ICovXFxuK1xcdGZvciAodW5zaWduZWQgbG9uZyBpID0gY29uc3VtZWRfdW5pdHM7IGkgXFx1MDAzYyBmb3VuZDsgaSsrKVxcbitcXHRcXHRzcm8tXFx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfdW5pdHNdID1cXG4rXFx0XFx0XFx0c3JvLVxcdTAwM2VhZGRyX2xpc3RbYWRkcl9saXN0X3N0YXJ0ICsgaV07XFxuK1xcbitcXHRzcm8tXFx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxcbitcXHRcXHRcXHQgIGdmcF90IGdmcClcXG4re1xcbitcXHRpZiAoV0FSTl9PTl9PTkNFKCFSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSkpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGlmIChSTUlfRE9OQVRFX0NPTlRJRyhkb25hdGVyZXEpKSB7XFxuK1xcdFxcdHJldHVybiBybWlfc3JvX2RvbmF0ZV9jb250aWcoc3JvLCBzcm9faGFuZGxlLCBkb25hdGVyZXEsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcmVncywgZ2ZwKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0cmVncywgZ2ZwKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxcbitcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgY2FwYWNpdHk7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2Vuc3VyZV9jYXBhY2l0eShzcm8sIDEpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRybWlfc3JvX2ZyZWUoc3JvKTtcXG4rXFxuK1xcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXFx1MDAzZWFkZHJfY291bnQ7XFxuK1xcbitcXHRybWlfb3BfbWVtX3JlY2xhaW0oc3JvX2hhbmRsZSxcXG4rXFx0XFx0XFx0ICAgdmlydF90b19waHlzKFxcdTAwMjZzcm8tXFx1MDAzZWFkZHJfbGlzdFtzcm8tXFx1MDAzZWFkZHJfY291bnRdKSxcXG4rXFx0XFx0XFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcXG4rXFxuK1xcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXFx1MDAzZWExIFxcdTAwM2UgY2FwYWNpdHkpKVxcbitcXHRcXHRvdXRfcmVncy1cXHUwMDNlYTEgPSBjYXBhY2l0eTtcXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCArPSBvdXRfcmVncy1cXHUwMDNlYTE7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIHNyby1cXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXFx1MDAzZWFkZHJfbGlzdFtpXTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyID0gUk1JX0FERFJfUkFOR0VfQUREUihlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfQUREUl9SQU5HRV9TVEFURShlbnRyeSk7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSA9IGRvbmF0ZV9yZXFfdG9fc2l6ZSh1bml0X3NpemUpICogY291bnQ7XFxuK1xcbitcXHRcXHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShybWlfdW5kZWxlZ2F0ZV9yYW5nZShhZGRyLCBzaXplKSkpIHtcXG4rXFx0XFx0XFx0XFx0LyogTGVhayB0aGUgcGFnZXMgKi9cXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHNyby1cXHUwMDNlYWRkcl9jb3VudCA9IDA7XFxuK31cXG4rRVhQT1JUX1NZTUJPTF9HUEwocm1pX3Nyb19mcmVlKTtcXG4rXFxuK2xvbmcgcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybywgZ2ZwX3QgZ2ZwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFxcdTAwMjZzcm8tXFx1MDAzZXJlZ3M7XFxuK1xcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XFxuK1xcbitcXHRybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpO1xcbitcXG4rXFx0c3JvX2hhbmRsZSA9IHJlZ3MtXFx1MDAzZWExO1xcbitcXG4rXFx0d2hpbGUgKFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3MtXFx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xcbitcXHRcXHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cXHUwMDNlYTApO1xcbitcXHRcXHRpbnQgcmV0ID0gMDtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfRE9OQVRFOlxcbitcXHRcXHRcXHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXFx1MDAzZWEyLCByZWdzLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIGdmcCk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU06XFxuK1xcdFxcdFxcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0ZGVmYXVsdDpcXG4rXFx0XFx0XFx0cmV0ID0gV0FSTl9PTl9PTkNFKDEpO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxcbitcXHRcXHRcXHQgKiBmYWlsdXJlIGluIG1lbW9yeSBhbGxvY2F0aW9uIHNob3VsZG4ndCBiZSBhbiBpc3N1ZS5cXG4rXFx0XFx0XFx0ICogSG93ZXZlciwgaWYgd2UgZW5jb3VudGVyIGEgcmFuZG9tIGZhaWx1cmUgKGUuZy4sXFxuK1xcdFxcdFxcdCAqIGJ1Z2d5IFJNTSksIGRvbid0IGxvb3AgZm9yZXZlciwganVzdCBnaXZlIHVwLlxcbitcXHRcXHRcXHQgKi9cXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRSghY2FuX2NhbmNlbCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHRcXHRjYW5jZWxsZWQgPSB0cnVlO1xcbitcXG4rXFx0XFx0XFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgIT0gUk1JX0lOQ09NUExFVEUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjYW5jZWxsZWQpXFxuK1xcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKTtcXG4rXFxuKy8qIEZvciBSTUkgY29tbWFuZHMgdGhhdCBhcmUgc3RhdGVmdWwgYnV0IG5vdCBtZW1vcnktdHJhbnNmZXJyaW5nICovXFxuK2xvbmcgcm1pX3Nyb19leGVjdXRlKHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3MpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xcbitcXHRib29sIGNhbmNlbGxlZCA9IGZhbHNlO1xcbitcXG4rXFx0cm1pX3NtY2NjX2ludm9rZShyZWdzLCByZWdzKTtcXG4rXFxuK1xcdHNyb19oYW5kbGUgPSByZWdzLVxcdTAwM2VhMTtcXG4rXFxuK1xcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVxcdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcXG4rXFx0XFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXFx1MDAzZWEwKTtcXG4rXFxuK1xcdFxcdHN3aXRjaCAoUk1JX1JFVFVSTl9NRU1SRVEocmVncy1cXHUwMDNlYTApKSB7XFxuK1xcdFxcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcXG4rXFx0XFx0XFx0cm1pX29wX2NvbnRpbnVlKHNyb19oYW5kbGUsIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRyZWdzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4rXFx0XFx0XFx0aWYgKCFjYW5fY2FuY2VsKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmVncy1cXHUwMDNlYTA7XFxuK1xcbitcXHRcXHRcXHRjYW5jZWxsZWQgPSB0cnVlO1xcbitcXHRcXHRcXHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjYW5jZWxsZWQpXFxuK1xcdFxcdHJldHVybiAtRUNBTkNFTEVEO1xcbitcXG4rXFx0cmV0dXJuIHJlZ3MtXFx1MDAzZWEwO1xcbit9XFxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XFxuK1xcbitzdGF0aWMgaW50IHJtaV9jaGVja192ZXJzaW9uKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXHR1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yO1xcbitcXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgUk1JX0FCSV9NSU5PUl9WRVJTSU9OKTtcXG4rXFx0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XFxuK1xcbitcXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xcbitcXHRpZiAoY3B1aWRfZmVhdHVyZV9leHRyYWN0X3Vuc2lnbmVkX2ZpZWxkKGFhNjRwZnIwLCBJRF9BQTY0UEZSMF9FTDFfUk1FX1NISUZUKSA9PSAwKVxcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9WRVJTSU9OLCBob3N0X3ZlcnNpb24sIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcXG4rXFx0XFx0cmV0dXJuIC1FTlhJTztcXG4rXFxuK1xcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XFxuK1xcdHZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMSk7XFxuK1xcbitcXHRpZiAocmVzLmEwICE9IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdHVuc2lnbmVkIHNob3J0IGhpZ2hfdmVyc2lvbl9tYWpvciwgaGlnaF92ZXJzaW9uX21pbm9yO1xcbitcXG4rXFx0XFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xcbitcXHRcXHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XFxuK1xcbitcXHRcXHRwcl9lcnIoXFxcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXFxcblxcXCIsXFxuK1xcdFxcdCAgICAgICB2ZXJzaW9uX21ham9yLCB2ZXJzaW9uX21pbm9yLFxcbitcXHRcXHQgICAgICAgaGlnaF92ZXJzaW9uX21ham9yLCBoaWdoX3ZlcnNpb25fbWlub3IsXFxuK1xcdFxcdCAgICAgICBSTUlfQUJJX01BSk9SX1ZFUlNJT04sXFxuK1xcdFxcdCAgICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHRwcl9pbmZvKFxcXCJSTUkgQUJJIHZlcnNpb24gJWQuJWRcXFxcblxcXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTaW5jZSB3ZSd2ZSBuZWdvdGlhdGVkIGEgY29tcGF0aWJsZSB2ZXJzaW9uIHRoZXNlIGZlYXR1cmUgcmVnaXN0ZXJzXFxuK1xcdCAqIHNob3VsZCBhbHdheXMgYmUgYXZhaWxhYmxlXFxuK1xcdCAqL1xcbitcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XFxuK1xcdFxcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcXHUwMDI2cm1pX2ZlYXRfcmVnX2NhY2hlW2ldKSkpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBybWlfY29uZmlndXJlKHZvaWQpXFxuK3tcXG4rXFx0dW5zaWduZWQgbG9uZyBncmFudWxlX2ZlYXR1cmU7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplO1xcbitcXHRpbnQgcmV0ID0gMDtcXG4rXFx0c3RydWN0IHJtbV9jb25maWcgKmNvbmZpZztcXG4rXFxuK1xcdHN3aXRjaCAoUEFHRV9TSVpFKSB7XFxuK1xcdGNhc2UgU1pfNEs6XFxuK1xcdFxcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xcbitcXHRcXHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfMTZLOlxcbitcXHRcXHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzE2S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgU1pfNjRLOlxcbitcXHRcXHRncmFudWxlX3NpemUgPSBSTUlfR1JBTlVMRV9TSVpFXzY0S0I7XFxuK1xcdFxcdGdyYW51bGVfZmVhdHVyZSA9IFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNjRLQjtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdEJVSUxEX0JVRygpO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIShybWlfZmVhdF9yZWcoMSkgXFx1MDAyNiBncmFudWxlX2ZlYXR1cmUpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGRvZXMgbm90IHN1cHBvcnQgJWx1S0IgZ3JhbnVsZXNcXFxcblxcXCIsXFxuK1xcdFxcdCAgICAgICBQQUdFX1NJWkUgXFx1MDAzZVxcdTAwM2UgMTApO1xcbitcXHRcXHRyZXR1cm4gLUVOWElPO1xcbitcXHR9XFxuK1xcbitcXHRjb25maWcgPSAoc3RydWN0IHJtbV9jb25maWcgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdGlmICghY29uZmlnKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdGNvbmZpZy1cXHUwMDNlcm1pX2dyYW51bGVfc2l6ZSA9IGdyYW51bGVfc2l6ZTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxcbitcXHQgKiBmb3IgNEtCIFBBR0VfU0laRSAoMUdCIGZvciA0S0IgUEFHRV9TSVpFLCAzMk1CLzUxMk1CIGZvciAxNktCLzY0S0IpLlxcbitcXHQgKiBUT0RPOiBTdXBwb3J0IG90aGVyIHRyYWNraW5nIHNpemVzIHZpYSBLY29uZmlnIG9wdGlvbiBmb3Igb3RoZXJcXG4rXFx0ICogUEFHRV9TSVpFU1xcbitcXHQgKi9cXG4rXFx0Y29uZmlnLVxcdTAwM2V0cmFja2luZ19yZWdpb25fc2l6ZSA9IDA7XFxuK1xcbitcXHRyZXQgPSBybWlfcm1tX2NvbmZpZ19zZXQodmlydF90b19waHlzKGNvbmZpZykpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHByX2VycihcXFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNvbmZpZyk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LlxcbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgdHJhY2tpbmcgeWV0LlxcbisgKi9cXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHJldCwgY2F0ZWdvcnksIHN0YXRlLCBuZXh0O1xcbitcXG4rXFx0XFx0cmV0ID0gcm1pX2dyYW51bGVfdHJhY2tpbmdfZ2V0KHN0YXJ0LCBlbmQsIFxcdTAwMjZjYXRlZ29yeSwgXFx1MDAyNnN0YXRlLCBcXHUwMDI2bmV4dCk7XFxuK1xcdFxcdGlmIChyZXQgIT0gUk1JX1NVQ0NFU1MpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0XFx0aWYgKHN0YXRlICE9IFJNSV9UUkFDS0lOR19GSU5FIHx8XFxuK1xcdFxcdCAgICBjYXRlZ29yeSAhPSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTCkge1xcbitcXHRcXHRcXHQvKiBUT0RPOiBTZXQgZ3JhbnVsZSB0cmFja2luZyBpbiB0aGlzIGNhc2UgKi9cXG4rXFx0XFx0XFx0cHJfZXJyKFxcXCJHcmFudWxlIHRyYWNraW5nIGZvciByZWdpb24gaXNuJ3QgZmluZS9jb252ZW50aW9uYWw6ICVsbHgtJWx4XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgc3RhcnQsIG5leHQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKlxcbisgKiBXZSBkbyBub3Qgc3VwcG9ydCBjcmVhdGluZyBMMSBHUFRzIHlldC4gU28sIG1ha2Ugc3VyZSB0aGF0XFxuKyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuXFxuKyAqL1xcbitzdGF0aWMgaW50IHJtaV92ZXJpZnlfZ3B0X2Zpcm13YXJlX21hbmFnZWQocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZClcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGwwZ3B0X3N6O1xcbitcXHR1bnNpZ25lZCBsb25nIG5leHQsIHBhcl9zdGF0ZTtcXG4rXFxuK1xcdGwwZ3B0X3N6ID0gMVVMIFxcdTAwM2NcXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXFxuK1xcdFxcdFxcdFxcdFxcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XFxuK1xcdHN0YXJ0ID0gQUxJR05fRE9XTihzdGFydCwgbDBncHRfc3opO1xcbitcXHRlbmQgPSBBTElHTihlbmQsIGwwZ3B0X3N6KTtcXG4rXFxuK1xcdHdoaWxlIChzdGFydCBcXHUwMDNjIGVuZCkge1xcbitcXHRcXHRsb25nIHJldCA9IHJtaV9ncHRfaW5mbyhzdGFydCwgZW5kLCBcXHUwMDI2bmV4dCwgXFx1MDAyNnBhcl9zdGF0ZSk7XFxuK1xcbitcXHRcXHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdFxcdGlmIChwYXJfc3RhdGUgIT0gUk1JX0dQVF9QQVJfUExBVCkge1xcbitcXHRcXHRcXHRwcl9lcnIoXFxcIkdQVCBmb3IgdGhlIHJlZ2lvbiBpcyBub3QgbWFuYWdlZCBieSBmaXJtd2FyZSAlbGx4LSVseFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0c3RhcnQsIG5leHQpO1xcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0XFx0fVxcbitcXHRcXHRzdGFydCA9IG5leHQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9wcmVwYXJlX21lbW9yeShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhzdGFydCwgZW5kKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXFxuK3tcXG4rXFx0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcXG4rXFx0c3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjtcXG4rXFxuK1xcdGZvcl9lYWNoX21lbV9yZWdpb24ocikge1xcbitcXHRcXHRpbnQgcmV0O1xcbitcXG4rXFx0XFx0LyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovXFxuK1xcdFxcdGlmIChtZW1ibG9ja19pc19ub21hcChyKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRzdGFydCA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocikgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFx0XFx0ZW5kID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHIpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcbitcXHRcXHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XFxuK1xcdFxcdGlmIChyZXQpXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJtaV9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYixcXG4rXFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBtZW1vcnlfbm90aWZ5ICphcmcgPSBkYXRhO1xcbitcXHRwaHlzX2FkZHJfdCBzdGFydCwgZW5kO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0aWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKVxcbitcXHRcXHRyZXR1cm4gTk9USUZZX0RPTkU7XFxuK1xcbitcXHRzdGFydCA9IFBGTl9QSFlTKGFyZy1cXHUwMDNlc3RhcnRfcGZuKTtcXG4rXFx0ZW5kID0gUEZOX1BIWVMoYXJnLVxcdTAwM2VzdGFydF9wZm4gKyBhcmctXFx1MDAzZW5yX3BhZ2VzKTtcXG4rXFx0cmV0ID0gcm1pX3ByZXBhcmVfbWVtb3J5KHN0YXJ0LCBlbmQpO1xcbitcXG4rXFx0cmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8ocmV0KTtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBybWlfbWVtb3J5X25iID0ge1xcbitcXHQubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsXFxuK307XFxuK1xcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcXG4rfVxcbitFWFBPUlRfU1lNQk9MX0dQTChpc19ybWlfYXZhaWxhYmxlKTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGFybTY0X2luaXRfcm1pKHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldCA9IDA7XFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gPSBOVUxMO1xcbitcXG4rXFx0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xcbitcXHRyZXQgPSBybWlfY2hlY2tfdmVyc2lvbigpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gcm1pX3JlYWRfZmVhdHVyZXMoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIEFjdGl2YXRlIHRoZSBSTU0gKi9cXG4rXFx0c3JvID0ga21hbGxvY19vYmooKnNybyk7XFxuK1xcdGlmICghc3JvKVxcbitcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFxuK1xcdHJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTtcXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRwcl9lcnIoXFxcIlJNTSBhY3RpdmF0ZSBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRyZXQgPSByZXQgXFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xcbitcXHRcXHRnb3RvIG91dF9mcmVlX3NybztcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gcm1pX2luaXRfbWV0YWRhdGEoKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihcXHUwMDI2cm1pX21lbW9yeV9uYik7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdGdvdG8gb3V0X2RlYWN0aXZhdGU7XFxuK1xcbitcXHRhcm02NF9ybWlfaXNfYXZhaWxhYmxlID0gdHJ1ZTtcXG4rXFx0cHJfaW5mbyhcXFwiUk1JIGNvbmZpZ3VyZWRcXFxcblxcXCIpO1xcbitcXHRrZnJlZShzcm8pO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitvdXRfZGVhY3RpdmF0ZTpcXG4rXFx0cm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7XFxuK291dF9mcmVlX3NybzpcXG4rXFx0a2ZyZWUoc3JvKTtcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLypcXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXFxuKyAqIHdpbGwgbm90IHN1cHBvcnQgcmVhbG0gZ3Vlc3RzLiBzdWJzeXNfaW5pdGNhbGwoKSBpcyBjYWxsZWQgYmVmb3JlXFxuKyAqIG1vZHVsZV9pbml0KCkgKHVzZWQgZm9yIEtWTSkgc28gdGhpcyBpcyBPSy5cXG4rICovXFxuK3N1YnN5c19pbml0Y2FsbChhcm02NF9pbml0X3JtaSk7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmggYi9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi43NDYyNTdkNzdkZDYxXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcXG5AQCAtMCwwICsxLDY3OCBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbisvKlxcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgQVJNIEx0ZC5cXG4rICovXFxuK1xcbisjaWZuZGVmIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9hcm0tc21jY2Mtcm1pLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFJNSV9NQVhfQUREUl9MSVNUXFx0MjU2XFxuK1xcbitzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSB7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncztcXG4rXFx0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHJfbGlzdFtSTUlfTUFYX0FERFJfTElTVF07XFxuK307XFxuK1xcbit1bnNpZ25lZCBsb25nIHJtaV9mZWF0X3JlZyh1bnNpZ25lZCBsb25nIGlkKTtcXG4rXFxuK2ludCBybWlfZGVsZWdhdGVfcmFuZ2UocGh5c19hZGRyX3QgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKTtcXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7XFxuK2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xcbitcXG4rc3RhdGljIGlubGluZSBpbnQgcm1pX2RlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSwgTlVMTCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgUEFHRV9TSVpFKTtcXG4rfVxcbitcXG4rYm9vbCBpc19ybWlfYXZhaWxhYmxlKHZvaWQpO1xcbitcXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApO1xcbit2b2lkIHJtaV9zcm9fZnJlZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKTtcXG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XFxuK1xcbisjZGVmaW5lIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBnZnAsIC4uLikgKHtcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpfX3NybyA9IChzcm8pO1xcdFxcdFxcdFxcdFxcXFxcXG4rXFx0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XFx0XFxcXFxcbitcXHRsb25nIF9fcmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoX19zcm8sIGdmcCk7XFx0XFx0XFxcXFxcbitcXHRybWlfc3JvX2ZyZWUoX19zcm8pO1xcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0X19yZXQ7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbit9KVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ybW1fY29uZmlnX3NldCgpIC0gQ29uZmlndXJlIHRoZSBSTU1cXG4rICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcXG4rICpcXG4rICogU2V0cyBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gdGhlIFJNTS5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9kZWFjdGl2YXRlKCkgLSBEZWFjdGl2YXRlIHRoZSBSTU0gYW5kIHJlY2xhaW0gYW55IG1lbW9yeSBkb25hdGVkIGF0XFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxcbisgKlxcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JtbV9hY3RpdmF0ZSgpIC0gQWN0aXZhdGUgdGhlIFJNTVxcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXFxuK3tcXG4rXFx0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQoKSAtIEdldCBjb25maWd1cmF0aW9uIG9mIGEgR3JhbnVsZSB0cmFja2luZyByZWdpb25cXG4rICogQHN0YXJ0OiBCYXNlIFBBIG9mIHRoZSB0cmFja2luZyByZWdpb25cXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cXG4rICogQG91dF9jYXRlZ29yeTogTWVtb3J5IGNhdGVnb3J5XFxuKyAqIEBvdXRfc3RhdGU6IFRyYWNraW5nIHJlZ2lvbiBzdGF0ZVxcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZ3JhbnVsZV90cmFja2luZ19nZXQodW5zaWduZWQgbG9uZyBzdGFydCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9jYXRlZ29yeSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVQsIHN0YXJ0LCBlbmQsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0aWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X2NhdGVnb3J5KVxcbitcXHRcXHRcXHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xcbitcXHRcXHRpZiAob3V0X3N0YXRlKVxcbitcXHRcXHRcXHQqb3V0X3N0YXRlID0gcmVzLmEyO1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZXMuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXMuYTA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIHJtaV9ncHRfaW5mbyAtIFF1ZXJ5IHRoZSBHUFQgaW5mbyBmb3IgdGhlIGdpdmVuIFBBUi5cXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyByZWdpb25cXG4rICogQG91dF90b3A6IFRvcCBvZiB0aGUgcGh5aXNjYWwgYWRkcmVzcyByZWdpb24gZm9yIHdoaWNoXFxuKyAqXFx0XFx0dGhlIEdQVCBAb3V0X2dwdF9wYXJfc3RhdGUgaXMgdmFsaWRcXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dwdF9pbmZvKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBlbmQsXFxuK1xcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxcbitcXHRcXHRcXHQgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X2dwdF9wYXJfc3RhdGUpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX0dQVF9JTkZPLCBiYXNlLCBlbmQsXFxuK1xcdH07XFxuK1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdGlmIChvdXRfdG9wKVxcbitcXHRcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcdFxcdGlmIChvdXRfZ3B0X3Bhcl9zdGF0ZSlcXG4rXFx0XFx0XFx0Km91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXFxuKyAqIEBpbmRleDogRmVhdHVyZSByZWdpc3RlciBpbmRleFxcbisgKiBAb3V0OiBGZWF0dXJlIHJlZ2lzdGVyIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhpcyBwb2ludGVyXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcXG4rXFxuK1xcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcXHUwMDI2cmVzKTtcXG4rXFxuK1xcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0KVxcbitcXHRcXHQqb3V0ID0gcmVzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKCkgLSBEZWxlZ2F0ZSBncmFudWxlc1xcbisgKiBAYmFzZTogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIHJhbmdlXFxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxcbisgKiBAb3V0X3RvcDogUEEgb2YgdGhlIGZpcnN0IGdyYW51bGUgbm90IGRlbGVnYXRlZFxcbisgKlxcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcXG4rICogd2FzIGRlbGVnYXRlZCB0aGVuIEBvdXRfdG9wID09IEB0b3AsIG90aGVyd2lzZSB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxcbisgKiBhZ2FpbiB3aXRoIEBiYXNlID09IEBvdXRfdG9wLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSgpIC0gVW5kZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGVzXFxuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQHRvcDogVG9wIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcXG4rICogQG91dF90b3A6IFJldHVybnMgdGhlIHRvcCBQQSBvZiByYW5nZSB3aG9zZSBzdGF0ZSBpcyB1bmRlbGVnYXRlZFxcbisgKlxcbisgKiBVbmRlbGVnYXRlIGEgcmFuZ2Ugb2YgZ3JhbnVsZXMgdG8gYWxsb3cgdXNlIGJ5IHRoZSBub3JtYWwgd29ybGQuIFdpbGwgZmFpbCBpZlxcbisgKiB0aGUgZ3JhbnVsZXMgYXJlIGluIHVzZS5cXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEUsIGJhc2UsIHRvcFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfbWFwX2luaXQoKSAtIENyZWF0ZSBhIHByb3RlY3RlZCBtYXBwaW5nIHdpdGggZGF0YSBjb250ZW50c1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXFxuKyAqIEBpcGE6IElQQSBhdCB3aGljaCB0aGUgZ3JhbnVsZSB3aWxsIGJlIG1hcHBlZCBpbiB0aGUgZ3Vlc3RcXG4rICogQHNyYzogUEEgb2YgdGhlIHNvdXJjZSBncmFudWxlXFxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXFxuKyAqXFxuKyAqIENyZWF0ZSBhIG1hcHBpbmcgZnJvbSBQcm90ZWN0ZWQgSVBBIHNwYWNlIHRvIGNvbnZlbnRpb25hbCBtZW1vcnksIGNvcHlpbmdcXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfbWFwX2luaXQodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBpcGEsIHVuc2lnbmVkIGxvbmcgc3JjLFxcbitcXHRcXHRcXHRcXHRcXHQgdW5zaWduZWQgbG9uZyBmbGFncylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVQsIHJkLCBkYXRhLCBpcGEsIHNyYywgZmxhZ3NcXG4rXFx0fTtcXG4rXFxuK1xcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9kYXRhX21hcCgpIC0gQ3JlYXRlIG1hcHBpbmdzIGluIHByb3RlY3RlZCBJUEEgd2l0aCB1bmtub3duIGNvbnRlbnRzXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFRvcCBhZGRyZXNzIG9mIHJhbmdlIHdoaWNoIHdhcyBwcm9jZXNzZWQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgIHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdCAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfREFUQV9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxcbitcXHR9O1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFxcdTAwMjZcXHUwMDI2IG91dF90b3ApXFxuK1xcdFxcdCpvdXRfdG9wID0gcmVncy5hMTtcXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XFxuKyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IFJlYWxtXFxuKyAqIEBiYXNlOiBCYXNlIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxcbisgKiBAZmxhZ3M6IEZsYWdzXFxuKyAqIEBvYWRkcjogT3V0cHV0IGFkZHJlc3Mgc2V0IGRlc2NyaXB0b3JcXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gY29udmVudGlvbiBtZW1vcnkgd2l0aCBhIHRhcmdldCBQcm90ZWN0ZWQgSVBBIHJhbmdlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2RhdGFfdW5tYXAodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyBvYWRkcixcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3JhbmdlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfY291bnQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9EQVRBX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQ7XFxuK1xcbitcXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcXG4rICogQGNhbGxpbmdfcmVjOiBQQSBvZiB0aGUgY2FsbGluZyBSRUNcXG4rICogQHN0YXR1czogU3RhdHVzIG9mIHRoZSBQU0NJIHJlcXVlc3RcXG4rICpcXG4rICogQ29tcGxldGVzIGEgcGVuZGluZyBQU0NJIGNvbW1hbmQuXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3BzY2lfY29tcGxldGUodW5zaWduZWQgbG9uZyBjYWxsaW5nX3JlYyxcXG4rXFx0XFx0XFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cylcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7XFxuK1xcbitcXHRhcm1fc21jY2NfMV8xX2ludm9rZShTTUNfUk1JX1BTQ0lfQ09NUExFVEUsIGNhbGxpbmdfcmVjLCBzdGF0dXMsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICpcXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXFxuKyAqIGV4ZWN1dGlvbiBvZiB0aGUgcmVhbG0uXFxuKyAqXFxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX2FjdGl2YXRlKHVuc2lnbmVkIGxvbmcgcmQpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUFMTV9BQ1RJVkFURSwgcmQsIFxcdTAwMjZyZXMpO1xcbitcXG4rXFx0cmV0dXJuIHJlcy5hMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV9jcmVhdGUoKSAtIENyZWF0ZSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcXG4rICpcXG4rICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVhbG1fY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxcbitcXHRcXHRcXHRcXHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fQ1JFQVRFLCByZCwgcGFyYW1zKTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIFRlcm1pbmF0ZXMgYSByZWFsbSwgbW92aW5nIGl0IGludG8gYSBaT01CSUUgc3RhdGVcXG4rICpcXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlYWxtX3Rlcm1pbmF0ZSh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVhbG1fZGVzdHJveSgpIC0gRGVzdHJveSBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGEgcmVhbG0sIGFsbCBvYmplY3RzIGJlbG9uZ2luZyB0byB0aGUgcmVhbG0gbXVzdCBiZSBkZXN0cm95ZWQgZmlyc3QuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXFxuK1xcdFxcdFxcdFxcdCAgIFNNQ19STUlfUkVBTE1fREVTVFJPWSwgcmQpO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlY19jcmVhdGUoKSAtIENyZWF0ZSBhIFJFQ1xcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xcbisgKiBAcGFyYW1zOiBQQSBvZiBSRUMgcGFyYW1ldGVyc1xcbisgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxcbisgKlxcbisgKiBDcmVhdGUgYSBSRUMgdXNpbmcgdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZSBzdHJ1Y3QgcmVjX3BhcmFtcyBwb2ludGVkXFxuKyAqIHRvIGJ5IEBwYXJhbXMuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyByZWMsXFxuK1xcdFxcdFxcdFxcdCAgdW5zaWduZWQgbG9uZyBwYXJhbXMsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRsb25nIHJldDtcXG4rXFxuK1xcdCpzcm8gPSAoc3RydWN0IHJtaV9zcm9fc3RhdGUpey5yZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JFQ19DUkVBVEUsIHJkLCByZWMsIHBhcmFtc1xcbitcXHR9fTtcXG4rXFx0cmV0ID0gcm1pX3Nyb19tZW14ZmVyX2V4ZWN1dGUoc3JvLCBHRlBfS0VSTkVMKTtcXG4rXFx0cm1pX3Nyb19mcmVlKHNybyk7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3JlY19kZXN0cm95KCkgLSBEZXN0cm95IGEgUkVDXFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXFxuKyAqIEBzcm86IEFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXFxuKyAqXFxuKyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWNfZGVzdHJveSh1bnNpZ25lZCBsb25nIHJlYyxcXG4rXFx0XFx0XFx0XFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcXG4re1xcbitcXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcmVjX2VudGVyKCkgLSBFbnRlciBhIFJFQ1xcbisgKiBAcmVjOiBQQSBvZiB0aGUgdGFyZ2V0IFJFQ1xcbisgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxcbisgKlxcbisgKiBTdGFydHMgKG9yIGNvbnRpbnVlcykgZXhlY3V0aW9uIHdpdGhpbiBhIFJFQy5cXG4rICpcXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xcbitcXG4rXFx0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXFx1MDAyNnJlcyk7XFxuK1xcbitcXHRyZXR1cm4gcmVzLmEwO1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF9jcmVhdGUoKSAtIENyZWF0ZXMgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBydHQ6IFBBIG9mIHRoZSB0YXJnZXQgUlRUXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXFxuKyAqXFxuKyAqIENyZWF0ZXMgYW4gUlRUIChSZWFsbSBUcmFuc2xhdGlvbiBUYWJsZSkgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCBmb3IgdGhlXFxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2NyZWF0ZSh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIHJ0dCxcXG4rXFx0XFx0XFx0XFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXG4rXFx0cmV0dXJuIHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2Rlc3Ryb3koKSAtIERlc3Ryb3kgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEIGZvciB0aGUgdGFyZ2V0IHJlYWxtXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IFJUVCBsZXZlbFxcbisgKiBAb3V0X3J0dDogUG9pbnRlciB0byB3cml0ZSB0aGUgUEEgb2YgdGhlIFJUVCB3aGljaCB3YXMgZGVzdHJveWVkXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XFxuKyAqIGF0IHdoaWNoIHRoZSBSVFQgd2FsayB0ZXJtaW5hdGVkLlxcbisgKlxcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxcbisgKiB0YWJsZSBhcmUgaW4gQVNTSUdORUQgb3IgVEFCTEUgc3RhdGUuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2Rlc3Ryb3kodW5zaWduZWQgbG9uZyByZCxcXG4rXFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBpcGEsXFxuK1xcdFxcdFxcdFxcdCAgIGxvbmcgbGV2ZWwsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF9ydHQsXFxuK1xcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXFxuK3tcXG4rXFx0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xcbitcXHRcXHRTTUNfUk1JX1JUVF9ERVNUUk9ZLCByZCwgaXBhLCBsZXZlbFxcbitcXHR9O1xcbitcXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcXHUwMDI2cmVncyk7XFxuK1xcbitcXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XFxuK1xcdFxcdGlmIChvdXRfcnR0KVxcbitcXHRcXHRcXHQqb3V0X3J0dCA9IHJlZ3MuYTE7XFxuK1xcdFxcdGlmIChvdXRfdG9wKVxcbitcXHRcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTI7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBybWlfcnR0X2ZvbGQoKSAtIEZvbGQgYW4gUlRUXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXFxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcXG4rICpcXG4rICogRm9sZHMgYW4gUlRULiBJZiBhbGwgZW50cmllcyB3aXRoIHRoZSBSVFQgYXJlICdob21vZ2VuZW91cycgdGhlIFJUVCBjYW4gYmVcXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZm9sZCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGlwYSxcXG4rXFx0XFx0XFx0XFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3J0dClcXG4rXFx0XFx0Km91dF9ydHQgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfaW5pdF9yaXBhcygpIC0gU2V0IFJJUEFTIGZvciBuZXcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxcbisgKlxcbisgKiBTZXRzIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEEgcmFuZ2UgdG8gUkFNLCBmb3IgYSByZWFsbSBpbiB0aGUgTkVXIHN0YXRlLlxcbisgKlxcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCwgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX0lOSVRfUklQQVMsIHJkLCBiYXNlLCB0b3BcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcXHUwMDI2XFx1MDAyNiBvdXRfdG9wKVxcbitcXHRcXHQqb3V0X3RvcCA9IHJlZ3MuYTE7XFxuK1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbisvKipcXG4rICogcm1pX3J0dF91bnByb3RfbWFwKCkgLSBNYXAgdW5wcm90ZWN0ZWQgZ3JhbnVsZXMgaW50byBhIHJlYWxtXFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcXG4rICogQGZsYWdzOiBGbGFnc1xcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXFxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdoaWNoIGhhcyBiZWVuIG1hcHBlZFxcbisgKlxcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X21hcCh1bnNpZ25lZCBsb25nIHJkLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxcbitcXHRcXHRcXHRcXHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfVU5QUk9UX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfc2V0X3JpcGFzKCkgLSBTZXQgUklQQVMgZm9yIGFuIHJ1bm5pbmcgcmVhbG1cXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcXG4rICogQGJhc2U6IEJhc2Ugb2YgdGFyZ2V0IElQQSByZWdpb25cXG4rICogQHRvcDogVG9wIG9mIHRhcmdldCBJUEEgcmVnaW9uXFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXFxuKyAqXFxuKyAqIENvbXBsZXRlcyBhIHJlcXVlc3QgbWFkZSBieSB0aGUgcmVhbG0gdG8gY2hhbmdlIHRoZSBSSVBBUyBvZiBhIHRhcmdldCBJUEFcXG4rICogcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfc2V0X3JpcGFzKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcmVjLFxcbitcXHRcXHRcXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcXG4re1xcbitcXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XFxuK1xcdFxcdFNNQ19STUlfUlRUX1NFVF9SSVBBUywgcmQsIHJlYywgYmFzZSwgdG9wXFxuK1xcdH07XFxuK1xcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFxcdTAwMjZyZWdzKTtcXG4rXFxuK1xcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXFx1MDAyNlxcdTAwMjYgb3V0X3RvcClcXG4rXFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXG4rXFx0cmV0dXJuIHJldDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIHJtaV9ydHRfdW5wcm90X3VubWFwKCkgLSBSZW1vdmUgbWFwcGluZ3Mgd2l0aGluIGFuIHVucHJvdGVjdGVkIElQQSByYW5nZVxcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcXG4rICogQHRvcDogVG9wIG9mIHRoZSB0YXJnZXQgSVBBIHJhbmdlXFxuKyAqIEBmbGFnczogRmxhZ3NcXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxcbisgKiBAb3V0X3RvcDogVG9wIElQQSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxcbisgKiBAb3V0X3JhbmdlOiBPdXRwdXQgYWRkcmVzcyByYW5nZVxcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XFxuKyAqXFxuKyAqIFJlbW92ZXMgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXFxuKyAqXFxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxcbisgKi9cXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgYmFzZSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyB0b3AsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgb2FkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXFxuK1xcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcXG4rXFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxcbit7XFxuK1xcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcXG4rXFx0XFx0U01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcXG4rXFx0fTtcXG4rXFx0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXFx1MDAyNnJlZ3MpO1xcbitcXG4rXFx0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xcbitcXHRcXHRpZiAob3V0X3RvcClcXG4rXFx0XFx0XFx0Km91dF90b3AgPSByZWdzLmExO1xcbitcXHRcXHRpZiAob3V0X3JhbmdlKVxcbitcXHRcXHRcXHQqb3V0X3JhbmdlID0gcmVncy5hMjtcXG4rXFx0XFx0aWYgKG91dF9jb3VudClcXG4rXFx0XFx0XFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKyNlbmRpZlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaCBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi4zZWI4OGNhZjQwOTY0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXFxuQEAgLTAsMCArMSw0OTQgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cXG4rLypcXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cXG4rICpcXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxcbisgKiBzcGVjaWZpY2F0aW9uIChERU4wMTM3KSB2ZXJzaW9uIDIuMC1iZXQzOlxcbisgKiBodHRwczovL2RldmVsb3Blci5hcm0uY29tL2RvY3VtZW50YXRpb24vZGVuMDEzNy8yLTBiZXQzL1xcbisgKi9cXG4rXFxuKyNpZm5kZWYgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaXRmaWVsZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zaXplcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2FzbS9wYWdlLmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfQ0FMTChmdW5jKVxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXFx0XFx0XFxcXFxcbitcXHRcXHRcXHQgICBBUk1fU01DQ0NfU01DXzY0LFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgQVJNX1NNQ0NDX09XTkVSX1NUQU5EQVJELFxcdFxcXFxcXG4rXFx0XFx0XFx0ICAgKGZ1bmMpKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZFUlNJT05cXHRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTUwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9EQVRBX01BUF9JTklUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1MylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9BQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTcpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNTkpXFxuKyNkZWZpbmUgU01DX1JNSV9SRUNfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YSlcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1YilcXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19FTlRFUlxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNWMpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZClcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfUkVBRF9FTlRSWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjEpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9WQUxJREFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjMpXFxuKyNkZWZpbmUgU01DX1JNSV9QU0NJX0NPTVBMRVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NClcXG4rI2RlZmluZSBTTUNfUk1JX0ZFQVRVUkVTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2NilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfSU5JVF9SSVBBU1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmEpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2YilcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fQ09ORklHX1NFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNmUpXFxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9JUlFfTk9USUZZXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE2ZilcXG4rI2RlZmluZSBTTUNfUk1JX0FUVEVTVF9QTEFUX1RPS0VOX1JFRlJFU0hcXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfQUJPUlRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxNzYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0RFU1RST1lcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc3KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9HRVRfU1RBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTc4KVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9SRUZSRVNIXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU0VUX1BVQktFWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2IpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUT1BcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdjKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE3ZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfRk9MRFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxN2YpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9BQk9SVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODUpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NPTU1VTklDQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NilcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDE4NylcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODgpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9TVEFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxODkpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1VOTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxOGEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMThiKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX0lOVEVSRkFDRV9SRVBPUlRcXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9HRVRfTUVBU1VSRU1FTlRTXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfTE9DS1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDIpXFxuKyNkZWZpbmUgU01DX1JNSV9WREVWX1NUQVJUXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkMylcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9FVkVOVF9IQU5ETEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfQUNUSVZBVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWQ3KVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfREVBQ1RJVkFURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZDgpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkYilcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWRjKVxcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGQpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDBfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZGUpXFxuKyNkZWZpbmUgU01DX1JNSV9EUFRfTDFfQ1JFQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFkZilcXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMClcXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfVFJBQ0tJTkdfR0VUXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcXG4rXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX1NFVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZTMpXFxuK1xcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9TVEFURV9HRVRcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWVlKVxcbitcXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0VWRU5UX0NPTlNVTUVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9SQU5HRV9ERUxFR0FURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjEpXFxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX1VOREVMRUdBVEVcXHRTTUNfUk1JX0NBTEwoMHgwMWYyKVxcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjMpXFxuKyNkZWZpbmUgU01DX1JNSV9HUFRfTDFfREVTVFJPWVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjQpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREFUQV9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY1KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9NQVBcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWY3KVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RFVl9VTk1BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZjgpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmOSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmEpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmIpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmYylcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfUFJPVF9NQVBcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX1VOTUFQXFx0XFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX01BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAxZmYpXFxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1VOUFJPVF9VTk1BUFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDApXFxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9URVJNSU5BVEVcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjAxKVxcbisjZGVmaW5lIFNNQ19STUlfUk1NX0FDVElWQVRFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMilcXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIwMylcXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTk5FQ1RcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fRElTQ09OTkVDVFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDUpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9DT01QTEVURVxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9LRVlfUFVSR0VcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX0RPTkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDgpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fUkVDTEFJTVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMDkpXFxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfRkVBVFVSRVNcXHRcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBiKVxcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ01EX0dFVFxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGMpXFxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcXHRcXHRTTUNfUk1JX0NBTEwoMHgwMjBkKVxcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1xcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGUpXFxuKyNkZWZpbmUgU01DX1JNSV9STU1fREVBQ1RJVkFURVxcdFxcdFxcdFNNQ19STUlfQ0FMTCgweDAyMGYpXFxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9JTkZPXFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMClcXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9JTkZPXFx0XFx0XFx0U01DX1JNSV9DQUxMKDB4MDIxMSlcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9NQUpPUl9WRVJTSU9OXFx0MlxcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlxcdDBcXG4rXFxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFxcdTAwM2VcXHUwMDNlIDE2KVxcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcXHUwMDI2IDB4RkZGRilcXG4rI2RlZmluZSBSTUlfQUJJX1ZFUlNJT04obWFqb3IsIG1pbm9yKSAgICAgICgoKG1ham9yKSBcXHUwMDNjXFx1MDAzYyAxNikgfCAobWlub3IpKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXFx0XFx0KDB4RkZVTClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcXHRcXHQoMHhGRlVMIFxcdTAwM2NcXHUwMDNjIDgpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVFfTUFTS1xcdFxcdCgweDNVTCBcXHUwMDNjXFx1MDAzYyA4KVxcbisjZGVmaW5lIFJNSV9SRVRVUk5fQ0FOX0NBTkNFTF9NQVNLXFx0KDB4MVVMIFxcdTAwM2NcXHUwMDNjIDEwKVxcbitcXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXFx0XFx0RklFTERfR0VUKFJNSV9SRVRVUk5fU1RBVFVTX01BU0ssIHJldClcXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcXHRcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9JTkRFWF9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVxcdFxcdEZJRUxEX0dFVChSTUlfUkVUVVJOX01FTVJFUV9NQVNLLCByZXQpXFxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcXHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0ssIHJldClcXG4rXFxuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcXHRcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0lOUFVUXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9FUlJPUl9SRUFMTVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9FUlJPUl9SVFRcXHRcXHRcXHQ0XFxuKyNkZWZpbmUgUk1JX0VSUk9SX05PVF9TVVBQT1JURURcXHRcXHQ1XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RFVklDRVxcdFxcdDZcXG4rI2RlZmluZSBSTUlfRVJST1JfUlRUX0FVWFxcdFxcdDdcXG4rI2RlZmluZSBSTUlfRVJST1JfUFNNTVVfU1RcXHRcXHQ4XFxuKyNkZWZpbmUgUk1JX0VSUk9SX0RQVFxcdFxcdFxcdDlcXG4rI2RlZmluZSBSTUlfQlVTWVxcdFxcdFxcdDEwXFxuKyNkZWZpbmUgUk1JX0VSUk9SX0dMT0JBTFxcdFxcdDExXFxuKyNkZWZpbmUgUk1JX0VSUk9SX1RSQUNLSU5HXFx0XFx0MTJcXG4rI2RlZmluZSBSTUlfSU5DT01QTEVURVxcdFxcdFxcdDEzXFxuKyNkZWZpbmUgUk1JX0JMT0NLRURcXHRcXHRcXHQxNFxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcXHRcXHRcXHQxNVxcbisjZGVmaW5lIFJNSV9FUlJPUl9HUkFOVUxFXFx0XFx0MTZcXG4rXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkdcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX0NPTlRJTlVFX1NUT1BcXHRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcXHRcXHQwXFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cXHRcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9ET05BVEVfU0laRV9NQVNLXFx0XFx0M1VMXFxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT1VOVF9NQVNLXFx0XFx0R0VOTUFTSygxNSwgMilcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJR19NQVNLXFx0XFx0QklUKDE2KVxcbisjZGVmaW5lIFJNSV9ET05BVEVfU1RBVEVfTUFTS1xcdFxcdEdFTk1BU0soMTgsIDE3KVxcbitcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NJWkUocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NJWkVfTUFTSywgcmVxKVxcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09VTlQocmVxKVxcdFxcdEZJRUxEX0dFVChSTUlfRE9OQVRFX0NPVU5UX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPTlRJRyhyZXEpXFx0XFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09OVElHX01BU0ssIHJlcSlcXG4rI2RlZmluZSBSTUlfRE9OQVRFX1NUQVRFKHJlcSlcXHRcXHRGSUVMRF9HRVQoUk1JX0RPTkFURV9TVEFURV9NQVNLLCByZXEpXFxuK1xcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcXHRcXHQxXFxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9OT05FXFx0XFx0MFxcbisjZGVmaW5lIFJNSV9BRERSX1RZUEVfU0lOR0xFXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9BRERSX1RZUEVfTElTVFxcdFxcdDJcXG4rXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLXFx0R0VOTUFTSygxLCAwKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0tcXHRHRU5NQVNLKFBBR0VfU0hJRlQgLSAxLCAyKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1xcdChQQUdFX01BU0sgXFx1MDAyNiBHRU5NQVNLKDUxLCAwKSlcXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXFx0R0VOTUFTSyg2MywgNjIpXFxuK1xcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXFx0XFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKGFyKSkpXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9DT1VOVF9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFIoYXIpXFx0XFx0KChhcikgXFx1MDAyNiBSTUlfQUREUl9SQU5HRV9BRERSX01BU0spXFxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXFx0KEZJRUxEX0dFVChSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgIChhcikpKVxcbitcXG4rZW51bSBybWlfcmlwYXMge1xcbitcXHRSTUlfRU1QVFkgPSAwLFxcbitcXHRSTUlfUkFNID0gMSxcXG4rXFx0Uk1JX0RFU1RST1lFRCA9IDIsXFxuK1xcdFJNSV9ERVYgPSAzLFxcbit9O1xcbitcXG4rI2RlZmluZSBSTUlfTk9fTUVBU1VSRV9DT05URU5UXFx0MFxcbisjZGVmaW5lIFJNSV9NRUFTVVJFX0NPTlRFTlRcXHQxXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWlxcdFxcdEdFTk1BU0soNywgMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0xQQTJcXHRcXHRCSVQoOClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1NWRVxcdFxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFX1ZMXFx0XFx0R0VOTUFTSygxMywgMTApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fQlBTXFx0XFx0R0VOTUFTSygxOSwgMTQpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9OVU1fV1BTXFx0XFx0R0VOTUFTSygyNSwgMjApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVcXHRcXHRCSVQoMjYpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9QTVVfTlVNX0NUUlNcXHRHRU5NQVNLKDMxLCAyNylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0wwR1BUX0JMT0NLX0RFTEVHQVRFXFx0QklUKDMyKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJPQVNaXFx0XFx0R0VOTUFTSyg0MCwgMzMpXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCXFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl8xNktCXFx0QklUKDEpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCXFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0hBU0hfU0hBXzM4NFxcdEJJVCg0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfSEFTSF9TSEFfNTEyXFx0QklUKDUpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlxcdEdFTk1BU0soOSwgNilcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1pcXHRcXHRHRU5NQVNLKDEzLCAxMClcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1BQU1xcdFxcdEdFTk1BU0soMTYsIDE0KVxcbitcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0hcXHRcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXFx0XFx0QklUKDIpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcXHRcXHRCSVQoMylcXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSyg3LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfVkRFVl9LUk9VXFx0QklUKDgpXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9OT05fVEVFX1NUUkVBTVxcdEJJVCg5KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXFx0R0VOTUFTSygxNCwgMTApXFxuK1xcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXFx0R0VOTUFTSygzLCAwKVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1BMQU5FXFx0XFx0R0VOTUFTSyg1LCA0KVxcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfUlRUX1MyQVBfSU5ESVJFQ1RcXHRCSVQoNilcXG4rXFxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfNF9NRUNfQ09VTlRcXHRcXHRHRU5NQVNLKDYzLCAwKVxcbitcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXFx0XFx0MVxcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcXHRcXHRcXHQzXFxuK1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19SRVNFUlZFRFxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVxcdFxcdFxcdDFcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfRklORVxcdFxcdFxcdDJcXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfQ09BUlNFXFx0XFx0XFx0M1xcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcXHRcXHQ0XFxuK1xcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfNEtCXFx0MFxcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlxcdDFcXG4rI2RlZmluZSBSTUlfR1JBTlVMRV9TSVpFXzY0S0JcXHQyXFxuK1xcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1JFU0VSVkVEICAgICAgICAgICAwVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfTk9UX0NSRUFURUQgICAyVVxcbisjZGVmaW5lIFJNSV9HUFRfUEFSX0hPU1RfQ1JFQVRFRCAgICAgICAzVVxcbitcXG4rLypcXG4rICogTm90ZSBtYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc21hbGxlciB0aGFuIHU2NCBidXQgYWxsIGZpZWxkcyBoYXZlIHU2NFxcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxcbisgKi9cXG4rc3RydWN0IHJtbV9jb25maWcge1xcbitcXHR1bmlvbiB7IC8qIDB4MCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgdHJhY2tpbmdfcmVnaW9uX3NpemU7XFxuK1xcdFxcdFxcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBzaXplcltTWl80S107XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgcm1tX2NvbmZpZykgPT0gU1pfNEspO1xcbitcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19TVkVcXHRcXHRCSVQoMSlcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19QTVVcXHRcXHRCSVQoMilcXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19EQVxcdFxcdFxcdEJJVCgzKVxcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0xGQV9QT0xJQ1lcXHRcXHRHRU5NQVNLKDYsIDUpXFxuKyNkZWZpbmUgUk1JX1JFQUxNX1BBUkFNX0ZMQUdfTUVDX1BPTElDWVxcdFxcdEdFTk1BU0soOCwgNylcXG4rXFxuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1NlxcdFxcdFxcdDBcXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfNTEyXFx0XFx0XFx0MVxcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV8zODRcXHRcXHRcXHQyXFxuK1xcbitzdHJ1Y3QgcmVhbG1fcGFyYW1zIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMDtcXG4rXFx0XFx0XFx0dTY0IHMyc3o7XFxuK1xcdFxcdFxcdHU2NCBzdmVfdmw7XFxuK1xcdFxcdFxcdHU2NCBudW1fYnBzO1xcbitcXHRcXHRcXHR1NjQgbnVtX3dwcztcXG4rXFx0XFx0XFx0dTY0IHBtdV9udW1fY3RycztcXG4rXFx0XFx0XFx0dTY0IGhhc2hfYWxnbztcXG4rXFx0XFx0XFx0dTY0IG51bV9hdXhfcGxhbmVzO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDQwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg0MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcnB2WzY0XTtcXG4rXFx0XFx0XFx0dTY0IGF0c19wbGFuZTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzFbMHg0MDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4ODAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBwYWRkaW5nMjtcXG4rXFx0XFx0XFx0dTY0IHJ0dF9iYXNlO1xcbitcXHRcXHRcXHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xcbitcXHRcXHRcXHR1NjQgcnR0X251bV9zdGFydDtcXG4rXFx0XFx0XFx0dTY0IGZsYWdzMTtcXG4rXFx0XFx0XFx0dTY0IG1heF9udW1fdmRldnM7XFxuK1xcdFxcdH07XFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4NzAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweGYwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1OCBwYWRkaW5nNFsweDgwXTtcXG4rXFx0XFx0XFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzVbMHgxMDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlYWxtX3BhcmFtcykgPT0gU1pfNEspO1xcbitcXG4rLypcXG4rICogVGhlIG51bWJlciBvZiBHUFJzIChzdGFydGluZyBmcm9tIFgwKSB0aGF0IGFyZVxcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cXG4rICovXFxuKyNkZWZpbmUgUkVDX0NSRUFURV9OUl9HUFJTXFx0XFx0OFxcbitcXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcXHRCSVQoMClcXG4rXFxuK3N0cnVjdCByZWNfcGFyYW1zIHtcXG4rXFx0dW5pb24geyAvKiAweDAgKi9cXG4rXFx0XFx0dTY0IGZsYWdzO1xcbitcXHRcXHR1OCBwYWRkaW5nMFsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgxMDAgKi9cXG4rXFx0XFx0dTY0IG1waWRyO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IHBjO1xcbitcXHRcXHR1OCBwYWRkaW5nMlsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgzMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX0NSRUFURV9OUl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzNbMHhkMDBdO1xcbitcXHR9O1xcbit9O1xcbitcXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19wYXJhbXMpID09IFNaXzRLKTtcXG4rXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JT1xcdEJJVCgwKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0lOSkVDVF9TRUFcXHRCSVQoMSlcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19UUkFQX1dGSVxcdFxcdEJJVCgyKVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZFXFx0XFx0QklUKDMpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfUklQQVNfUkVTUE9OU0VcXHRCSVQoNClcXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXFx0QklUKDUpXFxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfREVWX01FTV9SRVNQT05TRVxcdEJJVCg2KVxcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0ZPUkNFX1AwXFx0XFx0QklUKDcpXFxuK1xcbisjZGVmaW5lIFJFQ19SVU5fR1BSU1xcdFxcdFxcdDMxXFxuK1xcbitzdHJ1Y3QgcmVjX2VudGVyIHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1NjQgZmxhZ3M7XFxuK1xcdFxcdHU4IHBhZGRpbmcwWzB4MjAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDIwMCAqL1xcbitcXHRcXHR1NjQgZ3Byc1tSRUNfUlVOX0dQUlNdO1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDYwMF07XFxuK1xcdH07XFxuK307XFxuK1xcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XFxuK1xcbisjZGVmaW5lIFJNSV9FWElUX1NZTkNcXHRcXHRcXHQweDAwXFxuKyNkZWZpbmUgUk1JX0VYSVRfSVJRXFx0XFx0XFx0MHgwMVxcbisjZGVmaW5lIFJNSV9FWElUX0ZJUVxcdFxcdFxcdDB4MDJcXG4rI2RlZmluZSBSTUlfRVhJVF9QU0NJXFx0XFx0XFx0MHgwM1xcbisjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVxcdFxcdDB4MDRcXG4rI2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcXHRcXHQweDA1XFxuKyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SXFx0XFx0XFx0MHgwNlxcbisjZGVmaW5lIFJNSV9FWElUX1MyQVBfQ0hBTkdFXFx0XFx0MHgwN1xcbisjZGVmaW5lIFJNSV9FWElUX1ZERVZfVkFMSURBVEVfTUFQUElOR1xcdDB4MDhcXG4rI2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5EXFx0XFx0MHgwYVxcbitcXG4rc3RydWN0IHJlY19leGl0IHtcXG4rXFx0dW5pb24geyAvKiAweDAwMCAqL1xcbitcXHRcXHR1OCBleGl0X3JlYXNvbjtcXG4rXFx0XFx0dTggcGFkZGluZzBbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MTAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCBlc3I7XFxuK1xcdFxcdFxcdHU2NCBmYXI7XFxuK1xcdFxcdFxcdHU2NCBocGZhcjtcXG4rXFx0XFx0XFx0dTY0IHJ0dF90cmVlO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nMVsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHgyMDAgKi9cXG4rXFx0XFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcXG4rXFx0XFx0dTggcGFkZGluZzJbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4MzAwICovXFxuK1xcdFxcdHU4IHBhZGRpbmczWzB4MTAwXTtcXG4rXFx0fTtcXG4rXFx0dW5pb24geyAvKiAweDQwMCAqL1xcbitcXHRcXHRzdHJ1Y3Qge1xcbitcXHRcXHRcXHR1NjQgY250cF9jdGw7XFxuK1xcdFxcdFxcdHU2NCBjbnRwX2N2YWw7XFxuK1xcdFxcdFxcdHU2NCBjbnR2X2N0bDtcXG4rXFx0XFx0XFx0dTY0IGNudHZfY3ZhbDtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzRbMHgxMDBdO1xcbitcXHR9O1xcbitcXHR1bmlvbiB7IC8qIDB4NTAwICovXFxuK1xcdFxcdHN0cnVjdCB7XFxuK1xcdFxcdFxcdHU2NCByaXBhc19iYXNlO1xcbitcXHRcXHRcXHR1NjQgcmlwYXNfdG9wO1xcbitcXHRcXHRcXHR1OCByaXBhc192YWx1ZTtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzVbMHhmXTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfYmFzZTtcXG4rXFx0XFx0XFx0dTY0IHMyYXBfdG9wO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8xO1xcbitcXHRcXHRcXHR1NjQgdmRldl9pZF8yO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV9iYXNlO1xcbitcXHRcXHRcXHR1NjQgZGV2X21lbV90b3A7XFxuK1xcdFxcdFxcdHU2NCBkZXZfbWVtX3BhO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nNlsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg2MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTE2IGltbTtcXG4rXFx0XFx0XFx0dTggcGFkZGluZzdbMHg2XTtcXG4rXFx0XFx0XFx0dTY0IHBsYW5lO1xcbitcXHRcXHR9O1xcbitcXHRcXHR1OCBwYWRkaW5nOFsweDEwMF07XFxuK1xcdH07XFxuK1xcdHVuaW9uIHsgLyogMHg3MDAgKi9cXG4rXFx0XFx0c3RydWN0IHtcXG4rXFx0XFx0XFx0dTggcG11X292Zl9zdGF0dXM7XFxuK1xcdFxcdFxcdHU4IHBhZGRpbmc5WzB4Zl07XFxuK1xcdFxcdFxcdHU2NCB2c21tdTtcXG4rXFx0XFx0fTtcXG4rXFx0XFx0dTggcGFkZGluZzEwWzB4MTAwXTtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfZXhpdCkgPT0gU1pfMkspO1xcbitcXG4rc3RydWN0IHJlY19ydW4ge1xcbitcXHRzdHJ1Y3QgcmVjX2VudGVyIGVudGVyO1xcbitcXHRzdHJ1Y3QgcmVjX2V4aXQgZXhpdDtcXG4rfTtcXG4rXFxuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWNfcnVuKSA9PSBTWl80Syk7XFxuK1xcbisvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVxcdEdFTk1BU0soMSwgMClcXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFxcdEdFTk1BU0soMTUsIDIpXFxuKyNkZWZpbmUgUk1JX1JUVF9VTlBST1RfTUFQX0ZMQUdTX01FTUFUVFJcXHRHRU5NQVNLKDE4LCAxNilcXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUFxcdFxcdEdFTk1BU0soMjIsIDE5KVxcbitcXG4rLyogUk1JX1JUVF9QUk9UX01BUF9GTEFHUyBkZWZpbml0aW9ucyAqL1xcbisjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVxcdEdFTk1BU0soMSwgMClcXG4rI2RlZmluZSBSTUlfUlRUX1BST1RfTUFQX0ZMQUdTX0xJU1RfQ09VTlRcXHRHRU5NQVNLKDE1LCAyKVxcbitcXG4rLyogUzJBUCBEaXJlY3QgRW5jb2RpbmdzLCB1c2VkIGluIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQICovXFxuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXFx0XFx0XFx0QklUKDApXFxuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1JFQURcXHRcXHRcXHRCSVQoMSlcXG4rXFxuKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MjcuNjg3MzU1MDUxWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoxMjk4NzA3NzgyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgOWFjNDczMmMzZDRjMGE4YzYwNDExYTMyNjk0ODA5NjA1NGFmMjk3OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gU2VwIDcgMTQ6NTE6MjMgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWdcbmluZGV4IGI1YTUxYjBlZjk0NDAuLmZmOTU2NWQzZmZhNTkgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L0tjb25maWdcbisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZ1xuQEAgLTM4LDYgKzM4LDcgQEAgY29uZmlnIEFSTTY0XG4gXHRzZWxlY3QgQVJDSF9IQVNfTUVNQkFSUklFUl9TWU5DX0NPUkVcbiBcdHNlbGVjdCBBUkNIX0hBU19NRU1fRU5DUllQVFxuIFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXG4rXHRzZWxlY3QgQVJDSF9TVVBQT1JUU19STU1cbiBcdHNlbGVjdCBBUkNIX0hBU19OTUlfU0FGRV9USElTX0NQVV9PUFNcbiBcdHNlbGVjdCBBUkNIX0hBU19OT05fT1ZFUkxBUFBJTkdfQUREUkVTU19TUEFDRVxuIFx0c2VsZWN0IEFSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HIGlmIEFSTTY0X0hBRlRcbmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbmluZGV4IDE3YjgzYTI1MThhOGYuLmRiMjZmNmIwZWFmNWUgMTAwNjQ0XG4tLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmNcbisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY1xuQEAgLTI5Myw2ICsyOTMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjNbXSA9IHtcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0ge1xuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9DU1YzX1NISUZULCA0LCAwKSxcbiBcdEFSTTY0X0ZUUl9CSVRTKEZUUl9ISURERU4sIEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0UEZSMF9FTDFfQ1NWMl9TSElGVCwgNCwgMCksXG4rXHRBUk02NF9GVFJfQklUUyhGVFJfSElEREVOLCBGVFJfTk9OU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCwgNCwgMCksXG4gXHRBUk02NF9GVFJfQklUUyhGVFJfVklTSUJMRSwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9ESVRfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9BTVVfU0hJRlQsIDQsIDApLFxuIFx0QVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIElEX0FBNjRQRlIwX0VMMV9NUEFNX1NISUZULCA0LCAwKSxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbmluZGV4IGI3Y2MxMWU0ZmJmYTYuLjYyNjYwYmY1MjBhOGQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWdcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZ1xuQEAgLTMxMCw1ICszMTAsNiBAQCBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3NhbXN1bmcvS2NvbmZpZ1wiXG4gc291cmNlIFwiZHJpdmVycy9maXJtd2FyZS9zbWNjYy9LY29uZmlnXCJcbiBzb3VyY2UgXCJkcml2ZXJzL2Zpcm13YXJlL3RlZ3JhL0tjb25maWdcIlxuIHNvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUveGlsaW54L0tjb25maWdcIlxuK3NvdXJjZSBcImRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXCJcbiBcbiBlbmRtZW51XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvTWFrZWZpbGVcbmluZGV4IGJlNDZmMWUxZGM3N2YuLjE5NmE2NTBjY2YwMjUgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG4rKysgYi9kcml2ZXJzL2Zpcm13YXJlL01ha2VmaWxlXG5AQCAtMzksMyArMzksNCBAQCBvYmoteVx0XHRcdFx0Kz0gc2Ftc3VuZy9cbiBvYmoteVx0XHRcdFx0Kz0gc21jY2MvXG4gb2JqLXlcdFx0XHRcdCs9IHRlZ3JhL1xuIG9iai15XHRcdFx0XHQrPSB4aWxpbngvXG4rb2JqLXlcdFx0XHRcdCs9IGFybV9ybW0vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZ1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjgyNzI0ZWUyMzE4NmRcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnXG5AQCAtMCwwICsxLDI2IEBAXG4rXG4rY29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXG4rXHRib29sXG4rXG4rY29uZmlnIEFSTV9STU1fUk1JXG4rXHRib29sIFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFwiXG4rXHRkZXBlbmRzIG9uIEFSQ0hfU1VQUE9SVFNfUk1NXG4rXHRkZWZhdWx0IHlcbitcdGhlbHBcbitcdCAgU3VwcG9ydCB0aGUgUmVhbG0gTWFuYWdlbWVudCBNb25pdG9yIChSTU0pIG9uIEFybSBzeXN0ZW1zIHRoYXRcbitcdCAgaW1wbGVtZW50IHRoZSBSZWFsbSBNYW5hZ2VtZW50IEV4dGVuc2lvbiAoUk1FKSwgYXMgZGVmaW5lZCBieSB0aGVcbitcdCAgQXJtIENvbmZpZGVudGlhbCBDb21wdXRlIEFyY2hpdGVjdHVyZS5cbitcbitcdCAgVGhlIFJNTSBydW5zIGF0IEVMMiBpbiB0aGUgUmVhbG0gd29ybGQgYW5kIHByb3ZpZGVzIHRoZSBSZWFsbVxuK1x0ICBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSB1c2VkIGJ5IGEgTm9ybWFsIFdvcmxkIGhvc3QgdG8gY3JlYXRlLFxuK1x0ICBtYW5hZ2UgYW5kIHJ1biBwcm90ZWN0ZWQgdmlydHVhbCBtYWNoaW5lcyBjYWxsZWQgUmVhbG1zLiBUaGUgUk1NIGNhblxuK1x0ICBhbHNvIGFjdCBhcyBhIFRTTSwgYXMgZGVmaW5lZCBieSB0aGUgUENJZSBURElTUCBhbmQgY2FuIG1hbmFnZSB0aGVcbitcdCAgUENJIElERSBzZXR1cCBmb3Igc2VjdXJpbmcgdGhlIFBDSWUgbGlua3MuXG4rXG4rXHQgIFRoaXMgb3B0aW9uIGJ1aWxkcyB0aGUgaG9zdC1zaWRlIFJNSSBzdXBwb3J0IHVzZWQgYnkgS1ZNIHRvIGRldGVjdCBhXG4rXHQgIGNvbXBhdGlibGUgUk1NLCBjb25maWd1cmUgaXQsIG1hbmFnZSBkZWxlZ2F0ZWQgbWVtb3J5IGFuZCBlbmFibGVcbitcdCAgUmVhbG0gZ3Vlc3RzLlxuK1xuK1x0ICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gZG9lcyBub3QgYnkgaXRzZWxmIG1ha2UgUmVhbG0gZ3Vlc3RzIGF2YWlsYWJsZTpcbitcdCAgdGhlIHN5c3RlbSBtdXN0IGFsc28gcHJvdmlkZSBSTUUtY2FwYWJsZSBoYXJkd2FyZSBhbmQgZmlybXdhcmUgd2l0aCBhXG4rXHQgIGNvbXBhdGlibGUgUk1NIGltcGxlbWVudGF0aW9uLlxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZSBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjY1MTcxOTg4ZmRjYWVcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9NYWtlZmlsZVxuQEAgLTAsMCArMSwyIEBAXG4rXG4rb2JqLSQoQ09ORklHX0FSTV9STU1fUk1JKVx0PSBybWkub1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjM0MDU4ZTM0MTg4ZDNcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9ybWkuY1xuQEAgLTAsMCArMSw4MTkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogQ29weXJpZ2h0IChDKSAyMDIzLTIwMjYgQVJNIEx0ZC5cbisgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcHVmZWF0dXJlLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1ibG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtb3J5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcm0tcm1pLWNtZHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3Byb2Nlc3Nvci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BndGFibGUtaHdkZWYuaFx1MDAzZVxuK1xuK3N0YXRpYyBib29sIGFybTY0X3JtaV9pc19hdmFpbGFibGU7XG4rXG4rLyogQ3VycmVudGx5IG9ubHkgdGhlIGZpcnN0IDIgcmVnaXN0ZXJzIGFyZSB1c2VkIGJ5IExpbnV4ICovXG4rI2RlZmluZSBSTUlfRkVBVF9SRUdfQ09VTlRcdDJcbitzdGF0aWMgX19yb19hZnRlcl9pbml0IHVuc2lnbmVkIGxvbmcgcm1pX2ZlYXRfcmVnX2NhY2hlW1JNSV9GRUFUX1JFR19DT1VOVF07XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZClcbit7XG4rXHRpZiAoV0FSTl9PTihpZCBcdTAwM2U9IFJNSV9GRUFUX1JFR19DT1VOVCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cmV0dXJuIHJtaV9mZWF0X3JlZ19jYWNoZVtpZF07XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9mZWF0X3JlZyk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLFxuK1x0XHQgICAgICAgdW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHQgICAgICAgcGh5c19hZGRyX3QgKm91dF9waHlzKVxuK3tcbitcdGxvbmcgcmV0ID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgdG9wID0gcGh5cyArIHNpemU7XG4rXHR1bnNpZ25lZCBsb25nIG91dF90b3A7XG4rXG4rXHR3aGlsZSAocGh5cyBcdTAwM2MgdG9wKSB7XG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3JhbmdlX2RlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGlmIChvdXRfcGh5cylcbitcdFx0Km91dF9waHlzID0gcGh5cztcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9kZWxlZ2F0ZV9yYW5nZSk7XG4rXG4raW50IHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXNfYWRkcl90IHBoeXMsXG4rXHRcdFx0IHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHRsb25nIHJldCA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIHRvcCA9IHBoeXMgKyBzaXplO1xuK1x0dW5zaWduZWQgbG9uZyBvdXRfdG9wO1xuK1xuK1x0d2hpbGUgKHBoeXMgXHUwMDNjIHRvcCkge1xuK1x0XHRyZXQgPSBybWlfZ3JhbnVsZV9yYW5nZV91bmRlbGVnYXRlKHBoeXMsIHRvcCwgXHUwMDI2b3V0X3RvcCk7XG4rXHRcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpXG4rXHRcdFx0cGh5cyA9IG91dF90b3A7XG4rXHRcdGVsc2UgaWYgKHJldCA9PSBSTUlfQlVTWSB8fCByZXQgPT0gUk1JX0JMT0NLRUQpXG4rXHRcdFx0Y3B1X3JlbGF4KCk7XG4rXHRcdGVsc2VcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV91bmRlbGVnYXRlX3JhbmdlKTtcbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBkb25hdGVfcmVxX3RvX3NpemUodW5zaWduZWQgbG9uZyBkb25hdGVyZXEpXG4re1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemUgPSBSTUlfRE9OQVRFX1NJWkUoZG9uYXRlcmVxKTtcbitcbitcdHJldHVybiBCSVQoQVJNNjRfSFdfUEdUQUJMRV9MRVZFTF9TSElGVCgzIC0gdW5pdF9zaXplKSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHJtaV9zbWNjY19pbnZva2Uoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVnc19pbixcbitcdFx0XHQgICAgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKnJlZ3Nfb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9ICpyZWdzX2luO1xuK1x0dW5zaWduZWQgbG9uZyBzdGF0dXM7XG4rXG4rXHR3aGlsZSAoMSkge1xuK1x0XHRhcm1fc21jY2NfMV8yX2ludm9rZShcdTAwMjZyZWdzLCByZWdzX291dCk7XG4rXHRcdHN0YXR1cyA9IFJNSV9SRVRVUk5fU1RBVFVTKHJlZ3Nfb3V0LVx1MDAzZWEwKTtcbitcdFx0aWYgKHN0YXR1cyAhPSBSTUlfQlVTWSBcdTAwMjZcdTAwMjYgc3RhdHVzICE9IFJNSV9CTE9DS0VEKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHRjcHVfcmVsYXgoKTtcbitcdH1cbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX2NvbnRpbnVlKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX0NPTlRJTlVFLCBzcm9faGFuZGxlLCBmbGFnc1xuK1x0fTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UoXHUwMDI2cmVncywgb3V0X3JlZ3MpO1xuK31cbitcbitzdGF0aWMgdm9pZCBybWlfb3BfY2FuY2VsKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgIHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9PUF9DQU5DRUwsIHNyb19oYW5kbGVcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9kb25hdGUodW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLCB1bnNpZ25lZCBsb25nIGxpc3RfYWRkcixcbitcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGxpc3RfY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0ICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9ET05BVEUsIHNyb19oYW5kbGUsIGxpc3RfYWRkciwgbGlzdF9jb3VudCwgZmxhZ3NcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVGhlIG91dHB1dCBkb25hdGVkIGNvdW50IChhMSkgaXMgYWx3YXlzIHZhbGlkLCBpcnJlc3BlY3RpdmVcbitcdCAqIG9mIHRoZSByZXR1cm4gcmVzdWx0LiBpLmUuLCAwIGlmIHRoZXJlIHdhcyBhbiBlcnJvclxuK1x0ICovXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcm1pX29wX21lbV9yZWNsYWltKHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICAgICAgdW5zaWduZWQgbG9uZyBsaXN0X2FkZHIsXG4rXHRcdFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgbGlzdF9jb3VudCxcbitcdFx0XHQgICAgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX09QX01FTV9SRUNMQUlNLCBzcm9faGFuZGxlLCBsaXN0X2FkZHIsIGxpc3RfY291bnRcbitcdH07XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKFx1MDAyNnJlZ3MsIG91dF9yZWdzKTtcbit9XG4rXG4raW50IGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5c19hZGRyX3QgcGh5cylcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3BhZ2UocGh5cykpKSB7XG4rXHRcdC8qIFVuZGVsZWdhdGUgZmFpbGVkOiBsZWFrIHRoZSBwYWdlICovXG4rXHRcdHJldHVybiAtRUJVU1k7XG4rXHR9XG4rXG4rXHRmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTtcbitcbitcdHJldHVybiAwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2RlbGVnYXRlZF9wYWdlKTtcbitcbitzdGF0aWMgaW50IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGNvdW50KVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0Uoc3JvLVx1MDAzZWFkZHJfY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUKSlcbitcdFx0cmV0dXJuIC1FT1ZFUkZMT1c7XG4rXG4rXHRpZiAoY291bnQgXHUwMDNlIFJNSV9NQVhfQUREUl9MSVNUIC0gc3JvLVx1MDAzZWFkZHJfY291bnQpXG4rXHRcdHJldHVybiAtRU5PU1BDO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3Nyb19kb25hdGVfY29udGlnKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sXG4rXHRcdFx0XHQgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdFx0IHVuc2lnbmVkIGxvbmcgZG9uYXRlcmVxLFxuK1x0XHRcdFx0IHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgKm91dF9yZWdzLFxuK1x0XHRcdFx0IGdmcF90IGdmcClcbit7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9ET05BVEVfU0laRShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyB1bml0X3NpemVfYnl0ZXMgPSBkb25hdGVfcmVxX3RvX3NpemUoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgY291bnQgPSBSTUlfRE9OQVRFX0NPVU5UKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0RPTkFURV9TVEFURShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBzaXplID0gdW5pdF9zaXplX2J5dGVzICogY291bnQ7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRpbnQgcmV0O1xuK1x0dm9pZCAqdmlydDtcbitcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHQvKlxuK1x0ICogVGhlIFJNTSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGNvbnRpZ3VvdXMgYWxsb2NhdGlvbnMgYXJlIGFsd2F5cyBhXG4rXHQgKiBwb3dlciBvZiAyXG4rXHQgKi9cbitcdGlmIChXQVJOX09OX09OQ0UoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBzcm8tXHUwMDNlYWRkcl9jb3VudDsgaSsrKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgZW50cnkgPSBzcm8tXHUwMDNlYWRkcl9saXN0W2ldO1xuK1xuK1x0XHRpZiAoUk1JX0FERFJfUkFOR0VfU0laRShlbnRyeSkgPT0gdW5pdF9zaXplIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpID09IGNvdW50IFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpID09IHN0YXRlIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgSVNfQUxJR05FRChSTUlfQUREUl9SQU5HRV9BRERSKGVudHJ5KSwgc2l6ZSkpIHtcbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9jb3VudC0tO1xuK1x0XHRcdHN3YXAoc3JvLVx1MDAzZWFkZHJfbGlzdFtzcm8tXHUwMDNlYWRkcl9jb3VudF0sXG4rXHRcdFx0ICAgICBzcm8tXHUwMDNlYWRkcl9saXN0W2ldKTtcbitcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0ID0gcm1pX3Nyb19lbnN1cmVfY2FwYWNpdHkoc3JvLCAxKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR2aXJ0ID0gYWxsb2NfcGFnZXNfZXhhY3Qoc2l6ZSwgZ2ZwKTtcbitcdGlmICghdmlydClcbitcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRwaHlzID0gdmlydF90b19waHlzKHZpcnQpO1xuK1xuK1x0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdHBoeXNfYWRkcl90IGRlbGVnYXRlZF9waHlzO1xuK1xuK1x0XHRpZiAocm1pX2RlbGVnYXRlX3JhbmdlKHBoeXMsIHNpemUsIFx1MDAyNmRlbGVnYXRlZF9waHlzKSkge1xuK1x0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbitcdFx0XHRcdGZyZWVfcGFnZXNfZXhhY3QodmlydCwgc2l6ZSk7XG4rXHRcdFx0cmV0dXJuIC1FTlhJTztcbitcdFx0fVxuK1x0fVxuK1xuK1x0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcdEZJRUxEX01PRElGWShSTUlfQUREUl9SQU5HRV9TSVpFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHVuaXRfc2l6ZSk7XG4rXHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgY291bnQpO1xuK1x0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIHN0YXRlKTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdID0gYWRkcl9yYW5nZTtcbitcbitvdXQ6XG4rXHRybWlfb3BfbWVtX2RvbmF0ZShzcm9faGFuZGxlLFxuK1x0XHRcdCAgdmlydF90b19waHlzKFx1MDAyNnNyby1cdTAwM2VhZGRyX2xpc3Rbc3JvLVx1MDAzZWFkZHJfY291bnRdKSwgMSxcbitcdFx0XHQgIDAsIG91dF9yZWdzKTtcbitcbitcdHVuc2lnbmVkIGxvbmcgZG9uYXRlZF9ncmFudWxlcyA9IG91dF9yZWdzLVx1MDAzZWExO1xuK1x0dW5zaWduZWQgbG9uZyBkb25hdGVkX3NpemUgPSBkb25hdGVkX2dyYW51bGVzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1xuK1x0aWYgKGRvbmF0ZWRfZ3JhbnVsZXMgPT0gMCkge1xuK1x0XHQvKiBObyBwYWdlcyB1c2VkIGJ5IHRoZSBSTU0gKi9cbitcdFx0c3JvLVx1MDAzZWFkZHJfY291bnQrKztcbitcdH0gZWxzZSBpZiAoZG9uYXRlZF9zaXplIFx1MDAzYyBzaXplKSB7XG4rXHRcdHBoeXMgPSBzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLO1xuK1xuK1x0XHQvKiBOb3QgYWxsIGdyYW51bGVzIHVzZWQgYnkgdGhlIFJNTSwgZnJlZSB0aGUgcmVtYWluaW5nIHBhZ2VzICovXG4rXHRcdGZvciAobG9uZyBpID0gZG9uYXRlZF9zaXplOyBpIFx1MDAzYyBzaXplOyBpICs9IFBBR0VfU0laRSkge1xuK1x0XHRcdGlmIChzdGF0ZSA9PSBSTUlfT1BfTUVNX0RFTEVHQVRFRClcbitcdFx0XHRcdGZyZWVfZGVsZWdhdGVkX3BhZ2UocGh5cyArIGkpO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdF9fZnJlZV9wYWdlKHBoeXNfdG9fcGFnZShwaHlzICsgaSkpO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZV9ub25jb250aWcoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIHNyb19oYW5kbGUsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4rXHRcdFx0XHQgICAgc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqb3V0X3JlZ3MsXG4rXHRcdFx0XHQgICAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgdW5pdF9zaXplID0gUk1JX0RPTkFURV9TSVpFKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZV9ieXRlcyA9IGRvbmF0ZV9yZXFfdG9fc2l6ZShkb25hdGVyZXEpO1xuK1x0dW5zaWduZWQgbG9uZyBjb3VudCA9IFJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKTtcbitcdHVuc2lnbmVkIGxvbmcgc3RhdGUgPSBSTUlfRE9OQVRFX1NUQVRFKGRvbmF0ZXJlcSk7XG4rXHR1bnNpZ25lZCBsb25nIGZvdW5kID0gMDtcbitcdHVuc2lnbmVkIGxvbmcgYWRkcl9saXN0X3N0YXJ0ID0gc3JvLVx1MDAzZWFkZHJfY291bnQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIGFkZHJfbGlzdF9zdGFydCBcdTAwMjZcdTAwMjYgZm91bmQgXHUwMDNjIGNvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXG4rXHRcdGlmIChSTUlfQUREUl9SQU5HRV9TSVpFKGVudHJ5KSA9PSB1bml0X3NpemUgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICBSTUlfQUREUl9SQU5HRV9DT1VOVChlbnRyeSkgPT0gMSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIFJNSV9BRERSX1JBTkdFX1NUQVRFKGVudHJ5KSA9PSBzdGF0ZSkge1xuK1x0XHRcdGFkZHJfbGlzdF9zdGFydC0tO1xuK1x0XHRcdHN3YXAoc3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdLFxuK1x0XHRcdCAgICAgc3JvLVx1MDAzZWFkZHJfbGlzdFtpXSk7XG4rXHRcdFx0Zm91bmQrKztcbitcdFx0XHRpLS07XG4rXHRcdH1cbitcdH1cbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgY291bnQgLSBmb3VuZCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0d2hpbGUgKGZvdW5kIFx1MDAzYyBjb3VudCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIGFkZHJfcmFuZ2U7XG4rXHRcdHZvaWQgKnZpcnQgPSBhbGxvY19wYWdlc19leGFjdCh1bml0X3NpemVfYnl0ZXMsIGdmcCk7XG4rXHRcdHBoeXNfYWRkcl90IHBoeXM7XG4rXG4rXHRcdGlmICghdmlydClcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0cGh5cyA9IHZpcnRfdG9fcGh5cyh2aXJ0KTtcbitcbitcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKSB7XG4rXHRcdFx0cGh5c19hZGRyX3QgZGVsZWdhdGVkX3BoeXM7XG4rXG4rXHRcdFx0aWYgKHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCB1bml0X3NpemVfYnl0ZXMsXG4rXHRcdFx0XHRcdCAgICAgICBcdTAwMjZkZWxlZ2F0ZWRfcGh5cykpIHtcbitcdFx0XHRcdGlmICghcm1pX3VuZGVsZWdhdGVfcmFuZ2UocGh5cywgZGVsZWdhdGVkX3BoeXMgLSBwaHlzKSlcbitcdFx0XHRcdFx0ZnJlZV9wYWdlc19leGFjdCh2aXJ0LCB1bml0X3NpemVfYnl0ZXMpO1xuK1x0XHRcdFx0cmV0dXJuIC1FTlhJTztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0YWRkcl9yYW5nZSA9IHBoeXMgXHUwMDI2IFJNSV9BRERSX1JBTkdFX0FERFJfTUFTSztcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgdW5pdF9zaXplKTtcbitcdFx0RklFTERfTU9ESUZZKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFx1MDAyNmFkZHJfcmFuZ2UsIDEpO1xuK1x0XHRGSUVMRF9NT0RJRlkoUk1JX0FERFJfUkFOR0VfU1RBVEVfTUFTSywgXHUwMDI2YWRkcl9yYW5nZSwgc3RhdGUpO1xuK1xuK1x0XHRzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50KytdID0gYWRkcl9yYW5nZTtcbitcdFx0Zm91bmQrKztcbitcdH1cbitcbitcdHJtaV9vcF9tZW1fZG9uYXRlKHNyb19oYW5kbGUsXG4rXHRcdFx0ICB2aXJ0X3RvX3BoeXMoXHUwMDI2c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnRdKSxcbitcdFx0XHQgIGZvdW5kLCAwLCBvdXRfcmVncyk7XG4rXG4rXHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfZ3JhbnVsZXMgPSBvdXRfcmVncy1cdTAwM2VhMTtcbitcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZXNfcGVyX3VuaXQgPSB1bml0X3NpemVfYnl0ZXMgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHR1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3VuaXRzO1xuK1xuK1x0LypcbitcdCAqIFRoZSBSTU0gc2hvdWxkbid0IHJlcG9ydCBtb3JlIGdyYW51bGVzIHRoYW4gd2UgcHJvdmlkZWQsIGJ1dCBjbGFtcFxuK1x0ICoganVzdCBpbiBjYXNlLlxuK1x0ICovXG4rXHRpZiAoV0FSTl9PTl9PTkNFKGRvbmF0ZWRfZ3JhbnVsZXMgXHUwMDNlIGZvdW5kICogZ3JhbnVsZXNfcGVyX3VuaXQpKVxuK1x0XHRkb25hdGVkX2dyYW51bGVzID0gZm91bmQgKiBncmFudWxlc19wZXJfdW5pdDtcbitcbitcdC8qXG4rXHQgKiBUaGUgUk1NIHJlcG9ydHMgdGhlIGNvbnN1bWVkIG1lbW9yeSBpbiB0ZXJtcyBvZiBncmFudWxlcywgYnV0IHdlXG4rXHQgKiB0cmFjayBpbiB0aGUgYWRkcmVzcyBsaXN0cyBpbiB1bml0LXNpemVkIHJhbmdlcy4gU28gZGl2aWRlIHRvIGdldFxuK1x0ICogdGhlIG51bWJlciBvZiAoY29tcGxldGUpIGNvbnN1bWVkIHVuaXRzLlxuK1x0ICovXG4rXHRjb25zdW1lZF91bml0cyA9IGRvbmF0ZWRfZ3JhbnVsZXMgLyBncmFudWxlc19wZXJfdW5pdDtcbitcdGlmIChkb25hdGVkX2dyYW51bGVzICUgZ3JhbnVsZXNfcGVyX3VuaXQpIHtcbitcdFx0LypcbitcdFx0ICogQSB1bml0IGhhcyBiZWVuIHBhcnRpYWxseSBjb25zdW1lZCwgdGhlIHN0YXJ0IGlzIG93bmVkIGJ5XG4rXHRcdCAqIHRoZSBSTU0sIHRoZSB0YWlsIGlzIG93bmVkIGJ5IHRoZSBob3N0XG4rXHRcdCAqL1xuK1x0XHR1bnNpZ25lZCBsb25nIGVudHJ5ID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGNvbnN1bWVkX3VuaXRzXTtcbitcdFx0cGh5c19hZGRyX3QgcGh5cyA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGRvbmF0ZWRfc2l6ZSA9XG4rXHRcdFx0KGRvbmF0ZWRfZ3JhbnVsZXMgJSBncmFudWxlc19wZXJfdW5pdCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdC8qIEZyZWUgdGhlIHRhaWwgYmFjayAqL1xuK1x0XHRmb3IgKHVuc2lnbmVkIGxvbmcgaSA9IGRvbmF0ZWRfc2l6ZTsgaSBcdTAwM2MgdW5pdF9zaXplX2J5dGVzO1xuK1x0XHQgICAgIGkgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0aWYgKHN0YXRlID09IFJNSV9PUF9NRU1fREVMRUdBVEVEKVxuK1x0XHRcdFx0ZnJlZV9kZWxlZ2F0ZWRfcGFnZShwaHlzICsgaSk7XG4rXHRcdFx0ZWxzZVxuK1x0XHRcdFx0X19mcmVlX3BhZ2UocGh5c190b19wYWdlKHBoeXMgKyBpKSk7XG4rXHRcdH1cbitcbitcdFx0LypcbitcdFx0ICogVGhpcyB1bml0IGlzIG5vdyBmdWxseSAnY29uc3VtZWQnIChlaXRoZXIgaGVsZCBieSB0aGUgUk1NIG9yXG4rXHRcdCAqIGZyZWVkKVxuK1x0XHQgKi9cbitcdFx0Y29uc3VtZWRfdW5pdHMrKztcbitcdH1cbitcbitcdC8qIEtlZXAganVzdCB0aGUgdW5pdHMgdGhlIFJNTSBkaWRuJ3QgdXNlIGluIGFkZHJfbGlzdCAqL1xuK1x0Zm9yICh1bnNpZ25lZCBsb25nIGkgPSBjb25zdW1lZF91bml0czsgaSBcdTAwM2MgZm91bmQ7IGkrKylcbitcdFx0c3JvLVx1MDAzZWFkZHJfbGlzdFthZGRyX2xpc3Rfc3RhcnQgKyBpIC0gY29uc3VtZWRfdW5pdHNdID1cbitcdFx0XHRzcm8tXHUwMDNlYWRkcl9saXN0W2FkZHJfbGlzdF9zdGFydCArIGldO1xuK1xuK1x0c3JvLVx1MDAzZWFkZHJfY291bnQgLT0gY29uc3VtZWRfdW5pdHM7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBybWlfc3JvX2RvbmF0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdCAgdW5zaWduZWQgbG9uZyBzcm9faGFuZGxlLFxuK1x0XHRcdCAgdW5zaWduZWQgbG9uZyBkb25hdGVyZXEsXG4rXHRcdFx0ICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzLFxuK1x0XHRcdCAgZ2ZwX3QgZ2ZwKVxuK3tcbitcdGlmIChXQVJOX09OX09OQ0UoIVJNSV9ET05BVEVfQ09VTlQoZG9uYXRlcmVxKSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKFJNSV9ET05BVEVfQ09OVElHKGRvbmF0ZXJlcSkpIHtcbitcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX2NvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbitcdFx0XHRcdFx0ICAgICByZWdzLCBnZnApO1xuK1x0fSBlbHNlIHtcbitcdFx0cmV0dXJuIHJtaV9zcm9fZG9uYXRlX25vbmNvbnRpZyhzcm8sIHNyb19oYW5kbGUsIGRvbmF0ZXJlcSxcbitcdFx0XHRcdFx0XHRyZWdzLCBnZnApO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHJtaV9zcm9fcmVjbGFpbShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLFxuK1x0XHRcdCAgIHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZSxcbitcdFx0XHQgICBzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpvdXRfcmVncylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGNhcGFjaXR5O1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV9zcm9fZW5zdXJlX2NhcGFjaXR5KHNybywgMSk7XG4rXHRpZiAocmV0KVxuK1x0XHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdGNhcGFjaXR5ID0gUk1JX01BWF9BRERSX0xJU1QgLSBzcm8tXHUwMDNlYWRkcl9jb3VudDtcbitcbitcdHJtaV9vcF9tZW1fcmVjbGFpbShzcm9faGFuZGxlLFxuK1x0XHRcdCAgIHZpcnRfdG9fcGh5cyhcdTAwMjZzcm8tXHUwMDNlYWRkcl9saXN0W3Nyby1cdTAwM2VhZGRyX2NvdW50XSksXG4rXHRcdFx0ICAgY2FwYWNpdHksIG91dF9yZWdzKTtcbitcbitcdGlmIChXQVJOX09OX09OQ0Uob3V0X3JlZ3MtXHUwMDNlYTEgXHUwMDNlIGNhcGFjaXR5KSlcbitcdFx0b3V0X3JlZ3MtXHUwMDNlYTEgPSBjYXBhY2l0eTtcbitcbitcdHNyby1cdTAwM2VhZGRyX2NvdW50ICs9IG91dF9yZWdzLVx1MDAzZWExO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3ZvaWQgcm1pX3Nyb19mcmVlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNyby1cdTAwM2VhZGRyX2NvdW50OyBpKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyBlbnRyeSA9IHNyby1cdTAwM2VhZGRyX2xpc3RbaV07XG4rXHRcdHVuc2lnbmVkIGxvbmcgYWRkciA9IFJNSV9BRERSX1JBTkdFX0FERFIoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHVuaXRfc2l6ZSA9IFJNSV9BRERSX1JBTkdFX1NJWkUoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIGNvdW50ID0gUk1JX0FERFJfUkFOR0VfQ09VTlQoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHN0YXRlID0gUk1JX0FERFJfUkFOR0VfU1RBVEUoZW50cnkpO1xuK1x0XHR1bnNpZ25lZCBsb25nIHNpemUgPSBkb25hdGVfcmVxX3RvX3NpemUodW5pdF9zaXplKSAqIGNvdW50O1xuK1xuK1x0XHRpZiAoc3RhdGUgPT0gUk1JX09QX01FTV9ERUxFR0FURUQpIHtcbitcdFx0XHRpZiAoV0FSTl9PTl9PTkNFKHJtaV91bmRlbGVnYXRlX3JhbmdlKGFkZHIsIHNpemUpKSkge1xuK1x0XHRcdFx0LyogTGVhayB0aGUgcGFnZXMgKi9cbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0XHRmcmVlX3BhZ2VzX2V4YWN0KHBoeXNfdG9fdmlydChhZGRyKSwgc2l6ZSk7XG4rXHR9XG4rXG4rXHRzcm8tXHUwMDNlYWRkcl9jb3VudCA9IDA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZnJlZSk7XG4rXG4rbG9uZyBybWlfc3JvX21lbXhmZXJfZXhlY3V0ZShzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvLCBnZnBfdCBnZnApXG4re1xuK1x0dW5zaWduZWQgbG9uZyBzcm9faGFuZGxlO1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyA9IFx1MDAyNnNyby1cdTAwM2VyZWdzO1xuK1x0Ym9vbCBjYW5jZWxsZWQgPSBmYWxzZTtcbitcbitcdHJtaV9zbWNjY19pbnZva2UocmVncywgcmVncyk7XG4rXG4rXHRzcm9faGFuZGxlID0gcmVncy1cdTAwM2VhMTtcbitcbitcdHdoaWxlIChSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSA9PSBSTUlfSU5DT01QTEVURSkge1xuK1x0XHRib29sIGNhbl9jYW5jZWwgPSBSTUlfUkVUVVJOX0NBTl9DQU5DRUwocmVncy1cdTAwM2VhMCk7XG4rXHRcdGludCByZXQgPSAwO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlIFJNSV9PUF9NRU1fUkVRX0RPTkFURTpcbitcdFx0XHRyZXQgPSBybWlfc3JvX2RvbmF0ZShzcm8sIHNyb19oYW5kbGUsIHJlZ3MtXHUwMDNlYTIsIHJlZ3MsXG4rXHRcdFx0XHRcdCAgICAgZ2ZwKTtcbitcdFx0XHRicmVhaztcbitcdFx0Y2FzZSBSTUlfT1BfTUVNX1JFUV9SRUNMQUlNOlxuK1x0XHRcdHJldCA9IHJtaV9zcm9fcmVjbGFpbShzcm8sIHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHJldCA9IFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0LypcbitcdFx0XHQgKiBBbGwgbWVtb3J5IGRvbmF0aW5nIFNST3MgbXVzdCBiZSBjYW5jZWxsYWJsZS4gU28gYVxuK1x0XHRcdCAqIGZhaWx1cmUgaW4gbWVtb3J5IGFsbG9jYXRpb24gc2hvdWxkbid0IGJlIGFuIGlzc3VlLlxuK1x0XHRcdCAqIEhvd2V2ZXIsIGlmIHdlIGVuY291bnRlciBhIHJhbmRvbSBmYWlsdXJlIChlLmcuLFxuK1x0XHRcdCAqIGJ1Z2d5IFJNTSksIGRvbid0IGxvb3AgZm9yZXZlciwganVzdCBnaXZlIHVwLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGlmIChXQVJOX09OX09OQ0UoIWNhbl9jYW5jZWwpKVxuK1x0XHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0XHRybWlfb3BfY2FuY2VsKHNyb19oYW5kbGUsIHJlZ3MpO1xuK1x0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG4rXG4rXHRcdFx0aWYgKFdBUk5fT05fT05DRShSTUlfUkVUVVJOX1NUQVRVUyhyZWdzLVx1MDAzZWEwKSAhPSBSTUlfSU5DT01QTEVURSkpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAoY2FuY2VsbGVkKVxuK1x0XHRyZXR1cm4gLUVDQU5DRUxFRDtcbitcbitcdHJldHVybiByZWdzLVx1MDAzZWEwO1xuK31cbitFWFBPUlRfU1lNQk9MX0dQTChybWlfc3JvX21lbXhmZXJfZXhlY3V0ZSk7XG4rXG4rLyogRm9yIFJNSSBjb21tYW5kcyB0aGF0IGFyZSBzdGF0ZWZ1bCBidXQgbm90IG1lbW9yeS10cmFuc2ZlcnJpbmcgKi9cbitsb25nIHJtaV9zcm9fZXhlY3V0ZShzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzICpyZWdzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgc3JvX2hhbmRsZTtcbitcdGJvb2wgY2FuY2VsbGVkID0gZmFsc2U7XG4rXG4rXHRybWlfc21jY2NfaW52b2tlKHJlZ3MsIHJlZ3MpO1xuK1xuK1x0c3JvX2hhbmRsZSA9IHJlZ3MtXHUwMDNlYTE7XG4rXG4rXHR3aGlsZSAoUk1JX1JFVFVSTl9TVEFUVVMocmVncy1cdTAwM2VhMCkgPT0gUk1JX0lOQ09NUExFVEUpIHtcbitcdFx0Ym9vbCBjYW5fY2FuY2VsID0gUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJlZ3MtXHUwMDNlYTApO1xuK1xuK1x0XHRzd2l0Y2ggKFJNSV9SRVRVUk5fTUVNUkVRKHJlZ3MtXHUwMDNlYTApKSB7XG4rXHRcdGNhc2UgUk1JX09QX01FTV9SRVFfTk9ORTpcbitcdFx0XHRybWlfb3BfY29udGludWUoc3JvX2hhbmRsZSwgUk1JX0NPTlRJTlVFX0tFRVBfR09JTkcsXG4rXHRcdFx0XHRcdHJlZ3MpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdFdBUk5fT05fT05DRSgxKTtcbitcdFx0XHRpZiAoIWNhbl9jYW5jZWwpXG4rXHRcdFx0XHRyZXR1cm4gcmVncy1cdTAwM2VhMDtcbitcbitcdFx0XHRjYW5jZWxsZWQgPSB0cnVlO1xuK1x0XHRcdHJtaV9vcF9jYW5jZWwoc3JvX2hhbmRsZSwgcmVncyk7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChjYW5jZWxsZWQpXG4rXHRcdHJldHVybiAtRUNBTkNFTEVEO1xuK1xuK1x0cmV0dXJuIHJlZ3MtXHUwMDNlYTA7XG4rfVxuK0VYUE9SVF9TWU1CT0xfR1BMKHJtaV9zcm9fZXhlY3V0ZSk7XG4rXG4rc3RhdGljIGludCBybWlfY2hlY2tfdmVyc2lvbih2b2lkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcdHVuc2lnbmVkIHNob3J0IHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3I7XG4rXHR1bnNpZ25lZCBsb25nIGhvc3RfdmVyc2lvbiA9IFJNSV9BQklfVkVSU0lPTihSTUlfQUJJX01BSk9SX1ZFUlNJT04sXG4rXHRcdFx0XHRcdFx0ICAgICBSTUlfQUJJX01JTk9SX1ZFUlNJT04pO1xuK1x0dW5zaWduZWQgbG9uZyBhYTY0cGZyMCA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIwX0VMMSk7XG4rXG4rXHQvKiBJZiBSTUUgaXNuJ3Qgc3VwcG9ydGVkLCB0aGVuIFJNSSBjYW4ndCBiZSAqL1xuK1x0aWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF91bnNpZ25lZF9maWVsZChhYTY0cGZyMCwgSURfQUE2NFBGUjBfRUwxX1JNRV9TSElGVCkgPT0gMClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfVkVSU0lPTiwgaG9zdF92ZXJzaW9uLCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBTTUNDQ19SRVRfTk9UX1NVUFBPUlRFRClcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcbitcdHZlcnNpb25fbWFqb3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01BSk9SKHJlcy5hMSk7XG4rXHR2ZXJzaW9uX21pbm9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NSU5PUihyZXMuYTEpO1xuK1xuK1x0aWYgKHJlcy5hMCAhPSBSTUlfU1VDQ0VTUykge1xuK1x0XHR1bnNpZ25lZCBzaG9ydCBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcjtcbitcbitcdFx0aGlnaF92ZXJzaW9uX21ham9yID0gUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUihyZXMuYTIpO1xuK1x0XHRoaWdoX3ZlcnNpb25fbWlub3IgPSBSTUlfQUJJX1ZFUlNJT05fR0VUX01JTk9SKHJlcy5hMik7XG4rXG4rXHRcdHByX2VycihcIlVuc3VwcG9ydGVkIFJNSSBBQkkgKHYlZC4lZCAtIHYlZC4lZCkgd2Ugd2FudCB2JWQuJWRcXG5cIixcbitcdFx0ICAgICAgIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IsXG4rXHRcdCAgICAgICBoaWdoX3ZlcnNpb25fbWFqb3IsIGhpZ2hfdmVyc2lvbl9taW5vcixcbitcdFx0ICAgICAgIFJNSV9BQklfTUFKT1JfVkVSU0lPTixcbitcdFx0ICAgICAgIFJNSV9BQklfTUlOT1JfVkVSU0lPTik7XG4rXHRcdHJldHVybiAtRU5YSU87XG4rXHR9XG4rXG4rXHRwcl9pbmZvKFwiUk1JIEFCSSB2ZXJzaW9uICVkLiVkXFxuXCIsIHZlcnNpb25fbWFqb3IsIHZlcnNpb25fbWlub3IpO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3JlYWRfZmVhdHVyZXModm9pZClcbit7XG4rXHQvKlxuK1x0ICogU2luY2Ugd2UndmUgbmVnb3RpYXRlZCBhIGNvbXBhdGlibGUgdmVyc2lvbiB0aGVzZSBmZWF0dXJlIHJlZ2lzdGVyc1xuK1x0ICogc2hvdWxkIGFsd2F5cyBiZSBhdmFpbGFibGVcbitcdCAqL1xuK1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIFJNSV9GRUFUX1JFR19DT1VOVDsgaSsrKSB7XG4rXHRcdGlmIChXQVJOX09OKHJtaV9mZWF0dXJlcyhpLCBcdTAwMjZybWlfZmVhdF9yZWdfY2FjaGVbaV0pKSlcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9jb25maWd1cmUodm9pZClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGdyYW51bGVfZmVhdHVyZTtcbitcdHVuc2lnbmVkIGxvbmcgZ3JhbnVsZV9zaXplO1xuK1x0aW50IHJldCA9IDA7XG4rXHRzdHJ1Y3Qgcm1tX2NvbmZpZyAqY29uZmlnO1xuK1xuK1x0c3dpdGNoIChQQUdFX1NJWkUpIHtcbitcdGNhc2UgU1pfNEs6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNEtCO1xuK1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzRLQjtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFNaXzE2SzpcbitcdFx0Z3JhbnVsZV9zaXplID0gUk1JX0dSQU5VTEVfU0laRV8xNktCO1xuK1x0XHRncmFudWxlX2ZlYXR1cmUgPSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzE2S0I7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBTWl82NEs6XG4rXHRcdGdyYW51bGVfc2l6ZSA9IFJNSV9HUkFOVUxFX1NJWkVfNjRLQjtcbitcdFx0Z3JhbnVsZV9mZWF0dXJlID0gUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9STUlfR1JBTl9TWl82NEtCO1xuK1x0XHRicmVhaztcbitcdGRlZmF1bHQ6XG4rXHRcdEJVSUxEX0JVRygpO1xuK1x0fVxuK1xuK1x0aWYgKCEocm1pX2ZlYXRfcmVnKDEpIFx1MDAyNiBncmFudWxlX2ZlYXR1cmUpKSB7XG4rXHRcdHByX2VycihcIlJNTSBkb2VzIG5vdCBzdXBwb3J0ICVsdUtCIGdyYW51bGVzXFxuXCIsXG4rXHRcdCAgICAgICBQQUdFX1NJWkUgXHUwMDNlXHUwMDNlIDEwKTtcbitcdFx0cmV0dXJuIC1FTlhJTztcbitcdH1cbitcbitcdGNvbmZpZyA9IChzdHJ1Y3Qgcm1tX2NvbmZpZyAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTtcbitcdGlmICghY29uZmlnKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdGNvbmZpZy1cdTAwM2VybWlfZ3JhbnVsZV9zaXplID0gZ3JhbnVsZV9zaXplO1xuK1xuK1x0LypcbitcdCAqIEZvciBub3cgd2Ugc2V0IHRoZSB0cmFja2luZ19yZWdpb25fc2l6ZSB0byAwIHdoaWNoIGlzIHRoZSBvbmx5IG9wdGlvblxuK1x0ICogZm9yIDRLQiBQQUdFX1NJWkUgKDFHQiBmb3IgNEtCIFBBR0VfU0laRSwgMzJNQi81MTJNQiBmb3IgMTZLQi82NEtCKS5cbitcdCAqIFRPRE86IFN1cHBvcnQgb3RoZXIgdHJhY2tpbmcgc2l6ZXMgdmlhIEtjb25maWcgb3B0aW9uIGZvciBvdGhlclxuK1x0ICogUEFHRV9TSVpFU1xuK1x0ICovXG4rXHRjb25maWctXHUwMDNldHJhY2tpbmdfcmVnaW9uX3NpemUgPSAwO1xuK1xuK1x0cmV0ID0gcm1pX3JtbV9jb25maWdfc2V0KHZpcnRfdG9fcGh5cyhjb25maWcpKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGNvbmZpZyBzZXQgZmFpbGVkXFxuXCIpO1xuK1x0XHRyZXQgPSAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNvbmZpZyk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKlxuKyAqIE1ha2Ugc3VyZSB0aGUgYXJlYSBpcyB0cmFja2VkIGJ5IFJNTSBhdCBGSU5FIGdyYW51bGFyaXR5LlxuKyAqIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoZSB0cmFja2luZyB5ZXQuXG4rICovXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X21lbW9yeV90cmFja2luZyhwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKVxuK3tcbitcdHdoaWxlIChzdGFydCBcdTAwM2MgZW5kKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcmV0LCBjYXRlZ29yeSwgc3RhdGUsIG5leHQ7XG4rXG4rXHRcdHJldCA9IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldChzdGFydCwgZW5kLCBcdTAwMjZjYXRlZ29yeSwgXHUwMDI2c3RhdGUsIFx1MDAyNm5leHQpO1xuK1x0XHRpZiAocmV0ICE9IFJNSV9TVUNDRVNTKVxuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0XHRpZiAoc3RhdGUgIT0gUk1JX1RSQUNLSU5HX0ZJTkUgfHxcbitcdFx0ICAgIGNhdGVnb3J5ICE9IFJNSV9NRU1fQ0FURUdPUllfQ09OVkVOVElPTkFMKSB7XG4rXHRcdFx0LyogVE9ETzogU2V0IGdyYW51bGUgdHJhY2tpbmcgaW4gdGhpcyBjYXNlICovXG4rXHRcdFx0cHJfZXJyKFwiR3JhbnVsZSB0cmFja2luZyBmb3IgcmVnaW9uIGlzbid0IGZpbmUvY29udmVudGlvbmFsOiAlbGx4LSVseFxcblwiLFxuK1x0XHRcdCAgICAgICBzdGFydCwgbmV4dCk7XG4rXHRcdFx0cmV0dXJuIC1FTk9ERVY7XG4rXHRcdH1cbitcdFx0c3RhcnQgPSBuZXh0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qXG4rICogV2UgZG8gbm90IHN1cHBvcnQgY3JlYXRpbmcgTDEgR1BUcyB5ZXQuIFNvLCBtYWtlIHN1cmUgdGhhdFxuKyAqIGFsbCB0aGUgcmVnaW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZmlybXdhcmUuXG4rICovXG4rc3RhdGljIGludCBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4re1xuK1x0dW5zaWduZWQgbG9uZyBsMGdwdF9zejtcbitcdHVuc2lnbmVkIGxvbmcgbmV4dCwgcGFyX3N0YXRlO1xuK1xuK1x0bDBncHRfc3ogPSAxVUwgXHUwMDNjXHUwMDNjICgzMCArIEZJRUxEX0dFVChSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX0wwR1BUU1osXG4rXHRcdFx0XHRcdCAgcm1pX2ZlYXRfcmVnKDEpKSk7XG4rXHRzdGFydCA9IEFMSUdOX0RPV04oc3RhcnQsIGwwZ3B0X3N6KTtcbitcdGVuZCA9IEFMSUdOKGVuZCwgbDBncHRfc3opO1xuK1xuK1x0d2hpbGUgKHN0YXJ0IFx1MDAzYyBlbmQpIHtcbitcdFx0bG9uZyByZXQgPSBybWlfZ3B0X2luZm8oc3RhcnQsIGVuZCwgXHUwMDI2bmV4dCwgXHUwMDI2cGFyX3N0YXRlKTtcbitcbitcdFx0aWYgKHJldCAhPSBSTUlfU1VDQ0VTUylcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdFx0aWYgKHBhcl9zdGF0ZSAhPSBSTUlfR1BUX1BBUl9QTEFUKSB7XG4rXHRcdFx0cHJfZXJyKFwiR1BUIGZvciB0aGUgcmVnaW9uIGlzIG5vdCBtYW5hZ2VkIGJ5IGZpcm13YXJlICVsbHgtJWx4XFxuXCIsXG4rXHRcdFx0XHRzdGFydCwgbmV4dCk7XG4rXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4rXHRcdH1cbitcdFx0c3RhcnQgPSBuZXh0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX3ByZXBhcmVfbWVtb3J5KHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHJtaV92ZXJpZnlfbWVtb3J5X3RyYWNraW5nKHN0YXJ0LCBlbmQpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldHVybiBybWlfdmVyaWZ5X2dwdF9maXJtd2FyZV9tYW5hZ2VkKHN0YXJ0LCBlbmQpO1xuK31cbitcbitzdGF0aWMgaW50IHJtaV9pbml0X21ldGFkYXRhKHZvaWQpXG4re1xuK1x0cGh5c19hZGRyX3Qgc3RhcnQsIGVuZDtcbitcdHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7XG4rXG4rXHRmb3JfZWFjaF9tZW1fcmVnaW9uKHIpIHtcbitcdFx0aW50IHJldDtcbitcbitcdFx0LyogRmlybXdhcmUtcmVzZXJ2ZWQgTk9NQVAgcmVnaW9ucyBhcmUgbm90IHVzYWJsZSBzeXN0ZW0gUkFNICovXG4rXHRcdGlmIChtZW1ibG9ja19pc19ub21hcChyKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0c3RhcnQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHIpIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0XHRlbmQgPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocikgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRcdHJldCA9IHJtaV9wcmVwYXJlX21lbW9yeShzdGFydCwgZW5kKTtcbitcdFx0aWYgKHJldClcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcm1pX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSlcbit7XG4rXHRzdHJ1Y3QgbWVtb3J5X25vdGlmeSAqYXJnID0gZGF0YTtcbitcdHBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7XG4rXHRpbnQgcmV0O1xuK1xuK1x0aWYgKGFjdGlvbiAhPSBNRU1fR09JTkdfT05MSU5FKVxuK1x0XHRyZXR1cm4gTk9USUZZX0RPTkU7XG4rXG4rXHRzdGFydCA9IFBGTl9QSFlTKGFyZy1cdTAwM2VzdGFydF9wZm4pO1xuK1x0ZW5kID0gUEZOX1BIWVMoYXJnLVx1MDAzZXN0YXJ0X3BmbiArIGFyZy1cdTAwM2Vucl9wYWdlcyk7XG4rXHRyZXQgPSBybWlfcHJlcGFyZV9tZW1vcnkoc3RhcnQsIGVuZCk7XG4rXG4rXHRyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyZXQpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJtaV9tZW1vcnlfbmIgPSB7XG4rXHQubm90aWZpZXJfY2FsbCA9IHJtaV9tZW1vcnlfbm90aWZpZXIsXG4rfTtcbitcbitib29sIGlzX3JtaV9hdmFpbGFibGUodm9pZClcbit7XG4rXHRyZXR1cm4gYXJtNjRfcm1pX2lzX2F2YWlsYWJsZTtcbit9XG4rRVhQT1JUX1NZTUJPTF9HUEwoaXNfcm1pX2F2YWlsYWJsZSk7XG4rXG4rc3RhdGljIGludCBfX2luaXQgYXJtNjRfaW5pdF9ybWkodm9pZClcbit7XG4rXHRpbnQgcmV0ID0gMDtcbitcdHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8gPSBOVUxMO1xuK1xuK1x0LyogQ29udGludWUgd2l0aG91dCByZWFsbSBzdXBwb3J0IGlmIHdlIGNhbid0IGFncmVlIG9uIGEgdmVyc2lvbiAqL1xuK1x0cmV0ID0gcm1pX2NoZWNrX3ZlcnNpb24oKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBybWlfcmVhZF9mZWF0dXJlcygpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IHJtaV9jb25maWd1cmUoKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBBY3RpdmF0ZSB0aGUgUk1NICovXG4rXHRzcm8gPSBrbWFsbG9jX29iaigqc3JvKTtcbitcdGlmICghc3JvKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbitcbitcdHJldCA9IHJtaV9ybW1fYWN0aXZhdGUoc3JvKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cHJfZXJyKFwiUk1NIGFjdGl2YXRlIGZhaWxlZFxcblwiKTtcbitcdFx0cmV0ID0gcmV0IFx1MDAzYyAwID8gcmV0IDogLUVOWElPO1xuK1x0XHRnb3RvIG91dF9mcmVlX3NybztcbitcdH1cbitcbitcdHJldCA9IHJtaV9pbml0X21ldGFkYXRhKCk7XG4rXHRpZiAocmV0KVxuK1x0XHRnb3RvIG91dF9kZWFjdGl2YXRlO1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKFx1MDAyNnJtaV9tZW1vcnlfbmIpO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBvdXRfZGVhY3RpdmF0ZTtcbitcbitcdGFybTY0X3JtaV9pc19hdmFpbGFibGUgPSB0cnVlO1xuK1x0cHJfaW5mbyhcIlJNSSBjb25maWd1cmVkXFxuXCIpO1xuK1x0a2ZyZWUoc3JvKTtcbitcbitcdHJldHVybiAwO1xuK1xuK291dF9kZWFjdGl2YXRlOlxuK1x0cm1pX3JtbV9kZWFjdGl2YXRlKHNybyk7XG4rb3V0X2ZyZWVfc3JvOlxuK1x0a2ZyZWUoc3JvKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogTm90ZSBhcm02NF9pbml0X3JtaSgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBrdm1faW5pdF9ybWkoKSBvdGhlcndpc2UgS1ZNXG4rICogd2lsbCBub3Qgc3VwcG9ydCByZWFsbSBndWVzdHMuIHN1YnN5c19pbml0Y2FsbCgpIGlzIGNhbGxlZCBiZWZvcmVcbisgKiBtb2R1bGVfaW5pdCgpICh1c2VkIGZvciBLVk0pIHNvIHRoaXMgaXMgT0suXG4rICovXG4rc3Vic3lzX2luaXRjYWxsKGFybTY0X2luaXRfcm1pKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FybS1ybWktY21kcy5oIGIvaW5jbHVkZS9saW51eC9hcm0tcm1pLWNtZHMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjc0NjI1N2Q3N2RkNjFcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXJtaS1jbWRzLmhcbkBAIC0wLDAgKzEsNjc4IEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbisvKlxuKyAqIENvcHlyaWdodCAoQykgMjAyNiBBUk0gTHRkLlxuKyAqL1xuK1xuKyNpZm5kZWYgX19MSU5VWF9BUk1fUk1JX0NNRFNfSF9cbisjZGVmaW5lIF9fTElOVVhfQVJNX1JNSV9DTURTX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLXJtaS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4rXG4rI2RlZmluZSBSTUlfTUFYX0FERFJfTElTVFx0MjU2XG4rXG4rc3RydWN0IHJtaV9zcm9fc3RhdGUge1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzO1xuK1x0dW5zaWduZWQgbG9uZyBhZGRyX2NvdW50O1xuK1x0dW5zaWduZWQgbG9uZyBhZGRyX2xpc3RbUk1JX01BWF9BRERSX0xJU1RdO1xuK307XG4rXG4rdW5zaWduZWQgbG9uZyBybWlfZmVhdF9yZWcodW5zaWduZWQgbG9uZyBpZCk7XG4rXG4raW50IHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsXG4rXHRcdCAgICAgICBwaHlzX2FkZHJfdCAqb3V0X3BoeXMpO1xuK2ludCBybWlfdW5kZWxlZ2F0ZV9yYW5nZShwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpO1xuK2ludCBmcmVlX2RlbGVnYXRlZF9wYWdlKHBoeXNfYWRkcl90IHBoeXMpO1xuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4re1xuK1x0cmV0dXJuIHJtaV9kZWxlZ2F0ZV9yYW5nZShwaHlzLCBQQUdFX1NJWkUsIE5VTEwpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBybWlfdW5kZWxlZ2F0ZV9wYWdlKHBoeXNfYWRkcl90IHBoeXMpXG4re1xuK1x0cmV0dXJuIHJtaV91bmRlbGVnYXRlX3JhbmdlKHBoeXMsIFBBR0VfU0laRSk7XG4rfVxuK1xuK2Jvb2wgaXNfcm1pX2F2YWlsYWJsZSh2b2lkKTtcbitcbitsb25nIHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8sIGdmcF90IGdmcCk7XG4rdm9pZCBybWlfc3JvX2ZyZWUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybyk7XG4rbG9uZyBybWlfc3JvX2V4ZWN1dGUoc3RydWN0IGFybV9zbWNjY18xXzJfcmVncyAqcmVncyk7XG4rXG4rI2RlZmluZSBybWlfc3JvX21lbXhmZXJfY21kKHNybywgZ2ZwLCAuLi4pICh7XHRcdFx0XHRcXFxuK1x0c3RydWN0IHJtaV9zcm9fc3RhdGUgKl9fc3JvID0gKHNybyk7XHRcdFx0XHRcXFxuK1x0Kl9fc3JvID0gKHN0cnVjdCBybWlfc3JvX3N0YXRlKXsgLnJlZ3MgPSB7X19WQV9BUkdTX199IH07XHRcXFxuK1x0bG9uZyBfX3JldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKF9fc3JvLCBnZnApO1x0XHRcXFxuK1x0cm1pX3Nyb19mcmVlKF9fc3JvKTtcdFx0XHRcdFx0XHRcXFxuK1x0X19yZXQ7XHRcdFx0XHRcdFx0XHRcdFxcXG4rfSlcbitcbisvKipcbisgKiBybWlfcm1tX2NvbmZpZ19zZXQoKSAtIENvbmZpZ3VyZSB0aGUgUk1NXG4rICogQGNmZ19wdHI6IFBBIG9mIGEgc3RydWN0IHJtbV9jb25maWdcbisgKlxuKyAqIFNldHMgY29uZmlndXJhdGlvbiBvcHRpb25zIG9uIHRoZSBSTU0uXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ybW1fY29uZmlnX3NldCh1bnNpZ25lZCBsb25nIGNmZ19wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9STU1fQ09ORklHX1NFVCwgY2ZnX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ybW1fZGVhY3RpdmF0ZSgpIC0gRGVhY3RpdmF0ZSB0aGUgUk1NIGFuZCByZWNsYWltIGFueSBtZW1vcnkgZG9uYXRlZCBhdFxuKyAqIHJtaV9ybW1fYWN0aXZhdGUoKVxuKyAqXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2RlYWN0aXZhdGUoc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUk1NX0RFQUNUSVZBVEUpO1xuK31cbitcbisvKipcbisgKiBybWlfcm1tX2FjdGl2YXRlKCkgLSBBY3RpdmF0ZSB0aGUgUk1NXG4rICogQHNybzogUHJlYWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcm1tX2FjdGl2YXRlKHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLCBTTUNfUk1JX1JNTV9BQ1RJVkFURSk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCgpIC0gR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBHcmFudWxlIHRyYWNraW5nIHJlZ2lvblxuKyAqIEBzdGFydDogQmFzZSBQQSBvZiB0aGUgdHJhY2tpbmcgcmVnaW9uXG4rICogQGVuZDogRW5kIG9mIHRoZSBQQSByZWdpb25cbisgKiBAb3V0X2NhdGVnb3J5OiBNZW1vcnkgY2F0ZWdvcnlcbisgKiBAb3V0X3N0YXRlOiBUcmFja2luZyByZWdpb24gc3RhdGVcbisgKiBAb3V0X3RvcDogVG9wIG9mIHRoZSBtZW1vcnkgcmVnaW9uXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IHJtaV9ncmFudWxlX3RyYWNraW5nX2dldCh1bnNpZ25lZCBsb25nIHN0YXJ0LFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGVuZCxcbitcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X2NhdGVnb3J5LFxuK1x0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfc3RhdGUsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9HUkFOVUxFX1RSQUNLSU5HX0dFVCwgc3RhcnQsIGVuZCwgXHUwMDI2cmVzKTtcbitcbitcdGlmIChyZXMuYTAgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF9jYXRlZ29yeSlcbitcdFx0XHQqb3V0X2NhdGVnb3J5ID0gcmVzLmExO1xuK1x0XHRpZiAob3V0X3N0YXRlKVxuK1x0XHRcdCpvdXRfc3RhdGUgPSByZXMuYTI7XG4rXHRcdGlmIChvdXRfdG9wKVxuK1x0XHRcdCpvdXRfdG9wID0gcmVzLmEzO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLypcbisgKiBybWlfZ3B0X2luZm8gLSBRdWVyeSB0aGUgR1BUIGluZm8gZm9yIHRoZSBnaXZlbiBQQVIuXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgcmVnaW9uXG4rICogQHRvcDogVG9wIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3Agb2YgdGhlIHBoeWlzY2FsIGFkZHJlc3MgcmVnaW9uIGZvciB3aGljaFxuKyAqXHRcdHRoZSBHUFQgQG91dF9ncHRfcGFyX3N0YXRlIGlzIHZhbGlkXG4rICogQG91dF9ncHRfcGFyX3N0YXRlOiBTdGF0ZSBvZiB0aGUgR1BUIGNvdmVyZWQgYnkgW2Jhc2UsIG91dF90b3ApXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ncHRfaW5mbyh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgZW5kLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wLFxuK1x0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nICpvdXRfZ3B0X3Bhcl9zdGF0ZSlcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1BUX0lORk8sIGJhc2UsIGVuZCxcbitcdH07XG4rXG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0XHRpZiAob3V0X2dwdF9wYXJfc3RhdGUpXG4rXHRcdFx0Km91dF9ncHRfcGFyX3N0YXRlID0gcmVncy5hMjtcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9mZWF0dXJlcygpIC0gUmVhZCBmZWF0dXJlIHJlZ2lzdGVyXG4rICogQGluZGV4OiBGZWF0dXJlIHJlZ2lzdGVyIGluZGV4XG4rICogQG91dDogRmVhdHVyZSByZWdpc3RlciB2YWx1ZSBpcyB3cml0dGVuIHRvIHRoaXMgcG9pbnRlclxuKyAqXG4rICogUmV0dXJuOiBSTUkgcmV0dXJuIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGludCBybWlfZmVhdHVyZXModW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqb3V0KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfRkVBVFVSRVMsIGluZGV4LCBcdTAwMjZyZXMpO1xuK1xuK1x0aWYgKHJlcy5hMCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0KVxuK1x0XHQqb3V0ID0gcmVzLmExO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX2dyYW51bGVfcmFuZ2VfZGVsZWdhdGUoKSAtIERlbGVnYXRlIGdyYW51bGVzXG4rICogQGJhc2U6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIG9mIHRoZSByYW5nZVxuKyAqIEB0b3A6IFBBIG9mIHRoZSBmaXJzdCBncmFudWxlIGFmdGVyIHRoZSByYW5nZVxuKyAqIEBvdXRfdG9wOiBQQSBvZiB0aGUgZmlyc3QgZ3JhbnVsZSBub3QgZGVsZWdhdGVkXG4rICpcbisgKiBEZWxlZ2F0ZSBhIHJhbmdlIG9mIGdyYW51bGUgZm9yIHVzZSBieSB0aGUgcmVhbG0gd29ybGQuIElmIHRoZSBlbnRpcmUgcmFuZ2VcbisgKiB3YXMgZGVsZWdhdGVkIHRoZW4gQG91dF90b3AgPT0gQHRvcCwgb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkXG4rICogYWdhaW4gd2l0aCBAYmFzZSA9PSBAb3V0X3RvcC5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfZ3JhbnVsZV9yYW5nZV9kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgdG9wLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nICpvdXRfdG9wKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ncmFudWxlX3JhbmdlX3VuZGVsZWdhdGUoKSAtIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlc1xuKyAqIEBiYXNlOiBCYXNlIFBBIG9mIHRoZSB0YXJnZXQgcmFuZ2VcbisgKiBAdG9wOiBUb3AgUEEgb2YgdGhlIHRhcmdldCByYW5nZVxuKyAqIEBvdXRfdG9wOiBSZXR1cm5zIHRoZSB0b3AgUEEgb2YgcmFuZ2Ugd2hvc2Ugc3RhdGUgaXMgdW5kZWxlZ2F0ZWRcbisgKlxuKyAqIFVuZGVsZWdhdGUgYSByYW5nZSBvZiBncmFudWxlcyB0byBhbGxvdyB1c2UgYnkgdGhlIG5vcm1hbCB3b3JsZC4gV2lsbCBmYWlsIGlmXG4rICogdGhlIGdyYW51bGVzIGFyZSBpbiB1c2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX2dyYW51bGVfcmFuZ2VfdW5kZWxlZ2F0ZSh1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfR1JBTlVMRV9SQU5HRV9VTkRFTEVHQVRFLCBiYXNlLCB0b3BcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MgXHUwMDI2XHUwMDI2IG91dF90b3ApXG4rXHRcdCpvdXRfdG9wID0gcmVncy5hMTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCgpIC0gQ3JlYXRlIGEgcHJvdGVjdGVkIG1hcHBpbmcgd2l0aCBkYXRhIGNvbnRlbnRzXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAZGF0YTogUEEgb2YgdGhlIHRhcmdldCBncmFudWxlXG4rICogQGlwYTogSVBBIGF0IHdoaWNoIHRoZSBncmFudWxlIHdpbGwgYmUgbWFwcGVkIGluIHRoZSBndWVzdFxuKyAqIEBzcmM6IFBBIG9mIHRoZSBzb3VyY2UgZ3JhbnVsZVxuKyAqIEBmbGFnczogUk1JX01FQVNVUkVfQ09OVEVOVCBpZiB0aGUgY29udGVudHMgc2hvdWxkIGJlIG1lYXN1cmVkXG4rICpcbisgKiBDcmVhdGUgYSBtYXBwaW5nIGZyb20gUHJvdGVjdGVkIElQQSBzcGFjZSB0byBjb252ZW50aW9uYWwgbWVtb3J5LCBjb3B5aW5nXG4rICogY29udGVudHMgZnJvbSBhIE5vbi1zZWN1cmUgR3JhbnVsZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXBfaW5pdCh1bnNpZ25lZCBsb25nIHJkLCB1bnNpZ25lZCBsb25nIGRhdGEsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGlwYSwgdW5zaWduZWQgbG9uZyBzcmMsXG4rXHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIGZsYWdzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfREFUQV9NQVBfSU5JVCwgcmQsIGRhdGEsIGlwYSwgc3JjLCBmbGFnc1xuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGF0YV9tYXAoKSAtIENyZWF0ZSBtYXBwaW5ncyBpbiBwcm90ZWN0ZWQgSVBBIHdpdGggdW5rbm93biBjb250ZW50c1xuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGJhc2U6IEJhc2Ugb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgYWRkcmVzcyBvZiByYW5nZSB3aGljaCB3YXMgcHJvY2Vzc2VkLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfZGF0YV9tYXAodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgdW5zaWduZWQgbG9uZyBmbGFncyxcbitcdFx0XHRcdCAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9EQVRBX01BUCwgcmQsIGJhc2UsIHRvcCwgZmxhZ3MsIG9hZGRyXG4rXHR9O1xuK1x0bG9uZyByZXQ7XG4rXG4rXHRyZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2RhdGFfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB0byBjb252ZW50aW9uYWwgbWVtb3J5XG4rICogQHJkOiBQQSBvZiB0aGUgUkQgZm9yIHRoZSB0YXJnZXQgUmVhbG1cbisgKiBAYmFzZTogQmFzZSBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFJldHVybnMgdG9wIElQQSBvZiByYW5nZSB3aGljaCBoYXMgYmVlbiB1bm1hcHBlZFxuKyAqIEBvdXRfcmFuZ2U6IE91dHB1dCBhZGRyZXNzIHJhbmdlXG4rICogQG91dF9jb3VudDogTnVtYmVyIG9mIGVudHJpZXMgaW4gb3V0cHV0IGFkZHJlc3MgbGlzdFxuKyAqXG4rICogUmVtb3ZlcyBtYXBwaW5ncyB0byBjb252ZW50aW9uIG1lbW9yeSB3aXRoIGEgdGFyZ2V0IFByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kYXRhX3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dF9jb3VudClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RBVEFfVU5NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0O1xuK1xuK1x0cmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUykge1xuK1x0XHRpZiAob3V0X3RvcClcbitcdFx0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXHRcdGlmIChvdXRfcmFuZ2UpXG4rXHRcdFx0Km91dF9yYW5nZSA9IHJlZ3MuYTI7XG4rXHRcdGlmIChvdXRfY291bnQpXG4rXHRcdFx0Km91dF9jb3VudCA9IHJlZ3MuYTM7XG4rXHR9XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcHNjaV9jb21wbGV0ZSgpIC0gQ29tcGxldGUgcGVuZGluZyBQU0NJIGNvbW1hbmRcbisgKiBAY2FsbGluZ19yZWM6IFBBIG9mIHRoZSBjYWxsaW5nIFJFQ1xuKyAqIEBzdGF0dXM6IFN0YXR1cyBvZiB0aGUgUFNDSSByZXF1ZXN0XG4rICpcbisgKiBDb21wbGV0ZXMgYSBwZW5kaW5nIFBTQ0kgY29tbWFuZC5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9wc2NpX2NvbXBsZXRlKHVuc2lnbmVkIGxvbmcgY2FsbGluZ19yZWMsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgc3RhdHVzKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUFNDSV9DT01QTEVURSwgY2FsbGluZ19yZWMsIHN0YXR1cywgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9hY3RpdmF0ZSgpIC0gQWN0aXZlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqXG4rICogTWFyayBhIHJlYWxtIGFzIEFjdGl2ZSBzaWduYWxsaW5nIHRoYXQgY3JlYXRpb24gaXMgY29tcGxldGUgYW5kIGFsbG93aW5nXG4rICogZXhlY3V0aW9uIG9mIHRoZSByZWFsbS5cbisgKlxuKyAqIFJldHVybjogUk1JIHJldHVybiBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9hY3RpdmF0ZSh1bnNpZ25lZCBsb25nIHJkKVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlcztcbitcbitcdGFybV9zbWNjY18xXzFfaW52b2tlKFNNQ19STUlfUkVBTE1fQUNUSVZBVEUsIHJkLCBcdTAwMjZyZXMpO1xuK1xuK1x0cmV0dXJuIHJlcy5hMDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3JlYWxtX2NyZWF0ZSgpIC0gQ3JlYXRlIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBwYXJhbXM6IFBBIG9mIHJlYWxtIHBhcmFtZXRlcnNcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogQ3JlYXRlIGEgbmV3IHJlYWxtIHVzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9jcmVhdGUodW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBwYXJhbXMsXG4rXHRcdFx0XHQgICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsXG4rXHRcdFx0XHQgICBTTUNfUk1JX1JFQUxNX0NSRUFURSwgcmQsIHBhcmFtcyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV90ZXJtaW5hdGUoKSAtIFRlcm1pbmF0ZSBhIHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAc3JvOiBQcmVhbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogVGVybWluYXRlcyBhIHJlYWxtLCBtb3ZpbmcgaXQgaW50byBhIFpPTUJJRSBzdGF0ZVxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV90ZXJtaW5hdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdHJldHVybiBybWlfc3JvX21lbXhmZXJfY21kKHNybywgR0ZQX0tFUk5FTCxcbitcdFx0XHRcdCAgIFNNQ19STUlfUkVBTE1fVEVSTUlOQVRFLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWFsbV9kZXN0cm95KCkgLSBEZXN0cm95IGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBzcm86IFByZWFsbG9jYXRlZCBTUk8gY29udGV4dCB0byBiZSB1c2VkXG4rICpcbisgKiBEZXN0cm95cyBhIHJlYWxtLCBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gdGhlIHJlYWxtIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9yZWFsbV9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgIHN0cnVjdCBybWlfc3JvX3N0YXRlICpzcm8pXG4re1xuK1x0cmV0dXJuIHJtaV9zcm9fbWVteGZlcl9jbWQoc3JvLCBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0ICAgU01DX1JNSV9SRUFMTV9ERVNUUk9ZLCByZCk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfY3JlYXRlKCkgLSBDcmVhdGUgYSBSRUNcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHBhcmFtczogUEEgb2YgUkVDIHBhcmFtZXRlcnNcbisgKiBAc3JvOiBBbGxvY2F0ZWQgU1JPIGNvbnRleHQgdG8gYmUgdXNlZFxuKyAqXG4rICogQ3JlYXRlIGEgUkVDIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUgc3RydWN0IHJlY19wYXJhbXMgcG9pbnRlZFxuKyAqIHRvIGJ5IEBwYXJhbXMuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19jcmVhdGUodW5zaWduZWQgbG9uZyByZCxcbitcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgcGFyYW1zLFxuK1x0XHRcdFx0ICBzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSAqc3JvKVxuK3tcbitcdGxvbmcgcmV0O1xuK1xuK1x0KnNybyA9IChzdHJ1Y3Qgcm1pX3Nyb19zdGF0ZSl7LnJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUkVDX0NSRUFURSwgcmQsIHJlYywgcGFyYW1zXG4rXHR9fTtcbitcdHJldCA9IHJtaV9zcm9fbWVteGZlcl9leGVjdXRlKHNybywgR0ZQX0tFUk5FTCk7XG4rXHRybWlfc3JvX2ZyZWUoc3JvKTtcbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfZGVzdHJveSgpIC0gRGVzdHJveSBhIFJFQ1xuKyAqIEByZWM6IFBBIG9mIHRoZSB0YXJnZXQgUkVDXG4rICogQHNybzogQWxsb2NhdGVkIFNSTyBjb250ZXh0IHRvIGJlIHVzZWRcbisgKlxuKyAqIERlc3Ryb3lzIGEgUkVDLiBUaGUgUkVDIG11c3Qgbm90IGJlIHJ1bm5pbmcuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3JlY19kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmVjLFxuK1x0XHRcdFx0ICAgc3RydWN0IHJtaV9zcm9fc3RhdGUgKnNybylcbit7XG4rXHRyZXR1cm4gcm1pX3Nyb19tZW14ZmVyX2NtZChzcm8sIEdGUF9LRVJORUwsIFNNQ19STUlfUkVDX0RFU1RST1ksIHJlYyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9yZWNfZW50ZXIoKSAtIEVudGVyIGEgUkVDXG4rICogQHJlYzogUEEgb2YgdGhlIHRhcmdldCBSRUNcbisgKiBAcnVuX3B0cjogUEEgb2YgUmVjUnVuIHN0cnVjdHVyZVxuKyAqXG4rICogU3RhcnRzIChvciBjb250aW51ZXMpIGV4ZWN1dGlvbiB3aXRoaW4gYSBSRUMuXG4rICpcbisgKiBSZXR1cm46IFJNSSByZXR1cm4gY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcmVjX2VudGVyKHVuc2lnbmVkIGxvbmcgcmVjLCB1bnNpZ25lZCBsb25nIHJ1bl9wdHIpXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY19yZXMgcmVzO1xuK1xuK1x0YXJtX3NtY2NjXzFfMV9pbnZva2UoU01DX1JNSV9SRUNfRU5URVIsIHJlYywgcnVuX3B0ciwgXHUwMDI2cmVzKTtcbitcbitcdHJldHVybiByZXMuYTA7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfY3JlYXRlKCkgLSBDcmVhdGVzIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJ0dDogUEEgb2YgdGhlIHRhcmdldCBSVFRcbisgKiBAaXBhOiBCYXNlIG9mIHRoZSBJUEEgcmFuZ2UgZGVzY3JpYmVkIGJ5IHRoZSBSVFRcbisgKiBAbGV2ZWw6IERlcHRoIG9mIHRoZSBSVFQgd2l0aGluIHRoZSB0cmVlXG4rICpcbisgKiBDcmVhdGVzIGFuIFJUVCAoUmVhbG0gVHJhbnNsYXRpb24gVGFibGUpIGF0IHRoZSBzcGVjaWZpZWQgbGV2ZWwgZm9yIHRoZVxuKyAqIHRyYW5zbGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoaW4gdGhlIHJlYWxtLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfY3JlYXRlKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgcnR0LFxuK1x0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGlwYSwgbG9uZyBsZXZlbClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0NSRUFURSwgcmQsIHJ0dCwgaXBhLCBsZXZlbFxuK1x0fTtcbitcbitcdHJldHVybiBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rfVxuK1xuKy8qKlxuKyAqIHJtaV9ydHRfZGVzdHJveSgpIC0gRGVzdHJveSBhbiBSVFRcbisgKiBAcmQ6IFBBIG9mIHRoZSBSRCBmb3IgdGhlIHRhcmdldCByZWFsbVxuKyAqIEBpcGE6IEJhc2Ugb2YgdGhlIElQQSByYW5nZSBkZXNjcmliZWQgYnkgdGhlIFJUVFxuKyAqIEBsZXZlbDogUlRUIGxldmVsXG4rICogQG91dF9ydHQ6IFBvaW50ZXIgdG8gd3JpdGUgdGhlIFBBIG9mIHRoZSBSVFQgd2hpY2ggd2FzIGRlc3Ryb3llZFxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRoZSB0b3AgSVBBIG9mIG5vbi1saXZlIFJUVCBlbnRyaWVzLCBmcm9tIGVudHJ5XG4rICogYXQgd2hpY2ggdGhlIFJUVCB3YWxrIHRlcm1pbmF0ZWQuXG4rICpcbisgKiBEZXN0cm95cyBhbiBSVFQuIFRoZSBSVFQgbXVzdCBiZSBub24tbGl2ZSwgaS5lLiBub25lIG9mIHRoZSBlbnRyaWVzIGluIHRoZVxuKyAqIHRhYmxlIGFyZSBpbiBBU1NJR05FRCBvciBUQUJMRSBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9kZXN0cm95KHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIGlwYSxcbitcdFx0XHRcdCAgIGxvbmcgbGV2ZWwsXG4rXHRcdFx0XHQgICB1bnNpZ25lZCBsb25nICpvdXRfcnR0LFxuK1x0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0RFU1RST1ksIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTKSB7XG4rXHRcdGlmIChvdXRfcnR0KVxuK1x0XHRcdCpvdXRfcnR0ID0gcmVncy5hMTtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmEyO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9mb2xkKCkgLSBGb2xkIGFuIFJUVFxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQGlwYTogQmFzZSBvZiB0aGUgSVBBIHJhbmdlIGRlc2NyaWJlZCBieSB0aGUgUlRUXG4rICogQGxldmVsOiBEZXB0aCBvZiB0aGUgUlRUIHdpdGhpbiB0aGUgdHJlZVxuKyAqIEBvdXRfcnR0OiBQb2ludGVyIHRvIHdyaXRlIHRoZSBQQSBvZiB0aGUgUlRUIHdoaWNoIHdhcyBkZXN0cm95ZWRcbisgKlxuKyAqIEZvbGRzIGFuIFJUVC4gSWYgYWxsIGVudHJpZXMgd2l0aCB0aGUgUlRUIGFyZSAnaG9tb2dlbmVvdXMnIHRoZSBSVFQgY2FuIGJlXG4rICogZm9sZGVkIGludG8gdGhlIHBhcmVudCBhbmQgdGhlIFJUVCBkZXN0cm95ZWQuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9mb2xkKHVuc2lnbmVkIGxvbmcgcmQsIHVuc2lnbmVkIGxvbmcgaXBhLFxuK1x0XHRcdFx0bG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyAqb3V0X3J0dClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX0ZPTEQsIHJkLCBpcGEsIGxldmVsXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfcnR0KVxuK1x0XHQqb3V0X3J0dCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X2luaXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgbmV3IHJlYWxtXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIG9mIHJhbmdlIHdob3NlIFJJUEFTIHdhcyBtb2RpZmllZFxuKyAqXG4rICogU2V0cyB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBIHJhbmdlIHRvIFJBTSwgZm9yIGEgcmVhbG0gaW4gdGhlIE5FVyBzdGF0ZS5cbisgKlxuKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBwb3NpdGl2ZSBSTUkgcmVzdWx0IGNvZGUgb3IgbmVnYXRpdmUgTGludXggZXJyb3IgY29kZVxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgbG9uZyBybWlfcnR0X2luaXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyBiYXNlLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyB0b3AsIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9JTklUX1JJUEFTLCByZCwgYmFzZSwgdG9wXG4rXHR9O1xuK1x0bG9uZyByZXQgPSBybWlfc3JvX2V4ZWN1dGUoXHUwMDI2cmVncyk7XG4rXG4rXHRpZiAocmV0ID09IFJNSV9TVUNDRVNTIFx1MDAyNlx1MDAyNiBvdXRfdG9wKVxuK1x0XHQqb3V0X3RvcCA9IHJlZ3MuYTE7XG4rXG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbisvKipcbisgKiBybWlfcnR0X3VucHJvdF9tYXAoKSAtIE1hcCB1bnByb3RlY3RlZCBncmFudWxlcyBpbnRvIGEgcmVhbG1cbisgKiBAcmQ6IFBBIG9mIHRoZSBSRFxuKyAqIEBiYXNlOiBCYXNlIElQQSBvZiB0aGUgbWFwcGluZ1xuKyAqIEB0b3A6IFRvcCBvZiB0aGUgdGFyZ2V0IElQQSByYW5nZVxuKyAqIEBmbGFnczogRmxhZ3NcbisgKiBAb2FkZHI6IE91dHB1dCBhZGRyZXNzIHNldCBkZXNjcmlwdG9yXG4rICogQG91dF90b3A6IFRvcCBJUEEgb2YgcmFuZ2Ugd2hpY2ggaGFzIGJlZW4gbWFwcGVkXG4rICpcbisgKiBDcmVhdGUgbWFwcGluZ3MgdG8gbWVtb3J5IHdpdGhpbiBhIHRhcmdldCB1bnByb3RlY3RlZCBJUEEgcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF91bnByb3RfbWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIGJhc2UsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIHRvcCxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHQgICAgICB1bnNpZ25lZCBsb25nIG9hZGRyLFxuK1x0XHRcdFx0ICAgICAgdW5zaWduZWQgbG9uZyAqb3V0X3RvcClcbit7XG4rXHRzdHJ1Y3QgYXJtX3NtY2NjXzFfMl9yZWdzIHJlZ3MgPSB7XG4rXHRcdFNNQ19STUlfUlRUX1VOUFJPVF9NQVAsIHJkLCBiYXNlLCB0b3AsIGZsYWdzLCBvYWRkclxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF9zZXRfcmlwYXMoKSAtIFNldCBSSVBBUyBmb3IgYW4gcnVubmluZyByZWFsbVxuKyAqIEByZDogUEEgb2YgdGhlIFJEXG4rICogQHJlYzogUEEgb2YgdGhlIFJFQyBtYWtpbmcgdGhlIHJlcXVlc3RcbisgKiBAYmFzZTogQmFzZSBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEB0b3A6IFRvcCBvZiB0YXJnZXQgSVBBIHJlZ2lvblxuKyAqIEBvdXRfdG9wOiBQb2ludGVyIHRvIHdyaXRlIHRvcCBJUEEgb2YgcmFuZ2Ugd2hvc2UgUklQQVMgd2FzIG1vZGlmaWVkXG4rICpcbisgKiBDb21wbGV0ZXMgYSByZXF1ZXN0IG1hZGUgYnkgdGhlIHJlYWxtIHRvIGNoYW5nZSB0aGUgUklQQVMgb2YgYSB0YXJnZXQgSVBBXG4rICogcmFuZ2UuXG4rICpcbisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgcG9zaXRpdmUgUk1JIHJlc3VsdCBjb2RlIG9yIG5lZ2F0aXZlIExpbnV4IGVycm9yIGNvZGVcbisgKi9cbitzdGF0aWMgaW5saW5lIGxvbmcgcm1pX3J0dF9zZXRfcmlwYXModW5zaWduZWQgbG9uZyByZCwgdW5zaWduZWQgbG9uZyByZWMsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHQgICAgIHVuc2lnbmVkIGxvbmcgKm91dF90b3ApXG4re1xuK1x0c3RydWN0IGFybV9zbWNjY18xXzJfcmVncyByZWdzID0ge1xuK1x0XHRTTUNfUk1JX1JUVF9TRVRfUklQQVMsIHJkLCByZWMsIGJhc2UsIHRvcFxuK1x0fTtcbitcdGxvbmcgcmV0ID0gcm1pX3Nyb19leGVjdXRlKFx1MDAyNnJlZ3MpO1xuK1xuK1x0aWYgKHJldCA9PSBSTUlfU1VDQ0VTUyBcdTAwMjZcdTAwMjYgb3V0X3RvcClcbitcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rLyoqXG4rICogcm1pX3J0dF91bnByb3RfdW5tYXAoKSAtIFJlbW92ZSBtYXBwaW5ncyB3aXRoaW4gYW4gdW5wcm90ZWN0ZWQgSVBBIHJhbmdlXG4rICogQHJkOiBQQSBvZiB0aGUgUkRcbisgKiBAYmFzZTogQmFzZSBJUEEgb2YgdGhlIG1hcHBpbmdcbisgKiBAdG9wOiBUb3Agb2YgdGhlIHRhcmdldCBJUEEgcmFuZ2VcbisgKiBAZmxhZ3M6IEZsYWdzXG4rICogQG9hZGRyOiBPdXRwdXQgYWRkcmVzcyBzZXQgZGVzY3JpcHRvclxuKyAqIEBvdXRfdG9wOiBUb3AgSVBBIHdoaWNoIGhhcyBiZWVuIHVubWFwcGVkXG4rICogQG91dF9yYW5nZTogT3V0cHV0IGFkZHJlc3MgcmFuZ2VcbisgKiBAb3V0X2NvdW50OiBOdW1iZXIgb2YgZW50cmllcyBpbiBvdXRwdXQgYWRkcmVzcyBsaXN0XG4rICpcbisgKiBSZW1vdmVzIG1hcHBpbmdzIHRvIG1lbW9yeSB3aXRoaW4gYSB0YXJnZXQgdW5wcm90ZWN0ZWQgSVBBIHJhbmdlLlxuKyAqXG4rICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIHBvc2l0aXZlIFJNSSByZXN1bHQgY29kZSBvciBuZWdhdGl2ZSBMaW51eCBlcnJvciBjb2RlXG4rICovXG4rc3RhdGljIGlubGluZSBsb25nIHJtaV9ydHRfdW5wcm90X3VubWFwKHVuc2lnbmVkIGxvbmcgcmQsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgYmFzZSxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyB0b3AsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3MsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgb2FkZHIsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF90b3AsXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgKm91dF9yYW5nZSxcbitcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyAqb3V0X2NvdW50KVxuK3tcbitcdHN0cnVjdCBhcm1fc21jY2NfMV8yX3JlZ3MgcmVncyA9IHtcbitcdFx0U01DX1JNSV9SVFRfVU5QUk9UX1VOTUFQLCByZCwgYmFzZSwgdG9wLCBmbGFncywgb2FkZHJcbitcdH07XG4rXHRsb25nIHJldCA9IHJtaV9zcm9fZXhlY3V0ZShcdTAwMjZyZWdzKTtcbitcbitcdGlmIChyZXQgPT0gUk1JX1NVQ0NFU1MpIHtcbitcdFx0aWYgKG91dF90b3ApXG4rXHRcdFx0Km91dF90b3AgPSByZWdzLmExO1xuK1x0XHRpZiAob3V0X3JhbmdlKVxuK1x0XHRcdCpvdXRfcmFuZ2UgPSByZWdzLmEyO1xuK1x0XHRpZiAob3V0X2NvdW50KVxuK1x0XHRcdCpvdXRfY291bnQgPSByZWdzLmEzO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rI2VuZGlmXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hcm0tc21jY2Mtcm1pLmggYi9pbmNsdWRlL2xpbnV4L2FybS1zbWNjYy1ybWkuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjNlYjg4Y2FmNDA5NjRcbi0tLSAvZGV2L251bGxcbisrKyBiL2luY2x1ZGUvbGludXgvYXJtLXNtY2NjLXJtaS5oXG5AQCAtMCwwICsxLDQ5NCBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4rLypcbisgKiBDb3B5cmlnaHQgKEMpIDIwMjMtMjAyNiBBUk0gTHRkLlxuKyAqXG4rICogVGhlIHZhbHVlcyBhbmQgc3RydWN0dXJlcyBpbiB0aGlzIGZpbGUgYXJlIGZyb20gdGhlIFJlYWxtIE1hbmFnZW1lbnQgTW9uaXRvclxuKyAqIHNwZWNpZmljYXRpb24gKERFTjAxMzcpIHZlcnNpb24gMi4wLWJldDM6XG4rICogaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uL2RlbjAxMzcvMi0wYmV0My9cbisgKi9cbitcbisjaWZuZGVmIF9fTElOVVhfQVJNX1NNQ0NDX1JNSV9IX1xuKyNkZWZpbmUgX19MSU5VWF9BUk1fU01DQ0NfUk1JX0hfXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYXJtLXNtY2NjLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRmaWVsZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYml0cy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zaXplcy5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXHUwMDNjYXNtL3BhZ2UuaFx1MDAzZVxuK1xuKyNkZWZpbmUgU01DX1JNSV9DQUxMKGZ1bmMpXHRcdFx0XHRcXFxuK1x0QVJNX1NNQ0NDX0NBTExfVkFMKEFSTV9TTUNDQ19GQVNUX0NBTEwsXHRcdFxcXG4rXHRcdFx0ICAgQVJNX1NNQ0NDX1NNQ182NCxcdFx0XFxcbitcdFx0XHQgICBBUk1fU01DQ0NfT1dORVJfU1RBTkRBUkQsXHRcXFxuK1x0XHRcdCAgIChmdW5jKSlcbitcbisjZGVmaW5lIFNNQ19STUlfVkVSU0lPTlx0XHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MClcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQX0lOSVRcdFx0U01DX1JNSV9DQUxMKDB4MDE1MylcbitcbisjZGVmaW5lIFNNQ19STUlfUkVBTE1fQUNUSVZBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU3KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTU4KVxuKyNkZWZpbmUgU01DX1JNSV9SRUFMTV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1OSlcbisjZGVmaW5lIFNNQ19STUlfUkVDX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWEpXG4rI2RlZmluZSBTTUNfUk1JX1JFQ19ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YilcbisjZGVmaW5lIFNNQ19STUlfUkVDX0VOVEVSXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNWQpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE1ZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX1JFQURfRU5UUllcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTYxKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX1ZBTElEQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxNjMpXG4rI2RlZmluZSBTTUNfUk1JX1BTQ0lfQ09NUExFVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY0KVxuKyNkZWZpbmUgU01DX1JNSV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAxNjUpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9GT0xEXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2NilcbitcbisjZGVmaW5lIFNNQ19STUlfUlRUX0lOSVRfUklQQVNcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1JJUEFTXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2OSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfQ1JFQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2YSlcbisjZGVmaW5lIFNNQ19STUlfVlNNTVVfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNmIpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9DT05GSUdfU0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE2ZSlcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSVJRX05PVElGWVx0XHRTTUNfUk1JX0NBTEwoMHgwMTZmKVxuKyNkZWZpbmUgU01DX1JNSV9BVFRFU1RfUExBVF9UT0tFTl9SRUZSRVNIXHRTTUNfUk1JX0NBTEwoMHgwMTcwKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9QREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3NClcbisjZGVmaW5lIFNNQ19STUlfUERFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTc1KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxNzcpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3OClcbitcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fS0VZX1JFRlJFU0hcdFx0U01DX1JNSV9DQUxMKDB4MDE3YSlcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TRVRfUFVCS0VZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVE9QXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE3YylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9DUkVBVEVcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0RFU1RST1lcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdlKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX0ZPTERcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMTdmKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0FCT1JUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4NSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9DT01NVU5JQ0FURVx0XHRTTUNfUk1JX0NBTEwoMHgwMTg2KVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODcpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfREVTVFJPWVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxODgpXG4rI2RlZmluZSBTTUNfUk1JX1ZERVZfR0VUX1NUQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDE4OSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9VTkxPQ0tcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfU0VUX1MyQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMThiKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9JTlRFUkZBQ0VfUkVQT1JUXHRTTUNfUk1JX0NBTEwoMHgwMWQwKVxuKyNkZWZpbmUgU01DX1JNSV9WREVWX0dFVF9NRUFTVVJFTUVOVFNcdFx0U01DX1JNSV9DQUxMKDB4MDFkMSlcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9MT0NLXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkMilcbisjZGVmaW5lIFNNQ19STUlfVkRFVl9TVEFSVFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDMpXG4rXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0VWRU5UX0hBTkRMRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWQ2KVxuKyNkZWZpbmUgU01DX1JNSV9QU01NVV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZDcpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX0RFQUNUSVZBVEVcdFx0U01DX1JNSV9DQUxMKDB4MDFkOClcbitcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfU1RfTDJfQ1JFQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZGIpXG4rI2RlZmluZSBTTUNfUk1JX1BTTU1VX1NUX0wyX0RFU1RST1lcdFx0U01DX1JNSV9DQUxMKDB4MDFkYylcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wwX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGQpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMF9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFkZSlcbisjZGVmaW5lIFNNQ19STUlfRFBUX0wxX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZGYpXG4rI2RlZmluZSBTTUNfUk1JX0RQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMClcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19HRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMSlcbitcbisjZGVmaW5lIFNNQ19STUlfR1JBTlVMRV9UUkFDS0lOR19TRVRcdFx0U01DX1JNSV9DQUxMKDB4MDFlMylcbitcbisjZGVmaW5lIFNNQ19STUlfUk1NX0NPTkZJR19HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWVjKVxuK1xuKyNkZWZpbmUgU01DX1JNSV9STU1fU1RBVEVfR0VUXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFlZSlcbitcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfRVZFTlRfQ09OU1VNRVx0XHRTTUNfUk1JX0NBTEwoMHgwMWYwKVxuKyNkZWZpbmUgU01DX1JNSV9HUkFOVUxFX1JBTkdFX0RFTEVHQVRFXHRcdFNNQ19STUlfQ0FMTCgweDAxZjEpXG4rI2RlZmluZSBTTUNfUk1JX0dSQU5VTEVfUkFOR0VfVU5ERUxFR0FURVx0U01DX1JNSV9DQUxMKDB4MDFmMilcbisjZGVmaW5lIFNNQ19STUlfR1BUX0wxX0NSRUFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjMpXG4rI2RlZmluZSBTTUNfUk1JX0dQVF9MMV9ERVNUUk9ZXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNClcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfTUFQXHRcdFx0U01DX1JNSV9DQUxMKDB4MDFmNSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0RBVEFfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY2KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfREVWX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZjcpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9ERVZfVU5NQVBcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMWY4KVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVJDSF9ERVZfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZjkpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BUkNIX0RFVl9VTk1BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZhKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfVU5QUk9UX01BUFx0XHRcdFNNQ19STUlfQ0FMTCgweDAxZmIpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9VTlBST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmYylcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9QUk9UX01BUFx0XHRTTUNfUk1JX0NBTEwoMHgwMWZkKVxuKyNkZWZpbmUgU01DX1JNSV9SVFRfQVVYX1BST1RfVU5NQVBcdFx0U01DX1JNSV9DQUxMKDB4MDFmZSlcbisjZGVmaW5lIFNNQ19STUlfUlRUX0FVWF9VTlBST1RfTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAxZmYpXG4rI2RlZmluZSBTTUNfUk1JX1JUVF9BVVhfVU5QUk9UX1VOTUFQXHRcdFNNQ19STUlfQ0FMTCgweDAyMDApXG4rI2RlZmluZSBTTUNfUk1JX1JFQUxNX1RFUk1JTkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDEpXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9BQ1RJVkFURVx0XHRcdFNNQ19STUlfQ0FMTCgweDAyMDIpXG4rI2RlZmluZSBTTUNfUk1JX09QX0NPTlRJTlVFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwMylcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fQ09OTkVDVFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA0KVxuKyNkZWZpbmUgU01DX1JNSV9QREVWX1NUUkVBTV9ESVNDT05ORUNUXHRcdFNNQ19STUlfQ0FMTCgweDAyMDUpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0NPTVBMRVRFXHRcdFNNQ19STUlfQ0FMTCgweDAyMDYpXG4rI2RlZmluZSBTTUNfUk1JX1BERVZfU1RSRUFNX0tFWV9QVVJHRVx0XHRTTUNfUk1JX0NBTEwoMHgwMjA3KVxuKyNkZWZpbmUgU01DX1JNSV9PUF9NRU1fRE9OQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwOClcbisjZGVmaW5lIFNNQ19STUlfT1BfTUVNX1JFQ0xBSU1cdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjA5KVxuKyNkZWZpbmUgU01DX1JNSV9PUF9DQU5DRUxcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBhKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9GRUFUVVJFU1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGIpXG4rI2RlZmluZSBTTUNfUk1JX1ZTTU1VX0NNRF9HRVRcdFx0XHRTTUNfUk1JX0NBTEwoMHgwMjBjKVxuKyNkZWZpbmUgU01DX1JNSV9WU01NVV9DTURfQ09NUExFVEVcdFx0U01DX1JNSV9DQUxMKDB4MDIwZClcbisjZGVmaW5lIFNNQ19STUlfUFNNTVVfSU5GT1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMGUpXG4rI2RlZmluZSBTTUNfUk1JX1JNTV9ERUFDVElWQVRFXHRcdFx0U01DX1JNSV9DQUxMKDB4MDIwZilcbisjZGVmaW5lIFNNQ19STUlfUERFVl9TVFJFQU1fSU5GT1x0XHRTTUNfUk1JX0NBTEwoMHgwMjEwKVxuKyNkZWZpbmUgU01DX1JNSV9HUFRfSU5GT1x0XHRcdFNNQ19STUlfQ0FMTCgweDAyMTEpXG4rXG4rI2RlZmluZSBSTUlfQUJJX01BSk9SX1ZFUlNJT05cdDJcbisjZGVmaW5lIFJNSV9BQklfTUlOT1JfVkVSU0lPTlx0MFxuK1xuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OX0dFVF9NQUpPUih2ZXJzaW9uKSAoKHZlcnNpb24pIFx1MDAzZVx1MDAzZSAxNilcbisjZGVmaW5lIFJNSV9BQklfVkVSU0lPTl9HRVRfTUlOT1IodmVyc2lvbikgKCh2ZXJzaW9uKSBcdTAwMjYgMHhGRkZGKVxuKyNkZWZpbmUgUk1JX0FCSV9WRVJTSU9OKG1ham9yLCBtaW5vcikgICAgICAoKChtYWpvcikgXHUwMDNjXHUwMDNjIDE2KSB8IChtaW5vcikpXG4rXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVU19NQVNLXHRcdCgweEZGVUwpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYX01BU0tcdFx0KDB4RkZVTCBcdTAwM2NcdTAwM2MgOClcbisjZGVmaW5lIFJNSV9SRVRVUk5fTUVNUkVRX01BU0tcdFx0KDB4M1VMIFx1MDAzY1x1MDAzYyA4KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMX01BU0tcdCgweDFVTCBcdTAwM2NcdTAwM2MgMTApXG4rXG4rI2RlZmluZSBSTUlfUkVUVVJOX1NUQVRVUyhyZXQpXHRcdEZJRUxEX0dFVChSTUlfUkVUVVJOX1NUQVRVU19NQVNLLCByZXQpXG4rI2RlZmluZSBSTUlfUkVUVVJOX0lOREVYKHJldClcdFx0RklFTERfR0VUKFJNSV9SRVRVUk5fSU5ERVhfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9NRU1SRVEocmV0KVx0XHRGSUVMRF9HRVQoUk1JX1JFVFVSTl9NRU1SRVFfTUFTSywgcmV0KVxuKyNkZWZpbmUgUk1JX1JFVFVSTl9DQU5fQ0FOQ0VMKHJldClcdEZJRUxEX0dFVChSTUlfUkVUVVJOX0NBTl9DQU5DRUxfTUFTSywgcmV0KVxuK1xuKyNkZWZpbmUgUk1JX1NVQ0NFU1NcdFx0XHQwXG4rI2RlZmluZSBSTUlfRVJST1JfSU5QVVRcdFx0XHQxXG4rI2RlZmluZSBSTUlfRVJST1JfUkVBTE1cdFx0XHQyXG4rI2RlZmluZSBSTUlfRVJST1JfUkVDXHRcdFx0M1xuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVFx0XHRcdDRcbisjZGVmaW5lIFJNSV9FUlJPUl9OT1RfU1VQUE9SVEVEXHRcdDVcbisjZGVmaW5lIFJNSV9FUlJPUl9ERVZJQ0VcdFx0NlxuKyNkZWZpbmUgUk1JX0VSUk9SX1JUVF9BVVhcdFx0N1xuKyNkZWZpbmUgUk1JX0VSUk9SX1BTTU1VX1NUXHRcdDhcbisjZGVmaW5lIFJNSV9FUlJPUl9EUFRcdFx0XHQ5XG4rI2RlZmluZSBSTUlfQlVTWVx0XHRcdDEwXG4rI2RlZmluZSBSTUlfRVJST1JfR0xPQkFMXHRcdDExXG4rI2RlZmluZSBSTUlfRVJST1JfVFJBQ0tJTkdcdFx0MTJcbisjZGVmaW5lIFJNSV9JTkNPTVBMRVRFXHRcdFx0MTNcbisjZGVmaW5lIFJNSV9CTE9DS0VEXHRcdFx0MTRcbisjZGVmaW5lIFJNSV9FUlJPUl9HUFRcdFx0XHQxNVxuKyNkZWZpbmUgUk1JX0VSUk9SX0dSQU5VTEVcdFx0MTZcbitcbisjZGVmaW5lIFJNSV9DT05USU5VRV9LRUVQX0dPSU5HXHRcdDBcbisjZGVmaW5lIFJNSV9DT05USU5VRV9TVE9QXHRcdDFcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX09QX01FTV9SRVFfRE9OQVRFXHRcdDFcbisjZGVmaW5lIFJNSV9PUF9NRU1fUkVRX1JFQ0xBSU1cdFx0MlxuK1xuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFX01BU0tcdFx0M1VMXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UX01BU0tcdFx0R0VOTUFTSygxNSwgMilcbisjZGVmaW5lIFJNSV9ET05BVEVfQ09OVElHX01BU0tcdFx0QklUKDE2KVxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURV9NQVNLXHRcdEdFTk1BU0soMTgsIDE3KVxuK1xuKyNkZWZpbmUgUk1JX0RPTkFURV9TSVpFKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfU0laRV9NQVNLLCByZXEpXG4rI2RlZmluZSBSTUlfRE9OQVRFX0NPVU5UKHJlcSlcdFx0RklFTERfR0VUKFJNSV9ET05BVEVfQ09VTlRfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9DT05USUcocmVxKVx0XHRGSUVMRF9HRVQoUk1JX0RPTkFURV9DT05USUdfTUFTSywgcmVxKVxuKyNkZWZpbmUgUk1JX0RPTkFURV9TVEFURShyZXEpXHRcdEZJRUxEX0dFVChSTUlfRE9OQVRFX1NUQVRFX01BU0ssIHJlcSlcbitcbisjZGVmaW5lIFJNSV9PUF9NRU1fREVMRUdBVEVEXHRcdDBcbisjZGVmaW5lIFJNSV9PUF9NRU1fVU5ERUxFR0FURURcdFx0MVxuKyNkZWZpbmUgUk1JX09QX01FTV9DT05ESVRJT05BTFx0XHQyXG4rXG4rI2RlZmluZSBSTUlfQUREUl9UWVBFX05PTkVcdFx0MFxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9TSU5HTEVcdFx0MVxuKyNkZWZpbmUgUk1JX0FERFJfVFlQRV9MSVNUXHRcdDJcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkVfTUFTS1x0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlRfTUFTS1x0R0VOTUFTSyhQQUdFX1NISUZUIC0gMSwgMilcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX0FERFJfTUFTS1x0KFBBR0VfTUFTSyBcdTAwMjYgR0VOTUFTSyg1MSwgMCkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9TVEFURV9NQVNLXHRHRU5NQVNLKDYzLCA2MilcbitcbisjZGVmaW5lIFJNSV9BRERSX1JBTkdFX1NJWkUoYXIpXHRcdChGSUVMRF9HRVQoUk1JX0FERFJfUkFOR0VfU0laRV9NQVNLLCBcXFxuK1x0XHRcdFx0XHRcdCAgIChhcikpKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfQ09VTlQoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX0NPVU5UX01BU0ssIFxcXG4rXHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4rI2RlZmluZSBSTUlfQUREUl9SQU5HRV9BRERSKGFyKVx0XHQoKGFyKSBcdTAwMjYgUk1JX0FERFJfUkFOR0VfQUREUl9NQVNLKVxuKyNkZWZpbmUgUk1JX0FERFJfUkFOR0VfU1RBVEUoYXIpXHQoRklFTERfR0VUKFJNSV9BRERSX1JBTkdFX1NUQVRFX01BU0ssIFxcXG4rXHRcdFx0XHRcdFx0ICAgKGFyKSkpXG4rXG4rZW51bSBybWlfcmlwYXMge1xuK1x0Uk1JX0VNUFRZID0gMCxcbitcdFJNSV9SQU0gPSAxLFxuK1x0Uk1JX0RFU1RST1lFRCA9IDIsXG4rXHRSTUlfREVWID0gMyxcbit9O1xuK1xuKyNkZWZpbmUgUk1JX05PX01FQVNVUkVfQ09OVEVOVFx0MFxuKyNkZWZpbmUgUk1JX01FQVNVUkVfQ09OVEVOVFx0MVxuK1xuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TMlNaXHRcdEdFTk1BU0soNywgMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfTFBBMlx0XHRCSVQoOClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzBfU1ZFXHRcdEJJVCg5KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMF9TVkVfVkxcdFx0R0VOTUFTSygxMywgMTApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9CUFNcdFx0R0VOTUFTSygxOSwgMTQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX05VTV9XUFNcdFx0R0VOTUFTSygyNSwgMjApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVVx0XHRCSVQoMjYpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1BNVV9OVU1fQ1RSU1x0R0VOTUFTSygzMSwgMjcpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX0wwR1BUX0JMT0NLX0RFTEVHQVRFXHRCSVQoMzIpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8wX1MyT0FTWlx0XHRHRU5NQVNLKDQwLCAzMylcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfNEtCXHRCSVQoMClcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzFfUk1JX0dSQU5fU1pfMTZLQlx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8xX1JNSV9HUkFOX1NaXzY0S0JcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8yNTZcdEJJVCgzKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV8zODRcdEJJVCg0KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9IQVNIX1NIQV81MTJcdEJJVCg1KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9NQVhfUkVDU19PUkRFUlx0R0VOTUFTSyg5LCA2KVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9MMEdQVFNaXHRcdEdFTk1BU0soMTMsIDEwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMV9QUFNcdFx0R0VOTUFTSygxNiwgMTQpXG4rXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX0RBXHRcdEJJVCgwKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9EQV9DT0hcdFx0QklUKDEpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZTTU1VXHRcdEJJVCgyKVxuKyNkZWZpbmUgUk1JX0ZFQVRVUkVfUkVHSVNURVJfMl9BVFNcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1BERVZfTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDcsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX1ZERVZfS1JPVVx0QklUKDgpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8yX05PTl9URUVfU1RSRUFNXHRCSVQoOSlcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzJfUkVBTE1fTUFYX1ZERVZTX09SREVSXHRHRU5NQVNLKDE0LCAxMClcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzNfTUFYX05VTV9BVVhfUExBTkVTXHRHRU5NQVNLKDMsIDApXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9QTEFORVx0XHRHRU5NQVNLKDUsIDQpXG4rI2RlZmluZSBSTUlfRkVBVFVSRV9SRUdJU1RFUl8zX1JUVF9TMkFQX0lORElSRUNUXHRCSVQoNilcbitcbisjZGVmaW5lIFJNSV9GRUFUVVJFX1JFR0lTVEVSXzRfTUVDX0NPVU5UXHRcdEdFTk1BU0soNjMsIDApXG4rXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0NPTlZFTlRJT05BTFx0XHQwXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX0RFVl9OQ09IXHRcdDFcbisjZGVmaW5lIFJNSV9NRU1fQ0FURUdPUllfREVWX0NPSFx0XHQyXG4rI2RlZmluZSBSTUlfTUVNX0NBVEVHT1JZX05PTkVcdFx0XHQzXG4rXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfUkVTRVJWRURcdFx0XHQwXG4rI2RlZmluZSBSTUlfVFJBQ0tJTkdfTk9ORVx0XHRcdDFcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19GSU5FXHRcdFx0MlxuKyNkZWZpbmUgUk1JX1RSQUNLSU5HX0NPQVJTRVx0XHRcdDNcbisjZGVmaW5lIFJNSV9UUkFDS0lOR19JTlRFUk1FRElBVEVcdFx0NFxuK1xuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV80S0JcdDBcbisjZGVmaW5lIFJNSV9HUkFOVUxFX1NJWkVfMTZLQlx0MVxuKyNkZWZpbmUgUk1JX0dSQU5VTEVfU0laRV82NEtCXHQyXG4rXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9SRVNFUlZFRCAgICAgICAgICAgMFVcbisjZGVmaW5lIFJNSV9HUFRfUEFSX1BMQVQgICAgICAgICAgICAgICAxVVxuKyNkZWZpbmUgUk1JX0dQVF9QQVJfSE9TVF9OT1RfQ1JFQVRFRCAgIDJVXG4rI2RlZmluZSBSTUlfR1BUX1BBUl9IT1NUX0NSRUFURUQgICAgICAgM1VcbitcbisvKlxuKyAqIE5vdGUgbWFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNtYWxsZXIgdGhhbiB1NjQgYnV0IGFsbCBmaWVsZHMgaGF2ZSB1NjRcbisgKiBhbGlnbm1lbnQsIHNvIHVzZSB1NjQgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50LlxuKyAqL1xuK3N0cnVjdCBybW1fY29uZmlnIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHRyYWNraW5nX3JlZ2lvbl9zaXplO1xuK1x0XHRcdHU2NCBybWlfZ3JhbnVsZV9zaXplO1xuK1x0XHR9O1xuK1x0XHR1OCBzaXplcltTWl80S107XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJtbV9jb25maWcpID09IFNaXzRLKTtcbitcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1NWRVx0XHRCSVQoMSlcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX1BNVVx0XHRCSVQoMilcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX0RBXHRcdFx0QklUKDMpXG4rI2RlZmluZSBSTUlfUkVBTE1fUEFSQU1fRkxBR19MRkFfUE9MSUNZXHRcdEdFTk1BU0soNiwgNSlcbisjZGVmaW5lIFJNSV9SRUFMTV9QQVJBTV9GTEFHX01FQ19QT0xJQ1lcdFx0R0VOTUFTSyg4LCA3KVxuK1xuKyNkZWZpbmUgUk1JX0hBU0hfU0hBXzI1Nlx0XHRcdDBcbisjZGVmaW5lIFJNSV9IQVNIX1NIQV81MTJcdFx0XHQxXG4rI2RlZmluZSBSTUlfSEFTSF9TSEFfMzg0XHRcdFx0MlxuK1xuK3N0cnVjdCByZWFsbV9wYXJhbXMge1xuK1x0dW5pb24geyAvKiAweDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgZmxhZ3MwO1xuK1x0XHRcdHU2NCBzMnN6O1xuK1x0XHRcdHU2NCBzdmVfdmw7XG4rXHRcdFx0dTY0IG51bV9icHM7XG4rXHRcdFx0dTY0IG51bV93cHM7XG4rXHRcdFx0dTY0IHBtdV9udW1fY3RycztcbitcdFx0XHR1NjQgaGFzaF9hbGdvO1xuK1x0XHRcdHU2NCBudW1fYXV4X3BsYW5lcztcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzBbMHg0MDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg0MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1OCBycHZbNjRdO1xuK1x0XHRcdHU2NCBhdHNfcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcxWzB4NDAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4ODAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTY0IHBhZGRpbmcyO1xuK1x0XHRcdHU2NCBydHRfYmFzZTtcbitcdFx0XHRzNjQgcnR0X2xldmVsX3N0YXJ0O1xuK1x0XHRcdHU2NCBydHRfbnVtX3N0YXJ0O1xuK1x0XHRcdHU2NCBmbGFnczE7XG4rXHRcdFx0dTY0IG1heF9udW1fdmRldnM7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmczWzB4NzAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4ZjAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcGFkZGluZzRbMHg4MF07XG4rXHRcdFx0dTY0IGF1eF9ydHRfYmFzZVszXTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzVbMHgxMDBdO1xuK1x0fTtcbit9O1xuK1xuK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCByZWFsbV9wYXJhbXMpID09IFNaXzRLKTtcbitcbisvKlxuKyAqIFRoZSBudW1iZXIgb2YgR1BScyAoc3RhcnRpbmcgZnJvbSBYMCkgdGhhdCBhcmVcbisgKiBjb25maWd1cmVkIGJ5IHRoZSBob3N0IHdoZW4gYSBSRUMgaXMgY3JlYXRlZC5cbisgKi9cbisjZGVmaW5lIFJFQ19DUkVBVEVfTlJfR1BSU1x0XHQ4XG4rXG4rI2RlZmluZSBSRUNfUEFSQU1TX0ZMQUdfUlVOTkFCTEVcdEJJVCgwKVxuK1xuK3N0cnVjdCByZWNfcGFyYW1zIHtcbitcdHVuaW9uIHsgLyogMHgwICovXG4rXHRcdHU2NCBmbGFncztcbitcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgxMDAgKi9cbitcdFx0dTY0IG1waWRyO1xuK1x0XHR1OCBwYWRkaW5nMVsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDIwMCAqL1xuK1x0XHR1NjQgcGM7XG4rXHRcdHU4IHBhZGRpbmcyWzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MzAwICovXG4rXHRcdHU2NCBncHJzW1JFQ19DUkVBVEVfTlJfR1BSU107XG4rXHRcdHU4IHBhZGRpbmczWzB4ZDAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX3BhcmFtcykgPT0gU1pfNEspO1xuK1xuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRU1VTEFURURfTU1JT1x0QklUKDApXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19JTkpFQ1RfU0VBXHRCSVQoMSlcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX1RSQVBfV0ZJXHRcdEJJVCgyKVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfVFJBUF9XRkVcdFx0QklUKDMpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19SSVBBU19SRVNQT05TRVx0QklUKDQpXG4rI2RlZmluZSBSRUNfRU5URVJfRkxBR19TMkFQX1JFU1BPTlNFXHRCSVQoNSlcbisjZGVmaW5lIFJFQ19FTlRFUl9GTEFHX0RFVl9NRU1fUkVTUE9OU0VcdEJJVCg2KVxuKyNkZWZpbmUgUkVDX0VOVEVSX0ZMQUdfRk9SQ0VfUDBcdFx0QklUKDcpXG4rXG4rI2RlZmluZSBSRUNfUlVOX0dQUlNcdFx0XHQzMVxuK1xuK3N0cnVjdCByZWNfZW50ZXIge1xuK1x0dW5pb24geyAvKiAweDAwMCAqL1xuK1x0XHR1NjQgZmxhZ3M7XG4rXHRcdHU4IHBhZGRpbmcwWzB4MjAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4MjAwICovXG4rXHRcdHU2NCBncHJzW1JFQ19SVU5fR1BSU107XG4rXHRcdHU4IHBhZGRpbmcxWzB4NjAwXTtcbitcdH07XG4rfTtcbitcbitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgcmVjX2VudGVyKSA9PSBTWl8ySyk7XG4rXG4rI2RlZmluZSBSTUlfRVhJVF9TWU5DXHRcdFx0MHgwMFxuKyNkZWZpbmUgUk1JX0VYSVRfSVJRXHRcdFx0MHgwMVxuKyNkZWZpbmUgUk1JX0VYSVRfRklRXHRcdFx0MHgwMlxuKyNkZWZpbmUgUk1JX0VYSVRfUFNDSVx0XHRcdDB4MDNcbisjZGVmaW5lIFJNSV9FWElUX1JJUEFTX0NIQU5HRVx0XHQweDA0XG4rI2RlZmluZSBSTUlfRVhJVF9IT1NUX0NBTExcdFx0MHgwNVxuKyNkZWZpbmUgUk1JX0VYSVRfU0VSUk9SXHRcdFx0MHgwNlxuKyNkZWZpbmUgUk1JX0VYSVRfUzJBUF9DSEFOR0VcdFx0MHgwN1xuKyNkZWZpbmUgUk1JX0VYSVRfVkRFVl9WQUxJREFURV9NQVBQSU5HXHQweDA4XG4rI2RlZmluZSBSTUlfRVhJVF9WU01NVV9DT01NQU5EXHRcdDB4MGFcbitcbitzdHJ1Y3QgcmVjX2V4aXQge1xuK1x0dW5pb24geyAvKiAweDAwMCAqL1xuK1x0XHR1OCBleGl0X3JlYXNvbjtcbitcdFx0dTggcGFkZGluZzBbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgxMDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgZXNyO1xuK1x0XHRcdHU2NCBmYXI7XG4rXHRcdFx0dTY0IGhwZmFyO1xuK1x0XHRcdHU2NCBydHRfdHJlZTtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzFbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgyMDAgKi9cbitcdFx0dTY0IGdwcnNbUkVDX1JVTl9HUFJTXTtcbitcdFx0dTggcGFkZGluZzJbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHgzMDAgKi9cbitcdFx0dTggcGFkZGluZzNbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg0MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgY250cF9jdGw7XG4rXHRcdFx0dTY0IGNudHBfY3ZhbDtcbitcdFx0XHR1NjQgY250dl9jdGw7XG4rXHRcdFx0dTY0IGNudHZfY3ZhbDtcbitcdFx0fTtcbitcdFx0dTggcGFkZGluZzRbMHgxMDBdO1xuK1x0fTtcbitcdHVuaW9uIHsgLyogMHg1MDAgKi9cbitcdFx0c3RydWN0IHtcbitcdFx0XHR1NjQgcmlwYXNfYmFzZTtcbitcdFx0XHR1NjQgcmlwYXNfdG9wO1xuK1x0XHRcdHU4IHJpcGFzX3ZhbHVlO1xuK1x0XHRcdHU4IHBhZGRpbmc1WzB4Zl07XG4rXHRcdFx0dTY0IHMyYXBfYmFzZTtcbitcdFx0XHR1NjQgczJhcF90b3A7XG4rXHRcdFx0dTY0IHZkZXZfaWRfMTtcbitcdFx0XHR1NjQgdmRldl9pZF8yO1xuK1x0XHRcdHU2NCBkZXZfbWVtX2Jhc2U7XG4rXHRcdFx0dTY0IGRldl9tZW1fdG9wO1xuK1x0XHRcdHU2NCBkZXZfbWVtX3BhO1xuK1x0XHR9O1xuK1x0XHR1OCBwYWRkaW5nNlsweDEwMF07XG4rXHR9O1xuK1x0dW5pb24geyAvKiAweDYwMCAqL1xuK1x0XHRzdHJ1Y3Qge1xuK1x0XHRcdHUxNiBpbW07XG4rXHRcdFx0dTggcGFkZGluZzdbMHg2XTtcbitcdFx0XHR1NjQgcGxhbmU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmc4WzB4MTAwXTtcbitcdH07XG4rXHR1bmlvbiB7IC8qIDB4NzAwICovXG4rXHRcdHN0cnVjdCB7XG4rXHRcdFx0dTggcG11X292Zl9zdGF0dXM7XG4rXHRcdFx0dTggcGFkZGluZzlbMHhmXTtcbitcdFx0XHR1NjQgdnNtbXU7XG4rXHRcdH07XG4rXHRcdHU4IHBhZGRpbmcxMFsweDEwMF07XG4rXHR9O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19leGl0KSA9PSBTWl8ySyk7XG4rXG4rc3RydWN0IHJlY19ydW4ge1xuK1x0c3RydWN0IHJlY19lbnRlciBlbnRlcjtcbitcdHN0cnVjdCByZWNfZXhpdCBleGl0O1xuK307XG4rXG4rc3RhdGljX2Fzc2VydChzaXplb2Yoc3RydWN0IHJlY19ydW4pID09IFNaXzRLKTtcbitcbisvKiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19PQUREUl9UWVBFXHRHRU5NQVNLKDEsIDApXG4rI2RlZmluZSBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfTElTVF9DT1VOVFx0R0VOTUFTSygxNSwgMilcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19NRU1BVFRSXHRHRU5NQVNLKDE4LCAxNilcbisjZGVmaW5lIFJNSV9SVFRfVU5QUk9UX01BUF9GTEFHU19TMkFQXHRcdEdFTk1BU0soMjIsIDE5KVxuK1xuKy8qIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1MgZGVmaW5pdGlvbnMgKi9cbisjZGVmaW5lIFJNSV9SVFRfUFJPVF9NQVBfRkxBR1NfT0FERFJfVFlQRVx0R0VOTUFTSygxLCAwKVxuKyNkZWZpbmUgUk1JX1JUVF9QUk9UX01BUF9GTEFHU19MSVNUX0NPVU5UXHRHRU5NQVNLKDE1LCAyKVxuK1xuKy8qIFMyQVAgRGlyZWN0IEVuY29kaW5ncywgdXNlZCBpbiBSTUlfUlRUX1VOUFJPVF9NQVBfRkxBR1NfUzJBUCAqL1xuKyNkZWZpbmUgUk1JX1MyQVBfRElSRUNUX1dSSVRFXHRcdFx0QklUKDApXG4rI2RlZmluZSBSTUlfUzJBUF9ESVJFQ1RfUkVBRFx0XHRcdEJJVCgxKVxuK1xuKyNlbmRpZiAvKiBfX0xJTlVYX0FSTV9TTUNDQ19STUlfSF8gKi9cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjI3LjY4NzM1NzE5MVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwODcxMzk1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgUmVsZXZhbmNlIHRvIEFNRDY0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBXZSd2ZSBnb3QgYSBwYXRjaCwgYW5kIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGlzIHNwZWNpZmllZCBhcyBgYW1kNjRgLiBNeSBpbml0aWFsIHRhc2sgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCBpcyByZWxldmFudCB0byBBTUQ2NCwgb3IgaWYgaXQgY2FuIGJlIGNvbnNpZGVyZWQgYSBcIndvcnRoLWZ1enppbmdcIiBjYW5kaWRhdGUuIExldCdzIGRlbHZlIGludG8gdGhlIGNoYW5nZXMuXG5cbkknbSBzZWVpbmcgbW9kaWZpY2F0aW9ucyBwcmltYXJpbHkgY29uY2VudHJhdGVkIGFyb3VuZCBBUk02NC1zcGVjaWZpYyBjb2RlLiBTcGVjaWZpY2FsbHk6XG5cbjEuICBgYXJjaC9hcm02NC9LY29uZmlnYCBpcyBiZWluZyBtb2RpZmllZCwgc2VsZWN0aW5nIGBBUkNIX1NVUFBPUlRTX1JNTWAuXG4yLiAgYGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuY2AgaXMgYmVpbmcgdG91Y2hlZC4gVGhpcyBpcyBhZGRpbmcgYW4gYEFSTTY0X0ZUUl9CSVRTYCBlbnRyeSwgdmVyeSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBBUk02NCBmZWF0dXJlIGlkZW50aWZpY2F0aW9uLlxuMy4gIFdlIGhhdmUgY2hhbmdlcyBpbiBgZHJpdmVycy9maXJtd2FyZWAgd2l0aCBhZGRpdGlvbnMgb2YgYGFybV9ybW1gIGRpcmVjdG9yeSBhbmQgY29uZmlndXJhdGlvbiBmaWxlczogYEtjb25maWdgIGFuZCBgTWFrZWZpbGVgLiBUaGlzIGFwcGVhcnMgdG8gYmUgaW50ZWdyYXRpbmcgYSBuZXcgY29tcG9uZW50LCB3aGljaCBpbmNsdWRlcyBpdHMgb3duIEtjb25maWcgb3B0aW9ucyBhbmQgbWFrZWZpbGUgZW50cmllcywgYW5kIHNwZWNpZmljYWxseSBhIGZpbGUgY2FsbGVkIGBybWkuY2Agd2hpY2ggY29udGFpbnMgdGhlIGNvcmUgb2YgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBob3N0LXNpZGUgZHJpdmVyLlxuNC4gIFRoZXJlIGFyZSBhIGNvdXBsZSBvZiBpbmNsdWRlIGZpbGVzIGFkZGVkLCBgYXJtLXJtaS1jbWRzLmhgIGFuZCBgYXJtLXNtY2NjLXJtaS5oYCwgYWdhaW4sIHN1Z2dlc3RpbmcgZnVuY3Rpb25hbGl0eSBzcGVjaWZpYyB0byBBUk0gYXJjaGl0ZWN0dXJlcy5cblxuSG9sZCBvbiBhIG1vbWVudCwgdGhpcyBpcyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIG5lZWQgdG8gY3Jvc3MtcmVmZXJlbmNlIHRoaXMgYmFjayB0byB0aGUgXCJXb3J0aEZ1enppbmc9ZmFsc2VcIiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGlnbm9yZWQgaWYgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIGZhbGwgaW50byBvbmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuKiAgIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRocyAodGVhcmRvd24gY2FsbGJhY2tzLCBldGMuKVxuKiAgIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuQW5kIGdpdmVuIHRoYXQgd2UgYXJlIHRhcmdldGluZyBgYW1kNjRgLCBpdCdzIGNsZWFyIHdlIHNob3VsZCBiZSBmb2N1c2VkIG9uIHRoZSBzZWNvbmQgcG9pbnQuXG5cbkxldCdzIHZlcmlmeSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogZW5hYmxlZCBvbiBhbWQ2NC4gSXQgbG9va3MgbGlrZSBgQVJNX1JNTV9STUlgIGRpcmVjdGx5IGRlcGVuZHMgb24gYEFSQ0hfU1VQUE9SVFNfUk1NYCwgYW5kIEkgY2FuIHNlZSB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgc3BlY2lmaWNhbGx5IHNlbGVjdGVkIGJ5IGBjb25maWcgQVJNNjRgIHdpdGhpbiBgYXJjaC9hcm02NC9LY29uZmlnYC4gSXQgZG9lc24ndCBhcHBlYXIgdGhpcyB3aWxsIGJlIHNlbGVjdGVkIGJ5IHg4Ni9hbWQ2NC4gSSdsbCBjb25maXJtIHdpdGggYSBgZ3JlcHBlcmAgY2hlY2sgdG8gYmUgY2VydGFpbiB0aGF0IGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogc2VsZWN0ZWQgYnkgeDg2LlxuXG5NeSBjb25jbHVzaW9uIGF0IHRoaXMgcG9pbnQsIGJhcnJpbmcgYW55IHVuZm9yZXNlZW4gZGVwZW5kZW5jaWVzLCBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgbGlrZWx5ICpub3QqIHJlbGV2YW50IHRvIEFNRDY0IGFuZCBjYW4gcHJvYmFibHkgYmUgY29uc2lkZXJlZCBcIldvcnRoRnV6emluZz1mYWxzZVwiLiBJIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBgQVJDSF9TVVBQT1JUU19STU1gIGlzIG5vdCBwcmVzZW50IGluIHRoZSB4ODYvYW1kNjQgYnVpbGQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3Nzg3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjM1LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6MzIuNzc0NTAwODA5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3NTk3OTI3MzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiQVJDSF9TVVBQT1JUU19STU1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9hcm02NC9LY29uZmlnPTI9Y29uZmlnIEFSTTY0XFxuLS1cXG5hcmNoL2FybTY0L0tjb25maWctNDAtXFx0c2VsZWN0IEFSQ0hfU1VQUE9SVFNfTVNFQUxfU1lTVEVNX01BUFBJTkdTXFxuYXJjaC9hcm02NC9LY29uZmlnOjQxOlxcdHNlbGVjdCBBUkNIX1NVUFBPUlRTX1JNTVxcbmFyY2gvYXJtNjQvS2NvbmZpZy00Mi1cXHRzZWxlY3QgQVJDSF9IQVNfTk1JX1NBRkVfVEhJU19DUFVfT1BTXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy0xLVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnOjI6Y29uZmlnIEFSQ0hfU1VQUE9SVFNfUk1NXFxuZHJpdmVycy9maXJtd2FyZS9hcm1fcm1tL0tjb25maWctMy1cXHRib29sXFxuLS1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZz01PWNvbmZpZyBBUk1fUk1NX1JNSVxcbmRyaXZlcnMvZmlybXdhcmUvYXJtX3JtbS9LY29uZmlnLTYtXFx0Ym9vbCBcXFwiUmVhbG0gTWFuYWdlbWVudCBJbnRlcmZhY2UgKFJNSSkgU3VwcG9ydFxcXCJcXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZzo3OlxcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19STU1cXG5kcml2ZXJzL2Zpcm13YXJlL2FybV9ybW0vS2NvbmZpZy04LVxcdGRlZmF1bHQgeVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wN1QxNDo1MTozNS41MzQyOTg4MDJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MTQwMDk5MDY5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgVGhpcyBQYXRjaCdzIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHNjYW4gZmxhZ2dlZCBzb21lIGZpbGVzIHJlbGF0ZWQgdG8gYGFybV9ybW1gLCBgQVJNX1JNTV9STUlgLCBhbmQgY29kZSB0b3VjaGVkIGJ5IHRoaXMgcGF0Y2gsIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGltcGFjdCBteSBhcmVhIG9mIGV4cGVydGlzZS4gSSBpbW1lZGlhdGVseSBsb29rZWQgZm9yIGFueSBwb3RlbnRpYWwgY3Jvc3NvdmVyIG9uIHg4Ni9hbWQ2NC5cblxuRmlyc3QsIEkgaWRlbnRpZmllZCB0aGUgbW9kaWZpZWQgZmlsZXM6IGBhcmNoL2FybTY0L0tjb25maWdgLCBgYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jYCwgYW5kIHNvIG9uLiBSaWdodCBhd2F5LCB0aGVzZSBmaWxlcyBsb29rIEFSTS1zcGVjaWZpYy4gSSBzZWUgYHJtaS5jYCBpbmNsdWRlcyBgXHUwMDNjYXNtL21lbW9yeS5oXHUwMDNlYCBhbmQgYFx1MDAzY2FzbS9wZ3RhYmxlLWh3ZGVmLmhcdTAwM2VgLCBib3RoIG9mIHdoaWNoIHNjcmVhbSBBUk0uIEZ1cnRoZXJtb3JlLCBgQVJNX1JNTV9STUlgIHJlbGllcyBvbiBgQVJDSF9TVVBQT1JUU19STU1gLCB3aGljaCBpcyBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgb25seSB3aGVuIGJ1aWxkaW5nIGZvciBgQVJNNjRgLiBPbiBteSB0YXJnZXQgYXJjaGl0ZWN0dXJlLCBhbWQ2NC94ODZfNjQsIGBBUkNIX1NVUFBPUlRTX1JNTWAgaXMgKm5vdCogZW5hYmxlZCwgc28gYEFSTV9STU1fUk1JYCBpcyB1bnJlYWNoYWJsZSwgYW5kIGBybWkuY2AgaXMgbm90IGV2ZW4gY29tcGlsZWQuIEkgYWxzbyBub3RlZCB0aGF0IGFsbCBvdGhlciBmaWxlcyBhcmUgYWxzbyBlaXRoZXIgaW4gdGhlIGBhcmNoL2FybTY0L2AgZGlyZWN0b3J5IG9yIGludm9sdmUgQVJNLXNwZWNpZmljIGZpcm13YXJlIGhlYWRlcnMgYW5kIGRyaXZlcnMuXG5cbkdpdmVuIHRoaXMsIGl0J3MgcHJldHR5IGNsZWFyOiB0aGlzIHBhdGNoIGlzIHN0cmljdGx5IEFSTTY0LXNwZWNpZmljLiBJdCdzIGludHJvZHVjaW5nIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIHN1cHBvcnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBDUFUgZmVhdHVyZSBkZWZpbml0aW9ucyBhcmUgYWxsIHRpZWQgdG8gdGhhdCBhcmNoaXRlY3R1cmUuIFRoZXJlJ3MgemVybyBjaGFuY2Ugb2YgdGhpcyBwYXRjaCBoYXZpbmcgYW55IGltcGFjdCBvbiB4ODYvYW1kNjQuXG5cbk5vdywgbGV0J3MgZG91YmxlLWNoZWNrIHRoZSB0cmlhZ2UgY3JpdGVyaWEuIFRoZSBcInVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoc1wiIGNyaXRlcmlvbiBjb3ZlcnMgdGhpcyBwZXJmZWN0bHk6IHRoaXMgaXMgY29kZSBleGNsdXNpdmUgdG8gYW4gYXJjaGl0ZWN0dXJlIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIFRoaXMgbWVhbnMsIHdpdGhvdXQgYSBkb3VidCwgSSBuZWVkIHRvIGNhbGwgYHNldC1yZXN1bHRzYCB3aXRoOlxuXG4qICAgYFdvcnRoRnV6emluZzogZmFsc2VgXG4qICAgYEZvY3VzU3ltYm9sczogW11gXG4qICAgYEVuYWJsZUNvbmZpZ3M6IFtdYFxuKiAgIGBSZWFzb25pbmdgOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBzdXBwb3J0IGFuZCBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIGRlZmluaXRpb25zLCB3aGljaCBkZXBlbmQgb24gQVJDSFxcX1NVUFBPUlRTXFxfUk1NIChzZWxlY3RlZCBvbmx5IGJ5IEFSTTY0KS4gTm9uZSBvZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBjb21waWxlZCBvciByZWFjaGFibGUgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIlxuXG5FYXN5IGRlY2lzaW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTMyMywiT3V0cHV0VG9rZW5zIjoxMjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDdUMTQ6NTE6NDAuNjc0NDAxODcxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyODQ1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aGUgQVJNIFJlYWxtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIChSTUkpIGFuZCBtb2RpZmllcyBBUk02NC1zcGVjaWZpYyBjcHVmZWF0dXJlIHRhYmxlcy4gVGhlIG5ldyBkcml2ZXIgKENPTkZJR19BUk1fUk1NX1JNSSkgZGVwZW5kcyBvbiBDT05GSUdfQVJDSF9TVVBQT1JUU19STU0sIHdoaWNoIGlzIG9ubHkgc2VsZWN0ZWQgb24gQVJNNjQuIENvbnNlcXVlbnRseSwgYWxsIG1vZGlmaWVkIGNvZGUgaXMgZXhjbHVzaXZlIHRvIHRoZSBBUk02NCBhcmNoaXRlY3R1cmUgYW5kIGNhbm5vdCBiZSBjb21waWxlZCBvciBleGVjdXRlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSAoYW1kNjQpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBSZWFsbSBNYW5hZ2VtZW50IEludGVyZmFjZSAoUk1JKSBhbmQgbW9kaWZpZXMgQVJNNjQtc3BlY2lmaWMgY3B1ZmVhdHVyZSB0YWJsZXMuIFRoZSBuZXcgZHJpdmVyIChDT05GSUdfQVJNX1JNTV9STUkpIGRlcGVuZHMgb24gQ09ORklHX0FSQ0hfU1VQUE9SVFNfUk1NLCB3aGljaCBpcyBvbmx5IHNlbGVjdGVkIG9uIEFSTTY0LiBDb25zZXF1ZW50bHksIGFsbCBtb2RpZmllZCBjb2RlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgQVJNNjQgYXJjaGl0ZWN0dXJlIGFuZCBjYW5ub3QgYmUgY29tcGlsZWQgb3IgZXhlY3V0ZWQgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGFtZDY0KS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA3VDE0OjUxOjQwLjY3NDQzNzIyMVoiLCJTZXEiOjcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0MDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowgmwz9[1] Phase: Running StartedAt: 2026-09-07 14:51:52 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowgmwz9[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-09-07 14:51:52 +0000 UTC FinishedAt: 2026-09-07 14:51:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}